diff --git a/.classpath b/.classpath new file mode 100644 index 00000000..eb1861c2 --- /dev/null +++ b/.classpath @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 00000000..dc6c707e --- /dev/null +++ b/.project @@ -0,0 +1,35 @@ + + + jeecg-framework + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.common.project.facet.core.nature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..00b42ef5 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +#Sat Mar 28 17:19:19 CST 2015 +eclipse.preferences.version=1 +encoding//src/main/resources/dbconfig.properties=utf-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..3e93ca98 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Sat May 23 15:00:56 CST 2015 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/README.md b/README.md new file mode 100644 index 00000000..2b92f930 --- /dev/null +++ b/README.md @@ -0,0 +1,122 @@ +JEECG 智能开发平台 +=============== + +前言: +----------------------------------- +随着 WEB UI 框架 ( EasyUI/Jquery UI/Ext/DWZ) 等的逐渐成熟,系统界面逐渐实现统一化,代码生成器也可以生成统一规范的界面! +代码生成+手工MERGE半智能开发将是新的趋势,单表数据模型和一对多数据模型的增删改查功能直接生成使用,可节省60%工作量,快速提高开发效率!!! + + +简介 +----------------------------------- +JEECG(J2EE Code Generation)是一款基于代码生成器的智能开发平台。引领新的开发模式(Online Coding模式->代码生成器模式->手工MERGE智能开发), +可以帮助解决Java项目60%的重复工作,让开发更多关注业务逻辑。既能快速提高开发效率,帮助公司节省人力成本,同时又不失灵活性。 + +JEECG宗旨是: 简单功能由代Online Coding配置出功能;复杂功能由代码生成器生成进行手工Merge; 复杂流程业务采用表单自定义,业务流程使用工作流来实现、扩展出任务接口,供开发编写业务逻辑。实现了流程任务节点和任务接口的灵活配置,既保证了公司流程的保密行,又减少了开发人员的工作量。 + + +为什么选择JEECG? +----------------------------------- +* 1.采用主流框架,容易上手; 代码生成器依赖性低,很方便的扩展能力,可完全实现二次开发; +* 2.开发效率很高,采用代码生成器,单表数据模型和一对多(父子表)数据模型,增删改查功能自动生成,菜单配置直接使用; +* 3.页面校验自动生成(必须输入、数字校验、金额校验、时间空间等); +* 4.封装完善的用户基础权限、强大的数据权限、和数据字典等基础功能,直接使用无需修改 +* 5.常用共通封装,各种工具类(定时任务,短信接口,邮件发送,Excel导出等),基本满足80%项目需求 +* 6.集成简易报表工具,图像报表和数据导出非常方便,可极其方便的生成pdf、excel、word等报表; +* 7.集成工作流activiti,并实现了只需在页面配置流程转向,可极大的简化jbpm工作流的开发;用jbpm的流程设计器画出了流程走向,一个工作流基本就完成了,只需写很少量的java代码; +* 8.UI快速开发库,针对WEB UI进行标准式封装,页面统一采用自定义标签实现功能:列表数据展现、页面校验等,标签使用简单清晰且便于维护 +* 9.在线流程设计,采用开源Activiti流程引擎,实现在线画流程,自定义表单,表单挂靠,业务流转 +* 10.查询条件生成器:查询功能自动生成,后台动态拼SQL追加查询条件;支持多种匹配方式(全匹配/模糊查询/包含查询/不匹配查询); +* 11.多数据源:及其简易的使用方式,在线配置数据源配置,便捷的从其他数据抓取数据; +* 12.国际化:支持多语言,开发国际化项目非常方便; +* 13.数据权限(精细化数据权限控制,控制到行级,列表级,表单字段级,实现不同人看不同数据,不同人对同一个页面操作不同字段 + + +JEECG 适用范围 +----------------------------------- +JEECG智能开发平台,可以应用在任何J2EE项目的开发中,尤其适合企业信息管理系统(MIS)、内部办公系统(OA)、企业资源计划系统(ERP) +、客户关系管理系统(CRM)等,其半智能手工Merge的开发方式,可以显著提高开发效率60%以上,极大降低开发成本。 + + +JEECG 功能特点 +----------------------------------- +* JEECG V3.5.0+Hibernate+UI快速开发库+Spring jdbc+ freemarker+ Highcharts+ bootstrap+Ehcache 的基础架构
+* 采用面向声明的开发模式, 基于泛型编写极少代码即可实现复杂的数据展示、数据编辑、 +表单处理等功能,再配合Online Coding在线开发与代码生成器的使用,将J2EE的开发效率提高6倍以上,可以将代码减少80%以上。
+ +* JEECG V3.0版本六大技术点: 1.Online Coding (通过在线配置实现一个表模型的增删改查功能,无需一行代码,支持用户自定义表单布局)2.代码生成器 3.UI快速开发库 4.在线流程设计 5.系统日志记录 6.Web GIS支持 7.移动平台支持Bootstrap(兼容Html5) 8.动态报表9.查询过滤器
+ +* 技术点一:Online Coding开发模式(通过配置实现单表模型和一对多数据模型的增删改查功能,No 代码,支持用户自定义表单布局)
+* 技术点二:代码生成器,支持多种数据模型,根据表生成对应的Entity,Service,Dao,Action,JSP等,增删改查功能生成直接使用
+* 技术点三:UI快速开发库,针对WEB UI进行标准封装,页面统一采用UI标签实现功能:数据datagrid,表单校验,Popup,Tab等,实现JSP页面零JS,开发维护非常高效
+* 技术点四:在线流程定义,采用开源Activiti流程引擎,实现在线画流程,自定义表单,表单挂接,业务流转,流程监控,流程跟踪,流程委托等
+* 技术点五:系统日志记录 (详细记录操作日志)
+* 技术点六:Web GIS支持 (基础技术GIS的支持)
+* 技术点七:移动平台支持,对Bootstrap(兼容Html5)进行标准封装
+* 技术点八:动态报表功能(用户输入一个sql,系统自动解析生成报表)
+* 技术点九:数据权限(精细化数据权限控制,控制到行级,列表级,表单字段级,实现不同人看不同数据,不同人对同一个页面操作不同字段)
+* 技术点十:国际化(支持多语言,国际化的封装为多语言做了便捷支持)
+* 技术点十一:多数据源(在线配置数据源,数据源工作类封装)
+ +* JEECG V3.5.0,经过了专业压力测试,性能测试,保证后台数据的准确性和页面访问速度
+* 支持多种浏览器: IE, 火狐, Google 等
+* 支持数据库: Mysql,Oracle10g,Postgre,SqlServer等
+* 基础权限: 用户,角色,菜单权限,按钮权限,数据权限
+* 智能报表集成: 简易的图像报表工具和Excel导入导出
+* Web容器测试通过的有Jetty和Tomcat6,Weblogic
+* 即将推出功能:分布式部署,云平台,移动平台开发,规则引擎
+* 要求JDK1.6+
+ + + +系统演示 +----------------------------------- +![github](http://www.jeecg.org/data/attachment/forum/201303/02/123311mf9fa22tv69b228f.jpg "jeecg") +![github](http://www.jeecg.org/data/attachment/forum/201303/02/123412x003euegeg7nb68z.jpg "jeecg") +![github](http://www.jeecg.org/data/attachment/forum/201303/02/124748gyhrgvr45vshyc82.jpg "jeecg") +![github](http://www.jeecg.org/data/attachment/forum/201303/02/123428ubcjjnuwjbkjrnrw.jpg "jeecg") +![github](http://www.jeecg.org/data/attachment/forum/201303/02/124749up2j5id7gj9kppp8.jpg "jeecg") + + + +代码示例 +----------------------------------- + 这是一个有多行的文本框 + <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> + <%@include file="/context/mytags.jsp"%> +
+
+ + + + + + + + + + + + + + + + + +
+
+ + +技术文档 +----------------------------------- +* [JEECG 入门视频](http://www.jeecg.org/forum.php?mod=viewthread&tid=197&extra=page%3D1) +* [JEECG 历史版本](http://www.jeecg.org/forum.php?mod=viewthread&tid=1229&page=1&extra=#pid3642) +* [JEECG 文档](http://osbaba.com:8002/display/12/Home) + +技术交流 +----------------------------------- +* 作者:张代浩
+* 邮箱:jeecg@sina.com +* 论坛:[www.jeecg.org](http://www.jeecg.org) +* 交流群:106259349, 106838471, 289782002
+* 在线演示: [在线演示](http://219.232.255.211:8080/) \ No newline at end of file diff --git a/doc/JEECG v_3.5.2 寮鍙戝叆闂ㄧ幆澧冩惌寤烘枃妗o紙Maven鐗堬級.pdf b/doc/JEECG v_3.5.2 寮鍙戝叆闂ㄧ幆澧冩惌寤烘枃妗o紙Maven鐗堬級.pdf new file mode 100644 index 00000000..db988336 Binary files /dev/null and b/doc/JEECG v_3.5.2 寮鍙戝叆闂ㄧ幆澧冩惌寤烘枃妗o紙Maven鐗堬級.pdf differ diff --git a/doc/db/jeecg_mysql_3.5.2-20150607.sql b/doc/db/jeecg_mysql_3.5.2-20150607.sql new file mode 100644 index 00000000..82ec4499 --- /dev/null +++ b/doc/db/jeecg_mysql_3.5.2-20150607.sql @@ -0,0 +1,4628 @@ +/* +Navicat MySQL Data Transfer + +Source Server : mysql +Source Server Version : 50037 +Source Host : localhost:3306 +Source Database : jeecg_gjh + +Target Server Type : MYSQL +Target Server Version : 50037 +File Encoding : 65001 + +Date: 2015-06-07 17:55:26 +*/ + +SET FOREIGN_KEY_CHECKS=0; +-- ---------------------------- +-- Table structure for `cgform_button` +-- ---------------------------- +DROP TABLE IF EXISTS `cgform_button`; +CREATE TABLE `cgform_button` ( + `ID` varchar(32) NOT NULL, + `BUTTON_CODE` varchar(50) default NULL, + `button_icon` varchar(20) default NULL, + `BUTTON_NAME` varchar(50) default NULL, + `BUTTON_STATUS` varchar(2) default NULL, + `BUTTON_STYLE` varchar(20) default NULL, + `EXP` varchar(255) default NULL, + `FORM_ID` varchar(32) default NULL, + `OPT_TYPE` varchar(20) default NULL, + `order_num` int(11) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of cgform_button +-- ---------------------------- +INSERT INTO `cgform_button` VALUES ('402881e64ca6fd1b014ca713620f000d', 'copy_url', 'pictures', '閰嶇疆鍦板潃', '1', 'link', '', '2c90ac564c9d1734014c9d22b16c0001', 'js', '3'); +INSERT INTO `cgform_button` VALUES ('402881e64ca6fd1b014ca713e2c0000f', 'graph_test', 'pictures', '鍔熻兘娴嬭瘯', '1', 'link', '', '2c90ac564c9d1734014c9d22b16c0001', 'js', '2'); + +-- ---------------------------- +-- Table structure for `cgform_button_sql` +-- ---------------------------- +DROP TABLE IF EXISTS `cgform_button_sql`; +CREATE TABLE `cgform_button_sql` ( + `ID` varchar(32) NOT NULL, + `BUTTON_CODE` varchar(50) default NULL, + `CGB_SQL` tinyblob, + `CGB_SQL_NAME` varchar(50) default NULL, + `CONTENT` longtext, + `FORM_ID` varchar(32) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of cgform_button_sql +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `cgform_enhance_js` +-- ---------------------------- +DROP TABLE IF EXISTS `cgform_enhance_js`; +CREATE TABLE `cgform_enhance_js` ( + `ID` varchar(32) NOT NULL, + `CG_JS` blob, + `CG_JS_TYPE` varchar(20) default NULL, + `CONTENT` longtext, + `FORM_ID` varchar(32) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of cgform_enhance_js +-- ---------------------------- +INSERT INTO `cgform_enhance_js` VALUES ('2c90ac564c9d1734014c9d322192001f', 0x6A666F726D5F67726170687265706F72745F686561644677203D20313035303B0D0A6A666F726D5F67726170687265706F72745F686561644668203D203630303B0D0A0D0A2F2F3F3F0D0A0966756E6374696F6E206A666F726D5F67726170687265706F72745F6865616461646428297B0D0A09096164642827E59BBEE8A1A8E9858DE7BDAE272C276367466F726D4275696C64436F6E74726F6C6C65722E646F3F66746C466F726D267461626C654E616D653D6A666F726D5F67726170687265706F72745F68656164272C276A666F726D5F67726170687265706F72745F686561644C697374272C6A666F726D5F67726170687265706F72745F6865616446772C6A666F726D5F67726170687265706F72745F686561644668293B0D0A097D0D0A092F2F3F3F0D0A0966756E6374696F6E206A666F726D5F67726170687265706F72745F6865616475706461746528297B0D0A09097570646174652827E59BBEE8A1A8E9858DE7BDAE272C276367466F726D4275696C64436F6E74726F6C6C65722E646F3F66746C466F726D267461626C654E616D653D6A666F726D5F67726170687265706F72745F68656164272C276A666F726D5F67726170687265706F72745F686561644C697374272C6A666F726D5F67726170687265706F72745F6865616446772C6A666F726D5F67726170687265706F72745F686561644668293B0D0A097D0D0A092F2F3F3F0D0A0966756E6374696F6E206A666F726D5F67726170687265706F72745F68656164636F707928297B0D0A0909636F707928273F3F3F3F3F3F272C276367466F726D4275696C64436F6E74726F6C6C65722E646F3F66746C466F726D267461626C654E616D653D6A666F726D5F67726170687265706F72745F68656164272C276A666F726D5F67726170687265706F72745F686561644C697374272C6A666F726D5F67726170687265706F72745F6865616446772C6A666F726D5F67726170687265706F72745F686561644668293B0D0A097D0D0A092F2F3F3F0D0A0966756E6374696F6E206A666F726D5F67726170687265706F72745F686561647669657728297B0D0A090964657461696C28273F3F272C276367466F726D4275696C64436F6E74726F6C6C65722E646F3F66746C466F726D267461626C654E616D653D6A666F726D5F67726170687265706F72745F68656164272C276A666F726D5F67726170687265706F72745F686561644C697374272C6A666F726D5F67726170687265706F72745F6865616446772C6A666F726D5F67726170687265706F72745F686561644668293B0D0A097D0D0A0D0A66756E6374696F6E2067726170685F746573742829207B0D0A097661722065203D206576656E74207C7C20785F6578706F72742E63616C6C65722E617267756D656E74735B305D3B0D0A2020202076617220746172676574203D20652E746172676574207C7C20652E737263456C656D656E743B0D0A2020202076617220636F6E6669674964203D202428746172676574292E706172656E7473282274723A666972737422292E66696E64282274645B6669656C643D27636F6465275D22292E7465787428293B0D0A2020202076617220636F6E6669674E616D65203D202428746172676574292E706172656E7473282274723A666972737422292E66696E64282274645B6669656C643D276E616D65275D22292E7465787428293B0D0A09202020200D0A096164644F6E655461622822E8A1A8E58D95E695B0E68DAEE58897E8A1A8205B222B636F6E6669674E616D652B225D222C202267726170685265706F7274436F6E74726F6C6C65722E646F3F6C697374266973496672616D652669643D222B636F6E6669674964293B0D0A7D0D0A0D0A66756E6374696F6E20636F70795F75726C2829207B0D0A202020207661722065203D206576656E74207C7C20785F6578706F72742E63616C6C65722E617267756D656E74735B305D3B0D0A2020202076617220746172676574203D20652E746172676574207C7C20652E737263456C656D656E743B0D0A2020202076617220636F6E6669674964203D202428746172676574292E706172656E7473282274723A666972737422292E66696E64282274645B6669656C643D27636F6465275D22292E7465787428293B0D0A20202020706F704D656E754C696E6B477261706828636F6E66696749642C20636F6E6669674964293B0D0A7D0D0A2F2FE59BBEE8A1A8E9858DE7BDAEE5A48DE588B60D0A66756E6374696F6E20706F704D656E754C696E6B4772617068287461626C654E616D652C636F6E74656E74297B0D0A097661722075726C203D20223C696E70757420747970653D277465787427207374796C653D2777696474683A33383070783B272064697361626C65643D5C2264697361626C65645C222069643D276D656E754C696E6B27207469746C653D2767726170685265706F7274436F6E74726F6C6C65722E646F3F6C6973742669643D272076616C75653D2767726170685265706F7274436F6E74726F6C6C65722E646F3F6C697374266973496672616D652669643D222B7461626C654E616D652B2227202F3E223B0D0A09242E6469616C6F67287B0D0A0909636F6E74656E743A2075726C2C0D0A090964726167203A66616C73652C0D0A09096C6F636B203A20747275652C0D0A09097469746C653A27E88F9CE58D95E993BEE68EA55B272B636F6E74656E742B275D272C0D0A09096F706163697479203A20302E332C0D0A090977696474683A3430302C0D0A09096865696768743A35302C0D0A090963616368653A66616C73652C0D0A092020202063616E63656C56616C3A2027E585B3E997AD272C0D0A092020202063616E63656C3A2066756E6374696F6E28297B636C69702E64657374726F7928293B7D2C0D0A0920202020627574746F6E203A205B7B0D0A0920202020096964203A2022636F70747942746E222C0D0A0920202020096E616D65203A2022E5A48DE588B6222C0D0A09202020200963616C6C6261636B203A2066756E6374696F6E202829207B0D0A0920202020097D0D0A09202020207D5D2C0D0A0920202020696E6974203A2066756E6374696F6E202829207B0D0A090909636C6970203D206E6577205A65726F436C6970626F6172642E436C69656E7428293B0D0A090909636C69702E73657448616E64437572736F7228207472756520293B0D0A0909090D0A090909636C69702E6164644576656E744C697374656E657228276D6F7573654F766572272C2066756E6374696F6E28636C69656E74297B0D0A09090909636C69702E736574546578742820646F63756D656E742E676574456C656D656E744279496428226D656E754C696E6B22292E76616C756520293B0D0A0909097D293B0D0A090909636C69702E6164644576656E744C697374656E65722827636F6D706C657465272C2066756E6374696F6E28636C69656E742C2074657874297B0D0A09090909616C6572742822E5A48DE588B6E68890E58A9F22293B0D0A0909097D293B0D0A090909766172206D656E754C696E6B203D20242822236D656E754C696E6B22292E76616C28293B0D0A0909092428242822696E7075745B747970653D627574746F6E5D22295B305D292E6174747228226964222C22636F70747942746E22293B0D0A090909636C69702E73657454657874286D656E754C696E6B293B0D0A090909636C69702E676C75652822636F70747942746E22293B0D0A09202020207D0D0A097D293B20200D0A7D, 'list', null, '2c90ac564c9d1734014c9d22b16c0001'); +INSERT INTO `cgform_enhance_js` VALUES ('2c90ac564c9d1734014c9d3241ac0021', 0x242822746578746172656122292E686569676874283630293B0D0A0D0A242866756E6374696F6E28297B0D0A242822626F647922292E617070656E6428223C6C696E6B20687265663D5C22706C75672D696E2F6C68674469616C6F672F736B696E732F64656661756C742E6373735C222072656C3D5C227374796C6573686565745C222069643D5C226C68676469616C6F676C696E6B5C223E22293B0D0A766172202462746E203D202428223C64697620636C6173733D5C2275695F627574746F6E735C2220207374796C653D5C22646973706C61793A696E6C696E652D626C6F636B3B70616464696E673A3070783B5C223E3C696E707574207374796C653D5C22706F736974696F6E3A2072656C61746976653B746F703A203070783B5C2220636C6173733D5C2275695F73746174655F686967686C696768745C2220747970653D5C22627574746F6E5C222076616C75653D5C2273716CE8A7A3E69E905C22202069643D5C2273716C416E616C797A655C22202F3E3C2F6469763E22293B0D0A242822236367725F73716C22292E6166746572282462746E293B0D0A2462746E2E636C69636B2866756E6374696F6E28297B0D0A20242E616A6178287B0D0A2020202075726C3A2263675265706F7274436F6E74726F6C6C65722E646F3F6765744669656C6473222C0D0A20202020646174613A7B73716C3A242822236367725F73716C22292E76616C28297D2C0D0A09747970653A22506F7374222C0D0A2020202064617461547970653A226A736F6E222C0D0A20202020737563636573733A66756E6374696F6E2864617461297B0D0A20202020696628646174612E7374617475733D3D227375636365737322297B0D0A09202020202020242822236164645F6A666F726D5F67726170687265706F72745F6974656D5F7461626C6522292E656D70747928293B0D0A09202020202020242E6561636828646174612E64617461732C66756E6374696F6E28696E6465782C65297B0D0A0909092428222361646442746E5F6A666F726D5F67726170687265706F72745F6974656D22292E636C69636B28293B0D0A090909242822236164645F6A666F726D5F67726170687265706F72745F6974656D5F7461626C652074723A6C61737422292E66696E6428223A7465787422290D0A090909092E65712830292E76616C2865290D0A090909092E656E6428292E65712831292E76616C2865290D0A090909092E656E6428292E65712832292E76616C28696E646578293B0D0A092020202020207D293B200D0A092020202020202F2F726573657454724E756D28226164645F6A666F726D5F67726170687265706F72745F6974656D5F7461626C6522293B0D0A202020207D656C73657B0D0A0909242E6D657373616765722E616C65727428273F3F272C646174612E6461746173293B0D0A097D0D0A20207D0D0A20207D293B0D0A207D293B0D0A7D293B, 'form', null, '2c90ac564c9d1734014c9d22b16c0001'); + +-- ---------------------------- +-- Table structure for `cgform_field` +-- ---------------------------- +DROP TABLE IF EXISTS `cgform_field`; +CREATE TABLE `cgform_field` ( + `id` varchar(32) NOT NULL, + `content` varchar(200) NOT NULL, + `create_by` varchar(255) default NULL, + `create_date` datetime default NULL, + `create_name` varchar(32) default NULL, + `dict_field` varchar(100) default NULL, + `dict_table` varchar(100) default NULL, + `dict_text` varchar(100) default NULL, + `field_default` varchar(20) default NULL, + `field_href` varchar(200) default NULL, + `field_length` int(11) default NULL, + `field_name` varchar(32) NOT NULL, + `field_valid_type` varchar(10) default NULL, + `is_key` varchar(2) default NULL, + `is_null` varchar(5) default NULL, + `is_query` varchar(5) default NULL, + `is_show` varchar(5) default NULL, + `is_show_list` varchar(5) default NULL, + `length` int(11) NOT NULL, + `main_field` varchar(100) default NULL, + `main_table` varchar(100) default NULL, + `old_field_name` varchar(32) default NULL, + `order_num` int(11) default NULL, + `point_length` int(11) default NULL, + `query_mode` varchar(10) default NULL, + `show_type` varchar(10) default NULL, + `type` varchar(32) NOT NULL, + `update_by` varchar(32) default NULL, + `update_date` datetime default NULL, + `update_name` varchar(32) default NULL, + `table_id` varchar(32) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of cgform_field +-- ---------------------------- +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b17b0002', 'id', 'admin', '2015-04-09 15:43:58', '绠$悊鍛', '', '', '', '', '', '120', 'id', '', 'Y', 'N', 'N', 'N', 'N', '36', '', '', 'id', '1', '0', 'group', 'text', 'string', 'admin', '2015-04-09 15:49:50', '绠$悊鍛', '2c90ac564c9d1734014c9d22b16c0001'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b1aa0003', '鏌ヨ鏁版嵁SQL', 'admin', '2015-04-09 15:43:58', '绠$悊鍛', '', '', '', '', '', '120', 'cgr_sql', '', 'N', 'N', 'Y', 'Y', 'Y', '2000', '', '', 'cgr_sql', '4', '0', 'single', 'textarea', 'string', 'admin', '2015-04-11 16:50:46', '绠$悊鍛', '2c90ac564c9d1734014c9d22b16c0001'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b1aa0004', '缂栫爜', 'admin', '2015-04-09 15:43:58', '绠$悊鍛', '', '', '', '', '', '120', 'code', '', 'N', 'N', 'Y', 'Y', 'Y', '36', '', '', 'code', '3', '0', 'single', 'text', 'string', 'admin', '2015-04-09 15:49:50', '绠$悊鍛', '2c90ac564c9d1734014c9d22b16c0001'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b1aa0005', '鎻忚堪', 'admin', '2015-04-09 15:43:58', '绠$悊鍛', '', '', '', '', '', '120', 'content', '', 'N', 'N', 'N', 'Y', 'Y', '1000', '', '', 'content', '5', '0', 'group', 'text', 'string', 'admin', '2015-04-09 15:49:50', '绠$悊鍛', '2c90ac564c9d1734014c9d22b16c0001'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b1aa0006', '鍚嶇О', 'admin', '2015-04-09 15:43:58', '绠$悊鍛', '', '', '', '', '', '120', 'name', '', 'N', 'N', 'Y', 'Y', 'Y', '100', '', '', 'name', '2', '0', 'single', 'text', 'string', 'admin', '2015-04-09 19:04:50', '绠$悊鍛', '2c90ac564c9d1734014c9d22b16c0001'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b1ba0007', 'y杞存枃瀛', 'admin', '2015-04-09 15:43:58', '绠$悊鍛', '', '', '', '', '', '120', 'ytext', '', 'N', 'N', 'N', 'Y', 'Y', '100', '', '', 'ytext', '6', '0', 'group', 'text', 'string', 'admin', '2015-04-09 15:49:50', '绠$悊鍛', '2c90ac564c9d1734014c9d22b16c0001'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b1ba0008', 'x杞存暟鎹', 'admin', '2015-04-09 15:43:58', '绠$悊鍛', '', '', '', '', '', '120', 'categories', '', 'N', 'N', 'N', 'Y', 'Y', '1000', '', '', 'categories', '7', '0', 'group', 'text', 'string', 'admin', '2015-04-09 15:49:50', '绠$悊鍛', '2c90ac564c9d1734014c9d22b16c0001'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b1ba0009', '鏄惁鏄剧ず鏄庣粏', 'admin', '2015-04-09 15:43:58', '绠$悊鍛', 'sf_yn', '', '', '', '', '120', 'is_show_list', '', 'N', 'Y', 'Y', 'Y', 'Y', '5', '', '', 'is_show_list', '8', '0', 'single', 'list', 'string', 'admin', '2015-04-09 18:27:39', '绠$悊鍛', '2c90ac564c9d1734014c9d22b16c0001'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b1ba000a', '鎵╁睍JS', 'admin', '2015-04-09 15:43:58', '绠$悊鍛', '', '', '', '', '', '120', 'x_page_js', '', 'N', 'Y', 'N', 'Y', 'Y', '5000', '', '', 'x_page_js', '9', '0', 'group', 'textarea', 'Text', 'admin', '2015-04-09 15:49:50', '绠$悊鍛', '2c90ac564c9d1734014c9d22b16c0001'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b360000c', 'id', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', '', '', '', '', '', '120', 'id', '', 'Y', 'N', 'N', 'N', 'N', '36', '', '', 'id', '1', '0', 'group', 'text', 'string', 'admin', '2015-04-09 15:47:32', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b360000d', '鏄惁鏌ヨ', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', 'sf_yn', '', '', '', '', '120', 'search_flag', '', 'N', 'Y', 'N', 'Y', 'Y', '2', '', '', 'search_flag', '7', '0', 'group', 'list', 'string', 'admin', '2015-04-09 19:08:44', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b360000e', '鏌ヨ妯″紡', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', 'searchmode', '', '', '', '', '100', 'search_mode', '', 'N', 'Y', 'N', 'Y', 'Y', '10', '', '', 'search_mode', '8', '0', 'group', 'list', 'string', 'admin', '2015-04-11 17:03:31', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b360000f', 'cgreportHeadId', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', '', '', '', '', '', '120', 'cgreport_head_id', '', 'N', 'Y', 'N', 'N', 'N', '36', 'id', 'jform_graphreport_head', 'cgreport_head_id', '16', '0', 'group', 'text', 'string', 'admin', '2015-04-09 15:50:16', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b3600010', '瀛楀吀Code', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', '', '', '', '', '', '100', 'dict_code', '', 'N', 'Y', 'N', 'Y', 'Y', '500', '', '', 'dict_code', '9', '0', 'group', 'text', 'string', 'admin', '2015-04-11 17:03:31', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b36f0011', '瀛楁href', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', '', '', '', '', '', '120', 'field_href', '', 'N', 'Y', 'N', 'N', 'N', '120', '', '', 'field_href', '14', '0', 'group', 'text', 'string', 'admin', '2015-04-09 15:47:32', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b37f0012', '瀛楁鍚', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', '', '', '', '', '', '80', 'field_name', '', 'N', 'Y', 'N', 'Y', 'Y', '36', '', '', 'field_name', '2', '0', 'group', 'text', 'string', 'admin', '2015-04-13 00:40:36', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b37f0013', '瀛楁鏂囨湰', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', '', '', '', '', '', '80', 'field_txt', '', 'N', 'Y', 'N', 'Y', 'Y', '1000', '', '', 'field_txt', '3', '0', 'group', 'text', 'string', 'admin', '2015-04-11 17:19:53', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b37f0014', '瀛楁绫诲瀷', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', 'fieldtype', '', '', '', '', '120', 'field_type', '', 'N', 'Y', 'N', 'Y', 'Y', '10', '', '', 'field_type', '5', '0', 'group', 'list', 'string', 'admin', '2015-04-11 13:53:04', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b37f0015', '鏄惁鏄剧ず', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', 'sf_yn', '', '', '', '', '120', 'is_show', '', 'N', 'Y', 'N', 'Y', 'Y', '5', '', '', 'is_show', '6', '0', 'group', 'list', 'string', 'admin', '2015-04-09 19:08:44', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b38f0016', '鎺掑簭', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', '', '', '', '', '', '50', 'order_num', '', 'N', 'Y', 'N', 'Y', 'Y', '10', '', '', 'order_num', '4', '0', 'group', 'text', 'int', 'admin', '2015-04-09 19:08:44', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b38f0017', '鍙栧艰〃杈惧紡', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', '', '', '', '', '', '120', 'replace_va', '', 'N', 'Y', 'N', 'N', 'N', '36', '', '', 'replace_va', '15', '0', 'group', 'text', 'string', 'admin', '2015-04-09 15:47:32', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b38f0018', '鏄剧ず鍥捐〃', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', 'sf_yn', '', '', '', '', '120', 'is_graph', '', 'N', 'Y', 'N', 'Y', 'Y', '5', '', '', 'is_graph', '10', '0', 'group', 'list', 'string', 'admin', '2015-04-09 19:08:44', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b38f0019', '鍥捐〃绫诲瀷', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', 'tblx', '', '', '', '', '120', 'graph_type', '', 'N', 'Y', 'N', 'Y', 'Y', '50', '', '', 'graph_type', '11', '0', 'group', 'list', 'string', 'admin', '2015-04-11 13:53:04', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b38f001a', '鍥捐〃鍚嶇О', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', '', '', '', '', '', '80', 'graph_name', '', 'N', 'Y', 'N', 'Y', 'Y', '100', '', '', 'graph_name', '12', '0', 'group', 'text', 'string', 'admin', '2015-04-11 17:19:53', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('2c90ac564c9d1734014c9d22b38f001b', '鏍囩鍚嶇О', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', '', '', '', '', '', '80', 'tab_name', '', 'N', 'Y', 'N', 'Y', 'Y', '50', '', '', 'tab_name', '13', '0', 'group', 'text', 'string', 'admin', '2015-04-11 17:19:53', '绠$悊鍛', '2c90ac564c9d1734014c9d22b360000b'); +INSERT INTO `cgform_field` VALUES ('402880e74da32ebe014da3309b890002', '涓婚敭', 'admin', '2015-05-30 12:59:41', '绠$悊鍛', '', '', '', '', '', '120', 'id', '', 'Y', 'N', 'N', 'N', 'N', '36', '', '', 'id', '1', '0', 'single', 'text', 'string', null, null, null, '402880e74da32ebe014da3309b880001'); +INSERT INTO `cgform_field` VALUES ('402880e74da32ebe014da3309cf00003', '鍒涘缓浜哄悕绉', 'admin', '2015-05-30 12:59:41', '绠$悊鍛', '', '', '', '', '', '120', 'create_name', '', 'N', 'Y', 'N', 'N', 'N', '50', '', '', 'create_name', '2', '0', 'single', 'text', 'string', null, null, null, '402880e74da32ebe014da3309b880001'); +INSERT INTO `cgform_field` VALUES ('402880e74da32ebe014da3309cf40004', '鍒涘缓浜虹櫥褰曞悕绉', 'admin', '2015-05-30 12:59:41', '绠$悊鍛', '', '', '', '', '', '120', 'create_by', '', 'N', 'Y', 'N', 'N', 'N', '50', '', '', 'create_by', '3', '0', 'single', 'text', 'string', null, null, null, '402880e74da32ebe014da3309b880001'); +INSERT INTO `cgform_field` VALUES ('402880e74da32ebe014da3309cf70005', '鍒涘缓鏃ユ湡', 'admin', '2015-05-30 12:59:41', '绠$悊鍛', '', '', '', '', '', '120', 'create_date', '', 'N', 'Y', 'N', 'N', 'N', '20', '', '', 'create_date', '4', '0', 'single', 'date', 'Date', null, null, null, '402880e74da32ebe014da3309b880001'); +INSERT INTO `cgform_field` VALUES ('402880e74da32ebe014da3309cfb0006', '鏇存柊浜哄悕绉', 'admin', '2015-05-30 12:59:41', '绠$悊鍛', '', '', '', '', '', '120', 'update_name', '', 'N', 'Y', 'N', 'N', 'N', '50', '', '', 'update_name', '5', '0', 'single', 'text', 'string', null, null, null, '402880e74da32ebe014da3309b880001'); +INSERT INTO `cgform_field` VALUES ('402880e74da32ebe014da3309cff0007', '鏇存柊浜虹櫥褰曞悕绉', 'admin', '2015-05-30 12:59:41', '绠$悊鍛', '', '', '', '', '', '120', 'update_by', '', 'N', 'Y', 'N', 'N', 'N', '50', '', '', 'update_by', '6', '0', 'single', 'text', 'string', null, null, null, '402880e74da32ebe014da3309b880001'); +INSERT INTO `cgform_field` VALUES ('402880e74da32ebe014da3309d020008', '鏇存柊鏃ユ湡', 'admin', '2015-05-30 12:59:41', '绠$悊鍛', '', '', '', '', '', '120', 'update_date', '', 'N', 'Y', 'N', 'N', 'N', '20', '', '', 'update_date', '7', '0', 'single', 'date', 'Date', null, null, null, '402880e74da32ebe014da3309b880001'); +INSERT INTO `cgform_field` VALUES ('402880e74da32ebe014da3309d050009', '鐗╂枡缂栫爜', 'admin', '2015-05-30 12:59:41', '绠$悊鍛', '', '', '', '', '', '120', 'name', '', 'N', 'Y', 'N', 'Y', 'Y', '32', '', '', 'name', '8', '0', 'single', 'text', 'string', null, null, null, '402880e74da32ebe014da3309b880001'); +INSERT INTO `cgform_field` VALUES ('402880e74da35336014da3555bc70002', '鐖禝D', 'admin', '2015-05-30 13:39:49', '绠$悊鍛', '', '', '', 'null', '', '120', 'father_id', '', 'N', 'Y', 'N', 'Y', 'Y', '32', '', '', 'father_id', '9', '0', 'single', 'text', 'string', 'admin', '2015-06-01 09:43:15', '绠$悊鍛', '402880e74da32ebe014da3309b880001'); +INSERT INTO `cgform_field` VALUES ('402880e74dc1e65e014dc1effa2b0002', '涓婚敭', 'admin', '2015-06-05 12:17:19', '绠$悊鍛', '', '', '', '', '', '120', 'id', '', 'Y', 'N', 'N', 'N', 'N', '36', '', '', 'id', '1', '0', 'single', 'text', 'string', null, null, null, '402880e74dc1e65e014dc1effa270001'); +INSERT INTO `cgform_field` VALUES ('402880e74dc1e65e014dc1effa430003', '鍒涘缓浜哄悕绉', 'admin', '2015-06-05 12:17:19', '绠$悊鍛', '', '', '', '', '', '120', 'create_name', '', 'N', 'Y', 'N', 'N', 'Y', '50', '', '', 'create_name', '2', '0', 'single', 'text', 'string', null, null, null, '402880e74dc1e65e014dc1effa270001'); +INSERT INTO `cgform_field` VALUES ('402880e74dc1e65e014dc1effa480004', '鍒涘缓浜虹櫥褰曞悕绉', 'admin', '2015-06-05 12:17:19', '绠$悊鍛', '', '', '', '', '', '120', 'create_by', '', 'N', 'Y', 'N', 'N', 'Y', '50', '', '', 'create_by', '3', '0', 'single', 'text', 'string', null, null, null, '402880e74dc1e65e014dc1effa270001'); +INSERT INTO `cgform_field` VALUES ('402880e74dc1e65e014dc1effa4c0005', '鍒涘缓鏃ユ湡', 'admin', '2015-06-05 12:17:19', '绠$悊鍛', '', '', '', '', '', '120', 'create_date', '', 'N', 'Y', 'N', 'N', 'Y', '20', '', '', 'create_date', '4', '0', 'single', 'date', 'Date', null, null, null, '402880e74dc1e65e014dc1effa270001'); +INSERT INTO `cgform_field` VALUES ('402880e74dc1e65e014dc1effa510006', '鏇存柊浜哄悕绉', 'admin', '2015-06-05 12:17:19', '绠$悊鍛', '', '', '', '', '', '120', 'update_name', '', 'N', 'Y', 'N', 'N', 'Y', '50', '', '', 'update_name', '5', '0', 'single', 'text', 'string', null, null, null, '402880e74dc1e65e014dc1effa270001'); +INSERT INTO `cgform_field` VALUES ('402880e74dc1e65e014dc1effa5e0007', '鏇存柊浜虹櫥褰曞悕绉', 'admin', '2015-06-05 12:17:19', '绠$悊鍛', '', '', '', '', '', '120', 'update_by', '', 'N', 'Y', 'N', 'N', 'Y', '50', '', '', 'update_by', '6', '0', 'single', 'text', 'string', null, null, null, '402880e74dc1e65e014dc1effa270001'); +INSERT INTO `cgform_field` VALUES ('402880e74dc1e65e014dc1effa620008', '鏇存柊鏃ユ湡', 'admin', '2015-06-05 12:17:19', '绠$悊鍛', '', '', '', '', '', '120', 'update_date', '', 'N', 'Y', 'N', 'N', 'Y', '20', '', '', 'update_date', '7', '0', 'single', 'date', 'Date', null, null, null, '402880e74dc1e65e014dc1effa270001'); +INSERT INTO `cgform_field` VALUES ('402880e74dc1e65e014dc1effa660009', '鍚嶅瓧', 'admin', '2015-06-05 12:17:19', '绠$悊鍛', '', '', '', '', '', '120', 'name', '', 'N', 'Y', 'N', 'Y', 'Y', '32', '', '', 'name', '8', '0', 'single', 'text', 'string', null, null, null, '402880e74dc1e65e014dc1effa270001'); +INSERT INTO `cgform_field` VALUES ('402881e84da07286014da07504a30002', 'id', 'admin', '2015-05-30 00:15:33', '绠$悊鍛', '', '', '', '', '', '120', 'id', '', 'Y', 'N', 'N', 'N', 'N', '32', '', '', 'id', '1', '0', 'group', 'text', 'string', 'admin', '2015-05-30 00:17:59', '绠$悊鍛', '402881e84da07286014da07504960001'); +INSERT INTO `cgform_field` VALUES ('402881e84da07286014da07504b20003', 'functioniframe', 'admin', '2015-05-30 00:15:33', '绠$悊鍛', '', '', '', '', '', '120', 'functioniframe', '', 'N', 'Y', 'N', 'N', 'N', '5', '', '', 'functioniframe', '3', '0', 'group', 'text', 'int', 'admin', '2015-05-30 00:35:23', '绠$悊鍛', '402881e84da07286014da07504960001'); +INSERT INTO `cgform_field` VALUES ('402881e84da07286014da07504b40004', 'functionlevel', 'admin', '2015-05-30 00:15:33', '绠$悊鍛', '', '', '', '', '', '120', 'functionlevel', '', 'N', 'Y', 'Y', 'Y', 'Y', '5', '', '', 'functionlevel', '4', '0', 'single', 'text', 'int', 'admin', '2015-05-30 00:35:23', '绠$悊鍛', '402881e84da07286014da07504960001'); +INSERT INTO `cgform_field` VALUES ('402881e84da07286014da07504b50005', 'functionname', 'admin', '2015-05-30 00:15:33', '绠$悊鍛', '', '', '', '', '', '120', 'functionname', '', 'N', 'N', 'N', 'Y', 'Y', '50', '', '', 'functionname', '2', '0', 'group', 'text', 'string', 'admin', '2015-05-30 00:35:23', '绠$悊鍛', '402881e84da07286014da07504960001'); +INSERT INTO `cgform_field` VALUES ('402881e84da07286014da07504bb0006', 'functionorder', 'admin', '2015-05-30 00:15:33', '绠$悊鍛', '', '', '', '', '', '120', 'functionorder', '', 'N', 'Y', 'N', 'Y', 'Y', '255', '', '', 'functionorder', '5', '0', 'group', 'text', 'string', 'admin', '2015-05-30 00:17:59', '绠$悊鍛', '402881e84da07286014da07504960001'); +INSERT INTO `cgform_field` VALUES ('402881e84da07286014da07504bc0007', 'functionurl', 'admin', '2015-05-30 00:15:33', '绠$悊鍛', '', '', '', '', '', '120', 'functionurl', '', 'N', 'Y', 'N', 'Y', 'Y', '100', '', '', 'functionurl', '6', '0', 'group', 'text', 'string', 'admin', '2015-05-30 00:17:59', '绠$悊鍛', '402881e84da07286014da07504960001'); +INSERT INTO `cgform_field` VALUES ('402881e84da07286014da07504be0008', 'parentfuncid', 'admin', '2015-05-30 00:15:33', '绠$悊鍛', '', '', '', 'null', '', '120', 'parentfunctionid', '', 'N', 'Y', 'N', 'Y', 'Y', '32', '', '', 'parentfunctionid', '7', '0', 'group', 'text', 'string', 'admin', '2015-05-30 00:20:09', '绠$悊鍛', '402881e84da07286014da07504960001'); +INSERT INTO `cgform_field` VALUES ('402881e84da07286014da07504c00009', 'iconid', 'admin', '2015-05-30 00:15:33', '绠$悊鍛', '', '', '', '', '', '120', 'iconid', '', 'N', 'Y', 'N', 'Y', 'Y', '32', '', '', 'iconid', '8', '0', 'group', 'text', 'string', 'admin', '2015-05-30 00:17:59', '绠$悊鍛', '402881e84da07286014da07504960001'); +INSERT INTO `cgform_field` VALUES ('402881e84da07286014da07504c3000a', 'deskIconid', 'admin', '2015-05-30 00:15:33', '绠$悊鍛', '', '', '', '', '', '120', 'desk_iconid', '', 'N', 'Y', 'N', 'Y', 'Y', '32', '', '', 'desk_iconid', '9', '0', 'group', 'text', 'string', 'admin', '2015-05-30 00:17:59', '绠$悊鍛', '402881e84da07286014da07504960001'); +INSERT INTO `cgform_field` VALUES ('402881e84da07286014da07504c5000b', 'functiontype', 'admin', '2015-05-30 00:15:33', '绠$悊鍛', '', '', '', '', '', '120', 'functiontype', '', 'N', 'Y', 'N', 'Y', 'Y', '5', '', '', 'functiontype', '10', '0', 'group', 'text', 'int', 'admin', '2015-05-30 00:17:59', '绠$悊鍛', '402881e84da07286014da07504960001'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184940140', '涓婚敭', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', '', '', '', '0', 'id', '', 'Y', 'N', 'N', 'N', 'N', '36', '', '', 'id', '1', '0', 'single', 'text', 'string', '8a8ab0b246dc81120146dc8181950052', '2014-07-10 16:22:32', 'admin', '8a8ab0b246dc81120146dc81847e013b'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc81849b0141', '璁㈠崟鍙', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', 'account', 'user_msg', 'realname', '', '', '0', 'order_code', '', 'N', 'Y', 'Y', 'Y', 'Y', '50', '', '', 'order_code', '2', '0', 'single', 'popup', 'string', 'admin', '2015-05-27 10:32:34', '绠$悊鍛', '8a8ab0b246dc81120146dc81847e013b'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc81849d0142', '璁㈠崟鏃ユ湡', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', '', '', '', '0', 'order_date', '', 'N', 'Y', 'Y', 'Y', 'Y', '20', '', '', 'order_date', '3', '0', 'single', 'date', 'Date', '8a8ab0b246dc81120146dc8181950052', '2014-07-10 16:22:32', 'admin', '8a8ab0b246dc81120146dc81847e013b'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc81849f0143', '璁㈠崟閲戦', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', '', '', '', '0', 'order_money', '', 'N', 'Y', 'Y', 'Y', 'Y', '10', '', '', 'order_money', '4', '3', 'single', 'text', 'double', '8a8ab0b246dc81120146dc8181950052', '2014-07-10 16:22:32', 'admin', '8a8ab0b246dc81120146dc81847e013b'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184a10144', '澶囨敞', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', '', '', '', '0', 'content', '', 'N', 'Y', 'Y', 'Y', 'Y', '255', '', '', 'content', '5', '0', 'single', 'text', 'string', '8a8ab0b246dc81120146dc8181950052', '2014-07-10 16:22:32', 'admin', '8a8ab0b246dc81120146dc81847e013b'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184ab0145', '涓婚敭', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'id', null, 'Y', 'N', 'N', 'N', 'N', '36', '', '', null, '0', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc818484013c'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184ad0146', '璇峰亣鏍囬', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'title', null, 'N', 'N', 'N', 'Y', 'Y', '50', '', '', null, '1', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc818484013c'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184af0147', '璇峰亣浜', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'people', null, 'N', 'N', 'Y', 'Y', 'Y', '20', '', '', null, '2', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc818484013c'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184b10148', '鎬у埆', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', 'sex', '', null, null, null, '0', 'sex', null, 'N', 'N', 'Y', 'Y', 'Y', '10', '', '', null, '3', '0', 'single', 'list', 'string', null, null, null, '8a8ab0b246dc81120146dc818484013c'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184b30149', '璇峰亣寮濮嬫椂闂', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'begindate', null, 'N', 'N', 'N', 'Y', 'Y', '0', '', '', null, '4', '0', 'group', 'date', 'Date', null, null, null, '8a8ab0b246dc81120146dc818484013c'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184b6014a', '璇峰亣缁撴潫鏃堕棿', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'enddate', null, 'N', 'N', 'N', 'Y', 'Y', '0', '', '', null, '5', '0', 'group', 'datetime', 'Date', null, null, null, '8a8ab0b246dc81120146dc818484013c'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184b8014b', '鎵灞為儴闂', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', 'id', 't_s_depart', 'departname', null, null, '0', 'hol_dept', null, 'N', 'N', 'N', 'Y', 'Y', '32', '', '', null, '7', '0', 'single', 'list', 'string', null, null, null, '8a8ab0b246dc81120146dc818484013c'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184ba014c', '璇峰亣鍘熷洜', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'hol_reson', null, 'N', 'N', 'N', 'Y', 'Y', '255', '', '', null, '8', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc818484013c'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184bc014d', '閮ㄩ棬瀹℃壒浜', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'dep_leader', null, 'N', 'N', 'N', 'Y', 'Y', '20', '', '', null, '9', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc818484013c'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184bd014e', '閮ㄩ棬瀹℃壒鎰忚', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'content', null, 'N', 'N', 'N', 'Y', 'Y', '255', '', '', null, '10', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc818484013c'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184bf014f', '璇峰亣澶╂暟', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '120', 'day_num', null, 'N', 'Y', 'N', 'Y', 'Y', '10', '', '', null, '6', '0', 'single', 'text', 'int', null, null, null, '8a8ab0b246dc81120146dc818484013c'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184cb0150', '涓婚敭', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'id', null, 'Y', 'N', 'N', 'N', 'N', '36', '', '', null, '0', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc818486013d'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184cd0151', '瀹㈡埛鍚', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'name', null, 'N', 'Y', 'Y', 'Y', 'Y', '32', '', '', null, '1', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc818486013d'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184cf0152', '鍗曚环', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'money', null, 'N', 'Y', 'Y', 'Y', 'Y', '10', '', '', null, '2', '2', 'group', 'text', 'double', null, null, null, '8a8ab0b246dc81120146dc818486013d'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184d10153', '澶栭敭', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '120', 'fk_id', null, 'N', 'N', 'Y', 'N', 'N', '36', 'id', 'jform_order_main', null, '5', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc818486013d'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184d40154', '鐢佃瘽', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '120', 'telphone', null, 'N', 'Y', 'Y', 'Y', 'Y', '32', '', '', null, '4', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc818486013d'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184d60155', '鎬у埆', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', 'sex', '', null, null, null, '120', 'sex', null, 'N', 'Y', 'Y', 'Y', 'Y', '4', '', '', null, '3', '0', 'single', 'select', 'string', null, null, null, '8a8ab0b246dc81120146dc818486013d'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184da0156', '涓婚敭', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '120', 'id', null, 'Y', 'N', 'N', 'N', 'N', '36', '', '', null, '0', '0', 'single', 'checkbox', 'string', null, null, null, '8a8ab0b246dc81120146dc818488013e'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184dc0157', '鑸彮鍙', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '120', 'ticket_code', null, 'N', 'N', 'Y', 'Y', 'Y', '100', '', '', null, '1', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc818488013e'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184df0158', '鑸彮鏃堕棿', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '120', 'tickect_date', null, 'N', 'N', 'Y', 'Y', 'Y', '10', '', '', null, '2', '0', 'single', 'datetime', 'Date', null, null, null, '8a8ab0b246dc81120146dc818488013e'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184e10159', '澶栭敭', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '120', 'fck_id', null, 'N', 'N', 'N', 'N', 'N', '36', 'id', 'jform_order_main', null, '3', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc818488013e'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184e7015a', '涓婚敭', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'id', null, 'Y', 'N', 'N', 'N', 'N', '36', '', '', null, '0', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184ea015b', '鏈烘瀯鍚堣', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'a', null, 'N', 'N', 'Y', 'Y', 'Y', '10', '', '', null, '1', '2', 'group', 'text', 'double', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184ec015c', '琛屾斂灏忚', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'b1', null, 'N', 'N', 'N', 'Y', 'Y', '10', '', '', null, '2', '2', 'group', 'text', 'double', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184ee015d', '琛屾斂鐪', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'b11', null, 'N', 'N', 'N', 'Y', 'Y', '100', '', '', null, '3', '0', 'group', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184f0015e', '琛屾斂甯', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'b12', null, 'N', 'N', 'N', 'Y', 'Y', '100', '', '', null, '4', '0', 'group', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184f3015f', '琛屾斂鍘', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'b13', null, 'N', 'N', 'N', 'Y', 'Y', '100', '', '', null, '5', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184f50160', '浜嬩笟鍚堣', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'b2', null, 'N', 'N', 'N', 'Y', 'Y', '10', '', '', null, '6', '2', 'single', 'text', 'double', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184f80161', '鍙傚叕灏忚', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'b3', null, 'N', 'N', 'N', 'Y', 'Y', '10', '', '', null, '7', '2', 'single', 'text', 'double', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184fa0162', '鍙傚叕鐪', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'b31', null, 'N', 'N', 'N', 'Y', 'Y', '100', '', '', null, '8', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184fc0163', '鍙傚叕甯', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'b32', null, 'N', 'N', 'N', 'Y', 'Y', '100', '', '', null, '9', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8184fe0164', '鍙傚叕鍘', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'b33', null, 'N', 'N', 'N', 'Y', 'Y', '100', '', '', null, '10', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8185000165', '鍏ㄩ鎷ㄦ', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'c1', null, 'N', 'N', 'N', 'Y', 'Y', '10', '', '', null, '11', '2', 'single', 'text', 'double', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8185030166', '宸鎷ㄦ', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'c2', null, 'N', 'N', 'N', 'Y', 'Y', '10', '', '', null, '12', '2', 'single', 'text', 'double', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8185050167', '鑷敹鑷敮', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'c3', null, 'N', 'N', 'N', 'Y', 'Y', '10', '', '', null, '13', '2', 'single', 'text', 'double', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc8185070168', '缁忚垂鍚堣', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'd', null, 'N', 'N', 'Y', 'Y', 'Y', '10', '', '', null, '14', '2', 'single', 'text', 'int', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8a8ab0b246dc81120146dc81850a0169', '鏈烘瀯璧勮川', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', '', '', null, null, null, '0', 'd1', null, 'N', 'N', 'N', 'Y', 'Y', '1000', '', '', null, '15', '0', 'single', 'text', 'string', null, null, null, '8a8ab0b246dc81120146dc81848b013f'); +INSERT INTO `cgform_field` VALUES ('8af235d44db32051014db35d961c0002', '涓婚敭', 'admin', '2015-06-02 16:22:44', '绠$悊鍛', '', '', '', '', '', '120', 'id', '', 'Y', 'N', 'N', 'N', 'N', '36', '', '', 'id', '1', '0', 'single', 'text', 'string', '', null, '', '8af235d44db32051014db35d96190001'); +INSERT INTO `cgform_field` VALUES ('8af235d44db32051014db35d96ac0003', '鍒涘缓浜哄悕绉', 'admin', '2015-06-02 16:22:44', '绠$悊鍛', '', '', '', '', '', '120', 'create_name', '', 'N', 'Y', 'N', 'N', 'N', '50', '', '', 'create_name', '2', '0', 'single', 'text', 'string', '', null, null, '8af235d44db32051014db35d96190001'); +INSERT INTO `cgform_field` VALUES ('8af235d44db32051014db35d96ae0004', '鍒涘缓浜虹櫥褰曞悕绉', 'admin', '2015-06-02 16:22:44', '绠$悊鍛', '', '', '', '', '', '120', 'create_by', '', 'N', 'Y', 'N', 'N', 'N', '50', '', '', 'create_by', '3', '0', 'single', 'text', 'string', '', null, null, '8af235d44db32051014db35d96190001'); +INSERT INTO `cgform_field` VALUES ('8af235d44db32051014db35d96b20005', '鍒涘缓鏃ユ湡', 'admin', '2015-06-02 16:22:44', '绠$悊鍛', '', '', '', '', '', '120', 'create_date', '', 'N', 'Y', 'N', 'N', 'N', '20', '', '', 'create_date', '4', '0', 'single', 'date', 'Date', '', null, null, '8af235d44db32051014db35d96190001'); +INSERT INTO `cgform_field` VALUES ('8af235d44db32051014db35d96bd0006', '鏇存柊浜哄悕绉', 'admin', '2015-06-02 16:22:44', '绠$悊鍛', '', '', '', '', '', '120', 'update_name', '', 'N', 'Y', 'N', 'N', 'N', '50', '', '', 'update_name', '5', '0', 'single', 'text', 'string', '', null, null, '8af235d44db32051014db35d96190001'); +INSERT INTO `cgform_field` VALUES ('8af235d44db32051014db35d96c60007', '鏇存柊浜虹櫥褰曞悕绉', 'admin', '2015-06-02 16:22:44', '绠$悊鍛', '', '', '', '', '', '120', 'update_by', '', 'N', 'Y', 'N', 'N', 'N', '50', '', '', 'update_by', '6', '0', 'single', 'text', 'string', '', null, null, '8af235d44db32051014db35d96190001'); +INSERT INTO `cgform_field` VALUES ('8af235d44db32051014db35d96c90008', '鏇存柊鏃ユ湡', 'admin', '2015-06-02 16:22:44', '绠$悊鍛', '', '', '', '', '', '120', 'update_date', '', 'N', 'Y', 'N', 'N', 'N', '20', '', '', 'update_date', '7', '0', 'single', 'date', 'Date', '', null, null, '8af235d44db32051014db35d96190001'); +INSERT INTO `cgform_field` VALUES ('8af235d44db32051014db35d96cb0009', '鏍囬', 'admin', '2015-06-02 16:22:44', '绠$悊鍛', '', '', '', '', '', '120', 'title', '', 'N', 'Y', 'Y', 'Y', 'Y', '32', '', '', 'title', '8', '0', 'single', 'text', 'string', '', null, null, '8af235d44db32051014db35d96190001'); +INSERT INTO `cgform_field` VALUES ('8af235d44db32051014db35d96ce000a', '绫诲瀷', 'admin', '2015-06-02 16:22:44', '绠$悊鍛', 'weixin', '', '', '', '', '120', 'type', '', 'N', 'Y', 'Y', 'Y', 'Y', '32', '', '', 'type', '9', '0', 'single', 'list', 'string', 'admin', '2015-06-03 15:18:39', '绠$悊鍛', '8af235d44db32051014db35d96190001'); +INSERT INTO `cgform_field` VALUES ('8af235d44db32051014db35d96de000b', '妯℃澘鍐呭', 'admin', '2015-06-02 16:22:44', '绠$悊鍛', '', '', '', '', '', '300', 'content', '', 'N', 'Y', 'N', 'Y', 'Y', '32', '', '', 'content', '10', '0', 'single', 'textarea', 'Text', 'admin', '2015-06-05 13:31:18', '绠$悊鍛', '8af235d44db32051014db35d96190001'); + +-- ---------------------------- +-- Table structure for `cgform_ftl` +-- ---------------------------- +DROP TABLE IF EXISTS `cgform_ftl`; +CREATE TABLE `cgform_ftl` ( + `ID` varchar(32) NOT NULL, + `CGFORM_ID` varchar(36) NOT NULL, + `CGFORM_NAME` varchar(100) NOT NULL, + `CREATE_BY` varchar(36) default NULL, + `CREATE_DATE` datetime default NULL, + `CREATE_NAME` varchar(32) default NULL, + `FTL_CONTENT` longtext, + `FTL_STATUS` varchar(50) default NULL, + `FTL_VERSION` int(11) NOT NULL, + `FTL_WORD_URL` varchar(200) default NULL, + `UPDATE_BY` varchar(36) default NULL, + `UPDATE_DATE` datetime default NULL, + `UPDATE_NAME` varchar(32) default NULL, + `editor_type` varchar(10) default '01' COMMENT '绫诲瀷', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of cgform_ftl +-- ---------------------------- +INSERT INTO `cgform_ftl` VALUES ('402880e74d90a2f4014d90a5cab30003', '8a8ab0b246dc81120146dc81847e013b', '1212', 'admin', '2015-05-26 22:34:54', '绠$悊鍛', '
', '0', '1', '', null, null, null, null); +INSERT INTO `cgform_ftl` VALUES ('402880e74d934e07014d93506c5a0003', '2c90ac564c9d1734014c9d22b16c0001', 'ue', 'admin', '2015-05-27 11:00:30', '绠$悊鍛', '


绀轰緥琛

#{jform_hidden_field}
鏂囨湰妗涓嬫媺鑿滃崟{|-  -|}
鍗曢{|-鍗曢1 鍗曢2 -|}澶嶉{|-澶嶉1 澶嶉2 澶嶉3 -|}
瀹忔帶浠浜岀淮鐮


', '0', '1', '', null, null, null, '02'); +INSERT INTO `cgform_ftl` VALUES ('402880e74dc1e65e014dc1f0fc1e000b', '402880e74dc1e65e014dc1effa270001', '1221', 'admin', '2015-06-05 12:18:25', '绠$悊鍛', '


绀轰緥琛

#{jform_hidden_field}
鏂囨湰妗涓嬫媺鑿滃崟{|-  -|}
鍗曢{|-鍗曢1 鍗曢2 -|}澶嶉{|-澶嶉1 澶嶉2 澶嶉3 -|}
瀹忔帶浠浜岀淮鐮


', '0', '1', '', null, null, null, '02'); +INSERT INTO `cgform_ftl` VALUES ('402889f3489de53901489de5fe800001', '4028808848844fe2014884587ae60001', '12', 'admin', '2014-09-22 23:06:08', '绠$悊鍛', '\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n12\r\n\r\n', '0', '1', '', null, null, null, '01'); +INSERT INTO `cgform_ftl` VALUES ('402889f3489e434301489e44cc170001', '8a8ab0b246dc81120146dc818484013c', '1', 'admin', '2014-09-23 00:49:41', '绠$悊鍛', '\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n

璇峰亣鍗

\r\n\r\n
#{jform_hidden_field}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n

璇峰亣鏍囬

\r\n
\r\n

#{title}

\r\n
\r\n

璇峰亣寮濮嬫椂闂

\r\n
\r\n

#{begindate}

\r\n
\r\n

璇峰亣浜

\r\n
\r\n

#{people}

\r\n
\r\n

璇峰亣缁撴潫鏃堕棿

\r\n
\r\n

#{enddate}

\r\n
\r\n

鎬у埆

\r\n
\r\n

#{sex}

\r\n
\r\n

鎵灞為儴闂

\r\n
\r\n

#{hol_dept}

\r\n
\r\n

璇峰亣鍘熷洜

\r\n
\r\n

#{hol_reson}

\r\n
\r\n

閮ㄩ棬瀹℃壒浜

\r\n
\r\n

#{dep_leader}

\r\n
\r\n

閮ㄩ棬瀹℃壒鎰忚

\r\n
\r\n

#{content}

\r\n
\r\n\r\n

 

\r\n\r\n\r\n', '0', '1', '', 'admin', '2014-09-23 00:50:56', '绠$悊鍛', '01'); +INSERT INTO `cgform_ftl` VALUES ('402889f3489e434301489e4517400002', '8a8ab0b246dc81120146dc818484013c', '2', 'admin', '2014-09-23 00:50:01', '绠$悊鍛', '\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n

璇峰亣鍗

\r\n\r\n
#{jform_hidden_field}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n

璇峰亣鏍囬

\r\n
\r\n

#{title}

\r\n
\r\n

璇峰亣寮濮嬫椂闂

\r\n
\r\n

#{begindate}

\r\n
\r\n

璇峰亣浜

\r\n
\r\n

#{people}

\r\n
\r\n

璇峰亣缁撴潫鏃堕棿

\r\n
\r\n

#{enddate}

\r\n
\r\n

鎬у埆

\r\n
\r\n

#{sex}

\r\n
\r\n

鎵灞為儴闂

\r\n
\r\n

#{hol_dept}

\r\n
\r\n\r\n

 

\r\n\r\n\r\n', '1', '2', '', 'admin', '2014-11-26 22:53:06', '绠$悊鍛', '01'); +INSERT INTO `cgform_ftl` VALUES ('402889f548bffc650148c0033ed00008', '8a8ab0b246dc81120146dc818484013c', '123', 'admin', '2014-09-29 14:05:11', '绠$悊鍛', '\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n123\r\n
\r\n\r\n\r\n', '0', '3', '', 'admin', '2014-11-26 22:53:04', '绠$悊鍛', '01'); + +-- ---------------------------- +-- Table structure for `cgform_head` +-- ---------------------------- +DROP TABLE IF EXISTS `cgform_head`; +CREATE TABLE `cgform_head` ( + `id` varchar(32) NOT NULL, + `content` varchar(200) NOT NULL, + `create_by` varchar(32) default NULL, + `create_date` datetime default NULL, + `create_name` varchar(32) default NULL, + `is_checkbox` varchar(5) NOT NULL, + `is_dbsynch` varchar(20) NOT NULL, + `is_pagination` varchar(5) NOT NULL, + `is_tree` varchar(5) NOT NULL, + `jform_pk_sequence` varchar(200) default NULL, + `jform_pk_type` varchar(100) default NULL, + `jform_type` int(11) NOT NULL, + `jform_version` varchar(10) NOT NULL, + `querymode` varchar(10) NOT NULL, + `relation_type` int(11) default NULL, + `sub_table_str` longtext, + `tab_order` int(11) default NULL, + `table_name` varchar(50) NOT NULL, + `update_by` varchar(32) default NULL, + `update_date` datetime default NULL, + `update_name` varchar(32) default NULL, + `tree_parentid_fieldname` varchar(50) default NULL, + `tree_id_fieldname` varchar(50) default NULL, + `tree_fieldname` varchar(50) default NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of cgform_head +-- ---------------------------- +INSERT INTO `cgform_head` VALUES ('2c90ac564c9d1734014c9d22b16c0001', '鍥捐〃閰嶇疆', 'admin', '2015-04-09 15:43:58', '绠$悊鍛', 'Y', 'Y', 'Y', 'N', '', 'UUID', '2', '35', 'group', '0', 'jform_graphreport_item', null, 'jform_graphreport_head', 'admin', '2015-04-13 00:40:36', '绠$悊鍛', null, null, null); +INSERT INTO `cgform_head` VALUES ('2c90ac564c9d1734014c9d22b360000b', '鍥捐〃閰嶇疆', 'admin', '2015-04-09 15:43:59', '绠$悊鍛', 'Y', 'Y', 'Y', 'N', '', 'UUID', '3', '9', 'group', '0', null, null, 'jform_graphreport_item', 'admin', '2015-04-13 00:40:36', '绠$悊鍛', null, null, null); +INSERT INTO `cgform_head` VALUES ('402880e74da32ebe014da3309b880001', '绗竴涓爲', 'admin', '2015-05-30 12:59:41', '绠$悊鍛', 'N', 'Y', 'Y', 'Y', '', 'UUID', '1', '4', 'single', '0', null, null, 'onlne_tree', 'admin', '2015-06-01 09:44:11', '绠$悊鍛', 'father_id', 'id', 'name'); +INSERT INTO `cgform_head` VALUES ('402880e74dc1e65e014dc1effa270001', '娴嬭瘯鍗曡〃', 'admin', '2015-06-05 12:17:19', '绠$悊鍛', 'N', 'Y', 'Y', 'N', '', 'UUID', '1', '1', 'single', '0', null, null, 'test_onetable', 'admin', '2015-06-05 12:17:25', '绠$悊鍛', null, 'id', null); +INSERT INTO `cgform_head` VALUES ('402881e84da07286014da07504960001', 't_s_function', 'admin', '2015-05-30 00:15:33', '绠$悊鍛', 'Y', 'Y', 'Y', 'Y', '', 'UUID', '1', '9', 'group', '0', null, null, 't_s_function', 'admin', '2015-05-31 22:53:17', '绠$悊鍛', 'parentfunctionid', 'id', 'functionname'); +INSERT INTO `cgform_head` VALUES ('8a8ab0b246dc81120146dc81847e013b', '璁㈠崟涓讳俊鎭', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', 'N', 'Y', 'Y', 'N', '', 'UUID', '2', '63', 'group', '0', 'jform_order_ticket,jform_order_customer', null, 'jform_order_main', 'admin', '2015-05-27 10:32:34', '绠$悊鍛', null, null, null); +INSERT INTO `cgform_head` VALUES ('8a8ab0b246dc81120146dc818484013c', '璇峰亣鍗', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', 'N', 'Y', 'Y', 'N', null, 'UUID', '1', '57', 'group', '0', null, null, 'jform_leave', '8a8ab0b246dc81120146dc8181950052', '2014-08-21 14:02:44', 'admin', null, null, null); +INSERT INTO `cgform_head` VALUES ('8a8ab0b246dc81120146dc818486013d', '璁㈠崟瀹㈡埛淇℃伅', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', 'Y', 'Y', 'Y', 'N', null, 'UUID', '3', '16', 'single', '0', null, null, 'jform_order_customer', 'admin', '2014-09-23 00:56:05', '绠$悊鍛', null, null, null); +INSERT INTO `cgform_head` VALUES ('8a8ab0b246dc81120146dc818488013e', '璁㈠崟鏈虹エ淇℃伅', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', 'N', 'Y', 'Y', 'N', null, 'UUID', '3', '20', 'single', '0', null, null, 'jform_order_ticket', 'admin', '2014-09-23 00:56:07', '绠$悊鍛', null, null, null); +INSERT INTO `cgform_head` VALUES ('8a8ab0b246dc81120146dc81848b013f', '浠锋牸璁よ瘉鏈烘瀯缁熻琛', 'admin', '2014-06-27 16:46:54', '绠$悊鍛', 'N', 'N', 'Y', 'N', null, 'UUID', '1', '3', 'group', '0', null, null, 'jform_price1', null, null, null, null, null, null); +INSERT INTO `cgform_head` VALUES ('8af235d44db32051014db35d96190001', '寰俊妯℃澘', 'admin', '2015-06-02 16:22:44', '绠$悊鍛', 'N', 'Y', 'Y', 'N', '', 'UUID', '1', '4', 'group', '0', '', null, 'weixin_template', 'admin', '2015-06-05 13:31:18', '绠$悊鍛', '', 'id', ''); + +-- ---------------------------- +-- Table structure for `cgform_uploadfiles` +-- ---------------------------- +DROP TABLE IF EXISTS `cgform_uploadfiles`; +CREATE TABLE `cgform_uploadfiles` ( + `CGFORM_FIELD` varchar(100) NOT NULL, + `CGFORM_ID` varchar(36) NOT NULL, + `CGFORM_NAME` varchar(100) NOT NULL, + `id` varchar(32) NOT NULL, + PRIMARY KEY (`id`), + KEY `FK_qwig8sn3okhvh4wye8nn8gdeg` (`id`), + CONSTRAINT `FK_qwig8sn3okhvh4wye8nn8gdeg` FOREIGN KEY (`id`) REFERENCES `t_s_attachment` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of cgform_uploadfiles +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `ck_editor` +-- ---------------------------- +DROP TABLE IF EXISTS `ck_editor`; +CREATE TABLE `ck_editor` ( + `ID` varchar(32) NOT NULL, + `CONTENTS` blob, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of ck_editor +-- ---------------------------- +INSERT INTO `ck_editor` VALUES ('8a8ab0b246dc81120146dc81847a013a', 0x3C68746D6C3E3C686561643E3C7469746C653E3C2F7469746C653E3C6C696E6B20687265663D27706C75672D696E2F6561737975692F7468656D65732F64656661756C742F6561737975692E637373272069643D276561737975695468656D65272072656C3D277374796C6573686565742720747970653D27746578742F63737327202F3E3C6C696E6B20687265663D27706C75672D696E2F6561737975692F7468656D65732F69636F6E2E637373272072656C3D277374796C6573686565742720747970653D27746578742F63737327202F3E3C6C696E6B20687265663D27706C75672D696E2F6163636F7264696F6E2F6373732F6163636F7264696F6E2E637373272072656C3D277374796C6573686565742720747970653D27746578742F63737327202F3E3C6C696E6B20687265663D27706C75672D696E2F56616C6964666F726D2F6373732F7374796C652E637373272072656C3D277374796C6573686565742720747970653D27746578742F63737327202F3E3C6C696E6B20687265663D27706C75672D696E2F56616C6964666F726D2F6373732F7461626C6566726F6D2E637373272072656C3D277374796C6573686565742720747970653D27746578742F63737327202F3E3C7374796C6520747970653D27746578742F637373273E626F64797B666F6E742D73697A653A313270783B7D7461626C65207B626F726465723A31707820736F6C696420233030303030303B626F726465722D636F6C6C617073653A20636F6C6C617073653B7D7464207B626F726465723A31707820736F6C696420233030303030303B6261636B67726F756E643A77686974653B666F6E742D73697A653A313270783B666F6E742D66616D696C793A20E696B0E5AE8BE4BD933B636F6C6F723A20233333333B3C2F7374796C653E3C2F686561643E3C626F64793E3C6469763E3C703EE99984E4BBB632EFBC9A3C2F703E3C6831207374796C653D27746578742D616C69676E3A63656E746572273E3C7370616E207374796C653D27666F6E742D73697A653A32347078273E3C7374726F6E673EE4BBB7E6A0BCE8AEA4E8AF81E4BABAE59198E7BB9FE8AEA1E8A1A83C2F7374726F6E673E3C2F7370616E3E3C2F68313E3C703EE5A1ABE68AA5E58D95E4BD8DEFBC88E79B96E7ABA0EFBC89EFBC9A3C696E707574206E616D653D276F72675F6E616D652720747970653D2774657874272076616C75653D27247B6F72675F6E616D653F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C703EE58D95E4BD8DE4BBA3E7A081E58FB7EFBC9A3C696E707574206E616D653D276E756D2720747970653D2774657874272076616C75653D27247B6E756D3F69665F6578697374733F68746D6C7D27202F3E20266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703BE58D95E4BD8DEFBC9AE4BABAE5A1AB266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B20E68AA5E697A5E69C9FEFBC9A266E6273703B266E6273703B266E6273703B266E6273703B266E6273703B20E5B9B4266E6273703B266E6273703B20E69C88266E6273703B266E6273703B20E697A53C2F703E3C666F726D20616374696F6E3D276367466F726D4275696C64436F6E74726F6C6C65722E646F3F736176654F72557064617465272069643D27666F726D6F626A27206D6574686F643D27706F737427206E616D653D27666F726D6F626A273E3C696E707574206E616D653D277461626C654E616D652720747970653D2768696464656E272076616C75653D27247B7461626C654E616D653F69665F6578697374733F68746D6C7D27202F3E203C696E707574206E616D653D2769642720747970653D2768696464656E272076616C75653D27247B69643F69665F6578697374733F68746D6C7D27202F3E237B6A666F726D5F68696464656E5F6669656C647D3C696E70757420747970653D2768696464656E27202F3E3C703E266E6273703B3C2F703E3C7461626C6520626F726465723D2731272063656C6C70616464696E673D2730272063656C6C73706163696E673D273027207374796C653D2777696474683A313031367078273E3C74626F64793E3C74723E3C746420726F777370616E3D2734273E3C703E266E6273703B3C2F703E3C703E266E6273703B3C2F703E3C703EE59088E8AEA13C2F703E3C703E266E6273703B3C2F703E3C2F74643E3C746420636F6C7370616E3D27362720726F777370616E3D2732273E3C703E266E6273703B3C2F703E3C703EE4BABAE695B03C2F703E3C2F74643E3C746420636F6C7370616E3D27352720726F777370616E3D2732273E3C703E266E6273703B3C2F703E3C703EE5ADA6E58E863C2F703E3C2F74643E3C746420636F6C7370616E3D27342720726F777370616E3D2732273E3C703E266E6273703B3C2F703E3C703EE58F96E5BE97E79A84EFBC88E4B88AE5B297EFBC89E689A7E4B89AE8B584E6A0BC3C2F703E3C2F74643E3C746420636F6C7370616E3D2734273E3C703EE4B893E4B89AE68A80E69CAFE8818CE7A7B03C2F703E3C2F74643E3C2F74723E3C74723E3C746420636F6C7370616E3D2734273E3C703EEFBC88E7BB8FE6B58EE7B3BBE58897E38081E5B7A5E7A88BE7B3BBE58897EFBC893C2F703E3C2F74643E3C2F74723E3C74723E3C746420636F6C7370616E3D2733273E3C703EE59CA8E7BC96E4BABAE591983C2F703E3C2F74643E3C746420636F6C7370616E3D2732273E3C703EE88198E794A8E4BABAE591983C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE4B8B4E697B628E5809FE794A829E4BABAE591983C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE9AB98E4B8AD3C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE5A4A7E4B8933C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE69CACE7A7913C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE7A094E7A9B6E7949F3C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE585B6E5AE833C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE4BBB7E6A0BC3C2F703E3C703EE989B4E8AF81E591983C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE4BBB7E6A0BC3C2F703E3C703EE989B4E8AF81E5B8883C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE5A48DE6A0B83C2F703E3C703EE8A381E5AE9AE591983C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE585B6E5AE833C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE5889DE7BAA73C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE4B8ADE7BAA73C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE9AB98E7BAA73C2F703E3C2F74643E3C746420726F777370616E3D2732273E3C703EE585B6E5AE833C2F703E3C2F74643E3C2F74723E3C74723E3C74643E3C703EE69CACE58D95E4BD8D3C2F703E3C2F74643E3C746420636F6C7370616E3D2732273E3C703EE585B6E5AE833C2F703E3C2F74643E3C74643E3C703EE995BFE69C9F3C2F703E3C2F74643E3C74643E3C703EE79FADE69C9F3C2F703E3C2F74643E3C2F74723E3C74723E3C74643E3C703E41313C2F703E3C2F74643E3C74643E3C703E42313C2F703E3C2F74643E3C74643E3C703E42323C2F703E3C2F74643E3C746420636F6C7370616E3D2732273E3C703E42333C2F703E3C2F74643E3C74643E3C703E42343C2F703E3C2F74643E3C74643E3C703E42353C2F703E3C2F74643E3C74643E3C703E43313C2F703E3C2F74643E3C74643E3C703E43323C2F703E3C2F74643E3C74643E3C703E43333C2F703E3C2F74643E3C74643E3C703E43343C2F703E3C2F74643E3C74643E3C703E43353C2F703E3C2F74643E3C74643E3C703E44313C2F703E3C2F74643E3C74643E3C703E44323C2F703E3C2F74643E3C74643E3C703E44333C2F703E3C2F74643E3C74643E3C703E44343C2F703E3C2F74643E3C74643E3C703E45313C2F703E3C2F74643E3C74643E3C703E45323C2F703E3C2F74643E3C74643E3C703E45333C2F703E3C2F74643E3C74643E3C703E45343C2F703E3C2F74643E3C2F74723E3C74723E3C74643E3C703E3C696E707574206E616D653D276131272073697A653D27342720747970653D2774657874272076616C75653D27247B61313F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276231272073697A653D27342720747970653D2774657874272076616C75653D27247B62313F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276232272073697A653D27342720747970653D2774657874272076616C75653D27247B62323F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C746420636F6C7370616E3D2732273E3C703E3C696E707574206E616D653D276233272073697A653D27342720747970653D2774657874272076616C75653D27247B62333F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276234272073697A653D27342720747970653D2774657874272076616C75653D27247B62343F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276235272073697A653D27342720747970653D2774657874272076616C75653D27247B62353F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276331272073697A653D27342720747970653D2774657874272076616C75653D27247B63313F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276332272073697A653D27342720747970653D2774657874272076616C75653D27247B63323F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276333272073697A653D27342720747970653D2774657874272076616C75653D27247B63333F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276334272073697A653D27342720747970653D2774657874272076616C75653D27247B63343F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276335272073697A653D27342720747970653D2774657874272076616C75653D27247B63353F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276431272073697A653D27342720747970653D2774657874272076616C75653D27247B64313F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276432272073697A653D27342720747970653D2774657874272076616C75653D27247B64323F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276433272073697A653D27342720747970653D2774657874272076616C75653D27247B64333F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276434272073697A653D27342720747970653D2774657874272076616C75653D27247B64343F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276531272073697A653D27342720747970653D2774657874272076616C75653D27247B65313F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276532272073697A653D27342720747970653D2774657874272076616C75653D27247B65323F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276533272073697A653D27342720747970653D2774657874272076616C75653D27247B65333F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C74643E3C703E3C696E707574206E616D653D276534272073697A653D27342720747970653D2774657874272076616C75653D27247B65343F69665F6578697374733F68746D6C7D27202F3E3C2F703E3C2F74643E3C2F74723E3C74723E3C746420636F6C7370616E3D273230273E3C703E266E6273703B3C2F703E3C703EE5A1ABE68AA5E8AFB4E6988EEFBC9A3C2F703E3C703EE4B880E38081E59088E8AEA1EFBC8841EFBC89EFBC9AE5A1ABE68AA5E887B3E7BB9FE8AEA1E688AAE6ADA2E69C9FE79A84E69CACE69CBAE69E84E79A84E4BABAE59198E680BBE695B0E380823C2F703E3C703EE4BA8CE38081E4BABAE695B0EFBC9A3C2F703E3C703EE59CA8E7BC96E4BABAE59198EFBC9AE58886E588ABE68C89E785A7E4BBB7E6A0BCE8AEA4E8AF81E69CBAE69E84E7BC96E588B6E58685E58F8AE585B6E5AE83E585B7E69C89E4BBB7E6A0BCE4B8BBE7AEA1E983A8E997A8E7BC96E588B6E79A84E5AE9EE69C89E4BABAE695B0E5A1ABE68AA5E59CA84231E380814232E6A08FE58685E380823C2F703E3C703EE88198E794A8E4BABAE59198EFBC9AE68C89E785A7E7BB8FE4BBB7E6A0BCE4B8BBE7AEA1E983A8E997A8E68896E4BBB7E6A0BCE8AEA4E8AF81E69CBAE69E84E4BABAE4BA8BE983A8E997A8E8AEA4E58FAFE79A84E5B9B6E7ADBEE8AEA2E4B889E5B9B4E4BBA5E4B88AE79A84E5B7A5E4BD9CE59088E5908CE79A84E4BABAE59198EFBC884233EFBC89EFBC9BE4BBA5E58F8AE6B2A1E69C89E7BB8FE8BF87E4BBB7E6A0BCE4B8BBE7AEA1E983A8E997A8E68896E4BBB7E6A0BCE8AEA4E8AF81E69CBAE69E84E4BABAE4BA8BE983A8E997A8E8AEA4E58FAFE79A84E7ADBEE8AEA2E59088E5908CE5B091E4BA8EE4B889E5B9B4E79A84E4BABAE59198EFBC884234EFBC89E58886E588ABE69DA5E8BF9BE8A18CE7BB9FE8AEA1E380823C2F703E3C703EE4B8B4E697B6EFBC88E5809FE794A8EFBC89E4BABAE59198EFBC884235EFBC89EFBC9AE789B9E68C87E5A496E88198E79A84E4B8B4E697B6E5B7A5EFBC8CE68896E88085E5B7A5E4BD9CE585B3E7B3BBE4B88DE59CA8E69CACE58D95E4BD8DE4B894E697A0E995BFE69C9FE88198E794A8E59088E5908CE79A84E5809FE8B083E4BABAE59198E7AD89E380823C2F703E3C703EE4B889E38081E8A1A8E58685E59084E6A08FE79BAEE585B3E7B3BB3C2F703E3C703E413D42312B42322B42332B42342B42353D43312B43322B43332B43342B43353D44312B44322B44332B44343D45312B45322B45332B45343C2F703E3C2F74643E3C2F74723E3C2F74626F64793E3C2F7461626C653E3C2F666F726D3E3C2F6469763E3C2F626F64793E3C2F68746D6C3E); + +-- ---------------------------- +-- Table structure for `ck_finder` +-- ---------------------------- +DROP TABLE IF EXISTS `ck_finder`; +CREATE TABLE `ck_finder` ( + `ID` varchar(32) NOT NULL, + `ATTACHMENT` varchar(255) default NULL, + `IMAGE` varchar(255) default NULL, + `REMARK` longtext, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of ck_finder +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `doc` +-- ---------------------------- +DROP TABLE IF EXISTS `doc`; +CREATE TABLE `doc` ( + `ID` int(11) NOT NULL auto_increment, + `DOCCONTENT` longblob, + `DOCDATE` datetime default NULL, + `DOCID` varchar(255) default NULL, + `DOCTITLE` varchar(255) default NULL, + `DOCTYPE` varchar(255) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of doc +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `jeecg_demo` +-- ---------------------------- +DROP TABLE IF EXISTS `jeecg_demo`; +CREATE TABLE `jeecg_demo` ( + `ID` varchar(32) NOT NULL, + `AGE` int(11) default NULL, + `BIRTHDAY` datetime default NULL, + `content` varchar(255) default NULL, + `create_date` datetime default NULL, + `DEP_ID` varchar(255) default NULL, + `EMAIL` varchar(255) default NULL, + `MOBILE_PHONE` varchar(255) default NULL, + `OFFICE_PHONE` varchar(255) default NULL, + `SALARY` decimal(19,2) default NULL, + `SEX` varchar(255) default NULL, + `status` varchar(255) default NULL, + `USER_NAME` varchar(255) NOT NULL, + `CREATE_TIME` datetime default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jeecg_demo +-- ---------------------------- +INSERT INTO `jeecg_demo` VALUES ('402880884884734201488474b3d00001', null, null, null, '2014-09-18 00:31:53', '402880e447e99cf10147e9a03b320003', '', '', '', null, '', '0', 'dsafsd', null); +INSERT INTO `jeecg_demo` VALUES ('8a8ab0b246dc81120146dc81860f016f', '12', '2014-02-14 00:00:00', null, null, '123', 'demo@jeecg.com', '13111111111', '66666666', '111111.00', '1', null, '灏忔槑', null); + +-- ---------------------------- +-- Table structure for `jeecg_demo_course` +-- ---------------------------- +DROP TABLE IF EXISTS `jeecg_demo_course`; +CREATE TABLE `jeecg_demo_course` ( + `ID` varchar(32) NOT NULL, + `NAME` varchar(25) default NULL, + `teacher_ID` varchar(32) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_g3jn8mfod69i7jfv5gnrcvgbx` (`teacher_ID`), + CONSTRAINT `FK_g3jn8mfod69i7jfv5gnrcvgbx` FOREIGN KEY (`teacher_ID`) REFERENCES `jeecg_demo_teacher` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jeecg_demo_course +-- ---------------------------- +INSERT INTO `jeecg_demo_course` VALUES ('8a8ab0b246dc81120146dc818512016c', '娴疯醇鐜', '8a8ab0b246dc81120146dc81850f016b'); + +-- ---------------------------- +-- Table structure for `jeecg_demo_student` +-- ---------------------------- +DROP TABLE IF EXISTS `jeecg_demo_student`; +CREATE TABLE `jeecg_demo_student` ( + `ID` varchar(32) NOT NULL, + `BIRTHDAY` datetime default NULL, + `NAME` varchar(32) default NULL, + `SEX` varchar(1) default NULL, + `COURSE_ID` varchar(32) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_r86q81koyocgod3cx6529hbpw` (`COURSE_ID`), + CONSTRAINT `FK_r86q81koyocgod3cx6529hbpw` FOREIGN KEY (`COURSE_ID`) REFERENCES `jeecg_demo_course` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jeecg_demo_student +-- ---------------------------- +INSERT INTO `jeecg_demo_student` VALUES ('402881824c741dbd014c742bc8860001', null, '浣犲ソ', '0', '8a8ab0b246dc81120146dc818512016c'); +INSERT INTO `jeecg_demo_student` VALUES ('8a8ab0b246dc81120146dc818516016d', null, '鍗撴礇', '0', '8a8ab0b246dc81120146dc818512016c'); +INSERT INTO `jeecg_demo_student` VALUES ('8a8ab0b246dc81120146dc818519016e', null, '灞辨不 ', '0', '8a8ab0b246dc81120146dc818512016c'); + +-- ---------------------------- +-- Table structure for `jeecg_demo_teacher` +-- ---------------------------- +DROP TABLE IF EXISTS `jeecg_demo_teacher`; +CREATE TABLE `jeecg_demo_teacher` ( + `ID` varchar(32) NOT NULL, + `NAME` varchar(12) default NULL, + `pic` varchar(255) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jeecg_demo_teacher +-- ---------------------------- +INSERT INTO `jeecg_demo_teacher` VALUES ('8a8ab0b246dc81120146dc81850f016b', '璺', null); + +-- ---------------------------- +-- Table structure for `jeecg_matter_bom` +-- ---------------------------- +DROP TABLE IF EXISTS `jeecg_matter_bom`; +CREATE TABLE `jeecg_matter_bom` ( + `ID` varchar(32) NOT NULL, + `address` varchar(255) default NULL, + `code` varchar(50) NOT NULL, + `name` varchar(50) NOT NULL, + `price` decimal(21,6) NOT NULL, + `productionDate` datetime default NULL, + `quantity` int(11) NOT NULL, + `stock` int(11) NOT NULL, + `unit` varchar(50) default NULL, + `weight` varchar(50) default NULL, + `parent_ID` varchar(32) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_fldfyrevj0li4hej5b2gu2q7w` (`parent_ID`), + CONSTRAINT `FK_fldfyrevj0li4hej5b2gu2q7w` FOREIGN KEY (`parent_ID`) REFERENCES `jeecg_matter_bom` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jeecg_matter_bom +-- ---------------------------- +INSERT INTO `jeecg_matter_bom` VALUES ('8a8ab0b246dc81120146dc8186230174', '骞夸笢娣卞湷', '001', '鐢佃剳', '5000.000000', '2014-06-27 16:46:54', '5', '10', '鍙', '100', null); +INSERT INTO `jeecg_matter_bom` VALUES ('8a8ab0b246dc81120146dc8186260175', '涓婃捣', '001001', '涓绘澘', '800.000000', '2014-06-27 04:46:54', '6', '18', '涓', '60', '8a8ab0b246dc81120146dc8186230174'); + +-- ---------------------------- +-- Table structure for `jeecg_minidao` +-- ---------------------------- +DROP TABLE IF EXISTS `jeecg_minidao`; +CREATE TABLE `jeecg_minidao` ( + `ID` varchar(32) NOT NULL, + `AGE` int(11) default NULL, + `BIRTHDAY` datetime default NULL, + `CONTENT` varchar(255) default NULL, + `CREATE_TIME` datetime default NULL, + `DEP_ID` varchar(255) default NULL, + `EMAIL` varchar(255) default NULL, + `MOBILE_PHONE` varchar(255) default NULL, + `OFFICE_PHONE` varchar(255) default NULL, + `SALARY` decimal(19,2) default NULL, + `SEX` int(11) default NULL, + `STATUS` varchar(255) default NULL, + `USER_NAME` varchar(255) NOT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jeecg_minidao +-- ---------------------------- +INSERT INTO `jeecg_minidao` VALUES ('402880e74d75abd1014d75ac82410002', null, null, null, '2015-05-21 16:52:29', '402880e447e99cf10147e9a03b320003', '', '12', '12', null, null, '0', '12'); + +-- ---------------------------- +-- Table structure for `jeecg_order_custom` +-- ---------------------------- +DROP TABLE IF EXISTS `jeecg_order_custom`; +CREATE TABLE `jeecg_order_custom` ( + `ID` varchar(32) NOT NULL, + `CREATE_DT` datetime default NULL, + `CRTUSER` varchar(12) default NULL, + `CRTUSER_NAME` varchar(10) default NULL, + `DEL_DT` datetime default NULL, + `DELFLAG` int(11) default NULL, + `GO_ORDER_CODE` varchar(12) NOT NULL, + `GOC_BUSS_CONTENT` varchar(33) default NULL, + `GOC_CONTENT` varchar(66) default NULL, + `GOC_CUS_NAME` varchar(16) default NULL, + `GOC_IDCARD` varchar(18) default NULL, + `GOC_PASSPORT_CODE` varchar(10) default NULL, + `GOC_SEX` varchar(255) default NULL, + `MODIFIER` varchar(12) default NULL, + `MODIFIER_NAME` varchar(10) default NULL, + `MODIFY_DT` datetime default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jeecg_order_custom +-- ---------------------------- +INSERT INTO `jeecg_order_custom` VALUES ('8a8ab0b246dc81120146dc81861f0173', null, null, null, null, null, '11111AAA', null, null, '灏忔槑', null, null, '1', null, null, null); + +-- ---------------------------- +-- Table structure for `jeecg_order_main` +-- ---------------------------- +DROP TABLE IF EXISTS `jeecg_order_main`; +CREATE TABLE `jeecg_order_main` ( + `ID` varchar(32) NOT NULL, + `CREATE_DT` datetime default NULL, + `CRTUSER` varchar(12) default NULL, + `CRTUSER_NAME` varchar(10) default NULL, + `DEL_DT` datetime default NULL, + `DELFLAG` int(11) default NULL, + `GO_ALL_PRICE` decimal(10,2) default NULL, + `GO_CONTACT_NAME` varchar(16) default NULL, + `GO_CONTENT` varchar(66) default NULL, + `GO_ORDER_CODE` varchar(12) NOT NULL, + `GO_ORDER_COUNT` int(11) default NULL, + `GO_RETURN_PRICE` decimal(10,2) default NULL, + `GO_TELPHONE` varchar(11) default NULL, + `GODER_TYPE` varchar(255) default NULL, + `MODIFIER` varchar(12) default NULL, + `MODIFIER_NAME` varchar(10) default NULL, + `MODIFY_DT` datetime default NULL, + `USERTYPE` varchar(255) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jeecg_order_main +-- ---------------------------- +INSERT INTO `jeecg_order_main` VALUES ('8a8ab0b246dc81120146dc8186160171', null, null, null, null, null, '1111111.00', 'alex', '鍒斁杈f', '11111AAA', '1', '100.00', null, '1', null, null, null, '1'); + +-- ---------------------------- +-- Table structure for `jeecg_order_product` +-- ---------------------------- +DROP TABLE IF EXISTS `jeecg_order_product`; +CREATE TABLE `jeecg_order_product` ( + `ID` varchar(32) NOT NULL, + `CREATE_DT` datetime default NULL, + `CRTUSER` varchar(12) default NULL, + `CRTUSER_NAME` varchar(10) default NULL, + `DEL_DT` datetime default NULL, + `DELFLAG` int(11) default NULL, + `GO_ORDER_CODE` varchar(12) NOT NULL, + `GOP_CONTENT` varchar(66) default NULL, + `GOP_COUNT` int(11) default NULL, + `GOP_ONE_PRICE` decimal(10,2) default NULL, + `GOP_PRODUCT_NAME` varchar(33) default NULL, + `GOP_PRODUCT_TYPE` varchar(1) NOT NULL, + `GOP_SUM_PRICE` decimal(10,2) default NULL, + `MODIFIER` varchar(12) default NULL, + `MODIFIER_NAME` varchar(10) default NULL, + `MODIFY_DT` datetime default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jeecg_order_product +-- ---------------------------- +INSERT INTO `jeecg_order_product` VALUES ('8a8ab0b246dc81120146dc81861c0172', null, null, null, null, null, '11111AAA', null, '1', '100.00', '鏈鏈缇庡懗鐨勫湴閿呴浮', '1', '100.00', null, null, null); + +-- ---------------------------- +-- Table structure for `jform_cgreport_head` +-- ---------------------------- +DROP TABLE IF EXISTS `jform_cgreport_head`; +CREATE TABLE `jform_cgreport_head` ( + `ID` varchar(36) NOT NULL, + `CGR_SQL` longtext NOT NULL, + `CODE` varchar(36) NOT NULL, + `CONTENT` longtext NOT NULL, + `NAME` varchar(100) NOT NULL, + `update_name` varchar(32) default NULL COMMENT '淇敼浜', + `update_date` datetime default NULL COMMENT '淇敼鏃堕棿', + `update_by` varchar(32) default NULL COMMENT '淇敼浜篿d', + `create_name` varchar(32) default NULL COMMENT '鍒涘缓浜', + `create_date` datetime default NULL COMMENT '鍒涘缓鏃堕棿', + `create_by` varchar(32) default NULL COMMENT '鍒涘缓浜篿d', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jform_cgreport_head +-- ---------------------------- +INSERT INTO `jform_cgreport_head` VALUES ('402880e74d76e784014d76f9e783001e', 'select username account , realname from t_s_base_user', 'user_msg', '鐢ㄦ埛POP', '鐢ㄦ埛POP', '绠$悊鍛', '2015-05-28 20:37:25', 'admin', null, null, null); + +-- ---------------------------- +-- Table structure for `jform_cgreport_item` +-- ---------------------------- +DROP TABLE IF EXISTS `jform_cgreport_item`; +CREATE TABLE `jform_cgreport_item` ( + `ID` varchar(36) NOT NULL, + `S_FLAG` varchar(2) default NULL, + `S_MODE` varchar(10) default NULL, + `CGRHEAD_ID` varchar(36) default NULL, + `DICT_CODE` varchar(36) default NULL, + `FIELD_HREF` varchar(120) default NULL, + `FIELD_NAME` varchar(36) default NULL, + `FIELD_TXT` longtext, + `FIELD_TYPE` varchar(10) default NULL, + `IS_SHOW` varchar(5) default NULL, + `ORDER_NUM` int(11) default NULL, + `REPLACE_VA` varchar(36) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jform_cgreport_item +-- ---------------------------- +INSERT INTO `jform_cgreport_item` VALUES ('402880e74d76e784014d76f9e787001f', '', '', '402880e74d76e784014d76f9e783001e', '', '', 'account', 'account', 'String', 'Y', '0', ''); +INSERT INTO `jform_cgreport_item` VALUES ('402880e74d76e784014d76f9e78b0020', '', '', '402880e74d76e784014d76f9e783001e', '', '', 'realname', 'realname', 'String', 'Y', '1', ''); + +-- ---------------------------- +-- Table structure for `jform_graphreport_head` +-- ---------------------------- +DROP TABLE IF EXISTS `jform_graphreport_head`; +CREATE TABLE `jform_graphreport_head` ( + `id` varchar(36) NOT NULL COMMENT 'id', + `cgr_sql` text NOT NULL COMMENT '鏌ヨ鏁版嵁SQL', + `code` varchar(36) NOT NULL COMMENT '缂栫爜', + `content` varchar(1000) NOT NULL COMMENT '鎻忚堪', + `name` varchar(100) NOT NULL COMMENT '鍚嶇О', + `ytext` varchar(100) NOT NULL COMMENT 'y杞存枃瀛', + `categories` varchar(1000) NOT NULL COMMENT 'x杞存暟鎹', + `is_show_list` varchar(5) default NULL COMMENT '鏄惁鏄剧ず鏄庣粏', + `x_page_js` text COMMENT '鎵╁睍JS', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jform_graphreport_head +-- ---------------------------- +INSERT INTO `jform_graphreport_head` VALUES ('402881e64ca71152014ca71152480000', 'select a.userid, count(*) ct, sum(case when right(logcontent, 4) in (\'鐧诲綍鎴愬姛\', \'cess\') then 1 else 0 end) \'login_count\' from t_s_log a where {operatetime} group by a.userid order by ct desc', 'yhcztj', '鐢ㄦ埛鎿嶄綔缁熻', '鐢ㄦ埛鎿嶄綔缁熻', '鎿嶄綔娆℃暟', 'userid', 'Y', 'function getTotalRows(totalRows) {\r\n return [\'ct\', \'login_count\'];\r\n}'); + +-- ---------------------------- +-- Table structure for `jform_graphreport_item` +-- ---------------------------- +DROP TABLE IF EXISTS `jform_graphreport_item`; +CREATE TABLE `jform_graphreport_item` ( + `id` varchar(36) NOT NULL COMMENT 'id', + `search_flag` varchar(2) default NULL COMMENT '鏄惁鏌ヨ', + `search_mode` varchar(10) default NULL COMMENT '鏌ヨ妯″紡', + `cgreport_head_id` varchar(36) default NULL COMMENT 'cgreportHeadId', + `dict_code` varchar(500) default NULL COMMENT '瀛楀吀Code', + `field_href` varchar(120) default NULL COMMENT '瀛楁href', + `field_name` varchar(36) default NULL COMMENT '瀛楁鍚', + `field_txt` varchar(1000) default NULL COMMENT '瀛楁鏂囨湰', + `field_type` varchar(10) default NULL COMMENT '瀛楁绫诲瀷', + `is_show` varchar(5) default NULL COMMENT '鏄惁鏄剧ず', + `order_num` int(11) default NULL COMMENT '鎺掑簭', + `replace_va` varchar(36) default NULL COMMENT '鍙栧艰〃杈惧紡', + `is_graph` varchar(5) default NULL COMMENT '鏄剧ず鍥捐〃', + `graph_type` varchar(50) default NULL COMMENT '鍥捐〃绫诲瀷', + `graph_name` varchar(100) default NULL COMMENT '鍥捐〃鍚嶇О', + `tab_name` varchar(50) default NULL COMMENT '鏍囩鍚嶇О', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='jform_graphreport_item'; + +-- ---------------------------- +-- Records of jform_graphreport_item +-- ---------------------------- +INSERT INTO `jform_graphreport_item` VALUES ('402881e44cd2a0c2014cd2a0c29d0000', 'Y', 'single', '402881e64ca71152014ca71152480000', null, '', 'ct', '鎿嶄綔娆℃暟', 'Integer', 'Y', '1', '}}}}}}}}', 'Y', 'column', '鎿嶄綔娆℃暟', '鏌辩姸鍥'); +INSERT INTO `jform_graphreport_item` VALUES ('402881e44cd2a0c2014cd2af45210001', 'N', 'single', '402881e64ca71152014ca71152480000', null, '', 'ct', '鎿嶄綔娆℃暟', 'Integer', 'N', '5', '}}', 'Y', 'spline', '鎿嶄綔娆℃暟', '鏇茬嚎鍥'); +INSERT INTO `jform_graphreport_item` VALUES ('402881e44cd2a0c2014cd2af45550002', 'Y', 'single', '402881e64ca71152014ca71152480000', null, '', 'login_count', '鐧诲綍娆℃暟', 'Integer', 'N', '6', '}}', 'Y', 'spline', '鐧诲綍娆℃暟', '鏇茬嚎鍥'); +INSERT INTO `jform_graphreport_item` VALUES ('402881e64ca71152014ca711527c0001', 'Y', 'single', '402881e64ca71152014ca71152480000', 'select id \'key\', realname \'value\' from t_s_base_user', '', 'userid', '鐢ㄦ埛', 'String', 'Y', '0', '}}}}}}}}}}}}}}}}}}}}}}}}', 'N', 'spline', '鐢ㄦ埛', null); +INSERT INTO `jform_graphreport_item` VALUES ('402881e64ca71152014ca71152a90002', 'N', 'group', '402881e64ca71152014ca71152480000', null, '', 'login_count', '鐧诲綍娆℃暟', 'Integer', 'Y', '2', '}}}}}}}}}}}}}}}}}}}}}}}}', 'Y', 'column', '鐧诲綍娆℃暟', '鏌辩姸鍥'); +INSERT INTO `jform_graphreport_item` VALUES ('402881e64ca7adc7014ca7adc75a0000', 'Y', 'group', '402881e64ca71152014ca71152480000', null, '', 'operatetime', '鎿嶄綔鏃ユ湡', 'Date', 'N', '3', '}}}}}}}}}}}}}}', 'N', 'spline', null, null); + +-- ---------------------------- +-- Table structure for `jform_leave` +-- ---------------------------- +DROP TABLE IF EXISTS `jform_leave`; +CREATE TABLE `jform_leave` ( + `id` varchar(36) NOT NULL, + `title` varchar(50) NOT NULL COMMENT '璇峰亣鏍囬', + `people` varchar(20) NOT NULL COMMENT '璇峰亣浜', + `sex` varchar(10) NOT NULL COMMENT '鎬у埆', + `begindate` datetime NOT NULL COMMENT '璇峰亣寮濮嬫椂闂', + `enddate` datetime NOT NULL COMMENT '璇峰亣缁撴潫鏃堕棿', + `day_num` int(11) default NULL COMMENT '璇峰亣澶╂暟', + `hol_dept` varchar(32) NOT NULL COMMENT '鎵灞為儴闂', + `hol_reson` varchar(255) NOT NULL COMMENT '璇峰亣鍘熷洜', + `dep_leader` varchar(20) NOT NULL COMMENT '閮ㄩ棬瀹℃壒浜', + `content` varchar(255) NOT NULL COMMENT '閮ㄩ棬瀹℃壒鎰忚', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jform_leave +-- ---------------------------- +INSERT INTO `jform_leave` VALUES ('402889f3489e1df901489e1e02ad0001', '12', '12', '0', '2014-09-26 00:00:00', '2014-09-26 00:07:00', null, '402880e447e99cf10147e9a03b320003', '12', '12', '12'); +INSERT INTO `jform_leave` VALUES ('402889f3489e4a5d01489e4a5da20000', '12', '12', '0', '2014-09-12 00:00:00', '2014-10-11 00:55:42', null, '402880e447e99cf10147e9a03b320003', '12', '12', '12'); +INSERT INTO `jform_leave` VALUES ('402889f3489e4a5d01489e4bba1b0005', '122222', '鏉庡洓', '0', '2014-10-04 00:00:00', '2014-09-23 00:57:12', '12', '402880e447e99cf10147e9a03b320003', '12', '12', '12'); +INSERT INTO `jform_leave` VALUES ('402889fb486e894201486e8942180000', '12', '12', '0', '2014-09-19 00:00:00', '2014-09-13 18:22:36', null, '402880e447e99cf10147e9a03b320003', '12', '12', '12'); + +-- ---------------------------- +-- Table structure for `jform_order_customer` +-- ---------------------------- +DROP TABLE IF EXISTS `jform_order_customer`; +CREATE TABLE `jform_order_customer` ( + `id` varchar(36) NOT NULL, + `name` varchar(32) default NULL COMMENT '瀹㈡埛鍚', + `money` double default NULL COMMENT '鍗曚环', + `sex` varchar(4) default NULL COMMENT '鎬у埆', + `telphone` varchar(32) default NULL COMMENT '鐢佃瘽', + `fk_id` varchar(36) NOT NULL COMMENT '澶栭敭', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jform_order_customer +-- ---------------------------- +INSERT INTO `jform_order_customer` VALUES ('402880e74da39b13014da39d6e620004', '12', '12', null, '12', '402880e74da39b13014da39d6e5b0001'); +INSERT INTO `jform_order_customer` VALUES ('402880e74da39b13014da39d6e640005', '2', '2', '0', '2', '402880e74da39b13014da39d6e5b0001'); +INSERT INTO `jform_order_customer` VALUES ('402889f3489e4a5d01489e4af0410002', '2', '2', '2', '2', '402889f3489e4a5d01489e4af0170001'); + +-- ---------------------------- +-- Table structure for `jform_order_main` +-- ---------------------------- +DROP TABLE IF EXISTS `jform_order_main`; +CREATE TABLE `jform_order_main` ( + `id` varchar(36) NOT NULL, + `order_code` varchar(50) default NULL COMMENT '璁㈠崟鍙', + `order_date` datetime default NULL COMMENT '璁㈠崟鏃ユ湡', + `order_money` double default NULL COMMENT '璁㈠崟閲戦', + `content` varchar(255) default NULL COMMENT '澶囨敞', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jform_order_main +-- ---------------------------- +INSERT INTO `jform_order_main` VALUES ('402880e74da39b13014da39d6e5b0001', 'scott', '2015-04-28 00:00:00', null, null); +INSERT INTO `jform_order_main` VALUES ('402889f3489e4a5d01489e4af0170001', '12', '2014-09-08 00:00:00', '12', '12'); + +-- ---------------------------- +-- Table structure for `jform_order_ticket` +-- ---------------------------- +DROP TABLE IF EXISTS `jform_order_ticket`; +CREATE TABLE `jform_order_ticket` ( + `id` varchar(36) NOT NULL, + `ticket_code` varchar(100) NOT NULL COMMENT '鑸彮鍙', + `tickect_date` datetime NOT NULL COMMENT '鑸彮鏃堕棿', + `fck_id` varchar(36) NOT NULL COMMENT '澶栭敭', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jform_order_ticket +-- ---------------------------- +INSERT INTO `jform_order_ticket` VALUES ('402880e74da39b13014da39d6e5f0002', '12', '2015-04-29 14:58:19', '402880e74da39b13014da39d6e5b0001'); +INSERT INTO `jform_order_ticket` VALUES ('402880e74da39b13014da39d6e610003', '3', '2015-04-08 14:58:30', '402880e74da39b13014da39d6e5b0001'); +INSERT INTO `jform_order_ticket` VALUES ('402889f3489e4a5d01489e4af06b0003', '2', '2014-09-26 00:56:19', '402889f3489e4a5d01489e4af0170001'); +INSERT INTO `jform_order_ticket` VALUES ('402889f3489e4a5d01489e4af08d0004', '12', '2014-09-16 00:56:15', '402889f3489e4a5d01489e4af0170001'); + +-- ---------------------------- +-- Table structure for `jg_person` +-- ---------------------------- +DROP TABLE IF EXISTS `jg_person`; +CREATE TABLE `jg_person` ( + `ID` varchar(32) NOT NULL, + `AGE` int(11) default NULL, + `BIRTHDAY` datetime default NULL, + `CREATEDT` datetime default NULL, + `NAME` varchar(255) NOT NULL, + `SALARY` decimal(19,2) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jg_person +-- ---------------------------- +INSERT INTO `jg_person` VALUES ('8a8ab0b246dc81120146dc8186130170', '10', '2014-06-27 00:00:00', '2014-06-27 04:46:54', '灏忕孩00000', '1000.00'); + +-- ---------------------------- +-- Table structure for `onlne_tree` +-- ---------------------------- +DROP TABLE IF EXISTS `onlne_tree`; +CREATE TABLE `onlne_tree` ( + `id` varchar(36) NOT NULL COMMENT '涓婚敭', + `create_name` varchar(50) default NULL COMMENT '鍒涘缓浜哄悕绉', + `create_by` varchar(50) default NULL COMMENT '鍒涘缓浜虹櫥褰曞悕绉', + `create_date` datetime default NULL COMMENT '鍒涘缓鏃ユ湡', + `update_name` varchar(50) default NULL COMMENT '鏇存柊浜哄悕绉', + `update_by` varchar(50) default NULL COMMENT '鏇存柊浜虹櫥褰曞悕绉', + `update_date` datetime default NULL COMMENT '鏇存柊鏃ユ湡', + `name` varchar(32) default NULL COMMENT '鐗╂枡缂栫爜', + `father_id` varchar(32) default 'null' COMMENT '鐖禝D', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of onlne_tree +-- ---------------------------- +INSERT INTO `onlne_tree` VALUES ('402880e74dacca74014dacca74f60000', '绠$悊鍛', 'admin', '2015-06-01 00:00:00', null, null, null, '11111', null); +INSERT INTO `onlne_tree` VALUES ('402880e74dacca74014daccb5e070001', '绠$悊鍛', 'admin', '2015-06-01 00:00:00', null, null, null, '222', '402880e74dacca74014dacca74f60000'); +INSERT INTO `onlne_tree` VALUES ('402880e74dacca74014dacce80c70002', '绠$悊鍛', 'admin', '2015-06-01 00:00:00', null, null, null, '333333', '402880e74dacca74014dacca74f60000'); + +-- ---------------------------- +-- Table structure for `optimistic_locking` +-- ---------------------------- +DROP TABLE IF EXISTS `optimistic_locking`; +CREATE TABLE `optimistic_locking` ( + `ID` varchar(32) NOT NULL, + `ACCOUNT` int(11) default NULL, + `AGE` int(11) default NULL, + `NAME` varchar(85) default NULL, + `VER` int(11) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of optimistic_locking +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `t_finance` +-- ---------------------------- +DROP TABLE IF EXISTS `t_finance`; +CREATE TABLE `t_finance` ( + `ID` varchar(32) NOT NULL, + `APPROFILETYPE` varchar(255) default NULL, + `BUYMONEY` float default NULL, + `BUYPROJECTNO` varchar(255) default NULL, + `BUYPROJECTORG` varchar(255) default NULL, + `BUYUSE` varchar(255) default NULL, + `BUYYEAR` varchar(255) default NULL, + `CATEGORY` varchar(255) default NULL, + `COLLECTORG` varchar(255) default NULL, + `EXPENSEACCOUNT` varchar(255) default NULL, + `HAPPENYEAR` int(11) default NULL, + `MONEYAREA` varchar(255) default NULL, + `MONEYSOURCE` varchar(255) default NULL, + `MONEYTOTAL` float default NULL, + `MONEYUSE` varchar(255) default NULL, + `PAYTIME` datetime default NULL, + `ZBWNO` varchar(255) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_finance +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `t_finance_files` +-- ---------------------------- +DROP TABLE IF EXISTS `t_finance_files`; +CREATE TABLE `t_finance_files` ( + `id` varchar(32) NOT NULL, + `financeId` varchar(32) default NULL, + PRIMARY KEY (`id`), + KEY `FK_ij2p74feypwcda4n0n96pyd10` (`financeId`), + KEY `FK_28m7vvi0cy5r5keke68b6f7rt` (`id`), + CONSTRAINT `FK_28m7vvi0cy5r5keke68b6f7rt` FOREIGN KEY (`id`) REFERENCES `t_s_attachment` (`ID`), + CONSTRAINT `FK_ij2p74feypwcda4n0n96pyd10` FOREIGN KEY (`financeId`) REFERENCES `t_finance` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_finance_files +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `t_s_attachment` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_attachment`; +CREATE TABLE `t_s_attachment` ( + `ID` varchar(32) NOT NULL, + `attachmentcontent` longblob, + `attachmenttitle` varchar(100) default NULL, + `businesskey` varchar(32) default NULL, + `createdate` datetime default NULL, + `extend` varchar(32) default NULL, + `note` longtext, + `realpath` varchar(100) default NULL, + `subclassname` longtext, + `swfpath` longtext, + `BUSENTITYNAME` varchar(100) default NULL, + `INFOTYPEID` varchar(32) default NULL, + `USERID` varchar(32) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_mnq23hlc835n4ufgjl7nkn3bd` (`USERID`), + CONSTRAINT `FK_mnq23hlc835n4ufgjl7nkn3bd` FOREIGN KEY (`USERID`) REFERENCES `t_s_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_attachment +-- ---------------------------- +INSERT INTO `t_s_attachment` VALUES ('402880e74c282787014c282aed370001', 0x504B030414000600080000002100E3E429E6120200009C0B0000130008025B436F6E74656E745F54797065735D2E786D6C20A2040228A000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C456C18ED33014BC23F10F91AF2871774108A1A67B80E5082B510457D77E6922623BB25F77B77FCF4BBC0DB0EDC6E986884BA5AAF5CC7866DE4B9657F7BA4E6EC1F9CA9A9C5D640B9680915655669BB36FEB4FE93B9678144689DA1AC8D91E3CBB5ABD7CB15CEF1BF0099D363E672562F39E732F4BD0C267B60143BF14D66981F4D56D7923E44FB1057EB958BCE5D21A048329B6186CB5FC42025CA520B9110E3F0B4D3CFCCE3AC50B6BD158049F111C4B3E84732D75CE44D3D4951448C2F9AD518F48535B14950465E54E1355D6C235CE4AF09EAEA6EBAC877ED542F3D322E4CEA3D53F74CD2B047DE36CE32F264BE9415B3C7058813F68F80885D8D5985CDF933F211207B53FEFE60F566774B273C7975533C4306CED803B5D44BDC3C330CF48A847D6A23207879EAC8AD9E90D38CA76723E4755E9A1A3223CEEEB39CA1A70A3F460D44CD372408E4A68C70ADC9B7F1F42001EE2A7BE7413CA69334CE687760215A89496C6A3217DB28221A5EF1596D7450192365F7C26B44FDBBE654767876EDA0D9E0744AAFB1892BFF77174351E90A31242269723AE79A68278D89D05E16FAFFF077F5FB6B0CD274B0830E7B42D5C7EFAE3E868DD8D341FE9590FBCFB9C2EA28389F6AD04A1C0CDD0B7003C927F86BE8DE42FE8FD672D36354CAEDB89D01FA0A326DCC1E6EB6CABE70FF0A89060DAF4EE1D79114FE3F7F45BF78C300E6F68924E9F1879DEBD5BAF7E010000FFFF0300504B03041400060008000000210099557E0504010000E10200000B0008025F72656C732F2E72656C7320A2040228A000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC92CF4AC34010C6EF82EFB0CCBD99B48A8834E94584DE44E2030CBBD32498FDC3EE54DBB7772D88066AD283C79DF9E69BDF7CEC7A73B0837AE7987AEF2A5816252876DA9BDEB515BC364F8B7B5049C8191ABCE30A8E9C60535F5FAD5F7820C943A9EB4352D9C5A50A3A91F0809874C79652E103BBDCD9F96849F233B61848BF51CBB82ACB3B8CBF3DA01E79AAADA9206ECD0DA8E618F2E6796FBFDBF59A1FBDDE5B76726605F241D819368B10335B943E5FA31A8A2D4B05C6EBE75C4E482114191BF03CD1EA72A2BFAF45CB42868450FBC8D33C5F8A29A0E5E540F3118D153FE97CF868304774CA768AE6F63F69F43E89B733F19C34DF4838FA98F527000000FFFF0300504B03041400060008000000210090AEA9F3A60100005C0900001C000801776F72642F5F72656C732F646F63756D656E742E786D6C2E72656C7320A2040128A0000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC56C14EC3300CBD23F10F55EE34CB363640EB7601A45D6108AE59EAB4154D52251EB0BF27DBB4AE83122EB954B2A3FABD3E3F3B9D2DBE549D7C807595D11961E98024A085C92B5D64E465F578754312875CE7BC361A32B2054716F3CB8BD913D41CFD4BAEAC1A97F82ADA65A4446CEE2875A204C55D6A1AD0FE441AAB38FAD016B4E1E29D17408783C184DA6E0D323FAB992CF38CD865EEF157DBC623FF5FDB485909B83762A340630F042D81E7607D456E0B405F731FB3D49324B41F9F8D621290C66097C0211E850844C577B8AD7D075B010E71087E1AF3F341E7DA0BD02170CC8428B0614C0EFD1E08B680FD2582AA8435CE484C8551F4E0BF9DEFA6E7D6A607995F2B2C1FA404811D017E1D8594882A84DEA835583FE8273BB4A910093689D90EF4AB024E0CF621DD3FC363199383D83834EACD2F817630D294B6595A21A8209BA88AEC76C28F296953C1BEB0989AF46FAA6188C0754CFC4F583F03A2B76767583AC91011169589341A577C5D775CDAA6822CFC5D1AEFEAEAEF47D095E398F8EE57338E999006B73129F46FEEA02559540DFA7B303E0A40CFFE89E6DF000000FFFF0300504B0304140006000800000021002FF90A018A370100D934150011000000776F72642F646F63756D656E742E786D6CEC575D6ED340107E47E20E96DF1DE74F945A75AA2821120855552807D8D8EB7AA977D7DA5DC74D0E80840A4F7DE50CDCA0B7697B0E666DAF1B105449559404F9C523CFECFCEEF89BF1D1F1254DAC39169270E6DB9D56DBB6300B7848D8B96F7F3C9B38AF6D4B2AC4429470867D7B81A57D3C78F9E228F7421E64143365810926BD394863A552CF756510638A648BA7988130E2822205AFE2DCA5485C64A913709A22456624216AE176DBED57766586FB762698579970280904973C525AC5E35144025C11A321D6F15B6A8EAB900B8FAEC009C4C0998C492A8D35FA546B90626C8CCC1F4B624E13732E4FD7F1160A94C37DD0A40C3BE7224C050FB094C01D97C2DA62A7FD98EFAA80DA44ADB14E08BFFA34915044586D4677C76FF75F5F5E0B2ECF2D7DBBDAD44322508B01F4D28C870B4D532BF7A017C3A96FB7DB9DF1C1610FFAAF628D7184B244AD480A8D53A1494E429E8F38538227A03047099CB35D2D92290AA050C04D880EB2DB87262F5FA659020C94295E1E252C0449448454EFE1EC2846426A3BABCCDAAE283D8B0978957002C98010DF3E23144BEB04E7D6945304F5C9BD78C8E41F244574B3F2399205BDC0828142117EB70A7F6918FDBEE18CB4BFE290E125A8C81023A9869220DF5EC6CEE8443B9F91107C23E17C186A7517AAA903079A1ADA543EF79ACA373DDFA08D27770A6D0E27BD37E35E31210AB0DA0ACE7F0A0CD806B0ED605182F05FD0FFEEC7D5EDCDF50AE8578C4DB1FEA046FF07AC37BC27633D40BF86FA0D4387EC63C260EE9AE1521660B6FEE03281CBE53324937B6AF00EE3FCD2199EBEBDBFFE767BF3FDFECBD5DDE7AF7AA4A972C095E36DDFC6DAFFD3687AB968AABFC64AF7AC5FC63EAF744DEF57FBF85646DC8613612786D93E624C53E7ADFE9AEFF472D6F473BDF29A7D7B17A6E33FF805F9090000FFFFEC7D5B73DB56B2EE5F51E961EA9C5D150F2F1225798E5447919DC4198FB7CAF6DEF332552E8A84248C29521B8022C74F721CDBB21D5B4AE2BBE5EBD889277124E7D8B16559971F1302A49EF2174EF75A00088000098204058A3DA91A591449006BF5E5EB5E5F77FF79E4FFCC1F14F3D99EF98393A2242B47C5BC30369D96E4E1DE58AFF545FC9DBDF99F1978F98B746EB83723E41541E2AF4AE3127E93F44921AFC8F086B49C11C5E15E75F56A71EB7BFCA2E9D1BC5C79817DD304FFFF3199FD3C2D4879E39B13FC4BE5B3C60B7D83C62B63F8EDECF2C66BB9747E0A5E13D2B2322A8BE9E1DEB3D31F8D1DC36B4E8859B8645AFAE8C4287EFCCF707F789BF07356BF5D76CF8DDD3A7CEFB49857867B8D0BF23B9BD8A387993FA88C7C7EF8F0D8A7EAE682B6B15C7AB6AD7EB3818FA8F007E68F8BCF390B772EC962F6386C652C7E68602839888BC45E3A244CA6E772F050E65FD827F8CACC8BD9C2FC186CAC54C8C107D8E2EBC220CFA633225BFE1C08CE706FA28F490DFE727C2E072FA4E794025FA02E153214365AFDBD52F106577FE893E4E143C95E927D32B0A6B7404B9A88C5FBD5F76F92DACA62C79B560F4F7D529C11E49E63C27CCFF1C24C3A6F71D9CEBF7047D780BBEBE30E403E6BF1DDFA6B817D77838A6D7777E3E8E7AA75DDE1A1867BFB067537A7AF997EB74C3938C87045151385C2E999B474FA8492961470986216C113FC239F9E019778EA6421D3174FA6060752833AD071FB44DCFE8978223E94D2A186CBF7271CEFEE1F1A644B1CDD750AE3CE9C70241573C011E14C3AA3B8E291E1DEA1942E943511EE844DF01B42A8EE72337F501632CAB864403107069B16D259413A2E4C0A9290CF08F02EE5CB599022E10B01945462C2251DC9EAF8D8EBDD598EEF2C1F18E2AB3059280086AFFBF5715D11BCDE5EFDFDF138BF80D71DB168C3723F715D15BCAE50F5FE24FFFED9A9131825CC0FF7C6E343B114AAC134FC3B3508E8966DD5ECD4DFD2B8B84A61165EEFE3005512A7A601EDC6078606F01313054529CC54FE9C13262D7FE58F80EFE621115B325DA5A7E614583FFC45BFD8B1B99993B041F0A532AA3F7C8AFF2553C861E482120ABB3790D03FA0884A4E189F621FCE16329F4A2286627C8B1145CB787BF88F7151C9C08325F93A81F270A9A944330DEA936EFEE0DB3100F0B0889DA84FB80ED5D1DD44EBD5360701E771210FDA2964C7D353C2C792903ECD2EA38C94EEAFAA5B379BC10AFD870612034C386BECCFEC09E5CB1CCA1A332D86922AE90919212CFC34FEC4E49D89123327C3BDD98282BFCE1620D01FAC0895F1D1BAAE305F18970A8549785C586F6754AD0BD5F171548C98FE24784793B92C2617E0EFFABF5055867B278429318F6A82DF85EFC37798A1AAC5518B7959914E0A67949E333339439766254116A42F84DE919E93FF39D6F38F424F6FFCA3646FCF3FA67BFE71B6E71F733DF8B5E6275D2EE2F7366561362DA515C17AA7D3F00012E8E769B8E3743E335D804746079F4C81B786D7A6455929485FA219A8F5604E50E69661A85E72D8E291E2FAC2EF0BE7D4471BA5270BDAF5E7EAD2BF6C52E7BD96FA255DBF358DEA626E06BB71AE526EEF6E76536BDC88B96B1EFB3D3EFAE9E1E3873FE93156DC73AB833D82DB86DB4433964CA6927D7C67BD174819493AF724D8FD80B1A9C81E6C8F297C6CB31A493304B02E091D7D1A26A269EBC29D2C626CB40746F2B11A7557CB1C3CBA6EE2CD1570A81F8265068943D7BFB8736BE14EDC4C57700D07F52E5F7FA72EDD0AFD4AE94C4690E5534AE1B4906FEC62D57BC4DC4FE75911263864467CE68AF7BD19E9EB1F6C8F1B4F34A66FE6398B7FA0609A11757BB5B8F3445BB9A65E79A2DE7D11FA858F8C877E0975E595FA60A1B1CBEC1F9385424A268B4C160B3CE2C904E4B1DA11795481DA30904F71FD4A71F37171FD6A796B4B7D764FFDE93B384FD66E5D2A7E78DBA5EACE3698D43DB8BA430E70F4F080F590CF9E466953A0539B65E11914FB887D5289143BD90F3DF6296E7C03A802B20EDA8DB7DADB45EDDC5A97EA6402973CAA3AD9E7DC9408261FF6BD4E02D966A82D5EB9B87E19F3814BDFEE826676B54EE292934E06F79396BCBB9E6DDB133FD99A84607F2CD91EFD6B4B3E505D7D8AF1FBFAB2BAF4AEB4FAA4B47CD169E36B63F17D13FBE2B6928E938EF3D07730DE9EC8B72DC9BADD9FEF94367E2C6D3F035FDED5077B71D8D6A8EAF880D3EE46105BEF2B3F9E8CF50FB447C9DB92DED25E3CD11EEC709CDED54ACEF635AA5A3EB40FB43C2AE420AF13FBC1642ABC9336A0D0B9170959F84B48A651EFDF87E0B974E385B6D8DDB81A7723AADA188FED03756C5392B935C17322D52E365B5BA267AEDFEAE2C5D287AFBB3A7A66FB4A6AEEB73272DFB35D06070719E338F483A3B604D0E5D5EDD2D6AAAEECCF2E69AF5FA8CBD79CAEA34BF26409DCDAC86A7A953850140D8895D5A084438F4DC6F5E2EFD035BD2D5134A7C7EA9AFE68435B798904B7464FA30370EAFED77FE5C542FEC8A1C6AC4A800B692B1BEA62838C970097F9DF8D3DC8BE394660FA40E69180102FDE492407A1B9483B387455DC8CDA7824804A9BB45F23EAB95D7ED220E777DFA839DB5752735273BD083F31D0DF162DEF6FCCADB640CB575E0127A0B8750D02A0C6AEBD6F74BD0F3637B2AA5E858A29E00937E0E98F0FB5C7A1A71A53B760AA5EDAFA76F7C96FDAF545EDC1F9D6C43EFB46ED71A349ED43F4F0513F474CF527C2E307F83D472C6EDC40DC7DE92775F55EF1FDE5F2D28A7AED66571F35E0B6905E86A8979D75A0988C411F9B7604D86D39507428BABA785FFDB0D1D5749E046E30E93BE9BB9E504B0D0E42479E36B4C3A93A4A0A25A16677ECDAA3E7E5B5A7DDADEFB8C191D5F7AA2C2B85DBE186DBF1C1A1FEF6A4D6AA32296DD07775F1F1EEDD675DADEF6C8349DFC9BF73FF1EEF1F4886A7EF7EA3EE2A33DF125BE0F7EA10F0879EFB73041AC58DABD00743BBFE026A7D1BBBF6BEC9F731C9234314A2218A7CC26F301E5E68E157F9D50BBF80FE53416E2605BB41EA18A23A76549E2F1E4F0CEDA33C5FE9C6236D71595DFF415DFA4ABBF9AA74EF6BE88053FAF0A6F4B86BDD2F6E30E93BE9BB9EE78B25F6539E6FF7E6CEEEF7DB10E897B75E961EFDC2FFDDD5717F023738B2FA5EC5B3EAC03C5FD4E1763C160FB100DF2FDE2EAE9F07BC0D3E58BBB65AFAF0A8BCFAA4ABD5926D0AA925B9613D1D07738FF615ECC67A7CA8D7D51E2E7395EF6E65C7DD25652765D7953D168FB5A7B55D5BCED6D5FBDBD0DE99945D9F6A039E3D16D90E77F12AB6730702EE8E4AA8C1A4AE81F0B2DD38F1898F31721959D492C334EB1510C0B306B5A4ECC6082BDCDDC87AF6FDD005ABA3943D91186853362D9C9373A7B2B3E974A4ECBAB2B3DD8DAAB227AAB05E077AF6A8A7D292B1213E8D3660178EB49C11C5E15E75F52ACC4461ECDAD1BC6C7F41CCC3045A0106958ECA621A6707C2106A7372A7DF649B7AE1673CDC6663A33E3FF1D189437FED52B209DBB0C8AA6C15159254B6F57325FB869A2A2F6B97CA16DF3F3055567DB5A46EDCEEEA945902B78D149752663C65968AF705C898551CA715D8365860E6FE25A8AB372FAADF9FE335A25DADABB839A4AA7E55357E68406FE5E67B4C3C0CAC6640B0C5839C8752C107398342D1F4EACAF0F844DFE0407CFF94CBA91BDFABBFDC21D39661FB1A59DB46C9FC1116D7A627648C9CC47C1652DE6176E18C433FB2F07ADE5B414A55681846327FF7ABD5F29BF730D1A2747991943DC37637B2CA4E836BDAACEC302034D91E656F4B321FD2F866F7FCAE0E57D8BE4656CD079D99DA0ECC0976D4995DB22F3CE29DDF7C7D150DBA25DEDEEFD52197E114BADAD7774F8994DFFCA83D7C4B382203121555F3928C39779ACC4BC821C3402AC4823ABF2A5E1529D656709F4D2EFD5EBD6103E3F3FAD680A9BCFAD4ECD8D7D5F0268E021759FB53957C27FB13AEFD490CC59BA22C4CD724245835B02A406D898DB15E010F5DAE3C2A9FDFEA6A05673B1A5905AF4A5C75A082479D86042CC3A60A08DAC56950AF9D4395653424F5DA137571BDBB1517B78D14D7EF41E97E1FDE974CC4FAD9016C4032A17FCF5C05BA42F1CCAC872EA97986ED2BA939A9B9DE61231962F5BD151D5711C043D172EEC6AFDCD46E609B0D75E95FCE8452EDABBAA60ED313FA546F86158301C609614ACC234D0697847D45E33722E665453A299C517ACECCE40ECAB3E98C30DC3B2B09B2207D21F48EF48C8F7E7AF8B8510C00DB1A5925AFCA27075B53219FADAC28ACAB39099EAD32F17F2AFC9F782C950AEF18C1AAE555F1556D310F904943C8CEB5FCF1FAEE8D85AED672B6AF9155F3AAAC2EA979B8C9B4782A156F0FCDAF3D9400A6E674629761FB4A6A4E909D43F66422D5D71EE64F15500BC39B972EBFD756AF804F2F3D7FD1D5DE9CED6B64D5BCEAFC84BC79C8DE3C3E98DC473326CBABDB303C56FBED6A79ED261F1D5DBABBA52E5F8363F12E8DD1E3B8C1A4EF21BAF5A89F94C5FBE34D8DB968E34959717DC13C2CD3EE6E74FB2937DB39D2DD2ED6DD642239B4F78361E10C1B5AC68366827B559F5DE2FC93E287ABA50FD7BAD4ABB27D21CDEC62CDEC1F1808508DEF3315ED97548A8AB97E195DE6B37BEAEA536DE51AD7CD2ED54ADC1352CA1095B2A38A5AE2A97878D3DDACC751EDA196BCBAC8FB4EC2540775E95B75F195A9F35DAAEDB8BFA4EDA4ED7A43E9647CB03DEADE1E8E09F3E6FC58AA5BF51B7794149C145CE7900D0CB58729DA1E768901D88B9BF7CA6B0FB4EB3FAA8B6FBB54D113B0B351D5F3BE987353E8442AEC1329E091B5A58D545BF825E5EBEFD4A55B3C382F9FBBA23EFB7779F595BAD5BDC751B0BBA4ECE4D475D43ED4CF1BF0855EFFD1169689D357B49CC9323E16FA25D0542DBE2BFDBC668E6DD796BE6303DBBB98E91E473925B315A2D98AFC297A6A201E1E2C6920E1AFDEBF0F09FFE2C6B72CDBFF447DFF5A5D7AD59855D837052871DC1452CB10D5B2A332FE90301A684F0EB02D297F18175BBA7CDFD4F42ED571B6A9A4E32DD571DE2576529464E5A8988702BFBEC1186FAFAD4F52C362C4F983136332FB994BE7A700CA7E91CE0DF79E9DFE68EC1886E7C67C16E325BDEC1027B1C1E1D82C9FC8C6AB10F9BFBDBFCDF251987D91CB8E4DA725B882FEAF935FCEC21D3AEBF01AA9BCD3DB8DE323E9F7E5B2008910160017825DD51A08D89B9F1F3F244CA6E77230F02616A3FBC4813F35048AD6D31875D81A05A5F5A4F5C4090CC72DD6C730556497FC3BBA06F568E893E4E1436C20AAEFF117719B77D21DB22F173C51289C9E494BA74F28694981CD15B3C3BDECDAF9F40CF8D553270B99646A28A57FBFE574A32657ADFE1D60482B2BC7C16F0B92901D4F4F091F4B42FA340314CA88CEF47EB4517AE25E5D6DDCF661D6D01E6F5A4728D57F48E2BD07DB020B24983DA17C9913608118CC493038805FAA8317975564C4DCCA2AF6C593A9C1016898CD97D2B84FEBBAB3E0A4F289447C082AE6D98A18EFAE3CAEB1E3FE7604EED41C825B159C34FE15C8F5650717CEA0A3F1AF4A6732822C9F520AA785BCE3DBAA1F5A1FF252FD87FEE07BAC1BB471B471BAE659B6DD0509DAA1707D49AF488915EE36AD3ECA887AE16571F3B6BA0427486BC50FCF8B5B3B50D3E458C3165F727476F6C8A1702FA17EF74DB8178067382164244109F732E557E7B1C46CE525AF27D51E3C6F4665FC66006BA8538B45E18FCDFBB6050C66613B57FBF4FDBDF55E7B7DF38FCD7BDDBC161EBD807A0AD2D4817F0AC2FC9903E959F1C0FC9989B42CC00F66EB0FD816CC6848A4A7053E29E4151944C3AD7FDB047788F6DC430DA8337F5019F97CFE24FA97D1F12307A6046594B91CF68AED26BA4E82776EA8F71FAA0B9BB65568602BEAFB3E5CFC83B6AFEFB245F6528D138A2841D66C746CECF08913A74EFEE75F0F1FEBE6651A5197BED26EBE2AAFBDD1EE5C775A53C834BAC06B76DA5601CB06BC6610D11032652287580E7E70C302FFF83B9895F9E15E985BC3F0B9C2B287D933FA1C6978C3111651C05BE23156F95EFD8E8F0B12042D6C9E96529885EF6321812CE6A77202A63EE5B3903165FFE0EDD1182F3153C815A4E1DEF49C52E0901E877005FDEC4441510A33413F2D8953D3812F0D0DE0C4ACF059D06BF38FFF77B08FC3B6C20659977F227734FD65610E9F86EFD3A47846601DD9D85B8F82DC18978AF58D32E4CEBFC494874F25318B3232053FC70A3978376EFD506280EF92FDE5448A051A8E7727077838E87839DE07BD4B79E809776D5C47C1D4B54752E52408882D08518CA04DFA4CB06E5A7288DD1E3E8AF18E0C13F48CFE5C195DCCD983988B638AB93C9D3596259313D2120AAB5540E1D7493107E9FCC329FC8F2FC517A339712A6F7E4EC82B82643C9F7E5D54068F67B326B27D2538E6C56C617E0C8080C47685E9981E7AF1A08C4FB14BF4F16E537006010A88470332AA2EE702F317877BF14D0C36FC33537DFF70CB0ED8A197B49F146704B9E79830DF73BC3093CEE3224DF361F4CEBF7048620326A705C95C2B3D8897CF8E21A8E10904FD513C5C28BC6D42CCC2D8FBB4F4D189517D95D96DA269D36F1777BCE95BC78772E95F3FD1968701F9D52D3F34E170F17F28E0BA60BB8B372A243C81C3469378F7664CF56C818C9078B31568585751BCB53B6BEAF20FEACE85DD271F024838F32D24E164C03D7DCF9E1B706D69A9BC63A798A1936239F7DAD61B0112C936C9767465BBF46CA3B87DD5DB6E3304CEA0890482EC017DDB06EBA383D0B13138C07158931C231025F88025FCE5F85C0ECE152B71B01DCC5B71BB2798D7B1B33F309F8178602C9D13272491C700F590B97EC8D4B0B7AF83CCABEE83055CB0423CB289E1FF1ABAC16988082122AB84F2F3D3A222F0AF68F8E611AAA46767C5ACB7AC57B0B833C87447E1248DDEF199BA7AB5B8F5BD25A2D45F6038738F04345823B7B06E56C7CE01C4D10332933892384222A809FB587AF912DA2969B7DEF3D6A1EA8D35A0A9A8977E29AF9D0B20A62C3DE844BF2CE1C1CDABCF5C9A9D2EEAC162A8914B6BB3A786CCF534DF82A63357BE6C65B369365B244368CF3D1FDB6619AA95DBAA425961F9A7FD80F6E42A168C4DDC09F0B99F2534147ED44155BE8C5850A7554746EBDC1AF826B79381B0148A001FE611C28E86EBEC398923E88C8E4C94911A804F5DBBB8FBDDF33F36BF51AFBDB6813FF8B8DBB99C9B267904E9B007D69B80A85CAEA62BFA34D46E1956F8A8D2D8792D61CC508F726D7B89BB0312843F3879C5671C504D5D7663AC5B0D8C9E5E6319377E96CEFE6996FD59FF6EBEA8F3ECF1967998E246CD19C0C446859A93E8EB1F6CAC8000BEDE54C2AA7E7AFED4CBFA15265D9DCF59D62BE3EF06E44A5BBFF9C87830E5B77E87BAF24A7DB0E0F81E63592B847F7D05ABFF6050411A2925AC9616EE78CC7DAEB5F9E6E6781830D8FC60E485E04652FDE12BEDE14A8510FF68A3B8715D5DBDAC5E7851FAE57279E17CF9EEB760AC775716CA3F60E942E9D1739005C79A376BB8BD9F1BB14D71E7892978A57B5FB7F5DA41C5D493755EFB51B944AB8BB7CB4F5EC0AA636DC2F64E79E77EF9C937A5FBEBEA85D7BB7797A19F1D7A4F56B9B0BB70AFBC73A9BCF69C53E59127BF7DBB25BA1AF001F670BD7E5FF8CA261A6029BA4AB16B4B56EB49F7E84DDCABBE751398E45C32D3320EF70E24F40850F751130C353BEAD79D8C74EFE7C21DAEC1E86AC0287A5F030D90071B1F27F78A19419C3D6093BB06706C93CF8FF7F6F9FC097E1B47667592BEF9FB5151B657EA904658D1433924127F6D596A05A7BF059AB78700A4F6FAA0D0FE29A7FCE58422C131F89FA694BFF4E464C594699BA6913C5BE5B9562180B1527A64043FF493E80AAD3FCE89060E4228BCF308D1FA6B55237409AD1F7AC03367EDA0F50FE8C195ED6528D7767D771C462EF11C0D88D55ED1FA79337B87984783F76CB1EBAD3C77340158EDD0D41F29484F833A79FC60D489E1DFDBCA72050477DCA40765F8836EC2B690A457BA7105397F224937E2B37AE75741190328E9CD92FDD1E390B063F199D97A8E84DDC323A1AFDAD3C2ADE0BC7F445024E624E67E4A2BF75CCC235B02E0EA2B5ACE72ED20341F4552B5958FE621CAD1AB0330FBA3B8E4A9200753BBA82BE10AD8492ED1E3E9AE9CC8FE8EA2761D3B07103796A4A9C612246E246E20151E34041437932BE0F32CBE730DB94B6F459E48AF6BCADD703AFB50900A85A80089BA15087B0A236C3B836BDDE95C30D643A9C20533DA34E9997583CD64ED82CAE6A6573E114F26A05513CBDAFB24E8C0B299ECB1A4CDA7F83ED4B67E058E5359BF52DC7C5C5CBF5ADEDAC2B9CA3F7D07D57BDAAD4B30F7C8F1FDC60355785B83FCDEABFF30A49F2210BDC3DC2DD328AB2B2F783B53BD79E66D46165A7BEF587CD89ACA2B6F17B5736B60CD799B4D6823CAC922C0FFD2BEBF56DC5A01BA11E4E738D7C8B16B3E052B209B6846C88AE9538ED25ADFA218F0A2D86F9433AEEE7D0D9C22FED8663752A45E39BAC73211D7166FB94A397C4371EB6279ED9DF6FA85F6F5122EE5DA5271FDA7CAEA3365F8637371FFAFEC1F9B97612A2B4A285B329041BD1E70E9DB5D904798BCBEBD6A25FBB5754502DABB804206E32AD5E5EB3809EECA0B75F1F1EEDD67201940F72B5FF9AAB472CEA43B967FFB5ADB580E9BD9563DA624B2F4102E394466635EBDE15D42F8EE416663A6766F896C7F436B8F24B6B9D95C219D65BFDA4C00877840FA8300C5A363884BB33C0B7C7650B53B48EE89AC563D18C93B4C4541690731F4EF67FE8B896ACFBCFE0F1257D43683B8E0DE94D6558BED8D2DF74A8B8D5BAB41934B40C7D2EAAC19D1E4604DB0981D1A14B15A286B4F54E6ABBA9A26978CEB5D541D3439DEE6D6D9FD16CF01882667F878CBB824BB916843C70E934D41CC39115AEAFAA742C1E6ED25C5A2D680A4A63875A8C8D5D63F1AEC515D61482D98BFA196D1CEFED788CB9AA6D9EDC7BEA30D37E121B7C087CC34CC05DF63B700F21FB8E3AE3B39832C3F6CA9A90E7A8B83F983544AE00695F694734A643C232514D9D21A2B5182619848F1DBEAE4D4AC37EF61E623F5388886F8C83F1C67E692B783E7AD4DD7738F05883F45FC2990FF1AFC29C0E001C42D997285DE246E246EB5C5CD642B105DCF34E87AF1BB39EBCB0DDC33FBBFAFE97A6E18B5C694AEB0CAFF0C60813F79FB36185C85ABCFB845ED9EFA46B521C608592BA223386A1940A7732A5B3E45022BB503208338015173243C3569554665313DDC7B76FAA3B163088D08881A63631DE49F161EE9ED29EFDD830E5B47133C42F47A3E3E683F6D8CB6ADDCEFD2AF1FD48757914BBB78515DFC595BB9ACDEDF2E5DBEE493066B754D1E4F12B9648338939EB29BF78ED939E0ED6223D8B55F761FBDDEC73BF44501BAF9D91C70A7EDD08F17779F42B7565F54F24ED4A12F608076A16377080A2B4A9BFF2EDD7C0EB66E1F6F92323D3733D1B19B64BB715B485AC90753FAA03136108B1EEB418BA0DD83287DE035EC7D6F790D56FF42E98336A40F26C59C702C3D238CA795E920568CD208944648B3C9B3FE3B70635C47E7593027D73E0024181186D2087EB256BC0210AB95596D24AF252FDD5F55B76E06B17A74F43393CE5BCE509D87427B86DDF004A8C9393E0D65FCF452FA866B2A0DFCE9912B70A3C1377C0D34B3BCBA9C2A5F9940065AC10EA87CCD16E6F354F70AAAA487D82354F71ACDBAD743F3853C166943E5ABF14F17EFDB95A5DA4DCE6148C4199674B4EDA6025338E7A102D3F810F0539807B45592C6F592514725693235A0F75072BE9B95A37284E57F0E43A22FD537DADFCB2ABC0D032D7D268853D30A6CCE17E9DC706F72C898A9A718EF00320F664E9D39537C10F89443CCA3574F617968BDA54064F9E30D97E330419AE0FF3F26B39F6167693D5072C3B7EE71EADB9E874138DE5419A95BD009E66D1ADC29D7A34C4E484BA81FD63A7AF815727CA0658753F81FB7032D2700C355B0B70A2B2325E1A732D250CA48C12F819C91F19795A3625E682115C999BE8155F6988240C69FAD40A04C423365A49DD140802C3F597E37CBDFE565A45670543D093CB291019DC5036A761BCE161695BFB9CA52F7F02054A4DF41C25C87D9EC2B8C0DCA63AE73D853E7D6108CB93401A8177307BD590C53831ECEBB027492405BDF133AAFF7735E4FF5A7EC60444F83BA27431303D551016667F5ACA9CF7EB7F14303434916589B099C8899F5BA13241A0C5FEB594EE294FA6F934CD09627545B5AD659072F5871B90738885C1D136B14EE9CC980CF69D66EA3E1F2B2736E2389095610AC00E96F0FEB9480AD90570489DB3AFD8C9678CF4178CFD67A564E4A85891E50D2CAA7E868B7DF024755BDB1565C5FD01E5F2AAF5D74E1C7308CC74DA597C1246098A1622377E170A7509037E5DED48AAD584E2852486A1F0243AC3F0A5A7B4419CF0CB96519402063912528E359C8198BA1E730F6B698B34E629B72EE60CF0DC2A35EA901E8AFF9DA24427F9D82FE10CABB942B1D3E94FC64E013243BB14C9C659889FD2F8C6EA7BF84684FE79A3A2A987C0F2C03853424B282348C41AAD691B19C6C5E99199B48C486F45935AE6F67025979BB3194562723BA7E84CD4BAA7C24914AA41C935D6D3794C4C5AABCDDB842AD8FF4D93F124F0E0C267980EB7A438C785CB9423216E70377E60F1A6FAFCCA06587C6B8846C538C6D84FACE983DDBEE32B14A7FB3C73C8ED913CA973901DEC33C9EBEE47CBB73C2A432DC0BD37BF1B1A6213415F3533A45AC6FC0F21A7F0FB3BDBAEDF12033B94A83CFC9AD8618E1616271E31BE803048365B51B6F353634D616D3BAAD1FC817BBC1EA95354622B9FCC57BD1755A92B10FE312EE84E3458B8ED9FFE241690DAA6370131ECDD50C95DB977263EC974D69595AB7A25286D2B262808A58D83EC224B9F291041C5DB1B9CE1E0C71B783F3FAE2CEA4761DBB57A96CC66C4DA9B5DD9E63FA767F2CA9DF9DF1FC151B1177583FCB5F8C6A8800E6C3E205ECB60206D03195AA180B2B7F941B0F7B39BAF5EFCE610D86ACFA5E76AB41883BF43F804DC1AD597D8A036FD797D5A577A5D527A5657BAAAC223F968575D877CB5F98A308A6799625AF41E5F2B61795B117750F3A9BE20E347BACE97BAF3D871B5B3C0A57B18DE2C645757D55BDF26FF3BC9F8F212FAE5F5397BFC15428DBE5F2C6CFC50F5B7CBEB1F9273E05BAB4FD0C66C3634F40F64E3EBF9C4FE2C62FBF76A9B4F123FE75730174B9BC70415D5A8381C95C60F42F7FF3038810BEE7FDDBF2EA76696BD5FA3ADEC3B337EAF925E8C3A5DDF9ADF4E32B98AB5C5E7B5E3EBFA55EB9BFFBDDA2BAF65EBBBC00BD08B5ABCFB123A1E536B407E777EF2EE3375C7859DCBC0D5781DBD06E6CFB91FF3AB113FAF800A4A0A03280DB15F63CE95AF606648F97823574E830C12C9E2D83D7DF3778E850D044411DAB176CCB5A7D93B855F103F11EEDDD07F5CA632E8EDC4ADAC4AE695BE76DD06AC3CAFA00A87943E37D0D5C1DEA86C0F4C20307D55E3B67370459C86767E4A90336D96A6003B9F44FE87584816EE9F3F9BF4E0273B6309757700C783A9BC5DFF157DB4D75B3C0EFDC50EF3F5417366D0BD2C02E05DA9783B6ABB57AF9756F918CD941EB70EF4042777251374327145182C6593D82248106B576B1BA11880673BF619101D1D134DBD321C652548E7AC74AB8603DFC812CE2C705292B483286234A01C99F2C4724431A282760FE473E0B8940F68F5A13B731120CFA59885F94C24CD04F4BD696008DDE76970C0A4FBA4D04F7ECE3E0DEF52119373265203461F471709FE4080EA06E7707783C901E87C053813BAC893301E3BEC69E6152830C693B2A0BCB442224D0A33A345A1E119EFF5B8765728B89DBF330157BAF2E5F7371E628FE75D8FC6E2C57127E12FE9E63C27CCFF142ED8E8B7B2EFC4D0F09A7D63E5651AF9D0D7307814D5B509617688FBDDC77C63F7877070464B0F5047BA8AF0988811EC67610EC696177074B03113358706F16E70E800307192DE73FFB3B15DC5B7E1E919DA9C18385F712B1B25F6B7ACB03D934751E1EA953C07A3176D09BC5B0346837075740DE9586B24E6A99C1E6B076D01F50F6D2048FB030AC9B65591083EC00C4075B22C4E3C0C9EA853C6ED776841F63FFEB6D64D15B5A9D8DCFC83BF59C520AA785BCED1971B7188BB676B2C71DF2B74EB7749A6927809028E8966DD7188664A7281288A3472B8493560E297FB3DEAB98E02AD34C073DA415E90CABA160D7889459A863A7AD37DF2956EEF4E4299D58E162E3C0D079AB8795D8DE41B6C8BA49D195309BB5026FB4B76D33C8C7D49E995EC72ED4717F1EA6224CFC46E1829FC96CE172B583867B1D276CEAEA37DACD3756C23510B1B5C79BEAE652717DE38FCD7B65C6CE562F5F2B6D2EFCDF0A8F7A7BB5B8F384D3B6ADEFD05616D467F7E2B1E2FA4FEA2FB74B2F7F405AF7CE85DD271F40AACB577F85DA4A6DF116D0C0B59BAFE00DFC3D406C567FF84A7BB8A2FDBF27C8E036E217D572119B03F40864A2A6CAB9B4AC1C077EA62009D9711823FFB124A44F33B7061CD8B577B0A6EAF682FE90FC99DFBF56975E710EBC3BDB1BE4CB70370CF4560DE8A0C0A621867A5876DCB003F8D30C4771F358AD8D42810DF855468FD3B9A294878705A95397E861F5AC98D903AD442A4EC3EA246FBB981733A7B1BCD066EFB91651C063288D5E4A68EB75AF23969666DA5CAD58C503398743B5A91D0C053C14F0CCC3D0B254779D8F50C0639ABFA0D11998AE11BD3E94559262A8B3B2B07B732705F18AF6EB650847203A8927E0371EABF0F8C4C5172194ABC926251C4E381C423D06F90D3FE91EB10DB992EE5B7714D541AC022B948D6EFA77DFE0706564362DCBF350B614C4C211DA8B9485F390CAA8E5C4880D939628BD0D098051594C37C4210954036D4D6C97EE7E50B76EAA6B174B8FCF5993DCFC15EDCE75484E03652699286E5DC3CE0D6B17FF76A8DF59B4CD531104FF10CB345404E14590627E7E2FD2B0B8872EADFFEA3688B3A41F1AE25804A150F252105BFAAE5B1AA8247A8A3BABDA8DF7D440E5C428DA4910575D82A8818AEE38027984E83750992964C5C92FCD9E2A2ED8DC7726BC3AF673982CDFAD49031F4FB8550407DAB83235516960D80AE2941AB5DD2DDB15BD894A183D543A57549BED3BD2CF7AEA38EA1101AC1CC967410F21F71D4FB97526A11E24B298153E33D2C4C15A98FC77B08F7334696D0133913B9AFEB23087CD5CF84E4E8A67842C0F7960A78E160AA78D4BC5FA46D93938FF123D5D58E90D322589D931D65A9E6DBDD1E9D9FE72D2F5E5E480D177D4FEEEBE3ED6FD945F308C1E24F8CD065EF1E047A6E08ECDC5C99ED19D3A355C8035A16E231DD070815BF980DD46505D49F84D396F4579829EEAF45FB8CD520F3CC4361A20D64B4404EDDF0AE6B0161C6BF8D64174DC205C7B1E064C3BD634AACB3F706AA74B8482E6BFD6F928F34B24FF24FFB6199AFE5577EFE57F69A9BCF32A80E4C7117A91E493E477AAE4EF49B791C0E144CB7914A0BAE69C764BB714DDBBD7E8FB4A146758BA6EA1381B15EA27A1403D8893700F0F48986D46734F8F14F73BDF021347D530A5E51268394D8DACEDACC3A169CB0976C7889B59BD47DD47CC10D82080FE1D140A53B8EE2140EB74AB832AFEA3A05B989C09B7488FE02B4CFC437762867DF83B339CFE4844C40C6E73A7BC96B61E818DA7980908737B599C471105F5331CDBD359ED145150C1008C45066720E8FCEFE1DEB3D3B56B59F1A8A9535A9484D5D283A28548E90D450BC65176641336142DB4395A6861D70E8A15785C4CB182982DCC8F15F28AC4A88FD1E91614859455C7A483033633A458215298A763C4AD4DDD3D0892474A3C09921324EF9D9F16158163A786EBCB50806A544B59E309C0A76ECC5B5B8D6E14262434D3DA8372C5942BA65CB17944B9B7CC3D0A3758AF10BFB9E2A7DACA35DE91BA9DFD3E0810461E10220783FA7D20DFCEEF5679401D5E6464033C4D3525C1339EF881648FBAF878F7EE33EAF7D121FD3E5A0DB2DD5075C3D740590AA7C347A05BF97CDE6CE3313A7EE44056C8098A60BEE4420C8738444F801F07F8116BA2191175F640BE9947BD018AC9C150975F2F684DC69CB4B781844E7CD3ABE31B96AB3AB16ACBD428C4CE1E350E0EBD9B7E548882E176420EB7C4D7AB66C1C3D786558F8C0AD06C979241B71E24955DB286D0D6DE2589E4A04B6101F52EE986DE258389219EA1B37723C156B28C0C6C7B393998187079399EEC67F30F389E0FA377897B6743BC5E9D8E26F878A0C88EC63DD4D104D62428F1DB4FF68307247E5B38046D1E5FC7EFD6B9510FFBDE9E5BAF58FB80DD4ADC7B3D93609360A3BD73839CED13EC663B91A097818720A32D2B47C5BCD0C24E3C5E583740DF9D2E35DA5AE02E23089248AA4DD441522D0EF75AF451CC2BC3BD060D9F83ECF659EC3DE920D26250DFBA62DDEA1EBD35D2237B7B1469E54130236E3B04D86BD6431D806EBD790FD012A9C741D00ED3DF05590EDA44C41DB577A5E4D689CE9830D7CBB5450A838475B328750139BBEE409AC48D8548A379B9E28149DCC0561BB9B411EA18C24EA26AB5CB6439CF6A38DF3ADDA28E21308EA83EC5C88018F833DC8E210457FDCDC9B29E32E916C5A4B758111FC1D56A42674B4BCC1038B4B46948277406EB0C09B3592BD8278F7EFC142E989683C2850638B7142EF819E858CB5191B835206EDDDE0EC43DB34FA1C01E85D936E70ABF281202174582680D7B9EB9D0384F4A48EDB4F48E366925D2678238358D138358B57B7248E7BFB891AAD8A58CC692EC9219E337A3CDA43B1DA5759242996BCB6651F9216631CCA44E0B3B8250209086762EAD902F9BADA2404037B384CCAA53030DB3D2419A466020900BA71E1D55ADDC26A3798699DBEC2037458140438100D67A6A777E2BFDF80AE7B9AF2CECDEDC4915D77FD27EBDACFE725B5BBC154FC06FE5ABBFC2607778A1F432887852EADD77BD605B8EB56C3E0C6D0BE1ED08F6C8EA8CC428E0550497B5CE0DC031B9D15B23C71469A6DD07257E29F11BA8312FE13DEC110226C2E4999A3D43DC5236D59686F05EC378AFFDBD3D28E11A29F3E806001107526F0F86653E0134886DFEEB98160F5CC349E03674D3646F8F1CF47A3F2EE4B3822464C7D353C2C792903ECD2205ECFAD1D7535EDD2E6DAD5ABB7EC0E028F5D91BF5FC924B32A13BFB23BC3A5FBAF142BBF55E7B7DF38FCD7BA12E4BE7F72D886EFB8FB9D95C219D35DB7F7C26A4B3E2CC54A8DB495D40109E511710740D8172BA217601F16EF5E10CC8EBF8325F79A790DA7AB82507022D7493DD38E2031E5D358EE4B3A0013875D0B52290FA6E7443DF8D54BF6B278DBEF820AFFDB3F7DD480DF6BBBC1CD7DFCDB176187D375836D72031A0C552AA280DF82020CE54ACDDF262ED93E28C20F71C13E67B8E1766D2795CE5695EB4E2FC0B33B78D558B86647C75BFE0BC41EF5BC7BF345DFA1AF461406CF59E4B01BB70A00292F09BB9B616D674FB9720127EB60281204EB39D3AD02F91FC93FCDB125CFE5577CF8D7FF06E1E64F9318821C9EF54C9DF938E1F81C3899633A4417669FE35C4732D2D3884EDDD6F335B9A6BF7E1EE2448986D46D3D203895A3264A125455AFAA8BAE17CC0923E7780DE7209C4D490AEFA916D95D48A9475D7349CA10E20EC10B0164B9E655F9DC12F221C3D45EA736C40C4FA7CD4EDE4EE3FBA6BCB2110628E70FB7E10686D925247CCE336CFFE6E69D30F8A94F8C95B289192CD7AA1EB703F63A338822A025B5411487104B50671B4190EB37165B7B70671B3DC142354380D1423E4C4A93C602CD65EA4E2E51A9711BDA69AE05A88706D1F55274E8A39613CAD4C1F4BCF082E7C67267F1C8C122485191C54452699568ACDFA9A3F289F25486A8AC5DE4E01A0D47623458BAC92091A50143FBC2DDD5F55B76EB6CAFE35EEB429F98BDEA561EA1A2C343B6DC29FCEE42F6E02151EE2B2FAAD1105C8E84DC16D65E1219617F6F794AFBF53976E699717B495CBBCC8901710BB68216CAF8E675D9AF61D3F244CA6E77230352716AB6E2854B79425B0D0798040B7256CF81A48482E47B1B69093CB1B7E1E4351C35EB3E856184E09CA682E6756189290B37062A4BC7343BDFF505DD8B42D48D8624203C6C19CD628BD3C2ACACA9F72CA5FFE7EC614D83F4D297FE9C9C98AE525DB967117DC9586BAC9FAC044C26D1E2060974A7D60CCADBA84EA03BBA13E702016E7892C5B21A051F1377FD0F672B2B5F581873EE91F1D48F6324B6DB48F756F848C60DB7887C7D9253E08589DC8D7075A1EBA43986C0D32713884F33B933B68495D1DC447F5811098456F4A3709BF2D9B49C2CF5B78E2DC416821ACEE5CD87DF2C105F6A1F9AF4591647E898C3F5549D908FFFEFD16888E5B5AA53D9E0C7331FBBF3E902C3F597EB77A93A8D607BA87132D2F6801CB43F58100554361BD7AA4F9AC3C710FCB6F3B8DD8EBE9E6E820A83EB0C0D3148EF396167602A1FAC0B3D31F8D1DC3244A8DD46DB479BD1D6A4E8957D108AFE2C2CBE2E66D75E91D748BB5C58AFBCEDC9F520AA785BCED19F93148BD78B8B525831156AAFD5045889B494492C81249523D9C3CA25D7FAE2EFDEB2375E95BEDEDA2766ECD452DBBF274329234122290D447729FCF9B87EFA3E3470EC8D0A9FDAF937F1364195AB59370137D24385DD20388B9A5581B56540C869BEB4C3D6E1DC2AB631B178E5F6DD4E308433BA8D93AB14960675915942CE6A77202C6BBF259D840F68FD97486D560C08B2C07045D72E6143DF52059273437FA6131DFC56C121C33C62AF0EC6C92C144ADDED41C17FBEF366D396130B922C4266192AE9F3347A278C4FFA91C9398F69CC16158CDDB8FBB8E05EC323689FB544062938053308FD8CD8AAC86C6BD91F087CD0B63A7E94DB249D02FC15E139590460D8018749EF127360907F8047BEA1CE8ED3BD8D3E56C124C5A459D546E655F30841F29AE451D8DB0DE3CB806B78C56A41E07D1D05F273373B252983901095E97BC2E86D9B5B8B571F768A0E54CA84E905D3AA76FE09C3E2053C41D7C93B86144A28FE5D2994ABE7A5A754D27697E2AABAEBD2FFFFA248899EBCE0E6A7B4A7A4367EB6CAB01DE4802494752AC4B2F8693D6B31B7644675405B638D3DB95F6C68A6E089A55779D6A294919A11967F506A7791134F3DB7B867C25185BC35662B95D001799246846E296CE4F817B16D2720391804E1163043AF5D22FE5B57301A4AFB59CD6A8449B7509AC04D0DA5489151589A8F4E6350DB6697508A0B579C285529893052988B52268664A2D65CD1AF09504CD686E421BE7266877577717EE956EBCD016DFD9CC9C0787D7EA813AE500A4302BE4C540471F941304D6EA706F3BF3CD9413CC815E4587B5695578CA09B6212738234F21F1CC668C6D4A5139AFE58C5525F3779098F9E15E3AA9F5DD8A9AD281940E14A596D31BF73459E381D8EA445F1E202ECC595DFCA4B6F4EB07F5E1D53F36BF810909DACACBE2FA86229C51E077F5FE76E9F225F85D9C814A4478A1BCF6CBEEA3D7F0C2170531C35EF8F1E2EE53BD0C175F16B34201DE876F7ABFCCBF1D5E9E9993C50CFF3EBC042BDA8597F3C2BC1CC4B81216242CD89B3D93E6854C743E8CF9D24871DD1024D5A8E1B102590FA317A9C7C17125B2721C487B822464C7C1147E2C09E9D30CB9282399425E11F24A1043469949CA4C0639C5A3CC246526DB999964B05067F55DBCA0AEBE0F62EC08B5116A23D4D63B96CE891392C8B16BA460CEBE436DCAC88C9015D3A7829D3810382370B6C7E00C3452C9F0402AF054BC79315B981F8318452A44EB38A34E368CF2C2D6BC30F4BADB5D38076D36794AEECF3C11F7E7324BBFE1CB3F7D57DCFAFEC8210266FA891DB1F9028D69DAD716C79A77A203D4361CA02AD3733313A75A0DC2F6B58C925724861ED697E6C4BC707C2E071DF02A5DEF1C9D0EA9E1BE988751D04601048FA8C33C2D2D6DFEBB74F3392230025C7A43974ACB2D025C04B8F4AA36336F4080ABDD4512A2926B195F8D709620E5C11533066882BB17DBE4B0AE69E8000321032416A848954890819A8A03C23269627A8A8B1F3EFED9CA2B0310A63DBEB4FBF44E00D1A40AD6513A8C340E23F7B59F2308D666089615E48C24CE2A6221D0B828B753C77D2DA094F06A20E145408C885F6D4C78F907624B4BE59D5704C4E8F0918D114187657438D21B9A3A0BE4A8950865C97CE6EA5BDEEB8D9523CD49B920F6CA0D9F81D68FE6C429335754E91B43C88D5268AC3726F5799308B9B511B9F144D9EEF7DB302B35889923B23EE5C78CFC5897BA37CA9CB5397336FD3F04CC0422F5B499D413ED5A4A387EC6FEEBE330E32E96E84BF58DF6F77642774C4AEA3690D4DDFDF98EFAFDB9F29B1756D006DD32E6C549B1747D4D7D7ABEB87947BDB058DCDA81EE70E5B5E71CD669DFFDA2DDD8E69F2188479937CABCE5D9BC68C6ECAFF0122BC9186AE21B8BE9B4CDBDCABCB927DDA05B88EEE75CE68C58E7C1C70F0D0C25073BC2037646F400F9C9CAD817EA66A73B915A2683904D03C8868EAB29E9D9C6A4A7F5B8BAFCF4E7D257EFD54B1FD4E5EBE577AFCB5B2F812F48F950E81456814654B241C7D4984DA84844877A3E2BD80224D911B36067C58C3B1A6667C6ECD0D0833A4147D0267582D018A131AA9695C1E6D5D1040FABE8330FD074150716CCB25EC21C81417253BBB1A67D73EEF3F14F7F5F38377EEC53EDF1A6BAB904AF97B7CFABCFB7B0B6E3E6A2F67005BA04ABCF7E84CFA6FA62FF914CC4B089F0AB25F87D30F61F83B1DF17BE72C97CFA4E270C7D923C7C28D911E9843ADB4BCD72C06B1A8CC311EDF17BEDDA2A6F99C30B87409E7893EBF2EA76696B556F6548038AADD8AFF3A201444A1339761EE62F7F58ADF0B327942F73027C9A1779EA559EBCD1424E9854ACC7B1F83B9CC3A1BF99F4D3B11E936B9CF63A51289C9E494BA74F286949818F8B59181131845F944FCF40D2FAD4C942A62F9E4C0D0EA4068778A1A9DB4712ECDA958FC407E37A09AA848BE0ACBEAE86C1562549D82C277CBAF1AF00D30D6757A58D1F4BDBCF40DB806AA42EFDCBF1B5C6731CCE672B0FCECC55F55FE0F9E02FB86C4DED69436D32F4456BD8C35536D7E7C26113E900033BD59517EA8597C5CDDBEAFBD7EAD2ABD2D6B7A59FEF16D7AF802304DF585E7DBA7BE782BAF44E5B5A2E6EDF2F6E5CD4D696D467FF2EAE2F680F9EA0D5E33BF3E0FCEEDD65FE116DE59A7AE589F91178BFB6B2F8C7E662F9D24FA5AFDFB27F5F76EC61B84FD8D7D6AB552F0B8088F2C23730ADBEB8715D7BB45CDCB8AF5E78A73EBBA46E2E805097CF6FA957EE237EE1BBB0F4AEBCB35C5E7E5E5EB880586469ADF8E1398CED2AEF5CAA56057CC3EAC3D2F557DAFD37A573BF696F3E983BC2BFB6E5F82588E837144C4D30D5B5B52DEDEF1B3C742852A5F0ADBE497033238903F11E50BBE2E6636B96B1F4E6B1F660F9F7856553118BEBD74D0D2BAF3E8301BB9080541F5C024981C3FBDF17BEB5497BAB6DDD706FDFA07EC41775C3A64F22BEF55E7B7DF38FCD7BA12E8BEEC59370FC6975DEC3BD03DCE598BE934BCEC498CCC4BC6183DD2EA75090A60EFC5310E6CF1C48CF8A07E6CFC8309A0086551DB02DA26F973E7FB0C9C746FDF87CFE04DCC4DF045986F108A3E3470ECCCDE60AE9ECA8A488999CE036E6A58930CD61E63A49EA776EA8F71FAA0B9B41B7AA6199C4CD3968BB5AAB8D8E6FED6AF8DEDBA54F7F3F63C8E971419E2DE4658808AA5E6A780DC7250B6B0FEC0E12F9AC6C063D1AD1FFE241F1EB5C515797BED26EBE2AAFBDD1EE5CF732F07AF8063FF4FAC0899C3E416F309148A0B1C6017CC315263ABCF3088B2470C85E6CD0FD1D1F172498D4226310A114905AC2823B59CC4FE504FC847C162C06FBC76C3AC33843F022C334D66E7B18EE05FD2CC4D24A6126E8A725716A3AF0A545285CC80A9F05BD36FFF87F07FB38E82B6C9075F9277247D35F16E6F069F84E4E8A67846C2F73AFF0D6A310181B978AF58D1AF19F551E3E95C42CEEE414FC1C632DAC71EBB17C947D89FD653C1AA97E993522AA7E9935818197F95D1BD75124B821A6AAA8BD3AE3487FE924D3E8439FF48F0EF0B4A159E52A7D2658372D39D41C1B4F9EC66899892D78CFB484C26A1550F87552CC013FFF700AFFE3CFDCF22244FDA99965B23CB49ED4E8E8C6E2134C1C0CA017561ABC8EFFAA93D485E5AF4EE138C15A58B70EFA3AC22DB8BA7CCDC5F5A1D2E8E793CCCEEA6DEAEB4D4025C166AAABCFBBC46C2213C4D69DC093604F7F34760CEDE584988581D969E9A313A3B8C820B09503823B6B404D53772EEC3EF91040B63D1ADB916C936CA3E0EDADD1D65ADA8A05C0324111CB790F596C99314EB8DB6A8FB34128527AB651DCBEEA6DAB118EB0638AFAF0DD524617167C6F391267E7613C44762404AC0794E6A9A48B94569DEE463519D37366267750E681F9AC24C882F485D03BD2D393CE6420B978B270BA65FD8D21C0A2B62DE8AFDADF0BD423371D2C200A33048A7675B0C52C7474341ED60E86127F8775B32CE2BEC08EFA97DEC141B1CDD979288C1BD4FCFFEC7DED731357D2EFBFE2F287AD7B9FBAE15A925FD932550E2F097948960BECE6DE4F946C0FB62EB24449E335C9875B860D600860E78184249010B281B0BBC4264FB2BCD880FF97271A59FEB4FFC2ED3EE7CC68667446337366461A599D54615B2F3367CEE9D3E7D7DDBFEE0EADD8F1C65CBB9ED641BD961C37C629E42EB2B6D63ED58BA17A314D2F7D92E7AA22FE91643684DE283EEA24B6CD58ACEACD8894CA6EA40C8150A496A434BA8FBC10DA0998F6DD4ADB24B423F16CF69CB8D99954C0BF6BFCFC4045D911F44805F400E983B02DB348C0A6F408A04AE80F361B26D4D1EE663BFB68531EEF63FFF6257B313B20B222562EEF6C7DD2D8BEDB78709D938389BDA840CB4E317B31B5B03619D662E8C74573B785AD880C4A415E3C557EA7525E3CF787CA54B1F861419F37A96192B389288C3A0FACA2124F364B80288C70AAB60969DBD8B71687D126D4E66B24C428AA26B5A53D39D1619D88A891096D0E6967F28B454C0793946574E198567AB2DB3A3D5558D0AA031F684B0327CA0BF9120B2273A7BCFB1D0660FCEC55412A09AD194D03027FB269E278CECEC633D99999310FEEE5518B9D39E2C1DFB4D303899D198E93DA23ECCC918C8C86991D1ACEF1B8B183B499CB8D8A9C47C7CB99EC888D0EDA2576263E086C7917099928113027ED82CD12676B4495178E691055017A80196162BA75324C8608A1CADE919433EECCC3348F39350627DBAE24FC969C07655A90F037414C57851F62F791589E782E91FC93FC97745B811D998A9743753C16BA2BFFCA4C50845E24F924F9BD2AF969658BCACD89D8D912B075DB348D70792722C01A65078307BE96A9CBD0F740D81B892BEA817B635F255BE08BC2D97B219CADC81595C34C12379B17D458FFB4F6FA16F71DF9393F53558926A9C132DBBE57B9A2327489EC019142EA70BB3BF3AFEDF4811EEA0511849A9094A4387DFA6C9A399DB71BD932847FCC8A80C9064B0B5560729FCE17553A1C13FCD9EFF6558BE3070D7A4A956997542D892E0B8D83EA9D8514DD750258F4A7D5D740F087E00F48451BC283F0EEAE7EB6BB7C6167EBABFAD5E5FABDABB5CDCD01A8BAA82F56B4015EFFD7FE16BC73265F84E24EF5EB578104C73FA020B32C34E99659423009B77A4724636522E16C1382A9EAC70AA5282D63437B577011781E72B208660E29780A5B93D00BA197D042CDACE94717A1DD80059C27D941F13F8C95AF8C9FEED4D7FFC96BC5180FFE615CFE4A412C09E59058AA89E59BF5DA362BE47DFB717DE539A01605E923BCD20DC38DF08A0915FA20E2D42C17ABB03F09B4D0E9A0743A50C489FAAB76BCBF2AEF79B07BF7B2B1B6A2A0EC088CA4058CA00F853276D12B1DD4E18F11004F4A5F7C69C5688F66F7E544C6EE1FCE69A5A3878C953B8D078F6519BB37786B11706E4A1A8F50D7119EA028CACB1FA0BCDD3910622DCFAB384E0E7E1CA05A6ECFE4EDE24E29CC562969B7B5E27183FA8E8490FA4E79B929693794228AD851847256D51AA1F447471179CE6A66625C100A1DC9A9B9E121D12AD4F17246F41FE1C83A78CE6AAC2589E524AB74E4ACF610E73978A28FADB450D0862294A0CA83F7D15A8CE0DE74D330D252B09E249D752F32FB2B86766FFA40B0DE4BC58E9A8D8A270E093BD51D085225A6AD9F2AE9330ABD57EA4D48E4A56B09BD2CED0FD5238AD04B27C4BCCFF34C7B01E3CC4084F060BE5898AE14BA9A3FD6320E47B86088FD176A80F3D06FB268EF39B9345FD0357E89D0680B7576A4A4596627B7C2937EA6F18754C17E0960293719931A3E43135F6E28049A998F864452AD784947EA0C7A940188CBB64B52248D90C9B776F5EF81CE537A20A8F7849143F9F88E84DECB004ED991803E967EC9A8E949AC9AA44A580435C45C74D502AB41CA347E68E0E8E3A6B3AB3D7683249F28F4E0115B2C9D5F84168355057C4190B785379532FDD6C3F84291D92B7712C777E4F65E271E12C98F0F62F9C268D1186685DD7C68ACDEA93F5BA95FD880F68406CF4C626949F5CF9FAA66268DC90A2CC727B08411153D42E6C14E18B168EE1EE181C1DEC40099E0D522245F4F0E668759B14CFCE3C462115EC82FEA653EEBF1253E590CE574232A536A3C4EDE740F1E955CE4D68B724E427C0A8D4EE0880ACD43347BC1E944A030A6742F02857181C2785A3892A7D03ADF43EBA18E78EA6528105EA3F4315E05E748D95129DBAB5E1C40C6CEA58F0D0F182BDFED7EF5832C65ECA62453EC9B2B3C8FECB7E5CF24CE30F014C3E8E3E8EAD9DA0D2BB4DFCE0765CAE638F43D100CA632592CF493746AB6D29C2636AB15355DB3A5DB9088634004449CF2C2D29817A657D0C350D1AAD063B0C3A29A7224E261BEC5A6F323E698C96A5B339CD4EC8B989375150224457D11B5774D579B8849C29FD58F013020F11DDD6EE05C63BE361645743ADAAA8559ED4F6A5FE740D63EFDD3C563F98FCA8B3A5C8FB7FE3B5338AFCD72C703ACD4B172F9AC79ABA1E129E617E4171169E6D34533F7CB991E363191E11771BE9C1B17AE45C7CBB9916159EA5926971BC18BF01B9AF7D12B3020373C632A5EF449D72BEF6A76B6606E62CCBC8AF9097981DE0C0EDA9A88D9F379FE04C4C82646F6E4A0CC91E25920A3138C6CAEBED51A1E66701F92A4538A4D6FA4D844EC6E88A70B093B097B6F08BB722B43444B24E624E63D21E6D1F2C99284FB7D19C06EA12BF8651424D47BAC651CA963D146CB1D93E3EEBE143911FEF38A20050AF62524853E43834356E6844B6ACBA0F35A910F2147BE246E8893A8C155C1B3C115E57C31A7A3701332B4E1EEE6C59C93AD703BBEBD457C5EEE7E558E0263343860CE17E1499BD914A14DB61551EB288EEB4E7E5792C7FD4275EE746156120EC550487BAD2475ECC6A7957A8F944B003348E563029831116E49DC82881BA7EA5919560E4DE7C17BB01F291E1658EA9C0511F4B8D4991B9F1E27749900BAE444050493715148DB63314167B050978FDF82B954A6D9BF8E9D32323C7EE850AA5C29710F125D28D97D2303BBDF7FD2F871A58EE99D7FFD6D79ADB1FEFDEE97978CD5E7B517C4130ED4208178C271B493786FC9C6CF9D3A7E74DF8256ADE6E7B4E395C29FF3BAE6380DB9151B9F46E925523A317689B1CB8F6971D229FB823C30A5CC8D1FFA1E78B804E1D23A3081A8830F409651190F6967F2408006D2E790AD42BEE83FEDCAAD6EDDC16E0020E3AA4D95AA8556165BA0284BD47A7CA60A133954F0C3228F7E0813B03439383E34EC41152632710036709F92894786651CE35C56FAB26AC38A434746A6C67283497A8889601C9260DCD6C7C26D87A00CDC149A3D490FBD795E29928771DFB546BE488A498A6D1E864E483138AD8DB547C6F6A5DD075B12A3C92F58C24E0A12645BE80F938ED81A86AAC04FEAB888B591F8CC29990FD444A25B45A682BB4C935668682571BB88575A10BFC7517021E9A123A28846E81576F0A90A5AC01D80DCF105527A28206E8FA00532FC55559A8F28B78CC3118DE8FD0611727CDC97221744BD2645A4F191429FA18146927907931A2CAA50450E06FA3B5A512C891B917C412AA689E45BAD526387F97C652FF09B50A507A4F412A2DC6B257ABB43F34D1D36D5CBD8C641C1DD95215CEA0E94B6F55C2505F50897CE95403BB332FD335A49D72AE8398359D1458E8D23502E888A429D9FB005CA7BC8F2F6B135BA698CFB0C0DE6BDD36690B1FAD9EEF2851DD66E4145CD5189DD54A939C26CD45641CB07A54DFA1C8EE9771DCE40816438D4541417E1B354292E0FCE60FA0ECCFA1757EAF79E086EBB5A0359F22192E8E559A79FE0AA9AF38810AB19972F19EB2F55541E61B554C91D6135C26AC11540CF63B50FCFBFAFCD16F22A8A8BB05AAA1457CF60B5C6C64FBBF77FF9D7ABEBD04E68E7EA15F8A5F1E3E5DDEF3FE3A9D084E14A5AFB94D7F88889E4DE653C33FD003ADBBEFEA4BD60AAA848C276A95291326C07AF89A42C659FBB2B39ADFDEEA584757DAA5AC84F06CAB5CEEE1B1DA8DF7FD8D8F8DE5E2D4378C7AF3DAB2F5FA0147605939552D883FA62D1C0F76A75D592C23EA7E9B6A4F6937A5E5FAC4A4E0D4A64D759AC9373BC31ABD0AD1365E136A5A482FD894EBF50F4B921D648E24CA152D58FB126D16359914392F69CEDB7CBE5A2962F0D4C8B9F037A65D1597BC1C3AA886D851A0F1E036D9E6BF4FACA9A71ED3ED8038E554B7A0467F2C56AF79ED9F8E1E7C6AF0F1D0FCC514A925AC20DCA52962C9FF48A07A954D02E513F9B95908DE10BCD44FDD151F927EC6DA7CA88371903246CFFABA276069B55297D77BAACEBE505D56F57EC4DA5C20EBB00E51766F77ED7AF519132E268EF951901A1611C17C7CBB9ECA8AC19583A12F5E141404E784B34EA045662EDE8D8128672C084D4ADD3EC0E41B3D5A29625F1D0B422BE1B7CE820273244D09987E141B88BF5CF9FAA26F34B153A25F3874CE60F2E2E5CC649D255C2CD9113FEE1C421B51E39E19F843DE9330AD53A1505E872510012F34E88796A0B07484D80BE4CAB4D37EB36040DC503AAA72EC72B5A933134B75B514E5F4AAE0F5997A1703F2240B276A6570A9A87A8263558063814B9C352504DE2867B50A1C958DF881B351963918FB6ED7C641C1A246D84CB944C59B30770C3CF737FB03BF619DAF7D61105CE63526CDA799E2A274E55607FB3E2CD58B3CA99A69A441D2B82A366293482A3586F90EFA0EAC707AB20872C1C6696209C874055D11EAC5A9A2FE81AFFBC129340BD8D0D415177B8D90BEF754493B50F79780D8DA0A8599BBFCF4A0EF40D14B5132C810BED60A478EC19FB21E4B14152E75650D7E3844317F2259B41E7760D77447BCB7028A2D2E922B51C835D6AC2431F9F8FC766E5E17AC7968DD4170D1D2AD97D6303B5CD4F6B5BCFEA371F639AC59B1F80ECB7B375ABFEED3D878EE12B9B24EB2D34EEC321B529472C633C84BE07CE11D1B113A1633BC4CB7984292D13D0BB4F68E7CA15FDED8F6C34EF139ABE58299DD42B85D29CE38EFD2CD0D4B52C8D5DCBB4D2ECFBBCCB1E97E381AAFB950E0BB0FBBC72430A3CA7BAD8B4CBA933ACC1C6A6F723F29033D23EE77272A29D9D9C1B96C5C6E013C44EDEFBECE4CC0477823968C8999111D9CB5EECE461102040FB1C77BF5329CCF2CE60B05B63F205CB8987783FE12DD745C44034D19B113DF43213F078300CE22C377391840343AE16E2093E70BB2169A28C0F1A0F1D37696B0425FD3008FBB9FA57E52CC38E2549271AE707DAD2C089727BCF4CD7259D38CBD8C1140C44588922CB10CD0E331636FED1811AE5A17523F3E5915A577213A873961157914E279DDE133ABD2B9CE5980D0322E8D9E23922F41D288CD381AE681EA0C5119D48439FB4F30B454FE72F5AAC6DB96D6877B76AFC7E16CBDE70018606541ED24C5466A8FEB254982D2F1D849AE19572BA4A8F865EE540BA33594649F0FDD3059134DEACD7B61FD4EFDD30AE3D30BE7A2C22C27B976CF2BFDF3F2689A8F89E0A723B20BE5321655CE866031C7020CB5BFE0697EA8E6C4174458A763D161B1A5735220BE5DC49FDA3A206FB92535905BD955717C49A2FF6C282F837B62A874F5B85A7ECEF5B2F8A7EE638643EB750EBE9EC42BE7216EA9355B08C4C611698B4AC7D6629BF00452E4E9F2ACF0C6772A3E363A313425749BFC26CD5E6577243236302164A9B37B746CD6048A63BFF40CEB14F0207DEEC97F86DF942FDF183FA37DBBC8E6CFDE64363F5AFAECB9A0F72B834DB7C72EEEC10B3627BC70C72C052F7252DC53E9BB5AD4BD08DA8B679D3CA5831D63EE3FD8978EDAEDD2B371A8FB0882AD7EEBBCB5FEFDC7F88357E57FFDEF8CB6BFEDD9D278F8CB515E3D233F864FDE78BD6878D7B9BF5AF366A2F7EC2CF3FBA0847047CDEB8F1C058790EFF362FF5F965E3D685C6AF3FD55E3EE5A5C2F85B3B3F5DFD6DF962EDC58DFAED8DFAF50BC6CB6DE3B36BF06263EDE1EEEDE59D9FB7B840D4B64020AEC1DD8DF5BFD4AF2ED7EF5D355637606CC6C64BFE20BBCBDFC16577FFFE75FDEA531CDBB395FA850DB8B24386701FC5290FEDF6ACB53FACD0B340245E2C652EC9EC5F879D1489C5D5D41CD27DED3324D866AD3B1F7AB2C63C488CA7E4F665061AEB6F765EAFC3F21A3F7FDB7870BDF6E2EB44576F72701882F0EC59842A0BED32F4995ED9E485BE07CE4E2A49664E1773E8E7EAD4DC79550075C856E043CB947E33C618FAB17139DF5B3AA52D9C2BE6754D507AA68E1FDD57D574A841B758D52B1F398616B7D2EA25B1272A5AEAA8684568857602A8675A459B3D9E9FD3DEAE68F9B34C89EA07B82F6D40AB5480A9DF61210E75CC26E5BAE9944E8B483E1B9292CFEC34B3EC88ACD014D1CCFAA108E6F8708EA32227CD0C5368D83E77BC9C1B1E12A6AEE3659394061B028426099A195ED9B4403D0865F820006189504684B2F4D36C2211CA64E96D4BFBA908A63CE4EC699A87F4543A0DA02E618AD0718EB646BD69D624F53068FD442594E189436ADDE63A165E6212F6C941D90E2E94C0D96E7605E410A6333B9709FBEA6A63FBA9C41642FCA2402F209D4E629E4231EF0AA14CD904882F1ADB430535EC051F5A1DF8DD6663C15AB64BD7B60FDE03C0388226DD7E1C54FDD18A60CA217D5F4A6E6888CBC43B2908EB23A9A107EB21CE490D5F20700544C25C3DADC09B443208E59B44122467BA305B981CCC57DE3A3985381C7692E9C13B605113F670F9227E209CD6CB67B592C2FE633ED524F71F51CBB875183AA66B1E09F8D34D2D037D5B81458B29B91AEEA0E6F5EE4B2D6D478D04793B506813E88E8CC070BA309B51D170047ADD616C99432B7D555508F4EA5A45409A90B5AD7BC883107A9509F40604BD76B6AE9DFFB8F3EA0B63F5B98A264D3A398DB022614520C39C68AD1D7FE29076A607EB0D1356EC7051761B56CCAA6838C28A8415E178E5E9565C193B9A09A8A66A9283B47D5A4B92C5C892727A9B0E1A0F9A7F68600B7227CBED486AF82892968394B0A25EE6DB9D27575AC9927B576C657E45F404464C590D357FC253EF3E73289B4D16CDC8EDCB0E346E3E37DEDCE1BBF5E82109C2E9CBBCD4DAD64D9EDAC727C6D8BCB5BB7CB5FEE9DFC49F2B4F1BBF3E0293D758BB69AC3E859452FB2C3AE6D04395CBD472687F3EEA5BD792257D3B087B35B6AFEC3CFE14F25A8D7B8F3BFAA8EF1FEFE8ED2057D858BF0ED9BA2CF177B3FEC5CBDA9BED9D274F6A2FAEC2EFC6AB65484A6E2C5F82C5AFAFAED5DEDC854461981A9E12CE132131C1173FB95AFFE6616D7BBD7EFB25971ABBEB04D3912F3DAFBDBE8549C92F3EFDD7AB4E2793BA3565484F6E68A1ED10C6093D2EDC4CA9CC5F8DB840D3CCBB6912A6434F4B9A972B4ACA6C5C583AE2F4A2D449D36CF3B3B366F2AD43EB718C95E4991C51DEF6948435C264F6C62552A1671085687FA252226C96DC90B318CCE4E058D6599A8084A7C9151269C6BAC8A17721B5D46FE4A4BC04693E512861D9745556A1927451C304A6EAC7508A81FD02F5A5A1761353018CC50C1CB945D3C951B137420DFBE54289129697F63B32932961598DA000028B1CB6E318F03B7464646A2C37C84A29F1BA647BAC0CA4137CF6B8C2EECCC32056DAB339CC24FCB187D93A84563A27FC7B39AD99E49FE4FF0384AA6D3238D45B67C8B96AE9C87426C927C9F7937C4A7E367377536B0610BBAFC3EC3E4A7E86EE60313252DAF22CFC0CD4843ABE08BFBCD7D0E0E89445E3931A2C1AA080C125EE7A3035DA965A912636B32F71E7C6390102F60ED9D967E502E56DF48D5059CC3B4A4DB6F611DF18BAD5BB5706E1C3EFA09425954C97F5F941B6173CC86F21291D7E9A4F95B16CBA52F027A51F337B454C65773B7712E8EC30E83423C2907E7CBA3A5FAEE80A60204379256EAE8117C02398001AD7AA6042D83354660809D5C7F36F1DF4732D592C6920CDF2DF0184F2AC60E4C7DEBBFA5FCBF74EBDFF6FFFF65FCBDF18FF711DFEF8C3F1C31F9C7A5FBC047D748CD7DF034F56450F12A46BDF983D90F64B02D221AEA6CC0F241F043DA83C3C113C36E8A81B18A9D9127A2072FB7203BCA916DFAEBC119564FF25C9340D4D74342D88A4B31C52C903778688533B775148D9323F5CC4C746619712ACABD01CC66458BFDFF13630A95DBE508C67D97A857E325CA194B097438FBD530A294D1D8B52E64D4AFA2C204A30C012E6AC0ACBEA254AF0745138A09BBD851C24DF0CF5303A532882F7EDF028FE8F4E6CB41A66F6783C2BA4067522A0A4BDF31EFA34AEE4A6CE3C0C628A74B07C499EAB03CDC2D3CC19D11911F08166BD27CFA921EE92489348574D5068E67F86369D5045A7808B4BC24CC21C8F30F712BDB61FA43E8D913B3BD5C2C3DBEFF0F3A7A13F905900D372966AD52A34D43E09FE5349BC804916063D4C2AA39B8245BC85A0E1A04091BBBEA137C6C85B007FD654B130573231CC8C56EAA3BAE869D48B3E445F0F55E9E70A51DD1B0C9A3E7E50FF66DB332CEAABE6889640B404A6C03D38B96D7721F790389040A4883F486BBBAE856ABB2FEE41E2AECBED1B1EA86D7E5ADB7A56BFF97877F9820460B80809870FE58E8C1DC19C4FD6BAC856D45DBC63ABFED0B3854471FDD873988F19B69CFDB993FA4745CD3CEF328376C9F4B0DCE123705B26BD4DF1992E97CF2EE42B674FEAF98A0E972BCC4E0E667338FBA5FC02D486397DAA3C339CC98D8E8F8D4E88BB48BFC2EAC934BF329E1B65CE7F48DC95DD60C479834C6E04EA50B147907E7CD4F9F1F1E18909E7A70F9766C5D833E28830AF637B67444C1223F070106B01B710716FDB34A2801B77EFFEB67C61E7F6E3FACAF39DF5073B6B971D22DE9C80E648607E1DCF6A7B878D3E66E1C866F1763E4B3EE69C6273C9D9579BCFE0909271E757B2A3A31362CD2BC1A6D894469C4667D7268F9045EB2AD92F612D83B1727967EB93A08B31E6B918E3E6BC45DAA92E1D05A597C685AC8B83C463BB82407B24BD379732E0442FED0F7D0F26DA664554280D5BDB7A587BBD8D627EF3A1B1FA572C72BAF1522428BDFC054AE6023D94CF7B63FB2E14DAADDF7FD8D8F81E96C458B96B6C6DC22FBC5E6AFDD68DDAEB7BF0F5DACBFBAD978502B4BBF7961B8F2ED4EF3CDBF971CBB8F6986F2C63E569FDFE5AEDC5DFF92DA07EAB6393E184C4B946EDD327E9FCD7A7AA85FCE460101E71665F66808B005FBA44D7AD67F656315FD54F68A559ADA2CD1E07D7CBDB152D7F969D09292D591B5A7FC87554E8CBA01A72F30F17AB5A65DF5CA5BC786E9F439A9C87C6349B4EA51BBEB7F40E5E7DEAF8D17D33B030BAC6FE74DC2B6E8DD333920BF219A6826AEB89AD7816ED2D3EA1925832293CC804D2218B4EB95781B4DE5003F6DFC0F985E27ECC67046BE05C4583CDF7676DF0C0C05C9B31283D1E6E39C9D3F5F14E8B4854CC8E4E2042D73F3A072B377B3ECF712E64701C65D6D2D2E460668861F8D64FBC5DAEC0D954454CA597B10A81125DB0A89D419352E9BB9002AD971754BF4D44457FA2E298307C9CFCC5116E2DBA6B97664785CDE2FCF46886BD0C7B14C4EA9D4A6196494C0596AD836DA7E141E0862E215628E2854FA14454148FDBA3154A03F82DCD5E0349B9E751C70B870C0A5048030BA65F063338004C7AE82033D17889B8E1487C8F41D1222C44CD407B7CE9BC9D91811E17DFA834443C1B48824982270735706BA06B886FE3CE6C3E54C0EAAC43043024BB24BBDD93DDD4920CA5B03A769A0D6CBE5EACEE6FA7FD31CCE208ED779BE4E70348EC8387F99781E7543D0EAAF868653DE5209B84B9A42353DA872DC2E4BBA74CBFA406CBB0865AA54F394826092409840D68E2E66021552A0BCA420F33CCD728FE7573D265B83EBC7F4F94054D3146F1AD14DAD6BB97949E34F107FE1409E0FC07E3ABE81531A192B2C6A72AAE364FBA7006EA9577357B43B2DC04735FE39A9A9FF010857102B2161BBED5B76AC78204640F3613C7048F701E840E320BE6AD40D6D27C41D7B8834329CCC9880B1F00B7D2113F75EC1490690F59261CDBCCEC689565C2B12188598AD937846349025BB5A49226E4844063EDC6CE8F4F55942161BC34283CC7C9C5E018877A54289485B28F940359B88088656E381E427138E322A50DA10323B32F3BC0D9D9F5ABCB50C89778B920B5A60D712095854243AB57DC94AD848AD0974171E926FBD6712AC022C9C821DEDB46E571BDC88E9A3E5504821350141D63E2CA0F26DBDBA23D614B609B3892831CB6417C0CB13CBD9B1C4234E0307EBB1837E4B14255FF5D51FF3D93C6DFCDE9BF774864885D12E3FE48860DEC78B0E4B79AC59C16B02A64513F3F679A2037859E75B9E8588395E9BFD0F740451F956D2CE5B111DB184E06419E674C1386E52607F38B7A993B910A25686EAFBD0B1F53E249F3AFFF49EDEB205AB04076B2F774F158FEA3F2227ABB38A1F64CE1BC36CB470A1F3D06C9BCE6AD8686A76CE45FE1806FB2809D44618FB2A8585381791D1D9FCE654745AAB1E3E58CF8341F75B7D8C6C32C393A3ADBB8BF4B9684D4ADDC0E0ACAE54D48D3863E1660A7C8B473671EA6A9D2C1C32239497117B50DA1C9EA9D802E9BC74C7BA6AA668A5ABE82EC39BB4E833FDD058049D2ED05F95028A640E74F0EBAF70053849D110E1F4CD17B921E9DC39C8987074AC24EC28EF67D52D600AA7575BA33E974C831614754A5AAABB39EDD9A9B747ADEA3E1A62A1443314F2D335A6A02C44EE5B37909970AB3E5A5831049A8948B206B0C7D8999ED6EA3D93404A03C3C5E76620BEECF42497793FC1D71956E73B651E223929CC19886277599A62497382902720B361C319AC100B0425ECA4C1019642671237183FDE651B90C951CD197993746C1F712DFDE12C4E61E821821217752E697E938C19F6E6633BC062E7236A7B0033C0A60840A07531D3A984886766360BDE404EB85571404EE0B141B24EE8B1D0810F70580A17D4288FB8285BE34FD8F50F48BC82F36C84CE497E8E497F8190CA2A76E07C8281E3E07999341898B7154D68825499A99B518A1433F816C69553720C2AC561EA335D8D8E69BB82F26D0A296C0C47D317901EEA45A24F1809CB81C8CC40858DADFAD8A6509E9551FB73EC8804CF37686BAC05C48AB17EB9F3F255ECBFE222B9B971D66414DFCE3C46211EAE8D9D98548D7395310E1CEF60E05926208DC774E8A89B392FEE06567A4C107E6A65D1D131F650E942CE9E236965ADA4598B826A6A19D5AAE899DD011C8E9202A788476C0F868E39671108D846F7CE524C8D48A9C8FD60A2485A932D1920A8BA2514634922A5630B79B5B0954344F6A057D949ECF4EF0F008243558E603B8F4A4F6EA8EB1FA1C1ACF39D25B3C7CF376B5ED31DC942AF2D37AF9AC56723C23AE96453F80D9F02A17953023B0F7682491CAE14555E58E55833FF4AE94C3933A71E3A316B5D63848EDF16E5709EC2C4F9502F0D1C8B10F3E344E462D5C3EA7950AB260258A7757296E3D24873E872BC14C1026622BB37CA54E39F093426E3E4ACD672778E0B6A4068B0ACE622B1B977EA96DDEE4E4410716DB437833BDDA9C9066A08ECBE6F6C29F967D007F20D2C41F444F467AB6C51F5253373C26E4C08A31D0938707788374AB2AA643C9F0054D9201161AFEE190DA78FC650C81D0F7400D9C4A56329781D0CF239FB3D097C169216E32709317CFCD527B6EA6DA2D7C4CD4E4145393B54A65A1EAEC9CDDC79A9D58B760D028557DA3FED6FEFDADC1CFC93C27D21A72ADFDADA9E21CF346F76710371CCD2B216241146B2468693CD5A123E2E4EA9A58B77B84E9A52A0A721B26169BBA13524CACDBBDC6BAED57415E5D6D6C2B354EA12A70C9F3740851CCBF75F0036443B5290543AC5BD385DA3B1C09BF605B42DA3876BA43EC8DFDA8781BE49FA5253E9D9014AA9968496D1934CA88759B06D66DDF889B458720D6ADC56F73A7C9CBE1757C0CCB3EE34244DD5B3CC002FF221F117F10EBF65C7EA650EA56CE624791DCA22BC2C22202A1E3ED3E2EAFD89F289E51233C60DDA6A5D584C486E0DB02FFEDB41AEB33826E5435E641332444DA9F11ABA46C0A1F55973E716B7CFF0F3B71CEC19AF3D833767DED412976B0FBD2501A3E9D4916044523D372119082107A940B3E55811CD2A1434746A6C678DF58DD247A55DED50A73F358AC8C3148721363487760F8D63CC991EBDA7AAECBAB78C5679EF4D0B96E57040C1926B9EDE301753EFA39F6278A67D4501D255FD54F68A559ADA2CD1ECFCF696F57B4FC5936E702A47E905FD01CCA1B9F940B34E591C557998B700337FFC9715A21C7E9A0065A690A8E70CE144C6A6FC0297CC04AEBD8F931C6987D7CA73621B9C8480EB157A804AB94CDF974599FE71B41604C37A72B953D38E2CB896A1FBBF49893B605253809C4012A23658AF9803F35E33CEE41A2B6CBEC1B19D8F971CBB8F69827CC529F0D583AD372A38CB6C17CE5AD9353A86BECD342196DD86DA3525E3CF7BEB630AD55DE2FFF596611C5A7F0260787C7454D1B219B714746E24B02DDBE6DDCFDD6587EE530113DFC7BB1DD75BFE36EA87D13E8EE941B72170D1BCBF6C6AA0C9C5F28EE473631949C3E57D1A049CC9FB5C103A20B8763EA9C0B155ACAF048E94AEA5CCA1190735AADC1C626FF1113F4863363927E01725F0620E7A325AC55BE343998191A917C0F3EF176B9020EA42AF36B9631EEA3943C57D4CE586ED3B0ED2E0023EBE505D53B53DA9E5FDA5E76283BC26D1067DADE5846C44F1D2FE78687B2B24F67C74605B800A179A75298651213A39B5DDEF1010E08CB3D2F7C96A62BFE432ED9ECF1E0576AA161762448A044E634732B279D4B846880AF2E732886340F4106645ABA3343C7E33452321FEE4692625B5F0D9262BB1FB573521C35990FCF0F126412E4AEAB63F5161A887548844984BB2EC25D49E68B1988C7174F132C18581564F61C77B1780472A4AC3F1F141D3B9D2565597F72201DBB1432AF253756522B723EC12B66D32515A0F791429FA17968DEA4068BD69B62D69F1CEE92B821809A9F2A550B9383229E4BE2067BC20A5852D61F8B66B4E521CA71787C7B2B65649119ADA46B15F4B25A7262C51F7CF46547F616AA748B3D0A7FC49FF547D073697F81856C626D2F9B6EC8E78314621FBC52A854BD8C3BE1D15429318FF8AE8F7E253C9A5F2CEA6871F7502A8ACF9A76E4CCEC1971B3F02835E560916D79B03943903455DA9C20E95EF1863A18DD316707C79370D7699C1ACFA8D1B575AA7C3A42D10A02B0A952793D8328C8A14AD9801DCC0614B93177D7EBDF5D91E4C6786C1BBB77C1C3C84BF26452F245A8D5AD20E49A2A352E43AEF05AB86CC756633C94F73024C19219CC9C88E6D813FD927F373A50BFFA72F7CA2A65E141504F9A6E96CABE72A175AC1CE887BE0C226FCABF83FCBBE9BC3E33FF0E25E1C91234A9B55C0A5BCBEDFD24BCD0CA4CAE132D44254BBC087D0F549891D3E3645914CE44B87109B79712E18051A9BD0B169052FA5F01783EB3DA9FD4BECE51AF3D0F71BA782CFF517911330A7956D799C2796D96132360A58E95CB67CD5B0D0D4FB1C45E7E11911AD64C5073A4B66526C6E5897043B246755E8970B96CC28970F828264DC8230A810F624DCEEC79516BA73A8FC99E6C01678A5ABE821F61401DD0DAA25EC63FCF148AC5C9C1C3A3F83F9FCFF8D834BD4DCF0D122CE4B60F65C1B56D40132D0B0EB6220976ACE41F12EC8355532D66552B462334D9CB89713041BD985341B21D976C2B37BE4338441A9B34F62D940227E11F5F28948035E62C09D91914851ABB2BE973CAF09D907849C793DA1E9263210747B041811A120F9102D6B55D710AFBA83D043F1DCF811B235A5FBD31294827F1E5E21B04932495C7E623A33E43F310DBA4062B30B5A3A8193E809562021F90FB3F986B0646EB2AF943124812085261A28DC9C18F03F4CBB578CFE9E9BEA7E438E72AFDB45E3EAB9514B6544686E311CA881E56013B02898C3A5885B49A93BE1599DB561F4E4A179A8ADBA1FF70FABBD1584FEE5D26EDBA57E0698A403548F8019E5A77BA58A8EA2A8A8BD068DAF3863DA8978446031EAA7B3FB096F4B1DA331268A1D11466E129C15249DE74CF2CC6CED627B5ED07F50B1B2AC712E1691FFDDE91F45BC2D3A6D332B545AAEC8ED3142153D322F3D056291D35E2E9530E751560FC1E7EBFF4B8ABCBA7C33E528A04099784655F867D86D42F8B5A0F74B2D7C85E8B8BB5F0A50A34A3E8C12049604C1298DAA45325634D2DB1942C9DB45A3A184008D53D3390A7E9DC49FDA3A206E88431CDB3A25B0C4F3CC53E40F69E8FF8373672804F07A2483551F73490FC17F295B327F57C0513010AB39383D909BC5009BA5A4F0E9E3E559E19CEE446C7C74627729CCA2EFB4A8EDDBBF995ECF8F838EBEAEE818B5B094B3024938D7F201B04C3B5BFC46FCB171AEB6F765EAF8B2E8E3F5CA9FFF2D858BBE1BAB2F92C87593540F1F00CD5B6BE03CF08EFE0D4B1A2C43045187C3B81D5BA9CF1B81387B433DE75BC5CA9C3AD9DECAC6C1F21EF29EB5D1A7845B1737A690EA62964A4F8D5B2B1FA5963F992B1BA51DB7AB8BBFC7563FB4A63E361FDE64363F5AFC6C6CBFAF52BC6FAD77C5DF91A1BE6EAFEEBD575EB93F5AF2FD6EF3C335E2DD76FBFD9D9FACA78B30E5EA6C6FA0F8D8D0B1083AEDFBB615C7B60AC3EFF6DF9A2432622AFAF6CDFB6DF6F3946C66F6E1E73BF0916B52989F62D9A63CD3F9A5FC9652672E37C7B4A7BFAB4DF2C39C70C045E60FB96C5FD76F3B9B1FA85D86FF737EBF79E48DC7A4A17FF6F7F2C15CAA5A387A20FB37E6FD3587916FD3AFFDD7509738D9A7A0416D54B8F30551E59CE7CF548E8DDD794D28032A4BAC3EF3D06BF3BE863D8E4B517372D677C6DF3C79DDBF7EBCF56C0175CDBFCA1B6F91FC6DA4DD8D2D6074023A090BDB9637D3D209BA455FC1587FE87739AB21C2ADEF25FAF568C6BDF191B976132E071B91E03C5051353DF58ADBDF8BBD871A018D99FD66CF5C1DC60AEC8ED8DDA8B65785650E47038D4366FD65EDC30D69A428302B4761D3F73FB717DE579A767257864263621E513F0AF5757714A2E3DA9BDBA03E2027B871FA5A097F9515AFFE661FDBB97F51BEB2E5D96ECE6EFC20EF23A985032AE5FAA7FFAA4FEE53F777E7C0A4798F1C3AFC65F56E197FAF28FC6CA3FF097ABCB06A8ABFB378D1717F18CDBF8A9F178D9F80F102F5460003076EFFC9A06089193437691886B1E4F0E08C152B89B10229B1B1F568710C36A42D40E42ACDC693C78ECBAACF920B673D66595D8DE61F8A99FCFD9D52F44A5987BCBC60F5FD73FBD0AF8CC35A1C96EF60CA61174F48E701EF61738B86E379370959F3CE00B0D075DFD8B97C6AB55D4F35B0F1ACF7ED9BDB75CFF19B458CC064FAF02D162BEAA9FD04AD096599B3D9E9FD3DEAE68F9B30CB3EB07A8C2127775582E196985A58145689CBEAFCDFE9E66D319DA10C158DE7B4B7F848B4F1D3FBA6F4ED3A78AC50FCFE3CD1CF7EA63D54EF58CC2B895E486AD92581E03FAECEF8AFAEFB938FE6E4EFFBD432403BB37D48C4179C5A4816255C7CDE21849F29BA3DFFD94AB17EB9F3F6D6CFC5AFF129C145F4B275F8405E087553247B4531FCF82471F7CA3AEDC2AF8E451E68A5E9A1CCC0C51092547611D7698F01A487BBD8412B237D8E33A2B2B0D678485E6783937313A21FB7426675A402056EF540AB3ACE342C53B7071AAE26AF6691548AABCAB15E6E63140C4A251B90916DC011D637D429E429891D350D251428985717AA3B764C81810C75D412B28B1B896C281243F56D58F05902E990FAC330F839833524D25DC9BAD0A9D245DDE6C0E8012DF79EAE2C2F463678463CF497AD4224B78E290B0DBD816C8BE6002F97F67CC433200FB8BD47AD26714AAF5BA72D525445024E624E61F684B0327CA0BF9124A83A8BE24DBBB91CB30A9423114F3B49661929B00B1E7B9F7029A6F4967E9524666CB38A226A1CC837558B45B884BF3055DE327A2929F2D5AE9243916EF4B914B0369D6C32BEA333454B512859AD4966148412DD3418E8649DC6CA7A528F7C22072522B18CC4AF32A3CD30571B3C83901494976B5ED31DC942A72F5824972081EDFDE12D4ED5E400FE9E483E3AE63B478AC22077F74A59612614CCB8F6657124CDDA64A25F8E8E8D807AF043E4BDA79FDB484B8E9107590748F9807A14F4B187D201EC10110298B6363AC3D92449151A50A4163F13B5129509F11916416FD0334E08A24C77742B6763F4C6D910B12377DAA5AC8072BC959075628E45AFDF82927C63B44CFC362B3ABE75E01A0123DEEF1743ED2E3F1C0495933B0A30F2043FDD1C5FA7F3EA8DF03EE2EA6C3D55E6CEEFC6DD3B156014F2502D2EE5349E6C19D82165B9383EE77029D53AABE5B5C3F8C853AD611B53E7F4D7088C215B1B39933B27C44C8F3652CA364F38873AC7B5633C3C0CC6B142DB14C2EBF23298175B9B07D253B2652180212D561DEACF374C4B14D3C367DAB8BC97E094CF9B0A735DE7BBAB376B9F6FA062416BB2E6E3E8D2DFFC0957C617BC76C6D162D9358B6B228443CB06E0EC831BD63E892B14DAFC8EC16A9DAD2AF305643F32B23D0DE8DFB75155664D435690A978015D979FDD9EE837FD66FAED4BFF98B6375BC934ECD27B3AD81EB996DEFB0E7C38964BB08262C993CEFD0A649736D03CE9B02A7074F1D3C72BEBD27D20A21F989654E1BEBDF63F6DC3F20DBEEA7C6FAF6EE9DF59D274F6A2FAE428E015F0F3CAB6CC96656EA36FFBA7DCD78122E7C1E3213BCD60FDE6D6CDF6D2C5F37D6BFDDB9F9B4F6E26B48D7DE5DDE6ABCF92C5002C3E143B923634750DAD9E2D932F2C53B360D995C02436421726E71C109140ACE437EE0AC82DBB2CF3405C6947F8732F028F320B6B7EC2BC3AE320FA32366AB2FE9A75D79EDD9A109C153947EDA95D29E9D18CE7AE676653D752B6F1B1958D97B6E11DB34E29EA86DDEC6B3E0CADFA1F440EDE5D5C6EA3DE3C6E73BEB0FE03870E934F3D96C0AC5F5D4CD77603EF97DA2A91AA79474B254C8B047DEA1EB89ED6237DC9277389411C54D02AA3553BC715D32AED957B844EBBA1A2B778DAD4D9E25EBBA7EEBEAC21430782879C7A4DF465B5D977AB2D77DB18ABD58F4A3F6BA01D4E1746156D656BEA92A02CEA0E7C6F1BE07AE976B0735FEF2DAF8E1BEF162DDB8F637EBF4A8BD786A6C5CDFF9FCFAEE37DFE339B0FE377E16D5EFFE6A3C7C8DFF6EFFC36048ACF1E35FAD6F410CC5B8761F2E18E87C8850B1A5C717E0E95F7036BF7859FFE573AFB405655B432EAAB9216765A2C9C1B1AC3096E215578F13B1BD44BA33DB16B4D2E23ED7AEB7EF8969B6DB956EF5DED2FB7071CC699B815C435DC3BF1C77C25D1827E8EC7151DDBE6DDCFDD6587EE598A3E8477B7B79D8EFB85B422BD2B12D61F93C5AED5C350D2E4F413BA9570A50EBC93175CE8552DA305AA5B2509D6B73D5D81FEFC0FF644564A53557617382E8C4610C06DA97D6B3A533EEEB5C5E6BB071C99948C6A0FCBAC9C12A6CADA286B66CF5632817C77E39979F81EA7CEC5C65F15DD17B9E9D4D153B112FEC9729BF0E0F60CAAF6B662FC01118B23DD91E8B1872C41734534154ED0B7DDEF958606AC1A9CE0C1D0D3BCA9D9B410404A0AA5002CD9CE5AE32FCE3C462115EC82FEA65EE28901B496E13491848A1D289BCA88DDC3FC1FF3D58653F938A5AF6B814535E5C15900509328FC68A0C550404C25161C1DCB4AB63CA79235DDCE3BAB8CFF3D984ABE1B8AB248788EEA7968267A788751369B48C2355346844CC3D91E2D6A352E8733C7753307D8606132E73A12585D7511001F43A5CAC786E300044BCE3FDF1D95F49AD6022A77C5283659E02932544596F16B39F5B1A16A73F4364DDA096564754B94323C21F7B39C7AD474FFC8EE2BD45982456084F44579810C6EDF1EDE813851E3C6A72A83BEA000E1E21C1D81F4469B01F6A85F385D2DB8BBA5E2E3946EDD8DCF058DDCDEAEBD1EDE7836A3BA2A53DC4CF676804B8BD7B95A5D6CBE0B3A6246EA0D484CB1A4273BCF519A32CAB683E02A30446DD064A870A2EF4E869183BE289B5BE16029E36A1AD96C127E90C98263C6626635A64FEF6EC40F2480D8A7491EAC731B5974EB703B447752041B410B518B03DE1E68F3CAB0CBA4AEC6C7D02892FD0CB0A7E37366F43D27FE6FFE5E04F426F89D3A4923AECCC43D7E16D803FC895A857CA45D071CC9F26586FDD2521B500A054858E4D41F2F076B40C3E29814607607571FA342138A0877589D399D4DAFAC898CFD1DE058F5ABA4B6711820BEDB1EF3909AC6D5EF743702384E0AA2267C9B275ADC4F5DE316B51342D7A0CFC41088E101C68782D5F0D68F0F9E8B68E2238AC1AA9625576A8C6299D9C7BFFE424EF1B590F5874D196BDD6E1B60FA29A131490B97503DC6DC6B5C7B5D7F7767EDE32BEFD54453752BC94E2A5142FE5C9AEC1607D0BE4218F1B640C57DE3A3985B30878D1E27260214E159D4478AD59D0C09ACE54A9290F7F6EFA7C6D84D708AFA501AFD5BFBBB2FBFD972C4E7AA3F1EC5263FB4A66143C6CC64F771AD72EC2CBC64F6B1CD8D55E88F78787ACF7557428E1BA5429CC34F8E1C6B3506D159C14AEE61B583EE8E4B97C09DE61614D5113867A72E05C89FEA90A1DE15A58701F69C562798923CD9E7294C4FB24188A3DAB7DE4D069DD8013B13F557E9A31B9F50333C5C2CCD99D9FAEEE5C7C695CD9E2A6B9B17D69F7C1D61E7E687E7AFDFBE1FF032530E13C83B2ADB5CD9BF5672BF50B1BBC3671FDE6E3DDE50B8E13303BCECF3FC7B4704D19A17C21E50148CC311F377EA2C03DF69D7660B15274C8CCDED21F7F2E684B7DA23578A785DD5B6F404770AD817D1B98DEE40A051A09D5AFDE82D64FD6672C809C1D19F5541F20EE981A873FA01C32FE982E86AF55DC3EA0D3C542F6D25E356350B99A9D4066717747217B57AF9AECE8F8B8A8056FAF176D61E6D6B20E30895601ECAA7E422BCD6A156DF6787E4E7B1BEA439F15675F36C8BE6C7771FD406B89FBFAFD878D8DEF8396B8F7ECB6301C4F271B97410D454EC7132910DE662DD4AA211FA8BDDEC672EA371F1AAB7FE56D035C15EE8DB59B688B42A3B5D5CF1ACB60A57E898DBC6CDFE22BE1FA169446D8D9BA55FFF693A48BD9F7D05437A872BDD317DC95CAF5739A3E552C265EB9BE97E492CAD44726BF8436DED1E43D56A8EABF2BEABFB767F6FF6E4EFFBDDA79A97600C8CBE10F406504CF4A0311ECB0DE3D27797960E56AEE991CEB5CE772B301023DCAFA182E4D0E6626582BA2D64FBC5DAE00ACAA2254D5CB58C0DF5EB803FE0C56531D3B25AA7E77BA0C35271654BF4DD5DCA78B229A3E5D7C071CAB2DF5D961E945333F47D9F64CCE04918E9773998CE84EE578398319CD3CD80A6265DE47AFC0B279747C3855719566D4CD286DE55DCD5E823F37C186C72C279317C0C4D1DDCA993D08DCD025C4D5F9595378668A5ABE824E547BD17FF8F34CA1589C1C3C3C8AFF738BA59F7DCDEEF6AD3041C2E9EC7E871B77FCDF8095B1856112FAC482E56F97752DDC45EE017A0F1DDF91F0A4B8C73468B17AD587C1E33752C577DC9BF00424E9854A553FC64AC68BB508C698092D2E24E96C06426F5B9474603C40829124DE807B9AFBC244D128A95A67270E093B9E5224EC27CA0BF9922D0C2A53F85D55EBEA95E3E5356108BD2C85AB222B9388366DE93B73E0EF39F492D6EAF268CBB49E1584E63FD09606FC74273BE1FD72A255216FB01D70B05CAA968BF92AAE613323CCFEAAB0441C2F49147E380634DC8DB935CCBEAA8ED238E2895B62C64BF3055DE3D6A2122C8A56C05E6E0190A0F788A0073FA5403665866A52FB540076871338124E27912491742857256569EF53EE90CDF6441BFB31D11FE7C969BD7C562B39A628D8F6651EDC24A193E8198F367EDABBF0A8B9879252C9267472AC23FC118548645B852EB2861856C79CACC9C1D3A7CA33C399DCE8F89888242CED97B286C6111A36BF92199F1811F49AD0AC21FD40CEB14F3C5449EBE90B736FC62A24DC2063E5BBDDAF7E08CA0D12A117F3590FB3805C611603F8882DF99AC717F36C5F1CD3A253B1569C4D85F9F1FC5B073FC0899F2ECC42AA714B6A1D8EB24D49D4D619548B16C74017E28B63BCBE655CBDC16944C01572B18788346449379186F81E342744CE57903289DE5B4296CFD4F1A3FB06D4B48CE21E99D58A9AAE11C3A8A9A21BC430B2395352A2CBE53BE9A45EC1EEB96D368C92F5A0552A0BD539C755E33E587B887147642240324A34262213A59A4C74F850EEC8D891411645364F6C221381B0171943223BCC4823F8C789C522D85CF945BDCC1DD82E66647B2B2114C5C256968847E1EC89ABE1826F220D38F409E0639DA8659A7566E8E88D25A2D00C620292E2B63676DAA5984840DDADCAEE231F2CF6DB199DD6E3EA98083EA48B7B5C846324EF740072F77300B92D7AF68B37258497D35D6D101133316BC0C4EB940DD72529F4C133602EC8A24E490D965833246E12166292E21696116357DB1EBB231C69B2B57B604214C978292D80DD74913988E9AC1ED989270E6967CCC6CE2923AE403EEC3CF7DA091FA75596C3472706E2F746050D088DAD9C1E9CEB08D56E7C482A4D146EB2271CF565269C4C11935C22BA5FCABE32C2FCA33672C9C8584E9D5C32EC8837C5442EA96D7E5ADB7AC62B97B9AE6F3E918D422232755BDF8127F522971C3A323235C692C1D9D6B0ED03E73BC75DE9BB8200E2F224C71816E392E5A2C238C774E2B83DA9D8DCDD297F04A15E24A39D389203FB8AC533C4EC3AB95A2CE3DAE22279F8C56D0486F61B662423DF30A228932944F63D36C2AA773637CCE878A6DDA79954353F9D1DCE99DB4B7AF161E778B263E323AEABDB445DCC857921DB3B62C307A48779B22E6CF38868CFB8F4139485325EAC19ABCF77D61FECAC5DF6DD8E30C14C05B78E11E6D16B3BAA4B0794561517E5D42CF3B68E05F4A8DB254E01E9575C75BB3299EC443B9D6AE3F8FDE1D8E1D3C78E7EF0EFAE79700CC8C6EF333F1E6E0141C8CDD8DF818C6B4D02CA80FD12B0C83BB7EFD757D68C178F7824060863D8AD6CEBD79DEF2EB8AE6FCE5753FA4C72A2E41D47ED2FC9FB9ECCC011C60C7429C23072929C8E0E7CCA796E3350831E2443DC75D0CAB7B679B9BEF5A0F1EC172C1CB6F2BCFEE2BBDD0BB7E040345E6E1B2B97EBDFAEC1FAECDE5B6E3CC2CA9E0224BFFCC5587D5A5F5DABBDB90B5F77ADA7B598F045CEDA040220E70636361E8ADA6450746CEB61E3E673E3CD1DE387AFB10EF68B4750F7CF58BB6EDCDBAC7FB5013546ED7261550EAC5FFD07388C4515B34B4F6AAFEE80BEC012665B78E5FAED67C6CA53FB994EDC436BF312F7D075E4B86986E0E62A2F96F47D2E25645772D3ECC0F14006EDB7DA7B4B53FCFA48619C81828ABAF6BF2A33E55959FF8CBED445442BB4E768AAD10A552453CE1CFCF03C97CE76DC41CB5096B90655867260A9CDDE53BAA0780AC765A5864F7F9CF741A88A0E2F8E8847498C295BA4AA63A6AAA8F10B3FAC125C1FC2D0A0DEDA7806728DE15757051F7B49B66CC6E31354924D7B17A64E89C15928550BB3DA9FD4BE0E1B1116C83EFDD3C563F98FCA8B58DB8EAFE499C2796D969B79F0D163E5F259F35643C353A6D3C52E0F66A934673535AB14B2F3E5613341DDF13214C81155CB1C2FAB9664B36D94E825D9F041ACC9993D9FE75343454D421635691B07E6202F68CDB2A80E5E0F13CFC7F70C32203B743B3374B41C23B12871DF911447AE4045520C5526B3AA1B10A5383A8B9279EF5CA883D431A963E628E89C3A261625B128D1AE6D93359E7644915616A51C72F7258BD2CE79610A2E29428E8F28B78C23654C1BA8B8E6D93F271A99528E9CFB52187DF45937E5D367681EC65B529B49005D890F141D303EA58265F896C40DAD57F5C6A1A13DD93EEA307DE246644AB6DBDAED2D697D30B621398673B8E1BDA313E21D1BB5AFABDD317B8F4C092AB002BBD983B7CABB6A74C085DB973A35DD38CE47EBC63EF8D0C7021EECD519ADA49DAEEA1585E33D4368D20A61FB9CA184266137585422709B2A881B8BABB5BAFDFB52F391B8E953D5427E72D08FE7823ACEA2041E3DF4AF572BD01278E7099005FFD378FDBDF16A156882F8F25564279AEFF0DECAF0CAEEE7DBC6E6A3DDAFD68C9567C075CC003B7074185EAF6D5DAA3F7D517B79C9222BD66F6FD4AF5FA8FFF4035CA4BEFE4F05F12640D75A90262993D63C9AF1A73B3B86005DF7CABB741F139992E11156EFFE0051A1E567F4FFCFDE9735B77124EBFE15061E26EE8D38561000F7092A82DA6CCD917D7529F9F8D101122D0A231050349A87969E28FB4A9657CA63D9F2A2B1C7732C5931E343EA843DDA97FF324340D093FFC2CDACAA6EF4528D462FD50B913311A60834C05EB2B2BECCFCBECC46BBF5364A37A2381A826D04DB6A215B0AA3D9116CEB80C80E737731477F0D255EA8DEF37C3C5B00A2C48465CA8A6A0B5B5970CCE1EC7CAEC3EEA17D4E3A67D51EE3E0FF5D7EFBD4E1A36F1C1DE5FA72F89C4004F4E0D7DE8D7BFF36CAF917F4F99C38FEFAF1D3057F4A3C641983A774BAE8EB893F29084DAD9054F025B79E38D698237E812D5A140C04BB7D5590DB29B2A4C872B164B1BDC7326166DF765832362E08089D6D2F4464A9BD73BEA1433D405B6DB7EA9D28BE86824B0A2E29B8CC6B876F0A2E991CDB3808AD04ACF8B277F383DE175721807979E35796DCBFF5E2A73F41BABFFBC9177B4F3F81160013BD9B5BDD1F7F820603FD7B97FBCFDF2FCF4D4ECA3B0380933741186B7B2F3A5B1904C5F69E7E9E11EBC90192F1018109E08F952663BD4092C087BC616F3A16D4FB877777D95CE0BD3C9ADA19C3DE810F7F77A78EECEFBBF34978CA1CC49B8D481C4D597C5A6989DE58B28FCCB0B495ADD7CF640594800C08D9FB13585B9737D703A764D56F2B0E60E0938819FE15D0C7058A6B2F3F7F066D37FA4F7F7EF1FD7FF37FF3FE1EAEEF37AFC8D6C7C5B795165C295C16DEC0584FB7B83D59BA77AFEC3DD8EAFDF907FBFD858639D62D967B2EB861515782CA7B653E7ABBFDCFD83A63994D895C9DA81C87DBBA6299870BD1D788B61FB13B0E754CE12BD1F21B19764C717914E9833753ABCF76FA4F775F7E7BF9E5E3CF70CB1ACC5DECBADE3129BCEE972589722EE5EA5C84EF6342F9B2681A651F6D6EBE163AB484CD4CDE8563624D334E9D6DEBC69B7AD37107C6D83F529F18BB4907F167064844BA64BC9B7C445F2926CD75C858719D5A1E7394862B02C8DABB58585D4DAAACDD9F4B5F0C471E67736DA1F149795ED610028EB0B7D568233488D4DF03816FD4CF0217DC68AF47FD34CD86B375B979556FD4110E3B1B92CC8375B010C0F972758E4168D7D1C0BE1498DB79B4180F0D460B4663FE9D9429F1782160272E3327197D4819FDE9C6BAD6997843DB9C586EAFD75AB670DDFD0EB31A0E69F2D1E7C47D82600D029CC9DEF1C567AA2F066C345EE7135C9B64E9B1093832A3E03542F73B64E9EC0E44094912E88EC2125DE4D61B7AC738C166868A9D39D4C84FB749FBFB4632F618C6BEBDDD7F7E57126423320A2DE4DC5C20F442E865B1245BBB99A297BC76599187004475C1A82FA3A26FE2941B45F38C4EB7CF459251C8B1F8589A9C9939DFF928BB32AF4F1932E0D4100C491CAAAA258301606419850C0D93B9D9D2144257C1409CAA27189010CF9FB9512F1506CA43437086DBF7752F1519B81C920551BDA27065652EC6251C697180F28DDF02FC70BE4F1E6140B3DD5A9397E599E741E06EE60DDC7A0E429E969106ECB70405C098AC6A32214F12F0964C3A132FFDAADAD4D1C35904C4A4B2A2CC31122463C5D9543C1B6EB26E48860F41429D764D7E4D6BC82BDC06D3C3E1C9FA93A6675CD34ECDF9C362548B9467EA9A785A9E2CCF0AE2A8F470D7F0CECAD4FCFC304AB67B7067B53CE33F63D2C56FB531A15D6734780768B2CC48CC73B5BD638D228DC591964EBF1D10E0DD8477FC9D9D90D88F7C6A8AD2271A977C66FB52F44C7B0FDE03027AEF8BBBBD4F765E3CFEBEBFF3C388BC73B022BF7BCA9E035F3031B8D4CE7B3ACACC58301A48620DA8FDE599C9C9210360676C135DDF3EDD5E35D781E0A38E78A3CD35873733A9A9AE383E948F0CE50F66D447C2164DEC1BAF92C43EE24D8D489DB40F61EDEE3E147358996D8F3C81D57DEF479CBDCAFF56F7AFDF75DFDFE60F0DE7F3FEBA0B0BCA7E1AAA1507C3A43416FC0D1532ACB055EED0084F4FCD1D39229CAD8FEB8275E8332C77B037496D21208AF14952277D926C311F284FE05CDDED2FBDCF5602E36278BAE22E38D275B8B653A7AE43D7CE83E2E040BD66C018839AD1E8188DD5CE818D8EA6D75AB5E6854EA373E00F9B6FC2AF4BE2579C680B42057CE9D4C6FA7A4DBF4096C6D23F0749AB105FAB10DA57A31B3C0156FBBBA6F17BBB992E1BADE3AD33EDDFAD19BF9F98407336ED57BC819F21C3E5863B8A6EC1A1372CCCA0D8C96906A05DA444BBA4A2322DE3E892A40227BDEEFB41B1532240748A24A6CA32A5859FA4626696292D00336627A998830B01D8E932F37C9012E1BC50B17F12120A93B6D10A22F993E9FC0AE8A66F68BA23CD1121EE502D4350188DA83E75DC9CE3CD8E85A548866D359C181E3A87E2990FED6ACA6355D5D65170C386FA5CF7DAEDEEF3CB2F7F782C4192B8210CA3B1B0FD846C9B6C5BD26907CC42C6734C6759A2D38E3E6116E110593559751EAD3AAF7208197C67DB47A8EAB9687A058BAF8878DB430153C57508401D9EF370941526D9FF78C4A0EA04B1B0143451F66D036410AD08A8A38CC1ADDB3F8F9BAD051470583549D5D30D30BF8053F30106AA4E964181A8E3BFBC3880EC2CFDD6D6B01B609257B038464D6F64606739543E442A46F091DFD11DB40C40875F38CE19B2794CBED1F058E86D6A72C5591DC6D37E56860BA1B5D352B3B1D68215CA7A3C0D7298E18D649F21C6B8482D51C56AC03E9F0798691C5CD1D61AADB7A1F61F49522B8392649EC7DA2DA303AB3300C911C8841562FABF2455B6E3E606C9CE420C97E564394125FEE6FFF5FF71BFFBD347BD1BB77A37BF875EF28E78DA0738DB1DB70F4A8EBB0F45829D3EAEDCE72A028CC6E7C2548699DD3F15FAF66BADBA771F2DCCCDC7D955F777BA5B4F5EC2E884BBDB7B8F3EFDE7D64D3E46810F5AE8DFBF03A395FFB9F56718C9DCDBBDDEBDFDAEF75D1CB90C47D33A6A2C966CD5D594FB55D03ACAF0E65BEBA8BBFDB7FE7B4F61454CC272E87DF009FCC2D755590C2F87C2F1D5AFF79E7CD3FBF0D6CBEB5F3B361E8C1C2C19D7A0886C868AE69838CA13046C62A9206CC7C342E8C9B26D2977D4A53CC1200B62051556AAD38ED8984DA48ECFD048F8F295E662B33F41CCF3874130B938E31AD221E0D6C23D75AC427F9749098B61EB240FEEB4308839C1E60CB86B88D4AF8364EF4CE14BC65B419496D74A7FBE93FB85B13257BAE2C5E3CF7B7FFE7E5FA42BC2EC36018E298B64C5E54BFD9D07FD9D672F9EEEA0F8960D1C84F019007FEFAB3BF08008D0FB37C1CEB76F70400974CD1C5EC89A68043A68ACEA09E0E7D2CF0E2772872CD63350CBB9A10E683B2E1AE88AA981F648D925CB9034D04FBE517A5B8469572799AECE22C22E96662B23751401771E4A961F295B9E9C06FAF0C6FA46535E401D4F537B7EBDFBED77B0173A8CCC0771C948EE919EE782E3AF711F9EDCED2F84499308BAD3A871666E24131A45042D5000FC10D9D895A639BC6D523AEB078E3C6E0E6F23A531B8760650164BB50DA3CD9F55A3454AE3020D6F93A79AF3A134B6C16D92159762CE0A8D1674F32844B57014D3D5FB56564C561CBF8B8C55FBC9BB15EF670D3119F23819320D540374DB6463FF2A532CF581BF2C6F343527DAADC361565264781A90FA3940FE343D44512475B0029A7D11DCB58777A08A918A19A4DC3336E22ACD52A24314C1B00270622A54329F1C69C0A9C17622CBA2AA5A18187A25C87D18533F16F04CC9DCC0FF5ADA2012066F2E6C2E96CAB393E5043A3788A2755E9C72F1C800480900A78BCCAB65EC69E864019CD65D7D0E2D8DAFFE9AD6583B6BC047996EB73A6F76C2B78E10DDC2DC446F79CA357115705E2C621845D183FF1C7C8708CD5948F28B85D3DC31688B608BB48787D05D1264A4596629CE3273F16649E62B9FF49D41EC48F2C43CC81349E64B7279932C15174247225B159BFE9FA6CC97A27E20885982FA5432639C3E0AFFC5FEDDF883A93629EA5F03BC90458533F1A83FB4CB428BC87D3948EA531DB6CC2D1AFFEBCE3151296854CA502A1E884A418BA5411E9079626EB1E104B294467AE5F01B58330825A819752564103DBAE27AD2C33E1DBDCDBECA8A7057851E96906F2E902F7A5FC9047967D94BD29DC0E67C238CC966CDC36D63B227CB936CCC9ACFCEE8A540C0695B15E48A431D16E92B605272F7DB67BD2FDF8F32F35A4CEB968C763747C741C3A7E4E46A8BA529102331A0226E810FE08543CCDB043F87215CEFFDF51D7F6DFB52B01C18DEFE68EFD195DEE31FFAF77E8179D7DE9B08C134A4A3FAB72F41A72C51EA7FF84B77FB6E6FFBDADEB36FE1B3D28FF071E330AA7AEFE973987DDCDFBDC55FE96EEFEE3DBE85FBC4B31BFC832F9EFDD8DDFEACB7BB8D7D13D89C6DEB598AB7B61EBB5FE743E65D07B317F1F1DFB8E73A1E5EDC7BF4F7FED39FF10F7D71D7FA7EFBEBCE0FBEEBB048BCF9491AC0705A69F1D5E5CCB43931D491BD8A257847631DC9510414FE7C60918AD3B5A67FFB59BA522B1BD9CD4406A021BC8EFFDFC0E74A33C05D5E7914FDFB9A5E3B7FB6B16A1B03FE2A7FC59CA42C26812FE93032BCA9D130706B331D3EC187C684C7D7C5F8009AE15EC054C8BBCCD831295C18BD69E2342C7C0981A48912D197C6D4C9572A150F8B11BED6A6932F4FFACCEC3ED4D6EB9ADE41A464B43113C488749D466BADA9E177762EC296C4FE71BEB60AB21BA6C2F108CE9BDA198B8417F6B3C05634DAEB51FFB26EE7FF85FDD3E3A193C7989FA13BE744EEEADC94E4E5EAF4AC88AC9C474F4F9B611598D5AB7AA3CE2C4687C7961E695396BC000B3D8BF22F3EB7A5A9D5743456BB81C2AF671ACDE662E9E80CFE9F5FF358323D0340B62D02502D360F888C034E149EA80CC5AEF00B38DC613F95A6E6B6DF8590B47BED13492C00973674447119D71D5C412EE7CAB380995705A8DBC37EEFF61057278F3B0519B24D798CE888F91E1219A72A328E3E581B510D99309970E68822AF3A7939E41E4BF4EC614CA9429801E0D8731E8E747D04BD56A4BC4F5C9DBC0C0533E84C9C141ECB563894E85C3C8C830F59785B11017BE807166051D1C22D55E60FA1515435BC0C91925169BA35D876AC8D8A34EF5CF32E03BDE1570969DE6B8B236708D00173DA7B86EC77C272160B33710C459A7756CF62363EB0F4412AD4CD8D97C13F4039494F61DF2FF94C55588B8021932111037EAC81A18B014FCA7652B6C78FB9318C95AAC77CA8D2F90BC22D452E29DB49D94ECA76C492A1336FE805AC7594C2006B8AED73A1EF81C7AE43D6366B6AD458C65389C7F6A1177D405495FD09FA6213479E0A8EF2E99E48D1BB95490A806D4AA968017616706A3E356F55A906B4B9881DEBF6655927DF4D5A0B13A4B8627752AFEF67F53AA1DB5CA05BD877E2AAD769743386939CB1EEE0EFC497DB1E3047373B04ACA61E5BC258CF40240FD8235AFB1419EF3F343E472842EA5580A6B090AD7E0E0AD4ABA7DB46AD4906872B1D0C8E66382F68B5CE88FDADE5A14DA4954E0A555793E848779114AA260B33ACC89414AAB6C9DEA672D4292EF553A8CECBA4A8D5E9199970B58CC101DFD348A15A1FDE3B8AB47D2333F7124D8470BCAF5A5C8B6823D624E72AAC3BF076A4506DE81DE3041B3F4AC2BEA58E59024ECF8A632B5461A7204326791FD8802C7190A221479EE42C4B7952CF0B0CA949646D6510D34014A450359B79E6163D7B8805AA6AB9F2EC8C5513F79C8723C35D1885AA14058F25A52680494024077B223D2AC9418A55C9DC10C09F5D4ABDEE9968DCAFCA0FB348FFF2CF7B4F6E74B7EF03CDD4516BF1B902BB73F6C1C58574D732A00CCBD21CCB32A2C48754ADA46A8519D447B433B58DA68163A7E78F558F1EA99630E210CDDC8B83FFE22E6452B5B212F9E8AA56828CC7DA2D03C553041947AC74E31E4E90912639BB8AF42A21A38B334B7A57D2BB92DED5A6D323BD2BE95DCD62675C081D896CB54F74E3A4776D616BFA33268D60F808A9413D2BDFD2204CFE532F2BD69051B0423A301A030666C0A3A649CE902671CF42B3671C59A9203F3ED561CB982C645C6DCF246739218A72F3949B8735EF2364A1B87ED4ED6E3094DAEB3B288D14228DE48AEB490B4B5AD8FA32D630FCE70A53BD2B66BD0B4B8C312739931616511727633AA061025AD8EA04778A420B6B9B41ECA895731C4842D827DF28BD2D02115427D914412B2E5E2CCD56469AADED8FB6F001F21EB3ACA1E7F011DDFE5F83A02D4921EC9B1D4D5FD66A75A577B548338349044B2258D77E5720F325112CB8CE48036249041B55043B55968A6067E6A64B2C99E654D28AA3392A35C5B6B9E845988F31AD60BFD894F124464540EB3A367BAC10CCAE51D220E9A899E440CBA2FE079C28DCFE6C8558B174B1B8B8E00A72A98B25C3CEE38CAC74D6A4483577AFDDEE3EBFFCF287C7926803370451DC909638AAB89F906D5B21695AB9EB740CA4E04E3BFA7C57F2D8910808712B3264D5675F39FC06FAD321C5C122096AD9F6B15F27737AF809AAB8B7016ED8731E8E64783AB2D92674685B06FA99A66BF593B535ED90AED5CEB138D3381877E4ABCC19EF6BC30A088648360B4FDFEA3F19510321C3AD645434F29545390769E42B1FF99A8CEB25B2404CB20004E1BA48D4487819A7755756D2309DA3FE9AD6583B6BC04759F2BD3A3F5B82CD03DD9C79840F719146BE5A99C9C4D1158963D102A1DC0EFF1D10C2077926F7C857990FA291AF328A1A0143342C613F51C5B1040CA96B4AA3DE582CD5F4574E2D89FDD2322A17559624B0248125092C49606DDB0E496049028B49844802DE3447BECA7035868642C5468DAF189CEE5C3C1CDFC163A483B0D411F1E0BD66A4638AED4902CB02626B1751977C88E495C2B415483C5D12E58C6B584886F5E55E7294641099C0B885FA8C2A9D018531C873CA5882AA4E16AC89920CB676EAF96E3FE1E361F36752AE1403A97165A9CE0C967AF7F2A5FECE83FECEB3174F7700A7F76E6E757FFCA9BBF564EFC1A3DE57777A376EE18E6324B0EFE0D710086715AB0AE6DF606C856A108EB79CD4B878AB2DE819CD3122F0DA5C7010901250E34E49D4B8DDAB577A37EEF5BEB8DBFB6447B2F248934B9A5C359ADCD7DA1B3A191C2E731A4E8B890B1A4EEBEC5647BADCE671764736174BE54999F20BA0C6A1B60E5CD90E5B456D4CB54652C736B53316B927EC785988D68CF67AD4BF4CBADCC475B9331CEBBA75B916656BA549BADC428E570840D20C3173DCAC7A1E1B8439926E2789407ED5A78E6863DF8A70711BC8FB9010B2E2040A8168C57187D3CECCCDE456714B861C3F1E288C3B8E23AF9D251306E86DC9C681C0CFD1DFA09977DC121D218A7DA6A51D53CEBB8750A0AA9C1B008E3DE7E14872A7A3B255A3A51D53C31A05D066646B01A7063B4761780E32AC4A0DF011FD90CCC25F6641FA5B537F2B03CAC9AD9F9C2973E3625ED5EE1A21022378604F2CE40C107F777F8DB0216D2E9A35D1664F345A9A82985CB57F2A0CC73172D31682933427391CE982D1543EBDDFDDFE9273C580BA49AA5D52EDC61775A1618551C6E42FA8B7D48634B89654BBA4DAC5E26514B5D9416B1DA530B876AA4C19811C4120CA08344D0A210DB5655D62D022780B22961C129D63ACA27E3ECA4852DCE2B06540373EBDE1647D03A8842413A931661FC5FC3C491A5D2A4B317F8E36BCC2A49848468B216EFE824E45325A42C53972120E2401BF609D0C7F90C416634C0B0B465B9C9CD8E7601F2520B19D76486C415CBBF7E8EFFDA73F77B73F23892D98EEA001E4DDF75E5CBFD3FBF261EF972F7E23896DF212DB53676BBA46FA5A7414A4AF0D57EAC16DC71B7A474AE99D68748CDF358DDFBFAAD7CE9F6DAC2EB56ACD0B9D4667D9681D6F9D69FF6ECDF8FDC4C49AF43DFC24992F375F9A7B6B26C7C2AA73495F3B82BE768A6B26DC8A59D9805B9853281B875B9E2AB3A33938CD4C5F3B456A185828A48691D2BAD311F220DA88A9AFCDEF2050DC8D485FDB31963A8D109368124DF5A567C5F1F5B5B29E1DF918434E864CFA5A8B800E2EDBB74447BE182115218A8C11457E67D5CA207772BA9AF963D5A347AAA522B86B0F2121A382B5E73C1C19EEE2E86B659E772C0D2BA0BA41E4087B5921B220428655C9DC485F0BE867C80C79D2D79AFA5AB5EE9AF4B5A1320E58C0B1C21BCCC972EA980EC6AC771AF5B466DF1236145C92C43119E96BC3EA6BD5FAA702C5290427474CDF62269FE06407E5DB8A53401945CA012B012E3AEDEE402EAE2DE96B495F4BFA5A9A8A6BA34D92BE96F4B5980D8F44C6E3FA5A07A92ED1DAB4AA7D1C2FB7632C83D84ED3B5FAC9DA9A7648D76AE758E613D8165B4F52D10BAB8D2028C341190E969B3952C8D90C896738423B38CC797949CB964624FB131CEEC5E22989D5FA26CA6E84F24D05D95329BB51D329BB5132C7AE710EB83A0807221C67F7301AC82BEB759041D649919258ED9E447839D49E24AB0862619094C4184D5B28315A4A9873B21D3CAB0494C433BE4A621AD97B6A09B72B3060D21337164B35FD15EF0D69EB6B07FEA8699BEF1CA89D6F1CD0B5F36DDD3850AF199049A919A0AD6CAC760E08E5654DA8320FFC61D3A5D35C3A79FCC09A66BCD9D174A627A699BD368B7B7EBDFBED77907D1A25A126AB24850E71B122B9E0F86BDCAD43E4EBCFEC581E9A50683867CE1E06D13860E2EAA4BBE6375B116DC9C4820B7DEE78A6DEF03CF4D7E02D204DB10BB447BA8BA429863513695A30698A0335C533F332F17079AA22931A83A6587E7499498D394CCD48538C170276625C380F7DECEBEFD478944C22B6CD059AB007810347FEF99FD90BEB8EAC98746C600332209A9E15C7D714933B56CDC64BC71AE4F14022899834DC719C99BD32A911210A42148CCF92CEEAC3303AAF9A6239E41E4B2D9E87B4A0AA3C17E08D3DE7E1C8751746532C45C163695801750ED214C382B04A0B91452032AC4AE686F89566F6D2CC5EC020A2ED0E96608D555E1D3056DF02FBD85C2C414B4119504E6EFD1083203683001E9B0E4F2B3D4D3161432B424E1C9391A698110A18AD60A09E1F78298F7F2238792C47B312C00D312A8F28328F786A3E19515571165853744D31C14932B7708DDCD1DC5CAC5BD21493A69834C5A429B6E53748534C9AE2989AE2B434B89411C81104C2A241E65DC628236065044649EAA75EB82944652996F896D20023C6DA5455A2AA5243EF18271A2D4D080DDC32032132488E5BAA2A9113E0D6025C71065927571A80C4B7FB5B7C4B4039E740191C485CF1EDF953C685A606BE84A9582A9512DB60B9A2ABA99D31EC3E167F777772B4BFEF9EF031F06F2BEDF6B9F59A7EEE9451D30DF8638DFA626996F9ED566D1D44116F9F6EAF4E9541C3313B3B39CF4F41FA9132D6FD071FA9962BB3557EB8346FEFE529DB37CFAA4305E793FA1FFE15FFDABAD4BB77B5776917D5B4DF5DE3D3797B9FDEEA6EFF97EBCBCDCB39CAB472E2FA39594FDC1BDB3B65BC26BC7B18512725CB5B2C4DCD29D1DF59B183F75E45EC31B6F7E0D1DEA32BBDC73FF4EFFDD2DD7DE8BDC5D084ECE5CDADFEED4BBF3DF958B44F7FF84B77FB6E6FFBDADEB36FF1B39EA7021FE10FE65F5BEFEE3D7D0E7383FBBBB7F82BDDEDDDBDC7B770737B76437C70FBB397F0686FBFDBBDF20FFE50ED4F1ADEB2ABA7076FB14F753FBBE3FE08FFB69B57A5AFC357751FBC37E42DBF2F141F1C7CEDBB0E9B4BDA7E86AD742B1168D9420078E196CFFEEB88266349DE07FE46EA0D024EC9074FAD247C92584EA91E280B5DBE9FB9297D9205F204FDF4277C57E62A2E75C4CCECACD864785D38B454566E98A1BF064DC75791BFBAB1A281F6FE0888F30FC33F51743F01AAFBB7DE315F396540BFC3F5D73B6B383499EC8BF1C50EF6F7AFFE3EDF766CEAEF7DEC930FF55EE7C64A53BC073C6252DC9BB10A4DF1C6488A8BCACF34DED1EA7C8F8280F0044414E65D9A9C5A62A01FB6207847D0CF569AA612DE39AE7BB6CC228FCD05E7CB5393B271DDD5F91911AA398F2E57993E9FFF41F3EFA44CF1C40BB16E0E29EE5B1062279E15E5C058B54E520E9D460D33C0066441693AA78E702DDE146F587764C5A4B8CFDC8AE32AEE71A720432643CEDE90B7B7FBCFEF4A825F442B438544886AC884C9843337E1BC2AEEE5903B39A55D81FAC77B54551911083CE7E148B51746712F45C163695801150C56A9C8C8D6024ECDC76DAA3A590CBD222AEEE55895CC0DD10F29EE49711F0D2827B77E48715F3CC53D61432B6199382623C53D86F340F8C04CB1A5241978298FE29EE02451ED5BE125D0042769CE95AB65BECAE8C545B527C53D29EE49714F8A7B8B683B6C983169F1498B5F082DBEBCA846B9828C726D8E080A2BA28C469F0BEA56723651E43A52EAF51BB408D10B0D1D8AE866AB2E991181123F6C238C25C9A73C01E509284F0032FBC552658A69359BF0CBF246135EA86D186D4E3796CFFE23497EC758823C3DBF4729E6094892BF9F25F984972DE811C03748850A21C3CB089B691E36038B23C2071F6A08E7E83B106F2C71303C17D0DD569CBADBAB575C5A6E0935742C15F819E86EF33D2F388CEE562EBBC5B1D724BD356348E829BC7FA5B7F936E521D25BD346497E0B318EFECAA92504F0B0A55B637C487E0BDB350DBC3E51BBD0DE485E7E3B2997DFF211D62E556EAEE5B77021602734F0DAEC5448F25B7B3E84437BD5CA6104FCF1E4B7D2D95134649586ACB2EC427A564CF2DBCEF9DA6A8325E331079DC784743AD610508F0B488A0DCDB4A4E18EA30FBC96673EC917932F4ED917E7567E2B85DC449BC04CB4AAFA5B80374E5CEA11811D611CACADAE6A9DCEDB46FB9CD69264B7B15E31B4F181EA09AA05E2E3046CAFA9D49C98D4C54A488D5A0EF3D9F9552D0C0CBD482F417A8914F512A20BF4F67DE8F3EC70733E0BC6EE9C7D5687A3F658946E0972A09C1C0E20F96D01E5B7840D4D2E827DD9B3FD3AEE2227F92DAB8F8D2EBF95265593F34F042743F9279FDD3100E9FA6C98042721D8DC6CD4DB9B8761708CDE6EC27D62B552D17B35FF594C554F302052CE9FB991FCB665A0DE347F4FA6FBA78F8B8CEFA59294C2786108AEBAF77760502F4CDFE9DEDDDE7BF4E93FB76EF6E0DF3FFED4BB71EFE58D5FFBF7EF741FDDFEE7D69F7F7B72B5B77BBD7BFB5DEFBB30DDA70C47C3E89E223F4812D99AF286B8103A525A739FACA3EEF6DFFAEF3D85153109CBA1F7C127F00B5F57E5DF9E7C80C3ADAEDDEE5EFD7AEFC937BD0F6FBDBCFEB563C1E0A63A42C31BCA088C9A254D2581EB786A987DCF44644B1901651981D0EE2C001C279EB2087D8298CE97FA5B872D0F0A499E965B14F39BD61680A753F14085419B5442A212528A252457CC4F525A92D2B60C4D17121063956F6B238EE3A53A59A83CB4034908548C3F484A9B5B296DD529A575CE3E9604AAA4A37DF28DD2DB220634E75B7C185F47FB3AD456CE929076A0492421EDE68256E302A3C5D2C5B3AF1C7E03D5672BF25EFDB8D3785B5A458A89870869DFD2B47368A324A425212DCB8FDB7B26ADB40DA3BD6E1687698E6DE242DA9979E964DAA98A28C43B06D6E659488B17027642425A12D216798E2DAC3BB2629A9D083690AD15939036FF143412D2060430588D23212D0E70212DB837901D95EB90B92FCEAB90560EB9C792A0EE611E64440FF69C47268CB3D8425A290A1E4BC3221604EB0E1D9CAC647BFD57BB92B20116C786E9B65956C31B7491B961244A736CE5B971343712D2828667B15426DAECA8503215D21A966D2CB2333ABF2C68B3840D2D9B481C9391901677F910736C094E12A996E6D3E4B41D604691724060E593F45175B208275DA45A9A634B736C698E2DCDB105A42354420749484B425A243947A2E059827412D28EDB883ECA08E4ABBF4CE21981D00E012D62484534FB1344401C4B484B313FC5FC14F353CC8FB3B8475C09D9C7FC24A425212D09693F471DB1FA5EF432540CAF919096D50B633A4DCE4D75B08F1298493B2511D2F66E5EED7D71B7F7C98E84FA41425A12D23641EFB80CA184A66BF593B535ED90AED5CE3107631C2489AD098D646A83D05125AB62D0ACDADC496C2D1D38696CD5686CCB9332F1212089E3AD3A44154092AA5464733EE188436D1D5C5307018FD1C68E299146C636B533280D8DF459D2D88ADBBFD25433AC767A7E9A235A8798B65C99AB485EAECE4FCF485E2E5766D9CB1CA0BEAA37EACC627478E87AA7515F86B1A993A2918E78E9B48EAF1D3D523D367BACC40F167524FD35ADB176D6B297EAFC2CFE41FC66B3D224E8B2E2F8D5B7E02B91E8871702FF248D2D696C65786185A1AA34A623C61A568BEB8EAC9834B66003D95A716C8D2DEC1464C864C8D91BF2F676FFF95D49FE0531C530E90D433564C264C2999B705E35B632C8CD5615C7E623B6D82CD0A8270FF54015E516EE62FE29107195B432ACBBAFCD2780D69D4A618969532CDA66CC428A2AF3879D39F2E05909EE24A3D2F416EC622C0327F23A9D8B87E313B803DC5480BDFBECAB2A8D8A54B13C5986093B37B40DBF4A72D61C1B72C567797652A40A47F56EA9385E5C2B992B5F65880DFCC252B3B1663988552D3ACBA3C858CEC1078830279A94AFE194AF32F837A6B618B051A6E29F0818FA15AB968F68676A1B4D034B56057270645421BAF390BE9506C5261E1E61182BD58914C6D75ABA3C1A144BFA56D2B722532512F1D05A4729E85B29B66F751A8BA5EE0E6BD1900A76A6D83E7D0DAB7FB6C753A5891BD9875EF20179D1EC4F302C32C9C519D790C305B776F4E65A9462C8550AB430B037EAC4DAFD587BF2F7B39460889E602031ED7E16D31204CF050407AC4082D9FC0A66A72582D9EED52BDD07EFA9D0CC6E36EAEDCDC33074546FBB83950613429D190827A6E6C484B93FAE9AB489C06DF074635DEB4CBCA16D4E2CB7D76B2D2CAF8BFEE4EE77460A49C509241D7A883DDB7D4AFE278BEF345A50FB304773F20A7B104923EAE96360D2BFFBDE8BEB777A5F3EECFDF2C56FA4110EA7049E58D38CB7DE3952336A873756B45306088AD75FEFAC1D69748CE487EDD29A420E5521D65418E573112E6841C2E84FAEA3422166709B738B2786AC77C5A26A72004571005C95D8DFFDB5F7D5A77E9BAA00CBF043886B579A425D3B370988085C9D4B5D0B470E44E4D33E4790885C7B0D6E5D24F97B03E2A8BAF61FD13ECEC31FFBED5726229F960E6A16B2F0CD0587B6DC6F50B3389A9F75562272B810AF9977CE62A304F600579B5A4DC743584D414C03875FCF349ACDC5D2D119FC3F47C86349AA1C25258859FCCD05D54A6C30A3610A9A801385272A8B7AD239758C81E289C825ECEECD05B2E2CD85413C3F60394355826F77A16A25E99842C1AD38B6887C86DC316E36B6D494273145867CB83352466D8AEFCBA1336AE88EA30F6A969502C8172302205F8C3028153084269C5B11B90472630CB04A227221D88CEAB802C0432E383D07638BC82558775F9B4F40E4A2742B0CB0A88053F309AA824A4951CD9FEDDBC90D5D26A3221139EB5448A395612163C74519B40DBF4A48445E0B1E206F3A5EFC99BD885C82D8C654B89B38862211794886B704FE8DA92D06A02F0286E03CCD1EC291BB0B491292E1B73C1291771A2136BDC2C80648444E227212912F619EDDEE6B2DF12B89C849444E22721291CB59F89DF3B5D5069B8AD95434193290C32F34E398A85CCA85820572983A9C4D8A533428B637A74E251EDB87AE3C63B6475053D069B8692AD99F20A6D8C334B8C9C5194790915392C15C14946408A1F98D2A23DF8F49867CEFBD454D31908C9C64E4B2F96AF6969554600B916B44C8E52EB0618277A589082CF2440B97C258C8CB9860C6CBED74E3BC51F65CCE2373343A8A35D238007A069C920FD323E99344F8593D30E32B23EF7E76478592DCF530174B965C5C3CB9A481BE4C8A10FA6FE0CD2265B52B351966C6F21065F55B9A762E79757581ED2C8CDA3831EB2649F0C12049B069A88A65C1C5B5DC9832D9A919D9105ABB4C767A5622308403EC324D1AB5DC5A6B6A789F3A17617765FF80E4B0060DD8F1DF76E92563351444253B532E6369CC2587051A9D6C02B39F4A76A6CC14401C9366A492C50B81E7E0128393BE90342DCCBC39CC572DF0C54ECC1D6319D2CF9AAED54FD6D6B443D0EBE61C3B83D8FA59991727FB26FB4ED5BED90CBCEEB5DBDDE7975FFEF058D2EF06378161136CD91E428E9AF4B36003B2282B2D471D473F8B78874C984C387313CEAB7E560EC6C7B2FB8C875EA04A5A18901DF79C87232F1F61B460A4646F7C65AD0C058FA56105943B182ACCC8D6024ECDC76DAA3A592C3224C87A20258FACBC4DE606FED752F2D04867AEC69503E5E4DC75CE680471DB1EA9F2802634C09F6E220178471D1C727A6C5EC286564FB7C431192975C32A75094EC2F4015BBFE04CD50685613C129CEC88BAA79729965C0B35D5DB6161CC8D34BC23F9A80CE2CAEE9F3E76D4407C4CCABED1FB9C6526E998303A99FC05F5A4E1B5024ED2F09286B7101A5ECA0858D15F80434D25A3461901F7DC35F58AEF6159223B506006903A2C3073452320996C4E10D3F952DCE2B0E5010B458C8D5915536318B51130988B28985C4E921A29EDCF464A14F353CC1F72E0649C2EC1AE989F44B5B2AAA34F2CAD2A71845B4FF7F2A5FECE83FECEB3174F772000EDDDDCEAFEF85377EBC9DE8347BDAFEEF46EDC72E40346DC930815E71E15C39324C16D7EE736CFFA0A6E7B37AF92E016ACD7CA1591E0160217FB0D0923B8F59F64FC3A14D2CE92E0D6666724B85D3007948FDE4DDD19774722599A825B9F11BC96A192E0166665EAAF9CF234078D29B89DAE5424F200D2D3E2D8D8FD3E757666666E9FE869E142BC6932D21B92DE90A57DD39369C59C3A2B237891159315A76CC5903D26D5ACE256CAC30A6BA3145BD3F16998121CD24037E0447D329EE99C3AE63FA34F9D952739C917932F4ED917E756352B81DC9876A6A9B3A0B9AB35174B95A805B5009F9B3DEB023DAB0A6DECBE369F80AD92791555A5C0008B0A38359F5D5CD5C9B27D9BA6CEAEC26D677E242E5054F59C0A6754A473F5D7B98677BD3953B3E6BB3B3EAE95ECB5AC12C436A6FD0112C750A465252D6B43EF1827D8E02DD66034C94899F67046E649B4354AF82D8FC8D2FB932CED62AFF6FF71BFFBD347408EECDDFCFEB72785964C92D28E9476F19576347596D611ADA3F8EBA8BBFDB7FE7B4F817B3F09DB4AEF834FE097EEDDEDBD479F967F7BF201BC8435D7AB5FEF3DF9A6F7E1AD97D7BF4E8A9B1F1EE8506C1F73E015E43053EE5345B1BD396033F1D83E34AD15B33D438AE6D99F20A6D8A5AA54279FD792B9E4E28CA34C9D95F1A9483C8B54C90CC673FB1817559FEAF66193394B32E43BAF5E189372A51848203B6E025902E12DB3A05DE19A83CEC5C3D8CA3119AE0C422E77810D6F79CCA9B3E74F19179A9A7596E2CCF970BEA676C6B08FA1C5DFDD7D06EDEFBB9B0F0E50E24ABB7D6EBDA69F3B65D47403FE58A3BE589A65AA9C566D1D66B6BD7DBABD3A55AECECCCDCEF2D9659B0BD28F5471631F7CA452999DABF27BCDA5B002939A40D93BD0044EC9125E4E39C24F1F473BFC2BFEB575A9F7E9ADEEF67F75AF5EE97D778D0B5BF92BAE2F372FE768AB3EB87E4EB413F7C6F60EBB26FEC0E1A9C3F13EED8087EFAAC59DB0080984BD47577A8F7FE8DFFBA5BBFBD07B8B41E90F29BBFEED4B9853B8FCF3DE931BDD87BF74B7EFF6B6AFED3DFB163FEB792AD81C80BDF8AFAD77F79E3E7F71FD4E7FF796386C7B77EFF12DDCC09EDDF07ED0F58CF149DFB8C79F347C95E33127FDC8862D2ECB90AD18260066DA589D8E2E46E331037AEA40D994A47B4C43E933A4D1CFDC29BBBC9130EDEAA47BC0F96C45D496859F4E283711FA6B30832055A2375A86A69F8151A39D8D75D8D32E1CF8C3E671F3A553FCA5A593C70F8032DDFDF26BED0D9D6C0DB3CC30669CD4E8D9AAD165C6C915E8CD46C72033E5661A537A5E9EF519E57C9CC1C0CDC552799A615A57FB3B12A78F85387D7A86072F6B7AA37EB88DAD2FD122A6CA32CD3A0447B219D0E6D1003DC168B21AF60C170227EF326292922549904B47528811CC90C24E40880136E08D972194E7A1C7E18E520908A28A58E2745C7764C5344634732B8E2B4EC79D820C990C397B43DEDEEE3FBF2B892510AD0C9B4ACE500D99309970E6269C5B71BA14728F25F3C3C3DDC9484BE2390F479ABD28239DE528782C0D2B20DA511ACD2809C4542D0C0CBD22F6E3976355323704F0C4606BD41B7E3D4179D577FB3ED4751D00D3A78E6F77CE3EA082DC35DC18C63438A29DA96D3491EB319933A27CDE5B45A0DB76B374C03BEAE69DB5DD52F1D2691D5F3B7AA47A6CF65889151D4C828AFE9AD6583B8B7419C620AACECF62B6184327F3081142F1849D618DD499216C683280ECCB9EEDD77117F9B8C9E09BB58EB10C4C7A4DD7EA276B6BDA215DAB9D6377D238E8A31973AC8141A0EFB652029AA1983BAAB01B01CD358BB739D85DD0CBEEDB3E6F14D7184B23E9FCC1080EBA78ED249DFF682F2FCC761AF6DCDDB19E06D0D216539C87066157F7FE0E0CDA22E9BC0F0CF20944039C2FA07D59095DD5EE8F1E8E86A69772B08E5290CEAB46DC942B1809559888DB112721E0E41DA02857003EB0C9BA8C55A6183B1C7F59DE68824EA8B661B439654E4E277793C943B5294B3C57109A736E5A86CFD691FD09E2762195D53B6C198EF2C94CA9F6403993160FE24978A282566766A60270001597C0A4CC3C271597741AF69C6270E38AF949CB9E97885FC5B067D57B12A1E2D8A818C1714C9D7B28BC1865AFE624774779695C94B51589B2D62E9376D4E739521C4B593B4D7AE6F56B0BD625ACAF253B236DED42424177E8AFC1D0D89CF4ECD6D692AE563057AC951F57573B27936A014618E86AA768E8F3024323CEACD958E86A6718536A7361445DAD4C6E0B0A1426B7E5D0332B5D2D5C0824434957AB70F004C7ED2B8AC5A9887A49570B19FCFA3B359EC0277538A9C359923B9D0588F02CBEAE56863AC890C990D336E418BA5A928623A472B7AA24134ED98473ABAB9542EEB1D4A379E806AA486801E0D8731E8E243BE96AB9508BA80FA1CA4C3E149B00564606ECCCC8BA5A19561D4B3F16F04CD9C697916B0B38B50CCC8D46489B4DF8644039B9F543AC8050EE9A578D31190BCC42FC91095796B0A1C95E4C1C938D9BAE96D4B36C92F4F00EF77F5C851D9089DF89499BC02811910395D0248463E5EE15FFEB126B43F3598293ED9681E35C02301BC1493026ABCEEF62D2927AD6D26B2EB53AD0DB263BE119A9FE32BCF9A49EB53C04A96769F034D2162311EEAC75948A7A963202398240803272D0698B3202CA3202A11D025AC4108E55E2298BD02788F117A967358AF953EED542252452CF927A36E61C5E5FE75D984A72578D7A965071CE5131267725EA59D17216329AEE9EBFCE774EBAFAD30A8CE512D48E3CE614F2A366827000D8CCE9C88EF9D05348D41B0C7B36E74397397F5CFA11668B838F5427E7A1830C67B6C92650B3A96583C3A727CDC96BD22F675A8CC1D1D54A75DE752E8311CE3362569BF945B677D8CC37BC748C7A230F7776CEED16E7C19F896C4C373C437E1F44DE2554EB511FA02B7D92D239DC01297378CCB29E67C17F167D72F7F2DF614273F7D9CEDEF31FFE70EA955347FEDD51DF180C121F3C82D929A74DD8DE31353FDE87E35C14F6C9DBCE77325B2EAC4023CCF3D5F6A1DAEA39E7553AD6D6BC7C6D89F1EFA6D5DA3F32C77A2B0DCCBF32355F71DD47C7E165E75F989B9F15C30EA55FEE9A055F86A37D5790FB8B6C8F4FE8BECC3F617B8769BC68D505D71C465B757B0FFF6CADBAEEDDEDEE2331383D78EDCD3BAD72F088C0C0B847F1AE3D4196916C555ED6A3D3315698450FDF68E6D804D68165CF94A7C4497292C9C1B2EBAAC4CB7803BEB8D2FDFCD28B9D1F5E5C1323E75D877A2D11FE5A12971975FB857BB8229FAA30B849521F1EC243FBFF0D74D87B0F1EED3DBAD27BFC43FFDE2FDDDD87DC73731BC274AEED8EC2AFD05DB47FFBD26F4F3E16BCB487BF74B7EFF6B6AFED3DFB16BEC475708F4D76FFD7D6BB7B4F9FBFB87EA7BF7B8BBFD2DDDEDD7B7C0B4B91CF6E74FFFA5DF7C3BFF00FE203BCFA97975FFF68FDBAF77CA777FDA1F56BEFFB5BFDDDBF5ABF8A62E6C7EF7777BE79F1E1BDDED62538C3DE075BBD9B1F58C7F07FEC3DF870EFC147BDEFEEC19FB07F0ABA62BCF89FC7834FFDF735FE8AFB30F375EB489759A97D42A7FEFDCD54FF9EFBEA5D37E97FBEEB6DFD044FD5714EB15DB96B010D4F4A45414D2B0C773AB8EAE3D110A67CA03C615F664A9FDBC87187BF534ACBF151FB175BC4803B81B3FDCBE63B1DA3AD6B07CEEBEDFAC6AA71E00F9B27F9BF964E1E3F30516F2FD56146F6FA7ABBDE302E9049F192A9FF6C8EFEF3EBDD6FBF83FEDC8E5BE593AB4A6C6F5F70FC35453EBA3AE96EF33A5B7146B73E1836AC0B08FD3568D4968D2E1BADE3AD33ED898955D36AC52B4AEF5181FC61DC1E3080D2E189BA9A63387AC0CCB120D47BC4A1B60E036D3AAC5B521B53308C63DA69B4D69A1A7E67E722DC46F68FF3B555685AC0ECCDD34C05F32C513FBBD2368CF67AD44FEBF6B950614FBB01C4B3BAF65AD4BFCD3FFE1FD13E0E1E011E90FDF6AF344FD42EB437F046F2E774A6F18E56E731221C7A02D276E69F9A9C5A32434478473054579A666F1667B397D959911373BE8CCD1E192E73BC5CAD4C8B88CFF1727976927D093FEB57F5469D598C0E27C452A698187586A60A8679E185583787BA67B4D872648F3039763887EAD403C63737801B1B77D7DD6B9F48F62F5C21A2E5375B226EFE38CDF3169B08F51D90A6FAD3598068C5717BC0E04E41EE981A68800DC8A2A6140D39720F18443564C264C2999B705E7BC0C8217772DA6F6FD16AB3516F6F1E061E89DE6EC26361E1A8486974200485C0145ECD62264E40E59EE1F0747B27742EDA949022C6F349D4B8D28DB5D555ADD379DB689FD35AC96158320BDC4C6854BDBCA82A20670473633909B8B3AEEC15991B991B58854F0D1FCD2D6C0717198CCDCEC9CAC16972564F7D578AD77785F05828BAA6837210A13D5E0AAD58BCFE0532889624F8E4FF3975DAB1633ACB96C33FDCFBE26EEF931DC7C7E1BB0752417091349CB0D65C2C514B155B202198AC3E81C4F00D37A2BC4A9E494C6EA7A32833D44EE7F431A33A5C0C7D5256F37186617FF7F68BC75780F3DEBBB41BC5D911CE1AF511A792E3706C51584D038627FE90E8769C1567BB10C1BBE289E488E5489E9477C0A2584C4C8CB2CA072A1376F2B0640DC650F7B89E5B81483D447274651DC3911C8F684D8B404626C5B8040789CAB8B9A0D53AC6520C3C1309D85A9668521989C958AAE9AF9C5A2AB9D6785C26638529905C995ED8FB8FB7EA003037174B9549D9203038C24EA523266338FE6651988C532238757213FD988C33A26EE83C3A174C46B8103067979947189F84C05830CC22EBA787545C25E04BE862078C43E0EF9E452F6065ADDCD1C4E9C6BAD6997843DB9C586EAFD75AB6A285FB1DF62D1CA2065552C5A30DEDCC31BA18D219491479DD2786B12DEF52297B4712F5AABD0844DDF9E020A66B7FC39569649283F5958949C6261482C326AF5872BB18F28AA3C17DF48ABDECA980915D22983E6A2958D70C6FFE8A76E985E8C002F7EF4C5C626E797D52003A4E15176FE9D4B7F1AE2DC495C3C768DF85FE6A5F11F124D18280E93E4D03DC3B9D3FCC667B60C1630255A7CFF6BDAFA294BEAA1509E28ABC7F61082862AB709B953092017E1FA11E4FA66327FF468D86592079F9E7BD2737BADBF7A1C38A23CFEE5306966DA4D9394059F136BC0587A2C2F9BBB98105279D1451E53BCCFD0C7FF2326B8643C5660994D817F5C88C7EF3213A176CF43529DA8EBCDDA83BFC81C346C07314813BE6BF560992C076ADCAAD102409CE73ABBAF72E6F009962D647CEB19485A7300E1E3FE2787DC4254E9B2EB246CD4E3B916B108EBB0DBF10D349DACC2F40783734B79334D3A93A61EF8B28593BC4747AF28DD2DB226A40F9EE7C158EE9F4E6F97ACDD02C8A89D2DB5724FE1CF56D23B2132695226FB0CE80C82A1FC83218A1FF064B9D6CBF0B1A9BFEEEAFBDAF3EFDCDC7EF09DE32FCB0DA74BD055B163099E626792371170BC441769A96554489EC34166DDB2605D5C6495F9A2A8BCEEE8E9759269725C91D2FE7A36D1B5C0858BCCBCCD3243BC15F2F5A6575D40E6C5133BFAE2831763664280A577D31035F1CB9279B8C549AA689462A9E64CB8752FD54F79D89169F1F458ED4437ADF7F564A142A68AC3A359712D199BC6888201737FADC52AA24301793BAE9D1F3B38203295532626354A5242234CDF86C2E2F0C4DD7846CE9C1E292197CD23E49693B54993B5A50D4061A99F3B846F53D44ED0A397E386A808FD614B6FF591156485C1F4BB56B65B56B30395D4488CBE90C8490402E6819BBD46CACB5E04458EFD881C34977271DD521168D2998D4E6AA1C8C05B44EB3AA41A19D9EF2338FD3B7CD0B20F3B220085ABA34D0124112414BCC83FB93362926F1A9B3A8341C755DD6C2EFC844D4CF05519F7097BDA1855240006B44D2B0C241EE3707BA8B049971302E819F4084153E882A80E37E470DC9E58F323A10CD602F286C7E6A3FA14FA2F483E5E72B6C339736FE74EBE8E03541028CDCA2C9858887E7167CEA24DD9D8FF69E7E6EEBBE245E60BB17EF57941C5BDEBC1FC3B305A99E122644CB07A67ADFDFEAEFFE55A289E18F2E067F3FA6E8795C134119EC624A3BB3069A010E4B5E2CCD4C4DE35AB4A6600E5FD314F82A05D9E81BC26836D63443915C23D07A2C83D94F88C667CB1ABDC943164E248C3C25345AC9E0821692151E055A32F94178C8A10D43B91F3CA9B7EB1BABC6844822A46C14E4DE3A8D454F0BC00CBCC1288D9C1DF1CCD123D563B3C710D3A0D6C23E8C41BC1389E2BE2F763933B4106120FCF068C12A159948068E3C6E36BE2E4FCEE1CD75C968E0086A7CADBD06378655FB3B301FB6A9E17DEA5C04D361FF80A9B140E865423A16E02E966A1B469BB72C2E48E3EBB959A916AC52916AC16627A7F9D539B560A24D364F47BCAA37EAB82053666CE085788D384DA10DFC75D28239FBF68F96AC890DC6798E4935DF1D43B958BDB17151656BA29136CAACF207E93CD57D67A271B560E8E3B3B55272A4A40503671BAA0B5C561BFDEC919923F3D3A5388EB53CC5B6055B7C5A9D16D348D42567C9B946EACB915789980CFD221C2789585E2815CAB36B71E50B32744A26944437BEE1A5EAD8D18F4A866644568E0C43922D8DB92D9166CCDC8E8D55D1A8AB8C993377B0157EA1107759428ECA490692346360DF2C83AE9EF0EAE0D2BAB8CB4D18EEBAACB5EA9AAED54FD6D6B443BA563BC740595C56B30C38E5451A9555EE4E152601DF28E1AC8F03D1397B48B52F0AA6028BAB203AD35EBE7FF4DFB27C4A5E7CFA68EBD07F2F0CF0A1B21EB6FE5F8645B18E5133363A123A0F43B2AC16EC93CBA5ADD331BF58698E28E0B187A68B01AC93998AAA9D1F0D6DFCB2113E496A3014789C8CDB1AF058658F28F84BF1667321C38B0FEFF5B62E39D6B64F3A2BFA5FFA5F93AFA8FD03DDCB775EBE7747EDDFF8B789B2E2ABD87BF061EFBB7BAAAFA2A2FC2A3E527E15FFDB7193708558CA29B06C9FBD88E09B32F8064F4010141DBC4E91B612E57E3BAFD33BA478CC746A3E9B2BAFDA2627A683E732F1CE7A73A1C3998CE775ADA3E9FFA99540CE363DE158443E4E5FA086D4E576FD4FEF77B7BFEC7DFC7E77E71BBE45C18CC9DE075BBD9B1F90002FF6F8A8E10F3BD705ABE40578C23DB1E1E911D81EA8451159B8CACC3C26FB4D75CA0CFE62B13EC4317C2C87F5EA62A96C3E4D755C1055903D009A868E389486470879430AF50E5D38E517F992D8F7E2D9570EBF8116BED2A883EE242B469B2ADB4673E9934EEF8876A6B6D104D1F1E4A4C06CE42EC78671640995978DD6F1D699F6C4C46A7B7DBD5D6F1817C42B0E08C9E330F28C63E0194791F88988107E90646D201BD31B6B670DF0A1313467FB5EB236552D3128E814A1556667242F5767E6F22B59830B8147EDD25D66C564F7E65C0275F6B63085A69A9C5D6A851058A7C3BF47941A4FB2068B2A3F261A47EE9D1513269D079D74A80DCF5C56CF49E762D06AE3AAD8D0EDE7C770C9B78E52AB0C9D10CADE4A234F3493559BA0B5C0D93A5C139F2ED0D46A3A9AB0BDB300FC7AA6D1041EF9D119FC3FE21DACAD4452F9C0775972F508794D6BEF178E95546C8D75079903EE6F5E21416E556C12401CD9BEE34832594B0FCBC2B1C5070B382805AF3C051F5BC52601AC914DC8EE22E3604F1B632F763F3AA54F202518A932291F912326C38B91ED865C8FCE8049D1A9FAA45833A12529D6B0EFD7E10EEC085CCB14B7C8839ED622A5A1A3811583FF155B4E3A53CEE624782B2F2CF7ACF235AAF626F9D6EAB02997622DB62E4D0285143C5D02496CE98E83062D7B906443D2850FC64C8ABDA3482EA877C6C1E3471CAF3BF60B4CF970598D289D929E5CFDEE8C9BF44A93417BFF4D9A48CC5803B3D18125A3087911211512F34CAE49CC9CA90CB28EBD071E4D045FEF44961903B20C51967DFA92CB0BEA854A80293D59D890425196EBEDD7DB75D17CDF57B34B2E671C5C0E319789B9CC7C9323011137A995946E48B9D7F4309789B89C606E33293380304B46425295A1C3ED9488CB70D323718F89B86C23B29B33309C0C654CB733D7E67C3915E2B28DE163881AB4A1BFA6D9D9E6D57936F303F31CE6113E592679DDA0C8E4A579A71813D28CE65C147569469E07513DB50213093C4BC8D3D4E2DFC7DA2D03AB59C5E3DC159CCF5C286E0099A84FAF1C58393EBA564411445E6EE81DE344A305D3B14818925716688FC8CB1A91973BAB8D50E9579FA02C9D9D029D6B82E4E51140F174391E284EBCFD33DCFF21B4FD506D9206D076556B199ACE831381FD7D363E885F0051B263E4C832F873F810734BF3B5998480CDF25B5AF6346AA9CE88F459CC1B68114964B98FD1EE6E1E38B0763BF5CA9F5C37D546EBC8FEEE85657D467F4E7157814C4484E17B383D90B30D1BEB73A4F481A1DF88427DB42D4D2B41E14E61CCB00C0BDE0361477E4419790A637CBC7501C985B6E74FAE99EFC32157BA58D669BBE6DC13DD52BB212A5D5FCCEC6DB6AECF0200788786A42BBD7B2D7CC074F5711A912BE64A67BAC7222290D245597314307E570792C44DC196F37401BFE12CFF1C60C12FAE743FBF6451F47A7F79BFBF7BC541CCF529767A0D151A3FD65A6B70B7359844B3D469D4164BFF9FBD736B8EE338F2FD5741E041B1E74158CC05372A800890A02DFAD0320390ED47C500D30467399C41F43405524FA02C52A28E44D06149D4525AAD689BB2CE099B80835E49BC88F830420FC0277D859359553DA8EAAEEE99BE54CF2DA5080233984B5FB2B2B2327FF92F4E9A484B2AB8154BC6D5B035B461E627311A6AD899E94867D976D15757C2226B1EBC130B8D6EADB35AEFA2840CE35EE71278DA2C17167A6EA0596859D0D9FDE0D6D13F9F9D083AFFE32E7F46F1BB3C94225A711C68C5FD3F1C7DF26DFBB327EDC79FFEFCFC7E06662007FCC1656557DD33D27446CFC7DC5F5A9C80F1302689AE989ACE672A8EB576753D031B9382DEAE0625498D94E7496C6462B579A5D240F123DD9C69D25A48D259D3C146DE726CC0E8F3B596F34ADD790DDD204A3ABFB2E9BC36B1211EB4C82B862EE2618C8400415D325A59017826BD2251D1707B898A3E5FB9DEBC8AE2D43C5F78B176CDAA7266001AA3CF379B97BDAB345D5E661E13B3054445F747D23158C28D17858ADDBA4F1891F5A673492144FCA98FDEF70562413F4F7D10FE1CC807874F25981E26FCB983961A5F28918986942CA24D94F067C29FA525BCBE8D1F4C48B7B8CF67C8A12325FCB941F87356ABAFFCCC365FFC395D4F20C6FFF158C434516B344B1011C82A3DF04C842F74992FD5EAF5EBFA649F85FE282D0C8A6DA4E054159623F10D800F8AA0CC7B5F4978FD15D37E45ED62D978F4662A23A2BFF1C957432133A1A9C36773DFE77B9A5C1EB3162C5BC4C185129B58A2FA48AF635CD3D090FC0619AD518D8035C505E6B39A744D8E90B4DE3853343FD150E92095DBA722E6BE011F15383A4CF50A0C1A306BF02E07A312B8B08CAEECE27E744BB4F00FC3A9058B45CADCA29202D16F7EAB5655DEABDCFED079A9A00B7DB244EE34DC7C026AA453E4A7A0683B697AC0A4CBCFB06BCE80F149DEC13443BD0EA59C2B15FB32EC6E6E63B9A7565D9C9C2FE3E2A251B9022DFD6FBDD9DC28CE7AFBD2CB1C5048BA505A35A18B70FFFA370DD0A7FA89DE3EC92792AC7E44676AD339B1DE3EFFDF146F94F9C7B7BF7E72FCE1BB47EF3EE97A393238179F6BCDFC640E7F786AF66A15541C1B0AEEC24ECF36B0C426AC94DBDA49D0103E6BE842B42C07AE00B5A581DBFBBA7964833798D149455BBB6180249ACD33E6D213FD55D19E1F0272DCFDE03BF7D17DD743C53BF0F8DAFFFEADE295784449D83861E3304598340364C4172767CB6C1B5A7FE8EFCF86522E542C088CA6DA30F64C8683AF5DBE4A5E24B42802C1D7E8B28F44846B88F038312D3942181FB153DE861D611D7A9057AD46D5B2ADEA85CAA675DAB62A97D9773A4B1E030E4EAF8380B7F8EF448043CC10923A18692F480438DC5E22C08D10E0C5E9A2808D555DEC992293DEDB3EA53C5D9C2F89685979BA20C4B5797EE19776AD8A7354F7FD34A53C7E4732CA2F2AD56BA1889D08D8898260C0BEA1978800F7B3E16CAAC9079AC2157F84A24CEC99196EB02EA19CCFC9E0122615018E83AABF261A2776ECFBBA399FBB3A72269A9200673EBEBF560ADFDE01E0D2408998C8A7569A06EE0AE99F03FAEE489313E07AF5489AE8833799267A760562AF1971A21F50D45B1BE662DC3D04A877A78E1E3BEC63B7D1147ED22500D0C59B41902A343301870E5FE0A9244E5CBB523FD5DAAA6C00C9B1655B2DCB7EDB9A5C9A9898488B3CEA42CB7CCD6224AAE62160466C830D995E4D99303AAC64049536DACBD7707AC5CAB3EE81367533BAF89361B0A5B85079A63E3275338E2E408C6FD244100D00FE6D2CDCF1619CD2E4052A1B75D83CE9FCDB7570E22CEBCC969027A3DA23DF1442939106278466A9B000D0260B5B6444B31301653B6010FBF6D3DB5A426F060F09CFA483F563E4C892B5227E74367E0FA7BDBD3859D0451459127A6917F6846D481CB786513335BD0D60AC91F56066BD9C2783B938335F169DA96C304749EA8B403F62A0C3F0F356034B1D644E015C4282D0A0CF903F2A40637B6E4A027467630C7F9A442BF5C5498FB38F9D42F0A60BC5D9C203072C087F908033CE3A9D6122826289BA1D300C77610830DCF647EF2386EB1370FEE757ED9DBF29FE85DBA449FEB2533A92E2AAE1ED830CF1C7C3B0903BCE5CBD394E0591E83388A5639B89D16427466F3131DC0B7673CBB29DEBA7AF3361525D9328F9927140FA0F3E71BFF8CADD79AE4C2643EC1C4F2927627E5624773890EED0436E859FAB59AD0E79BBD1BC72A559AD39D7579D063E99B3C1501815035D3099EF2002D7CB85B66A8DCDBA85145BEB1D08EED92FBC9CC9DAAAD8663A8B9395AB4E53643F6B9B97B08D3D11BE5B0374A56ABD9EEEEDBF4BF676BE483FDDB401D36FB10C29C82C9BD0600E277075602ED4EB5812D707E612815B3ABB52426B24706C6D59A4F97AD19889BD3A814B1C4C4442B181AD5A4C0B4AE3EA2525815BEC33812B9BA8C4BF0B4ABA77910251352F2FE0F9488142A12052D5E6F22DF9DC6B8CC7470A1D4FCFE5B22223353848752FBDBC31F745B978A4D1B3D2DDDDE3837DCD42070322512AD6178C7515236AC0D1AD60C83ED915885D54C3E99FB8DCC549813EF8CADE63C6D1E9A2D041E472830127F3A43CB4D912E1E02ADCD4697573E1949DFF524848BB1A5AB2E6E1B0B032C1682FB1E164BCE898F14BE8143C4EC2DCA2C3547A2FA700CED4E1B315F1CDBF1F3EBFE7EE7E0FC25B4AE016529BC9D47312ADDBDB72C4940178F68B3F3B54273A0A8EAAD9E113CC9B364E3A520EC24C0F3E1E4BDAE624A7B2CE73B09575381F964B1622F3F070ABD942508BEB18E0B78917FBC22309454986F8B2DE6D890A2CCE4C1744929BB14CBEDD98B31D653D23BE42B6414B1D5B203CB3DCAA551627DB9FED0BD60A2271B8661E9158C1DC0E3E66FF9E1814DE43FDAA6F06AE3BDC045F56E2EDE57A6DB3E1BB57FCA3531B43EF3932E996D3C40437436792A6FC129844F296A40C431FB45A9147CCDA21CCA3E19F388452615661FE2155CD503CDD94EC2CF5C2EBB24C2E8CC65EC6A12EFB82CE309EEBA5A617F96AE3F5CB86D7DD5A73AED72DCF1F7A923BDC20110B91D7EE1C1351436CF9EFD2CA8E2502D040F8DCE321DF4A670A2B109C5869B13C3F176FDA82CFF7A687A5A2CE98C55F3B306FD0CDC81FF1D3CE0DF7E99FDC7F7C7EF4E8C1D1DD5BED3B0FDDDDBFF83ED63B11895D5FC0A9164F950D68B89258E88BBD6C0E7701FE93885D1883C3DB3E65CA9B9EDC63EDC41EFB60FB30198044F9E1D35BED670F8EBF7BECEE3D715F3C3A3C78E0EEEFBA4FEFC1BA45360978F8F2CB9DE36F6EFCFCFC23D189F8E4B1BBBBDFDEBD7BF8E20BF810DF8BB909FDB4F3EEE18F07479F7C7BBCF7903FE3EEEE1D3E7B787CE77BF7C53DF7CF5FB91F7ECDDF8816F8FEAEBBFF47EFE1BB8AF9656D645163B733B43A8347DCCA30129E59192FC031D6C2732933E5F99515D171163BAFDA9B75851D52882D657D90185014A70A13F29DCCF6BE5160D9827B390CBE84B0F6E6954A0367C4E199728C1E2C3A073DD6DE729A1B97A77EB5BD863F972F9C9B9AA83697AB55F690DC47A86C09380292957686C51F12C9EEC5418299540A81A25C6A282CD229AB456029A65608E801995313A8FA04737CC4ADA76FE165D9D0D040BDF7DB1F12279B3408E2D63DBF40DC3A52F83C4B7FB176CDAAF2E011FAD0CFC3465EDE559A2E2F7B2925F80B4F2AC12F9EA2B322FAEC555CFC243A160458ACA7BE9AB875CC16B3A4D58A75B172B50E1BD44C4F6B36B74CAB8B22AEBEB982075FD89B46BD7BCB49A4F6BEF99C0C4ECEC4AD3BE741574964C3885BBF62B526DE50C0247DD4085E239850CFB3E182B8F59ADD62B68BF56472AFA4278DDD8D302C2FD6EA2011747616FFC79007A6AC98E5569AFEFB9C65CA6FFA276E9DB875964FD44DE64ABA4AF4EF85A4ABB89FF10AF2617AD2E9E5A483545762F726213854621B96947262396933EC56EF86135D6E37B72C3695C7CB69216CEAF0D9D2970075AFB9677C7D21DAB18891F90F46320DC0267159CC6B5DB9326586679C0E7C2D9BC5F5E33BFCF538A02EFC66ED4DA578ADD628A2DFDCFE74BFFDF123E5EDCABDC1550C9AA9B7969125A183510149429FC1299D0B850F4AA531246764D2C70F58BC103E2013357F2C301CF784A22D4CCF9418911A67E0B99FDE72FF24E05765F8E9B4DAE11B79A87FE234C30726C1DF24D67C6A50785056FCE38995EC0E0967BDE254D195B85D6508F1190C420C707D89C8F0DE1718D455E4AB5BE4DC50DD5FF8B3D37D91789DA944673D277BF46162071BCF34AB1403A55CBBBA4E28E518877DC7240A1CC439122DF247D89F8465A961DFC3096216071959EDC3423225B3582E30515A5F3F3A406CE71A55381BDCD96A9A35EE065F218BBD3631904C245A8BED9B49DF0B5B1C3ACD2B49DF6D93D66E3266B1582889295C6516676774286361B6E0ADCD25367200129924B647627B6CF1ADAC309206A7B8E24EC32CB24105AECCE767699F76DAA71D8A0B9999685A3A117D3C59692F20AA94D723F8FBD4899652B7AD7FD091B613ABEA62B03138F629A98525552C2F94999056278FB638599A11C205E6E08C7C38BF2E39BAAC3AEBF33919345B8216C3A0452A024845003633982C2E57945A8F5A73EDA4C0374006F04CA55E5BB76B583A35A78C80236363C36AB5DE729A97AD86726CBD9114DAD818DEEA211754C57AF5CC1B38ED8DAE0641425E4217AEE66B3889F3D49D811A7B1E343A9A739AB44DBA472192D5B300B0EC296190E96A87260F372D9CAE0B89E38F01923A2420D3E3F652029975D0D55DB51AB0539C55BD50D9B44EDB56E532735AFD4235B50106A19A846AB264C4E77B49625653A147D6A8660103C71354B3385B9AD388622B094865FCE3258A876A323D558C233A7C3B86F27A869A26AF414635FBA7D3BBC0D2D027665B2896E6595771C86A3718B481017A6D814B25658027FA0850497DF9EEA3E37F3D697FFBE0E8F607B1D47AE16460FAE32322059319EE1948ADD7707E235AAD3768185D357BB56FE95DB9577E3BEAF77EF0F5CBFFFCABEFC9C38347ED4F9EF89E44F9DFDDCFDA1FBDEF3EBADFCBA088BD38EDC3022AA01D3FB4A2D068369293813B2BEED7ED9DF697B7D53F914AB3A7F31E75BB0740A5B9D45169966FA032F8524F0D84EB0F4B23F980E0FA310B36728AAC9FE9C7DC8E03573D7A05E5AA55AFBD6DD9D77FDD6C58D7414979457E7CA2A87CF6DA960D35111AE6A4A90CA68466C0A7295C06A70ED7FB1064E5ADA92C0111B136ECCCCD43E09C2DF638D3DDD3DC8E033D95E2833CC563D808CE81EC2B691E93E6F1FEF1DEBFDA9FDFF9F9B9BAE6F3C24EE0B659764ED2B8FD3DB818680E98A7FE81646D0F359005AC5AAFC3554CD435C1DFFEBB646F87DB0A77546EDF0059E3CA75E8F487CFCB41F3789CFB070C1495E0A6610BF705DFF6A4B1814349AE337500C2D600F980775DE6D9AC1254F99C0C4ED683D14530C0862A909A083296EC17E4D23DE49AD37DF9D9EFC0B4180CBE09971666B1FA2AAD65163CB89B4CB89F26DCFFFE83C1375EF2BF8329ED4D5D08615D0863C6E2E69A624A49A96A093C5CA8C6DB903BED6E30A2FBD75C6795295038A75590A9C3C7750F21FEBD6FCFD3CF1A5B562B6A93B644883F2B2CC6739E84F8CB4C2A4E3EA4B9CC96A1FAC9251A09EE8FE6B2368C30B094C27248A2042B051813AB6C336E487B04995CB34DA803166074C575C307987E40763A06751736FCC330F6E2E49902A3784002AF6147BFFDF0E041FB46922E09260ED5A93A55AF553059899E9766AE56ADB238D94D2CC33304FCD9E9A6C0EB073317FEE085DBC4FDD13E138D5E3F87642CC3084BA944949DEEB1773D54E3ED0C0C11BAE67A4838BC4A53C588B1D5EBE185B84C9ED9CFEE1AC201872850063172E5ACB8118225C28192A8345C84D16DC7EF2FA58A9A918B93B365B67752A77812ED9D7A49E9E49630EBE2A6723B0EF44DC92956A0CA88621D6B788CE4AC57D3C9598F9D2753C29469F61FE713820B8C04607868E8A2056095E0252462CCD51513910B41D3D86F0D458ADE9E15B46A8DCDBA85844CEB1DA013D92F5B950D0BEBBBF024F3258B9315DC5F9AAD2649D15B22B47F69D7AA98A65435BAA78B3A8DEE712672314D122FDB44DB90F77965CB331EA65575717134182C2E992873EF4A889854A7BDCBD23BABE2767E263A30B82D59295969B506F198FDEADA3206646010A226408ADEE76B0DAB7BDF422F49CAD81E8A59653EFE68E49C2BB1B4612C2D0944446B2E63F438504C2C2C98336913145EAC34CDD6E09DEACBE2E45C91E016825B625351E9CB76C9664453F8694E73A0A9C367ABDE9B7F3F7C7ECF4D2490CDA20D930797D2A91271944D821DCDDC4F1C81EDD8629A59C56E7401148BA7DEB4F139694B1CC75B1DD8AF5BF25E8CA50526400BDFD079855E1DB688D94CF87465CF347C5BA27C9EC474FAB82729D6F1434E81FA9092A4508472BB3886189F0467B8E45857B6EA15C77AAB5655EA58CA7DC14BC1943BC4057136846E475E9C2C051D70054617031A1AA216B44DEAB0023FFF761DEE077780224321E295F566F3F2958A7D79CDA9D8288352AB2E4E2E94D0B9481AC3337345B1F5166F0C10D82C28FEB6FFEB40198521D5E420980BC3D5F3824B019D52EFA0CEB2BD78C521F1C4CA89EF0D1DE334D3999BE9709221B616A7965EE155290BA5302033E5F9951531AAEA95C6268C384FB8A23BFE8C136169AAD4CBD0EB82FEC2D7060727B86E76D8991E70085B1B546356CE8A4FEBC4D6F60AC48738E0D84BC510BB30B9C021B636932D0F422C2010669BBC95C9D9DADF6E5521B827BC96F0DAAFDC9DE7CA541062D8C3E0DAF216891D3BBCD6A433D332B484AC428490CD3A6388C73521AB9E1510B24A22B26139575DB61AD0E64B55CF7836EA56C5F693CDF0C78BB57A7D71F2EC2CFE2FD256C952DCF0599D1A705AA924C11113B272C56A499B7BC3250E4F2410B2AA968434DD5364A2017E0E733F113B096415F8E7838861CA8E90D59ADD7210099434B7C9910E98236DF75F0416CB0C896AD9E44547DF8B8E059B2A1BB2848E24A5CC0A016AB1581E556A31D74C774A2A4BCBA324F67E12C9431B1F0ECBC68703C692F46E3804B05EA934306B7169398E20BAC95435C9BFB28A51BCD091E45FC71A698D0BAE86BF1E97F824FF0A0C21C3F6A40E99581B55C64EEB1825EF73CA41999C14062CC008B70E0184860FB02E3743977F0EFF301CAD24FF8A4B067319385366ED1902FEF43763C07384A8F23D957FD16C38D232A80FF2AFE518044FD8E161845D6B84EC8A9507A27A7CE77B77F7B3F647EFBB8FEE9F5B39BAFF1E771B80BF1FDDFE4039416E8F44AB12AD0A6EC9A4199802BC463BF8321A29A26C63CB59B51A55CBB6AA176087F1D3B655B9CCBE33B9DAECA6E59CBE7EAE4A402C01B104C45EAD4314303D9D80E0217F09519470EE679A57ED9A6523BB23652F7DCFB2228AF4C2603F509F446C2794802B2B76D4F0CCE02C095E5839788A1697636DF691D5CD0E5950985AAC62A2814061B8E80C172750386B50B8B0303F8374AC5FF2B65064D0ACFFE95968EF0EBE9A354DC3D33C7BE269E8E62B6BC14E04EC4491B52050B805DA82FE1D32D90DCC075CC4596AA428CC74DAB630A8C84421749414BFF4E56F3251760512F5F6A70685B984073952B252CB6E78A197E85C514A6249E5A431A825509840762983E08F51C0ECC2EB367974040D2828AC0D7331EE8E872D25C88275908C3143F7868B08D64498F95A8724FB37BC68C010278B92023B9AA02F5FC31933B712BB581A32231A4D3CA690B4EDC3E1A66CA720E9BF6C243930E7E3E7AA2040B1C122423638CE5EE4D65898E40310A39D5632014DB6659B24A03937E7E562399825F2691E9F956B7C1226A00BA27F420B5492DDF4847C4FAC01E354CC357BD1AA24ADAB095C20E9BF5CAF6D7696A01B56C3B16CCC3FE73B335148D35DAAC1E4343460218DCF0548D6916CBCB30DB94FC6FBFCFCB4A8B1F44D2F97558414371E3A7069D2343769A29723BD5C9C2F06402F77E6A79D1B0A8011BD46EC3F8FBC24C8E3DB3BED2F6F13744C7A7324913BF612B900042FD7EBC403130F4C3CF0E0F1C0B9ADE431B48FA07202C7A1F44999407797CED75ACE2B75E735452EF7954DE7B55E42AEC0F19A5C8C0A16B7A51C185F2B99ECD9E954DFA4E526D557FA90644E09E3CE6836DF62CBBCD34D1B7A7F5A2C3BD6DC82134B04BC62AB42D2F7AE371DA77925E9BB6D7933B2B89C6E0D3450AAD6EB49BF9BBFFD77C9DECE57D9F2E55FAF9FAF5C875C0E7C1E87A02ED6AE5955CEBDC282FC3C643ABDAF9A2E2F3308867F08F7A9F0120F81DDB46BD5334DDC3E697B7192C93531ACABA7A767670472A3BC7A10505BADEE14A1B684DA32E3CE8C104B87DA96D84EBB043112C4681262FC7CCFBDFB8D7B70F3E583679A8010670551EFD257BDD0C7776699EAB50A9F6348DC9C7A1620E99D992325D496505B426DBD90BDF78D920B9A1882B9741EE7E3222D0468D148F4E304905480978532520680C477535673605E5E4A498B691741F95A07A58286934BD1047DF91A4E34B546694570ECBAE61393696512DF65EBA7785D2C24BEAB416DD195A4A486B6D69CEB75CB0B982063CD123B9C7BC30CB3EC3FB8388E1AA1C87FF7872D7078220CF2885165F778D6207D02C31567E74B4288400BBF0687297C7E676FF89E0404A33F02A81FF7835B47CFDE3B7AF4E0E8EEADF69D87EEEE5F94A5BE167DF5761C4BA7E4164E1A8A53F47351BA2EBA88066B530EEDE41E6B6FDA30B43E1CFEF0F4F0E9ADF6B307C7DF3D76F79EB82F1E1D1E3C70F777DDA7F740C35136099474FC72E7F89B1B3F3FFF4878F1278FDDDDFDF6EEDDC3175FC087F85ECC4DE8A79D770F7F3C38FAE4DBE3BD87FC197777EFF0D94384B65EDC73FFFC95FBE1D7FC8DCC02BF7EF99F7FED3CE4BB9EF387EE3FBF6AEFFC0D5EA33CF9E92DF74F37E0491901EBBCBDFDF593F6C78FF8439F250FEDED3AB7322A67C26F19BF3B6072ED1B7B602ACAC9E1E862ABC9A4EB4F9F5B89F2D61D67EAF734617C239B29D6D9BF0A3530539E5F59610D012875D8D88463B740F1304B0DA7B0430A89E6B23E485C5396A70A13F2D8CDF6BEF5BEBB06AD0CFBBB324C8B5A5EB051AA506CDDE40DF315EB6285A025A4C1BD2BA25C267489FEB0285732A8696F4EFD87656D5F9BAA6CD5A6B6AFB59CA66D4D6DDACDAB5B53BFDAFE25FEFC75A501BECFB2972F9C9B9AA83697ABD5CED3F02C790B637343EF8171C86C612A54C659E3F8E013F78BF106329591EC0D6F72781EA5E95D11E532F5DDE131DFB5EA34CE352E3627989F130FC8918DA723233692E5C1D8C26771B272D569F2CC19B191EB75622305D2BB51B72A3696E365338187176BF5FAE2E4D959FC1FCD0696F95E9B7CBC4AB3982C2E24543B9712B6E57991FA355712E2AB70D3825E392524F339190C19898DA49DE0136D209A9F89826A03B19164A5836EA5BBBBC707FB9A050B9B7E7189E511BC2280D9F83DCCAFD0CDA115BEA026086A8260B58FCCD8DD01952125FA2D1BD9174859774BE380BB09220ADBA74C2624098D5C6D46CF5B6C909BBA0539AD564C1D3EAE4F924A76111A093900B1E8CE640E19015B223432412E88D0480D1A099EA9533BC6EC98B848226196BD0AA9B128C947F048B8876E1BF479914E647FD33B04C5D728AF476F7EE1376B6F2A4B24356C897E73FBD37DC0CD94B7E331741462435758C6AE1E7134D2BEDE035D191FDA30421A91E672E7A60238BD8BF01380036D382E2360658A328103D2A678E0E2C42CCBD0542CBB7BBC7EB0E6C51F29BB147C93E0A863AC6CC9C9D3F7D991B57017005A2D2A83439DDCFDC3BEFF94EDC4B52BF553ADADCA86B538B9655B2DCB7EDB9A5C9A703F3881E495F34177864996785554F60E9EF3A5786158E205E26E45633446FC192948E0F0E1E3A0B3761A2C0C2D3E770B2A83C4DDA66CA197CC4297C11E861E2FE26E5795912CF22029C52B7843E86C996D6BD08189A2A3B35ED648B9B1FC92657B5744B94C3A73CFEDE0306023EE9632E418E18A5C9F47831DEFFDABFDF99D9F9FDFD746BF62B5053F3A24A62019E68B619AA4E71A551801083B4CCF23B1E853D383CF92653349B5B4B159B7F03AB5DE81FC0FFB85AF52F454F090A8964E7BFDFFAA0EE9FCB4E8CB579E2E2ECCE99E2E940B5E52198CE697A08A8A4E34E7643C9E48D088496C8FC4F6B25A2A61D747CB59B51AA0E46C552F5436ADD3B655B9CCD6629E9776EF7EACF1CFE0CD3DCE8C8D0CA183D2D91FAD80C36D708C5774A6E2A126D5345B60334A273E84AAB727F4D14B30187B792165CF08368FD17A8FF1665A9217E784C1B1DD345B5F6359875A2240AC3D3867C00DD6616A39F2E689495E0C4EC83EDFB0B6492BDAA056F4A092BCBAB09885237C9D9843D5247D6E285938302CF57316BB983A589CE053F2BEDAE0345F1322DEA2BF823709411D5D6498AFE190EF8906DD43C23A93DE282EEF1BDBF9F7E19CD27A585D881A7FA01089C4501076E13882C4BA6F06200F19FF5E0697B13E1E4A9A121342C17EF4A777E2CF78C4C2D466DEAA55B34AA56571FD09131A164C68C0A215A7B2CEF7FDABACC3D4C41A0BB1888E3909D86D12AA6FE5D93981F07B2F0D1FEBB06F5DBDD6B0CEBF8DBBCEF12645F1DE28D9E539FC324976B9382BD25CDC412E85ABC53A4B01ED554FD8F92C2B1FD6AA8B930BECF8055808E700FE01461CC7407BE80460E5233840A5FE187FC8D2F4A799FEF0321288CB988E5F341B8EE4C2C24857A9949035885B52E6B321057115256A264FAD9C15181CE1B895C5C9772EBD7AE60D74BBEBB52AE4D32BF6AB6BCBC25347346A258FC9E09B74097A932BB9B4382E09407AE42DF34F82C2F5DC54AECC597CC8F6B75BD58A63C99CED05BBB965D94ECD6A9143184F8148226E09AEF58811B6B2109989CEAC16F0694A8435CDFEC349D2D7DB90746301887DF5DD440A62AB78AB90A02C70E026E75596FD20ADDDC9A2D808D1D08612BDE7BBFA105BA5D4DA2D697932580912F32B5A0BA3A0DDD7E186B3DC4AAB368ACC6F61617E867B5905EE2DCC95744F8731BFB305363C7982A13FCC2F3B11B8574AE28844FA74FC9694D5204032262099468D970DAAC131D10CC8DEF202663524B2B7C0E17F889C7C2BD8D8955B3252760562C73BE00189E2952C9228DE4BFA6D2161E0EA928458B08144E59916FB697269D34E4CF162B831387E34589E8F571E26CA7C3029F301A578B5816EFC0AA9B05A184676AB56653B4864101014A6D9C894FC6FB12C56EEE67A7D4C39292C5F8930A6A7A4BCF104566A7A1757757EC7D977D309D24B9D1C61B2A8B14FF610FB6043666053872F224325C58926DE833C23C1BB1512EB952BD6684B2309EF2AA3A3870240C818363F156C6C58ADD65B4EF3B2D5508EB9B7114D7A87D988FA2B571B67D23E50C67906843E1851B4541466FC515F6956447D0979E4689DE1FE88146BD37778CF45077FBCF6B9AC026F8A9EBCCDE5791983A2275CABF8C6A9642423B70C1B86B09B348A5BBEA6457D4ED268CE11E76A5CCEEBE66C74E38446B32C87C71C8A71D50734BAAC04B421417897C30B89CB79765B89CE67CAF32B2B995345130A1ACD24CA95B3E246081629E280D5E0261529F9312907579E1FD51CDC3038FFB468B4A248E9994B3A5E3AA96DE486BE79BE1A06BF77C6CA65E8291F6B3214CC0892AE5EDD70C82F10210DE93434030ECAEA8C7B181CDDA9D896AC8C696FA0936B0BD033B9F95DCCEB2A40742AFE986E2FD6565795CBA01BDCF2ED8551A0C3324CCE6529F9E219ADD82A2CA74831D81A717A98EDDBC616ED2A3D3C3B2B1654CAD3A50E1DA83CCD6A11F0217C0DDE1F7A58BB011DD1C3440F33E356AA1162299D08CC4C450FE3A082D9614000F70C60A1707AD85C923A1FBC515ABEEAE6FBAC82F97C4E066342905171EF7EE31EDC7CF9E09926CA47D7BD8167EAFDCBB1A98EA635F3FC8363BB446CB2B2ECE8592911C5B0511E11EF834ABC0F2851AC0D7E994BE76E3C871AC5986973CA0B7E16612A152913BDEFA9D1615DF499D84644AA2F35754E5C83AFAC5E6B388B93830EC468A3C1BEDB92C7B28D51074356EB10A3C9C99B7F3F7C7ECFDDFDFEE8FE7BCACAC3AB96880E0D0F5B905D6B482E75089CADA6C12DFE00211144B9BB01AF5F1FE85C63C195A70F0A3FC1CE19CE6CD7362F495AA20BD32C0B8B272E6447C3B1C0102D5118647C7C2929306F8337DF2AD213035D732AB603C7C4E440D97E2B92DCE8EC6C516C1BC78B9D11C337A7C868CB6E06CAF0D001DB6C5EBE52B12F4BCAA6ECB455B7137E59D845E7596D3F73169A2629641A64613E46F4AFC56B48255848DA1D8722AA95859949C9967C3E44844DA540D834E74936C5F020B24B881C5A42A59873B587070FDA37F694E0007C5E0F7D6DD40563AE0B06671D226A59F6DF0B4D45B8DD07A27646191CEA14E66FB60D3BBC90603A3FA2F6F8CEF7EEEE67EDDB3BED2F6F6B44CAF99027A296C4860D6B4E8FD2AEF7CC3F750BC14D2EEFE372B49B96B35C876DA59B57B7149F46A37FB9551B13A9F1834FDC2FBE72779E2B06103DA90DB4BE677C6E361D224B0ECCA7299C06E9395F6B39AFD49DD7984B5AB19C4A0D74552F365FD9745E9B60F06CEBE449C560C9638D8DC722C056AFB0CBF2955EF23299BE2E01B6B5EA99266E00B5BD3849802DCB3633E83E3845C235EA489D1101E6CBDDCB99377F462075F0941FA74880AD731EB6841349D905361CA466CF6249D45E08B0BD62F925093499FEFC0C9700DB9ADD62B64B00237480E9E5312253B024D9BB50A2E91F4CC4C3BF0666DFB9FCBC2801B6202332C9B8097D99D6AFD336AAA57E99026397C3640E3BED8EEF447D3075D5A459384CA4891286AE9C310C9023447F9ADC209C98D74F8527E6E90C467755B137F1CB118FDB9797C71934F78D9312F83098585CB55ED98386C49D03ED5389A045C5EAB43E9517298423C21F9C6524B287E7CBFA4FF6CC2AF34674117460C99EF6D74FDA1F3FE24CCFB915CEF9F047A1681F713EC4F910E7936A5B79798637BD46D26FBD1B17FEE9C5D705CE2A56B7CF550875E4DD3ED9754924F501A0D2E9EB0C0A3857558E9B4FA9E4BF46DE7FD52B2D67D56A542DDBAA5EA86C5AA76DAB72991994B344BBA3A754B72586294386C9C72E716E89B0A571CF4AA5C4968A61BA80E71A5598668157294CB3828D4FD18A9403413472E49503A7C13AD864E8D302D42A071667174ABA57CF97D9D39898580728BC566579D28E64745053FD4D1B9F9B9D9E29FFA23CC95FCC73A58EFDBA85DDB35EFC575A98C32F64290FF10A2170E53DFA3DB7E1229E08FCEA33E2D625B471164A6ED4AD8A8D2F6191E8E264E5AAD3C487176B7548D19C9DC5FFBDEF4ABD950C814D04360923EAD409B46DC5FD13B794465FECF664029B366AB5C5C92122F252824DCCF3937B7DC3DA967AD2F574109B4DD7F9BF86B7EFC61C069F0747841B4DBE17398620649F649FDBA74C964333049BA4E9D711D20CD906BF1833278A63311E4F1A11A4009B0219635337B28BD7CCED38E0FE0C961C60A21B4FDA7FC3A8FDA78DE786CD63C4E67D5850D627B712FB60219AC97D079214227F46AF6D16AE521721C6B77812F383E08027E4201187D78F2D3D1C1BCC9535FCF52DD917FF5E0693743E5A5B9ADB4488D6E9C90B4409E13A59706051ABB4189F84C38035B3BF55D315B3D91560D9547D8E549B80CAE2B291AE5D0BCC7F183C7C32C27900A20569289A6B9AA4D0A00A59CD8AFDEADAB2A884782BD32579EB6C85A389661D5367484DDD1274A5C99C28C5119914E47156F4C711381725112B14B147888EFDD69A73BD6EC16BB8CAA2A877F2A91EF91551CC60A90BCEB3A8590CF9EF52133763BAF12C7806D613AA55547717302779A2BA5B2A8B2FD7A66B83D13E7C7A6700F6A41D18FD113FEDDCD00D5DC0A0FEF5B7F657DF1D3D7A7074F756FBCE4377F72FBED7792727A9F02E080F918EFEEC3DE08A3DBB1A5D909CDC77EDAD8C7DB06026C17B67369779F8C3D3C3A7B7DACF1E1C7FF7D8DD7BE2BE780494B7BBBFEB3EBD071AEFB249C0C3975FEE1C7F73E3E7E71F89FE95278FDDDDFDF6EEDDC3175FC087F85ECC4DE8A79D770F7F3C38FAE4DBE3BD87FC197777EFF0D943E4CA5FDC73FFFC95FBE1D7FC8D6097EE075FBFFCCFBF761EF25DDB3B0F65C9C9CE939C56E70F7DE63AB4F7E4DCCAA89C09BF65FCEEF0EE01BCCBCF77DCDD3F1EEFDC74F76F1DBFFFFFDCEFFF89A6F5E07F5EFED79F0F7FFC120CD2BBB9EF2A9701071BCB4D0A3FBF1A5C6346638C3E2F13E5D03B1EB7B3D2136339AC6B8317FAD8BF0AE23C539E5F5911DB6FC626977B732F618714E24C784D32BB83C4106A66AA30210FE56CEF1BAD2B87655D79BCFF07F0F4EDCF9EB41F7FFAF3F3FB399B81290A39F6343E543187D18305E710A7D9A475C9AA5F9CFAD5F61AFE5CBE706E6A4231A1E845E699E655BB66D95887C1785BA8B6F89E656936E985418FDD6DBFAFEC9A52AACDE56AF5ECB52DDB6AB594F34C3DD391C71C1A8F49F2B9416DC038156872FAE0EBC40CE5F375A63C60EC38367416607E7ED569A0466F1C57DF7B3ED1F4ECB6C4A62C710AE4C4B74FC5368EDE1639BDDFF190658FC90C32B5E6C045971B75E161EB1DA8D5601CD6DAAA6CC03EC82C992AF75CB091499AC3EB75D1C272D232A3F4E0B08E1676AD94A7591137F834B5E690E8208CB931161D1C21CD61890D4E0AE29659E9492A57150A62DF4473E5736A7A881D03610E955A734873B86B5711F8765D81309F21C7AC7477F7F8605FB3D081303E521EB1A0032686BAEDB11870AEB3B0ED268BC9C8B90E98A03B75ECE00A8CD9A6AF0A3ACA445D80A935990420DDE1D5E6954A432ABDF87336CCFC4CDD821148230D2D951B4D52989B0CC996C241DD143D3C2141A6A9AB8D61655AE7A90B2E5944CA936B3D6A6F53578F86C685DB6383458C41574FDCDE9DF0D7A3495FF8CDDA9BCA3A49A517A2DFDCFE741F347895B7E304D721A54F165B227BBC210490A8B987E3DD69A5B6D59BE5A700FD910D7A4CBD0C481F7CE9808511E1EB0D01B5878F047D4C17FE7A1C769C1D3DDEFBA6FD879BA17AD56C6A886A91A3F964E0BA3B2428C46752D1E1A7BF6573F8405EB66EE229BEACB1DDA232C5443BBDFE73C67A947042EE1A50CE874F99306F86C72FD1C438717443C3D18D24799C5B024B3FD3260F7B8CA67A709A6F2A033DC471E576F9E088F4BEC9DE9CFA0FCBDABE3655D9AA4D6D5F6B394DDB9A4A4639074E46990BF2A49657AC3A03F77E5D698090BAADDC0972B9CBAD5A6560367B3499B321D5FC94C183297439E0294C5941975923B7E3C00941418909CA155DEE639C064909E5960B8C5EF50989832EC139D2CB8F227A6B0DD2CBDF3EA5B0BA21506E71BA34832579F0A2A4975F65AA1D4129AE782B70A1AB61AEE2C8B330A63777EF32AFC6EE470D4942E7733238391394EB9CAF352C91A82C33465D8172D99613DBA7C870078C1B232897A0DC118672590802B3832FCAA5ED72829B7A4845189AFE633418E1F44FF46D187D1B5DBAEC251CC82DC9D22528CDED38D0A0D2E262B3B0AF99DFEDE1322CBF8D124619BBCE6A7D622A6D89163460904CEFCBDCF41E23F6ED315ACCEBE256621F6CC85AD7A42D0931C4DDEF41C64E2986F55096ECC3E1A6749EDA9831BEF324D656E639F1FA0DBD823ED83252C29964F26234D2E51679747155B91D07CE5FACC245FAFF21D42DCD583016D76BA1DD210316FDF8784E29366E5E75EA90383DFF761D4E8893DDA26412A1B75D80365C78F989E076716166566458B9931594B06EB2769602EABB41D96BFC065EB9E901C9A709331B241FDD6FA701424C98F82389543CC1C4B0BB9F0290A5122AC6196966AAA41B4F31F16B18B7E10207991EB01ED89B9035C795F3E1E64730F13B975E3DF306FAD790F905AF136F4A1A5AFDF5D19431CE2D3EED6201B91D077AA5668F046EB5F9DBAD6AC5B1488E77B238C6D01831ADC4B4464E5FB93A2F625A05D0A5B47C8EB17B4AC9B4168BC540D98B2DA088698D54A91D6BA675A13C87B98E20D32A76B55150D7C2CC8CB7231831ADD964C2896905A23CC8E344260A4C133A2873DE7256AD46D5B2ADEA05E8823B6D5B95CB6C98A4A45D71B8C1B90D08919581046D819F9084BB966684EBE8856F895D006637211FB4B9CB4237F6A1F7D9A6B3D0A00D7235FDD3F8A46E02967C1D3D2B4DAC418BD1C9E03857B2CFD1B4CFB1C05D611875608F2CA2045EB395A28462390603127BAA65518229282C6B8F6BF460314B9E12092BE88256B808C4D38E8D184462A2241830E66B38C4D3468B3687AC494CB94EF4467179DAD8CEBF0FE794D6C3EA22D7F80385A05B0D430426678B6846B3A5F89B366E332E45388E205A1CFB75ABB679C981B732BEA9B4C0F2A47853BC576C7089499F442BDBD10BDEA5A478E2DF4BB17A1047CEA05BE9280582E123EB84B32BCC30404E0AB64AB322D81287AE145CD88E41708011D17AF8EB7140F7490A97A2924C443C43BA1886C1EB0E5854E21B8D12E76A64D86523854B334F26A308FC27D1AB4004E275E88E078669CD4AC9FD4C6150A057CB0AED19EDF4C20E0F26E3FED2ABC777BE77773F6BDFDE697F799B0F7FE5ACB811C21D10518326DE49C9FF483145799E1238927644ADE12C4E7A1B73F28ABAC9451431AC99B8ED103F902706A607D57B055B95F1DFEBD928BE353F69D94DCB59AE736D59E5B0C96D8D4D1E9100DC94133089CAE2DEF36750B73E5DDB19262ECED75ACE2B75E7350EE29E6B5C6CBEB2E9BC36C19A6F57F1618BFC14B2508D4DB8DC5E6C3316E2D744E27A03AC556B6CD62DC42A5AEF404683FD1225106BCB49D3B86F261297485CB0B490CDE83453A77871269A1444E20E22894BBCADDD92D56517FCEAB2C512A9CB0EA6E14279C2BDFB8D7B70F3E583679A401296BD8E2821EA0B89B30B417A82705B5DB780943736DD1BD05B823BF50E92F910EEB8086A136E6B61A98EA6FFC1F4A284DB9E8A2D1F292492A46ACDE8E2B679E6EA89A4952A5EFA1D918DC2CC394DBE260B7703C6ACC4762D7EB48C8AC0D290C8B9081C97A4955D25644E742C8349D3274876B5194D63E7E23C79B955AC3EF107C77648688F0B9AFDA2D970A46D91C3582069C9A994D33310DA9B51920521457DC167861D5EC8F0E6CBCA4C0F58CF2F4CB4BF7ED2FEF8118794CEAD7070893F3A3C78D0BEB1A79C2337490297487C0F204A936640E5F3ECCAE7FA813FA2E0D2E9EB0C12385725BF359E4400914B9AF22B73D61CF7EEBA9024D79B9DEBA5EDB027493A106722AF15516CC17ABCF7AFF6E7777E7E7E5F3B4B89151EFC102D8BEBF5DFC33A617B71729EA403394E48C052AD1A4490A6415892AD77553140920E8CBF582160A962BFBAB68CE6E4B92F5CFC776F191BA28A7AAAEDB0755DCDFD833E822DE75DE3BC4ED15174A313B014DCF45A5F3A8BCCD999E65A180A42C09280ED080881F2D0A05A29014B042CA1AF1C50FB1C0B60294EE6A71311488A18BD6803CBE5EA5C2AA321A5B6DC8E03E7E0B445725DFC08113669F58D4D8F2D1146BDAF15FBE956864161292E61340CE794D6C392625226D21B98F6F1EFF7893092C89069B46B065DAB4F8A89BA4A81D91E6614082E94EEF61EB4F9C23F49C17CBAC97CC4EEF2C6608575CA27DCA69A02954C865148CC3A0C8E78C00215A7B2DEC2210C3FC107317509AC5963C7FB56B3B538592873C9728CA6C54BC38779C29DAD0BF86D273B5B970AA559B13D1383139DF43B5B177825877F5C057940381F4E809EB8633843BDB829DB000A0E31A5B82909D56A263FB4AB949B5D6FAD39D7EB9667BDBC6A87F32C2FAF781B9DAF39151B756D6B5530EA69B667DC89C915E6661744B58FF3B0A234E3CD5741681CED471494976695C273886F8AFE889F766E1C3FFAB3FBF1A7478F1E1CDDBDD5BEF3D0DDFD8BEF63BD3339DBA84AE7C16D391D41E81BD1D1F2E1E2B43B33706CA74BCB0FB87D211B4DC368583AFCE1E9E1D35BED670F8EBF7BECEE3D715F3C0278D8DDDF759FDE3BBAFF9E6C26DC58E0C9975FEE1C7F73E3E7E71F89A5CB93C7EEEE7E7BF7EEE18B2FE0A394B7DC7F8F1BD74F3BEF1EFE7870F4C9B7C77B0FF933EEEEDEE1B387082DBFB8C7DF72F8ECF3F6DF5FBCDCB97FF4DF0FC14205DDCCECD4679BDA5113DB32E0BA0487C9F62993ED19E75646E54C046DCEEECEF1DE37ED3FDCF4DDB2A30FBF6BEFDC1895D3FDF7513911F7832FDC674FDBF7BE7B79EF5FDA7B78FCE8C5D18F8FF8887477FF08FD04BC99006EAF7BF3F1CB7BFFE07F8201AD5C129C02E3A31AE1CBB944B34258A7069B03300EDB3EA52CD85235929C4CFA51EE28D743427F3E3B55506E4C488020BC65D8E185F8C6ACAF211CB01E71F77A5B987FE9F4B648DE4639C7D4C6D73B7111B3BE127B52A270253A5CE9AF286FD232DB689B81519B459FA66F7869DAB077ECD4AFB67F833F7F5D69C01EB2F6F28573531320827BFA3A7B967A4970CE8B9D77EC6D6AEBBD0414329B988CB4A99724652F09B9BA50152C9376CBDD16E8E24E30F7860AB914EA8CA70BEB452057D9864290C4E06D99BAE78A75B172B50E5B26289B6F8944E59845BCDE0A81FA73C03AD81A7871B272D5698A4A05090A9FF46BFDD28ED19F333F2D944195B69DE2C29CEEE942B9E0159BC10EBDEF1980727CFF9A1F68036F56E0C829E0E6E99B3CDA1C52F5E7E0A00237A51440FB67A2D49F833723A4823472860BC0442A4161F4FC8363BBE45E47D3BD261714C6106470EC3303DF5A28CFE10949E98AD24C9987B5BD344024CBCCE633918E9C73A5B61D588C73DB8C05C198336453A9AC2EA61B20724D1D07560FD2C2E8BA7014CE8FDA7DA8DDC74338B1CAE2D983B321145F5816C03FD7E66B38D114C5C8B995D89339DC9DBC11B0B8ED3EB2ABECC3E1A6759EBA7833FE18209859033383CBB1C1224276F21AA54E9E61EAD76165BB84FD3A146950BF8E4EB599394C1E63E41069089FC236FC0B2ED0F50B97D28C7FD38279DEC9B37D2A619B4E0957F5273D1373B38519BE72D2D296C1591CAE59A7658223AB4A1D5D6091CE5200C9D6353E94F0ABE1137B69DFA1192F9341AC5C6D1C0070DFF147CAF61DBDF9FA8D572CD2439A4FC2A059C6C1F1D4D08863C6F54ACB59B51AC0DD59D50BC0DD9DB6ADCA6576FA08201775232DE6B50C0975B3BEBA60503D00C8BC97E1DFA3D979E5A4B9F582C3080FD088CFE2233A0F614293E9A5FE12C96327F9ACAC0544A23F36E00AC33E1E54AC0C6E113BF83D9ABC52378D44EB9DD6D444A2E354262B2322068CC8FE45ADEE58B67284E426C726874A4076CA093F374F9F8987C5911DA1381CF095997C29BAF5F3B596F34ADD79AD0352BFB2E9BC760253B7C8FF104D4DEAFD750BD32BAD77A09D91FDB255D900C153B60C263A98E9D24C9797591680E71C84F8C609B5ABF2BE21EAFD440763BA32DE1A582C9859F691F035B6C6E832976655F5E4B915A28345B1D1CBDC486D34C21E65130D26C87BEFAC21F5FE8D5A6D7132751F697E864B74708DD4FBBBED300CEE21588E02829E9707CEB44CE78696880E6E58C2B7121D5C1B9AAD51880E0EA383497466E20D6B7B823B5EE3EE332DF246144F260040489525ABD58EC9922084899A3423661284E46B0E140F5B79F3B445EC1549080E41BC70486867D296E2F2C2C3303ED27A5842AC32F1B098571ADFED01821527B81E11F9B6F0D763D9E9C26FD6DE547CBE3A7D45BFB9FDE97EFBE347CADB957B733271883CB4D76252A058239391A0DEACE462D37D981F062CD6F0F195D2CA45E032E123014D3E58320E7F3D0E3BF7D35BEE9F7A5219D6A564A23F3B9C1AEE7A2A78685C3637C9A0A6E92D9341ADB850784004B1169D170163AE50338E8FD9A9923238A27D70D8E18578DCFC38E130BD6CE5DCB829C62D85265AC2491E97D66B21D66172BD3626387070EACC1E2B320789C51414AE3657AC7AED6DCBBE4EA33AFBDB3C0C190BA257895E3DD559179A734C8C5A5D751AA8FBCBA155F1801CCF783A9E5E448023446DCB05C677FAA414E10DE7D8B65EDBB83B994E100C5E719A75B2F3EDFA9AC8F0312CB2556B6CC68147915A4FFADEF5A6E334AF247DB74DA2B6B988DACE16244E96446D416D9BB0D588347A6712CD2AECCB8FAB1A7251DB44E9847E2948E57357F529E721365102540950159C14E6BE961BBA4D4CF02FB5066C0C61818C0336A04E7234750800550C36E0F07DF16CEB12EE51CBE2D38DBA55B1F125721B133CBC58ABD71727CFCEE2FF78BA580FD8E0D526EA4FE197AE28544F6277D38F9C1725129548D40E6F0ACE23C48F12896A37EB9EE315CE23BCFE4FD528B424CDBC6BB21A3560740891A8D155EED4AD70266D8948542F62EC483C1774F168FCD092E46D894415EB972293B402138A48A1056BEFDEEB91AB19051215664A94350E91208D3D8B1403EAA4B3D3225EA1A884A292F098B52BE8A95FFA460F5093CCEAD1EDFFDBFE9F281E36FAD09233AB341112B3CA736EDE8270A63CBFB29254A0513FAEFC89F93028544A672ADA86A90E8933AB6505C4888EE6C30E2FC4E3F29247A607AC97899C706F3E7E79EF1F1ABE1D2F3B2B1389097815F240D35DF5501215968853957A9A432CC2E46A8E3855AFFAB138F9CEA557CFBC81458364BB5C9AC3C16273AA67EACD96C52032C54FD1B8269D55F4D2229EF5CFA3039D763A95B32593CE6A577F88A11091AA455E36575654035E4235195010A90A014422469648D57522553DE3218045D679E26B62D39AA4BD651B524749F99C0C4ECE434EAAC258E8A4FF09A68EA804651EC8E767A244AA12A94AA42A91AA0DBE8ACAC7F18CDC444FA42A91AA44AA56AED6A19B217DE31D3121D28C4CA4EAF69966C3E98A38F7AB43CE542E2FA739D2D4E1B3E5EFCDBF1F3EBFE7EE7E7F74FF3DA57A105DAF4FBDC037794E69355309D03106E880C9D92265A10126DEB4716A92F689714415CEB15FB7648D82D2C21CC6C230FE3AAF1072D13ED5CF226E37055FA874C1E1DB1235B449F4463C106E5E1C6D8CFCC499E655BB66D9483EE00988BE1ADFB3AC9C2EBD90D13C0A1663648F522677F156ADAA380C74861D895CBCC278B5BCEB7C8281930C6B26836B88DDF38035DA848FE4E655A75E6B58E7DFEE746EB13AE6C9ACBFDE6C5EBE52B12FAF39151BA55B6A5514896132328DCA15D825F0AD379B1B0BA582287F6A3525836D4EF0F99EDB5BD28067E2CE3B4BE75694F107488E389CB34CB0C63B18EE277B199A34EF6532341547080F1289A906FB5C7C761A1D4B0B03F227BDC3304B2314A8374EF8F548A1E8B9B5E65CAF5B30BE58C918267461D27CAEF7AC5E1D843338699E0CC2E242A12C96AC0946E19C6FA025F8889F766EB81FFEF7F11F7E6CDF79E8EEFEC5F781DE39C82377C63B4D1675C0D9609D47133445ABCDF9AC464249434CA4F7C89E198DA938DE339E219EE70E7F787AF8F456FBD983E3EF1EBB7B4FDC178FA067C0DDDF759FDE83C5966C0DF0F0E5973BC7DFDCF8F9F947A275F0C9637777BFBD7BF7F0C517F021F28B7FDA79F7F0C783A34FBE3DDE7BC88DC9DDDD3B7CF6F0F8CEF7EE8B7B873F7C78F8FC6BF78B1747B7DF87572A76967A20FA8C69785C50B4158579451873C1D9D9DB9D4E89B253D3F273538509F9D6657BDF7AEF0293FC03B57B85DC7F532E0F2285A53141CD4D5DC22EB346DEF4F996DDAC5EDD70A67EB57D81FFB67CE19C32B243FC52E0384D5D2F30397DDFCBD444A2E3549CA291D4C3D5AD7AB3523D77655339BED4331B79C81678BBAC7406CD996B1D64B856AD46D5B2ADEA85CAA675DAB62A9759200ABEF3E013F78BAFDC9DE78A69840CB1C13F55678970FE41EC34D23BCC35C706B9DF645E53C1E293B681822BAFAC8B9150BBB2F95BBBAE0C03F29063D3D644DD0530955177C1F9CA754860C3A5E0B5AF8BB56B5615534AF0C47AFD3CA48ABDAB345D5E66A9317011F01751405BAF7BFAD49B76AD7A868997A104FA7CB9C43F447D7A6EBAA079BA549C154937F5D598688623E15FE87D4FBE854176229D8B53BD26843D491E7371D29F016436B3CEFF3DD3623F4D0578384B7103D4A658B30ADAF23919184EE9BA0B70500D8E894A6579718F7A5F34894CE102DB3FE1E209CD5D2C3185D9ED53E6924DF9DCEB9133DC943D07CCF30F8EED52674C0CF2C4EFFFE13686A8BAE25F34EC633E430EDD6B7B77F7F8605FB3D0C1D0226A0379AD1AE1F6299AFE69FA87005959908B0836B6D437DAE780F61C68835F366478F0154FE65DA2E26247044CA25E0A08C4C5EE251C0824C995BB96348DD2652237F3A5682A69A1555DB098EF2DA5DA617F65AA927175DA482D5FC389E6087AF105B11786A3B08A35B508476F1457C05AF68B21516126EE390B4F4998A331CC116E8F0DB73F8454CB1EEFCF369011479E9594722120A55CF2D2A1BDF8347948317795C9008A11DF981EC7B0CF9085846692E51B453B998CE1212E8E0F58B493048D5406346B110ADDB8171C008CDC5E9238BA844CB22F6271000349DB9FBD7FF8EC3BF7EEC7CA500D319E6C0FE0DFF2FF4AF7876FF8091FFDF399FBD5FF71EFDE397ABE93FF61FC2FE52BD16FF7D05D45B14D267E51B9DAF0005B384639B6D17BAF02ECFC004180949E29769A2878A228E858A2BD54F8EBD1D9C4D98E43E9A8C437B73FDD6F7FFC28C998C926960836ECF49E0C1B89CC893266E08EE8FB3FB34D374447EC7AAB2E05C2F279A356CD7B3114C34C35737A232C9DD1D344616CA2C0F962BD1EA36B2BE83AF496EBF7C622591ED2C815D6D5C2D692BC44A7E0DAA97A5870F0E394C09D4066BD7E022AE29783AB4D677811424A3ADA58DBEBD053BB0C67D52EC372A1343B3F3757108894FE3D73EA7B8A73F3D30B93FCA668DB89193371D2C95858985B1097E5FFB3F76DCD4D5CD9FE5FC5E587798B8F25D9C63065EA38401266480E0772666A9E28D96ADBFA23248F248F210FFF3249196C6E2613083727C119202421369921017C81EF72462DC94FF90A67ADBD77B7BA5BBBEFDD52CB5E93AA31965B52F7DE6BAFF55BB7DF927FFE41EBE7A7472CD7B7BA0C47EDFFE2D4B32CC2AD7612661338705F6E5469EAF58BD82BC99BE5AEAFA94BAF3C774C8A5A126D595A8F991AD4E822028CEC70B631B2DE546804671DD828B0C6D8B64C808D7F37002DAD3E4E54DA688F64923E3EDFB925199AF489D497FC3DACA2A8F59E4C7A10CC21933E69C555BB3367343FA96056CDF811B8D74B0FD4AD4DD5D75EF3024269CB7B8AC9B45411891226B1A392C659E7BDF65C1DF01EFB1F5FD6CA6C76122BC3E15E95A95219480104ACE6BF8ECF554BE212F80B1EDDEC5455011E147115FBCD7211DB2E2E628C0F1B2E1E625A4517202155EE00DE5783785C0907DC2BF7AA3F9FDA26AE9B051DA5D7D9ABDB0BEACAE7CD8545E8C0DD5DB8DF7C7B59EFC9C54E5E835CE3AF1BDBEAE2E3FFA85F5D5657BEE4D2BEBBF029F4F1EEDE790A2DC17010B08357FFD3B7ABCDE57FAA4B779A6B4F83F4F19E3452E9EC6B8117262E084A8A4B866211F8A8211D1AE314B425D7975FEF5E5EE1D2CB45D576F45D08DC6741BC068F586C9C0D7A40BD9ACFE5C7FAB3E5774E8FA3CAD5AC8BCB22B75B36DBE0ABFD77E01AC5DAB26B5916A1D71D8674267DB5CC639A264B73B3A5E240A13499ADE6E11F7D7F983F21FE0DADB2037DBCDBF34469BA64421AB8B53EFCABF6EA4FCBB2F692B4F969728C4CC623EE44B42C7FCF4BB5BC25B0AF4F93E553D5E2F1E254A94F9373F17B6764DAB71ED41428F3C6563E85C06A73E345FDEE8DDFB6EF4BEF58043B8CBD437F069509DD42A3991146866562DF838F9D281C670E1236140D32FFB6FD8A7719C95C85C5DD4B589018A8A30B5DAEA0EF9D2855ABA57341DF4D936A02F692655229110F31378D0D6B6112F3CBA30759B4058416C46ADFF692316BC87D288B7245DB2662390E55271C3CF2E131DAF9F7AD38346A1CF3C7B4D48835818C5FE09ED364F200A7D0A2223C3BE3C746F03F810C353ECAC015CEE0FC719D949DD034C3A452048F1D5DF7D95205349AA8F24189141727714B24AD133ED2124679B1C5CD0630CED642FCAE458971811C7B34F0C42766E32D7BE814B7736C6733AE1CAC00C3EB78101C0220321827FB1858CFC321FBB652A84E93BAE6895065FBA2A50324C061AA94E528E8DE936F31D6E41F0597F73F7C5C3A1BA41E506A23E0D343AB7BCBA33A9DFA504FEFB7DEBA5D25B4AFE5992A2C665102D9D9C230602DCFD143E16ABBE28D6135A3119C6085805245E7FF195D53B76DCF08DFD1023DF8853D5F5AE48C3D2D99AC0059265B361BB65D0E729C04AD202CBC178C8492E11305D80445CDC0EB302796F438E0A15DB378B977D4E06D613A1F78D2DB83F0521A5E9CD97CB9A1BE318FAC301D2D54FE5C36F89AB618E83BADDDE21401786411F165D02F88B297213E76B2F8BA79F494A25184F8BDBE4A675C43BB4E165B5F3B5F59508EBCA32F9DB1392DC16A2DA2BE493CDFA981342583D039B24938E11A5132A852F546B486ABE52F19942BBD9BAD4ECE6473B2B923603B85D3123D45BA8D71B297043444D15872FBEF60D246C9A0430A30827A93B80EED8A5D3248135E48FEF44D0841867F4B4C7674B2EC64FD7C2F07BC41C71AC43108273350468AF24241F342C343A2B2D19C001A4AB1E2CEF943E6978963F0D8D14CBFBD6FEEA41A8C016C91DD0097523FFE01E0324F09599875D8766A5AC5451D8581C1EE5F8EC694ABB480392A944DD008C9C851F9085AEECB9D96A4BE50FADC539129D435DDDD66F876D7C8BCA1EEFC1DA06B85B7F0CA73565E3C932D4E433DB238FEFCCFE235ACC6102AB6952ADE37E73F6CE64CD651D53D46B976B64EB95648410B0808885E390EF16A8D935380BDBDA9EDF7451A2F4AEBEF629FDBC3C69A6147DB1A2EB92733AEF0E9C1927B5E14A87E1A84961C367757608D87C09CD1E9495340D16D74CA0C0CC32D1807E2CECFE4AB4ABF21EEEFB25DC1E054C4F7C850D7A2BFF9D35EE42C78E25366DF6395B47653ED629F456B21C91D73484C7C0202BAB89F0D94BB8059639991F72F20225912441565989FA12B28A8B1D51A3545C0F1BD52B16A98E563D73565BB7C36C14E896A4115A363665C843D9CC9F6EA2D43CDF08C50C3FE22C0B07E7A704D8B144A42834CD6785A93FFBF25B99989D45646891FF4E7F3852723B63828B20E81F9C458C5FAAF4BF58B1B3034B4F9F35A002990FAA94C74F8C3874C95B41B2DEE5FBE931A64DEA6AE9DBC9E9AB03EE67E9592BB1B418463AFDB304D956A871D7F929D425D2E438DDA2A817EC64BAC4EBF33DE9E98ABE48B4AA57226208F2399AB3DE1C4F1B660089D37BE0B348C2152B7AB0DB490B9CA437FB49D23004E48FB199F3F14B1492597EB0B740BBC24C0C85CF50B469A88CD95D3ECD88972B63839935033B657159897C262177892188F4D5DBA04242EC1B2C7E4AE89031F2C9CD7332272F309B96BED5B0CDBC79C0E6D1BF127B96BB1B86BB3E5D2DFF2C5C9401D7614589C9ED1A9247A36DDC63DB5FAF282BAFA141A821AAB1783A8A478FD35DFE1432DE8DE1EBD7081070C9147ECE9686ACC269EE27247E48D818F2442F4F28295981360FBD91AE9BDAAC648A176B85CE4BA3D86A0AD24BAFE93F9EA85008A86C2837B283CA81B1DF5D5A70164216627C9B7D1A19C9568804853DD05E64DC2D55D68CA52D3B2F8939CA0589CA05CBE522DE727AB017410D923A93DDA4B713C8B83A45EDB0C202764ABA472625572E4220D9A2B018D8CF4E6BFB099945EC90EC8453A9F154578C16AC4DB52C821D0A166D16D84DDD96F825EF732945704504164AAA42AA8D74D9597FB4787DB62C69A1B4F1A5B979A6B77762F7EA1AE3E57BF32CF3334A14D78BB0D714EC2C27EE4819107869ADA5AB2E61262B529C3F072B2345D6E3A2FF00B55BE8FF5471227AC2A056576A654A40C55E415589AECDAE0109743D3B9BC04B75C989BBAF54B73E3AB00D087BC2F29F4010130E5D9932E08D4A1252D17DCDF76CA57CB5C8CF9AC6C55992E9529A7159999F223D649D45C5EEEBFE598A17963C3E57FDB5EDA5DFC3B1FFFB6FBE8E6EEE3759C03F7E2A7C6F2F7030303BF6D2F4765FFC05518878EF1221C20465BD5729E10BF4E46D21716224A226C13FCF09347A1D20D761410DAE9C9227BF77DAFF77D7939821A0A362D199E80A4F42E77F49CC667200B256019AACEE5648E1C48AB30E32E549DDE39858D052B26CDC64A894C9B6D7B3EA28D987A012AED75FDDEC81F82043C7CA94AEF1C00DD33C5EEF7083B6D8A8342E0B371F3526DE77A63671D0DF0D68ABAF9040C300C1F6EAEAFD776DEC22CD6E6E29BE6FA0686481FBC51D7EFE3C55B2B8DCD67ECCA241BE338E54DD68713BBC186439B087755BB0F9426B94BEA579FF5C656B517EA07B6AFB62A37459084E1B6762BB5C721899723A07B1331A214983A6B035270039C8693751E2DC8D6839000C4C8C2230166DF13EC697B392E41C16474C63D9CC5483892B4617597230237E541760FDC6D58245BBB870B988039301FE7CF2995BE8F94F9BE53A573D92212A5CE8C172BC0A660FD0B4B2A9F55CA7A7C4DB0B2553E81F7B0805B3A252100107DAF361A0CDE6A336A445BBB480FCD447B3BD4F0D0E8D1A3A2BEDBF74D22624E0D64EA5797D5952F795A4F5DBAD35C7B2AD1B49E31B4A881F3A211C960064E20E1D6453FCA26E8A6B54C945664A07B9F364209920C47C48BFFD85E7FE71550041A5E33ADC8EACE49FA3D46FD4182641B1671708B49BF365AE75017B5552205DF0609F531D64A906F7DBE0DFF77D796CFC546B6CB91A63170FBC3CEB7191996CC09004873BC9803199E1FEBE794D296791170C1BBA5724E2957B0AEAD5AC23879A02133E80C047D2FE8D86AE95CD077D3781BD7F1360732021C9A06D6640E0CB221F5D639365874CB8099E96AE641702B0742F37E399F631253866DC3F11092C4CAC7E5B1FEC141C35880AA081E54CB1F28C682A1CC41F685701AF42B6CEA81F141E00B2D425C994111E749E682922DE3254C418FF567E7AA25FC752A5F288CF51F1BC1FF622AD4C7A0915866072DCA212F9F0FA31D7FDF7A03503ADB20F3C7B4B448305220260FB4BAA007ED56B797C7B884EF306983C2B2658A509621D2A1DE7CA2BE5DDC5DDB92D87454174EF15269C8A307C6A30C59473F40E0B79F1DF7EEA995A4CE2E91D9032617DDA92ED24E88EF43006FD06C63C8C92568D3AD3ABCC32BE2FBE9BDFABFEAE233931E804593756338E3ECDAF61D75E52564E3C37F149F319390D91FF6FA5DCF66F9DE18A3587635EEECDA87DA8167C453D48D9AADBDA8E3D8345A79640A97D9C9AC4B512A7B53B43A3FB844795567C91EB9E010CB8E21049A184DE3BD02106ED9369B84AA02AC70C71CE3D12169F8071DF8D3B3593D45C47064E0B3221EC81B31807E7C746463ADB3FE303F592E554A53D5BF64211C80A0A53558BBFD6F220B66F90383C5D68C97264BDA06058109F29063696AAAA254FBC22307F5E24AE3BBADDDCB2BBF6D5F0BFD69F27B1D8CE236B717D4EFAE9A6E101795410D7BF136724A844A9E85D9C0C393A5B9A239F311440E0EF35C62FDF673D82CC942C02DA2B5C21F3CC19C8424B21DF13E8F19B1FF37E52F42E55C5D36295897278F2C447793B03D90181E6ADE788989E16F579BCBFFA4C470AB20C2E66404DB3BD3AEB98D95748712B8759418CE56AAE3957C76ACFF9399778E7C84E12038777AC8C06F62F87DA5CA76A922D1689419A6CCB00CFB3B041FDD0FB18B91688FD878F4A1E4D0A7AF4F17704C0D839FC9A51D7EE9BEC0C7B0584655E0258D6C6A8612F9390DCE1D55A6B27385AA21731712F67B7F5E141284960242C10FEED1C33FFE0C370129ECD14C66B02DBAC9DE40496CE50358A340A9FB3CD417E6943F057B3B6C1AEC8F71F9270A27B2174A73580DC0F3B453F9F34A8E6730E0D213A5D259EDAB0687C6593D22FF107DB7B5E4B229FF9C4EC1DE33EC6A7E79581B8C6D7A39257F399D4AEBE9DF6E25B1D983E88B93E3C4719DCD4B39C78A7B3A899DC68DA7D58D25899DE4A5F53AF8554BD1E9E899BB9AE64A0AB4445C1B794C3039940C844B623385D55D71866FC738260BFB198A79C402C94726A48758359A01470E1F14DADB0147C6BC15094D624BED015AC4401419C6DD8A316BE6119F874B664B7579E095B1377A4EBA23802A7047BCB0B9873B9FCC16E19C23A562A5049309CD1177E3AB22D66E7A295F049F400BD0731CE610E80129E42D28E2D0CF40B91F70C1388C33C225099B4F97D9A7C0E212EC20E966C55D086293AC60997AA9A58964F53C1B8D61E6DC198CC6C8A0901F11E98A6551DB64F382522894E6B98CBB7F230AAEE38AE31A526E00B5AFD8456B22D02E5D0127501618E228C1A47C42253070035303C3EAD203A0E550AFAF753F44E47581DA3339E1C3ED2E5A89520295EA0918406F486F3B005A77EDE1B2DC32F977FF509468BF2981F15CEE48B69C23E177F0FB1222FC4E53A59BD444669324B34B15A0D41F2F4E95305330D9FA77D70E826F8D006FD013815EA2FF10831551763DE04AE1F5D9EC24E874863F19B2109D43CCC2F2F8F87E0DAFA744F38125BC3E220DC647105E97777E4983249D0D9A1B1D42CF2ECDD04174B3652E8D036C88390EC69544B01EB1F430C8033C1175E0C936098157F01EB1613853DD5DDA2022DE26E1A9D428F79DBB27E1E08F87E91C93864248D9E86EA9CC2BB13B0E3105DD7D5809C0479D0CA5EB68CCDD4FF30DF53A147597A8F8C08BD8A1A8BB09042F3E4B5093974CABC7B09A7A40C2B7501997CE319089E788790E2231559D147E83545F067EC62046286D173AF6BD1A1873B4E42A5AF160CF4B850F1FA057CC6E7925554F912CAFF7046112B49AE6A94B5C73B61A5C36E5122A83AD8197D05EA7053F855E557BD8A6B14EABA338050736508F7C74557345D33486F218928270F674F54241010DCAB3AFA2928BD76818E83A999F81BF8B9087EE9F7ACB844F4009DFB96CF9ECE96AB68C657EF9DC587F2AC598598AD973104739F3716972289519193D702035CC9D01F97B32E8F0B4DE93CE1C10D1068F75374609489BF40288061E536BCAA91DBA1A3F0226A14002485D7A55BF72BB7EEB4DFDC66375E51F968FD51EE418E355D21E9D058A647FCAE0E3C37704689A32A819CF0C37EFB1FFF125E7DBCEE891607FDA68258646CDC9551DDEBB84B9D9A34A89278F5474C9131F6D8381E1B24ED24CC675B3705E0FABD022B7F2797361515DD9D85DB8DF7C7BB9B9F1980B0EF4F6356E7D535FBAC9656AF7DB4BD07C54DBBCD6D87AD1787811FE5A7BFD0DBC4B5D7DDAD8F97C77ED17F5D2226F74F943F66FD9D393E5FC6C55FF2075FBB6BAB10DE302EA4B2FF907F10FFDF7C2A726F90C2D69F27A2E6B623E84E4704731BAF42D3E71E4399BA86F1225253D90E239665D04A2DD39D211C52A2A2017F50557B41B81F94371EA88E8DBD70CA6C172607504AADB3E1B1DCCCD12B38F2E4748B65CEE1F8A22EF9A84FEEFF26429A78C9F3C3ED0972B410A9AFF4EE702F7D76689F790EDEC6AB23AED6CC3AC74DBA8367A8888DBFBEDFBD187702D772CA26416074561979BEFE3FA0052F398A1EFFB2BD316E2B7689584AB16F5858EA3860FBE1534BC41F78CA926409ED627DE584383E5FB82CFD594E5B76DB9A39A004F91D31E6FA493A4813A9B047546B95D5FDD5ECEF4DB2FAD5308D038F4921AE920F00080C886E34B428264BFE6E8B4755D9CF751A69EB07F6BBA90A4B14B1A0B890BFB876D1194582940BFC12A3EEC4FA893560C87CEA95881276A70EDFD656BBA9AF2730580B1498CE363A3E8EF91C20352D20952D23CF482511849DC85E95B3CBF76F541547D01D613F88B52547DC1A424DABAB168AA2F5071DAC379CFB36C86060FB0F267A68845838DBCACCB86CC0A2330D171F6DA239AF6449143E19B6D36225C1629E437C296C923C7D8C775269F0BC880EB5802E86525E0BE0EF3F4BC495902BEF10672A2B801F9C21C3FDACD3591239768DD68735627A480F946F6F1ED1CE649BBBA77D72EABEBF79329D5DD5E1B5ECDA3AEFCD0FC6CA7F9ED8F509F537BB5507FB6662DCE49800298AB286726E72A306EEF4CB7574DFDE90E34E99834249E3766B1EC0DB1EFB85AEF2B84C3EA9BF5DADB357EF6784558FDCBCBF535736522AD9D941AB9BEFE4BEDD5A649CA12700CABE5B9AE6A73187FC4C5894F5753D77E542FDD838AC4DDAFBE6E5EFE01147DEDF572D2D6ACDBFAAAF6EA3AAC165F2AAB66A7C3273D7CA559A5988F825364AFBB3187EB0C5EF1CA5E28260E3C9E2C0A007A58B26D1DD599874113019AAAAF2E432D35AF790664C517C77AF23A7B631350277446B23C74FEA5E71F201ED95FD9C0865EB4BF5CECBBE9839205F6CD4C481E56B6380DDEA4C65C6A334045393F9B2F2B672ACA64A998AB98902FA976A96AE780456F65018506E6BA7E7BA97EE7D7DD3B2FC08037AF7DA63E78610DF975D45CCB63A023837DFFBF2F353A1874405A2410ABF1DDDF01C9A0425BFB7177EB6E73FD11099DFB31054FBEFEFC55EDF52297352B16A4A32A3DAA64033CD9807CE5CC5C31FFD739089042AC9D8EA3FB711436E0D555E880D52D01A87EDEF50A26417F71F7FE4A7D75535DBAB4BB781D62E3B5573F98D6B7A3560126435AB6B7B35F8F6136D60A6C5A02D25D36BAEB061A49E892BE741D322AF5E51FA1EA1AF43E0FC39956B0A3BB288716DD0EEBD697BEECDE921C9ECA162A66BDD9D12D390C622181529DBD8704AC81490248ADD8A8154A3CBABAC54E3CD31359684F9E349F769235A9AC3536BF55AF2DD676EEED7EFB15D8FEDAD663C041E0C9A8D76FD776AE83D2E217347EDE52BFBECA334CBF6D2F994E716775D889FF39F2C7BF9CF9F0BF3E3AF6972EDEC56FDBCBB05AA61B2001930A98BAF86B6DEB4B9ECFE552C4E30AE41E7BF2FBC83DF6B44C30D153294351259D4877C798FB77EAEA66FDDE86BAB0CD5CE2A7B5CD1BFCF5FAAB87BB17BFC088E9EDE7F5EBEB8DAD6F9AEB6BE815B238205CDFD58295C383A61DEEACE98155809CA1E90648E94B953EE455355DBF59BFFD02A0032289367E30F5E68DE6774F203EC3A231576B5BBFD66F3CDD5DB8587BF5536DFBBEFAEA49EDD5155A6EF7135DFFE9915E18A59FEB8E19583C030E1C673282A69095CFAC845D5A9D09F7826D3EF803CAD9F14748CE4A0BF58A53DF1C2823B10CEF953C917D31AEC20EB3B104E31F8BFA26B14FA1523DA514734A59C99DCC4E2BEF9695EC59B620C845976EDE78097484D9D9FC996A7EF2AC528D400BC031D227C5BAF647B6F79FD8105E856B3171FF5014F5EE32B4E9DC429395B1FE23D9427EA29CEF673B25EDC436D06C0AB6549B8784FD0846B369BC0FF810997E89EBCE7037FCD1C6BDAF5449820FEB5C6AA673EC03BDD9C890E1F4E1D61C327D3CDAA578EBF5137D34623DA2B8DABA68E370B2694DCEE19708762198B2C61DF78544E00D5131910DA719C5B465F410C08F774B65B0721594C46A09395918495D255F9C2E2848305DF9048C0DFB87D3982FE4C30EFA5E20C381969AA0EF2626B2A04C64073307B8A134F196A586818C9C1D4EF3CB078734366E109AF705E399B4EB978992BC6D370193C89CABE1BB4E24146ABE18EE289C23CB21F7CC6D7C6C04FFC3CD47CF440C2AD953344D2158C738457F2297D6D9EBEBD9496229543924CE609827983E9E3852E14753C704E158C7FCEAE9C04A01F630806BEB8296BAEC66652727954AE5E3D259591A97AD94D3F2CA1475E0E5B5B7684E8AC16579DBDD5678832E786AB288B724BA3986D5D4832EA196CE5AD48D1F260CAE83C44875616F3E23DE7534C1CF6E0EEC612E516BF88E36B087A12750D8D2213FC368CD5AEF490D8E8C08BCE991DB04964E3F8219931B0B7F40E9117FD51D7FE753DC9AD8F3F0D5EEAD05CF137B44E04C7B48E3301F36B0888B34C8B550FCA76052D2A0201AD25E3AAA4C65E70A384369B03DDAE919B11A27F654C03F05AF15BE6042992A956192526A909157F35FC7E7AA257109FC0577223B054959FD2AF69BE52266767988DD661290D0B0E29BF4515063FDE921337782BE252E116EF6956EF141F1D13651275C817C2E0F53B8CBEF9C1E17709E49066E8C4300C2E5D6E073DBE529D6E11F590E7CF410B3414CB1AA75E3352FA2E6D51BCDB70F9A6BD7EAEC1A482ED56F6DD4AF5D74190E54BFBA0C717CD1CDBF74A7B9F694A79B7150D0C272FDEAF7E24F376FA8D7FF855FB97E0D4612E9DF613A82A1A55EA6CE5A3BA69D36F3DCB011B34AD1D49070ECE5EF613EA2410D8D8CA4C44882003A64C8B406E1D450637DAD71F392673564D1B54635C49E3FF486901A2A17E1D0F3A915A847301A6848A0EC3B35E43CAF0CF491FAF29F7C4C15540C98B4D2378F9B1BDFA2BD5D7AB87BEF11FCA30EED7DB75EC33F9AEB6F1A3BEBEAA39FA1FFAFF1D372FD8BEBB59D55D05FEACD6BD00E88351DAB4FF947F10969EAFA1AE81FDD7473CA245062C657F8B788B77F75198A1544E1C2261631C0E734BE79AC3F4BE489F8207A6C54AEC7C43074B91E3B687E4F263D32245442003D361C891E6B2CBFAEAF5F81ED6A3C7EEA598F591ED2A8C70E0AEB1D2E51447A8CF418A677743825B0914158616C27D44D6355D3E777417C4199346EFDA2EEFC0C720CFFDEFDC7D7D081C6FFCD0BAEE145B8B8B9BEBE7BE729BC0EF5C6A0F176591115AFF001C5555FB9597BF3A0F1E095BA790B0BF6D84050E02251AF3C40B5766DB17EF559FDED42FDC5D67F34B63E47DE24C3D7EBFFAE6D3EAADFFD02BE0F35E697CF8DB785C31F37DF02505337BF6B5D60A818D75F34DE2B2A59762B49507CC0D30C16B605C63400C70EBE8D1F9966DE4BEB3DA9D46846E810DF8ACFA9CE65241295C8ED5BFD97ABCD8DDBBCC4AE716F47BD791D2AF82D9FAF69798302D468AC657F629895301EB99AE107E71A75A38E8BC0DD73905DD46F771E36D7A11385CD3CBEBB01A5F04684A67E75193E411433B36BF02DEC18D46FBF80265EFE462C2DDD798B07E3978B8DA758876A3A15A1E5DB0CC6849FC7431AB219D638D39A017D6B24C92536C0DE63138F80BFC163580210DA8936B9B3BC46A1A5D98436B46A01F37B2C63B0217F9D711A9B9DB644EE52830735F7577E4F96A85DFAC010DC267B5EED7A83C21AB407738342A74B75B4CBF2DA845EDC171C241BD894A16279016C21A7C2ACDFDB0423EC159D3A3C6B5A2B086847A72383C343EFB18566137E4E42986D70D0F2A2210268FECB49C3C5F6B90D3D1AAF473D6D5603D6CE251CD6ED436673E33ECE8D3C0C0440C124A7E67363090365D2998396C0AEF97A8B8B96490FB3FDB7032916EF2C7560302D8EA5F400C8228BEEEBA289F7E635106FD0D6EAA3CBEA956F40BC6B5B571B5BD74DAAB475A386F39AB60F22A5ED834866793D45E28D20D610FC36DB10F76DC403C8E3D29A4A35895E460E92ADAAC9FC1E0B481E3E70C009536758755CCBF264861D8D48C66A74468787ED8D02981CD33934CA9FC55419FF646F4AD24EA624DC497AB58C86E2D17D75FDDBFAEA757E98DC8F11EC90DD1366A2C1E9661CC3B7DE4D6C2C965E43134E6A0B76DDE48FA54652F63B044263FBD4E24B3CEA3A0D1FA13E4B59963BC047E0163EBF54FF75A97E71A3B9F30C3A98D4A5E7FAA65A3E5F3B7206D1CBD80B2C3F16115B4CED24B770A9B1724186538D7FB72A1E37B1B031969667366B138BB14C6552A3FEAC997187D3961D08B8C3EC84F29C89E503655B6A6FE8781968E82D9DCFE74AF347A0B5A85C2AC019625903A116E45D4A0E4953879A354AA4CA3B8EED61AED4BBE5AE6A7DF5197704D0377DF81A1A6AC767678F1FE5ED4D7A910FF43BD69717B8338C890D6E1ABED9847703B53EE8183D9C27FEF4F2B1BAF2129510BBB27EF797C677CFF55F1BF7B6D49DDBCD17D05809D77CDAF2B797BE073758FAE18DAD2FD49B4BE2D32076F766B1FED9A27AE917FCDE950D2485D85E401AAD3757D5279FFEEFC2AA480BF36F67D7FFEFC25710F7E3E62C721F5B2EDE0CB4587593EEACF812E3096666264B8552593B59C343A3478F0A956503B0EC25A2A521A5AA2798331AF54DA22D4C0FA4FA8430B6099D49E775507B191C4F1F6AEAE3FC39A5D2F79132DFD71A4C375EAC409586F52F6CAFBB5B0162BD2590A419F9CDE25FBC0E418D20738C32116BBBA16F2396E1354686737E400B5779910E63156B3737BE63F7813B686E519C3F5F518AB97395E901D389B6292569BB51AE76E23A2F78BB7F98FFE31494FB96E68AD5F193C707A0956CBC50D05F32DD34A9A1F14A3EABF144873540C956436F6FA90FBE06C2119300D848ADB0A8897EA088BB534993E67974204ED574225FA9FEAE50FDFD9FCFEBFAE877D3D5DFF79D9D1AE70ACB249CA49DF68D76E26D84CD0DE090BFF1DBF67DA91808EE11F8C163AFF00F315B76340D512FD0DE966E37B8E0783107AFE3345EC87449AFA07E62E5035898405DD479700872CA9F82BD1D4E376C9071F9270A27B217807A4CDFA7A9FC7925C7B5125C7A029A14B4AF1A1C1A67B11AFE21BA3C687DBEE656E0519EF99B3F647E796444F8A3A697334383224C6A7A3905E57A7827FC0BDF77EA27867BC42CA298220C807BF0583F6B951139EA6AF903253F3DA3F79F670E6A999BAA7685BC1B39850FA22F4EEE7C962F8DE772B956BF2CECF778213FAD57CB4E2A45E82DD09E2F5027AD786A9E0C6D3DB4C8933858D7561F44215F842E08EC44800FC35F4ECD15E0852C7442F027F515B868B933ADA70B13CEE0ED8CEEFD03090C72C47DEBE8758469044FE15124C1D69D72A76CC1FC21126C4B8B717C6712051B1A20A1548ACFCE94E0123408425D33252F946775526013664F48B649B6BF400D27C292EAFAD5DA0E7F41128D9C6091B54E28EDE0FC12088748AA49AA9328D5E1682640AA0DF09D1706C609DFE345E2ADFBDF0B48DC2D361513F66E0BE29B529BE0E0C1FFB887E2F106DB085BE767F255857F84EFEC28829450F41E36F09B04D33BEDACC77DF7BDB7802E3BDF011FF41409B41C1D482609240904736C9DE70A2FD954C8A304EA654050FA6312459B5C9751B9C327CBCA0312AAEECF5481CEA9687A46D4173C48E9E493B260263CAB295ECE1C591E49F5488462A648B16983E86AE40FA83A67B8551591555F654C712B75D366E1F2437513FE208E75C4DB5EB7CAE6CC7227DA747243D5A0A16A012675ADBC8BB5F21A2BFC7865A1E430C289845B647D45D828643E34A70C5D45EDBC420E67C7120AA7222F4BAD9A24ACE2769C0584F78DD15032F67691173F4B71AD1FAA416E77A4D59D46FB1C6BC919EE636F977A216D38D47AFD571193677A8505E9249C8FC198D6BC234917A1EC8502295F53027AE181A8E22B927AA08E2A54AAF802F0D72546B244976F86ADF83A20AB1830567CA587A8E2EB10F37FCC253458B2B5E72BBE46A5355C3D58F1050F620DD400ABE10C563532AD325950B265BCC4B8D3F0EB54BE5018EBA78A2FF0BC856FE17F8A5CDC19786F18D3502BC07B9A0C2F48BC5CEEABC57DEBE82B51C597B56F984A19ADB449528F3E4CBF6627049B2ABE243DF124DB7B43B657569A6F9F4B42429878F09D33222862D3354F35BA1DADD10D57F1E554DD35A4D36AB9366748A17AE4250C78B3492FE56A8B3099D270DDAE977281DDC69B0747AA87EA01024E77EA54F9572F48AE0B34F5947F0A5A3EE522972EB76623AA6E49BBA0378B0E60B0D150D28608863E7C159FF8CA96271FBCC6B54F3D275454BEC5C0B96F28EEFF04894A94A4A8E5DEABD5021D5806B56B2DED7182933E7A7D094E6A115B23226316B857E164F26E1ECDF8D9A933822E28485840DEBABB2FDD1E178446E0116C94C67040E0D1D0C79D6CD3079B8626CD671EAD0BFE084E3BBCFD8217E572BE4E4613BAAD6EAFD45E6D02AD0C7F515DBEDED85EF84F1D68F23103C0EE09571BAFA8AF2E0007716A10675FFC74A7F1EC09D277BE5DDC5DDB02C7A779F5E7FA9797EB4B5F361716EBB79FC305FC1A64087DF269FDEBD5FA3FD7EAABCBFA9798546B8FACA8D3B01DD3A26DBC843555DF2C8817179FD5B6EFA8AF6100E5734EC22A673065889581250176B9FFA777CE47DBA54030F7232C13B0699CD1DC44FCA9F78FE006B1A34F30B71354340473B350B2A20D1F88B845D6499715F3936771948249479B4E021C041B1D45F0D76B9F0EC15F102982BFFAC4AE568A94E02F18665E231C261C2FBAD1187B3D02DFD585DDDB6F4700BDD67F5E06700A58359586DF3872E5683588C69331BF2052F0C71A47C1471FB4C3265B846B4DA8AC63048184CA624465D5C3B3D94A65BE54CE05D14484BD087BF9EDEB03E549A1470A3D8AF690CA2786211FE1B1178F1EF28141EAC6A5C6C38BC600247F0508AE217008DC2499746D0706D63D84973F3C3A6C25E637997C7BF793C0189B49235A223AE2629A76468031FC9174D60EB70A93A0F407B81E0EEDFB2E49319B34413CEC1D99BEFACB2D3C726C38133FAD12E0010F04B7654DEB6B2F1163070B107BD8F344F79FEE6DC68E2E1DF6366729AEFB4018D7DB5C1DD95C0E193A704A13A92022E800794631E0997687747BA2752A1174F41E41C7E96A390FDC384AB9FC61653A024D246092FF3920C46886583831632B899F03B623D054A4B271B84F050E5741C1CA8BCA2740D2C7FE319B9D84B136AC73D0C8DAC0BC573E5289F839F2B9236C2C378CEE4AF44426699536F17380BCEBB31124195F9AC874A4126BB00AFD23E2E7207E8E7C0E267667CBEF9C1EEF077943070343753186EC889F83C6E821C8310F3A62BAAE33CC44BD2EDBC4CFC140B7C84624BF7197A47AE69D234EA5E50845C2F173803A314C646ACD16D51939820F5495C2F77DD9BCD616BAEFD5264B343E125EBC443D0E9E899E18D99494AE99B00EA35B1E2A68ED472C6823AE9B45A923CE0EAA3B475710E39151D53EF17EBF95973470C9B64D88EAB41251A7051AB02CD0E4A9F6613C1F97F1B5110298F3872CC9B8280692EF1980C9B467E2E024B178C0CC9B28E4D4A56091ED7E5C088DE0242B8089A3FC32FE4812B53182698DA28D31B92C1EC47A11101824FB6CA0DA655931ECF2875F1CFA2B2916796AAE00D52BD9B96A89FB910125C229A2435031D69E4BE2BB20A0280B91C7856A29EE88F1368A3B461D77645D5C75E2BB30D4DA797580098F01C8D3F8E6F0746AF4252DF6B951CA0D1301AF2C4912313319716050E04E5EB240788CE529A15D023B9438E30F1204B2CE091C711E912B9A6C63A835058A1E7B4D27BB84A961B93A0DF18D5DF5C48111323C926C999405CC306E96740E0C5EAC69CADD0D0F8D1E3D9AA8F29FA86F12DDEFF4C0501FE762E6A7B4F676AD7E712382764FD4D0EEE3C82C314268841B1505BE3EBC62EFADCF9E7274F1F29D78BFD9809A3AE8EDA33410F705486DC12F75182A3D07A29BB6A0B51B7C0BB383BDCD7DD177AE94CB4F5D40FE0B22C0082A062EE228F061B2F5D0DB5BEA83AFADD467CE8037D10F440418BD4C80712E12020C4244724F35D1073724DB456630854D8FD50BB3901ACF9DCFF24C07B843C78B39781D480CD2699B2BDE05F25BA55C6131E812163E05E29C282853D5A0EF0557B35A3A17F4DDC476315110898489C2FBE57C0E77721A7E1ED1F82B5207070F728130BF3C3A382279192AC50522305F8D15E4E0D7702F5BFB9E0E5733E383809C58C43C00DB053E853FBEF83D36EE7582B9A87137CB7B8388823C1536D6DCB48D2F481AE93A73EBE8A68622B0C0D345B28A75444E95562E51642EA524ABEE1DCED057A7DE7CC2C7C349C26A4CE1311B2F9F23C4B43E892B892B8087B8AD02AAD67AF769260803905E75D7AB49658E904361628E401B67CAAF0DB2FF7147C72D222ED2709116D8B8606063D4DE06F026EA71507987638E9003E37D29B95ED0AF47998D3A9BE4726B36A21AD7CD32C87057962F0E086C49DCD03935FBDB0C0EC4B5832E6A3079E2A64FCE265609629528562B705C5C84B423E707CF51D75B05097CEA83EF8CF88D0940A2D09A8BD64DF6CDA3D10FC72A41505397D324E82EE7C20A9F6980B8804AC45093E1539E9F235609A620652D2D7BDF7B51D789550220942975EBFF6CD0D4EE78A676C3CEC4C4702B838AFEF7BD87B2EFC9C6543D0F08C37047C8E0E09E9645027D556FF5A004FA306FE2A317C60EAC772406D2337E04EF7572628830956AF4C87315B295EA29A50855A34AEE64765A79B7AC64CFB28DAF1E4EA56BAF7E685EFD19468CAB3FDD693C7B627A40B43E7AF00ACE9CBC16254564B5FB93AC568615A11E79BC909F2E02426585C9AD62B23D6DB90945C6C840E6A4C066B395CA3C94C407D15B327CB94FE5979027214FEC3CD18730EE0D62A81E416850BACEB8C99A2F9EA83016E1DE96BA735BDDB8D47878F1B7ED6BF587DBEAF64AEDD5267FA57EF7068035487267D2B59DEBEA9587F0F2874787AD4D9104DDD04312945D89CAAA98760641111FB098042E0CEF2D779EFCC6783B95ED5C5AD062F66D28A66C6F282A0F0C41A40786FB6AAFAED4B61FF2F3AB3E7AA17EB6228122E0478990AD648CC4A9A3CA5476AE50C56112BE02A7C492817B9D9809E87B9B2583B771B96571633AF26DEE555CF781A7BAC7B932E6660BA56C4EE7CAF840C9E6F2E7A6492945CFE0229C26EF56D3C634C529CC4DA2CC88C8BC0A8F08A63D6129AEEE288DF51F480BADE7251EDF314D86303329EC4327F295EAEF0AD5DFFFF9BCAE967E375DFD7DDFD9A97122F4D1A427A69A9A446BA790341AE9A103929E6D138DC68161F91544A3A17C006A2C1079481ED21D39E54FC1DE8E1EEF44C1B8FC138513D90BA539E423E1E54653F9F34A8E7780C1A5274AA5B3DA570D0E8D335DCB3FC48546637478987F88991803A3BECC7D35BD9C641A0D7C107D7174B618A2D160B3BF7CC576B8131377C3B48BE97589B5C34EDBC72FE2BE75F47F884623F681452E22C0D413C9EA8C7BBB37D16844456ADE4AD4070B9B93B87A1157A2D18875101CE9D58866B4279546430E85A9E4886834B0E1D7344C36525610C4C544A3418377E4BE995B003FE8B808943A40B892DC0D064044352E1E7D8D1C539F4666C30FB72F15A5175010D70EC6120A88EB6651DC8846839D36A7B345F5EEBCE44214E0782A050AAA01B5F3833FF54E04547E2CF6D7613A63029F7AB0B52D8D692AACEA210E3726BD89BA79D4C244A34150B3A7A126AAE89E266C4FF63CBD1EAA6B271A0D6BEAD6FFD9201A8D5EA3D120A8A843452FEE7758001675ED54B2E12D22C4A97C413999ADCE7C943DA704880FA5A8F7D19780C6157241BFD6A14AD3E5ECD8948AC475B32877148EAC409F8EA502B8ADFE376C323DAE1DEC3971E31D55D0F058DBFAB5F1601DFA2283283B22A848044105025F9AF8CDFA52DF2B79A228B651F0BCD6C6049A22E8651CE953971EEEDE7B64EC45969C36EA65FCC4A5D2C79B964D7461FEDEEE657433AF7BB98BF10FF37A0FCEF8C9E3037D39A5A05415FD353AF0D42708301FC58097D73BD028245A83D1686D6F548A2EC6AA2D121297EE44E7F274B59C2F4EF729E5F287918CD606F88434B927915961041A37078FF5A3380B8F7B3E9F2BCD1F01205666937759F198D0FCC4AC80C83331CC0AD42608DB11A8558FA66DBB4EDBC6507D7B3F200B90B6BF4C6D82A318FB42AD1A98B6A6329B9D44350F400BB2FC30EA7E88C5D3F09753739D6ABDF28E5D9810F8EB6E89C97F10D160EFB78E4A3CF444EEA00F83069D5A09499EE377233A733845F683A6769348EF2991A696C44EB4247A37DA8437D80AF82EE940FD4C6D8B1E821BDDC5DF6D0125531AAB872AC76DC075A21E07CF04B52D522DB9DC0F740BE5066DDA114859924AC20A00A7D62A6A5B3C44656959161B52606A8DB70C068A1BB52DB2D3E674B6A86D91DA16C7FA75FAB87DD90ABE67C0277391120735A96D91A0664F434D864F69FA379BE5C593A234FD9B0FE5310EE2F96DFB3E7F515DBEDED85EF84F1D7CAA6FD66B6FD760840F5C6DBCA2BEBAA03EBA9F1A84598B7CCA22FC5D7DBBB8BBB605ED147CFA627DE9CBE6C262FDF673B8805FF3EF854FD5279FD6BF5EADFF73ADBEBA2CFF928D97700FEA9B05F1CD8BCF6ADB77D4D7FF52579E37D7DF3476D6E14302B8610415930115511D05299817197A9BBAA7D9D3D50B0505AEE17459697ED079C9534199AA1A477FE1EFD67E17E3DF0D34F82C4FDCAA269B00DAE673D9F2D9D3D56C19A99DF3B9B1FE5486550F14A1676DACFFCCC7A5C9A1546664F4C081B4A8C090BFE720561CB4DE933E7050A4A4791A46B44F6915F5ED096FB8273107AA7A38633A0D5A8DA3AF8FF8F7C24538CCBC48BE069A60E3ABFA8DEFD4A55F2D9FAC3DCBB122CE55D39E9E07F7C5D218FF74107701578F15A8C13B58890516AE89E65FED25C7690696BA35A79DD217C51A70F099A9700B22052D1F684992749B8375C6F14CB10937876E9CC80CA4B81834AEFC5A5FB8B8BB70BFF1CDE3DAE655E858328944E8CDF55EAFE8BCEF5EC654F82E356182DD5D59F02EB87096DAD5C4FCA1B86E1FB47816250F15112BA7EED59AEA1606D95E0039D7D5A07AE59BE6673BB5ADC7EACD1B086D76BE10EA717353FDFC2E8097FA8DC7EAE2637E4C507F2EFE6BF7CE4FFAAFCD9D677081D0A5777EC54FE040EAE60D0032F0BAFAFC12FFABBAF15ADDBC05C30FF9F9AADF78BA0B9FB6F4BC75636B3FAA97EEC105A6A3A7ADBB45CFFB16F2CECBCDE1B97261AF3C0A4CCA93C351CF1D65BE78307CD9C2DED589A1CD4A1BF07B279562308D63BF77D2A31953BBB3302E07D93506FC97CE88B91A41866E466D987B043D384DB6CE0CA4A121F381BAB5C9759F490DC4B1EB07D8301DB1EB4380C941DDE9FBEB0C2968CBBDE7AA18140048D077FE5CE110D662802F345B562A4AF96F4AFFE1BEBEBECC40C66820E3D877DA56846051FB0143CD1B2FD5952F11FB2CBD4490C2BC43EE16D02E46CF7312B5D1C044726660B8B58BABD7F55D5497EE34D79ED22EF6CA2E8EF05DACAFFE60F43DC2EFA22F081A7FA55DBC3485616337A1518A2C54D982765A88CD1462E4CD44AD70A1166214E054FE9E9439C4984A0D8E686056E6ABB7070FE0A6F418E390494BD8F89ECE1F013EB2510B352F5E511F7DDF5C7F6EE5BF993FA43D8F2196082B6017661C4AE19FBAB22D69F3126BDB72C07CAFE6AD648E476B2B5307874782877E8723D996F01F72F248F8CF1010E3C78DE6E51FD4F5FBB5D7CBF595BF43C01175DDCA3F2C9F2F131111F497FD29632B22A2855A8B449F2C1BFAAAB5170DE169F3E536C9088B973ED63F34AA6D318FD6F8AE03D7F443C452CE4E8E7ECA6DEE4A04F9F0CEB5DB681D51B36C0F99CF436AE440CA9FCAB1E5A930DC04221AF5FA45F5C103D028B5CDCFEBABD7D52B6B3C41E8414A580168C4EB9866A2E7B63ACCF96C9DFC4C6A1406B932AD26CD06386BD394E551037C042EDFABCF1ACB0FF445B47CA6EC24B13B0EBD7C961312C811F71E1A676B1C5720BCB5EBD22D484E4E273590EA8370656DFBA1FAE04D63F9328498F58D57EF45EC0678CFEB18B463EF062C6D00512F04E389150BA22636A60F00C0443E971FEBCF96DF393D2E3004C3C42EA7BEAD26332EED83C6B0549E1EF87F8A327F7E203B9B1F982C94E672037FCD17F37303FF8DFF7F045F380D91B8FCA432D037375B286573EF01D3AE49D987D6E874E071585B4F1CF8B7B7D4075FAB0BDB2601E8610D46AC58DE7A4A5C7456AB3905F8A32A2548E3209A6FD364A600B3B1B5D17E36217CB11E483839573DA554BD885EDB37C7A843EDF216B35E6EB4330BD7BE6EA4B32391FB5ED0D961C9C2322CEA54BD300B7939BD5B06CA308FB342BE79E02B1A651589ED57BC5B2AE79472052386D5D22C288440945D98800DFA5E0807574BE782BE9BC8C2DCC9C2780475FED074399F3BC27803412262230B63A2A4D983F2074A7E7A46978DCC41163B05CD56D5AE10ED7F3C70A6CF024D8DC24D834C5804B6328385A94C44270B4AB6CC2C58A95082A81E23C4803FC29089C258FFB111FC4F20FADE9EEA1496977F828547268E543C854982F64FBB808F306192B86F1D7D2C22FDEA14439298C009275570751A477292ACBAD0B4A3AC42FF0D117A91B86ACD234957AD7522EBEA045917E955807DE9A0F005F56A3822AE38612FF11EE0EABAC58782EEBD0B740D1BFE9175237B8BA5B5C2FBA630158F0BA10FE5489D42D3F2AC5D828E2AB24BD215CC7AC775B3025E06103762C122162CDF59561437201FA85FDC8026B9E6CF6B01E48EDAFE93D1F60F5B59069FDEDA014EA8C8733F52AB3AC629E2D71D34E202917CA7F282423554187F542E04D1130487080E05616984685B00712338447028101C52BFD9ACAF3E537FBAAB7EFA545DFFBAB6F34500E9235044A088274995625529EFF93468C7F047927050A134992DD8147A5270081D0F6F88DA2502D37B59730A0EC1DE3BD42BC7DFE1EAE4C091B855BD95F5F1E0D0570885587008DADA1BCBDF376E5E52579FAB5F2D102C128550F1B65307F5D4354B893F596321262BD02CB12E2A8A1575626CE4BE8445E3678368068A0E517488A2435D9C6D4BB9D94F3C94FE0167E4EEDF1F07517010906CABA7665E222FBCC6CA7F6BEE467BC9408FB0AF986408FAF4EEC4EC7D097D2A047DFAD958769D2A1069E05900874241FD823E47568E1628534189B18A75CA00895BB908A881CF68E0072F327153372E11F469A9318AFA60C7EAE49F41DC5833A3B45D705FD64D77B642C8965B05CC2EF817B190A90405E618517E776EF2AC859FC014A244A162456B936D1DA983ED1E14E8BAF1427E5A577AADC0BF7FDFEAE07B99634733FDF8E582B0947218FE99795CD22BA02EDA79D7E26B2D4089835EBD000E3B151051015120580E9C6FBC7A6882693A756503669C3456AFD6976E62E3E8E73BEACDEB8DEF3777EFBC0820955458948CC222B42E4186AC198C0B51341A42CEF9224C8CD38013775C2658DCC0C486147AEC566A208D14C96FEE18791A21AFBDFBC51B60C1959C47CF53667C8107CBD6134363DF47CA7CDFA9D2B96C1163E4410082083305D2D8C4D00890D7F7CA216AE7105DCACBEA3B001C66077D31344E2BD5E3E7B2D3CAFF58A6647137844EBC5B1ECC65E38503E09D3DB81B279E281A0D49C50EDA2ECDC48FF5C7C581E8229DF1DF00BA9CA7ABE57C71DA8427201483E04FB06EE9C51E6D6AD20478BCD13FDA2A6F430808EECA8683B1D27EAFA409BD5548BAC85A2F68C2B0C4876996EFB3B0C419890F33836C8847FB15447CA87C00A62F10DD63BE089501CA9F82BD1DA41636C8B8FC138513D90BA5396409E4FB34953FAFE4B81B06979E80D1D3DA570D0E8D33A0C63F448468270AEF03B321AA370BC3617A947F88E56508E432E7CEF4320BB8B5BFCC221E5C91C1AD68DF1367FD2ADCB4BE103A9727111F72F3E591F48AED23F7E0E3660FF4A6840DB106530409765AE66E76E6D6112A10F12131C9793C545D97558C5FDF7CA2BE5DDC5DDB32815B3C837A930148B53C8367935221D54AAA35968A15223EE4A4CCCC185B62CECE13A15A652EAD847ABBEFEA92EA250C90CF8EF5BB45D310032482F8500A7BF76575455B4CC663436F1BA9E005A55028CD735F27EAF87AD84096AC2ED0E101C0C26B84F1878916315F543AA54093287B2E8ADF06A776E54950BD52A174820AA51D748C6D1C1B042AD898B81E1354A2629414F053A135C4550D85D684D3B470499720904BC03119E81175690526C11561B894923B09E50EEF9695EC59E693118563B64C161198ED58B19597703841B77CEE54D08A893D437744D04D3EAB187D0CA28DAC544F805B4C00CE75B01E01380DC025032AF5089EAB1E26C2490ABBE5C7FA7D9632107623EC86452ED333D028DB9A041B676EA2E7C26E447289AEA0136B0B45E1280AC71399AE15EC5D31383D03E2881E3339A43D6414ED031A9434A510714F84888992139049AB608F801A0135026A63FDA1FC5B8CE813992701354A91EE87E9552EE12A56339144A7D6E5BE9356864904A204D4B0920DFB84ABEDEC8E9416D5D2A21DAE6BB32DBB05C5A795FDF74C788DE84567A8B86DFD6A6F442E8898945C8C185C8CFF13000000FFFFD4544D6BDB3018FE2BC1F752270E4913E64048D9186C2124859D6559B1B52A9691E479C971A741196BD9613DEC3AD80E6D2F3B75F4DFC42DFB177B5FC949C32087B1D30E91A5E7FDD4F3EA094F52013FD328FB6F8808BD25134296DEE1E049D917244B0067449BA1E624F456E9C168EC0114F198871E5107B321BA1E967D3551186206EBDB8BEAEAB27AF72D2AE82933D5C79BF5CFAF0F5FCEEEDF9FDF5FDE541777D5F98787EFB7BF3EFFC030E382ED9ADBD5509BA75EEBACF415142D43AF19B43A58DF2C73167AF15B525737D439E660539AC7D3D0F3FDE671B7171CA1BB858ED99C14C2EC58B050EE024B1ECB722433A3A480004B85EF58D039A1DC12217806555B6D1F73E2615A08004861A473E5590C963957DABC00F328254A433D74DF8278B6ECBEA69B429134A9C36A16D553E844839968CA81E8EAFA6C7DF709D3A4C34C3F0236CF2953D92653AB6E7935C2687B8B56DB617F3D4C988E2507BFDBC9E0C860D0F88984E50FEAFC2F8CEF61F7842F986E8C59D998CA05C97668FED362F98EDC3AD2FBD9DF70DFAEB9D73BF3D860FF388FB2AF193513B59FFE19D8F1B1FB41D009DA1E0E6B2EA5616ACAE64CB18C3288AD85E4A4E135549FC7A1A79EC7CDBAF33C99ADC00DA5D7ECF9567B29EC3B47202C7BFF3C7949B0092373C0DB4E1B0AFF51E0D8ED75914D78DF462E1ECD82CD77AC29233153E8ED84627BAC559314061ADE4A264FC6C5E204B40F49B5210AB3B836A814F8E251ABA0C86EABD6582CE933C55194EEA2285A8D2DE166C20D85CB044DAB1A78D28E51FBBA23192FED0632140B9699C16F000000FFFF0300504B0304140006000800000021002536CC8BCE000000400100001B000000776F72642F5F72656C732F666F6F746572332E786D6C2E72656C7384CFC16AC3300C06E0FBA0EF60746F9CEE50C68893CB36E86197D13D80B015C7AD231BDB6DDAB7AF196CAC30D851FCE8FBA56EB8CC5E9C29651758C1A6694110EB601C5B059FFBB7F513885C900DFAC0A4E04A19867EF5D07D90C75297F2E4621655E1AC602A253E4B99F54433E62644E29A8C21CD58EA98AC8CA88F68493EB6ED56A6DF06F477A6D8190569673620F6D7589BFFB7C3383A4D2F419F66E2F247859CAA94BCE3634531592A3FECB22CCD8148DBAF2BBFE3F7606AF3EBA55062F420FB4EDEFDDDDF000000FFFF0300504B030414000600080000002100A58D5AEB540500008A13000010000000776F72642F666F6F746572322E786D6CDC58CB6EE33614DD17E83F089C6D6CEB65D9A647190C92A618A028E6D5F58096298B13491448DA4AF2292DBAEBBA1F5014FD9BA2DDF5177A2F2939D64C9279A48B4E6CC0165F97E7F21E9E7BEDC74F2EAAD2DB71A585AC53128C7DE2F13A936B516F52F2C3EBB3D19C78DAB07ACD4A59F3945C724D9E1C7FFDD5E396E64679B0BAD674070385310D9D4C7456F08AE9B16C780D83B9541533D0549B49C5D4F9B61965B26A98112B510A7339097D3F219D199992ADAA69676254894C492D73834BA8CC7391F1EEAB5FA13E665FB7F25466DB8AD7C6EE3851BC040CB2D68568746FADFA5C6BE062D11BD9DDE5C4AE2AFB796DF331BBAD156B211455E960B752AD1B2533AE35F49EBAC1BDC5C0BF6BEFEE00D1C47EC5C74018EED923A998A8F7669018EFC47F1FBC31046FE2F69EA0A96B47E02C8E81468DD752A0DFFA654A800BFE343E8B49DF75CA73B62DCDFB23CFB16B71167D731A3923CF95B5F5CA5C961C56EF58991296AFC804BB45BD468B625380A928018E037B85D2E63B81D0A32470F394B3A2CE646D34CC613A13222527AC5A29C17055F1B4D6C39E4C5F4FB09BADEC67264BA9608105323BC3B7DBA364F506FA39D3E6A9162C2557C5E8E47B1C9B00440400DF4D0704C1DF1714A2163538DE6FE970DC1B664BCDF1DFBFFEF6E7CF3FFDF3FB8F08DA3817107371D970558AFADC5354AC53A29EAD037B7C421BA92E41686CD46CCC7AFFDE095DBE70383F3B18B7F87D8FC0A08B6DDB8EDF729E6D50D2065EC309ECDD7641B48C04180F8FDD0F8AC42F5E0CE208F1FABF5FBBBFFEF8E54B834C3F01F06B56C8EA506EAF3B506DBBD6DD32ABAFE0E259F10D122724FAEA04357DD8576062B05D59C999428DB20201C9636B24367351422A39B32F34D4AB348801962D54372C831CD228AEB9DA7172EC057E124E1751BC38C2C779348F67C19117CE17B339543BE1E02050EB3F4126A6A7B37036B3DAD9A588E61DD91C64BC9B72DCDBACF7D8E6C34E645DBE1968E3D304DF872E23D82E31810DAB6ACFA102F3FD0358BD9AFFD729F41A4D4B3FAC3E005464908F7674A3E4B6F130077D6B9F2248FE1282863D6F2E7C78BDD1A19F40C9A1B17480404A2DB032A46CA565B9357C59F2DC507F69F88519B1526C6A8A3D4B286737A21E75A35DCBC806A6B6626D0A3A5D4CC751639605C7C28326F1780EADBC140DBD5C5E8DA028E117349C06C9340EE278596939EA371F1552892BA842584933285AB9BA6D78E42AD91DA70DDBF0E12C28EB8DC8C0C44A1A23AB9B07870688974928D26077F02D25F3A345D7A3C5151C4E309D87D1511047D02D292B4B09D569C6F186E4C0CA1DD5056BB881EC6F8FBC3B601385032B6190F8FE91FD74C180E204A7480A3F31202E8678F00BA1484975541ECCE5C4C3CB8833DC6638C9634AC9569EDB55388C8F39DACA645DF3CC209894D46019A92C6929B3736F4721985011AD05ECB5C78C36F0861FB8B1F7C9FAF3CA2886B1F44E9C6DA8F022A86B6EE0D394786EE34787677037C5164B640F1C6ED011084F3BECE96379DBF9249533AE3B3C08010428E7AA67833D0E1896E7BCD3B34751308F172B17253BE0550288550AF84A4978E8397AADE0ECACD32FE1016A5628AB5D8CDEBB3BF0FBED6EC7E6D6B145E755EC8383DD9DE8997403F8EB508375F4C3861D453FF069AB58E3B13A836B72015716984FBA26D496B6E9E2686FBF2BC6AC1EA078DBE4FEC5E8D70D6108EDE57B2F0CB30F85E16E098B83713C057D3A10B2D96C369E619FD3B3D938C0C650CE063A1605A13F54996B1D1BEACC70562F54C339B7B01A89D1733A5EB12CB3FC3B647AE84FE7096649B8C8B730FD5348842178701C82BF756E902DFB67CFE7A7C1699CD81C771F0E85FE2219B2E3C172C8157FF009FFA41DFF0B0000FFFF0300504B030414000600080000002100E3299BEFA3050000A21A000010000000776F72642F686561646572332E786D6CEC594B6FDB4610BE17E87F203657EBC1876889091D183652B4288A2069CFC19A5A891B935C62772DD93EF5925351B8450F3DF7D253111468802245DAFE99A8C8CFE8CC922B538E68286E9DA6466C4014677767E7F1CDEC47EACEDDE33C73664C2A2E8A98B8DD3E71589188312FA631F9E2F37B9D217194A6C59866A2603139618ADCDDF9F0833BF3281D4B0756172A9AC140AA7519F57A2A49594E555794AC80C1899039D5702BA7BD9CCAC3A3B29388BCA49A1FF08CEB939ED7EF87A456236272248BA856D1C979228512138D4B223199F084D517BB426EB26FB5725F2447392BB4D9B1275906368842A5BC54565B7E556DE0626A95CC2E7362966776DEBCDC64B7B1A47348459E5566CF851C9752244C2990EE57834B8D6EFFB2BDEB00A28AE58A4D4C58DDD35A92535E2CD520302EE47F99BC2E24AF57EDDD4355E78E402C760046A5338F007EE30731012CF407C1BD8058D13E9BD0A34C3746CC8AFBD25C1EEA938CC1D419CD62422763D243312FC6209B70A9F4A7BC607B29950A14A0CEA510EFCDE4C7895D9FB189AE64B2522FEF89422B18A62AE13C267B343F909CA29E74B7500D89D174603E1391096955EE86F85F2955A756EAD75BABD33DD46E8CB7B28C16539031AAF4AEE23426A76967EF33D4D08320A15D702DEDF53AA2A7E98142BD70B5C62519A312DD2E05043270077EE552EB94A10F356DC2D19862E26B95F8BE37ACBDB21B5E57DA164FBF7AF9FB778DACD582D7D33518E17F65F879BA3CD74ACED365659BA70BB287516D81569B8D10AE9417007F0B88CA9415905D87D590FE9D4F189B1F7776EF7F8C90D315002BF8BD01EC06FBDBDEF67655E69716AD45410330EF6187816E7689B705BBB7531AD04F7802C09A4553298E4A878F63F291F916002310912A51F2E8B80F7F8F940707033211E8F8318146C4F1F48EA05989EC48B3DBC02DA6BCE8609389FAF64E8B126EE67CACD308CAA4EB97FA76CAF834D5511874877077DA81B6C38E236FE086A1EF87B054898E55DF4985E4A7700AD02C4A803A30D936DCA9F8C48C45259D82354D2540AE344F400598B37E647535711201E7246C0D1EC564B835AA258A9F82EFEE60E8F95B6EE08FA0AC66914A69C9F449C94CFCEA6869DF5B59E3B961BFBF653EABC8424BC12922024E0741D6C4014A96C624DFCA1A731971263CCB70C6C46C86931C2AA5988B43B30A87F1EB047525A22858A2D1989814A019BB958832911C3AB3881DC3A66CCC61AFA5CDA803E6F41A6E2C7D32FE3CD49262BE9CBD4A379CADC1F65A700C88536D7CAB198356BC18A08C6E234220946E0D128CAD6721028C61E99390957255DB8343A56413266DE24D3860581C32D39E6372CB7787C1E8A0CA921970720E18CA385C62E2353D47AF25C4CE38FD00BE000F006A1300F95E5308501E973B36348E8D6AAF823E3858E3DEE066BDF1E7A906EDE887493BF602B71FCD252D1D5A245011C7507F007252DF9ED4B7551E4D2957C784296EA42DE6E0331FEB8955DBE9875B03A81A84EA7ACE3ADB86D6250060B5260100C1D604343BD12008BBDBD0666A19A2CDDC572D69BBEB0E2EEF481EB4A4D59671DE91569BC6EA2CDB7256E7B48016F36E211B1CD02431F06A02197AEF30C4531CEAB405C86F82118CF30D82081C4B6B20621E9B3738AC02B71BFC0384B8BEEBADE6FE262304F8F0C527C52BF495FF92552F9E7CFDEAD9F3C58B2FFFFAED9BC51F4F5FFEF9C3E2C94F2F5F7CFFEAD98F8BB35F41BE38FB76F1FC97C5D9CF2BB4DB76D177BB81BEC6E3DCB5A5017C66A3EE79551ED7F786C3B69A78B7795C2BE7315CED22210E81A1DC40CEE3AF034D08506A058D2173EF39CFE68F87E78F5EEB388F21BEAF810D20D89A808B9C071FADAEC87906232F0CDAAA7795CFACCE7ACF790C5FFEB75E5C5D0A1178F65CC37942A8DC8D20029C0789EF551132F482D6E7F49B8790FF3DE7C11F77E0650E4DF0C58D648AC919233B8E339FCFBB8FF12523FE42B0C276F01DB77940805F9876FE060000FFFF0300504B03041400060008000000210004973214E0030000B70B000010000000776F72642F666F6F746572332E786D6CEC56CD8EDB3610BE17E83B08EC35B225AD6DD9DCC8C16217060A14457EDA73405394C5AE440A246DD9FB0A39F6D622B79CF30045DBA769D0DEFA0A9DA12CD736B0C136417A282A039239E4FC0FBF99C74FB675156C84B152AB8CC483880442719D4BB5CAC8B7DF2CC22909AC632A67955622233B61C993F9E79F3D6E69E14C00DCCAD20D6C94CE357438B4BC1435B303DD08059B85363573B034AB61CDCCEDBA09B9AE1BE6E45256D2ED8649144DC85E8CCEC8DA28BA1711D6921B6D75E19085EAA2905CEC3F3D877988DE8EF346F3752D94F31A874654608356B6948DEDA5D51F2A0D5C2C7B219BF739B1A9ABFE5CDB3C445B6E580BA9A8ABCEEC569BBC319A0B6B817AD36D1E24C6D1FB74EF0388220E1C0F31E154676F49CDA43A88C1C238CBFF21790348DEB0D33D44517F3B02B198431935414BA1FCF2E719815A88C6A3C588F4A41B51B075E58E763CC753E33F2FDCAE127074C3AA8CB062498648962A4776B92A81EF6202050DA52A8D755F4925AE4B662C883B21E2DAB39A4EB05968E52CB031CBA5CCC8BBB7AF7EFBE57B6429AF943D217010B6DFF61296FECD75A50D1CF786A50BFC750AEC5D4F4DE29E728D9AFCC99E5631B5029A60D65D59C932725786D75FE3F921388636C2B7D9DB8A2E7F94DDA0A9940A62D5EBEB0C5BFE3B9EB4D4CDFF78FBD3BBD73FFEF9F30FE897EBBC44B7CA5D234C25D56D60A8CC3362BECC639F05699D363B802B5F40BE18FA109CD54431EBBCF9B094DE139A4F9E5E8C42DBB683EF84E02BC4CE93C040900E91E94AC1DF0630F63F768DFEBF2DE7F71E0BE3D9B3DF7F7D434F2A0232FFA960E0236BDD9608C61EDD782598C1EBEB450260AF9DC665212B80EF857F8E310E7CC5B980DA8671E82F8D1156988D20F3208E26C97876319A3DC2BFD38BE9288D1F05C974964E619C484E428348F90FAEC7F8264DD2D4C3CA1E609B334439E93287BE829DC623FA1132F717F2294C29517424B9C7AAB33673CDEAA591CC235CD7678E28D868FAE57D9DE66A82BF0EF0EEE92160D352E6D0C298095F5C9D86BB911CC077438DE02E40BC7D0E7FA015418F4D521268C804525F6E23785EDA249ACC7036841E0CD9D156E23C45D9D2EA6AEDC465250A47A34B27B62E64955C298A944B18025752857E77140FD2E64072BAA1697AE149ADCC5D49D3413C86FD52602FA793D1600AABBB101ABCD8D2641C4FC671942697B5D561AF3F2CB59177D0BE59157633DE46D086ADC4E92918789DE4E767D04728B342989E35238E0458A0FB9AFD62B4649CC3C06A9DD1B7A2A726D1783AC1AAD9D06E23A8A5C3D6059F8C243E2371445BC39A80290E366E21646015D92FA197F925B6F82E011DB0FB8C4049C1F5EE0A19DE3076CFFF020000FFFF0300504B0304140006000800000021002C74796F240500001012000010000000776F72642F666F6F746572342E786D6CD458DD6EE34414BE47E21D2C7387EAC676D2FCB8755755DB54482C74BBE50E6935B6C7F1B4F68C353389D33C005C7089C4053F17485CA27D00043C0D5BB8E315383363BB4DD85669CB562591627B66CEFF39DF39CECEB379915B33CC056134B4BD4DD7B6308D5942E824B43F3B1D3B43DB1212D104E58CE2D0BEC0C27EB6FBFE7B3B55904A6E013515C10C363229CBA0D31171860B24365989296CA68C1748C2239F740AC4CFA7A513B3A24492442427F2A2E3BB6EDFAED9B0D09E721AD42C9C82C49C09964A4512B0342531AE2F0D055F47AEA13C60F1B4C0546A891D8E73D0815191915234DC8AFB720313B386C9EC36236645DE9CABCA75A4251C55108A22376A578C272567311602560FCC66CBD1736F935D3B50B16829D651615966A34981086DD9A8C458897F1BBC4D085EC7C8EE28565786802F76218D4AAB0A20FD9293D0865C70B77AE39EDD2C1DE0144D73A976B60E06FE6060288EB9267C292F720C4767280F6D944676472D139A287232C980AEDB87848654255CC88F09C5FB19E202D82D2DAA674DCA0D633E66540A2043222624B4DFBCFEEA8FDFBE5624D91E154B0B3130ABB7358748FFC62C671C8E6BC50663F53502C4A259F5BD66655F49D2279BB51CD109AC6124E49E2028B41799B3FF893ADF01C3948E702D6B5DE1A0F6DE31D4C292976A635645362C800389E5EECE2C10192AB1BC28B14592D07E3577E1F34AFAAE6F5B31838809B280F8FA5EDF7537F4AF6DB14094E05D7D068A390BED6223379BDC1CCCCD658E2162204272768EAD3346A8504183F34462AE4C9A058A8135E12821509E5A19761EDA52498919A538964AB9D0E670A79D704DE5567FADFBE5375F5E7EFFF3E58F5F585B03A3E4358B84EF0E20EE86D7074B66D63A954C10050A018A04CBA7126F03644D0875729CCAC01BF53787A56CD6242B0377BB2289CC029FD0ED0CAB8CD3B70B077210CF037FCBEBF77BDD616FBB10CCA9382A1D2D29A000A57AAD91E8648C9305641DCA4DE6DEB4EB18E09AE1C0A8A6AC2C394E316F36B4E75292E71882992AF056AED7F7CA5912CF65C4E6B06CC2008AA5443ADAED8E648EDA0FC0F710280C117637F457979D9C47F37DD011A274F7BAADD3F45825E968DC3D3CE86A9E75160B8ACA5376C4892A5D5D0B75459A626ECB37B47BFE7F56ABAB95510562F1C062547E79108880F919A1E0F8A6F81B9468FCD260C4FD540524CC138581C0AEBE3BD5B51561C8F30661B415706215959FBE750A5EF829A4B09A2800A3500CB801F521309F011259C77B478796F5F987D6F3C393A3C3F1A727CFF74E2D85A62DA1C1586DE9D337F786600A5C228E24BE319E5EAFB777687AE983B255373BCA8E3963A9BE5FA7A4AE1A90DCF594EF014DD4DAFFDBE7982657EE06734A6DD41264765AF405533D37500DC1423406EC9F4343D4AD46F3A8FB9B69F3BA49B7FE79C4AA8C7444DFF928A3E2FFD7EB5FDEFCF0DDDFBF7EBB920E196013CF093DB778A03A39FF28F1F418468464FC02DE5774135168761B56BD5C9E13D391F23290DC6BCC03596F43E847F15355559B6718C713F53EB5E42B4890D659266F94856B8ED6F5D0AD299EFA68BD0EC254C19D26689D0B0F99FC6F4889472CA0172FFEFCFDA76029231A447D07863D30D745D64E79718E115715AD59C24BDC5432F5A8E6D7D01EEB8F8644B0C618725367F7DCBEBF35EAF6461B16DC0E61E81E781B963F1C0D86BEEBFA4BAE31F07CD7F200B514C8E809F65A03AD27D8720564228331FF9A5FBBFDFAC5EF2C06867AD48D18FC7B6010E9EDC1DA4745C409D2C8675E40AFADA837D0E651333169B77E05B4CD0AFECFD9FD070000FFFF0300504B0304140006000800000021002536CC8BCE000000400100001B000000776F72642F5F72656C732F666F6F746572322E786D6C2E72656C7384CFC16AC3300C06E0FBA0EF60746F9CEE50C68893CB36E86197D13D80B015C7AD231BDB6DDAB7AF196CAC30D851FCE8FBA56EB8CC5E9C29651758C1A6694110EB601C5B059FFBB7F513885C900DFAC0A4E04A19867EF5D07D90C75297F2E4621655E1AC602A253E4B99F54433E62644E29A8C21CD58EA98AC8CA88F68493EB6ED56A6DF06F477A6D8190569673620F6D7589BFFB7C3383A4D2F419F66E2F247859CAA94BCE3634531592A3FECB22CCD8148DBAF2BBFE3F7606AF3EBA55062F420FB4EDEFDDDDF000000FFFF0300504B0304140006000800000021001FE96A46520100000003000010000000776F72642F666F6F746572312E786D6C9C52C96EC32010BD57EA3F58DC139C368D2A2B4E2E514E3D545D3E80D810A3028300DBCDDF77F0D6E51059BD306286B70C33DBFDA75649C39D976072B25AA624E1A680529A734EDEDF8E8B4792F8C04CC914189E930BF764BFBBBDD9B699082E41B4F15983852A049B51EA8B8A6BE69760B9C1A200A759C0AB3B53CDDC476D170568CB823C4925C385DEA5E9860C349093DA996CA058685938F02042846420842CF81046849BA3DB230F50D49A9BD02952C7157A00E32B69FDC8A6FFCB862D56234973AD8946ABF15D6BE7A8958EB5380AAD7ADB2DB8D23A28B8F7983DF4C58971955ED31E3E30524C8839167E6B8E4E349366A2898BF167FED3F096383CDA6BD348F5DD08FEC50ED7C8266D86EB57BEE40477217D581FD7644C1DB860B50A3F2A1DE2D975E1355C14C7A70D533961E244684C4B53624E48E7C3938CCEEE3769AC50948AC018BB13F777F7050000FFFF0300504B0304140006000800000021007FD728C7520100000003000010000000776F72642F686561646572312E786D6C9C52C96EC32010BD57EA3F58DC139C36AD2A2B4E2E514E3D545D3E801A8851814180EDE6EF3B78EB7288A25E1831C35B8699CDEED3E8AC153E28B025592D7392095B0157F65892B7D7C3E281642132CB99062B4A721281ECB6D7579BAEA8B9CF106D43D162A18ED1159486AA168685253861B128C11B16F1EA8FD430FFD1B84505C6B1A8DE9556F1446FF2FC9E8C345092C6DB62A458185579082063821420A5AAC4182684BF447740EEA16A8CB0B157A45E68F40036D4CA8589CDFC970D5BAC2792F65C13ADD1D3BBCE5DA2C63DEB7014460FB63BF0DC79A8440898DD0FC59971959FD31E3F3051CC884B2CFCD69C9C18A6EC4C9316E3CFFCE7E12D717874D0A689EABB11FC8B2DAE91CBBA02D78F3F97047721BF5B1FD6644AED85648D8E3F2A3DE2C9F7E1259EB4C0A72DD3256192139AD2CA72CC49E5437C54C9D9ED7D9E2A14A51230C5FEC4FDDD7E010000FFFF0300504B03041400060008000000210075CF13D30E0500003212000010000000776F72642F686561646572322E786D6CEC58CD6FE34414BF23F13F58B3D726F1673EDCBAABAA55911042AB5D38AF26F6389EADEDB16626719A13973D21541007CE5C38A115122BA1450BFC330DDA3F8337633BB54B5252905688A591E2CC9B37EFF3F7DE1BF7E8E1324B8D05E182B23C4056DF4406C94316D17C16A04F3F39EF8D912124CE239CB29C04E89208F4F0F8FDF78E4A3F89B801A773E12F602391B2F00703112624C3A2CF0A92C366CC7886252CF96C90617E312F7A21CB0A2CE994A6545E0E6CD31CA25A0C0BD09CE77E2DA297D19033C162A98EF82C8E6948EA477382EFA3B73A79C6C2794672A9350E3849C106968B8416A29196FD5D69E062D20859DCE5C4224B1BBEB2D8475BC47109A9C8D2CAEC92F1A8E02C244200F5ACDADC48B4CCBB74D70154223627F631A1ABB3B124C334DF8851C0B895FF4DF2FA90BC41A57BA044DD3802B13806181546E903FCA2C701022C989E7BEEA2867446623C4F656B479F78C4F5E389BC4C09B02E701A201C4768A0C8124F45FD6CF6C29460AE84164C04C8B53C67C3BA9D65EC002A1B690D4B4A62B911E238F658710C6E14D23C02D69872213FA239394D30076D50502DA25A6BB9CFC28E584DE3955FFC9CE552C0361621A5013AC5D99453ACE42427B96851F4A9A9FE0E59CA7823F264A83E9522B16AA84EAD5AAC4E95741DB58696E27C063482853C1114076895F44E3FAE1DD47681A385B24F3D75F4817D8FB47967237B34AA12FD6EA56DFDE2F3EB5FBE6E65AD26EC4A9A37519FDB49B3AD867293B486B67FD220554DBA1E41CF34CD565A76A0EE4EF33B68BBAFE180A05A674143797CB4F0679CCD0B834601FA40FF723C64305F148AF27469C2DF53619BEE448D2228F900411D53D5BE7DA87596CE253984E132A3794FD5A86F362BC90A58943492890F56F69D421E2684CE12E90FDDFE1856AB1E542D59FAB6670DBD916D0D0F33C17A8DF85EC2385D4135E2D40F617610BE6BBB570D9405F10B3C036BDA4260BA4A1A82083067FB4EF7343242068D12548347011A1F80DF9A22E80A7CB7BCB1ED1C58AE3381AA5AF822C105919705D1F1ABA3251DBB73061C33CD03FD5D45165AAA62613E0C750832F43598C94980B283B4C54B9011D334551CB156A6980CCC392BD9853EA5B6D5CF58C90A599E93502A6302948364055DE6A72CBC30163E5982521251D0B5B159C9009E41CB8D8D4FDA9F279263952FE3B4920D3DCE81FBC29FC1E1419FAD143F68C760275E345026870A21104AAB06898AADDD4004246E7C62BC122E6A7BD456C1494C7893781D0ED86617445747801E38D6D89D4CAB2CE90D23A380A194C2234076DB73E53587D869A71FC30FE8C730DB9CD1565FAD3B0A413B36D68E4D6AAF5C131CAC71AF71B3DDF89B544399293F74DA55BBB24CBFE4B830701E42452CA1FE00E4A85E5ED6CB2A8FBA94AB29A18B5B15BB1A17FFEAFEB32DF27009D98232A8999D906AB720CF1DF647D05F6A9A82995E57BD68D4B7BCBB5BD1D09AD8DD5E71D38ABADDA2CBD5F49A2ECF0EB4AA84375875A7380CA1B2BA08B64D6F3C54D31B0A740782EF030E15E7FF02369CADD800EA5ED870ADBEFB0FA001936ADC4DFABB008D5BAF00F7BCB4C0E527A1B99A3FF505B7BA544D557383B1D5BA3ADFF73253FA7F7D0B835784E30F0929973D5C50FDC6A08B00FAE23D2FD3F5DB91BE7EFF7F9956B7EBB7934095A6FADD4CCFB2FAF7ADF7B45D37E61DE07B2BB05BBFFEECF79FBF5C3FFFE2CDCB57EB5F5F5CFFF6EDFAF9F7D7AFBF79F3F2BBF5D54FB0BBBEFA6AFDEAC7F5D50F465996FD670AA5EA8D7D0B4A2108F01F9FE33F000000FFFF0300504B0304140006000800000021002536CC8BCE000000400100001B000000776F72642F5F72656C732F666F6F746572342E786D6C2E72656C7384CFC16AC3300C06E0FBA0EF60746F9CEE50C68893CB36E86197D13D80B015C7AD231BDB6DDAB7AF196CAC30D851FCE8FBA56EB8CC5E9C29651758C1A6694110EB601C5B059FFBB7F513885C900DFAC0A4E04A19867EF5D07D90C75297F2E4621655E1AC602A253E4B99F54433E62644E29A8C21CD58EA98AC8CA88F68493EB6ED56A6DF06F477A6D8190569673620F6D7589BFFB7C3383A4D2F419F66E2F247859CAA94BCE3634531592A3FECB22CCD8148DBAF2BBFE3F7606AF3EBA55062F420FB4EDEFDDDDF000000FFFF0300504B03041400060008000000210036253B8AAB0100008004000011000000776F72642F656E646E6F7465732E786D6CC494CD8EDA3010C7EF2BF51D22DFC181A5D53622A09528A73D20DA7D00D771C0AAEDB16C8794B7DF711C83DA5D21D44B2F893C1FBF99FF7892E5FAB756C549382FC1D464362D49210C87469A434D5E7F6C274FA4F08199862930A22667E1C97AF5E961D957C2340682F005228CAF4EE83D86602B4A3D3F0ACDFC14AC30E86CC16916F0E80E5433F7ABB3130EDAB2207F4A25C399CECBF20B19315093CE996A444CB4E40E3CB421A654D0B6928BF19533DC3D7553E60678A785094345EA84C21EC0F8A3B43ED3F4BFD250E231434EB7449CB4CA71BDBDA75AE3588FF7A1556ABB07D758075C788FD64D725E88B3F256ED71801171C9B8A7853F6BE64E3493E68289DBF1D7FD5F2E6F8A9747536D1A515721388BD575978ABE0A678B202F2C732C802368924D4DCA21CCE20957B5D9A3A15C3C7F7EDEE2BE8EA68D6859A7C27BCF2E9ABE6E1FBF6D1E1364E762496F19C7F961BA92B1F7F96260C5C3BE5368605D004263A8340D86B5D2F9F032C42E9ECAE8A17D65132C1173D3C985B618303CC76FE523A91C4C90A61B36F17B2664D9B3D471D6F85EDCFEFFCBFE50C08D11E050F2AF63F5060000FFFF0300504B03041400060008000000210055AB081AAC0100008604000012000000776F72642F666F6F746E6F7465732E786D6CC493CD6EDB300CC7EF05F60E86EE899C8F0DAD51A72890E5B44391AD0FA0CA72224C1205498E97B71F655959DB1441D0CB2E31C48F1FF92799FB873F5A1507E1BC045393D9B42485301C1A69763579FEB599DC92C207661AA6C0889A1C85270FAB2F37F77DD502040341F80219C6570774EF43B015A59EEF85667E0A561874B6E0340BF8743BAA99FBDDD909076D59902F52C970A4F3B2FC46460CD4A473A61A11132DB9030F6D882915B4ADE462FCE40C774DDD94B906DE6961C250913AA1B007307E2FADCF34FD591A4ADC67C8E19288835639AEB7D7546B1CEB71215AA5B67B708D75C085F7685D27E789382B2FD51E071811A78C6B5A785B3377A29934274C3C8F77FB3F2D6F8ACBA3A9368DA87F427016AB57C754F455385A2479619963011C41936C6A520E71165F78ACCD160DE5F2F1EBE3062F7634AD45CB3A15CE3D4FD174B7597C5F2F12E4C9C59ADE328E03C4742563F3F3E5C08A8F6DA7D0C0BA0084C650691A0C6BA5F3E1C710BBBC2DA387F6954DB044CC4D2717DA62C0F09BFF2D1F8AE5608234DD708C3F33230B9FA59EB3CA7379DBFF2FFC430197868073C913F1ABBF000000FFFF0300504B030414000600080000002100502A0738B4060000AE1B000015000000776F72642F7468656D652F7468656D65312E786D6CEC594F6F134714BF57EA7718ED1D62277688231C143B76682110C5868AE3783DF60E99DD59CD8C137C437044AA5495565C2A55BDF450B54502A9954ABF4C43A92895F80A7D33B3BB9E89374D28567B80089178F637EFFFFBCD9BF5C54B7762860E88909427CDA07ABE122092847C48937133B8D1EF9E5B0B9054381962C613D20CA6440697363EFCE0225E5711890982FD895CC7CD20522A5D5F5A92212C63799EA7248167232E62ACE0A3182F0D053E04B9315B5AAE545697624C9300253806B1D747231A12F4FCE75F5E7EF3E8B7BB0FE05FB091EBE830509428A91742267A5A03F1361AEC70BFAA11722ADB4CA003CC9A01A81BF2C33EB9A302C4B054F0A01954CC4FB0B4717109AF679B983A61AFB3AF6B7EB27DD986E1FEB2D129C6834269B55B6B5CD82AE41B0053F3B84EA7D3EE540B790680C3103CB5B6B8326BDDB56A2B97E980EC9FF3B2DB957AA5E6E31DF92B7336375AAD56BD91D962851A90FDB336875FABACD636973DBC01597C7D0E5F6B6DB6DBAB1EDE802C7E750EDFBDD058ADF978038A184DF6E7D03AA1DD6E26BD808C38BB5C0A5F03F85A2583CF50500D45756915239EA8936A2DC6B7B9E8024003195634416A9A92110EA198DB381E088AB502BC4EB0F3C42E85726E49EB4232143455CD6053E041E040FA3426125D2387688FC738B142BC1D2D928CDD1D3705147E6680076CE344BAC0CE248566CA6DF5A111112E7497E144E1314988426D78C6F7092931658B1C6077DB0E4EC69895003B2AA22EF0DA14B33293B709F7ECE84DD90893B2286C4F6EFBC8484C142D51BD3D111357F51EC60765B8CB60BB8B7BF5ED677F7D7517FDF9E4EB570FBF28910B782FBABFFFF0E0F9AF9F970381916615F3E2CBC77F3C7DFCE2D1A72FBF7B58062703CFB1D30BE2E314EAC451F0FAD9F7AF9F3D41AF9F3D3EBAF7F4E8DE4F47F7EF1FDDFBB144D59528F654ED70CE5A5C9456DD155D638E92FE04525D22F32AE6DCC56DF1FD7684E3B40CBBC3A6B18BBD8285A2FBA548EE2767073E734671825A9896A6FDBA987AF65EC1400FA516F76812B9567C24F7210E18ED7255664A6F2A4217DE910A2236268CA3CE904859B6A78F63E6EEB98A55548A23CCABD56D3C51382EABD67E843DF7766EA21604A4242180F45AAF8F23209632201D7875BA4343C1251F297499C6D0AE104F43721E71DCA0632F78B34DFAC944946CB94989A7E7F402BF45A9E7C24CC92D3A2B00A0748FA9639AFC136D330ABC6DCD5B006D6FC21950467CEFC95A1F72EF0C599F54060BA3E82D3C49760910D67C2BBE67E86CA47ACFD0EE80B900863EA9AACFCECB332A0696D607889DB5CDE41D9F38788F28633D3565E4AA34B3B784136ED88545BDCFDC3D4971114B23F853770528F0706381CD1E24B8FA84AAA817E114E6F66AA0858C65267A2C51CA25DC17CD72A96C8D87D95FD9DB665DDF436C174AAC76F8D02EAFE8E5FCBA518831568DCD9D3657B4A2059C55D9CA854C28F8F66F9455B55167D65635A61982F1B4152EEB109B7B3984BC700D168B68C2A88560268228AFC2ED5FAB86FB0E6664A8E36E7394A7C56461912992111E922C47DAEFF91C554D92F25A997344FB618B41DF1D4F899AA3ADA1C5BE85B6B324C955573B415D9EBDB7C9525EC1B32C81B4E3EDC812B73959820E9B41A3BE5C0F5088D3663082AB32FC19A79075A9C777CCC6F0DA2954C296FDA9CD6CBA7C96CD46EE98DF045578FB61E33EE7B0C703A9906A0BCBC89686799495004BB4266BFF721DC2BA28074AD8E86C56ACAC4131FC6F56401CFDD492D18884CA4DB6B3A263673F6654CA278A885E343C440336117B18D2AF4B15FC195209C3A06104FD015ECFE9689B473E39674DE7BE143338BB8E591AE18C6E758BE69D6CE186900A1BCC27C73CF0ADD476E3DC9BBB625A7E41AEB865FC8EB9A2CF1378D7B432D41908E125B1C048774A33E042451C58288D68D815303818EE806A8157BCF0188A0A5E559BDF821CE8DFB6E7AC0CD3D6700D557B748C0485F3484582905DA025537DA708AB66679715C93241A6A21C73656ACD1E9003C2FA9A0357F5D91EA0084ADDB04946030677BCFEFCCF59070DC67AC871FBCD63B2E2ECB53DF05F4F3EB699C1299F87CD4093C7BF30B1180F66A7AADD6FB6E767AFEB887E301BB36A79579CA40CD69D23A2E1D0412EBCC484373C6A2D63CD79BC5CCF8D832CCE7B0C8BC54094C20B1FA4FF83F38F8A901153C6FA40EDF33DE05604DF5F6861503650D5E7ECE0813441DAC5010C4E76D116931665FDCA46271DB5FCB05EF0A45BE83D96026DD959F2FD86C12E86335F9DD78B8B0C7616612FD676EDC45043668FB7282C8DF28B8C498CF9C2CCFD328B0F6E43A2B7E06B830953D214137C552530CCD03D53AAD0FC56A3D9BAF137000000FFFF0300504B030414000600080000002100987FD771B51800008F69000011000000776F72642F73657474696E67732E786D6CEC5D5B731B37967EDFAAFD0F2AEDEB3AC61D0D559C295C2733E364525132F34C912D8B6B8A54919465E7D7EFD7BC44B6F5612AB3CF5B7988D58740030707E7F29D03F4B77FFA78BFBAF8306E77CBCDFACDA5FC465C5E8CEBF966B15CBF7B73F9EB2FEDD57079B1DBCFD68BD96AB31EDF5C7E1A77977FFAEE3FFFE3DBA7ABDDB8DFE367BB0B74B1DE5D6DDE5C3E6ED757BBF9DD783FDBBDBA5FCEB79BDDE676FF6ABEB9BFDADCDE2EE7E3E97F97A716DB379777FBFDC3D5EBD7A746DF6C1EC6357ABBDD6CEF67FBDD379BEDBBD7C79665337FBC1FD7FBD74A08F77A3BAE667B0C7877B77CD89D7BBBFFBFF68657DD9D3BF9F0AF26F1E17E75FEDD9314FFEA97A7E93E6DB68BDF5BFC91E14D0D1EB69BF9B8DB81B3F7ABE374EF67CBF5B99BDDEA8FF473E4E7DBE5CD76B6FDF45927DF61D97EDB6CEE2F9EAE1EC6ED1C0CC59A4B71F97A22DCE0E51084B2F971B3BF7EDC6E378FEBC5F7E30CCFBAE4B6D9EC4FE4C5D4EC97ED6CFEFE87CD87717768B2186F678FABFD2FB39BEBFDE6012FFD30C3F08D3ABD70B19D3D619A7FDE2E17DF6FB6CBDF36EBFD6C75FD309BE3E1F9C752D8E3E83EFBF13FC6ED7E397FF953EB4E3F5DEE1E56B34FCF7D96E71755C8FAA773E7E7711C7F7FEEB6F76B75EC7D7E37C32C31EDD3483386BDDDACCE7D42DA1FB658BF9F1ED7F3FDE3414C8FEDEE16DBEBBBD9C3588E4CD97DF7EDE66A373D38716977F1E16AFC88051917CB3D36DDC372713FFB087689803D78BB5CADE69BD5067BE6BFC2FC661CB1517778EFFBF1FCD4EB309FEBCBEFBEFD7035FDF8E2FCFCFCEBC3DF0ACD6F6E16F616CDF79F1EB0A1DF6D678B2504010D37C786A7617C588E4F5FFFE8D7F50E7C1F17D38C5E1FDF33BDEF3890DFDF781AC9C5D3B87C773749D837CA3E604AF74B706DB5C4FFDE5C1E98F9FA2B0EFCCE12ACDEE671FF054326DAC491872F9E5E2C66FBD9A9B7CDD5F671357EC9C6A9D5F662B97873F98FAB9F41B5E719CD37EBF538DF6FB697A06EC75BF0E57ABF9D4D03BEC08A1E6917FA20515F76E1FECD2EE4C4AC2FBBF0FF5E17C6BFEC0222715CBF3F361173E6F7814558BC13E78F8CC6DF4F572FE5F3E9EA16FB7B8D2DFED3765210E7BF20EA13474FBBE7ABA787E9A2BBF3E363D371BD78EEE7F4C797DD7CF9F0DCCB17EDA6AD35DB4F23D941498C6DB3FDF5ED5135CD56B3F57CBC86DE588DE9D37E2C9BC79BE3BFFEB95CECEF8ECA6852506FC7D987314149ED56B3DD5D9C6CDA81F8B8FA058B7F503EC7070775563F3EC0F25DDF2D6FF73F8F7B58B7C36F678BFF79DCEDDF2ED7E3F70701FFCB1A0A6E75EA6737B6FAF620BDC77E77E38F93315B5DEF3FADA611BF5DEEF6CFC3F97537FE65BDC0EE8BBB1F1FEF6FC62D6670D296E7E671B5FFDB72BDDBBC7F9CDE98B6E3ECFD24C847053B5BAD364F931E1AFF7E7B3DBB1F0F6FF97C3C87695C3F3E1C54D2F1550795F43C84F8B8DFDC2EF79079EC62189A717198CDA9FF23F1974D5B6E77FBB6FC382E0E0CCDE36A75ECE2A46A67EB778FAB67FA810625BCDCFFF4EE30E4B85EFC04B5F9C36CFBFEF9D593C28DABE5BBF5D4DD3F97FBBBEB8767E2A1D967A302EFE6A7B13DFFE8F71E30E78F371F0F84C7DD18D7BBE5DFC6ED1ADCFC6986911F9ECF67F04C1679B34A4769C14388E9B34CC1055A40293F5D4DFFF819827FD6E84248AFA23A6CC223F599228492A51C15FCD4EE0B8A4B9D36BA45CDDB989213A7B81C074A91D28693E1FB6A04527A91791B256BE0145F35A7286164A46D9414BD365E0C7C6C5AB4CAE7A355F57CD45A3B6DE808B4B38DF766844E9CD746C9D0A398C4D7D498E6F97C8C37A6D2B1193FA493AAFC6A7DAC10954B88952D77DA28ED3B14AD04971DA7EAC0DF037E8683AA7D21D7CE64C5E7E37C307C04DEE88173D45BE3F8D8BC138EAF9CF7B675DEE35B3C79855F717410C9720919948E7CE506379483757CC18360D3C0F742B0B92321D1BB8EBC2597325F852C6BE57CCBDA283E9F0C49EC505C2A9CD745E4CE7C8AD403E775B1CD642AD755FAA37BF4826F550E1D8D5495907C6C4D3ACBDFD354AD5C469B2E95F6268534FC3D0827BCA55A4C0A17B8BE062539BA72527803E7FC605EBE9444A9D4A0A8BC490555D569E325D72E524BC73585D45E6AAAAB40D11DEE68C828951DB4A9ADD1F91891141FB551D85ABC8D899D511B1F32DD59D2F8C2F5A8B4B278BAEBA5D52E5109016570FC3DD604BE4BA435994BAF745A0C7C044EC7C0F9E6BCD354AEFB3E85F493D1A21C8586955C12BD19B84F01918249E7BDB998F9CA0DD2714D2107931B979DC194C27930589739DF061F13DF25410657E9A8832CA243318A6B65196164F8D822F40E9790087BCAC716ADE69E838C2E143EB624EC199EF84A532405DD47679A5C537C7D920F9EEFC66C55E2942263E5BD15A3025FD3E255E1B25320568A8EBAF8A03B23C0AEE733AD42701F49563114BE3E5534CBDF53AD365C27A245E69AA23951284509744677F0E4100F749F82923C950325ECC02544A111D7A34A4917E8CA41F35AAE4795326EE8B471A2F1996A8828F502E07306C12900F32CD548CA40FB73BE1967B8FFA6AC34DCE7032507CBE44D41E0259510659DE191042803D73BCAFAD2E1A81389DB6DE594E8CCC721C6A012AFBC75818FDADB90E96E54DE59C3D77410B6F036037415E7DBE06A6D94A3C135AE0F10056342B44DD45AF2DE22E21FAA4354F489EB379544EEF496B4485CAA328C33E741116AE06D8AAA8D6A31554CE01A491517874E1B5F0D9F695546F35D82683B525DA5AAF1B1D30682CDE753A10EA84E540DFE01DFF5CD054F47AD850C8DCA8E16D08A54F381A20AD5145AC013A2F3D152654D65071638F3B8446B2B2BDD5900090A4709B4119947A1DAE82AA9BED6C608AEC9B5D5555139D0D6214065BB443B681EBADADAABCCF110ED8DE49E03DC78CFD1225006CBC736C8C811193DC085E43C08A6382A6F1A7E55E73D5137C7A52ABAC4D1089D7CE27E95CE52253EB62C23B7DB3A6BD191B76C64EEF46652E333CDAE652EA34518EE5FEB221AF795216D9D684A57DB89F440499D55A8AE717933422A4775A21140D9A83E80BCC3C967D26BA4A89C6F06E12E8F908D34D5D3BD60E0D4F07D3AB91403DD25083583A5DAC528EDB80D36CAC227A6F3016F14EF4D8BC8515DC45F99FB625014856B2463546B7C3EC60A8E2B1B635B67A656BA48A5D758A50DD5FEA004EEF3198BA9F2F5B100413B14EFB8B6340E4A9EF3DA2923B9BC393558CE1D070F81CF14B865EEB481FCF23575C65ADE1B6017EEDD1A2F533554768022096ACD4C80AAA23E9209F0AF13ED2D6A2138AFA38DDC2336D1791E9F9A2433F7FD4DD292A36C260BC7F144E0C0902B3AEA6C3BD886814EEC8CA0CA663847AB559DBD50BDE79ADC340797988DCD0A130CE5B5157E889C2295E69E9D953A352A3B16B199A376011B2B735B6FB50A1C95B2407B151F1B283C36B3D0211CB3B356944E6F162A967A4F165E0DF706AD35DA75DA38932C5D05E803EE755A444685EE1FC854E0888CF5BD5D62BD3795EA033BF4501C5002DF8D36A8CA912C1B6C67FF58E03196CB41940347752DA2298E0DDAE4079EFF0125F1F8C7E609D6A5AB90E17953BB601119716FDD16E912D548B668C5FD100BB4C8F335AD26F21C8B6D3265EA71D9066346F5CE9491E0719613CA712BE3E00B46AA959DB0867B69C84C29BEEB2733C7912C2745E0FE010616B89D73F09E121F9B426F8AADA983EF9239059B84E3A34EEBC623719853AFA8F48232343E366D22B7184EC357A69A02FE56E3FBD41993B9E7E0AC8D3CCFE4A04438FE068AE39E109E23AF4839EA306E2ABDCEF941522BE3BC44804A7B0386CFE33998D9CC7131A40A22CF513AEF0547B6DD207367B583941CE37251488E04BBE8446797249538CE875452E8F020C3A9E1BCCE4AF0DC94CB88DBB8BC65035347795D24AC7D87D23896068CA0A3F95CC18CB81C143F701CC955E1B9B70ECAC0A30257111AF13D57950ED49AB90A5E77DAB8C8FD5E87E8D0F3364D48C9A5B709E44528479BAD5C5BC285961C830425076A99B07D04D796A0245E7FE0A504C2C3C6864C68E2ABE0A5410A8AB7F158074A0184CE33AB5EA12493EA5E3F81D154763C6C268F013DE02F2ED7A0C06ED2B121B0E75904804542D25D02012D1CF9F15623614FDF838889E73E005F1B6EB3E06B2073467BF322F09809EA2D720463527C1CA105A5F0F814D1C220F87CBC6F1C8FF740D0F9AE87EEF79ECBDB20874A634D3FA0155FB900E894F71691E4E7321A8112D01DECA36D1D798BA888E2AB107DE6381FD078DBA398C075954FC87872794BA83FA03AC46785EA2F2A2119ACE6A3CE3E7564A768CD71725F5CE1B90F5F45E4C80F52E5F0BDE9D8AA47210AA5A04285DB2CDFB4E55513BEB9C2731F1E15665C27C209813FC84630488BF08352B4947C04033C3B3ED3C16874477B33B6722F6DB002B907DAC6C2E7A37C436A0A900C6F035C8A6A65A4781ACF6F0F70BD79E60E14B890F43D0E591E2A6F03AA02B8D51CA0C5B8BF3378191B7F0F4AD938B681D070E03518839FB4081D353412C70F864137C1F916347405ED2D20E5C9DF033F9167CB914A121CF51822B04EAAF98688AA166A1B87E84B477612EA81241D75D289EB1004CE81D7410E881A79DC3864DBC9620FC0FD055FD32234C7C586823A55AAF906E40E39863220FFC4BD9AA12AD840CA0320353C473954D4A5512B33400E795430348B0A2BFA1E6408B9BC05A11DCFCF05241EB8A60810DE46E7139452BC8A3700D8E6714950A67004302894D752790B486CF2D80C94A4A9460A9391A1728D2486F5542BA34C16E002E328289967520212191C2508482370D41DA054E53E450072CB33F980A23DAF580325F0DC7BB0CE46AA5D8293862359C119C731C8E0506246F77698A26AEA570538D892EEC6805C28478BC280408FEAF80025AFF8CA0D105EBA83D1A6931108012A918F2DA07A93F32DA8C85150C03E855BCD106CE2163000CFE45E408808593295C4A851E4DCA120E6E714D3225F9F08A1E29484BD4DB50B0C70AA7C7D3222302E2119110B1F5BB69A7B90283D9392F3A0E0A0049703A0A09D9583B7C3336A48B401E8A37C6BBAF26ABAD070648ECE270A51F89E8BA27712200AC4E8958D00E9FA6628AFE10E2BAE7722321CDC7799848AFBFE486729BE83512684727B3A366D23B7801195CCDC9AC1A540210AEDCD98815780479CD3E01630C2E9ECF0CD401F70BE59551D5DED08B48AD7EA46185A8EDD46271B97C4889239AE29E050145E0D143DAA2638AFBD6C9D55F03EF15806454FC01628AF0795B857132767998F20A07892AF5C509247463160D71B3A0298675EF1893695D79444985A4BB50B28867B5C111A96FBD711B91CCF7730281CEF8DD120854BE7138117F11D8CCA38C57930D51173194DD840D47741F1B5E499AE9845E6D853C4B9208EFCC40CFDC6478D0A8C8EA6405CCFFDC45844E2187E2C26F20C6E2C56F12C69AC9037AAFD63054E4EB57FACAA728F38561CF2E1ABDD006CF35568287AE57BA121234D63B3086DC06B4E41A91CCD4B52156E830F14CA8324917BA712028AE37E15289DCAABA4A4E67583693A844525049466E86E4CCAE48153267540F74FD24AF2954B1A7BA1D31BD249746725ED3AD84632BD9AED043F9567B1B1E56038D9AEC72123B88394E291AEA7DA3241C1F23C6DF2CE70BF2A0D3A7289072571BB9D0687209D8E2DA8C0737A28E643FD266F839269EA75268405BC9A2E45913B238832F16C45825BD36B631AB7CE093889E012827C27473D127C589E194AC04779A5522AA8F8E7D25B74E155BC083D02F736122494A345098810CFFEA70677878F00DA8523325900A4A6729001A073FD86D2A2C6B99305CEB1500901A5702F2D4F591E3E0238AABCF22AA3C08B9F32CD4A659EC586991D129503041F48A132B9CE3841C1A50A94CA3D21946D048ED0A24C15CE0B7D0FCA2A39B28036819F97C938E4C3730580C52AC75D008B0D5CF7C2A077EAC933EA06B92647B9184A65E97C1C3C071A6F67605F5C8FA2A80522477B1B9051A37A340F5A77780D0AF784D0A693E9CAA8B1E6955719B5D41CB7C4D1C24EEE3003CFAC14AFCAC9649EF5CD59B4C0DB64788354C3E68CC3F27C15B2860F49398A1377DC2E64644F13B566B9E2280FF58432B2CB95AF5C939A673870E8B0735EA608D1A93E431162E09E77C1595F1E6BE220B4E1BE5801C4C5E5ADC047E2184A5126F0E8BDA0EC96AF4FD1F00FE82A80D2B8F784030F8ADF0E018AE5F55500A90DCF3C145414F20AE362904AA11AA90040B7D42306C5F33D07E0D670BD532CCED7F3DE9C90DC9614F8559EFA48652AECA1DAA5C045EACC071864673E5E756AB28AD79D0A15501ACF8917542EF23C2D288E57559641176E83CB609015673B18A9FFCA2B6E0A9046EE119780422EAA5D4A709AEB6B80559263AA05A7663BFB2709D7191BB0085E7D56E020F00C6EC91051CE838CEA566AD14B0677A81603A529DEA6D8CEE99B825C0EC7614B5328DBA6EBD31406DEA1547E52B034DBA9DF01A5B31770D0B693CFAAC01379845C27389E72B402A9E139D73A1DA3EFB4F1C2501EE0728881E7CD40E96408ABC2996BAA2990361B3882014AE6954A15A7EB15B54CA0545E3758513BD9A15819B82DC1219FCC31D56A3D6048260715CE133FC752BDE8DC0A004AE648238A193A35C115B965BE4F51860FD344C7864A189EF5AD430F13C216513CCAA901E7F5237D0F624D5EB75E83697C97549C66E51AA9461CCEE5BC8EBAF06AA01A4DA7FEBA26DCDB50E9A893ECE0FE68D3782D014024CB7D175022AF8DA8A8C4E4280128917B9035E1843FE7F5E441525B5FB34DDC77A945266E31C000D819CA9DA23BF589B518B8EBBC8DC37EEC503C8F726A41F4CE675A51D14E7DE50A8CA0B3B761CFB997569147E75588B579C16B2741E99CC10525726F1D20052AAC180FA0E01347571A8C26971D38DE81D7EA8252782EB4C1EFE5AB000A3281746C12C7B0A877DB7035103FAB08032CB97601C5F05D02438B03D47404CA77AA8E1A0E8C72ECB669940C502B83B0042766E87B8CC761114A41D8C8FDD1361DECA612DFA643029C6F4E275EB5D79012E7161082183982D1505EDBE19B974871D3F90051E5A83BD29AF06B781B149B747A731DFCBAA1008E9FCA6C03EE6DA09E6A43611A3F81D4508BCA6B3D1A6AA578FE07D722587EEB490B1605FF74A6C18B4A3D3B84EE1DABD9228E77F0DEA2ED54A8B484D315BC4DF280EDE8D8007F75DE939DE037E634E8517EC6A6C1E9E3E7E71ADC348E798382A3C3746C55651E9FB66A50B0C5DB0035E43A71527D5C2335602814836C4DE1C8357D4FC362F311208B412BA671510B2EA962126F50D512E9D90A6B0701234846600B6AE628EAEE0685D208A6AB900F0736C8660A7F4B475A9D11710906E2503202A40E5DA1DE609C3C21AAAF71FB1C603126A3B90A8BBC15794F8DA8C364EB833B27B3A1781582220C9A79D112D80E6A34097750E7017C877990F0005051C8AAA8F09A49E289E72091B99414B39348A448CF10339C8343E1081D4102D248F53572CEB8C78C5919A55341E68EAC36A051C5ADF35430677115C7CB5540AC1085E19469D7B373C80A8B004888F01A7883C7291F62CD00A722C3C2F2592818D75230E9D512191B9C267D396A84B3885B13798FC69D000AFF91360AEFA92C46C7FD02191831990F2ECDAB3C17AA7DC34D77CCBFD6D0FCD2B00C2EEA0C71FB27C3C5346E6BD3F43E149D5136AF59BCAD714F25384476B0CE288CC8ACA611E812329E8E701467EB617F58CDE974992A1C14B2B70D24CA00227DC96B982B6465D869701C069C2E0224BC464D0DEE0764D9658303F9121A81BC079E0BDC3745280342EACCAAF6501B9F60EB09DFCC303845CFB1C02A052558FC83CC3F8E9FB26C9F29D548480F195B45F50C304D4269A8D02FACB615702A6A7ED86E043C8B5A542689C09000E1336B068DAC2157644D27DF0D37A911CD375DACA532D389760A7E702EF3E57C2CB49ED04C578102C08A65386CC06EA4B74759248A2D8267F21E9C2D14C8BFBCA4380119A538B99308CC1CAB3641063B5BDC1D4B7A53B8AB85DECA89EB7FAC6F0C710618836401F313711C1E6C63A76F7060B5417C89D574CE655319BA3265D73108366A9C5F47C50DD93F28D84314CC7C17DCE082CDC0302E074D6506FA9E84036A03AB7674B8DF137576C4DF710DC7C715AB6AF1A8BF9B92052F5701B710020365F9FAE9249141E915699306243F5865B6472A14A82E911DA8A980E38544BBF80A003F1CB50B6E1A9FAE7DC4FDE2F757D3F746A65BF18FFF6AF87CC4C5FDF1CB1879767FB35DCE2E7E98BE48825B65EFAF6EB6EFD3727DA6DF8CF832CAF839E5FAF1E64C7CF5EA48D8E1B6F955C3272A0E1D2C70413BBE3871F8F70AD7AFBF7BEEED3099FBAB2D7D8A8F52FC757EEE7AFA50C8B8FD33BE08F2707CC7D376F670BC4DFEFC13899AB9236DB9C6DDF8F7E7E7BBC79BEB73ABF56CFBE933D2E37AF1F70FDBA9D1EB67A63C5DEDF1FD18DC948F5E70A9FCF93EF571FDEAD7EB4BFC35CE76B82C7F896F3EFC76F72AFF38B5C625EEABEDF5F4D999F187D9C3C3F1E32137EFE49B4BDC2D7FB79753B33DFE5AE0F2F9C31F37EFF0198C034D1D68F86BA21DFE98CDA7C9E2D7A77F4C3F38FE13BF3AFDE3F9993E3FD3CFCFCCF999797E66CFCFF0FD89737FEEFC0C1F94C0D717F0310E7C1B63FD1E9F7739FF737A7EBB99AEF81F17DF9F1FBEB97CF1E8C884C3B744B0D4D31757FEFFE322CF9FB880247FC9927FF7E3220747887C30E32B863F5D2DC6F972FAD4C3A7FB9BE7EFC17C735C9D15BEFB703D3EE01B08F8E608D6F5F0259CFF3E08FFF39794BEFB5F01000000FFFF0300504B030414000600080000002100C8593714F7210000E61001000F000000776F72642F7374796C65732E786D6CEC5DDD731CC7717F4F55FE872B3CD90F347187C317CBB00B3810212B14450B90FDBC77B747AC79B845EE4320F9E4384A142571EC943FE4B2E558B22B8E5215CA721CC5B62CCBFF0C0192FF857B7A7A6667B777766F76E7705064A94AC2EDEDF6CDF474FFA6BFA6F78B5F7E78326CBC168E27513CDA59697E6175A5118E7A713F1ADDDF5979F5E8E0DAD64A63320D46FD60188FC29D9547E164E5CB5FFACBBFF8E2D98DC9F4D1309C3480C0687263BCB3723C9D9EDEB87E7DD23B0E4F82C917E2D37004DF0DE2F14930858FE3FBD7E3C120EA85FB716F76128EA6D75BABAB1BD7C7E13098C28F4F8EA3D3C90A513B9B87DA593CEE9F8EE35E3899C0684F8692DE49108D56BE04C3EBC7BDFD7010CC86D389F838BE37A68FF409FF77108FA693C6D98D60D28BA29D95A3E8046674373C6BBC129F04A315F8260C26D3DD4914ECAC9CBFFFCF4FFFF05D71ED787734C9BFBB37E144AE8B5F1A06A3FBF0E46BC17067251C5D7BF5304DFBF1F1B5CE5D71A91BF5817230BE76B8BB020F5EC781ABFF1B1338D5D3917765660B3C050E1FCA15025E84833B71EF41D83F9CC2173B2BB0CA78F1D5DBF7C6513C8EA68F7656B6B7E9E2617812DD8AFAFD100442DF383A8EFAE1D78EC3D1AB93B00F8242F77EE50097976EECC5B3D17467A5B5B1892B309CF46F3EEC85A76279E1F746C109FCF45DF1C0503C3E8B921FC7DF99657E042FFE8DFA85A6E00730328FE8711808896DE0B01640B7B5A0F1AE2D886E7B4174D717447763417437174417407121F28B2AE8517EA7718FEBC4DA768126892798B4973EC1E4B8F40926A1A54F30D92B7D824955E9134C5E4A9F609250FA045BE3C22704B285631437868E763C1CC4F1949E2A07593B995E80D8ED59D8C5E04630BEC6381C8463B03642F1031363D7C98171FB208311104313C213C161340A1BA3D9495772B0F2C04E83FB5EE884A3BE47761D45D32132DC23CC905DD2B8178C83FBE3E0F4B821ECAAACD8146DE087B3EE740103BBF5E8341CC37A3E7055A08378388CCFC27E8A406549389C8EE3D1FD2C3F6ADA3C374F4E8F834934F14C769FACF3C64BC1E99CA4EDBA79EBE8A53B8DA3F8B4110F4024C62782609A8B25CFEEC5D3697C52E5716967363EF7B5B0FB799C87037CE2B0777BB0688F7286CCB6FE923974A2693D84C3E174E2BE072AA0A9D1281206395F0AD779FD75F8A81B07E37E7D4A87C1C9A904A5B470B88EE808D4FD0CBC999AC08DFCFE6A308E826ECD5191101EE513B2CBCDDDB871279A2082A639627FE4E5D914372EF19CB4F92A3D89B65FA527D1069CF749E448E33012EB9E375A87954F91CA197E555239F37126D51906109C201B3CCD9BCAB47C4C518DCBE71CD1A2AF3BC778188F07B3A11791E828625E38A6887961593C9C9D8C26BE6689B43C4D1269F99CA327B1C071ADD7DA6A2450FCD538EA7B613C12F2C17524E483E548C807BF91903766A31B5E13187044E89DFB20844E7B4D42B67DD619D791900F3942423EE40809F9902324E4438E90900F3942423EE40809F990A3B5FD463818843D484360D8A3A6581AE47CC89441CE876475202C109E9CC6E360FCC80396DF1C86F7031968A8C9B67BE37820F248F148E6266A9213E10C5F86AD24E56331C115F62263828EAFF1F8902AB139086932235A3284E8E0F34BEBE0087297F5DCEC7BC3A0171EC74388DA368EC287532EE6761F0EDCBEC3D3A007992C97A7EE44F78FA78DC3634C8165F9B0618932D90721C9097C63B49C992A69E5ADCF060A10CFF8D9C7F552D88F66276A9E5290CD15DF4051AA41518EC888976FE01E5881226E0E2C88BD813B6155727C7432BDE120E2C441B4A5F8E87057AC303A24C74727132315472797D25C0A99357120B71F8C1FE8208A29279BCE1AA11D498B8E6D3AEB85A698A7669BCEAAA1C9E569DAA6B35EA400A5B1DBEB4129418EBE39F33141163B51675626106327EACCD02CD6D8493B333743BA65275D0F7DEC749D61E895F0B54898466E9B128421753EC8E5C9AFCC2037E8F2C06DB0294793B0E1FC202D05A275C13AD4C359FB3AD4035C3BDD7AC86BA75B1D82AD34EB63B19DB4339268144581B0C15E4D74B68FD7194972619A6FC41E609A1375662E87694ED41B4C73D2CECCB5C13427ED07A6395D6798CE85334ED70F9C71BA7EE08CD3F503679C6E7D386334FDC11927EDAC71B970C6E9CA2B0E86B5A68B863FC124A7EBAC71B97026A9988E800738E3449D99CBE18C1375E66C06739A6AAFE0A4E5158745CB90D6D60E27ED07CE385D3F70C6E9FA81334ED70F9C71BA7EE08CD3AD0F678CA63F38E3A49D354EC38E699D71BACE4AA7E99A70C6E9CA2B0E1A970B6752B93CC31927EACC5C0E679CA833673398A3E18C9376666E86B486334E5A5E715837228D525630643F70C6C7EB07CE385D3F70C6E9FA81334EB73E9C319AFEE08C9376D6380D3B269C71BACE4AA7E99A70C6E93A6B5C2E9C4925F00C679CA83373399C71A2CE9CCD608EC6064EDA99B919D21ACE3869B99275E18CD395572AD22D18AF1F38E3E3F503679CAE1F38E374EBC319A3E90FCE3869678DD3B063C219A7EBAC749AAE09679CAEB3C6E5C2991456CF70C6893A3397C31927EACCD90CE66838E3A49D999B21ADE18193F603679CAE9490BA70C6E9CA2BEE74517A0B58EC07CEF878FDC019A75B1FCE184D7F70C6493B6B9C861D13CE385D67A5D3744D38E3749D358EEA8D6C47829A96F5829A99B98E57AB0C9B8D7ECBC2E079E9D3F05F31CF039A29FBB59AF4D5F8ED3F6059C97927B017C70F1AB927EBD62C6B3937E5A83B8C623C54F7882745814A8A4F9B05277B8F5EEE346EC973F2E5845060D2B201AD08CCAE02E22C3E768080314CE1DCCDCECAA93AFD27C843C701D17A813A05E08DB7A16F40D0C4CE00A21500DC84DD10A8210016FED02FE2DFD092A2AFEE595D5DDFDF6C6DD2F4A0F701FEBA2C95827BC4C1979D95F62AC686C587576643B8103E0C7A53C9916824680DA2F1647A07BEEF1C0763E8D4000D28C458F5E59D95ADAD55F100CC957E04DA4688DF1A671A45748261D41D47E2696A06A1AEE0D8278FE10B9C5DAB2D073079DC117D26E4B5162D93EC09917498D08D21641708F9510E07C701C3424E96F05E739B333B699480E3EC06D0CDE165D19C010706AB83974750B796BD066C7DA0AE3505FFE4AD4E2BF6200C4FEF026DFC11F141ACC5043F4D832EB6E980FFAB5F198683A960F0690C4BA59645DD271754DC0222D64425D3CB48AB8B6B7B0C3CC65E26E226FCA5581E94BAF3DA50FD90A25DB6E427B0E2416AC9E51524DB95FFEDC8E9F4C47111457F6D63FD609B586B48C6961C4F4A32E81A750BB13703711283568B299D920392C48A72D05A921C00E258C4A4D9C61981A22841996894E886D08B066041683D2E5622432431EB124050A85A6D537E52372432D5224A5CA670B9E78091AA32D53ED86AEEEDE748D086BC46129460CB1C1D669C840AF664014326922BA12245AB28546BFE850A0EF34B18873F6EEB4D452D91FE56898C4DB8DA6BA42EB61BB6D69B0A4B14AD52F1CB452D7D9180EFEC06973025E88B42AD55FC4748138871A5EDA76D1711DA152B8A487B8122120D938D81043925358AEDAE52331F24F165C631F8059248A25FDE5695C04AD5455FB72FFABA84A68A8BBE7E498B4EA2B9D445C731D45DF4940DD26AAF1DC059801ADABC61C57BDA722AAEEBC625AD2B49DF52D715C750775D0BD4B7FE2ACBCE6D79BB3A395F155779F39256996471A9AB8C6358E02AB757C5BF757479CBAACBE480545CE5AD4B5A6592C5A5AE328EA1EE2AA7303AD97CC1CF4F2208E463A4FCC45AABBF6D5D7DEA0C5771F5B72F69F5494697BAFA3886BAAB5F80E4898EFB92851EC46C201E267BE3D8C2733C5260E9ED852664127B54A10E15E5D0CDDCE47DA98C89B4412CCE26F84DB2E78E6D846B4C78534D762CE382E6A6F84D72AE377F603A208E5F4FBB43E937C21FB73182088D69312C20239EFD8781240BDF77C2E1F0A5602C7CE22934BC3ABB61B95584ACE4B7CD554CCF64487565C72BEBF3633CED895FE71100913407233F8A49C05F1696831E41AB3B3A746A637B3B87EDF2785D4D8EDBC7958A27E3D84504197CF06CDC019334C541072EA94A22D2271E7132A59167163852A167198E9451658A12094C4C42CD3A74A483503D7124FEE174160CE9E82F0C0178825EBD2B6F8275C61BA33BE264D6FD3AF41990129B8578653799915FBA66467E1384F7C4518AAF7791F15D744961D695C20D01F7508CD90B26E74F9D302B3B4DDA76BDCCD3752121199A1572D198D5DD04E7A357DD46BDC87D933228320EDF5A97F1D0CAE2CB9D8FBDB8FF088FD1370E44EEA601280C8751F3D751C5CE8D448510575A5ECE89FA08A0C374A4E44D964F6AD7E40837D43547F2996011660A5CFA654212DB0C0660574022A6DE6C2DC87E17F727E8382131223F65E57766B025E6048C55284E7FEB15BBB9558EB690E87D19CCA6C7A24B7B04CDF78B989097B7F3CB18B6F3A500A0AEB4070CF54E02E8C229E79CC567DAF0FDCE4F85EDE1FFCAA44DA521DB323F6C4F406DCB209BFD86665BBAEE05776C4B35B2DF01B929DA9D6CE36C5122DB4E636DAD6CA46B5B6523858488724415E31E44A349FC60A69847C38CE10D130368A87B6F36EAE9CC327D07C21D0BD327DCBF99792AF9E66EE69BC928383D8AB1888652D7448C4112D9596A4B22D32227A11FCFC611B46C81773F9819DEF455F176878E710975D1F0D4316C2BFC3523D74FD7583ECE77AE3FE832E5B92B9A6CAB920F57DCC8AA1BCDC3AFBA7DBDA71656F49800D71446A996CAD5660261CDDA4CE818ECCD86C370DAA0F167EDDE8558077A83803F927C238E0066A5BFF5B97D002E65670F581D3E6CB807F4FC2E31DB319A696789A0ACEAAA073D36EF9BD7E01D3043682E7B7F144C67E3B070CBCC8A396509BCF0C05582F9F687027C57B6A22F52602FC3D5354F5A4053E2AB7217FA5B9FE21BF4D9325258A7C8E25F88F24A81D5A63DD495E94DAE9A531EB2A9A9F72A142D699E2DE7546C956C8520E3A2EC050012D0567C90E571627B350157EF8D5D39AEE2FCB019966C12C8981B9FBC062A50C9975FE7BE808433D24F0B8CE731CDAF6E3038DB923E9FF480C5871A5B58C041DCD8C20A71CCEF2CB58EA71040E5B5F4B75E1160C0D4241CBD160EE135628DA0DF1F4377C64B64C0600C15AAF744051F84713785410E7F1E8387BB0D1BADF8D3AC30159FD18285EFE5D767F0120CF1162F781F561F6FDF1DF5C0831335B2F74371E1E1EE10B6A79D15327BE0CA23BA22E3BF72AA563397496166534D8BA1566C5EC55A587E66AAB3AC63ADAACEC1804B76EA4513454898DDA2292C698FD2524C313B5B7A7F1BFED48370ACAB5E29B090D8F1FEE12C18F0AA98691C34A862AE50B0178F69C94EA14A2433819CE50B10F8AAF9E62D09C3D5D90F200628F759950BA8B7230CF84678180C67F28547CE729355250A287BD93C5CAD5D3819915D521DDB6C5070C7B2ACE634B05C94BC7F2FF3D06670A216F9E14DAD15067290389AC8D954DB662543281870367586B178E365E1EA9B2C12D169B2D0FC72886D432D8A804B6B487CA8610DAD719D37ACA11211F13B516DF1A4EC215501A2BFF56B0FF1946BA21FB70BF22096140065C0FD32C6A6236737B86C98B858D3A7E23A6178CA57403250DB00101722192DCBEC2F334152BCBA8402CBC8800F780A1C45A30369F668342B0E065D29DD38BBE1174E78767C6F08EF04964DCA8BECEFA57165D3440CCC9B809F84F52F946FA51BF012F85E945901BDAB14A801272F6B9098FBCD65AA97C68DD47E8308BE2854112F3D63F3C737A1EDCEE17D9BE68678482C90B44F3C490FF97466C51C70A292490547C4B2EB0C7006A1F2E214C1E2FD3006AA1BA602880F35ACA975BE6B8892121FF134AF2525A9785A7343E65BABAAF41AB7A1C4A48BBD8BF916DAEBA45329114ABB569D7330E06534F0528A68548EF4A6160B0D0E16A1C296B08C08A2ED8E26513AC30A572D495723C58A066F553480339F59343051BF583F3C811B1DE1CB477D7DA4507FEDD32EE00A625AD2C5887829B3578BBB90D96FE585E57A5E72A65EF1211DDE6D6DCBC28CAA08B1C66D64B901FAC0C5FA5575227840065E0A17EB668A07BC986E3F80570D14D9BE797B411625BB5E5192B080D902AD75D318A8195A81687E16F4B2B185927A3B9309D806E0F24270B027C0AF8B861F32D9223EA4339A0B8E3E04035EABA75ED2EE5C66DC5B84F45812475501639D8B4BCAA92EB122FDEE130E2127D01223168FC14954769F1B6830E0651B7B01BC3D3EAE6070F517220CBA0386549BF90B018CC0B6F70C7F30E0056B83182AD6C86FB484FEED593F024E55886854462649566C25D36E822F847260DC8331049199C55BB6D65655D45ED12B51A9BC64808A0256F25283418F61B44E888F43286C1AC9495818E559E9F20B2E15A0E8D9678DFB4E509061AE6AB2B7B8FD92EC5EE63901DB1E3620BB966D62143AF7CB3BB9957B2C281AF4996488447289E6989315E615193EF6B996AADAE95E7F2CCC0879DE0D3B488DE211D6374C1ED3413981D6B0556303373CEC0A6511547704DBB83C0B57F824B688644FEA537285CFE6FFAA3A4157F868DECF0A695753E6EDAA168932506C352F889FDD488A6A814BC702244AD5F4283A0927A2F6B9F14A7C12E08BBEC819CF7E83B899DD17AA2A7230E0B571D5CA36078BD838B90D4E890D2FE94DF0EBB336B8884D110459503DCF1FE11A5CC1F78425B41C0FCD3F86D9E6E1C4B4497899A1834439D299FA1C3F2037BCE837D5D2E6D6B258D862862C6C6175390393E65474B9D992C7411454B8CA4330E0F57BF08B105577AD716AFADD842971E064989CDDE822CED53B8F0A13C92AB8E4880F15AF1066A9B0A41CA244ABD608DE6D5D687BE60973D6FC808A40E4B1534DB394616D4A5194087D3C7D31E915491E41350930334D021F8C7E8EA93E1D7A5F4673A249F162B300A85EE924B775CD002DFD9C65B7E03B4305B1D100A223B0F04772AAA5897951902DFDB55FEF3AA7725230A050FEFCCE3B014EDD317629950D39A580C2611E89535ECE6127602BAA9F5F56557592D367E6EA1D1DD8E0B02BB65FAACCB3684A1E6271D654B0ABB4F6245244A8951F9CAABAFFAE5B70E23201824D316D6CC958DC1254672DA7F445F715B88D957425296173F3C282D3C5688FDE4B4ACDD8A263D73A1863B86924FDE6B654AF2E15DE799E6FDCF8E851516797624298EE51819F00F9AAEAD9363789E017C1CC756F9DC5F1C5EFBCD3F67DCDF211B0EFB9C707B1D161281A140CA2FB70D07252B829CF07B15E5990D212FA3017FE54958E16471AB1F7A089044E457EEB8AF918E375EF4931A6662D2E7436CF228198B30F7DF03AE7664A1F54FB83CA2BCD8B6C921874F17A9B9B09A64EE976BF78901B13294F9D56E547DB627F14473DFC4E99417F6AC529763797FEFB0D08B578E1413A56562C2F7E99942B17E80A30F6A5AA2F743310CFEE1D0F96BD04473DE1982476AE70CC69808BB400AF4607FDB1AF1FFAF9E2FC8DEC5328321DF8061FC1D8B9321DAECFA6731DAE4FA7B21D6E0F0B2CA07CC7E458B7CD3FED4DE57158332903C03288864333B9C3C42953C0420769E5FB39C827A25B4847216DB49AAEFFD4A6AD6338CFB47BEB85634471333701B14EFADE58BC60E224984EC37EA125646E00AA58DA6FF98C2DE465F4AE811573AAB784FB51F2653384B4C32EAF81B854CC74E71CDAA0EE0F9FFB5AD8FD7C2133EDE8589ABF4CA0509F7B953EAAFCB80B794ABA851298CA2D9377E1A7CC4D86676195553A879C2C407241D4BA9AC794FDC9ED1AB757D27B5071ED9F9DCB55FA08268C571C5552C54023BD855392C2F3F6CCABB96018E0D2156FCBF399ED8BF5670C7103ED734AE08143C79D15F90A33DC421D9C1513CF049083A788249C42FB6AA729DAEDB05F2EEDB366823E09C89B5B56369AB246C560C5DD508A65CBAAD485852E99FC417313DE08B52F7994A802A22B85EB52ED0974E9958260688E82FC35D1415E2B87E09E28EB575DA075535D10068E0F87D371AC4E19CFB794B4ED74A500CDD9CCD53A226E35EBF70F3A88178DC94CE7D4E012878A5BF0EEBBB1D000B92676A0B46F4734C4548E49BC7CE7E08068AA8527F30D665F3E058CCD888236739103E6AA1F61084774D293BF95557B52653E2D8A8096CE2A0942C26BC898D8CA6B6A36504AE4D0717B2F1E43CD937C6B9CCD32479420C4C0342119AD82BD0007381EB30A296D20CFF374115ECDF37C817D3ECFE3D06E31EA87B7321222961DFC92F9097CB52A01583A583373293ECDADD0B9D25CCB8B6BDC3F9E360E8F833E38818DDD9E28FCB255405BD547565BC076627DCB651E2AAC35B7DADB7B426CF355E670FA6818BE129FED05A3FE61F458BF63939415560AEFE8C443FB1DB74B1ADD9B6B6D533B73A336D5AEBDB7DBE9A84C9C6A749FE350973FFF69943B54155C00EC2C251BFF63DD022C192233552C244681724C9089642CE3DFB0E354EEE996911D04C1698FDE74D0F3B5BE26AC8EA2216D2FB5161DD485DE7E8032A3A9664030735D639BBE3E1DB6BA638578C9D571ABABDF094A578598251CC14FF43205A54BC436D22C636187C164FAE775855DA85C993F55EB8A0A0B088A0A5B6CF1CE25239E487501F29B5F0DC7531C17FCF2BDF15C8AADC57F0E7DD5F72E570DC1B849C291BD6108AD064099C9B2C3EA72F828C391FBAD9BBB07B8FB39E92E32F3563C7EFC6766C682B7F33213988CEE864808E21FF06CCECBC17BB3C9343EC19D90226B78B378BD0B949365B389176FBDF3E2ADFF7DF1A3EF9115C3C20D9463B2FA284ECE2B8F2CCFFBA66FAB7B03071D16F4A6EF2246F274FDF93FBE75FEC64717EF7FF8FC3B7F205E66DD3DBACC59099D14104EE6E3253BC40A4D345588CF43FEA868DA3C9F74FEF1F79F7DEFBDE209E705F3989C5170663E16E4C41D3261A0C40705B5C1DBEBABCFD1CB1D9E8E878B8D8B77DE78F1B31FE63381AEE6F120471028B13F1F174810F86B6D910ACC176FA83F6FA8BB65B0F1C37FBDF8E127DE169FBC16A769CF13D3347D74FC9BF6B19298A6720CA892835C83964C9799E71E7656B6A1FE0D7018F76CF949FA8FB43639260C3C8FCA1E15B780F627B62D2EB4526009532D30656A28565288E8B3C429BB5F4DD3D6E5CAE60B9F9526A40A9CD18787B9EA27B2EED91DF0C5207123DF1E8F2B915C413E72F1C71F52E24FDAAF4E1DA000C082C980707B6B7F9FB0D78CF756CA6216E0E6FE5EBBB3B7B9B6DFD9D8BFD9DE6F76B69B9DCEF6E6F6FAEE7AA77970B3CDE39EA50FE0CC4B9721E1A512E154947E134517D63973C29FB1EE32B76DA93E9E101BCA30B3C8F5F477BF78F6E3F7F3B13A50226ABEA88DAEE580B56AF09A7D0123889C25F0049CAD69C29DF2FC385C4271B0E8B16D2CBA783A9112210A05BDEC2B9D7E04AFA91F8C020192941237AE14A66489F1CCBC7B7C7CAD7357D0EB467DE868148CAF1DEE0A0E00733D89CD6993276CC4354F6C56DB0B154D916EAAE38FB806463A2DBFFB867122874A0C3F33AB03F934DEDDE0F9BBEF5DBCF3F1C53BBF39FFF8DB85EB9432C428FB0772FF40ED096297837C1D2EB5933DE2A0463211AF9750FC246C71187AD4176D27AD2CEAE059FEB9C577AA4E5F5D02CCCCC79F4A728F0DCF02E975E21AA7F6FDE5410EB811DC394F7C8B7C538D869B1269BA96B35D916F915353E224E790C69169C1E42D6E3A4C84FD3D703B0230563732C5B0D91D69CB9A76356EDEA5BC1B6DDED5D18B9E99B72FB0E39A6802672D0A694C379A0DFC1685CA04145A10FB364C3E0237B274778F10A2DDBB9328D0F54BC966AA4A23F067BBF2BF798E0514451C40313989BC023B289EA52B46C73F058AF96115B8BF7CA39D97A18263DC44BBF8C11B17EFFEFCD9EFBF7BF1EFAF9FFFF8130B5FC56B2F70F0CE9C358BC052C5208A198A3D75DE55312F0BF0C413B35249A6D62C735FF32054AA40919AC8202BBBF2BF7902940454C0867DAC38243D2571C51020022BA691D5DFCA372F33D14FB531B36561A62A9D709623A57BEEDA98C41F4A9989A1117F1AB72154CEC6A10D0B87283CE39B41057190567BED4065F1AFACB4B58B78D9B6F0B27D29AA5BC05A07D95B9E22AF17B176DDC2DAF505B1361533FA5448E66611FB362DEC23A7E712B5BCBD2AFECDEEBA576C4FD92AE2E59685976443F9E6654A124D455EC25EBB5DC4976D0B5FC807F1CD9722B833646C095C124CCA39DC4BF61DB2106D2ED363C0EAF16AA6AD6192CCE13480E122FCE1DC366429516B5E95A2EA02E70C39CDA3A3E76FFEB28CD955FD087FCC2E92DF83ADE6DE3E61A4AEBAC7F4858AC894184898E0F06741229F797C48E6022D6ADFA4244BA9DE1730227140FCCD2527CEFBF4B7DFBAA0E4E647CF3FF83B3229E68B9090275F30892D3873A74FDD9544AB7B734625704172BC6823456B5B164ABA972E4BDA2F2C985FB227795C247E562159A46F7FF3F9372A2DD2E404FA087782D309026D0AED3AABEBAB6D52B999F2745D8E07CCBB724D9EF9AB2B7BCB5D297E0442A4DB7EF52D89C05574293D9FF4A225814599CD1520E951EC78928116A7B2CC154DC62A8179B33CBBB150B94444E1B53EBA56CC0627E42FF2D8F3BC8E99B19311AD82C0122EBA8E2925E68EBE24F383F2A357D148CA21F263C132D264E112946354B5ED0A8BE5A470A5C4683D55DFA0902CD7BFA20D7A491672C822522FDEFDF0D9DB6F5A5818409366E42197347524B4744BCB86DBB3467012D4CB7E83BF9C486A5E9058851497C4CE3E63E7C59BBFBBF8F57B17EFFE8388ADBFFDDF56BE06657C9D8427D1ADA8DF0F47F30971319F14EF96C027D51B80B10ADB0D9CBFFDC1F94FBE616193B8C3379FD23655C235254905387899C8A7B8C6FD2C64DB8B9FBDFEFCFD4F20110F59F802E691C365D75E5729CB2A73A7722F862548A2D86D79BDC9B3FFFCE0FCDF3EB6303128EFC5E2CAC22B2B72823DDCAE7CF6D12F4BA04C556745F7C6513C8EA68FD4FEA7B608570E65852CE92CA1526969A9C35203E35266DF5076404AB3C93658921472AFFED9F73E3C7FF29D17DF7CFFE9EFFFEFD9934FCEBFF32D9B44F67C23E29516C89CFAFFF7BF5D2C90DEB7D6AC3C56073D83D56407A684326D1B2ECFEC46B78417333F7FFD47C2B629366C160998CA8A3199A6AE2D499379C8449453FCE4A7CF7FF9C4A6C0AAB188BF5DD910AB726FEE32AD182148DC82211BF9076F9C3F79CBC624CA847F4678C46C63C9A2A7BFFD3D1C77B1B188628AFE58D4C58D53BE2E20552E71F5846AC03856BC69C22B5A7072FE9875A5752E27A2F6D67F5CBCFD539B28C14B253F4BECE931E939FFE093F2AD4DD5757A3374AFB40CE534EA7FFAC7772FFEB634CB47568C3F5563F657F23AB66433E34E42729735F76A2C40813D669CD39EB76DE492AC115ED97CF1E4E7C2602BB4D93E5BCACFED5AC9A317BFF8C1F377FFE5D9C7FFF5FC8F3FB6E1A47757D710C0ABB7C9E624CD0C692AE6947A39A13F14B8B2ACC224C55C52652D8CF56ECA5D6D6695C094954D9F1DF5C362F51CCFC9D0BF86B566DDDAAEAB6A402E9126F9BA8D7419BABAB6843D0F55AF984D04535699F26EAD24CCBA6229057AE50BCBA41A3245CCB24AD602BD722545A9D80EFDDE12244B442E7212F3BF7EEFC51BFF545CE6D6FD4CB952391D57CD13A236434A9C2C458FB3347D6CA813C5EC4D09512A4612B2B0428426B445C82A8EAA0A2C9D42D67FC9E6B9ED1970F826CF77110F44A3E9CE4A3F1C04B3E154B2325591208AF854E7558385BA06DC3845A492842A6DE35280A55B4D16D48B36AFE5BC43F2E96F9F3C7BF2E6C56F7E75F1E1DF9F7FF4FD671FFD0ECEF55D6B9C7F2C6A01C15D81D0E08B9FBDFDFCCDFF69A83769668FC35A77B90DFAC6BE2ED8574C2CA76A6D76859B4D6EEEEDAE76F6E50A9BCDCDD23D5E6DDDE9CCA78B7ABCCEF37CAA5D9AFBCF67DA1BBA12807A33582DB3ADE3D56FD19A0898D151110F9E5F6E4BC54CCBA603FC4788942AE2C381CED96ACF75E1D22F48777FFA6A89AD6E1E28C5D95F574EB0A9E76D0798AAFD952D4FA576602FBA4F792BCF7E3C83D7B189AE23D977D2982D784D5CFBFF848A0B132F2120D81C771E494188EA7CEA9A83CEAD40FB6BFB07376F1200CECF96B27E9A1E7F1F5689FA17A9BF265FFA9300000000FFFF0300504B0304140006000800000021002A3A81C8EA0000004601000018002800637573746F6D586D6C2F6974656D50726F7073312E786D6C20A2240028A020000000000000000000000000000000000000000000000000000000000000000000648F416B84301085EF85FE07997B4CA26BD5455DD84D85BD96167A0D71DC154C2226D642E97F6F6CA1B0ED6978F398EFBDA90EEF7A8CDE7076833535F098418446D96E30971A5E9E5B5240E4BC349D1CADC11A8C8543737F57756EDF492F9DB7339E3DEA282C8630CFA2868F232FF3BCCD05495876243B567052F2F444D242ECF8639E656D997C4214A24DC0B81AAEDE4F7B4A9DBAA2962EB6139A60F676D6D207395FA8EDFB41A1B06AD1683C4D187BA06A09F1FA558FD06C7D7EAE9FB077B772ABB6CCC36FCABAAEF13AB95899FF549ED2609DBEC122FC07B4A9E81FF6A66F7E6FBE000000FFFF0300504B03041400060008000000210025ADE606D80600008832000012000000776F72642F6E756D626572696E672E786D6CCC5BCD6EE33610BE17E83B04027CE821B1284B9664ACB328920DB0C5A228DA143D2B321D0BD58F21C9F6E6D67D9FBE551FA0AFD0E19F2CDAD4AF25377B58AF48CE8833F391F371A8FDF0F16B14DEEC719A0549BCD4D09DAEDDE0D84F5641FCBAD47E7F7EBA75B49B2CF7E2951726315E6A6F38D33EDE7FFFDD87C322DE452F38858137A023CE167BE8DEE4F976319D66FE06475E76976C710C9DEB248DBC1C1ED3D769E4A57FEEB6B77E126DBD3C7809C2207F9B1ABA3ED7B89A64A9EDD278C155DC46819F2659B2CE89C82259AF031FF31F2191B6792F937C4CFC5D84E39CBE719AE210E690C4D926D866425BD4571B98B8114AF67546ECA3508C3B6CDBBC6D957A07F07314B2691F9274B54D131F6719B43EB2CE4223D2EBDECD1D485414126DA620BF53CC24F282B85043E07112FF22787710BC297BF794A83A1A02BEB80730792F599E7A7EFEF32EBA919E3EAF969A4E87C459B082BEBD172EB527FAC77ED0A64438DA8579F005EF71F8FCB6C5620C714E8869331B9647DB5074CA0AC23DE908E087BC0CFE990346001A04D288BE1CD6409A0B61C4F4C102788A8AC615F683C80B59D7F6B7FC2D2C6662B14650FF8CBF1602137457B4FFE40BDD215EE75CC72F29312E07D7F05F690C3C6C936CA919BAA91381E97168101347114D0F1B2F85318E4EAD222D5C00FA375EFC0A2EE243600912C379E3529BCD85D62D99076887E9D3DF52A81A23C79CA788DC23B3B17FE4B88291236716111A2172686E081F8B209F456E5E8E1C15380669D4C819556BEED3A591E30A468EDC6CD4C891D5D2B0E64C2972F2F21A3572B3AAC83D5D1A39AE60E4C8196346CE761A03C743C5364B32FE4A2BCEAC881B9BF105594E2818226E2FBB30C42241C9498E3A96A689F25EF9EFB7BF8B78BEFB2C7758A42CE9A64F499C6710782FF38360A9FD0189927062608990237F848476DA16C4905A5778ED0117E15B03D5D533715A5560E0DCA377E274B88271C1C028C95860B84EE27C3F60985781816F95FDC170DC6B01D797F1DFEA9D6136EACE80AE928BDF0F18EC2A3070C6D31F0C47CA34221818E51D6B67B8467A7F3F5070AAA0E05CC8F41CAE60882451732EF60A6650660C039D8B8F07D8F3C3153BDE92547E8533B05B1525F7D22871054344A97AF7F646DDBD878FD2FB599EE8BC6EA5B33FB5752BBA8187A49AC5F0512E5BC9F243045E5A9EA0B0C74A3C162D969A6958A5F3127B660765A98C44F7FF22CB2022326CC9CD38D2DC138B2646ABB25BD9286B6E4B4691E746A38C218C3A0F084C7F32EB6C81ADBB9205E4B9D182D998164CCCCE463816054A51A224CF8D4698231B31B13ADBE1BA141B851DE4B9D10EBAAC2E5D2355708260801D93796753109A510717B6D0864663E0B2E7F205DF68CCC4EE6E8F61D3B91DED210D8DF6D0ED61F4E0803D13A7BB4926823BBC82EAC0850669683489CA5CC9A489DBDD2ACB927734441A145641FDA5D385C5F98D05CFB9B575EF16397BC0B2B7BF09629CE1876417E750947ADE24BB0CAE6889F96707AB09FAE7AF6F454F4D05AE9CF05C474E7866715141B3F839C58209D597BF4648F8CAF5DFC652711E805F5817F43E91DEBAC103BD517366738B43490C2D3B8776971794658BE1C378E77F670EC2EA4A0759406DD95A1343250791EEB283EC81E133083191AF68CD3ABE0884AB255D11EEA8F4DCDCA2578ACACB5AB8A725DD65CF3973317C18680DC28664CF3112A6D877EE185565DC62907569BB2271093F4BB023DD65E7215D17E387F1DE201C4CF61E25174DCE6B49CC84532AC1E7329457818F744BFE4332C1BE78DB1F84F6C9FEA307B116FE6BC9059B5CE8EA8EA08362681982B45B72A1E18AF1C3407010A629BBF058EB3B3F29B39D8F9D0DDAD34FE19A2A20BA06BB12A80022ED96BC68169FB80CE3C541C8ADECC5632DAE8D175B32DE4647CE6C5AB4AF7224E9961C6939627C5F47C2AB3AF1E9F3EF48AC99F50999067798FABAA28E4FCBF2C002C1C2CBAEAEA41A981CD659152FF8A14D462BEF0D8E0BBACAC13821D5E058B08533F8C2A4BEA5B13039E0F40BCE739C16139580697436C09D9DD45F5A19D097CC52037E4D222F56CF5F59034B83D70DBD7D0726CF2EF2CB11706DBB470406219BA76795EEC52FA423B7C7ECFB12BE46FC589DF183F439EA61415FD2D5042065B1AB1E4008E97DD6F020B4E714413D6A5BC8ECB380FB328E460439DD11849C3E2BB86FB66F4290B26AD58020C368B78ACFD32C7C6D0C5901FE265F44B32A5529117F265FFCD2520612C564184AB28924C7B2B15A4E14D35572EC9B42A59C20142A31F6499B524C944C5462ECE327A59838D0A9C4D867324A31972411F0A94A8C7D50A11413DC5D25C62EDF9562751160B7C14A3171A9A47A1BBF4B54CA89128152AE0E29354E01149D7CDC7D4498A8FD28DF578394A26844055934D8FF20B9FF0F0000FFFF0300504B030414000600080000002100743F397AC2000000280100001E000801637573746F6D586D6C2F5F72656C732F6974656D312E786D6C2E72656C7320A2040128A000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084CFC18A02310C06E0BBE03B94DC9DCE781091E9785916BC89B8E0B5743233C569539A28FAF6164F2B2CEC3109F9FEA4DD3FC2ACEE98D95334D05435288C8E7A1F47033FE7EFD516148B8DBD9D29A2812732ECBBE5A23DE16CA52CF1E413ABA244363089A49DD6EC260C962B4A18CB64A01CAC94328F3A5977B523EA755D6F74FE6D40F761AA436F201FFA06D4F9994AF2FF360D8377F845EE1630CA1F11DADD58285CC27CCC94B8C8368F2806BC6078B79AAADC0BBA6BF5C77FDD0B0000FFFF0300504B030414000600080000002100EA25D7E32F030000770D000012000000776F72642F666F6E745461626C652E786D6CBC96C14EDB401086EF95FA0E96EF25EB8D094E44409062F5520E256DD5E362AFC94AB637DA75083C404F3D55957AE93BD0DE2BFA34A52A6FD159AF9D98784D6254302282597BB2FBF99F7F6677FF2289AD732A24E3E9D076B6906DD134E0214BCF86F6DBB1FFC2B32D99913424314FE9D0BEA4D2DEDF7BFE6C773E88789A490B9E4FE5400CED49964D079D8E0C263421728B4F690A6B111709C9E05F71D6E151C402FA9207B384A6590723D4EB081A930CBE5B4ED854DA45B6F926D9E65C8453C1032A256C368975BE84B0D4DE2B7667CD07294960D7EFE10E7524992F4D49CA257560F59CC4431B6DA3DA6577548E604284A4D9E246ACC31149587C5946C92CE33A3E65593029C3E74430721A53BD24D9192CCCE42982EF2B2E5B471CC07E37826BF774EF46823C8F57790A229067911976DFD12FA88662CC122AAD633AB7DEF0846856AB4030C2A887BA00C6855F0C7FB96620C80444E47973801B1239828DE303DF5F12194164C7739D22B224D22F224622F9F91D9D67732237579F7E5F7FC99541E2EC180453BEC313969CCCD2E2E5AE88062307182160E3943F46465ECFC4E8A1A2E92E1161CFF3D581571139BD35885C782807BB39A21189D9A960C6EAC1C8CF45A244E3020EF83482809DE69AB85B3D72CEA4D40B2DC48270552CEA4007A345642996523EF788A59F8BAE0D890440900612AA5C74D9A8F26947E261655327815C03895225FF93049F094685B292061A3BC0A00F1470AE0FB7952E121E5251965ED557237641432D98AAA9365A4859314B553C8285BCA3222469932A0EC1285465283B755BAAA27D7D1CA86ED25B6800DA82AA0F78078735A77804558CC904ECBF41104F0BE20840E0A32A08D5557A0610789D24C0E2759E164601330D8F8979E2C048A1D0B5D1DE335BD7865244CD317D9363AE03019DA3AD63DEFCBAFA7BFDFDF6DBC7DB9F9F1B75A16C533790FCD3D840CC9DB47D81E47313F676AAAD14F9DDD136AE15C806ADD469D940FE7CFD511938EA93979A2AFA40E32153455B61802CD4555A2458C5530E15AF5920B8E451F681BCA27AB65899BF0A50A659DC2C8686B12AA41199C559BD6BE8F32F66A8EA08AD87F365D758E795CA64F37BEEB1886226977BFF000000FFFF0300504B0304140006000800000021003847F661040100007E01000013000801646F6350726F70732F637573746F6D2E786D6C20A2040128A00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C904D4FC4201445F726FE07C29E42D16A69DA4E6C3BB371A189E3EC1BA03324051AA0D5C6F8DF65327EEC5DBEDC9793736FB979D72358A4F3CA9A0AA60981401A6E8532C70ABEEE772887C087DE887EB4465670951E6EEAEBABF2D9D949BAA0A40711617C054F214C05C69E9FA4EE7D12631393C13ADD8778BA23B6C3A0B8EC2C9FB534015342EE309F7DB01A4DBF3878E1154BF82F52587EB6F387FD3A45DDBAFC86AF60D041890A7E7459DB7519C910DDB216A5246D10BB61F788E484D086B63BF6B0FD84603A3F53084CAF63F5C797A78815330FCDAC4671902EA297508CD39B0FAEA624A3882571C2E496E55989FFA212FF18D4253EAB5D86ABBF000000FFFF0300504B030414000600080000002100F02111F8A4000000DE00000014000000776F72642F77656253657474696E67732E786D6C8CCE410AC2301005D0BDE01DC2EC6DAA0B9162DA8D7801F500319DB68164A664A2D5DB1BD003B8FCFCCFE31FBB570CEA89493C93816D55834272DC7B1A0DDCAEE7CD0194644BBD0D4C68E08D025DBB5E1D9766C1FB05732E4B51452169928129E7B9D15ADC84D14AC53352E9064ED1E612D3A87918BCC313BB4744CA7A57D77B9D30D85C1EC8E467819FB6FCA32D9CFA39B14391722486AF17AD27D0ED070000FFFF0300504B030414000600080000002100482EE307C50000006101000013002800637573746F6D586D6C2F6974656D312E786D6C20A2240028A0200000000000000000000000000000000000000000000000000000000000000000009C904F8BC2400CC5BFCA90BB9DD615594AA71E56056F8BAB6719A6535BB0C960E2B67E7B0744DD45BC985BFEFCDE0BAF980DDD41FDFA23B78406B22405E5D151D5E2DEC076B31C7D8262B158D903A13770F60CB3B2E0DC9D58A89B5BB12A4A201B684442AE75DFF7491F3871A8A9AE5BE7E7E44E9D47D1E334FBD071F57547E1CAE66FD26571FDE2C73BF93E52E0FF03FDD4EA57F74D580CF2C09BB0C29A1487B632B01BD2583BCED2C91494F841D62456621819448B9BE64D42FFCDA6BC000000FFFF0300504B030414000600080000002100FFA2193BBD0100001403000011000801646F6350726F70732F636F72652E786D6C20A2040128A00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007C92416B143114C7EF82DF61C87D36990DAD32CCA660DB15C442C1AD156F3179DD466732214977BA37C183174BF124DE0A9EBC09E241ADDFC659FC18666676C6DA8AC797FFFFFDF27F2FC9B64E8B3C5A8075AAD413948C088A408B522A3D9FA083D934BE8B22E7B9963C2F354CD0121CDA62B76F65C2A4A2B4B06F4B03D62B70512069970A3341C7DE9B1463278EA1E06E141C3A8847A52DB80FA59D63C3C50B3E073C26641317E0B9E49EE306189B8188D6482906A439B1790B9002430E0568EF70324AF01FAF075BB87F36B4CA1567A1FCD28499D671AFB2A5E8C4C17DEAD460ACAA6A54D13646C89FE0277B0F1FB5A3C64A37BB1280582645EA95CF813DD8DDDDBEBF7AFFEDD7AB1FF5E5CBFAFC6DFDF5737DFE6941A3AE5CBD795D9FBDCBF0D0D0B4BA9367CF4178F698DE30F552631316B82F2DAB2F2F7E7EFFB0FAF2B1C5F4A7CD1BE5DCF9BDF09C470AE4BD259B7AB353563AC337A5C66D61A19A9FC068EB18CA9EB46F95F620D9982434269B3149666423A52425E4E9C0EC4D2160BBF12E25C828EC30ED36DE2B87747B673645D77949C7EB5DED3CE1D60158AC07FA3F712326344EEECC129A8EAF117B006B43FFFD8FD96F000000FFFF0300504B0304140006000800000021008B92C16796010000EA02000010000801646F6350726F70732F6170702E786D6C20A2040128A00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C924F4FDC3010C5EF95FA1DA2DC89932C4480664DAB45550FFD83B401CE237B92584D6CCB3688EDA7EF84B04BAADE9AD3CC9BD1F3F32F869B9769CC9E2944E3EC36AF8A32CFC82AA78DEDB7F97DFBE5EC32CF6242AB717496B6F981627E233F7E80BBE03C856428666C61E3361F52F2D7424435D084B1E0B1E549E7C28489DBD00BD77546D1AD534F13D924EAB26C04BD24B29AF4993F19E68BE3F573FA5F53EDD49C2F3EB407CF8125B434F91113C91F739CB1D02E4D204E2AB42EE1D89A8964D3B07EEAE00E7B8AF2BC06B154F0E88266E1FCF20AC452C36EC0802A3144595F5C5CF1EE4A81CFDE8F466162C0F2BB51C145D7A5ECE72B8A6C7600B15E01C6B327F5144C3AC812C4BA856FC6729ABADA80584ACE17B00FE887281BDE5EB5B05738D28E31C80EC74820DE05D8B9C9A33DC8DF03DA5EA389CAA5F4A96A3685720CE6389E0FFC15EF7DEB6E67786F3E7F8BABEB3F9A34EC3D2ACEB829CBBA5A8358CD60CFC048F3CD8E8EEF027CE53F16C6F95886687BD2C79D7F0733DA87E5E9CAAA2E4AFE5E591E35C6717A53F20F000000FFFF0300504B0304140006000800000021009A8F7E35C7070000393D00001A000000776F72642F7374796C657357697468456666656374732E786D6CB49B6D53DB3810C7DFDFCC7D078FDF439E285C99A61D0A7D6086F6680373AF155BC13A6CCB673B04FAE96F25D98AB1E37837765F2571A4FDAFB4ABDF8A20BDFBF01C85CE134F3321E3B93B391EBB0E8F3DE98BF861EEDEDF7D3EFACB75B29CC53E0B65CCE7EE0BCFDC0FEFFFFCE3DDE63CCB5F429E396020CECE37893777833C4FCE47A3CC0B78C4B2E34878A9CCE42A3FF6643492AB95F0F86823537F341D4FC6FA5D924A8F6719A85DB2F889656E612E6A5A93098F416B25D388E5D9B14C1F46114B1FD7C911584F582E962214F90BD81E9F9666E4DC5DA7F179E1D09175487539370E152F658FB4318A1DBAA6E795F4D6118F73AD384A79083EC8380B44B21DC6A1D6608841E9D2D3BE413C4561D96E934C4E1A7A76C898185CA56C03A1D81A6C98DB3119BEE91485661E547CB751AD5B9C8CF70DA6888832617DC0B8F05AB3F4246222B6660E9B9AEAE4C27AE893DF5F52B94EAC3B89E867ED3A7EB4B6D4B22478363ED52BAF3AB48C64A0B17417014BB8EB44DEF9F5432C53B60CC1A3CDE4C45119E9BE0754F8D2BBE22BB60EF34C7D4C6FD3E263F149BF7C96719E399B73967942DC0142C04A24C0E0D78B38132E7CC359965F648255BFFC543C53DF07AA61F54BDBD3CBF28AC18FC217EE48893EF234868E4F2C9CBB53F328FB651F4CCA2797CA2FD3A86815B2F8A17CC6E3A3FB45D5BFB9FB2B38BAFCAE1E2D416AEEB2F46871A18C8DF4E0CBD7CA2424764A4CABDA8C015B80340B435C984FBEBA91DE23F717397C317781DAFAE1FDF56D2A640A189CBB6FDF160F173C125F85EF7305F8B2611C089FFF13F0F83EE3FEF6F98FCF1AAF85454FAEE31C26E6F44C4731CCFC4FCF1E4F14E6402F662A42DF55076010D4838A8E76682DB6DE98073555FDF0BF52B298ED9D2A0167AA2439DAFFBD427AD4EBDE425335A2EA00B45D92AFB3FE264EFA9B78D3DF0494D3BE7371D6DF046C44FA7A6172A39295F8A0E6D233C957CD89D95B03889D29AB7A34B2A8B34723693A7B3472A4B34723253A7B3432A0B34723E09D3D1AF1EDECD108E7DE1E1ED3E0AA67D14CCF066A61DF893C843AD741BA494FD41545C1B965297B48591238AA30D6DDDE07CBC57A99E35CD5383D1C968B3C956ABBD8312353B30C0E66F2A7280958266057DD25D473EAEFD4D6C5F9920AD87E7648BD31C9D71893DE55ECE4C16DC83C1EC8D0E7A973C79F4D4409FDBF4B6791304FEFCF3B9CEB19D61BF110E40EECEA54C9ED9C89D396496F9F0963FF46647A0EF656F3D396A1741947C5F0B4252FDB8D7FE3BE5847E5D4207623A786E78430D724B48BFBA7E84485A8B9883B47A1028019822917F42168FB08FF4D71A1DB5731C6F86F4AD181F611FE9BC275A07D9D1FFBE34B26CD15FC2CE2A096D71979ED5ECA50A6AB7558AE814E3C9C9157B095C00D81BC88AD7D1424CEC82BF8153E9D0BCF83BFDC30794A8EC596A3041572388C8A5E6CF8B1908352C3DE84302272806A5A5382563FD61284C8D0FDC99F84FA11975A0C34A5ED5EB37339CF5A66004A106A0FFD632DF3EE3DF4B485795895EB187E2EC9B883539BB5AC3CAC5A914FA6DE1162DCAFF01184FA55408250BF5248106AC98FF63D8FAD897891FEC591A045C6B2AD623AEDD0643E2393D90AD14AC0407513B1FF6A59BDEDB9D0AC9B081572809A7513A1428E4EAD96D9BA89D01AAC6E22B45AAA467B8CAA4CA50C8A5C37AB4276278018D130F046080D036F84D030F04608F58777B7C870F0466891D960995A8537424837A1FCA96F85AAF0460891D9606857FC6654D63D6D65FF1FB703C01BA1420E5013DE08157274DAE08DD0D24D289950D3B2A843680D036F84D030F046080D036F84D030F046080D036F84507F78778B0C076F8416990D96A955782384C878B0425578238474130A1B76C25BAFFADF0E6F840A39404D782354C8D1A901D56E52115AE400D5B42CBC115ABA0925190A2D9DDC94410D036FC48886813742681878238486813742A83FBCBB45868337428BCC06CBD42ABC1142643C58A12ABC11426436EC84B75E8CBF1DDE081572809AF046A890A35303AAE51C428B1CA09A968537424BE74B6F7823847493438528231A06DE88110D036F84D030F04608F58777B7C870F0466891D960995A853742888C072B5485374288CC869DF0D66BE4B7C31BA1420E5013DE081572746A40B5F04668910354D3B2A843680D036F84904ECCDEF04608E9260708E9554409D330F0468C6818782384FAC3BB5B64387823B4C86CB04CADC21B2144C68315AAC21B214466833A670BE745D1C753272D49803D67509E6A400B4E5B8284152C06F893AF780AB70279F7E9909E82E508098A2DE9811DE247291F1DDCC1EE594B82A0A5C43214521FE97ED1A7742A171166677B6E12DCFD7DE97C3517601AFD744ABD3E7903778CAAD785D435277D5513FCCC5F12B8B2939427CB9535B84AA4EE6515578074C36BB810C426FACA8FBAE3038DF4D5A7E2A68FFE9F6DA1A8DFC3D525A5B111BEDC5CC251F554866597B119D5BF5EF96029E15E23F4021F753778D5924D27BD00BCF4729EEE7372DA70B2E5F4BC76747B75A374A7BCE0656F2E9976AFCE721A6F5BBCCCD589F17D1ECE1A1E9A6974F45973333D4DBFE0EE96F664BB09DCED184474199AE98737D7B10F03DB1497B74CACFD67664CC1F7973C0CBF311DAC5C26ED4D43BECACDB793B12E90355310C45C46EDFD537D7E5C7BB2CB00C4BCEA8CF9A806D19E0CF13A5AF2B4388DDE96B1E6AAE1EB8C35C760CDE4D9E5069EEB84C6CEF2D6AFF25DF6FE7F000000FFFF0300504B01022D0014000600080000002100E3E429E6120200009C0B00001300000000000000000000000000000000005B436F6E74656E745F54797065735D2E786D6C504B01022D001400060008000000210099557E0504010000E10200000B000000000000000000000000004B0400005F72656C732F2E72656C73504B01022D001400060008000000210090AEA9F3A60100005C0900001C0000000000000000000000000080070000776F72642F5F72656C732F646F63756D656E742E786D6C2E72656C73504B01022D00140006000800000021002FF90A018A370100D93415001100000000000000000000000000680A0000776F72642F646F63756D656E742E786D6C504B01022D00140006000800000021002536CC8BCE000000400100001B0000000000000000000000000021420100776F72642F5F72656C732F666F6F746572332E786D6C2E72656C73504B01022D0014000600080000002100A58D5AEB540500008A130000100000000000000000000000000028430100776F72642F666F6F746572322E786D6C504B01022D0014000600080000002100E3299BEFA3050000A21A00001000000000000000000000000000AA480100776F72642F686561646572332E786D6C504B01022D001400060008000000210004973214E0030000B70B000010000000000000000000000000007B4E0100776F72642F666F6F746572332E786D6C504B01022D00140006000800000021002C74796F2405000010120000100000000000000000000000000089520100776F72642F666F6F746572342E786D6C504B01022D00140006000800000021002536CC8BCE000000400100001B00000000000000000000000000DB570100776F72642F5F72656C732F666F6F746572322E786D6C2E72656C73504B01022D00140006000800000021001FE96A4652010000000300001000000000000000000000000000E2580100776F72642F666F6F746572312E786D6C504B01022D00140006000800000021007FD728C752010000000300001000000000000000000000000000625A0100776F72642F686561646572312E786D6C504B01022D001400060008000000210075CF13D30E050000321200001000000000000000000000000000E25B0100776F72642F686561646572322E786D6C504B01022D00140006000800000021002536CC8BCE000000400100001B000000000000000000000000001E610100776F72642F5F72656C732F666F6F746572342E786D6C2E72656C73504B01022D001400060008000000210036253B8AAB01000080040000110000000000000000000000000025620100776F72642F656E646E6F7465732E786D6C504B01022D001400060008000000210055AB081AAC010000860400001200000000000000000000000000FF630100776F72642F666F6F746E6F7465732E786D6C504B01022D0014000600080000002100502A0738B4060000AE1B00001500000000000000000000000000DB650100776F72642F7468656D652F7468656D65312E786D6C504B01022D0014000600080000002100987FD771B51800008F6900001100000000000000000000000000C26C0100776F72642F73657474696E67732E786D6C504B01022D0014000600080000002100C8593714F7210000E61001000F00000000000000000000000000A6850100776F72642F7374796C65732E786D6C504B01022D00140006000800000021002A3A81C8EA000000460100001800000000000000000000000000CAA70100637573746F6D586D6C2F6974656D50726F7073312E786D6C504B01022D001400060008000000210025ADE606D806000088320000120000000000000000000000000012A90100776F72642F6E756D626572696E672E786D6C504B01022D0014000600080000002100743F397AC2000000280100001E000000000000000000000000001AB00100637573746F6D586D6C2F5F72656C732F6974656D312E786D6C2E72656C73504B01022D0014000600080000002100EA25D7E32F030000770D0000120000000000000000000000000020B20100776F72642F666F6E745461626C652E786D6C504B01022D00140006000800000021003847F661040100007E01000013000000000000000000000000007FB50100646F6350726F70732F637573746F6D2E786D6C504B01022D0014000600080000002100F02111F8A4000000DE0000001400000000000000000000000000BCB70100776F72642F77656253657474696E67732E786D6C504B01022D0014000600080000002100482EE307C500000061010000130000000000000000000000000092B80100637573746F6D586D6C2F6974656D312E786D6C504B01022D0014000600080000002100FFA2193BBD010000140300001100000000000000000000000000B0B90100646F6350726F70732F636F72652E786D6C504B01022D00140006000800000021008B92C16796010000EA0200001000000000000000000000000000A4BC0100646F6350726F70732F6170702E786D6C504B01022D00140006000800000021009A8F7E35C7070000393D00001A0000000000000000000000000070BF0100776F72642F7374796C657357697468456666656374732E786D6C504B0506000000001D001D00690700006FC701000000, 'JeeWx-API鎿嶄綔鎵嬪唽20150317', null, '2015-03-17 22:37:24', 'docx', null, 'upload/files/20150317223724W2AaKaVD.docx', 'org.jeecgframework.web.system.pojo.base.TSDocument', 'upload/files/20150317223724W2AaKaVD.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc81808a0009', null, 'JR079839867R90000001000', null, null, 'doc', null, 'JR079839867R90000001000', null, 'upload/files/20130719201109hDr31jP1.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc81808e000a', null, 'JEECG骞冲彴鍗忚', null, null, 'docx', null, 'JEECG骞冲彴鍗忚', null, 'upload/files/20130719201156sYHjSFJj.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc81808f000b', null, '鍒嗘瀽JEECG涓庡叾浠栫殑寮婧愰」鐩殑涓嶈冻鍜屼紭鍔', null, null, 'docx', null, '鍒嗘瀽JEECG涓庡叾浠栫殑寮婧愰」鐩殑涓嶈冻鍜屼紭鍔', null, 'upload/files/20130719201727ZLEX1OSf.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc818091000c', null, 'DMS-T3绗笁鏂圭璧佷笟鍔℃帴鍙e紑鍙戣鏄', null, null, 'docx', null, 'DMS-T3绗笁鏂圭璧佷笟鍔℃帴鍙e紑鍙戣鏄', null, 'upload/files/20130719201841LzcgqUek.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc818092000d', null, 'SAP-闇姹傝鏄庝功-閲戣瀺鏈嶅姟鍏徃-绗笁鏂圭璧佷笟鍔¢渶姹俈1.7-鐮斿彂', null, null, 'doc', null, 'SAP-闇姹傝鏄庝功-閲戣瀺鏈嶅姟鍏徃-绗笁鏂圭璧佷笟鍔¢渶姹俈1.7-鐮斿彂', null, 'upload/files/20130719201925mkCrU47P.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc818095000e', null, 'JEECG鍥㈤槦寮鍙戣鑼', null, null, 'txt', null, 'JEECG鍥㈤槦寮鍙戣鑼', null, 'upload/files/20130724103633fvOTwNSV.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc818097000f', null, '绗竴妯℃澘', null, null, 'doc', null, '绗竴妯℃澘', null, 'upload/files/20130724104603pHDw4QUT.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc8180980010', null, 'github鍏ラ棬浣跨敤鏁欑▼', null, null, 'doc', null, 'github鍏ラ棬浣跨敤鏁欑▼', null, 'upload/files/20130704200345EakUH3WB.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc81809a0011', null, 'github鍏ラ棬浣跨敤鏁欑▼', null, null, 'doc', null, 'github鍏ラ棬浣跨敤鏁欑▼', null, 'upload/files/20130704200651IE8wPdZ4.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc81809b0012', null, '锛堝紶浠f旦锛-閲戣瀺鏈嶅姟鍏徃鏈烘瀯宀椾綅鑱岃矗涓庝换鑱岃祫鏍艰缃〃(鏍规嵁妯℃澘濉啓锛', null, null, 'xlsx', null, '锛堝紶浠f旦锛-閲戣瀺鏈嶅姟鍏徃鏈烘瀯宀椾綅鑱岃矗涓庝换鑱岃祫鏍艰缃〃(鏍规嵁妯℃澘濉啓锛', null, 'upload/files/20130704201022KhdRW1Gd.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc81809d0013', null, 'EIM201_CN', null, null, 'pdf', null, 'EIM201_CN', null, 'upload/files/20130704201046JVAkvvOt.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc81809e0014', null, 'github鍏ラ棬浣跨敤鏁欑▼', null, null, 'doc', null, 'github鍏ラ棬浣跨敤鏁欑▼', null, 'upload/files/20130704201116Z8NhEK57.swf', null, null, null); +INSERT INTO `t_s_attachment` VALUES ('8a8ab0b246dc81120146dc8180a00015', null, 'JEECGUI鏍囩搴撳府鍔╂枃妗3.2', null, null, 'pdf', null, 'JEECGUI鏍囩搴撳府鍔╂枃妗3.2', null, 'upload/files/20130704201125DQg8hi2x.swf', null, null, null); + +-- ---------------------------- +-- Table structure for `t_s_base_user` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_base_user`; +CREATE TABLE `t_s_base_user` ( + `ID` varchar(32) NOT NULL, + `activitiSync` smallint(6) default NULL, + `browser` varchar(20) default NULL, + `password` varchar(100) default NULL, + `realname` varchar(50) default NULL, + `signature` blob, + `status` smallint(6) default NULL, + `userkey` varchar(200) default NULL, + `username` varchar(10) NOT NULL, + `departid` varchar(32) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_15jh1g4iem1857546ggor42et` (`departid`), + CONSTRAINT `FK_15jh1g4iem1857546ggor42et` FOREIGN KEY (`departid`) REFERENCES `t_s_depart` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_base_user +-- ---------------------------- +INSERT INTO `t_s_base_user` VALUES ('402880e74d75c4dd014d75d44af30005', null, null, 'deec3ebf23191eee', 'demo', null, '1', 'demo', 'demo', null); +INSERT INTO `t_s_base_user` VALUES ('8a8ab0b246dc81120146dc8181950052', null, null, 'c44b01947c9e6e3f', '绠$悊鍛', null, '1', '绠$悊鍛', 'admin', '8a8ab0b246dc81120146dc8180a20016'); +INSERT INTO `t_s_base_user` VALUES ('8a8ab0b246dc81120146dc81819d0053', null, null, 'd47ca58189979651', '寮犱唬娴', null, '1', '鏅氱敤鎴', 'scott', '8a8ab0b246dc81120146dc8180bd0018'); +INSERT INTO `t_s_base_user` VALUES ('8a8ab0b246dc81120146dc8181a10054', '0', null, 'f2322ec2fb9f40d1', '閲囪喘鍛', null, '1', '绠$悊鍛', 'cgy', '8a8ab0b246dc81120146dc8180a20016'); +INSERT INTO `t_s_base_user` VALUES ('8a8ab0b246dc81120146dc8181a60055', '1', null, 'a324509dc1a3089a', '閲囪喘瀹℃壒鍛', null, '1', null, 'cgspy', '8a8ab0b246dc81120146dc8180a20016'); + +-- ---------------------------- +-- Table structure for `t_s_category` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_category`; +CREATE TABLE `t_s_category` ( + `id` varchar(36) NOT NULL, + `icon_id` varchar(32) default NULL COMMENT '鍥炬爣鍦板潃', + `code` varchar(32) NOT NULL COMMENT '绫诲瀷缂栫爜', + `name` varchar(32) NOT NULL COMMENT '绫诲瀷鍚嶇О', + `create_name` varchar(50) NOT NULL COMMENT '鍒涘缓浜哄悕绉', + `create_by` varchar(50) NOT NULL COMMENT '鍒涘缓浜虹櫥褰曞悕绉', + `create_date` datetime NOT NULL COMMENT '鍒涘缓鏃ユ湡', + `update_name` varchar(50) default NULL COMMENT '鏇存柊浜哄悕绉', + `update_by` varchar(50) default NULL COMMENT '鏇存柊浜虹櫥褰曞悕绉', + `update_date` datetime default NULL COMMENT '鏇存柊鏃ユ湡', + `parent_id` varchar(32) default NULL COMMENT '涓婄骇ID', + `sys_org_code` varchar(10) NOT NULL COMMENT '鏈烘瀯', + `sys_company_code` varchar(10) NOT NULL COMMENT '鍏徃', + `PARENT_CODE` varchar(32) default NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='鍒嗙被绠$悊'; + +-- ---------------------------- +-- Records of t_s_category +-- ---------------------------- +INSERT INTO `t_s_category` VALUES ('402880e74c60690a014c6077c91a0001', '8a8ab0b246dc81120146dc8180460000', '01', 'online鍒嗙被', '绠$悊鍛', 'admin', '2015-03-28 21:00:05', '绠$悊鍛', 'admin', '2015-06-05 09:45:51', null, '02', '02', ''); +INSERT INTO `t_s_category` VALUES ('402880e74c60690a014c6077e04b0003', '8a8ab0b246dc81120146dc8180460000', '02', '1212', '绠$悊鍛', 'admin', '2015-03-28 21:00:11', '绠$悊鍛', 'admin', '2015-05-28 20:41:54', null, '02', '02', '01'); +INSERT INTO `t_s_category` VALUES ('402880e74d9a8469014d9a8ae4e30003', '8a8ab0b246dc81120146dc8180460000', '03', '222', '绠$悊鍛', 'admin', '2015-05-28 20:41:43', '绠$悊鍛', 'admin', '2015-06-05 09:46:00', null, '02', '02', ''); +INSERT INTO `t_s_category` VALUES ('402880e74d9a8469014d9a8b2db00006', '8a8ab0b246dc81120146dc8180460000', '04', '222', '绠$悊鍛', 'admin', '2015-05-28 20:42:02', null, null, null, null, '02', '02', null); +INSERT INTO `t_s_category` VALUES ('402880e74dc15d03014dc16616220003', '8a8ab0b246dc81120146dc8180460000', '05', 'online鍒嗙被', '绠$悊鍛', 'admin', '2015-06-05 09:46:42', '绠$悊鍛', 'admin', '2015-06-05 09:46:46', null, '02', '02', ''); + +-- ---------------------------- +-- Table structure for `t_s_config` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_config`; +CREATE TABLE `t_s_config` ( + `ID` varchar(32) NOT NULL, + `code` varchar(100) default NULL, + `content` longtext, + `name` varchar(100) NOT NULL, + `note` longtext, + `userid` varchar(32) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_m3q8r50ror4fl7fjkvd82tqgn` (`userid`), + CONSTRAINT `FK_m3q8r50ror4fl7fjkvd82tqgn` FOREIGN KEY (`userid`) REFERENCES `t_s_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_config +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `t_s_data_rule` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_data_rule`; +CREATE TABLE `t_s_data_rule` ( + `id` varchar(96) default NULL, + `rule_name` varchar(96) default NULL, + `rule_column` varchar(300) default NULL, + `rule_conditions` varchar(300) default NULL, + `rule_value` varchar(300) default NULL, + `create_date` datetime default NULL, + `create_by` varchar(96) default NULL, + `create_name` varchar(96) default NULL, + `update_date` datetime default NULL, + `update_by` varchar(96) default NULL, + `update_name` varchar(96) default NULL, + `functionId` varchar(96) default NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_data_rule +-- ---------------------------- +INSERT INTO `t_s_data_rule` VALUES ('f852d85d47f224990147f2284c0c0005', '灏忎簬', 'test', '<=', '11', '2014-08-20 14:43:52', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null, null); +INSERT INTO `t_s_data_rule` VALUES ('f852d85d47f224990147f2284c0c0005', '灏忎簬', 'test', '<=', '11', '2014-08-20 14:43:52', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null, null); +INSERT INTO `t_s_data_rule` VALUES ('402889fe47fcb29c0147fcb6b6220001', '12', '12', '>', '12', '2014-08-22 15:55:38', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null, '8a8ab0b246dc81120146dc8180fe002b'); +INSERT INTO `t_s_data_rule` VALUES ('402889fb486e848101486e913cd6000b', 'userName', 'userName', '=', 'admin', '2014-09-13 18:31:25', 'admin', '绠$悊鍛', null, null, null, '402889fb486e848101486e8e2e8b0007'); +INSERT INTO `t_s_data_rule` VALUES ('402889fb486e848101486e98d20d0016', 'title', 'title', '=', '12', null, null, null, '2014-09-13 22:18:22', 'scott', '寮犱唬娴', '402889fb486e848101486e93a7c80014'); +INSERT INTO `t_s_data_rule` VALUES ('402880e6487e661a01487e732c020005', 'SYS_ORG_CODE', 'SYS_ORG_CODE', 'LIKE', '010201%', '2014-09-16 20:32:30', 'admin', '绠$悊鍛', null, null, null, '402889fb486e848101486e93a7c80014'); +INSERT INTO `t_s_data_rule` VALUES ('402880e6487e661a01487e8153ee0007', 'create_by', 'create_by', '', '#{SYS_USER_CODE}', '2014-09-16 20:47:57', 'admin', '绠$悊鍛', null, null, null, '402889fb486e848101486e93a7c80014'); + +-- ---------------------------- +-- Table structure for `t_s_data_source` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_data_source`; +CREATE TABLE `t_s_data_source` ( + `id` varchar(36) NOT NULL, + `db_key` varchar(50) NOT NULL, + `description` varchar(50) NOT NULL, + `driver_class` varchar(50) NOT NULL, + `url` varchar(50) NOT NULL, + `db_user` varchar(50) NOT NULL, + `db_password` varchar(50) default NULL, + `db_type` varchar(50) default NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_data_source +-- ---------------------------- +INSERT INTO `t_s_data_source` VALUES ('8a8aada9486347c001486401180a0003', 'SAP_DB', 'sap db', 'oracle.jdbc.driver.OracleDriver', 'jdbc:oracle:thin:@127.0.0.1:1521:oral', 'db_user', 'db_password', 'oracle'); + +-- ---------------------------- +-- Table structure for `t_s_demo` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_demo`; +CREATE TABLE `t_s_demo` ( + `ID` varchar(32) NOT NULL, + `democode` longtext, + `demoorder` smallint(6) default NULL, + `demotitle` varchar(200) default NULL, + `demourl` varchar(200) default NULL, + `demopid` varchar(32) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_fni8e3v88wcf2sahhlv57u4nm` (`demopid`), + CONSTRAINT `FK_fni8e3v88wcf2sahhlv57u4nm` FOREIGN KEY (`demopid`) REFERENCES `t_s_demo` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_demo +-- ---------------------------- +INSERT INTO `t_s_demo` VALUES ('402880e74d566c63014d566dfba40001', '123', '123', '1231', '123', '8a8ab0b246dc81120146dc8183cb00d5'); +INSERT INTO `t_s_demo` VALUES ('402880e74d566c63014d5674236c0006', null, '777', '77777', '7777', null); +INSERT INTO `t_s_demo` VALUES ('402880e74d582251014d5825e0c80001', '00', '0', '000', '00', null); +INSERT INTO `t_s_demo` VALUES ('402880e74d582251014d58260e3a0002', '9', '99', '9999', '99', null); +INSERT INTO `t_s_demo` VALUES ('8a8ab0b246dc81120146dc8183cb00d5', '
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n 闃呰\r\n \r\n \r\n \r\n 闊充箰\r\n \r\n \r\n \r\n 杩愬姩\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
', null, '琛ㄥ崟楠岃瘉', null, null); + +-- ---------------------------- +-- Table structure for `t_s_depart` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_depart`; +CREATE TABLE `t_s_depart` ( + `ID` varchar(32) NOT NULL, + `departname` varchar(100) NOT NULL, + `description` longtext, + `parentdepartid` varchar(32) default NULL, + `org_code` varchar(64) default NULL, + `org_type` varchar(1) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_knnm3wb0bembwvm0il7tf6686` (`parentdepartid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_depart +-- ---------------------------- +INSERT INTO `t_s_depart` VALUES ('402880e447e99cf10147e9a03b320003', '鍖椾含鍥界偓杞欢', '', null, '01', '1'); +INSERT INTO `t_s_depart` VALUES ('402880e447e9a9570147e9b677320003', '杞欢淇℃伅閮', '', '402880e447e99cf10147e9a03b320003', '0101', '2'); +INSERT INTO `t_s_depart` VALUES ('402880e447e9a9570147e9b6a3be0005', '閿鍞儴闂', '', '402880e447e99cf10147e9a03b320003', '0102', '2'); +INSERT INTO `t_s_depart` VALUES ('402880e447e9a9570147e9b710d20007', '浜哄姏璧勬簮閮', '', '402880e447e99cf10147e9a03b320003', '0103', '2'); +INSERT INTO `t_s_depart` VALUES ('402880e447e9a9570147e9b762e30009', '閿鍞粡鐞', '', '402880e447e9a9570147e9b6a3be0005', '010201', '2'); +INSERT INTO `t_s_depart` VALUES ('402880e447e9ba550147e9c53b2e0013', '璐㈠姟', '', '8a8ab0b246dc81120146dc8180ba0017', '0302', '2'); +INSERT INTO `t_s_depart` VALUES ('402880e6487e661a01487e6b504e0001', '閿鍞汉鍛', '閿鍞汉鍛', '402880e447e9a9570147e9b762e30009', '01020101', '3'); +INSERT INTO `t_s_depart` VALUES ('8a8ab0b246dc81120146dc8180a20016', '涓浗浜哄鎬诲叕鍙', '', null, '02', '1'); +INSERT INTO `t_s_depart` VALUES ('8a8ab0b246dc81120146dc8180ba0017', 'JEECG寮婧愮ぞ鍖', '', null, '03', '1'); +INSERT INTO `t_s_depart` VALUES ('8a8ab0b246dc81120146dc8180bd0018', '杞欢寮鍙戦儴', '鐮斿彂鎶鏈毦棰', '8a8ab0b246dc81120146dc8180ba0017', '0301', '2'); + +-- ---------------------------- +-- Table structure for `t_s_document` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_document`; +CREATE TABLE `t_s_document` ( + `documentstate` smallint(6) default NULL, + `documenttitle` varchar(100) default NULL, + `pictureindex` blob, + `showhome` smallint(6) default NULL, + `id` varchar(32) NOT NULL, + `typeid` varchar(32) default NULL, + PRIMARY KEY (`id`), + KEY `FK_qr3qlmgkflj35m5ci1xv0vvg3` (`typeid`), + KEY `FK_f2mc12eu0umghp2i70apmtxjl` (`id`), + CONSTRAINT `FK_f2mc12eu0umghp2i70apmtxjl` FOREIGN KEY (`id`) REFERENCES `t_s_attachment` (`ID`), + CONSTRAINT `FK_qr3qlmgkflj35m5ci1xv0vvg3` FOREIGN KEY (`typeid`) REFERENCES `t_s_type` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_document +-- ---------------------------- +INSERT INTO `t_s_document` VALUES (null, '1222', null, null, '402880e74c282787014c282aed370001', '8a8ab0b246dc81120146dc8181fa0062'); + +-- ---------------------------- +-- Table structure for `t_s_fileno` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_fileno`; +CREATE TABLE `t_s_fileno` ( + `ID` varchar(32) NOT NULL, + `filenobefore` varchar(32) default NULL, + `filenonum` int(11) default NULL, + `filenotype` varchar(32) default NULL, + `filenoYear` date default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_fileno +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `t_s_function` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_function`; +CREATE TABLE `t_s_function` ( + `ID` varchar(32) NOT NULL, + `functioniframe` smallint(6) default NULL, + `functionlevel` smallint(6) default NULL, + `functionname` varchar(50) NOT NULL, + `functionorder` varchar(255) default NULL, + `functionurl` varchar(100) default NULL, + `parentfunctionid` varchar(32) default NULL, + `iconid` varchar(32) default NULL, + `desk_iconid` varchar(32) default NULL, + `functiontype` smallint(6) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_brd7b3keorj8pmxcv8bpahnxp` (`parentfunctionid`), + KEY `FK_q5tqo3v4ltsp1pehdxd59rccx` (`iconid`), + KEY `FK_gbdacaoju6d5u53rp4jo4rbs9` (`desk_iconid`), + CONSTRAINT `FK_brd7b3keorj8pmxcv8bpahnxp` FOREIGN KEY (`parentfunctionid`) REFERENCES `t_s_function` (`ID`), + CONSTRAINT `FK_gbdacaoju6d5u53rp4jo4rbs9` FOREIGN KEY (`desk_iconid`) REFERENCES `t_s_icon` (`ID`), + CONSTRAINT `FK_q5tqo3v4ltsp1pehdxd59rccx` FOREIGN KEY (`iconid`) REFERENCES `t_s_icon` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_function +-- ---------------------------- +INSERT INTO `t_s_function` VALUES ('2c90ac564c9d1734014c9d6f4e370024', null, '1', 'menu.graph.configuration', '3', 'cgAutoListController.do?list&id=jform_graphreport_head', '8a8ab0b246dc81120146dc8180ce0019', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('402831814d8a2853014d8a55a7c90005', null, '1', '鏌ヨ榛樿鍊肩ず渚', '2', 'jeecgDemoController.do?jeecgDemo2&sex=1', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('40288088481d019401481d2fcebf000d', null, '1', 'menu.input.demo', '1', 'jeecgDemoController.do?addorupdate', '402889fb486e848101486e8de3d60005', '8a8ab0b246dc81120146dc8180820003', '8a8ab0b246dc81120146dc8180dd001e', '1'); +INSERT INTO `t_s_function` VALUES ('4028808848845c0f01488461226e0001', null, '0', '娑堟伅鎺ㄩ佺鐞', '1', '', null, '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('4028808848845c0f01488461b3ac0004', null, '1', 'menu.business.management', '1', 'tSSmsSqlController.do?tSSmsSql', '4028808848845c0f01488461226e0001', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('4028808848845c0f01488462658f0006', null, '1', 'menu.message.template', '2', 'tSSmsTemplateController.do?tSSmsTemplate', '4028808848845c0f01488461226e0001', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('4028808848845c0f01488463aa210009', null, '1', 'menu.Business.configuration', '3', 'tSSmsTemplateSqlController.do?tSSmsTemplateSql', '4028808848845c0f01488461226e0001', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('4028808848845c0f014884649488000c', null, '1', 'menu.send.message', '0', 'tSSmsController.do?tSSms', '4028808848845c0f01488461226e0001', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('402880e448a28b750148a290c0e50001', null, '1', 'menu.sort.management', '7', 'categoryController.do?category', '8a8ab0b246dc81120146dc8180d2001a', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('402880e74c783db3014c783ff88b0001', null, '1', 'menu.nice.list', '1', 'jeecgDemoController.do?goDemo&demoPage=styleList', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('402880e74d76e784014d76f5505a0012', null, '0', '鑷畾涔夎〃鍗', '0', '', null, '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('402880e74d76e784014d76f5cc2e0014', null, '1', '鑷畾涔夎鍋囧崟', '1', 'cgAutoListController.do?list&id=jform_leave', '402880e74d76e784014d76f5505a0012', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('402880e74d76e784014d76fa7e970024', null, '1', '鑷畾涔夋姤琛', '2', 'cgReportController.do?list&id=user_msg', '402880e74d76e784014d76f5505a0012', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('402880e74d76e784014d76fd1bd60030', null, '1', '鑷畾涔夊浘琛', '3', 'graphReportController.do?list&isIframe&id=yhcztj', '402880e74d76e784014d76f5505a0012', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('402881c746de1ea60146de207d770001', null, '1', 'language.manage', '5', 'mutiLangController.do?mutiLang', '8a8ab0b246dc81120146dc8180d2001a', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('402889fb486e848101486e8de3d60005', null, '0', 'menu.data.permission', '100', '', null, '8a8ab0b246dc81120146dc8180820003', '8a8ab0b246dc81120146dc8180dd001e', '1'); +INSERT INTO `t_s_function` VALUES ('402889fb486e848101486e8e2e8b0007', null, '1', 'menu.user.management', '1', 'userController.do?datagrid', '402889fb486e848101486e8de3d60005', '8a8ab0b246dc81120146dc8180820003', '8a8ab0b246dc81120146dc8180dd001e', '1'); +INSERT INTO `t_s_function` VALUES ('402889fb486e848101486e93a7c80014', null, '1', 'menu.Leave.data.access', '2', 'cgAutoListController.do?datagrid&configId=jform_leave', '402889fb486e848101486e8de3d60005', '8a8ab0b246dc81120146dc8180820003', '8a8ab0b246dc81120146dc8180dd001e', '1'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180ce0019', null, '0', 'online.develop', '1', '', null, '8a8ab0b246dc81120146dc8180890008', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180d2001a', null, '0', 'system.manage', '5', '', null, '8a8ab0b246dc81120146dc8180860006', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180d4001b', null, '0', 'common.query.statistics', '3', '', null, '8a8ab0b246dc81120146dc8180890008', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180d7001c', null, '0', 'general.demo', '6', '', null, '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180d9001d', null, '0', 'system.monitor', '2', '', null, '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180df001f', null, '1', 'user.manage', '1', 'userController.do?user', '8a8ab0b246dc81120146dc8180d2001a', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180e30021', null, '1', 'role.manage', '2', 'roleController.do?role', '8a8ab0b246dc81120146dc8180d2001a', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180e10020', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180e70023', null, '1', 'menu.manage', '3', 'functionController.do?function', '8a8ab0b246dc81120146dc8180d2001a', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180e50022', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180ee0025', null, '1', 'common.data.dictionary', '6', 'systemController.do?typeGroupList', '8a8ab0b246dc81120146dc8180d2001a', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180eb0024', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180f30027', null, '1', 'icon.manage', '8', 'iconController.do?icon', '8a8ab0b246dc81120146dc8180d2001a', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180f00026', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180f60028', null, '1', 'department.manage', '4', 'departController.do?depart', '8a8ab0b246dc81120146dc8180d2001a', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180f80029', null, '1', 'area.manage', '9', 'territoryController.do?territory', '8a8ab0b246dc81120146dc8180d2001a', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8180fe002b', null, '1', 'user.analysis', '1', 'logController.do?statisticTabs&isIframe', '8a8ab0b246dc81120146dc8180d4001b', '8a8ab0b246dc81120146dc8180810002', '8a8ab0b246dc81120146dc8180fb002a', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc818106002d', null, '1', 'form.config', '1', 'cgFormHeadController.do?cgFormHeadList', '8a8ab0b246dc81120146dc8180ce0019', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc818102002c', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc818109002e', null, '1', 'dynamic.form.config', '2', 'cgreportConfigHeadController.do?cgreportConfigHead', '8a8ab0b246dc81120146dc8180ce0019', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8181100030', null, '1', 'data.monitor', '1', 'dataSourceController.do?goDruid&isIframe', '8a8ab0b246dc81120146dc8180d9001d', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc81810d002f', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc81811d0032', null, '1', 'system.log', '2', 'logController.do?log', '8a8ab0b246dc81120146dc8180d9001d', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8181150031', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8181250034', null, '1', 'common.schedule.task', '3', 'timeTaskController.do?timeTask', '8a8ab0b246dc81120146dc8180d9001d', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8181210033', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc81812b0036', null, '1', 'menu.form.validation', '1', 'demoController.do?formTabs', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8181290035', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8181300037', null, '1', 'menu.demo.example', '2', 'jeecgDemoController.do?jeecgDemo', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8181330038', null, '1', 'menu.minidao.example', '2', 'jeecgMinidaoController.do?jeecgMinidao', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8181370039', null, '1', 'menu.form.model', '3', 'jeecgNoteController.do?jeecgNote', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc81813a003a', null, '1', 'menu.one_to_many.model', '4', 'jeecgOrderMainController.do?jeecgOrderMain', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc81813e003b', null, '1', 'menu.import_export.excel', '5', 'courseController.do?course', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc818141003c', null, '1', 'menu.uploads_downloads', '6', 'commonController.do?listTurn&turn=system/document/filesList', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc818145003d', null, '1', 'menu.JqueryFileUpload.example', '6', 'fileUploadController.do?fileUploadSample&isIframe', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc818148003e', null, '1', 'menu.no.paging', '7', 'userNoPageController.do?user', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc81814b003f', null, '1', 'menu.jdbc.example', '8', 'jeecgJdbcController.do?jeecgJdbc', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc81814e0040', null, '1', 'menu.sql.separation', '9', 'jeecgJdbcController.do?dictParameter', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8181510041', null, '1', 'menu.dictionary.labels', '10', 'demoController.do?dictSelect', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8181530042', null, '1', 'menu.form.thePop_UpStyle', '11', 'demoController.do?demoList', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8181590044', null, '1', 'menu.special.layout', '12', 'demoController.do?demoIframe', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc8181560043', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc81815c0045', null, '1', 'menu.single.table', '13', 'jeecgEasyUIController.do?jeecgEasyUI', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8181610046', null, '1', 'menu.one_to_many.example', '14', 'jeecgOrderMainNoTagController.do?jeecgOrderMainNoTag', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8181640047', null, '1', 'menu.html.editor', '15', 'jeecgDemoController.do?ckeditor&isIframe', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc8181680048', null, '1', 'menu.word.online', '16', 'webOfficeController.do?webOffice', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc81816b0049', null, '1', 'menu.webOfficeo.fficialExample', '17', 'webOfficeController.do?webOfficeSample&isIframe', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc818173004b', null, '1', 'menu.moreAccessoriesManagement', '18', 'tFinanceController.do?tFinance', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', '8a8ab0b246dc81120146dc81816e004a', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc818176004c', null, '1', 'menu.datagridHandHtml', '19', 'userController.do?userDemo', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc81817b004d', null, '1', 'menu.materialPom', '20', 'jeecgMatterBomController.do?goList', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc81817f004e', null, '1', 'user.report', '2', 'reportDemoController.do?studentStatisticTabs&isIframe', '8a8ab0b246dc81120146dc8180d4001b', '8a8ab0b246dc81120146dc8180810002', '8a8ab0b246dc81120146dc8180dd001e', '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc818183004f', null, '1', 'menu.ckfinderDemo', '100', 'jeecgDemoCkfinderController.do?jeecgDemoCkfinder', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); +INSERT INTO `t_s_function` VALUES ('8a8ab0b246dc81120146dc818183004h', null, '1', 'menu.queryEditor', '100', 'jeecgDemoController.do?goDemo&demoPage=queryBuilderDemo', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8180460000', null, '0'); + +-- ---------------------------- +-- Table structure for `t_s_icon` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_icon`; +CREATE TABLE `t_s_icon` ( + `ID` varchar(32) NOT NULL, + `extend` varchar(255) default NULL, + `iconclas` varchar(200) default NULL, + `content` blob, + `name` varchar(100) NOT NULL, + `path` longtext, + `type` smallint(6) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_icon +-- ---------------------------- +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180460000', 'png', 'default', null, 'common.default.icon', 'plug-in/accordion/images/default.png', '1'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180800001', 'png', 'back', null, 'common.back', 'plug-in/accordion/images/back.png', '1'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180810002', 'png', 'pie', null, 'common.smallpie.icon', 'plug-in/accordion/images/pie.png', '1'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180820003', 'png', 'pictures', null, 'common.picture', 'plug-in/accordion/images/pictures.png', '1'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180830004', 'png', 'pencil', null, 'common.pencil.icon', 'plug-in/accordion/images/pencil.png', '1'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180850005', 'png', 'map', null, 'common.smallmap', 'plug-in/accordion/images/map.png', '1'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180860006', 'png', 'group_add', null, 'common.group', 'plug-in/accordion/images/group_add.png', '1'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180880007', 'png', 'calculator', null, 'common.calculator', 'plug-in/accordion/images/calculator.png', '1'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180890008', 'png', 'folder', null, 'common.folder', 'plug-in/accordion/images/folder.png', '1'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180dd001e', 'png', 'deskIcon', null, 'user.manage', 'plug-in/sliding/icon/Finder.png', '3'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180e10020', 'png', 'deskIcon', null, 'role.manage', 'plug-in/sliding/icon/friendgroup.png', '3'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180e50022', 'png', 'deskIcon', null, 'menu.manage', 'plug-in/sliding/icon/kaikai.png', '3'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180eb0024', 'png', 'deskIcon', null, 'dict.manage', 'plug-in/sliding/icon/friendnear.png', '3'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180f00026', 'png', 'deskIcon', null, 'icon.manage', 'plug-in/sliding/icon/kxjy.png', '3'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8180fb002a', 'png', 'deskIcon', null, 'user.analysis', 'plug-in/sliding/icon/User.png', '3'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc818102002c', 'png', 'deskIcon', null, 'form.config', 'plug-in/sliding/icon/Applications Folder.png', '3'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc81810d002f', 'png', 'deskIcon', null, 'data.monitor', 'plug-in/sliding/icon/Super Disk.png', '3'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8181150031', 'png', 'deskIcon', null, 'system.log', 'plug-in/sliding/icon/fastsearch.png', '3'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8181210033', 'png', 'deskIcon', null, 'common.schedule.task', 'plug-in/sliding/icon/Utilities.png', '3'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8181290035', 'png', 'deskIcon', null, '琛ㄥ崟楠岃瘉', 'plug-in/sliding/icon/qidianzhongwen.png', '3'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc8181560043', 'png', 'deskIcon', null, '鐗规畩甯冨眬', 'plug-in/sliding/icon/xiami.png', '3'); +INSERT INTO `t_s_icon` VALUES ('8a8ab0b246dc81120146dc81816e004a', 'png', 'deskIcon', null, '澶氶檮浠剁鐞', 'plug-in/sliding/icon/vadio.png', '3'); + +-- ---------------------------- +-- Table structure for `t_s_log` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_log`; +CREATE TABLE `t_s_log` ( + `ID` varchar(32) NOT NULL, + `broswer` varchar(100) default NULL, + `logcontent` longtext NOT NULL, + `loglevel` smallint(6) default NULL, + `note` longtext, + `operatetime` datetime NOT NULL, + `operatetype` smallint(6) default NULL, + `userid` varchar(32) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_oe64k4852uylhyc5a00rfwtay` (`userid`), + CONSTRAINT `FK_oe64k4852uylhyc5a00rfwtay` FOREIGN KEY (`userid`) REFERENCES `t_s_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_log +-- ---------------------------- +INSERT INTO `t_s_log` VALUES ('2c90e2064a9a8c11014a9a8f22cd0000', 'Chrome', '鐢ㄦ埛: admin[浜哄姏璧勬簮閮╙?common.login.success', '1', '172.16.98.134', '2014-12-30 17:37:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('2c90e4044ce0677f014ce06870420000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '172.16.100.132', '2015-04-22 17:14:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('2c90e4624ce4cead014ce4d37e860000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '172.16.100.226', '2015-04-23 13:50:08', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('2c948a824ca79832014ca79bbfda0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '172.20.10.2', '2015-04-11 16:32:24', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('2c948a824ca79832014ca79c11cd0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '172.20.10.2', '2015-04-11 16:32:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('2c948a824ca79832014ca79c39d80002', 'Chrome', '鐢ㄦ埛: scott[閿鍞粡鐞哴?common.login.success', '1', '172.20.10.2', '2015-04-11 16:32:55', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('4028549646e51f300146e522042f0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.212.22', '2014-06-29 08:59:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028549646e5250c0146e52752580000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.212.22', '2014-06-29 09:04:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028549646e52ed20146e52f8ec20000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.212.22', '2014-06-29 09:13:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028549646e52ed20146e5f558f40001', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.212.22', '2014-06-29 12:50:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028549646e52ed20146e5fc7b6b0002', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.212.22', '2014-06-29 12:57:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028549646e6187b0146e62208cf0000', 'rv:11.0', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.212.22', '2014-06-29 13:38:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028549646e659060146e65a86e70000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.212.22', '2014-06-29 14:40:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028549646e659060146e68c46060002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.123.64', '2014-06-29 15:34:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40287ef14d41fc55014d41fd05fb0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.254.113', '2015-05-11 16:00:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40287f6d4d5fad4c014d5fadcd1b0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.255.237', '2015-05-17 10:22:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40287f6d4d5fad4c014d5fae08c80001', 'Chrome', '閿欒寮傚父: NullPointerException,閿欒鎻忚堪锛歯ull', '6', '192.168.255.237', '2015-05-17 10:22:30', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40287f6d4d5fad4c014d5fae34170002', 'Chrome', '閿欒寮傚父: NullPointerException,閿欒鎻忚堪锛歯ull', '6', '192.168.255.237', '2015-05-17 10:22:41', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40287f6d4d60dd20014d60de6cbd0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.255.237', '2015-05-17 15:54:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40287f6d4d60dd20014d60df0e5c0001', 'Chrome', '閿欒寮傚父: NullPointerException,閿欒鎻忚堪锛歯ull', '6', '192.168.255.237', '2015-05-17 15:55:40', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40287f6d4d60dd20014d60df26470002', 'Chrome', '閿欒寮傚父: NullPointerException,閿欒鎻忚堪锛歯ull', '6', '192.168.255.237', '2015-05-17 15:55:46', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40287f6d4d60dd20014d60df326a0003', 'Chrome', '閿欒寮傚父: NullPointerException,閿欒鎻忚堪锛歯ull', '6', '192.168.255.237', '2015-05-17 15:55:49', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884883eff40148840fdf2f001a', 'Firefox', '鍒涘缓鎴愬姛', '3', '192.168.0.8', '2014-09-17 22:41:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884883eff40148841404af0026', 'Firefox', '鍒涘缓鎴愬姛', '3', '192.168.0.8', '2014-09-17 22:46:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884883eff401488415cbeb0028', 'Firefox', '绫诲瀷鍒嗙粍: ?妯℃澘绫诲瀷琚坊鍔犳垚鍔', '3', '192.168.0.8', '2014-09-17 22:48:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884883eff4014884180c34002a', 'Firefox', '绫诲瀷: ?钄疯枃涓冩潙琚坊鍔犳垚鍔', '3', '192.168.0.8', '2014-09-17 22:50:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884883eff40148841981f9002b', 'Firefox', '淇敼鎴愬姛', '5', '192.168.0.8', '2014-09-17 22:52:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884883eff40148841a2179002c', 'Firefox', '淇敼鎴愬姛', '5', '192.168.0.8', '2014-09-17 22:52:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884883eff40148841bbb8a002d', 'Firefox', '淇敼鎴愬姛', '5', '192.168.0.8', '2014-09-17 22:54:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884883eff40148841cb461002e', 'Firefox', '淇敼鎴愬姛', '5', '192.168.0.8', '2014-09-17 22:55:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884883eff40148841fb2d4002f', 'Firefox', '淇敼鎴愬姛', '5', '192.168.0.8', '2014-09-17 22:59:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884883eff401488424f2ec003c', 'Firefox', '鍒涘缓鎴愬姛', '3', '192.168.0.8', '2014-09-17 23:04:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884883eff40148842589c5003d', 'Firefox', '鍒犻櫎鎴愬姛', '4', '192.168.0.8', '2014-09-17 23:05:25', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884884282001488428f7740000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-17 23:09:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848842c1f0148842cabc00000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-17 23:13:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848843ca90148843d314f0000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-17 23:31:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884884423801488442a3cc0000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-17 23:37:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884884488a01488448ec680000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-17 23:44:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848844fe2014884509e130000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-17 23:52:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848844fe2014884587b4d0010', 'Firefox', '鍒涘缓鎴愬姛', '3', '192.168.0.8', '2014-09-18 00:01:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f0148845d061d0000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-18 00:06:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f0148846122a80002', 'Firefox', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.0.8', '2014-09-18 00:10:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f014884614bcc0003', 'Firefox', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.8', '2014-09-18 00:10:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f01488461b3e30005', 'Firefox', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.0.8', '2014-09-18 00:11:08', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f0148846265c00007', 'Firefox', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.0.8', '2014-09-18 00:11:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f0148846298cf0008', 'Firefox', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.8', '2014-09-18 00:12:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f01488463aa64000a', 'Firefox', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.0.8', '2014-09-18 00:13:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f01488463ddde000b', 'Firefox', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.8', '2014-09-18 00:13:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f0148846494b4000d', 'Firefox', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.0.8', '2014-09-18 00:14:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f01488464e6780013', 'Firefox', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.8', '2014-09-18 00:14:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f014884650fce0014', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-18 00:14:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f01488465eff20015', 'Firefox', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.8', '2014-09-18 00:15:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f0148846614b20016', 'Firefox', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.8', '2014-09-18 00:15:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848845c0f014884663ced0017', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-18 00:16:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884884705901488470cb480000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-18 00:27:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40288088488473420148847455580000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-18 00:31:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884884734201488474b4110002', 'Firefox', 'JeecgDemo渚嬪瓙: dsafsd琚坊鍔犳垚鍔', '3', '192.168.0.8', '2014-09-18 00:31:53', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40288088488479350148847a20b80000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-18 00:37:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848847e310148847e977f0000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-18 00:42:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880884884877901488487ed3b0000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-18 00:52:53', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848848c580148848cbb030000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.8', '2014-09-18 00:58:08', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848848c580148848cf27b0002', 'Firefox', '涓氬姟SQL琛ㄦ坊鍔犳垚鍔', '3', '192.168.0.8', '2014-09-18 00:58:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028808848848c580148848d335b0004', 'Firefox', '娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄦ坊鍔犳垚鍔', '3', '192.168.0.8', '2014-09-18 00:58:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e99cf10147e99f33660000', 'Chrome', 'User: admin[淇℃伅閮╙?common.login.success', '1', '192.168.0.100', '2014-08-18 22:57:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e99cf10147e99f599e0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.100', '2014-08-18 22:57:20', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e99cf10147e99f7c440002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙?common.login.success', '1', '192.168.0.100', '2014-08-18 22:57:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e99cf10147e9a03b740004', 'Chrome', '缁勭粐鏈烘瀯 褰曞叆鎴愬姛', '3', '192.168.0.100', '2014-08-18 22:58:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e99cf10147e9a7281b0005', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙?common.login.success', '1', '192.168.0.100', '2014-08-18 23:05:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9a9570147e9ab16a30000', 'Chrome', 'User: admin[淇℃伅閮╙?common.login.success', '1', '192.168.0.100', '2014-08-18 23:10:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9a9570147e9ab59310001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.100', '2014-08-18 23:10:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9a9570147e9ab951e0002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙?common.login.success', '1', '192.168.0.100', '2014-08-18 23:10:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9a9570147e9b677850004', 'Chrome', '缁勭粐鏈烘瀯 褰曞叆鎴愬姛', '3', '192.168.0.100', '2014-08-18 23:22:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9a9570147e9b6a3fb0006', 'Chrome', '缁勭粐鏈烘瀯 褰曞叆鎴愬姛', '3', '192.168.0.100', '2014-08-18 23:22:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9a9570147e9b711290008', 'Chrome', '缁勭粐鏈烘瀯 褰曞叆鎴愬姛', '3', '192.168.0.100', '2014-08-18 23:23:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9a9570147e9b76329000a', 'Chrome', '缁勭粐鏈烘瀯 褰曞叆鎴愬姛', '3', '192.168.0.100', '2014-08-18 23:23:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9bb0cd70000', 'Chrome', 'User: admin[淇℃伅閮╙?common.login.success', '1', '192.168.0.100', '2014-08-18 23:27:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9bb69010002', 'Chrome', 'Org add success', '3', '192.168.0.100', '2014-08-18 23:27:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9be3a8a0004', 'Chrome', 'Language add success', '3', '192.168.0.100', '2014-08-18 23:31:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9bf19b00005', 'Chrome', 'Language update success', '5', '192.168.0.100', '2014-08-18 23:32:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9bf9efd0007', 'Chrome', 'Language add success', '3', '192.168.0.100', '2014-08-18 23:32:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c1acd60009', 'Chrome', 'Language add success', '3', '192.168.0.100', '2014-08-18 23:34:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c25c08000b', 'Chrome', 'Language add success', '3', '192.168.0.100', '2014-08-18 23:35:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c30863000c', 'Chrome', 'Org delete success', '4', '192.168.0.100', '2014-08-18 23:36:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c3756a000d', 'Chrome', 'Org update success', '5', '192.168.0.100', '2014-08-18 23:36:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c3a555000e', 'Chrome', 'Org update success', '5', '192.168.0.100', '2014-08-18 23:36:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c3df0c000f', 'Chrome', 'Org update success', '5', '192.168.0.100', '2014-08-18 23:37:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c415150011', 'Chrome', 'Org add success', '3', '192.168.0.100', '2014-08-18 23:37:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c438c60012', 'Chrome', 'Org delete success', '4', '192.168.0.100', '2014-08-18 23:37:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c53b7d0014', 'Chrome', 'Org add success', '3', '192.168.0.100', '2014-08-18 23:38:42', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c6bf1a0015', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.100', '2014-08-18 23:40:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c6d9cc0016', 'Chrome', 'User: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.100', '2014-08-18 23:40:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c6f0ef0017', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.100', '2014-08-18 23:40:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c713430018', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.100', '2014-08-18 23:40:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c814d10019', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.100', '2014-08-18 23:41:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e447e9ba550147e9c83caf001a', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.100', '2014-08-18 23:41:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e547fed2d00147fed35e2f0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.101', '2014-08-23 01:46:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e547fed2d00147fed558bc0001', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.101', '2014-08-23 01:48:20', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e547fed2d00147fed57d9f0002', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.101', '2014-08-23 01:48:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e547fed2d00147fed6adaf0003', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.101', '2014-08-23 01:49:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e547fed2d00147fed6d4120004', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.101', '2014-08-23 01:49:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e547fed2d00147fed6fbbe0005', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.101', '2014-08-23 01:50:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e54800bb54014800bbbf440000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.101', '2014-08-23 10:39:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e5480194170148019504dd0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.101', '2014-08-23 14:36:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e54808cbaa014808cd5ae20000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.101', '2014-08-25 00:15:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e64768980901476898ad530000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.0.102', '2014-07-24 21:39:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481501eb0148150253920000', 'Chrome', '鐢ㄦ埛: admin[浜哄姏璧勬簮閮╙?common.login.success', '1', '192.168.0.102', '2014-08-27 09:09:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481501eb01481503ead30001', 'Chrome', '鐢ㄦ埛: admin[浜哄姏璧勬簮閮╙?common.login.success', '1', '192.168.0.102', '2014-08-27 09:10:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481cbdc101481cbe3fb90000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.102', '2014-08-28 21:11:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d4987de0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.102', '2014-08-28 23:43:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d4bed940002', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.102', '2014-08-28 23:46:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d4c76710003', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.102', '2014-08-28 23:47:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d4ced920004', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.102', '2014-08-28 23:47:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d4d0e370005', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.0.102', '2014-08-28 23:47:42', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d4dae580006', 'Chrome', '鐢ㄦ埛scott宸查鍑', '2', '192.168.0.102', '2014-08-28 23:48:23', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d4dd7ec0007', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.0.102', '2014-08-28 23:48:33', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d4f5f160008', 'Chrome', '鐢ㄦ埛scott宸查鍑', '2', '192.168.0.102', '2014-08-28 23:50:14', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d4f86310009', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.102', '2014-08-28 23:50:24', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d4f9680000a', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.102', '2014-08-28 23:50:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d4fbb90000b', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.0.102', '2014-08-28 23:50:37', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d539f76000d', 'Chrome', '鎿嶄綔 褰曞叆鎴愬姛', '3', '192.168.0.102', '2014-08-28 23:54:52', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d544358000e', 'Chrome', '鐢ㄦ埛scott宸查鍑', '2', '192.168.0.102', '2014-08-28 23:55:34', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d54cdfb000f', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.0.102', '2014-08-28 23:56:10', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5636060010', 'Chrome', '鐢ㄦ埛scott宸查鍑', '2', '192.168.0.102', '2014-08-28 23:57:42', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d565a5a0011', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.102', '2014-08-28 23:57:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d597c0b0012', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.102', '2014-08-29 00:01:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d59a49b0013', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.0.102', '2014-08-29 00:01:27', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d59e20d0014', 'Chrome', 'JeecgDemo渚嬪瓙: 1221琚垹闄 鎴愬姛', '4', '192.168.0.102', '2014-08-29 00:01:42', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5a24ef0015', 'Chrome', '鐢ㄦ埛scott宸查鍑', '2', '192.168.0.102', '2014-08-29 00:02:00', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5a5daf0016', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.102', '2014-08-29 00:02:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5a9e790017', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.102', '2014-08-29 00:02:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5aea830018', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.0.102', '2014-08-29 00:02:50', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5b74fb0019', 'Chrome', '鐢ㄦ埛scott宸查鍑', '2', '192.168.0.102', '2014-08-29 00:03:26', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5b92c9001a', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.102', '2014-08-29 00:03:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5ba027001b', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.102', '2014-08-29 00:03:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5bc725001c', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.0.102', '2014-08-29 00:03:47', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5c4269001d', 'Chrome', '鎿嶄綔 鏇存柊鎴愬姛', '5', '192.168.0.102', '2014-08-29 00:04:18', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5c4f20001e', 'Chrome', '鐢ㄦ埛scott宸查鍑', '2', '192.168.0.102', '2014-08-29 00:04:21', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5c7106001f', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.102', '2014-08-29 00:04:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5c7b970020', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.102', '2014-08-29 00:04:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6481d48cb01481d5c9b4b0021', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.0.102', '2014-08-29 00:04:41', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e64827560c01482756928e0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.102', '2014-08-30 22:34:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6487e661a01487e68a2610000', 'Chrome', '鐢ㄦ埛: admin[浜哄姏璧勬簮閮╙?common.login.success', '1', '192.168.0.102', '2014-09-16 20:20:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6487e661a01487e6b508f0002', 'Chrome', '缁勭粐鏈烘瀯 褰曞叆鎴愬姛', '3', '192.168.0.102', '2014-09-16 20:23:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6487e661a01487e6b880b0003', 'Chrome', '缁勭粐鏈烘瀯 鏇存柊鎴愬姛', '5', '192.168.0.102', '2014-09-16 20:24:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6487e661a01487e6ba7130004', 'Chrome', '缁勭粐鏈烘瀯 鏇存柊鎴愬姛', '5', '192.168.0.102', '2014-09-16 20:24:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6487e661a01487e732c360006', 'Chrome', '鎿嶄綔 褰曞叆鎴愬姛', '3', '192.168.0.102', '2014-09-16 20:32:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e6487e661a01487e8154310008', 'Chrome', '鎿嶄綔 褰曞叆鎴愬姛', '3', '192.168.0.102', '2014-09-16 20:47:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c2818e4014c28198fb50000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-17 22:18:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c282787014c282842350000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-17 22:34:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c282787014c282c5e1d0003', 'Chrome', 'JeecgDemo渚嬪瓙: 2琚坊鍔犳垚鍔', '3', '192.168.0.103', '2015-03-17 22:38:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c282787014c282c73340004', 'Chrome', 'JeecgDemo渚嬪瓙: null琚洿鏂版垚鍔', '5', '192.168.0.103', '2015-03-17 22:39:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c282787014c282c7fcd0005', 'Chrome', 'JeecgDemo渚嬪瓙: 2琚垹闄 鎴愬姛', '4', '192.168.0.103', '2015-03-17 22:39:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c2aeef5014c2aefd6560000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-18 11:31:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c2afc4f014c2afcef800000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-18 11:46:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c34def0014c34df7b100000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-20 09:50:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c34def0014c34e290c80001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-20 09:53:25', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c34e36e014c34e416eb0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-20 09:55:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c34e36e014c352131bf0001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-20 11:01:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c4c0057014c4c020f170000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-24 21:39:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c4c0057014c4c02a3250001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-24 21:39:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c4c0544014c4c05972c0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-24 21:42:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c4c0544014c4c060d760001', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-24 21:43:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c5e6c90014c5e6dcbed0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 11:29:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c5e709b014c5e71dcae0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 11:34:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c5e709b014c5e72f8460001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 11:35:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c5e73f5014c5e7ed5100000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 11:48:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c5e73f5014c5e8054d00002', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-03-28 11:50:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c5e73f5014c5e80a0ee0004', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-03-28 11:50:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c5e73f5014c5e80d5660005', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-03-28 11:50:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c5e73f5014c5e80fe6e0006', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 11:50:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c5e8219014c5e84bb670000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 11:54:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c5e8219014c5e8a1af20001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 12:00:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c60546f014c605570d80000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 20:22:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c60690a014c6069afaa0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 20:44:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c60690a014c6077c9430002', 'Chrome', '鍒嗙被绠$悊娣诲姞鎴愬姛', '3', '192.168.0.103', '2015-03-28 21:00:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c60690a014c6077e0fe0004', 'Chrome', '鍒嗙被绠$悊娣诲姞鎴愬姛', '3', '192.168.0.103', '2015-03-28 21:00:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c60690a014c607800700005', 'Chrome', '鍒嗙被绠$悊鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-03-28 21:00:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c607e94014c607f1c470000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 21:08:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c607e94014c607f5dc50001', 'Chrome', '绉婚櫎鎴愬姛', '4', '192.168.0.103', '2015-03-28 21:08:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c607e94014c607f697f0002', 'Chrome', '绉婚櫎鎴愬姛', '4', '192.168.0.103', '2015-03-28 21:08:25', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c607e94014c607f73950003', 'Chrome', '绉婚櫎鎴愬姛', '4', '192.168.0.103', '2015-03-28 21:08:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c607e94014c607f7f0b0004', 'Chrome', '绉婚櫎鎴愬姛', '4', '192.168.0.103', '2015-03-28 21:08:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c6084c9014c608549d10000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 21:14:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c6084c9014c608b0b2b0001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 21:21:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c6084c9014c609276960003', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-03-28 21:29:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c6084c9014c60929de90005', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-03-28 21:29:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c6084c9014c6093738d0007', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-03-28 21:30:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c60a463014c60a5182c0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-28 21:49:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c6492be014c64938f900000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-03-29 16:08:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c732815014c7329ccf80000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-01 12:07:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7829fa014c782a99ba0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 11:26:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c783db3014c783ef6810000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 11:48:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c783db3014c783ff8cc0002', 'Chrome', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-04-02 11:50:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c783db3014c78404a190004', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-04-02 11:50:21', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c783db3014c784069560005', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 11:50:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c783db3014c784108290006', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-04-02 11:51:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c783db3014c784127a30007', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 11:51:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7841e5014c78424f8b0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 11:52:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7841e5014c78433ea70001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-04-02 11:53:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7841e5014c78435bb60002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 11:53:42', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79dd47014c79ddd1c00000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 19:22:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79dd47014c79de89440002', 'Chrome', '瀹氭椂浠诲姟绠$悊娣诲姞鎴愬姛', '3', '192.168.0.103', '2015-04-02 19:22:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79dd47014c79e02b0e0003', 'Chrome', '璇█鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-04-02 19:24:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79dd47014c79e14e5d0004', 'Chrome', '璇█鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-04-02 19:25:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79dd47014c79e15a1e0005', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-04-02 19:25:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79e221014c79e29a830000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 19:27:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79eb63014c79ebed510000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 19:37:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79eb63014c79ec14d50001', 'Chrome', '寮鍚换鍔askDemoServiceTaskCronTrigger', '5', '192.168.0.103', '2015-04-02 19:37:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79eb63014c79ec255d0002', 'Chrome', '鍋滄浠诲姟taskDemoServiceTaskCronTrigger', '5', '192.168.0.103', '2015-04-02 19:37:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79eb63014c79ec2edf0003', 'Chrome', '寮鍚换鍔askDemoServiceTaskCronTrigger', '5', '192.168.0.103', '2015-04-02 19:37:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79eb63014c79ec47770004', 'Chrome', '瀹氭椂浠诲姟绠$悊鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 19:37:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79f5cb014c79f678e50000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 19:48:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79f5cb014c79f72c740001', 'Chrome', '鍋滄浠诲姟taskDemoServiceTaskCronTrigger', '5', '192.168.0.103', '2015-04-02 19:49:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79f5cb014c79fac66f0002', 'Chrome', '鍋滄浠诲姟smsSendTaskCronTrigger', '5', '192.168.0.103', '2015-04-02 19:53:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c79f5cb014c79fada660003', 'Chrome', '寮鍚换鍔msSendTaskCronTrigger', '5', '192.168.0.103', '2015-04-02 19:53:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a02a5014c7a032dda0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 20:02:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a02a5014c7a03582b0001', 'Chrome', '鍋滄浠诲姟smsSendTaskCronTrigger', '5', '192.168.0.103', '2015-04-02 20:03:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a02a5014c7a05a9830002', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 20:05:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a02a5014c7a05d5700003', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 20:05:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a02a5014c7a0638640004', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 20:06:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a0c5f014c7a0d2c170000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 20:13:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a0c5f014c7a0f04790001', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 20:15:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a0c5f014c7a101b9d0002', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 20:16:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a7864b20000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 22:10:52', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a79d7020001', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:12:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a7c35da0002', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:15:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a7ce33e0003', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:15:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a8121dc0005', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-04-02 22:20:25', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a817d1a0007', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-04-02 22:20:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a825bed0008', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:21:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a8294ed0009', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:22:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a85eca2000a', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:25:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a863061000b', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:25:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a88ac27000c', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:28:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a8a1049000d', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:30:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a8a6bc3000e', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:30:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a8aac2d000f', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:30:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a8c8e2f0011', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-04-02 22:32:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a8cb65b0013', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-04-02 22:33:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a8d97b50014', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:34:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a8daa680015', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:34:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7a776c014c7a8e4dac0016', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 22:34:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7aab8d014c7aac1cf40000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 23:07:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7aab8d014c7aac65960002', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-04-02 23:07:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7aab8d014c7aac83820003', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 23:07:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7aab8d014c7aaeee200004', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 23:10:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7aab8d014c7aaf08300005', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 23:10:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7ab977014c7ab9f5490000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 23:22:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7ab977014c7abe12f40001', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 23:26:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7ab977014c7abe32a80002', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 23:27:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7ab977014c7abe772d0003', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-02 23:27:24', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7ab977014c7ac171d20004', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-04-02 23:30:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7ab977014c7ac193b40005', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-02 23:30:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c7eb991014c7eba22010000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-03 18:01:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c97593d014c975a3c040000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-08 12:46:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c976554014c9765cecd0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-08 12:59:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74c976554014c976691e70001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-08 13:00:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cc0b0fc014cc0b192be0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-16 13:26:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cf0d5e5014cf0d6665b0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-25 21:48:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cf0d5e5014cf10f9d160001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-25 22:51:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cf11474014cf115021b0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-25 22:57:08', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cfa77e4014cfa78fa830000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-27 18:42:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cfa77e4014cfa793de80001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-04-27 18:43:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cfa77e4014cfa795bcc0002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-27 18:43:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cfa77e4014cfa79a77b0007', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-04-27 18:43:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cfa77e4014cfa79e0b20008', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-27 18:43:53', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cfa77e4014cfa7a627c000c', 'Chrome', '鐢ㄦ埛: scott鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-04-27 18:44:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cfa77e4014cfa7a6e00000d', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-04-27 18:44:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cfa77e4014cfa7a996c000e', 'Chrome', '鐢ㄦ埛: scott[閿鍞粡鐞哴?common.login.success', '1', '192.168.0.103', '2015-04-27 18:44:40', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e74cff0228014cff0522e50000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-28 15:54:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74cff668c014cff6875570000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-04-28 17:42:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d0f0203014d0f0273a60000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-05-01 18:25:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d47e0a6014d47e10fa50000', 'Chrome', '閿欒寮傚父: NullPointerException,閿欒鎻忚堪锛歯ull', '6', '192.168.0.103', '2015-05-12 19:27:21', '3', null); +INSERT INTO `t_s_log` VALUES ('402880e74d47e0a6014d47e2358a0001', 'Chrome', '閿欒寮傚父: NullPointerException,閿欒鎻忚堪锛歯ull', '6', '192.168.0.103', '2015-05-12 19:28:36', '3', null); +INSERT INTO `t_s_log` VALUES ('402880e74d47e291014d47e324410000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-05-12 19:29:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d4aeb47014d4aec0ad70000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.103', '2015-05-13 09:38:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d4b02cd014d4b037ba70000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-13 10:03:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d4b0a4e014d4b0b37ed0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-13 10:12:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d4d6ebc014d4d6f55910000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-13 21:20:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d4d716c014d4d71e2770000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-13 21:23:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d51a0c7014d51a15a4e0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-14 16:53:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d51a0c7014d51a188650001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-14 16:54:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d51a0c7014d51a1abe30002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-14 16:54:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d51a0c7014d51a1cdad0003', 'Chrome', '閿欒寮傚父: MySQLSyntaxErrorException,閿欒鎻忚堪锛歎nknown column \'this_.EDITOR_TYPE\' in \'field list\'', '6', '192.168.0.103', '2015-05-14 16:54:28', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d51a0c7014d51a25a3a0005', 'Chrome', '閿欒寮傚父: MySQLSyntaxErrorException,閿欒鎻忚堪锛歎nknown column \'EDITOR_TYPE\' in \'field list\'', '6', '192.168.0.103', '2015-05-14 16:55:03', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d51a0c7014d51a25b3e0006', 'Chrome', '閿欒寮傚父: MySQLSyntaxErrorException,閿欒鎻忚堪锛歎nknown column \'this_.EDITOR_TYPE\' in \'field list\'', '6', '192.168.0.103', '2015-05-14 16:55:04', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d529e4c014d529fb8900000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-14 21:31:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d529e4c014d52a5d3520001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-14 21:38:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d529e4c014d52ab07c20002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-14 21:44:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d529e4c014d52b0e4cb0003', 'Chrome', '閿欒寮傚父: NullPointerException,閿欒鎻忚堪锛歯ull', '6', '192.168.0.103', '2015-05-14 21:50:34', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d529e4c014d52c0e83a0005', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-14 22:08:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d529e4c014d52c44b850006', 'Chrome', '绫诲瀷鍒嗙粍: 妯℃澘绫诲瀷琚洿鏂版垚鍔', '5', '192.168.0.103', '2015-05-14 22:11:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d55c2da014d55c37cfb0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-15 12:09:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d55c2da014d55c461090001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-15 12:10:42', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d55c2da014d561481c50002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-15 13:38:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d55c2da014d5614ec9a0004', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-15 13:38:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d55c2da014d5614f4370005', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-15 13:38:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d55c2da014d5614f9d90006', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-15 13:38:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d566c63014d566d24810000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-15 15:15:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d566c63014d567550110007', 'Chrome', 'Demo: 33333999琚垹闄 鎴愬姛', '4', '192.168.0.103', '2015-05-15 15:23:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d566c63014d56755f130008', 'Chrome', 'Demo: 123123琚垹闄 鎴愬姛', '4', '192.168.0.103', '2015-05-15 15:24:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d566c63014d56756caf0009', 'Chrome', 'Demo: 123123琚垹闄 鎴愬姛', '4', '192.168.0.103', '2015-05-15 15:24:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d566c63014d567573d6000a', 'Chrome', 'Demo: 44琚垹闄 鎴愬姛', '4', '192.168.0.103', '2015-05-15 15:24:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d582251014d582303240000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-15 23:13:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d7589ab014d758ab5500000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 16:15:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d7589ab014d758b2b270001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 16:16:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d758b90014d758c0b7f0000', 'Chrome', '鐢ㄦ埛: admin[浜哄姏璧勬簮閮╙common.login.success', '1', '192.168.0.103', '2015-05-21 16:17:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75abd1014d75ac3daf0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 16:52:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75abd1014d75ac6de50001', 'Chrome', '閿欒寮傚父: RuntimeException,閿欒鎻忚堪锛氳В鏋怱QL妯℃澘寮傚父', '6', '192.168.0.103', '2015-05-21 16:52:24', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75abd1014d75ac827c0003', 'Chrome', 'Minidao渚嬪瓙娣诲姞鎴愬姛', '3', '192.168.0.103', '2015-05-21 16:52:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75abd1014d75ac83440004', 'Chrome', '閿欒寮傚父: RuntimeException,閿欒鎻忚堪锛氳В鏋怱QL妯℃澘寮傚父', '6', '192.168.0.103', '2015-05-21 16:52:29', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75abd1014d75ac8af40005', 'Chrome', '閿欒寮傚父: RuntimeException,閿欒鎻忚堪锛氳В鏋怱QL妯℃澘寮傚父', '6', '192.168.0.103', '2015-05-21 16:52:31', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75abd1014d75b096690006', 'Chrome', '閿欒寮傚父: RuntimeException,閿欒鎻忚堪锛氳В鏋怱QL妯℃澘寮傚父', '6', '192.168.0.103', '2015-05-21 16:56:56', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75c4dd014d75c581050000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 17:19:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75c4dd014d75d3c6380002', 'Chrome', '瑙掕壊: demo琚坊鍔犳垚鍔', '3', '192.168.0.103', '2015-05-21 17:35:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75c4dd014d75d44ba70008', 'Chrome', '鐢ㄦ埛: demo娣诲姞鎴愬姛', '3', '192.168.0.103', '2015-05-21 17:35:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75c4dd014d75d45a9f0009', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 17:36:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75c4dd014d75d4d8cc000a', 'Chrome', '鐢ㄦ埛: demo[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 17:36:32', '1', '402880e74d75c4dd014d75d44af30005'); +INSERT INTO `t_s_log` VALUES ('402880e74d75fdf4014d75fe6a9f0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 18:21:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75fdf4014d75fee2390001', 'Chrome', '閿欒寮傚父: RuntimeException,閿欒鎻忚堪锛氳В鏋怱QL妯℃澘寮傚父', '6', '192.168.0.103', '2015-05-21 18:22:27', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75fdf4014d75fef94e0003', 'Chrome', 'Minidao渚嬪瓙娣诲姞鎴愬姛', '3', '192.168.0.103', '2015-05-21 18:22:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75fdf4014d75fef9eb0004', 'Chrome', '閿欒寮傚父: RuntimeException,閿欒鎻忚堪锛氳В鏋怱QL妯℃澘寮傚父', '6', '192.168.0.103', '2015-05-21 18:22:33', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75fdf4014d75ff3ce30005', 'Chrome', '閿欒寮傚父: RuntimeException,閿欒鎻忚堪锛氳В鏋怱QL妯℃澘寮傚父', '6', '192.168.0.103', '2015-05-21 18:22:51', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75fdf4014d7600cf8a0006', 'Chrome', '閿欒寮傚父: RuntimeException,閿欒鎻忚堪锛氳В鏋怱QL妯℃澘寮傚父', '6', '192.168.0.103', '2015-05-21 18:24:34', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75fdf4014d7601a0c20007', 'Chrome', '閿欒寮傚父: RuntimeException,閿欒鎻忚堪锛氳В鏋怱QL妯℃澘寮傚父', '6', '192.168.0.103', '2015-05-21 18:25:27', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d75fdf4014d760365fa0008', 'Chrome', '閿欒寮傚父: RuntimeException,閿欒鎻忚堪锛氳В鏋怱QL妯℃澘寮傚父', '6', '192.168.0.103', '2015-05-21 18:27:23', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d760a60014d760ad2990000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 18:35:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d760a60014d760b8f540001', 'Chrome', 'Minidao渚嬪瓙鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-21 18:36:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76196f014d761a092e0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 18:52:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76196f014d761b35c80001', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 18:53:24', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76196f014d761e54330002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 18:56:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76196f014d761e62620003', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 18:56:52', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762069014d7620e6070000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 18:59:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762069014d762105d20001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 18:59:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762069014d76218ce70002', 'Chrome', 'User: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 19:00:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762069014d7621c5250003', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 19:00:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762069014d76220d050004', 'Chrome', 'User: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 19:00:52', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d7622a8014d76230f320000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 19:01:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d7622a8014d76231db10001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 19:02:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d7622a8014d762346a80002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 19:02:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762421014d762500a30000', 'Chrome', 'User: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 19:04:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d762eaaf60000', 'Chrome', 'User: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 19:14:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d763073e60001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 19:16:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d763094380002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 19:16:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d76332b890004', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-05-21 19:19:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d7633a3700006', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-05-21 19:20:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d76342ef40008', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-05-21 19:20:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d76348de6000a', 'Chrome', '璇█ 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-05-21 19:21:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d76369ec1000b', 'Chrome', '閿欒寮傚父: QueryException,閿欒鎻忚堪锛歝ould not resolve property: tsDepart of: org.jeecgframework.web.system.pojo.base.TSUser', '6', '192.168.0.103', '2015-05-21 19:23:20', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d7636a3e1000c', 'Chrome', '閿欒寮傚父: QueryException,閿欒鎻忚堪锛歝ould not resolve property: tsDepart of: org.jeecgframework.web.system.pojo.base.TSUser', '6', '192.168.0.103', '2015-05-21 19:23:21', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d7636a6b3000d', 'Chrome', '閿欒寮傚父: QueryException,閿欒鎻忚堪锛歝ould not resolve property: tsDepart of: org.jeecgframework.web.system.pojo.base.TSUser', '6', '192.168.0.103', '2015-05-21 19:23:22', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d7636aa02000e', 'Chrome', '閿欒寮傚父: QueryException,閿欒鎻忚堪锛歝ould not resolve property: tsDepart of: org.jeecgframework.web.system.pojo.base.TSUser', '6', '192.168.0.103', '2015-05-21 19:23:23', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d7636ac39000f', 'Chrome', '閿欒寮傚父: QueryException,閿欒鎻忚堪锛歝ould not resolve property: tsDepart of: org.jeecgframework.web.system.pojo.base.TSUser', '6', '192.168.0.103', '2015-05-21 19:23:24', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d763a25a60010', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 19:27:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d762a40014d763a44650011', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 19:27:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76de8b014d76df67700000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 22:27:42', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76de8b014d76df785e0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 22:27:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76de8b014d76dfa9c80002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 22:27:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76de8b014d76e1ff3d0003', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:30:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76de8b014d76e21def0004', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:30:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76de8b014d76e630ea0005', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:35:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76de8b014d76e651880006', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:35:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76de8b014d76e687d50007', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:35:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76de8b014d76e6b1fc0008', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:35:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76de8b014d76e6ce890009', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:35:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76de8b014d76e6ee2b000a', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:35:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76e9fbeb0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 22:39:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76eaff960001', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:40:21', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76eb18d90002', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:40:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76eb3d630003', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:40:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76ec0a4a0004', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:41:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76ec379b0005', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:41:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76ec5f390006', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:41:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76ec7f790007', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:42:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76ec9b700008', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:42:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76ecb5310009', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 22:42:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76ecd718000a', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 22:42:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76ed6ef7000b', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:43:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76ed83b2000c', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:43:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76eda1e9000d', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:43:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76edbb3c000e', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:43:21', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76edd329000f', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:43:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76eddd6c0010', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 22:43:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76efbdb30011', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 22:45:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76f5509e0013', 'Chrome', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-05-21 22:51:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76f5cd5c0015', 'Chrome', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-05-21 22:52:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76f65a710018', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 22:52:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76f6a1ff0019', 'Chrome', '鐢ㄦ埛: demo[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 22:53:04', '1', '402880e74d75c4dd014d75d44af30005'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76f6bed5001a', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-21 22:53:11', '1', '402880e74d75c4dd014d75d44af30005'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76f6eab1001b', 'Chrome', '鐢ㄦ埛demo宸查鍑', '2', '192.168.0.103', '2015-05-21 22:53:22', '1', '402880e74d75c4dd014d75d44af30005'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76f7395e001c', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 22:53:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76f77078001d', 'Chrome', '鐢ㄦ埛: demo瀵嗙爜閲嶇疆鎴愬姛', '5', '192.168.0.103', '2015-05-21 22:53:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76f9e7cb0021', 'Chrome', '娣诲姞鎴愬姛', '3', '192.168.0.103', '2015-05-21 22:56:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fa7edc0025', 'Chrome', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-05-21 22:57:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76faa44a0027', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 22:57:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fae52e0028', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 22:57:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fafb330029', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 22:57:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fb1fb6002a', 'Chrome', '鐢ㄦ埛: demo[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 22:57:58', '1', '402880e74d75c4dd014d75d44af30005'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fb48ec002b', 'Chrome', '鐢ㄦ埛demo宸查鍑', '2', '192.168.0.103', '2015-05-21 22:58:09', '1', '402880e74d75c4dd014d75d44af30005'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fbb094002c', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 22:58:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fc0273002e', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 22:58:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fc5441002f', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 22:59:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fd1c1b0031', 'Chrome', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-05-21 23:00:08', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fd4a080034', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 23:00:20', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fd709d0035', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 23:00:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fdf89e0036', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-21 23:01:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fe017b0037', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-21 23:01:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d76e784014d76fe209e0038', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-21 23:01:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d7704cb014d770529c00000', 'Firefox', '鐢ㄦ埛: admin[浜哄姏璧勬簮閮╙common.login.success', '1', '192.168.0.103', '2015-05-21 23:08:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d79afd4014d79b08d5c0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-22 11:35:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d79afd4014d79b2635c0001', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-22 11:37:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d79afd4014d79b42c8d0002', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-22 11:39:20', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d79b6db014d79b7829c0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-22 11:42:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d79b6db014d79c642a40001', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-22 11:59:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d79d202014d79d27cfb0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-22 12:12:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d7b04cb014d7b0535ea0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-22 17:47:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d7fb3be014d7fb42b5d0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-23 15:37:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d845cd3014d845d7ad00000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-24 13:20:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d88e3ef014d88e753720000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-25 10:29:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d89cb70014d89cbe9d50000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-25 14:39:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d89cb70014d89cd37530001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-25 14:40:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d89cb70014d89cd9eeb0002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-25 14:41:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d89cb70014d89ce00240006', 'Chrome', '鐢ㄦ埛: scott鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-25 14:41:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d89cb70014d89ce141a0007', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-25 14:41:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d89cb70014d89ce342d0008', 'Chrome', '鐢ㄦ埛: scott[閿鍞粡鐞哴common.login.success', '1', '192.168.0.103', '2015-05-25 14:41:41', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402880e74d8a50a8014d8a511fe30000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-25 17:04:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d8a50a8014d8a5622be0001', 'Chrome', '鐢ㄦ埛锛歞emo閿佸畾鎴愬姛!', '5', '192.168.0.103', '2015-05-25 17:10:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d8a50a8014d8a562e550002', 'Chrome', '鐢ㄦ埛锛歞emo婵娲绘垚鍔!', '5', '192.168.0.103', '2015-05-25 17:10:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d8a50a8014d8a58e3b00003', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-25 17:13:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d8a8586014d8a868d880000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-25 18:03:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d8a8af9014d8a8d6b130000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-25 18:10:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d8a8f0e014d8a8f804c0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-25 18:12:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d8b9ef3014d8b9f8b320000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-25 23:09:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d90a2f4014d90a3c1960000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-26 22:32:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d90a2f4014d90a538780002', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-26 22:34:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d932aeb014d932c402d0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-27 10:21:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d932aeb014d932c7c8f0001', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-27 10:21:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d932aeb014d932d2c990004', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-27 10:22:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d932aeb014d933568ac0006', 'Chrome', '淇敼鎴愬姛', '5', '192.168.0.103', '2015-05-27 10:31:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d932aeb014d9335e9940007', 'Chrome', '淇敼鎴愬姛', '5', '192.168.0.103', '2015-05-27 10:31:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d932aeb014d9336d8060008', 'Chrome', '淇敼鎴愬姛', '5', '192.168.0.103', '2015-05-27 10:32:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d934e07014d934fcde10000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-27 10:59:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d934e07014d93502b150001', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-27 11:00:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d934e07014d9350318b0002', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-27 11:00:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d94e2a1014d94e41c4e0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-27 18:21:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d94e936014d94eaa5da0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-27 18:28:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d94e936014d94eb3f430002', 'Chrome', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.0.103', '2015-05-27 18:29:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d94e936014d94eb61330004', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-05-27 18:29:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d94e936014d94eb82d30005', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-27 18:29:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9a7b07014d9a7b68e70000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-28 20:24:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9a8469014d9a86402d0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-28 20:36:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9a8469014d9a86dd330001', 'Chrome', '鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-28 20:37:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9a8469014d9a86f6330002', 'Chrome', '鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-28 20:37:25', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9a8469014d9a8ae53f0004', 'Chrome', '鍒嗙被绠$悊娣诲姞鎴愬姛', '3', '192.168.0.103', '2015-05-28 20:41:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9a8469014d9a8b0f240005', 'Chrome', '鍒嗙被绠$悊鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-28 20:41:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9a8469014d9a8b2df70007', 'Chrome', '鍒嗙被绠$悊娣诲姞鎴愬姛', '3', '192.168.0.103', '2015-05-28 20:42:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9a8469014d9a93dd280008', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-28 20:51:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e3c0ed70000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-29 13:54:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e3dbec50001', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-05-29 13:55:56', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e3dc6940002', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-05-29 13:55:58', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e3dca1f0003', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-05-29 13:55:59', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e3dcba40004', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-05-29 13:55:59', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e3dcc5d0005', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-05-29 13:55:59', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e3dccfb0006', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-05-29 13:55:59', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e3dce420007', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-05-29 13:56:00', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e3dcfa10008', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-05-29 13:56:00', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e3dd6a50009', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-05-29 13:56:02', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e3e1917000a', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-29 13:56:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e41fd31000b', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-29 14:00:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e45b57b000c', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-05-29 14:04:38', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e45ba10000d', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-05-29 14:04:39', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e465446000e', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-29 14:05:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e482618000f', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-29 14:07:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e483a150010', 'Chrome', '閿欒寮傚父: NullPointerException,閿欒鎻忚堪锛歯ull', '6', '192.168.0.103', '2015-05-29 14:07:23', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e49234d0011', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-29 14:08:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e3b7f014d9e49fae00012', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-05-29 14:09:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9e8a99014d9e8ae9790000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-29 15:20:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9ea06b014d9ea0bb750000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-29 15:44:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74d9ea06b014d9ea0dd6b0001', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-05-29 15:44:12', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da32ebe014da32f640b0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-30 12:58:21', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da32ebe014da3309d3d000a', 'Chrome', '鍒涘缓鎴愬姛', '3', '192.168.0.103', '2015-05-30 12:59:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da349b0014da34a5c870000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-30 13:27:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da35336014da353d4550000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-30 13:38:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da35336014da3543d0c0001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-30 13:38:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da35336014da3555bf70003', 'Chrome', '淇敼鎴愬姛', '5', '192.168.0.103', '2015-05-30 13:39:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da35336014da3557b0b0004', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-30 13:39:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da35336014da35581820005', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-30 13:39:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da35336014da35587350006', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-30 13:40:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da35336014da3599c1b0007', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-30 13:44:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da35336014da35a34e00008', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-05-30 13:45:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da3969f014da397a0410000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-30 14:52:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da39b13014da39b80620000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-30 14:56:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da39b13014da39d6ee40006', 'Chrome', '娣诲姞鎴愬姛', '3', '192.168.0.103', '2015-05-30 14:58:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da7ce70014da7cf00080000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-31 10:31:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74da7d29e014da7d31e5e0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-05-31 10:35:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dacc595014dacc8853a0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-01 09:42:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dacc595014dacc97db90001', 'Chrome', '淇敼鎴愬姛', '5', '192.168.0.103', '2015-06-01 09:43:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dacc595014dacca58460002', 'Chrome', '淇敼鎴愬姛', '5', '192.168.0.103', '2015-06-01 09:44:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dafa102014dafa1a3080000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-01 22:58:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db502d1014db5037f730000', 'Chrome', 'User: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-03 00:03:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db502d1014db5040a650001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-06-03 00:04:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db502d1014db5042e240002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-03 00:04:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db8de11014db8dea2f20000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-03 18:01:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db8de11014db8e87d0f0001', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-06-03 18:12:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db8de11014db8ec117d0002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-03 18:16:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db8ed71014db8edb3f80000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-03 18:18:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db8ed71014db8ef3d400001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-06-03 18:19:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db8ed71014db8ef689b0002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-03 18:20:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db8ed71014db8f641bc0003', 'Chrome', '鑿滃崟鍒犻櫎鎴愬姛', '4', '192.168.0.103', '2015-06-03 18:27:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db9bbf2014db9bd211c0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-03 22:04:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db9bbf2014db9bef9200001', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-06-03 22:06:50', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db9bbf2014db9beff240002', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-06-03 22:06:51', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db9bbf2014db9bf17fb0003', 'Chrome', '閿欒寮傚父: LazyInitializationException,閿欒鎻忚堪锛歝ould not initialize proxy - no Session', '6', '192.168.0.103', '2015-06-03 22:06:58', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74db9bbf2014db9bf41520004', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-03 22:07:08', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dba1e84014dba1ffeb80000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-03 23:52:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dbc284b014dbc28b6c30000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-04 09:21:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dbc284b014dbc30337f0002', 'Chrome', '娑堟伅妯℃湰琛ㄦ坊鍔犳垚鍔', '3', '192.168.0.103', '2015-06-04 09:29:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dbc284b014dbc304dc40003', 'Chrome', '娑堟伅妯℃湰琛ㄥ垹闄ゆ垚鍔', '4', '192.168.0.103', '2015-06-04 09:29:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dbe5e10014dbe5e8a740000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-04 19:39:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dbee3ad014dbee4e36b0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-04 22:06:21', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dbee3ad014dbee54c540001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-04 22:06:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dbee3ad014dbee597180002', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-06-04 22:07:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dbee3ad014dbee5e9590003', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-04 22:07:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dbee3ad014dbee68f140005', 'Chrome', '瑙掕壊: 12琚坊鍔犳垚鍔', '3', '192.168.0.103', '2015-06-04 22:08:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dbee3ad014dbee6a6170006', 'Chrome', '瑙掕壊: 12琚垹闄ゆ垚鍔', '4', '192.168.0.103', '2015-06-04 22:08:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dbf2e74014dbf2f226d0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-04 23:27:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc15d03014dc15db9470000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 09:37:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc15d03014dc1654d8c0001', 'Chrome', '鍒嗙被绠$悊鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-06-05 09:45:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc15d03014dc16570820002', 'Chrome', '鍒嗙被绠$悊鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-06-05 09:46:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc15d03014dc16616530004', 'Chrome', '鍒嗙被绠$悊娣诲姞鎴愬姛', '3', '192.168.0.103', '2015-06-05 09:46:42', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc15d03014dc16624530005', 'Chrome', '鍒嗙被绠$悊鏇存柊鎴愬姛', '5', '192.168.0.103', '2015-06-05 09:46:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc15d03014dc1683b0b0007', 'Chrome', '閿欒寮傚父: MySQLIntegrityConstraintViolationException,閿欒鎻忚堪锛欴uplicate entry \'05\' for key 2', '6', '192.168.0.103', '2015-06-05 09:49:03', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc15d03014dc1685faf0009', 'Chrome', '閿欒寮傚父: MySQLIntegrityConstraintViolationException,閿欒鎻忚堪锛欴uplicate entry \'05\' for key 2', '6', '192.168.0.103', '2015-06-05 09:49:12', '3', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc1c808014dc1c87f190000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 11:34:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc1c808014dc1ce079e0001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 11:40:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc1e65e014dc1eefe6d0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 12:16:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc1e65e014dc1effaac000a', 'Chrome', '鍒涘缓鎴愬姛', '3', '192.168.0.103', '2015-06-05 12:17:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc1f791014dc1f805d00000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 12:26:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc22c30014dc22c95b00000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 13:23:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc22c30014dc233b85a0001', 'Chrome', '淇敼鎴愬姛', '5', '192.168.0.103', '2015-06-05 13:31:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc2ac66014dc2ad27090000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 15:43:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc2b325014dc2b4937b0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 15:52:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc2f361014dc2f3da4c0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 17:01:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc30568014dc305e38f0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 17:20:52', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc30568014dc306a4f00001', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 17:21:42', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc30568014dc3088fa40002', 'MSIE 8.0', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 17:23:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc30568014dc30eab140003', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 17:30:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc3573c014dc357adb60000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 18:50:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc3573c014dc3581de60001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-05 18:50:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc3573c014dc359310e0002', 'Chrome', '鐢ㄦ埛锛歞emo閿佸畾鎴愬姛!', '5', '192.168.0.103', '2015-06-05 18:51:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dc3573c014dc3593e6f0003', 'Chrome', '鐢ㄦ埛锛歞emo婵娲绘垚鍔!', '5', '192.168.0.103', '2015-06-05 18:51:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dcd668f014dcd688b3d0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-07 17:44:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dcd668f014dcd692abe0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.0.103', '2015-06-07 17:45:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e74dcd6bdd014dcd6c4b3d0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇common.login.success', '1', '192.168.0.103', '2015-06-07 17:48:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402880e84c45b3bb014c45b425c60000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.0.104', '2015-03-23 16:16:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728b9d7014728ba523e0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 12:00:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728c34c014728c3b37e0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 12:10:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728c599014728c604ec0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 12:12:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728d9b27e0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 12:34:21', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728da54e60001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.131', '2014-07-12 12:35:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728da6ca30002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 12:35:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728da8dd50003', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.131', '2014-07-12 12:35:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728daaf100004', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 12:35:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728dc0fef0006', 'Chrome', '澶氳瑷 褰曞叆鎴愬姛', '3', '192.168.1.131', '2014-07-12 12:36:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728dcc33b0008', 'Chrome', '澶氳瑷 褰曞叆鎴愬姛', '3', '192.168.1.131', '2014-07-12 12:37:42', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728dd2922000a', 'Chrome', '澶氳瑷 褰曞叆鎴愬姛', '3', '192.168.1.131', '2014-07-12 12:38:08', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728dd8174000c', 'Chrome', '澶氳瑷 褰曞叆鎴愬姛', '3', '192.168.1.131', '2014-07-12 12:38:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728dec4a1000d', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.131', '2014-07-12 12:39:53', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728dedc9b000e', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 12:39:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728df50790010', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 12:40:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728df9a700012', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 12:40:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728dfe56f0014', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 12:41:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728e0078a0016', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 12:41:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728e0f65c0018', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 12:42:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728d95a014728e11844001a', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 12:42:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728f3c8014728f465000000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 13:03:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014728fa7af50000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 13:10:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014728fb07a70001', 'Chrome', ' Languge Update Success', '5', '192.168.1.131', '2014-07-12 13:10:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014728fb9a410002', 'Chrome', ' Languge Update Success', '5', '192.168.1.131', '2014-07-12 13:11:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014728fd5f290004', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:13:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014728fd8a0f0006', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:13:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014728feca890008', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:14:52', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014728feee0a000a', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:15:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014728ff5a5f000c', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:15:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014728ff7e88000e', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:15:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa2801472900fe170010', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:17:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa2801472901dabf0012', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:18:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa280147290fada00014', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:33:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa280147290fcad00016', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:33:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa280147291004660018', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:33:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014729101a59001a', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:33:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa280147291059d8001c', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:34:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa2801472910777b001e', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:34:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa2801472910a6480020', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:34:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa2801472910bdde0022', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:34:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa280147291132600024', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:34:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa280147291152620026', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:35:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014729118cc70028', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:35:21', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa2801472911c712002a', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:35:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa2801472911ecd7002b', 'Chrome', ' Languge Update Success', '5', '192.168.1.131', '2014-07-12 13:35:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014729120686002c', 'Chrome', ' Languge Update Success', '5', '192.168.1.131', '2014-07-12 13:35:52', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa28014729125f26002e', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:36:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa2801472912838f0030', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:36:24', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa2801472912d1590032', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:36:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa2801472912e9cd0034', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:36:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa280147291414a90036', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:38:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa280147291480440038', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:38:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa2801472914b050003a', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:38:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034728fa2801472914ca13003c', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 13:38:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c730147292cb0af0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 14:05:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c730147292ec7060002', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:07:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c730147292edb280004', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:07:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c730147292f93890006', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:08:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c730147292fa7ee0008', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:08:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c7301472930082f000a', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:08:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c730147293021d3000c', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:08:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c73014729308a15000e', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:09:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c7301472930aeb20010', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:09:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c7301472931c59b0012', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:10:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c73014729320e3d0014', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:10:52', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c73014729369de70016', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:15:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c7301472936c81b0018', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:16:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c73014729386dd4001a', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:17:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c7301472938c704001c', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:18:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c7301472939f998001e', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:19:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c730147293a158d0020', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:19:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c730147293ab7a70022', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:20:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c730147293aefcf0024', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:20:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c730147293b77040026', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:21:08', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347292c730147293b8dd60028', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:21:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034729488801472948e8690000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 14:35:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40288103472948880147294a65c80001', 'Chrome', ' Languge Update Success', '5', '192.168.1.131', '2014-07-12 14:37:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40288103472948880147294b26490003', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:38:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40288103472948880147294b43300005', 'Chrome', 'Languge Add Success', '3', '192.168.1.131', '2014-07-12 14:38:24', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034729600e0147296055da0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 15:01:25', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40288103472963600147296427540000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 15:05:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028810347296e950147296eda500000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 15:17:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40288103472977a901472977ee220000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 15:27:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('40288103472982510147298299170000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 15:38:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881034729ca08014729caa49e0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.131', '2014-07-12 16:57:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881824c741dbd014c741e73280000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.1.2', '2015-04-01 16:34:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881824c741dbd014c742bc8c20002', 'Chrome', '璇剧▼鏇存柊鎴愬姛', '5', '192.168.1.2', '2015-04-01 16:49:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881824c741dbd014c745c00cd0003', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.1.2', '2015-04-01 17:42:08', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881824c74a065014c74a136180000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.1.2', '2015-04-01 18:57:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881824cf4a33f014cf4a3cfaf0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.1.2', '2015-04-26 15:31:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881824cf4f158014cf4f1b1300000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.1.2', '2015-04-26 16:57:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881824cf4f799014cf4f8191e0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.1.2', '2015-04-26 17:04:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881824cf5096c014cf509c4bf0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.1.2', '2015-04-26 17:23:20', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881824cf5096c014cf50a492c0001', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.1.2', '2015-04-26 17:23:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046ef7f2a0146ef7facc50000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.64', '2014-07-01 09:17:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046ef7f2a0146ef7ff3e10001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.64', '2014-07-01 09:17:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046ef7f2a0146ef802bef0002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.64', '2014-07-01 09:18:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046ef7f2a0146ef8118350003', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.64', '2014-07-01 09:19:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046ef7f2a0146ef8131f40004', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.64', '2014-07-01 09:19:20', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046ef7f2a0146ef8843f50005', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.64', '2014-07-01 09:27:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046ef7f2a0146ef8863a40006', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.64', '2014-07-01 09:27:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046ef7f2a0146ef8afa510007', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.64', '2014-07-01 09:30:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046ef7f2a0146ef8f0bfc0008', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.64', '2014-07-01 09:34:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046efce8d0146efcf2cbc0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.64', '2014-07-01 10:44:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046efce8d0146effd3b1b0002', 'Chrome', '澶氳瑷娣诲姞鎴愬姛', '3', '192.168.1.64', '2014-07-01 11:34:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046efce8d0146effd5da20004', 'Chrome', '澶氳瑷娣诲姞鎴愬姛', '3', '192.168.1.64', '2014-07-01 11:34:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046efce8d0146f00167d10006', 'Chrome', '澶氳瑷娣诲姞鎴愬姛', '3', '192.168.1.64', '2014-07-01 11:39:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046efce8d0146f001f7d80008', 'Chrome', '澶氳瑷娣诲姞鎴愬姛', '3', '192.168.1.64', '2014-07-01 11:39:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046efce8d0146f002637b0009', 'Chrome', '澶氳瑷鏇存柊鎴愬姛', '5', '192.168.1.64', '2014-07-01 11:40:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046efce8d0146f0028e65000a', 'Chrome', '澶氳瑷鏇存柊鎴愬姛', '5', '192.168.1.64', '2014-07-01 11:40:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046efce8d0146f00e215d000c', 'Chrome', '澶氳瑷娣诲姞鎴愬姛', '3', '192.168.1.64', '2014-07-01 11:53:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046efce8d0146f00f05b6000e', 'Chrome', '澶氳瑷娣诲姞鎴愬姛', '3', '192.168.1.64', '2014-07-01 11:54:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046efce8d0146f01110d20010', 'Chrome', '澶氳瑷娣诲姞鎴愬姛', '3', '192.168.1.64', '2014-07-01 11:56:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046efce8d0146f01153140012', 'Chrome', '澶氳瑷娣诲姞鎴愬姛', '3', '192.168.1.64', '2014-07-01 11:56:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f013d0e20000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.64', '2014-07-01 11:59:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f01419a60001', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 11:59:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f014a9ce0002', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:00:24', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f015c9a20003', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:01:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f015ea7f0004', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:01:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f01725460005', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:03:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f017d2aa0006', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:03:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f01822c70007', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:04:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f0190dee0008', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:05:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f01c54e30009', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:08:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f01fe44d000a', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:12:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f020e82a000b', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:13:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f0228ea4000c', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:15:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f022bf40000d', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:15:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f022f08c000e', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:16:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f02329df000f', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:16:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f02378600010', 'Chrome', '\'Languge\' Update Success', '5', '192.168.1.64', '2014-07-01 12:16:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f023de7d0011', 'Chrome', '\'Languge\' Update Success', '5', '192.168.1.64', '2014-07-01 12:17:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f02408b40012', 'Chrome', '\'Languge\' Update Success', '5', '192.168.1.64', '2014-07-01 12:17:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f02628f90013', 'Chrome', '\'Languge\' Update Success', '5', '192.168.1.64', '2014-07-01 12:19:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f02713e40014', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:20:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f027439a0015', 'Chrome', '{0} Update Success', '5', '192.168.1.64', '2014-07-01 12:20:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f013850146f02791090016', 'Chrome', ' Languge Update Success', '5', '192.168.1.64', '2014-07-01 12:21:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f02b2cef0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.64', '2014-07-01 12:24:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f02b95550001', 'Chrome', ' Languge Update Success', '5', '192.168.1.64', '2014-07-01 12:25:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f02d9ea40003', 'Chrome', 'Languge Add Success', '3', '192.168.1.64', '2014-07-01 12:27:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f02df4ab0005', 'Chrome', 'Languge Add Success', '3', '192.168.1.64', '2014-07-01 12:28:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f0301b210007', 'Chrome', 'Languge Add Success', '3', '192.168.1.64', '2014-07-01 12:30:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f030cdeb0009', 'Chrome', 'Languge Add Success', '3', '192.168.1.64', '2014-07-01 12:31:08', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f0346015000b', 'Chrome', 'Languge Add Success', '3', '192.168.1.64', '2014-07-01 12:35:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f0348bcf000d', 'Chrome', 'Languge Add Success', '3', '192.168.1.64', '2014-07-01 12:35:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f03c2c3b000e', 'Chrome', ' Languge Update Success', '5', '192.168.1.64', '2014-07-01 12:43:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f03c3ea2000f', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.64', '2014-07-01 12:43:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f03c5c390010', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.64', '2014-07-01 12:43:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f03c79ae0011', 'Chrome', '澶氳瑷 鏇存柊鎴愬姛', '5', '192.168.1.64', '2014-07-01 12:43:53', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f04d261e0012', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.64', '2014-07-01 13:02:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c046f02a3f0146f04d4c950013', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.64', '2014-07-01 13:02:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c146fcd9f70146fcda934d0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-03 23:32:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c146fcd9f70146fcdb2cef0001', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-03 23:32:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c146fcd9f70146fcf9904b0002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-04 00:05:52', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c146fcd9f70146fd02eda00003', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-04 00:16:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c146fcd9f70146fd19e8c00004', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-04 00:41:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c146fcd9f70146fd20f6570005', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-04 00:48:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14700a750014700a91e4d0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-04 17:16:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14700a750014700c207a20001', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-04 17:43:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14702018a014702025b4a0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-04 23:33:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14702018a01470221981a0001', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 00:07:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14702018a01470236671a0002', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.65', '2014-07-05 00:30:25', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14702018a014702367f940003', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 00:30:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14702018a01470248e2ba0004', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 00:50:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14702018a0147024f40740005', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 00:57:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14702018a014702581b000006', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 01:07:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14702018a01470265f0ac0007', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 01:22:20', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470286e701470287452d0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 01:58:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe01470638ec390000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 19:11:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147063dc2140002', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:16:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147063e03b00004', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:17:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147063e736f0006', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:17:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147063e91170008', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:17:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147063f9a50000a', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:18:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147063fe10f000c', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:19:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe014706408c5c000e', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:19:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147064102bc0010', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:20:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147065887ae0012', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:46:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe01470658c2a80014', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:46:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147065a87120016', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:48:21', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147065acd780018', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:48:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147065c1da3001a', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:50:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147065c355c001c', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:50:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147066041f6001e', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:54:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe01470660a3340020', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:55:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147066267ed0022', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:56:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe01470662f1e90024', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:57:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe01470663fbdd0026', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:58:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe014706646c710028', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 19:59:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe014706648f3e0029', 'Chrome', ' Languge Update Success', '5', '192.168.1.65', '2014-07-05 19:59:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe014706669f3f002b', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 20:01:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe01470666c8f3002d', 'Chrome', 'Languge Add Success', '3', '192.168.1.65', '2014-07-05 20:01:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe0147068336f0002e', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 20:32:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470636fe01470695246c002f', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 20:52:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14706a40b014706a581b40000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 21:10:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14706a40b014706a90e440001', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 21:14:08', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14706a40b014706abe5ff0002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 21:17:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14706a40b014706bc03d90003', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 21:34:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14706a40b014706c36ba70004', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 21:42:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14706a40b014706cea8300005', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 21:55:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14706a40b014706e745b60006', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 22:22:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14706a40b014706fd8eeb0007', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.65', '2014-07-05 22:46:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14706a40b014706fdadf90008', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 22:46:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14706a40b014706fea2a50009', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.65', '2014-07-05 22:47:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c14706a40b014706febf82000a', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-05 22:47:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470961bf014709630ee30000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-06 09:56:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470961bf01470968bae60001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.65', '2014-07-06 10:02:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470961bf0147096926770002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-06 10:03:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470961bf014709695b1e0003', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.65', '2014-07-06 10:03:25', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1470961bf0147096988840004', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-06 10:03:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c147117dc00147117fc64f0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-07 23:44:52', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c147117dc001471198ff8f0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.65', '2014-07-08 00:12:25', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c147117dc00147119917ea0002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-08 00:12:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1471bdde601471be0d7b00000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-10 00:07:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1471bed1f01471bee202b0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-10 00:21:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1471bed1f01471bf1ec0c0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.65', '2014-07-10 00:25:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1471bf29901471bf309ab0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-10 00:26:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c1471bf58401471bf69e6f0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.65', '2014-07-10 00:30:53', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c3472007b9014720089d230000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.67', '2014-07-10 19:29:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347203fcc01472040a5cd0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.67', '2014-07-10 20:30:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347203fcc0147204595d30002', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 20:35:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347203fcc01472045b5f70004', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 20:35:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347203fcc014720461add0006', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 20:36:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347203fcc014720463bff0008', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 20:36:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347203fcc0147204d690e000a', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 20:44:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347203fcc0147204d9f07000c', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 20:44:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347203fcc0147204f60de000d', 'Chrome', ' Languge Update Success', '5', '192.168.1.67', '2014-07-10 20:46:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347203fcc0147204fa9cc000e', 'Chrome', ' Languge Update Success', '5', '192.168.1.67', '2014-07-10 20:46:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347205fc00147206003260000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.67', '2014-07-10 21:04:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347205fc0014720704ab20002', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 21:22:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347205fc0014720718d3c0004', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 21:23:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347205fc001472082f51e0006', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 21:42:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347205fc00147208321ea0008', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 21:42:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347205fc0014720833b980009', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.67', '2014-07-10 21:42:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c347205fc0014720835730000a', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.67', '2014-07-10 21:43:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de1ea60146de1efdd00000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.71', '2014-06-28 00:18:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de1ea60146de207d970002', 'Chrome', '鏉冮檺: 澶氳瑷绠$悊琚坊鍔犳垚鍔', '3', '192.168.1.71', '2014-06-28 00:20:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de1ea60146de2109340004', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.71', '2014-06-28 00:20:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de1ea60146de2122f50005', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.71', '2014-06-28 00:20:52', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de1ea60146de21a8650006', 'Chrome', '鏉冮檺: 澶氳瑷绠$悊琚洿鏂版垚鍔', '5', '192.168.1.71', '2014-06-28 00:21:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de1ea60146de221b160007', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.71', '2014-06-28 00:21:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de1ea60146de2233c10008', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.71', '2014-06-28 00:22:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de26b80146de27310a0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.71', '2014-06-28 00:27:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de26b80146de2c2c680002', 'Chrome', '绫诲瀷鍒嗙粍: 澶氳瑷琚坊鍔犳垚鍔', '3', '192.168.125.203', '2014-06-28 00:32:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de26b80146de2cf95f0004', 'Chrome', '绫诲瀷: en_us琚坊鍔犳垚鍔', '3', '192.168.125.203', '2014-06-28 00:33:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de26b80146de2d59ca0005', 'Chrome', '绫诲瀷: 鑻辨枃琚洿鏂版垚鍔', '5', '192.168.125.203', '2014-06-28 00:34:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de26b80146de2dde3e0007', 'Chrome', '绫诲瀷: zh_cn琚坊鍔犳垚鍔', '3', '192.168.125.203', '2014-06-28 00:34:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746de26b80146de2e0c4f0008', 'Chrome', '绫诲瀷: 绠浣撲腑鏂囪鏇存柊鎴愬姛', '5', '192.168.125.203', '2014-06-28 00:34:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746e706630146e706eb860000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.71', '2014-06-29 17:48:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881c746e706630146e713c6880001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.71', '2014-06-29 18:02:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881f449ec945e0149ec96c6530000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.1.116', '2014-11-26 22:52:24', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881f449ec945e0149ec9764190001', 'Chrome', '鍙栨秷婵娲绘垚鍔', '5', '192.168.1.116', '2014-11-26 22:53:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881f449ec945e0149ec976c650002', 'Chrome', '婵娲绘垚鍔', '5', '192.168.1.116', '2014-11-26 22:53:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881f449ec9ac00149ec9bbc290000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.1.116', '2014-11-26 22:57:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881f449eca0ea0149eca1d33c0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.1.116', '2014-11-26 23:04:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402881f449eca3e20149eca467b20000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.1.116', '2014-11-26 23:07:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028890147b37c1c0147b37c84740000', 'Firefox', 'User: admin[淇℃伅閮╙?common.login.success', '1', '192.168.9.129', '2014-08-08 10:39:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028890147b37c1c0147b37ca7c70001', 'Firefox', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.129', '2014-08-08 10:39:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028890147b37c1c0147b37d7e770002', 'Firefox', 'User: admin[淇℃伅閮╙?common.login.success', '1', '192.168.9.129', '2014-08-08 10:40:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028890147b37c1c0147b37daf8a0003', 'Firefox', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.129', '2014-08-08 10:41:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028890147b37c1c0147b38708210004', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙?common.login.success', '1', '192.168.9.129', '2014-08-08 10:51:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752b8f0014752b9a2c70000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.111', '2014-07-20 15:43:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752b8f0014752bab6640001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.111', '2014-07-20 15:44:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752b8f0014752bacec20002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.111', '2014-07-20 15:44:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752b8f0014752bae2f30003', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.111', '2014-07-20 15:44:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752b8f0014752bb07380004', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.111', '2014-07-20 15:44:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752b8f0014752bd2ef10005', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.111', '2014-07-20 15:47:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752b8f0014752bd64730006', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.111', '2014-07-20 15:47:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752b8f0014752c2a4080007', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.111', '2014-07-20 15:53:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f680014752f6e18c0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.111', '2014-07-20 16:50:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f680014752fbb7650001', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.111', '2014-07-20 16:55:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f6800147530d88e80002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.111', '2014-07-20 17:15:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f68001475312f2250003', 'Chrome', '鏉冮檺: report demo琚洿鏂版垚鍔', '5', '192.168.9.111', '2014-07-20 17:20:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f680014753150e1d0006', 'Chrome', 'Language add success', '3', '192.168.9.111', '2014-07-20 17:23:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f680014753153baf0008', 'Chrome', 'Language add success', '3', '192.168.9.111', '2014-07-20 17:23:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f68001475315814e0009', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.111', '2014-07-20 17:23:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f68001475315a716000a', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.111', '2014-07-20 17:23:53', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f6800147531640cb000b', 'Chrome', '鏉冮檺: user.report琚洿鏂版垚鍔', '5', '192.168.9.111', '2014-07-20 17:24:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f680014753164e3f000c', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.111', '2014-07-20 17:24:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f6800147531666ae000d', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.111', '2014-07-20 17:24:42', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f68001475316d520000e', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.111', '2014-07-20 17:25:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef4752f68001475316fd39000f', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.111', '2014-07-20 17:25:21', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889ef475328ff01475329b8fc0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.111', '2014-07-20 17:45:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489de53901489de5cac00000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.115', '2014-09-22 23:05:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489de53901489de95fc40005', 'Chrome', '鐢ㄦ埛: scott鏇存柊鎴愬姛', '5', '192.168.9.115', '2014-09-22 23:09:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489de53901489de9a0930009', 'Chrome', '鐢ㄦ埛: scott鏇存柊鎴愬姛', '5', '192.168.9.115', '2014-09-22 23:10:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489dfd9201489dfe27a40000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.115', '2014-09-22 23:32:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489e08cf01489e0970850000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.115', '2014-09-22 23:44:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489e08cf01489e0a567e0001', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.9.115', '2014-09-22 23:45:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489e0d1701489e0d63160000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.115', '2014-09-22 23:49:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489e13ab01489e14a18c0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.115', '2014-09-22 23:57:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489e13ab01489e1781d30001', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.9.115', '2014-09-23 00:00:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489e13ab01489e17882c0002', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.9.115', '2014-09-23 00:00:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489e1bdc01489e1c910d0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.115', '2014-09-23 00:05:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489e434301489e43d8ca0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.115', '2014-09-23 00:48:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489e434301489e4526770003', 'Chrome', '婵娲绘垚鍔', '5', '192.168.9.115', '2014-09-23 00:50:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489e434301489e45ef690004', 'Chrome', '鍙栨秷婵娲绘垚鍔', '5', '192.168.9.115', '2014-09-23 00:50:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489e48ec01489e49c1580000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.115', '2014-09-23 00:55:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f3489e48ec01489e4a7e370001', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.9.115', '2014-09-23 00:55:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f548bf8def0148bf8f03700000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.117', '2014-09-29 11:58:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f548bffc650148bffd2c7b0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.117', '2014-09-29 13:58:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f548bffc650148c00158480002', 'Chrome', '绫诲瀷: ?12琚坊鍔犳垚鍔', '3', '192.168.9.117', '2014-09-29 14:03:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f548bffc650148c0016fa60003', 'Chrome', '绫诲瀷: ?3琚洿鏂版垚鍔', '5', '192.168.9.117', '2014-09-29 14:03:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f548bffc650148c00177410004', 'Chrome', '绫诲瀷: ?3琚垹闄 鎴愬姛', '4', '192.168.9.117', '2014-09-29 14:03:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f548bffc650148c00187170006', 'Chrome', '绫诲瀷鍒嗙粍: ?12琚坊鍔犳垚鍔', '3', '192.168.9.117', '2014-09-29 14:03:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f548bffc650148c0019f580007', 'Chrome', '绫诲瀷鍒嗙粍: ?12 琚垹闄 鎴愬姛', '4', '192.168.9.117', '2014-09-29 14:03:24', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f548bffc650148c003702e0009', 'Chrome', '婵娲绘垚鍔', '5', '192.168.9.117', '2014-09-29 14:05:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f64746f88a014746f90fd30000', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.118', '2014-07-18 08:57:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f64746f88a014746f9a58a0001', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.9.118', '2014-07-18 08:57:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f647f727a70147f728cd5a0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.118', '2014-08-21 14:02:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f647f731ed0147f732382d0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.118', '2014-08-21 14:12:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f647f731ed0147f732dd260001', 'Chrome', '鍒犻櫎鎴愬姛', '4', '192.168.9.118', '2014-08-21 14:13:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f647f9335d0147f9343f140000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.118', '2014-08-21 23:34:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f647f9353c0147f9358b520000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.118', '2014-08-21 23:35:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f647f9353c0147f93824550001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.118', '2014-08-21 23:38:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f647f9353c0147f9384fe20002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.118', '2014-08-21 23:38:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889f647f9393b0147f93999660000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.118', '2014-08-21 23:40:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fa47e8209d0147e82171020000', 'Chrome', 'User: admin[淇℃伅閮╙?common.login.success', '1', '192.168.9.122', '2014-08-18 16:00:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fa47e8209d0147e82226730001', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙?common.login.success', '1', '192.168.9.122', '2014-08-18 16:00:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fa47e8209d0147e82469a10002', 'Firefox', 'User: admin[淇℃伅閮╙?common.login.success', '1', '192.168.9.122', '2014-08-18 16:03:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fa47e8209d0147e82564020003', 'Firefox', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.122', '2014-08-18 16:04:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fa47e86ab30147e86b287a0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙?common.login.success', '1', '192.168.9.122', '2014-08-18 17:20:42', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fa4877578a0148775841c40000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.122', '2014-09-15 11:25:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fa4877578a0148775a53fc0001', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.9.122', '2014-09-15 11:28:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fa4877578a0148775a9bb80002', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.9.122', '2014-09-15 11:28:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fa4877578a0148775ad1a80003', 'Chrome', '璇█ 鏇存柊鎴愬姛', '5', '192.168.9.122', '2014-09-15 11:28:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fa4886e79a014886e814db0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.122', '2014-09-18 11:57:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb480b140f01480b1581a90000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.123', '2014-08-25 10:53:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb4810b55e014810b70db20000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.123', '2014-08-26 13:08:25', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb4810b55e014810bd510c0005', 'Chrome', '鐢ㄦ埛: admin鏇存柊鎴愬姛', '5', '192.168.9.123', '2014-08-26 13:15:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e88b2c90000', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.123', '2014-09-13 18:22:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e89fa820004', 'Firefox', '鐢ㄦ埛: admin鏇存柊鎴愬姛', '5', '192.168.9.123', '2014-09-13 18:23:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e8de42b0006', 'Firefox', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.9.123', '2014-09-13 18:27:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e8e2ed00008', 'Firefox', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.9.123', '2014-09-13 18:28:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e8e43ce0009', 'Firefox', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.9.123', '2014-09-13 18:28:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e8e5e17000a', 'Firefox', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.9.123', '2014-09-13 18:28:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e913d14000c', 'Firefox', '鎿嶄綔 褰曞叆鎴愬姛', '3', '192.168.9.123', '2014-09-13 18:31:25', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e91bed5000f', 'Firefox', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.123', '2014-09-13 18:31:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e91e45a0010', 'Firefox', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 18:32:08', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e92356c0011', 'Firefox', '鐢ㄦ埛scott宸查鍑', '2', '192.168.9.123', '2014-09-13 18:32:28', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e925aad0012', 'Firefox', '鐢ㄦ埛: admin[浜哄姏璧勬簮閮╙?common.login.success', '1', '192.168.9.123', '2014-09-13 18:32:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e9357100013', 'Firefox', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.9.123', '2014-09-13 18:33:42', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e93a8060015', 'Firefox', '鑿滃崟 褰曞叆鎴愬姛', '3', '192.168.9.123', '2014-09-13 18:34:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e98d4af0017', 'Firefox', '鎿嶄綔 褰曞叆鎴愬姛', '3', '192.168.9.123', '2014-09-13 18:39:42', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e9b14fc0019', 'Firefox', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.123', '2014-09-13 18:42:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e9b6afe001a', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.123', '2014-09-13 18:42:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e9b78f2001b', 'Firefox', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.123', '2014-09-13 18:42:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e9b9b77001c', 'Firefox', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 18:42:44', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e9c9563001d', 'Firefox', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.9.123', '2014-09-13 18:43:48', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e9ca970001e', 'Firefox', '鐢ㄦ埛scott宸查鍑', '2', '192.168.9.123', '2014-09-13 18:43:53', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e9d1ea0001f', 'Firefox', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.123', '2014-09-13 18:44:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e9d572f0020', 'Firefox', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.123', '2014-09-13 18:44:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486e848101486e9dcc510021', 'Firefox', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 18:45:08', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486eb7b501486eb862c80000', 'Firefox', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 19:14:10', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486ebba501486ebc260b0000', 'Firefox', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 19:18:17', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486ec32501486ec41d420000', 'Firefox', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 19:26:59', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486ecb7601486ecc8d2e0000', 'Firefox', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 19:36:12', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486ed46001486ed5130f0000', 'Firefox', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 19:45:30', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486ed77c01486ed8c5d10000', 'Chrome', '鐢ㄦ埛: admin[浜哄姏璧勬簮閮╙?common.login.success', '1', '192.168.9.123', '2014-09-13 19:49:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486ed77c01486ed8e2220001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.123', '2014-09-13 19:49:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486ed77c01486ed914890002', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 19:49:53', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486edd4501486eddc1580000', 'Chrome', '鐢ㄦ埛: admin[浜哄姏璧勬簮閮╙?common.login.success', '1', '192.168.9.123', '2014-09-13 19:54:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486edd4501486eddd10e0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.123', '2014-09-13 19:55:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486edd4501486eddf3ac0002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.123', '2014-09-13 19:55:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486edd4501486ede009d0003', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.123', '2014-09-13 19:55:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486edd4501486ede2dbe0004', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 19:55:27', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486edd4501486ee51ba70005', 'Chrome', '鑿滃崟 鏇存柊鎴愬姛', '5', '192.168.9.123', '2014-09-13 20:03:01', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486edd4501486ee52aad0006', 'Chrome', '鐢ㄦ埛scott宸查鍑', '2', '192.168.9.123', '2014-09-13 20:03:05', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486edd4501486ee54cda0007', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 20:03:14', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486eeb9801486eec006c0000', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 20:10:33', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486eee1d01486eef02d30000', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 20:13:50', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486f519c01486f52825f0000', 'Chrome', '鐢ㄦ埛: admin[浜哄姏璧勬簮閮╙?common.login.success', '1', '192.168.9.123', '2014-09-13 22:02:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486f519c01486f568bce0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.123', '2014-09-13 22:06:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486f519c01486f56b45c0002', 'Chrome', '鐢ㄦ埛: admin[浜哄姏璧勬簮閮╙?common.login.success', '1', '192.168.9.123', '2014-09-13 22:07:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486f519c01486f5a33df0003', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.123', '2014-09-13 22:10:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486f519c01486f5a55030004', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.123', '2014-09-13 22:11:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486f519c01486f5ba6590005', 'Chrome', '鎿嶄綔 鏇存柊鎴愬姛', '5', '192.168.9.123', '2014-09-13 22:12:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486f519c01486f5bc7410006', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.123', '2014-09-13 22:12:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486f519c01486f5ca26c0007', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.123', '2014-09-13 22:13:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486f519c01486f5cb3b00008', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.123', '2014-09-13 22:13:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fb486f519c01486f5cdd230009', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.123', '2014-09-13 22:13:49', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fb486f519c01486f6106c2000a', 'Chrome', '鎿嶄綔 鏇存柊鎴愬姛', '5', '192.168.9.123', '2014-09-13 22:18:22', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fe47eccc130147eccc61d40000', 'Chrome', 'User: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.126', '2014-08-19 13:45:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47eccc130147ecccd1440001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.126', '2014-08-19 13:45:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47eccc130147ecccf9510002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.126', '2014-08-19 13:46:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47eccc130147ecd490c40003', 'Chrome', '缁勭粐鏈烘瀯 鏇存柊鎴愬姛', '5', '192.168.9.126', '2014-08-19 13:54:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fc461d0147fc4690ec0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.126', '2014-08-22 13:53:08', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fc461d0147fc46cf070002', 'Chrome', 'JeecgDemo渚嬪瓙: 12琚坊鍔犳垚鍔', '3', '192.168.9.126', '2014-08-22 13:53:24', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fc461d0147fc46fec10003', 'Chrome', '娴嬭瘯-鐢ㄦ埛鐢宠鎴愬姛', '5', '192.168.9.126', '2014-08-22 13:53:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fc461d0147fc4705df0004', 'Chrome', 'JeecgDemo渚嬪瓙: 12琚垹闄 鎴愬姛', '4', '192.168.9.126', '2014-08-22 13:53:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fc461d0147fc4820ae0005', 'Chrome', '鐢ㄦ埛: scott瀵嗙爜閲嶇疆鎴愬姛', '5', '192.168.9.126', '2014-08-22 13:54:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fc461d0147fc482b3f0006', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.126', '2014-08-22 13:54:53', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fc461d0147fc48710b0007', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.126', '2014-08-22 13:55:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fc461d0147fc48881c0008', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.126', '2014-08-22 13:55:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fc461d0147fc4f5beb0009', 'Chrome', '鐢ㄦ埛: scott[杞欢寮鍙戦儴]?common.login.success', '1', '192.168.9.126', '2014-08-22 14:02:45', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fe47fc461d0147fc4ff10f000b', 'Chrome', '娣诲姞鎴愬姛', '3', '192.168.9.126', '2014-08-22 14:03:23', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('402889fe47fca63f0147fcaecc7c0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.126', '2014-08-22 15:46:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fca63f0147fcafba8e0002', 'Chrome', '鎿嶄綔 褰曞叆鎴愬姛', '3', '192.168.9.126', '2014-08-22 15:48:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fca63f0147fcb191660003', 'Chrome', '鎿嶄綔鍒犻櫎鎴愬姛', '4', '192.168.9.126', '2014-08-22 15:50:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fca63f0147fcb1b3020004', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.9.126', '2014-08-22 15:50:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fcb29c0147fcb3e02d0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.9.126', '2014-08-22 15:52:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('402889fe47fcb29c0147fcb6b66e0002', 'Chrome', '鎿嶄綔 褰曞叆鎴愬姛', '3', '192.168.9.126', '2014-08-22 15:55:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028ab224bfd416c014bfd427a3f0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.43.162', '2015-03-09 14:39:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028ab224cadabfe014cadac75600000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.43.162', '2015-04-12 20:48:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028abc349f187560149f187ebea0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '192.168.43.67', '2014-11-27 21:54:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028d88147303d3e0147303db8940000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.88.1', '2014-07-13 23:00:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028d88147303d3e0147303df30e0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.88.1', '2014-07-13 23:01:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028d88147303d3e0147303e20300002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.88.1', '2014-07-13 23:01:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028d88147303d3e0147304509c10003', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.88.1', '2014-07-13 23:08:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028d88147303d3e014730452b670004', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.88.1', '2014-07-13 23:09:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fc5e471c19f401471c1a728e0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.124.222', '2014-07-10 01:10:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fc5e471c19f401471c1bfbff0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.124.222', '2014-07-10 01:11:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fc5e471c19f401471c1c13c80002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.124.222', '2014-07-10 01:11:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f32dc01471f334bd80000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.171', '2014-07-10 15:36:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f32dc01471f33c58d0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.125.171', '2014-07-10 15:36:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f32dc01471f33f4fb0002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.171', '2014-07-10 15:36:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f356201471f3606f90000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.171', '2014-07-10 15:39:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f57b001471f582f6f0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.171', '2014-07-10 16:16:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f57b001471f5de3880001', 'Chrome', '淇敼鎴愬姛', '5', '192.168.125.171', '2014-07-10 16:22:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471f6566300000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.171', '2014-07-10 16:30:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471f9576000002', 'Chrome', 'Languge Add Success', '3', '192.168.125.171', '2014-07-10 17:23:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471f95fddf0004', 'Chrome', 'Languge Add Success', '3', '192.168.125.171', '2014-07-10 17:23:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471f96a9a30005', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.125.171', '2014-07-10 17:24:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471f96c4210006', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.171', '2014-07-10 17:24:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471f9721e70007', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.125.171', '2014-07-10 17:25:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471f97400d0008', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.171', '2014-07-10 17:25:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471f9775b70009', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.125.171', '2014-07-10 17:25:25', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471f978bfa000a', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.171', '2014-07-10 17:25:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fc74bf9000b', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.67', '2014-07-10 18:17:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fc79e1c000d', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:18:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fc7ec2f000f', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:18:21', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fc8bd620011', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:19:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fc8dcac0013', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:19:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fc961c20015', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:19:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fc97f3b0017', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:20:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fc9e63c0019', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:20:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fca0514001b', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:20:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fcc9fa1001d', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:23:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fccbf25001f', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:23:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fcd6c9f0021', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:24:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fcdd7200023', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:24:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fce9e850025', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:25:40', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fcec9f50027', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:25:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fcf68c90029', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:26:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fcf949a002b', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:26:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fd06517002c', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.67', '2014-07-10 18:27:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fd089b2002d', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.67', '2014-07-10 18:27:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fd33ebc002f', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:30:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fd36c5b0031', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:30:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fd429190033', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:31:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fd487cb0035', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:32:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fd7067c0037', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:34:51', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fd71f580039', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:34:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fd80fe1003a', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.67', '2014-07-10 18:35:59', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fd82852003b', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.67', '2014-07-10 18:36:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fd8bd9c003d', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:36:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fd8d360003f', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:36:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fdae9b20041', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:39:06', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fdb06fe0043', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:39:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fdbd2c30045', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:40:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fdc1bb20047', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:40:24', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fdd7b2e0049', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:41:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fde0d10004b', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:42:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fde8731004d', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:43:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fdebbb2004f', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:43:16', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fdfb0110051', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:44:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fdff9790053', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:44:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fe05b990054', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.67', '2014-07-10 18:45:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fe07aff0055', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.67', '2014-07-10 18:45:11', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fe226620056', 'Chrome', ' Languge Update Success', '5', '192.168.1.67', '2014-07-10 18:47:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fe237010057', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.1.67', '2014-07-10 18:47:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fe24c120058', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.1.67', '2014-07-10 18:47:10', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fe39400005a', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:48:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fe4c6d1005c', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:49:52', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fe5864d005e', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:50:41', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471fe611d90060', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 18:51:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471ff8d3050062', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 19:11:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471ff8fcd40064', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 19:11:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471ff9ec330066', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 19:12:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471ffa2ef80068', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 19:13:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471ffb993b006a', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 19:14:48', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471ffbb3e2006c', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 19:14:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471ffcc5aa006e', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 19:16:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471ffce0740070', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 19:16:12', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471ffdf2470072', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 19:17:22', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471ffe0b1e0074', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 19:17:28', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471ffed3320076', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 19:18:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd2b471f63bb01471ffeef120078', 'Chrome', 'Languge Add Success', '3', '192.168.1.67', '2014-07-10 19:18:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd4b46de568e0146de56dc0c0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.203', '2014-06-28 01:19:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd4b46de5e0e0146de5e58fd0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.203', '2014-06-28 01:27:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd4b46de5e0e0146de6277890001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '192.168.125.203', '2014-06-28 01:32:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd4b46de5e0e0146de6297680002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.203', '2014-06-28 01:32:21', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd4b46de66200146de6679110000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.203', '2014-06-28 01:36:36', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('4028fd4b46de69030146de69556d0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '192.168.125.203', '2014-06-28 01:39:43', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5ee849014c5ee8e4910000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.57.200', '2015-03-28 13:44:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5ef836014c5f0e5daa0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.57.200', '2015-03-28 14:25:19', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fa8fd014c5fa964f60000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.57.200', '2015-03-28 17:14:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fac5d014c5facbad20000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.57.200', '2015-03-28 17:18:17', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fbd45014c5fbdb1f00000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.57.200', '2015-03-28 17:36:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fbfab014c5fc00b190000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.57.200', '2015-03-28 17:39:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fc1b6014c5fc21bf40000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.57.200', '2015-03-28 17:41:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fc1b6014c5fc35adf0001', 'Chrome', '娑堟伅鍙戦佽褰曡〃鍒犻櫎鎴愬姛', '4', '10.1.57.200', '2015-03-28 17:43:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fc1b6014c5fc3a0990003', 'Chrome', '娑堟伅鍙戦佽褰曡〃娣诲姞鎴愬姛', '3', '10.1.57.200', '2015-03-28 17:43:18', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fd306014c5fd380170000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.57.200', '2015-03-28 18:00:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fd6c3014c5fdb399c0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.57.200', '2015-03-28 18:09:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fdce8014c5fdd731d0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.57.200', '2015-03-28 18:11:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fdce8014c5fddc0020002', 'Chrome', 'SMS娑堟伅娣诲姞鎴愬姛', '3', '10.1.57.200', '2015-03-28 18:11:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fdce8014c5fddd19f0003', 'Chrome', 'SMS娑堟伅鏇存柊鎴愬姛', '5', '10.1.57.200', '2015-03-28 18:11:54', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81b9484c5fdce8014c5fdddec60004', 'Chrome', 'SMS娑堟伅鍒犻櫎鎴愬姛', '4', '10.1.57.200', '2015-03-28 18:11:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81bb3a4c639a00014c639aff9d0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.59.186', '2015-03-29 11:37:24', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97ba90014c97bb08680000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.64.136', '2015-04-08 14:32:39', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97ba90014c97bbe13a0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '10.1.64.136', '2015-04-08 14:33:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97ba90014c97bc0e4e0002', 'Chrome', '鐢ㄦ埛: scott[閿鍞粡鐞哴?common.login.success', '1', '10.1.64.136', '2015-04-08 14:33:46', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97ba90014c97bcebdb0003', 'Chrome', '鐢ㄦ埛scott宸查鍑', '2', '10.1.64.136', '2015-04-08 14:34:43', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97ba90014c97bd1d680004', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.64.136', '2015-04-08 14:34:55', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97ba90014c97bdaa5c0005', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '10.1.64.136', '2015-04-08 14:35:31', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97ba90014c97bdd7be0006', 'Chrome', '鐢ㄦ埛: scott[閿鍞粡鐞哴?common.login.success', '1', '10.1.64.136', '2015-04-08 14:35:43', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97ba90014c97bec54a0007', 'Chrome', '鐢ㄦ埛scott宸查鍑', '2', '10.1.64.136', '2015-04-08 14:36:44', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97ba90014c97bf81d30008', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.64.136', '2015-04-08 14:37:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97ba90014c97bfe1d20009', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '10.1.64.136', '2015-04-08 14:37:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97ba90014c97c00904000a', 'Chrome', '鐢ㄦ埛: scott[閿鍞粡鐞哴?common.login.success', '1', '10.1.64.136', '2015-04-08 14:38:07', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97e028014c97e0fef40000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.64.136', '2015-04-08 15:14:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97e028014c97e11d7a0001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '10.1.64.136', '2015-04-08 15:14:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97e028014c97e149180002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.64.136', '2015-04-08 15:14:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97e028014c97e165190003', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '10.1.64.136', '2015-04-08 15:14:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97e028014c97e18fc40004', 'Chrome', '鐢ㄦ埛: scott[閿鍞粡鐞哴?common.login.success', '1', '10.1.64.136', '2015-04-08 15:14:44', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97e227014c97e293ba0000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.64.136', '2015-04-08 15:15:50', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97e227014c97e2ab940001', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '10.1.64.136', '2015-04-08 15:15:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97e227014c97e2d5d40002', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.64.136', '2015-04-08 15:16:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97e227014c97e32f970003', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '10.1.64.136', '2015-04-08 15:16:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c97e227014c97e362e80004', 'Chrome', '鐢ㄦ埛: scott[閿鍞粡鐞哴?common.login.success', '1', '10.1.64.136', '2015-04-08 15:16:43', '1', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_log` VALUES ('8a81c0084c98255b014c9827ea160000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.64.136', '2015-04-08 16:31:34', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c7a04d28a63e014d28a70fd70000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.71.32', '2015-05-06 17:55:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c7a04d28a63e014d28a74d570001', 'Chrome', '鏇存柊鎴愬姛', '5', '10.1.71.32', '2015-05-06 17:56:02', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81c7a04d28a63e014d28a92ba60002', 'Chrome', '鏇存柊鎴愬姛', '5', '10.1.71.32', '2015-05-06 17:58:04', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a81ce714cc5c66a014cc5c6e0360000', 'Chrome', '鐢ㄦ埛: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '10.1.78.241', '2015-04-17 13:08:07', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a89a13b47199b0d0147199b97b90000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.9.33.187', '2014-07-09 13:32:13', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a89a13b4719c5dd014719c725eb0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.9.33.187', '2014-07-09 14:19:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a89a13b4719dcb1014719dd402f0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.9.33.187', '2014-07-09 14:43:56', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0274723f65b0147247aa5c60000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.167', '2014-07-11 16:12:03', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab08d46fac6010146fac8ed760000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.13', '2014-07-03 13:53:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab08d46fac6010146fac998de0001', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.13', '2014-07-03 13:54:14', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab08d46fac6010146fb0bc3c50002', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.13', '2014-07-03 15:06:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab08d46fb5b6b0146fb5bd1380000', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.13', '2014-07-03 16:33:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab08d46fb6cc00146fb6db4810000', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.13', '2014-07-03 16:53:29', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab08d46fb6cc00146fb7e34460001', 'Firefox', '鐢ㄦ埛admin宸查鍑', '2', '10.10.48.13', '2014-07-03 17:11:30', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab08d46fb6cc00146fb7e51bd0002', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.13', '2014-07-03 17:11:38', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab08d46fb6cc00146fb833b810003', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.13', '2014-07-03 17:17:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab08d46fb6cc00146fb83ee770004', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.13', '2014-07-03 17:17:45', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab08d46fb6cc00146fb854e1d0005', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.13', '2014-07-03 17:19:15', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b046f4b7700146f4b9b5430000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.48', '2014-07-02 09:39:09', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b046f4b7700146f4e259ef0001', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.48', '2014-07-02 10:23:33', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b046f4b7700146f4f0d0d60002', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.48', '2014-07-02 10:39:21', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b046f4f9f30146f4fa59590000', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.48', '2014-07-02 10:49:46', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b046f576250146f5787a5d0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.48', '2014-07-02 13:07:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b046f576250146f578bc910001', 'Firefox', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.48', '2014-07-02 13:07:49', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183d500d6', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.200.136', '2013-04-24 16:22:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183df00d7', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '10.10.10.1', '2013-04-24 17:12:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183e000d8', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-10 15:37:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183e100d9', 'Chrome', '鐢ㄦ埛admin宸查鍑', '2', '169.254.218.201', '2013-03-10 15:38:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183e300da', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-10 15:38:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183e600db', 'MSIE 9.0', 'JeecgDemo渚嬪瓙: 12琚垹闄 鎴愬姛', '4', '169.254.218.201', '2013-03-10 15:39:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183e700dc', 'MSIE 9.0', 'JeecgDemo渚嬪瓙: 12琚垹闄 鎴愬姛', '4', '169.254.218.201', '2013-03-10 15:39:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183e800dd', 'Chrome', 'JeecgDemo渚嬪瓙: 12琚垹闄 鎴愬姛', '4', '169.254.218.201', '2013-03-10 15:39:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183ea00de', 'MSIE 9.0', '鏉冮檺: 鍗曡〃妯″瀷琚洿鏂版垚鍔', '5', '169.254.218.201', '2013-03-10 15:39:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183eb00df', 'Chrome', '鍒犻櫎鎴愬姛', '4', '169.254.218.201', '2013-03-10 15:39:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183ed00e0', 'MSIE 9.0', '鍒犻櫎鎴愬姛', '4', '169.254.218.201', '2013-03-10 15:39:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183ee00e1', 'Chrome', '鍒犻櫎鎴愬姛', '4', '169.254.218.201', '2013-03-10 15:39:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183f000e2', 'Firefox', '鍒犻櫎鎴愬姛', '4', '169.254.218.201', '2013-03-10 15:39:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183f200e3', 'Chrome', '娣诲姞鎴愬姛', '3', '169.254.218.201', '2013-03-10 15:40:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183f400e4', 'Chrome', '鏇存柊鎴愬姛', '5', '169.254.218.201', '2013-03-10 15:40:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183f500e5', 'Chrome', 'JeecgDemo渚嬪瓙: 12琚坊鍔犳垚鍔', '3', '169.254.218.201', '2013-03-10 15:40:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183f900e6', 'Chrome', '閮ㄩ棬: 淇℃伅閮ㄨ鏇存柊鎴愬姛', '5', '169.254.218.201', '2013-03-10 15:41:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183fa00e7', 'Chrome', '閮ㄩ棬: 璁捐閮ㄨ鏇存柊鎴愬姛', '5', '169.254.218.201', '2013-03-10 15:41:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183fc00e8', 'Chrome', '绫诲瀷: 淇℃伅閮ㄦ祦绋嬭鏇存柊鎴愬姛', '5', '169.254.218.201', '2013-03-10 15:46:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183fd00e9', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-10 15:48:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8183ff00ea', 'Firefox', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-21 23:23:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81840100eb', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-21 23:26:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81840200ec', 'Chrome', '鏉冮檺: 涓瀵瑰瀹炰緥琚坊鍔犳垚鍔', '3', '169.254.218.201', '2013-03-21 23:28:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81840300ed', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-22 08:25:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81840500ee', 'Firefox', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-22 09:05:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81840600ef', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-22 09:09:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81840700f0', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-22 09:28:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81840900f1', 'Firefox', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-22 10:32:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81840a00f2', 'Chrome', '鐗╁搧: 绗旇鏈坊鍔犳垚鍔', '3', '169.254.218.201', '2013-03-22 10:35:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81840c00f3', 'Firefox', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-22 10:41:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81840d00f4', 'Firefox', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-22 16:11:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81840f00f5', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-22 21:49:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81841100f6', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-22 23:17:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81841200f7', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-22 23:27:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81841400f8', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-23 00:16:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81841500f9', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-23 00:22:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81841700fa', 'Firefox', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-23 00:31:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81841800fb', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '169.254.218.201', '2013-03-23 14:23:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81841900fc', 'Chrome', '娴佺▼鍙傛暟: 涓讳换瀹℃壒琚坊鍔犳垚鍔', '3', '169.254.218.201', '2013-03-23 15:05:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81841b00fd', 'Firefox', '涓氬姟鍙傛暟: 鍏ヨ亴鐢宠琚坊鍔犳垚鍔', '3', '169.254.218.201', '2013-03-23 15:05:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81841c00fe', 'Chrome', '鏉冮檺: 鍏ヨ亴鐢宠琚坊鍔犳垚鍔', '3', '169.254.218.201', '2013-03-23 15:12:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81841e00ff', 'Firefox', '鏉冮檺: 鍏ヨ亴鍔炵悊琚坊鍔犳垚鍔', '3', '169.254.218.201', '2013-03-23 15:13:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81841f0100', 'Chrome', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '10.10.10.1', '2013-05-06 15:27:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184210101', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 15:16:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184220102', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:02:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184240103', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:07:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184250104', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:09:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184270105', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:11:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184280106', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:13:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184290107', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:16:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81842c0108', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:19:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81842d0109', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:27:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81842f010a', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:42:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc818430010b', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:44:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc818432010c', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:49:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc818433010d', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:50:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc818435010e', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:53:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc818437010f', 'MSIE 8.0', '淇敼鎴愬姛', '5', '192.168.197.1', '2013-07-07 16:56:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184390110', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 16:59:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81843a0111', 'MSIE 8.0', '鍒涘缓鎴愬姛', '3', '192.168.197.1', '2013-07-07 17:22:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81843c0112', 'MSIE 8.0', '淇敼鎴愬姛', '5', '192.168.197.1', '2013-07-07 17:26:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81843d0113', 'MSIE 8.0', '鍒犻櫎鎴愬姛', '4', '192.168.197.1', '2013-07-07 17:31:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81843f0114', 'MSIE 8.0', '淇敼鎴愬姛', '5', '192.168.197.1', '2013-07-07 17:35:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184400115', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 17:46:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184410116', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 17:55:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184430117', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 18:08:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184450118', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 18:13:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184460119', 'MSIE 8.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.197.1', '2013-07-07 18:15:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc818447011a', 'MSIE 8.0', '淇敼鎴愬姛', '5', '192.168.197.1', '2013-07-07 18:28:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc818449011b', 'MSIE 8.0', '淇敼鎴愬姛', '5', '192.168.197.1', '2013-07-07 18:29:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81844b011c', 'MSIE 8.0', '淇敼鎴愬姛', '5', '192.168.197.1', '2013-07-07 18:30:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81844c011d', 'MSIE 8.0', '淇敼鎴愬姛', '5', '192.168.197.1', '2013-07-07 18:31:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81844d011e', 'MSIE 8.0', '淇敼鎴愬姛', '5', '192.168.197.1', '2013-07-07 18:31:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81844f011f', 'MSIE 9.0', '鐗╁搧: 555娣诲姞鎴愬姛', '3', '192.168.1.103', '2013-03-20 23:03:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184510120', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.1.103', '2013-03-20 23:19:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184530121', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.1.103', '2013-03-21 20:09:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184550122', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.1.103', '2013-03-21 20:27:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184570123', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.1.103', '2013-03-21 20:44:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184590124', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.1.103', '2013-03-21 20:54:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81845a0125', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.1.103', '2013-03-21 21:01:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81845c0126', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.1.103', '2013-03-21 21:13:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81845d0127', 'MSIE 9.0', '鐗╁搧: 55娣诲姞鎴愬姛', '3', '192.168.1.103', '2013-03-21 21:15:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81845f0128', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.1.103', '2013-03-21 21:22:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184610129', 'MSIE 9.0', '鐗╁搧: 55娣诲姞鎴愬姛', '3', '192.168.1.103', '2013-03-21 21:23:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc818462012a', 'MSIE 9.0', '鐗╁搧: 33娣诲姞鎴愬姛', '3', '192.168.1.103', '2013-03-21 21:23:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc818464012b', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.1.103', '2013-03-21 21:25:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc818465012c', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.1.103', '2013-03-21 21:27:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc818467012d', 'MSIE 9.0', '鏉冮檺: 閲囪喘瀹℃壒琚坊鍔犳垚鍔', '3', '192.168.1.103', '2013-03-21 21:29:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc818468012e', 'MSIE 9.0', '鏉冮檺: 閲囪喘瀹℃壒琚洿鏂版垚鍔', '5', '192.168.1.103', '2013-03-21 21:29:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81846a012f', 'MSIE 9.0', '鏉冮檺: 閲囪喘瀹℃壒琚洿鏂版垚鍔', '5', '192.168.1.103', '2013-03-21 21:30:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81846b0130', 'MSIE 9.0', '鐢ㄦ埛: admin鏇存柊鎴愬姛', '5', '192.168.1.103', '2013-03-21 21:31:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81846d0131', 'MSIE 9.0', '娴佺▼鍙傛暟: 閲囪喘瀹℃壒鍛樺鎵硅娣诲姞鎴愬姛', '3', '192.168.1.103', '2013-03-21 21:36:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81846e0132', 'MSIE 9.0', '娴佺▼鍙傛暟: 閲囪喘瀹℃壒鍛樺鎵硅鏇存柊鎴愬姛', '5', '192.168.1.103', '2013-03-21 21:36:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184700133', 'MSIE 9.0', '娴佺▼鍙傛暟: 閲囪喘瀹℃壒鍛樺鎵硅鏇存柊鎴愬姛', '5', '192.168.1.103', '2013-03-21 21:37:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184710134', 'MSIE 9.0', '娴佺▼绫诲埆: 閲囪喘瀹℃壒鍛樺鎵硅鍒犻櫎 鎴愬姛', '4', '192.168.1.103', '2013-03-21 21:38:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184730135', 'MSIE 9.0', '鐗╁搧: 44娣诲姞鎴愬姛', '3', '192.168.1.103', '2013-03-21 21:43:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184740136', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.1.105', '2013-02-07 10:10:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184760137', 'MSIE 9.0', '鏉冮檺: 涓婁紶涓嬭浇琚坊鍔犳垚鍔', '3', '192.168.1.105', '2013-02-07 11:07:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184770138', 'MSIE 9.0', '鏉冮檺: 鎻掍欢婕旂ず琚垹闄ゆ垚鍔', '4', '192.168.1.105', '2013-02-07 11:07:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc8184790139', 'MSIE 9.0', '鐢ㄦ埛: admin鐧诲綍鎴愬姛', '1', '192.168.1.105', '2013-02-07 11:07:00', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0b246dc81120146dc81a30a0191', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.50', '2014-06-27 16:47:01', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ea3d5a0146ea43bb810000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.93', '2014-06-30 08:54:05', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ea45cc0146ea46e2920000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.93', '2014-06-30 08:57:32', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ea53660146ea53e1660000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.93', '2014-06-30 09:11:44', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ea53660146ea5486230002', 'Chrome', '澶氳瑷娣诲姞鎴愬姛', '3', '10.10.48.93', '2014-06-30 09:12:26', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ea53660146ea54a9e90004', 'Chrome', '澶氳瑷娣诲姞鎴愬姛', '3', '10.10.48.93', '2014-06-30 09:12:35', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ea563e0146ea56d5010000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.93', '2014-06-30 09:14:57', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ea5ba80146ea5c02c80000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.93', '2014-06-30 09:20:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ea5ba80146ea656bd40001', 'rv:11.0', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.93', '2014-06-30 09:30:53', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ea86830146ea874c3a0000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.93', '2014-06-30 10:07:53', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ea86830146eaad5a4b0003', 'Chrome', '鐢ㄦ埛: admin鏇存柊鎴愬姛', '5', '10.10.48.93', '2014-06-30 10:49:27', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ead1cb0146ead246c70000', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.93', '2014-06-30 11:29:47', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ead1cb0146eb2f829c0001', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.93', '2014-06-30 13:11:37', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ead1cb0146ebb3aa730002', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.93', '2014-06-30 15:35:58', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('8a8ab0dd46ead1cb0146ec1b7fd10003', 'Chrome', '鐢ㄦ埛: admin[淇℃伅閮╙鐧诲綍鎴愬姛', '1', '10.10.48.93', '2014-06-30 17:29:23', '1', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_log` VALUES ('ff8080814c4f9209014c4f9efbae0000', 'Chrome', 'User: admin[涓浗浜哄鎬诲叕鍙竇?common.login.success', '1', '127.0.0.1', '2015-03-25 14:29:21', '1', '8a8ab0b246dc81120146dc8181950052'); + +-- ---------------------------- +-- Table structure for `t_s_muti_lang` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_muti_lang`; +CREATE TABLE `t_s_muti_lang` ( + `id` varchar(32) NOT NULL COMMENT '涓婚敭', + `lang_key` varchar(50) NOT NULL COMMENT '璇█涓婚敭', + `lang_context` varchar(500) NOT NULL COMMENT '鍐呭', + `lang_code` varchar(50) NOT NULL COMMENT '璇█', + `create_date` datetime default NULL COMMENT '鍒涘缓鏃堕棿', + `create_by` varchar(50) default NULL COMMENT '鍒涘缓浜虹紪鍙', + `create_name` varchar(50) default NULL COMMENT '鍒涘缓浜哄鍚', + `update_date` datetime default NULL COMMENT '鏇存柊鏃ユ湡', + `update_by` varchar(50) default NULL COMMENT '鏇存柊浜虹紪鍙', + `update_name` varchar(50) default NULL COMMENT '鏇存柊浜哄鍚', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_langkey_langcode` (`lang_key`,`lang_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_muti_lang +-- ---------------------------- +INSERT INTO `t_s_muti_lang` VALUES ('01ca201223b14e3e86c13904a9ae5ca2', 'common.password', '瀵嗙爜', 'zh-cn', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('02916620f68b4845ba09773de6799706', 'please.select.department', 'Please select a department', 'en', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('0ab1a1fddf14420fa0dbcbfb5d2e9e85', 'common.strong', 'Strong', 'en', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('0bacd0fab1c84f03854435c1adab88c2', 'common.lock.user', '閿佸畾鐢ㄦ埛', 'zh-cn', '2014-07-03 18:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('11d18a9927e34873a813eade025b5c18', 'fill.realname', 'Fill in the real name', 'en', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('121a68d32c6a419b800eb92431b20dd4', 'common.department', 'Org', 'en', '2014-07-03 18:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('1e5963a78dcd4b1fa5f9d6d845f151be', 'common.department', '缁勭粐鏈烘瀯', 'zh-cn', '2014-07-03 18:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('2075b6c641bc44b392638fed9a62cce9', 'password.rang6to18', '瀵嗙爜鑷冲皯6涓瓧绗,鏈澶18涓瓧绗', 'zh-cn', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('27a06a8ed99f45438be00b7f1ca097f7', 'common.username', '鐢ㄦ埛鍚', 'zh-cn', '2014-07-03 18:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ff41480146ffbb62a30012', 'menu.manage', 'Menu Manage', 'en', '2014-07-04 12:56:50', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:06:15', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ff41480146ffbc59ac0014', 'menu.manage', '鑿滃崟绠$悊', 'zh-cn', '2014-07-04 12:57:54', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:06:26', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffc8cd320001', 'common.id', 'ID', 'en', '2014-07-04 13:11:28', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-21 14:04:37', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffc933dc0003', 'common.id', '缂栧彿', 'zh-cn', '2014-07-04 13:11:54', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:11:54', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffc9b4bb0005', 'menu.name', 'Menu Name', 'en', '2014-07-04 13:12:27', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:14:52', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffcd8f60000b', 'menu.name', '鑿滃崟鍚嶇О', 'zh-cn', '2014-07-04 13:16:40', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:16:40', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffcdc44b000d', 'common.icon', 'Icon', 'en', '2014-07-04 13:16:53', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:16:53', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffcdf4a6000f', 'common.icon', '鍥炬爣', 'zh-cn', '2014-07-04 13:17:06', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:17:06', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffce76c70011', 'menu.url', 'Menu Url', 'en', '2014-07-04 13:17:39', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:17:39', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffcea7d80013', 'menu.url', '鑿滃崟鍦板潃', 'zh-cn', '2014-07-04 13:17:51', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:17:51', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffcf13090015', 'menu.order', 'Menu Order', 'en', '2014-07-04 13:18:19', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:18:19', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffcf4b0a0017', 'menu.order', '鑿滃崟椤哄簭', 'zh-cn', '2014-07-04 13:18:33', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:18:33', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffd059670019', 'menu.add', 'Function Add', 'en', '2014-07-04 13:19:42', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:22:11', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffd1cfeb001d', 'menu.edit', 'Menu Edit', 'en', '2014-07-04 13:21:18', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:21:18', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffd20205001f', 'menu.edit', '鑿滃崟缂栬緫', 'zh-cn', '2014-07-04 13:21:31', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:21:31', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffe1a54f0023', 'menu.level', 'Menu Level', 'en', '2014-07-04 13:38:36', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:38:36', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffe1e8530025', 'menu.level', '鑿滃崟绛夌骇', 'zh-cn', '2014-07-04 13:38:53', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:38:53', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffe5e2860027', 'parent.function', 'Parent Function', 'en', '2014-07-04 13:43:14', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:54:25', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffe6108b0029', 'parent.function', '鐖惰彍鍗', 'zh-cn', '2014-07-04 13:43:26', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:54:37', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffe9ec39002b', 'main.function', 'Main Function', 'en', '2014-07-04 13:47:38', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:54:52', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffea3970002d', 'main.function', '涓绾ц彍鍗', 'zh-cn', '2014-07-04 13:47:58', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:55:06', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffea9f27002f', 'sub.function', 'Sub Function', 'en', '2014-07-04 13:48:24', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:55:23', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffead7b80031', 'sub.function', '涓嬬骇鑿滃崟', 'zh-cn', '2014-07-04 13:48:39', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:55:34', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffebb2660033', 'desktop.icon', 'Desk Icon', 'en', '2014-07-04 13:49:35', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:49:35', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046ffc2ca0146ffebdf940035', 'desktop.icon', '妗岄潰鍥炬爣', 'zh-cn', '2014-07-04 13:49:46', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 13:49:46', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380146fffca39a0003', 'icon.list', 'Icon List', 'en', '2014-07-04 14:08:05', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 15:20:31', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380146fffd42c40005', 'icon.list', '鍥炬爣鍒楄〃', 'zh-cn', '2014-07-04 14:08:46', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 15:20:45', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470001e905000b', 'common.icon.name', 'Icon Name', 'en', '2014-07-04 14:13:50', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:13:50', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470002280b000d', 'common.icon.name', '鍥炬爣鍚嶇О', 'zh-cn', '2014-07-04 14:14:07', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:14:07', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff238014700030848000f', 'common.icon.style', 'Icon Style', 'en', '2014-07-04 14:15:04', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:21:40', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147000332810011', 'common.icon.style', '鍥炬爣鏍峰紡', 'zh-cn', '2014-07-04 14:15:15', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:15:15', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147000387440013', 'common.icon.type', 'Icon Type', 'en', '2014-07-04 14:15:37', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:15:37', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470003af940015', 'common.icon.type', '鍥炬爣绫诲瀷', 'zh-cn', '2014-07-04 14:15:47', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:15:47', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff238014700054be10020', 'icon.add', 'Icon Add', 'en', '2014-07-04 14:17:32', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:17:32', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470005af9a0024', 'icon.edit', 'Icon Edit', 'en', '2014-07-04 14:17:58', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:17:58', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470005d3550026', 'icon.edit', '鍥炬爣淇敼', 'zh-cn', '2014-07-04 14:18:07', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:18:07', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff238014700063c220028', 'batch.generate.style', 'Batch Generate Style', 'en', '2014-07-04 14:18:34', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-21 11:32:32', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff238014700068560002a', 'batch.generate.style', '鎵归噺鐢熸垚鏍峰紡', 'zh-cn', '2014-07-04 14:18:53', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:18:53', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470015a389002e', 'common.department.list', 'Org List', 'en', '2014-07-04 14:35:23', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 15:17:33', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470015ff8f0030', 'common.department.list', '缁勭粐鏈烘瀯鍒楄〃', 'zh-cn', '2014-07-04 14:35:47', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 15:17:09', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470016d58e0036', 'common.department.name', 'Org Name', 'en', '2014-07-04 14:36:42', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:36:42', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff238014700172e590038', 'common.department.name', '缁勭粐鏈烘瀯鍚嶇О', 'zh-cn', '2014-07-04 14:37:04', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:37:04', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470017a515003a', 'position.desc', 'Org Desc', 'en', '2014-07-04 14:37:35', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-08-18 23:41:49', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470017d2fb003c', 'position.desc', '缁勭粐鏈烘瀯鎻忚堪', 'zh-cn', '2014-07-04 14:37:47', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-08-18 23:41:59', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff238014700193e67003e', 'view.member', 'View Member', 'en', '2014-07-04 14:39:20', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:39:20', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147001963ef0040', 'view.member', '鏌ョ湅鎴愬憳', 'zh-cn', '2014-07-04 14:39:29', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:39:29', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147001ab010004a', 'parent.depart', 'Parent Org', 'en', '2014-07-04 14:40:54', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:40:54', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147001ad6a7004c', 'parent.depart', '涓婄骇缁勭粐鏈烘瀯', 'zh-cn', '2014-07-04 14:41:04', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:41:04', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff238014700256132004e', 'area.manage', 'Area Manage', 'en', '2014-07-04 14:52:35', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:52:35', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470025a7e70050', 'area.manage', '鍦板煙绠$悊', 'zh-cn', '2014-07-04 14:52:53', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:52:53', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147002800990056', 'area.name', 'Area Name', 'en', '2014-07-04 14:55:27', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:55:27', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470028c0330058', 'area.name', '鍦板煙鍚嶇О', 'zh-cn', '2014-07-04 14:56:16', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:56:16', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff238014700295bd8005a', 'area.code', 'Area Code', 'en', '2014-07-04 14:56:56', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:56:56', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147002981ee005c', 'area.code', '鍦板煙缂栫爜', 'zh-cn', '2014-07-04 14:57:06', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:57:06', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff23801470029c84d005e', 'display.order', 'Area Sort', 'en', '2014-07-04 14:57:24', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:57:37', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147002a3fa50061', 'display.order', '鏄剧ず椤哄簭', 'zh-cn', '2014-07-04 14:57:54', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:58:02', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147002a93ba0064', 'area.add.param', 'Area Add', 'en', '2014-07-04 14:58:16', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 15:12:56', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147002c144c006c', 'area.level', 'Area Level', 'en', '2014-07-04 14:59:54', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 14:59:54', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147002c3711006e', 'area.level', '鍦板煙绛夌骇', 'zh-cn', '2014-07-04 15:00:03', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 15:00:03', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147002ce8a70070', 'parent.area', 'Parent Area', 'en', '2014-07-04 15:00:48', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 15:00:48', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201046fff2380147002d42990072', 'parent.area', '鐖跺湴鍩', 'zh-cn', '2014-07-04 15:01:11', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 15:01:11', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104701c151014701d4ac920001', 'system.icon', 'System Icon', 'en', '2014-07-04 22:43:40', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 22:43:40', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104701c151014701d4e2990003', 'system.icon', '绯荤粺鍥炬爣', 'zh-cn', '2014-07-04 22:43:54', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 22:43:54', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104701c151014701d53b200005', 'menu.icon', 'Menu Icon', 'en', '2014-07-04 22:44:17', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 22:44:17', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104701c151014701d5c6cc0007', 'menu.icon', '鑿滃崟鍥炬爣', 'zh-cn', '2014-07-04 22:44:53', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 22:44:53', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104701c151014701dda832000d', 'main.area', 'Main Level', 'en', '2014-07-04 22:53:29', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 22:53:29', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104701c151014701ddf718000f', 'main.area', '涓绾у湴鍩', 'zh-cn', '2014-07-04 22:53:49', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 22:58:41', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104701c151014701de50dd0011', 'sub.area', 'Sub Level', 'en', '2014-07-04 22:54:12', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 22:55:00', '297e201046d3660a0146d36d7b7a01e7', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104701c151014701dece660013', 'sub.area', '涓嬬骇鍦板煙', 'zh-cn', '2014-07-04 22:54:44', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 22:54:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104701ecd4014701f3a69c0001', 'member.list', 'Member List', 'en', '2014-07-04 23:17:30', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 23:17:30', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104701ecd4014701f3dcfb0003', 'member.list', '鎴愬憳鍒楄〃', 'zh-cn', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e2010477674e7014776e5ffae0005', 'iconname.rang2to10', '鍚嶇О鑼冨洿2~10浣嶅瓧绗,涓斾笉涓虹┖', 'zh-cn', '2014-07-27 16:18:12', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e2010477674e7014776e6eecd0007', 'iconname.rang2to10', 'Icon name should be 2-10 characters and should not empty', 'en', '2014-07-27 16:19:11', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104777447a01477784810a000f', 'operate.name', '椤甸潰鎺т欢鍚嶇О', 'zh-cn', '2014-07-27 19:11:18', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-04-02 22:28:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104777447a0147778a170d0011', 'operate.name', 'Page Element Name', 'en', '2014-07-27 19:17:24', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-04-02 22:30:10', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104777447a01477791affe0014', 'operate.manage', 'Page access control', 'en', '2014-07-27 19:25:42', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-04-02 22:21:45', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104777447a01477791eea00016', 'operate.manage', '椤甸潰鎺т欢鏉冮檺閰嶇疆', 'zh-cn', '2014-07-27 19:25:58', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-04-02 22:22:00', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104777447a01477796ccde0018', 'operatename.rang2to20', '鎿嶄綔鍚嶇О鑼冨洿2~20浣嶅瓧绗', 'zh-cn', '2014-07-27 19:31:17', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104777447a014777979ab6001a', 'operatename.rang2to20', 'Operate name should be 2-20 characters', 'en', '2014-07-27 19:32:10', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104777447a014777991ef9001c', 'operatestatus.number', '蹇呴』涓烘暟瀛', 'zh-cn', '2014-07-27 19:33:49', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104777447a0147779a0f71001e', 'operatestatus.number', 'Must be numeric', 'en', '2014-07-27 19:34:50', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777a9190b0007', 'common.default.icon', 'default', 'en', '2014-07-27 19:51:16', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777a974ca0009', 'common.default.icon', '榛樿', 'zh-cn', '2014-07-27 19:51:39', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777a9cbc3000b', 'common.back', 'back', 'en', '2014-07-27 19:52:02', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777a9f433000d', 'common.back', '杩斿洖', 'zh-cn', '2014-07-27 19:52:12', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777ae465e000f', 'common.smallpie.icon', 'smallpie', 'en', '2014-07-27 19:56:55', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777aeb70c0011', 'common.smallpie.icon', '灏忛ゼ鐘跺浘', 'zh-cn', '2014-07-27 19:57:24', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777af2a970013', 'common.picture', '鍥剧墖', 'zh-cn', '2014-07-27 19:57:54', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-27 19:58:19', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777af611a0015', 'common.picture', 'pictures', 'en', '2014-07-27 19:58:08', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777afea2c0018', 'common.pencil.icon', '绗', 'zh-cn', '2014-07-27 19:58:43', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777b01f4a001a', 'common.pencil.icon', 'pencil', 'en', '2014-07-27 19:58:56', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777b210ae001c', 'common.smallmap', '灏忓湴鍥', 'zh-cn', '2014-07-27 20:01:04', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777b2638d001e', 'common.smallmap', 'smallmap', 'en', '2014-07-27 20:01:25', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777b2d38b0020', 'common.group', '缁', 'zh-cn', '2014-07-27 20:01:54', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777b3010a0022', 'common.group', 'group', 'en', '2014-07-27 20:02:05', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777b361fa0024', 'common.calculator', '璁$畻鍣', 'zh-cn', '2014-07-27 20:02:30', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777b39c390026', 'common.calculator', 'calculator', 'en', '2014-07-27 20:02:45', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777b3ed9e0028', 'common.folder', '鏂囦欢澶', 'zh-cn', '2014-07-27 20:03:06', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047779c5b014777b440fd002a', 'common.folder', 'folder', 'en', '2014-07-27 20:03:27', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104777c827014777f13d7f0002', 'common.delete.fail.param', '{0}鍒犻櫎澶辫触{1}', 'zh-cn', '2014-07-27 21:10:04', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104777c827014777f282f60004', 'common.delete.fail.param', '{0} delete fail{1}', 'en', '2014-07-27 21:11:27', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104777c827014777f52cd10006', 'common.icon.isusing', '锛佸浘鏍囨鍦ㄤ娇鐢紝涓嶅厑璁稿垹闄ゃ', 'zh-cn', '2014-07-27 21:14:22', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e20104777c827014777f8c27e0008', 'common.icon.isusing', ', Icon is using, can not be deleted.', 'en', '2014-07-27 21:18:17', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-27 21:27:54', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047781c8e014778273b160007', 'departmentname.rang3to10', '鏈烘瀯鍚嶇О鍦3~10浣嶅瓧绗', 'zh-cn', '2014-07-27 22:09:02', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047781c8e0147782885e90009', 'departmentname.rang3to10', 'Department name should be 3-10 characters', 'en', '2014-07-27 22:10:27', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047781c8e0147782a1443000b', 'areaname.rang2to15', '鍦板煙鍚嶇О鑼冨洿2~15浣嶅瓧绗,涓斾笉涓虹┖', 'zh-cn', '2014-07-27 22:12:09', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047781c8e0147782a6615000d', 'areaname.rang2to15', 'Area name should be 2-15 characters and should not empty', 'en', '2014-07-27 22:12:30', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047e73d0f0147e7ffd4540028', 'common.org.code', '鏈烘瀯缂栫爜', 'zh-cn', '2014-08-18 15:23:28', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047e73d0f0147e8004113002a', 'common.org.code', 'Org Code', 'en', '2014-08-18 15:23:56', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047e73d0f0147e800add5002c', 'common.org.type', '鏈烘瀯绫诲瀷', 'zh-cn', '2014-08-18 15:24:24', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047e73d0f0147e800edf8002e', 'common.org.type', 'Org Type', 'en', '2014-08-18 15:24:40', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047e73d0f0147e80a71980030', 'common.company', '鍏徃', 'zh-cn', '2014-08-18 15:35:04', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047e73d0f0147e80abac10032', 'common.company', 'Company', 'en', '2014-08-18 15:35:23', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047e73d0f0147e815144e0034', 'common.position', '宀椾綅', 'zh-cn', '2014-08-18 15:46:41', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047e73d0f0147e81561a80036', 'common.position', 'Position', 'en', '2014-08-18 15:47:01', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047f766400147f7b9d4d20009', 'role.set', '瑙掕壊璁剧疆', 'zh-cn', '2014-08-21 16:40:56', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047f766400147f7be2c6a000c', 'current.org', '褰撳墠鏈烘瀯', 'zh-cn', '2014-08-21 16:45:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-08-21 16:49:44', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047f766400147f7be6144000e', 'current.org', 'Current Org', 'en', '2014-08-21 16:45:54', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-08-21 16:50:03', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201047f8c5050147f923e5e8000c', 'role.set', 'Role Set', 'en', '2014-08-21 23:16:25', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201048154920014815c3e9a7000c', 'common.add.exist.user', '娣诲姞宸叉湁瀹㈡埛', 'zh-cn', '2014-08-27 12:40:33', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201048154920014815c47ac1000e', 'common.add.exist.user', 'Add Exist User', 'en', '2014-08-27 12:41:11', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201048b7e5c60148b7ffe64e0001', 'common.type.list', '绫诲瀷鍒楄〃', 'zh-cn', '2014-09-28 00:44:34', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201048b7e5c60148b8002b620003', 'common.type.list', 'Type List', 'en', '2014-09-28 00:44:51', 'admin', '绠$悊鍛', '2014-09-28 00:46:01', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('297e201048b7e5c60148b801c7520006', 'common.type.code', '绫诲瀷缂栫爜', 'zh-cn', '2014-09-28 00:46:37', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201048b7e5c60148b801f8dc0008', 'common.type.code', 'Type Code', 'en', '2014-09-28 00:46:50', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201048b7e5c60148b8024884000a', 'common.type.name', '绫诲瀷鍚嶇О', 'zh-cn', '2014-09-28 00:47:10', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201048b7e5c60148b802773e000c', 'common.type.name', 'Type Name', 'en', '2014-09-28 00:47:22', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201048b803ec0148b80d34360001', 'common.type.view', '鏌ョ湅绫诲瀷', 'zh-cn', '2014-09-28 00:59:06', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('297e201048b803ec0148b80d6da10003', 'common.type.view', 'Type View', 'en', '2014-09-28 00:59:20', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('2a609258aef344bbbcf0c766d922e449', 'common.phone', 'Phone', 'en', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('2bad4a20100e456aac2f6be3d1cc85ac', 'common.real.name', 'Real Name', 'en', '2014-07-03 18:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('2d70c1a8158b415b9aff12e1957c1819', 'common.repeat.password', 'Repeat Password', 'en', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('2fe5274af5d94fb49240d82b7b8d2a95', 'common.tel', 'Telephone', 'en', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('3db54b3731434dc38bc5ea3b20de7db8', 'common.middle', 'Middle', 'en', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402831814d8a1ae0014d8a239f520001', 'common.unlock.user', '婵娲荤敤鎴', 'zh-cn', '2015-05-25 16:14:59', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402831814d8a1ae0014d8a2402d40003', 'common.unlock.user', 'unlock user', 'en', '2015-05-25 16:15:25', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('4028808847f3e70d0147f3eb326b0005', 'funcType', '鑿滃崟绫诲瀷', 'zh-cn', '2014-08-20 22:56:23', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('4028808847f3e70d0147f3eb9f400007', 'funcType', 'funcType', 'en', '2014-08-20 22:56:51', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('4028808847f3e70d0147f3ef30570009', 'funcType.page', '鑿滃崟绫诲瀷', 'zh-cn', '2014-08-20 23:00:44', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-08-23 01:48:20', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028808847f3e70d0147f3ef5482000b', 'funcType.page', 'menu type', 'en', '2014-08-20 23:00:54', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-08-23 01:48:29', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028808847f3e70d0147f3ef8590000d', 'funcType.from', 'access type', 'en', '2014-08-20 23:01:06', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-08-23 01:49:57', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028808847f3e70d0147f3efcd02000f', 'funcType.from', '璁块棶绫诲瀷', 'zh-cn', '2014-08-20 23:01:24', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-08-23 01:50:07', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028808847f972bb0147f9749a7b0003', 'operationType.disabled', 'disabled', 'en', '2014-08-22 00:44:34', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('4028808847f972bb0147f974dc860005', 'operationType.disabled', '绂佺敤', 'zh-cn', '2014-08-22 00:44:51', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('4028808847f972bb0147f9754c030007', 'common.enable', '鏈夋晥', 'zh-cn', '2014-08-22 00:45:19', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('4028808847f972bb0147f97581920009', 'common.enable', 'enable', 'en', '2014-08-22 00:45:33', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('4028808847f972bb0147f975c3c8000b', 'common.disable', '鏃犳晥', 'zh-cn', '2014-08-22 00:45:50', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('4028808847f972bb0147f97612a1000d', 'common.disable', 'disable', 'en', '2014-08-22 00:46:10', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e447e9ba550147e9be3a3a0003', 'common.rang', '{0}Operate name should be {1}-{2} characters', 'en', '2014-08-18 23:31:03', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-08-18 23:32:00', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e447e9ba550147e9bf9eaa0006', 'common.rang', '{0}鑼冨洿{1}~{2}浣嶅瓧绗', 'zh-cn', '2014-08-18 23:32:35', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e447e9ba550147e9c1ab590008', 'departmentname.rang1to20', 'Depart name should be 1-20 characters', 'en', '2014-08-18 23:34:49', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e447e9ba550147e9c25bbe000a', 'departmentname.rang1to20', '缁勭粐鏈烘瀯鑼冨洿1~20浣嶅瓧绗', 'zh-cn', '2014-08-18 23:35:34', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e4489db6e601489dbc2cdc0001', 'common.add.to', 'AddTo', 'en', '2014-09-22 22:20:28', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e4489db6e601489dbc61380003', 'common.add.to', '娣诲姞', 'zh-cn', '2014-09-22 22:20:41', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca9014705eee9120001', 'user.analysis.line', 'User analysis Line', 'en', '2014-07-05 17:50:49', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca9014705f1741c0003', 'user.analysis.line', '鐢ㄦ埛鍒嗘瀽 Line', 'zh-cn', '2014-07-05 17:53:35', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca9014705f535a50005', 'user.analysis.pie', 'User analysis Pie', 'en', '2014-07-05 17:57:41', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca9014705f597d10007', 'user.analysis.pie', '鐢ㄦ埛鍒嗘瀽 Pie', 'zh-cn', '2014-07-05 17:58:07', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca9014705f82a580009', 'user.analysis.histogram', 'User Analysis Histogram', 'en', '2014-07-05 18:00:55', '402880e64705a8ce014705af94280052', 'admin', '2014-07-21 10:08:08', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca9014705fc8656000b', 'user.browser.analysis', ' Analysis of the user\'s browser proportion', 'en', '2014-07-05 18:05:41', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca9014705fce72d000d', 'user.browser.analysis', '鐢ㄦ埛娴忚鍣ㄦ瘮渚嬪垎鏋', 'zh-cn', '2014-07-05 18:06:06', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca901470608088c000f', 'class.student.count.analysis', 'Class student ratio analysis', 'en', '2014-07-05 18:18:15', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca9014706088d7c0011', 'class.student.count.analysis', '鐝骇瀛︾敓浜烘暟姣斾緥鍒嗘瀽', 'zh-cn', '2014-07-05 18:18:49', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147060a873a0013', 'common.line.chart', 'Line chart', 'en', '2014-07-05 18:20:59', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147060aef730015', 'common.line.chart', '鎶樼嚎鍥', 'zh-cn', '2014-07-05 18:21:25', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147060bfcae0017', 'common.pie.chart', 'pie', 'en', '2014-07-05 18:22:34', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147060c5e310019', 'common.pie.chart', '楗肩姸鍥', 'zh-cn', '2014-07-05 18:22:59', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147060dc6b6001b', 'common.histogram', 'Histogram', 'en', '2014-07-05 18:24:31', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147060e11f3001d', 'common.histogram', '鏌辩姸鍥', 'zh-cn', '2014-07-05 18:24:51', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147060fa1ba001f', 'class.count.statistics', 'Class size statistics', 'en', '2014-07-05 18:26:33', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147060fdf3a0021', 'class.count.statistics', '鐝骇浜烘暟缁熻', 'zh-cn', '2014-07-05 18:26:49', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451230', 'common.query.statistics', '缁熻鏌ヨ', 'zh-cn', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451231', 'common.query.statistics', 'Statistics Query', 'en', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451232', 'common.schedule.task', '瀹氭椂浠诲姟', 'zh-cn', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451233', 'common.schedule.task', 'Timed Task', 'en', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451234', 'system.log', '绯荤粺鏃ュ織', 'zh-cn', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451235', 'system.log', 'Sys Log', 'en', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451236', 'data.monitor', '鏁版嵁鐩戞帶', 'zh-cn', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451237', 'data.monitor', 'Data Monitor', 'en', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451238', 'form.config', '琛ㄥ崟閰嶇疆', 'zh-cn', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451239', 'form.config', 'Form Config', 'en', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451240', 'dynamic.form.config', '鍔ㄦ佹姤琛ㄩ厤缃', 'zh-cn', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451241', 'dynamic.form.config', 'Dynamic Report Config', 'en', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451242', 'user.analysis', '鐢ㄦ埛鍒嗘瀽', 'zh-cn', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061123451243', 'user.analysis', 'User Analysis', 'en', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061365350027', 'lang.class', 'Class', 'en', '2014-07-05 18:30:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-20 11:56:18', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca901470614932d0029', 'lang.class', '鐝骇', 'zh-cn', '2014-07-05 18:31:57', '402880e64705a8ce014705af94280052', 'admin', '2014-07-20 11:56:24', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca9014706152c0a002b', 'number.ofpeople', ' Number of people', 'en', '2014-07-05 18:32:36', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca901470615588b002d', 'number.ofpeople', '浜烘暟', 'zh-cn', '2014-07-05 18:32:48', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca901470615f986002f', 'common.proportion', 'Proportion', 'en', '2014-07-05 18:33:29', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e64705eca90147061627450031', 'common.proportion', '姣斾緥', 'zh-cn', '2014-07-05 18:33:40', '402880e64705a8ce014705af94280052', 'admin', '2014-07-04 23:17:44', '297e201046d3660a0146d36d7b7a01e7', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e74c5e73f5014c5e80548f0001', 'user.report', '缁煎悎鎶ヨ〃', 'zh-cn', '2015-03-28 11:50:10', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e74c5e73f5014c5e809f9d0003', 'user.report', 'newReport', 'en', '2015-03-28 11:50:30', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e74c6084c9014c609276500002', 'common.start', '鍚姩', 'zh-cn', '2015-03-28 21:29:13', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e74c6084c9014c60929d5b0004', 'start', 'common.start', 'en', '2015-03-28 21:29:23', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e74c7a776c014c7a8121980004', 'operate.manage.data', '鏁版嵁鏉冮檺鎺у埗', 'zh-cn', '2015-04-02 22:20:25', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e74c7a776c014c7a817cd30006', 'operate.manage.data', 'Data access control', 'en', '2015-04-02 22:20:48', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e74c7a776c014c7a8c8c860010', 'operation.type', 'rule type', 'en', '2015-04-02 22:32:53', 'admin', '绠$悊鍛', '2015-04-02 22:34:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e74c7a776c014c7a8cb6290012', 'operation.type', '瑙勫垯绫诲瀷', 'zh-cn', '2015-04-02 22:33:04', 'admin', '绠$悊鍛', '2015-04-02 22:34:06', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402880e74d762a40014d76332b370003', 'rolescope.rang2to8.notnull', 'Role need 2~8 bits', 'en', '2015-05-21 19:19:34', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e74d762a40014d7633a30c0005', 'rolescope.rang2to8.notnull', '瑙掕壊鑼冨洿鍦2~8浣嶅瓧绗', 'zh-cn', '2015-05-21 19:20:05', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e74d762a40014d76342eb00007', 'rolecode.rang2to15.notnull', '瑙掕壊缂栫爜鑼冨洿鍦2~15浣嶅瓧绗', 'zh-cn', '2015-05-21 19:20:40', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402880e74d762a40014d76348d970009', 'rolecode.rang2to15.notnull', 'Rolecode need 2~15 bits', 'en', '2015-05-21 19:21:05', 'admin', '绠$悊鍛', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728d95a014728dc0fdf0005', 'has.sync', '宸插悓姝', 'zh-cn', '2014-07-12 12:36:56', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 12:36:56', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728d95a014728dcc32c0007', 'has.sync', 'Synchronized', 'en', '2014-07-12 12:37:42', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:10:45', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728d95a014728dd29140009', 'have.nosync', '鏈悓姝', 'zh-cn', '2014-07-12 12:38:08', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 12:38:08', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728d95a014728dd8161000b', 'have.nosync', 'No Synchronize', 'en', '2014-07-12 12:38:31', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 12:38:31', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728d95a014728dfe5610013', 'single.table', '鍗曡〃', 'zh-cn', '2014-07-12 12:41:07', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 12:41:07', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728d95a014728e0077e0015', 'single.table', 'Single Table', 'en', '2014-07-12 12:41:16', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 12:41:16', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728d95a014728e0f6500017', 'slave.table', '闄勮〃', 'zh-cn', '2014-07-12 12:42:17', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 12:42:17', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728d95a014728e1183d0019', 'slave.table', 'Slave Table', 'en', '2014-07-12 12:42:26', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 12:42:26', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa28014728fd5f160003', 'smart.form.setting', '鏅鸿兘琛ㄥ崟閰嶇疆', 'zh-cn', '2014-07-12 13:13:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:13:19', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa28014728fd89ff0005', 'smart.form.setting', 'Smart Form Setting', 'en', '2014-07-12 13:13:30', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:13:30', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa28014728feca7b0007', 'generate.form', '鐢熸垚琛ㄥ崟', 'zh-cn', '2014-07-12 13:14:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:14:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa28014728feedfa0009', 'generate.form', 'Generate Form', 'en', '2014-07-12 13:15:01', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:15:01', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa28014728ff5a4e000b', 'generate.success', '鐢熸垚鎴愬姛', 'zh-cn', '2014-07-12 13:15:29', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:15:29', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa28014728ff7e81000d', 'generate.success', 'Generate Success', 'en', '2014-07-12 13:15:38', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:15:38', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa2801472900fe10000f', 'please.select.generate.item', '璇烽夋嫨瑕佺敓鎴愯〃鍗曠殑椤!', 'zh-cn', '2014-07-12 13:17:16', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:17:16', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa2801472901dab10011', 'please.select.generate.item', 'Please select should be generated item.', 'en', '2014-07-12 13:18:13', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:18:13', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa280147290fad990013', 'button.code', '鎸夐挳缂栫爜', 'zh-cn', '2014-07-12 13:33:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:33:19', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa280147290fcac30015', 'button.code', 'Button Code', 'en', '2014-07-12 13:33:26', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:33:26', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa2801472910045f0017', 'button.name', '鎸夐挳鍚嶇О', 'zh-cn', '2014-07-12 13:33:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:33:41', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa28014729101a4a0019', 'button.name', 'Button Name', 'en', '2014-07-12 13:33:46', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:33:46', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa280147291059ca001b', 'button.style', '鎸夐挳鏍峰紡', 'zh-cn', '2014-07-12 13:34:03', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:34:03', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa2801472910776c001d', 'button.style', 'Button Style', 'en', '2014-07-12 13:34:10', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:34:10', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa2801472910a634001f', 'action.type', '鍔ㄤ綔绫诲瀷', 'zh-cn', '2014-07-12 13:34:22', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:34:22', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881034728fa2801472910bdd70021', 'action.type', 'Action Type', 'en', '2014-07-12 13:34:28', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 13:34:28', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c730147293008280009', 'super.admin', '瓒呯骇绠$悊鍛', 'zh-cn', '2014-07-12 14:08:39', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:08:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c730147293021c7000b', 'super.admin', 'Super Admin', 'en', '2014-07-12 14:08:46', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:08:46', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c73014729308a0e000d', 'please.select.lock.item', '璇烽夋嫨閿佸畾椤圭洰', 'zh-cn', '2014-07-12 14:09:12', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:09:12', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c7301472930ae9e000f', 'please.select.lock.item', 'Please select locked item', 'en', '2014-07-12 14:09:22', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:09:22', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c7301472931c5900011', 'is.confirm', '纭畾鍚', 'zh-cn', '2014-07-12 14:10:33', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:10:33', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c73014729320e310013', 'is.confirm', 'Confirm?', 'en', '2014-07-12 14:10:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:10:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c73014729369dde0015', 'current.permission', '褰撳墠鏉冮檺', 'zh-cn', '2014-07-12 14:15:51', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:15:51', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c7301472936c80f0017', 'current.permission', 'Current Permission', 'en', '2014-07-12 14:16:01', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:16:01', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c73014729386dce0019', 'confirm.delete.this.record', '纭畾鍒犻櫎璇ヨ褰曞悧', 'zh-cn', '2014-07-12 14:17:49', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:17:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c7301472938c6f9001b', 'confirm.delete.this.record', 'Delete this record, Confirm?', 'en', '2014-07-12 14:18:12', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:18:12', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c7301472939f98b001d', 'menu.list', '鑿滃崟鍒楄〃', 'zh-cn', '2014-07-12 14:19:31', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:19:31', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c730147293a157d001f', 'menu.list', 'Menu List', 'en', '2014-07-12 14:19:38', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:19:38', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c730147293ab7a10021', 'operate.button.list', '绮剧粏鍖栨潈闄愭帶鍒', 'zh-cn', '2014-07-12 14:20:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-04-02 22:25:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c730147293aefc40023', 'operate.button.list', 'Fine access control', 'en', '2014-07-12 14:20:34', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-04-02 22:25:56', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c730147293b76f80025', 'select.all', '鍏ㄩ', 'zh-cn', '2014-07-12 14:21:08', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:21:08', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810347292c730147293b8dc60027', 'select.all', 'Select All', 'en', '2014-07-12 14:21:14', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-12 14:21:14', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('40288103472948880147294b26420002', 'button.setting', '椤甸潰鎺т欢鏉冮檺', 'zh-cn', '2014-07-12 14:38:16', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-04-02 22:12:27', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('40288103472948880147294b432a0004', 'button.setting', 'Page control config', 'en', '2014-07-12 14:38:24', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-04-02 20:06:10', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf3de950001', 'common.button.code', '鎸夐挳缂栫爜', 'zh-cn', '2014-07-19 12:49:16', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:49:16', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf407a90003', 'common.button.code', 'Button Code', 'en', '2014-07-19 12:49:26', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:49:26', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf46f7f0005', 'common.button.name', '鎸夐挳鍚嶇О', 'zh-cn', '2014-07-19 12:49:53', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:49:53', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf4994d0007', 'common.button.name', 'Button Name', 'en', '2014-07-19 12:50:04', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:50:04', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf4f6430009', 'common.button.style', '鎸夐挳鏍峰紡', 'zh-cn', '2014-07-19 12:50:28', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:50:28', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf517aa000b', 'common.button.style', 'Button Style', 'en', '2014-07-19 12:50:36', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:50:36', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf5930c000d', 'common.action.type', '鍔ㄤ綔绫诲瀷', 'zh-cn', '2014-07-19 12:51:08', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:51:08', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf5af11000f', 'common.action.type', 'Action Type', 'en', '2014-07-19 12:51:15', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:51:15', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf652c20011', 'common.show.sequence', 'Show Sequence', 'en', '2014-07-19 12:51:57', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:04:07', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf694a20013', 'common.show.sequence', '鏄剧ず椤哄簭', 'zh-cn', '2014-07-19 12:52:14', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:52:14', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf6fa160015', 'common.show.icon.style', '鏄剧ず鍥炬爣鏍峰紡', 'zh-cn', '2014-07-19 12:52:40', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:52:40', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf71da40017', 'common.show.icon.style', 'Show Icon Style', 'en', '2014-07-19 12:52:49', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:52:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf776390019', 'common.show.expression', '鏄剧ず琛ㄨ揪寮', 'zh-cn', '2014-07-19 12:53:11', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:53:11', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474cf7972c001b', 'common.show.expression', 'Show Expression', 'en', '2014-07-19 12:53:20', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 12:53:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474d025ae20024', 'lang.code.cannot.add.update.delete', '缂栫爜涓嶈兘鏄痑dd/update/delete', 'zh-cn', '2014-07-19 13:05:05', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:05:05', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474cecc301474d0294e30026', 'lang.code.cannot.add.update.delete', 'Code cannot be add/update/delete', 'en', '2014-07-19 13:05:20', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:05:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d28a1fe0002', 'lang.user.online', '浜哄湪绾', 'zh-cn', '2014-07-19 13:46:54', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:46:54', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d28cef50004', 'lang.user.online', 'user online', 'en', '2014-07-19 13:47:05', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:47:05', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d2cc7d80006', 'common.login.name', '鐧诲綍鍚', 'zh-cn', '2014-07-19 13:51:26', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:51:26', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d2cf5650008', 'common.login.name', 'Login Name', 'en', '2014-07-19 13:51:37', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:51:37', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d2ed970000a', 'common.login.time', '鐧诲綍鏃堕棿', 'zh-cn', '2014-07-19 13:53:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:53:41', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d2f0340000c', 'common.login.time', 'Login Time', 'en', '2014-07-19 13:53:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:53:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d2f0340001c', 'common.enter.verifycode', '璇疯緭鍏ラ獙璇佺爜', 'zh-cn', '2014-07-19 13:53:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:53:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d2f0340002c', 'common.verifycode.error', '楠岃瘉鐮侀敊璇', 'zh-cn', '2014-07-19 13:53:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:53:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d2f0340003c', 'common.username.or.password.error', '鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒', 'zh-cn', '2014-07-19 13:53:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:53:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d2f0340004c', 'common.enter.verifycode', 'Please enter the verification code', 'en', '2014-07-19 13:53:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:53:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d2f0340005c', 'common.verifycode.error', 'Verification code error', 'en', '2014-07-19 13:53:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:53:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d2f0340006c', 'common.username.or.password.error', 'User name or password error', 'en', '2014-07-19 13:53:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 13:53:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d3ad8c9000f', 'common.select', '閫夋嫨', 'zh-cn', '2014-07-19 14:06:48', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 14:06:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d3b14bb0011', 'common.select', 'Select', 'en', '2014-07-19 14:07:03', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 14:07:03', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d3b61020013', 'common.clear', '娓呯┖', 'zh-cn', '2014-07-19 14:07:22', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 14:07:22', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028810b474d25ab01474d3b78f30015', 'common.clear', 'Clear', 'en', '2014-07-19 14:07:29', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-19 14:07:29', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028813f4752b0d7014752b35e4f0001', 'username.rang2to10', 'Username need 2~10 bits', 'en', '2014-07-20 15:36:32', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-20 15:36:32', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028813f4752c793014752cd3369000a', 'common.delete.success.param', '{0}鍒犻櫎鎴愬姛', 'zh-cn', '2014-07-20 16:04:45', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-20 16:04:45', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028813f4752dc11014752e731930003', 'lang.dictionary.type', '瀛楀吀鍒嗙被', 'zh-cn', '2014-07-20 16:33:09', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-20 16:33:09', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028813f4752dc11014752e765dd0005', 'lang.dictionary.type', 'Dictionary Type', 'en', '2014-07-20 16:33:22', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-20 16:33:22', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028813f4752dc11014752e98bf90007', 'lang.dictionary.value', '瀛楀吀鍊', 'zh-cn', '2014-07-20 16:35:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-20 16:35:43', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028813f4752dc11014752e9eba60009', 'lang.dictionary.value', 'Dictionary Value', 'en', '2014-07-20 16:36:07', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 14:06:50', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f793fd690016', 'common.taskid', 'Task Id', 'en', '2014-07-02 22:56:50', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:41:28', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f794259e0018', 'common.taskid', '浠诲姟ID', 'zh-cn', '2014-07-02 22:57:00', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:19:13', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7949e2d001a', 'common.task.desc', '浠诲姟鎻忚堪', 'zh-cn', '2014-07-02 22:57:31', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-03 12:37:08', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f794d224001c', 'common.task.desc', 'Task Describe', 'en', '2014-07-02 22:57:44', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:41:38', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f79550c4001e', 'cron.expression', 'cron琛ㄨ揪寮', 'zh-cn', '2014-07-02 22:58:16', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:22:37', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7956b7b0020', 'cron.expression', 'Cron Expression', 'en', '2014-07-02 22:58:23', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:41:44', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f795c74b0022', 'common.iseffect', '鏄惁鐢熸晥', 'zh-cn', '2014-07-02 22:58:47', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:22:58', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f79643cc0024', 'common.iseffect', 'isEffect', 'en', '2014-07-02 22:59:19', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:23:03', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f796fbd60026', 'running.state', '杩愯鐘舵', 'zh-cn', '2014-07-02 23:00:06', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:23:19', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f79729ce0028', 'running.state', 'Running State', 'en', '2014-07-02 23:00:17', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:41:52', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f798b8850034', 'common.createby', 'Create By', 'en', '2014-07-02 23:02:00', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:41:58', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f798f9cf0036', 'common.createby', '鍒涘缓浜', 'zh-cn', '2014-07-02 23:02:16', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:23:44', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7999ffd003c', 'common.updateby', 'Update By', 'en', '2014-07-02 23:02:59', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:42:12', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f799e7e9003e', 'common.updateby', '淇敼浜', 'zh-cn', '2014-07-02 23:03:17', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:24:30', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f79a3aed0040', 'common.updatetime', '淇敼鏃堕棿', 'zh-cn', '2014-07-02 23:03:38', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:24:47', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f79a6c310042', 'common.updatetime', 'Update Time', 'en', '2014-07-02 23:03:51', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:42:21', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f79b70e90044', 'common.operation', 'Operation', 'en', '2014-07-02 23:04:58', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:42:27', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f79b9eef0046', 'common.operation', '鎿嶄綔', 'zh-cn', '2014-07-02 23:05:10', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:25:17', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f79d8ea10048', 'common.start', 'Start', 'en', '2014-07-02 23:07:17', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:42:32', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f79e5f54004c', 'common.stop', 'Stop', 'en', '2014-07-02 23:08:10', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:42:38', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f79e7be9004e', 'common.stop', '鍋滄', 'zh-cn', '2014-07-02 23:08:17', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:26:27', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f79faa1d0050', 'effective.immediately', 'Effective Immediately', 'en', '2014-07-02 23:09:35', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:26:35', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f79fcc7f0052', 'effective.immediately', '绔嬪嵆鐢熸晥', 'zh-cn', '2014-07-02 23:09:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:26:39', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7a011b60054', 'common.delete', 'Delete', 'en', '2014-07-02 23:10:01', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:42:44', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7a02ccc0056', 'common.delete', '鍒犻櫎', 'zh-cn', '2014-07-02 23:10:08', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:26:55', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7a0da820059', 'common.add', 'Add', 'en', '2014-07-02 23:10:53', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:42:57', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7a106cf005b', 'common.add', '褰曞叆', 'zh-cn', '2014-07-02 23:11:04', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:13', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7a1500f005d', 'common.edit', 'Edit', 'en', '2014-07-02 23:11:23', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:43:04', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7a16f90005f', 'common.edit', '缂栬緫', 'zh-cn', '2014-07-02 23:11:31', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:24', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7a186c20061', 'common.view', 'View', 'en', '2014-07-02 23:11:37', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:43:09', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7a1aa900063', 'common.view', '鏌ョ湅', 'zh-cn', '2014-07-02 23:11:46', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:36', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7a44eb60065', 'schedule.task.manage', 'Timed Task Manage', 'en', '2014-07-02 23:14:39', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:28:08', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7a471110067', 'schedule.task.manage', '瀹氭椂浠诲姟绠$悊', 'zh-cn', '2014-07-02 23:14:48', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7b7f88700a0', 'log.content', 'Log Content', 'en', '2014-07-02 23:36:08', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:41:04', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7b828ee00a2', 'log.content', '鏃ュ織鍐呭', 'zh-cn', '2014-07-02 23:36:20', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7b932f600a4', 'operate.ip', 'Operate IP', 'en', '2014-07-02 23:37:28', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:43:30', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7b9677100a6', 'operate.ip', '鎿嶄綔IP', 'zh-cn', '2014-07-02 23:37:41', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7b9bd7d00a8', 'common.browser', 'Broswer', 'en', '2014-07-02 23:38:04', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:43:36', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7b9f40a00aa', 'common.browser', '娴忚鍣', 'zh-cn', '2014-07-02 23:38:17', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7ba2e7e00ac', 'operate.time', 'Operate Time', 'en', '2014-07-02 23:38:32', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:43:44', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7ba610e00ae', 'operate.time', '鎿嶄綔鏃堕棿', 'zh-cn', '2014-07-02 23:38:45', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7bb601a00b0', 'log.manage', 'Log Manage', 'en', '2014-07-02 23:39:51', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7bb7ef200b2', 'log.manage', '鏃ュ織绠$悊', 'zh-cn', '2014-07-02 23:39:59', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7bbef3600b4', 'log.level', 'Log Level', 'en', '2014-07-02 23:40:27', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7c012cd00cc', 'select.loglevel', 'Please select log level', 'en', '2014-07-02 23:44:59', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7c086ff00ce', 'select.loglevel', '閫夋嫨鏃ュ織绫诲瀷', 'zh-cn', '2014-07-02 23:45:28', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7c0c98a00d0', 'common.login', 'Login', 'en', '2014-07-02 23:45:45', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7c0ecb900d2', 'common.login', '鐧诲綍', 'zh-cn', '2014-07-02 23:45:54', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7c287de00d9', 'common.insert', 'Insert', 'en', '2014-07-02 23:47:40', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7c2a1f200db', 'common.insert', '鎻掑叆', 'zh-cn', '2014-07-02 23:47:46', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7c4ad4600e1', 'common.update', 'Update', 'en', '2014-07-02 23:50:00', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7c4dc8700e3', 'common.update', '鏇存柊', 'zh-cn', '2014-07-02 23:50:12', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7c5815c00e5', 'common.upload', 'Upload', 'en', '2014-07-02 23:50:55', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7c5a60600e7', 'common.upload', '涓婁紶', 'zh-cn', '2014-07-02 23:51:04', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7c5fd5700e9', 'common.other', 'Other', 'en', '2014-07-02 23:51:26', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46f7832b0146f7c62c2400eb', 'common.other', '鍏朵粬', 'zh-cn', '2014-07-02 23:51:38', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028818d46fa75be0146fa855c60000e', 'log.level', '鏃ュ織绫诲瀷', 'zh-cn', '2014-07-03 12:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046efce8d0146effd3b0a0001', 'common.language', '璇█', 'zh-cn', '2014-07-01 11:34:48', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 11:41:20', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046efce8d0146effd5d980003', 'language', 'Languge', 'en', '2014-07-01 11:34:57', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-01 12:01:46', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046efce8d0146f001f7cd0007', 'common.delete.success.param', '{0} delete success', 'en', '2014-07-01 11:39:59', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-01 11:40:26', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046efce8d0146f00e2152000b', 'common.edit.success.param', '{0} 鏇存柊鎴愬姛', 'zh-cn', '2014-07-01 11:53:16', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-01 12:17:01', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046efce8d0146f00f05aa000d', 'common.edit.success.param', '{0} update success', 'en', '2014-07-01 11:54:14', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-20 16:03:05', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046efce8d0146f01110bc000f', 'common.add.success.param', '{0} 褰曞叆鎴愬姛', 'zh-cn', '2014-07-01 11:56:28', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-01 11:56:28', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046efce8d0146f01153070011', 'common.add.success.param', '{0} add success', 'en', '2014-07-01 11:56:45', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-01 11:56:45', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046f02a3f0146f02d9e910002', 'common.refresh.success', '鍒锋柊鎴愬姛', 'zh-cn', '2014-07-01 12:27:40', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-01 12:27:40', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046f02a3f0146f02df49c0004', 'common.refresh.success', 'Refresh success', 'en', '2014-07-01 12:28:02', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-01 12:28:02', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046f02a3f0146f0301b150006', 'common.edit.fail.param', '{0} 鏇存柊澶辫触', 'zh-cn', '2014-07-01 12:30:22', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-01 12:30:22', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046f02a3f0146f030cde00008', 'common.edit.fail.param', '{0} update fail', 'en', '2014-07-01 12:31:08', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-01 12:31:08', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046f02a3f0146f0346009000a', 'common.refresh.fail', '鍒锋柊澶辫触', 'zh-cn', '2014-07-01 12:35:02', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-01 12:35:02', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c046f02a3f0146f0348bc9000c', 'common.refresh.fail', 'Refresh Fail', 'en', '2014-07-01 12:35:13', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-01 12:35:13', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147063dc2080001', 'database.property', '鏁版嵁搴撳睘鎬', 'zh-cn', '2014-07-05 19:16:56', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:16:56', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147063e03aa0003', 'database.property', 'Database Property', 'en', '2014-07-05 19:17:13', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:17:13', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147063e73640005', 'page.property', '椤甸潰灞炴', 'zh-cn', '2014-07-05 19:17:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:17:41', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147063e910c0007', 'page.property', 'Page Property', 'en', '2014-07-05 19:17:49', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:17:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147063f9a4a0009', 'validate.dict', 'Validate Dictionary', 'en', '2014-07-05 19:18:57', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:18:57', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147063fe101000b', 'validate.dict', '鏍¢獙瀛楀吀', 'zh-cn', '2014-07-05 19:19:15', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:19:15', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe014706408c51000d', 'common.fk', '澶栭敭', 'zh-cn', '2014-07-05 19:19:59', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:19:59', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147064102b0000f', 'common.fk', 'Foreign Key', 'en', '2014-07-05 19:20:29', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:20:29', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147065887a70011', 'smark.form.form.maintain', '鏅鸿兘琛ㄥ崟-琛ㄥ崟缁存姢', 'zh-cn', '2014-07-05 19:46:10', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:46:10', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe01470658c29d0013', 'smark.form.form.maintain', 'Smart Form', 'en', '2014-07-05 19:46:26', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:46:26', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147065a870d0015', 'common.one.to.many', '涓瀵瑰', 'zh-cn', '2014-07-05 19:48:21', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:48:21', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147065acd6d0017', 'common.one.to.many', 'One To Many', 'en', '2014-07-05 19:48:39', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:48:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147065c1d980019', 'comon.one.to.one', '涓瀵逛竴', 'zh-cn', '2014-07-05 19:50:05', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:50:05', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147065c3551001b', 'comon.one.to.one', 'One To One', 'en', '2014-07-05 19:50:12', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:50:12', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147066041eb001d', 'common.uuid36bit', 'UUID(36浣嶅敮涓缂栫爜)', 'zh-cn', '2014-07-05 19:54:37', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:54:37', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe01470660a327001f', 'common.uuid36bit', 'UUID(36 Bit Unique Code)', 'en', '2014-07-05 19:55:02', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:55:02', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe0147066267e70021', 'common.native.auto.increment', 'NATIVE(鑷闀挎柟寮)', 'zh-cn', '2014-07-05 19:56:58', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:56:58', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe01470662f1dd0023', 'common.native.auto.increment', 'NATIVE(Auto Increment)', 'en', '2014-07-05 19:57:33', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:57:33', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe01470663fbd00025', 'common.sequence', 'SEQUENCE(搴忓垪鏂瑰紡)', 'zh-cn', '2014-07-05 19:58:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:58:41', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe014706646c6b0027', 'common.sequence', 'SEQUENCE(Sequence)', 'en', '2014-07-05 19:59:10', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 19:59:19', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe014706669f32002a', 'please.input.table.name', '璇疯緭鍏ヨ〃鍚嶏紒', 'zh-cn', '2014-07-05 20:01:34', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 20:01:34', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c1470636fe01470666c8e8002c', 'please.input.table.name', 'Please Input Table Name', 'en', '2014-07-05 20:01:45', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-05 20:01:45', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c347203fcc0147204d69020009', 'input.error', '杈撳叆閿欒', 'zh-cn', '2014-07-10 20:44:09', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 20:44:09', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c347203fcc0147204d9ef9000b', 'input.error', 'Input error', 'en', '2014-07-10 20:44:23', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 20:44:23', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c347205fc0014720704aa50001', 'menuname.rang4to15', '鑿滃崟鍚嶇О鑼冨洿4~15浣嶅瓧绗,涓斾笉涓虹┖', 'zh-cn', '2014-07-10 21:22:15', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 21:22:15', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c347205fc0014720718d360003', 'menuname.rang4to15', 'Menu name should be 4-15 characters and should not empty', 'en', '2014-07-10 21:23:38', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 21:23:38', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c347205fc001472082f5130005', 'jeect.platform', 'Jeecg 蹇熷紑鍙戝钩鍙', 'zh-cn', '2014-07-10 21:42:39', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 21:42:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881c347205fc00147208321e10007', 'jeect.platform', 'Jeecg Quckly Platform', 'en', '2014-07-10 21:42:50', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 21:42:50', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f486df0146f49af73f0001', 'pk.strategies', 'Primary key strategies', 'en', '2014-07-02 09:05:35', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 09:05:35', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f486df0146f49c57320003', 'pk.strategies', '涓婚敭绛栫暐', 'zh-cn', '2014-07-02 09:07:05', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 09:07:05', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f5f492d60001', 'table.name', '琛ㄥ悕', 'zh-cn', '2014-07-02 15:23:04', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 15:23:04', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f5f4b8fe0003', 'table.name', 'Table Name', 'en', '2014-07-02 15:23:14', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 15:23:14', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f5f536b50005', 'table.description', 'Table Desc', 'en', '2014-07-02 15:23:46', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-21 10:16:11', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f5f56e0d0007', 'table.description', '琛ㄦ弿杩', 'zh-cn', '2014-07-02 15:24:00', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-21 10:16:15', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f5f648c00009', 'table.type', 'Table Type', 'en', '2014-07-02 15:24:56', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 15:24:56', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f5f672b6000b', 'table.type', '琛ㄧ被鍨', 'zh-cn', '2014-07-02 15:25:07', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 15:25:07', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f61534a0000d', 'sequence.name', 'Sequence Name', 'en', '2014-07-02 15:58:43', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 15:58:43', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f621503b0019', 'master.table', '涓昏〃', 'zh-cn', '2014-07-02 16:11:56', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:11:56', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f621dddd001b', 'master.table', 'Master Table', 'en', '2014-07-02 16:12:33', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:12:33', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f6279e0f001d', 'common.yes', 'Yes', 'en', '2014-07-02 16:18:50', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:18:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f627cd1f001f', 'common.yes', '鏄', 'zh-cn', '2014-07-02 16:19:02', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:19:02', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f627f2040021', 'common.no', 'No', 'en', '2014-07-02 16:19:11', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:19:11', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f6281f900023', 'common.no', '鍚', 'zh-cn', '2014-07-02 16:19:23', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:19:23', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f62fe8800025', 'single.query', 'Single Choice Query', 'en', '2014-07-02 16:27:53', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:27:53', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f6302a9f0027', 'single.query', '鍗曡〃鏌ヨ', 'zh-cn', '2014-07-02 16:28:10', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:28:10', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f630e67d0029', 'combine.query', '缁勫悎鏌ヨ', 'zh-cn', '2014-07-02 16:28:58', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:28:58', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f6312721002b', 'combine.query', 'Combined Query', 'en', '2014-07-02 16:29:14', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:29:14', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f6422c510036', 'common.isnull', 'Is Null', 'en', '2014-07-02 16:47:50', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:47:50', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f6428fd00038', 'common.isnull', '鏄惁涓虹┖', 'zh-cn', '2014-07-02 16:48:15', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:48:15', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f642e30f003a', 'common.pk', 'Primary Key', 'en', '2014-07-02 16:48:37', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:48:37', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f64311fb003c', 'common.pk', '涓婚敭', 'zh-cn', '2014-07-02 16:48:49', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:48:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f6457894003e', 'field.type', 'Filed Type', 'en', '2014-07-02 16:51:26', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:51:26', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e446f5ec0b0146f6459cd30040', 'field.type', '瀛楁绫诲瀷', 'zh-cn', '2014-07-02 16:51:35', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 16:51:35', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146eca464640011', 'common.version', 'Version', 'en', '2014-06-30 19:58:55', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 19:58:55', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146eca47e280013', 'common.version', '鐗堟湰', 'zh-cn', '2014-06-30 19:59:01', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 19:59:01', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146eca4b6bf0015', 'is.tree', 'Is Tree', 'en', '2014-06-30 19:59:16', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 19:59:16', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146eca4d8ba0017', 'is.tree', '鏄惁鏍', 'zh-cn', '2014-06-30 19:59:24', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 19:59:24', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146eca510d60019', 'is.page', 'Is Page', 'en', '2014-06-30 19:59:39', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 19:59:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146eca537b7001b', 'is.page', '鏄惁鍒嗛〉', 'zh-cn', '2014-06-30 19:59:49', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 19:59:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146eca6c3b8001d', 'sync.db', 'Sync DB', 'en', '2014-06-30 20:01:30', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:01:30', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146eca7193f001f', 'sync.db', '鍚屾鏁版嵁搴', 'zh-cn', '2014-06-30 20:01:52', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:01:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146eca922890025', 'common.createtime', 'Create Time', 'en', '2014-06-30 20:04:05', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:04:05', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecab61a50033', 'common.createtime', '鍒涘缓鏃堕棿', 'zh-cn', '2014-06-30 20:06:33', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:53:48', '402881e946e70d550146e70fa0680086', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecac51520039', 'show.checkbox', 'Show Checkbox', 'en', '2014-06-30 20:07:34', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:07:34', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecac8bed003b', 'show.checkbox', '鏄剧ず澶嶉夋', 'zh-cn', '2014-06-30 20:07:49', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:07:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecaea5630041', 'edit.form', 'Edit Table', 'en', '2014-06-30 20:10:07', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:10:07', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecaed7730043', 'edit.form', '缂栬緫琛ㄥ崟', 'zh-cn', '2014-06-30 20:10:19', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:10:19', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecaf39000045', 'create.form', 'Create From', 'en', '2014-06-30 20:10:44', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:10:44', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecaf63e00047', 'create.form', '鍒涘缓琛ㄥ崟', 'zh-cn', '2014-06-30 20:10:55', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:10:55', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecb108de0049', 'custom.button', 'Custom Button', 'en', '2014-06-30 20:12:43', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:12:43', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecb18fa6004b', 'custom.button', '鑷畾涔夋寜閽', 'zh-cn', '2014-06-30 20:13:18', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:13:31', '402881e946e70d550146e70fa0680086', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecb3bd13004e', 'form.generate', 'Generated From From DB', 'en', '2014-06-30 20:15:40', '402881e946e70d550146e70fa0680086', 'admin', '2014-09-15 11:28:33', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecb3f9df0050', 'form.generate', '鏁版嵁搴撳鍏ヨ〃鍗', 'zh-cn', '2014-06-30 20:15:56', '402881e946e70d550146e70fa0680086', 'admin', '2014-09-15 11:28:19', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecb58ed40052', 'form.import', '琛ㄥ崟瀵煎叆', 'zh-cn', '2014-06-30 20:17:40', '402881e946e70d550146e70fa0680086', 'admin', '2014-09-15 11:28:01', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecb5a76b0054', 'form.import', 'From Import', 'en', '2014-06-30 20:17:46', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:17:46', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecb72e600056', 'form.export', 'From Export', 'en', '2014-06-30 20:19:26', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:19:26', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecb762b50058', 'form.export', '琛ㄥ崟瀵煎嚭', 'zh-cn', '2014-06-30 20:19:39', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:40:55', '402881e946e70d550146e70fa0680086', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecc71340005a', 'js.enhance', 'JsEnhance', 'en', '2014-06-30 20:36:48', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:36:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecc74476005c', 'js.enhance', 'js澧炲己', 'zh-cn', '2014-06-30 20:37:00', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:37:00', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecca27d20062', 'sql.enhance', 'SqlEnhance', 'en', '2014-06-30 20:40:09', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:40:09', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecca51c60064', 'sql.enhance', 'sql澧炲己', 'zh-cn', '2014-06-30 20:40:20', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:40:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecd312230068', 'smart.form.config', 'Smart Form Config', 'en', '2014-06-30 20:49:54', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:49:54', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946eca0a40146ecd3732a006a', 'smart.form.config', '鍙兘琛ㄥ崟閰嶇疆', 'zh-cn', '2014-06-30 20:50:19', '402881e946e70d550146e70fa0680086', 'admin', '2014-06-30 20:50:19', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946f723300146f728bca20001', 'common.code', 'Code', 'en', '2014-07-02 20:59:40', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 20:59:40', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946f723300146f728e6220003', 'common.code', '缂栫爜', 'zh-cn', '2014-07-02 20:59:51', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 20:59:51', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946f723300146f72b42b40015', 'common.batch.delete', 'Batch Delete', 'en', '2014-07-02 21:02:25', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 21:02:25', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946f723300146f72b9a000017', 'common.batch.delete', '鎵归噺鍒犻櫎', 'zh-cn', '2014-07-02 21:02:48', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 21:02:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946f723300146f72ce5260021', 'query.sql', 'Query Sql', 'en', '2014-07-02 21:04:13', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 21:04:13', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946f723300146f72d1b480023', 'query.sql', '鏌ヨsql', 'zh-cn', '2014-07-02 21:04:26', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 21:04:26', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946f723300146f72d54c60025', 'common.name', 'Name', 'en', '2014-07-02 21:04:41', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 21:04:41', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946f723300146f72d72840027', 'common.name', '鍚嶇О', 'zh-cn', '2014-07-02 21:04:49', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 21:04:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946f723300146f72e486c0029', 'dynamic.table.head', 'Dynamic Table', 'en', '2014-07-02 21:05:44', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 21:05:44', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881e946f723300146f72e7bda002b', 'dynamic.table.head', '鍔ㄦ佽〃澶', 'zh-cn', '2014-07-02 21:05:57', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-02 21:05:57', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706da32a10009', 'common.order', 'Order', 'en', '2014-07-05 22:07:48', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:07:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706da55fa000b', 'common.order', '鎺掑簭', 'zh-cn', '2014-07-05 22:07:57', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:07:57', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706daa606000d', 'common.text', 'Text', 'en', '2014-07-05 22:08:18', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:08:18', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706dadb74000f', 'common.text', '鏂囨湰妗', 'zh-cn', '2014-07-05 22:08:32', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:08:32', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706db1a6f0011', 'common.type', 'Type', 'en', '2014-07-05 22:08:48', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:08:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706db389d0013', 'common.type', '绫诲瀷', 'zh-cn', '2014-07-05 22:08:55', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:08:55', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706db76390015', 'common.isshow', 'Is Show', 'en', '2014-07-05 22:09:11', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:09:11', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706db99420017', 'common.isshow', '鏄惁鏄剧ず', 'zh-cn', '2014-07-05 22:09:20', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:09:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706dbdb330019', 'common.href', 'Href', 'en', '2014-07-05 22:09:37', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:09:37', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706dc0bfe001b', 'common.href', '瀛楁href', 'zh-cn', '2014-07-05 22:09:50', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:09:50', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706dc5fc0001d', 'common.query.module', 'Query Module', 'en', '2014-07-05 22:10:11', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:10:11', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706dc87df001f', 'common.query.module', '鏌ヨ妯″紡', 'zh-cn', '2014-07-05 22:10:21', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:10:21', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706dd524d0021', 'dict.code', '瀛楀吀Code', 'zh-cn', '2014-07-05 22:11:13', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:11:13', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706dd8a300023', 'dict.code', 'Dict Code', 'en', '2014-07-05 22:11:27', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:11:27', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706ddc7570025', 'common.isquery', 'Is Query', 'en', '2014-07-05 22:11:43', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:11:43', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706ddec9e0027', 'common.isquery', '鏄惁鏌ヨ', 'zh-cn', '2014-07-05 22:11:53', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:11:53', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706e230b80029', 'common.text.type', 'Column Type', 'en', '2014-07-05 22:16:32', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:16:32', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706e25a9f002b', 'common.text.type', '鏂囨湰绫诲瀷', 'zh-cn', '2014-07-05 22:16:43', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:16:43', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706e368c9002d', 'common.hide', 'Hideen', 'en', '2014-07-05 22:17:52', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:17:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706e3b1e2002f', 'common.hide', '闅愯棌', 'zh-cn', '2014-07-05 22:18:11', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:18:11', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706e3fe800031', 'common.show', 'Show', 'en', '2014-07-05 22:18:30', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:18:30', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706e423e40033', 'common.show', '鏄剧ず', 'zh-cn', '2014-07-05 22:18:40', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:18:40', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706eba47c003e', 'dynamic.report.config.detail', 'Dyna Report Detail', 'en', '2014-07-05 22:26:52', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:29:53', '402881e946e70d550146e70fa0680086', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881ea4706d22b014706ebe1cd0040', 'dynamic.report.config.detail', '鍔ㄦ佹姤琛ㄩ厤缃槑缁', 'zh-cn', '2014-07-05 22:27:07', '402881e946e70d550146e70fa0680086', 'admin', '2014-07-05 22:30:02', '402881e946e70d550146e70fa0680086', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe92601470fefea200003', 'dict.manage', '鏁版嵁瀛楀吀绠$悊', 'zh-cn', '2014-07-07 16:28:07', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe92601470ff21ddd0009', 'dict.name', 'Dict Name', 'en', '2014-07-07 16:30:31', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe92601470ff24cb8000b', 'dict.name', '瀛楀吀鍚嶇О', 'zh-cn', '2014-07-07 16:30:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe92601470ff4e2830019', 'common.add.param', '{0} Add', 'en', '2014-07-07 16:33:33', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-20 16:02:09', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe92601470ff51cc9001b', 'common.add.param', '{0}褰曞叆', 'zh-cn', '2014-07-07 16:33:48', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-20 16:02:23', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe92601470ff925da0025', 'dict.information.type', 'Data Dictionary Group Info', 'en', '2014-07-07 16:38:12', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe92601470ff950100027', 'dict.information.type', '瀛楀吀绫诲瀷淇℃伅', 'zh-cn', '2014-07-07 16:38:23', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:43:03', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe92601471005919a0037', 'common.role.list', 'Role List', 'en', '2014-07-07 16:51:46', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe92601471005f5ac0039', 'common.role.list', '瑙掕壊鍒楄〃', 'zh-cn', '2014-07-07 16:52:12', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe92601471006c0bf003f', 'common.role.code', 'Role Code', 'en', '2014-07-07 16:53:04', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe92601471006e44a0041', 'common.role.code', '瑙掕壊缂栫爜', 'zh-cn', '2014-07-07 16:53:13', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe9260147100713840043', 'common.role.name', 'Role Name', 'en', '2014-07-07 16:53:25', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe926014710073e820045', 'common.role.name', '瑙掕壊鍚嶇О', 'zh-cn', '2014-07-07 16:53:36', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe926014710095eb50053', 'common.edit.param', '{0} Edit', 'en', '2014-07-07 16:55:55', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-20 15:07:04', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe9260147100980ee0055', 'common.edit.param', '{0}缂栬緫', 'zh-cn', '2014-07-07 16:56:04', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-20 15:07:13', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe9260147100affff0057', 'common.role.info', 'Role Info', 'en', '2014-07-07 16:57:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe9260147100b20eb0059', 'common.role.info', '瑙掕壊淇℃伅', 'zh-cn', '2014-07-07 16:57:51', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe9260147100bf680005b', 'permission.set', 'Permission', 'en', '2014-07-07 16:58:45', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe9260147100c2c96005d', 'permission.set', '鏉冮檺璁剧疆', 'zh-cn', '2014-07-07 16:58:59', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe9260147100e5051005f', 'permission.manage', 'Permission Manage', 'en', '2014-07-07 17:01:19', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe9260147100e8a360061', 'permission.manage', '鏉冮檺绠$悊', 'zh-cn', '2014-07-07 17:01:34', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe9260147100f73140067', 'permission.name', 'Permission Name', 'en', '2014-07-07 17:02:34', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe9260147100fa9270069', 'permission.name', '鏉冮檺鍚嶇О', 'zh-cn', '2014-07-07 17:02:48', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe9260147101199f1006f', 'permission.collection', 'Permission Collection', 'en', '2014-07-07 17:04:55', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402881fa470fe92601471011bb380071', 'permission.collection', '鏉冮檺闆嗗悎', 'zh-cn', '2014-07-07 17:05:03', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-07 16:42:54', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('402884f146cc37ab0146cc3fc7350002', 'common.change.refresh', '鏍峰紡淇敼鎴愬姛锛岃鍒锋柊椤甸潰', 'zh-cn', '2014-06-24 13:01:10', 'admin', '绠$悊鍛', '2014-06-24 13:01:10', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402884f146cc37ab0146cc4029a60004', 'common.change.refresh', 'Style change success, please refresh', 'en', '2014-06-24 13:01:35', 'admin', '绠$悊鍛', '2014-06-24 13:01:35', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402884f146cc37ab0146cc4541cb0006', 'common.login.again', '璇风櫥褰曞悗鍐嶆搷浣', 'zh-cn', '2014-06-24 13:07:09', 'admin', '绠$悊鍛', '2014-06-24 13:07:09', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402884f146cc37ab0146cc45c1270008', 'common.login.again', 'Please login again', 'en', '2014-06-24 13:07:41', 'admin', '绠$悊鍛', '2014-06-24 13:07:41', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402884f146cc37ab0146cc4de4da000a', 'common.userinfo', '鐢ㄦ埛淇℃伅', 'zh-cn', '2014-06-24 13:16:35', 'admin', '绠$悊鍛', '2014-06-24 13:16:35', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402884f146cc37ab0146cc4e7b25000c', 'common.userinfo', 'My Profile', 'en', '2014-06-24 13:17:13', 'admin', '绠$悊鍛', '2014-06-24 13:17:13', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402884f146cc37ab0146cc55cac30012', 'common.surname', '濮撳悕', 'zh-cn', '2014-06-24 13:25:13', 'admin', '绠$悊鍛', '2014-06-24 13:25:13', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('402884f146cc37ab0146cc55f21b0014', 'common.surname', 'Name', 'en', '2014-06-24 13:25:23', 'admin', '绠$悊鍛', '2014-06-24 13:25:23', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4a15aa60003', 'common.calendar', '鏃ュ巻', 'zh-cn', '2014-06-23 01:30:47', 'admin', '绠$悊鍛', '2014-06-23 01:30:47', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4a190580005', 'common.calendar', 'Calendar', 'en', '2014-06-23 01:31:01', 'admin', '绠$悊鍛', '2014-06-23 01:31:01', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4a2dc220007', 'common.map', '鍦板浘', 'zh-cn', '2014-06-23 01:32:26', 'admin', '绠$悊鍛', '2014-06-23 01:32:26', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4a2f24e0009', 'common.map', 'Map', 'en', '2014-06-23 01:32:31', 'admin', '绠$悊鍛', '2014-06-23 01:32:31', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4aff7ea000b', 'common.please.select', '---璇烽夋嫨---', 'zh-cn', '2014-06-23 01:46:45', 'admin', '绠$悊鍛', '2014-06-23 01:46:45', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4b03310000d', 'common.please.select', 'Please Select', 'en', '2014-06-23 01:47:00', 'admin', '绠$悊鍛', '2014-06-23 02:01:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4b8af79000f', 'common.please.input.keyword', '璇疯緭鍏ュ叧閿瓧', 'zh-cn', '2014-06-23 01:56:16', 'admin', '绠$悊鍛', '2014-06-23 01:56:16', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4b8f7aa0011', 'common.please.input.keyword', 'Keyword', 'en', '2014-06-23 01:56:34', 'admin', '绠$悊鍛', '2014-06-23 01:56:34', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4ba979a0013', 'common.please.input.query.keyword', '璇疯緭鍏ユ煡璇㈠叧閿瓧', 'zh-cn', '2014-06-23 01:58:21', 'admin', '绠$悊鍛', '2014-06-23 01:58:21', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4bade820015', 'common.please.input.query.keyword', 'Query keyword', 'en', '2014-06-23 01:58:39', 'admin', '绠$悊鍛', '2014-06-23 01:58:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4bee05c0018', 'common.query', '鏌ヨ', 'zh-cn', '2014-06-23 02:03:02', 'admin', '绠$悊鍛', '2014-06-23 02:03:02', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4bf0575001a', 'common.query', 'Query', 'en', '2014-06-23 02:03:11', 'admin', '绠$悊鍛', '2014-06-23 02:03:11', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4bf4239001c', 'common.reset', '閲嶇疆', 'zh-cn', '2014-06-23 02:03:27', 'admin', '绠$悊鍛', '2014-06-23 02:03:27', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc4d46c481da0146c4bf638a001e', 'common.reset', 'Reset', 'en', '2014-06-23 02:03:35', 'admin', '绠$悊鍛', '2014-06-23 02:03:35', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c19fa9370004', 'common.navegation', '瀵艰埅鑿滃崟', 'zh-cn', '2014-06-22 11:30:04', 'admin', '绠$悊鍛', '2014-06-22 11:30:04', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a0a4d50006', 'common.navegation', 'Navegation', 'en', '2014-06-22 11:31:09', 'admin', '绠$悊鍛', '2014-06-22 11:31:09', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a1b46e0008', 'common.control.panel', 'Control Panel', 'en', '2014-06-22 11:32:18', 'admin', '绠$悊鍛', '2014-06-22 11:32:18', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a1e59b000a', 'common.control.panel', '鎺у埗闈㈡澘', 'zh-cn', '2014-06-22 11:32:31', 'admin', '绠$悊鍛', '2014-06-22 11:32:31', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a2d668000c', 'common.profile', '涓汉淇℃伅', 'zh-cn', '2014-06-22 11:33:32', 'admin', '绠$悊鍛', '2014-06-22 11:33:32', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a31e02000e', 'common.profile', 'Profile', 'en', '2014-06-22 11:33:51', 'admin', '绠$悊鍛', '2014-06-22 11:33:51', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a386000010', 'common.my.style', '棣栭〉椋庢牸', 'zh-cn', '2014-06-22 11:34:17', 'admin', '绠$悊鍛', '2014-06-22 11:34:17', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a3bccd0012', 'common.my.style', 'Style', 'en', '2014-06-22 11:34:31', 'admin', '绠$悊鍛', '2014-06-22 11:34:31', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a412670014', 'common.logout', '娉ㄩ攢', 'zh-cn', '2014-06-22 11:34:53', 'admin', '绠$悊鍛', '2014-06-22 11:36:06', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a4f99a0016', 'common.logout', 'Logout', 'en', '2014-06-22 11:35:52', 'admin', '绠$悊鍛', '2014-06-22 11:35:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a5edff0019', 'common.exit', '閫鍑', 'zh-cn', '2014-06-22 11:36:55', 'admin', '绠$悊鍛', '2014-06-22 11:36:55', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a60dff001b', 'common.exit', 'Exit', 'en', '2014-06-22 11:37:03', 'admin', '绠$悊鍛', '2014-06-22 11:37:03', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a85f8e001d', 'common.user', 'User', 'en', '2014-06-22 11:39:35', 'admin', '绠$悊鍛', '2014-06-22 11:39:35', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1a88d9b001f', 'common.user', '鐢ㄦ埛', 'zh-cn', '2014-06-22 11:39:47', 'admin', '绠$悊鍛', '2014-06-22 11:39:47', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1aae98c0025', 'common.platform', 'JEECG 婕旂ず绯荤粺', 'zh-cn', '2014-06-22 11:42:22', 'admin', '绠$悊鍛', '2014-06-22 11:42:22', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c18cdc0146c1ab90ac0027', 'common.platform', 'JEECG Platform', 'en', '2014-06-22 11:43:04', 'admin', '绠$悊鍛', '2014-06-22 11:43:04', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1e09ce00017', 'lang.maintain', '璇█淇℃伅缁存姢', 'zh-cn', '2014-06-22 12:41:01', 'admin', '绠$悊鍛', '2014-06-22 12:41:01', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1e0f0780019', 'lang.maintain', 'Language Maintain', 'en', '2014-06-22 12:41:22', 'admin', '绠$悊鍛', '2014-06-23 13:37:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1ea9872002b', 'online.develop', 'Online Develop', 'en', '2014-06-22 12:51:55', 'admin', '绠$悊鍛', '2014-06-22 12:51:55', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1eaf4d6002d', 'online.develop', 'Online 寮鍙', 'zh-cn', '2014-06-22 12:52:19', 'admin', '绠$悊鍛', '2014-06-22 12:52:19', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1eb749c002f', 'system.manage', '绯荤粺绠$悊', 'zh-cn', '2014-06-22 12:52:51', 'admin', '绠$悊鍛', '2014-06-22 12:52:51', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1ebac710031', 'system.manage', 'System Manage', 'en', '2014-06-22 12:53:06', 'admin', '绠$悊鍛', '2014-06-22 12:53:06', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1ec37a10033', 'project.manage', '椤圭洰绠$悊', 'zh-cn', '2014-06-22 12:53:41', 'admin', '绠$悊鍛', '2014-06-22 12:53:41', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1ec67a40035', 'project.manage', 'Project Manage', 'en', '2014-06-22 12:53:54', 'admin', '绠$悊鍛', '2014-06-22 12:53:54', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1ed9e6e0037', 'general.demo', '甯哥敤绀轰緥', 'zh-cn', '2014-06-22 12:55:13', 'admin', '绠$悊鍛', '2014-06-22 12:55:13', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1edcc6d0039', 'general.demo', 'Demo', 'en', '2014-06-22 12:55:25', 'admin', '绠$悊鍛', '2014-06-22 12:55:25', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1ee629d003b', 'system.monitor', '绯荤粺鐩戞帶', 'zh-cn', '2014-06-22 12:56:03', 'admin', '绠$悊鍛', '2014-06-22 12:56:03', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1eebe6c003d', 'system.monitor', 'System Monitor', 'en', '2014-06-22 12:56:27', 'admin', '绠$悊鍛', '2014-06-22 12:56:27', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1ef4206003f', 'workflow.manage', '宸ヤ綔娴佺鐞', 'zh-cn', '2014-06-22 12:57:01', 'admin', '绠$悊鍛', '2014-06-22 12:57:01', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1ef78d20041', 'workflow.manage', 'Workflow Manage', 'en', '2014-06-22 12:57:15', 'admin', '绠$悊鍛', '2014-06-22 12:57:15', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1fe512f0045', 'common.change.password', '淇敼瀵嗙爜', 'zh-cn', '2014-06-22 13:13:28', 'admin', '绠$悊鍛', '2014-06-22 13:13:28', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c1fe90260047', 'common.change.password', 'Change Password', 'en', '2014-06-22 13:13:44', 'admin', '绠$悊鍛', '2014-06-22 13:13:44', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c202c92c0049', 'common.copyright', 'JEECG 鐗堟潈鎵鏈', 'zh-cn', '2014-06-22 13:18:20', 'admin', '绠$悊鍛', '2014-06-23 11:01:46', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c203cd8d004b', 'common.copyright', 'JEEECT Copyright Reserved', 'en', '2014-06-22 13:19:27', 'admin', '绠$悊鍛', '2014-06-22 13:19:27', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c20508bf004d', 'common.refresh', '鍒锋柊', 'zh-cn', '2014-06-22 13:20:48', 'admin', '绠$悊鍛', '2014-06-22 13:20:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c2053659004f', 'common.refresh', 'Refresh', 'en', '2014-06-22 13:20:59', 'admin', '绠$悊鍛', '2014-06-22 13:20:59', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c2057c580051', 'common.close', 'Close', 'en', '2014-06-22 13:21:17', 'admin', '绠$悊鍛', '2014-06-22 13:21:17', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c205aff20053', 'common.close', '鍏抽棴', 'zh-cn', '2014-06-22 13:21:31', 'admin', '绠$悊鍛', '2014-06-22 13:21:31', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c205f4be0055', 'common.close.all', '鍏ㄩ儴鍏抽棴', 'zh-cn', '2014-06-22 13:21:48', 'admin', '绠$悊鍛', '2014-06-22 13:21:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c20631f70057', 'common.close.all', 'Close All', 'en', '2014-06-22 13:22:04', 'admin', '绠$悊鍛', '2014-06-22 13:22:04', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c2070b8a0059', 'common.close.all.but.this', 'Close all but this', 'en', '2014-06-22 13:23:00', 'admin', '绠$悊鍛', '2014-06-22 13:23:00', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c2074657005b', 'common.close.all.but.this', '闄ゆ涔嬪鍏ㄩ儴鍏抽棴', 'zh-cn', '2014-06-22 13:23:15', 'admin', '绠$悊鍛', '2014-06-22 13:23:15', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c207f0bc005d', 'common.close.all.right', '褰撳墠椤靛彸渚у叏閮ㄥ叧闂', 'zh-cn', '2014-06-22 13:23:58', 'admin', '绠$悊鍛', '2014-06-22 13:23:58', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c2085b89005f', 'common.close.all.right', 'Close all on right', 'en', '2014-06-22 13:24:26', 'admin', '绠$悊鍛', '2014-06-22 13:24:26', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c208cabc0061', 'common.close.all.left', '褰撳墠椤靛乏渚у叏閮ㄥ叧闂', 'zh-cn', '2014-06-22 13:24:54', 'admin', '绠$悊鍛', '2014-06-22 13:24:54', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c2094dee0063', 'common.close.all.left', 'Close all on left', 'en', '2014-06-22 13:25:28', 'admin', '绠$悊鍛', '2014-06-22 13:25:28', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c2325e890069', 'common.assist.tools', '杈呭姪宸ュ叿', 'zh-cn', '2014-06-22 14:10:19', 'admin', '绠$悊鍛', '2014-06-22 14:10:19', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c2330cf3006b', 'common.assist.tools', 'Tool', 'en', '2014-06-22 14:11:04', 'admin', '绠$悊鍛', '2014-06-22 14:11:04', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c238a6eb006d', 'common.online.user', '鐢ㄦ埛鍦ㄧ嚎鍒楄〃', 'zh-cn', '2014-06-22 14:17:11', 'admin', '绠$悊鍛', '2014-06-22 14:17:11', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fc5346c1aec50146c238d41e006f', 'common.online.user', 'Online User', 'en', '2014-06-22 14:17:22', 'admin', '绠$悊鍛', '2014-06-22 14:17:22', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471f9575f10001', 'language.manage', '璇█绠$悊', 'zh-cn', '2014-07-10 17:23:14', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 17:23:14', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471f95fdd20003', 'language.manage', 'Lang Manage', 'en', '2014-07-10 17:23:49', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 17:23:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fc8bd5d0010', 'form.template', '琛ㄥ崟妯℃澘', 'zh-cn', '2014-07-10 18:19:15', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:19:15', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fc8dc9b0012', 'form.template', 'Form Template', 'en', '2014-07-10 18:19:23', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:19:23', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fc961b70014', 'function.test', '鍔熻兘娴嬭瘯', 'zh-cn', '2014-07-10 18:19:57', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:19:57', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fc97f300016', 'function.test', 'Function Test', 'en', '2014-07-10 18:20:04', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:20:04', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fc9e6310018', 'config.place', '閰嶇疆鍦板潃', 'zh-cn', '2014-07-10 18:20:31', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:20:31', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fca0508001a', 'config.place', 'Setting Address', 'en', '2014-07-10 18:20:39', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:20:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fcd6c920020', 'table.exit.in.db.confirm', '琛ㄥ湪鏁版嵁搴撲腑宸插瓨鍦╘\n纭鍒犻櫎', 'zh-cn', '2014-07-10 18:24:22', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:24:22', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fcdd7140022', 'table.exit.in.db.confirm', 'Table exit already\\n Confirm Delete', 'en', '2014-07-10 18:24:49', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:24:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fce9e7a0024', 'confirm.delete.record', '纭绉婚櫎璇ヨ褰', 'zh-cn', '2014-07-10 18:25:40', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:25:40', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fcec9d60026', 'confirm.delete.record', 'Confirm delete record', 'en', '2014-07-10 18:25:51', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:25:51', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fcf68be0028', 'form.datalist', '琛ㄥ崟鏁版嵁鍒楄〃', 'zh-cn', '2014-07-10 18:26:32', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:26:32', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fcf948f002a', 'form.datalist', 'Form data list', 'en', '2014-07-10 18:26:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:26:43', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fd33eb1002e', 'common.please.select.edit.item', '璇烽夋嫨缂栬緫椤圭洰', 'zh-cn', '2014-07-10 18:30:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:30:43', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fd36c4d0030', 'common.please.select.edit.item', 'Please select edit item', 'en', '2014-07-10 18:30:55', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:30:55', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fd429130032', 'common.please.select.one.record.to.edit', '璇烽夋嫨涓鏉¤褰曞啀缂栬緫', 'zh-cn', '2014-07-10 18:31:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:31:43', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fd487c40034', 'common.please.select.one.record.to.edit', 'Please select one record to edit', 'en', '2014-07-10 18:32:07', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:32:07', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fd8bd8f003c', 'common.menu.link', '鑿滃崟閾炬帴', 'zh-cn', '2014-07-10 18:36:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:36:43', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fd8d355003e', 'common.menu.link', 'Menu Link', 'en', '2014-07-10 18:36:49', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:36:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fdae99f0040', 'form.sqlimport', '琛ㄥ崟SQL瀵煎叆', 'zh-cn', '2014-07-10 18:39:06', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:39:06', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fdb06f60042', 'form.sqlimport', 'Form SQL Import', 'en', '2014-07-10 18:39:13', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:39:13', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fdbd2b60044', 'slave.table.can.not.generate.code', '闄勮〃涓嶈兘浠g爜鐢熸垚', 'zh-cn', '2014-07-10 18:40:05', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:40:05', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fdc1ba70046', 'slave.table.can.not.generate.code', 'Slave table can not generate code', 'en', '2014-07-10 18:40:24', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:47:00', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fdd7b230048', 'please.syncdb', '璇峰厛鍚屾鏁版嵁搴', 'zh-cn', '2014-07-10 18:41:54', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:41:54', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fde0d02004a', 'please.syncdb', 'Please synchronize database first', 'en', '2014-07-10 18:42:31', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:42:31', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fde8727004c', 'code.generate', '浠g爜鐢熸垚', 'zh-cn', '2014-07-10 18:43:03', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:43:03', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fdebba6004e', 'code.generate', 'Code Generate', 'en', '2014-07-10 18:43:16', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:43:16', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fdfb0040050', 'please.select.sync.method', '璇烽夋嫨鍚屾鏂瑰紡', 'zh-cn', '2014-07-10 18:44:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:44:19', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fdff96f0052', 'please.select.sync.method', 'Please select synchronize method', 'en', '2014-07-10 18:44:37', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:44:37', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fe393f60059', 'normal.sync', '鏅氬悓姝(淇濈暀琛ㄦ暟鎹)', 'zh-cn', '2014-07-10 18:48:34', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:48:34', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fe4c6cb005b', 'normal.sync', 'Normal Sync(Retain Data)', 'en', '2014-07-10 18:49:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:49:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fe58641005d', 'force.sync', '寮哄埗鍚屾(鍒犻櫎琛,閲嶆柊鐢熸垚)', 'zh-cn', '2014-07-10 18:50:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:50:41', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471fe611cd005f', 'force.sync', 'Force Sync(Delete Table, ReGenerate)', 'en', '2014-07-10 18:51:17', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 18:51:17', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471ff8d3000061', 'enhance.type', '澧炲己绫诲瀷', 'zh-cn', '2014-07-10 19:11:46', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 19:11:46', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471ff8fcca0063', 'enhance.type', 'Enhance Type', 'en', '2014-07-10 19:11:57', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 19:11:57', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471ff9ec220065', 'enhance.js', '澧炲己js', 'zh-cn', '2014-07-10 19:12:58', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 19:12:58', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471ffa2ef10067', 'enhance.js', 'Enhance JS', 'en', '2014-07-10 19:13:15', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 19:13:15', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471ffb99300069', 'get.error', '鍑洪敊浜', 'zh-cn', '2014-07-10 19:14:48', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 19:14:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471ffbb3d7006b', 'get.error', 'Get Error', 'en', '2014-07-10 19:14:55', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 19:14:55', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471ffcc59f006d', 'operate.code', '椤甸潰鎺т欢缂栫爜', 'zh-cn', '2014-07-10 19:16:05', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-04-02 22:30:34', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471ffce066006f', 'operate.code', 'Page Element Code', 'en', '2014-07-10 19:16:12', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-04-02 22:30:50', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471ffed3280075', 'enhance.sql', '澧炲己sql', 'zh-cn', '2014-07-10 19:18:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 19:18:19', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('4028fd2b471f63bb01471ffeef0d0077', 'enhance.sql', 'Enhance SQL', 'en', '2014-07-10 19:18:26', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-10 19:18:26', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('41e9ba5d4f2546fd871d0a4a401732a8', 'common.phone', '鎵嬫満鍙风爜', 'zh-cn', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('42a24520ac85497d9da92af210113da2', 'common.status', '鐘舵', 'zh-cn', '2014-07-03 18:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('52ce422654ab40329fe3a0518b5c8f67', 'password.rang6to18', 'The password is at least 6 characters long, up to 18 characters', 'en', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('5910b83799b242318f456a4f42303cb0', 'select.byrole', '鎸夎鑹查夋嫨', 'zh-cn', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('5e5106b716d6476cae700ab27f2da555', 'common.middle', '涓', 'zh-cn', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('767053e885704be2b203fbe5c0389b73', 'common.password.reset', '瀵嗙爜閲嶇疆', 'zh-cn', '2014-07-03 18:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('7aae85094220429a84158e4db5c05d45', 'common.status', 'Status', 'en', '2014-07-03 18:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('7f980a800b114020b085530096b95d86', 'role.muti.select', '瑙掕壊鍙閫', 'zh-cn', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846c664b70146c741b9ed0045', 'lang.langkey', '璇█涓婚敭', 'zh-cn', '2014-06-23 13:45:11', 'admin', '绠$悊鍛', '2014-06-23 13:45:11', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846c664b70146c74226100047', 'lang.langkey', 'Lang Key', 'en', '2014-06-23 13:45:39', 'admin', '绠$悊鍛', '2014-06-23 13:45:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846c664b70146c743a8a40049', 'common.content', '鍐呭', 'zh-cn', '2014-06-23 13:47:18', 'admin', '绠$悊鍛', '2014-06-23 13:47:18', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846c664b70146c74416f5004b', 'common.content', 'Content', 'en', '2014-06-23 13:47:46', 'admin', '绠$悊鍛', '2014-06-23 13:47:46', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846c664b70146c74526330050', 'common.language', 'Language', 'en', '2014-06-23 13:48:56', 'admin', '绠$悊鍛', '2014-06-23 13:48:56', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846c664b70146c77efdb60076', 'common.import', '鏁版嵁瀵煎叆', 'zh-cn', '2014-06-23 14:52:06', 'admin', '绠$悊鍛', '2014-06-23 14:52:06', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846c664b70146c77f95070078', 'common.import', 'Data Import', 'en', '2014-06-23 14:52:45', 'admin', '绠$悊鍛', '2014-06-23 14:52:45', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846c664b70146c7802f4f007a', 'common.export', '鏁版嵁瀵煎嚭', 'zh-cn', '2014-06-23 14:53:25', 'admin', '绠$悊鍛', '2014-06-23 14:58:50', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846c664b70146c7809eb6007c', 'common.export', 'Data Export', 'en', '2014-06-23 14:53:53', 'admin', '绠$悊鍛', '2014-06-23 14:59:00', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846d1bb660146d1ef63000003', 'user.manage', '鐢ㄦ埛绠$悊', 'zh-cn', '2014-06-25 15:31:05', 'admin', '绠$悊鍛', '2014-06-25 15:31:05', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846d1bb660146d1eff19e0005', 'user.manage', 'User Manage', 'en', '2014-06-25 15:31:41', 'admin', '绠$悊鍛', '2014-06-25 15:31:41', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846d1bb660146d1f12ae00007', 'common.data.dictionary', 'Data Dictionary ', 'en', '2014-06-25 15:33:01', 'admin', '绠$悊鍛', '2014-06-25 16:10:45', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846d1bb660146d1f1635a0009', 'common.data.dictionary', '鏁版嵁瀛楀吀', 'zh-cn', '2014-06-25 15:33:16', 'admin', '绠$悊鍛', '2014-06-25 15:33:16', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846d1bb660146d1f24c0b000b', 'role.manage', '瑙掕壊绠$悊', 'zh-cn', '2014-06-25 15:34:15', 'admin', '绠$悊鍛', '2014-06-25 15:34:15', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846d1bb660146d1f35861000f', 'role.manage', 'Role Manage', 'en', '2014-06-25 15:35:24', 'admin', '绠$悊鍛', '2014-06-25 15:35:24', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846d1bb660146d1f8e1610015', 'icon.manage', '鍥炬爣绠$悊', 'zh-cn', '2014-06-25 15:41:27', 'admin', '绠$悊鍛', '2014-06-25 15:41:27', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846d1bb660146d1fbc5bf0017', 'icon.manage', 'Icon Manage', 'en', '2014-06-25 15:44:36', 'admin', '绠$悊鍛', '2014-06-25 15:44:36', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846d1bb660146d1fffdb40019', 'department.manage', '缁勭粐鏈烘瀯绠$悊', 'zh-cn', '2014-06-25 15:49:13', 'admin', '绠$悊鍛', '2014-06-25 15:49:13', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab00846d1bb660146d20cbafe001b', 'department.manage', 'Org Manage', 'en', '2014-06-25 16:03:08', 'admin', '绠$悊鍛', '2014-06-25 16:03:08', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab01b46b7bff40146b7c2eb6f0001', 'common.dash_board', '棣栭〉', 'zh-cn', '2014-06-20 13:32:23', 'admin', '绠$悊鍛', '2014-06-20 14:58:43', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab01b46b7bff40146b7c38f560003', 'common.dash_board', 'Dashboard', 'en', '2014-06-20 13:33:05', 'admin', '绠$悊鍛', '2014-06-20 14:58:51', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab01b46b802300146b8038a070001', 'common.add.success', '娣诲姞鎴愬姛', 'zh-cn', '2014-06-20 14:42:58', 'admin', '绠$悊鍛', '2014-06-20 14:42:58', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab01b46b802300146b8048a5e0004', 'common.add.success', 'Add success', 'en', '2014-06-20 14:44:03', 'admin', '绠$悊鍛', '2014-06-20 14:44:03', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab01b46b802300146b806d7bd0006', 'common.edit.success', '鏇存柊鎴愬姛', 'zh-cn', '2014-06-20 14:46:34', 'admin', '绠$悊鍛', '2014-06-20 14:46:34', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab01b46b802300146b807c4e60008', 'common.edit.success', 'Update success', 'en', '2014-06-20 14:47:35', 'admin', '绠$悊鍛', '2014-06-20 14:47:35', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab01b46b80a850146b80cf84d0002', 'common.delete.success', '鍒犻櫎鎴愬姛', 'zh-cn', '2014-06-20 14:53:16', 'admin', '绠$悊鍛', '2014-06-20 14:53:16', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab01b46b80a850146b80d35b70004', 'common.delete.success', 'Delete success', 'en', '2014-06-20 14:53:31', 'admin', '绠$悊鍛', '2014-06-20 14:53:31', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab01b46b80a850146b80e7d420006', 'common.edit.fail', '鏇存柊澶辫触', 'zh-cn', '2014-06-20 14:54:55', 'admin', '绠$悊鍛', '2014-06-20 14:54:55', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab01b46b80a850146b80eddca0008', 'common.edit.fail', 'Update Fail', 'en', '2014-06-20 14:55:20', 'admin', '绠$悊鍛', '2014-06-20 14:55:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab01b46b83b0b0146b83ec7070008', 'common.notfind.langkey', '', 'zh-cn', '2014-06-20 15:55:50', 'admin', '绠$悊鍛', '2014-06-21 01:18:10', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab01b46b83b0b0146b83ec7070009', 'common.notfind.langkey', '', 'en', '2014-06-20 15:57:14', 'admin', '绠$悊鍛', '2014-06-21 01:18:16', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c5101474264c8980002', 'common.confirm', '纭畾', 'zh-cn', '2014-07-17 11:36:47', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:36:47', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c5101474264e0510004', 'common.confirm', 'Confirm', 'en', '2014-07-17 11:36:53', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:36:53', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c51014742654bd20006', 'common.remove', 'Remove', 'en', '2014-07-17 11:37:20', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:37:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c510147426569f90008', 'common.remove', '绉婚櫎', 'zh-cn', '2014-07-17 11:37:28', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:37:28', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c5101474265ac98000a', 'common.item', '鏉', 'zh-cn', '2014-07-17 11:37:45', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:37:45', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c5101474265cdc1000c', 'common.item', 'Item', 'en', '2014-07-17 11:37:53', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:37:53', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c51014742662411000e', 'common.total', '鍏', 'zh-cn', '2014-07-17 11:38:15', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:38:15', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c51014742664c5c0010', 'common.total', 'Total', 'en', '2014-07-17 11:38:26', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:38:26', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c51014742669c660012', 'common.inactive', '鏈縺娲', 'zh-cn', '2014-07-17 11:38:46', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:38:46', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c5101474266cf100014', 'common.inactive', 'Inactive', 'en', '2014-07-17 11:38:59', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:38:59', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c5101474267077d0016', 'common.active', '婵娲', 'zh-cn', '2014-07-17 11:39:14', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:39:14', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c510147426722730018', 'common.active', 'Active', 'en', '2014-07-17 11:39:21', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:39:21', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c5101474267fdef001e', 'common.languagekey', 'Lang Key', 'en', '2014-07-17 11:40:17', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:40:17', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab02147423c51014742687da20020', 'common.languagekey', '璇█Key', 'zh-cn', '2014-07-17 11:40:49', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-17 11:40:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b05f8860005', 'common.remember.user', '鏄惁璁颁綇鐢ㄦ埛鍚', 'zh-cn', '2014-07-25 08:57:39', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 08:57:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b0642280007', 'common.remember.user', 'Remember User', 'en', '2014-07-25 08:57:58', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 08:57:58', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b0b61120009', 'common.login.success.wait', '鐧婚檰鎴愬姛!璇风◢鍚....', 'zh-cn', '2014-07-25 09:03:33', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:03:33', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b0bc257000b', 'common.login.success.wait', 'Login success, waiting....', 'en', '2014-07-25 09:03:58', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:03:58', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b0d4233000d', 'common.init.data', '鏄惁鍒濆鍖栨暟鎹', 'zh-cn', '2014-07-25 09:05:36', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:05:36', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b0db938000f', 'common.init.data', 'Initialize data?', 'en', '2014-07-25 09:06:07', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:06:07', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b162e630012', 'lang.order.type', '璁㈠崟绫诲瀷', 'zh-cn', '2014-07-25 09:15:21', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:15:21', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b164ceb0014', 'lang.order.type', 'Order Type', 'en', '2014-07-25 09:15:29', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:15:29', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b16a56e0016', 'lang.customer.type', '瀹㈡埛绫诲瀷', 'zh-cn', '2014-07-25 09:15:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:15:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b16c0d50018', 'lang.customer.type', 'Customer Type', 'en', '2014-07-25 09:15:59', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:15:59', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b170b9a001a', 'lang.service.item.type', '鏈嶅姟椤圭洰绫诲瀷', 'zh-cn', '2014-07-25 09:16:18', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:16:18', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1749cc001c', 'lang.service.item.type', 'Service Item Type', 'en', '2014-07-25 09:16:34', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:16:34', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1936c60020', 'common.logic.condition', '閫昏緫鏉′欢', 'zh-cn', '2014-07-25 09:18:40', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:18:40', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1956dd0022', 'common.logic.condition', 'Logic Condition', 'en', '2014-07-25 09:18:48', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:18:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1a1cc30024', 'common.data.table', '鏁版嵁琛', 'zh-cn', '2014-07-25 09:19:39', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:19:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1a3c0a0026', 'common.data.table', 'Data Table', 'en', '2014-07-25 09:19:47', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:19:47', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1ac59e0028', 'common.document.category', '鏂囨。鍒嗙被', 'zh-cn', '2014-07-25 09:20:22', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:20:22', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1aeaa3002a', 'common.document.category', 'Document Category', 'en', '2014-07-25 09:20:31', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:20:31', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1b3e55002c', 'common.sex.type', '鎬у埆绫', 'zh-cn', '2014-07-25 09:20:53', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:20:53', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1b59af002e', 'common.sex.type', 'Sex Type', 'en', '2014-07-25 09:21:00', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:21:00', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1c08ba0030', 'common.attachment', '闄勪欢', 'zh-cn', '2014-07-25 09:21:45', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:21:45', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1c22dd0032', 'common.attachment', 'Attachment', 'en', '2014-07-25 09:21:51', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:21:51', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1d4e400034', 'lang.excellent.order', '浼樿川璁㈠崟', 'zh-cn', '2014-07-25 09:23:08', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:23:08', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1d7ece0036', 'lang.excellent.order', 'Excellent Order', 'en', '2014-07-25 09:23:20', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:23:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1de2050038', 'lang.normal.order', '鏅氳鍗', 'zh-cn', '2014-07-25 09:23:46', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:23:46', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1dfde4003a', 'lang.normal.order', 'Normal Order', 'en', '2014-07-25 09:23:53', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:23:53', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1ef393003c', 'lang.contract.customer', '绛剧害瀹㈡埛', 'zh-cn', '2014-07-25 09:24:56', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:24:56', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1f0b32003e', 'lang.contract.customer', 'Contract Customer', 'en', '2014-07-25 09:25:02', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:25:02', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1f4fea0040', 'lang.normal.customer', '鏅氬鎴', 'zh-cn', '2014-07-25 09:25:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:25:19', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1f67050042', 'lang.normal.customer', 'Normal Customer', 'en', '2014-07-25 09:25:25', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:25:25', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1fa93d0044', 'lang.special.servcie', '鐗规畩鏈嶅姟', 'zh-cn', '2014-07-25 09:25:42', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:25:42', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b1fceec0046', 'lang.special.servcie', 'Special Service', 'en', '2014-07-25 09:25:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:25:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b2014720048', 'lang.normal.service', '鏅氭湇鍔', 'zh-cn', '2014-07-25 09:26:10', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:26:10', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b203ca4004a', 'lang.normal.service', 'Normal Service', 'en', '2014-07-25 09:26:20', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:26:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b20bf5a004c', 'common.single.condition.query', '鍗曟潯浠舵煡璇', 'zh-cn', '2014-07-25 09:26:54', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:26:54', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b20e447004e', 'common.single.condition.query', 'Single Condition Query', 'en', '2014-07-25 09:27:03', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:27:03', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b214fe20050', 'common.scope.query', '鑼冨洿鏌ヨ', 'zh-cn', '2014-07-25 09:27:31', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:27:31', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b2171de0052', 'common.scope.query', 'Scope Queyr', 'en', '2014-07-25 09:27:39', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:27:39', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b21ffbf0054', 'common.db.integer', 'Integer', 'en', '2014-07-25 09:28:16', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:29:19', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b2227930056', 'common.db.integer', '鏁板肩被鍨', 'zh-cn', '2014-07-25 09:28:26', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:29:23', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b234ba5005a', 'common.db.date', 'Date', 'en', '2014-07-25 09:29:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:29:41', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b238657005c', 'common.db.date', '鏃ユ湡绫诲瀷', 'zh-cn', '2014-07-25 09:29:56', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:29:56', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b23efed005e', 'common.db.string', '瀛楃绫诲瀷', 'zh-cn', '2014-07-25 09:30:23', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:30:23', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b2404d30060', 'common.db.string', 'String', 'en', '2014-07-25 09:30:28', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:30:28', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b245e800062', 'common.db.long', 'Long', 'en', '2014-07-25 09:30:51', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:30:51', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b248ee60064', 'common.db.long', '闀挎暣鍨', 'zh-cn', '2014-07-25 09:31:03', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:31:03', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b253d760066', 'common.workflow.engine.table', '宸ヤ綔娴佸紩鎿庤〃', 'zh-cn', '2014-07-25 09:31:48', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:31:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b256e3a0068', 'common.workflow.engine.table', 'Workflow Engine Table', 'en', '2014-07-25 09:32:00', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:32:00', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b25c1d4006a', 'common.system.table', '绯荤粺鍩虹琛', 'zh-cn', '2014-07-25 09:32:22', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:32:22', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b25d9b3006c', 'common.system.table', 'System Table', 'en', '2014-07-25 09:32:28', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:32:28', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b267773006e', 'common.business.table', '涓氬姟琛', 'zh-cn', '2014-07-25 09:33:08', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:33:08', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b26a71c0070', 'common.business.table', 'Business Table', 'en', '2014-07-25 09:33:21', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:33:21', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b2761320072', 'common.customer.engine.table', '鑷畾涔夊紩鎿庤〃', 'zh-cn', '2014-07-25 09:34:08', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:34:08', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b2791440074', 'common.customer.engine.table', 'Customer Engine Table', 'en', '2014-07-25 09:34:20', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:34:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b27d3790076', 'common.news', '鏂伴椈', 'zh-cn', '2014-07-25 09:34:37', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:34:37', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b27f9b30078', '鏂伴椈', 'News', 'en', '2014-07-25 09:34:47', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:34:47', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b28e56e007a', 'common.male', '鐢锋', 'zh-cn', '2014-07-25 09:35:48', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:35:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b28fa30007c', 'common.male', 'Male', 'en', '2014-07-25 09:35:53', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:35:53', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b291a73007e', 'common.female', '濂虫', 'zh-cn', '2014-07-25 09:36:01', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:36:01', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0af476afe8501476b29466c0080', 'common.female', 'Female', 'en', '2014-07-25 09:36:12', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 09:36:12', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c37d001487c488a4d0006', 'common.datasource.manage', '澶氭暟鎹簮绠$悊', 'zh-cn', '2014-09-16 10:26:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-09-16 10:30:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c37d001487c491f480008', 'common.datasource.manage', 'Multiple DataSource Manage', 'en', '2014-09-16 10:27:20', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-09-16 10:30:56', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c5f6d400001', 'common.datasrouce.key', '澶氭暟鎹簮涓婚敭', 'zh-cn', '2014-09-16 10:51:41', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c5fba980003', 'common.datasrouce.key', 'Mutipule DataSource Key', 'en', '2014-09-16 10:52:01', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c6193ec0005', 'common.driverclass', '椹卞姩绫', 'zh-cn', '2014-09-16 10:54:02', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c61b73d0007', 'common.driverclass', 'Driver Class', 'en', '2014-09-16 10:54:11', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c62b0b00009', 'common.datasrouce.url', '鏁版嵁婧愬湴鍧', 'zh-cn', '2014-09-16 10:55:15', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c62f4d8000b', 'common.datasrouce.url', 'DataSource URL', 'en', '2014-09-16 10:55:33', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c63c17c000d', 'common.dbuser', '鏁版嵁搴撶敤鎴峰悕', 'zh-cn', '2014-09-16 10:56:25', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c63f0bf000f', 'common.dbuser', 'DB User', 'en', '2014-09-16 10:56:37', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c6430510011', 'common.dbpassword', '鏁版嵁搴撳瘑鐮', 'zh-cn', '2014-09-16 10:56:53', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c6456940013', 'common.dbpassword', 'DB Password', 'en', '2014-09-16 10:57:03', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c66d45d0015', 'common.dbtype', '鏁版嵁搴撶被鍨', 'zh-cn', '2014-09-16 10:59:46', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c66ffe00017', 'common.dbtype', 'DB Type', 'en', '2014-09-16 10:59:58', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c79d0660021', 'common.oracle', '鐢查鏂嘜racle鏁版嵁搴', 'zh-cn', '2014-09-16 11:20:31', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-09-16 11:21:58', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c7aee7b0024', 'common.oracle', 'Oracle', 'en', '2014-09-16 11:21:44', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c8f0bfc0027', 'common.sqlserver2008', '寰蒋SQL Server2008', 'zh-cn', '2014-09-16 11:43:42', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-09-16 11:48:44', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c8f57910029', 'common.sqlserver2008', 'SQL Server2008', 'en', '2014-09-16 11:44:01', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c94614b002d', 'common.mysql', '鐢查鏂嘙ySQL', 'zh-cn', '2014-09-16 11:49:32', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0ba487c527201487c948fc0002f', 'common.mysql', 'MySQL', 'en', '2014-09-16 11:49:44', '8a8ab0b246dc81120146dc8181950052', 'admin', null, null, null); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0c34761c347014761dfb98c0001', 'common.english', 'English', 'en', '2014-07-23 14:19:17', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-23 14:19:17', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0c34761c347014761dfde030003', 'common.english', 'English', 'zh-cn', '2014-07-23 14:19:27', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 08:51:07', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0c34761c347014761e00f350005', 'common.chinese', '涓枃', 'en', '2014-07-23 14:19:39', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-25 08:51:20', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0c34761c347014761e0305c0007', 'common.chinese', '涓枃', 'zh-cn', '2014-07-23 14:19:48', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-23 14:19:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0d44756a3bd014756ad82990002', 'user.analysis.histogram', '鐢ㄦ埛鍒嗘瀽鐩存柟鍥', 'zh-cn', '2014-07-21 10:08:37', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 10:08:37', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0d44756a3bd014756ae22ce0004', 'usename.range2to10', '鐢ㄦ埛鍚嶉暱搴﹁寖鍥村湪2~10', 'zh-cn', '2014-07-21 10:09:18', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 10:09:18', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0d44756a3bd014756ae9c2a0006', 'sequence.name', '搴忓彿鍚嶇О', 'zh-cn', '2014-07-21 10:09:49', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 10:09:49', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0d44756ec17014756eff8410001', 'common.menu', '鑿滃崟', 'zh-cn', '2014-07-21 11:21:13', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 11:21:13', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0d44756ec17014756f0122e0003', 'common.menu', 'Menu', 'en', '2014-07-21 11:21:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 11:21:19', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0d44756ec17014756f5940d0007', 'common.area', '鍦板煙', 'zh-cn', '2014-07-21 11:27:20', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 11:27:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0d44756ec17014756f5b12e0009', 'common.area', 'Area', 'en', '2014-07-21 11:27:28', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 11:27:28', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0d447576a86014757a4266d0004', 'common.role.select', '瑙掕壊閫夋嫨', 'zh-cn', '2014-07-21 14:38:01', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 14:38:01', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0d447576a86014757a44a7b0006', 'common.role.select', 'Role Select', 'en', '2014-07-21 14:38:10', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 14:38:10', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0d44757b3f2014757b802010004', 'common.cancel', 'Cancel', 'en', '2014-07-21 14:59:42', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 14:59:42', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0d44757b3f2014757b821e00006', 'common.cancel', '鍙栨秷', 'zh-cn', '2014-07-21 14:59:50', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-21 14:59:50', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0de46c66d490146c674f6ee0002', 'common.data.loading', '鏁版嵁鍔犺浇涓...', 'zh-cn', '2014-06-23 10:01:32', 'admin', '绠$悊鍛', '2014-06-23 10:01:32', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0de46c66d490146c675351b0004', 'common.data.loading', 'Data Loading......', 'en', '2014-06-23 10:01:48', 'admin', '绠$悊鍛', '2014-06-23 10:01:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0de46c66d490146c6788e550006', 'common.exit.confirm', '纭畾閫鍑鸿绯荤粺鍚 ?', 'zh-cn', '2014-06-23 10:05:28', 'admin', '绠$悊鍛', '2014-06-23 10:05:28', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0de46c66d490146c678d8600008', 'common.exit.confirm', 'Confirm Exit?', 'en', '2014-06-23 10:05:46', 'admin', '绠$悊鍛', '2014-06-23 10:05:46', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0de46c66d490146c67af864000a', 'common.change.style', '鍒囨崲椤甸潰椋庢牸', 'zh-cn', '2014-06-23 10:08:06', 'admin', '绠$悊鍛', '2015-05-29 14:09:17', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0de46c66d490146c67b3590000c', 'common.change.style', 'Change Style', 'en', '2014-06-23 10:08:21', 'admin', '绠$悊鍛', '2014-06-23 10:08:21', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0de46c66d490146c683c4ea0012', 'common.browser.recommend', '(鎺ㄨ崘浣跨敤IE8+,璋锋瓕娴忚鍣ㄥ彲浠ヨ幏寰楁洿蹇,鏇村畨鍏ㄧ殑椤甸潰鍝嶅簲閫熷害) 鎶鏈敮鎸侊細', 'zh-cn', '2014-06-23 10:17:42', 'admin', '绠$悊鍛', '2014-06-23 11:05:48', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0de46c66d490146c68486160014', 'common.browser.recommend', '(Recommend IE+, Google browser) Support: ', 'en', '2014-06-23 10:18:32', 'admin', '绠$悊鍛', '2014-06-23 10:18:32', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0e8476756d8014767594f500001', 'common.mutilang', '澶氳瑷', 'zh-cn', '2014-07-24 15:50:12', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-24 15:50:12', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8ab0e8476756d801476759b8930003', 'common.mutilang', 'Muti Language', 'en', '2014-07-24 15:50:38', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-24 15:50:38', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8c8d1c475192970147519e89800004', 'common.description', 'Description', 'en', '2014-07-20 10:34:10', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-20 10:35:01', '8a8ab0b246dc81120146dc8181950052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8c8d1c475192970147519eae6d0006', 'common.description', '鎻忚堪', 'zh-cn', '2014-07-20 10:34:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-20 10:34:19', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8c8d1c4751c965014751cb1ff50001', 'common.langcontext.exist', '璇ュ唴瀹瑰凡缁忓瓨鍦紝璇蜂笉瑕侀噸澶嶆坊鍔', 'zh-cn', '2014-07-20 11:22:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-20 11:22:52', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8a8c8d1c4751c965014751cd221a0003', 'common.langcontext.exist', 'Lang context exist already, don\'t add it again', 'en', '2014-07-20 11:25:03', '8a8ab0b246dc81120146dc8181950052', 'admin', '2014-07-20 11:25:03', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('8b4f561992c84eaa958b10c7912896b8', 'common.weak', '寮', 'zh-cn', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('8ca84db9bbcb44bfb39746822a976907', 'common.role', 'Role', 'en', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('95903aa116c74bdb95b5be510a89c79d', 'common.tel', '鍔炲叕鐢佃瘽', 'zh-cn', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('9c3a8db4891a4d4390f6093ae2fd81af', 'common.strong', '寮', 'zh-cn', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('9f750fb969ed4bdcbbdb212c43746112', 'common.lock.user', 'lock user', 'en', '2014-07-03 18:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('a8e5a8e8c5e44576a1500c3b5f57937b', 'select.byrole', 'According to the role select', 'en', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('ac43aecc3356487c8eb5fa869149412f', 'common.repeat.password', '閲嶅瀵嗙爜', 'zh-cn', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('aec73ffa01b5499db0253b3b34194560', 'username.rang2to10', '鐢ㄦ埛鍚嶈寖鍥村湪2~10浣嶅瓧绗', 'zh-cn', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('b8865c9032054772b39d43efda9ba0c8', 'role.muti.select', 'The role of multiple choices', 'en', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('b8dae445b3ef468db87167ddd8cd1b64', 'please.select.department', '璇烽夋嫨缁勭粐鏈烘瀯', 'zh-cn', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('c150726fac0d43fd9bf28f4590018950', 'common.username', 'User Name', 'en', '2014-07-03 18:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('caaf209a7acb413ea59bbdf30e944f20', 'common.common.mail', 'Mail', 'en', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('ce8b2968f1fc49bba1a636ca18e7f08f', 'usename.range2to10', 'The user name in the range of 2~10 characters', 'en', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('d136cd1f25cc42fe8a0fae2dddc5de23', 'common.weak', 'Weak', 'en', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('dc787a2087ea4f248a394f8a88a5792c', 'common.real.name', '鐪熷疄濮撳悕', 'zh-cn', '2014-07-03 18:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('df075bc6373b4658afcfaff33b088952', 'common.role', '瑙掕壊', 'zh-cn', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('e1fb12b3993b4d1ea35bd536801ada1f', 'common.common.mail', '甯哥敤閭', 'zh-cn', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2015-04-02 23:10:33', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('e547fec1826c4811b6d759f2d81153f8', 'common.password.reset', 'Password Reset', 'en', '2014-07-03 18:39:42', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('f9f74528bde04a0f9e25e29cbc87d9fb', 'fill.realname', '濉啓涓汉鐪熷疄濮撳悕', 'zh-cn', '2014-07-04 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-04 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('fa07850cb8ed4c268cc91ffd31e7ace1', 'common.password', 'Password', 'en', '2014-07-03 18:39:43', '4028818d46f764fb0146f7661cb60052', 'admin', '2014-07-02 23:27:53', '4028818d46f764fb0146f7661cb60052', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d000', 'common.querybuilder', '楂樼骇鏌ヨ', 'zh-cn', '2015-04-28 10:26:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-04-28 10:30:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d001', 'common.code.range', '缂栫爜鑼冨洿鍦2~8浣嶅瓧绗', 'zh-cn', '2015-06-01 10:21:46', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-01 10:22:49', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d002', 'common.code.range', 'The coding in the range of 2~8 characters', 'en', '2015-06-01 10:29:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-01 10:30:54', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d003', 'common.name.range', '鍚嶇О鑼冨洿鍦2~10浣嶅瓧绗', 'zh-cn', '2015-06-01 10:49:33', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-01 10:49:57', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d004', 'common.name.range', 'The name in the range of 2~10 characters', 'en', '2015-06-01 10:51:35', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-01 10:51:48', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d005', 'menu.graph.configuration', '鍥捐〃閰嶇疆', 'zh-cn', '2015-06-02 11:29:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 11:30:02', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d006', 'menu.graph.configuration', 'The graph configuration', 'en', '2015-06-02 11:31:12', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 11:31:26', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d007', 'menu.input.demo', '浜嬩緥褰曞叆', 'zh-cn', '2015-06-02 11:40:30', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 11:40:43', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d008', 'menu.input.demo', 'input demo', 'en', '2015-06-02 11:41:39', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 11:41:29', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d009', 'menu.push.message', '娑堟伅鎺ㄩ', 'zh-cn', '2015-06-02 11:45:36', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 11:45:48', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d010', 'menu.push.message', 'push message', 'en', '2015-06-02 11:46:40', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 11:46:55', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d011', 'menu.business.management', '涓氬姟绠$悊', 'zh-cn', '2015-06-02 11:49:31', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 11:49:42', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d012', 'menu.business.management', 'business management', 'en', '2015-06-02 11:50:48', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 11:51:00', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d013', 'menu.message.template', '娑堟伅妯℃澘绠$悊', 'zh-cn', '2015-06-02 11:54:02', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 11:54:13', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d014', 'menu.message.template', 'The message template', 'en', '2015-06-02 11:54:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 11:55:03', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d015', 'menu.Business.configuration', '涓氬姟閰嶇疆', 'zh-cn', '2015-06-02 11:58:40', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 11:58:58', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d016', 'menu.Business.configuration', 'Business configuration', 'en', '2015-06-02 11:58:20', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 11:59:01', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d017', 'menu.send.message', '娑堟伅鍙戦佺洃鎺', 'zh-cn', '2015-06-02 12:02:31', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 12:02:43', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d018', 'menu.send.message', 'Message is sent', 'en', '2015-06-02 12:02:54', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 12:03:00', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d019', 'menu.sort.management', '鍒嗙被绠$悊', 'zh-cn', '2015-06-02 12:07:04', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 12:07:23', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d020', 'menu.sort.management', 'sort management', 'en', '2015-06-02 12:07:08', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 12:07:27', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d021', 'menu.nice.list', '婕備寒鍒楄〃', 'zh-cn', '2015-06-02 12:11:09', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 12:11:29', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d022', 'menu.nice.list', 'Nice list', 'en', '2015-06-02 12:11:12', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 12:11:26', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d023', 'menu.data.permission', '鏁版嵁鏉冮檺', 'zh-cn', '2015-06-02 12:14:25', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 12:14:39', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d024', 'menu.data.permission', 'data permission', 'en', '2015-06-02 12:14:22', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 12:14:58', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d025', 'menu.user.management', '鐢ㄦ埛绠$悊', 'zh-cn', '2015-06-02 13:14:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 13:14:32', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d026', 'menu.user.management', 'user management', 'en', '2015-06-02 13:14:16', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 13:14:44', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d027', 'menu.Leave.data.access', 'OL璇峰亣鏁版嵁鏉冮檺', 'zh-cn', '2015-06-02 13:19:51', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 13:20:10', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d028', 'menu.Leave.data.access', 'Leave the data access', 'en', '2015-06-02 13:19:55', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 13:20:13', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d029', 'menu.form.validation', '琛ㄥ崟楠岃瘉', 'zh-cn', '2015-06-02 14:49:50', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 14:55:01', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d030', 'menu.form.validation', 'Form validation', 'en', '2015-06-02 14:49:54', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 14:55:13', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d031', 'menu.demo.example', 'demo绀轰緥', 'zh-cn', '2015-06-02 14:58:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 14:58:59', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d032', 'menu.demo.example', 'demo example', 'en', '2015-06-02 14:58:46', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 14:59:11', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d033', 'menu.minidao.example', 'minidao渚嬪瓙', 'zh-cn', '2015-06-02 15:03:49', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:04:04', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d034', 'menu.minidao.example', 'minidao example', 'en', '2015-06-02 15:03:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:04:10', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d035', 'menu.form.model', '琛ㄥ崟妯″瀷', 'zh-cn', '2015-06-02 15:13:44', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:13:59', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d036', 'menu.form.model', 'The form model', 'en', '2015-06-02 15:13:47', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:14:02', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d037', 'menu.one_to_many.model', '涓瀵瑰妯″瀷', 'zh-cn', '2015-06-02 15:17:51', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:18:18', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d038', 'menu.one_to_many.model', 'one-to-many model', 'en', '2015-06-02 15:17:54', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:18:21', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d039', 'menu.import_export.excel', 'Excel瀵煎叆瀵煎嚭', 'zh-cn', '2015-06-02 15:23:03', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:23:39', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d040', 'menu.import_export.excel', 'import and export of the excel ', 'en', '2015-06-02 15:23:06', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:23:43', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d041', 'menu.uploads_downloads', '涓婁紶涓嬭浇', 'zh-cn', '2015-06-02 15:31:48', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:32:04', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d042', 'menu.uploads_downloads', 'Uploads and downloads', 'en', '2015-06-02 15:31:51', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:32:09', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d043', 'menu.JqueryFileUpload.example', 'JqueryFileUpload绀轰緥', 'zh-cn', '2015-06-02 15:35:07', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:35:30', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d044', 'menu.JqueryFileUpload.example', 'JqueryFileUpload example', 'en', '2015-06-02 15:35:09', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:35:32', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d045', 'menu.no.paging', '鏃犲垎椤靛垪琛', 'zh-cn', '2015-06-02 15:39:15', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:39:34', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d046', 'menu.no.paging', 'No paging list', 'en', '2015-06-02 15:39:17', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:39:37', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d047', 'menu.jdbc.example', 'jdbc绀轰緥', 'zh-cn', '2015-06-02 15:42:32', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:42:49', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d048', 'menu.jdbc.example', 'jdbc example', 'en', '2015-06-02 15:42:34', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:42:52', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d049', 'menu.sql.separation', 'SQL鍒嗙', 'zh-cn', '2015-06-02 15:47:02', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:47:17', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d050', 'menu.sql.separation', 'SQL separation', 'en', '2015-06-02 15:47:04', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:47:23', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d051', 'menu.dictionary.labels', '瀛楀吀鏍囩', 'zh-cn', '2015-06-02 15:49:48', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:50:34', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d052', 'menu.dictionary.labels', 'The dictionary labels', 'en', '2015-06-02 15:50:21', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:50:40', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d053', 'menu.form.thePop_UpStyle', '琛ㄥ崟寮瑰嚭椋庢牸', 'zh-cn', '2015-06-02 15:54:56', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:55:13', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d054', 'menu.form.thePop_UpStyle', 'Form the pop-up style', 'en', '2015-06-02 15:54:57', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:55:15', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d055', 'menu.special.layout', '鐗规畩甯冨眬', 'zh-cn', '2015-06-02 15:58:36', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:58:57', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d056', 'menu.special.layout', 'The special layout', 'en', '2015-06-02 15:58:38', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 15:58:59', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d057', 'menu.single.table', '鍗曡〃渚嬪瓙锛堟棤tag锛', 'zh-cn', '2015-06-02 16:02:33', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:02:52', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d058', 'menu.single.table', 'Single table example(no tag)', 'en', '2015-06-02 16:02:36', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:02:54', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d059', 'menu.one_to_many.example', '涓瀵瑰渚嬪瓙锛堟棤tag锛', 'zh-cn', '2015-06-02 16:06:06', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:08:01', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d060', 'menu.one_to_many.example', 'one to many example(no tag)', 'en', '2015-06-02 16:07:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:08:04', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d061', 'menu.html.editor', 'HTML缂栬緫鍣', 'zh-cn', '2015-06-02 16:11:39', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:12:00', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d062', 'menu.html.editor', 'HTML editor', 'en', '2015-06-02 16:11:42', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:12:03', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d063', 'menu.word.online', '鍦ㄧ嚎word(IE)', 'zh-cn', '2015-06-02 16:14:36', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:14:55', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d064', 'menu.word.online', 'word online(IE)', 'en', '2015-06-02 16:14:38', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:14:58', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d065', 'menu.webOfficeo.fficialExample', 'WebOffice瀹樻柟渚嬪瓙', 'zh-cn', '2015-06-02 16:19:45', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:20:05', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d066', 'menu.webOfficeo.fficialExample', 'The official example of WebOffice', 'en', '2015-06-02 16:19:48', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:20:07', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d067', 'menu.moreAccessoriesManagement', '澶氶檮浠剁鐞', 'zh-cn', '2015-06-02 16:24:18', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:24:36', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d068', 'menu.moreAccessoriesManagement', 'More accessories management', 'en', '2015-06-02 16:24:21', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:24:39', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d069', 'menu.datagridHandHtml', 'Datagrid鎵嬪伐Html', 'zh-cn', '2015-06-02 16:28:48', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:29:04', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d070', 'menu.datagridHandHtml', 'Datagrid Html with hand', 'en', '2015-06-02 16:28:50', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:29:06', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d071', 'menu.materialPom', '鐗╂枡POM', 'zh-cn', '2015-06-02 16:37:09', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:37:27', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d072', 'menu.materialPom', 'material pom', 'en', '2015-06-02 16:37:11', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:37:29', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d073', 'menu.ckfinderDemo', 'ckfinder渚嬪瓙', 'zh-cn', '2015-06-02 16:40:05', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:40:26', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d074', 'menu.ckfinderDemo', 'ckfinder demo', 'en', '2015-06-02 16:40:07', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:40:28', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d075', 'menu.queryEditor', '鏌ヨ缂栬緫鍣', 'zh-cn', '2015-06-02 16:44:01', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:44:34', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba487c37d001487c488a4d076', 'menu.queryEditor', 'The query editor', 'en', '2015-06-02 16:44:04', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-02 16:44:38', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0001', 'common.wage', 'wage', 'en', '2015-06-03 16:34:36', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:34:52', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0002', 'common.clear.localstorage', '娓呴櫎缂撳瓨', 'zh-cn', '2015-04-28 10:26:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-05-25 16:30:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0003', 'common.clear.localstorage', 'Clear Cache', 'en', '2015-04-28 10:26:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-05-25 16:30:20', 'admin', '绠$悊鍛'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0004', 'common.messageSend.record', '娑堟伅鍙戦佽褰曡〃', 'zh-cn', '2015-06-03 10:50:30', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 10:50:48', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0005', 'common.messageSend.record', 'data record to send message', 'en', '2015-06-03 10:50:33', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 10:50:50', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0006', 'common.messageHeader', '娑堟伅鏍囬', 'zh-cn', '2015-06-03 11:05:23', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:05:46', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0007', 'common.messageHeader', 'message header', 'en', '2015-06-03 11:05:25', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:05:49', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0008', 'common.messageType', '娑堟伅绫诲瀷', 'zh-cn', '2015-06-03 11:09:09', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:09:35', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0009', 'common.messageType', 'message type', 'en', '2015-06-03 11:09:13', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:09:38', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0010', 'common.sender', '鍙戦佷汉', 'zh-cn', '2015-06-03 11:13:05', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:13:26', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0011', 'common.sender', 'sender', 'en', '2015-06-03 11:13:09', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:13:29', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0012', 'common.receiver', '鎺ユ敹浜', 'zh-cn', '2015-06-03 11:15:57', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:16:21', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0013', 'common.receiver', 'receiver', 'en', '2015-06-03 11:16:00', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:16:24', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0014', 'common.content_2', '鍐呭', 'zh-cn', '2015-06-03 11:19:49', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:20:13', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0015', 'common.content_2', 'content', 'en', '2015-06-03 11:19:53', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:20:16', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0016', 'common.dateCreated', '鍒涘缓鏃ユ湡', 'zh-cn', '2015-06-03 11:22:32', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:22:55', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0017', 'common.dateCreated', 'date created', 'en', '2015-06-03 11:22:34', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:22:59', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0018', 'common.sendtime', '鍙戦佹椂闂', 'zh-cn', '2015-06-03 11:25:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:26:02', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0019', 'common.sendtime', 'sendtime', 'en', '2015-06-03 11:25:46', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:26:05', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0020', 'common.sendState', '鍙戦佺姸鎬', 'zh-cn', '2015-06-03 11:30:01', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:30:23', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0021', 'common.sendState', 'send state', 'en', '2015-06-03 11:30:04', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:30:26', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0022', 'common.remark', '澶囨敞', 'zh-cn', '2015-06-03 11:32:37', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:32:56', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0023', 'common.remark', 'remark', 'en', '2015-06-03 11:32:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:33:00', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0024', 'common.esId', '涓婚敭', 'zh-cn', '2015-06-03 11:37:16', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:37:38', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0025', 'common.esId', 'ID', 'en', '2015-06-03 11:37:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:37:41', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0026', 'common.iconEdit', '娑堟伅淇', 'zh-cn', '2015-06-03 11:40:50', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:41:09', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0027', 'common.iconEdit', 'Message modification', 'en', '2015-06-03 11:40:52', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:41:11', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0028', 'common.businessSqlTable', '涓氬姟SQL琛', 'zh-cn', '2015-06-03 11:50:24', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:50:48', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0029', 'common.businessSqlTable', 'The SQL table of business', 'en', '2015-06-03 11:50:27', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:50:52', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0030', 'common.sqlName', 'SQL鍚嶇О', 'zh-cn', '2015-06-03 11:53:08', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:53:28', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0031', 'common.sqlName', 'SQL name', 'en', '2015-06-03 11:53:11', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:53:33', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0032', 'common.sqlContent', 'SQL鍐呭', 'zh-cn', '2015-06-03 11:55:25', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:55:47', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0033', 'common.sqlContent', 'SQL content', 'en', '2015-06-03 11:55:28', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:55:49', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0034', 'common.operate', '鎿嶄綔', 'zh-cn', '2015-06-03 11:57:51', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:58:13', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0035', 'common.operate', 'operate', 'en', '2015-06-03 11:57:54', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 11:58:16', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0036', 'common.delete_2', '鍒犻櫎', 'zh-cn', '2015-06-03 12:01:21', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 12:01:48', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0037', 'common.delete_2', 'delete', 'en', '2015-06-03 12:01:25', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 12:01:51', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0038', 'common.add_2', '褰曞叆', 'zh-cn', '2015-06-03 12:04:03', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 12:04:28', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0039', 'common.add_2', 'add', 'en', '2015-06-03 12:04:06', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 12:04:31', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0040', 'common.edit_2', '缂栬緫', 'zh-cn', '2015-06-03 12:06:22', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 12:06:46', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0041', 'common.edit_2', 'edit', 'en', '2015-06-03 12:06:26', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 12:06:50', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0042', 'common.batchDelete', '鎵归噺鍒犻櫎', 'zh-cn', '2015-06-03 12:09:29', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 12:09:52', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0043', 'common.batchDelete', 'Batch Delete', 'en', '2015-06-03 12:09:32', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 12:09:57', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0044', 'common.search', '鏌ョ湅', 'zh-cn', '2015-06-03 12:12:58', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 12:13:15', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0045', 'common.search', 'check', 'en', '2015-06-03 12:13:01', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 12:13:17', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0046', 'common.isId', '涓婚敭', 'zh-cn', '2015-06-03 14:29:46', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:30:06', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0047', 'common.isId', 'ID', 'en', '2015-06-03 14:29:49', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:30:13', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0048', 'common.createName', '鍒涘缓浜哄悕绉', 'zh-cn', '2015-06-03 14:32:21', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:32:41', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0049', 'common.createName', 'createName', 'en', '2015-06-03 14:32:24', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:32:45', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0050', 'common.create.By', '鍒涘缓浜虹櫥褰曞悕', 'zh-cn', '2015-06-03 14:35:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:36:23', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0051', 'common.create.By', 'createBy', 'en', '2015-06-03 14:35:47', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:36:27', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0052', 'common.createDate', '鍒涘缓鏃ユ湡', 'zh-cn', '2015-06-03 14:38:14', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:38:42', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0053', 'common.createDate', 'createDate', 'en', '2015-06-03 14:38:17', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:38:45', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0054', 'common.updateName', '鏇存柊浜哄悕绉', 'zh-cn', '2015-06-03 14:41:16', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:41:34', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0055', 'common.updateName', 'updateName', 'en', '2015-06-03 14:41:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:41:37', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0056', 'common.updateByName', '鏇存柊浜虹櫥褰曞悕绉', 'zh-cn', '2015-06-03 14:44:11', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:44:30', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0057', 'common.updateByName', 'updateByName', 'en', '2015-06-03 14:44:14', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:44:34', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0058', 'common.updateDate', '鏇存柊鏃ユ湡', 'zh-cn', '2015-06-03 14:46:24', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:46:41', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0059', 'common.updateDate', 'updateDate', 'en', '2015-06-03 14:46:27', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:46:44', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0060', 'common.templateName', '妯℃澘鍚嶇О', 'zh-cn', '2015-06-03 14:49:29', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:49:54', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0061', 'common.templateName', 'templateName', 'en', '2015-06-03 14:49:31', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:49:49', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0062', 'common.templateType', '妯℃澘绫诲瀷', 'zh-cn', '2015-06-03 14:51:59', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:52:18', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0063', 'common.templateType', 'templateType', 'en', '2015-06-03 14:52:02', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:52:21', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0064', 'common.templateContent', '妯℃澘鍐呭', 'zh-cn', '2015-06-03 14:54:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:55:00', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0065', 'common.templateContent', 'templateContent', 'en', '2015-06-03 14:54:46', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:55:04', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0066', 'common.opt', '鎿嶄綔', 'zh-cn', '2015-06-03 14:56:50', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:57:13', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0067', 'common.opt', 'opt', 'en', '2015-06-03 14:56:55', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 14:57:15', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0068', 'common.deleteTo', '鍒犻櫎', 'zh-cn', '2015-06-03 15:01:04', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:01:22', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0069', 'common.deleteTo', 'delete', 'en', '2015-06-03 15:01:07', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:01:25', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0070', 'common.icon.add', '褰曞叆', 'zh-cn', '2015-06-03 15:03:55', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:04:15', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0071', 'common.icon.add', 'add', 'en', '2015-06-03 15:03:58', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:04:18', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0072', 'common.icon.edit', '缂栬緫', 'zh-cn', '2015-06-03 15:06:14', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:06:34', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0073', 'common.icon.edit', 'edit', 'en', '2015-06-03 15:06:17', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:06:38', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0074', 'common.icon.remove', '鎵归噺鍒犻櫎', 'zh-cn', '2015-06-03 15:08:37', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:08:55', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0075', 'common.icon.remove', 'Batch Delete', 'en', '2015-06-03 15:08:40', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:08:58', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0076', 'common.icon.search', '鏌ョ湅', 'zh-cn', '2015-06-03 15:10:42', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:11:07', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0077', 'common.icon.search', 'search', 'en', '2015-06-03 15:10:46', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:11:10', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0078', 'common.msgTemplateTable', '娑堟伅妯℃澘琛', 'zh-cn', '2015-06-03 15:14:16', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:14:35', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0079', 'common.msgTemplateTable', 'message template table', 'en', '2015-06-03 15:14:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:14:39', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0080', 'common.sqlDataTable', '娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛', 'zh-cn', '2015-06-03 15:29:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:30:01', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0081', 'common.sqlDataTable', 'message template_sql configuration', 'en', '2015-06-03 15:29:46', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:30:04', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0082', 'common.createLoginName', '鍒涘缓浜虹櫥褰曞悕绉', 'zh-cn', '2015-06-03 15:46:04', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:46:25', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0083', 'common.createLoginName', 'create by name to login', 'en', '2015-06-03 15:46:07', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:46:30', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0084', 'common.configurationCODE', '閰嶇疆CODE', 'zh-cn', '2015-06-03 15:50:40', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:50:57', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0085', 'common.configurationCODE', 'configurationCODE', 'en', '2015-06-03 15:50:43', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:51:00', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0086', 'common.configurationName', '閰嶇疆鍚嶇О', 'zh-cn', '2015-06-03 15:53:03', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:53:19', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0087', 'common.configurationName', 'configurationName', 'en', '2015-06-03 15:53:06', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:53:22', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0088', 'common.sqlBusinessId', '涓氬姟SQLID', 'zh-cn', '2015-06-03 15:56:38', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:56:59', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0089', 'common.sqlBusinessId', 'ID of SQL business', 'en', '2015-06-03 15:56:40', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 15:57:01', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0090', 'common.msgModeliD', '娑堟伅妯℃湰ID', 'zh-cn', '2015-06-03 16:01:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:01:49', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0091', 'common.msgModeliD', 'message model ID ', 'en', '2015-06-03 16:01:23', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:01:52', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0092', 'common.pushTest', '鎺ㄩ佹祴璇', 'zh-cn', '2015-06-03 16:04:56', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:05:13', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0093', 'common.pushTest', 'push test', 'en', '2015-06-03 16:04:58', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:05:16', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0094', 'common.moblePhone', '鎵嬫満', 'zh-cn', '2015-06-03 16:24:12', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:24:29', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0095', 'common.moblePhone', 'moble phone', 'en', '2015-06-03 16:24:15', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:24:33', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0096', 'common.age', '骞撮緞', 'zh-cn', '2015-06-03 16:26:36', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:26:54', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0097', 'common.age', 'age', 'en', '2015-06-03 16:26:38', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:26:57', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0098', 'common.email', '鐢靛瓙閭', 'zh-cn', '2015-06-03 16:29:02', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:29:19', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0099', 'common.email', 'email', 'en', '2015-06-03 16:29:05', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:29:22', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c488a4d0100', 'common.wage', '宸ヨ祫', 'zh-cn', '2015-06-03 16:34:33', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:34:49', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0002', 'common.sex', '鎬у埆', 'zh-cn', '2015-06-03 16:37:19', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:37:36', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0003', 'common.sex', 'sex', 'en', '2015-06-03 16:37:23', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:37:39', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0004', 'common.birthday', '鐢熸棩', 'zh-cn', '2015-06-03 16:40:24', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:40:49', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0005', 'common.birthday', 'birthday', 'en', '2015-06-03 16:40:27', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-03 16:40:53', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0022', 'common.sendSuccess', '鍙戦佹垚鍔', 'zh-cn', '2015-06-05 10:38:37', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 10:38:53', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0023', 'common.sendSuccess', 'send success', 'en', '2015-06-05 10:38:41', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 10:38:55', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0024', 'common.failToSend', '鍙戦佸け璐', 'zh-cn', '2015-06-05 10:42:42', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 10:42:58', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0025', 'common.failToSend', 'fail to send', 'en', '2015-06-05 10:42:44', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 10:43:01', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0026', 'common.didNotSend', '鏈彂閫', 'zh-cn', '2015-06-05 10:47:58', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 10:48:18', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0027', 'common.didNotSend', 'Did not send', 'en', '2015-06-05 10:48:00', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 10:48:20', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0028', 'common.smsAlerts', '鐭俊鎻愰啋', 'zh-cn', '2015-06-05 10:51:28', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 10:51:42', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0029', 'common.smsAlerts', 'SMS alerts', 'en', '2015-06-05 10:51:30', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 10:51:45', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0030', 'common.emailAlerts', '閭欢鎻愰啋', 'zh-cn', '2015-06-05 10:58:42', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 10:58:55', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0031', 'common.emailAlerts', ' Email Alerts', 'en', '2015-06-05 10:58:44', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 10:58:57', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0032', 'common.sysAlerts', '绯荤粺鎻愰啋', 'zh-cn', '2015-06-05 11:02:54', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 11:03:08', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0033', 'common.sysAlerts', 'SYS alerts', 'en', '2015-06-05 11:02:56', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 11:03:10', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0034', 'common.smsAlertsModel', '鐭俊鎻愰啋妯℃澘', 'zh-cn', '2015-06-05 11:07:30', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 11:07:43', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0035', 'common.smsAlertsModel', 'SMS alerts model', 'en', '2015-06-05 11:07:31', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 11:07:45', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0036', 'common.emailAlertsModel', '閭欢鎻愰啋妯℃澘', 'zh-cn', '2015-06-05 11:11:57', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 11:12:12', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d0037', 'common.emailAlertsModel', 'Email alerts model', 'en', '2015-06-05 11:12:00', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 11:12:14', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d1111', 'common.lock.user.tips', '纭畾閿佸畾鐢ㄦ埛鍚', 'zh-cn', '2015-06-05 16:56:09', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 16:56:23', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d1112', 'common.lock.user.tips', 'is confirm lock user', 'en', '2015-06-05 16:56:11', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 16:56:26', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d1113', 'common.unlock.user.tips', '纭畾婵娲荤敤鎴峰悧', 'zh-cn', '2015-06-05 16:59:20', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 16:59:34', 'admin', 'admin'); +INSERT INTO `t_s_muti_lang` VALUES ('jglongjba87c37d001487c499a4d1114', 'common.unlock.user.tips', 'Sure to activate user', 'en', '2015-06-05 16:59:22', '8a8ab0b246dc81120146dc8181950052', 'admin', '2015-06-05 16:59:36', 'admin', 'admin'); + +-- ---------------------------- +-- Table structure for `t_s_operation` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_operation`; +CREATE TABLE `t_s_operation` ( + `ID` varchar(32) NOT NULL, + `operationcode` varchar(50) default NULL, + `operationicon` varchar(100) default NULL, + `operationname` varchar(50) default NULL, + `status` smallint(6) default NULL, + `functionid` varchar(32) default NULL, + `iconid` varchar(32) default NULL, + `operationtype` smallint(6) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_pceuy41wr2fjbcilyc7mk3m1f` (`functionid`), + KEY `FK_ny5de7922l39ta2pkhyspd5f` (`iconid`), + CONSTRAINT `FK_ny5de7922l39ta2pkhyspd5f` FOREIGN KEY (`iconid`) REFERENCES `t_s_icon` (`ID`), + CONSTRAINT `FK_pceuy41wr2fjbcilyc7mk3m1f` FOREIGN KEY (`functionid`) REFERENCES `t_s_function` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_operation +-- ---------------------------- +INSERT INTO `t_s_operation` VALUES ('40288088481d019401481d30a0d1000f', 'add_phnoe', null, '鎵嬫満鍙风爜褰曞叆', '0', '40288088481d019401481d2fcebf000d', '8a8ab0b246dc81120146dc8180460000', '1'); +INSERT INTO `t_s_operation` VALUES ('402880e6481d48cb01481d539df6000c', 'userName', null, 'userName', '0', '8a8ab0b246dc81120146dc8181300037', '8a8ab0b246dc81120146dc8180460000', '0'); +INSERT INTO `t_s_operation` VALUES ('8a8ab0b246dc81120146dc81824f0078', 'add', null, '褰曞叆', '0', '8a8ab0b246dc81120146dc8181300037', '8a8ab0b246dc81120146dc8180800001', '0'); +INSERT INTO `t_s_operation` VALUES ('8a8ab0b246dc81120146dc8182540079', 'edit', null, '缂栬緫', '0', '8a8ab0b246dc81120146dc8181300037', '8a8ab0b246dc81120146dc8180800001', '0'); +INSERT INTO `t_s_operation` VALUES ('8a8ab0b246dc81120146dc818258007a', 'del', null, '鍒犻櫎', '0', '8a8ab0b246dc81120146dc8181300037', '8a8ab0b246dc81120146dc8180800001', '0'); +INSERT INTO `t_s_operation` VALUES ('8a8ab0b246dc81120146dc81825b007b', 'szqm', null, '瀹℃牳', '0', '8a8ab0b246dc81120146dc8181300037', '8a8ab0b246dc81120146dc8180800001', '0'); + +-- ---------------------------- +-- Table structure for `t_s_opintemplate` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_opintemplate`; +CREATE TABLE `t_s_opintemplate` ( + `ID` varchar(32) NOT NULL, + `descript` varchar(100) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_opintemplate +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `t_s_role` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_role`; +CREATE TABLE `t_s_role` ( + `ID` varchar(32) NOT NULL, + `rolecode` varchar(10) default NULL, + `rolename` varchar(100) NOT NULL, + `update_name` varchar(32) default NULL COMMENT '淇敼浜', + `update_date` datetime default NULL COMMENT '淇敼鏃堕棿', + `update_by` varchar(32) default NULL COMMENT '淇敼浜篿d', + `create_name` varchar(32) default NULL COMMENT '鍒涘缓浜', + `create_date` datetime default NULL COMMENT '鍒涘缓鏃堕棿', + `create_by` varchar(32) default NULL COMMENT '鍒涘缓浜篿d', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_role +-- ---------------------------- +INSERT INTO `t_s_role` VALUES ('402880e74d75c4dd014d75d3c5f40001', 'demo', 'demo', null, null, null, '绠$悊鍛', '2015-05-21 17:35:22', 'admin'); +INSERT INTO `t_s_role` VALUES ('8a8ab0b246dc81120146dc8181870050', 'admin', '绠$悊鍛', null, null, null, null, null, null); +INSERT INTO `t_s_role` VALUES ('8a8ab0b246dc81120146dc81818b0051', 'manager', '鏅氱敤鎴', null, null, null, null, null, null); + +-- ---------------------------- +-- Table structure for `t_s_role_function` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_role_function`; +CREATE TABLE `t_s_role_function` ( + `ID` varchar(32) NOT NULL, + `operation` varchar(10000) default NULL, + `functionid` varchar(32) default NULL, + `roleid` varchar(32) default NULL, + `datarule` varchar(1000) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_fvsillj2cxyk5thnuu625urab` (`functionid`), + KEY `FK_9dww3p4w8jwvlrgwhpitsbfif` (`roleid`), + CONSTRAINT `FK_9dww3p4w8jwvlrgwhpitsbfif` FOREIGN KEY (`roleid`) REFERENCES `t_s_role` (`ID`), + CONSTRAINT `FK_fvsillj2cxyk5thnuu625urab` FOREIGN KEY (`functionid`) REFERENCES `t_s_function` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_role_function +-- ---------------------------- +INSERT INTO `t_s_role_function` VALUES ('2c90ac564c9d1734014c9d6f85d10026', null, '2c90ac564c9d1734014c9d6f4e370024', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('4028808848845c0f01488464dbe2000e', null, '4028808848845c0f014884649488000c', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('4028808848845c0f01488464dc1a000f', null, '4028808848845c0f01488461226e0001', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('4028808848845c0f01488464dc1a0010', null, '4028808848845c0f01488462658f0006', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('4028808848845c0f01488464dc1a0011', null, '4028808848845c0f01488463aa210009', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('4028808848845c0f01488464dc1a0012', null, '4028808848845c0f01488461b3ac0004', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('402880e448a28b750148a290dbcb0003', null, '402880e448a28b750148a290c0e50001', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74c7aab8d014c7aac5bf50001', null, '402880e74c783db3014c783ff88b0001', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74cfa77e4014cfa799b1b0003', null, '40288088481d019401481d2fcebf000d', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74cfa77e4014cfa799b1d0004', null, '402889fb486e848101486e8de3d60005', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74cfa77e4014cfa799b1d0005', null, '402889fb486e848101486e8e2e8b0007', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74cfa77e4014cfa799b1d0006', null, '402889fb486e848101486e93a7c80014', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74d75c4dd014d75d3df830003', null, '8a8ab0b246dc81120146dc8181300037', '402880e74d75c4dd014d75d3c5f40001', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74d75c4dd014d75d3df860004', null, '8a8ab0b246dc81120146dc8180d7001c', '402880e74d75c4dd014d75d3c5f40001', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74d76e784014d76f64d070016', null, '402880e74d76e784014d76f5cc2e0014', '402880e74d75c4dd014d75d3c5f40001', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74d76e784014d76f64d0b0017', null, '402880e74d76e784014d76f5505a0012', '402880e74d75c4dd014d75d3c5f40001', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74d76e784014d76fa34ff0022', null, '402880e74d76e784014d76f5505a0012', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74d76e784014d76fa35000023', null, '402880e74d76e784014d76f5cc2e0014', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74d76e784014d76fa9bdb0026', null, '402880e74d76e784014d76fa7e970024', '402880e74d75c4dd014d75d3c5f40001', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74d76e784014d76fbf5a6002d', null, '402880e74d76e784014d76fa7e970024', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74d76e784014d76fd30f60032', null, '402880e74d76e784014d76fd1bd60030', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('402880e74d76e784014d76fd3db10033', null, '402880e74d76e784014d76fd1bd60030', '402880e74d75c4dd014d75d3c5f40001', null); +INSERT INTO `t_s_role_function` VALUES ('402881c746de1ea60146de20b9d60003', '', '402881c746de1ea60146de207d770001', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81826d007c', '', '8a8ab0b246dc81120146dc8180ce0019', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc818272007d', '', '8a8ab0b246dc81120146dc8180ce0019', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc818275007e', '', '8a8ab0b246dc81120146dc8180d2001a', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc818279007f', '', '8a8ab0b246dc81120146dc8180d2001a', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81827d0080', '', '8a8ab0b246dc81120146dc8180d4001b', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182820081', '', '8a8ab0b246dc81120146dc8180d4001b', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81828a0082', '', '8a8ab0b246dc81120146dc8180d7001c', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182920084', '', '8a8ab0b246dc81120146dc8180d9001d', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182980086', '', '8a8ab0b246dc81120146dc8180df001f', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81829b0087', '', '8a8ab0b246dc81120146dc8180df001f', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81829e0088', '', '8a8ab0b246dc81120146dc8180e30021', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182a20089', '', '8a8ab0b246dc81120146dc8180e30021', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182a5008a', '', '8a8ab0b246dc81120146dc8180e70023', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182a7008b', '', '8a8ab0b246dc81120146dc8180e70023', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182aa008c', '', '8a8ab0b246dc81120146dc8180ee0025', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182ad008d', '', '8a8ab0b246dc81120146dc8180ee0025', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182b0008e', '', '8a8ab0b246dc81120146dc8180f30027', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182b2008f', '', '8a8ab0b246dc81120146dc8180f30027', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182b40090', '', '8a8ab0b246dc81120146dc8180f60028', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182b60091', '', '8a8ab0b246dc81120146dc8180f60028', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182b70092', '', '8a8ab0b246dc81120146dc8180f80029', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182b90093', '', '8a8ab0b246dc81120146dc8180f80029', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182bb0094', '', '8a8ab0b246dc81120146dc8180fe002b', '8a8ab0b246dc81120146dc8181870050', '402889fe47fcb29c0147fcb6b6220001,'); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182bd0095', '', '8a8ab0b246dc81120146dc8180fe002b', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182be0096', '', '8a8ab0b246dc81120146dc818106002d', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182c00097', '', '8a8ab0b246dc81120146dc818106002d', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182c20098', '', '8a8ab0b246dc81120146dc818109002e', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182c40099', '', '8a8ab0b246dc81120146dc818109002e', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182c6009a', '', '8a8ab0b246dc81120146dc8181100030', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182c9009c', '', '8a8ab0b246dc81120146dc81811d0032', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182cd009e', '', '8a8ab0b246dc81120146dc8181250034', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182d000a0', '', '8a8ab0b246dc81120146dc81812b0036', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182d400a2', '', '8a8ab0b246dc81120146dc8181300037', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182d700a4', '', '8a8ab0b246dc81120146dc8181330038', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182da00a6', '', '8a8ab0b246dc81120146dc8181370039', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182de00a8', '', '8a8ab0b246dc81120146dc81813a003a', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182e200aa', '', '8a8ab0b246dc81120146dc81813e003b', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182e600ac', '', '8a8ab0b246dc81120146dc818141003c', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182ea00ae', '', '8a8ab0b246dc81120146dc818145003d', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182ef00b0', '', '8a8ab0b246dc81120146dc818148003e', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182f300b2', '', '8a8ab0b246dc81120146dc81814b003f', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182f800b4', '', '8a8ab0b246dc81120146dc81814e0040', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc8182fd00b6', '', '8a8ab0b246dc81120146dc8181510041', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81830100b8', '', '8a8ab0b246dc81120146dc8181530042', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81830500ba', '', '8a8ab0b246dc81120146dc8181590044', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81830a00bc', '', '8a8ab0b246dc81120146dc81815c0045', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81830e00be', '', '8a8ab0b246dc81120146dc8181610046', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81831100c0', '', '8a8ab0b246dc81120146dc8181640047', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81831600c2', '', '8a8ab0b246dc81120146dc8181680048', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81831a00c4', '', '8a8ab0b246dc81120146dc81816b0049', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81831e00c6', '', '8a8ab0b246dc81120146dc818173004b', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81832300c8', '', '8a8ab0b246dc81120146dc818176004c', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81832700ca', '', '8a8ab0b246dc81120146dc81817b004d', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81832b00cc', '', '8a8ab0b246dc81120146dc81817f004e', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81832d00cd', '', '8a8ab0b246dc81120146dc81817f004e', '8a8ab0b246dc81120146dc81818b0051', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81832f00ce', '', '8a8ab0b246dc81120146dc818183004f', '8a8ab0b246dc81120146dc8181870050', null); +INSERT INTO `t_s_role_function` VALUES ('8a8ab0b246dc81120146dc81833100d1', null, '8a8ab0b246dc81120146dc818183004h', '8a8ab0b246dc81120146dc8181870050', null); + +-- ---------------------------- +-- Table structure for `t_s_role_org` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_role_org`; +CREATE TABLE `t_s_role_org` ( + `ID` varchar(32) NOT NULL, + `org_id` varchar(32) default NULL, + `role_id` varchar(32) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_role_org +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `t_s_role_user` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_role_user`; +CREATE TABLE `t_s_role_user` ( + `ID` varchar(32) NOT NULL, + `roleid` varchar(32) default NULL, + `userid` varchar(32) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_n2ucxeorvpjy7qhnmuem01kbx` (`roleid`), + KEY `FK_d4qb5xld2pfb0bkjx9iwtolda` (`userid`), + CONSTRAINT `FK_d4qb5xld2pfb0bkjx9iwtolda` FOREIGN KEY (`userid`) REFERENCES `t_s_user` (`id`), + CONSTRAINT `FK_n2ucxeorvpjy7qhnmuem01kbx` FOREIGN KEY (`roleid`) REFERENCES `t_s_role` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_role_user +-- ---------------------------- +INSERT INTO `t_s_role_user` VALUES ('402880e74d75c4dd014d75d44b770007', '402880e74d75c4dd014d75d3c5f40001', '402880e74d75c4dd014d75d44af30005'); +INSERT INTO `t_s_role_user` VALUES ('402880e74d89cb70014d89cdfffd0005', '8a8ab0b246dc81120146dc81818b0051', '8a8ab0b246dc81120146dc81819d0053'); +INSERT INTO `t_s_role_user` VALUES ('402889fb486e848101486e89fa5a0003', '8a8ab0b246dc81120146dc8181870050', '8a8ab0b246dc81120146dc8181950052'); +INSERT INTO `t_s_role_user` VALUES ('8a8ab0b246dc81120146dc81834100d3', '8a8ab0b246dc81120146dc8181870050', '8a8ab0b246dc81120146dc8181a10054'); +INSERT INTO `t_s_role_user` VALUES ('8a8ab0b246dc81120146dc81834300d4', '8a8ab0b246dc81120146dc8181870050', '8a8ab0b246dc81120146dc8181a60055'); + +-- ---------------------------- +-- Table structure for `t_s_sms` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_sms`; +CREATE TABLE `t_s_sms` ( + `id` varchar(36) NOT NULL, + `create_name` varchar(50) default NULL COMMENT '鍒涘缓浜哄悕绉', + `create_by` varchar(50) default NULL COMMENT '鍒涘缓浜虹櫥褰曞悕绉', + `create_date` datetime default NULL COMMENT '鍒涘缓鏃ユ湡', + `update_name` varchar(50) default NULL COMMENT '鏇存柊浜哄悕绉', + `update_by` varchar(50) default NULL COMMENT '鏇存柊浜虹櫥褰曞悕绉', + `update_date` datetime default NULL COMMENT '鏇存柊鏃ユ湡', + `es_title` varchar(32) default NULL COMMENT '娑堟伅鏍囬', + `es_type` varchar(1) default NULL COMMENT '娑堟伅绫诲瀷', + `es_sender` varchar(50) default NULL COMMENT '鍙戦佷汉', + `es_receiver` varchar(50) default NULL COMMENT '鎺ユ敹浜', + `es_content` longtext COMMENT '鍐呭', + `es_sendtime` datetime default NULL COMMENT '鍙戦佹椂闂', + `remark` varchar(500) default NULL, + `es_status` varchar(1) default NULL COMMENT '鍙戦佺姸鎬', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_sms +-- ---------------------------- +INSERT INTO `t_s_sms` VALUES ('402880e74dc2f361014dc2f8411e0001', '绠$悊鍛', 'admin', '2015-06-05 17:05:59', null, null, null, '娑堟伅鎺ㄩ佹祴璇333', '2', null, '411944058@qq.com', '寮犱笁浣犲ソ锛屼綘鐨勮鍗4028d881436d514601436d521ae80165宸蹭粯娆!', '2015-06-05 17:06:01', '璁よ瘉澶辫触閿欒鐨勭敤鎴峰悕鎴栬呭瘑鐮', '3'); +INSERT INTO `t_s_sms` VALUES ('402880e74dc2f361014dc2f859a80002', '绠$悊鍛', 'admin', '2015-06-05 17:06:05', null, null, null, '娑堟伅鎺ㄩ佹祴璇333', '2', null, '411944058@qq.com', '寮犱笁浣犲ソ锛屼綘鐨勮鍗4028d881436d514601436d521ae80165宸蹭粯娆!', '2015-06-05 17:07:00', '璁よ瘉澶辫触閿欒鐨勭敤鎴峰悕鎴栬呭瘑鐮', '3'); +INSERT INTO `t_s_sms` VALUES ('8a81b9484c5fc1b6014c5fc3a04f0002', '绠$悊鍛', 'admin', '2015-03-28 17:43:18', '', '', null, '1', '1', '1', '1', '1', '2015-05-06 21:25:00', '', '3'); + +-- ---------------------------- +-- Table structure for `t_s_sms_sql` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_sms_sql`; +CREATE TABLE `t_s_sms_sql` ( + `id` varchar(36) NOT NULL COMMENT '涓婚敭', + `sql_name` varchar(32) default NULL COMMENT 'SQL鍚嶇О', + `sql_content` varchar(1000) default NULL COMMENT 'SQL鍐呭', + `create_date` datetime default NULL COMMENT '鍒涘缓鏃ユ湡', + `create_by` varchar(50) default NULL COMMENT '鍒涘缓浜虹櫥褰曞悕绉', + `create_name` varchar(50) default NULL COMMENT '鍒涘缓浜哄悕绉', + `update_date` datetime default NULL COMMENT '鏇存柊鏃ユ湡', + `update_by` varchar(50) default NULL COMMENT '鏇存柊浜虹櫥褰曞悕绉', + `update_name` varchar(50) default NULL COMMENT '鏇存柊浜哄悕绉', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_sms_sql +-- ---------------------------- +INSERT INTO `t_s_sms_sql` VALUES ('8a71b40e4a386269014a3865f9a90001', 'SQL-鏌ヨ鐢ㄦ埛濮撳悕', 'SELECT NAME as name,ID as order_code from t_s_student where id = :id', '2014-12-11 16:10:14', '4028d881436d514601436d5215ac0043', 'admin', '2014-12-14 20:51:27', '4028d881436d514601436d5215ac0043', 'admin'); + +-- ---------------------------- +-- Table structure for `t_s_sms_template` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_sms_template`; +CREATE TABLE `t_s_sms_template` ( + `id` varchar(36) NOT NULL COMMENT '涓婚敭', + `template_type` varchar(1) default NULL COMMENT '妯℃澘绫诲瀷', + `template_name` varchar(50) default NULL COMMENT '妯℃澘鍚嶇О', + `template_content` varchar(1000) default NULL COMMENT '妯℃澘鍐呭', + `create_date` datetime default NULL COMMENT '鍒涘缓鏃ユ湡', + `create_by` varchar(50) default NULL COMMENT '鍒涘缓浜虹櫥褰曞悕绉', + `create_name` varchar(50) default NULL COMMENT '鍒涘缓浜哄悕绉', + `update_date` datetime default NULL COMMENT '鏇存柊鏃ユ湡', + `update_by` varchar(50) default NULL COMMENT '鏇存柊浜虹櫥褰曞悕绉', + `update_name` varchar(50) default NULL COMMENT '鏇存柊浜哄悕绉', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_sms_template +-- ---------------------------- +INSERT INTO `t_s_sms_template` VALUES ('8a71b40e4a386269014a38701cff0005', '1', '鍏呭肩煭淇℃彁閱掓ā鏉', '${name}浣犲ソ锛屼綘鐨勮鍗${order_code}宸蹭粯娆!', '2014-12-11 16:21:19', '4028d881436d514601436d5215ac0043', 'admin', '2014-12-14 21:11:00', '4028d881436d514601436d5215ac0043', 'admin'); + +-- ---------------------------- +-- Table structure for `t_s_sms_template_sql` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_sms_template_sql`; +CREATE TABLE `t_s_sms_template_sql` ( + `id` varchar(36) NOT NULL COMMENT '涓婚敭', + `code` varchar(32) default NULL COMMENT '閰嶇疆CODE', + `name` varchar(32) default NULL COMMENT '閰嶇疆鍚嶇О', + `sql_id` varchar(32) default NULL COMMENT '涓氬姟SQLID', + `template_id` varchar(32) default NULL COMMENT '娑堟伅妯℃湰ID', + `create_date` datetime default NULL COMMENT '鍒涘缓鏃ユ湡', + `create_by` varchar(50) default NULL COMMENT '鍒涘缓浜虹櫥褰曞悕绉', + `create_name` varchar(50) default NULL COMMENT '鍒涘缓浜哄悕绉', + `update_date` datetime default NULL COMMENT '鏇存柊鏃ユ湡', + `update_by` varchar(50) default NULL COMMENT '鏇存柊浜虹櫥褰曞悕绉', + `update_name` varchar(50) default NULL COMMENT '鏇存柊浜哄悕绉', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_sms_template_sql +-- ---------------------------- +INSERT INTO `t_s_sms_template_sql` VALUES ('8a71b40e4a386269014a3871f5ee0008', 'CZTX', '鍏呭兼彁閱掗厤缃', '8a71b40e4a386269014a3865f9a90001', '8a71b40e4a386269014a38701cff0005', '2014-12-11 16:23:20', '4028d881436d514601436d5215ac0043', 'admin', null, '', ''); + +-- ---------------------------- +-- Table structure for `t_s_student` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_student`; +CREATE TABLE `t_s_student` ( + `ID` varchar(32) NOT NULL, + `classname` varchar(255) default NULL, + `name` varchar(255) default NULL, + `sex` varchar(255) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_student +-- ---------------------------- +INSERT INTO `t_s_student` VALUES ('4028d881436d514601436d521ae80165', '1鐝', '寮犱笁', 'f'); + +-- ---------------------------- +-- Table structure for `t_s_territory` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_territory`; +CREATE TABLE `t_s_territory` ( + `ID` varchar(32) NOT NULL, + `territorycode` varchar(10) NOT NULL, + `territorylevel` smallint(6) NOT NULL, + `territoryname` varchar(50) NOT NULL, + `territory_pinyin` varchar(40) default NULL, + `territorysort` varchar(3) NOT NULL, + `x_wgs84` double NOT NULL, + `y_wgs84` double NOT NULL, + `territoryparentid` varchar(32) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_territory +-- ---------------------------- +INSERT INTO `t_s_territory` VALUES ('1', '100', '1', '鍏ㄥ浗', 'qg', '0', '106.258754', '38.471318', '0'); +INSERT INTO `t_s_territory` VALUES ('10', '00000016', '2', '娌冲崡鐪', 'HNS', '0', '113.687228', '34.76819', '1'); +INSERT INTO `t_s_territory` VALUES ('100', '371300', '3', '涓存矀甯', 'LYS', '0', '118.356448', '35.104672', '18'); +INSERT INTO `t_s_territory` VALUES ('1000', '370903', '4', '宀卞渤鍖', 'DYQ', '0', '117.041582', '36.18799', '96'); +INSERT INTO `t_s_territory` VALUES ('1001', '370921', '4', '瀹侀槼鍘', 'NYX', '0', '116.805797', '35.758787', '96'); +INSERT INTO `t_s_territory` VALUES ('1002', '370923', '4', '涓滃钩鍘', 'DPX', '0', '116.470304', '35.937102', '96'); +INSERT INTO `t_s_territory` VALUES ('1003', '370982', '4', '鏂版嘲甯', 'XTS', '0', '117.767953', '35.909032', '96'); +INSERT INTO `t_s_territory` VALUES ('1004', '370983', '4', '鑲ュ煄甯', 'FCS', '0', '116.768358', '36.182571', '96'); +INSERT INTO `t_s_territory` VALUES ('1005', '371002', '4', '鐜繝鍖', 'HCQ', '0', '122.123444', '37.501991', '97'); +INSERT INTO `t_s_territory` VALUES ('1006', '371081', '4', '鏂囩櫥甯', 'WDS', '0', '122.058128', '37.1939129', '97'); +INSERT INTO `t_s_territory` VALUES ('1007', '371082', '4', '鑽f垚甯', 'RCS', '0', '122.486676', '37.165249', '97'); +INSERT INTO `t_s_territory` VALUES ('1008', '371083', '4', '涔冲北甯', 'RSS', '0', '121.539764', '36.919816', '97'); +INSERT INTO `t_s_territory` VALUES ('1009', '371102', '4', '涓滄腐鍖', 'DGQ', '0', '119.462228', '35.425475', '98'); +INSERT INTO `t_s_territory` VALUES ('101', '371400', '3', '寰峰窞甯', 'DZS', '0', '116.357465', '37.434093', '18'); +INSERT INTO `t_s_territory` VALUES ('1010', '371103', '4', '宀氬北鍖', 'LSQ', '0', '119.318813', '35.121816', '98'); +INSERT INTO `t_s_territory` VALUES ('1011', '371121', '4', '浜旇幉鍘', 'WLX', '0', '119.208744', '35.750095', '98'); +INSERT INTO `t_s_territory` VALUES ('1012', '371122', '4', '鑾掑幙', 'JX', '0', '118.837131', '35.579868', '98'); +INSERT INTO `t_s_territory` VALUES ('1013', '371202', '4', '鑾卞煄鍖', 'LCQ', '0', '117.659864', '36.203208', '99'); +INSERT INTO `t_s_territory` VALUES ('1014', '371203', '4', '閽㈠煄鍖', 'GCQ', '0', '117.811355', '36.058572', '99'); +INSERT INTO `t_s_territory` VALUES ('1015', '371302', '4', '鍏板北鍖', 'LSQ', '0', '118.347707', '35.051729', '100'); +INSERT INTO `t_s_territory` VALUES ('1016', '371311', '4', '缃楀簞鍖', 'LZQ', '0', '118.284786', '34.996741', '100'); +INSERT INTO `t_s_territory` VALUES ('1017', '371312', '4', '娌充笢鍖', 'HDQ', '0', '118.402893', '35.089917', '100'); +INSERT INTO `t_s_territory` VALUES ('1018', '371321', '4', '娌傚崡鍘', 'YNX', '0', '118.465213', '35.549976', '100'); +INSERT INTO `t_s_territory` VALUES ('1019', '371322', '4', '閮煄鍘', 'TCX', '0', '118.367263', '34.613557', '100'); +INSERT INTO `t_s_territory` VALUES ('102', '371500', '3', '鑱婂煄甯', 'LCS', '0', '115.985371', '36.4567039', '18'); +INSERT INTO `t_s_territory` VALUES ('1020', '371323', '4', '娌傛按鍘', 'YSX', '0', '118.627918', '35.79045', '100'); +INSERT INTO `t_s_territory` VALUES ('1021', '371324', '4', '鑻嶅北鍘', 'CSX', '0', '118.07065', '34.857149', '100'); +INSERT INTO `t_s_territory` VALUES ('1022', '371325', '4', '璐瑰幙', 'FX', '0', '117.977868', '35.26634', '100'); +INSERT INTO `t_s_territory` VALUES ('1023', '371326', '4', '骞抽倯鍘', 'PYX', '0', '117.640352', '35.5059429', '100'); +INSERT INTO `t_s_territory` VALUES ('1024', '371327', '4', '鑾掑崡鍘', 'JNX', '0', '118.835163', '35.174846', '100'); +INSERT INTO `t_s_territory` VALUES ('1025', '371328', '4', '钂欓槾鍘', 'MYX', '0', '117.945085', '35.710032', '100'); +INSERT INTO `t_s_territory` VALUES ('1026', '371329', '4', '涓存箔鍘', 'LSX', '0', '118.650782', '34.919852', '100'); +INSERT INTO `t_s_territory` VALUES ('1027', '371402', '4', '寰峰煄鍖', 'DCQ', '0', '116.299434', '37.451272', '101'); +INSERT INTO `t_s_territory` VALUES ('1028', '371421', '4', '闄靛幙', 'LX', '0', '116.576176', '37.33579', '101'); +INSERT INTO `t_s_territory` VALUES ('1029', '371422', '4', '瀹佹触鍘', 'NJX', '0', '116.800324', '37.652329', '101'); +INSERT INTO `t_s_territory` VALUES ('103', '371600', '3', '婊ㄥ窞甯', 'BZS', '0', '117.970703', '37.38199', '18'); +INSERT INTO `t_s_territory` VALUES ('1030', '371423', '4', '搴嗕簯鍘', 'QYX', '0', '117.385123', '37.77539', '101'); +INSERT INTO `t_s_territory` VALUES ('1031', '371424', '4', '涓撮倯鍘', 'LYX', '0', '116.86665', '37.189864', '101'); +INSERT INTO `t_s_territory` VALUES ('1032', '371425', '4', '榻愭渤鍘', 'QHX', '0', '116.758917', '36.795011', '101'); +INSERT INTO `t_s_territory` VALUES ('1033', '371426', '4', '骞冲師鍘', 'PYX', '0', '116.434187', '37.165419', '101'); +INSERT INTO `t_s_territory` VALUES ('1034', '371427', '4', '澶忔触鍘', 'XJX', '0', '116.001726', '36.948371', '101'); +INSERT INTO `t_s_territory` VALUES ('1035', '371428', '4', '姝﹀煄鍘', 'WCX', '0', '116.069302', '37.213311', '101'); +INSERT INTO `t_s_territory` VALUES ('1036', '371481', '4', '涔愰櫟甯', 'LLS', '0', '117.231935', '37.729907', '101'); +INSERT INTO `t_s_territory` VALUES ('1037', '371482', '4', '绂瑰煄甯', 'YCS', '0', '116.638387', '36.934259', '101'); +INSERT INTO `t_s_territory` VALUES ('1038', '371502', '4', '涓滄槍搴滃尯', 'DCFQ', '0', '115.988484', '36.434697', '102'); +INSERT INTO `t_s_territory` VALUES ('1039', '371521', '4', '闃宠胺鍘', 'YGX', '0', '115.79182', '36.114392', '102'); +INSERT INTO `t_s_territory` VALUES ('104', '371700', '3', '鑿忔辰甯', 'HZS', '0', '115.480656', '35.23375', '18'); +INSERT INTO `t_s_territory` VALUES ('1040', '371522', '4', '鑾樺幙', 'SX', '0', '115.671191', '36.233599', '102'); +INSERT INTO `t_s_territory` VALUES ('1041', '371523', '4', '鑼屽钩鍘', 'CPX', '0', '116.255282', '36.5807639', '102'); +INSERT INTO `t_s_territory` VALUES ('1042', '371524', '4', '涓滈樋鍘', 'DAX', '0', '116.24758', '36.334917', '102'); +INSERT INTO `t_s_territory` VALUES ('1043', '371525', '4', '鍐犲幙', 'GX', '0', '115.44274', '36.484009', '102'); +INSERT INTO `t_s_territory` VALUES ('1044', '371526', '4', '楂樺攼鍘', 'GTX', '0', '116.231478', '36.866062', '102'); +INSERT INTO `t_s_territory` VALUES ('1045', '371581', '4', '涓存竻甯', 'LQS', '0', '115.704881', '36.838277', '102'); +INSERT INTO `t_s_territory` VALUES ('1046', '371602', '4', '婊ㄥ煄鍖', 'BCQ', '0', '118.019146', '37.43206', '103'); +INSERT INTO `t_s_territory` VALUES ('1047', '371621', '4', '鎯犳皯鍘', 'HMX', '0', '117.510451', '37.489769', '103'); +INSERT INTO `t_s_territory` VALUES ('1048', '371622', '4', '闃充俊鍘', 'YXX', '0', '117.578262', '37.641106', '103'); +INSERT INTO `t_s_territory` VALUES ('1049', '371623', '4', '鏃犳#鍘', 'WDX', '0', '117.625696', '37.770261', '103'); +INSERT INTO `t_s_territory` VALUES ('1050', '371624', '4', '娌惧寲鍘', 'ZHX', '0', '118.132199', '37.698281', '103'); +INSERT INTO `t_s_territory` VALUES ('1051', '371625', '4', '鍗氬叴鍘', 'BXX', '0', '118.131815', '37.150226', '103'); +INSERT INTO `t_s_territory` VALUES ('1052', '371626', '4', '閭瑰钩鍘', 'ZPX', '0', '117.743109', '36.862989', '103'); +INSERT INTO `t_s_territory` VALUES ('1053', '371702', '4', '鐗′腹鍖', 'MDQ', '0', '115.417827', '35.252512', '104'); +INSERT INTO `t_s_territory` VALUES ('1054', '371721', '4', '鏇瑰幙', 'CX', '0', '115.542328', '34.825508', '104'); +INSERT INTO `t_s_territory` VALUES ('1055', '371722', '4', '鍗曞幙', 'DX', '0', '116.107428', '34.778808', '104'); +INSERT INTO `t_s_territory` VALUES ('1056', '371723', '4', '鎴愭鍘', 'CWX', '0', '115.889765', '34.952459', '104'); +INSERT INTO `t_s_territory` VALUES ('1057', '371724', '4', '宸ㄩ噹鍘', 'JYX', '0', '116.094674', '35.396261', '104'); +INSERT INTO `t_s_territory` VALUES ('1058', '371725', '4', '閮撳煄鍘', 'YCX', '0', '115.943613', '35.599758', '104'); +INSERT INTO `t_s_territory` VALUES ('1059', '371726', '4', '閯勫煄鍘', 'JCX', '0', '115.510193', '35.563408', '104'); +INSERT INTO `t_s_territory` VALUES ('1060', '371727', '4', '瀹氶櫠鍘', 'DTX', '0', '115.573094', '35.071', '104'); +INSERT INTO `t_s_territory` VALUES ('1061', '371728', '4', '涓滄槑鍘', 'DMX', '0', '115.089905', '35.289368', '104'); +INSERT INTO `t_s_territory` VALUES ('11', '00000008', '2', '榛戦緳姹熺渷', 'HLJS', '0', '126.662507', '45.7421699', '1'); +INSERT INTO `t_s_territory` VALUES ('12', '20000000', '2', '涓婃捣甯', 'SHS', '0', '121.473704', '31.230393', '1'); +INSERT INTO `t_s_territory` VALUES ('13', '00000010', '2', '姹熻嫃鐪', 'JSS', '0', '118.763232', '32.061707', '1'); +INSERT INTO `t_s_territory` VALUES ('14', '00000011', '2', '娴欐睙鐪', 'ZJS', '0', '120.153676', '30.26586', '1'); +INSERT INTO `t_s_territory` VALUES ('15', '00000012', '2', '瀹夊窘鐪', 'AHS', '0', '117.284923', '31.861184', '1'); +INSERT INTO `t_s_territory` VALUES ('16', '00000013', '2', '绂忓缓鐪', 'FJS', '0', '119.296506', '26.099933', '1'); +INSERT INTO `t_s_territory` VALUES ('17', '00000014', '2', '姹熻タ鐪', 'JXS', '0', '115.909175', '28.674424', '1'); +INSERT INTO `t_s_territory` VALUES ('1739', '360102', '4', '涓滄箹鍖', 'DHQ', '0', '115.89901', '28.6849159', '184'); +INSERT INTO `t_s_territory` VALUES ('1740', '360103', '4', '瑗挎箹鍖', 'XHQ', '0', '115.877287', '28.656887', '184'); +INSERT INTO `t_s_territory` VALUES ('1741', '360104', '4', '闈掍簯璋卞尯', 'QYPQ', '0', '115.925749', '28.621169', '184'); +INSERT INTO `t_s_territory` VALUES ('1742', '360105', '4', '婀鹃噷鍖', 'WLQ', '0', '115.730994', '28.714869', '184'); +INSERT INTO `t_s_territory` VALUES ('1743', '360111', '4', '闈掑北婀栧尯', 'QSHQ', '0', '115.962144', '28.682985', '184'); +INSERT INTO `t_s_territory` VALUES ('1744', '360121', '4', '鍗楁槍鍘', 'NCX', '0', '115.944162', '28.545459', '184'); +INSERT INTO `t_s_territory` VALUES ('1745', '360122', '4', '鏂板缓鍘', 'XJX', '0', '115.815233', '28.692437', '184'); +INSERT INTO `t_s_territory` VALUES ('1746', '360123', '4', '瀹変箟鍘', 'AYX', '0', '115.549199', '28.844429', '184'); +INSERT INTO `t_s_territory` VALUES ('1747', '360124', '4', '杩涜搐鍘', 'JXX', '0', '116.240924', '28.376918', '184'); +INSERT INTO `t_s_territory` VALUES ('1748', '360202', '4', '鏄屾睙鍖', 'CJQ', '0', '117.183688', '29.27342', '185'); +INSERT INTO `t_s_territory` VALUES ('1749', '360203', '4', '鐝犲北鍖', 'ZSQ', '0', '117.202336', '29.301272', '185'); +INSERT INTO `t_s_territory` VALUES ('1750', '360222', '4', '娴鍘', 'FLX', '0', '117.215061', '29.351739', '185'); +INSERT INTO `t_s_territory` VALUES ('1751', '360281', '4', '涔愬钩甯', 'LPS', '0', '117.129169', '28.961902', '185'); +INSERT INTO `t_s_territory` VALUES ('1752', '360302', '4', '瀹夋簮鍖', 'AYQ', '0', '113.87073', '27.615202', '186'); +INSERT INTO `t_s_territory` VALUES ('1753', '360313', '4', '婀樹笢鍖', 'XDQ', '0', '113.733059', '27.640075', '186'); +INSERT INTO `t_s_territory` VALUES ('1754', '360321', '4', '鑾茶姳鍘', 'LHX', '0', '113.961465', '27.127669', '186'); +INSERT INTO `t_s_territory` VALUES ('1755', '360322', '4', '涓婃牀鍘', 'SLX', '0', '113.795219', '27.880567', '186'); +INSERT INTO `t_s_territory` VALUES ('1756', '360323', '4', '鑺︽邯鍘', 'LXX', '0', '114.029595', '27.631145', '186'); +INSERT INTO `t_s_territory` VALUES ('1757', '360402', '4', '搴愬北鍖', 'LSQ', '0', '115.989212', '29.671775', '187'); +INSERT INTO `t_s_territory` VALUES ('1758', '360403', '4', '娴旈槼鍖', 'XYQ', '0', '115.990399', '29.72746', '187'); +INSERT INTO `t_s_territory` VALUES ('1759', '360421', '4', '涔濇睙鍘', 'JJX', '0', '115.911314', '29.608456', '187'); +INSERT INTO `t_s_territory` VALUES ('1760', '360423', '4', '姝﹀畞鍘', 'WNX', '0', '115.100579', '29.256323', '187'); +INSERT INTO `t_s_territory` VALUES ('1761', '360424', '4', '淇按鍘', 'XSX', '0', '114.547356', '29.025707', '187'); +INSERT INTO `t_s_territory` VALUES ('1762', '360425', '4', '姘镐慨鍘', 'YXX', '0', '115.809111', '29.021824', '187'); +INSERT INTO `t_s_territory` VALUES ('1763', '360426', '4', '寰峰畨鍘', 'DAX', '0', '115.756883', '29.314348', '187'); +INSERT INTO `t_s_territory` VALUES ('1764', '360427', '4', '鏄熷瓙鍘', 'XZX', '0', '116.044893', '29.448037', '187'); +INSERT INTO `t_s_territory` VALUES ('1765', '360428', '4', '閮芥槍鍘', 'DCX', '0', '116.204099', '29.273194', '187'); +INSERT INTO `t_s_territory` VALUES ('1766', '360429', '4', '婀栧彛鍘', 'HKX', '0', '116.220266', '29.73944', '187'); +INSERT INTO `t_s_territory` VALUES ('1767', '360430', '4', '褰辰鍘', 'PZX', '0', '116.549359', '29.896061', '187'); +INSERT INTO `t_s_territory` VALUES ('1768', '360481', '4', '鐟炴槍甯', 'RCS', '0', '115.681504', '29.673795', '187'); +INSERT INTO `t_s_territory` VALUES ('1769', '360499', '4', '鍏遍潚鍩', 'GQC', '0', '115.774', '29.2417', '187'); +INSERT INTO `t_s_territory` VALUES ('1770', '360502', '4', '娓濇按鍖', 'YSQ', '0', '114.944574', '27.80038', '188'); +INSERT INTO `t_s_territory` VALUES ('1771', '360521', '4', '鍒嗗疁鍘', 'FYX', '0', '114.692039', '27.814628', '188'); +INSERT INTO `t_s_territory` VALUES ('1772', '360602', '4', '鏈堟箹鍖', 'YHQ', '0', '117.036676', '28.238797', '189'); +INSERT INTO `t_s_territory` VALUES ('1773', '360622', '4', '浣欐睙鍘', 'YJX', '0', '116.818871', '28.204174', '189'); +INSERT INTO `t_s_territory` VALUES ('1774', '360681', '4', '璐垫邯甯', 'GXS', '0', '117.245497', '28.292519', '189'); +INSERT INTO `t_s_territory` VALUES ('1775', '360702', '4', '绔犺础鍖', 'ZGQ', '0', '114.941826', '25.862827', '190'); +INSERT INTO `t_s_territory` VALUES ('1776', '360721', '4', '璧e幙', 'GX', '0', '115.011561', '25.860691', '190'); +INSERT INTO `t_s_territory` VALUES ('1777', '360722', '4', '淇′赴鍘', 'XFX', '0', '114.922963', '25.386278', '190'); +INSERT INTO `t_s_territory` VALUES ('1778', '360723', '4', '澶т綑鍘', 'DYX', '0', '114.362094', '25.401283', '190'); +INSERT INTO `t_s_territory` VALUES ('1779', '360724', '4', '涓婄姽鍘', 'SYX', '0', '114.551371', '25.784978', '190'); +INSERT INTO `t_s_territory` VALUES ('1780', '360725', '4', '宕囦箟鍘', 'CYX', '0', '114.308273', '25.681879', '190'); +INSERT INTO `t_s_territory` VALUES ('1781', '360726', '4', '瀹夎繙鍘', 'AYX', '0', '115.393922', '25.136925', '190'); +INSERT INTO `t_s_territory` VALUES ('1782', '360727', '4', '榫欏崡鍘', 'LNX', '0', '114.789811', '24.911107', '190'); +INSERT INTO `t_s_territory` VALUES ('1783', '360728', '4', '瀹氬崡鍘', 'DNX', '0', '115.027845', '24.78441', '190'); +INSERT INTO `t_s_territory` VALUES ('1784', '360729', '4', '鍏ㄥ崡鍘', 'QNX', '0', '114.530125', '24.742401', '190'); +INSERT INTO `t_s_territory` VALUES ('1785', '360730', '4', '瀹侀兘鍘', 'NDX', '0', '116.009472', '26.470116', '190'); +INSERT INTO `t_s_territory` VALUES ('1786', '360731', '4', '浜庨兘鍘', 'YDX', '0', '115.41551', '25.952066', '190'); +INSERT INTO `t_s_territory` VALUES ('1787', '360732', '4', '鍏村浗鍘', 'XGX', '0', '115.36319', '26.337937', '190'); +INSERT INTO `t_s_territory` VALUES ('1788', '360733', '4', '浼氭槍鍘', 'HCX', '0', '115.786057', '25.600272', '190'); +INSERT INTO `t_s_territory` VALUES ('1789', '360734', '4', '瀵讳箤鍘', 'YWX', '0', '115.646525', '24.963322', '190'); +INSERT INTO `t_s_territory` VALUES ('1790', '360735', '4', '鐭冲煄鍘', 'SCX', '0', '116.354201', '26.32686', '190'); +INSERT INTO `t_s_territory` VALUES ('1791', '360781', '4', '鐟為噾甯', 'RJS', '0', '116.02713', '25.885561', '190'); +INSERT INTO `t_s_territory` VALUES ('1792', '360782', '4', '鍗楀悍甯', 'NKS', '0', '114.765238', '25.661356', '190'); +INSERT INTO `t_s_territory` VALUES ('1793', '360802', '4', '鍚夊窞鍖', 'JZQ', '0', '114.994307', '27.129975', '191'); +INSERT INTO `t_s_territory` VALUES ('1794', '360803', '4', '闈掑師鍖', 'QYQ', '0', '115.01424', '27.081719', '191'); +INSERT INTO `t_s_territory` VALUES ('1795', '360821', '4', '鍚夊畨鍘', 'JAX', '0', '114.907659', '27.040142', '191'); +INSERT INTO `t_s_territory` VALUES ('1796', '360822', '4', '鍚夋按鍘', 'JSX', '0', '115.135507', '27.229632', '191'); +INSERT INTO `t_s_territory` VALUES ('1797', '360823', '4', '宄℃睙鍘', 'XJX', '0', '115.316566', '27.582901', '191'); +INSERT INTO `t_s_territory` VALUES ('1798', '360824', '4', '鏂板共鍘', 'XGX', '0', '115.393043', '27.740809', '191'); +INSERT INTO `t_s_territory` VALUES ('1799', '360825', '4', '姘镐赴鍘', 'YFX', '0', '115.441477', '27.317869', '191'); +INSERT INTO `t_s_territory` VALUES ('18', '00000015', '2', '灞变笢鐪', 'SDS', '0', '117.020411', '36.668627', '1'); +INSERT INTO `t_s_territory` VALUES ('1800', '360826', '4', '娉板拰鍘', 'THX', '0', '114.908861', '26.790231', '191'); +INSERT INTO `t_s_territory` VALUES ('1801', '360827', '4', '閬傚窛鍘', 'SCX', '0', '114.52098', '26.311894', '191'); +INSERT INTO `t_s_territory` VALUES ('1802', '360828', '4', '涓囧畨鍘', 'WAX', '0', '114.786256', '26.458257', '191'); +INSERT INTO `t_s_territory` VALUES ('1803', '360829', '4', '瀹夌鍘', 'AFX', '0', '114.619893', '27.392874', '191'); +INSERT INTO `t_s_territory` VALUES ('1804', '360830', '4', '姘告柊鍘', 'YXX', '0', '114.242675', '26.945233', '191'); +INSERT INTO `t_s_territory` VALUES ('1805', '360881', '4', '浜曞唸灞卞競', 'JGSS', '0', '114.289182', '26.748186', '191'); +INSERT INTO `t_s_territory` VALUES ('1806', '360902', '4', '琚佸窞鍖', 'YZQ', '0', '114.424657', '27.798846', '192'); +INSERT INTO `t_s_territory` VALUES ('1807', '360921', '4', '濂夋柊鍘', 'FXX', '0', '115.384904', '28.700806', '192'); +INSERT INTO `t_s_territory` VALUES ('1808', '360922', '4', '涓囪浇鍘', 'WZX', '0', '114.447551', '28.10455', '192'); +INSERT INTO `t_s_territory` VALUES ('1809', '360923', '4', '涓婇珮鍘', 'SGX', '0', '114.924494', '28.232827', '192'); +INSERT INTO `t_s_territory` VALUES ('1810', '360924', '4', '瀹滀赴鍘', 'YFX', '0', '114.803542', '28.393613', '192'); +INSERT INTO `t_s_territory` VALUES ('1811', '360925', '4', '闈栧畨鍘', 'JAX', '0', '115.362629', '28.861475', '192'); +INSERT INTO `t_s_territory` VALUES ('1812', '360926', '4', '閾滈紦鍘', 'TGX', '0', '114.37098', '28.520747', '192'); +INSERT INTO `t_s_territory` VALUES ('1813', '360981', '4', '涓板煄甯', 'FCS', '0', '115.771195', '28.159325', '192'); +INSERT INTO `t_s_territory` VALUES ('1814', '360982', '4', '妯熸爲甯', 'ZSS', '0', '115.546063', '28.055796', '192'); +INSERT INTO `t_s_territory` VALUES ('1815', '360983', '4', '楂樺畨甯', 'GAS', '0', '115.375618', '28.417261', '192'); +INSERT INTO `t_s_territory` VALUES ('1816', '361002', '4', '涓村窛鍖', 'LCQ', '0', '116.31136', '27.934529', '193'); +INSERT INTO `t_s_territory` VALUES ('1817', '361021', '4', '鍗楀煄鍘', 'NCX', '0', '116.644658', '27.552748', '193'); +INSERT INTO `t_s_territory` VALUES ('1818', '361022', '4', '榛庡窛鍘', 'LCX', '0', '116.907508', '27.282382', '193'); +INSERT INTO `t_s_territory` VALUES ('1819', '361023', '4', '鍗椾赴鍘', 'NFX', '0', '116.525725', '27.218445', '193'); +INSERT INTO `t_s_territory` VALUES ('1820', '361024', '4', '宕囦粊鍘', 'CRX', '0', '116.061164', '27.764681', '193'); +INSERT INTO `t_s_territory` VALUES ('1821', '361025', '4', '涔愬畨鍘', 'LAX', '0', '115.837895', '27.420441', '193'); +INSERT INTO `t_s_territory` VALUES ('1822', '361026', '4', '瀹滈粍鍘', 'YHX', '0', '116.222128', '27.546146', '193'); +INSERT INTO `t_s_territory` VALUES ('1823', '361027', '4', '閲戞邯鍘', 'JXX', '0', '116.775435', '27.908337', '193'); +INSERT INTO `t_s_territory` VALUES ('1824', '361028', '4', '璧勬邯鍘', 'ZXX', '0', '117.060264', '27.706102', '193'); +INSERT INTO `t_s_territory` VALUES ('1825', '361029', '4', '涓滀埂鍘', 'DXX', '0', '116.590465', '28.236118', '193'); +INSERT INTO `t_s_territory` VALUES ('1826', '361030', '4', '骞挎槍鍘', 'GCX', '0', '116.325757', '26.837267', '193'); +INSERT INTO `t_s_territory` VALUES ('1827', '361102', '4', '淇″窞鍖', 'XZQ', '0', '117.966823', '28.43121', '194'); +INSERT INTO `t_s_territory` VALUES ('1828', '361121', '4', '涓婇ザ鍘', 'SRX', '0', '117.90785', '28.448983', '194'); +INSERT INTO `t_s_territory` VALUES ('1829', '361122', '4', '骞夸赴鍘', 'GFX', '0', '118.19124', '28.436286', '194'); +INSERT INTO `t_s_territory` VALUES ('1830', '361123', '4', '鐜夊北鍘', 'YSX', '0', '118.245124', '28.682055', '194'); +INSERT INTO `t_s_territory` VALUES ('1831', '361124', '4', '閾呭北鍘', 'QSX', '0', '117.709451', '28.315217', '194'); +INSERT INTO `t_s_territory` VALUES ('1832', '361125', '4', '妯嘲鍘', 'HFX', '0', '117.596452', '28.407118', '194'); +INSERT INTO `t_s_territory` VALUES ('1833', '361126', '4', '寮嬮槼鍘', 'YYX', '0', '117.449588', '28.378044', '194'); +INSERT INTO `t_s_territory` VALUES ('1834', '361127', '4', '浣欏共鍘', 'YGX', '0', '116.695647', '28.702302', '194'); +INSERT INTO `t_s_territory` VALUES ('1835', '361128', '4', '閯遍槼鍘', 'PYX', '0', '116.699746', '29.011699', '194'); +INSERT INTO `t_s_territory` VALUES ('1836', '361129', '4', '涓囧勾鍘', 'WNX', '0', '117.058445', '28.694582', '194'); +INSERT INTO `t_s_territory` VALUES ('1837', '361130', '4', '濠烘簮鍘', 'WYX', '0', '117.861911', '29.2480249', '194'); +INSERT INTO `t_s_territory` VALUES ('1838', '361181', '4', '寰峰叴甯', 'DXS', '0', '117.578713', '28.946464', '194'); +INSERT INTO `t_s_territory` VALUES ('1839', '370102', '4', '鍘嗕笅鍖', 'LXQ', '0', '117.07653', '36.666344', '195'); +INSERT INTO `t_s_territory` VALUES ('184', '360100', '3', '鍗楁槍甯', 'NCS', '0', '115.858089', '28.68316', '17'); +INSERT INTO `t_s_territory` VALUES ('1840', '370103', '4', '甯備腑鍖', 'SZQ', '0', '116.997475', '36.6511749', '195'); +INSERT INTO `t_s_territory` VALUES ('1841', '370104', '4', '妲愯崼鍖', 'HYQ', '0', '116.90113', '36.651301', '195'); +INSERT INTO `t_s_territory` VALUES ('1842', '370105', '4', '澶╂ˉ鍖', 'TQQ', '0', '116.987492', '36.678016', '195'); +INSERT INTO `t_s_territory` VALUES ('1843', '370112', '4', '鍘嗗煄鍖', 'LCQ', '0', '117.065222', '36.680171', '195'); +INSERT INTO `t_s_territory` VALUES ('185', '360200', '3', '鏅痉闀囧競', 'JDZS', '0', '117.17842', '29.268836', '17'); +INSERT INTO `t_s_territory` VALUES ('186', '360300', '3', '钀嶄埂甯', 'PXS', '0', '113.854676', '27.622865', '17'); +INSERT INTO `t_s_territory` VALUES ('187', '360400', '3', '涔濇睙甯', 'JJS', '0', '116.001951', '29.705103', '17'); +INSERT INTO `t_s_territory` VALUES ('188', '360500', '3', '鏂颁綑甯', 'XYS', '0', '114.91741', '27.817819', '17'); +INSERT INTO `t_s_territory` VALUES ('189', '360600', '3', '楣版江甯', 'YTS', '0', '117.069202', '28.260189', '17'); +INSERT INTO `t_s_territory` VALUES ('19', '00000017', '2', '婀栧寳鐪', 'HBS', '0', '114.341921', '30.545861', '1'); +INSERT INTO `t_s_territory` VALUES ('190', '360700', '3', '璧e窞甯', 'GZS', '0', '114.935025', '25.831925', '17'); +INSERT INTO `t_s_territory` VALUES ('191', '360800', '3', '鍚夊畨甯', 'JAS', '0', '114.992912', '27.113039', '17'); +INSERT INTO `t_s_territory` VALUES ('192', '360900', '3', '瀹滄槬甯', 'YCS', '0', '114.416778', '27.815619', '17'); +INSERT INTO `t_s_territory` VALUES ('193', '361000', '3', '鎶氬窞甯', 'FZS', '0', '116.358176', '27.9492', '17'); +INSERT INTO `t_s_territory` VALUES ('194', '361100', '3', '涓婇ザ甯', 'SRS', '0', '117.943433', '28.454863', '17'); +INSERT INTO `t_s_territory` VALUES ('195', '370100', '3', '娴庡崡甯', 'JNS', '0', '116.994917', '36.665282', '18'); +INSERT INTO `t_s_territory` VALUES ('20', '00000018', '2', '婀栧崡鐪', 'HNS', '0', '112.98381', '28.112444', '1'); +INSERT INTO `t_s_territory` VALUES ('21', '40000000', '2', '閲嶅簡甯', 'ZQS', '0', '106.551557', '29.56301', '1'); +INSERT INTO `t_s_territory` VALUES ('22', '00000022', '2', '鍥涘窛鐪', 'SCS', '0', '104.075931', '30.651652', '1'); +INSERT INTO `t_s_territory` VALUES ('23', '00000019', '2', '骞夸笢鐪', 'GDS', '0', '113.266531', '23.132191', '1'); +INSERT INTO `t_s_territory` VALUES ('24', '00000020', '2', '骞胯タ澹棌鑷不鍖', 'GXZZZZQ', '0', '108.327546', '22.815478', '1'); +INSERT INTO `t_s_territory` VALUES ('25', '00000021', '2', '娴峰崡鐪', 'HNS', '0', '110.349229', '20.017378', '1'); +INSERT INTO `t_s_territory` VALUES ('26', '810000', '2', '棣欐腐鐗瑰埆琛屾斂鍖', 'XGTBXZQ', '0', '114.109497', '22.396428', '1'); +INSERT INTO `t_s_territory` VALUES ('27', '820000', '2', '婢抽棬鐗瑰埆琛屾斂鍖', 'AMTBXZQ', '0', '113.543873', '22.198745', '1'); +INSERT INTO `t_s_territory` VALUES ('28', '00000023', '2', '璐靛窞鐪', 'GZS', '0', '106.707116', '26.598026', '1'); +INSERT INTO `t_s_territory` VALUES ('29', '00000024', '2', '浜戝崡鐪', 'YNS', '0', '102.709812', '25.045359', '1'); +INSERT INTO `t_s_territory` VALUES ('3', '00000006', '2', '杈藉畞鐪', 'LNS', '0', '123.42944', '41.835441', '1'); +INSERT INTO `t_s_territory` VALUES ('30', '00000025', '2', '瑗胯棌鑷不鍖', 'XCZZQ', '0', '91.1170059', '29.647951', '1'); +INSERT INTO `t_s_territory` VALUES ('31', '00000026', '2', '闄曡タ鐪', 'SXS', '0', '108.954239', '34.265472', '1'); +INSERT INTO `t_s_territory` VALUES ('32', '00000027', '2', '鐢樿們鐪', 'GSS', '0', '103.826308', '36.059421', '1'); +INSERT INTO `t_s_territory` VALUES ('33', '00000028', '2', '闈掓捣鐪', 'QHS', '0', '101.780199', '36.620901', '1'); +INSERT INTO `t_s_territory` VALUES ('34', '00000029', '2', '瀹佸鍥炴棌鑷不鍖', 'NXHZZZQ', '0', '106.258754', '38.471318', '1'); +INSERT INTO `t_s_territory` VALUES ('35', '00000030', '2', '鏂扮枂缁村惥灏旇嚜娌诲尯', 'XJWWEZZQ', '0', '87.6278119', '43.793028', '1'); +INSERT INTO `t_s_territory` VALUES ('4', '00000007', '2', '鍚夋灄鐪', 'JLS', '0', '125.326065', '43.896082', '1'); +INSERT INTO `t_s_territory` VALUES ('5', '10000000', '2', '鍖椾含甯', 'BJS', '0', '116.407413', '39.904214', '1'); +INSERT INTO `t_s_territory` VALUES ('6', '30000000', '2', '澶╂触甯', 'TJS', '0', '117.200983', '39.084158', '1'); +INSERT INTO `t_s_territory` VALUES ('7', '00000003', '2', '娌冲寳鐪', 'HBS', '0', '114.468665', '38.037057', '1'); +INSERT INTO `t_s_territory` VALUES ('8', '00000004', '2', '灞辫タ鐪', 'SXS', '0', '112.562569', '37.873376', '1'); +INSERT INTO `t_s_territory` VALUES ('89', '370200', '3', '闈掑矝甯', 'QDS', '0', '120.382504', '36.06722', '18'); +INSERT INTO `t_s_territory` VALUES ('9', '00000005', '2', '鍐呰挋鍙よ嚜娌诲尯', 'NMGZZQ', '0', '111.765618', '40.817498', '1'); +INSERT INTO `t_s_territory` VALUES ('90', '370300', '3', '娣勫崥甯', 'ZBS', '0', '118.055007', '36.813497', '18'); +INSERT INTO `t_s_territory` VALUES ('91', '370400', '3', '鏋e簞甯', 'ZZS', '0', '117.323725', '34.810488', '18'); +INSERT INTO `t_s_territory` VALUES ('92', '370500', '3', '涓滆惀甯', 'DYS', '0', '118.674767', '37.434751', '18'); +INSERT INTO `t_s_territory` VALUES ('926', '370113', '4', '闀挎竻鍖', 'CQQ', '0', '116.751959', '36.553691', '195'); +INSERT INTO `t_s_territory` VALUES ('927', '370124', '4', '骞抽槾鍘', 'PYX', '0', '116.456187', '36.289265', '195'); +INSERT INTO `t_s_territory` VALUES ('928', '370125', '4', '娴庨槼鍘', 'JYX', '0', '117.173529', '36.978547', '195'); +INSERT INTO `t_s_territory` VALUES ('929', '370126', '4', '鍟嗘渤鍘', 'SHX', '0', '117.157183', '37.309045', '195'); +INSERT INTO `t_s_territory` VALUES ('93', '370600', '3', '鐑熷彴甯', 'YTS', '0', '121.447926', '37.463819', '18'); +INSERT INTO `t_s_territory` VALUES ('930', '370181', '4', '绔犱笜甯', 'ZQS', '0', '117.534326', '36.714015', '195'); +INSERT INTO `t_s_territory` VALUES ('931', '370202', '4', '甯傚崡鍖', 'SNQ', '0', '120.412392', '36.075651', '89'); +INSERT INTO `t_s_territory` VALUES ('932', '370203', '4', '甯傚寳鍖', 'SBQ', '0', '120.374801', '36.087661', '89'); +INSERT INTO `t_s_territory` VALUES ('933', '370205', '4', '鍥涙柟鍖', 'SFQ', '0', '120.366454', '36.103993', '89'); +INSERT INTO `t_s_territory` VALUES ('934', '370211', '4', '榛勫矝鍖', 'HDQ', '0', '120.198054', '35.960935', '89'); +INSERT INTO `t_s_territory` VALUES ('935', '370212', '4', '宕傚北鍖', 'LSQ', '0', '120.468956', '36.107538', '89'); +INSERT INTO `t_s_territory` VALUES ('936', '370213', '4', '鏉庢钵鍖', 'LCQ', '0', '120.432864', '36.145476', '89'); +INSERT INTO `t_s_territory` VALUES ('937', '370214', '4', '鍩庨槼鍖', 'CYQ', '0', '120.396529', '36.307061', '89'); +INSERT INTO `t_s_territory` VALUES ('938', '370281', '4', '鑳跺窞甯', 'JZS', '0', '120.033345', '36.264664', '89'); +INSERT INTO `t_s_territory` VALUES ('939', '370282', '4', '鍗冲ⅷ甯', 'JMS', '0', '120.447162', '36.389401', '89'); +INSERT INTO `t_s_territory` VALUES ('94', '370700', '3', '娼嶅潑甯', 'WFS', '0', '119.16193', '36.706691', '18'); +INSERT INTO `t_s_territory` VALUES ('940', '370283', '4', '骞冲害甯', 'PDS', '0', '119.960014', '36.7867', '89'); +INSERT INTO `t_s_territory` VALUES ('941', '370284', '4', '鑳跺崡甯', 'JNS', '0', '120.04643', '35.8725', '89'); +INSERT INTO `t_s_territory` VALUES ('942', '370285', '4', '鑾辫タ甯', 'LXS', '0', '120.51769', '36.889084', '89'); +INSERT INTO `t_s_territory` VALUES ('943', '370302', '4', '娣勫窛鍖', 'ZCQ', '0', '117.966842', '36.643449', '90'); +INSERT INTO `t_s_territory` VALUES ('944', '370303', '4', '寮犲簵鍖', 'ZDQ', '0', '118.017656', '36.806773', '90'); +INSERT INTO `t_s_territory` VALUES ('945', '370304', '4', '鍗氬北鍖', 'BSQ', '0', '117.861698', '36.494752', '90'); +INSERT INTO `t_s_territory` VALUES ('946', '370305', '4', '涓存穭鍖', 'LZQ', '0', '118.308977', '36.827343', '90'); +INSERT INTO `t_s_territory` VALUES ('947', '370306', '4', '鍛ㄦ潙鍖', 'ZCQ', '0', '117.869877', '36.803109', '90'); +INSERT INTO `t_s_territory` VALUES ('948', '370321', '4', '妗撳彴鍘', 'HTX', '0', '118.097955', '36.959623', '90'); +INSERT INTO `t_s_territory` VALUES ('949', '370322', '4', '楂橀潚鍘', 'GQX', '0', '117.826916', '37.171063', '90'); +INSERT INTO `t_s_territory` VALUES ('95', '370800', '3', '娴庡畞甯', 'JNS', '0', '116.587099', '35.414921', '18'); +INSERT INTO `t_s_territory` VALUES ('950', '370323', '4', '娌傛簮鍘', 'YYX', '0', '118.170979', '36.184827', '90'); +INSERT INTO `t_s_territory` VALUES ('951', '370402', '4', '甯備腑鍖', 'SZQ', '0', '117.556124', '34.864114', '91'); +INSERT INTO `t_s_territory` VALUES ('952', '370403', '4', '钖涘煄鍖', 'YCQ', '0', '117.263157', '34.795206', '91'); +INSERT INTO `t_s_territory` VALUES ('953', '370404', '4', '宄勫煄鍖', 'YCQ', '0', '117.590819', '34.772236', '91'); +INSERT INTO `t_s_territory` VALUES ('954', '370405', '4', '鍙板効搴勫尯', 'TEZQ', '0', '117.733832', '34.562528', '91'); +INSERT INTO `t_s_territory` VALUES ('955', '370406', '4', '灞变涵鍖', 'STQ', '0', '117.461343', '35.099549', '91'); +INSERT INTO `t_s_territory` VALUES ('956', '370481', '4', '婊曞窞甯', 'TZS', '0', '117.164388', '35.084021', '91'); +INSERT INTO `t_s_territory` VALUES ('957', '370502', '4', '涓滆惀鍖', 'DYQ', '0', '118.582184', '37.448964', '92'); +INSERT INTO `t_s_territory` VALUES ('958', '370503', '4', '娌冲彛鍖', 'HKQ', '0', '118.525579', '37.886138', '92'); +INSERT INTO `t_s_territory` VALUES ('959', '370521', '4', '鍨﹀埄鍘', 'KLX', '0', '118.547627', '37.58754', '92'); +INSERT INTO `t_s_territory` VALUES ('960', '370522', '4', '鍒╂触鍘', 'LJX', '0', '118.255273', '37.49026', '92'); +INSERT INTO `t_s_territory` VALUES ('961', '370523', '4', '骞块ザ鍘', 'GRX', '0', '118.407045', '37.0537', '92'); +INSERT INTO `t_s_territory` VALUES ('962', '370602', '4', '鑺濈綐鍖', 'ZFQ', '0', '121.400031', '37.540687', '93'); +INSERT INTO `t_s_territory` VALUES ('963', '370611', '4', '绂忓北鍖', 'FSQ', '0', '121.267697', '37.498051', '93'); +INSERT INTO `t_s_territory` VALUES ('964', '370612', '4', '鐗熷钩鍖', 'MPQ', '0', '121.600512', '37.386901', '93'); +INSERT INTO `t_s_territory` VALUES ('965', '370613', '4', '鑾卞北鍖', 'LSQ', '0', '121.445304', '37.511305', '93'); +INSERT INTO `t_s_territory` VALUES ('966', '370614', '4', '寮鍙戝尯', 'KFQ', '0', '121.251001', '37.554683', '93'); +INSERT INTO `t_s_territory` VALUES ('967', '370634', '4', '闀垮矝鍘', 'CDX', '0', '120.736584', '37.921417', '93'); +INSERT INTO `t_s_territory` VALUES ('968', '370681', '4', '榫欏彛甯', 'LKS', '0', '120.477836', '37.646064', '93'); +INSERT INTO `t_s_territory` VALUES ('969', '370682', '4', '鑾遍槼甯', 'LYS', '0', '120.711607', '36.97891', '93'); +INSERT INTO `t_s_territory` VALUES ('970', '370683', '4', '鑾卞窞甯', 'LZS', '0', '119.942327', '37.177017', '93'); +INSERT INTO `t_s_territory` VALUES ('971', '370684', '4', '钃幈甯', 'PLS', '0', '120.758848', '37.810661', '93'); +INSERT INTO `t_s_territory` VALUES ('972', '370685', '4', '鎷涜繙甯', 'ZYS', '0', '120.434072', '37.355469', '93'); +INSERT INTO `t_s_territory` VALUES ('973', '370686', '4', '鏍栭湠甯', 'QXS', '0', '120.849675', '37.335123', '93'); +INSERT INTO `t_s_territory` VALUES ('974', '370687', '4', '娴烽槼甯', 'HYS', '0', '121.158477', '36.776425', '93'); +INSERT INTO `t_s_territory` VALUES ('975', '370702', '4', '娼嶅煄鍖', 'WCQ', '0', '119.024836', '36.7281', '94'); +INSERT INTO `t_s_territory` VALUES ('976', '370703', '4', '瀵掍涵鍖', 'HTQ', '0', '119.219734', '36.775491', '94'); +INSERT INTO `t_s_territory` VALUES ('977', '370704', '4', '鍧婂瓙鍖', 'FZQ', '0', '119.166485', '36.654448', '94'); +INSERT INTO `t_s_territory` VALUES ('978', '370705', '4', '濂庢枃鍖', 'KWQ', '0', '119.132486', '36.707676', '94'); +INSERT INTO `t_s_territory` VALUES ('979', '370724', '4', '涓存湊鍘', 'LQX', '0', '118.542982', '36.5125059', '94'); +INSERT INTO `t_s_territory` VALUES ('980', '370725', '4', '鏄屼箰鍘', 'CLX', '0', '118.829914', '36.706945', '94'); +INSERT INTO `t_s_territory` VALUES ('981', '370781', '4', '闈掑窞甯', 'QZS', '0', '118.479622', '36.684528', '94'); +INSERT INTO `t_s_territory` VALUES ('982', '370782', '4', '璇稿煄甯', 'ZCS', '0', '119.410103', '35.995654', '94'); +INSERT INTO `t_s_territory` VALUES ('983', '370783', '4', '瀵垮厜甯', 'SGS', '0', '118.790652', '36.85548', '94'); +INSERT INTO `t_s_territory` VALUES ('984', '370784', '4', '瀹変笜甯', 'AQS', '0', '119.218978', '36.478494', '94'); +INSERT INTO `t_s_territory` VALUES ('985', '370785', '4', '楂樺瘑甯', 'GMS', '0', '119.755597', '36.3825949', '94'); +INSERT INTO `t_s_territory` VALUES ('986', '370786', '4', '鏄岄倯甯', 'CYS', '0', '119.398525', '36.85882', '94'); +INSERT INTO `t_s_territory` VALUES ('987', '370802', '4', '甯備腑鍖', 'SZQ', '0', '116.596614', '35.40819', '95'); +INSERT INTO `t_s_territory` VALUES ('988', '370811', '4', '浠诲煄鍖', 'RCQ', '0', '116.628562', '35.433727', '95'); +INSERT INTO `t_s_territory` VALUES ('989', '370826', '4', '寰北鍘', 'WSX', '0', '117.128946', '34.8071', '95'); +INSERT INTO `t_s_territory` VALUES ('990', '370827', '4', '楸煎彴鍘', 'YTX', '0', '116.650608', '35.012749', '95'); +INSERT INTO `t_s_territory` VALUES ('991', '370828', '4', '閲戜埂鍘', 'JXX', '0', '116.311532', '35.06662', '95'); +INSERT INTO `t_s_territory` VALUES ('992', '370829', '4', '鍢夌ゥ鍘', 'JXX', '0', '116.342442', '35.407829', '95'); +INSERT INTO `t_s_territory` VALUES ('993', '370830', '4', '姹朵笂鍘', 'WSX', '0', '116.489043', '35.732799', '95'); +INSERT INTO `t_s_territory` VALUES ('994', '370831', '4', '娉楁按鍘', 'SSX', '0', '117.251195', '35.664323', '95'); +INSERT INTO `t_s_territory` VALUES ('995', '370832', '4', '姊佸北鍘', 'LSX', '0', '116.096044', '35.802306', '95'); +INSERT INTO `t_s_territory` VALUES ('996', '370881', '4', '鏇查槣甯', 'QFS', '0', '116.986532', '35.581137', '95'); +INSERT INTO `t_s_territory` VALUES ('997', '370882', '4', '鍏栧窞甯', 'YZS', '0', '116.783834', '35.553144', '95'); +INSERT INTO `t_s_territory` VALUES ('998', '370883', '4', '閭瑰煄甯', 'ZCS', '0', '117.003743', '35.405185', '95'); +INSERT INTO `t_s_territory` VALUES ('999', '370902', '4', '娉板北鍖', 'TSQ', '0', '117.135354', '36.192084', '96'); + +-- ---------------------------- +-- Table structure for `t_s_timetask` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_timetask`; +CREATE TABLE `t_s_timetask` ( + `ID` varchar(32) NOT NULL, + `CREATE_BY` varchar(32) default NULL, + `CREATE_DATE` datetime default NULL, + `CREATE_NAME` varchar(32) default NULL, + `CRON_EXPRESSION` varchar(100) NOT NULL, + `IS_EFFECT` varchar(1) NOT NULL, + `IS_START` varchar(1) NOT NULL, + `TASK_DESCRIBE` varchar(50) NOT NULL, + `TASK_ID` varchar(100) NOT NULL, + `UPDATE_BY` varchar(32) default NULL, + `UPDATE_DATE` datetime default NULL, + `UPDATE_NAME` varchar(32) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_timetask +-- ---------------------------- +INSERT INTO `t_s_timetask` VALUES ('402880e74c79dd47014c79de88f70001', 'admin', '2015-04-02 19:22:49', '绠$悊鍛', '0 0/1 * * * ?', '1', '0', '娑堟伅涓棿浠跺畾鏃朵换鍔', 'smsSendTaskCronTrigger', 'admin', '2015-04-02 20:03:01', '绠$悊鍛'); +INSERT INTO `t_s_timetask` VALUES ('8a8ab0b246dc81120146dc81850c016a', null, null, null, '0 0/1 * * * ?', '1', '0', '娴嬭瘯Demo', 'taskDemoServiceTaskCronTrigger', 'admin', '2015-04-02 19:49:44', '绠$悊鍛'); + +-- ---------------------------- +-- Table structure for `t_s_type` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_type`; +CREATE TABLE `t_s_type` ( + `ID` varchar(32) NOT NULL, + `typecode` varchar(50) default NULL, + `typename` varchar(50) default NULL, + `typepid` varchar(32) default NULL, + `typegroupid` varchar(32) default NULL, + PRIMARY KEY (`ID`), + KEY `FK_nw2b22gy7plh7pqows186odmq` (`typepid`), + KEY `FK_3q40mr4ebtd0cvx79matl39x1` (`typegroupid`), + CONSTRAINT `FK_3q40mr4ebtd0cvx79matl39x1` FOREIGN KEY (`typegroupid`) REFERENCES `t_s_typegroup` (`ID`), + CONSTRAINT `FK_nw2b22gy7plh7pqows186odmq` FOREIGN KEY (`typepid`) REFERENCES `t_s_type` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_type +-- ---------------------------- +INSERT INTO `t_s_type` VALUES ('297e201047e95ee30147e9baab5c000b', '1', 'common.company', null, '297e201047e95ee30147e9ba56ce0009'); +INSERT INTO `t_s_type` VALUES ('297e201047e95ee30147e9baef97000d', '2', 'common.department', null, '297e201047e95ee30147e9ba56ce0009'); +INSERT INTO `t_s_type` VALUES ('297e201047e95ee30147e9bb1210000f', '3', 'common.position', null, '297e201047e95ee30147e9ba56ce0009'); +INSERT INTO `t_s_type` VALUES ('2c90ac564c9d1734014c9db1e025002d', 'Y', '鏄', null, '2c90ac564c9d1734014c9db1a167002b'); +INSERT INTO `t_s_type` VALUES ('2c90ac564c9d1734014c9db20b0d002f', 'N', '鍚', null, '2c90ac564c9d1734014c9db1a167002b'); +INSERT INTO `t_s_type` VALUES ('402880884883eff4014884180bf80029', '1', '钄疯枃涓冩潙', null, '402880884883eff401488415cbb60027'); +INSERT INTO `t_s_type` VALUES ('402880cd4dbd4baa014dbd9c184f0003', 'WXTP', '鍥剧墖', null, 'jglongjbtstypegourp2015060400001'); +INSERT INTO `t_s_type` VALUES ('402881e64ca6fd1b014ca7052d930006', 'spline', '鏇茬嚎鍥', null, '402881e64ca6fd1b014ca7044c370004'); +INSERT INTO `t_s_type` VALUES ('402881e64ca6fd1b014ca705b2b40008', 'column', '鏌辩姸鍥', null, '402881e64ca6fd1b014ca7044c370004'); +INSERT INTO `t_s_type` VALUES ('402881e64ca6fd1b014ca7061fb7000a', 'pie', '楗煎浘', null, '402881e64ca6fd1b014ca7044c370004'); +INSERT INTO `t_s_type` VALUES ('402881e946e71f5f0146e736c4e80008', 'en', 'common.english', null, '402881e946e71f5f0146e73619bb0002'); +INSERT INTO `t_s_type` VALUES ('402881e946e71f5f0146e740dcad0012', 'zh-cn', 'common.chinese', null, '402881e946e71f5f0146e73619bb0002'); +INSERT INTO `t_s_type` VALUES ('8a71b40e4a38319b014a3859a2c1001a', '1', 'common.smsAlertsModel', null, '8a71b40e4a38319b014a3858fca40018'); +INSERT INTO `t_s_type` VALUES ('8a71b40e4a38319b014a385a01d1001c', '2', 'common.emailAlertsModel', null, '8a71b40e4a38319b014a3858fca40018'); +INSERT INTO `t_s_type` VALUES ('8a71b40e4a38319b014a385d30300020', '1', 'common.smsAlerts', null, '8a71b40e4a38319b014a385cb115001e'); +INSERT INTO `t_s_type` VALUES ('8a71b40e4a38319b014a385d86c30022', '2', 'common.emailAlerts', null, '8a71b40e4a38319b014a385cb115001e'); +INSERT INTO `t_s_type` VALUES ('8a71b40e4a38319b014a385dc1370024', '3', 'common.sysAlerts', null, '8a71b40e4a38319b014a385cb115001e'); +INSERT INTO `t_s_type` VALUES ('8a71b40e4a38319b014a3860603f0028', '1', 'common.didNotSend', null, '8a71b40e4a38319b014a386022bd0026'); +INSERT INTO `t_s_type` VALUES ('8a71b40e4a38319b014a38608d98002a', '2', 'common.sendSuccess', null, '8a71b40e4a38319b014a386022bd0026'); +INSERT INTO `t_s_type` VALUES ('8a71b40e4a38319b014a3860b181002c', '3', 'common.failToSend', null, '8a71b40e4a38319b014a386022bd0026'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8181f30060', '2', 'menu.icon', null, '8a8ab0b246dc81120146dc8181aa0056'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8181f70061', '1', 'system.icon', null, '8a8ab0b246dc81120146dc8181aa0056'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8181fa0062', 'files', 'common.attachment', null, '8a8ab0b246dc81120146dc8181ca005e'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8181fe0063', '1', 'lang.excellent.order', null, '8a8ab0b246dc81120146dc8181b10057'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8182010064', '2', 'lang.normal.order', null, '8a8ab0b246dc81120146dc8181b10057'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8182050065', '1', 'lang.contract.customer', null, '8a8ab0b246dc81120146dc8181b50058'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8182080066', '2', 'lang.normal.customer', null, '8a8ab0b246dc81120146dc8181b50058'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc81820b0067', '1', 'lang.special.servcie', null, '8a8ab0b246dc81120146dc8181b90059'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8182100068', '2', 'lang.normal.service', null, '8a8ab0b246dc81120146dc8181b90059'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8182130069', 'single', 'common.single.condition.query', null, '8a8ab0b246dc81120146dc8181bc005a'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc818216006a', 'group', 'common.scope.query', null, '8a8ab0b246dc81120146dc8181bc005a'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc81821a006b', 'Y', 'common.yes', null, '8a8ab0b246dc81120146dc8181c0005b'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc81821d006c', 'N', 'common.no', null, '8a8ab0b246dc81120146dc8181c0005b'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc818221006d', 'Integer', 'common.db.integer', null, '8a8ab0b246dc81120146dc8181c3005c'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc818224006e', 'Date', 'common.db.date', null, '8a8ab0b246dc81120146dc8181c3005c'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc818227006f', 'String', 'common.db.string', null, '8a8ab0b246dc81120146dc8181c3005c'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc81822b0070', 'Long', 'common.db.long', null, '8a8ab0b246dc81120146dc8181c3005c'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc81822f0071', 'act', 'common.workflow.engine.table', null, '8a8ab0b246dc81120146dc8181c6005d'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8182320072', 't_s', 'common.system.table', null, '8a8ab0b246dc81120146dc8181c6005d'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8182350073', 't_b', 'common.business.table', null, '8a8ab0b246dc81120146dc8181c6005d'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8182390074', 't_p', 'common.customer.engine.table', null, '8a8ab0b246dc81120146dc8181c6005d'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc81823c0075', 'news', 'common.news', null, '8a8ab0b246dc81120146dc8181ca005e'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8182400076', '0', 'common.male', null, '8a8ab0b246dc81120146dc8181cd005f'); +INSERT INTO `t_s_type` VALUES ('8a8ab0b246dc81120146dc8182430077', '1', 'common.female', null, '8a8ab0b246dc81120146dc8181cd005f'); +INSERT INTO `t_s_type` VALUES ('8a8ab0ba487c527201487c7863ec001b', 'oracle', 'common.oracle', null, '8a8ab0ba487c527201487c7732790019'); +INSERT INTO `t_s_type` VALUES ('8a8ab0ba487c527201487c78aefc001d', 'sqlserver2008', 'common.sqlserver2008', null, '8a8ab0ba487c527201487c7732790019'); +INSERT INTO `t_s_type` VALUES ('8a8ab0ba487c527201487c78fbb5001f', 'mysql', 'common.mysql', null, '8a8ab0ba487c527201487c7732790019'); +INSERT INTO `t_s_type` VALUES ('f852d85d47ed64a40147ed71f6b40005', '>', '澶т簬', null, 'f852d85d47ed64a40147ed70894c0003'); +INSERT INTO `t_s_type` VALUES ('f852d85d47ed64a40147ed72a9dc0007', '>=', '澶т簬绛変簬', null, 'f852d85d47ed64a40147ed70894c0003'); +INSERT INTO `t_s_type` VALUES ('f852d85d47ed64a40147ed750e1c0009', '<', '灏忎簬', null, 'f852d85d47ed64a40147ed70894c0003'); +INSERT INTO `t_s_type` VALUES ('f852d85d47ed64a40147ed753b6f000b', '<=', '灏忎簬绛変簬', null, 'f852d85d47ed64a40147ed70894c0003'); +INSERT INTO `t_s_type` VALUES ('f852d85d47ed64a40147ed75afe5000d', '=', '绛変簬', null, 'f852d85d47ed64a40147ed70894c0003'); +INSERT INTO `t_s_type` VALUES ('f852d85d47ed64a40147ed75ed62000f', 'IN', '鍖呭惈', null, 'f852d85d47ed64a40147ed70894c0003'); +INSERT INTO `t_s_type` VALUES ('f852d85d47ed64a40147ed7638b20011', 'LIKE', '妯$硦', null, 'f852d85d47ed64a40147ed70894c0003'); +INSERT INTO `t_s_type` VALUES ('f852d85d47ed64a40147ed767c240013', '!=', '涓嶇瓑浜', null, 'f852d85d47ed64a40147ed70894c0003'); +INSERT INTO `t_s_type` VALUES ('jglongjbtstype201506041030000001', 'WXGZYD', '鍏虫敞寮曞', null, 'jglongjbtstypegourp2015060400001'); +INSERT INTO `t_s_type` VALUES ('jglongjbtstype201506041030000002', 'WXNRQ', '鍐呭鍖', null, 'jglongjbtstypegourp2015060400001'); +INSERT INTO `t_s_type` VALUES ('jglongjbtstype201506041030000003', 'WXYWYD', '鍘熸枃寮曞', null, 'jglongjbtstypegourp2015060400001'); +INSERT INTO `t_s_type` VALUES ('jglongjbtstype201506041030000004', 'WXBT', '鏍囬', null, 'jglongjbtstypegourp2015060400001'); +INSERT INTO `t_s_type` VALUES ('jglongjbtstype201506041030000005', 'WXFGX', '鍒嗛殧绾', null, 'jglongjbtstypegourp2015060400001'); +INSERT INTO `t_s_type` VALUES ('jglongjbtstype201506041030000006', 'WXHTZH', '浜掓帹璐﹀彿', null, 'jglongjbtstypegourp2015060400001'); +INSERT INTO `t_s_type` VALUES ('jglongjbtstype201506041030000007', 'WXQT', '鍏朵粬', null, 'jglongjbtstypegourp2015060400001'); +INSERT INTO `t_s_type` VALUES ('jglongjbtstype201506041030000008', 'WXWDYS', '鎴戠殑鏍峰紡', null, 'jglongjbtstypegourp2015060400001'); + +-- ---------------------------- +-- Table structure for `t_s_typegroup` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_typegroup`; +CREATE TABLE `t_s_typegroup` ( + `ID` varchar(32) NOT NULL, + `typegroupcode` varchar(50) default NULL, + `typegroupname` varchar(50) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_typegroup +-- ---------------------------- +INSERT INTO `t_s_typegroup` VALUES ('297e201047e95ee30147e9ba56ce0009', 'orgtype', 'common.org.type'); +INSERT INTO `t_s_typegroup` VALUES ('2c90ac564c9d1734014c9db1a167002b', 'sf_yn', '鏄惁YN'); +INSERT INTO `t_s_typegroup` VALUES ('402880884883eff401488415cbb60027', 'smsTplType', '妯℃澘绫诲瀷'); +INSERT INTO `t_s_typegroup` VALUES ('402881e64ca6fd1b014ca7044c370004', 'tblx', '鍥捐〃绫诲瀷'); +INSERT INTO `t_s_typegroup` VALUES ('402881e946e71f5f0146e73619bb0002', 'lang', 'common.mutilang'); +INSERT INTO `t_s_typegroup` VALUES ('8a71b40e4a38319b014a3858fca40018', 'msgTplType', '娑堟伅妯℃澘鍒嗙被'); +INSERT INTO `t_s_typegroup` VALUES ('8a71b40e4a38319b014a385cb115001e', 'msgType', '娑堟伅绫诲埆'); +INSERT INTO `t_s_typegroup` VALUES ('8a71b40e4a38319b014a386022bd0026', 'msgStatus', '娑堟伅鍙戦佺姸鎬'); +INSERT INTO `t_s_typegroup` VALUES ('8a8ab0b246dc81120146dc8181aa0056', 'icontype', 'common.icon.type'); +INSERT INTO `t_s_typegroup` VALUES ('8a8ab0b246dc81120146dc8181b10057', 'order', 'lang.order.type'); +INSERT INTO `t_s_typegroup` VALUES ('8a8ab0b246dc81120146dc8181b50058', 'custom', 'lang.customer.type'); +INSERT INTO `t_s_typegroup` VALUES ('8a8ab0b246dc81120146dc8181b90059', 'service', 'lang.service.item.type'); +INSERT INTO `t_s_typegroup` VALUES ('8a8ab0b246dc81120146dc8181bc005a', 'searchmode', 'common.query.module'); +INSERT INTO `t_s_typegroup` VALUES ('8a8ab0b246dc81120146dc8181c0005b', 'yesorno', 'common.logic.condition'); +INSERT INTO `t_s_typegroup` VALUES ('8a8ab0b246dc81120146dc8181c3005c', 'fieldtype', 'field.type'); +INSERT INTO `t_s_typegroup` VALUES ('8a8ab0b246dc81120146dc8181c6005d', 'database', 'common.data.table'); +INSERT INTO `t_s_typegroup` VALUES ('8a8ab0b246dc81120146dc8181ca005e', 'fieltype', 'common.document.category'); +INSERT INTO `t_s_typegroup` VALUES ('8a8ab0b246dc81120146dc8181cd005f', 'sex', 'common.sex.type'); +INSERT INTO `t_s_typegroup` VALUES ('8a8ab0ba487c527201487c7732790019', 'dbtype', 'common.dbtype'); +INSERT INTO `t_s_typegroup` VALUES ('f852d85d47ed64a40147ed70894c0003', 'rulecon', '瑙勫垯鏉′欢'); +INSERT INTO `t_s_typegroup` VALUES ('jglongjbtstypegourp2015060400001', 'weixin', '寰俊妯℃澘绫诲瀷'); + +-- ---------------------------- +-- Table structure for `t_s_user` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_user`; +CREATE TABLE `t_s_user` ( + `email` varchar(50) default NULL, + `mobilePhone` varchar(30) default NULL, + `officePhone` varchar(20) default NULL, + `signatureFile` varchar(100) default NULL, + `id` varchar(32) NOT NULL, + `update_name` varchar(32) default NULL COMMENT '淇敼浜', + `update_date` datetime default NULL COMMENT '淇敼鏃堕棿', + `update_by` varchar(32) default NULL COMMENT '淇敼浜篿d', + `create_name` varchar(32) default NULL COMMENT '鍒涘缓浜', + `create_date` datetime default NULL COMMENT '鍒涘缓鏃堕棿', + `create_by` varchar(32) default NULL COMMENT '鍒涘缓浜篿d', + PRIMARY KEY (`id`), + KEY `FK_2cuji5h6yorrxgsr8ojndlmal` (`id`), + CONSTRAINT `FK_2cuji5h6yorrxgsr8ojndlmal` FOREIGN KEY (`id`) REFERENCES `t_s_base_user` (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_user +-- ---------------------------- +INSERT INTO `t_s_user` VALUES ('', '', '', null, '402880e74d75c4dd014d75d44af30005', '绠$悊鍛', '2015-06-05 18:51:55', 'admin', '绠$悊鍛', '2015-05-21 17:35:56', 'admin'); +INSERT INTO `t_s_user` VALUES ('', '', '', 'images/renfang/qm/licf.gif', '8a8ab0b246dc81120146dc8181950052', null, null, null, null, null, null); +INSERT INTO `t_s_user` VALUES ('zhangdaiscott@163.com', '13426432910', '7496661', null, '8a8ab0b246dc81120146dc81819d0053', '绠$悊鍛', '2015-05-25 14:41:28', 'admin', null, null, null); +INSERT INTO `t_s_user` VALUES (null, null, null, null, '8a8ab0b246dc81120146dc8181a10054', null, null, null, null, null, null); +INSERT INTO `t_s_user` VALUES (null, null, null, null, '8a8ab0b246dc81120146dc8181a60055', null, null, null, null, null, null); + +-- ---------------------------- +-- Table structure for `t_s_user_org` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_user_org`; +CREATE TABLE `t_s_user_org` ( + `ID` varchar(32) NOT NULL, + `user_id` varchar(32) default NULL, + `org_id` varchar(32) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_user_org +-- ---------------------------- +INSERT INTO `t_s_user_org` VALUES ('402880e74d75c4dd014d75d44b490006', '402880e74d75c4dd014d75d44af30005', '8a8ab0b246dc81120146dc8180a20016'); +INSERT INTO `t_s_user_org` VALUES ('402880e74d89cb70014d89cdff620003', '8a8ab0b246dc81120146dc81819d0053', '402880e447e9a9570147e9b762e30009'); +INSERT INTO `t_s_user_org` VALUES ('402880e74d89cb70014d89cdff640004', '8a8ab0b246dc81120146dc81819d0053', '8a8ab0b246dc81120146dc8180bd0018'); +INSERT INTO `t_s_user_org` VALUES ('402889fb486e848101486e89f9fa0001', '8a8ab0b246dc81120146dc8181950052', '8a8ab0b246dc81120146dc8180a20016'); +INSERT INTO `t_s_user_org` VALUES ('402889fb486e848101486e89f9fc0002', '8a8ab0b246dc81120146dc8181950052', '402880e447e9a9570147e9b710d20007'); +INSERT INTO `t_s_user_org` VALUES ('8a8ab0b246dc81120146dc8181a10054', '8a8ab0b246dc81120146dc8181a10054', '8a8ab0b246dc81120146dc8180a20016'); +INSERT INTO `t_s_user_org` VALUES ('8a8ab0b246dc81120146dc8181a60055', '8a8ab0b246dc81120146dc8181a60055', '8a8ab0b246dc81120146dc8180a20016'); + +-- ---------------------------- +-- Table structure for `t_s_version` +-- ---------------------------- +DROP TABLE IF EXISTS `t_s_version`; +CREATE TABLE `t_s_version` ( + `ID` varchar(32) NOT NULL, + `loginpage` varchar(100) default NULL, + `versioncode` varchar(50) default NULL, + `versionname` varchar(30) default NULL, + `versionnum` varchar(20) default NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of t_s_version +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `test_onetable` +-- ---------------------------- +DROP TABLE IF EXISTS `test_onetable`; +CREATE TABLE `test_onetable` ( + `id` varchar(36) NOT NULL, + `create_name` varchar(50) default NULL COMMENT '鍒涘缓浜哄悕绉', + `create_by` varchar(50) default NULL COMMENT '鍒涘缓浜虹櫥褰曞悕绉', + `create_date` datetime default NULL COMMENT '鍒涘缓鏃ユ湡', + `update_name` varchar(50) default NULL COMMENT '鏇存柊浜哄悕绉', + `update_by` varchar(50) default NULL COMMENT '鏇存柊浜虹櫥褰曞悕绉', + `update_date` datetime default NULL COMMENT '鏇存柊鏃ユ湡', + `name` varchar(32) default NULL COMMENT '鍚嶅瓧', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of test_onetable +-- ---------------------------- +INSERT INTO `test_onetable` VALUES ('402880e74dc1f029014dc1f0292e0000', '绠$悊鍛', 'admin', '2015-06-05 00:00:00', '绠$悊鍛', 'admin', '2015-06-05 00:00:00', '8888'); + +-- ---------------------------- +-- Table structure for `weixin_template` +-- ---------------------------- +DROP TABLE IF EXISTS `weixin_template`; +CREATE TABLE `weixin_template` ( + `id` varchar(36) NOT NULL, + `create_name` varchar(50) default NULL COMMENT '鍒涘缓浜哄悕绉', + `create_by` varchar(50) default NULL COMMENT '鍒涘缓浜虹櫥褰曞悕绉', + `create_date` datetime default NULL COMMENT '鍒涘缓鏃ユ湡', + `update_name` varchar(50) default NULL COMMENT '鏇存柊浜哄悕绉', + `update_by` varchar(50) default NULL COMMENT '鏇存柊浜虹櫥褰曞悕绉', + `update_date` datetime default NULL COMMENT '鏇存柊鏃ユ湡', + `title` varchar(32) default NULL COMMENT '鏍囬', + `type` varchar(32) default NULL COMMENT '绫诲瀷', + `content` longtext COMMENT '妯℃澘鍐呭', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of weixin_template +-- ---------------------------- +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbce9c2f00000', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍏虫敞寮曞0002', 'WXGZYD', '

? 鎻愮ず榫欓噾娉鐐瑰嚮涓婃柟\"寰帹瀹濆井淇\"鍏嶈垂璁㈤槄鏈垔



\r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd0f34790001', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍏虫敞寮曞0003', 'WXGZYD', '
鐐瑰嚮涓婃柟
鈥滆摑鑹插瓧鈥
鍙叧娉ㄦ垜浠紒



\r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd10739d0002', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0001', 'WXBT', '

 鎺ㄥ疂  鍒╁櫒 



\r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd11818e0003', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0002', 'WXBT', '
寰帹瀹濆嚭鍝
蹇呭睘绮惧搧
1
杩欓噷鍙緭鍏ユ爣棰橈紝鑷傚簲瀹藉害


\r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd1229670004', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0003', 'WXBT', '

杩欏彲杈撳叆鏍囬



\r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd12e2da0005', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0004', 'WXBT', '

涓銆佽繖鍙緭鍏ユ爣棰


\r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd13afe80006', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0005', 'WXBT', '

1
杩欏彲杈撳叆鏍囬
 

\r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd1447400007', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0006', 'WXBT', '
绗竴姝


\r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd150f9a0008', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0007', 'WXBT', '
1銆佽繖閲岃緭鍏ユ爣棰


\r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd15ada40009', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0008', 'WXBT', '
  • \r\n

    杩欓噷杈撳叆鏍囬
     


    \r\n
  • '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd1633cc000a', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0009', 'WXBT', '
    1
    璇疯緭鍏ユ爣棰


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd16f5ee000b', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0009', 'WXBT', '
    璇疯緭鍏ユ爣棰


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd19f245000c', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0010', 'WXBT', '
    1銆佽繖閲岃緭鍏ユ爣棰



    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd1a87c5000d', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0011', 'WXBT', '

    璇疯緭鍏ユ爣棰


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd1b1205000e', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0012', 'WXBT', '

    璇疯緭鍏ユ爣棰

    鎴戞槸娈佃惤鍐呭


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd1c5c06000f', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0013', 'WXBT', '

    璇峰湪杩欏彲杈撳叆鏍囬鎴戞槸寰俊ID


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd1d1b420010', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0014', 'WXBT', '

    1绗竴鏍囬


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd1d92190011', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0015', 'WXBT', '

    1绗竴鏍囬


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd1e70590012', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0016', 'WXBT', '

    2璇峰湪杩欏彲杈撳叆鏍囬


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd1efb820013', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0017', 'WXBT', '

    璇峰湪杩欏彲杈撳叆鏍囬


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd1fbb800014', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0018', 'WXBT', '

    ?娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd20447f0015', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0019', 'WXBT', '

    璇峰湪杩欏彲杈撳叆鏍囬


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd225cf50016', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0020', 'WXBT', '

    璇峰湪杩欏彲杈撳叆鏍囬


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd22f9ec0017', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0021', 'WXBT', '

    璇峰湪杩欏彲杈撳叆鏍囬


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd23719c0018', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0022', 'WXBT', '

    璇峰湪杩欏彲杈撳叆鏍囬


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd26032d0019', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0002', 'WXNRQ', '

    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd270e53001a', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0003', 'WXNRQ', '
    \r\n
    \r\n杩欒緭鍏ユ爣棰 寰帹瀹濈紪杈戝櫒\r\n
    \r\n
    \r\n鍙湪杩欒緭鍏ュ唴瀹癸紝寰帹瀹濆井淇$紪杈戝櫒锛屽井淇$紪杈戦閫夈俓r\n
    \r\n
    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd27abdb001b', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0004', 'WXNRQ', '
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n鍙湪杩欒緭鍏ュ唴瀹癸紝 寰帹瀹濆井淇$紪杈戝櫒锛屽井淇$紪杈戦閫夈俓r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd284a3a001c', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0005', 'WXNRQ', '
    \r\n

    \r\n鍙湪杩欒緭鍏ュ唴瀹癸紝 寰帹瀹濆井淇$紪杈戝櫒锛屽井淇$紪杈戦閫夈俓r\n

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd2bfaed001d', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0006', 'WXNRQ', '
    \r\n
    \r\n
    \r\n鎴戠殑瑙傜偣\r\n
    \r\n
    \r\n
    \r\n
    \r\n鍙湪杩欒緭鍏ュ唴瀹癸紝 寰帹瀹濆井淇$紪杈戝櫒锛屽井淇$紪杈戦閫夈\r\n
    \r\n

    \r\n
    \r\n

    \r\n
    \r\n
    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd2d5b54001e', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0007', 'WXNRQ', '

    璇疯緭鍏ュ唴瀹


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd2df3a0001f', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0008', 'WXNRQ', '
    \r\n\r\n绮惧僵鍐呭\r\n\r\n

    \r\n璇疯緭鍏ュ唴瀹
    \r\n

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd2ecdbc0020', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0009', 'WXNRQ', '
    \r\n

    \r\n鍙湪杩欒緭鍏ュ唴瀹癸紝 寰帹瀹濆井淇$紪杈戝櫒锛屽井淇$紪杈戦閫夈\r\n

    \r\n

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd2f8c6e0021', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0010', 'WXNRQ', '

    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd30006f0022', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0011', 'WXNRQ', '

    鐩存帴閫夋嫨闇瑕佺殑鏍峰紡鎷疯礉鍒伴渶瑕佺殑鍦版柟锛屼慨鏀瑰叾涓殑鏂囧瓧鍗冲彲銆


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd307eac0023', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0012', 'WXNRQ', '

    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd30fc950024', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0013', 'WXNRQ', '

    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd3178710025', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0014', 'WXNRQ', '
    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd31daf00026', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0015', 'WXNRQ', '
    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd324f5e0027', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0016', 'WXNRQ', '
    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd3313660028', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0017', 'WXNRQ', '
    鏉窞鎺ㄥ疂绉戞妧




    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd337dc70029', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0018', 'WXNRQ', '
    鍏憡閫氱煡

    鍚勪綅灏忎紮浼翠滑锛屽綋灏忎紮浼翠滑鐪嬪埌杩欎釜鎺掔増鎶宸х殑鏃跺欙紝璇存槑鎴戜滑鏈夌紭銆侀鍏堝啀寮濮嬩箣鍓嶏紝璇蜂娇鐢璋锋瓕娴忚鍣锛屾墠鑳借揪鍒板拰鎵嬫満绔竴鑷寸殑鏁堟灉锛屽叾娆¢儴鍒嗘晥鏋滐紝鍦ㄥ叾瀹冩祻瑙堝櫒涓細鏃犳晥锛佷互鍏嶈借澶у瀹濊吹鏃堕棿


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd341735002a', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0019', 'WXNRQ', '
    \r\n\r\n

    璇疯緭鍏ユ爣棰

    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒\r\n

    \r\n


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd349ce7002b', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0020', 'WXNRQ', '
    杈撳叆鏍囬

    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd352dcb002c', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0021', 'WXNRQ', '
    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒鎴戞槸IOS7椋庢牸锛屾病闃村奖銆


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd35bbe4002d', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0022', 'WXNRQ', '
  • \r\n
    鍦ㄨ繖杈撳叆鏍囬

    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n
  • '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd36377e002e', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0023', 'WXNRQ', '
    璇峰湪杩欒緭鍏ユ爣棰

    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbce9c2014dbd37aed6002f', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '浜掓帹0001', 'WXHTZH', '
    鏉窞鎺ㄥ疂绉戞妧ID:wxid

    鐩存帴閫夋嫨闇瑕佺殑鏍峰紡鎷疯礉鍒伴渶瑕佺殑鍦版柟锛屼慨鏀瑰叾涓殑鏂囧瓧鍗冲彲銆濡傛灉闇瑕佽窡鎹㈤鑹叉垨鑰呮湁鍏朵粬闇姹


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd534c520000', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '浜掓帹0002', 'WXHTZH', '
    濡備綍鍏虫敞

    鈶犲鍒垛滃井淇″彿鎴朓D鈥濓紝鍦ㄢ滄坊鍔犳湅鍙嬧濅腑绮樿创鎼滅储鍙风爜鍏虫敞銆

    鈶$偣鍑诲井淇″彸涓婅鐨勨+鈥濓紝浼氬嚭鐜扳滄坊鍔犳湅鍙嬧濓紝杩涘叆鈥滄煡鎵惧叕浼楀彿鈥濓紝杈撳叆浠ヤ笅鍏紬鍙风殑鍚嶅瓧锛屽嵆鍙壘鍒般


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd541d300001', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '浜掓帹0003', 'WXHTZH', '
    鐐瑰嚮涓婇潰寰俊鍙峰叧娉ㄦ垜鍏虫敞鎴戝摕

    瀹氭湡鎺ㄩ佸笎鍙鏈湡鏂囧寲鍚屽煄娲诲姩鍚冨枬鐜╀箰璧勮鍏崷鍟嗗浼樻儬绛夎澶氫紭璐ㄥ唴瀹癸紝鏈鎺ュ湴姘閲嶆湇鍔鐨勬湰鍦板井淇″钩鍙帮紒鍏虫敞鎴戜滑濡ュΕ娌¢敊锛侊紙骞垮憡鍚堜綔锛186XXXXXXXX锛



    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd54d0b60002', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '浜掓帹0004', 'WXHTZH', '
    寰帹瀹濆井淇
    寰俊鍙凤細鏉窞寰帹瀹(鈫愰暱鎸夊鍒)

    鍏ㄥ姏鎵撻犳澀鍩庡井淇¤惀閿绗竴鍝佺墝


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd55894d0003', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '浜掓帹0005', 'WXHTZH', '


    鏉窞鎺ㄥ疂绉戞妧

    wxid

    鐩存帴閫夋嫨闇瑕佺殑鏍峰紡鎷疯礉鍒伴渶瑕佺殑鍦版柟锛屼慨鏀瑰叾涓殑鏂囧瓧鍗冲彲銆傚鏋滈渶瑕佽窡鎹㈤鑹叉垨鑰呮湁鍏朵粬闇姹傘


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd5613e50004', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '浜掓帹0006', 'WXHTZH', '

    鎺ㄥ疂寰俊寰俊鍙凤細weixinhao

    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd5754490005', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍒嗗壊绾0001', 'WXFGX', '

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd58d8800006', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍒嗗壊绾0002', 'WXFGX', '

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd59d2da0007', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍒嗗壊绾0003', 'WXFGX', '

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd5a71180008', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍒嗗壊绾0004', 'WXFGX', '

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd5b21670009', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍒嗗壊绾0005', 'WXFGX', '

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd5ddb44000b', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍘熸枃寮曞0001', 'WXYWYD', '
    \r\n
    \r\n
    \r\n
    \r\n鐐瑰嚮涓嬫柟鈥滈槄璇诲師鏂団鏌ョ湅鏇村\r\n
    \r\n
    \r\n鈫撯啌鈫揬r\n
    \r\n
    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd5e75f1000c', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍘熸枃寮曞0002', 'WXYWYD', '

    鐐瑰嚮宸︿笅瑙掓煡鐪嬫洿澶

    \r\n

    \r\n
    \r\n

    \r\n

    \r\n \r\n

    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd649681000d', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍘熸枃寮曞0003', 'WXYWYD', '
    \r\n鐐瑰嚮鈥闃呰鍘熸枃鈥濅綋楠屼竴娆$畝鍗曚笉杩囩殑寰俊缂栬緫浣撻獙锛屼笉鐢ㄥお涔咃紝涓嶇敤澶毦锛鐬棿鍗冲彲锛\r\n
    \r\n

    \r\n
    \r\n

    \r\n

    \r\n
    \r\n

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd65db39000e', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍏朵粬0001', 'WXQT', '

    闃呰鏈枃鐢ㄤ簡锛 绉掞紝杞彂鍙渶1绉

    ?杞浇鏄竴绉嶆櫤鎱?鍒嗕韩鏄竴绉嶇編寰?

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd66c488000f', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏朵粬0002', 'WXQT', '

    宸﹀彸娓愬彉


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd675c110010', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏朵粬0003', 'WXQT', '

    宸︽笎鍙


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd67e5f50011', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏朵粬0004', 'WXQT', '

    浠庝笅鍒颁笂


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd685d530012', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏朵粬0005', 'WXQT', '

    浠庝笂鍒颁笅锛屽渾娑


    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd74800a0014', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鏍囬0023', 'WXBT', '

    搴忓彿.鏍囬鍏

    \r\n


    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7673c40015', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0024', 'WXBT', '
    1銆佽繖閲岃緭鍏ユ爣棰


    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7739610016', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0025', 'WXBT', '
    璇疯緭鍏ユ爣棰
    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd77d4880017', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0026', 'WXBT', '

    1绗竴鏍囬

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd78b1c10018', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0027', 'WXBT', '

    娣辫壊杈规鏍囬

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7969b00019', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0028', 'WXBT', '
    涓琛岀煭鏍囬
    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd79e32e001a', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0029', 'WXBT', '

    璇疯緭鍏ユ爣棰

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7a7858001b', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0030', 'WXBT', '
    寰俊缂栬緫鍣
    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7b1a20001c', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0031', 'WXBT', '
    涓琛岀煭鏍囬
    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7bb487001d', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0032', 'WXBT', '

    寰俊缂栬緫鍣

    鎿嶄綔鏂逛究鎵嶆槸纭亾鐞

    \r\n'); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7c92d9001e', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0033', 'WXBT', '

    璇疯緭鍏ユ爣棰

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7d1b20001f', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0034', 'WXBT', '
    鑲嗘剰

    闈掓槬锛岃儗鏅壊浣犵殑鍦扮洏浣犲仛涓

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7d8c2d0020', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0035', 'WXBT', '
    寰俊缂栬緫鍣
    鍋氭渶鏄撶敤鐨勭紪杈戝櫒
    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7e098d0021', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0036', 'WXBT', '

    鏍囬鏍囬

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7e84ed0022', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0037', 'WXBT', '
    寰俊缂栬緫鍣   
    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7f10190023', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0038', 'WXBT', '

    璇疯緭鍏ユ爣棰

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd7fb7420024', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0039', 'WXBT', '
    涓ゅ瓧
    鍓爣棰1
    鍓爣棰2
    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd8037160025', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0040', 'WXBT', '

    鏋佺畝鏍囬

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd81193e0026', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0041', 'WXBT', '
    杩欓噷杈撳叆鏍囬
    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd81cd570027', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鏍囬0042', 'WXBT', '
    璇疯緭鍏ユ爣棰
    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd8628850028', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0024', 'WXNRQ', '

    鍙湪杩欒緭鍏ュ唴瀹癸紝wwei寰俊缂栬緫鍣紝寰俊缂栬緫棣栭夈

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd86eb350029', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0025', 'WXNRQ', '
    杩欒緭鍏ユ爣棰

    鍙湪杩欒緭鍏ュ唴瀹癸紝wwei寰俊缂栬緫鍣紝寰俊缂栬緫棣栭夈

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd878ac3002a', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0026', 'WXNRQ', '
    浜嬮」1

    璇疯緭鍏ユ椿鍔ㄥ唴瀹
    璇疯緭鍏ユ椿鍔ㄥ唴瀹
    ......

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd887c63002b', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0027', 'WXNRQ', '
    璇疯緭鍏ュ悕绉
    鏃堕棿
    鍦扮偣



    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd89181d002c', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0028', 'WXNRQ', '

     

    2015骞

    wwei鏇存柊鏃ュ織

     

    5鏈1鏃

    寰俊鍥炬枃缂栬緫

    寰俊鍦ㄧ嚎缂栬緫鍣

     

    3鏈3鏃

    浼氬憳VIP鍔熻兘

    鏂板浜嗕竴澶ф壒鍔熻兘

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd89b0a9002d', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0029', 'WXNRQ', '
    鍥涜瀹借竟妗嗙殑鏍峰紡
    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd8a35c1002e', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0030', 'WXNRQ', '

    铏氱嚎妗嗗唴瀹癸紝浣滀负鎽樿鎴栨钀藉唴瀹广

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd8af659002f', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0031', 'WXNRQ', '

    杈规闃村奖鍐呭鍖哄煙

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd8b911f0030', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0032', 'WXNRQ', '

    鏍囬鏂囧瓧

    鍐呭鎻忚堪.

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd8c29da0031', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0033', 'WXNRQ', '
    1

    濡備綍杩涘叆銆愬井淇$紪杈戝櫒銆戯紵

    缃戦〉鎼滅储鈥滃井淇$紪杈戝櫒鈥濓紝鐐瑰嚮绗竴鏉℃悳绱㈢粨鏋滃嵆鍙繘鍏ョ紪杈戝櫒椤甸潰

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd8dfdc20032', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0034', 'WXNRQ', '

    璇昏屾

    duersi

    缂栬緫瀹屾垚鍚庯紝灏嗗唴瀹瑰鍒剁矘璐村埌寰俊鍚庡彴绱犳潗绠$悊鐨勭紪杈戝櫒涓嵆鍙

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd8eba1f0033', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0035', 'WXNRQ', '
    鍏憡閫氱煡  

    鍚勪綅灏忎紮浼翠滑锛屽井淇″浘鏂囩編鍖栫紪杈戝櫒姝e紡涓婄嚎浜嗭紝娆㈣繋澶у澶氫娇鐢ㄥ鎻愪緵鍙嶉鎰忚銆備娇鐢璋锋瓕涓庣伀鐙愭祻瑙堝櫒锛屽彲鑾峰緱涓庢墜鏈虹涓鑷寸殑鏄剧ず鏁堟灉銆俰e鍐呮牳鐨勪綆鐗堟湰娴忚鍣ㄥ彲鑳芥湁涓嶅吋瀹圭殑鎯呭喌


    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd9117560034', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0036', 'WXNRQ', '
    鍏充簬寰俊缂栬緫鍣  

    闈炲父濂界敤鐨勫湪绾垮浘鏂囩紪杈戝伐鍏    

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd92018b0035', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '寰俊0037', 'WXNRQ', '
    杩欓噷鎻掑叆鍒嗗彿寮曠敤鏍峰紡鐨勫唴瀹广
    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd9298e30036', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0038', 'WXNRQ', '
    鍏憡

    鏈儗鏅彲浠ユ崲鑹插摝~


    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd931a120037', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0039', 'WXNRQ', '

    璇疯緭鍏ュ唴瀹瑰唴瀹广

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd93dd0b0038', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0040', 'WXNRQ', '

    璇疯緭鍏ュ唴瀹瑰唴瀹广

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd94e0ca0039', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0041', 'WXNRQ', '


    闆姳鍔ㄦ佽儗鏅牱寮忥紝璇疯緭鍏ユ枃瀛

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd958d02003a', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0042', 'WXNRQ', '
    寰俊缂栬緫鍣

    绉掑埛锛屾渶鏄撶敤鐨勫浘鏂囨帓鐗堝伐鍏

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd95fef4003b', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0043', 'WXNRQ', '
    鏍囬

    鍐呭鎻忚堪

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd9688c7003c', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0044', 'WXNRQ', '

    绉掑埛

    閫夋嫨闇瑕佸簲鐢ㄦ牱寮忕殑鏂囧瓧锛岀劧鍚庨夋嫨瑕佷娇鐢ㄧ殑鏍峰紡锛屽嵆鍙疄鐜扮鍒锋晥鏋溿傜鍒锋敮鎸佹墍鏈夋牱寮忥紝濡傛湁浣跨敤閬囧埌闂锛屾杩庡姞鍏Q缇390183835锛屽皢闂鍙嶉缁欐垜浠

    鍥炶溅浣夸笅娌夊崰涓よ鐨勬枃瀛楃嫭鑷负涓涓钀斤紝鐒跺悗鍐嶄娇鐢ㄧ鍒枫傚缓璁笅娌夌殑涓轰竴涓垨鑰2涓枃瀛楋紝涓嶈澶氫簡銆

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd97145a003d', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0045', 'WXNRQ', '
    Wwei Wwei 

    Wwei.cn骞冲彴鏄竴涓簰鑱旂綉杩愯惀骞冲彴锛屼负杩愯惀鑰呮彁渚涘浘鏂囩紪杈戝伐鍏凤紝杩愯惀缁忛獙锛屾敹褰曞叕浼楀彿锛屽畾鍒跺紑鍙戝井缃戠珯绛夋湇鍔★紝璁╄繍钀ユ洿杞绘澗楂樻晥銆

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd97b2e0003e', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0046', 'WXNRQ', '
    Tips

    鎴戞槸鍥剧墖涓嶈兘鎹㈣壊鍝

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbd983e95003f', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍐呭0047', 'WXNRQ', '

    寰俊缂栬緫鍣

    鐢熻屾帓鐗

    涓轰綘鑰岀編

    绉掑埛

    涓閿帓鐗

    鐝嶆儨鐢熷懡


    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda3444c0040', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0001', 'WXTP', '\r\n '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda458ca0041', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0002', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda4be320042', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0003', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda5228c0043', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0004', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda5b7cc0044', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0005', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda62cf70045', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0006', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda67cc30046', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0007', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda6be240047', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0008', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda721ea0048', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0009', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda768e00049', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0010', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda7bd01004a', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0011', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda81cdd004b', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0012', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda86fce004c', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0013', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda8f661004d', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0014', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbda9bcb2004e', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0015', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdaa18c1004f', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0016', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdaa75f70050', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0017', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdaad1690051', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0018', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdab3b3f0052', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0019', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb012e00053', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍥剧墖0020', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb0a9ea0054', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0021', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb0f0820055', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0022', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb13dbb0056', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0023', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb183e60057', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0024', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb1c6d10058', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0025', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb241f10059', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍥剧墖0026', 'WXTP', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb5eb0d005a', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0004', 'WXGZYD', '
    鐐瑰嚮涓嬫柟鈥滈槄璇诲師鏂団鏌ョ湅鏇村
    鈫撯啌鈫
    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb6a806005b', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0005', 'WXGZYD', '
    鐐瑰嚮涓嬫柟鈥滈槄璇诲師鏂団鏌ョ湅鏇村
    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb71627005c', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0006', 'WXGZYD', '

    闃呰鏈枃鐢ㄤ簡锛绉掞紝杞彂鍙渶1绉

    杞浇鏄竴绉嶆櫤鎱鍒嗕韩鏄竴绉嶇編寰封潃

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb79d16005d', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0007', 'WXGZYD', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb82de6005e', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0008', 'WXGZYD', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb89e3b005f', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0009', 'WXGZYD', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb92c4d0060', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0010', 'WXGZYD', '

    鐐瑰嚮鏍囬涓嬨岃摑鑹插井淇″悕銆嶅彲蹇熷叧娉

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdb9a1750061', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍏虫敞寮曞0011', 'WXGZYD', '

    鍏虫敞涓涓嬪張涓嶄細鎬瀛曪紒

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdbaa1b30062', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0012', 'WXGZYD', '

    鐐瑰嚮鈥滈槄璇诲叏鏂団濓紝浜嗚В璇︽儏

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdbb88240063', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍏虫敞寮曞0013', 'WXGZYD', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdbc61f70064', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0014', 'WXGZYD', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdbcd8eb0065', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍏虫敞寮曞0015', 'WXGZYD', '
    骞垮窞鏁欏笀寰俊
    寰俊鍙凤細骞垮窞鏁欏笀(鈫愰暱鎸夊鍒)

    鍏ㄥ姏鎵撻犳澀鍩庡井淇¤惀閿绗竴鍝佺墝

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdbe50db0066', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0016', 'WXGZYD', '
    濡備綍鍏虫敞

    鈶犲鍒垛滃井淇″彿鎴朓D鈥濓紝鍦ㄢ滄坊鍔犳湅鍙嬧濅腑绮樿创鎼滅储鍙风爜鍏虫敞銆

    鈶$偣鍑诲井淇″彸涓婅鐨勨+鈥濓紝浼氬嚭鐜扳滄坊鍔犳湅鍙嬧濓紝杩涘叆鈥滄煡鎵惧叕浼楀彿鈥濓紝杈撳叆浠ヤ笅鍏紬鍙风殑鍚嶅瓧锛屽嵆鍙壘鍒般

    '); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdbe9b710067', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0017', 'WXGZYD', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdbef6710068', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0018', 'WXGZYD', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdbf58560069', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0019', 'WXGZYD', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdbfb636006a', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0020', 'WXGZYD', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdc01c75006b', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0021', 'WXGZYD', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdc085a3006c', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0022', 'WXGZYD', ''); +INSERT INTO `weixin_template` VALUES ('402880cd4dbd534c014dbdc14efc006d', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', null, null, null, '鍏虫敞寮曞0023', 'WXGZYD', ''); +INSERT INTO `weixin_template` VALUES ('8af235d44db84b91014db84b91e10000', '绠$悊鍛', 'admin', '2015-06-03 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍏虫敞寮曞0001', 'WXGZYD', '
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n 鐐瑰嚮銆绠ご鎵鎸囧銆嶅彲蹇熷叧娉\r\n
    \r\n
    \r\n 寰俊鍙凤細XXXXXXXXX\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n
    \r\n

    \r\n

    \r\n
    \r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n
    \r\n

    \r\n

    \r\n
    \r\n

    '); +INSERT INTO `weixin_template` VALUES ('8af235d44db84b91014db84c5aed0001', '绠$悊鍛', 'admin', '2015-06-03 00:00:00', '绠$悊鍛', 'admin', '2015-06-04 00:00:00', '鍐呭0001', 'WXNRQ', '

    娆㈣繋浣跨敤鎺ㄥ疂寰俊缂栬緫鍣紒


    \r\n'); diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..cf177c82 --- /dev/null +++ b/pom.xml @@ -0,0 +1,897 @@ + + 4.0.0 + org.jeecgframework + jeecg + 3.5.2 + war + + UTF-8 + 3.4.6 + 1.5.0 + + + 3.1.1.RELEASE + 4.1.0.Final + 4.0.2.Final + 1.0.1.Final + + + 5.11 + 3.1.1 + + + 2.2 + 1.6.9 + 3.3.7 + 3.15.0-GA + 1.6.5 + + + 1.1.1 + + + + 1.8.4 + + 1.84 + 2.1 + 1.2.6 + 2.2.4 + + 1.6.1 + 1.6.1 + 1.2.16 + 0.5.4 + 1.7.0 + 3.2.1 + 1.2 + 1.3 + 2.0 + 1.3.2 + 1.2.1 + 2.6 + 3.1 + 1.2 + 1.0.4 + 1.1 + 1.3.1 + 2.4.3 + 2.3.19 + 4.2.0.Final + 3.9 + 3.3 + 3.2.1 + 3.0-beta-4 + + 2.1.6 + + + 0.9.1 + 1.6 + 1.4 + 0.2.9 + 5.1.27 + + 1.0.0 + + 10.2.0.5.0 + + 1.2.4 + 1.3.170 + 9.1-903.jdbc4 + + + 4.7 + + + + + + + + + + 2.4 + + 0.4.6 + 2.5.0 + 1.6.2 + 1.1.1 + 1.0 + 1.4.4 + 2.3.3 + + 2.1.1 + + + + + central + Central Repository + http://repo.maven.apache.org/maven2 + + false + + + + spy + Spy Repository + http://files.couchbase.com/maven2/ + + false + + + + xerces + xerces + https://xerces.apache.org/xerces2-j/ + + false + + + + proxool + proxool + http://proxool.cvs.sourceforge.net/viewvc/proxool/ + + false + + + + oschinaMavenThirdparty + oschinaMavenThirdparty + http://maven.oschina.net/content/repositories/thirdparty/ + + false + + + + + + + + + javax.activation + activation + ${activation.version} + + + + aopalliance + aopalliance + ${aopalliance.version} + + + + + org.jeecgframework + codegenerate + ${codegenerate.version} + + + org.jeecgframework + minidao + ${minidao.version} + + + + com.ckfinder + CKFinder-updateByAlexander + ${CKFinder.version} + + + com.ckfinder + CKFinderPlugin-FileEditor + ${CKFinder.version} + + + com.ckfinder + CKFinderPlugin-ImageResize + ${CKFinder.version} + + + com.ckfinder + CKFinderPlugin-Watermark + ${CKFinder.version} + + + + + net.coobird + thumbnailator + ${thumbnailator.version} + + + org.jboss + jboss-vfs + 3.1.0.Final + + + + pinyin4j + pinyin4j + ${pinyin4j.version} + + + + com.springsource + org.quartz + ${org.quartz.version} + + + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + + org.springframework + spring-expression + ${spring.version} + + + org.springframework + spring-aspects + ${spring.version} + + + org.springframework + spring-context-support + ${spring.version} + + + + + + org.hibernate + hibernate-core + + 4.2.3.Final + + + org.hibernate + hibernate-ehcache + ${hibernate.version} + + + org.hibernate + hibernate-proxool + ${hibernate.version} + + + org.hibernate.common + hibernate-commons-annotations + ${hibernate-common-annotations.version} + + + org.hibernate.javax.persistence + hibernate-jpa-2.0-api + ${hibernate-jpa.version} + + + + + org.antlr + antlr + ${antlr.version} + + + + org.springframework + spring-orm + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + + + + + org.mybatis + mybatis + ${mybatis.version} + + + org.mybatis + mybatis-spring + ${mybatis-spring.version} + + + + + + + com.cloudhopper.proxool + proxool + ${proxool.version} + + + + geronimo-spec-javamail + geronimo-spec + + + avalon-framework-api + avalon-framework + + + + + com.cloudhopper.proxool + proxool-cglib + ${proxool.version} + + + + commons-pool + commons-pool + ${commons-pool.version} + runtime + + + commons-dbcp + commons-dbcp + ${commons-dbcp.version} + compile + + + com.alibaba + druid + ${druid.version} + runtime + + + + mysql + mysql-connector-java + ${mysql.version} + runtime + + + org.jeecgframework + jdbc2005 + ${sqlserver.version} + runtime + + + com.oracle + ojdbc14 + ${ojdbc14.version} + + + + net.sourceforge.jtds + jtds + ${jtds.version} + runtime + + + + com.h2database + h2 + ${h2.version} + test + + + + org.jeecgframework + postgresql + ${postgresql.version} + + + + + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + + + javax.servlet + servlet-api + 2.5 + provided + + + javax.servlet + jsp-api + 2.0 + provided + + + javax.servlet + jstl + 1.2 + + + + + + cglib + cglib-nodep + ${cglib.version} + + + org.aspectj + aspectjrt + ${aspectj.version} + + + org.aspectj + aspectjweaver + ${aspectj.version} + runtime + + + org.jodd + jodd + ${jodd.version} + + + org.javassist + javassist + ${javassist.version} + + + ant + ant + ${ant.version} + + + + + + + org.codehaus.jackson + jackson-mapper-asl + ${jackson.version} + + + org.codehaus.jackson + jackson-core-asl + ${jackson.version} + + + net.sf.json-lib + json-lib + ${json-lib.version} + jdk15 + + + com.alibaba + fastjson + ${fastjson-lib.version} + + + com.google.code.gson + gson + ${gson.version} + + + + + dom4j + dom4j + ${dom4j.version} + + + xml-apis + xml-apis + + + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + + + + log4j + log4j + ${log4j.version} + + + + com.fasterxml + classmate + ${classmate.version} + + + + + commons-beanutils + commons-beanutils + ${commons-beanutils.version} + + + commons-logging + commons-logging + + + + + + commons-collections + commons-collections + ${commons-collections.version} + + + + commons-chain + commons-chain + ${commons-chain.version} + + + + commons-codec + commons-codec + ${commons-codec.version} + + + + commons-digester + commons-digester + ${commons-digester.version} + + + + commons-io + commons-io + ${commons-io.version} + + + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + + + + commons-lang + commons-lang + ${commons-lang.version} + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.apache.commons + commons-email + ${commons-email.version} + + + + commons-logging + commons-logging + ${commons-logging.version} + + + commons-logging + commons-logging-api + ${commons-logging-api.version} + + + + commons-validator + commons-validator + ${commons-validator.version} + + + + net.sf.ehcache + ehcache-core + ${ehcache.version} + + + + org.freemarker + freemarker + ${freemarker.version} + + + + org.hibernate + hibernate-validator + ${hibernate-validator.version} + + + org.hibernate + hibernate-validator-annotation-processor + ${hibernate-validator.version} + + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi.version} + + + org.apache.poi + poi-ooxml-schemas + ${poi.version} + + + org.apache.poi + poi-scratchpad + ${poi.version} + + + org.jeecgframework + easypoi-base + ${easypoi.version} + + + org.jeecgframework + easypoi-web + ${easypoi.version} + + + org.jeecgframework + easypoi-annotation + ${easypoi.version} + + + + + org.openoffice + juh + ${openoffice.version} + + + org.openoffice + unoil + ${openoffice.version} + + + org.openoffice + jurt + ${openoffice.version} + + + + org.artofsolving + jodconverter + ${jodconverter.version} + + + + com.opensymphony + xwork-core + ${xwork-core.version} + + + + + + junit + junit + ${junit.version} + + + + + + + org.springframework + spring-test + ${spring.version} + test + + + + org.jeecg + jacob + 1.0.0 + + + + org.jeecgframework + batik-all + 1.6 + + + org.jeecgframework + fop + 1.0 + + + xerces + xercesImpl + 2.7.1 + + + xml-apis + xml-apis-ext + 1.3.04 + + + xml-apis + xml-apis + 1.3.04 + + + org.apache.xmlgraphics + xmlgraphics-commons + 1.4 + + + xalan + xalan + 2.7.0 + + + + com.thoughtworks.xstream + xstream + ${xstream.version} + + + + org.codehaus.groovy + groovy + ${groovy.version} + + + + commons-httpclient + commons-httpclient + 3.0.1 + + + + org.apache.geronimo.specs + geronimo-javamail_1.4_spec + 1.6 + + + + com.baidu.ueditor + ueditor + 1.1.1 + system + ${basedir}/src/main/webapp/WEB-INF/lib/ueditor-1.1.1.jar + + + com.baidu.ueditor + json + 1.0 + system + ${basedir}/src/main/webapp/WEB-INF/lib/json.jar + + + + + JEECG寰簯寮鍙戝钩鍙 + www.jeecg.org + + + + + org.codehaus.mojo + tomcat-maven-plugin + 1.1 + + /jeecg + 8080 + UTF-8 + http://localhost:8080/manager/html + tomcat6 + + + + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + UTF-8 + + + + jeecg + + + src/main/java + + **/*.xml + **/*.sql + **/*.ftl + + false + + + src/main/resources + + + + + + src/test/java + + **/*.xml + **/*.sql + **/*.ftl + + false + + + src/test/resources + + + + + \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/annotation/Ehcache.java b/src/main/java/org/jeecgframework/core/annotation/Ehcache.java new file mode 100644 index 00000000..6f389dfc --- /dev/null +++ b/src/main/java/org/jeecgframework/core/annotation/Ehcache.java @@ -0,0 +1,26 @@ +package org.jeecgframework.core.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * @author 寮犱唬娴 + * + */ +@Retention(RetentionPolicy.RUNTIME) +@Target( { ElementType.METHOD }) +@Documented +public @interface Ehcache { + // 缂撳瓨鍚嶇О,榛樿涓虹┖ + String cacheName() default ""; + + // 澧炲姞缂撳瓨杩樻槸鍒犻櫎缂撳瓨锛岄粯璁や负澧炲姞缂撳瓨 + boolean addOrdel() default true; + + //涓存椂缂撳瓨杩樻槸姘镐箙缂撳瓨锛岄粯璁や负姘镐箙缂撳瓨 + boolean eternal() default true; +} diff --git a/src/main/java/org/jeecgframework/core/annotation/JeecgEntityTitle.java b/src/main/java/org/jeecgframework/core/annotation/JeecgEntityTitle.java new file mode 100644 index 00000000..fe165674 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/annotation/JeecgEntityTitle.java @@ -0,0 +1,14 @@ +package org.jeecgframework.core.annotation; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * + * @author 寮犱唬娴 + * + */ +@Retention(RetentionPolicy.RUNTIME) +public @interface JeecgEntityTitle { + String name(); +} diff --git a/src/main/java/org/jeecgframework/core/annotation/config/AutoMenu.java b/src/main/java/org/jeecgframework/core/annotation/config/AutoMenu.java new file mode 100644 index 00000000..0714f065 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/annotation/config/AutoMenu.java @@ -0,0 +1,46 @@ +package org.jeecgframework.core.annotation.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +/** + * 鑿滃崟娉ㄩ噴鏍囩 + * 绯荤粺鍚姩鑷姩鍔犺浇鑿滃崟閰嶇疆 + * Class绾у埆 + * @author 寮犱唬娴 + */ +public @interface AutoMenu { + + /** + * 鑿滃崟鍚嶇О + * @return + */ + public String name(); + /** + * 绛夌骇 + * @return + */ + public String level() default "0"; + /** + * 鑿滃崟鍦板潃 + * @return + */ + public String url(); + + /** + * 鍥炬爣 + * @return + */ + public String icon() default "402880e740ec1fd70140ec2064ec0002"; + /** + * 椤哄簭 + * @return + */ + public int order() default 0; +} + + diff --git a/src/main/java/org/jeecgframework/core/annotation/config/AutoMenuOperation.java b/src/main/java/org/jeecgframework/core/annotation/config/AutoMenuOperation.java new file mode 100644 index 00000000..ffd928ae --- /dev/null +++ b/src/main/java/org/jeecgframework/core/annotation/config/AutoMenuOperation.java @@ -0,0 +1,46 @@ +package org.jeecgframework.core.annotation.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +/** + * 鑿滃崟鎿嶄綔鎸夐挳娉ㄩ噴鏍囩 + * 绯荤粺鍚姩鑷姩鍔犺浇鑿滃崟瀵瑰簲鐨勬搷浣滄潈闄 + * Method绾у埆 + * @author 寮犱唬娴 + */ +public @interface AutoMenuOperation { + + /** + * 鎿嶄綔鍚嶇О + * @return + */ + public String name(); + /** + * 鎿嶄綔鐮 + * @return + */ + public String code(); + + /** + * 鎿嶄綔鐮佺被鍨 + * @return + */ + public MenuCodeType codeType() default MenuCodeType.TAG; + + /** + * 鍥炬爣 + * @return + */ + public String icon() default ""; + /** + * 鐘舵 + * @return + */ + public int status() default 0; +} + diff --git a/src/main/java/org/jeecgframework/core/annotation/config/MenuCodeType.java b/src/main/java/org/jeecgframework/core/annotation/config/MenuCodeType.java new file mode 100644 index 00000000..44c50a72 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/annotation/config/MenuCodeType.java @@ -0,0 +1,12 @@ +package org.jeecgframework.core.annotation.config; + +/** + * + * @author 寮犱唬娴 + * + */ +public enum MenuCodeType { + TAG, //閲囩敤Jeecg tag鏍囩 + ID, //閲囩敤鎺т欢ID鏂瑰紡 + CSS //閲囩敤Css鏍峰紡鏂瑰紡 +} diff --git a/src/main/java/org/jeecgframework/core/annotation/query/QueryTimeFormat.java b/src/main/java/org/jeecgframework/core/annotation/query/QueryTimeFormat.java new file mode 100644 index 00000000..38908763 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/annotation/query/QueryTimeFormat.java @@ -0,0 +1,19 @@ +package org.jeecgframework.core.annotation.query; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 鍓嶅彴鐨勬煡璇㈡椂闂寸┖闂寸殑鏍煎紡 + * @author JueYue + * @date 2014骞1鏈17鏃 + * @version 1.0 + */ +@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface QueryTimeFormat { + + public String format(); + +} diff --git a/src/main/java/org/jeecgframework/core/aop/EhcacheAspect.java b/src/main/java/org/jeecgframework/core/aop/EhcacheAspect.java new file mode 100644 index 00000000..8d57e2f8 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/aop/EhcacheAspect.java @@ -0,0 +1,119 @@ +package org.jeecgframework.core.aop; + +import java.io.Serializable; +import java.lang.reflect.Method; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.CacheManager; +import net.sf.ehcache.Element; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.jeecgframework.core.annotation.Ehcache; +import org.springframework.stereotype.Component; + +import com.alibaba.fastjson.JSON; + +/** + * + * @author 寮犱唬娴 + * + */ +@Component +@Aspect +public class EhcacheAspect { + private static Cache dictCache; + private static Cache eternalCache; + + static { + if (eternalCache == null) { + eternalCache = CacheManager.getInstance().getCache("eternalCache"); + } + if (dictCache == null) { + dictCache = CacheManager.getInstance().getCache("dictCache"); + } + } + + @Pointcut("@annotation(org.jeecgframework.core.annotation.Ehcache)") + public void simplePointcut() { + } + + @AfterReturning(pointcut = "simplePointcut()") + public void simpleAdvice() { + } + + @Around("simplePointcut()") + public Object aroundLogCalls(ProceedingJoinPoint joinPoint) + throws Throwable { + String targetName = joinPoint.getTarget().getClass().toString(); + String methodName = joinPoint.getSignature().getName(); + Object[] arguments = joinPoint.getArgs(); + + //璇曞浘寰楀埌鏍囨敞鐨凟hcache绫 + @SuppressWarnings("unused") + Method[] methods = joinPoint.getTarget().getClass().getMethods(); + Ehcache flag = null; + for(Method m:methods){ + if(m.getName().equals(methodName)){ + Class[] tmpCs = m.getParameterTypes(); + if(tmpCs.length==arguments.length){ + flag = m.getAnnotation(Ehcache.class); + break; + } + } + } + if(flag==null){ + return null; + } + //Ehcache flag =joinPoint.getTarget().getClass().getMethod(methodName).getAnnotation(Ehcache.class); + Object result; + String cacheKey = getCacheKey(targetName, methodName, arguments); + + Element element = null; + if(flag.eternal()){ + //姘镐箙缂撳瓨 + element = dictCache.get(cacheKey); + }else{ + //涓存椂缂撳瓨 + element = eternalCache.get(cacheKey); + } + + + if (element == null) { + if ((arguments != null) && (arguments.length != 0)) { + result = joinPoint.proceed(arguments); + } else { + result = joinPoint.proceed(); + } + + element = new Element(cacheKey, (Serializable) result); + if(flag.eternal()){ + //姘镐箙缂撳瓨 + dictCache.put(element); + }else{ + //涓存椂缂撳瓨 + eternalCache.put(element); + } + } + return element.getValue(); + } + + /** + * 鑾峰緱cache key鐨勬柟娉曪紝cache key鏄疌ache涓竴涓狤lement鐨勫敮涓鏍囪瘑 cache key鍖呮嫭 + * 鍖呭悕+绫诲悕+鏂规硶鍚嶏紝濡俢om.co.cache.service.UserServiceImpl.getAllUser + */ + private String getCacheKey(String targetName, String methodName, + Object[] arguments) { + StringBuffer sb = new StringBuffer(); + sb.append(targetName).append(".").append(methodName); + if ((arguments != null) && (arguments.length != 0)) { + for (int i = 0; i < arguments.length; i++) { + sb.append(".").append(JSON.toJSONString(arguments[i])); + } + } + return sb.toString(); + } +} diff --git a/src/main/java/org/jeecgframework/core/aop/GZipFilter.java b/src/main/java/org/jeecgframework/core/aop/GZipFilter.java new file mode 100644 index 00000000..c0e036d2 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/aop/GZipFilter.java @@ -0,0 +1,127 @@ +package org.jeecgframework.core.aop; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.zip.GZIPOutputStream; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +/** + * JS缂撳瓨鍘嬬缉 + * JEECG寮婧愮ぞ鍖 + * 璁哄潧锛歸ww.jeecg.org + * @author 寮犱唬娴 + */ +public class GZipFilter implements Filter { + + + public void destroy() { + } + /** + * 鍒ゆ柇娴忚鍣ㄦ槸鍚︽敮鎸丟ZIP + * @param request + * @return + */ + private static boolean isGZipEncoding(HttpServletRequest request){ + boolean flag=false; + String encoding=request.getHeader("Accept-Encoding"); + if(encoding!=null&&encoding.indexOf("gzip")!=-1){ + flag=true; + } + return flag; + } + + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + HttpServletResponse resp = (HttpServletResponse) response; + HttpServletRequest req=(HttpServletRequest)request; + if(isGZipEncoding(req)){ + Wrapper wrapper = new Wrapper(resp); + chain.doFilter(request, wrapper); + byte[] gzipData = gzip(wrapper.getResponseData()); + resp.addHeader("Content-Encoding", "gzip"); + resp.setContentLength(gzipData.length); + //闈欐佽祫婧愭枃浠剁紦瀛樻満鍒 + //CacheResource(request, response, chain); + ServletOutputStream output = response.getOutputStream(); + output.write(gzipData); + output.flush(); + } else { + chain.doFilter(request, response); + } + + } + + public void init(FilterConfig filterConfig) throws ServletException {} + + /** + * 鎻愰珮绯荤粺璁块棶鎬ц兘锛屼富閿紦瀛 + */ + public void CacheResource(ServletRequest request, ServletResponse response, + FilterChain chain){ + //1.寮鸿浆httpservlet锛屾柟渚胯皟鐢ㄦ柟娉 + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse res = (HttpServletResponse) response; + //2.鑾峰彇璧勬簮鏂囦欢鍚嶇殑URI + String uri = req.getRequestURI(); + //3.鑾峰緱鏂囦欢鎵╁睍鍚,lastIndexOf(".")+1 鑾峰緱.鏈鍚庝竴娆″嚭鐜扮殑绱㈠紩鐨勫悗涓浣嶏細jpg + uri = uri.substring(uri.lastIndexOf(".")+1); + System.out.println( uri );//娴嬭瘯鑾峰彇鍚庣紑鏄惁姝g‘ + //4鏂浉搴斿悗缂鏂囦欢锛岃瀹氱紦瀛樻椂闂 + long date = 0; + //System.out.println( new Date().getTime());//娴嬭瘯褰撳墠鏃堕棿鐢 + + //鍒ゆ柇URI鑾峰彇鐨勫悗缂鍚嶆槸鍚︿笌JPG鐩哥瓑锛屼笉鑰冭檻澶у皬鍐 + if(uri.equalsIgnoreCase("jpg")){ + //璇诲彇XML閲岀殑JPG閰嶇疆鐨勫弬鏁帮紝杩欓噷璁惧畾浜嗘椂闂 + //鑾峰彇褰撳墠绯荤粺鏃堕棿 + 闇瑕佺紦瀛樼殑鏃堕棿(灏忔椂),Long 闃叉婧㈠嚭锛屽洜涓哄崟浣嶆槸姣 + date = System.currentTimeMillis()+5*60*60*1000; + } + + if(uri.equalsIgnoreCase("gif")){ + //璇诲彇XML閲岀殑JPG閰嶇疆鐨勫弬鏁帮紝杩欓噷璁惧畾浜嗘椂闂 + //鑾峰彇褰撳墠绯荤粺鏃堕棿 + 闇瑕佺紦瀛樼殑鏃堕棿(灏忔椂),Long 闃叉婧㈠嚭锛屽洜涓哄崟浣嶆槸姣 + date = System.currentTimeMillis()+5*60*60*1000; + } + + if(uri.equalsIgnoreCase("css")){ + //璇诲彇XML閲岀殑JPG閰嶇疆鐨勫弬鏁帮紝杩欓噷璁惧畾浜嗘椂闂 + //鑾峰彇褰撳墠绯荤粺鏃堕棿 + 闇瑕佺紦瀛樼殑鏃堕棿(灏忔椂),Long 闃叉婧㈠嚭锛屽洜涓哄崟浣嶆槸姣 + date = System.currentTimeMillis()+5*60*60*1000; + } + + if(uri.equalsIgnoreCase("js")){ + //璇诲彇XML閲岀殑JPG閰嶇疆鐨勫弬鏁帮紝杩欓噷璁惧畾浜嗘椂闂 + //鑾峰彇褰撳墠绯荤粺鏃堕棿 + 闇瑕佺紦瀛樼殑鏃堕棿(灏忔椂),Long 闃叉婧㈠嚭锛屽洜涓哄崟浣嶆槸姣 + date = System.currentTimeMillis()+5*60*60*1000; + } + //璁剧疆缂撳瓨鏃堕棿 + res.setDateHeader("Expires", date); + } + + private byte[] gzip(byte[] data) { + ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(10240); + GZIPOutputStream output = null; + try { + output = new GZIPOutputStream(byteOutput); + output.write(data); + } catch (IOException e) { + } finally { + try { + output.close(); + } catch (IOException e) { + } + } + return byteOutput.toByteArray(); + } + +} diff --git a/src/main/java/org/jeecgframework/core/aop/HiberAspect.java b/src/main/java/org/jeecgframework/core/aop/HiberAspect.java new file mode 100644 index 00000000..ff572c01 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/aop/HiberAspect.java @@ -0,0 +1,145 @@ +package org.jeecgframework.core.aop; + +import org.apache.log4j.Logger; +import org.hibernate.EmptyInterceptor; +import org.hibernate.type.Type; +import org.jeecgframework.core.constant.DataBaseConstant; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.web.system.pojo.base.TSUser; +import org.springframework.stereotype.Component; + +import java.io.Serializable; +import java.util.Date; + +/** + * Hiberate鎷︽埅鍣細瀹炵幇鍒涘缓浜猴紝鍒涘缓鏃堕棿锛屽垱寤轰汉鍚嶇О鑷姩娉ㄥ叆; + * 淇敼浜,淇敼鏃堕棿,淇敼浜哄悕鑷姩娉ㄥ叆; + * @author 寮犱唬娴 + */ +@Component +public class HiberAspect extends EmptyInterceptor { + private static final Logger logger = Logger.getLogger(HiberAspect.class); + private static final long serialVersionUID = 1L; + + + +public boolean onSave(Object entity, Serializable id, Object[] state, + String[] propertyNames, Type[] types) { + TSUser currentUser = null; + try { + currentUser = ResourceUtil.getSessionUserName(); + } catch (RuntimeException e) { + logger.warn("褰撳墠session涓虹┖,鏃犳硶鑾峰彇鐢ㄦ埛"); + } + if(currentUser==null){ + return true; + } + try { + //娣诲姞鏁版嵁 + for (int index=0;index, String鍐呭涓簃essage + * 2.List, String鍐呭涓簆ropertyPath + separator + message + * 3.Map + */ +public class BeanValidators { + + /** + * 璋冪敤JSR303鐨剉alidate鏂规硶, 楠岃瘉澶辫触鏃舵姏鍑篊onstraintViolationException. + */ + public static void validateWithException(Validator validator, + Object object, Class... groups) + throws ConstraintViolationException { + Set constraintViolations = validator.validate(object, groups); + if (!constraintViolations.isEmpty()) { + throw new ConstraintViolationException(constraintViolations); + } + } + + /** + * 杈呭姪鏂规硶, + * 杞崲ConstraintViolationException涓殑Set涓负List. + */ + public static List extractMessage(ConstraintViolationException e) { + return extractMessage(e.getConstraintViolations()); + } + + /** + * 杈呭姪鏂规硶, 杞崲Set涓篖ist + */ + public static List extractMessage( + Set constraintViolations) { + List errorMessages = new ArrayList(); + for (ConstraintViolation violation : constraintViolations) { + errorMessages.add(violation.getMessage()); + } + return errorMessages; + } + + /** + * 杈呭姪鏂规硶, + * 杞崲ConstraintViolationException涓殑Set涓篗ap. + */ + public static Map extractPropertyAndMessage( + ConstraintViolationException e) { + return extractPropertyAndMessage(e.getConstraintViolations()); + } + + /** + * 杈呭姪鏂规硶, 杞崲Set涓篗ap. + */ + public static Map extractPropertyAndMessage( + Set constraintViolations) { + Map errorMessages = new HashMap(); + for (ConstraintViolation violation : constraintViolations) { + errorMessages.put(violation.getPropertyPath().toString(), + violation.getMessage()); + } + return errorMessages; + } + + /** + * 杈呭姪鏂规硶, 杞崲ConstraintViolationException涓殑Set涓篖ist< + * propertyPath message>. + */ + public static List extractPropertyAndMessageAsList( + ConstraintViolationException e) { + return extractPropertyAndMessageAsList(e.getConstraintViolations(), " "); + } + + /** + * 杈呭姪鏂规硶, 杞崲Set涓篖ist. + */ + public static List extractPropertyAndMessageAsList( + Set constraintViolations) { + return extractPropertyAndMessageAsList(constraintViolations, " "); + } + + /** + * 杈呭姪鏂规硶, 杞崲ConstraintViolationException涓殑Set涓篖ist< + * propertyPath +separator+ message>. + */ + public static List extractPropertyAndMessageAsList( + ConstraintViolationException e, String separator) { + return extractPropertyAndMessageAsList(e.getConstraintViolations(), + separator); + } + + /** + * 杈呭姪鏂规硶, 杞崲Set涓篖ist. + */ + public static List extractPropertyAndMessageAsList( + Set constraintViolations, + String separator) { + List errorMessages = new ArrayList(); + for (ConstraintViolation violation : constraintViolations) { + errorMessages.add(violation.getPropertyPath() + separator + + violation.getMessage()); + } + return errorMessages; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/controller/BaseController.java b/src/main/java/org/jeecgframework/core/common/controller/BaseController.java new file mode 100644 index 00000000..738d9d69 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/controller/BaseController.java @@ -0,0 +1,110 @@ +package org.jeecgframework.core.common.controller; + +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Projections; +import org.jeecgframework.core.common.service.CommonService; +import org.jeecgframework.core.interceptors.DateConvertEditor; +import org.springframework.stereotype.Controller; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.ServletRequestDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + * 鍩虹鎺у埗鍣紝鍏朵粬鎺у埗鍣ㄩ渶闆嗘垚姝ゆ帶鍒跺櫒鑾峰緱initBinder鑷姩杞崲鐨勫姛鑳 + * @author 寮犱唬娴 + * + */ +@Controller +@RequestMapping("/baseController") +public class BaseController { + + /** + * 灏嗗墠鍙颁紶閫掕繃鏉ョ殑鏃ユ湡鏍煎紡鐨勫瓧绗︿覆锛岃嚜鍔ㄨ浆鍖栦负Date绫诲瀷 + * + * @param binder + */ + @InitBinder + public void initBinder(ServletRequestDataBinder binder) { +// SimpleDateFormat dateFormat = new SimpleDateFormat( +// "yyyy-MM-dd hh:mm:ss"); +// binder.registerCustomEditor(Date.class, new CustomDateEditor( +// dateFormat, true)); + binder.registerCustomEditor(Date.class, new DateConvertEditor()); + } + + /** + * 鍒嗛〉鍏叡鏂规硶(闈瀍asyui) + * + * @author Alexander + * @date 20131022 + */ + public List pageBaseMethod(HttpServletRequest request, + DetachedCriteria dc, CommonService commonService, int pageRow) { + // 褰撳墠椤 + // 鎬绘潯鏁 + // 鎬婚〉鏁 + + int currentPage = 1; + + int totalRow = 0; + int totalPage = 0; + // 鑾峰彇褰撳墠椤 + String str_currentPage = request.getParameter("str_currentPage"); + currentPage = str_currentPage == null || "".equals(str_currentPage) ? 1 + : Integer.parseInt(str_currentPage); + // 鑾峰彇姣忛〉鐨勬潯鏁 + String str_pageRow = request.getParameter("str_pageRow"); + pageRow = str_pageRow == null || "".equals(str_pageRow) ? pageRow + : Integer.parseInt(str_pageRow); + + // 缁熻鐨勬昏鏁 + dc.setProjection(Projections.rowCount()); + + totalRow = Integer.parseInt(commonService.findByDetached(dc).get(0) + .toString()); + totalPage = (totalRow + pageRow - 1) / pageRow; + + currentPage = currentPage < 1 ? 1 : currentPage; + currentPage = currentPage > totalPage ? totalPage : currentPage; + // 娓呯┖缁熻鍑芥暟 + dc.setProjection(null); + // dc.setResultTransformer(dc.DISTINCT_ROOT_ENTITY); + List list = commonService.pageList(dc, (currentPage - 1) * pageRow, + pageRow); + + request.setAttribute("currentPage", currentPage); + request.setAttribute("pageRow", pageRow); + request.setAttribute("totalRow", totalRow); + request.setAttribute("totalPage", totalPage); + return list; + } + + /** + * 鎶藉彇鐢遍楀彿鍒嗛殧鐨勪富閿垪琛 + * + * @param ids + * 鐢遍楀彿鍒嗛殧鐨勫涓富閿 + * @return 涓婚敭绫昏〃 + * @author 寮犲浗鏄 2014-8-21 21:57:16 + */ + protected List extractIdListByComma(String ids) { + List result = new ArrayList(); + if (StringUtils.hasText(ids)) { + for (String id : ids.split(",")) { + if (StringUtils.hasLength(id)) { + result.add(id.trim()); + } + } + } + + return result; + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/dao/ICommonDao.java b/src/main/java/org/jeecgframework/core/common/dao/ICommonDao.java new file mode 100644 index 00000000..a948e1b8 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/dao/ICommonDao.java @@ -0,0 +1,70 @@ +package org.jeecgframework.core.common.dao; + + +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.pojo.base.TSUser; + +import org.jeecgframework.core.common.model.common.UploadFile; +import org.jeecgframework.core.common.model.json.ComboTree; +import org.jeecgframework.core.common.model.json.ImportFile; +import org.jeecgframework.core.common.model.json.TreeGrid; +import org.jeecgframework.core.extend.template.Template; +import org.jeecgframework.tag.vo.easyui.ComboTreeModel; +import org.jeecgframework.tag.vo.easyui.TreeGridModel; + +public interface ICommonDao extends IGenericBaseCommonDao{ + + + /** + * admin璐︽埛瀵嗙爜鍒濆鍖 + * @param user + */ + public void pwdInit(TSUser user,String newPwd); + /** + * 妫鏌ョ敤鎴锋槸鍚﹀瓨鍦 + * */ + public TSUser getUserByUserIdAndUserNameExits(TSUser user); + public String getUserRole(TSUser user); + /** + * 鏂囦欢涓婁紶 + * @param request + */ + public T uploadFile(UploadFile uploadFile); + /** + * 鏂囦欢涓婁紶鎴栭瑙 + * @param uploadFile + * @return + */ + public HttpServletResponse viewOrDownloadFile(UploadFile uploadFile); + + public Map getDataSourceMap(Template template); + /** + * 鐢熸垚XML鏂囦欢 + * @param fileName XML鍏ㄨ矾寰 + */ + public HttpServletResponse createXml(ImportFile importFile); + /** + * 瑙f瀽XML鏂囦欢 + * @param fileName XML鍏ㄨ矾寰 + */ + public void parserXml(String fileName); + public List comTree(List all,ComboTree comboTree); + + /** + * 鏍规嵁妯″瀷鐢熸垚ComboTree JSON + * + * @param all 鍏ㄩ儴瀵硅薄 + * @param comboTreeModel 妯″瀷 + * @param in 宸叉嫢鏈夌殑瀵硅薄 + * @param recursive 鏄惁閫掑綊鍔犺浇鎵鏈夊瓙鑺傜偣 + * @return List + */ + public List ComboTree(List all, ComboTreeModel comboTreeModel, List in, boolean recursive); + public List treegrid(List all,TreeGridModel treeGridModel); +} + diff --git a/src/main/java/org/jeecgframework/core/common/dao/IGenericBaseCommonDao.java b/src/main/java/org/jeecgframework/core/common/dao/IGenericBaseCommonDao.java new file mode 100644 index 00000000..34fb3cc6 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/dao/IGenericBaseCommonDao.java @@ -0,0 +1,325 @@ +package org.jeecgframework.core.common.dao; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import org.hibernate.Session; +import org.hibernate.criterion.DetachedCriteria; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.hibernate.qbc.HqlQuery; +import org.jeecgframework.core.common.hibernate.qbc.PageList; +import org.jeecgframework.core.common.model.common.DBTable; +import org.jeecgframework.core.common.model.json.DataGridReturn; +import org.jeecgframework.tag.vo.datatable.DataTableReturn; +import org.springframework.dao.DataAccessException; + +/** + * + * 绫绘弿杩帮細DAO灞傛硾鍨嬪熀绫绘帴鍙 + * + * 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-8 鏃堕棿锛氫笅鍗05:37:33 + * @version 1.0 + */ +public interface IGenericBaseCommonDao { + /** + * 鑾峰彇鎵鏈夋暟鎹簱琛 + * + * @return + */ + public List getAllDbTableName(); + + public Integer getAllDbTableSize(); + + public Serializable save(T entity); + + public void batchSave(List entitys); + + public void saveOrUpdate(T entity); + + /** + * 鍒犻櫎瀹炰綋 + * + * @param + * + * @param + * + * @param + * @param entitie + */ + public void delete(T entitie); + + /** + * 鏍规嵁瀹炰綋鍚嶇О鍜屼富閿幏鍙栧疄浣 + * + * @param + * @param entityName + * @param id + * @return + */ + public T get(Class entityName, Serializable id); + + /** + * 鏍规嵁瀹炰綋鍚嶅瓧鑾峰彇鍞竴璁板綍 + * + * @param propertyName + * @param value + * @return + */ + public T findUniqueByProperty(Class entityClass, + String propertyName, Object value); + + /** + * 鎸夊睘鎬ф煡鎵惧璞″垪琛. + */ + public List findByProperty(Class entityClass, + String propertyName, Object value); + + /** + * 鍔犺浇鍏ㄩ儴瀹炰綋 + * + * @param + * @param entityClass + * @return + */ + public List loadAll(final Class entityClass); + + /** + * 鏍规嵁瀹炰綋鍚嶇О鍜屼富閿幏鍙栧疄浣 + * + * @param + * + * @param + * @param entityName + * @param id + * @return + */ + public T getEntity(Class entityName, Serializable id); + + public void deleteEntityById(Class entityName, Serializable id); + + /** + * 鍒犻櫎瀹炰綋闆嗗悎 + * + * @param + * @param entities + */ + public void deleteAllEntitie(Collection entities); + + /** + * 鏇存柊鎸囧畾鐨勫疄浣 + * + * @param + * @param pojo + */ + public void updateEntitie(T pojo); + + public void updateEntityById(Class entityName, Serializable id); + + /** + * 閫氳繃hql 鏌ヨ璇彞鏌ユ壘瀵硅薄 + * + * @param + * @param query + * @return + */ + public List findByQueryString(String hql); + + /** + * 閫氳繃hql鏌ヨ鍞竴瀵硅薄 + * + * @param + * @param query + * @return + */ + public T singleResult(String hql); + + /** + * 鏍规嵁sql鏇存柊 + * + * @param query + * @return + */ + public int updateBySqlString(String sql); + + /** + * 鏍规嵁sql鏌ユ壘List + * + * @param + * @param query + * @return + */ + public List findListbySql(String query); + + /** + * 閫氳繃灞炴хО鑾峰彇瀹炰綋甯︽帓搴 + * + * @param + * @param clas + * @return + */ + public List findByPropertyisOrder(Class entityClass, + String propertyName, Object value, boolean isAsc); + + /** + * + * cq鏂瑰紡鍒嗛〉 + * + * @param cq + * @param isOffset + * @return + */ + public PageList getPageList(final CriteriaQuery cq, final boolean isOffset); + + /** + * 閫氳繃cq鑾峰彇鍏ㄩ儴瀹炰綋 + * + * @param + * @param cq + * @return + */ + public List getListByCriteriaQuery(final CriteriaQuery cq, + Boolean ispage); + + /** + * + * hqlQuery鏂瑰紡鍒嗛〉 + * + * @param cq + * @param isOffset + * @return + */ + public PageList getPageList(final HqlQuery hqlQuery, + final boolean needParameter); + + /** + * + * sqlQuery鏂瑰紡鍒嗛〉 + * + * @param cq + * @param isOffset + * @return + */ + public PageList getPageListBySql(final HqlQuery hqlQuery, + final boolean needParameter); + + public Session getSession(); + + public List findByExample(final String entityName, + final Object exampleEntity); + + /** + * 閫氳繃hql 鏌ヨ璇彞鏌ユ壘HashMap瀵硅薄 + * + * @param + * @param query + * @return + */ + public Map getHashMapbyQuery(String query); + + /** + * 杩斿洖jquery datatables妯″瀷 + * + * @param cq + * @param isOffset + * @return + */ + public DataTableReturn getDataTableReturn(final CriteriaQuery cq, + final boolean isOffset); + + /** + * 杩斿洖easyui datagrid妯″瀷 + * + * @param cq + * @param isOffset + * @return + */ + public DataGridReturn getDataGridReturn(final CriteriaQuery cq, + final boolean isOffset); + + /** + * 鎵цSQL + */ + public Integer executeSql(String sql, List param); + + /** + * 鎵цSQL + */ + public Integer executeSql(String sql, Object... param); + + /** + * 鎵цSQL 浣跨敤:name鍗犱綅绗 + */ + public Integer executeSql(String sql, Map param); + /** + * 鎵цSQL 浣跨敤:name鍗犱綅绗,骞惰繑鍥炴彃鍏ョ殑涓婚敭鍊 + */ + public Object executeSqlReturnKey(String sql, Map param); + /** + * 閫氳繃JDBC鏌ユ壘瀵硅薄闆嗗悎 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹繑鍥炴暟鎹 + */ + public List> findForJdbc(String sql, Object... objs); + + /** + * 閫氳繃JDBC鏌ユ壘瀵硅薄闆嗗悎 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹繑鍥炴暟鎹 + */ + public Map findOneForJdbc(String sql, Object... objs); + + /** + * 閫氳繃JDBC鏌ユ壘瀵硅薄闆嗗悎,甯﹀垎椤 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁 + */ + public List> findForJdbc(String sql, int page, int rows); + + /** + * 閫氳繃JDBC鏌ユ壘瀵硅薄闆嗗悎,甯﹀垎椤 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁 + */ + public List findObjForJdbc(String sql, int page, int rows, + Class clazz); + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁-閲囩敤棰勫鐞嗘柟寮 + * + * @param criteria + * @param firstResult + * @param maxResults + * @return + * @throws DataAccessException + */ + public List> findForJdbcParam(String sql, int page, + int rows, Object... objs); + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁For JDBC + */ + public Long getCountForJdbc(String sql); + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁For JDBC-閲囩敤棰勫鐞嗘柟寮 + * + */ + public Long getCountForJdbcParam(String sql, Object[] objs); + + /** + * 閫氳繃hql 鏌ヨ璇彞鏌ユ壘瀵硅薄 + * + * @param + * @param query + * @return + */ + public List findHql(String hql, Object... param); + + /** + * 鎵цHQL璇彞鎿嶄綔鏇存柊 + * + * @param hql + * @return + */ + public Integer executeHql(String hql); + + public List pageList(DetachedCriteria dc, int firstResult, + int maxResult); + + public List findByDetached(DetachedCriteria dc); +} diff --git a/src/main/java/org/jeecgframework/core/common/dao/impl/CommonDao.java b/src/main/java/org/jeecgframework/core/common/dao/impl/CommonDao.java new file mode 100644 index 00000000..b42a1622 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/dao/impl/CommonDao.java @@ -0,0 +1,594 @@ +package org.jeecgframework.core.common.dao.impl; + + +import org.apache.commons.lang.StringUtils; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.dom4j.io.XMLWriter; +import org.hibernate.Query; +import org.jeecgframework.core.common.dao.ICommonDao; +import org.jeecgframework.core.common.dao.IGenericBaseCommonDao; +import org.jeecgframework.core.common.model.common.UploadFile; +import org.jeecgframework.core.common.model.json.ComboTree; +import org.jeecgframework.core.common.model.json.ImportFile; +import org.jeecgframework.core.common.model.json.TreeGrid; +import org.jeecgframework.core.extend.swftools.SwfToolsUtil; +import org.jeecgframework.core.extend.template.DataSourceMap; +import org.jeecgframework.core.extend.template.Template; +import org.jeecgframework.core.util.*; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.tag.vo.easyui.ComboTreeModel; +import org.jeecgframework.tag.vo.easyui.TreeGridModel; +import org.jeecgframework.web.system.pojo.base.*; +import org.springframework.stereotype.Repository; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.sql.Timestamp; +import java.util.*; + +/** + * 鍏叡鎵╁睍鏂规硶 + * @author 寮犱唬娴 + * + */ +@Repository +public class CommonDao extends GenericBaseCommonDao implements ICommonDao, IGenericBaseCommonDao { + + /** + * 妫鏌ョ敤鎴锋槸鍚﹀瓨鍦 + * */ + public TSUser getUserByUserIdAndUserNameExits(TSUser user) { + String password = PasswordUtil.encrypt(user.getUserName(), user.getPassword(), PasswordUtil.getStaticSalt()); + String query = "from TSUser u where u.userName = :username and u.password=:passowrd"; + Query queryObject = getSession().createQuery(query); + queryObject.setParameter("username", user.getUserName()); + queryObject.setParameter("passowrd", password); + List users = queryObject.list(); + if (users != null && users.size() > 0) { + return users.get(0); + } + return null; + } + + /** + * admin璐︽埛鍒濆鍖 + */ + public void pwdInit(TSUser user,String newPwd){ + String query ="from TSUser u where u.userName = :username "; + Query queryObject = getSession().createQuery(query); + queryObject.setParameter("username", user.getUserName()); + List users = queryObject.list(); + if(null != users && users.size() > 0){ + user = users.get(0); + String pwd = PasswordUtil.encrypt(user.getUserName(), newPwd, PasswordUtil.getStaticSalt()); + user.setPassword(pwd); + save(user); + } + + } + + + public String getUserRole(TSUser user) { + String userRole = ""; + List sRoleUser = findByProperty(TSRoleUser.class, "TSUser.id", user.getId()); + for (TSRoleUser tsRoleUser : sRoleUser) { + userRole += tsRoleUser.getTSRole().getRoleCode() + ","; + } + return userRole; + } + + + /** + * 鏂囦欢涓婁紶 + * + * @param request + * @throws Exception + */ + @SuppressWarnings("unchecked") + public Object uploadFile(UploadFile uploadFile) { + Object object = uploadFile.getObject(); + if(uploadFile.getFileKey()!=null) + { + updateEntitie(object); + } + else { + try { + uploadFile.getMultipartRequest().setCharacterEncoding("UTF-8"); + MultipartHttpServletRequest multipartRequest = uploadFile.getMultipartRequest(); + ReflectHelper reflectHelper = new ReflectHelper(uploadFile.getObject()); + String uploadbasepath = uploadFile.getBasePath();// 鏂囦欢涓婁紶鏍圭洰褰 + if (uploadbasepath == null) { + uploadbasepath = ResourceUtil.getConfigByName("uploadpath"); + } + Map fileMap = multipartRequest.getFileMap(); + // 鏂囦欢鏁版嵁搴撲繚瀛樿矾寰 + String path = uploadbasepath + "/";// 鏂囦欢淇濆瓨鍦ㄧ‖鐩樼殑鐩稿璺緞 + String realPath = uploadFile.getMultipartRequest().getSession().getServletContext().getRealPath("/") + "/" + path;// 鏂囦欢鐨勭‖鐩樼湡瀹炶矾寰 + File file = new File(realPath); + if (!file.exists()) { + file.mkdirs();// 鍒涘缓鏍圭洰褰 + } + if (uploadFile.getCusPath() != null) { + realPath += uploadFile.getCusPath() + "/"; + path += uploadFile.getCusPath() + "/"; + file = new File(realPath); + if (!file.exists()) { + file.mkdirs();// 鍒涘缓鏂囦欢鑷畾涔夊瓙鐩綍 + } + } + else { + realPath += DateUtils.getDataString(DateUtils.yyyyMMdd) + "/"; + path += DateUtils.getDataString(DateUtils.yyyyMMdd) + "/"; + file = new File(realPath); + if (!file.exists()) { + file.mkdir();// 鍒涘缓鏂囦欢鏃堕棿瀛愮洰褰 + } + } + String entityName = uploadFile.getObject().getClass().getSimpleName(); + // 璁剧疆鏂囦欢涓婁紶璺緞 + if (entityName.equals("TSTemplate")) { + realPath = uploadFile.getMultipartRequest().getSession().getServletContext().getRealPath("/") + ResourceUtil.getConfigByName("templatepath") + "/"; + path = ResourceUtil.getConfigByName("templatepath") + "/"; + } else if (entityName.equals("TSIcon")) { + realPath = uploadFile.getMultipartRequest().getSession().getServletContext().getRealPath("/") + uploadFile.getCusPath() + "/"; + path = uploadFile.getCusPath() + "/"; + } + String fileName = ""; + String swfName = ""; + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile mf = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 + fileName = mf.getOriginalFilename();// 鑾峰彇鏂囦欢鍚 + swfName = PinyinUtil.getPinYinHeadChar(oConvertUtils.replaceBlank(FileUtils.getFilePrefix(fileName)));// 鍙栨枃浠跺悕棣栧瓧姣嶄綔涓篠WF鏂囦欢鍚 + String extend = FileUtils.getExtend(fileName);// 鑾峰彇鏂囦欢鎵╁睍鍚 + String myfilename=""; + String noextfilename="";//涓嶅甫鎵╁睍鍚 + if(uploadFile.isRename()) + { + + noextfilename=DateUtils.getDataString(DateUtils.yyyymmddhhmmss)+StringUtil.random(8);//鑷畾涔夋枃浠跺悕绉 + myfilename=noextfilename+"."+extend;//鑷畾涔夋枃浠跺悕绉 + } + else { + myfilename=fileName; + } + + String savePath = realPath + myfilename;// 鏂囦欢淇濆瓨鍏ㄨ矾寰 + String fileprefixName = FileUtils.getFilePrefix(fileName); + if (uploadFile.getTitleField() != null) { + reflectHelper.setMethodValue(uploadFile.getTitleField(), fileprefixName);// 鍔ㄦ佽皟鐢╯et鏂规硶缁欐枃浠跺璞℃爣棰樿祴鍊 + } + if (uploadFile.getExtend() != null) { + // 鍔ㄦ佽皟鐢 set鏂规硶缁欐枃浠跺璞″唴瀹硅祴鍊 + reflectHelper.setMethodValue(uploadFile.getExtend(), extend); + } + if (uploadFile.getByteField() != null) { + // 浜岃繘鍒舵枃浠朵繚瀛樺湪鏁版嵁搴撲腑 + reflectHelper.setMethodValue(uploadFile.getByteField(), StreamUtils.InputStreamTOByte(mf.getInputStream())); + } + File savefile = new File(savePath); + if (uploadFile.getRealPath() != null) { + // 璁剧疆鏂囦欢鏁版嵁搴撶殑鐗╃悊璺緞 + reflectHelper.setMethodValue(uploadFile.getRealPath(), path + myfilename); + } + saveOrUpdate(object); + // 鏂囦欢鎷疯礉鍒版寚瀹氱‖鐩樼洰褰 + FileCopyUtils.copy(mf.getBytes(), savefile); +// if (uploadFile.getSwfpath() != null) { +// // 杞琒WF +// reflectHelper.setMethodValue(uploadFile.getSwfpath(), path + swfName + ".swf"); +// SwfToolsUtil.convert2SWF(savePath); +// } +// FileCopyUtils.copy(mf.getBytes(), savefile); + if (uploadFile.getSwfpath() != null) { + // 杞琒WF + reflectHelper.setMethodValue(uploadFile.getSwfpath(), path + FileUtils.getFilePrefix(myfilename) + ".swf"); + SwfToolsUtil.convert2SWF(savePath); + } + + } + } catch (Exception e1) { + } + } + return object; + } + + /** + * 鏂囦欢涓嬭浇鎴栭瑙 + * + * @param request + * @throws Exception + * @throws Exception + */ + @SuppressWarnings("unchecked") + public HttpServletResponse viewOrDownloadFile(UploadFile uploadFile) { + uploadFile.getResponse().setContentType("UTF-8"); + uploadFile.getResponse().setCharacterEncoding("UTF-8"); + InputStream bis = null; + BufferedOutputStream bos = null; + HttpServletResponse response = uploadFile.getResponse(); + HttpServletRequest request = uploadFile.getRequest(); + String ctxPath = request.getSession().getServletContext().getRealPath("/"); + String downLoadPath = ""; + long fileLength = 0; + if (uploadFile.getRealPath() != null&&uploadFile.getContent() == null) { + downLoadPath = ctxPath + uploadFile.getRealPath(); + fileLength = new File(downLoadPath).length(); + try { + bis = new BufferedInputStream(new FileInputStream(downLoadPath)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } else { + if (uploadFile.getContent() != null) + bis = new ByteArrayInputStream(uploadFile.getContent()); + fileLength = uploadFile.getContent().length; + } + try { + if (!uploadFile.isView() && uploadFile.getExtend() != null) { + if (uploadFile.getExtend().equals("text")) { + response.setContentType("text/plain;"); + } else if (uploadFile.getExtend().equals("doc")) { + response.setContentType("application/msword;"); + } else if (uploadFile.getExtend().equals("xls")) { + response.setContentType("application/ms-excel;"); + } else if (uploadFile.getExtend().equals("pdf")) { + response.setContentType("application/pdf;"); + } else if (uploadFile.getExtend().equals("jpg") || uploadFile.getExtend().equals("jpeg")) { + response.setContentType("image/jpeg;"); + } else { + response.setContentType("application/x-msdownload;"); + } + response.setHeader("Content-disposition", "attachment; filename=" + new String((uploadFile.getTitleField() + "." + uploadFile.getExtend()).getBytes("GBK"), "ISO8859-1")); + response.setHeader("Content-Length", String.valueOf(fileLength)); + } + bos = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[2048]; + int bytesRead; + while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { + bos.write(buff, 0, bytesRead); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (bis != null) { + bis.close(); + } + if (bos != null) { + bos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return response; + } + + public Map getDataSourceMap(Template template) { + return DataSourceMap.getDataSourceMap(); + } + + /** + * 鐢熸垚XML importFile 瀵煎嚭xml宸ュ叿绫 + */ + public HttpServletResponse createXml(ImportFile importFile) { + HttpServletResponse response = importFile.getResponse(); + HttpServletRequest request = importFile.getRequest(); + try { + // 鍒涘缓document瀵硅薄 + Document document = DocumentHelper.createDocument(); + document.setXMLEncoding("UTF-8"); + // 鍒涘缓鏍硅妭鐐 + String rootname = importFile.getEntityName() + "s"; + Element rElement = document.addElement(rootname); + Class entityClass = importFile.getEntityClass(); + String[] fields = importFile.getField().split(","); + // 寰楀埌瀵煎嚭瀵硅薄鐨勯泦鍚 + List objList = loadAll(entityClass); + Class classType = entityClass.getClass(); + for (Object t : objList) { + Element childElement = rElement.addElement(importFile.getEntityName()); + for (int i = 0; i < fields.length; i++) { + String fieldName = fields[i]; + // 绗竴涓哄疄浣撶殑涓婚敭 + if (i == 0) { + childElement.addAttribute(fieldName, String.valueOf(TagUtil.fieldNametoValues(fieldName, t))); + } else { + Element name = childElement.addElement(fieldName); + name.setText(String.valueOf(TagUtil.fieldNametoValues(fieldName, t))); + } + } + + } + String ctxPath = request.getSession().getServletContext().getRealPath(""); + File fileWriter = new File(ctxPath + "/" + importFile.getFileName()); + XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(fileWriter)); + + xmlWriter.write(document); + xmlWriter.close(); + // 涓嬭浇鐢熸垚鐨刋ML鏂囦欢 + UploadFile uploadFile = new UploadFile(request, response); + uploadFile.setRealPath(importFile.getFileName()); + uploadFile.setTitleField(importFile.getFileName()); + uploadFile.setExtend("bak"); + viewOrDownloadFile(uploadFile); + } catch (Exception e) { + e.printStackTrace(); + } + return response; + } + + /** + * 瑙f瀽XML鏂囦欢灏嗘暟鎹鍏ユ暟鎹簱涓 + */ + @SuppressWarnings("unchecked") + public void parserXml(String fileName) { + try { + File inputXml = new File(fileName); + Class entityClass; + // 璇诲彇鏂囦欢 + SAXReader saxReader = new SAXReader(); + Document document = saxReader.read(inputXml); + Element employees = document.getRootElement(); + // 閬嶅巻鏍硅妭鐐逛笅鐨勫瓙鑺傜偣 + for (Iterator i = employees.elementIterator(); i.hasNext();) { + Element employee = (Element) i.next(); + // 鏈夊疄浣撳悕鍙嶅皠寰楀埌瀹炰綋绫 + entityClass = GenericsUtils.getEntityClass(employee.getName()); + // 寰楀埌瀹炰綋灞炴 + Field[] fields = TagUtil.getFiled(entityClass); + // 寰楀埌瀹炰綋鐨処D + String id = employee.attributeValue(fields[0].getName()); + // 鍒ゆ柇瀹炰綋鏄惁宸插瓨鍦 + Object obj1 = getEntity(entityClass, id); + // 瀹炰綋涓嶅瓨鍦╪ew涓疄浣 + if (obj1 == null) { + obj1 = entityClass.newInstance(); + } + // 鏍规嵁鍙嶅皠缁欏疄浣撳睘鎬ц祴鍊 + for (Iterator j = employee.elementIterator(); j.hasNext();) { + Element node = (Element) j.next(); + for (int k = 0; k < fields.length; k++) { + if (node.getName().equals(fields[k].getName())) { + String fieldName = fields[k].getName(); + String stringLetter = fieldName.substring(0, 1).toUpperCase(); + String setName = "set" + stringLetter + fieldName.substring(1); + Method setMethod = entityClass.getMethod(setName, new Class[] { fields[k].getType() }); + String type = TagUtil.getColumnType(fieldName, fields); + if (type.equals("int")) { + setMethod.invoke(obj1, new Integer(node.getText())); + } else if (type.equals("string")) { + setMethod.invoke(obj1, node.getText().toString()); + } else if (type.equals("short")) { + setMethod.invoke(obj1, new Short(node.getText())); + } else if (type.equals("double")) { + setMethod.invoke(obj1, new Double(node.getText())); + } else if (type.equals("Timestamp")) { + setMethod.invoke(obj1, new Timestamp(DateUtils.str2Date(node.getText(), DateUtils.datetimeFormat).getTime())); + } + } + } + } + if (obj1 != null) { + saveOrUpdate(obj1); + } else { + save(obj1); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 鏍规嵁妯″瀷鐢熸垚JSON + * + * @param all + * 鍏ㄩ儴瀵硅薄 + * @param in + * 宸叉嫢鏈夌殑瀵硅薄 + * @param comboBox + * 妯″瀷 + * @return + */ + public List comTree(List all, ComboTree comboTree) { + List trees = new ArrayList(); + for (TSDepart depart : all) { + trees.add(tree(depart, true)); + } + return trees; + + } + + @SuppressWarnings("unchecked") + public ComboTree tree(TSDepart depart, boolean recursive) { + ComboTree tree = new ComboTree(); + tree.setId(oConvertUtils.getString(depart.getId())); + tree.setText(depart.getDepartname()); + List departsList = findByProperty(TSDepart.class, "TSPDepart.id", depart.getId()); + if (departsList != null && departsList.size() > 0) { + tree.setState("closed"); + tree.setChecked(false); + if (recursive) {// 閫掑綊鏌ヨ瀛愯妭鐐 + List departList = new ArrayList(departsList); + //Collections.sort(departList, new SetListSort());// 鎺掑簭 + List children = new ArrayList(); + for (TSDepart d : departList) { + ComboTree t = tree(d, true); + children.add(t); + } + tree.setChildren(children); + } + } + return tree; + } + + public List ComboTree(List all, ComboTreeModel comboTreeModel, List in, boolean recursive) { + List trees = new ArrayList(); + for (Object obj : all) { + trees.add(comboTree(obj, comboTreeModel, in, recursive)); + } + return trees; + + } + + /** + * 鏋勫缓ComboTree + * @param obj + * @param comboTreeModel + * @param in + * @param recursive 鏄惁閫掑綊瀛愯妭鐐 + * @return + */ + private ComboTree comboTree(Object obj, ComboTreeModel comboTreeModel, List in, boolean recursive) { + ComboTree tree = new ComboTree(); + Map attributes = new HashMap(); + ReflectHelper reflectHelper = new ReflectHelper(obj); + String id = oConvertUtils.getString(reflectHelper.getMethodValue(comboTreeModel.getIdField())); + tree.setId(id); + tree.setText(oConvertUtils.getString(reflectHelper.getMethodValue(comboTreeModel.getTextField()))); + if (comboTreeModel.getSrcField() != null) { + attributes.put("href", oConvertUtils.getString(reflectHelper.getMethodValue(comboTreeModel.getSrcField()))); + tree.setAttributes(attributes); + } + if (in == null) { + } else { + if (in.size() > 0) { + for (Object inobj : in) { + ReflectHelper reflectHelper2 = new ReflectHelper(inobj); + String inId = oConvertUtils.getString(reflectHelper2.getMethodValue(comboTreeModel.getIdField())); + if (inId.equals(id)) { + tree.setChecked(true); + } + } + } + } + + List curChildList = (List) reflectHelper.getMethodValue(comboTreeModel.getChildField()); + if (curChildList != null && curChildList.size() > 0) { + tree.setState("closed"); + tree.setChecked(false); + + if (recursive) { // 閫掑綊鏌ヨ瀛愯妭鐐 + List children = new ArrayList(); + List nextChildList = new ArrayList(curChildList); + for (Object childObj : nextChildList) { + ComboTree t = comboTree(childObj, comboTreeModel, in, recursive); + children.add(t); + } + tree.setChildren(children); + } + } + + return tree; + } + /** + * 鏋勫缓鏍戝舰鏁版嵁琛 + */ + public List treegrid(List all, TreeGridModel treeGridModel) { + List treegrid = new ArrayList(); + for (Object obj : all) { + ReflectHelper reflectHelper = new ReflectHelper(obj); + TreeGrid tg = new TreeGrid(); + String id = oConvertUtils.getString(reflectHelper.getMethodValue(treeGridModel.getIdField())); + String src = oConvertUtils.getString(reflectHelper.getMethodValue(treeGridModel.getSrc())); + String text = oConvertUtils.getString(reflectHelper.getMethodValue(treeGridModel.getTextField())); + if(StringUtils.isNotEmpty(treeGridModel.getOrder())){ + String order = oConvertUtils.getString(reflectHelper.getMethodValue(treeGridModel.getOrder())); + tg.setOrder(order); + } + tg.setId(id); + if (treeGridModel.getIcon() != null) { + String iconpath = TagUtil.fieldNametoValues(treeGridModel.getIcon(), obj).toString(); + if (iconpath != null) { + tg.setCode(iconpath); + } else { + tg.setCode(""); + } + } + tg.setSrc(src); + tg.setText(text); + if (treeGridModel.getParentId() != null) { + Object pid = TagUtil.fieldNametoValues(treeGridModel.getParentId(), obj); + if (pid != null) { + tg.setParentId(pid.toString()); + } else { + tg.setParentId(""); + } + } + if (treeGridModel.getParentText() != null) { + Object ptext = TagUtil.fieldNametoValues(treeGridModel.getTextField(), obj); + if (ptext != null) { + tg.setParentText(ptext.toString()); + } else { + tg.setParentText(""); + } + + } + List childList = (List) reflectHelper.getMethodValue(treeGridModel.getChildList()); + + if (childList != null && childList.size() > 0) { + tg.setState("closed"); + } + if (treeGridModel.getRoleid() != null) { + String[] opStrings = {}; + List roleFunctions = findByProperty(TSRoleFunction.class, "TSFunction.id", id); + + if (roleFunctions.size() > 0) { + for (TSRoleFunction tRoleFunction : roleFunctions) { + TSRoleFunction roleFunction = tRoleFunction; + if (roleFunction.getTSRole().getId().toString().equals(treeGridModel.getRoleid())) { + String bbString = roleFunction.getOperation(); + if (bbString != null) { + opStrings = bbString.split(","); + break; + } + } + } + } + List operateions = findByProperty(TSOperation.class, "TSFunction.id", id); + StringBuffer attributes = new StringBuffer(); + if (operateions.size() > 0) { + for (TSOperation tOperation : operateions) { + if (opStrings.length < 1) { + attributes.append("" + tOperation.getOperationname()); + } else { + StringBuffer sb = new StringBuffer(); + sb.append("" + tOperation.getOperationname()); + attributes.append(sb.toString()); + } + } + } + tg.setOperations(attributes.toString()); + } + if (treeGridModel.getFieldMap() != null) { + tg.setFieldMap(new HashMap()); + for (Map.Entry entry : treeGridModel.getFieldMap().entrySet()) { + Object fieldValue = reflectHelper.getMethodValue(entry.getValue().toString()); + tg.getFieldMap().put(entry.getKey(), fieldValue); + } + } + if (treeGridModel.getFunctionType() != null) { + String functionType = oConvertUtils.getString(reflectHelper.getMethodValue(treeGridModel.getFunctionType())); + tg.setFunctionType(functionType); + } + treegrid.add(tg); + } + return treegrid; + } +} diff --git a/src/main/java/org/jeecgframework/core/common/dao/impl/GenericBaseCommonDao.java b/src/main/java/org/jeecgframework/core/common/dao/impl/GenericBaseCommonDao.java new file mode 100644 index 00000000..1eb416a7 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/dao/impl/GenericBaseCommonDao.java @@ -0,0 +1,971 @@ +package org.jeecgframework.core.common.dao.impl; + +import java.io.Serializable; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.hibernate.Criteria; +import org.hibernate.Query; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.criterion.CriteriaSpecification; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Example; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Projection; +import org.hibernate.criterion.Projections; +import org.hibernate.criterion.Restrictions; +import org.hibernate.internal.CriteriaImpl; +import org.hibernate.metadata.ClassMetadata; +import org.hibernate.persister.entity.AbstractEntityPersister; +import org.hibernate.type.Type; +import org.jeecgframework.core.annotation.JeecgEntityTitle; +import org.jeecgframework.core.common.dao.IGenericBaseCommonDao; +import org.jeecgframework.core.common.dao.jdbc.JdbcDao; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.hibernate.qbc.DetachedCriteriaUtil; +import org.jeecgframework.core.common.hibernate.qbc.HqlQuery; +import org.jeecgframework.core.common.hibernate.qbc.PageList; +import org.jeecgframework.core.common.hibernate.qbc.PagerUtil; +import org.jeecgframework.core.common.model.common.DBTable; +import org.jeecgframework.core.common.model.json.DataGridReturn; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.ToEntityUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.tag.vo.datatable.DataTableReturn; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.dao.DataAccessException; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.dao.support.DataAccessUtils; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.PreparedStatementCreator; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.core.namedparam.SqlParameterSource; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.util.Assert; + +/** + * + * 绫绘弿杩帮細 DAO灞傛硾鍨嬪熀绫 + * + * 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:16:48 + * @param + * @param + * @version 1.0 + */ +@SuppressWarnings("hiding") +public abstract class GenericBaseCommonDao + implements IGenericBaseCommonDao { + /** + * 鍒濆鍖朙og4j鐨勪竴涓疄渚 + */ + private static final Logger logger = Logger + .getLogger(GenericBaseCommonDao.class); + /** + * 娉ㄥ叆涓涓猻essionFactory灞炴,骞舵敞鍏ュ埌鐖剁被(HibernateDaoSupport) + * **/ + @Autowired + @Qualifier("sessionFactory") + private SessionFactory sessionFactory; + + public Session getSession() { + // 浜嬪姟蹇呴』鏄紑鍚殑(Required)锛屽惁鍒欒幏鍙栦笉鍒 + return sessionFactory.getCurrentSession(); + } + + /** + * 鑾峰緱璇ョ被鐨勫睘鎬у拰绫诲瀷 + * + * @param entityName + * 娉ㄨВ鐨勫疄浣撶被 + */ + private void getProperty(Class entityName) { + ClassMetadata cm = sessionFactory.getClassMetadata(entityName); + String[] str = cm.getPropertyNames(); // 鑾峰緱璇ョ被鎵鏈夌殑灞炴у悕绉 + for (int i = 0; i < str.length; i++) { + String property = str[i]; + String type = cm.getPropertyType(property).getName(); // 鑾峰緱璇ュ悕绉扮殑绫诲瀷 + org.jeecgframework.core.util.LogUtil.info(property + "--->" + type); + } + } + + /** + * 鑾峰彇鎵鏈夋暟鎹〃 + * + * @return + */ + public List getAllDbTableName() { + List resultList = new ArrayList(); + SessionFactory factory = getSession().getSessionFactory(); + Map metaMap = factory.getAllClassMetadata(); + for (String key : (Set) metaMap.keySet()) { + DBTable dbTable = new DBTable(); + AbstractEntityPersister classMetadata = (AbstractEntityPersister) metaMap + .get(key); + dbTable.setTableName(classMetadata.getTableName()); + dbTable.setEntityName(classMetadata.getEntityName()); + Class c; + try { + c = Class.forName(key); + JeecgEntityTitle t = c.getAnnotation(JeecgEntityTitle.class); + dbTable.setTableTitle(t != null ? t.name() : ""); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + resultList.add(dbTable); + } + return resultList; + } + + /** + * 鑾峰彇鎵鏈夋暟鎹〃 + * + * @return + */ + public Integer getAllDbTableSize() { + SessionFactory factory = getSession().getSessionFactory(); + Map metaMap = factory.getAllClassMetadata(); + return metaMap.size(); + } + + /** + * 鏍规嵁瀹炰綋鍚嶅瓧鑾峰彇鍞竴璁板綍 + * + * @param propertyName + * @param value + * @return + */ + public T findUniqueByProperty(Class entityClass, + String propertyName, Object value) { + Assert.hasText(propertyName); + return (T) createCriteria(entityClass, + Restrictions.eq(propertyName, value)).uniqueResult(); + } + + /** + * 鎸夊睘鎬ф煡鎵惧璞″垪琛. + */ + public List findByProperty(Class entityClass, + String propertyName, Object value) { + Assert.hasText(propertyName); + return (List) createCriteria(entityClass, + Restrictions.eq(propertyName, value)).list(); + } + + /** + * 鏍规嵁浼犲叆鐨勫疄浣撴寔涔呭寲瀵硅薄 + */ + public Serializable save(T entity) { + try { + Serializable id = getSession().save(entity); + getSession().flush(); + if (logger.isDebugEnabled()) { + logger.debug("淇濆瓨瀹炰綋鎴愬姛," + entity.getClass().getName()); + } + return id; + } catch (RuntimeException e) { + logger.error("淇濆瓨瀹炰綋寮傚父", e); + throw e; + } + + } + + /** + * 鎵归噺淇濆瓨鏁版嵁 + * + * @param + * @param entitys + * 瑕佹寔涔呭寲鐨勪复鏃跺疄浣撳璞¢泦鍚 + */ + public void batchSave(List entitys) { + for (int i = 0; i < entitys.size(); i++) { + getSession().save(entitys.get(i)); + if (i % 20 == 0) { + // 20涓璞″悗鎵嶆竻鐞嗙紦瀛橈紝鍐欏叆鏁版嵁搴 + getSession().flush(); + getSession().clear(); + } + } + // 鏈鍚庢竻鐞嗕竴涓----闃叉澶т簬20灏忎簬40鐨勪笉淇濆瓨 + getSession().flush(); + getSession().clear(); + } + + /** + * 鏍规嵁浼犲叆鐨勫疄浣撴坊鍔犳垨鏇存柊瀵硅薄 + * + * @param + * + * @param entity + */ + + public void saveOrUpdate(T entity) { + try { + getSession().saveOrUpdate(entity); + getSession().flush(); + if (logger.isDebugEnabled()) { + logger.debug("娣诲姞鎴栨洿鏂版垚鍔," + entity.getClass().getName()); + } + } catch (RuntimeException e) { + logger.error("娣诲姞鎴栨洿鏂板紓甯", e); + throw e; + } + } + + /** + * 鏍规嵁浼犲叆鐨勫疄浣撳垹闄ゅ璞 + */ + public void delete(T entity) { + try { + getSession().delete(entity); + getSession().flush(); + if (logger.isDebugEnabled()) { + logger.debug("鍒犻櫎鎴愬姛," + entity.getClass().getName()); + } + } catch (RuntimeException e) { + logger.error("鍒犻櫎寮傚父", e); + throw e; + } + } + + /** + * 鏍规嵁涓婚敭鍒犻櫎鎸囧畾鐨勫疄浣 + * + * @param + * @param pojo + */ + public void deleteEntityById(Class entityName, Serializable id) { + delete(get(entityName, id)); + getSession().flush(); + } + + /** + * 鍒犻櫎鍏ㄩ儴鐨勫疄浣 + * + * @param + * + * @param entitys + */ + public void deleteAllEntitie(Collection entitys) { + for (Object entity : entitys) { + getSession().delete(entity); + getSession().flush(); + } + } + + /** + * 鏍规嵁Id鑾峰彇瀵硅薄銆 + */ + public T get(Class entityClass, final Serializable id) { + + return (T) getSession().get(entityClass, id); + + } + + /** + * 鏍规嵁涓婚敭鑾峰彇瀹炰綋骞跺姞閿併 + * + * @param + * @param entityName + * @param id + * @param lock + * @return + */ + public T getEntity(Class entityName, Serializable id) { + + T t = (T) getSession().get(entityName, id); + if (t != null) { + getSession().flush(); + } + return t; + } + + /** + * 鏇存柊鎸囧畾鐨勫疄浣 + * + * @param + * @param pojo + */ + public void updateEntitie(T pojo) { + getSession().update(pojo); + getSession().flush(); + } + + /** + * 鏇存柊鎸囧畾鐨勫疄浣 + * + * @param + * @param pojo + */ + public void updateEntitie(String className, Object id) { + getSession().update(className, id); + getSession().flush(); + } + + /** + * 鏍规嵁涓婚敭鏇存柊瀹炰綋 + */ + public void updateEntityById(Class entityName, Serializable id) { + updateEntitie(get(entityName, id)); + } + + /** + * 閫氳繃hql 鏌ヨ璇彞鏌ユ壘瀵硅薄 + * + * @param + * @param query + * @return + */ + public List findByQueryString(final String query) { + + Query queryObject = getSession().createQuery(query); + List list = queryObject.list(); + if (list.size() > 0) { + getSession().flush(); + } + return list; + + } + + /** + * 閫氳繃hql鏌ヨ鍞竴瀵硅薄 + * + * @param + * @param query + * @return + */ + public T singleResult(String hql) { + T t = null; + Query queryObject = getSession().createQuery(hql); + List list = queryObject.list(); + if (list.size() == 1) { + getSession().flush(); + t = list.get(0); + } else if (list.size() > 0) { + throw new BusinessException("鏌ヨ缁撴灉鏁:" + list.size() + "澶т簬1"); + } + return t; + } + + /** + * 閫氳繃hql 鏌ヨ璇彞鏌ユ壘HashMap瀵硅薄 + * + * @param + * @param query + * @return + */ + public Map getHashMapbyQuery(String hql) { + + Query query = getSession().createQuery(hql); + List list = query.list(); + Map map = new HashMap(); + for (Iterator iterator = list.iterator(); iterator.hasNext();) { + Object[] tm = (Object[]) iterator.next(); + map.put(tm[0].toString(), tm[1].toString()); + } + return map; + + } + + /** + * 閫氳繃sql鏇存柊璁板綍 + * + * @param + * @param query + * @return + */ + public int updateBySqlString(final String query) { + + Query querys = getSession().createSQLQuery(query); + return querys.executeUpdate(); + } + + /** + * 閫氳繃sql鏌ヨ璇彞鏌ユ壘瀵硅薄 + * + * @param + * @param query + * @return + */ + public List findListbySql(final String sql) { + Query querys = getSession().createSQLQuery(sql); + return querys.list(); + } + + /** + * 鍒涘缓Criteria瀵硅薄锛屾湁鎺掑簭鍔熻兘銆 + * + * @param + * @param entityClass + * @param orderBy + * @param isAsc + * @param criterions + * @return + */ + private Criteria createCriteria(Class entityClass, boolean isAsc, + Criterion... criterions) { + Criteria criteria = createCriteria(entityClass, criterions); + if (isAsc) { + criteria.addOrder(Order.asc("asc")); + } else { + criteria.addOrder(Order.desc("desc")); + } + return criteria; + } + + /** + * 鍒涘缓Criteria瀵硅薄甯﹀睘鎬ф瘮杈 + * + * @param + * @param entityClass + * @param criterions + * @return + */ + private Criteria createCriteria(Class entityClass, + Criterion... criterions) { + Criteria criteria = getSession().createCriteria(entityClass); + for (Criterion c : criterions) { + criteria.add(c); + } + return criteria; + } + + public List loadAll(final Class entityClass) { + Criteria criteria = createCriteria(entityClass); + return criteria.list(); + } + + /** + * 鍒涘缓鍗曚竴Criteria瀵硅薄 + * + * @param + * @param entityClass + * @param criterions + * @return + */ + private Criteria createCriteria(Class entityClass) { + Criteria criteria = getSession().createCriteria(entityClass); + return criteria; + } + + /** + * 鏍规嵁灞炴у悕鍜屽睘鎬у兼煡璇. 鏈夋帓搴 + * + * @param + * @param entityClass + * @param propertyName + * @param value + * @param orderBy + * @param isAsc + * @return + */ + public List findByPropertyisOrder(Class entityClass, + String propertyName, Object value, boolean isAsc) { + Assert.hasText(propertyName); + return createCriteria(entityClass, isAsc, + Restrictions.eq(propertyName, value)).list(); + } + + /** + * 鏍规嵁灞炴у悕鍜屽睘鎬у 鏌ヨ 涓旇姹傚璞″敮涓. + * + * @return 绗﹀悎鏉′欢鐨勫敮涓瀵硅薄. + */ + public T findUniqueBy(Class entityClass, String propertyName, + Object value) { + Assert.hasText(propertyName); + return (T) createCriteria(entityClass, + Restrictions.eq(propertyName, value)).uniqueResult(); + } + + /** + * 鏍规嵁鏌ヨ鏉′欢涓庡弬鏁板垪琛ㄥ垱寤篞uery瀵硅薄 + * + * @param session + * Hibernate浼氳瘽 + * @param hql + * HQL璇彞 + * @param objects + * 鍙傛暟鍒楄〃 + * @return Query瀵硅薄 + */ + public Query createQuery(Session session, String hql, Object... objects) { + Query query = session.createQuery(hql); + if (objects != null) { + for (int i = 0; i < objects.length; i++) { + query.setParameter(i, objects[i]); + } + } + return query; + } + + /** + * 鎵归噺鎻掑叆瀹炰綋 + * + * @param clas + * @param values + * @return + */ + public int batchInsertsEntitie(List entityList) { + int num = 0; + for (int i = 0; i < entityList.size(); i++) { + save(entityList.get(i)); + num++; + } + return num; + } + + /** + * 鏍规嵁瀹炰綋鍚嶈繑鍥炲叏閮ㄥ璞 + * + * @param + * @param hql + * @param size + * @return + */ + /** + * 浣跨敤鍗犱綅绗︾殑鏂瑰紡濉厖鍊 璇锋敞鎰忥細like瀵瑰簲鐨勫兼牸寮忥細"%"+username+"%" Hibernate Query + * + * @param hibernateTemplate + * @param hql + * @param valus + * 鍗犱綅绗﹀彿?瀵瑰簲鐨勫硷紝椤哄簭蹇呴』涓涓瀵瑰簲 鍙互涓虹┖瀵硅薄鏁扮粍锛屼絾鏄笉鑳戒负null + * @return 2008-07-19 add by liuyang + */ + public List executeQuery(final String hql, final Object[] values) { + Query query = getSession().createQuery(hql); + // query.setCacheable(true); + for (int i = 0; values != null && i < values.length; i++) { + query.setParameter(i, values[i]); + } + + return query.list(); + + } + + /** + * 鏍规嵁瀹炰綋妯$増鏌ユ壘 + * + * @param entityName + * @param exampleEntity + * @return + */ + + public List findByExample(final String entityName, + final Object exampleEntity) { + Assert.notNull(exampleEntity, "Example entity must not be null"); + Criteria executableCriteria = (entityName != null ? getSession() + .createCriteria(entityName) : getSession().createCriteria( + exampleEntity.getClass())); + executableCriteria.add(Example.create(exampleEntity)); + return executableCriteria.list(); + } + + // 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗚幏鍙栨弧瓒虫爣鍑嗙殑璁板綍鏁 + public Integer getRowCount(DetachedCriteria criteria) { + return oConvertUtils.getInt(((Criteria) criteria + .setProjection(Projections.rowCount())).uniqueResult(), 0); + } + + /** + * 璋冪敤瀛樺偍杩囩▼ + */ + public void callableStatementByName(String proc) { + } + + /** + * 鏌ヨ鎸囧畾瀹炰綋鐨勬昏褰曟暟 + * + * @param clazz + * @return + */ + public int getCount(Class clazz) { + + int count = DataAccessUtils.intResult(getSession().createQuery( + "select count(*) from " + clazz.getName()).list()); + return count; + } + + /** + * 鑾峰彇鍒嗛〉璁板綍CriteriaQuery 鑰佹柟娉昮inal int allCounts = + * oConvertUtils.getInt(criteria + * .setProjection(Projections.rowCount()).uniqueResult(), 0); + * + * @param cq + * @param isOffset + * @return + */ + public PageList getPageList(final CriteriaQuery cq, final boolean isOffset) { + + Criteria criteria = cq.getDetachedCriteria().getExecutableCriteria( + getSession()); + CriteriaImpl impl = (CriteriaImpl) criteria; + // 鍏堟妸Projection鍜孫rderBy鏉′欢鍙栧嚭鏉,娓呯┖涓よ呮潵鎵цCount鎿嶄綔 + Projection projection = impl.getProjection(); + final int allCounts = ((Long) criteria.setProjection( + Projections.rowCount()).uniqueResult()).intValue(); + criteria.setProjection(projection); + if (projection == null) { + criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); + } + + // 鍒ゆ柇鏄惁鏈夋帓搴忓瓧娈 + if (cq.getOrdermap() != null) { + cq.setOrder(cq.getOrdermap()); + } + int pageSize = cq.getPageSize();// 姣忛〉鏄剧ず鏁 + int curPageNO = PagerUtil.getcurPageNo(allCounts, cq.getCurPage(), + pageSize);// 褰撳墠椤 + int offset = PagerUtil.getOffset(allCounts, curPageNO, pageSize); + String toolBar = ""; + if (isOffset) {// 鏄惁鍒嗛〉 + criteria.setFirstResult(offset); + criteria.setMaxResults(cq.getPageSize()); + if (cq.getIsUseimage() == 1) { + toolBar = PagerUtil.getBar(cq.getMyAction(), cq.getMyForm(), + allCounts, curPageNO, pageSize, cq.getMap()); + } else { + toolBar = PagerUtil.getBar(cq.getMyAction(), allCounts, + curPageNO, pageSize, cq.getMap()); + } + } else { + pageSize = allCounts; + } + return new PageList(criteria.list(), toolBar, offset, curPageNO, + allCounts); + } + + /** + * 杩斿洖JQUERY datatables DataTableReturn妯″瀷瀵硅薄 + */ + public DataTableReturn getDataTableReturn(final CriteriaQuery cq, + final boolean isOffset) { + + Criteria criteria = cq.getDetachedCriteria().getExecutableCriteria( + getSession()); + CriteriaImpl impl = (CriteriaImpl) criteria; + // 鍏堟妸Projection鍜孫rderBy鏉′欢鍙栧嚭鏉,娓呯┖涓よ呮潵鎵цCount鎿嶄綔 + Projection projection = impl.getProjection(); + final int allCounts = ((Long) criteria.setProjection( + Projections.rowCount()).uniqueResult()).intValue(); + criteria.setProjection(projection); + if (projection == null) { + criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); + } + + // 鍒ゆ柇鏄惁鏈夋帓搴忓瓧娈 + if (cq.getOrdermap() != null) { + cq.setOrder(cq.getOrdermap()); + } + int pageSize = cq.getPageSize();// 姣忛〉鏄剧ず鏁 + int curPageNO = PagerUtil.getcurPageNo(allCounts, cq.getCurPage(), + pageSize);// 褰撳墠椤 + int offset = PagerUtil.getOffset(allCounts, curPageNO, pageSize); + if (isOffset) {// 鏄惁鍒嗛〉 + criteria.setFirstResult(offset); + criteria.setMaxResults(cq.getPageSize()); + } else { + pageSize = allCounts; + } + DetachedCriteriaUtil.selectColumn(cq.getDetachedCriteria(), cq + .getField().split(","), cq.getEntityClass(), false); + return new DataTableReturn(allCounts, allCounts, cq.getDataTables() + .getEcho(), criteria.list()); + } + + /** + * 杩斿洖easyui datagrid DataGridReturn妯″瀷瀵硅薄 + */ + public DataGridReturn getDataGridReturn(final CriteriaQuery cq, + final boolean isOffset) { + Criteria criteria = cq.getDetachedCriteria().getExecutableCriteria( + getSession()); + CriteriaImpl impl = (CriteriaImpl) criteria; + // 鍏堟妸Projection鍜孫rderBy鏉′欢鍙栧嚭鏉,娓呯┖涓よ呮潵鎵цCount鎿嶄綔 + Projection projection = impl.getProjection(); + final int allCounts = ((Long) criteria.setProjection( + Projections.rowCount()).uniqueResult()).intValue(); + criteria.setProjection(projection); + if (projection == null) { + criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); + } + if (StringUtils.isNotBlank(cq.getDataGrid().getSort())) { + cq.addOrder(cq.getDataGrid().getSort(), cq.getDataGrid().getOrder()); + } + + // 鍒ゆ柇鏄惁鏈夋帓搴忓瓧娈 + if (!cq.getOrdermap().isEmpty()) { + cq.setOrder(cq.getOrdermap()); + } + int pageSize = cq.getPageSize();// 姣忛〉鏄剧ず鏁 + int curPageNO = PagerUtil.getcurPageNo(allCounts, cq.getCurPage(), + pageSize);// 褰撳墠椤 + int offset = PagerUtil.getOffset(allCounts, curPageNO, pageSize); + if (isOffset) {// 鏄惁鍒嗛〉 + criteria.setFirstResult(offset); + criteria.setMaxResults(cq.getPageSize()); + } else { + pageSize = allCounts; + } + // DetachedCriteriaUtil.selectColumn(cq.getDetachedCriteria(), + // cq.getField().split(","), cq.getClass1(), false); + List list = criteria.list(); + cq.getDataGrid().setResults(list); + cq.getDataGrid().setTotal(allCounts); + return new DataGridReturn(allCounts, list); + } + + /** + * 鑾峰彇鍒嗛〉璁板綍SqlQuery + * + * @param cq + * @param isOffset + * @return + */ + @SuppressWarnings("unchecked") + public PageList getPageListBySql(final HqlQuery hqlQuery, + final boolean isToEntity) { + + Query query = getSession().createSQLQuery(hqlQuery.getQueryString()); + + // query.setParameters(hqlQuery.getParam(), (Type[]) + // hqlQuery.getTypes()); + int allCounts = query.list().size(); + int curPageNO = hqlQuery.getCurPage(); + int offset = PagerUtil.getOffset(allCounts, curPageNO, + hqlQuery.getPageSize()); + query.setFirstResult(offset); + query.setMaxResults(hqlQuery.getPageSize()); + List list = null; + if (isToEntity) { + list = ToEntityUtil.toEntityList(query.list(), + hqlQuery.getClass1(), hqlQuery.getDataGrid().getField() + .split(",")); + } else { + list = query.list(); + } + return new PageList(hqlQuery, list, offset, curPageNO, allCounts); + } + + /** + * 鑾峰彇鍒嗛〉璁板綍HqlQuery + * + * @param cq + * @param isOffset + * @return + */ + @SuppressWarnings("unchecked") + public PageList getPageList(final HqlQuery hqlQuery, + final boolean needParameter) { + + Query query = getSession().createQuery(hqlQuery.getQueryString()); + if (needParameter) { + query.setParameters(hqlQuery.getParam(), + (Type[]) hqlQuery.getTypes()); + } + int allCounts = query.list().size(); + int curPageNO = hqlQuery.getCurPage(); + int offset = PagerUtil.getOffset(allCounts, curPageNO, + hqlQuery.getPageSize()); + String toolBar = PagerUtil.getBar(hqlQuery.getMyaction(), allCounts, + curPageNO, hqlQuery.getPageSize(), hqlQuery.getMap()); + query.setFirstResult(offset); + query.setMaxResults(hqlQuery.getPageSize()); + return new PageList(query.list(), toolBar, offset, curPageNO, allCounts); + } + + /** + * 鏍规嵁CriteriaQuery鑾峰彇List + * + * @param cq + * @param isOffset + * @return + */ + @SuppressWarnings("unchecked") + public List getListByCriteriaQuery(final CriteriaQuery cq, Boolean ispage) { + Criteria criteria = cq.getDetachedCriteria().getExecutableCriteria( + getSession()); + // 鍒ゆ柇鏄惁鏈夋帓搴忓瓧娈 + if (cq.getOrdermap() != null) { + cq.setOrder(cq.getOrdermap()); + } + if (ispage){ + criteria.setFirstResult((cq.getCurPage()-1)*cq.getPageSize()); + criteria.setMaxResults(cq.getPageSize()); + } + return criteria.list(); + + } + + @Autowired + @Qualifier("jdbcTemplate") + private JdbcTemplate jdbcTemplate; + + @Autowired + @Qualifier("namedParameterJdbcTemplate") + private NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁 + */ + public List> findForJdbc(String sql, int page, int rows) { + // 灏佽鍒嗛〉SQL + sql = JdbcDao.jeecgCreatePageSql(sql, page, rows); + return this.jdbcTemplate.queryForList(sql); + } + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁 + * + * @throws IllegalAccessException + * @throws InstantiationException + */ + public List findObjForJdbc(String sql, int page, int rows, + Class clazz) { + List rsList = new ArrayList(); + // 灏佽鍒嗛〉SQL + sql = JdbcDao.jeecgCreatePageSql(sql, page, rows); + List> mapList = jdbcTemplate.queryForList(sql); + + T po = null; + for (Map m : mapList) { + try { + po = clazz.newInstance(); + MyBeanUtils.copyMap2Bean_Nobig(po, m); + rsList.add(po); + } catch (Exception e) { + e.printStackTrace(); + } + } + return rsList; + } + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁-閲囩敤棰勫鐞嗘柟寮 + * + * @param criteria + * @param firstResult + * @param maxResults + * @return + * @throws DataAccessException + */ + public List> findForJdbcParam(String sql, int page, + int rows, Object... objs) { + // 灏佽鍒嗛〉SQL + sql = JdbcDao.jeecgCreatePageSql(sql, page, rows); + return this.jdbcTemplate.queryForList(sql, objs); + } + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁For JDBC + */ + public Long getCountForJdbc(String sql) { + return this.jdbcTemplate.queryForLong(sql); + } + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁For JDBC-閲囩敤棰勫鐞嗘柟寮 + * + */ + public Long getCountForJdbcParam(String sql, Object[] objs) { + return this.jdbcTemplate.queryForLong(sql, objs); + } + + public List> findForJdbc(String sql, Object... objs) { + return this.jdbcTemplate.queryForList(sql, objs); + } + + public Integer executeSql(String sql, List param) { + return this.jdbcTemplate.update(sql, param); + } + + public Integer executeSql(String sql, Object... param) { + return this.jdbcTemplate.update(sql, param); + } + + public Integer executeSql(String sql, Map param) { + return this.namedParameterJdbcTemplate.update(sql, param); + } + public Object executeSqlReturnKey(final String sql, Map param) { + Object keyValue = null; + KeyHolder keyHolder = new GeneratedKeyHolder(); + SqlParameterSource sqlp = new MapSqlParameterSource(param); + this.namedParameterJdbcTemplate.update(sql,sqlp, keyHolder); + if(oConvertUtils.isNotEmpty(keyHolder.getKey())){ + keyValue = keyHolder.getKey().longValue(); + } + return keyValue; + } + public Integer countByJdbc(String sql, Object... param) { + return this.jdbcTemplate.queryForInt(sql, param); + } + + public Map findOneForJdbc(String sql, Object... objs) { + try { + return this.jdbcTemplate.queryForMap(sql, objs); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + + /** + * 閫氳繃hql 鏌ヨ璇彞鏌ユ壘瀵硅薄 + * + * @param + * @param query + * @return + */ + public List findHql(String hql, Object... param) { + Query q = getSession().createQuery(hql); + if (param != null && param.length > 0) { + for (int i = 0; i < param.length; i++) { + q.setParameter(i, param[i]); + } + } + return q.list(); + } + + /** + * 鎵цHQL璇彞鎿嶄綔鏇存柊 + * + * @param hql + * @return + */ + public Integer executeHql(String hql) { + Query q = getSession().createQuery(hql); + return q.executeUpdate(); + } + + public List pageList(DetachedCriteria dc, int firstResult, + int maxResult) { + Criteria criteria = dc.getExecutableCriteria(getSession()); + criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); + criteria.setFirstResult(firstResult); + criteria.setMaxResults(maxResult); + return criteria.list(); + } + + /** + * 绂荤嚎鏌ヨ + */ + public List findByDetached(DetachedCriteria dc) { + return dc.getExecutableCriteria(getSession()).list(); + } +} diff --git a/src/main/java/org/jeecgframework/core/common/dao/jdbc/JdbcDao.java b/src/main/java/org/jeecgframework/core/common/dao/jdbc/JdbcDao.java new file mode 100644 index 00000000..91b4d773 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/dao/jdbc/JdbcDao.java @@ -0,0 +1,250 @@ +package org.jeecgframework.core.common.dao.jdbc; + +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.apache.poi.ss.formula.functions.T; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.ResourceUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.stereotype.Repository; + +/** + * + * @author 寮犱唬娴 + * + */ +@Repository("jdbcDao") +public class JdbcDao extends SimpleJdbcTemplate{ + + /** + * 鏁版嵁搴撶被鍨 + */ + public static final String DATABSE_TYPE_MYSQL ="mysql"; + public static final String DATABSE_TYPE_POSTGRE ="postgresql"; + public static final String DATABSE_TYPE_ORACLE ="oracle"; + public static final String DATABSE_TYPE_SQLSERVER ="sqlserver"; + /** + * 鍒嗛〉SQL + */ + public static final String MYSQL_SQL = "select * from ( {0}) sel_tab00 limit {1},{2}"; //mysql + public static final String POSTGRE_SQL = "select * from ( {0}) sel_tab00 limit {2} offset {1}";//postgresql + public static final String ORACLE_SQL = "select * from (select row_.*,rownum rownum_ from ({0}) row_ where rownum <= {1}) where rownum_>{2}"; //oracle + public static final String SQLSERVER_SQL = "select * from ( select row_number() over(order by tempColumn) tempRowNumber, * from (select top {1} tempColumn = 0, {0}) t ) tt where tempRowNumber > {2}"; //sqlserver + + + @Autowired + public JdbcDao(DataSource dataSource) { + super(dataSource); + } + + /** + * 鏍规嵁sql璇彞锛岃繑鍥炲璞¢泦鍚 + * @param sql璇彞(鍙傛暟鐢ㄥ啋鍙峰姞鍙傛暟鍚嶏紝渚嬪select * from tb where id=:id) + * @param clazz绫诲瀷 + * @param parameters鍙傛暟闆嗗悎(key涓哄弬鏁板悕锛寁alue涓哄弬鏁板) + * @return bean瀵硅薄闆嗗悎 + */ + public List find(String sql,Class clazz,Map parameters){ + return super.find(sql,clazz,parameters); + } + + /** + * 鏍规嵁sql璇彞锛岃繑鍥炲璞 + * @param sql璇彞(鍙傛暟鐢ㄥ啋鍙峰姞鍙傛暟鍚嶏紝渚嬪select * from tb where id=:id) + * @param clazz绫诲瀷 + * @param parameters鍙傛暟闆嗗悎(key涓哄弬鏁板悕锛寁alue涓哄弬鏁板) + * @return bean瀵硅薄 + */ + public Object findForObject(String sql,Class clazz,Map parameters){ + return super.findForObject(sql, clazz, parameters); + } + + /** + * 鏍规嵁sql璇彞锛岃繑鍥炴暟鍊煎瀷杩斿洖缁撴灉 + * @param sql璇彞(鍙傛暟鐢ㄥ啋鍙峰姞鍙傛暟鍚嶏紝渚嬪select count(*) from tb where id=:id) + * @param parameters鍙傛暟闆嗗悎(key涓哄弬鏁板悕锛寁alue涓哄弬鏁板) + * @return bean瀵硅薄 + */ + public long findForLong(String sql,Map parameters){ + return super.findForLong(sql, parameters); + } + + /** + * 鏍规嵁sql璇彞锛岃繑鍥濵ap瀵硅薄,瀵逛簬鏌愪簺椤圭洰鏉ヨ锛屾病鏈夊噯澶嘊ean瀵硅薄锛屽垯鍙互浣跨敤Map浠f浛Key涓哄瓧娈靛悕,value涓哄 + * @param sql璇彞(鍙傛暟鐢ㄥ啋鍙峰姞鍙傛暟鍚嶏紝渚嬪select count(*) from tb where id=:id) + * @param parameters鍙傛暟闆嗗悎(key涓哄弬鏁板悕锛寁alue涓哄弬鏁板) + * @return bean瀵硅薄 + */ + public Map findForMap(String sql,Map parameters){ + return super.findForMap(sql, parameters); + } + + /** + * 鏍规嵁sql璇彞锛岃繑鍥濵ap瀵硅薄闆嗗悎 + * @see findForMap + * @param sql璇彞(鍙傛暟鐢ㄥ啋鍙峰姞鍙傛暟鍚嶏紝渚嬪select count(*) from tb where id=:id) + * @param parameters鍙傛暟闆嗗悎(key涓哄弬鏁板悕锛寁alue涓哄弬鏁板) + * @return bean瀵硅薄 + */ + public List> findForListMap(String sql,Map parameters){ + return super.findForListMap(sql, parameters); + } + + /** + * 鎵цinsert锛寀pdate锛宒elete绛夋搷浣
    + * 渚嬪insert into users (name,login_name,password) values(:name,:loginName,:password)
    + * 鍙傛暟鐢ㄥ啋鍙,鍙傛暟涓篵ean鐨勫睘鎬у悕 + * @param sql + * @param bean + */ + public int executeForObject(String sql,Object bean){ + return super.executeForObject(sql, bean); + } + + /** + * 鎵цinsert锛寀pdate锛宒elete绛夋搷浣
    + * 渚嬪insert into users (name,login_name,password) values(:name,:login_name,:password)
    + * 鍙傛暟鐢ㄥ啋鍙,鍙傛暟涓篗ap鐨刱ey鍚 + * @param sql + * @param parameters + */ + public int executeForMap(String sql,Map parameters){ + return super.executeForMap(sql, parameters); + } + /* + * 鎵归噺澶勭悊鎿嶄綔 + * 渚嬪锛歶pdate t_actor set first_name = :firstName, last_name = :lastName where id = :id + * 鍙傛暟鐢ㄥ啋鍙 + */ + public int[] batchUpdate(final String sql,List batch ){ + return super.batchUpdate(sql,batch); + } + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁 + */ + public List> findForJdbc(String sql, int page, int rows) { + //灏佽鍒嗛〉SQL + sql = jeecgCreatePageSql(sql,page,rows); + return this.jdbcTemplate.queryForList(sql); + } + + + public List> findForJdbc(String sql, Object... objs) { + return this.jdbcTemplate.queryForList(sql,objs); + } + + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁 + * @throws IllegalAccessException + * @throws InstantiationException + */ + public List findObjForJdbc(String sql, int page, int rows,Class clazz) { + List rsList = new ArrayList(); + //灏佽鍒嗛〉SQL + sql = jeecgCreatePageSql(sql,page,rows); + List> mapList = jdbcTemplate.queryForList(sql); + + T po = null; + for(Map m:mapList){ + try { + po = clazz.newInstance(); + MyBeanUtils.copyMap2Bean_Nobig(po, m); + rsList.add(po); + } catch (Exception e) { + e.printStackTrace(); + } + } + return rsList; + } + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁-閲囩敤棰勫鐞嗘柟寮 + * + * @param criteria + * @param firstResult + * @param maxResults + * @return + * @throws DataAccessException + */ + public List> findForJdbcParam(String sql, int page, int rows,Object... objs){ + //灏佽鍒嗛〉SQL + sql = jeecgCreatePageSql(sql,page,rows); + return jdbcTemplate.queryForList(sql,objs); + } + + public Map findOneForJdbc(String sql, Object... objs) { + try{ + return this.jdbcTemplate.queryForMap(sql, objs); + }catch (EmptyResultDataAccessException e) { + return null; + } + } + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁For JDBC + */ + public Long getCountForJdbc(String sql) { + return jdbcTemplate.queryForLong(sql); + } + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁For JDBC-閲囩敤棰勫鐞嗘柟寮 + * + */ + public Long getCountForJdbcParam(String sql,Object... objs) { + return jdbcTemplate.queryForLong(sql, objs); + } + + public Integer executeSql2(String sql,List param) { + return this.jdbcTemplate.update(sql,param); + } + + public Integer executeSql(String sql, Object... param) { + return this.jdbcTemplate.update(sql,param); + } + + public Integer countByJdbc(String sql, Object... param) { + return this.jdbcTemplate.queryForInt(sql, param); + } + + /** + * 鎸夌収鏁版嵁搴撶被鍨嬶紝灏佽SQL + */ + public static String jeecgCreatePageSql(String sql, int page, int rows){ + int beginNum = (page - 1) * rows; + String[] sqlParam = new String[3]; + sqlParam[0] = sql; + sqlParam[1] = beginNum+""; + sqlParam[2] = rows+""; + if(ResourceUtil.getJdbcUrl().indexOf(DATABSE_TYPE_MYSQL)!=-1){ + sql = MessageFormat.format(MYSQL_SQL, sqlParam); + }else if(ResourceUtil.getJdbcUrl().indexOf(DATABSE_TYPE_POSTGRE)!=-1){ + sql = MessageFormat.format(POSTGRE_SQL, sqlParam); + }else { + int beginIndex = (page-1)*rows; + int endIndex = beginIndex+rows; + sqlParam[2] = Integer.toString(beginIndex); + sqlParam[1] = Integer.toString(endIndex); + if(ResourceUtil.getJdbcUrl().indexOf(DATABSE_TYPE_ORACLE)!=-1) { + sql = MessageFormat.format(ORACLE_SQL, sqlParam); + } else if(ResourceUtil.getJdbcUrl().indexOf(DATABSE_TYPE_SQLSERVER)!=-1) { + sqlParam[0] = sql.substring(getAfterSelectInsertPoint(sql)); + sql = MessageFormat.format(SQLSERVER_SQL, sqlParam); + } + } + return sql; + } + private static int getAfterSelectInsertPoint(String sql) { + int selectIndex = sql.toLowerCase().indexOf("select"); + int selectDistinctIndex = sql.toLowerCase().indexOf("select distinct"); + return selectIndex + (selectDistinctIndex == selectIndex ? 15 : 6); + } +} diff --git a/src/main/java/org/jeecgframework/core/common/dao/jdbc/SimpleJdbcTemplate.java b/src/main/java/org/jeecgframework/core/common/dao/jdbc/SimpleJdbcTemplate.java new file mode 100644 index 00000000..3ca4dca6 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/dao/jdbc/SimpleJdbcTemplate.java @@ -0,0 +1,190 @@ +package org.jeecgframework.core.common.dao.jdbc; + +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; +import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcInsert; +import org.springframework.util.Assert; +/** + * jdbc妯℃澘 + * @author 寮犱唬娴 + * + */ +@SuppressWarnings("unchecked") +public class SimpleJdbcTemplate { + + protected final Log logger = LogFactory.getLog(getClass()); + + protected org.springframework.jdbc.core.simple.SimpleJdbcTemplate jdbcTemplate; + protected SimpleJdbcInsert simpleJdbcInsert; + public SimpleJdbcTemplate(DataSource dataSource){ + jdbcTemplate=new org.springframework.jdbc.core.simple.SimpleJdbcTemplate(dataSource); + simpleJdbcInsert=new SimpleJdbcInsert(dataSource); + } + + /** + * 鏍规嵁sql璇彞锛岃繑鍥炲璞¢泦鍚 + * @param sql璇彞(鍙傛暟鐢ㄥ啋鍙峰姞鍙傛暟鍚嶏紝渚嬪select * from tb where id=:id) + * @param clazz绫诲瀷 + * @param parameters鍙傛暟闆嗗悎(key涓哄弬鏁板悕锛寁alue涓哄弬鏁板) + * @return bean瀵硅薄闆嗗悎 + */ + public List find(final String sql,Class clazz,Map parameters){ + try{ + Assert.hasText(sql,"sql璇彞涓嶆纭!"); + Assert.notNull(clazz,"闆嗗悎涓璞$被鍨嬩笉鑳戒负绌!"); + if(parameters!=null){ + return jdbcTemplate.query(sql, resultBeanMapper(clazz),parameters); + }else{ + return jdbcTemplate.query(sql, resultBeanMapper(clazz)); + } + }catch (Exception e) { + return null; + } + } + + /** + * 鏍规嵁sql璇彞锛岃繑鍥炲璞 + * @param sql璇彞(鍙傛暟鐢ㄥ啋鍙峰姞鍙傛暟鍚嶏紝渚嬪select * from tb where id=:id) + * @param clazz绫诲瀷 + * @param parameters鍙傛暟闆嗗悎(key涓哄弬鏁板悕锛寁alue涓哄弬鏁板) + * @return bean瀵硅薄 + */ + public Object findForObject(final String sql,Class clazz,Map parameters){ + try{ + Assert.hasText(sql,"sql璇彞涓嶆纭!"); + Assert.notNull(clazz,"闆嗗悎涓璞$被鍨嬩笉鑳戒负绌!"); + if(parameters!=null){ + return jdbcTemplate.queryForObject(sql, resultBeanMapper(clazz), parameters); + }else{ + return jdbcTemplate.queryForLong(sql, resultBeanMapper(clazz)); + } + }catch (Exception e) { + return null; + } + } + + /** + * 鏍规嵁sql璇彞锛岃繑鍥炴暟鍊煎瀷杩斿洖缁撴灉 + * @param sql璇彞(鍙傛暟鐢ㄥ啋鍙峰姞鍙傛暟鍚嶏紝渚嬪select count(*) from tb where id=:id) + * @param parameters鍙傛暟闆嗗悎(key涓哄弬鏁板悕锛寁alue涓哄弬鏁板) + * @return bean瀵硅薄 + */ + public long findForLong(final String sql,Map parameters){ + try{ + Assert.hasText(sql,"sql璇彞涓嶆纭!"); + if(parameters!=null){ + return jdbcTemplate.queryForLong(sql, parameters); + }else{ + return jdbcTemplate.queryForLong(sql); + } + }catch (Exception e) { + return 0; + } + } + + /** + * 鏍规嵁sql璇彞锛岃繑鍥濵ap瀵硅薄,瀵逛簬鏌愪簺椤圭洰鏉ヨ锛屾病鏈夊噯澶嘊ean瀵硅薄锛屽垯鍙互浣跨敤Map浠f浛Key涓哄瓧娈靛悕,value涓哄 + * @param sql璇彞(鍙傛暟鐢ㄥ啋鍙峰姞鍙傛暟鍚嶏紝渚嬪select count(*) from tb where id=:id) + * @param parameters鍙傛暟闆嗗悎(key涓哄弬鏁板悕锛寁alue涓哄弬鏁板) + * @return bean瀵硅薄 + */ + public Map findForMap(final String sql,Map parameters){ + try{ + Assert.hasText(sql,"sql璇彞涓嶆纭!"); + if(parameters!=null){ + return jdbcTemplate.queryForMap(sql, parameters); + }else{ + return jdbcTemplate.queryForMap(sql); + } + }catch (Exception e) { + return null; + } + } + + /** + * 鏍规嵁sql璇彞锛岃繑鍥濵ap瀵硅薄闆嗗悎 + * @see findForMap + * @param sql璇彞(鍙傛暟鐢ㄥ啋鍙峰姞鍙傛暟鍚嶏紝渚嬪select count(*) from tb where id=:id) + * @param parameters鍙傛暟闆嗗悎(key涓哄弬鏁板悕锛寁alue涓哄弬鏁板) + * @return bean瀵硅薄 + */ + public List> findForListMap(final String sql,Map parameters){ + try{ + Assert.hasText(sql,"sql璇彞涓嶆纭!"); + if(parameters!=null){ + return jdbcTemplate.queryForList(sql, parameters); + }else{ + return jdbcTemplate.queryForList(sql); + } + }catch (Exception e) { + return null; + } + } + + /** + * 鎵цinsert锛寀pdate锛宒elete绛夋搷浣
    + * 渚嬪insert into users (name,login_name,password) values(:name,:loginName,:password)
    + * 鍙傛暟鐢ㄥ啋鍙,鍙傛暟涓篵ean鐨勫睘鎬у悕 + * @param sql + * @param bean + */ + public int executeForObject(final String sql,Object bean){ + Assert.hasText(sql,"sql璇彞涓嶆纭!"); + if(bean!=null){ + return jdbcTemplate.update(sql, paramBeanMapper(bean)); + }else{ + return jdbcTemplate.update(sql); + } + } + + /** + * 鎵цinsert锛寀pdate锛宒elete绛夋搷浣
    + * 渚嬪insert into users (name,login_name,password) values(:name,:login_name,:password)
    + * 鍙傛暟鐢ㄥ啋鍙,鍙傛暟涓篗ap鐨刱ey鍚 + * @param sql + * @param parameters + */ + public int executeForMap(final String sql,Map parameters){ + Assert.hasText(sql,"sql璇彞涓嶆纭!"); + if(parameters!=null){ + return jdbcTemplate.update(sql, parameters); + }else{ + return jdbcTemplate.update(sql); + } + } + + /*public long executeForObjectReturnPk(final String sql,Object bean){ + Assert.hasText(sql,"sql璇彞涓嶆纭!"); + if(bean!=null){ + return jdbcTemplate.update(sql, paramBeanMapper(bean)); + }else{ + return jdbcTemplate.update(sql); + } + }*/ + + /* + * 鎵归噺澶勭悊鎿嶄綔 + * 渚嬪锛歶pdate t_actor set first_name = :firstName, last_name = :lastName where id = :id + * 鍙傛暟鐢ㄥ啋鍙 + */ + public int[] batchUpdate(final String sql,List batch ){ + int[] updateCounts = jdbcTemplate.batchUpdate(sql,batch); + return updateCounts; + } + + + protected ParameterizedBeanPropertyRowMapper resultBeanMapper(Class clazz) { + return ParameterizedBeanPropertyRowMapper.newInstance(clazz); + } + + protected BeanPropertySqlParameterSource paramBeanMapper(Object object) { + return new BeanPropertySqlParameterSource(object); + } +} diff --git a/src/main/java/org/jeecgframework/core/common/entity/IdEntity.java b/src/main/java/org/jeecgframework/core/common/entity/IdEntity.java new file mode 100644 index 00000000..07792e46 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/entity/IdEntity.java @@ -0,0 +1,25 @@ +package org.jeecgframework.core.common.entity; + +import javax.persistence.Column; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; + +import org.hibernate.annotations.GenericGenerator; +@MappedSuperclass +public abstract class IdEntity { + private String id; + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/exception/BusinessException.java b/src/main/java/org/jeecgframework/core/common/exception/BusinessException.java new file mode 100644 index 00000000..f3d32a6b --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/exception/BusinessException.java @@ -0,0 +1,19 @@ +package org.jeecgframework.core.common.exception; + +public class BusinessException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public BusinessException(String message){ + super(message); + } + + public BusinessException(Throwable cause) + { + super(cause); + } + + public BusinessException(String message,Throwable cause) + { + super(message,cause); + } +} diff --git a/src/main/java/org/jeecgframework/core/common/exception/GlobalExceptionResolver.java b/src/main/java/org/jeecgframework/core/common/exception/GlobalExceptionResolver.java new file mode 100644 index 00000000..a07680ee --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/exception/GlobalExceptionResolver.java @@ -0,0 +1,166 @@ +package org.jeecgframework.core.common.exception; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.util.ExceptionUtil; +import org.jeecgframework.core.util.JSONHelper; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.ModelAndView; + +/** + * spring mvc 鍏ㄥ眬澶勭悊寮傚父鎹曡幏 鏍规嵁璇锋眰鍖哄垎ajax鍜屾櫘閫氳姹傦紝鍒嗗埆杩涜鍝嶅簲. + * 绗竴銆佸紓甯镐俊鎭緭鍑哄埌鏃ュ織涓 + * 绗簩銆佹埅鍙栧紓甯歌缁嗕俊鎭殑鍓50涓瓧绗︼紝鍐欏叆鏃ュ織琛ㄤ腑t_s_log銆 + */ +@Component +public class GlobalExceptionResolver implements HandlerExceptionResolver { + @Autowired + private SystemService systemService; + //璁板綍鏃ュ織淇℃伅 + private static final Logger log = Logger + .getLogger(GlobalExceptionResolver.class); + //璁板綍鏁版嵁搴撴渶澶у瓧绗﹂暱搴 + private static final int WIRTE_DB_MAX_LENGTH = 1500; + //璁板綍鏁版嵁搴撴渶澶у瓧绗﹂暱搴 + private static final short LOG_LEVEL = 6; + //璁板綍鏁版嵁搴撴渶澶у瓧绗﹂暱搴 + private static final short LOG_OPT = 3; + /** + * 瀵瑰紓甯镐俊鎭繘琛岀粺涓澶勭悊锛屽尯鍒嗗紓姝ュ拰鍚屾璇锋眰锛屽垎鍒鐞 + */ + public ModelAndView resolveException(HttpServletRequest request, + HttpServletResponse response, Object handler, Exception ex) { + boolean isajax = isAjax(request,response); + Throwable deepestException = deepestException(ex); + return processException(request, response, handler, deepestException, isajax); + } + /** + * 鍒ゆ柇褰撳墠璇锋眰鏄惁涓哄紓姝ヨ姹. + */ + private boolean isAjax(HttpServletRequest request, HttpServletResponse response){ + return oConvertUtils.isNotEmpty(request.getHeader("X-Requested-With")); + } + /** + * 鑾峰彇鏈鍘熷鐨勫紓甯稿嚭澶勶紝鍗虫渶鍒濇姏鍑哄紓甯哥殑鍦版柟 + */ + private Throwable deepestException(Throwable e){ + Throwable tmp = e; + int breakPoint = 0; + while(tmp.getCause()!=null){ + if(tmp.equals(tmp.getCause())){ + break; + } + tmp=tmp.getCause(); + breakPoint++; + if(breakPoint>1000){ + break; + } + } + return tmp; + } + /** + * 澶勭悊寮傚父. + * @param request + * @param response + * @param handler + * @param deepestException + * @param isajax + * @return + */ + private ModelAndView processException(HttpServletRequest request, + HttpServletResponse response, Object handler, + Throwable ex, boolean isajax) { + //姝ラ涓銆佸紓甯镐俊鎭褰曞埌鏃ュ織鏂囦欢涓. + log.error("鍏ㄥ眬澶勭悊寮傚父鎹曡幏:", ex); + //姝ラ浜屻佸紓甯镐俊鎭褰曟埅鍙栧墠50瀛楃鍐欏叆鏁版嵁搴撲腑. + logDb(ex); + //姝ラ涓夈佸垎鏅氳姹傚拰ajax璇锋眰鍒嗗埆澶勭悊. + if(isajax){ + return processAjax(request,response,handler,ex); + }else{ + return processNotAjax(request,response,handler,ex); + } + } + /** + * 寮傚父淇℃伅璁板綍鎴彇鍓50瀛楃鍐欏叆鏁版嵁搴撲腑 + * @param ex + */ + private void logDb(Throwable ex) { + //String exceptionMessage = getThrowableMessage(ex); + String exceptionMessage = "閿欒寮傚父: "+ex.getClass().getSimpleName()+",閿欒鎻忚堪锛"+ex.getMessage(); + if(oConvertUtils.isNotEmpty(exceptionMessage)){ + if(exceptionMessage.length() > WIRTE_DB_MAX_LENGTH){ + exceptionMessage = exceptionMessage.substring(0,WIRTE_DB_MAX_LENGTH); + } + } + systemService.addLog(exceptionMessage, LOG_LEVEL, LOG_OPT); + } + /** + * ajax寮傚父澶勭悊骞惰繑鍥. + * @param request + * @param response + * @param handler + * @param deepestException + * @return + */ + private ModelAndView processAjax(HttpServletRequest request, + HttpServletResponse response, Object handler, + Throwable deepestException){ + ModelAndView empty = new ModelAndView(); + //response.setContentType("application/json"); + response.setHeader("Cache-Control", "no-store"); + AjaxJson json = new AjaxJson(); + json.setSuccess(true); + json.setMsg(deepestException.getMessage()); + try { + PrintWriter pw=response.getWriter(); + pw.write(JSONHelper.bean2json(json)); + pw.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + empty.clear(); + return empty; + } + /** + * 鏅氶〉闈㈠紓甯稿鐞嗗苟杩斿洖. + * @param request + * @param response + * @param handler + * @param deepestException + * @return + */ + private ModelAndView processNotAjax(HttpServletRequest request, + HttpServletResponse response, Object handler, Throwable ex) { + String exceptionMessage = getThrowableMessage(ex); + Map model = new HashMap(); + model.put("exceptionMessage", exceptionMessage); + model.put("ex", ex); + return new ModelAndView("common/error", model); + } + /** + * 杩斿洖閿欒淇℃伅瀛楃涓 + * + * @param ex + * Exception + * @return 閿欒淇℃伅瀛楃涓 + */ + public String getThrowableMessage(Throwable ex) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + ex.printStackTrace(pw); + return sw.toString(); + } +} diff --git a/src/main/java/org/jeecgframework/core/common/exception/MyExceptionHandler.java b/src/main/java/org/jeecgframework/core/common/exception/MyExceptionHandler.java new file mode 100644 index 00000000..8c66055a --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/exception/MyExceptionHandler.java @@ -0,0 +1,36 @@ +package org.jeecgframework.core.common.exception; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.util.ExceptionUtil; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.ModelAndView; + +/** + * spring mvc寮傚父鎹曡幏绫 + * + */ +@Component +public class MyExceptionHandler implements HandlerExceptionResolver { + + private static final Logger logger = Logger + .getLogger(MyExceptionHandler.class); + + public ModelAndView resolveException(HttpServletRequest request, + HttpServletResponse response, Object handler, Exception ex) { + String exceptionMessage = ExceptionUtil.getExceptionMessage(ex); + logger.error(exceptionMessage); + Map model = new HashMap(); + model.put("exceptionMessage", exceptionMessage); + model.put("ex", ex); + return new ModelAndView("common/error", model); + } +} diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/DB2Dialect.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/DB2Dialect.java new file mode 100644 index 00000000..4a69be4c --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/DB2Dialect.java @@ -0,0 +1,64 @@ +package org.jeecgframework.core.common.hibernate.dialect; + + +public class DB2Dialect extends Dialect +{ + public boolean supportsLimit() + { + return true; + } + + public boolean supportsLimitOffset() + { + return true; + } + + private static String getRowNumber(String sql) + { + StringBuffer rownumber = new StringBuffer(50).append("rownumber() over("); + int orderByIndex = sql.toLowerCase().indexOf("order by"); + if ((orderByIndex > 0) && (!hasDistinct(sql))) + { + rownumber.append(sql.substring(orderByIndex)); + } + rownumber.append(") as rownumber_,"); + return rownumber.toString(); + } + + private static boolean hasDistinct(String sql) + { + return sql.toLowerCase().indexOf("select distinct") >= 0; + } + + public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) + { + int startOfSelect = sql.toLowerCase().indexOf("select"); + StringBuffer pagingSelect = new StringBuffer(sql.length() + 100).append(sql.substring(0, startOfSelect)).append("select * from ( select ").append(getRowNumber(sql)); + + if (hasDistinct(sql)) + { + pagingSelect.append(" row_.* from ( ").append(sql.substring(startOfSelect)).append(" ) as row_"); + } + else + { + pagingSelect.append(sql.substring(startOfSelect + 6)); + } + pagingSelect.append(" ) as temp_ where rownumber_ "); + + if (offset > 0) + { + String endString = offsetPlaceholder + "+" + limitPlaceholder; + pagingSelect.append("between " + offsetPlaceholder + "+1 and " + endString); + } + else + { + pagingSelect.append("<= " + limitPlaceholder); + } + return pagingSelect.toString(); + } + + public String getCountSql(String sql) + { + return null; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/DerbyDialect.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/DerbyDialect.java new file mode 100644 index 00000000..7b2243c1 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/DerbyDialect.java @@ -0,0 +1,20 @@ +package org.jeecgframework.core.common.hibernate.dialect; + + +public class DerbyDialect extends Dialect +{ + public boolean supportsLimit() + { + return false; + } + + public boolean supportsLimitOffset() + { + return false; + } + + public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) + { + throw new UnsupportedOperationException("paged queries not supported"); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/Dialect.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/Dialect.java new file mode 100644 index 00000000..90bc73fc --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/Dialect.java @@ -0,0 +1,30 @@ +package org.jeecgframework.core.common.hibernate.dialect; + +public class Dialect +{ + public boolean supportsLimit() + { + return false; + } + + public boolean supportsLimitOffset() + { + return supportsLimit(); + } + + public String getCountSql(String sql) + { + String tmp = "select count(1) amount from (" + sql + ") a"; + return tmp; + } + + public String getLimitString(String sql, int offset, int limit) + { + return getLimitString(sql, offset, Integer.toString(offset), limit, Integer.toString(limit)); + } + + public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) + { + throw new UnsupportedOperationException("paged queries not supported"); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/DialectFactoryBean.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/DialectFactoryBean.java new file mode 100644 index 00000000..38f8c52e --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/DialectFactoryBean.java @@ -0,0 +1,42 @@ +package org.jeecgframework.core.common.hibernate.dialect; + +import org.springframework.beans.factory.FactoryBean; + +public class DialectFactoryBean implements FactoryBean { + public static final String ORACLE = "oracle"; + public static final String MYSQL = "mysql"; + public static final String SQLSERVER = "sqlserver"; + public static final String DB2 = "db2"; + public static final String POSTGRES = "postgres"; + private Dialect dialect; + private String dbType = "mysql"; + + public void setDbType(String dbType) { + this.dbType = dbType; + } + + public Dialect getObject() throws Exception { + if (this.dbType.equals("oracle")) { + this.dialect = new OracleDialect(); + } else if (this.dbType.equals("sqlserver")) { + this.dialect = new SQLServer2005Dialect(); + } else if (this.dbType.equals("db2")) { + this.dialect = new DB2Dialect(); + } else if (this.dbType.equals("mysql")) { + this.dialect = new MySQLDialect(); + } else if (this.dbType.equals("postgres")) { + this.dialect = new PostgreSQLDialect(); + } else { + throw new Exception("娌℃湁璁剧疆鍚堥傜殑鏁版嵁搴撶被鍨"); + } + return this.dialect; + } + + public Class getObjectType() { + return Dialect.class; + } + + public boolean isSingleton() { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/H2Dialect.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/H2Dialect.java new file mode 100644 index 00000000..2afaa0d4 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/H2Dialect.java @@ -0,0 +1,20 @@ +package org.jeecgframework.core.common.hibernate.dialect; + + +public class H2Dialect extends Dialect +{ + public boolean supportsLimit() + { + return true; + } + + public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) + { + return new StringBuffer(sql.length() + 40).append(sql).append(" limit " + limitPlaceholder).toString(); + } + + public boolean supportsLimitOffset() + { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/HSQLDialect.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/HSQLDialect.java new file mode 100644 index 00000000..1a81f2ef --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/HSQLDialect.java @@ -0,0 +1,21 @@ +package org.jeecgframework.core.common.hibernate.dialect; + + +public class HSQLDialect extends Dialect +{ + public boolean supportsLimit() + { + return true; + } + + public boolean supportsLimitOffset() + { + return true; + } + + public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) + { + boolean hasOffset = offset > 0; + return new StringBuffer(sql.length() + 10).append(sql).insert(sql.toLowerCase().indexOf("select") + 6, " top " + limitPlaceholder).toString(); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/MyPostgreSQLDialect.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/MyPostgreSQLDialect.java new file mode 100644 index 00000000..e727ae85 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/MyPostgreSQLDialect.java @@ -0,0 +1,13 @@ +package org.jeecgframework.core.common.hibernate.dialect; + +import org.hibernate.dialect.PostgreSQLDialect; + +public class MyPostgreSQLDialect extends PostgreSQLDialect { + + + public boolean useInputStreamToInsertBlob() { + // TODO Auto-generated method stub + return true; + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/MySQLDialect.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/MySQLDialect.java new file mode 100644 index 00000000..3003cdfd --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/MySQLDialect.java @@ -0,0 +1,25 @@ +package org.jeecgframework.core.common.hibernate.dialect; + + +public class MySQLDialect extends Dialect +{ + public boolean supportsLimitOffset() + { + return true; + } + + public boolean supportsLimit() + { + return true; + } + + public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) + { + if (offset > 0) + { + return sql + " limit " + offsetPlaceholder + "," + limitPlaceholder; + } + + return sql + " limit " + limitPlaceholder; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/OracleDialect.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/OracleDialect.java new file mode 100644 index 00000000..7265a7f3 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/OracleDialect.java @@ -0,0 +1,50 @@ +package org.jeecgframework.core.common.hibernate.dialect; + + +public class OracleDialect extends Dialect +{ + public boolean supportsLimit() + { + return true; + } + + public boolean supportsLimitOffset() + { + return true; + } + + public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) + { + sql = sql.trim(); + boolean isForUpdate = false; + if (sql.toLowerCase().endsWith(" for update")) + { + sql = sql.substring(0, sql.length() - 11); + isForUpdate = true; + } + StringBuffer pagingSelect = new StringBuffer(sql.length() + 100); + if (offset > 0) + { + pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( "); + } + else + { + pagingSelect.append("select * from ( "); + } + pagingSelect.append(sql); + if (offset > 0) + { + String endString = offsetPlaceholder + "+" + limitPlaceholder; + pagingSelect.append(" ) row_ ) where rownum_ <= " + endString + " and rownum_ > " + offsetPlaceholder); + } + else + { + pagingSelect.append(" ) where rownum <= " + limitPlaceholder); + } + if (isForUpdate) + { + pagingSelect.append(" for update"); + } + return pagingSelect.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/PostgreSQLDialect.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/PostgreSQLDialect.java new file mode 100644 index 00000000..d3a4bd10 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/PostgreSQLDialect.java @@ -0,0 +1,20 @@ +package org.jeecgframework.core.common.hibernate.dialect; + + +public class PostgreSQLDialect extends Dialect +{ + public boolean supportsLimit() + { + return true; + } + + public boolean supportsLimitOffset() + { + return true; + } + + public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) + { + return new StringBuffer(sql.length() + 20).append(sql).append(" limit " + limitPlaceholder).toString(); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/SQLServer2005Dialect.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/SQLServer2005Dialect.java new file mode 100644 index 00000000..ec36f51b --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/SQLServer2005Dialect.java @@ -0,0 +1,57 @@ +package org.jeecgframework.core.common.hibernate.dialect; + + +public class SQLServer2005Dialect extends Dialect +{ + public boolean supportsLimit() + { + return true; + } + + public boolean supportsLimitOffset() + { + return true; + } + + public String getLimitString(String querySqlString, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) + { + int start = offset + 1; + StringBuffer pagingBuilder = new StringBuffer(); + String orderby = getOrderByPart(querySqlString); + String distinctStr = ""; + String loweredString = querySqlString.toLowerCase(); + String sqlPartString = querySqlString; + if (loweredString.trim().startsWith("select")) + { + int index = 6; + if (loweredString.startsWith("select distinct")) + { + distinctStr = "DISTINCT "; + index = 15; + } + sqlPartString = sqlPartString.substring(index); + } + pagingBuilder.append(sqlPartString); + + if ((orderby == null) || (orderby.length() == 0)) + { + orderby = "ORDER BY CURRENT_TIMESTAMP"; + } + StringBuffer result = new StringBuffer(); + result.append("WITH query AS (SELECT ").append(distinctStr).append("TOP 100 PERCENT ").append(" ROW_NUMBER() OVER (").append(orderby).append(") as __row_number__, ").append(pagingBuilder).append(") SELECT * FROM query WHERE __row_number__ BETWEEN ").append(start).append(" AND ").append(offset + limit).append(" ORDER BY __row_number__"); + + return result.toString(); + } + + static String getOrderByPart(String sql) + { + String loweredString = sql.toLowerCase(); + int orderByIndex = loweredString.indexOf("order by"); + if (orderByIndex != -1) + { + return sql.substring(orderByIndex); + } + + return ""; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/SQLServerDialect.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/SQLServerDialect.java new file mode 100644 index 00000000..4be177b3 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/SQLServerDialect.java @@ -0,0 +1,37 @@ +package org.jeecgframework.core.common.hibernate.dialect; + + +public class SQLServerDialect extends Dialect +{ + public boolean supportsLimitOffset() + { + return false; + } + + public boolean supportsLimit() + { + return true; + } + + static int getAfterSelectInsertPoint(String sql) + { + int selectIndex = sql.toLowerCase().indexOf("select"); + int selectDistinctIndex = sql.toLowerCase().indexOf("select distinct"); + return selectIndex + (selectDistinctIndex == selectIndex ? 15 : 6); + } + + public String getLimitString(String sql, int offset, int limit) + { + return getLimitString(sql, offset, null, limit, null); + } + + public String getLimitString(String querySelect, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) + { + if (offset > 0) + { + throw new UnsupportedOperationException("sql server has no offset"); + } + + return new StringBuffer(querySelect.length() + 8).append(querySelect).insert(getAfterSelectInsertPoint(querySelect), " top " + limit).toString(); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/dialect/SybaseDialect.java b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/SybaseDialect.java new file mode 100644 index 00000000..66550d9d --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/dialect/SybaseDialect.java @@ -0,0 +1,20 @@ +package org.jeecgframework.core.common.hibernate.dialect; + + +public class SybaseDialect extends Dialect +{ + public boolean supportsLimit() + { + return false; + } + + public boolean supportsLimitOffset() + { + return false; + } + + public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) + { + throw new UnsupportedOperationException("paged queries not supported"); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/qbc/AliasToBean.java b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/AliasToBean.java new file mode 100644 index 00000000..e00fc8b4 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/AliasToBean.java @@ -0,0 +1,67 @@ +package org.jeecgframework.core.common.hibernate.qbc; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import ognl.Ognl; + +import org.hibernate.HibernateException; +import org.hibernate.transform.ResultTransformer; + +import com.opensymphony.xwork2.ognl.OgnlUtil; +import com.opensymphony.xwork2.util.reflection.ReflectionContextState; + +/** + * 姝ょ増鏈繍琛屽湪xwork-core-2.1.6.jar + * 鏀寔灞炴т负鑷畾涔夊璞$殑缁撴灉闆嗚浆鎹㈢殑閮ㄤ唤灞炴ф煡璇 + * 2009-3-30 + * @author 鑻嶉拱 + */ +public class AliasToBean implements ResultTransformer { + private static final long serialVersionUID = 1L; + private static final OgnlUtil ognlUntil = new OgnlUtil(); + private static final Map context = new HashMap(1); + static{ + context.put(ReflectionContextState.CREATE_NULL_OBJECTS, true); + } + + /** POJO鐨刢lass */ + private final Class resultClass; + + public AliasToBean(Class pojoClass) { + if(pojoClass==null) throw new IllegalArgumentException("resultClass cannot be null"); + this.resultClass = pojoClass; + } + + @SuppressWarnings("unchecked") + + public List transformList(List collection) { + return collection; + } + + /** + * 缁撴灉闆嗚浆鎹 + * 2009-4-7 + * @author 鑻嶉拱 + * @param tuple 灞炴у奸泦鍚 + * @param aliases 灞炴у悕闆嗗悎 + * @return 鍗曚釜POJO瀹炰緥--鏌ヨ缁撴灉 + */ + + public Object transformTuple(Object[] tuple, String[] aliases) { + try { + Object root = resultClass.newInstance(); + for (int i = 0; i < aliases.length; i++) { + if(aliases[i]!=null && !aliases[i].equals("")) + { + Ognl.setValue(ognlUntil.compile(aliases[i]), context, root, tuple[i]); + } + } + return root; + } catch (Exception e) { + throw new HibernateException(e.getMessage(),e); + } + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/qbc/CriteriaQuery.java b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/CriteriaQuery.java new file mode 100644 index 00000000..02a9cc53 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/CriteriaQuery.java @@ -0,0 +1,705 @@ +package org.jeecgframework.core.common.hibernate.qbc; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Property; +import org.hibernate.criterion.Restrictions; +import org.hibernate.transform.Transformers; +import org.hibernate.type.Type; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.vo.datatable.DataTables; +import org.jeecgframework.tag.vo.datatable.SortDirection; +import org.jeecgframework.tag.vo.datatable.SortInfo; + +/** + * + *绫绘弿杩帮細CriteriaQuery绫绘槸瀵筯ibernate QBC鏌ヨ鏂规硶鐨勫皝瑁咃紝闇瑕佺殑鍙傛暟鏄綋鍓嶆搷浣滅殑瀹炰綋绫 + *寮犱唬娴 + *@date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:22:15 + *@version 1.0 + */ +@SuppressWarnings({"rawtypes","static-access"}) +public class CriteriaQuery implements Serializable { + public CriteriaQuery() { + + } + + private static final long serialVersionUID = 1L; + private int curPage = 1;// 褰撳墠椤 + private int pageSize = 10;// 榛樿涓椤垫潯鏁 + private String myAction;// 璇锋眰鐨刟ction 鍦板潃 + private String myForm;// form 鍚嶅瓧 + private CriterionList criterionList=new CriterionList();//鑷畾涔夋煡璇㈡潯浠堕泦鍚 + private CriterionList jqcriterionList=new CriterionList();//jquery datatable鎺т欢鐢熸垚鏌ヨ鏉′欢闆嗗悎 + private int isUseimage = 0;// 缈婚〉宸ュ叿鏉℃牱寮 + private DetachedCriteria detachedCriteria; + private static Map map; + private static Map ordermap;//鎺掑簭瀛楁 + private boolean flag = true;// 瀵瑰悓涓瀛楁杩涜绗簩娆¢噸鍛藉悕鏌ヨ鏃跺艰缃瓼ASLE涓嶄繚瀛橀噸鍛藉悕鏌ヨ鏉′欢 + private String field="";//鏌ヨ闇瑕佹樉绀虹殑瀛楁 + private Class entityClass;//POJO + private List results;// 缁撴灉闆 + private int total; + private List alias = new ArrayList();//淇濆瓨鍒涘缓鐨刟liasName 闃叉閲嶅鍒涘缓 + public List getResults() { + return results; + } + + public void setResults(List results) { + this.results = results; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + private DataGrid dataGrid; + private DataTables dataTables; + + public DataTables getDataTables() { + return dataTables; + } + + public void setDataTables(DataTables dataTables) { + this.dataTables = dataTables; + } + + public DataGrid getDataGrid() { + return dataGrid; + } + + public void setDataGrid(DataGrid dataGrid) { + this.dataGrid = dataGrid; + } + + public Class getEntityClass() { + return entityClass; + } + + public void setEntityClass(Class entityClass) { + this.entityClass = entityClass; + } + public CriterionList getJqcriterionList() { + return jqcriterionList; + } + + public void setJqcriterionList(CriterionList jqcriterionList) { + this.jqcriterionList = jqcriterionList; + } + + public CriteriaQuery(Class c) { + this.detachedCriteria = DetachedCriteria.forClass(c); + this.map = new HashMap(); + this.ordermap = new HashMap(); + } + + public CriteriaQuery(Class c, int curPage, String myAction, String myForm) { + this.curPage = curPage; + this.myAction = myAction; + this.myForm = myForm; + this.detachedCriteria = DetachedCriteria.forClass(c); + } + + public CriteriaQuery(Class c, int curPage, String myAction) { + this.myAction = myAction; + this.curPage = curPage; + this.detachedCriteria = DetachedCriteria.forClass(c); + this.map = new HashMap(); + this.ordermap = new HashMap(); + } + + public CriteriaQuery(Class entityClass, int curPage) { + this.curPage = curPage; + this.detachedCriteria = DetachedCriteria.forClass(entityClass); + this.map = new HashMap(); + } + public CriteriaQuery(Class entityClass,DataGrid dg) { + this.curPage = dg.getPage(); + //String[] fieldstring=dg.getField().split(","); + //this.detachedCriteria = DetachedCriteriaUtil + //.createDetachedCriteria(c, "start", "_table",fieldstring); + this.detachedCriteria = DetachedCriteria.forClass(entityClass); + //Criteria criteria = null; + + this.field=dg.getField(); + this.entityClass=entityClass; + this.dataGrid=dg; + this.pageSize=dg.getRows(); + this.map = new HashMap(); + this.ordermap = new HashMap(); + } + public CriteriaQuery(Class entityClass,DataTables dataTables) { + this.curPage = dataTables.getDisplayStart(); + String[] fieldstring=dataTables.getsColumns().split(","); + this.detachedCriteria = DetachedCriteriaUtil + .createDetachedCriteria(entityClass, "start", "_table",fieldstring); + //this.detachedCriteria = DetachedCriteria.forClass(c); + this.field=dataTables.getsColumns(); + this.entityClass=entityClass; + this.dataTables=dataTables; + this.pageSize=dataTables.getDisplayLength(); + this.map = new HashMap(); + this.ordermap = new HashMap(); + addJqCriteria(dataTables); + } + + public CriteriaQuery(Class c, int pageSize, int curPage, + String myAction, String myForm) { + this.pageSize = pageSize; + this.curPage = curPage; + this.myAction = myAction; + this.myForm = myForm; + this.detachedCriteria = DetachedCriteria.forClass(c); + } + + /** + * 鍔犺浇鏉′欢(鏉′欢涔嬮棿鏈夊叧鑱) hql((this_.0 like ? and this_.1 like ?) or this_.2 like ?) + * 琛ㄧず娉昪q.add(cq.or(cq.and(cq, 0, 1), cq, 2))----- hql2:(this_.0 like ? or + * this_.1 like ?) 琛ㄧず娉:cq.add(cq.or(cq, 0, 1)); + * 渚嬪瓙锛歝q.in("TBPrjstatus.code", status); + cq.eq("attn", user.getUserName()); + cq.isNull("attn"); + cq.add(cq.and(cq.or(cq, 1, 2), cq, 0)); + */ + public void add(Criterion c) { + detachedCriteria.add(c); + } + + /** + * 鍔犺浇鏉′欢 + */ + public void add() { + for (int i = 0; i < getCriterionList().size(); i++) { + add(getCriterionList().getParas(i)); + } + getCriterionList().removeAll(getCriterionList()); + } + /** + * 鍔犺浇dataTables 榛樿鏌ヨ鏉′欢 + * @param dataTables + */ + public void addJqCriteria(DataTables dataTables) { + String search=dataTables.getSearch();//鏌ヨ鍏抽敭瀛 + SortInfo[] sortInfo=dataTables.getSortColumns();//鎺掑簭瀛楁 + String[] sColumns=dataTables.getsColumns().split(",");//瀛楁 + if(StringUtil.isNotEmpty(search)) + { + for (String string : sColumns) { + if(string.indexOf("_")==-1) + { + jqcriterionList.addPara(Restrictions.like(string, "%" + search + + "%")); + } + } + add(getOrCriterion(jqcriterionList)); + + } + if(sortInfo.length>0) + { + for (SortInfo sortInfo2 : sortInfo) { + addOrder(""+sColumns[sortInfo2.getColumnId()]+"",sortInfo2.getSortOrder()); + } + } + } + + public void createCriteria(String name) { + detachedCriteria.createCriteria(name); + } + + public void createCriteria(String name, String value) { + detachedCriteria.createCriteria(name, value); + } + + /** + * 鍒涘缓澶栭敭琛ㄥ叧鑱斿璞 + * + * @param name澶栭敭琛ㄥ疄浣撳悕 + * @param value寮曠敤鍚 + */ + public void createAlias(String name, String value) { + if(!alias.contains(name)){ + detachedCriteria.createAlias(name, value); + alias.add(name); + } + } + + public void setResultTransformer(Class class1) { + detachedCriteria.setResultTransformer(Transformers.aliasToBean(class1)); + } + + public void setProjection(Property property) { + detachedCriteria.setProjection(property); + } + + /** + * 璁剧疆鏉′欢涔嬮棿and鍏崇郴 + * + * @param query + * @param source + * @param dest + * hql((this_.0 like ? and this_.1 like ?) or this_.2 like ?) + * 琛ㄧず娉昪q.add(cq.or(cq.and(cq, 0, 1), cq, 2)) + * @return + */ + public Criterion and(CriteriaQuery query, int source, int dest) { + return Restrictions.and(query.getCriterionList().getParas(source), + query.getCriterionList().getParas(dest)); + } + + /** + * 璁剧疆鏉′欢涔嬮棿and鍏崇郴 + * + * @param query + * @param source + * @param dest + * hql:(this_.0 like ? or this_.1 like ?) 琛ㄧず娉:cq.add(cq.or(cq, 0, + * 1)); + * @return + */ + public Criterion and(Criterion c, CriteriaQuery query, int souce) { + return Restrictions.and(c, query.getCriterionList().getParas(souce)); + } + + /** + *鏍规嵁CriterionList缁勫悎宓屽鏉′欢 + */ + public Criterion getOrCriterion(CriterionList list) { + Criterion c1=null; + Criterion c2=null; + Criterion c3=null; + c1=list.getParas(0); + for (int i = 1; i < list.size(); i++) { + c2=list.getParas(i); + c3=getor(c1, c2); + c1=c3; + } + return c3; + } + /** + * 璁剧疆缁勫悎鍚庣殑Criterion OR鍏崇郴 + * + * @param query + * @param source + * @param dest + * @return + */ + public Criterion getor(Criterion c1,Criterion c2) { + return Restrictions.or(c1, c2); + } + + + /** + * 璁剧疆鏉′欢涔嬮棿and鍏崇郴 + * + * @param query + * @param source + * @param dest + * @return + */ + public Criterion and(Criterion c1, Criterion c2) + + { + return Restrictions.and(c1, c2); + } + + /** + * 璁剧疆Or鏌ヨ + * + * @param query + * @param source鏉′欢1 + * @param dest鏉′欢2 + * @return + */ + public Criterion or(CriteriaQuery query, int source, int dest) { + return Restrictions.or(query.getCriterionList().getParas(source), query + .getCriterionList().getParas(dest)); + } + + /** + * 璁剧疆or(Criterion c, CriteriaQuery query, int source)锛堟垨锛夋煡璇㈡潯浠 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + */ + public Criterion or(Criterion c, CriteriaQuery query, int source) { + return Restrictions.or(c, query.getCriterionList().getParas(source)); + } + + /** + * 璁剧疆or(Criterion c1, Criterion c2)锛堟垨锛夋煡璇㈡潯浠 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + * 涓や釜鏉′欢鎴栨煡璇細 Restrictions.or(Restrictions.in("username",list1), + * Restrictions.idEq(1)); 涓変釜鎴栧涓潯浠舵煡璇:锛堜娇鐢ㄥ祵濂楁柟寮忥級 + * criteria.add(Restrictions + * .or(Restrictions.in("username",list1), + * Restrictions.or(Restrictions.idEq(3), Restrictions.idEq(4)))); + */ + public void or(Criterion c1, Criterion c2) { + this.detachedCriteria.add(Restrictions.or(c1, c2)); + } + + /** + * 璁剧疆order锛堟帓搴忥級鏌ヨ鏉′欢 + * + * @param ordername + * 锛氭帓搴忓瓧娈靛悕 + * @param ordervalue + * 锛氭帓搴忓瓧娈靛硷紙"asc","desc"锛 + */ + public void addOrder(String ordername, SortDirection ordervalue) { + ordermap.put(ordername,ordervalue); + + } + /** + * 璁剧疆order锛堟帓搴忥級鏌ヨ鏉′欢 + * + * @param ordername + * 锛氭帓搴忓瓧娈靛悕 + * @param ordervalue + * 锛氭帓搴忓瓧娈靛硷紙"asc","desc"锛 + */ + public void setOrder(Map map) { + for (Map.Entry entry : map.entrySet()) { + judgecreateAlias(entry.getKey()); + if (SortDirection.asc.equals(entry.getValue())) { + detachedCriteria.addOrder(Order.asc(entry.getKey())); + } else { + detachedCriteria.addOrder(Order.desc(entry.getKey())); + } + } + } + + /** + * 鍒涘缓 alias + * @param entitys + * 瑙勫垯 entitys 涓篴.b.c 杩欑灏嗕細鍒涘缓 alias a鍜宎lias b鑰屼笉浼氬垱寤篶 + * 鍥犱负杩欐牱鏇村姞瀹规槗浼犲 + */ + public void judgecreateAlias(String entitys) { + String[] aliass = entitys.split("\\."); + for (int i = 0 ;i getOrdermap() { + return ordermap; + } + + public static void setOrdermap(Map ordermap) { + CriteriaQuery.ordermap = ordermap; + } + + /** + * 璁剧疆eq(鐩哥瓑)鏌ヨ鏉′欢 + * + * @param keyname + * :瀛楁鍚 + * @param keyvalue + * 锛氬瓧娈靛 + */ + public void eq(String keyname, Object keyvalue) { + if (keyvalue != null && keyvalue != "") { + criterionList.addPara(Restrictions.eq(keyname, keyvalue)); + if (flag) { + this.put(keyname, keyvalue); + } + flag = true; + } + } + + /** + * 璁剧疆notEq(涓嶇瓑)鏌ヨ鏉′欢 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + */ + public void notEq(String keyname, Object keyvalue) { + if (keyvalue != null && keyvalue != "") { + criterionList.addPara(Restrictions.ne(keyname, keyvalue)); + if (flag) { + this.put(keyname, keyvalue); + } + flag = true; + } + } + + /** + * 璁剧疆like(妯$硦)鏌ヨ鏉′欢 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + */ + public void like(String keyname, Object keyvalue) { + if (keyvalue != null && keyvalue != "") { + //criterionList.addPara(Restrictions.like(keyname, "%" + keyvalue+ "%")); + criterionList.addPara(Restrictions.like(keyname, keyvalue)); + if (flag) { + this.put(keyname, keyvalue); + } + flag = true; + } + } + + /** + * 璁剧疆gt(>)鏌ヨ鏉′欢 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + */ + public void gt(String keyname, Object keyvalue) { + if (keyvalue != null && keyvalue != "") { + criterionList.addPara(Restrictions.gt(keyname, keyvalue)); + if (flag) { + this.put(keyname, keyvalue); + } + flag = true; + } + } + + /** + * 璁剧疆lt(<)鏌ヨ鏉′欢 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + */ + public void lt(String keyname, Object keyvalue) { + if (keyvalue != null && keyvalue != "") { + criterionList.addPara(Restrictions.lt(keyname, keyvalue)); + if (flag) { + this.put(keyname, keyvalue); + } + flag = true; + } + } + + /** + * 璁剧疆le(<=)鏌ヨ鏉′欢 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + */ + public void le(String keyname, Object keyvalue) { + if (keyvalue != null && keyvalue != "") { + criterionList.addPara(Restrictions.le(keyname, keyvalue)); + if (flag) { + this.put(keyname, keyvalue); + } + flag = true; + } + } + + /** + * 璁剧疆ge(>=)鏌ヨ鏉′欢 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + */ + public void ge(String keyname, Object keyvalue) { + if (keyvalue != null && keyvalue != "") { + criterionList.addPara(Restrictions.ge(keyname, keyvalue)); + if (flag) { + this.put(keyname, keyvalue); + } + flag = true; + } + } + + /** + * 璁剧疆in(鍖呭惈)鏌ヨ鏉′欢 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + */ + public void in(String keyname, Object[] keyvalue) { + if (keyvalue != null && keyvalue[0] != "") { + criterionList.addPara(Restrictions.in(keyname, keyvalue)); + } + } + + /** + * 璁剧疆isNull鏌ヨ鏉′欢 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + */ + public void isNull(String keyname) { + criterionList.addPara(Restrictions.isNull(keyname)); + } + + /** + * 璁剧疆isNull鏌ヨ鏉′欢 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + */ + public void isNotNull(String keyname) { + criterionList.addPara(Restrictions.isNotNull(keyname)); + } + + /** + * 淇濆瓨鏌ヨ鏉′欢 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + */ + public void put(String keyname, Object keyvalue) { + if (keyvalue != null && keyvalue != "") { + map.put(keyname, keyvalue); + } + } + + /** + * 璁剧疆between(涔嬮棿)鏌ヨ鏉′欢 + * + * @param keyname + * @param keyvalue1 + * @param keyvalue2 + */ + public void between(String keyname, Object keyvalue1, Object keyvalue2) { + Criterion c = null;// 鍐欏叆between鏌ヨ鏉′欢 + + if (!keyvalue1.equals(null) && !keyvalue2.equals(null)) { + c = Restrictions.between(keyname, keyvalue1, keyvalue2); + } else if (!keyvalue1.equals(null)) { + c = Restrictions.ge(keyname, keyvalue1); + } else if (!keyvalue2.equals(null)) { + c = Restrictions.le(keyname, keyvalue2); + } + criterionList.add(c); + } + + public void sql(String sql) { + Restrictions.sqlRestriction(sql); + } + + public void sql(String sql, Object[] objects, Type[] type) { + Restrictions.sqlRestriction(sql, objects, type); + } + + public void sql(String sql, Object objects, Type type) { + Restrictions.sqlRestriction(sql, objects, type); + } + + public Integer getCurPage() { + return curPage; + } + + public void setCurPage(Integer curPage) { + this.curPage = curPage; + } + + public int getPageSize() { + return pageSize; + } + + /** + * 璁剧疆鍒嗛〉鏄剧ず鏁 + * + * @param pageSize + */ + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public String getMyAction() { + return myAction; + } + + public void setMyAction(String myAction) { + this.myAction = myAction; + } + + public String getMyForm() { + return myForm; + } + + public void setMyForm(String myForm) { + this.myForm = myForm; + } + + public CriterionList getCriterionList() { + return criterionList; + } + + public void setCriterionList(CriterionList criterionList) { + this.criterionList = criterionList; + } + + public DetachedCriteria getDetachedCriteria() { + return detachedCriteria; + } + + public String getField() { + return field; + } + + public void setField(String field) { + this.field = field; + } + + public void setDetachedCriteria(DetachedCriteria detachedCriteria) { + this.detachedCriteria = detachedCriteria; + } + + public int getIsUseimage() { + return isUseimage; + } + + /** + * 璁剧疆宸ュ叿鏉℃牱寮忥紙0:涓嶅甫鍥剧墖锛1甯﹀浘鐗囷級 + * + * @param isUseimage + */ + public void setIsUseimage(int isUseimage) { + this.isUseimage = isUseimage; + } + + public Map getMap() { + return map; + } + + public void setMap(Map map) { + this.map = map; + } + + public boolean isFlag() { + return flag; + } + + /** + * 瀵瑰悓涓瀛楁杩涜绗簩娆¢噸鍛藉悕鏌ヨ鏃跺艰缃瓼ASLE涓嶄繚瀛橀噸鍛藉悕鏌ヨ鏉′欢 + * + * @param flag + */ + public void setFlag(boolean flag) { + this.flag = flag; + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/qbc/CriterionList.java b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/CriterionList.java new file mode 100644 index 00000000..b4a42be2 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/CriterionList.java @@ -0,0 +1,39 @@ +package org.jeecgframework.core.common.hibernate.qbc; + +import java.util.ArrayList; + +import org.hibernate.criterion.Criterion; +/** +* @ClassName: CriterionList +* @Description: TODO(鏌ヨ鏉′欢闆嗗悎) +* @author jeecg +* @date 2012-10-25 涓婂崍09:32:20 +* + */ +public class CriterionList extends ArrayList { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public final Criterion getParas(final int index) { + return (Criterion) super.get(index); + } + + public final void addPara(final int index, final Criterion p) { + super.add(index, p); + } + + public final void addPara(final Criterion p) { + super.add(p); + } + + public final int indexofPara(final Criterion p) { + return super.indexOf(p); + } + + public final void removePara(final int index) { + super.remove(index); + } +} diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/qbc/DetachedCriteriaUtil.java b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/DetachedCriteriaUtil.java new file mode 100644 index 00000000..9a409949 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/DetachedCriteriaUtil.java @@ -0,0 +1,253 @@ +package org.jeecgframework.core.common.hibernate.qbc; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; + +import org.hibernate.FetchMode; +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Projection; +import org.hibernate.criterion.ProjectionList; +import org.hibernate.criterion.Projections; +import org.hibernate.transform.Transformers; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.StringUtil; + + + +/** + * 鎷艰Hibernate鏉′欢 + */ +public class DetachedCriteriaUtil { + + /** 灏忓啓瀛楁瘝X */ + public static final String MIDDLE_SEPRATOR_CHAR = "x"; + /** 涓や釜绌烘牸 */ + public static final String SEPARATOR_TWO_SPACE = " ";// 涓や釜绌烘牸锛岄伩鍏嶅拰"鏃ユ湡 鏃堕棿"涓殑绌烘牸娣锋穯 + /** 姝ゅ瓧绗︿覆鍐呭涓" <= x <= "锛屼笉鍖呮嫭寮曞彿 */ + static public ProjectionList projectionList; + + + public static ProjectionList getProjectionList() { + return projectionList; + } + + private DetachedCriteriaUtil(){ + //do not allow to create Object + } + + /** + * 鑷姩鎷艰鏉′欢 2008-11-3 + * + * @author 鑻嶉拱 + * @param pojoClazz + * 瀹炰綋绫诲悕 + * @param startChar + * 鍙傛暟缁熶竴鐨勫紑濮嬪瓧绗 + * @param alias + * 鍒悕 + * @return DetachedCriteria 缁勮濂界殑鏌ヨ鏉′欢 + */ + public static DetachedCriteria createDetachedCriteria(Class pojoClazz, + String startChar,String alias) { + return createDetachedCriteria(pojoClazz, startChar, alias,null); + } + + /** + * 鑷姩鎷艰鏉′欢 2008-11-3 + * + * @author 鑻嶉拱 + * @param pojoClazz + * 瀹炰綋绫诲悕 + * @param startChar + * 鍙傛暟缁熶竴鐨勫紑濮嬪瓧绗 + * @param alias + * 鍒悕 + * @param columnNames + * 浣滀负select瀛愬彞鐨勫睘鎬у悕闆嗗悎 + * @return DetachedCriteria 缁勮濂界殑鏌ヨ鏉′欢 + */ + public static DetachedCriteria createDetachedCriteria(Class pojoClazz, + String startChar,String alias,String[] columnNames) { + return createDetachedCriteria(pojoClazz, startChar, alias, columnNames, null); + } + + /** + * 鑷姩鎷艰鏉′欢 2008-11-3 + * + * @author 鑻嶉拱 + * @param pojoClazz + * 瀹炰綋绫诲悕 + * @param startChar + * 鍙傛暟缁熶竴鐨勫紑濮嬪瓧绗 + * @param columnNames + * 浣滀负select瀛愬彞鐨勫睘鎬у悕闆嗗悎 + * @param excludeParameters + * 涓嶄綔涓烘煡璇㈡潯浠剁殑鍙傛暟 + * @param alias + * 鍒悕 + * @return DetachedCriteria 缁勮濂界殑鏌ヨ鏉′欢 + */ + public static DetachedCriteria createDetachedCriteria(Class pojoClazz, + String startChar,String alias,String[] columnNames,String[] excludeParameters) { + DetachedCriteria criteria = DetachedCriteria.forClass(pojoClazz,alias); + if(columnNames!=null && columnNames.length>0){ + //selectColumn(criteria, columnNames, pojoClazz, false); + } + return criteria; + } + + private static final String ALIAS_KEY_IN_REQUEST = "ALIAS_KEY_IN_REQUEST"; + private static final String HAS_JOIN_TABLE_KEY_IN_REQUEST = "HAS_JOIN_TABLE_KEY_IN_REQUEST"; + + private static void setAliasToRequest(HttpServletRequest request,Set aliases) { + request.setAttribute(ALIAS_KEY_IN_REQUEST, aliases); + } + + @SuppressWarnings("unchecked") + private static Set getAliasesFromRequest(){ + Set aliases = (Set) ContextHolderUtils.getRequest().getAttribute(ALIAS_KEY_IN_REQUEST); + if(aliases==null){ + aliases = new HashSet(5); + setAliasToRequest(ContextHolderUtils.getRequest(), aliases); + } + return aliases; + } + + private static boolean getHasJoinTatleFromRequest(){ + Boolean hasJoin = (Boolean) ContextHolderUtils.getRequest().getAttribute(HAS_JOIN_TABLE_KEY_IN_REQUEST); + return hasJoin==null?false:hasJoin; + } + + + + + /** + * 璇ユ柟娉曟彁渚汥etachedCriteria瀵规煡璇㈠瓧娈电殑灏佽锛 2008-9-29 + * 2009.9.9淇敼鍚庯紝鍙敮鎸佹棤闄愮骇鑱斿彇閮ㄥ垎瀛楁锛屽鍙栧涓嬪瓧娈 + * user.organization.parentOrganization.parentOrganization.orgName + * 浣嗚娉ㄦ剰1鐐 ,杩炴帴閲囩敤鍐呰仈锛岀骇鑱旇秺澶氾紝缁撴灉闆嗗彲鑳藉氨瓒婂皯锛 + * @author + * @param columnNames + * 瀛楃涓叉暟缁勶紝浠ユ暟鎹殑褰㈠紡鎺ユ敹瑕佹煡璇㈢殑瀛楁灞炴э紝濡係tring[] column={"灞炴1","灞炴2","灞炴3"}; + * @param pojoClass + * 瀹炰綋绫荤殑Class,濡侻obile.class; + * @param aials + * 涓鸿鏌ヨ鐨凱OJO瀵硅薄鎸囧畾涓涓埆鍚 + * @return DetachedCriteria 鐨勪竴涓璞★紝濡傛灉闇瑕佹煡璇㈡潯浠讹紝鍦ㄤ簺瀵硅薄鍚庤拷鍔犳煡璇㈡潯浠躲 + * + * @param forJoinTable 鏄惁澶氳〃杩炴帴鏌ヨ + */ + public static void selectColumn(DetachedCriteria criteria, String[] columnNames, + Class pojoClass,boolean forJoinTable) { + if (null == columnNames) { + return; + } + + //浣跨敤杩欎釜涓存椂鍙橀噺闆嗗悎锛屾槸鍥犱负dinstinct鍏抽敭瀛楄鏀惧湪鏈鍓嶉潰锛岃宒istinct鍏抽敭瀛楄鍦ㄤ笅闈㈡墠鍐冲畾鏀句笉鏀撅紝 + List tempProjectionList = new ArrayList(); + + Set aliases = getAliasesFromRequest(); + boolean hasJoniTable = false; + String rootAlias = criteria.getAlias(); + for (String property : columnNames) { + if(property.contains("_")){ + String[] propertyChain = property.split("_"); + createAlias(criteria,rootAlias,aliases,propertyChain,0); + tempProjectionList.add(Projections.property(StringUtil.getProperty(property)).as(StringUtil.getProperty(property))); + hasJoniTable = true; + }else{ + tempProjectionList.add(Projections.property(rootAlias + POINT + property).as(property)); + } + } + + projectionList = Projections.projectionList(); + if(hasJoniTable || forJoinTable || getHasJoinTatleFromRequest()){//杩欎釜涓瀹氳鏀惧湪tempProjectionList鐨勫墠闈紝鍥犱负distinct瑕佸湪鏈鍓嶉潰 + projectionList.add(Projections.distinct(Projections.id())); + } + + for (Projection proj : tempProjectionList) { + projectionList.add(proj); + } + + criteria.setProjection(projectionList); + + + if(!hasJoniTable){ + criteria.setResultTransformer(Transformers.aliasToBean(pojoClass)); + }else{//涓嬮潰杩欎釜鏄嚜瀹氫箟鐨勭粨鏋滆浆鎹㈠櫒 + criteria.setResultTransformer(new AliasToBean(pojoClass)); + } + } + + private static final String POINT = "."; + + /** + * 鍒涘缓鍒悕 + * @author 鑻嶉拱 + * 2009-9-9 + * @param criteria + * @param rootAlais + * @param aliases + * @param columns + * @param currentStep + */ + private static void createAlias(DetachedCriteria criteria, String rootAlais, Set aliases,String[] columns,int currentStep){ + if(currentStep0){ + criteria.createAlias(converArrayToAlias(columns, currentStep-1) + POINT +columns[currentStep], converArrayToAlias(columns, currentStep)).setFetchMode(columns[currentStep], FetchMode.JOIN); + }else{ + criteria.createAlias(rootAlais + POINT +columns[currentStep], converArrayToAlias(columns, currentStep)).setFetchMode(columns[currentStep], FetchMode.JOIN); + } + aliases.add(converArrayToAlias(columns, currentStep)); + } + currentStep++; + createAlias(criteria, rootAlais, aliases, columns, currentStep); + } + } + + + /** + * 浠"organization.parentOrganization.parentOrganization.parentOrganization.id" 寰楀埌 + * "organization_parentOrganization_parentOrganization_parentOrganization.id" + * @author 鑻嶉拱 + * 2009-9-20 + * @param property + * @return + */ + public static String getAliasFromPropertyChainString(String property){ + if(property.contains(".")){ + return property.substring(0, property.lastIndexOf(POINT)).replaceAll("\\.", "_") + property.substring(property.lastIndexOf(POINT)); + + } + return property; + } + + /** + * 浠庢暟缁勪腑鍒涘缓ALIAS + * @author 鑻嶉拱 + * 2009-9-10 + * @param columns + * @param currentStep + * @return + */ + private static String converArrayToAlias(String[] columns,int currentStep){ + StringBuilder alias = new StringBuilder(); + for (int i = 0; i <= currentStep; i++) { + if(alias.length()>0){ + alias.append("_"); + } + alias.append(columns[i]); + } + return alias.toString(); + } + + + + +} diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/qbc/HqlQuery.java b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/HqlQuery.java new file mode 100644 index 00000000..97ec6c14 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/HqlQuery.java @@ -0,0 +1,154 @@ +package org.jeecgframework.core.common.hibernate.qbc; + +import java.util.List; +import java.util.Map; + +import org.hibernate.type.Type; +import org.jeecgframework.core.common.model.json.DataGrid; + +public class HqlQuery { + private int curPage =1; + private int pageSize = 10; + private String myaction; + private String myform; + private String queryString; + private Object[] param; + private Type[] types; + private Map map; + private DataGrid dataGrid; + private String field="";//鏌ヨ闇瑕佹樉绀虹殑瀛楁 + private Class class1; + private List results;// 缁撴灉闆 + private int total; + public List getResults() { + return results; + } + + public void setResults(List rsults) { + this.results = results; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public Class getClass1() { + return class1; + } + + public void setClass1(Class class1) { + this.class1 = class1; + } + public DataGrid getDataGrid() { + return dataGrid; + } + + public void setDataGrid(DataGrid dataGrid) { + this.dataGrid = dataGrid; + } + + public String getField() { + return field; + } + + public void setField(String field) { + this.field = field; + } + + public Map getMap() { + return map; + } + + public void setMap(Map map) { + this.map = map; + } + + public HqlQuery(String queryString, Object[] param, Map map) { + this.queryString = queryString; + this.param = param; + this.map = map; + } + + public HqlQuery(String queryString, Map map) { + this.queryString = queryString; + this.map = map; + } + + public HqlQuery(String myaction) { + this.myaction = myaction; + } + + public Object[] getParam() { + return param; + } + + public HqlQuery(String myaction, String queryString, Object[] param, Type[] types) { + this.myaction = myaction; + this.queryString = queryString; + this.param = param; + this.types = types; + } + public HqlQuery(Class class1,String hqlString,DataGrid dataGrid) { + this.dataGrid=dataGrid; + this.queryString=hqlString; + this.pageSize=dataGrid.getRows(); + this.field=dataGrid.getField(); + this.class1=class1; + } + + public void setParam(Object[] param) { + this.param = param; + } + public int getCurPage() { + return curPage; + } + + public void setCurPage(int curPage) { + this.curPage = curPage; + } + + public String getMyaction() { + return myaction; + } + + public void setMyaction(String myaction) { + this.myaction = myaction; + } + + public String getMyform() { + return myform; + } + + public void setMyform(String myform) { + this.myform = myform; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public String getQueryString() { + return queryString; + } + + public void setQueryString(String queryString) { + this.queryString = queryString; + } + + public Type[] getTypes() { + return types; + } + + public void setTypes(Type[] types) { + this.types = types; + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/qbc/PageList.java b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/PageList.java new file mode 100644 index 00000000..e712473f --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/PageList.java @@ -0,0 +1,88 @@ +package org.jeecgframework.core.common.hibernate.qbc; + +import java.util.List; +/** + * + *绫绘弿杩帮細鍒嗛〉鏌ヨ缁撴灉灏佽绫 + *寮犱唬娴 + *@date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:20:04 + *@version 1.0 + */ +@SuppressWarnings("unchecked") +public class PageList { + private int curPageNO; + private int offset; + private String toolBar;//鍒嗛〉宸ュ叿鏉 + private int count; + private List resultList = null;//缁撴灉闆 + public PageList() { + + } + /** + * 涓嶄娇鐢ㄥ垎椤垫爣绛剧殑鍒濆鍖栨瀯閫犳柟娉 + * @param resultList + * @param toolBar + * @param offset + * @param curPageNO + * @param count + */ + public PageList(List resultList, String toolBar, int offset, int curPageNO, int count) { + this.curPageNO = curPageNO; + this.offset = offset; + this.toolBar = toolBar; + this.resultList = resultList; + this.count = count; + } + /** + * 浣跨敤鍒嗛〉鏍囩鐨勫垵濮嬪寲鏋勯犳柟娉 + * @param resultList + * @param toolBar + * @param offset + * @param curPageNO + * @param count + */ + public PageList(CriteriaQuery cq,List resultList, int offset, int curPageNO, int count) { + this.curPageNO = curPageNO; + this.offset = offset; + this.resultList = resultList; + this.count = count; + } + public PageList(HqlQuery cq,List resultList, int offset, int curPageNO, int count) { + this.curPageNO = curPageNO; + this.offset = offset; + this.resultList = resultList; + this.count = count; + } + public List getResultList() { + return resultList; + } + + public void setResultList(List resultList) { + this.resultList = resultList; + } + + public String getToolBar() { + return toolBar; + } + + public int getCount() { + return count; + } + + public int getCurPageNO() { + return curPageNO; + } + + public void setCurPageNO(int curPageNO) { + this.curPageNO = curPageNO; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/qbc/Pager.java b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/Pager.java new file mode 100644 index 00000000..fa702b6e --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/Pager.java @@ -0,0 +1,167 @@ +package org.jeecgframework.core.common.hibernate.qbc; + +import java.util.Map; +/** + * 鏍囩鐢熸垚绫(涓嶄娇鐢ㄥ垎椤垫爣绛) + * @author jeecg + * @version1.0 + */ +public class Pager { + private int curPageNO = 1; // 褰撳墠椤 + private int pageSize; // 姣忛〉鏄剧ず鐨勮褰曟暟 + private int rowsCount; // 璁板綍琛屾暟 + private int pageCount; // 椤垫暟 + private Map map;// 灏佽鏌ヨ鏉′欢 + + /** + * @param allCount + * 璁板綍琛屾暟 + * @param offset + * 璁板綍寮濮嬫暟鐩 + * @param pageSize + * 姣忛〉鏄剧ず鐨勮褰曟暟 + */ + public Pager(int allCount,int curPagerNo, int pageSize, Map map) { + this.curPageNO = curPagerNo; + this.pageSize = pageSize; + this.rowsCount = allCount; + this.map = map; + this.pageCount = (int) Math.ceil((double) allCount / pageSize); + } + + public Pager() { + } + // getPageSize锛氳繑鍥炲垎椤靛ぇ灏 + public int getPageSize() { + return pageSize; + } + + // getRowsCount锛氳繑鍥炴昏褰曡鏁 + public int getRowsCount() { + return rowsCount; + } + + // getPageCount锛氳繑鍥炴婚〉鏁 + public int getPageCount() { + return pageCount; + } + + // 绗竴椤 + public int first() { + return 1; + } + + // 鏈鍚庝竴椤 + public int last() { + return pageCount; + } + + // 涓婁竴椤 + public int previous() { + return (curPageNO - 1 < 1) ? 1 : curPageNO - 1; + } + + // 涓嬩竴椤 + public int next() { + return (curPageNO + 1 > pageCount) ? pageCount : curPageNO + 1; + } + + // 绗竴椤 + public boolean isFirst() { + return (curPageNO == 1) ? true : false; + } + + // 鏈鍚庝竴椤 + public boolean isLast() { + return (curPageNO == pageCount) ? true : false; + } + public String toString() { + return "Pager鐨勫间负 " + " curPageNO = " + curPageNO + " limit = " + pageSize + " rowsCount = " + rowsCount + " pageCount = " + pageCount; + } + + /** + * 鑾峰彇宸ュ叿鏉 涓嶇敤鍥剧墖鐨勶紝鐢ㄤ笅鎷夋 + * + * @return String + */ + public String getToolBar(String url) { + + String temp = ""; + String conditions = ""; + if (map.size() > 0) { + + for (Map.Entry entry : map.entrySet()) { + conditions += "&" + entry.getKey() + "=" + entry.getValue(); + } + } + if (url.indexOf("?") == -1) { + temp = "?"; + } else { + temp = "&"; + } + String str = ""; + str += ""; + if (isFirst()) + str += "绗" + curPageNO + "椤 鍏" + pageCount + "椤 棣栭〉 涓婁竴椤 "; + else { + str += "绗" + curPageNO + "椤 鍏" + pageCount + "椤 棣栭〉 "; + str += "涓婁竴椤 "; + } + if (isLast() || rowsCount == 0) + str += "涓嬩竴椤 灏鹃〉 "; + else { + str += "涓嬩竴椤 "; + str += "灏鹃〉 "; + } + str += " 鍏" + rowsCount + "鏉¤褰 "; + + str += " 杞埌"; + + return str; + } + + /** + * 鑾峰彇宸ュ叿鏉 + * + * @return String + */ + public String getToolBar(String myaction, String myform) { + String str = ""; + str += "" + "\n"; + str += " 
    " + rowsCount + "鏉 褰撳墠绗" + curPageNO + "/" + pageCount + "椤   "; + if (curPageNO == 1 || curPageNO == 0) + str += " "; + else { + str += ""; + str += ""; + } + if (curPageNO - pageCount == 0 || pageCount == 0 || pageCount == 1) + str += "  "; + else { + str += ""; + str += ""; + } + + if (pageCount == 1 || pageCount == 0) { + str += "  杞埌: 椤 "; + str += "
    "; + } else { + str += "  杞埌: 椤 "; + str += ""; + } + return str; + } +} diff --git a/src/main/java/org/jeecgframework/core/common/hibernate/qbc/PagerUtil.java b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/PagerUtil.java new file mode 100644 index 00000000..a2b036b5 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/hibernate/qbc/PagerUtil.java @@ -0,0 +1,76 @@ +package org.jeecgframework.core.common.hibernate.qbc; + +import java.util.Map; + +import org.omg.CORBA.PUBLIC_MEMBER; +/** + *绫绘弿杩帮細鍒嗛〉宸ュ叿绫 + *寮犱唬娴 + *@date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:19:14 + *@version 1.0 + */ +public class PagerUtil { + public PagerUtil() { + + } + + public static String getBar(String action, String form, int allCounts, int curPageNO, int pageSize, Map map) { + Pager pager = null; + try { + if (curPageNO > (int) Math.ceil((double) allCounts / pageSize)) + curPageNO = (int) Math.ceil((double) allCounts / pageSize); + if (curPageNO <= 1) + curPageNO = 1; + // 寰楀埌offset + pager = new Pager(allCounts, curPageNO, pageSize, map); + } catch (Exception e) { + org.jeecgframework.core.util.LogUtil.info("鐢熸垚宸ュ叿鏉″嚭閿!"); + } + return pager.getToolBar(action, form); + } + + public static String getBar(String url, int allCounts, int curPageNO, int pageSize, Map map) { + Pager pager = null; + try { + if (curPageNO > (int) Math.ceil((double) allCounts / pageSize)) + curPageNO = (int) Math.ceil((double) allCounts / pageSize); + if (curPageNO <= 1) + curPageNO = 1; + // 寰楀埌offset + // 鐢熸垚宸ュ叿鏉 + pager = new Pager(allCounts, curPageNO, pageSize, map); + } catch (Exception e) { + org.jeecgframework.core.util.LogUtil.info("鐢熸垚宸ュ叿鏉″嚭閿!"); + } + return pager.getToolBar(url); + } + + public static int getOffset(int rowCounts, int curPageNO, int pageSize) { + int offset = 0; + try { + if (curPageNO > (int) Math.ceil((double) rowCounts / pageSize)) + curPageNO = (int) Math.ceil((double) rowCounts / pageSize); + // 寰楀埌绗嚑椤 + if (curPageNO <= 1) + curPageNO = 1; + // 寰楀埌offset + offset = (curPageNO - 1) * pageSize; + } catch (Exception e) { + org.jeecgframework.core.util.LogUtil.info("getOffset鍑洪敊!"); + } + return offset; + } + + public static int getcurPageNo(int rowCounts, int curPageNO, int pageSize) { + try { + // 寰楀埌绗嚑椤 + if (curPageNO > (int) Math.ceil((double) rowCounts / pageSize)) + curPageNO = (int) Math.ceil((double) rowCounts / pageSize); + if (curPageNO <= 1) + curPageNO = 1; + } catch (Exception e) { + org.jeecgframework.core.util.LogUtil.info("getOffset鍑洪敊!"); + } + return curPageNO; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/model/common/DBTable.java b/src/main/java/org/jeecgframework/core/common/model/common/DBTable.java new file mode 100644 index 00000000..e334b49d --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/common/DBTable.java @@ -0,0 +1,51 @@ +package org.jeecgframework.core.common.model.common; + +import java.io.Serializable; +import java.util.List; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +/** + * + * @author Hank + * 淇敼浜2014-01-25 娣诲姞List 娉ㄥ叆鏌ヨ鍒扮殑琛ㄦ暟鎹 淇敼class1-->tableEntityClass + * @param + */ +public class DBTable implements Serializable { + + public String tableName; + public String entityName; + public String tableTitle; + public Class tableEntityClass; + public List tableData; + public String getTableName() { + return tableName; + } + public void setTableName(String tableName) { + this.tableName = tableName; + } + public String getEntityName() { + return entityName; + } + public void setEntityName(String entityName) { + this.entityName = entityName; + } + public String getTableTitle() { + return tableTitle; + } + public void setTableTitle(String tableTitle) { + this.tableTitle = tableTitle; + } + public Class getClass1() { + return tableEntityClass; + } + public void setClass1(Class class1) { + this.tableEntityClass = class1; + } + public List getTableData() { + return tableData; + } + public void setTableData(List tableData) { + this.tableData = tableData; + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/model/common/UploadFile.java b/src/main/java/org/jeecgframework/core/common/model/common/UploadFile.java new file mode 100644 index 00000000..e8c42e89 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/common/UploadFile.java @@ -0,0 +1,211 @@ +package org.jeecgframework.core.common.model.common; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.springframework.web.multipart.MultipartHttpServletRequest; + + +/** + * 涓婁紶涓嬭浇妯″瀷绫 + * + * @author 寮犱唬娴 + * + */ +public class UploadFile { + private String byteField = "attachmentcontent";// 浜岃繘鍒舵枃浠跺唴瀹逛繚瀛樺埌鏁版嵁搴撶殑瀵瑰簲瀹炰綋绫诲瓧娈 + private String titleField = "attachmenttitle";// 鏂囦欢鍚(鏍囬)淇濆瓨鍒版暟鎹簱鐨勫搴斿疄浣撶被瀛楁 + private String basePath = "upload";// 鏂囦欢淇濆瓨鐩綍鏍硅矾寰 + private String realPath = "realpath";// 鏂囦欢淇濆瓨鍦ㄧ‖鐩樼殑鍏ㄨ矾寰勫搴斿疄浣撳瓧娈 + private String extend = "extend";// 鎵╁睍鍚 + private boolean view = false;// 鏄惁鏄瑙 + private boolean rename =true;// 鏄惁閲嶅懡鍚 + private String swfpath;// 杞崲SWF + private String cusPath;// 鏂囦欢鐗╃悊璺緞鑷畾涔夊瓙鐩綍 + private byte[] content;// 棰勮鎴栦笅杞芥椂浼犲叆鐨勬枃浠朵簩杩涘埗鍐呭 + private Object object;// 鏂囦欢瀵瑰簲瀹炰綋瀵硅薄 + private String fileKey;// 涓婁紶鏂囦欢ID + private MultipartHttpServletRequest multipartRequest; + private HttpServletRequest request; + private HttpServletResponse response; + + /** + * @param response + * the response to set + */ + public void setResponse(HttpServletResponse response) { + this.response = response; + } + + public UploadFile(HttpServletRequest request, Object object) { + String fileKey = oConvertUtils.getString(request.getParameter("fileKey"));// 鏂囦欢ID + if (StringUtil.isNotEmpty(fileKey)) { + this.fileKey = fileKey; + this.request = request; + } else { + this.multipartRequest = (MultipartHttpServletRequest) request; + } + this.object = object; + } + + public UploadFile(HttpServletRequest request) { + this.multipartRequest = (MultipartHttpServletRequest) request; + + } + + public UploadFile(HttpServletRequest request, HttpServletResponse response) { + this.request = request; + this.response = response; + } + + public UploadFile() { + + } + + public String getSwfpath() { + return swfpath; + } + + public void setSwfpath(String swfpath) { + this.swfpath = swfpath; + } + + /** + * @return the realPath + */ + public String getRealPath() { + return realPath; + } + + /** + * @param realPath + * the realPath to set + */ + public void setRealPath(String realPath) { + this.realPath = realPath; + } + + /** + * @return the response + */ + public HttpServletResponse getResponse() { + return response; + } + + /** + * @return the request + */ + public HttpServletRequest getRequest() { + return request; + } + + /** + * @param request + * the request to set + */ + public void setRequest(HttpServletRequest request) { + this.request = request; + } + + /** + * @return the multipartRequest + */ + public MultipartHttpServletRequest getMultipartRequest() { + return multipartRequest; + } + + public String get(String name) { + return getMultipartRequest().getParameter(name); + + } + + /** + * @param multipartRequest + * the multipartRequest to set + */ + public void setMultipartRequest(MultipartHttpServletRequest multipartRequest) { + this.multipartRequest = multipartRequest; + } + + public Object getObject() { + return object; + } + + public String getBasePath() { + return basePath; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + } + + public void setObject(Object object) { + this.object = object; + } + + public String getByteField() { + return byteField; + } + + public void setByteField(String byteField) { + this.byteField = byteField; + } + + public String getTitleField() { + return titleField; + } + + public void setTitleField(String titleField) { + this.titleField = titleField; + } + + public String getCusPath() { + return cusPath; + } + + public void setCusPath(String cusPath) { + this.cusPath = cusPath; + } + + public String getExtend() { + return extend; + } + + public void setExtend(String extend) { + this.extend = extend; + } + + public boolean isView() { + return view; + } + + public void setView(boolean view) { + this.view = view; + } + + public byte[] getContent() { + return content; + } + + public void setContent(byte[] content) { + this.content = content; + } + + public String getFileKey() { + return fileKey; + } + + public void setFileKey(String fileKey) { + this.fileKey = fileKey; + } + public boolean isRename() { + return rename; + } + + public void setRename(boolean rename) { + this.rename = rename; + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/model/json/AjaxJson.java b/src/main/java/org/jeecgframework/core/common/model/json/AjaxJson.java new file mode 100644 index 00000000..be20fac3 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/json/AjaxJson.java @@ -0,0 +1,58 @@ +package org.jeecgframework.core.common.model.json; + +import java.util.Map; + +import com.alibaba.fastjson.JSONObject; + +/** + * $.ajax鍚庨渶瑕佹帴鍙楃殑JSON + * + * @author + * + */ +public class AjaxJson { + + private boolean success = true;// 鏄惁鎴愬姛 + private String msg = "鎿嶄綔鎴愬姛";// 鎻愮ず淇℃伅 + private Object obj = null;// 鍏朵粬淇℃伅 + private Map attributes;// 鍏朵粬鍙傛暟 + public Map getAttributes() { + return attributes; + } + + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Object getObj() { + return obj; + } + + public void setObj(Object obj) { + this.obj = obj; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + public String getJsonStr(){ + JSONObject obj = new JSONObject(); + obj.put("success", this.isSuccess()); + obj.put("msg", this.getMsg()); + obj.put("obj", this.obj); + obj.put("attributes", this.attributes); + return obj.toJSONString(); + } +} diff --git a/src/main/java/org/jeecgframework/core/common/model/json/ComboBox.java b/src/main/java/org/jeecgframework/core/common/model/json/ComboBox.java new file mode 100644 index 00000000..37a6d9c2 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/json/ComboBox.java @@ -0,0 +1,38 @@ +package org.jeecgframework.core.common.model.json; + + +/** + * 鍚庡彴鍚戝墠鍙拌繑鍥濲SON锛岀敤浜巈asyui鐨刣atagrid + * + * @author + * + */ +public class ComboBox { + + private String id; + private String text; + private boolean selected; + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public boolean isSelected() { + return selected; + } + + public void setSelected(boolean selected) { + this.selected = selected; + } +} diff --git a/src/main/java/org/jeecgframework/core/common/model/json/ComboTree.java b/src/main/java/org/jeecgframework/core/common/model/json/ComboTree.java new file mode 100644 index 00000000..a85e6e51 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/json/ComboTree.java @@ -0,0 +1,72 @@ +package org.jeecgframework.core.common.model.json; + +import java.util.List; +import java.util.Map; + + +public class ComboTree implements java.io.Serializable { + + private String id; + private String text;// 鏍戣妭鐐瑰悕绉 + private String iconCls;// 鍓嶉潰鐨勫皬鍥炬爣鏍峰紡 + private Boolean checked = false;// 鏄惁鍕鹃夌姸鎬 + private Map attributes;// 鍏朵粬鍙傛暟 + private List children;// 瀛愯妭鐐 + private String state = "open";// 鏄惁灞曞紑(open,closed) + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public Boolean getChecked() { + return checked; + } + + public void setChecked(Boolean checked) { + this.checked = checked; + } + + public Map getAttributes() { + return attributes; + } + + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getIconCls() { + return iconCls; + } + + public void setIconCls(String iconCls) { + this.iconCls = iconCls; + } +} diff --git a/src/main/java/org/jeecgframework/core/common/model/json/DataGrid.java b/src/main/java/org/jeecgframework/core/common/model/json/DataGrid.java new file mode 100644 index 00000000..f74e8bba --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/json/DataGrid.java @@ -0,0 +1,111 @@ +package org.jeecgframework.core.common.model.json; + +import java.util.List; + +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.tag.vo.datatable.SortDirection; + + +/** + * easyui鐨刣atagrid鍚戝悗鍙颁紶閫掑弬鏁颁娇鐢ㄧ殑model + * + * @author + * + */ +public class DataGrid { + + private int page = 1;// 褰撳墠椤 + private int rows = 10;// 姣忛〉鏄剧ず璁板綍鏁 + private String sort = null;// 鎺掑簭瀛楁鍚 + private SortDirection order = SortDirection.asc;// 鎸変粈涔堟帓搴(asc,desc) + private String field;//瀛楁 + private String treefield;//鏍戝舰鏁版嵁琛ㄦ枃鏈瓧娈 + private List results;// 缁撴灉闆 + private int total;//鎬昏褰曟暟 + private String footer;//鍚堣鍒 + private String sqlbuilder;//鍚堣鍒 + + public String getSqlbuilder() { + return sqlbuilder; + } + + public void setSqlbuilder(String sqlbuilder) { + this.sqlbuilder = sqlbuilder; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public String getField() { + return field; + } + + public List getResults() { + return results; + } + + public void setResults(List results) { + this.results = results; + } + + public void setField(String field) { + this.field = field; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public int getRows() { + if(ContextHolderUtils.getRequest()!=null&&ResourceUtil.getParameter("rows")!=null){ + return rows; + } + return 10000; + } + + public void setRows(int rows) { + this.rows = rows; + } + + public String getSort() { + return sort; + } + + public void setSort(String sort) { + this.sort = sort; + } + + public SortDirection getOrder() { + return order; + } + + public void setOrder(SortDirection order) { + this.order = order; + } + public String getTreefield() { + return treefield; + } + + public void setTreefield(String treefield) { + this.treefield = treefield; + } + + public String getFooter() { + return footer; + } + + public void setFooter(String footer) { + this.footer = footer; + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/model/json/DataGridReturn.java b/src/main/java/org/jeecgframework/core/common/model/json/DataGridReturn.java new file mode 100644 index 00000000..78b44e8d --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/json/DataGridReturn.java @@ -0,0 +1,46 @@ +package org.jeecgframework.core.common.model.json; + +import java.util.List; + +/** + * 鍚庡彴鍚戝墠鍙拌繑鍥濲SON锛岀敤浜巈asyui鐨刣atagrid + * + * @author + * + */ +public class DataGridReturn { + + public DataGridReturn(Integer total, List rows) { + this.total = total; + this.rows = rows; + } + + private Integer total;// 鎬昏褰曟暟 + private List rows;// 姣忚璁板綍 + private List footer; + + public Integer getTotal() { + return total; + } + + public void setTotal(Integer total) { + this.total = total; + } + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public List getFooter() { + return footer; + } + + public void setFooter(List footer) { + this.footer = footer; + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/model/json/Highchart.java b/src/main/java/org/jeecgframework/core/common/model/json/Highchart.java new file mode 100644 index 00000000..1052bf81 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/json/Highchart.java @@ -0,0 +1,31 @@ +package org.jeecgframework.core.common.model.json; +import java.util.List; +/** + * 缁熻鎶ヨ〃妯″瀷 + * @author 寮犱唬娴 + * + */ +public class Highchart { +private String name; +private String type;//绫诲瀷 +private List data;//鏁版嵁 +public String getName() { + return name; +} +public void setName(String name) { + this.name = name; +} +public List getData() { + return data; +} +public void setData(List data) { + this.data = data; +} +public String getType() { + return type; +} +public void setType(String type) { + this.type = type; +} + +} diff --git a/src/main/java/org/jeecgframework/core/common/model/json/ImportFile.java b/src/main/java/org/jeecgframework/core/common/model/json/ImportFile.java new file mode 100644 index 00000000..6eaf8a76 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/json/ImportFile.java @@ -0,0 +1,77 @@ +package org.jeecgframework.core.common.model.json; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.multipart.MultipartHttpServletRequest; + +/** + * 涓婁紶涓嬭浇妯″瀷绫 + * + * @author 寮犱唬娴 + * + */ +public class ImportFile { + private Object object;// 瀵煎嚭瀹炰綋瀵硅薄 + private String fileName;// 鏂囦欢淇濆瓨鍦ㄧ‖鐩樼殑鍏ㄨ矾寰勫搴斿疄浣撳瓧娈 + private String entityName;//瀵煎嚭瀹炰綋鍚 + private String field; + private Class entityClass; + private MultipartHttpServletRequest multipartRequest; + private HttpServletRequest request; + private HttpServletResponse response; + public Object getObject() { + return object; + } + public void setObject(Object object) { + this.object = object; + } + + public Class getEntityClass() { + return entityClass; + } + public void setEntityClass(Class entityClass) { + this.entityClass = entityClass; + } + public String getFileName() { + return fileName; + } + public void setFileName(String fileName) { + this.fileName = fileName; + } + public String getEntityName() { + return entityName; + } + public void setEntityName(String entityName) { + this.entityName = entityName; + } + public MultipartHttpServletRequest getMultipartRequest() { + return multipartRequest; + } + public void setMultipartRequest(MultipartHttpServletRequest multipartRequest) { + this.multipartRequest = multipartRequest; + } + public HttpServletRequest getRequest() { + return request; + } + public void setRequest(HttpServletRequest request) { + this.request = request; + } + public HttpServletResponse getResponse() { + return response; + } + public void setResponse(HttpServletResponse response) { + this.response = response; + } + + public ImportFile(HttpServletRequest request, HttpServletResponse response) { + this.request = request; + this.response = response; + } + public String getField() { + return field; + } + public void setField(String field) { + this.field = field; + } +} diff --git a/src/main/java/org/jeecgframework/core/common/model/json/LogAnnotation.java b/src/main/java/org/jeecgframework/core/common/model/json/LogAnnotation.java new file mode 100644 index 00000000..4def82ea --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/json/LogAnnotation.java @@ -0,0 +1,18 @@ +package org.jeecgframework.core.common.model.json; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.ElementType; + +/** + * @author pengjin + * @version 2.1 + * @since 2.1 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface LogAnnotation { + String operateModelNm(); + String operateFuncNm(); + String operateDescribe(); +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/common/model/json/ProjectDeclare.java b/src/main/java/org/jeecgframework/core/common/model/json/ProjectDeclare.java new file mode 100644 index 00000000..268b238b --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/json/ProjectDeclare.java @@ -0,0 +1,64 @@ +package org.jeecgframework.core.common.model.json; + +import org.codehaus.jackson.annotate.JsonIgnoreProperties; + +@JsonIgnoreProperties(value = { "hibernateLazyInitializer" }) +public class ProjectDeclare { + + private Integer detialid;//鏄庣粏缂栧彿 + private Integer declareid;//鐢虫姤缂栧彿 + private String constructionunit;//寤鸿鍗曚綅 + private String projectname;//椤圭洰鍚嶇О + private String statusid;//鐘舵 + private String buildingno;//鏍嬪彿 + private Double undergroundconstructionarea;//鍦颁笅寤虹瓚闈㈢Н + private String geom; + public Integer getDetialid() { + return detialid; + } + public void setDetialid(Integer detialid) { + this.detialid = detialid; + } + public Integer getDeclareid() { + return declareid; + } + public void setDeclareid(Integer declareid) { + this.declareid = declareid; + } + public String getConstructionunit() { + return constructionunit; + } + public void setConstructionunit(String constructionunit) { + this.constructionunit = constructionunit; + } + public String getProjectname() { + return projectname; + } + public void setProjectname(String projectname) { + this.projectname = projectname; + } + public String getStatusid() { + return statusid; + } + public void setStatusid(String statusid) { + this.statusid = statusid; + } + public String getBuildingno() { + return buildingno; + } + public void setBuildingno(String buildingno) { + this.buildingno = buildingno; + } + public Double getUndergroundconstructionarea() { + return undergroundconstructionarea; + } + public void setUndergroundconstructionarea(Double undergroundconstructionarea) { + this.undergroundconstructionarea = undergroundconstructionarea; + } + public String getGeom() { + return geom; + } + public void setGeom(String geom) { + this.geom = geom; + } +} diff --git a/src/main/java/org/jeecgframework/core/common/model/json/ProjectInfo.java b/src/main/java/org/jeecgframework/core/common/model/json/ProjectInfo.java new file mode 100644 index 00000000..40650c61 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/json/ProjectInfo.java @@ -0,0 +1,31 @@ +package org.jeecgframework.core.common.model.json; + +import org.codehaus.jackson.annotate.JsonIgnoreProperties; + +@JsonIgnoreProperties(value = { "hibernateLazyInitializer" }) +public class ProjectInfo { + + private Integer gid;// + private String name;//鍚嶇О锛堥」鐩級 + private String geom; + public Integer getGid() { + return gid; + } + public void setGid(Integer gid) { + this.gid = gid; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getGeom() { + return geom; + } + public void setGeom(String geom) { + this.geom = geom; + } + + +} diff --git a/src/main/java/org/jeecgframework/core/common/model/json/TreeGrid.java b/src/main/java/org/jeecgframework/core/common/model/json/TreeGrid.java new file mode 100644 index 00000000..905c4ef1 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/json/TreeGrid.java @@ -0,0 +1,135 @@ +package org.jeecgframework.core.common.model.json; + +import com.alibaba.fastjson.JSON; + +import java.util.HashMap; +import java.util.Map; + +public class TreeGrid implements java.io.Serializable { + private String id; + private String text; + private String parentId; + private String parentText; + private String code; + private String src; + private String note; + private Map attributes;// 鍏朵粬鍙傛暟 + private String operations;// 鍏朵粬鍙傛暟 + private String state = "open";// 鏄惁灞曞紑(open,closed) + private String order;//鎺掑簭 + private Map fieldMap; // 瀛樺偍瀹炰綋瀛楁淇℃伅瀹瑰櫒锛 key-瀛楁鍚嶇О锛寁alue-瀛楁鍊 + private String functionType;// 鍏朵粬鍙傛暟 + + public String getFunctionType() { + return functionType; + } + public void setFunctionType(String functionType) { + this.functionType = functionType; + } + public String getOrder() { + return order; + } + public void setOrder(String order) { + this.order = order; + } + public String getOperations() { + return operations; + } + public void setOperations(String operations) { + this.operations = operations; + } + public Map getAttributes() { + return attributes; + } + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + public String getParentText() { + return parentText; + } + public void setParentText(String parentText) { + this.parentText = parentText; + } + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } + + public String getSrc() { + return src; + } + public void setSrc(String src) { + this.src = src; + } + public String getNote() { + return note; + } + public void setNote(String note) { + this.note = note; + } + + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getText() { + return text; + } + public void setText(String text) { + this.text = text; + } + public String getParentId() { + return parentId; + } + public void setParentId(String parentId) { + this.parentId = parentId; + } + public String getState() { + return state; + } + public void setState(String state) { + this.state = state; + } + + public Map getFieldMap() { + return fieldMap; + } + + public void setFieldMap(Map fieldMap) { + this.fieldMap = fieldMap; + } + + public String toJson() { + return "{" + + "'id':'" + id + '\'' + + ", 'text':'" + text + '\'' + + ", 'parentId':'" + parentId + '\'' + + ", 'parentText':'" + parentText + '\'' + + ", 'code':'" + code + '\'' + + ", 'src':'" + src + '\'' + + ", 'note':'" + note + '\'' + + ", 'attributes':" + attributes + + ", 'operations':'" + operations + '\'' + + ", 'state':'" + state + '\'' + + ", 'order':'" + order + '\'' + + assembleFieldsJson() + + '}'; + } + + private String assembleFieldsJson() { + String fieldsJson = ", 'fieldMap':" + fieldMap; + if (fieldMap != null && fieldMap.size() > 0) { + Map resultMap = new HashMap(); + for (Map.Entry entry : fieldMap.entrySet()) { + resultMap.put("fieldMap." + entry.getKey(), entry.getValue()); + } + fieldsJson = ", " + JSON.toJSON(resultMap).toString().replace("{", "").replace("}", ""); + } + return fieldsJson; + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/model/json/ValidForm.java b/src/main/java/org/jeecgframework/core/common/model/json/ValidForm.java new file mode 100644 index 00000000..28a35819 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/model/json/ValidForm.java @@ -0,0 +1,27 @@ +package org.jeecgframework.core.common.model.json; + + +/** + * $.ajax鍚庨渶瑕佹帴鍙楃殑JSON + * + * @author + * + */ +public class ValidForm { + + private String status ="y";// 鏄惁鎴愬姛 + private String info = "楠岃瘉閫氳繃";//鎻愮ず淇℃伅 + public String getStatus() { + return status; + } + public void setStatus(String status) { + this.status = status; + } + public String getInfo() { + return info; + } + public void setInfo(String info) { + this.info = info; + } + +} diff --git a/src/main/java/org/jeecgframework/core/common/service/CommonService.java b/src/main/java/org/jeecgframework/core/common/service/CommonService.java new file mode 100644 index 00000000..3abeccdb --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/service/CommonService.java @@ -0,0 +1,353 @@ +package org.jeecgframework.core.common.service; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import org.hibernate.Session; +import org.hibernate.criterion.DetachedCriteria; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.hibernate.qbc.HqlQuery; +import org.jeecgframework.core.common.hibernate.qbc.PageList; +import org.jeecgframework.core.common.model.common.DBTable; +import org.jeecgframework.core.common.model.common.UploadFile; +import org.jeecgframework.core.common.model.json.ComboTree; +import org.jeecgframework.core.common.model.json.DataGridReturn; +import org.jeecgframework.core.common.model.json.ImportFile; +import org.jeecgframework.core.common.model.json.TreeGrid; +import org.jeecgframework.tag.vo.datatable.DataTableReturn; +import org.jeecgframework.tag.vo.easyui.Autocomplete; +import org.jeecgframework.tag.vo.easyui.ComboTreeModel; +import org.jeecgframework.tag.vo.easyui.TreeGridModel; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.springframework.dao.DataAccessException; + +public interface CommonService { + /** + * 鑾峰彇鎵鏈夋暟鎹簱琛 + * + * @return + */ + public List getAllDbTableName(); + + public Integer getAllDbTableSize(); + + public Serializable save(T entity); + + public void saveOrUpdate(T entity); + + public void delete(T entity); + + public void batchSave(List entitys); + + /** + * 鏍规嵁瀹炰綋鍚嶇О鍜屼富閿幏鍙栧疄浣 + * + * @param + * @param entityName + * @param id + * @return + */ + public T get(Class class1, Serializable id); + + /** + * 鏍规嵁瀹炰綋鍚嶇О鍜屼富閿幏鍙栧疄浣 + * + * @param + * @param entityName + * @param id + * @return + */ + public T getEntity(Class entityName, Serializable id); + + /** + * 鏍规嵁瀹炰綋鍚嶇О鍜屽瓧娈靛悕绉板拰瀛楁鍊艰幏鍙栧敮涓璁板綍 + * + * @param + * @param entityClass + * @param propertyName + * @param value + * @return + */ + public T findUniqueByProperty(Class entityClass, + String propertyName, Object value); + + /** + * 鎸夊睘鎬ф煡鎵惧璞″垪琛. + */ + public List findByProperty(Class entityClass, + String propertyName, Object value); + + /** + * 鍔犺浇鍏ㄩ儴瀹炰綋 + * + * @param + * @param entityClass + * @return + */ + public List loadAll(final Class entityClass); + + /** + * 鍒犻櫎瀹炰綋涓婚敭鍒犻櫎 + * + * @param + * @param entities + */ + public void deleteEntityById(Class entityName, Serializable id); + + /** + * 鍒犻櫎瀹炰綋闆嗗悎 + * + * @param + * @param entities + */ + public void deleteAllEntitie(Collection entities); + + /** + * 鏇存柊鎸囧畾鐨勫疄浣 + * + * @param + * @param pojo + */ + public void updateEntitie(T pojo); + + /** + * 閫氳繃hql 鏌ヨ璇彞鏌ユ壘瀵硅薄 + * + * @param + * @param query + * @return + */ + public List findByQueryString(String hql); + + /** + * 鏍规嵁sql鏇存柊 + * + * @param query + * @return + */ + public int updateBySqlString(String sql); + + /** + * 鏍规嵁sql鏌ユ壘List + * + * @param + * @param query + * @return + */ + public List findListbySql(String query); + + /** + * 閫氳繃灞炴хО鑾峰彇瀹炰綋甯︽帓搴 + * + * @param + * @param clas + * @return + */ + public List findByPropertyisOrder(Class entityClass, + String propertyName, Object value, boolean isAsc); + + public List getList(Class clas); + + public T singleResult(String hql); + + /** + * + * cq鏂瑰紡鍒嗛〉 + * + * @param cq + * @param isOffset + * @return + */ + public PageList getPageList(final CriteriaQuery cq, final boolean isOffset); + + /** + * 杩斿洖DataTableReturn妯″瀷 + * + * @param cq + * @param isOffset + * @return + */ + public DataTableReturn getDataTableReturn(final CriteriaQuery cq, + final boolean isOffset); + + /** + * 杩斿洖easyui datagrid妯″瀷 + * + * @param cq + * @param isOffset + * @return + */ + public DataGridReturn getDataGridReturn(final CriteriaQuery cq, + final boolean isOffset); + + /** + * + * hqlQuery鏂瑰紡鍒嗛〉 + * + * @param cq + * @param isOffset + * @return + */ + public PageList getPageList(final HqlQuery hqlQuery, + final boolean needParameter); + + /** + * + * sqlQuery鏂瑰紡鍒嗛〉 + * + * @param cq + * @param isOffset + * @return + */ + public PageList getPageListBySql(final HqlQuery hqlQuery, + final boolean isToEntity); + + public Session getSession(); + + public List findByExample(final String entityName, + final Object exampleEntity); + + /** + * 閫氳繃cq鑾峰彇鍏ㄩ儴瀹炰綋 + * + * @param + * @param cq + * @return + */ + public List getListByCriteriaQuery(final CriteriaQuery cq, + Boolean ispage); + + /** + * 鏂囦欢涓婁紶 + * + * @param request + */ + public T uploadFile(UploadFile uploadFile); + + public HttpServletResponse viewOrDownloadFile(UploadFile uploadFile); + + /** + * 鐢熸垚XML鏂囦欢 + * + * @param fileName + * XML鍏ㄨ矾寰 + */ + public HttpServletResponse createXml(ImportFile importFile); + + /** + * 瑙f瀽XML鏂囦欢 + * + * @param fileName + * XML鍏ㄨ矾寰 + */ + public void parserXml(String fileName); + + public List comTree(List all, ComboTree comboTree); + + /** + * 鏍规嵁妯″瀷鐢熸垚JSON + * + * @param all 鍏ㄩ儴瀵硅薄 + * @param in 宸叉嫢鏈夌殑瀵硅薄 + * @param recursive 鏄惁閫掑綊鍔犺浇鎵鏈夊瓙鑺傜偣 + * @return List + */ + public List ComboTree(List all, ComboTreeModel comboTreeModel, List in, boolean recursive); + + /** + * 鏋勫缓鏍戝舰鏁版嵁琛 + * + * @param all + * @param treeGridModel + * @return + */ + public List treegrid(List all, TreeGridModel treeGridModel); + + /** + * 鑾峰彇鑷姩瀹屾垚鍒楄〃 + * + * @param + * @return + */ + public List getAutoList(Autocomplete autocomplete); + + /** + * 鎵цSQL + */ + public Integer executeSql(String sql, List param); + + /** + * 鎵цSQL + */ + public Integer executeSql(String sql, Object... param); + + /** + * 鎵цSQL 浣跨敤:name鍗犱綅绗 + */ + public Integer executeSql(String sql, Map param); + /** + * 鎵цSQL 浣跨敤:name鍗犱綅绗,骞惰繑鍥炴墽琛屽悗鐨勪富閿 + */ + public Object executeSqlReturnKey(String sql, Map param); + /** + * 閫氳繃JDBC鏌ユ壘瀵硅薄闆嗗悎 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹繑鍥炴暟鎹 + */ + public List> findForJdbc(String sql, Object... objs); + + /** + * 閫氳繃JDBC鏌ユ壘瀵硅薄闆嗗悎 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹繑鍥炴暟鎹 + */ + public Map findOneForJdbc(String sql, Object... objs); + + /** + * 閫氳繃JDBC鏌ユ壘瀵硅薄闆嗗悎,甯﹀垎椤 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁 + */ + public List> findForJdbc(String sql, int page, int rows); + + /** + * 閫氳繃JDBC鏌ユ壘瀵硅薄闆嗗悎,甯﹀垎椤 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁 + */ + public List findObjForJdbc(String sql, int page, int rows, + Class clazz); + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁-閲囩敤棰勫鐞嗘柟寮 + * + * @param criteria + * @param firstResult + * @param maxResults + * @return + * @throws DataAccessException + */ + public List> findForJdbcParam(String sql, int page, + int rows, Object... objs); + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁For JDBC + */ + public Long getCountForJdbc(String sql); + + /** + * 浣跨敤鎸囧畾鐨勬绱㈡爣鍑嗘绱㈡暟鎹苟鍒嗛〉杩斿洖鏁版嵁For JDBC-閲囩敤棰勫鐞嗘柟寮 + * + */ + public Long getCountForJdbcParam(String sql, Object[] objs); + + /** + * 閫氳繃hql 鏌ヨ璇彞鏌ユ壘瀵硅薄 + * + * @param + * @param query + * @return + */ + public List findHql(String hql, Object... param); + + public List pageList(DetachedCriteria dc, int firstResult, + int maxResult); + + public List findByDetached(DetachedCriteria dc); +} diff --git a/src/main/java/org/jeecgframework/core/common/service/impl/CommonServiceImpl.java b/src/main/java/org/jeecgframework/core/common/service/impl/CommonServiceImpl.java new file mode 100644 index 00000000..ba6826cd --- /dev/null +++ b/src/main/java/org/jeecgframework/core/common/service/impl/CommonServiceImpl.java @@ -0,0 +1,447 @@ +package org.jeecgframework.core.common.service.impl; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.system.pojo.base.TSDepart; + +import org.hibernate.Session; +import org.hibernate.criterion.DetachedCriteria; +import org.jeecgframework.core.common.dao.ICommonDao; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.hibernate.qbc.HqlQuery; +import org.jeecgframework.core.common.hibernate.qbc.PageList; +import org.jeecgframework.core.common.model.common.DBTable; +import org.jeecgframework.core.common.model.common.UploadFile; +import org.jeecgframework.core.common.model.json.ComboTree; +import org.jeecgframework.core.common.model.json.DataGridReturn; +import org.jeecgframework.core.common.model.json.ImportFile; +import org.jeecgframework.core.common.model.json.TreeGrid; +import org.jeecgframework.core.common.service.CommonService; +import org.jeecgframework.tag.vo.datatable.DataTableReturn; +import org.jeecgframework.tag.vo.easyui.Autocomplete; +import org.jeecgframework.tag.vo.easyui.ComboTreeModel; +import org.jeecgframework.tag.vo.easyui.TreeGridModel; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service("commonService") +@Transactional +public class CommonServiceImpl implements CommonService { + public ICommonDao commonDao = null; + + /** + * 鑾峰彇鎵鏈夋暟鎹簱琛 + * + * @return + */ + public List getAllDbTableName() { + return commonDao.getAllDbTableName(); + } + + public Integer getAllDbTableSize() { + return commonDao.getAllDbTableSize(); + } + + @Resource + public void setCommonDao(ICommonDao commonDao) { + this.commonDao = commonDao; + } + + + public Serializable save(T entity) { + return commonDao.save(entity); + } + + + public void saveOrUpdate(T entity) { + commonDao.saveOrUpdate(entity); + + } + + + public void delete(T entity) { + commonDao.delete(entity); + + } + + /** + * 鍒犻櫎瀹炰綋闆嗗悎 + * + * @param + * @param entities + */ + public void deleteAllEntitie(Collection entities) { + commonDao.deleteAllEntitie(entities); + } + + /** + * 鏍规嵁瀹炰綋鍚嶈幏鍙栧璞 + */ + public T get(Class class1, Serializable id) { + return commonDao.get(class1, id); + } + + /** + * 鏍规嵁瀹炰綋鍚嶈繑鍥炲叏閮ㄥ璞 + * + * @param + * @param hql + * @param size + * @return + */ + public List getList(Class clas) { + return commonDao.loadAll(clas); + } + + /** + * 鏍规嵁瀹炰綋鍚嶈幏鍙栧璞 + */ + public T getEntity(Class entityName, Serializable id) { + return commonDao.getEntity(entityName, id); + } + + /** + * 鏍规嵁瀹炰綋鍚嶇О鍜屽瓧娈靛悕绉板拰瀛楁鍊艰幏鍙栧敮涓璁板綍 + * + * @param + * @param entityClass + * @param propertyName + * @param value + * @return + */ + public T findUniqueByProperty(Class entityClass, + String propertyName, Object value) { + return commonDao.findUniqueByProperty(entityClass, propertyName, value); + } + + /** + * 鎸夊睘鎬ф煡鎵惧璞″垪琛. + */ + public List findByProperty(Class entityClass, + String propertyName, Object value) { + + return commonDao.findByProperty(entityClass, propertyName, value); + } + + /** + * 鍔犺浇鍏ㄩ儴瀹炰綋 + * + * @param + * @param entityClass + * @return + */ + public List loadAll(final Class entityClass) { + return commonDao.loadAll(entityClass); + } + + public T singleResult(String hql) { + return commonDao.singleResult(hql); + } + + /** + * 鍒犻櫎瀹炰綋涓婚敭ID鍒犻櫎瀵硅薄 + * + * @param + * @param entities + */ + public void deleteEntityById(Class entityName, Serializable id) { + commonDao.deleteEntityById(entityName, id); + } + + /** + * 鏇存柊鎸囧畾鐨勫疄浣 + * + * @param + * @param pojo + */ + public void updateEntitie(T pojo) { + commonDao.updateEntitie(pojo); + + } + + /** + * 閫氳繃hql 鏌ヨ璇彞鏌ユ壘瀵硅薄 + * + * @param + * @param query + * @return + */ + public List findByQueryString(String hql) { + return commonDao.findByQueryString(hql); + } + + /** + * 鏍规嵁sql鏇存柊 + * + * @param query + * @return + */ + public int updateBySqlString(String sql) { + return commonDao.updateBySqlString(sql); + } + + /** + * 鏍规嵁sql鏌ユ壘List + * + * @param + * @param query + * @return + */ + public List findListbySql(String query) { + return commonDao.findListbySql(query); + } + + /** + * 閫氳繃灞炴хО鑾峰彇瀹炰綋甯︽帓搴 + * + * @param + * @param clas + * @return + */ + public List findByPropertyisOrder(Class entityClass, + String propertyName, Object value, boolean isAsc) { + return commonDao.findByPropertyisOrder(entityClass, propertyName, + value, isAsc); + } + + /** + * + * cq鏂瑰紡鍒嗛〉 + * + * @param cq + * @param isOffset + * @return + */ + public PageList getPageList(final CriteriaQuery cq, final boolean isOffset) { + return commonDao.getPageList(cq, isOffset); + } + + /** + * 杩斿洖DataTableReturn妯″瀷 + * + * @param cq + * @param isOffset + * @return + */ + public DataTableReturn getDataTableReturn(final CriteriaQuery cq, + final boolean isOffset) { + return commonDao.getDataTableReturn(cq, isOffset); + } + + /** + * 杩斿洖easyui datagrid妯″瀷 + * + * @param cq + * @param isOffset + * @return + */ + public DataGridReturn getDataGridReturn(final CriteriaQuery cq, + final boolean isOffset) { + return commonDao.getDataGridReturn(cq, isOffset); + } + + /** + * + * hqlQuery鏂瑰紡鍒嗛〉 + * + * @param cq + * @param isOffset + * @return + */ + public PageList getPageList(final HqlQuery hqlQuery, + final boolean needParameter) { + return commonDao.getPageList(hqlQuery, needParameter); + } + + /** + * + * sqlQuery鏂瑰紡鍒嗛〉 + * + * @param cq + * @param isOffset + * @return + */ + public PageList getPageListBySql(final HqlQuery hqlQuery, + final boolean isToEntity) { + return commonDao.getPageListBySql(hqlQuery, isToEntity); + } + + public Session getSession() + + { + return commonDao.getSession(); + } + + public List findByExample(final String entityName, + final Object exampleEntity) { + return commonDao.findByExample(entityName, exampleEntity); + } + + /** + * 閫氳繃cq鑾峰彇鍏ㄩ儴瀹炰綋 + * + * @param + * @param cq + * @return + */ + public List getListByCriteriaQuery(final CriteriaQuery cq, + Boolean ispage) { + return commonDao.getListByCriteriaQuery(cq, ispage); + } + + /** + * 鏂囦欢涓婁紶 + * + * @param request + */ + public T uploadFile(UploadFile uploadFile) { + return commonDao.uploadFile(uploadFile); + } + + public HttpServletResponse viewOrDownloadFile(UploadFile uploadFile) + + { + return commonDao.viewOrDownloadFile(uploadFile); + } + + /** + * 鐢熸垚XML鏂囦欢 + * + * @param fileName + * XML鍏ㄨ矾寰 + * @return + */ + public HttpServletResponse createXml(ImportFile importFile) { + return commonDao.createXml(importFile); + } + + /** + * 瑙f瀽XML鏂囦欢 + * + * @param fileName + * XML鍏ㄨ矾寰 + */ + public void parserXml(String fileName) { + commonDao.parserXml(fileName); + } + + public List comTree(List all, ComboTree comboTree) { + return commonDao.comTree(all, comboTree); + } + + public List ComboTree(List all, ComboTreeModel comboTreeModel, List in, boolean recursive) { + return commonDao.ComboTree(all, comboTreeModel, in, recursive); + } + + /** + * 鏋勫缓鏍戝舰鏁版嵁琛 + */ + public List treegrid(List all, TreeGridModel treeGridModel) { + return commonDao.treegrid(all, treeGridModel); + } + + /** + * 鑾峰彇鑷姩瀹屾垚鍒楄〃 + * + * @param + * @return + */ + public List getAutoList(Autocomplete autocomplete) { + StringBuffer sb = new StringBuffer(""); + for (String searchField : autocomplete.getSearchField().split(",")) { + sb.append(" or " + searchField + " like '%" + + autocomplete.getTrem() + "%' "); + } + String hql = "from " + autocomplete.getEntityName() + " where 1!=1 " + + sb.toString(); + return commonDao.getSession().createQuery(hql) + .setFirstResult(autocomplete.getCurPage() - 1) + .setMaxResults(autocomplete.getMaxRows()).list(); + } + + + public Integer executeSql(String sql, List param) { + return commonDao.executeSql(sql, param); + } + + + public Integer executeSql(String sql, Object... param) { + return commonDao.executeSql(sql, param); + } + + + public Integer executeSql(String sql, Map param) { + return commonDao.executeSql(sql, param); + } + + public Object executeSqlReturnKey(String sql, Map param) { + return commonDao.executeSqlReturnKey(sql, param); + } + + public List> findForJdbc(String sql, int page, int rows) { + return commonDao.findForJdbc(sql, page, rows); + } + + + public List> findForJdbc(String sql, Object... objs) { + return commonDao.findForJdbc(sql, objs); + } + + + public List> findForJdbcParam(String sql, int page, + int rows, Object... objs) { + return commonDao.findForJdbcParam(sql, page, rows, objs); + } + + + public List findObjForJdbc(String sql, int page, int rows, + Class clazz) { + return commonDao.findObjForJdbc(sql, page, rows, clazz); + } + + + public Map findOneForJdbc(String sql, Object... objs) { + return commonDao.findOneForJdbc(sql, objs); + } + + + public Long getCountForJdbc(String sql) { + return commonDao.getCountForJdbc(sql); + } + + public Long getCountForJdbcParam(String sql, Object[] objs) { + return commonDao.getCountForJdbcParam(sql,objs); + } + + + public void batchSave(List entitys) { + this.commonDao.batchSave(entitys); + } + + /** + * 閫氳繃hql 鏌ヨ璇彞鏌ユ壘瀵硅薄 + * + * @param + * @param query + * @return + */ + public List findHql(String hql, Object... param) { + return this.commonDao.findHql(hql, param); + } + + public List pageList(DetachedCriteria dc, int firstResult, + int maxResult) { + return this.commonDao.pageList(dc, firstResult, maxResult); + } + + public List findByDetached(DetachedCriteria dc) { + return this.commonDao.findByDetached(dc); + } + +} diff --git a/src/main/java/org/jeecgframework/core/constant/DataBaseConstant.java b/src/main/java/org/jeecgframework/core/constant/DataBaseConstant.java new file mode 100644 index 00000000..1046b316 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/constant/DataBaseConstant.java @@ -0,0 +1,132 @@ +package org.jeecgframework.core.constant; +/** + * 鏁版嵁搴撲笂涓嬫枃甯搁噺 + * @author JueYue + * @date 2014骞8鏈30鏃 涓嬪崍10:10:36 + */ +public interface DataBaseConstant { + + + //**************************************************************************************** + //*********绯荤粺涓婁笅鏂囧彉閲**************************************** + /** + * 鏁版嵁-鎵灞炲叕鍙哥紪鐮 + */ + public static final String SYS_COMPANY_CODE = "sysCompanyCode"; + /** + * 鏁版嵁-鎵灞炲叕鍙哥紪鐮 + */ + public static final String SYS_COMPANY_CODE_TABLE = "sys_company_code"; + /** + * 鏁版嵁-鎵灞炴満鏋勭紪鐮 + */ + public static final String SYS_ORG_CODE = "sysOrgCode"; + /** + * 鏁版嵁-鎵灞炴満鏋勭紪鐮 + */ + public static final String SYS_ORG_CODE_TABLE = "sys_org_code"; + /** + * 鏁版嵁-绯荤粺鐢ㄦ埛缂栫爜锛堝搴旂櫥褰曠敤鎴疯处鍙凤級 + */ + public static final String SYS_USER_CODE = "sysUserCode"; + /** + * 鏁版嵁-绯荤粺鐢ㄦ埛缂栫爜锛堝搴旂櫥褰曠敤鎴疯处鍙凤級 + */ + public static final String SYS_USER_CODE_TABLE = "sys_user_code"; + /** + * 鐧诲綍鐢ㄦ埛鐪熷疄濮撳悕 + */ + public static final String SYS_USER_NAME = "sysUserName"; + /** + * 鐧诲綍鐢ㄦ埛鐪熷疄濮撳悕 + */ + public static final String SYS_USER_NAME_TABLE = "sys_user_name"; + /** + * 绯荤粺鏃ユ湡"yyyy-MM-dd" + */ + public static final String SYS_DATE = "sysDate"; + /** + * 绯荤粺鏃ユ湡"yyyy-MM-dd" + */ + public static final String SYS_DATE_TABLE = "sys_date"; + /** + * 绯荤粺鏃堕棿"yyyy-MM-dd HH:mm" + */ + public static final String SYS_TIME = "sysTime"; + /** + * 绯荤粺鏃堕棿"yyyy-MM-dd HH:mm" + */ + public static final String SYS_TIME_TABLE = "sys_time"; + //*********绯荤粺涓婁笅鏂囧彉閲**************************************** + //**************************************************************************************** + + + //**************************************************************************************** + //*********绯荤粺寤鸿〃鏍囧噯瀛楁**************************************** + /** + * 鍒涘缓鑰呯櫥褰曞悕绉 + */ + public static final String CREATE_BY_TABLE = "create_by"; + /** + * 鍒涘缓鑰呯櫥褰曞悕绉 + */ + public static final String CREATE_BY = "createBy"; + /** + * 鍒涘缓鐢ㄦ埛鐪熸槸鍚嶇О + */ + public static final String CREATE_NAME_TABLE = "create_name"; + /** + * 鍒涘缓鐢ㄦ埛鐪熸槸鍚嶇О + */ + public static final String CREATE_NAME = "createName"; + /** + * 鍒涘缓鏃ユ湡 + */ + public static final String CREATE_DATE_TABLE = "create_date"; + /** + * 鍒涘缓鏃ユ湡 + */ + public static final String CREATE_DATE = "createDate"; + /** + * 鍒涘缓鏃ユ湡鏃堕棿 + */ + public static final String CREATE_TIME_TABLE = "create_time"; + /** + * 鍒涘缓鏃ユ湡鏃堕棿 + */ + public static final String CREATE_TIME = "createTime"; + /** + * 鏇存柊鐢ㄦ埛鐧诲綍鍚嶇О + */ + public static final String UPDATE_BY_TABLE = "update_by"; + /** + * 鏇存柊鐢ㄦ埛鐧诲綍鍚嶇О + */ + public static final String UPDATE_BY = "updateBy"; + /** + * 鏇存柊鐢ㄦ埛鐪熸槸鍚嶇О + */ + public static final String UPDATE_NAME_TABLE = "update_name"; + /** + * 鏇存柊鐢ㄦ埛鐪熸槸鍚嶇О + */ + public static final String UPDATE_NAME = "updateName"; + /** + * 鏇存柊鏃ユ湡 + */ + public static final String UPDATE_DATE = "updateDate"; + /** + * 鏇存柊鏃ユ湡 + */ + public static final String UPDATE_DATE_TABLE = "update_date"; + /** + * 鏇存柊鏃ユ湡鏃堕棿 + */ + public static final String UPDATE_TIME = "updateTime"; + /** + * 鏇存柊鏃ユ湡鏃堕棿 + */ + public static final String UPDATE_TIME_TABLE = "update_time"; + //*********绯荤粺寤鸿〃鏍囧噯瀛楁**************************************** + //**************************************************************************************** +} diff --git a/src/main/java/org/jeecgframework/core/constant/Globals.java b/src/main/java/org/jeecgframework/core/constant/Globals.java new file mode 100644 index 00000000..cf8c5a57 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/constant/Globals.java @@ -0,0 +1,108 @@ +package org.jeecgframework.core.constant; + +import org.jeecgframework.core.util.ResourceUtil; + + +/** +* 椤圭洰鍚嶇О锛歫eecg +* 绫诲悕绉帮細Globals +* 绫绘弿杩帮細 鍏ㄥ眬鍙橀噺瀹氫箟 +* 鍒涘缓浜猴細 寮犱唬娴 +* @version +* + */ +public final class Globals { + /** + * 淇濆瓨鐢ㄦ埛鍒癝ESSION + */ + public static String USER_SESSION="USER_SESSION"; + /** + * 浜哄憳绫诲瀷 + */ + public static Short User_Normal=1;//姝e父 + public static Short User_Forbidden=0;//绂佺敤 + public static Short User_ADMIN=-1;//瓒呯骇绠$悊鍛 + /** + *鏃ュ織绾у埆瀹氫箟 + */ + public static Short Log_Leavel_INFO=1; + public static Short Log_Leavel_WARRING=2; + public static Short Log_Leavel_ERROR=3; + /** + * 鏃ュ織绫诲瀷 + */ + public static Short Log_Type_LOGIN=1; //鐧婚檰 + public static Short Log_Type_EXIT=2; //閫鍑 + public static Short Log_Type_INSERT=3; //鎻掑叆 + public static Short Log_Type_DEL=4; //鍒犻櫎 + public static Short Log_Type_UPDATE=5; //鏇存柊 + public static Short Log_Type_UPLOAD=6; //涓婁紶 + public static Short Log_Type_OTHER=7; //鍏朵粬 + + + /** + * 璇嶅吀鍒嗙粍瀹氫箟 + */ + public static String TypeGroup_Database="database";//鏁版嵁琛ㄥ垎绫 + + /** + * 鏉冮檺绛夌骇 + */ + public static Short Function_Leave_ONE=0;//涓绾ф潈闄 + public static Short Function_Leave_TWO=1;//浜岀骇鏉冮檺 + + /** + * 鏉冮檺绛夌骇鍓嶇紑 + */ + public static String Function_Order_ONE="ofun";//涓绾ф潈闄 + public static String Function_Order_TWO="tfun";//浜岀骇鏉冮檺 + + /** + * 鏉冮檺绫诲瀷 + */ + public static Short Function_TYPE_PAGE=0;//椤甸潰锛堣彍鍗曪細鑿滃崟绫诲瀷锛 + public static Short Function_TYPE_FROM=1;//琛ㄥ崟/鎴栬呭脊鍑猴紙鑿滃崟锛氳闂被鍨嬶級 + /** + * 娌℃湁鍕鹃夌殑鎿嶄綔code + */ + public static String NOAUTO_OPERATIONCODES ="noauto_operationCodes"; + /** + * 鍕鹃変簡鐨勬搷浣渃ode + */ + public static String OPERATIONCODES ="operationCodes"; + + + /** + * 鏉冮檺绫诲瀷 + */ + public static Short OPERATION_TYPE_HIDE = 0;//椤甸潰 + public static Short OPERATION_TYPE_DISABLED = 1;//琛ㄥ崟/鎴栬呭脊鍑 + + + /** + * 鏁版嵁鏉冮檺 - 鑿滃崟鏁版嵁瑙勫垯闆嗗悎 + */ + public static String MENU_DATA_AUTHOR_RULES ="MENU_DATA_AUTHOR_RULES"; + /** + * 鏁版嵁鏉冮檺 - 鑿滃崟鏁版嵁瑙勫垯sql + */ + public static String MENU_DATA_AUTHOR_RULE_SQL ="MENU_DATA_AUTHOR_RULE_SQL"; + /** + * 鏂伴椈娉曡 + */ + public static Short Document_NEW=0; //鏂板缓 + public static Short Document_PUBLICH=0; //鍙戝竷 + + + + /** + * 閰嶇疆绯荤粺鏄惁寮鍚寜閽潈闄愭帶鍒 + */ + public static boolean BUTTON_AUTHORITY_CHECK = false; + static{ + String button_authority_jeecg = ResourceUtil.getSessionattachmenttitle("button.authority.jeecg"); + if("true".equals(button_authority_jeecg)){ + BUTTON_AUTHORITY_CHECK = true; + } + } +} diff --git a/src/main/java/org/jeecgframework/core/def/ConstantsDefs.java b/src/main/java/org/jeecgframework/core/def/ConstantsDefs.java new file mode 100644 index 00000000..294026ff --- /dev/null +++ b/src/main/java/org/jeecgframework/core/def/ConstantsDefs.java @@ -0,0 +1,31 @@ +package org.jeecgframework.core.def; + +/** + * + * @author 寮犱唬娴 + * + */ +public final class ConstantsDefs { + private ConstantsDefs() { + } + + /** + * 寮鍙戞ā寮 + */ + public static final String MODE_DEVELOP = "DEV"; + + /** + * 鍙戝竷妯″紡 + */ + public static final String MODE_PUBLISH = "PUB"; + + /** + * 鍒犻櫎锛1 + */ + public static final int DELETE_FLG_1 = 1; + /** + * 鍒犻櫎锛0銆庢甯搞 + */ + public static final int DELETE_FLG_0 = 0; + +} diff --git a/src/main/java/org/jeecgframework/core/enums/SysThemesEnum.java b/src/main/java/org/jeecgframework/core/enums/SysThemesEnum.java new file mode 100644 index 00000000..a9cea671 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/enums/SysThemesEnum.java @@ -0,0 +1,91 @@ +package org.jeecgframework.core.enums; + +import org.jeecgframework.core.util.StringUtil; + +/** + * 绯荤粺鏍峰紡绫诲瀷 + * + * @author zhoujf + */ +public enum SysThemesEnum { + + DEFAULT_STYLE("default","main/main","default", "缁忓吀椋庢牸"), + SHORTCUT_STYLE("shortcut","main/shortcut_main","default", "ShortCut椋庢牸"), + SLIDING_STYLE("sliding","main/sliding_main","default", "Sliding浜戞闈"), + ACE_STYLE("ace","main/ace_main","metro", "ACE骞抽潰椋庢牸"); + + + /** + * 椋庢牸 + */ + private String style; + + /** + * 棣栭〉璺緞 + */ + private String indexPath; + + /** + * 鏍峰紡 + */ + private String themes; + /** + * 鎻忚堪 + */ + private String desc; + + private SysThemesEnum(String style, String indexPath, String themes, String desc) { + this.style = style; + this.indexPath = indexPath; + this.themes = themes; + this.desc = desc; + } + + public String getStyle() { + return style; + } + + public void setStyle(String style) { + this.style = style; + } + + public String getThemes() { + return themes; + } + + public void setThemes(String themes) { + this.themes = themes; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getIndexPath() { + return indexPath; + } + + public void setIndexPath(String indexPath) { + this.indexPath = indexPath; + } + + public static SysThemesEnum toEnum(String style) { + if (StringUtil.isEmpty(style)) { + return SHORTCUT_STYLE; + } + for(SysThemesEnum item : SysThemesEnum.values()) { + if(item.getStyle().equals(style)) { + return item; + } + } + return SHORTCUT_STYLE; + } + + public String toString() { + return "{style: " + style + ", indexPath: " + indexPath + ", themes: " + themes + ", desc: " + desc +"}"; + } +} diff --git a/src/main/java/org/jeecgframework/core/extend/datasource/DataSourceContextHolder.java b/src/main/java/org/jeecgframework/core/extend/datasource/DataSourceContextHolder.java new file mode 100644 index 00000000..eb920e2b --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/datasource/DataSourceContextHolder.java @@ -0,0 +1,22 @@ +package org.jeecgframework.core.extend.datasource; +/** + *绫诲悕锛欴ataSourceContextHolder.java + *鍔熻兘锛氳幏寰楀拰璁剧疆涓婁笅鏂囩幆澧冪殑绫伙紝涓昏璐熻矗鏀瑰彉涓婁笅鏂囨暟鎹簮鐨勫悕绉 + */ +public class DataSourceContextHolder { + + private static final ThreadLocal contextHolder=new ThreadLocal(); + + public static void setDataSourceType(DataSourceType dataSourceType){ + contextHolder.set(dataSourceType); + } + + public static DataSourceType getDataSourceType(){ + return (DataSourceType) contextHolder.get(); + } + + public static void clearDataSourceType(){ + contextHolder.remove(); + } + +} diff --git a/src/main/java/org/jeecgframework/core/extend/datasource/DataSourceType.java b/src/main/java/org/jeecgframework/core/extend/datasource/DataSourceType.java new file mode 100644 index 00000000..9887b7c7 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/datasource/DataSourceType.java @@ -0,0 +1,5 @@ +package org.jeecgframework.core.extend.datasource; + +public enum DataSourceType { + dataSource_jeecg,dataSource_enter,dataSource4,mapdataSource +} diff --git a/src/main/java/org/jeecgframework/core/extend/datasource/DynamicDataSource.java b/src/main/java/org/jeecgframework/core/extend/datasource/DynamicDataSource.java new file mode 100644 index 00000000..a3a9425e --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/datasource/DynamicDataSource.java @@ -0,0 +1,38 @@ +package org.jeecgframework.core.extend.datasource; + +import java.util.Map; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; +import org.springframework.jdbc.datasource.lookup.DataSourceLookup; + +/** + *绫诲悕锛欴ynamicDataSource.java + *鍔熻兘锛氬姩鎬佹暟鎹簮绫 + */ +public class DynamicDataSource extends AbstractRoutingDataSource { + + /* + * 璇ユ柟娉曞繀椤昏閲嶅啓 鏂规硶鏄负浜嗘牴鎹暟鎹簱鏍囩ず绗﹀彇寰楀綋鍓嶇殑鏁版嵁搴 + */ + + protected Object determineCurrentLookupKey() { + DataSourceType dataSourceType= DataSourceContextHolder.getDataSourceType(); + return dataSourceType; + } + + + public void setDataSourceLookup(DataSourceLookup dataSourceLookup) { + super.setDataSourceLookup(dataSourceLookup); + } + + + public void setDefaultTargetDataSource(Object defaultTargetDataSource) { + super.setDefaultTargetDataSource(defaultTargetDataSource); + } + + + public void setTargetDataSources(Map targetDataSources) { + super.setTargetDataSources(targetDataSources); + } + +} diff --git a/src/main/java/org/jeecgframework/core/extend/hqlsearch/HqlGenerateUtil.java b/src/main/java/org/jeecgframework/core/extend/hqlsearch/HqlGenerateUtil.java new file mode 100644 index 00000000..01435ae6 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/hqlsearch/HqlGenerateUtil.java @@ -0,0 +1,348 @@ +package org.jeecgframework.core.extend.hqlsearch; + +import java.beans.PropertyDescriptor; +import java.text.SimpleDateFormat; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.beanutils.PropertyUtils; +import org.apache.commons.lang.StringUtils; +import org.hibernate.criterion.Restrictions; +import org.jeecgframework.core.annotation.query.QueryTimeFormat; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.extend.hqlsearch.parse.ObjectParseUtil; +import org.jeecgframework.core.extend.hqlsearch.parse.PageValueConvertRuleEnum; +import org.jeecgframework.core.extend.hqlsearch.parse.vo.HqlRuleEnum; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.JSONHelper; +import org.jeecgframework.core.util.JeecgDataAutorUtils; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.web.demo.entity.test.JeecgDemo; +import org.jeecgframework.web.demo.entity.test.QueryCondition; +import org.jeecgframework.web.system.pojo.base.TSDataRule; +import org.springframework.util.NumberUtils; + +/** + * + * @author 寮犱唬娴 + * @de + * + */ +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class HqlGenerateUtil { + + /** 鏃堕棿鏌ヨ绗﹀彿 */ + private static final String END = "_end"; + private static final String BEGIN = "_begin"; + + private static final SimpleDateFormat time = new SimpleDateFormat( + "yyyy-MM-dd hh:mm:ss"); + + /** + * 鑷姩鐢熸垚鏌ヨ鏉′欢HQL 妯$硦鏌ヨ 涓嶅甫鏈夋棩鏈熺粍鍚 + * + * @param cq + * @param searchObj + * @throws Exception + */ + public static void installHql(CriteriaQuery cq, Object searchObj) { + installHql(cq,searchObj,null); + + } + + /** + * 鑷姩鐢熸垚鏌ヨ鏉′欢HQL锛堟墿灞曞尯闂存煡璇㈠姛鑳斤級 + * + * @param cq + * @param searchObj + * @param parameterMap + * request鍙傛暟闆嗗悎锛屽皝瑁呬簡鎵鏈夋煡璇俊鎭 + */ + public static void installHql(CriteriaQuery cq, Object searchObj, + Map parameterMap) { + installHqlJoinAlias(cq, searchObj, getRuleMap(), parameterMap, ""); + try{ + String json= null; + if(StringUtil.isNotEmpty(cq.getDataGrid().getSqlbuilder())){ + json =cq.getDataGrid().getSqlbuilder(); + }else if(parameterMap!=null + &&StringUtil.isNotEmpty(parameterMap.get("sqlbuilder"))){ + json = parameterMap.get("sqlbuilder")[0]; + } + if(StringUtil.isNotEmpty(json)){ + List list = JSONHelper.toList( + json + , QueryCondition.class); + String sql=getSql(list,""); + System.out.println("DEBUG sqlbuilder:"+sql); + cq.add(Restrictions.sqlRestriction(sql)); + } + }catch(Exception e){ + e.printStackTrace(); + } + + cq.add(); + } + + /** + * 娣诲姞Alias鍒悕鐨勬煡璇 + * + * @date 2014骞1鏈19鏃 + * @param cq + * @param searchObj + * @param parameterMap + * @param alias + */ + private static void installHqlJoinAlias(CriteriaQuery cq, Object searchObj, + Map ruleMap, + Map parameterMap, String alias) { + PropertyDescriptor origDescriptors[] = PropertyUtils + .getPropertyDescriptors(searchObj); + String aliasName, name, type; + for (int i = 0; i < origDescriptors.length; i++) { + aliasName = (alias.equals("") ? "" : alias + ".") + + origDescriptors[i].getName(); + name = origDescriptors[i].getName(); + type = origDescriptors[i].getPropertyType().toString(); + try { + if (judgedIsUselessField(name) + || !PropertyUtils.isReadable(searchObj, name)) { + continue; + } + // 濡傛灉瑙勫垯鍖呭惈杩欎釜灞炴 + if (ruleMap.containsKey(aliasName)) { + addRuleToCriteria(ruleMap.get(aliasName), aliasName, + origDescriptors[i].getPropertyType(), cq); + } + + // 娣诲姞 鍒ゆ柇鏄惁鏈夊尯闂村 + String beginValue = null; + String endValue = null; + if (parameterMap != null + && parameterMap.containsKey(name + BEGIN)) { + beginValue = parameterMap.get(name + BEGIN)[0].trim(); + } + if (parameterMap != null + && parameterMap.containsKey(name + END)) { + endValue = parameterMap.get(name + END)[0].trim(); + } + + Object value = PropertyUtils.getSimpleProperty(searchObj, name); + // 鏍规嵁绫诲瀷鍒嗙被澶勭悊 + if (type.contains("class java.lang") + || type.contains("class java.math")) { + // for锛氭煡璇㈡嫾瑁呯殑鏇挎崲 + if (value != null && !value.equals("")) { + HqlRuleEnum rule = PageValueConvertRuleEnum + .convert(value); + value = PageValueConvertRuleEnum.replaceValue(rule, + value); + ObjectParseUtil.addCriteria(cq, aliasName, rule, value); + } else if (parameterMap != null) { + ObjectParseUtil.addCriteria(cq, aliasName, + HqlRuleEnum.GE, beginValue); + ObjectParseUtil.addCriteria(cq, aliasName, + HqlRuleEnum.LE, endValue); + } + // for锛氭煡璇㈡嫾瑁呯殑鏇挎崲 + } else if ("class java.util.Date".equals(type)) { + QueryTimeFormat format = origDescriptors[i].getReadMethod() + .getAnnotation(QueryTimeFormat.class); + SimpleDateFormat userDefined = null; + if (format != null) { + userDefined = new SimpleDateFormat(format.format()); + } + if (StringUtils.isNotBlank(beginValue)) { + if (userDefined != null) { + cq.ge(aliasName, userDefined.parse(beginValue)); + } else if (beginValue.length() == 19) { + cq.ge(aliasName, time.parse(beginValue)); + } else if (beginValue.length() == 10) { + cq.ge(aliasName, + time.parse(beginValue + " 00:00:00")); + } + } + if (StringUtils.isNotBlank(endValue)) { + if (userDefined != null) { + cq.ge(aliasName, userDefined.parse(beginValue)); + } else if (endValue.length() == 19) { + cq.le(aliasName, time.parse(endValue)); + } else if (endValue.length() == 10) { + // 瀵逛簬"yyyy-MM-dd"鏍煎紡鏃ユ湡锛屽洜鏃堕棿榛樿涓0锛屾晠姝ゆ坊鍔" 23:23:59"骞朵娇鐢╰ime瑙f瀽锛屼互鏂逛究鏌ヨ鏃ユ湡鏃堕棿鏁版嵁 + cq.le(aliasName, time.parse(endValue + " 23:23:59")); + } + } + if (isNotEmpty(value)) { + cq.eq(aliasName, value); + } + } else if (!StringUtil.isJavaClass(origDescriptors[i] + .getPropertyType())) { + Object param = PropertyUtils.getSimpleProperty(searchObj, + name); + if (isHaveRuleData(ruleMap, aliasName) ||( isNotEmpty(param) + && itIsNotAllEmpty(param))) { + // 濡傛灉鏄疄浣撶被,鍒涘缓鍒悕,缁х画鍒涘缓鏌ヨ鏉′欢 + // for锛氱敤鎴峰弽棣 + cq.createAlias(aliasName, + aliasName.replaceAll("\\.", "_")); + // ------------end--Author:JueYue Date:20140521 for锛氱敤鎴峰弽棣 + installHqlJoinAlias(cq, param, ruleMap, parameterMap, + aliasName); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * 鍒ゆ柇鏁版嵁瑙勫垯鏄笉鏄寘鍚繖涓疄浣撶被 + * + * @param ruleMap + * @param aliasName + * @return + */ + private static boolean isHaveRuleData(Map ruleMap, + String aliasName) { + for (String key : ruleMap.keySet()) { + if (key.contains(aliasName)) { + return true; + } + } + return false; + } + + private static void addRuleToCriteria(TSDataRule tsDataRule, + String aliasName, Class propertyType, CriteriaQuery cq) { + HqlRuleEnum rule = HqlRuleEnum.getByValue(tsDataRule + .getRuleConditions()); + if (rule.equals(HqlRuleEnum.IN)) { + String[] values = tsDataRule.getRuleValue().split(","); + Object[] objs = new Object[values.length]; + if (! propertyType.equals(String.class)) { + for (int i = 0; i < values.length; i++) { + objs[i] = NumberUtils + .parseNumber(values[i], propertyType); + } + }else { + objs = values; + } + ObjectParseUtil.addCriteria(cq, aliasName, rule, objs); + } else { + if (propertyType.equals(String.class)) { + ObjectParseUtil.addCriteria(cq, aliasName, rule, + converRuleValue(tsDataRule.getRuleValue())); + } else { + ObjectParseUtil.addCriteria(cq, aliasName, rule, NumberUtils + .parseNumber(tsDataRule.getRuleValue(), propertyType)); + } + } + } + + private static String converRuleValue(String ruleValue) { + String value = ResourceUtil.getUserSystemData(ruleValue); + return value!= null ? value : ruleValue; + } + + private static boolean judgedIsUselessField(String name) { + return "class".equals(name) || "ids".equals(name) + || "page".equals(name) || "rows".equals(name) + || "sort".equals(name) || "order".equals(name); + } + + /** + * 鍒ゆ柇鏄笉鏄┖ + */ + public static boolean isNotEmpty(Object value) { + return value != null && !"".equals(value); + } + + /** + * 鍒ゆ柇杩欎釜绫绘槸涓嶆槸鎵浠ュ睘鎬ч兘涓虹┖ + * + * @param param + * @return + */ + private static boolean itIsNotAllEmpty(Object param) { + boolean isNotEmpty = false; + try { + PropertyDescriptor origDescriptors[] = PropertyUtils + .getPropertyDescriptors(param); + String name; + for (int i = 0; i < origDescriptors.length; i++) { + name = origDescriptors[i].getName(); + if ("class".equals(name) + || !PropertyUtils.isReadable(param, name)) { + continue; + } + if (Map.class.isAssignableFrom(origDescriptors[i] + .getPropertyType())) { + Map map = (Map) PropertyUtils + .getSimpleProperty(param, name); + if (map != null && map.size() > 0) { + isNotEmpty = true; + break; + } + } else if (Collection.class.isAssignableFrom(origDescriptors[i] + .getPropertyType())) { + Collection c = (Collection) PropertyUtils + .getSimpleProperty(param, name); + if (c != null && c.size() > 0) { + isNotEmpty = true; + break; + } + } else if (StringUtil.isNotEmpty(PropertyUtils + .getSimpleProperty(param, name))) { + isNotEmpty = true; + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return isNotEmpty; + } + + private static Map getRuleMap() { + Map ruleMap = new HashMap(); + List list =JeecgDataAutorUtils.loadDataSearchConditonSQL(); //(List) ContextHolderUtils + // .getRequest().getAttribute(Globals.MENU_DATA_AUTHOR_RULES); + if(list != null){ + for (TSDataRule rule : list) { + ruleMap.put(rule.getRuleColumn(), rule); + } + } + return ruleMap; + } + +// --author锛氶緳閲戞尝 ------start---date锛20150422--------for锛歴ql楂樼骇鏌ヨ鍣ㄥ弬鏁扮殑sql缁勮 + /** + * @author ljb + * 鏍规嵁瀵硅薄鎷艰sql + * TODO 缁撳悎DataRule + * @param list + * @param tab鏍煎紡鍖 + * @return + */ + public static String getSql(List list,String tab){ + StringBuffer sb=new StringBuffer(); + sb.append(" 1=1 "); + for(QueryCondition c :list){ + sb.append(tab+c);sb.append("\r\n"); + if(c.getChildren()!=null){ + + List list1= JSONHelper.toList(c.getChildren(), QueryCondition.class); + sb.append(tab); + sb.append(c.getRelation()+"( "); + sb.append(getSql(list1,tab+"\t")); + sb.append(tab+")\r\n"); + } + } + return sb.toString(); + } +} diff --git a/src/main/java/org/jeecgframework/core/extend/hqlsearch/SysContextSqlConvert.java b/src/main/java/org/jeecgframework/core/extend/hqlsearch/SysContextSqlConvert.java new file mode 100644 index 00000000..954035b4 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/hqlsearch/SysContextSqlConvert.java @@ -0,0 +1,107 @@ +package org.jeecgframework.core.extend.hqlsearch; + +import org.jeecgframework.core.extend.hqlsearch.parse.vo.HqlRuleEnum; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.web.system.pojo.base.TSDataRule; + +/** + * 鏁版嵁搴撳垪琛ㄥ簭鍒楀寲杞崲sql + * + * @ClassName: SqlJsonConvert + * @Description: TODO + * @author Comsys-skyCc cmzcheng@gmail.com + * @date 2014-8-25 涓嬪崍7:12:41 + * + */ +public class SysContextSqlConvert { + + enum Signal { + GREEN, YELLOW, RED + } + + /** + * + * setSqlModel sql琛屽垪杞崲 + * + * @Title: setSqlModel + * @Description: TODO + * @param @param dataRule + * @param @return 璁惧畾鏂囦欢 + * @return String 杩斿洖绫诲瀷 + * @throws + */ + public static String setSqlModel(TSDataRule dataRule){ + if(dataRule == null) + return ""; + String sqlValue=""; + HqlRuleEnum ruleEnum=HqlRuleEnum.getByValue(dataRule.getRuleConditions()); + //#{sys_user_code}% + String ValueTemp = dataRule.getRuleValue(); + String moshi = ""; + if(ValueTemp.indexOf("}")!=-1){ + moshi = ValueTemp.substring(ValueTemp.indexOf("}")+1); + } + String returnValue = null; + //閽堝鐗规畩鏍囩ず澶勭悊#{sysOrgCode}锛屽垽鏂浛鎹 + if (ValueTemp.contains("#{")) { + ValueTemp = ValueTemp.substring(2,ValueTemp.indexOf("}")); + } else { + ValueTemp = ValueTemp; + } + String tempValue = null; + tempValue = ResourceUtil.getUserSystemData(ValueTemp); + if(tempValue!=null){ + tempValue = tempValue + moshi; + }else{ + tempValue = ValueTemp; + } + switch (ruleEnum) { + case GT: + sqlValue+=" and "+dataRule.getRuleColumn()+" <'"+tempValue+"'"; + break; + case GE: + sqlValue+=" and "+dataRule.getRuleColumn()+" >='"+tempValue+"'"; + break; + case LT: + sqlValue+=" and "+dataRule.getRuleColumn()+" <'"+tempValue+"'"; + break; + case LE: + sqlValue+=" and "+dataRule.getRuleColumn()+" =>'"+tempValue+"'"; + break; + case EQ: + sqlValue+=" and "+dataRule.getRuleColumn()+" ='"+tempValue+"'"; + break; + case LIKE: + sqlValue+=" and "+dataRule.getRuleColumn()+" like '"+tempValue+"'"; + break; + case NE: + sqlValue+=" and "+dataRule.getRuleColumn()+" !='"+tempValue+"'"; + break; + case IN: + sqlValue+=" and "+dataRule.getRuleColumn()+" IN('"+tempValue+"')"; + default: + break; + } + + + return sqlValue; + } + + // /** + // * + // * setSqlIn sql涓篿n鐨勬柟娉 + // * + // * @Title: setSqlIn + // * @Description: TODO + // * @param @param dataRule + // * @param @param sqlValue + // * @param @return 璁惧畾鏂囦欢 + // * @return String 杩斿洖绫诲瀷 + // * @throws + // */ + // public static String setSqlIn(ListT dataRule,String + // sqlValue){ + // sqlValue+="'"+dataRule.getRuleValue()+"',"; + // return sqlValue; + // } +} diff --git a/src/main/java/org/jeecgframework/core/extend/hqlsearch/parse/ObjectParseUtil.java b/src/main/java/org/jeecgframework/core/extend/hqlsearch/parse/ObjectParseUtil.java new file mode 100644 index 00000000..6bb45bac --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/hqlsearch/parse/ObjectParseUtil.java @@ -0,0 +1,56 @@ +package org.jeecgframework.core.extend.hqlsearch.parse; + +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.extend.hqlsearch.parse.vo.HqlParseEnum; +import org.jeecgframework.core.extend.hqlsearch.parse.vo.HqlRuleEnum; + +/** + * 鍒ゆ柇绫诲瀷,鎷兼帴瀛楃涓 + * + * @author JueYue + * @date 2014骞8鏈23鏃 涓嬪崍4:07:34 + */ +public class ObjectParseUtil { + + public static void addCriteria(CriteriaQuery cq, String name, + HqlRuleEnum rule, Object value) { + if (value == null || rule == null) { + return; + } + switch (rule) { + case GT: + cq.gt(name, value); + break; + case GE: + cq.ge(name, value); + break; + case LT: + cq.lt(name, value); + break; + case LE: + cq.le(name, value); + break; + case EQ: + cq.eq(name, value); + break; + case NE: + cq.notEq(name, value); + break; + case IN: + cq.in(name, (Object[]) value); + break; + case LIKE: + cq.like(name, value); + break; + case LEFT_LIKE: + cq.like(name, HqlParseEnum.SUFFIX_ASTERISK_VAGUE.getValue() + value); + break; + case RIGHT_LIKE: + cq.like(name, value + HqlParseEnum.SUFFIX_ASTERISK_VAGUE.getValue()); + break; + default: + break; + } + } + +} diff --git a/src/main/java/org/jeecgframework/core/extend/hqlsearch/parse/PageValueConvertRuleEnum.java b/src/main/java/org/jeecgframework/core/extend/hqlsearch/parse/PageValueConvertRuleEnum.java new file mode 100644 index 00000000..eadb6a16 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/hqlsearch/parse/PageValueConvertRuleEnum.java @@ -0,0 +1,83 @@ +package org.jeecgframework.core.extend.hqlsearch.parse; + +import java.util.Arrays; + +import org.jeecgframework.core.extend.hqlsearch.parse.vo.HqlParseEnum; +import org.jeecgframework.core.extend.hqlsearch.parse.vo.HqlRuleEnum; + +/** + * 鐣岄潰鍙鍖栨暟缁勮浆鍖栦负鏋氫妇 + * + * @author JueYue + * @date 2014骞8鏈23鏃 涓嬪崍3:30:00 + */ +public class PageValueConvertRuleEnum { + + public static HqlRuleEnum convert(Object value) { + // 閬垮厤绌烘暟鎹 + if (value == null) { + return null; + } + String val = (value + "").toString().trim(); + if (val.length() == 0) { + return null; + } + // step 1 .> < + HqlRuleEnum rule = HqlRuleEnum.getByValue(val.substring(0, 1)); + // step 2 .>= =< + if (rule == null && val.length() >= 2) { + rule = HqlRuleEnum.getByValue(val.substring(0, 2)); + } + // step 3 like + if (rule == null + && val.contains(HqlParseEnum.SUFFIX_ASTERISK.getValue())) { + if (val.startsWith(HqlParseEnum.SUFFIX_ASTERISK.getValue()) + && val.endsWith(HqlParseEnum.SUFFIX_ASTERISK.getValue())) { + rule = HqlRuleEnum.LIKE; + } else if (val.startsWith(HqlParseEnum.SUFFIX_ASTERISK.getValue())) { + rule = HqlRuleEnum.LEFT_LIKE; + } else { + rule = HqlRuleEnum.RIGHT_LIKE; + } + } + // step 4 in + if (rule == null && val.contains(HqlParseEnum.SUFFIX_COMMA.getValue())) { + rule = HqlRuleEnum.IN; + } + // step 5 != + if(rule == null && val.startsWith(HqlParseEnum.SUFFIX_NOT_EQUAL.getValue())){ + rule = HqlRuleEnum.NE; + } + return rule != null ? rule : HqlRuleEnum.EQ; + } + + /** + * 鏇挎崲鎺夊叧閿瓧瀛楃 + * + * @param rule + * @param value + * @return + */ + public static Object replaceValue(HqlRuleEnum rule, Object value) { + if (rule == null) { + return null; + } + if (! (value instanceof String)){ + return value; + } + String val = (value + "").toString().trim(); + if (rule == HqlRuleEnum.LIKE) { + value = val.substring(1, val.length() - 1); + } else if (rule == HqlRuleEnum.LEFT_LIKE || rule == HqlRuleEnum.NE) { + value = val.substring(1); + } else if (rule == HqlRuleEnum.RIGHT_LIKE) { + value = val.substring(0, val.length() - 1); + } else if (rule != HqlRuleEnum.IN) { + value = val.replace(rule.getValue(), + HqlParseEnum.SUFFIX_NULL_STRING.getValue()); + } else { + value = val.split(","); + } + return value; + } +} diff --git a/src/main/java/org/jeecgframework/core/extend/hqlsearch/parse/vo/HqlParseEnum.java b/src/main/java/org/jeecgframework/core/extend/hqlsearch/parse/vo/HqlParseEnum.java new file mode 100644 index 00000000..6a1c6586 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/hqlsearch/parse/vo/HqlParseEnum.java @@ -0,0 +1,42 @@ +package org.jeecgframework.core.extend.hqlsearch.parse.vo; + +/** + * HQL 瑙f瀽 甯搁噺 + * Created by jue on 14-8-23. + */ +public enum HqlParseEnum { + + SUFFIX_COMMA(",","澶氭潯鏁版嵁"), + SUFFIX_ASTERISK("*","妯$硦鏌ヨ鏉′欢"), + SUFFIX_REG_ASTERISK("[*]","妯$硦鏌ヨ鏉′欢"), + SUFFIX_ASTERISK_VAGUE("%","妯$硦鏌ヨ鍊"), + SUFFIX_NOT_EQUAL("!","涓嶇瓑浜"), + SUFFIX_NOT_EQUAL_NULL("!NULL","涓嶇瓑浜庣┖"), + SUFFIX_KG(" ","绌烘牸"), + SUFFIX_NULL_STRING("","绌烘牸"); + + private String value; + + private String msg; + + HqlParseEnum(String value,String msg){ + this.value = value; + this.msg = msg; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} diff --git a/src/main/java/org/jeecgframework/core/extend/hqlsearch/parse/vo/HqlRuleEnum.java b/src/main/java/org/jeecgframework/core/extend/hqlsearch/parse/vo/HqlRuleEnum.java new file mode 100644 index 00000000..170a1920 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/hqlsearch/parse/vo/HqlRuleEnum.java @@ -0,0 +1,53 @@ +package org.jeecgframework.core.extend.hqlsearch.parse.vo; + +/** + * HQL 瑙勫垯 甯搁噺 + * Created by jue on 14-8-23. + */ +public enum HqlRuleEnum { + + GT(">","澶т簬"), + GE(">=","澶т簬绛変簬"), + LT("<","灏忎簬"), + LE("<=","灏忎簬绛変簬"), + EQ("=","绛変簬"), + NE("!=","涓嶇瓑浜"), + IN("IN","鍖呭惈"), + LIKE("LIKE","宸﹀彸妯$硦"), + LEFT_LIKE("LEFT_LIKE","宸︽ā绯"), + RIGHT_LIKE("RIGHT_LIKE","鍙虫ā绯"); + + private String value; + + private String msg; + + HqlRuleEnum(String value, String msg){ + this.value = value; + this.msg = msg; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public static HqlRuleEnum getByValue(String value){ + for(HqlRuleEnum val :values()){ + if (val.getValue().equals(value)){ + return val; + } + } + return null; + } +} diff --git a/src/main/java/org/jeecgframework/core/extend/swftools/ConStant.java b/src/main/java/org/jeecgframework/core/extend/swftools/ConStant.java new file mode 100644 index 00000000..8a87f7dc --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/swftools/ConStant.java @@ -0,0 +1,68 @@ +package org.jeecgframework.core.extend.swftools; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.ResourceUtil; + + +/** + * 甯搁噺绫 + */ +public class ConStant { + /**OpenOffice瀹夎鏍圭洰褰*/ + public static final String OFFICE_HOME; + static{ + OFFICE_HOME = ResourceUtil.getSessionattachmenttitle("office_home"); + } + /**鏂囦欢涓婁紶淇濆瓨鏍圭洰褰*/ + public static final String UPLOAD_BASE_DIR = "upload"; + /**鏂囦欢杞崲宸ュ叿鏍圭洰褰*/ + public static final String SWFTOOLS_BASE_DIR = "swftools"; + /**PDF-SWF*/ + public static final String SWFTOOLS_PDF2SWF_PATH ="pdf2swf.exe"; + /**GIF-SWF*/ + public static final String SWFTOOLS_GIF2SWF_PATH ="gif2swf.exe"; + /**PNG-SWF*/ + public static final String SWFTOOLS_PNG2SWF_PATH ="png2swf.exe"; + /**JPEG-SWF*/ + public static final String SWFTOOLS_JPEG2SWF_PATH ="jpeg2swf.exe"; + /**WAV-SWF*/ + public static final String SWFTOOLS_WAV2SWF_PATH = "wav2swf.exe"; + /**PDF鍚堝苟*/ + public static final String SWFTOOLS_PDFCOMBINE_PATH ="swfcombine.exe"; + /**SWF鏂囦欢鍚庣紑*/ + public static final String SWF_STUFFIX = "swf"; + public static String SWFTOOLS_HOME=""; + /** + * 鏍规嵁鎵╁睍鍚嶈幏鍙栬浆鎹㈠伐鍏 + * @param extend + * @return + */ + public static String getSWFToolsPath(String extend) + { + HttpServletRequest request=ContextHolderUtils.getRequest(); + SWFTOOLS_HOME=request.getSession().getServletContext().getRealPath("/") + SWFTOOLS_BASE_DIR + "/"; + if(extend.equals("pdf")) + { + SWFTOOLS_HOME+=SWFTOOLS_PDF2SWF_PATH; + } + if(extend.equals("gif")) + { + SWFTOOLS_HOME+=SWFTOOLS_GIF2SWF_PATH; + } + if(extend.equals("png")) + { + SWFTOOLS_HOME+=SWFTOOLS_PNG2SWF_PATH; + } + if(extend.equals("jpeg")) + { + SWFTOOLS_HOME+=SWFTOOLS_JPEG2SWF_PATH; + } + if(extend.equals("wav")) + { + SWFTOOLS_HOME+=SWFTOOLS_WAV2SWF_PATH; + } + return SWFTOOLS_HOME; + } +} diff --git a/src/main/java/org/jeecgframework/core/extend/swftools/DocConverter.java b/src/main/java/org/jeecgframework/core/extend/swftools/DocConverter.java new file mode 100644 index 00000000..38955a9d --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/swftools/DocConverter.java @@ -0,0 +1,30 @@ +package org.jeecgframework.core.extend.swftools; +import org.jeecgframework.core.util.FileUtils; +public class DocConverter { + + private PDFConverter pdfConverter; + private SWFConverter swfConverter; + + + public DocConverter(PDFConverter pdfConverter, SWFConverter swfConverter) { + super(); + this.pdfConverter = pdfConverter; + this.swfConverter = swfConverter; + } + + + public void convert(String inputFile,String swfFile,String extend){ + this.pdfConverter.convert2PDF(inputFile,extend); + String pdfFile = FileUtils.getFilePrefix(inputFile)+".pdf"; + this.swfConverter.convert2SWF(pdfFile, swfFile); + } + + public void convert(String inputFile,String extend){ + this.pdfConverter.convert2PDF(inputFile,extend); + String pdfFile = FileUtils.getFilePrefix2(inputFile)+".pdf"; + extend=FileUtils.getExtend(pdfFile); + this.swfConverter.convert2SWF(pdfFile,extend); + + } + +} diff --git a/src/main/java/org/jeecgframework/core/extend/swftools/OpenOfficePDFConverter.java b/src/main/java/org/jeecgframework/core/extend/swftools/OpenOfficePDFConverter.java new file mode 100644 index 00000000..7b1488b5 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/swftools/OpenOfficePDFConverter.java @@ -0,0 +1,94 @@ +package org.jeecgframework.core.extend.swftools; + +import java.io.File; +import java.io.FileNotFoundException; + +import org.artofsolving.jodconverter.OfficeDocumentConverter; +import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration; +import org.artofsolving.jodconverter.office.OfficeManager; +import org.jeecgframework.core.util.FileUtils; + + +/** + * OFFICE鏂囨。杞崲鏈嶅姟绫 + * + * @author 寮犱唬娴 + * + */ +public class OpenOfficePDFConverter implements PDFConverter { + + private static OfficeManager officeManager; + /** OpenOffice瀹夎鏍圭洰褰 */ + private static String OFFICE_HOME = ConStant.OFFICE_HOME; + private static int[] port = { 8100 }; + + public void convert2PDF(String inputFile, String pdfFile, String extend) { + + if (extend.equals("txt")) { + + String odtFile = FileUtils.getFilePrefix(inputFile) + ".odt"; + if (new File(odtFile).exists()) { + org.jeecgframework.core.util.LogUtil.info("odt鏂囦欢宸插瓨鍦紒"); + inputFile = odtFile; + } else { + try { + FileUtils.copyFile(inputFile, odtFile); + inputFile = odtFile; + } catch (FileNotFoundException e) { + org.jeecgframework.core.util.LogUtil.info("Odt鏂囨。涓嶅瓨鍦紒"); + e.printStackTrace(); + } + } + + } + startService(); + //pdfFile = pdfFile.replaceAll(" ", "").replaceAll("銆", ""); + org.jeecgframework.core.util.LogUtil.info("杩涜鏂囨。杞崲杞崲:" + inputFile + " --> " + pdfFile); + OfficeDocumentConverter converter = new OfficeDocumentConverter( + officeManager); + try { + converter.convert(new File(inputFile), new File(pdfFile)); + } catch (Exception e) { + // TODO: handle exception + org.jeecgframework.core.util.LogUtil.info(e.getMessage()); + } + + stopService(); + org.jeecgframework.core.util.LogUtil.info("杩涜鏂囨。杞崲杞崲---- 缁撴潫----"); + } + + public void convert2PDF(String inputFile, String extend) { + //inputFile = inputFile.replaceAll(" ", "").replaceAll("銆", ""); + String pdfFile = FileUtils.getFilePrefix2(inputFile) + ".pdf"; + convert2PDF(inputFile, pdfFile, extend); + + } + + public static void startService() { + DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration(); + try { + // 鍑嗗鍚姩鏈嶅姟 + configuration.setOfficeHome(OFFICE_HOME);// 璁剧疆OpenOffice.org瀹夎鐩綍 + // 璁剧疆杞崲绔彛锛岄粯璁や负8100 + configuration.setPortNumbers(port); + // 璁剧疆浠诲姟鎵ц瓒呮椂涓5鍒嗛挓 + configuration.setTaskExecutionTimeout(1000 * 60 * 5L); + // 璁剧疆浠诲姟闃熷垪瓒呮椂涓24灏忔椂 + configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L); + + officeManager = configuration.buildOfficeManager(); + officeManager.start(); // 鍚姩鏈嶅姟 + org.jeecgframework.core.util.LogUtil.info("office杞崲鏈嶅姟鍚姩鎴愬姛!"); + } catch (Exception ce) { + org.jeecgframework.core.util.LogUtil.info("office杞崲鏈嶅姟鍚姩澶辫触!璇︾粏淇℃伅:" + ce); + } + } + + public static void stopService() { + org.jeecgframework.core.util.LogUtil.info("鍏抽棴office杞崲鏈嶅姟...."); + if (officeManager != null) { + officeManager.stop(); + } + org.jeecgframework.core.util.LogUtil.info("鍏抽棴office杞崲鎴愬姛!"); + } +} diff --git a/src/main/java/org/jeecgframework/core/extend/swftools/PDFConverter.java b/src/main/java/org/jeecgframework/core/extend/swftools/PDFConverter.java new file mode 100644 index 00000000..31961901 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/swftools/PDFConverter.java @@ -0,0 +1,12 @@ +package org.jeecgframework.core.extend.swftools; + +/** + * PDF鏂囨。杞崲鎺ュ彛 + * @author 寮犱唬娴 + * + */ +public interface PDFConverter { + public void convert2PDF(String inputFile,String pdfFile,String extend); + public void convert2PDF(String inputFile,String extend); + +} diff --git a/src/main/java/org/jeecgframework/core/extend/swftools/SWFConverter.java b/src/main/java/org/jeecgframework/core/extend/swftools/SWFConverter.java new file mode 100644 index 00000000..ba9431a2 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/swftools/SWFConverter.java @@ -0,0 +1,6 @@ +package org.jeecgframework.core.extend.swftools; + +public interface SWFConverter { + public void convert2SWF(String inputFile,String swfFile,String extend); + public void convert2SWF(String inputFile,String extend); +} diff --git a/src/main/java/org/jeecgframework/core/extend/swftools/SWFToolsSWFConverter.java b/src/main/java/org/jeecgframework/core/extend/swftools/SWFToolsSWFConverter.java new file mode 100644 index 00000000..e691ee22 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/swftools/SWFToolsSWFConverter.java @@ -0,0 +1,54 @@ +package org.jeecgframework.core.extend.swftools; + +import java.io.File; +import java.io.IOException; + +import org.jeecgframework.core.util.FileUtils; +import org.jeecgframework.core.util.PinyinUtil; + + +public class SWFToolsSWFConverter implements SWFConverter { + /** SWFTools pdf2swf.exe璺緞 */ + private static String PDF2SWF_PATH = ConStant.SWFTOOLS_PDF2SWF_PATH; + + public void convert2SWF(String inputFile, String swfFile, String extend) { + File pdfFile = new File(inputFile); + File outFile = new File(swfFile); + + if (!pdfFile.exists()) { + org.jeecgframework.core.util.LogUtil.info("PDF鏂囦欢涓嶅瓨鍦紒"); + return; + } + + if (outFile.exists()) { + org.jeecgframework.core.util.LogUtil.info("SWF鏂囦欢宸插瓨鍦紒"); + return; + } + String command = ConStant.getSWFToolsPath(extend) + " \"" + inputFile + + + "\" -o " +" \""+ swfFile +" \""+ " -s languagedir=D:\\xpdf-chinese-simplified -T 9 -f"; +// + "\" -o " + swfFile + " -s languagedir=D:\\xpdf-chinese-simplified -T 9 -f"; + try { + // 寮濮嬭浆鎹㈡枃妗 + Process process = Runtime.getRuntime().exec(command); + StreamGobbler errorGobbler = new StreamGobbler( + process.getErrorStream(), "Error"); + StreamGobbler outputGobbler = new StreamGobbler( + process.getInputStream(), "Output"); + errorGobbler.start(); + outputGobbler.start(); + try { + process.waitFor(); + org.jeecgframework.core.util.LogUtil.info("鏃堕棿-------"+process.waitFor()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + public void convert2SWF(String inputFile, String extend) { + String swfFile = PinyinUtil.getPinYinHeadChar(FileUtils.getFilePrefix2(inputFile)) + ".swf"; + convert2SWF(inputFile, swfFile, extend); + } +} diff --git a/src/main/java/org/jeecgframework/core/extend/swftools/StreamGobbler.java b/src/main/java/org/jeecgframework/core/extend/swftools/StreamGobbler.java new file mode 100644 index 00000000..8ba68cc3 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/swftools/StreamGobbler.java @@ -0,0 +1,35 @@ +package org.jeecgframework.core.extend.swftools; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class StreamGobbler extends Thread { + + InputStream is; + String type; + + public StreamGobbler(InputStream is, String type) { + this.is = is; + this.type = type; + } + + public void run() { + try { + InputStreamReader isr = new InputStreamReader(is); + BufferedReader br = new BufferedReader(isr); + String line = null; + while ((line = br.readLine()) != null) { + if (type.equals("Error")) { + org.jeecgframework.core.util.LogUtil.info("Error :" + line); + } else { + org.jeecgframework.core.util.LogUtil.info("鏂囦欢杞崲:" + line); + } + } + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } +} + \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/extend/swftools/SwfToolsUtil.java b/src/main/java/org/jeecgframework/core/extend/swftools/SwfToolsUtil.java new file mode 100644 index 00000000..62ffc33b --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/swftools/SwfToolsUtil.java @@ -0,0 +1,26 @@ +package org.jeecgframework.core.extend.swftools; + +import org.jeecgframework.core.util.FileUtils; +/** + * 鏂囦欢杞崲璋冪敤鎺ュ彛 + * @author 寮犱唬娴 + * + */ +public class SwfToolsUtil { + public static void convert2SWF(String inputFile) { + + String extend=FileUtils.getExtend(inputFile); + PDFConverter pdfConverter = new OpenOfficePDFConverter(); + SWFConverter swfConverter = new SWFToolsSWFConverter(); + if(extend.equals("pdf")) + { + swfConverter.convert2SWF(inputFile,extend); + } + if(extend.equals("doc")||extend.equals("docx")||extend.equals("xls")||extend.equals("pptx")||extend.equals("xlsx")||extend.equals("ppt")||extend.equals("txt")||extend.equals("odt")) + { + DocConverter converter = new DocConverter(pdfConverter,swfConverter); + converter.convert(inputFile,extend); + } + + } +} diff --git a/src/main/java/org/jeecgframework/core/extend/template/Caculator.java b/src/main/java/org/jeecgframework/core/extend/template/Caculator.java new file mode 100644 index 00000000..ae1d9a30 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/template/Caculator.java @@ -0,0 +1,305 @@ +package org.jeecgframework.core.extend.template; + +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.Stack; +import java.util.Vector; + + +/** + * @author + * + */ +public class Caculator { + + public static java.text.NumberFormat nfd = NumberFormat.getNumberInstance(); + public static java.text.NumberFormat nfi = NumberFormat.getNumberInstance(); + public static DecimalFormat dfd = (DecimalFormat) nfd; + public static DecimalFormat dfi = (DecimalFormat) nfi; + static{ + dfd.applyPattern("######.00"); + dfi.applyPattern("######"); + } + class Item + { + boolean ops; + double value; + + Character opVal; + int opPriority; + } + + Stack opStack=new Stack(); + Vector calcStack=new Vector(); + /** + * + */ + public Caculator() { + // TODO Auto-generated constructor stub + } + + + + + public String calc() + { + + + Stack tmp=new Stack(); + while(!calcStack.isEmpty()) + { + Item it=calcStack.remove(0); + + if(!it.ops) + { + tmp.push(it); + } + else + { + double op2=tmp.pop().value; + double op1=0L;//tmp.pop().value; + if(!tmp.isEmpty()) + { + op1=tmp.pop().value; + } + Item newItem=new Item(); + newItem.ops=true; + switch(it.opVal) + { + case '+': + newItem.value=op1+op2; + + break; + case '-': + newItem.value=op1-op2; + break; + case '*': + + newItem.value=op1*op2; + break; + case '/': + + newItem.value=op1/op2; + if(newItem.value==Double.NEGATIVE_INFINITY || newItem.value==Double.POSITIVE_INFINITY || new Double(newItem.value).toString().equals("NaN")) + { + newItem.value=0.0; + } +// double tt=0.0/0.0; +// double ff=Double.longBitsToDouble(0x7ff8000000000000L); +// if(new Double(tt).toString().equals("NaN")) +// { +// org.jeecgframework.core.util.LogUtil.info(tt); +// } + + break; + } + tmp.push(newItem); + } + } + + + Double result = tmp.pop().value; + + return getDtoI(result); + + /* double c=0; + long b = (long)Math.round(result * 100); //灏忔暟鐐瑰悗涓や綅鍓嶇Щ锛屽苟鍥涜垗浜斿叆 + if((b % 100)!=0) + { + c = (double)b / 100.00; //杩樺師灏忔暟鐐瑰悗涓や綅 + return dfd.format(c); + }else + { + c = (double)b / 100.00; + return dfi.format(c); + } + */ + } + public static String getDtoI(Double d) + { + double c=0; + long b = (long)Math.round(d * 100); //灏忔暟鐐瑰悗涓や綅鍓嶇Щ锛屽苟鍥涜垗浜斿叆 + if((b % 100)!=0) + { + c = (double)b / 100.00; //杩樺師灏忔暟鐐瑰悗涓や綅 + return dfd.format(c); + }else + { + c = (double)b / 100.00; + return dfi.format(c); + } + } + /** + * 1)鏁板瓧鐩存帴杈撳嚭 + * 2)寮鎷彿鍒欏帇鏍 + * 3锛夐棴鎷彿鎶婃爤涓厓绱犱緷娆¤緭鍑虹洿鍒伴亣鍒板紑鎷彿 + * 4锛夎繍绠楃鏃 + * a)寰幆锛屽綋鏍堥潪绌猴紝骞朵笖鏍堥《鍏冪礌涓嶆槸寮鎷彿锛屽苟涓旀爤椤惰繍绠楃浼樺厛绾т笉浣庝簬杈撳叆鐨勮繍绠楃鐨勪紭鍏堢骇锛屽弽澶嶅皢鍏惰緭鍑 + * b锛夋妸杈撳叆杩愮畻绗﹀帇鏍 + * 5锛夎緭鍑烘爤鍐呭墿浣欏厓绱 + * @param in + * @return + */ + public String transInfixToPosfix(String in) + { + + char[] cin=in.toCharArray(); + StringBuffer buffer=new StringBuffer(); + + for(int i=0;i='0'&&cin[j]<='9') ||cin[j]=='.' || cin[j]=='E');j++); + if(j==i) + { + throw new RuntimeException("wrong input."); + } + newItem.ops=false; + try { + newItem.value=Double.parseDouble(new String(cin,i,j-i)); + } catch (NumberFormatException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + org.jeecgframework.core.util.LogUtil.info("cal鏁板瓧鐢熸垚閿欒锛侊紒"); + } + buffer.append(newItem.value); + calcStack.add(newItem); + i=j-1; + break; + + + } + } + while(!opStack.isEmpty()) + { + Item item=opStack.pop(); + calcStack.add(item); + buffer.append(item.opVal); + + } + return buffer.toString(); + + } + + + + private void doOps(StringBuffer buffer, Item newItem) { + while(!opStack.isEmpty()) + { + Item item=opStack.peek(); + if(item.opVal!='('&&item.opPriority>=newItem.opPriority) + { + calcStack.add(item); + opStack.pop(); + buffer.append(item.opVal); + } + else + { + break; + } + } + opStack.push(newItem); + } + + + /** + * @param args + */ + public static void main(String[] args) { + Caculator calc=new Caculator(); + +// org.jeecgframework.core.util.LogUtil.info(calc.transInfixToPosfix("1+2*3+7.5-(4/2+8)/5")); +// org.jeecgframework.core.util.LogUtil.info("value is:"+calc.calc()); + +// org.jeecgframework.core.util.LogUtil.info(calc.transInfixToPosfix("110815.00047*2")); +// org.jeecgframework.core.util.LogUtil.info("value is:"+calc.calc()); +// org.jeecgframework.core.util.LogUtil.info(calc.transInfixToPosfix("110815.125047*2")); +// org.jeecgframework.core.util.LogUtil.info("value is:"+calc.calc()); + +// org.jeecgframework.core.util.LogUtil.info(calc.transInfixToPosfix("((110815.0347)*2+10)/0")); +// org.jeecgframework.core.util.LogUtil.info("value is:"+calc.calc()); + + +// org.jeecgframework.core.util.LogUtil.info(calc.transInfixToPosfix("0.02")); +// org.jeecgframework.core.util.LogUtil.info("value is:"+calc.calc()); +// org.jeecgframework.core.util.LogUtil.info(calc.transInfixToPosfix("0.0")); +// org.jeecgframework.core.util.LogUtil.info("value is:"+calc.calc()); + + org.jeecgframework.core.util.LogUtil.info(calc.transInfixToPosfix("1.3E7+0.5")); + org.jeecgframework.core.util.LogUtil.info("value is:"+calc.calc()); + Double dd=Double.parseDouble("1.35378957E7"); + + org.jeecgframework.core.util.LogUtil.info(Caculator.getDtoI(dd)); + + org.jeecgframework.core.util.LogUtil.info(dd); + + + } + +} + diff --git a/src/main/java/org/jeecgframework/core/extend/template/DataSourceMap.java b/src/main/java/org/jeecgframework/core/extend/template/DataSourceMap.java new file mode 100644 index 00000000..c508304f --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/template/DataSourceMap.java @@ -0,0 +1,37 @@ +package org.jeecgframework.core.extend.template; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +@SuppressWarnings("unchecked") +public class DataSourceMap { + private static Map dsm; + + static{ + InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("dataSourceMap.properties"); + Properties p=new Properties(); + try { + p.load(is); + dsm=(HashMap) new HashMap(); + Set ps=p.entrySet(); + for (Iterator iterator = ps.iterator(); iterator.hasNext();) { + Map.Entry entry = (Map.Entry) iterator.next(); + dsm.put(entry.getKey().toString(), entry.getValue()==null?"":entry.getValue().toString().trim()); + } + is.close();//鍏抽棴 + is=null; + } catch (IOException e) { + e.printStackTrace(); + } + } + public static Map getDataSourceMap() { + Map datadsm=new HashMap(); + datadsm.putAll(dsm); + return datadsm; + } + +} diff --git a/src/main/java/org/jeecgframework/core/extend/template/Template.java b/src/main/java/org/jeecgframework/core/extend/template/Template.java new file mode 100644 index 00000000..fcf8e729 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/extend/template/Template.java @@ -0,0 +1,108 @@ +package org.jeecgframework.core.extend.template; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Template { + public HashMap teprems = null; + public String templatecCode; + public String parameterName; + public String parameterValue; + public String parameterTagName; + public String parameterTagValue; + public Object templatecObject; + public String templatePath; + public Class templateClass; + public Map dataSourceMap; + public List dataSet; + + public List getDataSet() { + return dataSet; + } + + public void setDataSet(List dataSet) { + this.dataSet = dataSet; + } + + public String getTemplatePath() { + return templatePath; + } + + public void setTemplatePath(String templatePath) { + this.templatePath = templatePath; + } + + public Map getDataSourceMap() { + return dataSourceMap; + } + + public void setDataSourceMap(Map dataSourceMap) { + this.dataSourceMap = dataSourceMap; + } + + public String getParameterName() { + return parameterName; + } + + public Class getTemplateClass() { + return templateClass; + } + + public void setTemplateClass(Class templateClass) { + this.templateClass = templateClass; + } + + public void setParameterName(String parameterName) { + this.parameterName = parameterName; + } + + public String getParameterTagName() { + return parameterTagName; + } + + public void setParameterTagName(String parameterTagName) { + this.parameterTagName = parameterTagName; + } + + public String getParameterTagValue() { + return parameterTagValue; + } + + public void setParameterTagValue(String parameterTagValue) { + this.parameterTagValue = parameterTagValue; + } + + public String getParameterValue() { + return parameterValue; + } + + public void setParameterValue(String parameterValue) { + this.parameterValue = parameterValue; + } + + public Object getTemplatecObject() { + return templatecObject; + } + + public void setTemplatecObject(Object templatecObject) { + this.templatecObject = templatecObject; + } + + public String getTemplatecCode() { + return templatecCode; + } + + public void setTemplatecCode(String templatecCode) { + this.templatecCode = templatecCode; + } + + public HashMap getTeprems() { + return teprems; + } + + public void setTeprems(HashMap teprems) { + this.teprems = teprems; + } + +} diff --git a/src/main/java/org/jeecgframework/core/groovy/GroovyBinding.java b/src/main/java/org/jeecgframework/core/groovy/GroovyBinding.java new file mode 100644 index 00000000..13bfa8ac --- /dev/null +++ b/src/main/java/org/jeecgframework/core/groovy/GroovyBinding.java @@ -0,0 +1,67 @@ +package org.jeecgframework.core.groovy; + +import groovy.lang.Binding; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class GroovyBinding extends Binding { + private static ThreadLocal> localVars = new ThreadLocal>(); + + private static Map propertyMap = new ConcurrentHashMap(); + + public GroovyBinding() { + } + + public GroovyBinding(Map variables) { + localVars.set(variables); + } + + public GroovyBinding(String[] args) { + this(); + setVariable("args", args); + } + + public Object getVariable(String name) { + Map map = localVars.get(); + Object result = null; + if ((map != null) && (map.containsKey(name))) { + result = map.get(name); + } else { + result = propertyMap.get(name); + } + + return result; + } + + public void setVariable(String name, Object value) { + if (localVars.get() == null) { + Map vars = new LinkedHashMap(); + vars.put(name, value); + localVars.set(vars); + } else { + (localVars.get()).put(name, value); + } + } + + public Map getVariables() { + if (localVars.get() == null) { + return new LinkedHashMap(); + } + + return localVars.get(); + } + + public void clearVariables() { + localVars.remove(); + } + + public Object getProperty(String property) { + return propertyMap.get(property); + } + + public void setProperty(String property, Object newValue) { + propertyMap.put(property, newValue); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/groovy/GroovyParse.java b/src/main/java/org/jeecgframework/core/groovy/GroovyParse.java new file mode 100644 index 00000000..872a99d4 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/groovy/GroovyParse.java @@ -0,0 +1,36 @@ +package org.jeecgframework.core.groovy; + +import java.util.HashMap; +import java.util.Map; + +import org.jeecgframework.core.util.ApplicationContextUtil; +import org.springframework.context.ApplicationContext; + + +/** + * 鍏紡璁$畻 + * + */ +public class GroovyParse { + /** + * 鍏紡瑙f瀽璁$畻 + */ + public static Object formulaParse(String formula, Map map) { + ApplicationContext context = ApplicationContextUtil.getContext(); + GroovyScriptEngine groovyScriptEngine = context.getBean(GroovyScriptEngine.class); + Object value = groovyScriptEngine.executeObject(formula, map); + return value; + } + + public static void main(String[] args) { + String formula = "println 'Hello World!';po = '9s00';return (a * b);"; + Map map = new HashMap(); + map.put("a", 900); + map.put("b", 10); + GroovyScriptEngine groovyScriptEngine = new GroovyScriptEngine(); + Object value = groovyScriptEngine.executeObject(formula, map); + System.out.println(value); + System.out.println(groovyScriptEngine.binding.getVariable("po")); + } + +} diff --git a/src/main/java/org/jeecgframework/core/groovy/GroovyScriptEngine.java b/src/main/java/org/jeecgframework/core/groovy/GroovyScriptEngine.java new file mode 100644 index 00000000..75c1b6e0 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/groovy/GroovyScriptEngine.java @@ -0,0 +1,82 @@ +package org.jeecgframework.core.groovy; + +import groovy.lang.GroovyShell; + +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; + +/** + * Groovy鑴氭湰寮曟搸 + * @author zhangdaihao + * + */ +public class GroovyScriptEngine implements BeanPostProcessor { + private Log logger = LogFactory.getLog(GroovyScriptEngine.class); + public GroovyBinding binding = new GroovyBinding(); + + public void execute(String script, Map vars) { + executeObject(script, vars); + } + + private void setParameters(GroovyShell shell, Map vars) { + if (vars == null) + return; + Set set = vars.entrySet(); + for (Iterator it = set.iterator(); it.hasNext();) { + @SuppressWarnings("rawtypes") + Map.Entry entry = (Map.Entry) it.next(); + shell.setVariable((String) entry.getKey(), entry.getValue()); + } + } + + public boolean executeBoolean(String script, Map vars) { + Boolean rtn = (Boolean) executeObject(script, vars); + return rtn.booleanValue(); + } + + public String executeString(String script, Map vars) { + String str = (String) executeObject(script, vars); + return str; + } + + public int executeInt(String script, Map vars) { + Integer rtn = (Integer) executeObject(script, vars); + return rtn.intValue(); + } + + public float executeFloat(String script, Map vars) { + Float rtn = (Float) executeObject(script, vars); + return rtn.floatValue(); + } + + public Object executeObject(String script, Map vars) { + this.logger.debug("鎵ц:" + script); + this.binding.clearVariables(); + GroovyShell shell = new GroovyShell(this.binding); + setParameters(shell, vars); + + script = script.replace("'", "'").replace(""", "\"").replace(">", ">").replace("<", "<").replace("&nuot;", "\n").replace("&", "&"); + + Object rtn = shell.evaluate(script); + //this.binding.clearVariables(); + return rtn; + } + + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + boolean isImplScript = bean.getClass().isInstance(IScript.class); + if (isImplScript) { + this.binding.setProperty(beanName, bean); + } + return bean; + } + + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + return bean; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/groovy/IScript.java b/src/main/java/org/jeecgframework/core/groovy/IScript.java new file mode 100644 index 00000000..c04e579d --- /dev/null +++ b/src/main/java/org/jeecgframework/core/groovy/IScript.java @@ -0,0 +1,11 @@ +package org.jeecgframework.core.groovy; + +/** + * ISCPIPT鎺ュ彛 + * 瀹炵幇杩欎釜鎺ュ彛鐨勭被灏辨垚鑴氭湰寮曟搸BEAN,鍏紡閲岃兘寮曠敤鐨刡ean鍙渶瀹炵幇iscript鎺ュ彛 + * @author zhangdaihao + * + */ +public abstract interface IScript +{ +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/groovy/impl/FormulaImpl.java b/src/main/java/org/jeecgframework/core/groovy/impl/FormulaImpl.java new file mode 100644 index 00000000..13b57aa2 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/groovy/impl/FormulaImpl.java @@ -0,0 +1,14 @@ +package org.jeecgframework.core.groovy.impl; + +import org.jeecgframework.core.groovy.IScript; +import org.springframework.stereotype.Component; + +/** + * 鍏紡鑴氭湰 + */ +@Component +public class FormulaImpl implements IScript { + public Double add(Double a,Double b) { + return a*b; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/groovy/impl/ScriptImpl.java b/src/main/java/org/jeecgframework/core/groovy/impl/ScriptImpl.java new file mode 100644 index 00000000..3ce7dec9 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/groovy/impl/ScriptImpl.java @@ -0,0 +1,14 @@ +package org.jeecgframework.core.groovy.impl; + +import org.jeecgframework.core.groovy.IScript; +import org.springframework.stereotype.Component; + +/** + * 绯荤粺鑴氭湰 + */ +@Component +public class ScriptImpl implements IScript { + public String getCurrentUserId() { + return "1"; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/interceptors/AuthInterceptor.java b/src/main/java/org/jeecgframework/core/interceptors/AuthInterceptor.java new file mode 100644 index 00000000..51f419f8 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/interceptors/AuthInterceptor.java @@ -0,0 +1,238 @@ +package org.jeecgframework.core.interceptors; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.extend.hqlsearch.SysContextSqlConvert; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.JeecgDataAutorUtils; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.web.system.manager.ClientManager; +import org.jeecgframework.web.system.pojo.base.Client; +import org.jeecgframework.web.system.pojo.base.TSDataRule; +import org.jeecgframework.web.system.pojo.base.TSFunction; +import org.jeecgframework.web.system.pojo.base.TSOperation; +import org.jeecgframework.web.system.pojo.base.TSUser; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.view.RedirectView; + + +/** + * 鏉冮檺鎷︽埅鍣 + * + * @author 寮犱唬娴 + * + */ +public class AuthInterceptor implements HandlerInterceptor { + + private static final Logger logger = Logger.getLogger(AuthInterceptor.class); + private SystemService systemService; + private List excludeUrls; + private static List functionList; + + + public List getExcludeUrls() { + return excludeUrls; + } + + public void setExcludeUrls(List excludeUrls) { + this.excludeUrls = excludeUrls; + } + + public SystemService getSystemService() { + return systemService; + } + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + /** + * 鍦╟ontroller鍚庢嫤鎴 + */ + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) throws Exception { + } + + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView modelAndView) throws Exception { + + } + + /** + * 鍦╟ontroller鍓嶆嫤鎴 + */ + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { + String requestPath = ResourceUtil.getRequestPath(request);// 鐢ㄦ埛璁块棶鐨勮祫婧愬湴鍧 + HttpSession session = ContextHolderUtils.getSession(); + Client client = ClientManager.getInstance().getClient(session.getId()); + if(client == null){ + client = ClientManager.getInstance().getClient( + request.getParameter("sessionId")); + } + if (excludeUrls.contains(requestPath)) { + //濡傛灉璇ヨ姹備笉鍦ㄦ嫤鎴寖鍥村唴锛岀洿鎺ヨ繑鍥瀟rue + return true; + } else { + if (client != null && client.getUser()!=null ) { + if((!hasMenuAuth(request)) && !client.getUser().getUserName().equals("admin")){ + response.sendRedirect("loginController.do?noAuth"); + //request.getRequestDispatcher("webpage/common/noAuth.jsp").forward(request, response); + return false; + } + //String functionId=oConvertUtils.getString(request.getParameter("clickFunctionId")); + String functionId=""; + //onlinecoding鐨勮闂湴鍧鏈夎寰嬪彲寰紝鏁版嵁鏉冮檺閾炬帴绡℃敼 + if(requestPath.equals("cgAutoListController.do?datagrid")) { + requestPath += "&configId=" + request.getParameter("configId"); + } + if(requestPath.equals("cgAutoListController.do?list")) { + requestPath += "&id=" + request.getParameter("id"); + } + if(requestPath.equals("cgFormBuildController.do?ftlForm")) { + requestPath += "&tableName=" + request.getParameter("tableName"); + } + //杩欎釜鍦版柟鐢ㄥ叏鍖归厤锛熷簲璇ユ槸妯$硦鏌ヨ鍚 + //TODO + List functions = systemService.findByProperty(TSFunction.class, "functionUrl", requestPath); + + if (functions.size()>0){ + functionId = functions.get(0).getId(); + } + + //Step.1 绗竴閮ㄥ垎澶勭悊椤甸潰琛ㄥ崟鍜屽垪琛ㄧ殑椤甸潰鎺т欢鏉冮檺锛堥〉闈㈣〃鍗曞瓧娈+椤甸潰鎸夐挳绛夋帶浠讹級 + if(!oConvertUtils.isEmpty(functionId)){ + //鑾峰彇鑿滃崟瀵瑰簲鐨勯〉闈㈡帶鍒舵潈闄愶紙鍖呮嫭琛ㄥ崟瀛楁鍜屾搷浣滄寜閽級 + Set operationCodes = systemService.getOperationCodesByUserIdAndFunctionId(client.getUser().getId(), functionId); + request.setAttribute(Globals.OPERATIONCODES, operationCodes); + } + if(!oConvertUtils.isEmpty(functionId)){ + //List allOperation=this.systemService.findListbySql("SELECT operationcode FROM t_s_operation WHERE functionid='"+functionId+"'"); + List allOperation=this.systemService.findByProperty(TSOperation.class, "TSFunction.id", functionId); + + List newall = new ArrayList(); + if(allOperation.size()>0){ + for(TSOperation s:allOperation){ + //s=s.replaceAll(" ", ""); + newall.add(s); + } + String hasOperSql="SELECT operation FROM t_s_role_function fun, t_s_role_user role WHERE " + + "fun.functionid='"+functionId+"' AND fun.operation!='' AND fun.roleid=role.roleid AND role.userid='"+client.getUser().getId()+"' "; + List hasOperList = this.systemService.findListbySql(hasOperSql); + for(String operationIds:hasOperList){ + for(String operationId:operationIds.split(",")){ + operationId=operationId.replaceAll(" ", ""); + TSOperation operation = new TSOperation(); + operation.setId(operationId); + newall.remove(operation); + } + } + } + request.setAttribute(Globals.NOAUTO_OPERATIONCODES, newall); + + //Step.2 绗簩閮ㄥ垎澶勭悊鍒楄〃鏁版嵁绾ф潈闄 + //灏忓窛 -- 鑿滃崟鏁版嵁瑙勫垯闆嗗悎(鏁版嵁鏉冮檺) + List MENU_DATA_AUTHOR_RULES = new ArrayList(); + //灏忓窛 -- 鑿滃崟鏁版嵁瑙勫垯sql(鏁版嵁鏉冮檺) + String MENU_DATA_AUTHOR_RULE_SQL=""; + + + //鏁版嵁鏉冮檺瑙勫垯鐨勬煡璇 + //鏌ヨ鎵鏈夌殑褰撳墠杩欎釜鐢ㄦ埛鎵瀵瑰簲鐨勮鑹插拰鑿滃崟鐨刣atarule鐨勬暟鎹鍒檌d + Set dataruleCodes = systemService.getOperationCodesByUserIdAndDataId(client.getUser().getId(), functionId); + request.setAttribute("dataRulecodes", dataruleCodes); + for (String dataRuleId : dataruleCodes) { + TSDataRule dataRule = systemService.getEntity(TSDataRule.class, dataRuleId); + MENU_DATA_AUTHOR_RULES.add(dataRule); + MENU_DATA_AUTHOR_RULE_SQL += SysContextSqlConvert.setSqlModel(dataRule); + + } + JeecgDataAutorUtils.installDataSearchConditon(request, MENU_DATA_AUTHOR_RULES);//鑿滃崟鏁版嵁瑙勫垯闆嗗悎 + JeecgDataAutorUtils.installDataSearchConditon(request, MENU_DATA_AUTHOR_RULE_SQL);//鑿滃崟鏁版嵁瑙勫垯sql + + } + return true; + } else { + //forword(request); + forward(request, response); + return false; + } + + } + } + + /** + * 鍒ゆ柇鐢ㄦ埛鏄惁鏈夎彍鍗曡闂潈闄 + * @param request + * @return + */ + private boolean hasMenuAuth(HttpServletRequest request){ + String requestPath = ResourceUtil.getRequestPath(request);// 鐢ㄦ埛璁块棶鐨勮祫婧愬湴鍧 + // 鏄惁鏄姛鑳借〃涓鐞嗙殑url + boolean bMgrUrl = false; + if (functionList == null) { +// functionList = systemService.loadAll(TSFunction.class); + functionList = systemService.findHql("from TSFunction where functionType = ? ", (short)0); + } + for (TSFunction function : functionList) { + if (function.getFunctionUrl() != null && function.getFunctionUrl().startsWith(requestPath)) { + bMgrUrl = true; + break; + } + } + if (!bMgrUrl) { + return true; + } + + String funcid=oConvertUtils.getString(request.getParameter("clickFunctionId")); + if(!bMgrUrl && (requestPath.indexOf("loginController.do")!=-1||funcid.length()==0)){ + return true; + } + TSUser currLoginUser = ClientManager.getInstance().getClient(ContextHolderUtils.getSession().getId()).getUser(); + String userid = currLoginUser.getId(); + //requestPath=requestPath.substring(0, requestPath.indexOf("?")+1); + String sql = "SELECT DISTINCT f.id FROM t_s_function f,t_s_role_function rf,t_s_role_user ru " + + " WHERE f.id=rf.functionid AND rf.roleid=ru.roleid AND " + + "ru.userid='"+userid+"' AND f.functionurl like '"+requestPath+"%'"; + List list = this.systemService.findListbySql(sql); + if(list.size()==0){ + String orgId = currLoginUser.getCurrentDepart().getId(); + String functionOfOrgSql = "SELECT DISTINCT f.id from t_s_function f, t_s_role_function rf, t_s_role_org ro " + + "WHERE f.ID=rf.functionid AND rf.roleid=ro.role_id " + + "AND ro.org_id='" +orgId+ "' AND f.functionurl like '"+requestPath+"%'"; + List functionOfOrgList = this.systemService.findListbySql(functionOfOrgSql); + return functionOfOrgList.size() > 0; + }else{ + return true; + } + } + /** + * 杞彂 + * + * @param user + * @param req + * @return + */ + @RequestMapping(params = "forword") + public ModelAndView forword(HttpServletRequest request) { + return new ModelAndView(new RedirectView("loginController.do?login")); + } + + private void forward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.getRequestDispatcher("webpage/login/timeout.jsp").forward(request, response); + } + +} diff --git a/src/main/java/org/jeecgframework/core/interceptors/DateConvertEditor.java b/src/main/java/org/jeecgframework/core/interceptors/DateConvertEditor.java new file mode 100644 index 00000000..a869ac69 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/interceptors/DateConvertEditor.java @@ -0,0 +1,41 @@ +package org.jeecgframework.core.interceptors; + +import java.beans.PropertyEditorSupport; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import org.springframework.util.StringUtils; + +/** + * + * @author 寮犱唬娴 + * + */ +public class DateConvertEditor extends PropertyEditorSupport { + private SimpleDateFormat datetimeFormat = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + public void setAsText(String text) throws IllegalArgumentException { + if (StringUtils.hasText(text)) { + try { + if (text.indexOf(":") == -1 && text.length() == 10) { + setValue(this.dateFormat.parse(text)); + } else if (text.indexOf(":") > 0 && text.length() == 19) { + setValue(this.datetimeFormat.parse(text)); + } else if (text.indexOf(":") > 0 && text.length() == 21) { + text = text.replace(".0", ""); + setValue(this.datetimeFormat.parse(text)); + } else { + throw new IllegalArgumentException( + "Could not parse date, date format is error "); + } + } catch (ParseException ex) { + IllegalArgumentException iae = new IllegalArgumentException( + "Could not parse date: " + ex.getMessage()); + iae.initCause(ex); + throw iae; + } + } else { + setValue(null); + } + } +} diff --git a/src/main/java/org/jeecgframework/core/interceptors/EncodingInterceptor.java b/src/main/java/org/jeecgframework/core/interceptors/EncodingInterceptor.java new file mode 100644 index 00000000..929057bd --- /dev/null +++ b/src/main/java/org/jeecgframework/core/interceptors/EncodingInterceptor.java @@ -0,0 +1,37 @@ +package org.jeecgframework.core.interceptors; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +/** + * 瀛楃闆嗘嫤鎴櫒 + * + * @author 寮犱唬娴 + * + */ +public class EncodingInterceptor implements HandlerInterceptor { + + /** + * 鍦╟ontroller鍚庢嫤鎴 + */ + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) throws Exception { + + } + + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView modelAndView) throws Exception { + + } + + /** + * 鍦╟ontroller鍓嶆嫤鎴 + */ + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + return true; + } + +} diff --git a/src/main/java/org/jeecgframework/core/interceptors/LogInterceptor.java b/src/main/java/org/jeecgframework/core/interceptors/LogInterceptor.java new file mode 100644 index 00000000..3fbb2959 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/interceptors/LogInterceptor.java @@ -0,0 +1,67 @@ +package org.jeecgframework.core.interceptors; + +import java.lang.reflect.Array; +import java.lang.reflect.Method; + +import javax.servlet.http.HttpServletRequest; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.jeecgframework.core.common.model.json.LogAnnotation; +import org.springframework.stereotype.Component; + +/** + * + * @author 寮犱唬娴 + * + */ +@Component +@Aspect +public class LogInterceptor { + @Before("execution(* com.renfang.controller.*.*(..))") + public void beforeMethod(JoinPoint joinPoint) throws Exception { + String temp = joinPoint.getStaticPart().toShortString(); + String longTemp = joinPoint.getStaticPart().toLongString(); + joinPoint.getStaticPart().toString(); + String classType = joinPoint.getTarget().getClass().getName(); + String methodName = temp.substring(10, temp.length() - 1); + Class className = Class.forName(classType); + Class[] args = new Class[joinPoint.getArgs().length]; + String[] sArgs = (longTemp.substring(longTemp.lastIndexOf("(") + 1, + longTemp.length() - 2)).split(","); + for (int i = 0; i < args.length; i++) { + if (sArgs[i].endsWith("String[]")) { + args[i] = Array.newInstance(Class.forName("java.lang.String"), + 1).getClass(); + } else if (sArgs[i].endsWith("Long[]")) { + args[i] = Array.newInstance(Class.forName("java.lang.Long"), 1) + .getClass(); + } else if (sArgs[i].indexOf(".") == -1) { + if (sArgs[i].equals("int")) { + args[i] = int.class; + } else if (sArgs[i].equals("char")) { + args[i] = char.class; + } else if (sArgs[i].equals("float")) { + args[i] = float.class; + } else if (sArgs[i].equals("long")) { + args[i] = long.class; + } + } else { + args[i] = Class.forName(sArgs[i]); + } + } + Method method = className.getMethod( + methodName.substring(methodName.indexOf(".") + 1, + methodName.indexOf("(")), args); + if (method.isAnnotationPresent(LogAnnotation.class)) { + LogAnnotation logAnnotation = method + .getAnnotation(LogAnnotation.class); + String operateModelNm = logAnnotation.operateModelNm(); + String operateDescribe = logAnnotation.operateDescribe(); + String operateFuncNm = logAnnotation.operateFuncNm(); + + } + + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/interceptors/MyWebBinding.java b/src/main/java/org/jeecgframework/core/interceptors/MyWebBinding.java new file mode 100644 index 00000000..57e90c95 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/interceptors/MyWebBinding.java @@ -0,0 +1,20 @@ +package org.jeecgframework.core.interceptors; + +import java.util.Date; + +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.support.WebBindingInitializer; +import org.springframework.web.context.request.WebRequest; + +public class MyWebBinding implements WebBindingInitializer { + + public void initBinder(WebDataBinder binder, WebRequest request) { + // 1. 浣跨敤spring鑷甫鐨凜ustomDateEditor + // SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + // binder.registerCustomEditor(Date.class, new + // CustomDateEditor(dateFormat, true)); + //2. 鑷畾涔夌殑PropertyEditorSupport + binder.registerCustomEditor(Date.class, new DateConvertEditor()); + } + +} diff --git a/src/main/java/org/jeecgframework/core/servlet/UploadTmpPhotoServlet.java b/src/main/java/org/jeecgframework/core/servlet/UploadTmpPhotoServlet.java new file mode 100644 index 00000000..9393c9a8 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/servlet/UploadTmpPhotoServlet.java @@ -0,0 +1,164 @@ +package org.jeecgframework.core.servlet; + +import java.awt.image.BufferedImage; + +import java.io.File; + +import java.io.IOException; + +import java.io.PrintWriter; + +import java.util.Date; + +import java.util.HashMap; + +import java.util.List; + +import java.util.Map; + +import javax.imageio.ImageIO; + +import javax.servlet.ServletException; + +import javax.servlet.http.HttpServlet; + +import javax.servlet.http.HttpServletRequest; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.fileupload.FileItem; + +import org.apache.commons.fileupload.FileUploadException; + +import org.apache.commons.fileupload.disk.DiskFileItemFactory; + +import org.apache.commons.fileupload.servlet.ServletFileUpload; + +public class UploadTmpPhotoServlet extends HttpServlet { + + + public void doGet(HttpServletRequest request, HttpServletResponse response) + + throws ServletException, IOException { + + } + + + public void doPost(HttpServletRequest request, HttpServletResponse response) + + throws ServletException, IOException { + + DiskFileItemFactory factory = new DiskFileItemFactory(); + + // 璁剧疆鍐呭瓨缂撳啿鍖猴紝瓒呰繃鍚庡啓鍏ヤ复鏃舵枃浠 + + factory.setSizeThreshold(10240000); + + // 璁剧疆涓存椂鏂囦欢瀛樺偍浣嶇疆 + + String base = "";// this.getServletContext().getRealPath("/")+"files"; + + File file = new File(base); + + if (!file.exists()) + + file.mkdirs(); + + factory.setRepository(file); + + ServletFileUpload upload = new ServletFileUpload(factory); + + // 璁剧疆鍗曚釜鏂囦欢鐨勬渶澶т笂浼犲 + + upload.setFileSizeMax(10002400000l); + + // 璁剧疆鏁翠釜request鐨勬渶澶у + + upload.setSizeMax(10002400000l); + + upload.setHeaderEncoding("UTF-8"); + + request.setCharacterEncoding("utf-8"); + + response.setCharacterEncoding("utf-8"); + + PrintWriter out = response.getWriter(); + + try { + + List items = upload.parseRequest(request); + + FileItem item = null; + + String tpmFilePathName = null; + + String savePath = ""; + + Map fileNames = new HashMap(); + + for (int i = 0; i < items.size(); i++) { + + item = (FileItem) items.get(i); + + // 淇濆瓨鏂囦欢 + + if (!item.isFormField() && item.getName().length() > 0) { + + fileNames.put("oldName", item.getName()); + + String suffixName = item.getName().substring(item.getName().lastIndexOf(".")); + + String newName = ""; + + fileNames.put("newName", newName); + + fileNames.put("fileSize", ""); + + // org.jeecgframework.core.util.LogUtil.info(item.getName()+"=="+UploadTool.createPhotoID()+suffixName+"=="+UploadTool.FormetFileSize(item.getSize())+"savePath"+savePath); + + tpmFilePathName = base + newName;// File.separator + + item.write(new File(tpmFilePathName)); + + // UploadTool.removeFile(tpmFilePathName); + + BufferedImage bufImg = ImageIO.read(new File(tpmFilePathName)); + + // System.out.print("======"+bufImg.getHeight()+"====="+bufImg.getWidth()); + + // 鏁版嵁搴撴搷浣滐紝鍖呭浘鐗囩殑璺緞鍙婂叾鐩稿簲鐨勪俊鎭繚瀛樺埌鏁版嵁搴擄紝 + + out.print(newName + "^" + bufImg.getHeight() + "^" + bufImg.getWidth()); + + } + + } + + // Map fileNames = + // UploadTool.WorkGroupFileUpload(request, + // Config.getInstance().getLinkfiletmpPath(), + // Config.getInstance().getLinkfilesavePath()); + + } catch (FileUploadException e) { + + out.print(-1); + + e.printStackTrace(); + + } catch (Exception e) { + + out.print(-1); + + e.printStackTrace(); + + } finally { + + out.flush(); + + out.close(); + + } + + } + +} diff --git a/src/main/java/org/jeecgframework/core/timer/DataBaseCronTriggerBean.java b/src/main/java/org/jeecgframework/core/timer/DataBaseCronTriggerBean.java new file mode 100644 index 00000000..53bbe45f --- /dev/null +++ b/src/main/java/org/jeecgframework/core/timer/DataBaseCronTriggerBean.java @@ -0,0 +1,34 @@ +package org.jeecgframework.core.timer; + +import org.jeecgframework.web.system.pojo.base.TSTimeTaskEntity; +import org.jeecgframework.web.system.service.TimeTaskServiceI; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.quartz.CronTriggerBean; +/** + * 鍦ㄥ師鏈夊姛鑳界殑鍩虹涓婇潰澧炲姞鏁版嵁搴撶殑璇诲彇 + * @author JueYue + * @date 2013-9-22 + * @version 1.0 + */ +public class DataBaseCronTriggerBean extends CronTriggerBean{ + + private static final long serialVersionUID = 1L; + + @Autowired + private TimeTaskServiceI timeTaskService; + /** + * 璇诲彇鏁版嵁搴撴洿鏂版枃浠 + */ + public void afterPropertiesSet() throws Exception { + super.afterPropertiesSet(); + TSTimeTaskEntity task = timeTaskService.findUniqueByProperty + (TSTimeTaskEntity.class,"taskId",this.getName()); + if(task!=null&&task.getIsEffect().equals("1") + &&!task.getCronExpression().equals(this.getCronExpression())){ + this.setCronExpression(task.getCronExpression()); + DynamicTask.updateSpringMvcTaskXML(this,task.getCronExpression()); + } + } + +} diff --git a/src/main/java/org/jeecgframework/core/timer/DataBaseSchedulerFactoryBean.java b/src/main/java/org/jeecgframework/core/timer/DataBaseSchedulerFactoryBean.java new file mode 100644 index 00000000..4b0b1c68 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/timer/DataBaseSchedulerFactoryBean.java @@ -0,0 +1,37 @@ +package org.jeecgframework.core.timer; + +import org.jeecgframework.web.system.pojo.base.TSTimeTaskEntity; +import org.jeecgframework.web.system.service.TimeTaskServiceI; + +import org.quartz.Scheduler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; +/** + * 璇诲彇鏁版嵁搴 鐒跺悗鍒ゆ柇鏄惁鍚姩浠诲姟 + * @author JueYue + * @date 2013-9-22 + * @version 1.0 + */ +public class DataBaseSchedulerFactoryBean extends SchedulerFactoryBean { + + @Autowired + private TimeTaskServiceI timeTaskService; + /** + * 璇诲彇鏁版嵁搴撳垽鏂槸鍚﹀紑濮嬪畾鏃朵换鍔 + */ + public void afterPropertiesSet() throws Exception { + super.afterPropertiesSet(); + String[] trigerrNames = this.getScheduler().getTriggerNames(Scheduler.DEFAULT_GROUP); + TSTimeTaskEntity task; + + for (String trigerrName : trigerrNames) { + task = timeTaskService.findUniqueByProperty(TSTimeTaskEntity.class,"taskId",trigerrName); + //鏁版嵁搴撴煡璇笉鍒扮殑瀹氭椂浠诲姟鎴栬呭畾鏃朵换鍔$殑杩愯鐘舵佷笉涓1鏃讹紝閮藉仠姝 + //TASK #327 瀹氭椂鍣ㄤ换鍔¢粯璁ゆ湭鍚姩 + if(task==null || !"1".equals(task.getIsStart())){ + this.getScheduler().pauseTrigger(trigerrName,Scheduler.DEFAULT_GROUP); + } + } + } + +} diff --git a/src/main/java/org/jeecgframework/core/timer/DynamicTask.java b/src/main/java/org/jeecgframework/core/timer/DynamicTask.java new file mode 100644 index 00000000..e56b3aca --- /dev/null +++ b/src/main/java/org/jeecgframework/core/timer/DynamicTask.java @@ -0,0 +1,189 @@ +package org.jeecgframework.core.timer; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URI; +import java.text.ParseException; +import java.util.List; + +import javax.annotation.Resource; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.OutputFormat; +import org.dom4j.io.SAXReader; +import org.dom4j.io.XMLWriter; +import org.quartz.CronTrigger; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.Trigger; +import org.springframework.stereotype.Service; + +/** + * 鍔ㄦ佷换鍔,鐢ㄤ互鍔ㄦ佽皟鏁碨pring鐨勪换鍔 + * @author JueYue + * @date 2013-9-20 + * @version 1.0 + */ +@Service(value="dynamicTask") +public class DynamicTask { + + private static Logger logger = Logger.getLogger(DynamicTask.class); + + @Resource + private Scheduler schedulerFactory; + + /** + * 鏇存柊瀹氭椂浠诲姟鐨勮Е鍙戣〃杈惧紡 + * + * @param triggerName + * 瑙﹀彂鍣ㄥ悕瀛 + * @param start + * 瑙﹀彂琛ㄨ揪寮 + * @return 鎴愬姛鍒欒繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse + */ + public boolean startOrStop(String triggerName, + boolean start) { + try { + CronTrigger trigger = (CronTrigger) getTrigger(triggerName, + Scheduler.DEFAULT_GROUP); + if(start){ + schedulerFactory.resumeTrigger(trigger.getName(), trigger.getGroup()); + logger.info("trigger the start successfully!!"); + }else{ + schedulerFactory.pauseTrigger(trigger.getName(), trigger.getGroup()); + logger.info("trigger the pause successfully!!"); + } + return true; + } catch (SchedulerException e) { + logger.error("Fail to reschedule. " + e); + return false; + } + } + + /** + * 鏇存柊瀹氭椂浠诲姟鐨勮Е鍙戣〃杈惧紡 + * + * @param triggerName + * 瑙﹀彂鍣ㄥ悕瀛 + * @param cronExpression + * 瑙﹀彂琛ㄨ揪寮 + * @return 鎴愬姛鍒欒繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse + */ + public boolean updateCronExpression(String triggerName, + String cronExpression) { + try { + CronTrigger trigger = (CronTrigger) getTrigger(triggerName, + Scheduler.DEFAULT_GROUP); + if (trigger == null) { + return false; + } + if (StringUtils.equals(trigger.getCronExpression(), cronExpression)) { + logger.info("cronExpression is same with the running Schedule , no need to update."); + return true; + } + trigger.setCronExpression(cronExpression); + schedulerFactory.rescheduleJob(trigger.getName(), trigger.getGroup(), + trigger); + updateSpringMvcTaskXML(trigger,cronExpression); + logger.info("Update the cronExpression successfully!!"); + return true; + } catch (ParseException e) { + logger.error("The new cronExpression - " + cronExpression + + " not conform to the standard. " + e); + return false; + } catch (SchedulerException e) { + logger.error("Fail to reschedule. " + e); + return false; + } + } + + /** + * 鑾峰彇瑙﹀彂鍣 + * + * @param triggerName + * 瑙﹀彂鍣ㄥ悕瀛 + * @param groupName + * 瑙﹀彂鍣ㄧ粍鍚嶅瓧 + * @return 瀵瑰簲Trigger + */ + private Trigger getTrigger(String triggerName, String groupName) { + Trigger trigger = null; + if (StringUtils.isBlank(groupName)) { + logger.warn("Schedule Job Group is empty!"); + return null; + } + if (StringUtils.isBlank(triggerName)) { + logger.warn("Schedule trigger Name is empty!"); + return null; + } + try { + trigger = schedulerFactory.getTrigger(triggerName, groupName); + } catch (SchedulerException e) { + logger.warn("Fail to get the trigger (triggerName: " + triggerName + + ", groupName : " + groupName + ")"); + return null; + } + if (trigger == null) { + logger.warn("Can not found the trigger of triggerName: " + + triggerName + ", groupName : " + groupName); + } + return trigger; + } + /** + * 鏇存柊spring-mvc-timeTask.xml 閰嶇疆鏂囦欢 + * @param trigger + * @param cronExpression + */ + @SuppressWarnings("unchecked") + public synchronized static void updateSpringMvcTaskXML(CronTrigger trigger, String cronExpression) { + Document document = null; + File file = null; + SAXReader saxReader = new SAXReader(); + try { + URI url = DynamicTask.class.getClassLoader().getResource("spring-mvc-timeTask.xml").toURI(); + file = new File(url.getPath()); + document = saxReader.read(new FileInputStream(file)); + } catch (Exception e) { + logger.error("璇诲彇绯荤粺涓敤鍒扮殑SQL 璇彞XML鍑洪敊"); + throw new RuntimeException("---------璇诲彇spring-mvc-timeTask.xml鏂囦欢鍑洪敊:" + e.getMessage()); + } + Element root = document.getRootElement(); + List beans = root.elements(); + for (Element bean : beans) { + if(bean.attribute("id")!=null&& + bean.attribute("id").getValue().equals(trigger.getName())){ + beans = bean.elements(); + for (Element temp : beans) { + if(temp.attribute("name")!=null&& + temp.attribute("name").getValue().equals("cronExpression")){ + temp.attribute("value").setValue(cronExpression); + break; + } + } + break; + } + } + XMLWriter fileWriter = null; + try { + OutputFormat xmlFormat = OutputFormat.createPrettyPrint(); + xmlFormat.setEncoding("utf-8"); + fileWriter = new XMLWriter(new FileOutputStream(file),xmlFormat); + fileWriter.write(document); + } catch (IOException e) { + e.printStackTrace(); + }finally{ + try { + fileWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + +} diff --git a/src/main/java/org/jeecgframework/core/timer/Job.java b/src/main/java/org/jeecgframework/core/timer/Job.java new file mode 100644 index 00000000..cb40de5b --- /dev/null +++ b/src/main/java/org/jeecgframework/core/timer/Job.java @@ -0,0 +1,30 @@ +package org.jeecgframework.core.timer; + +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +public class Job { + + +// @Scheduled(cron="*/10 * * * * *") +// public void s10(){ +// org.jeecgframework.core.util.LogUtil.info("==== 鍗佺鎵ц涓娆=======10s"); +// } +// +// @Scheduled(cron="0 */1 * * * *") +// public void m1(){ +// org.jeecgframework.core.util.LogUtil.info("1m"); +// } + + /** + * 姣忓ぉ1鐐规墽琛屼竴娆 + * */ + @Scheduled(cron="0 0 1 * * ?") + public void oneOClockPerDay(){ + org.jeecgframework.core.util.LogUtil.info("1h"); + } + + + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/util/ApplicationContextUtil.java b/src/main/java/org/jeecgframework/core/util/ApplicationContextUtil.java new file mode 100644 index 00000000..7ae20721 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/ApplicationContextUtil.java @@ -0,0 +1,25 @@ +package org.jeecgframework.core.util; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +/** + * + * @author 寮犱唬娴 + * + */ +public class ApplicationContextUtil implements ApplicationContextAware { + + private static ApplicationContext context; + + + public void setApplicationContext(ApplicationContext context) + throws BeansException { + this.context = context; + } + + public static ApplicationContext getContext() { + return context; + } +} diff --git a/src/main/java/org/jeecgframework/core/util/BrowserType.java b/src/main/java/org/jeecgframework/core/util/BrowserType.java new file mode 100644 index 00000000..c2efa92c --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/BrowserType.java @@ -0,0 +1,10 @@ +package org.jeecgframework.core.util; + +/** + * + * @author 寮犱唬娴 + * + */ +public enum BrowserType { + IE11,IE10,IE9,IE8,IE7,IE6,Firefox,Safari,Chrome,Opera,Camino,Gecko +} diff --git a/src/main/java/org/jeecgframework/core/util/BrowserUtils.java b/src/main/java/org/jeecgframework/core/util/BrowserUtils.java new file mode 100644 index 00000000..f558650e --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/BrowserUtils.java @@ -0,0 +1,180 @@ +package org.jeecgframework.core.util; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; + +/** + * + * @author 寮犱唬娴 + * + */ +public class BrowserUtils { + + // 鍒ゆ柇鏄惁鏄疘E + public static boolean isIE(HttpServletRequest request) { + return (request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 || request + .getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0) ? true + : false; + } + + /** + * 鑾峰彇IE鐗堟湰 + * + * @param request + * @return + */ + public static Double getIEversion(HttpServletRequest request) { + Double version = 0.0; + if (getBrowserType(request, IE11)) { + version = 11.0; + } else if (getBrowserType(request, IE10)) { + version = 10.0; + } else if (getBrowserType(request, IE9)) { + version = 9.0; + } else if (getBrowserType(request, IE8)) { + version = 8.0; + } else if (getBrowserType(request, IE7)) { + version = 7.0; + } else if (getBrowserType(request, IE6)) { + version = 6.0; + } + return version; + } + + /** + * 鑾峰彇娴忚鍣ㄧ被鍨 + * + * @param request + * @return + */ + public static BrowserType getBrowserType(HttpServletRequest request) { + BrowserType browserType = null; + if (getBrowserType(request, IE11)) { + browserType = BrowserType.IE11; + } + if (getBrowserType(request, IE10)) { + browserType = BrowserType.IE10; + } + if (getBrowserType(request, IE9)) { + browserType = BrowserType.IE9; + } + if (getBrowserType(request, IE8)) { + browserType = BrowserType.IE8; + } + if (getBrowserType(request, IE7)) { + browserType = BrowserType.IE7; + } + if (getBrowserType(request, IE6)) { + browserType = BrowserType.IE6; + } + if (getBrowserType(request, FIREFOX)) { + browserType = BrowserType.Firefox; + } + if (getBrowserType(request, SAFARI)) { + browserType = BrowserType.Safari; + } + if (getBrowserType(request, CHROME)) { + browserType = BrowserType.Chrome; + } + if (getBrowserType(request, OPERA)) { + browserType = BrowserType.Opera; + } + if (getBrowserType(request, "Camino")) { + browserType = BrowserType.Camino; + } + return browserType; + } + + private static boolean getBrowserType(HttpServletRequest request, + String brosertype) { + return request.getHeader("USER-AGENT").toLowerCase() + .indexOf(brosertype) > 0 ? true : false; + } + + private final static String IE11 = "rv:11.0"; + private final static String IE10 = "MSIE 10.0"; + private final static String IE9 = "MSIE 9.0"; + private final static String IE8 = "MSIE 8.0"; + private final static String IE7 = "MSIE 7.0"; + private final static String IE6 = "MSIE 6.0"; + private final static String MAXTHON = "Maxthon"; + private final static String QQ = "QQBrowser"; + private final static String GREEN = "GreenBrowser"; + private final static String SE360 = "360SE"; + private final static String FIREFOX = "Firefox"; + private final static String OPERA = "Opera"; + private final static String CHROME = "Chrome"; + private final static String SAFARI = "Safari"; + private final static String OTHER = "鍏跺畠"; + + public static String checkBrowse(HttpServletRequest request) { + String userAgent = request.getHeader("USER-AGENT"); + if (regex(OPERA, userAgent)) + return OPERA; + if (regex(CHROME, userAgent)) + return CHROME; + if (regex(FIREFOX, userAgent)) + return FIREFOX; + if (regex(SAFARI, userAgent)) + return SAFARI; + if (regex(SE360, userAgent)) + return SE360; + if (regex(GREEN, userAgent)) + return GREEN; + if (regex(QQ, userAgent)) + return QQ; + if (regex(MAXTHON, userAgent)) + return MAXTHON; + if (regex(IE11, userAgent)) + return IE11; + if (regex(IE10, userAgent)) + return IE10; + if (regex(IE9, userAgent)) + return IE9; + if (regex(IE8, userAgent)) + return IE8; + if (regex(IE7, userAgent)) + return IE7; + if (regex(IE6, userAgent)) + return IE6; + return OTHER; + } + + public static boolean regex(String regex, String str) { + Pattern p = Pattern.compile(regex, Pattern.MULTILINE); + Matcher m = p.matcher(str); + return m.find(); + } + + + private static Map langMap = new HashMap(); + private final static String ZH = "zh"; + private final static String ZH_CN = "zh-cn"; + + private final static String EN = "en"; + private final static String EN_US = "en"; + + + static + { + langMap.put(ZH, ZH_CN); + langMap.put(EN, EN_US); + } + + public static String getBrowserLanguage(HttpServletRequest request) { + + String browserLang = request.getLocale().getLanguage(); + String browserLangCode = (String)langMap.get(browserLang); + + if(browserLangCode == null) + { + browserLangCode = EN_US; + } + return browserLangCode; + } + +} diff --git a/src/main/java/org/jeecgframework/core/util/ContextHolderUtils.java b/src/main/java/org/jeecgframework/core/util/ContextHolderUtils.java new file mode 100644 index 00000000..3f16ebbc --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/ContextHolderUtils.java @@ -0,0 +1,37 @@ +package org.jeecgframework.core.util; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +/** +* @ClassName: ContextHolderUtils +* @Description: TODO(涓婁笅鏂囧伐鍏风被) +* @author 寮犱唬娴 +* @date 2012-12-15 涓嬪崍11:27:39 +* + */ +public class ContextHolderUtils { + /** + * SpringMvc涓嬭幏鍙杛equest + * + * @return + */ + public static HttpServletRequest getRequest() { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + return request; + + } + /** + * SpringMvc涓嬭幏鍙杝ession + * + * @return + */ + public static HttpSession getSession() { + HttpSession session = getRequest().getSession(); + return session; + + } + +} diff --git a/src/main/java/org/jeecgframework/core/util/DBTypeUtil.java b/src/main/java/org/jeecgframework/core/util/DBTypeUtil.java new file mode 100644 index 00000000..62328ebd --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/DBTypeUtil.java @@ -0,0 +1,43 @@ +package org.jeecgframework.core.util; + + + +import org.apache.log4j.Logger; +import org.springframework.context.ApplicationContext; + +import org.jeecgframework.web.cgform.controller.autolist.CgAutoListController; +import org.jeecgframework.web.system.listener.OnlineListener; + +/** + * + * @author 寮犱唬娴 + * + */ +public class DBTypeUtil { + private static Logger log = Logger.getLogger(DBTypeUtil.class); + /** + * 鑾峰彇鏁版嵁搴撶被鍨 + * @return + */ + public static String getDBType(){ + String retStr=""; + ApplicationContext ctx = OnlineListener.getCtx(); + if (ctx==null) { + return retStr;//濡傛灉ctx涓虹┖锛屽垯鏈嶅姟鍣ㄥ紓甯镐簡 + }else{ + org.springframework.orm.hibernate4.LocalSessionFactoryBean sf = (org.springframework.orm.hibernate4.LocalSessionFactoryBean)ctx.getBean("&sessionFactory"); + String dbdialect = sf.getHibernateProperties().getProperty("hibernate.dialect"); + log.debug(dbdialect); + if (dbdialect.equals("org.hibernate.dialect.MySQLDialect")) { + retStr="mysql"; + }else if (dbdialect.contains("Oracle")) {//oracle鏈夊涓増鏈殑鏂硅█ + retStr = "oracle"; + }else if (dbdialect.equals("org.hibernate.dialect.SQLServerDialect")) { + retStr = "sqlserver"; + }else if (dbdialect.equals("org.hibernate.dialect.PostgreSQLDialect")) { + retStr = "postgres"; + } + return retStr; + } + } +} diff --git a/src/main/java/org/jeecgframework/core/util/DateUtils.java b/src/main/java/org/jeecgframework/core/util/DateUtils.java new file mode 100644 index 00000000..6caf9be4 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/DateUtils.java @@ -0,0 +1,644 @@ +package org.jeecgframework.core.util; + +import java.beans.PropertyEditorSupport; +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import org.springframework.util.StringUtils; + +/** + * + * 绫绘弿杩帮細鏃堕棿鎿嶄綔瀹氫箟绫 + * + * @author: 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-8 鏃堕棿锛氫笅鍗12:15:03 + * @version 1.0 + */ +public class DateUtils extends PropertyEditorSupport { + // 鍚勭鏃堕棿鏍煎紡 + public static final SimpleDateFormat date_sdf = new SimpleDateFormat( + "yyyy-MM-dd"); + // 鍚勭鏃堕棿鏍煎紡 + public static final SimpleDateFormat yyyyMMdd = new SimpleDateFormat( + "yyyyMMdd"); + // 鍚勭鏃堕棿鏍煎紡 + public static final SimpleDateFormat date_sdf_wz = new SimpleDateFormat( + "yyyy骞碝M鏈坉d鏃"); + public static final SimpleDateFormat time_sdf = new SimpleDateFormat( + "yyyy-MM-dd HH:mm"); + public static final SimpleDateFormat yyyymmddhhmmss = new SimpleDateFormat( + "yyyyMMddHHmmss"); + public static final SimpleDateFormat short_time_sdf = new SimpleDateFormat( + "HH:mm"); + public static final SimpleDateFormat datetimeFormat = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + // 浠ユ绉掕〃绀虹殑鏃堕棿 + private static final long DAY_IN_MILLIS = 24 * 3600 * 1000; + private static final long HOUR_IN_MILLIS = 3600 * 1000; + private static final long MINUTE_IN_MILLIS = 60 * 1000; + private static final long SECOND_IN_MILLIS = 1000; + // 鎸囧畾妯″紡鐨勬椂闂存牸寮 + private static SimpleDateFormat getSDFormat(String pattern) { + return new SimpleDateFormat(pattern); + } + + /** + * 褰撳墠鏃ュ巻锛岃繖閲岀敤涓浗鏃堕棿琛ㄧず + * + * @return 浠ュ綋鍦版椂鍖鸿〃绀虹殑绯荤粺褰撳墠鏃ュ巻 + */ + public static Calendar getCalendar() { + return Calendar.getInstance(); + } + + /** + * 鎸囧畾姣鏁拌〃绀虹殑鏃ュ巻 + * + * @param millis + * 姣鏁 + * @return 鎸囧畾姣鏁拌〃绀虹殑鏃ュ巻 + */ + public static Calendar getCalendar(long millis) { + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date(millis)); + return cal; + } + + // //////////////////////////////////////////////////////////////////////////// + // getDate + // 鍚勭鏂瑰紡鑾峰彇鐨凞ate + // //////////////////////////////////////////////////////////////////////////// + + /** + * 褰撳墠鏃ユ湡 + * + * @return 绯荤粺褰撳墠鏃堕棿 + */ + public static Date getDate() { + return new Date(); + } + + /** + * 鎸囧畾姣鏁拌〃绀虹殑鏃ユ湡 + * + * @param millis + * 姣鏁 + * @return 鎸囧畾姣鏁拌〃绀虹殑鏃ユ湡 + */ + public static Date getDate(long millis) { + return new Date(millis); + } + + /** + * 鏃堕棿鎴宠浆鎹负瀛楃涓 + * + * @param time + * @return + */ + public static String timestamptoStr(Timestamp time) { + Date date = null; + if (null != time) { + date = new Date(time.getTime()); + } + return date2Str(date_sdf); + } + + /** + * 瀛楃涓茶浆鎹㈡椂闂存埑 + * + * @param str + * @return + */ + public static Timestamp str2Timestamp(String str) { + Date date = str2Date(str, date_sdf); + return new Timestamp(date.getTime()); + } + /** + * 瀛楃涓茶浆鎹㈡垚鏃ユ湡 + * @param str + * @param sdf + * @return + */ + public static Date str2Date(String str, SimpleDateFormat sdf) { + if (null == str || "".equals(str)) { + return null; + } + Date date = null; + try { + date = sdf.parse(str); + return date; + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 鏃ユ湡杞崲涓哄瓧绗︿覆 + * + * @param date + * 鏃ユ湡 + * @param format + * 鏃ユ湡鏍煎紡 + * @return 瀛楃涓 + */ + public static String date2Str(SimpleDateFormat date_sdf) { + Date date=getDate(); + if (null == date) { + return null; + } + return date_sdf.format(date); + } + /** + * 鏍煎紡鍖栨椂闂 + * @param date + * @param format + * @return + */ + public static String dateformat(String date,String format) + { + SimpleDateFormat sformat = new SimpleDateFormat(format); + Date _date=null; + try { + _date=sformat.parse(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return sformat.format(_date); + } + /** + * 鏃ユ湡杞崲涓哄瓧绗︿覆 + * + * @param date + * 鏃ユ湡 + * @param format + * 鏃ユ湡鏍煎紡 + * @return 瀛楃涓 + */ + public static String date2Str(Date date, SimpleDateFormat date_sdf) { + if (null == date) { + return null; + } + return date_sdf.format(date); + } + /** + * 鏃ユ湡杞崲涓哄瓧绗︿覆 + * + * @param date + * 鏃ユ湡 + * @param format + * 鏃ユ湡鏍煎紡 + * @return 瀛楃涓 + */ + public static String getDate(String format) { + Date date=new Date(); + if (null == date) { + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat(format); + return sdf.format(date); + } + + /** + * 鎸囧畾姣鏁扮殑鏃堕棿鎴 + * + * @param millis + * 姣鏁 + * @return 鎸囧畾姣鏁扮殑鏃堕棿鎴 + */ + public static Timestamp getTimestamp(long millis) { + return new Timestamp(millis); + } + + /** + * 浠ュ瓧绗﹀舰寮忚〃绀虹殑鏃堕棿鎴 + * + * @param time + * 姣鏁 + * @return 浠ュ瓧绗﹀舰寮忚〃绀虹殑鏃堕棿鎴 + */ + public static Timestamp getTimestamp(String time) { + return new Timestamp(Long.parseLong(time)); + } + + /** + * 绯荤粺褰撳墠鐨勬椂闂存埑 + * + * @return 绯荤粺褰撳墠鐨勬椂闂存埑 + */ + public static Timestamp getTimestamp() { + return new Timestamp(new Date().getTime()); + } + + /** + * 鎸囧畾鏃ユ湡鐨勬椂闂存埑 + * + * @param date + * 鎸囧畾鏃ユ湡 + * @return 鎸囧畾鏃ユ湡鐨勬椂闂存埑 + */ + public static Timestamp getTimestamp(Date date) { + return new Timestamp(date.getTime()); + } + + /** + * 鎸囧畾鏃ュ巻鐨勬椂闂存埑 + * + * @param cal + * 鎸囧畾鏃ュ巻 + * @return 鎸囧畾鏃ュ巻鐨勬椂闂存埑 + */ + public static Timestamp getCalendarTimestamp(Calendar cal) { + return new Timestamp(cal.getTime().getTime()); + } + + public static Timestamp gettimestamp() { + Date dt = new Date(); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String nowTime = df.format(dt); + java.sql.Timestamp buydate = java.sql.Timestamp.valueOf(nowTime); + return buydate; + } + + // //////////////////////////////////////////////////////////////////////////// + // getMillis + // 鍚勭鏂瑰紡鑾峰彇鐨凪illis + // //////////////////////////////////////////////////////////////////////////// + + /** + * 绯荤粺鏃堕棿鐨勬绉掓暟 + * + * @return 绯荤粺鏃堕棿鐨勬绉掓暟 + */ + public static long getMillis() { + return new Date().getTime(); + } + + /** + * 鎸囧畾鏃ュ巻鐨勬绉掓暟 + * + * @param cal + * 鎸囧畾鏃ュ巻 + * @return 鎸囧畾鏃ュ巻鐨勬绉掓暟 + */ + public static long getMillis(Calendar cal) { + return cal.getTime().getTime(); + } + + /** + * 鎸囧畾鏃ユ湡鐨勬绉掓暟 + * + * @param date + * 鎸囧畾鏃ユ湡 + * @return 鎸囧畾鏃ユ湡鐨勬绉掓暟 + */ + public static long getMillis(Date date) { + return date.getTime(); + } + + /** + * 鎸囧畾鏃堕棿鎴崇殑姣鏁 + * + * @param ts + * 鎸囧畾鏃堕棿鎴 + * @return 鎸囧畾鏃堕棿鎴崇殑姣鏁 + */ + public static long getMillis(Timestamp ts) { + return ts.getTime(); + } + + // //////////////////////////////////////////////////////////////////////////// + // formatDate + // 灏嗘棩鏈熸寜鐓т竴瀹氱殑鏍煎紡杞寲涓哄瓧绗︿覆 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 榛樿鏂瑰紡琛ㄧず鐨勭郴缁熷綋鍓嶆棩鏈燂紝鍏蜂綋鏍煎紡锛氬勾-鏈-鏃 + * + * @return 榛樿鏃ユ湡鎸夆滃勾-鏈-鏃モ滄牸寮忔樉绀 + */ + public static String formatDate() { + return date_sdf.format(getCalendar().getTime()); + } + /** + * 鑾峰彇鏃堕棿瀛楃涓 + */ + public static String getDataString(SimpleDateFormat formatstr) { + return formatstr.format(getCalendar().getTime()); + } + /** + * 鎸囧畾鏃ユ湡鐨勯粯璁ゆ樉绀猴紝鍏蜂綋鏍煎紡锛氬勾-鏈-鏃 + * + * @param cal + * 鎸囧畾鐨勬棩鏈 + * @return 鎸囧畾鏃ユ湡鎸夆滃勾-鏈-鏃モ滄牸寮忔樉绀 + */ + public static String formatDate(Calendar cal) { + return date_sdf.format(cal.getTime()); + } + + /** + * 鎸囧畾鏃ユ湡鐨勯粯璁ゆ樉绀猴紝鍏蜂綋鏍煎紡锛氬勾-鏈-鏃 + * + * @param date + * 鎸囧畾鐨勬棩鏈 + * @return 鎸囧畾鏃ユ湡鎸夆滃勾-鏈-鏃モ滄牸寮忔樉绀 + */ + public static String formatDate(Date date) { + return date_sdf.format(date); + } + + /** + * 鎸囧畾姣鏁拌〃绀烘棩鏈熺殑榛樿鏄剧ず锛屽叿浣撴牸寮忥細骞-鏈-鏃 + * + * @param millis + * 鎸囧畾鐨勬绉掓暟 + * @return 鎸囧畾姣鏁拌〃绀烘棩鏈熸寜鈥滃勾-鏈-鏃モ滄牸寮忔樉绀 + */ + public static String formatDate(long millis) { + return date_sdf.format(new Date(millis)); + } + + /** + * 榛樿鏃ユ湡鎸夋寚瀹氭牸寮忔樉绀 + * + * @param pattern + * 鎸囧畾鐨勬牸寮 + * @return 榛樿鏃ユ湡鎸夋寚瀹氭牸寮忔樉绀 + */ + public static String formatDate(String pattern) { + return getSDFormat(pattern).format(getCalendar().getTime()); + } + + /** + * 鎸囧畾鏃ユ湡鎸夋寚瀹氭牸寮忔樉绀 + * + * @param cal + * 鎸囧畾鐨勬棩鏈 + * @param pattern + * 鎸囧畾鐨勬牸寮 + * @return 鎸囧畾鏃ユ湡鎸夋寚瀹氭牸寮忔樉绀 + */ + public static String formatDate(Calendar cal, String pattern) { + return getSDFormat(pattern).format(cal.getTime()); + } + + /** + * 鎸囧畾鏃ユ湡鎸夋寚瀹氭牸寮忔樉绀 + * + * @param date + * 鎸囧畾鐨勬棩鏈 + * @param pattern + * 鎸囧畾鐨勬牸寮 + * @return 鎸囧畾鏃ユ湡鎸夋寚瀹氭牸寮忔樉绀 + */ + public static String formatDate(Date date, String pattern) { + return getSDFormat(pattern).format(date); + } + + // //////////////////////////////////////////////////////////////////////////// + // formatTime + // 灏嗘棩鏈熸寜鐓т竴瀹氱殑鏍煎紡杞寲涓哄瓧绗︿覆 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 榛樿鏂瑰紡琛ㄧず鐨勭郴缁熷綋鍓嶆棩鏈燂紝鍏蜂綋鏍煎紡锛氬勾-鏈-鏃 鏃讹細鍒 + * + * @return 榛樿鏃ユ湡鎸夆滃勾-鏈-鏃 鏃讹細鍒嗏滄牸寮忔樉绀 + */ + public static String formatTime() { + return time_sdf.format(getCalendar().getTime()); + } + + /** + * 鎸囧畾姣鏁拌〃绀烘棩鏈熺殑榛樿鏄剧ず锛屽叿浣撴牸寮忥細骞-鏈-鏃 鏃讹細鍒 + * + * @param millis + * 鎸囧畾鐨勬绉掓暟 + * @return 鎸囧畾姣鏁拌〃绀烘棩鏈熸寜鈥滃勾-鏈-鏃 鏃讹細鍒嗏滄牸寮忔樉绀 + */ + public static String formatTime(long millis) { + return time_sdf.format(new Date(millis)); + } + + /** + * 鎸囧畾鏃ユ湡鐨勯粯璁ゆ樉绀猴紝鍏蜂綋鏍煎紡锛氬勾-鏈-鏃 鏃讹細鍒 + * + * @param cal + * 鎸囧畾鐨勬棩鏈 + * @return 鎸囧畾鏃ユ湡鎸夆滃勾-鏈-鏃 鏃讹細鍒嗏滄牸寮忔樉绀 + */ + public static String formatTime(Calendar cal) { + return time_sdf.format(cal.getTime()); + } + + /** + * 鎸囧畾鏃ユ湡鐨勯粯璁ゆ樉绀猴紝鍏蜂綋鏍煎紡锛氬勾-鏈-鏃 鏃讹細鍒 + * + * @param date + * 鎸囧畾鐨勬棩鏈 + * @return 鎸囧畾鏃ユ湡鎸夆滃勾-鏈-鏃 鏃讹細鍒嗏滄牸寮忔樉绀 + */ + public static String formatTime(Date date) { + return time_sdf.format(date); + } + + // //////////////////////////////////////////////////////////////////////////// + // formatShortTime + // 灏嗘棩鏈熸寜鐓т竴瀹氱殑鏍煎紡杞寲涓哄瓧绗︿覆 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 榛樿鏂瑰紡琛ㄧず鐨勭郴缁熷綋鍓嶆棩鏈燂紝鍏蜂綋鏍煎紡锛氭椂锛氬垎 + * + * @return 榛樿鏃ユ湡鎸夆滄椂锛氬垎鈥滄牸寮忔樉绀 + */ + public static String formatShortTime() { + return short_time_sdf.format(getCalendar().getTime()); + } + + /** + * 鎸囧畾姣鏁拌〃绀烘棩鏈熺殑榛樿鏄剧ず锛屽叿浣撴牸寮忥細鏃讹細鍒 + * + * @param millis + * 鎸囧畾鐨勬绉掓暟 + * @return 鎸囧畾姣鏁拌〃绀烘棩鏈熸寜鈥滄椂锛氬垎鈥滄牸寮忔樉绀 + */ + public static String formatShortTime(long millis) { + return short_time_sdf.format(new Date(millis)); + } + + /** + * 鎸囧畾鏃ユ湡鐨勯粯璁ゆ樉绀猴紝鍏蜂綋鏍煎紡锛氭椂锛氬垎 + * + * @param cal + * 鎸囧畾鐨勬棩鏈 + * @return 鎸囧畾鏃ユ湡鎸夆滄椂锛氬垎鈥滄牸寮忔樉绀 + */ + public static String formatShortTime(Calendar cal) { + return short_time_sdf.format(cal.getTime()); + } + + /** + * 鎸囧畾鏃ユ湡鐨勯粯璁ゆ樉绀猴紝鍏蜂綋鏍煎紡锛氭椂锛氬垎 + * + * @param date + * 鎸囧畾鐨勬棩鏈 + * @return 鎸囧畾鏃ユ湡鎸夆滄椂锛氬垎鈥滄牸寮忔樉绀 + */ + public static String formatShortTime(Date date) { + return short_time_sdf.format(date); + } + + // //////////////////////////////////////////////////////////////////////////// + // parseDate + // parseCalendar + // parseTimestamp + // 灏嗗瓧绗︿覆鎸夌収涓瀹氱殑鏍煎紡杞寲涓烘棩鏈熸垨鏃堕棿 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 鏍规嵁鎸囧畾鐨勬牸寮忓皢瀛楃涓茶浆鎹㈡垚Date 濡傝緭鍏ワ細2003-11-19 11:20:20灏嗘寜鐓ц繖涓浆鎴愭椂闂 + * + * @param src + * 灏嗚杞崲鐨勫師濮嬪瓧绗︾獪 + * @param pattern + * 杞崲鐨勫尮閰嶆牸寮 + * @return 濡傛灉杞崲鎴愬姛鍒欒繑鍥炶浆鎹㈠悗鐨勬棩鏈 + * @throws ParseException + * @throws AIDateFormatException + */ + public static Date parseDate(String src, String pattern) + throws ParseException { + return getSDFormat(pattern).parse(src); + + } + + /** + * 鏍规嵁鎸囧畾鐨勬牸寮忓皢瀛楃涓茶浆鎹㈡垚Date 濡傝緭鍏ワ細2003-11-19 11:20:20灏嗘寜鐓ц繖涓浆鎴愭椂闂 + * + * @param src + * 灏嗚杞崲鐨勫師濮嬪瓧绗︾獪 + * @param pattern + * 杞崲鐨勫尮閰嶆牸寮 + * @return 濡傛灉杞崲鎴愬姛鍒欒繑鍥炶浆鎹㈠悗鐨勬棩鏈 + * @throws ParseException + * @throws AIDateFormatException + */ + public static Calendar parseCalendar(String src, String pattern) + throws ParseException { + + Date date = parseDate(src, pattern); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal; + } + + public static String formatAddDate(String src, String pattern, int amount) + throws ParseException { + Calendar cal; + cal = parseCalendar(src, pattern); + cal.add(Calendar.DATE, amount); + return formatDate(cal); + } + + /** + * 鏍规嵁鎸囧畾鐨勬牸寮忓皢瀛楃涓茶浆鎹㈡垚Date 濡傝緭鍏ワ細2003-11-19 11:20:20灏嗘寜鐓ц繖涓浆鎴愭椂闂 + * + * @param src + * 灏嗚杞崲鐨勫師濮嬪瓧绗︾獪 + * @param pattern + * 杞崲鐨勫尮閰嶆牸寮 + * @return 濡傛灉杞崲鎴愬姛鍒欒繑鍥炶浆鎹㈠悗鐨勬椂闂存埑 + * @throws ParseException + * @throws AIDateFormatException + */ + public static Timestamp parseTimestamp(String src, String pattern) + throws ParseException { + Date date = parseDate(src, pattern); + return new Timestamp(date.getTime()); + } + + // //////////////////////////////////////////////////////////////////////////// + // dateDiff + // 璁$畻涓や釜鏃ユ湡涔嬮棿鐨勫樊鍊 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 璁$畻涓や釜鏃堕棿涔嬮棿鐨勫樊鍊硷紝鏍规嵁鏍囧織鐨勪笉鍚岃屼笉鍚 + * + * @param flag + * 璁$畻鏍囧織锛岃〃绀烘寜鐓у勾/鏈/鏃/鏃/鍒/绉掔瓑璁$畻 + * @param calSrc + * 鍑忔暟 + * @param calDes + * 琚噺鏁 + * @return 涓や釜鏃ユ湡涔嬮棿鐨勫樊鍊 + */ + public static int dateDiff(char flag, Calendar calSrc, Calendar calDes) { + + long millisDiff = getMillis(calSrc) - getMillis(calDes); + + if (flag == 'y') { + return (calSrc.get(calSrc.YEAR) - calDes.get(calDes.YEAR)); + } + + if (flag == 'd') { + return (int) (millisDiff / DAY_IN_MILLIS); + } + + if (flag == 'h') { + return (int) (millisDiff / HOUR_IN_MILLIS); + } + + if (flag == 'm') { + return (int) (millisDiff / MINUTE_IN_MILLIS); + } + + if (flag == 's') { + return (int) (millisDiff / SECOND_IN_MILLIS); + } + + return 0; + } + /** + * String绫诲瀷 杞崲涓篋ate, + * 濡傛灉鍙傛暟闀垮害涓10 杞崲鏍煎紡鈥漼yyy-MM-dd鈥 + *濡傛灉鍙傛暟闀垮害涓19 杞崲鏍煎紡鈥漼yyy-MM-dd HH:mm:ss鈥 + * * @param text + * String绫诲瀷鐨勬椂闂村 + */ + public void setAsText(String text) throws IllegalArgumentException { + if (StringUtils.hasText(text)) { + try { + if (text.indexOf(":") == -1 && text.length() == 10) { + setValue(this.date_sdf.parse(text)); + } else if (text.indexOf(":") > 0 && text.length() == 19) { + setValue(this.datetimeFormat.parse(text)); + } else { + throw new IllegalArgumentException( + "Could not parse date, date format is error "); + } + } catch (ParseException ex) { + IllegalArgumentException iae = new IllegalArgumentException( + "Could not parse date: " + ex.getMessage()); + iae.initCause(ex); + throw iae; + } + } else { + setValue(null); + } + } + public static int getYear(){ + GregorianCalendar calendar=new GregorianCalendar(); + calendar.setTime(getDate()); + return calendar.get(Calendar.YEAR); + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/util/DynamicDBUtil.java b/src/main/java/org/jeecgframework/core/util/DynamicDBUtil.java new file mode 100644 index 00000000..bae36e8b --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/DynamicDBUtil.java @@ -0,0 +1,133 @@ +package org.jeecgframework.core.util; + +import java.util.List; +import java.util.Map; + +import org.apache.commons.dbcp.BasicDataSource; +import org.apache.commons.lang.ArrayUtils; +import org.apache.log4j.Logger; +import org.jeecgframework.web.system.pojo.base.DynamicDataSourceEntity; +import org.springframework.jdbc.core.JdbcTemplate; + +/** + * Spring JDBC 瀹炴椂鏁版嵁搴撹闂 + * + * @author chenguobin + * @date 2014-09-05 + * @version 1.0 + */ +public class DynamicDBUtil { + private static final Logger logger = Logger.getLogger(DynamicDBUtil.class); + + private static BasicDataSource getDataSource(final DynamicDataSourceEntity dynamicSourceEntity) { + BasicDataSource dataSource = new BasicDataSource(); + + String driverClassName = dynamicSourceEntity.getDriverClass(); + String url = dynamicSourceEntity.getUrl(); + String dbUser = dynamicSourceEntity.getDbUser(); + String dbPassword = dynamicSourceEntity.getDbPassword(); + + dataSource.setDriverClassName(driverClassName); + dataSource.setUrl(url); + dataSource.setUsername(dbUser); + dataSource.setPassword(dbPassword); + return dataSource; + } + + private static JdbcTemplate getJdbcTemplate(String dbKey) { + DynamicDataSourceEntity dynamicSourceEntity = DynamicDataSourceEntity.DynamicDataSourceMap.get(dbKey); + + BasicDataSource dataSource = getDataSource(dynamicSourceEntity); + JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); + return jdbcTemplate; + } + + /** + * 璇ユ柟娉曞彧鏄柟渚跨敤浜巑ain鏂规硶娴嬭瘯璋冪敤 + * @param dynamicSourceEntity + * @return JdbcTemplate + */ + private static JdbcTemplate getJdbcTemplate(DynamicDataSourceEntity dynamicSourceEntity) { + BasicDataSource dataSource = getDataSource(dynamicSourceEntity); + JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); + return jdbcTemplate; + } + + /** + * Executes the SQL statement in this PreparedStatement object, + * which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or + * DELETE; or an SQL statement that returns nothing, + * such as a DDL statement. + */ + public static int update(final String dbKey, String sql, Object... param) + { + int effectCount = 0; + JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey); + + if (ArrayUtils.isEmpty(param)) { + effectCount = jdbcTemplate.update(sql); + } else { + effectCount = jdbcTemplate.update(sql, param); + } + + return effectCount; + } + + public static Object findOne(final String dbKey, String sql, Object... param) { + List> list; + JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey); + + if (ArrayUtils.isEmpty(param)) { + list = jdbcTemplate.queryForList(sql); + } else { + list = jdbcTemplate.queryForList(sql, param); + } + + if(ListUtils.isNullOrEmpty(list)) + { + logger.error("Except one, but not find actually"); + } + + if(list.size() > 1) + { + logger.error("Except one, but more than one actually"); + } + + return list.get(0); + } + + public static List> findList(final String dbKey, String sql, Object... param) { + List> list; + JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey); + + if (ArrayUtils.isEmpty(param)) { + list = jdbcTemplate.queryForList(sql); + } else { + list = jdbcTemplate.queryForList(sql, param); + } + return list; + } + + public static void main(String[] args) { + DynamicDataSourceEntity dynamicSourceEntity = new DynamicDataSourceEntity(); + + String dbKey = "SAP_DB"; + String driverClassName = "oracle.jdbc.driver.OracleDriver"; + String url = "jdbc:oracle:thin:@10.10.0.59:1521:mid"; + String dbUser = "CRM"; + String dbPassword = "CRM2013"; + + dynamicSourceEntity.setDbKey(dbKey); + dynamicSourceEntity.setDriverClass(driverClassName); + dynamicSourceEntity.setUrl(url); + dynamicSourceEntity.setDbUser(dbUser); + dynamicSourceEntity.setDbPassword(dbPassword); + + JdbcTemplate jdbcTemplate = getJdbcTemplate(dynamicSourceEntity); + + String sql = "select ak.VKBUR, ak.KUNNR, ak.BSTNK, ak.VBELN, ak.MAHDT, ak.BSTDK from VBAK ak where ak.VKORG = '6002'"; + //List> list = DynamicDBUtil.getList(jdbcTemplate, sql); + //System.out.println(list.size()); + } + +} diff --git a/src/main/java/org/jeecgframework/core/util/ExceptionUtil.java b/src/main/java/org/jeecgframework/core/util/ExceptionUtil.java new file mode 100644 index 00000000..8a7fa45d --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/ExceptionUtil.java @@ -0,0 +1,26 @@ +package org.jeecgframework.core.util; + +import java.io.PrintWriter; +import java.io.StringWriter; + +/** + * Exception宸ュ叿绫 + * @author 寮犱唬娴 + */ +public class ExceptionUtil { + + /** + * 杩斿洖閿欒淇℃伅瀛楃涓 + * + * @param ex + * Exception + * @return 閿欒淇℃伅瀛楃涓 + */ + public static String getExceptionMessage(Exception ex) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + ex.printStackTrace(pw); + return sw.toString(); + } + +} diff --git a/src/main/java/org/jeecgframework/core/util/ExceptionUtils.java b/src/main/java/org/jeecgframework/core/util/ExceptionUtils.java new file mode 100644 index 00000000..059f37af --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/ExceptionUtils.java @@ -0,0 +1,39 @@ +package org.jeecgframework.core.util; + +import org.jeecgframework.core.common.exception.BusinessException; + +public class ExceptionUtils { + + private ExceptionUtils(){ + //no instance + } + + + /** + * 濡傛灉鐩爣涓虹┖鍒欐姏鍑哄紓甯 + * @author 鑻嶉拱 + * 2009-11-3 + * @param target + * @param errorMessage + */ + public static void throwIfNull(Object target,String errorMessage){ + if(target==null){ + throw new BusinessException(errorMessage); + } + } + + /** + * 濡傛灉鐩爣涓虹┖鍒欐姏鍑哄紓甯 + * 鏈柟娉曠┖鎸囬拡瀹夊叏 + * 2009-11-3 + * @param target + * @param errorMessage + */ + public static void throwIfEmpty(String target,String errorMessage) + { + if(target==null || target.equals("")){ + throw new BusinessException(errorMessage); + } + } + +} diff --git a/src/main/java/org/jeecgframework/core/util/FileUtils.java b/src/main/java/org/jeecgframework/core/util/FileUtils.java new file mode 100644 index 00000000..44797753 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/FileUtils.java @@ -0,0 +1,172 @@ +package org.jeecgframework.core.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + +import org.apache.log4j.Logger; + +/** + * 鏂囦欢鎿嶄綔宸ュ叿绫 + * @author 寮犱唬娴 + * + */ +public class FileUtils { + private static final Logger logger = Logger.getLogger(FileUtils.class); + /** + * 鑾峰彇鏂囦欢鎵╁睍鍚 + * + * @param filename + * @return + */ + public static String getExtend(String filename) { + return getExtend(filename, ""); + } + + /** + * 鑾峰彇鏂囦欢鎵╁睍鍚 + * + * @param filename + * @return + */ + public static String getExtend(String filename, String defExt) { + if ((filename != null) && (filename.length() > 0)) { + int i = filename.lastIndexOf('.'); + + if ((i > 0) && (i < (filename.length() - 1))) { + return (filename.substring(i+1)).toLowerCase(); + } + } + return defExt.toLowerCase(); + } + + /** + * 鑾峰彇鏂囦欢鍚嶇О[涓嶅惈鍚庣紑鍚峕 + * + * @param + * @return String + */ + public static String getFilePrefix(String fileName) { + int splitIndex = fileName.lastIndexOf("."); + return fileName.substring(0, splitIndex).replaceAll("\\s*", ""); + } + + /** + * 鑾峰彇鏂囦欢鍚嶇О[涓嶅惈鍚庣紑鍚峕 + * 涓嶅幓鎺夋枃浠剁洰褰曠殑绌烘牸 + * @param + * @return String + */ + public static String getFilePrefix2(String fileName) { + int splitIndex = fileName.lastIndexOf("."); + return fileName.substring(0, splitIndex); + } + + /** + * 鏂囦欢澶嶅埗 + *鏂规硶鎽樿锛氳繖閲屼竴鍙ヨ瘽鎻忚堪鏂规硶鐨勭敤閫 + *@param + *@return void + */ + public static void copyFile(String inputFile,String outputFile) throws FileNotFoundException{ + File sFile = new File(inputFile); + File tFile = new File(outputFile); + FileInputStream fis = new FileInputStream(sFile); + FileOutputStream fos = new FileOutputStream(tFile); + int temp = 0; + byte[] buf = new byte[10240]; + try { + while((temp = fis.read(buf))!=-1){ + fos.write(buf, 0, temp); + } + } catch (IOException e) { + e.printStackTrace(); + } finally{ + try { + fis.close(); + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + /** + * 鍒ゆ柇鏂囦欢鏄惁涓哄浘鐗
    + *
    + * + * @param filename + * 鏂囦欢鍚
    + * 鍒ゆ柇鍏蜂綋鏂囦欢绫诲瀷
    + * @return 妫鏌ュ悗鐨勭粨鏋
    + * @throws Exception + */ + public static boolean isPicture(String filename) { + // 鏂囦欢鍚嶇О涓虹┖鐨勫満鍚 + if (oConvertUtils.isEmpty(filename)) { + // 杩斿洖涓嶅拰鍚堟硶 + return false; + } + // 鑾峰緱鏂囦欢鍚庣紑鍚 + //String tmpName = getExtend(filename); + String tmpName = filename; + // 澹版槑鍥剧墖鍚庣紑鍚嶆暟缁 + String imgeArray[][] = { { "bmp", "0" }, { "dib", "1" }, + { "gif", "2" }, { "jfif", "3" }, { "jpe", "4" }, + { "jpeg", "5" }, { "jpg", "6" }, { "png", "7" }, + { "tif", "8" }, { "tiff", "9" }, { "ico", "10" } }; + // 閬嶅巻鍚嶇О鏁扮粍 + for (int i = 0; i < imgeArray.length; i++) { + // 鍒ゆ柇鍗曚釜绫诲瀷鏂囦欢鐨勫満鍚 + if (imgeArray[i][0].equals(tmpName.toLowerCase())) { + return true; + } + } + return false; + } + + /** + * 鍒ゆ柇鏂囦欢鏄惁涓篋WG
    + *
    + * + * @param filename + * 鏂囦欢鍚
    + * 鍒ゆ柇鍏蜂綋鏂囦欢绫诲瀷
    + * @return 妫鏌ュ悗鐨勭粨鏋
    + * @throws Exception + */ + public static boolean isDwg(String filename) { + // 鏂囦欢鍚嶇О涓虹┖鐨勫満鍚 + if (oConvertUtils.isEmpty(filename)) { + // 杩斿洖涓嶅拰鍚堟硶 + return false; + } + // 鑾峰緱鏂囦欢鍚庣紑鍚 + String tmpName = getExtend(filename); + // 澹版槑鍥剧墖鍚庣紑鍚嶆暟缁 + if (tmpName.equals("dwg")) { + return true; + } + return false; + } + + /** + * 鍒犻櫎鎸囧畾鐨勬枃浠 + * + * @param strFileName + * 鎸囧畾缁濆璺緞鐨勬枃浠跺悕 + * @return 濡傛灉鍒犻櫎鎴愬姛true鍚﹀垯false + */ + public static boolean delete(String strFileName) { + File fileDelete = new File(strFileName); + + if (!fileDelete.exists() || !fileDelete.isFile()) { + org.jeecgframework.core.util.LogUtil.info("閿欒: " + strFileName + "涓嶅瓨鍦!"); + return false; + } + + org.jeecgframework.core.util.LogUtil.info("--------鎴愬姛鍒犻櫎鏂囦欢---------"+strFileName); + return fileDelete.delete(); + } +} diff --git a/src/main/java/org/jeecgframework/core/util/FormUtil.java b/src/main/java/org/jeecgframework/core/util/FormUtil.java new file mode 100644 index 00000000..45667cf6 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/FormUtil.java @@ -0,0 +1,546 @@ +package org.jeecgframework.core.util; + +import java.text.MessageFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.lang.StringUtils; + +/** + * 澶勭悊闆峰妶琛ㄥ崟缂栬緫鍣╤tml瑙f瀽鍐呭 + * + * @author 榫欓噾娉 + * + */ +public class FormUtil { + public static void main(String[]arg){ + String test = "閮 `鍙慲```";//test.replaceAll(regex, replacement); + System.out.print(test.split("`").length); + + } + + /** + * view + */ + private static String temp_view = "
    {1}
    "; + /** + * 瑙f瀽鍚庣殑html + * @param parseHtml 鏇挎崲杩囨帶浠剁殑html + * @param contentData 鎺т欢淇℃伅json鏁扮粍 + * @param action view + * @return + */ + public static String GetHtml(String parseHtml, String contentData, + String action) { + + // action=action!=null && !"".equals(action)?action:"view"; + + Map tableData = new HashMap();// 琛ㄥ崟鏁版嵁 + + String html = parseHtml; + JSONArray jsonArray = new JSONArray().fromObject(contentData); + + for (int f = 0; f < jsonArray.size(); f++) { + if (jsonArray.getJSONObject(f) == null + || "".equals(jsonArray.getJSONObject(f))) + continue; + + JSONObject json = jsonArray.getJSONObject(f);// 鑾峰彇瀵硅薄 + + String name = ""; + String leipiplugins = json.getString("leipiplugins").toString(); + if ("checkboxs".equals(leipiplugins)) + name = json.getString("parse_name").toString(); + else + name = json.getString("name").toString(); + + String temp_html = ""; + if ("text".equals(leipiplugins)) { + temp_html = GetTextBox(json, tableData, action); + } else if ("textarea".equals(leipiplugins)) { + temp_html = GetTextArea(json, tableData, action); + } else if ("radios".equals(leipiplugins)) { + temp_html = GetRadios(json, tableData, action); + } else if ("select".equals(leipiplugins)) { + temp_html = GetSelect(json, tableData, action); + } else if ("checkboxs".equals(leipiplugins)) { + temp_html = GetCheckboxs(json, tableData, action); + } else if ("macros".equals(leipiplugins)) { + temp_html = GetMacros(json, tableData, action); + } else if ("qrcode".equals(leipiplugins)) { + temp_html = GetQrcode(json, tableData, action); + } else if ("listctrl".equals(leipiplugins)) { + temp_html = GetListctrl(json, tableData, action); + } else if ("progressbar".equals(leipiplugins)) { + // case ""://杩涘害鏉 (鏈仛澶勭悊) + /* temp_html = GetProgressbar(json, tableData, action); */ + } else { + temp_html = json.getString("content").toString(); + } + + html = html.replace("{" + name + "}", temp_html); + } + return html; + } + + // text + private static String GetTextBox(JSONObject item, + Map formData, String action) { + String temp = ""; + String name = item.getString("name").toString(); + + String value = formData.get(name) == null ? null : formData.get(name) + .toString(); + if (value == null) + value = item.getString("value") == null ? "" : item.getString( + "value").toString(); + String style = item.getString("style") == null ? "" : item.getString( + "style").toString(); + String temp_html = MessageFormat.format(temp, value, name, style); + if ("view".equals(action)) + return MessageFormat.format(temp_view, style, value); + else + return temp_html; + } + + // TextArea + private static String GetTextArea(JSONObject item, + Map formData, String action) { + String script = ""; + if (item.getString("orgrich") != null + && "1".equals(item.getString("orgrich").toString())) + script = "orgrich=\"true\" "; + String name = item.getString("name").toString(); + + String value = formData.get(name) == null ? null : formData.get(name) + .toString(); + if (value == null) + value = item.getString("value") == null ? "" : item.getString( + "value").toString(); + String style = item.getString("style") == null ? "" : item.getString( + "style").toString(); + + String temp = ""; + + String temp_html = MessageFormat.format(temp, name, name, style, + script, value); + + if ("view".equals(action)) + return MessageFormat.format(temp_view, style, value); + else + return temp_html; + } + + // Radios + private static String GetRadios(JSONObject item, + Map formData, String action) { + JSONArray radiosOptions = item.getJSONArray("options"); + // JArray radiosOptions = item["options"] as JArray; + String temp = "{3} "; + String temp_html = ""; + String name = item.getString("name").toString(); + String value = formData.get(name) == null ? null : formData.get(name) + .toString(); + + String cvalue_ = ""; + + for (int f = 0; f < radiosOptions.size(); f++) { + JSONObject json = radiosOptions.getJSONObject(f);// 鑾峰彇瀵硅薄 + String cvalue = json.getString("value").toString(); + String Ischecked = ""; + + if (value == null) { + String check = (json.has("checked") && json + .getString("checked") != null) ? json.getString( + "checked").toString() : ""; + if ("checked".equals(check) || "true".equals(check)) { + Ischecked = " checked=\"checked\" "; + cvalue_ = cvalue; + } + + } + + temp_html += MessageFormat.format(temp, name, cvalue, Ischecked, + cvalue); + } + if ("view".equals(action)) + return MessageFormat.format(temp_view, " ", cvalue_); + else + return temp_html; + } + + // Checkboxs + private static String GetCheckboxs(JSONObject item, + Map formData, String action) { + String temp_html = ""; + String temp = "{3} "; + + String view_value = "";// view 鏌ョ湅鍊 + + JSONArray checkOptions = item.getJSONArray("options"); + for (int f = 0; f < checkOptions.size(); f++) { + + JSONObject json = checkOptions.getJSONObject(f);// 鑾峰彇瀵硅薄 + + String name = json.getString("name").toString(); + String value = formData.get(name) == null ? null : formData.get( + name).toString(); + String cvalue = json.getString("value").toString(); + String Ischecked = ""; + if (value == null) { + String check = (json.has("checked") && json + .getString("checked") != null) ? json.getString( + "checked").toString() : ""; + if (check.equals("checked") || check.equals("true")) { + Ischecked = " checked=\"checked\" "; + view_value += cvalue + " ";// view 鏌ョ湅鍊 + } + } else if (value != null && value.equals(cvalue)) { + Ischecked = " checked=\"checked\" "; + view_value += cvalue + " ";// view 鏌ョ湅鍊 + } + + temp_html += MessageFormat.format(temp, name, cvalue, Ischecked, + cvalue); + + } + if ("view".equals(action)) + return MessageFormat.format(temp_view, " ", view_value); + else + return temp_html; + } + + // Select(姣旇緝鐗规畩) + private static String GetSelect(JSONObject item, + Map formData, String action) { + + String name = item.getString("name").toString(); + String value = formData.get(name) == null ? null : formData.get(name) + .toString(); + + String temp_html = item.getString("content").toString(); + if (value != null)// 鐢ㄦ埛璁剧疆杩囧 + { + temp_html = temp_html.replace("selected=\"selected\"", ""); + value = "value=\"" + value + "\""; + String r = value + " selected=\"selected\""; + temp_html = temp_html.replace(value, r); + } + + if ("view".equals(action)) {// 鏌ョ湅 + return MessageFormat.format(temp_view, " ", + value != null ? value : item.getString("value").toString() + .split(",")[0]); + } else + return temp_html; + } + + // Macros + private static String GetMacros(JSONObject item, + Map formData, String action) { + String name = item.getString("name").toString(); + String value = formData.get(name) == null ? null : formData.get(name) + .toString(); + String temp_html = item.getString("content").toString(); + + if (value == null) { + // region 鍒堕犺鍒欏 + String type = item.getString("orgtype").toString(); + + String date_format = ""; + + Date date = new Date(); + if (type.equals("sys_date")) { + date_format = "yyyy-MM-dd"; + value = DateUtils.formatDate(date, date_format); + } else if (type.equals("sys_date_cn")) { + date_format = "yyyy骞碝M鏈坉d鏃"; + value = DateUtils.formatDate(date, date_format); + + } else if (type.equals("sys_date_cn_short3")) { + date_format = "yyyy骞"; + value = DateUtils.formatDate(date, date_format); + } else if (type.equals("sys_date_cn_short4")) { + date_format = "yyyy"; + value = DateUtils.formatDate(date, date_format); + } else if (type.equals("sys_date_cn_short1")) { + date_format = "yyyy骞碝M鏈"; + value = DateUtils.formatDate(date, date_format); + } else if (type.equals("sys_date_cn_short2")) { + date_format = "MM鏈坉d鏃"; + value = DateUtils.formatDate(date, date_format); + } else if (type.equals("sys_time")) { + date_format = "HH:mm:ss"; + value = DateUtils.formatDate(date, date_format); + } else if (type.equals("sys_datetime")) { + date_format = "yyyy-MM-dd HH:mm:ss"; + value = DateUtils.formatDate(date, date_format); + } else if (type.equals("sys_week")) { + // String[] Day = new String[] { "鏄熸湡鏃", "鏄熸湡涓", "鏄熸湡浜", "鏄熸湡涓", + // "鏄熸湡鍥", "鏄熸湡浜", "鏄熸湡鍏" }; + // value = + // Day[Convert.ToInt32(DateTime.Now.DayOfWeek.ToString("d"))].ToString(); + value = DateUtils.formatDate(date, "EEEE"); + } else if (type.equals("sys_userid")) { + // if(!$def_value) + // $def_value = $controller["user"]["uid"]; + // $tpl = str_replace("{macros}",$def_value,$tpl); + value="${userName }"; + } else if (type.equals("sys_realname")) { + // if(!$def_value) + // $def_value = $controller["user"]["real_name"]; + value="${userName }"; + } else { + } + // endregion + } + if ("view".equals(action)) + return value; + if(value!=null){ + return temp_html.replace("{macros}", value); + }else{ + return temp_html; + } + } + + // Qrcode 浜岀淮鐮 + private static String GetQrcode(JSONObject item, + Map formData, String action) { + String name = item.getString("name").toString(); + String value = formData.get(name) == null ? null : formData.get(name) + .toString(); + String temp_html = ""; + String temp = ""; + String orgType = item.getString("orgtype").toString(); + String style = item.getString("style").toString(); + if ("text".equals(orgType)) { + orgType = "鏂囨湰"; + } else if ("url".equals(orgType)) { + orgType = "瓒呴摼鎺"; + } else if ("tel".equals(orgType)) { + orgType = "鐢佃瘽"; + } + String qrcode_value = ""; + if (item.getString("value") != null) + qrcode_value = item.getString("value").toString(); + // print_R($qrcode_value);exit; //array(value,qrcode_url) + if ("edit".equals(action)) { + temp = orgType + + "浜岀淮鐮 "; + temp_html = MessageFormat.format(temp, name, value); + } else if ("view".equals(action)) { + // 鍙互閲囩敤 http://qrcode.leipi.org/ + + style = ""; + if (item.getString("orgwidth") != null) { + style = "width:" + item.getString("orgwidth").toString() + + "px;"; + } + if (item.getString("orgheight") != null) { + style += "height:" + item.getString("orgheight").toString() + + "px;"; + } + temp = ""; + temp_html = MessageFormat.format(temp_html, name, value, style); + + } else if ("preview".equals(action)) { + style = ""; + if (item.getString("orgwidth") != null) { + style = "width:" + item.getString("orgwidth").toString() + + "px;"; + } + if (item.getString("orgheight") != null) { + style += "height:" + item.getString("orgheight").toString() + + "px;"; + } + temp = ""; + temp_html = MessageFormat.format(temp_html, name, value, style); + } + + return temp_html; + } + + // Listctrl + private static String GetListctrl(JSONObject item, + Map formData, String action) { + String valuetest = "{\"data_110\":[\"1\",\"2\"],\"data_111\":[\"21\",\"22\",\"22\"]}"; + + String name = item.getString("name").toString(); + String value = formData.get(name) == null ? null : formData.get(name) + .toString(); + String temp_html = ""; + String orgSum = item.getString("orgsum").toString(); + String orgUnit = item.getString("orgunit").toString(); + String orgTitle = item.getString("orgtitle").toString(); + String title = item.getString("title").toString(); + String style = item.getString("style").toString(); + String orgcolvalue = item.getString("orgcolvalue").toString(); + String orgcoltype = item.getString("orgcoltype").toString(); + List listTitle = Arrays.asList(orgTitle.split("`")); + List listSum = Arrays.asList(orgSum.split("`")); + List listUnit = Arrays.asList(orgUnit.split("`")); + List listValue = Arrays.asList(orgcolvalue.split("`")); + List listType = Arrays.asList(orgcoltype.split("`")); + int tdCount = listTitle.size(); + + String temp = "{0}{1}{2}
    "; + String btnAdd = ""; // 娣诲姞鎸夐挳 + String theader = "{1}{2}{3}";// 澶撮儴妯$増 + + String trTitle = "";// 鏍囬 + for (int i = 0; i < tdCount; i++) { + if (i == tdCount - 1) + listTitle.set(i, "鎿嶄綔"); + if ("view".equals(action) && i == tdCount - 1) + continue;// 濡傛灉鏄煡鐪嬫渶鍚庝竴鍒椾笉鏄剧ず + trTitle += MessageFormat.format("{0}", listTitle.get(i)); + } + trTitle = "" + trTitle + ""; + + JSONObject dataValue = JSONObject.fromObject(valuetest); + + int rowCount = dataValue != null ? dataValue.size() : 1; + + StringBuilder sbTr = new StringBuilder(); + String tdSum = "";// 濡傛灉鏈夌粺璁″鍔犱竴琛 + + TreeMap SumValueDic = new TreeMap(); + for (int row = 0; row < rowCount; row++) { + + JSONArray rowValue = (dataValue != null && dataValue + .has(name + row)) ? dataValue.getJSONArray(name + row) + : null; + + String tr = "";// 榛樿涓琛 + for (int i = 0; i < tdCount; i++) { + String tdname = name + "[" + i + "]"; + String sum = "1".equals(listSum.get(i)) ? "sum=\"" + tdname + + "\"" : "";// 鏄惁鍙備笌缁熻 + String tdValue =null; + if(i i) ? rowValue + .getString(i).toString() + :tdValue ; + String type = listType.get(i);// 绫诲瀷 + + if (sum != "")// 涓娆″惊鐜绠楄鍒楃殑鍊 + { + // region 璁$畻缁熻鍊 + float tempTdValue = 0; + if (SumValueDic.containsKey(i)) + tempTdValue = SumValueDic.get(i); + try { + float resultTdTemp = 0; + resultTdTemp = Float.parseFloat(tdValue); + // float.TryParse(tdValue, out resultTdTemp); + tempTdValue += resultTdTemp; + } catch (Exception e) { + tdValue = "0"; + } + if (SumValueDic.containsKey(i)) + SumValueDic.subMap(i, (int) tempTdValue); + else + SumValueDic.put(i, tempTdValue); + // endregion + + } + + if (i == tdCount - 1)// 鏈鍚庝竴鍒椾笉鏄剧ず + { + if ("view".equals(action)) + continue; + // tr += ""; + else + tr += "鍒犻櫎"; + // tr += + // string.Format("鍒犻櫎", + // dataValue != null ? "" : "hide"); + } else { + if ("view".equals(action)) { + tr += MessageFormat.format("{0}", tdValue); + } else { + if ("text".equals(type)) + tr += MessageFormat + .format( + "", + tdValue, tdname, sum); + else if ("int".equals(type)) + tr += MessageFormat + .format( + "", + tdValue, tdname, sum); + else if ("textarea".equals(type)) + tr += MessageFormat + .format( + "", + tdname, tdValue, sum); + else if ("calc".equals(type)) + tr += MessageFormat + .format( + "", + tdValue, tdname, sum); + } + } + + if (row == 0)// 缁熻鐨勮鍙湁涓琛 + { + // region + if (sum != "") { + if ("view".equals(action)) + tdSum += MessageFormat.format( + "鍚堣锛歷alue{0}{1}", i, listUnit + .get(i)); + else + tdSum += MessageFormat + .format( + "鍚堣锛{3}", + i, tdname, sum, listUnit.get(i)); + } else { + tdSum += ""; + } + // endregion + + } + + } + sbTr.append(MessageFormat.format("{0}", + tr)); + + } + /* + * if(!StringUtils.isBlank(tdSum)){ + * + * } + */ + + if (!StringUtils.isBlank(tdSum)) { + for (Integer i : SumValueDic.keySet()) { + tdSum = tdSum.replace("value" + i, SumValueDic.get(i) + .toString()); + tdSum = MessageFormat.format( + "{0}", tdSum); + } + } + if ("view".equals(action)) + theader = MessageFormat + .format(theader, tdCount, title, "", trTitle); + else + theader = MessageFormat.format(theader, tdCount, title, btnAdd, + trTitle); + + temp_html = MessageFormat.format(temp, theader, sbTr.toString(), tdSum); + + return temp_html; + } +} diff --git a/src/main/java/org/jeecgframework/core/util/GenericsUtils.java b/src/main/java/org/jeecgframework/core/util/GenericsUtils.java new file mode 100644 index 00000000..7df20df1 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/GenericsUtils.java @@ -0,0 +1,287 @@ +package org.jeecgframework.core.util; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import javax.servlet.http.HttpSession; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * 娉涘瀷宸ュ叿绫 + * + * @author ShunLi + * @notes Created on 2010-1-21
    + * Revision of last commit:$Revision: 1.1 $
    + * Author of last commit:$Author: ghp $
    + * Date of last commit:$Date: 2010-01-25 16:48:17 +0800 (鍛ㄤ竴, 25 涓鏈 2010) + * $
    + *

    + */ +public class GenericsUtils { + /** + * 閫氳繃鍙嶅皠,鑾峰緱鎸囧畾绫荤殑鐖剁被鐨勬硾鍨嬪弬鏁扮殑瀹為檯绫诲瀷. 濡侭uyerServiceBean extends DaoSupport + * + * @param clazz + * clazz 闇瑕佸弽灏勭殑绫,璇ョ被蹇呴』缁ф壙鑼冨瀷鐖剁被 + * @param index + * 娉涘瀷鍙傛暟鎵鍦ㄧ储寮,浠0寮濮. + * @return 鑼冨瀷鍙傛暟鐨勫疄闄呯被鍨, 濡傛灉娌℃湁瀹炵幇ParameterizedType鎺ュ彛锛屽嵆涓嶆敮鎸佹硾鍨嬶紝鎵浠ョ洿鎺ヨ繑鍥 + * Object.class + */ + @SuppressWarnings("unchecked") + public static Class getSuperClassGenricType(Class clazz, int index) { + Type genType = clazz.getGenericSuperclass();// 寰楀埌娉涘瀷鐖剁被 + // 濡傛灉娌℃湁瀹炵幇ParameterizedType鎺ュ彛锛屽嵆涓嶆敮鎸佹硾鍨嬶紝鐩存帴杩斿洖Object.class + if (!(genType instanceof ParameterizedType)) { + return Object.class; + } + // 杩斿洖琛ㄧず姝ょ被鍨嬪疄闄呯被鍨嬪弬鏁扮殑Type瀵硅薄鐨勬暟缁,鏁扮粍閲屾斁鐨勯兘鏄搴旂被鍨嬬殑Class, 濡侭uyerServiceBean extends + // DaoSupport灏辫繑鍥濨uyer鍜孋ontact绫诲瀷 + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + if (index >= params.length || index < 0) { + throw new RuntimeException("浣犺緭鍏ョ殑绱㈠紩" + (index < 0 ? "涓嶈兘灏忎簬0" : "瓒呭嚭浜嗗弬鏁扮殑鎬绘暟")); + } + if (!(params[index] instanceof Class)) { + return Object.class; + } + return (Class) params[index]; + } + + /** + * 閫氳繃鍙嶅皠,鑾峰緱鎸囧畾绫荤殑鐖剁被鐨勭涓涓硾鍨嬪弬鏁扮殑瀹為檯绫诲瀷. 濡侭uyerServiceBean extends DaoSupport + * + * @param clazz + * clazz 闇瑕佸弽灏勭殑绫,璇ョ被蹇呴』缁ф壙娉涘瀷鐖剁被 + * @return 娉涘瀷鍙傛暟鐨勫疄闄呯被鍨, 濡傛灉娌℃湁瀹炵幇ParameterizedType鎺ュ彛锛屽嵆涓嶆敮鎸佹硾鍨嬶紝鎵浠ョ洿鎺ヨ繑鍥 + * Object.class + */ + @SuppressWarnings("unchecked") + public static Class getSuperClassGenricType(Class clazz) { + return getSuperClassGenricType(clazz, 0); + } + + /** + * 閫氳繃鍙嶅皠,鑾峰緱鏂规硶杩斿洖鍊兼硾鍨嬪弬鏁扮殑瀹為檯绫诲瀷. 濡: public Map getNames(){} + * + * @param Method + * method 鏂规硶 + * @param int index 娉涘瀷鍙傛暟鎵鍦ㄧ储寮,浠0寮濮. + * @return 娉涘瀷鍙傛暟鐨勫疄闄呯被鍨, 濡傛灉娌℃湁瀹炵幇ParameterizedType鎺ュ彛锛屽嵆涓嶆敮鎸佹硾鍨嬶紝鎵浠ョ洿鎺ヨ繑鍥 + * Object.class + */ + @SuppressWarnings("unchecked") + public static Class getMethodGenericReturnType(Method method, int index) { + Type returnType = method.getGenericReturnType(); + if (returnType instanceof ParameterizedType) { + ParameterizedType type = (ParameterizedType) returnType; + Type[] typeArguments = type.getActualTypeArguments(); + if (index >= typeArguments.length || index < 0) { + throw new RuntimeException("浣犺緭鍏ョ殑绱㈠紩" + (index < 0 ? "涓嶈兘灏忎簬0" : "瓒呭嚭浜嗗弬鏁扮殑鎬绘暟")); + } + return (Class) typeArguments[index]; + } + return Object.class; + } + + /** + * 閫氳繃鍙嶅皠,鑾峰緱鏂规硶杩斿洖鍊肩涓涓硾鍨嬪弬鏁扮殑瀹為檯绫诲瀷. 濡: public Map getNames(){} + * + * @param Method + * method 鏂规硶 + * @return 娉涘瀷鍙傛暟鐨勫疄闄呯被鍨, 濡傛灉娌℃湁瀹炵幇ParameterizedType鎺ュ彛锛屽嵆涓嶆敮鎸佹硾鍨嬶紝鎵浠ョ洿鎺ヨ繑鍥 + * Object.class + */ + @SuppressWarnings("unchecked") + public static Class getMethodGenericReturnType(Method method) { + return getMethodGenericReturnType(method, 0); + } + + /** + * 閫氳繃鍙嶅皠,鑾峰緱鏂规硶杈撳叆鍙傛暟绗琲ndex涓緭鍏ュ弬鏁扮殑鎵鏈夋硾鍨嬪弬鏁扮殑瀹為檯绫诲瀷. 濡: public void add(Map maps, List names){} + * + * @param Method + * method 鏂规硶 + * @param int index 绗嚑涓緭鍏ュ弬鏁 + * @return 杈撳叆鍙傛暟鐨勬硾鍨嬪弬鏁扮殑瀹為檯绫诲瀷闆嗗悎, 濡傛灉娌℃湁瀹炵幇ParameterizedType鎺ュ彛锛屽嵆涓嶆敮鎸佹硾鍨嬶紝鎵浠ョ洿鎺ヨ繑鍥炵┖闆嗗悎 + */ + @SuppressWarnings("unchecked") + public static List getMethodGenericParameterTypes(Method method, int index) { + List results = new ArrayList(); + Type[] genericParameterTypes = method.getGenericParameterTypes(); + if (index >= genericParameterTypes.length || index < 0) { + throw new RuntimeException("浣犺緭鍏ョ殑绱㈠紩" + (index < 0 ? "涓嶈兘灏忎簬0" : "瓒呭嚭浜嗗弬鏁扮殑鎬绘暟")); + } + Type genericParameterType = genericParameterTypes[index]; + if (genericParameterType instanceof ParameterizedType) { + ParameterizedType aType = (ParameterizedType) genericParameterType; + Type[] parameterArgTypes = aType.getActualTypeArguments(); + for (Type parameterArgType : parameterArgTypes) { + Class parameterArgClass = (Class) parameterArgType; + results.add(parameterArgClass); + } + return results; + } + return results; + } + + /** + * 閫氳繃鍙嶅皠,鑾峰緱鏂规硶杈撳叆鍙傛暟绗竴涓緭鍏ュ弬鏁扮殑鎵鏈夋硾鍨嬪弬鏁扮殑瀹為檯绫诲瀷. 濡: public void add(Map + * maps, List names){} + * + * @param Method + * method 鏂规硶 + * @return 杈撳叆鍙傛暟鐨勬硾鍨嬪弬鏁扮殑瀹為檯绫诲瀷闆嗗悎, 濡傛灉娌℃湁瀹炵幇ParameterizedType鎺ュ彛锛屽嵆涓嶆敮鎸佹硾鍨嬶紝鎵浠ョ洿鎺ヨ繑鍥炵┖闆嗗悎 + */ + @SuppressWarnings("unchecked") + public static List getMethodGenericParameterTypes(Method method) { + return getMethodGenericParameterTypes(method, 0); + } + + /** + * 閫氳繃鍙嶅皠,鑾峰緱Field娉涘瀷鍙傛暟鐨勫疄闄呯被鍨. 濡: public Map names; + * + * @param Field + * field 瀛楁 + * @param int index 娉涘瀷鍙傛暟鎵鍦ㄧ储寮,浠0寮濮. + * @return 娉涘瀷鍙傛暟鐨勫疄闄呯被鍨, 濡傛灉娌℃湁瀹炵幇ParameterizedType鎺ュ彛锛屽嵆涓嶆敮鎸佹硾鍨嬶紝鎵浠ョ洿鎺ヨ繑鍥 + * Object.class + */ + @SuppressWarnings("unchecked") + public static Class getFieldGenericType(Field field, int index) { + Type genericFieldType = field.getGenericType(); + + if (genericFieldType instanceof ParameterizedType) { + ParameterizedType aType = (ParameterizedType) genericFieldType; + Type[] fieldArgTypes = aType.getActualTypeArguments(); + if (index >= fieldArgTypes.length || index < 0) { + throw new RuntimeException("浣犺緭鍏ョ殑绱㈠紩" + (index < 0 ? "涓嶈兘灏忎簬0" : "瓒呭嚭浜嗗弬鏁扮殑鎬绘暟")); + } + return (Class) fieldArgTypes[index]; + } + return Object.class; + } + + /** + * 閫氳繃鍙嶅皠,鑾峰緱Field娉涘瀷鍙傛暟鐨勫疄闄呯被鍨. 濡: public Map names; + * + * @param Field + * field 瀛楁 + * @param int index 娉涘瀷鍙傛暟鎵鍦ㄧ储寮,浠0寮濮. + * @return 娉涘瀷鍙傛暟鐨勫疄闄呯被鍨, 濡傛灉娌℃湁瀹炵幇ParameterizedType鎺ュ彛锛屽嵆涓嶆敮鎸佹硾鍨嬶紝鎵浠ョ洿鎺ヨ繑鍥 + * Object.class + */ + @SuppressWarnings("unchecked") + public static Class getFieldGenericType(Field field) { + return getFieldGenericType(field, 0); + } +/** + * 鏍规嵁瀹炰綋寰楀埌瀹炰綋鐨勬墍鏈夊睘鎬 + * @param objClass + * @return + * @throws ClassNotFoundException + */ + public static String[] getColumnNames(String objClass) throws ClassNotFoundException { + String[] wageStrArray = null; + if (objClass != null) { + Class class1 = Class.forName(objClass); + Field[] field = class1.getDeclaredFields();// 杩欓噷渚挎槸鑾峰緱瀹炰綋Bean涓墍鏈夊睘鎬х殑鏂规硶 + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < field.length; i++) {// 杩欓噷涓嶅璇翠簡 + + sb.append(field[i].getName()); + + // 杩欐槸鍒嗗壊绗 鏄负浜嗗幓鎺夋渶鍚庨偅涓楀彿 + + // 姣斿 濡傛灉涓嶅幓鏈鍚庨偅涓楀彿 鏈鍚庢墦鍗板嚭鏉ョ殑缁撴灉鏄 "id,name," + + // 鍘讳簡浠ュ悗鎵撳嵃鍑烘潵鐨勬槸 "id,name" + if (i < field.length - 1) { + sb.append(","); + + } + } + + // split(",");杩欐槸鏍规嵁閫楀彿鏉ュ垏鍓插瓧绗︿覆浣垮瓧绗︿覆鍙樻垚涓涓暟缁 + + wageStrArray = sb.toString().split(","); + return wageStrArray; + } else { + return wageStrArray; + } + } + public static Object[] field2Value(Field[] f, Object o) throws Exception { + Object[] value = new Object[f.length]; + for (int i = 0; i < f.length; i++) { + value[i] = f[i].get(o); + } + return value; + } + /** + * returns the current http session object + * + * @return session + */ + public HttpSession getSession() { + HttpSession session=null; + ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); + HttpSession contextSess = attr == null ? session : attr.getRequest().getSession(true); + + return contextSess; + } + /** + * 寰楀埌瀹炰綋绫 + * @param objClass 瀹炰綋绫诲寘鍚寘鍚 + * @return + */ + public static Class getEntityClass(String objClass){ + Class entityClass = null; + try { + entityClass = Class.forName(objClass); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return entityClass; + } + + /** + * 瀹氫箟瀛楃闆 + * @param + * @return + */ + private static char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', + 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', + 'y', 'z', 'A', 'B','C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', + 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', + 'Z'}; //72涓瓧绗﹂泦 + + /** + * + * @param passLength + * 闅忔満瀵嗙爜闀垮害 + * @param count + * 闅忔満瀵嗙爜涓暟 + * @return 闅忔満瀵嗙爜鏁扮粍 + */ + public static String getPasswords(int passLength) { + String passwords = "";// 鏂板缓涓涓暱搴︿负鎸囧畾闇瑕佸瘑鐮佷釜鏁扮殑瀛楃涓叉暟缁 + Random random = new Random(); + StringBuilder password = new StringBuilder("");// 淇濆瓨鐢熸垚瀵嗙爜鐨勫彉閲 + for (int m = 1; m <= passLength; m++) {// 鍐呭惊鐜 浠1寮濮嬪埌瀵嗙爜闀垮害 姝e紡寮濮嬬敓鎴愬瘑鐮 + password.append(chars[random.nextInt(62)]);// 涓哄瘑鐮佸彉閲忛殢鏈哄鍔犱笂闈㈠瓧绗︿腑鐨勪竴涓 + } + passwords = password.toString();// 灏嗙敓鎴愬嚭鏉ョ殑瀵嗙爜璧嬪肩粰瀵嗙爜鏁扮粍 + return passwords; + } + + +} diff --git a/src/main/java/org/jeecgframework/core/util/IdcardUtils.java b/src/main/java/org/jeecgframework/core/util/IdcardUtils.java new file mode 100644 index 00000000..4585ebfb --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/IdcardUtils.java @@ -0,0 +1,619 @@ +package org.jeecgframework.core.util; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; + +/** + * 韬唤璇佸伐鍏风被 + * + * @author June + * @version 1.0, 2010-06-17 + */ +public class IdcardUtils extends StringUtils { + + /** 涓浗鍏皯韬唤璇佸彿鐮佹渶灏忛暱搴︺ */ + public static final int CHINA_ID_MIN_LENGTH = 15; + + /** 涓浗鍏皯韬唤璇佸彿鐮佹渶澶ч暱搴︺ */ + public static final int CHINA_ID_MAX_LENGTH = 18; + + /** 鐪併佺洿杈栧競浠g爜琛 */ + public static final String cityCode[] = { + "11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41", + "42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71", + "81", "82", "91" + }; + + /** 姣忎綅鍔犳潈鍥犲瓙 */ + public static final int power[] = { + 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 + }; + + /** 绗18浣嶆牎妫鐮 */ + public static final String verifyCode[] = { + "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" + }; + /** 鏈浣庡勾闄 */ + public static final int MIN = 1930; + public static Map cityCodes = new HashMap(); + /** 鍙版咕韬唤棣栧瓧姣嶅搴旀暟瀛 */ + public static Map twFirstCode = new HashMap(); + /** 棣欐腐韬唤棣栧瓧姣嶅搴旀暟瀛 */ + public static Map hkFirstCode = new HashMap(); + static { + cityCodes.put("11", "鍖椾含"); + cityCodes.put("12", "澶╂触"); + cityCodes.put("13", "娌冲寳"); + cityCodes.put("14", "灞辫タ"); + cityCodes.put("15", "鍐呰挋鍙"); + cityCodes.put("21", "杈藉畞"); + cityCodes.put("22", "鍚夋灄"); + cityCodes.put("23", "榛戦緳姹"); + cityCodes.put("31", "涓婃捣"); + cityCodes.put("32", "姹熻嫃"); + cityCodes.put("33", "娴欐睙"); + cityCodes.put("34", "瀹夊窘"); + cityCodes.put("35", "绂忓缓"); + cityCodes.put("36", "姹熻タ"); + cityCodes.put("37", "灞变笢"); + cityCodes.put("41", "娌冲崡"); + cityCodes.put("42", "婀栧寳"); + cityCodes.put("43", "婀栧崡"); + cityCodes.put("44", "骞夸笢"); + cityCodes.put("45", "骞胯タ"); + cityCodes.put("46", "娴峰崡"); + cityCodes.put("50", "閲嶅簡"); + cityCodes.put("51", "鍥涘窛"); + cityCodes.put("52", "璐靛窞"); + cityCodes.put("53", "浜戝崡"); + cityCodes.put("54", "瑗胯棌"); + cityCodes.put("61", "闄曡タ"); + cityCodes.put("62", "鐢樿們"); + cityCodes.put("63", "闈掓捣"); + cityCodes.put("64", "瀹佸"); + cityCodes.put("65", "鏂扮枂"); + cityCodes.put("71", "鍙版咕"); + cityCodes.put("81", "棣欐腐"); + cityCodes.put("82", "婢抽棬"); + cityCodes.put("91", "鍥藉"); + twFirstCode.put("A", 10); + twFirstCode.put("B", 11); + twFirstCode.put("C", 12); + twFirstCode.put("D", 13); + twFirstCode.put("E", 14); + twFirstCode.put("F", 15); + twFirstCode.put("G", 16); + twFirstCode.put("H", 17); + twFirstCode.put("J", 18); + twFirstCode.put("K", 19); + twFirstCode.put("L", 20); + twFirstCode.put("M", 21); + twFirstCode.put("N", 22); + twFirstCode.put("P", 23); + twFirstCode.put("Q", 24); + twFirstCode.put("R", 25); + twFirstCode.put("S", 26); + twFirstCode.put("T", 27); + twFirstCode.put("U", 28); + twFirstCode.put("V", 29); + twFirstCode.put("X", 30); + twFirstCode.put("Y", 31); + twFirstCode.put("W", 32); + twFirstCode.put("Z", 33); + twFirstCode.put("I", 34); + twFirstCode.put("O", 35); + hkFirstCode.put("A", 1); + hkFirstCode.put("B", 2); + hkFirstCode.put("C", 3); + hkFirstCode.put("R", 18); + hkFirstCode.put("U", 21); + hkFirstCode.put("Z", 26); + hkFirstCode.put("X", 24); + hkFirstCode.put("W", 23); + hkFirstCode.put("O", 15); + hkFirstCode.put("N", 14); + } + + /** + * 灏15浣嶈韩浠借瘉鍙风爜杞崲涓18浣 + * + * @param idCard + * 15浣嶈韩浠界紪鐮 + * @return 18浣嶈韩浠界紪鐮 + */ + public static String conver15CardTo18(String idCard) { + String idCard18 = ""; + if (idCard.length() != CHINA_ID_MIN_LENGTH) { + return null; + } + if (isNum(idCard)) { + // 鑾峰彇鍑虹敓骞存湀鏃 + String birthday = idCard.substring(6, 12); + Date birthDate = null; + try { + birthDate = new SimpleDateFormat("yyMMdd").parse(birthday); + } catch (ParseException e) { + e.printStackTrace(); + } + Calendar cal = Calendar.getInstance(); + if (birthDate != null) + cal.setTime(birthDate); + // 鑾峰彇鍑虹敓骞(瀹屽叏琛ㄧ幇褰㈠紡,濡傦細2010) + String sYear = String.valueOf(cal.get(Calendar.YEAR)); + idCard18 = idCard.substring(0, 6) + sYear + idCard.substring(8); + // 杞崲瀛楃鏁扮粍 + char[] cArr = idCard18.toCharArray(); + if (cArr != null) { + int[] iCard = converCharToInt(cArr); + int iSum17 = getPowerSum(iCard); + // 鑾峰彇鏍¢獙浣 + String sVal = getCheckCode18(iSum17); + if (sVal.length() > 0) { + idCard18 += sVal; + } else { + return null; + } + } + } else { + return null; + } + return idCard18; + } + + /** + * 楠岃瘉韬唤璇佹槸鍚﹀悎娉 + */ + public static boolean validateCard(String idCard) { + String card = idCard.trim(); + if (validateIdCard18(card)) { + return true; + } + if (validateIdCard15(card)) { + return true; + } + String[] cardval = validateIdCard10(card); + if (cardval != null) { + if (cardval[2].equals("true")) { + return true; + } + } + return false; + } + + /** + * 楠岃瘉18浣嶈韩浠界紪鐮佹槸鍚﹀悎娉 + * + * @param idCard 韬唤缂栫爜 + * @return 鏄惁鍚堟硶 + */ + public static boolean validateIdCard18(String idCard) { + boolean bTrue = false; + if (idCard.length() == CHINA_ID_MAX_LENGTH) { + // 鍓17浣 + String code17 = idCard.substring(0, 17); + // 绗18浣 + String code18 = idCard.substring(17, CHINA_ID_MAX_LENGTH); + if (isNum(code17)) { + char[] cArr = code17.toCharArray(); + if (cArr != null) { + int[] iCard = converCharToInt(cArr); + int iSum17 = getPowerSum(iCard); + // 鑾峰彇鏍¢獙浣 + String val = getCheckCode18(iSum17); + if (val.length() > 0) { + if (val.equalsIgnoreCase(code18)) { + bTrue = true; + } + } + } + } + } + return bTrue; + } + + /** + * 楠岃瘉15浣嶈韩浠界紪鐮佹槸鍚﹀悎娉 + * + * @param idCard + * 韬唤缂栫爜 + * @return 鏄惁鍚堟硶 + */ + public static boolean validateIdCard15(String idCard) { + if (idCard.length() != CHINA_ID_MIN_LENGTH) { + return false; + } + if (isNum(idCard)) { + String proCode = idCard.substring(0, 2); + if (cityCodes.get(proCode) == null) { + return false; + } + String birthCode = idCard.substring(6, 12); + Date birthDate = null; + try { + birthDate = new SimpleDateFormat("yy").parse(birthCode.substring(0, 2)); + } catch (ParseException e) { + e.printStackTrace(); + } + Calendar cal = Calendar.getInstance(); + if (birthDate != null) + cal.setTime(birthDate); + if (!valiDate(cal.get(Calendar.YEAR), Integer.valueOf(birthCode.substring(2, 4)), + Integer.valueOf(birthCode.substring(4, 6)))) { + return false; + } + } else { + return false; + } + return true; + } + + /** + * 楠岃瘉10浣嶈韩浠界紪鐮佹槸鍚﹀悎娉 + * + * @param idCard 韬唤缂栫爜 + * @return 韬唤璇佷俊鎭暟缁 + *

    + * [0] - 鍙版咕銆佹境闂ㄣ侀娓 [1] - 鎬у埆(鐢稭,濂矲,鏈煡N) [2] - 鏄惁鍚堟硶(鍚堟硶true,涓嶅悎娉昮alse) + * 鑻ヤ笉鏄韩浠借瘉浠跺彿鐮佸垯杩斿洖null + *

    + */ + public static String[] validateIdCard10(String idCard) { + String[] info = new String[3]; + String card = idCard.replaceAll("[\\(|\\)]", ""); + if (card.length() != 8 && card.length() != 9 && idCard.length() != 10) { + return null; + } + if (idCard.matches("^[a-zA-Z][0-9]{9}$")) { // 鍙版咕 + info[0] = "鍙版咕"; + org.jeecgframework.core.util.LogUtil.info("11111"); + String char2 = idCard.substring(1, 2); + if (char2.equals("1")) { + info[1] = "M"; + org.jeecgframework.core.util.LogUtil.info("MMMMMMM"); + } else if (char2.equals("2")) { + info[1] = "F"; + org.jeecgframework.core.util.LogUtil.info("FFFFFFF"); + } else { + info[1] = "N"; + info[2] = "false"; + org.jeecgframework.core.util.LogUtil.info("NNNN"); + return info; + } + info[2] = validateTWCard(idCard) ? "true" : "false"; + } else if (idCard.matches("^[1|5|7][0-9]{6}\\(?[0-9A-Z]\\)?$")) { // 婢抽棬 + info[0] = "婢抽棬"; + info[1] = "N"; + // TODO + } else if (idCard.matches("^[A-Z]{1,2}[0-9]{6}\\(?[0-9A]\\)?$")) { // 棣欐腐 + info[0] = "棣欐腐"; + info[1] = "N"; + info[2] = validateHKCard(idCard) ? "true" : "false"; + } else { + return null; + } + return info; + } + + /** + * 楠岃瘉鍙版咕韬唤璇佸彿鐮 + * + * @param idCard + * 韬唤璇佸彿鐮 + * @return 楠岃瘉鐮佹槸鍚︾鍚 + */ + public static boolean validateTWCard(String idCard) { + String start = idCard.substring(0, 1); + String mid = idCard.substring(1, 9); + String end = idCard.substring(9, 10); + Integer iStart = twFirstCode.get(start); + Integer sum = iStart / 10 + (iStart % 10) * 9; + char[] chars = mid.toCharArray(); + Integer iflag = 8; + for (char c : chars) { + sum = sum + Integer.valueOf(c + "") * iflag; + iflag--; + } + return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.valueOf(end) ? true : false; + } + + /** + * 楠岃瘉棣欐腐韬唤璇佸彿鐮(瀛樺湪Bug锛岄儴浠界壒娈婅韩浠借瘉鏃犳硶妫鏌) + *

    + * 韬唤璇佸墠2浣嶄负鑻辨枃瀛楃锛屽鏋滃彧鍑虹幇涓涓嫳鏂囧瓧绗﹀垯琛ㄧず绗竴浣嶆槸绌烘牸锛屽搴旀暟瀛58 鍓2浣嶈嫳鏂囧瓧绗-Z鍒嗗埆瀵瑰簲鏁板瓧10-35 + * 鏈鍚庝竴浣嶆牎楠岀爜涓0-9鐨勬暟瀛楀姞涓婂瓧绗"A"锛"A"浠h〃10 + *

    + *

    + * 灏嗚韩浠借瘉鍙风爜鍏ㄩ儴杞崲涓烘暟瀛楋紝鍒嗗埆瀵瑰簲涔9-1鐩稿姞鐨勬诲拰锛屾暣闄11鍒欒瘉浠跺彿鐮佹湁鏁 + *

    + * + * @param idCard 韬唤璇佸彿鐮 + * @return 楠岃瘉鐮佹槸鍚︾鍚 + */ + public static boolean validateHKCard(String idCard) { + String card = idCard.replaceAll("[\\(|\\)]", ""); + Integer sum = 0; + if (card.length() == 9) { + sum = (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 9 + + (Integer.valueOf(card.substring(1, 2).toUpperCase().toCharArray()[0]) - 55) * 8; + card = card.substring(1, 9); + } else { + sum = 522 + (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 8; + } + String mid = card.substring(1, 7); + String end = card.substring(7, 8); + char[] chars = mid.toCharArray(); + Integer iflag = 7; + for (char c : chars) { + sum = sum + Integer.valueOf(c + "") * iflag; + iflag--; + } + if (end.toUpperCase().equals("A")) { + sum = sum + 10; + } else { + sum = sum + Integer.valueOf(end); + } + return (sum % 11 == 0) ? true : false; + } + + /** + * 灏嗗瓧绗︽暟缁勮浆鎹㈡垚鏁板瓧鏁扮粍 + * + * @param ca + * 瀛楃鏁扮粍 + * @return 鏁板瓧鏁扮粍 + */ + public static int[] converCharToInt(char[] ca) { + int len = ca.length; + int[] iArr = new int[len]; + try { + for (int i = 0; i < len; i++) { + iArr[i] = Integer.parseInt(String.valueOf(ca[i])); + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + return iArr; + } + + /** + * 灏嗚韩浠借瘉鐨勬瘡浣嶅拰瀵瑰簲浣嶇殑鍔犳潈鍥犲瓙鐩镐箻涔嬪悗锛屽啀寰楀埌鍜屽 + * + * @param iArr + * @return 韬唤璇佺紪鐮併 + */ + public static int getPowerSum(int[] iArr) { + int iSum = 0; + if (power.length == iArr.length) { + for (int i = 0; i < iArr.length; i++) { + for (int j = 0; j < power.length; j++) { + if (i == j) { + iSum = iSum + iArr[i] * power[j]; + } + } + } + } + return iSum; + } + + /** + * 灏唒ower鍜屽间笌11鍙栨ā鑾峰緱浣欐暟杩涜鏍¢獙鐮佸垽鏂 + * + * @param iSum + * @return 鏍¢獙浣 + */ + public static String getCheckCode18(int iSum) { + String sCode = ""; + switch (iSum % 11) { + case 10: + sCode = "2"; + break; + case 9: + sCode = "3"; + break; + case 8: + sCode = "4"; + break; + case 7: + sCode = "5"; + break; + case 6: + sCode = "6"; + break; + case 5: + sCode = "7"; + break; + case 4: + sCode = "8"; + break; + case 3: + sCode = "9"; + break; + case 2: + sCode = "x"; + break; + case 1: + sCode = "0"; + break; + case 0: + sCode = "1"; + break; + } + return sCode; + } + + /** + * 鏍规嵁韬唤缂栧彿鑾峰彇骞撮緞 + * + * @param idCard + * 韬唤缂栧彿 + * @return 骞撮緞 + */ + public static int getAgeByIdCard(String idCard) { + int iAge = 0; + if (idCard.length() == CHINA_ID_MIN_LENGTH) { + idCard = conver15CardTo18(idCard); + } + String year = idCard.substring(6, 10); + Calendar cal = Calendar.getInstance(); + int iCurrYear = cal.get(Calendar.YEAR); + iAge = iCurrYear - Integer.valueOf(year); + return iAge; + } + + /** + * 鏍规嵁韬唤缂栧彿鑾峰彇鐢熸棩 + * + * @param idCard 韬唤缂栧彿 + * @return 鐢熸棩(yyyyMMdd) + */ + public static String getBirthByIdCard(String idCard) { + Integer len = idCard.length(); + if (len < CHINA_ID_MIN_LENGTH) { + return null; + } else if (len == CHINA_ID_MIN_LENGTH) { + idCard = conver15CardTo18(idCard); + } + return idCard.substring(6, 14); + } + + /** + * 鏍规嵁韬唤缂栧彿鑾峰彇鐢熸棩骞 + * + * @param idCard 韬唤缂栧彿 + * @return 鐢熸棩(yyyy) + */ + public static Short getYearByIdCard(String idCard) { + Integer len = idCard.length(); + if (len < CHINA_ID_MIN_LENGTH) { + return null; + } else if (len == CHINA_ID_MIN_LENGTH) { + idCard = conver15CardTo18(idCard); + } + return Short.valueOf(idCard.substring(6, 10)); + } + + /** + * 鏍规嵁韬唤缂栧彿鑾峰彇鐢熸棩鏈 + * + * @param idCard + * 韬唤缂栧彿 + * @return 鐢熸棩(MM) + */ + public static Short getMonthByIdCard(String idCard) { + Integer len = idCard.length(); + if (len < CHINA_ID_MIN_LENGTH) { + return null; + } else if (len == CHINA_ID_MIN_LENGTH) { + idCard = conver15CardTo18(idCard); + } + return Short.valueOf(idCard.substring(10, 12)); + } + + /** + * 鏍规嵁韬唤缂栧彿鑾峰彇鐢熸棩澶 + * + * @param idCard + * 韬唤缂栧彿 + * @return 鐢熸棩(dd) + */ + public static Short getDateByIdCard(String idCard) { + Integer len = idCard.length(); + if (len < CHINA_ID_MIN_LENGTH) { + return null; + } else if (len == CHINA_ID_MIN_LENGTH) { + idCard = conver15CardTo18(idCard); + } + return Short.valueOf(idCard.substring(12, 14)); + } + + /** + * 鏍规嵁韬唤缂栧彿鑾峰彇鎬у埆 + * + * @param idCard 韬唤缂栧彿 + * @return 鎬у埆(M-鐢凤紝F-濂筹紝N-鏈煡) + */ + public static String getGenderByIdCard(String idCard) { + String sGender = "N"; + if (idCard.length() == CHINA_ID_MIN_LENGTH) { + idCard = conver15CardTo18(idCard); + } + String sCardNum = idCard.substring(16, 17); + if (Integer.parseInt(sCardNum) % 2 != 0) { + sGender = "M"; + } else { + sGender = "F"; + } + return sGender; + } + + /** + * 鏍规嵁韬唤缂栧彿鑾峰彇鎴风睄鐪佷唤 + * + * @param idCard 韬唤缂栫爜 + * @return 鐪佺骇缂栫爜銆 + */ + public static String getProvinceByIdCard(String idCard) { + int len = idCard.length(); + String sProvince = null; + String sProvinNum = ""; + if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) { + sProvinNum = idCard.substring(0, 2); + } + sProvince = cityCodes.get(sProvinNum); + return sProvince; + } + + /** + * 鏁板瓧楠岃瘉 + * + * @param val + * @return 鎻愬彇鐨勬暟瀛椼 + */ + public static boolean isNum(String val) { + return val == null || "".equals(val) ? false : val.matches("^[0-9]*$"); + } + + /** + * 楠岃瘉灏忎簬褰撳墠鏃ユ湡 鏄惁鏈夋晥 + * + * @param iYear + * 寰呴獙璇佹棩鏈(骞) + * @param iMonth + * 寰呴獙璇佹棩鏈(鏈 1-12) + * @param iDate + * 寰呴獙璇佹棩鏈(鏃) + * @return 鏄惁鏈夋晥 + */ + public static boolean valiDate(int iYear, int iMonth, int iDate) { + Calendar cal = Calendar.getInstance(); + int year = cal.get(Calendar.YEAR); + int datePerMonth; + if (iYear < MIN || iYear >= year) { + return false; + } + if (iMonth < 1 || iMonth > 12) { + return false; + } + switch (iMonth) { + case 4: + case 6: + case 9: + case 11: + datePerMonth = 30; + break; + case 2: + boolean dm = ((iYear % 4 == 0 && iYear % 100 != 0) || (iYear % 400 == 0)) + && (iYear > MIN && iYear < year); + datePerMonth = dm ? 29 : 28; + break; + default: + datePerMonth = 31; + } + return (iDate >= 1) && (iDate <= datePerMonth); + } +} diff --git a/src/main/java/org/jeecgframework/core/util/ImportUtil.java b/src/main/java/org/jeecgframework/core/util/ImportUtil.java new file mode 100644 index 00000000..ac960388 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/ImportUtil.java @@ -0,0 +1,25 @@ +package org.jeecgframework.core.util; + +/** + * + * @author 寮犱唬娴 + * + */ +public class ImportUtil { + /** + * 寰楀埌瀹炰綋绫 + * @param fullentity + * @return + */ + public static Class getEntityClass(String fullentity){ + Class entityClass = null; + try { + entityClass = (Class) Class.forName(fullentity); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return entityClass; + } + + +} diff --git a/src/main/java/org/jeecgframework/core/util/IpConfigMac.java b/src/main/java/org/jeecgframework/core/util/IpConfigMac.java new file mode 100644 index 00000000..11357ee4 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/IpConfigMac.java @@ -0,0 +1,34 @@ +package org.jeecgframework.core.util; +import java.net.*; + +/** + * 閫氳繃IP锛岃幏鍙栨満鍣ㄧ殑MAC鍦板潃 + * @author zhangdaihao + * + */ +public class IpConfigMac { + + public static void main(String[] arguments) throws Exception { + InetAddress ia = InetAddress.getLocalHost();// 鑾峰彇鏈湴IP瀵硅薄 + System.out.println(ia); + System.out.println("MAC ......... " + getMACAddress(ia)); + } + + // 鑾峰彇MAC鍦板潃鐨勬柟娉 + private static String getMACAddress(InetAddress ia) throws Exception { + // 鑾峰緱缃戠粶鎺ュ彛瀵硅薄锛堝嵆缃戝崱锛夛紝骞跺緱鍒癿ac鍦板潃锛宮ac鍦板潃瀛樺湪浜庝竴涓猙yte鏁扮粍涓 + byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress(); + // 涓嬮潰浠g爜鏄妸mac鍦板潃鎷艰鎴怱tring + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < mac.length; i++) { + if (i != 0) { + sb.append("-"); + } + // mac[i] & 0xFF 鏄负浜嗘妸byte杞寲涓烘鏁存暟 + String s = Integer.toHexString(mac[i] & 0xFF); + sb.append(s.length() == 1 ? 0 + s : s); + } + // 鎶婂瓧绗︿覆鎵鏈夊皬鍐欏瓧姣嶆敼涓哄ぇ鍐欐垚涓烘瑙勭殑mac鍦板潃骞惰繑鍥 + return sb.toString().toUpperCase(); + } +} diff --git a/src/main/java/org/jeecgframework/core/util/IpUtil.java b/src/main/java/org/jeecgframework/core/util/IpUtil.java new file mode 100644 index 00000000..a613db60 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/IpUtil.java @@ -0,0 +1,29 @@ +package org.jeecgframework.core.util; + +import javax.servlet.http.HttpServletRequest; + +public class IpUtil { + /** + * 鑾峰彇鐧诲綍鐢ㄦ埛IP鍦板潃 + * + * @param request + * @return + */ + public static String getIpAddr(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + if (ip.equals("0:0:0:0:0:0:0:1")) { + ip = "鏈湴"; + } + return ip; + } + +} diff --git a/src/main/java/org/jeecgframework/core/util/JSONHelper.java b/src/main/java/org/jeecgframework/core/util/JSONHelper.java new file mode 100644 index 00000000..5d5545a1 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/JSONHelper.java @@ -0,0 +1,490 @@ +package org.jeecgframework.core.util; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.beanutils.BeanUtils; +import org.codehaus.jackson.JsonParseException; +import org.codehaus.jackson.map.JsonMappingException; +import org.codehaus.jackson.map.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +/** + * JSON鍜孞AVA鐨凱OJO鐨勭浉浜掕浆鎹 + * @author 寮犱唬娴 + * JSONHelper.java + */ +public final class JSONHelper { + private static final Logger logger = LoggerFactory.getLogger(JSONHelper.class); + + // 灏嗘暟缁勮浆鎹㈡垚JSON + public static String array2json(Object object) { + JSONArray jsonArray = JSONArray.fromObject(object); + return jsonArray.toString(); + } + + // 灏咼SON杞崲鎴愭暟缁,鍏朵腑valueClz涓烘暟缁勪腑瀛樻斁鐨勫璞$殑Class + public static Object json2Array(String json, Class valueClz) { + JSONArray jsonArray = JSONArray.fromObject(json); + return JSONArray.toArray(jsonArray, valueClz); + } + + // 灏咰ollection杞崲鎴怞SON + public static String collection2json(Object object) { + JSONArray jsonArray = JSONArray.fromObject(object); + return jsonArray.toString(); + } + + // 灏哅ap杞崲鎴怞SON + public static String map2json(Object object) { + JSONObject jsonObject = JSONObject.fromObject(object); + return jsonObject.toString(); + } + + // 灏咼SON杞崲鎴怣ap,鍏朵腑valueClz涓篗ap涓璿alue鐨凜lass,keyArray涓篗ap鐨刱ey + public static Map json2Map(Object[] keyArray, String json, Class valueClz) { + JSONObject jsonObject = JSONObject.fromObject(json); + Map classMap = new HashMap(); + + for (int i = 0; i < keyArray.length; i++) { + classMap.put(keyArray[i], valueClz); + } + + return (Map) JSONObject.toBean(jsonObject, Map.class, classMap); + } + + // 灏哖OJO杞崲鎴怞SON + public static String bean2json(Object object) { + JSONObject jsonObject = JSONObject.fromObject(object); + return jsonObject.toString(); + } + + // 灏咼SON杞崲鎴怭OJO,鍏朵腑beanClz涓篜OJO鐨凜lass + public static Object json2Object(String json, Class beanClz) { + return JSONObject.toBean(JSONObject.fromObject(json), beanClz); + } + + /** + * json杞崲涓簀ava瀵硅薄 + * + *
    +	 * return JackJson.fromJsonToObject(this.answersJson, JackJson.class);
    +	 * 
    + * + * @param + * 瑕佽浆鎹㈢殑瀵硅薄 + * @param json + * 瀛楃涓 + * @param valueType + * 瀵硅薄鐨刢lass + * @return 杩斿洖瀵硅薄 + */ + public static T fromJsonToObject(String json, Class valueType) { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.readValue(json, valueType); + } catch (JsonParseException e) { + logger.error("JsonParseException: ", e); + } catch (JsonMappingException e) { + logger.error("JsonMappingException: ", e); + } catch (IOException e) { + logger.error("IOException: ", e); + } + return null; + } + + // 灏哠tring杞崲鎴怞SON + public static String string2json(String key, String value) { + JSONObject object = new JSONObject(); + object.put(key, value); + return object.toString(); + } + + // 灏咼SON杞崲鎴怱tring + public static String json2String(String json, String key) { + JSONObject jsonObject = JSONObject.fromObject(json); + return jsonObject.get(key).toString(); + } + + /*** + * 灏哃ist瀵硅薄搴忓垪鍖栦负JSON鏂囨湰 + */ + public static String toJSONString(List list) { + JSONArray jsonArray = JSONArray.fromObject(list); + + return jsonArray.toString(); + } + + /*** + * 灏嗗璞″簭鍒楀寲涓篔SON鏂囨湰 + * + * @param object + * @return + */ + public static String toJSONString(Object object) { + JSONArray jsonArray = JSONArray.fromObject(object); + + return jsonArray.toString(); + } + + /*** + * 灏咼SON瀵硅薄鏁扮粍搴忓垪鍖栦负JSON鏂囨湰 + * + * @param jsonArray + * @return + */ + public static String toJSONString(JSONArray jsonArray) { + return jsonArray.toString(); + } + + /*** + * 灏咼SON瀵硅薄搴忓垪鍖栦负JSON鏂囨湰 + * + * @param jsonObject + * @return + */ + public static String toJSONString(JSONObject jsonObject) { + return jsonObject.toString(); + } + + /*** + * 灏嗗璞¤浆鎹负List瀵硅薄 + * + * @param object + * @return + */ + public static List toArrayList(Object object) { + List arrayList = new ArrayList(); + + JSONArray jsonArray = JSONArray.fromObject(object); + + Iterator it = jsonArray.iterator(); + while (it.hasNext()) { + JSONObject jsonObject = (JSONObject) it.next(); + + Iterator keys = jsonObject.keys(); + while (keys.hasNext()) { + Object key = keys.next(); + Object value = jsonObject.get(key); + arrayList.add(value); + } + } + + return arrayList; + } + + /* *//*** + * 灏嗗璞¤浆鎹负Collection瀵硅薄 + * + * @param object + * @return + */ + /* + * public static Collection toCollection(Object object) { JSONArray + * jsonArray = JSONArray.fromObject(object); + * + * return JSONArray.toCollection(jsonArray); } + */ + + /*** + * 灏嗗璞¤浆鎹负JSON瀵硅薄鏁扮粍 + * + * @param object + * @return + */ + public static JSONArray toJSONArray(Object object) { + return JSONArray.fromObject(object); + } + + /*** + * 灏嗗璞¤浆鎹负JSON瀵硅薄 + * + * @param object + * @return + */ + public static JSONObject toJSONObject(Object object) { + return JSONObject.fromObject(object); + } + + /*** + * 灏嗗璞¤浆鎹负HashMap + * + * @param object + * @return + */ + public static HashMap toHashMap(Object object) { + HashMap data = new HashMap(); + JSONObject jsonObject = JSONHelper.toJSONObject(object); + Iterator it = jsonObject.keys(); + while (it.hasNext()) { + String key = String.valueOf(it.next()); + Object value = jsonObject.get(key); + data.put(key, value); + } + + return data; + } + + /*** + * 灏嗗璞¤浆鎹负List> + * + * @param object + * @return + */ + // 杩斿洖闈炲疄浣撶被鍨(Map)鐨凩ist + public static List> toList(Object object) { + List> list = new ArrayList>(); + JSONArray jsonArray = JSONArray.fromObject(object); + for (Object obj : jsonArray) { + JSONObject jsonObject = (JSONObject) obj; + Map map = new HashMap(); + Iterator it = jsonObject.keys(); + while (it.hasNext()) { + String key = (String) it.next(); + Object value = jsonObject.get(key); + map.put((String) key, value); + } + list.add(map); + } + return list; + } + + /*** + * 灏咼SON瀵硅薄鏁扮粍杞崲涓轰紶鍏ョ被鍨嬬殑List + * + * @param + * @param jsonArray + * @param objectClass + * @return + */ + public static List toList(JSONArray jsonArray, Class objectClass) { + return JSONArray.toList(jsonArray, objectClass); + } + + /*** + * 灏嗗璞¤浆鎹负浼犲叆绫诲瀷鐨凩ist + * + * @param + * @param jsonArray + * @param objectClass + * @return + */ + public static List toList(Object object, Class objectClass) { + JSONArray jsonArray = JSONArray.fromObject(object); + + return JSONArray.toList(jsonArray, objectClass); + } + + /*** + * 灏咼SON瀵硅薄杞崲涓轰紶鍏ョ被鍨嬬殑瀵硅薄 + * + * @param + * @param jsonObject + * @param beanClass + * @return + */ + public static T toBean(JSONObject jsonObject, Class beanClass) { + return (T) JSONObject.toBean(jsonObject, beanClass); + } + + /*** + * 灏嗗皢瀵硅薄杞崲涓轰紶鍏ョ被鍨嬬殑瀵硅薄 + * + * @param + * @param object + * @param beanClass + * @return + */ + public static T toBean(Object object, Class beanClass) { + JSONObject jsonObject = JSONObject.fromObject(object); + + return (T) JSONObject.toBean(jsonObject, beanClass); + } + + /*** + * 灏咼SON鏂囨湰鍙嶅簭鍒楀寲涓轰富浠庡叧绯荤殑瀹炰綋 + * + * @param + * 娉涘瀷T 浠h〃涓诲疄浣撶被鍨 + * @param + * 娉涘瀷D 浠h〃浠庡疄浣撶被鍨 + * @param jsonString + * JSON鏂囨湰 + * @param mainClass + * 涓诲疄浣撶被鍨 + * @param detailName + * 浠庡疄浣撶被鍦ㄤ富瀹炰綋绫讳腑鐨勫睘鎬у悕绉 + * @param detailClass + * 浠庡疄浣撶被鍨 + * @return + */ + public static T toBean(String jsonString, Class mainClass, + String detailName, Class detailClass) { + JSONObject jsonObject = JSONObject.fromObject(jsonString); + JSONArray jsonArray = (JSONArray) jsonObject.get(detailName); + + T mainEntity = JSONHelper.toBean(jsonObject, mainClass); + List detailList = JSONHelper.toList(jsonArray, detailClass); + + try { + BeanUtils.setProperty(mainEntity, detailName, detailList); + } catch (Exception ex) { + throw new RuntimeException("涓讳粠鍏崇郴JSON鍙嶅簭鍒楀寲瀹炰綋澶辫触锛"); + } + + return mainEntity; + } + + /*** + * 灏咼SON鏂囨湰鍙嶅簭鍒楀寲涓轰富浠庡叧绯荤殑瀹炰綋 + * + * @param 娉涘瀷T 浠h〃涓诲疄浣撶被鍨 + * @param 娉涘瀷D1 浠h〃浠庡疄浣撶被鍨 + * @param 娉涘瀷D2 浠h〃浠庡疄浣撶被鍨 + * @param jsonString + * JSON鏂囨湰 + * @param mainClass + * 涓诲疄浣撶被鍨 + * @param detailName1 + * 浠庡疄浣撶被鍦ㄤ富瀹炰綋绫讳腑鐨勫睘鎬 + * @param detailClass1 + * 浠庡疄浣撶被鍨 + * @param detailName2 + * 浠庡疄浣撶被鍦ㄤ富瀹炰綋绫讳腑鐨勫睘鎬 + * @param detailClass2 + * 浠庡疄浣撶被鍨 + * @return + */ + public static T toBean(String jsonString, Class mainClass, + String detailName1, Class detailClass1, String detailName2, + Class detailClass2) { + JSONObject jsonObject = JSONObject.fromObject(jsonString); + JSONArray jsonArray1 = (JSONArray) jsonObject.get(detailName1); + JSONArray jsonArray2 = (JSONArray) jsonObject.get(detailName2); + + T mainEntity = JSONHelper.toBean(jsonObject, mainClass); + List detailList1 = JSONHelper.toList(jsonArray1, detailClass1); + List detailList2 = JSONHelper.toList(jsonArray2, detailClass2); + + try { + BeanUtils.setProperty(mainEntity, detailName1, detailList1); + BeanUtils.setProperty(mainEntity, detailName2, detailList2); + } catch (Exception ex) { + throw new RuntimeException("涓讳粠鍏崇郴JSON鍙嶅簭鍒楀寲瀹炰綋澶辫触锛"); + } + + return mainEntity; + } + + /*** + * 灏咼SON鏂囨湰鍙嶅簭鍒楀寲涓轰富浠庡叧绯荤殑瀹炰綋 + * + * @param 娉涘瀷T 浠h〃涓诲疄浣撶被鍨 + * @param 娉涘瀷D1 浠h〃浠庡疄浣撶被鍨 + * @param 娉涘瀷D2 浠h〃浠庡疄浣撶被鍨 + * @param jsonString + * JSON鏂囨湰 + * @param mainClass + * 涓诲疄浣撶被鍨 + * @param detailName1 + * 浠庡疄浣撶被鍦ㄤ富瀹炰綋绫讳腑鐨勫睘鎬 + * @param detailClass1 + * 浠庡疄浣撶被鍨 + * @param detailName2 + * 浠庡疄浣撶被鍦ㄤ富瀹炰綋绫讳腑鐨勫睘鎬 + * @param detailClass2 + * 浠庡疄浣撶被鍨 + * @param detailName3 + * 浠庡疄浣撶被鍦ㄤ富瀹炰綋绫讳腑鐨勫睘鎬 + * @param detailClass3 + * 浠庡疄浣撶被鍨 + * @return + */ + public static T toBean(String jsonString, + Class mainClass, String detailName1, Class detailClass1, + String detailName2, Class detailClass2, String detailName3, + Class detailClass3) { + JSONObject jsonObject = JSONObject.fromObject(jsonString); + JSONArray jsonArray1 = (JSONArray) jsonObject.get(detailName1); + JSONArray jsonArray2 = (JSONArray) jsonObject.get(detailName2); + JSONArray jsonArray3 = (JSONArray) jsonObject.get(detailName3); + + T mainEntity = JSONHelper.toBean(jsonObject, mainClass); + List detailList1 = JSONHelper.toList(jsonArray1, detailClass1); + List detailList2 = JSONHelper.toList(jsonArray2, detailClass2); + List detailList3 = JSONHelper.toList(jsonArray3, detailClass3); + + try { + BeanUtils.setProperty(mainEntity, detailName1, detailList1); + BeanUtils.setProperty(mainEntity, detailName2, detailList2); + BeanUtils.setProperty(mainEntity, detailName3, detailList3); + } catch (Exception ex) { + throw new RuntimeException("涓讳粠鍏崇郴JSON鍙嶅簭鍒楀寲瀹炰綋澶辫触锛"); + } + + return mainEntity; + } + + /*** + * 灏咼SON鏂囨湰鍙嶅簭鍒楀寲涓轰富浠庡叧绯荤殑瀹炰綋 + * + * @param + * 涓诲疄浣撶被鍨 + * @param jsonString + * JSON鏂囨湰 + * @param mainClass + * 涓诲疄浣撶被鍨 + * @param detailClass + * 瀛樻斁浜嗗涓粠瀹炰綋鍦ㄤ富瀹炰綋涓睘鎬у悕绉板拰绫诲瀷 + * @return + */ + public static T toBean(String jsonString, Class mainClass, + HashMap detailClass) { + JSONObject jsonObject = JSONObject.fromObject(jsonString); + T mainEntity = JSONHelper.toBean(jsonObject, mainClass); + for (Object key : detailClass.keySet()) { + try { + Class value = (Class) detailClass.get(key); + BeanUtils.setProperty(mainEntity, key.toString(), value); + } catch (Exception ex) { + throw new RuntimeException("涓讳粠鍏崇郴JSON鍙嶅簭鍒楀寲瀹炰綋澶辫触锛"); + } + } + return mainEntity; + } + + public static String listtojson(String[] fields, int total, List list) throws Exception { + Object[] values = new Object[fields.length]; + String jsonTemp = "{\"total\":" + total + ",\"rows\":["; + for (int j = 0; j < list.size(); j++) { + jsonTemp = jsonTemp + "{\"state\":\"closed\","; + for (int i = 0; i < fields.length; i++) { + String fieldName = fields[i].toString(); + values[i] = org.jeecgframework.tag.core.easyui.TagUtil.fieldNametoValues(fieldName, list.get(j)); + jsonTemp = jsonTemp + "\"" + fieldName + "\"" + ":\"" + values[i] + "\""; + if (i != fields.length - 1) { + jsonTemp = jsonTemp + ","; + } + } + if (j != list.size() - 1) { + jsonTemp = jsonTemp + "},"; + } else { + jsonTemp = jsonTemp + "}"; + } + } + jsonTemp = jsonTemp + "]}"; + return jsonTemp; + } + +} diff --git a/src/main/java/org/jeecgframework/core/util/JeecgDataAutorUtils.java b/src/main/java/org/jeecgframework/core/util/JeecgDataAutorUtils.java new file mode 100644 index 00000000..c32210f9 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/JeecgDataAutorUtils.java @@ -0,0 +1,80 @@ +package org.jeecgframework.core.util; + +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.web.system.pojo.base.TSDataRule; +import org.springframework.util.StringUtils; + +/** + * @ClassName: JeecgDataAutorUtils + * @Description: 鏁版嵁鏉冮檺鏌ヨ瑙勫垯瀹瑰櫒宸ュ叿绫 + * @author 寮犱唬娴 + * @date 2012-12-15 涓嬪崍11:27:39 + * + */ +public class JeecgDataAutorUtils { + + /** + * 寰閾炬帴璇锋眰閲岄潰锛屼紶鍏ユ暟鎹煡璇㈡潯浠 + * + * @param request + * @param MENU_DATA_AUTHOR_RULES + */ + public static synchronized void installDataSearchConditon( + HttpServletRequest request, List MENU_DATA_AUTHOR_RULES) { + @SuppressWarnings("unchecked") + List list = (List)loadDataSearchConditonSQL();// 1.鍏堜粠request鑾峰彇MENU_DATA_AUTHOR_RULES锛屽鏋滃瓨鍒欒幏鍙栧埌LIST + if (list==null) { // 2.濡傛灉涓嶅瓨鍦紝鍒檔ew涓涓猯ist + list = new ArrayList(); + } + for (TSDataRule tsDataRule : MENU_DATA_AUTHOR_RULES) { + list.add(tsDataRule); + } + request.setAttribute(Globals.MENU_DATA_AUTHOR_RULES, list); // 3.寰list閲岄潰澧為噺瀛樻寚 + } + + /** + * 鑾峰彇鏌ヨ鏉′欢鏂规硶 + * + * @param request + * @return + */ + @SuppressWarnings("unchecked") + public static synchronized List loadDataSearchConditonSQL() { + return (List) ContextHolderUtils.getRequest().getAttribute( + Globals.MENU_DATA_AUTHOR_RULES); + } + + /** + * 鑾峰彇鏌ヨ鏉′欢鏂规硶 + * + * @param request + * @return + */ + public static synchronized String loadDataSearchConditonSQLString() { + return (String) ContextHolderUtils.getRequest().getAttribute( + Globals.MENU_DATA_AUTHOR_RULE_SQL); + } + + /** + * 寰閾炬帴璇锋眰閲岄潰锛屼紶鍏ユ暟鎹煡璇㈡潯浠 + * + * @param request + * @param MENU_DATA_AUTHOR_RULE_SQL + */ + public static synchronized void installDataSearchConditon( + HttpServletRequest request, String MENU_DATA_AUTHOR_RULE_SQL) { + // 1.鍏堜粠request鑾峰彇MENU_DATA_AUTHOR_RULE_SQL锛屽鏋滃瓨鍒欒幏鍙栧埌sql涓 + String ruleSql = (String)loadDataSearchConditonSQLString(); + if (!StringUtils.hasText(ruleSql)) { + ruleSql += MENU_DATA_AUTHOR_RULE_SQL; // 2.濡傛灉涓嶅瓨鍦紝鍒檔ew涓涓猻ql涓 + } + request.setAttribute(Globals.MENU_DATA_AUTHOR_RULE_SQL, + MENU_DATA_AUTHOR_RULE_SQL);// 3.寰sql涓查噷闈㈠閲忔嫾鏂扮殑鏉′欢 + + } +} diff --git a/src/main/java/org/jeecgframework/core/util/JeecgSqlUtil.java b/src/main/java/org/jeecgframework/core/util/JeecgSqlUtil.java new file mode 100644 index 00000000..e2b5ba22 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/JeecgSqlUtil.java @@ -0,0 +1,321 @@ +package org.jeecgframework.core.util; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Serializable; +import java.util.ResourceBundle; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.CacheManager; +import net.sf.ehcache.Element; + +import org.jeecgframework.core.def.ConstantsDefs; + +/** + * + * @author 寮犱唬娴 + * + */ +public class JeecgSqlUtil { + + /** + * SQL鏂囦欢璺緞鑾峰彇鍙傛暟 + */ + private static final String KEY_01 = "service"; + private static final String KEY_02 = "impl"; + private static final String KEY_03 = "Impl."; + private static final String PACKAGE_SQL = "sql"; + private static final String SUFFIX_SQL = ".sql"; + private static final String SUFFIX_D = "."; + private static final String SUFFIX_X = "/"; + + + private static final ResourceBundle bundle = java.util.ResourceBundle.getBundle("sysConfig"); + private static Cache dictCache; + static{ + if (dictCache == null) { + dictCache = CacheManager.getInstance().getCache("dictCache"); + } + } + /** + * 浠庢枃浠朵腑璇诲彇鏂囨湰鍐呭, 璇诲彇鏃朵娇鐢ㄥ钩鍙伴粯璁ょ紪鐮佽В鐮佹枃浠朵腑鐨勫瓧鑺傚簭鍒 + * @param file 鐩爣鏂囦欢 + * @return + * @throws IOException + */ + private static String loadStringFromFile(File file) throws IOException { + return loadStringFromFile(file, "UTF-8"); + } + + /** + * 浠庢枃浠朵腑璇诲彇鏂囨湰鍐呭 + * @param file 鐩爣鏂囦欢 + * @param encoding 鐩爣鏂囦欢鐨勬枃鏈紪鐮佹牸寮 + * @return + * @throws IOException + */ + private static String loadStringFromFile(File file, String encoding) + throws IOException { + BufferedReader reader = null; + try { + reader = new BufferedReader(new InputStreamReader( + new FileInputStream(file), encoding)); + StringBuilder builder = new StringBuilder(); + char[] chars = new char[4096]; + + int length = 0; + + while (0 < (length = reader.read(chars))) { + + builder.append(chars, 0, length); + + } + + return builder.toString(); + + } finally { + + try { + + if (reader != null) + reader.close(); + + } catch (IOException e) { + + throw new RuntimeException(e); + + } + + } + + } + + /** + * 璇诲彇SQL鍐呭 + * @param args + * @throws IOException + */ + + private static String getFlieTxt(String fileUrl) { + org.jeecgframework.core.util.LogUtil.info("---------------------------------------sql 璺緞 :"+fileUrl); + String sql = null; + try { + sql = loadStringFromFile(new File(fileUrl)); + } catch (IOException e) { + e.printStackTrace(); + } + return sql; + } + + + public static String getMethodSql(String methodUrl) { + + //[1].寮鍙戞ā寮忥細dev SQL鏂囦欢姣忔閮藉姞杞 + if(ConstantsDefs.MODE_DEVELOP.equals(bundle.getObject("sqlReadMode"))){ + return getMethodSqlLogicJar(methodUrl); + } + //[2].鍙戝竷妯″紡锛歱ub SQL鏂囦欢鍙姞杞戒竴娆 + else if(ConstantsDefs.MODE_PUBLISH.equals(bundle.getObject("sqlReadMode"))){ + Element element = dictCache.get(methodUrl); + if (element == null) { + element = new Element(methodUrl, (Serializable) getMethodSqlLogicJar(methodUrl)); + //姘镐箙缂撳瓨 + dictCache.put(element); + } + return element.getValue().toString(); + } + else{ + return ""; + } + } + + /** + * 鏂拌幏鍙朣QL璺緞鏂规硶,骞惰鍙栨枃浠惰幏鍙朣QL鍐呭 + * @param methodUrl + * @return + */ + public static String getMethodSqlLogic(String methodUrl){ + String head = methodUrl.substring(0, methodUrl.indexOf(KEY_01)); + String end = methodUrl.substring(methodUrl.indexOf(KEY_02)+KEY_02.length()).replace(KEY_03, "_"); + String sqlurl = head +PACKAGE_SQL+end; + sqlurl = sqlurl.replace(SUFFIX_D, SUFFIX_X); + sqlurl =sqlurl +SUFFIX_SQL; + + String projectPath = getAppPath(JeecgSqlUtil.class); + sqlurl = projectPath + SUFFIX_X+sqlurl; + org.jeecgframework.core.util.LogUtil.info(sqlurl); + return getFlieTxt(sqlurl); + } + /** + * 鏂拌幏鍙朣QL璺緞鏂规硶,骞惰鍙栨枃浠惰幏鍙朣QL鍐呭 + * 鎵╁睍鍙互璇诲彇jar涓璼ql + * @param methodUrl + * @return + */ + public static String getMethodSqlLogicJar(String methodUrl){ + StringBuffer sb = new StringBuffer(); + String head = methodUrl.substring(0, methodUrl.indexOf(KEY_01)); + String end = methodUrl.substring(methodUrl.indexOf(KEY_02)+KEY_02.length()).replace(KEY_03, "_"); + String sqlurl = head +PACKAGE_SQL+end; + sqlurl = sqlurl.replace(SUFFIX_D, SUFFIX_X); + sqlurl = SUFFIX_X+sqlurl +SUFFIX_SQL; + +// 杩斿洖璇诲彇鎸囧畾璧勬簮鐨勮緭鍏ユ祦 + InputStream is = JeecgSqlUtil.class.getResourceAsStream(sqlurl); + BufferedReader br=new BufferedReader(new InputStreamReader(is)); + String s=""; + try { + while((s=br.readLine())!=null) + sb.append(s+" "); + } catch (IOException e) { + e.printStackTrace(); + } + return sb.toString(); + } + + + /** + * 鏃ц幏鍙朣QL璺緞鏂规硶 + * @param methodUrl + * @return + */ + @Deprecated + public static String getMethodSqlLogicOld(String methodUrl) { + //浠嶴pring涓幏鍙朢equest +// HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); +// String projectPath = ServletActionContext.getServletContext().getRealPath("/"); +// org.jeecgframework.core.util.LogUtil.info(projectPath); +// String projectPath = request.getSession().getServletContext().getRealPath("/"); + methodUrl = methodUrl.substring(17).replace("Impl", "").replace(".", "/"); + String[] str = methodUrl.split("/"); + StringBuffer sb = new StringBuffer(); + int num = 2; + int length = str.length; + for(String s:str){ + + if(num -1) + realPath = realPath.substring(pos + 5); + // 鍘绘帀璺緞淇℃伅鏈鍚庡寘鍚被鏂囦欢淇℃伅鐨勯儴鍒嗭紝寰楀埌绫绘墍鍦ㄧ殑璺緞 + pos = realPath.indexOf(path + clsName); + realPath = realPath.substring(0, pos - 1); + // 濡傛灉绫绘枃浠惰鎵撳寘鍒癑AR绛夋枃浠朵腑鏃讹紝鍘绘帀瀵瑰簲鐨凧AR绛夋墦鍖呮枃浠跺悕 + if (realPath.endsWith("!")) + realPath = realPath.substring(0, realPath.lastIndexOf("/")); + /*------------------------------------------------------------ + ClassLoader鐨刧etResource鏂规硶浣跨敤浜唘tf-8瀵硅矾寰勪俊鎭繘琛屼簡缂栫爜锛屽綋璺緞 + 涓瓨鍦ㄤ腑鏂囧拰绌烘牸鏃讹紝浠栦細瀵硅繖浜涘瓧绗﹁繘琛岃浆鎹紝杩欐牱锛屽緱鍒扮殑寰寰涓嶆槸鎴戜滑鎯宠 + 鐨勭湡瀹炶矾寰勶紝鍦ㄦ锛岃皟鐢ㄤ簡URLDecoder鐨刣ecode鏂规硶杩涜瑙g爜锛屼互渚垮緱鍒板師濮嬬殑 + 涓枃鍙婄┖鏍艰矾寰 + -------------------------------------------------------------*/ + try { + realPath = java.net.URLDecoder.decode(realPath, "utf-8"); + } catch (Exception e) { + throw new RuntimeException(e); + } + org.jeecgframework.core.util.LogUtil.info("realPath----->"+realPath); + return realPath; + } + + + + /** + * 杩斿洖褰撳墠鎵ц鐨勬柟娉曡矾寰 + * @return + */ + public static String getMethodUrl() { + StringBuffer sb = new StringBuffer(); + StackTraceElement[] stacks = new Throwable().getStackTrace(); + sb.append(stacks[1].getClassName()).append(".").append( + stacks[1].getMethodName()); + return sb.toString(); + } + + + public static void main(String[] args) { + //org.jeecgframework.core.util.LogUtil.info(getAppPath(JeecgSqlUtil.class)); + org.jeecgframework.core.util.LogUtil.info(getCountSqlBySql("SELECT * from JEECG_DICT_PARAM WHERE 1=1")); + } + + /** + * 鏍规嵁褰撳墠SQL锛屾嫾瑁呭嚭鏌ヨ鎬绘暟鐨凷QL + * + * @param sql 褰撳墠SQL璇彞 + * @return + */ + public static String getCountSqlBySql(String sql) { + String countSql = "SELECT COUNT(*) "; + + String upperSql = sql.toUpperCase(); + int fromIndex = upperSql.indexOf("FROM"); + int whereIndex = upperSql.indexOf("WHERE"); + + if (whereIndex>-1) { + countSql=countSql + sql.substring(fromIndex, whereIndex); + }else { + countSql=countSql + sql.substring(fromIndex); + } + return countSql; + + } + +} diff --git a/src/main/java/org/jeecgframework/core/util/LdapUtil.java b/src/main/java/org/jeecgframework/core/util/LdapUtil.java new file mode 100644 index 00000000..65351795 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/LdapUtil.java @@ -0,0 +1,431 @@ +package org.jeecgframework.core.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Hashtable; +import javax.naming.Context; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; +import javax.naming.directory.BasicAttribute; +import javax.naming.directory.BasicAttributes; +import javax.naming.directory.DirContext; +import javax.naming.directory.InitialDirContext; +import javax.naming.directory.ModificationItem; +import javax.naming.directory.SearchControls; +import javax.naming.directory.SearchResult; + +import jodd.io.FileUtil; + +public class LdapUtil { + + private static File errorFile = new File("d:\\error.txt"); + + private static final String DOMAIN_NAME = "EXAMPLE"; + private static final String DOMAIN_SUFFIX = "COM"; + + // 璇锋敞鎰忚繖閲屽苟涓嶈兘鐩存帴鐢‥XAMPLE.COM褰撲綔LDAP SERVER鏉ュ彇浠DAP_SERVER_IP + private static final String LDAP_SERVER_IP = "10.10.0.5"; + private static final String LDAP_PORTAL = "389"; + + private static final String ROOT = "DC=" + DOMAIN_NAME + ",DC=" + DOMAIN_SUFFIX; // LDAP鐨勬牴鑺傜偣鐨凞C + private static final String LDAP_URL = "ldap://" + LDAP_SERVER_IP + ":" + LDAP_PORTAL + "/"; + + /** + * 鍩熻处鍙风櫥闄嗛獙璇 + * + * @param userName + * @param password + * @return boolean + * @throws Exception + */ + public static boolean ldapAuth(final String userName, final String password) + throws Exception { + boolean isPass = false; + String ldapUserName = DOMAIN_NAME + "\\" + userName; + + Hashtable environment = new Hashtable(); + environment.put(Context.INITIAL_CONTEXT_FACTORY, + "com.sun.jndi.ldap.LdapCtxFactory"); + environment.put(Context.PROVIDER_URL, LDAP_URL); + environment.put(Context.REFERRAL, "follow"); + environment.put(Context.SECURITY_PRINCIPAL, ldapUserName); + environment.put(Context.SECURITY_CREDENTIALS, password); + DirContext dirContext = null; + try { + dirContext = new InitialDirContext(environment); + isPass = true; + } catch (NamingException e) { + e.printStackTrace(); + } finally { + if (null != dirContext) { + dirContext.close(); + } + } + return isPass; + } + + /** + * 鍩熻处鍙风櫥闄嗛獙璇 + * + * @param userName + * @param password + * @return DirContext + * @throws Exception + */ + public static DirContext getDirContext(final String userName, final String password) throws Exception { + DirContext dc = null; + String ldapUserName = DOMAIN_NAME + "\\" + userName; + + Hashtable environment = new Hashtable(); + environment.put(Context.INITIAL_CONTEXT_FACTORY, + "com.sun.jndi.ldap.LdapCtxFactory"); + environment.put(Context.PROVIDER_URL, LDAP_URL); + environment.put(Context.REFERRAL, "follow"); + environment.put(Context.SECURITY_PRINCIPAL, ldapUserName); + environment.put(Context.SECURITY_CREDENTIALS, password); + try { + dc = new InitialDirContext(environment); + } catch (NamingException e) { + e.printStackTrace(); + } + return dc; + } + + /** + * @param base + * 锛氭牴鑺傜偣(鍦ㄨ繖閲屾槸"dc=example,dc=com") + * @param scope + * 锛氭悳绱㈣寖鍥,鍒嗕负"base"(鏈妭鐐),"one"(鍗曞眰),""(閬嶅巻) + * @param filter + * 锛氭寚瀹氬瓙鑺傜偣(鏍煎紡涓"(objectclass=*)",*鏄寚鍏ㄩ儴锛屼綘涔熷彲浠ユ寚瀹氭煇涓鐗瑰畾绫诲瀷鐨勬爲鑺傜偣) + */ + public static String getDN(String base, String scope, String filter, + DirContext dc) { + String dn = null; + SearchControls sc = new SearchControls(); + if (scope.equals("base")) { + sc.setSearchScope(SearchControls.OBJECT_SCOPE); + } else if (scope.equals("one")) { + sc.setSearchScope(SearchControls.ONELEVEL_SCOPE); + } else { + sc.setSearchScope(SearchControls.SUBTREE_SCOPE); + } + NamingEnumeration ne = null; + try { + ne = dc.search(base, filter, sc); + while (ne.hasMore()) { + System.out.println(); + SearchResult sr = (SearchResult) ne.next(); + String name = sr.getName(); + if (base != null && !base.equals("")) { + System.out.println("entry: " + name + "," + base); + } else { + System.out.println("entry: " + name); + } + dn = name + "," + base; + break; + } + } catch (Exception nex) { + System.err.println("Error: " + nex.getMessage()); + nex.printStackTrace(); + } + return dn; + } + + /** + * 娣诲姞 + */ + public static void add(String newUserName, DirContext dc) { + try { + BasicAttributes attrs = new BasicAttributes(); + BasicAttribute objclassSet = new BasicAttribute("objectClass"); + objclassSet.add("sAMAccountName"); + objclassSet.add("employeeID"); + attrs.put(objclassSet); + attrs.put("ou", newUserName); + dc.createSubcontext("ou=" + newUserName + "," + ROOT, attrs); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("Exception in add():" + e); + } + } + + /** + * 鍒犻櫎 + * + * @param dn + */ + public static void delete(String dn, DirContext dc) { + try { + dc.destroySubcontext(dn); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("Exception in delete():" + e); + } + } + + /** + * 閲嶅懡鍚嶈妭鐐 + * + * @param oldDN + * @param newDN + * @return + */ + public static boolean renameEntry(String oldDN, String newDN, DirContext dc) { + try { + dc.rename(oldDN, newDN); + return true; + } catch (NamingException ne) { + System.err.println("Error: " + ne.getMessage()); + return false; + } + } + + /** + * 淇敼 + * + * @return + * @throws IOException + */ + public static boolean modifyInformation(String dn, String employeeID, + DirContext dc, String[] employeeArray) throws IOException { + try { + String[] modifyAttr = { "telephoneNumber" }; + // employeeArray.length - 1鐨勭洰鐨勫幓闄ゅ憳宸ョ紪鍙 + ModificationItem[] modifyItems = new ModificationItem[employeeArray.length - 1]; + + for (int i = 0; i < modifyAttr.length; i++) { + String attrName = modifyAttr[i]; + Attribute attr = new BasicAttribute(attrName, + employeeArray[i + 1]); + modifyItems[i] = new ModificationItem( + DirContext.REPLACE_ATTRIBUTE, attr); + } + + /* 淇敼灞炴 */ + // Attribute attr0 = new BasicAttribute("telephoneNumber", + // telephoneNumber); + // modifyItems[0] = new + // ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr0); + + /* 鍒犻櫎灞炴 */ + // Attribute attr0 = new BasicAttribute("description","闄堣蕉"); + // modifyItems[0] = new + // ModificationItem(DirContext.REMOVE_ATTRIBUTE, attr0); + + /* 娣诲姞灞炴 */ + // Attribute attr0 = new BasicAttribute("employeeID", employeeID); + // modifyItems[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, + // attr0); + + /* 淇敼灞炴 */ + dc.modifyAttributes(dn, modifyItems); + return true; + } catch (NamingException e) { + e.printStackTrace(); + System.err.println("Error: " + e.getMessage()); + FileUtil.appendString(errorFile, "Error:" + e.getMessage() + "\n"); + return false; + } + } + + /** + * @param base + * 锛氭牴鑺傜偣(鍦ㄨ繖閲屾槸"dc=example,dc=com") + * @param scope + * 锛氭悳绱㈣寖鍥,鍒嗕负"base"(鏈妭鐐),"one"(鍗曞眰),""(閬嶅巻) + * @param filter + * 锛氭寚瀹氬瓙鑺傜偣(鏍煎紡涓"(objectclass=*)",*鏄寚鍏ㄩ儴锛屼綘涔熷彲浠ユ寚瀹氭煇涓鐗瑰畾绫诲瀷鐨勬爲鑺傜偣) + */ + public void searchInformation(String base, String scope, String filter, + DirContext dc) { + SearchControls sc = new SearchControls(); + if (scope.equals("base")) { + sc.setSearchScope(SearchControls.OBJECT_SCOPE); + } else if (scope.equals("one")) { + sc.setSearchScope(SearchControls.ONELEVEL_SCOPE); + } else { + sc.setSearchScope(SearchControls.SUBTREE_SCOPE); + } + NamingEnumeration ne = null; + try { + ne = dc.search(base, filter, sc); + // Use the NamingEnumeration object to cycle through + // the result set. + while (ne.hasMore()) { + System.out.println(); + SearchResult sr = (SearchResult) ne.next(); + String name = sr.getName(); + if (base != null && !base.equals("")) { + System.out.println("entry: " + name + "," + base); + } else { + System.out.println("entry: " + name); + } + + Attributes at = sr.getAttributes(); + NamingEnumeration ane = at.getAll(); + while (ane.hasMore()) { + Attribute attr = (Attribute) ane.next(); + String attrType = attr.getID(); + NamingEnumeration values = attr.getAll(); + // Another NamingEnumeration object, this time + // to iterate through attribute values. + while (values.hasMore()) { + Object oneVal = values.nextElement(); + if (oneVal instanceof String) { + System.out.println(attrType + ": " + + (String) oneVal); + } else { + System.out.println(attrType + ": " + + new String((byte[]) oneVal)); + } + } + } + } + } catch (Exception nex) { + System.err.println("Error: " + nex.getMessage()); + nex.printStackTrace(); + } + } + + /** + * 鏌ヨ骞跺畾鍒惰繑鍥炲睘鎬 + * + * @throws NamingException + */ + public void Ldapbyuserinfo(String userName, DirContext dc) { + // Create the search controls + SearchControls searchCtls = new SearchControls(); + // Specify the search scope + searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); + // specify the LDAP search filter + String searchFilter = "sAMAccountName=" + userName; + // Specify the Base for the search 鎼滅储鍩熻妭鐐 + String searchBase = ROOT; + + int totalResults = 0; + String returnedAtts[] = { "url", "whenChanged", "employeeID", "name", "userPrincipalName", "physicalDeliveryOfficeName", + "departmentNumber", "telephoneNumber", "homePhone", "mobile", "department", "sAMAccountName", "whenChanged", "mail" }; // 瀹氬埗杩斿洖灞炴 + + searchCtls.setReturningAttributes(returnedAtts); // 璁剧疆杩斿洖灞炴ч泦 + //searchCtls.setReturningAttributes(null); // 涓嶅畾鍒跺睘鎬э紝灏嗚繑鍥炴墍鏈夌殑灞炴ч泦 + + try { + NamingEnumeration answer = dc.search(searchBase, searchFilter, searchCtls); + if (answer == null || answer.equals(null)) { + System.out.println("answer is null"); + } else { + System.out.println("answer not null"); + } + while (answer.hasMoreElements()) { + SearchResult sr = (SearchResult) answer.next(); + System.out.println("************************************************"); + System.out.println("getname=" + sr.getName()); + Attributes Attrs = sr.getAttributes(); + if (Attrs != null) { + try { + + for (NamingEnumeration ne = Attrs.getAll(); ne + .hasMore();) { + Attribute Attr = (Attribute) ne.next(); + System.out.println("AttributeID=" + + Attr.getID().toString()); + // 璇诲彇灞炴у + for (NamingEnumeration e = Attr.getAll(); e + .hasMore(); totalResults++) { + String user = e.next().toString(); // 鎺ュ彈寰幆閬嶅巻璇诲彇鐨剈serPrincipalName鐢ㄦ埛灞炴 + System.out.println(user); + } + + // System.out.println(" ---------------"); + // 璇诲彇灞炴у + // Enumeration values = Attr.getAll(); + // if (values != null) { // 杩唬 + // while (values.hasMoreElements()) { + // System.out.println(" 2AttributeValues=" + // + values.nextElement()); + // } + // } + // System.out.println(" ---------------"); + } + } catch (NamingException e) { + System.err.println("Throw Exception : " + e); + } + } + } + System.out.println("Number: " + totalResults); + } catch (Exception e) { + e.printStackTrace(); + System.err.println("Throw Exception : " + e); + } + } + + /** + * 鍏抽棴LDAP杩炴帴 + */ + public static void close(DirContext dc) { + if (dc != null) { + try { + dc.close(); + } catch (NamingException e) { + System.out.println("NamingException in close():" + e); + } + } + } + + /** + * 涓诲嚱鏁扮敤浜庢祴璇 + * + * @param args + * @throws Exception + */ + public static void main(String[] args) throws Exception { + + // get AD Context + String adAdmin = "OP031793"; + String adAdminPassword = "xxxxx"; + + DirContext dc = getDirContext(adAdmin, adAdminPassword); + + if (dc == null) { + System.out.println("User or password incorrect!"); + return; + } + + /* + * 鍋囪address.txt涓瓨鍦ㄥ涓嬩俊鎭,涓涓槸鍛樺伐鍙,涓涓槸鎵嬫満鍙,褰撶劧涔熷彲浠ュ姞鍏朵粬鍐呭杩涙潵 + * OP036616,13111111111 + * OP018479,13122222222 + * OP017591,13233333333 + * OP032528,13244444444 + */ + + FileInputStream fileInputStream = StreamUtils + .getFileInputStream("d:\\address.txt"); + String strFile = StreamUtils.InputStreamTOString(fileInputStream); + String[] lineContextArray = strFile.split("\r\n"); + + for (int i = 0; i < lineContextArray.length; i++) { + if (lineContextArray[i] == null) + continue; + + String lineContext = lineContextArray[i]; + String[] employeeArray = lineContext.split(","); + + String employeeID = employeeArray[0]; + String dn = getDN(ROOT, "", "sAMAccountName=" + employeeID, dc); + + if (dn == null) { + FileUtil.appendString(errorFile, "Not find user:" + employeeID + + "\n"); + continue; + } + + modifyInformation(dn, employeeID, dc, employeeArray); + } + close(dc); + } +} diff --git a/src/main/java/org/jeecgframework/core/util/ListUtils.java b/src/main/java/org/jeecgframework/core/util/ListUtils.java new file mode 100644 index 00000000..c7dcf974 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/ListUtils.java @@ -0,0 +1,33 @@ +package org.jeecgframework.core.util; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.beanutils.BeanUtils; + +public class ListUtils { + + /** + * 鎸夋柊鐨凜lass瀵硅薄澶嶅埗 + * + * @param source list, example: list + * @param dest class, example: UserEntity.class; + */ + public static List copyTo(List source, Class destinationClass) + throws Exception { + if (source.size() == 0) + return new ArrayList(); + List res = new ArrayList(source.size()); + for (Object o : source) { + E e = destinationClass.newInstance(); + BeanUtils.copyProperties(e, o); + res.add(e); + } + return res; + } + + public static boolean isNullOrEmpty(List list) + { + return list == null || list.isEmpty(); + } +} diff --git a/src/main/java/org/jeecgframework/core/util/ListtoJson.java b/src/main/java/org/jeecgframework/core/util/ListtoJson.java new file mode 100644 index 00000000..3a2f07e5 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/ListtoJson.java @@ -0,0 +1,61 @@ +package org.jeecgframework.core.util; + +import java.util.List; + +import org.jeecgframework.web.system.pojo.base.TSFunction; + + +public class ListtoJson { + + public static String getJsonData(@SuppressWarnings("rawtypes") List list) { + + StringBuffer buffer = new StringBuffer(); + + buffer.append("["); + + iterGet(list, "0", buffer); + + buffer.append("]"); + + // 灏,\n]鏇挎崲鎴怽n] + + String tmp = buffer.toString(); + + tmp = tmp.replaceAll(",\n]", "\n]"); + + return tmp; + + } + + static int count = 0; + + /** + * + * 閫掑綊鐢熸垚json鏍煎紡鐨勬暟鎹畕id:1,text:'',children:[]} + * + * @param args + */ + + static void iterGet(List list, String pid, StringBuffer buffer) { + for (TSFunction node : list) { + + // 鏌ユ壘鎵鏈夌埗鑺傜偣涓簆id鐨勬墍鏈夊璞★紝鐒跺悗鎷兼帴涓簀son鏍煎紡鐨勬暟鎹 + if(node.getTSFunction()!=null) + { + if (pid.equals(oConvertUtils.getString(node.getTSFunction().getId()))) + { + count++; + buffer.append("{\'id\':" + node.getId() + ",\'text\':\'" + + node.getFunctionName() + "\',\'children\':["); + // 閫掑綊 + iterGet(list, node.getId(), buffer); + buffer.append("]},\n"); + count--; + + } + } + } + + } + +} diff --git a/src/main/java/org/jeecgframework/core/util/ListtoMenu.java b/src/main/java/org/jeecgframework/core/util/ListtoMenu.java new file mode 100644 index 00000000..c13c854a --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/ListtoMenu.java @@ -0,0 +1,809 @@ +package org.jeecgframework.core.util; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.lang.StringUtils; +import org.jeecgframework.web.system.pojo.base.TSFunction; +import org.jeecgframework.web.system.pojo.base.TSIcon; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.springframework.beans.factory.annotation.Autowired; + + +/** + * 鍔ㄦ佽彍鍗曟爮鐢熸垚 + * + * @author 寮犱唬娴 + * 鑾峰彇鏄惁鏈夊瓙鑺傜偣涓嶇敤鏌ヨ鏁版嵁搴; + */ +public class ListtoMenu { + + @Autowired + private static MutiLangServiceI mutiLangService; + + /** + * 鎷艰easyui鑿滃崟JSON鏂瑰紡 + * + * @param set + * @param set1 + * @return + */ + public static String getMenu(List set, List set1) { + StringBuffer buffer = new StringBuffer(); + buffer.append("{\"menus\":["); + for (TSFunction node : set) { + String iconClas = "default";// 鏉冮檺鍥炬爣鏍峰紡 + if (node.getTSIcon() != null) { + iconClas = TSIcon.allTSIcons.get(node.getTSIcon().getId()).getIconClas(); + } + buffer.append("{\"menuid\":\"" + node.getId() + "\",\"icon\":\"" + + iconClas + "\"," + "\"menuname\":\"" + + getMutiLang(node.getFunctionName()) + "\",\"menus\":["); + iterGet(set1, node.getId(), buffer); + buffer.append("]},"); + } + buffer.append("]}"); + + // 灏,\n]鏇挎崲鎴怽n] + + String tmp = buffer.toString(); + + tmp = tmp.replaceAll(",\n]", "\n]"); + tmp = tmp.replaceAll(",]}", "]}"); + return tmp; + + } + + static int count = 0; + + /** + * @param args + */ + + static void iterGet(List set1, String pid, StringBuffer buffer) { + + for (TSFunction node : set1) { + + // 鏌ユ壘鎵鏈夌埗鑺傜偣涓簆id鐨勬墍鏈夊璞★紝鐒跺悗鎷兼帴涓簀son鏍煎紡鐨勬暟鎹 + count++; + if (node.getTSFunction().getId().equals(pid)) + + { + buffer.append("{\"menuid\":\"" + node.getId() + + " \",\"icon\":\"" + TSIcon.allTSIcons.get(node.getTSIcon().getId()).getIconClas() + + "\"," + "\"menuname\":\"" + getMutiLang(node.getFunctionName()) + + "\",\"url\":\"" + node.getFunctionUrl() + "\""); + if (count == set1.size()) { + buffer.append("}\n"); + } + buffer.append("},\n"); + + } + } + + } + + /** + * 鎷艰Bootstarp鑿滃崟 + * + * @param pFunctions + * @param functions + * @return + */ + public static String getBootMenu(List pFunctions, + List functions) { + StringBuffer menuString = new StringBuffer(); + menuString.append("
      "); + for (TSFunction pFunction : pFunctions) { + menuString.append("
    • " + + getMutiLang(pFunction.getFunctionName()) + ""); + /* + int submenusize = pFunction.getSubFunctionSize(); + if (submenusize == 0) { + menuString.append("
    • "); + } + if (submenusize > 0) { + menuString.append("
        "); + } + for (TSFunction function : functions) { + + if (function.getTSFunction().getId().equals(pFunction.getId())) { + menuString + .append("
      • " + + getMutiLang(function.getFunctionName()) + "
      • "); + } + } + if (submenusize > 0) { + menuString.append("
      "); + }*/ + boolean hasSubfun=pFunction.hasSubFunction(functions); + if(!hasSubfun){ + menuString.append(""); + }else{ + menuString.append(""); + } + } + menuString.append("
    "); + return menuString.toString(); + + } + + /** + * 鎷艰EASYUI鑿滃崟 + * + * @param pFunctions + * @param functions + * @return + */ + public static String getEasyuiMenu(List pFunctions, + List functions) { + StringBuffer menuString = new StringBuffer(); + for (TSFunction pFunction : pFunctions) { + menuString.append("
    "); + /*int submenusize = pFunction.getSubFunctionSize(); + if (submenusize == 0) { + menuString.append("
    "); + } + if (submenusize > 0) { + menuString.append("
      "); + } + for (TSFunction function : functions) { + + if (function.getTSFunction().getId().equals(pFunction.getId())) { + String icon = "folder"; + if (function.getTSIcon() != null) { + icon = TSIcon.allTSIcons.get(function.getTSIcon().getId()).getIconClas(); + } + menuString.append("
    • "); + } + } + if (submenusize > 0) { + menuString.append("
    "); + }*/ + + boolean hasSubfun =pFunction.hasSubFunction(functions); + if(!hasSubfun){ + menuString.append(""); + }else{ + menuString.append("
      "); + } + for (TSFunction function : functions) { + if (function.getTSFunction().getId().equals(pFunction.getId())) { + String icon = "folder"; + if (function.getTSIcon() != null) { + icon = TSIcon.allTSIcons.get(function.getTSIcon().getId()).getIconClas(); + } + menuString.append("
    • "); + } + } + if (hasSubfun) { + menuString.append("
    "); + } + } + return menuString.toString(); + + } + + /** + * 鎷艰EASYUI 澶氱骇 鑿滃崟 + * + * @param pFunctions + * @param functions + * @return + */ + public static String getEasyuiMultistageMenu( + Map> map) { + StringBuffer menuString = new StringBuffer(); + List list = map.get(0); + for (TSFunction function : list) { + menuString.append("
    "); + /*int submenusize = function.getSubFunctionSize(); + if (submenusize == 0) { + menuString.append("
    "); + } + if (submenusize > 0) { + menuString.append("
      "); + } + menuString.append(getChild(function,1,map)); + if (submenusize > 0) { + menuString.append("
    "); + }*/ + if(!function.hasSubFunction(map)){ + menuString.append(""); + menuString.append(getChild(function,1,map)); + }else{ + menuString.append("
      "); + menuString.append(getChild(function,1,map)); + menuString.append("
    "); + } + } + return menuString.toString(); + } + + /** + * 鎷艰EASYUI 澶氱骇 鑿滃崟 涓嬬骇鑿滃崟涓烘爲褰 + * @param map the map of Map> + * @param style 鏍峰紡锛歟asyui-缁忓吀椋庢牸銆乻hortcut-shortcut椋庢牸 + * @return + */ + public static String getEasyuiMultistageTree(Map> map, String style) { + if(map==null||map.size()==0||!map.containsKey(0)){return "涓嶅叿鏈変换浣曟潈闄,\n璇锋壘绠$悊鍛樺垎閰嶆潈闄";} + StringBuffer menuString = new StringBuffer(); + List list = map.get(0); + int curIndex = 0; + if ("easyui".equals(style)) { + for (TSFunction function : list) { + if(curIndex == 0) { // 绗竴涓彍鍗曪紝榛樿灞曞紑 + menuString.append("
  • "); + } else { + menuString.append("
  • "); + } + menuString.append("").append(getMutiLang(function.getFunctionName())).append(""); + if(!function.hasSubFunction(map)){ + menuString.append("
  • "); + menuString.append(getChildOfTree(function,1,map)); + }else{ + menuString.append("
      "); + menuString.append(getChildOfTree(function,1,map)); + menuString.append("
    "); + } + curIndex++; + } + } else if("shortcut".equals(style)) { + for (TSFunction function : list) { + menuString.append("
    "); + if(!function.hasSubFunction(map)){ + menuString.append("
    "); + menuString.append(getChildOfTree(function,1,map)); + }else{ + menuString.append("
      "); + menuString.append(getChildOfTree(function,1,map)); + menuString.append("
    "); + } + } + } + + return menuString.toString(); + } + + /** + * 鑾峰彇椤剁骇鑿滃崟鐨勪笅绾ц彍鍗-----闈㈡澘寮忚彍鍗 + * @param parent + * @param level + * @param map + * @return + */ + private static String getChild(TSFunction parent,int level,Map> map){ + StringBuffer menuString = new StringBuffer(); + List list = map.get(level); + for (TSFunction function : list) { + if (function.getTSFunction().getId().equals(parent.getId())){ + if(!function.hasSubFunction(map)){ + menuString.append(getLeaf(function)); + }else if(map.containsKey(level+1)){ + menuString.append("
    "); + menuString.append("
    ");//easy ui 榛樿灞曞紑绗竴绾,鎵浠ヨ繖閲岃缃竴涓帶鍒,灏变笉灞曞紑浜 + menuString.append("
      "); + menuString.append(getChild(function,level+1,map)); + menuString.append("
    "); + menuString.append("
    "); + } + } + } + return menuString.toString(); + } + /** + * 鑾峰彇鏍戝舰鑿滃崟 + * @param parent + * @param level + * @param map + * @return + */ + private static String getChildOfTree(TSFunction parent,int level,Map> map){ + StringBuffer menuString = new StringBuffer(); + List list = map.get(level); + for (TSFunction function : list) { + if (function.getTSFunction().getId().equals(parent.getId())){ + if(!function.hasSubFunction(map)){ + menuString.append(getLeafOfTree(function)); + }else if(map.containsKey(level+1)){ + menuString.append("
  • "+ getMutiLang(function.getFunctionName()) +""); + menuString.append("
      "); + menuString.append(getChildOfTree(function,level+1,map)); + menuString.append("
  • "); + } + } + } + return menuString.toString(); + } + /** + * 鑾峰彇鍙跺瓙鑺傜偣 + * @param function + * @return + */ + private static String getLeaf(TSFunction function){ + StringBuffer menuString = new StringBuffer(); + String icon = "folder"; + if (function.getTSIcon() != null) { + icon = TSIcon.allTSIcons.get(function.getTSIcon().getId()).getIconClas(); + } + menuString.append("
  • "); + return menuString.toString(); + } + /** + * 鑾峰彇鍙跺瓙鑺傜偣 ------鏍戝舰鑿滃崟鐨勫彾瀛愯妭鐐 + * @param function + * @return + */ + private static String getLeafOfTree(TSFunction function){ + StringBuffer menuString = new StringBuffer(); + String icon = "folder"; + if (function.getTSIcon() != null) { + icon = TSIcon.allTSIcons.get(function.getTSIcon().getId()).getIconClas(); + } + menuString.append("
  • "); + menuString.append(getMutiLang(function.getFunctionName())); + menuString.append("
  • "); + return menuString.toString(); + } + /** + * 鎷艰bootstrap澶撮儴鑿滃崟 + * @param pFunctions + * @param functions + * @return + */ + public static String getBootstrapMenu(Map> map) { + StringBuffer menuString = new StringBuffer(); + menuString.append(""); + return menuString.toString(); + } + /** + * @Title: getBootStrapChild + * @Description: 閫掑綊鑾峰彇bootstrap鐨勫瓙鑿滃崟 + * @param parent + * @param level + * @param map + * @return String + * @throws + */ + private static String getBootStrapChild(TSFunction parent,int level,Map> map){ + StringBuffer menuString = new StringBuffer(); + List list = map.get(level); + if(list==null || list.size()==0){ + return ""; + } + menuString.append("
      "); + for (TSFunction function : list) { + if (function.getTSFunction().getId().equals(parent.getId())){ + boolean hasSub = function.hasSubFunction(map); + String menu_url = function.getFunctionUrl(); + if(StringUtils.isNotEmpty(menu_url)){ + menu_url += "&clickFunctionId="+function.getId(); + } + menuString.append("
    • "); + menuString.append(" "); + menuString.append(" "); + menuString.append(getMutiLang(function.getFunctionName())); + menuString.append(" "); + if(hasSub){ + menuString.append(getBootStrapChild(function,level+1,map)); + } + menuString.append("
    • "); + } + } + menuString.append("
    "); + return menuString.toString(); + } + /** + * 鎷艰webos澶撮儴鑿滃崟 + * @param pFunctions + * @param functions + * @return + */ + public static String getWebosMenu(Map> map) { + StringBuffer menuString = new StringBuffer(); + StringBuffer DeskpanelString = new StringBuffer(); + StringBuffer dataString = new StringBuffer(); + String menu = ""; + String desk = ""; + String data = ""; + + //menu鐨勫叏閮╦son锛岃繖閲屽寘鎷鑿滃崟鐨勫睍绀哄強姣忎釜浜岀骇鑿滃崟鐨勭偣鍑诲嚭璇︽儏 +// menuString.append("["); + menuString.append("{"); + //缁樺埗data.js鏁扮粍锛岀敤浜庢浛鎹ata.js涓殑app:{//妗岄潰1 'dtbd':{ appid:'2534',,路路路路路路 + dataString.append("{app:{"); + //缁樺埗Deskpanel鏁扮粍锛岀敤浜庢浛鎹ebos-core.js涓殑Icon1:['dtbd','sosomap','jinshan'],路路路路路路 + DeskpanelString.append("{"); + + List pFunctions = (List) map.get(0); + if(pFunctions==null || pFunctions.size()==0){ + return ""; + } + int n = 1; + for (TSFunction pFunction : pFunctions) { + //鏄惁鏈夊瓙鑿滃崟 + boolean hasSub = pFunction.hasSubFunction(map); + //缁樺埗涓绾ц彍鍗 +// menuString.append("{ "); + menuString.append("\""+ pFunction.getId() + "\":"); + menuString.append("{\"id\":\""+pFunction.getId()+"\",\"name\":\""+pFunction.getFunctionName() + +"\",\"path\":\""+TSIcon.allTSIcons.get(pFunction.getTSIcon().getId()).getIconPath()+"\",\"level\":\""+pFunction.getFunctionLevel()+"\","); + menuString.append("\"child\":{"); + + //缁樺埗Deskpanel鏁扮粍 + DeskpanelString.append("Icon"+n+":["); + + //缁樺埗浜岀骇鑿滃崟 + if(hasSub){ +// menuString.append(getWebosChild(pFunction, 1, map)); + DeskpanelString.append(getWebosDeskpanelChild(pFunction, 1, map)); + dataString.append(getWebosDataChild(pFunction, 1, map)); + } + DeskpanelString.append("],"); + menuString.append("}},"); + n++; + } + + menu = menuString.substring(0, menuString.toString().length()-1); +// menu += "]"; + menu += "}"; + + data = dataString.substring(0, dataString.toString().length()-1); + data += "}}"; + + desk = DeskpanelString.substring(0, DeskpanelString.toString().length()-1); + desk += "}"; + + //鍒濆鍖栦负1锛岄渶鍑忓皯涓涓釜鏁般 + n = n-1; + +// System.out.println("-------------------"); +// System.out.println(menu+"$$"+desk+"$$"+data+"$$"+"{\"total\":"+n+"}"); + return menu+"$$"+desk+"$$"+data+"$$"+n; + } + /** + * @Title: getWebosChild + * @Description: 閫掑綊鑾峰彇Webos鐨勫瓙鑿滃崟 + * @param parent + * @param level + * @param map + * @return String + * @throws + */ + private static String getWebosChild(TSFunction parent,int level,Map> map){ + StringBuffer menuString = new StringBuffer(); + String menu = ""; + List list = map.get(level); + if(list==null || list.size()==0){ + return ""; + } + for (TSFunction function : list) { + if (function.getTSFunction().getId().equals(parent.getId())){ + boolean hasSub = function.hasSubFunction(map); + menuString.append("\""+ function.getId() + "\":"); + menuString.append("{\"id\":\""+function.getId()+"\",\"name\":\""+ getMutiLang(function.getFunctionName()) +"\",\"path\":\""+function.getTSIcon().getIconPath()+"\",\"url\":\""+function.getFunctionUrl()+"\",\"level\":\""+function.getFunctionLevel()+"\"}"); + + if(hasSub){ + menuString.append("\"child\":{"); + menuString.append(getWebosChild(function,level+1,map)); + menuString.append(" } "); + } + menuString.append(","); + } + } + menu = menuString.substring(0, menuString.toString().length()-1); + return menu; + } + private static String getWebosDeskpanelChild(TSFunction parent,int level,Map> map){ + StringBuffer DeskpanelString = new StringBuffer(); + String desk = ""; + List list = map.get(level); + if(list==null || list.size()==0){ + return ""; + } + for (TSFunction function : list) { + if (function.getTSFunction().getId().equals(parent.getId())){ + DeskpanelString.append("'"+function.getId()+"',"); + } + } + desk = DeskpanelString.substring(0, DeskpanelString.toString().length()-1); + return desk; + } + private static String getWebosDataChild(TSFunction parent,int level,Map> map){ + StringBuffer dataString = new StringBuffer(); + String data = ""; + List list = map.get(level); + if(list==null || list.size()==0){ + return ""; + } + for (TSFunction function : list) { + if (function.getTSFunction().getId().equals(parent.getId())){ + dataString.append("'"+function.getId()+"':{ "); + dataString.append("appid:'"+function.getId()+"',"); + dataString.append("url:'"+function.getFunctionUrl()+"',"); +// dataString.append(getIconandName(function.getFunctionName())); + dataString.append(getIconAndNameForDesk(function)); + dataString.append("asc :"+function.getFunctionOrder()); + dataString.append(" },"); + } + } +// data = dataString.substring(0, dataString.toString().length()-1); + data = dataString.toString(); + return data; + } + + private static String getIconAndNameForDesk(TSFunction function) { + StringBuffer dataString = new StringBuffer(); + + String colName = function.getTSIconDesk() == null ? null : function.getTSIconDesk().getIconPath(); + colName = (colName == null || colName.equals("")) ? "plug-in/sliding/icon/default.png" : colName; + String functionName = getMutiLang(function.getFunctionName()); + + dataString.append("icon:'" + colName + "',"); + dataString.append("name:'"+functionName+"',"); + + return dataString.toString(); + } + @Deprecated + private static String getIconandName(String functionName) { + StringBuffer dataString = new StringBuffer(); + + if("online寮鍙".equals(functionName)){ + dataString.append("icon:'Customize.png',"); + }else if("琛ㄥ崟閰嶇疆".equals(functionName)){ + dataString.append("icon:'Applications Folder.png',"); + }else if("鍔ㄦ佽〃鍗曢厤缃".equals(functionName)){ + dataString.append("icon:'Documents Folder.png',"); + }else if("鐢ㄦ埛鍒嗘瀽".equals(functionName)){ + dataString.append("icon:'User.png',"); + }else if("鎶ヨ〃鍒嗘瀽".equals(functionName)){ + dataString.append("icon:'Burn.png',"); + }else if("鐢ㄦ埛绠$悊".equals(functionName)){ + dataString.append("icon:'Finder.png',"); + }else if("鏁版嵁瀛楀吀".equals(functionName)){ + dataString.append("icon:'friendnear.png',"); + }else if("瑙掕壊绠$悊".equals(functionName)){ + dataString.append("icon:'friendgroup.png',"); + }else if("鑿滃崟绠$悊".equals(functionName)){ + dataString.append("icon:'kaikai.png',"); + }else if("鍥炬爣绠$悊".equals(functionName)){ + dataString.append("icon:'kxjy.png',"); + }else if("琛ㄥ崟楠岃瘉".equals(functionName)){ + dataString.append("icon:'qidianzhongwen.png',"); + }else if("涓瀵瑰妯″瀷".equals(functionName)){ + dataString.append("icon:'qqread.png',"); + }else if("鐗规畩甯冨眬".equals(functionName)){ + dataString.append("icon:'xiami.png',"); + }else if("鍦ㄧ嚎word".equals(functionName)){ + dataString.append("icon:'musicbox.png',"); + }else if("澶氶檮浠剁鐞".equals(functionName)){ + dataString.append("icon:'vadio.png',"); + }else if("鏁版嵁鐩戞帶".equals(functionName)){ + dataString.append("icon:'Super Disk.png',"); + }else if("瀹氭椂浠诲姟".equals(functionName)){ + dataString.append("icon:'Utilities.png',"); + }else if("绯荤粺鏃ュ織".equals(functionName)){ + dataString.append("icon:'fastsearch.png',"); + }else if("鍦ㄧ嚎缁存姢".equals(functionName)){ + dataString.append("icon:'Utilities Folder.png',"); + }else{ + dataString.append("icon:'folder_o.png',"); + } + dataString.append("name:'"+functionName+"',"); + + return dataString.toString(); + } + + /** + * @Title: getMutiLang + * @Description: 杞崲鑿滃崟澶氳瑷 + * @param functionName + * @return String + * @throws + */ + private static String getMutiLang(String functionName){ + //add by Rocky, 澶勭悊澶氳瑷 + if(mutiLangService == null) + { + mutiLangService = ApplicationContextUtil.getContext().getBean(MutiLangServiceI.class); + } + + String lang_context = mutiLangService.getLang(functionName); + return lang_context; + } + public static String getAceMultistageTree(Map> map) { + if(map==null||map.size()==0||!map.containsKey(0)){return "涓嶅叿鏈変换浣曟潈闄,\n璇锋壘绠$悊鍛樺垎閰嶆潈闄";} + StringBuffer menuString = new StringBuffer(); + List list = map.get(0); + int curIndex = 0; + for (TSFunction function : list) { + menuString.append("
  • "); + menuString.append("") + .append(getMutiLang(function.getFunctionName())); + /* int submenusize = function.getSubFunctionSize(); + if (submenusize == 0) { + menuString.append("
  • "); + } + if (submenusize > 0) { + menuString.append("
      "); + } + menuString.append(getSubMenu(function,1,map)); + if (submenusize > 0) { + menuString.append("
    "); + }*/ + if(!function.hasSubFunction(map)){ + menuString.append(""); + menuString.append(getSubMenu(function,1,map)); + }else{ + menuString.append("
      "); + menuString.append(getSubMenu(function,1,map)); + menuString.append("
    "); + } + curIndex++; + } + + return menuString.toString(); + } + private static String getSubMenu(TSFunction parent,int level,Map> map){ + StringBuffer menuString = new StringBuffer(); + List list = map.get(level); + for (TSFunction function : list) { + if (function.getTSFunction().getId().equals(parent.getId())){ + if(!function.hasSubFunction(map)){ + menuString.append(getLeafOfACETree(function)); + }else if(map.containsKey(level+1)){ + String icon = "folder"; + try{ + if (function.getTSIcon() != null) { + icon = TSIcon.allTSIcons.get(function.getTSIcon().getId()).getIconClas(); + } + }catch(Exception e){ + //TODO handle icon load exception + } + menuString.append("
  • "+ getMutiLang(function.getFunctionName()) +""); + menuString.append("
      "); + menuString.append(getChildOfTree(function,level+1,map)); + menuString.append("
  • "); + } + } + } + return menuString.toString(); + } + private static String getLeafOfACETree(TSFunction function){ + StringBuffer menuString = new StringBuffer(); + String icon = "folder"; + if (function.getTSIcon() != null) { + icon = TSIcon.allTSIcons.get(function.getTSIcon().getId()).getIconClas(); + } + String name = getMutiLang(function.getFunctionName()) ; + menuString.append("
  • "); + menuString.append(name); + menuString.append("
  • "); + return menuString.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/util/LogUtil.java b/src/main/java/org/jeecgframework/core/util/LogUtil.java new file mode 100644 index 00000000..be429ed7 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/LogUtil.java @@ -0,0 +1,233 @@ +package org.jeecgframework.core.util; + +import java.io.BufferedReader; +import java.io.PrintWriter; +import java.io.StringReader; +import java.io.StringWriter; +import org.apache.log4j.Level; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.apache.log4j.Priority; + +/** + * + * @author 寮犱唬娴 + * + */ +public class LogUtil { + + //private static BaseLogUtil objLog = new BaseLogUtil(); + private static final String LOGCONFIG = "log4j.properties"; + private static Logger objLog; + + private static Logger getLogger() { + if(objLog==null){ +// DOMConfigurator.configure(getConfigFile()); + objLog = LogManager.getLogger(LogUtil.class); + } + return objLog; + } + + private static String getConfigFile(){ + String s = LogUtil.class.getClassLoader().getResource("").toString(); + String filePath = s + LOGCONFIG; + return filePath; + } + + // Start Info + // / + // / 璁板綍淇℃伅 + // / + // / 淇℃伅鍐呭 + public static void info(String message, Exception exception) { + try { + log("INFO", message, exception); + } catch (Exception ex) { + + } + } + + // / + // / 璁板綍淇℃伅 + // / + // / 淇℃伅鍐呭 + public static void info(Object message) { + log("INFO", message); + } + // end Info + + // Start Error + public static void trace(String message) { + try { + log("TRACE", message); + } catch (Exception ex) { + } + } + + public static void trace(String message, Exception exception) { + try { + log("TRACE", message, exception); + } catch (Exception ex) { + } + } + + // / + // / 璁板綍涓涓敊璇俊鎭 + // / + // / 淇℃伅鍐呭 + // / 寮傚父瀵硅薄 + public static void error(String message, Exception exception) { + try { + log("ERROR", message, exception); + } catch (Exception ex) { + + } + } + + // / + // / 璁板綍涓涓敊璇俊鎭 + // / + // / 淇℃伅鍐呭 + public static void error(String message) { + try { + log("ERROR", message); + } catch (Exception ex) { + + } + } + + // end Error + + // Start Warning + + // / + // / 璁板綍涓涓鍛婁俊鎭 + // / + // / 淇℃伅鍐呭 + // / 寮傚父瀵硅薄 + public static void warning(String message, Exception exception) { + try { + log("WARN", message, exception); + } catch (Exception ex) { + + } + } + + // / + // / 璁板綍涓涓鍛婁俊鎭 + // / + // / 淇℃伅鍐呭 + public static void warning(String message) { + try { + log("WARN", message); + } catch (Exception ex) { + + } + } + + // end Warning + + // Start Fatal + + // / + // / 璁板綍涓涓▼搴忚嚧鍛芥ч敊璇 + // / + // / 淇℃伅鍐呭 + // / 寮傚父瀵硅薄 + public static void fatal(String message, Exception exception) { + try { + log("FATAL", message, exception); + } catch (Exception ex) { + + } + } + + // / + // / 璁板綍涓涓▼搴忚嚧鍛芥ч敊璇 + // / + // / 淇℃伅鍐呭 + public static void fatal(String message) { + try { + log("FATAL", message); + } catch (Exception ex) { + + } + } + + // end Fatal + + // Start Debug + + // / + // / 璁板綍璋冭瘯淇℃伅 + // / + // / 淇℃伅鍐呭 + // / 寮傚父瀵硅薄 + public static void debug(String message, Exception exception) { + try { + log("DEBUG", message, exception); + } catch (Exception ex) { + + } + } + + // / + // / 璁板綍璋冭瘯淇℃伅 + // / + // / 淇℃伅鍐呭 + public static void debug(String message) { + try { + log("DEBUG", message); + } catch (Exception ex) { + + } + } + // end Debug + + public static void log(String level, Object msg) + { + log(level, msg, null); + } + + public static void log(String level, Throwable e) + { + log(level, null, e); + } + + public static void log(String level, Object msg, Throwable e) + { + try{ + StringBuilder sb = new StringBuilder(); + Throwable t = new Throwable(); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + t.printStackTrace(pw); + String input = sw.getBuffer().toString(); + StringReader sr = new StringReader(input); + BufferedReader br = new BufferedReader(sr); + for(int i=0;i<4;i++) + br.readLine(); + String line = br.readLine(); + //at com.media.web.action.DicManageAction.list(DicManageAction.java:89) + int paren = line.indexOf("at "); + line = line.substring(paren+3); + paren = line.indexOf('('); + String invokeInfo = line.substring(0, paren); + int period = invokeInfo.lastIndexOf('.'); + sb.append('['); + sb.append(invokeInfo.substring(0,period)); + sb.append(':'); + sb.append(invokeInfo.substring(period+1)); + sb.append("():"); + paren = line.indexOf(':'); + period = line.lastIndexOf(')'); + sb.append(line.substring(paren+1,period)); + sb.append(']'); + sb.append(" - "); + sb.append(msg); + getLogger().log((Priority) Level.toLevel(level), sb.toString(), e); + }catch(Exception ex){ + org.jeecgframework.core.util.LogUtil.info(ex.getLocalizedMessage()); + } + } +} diff --git a/src/main/java/org/jeecgframework/core/util/MutiLangSqlCriteriaUtil.java b/src/main/java/org/jeecgframework/core/util/MutiLangSqlCriteriaUtil.java new file mode 100644 index 00000000..0690f9ce --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/MutiLangSqlCriteriaUtil.java @@ -0,0 +1,65 @@ +package org.jeecgframework.core.util; + +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 澶氳瑷sql鐨勬煡璇㈠弬鏁板伐鍏风被 + *

    + *

    User: zhanggm guomingzhang2008@gmail.com

    + *

    Date: 2014-08-07 16:00

    + * + * @author 寮犲浗鏄 + */ +public class MutiLangSqlCriteriaUtil { + /** + * 缁勮鏌ヨ鏉′欢锛氬澶氳瑷瀛楁杩涜 鏌ヨ鏉′欢鐨勭粍瑁 + * @param fieldLangKeyList 寰呮煡璇㈠瓧娈靛搴旂殑璇█key鍒楄〃 + * @param cq 鏌ヨ鏉′欢瀹炰綋 - CriteriaQuery + * @param fieldName 寰呮煡璇㈠瓧娈靛悕绉 + * @param fieldValue 寰呮煡璇㈠瓧娈靛 - 椤甸潰浼犲叆 + */ + public static void assembleCondition(List fieldLangKeyList, CriteriaQuery cq, String fieldName, String fieldValue) { + Map fieldLangMap = new HashMap(); + for (String nameKey : fieldLangKeyList) { + String name = MutiLangUtil.getMutiLangInstance().getLang(nameKey); + fieldLangMap.put(nameKey, name); + } + + if("*".equals(fieldValue)) { + fieldValue = "**"; + } + List paramValueList = new ArrayList(); + for (Map.Entry entry : fieldLangMap.entrySet()) { + String fieldLangKey = entry.getKey(); + String fieldLangValue = entry.getValue(); + if (fieldValue.startsWith("*") && fieldValue.endsWith("*")) { + if (fieldLangValue.contains(fieldValue.substring(1, fieldValue.length() -1))) { + paramValueList.add(fieldLangKey); + } + } else if(fieldValue.startsWith("*")) { + if (fieldLangValue.endsWith(fieldValue.substring(1))) { + paramValueList.add(fieldLangKey); + } + } else if(fieldValue.endsWith("*")) { + if (fieldLangValue.startsWith(fieldValue.substring(0, fieldValue.length() -1))) { + paramValueList.add(fieldLangKey); + } + } else { + if (fieldLangValue.equals(fieldValue)) { + paramValueList.add(fieldLangKey); + } + } + } + + if (paramValueList.size() == 0) { + paramValueList.add("~!@#$%_()*&^"); // 璁剧疆涓涓敊璇殑key鍊笺 + } + cq.in(fieldName, paramValueList.toArray()); + cq.add(); + } +} diff --git a/src/main/java/org/jeecgframework/core/util/MutiLangUtil.java b/src/main/java/org/jeecgframework/core/util/MutiLangUtil.java new file mode 100644 index 00000000..40e72d26 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/MutiLangUtil.java @@ -0,0 +1,186 @@ +package org.jeecgframework.core.util; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jeecgframework.web.system.pojo.base.MutiLangEntity; +import org.jeecgframework.web.system.service.MutiLangServiceI; + +import java.util.ArrayList; +import java.util.List; + + +/** + * 瀛楃涓插鐞嗗強杞崲宸ュ叿绫 + * @author 寮犱唬娴 + */ +public class MutiLangUtil { + private static Log logger = LogFactory.getLog(StringUtil.class); + + private static MutiLangServiceI mutiLangService; + + /** + * 閫氱敤鍒犻櫎娑堟伅鏂规硶 + * + * @param param_lang_key 濡傦細common.delete.success.param + * @return XXX鍒犻櫎鎴愬姛锛屽澶氳瑷鍒犻櫎鎴愬姛 + */ + public static String paramDelSuccess(String param_lang_key) { + String message = getMutiLangInstance().getLang("common.delete.success.param", param_lang_key); + return message; + } + + // add-begin--Author:zhangguoming Date:20140727 for锛氶氱敤鍒犻櫎娑堟伅鏂规硶 + /** + * 閫氱敤鍒犻櫎娑堟伅鏂规硶 + * + * @param param_lang_key 濡傦細common.delete.fail.param + * @return XXX鍒犻櫎澶辫触锛屽绯荤粺鍥炬爣澶辫触锛屾鍦ㄤ娇鐢ㄧ殑鍥炬爣锛屼笉鍏佽鍒犻櫎銆 + */ + public static String paramDelFail(String param_lang_key) { + String message = getMutiLangInstance().getLang("common.delete.fail.param", param_lang_key); + return message; + } + // add-end--Author:zhangguoming Date:20140727 for锛氶氱敤鍒犻櫎娑堟伅鏂规硶 + + /** + * 閫氱敤鏇存柊鎴愬姛娑堟伅鏂规硶 + * + * @param param_lang_key 濡傦細common.edit.success.param + * @return XXX鏇存柊鎴愬姛锛屽澶氳瑷鍒犻櫎鎴愬姛 + */ + public static String paramUpdSuccess(String param_lang_key) { + String message = getMutiLangInstance().getLang("common.edit.success.param", param_lang_key); + return message; + } + + /** + * 閫氱敤鏇存柊澶辫触娑堟伅鏂规硶 + * + * @param param_lang_key 濡傦細common.edit.success.param + * @return XXX鏇存柊澶辫触锛屽澶氳瑷鏇存柊澶辫触 + */ + public static String paramUpdFail(String param_lang_key) { + String message = getMutiLangInstance().getLang("common.edit.fail.param", param_lang_key); + return message; + } + + /** + * 閫氱敤娣诲姞娑堟伅鏂规硶 + * + * @param param_lang_key 濡傦細common.edit.success.param + * @return XXX褰曞叆鎴愬姛锛屽澶氳瑷褰曞叆鎴愬姛 + */ + public static String paramAddSuccess(String param_lang_key) { + String message = getMutiLangInstance().getLang("common.add.success.param", param_lang_key); + return message; + } + + /** + * 閫氱敤鍥介檯鍖杢ree鏂规硶 + * + * @param treeList, mutiLangService + */ + public static void setMutiTree(List treeList) + { + if(ListUtils.isNullOrEmpty(treeList)) return; + + for(Object treeItem : treeList) + { + ReflectHelper reflectHelper = new ReflectHelper(treeItem); + String lang_key = (String)reflectHelper.getMethodValue("text"); //treeItem.getText(); + String lang_context = getMutiLangInstance().getLang(lang_key); + reflectHelper.setMethodValue("text", lang_context); + } + } + + /** + * 妫鏌ュ浗闄呭寲鍐呭鎴杔ang_key鏄惁宸茬粡瀛樺湪 + * + * @param lang_key + * @return 濡傛灉瀛樺湪鍒欒繑鍥瀟rue锛屽惁鍒檉alse + */ + public static boolean existLangKey(String lang_key) + { + List langKeyList = getMutiLangInstance().findByProperty(MutiLangEntity.class, "langKey", lang_key); + if(!langKeyList.isEmpty()) + { + return true; + } + + return false; + } + + /** + * 妫鏌ュ浗闄呭寲鍐呭鎴朿ontext鏄惁宸茬粡瀛樺湪 + * + * @param lang_context + * @return 濡傛灉瀛樺湪鍒欒繑鍥瀟rue锛屽惁鍒檉alse + */ + public static boolean existLangContext(String lang_context) + { + List langContextList = getMutiLangInstance().findByProperty(MutiLangEntity.class, "langContext", lang_context); + if(!langContextList.isEmpty()) + { + return true; + } + + return false; + } + + /** + * 閫氱敤寰楀埌MutiLangService鏂规硶 + * + * @return mutiLangService瀹炰緥 + */ + public static MutiLangServiceI getMutiLangInstance() + { + if(mutiLangService == null) + { + mutiLangService = ApplicationContextUtil.getContext().getBean(MutiLangServiceI.class); + } + return mutiLangService; + } + + public static String doMutiLang(String title, String langArg){ + String context = getMutiLangInstance().getLang(title, langArg); + return context; + } + + // add-begin--Author:zhangguoming Date:20140928 for锛氬璇█ + /** + * 澶勭悊鍒楄〃涓璞$殑澶氳瑷灞炴у硷紝鍗充负鍒楄〃涓疄浣撳璞$殑灞炴у兼浛鎹负澶氳瑷鎵瀵瑰簲鐨勫 + * @param list 瀵硅薄鍒楄〃 + * @param attributes 澶氳瑷灞炴у悕鍒楄〃 + */ + public static void setMutiLangValueForList(List list, String... attributes) { + if (ListUtils.isNullOrEmpty(list)) { + return; + } + if (attributes == null && attributes.length == 0) { + return; + } + List newList = new ArrayList(); + for (Object obj : list) { + // 濡傛灉鐩存帴鎿嶄綔鍒楄〃涓殑鍘熷瀵硅薄锛屽垯浼氳Е鍙慔ibernate鐨剈pdate鎿嶄綔锛屾墍浠ヤ娇鐢ㄧ被浼煎厠闅嗙殑鏂瑰紡杩涜澶勭悊锛 + Object cloneObj = null; + try { + cloneObj = Class.forName(obj.getClass().getName()).newInstance(); + MyBeanUtils.copyBean2Bean(cloneObj, obj); + } catch (Exception e) { + e.printStackTrace(); + continue; + } + ReflectHelper reflectHelper = new ReflectHelper(cloneObj); + for (String attribute : attributes) { + String lang_key = (String) reflectHelper.getMethodValue(attribute); + String lang_context = getMutiLangInstance().getLang(lang_key); + reflectHelper.setMethodValue(attribute, lang_context); + } + newList.add(cloneObj); + } + list.clear(); + list.addAll(newList); + } + // add-end--Author:zhangguoming Date:20140928 for锛氬璇█ + +} diff --git a/src/main/java/org/jeecgframework/core/util/MyBeanUtils.java b/src/main/java/org/jeecgframework/core/util/MyBeanUtils.java new file mode 100644 index 00000000..5c29a8b2 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/MyBeanUtils.java @@ -0,0 +1,311 @@ +package org.jeecgframework.core.util; + +import java.beans.PropertyDescriptor; +import java.lang.reflect.InvocationTargetException; +import java.util.Iterator; +import java.util.Map; + +import org.apache.commons.beanutils.DynaBean; +import org.apache.commons.beanutils.DynaProperty; +import org.apache.commons.beanutils.PropertyUtils; +import org.apache.commons.beanutils.PropertyUtilsBean; + +/** + *

    Title:

    + *

    Description:

    + * @author 寮犱唬娴 + * @version 1.0 + */ + +public class MyBeanUtils + extends PropertyUtilsBean { + + private static void convert(Object dest, Object orig) throws + IllegalAccessException, InvocationTargetException { + + // Validate existence of the specified beans + if (dest == null) { + throw new IllegalArgumentException + ("No destination bean specified"); + } + if (orig == null) { + throw new IllegalArgumentException("No origin bean specified"); + } + + // Copy the properties, converting as necessary + if (orig instanceof DynaBean) { + DynaProperty origDescriptors[] = + ( (DynaBean) orig).getDynaClass().getDynaProperties(); + for (int i = 0; i < origDescriptors.length; i++) { + String name = origDescriptors[i].getName(); + if (PropertyUtils.isWriteable(dest, name)) { + Object value = ( (DynaBean) orig).get(name); + try { + getInstance().setSimpleProperty(dest, name, value); + } + catch (Exception e) { + ; // Should not happen + } + + } + } + } + else if (orig instanceof Map) { + Iterator names = ( (Map) orig).keySet().iterator(); + while (names.hasNext()) { + String name = (String) names.next(); + if (PropertyUtils.isWriteable(dest, name)) { + Object value = ( (Map) orig).get(name); + try { + getInstance().setSimpleProperty(dest, name, value); + } + catch (Exception e) { + ; // Should not happen + } + + } + } + } + else + /* if (orig is a standard JavaBean) */ + { + PropertyDescriptor origDescriptors[] = + PropertyUtils.getPropertyDescriptors(orig); + for (int i = 0; i < origDescriptors.length; i++) { + String name = origDescriptors[i].getName(); +// String type = origDescriptors[i].getPropertyType().toString(); + if ("class".equals(name)) { + continue; // No point in trying to set an object's class + } + if (PropertyUtils.isReadable(orig, name) && + PropertyUtils.isWriteable(dest, name)) { + try { + Object value = PropertyUtils.getSimpleProperty(orig, name); + getInstance().setSimpleProperty(dest, name, value); + } + catch (java.lang.IllegalArgumentException ie) { + ; // Should not happen + } + catch (Exception e) { + ; // Should not happen + } + + } + } + } + + } + + + /** + * 瀵硅薄鎷疯礉 + * 鏁版嵁瀵硅薄绌哄间笉鎷疯礉鍒扮洰鏍囧璞 + * + * @param dataObject + * @param toObject + * @throws NoSuchMethodException + * copy + */ + public static void copyBeanNotNull2Bean(Object databean,Object tobean)throws Exception + { + PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(databean); + for (int i = 0; i < origDescriptors.length; i++) { + String name = origDescriptors[i].getName(); +// String type = origDescriptors[i].getPropertyType().toString(); + if ("class".equals(name)) { + continue; // No point in trying to set an object's class + } + if (PropertyUtils.isReadable(databean, name) &&PropertyUtils.isWriteable(tobean, name)) { + try { + Object value = PropertyUtils.getSimpleProperty(databean, name); + if(value!=null){ + getInstance().setSimpleProperty(tobean, name, value); + } + } + catch (java.lang.IllegalArgumentException ie) { + ; // Should not happen + } + catch (Exception e) { + ; // Should not happen + } + + } + } + } + + + /** + * 鎶妎rig鍜宒est鐩稿悓灞炴х殑value澶嶅埗鍒癲est涓 + * @param dest + * @param orig + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + public static void copyBean2Bean(Object dest, Object orig) throws Exception { + convert(dest, orig); + } + + public static void copyBean2Map(Map map, Object bean){ + PropertyDescriptor[] pds = PropertyUtils.getPropertyDescriptors(bean); + for (int i =0;i -1) + realPath = realPath.substring(pos + 5); + // 鍘绘帀璺緞淇℃伅鏈鍚庡寘鍚被鏂囦欢淇℃伅鐨勯儴鍒嗭紝寰楀埌绫绘墍鍦ㄧ殑璺緞 + pos = realPath.indexOf(path + clsName); + realPath = realPath.substring(0, pos - 1); + // 濡傛灉绫绘枃浠惰鎵撳寘鍒癑AR绛夋枃浠朵腑鏃讹紝鍘绘帀瀵瑰簲鐨凧AR绛夋墦鍖呮枃浠跺悕 + if (realPath.endsWith("!")) + realPath = realPath.substring(0, realPath.lastIndexOf("/")); + /*------------------------------------------------------------ + ClassLoader鐨刧etResource鏂规硶浣跨敤浜唘tf-8瀵硅矾寰勪俊鎭繘琛屼簡缂栫爜锛屽綋璺緞 + 涓瓨鍦ㄤ腑鏂囧拰绌烘牸鏃讹紝浠栦細瀵硅繖浜涘瓧绗﹁繘琛岃浆鎹紝杩欐牱锛屽緱鍒扮殑寰寰涓嶆槸鎴戜滑鎯宠 + 鐨勭湡瀹炶矾寰勶紝鍦ㄦ锛岃皟鐢ㄤ簡URLDecoder鐨刣ecode鏂规硶杩涜瑙g爜锛屼互渚垮緱鍒板師濮嬬殑 + 涓枃鍙婄┖鏍艰矾寰 + -------------------------------------------------------------*/ + try { + realPath = java.net.URLDecoder.decode(realPath, "utf-8"); + } catch (Exception e) { + throw new RuntimeException(e); + } + return realPath; + }// getAppPath瀹氫箟缁撴潫 +} diff --git a/src/main/java/org/jeecgframework/core/util/NumberComparator.java b/src/main/java/org/jeecgframework/core/util/NumberComparator.java new file mode 100644 index 00000000..625454b9 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/NumberComparator.java @@ -0,0 +1,73 @@ +package org.jeecgframework.core.util; + +import java.util.Comparator; + +import org.jeecgframework.web.system.pojo.base.TSFunction; + +/** +* @ClassName: NumberComparator +* @Description: TODO(瀛楃涓叉瘮杈冨櫒) +* @author jeecg +* @date 2013-1-31 涓嬪崍06:18:35 +* + */ +public class NumberComparator implements Comparator { + private boolean ignoreCase = true; + + public NumberComparator() { + } + + public NumberComparator(boolean ignoreCase) { + this.ignoreCase = ignoreCase; + } + + public int compare(Object obj1, Object obj2) { + String o1 = ""; + String o2 = ""; + if (ignoreCase) { + TSFunction c1 = (TSFunction) obj1; + TSFunction c2 = (TSFunction) obj2; + o1 = c1.getFunctionOrder(); + o2 = c2.getFunctionOrder(); + } + if (o1 != null && o2 != null) { + for (int i = 0; i < o1.length(); i++) { + if (i == o1.length() && i < o2.length()) { + return -1; + } else if (i == o2.length() && i < o1.length()) { + return 1; + } + char ch1 = o1.charAt(i); + char ch2 = o2.charAt(i); + if (ch1 >= '0' && ch2 <= '9') { + int i1 = getNumber(o1.substring(i)); + int i2 = getNumber(o2.substring(i)); + if (i1 == i2) { + continue; + } else { + return i1 - i2; + } + } else if (ch1 != ch2) { + return ch1 - ch2; + } + } + } + return 0; + } + + private int getNumber(String str) { + int num = Integer.MAX_VALUE; + int bits = 0; + for (int i = 0; i < str.length(); i++) { + if (str.charAt(i) >= '0' && str.charAt(i) <= '9') { + bits++; + } else { + break; + } + } + if (bits > 0) { + num = Integer.parseInt(str.substring(0, bits)); + } + return num; + } +} diff --git a/src/main/java/org/jeecgframework/core/util/PasswordUtil.java b/src/main/java/org/jeecgframework/core/util/PasswordUtil.java new file mode 100644 index 00000000..06a00ba9 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/PasswordUtil.java @@ -0,0 +1,206 @@ +package org.jeecgframework.core.util; + +import java.security.Key; +import java.security.SecureRandom; +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.PBEParameterSpec; +public class PasswordUtil { + + /** + * JAVA6鏀寔浠ヤ笅浠绘剰涓绉嶇畻娉 PBEWITHMD5ANDDES PBEWITHMD5ANDTRIPLEDES + * PBEWITHSHAANDDESEDE PBEWITHSHA1ANDRC2_40 PBKDF2WITHHMACSHA1 + * */ + + /** + * 瀹氫箟浣跨敤鐨勭畻娉曚负:PBEWITHMD5andDES绠楁硶 + */ + public static final String ALGORITHM = "PBEWithMD5AndDES";//鍔犲瘑绠楁硶 + public static final String Salt = "63293188";//瀵嗛挜 + + /** + * 瀹氫箟杩唬娆℃暟涓1000娆 + */ + private static final int ITERATIONCOUNT = 1000; + + /** + * 鑾峰彇鍔犲瘑绠楁硶涓娇鐢ㄧ殑鐩愬,瑙e瘑涓娇鐢ㄧ殑鐩愬煎繀椤讳笌鍔犲瘑涓娇鐢ㄧ殑鐩稿悓鎵嶈兘瀹屾垚鎿嶄綔. 鐩愰暱搴﹀繀椤讳负8瀛楄妭 + * + * @return byte[] 鐩愬 + * */ + public static byte[] getSalt() throws Exception { + // 瀹炰緥鍖栧畨鍏ㄩ殢鏈烘暟 + SecureRandom random = new SecureRandom(); + // 浜у嚭鐩 + return random.generateSeed(8); + } + + public static byte[] getStaticSalt() { + // 浜у嚭鐩 + return Salt.getBytes(); + } + + /** + * 鏍规嵁PBE瀵嗙爜鐢熸垚涓鎶婂瘑閽 + * + * @param password + * 鐢熸垚瀵嗛挜鏃舵墍浣跨敤鐨勫瘑鐮 + * @return Key PBE绠楁硶瀵嗛挜 + * */ + private static Key getPBEKey(String password) { + // 瀹炰緥鍖栦娇鐢ㄧ殑绠楁硶 + SecretKeyFactory keyFactory; + SecretKey secretKey = null; + try { + keyFactory = SecretKeyFactory.getInstance(ALGORITHM); + // 璁剧疆PBE瀵嗛挜鍙傛暟 + PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); + // 鐢熸垚瀵嗛挜 + secretKey = keyFactory.generateSecret(keySpec); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return secretKey; + } + + /** + * 鍔犲瘑鏄庢枃瀛楃涓 + * + * @param plaintext + * 寰呭姞瀵嗙殑鏄庢枃瀛楃涓 + * @param password + * 鐢熸垚瀵嗛挜鏃舵墍浣跨敤鐨勫瘑鐮 + * @param salt + * 鐩愬 + * @return 鍔犲瘑鍚庣殑瀵嗘枃瀛楃涓 + * @throws Exception + */ + public static String encrypt(String plaintext, String password, byte[] salt) { + + Key key = getPBEKey(password); + byte[] encipheredData = null; + PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, ITERATIONCOUNT); + try { + Cipher cipher = Cipher.getInstance(ALGORITHM); + + cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec); + + encipheredData = cipher.doFinal(plaintext.getBytes()); + } catch (Exception e) { + } + return bytesToHexString(encipheredData); + } + + /** + * 瑙e瘑瀵嗘枃瀛楃涓 + * + * @param ciphertext + * 寰呰В瀵嗙殑瀵嗘枃瀛楃涓 + * @param password + * 鐢熸垚瀵嗛挜鏃舵墍浣跨敤鐨勫瘑鐮(濡傞渶瑙e瘑,璇ュ弬鏁伴渶瑕佷笌鍔犲瘑鏃朵娇鐢ㄧ殑涓鑷) + * @param salt + * 鐩愬(濡傞渶瑙e瘑,璇ュ弬鏁伴渶瑕佷笌鍔犲瘑鏃朵娇鐢ㄧ殑涓鑷) + * @return 瑙e瘑鍚庣殑鏄庢枃瀛楃涓 + * @throws Exception + */ + public static String decrypt(String ciphertext, String password, byte[] salt) { + + Key key = getPBEKey(password); + byte[] passDec = null; + PBEParameterSpec parameterSpec = new PBEParameterSpec(getStaticSalt(), ITERATIONCOUNT); + try { + Cipher cipher = Cipher.getInstance(ALGORITHM); + + cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec); + + passDec = cipher.doFinal(hexStringToBytes(ciphertext)); + } + + catch (Exception e) { + // TODO: handle exception + } + return new String(passDec); + } + + /** + * 灏嗗瓧鑺傛暟缁勮浆鎹负鍗佸叚杩涘埗瀛楃涓 + * + * @param src + * 瀛楄妭鏁扮粍 + * @return + */ + public static String bytesToHexString(byte[] src) { + StringBuilder stringBuilder = new StringBuilder(""); + if (src == null || src.length <= 0) { + return null; + } + for (int i = 0; i < src.length; i++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + if (hv.length() < 2) { + stringBuilder.append(0); + } + stringBuilder.append(hv); + } + return stringBuilder.toString(); + } + + /** + * 灏嗗崄鍏繘鍒跺瓧绗︿覆杞崲涓哄瓧鑺傛暟缁 + * + * @param hexString + * 鍗佸叚杩涘埗瀛楃涓 + * @return + */ + public static byte[] hexStringToBytes(String hexString) { + if (hexString == null || hexString.equals("")) { + return null; + } + hexString = hexString.toUpperCase(); + int length = hexString.length() / 2; + char[] hexChars = hexString.toCharArray(); + byte[] d = new byte[length]; + for (int i = 0; i < length; i++) { + int pos = i * 2; + d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); + } + return d; + } + + private static byte charToByte(char c) { + return (byte) "0123456789ABCDEF".indexOf(c); + } + + public static void main(String[] args) { + int i=10; + for (int j = 0; j < i; j++) { + if((j)%3==0) + { + System.out.print("
    "); + } + else { + System.out.print(j); + } + } + System.out.print(-1%2==0); + String str = "admin"; + String password = "123456"; + + org.jeecgframework.core.util.LogUtil.info("鏄庢枃:" + str); + org.jeecgframework.core.util.LogUtil.info("瀵嗙爜:" + password); + + try { + byte[] salt = PasswordUtil.getStaticSalt(); + String ciphertext = PasswordUtil.encrypt(str, password, salt); + org.jeecgframework.core.util.LogUtil.info("瀵嗘枃:" + ciphertext); + String plaintext = PasswordUtil.decrypt(ciphertext, password, salt); + org.jeecgframework.core.util.LogUtil.info("鏄庢枃:" + plaintext); + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/util/PinyinUtil.java b/src/main/java/org/jeecgframework/core/util/PinyinUtil.java new file mode 100644 index 00000000..4168d12f --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/PinyinUtil.java @@ -0,0 +1,737 @@ +package org.jeecgframework.core.util; + +import java.util.HashSet; +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; + +/** + * + * java姹夊瓧杞嫾闊虫搷浣滃伐鍏风被 + */ + +public class PinyinUtil { + + /** + * + * 灏嗗瓧绗︿覆杞崲鎴愭嫾闊虫暟缁 + * + * + * + * @param src + * + * @return + */ + + public static String[] stringToPinyin(String src) { + + return stringToPinyin(src, false, null); + + } + + /** + * + * 灏嗗瓧绗︿覆杞崲鎴愭嫾闊虫暟缁 + * + * + * + * @param src + * + * @return + */ + + public static String[] stringToPinyin(String src, String separator) { + + return stringToPinyin(src, true, separator); + + } + + /** + * + * 灏嗗瓧绗︿覆杞崲鎴愭嫾闊虫暟缁 + * + * + * + * @param src + * + * @param isPolyphone + * + * 鏄惁鏌ュ嚭澶氶煶瀛楃殑鎵鏈夋嫾闊 + * + * @param separator + * + * 澶氶煶瀛楁嫾闊充箣闂寸殑鍒嗛殧绗 + * + * @return + */ + + public static String[] stringToPinyin(String src, boolean isPolyphone, + + String separator) { + + // 鍒ゆ柇瀛楃涓叉槸鍚︿负绌 + + if ("".equals(src) || null == src) { + + return null; + + } + + char[] srcChar = src.toCharArray(); + + int srcCount = srcChar.length; + + String[] srcStr = new String[srcCount]; + + for (int i = 0; i < srcCount; i++) { + + srcStr[i] = charToPinyin(srcChar[i], isPolyphone, separator); + + } + + return srcStr; + + } + + /** + * + * 灏嗗崟涓瓧绗﹁浆鎹㈡垚鎷奸煶 + * + * + * + * @param src + * + * @return + */ + + public static String charToPinyin(char src, boolean isPolyphone, + + String separator) { + + // 鍒涘缓姹夎鎷奸煶澶勭悊绫 + + HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); + + // 杈撳嚭璁剧疆锛屽ぇ灏忓啓锛岄煶鏍囨柟寮 + + defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); + + defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + + StringBuffer tempPinying = new StringBuffer(); + + // 濡傛灉鏄腑鏂 + + if (src > 128) { + + try { + + // 杞崲寰楀嚭缁撴灉 + + String[] strs = PinyinHelper.toHanyuPinyinStringArray(src, + + defaultFormat); + + // 鏄惁鏌ュ嚭澶氶煶瀛楋紝榛樿鏄煡鍑哄闊冲瓧鐨勭涓涓瓧绗 + + if (isPolyphone && null != separator) { + + for (int i = 0; i < strs.length; i++) { + + tempPinying.append(strs[i]); + + if (strs.length != (i + 1)) { + + // 澶氶煶瀛椾箣闂寸敤鐗规畩绗﹀彿闂撮殧璧锋潵 + + tempPinying.append(separator); + + } + + } + + } else { + + tempPinying.append(strs[0]); + + } + + } catch (BadHanyuPinyinOutputFormatCombination e) { + + e.printStackTrace(); + + } + + } else { + + tempPinying.append(src); + + } + + return tempPinying.toString(); + + } + + public static String hanziToPinyin(String hanzi) { + + return hanziToPinyin(hanzi, " "); + + } + + /** + * + * 灏嗘眽瀛楄浆鎹㈡垚鎷奸煶 + * + * @param hanzi + * + * @param separator + * + * @return + */ + + @SuppressWarnings("deprecation") + public static String hanziToPinyin(String hanzi, String separator) { + + // 鍒涘缓姹夎鎷奸煶澶勭悊绫 + + HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); + + // 杈撳嚭璁剧疆锛屽ぇ灏忓啓锛岄煶鏍囨柟寮 + + defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); + + defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + + String pinyingStr = ""; + + try { + + pinyingStr = PinyinHelper.toHanyuPinyinString(hanzi, defaultFormat, + separator); + + } catch (BadHanyuPinyinOutputFormatCombination e) { + + e.printStackTrace(); + + } + + return pinyingStr; + + } + + /** + * + * 灏嗗瓧绗︿覆鏁扮粍杞崲鎴愬瓧绗︿覆 + * + * @param str + * + * @param separator + * 鍚勪釜瀛楃涓蹭箣闂寸殑鍒嗛殧绗 + * + * @return + */ + + public static String stringArrayToString(String[] str, String separator) { + + StringBuffer sb = new StringBuffer(); + + for (int i = 0; i < str.length; i++) { + + sb.append(str[i]); + + if (str.length != (i + 1)) { + + sb.append(separator); + + } + + } + + return sb.toString(); + + } + + /** + * + * 绠鍗曠殑灏嗗悇涓瓧绗︽暟缁勪箣闂磋繛鎺ヨ捣鏉 + * + * @param str + * + * @return + */ + + public static String stringArrayToString(String[] str) { + + return stringArrayToString(str, ""); + + } + + /** + * + * 灏嗗瓧绗︽暟缁勮浆鎹㈡垚瀛楃涓 + * + * @param str + * + * @param separator + * 鍚勪釜瀛楃涓蹭箣闂寸殑鍒嗛殧绗 + * + * @return + */ + + public static String charArrayToString(char[] ch, String separator) { + + StringBuffer sb = new StringBuffer(); + + for (int i = 0; i < ch.length; i++) { + + sb.append(ch[i]); + + if (ch.length != (i + 1)) { + + sb.append(separator); + + } + + } + + return sb.toString(); + + } + + /** + * + * 灏嗗瓧绗︽暟缁勮浆鎹㈡垚瀛楃涓 + * + * @param str + * + * @return + */ + + public static String charArrayToString(char[] ch) { + + return charArrayToString(ch, " "); + + } + + /** + * + * 鍙栨眽瀛楃殑棣栧瓧姣 + * + * @param src + * + * @param isCapital + * 鏄惁鏄ぇ鍐 + * + * @return + */ + + public static char[] getHeadByChar(char src, boolean isCapital) { + + // 濡傛灉涓嶆槸姹夊瓧鐩存帴杩斿洖 + + if (src <= 128) { + + return new char[] { src }; + + } + + // 鑾峰彇鎵鏈夌殑鎷奸煶 + + String[] pinyingStr = PinyinHelper.toHanyuPinyinStringArray(src); + + // 鍒涘缓杩斿洖瀵硅薄 + + int polyphoneSize = pinyingStr.length; + + char[] headChars = new char[polyphoneSize]; + + int i = 0; + + // 鎴彇棣栧瓧绗 + + for (String s : pinyingStr) { + + char headChar = s.charAt(0); + + // 棣栧瓧姣嶆槸鍚﹀ぇ鍐欙紝榛樿鏄皬鍐 + + if (isCapital) { + + headChars[i] = Character.toUpperCase(headChar); + + } else { + + headChars[i] = headChar; + + } + + i++; + + } + + return headChars; + + } + + /** + * + * 鍙栨眽瀛楃殑棣栧瓧姣(榛樿鏄ぇ鍐) + * + * @param src + * + * @return + */ + + public static char[] getHeadByChar(char src) { + + return getHeadByChar(src, true); + + } + + /** + * + * 鏌ユ壘瀛楃涓查瀛楁瘝 + * + * @param src + * + * @return + */ + + public static String[] getHeadByString(String src) { + + return getHeadByString(src, true); + + } + + /** + * + * 鏌ユ壘瀛楃涓查瀛楁瘝 + * + * @param src + * + * @param isCapital + * 鏄惁澶у啓 + * + * @return + */ + + public static String[] getHeadByString(String src, boolean isCapital) { + + return getHeadByString(src, isCapital, null); + + } + + /** + * + * 鏌ユ壘瀛楃涓查瀛楁瘝 + * + * @param src + * + * @param isCapital + * 鏄惁澶у啓 + * + * @param separator + * 鍒嗛殧绗 + * + * @return + */ + + public static String[] getHeadByString(String src, boolean isCapital, + String separator) { + + char[] chars = src.toCharArray(); + + String[] headString = new String[chars.length]; + + int i = 0; + + for (char ch : chars) { + + char[] chs = getHeadByChar(ch, isCapital); + + StringBuffer sb = new StringBuffer(); + + if (null != separator) { + + int j = 1; + + for (char ch1 : chs) { + + sb.append(ch1); + + if (j != chs.length) { + + sb.append(separator); + + } + + j++; + + } + + } else { + + sb.append(chs[0]); + + } + + headString[i] = sb.toString(); + + i++; + + } + + return headString; + + } + + /** + * 灏嗘眽瀛楄浆鎹负鍏ㄦ嫾 + * + * @param src + * @return String + */ + public static String getPinYin(String src) { + char[] t1 = null; + t1 = src.toCharArray(); + // org.jeecgframework.core.util.LogUtil.info(t1.length); + String[] t2 = new String[t1.length]; + // org.jeecgframework.core.util.LogUtil.info(t2.length); + // 璁剧疆姹夊瓧鎷奸煶杈撳嚭鐨勬牸寮 + HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat(); + t3.setCaseType(HanyuPinyinCaseType.LOWERCASE); + t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + t3.setVCharType(HanyuPinyinVCharType.WITH_V); + String t4 = ""; + int t0 = t1.length; + try { + for (int i = 0; i < t0; i++) { + // 鍒ゆ柇鑳藉惁涓烘眽瀛楀瓧绗 + // org.jeecgframework.core.util.LogUtil.info(t1[i]); + if (Character.toString(t1[i]).matches("[\\u4E00-\\u9FA5]+")) { + t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3);// 灏嗘眽瀛楃殑鍑犵鍏ㄦ嫾閮藉瓨鍒皌2鏁扮粍涓 + t4 += t2[0];// 鍙栧嚭璇ユ眽瀛楀叏鎷肩殑绗竴绉嶈闊冲苟杩炴帴鍒板瓧绗︿覆t4鍚 + } else { + // 濡傛灉涓嶆槸姹夊瓧瀛楃锛岄棿鎺ュ彇鍑哄瓧绗﹀苟杩炴帴鍒板瓧绗︿覆t4鍚 + t4 += Character.toString(t1[i]); + } + } + } catch (BadHanyuPinyinOutputFormatCombination e) { + e.printStackTrace(); + } + return t4; + } + + /** + * 鎻愬彇姣忎釜姹夊瓧鐨勯瀛楁瘝 + * + * @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; + } + + /** + * 灏嗗瓧绗︿覆杞崲鎴怉SCII鐮 + * + * @param cnStr + * @return String + */ + public static String getCnASCII(String cnStr) { + StringBuffer strBuf = new StringBuffer(); + // 灏嗗瓧绗︿覆杞崲鎴愬瓧鑺傚簭鍒 + byte[] bGBK = cnStr.getBytes(); + for (int i = 0; i < bGBK.length; i++) { + // org.jeecgframework.core.util.LogUtil.info(Integer.toHexString(bGBK[i] & 0xff)); + // 灏嗘瘡涓瓧绗﹁浆鎹㈡垚ASCII鐮 + strBuf.append(Integer.toHexString(bGBK[i] & 0xff)); + } + return strBuf.toString(); + } + + /** + * 姹夊瓧杞崲浣嶆眽璇嫾闊抽瀛楁瘝锛岃嫳鏂囧瓧绗︿笉鍙 + * + * @param chines + * 姹夊瓧 + * @return 鎷奸煶 + */ + public static String converterToFirstSpell(String chines) { + String pinyinName = ""; + char[] nameChar = chines.toCharArray(); + HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); + defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); + defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + for (int i = 0; i < nameChar.length; i++) { + if (nameChar[i] > 128) { + try { + pinyinName += PinyinHelper.toHanyuPinyinStringArray( + nameChar[i], defaultFormat)[0].charAt(0); + } catch (BadHanyuPinyinOutputFormatCombination e) { + e.printStackTrace(); + } + } else { + pinyinName += nameChar[i]; + } + } + return pinyinName; + } + + /** + * 姹夊瓧杞崲浣嶆眽璇嫾闊筹紝鑻辨枃瀛楃涓嶅彉 + * + * @param chines + * 姹夊瓧 + * @return 鎷奸煶 + */ + public static String converterToSpell(String chines) { + String pinyinName = ""; + char[] nameChar = chines.toCharArray(); + HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); + defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); + defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + for (int i = 0; i < nameChar.length; i++) { + if (nameChar[i] > 128) { + try { + pinyinName += PinyinHelper.toHanyuPinyinStringArray( + nameChar[i], defaultFormat)[0]; + } catch (BadHanyuPinyinOutputFormatCombination e) { + e.printStackTrace(); + } + } else { + pinyinName += nameChar[i]; + } + } + return pinyinName; + } + + /** + * 瀛楃涓查泦鍚堣浆鎹㈠瓧绗︿覆(閫楀彿鍒嗛殧) + * + * @author wyh + * @param stringSet + * @return + */ + public static String makeStringByStringSet(Set stringSet) { + StringBuilder str = new StringBuilder(); + int i = 0; + for (String s : stringSet) { + if (i == stringSet.size() - 1) { + str.append(s); + } else { + str.append(s + ","); + } + i++; + } + return str.toString().toLowerCase(); + } + + /** + * 鑾峰彇鎷奸煶闆嗗悎 + * + * @author wyh + * @param src + * @return Set + */ + public static Set getPinyin(String src) { + if (src != null && !src.trim().equalsIgnoreCase("")) { + char[] srcChar; + srcChar = src.toCharArray(); + // 姹夎鎷奸煶鏍煎紡杈撳嚭绫 + HanyuPinyinOutputFormat hanYuPinOutputFormat = new HanyuPinyinOutputFormat(); + + // 杈撳嚭璁剧疆锛屽ぇ灏忓啓锛岄煶鏍囨柟寮忕瓑 + hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); + hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V); + + String[][] temp = new String[src.length()][]; + for (int i = 0; i < srcChar.length; i++) { + char c = srcChar[i]; + // 鏄腑鏂囨垨鑰卆-z鎴栬匒-Z杞崲鎷奸煶(鎴戠殑闇姹傦紝鏄繚鐣欎腑鏂囨垨鑰卆-z鎴栬匒-Z) + if (String.valueOf(c).matches("[\\u4E00-\\u9FA5]+")) { + try { + temp[i] = PinyinHelper.toHanyuPinyinStringArray( + srcChar[i], hanYuPinOutputFormat); + } catch (BadHanyuPinyinOutputFormatCombination e) { + e.printStackTrace(); + } + } else if (((int) c >= 65 && (int) c <= 90) + || ((int) c >= 97 && (int) c <= 122)) { + temp[i] = new String[] { String.valueOf(srcChar[i]) }; + } else { + temp[i] = new String[] { "" }; + } + } + String[] pingyinArray = Exchange(temp); + Set pinyinSet = new HashSet(); + for (int i = 0; i < pingyinArray.length; i++) { + pinyinSet.add(pingyinArray[i]); + } + return pinyinSet; + } + return null; + } + + /** + * 閫掑綊 + * + * @author wyh + * @param strJaggedArray + * @return + */ + public static String[] Exchange(String[][] strJaggedArray) { + String[][] temp = DoExchange(strJaggedArray); + return temp[0]; + } + + /** + * 閫掑綊 + * + * @author wyh + * @param strJaggedArray + * @return + */ + private static String[][] DoExchange(String[][] strJaggedArray) { + int len = strJaggedArray.length; + if (len >= 2) { + int len1 = strJaggedArray[0].length; + int len2 = strJaggedArray[1].length; + int newlen = len1 * len2; + String[] temp = new String[newlen]; + int Index = 0; + for (int i = 0; i < len1; i++) { + for (int j = 0; j < len2; j++) { + temp[Index] = strJaggedArray[0][i] + strJaggedArray[1][j]; + Index++; + } + } + String[][] newArray = new String[len - 1][]; + for (int i = 2; i < len; i++) { + newArray[i - 1] = strJaggedArray[i]; + } + newArray[0] = temp; + return DoExchange(newArray); + } else { + return strJaggedArray; + } + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/util/PluginConfigCreator.java b/src/main/java/org/jeecgframework/core/util/PluginConfigCreator.java new file mode 100644 index 00000000..0b5ea4ef --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/PluginConfigCreator.java @@ -0,0 +1,85 @@ +package org.jeecgframework.core.util; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * MyEclipse9 鎻掍欢閰嶇疆浠g爜鐢熸垚鍣 + * + * + */ +public class PluginConfigCreator { + public PluginConfigCreator() { + } + + public void print(String path) { + List list = getFileList(path); + if (list == null) { + return; + } + int length = list.size(); + for (int i = 0; i < length; i++) { + String result = ""; + String thePath = getFormatPath(getString(list.get(i))); + File file = new File(thePath); + if (file.isDirectory()) { + String fileName = file.getName(); + if (fileName.indexOf("_") < 0) { + print(thePath); + continue; + } + String[] filenames = fileName.split("_"); + String filename1 = filenames[0]; + String filename2 = filenames[1]; + result = filename1 + "," + filename2 + ",file:/" + path + "/" + fileName + "//,4,false"; + org.jeecgframework.core.util.LogUtil.info(result); + } else if (file.isFile()) { + String fileName = file.getName(); + if (fileName.indexOf("_") < 0) { + continue; + } + int last = fileName.lastIndexOf("_");// 鏈鍚庝竴涓笅鍒掔嚎鐨勪綅缃 + String filename1 = fileName.substring(0, last); + String filename2 = fileName.substring(last + 1, fileName.length() - 4); + result = filename1 + "," + filename2 + ",file:/" + path + "/" + fileName + ",4,false"; + org.jeecgframework.core.util.LogUtil.info(result); + } + } + } + + public List getFileList(String path) { + path = getFormatPath(path); + path = path + "/"; + File filePath = new File(path); + if (!filePath.isDirectory()) { + return null; + } + String[] filelist = filePath.list(); + List filelistFilter = new ArrayList(); + for (int i = 0; i < filelist.length; i++) { + String tempfilename = getFormatPath(path + filelist[i]); + filelistFilter.add(tempfilename); + } + return filelistFilter; + } + + public String getString(Object object) { + if (object == null) { + return ""; + } + return String.valueOf(object); + } + + public String getFormatPath(String path) { + path = path.replaceAll("////", "/"); + path = path.replaceAll("//", "/"); + return path; + } + + public static void main(String[] args) { + /* 浣犵殑鎻掍欢鐨勫畨瑁呯洰褰 */ + String plugin = "D:\\worksoft\\MyEclipse\\myplugins\\svn"; + new PluginConfigCreator().print(plugin); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/util/PropertiesUtil.java b/src/main/java/org/jeecgframework/core/util/PropertiesUtil.java new file mode 100644 index 00000000..445eedb9 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/PropertiesUtil.java @@ -0,0 +1,104 @@ +package org.jeecgframework.core.util; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Properties; + +/** + * + * @author 寮犱唬娴 + * + */ +public class PropertiesUtil { + private String properiesName = ""; + + public PropertiesUtil() { + + } + public PropertiesUtil(String fileName) { + this.properiesName = fileName; + } + public String readProperty(String key) { + String value = ""; + InputStream is = null; + try { + is = PropertiesUtil.class.getClassLoader().getResourceAsStream( + properiesName); + Properties p = new Properties(); + p.load(is); + value = p.getProperty(key); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + try { + is.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return value; + } + + public Properties getProperties() { + Properties p = new Properties(); + InputStream is = null; + try { + is = PropertiesUtil.class.getClassLoader().getResourceAsStream( + properiesName); + p.load(is); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + try { + is.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return p; + } + + public void writeProperty(String key, String value) { + InputStream is = null; + OutputStream os = null; + Properties p = new Properties(); + try { + is = new FileInputStream(properiesName); + p.load(is); + os = new FileOutputStream(PropertiesUtil.class.getClassLoader().getResource(properiesName).getFile()); + + p.setProperty(key, value); + p.store(os, key); + os.flush(); + os.close(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + try { + if (null != is) + is.close(); + if (null != os) + os.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + + public static void main(String[] args) { + PropertiesUtil p = new PropertiesUtil("sysConfig.properties"); + p.writeProperty("namess", "wang"); + org.jeecgframework.core.util.LogUtil.info(p.readProperty("namess")); + } + +} diff --git a/src/main/java/org/jeecgframework/core/util/ReflectHelper.java b/src/main/java/org/jeecgframework/core/util/ReflectHelper.java new file mode 100644 index 00000000..3e4f5b22 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/ReflectHelper.java @@ -0,0 +1,110 @@ +package org.jeecgframework.core.util; + +import java.lang.reflect.Method; +import java.util.Hashtable; +import java.util.regex.Pattern; + +/** + * @author 寮犱唬娴 + * @desc 閫氳繃鍙嶅皠鏉ュ姩鎬佽皟鐢╣et 鍜 set 鏂规硶 + */ +public class ReflectHelper { + + private Class cls; + /** + * 浼犺繃鏉ョ殑瀵硅薄 + */ + private Object obj; + + /** + * 瀛樻斁get鏂规硶 + */ + private Hashtable getMethods = null; + /** + * 瀛樻斁set鏂规硶 + */ + private Hashtable setMethods = null; + + /** + * 瀹氫箟鏋勯犳柟娉 -- 涓鑸潵璇存槸涓猵ojo + * + * @param o + * 鐩爣瀵硅薄 + */ + public ReflectHelper(Object o) { + obj = o; + initMethods(); + } + + /** + * + * @desc 鍒濆鍖 + */ + public void initMethods() { + getMethods = new Hashtable(); + setMethods = new Hashtable(); + cls = obj.getClass(); + Method[] methods = cls.getMethods(); + // 瀹氫箟姝e垯琛ㄨ揪寮忥紝浠庢柟娉曚腑杩囨护鍑篻etter / setter 鍑芥暟. + String gs = "get(\\w+)"; + Pattern getM = Pattern.compile(gs); + String ss = "set(\\w+)"; + Pattern setM = Pattern.compile(ss); + // 鎶婃柟娉曚腑鐨"set" 鎴栬 "get" 鍘绘帀 + String rapl = "$1"; + String param; + for (int i = 0; i < methods.length; ++i) { + Method m = methods[i]; + String methodName = m.getName(); + if (Pattern.matches(gs, methodName)) { + param = getM.matcher(methodName).replaceAll(rapl).toLowerCase(); + getMethods.put(param, m); + } else if (Pattern.matches(ss, methodName)) { + param = setM.matcher(methodName).replaceAll(rapl).toLowerCase(); + setMethods.put(param, m); + } else { + // org.jeecgframework.core.util.LogUtil.info(methodName + " 涓嶆槸getter,setter鏂规硶锛"); + } + } + } + + /** + * + * @desc 璋冪敤set鏂规硶 + */ + public boolean setMethodValue(String property,Object object) { + Method m = setMethods.get(property.toLowerCase()); + if (m != null) { + try { + // 璋冪敤鐩爣绫荤殑setter鍑芥暟 + m.invoke(obj, object); + return true; + } catch (Exception ex) { + org.jeecgframework.core.util.LogUtil.info("invoke getter on " + property + " error: " + ex.toString()); + return false; + } + } + return false; + } + + /** + * + * @desc 璋冪敤set鏂规硶 + */ + public Object getMethodValue(String property) { + Object value=null; + Method m = getMethods.get(property.toLowerCase()); + if (m != null) { + try { + /** + * 璋冪敤obj绫荤殑setter鍑芥暟 + */ + value=m.invoke(obj, new Object[] {}); + + } catch (Exception ex) { + org.jeecgframework.core.util.LogUtil.info("invoke getter on " + property + " error: " + ex.toString()); + } + } + return value; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/util/ResourceUtil.java b/src/main/java/org/jeecgframework/core/util/ResourceUtil.java new file mode 100644 index 00000000..a632f65e --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/ResourceUtil.java @@ -0,0 +1,240 @@ +package org.jeecgframework.core.util; + +import java.util.List; +import java.util.Map; +import java.util.ResourceBundle; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.jeecgframework.core.constant.DataBaseConstant; +import org.jeecgframework.web.system.manager.ClientManager; +import org.jeecgframework.web.system.pojo.base.TSRoleFunction; +import org.jeecgframework.web.system.pojo.base.TSUser; + + +/** + * 椤圭洰鍙傛暟宸ュ叿绫 + * + */ +public class ResourceUtil { + + private static final ResourceBundle bundle = java.util.ResourceBundle.getBundle("sysConfig"); + + /** + * 鑾峰彇session瀹氫箟鍚嶇О + * + * @return + */ + public static final String getSessionattachmenttitle(String sessionName) { + return bundle.getString(sessionName); + } + public static final TSUser getSessionUserName() { + HttpSession session = ContextHolderUtils.getSession(); + if(ClientManager.getInstance().getClient(session.getId())!=null){ + return ClientManager.getInstance().getClient(session.getId()).getUser(); + } + return null; + } + @Deprecated + public static final List getSessionTSRoleFunction(String roleId) { + HttpSession session = ContextHolderUtils.getSession(); + if (session.getAttributeNames().hasMoreElements()) { + List TSRoleFunctionList = (List)session.getAttribute(roleId); + if (TSRoleFunctionList != null) { + return TSRoleFunctionList; + } else { + return null; + } + } else { + return null; + } + } + + /** + * 鑾峰緱璇锋眰璺緞 + * + * @param request + * @return + */ + public static String getRequestPath(HttpServletRequest request) { + String requestPath = request.getRequestURI() + "?" + request.getQueryString(); + if (requestPath.indexOf("&") > -1) {// 鍘绘帀鍏朵粬鍙傛暟 + requestPath = requestPath.substring(0, requestPath.indexOf("&")); + } + requestPath = requestPath.substring(request.getContextPath().length() + 1);// 鍘绘帀椤圭洰璺緞 + return requestPath; + } + + /** + * 鑾峰彇閰嶇疆鏂囦欢鍙傛暟 + * + * @param name + * @return + */ + public static final String getConfigByName(String name) { + return bundle.getString(name); + } + + /** + * 鑾峰彇閰嶇疆鏂囦欢鍙傛暟 + * + * @param name + * @return + */ + public static final Map getConfigMap(String path) { + ResourceBundle bundle = ResourceBundle.getBundle(path); + Set set = bundle.keySet(); + return oConvertUtils.SetToMap(set); + } + + + + public static String getSysPath() { + String path = Thread.currentThread().getContextClassLoader().getResource("").toString(); + String temp = path.replaceFirst("file:/", "").replaceFirst("WEB-INF/classes/", ""); + String separator = System.getProperty("file.separator"); + String resultPath = temp.replaceAll("/", separator + separator).replaceAll("%20", " "); + return resultPath; + } + + /** + * 鑾峰彇椤圭洰鏍圭洰褰 + * + * @return + */ + public static String getPorjectPath() { + String nowpath; // 褰撳墠tomcat鐨刡in鐩綍鐨勮矾寰 濡 + // D:\java\software\apache-tomcat-6.0.14\bin + String tempdir; + nowpath = System.getProperty("user.dir"); + tempdir = nowpath.replace("bin", "webapps"); // 鎶奲in 鏂囦欢澶瑰彉鍒 webapps鏂囦欢閲岄潰 + tempdir += "\\"; // 鎷兼垚D:\java\software\apache-tomcat-6.0.14\webapps\sz_pro + return tempdir; + } + + public static String getClassPath() { + String path = Thread.currentThread().getContextClassLoader().getResource("").toString(); + String temp = path.replaceFirst("file:/", ""); + String separator = System.getProperty("file.separator"); + String resultPath = temp.replaceAll("/", separator + separator); + return resultPath; + } + + public static String getSystempPath() { + return System.getProperty("java.io.tmpdir"); + } + + public static String getSeparator() { + return System.getProperty("file.separator"); + } + + public static String getParameter(String field) { + HttpServletRequest request = ContextHolderUtils.getRequest(); + return request.getParameter(field); + } + + /** + * 鑾峰彇鏁版嵁搴撶被鍨 + * + * @return + * @throws Exception + */ + public static final String getJdbcUrl() { + return DBTypeUtil.getDBType().toLowerCase(); + } + + /** + * 鑾峰彇闅忔満鐮佺殑闀垮害 + * + * @return 闅忔満鐮佺殑闀垮害 + */ + public static String getRandCodeLength() { + return bundle.getString("randCodeLength"); + } + + /** + * 鑾峰彇闅忔満鐮佺殑绫诲瀷 + * + * @return 闅忔満鐮佺殑绫诲瀷 + */ + public static String getRandCodeType() { + return bundle.getString("randCodeType"); + } + + /** + * 鑾峰彇缁勭粐鏈烘瀯缂栫爜闀垮害鐨勭被鍨 + * + * @return 缁勭粐鏈烘瀯缂栫爜闀垮害鐨勭被鍨 + */ + public static String getOrgCodeLengthType() { + return bundle.getString("orgCodeLengthType"); + } + /** + * 鑾峰彇鐢ㄦ埛绯荤粺鍙橀噺 + * @param key + * DataBaseConstant 涓殑鍊 + * @return + */ + public static String getUserSystemData(String key) { + //#{sys_user_code}% + String moshi = ""; + if(key.indexOf("}")!=-1){ + moshi = key.substring(key.indexOf("}")+1); + } + String returnValue = null; + //閽堝鐗规畩鏍囩ず澶勭悊#{sysOrgCode}锛屽垽鏂浛鎹 + if (key.contains("#{")) { + key = key.substring(2,key.indexOf("}")); + } else { + key = key; + } + + //鏇挎崲涓虹郴缁熺殑鐧诲綍鐢ㄦ埛璐﹀彿 +// if (key.equals(DataBaseConstant.CREATE_BY) +// || key.equals(DataBaseConstant.CREATE_BY_TABLE) +// || key.equals(DataBaseConstant.UPDATE_BY) +// || key.equals(DataBaseConstant.UPDATE_BY_TABLE) +// || + if (key.equals(DataBaseConstant.SYS_USER_CODE) + || key.equals(DataBaseConstant.SYS_USER_CODE_TABLE)) { + returnValue = getSessionUserName().getUserName(); + } + //鏇挎崲涓虹郴缁熺櫥褰曠敤鎴风湡瀹炲悕瀛 +// if (key.equals(DataBaseConstant.CREATE_NAME) +// || key.equals(DataBaseConstant.CREATE_NAME_TABLE) +// || key.equals(DataBaseConstant.UPDATE_NAME_TABLE) +// || key.equals(DataBaseConstant.UPDATE_NAME) + if (key.equals(DataBaseConstant.SYS_USER_NAME) + || key.equals(DataBaseConstant.SYS_USER_NAME_TABLE) + ) { + returnValue = getSessionUserName().getRealName(); + } + //鏇挎崲涓虹郴缁熺櫥褰曠敤鎴风殑鍏徃缂栫爜 + if (key.equals(DataBaseConstant.SYS_COMPANY_CODE)|| key.equals(DataBaseConstant.SYS_COMPANY_CODE_TABLE)) { + returnValue = getSessionUserName().getCurrentDepart().getOrgCode() + .substring(0, Integer.valueOf(getOrgCodeLengthType())); + } + //鏇挎崲涓虹郴缁熺敤鎴风櫥褰曟墍浣跨敤鐨勬満鏋勭紪鐮 + if (key.equals(DataBaseConstant.SYS_ORG_CODE)|| key.equals(DataBaseConstant.SYS_ORG_CODE_TABLE)) { + returnValue = getSessionUserName().getCurrentDepart().getOrgCode(); + } + //鏇挎崲涓哄綋鍓嶇郴缁熸椂闂(骞存湀鏃) + if (key.equals(DataBaseConstant.SYS_DATE)|| key.equals(DataBaseConstant.SYS_DATE_TABLE)) { + returnValue = DateUtils.formatDate(); + } + //鏇挎崲涓哄綋鍓嶇郴缁熸椂闂达紙骞存湀鏃ユ椂鍒嗙锛 + if (key.equals(DataBaseConstant.SYS_TIME)|| key.equals(DataBaseConstant.SYS_TIME_TABLE)) { + returnValue = DateUtils.formatTime(); + } + if(returnValue!=null){returnValue = returnValue + moshi;} + return returnValue; + } + + public static void main(String[] args) { + org.jeecgframework.core.util.LogUtil.info(getPorjectPath()); + org.jeecgframework.core.util.LogUtil.info(getSysPath()); + + } +} diff --git a/src/main/java/org/jeecgframework/core/util/RoletoJson.java b/src/main/java/org/jeecgframework/core/util/RoletoJson.java new file mode 100644 index 00000000..4c92a8c7 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/RoletoJson.java @@ -0,0 +1,101 @@ +package org.jeecgframework.core.util; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; + +import org.jeecgframework.web.system.pojo.base.TSRole; + +import org.apache.commons.beanutils.PropertyUtils; +import org.apache.commons.lang.StringUtils; +import org.jeecgframework.core.common.model.json.ComboBox; + +/** + * + * @author 寮犱唬娴 + * + */ +public class RoletoJson { + + /** + * 鎵嬪伐鎷兼帴JSON + */ + public static String getComboBoxJson(List list, List roles) { + StringBuffer buffer = new StringBuffer(); + buffer.append("["); + for (TSRole node : list) { + if (roles.size() > 0) { + buffer.append("{\"id\":" + node.getId() + ",\"text\":\"" + node.getRoleName() + "\""); + for (TSRole node1 : roles) { + if (node.getId() == node1.getId()) { + buffer.append(",\"selected\":true"); + } + } + buffer.append("},"); + } else { + buffer.append("{\"id\":" + node.getId() + ",\"text\":\"" + node.getRoleName() + "\"},"); + } + + } + buffer.append("]"); + + // 灏,\n]鏇挎崲鎴怽n] + + String tmp = buffer.toString(); + tmp = tmp.replaceAll(",]", "]"); + return tmp; + + } + /** + * 鏍规嵁妯″瀷鐢熸垚JSON + */ + public static List getComboBox(List list, List roles) { + StringBuffer buffer = new StringBuffer(); + List comboxBoxs = new ArrayList(); + buffer.append("["); + for (TSRole node : list) { + ComboBox box = new ComboBox(); + box.setId(node.getId().toString()); + box.setText(node.getRoleName()); + if (roles.size() > 0) { + for (TSRole node1 : roles) { + if (node.getId() == node1.getId()) { + box.setSelected(true); + } + } + } + comboxBoxs.add(box); + } + return comboxBoxs; + + } + + /** + * 鏂规硶鎻忚堪: 鍊兼浛鎹㈠伐鍏 + * 浣 鑰咃細 zym + * @param objList + * @param perFieldName + * @param sufFieldName + * @return 鏍煎紡锛歰ld_new,old2_new2 + * 杩斿洖绫诲瀷锛 String + */ + public static String listToReplaceStr(List objList, String perFieldName, String sufFieldName){ + List strList = new ArrayList(); + for (Object object : objList) { + String perStr = null; + String sufStr = null; + try { + perStr = (String)PropertyUtils.getProperty(object, perFieldName); + sufStr = (String)PropertyUtils.getProperty(object, sufFieldName); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + strList.add(perStr + "_" +sufStr); + } + return StringUtils.join(strList, ","); + } +} diff --git a/src/main/java/org/jeecgframework/core/util/SendMailUtil.java b/src/main/java/org/jeecgframework/core/util/SendMailUtil.java new file mode 100644 index 00000000..d859b8cf --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/SendMailUtil.java @@ -0,0 +1,276 @@ +package org.jeecgframework.core.util; + +import java.io.File; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.mail.HtmlEmail; +import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; + +import freemarker.template.Configuration; +import freemarker.template.Template; +/** + * + * @author 寮犱唬娴 + * + */ +public class SendMailUtil +{ + //private static final String smtphost = "192.168.1.70"; + private static final String from = "zhangdh@163.com"; + private static final String fromName = "娴嬭瘯鍏徃"; + private static final String charSet = "utf-8"; + private static final String username = "zhangdh@163.com"; + private static final String password = "123456"; + private static Map hostMap = new HashMap(); + static { + // 126 + hostMap.put("smtp.126", "smtp.126.com"); + // qq + hostMap.put("smtp.qq", "smtp.qq.com"); + + // 163 + hostMap.put("smtp.163", "smtp.163.com"); + + // sina + hostMap.put("smtp.sina", "smtp.sina.com.cn"); + + // tom + hostMap.put("smtp.tom", "smtp.tom.com"); + + // 263 + hostMap.put("smtp.263", "smtp.263.net"); + + // yahoo + hostMap.put("smtp.yahoo", "smtp.mail.yahoo.com"); + + // hotmail + hostMap.put("smtp.hotmail", "smtp.live.com"); + + // gmail + hostMap.put("smtp.gmail", "smtp.gmail.com"); + hostMap.put("smtp.port.gmail", "465"); + } + + public static String getHost(String email) throws Exception { + Pattern pattern = Pattern.compile("\\w+@(\\w+)(\\.\\w+){1,2}"); + Matcher matcher = pattern.matcher(email); + String key = "unSupportEmail"; + if (matcher.find()) { + key = "smtp." + matcher.group(1); + } + if (hostMap.containsKey(key)) { + return hostMap.get(key); + } else { + throw new Exception("unSupportEmail"); + } + } + + public static int getSmtpPort(String email) throws Exception { + Pattern pattern = Pattern.compile("\\w+@(\\w+)(\\.\\w+){1,2}"); + Matcher matcher = pattern.matcher(email); + String key = "unSupportEmail"; + if (matcher.find()) { + key = "smtp.port." + matcher.group(1); + } + if (hostMap.containsKey(key)) { + return Integer.parseInt(hostMap.get(key)); + } else { + return 25; + } + } + + /** + * 鍙戦佹ā鏉块偖浠 + * @param toMailAddr 鏀朵俊浜哄湴鍧 + * @param subject email涓婚 + * @param templatePath 妯℃澘鍦板潃 + * @param map 妯℃澘map + */ + public static void sendFtlMail(String toMailAddr, String subject, + String templatePath, Map map){ + Template template = null; + Configuration freeMarkerConfig = null; + HtmlEmail hemail = new HtmlEmail(); + try { + hemail.setHostName(getHost(from)); + hemail.setSmtpPort(getSmtpPort(from)); + hemail.setCharset(charSet); + hemail.addTo(toMailAddr); + hemail.setFrom(from, fromName); + hemail.setAuthentication(username, password); + hemail.setSubject(subject); + freeMarkerConfig = new Configuration(); + freeMarkerConfig.setDirectoryForTemplateLoading(new File(getFilePath())); + // 鑾峰彇妯℃澘 + template = freeMarkerConfig.getTemplate(getFileName(templatePath),new Locale("Zh_cn"), "UTF-8"); + // 妯℃澘鍐呭杞崲涓簊tring + String htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(template, map); + org.jeecgframework.core.util.LogUtil.info(htmlText); + hemail.setMsg(htmlText); + hemail.send(); + org.jeecgframework.core.util.LogUtil.info("email send true!"); + } catch (Exception e) { + e.printStackTrace(); + org.jeecgframework.core.util.LogUtil.info("email send error!"); + } + } + + /** + * 鍙戦佹櫘閫氶偖浠 + * @param toMailAddr 鏀朵俊浜哄湴鍧 + * @param subject email涓婚 + * @param message 鍙戦乪mail淇℃伅 + */ + public static void sendCommonMail(String toMailAddr, String subject, String message) { + HtmlEmail hemail = new HtmlEmail(); + try { + hemail.setHostName(getHost(from)); + hemail.setSmtpPort(getSmtpPort(from)); + hemail.setCharset(charSet); + hemail.addTo(toMailAddr); + hemail.setFrom(from, fromName); + hemail.setAuthentication(username, password); + hemail.setSubject(subject); + hemail.setMsg(message); + hemail.send(); + org.jeecgframework.core.util.LogUtil.info("email send true!"); + } catch (Exception e) { + e.printStackTrace(); + org.jeecgframework.core.util.LogUtil.info("email send error!"); + } + + } + + public static String getHtmlText(String templatePath, Map map){ + Template template = null; + String htmlText = ""; + try { + Configuration freeMarkerConfig = null; + freeMarkerConfig = new Configuration(); + freeMarkerConfig.setDirectoryForTemplateLoading(new File(getFilePath())); + // 鑾峰彇妯℃澘 + template = freeMarkerConfig.getTemplate(getFileName(templatePath),new Locale("Zh_cn"), "UTF-8"); + // 妯℃澘鍐呭杞崲涓簊tring + htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(template, map); + org.jeecgframework.core.util.LogUtil.info(htmlText); + } catch (Exception e) { + e.printStackTrace(); + } + return htmlText; + } + + + + private static String getFilePath() { + String path = getAppPath(SendMailUtil.class); + path = path + File.separator +"mailtemplate"+File.separator; + path = path.replace("\\", "/"); + org.jeecgframework.core.util.LogUtil.info(path); + return path; + } + + private static String getFileName(String path) { + path = path.replace("\\", "/"); + org.jeecgframework.core.util.LogUtil.info(path); + return path.substring(path.lastIndexOf("/") + 1); + } + + @SuppressWarnings("unchecked") + public static String getAppPath(Class cls) { + // 妫鏌ョ敤鎴蜂紶鍏ョ殑鍙傛暟鏄惁涓虹┖ + if (cls == null) + throw new java.lang.IllegalArgumentException("鍙傛暟涓嶈兘涓虹┖锛"); + ClassLoader loader = cls.getClassLoader(); + // 鑾峰緱绫荤殑鍏ㄥ悕锛屽寘鎷寘鍚 + String clsName = cls.getName() + ".class"; + // 鑾峰緱浼犲叆鍙傛暟鎵鍦ㄧ殑鍖 + Package pack = cls.getPackage(); + String path = ""; + // 濡傛灉涓嶆槸鍖垮悕鍖咃紝灏嗗寘鍚嶈浆鍖栦负璺緞 + if (pack != null) { + String packName = pack.getName(); + // 姝ゅ绠鍗曞垽瀹氭槸鍚︽槸Java鍩虹绫诲簱锛岄槻姝㈢敤鎴蜂紶鍏DK鍐呯疆鐨勭被搴 + if (packName.startsWith("java.") || packName.startsWith("javax.")) + throw new java.lang.IllegalArgumentException("涓嶈浼犻佺郴缁熺被锛"); + // 鍦ㄧ被鐨勫悕绉颁腑锛屽幓鎺夊寘鍚嶇殑閮ㄥ垎锛岃幏寰楃被鐨勬枃浠跺悕 + clsName = clsName.substring(packName.length() + 1); + // 鍒ゅ畾鍖呭悕鏄惁鏄畝鍗曞寘鍚嶏紝濡傛灉鏄紝鍒欑洿鎺ュ皢鍖呭悕杞崲涓鸿矾寰勶紝 + if (packName.indexOf(".") < 0) + path = packName + "/"; + else {// 鍚﹀垯鎸夌収鍖呭悕鐨勭粍鎴愰儴鍒嗭紝灏嗗寘鍚嶈浆鎹负璺緞 + int start = 0, end = 0; + end = packName.indexOf("."); + while (end != -1) { + path = path + packName.substring(start, end) + "/"; + start = end + 1; + end = packName.indexOf(".", start); + } + path = path + packName.substring(start) + "/"; + } + } + // 璋冪敤ClassLoader鐨刧etResource鏂规硶锛屼紶鍏ュ寘鍚矾寰勪俊鎭殑绫绘枃浠跺悕 + java.net.URL url = loader.getResource(path + clsName); + // 浠嶶RL瀵硅薄涓幏鍙栬矾寰勪俊鎭 + String realPath = url.getPath(); + // 鍘绘帀璺緞淇℃伅涓殑鍗忚鍚"file:" + int pos = realPath.indexOf("file:"); + if (pos > -1) + realPath = realPath.substring(pos + 5); + // 鍘绘帀璺緞淇℃伅鏈鍚庡寘鍚被鏂囦欢淇℃伅鐨勯儴鍒嗭紝寰楀埌绫绘墍鍦ㄧ殑璺緞 + pos = realPath.indexOf(path + clsName); + realPath = realPath.substring(0, pos - 1); + // 濡傛灉绫绘枃浠惰鎵撳寘鍒癑AR绛夋枃浠朵腑鏃讹紝鍘绘帀瀵瑰簲鐨凧AR绛夋墦鍖呮枃浠跺悕 + if (realPath.endsWith("!")) + realPath = realPath.substring(0, realPath.lastIndexOf("/")); + /*------------------------------------------------------------ + ClassLoader鐨刧etResource鏂规硶浣跨敤浜唘tf-8瀵硅矾寰勪俊鎭繘琛屼簡缂栫爜锛屽綋璺緞 + 涓瓨鍦ㄤ腑鏂囧拰绌烘牸鏃讹紝浠栦細瀵硅繖浜涘瓧绗﹁繘琛岃浆鎹紝杩欐牱锛屽緱鍒扮殑寰寰涓嶆槸鎴戜滑鎯宠 + 鐨勭湡瀹炶矾寰勶紝鍦ㄦ锛岃皟鐢ㄤ簡URLDecoder鐨刣ecode鏂规硶杩涜瑙g爜锛屼互渚垮緱鍒板師濮嬬殑 + 涓枃鍙婄┖鏍艰矾寰 + -------------------------------------------------------------*/ + try { + realPath = java.net.URLDecoder.decode(realPath, "utf-8"); + } catch (Exception e) { + throw new RuntimeException(e); + } + org.jeecgframework.core.util.LogUtil.info("realPath----->"+realPath); + return realPath; + } +// private static File getFile(String path){ +// File file = SendMail.class.getClassLoader().getResource("mailtemplate/test.ftl").getFile(); +// return file; +// } +// + + + public static void main(String[] args) + { +// HtmlEmail hemail = new HtmlEmail(); +// try { +// hemail.setHostName("smtp.exmail.qq.com"); +// hemail.setCharset("utf-8"); +// hemail.addTo("fly.1206@qq.com"); +// hemail.setFrom("zhoujunfeng@et-bank.com", "鍛ㄤ繆宄"); +// hemail.setAuthentication("zhoujunfeng@et-bank.com", "31415926@aa"); +// hemail.setSubject("sendemail test!"); +// hemail.setMsg("璋锋瓕
    "); +// hemail.send(); +// org.jeecgframework.core.util.LogUtil.info("email send true!"); +// } catch (Exception e) { +// e.printStackTrace(); +// org.jeecgframework.core.util.LogUtil.info("email send error!"); +// } + Map map = new HashMap(); + map.put("subject", "娴嬭瘯鏍囬"); + map.put("content", "娴嬭瘯 鍐呭"); + String templatePath = "mailtemplate/test.ftl"; + sendFtlMail("test@et-bank.com", "sendemail test!",templatePath, map); + +// org.jeecgframework.core.util.LogUtil.info(getFileName("mailtemplate/test.ftl")); + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/util/SetListSort.java b/src/main/java/org/jeecgframework/core/util/SetListSort.java new file mode 100644 index 00000000..3cf97968 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/SetListSort.java @@ -0,0 +1,35 @@ +package org.jeecgframework.core.util; + +import java.util.Comparator; + +import org.jeecgframework.web.system.pojo.base.TSFunction; + + +/** +* @ClassName: SetListSort +* @Description: TODO(int姣旇緝鍣) +* @author 寮犱唬娴 +* @date 2013-1-31 涓嬪崍06:19:03 +* + */ +public class SetListSort implements Comparator { + /** + * 鑿滃崟鎺掑簭姣旇緝鍣 + */ + public int compare(Object o1, Object o2) { + TSFunction c1 = (TSFunction) o1; + TSFunction c2 = (TSFunction) o2; + if (c1.getFunctionOrder() != null && c2.getFunctionOrder() != null) { + int c1order = oConvertUtils.getInt(c1.getFunctionOrder().substring(c1.getFunctionOrder().indexOf("fun")+3)); + int c2order = oConvertUtils.getInt(c2.getFunctionOrder().substring(c2.getFunctionOrder().indexOf("fun"))+3); + if (c1order > c2order) { + return 1; + } else { + return -1; + } + } else { + return 1; + } + + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/util/StreamUtils.java b/src/main/java/org/jeecgframework/core/util/StreamUtils.java new file mode 100644 index 00000000..6a8d77ef --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/StreamUtils.java @@ -0,0 +1,290 @@ +package org.jeecgframework.core.util; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; + +import jodd.io.StringInputStream; + + + +/** + * + * @author Andy.Chen + * @mail Chenjunjun.ZJ@gmail.com + * + */ +public class StreamUtils { + + final static int BUFFER_SIZE = 4096; + /** + * 灏咺nputStream杞崲鎴怱tring + * + * @param in + * InputStream + * @return String + * @throws Exception + * + */ + public static String InputStreamTOString(InputStream in) { + + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + byte[] data = new byte[BUFFER_SIZE]; + String string = null; + int count = 0; + try { + while ((count = in.read(data, 0, BUFFER_SIZE)) != -1) + outStream.write(data, 0, count); + } catch (IOException e) { + e.printStackTrace(); + } + + data = null; + try { + string = new String(outStream.toByteArray(), "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return string; + } + + /** + * 灏咺nputStream杞崲鎴愭煇绉嶅瓧绗︾紪鐮佺殑String + * + * @param in + * @param encoding + * @return + * @throws Exception + */ + public static String InputStreamTOString(InputStream in, String encoding) { + String string = null; + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + byte[] data = new byte[BUFFER_SIZE]; + int count = -1; + try { + while ((count = in.read(data, 0, BUFFER_SIZE)) != -1) + outStream.write(data, 0, count); + } catch (IOException e) { + e.printStackTrace(); + } + + data = null; + try { + string = new String(outStream.toByteArray(), encoding); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return string; + } + + /** + * 灏哠tring杞崲鎴怚nputStream + * + * @param in + * @return + * @throws Exception + */ + public static InputStream StringTOInputStream(String in) throws Exception { + + ByteArrayInputStream is = new ByteArrayInputStream(in.getBytes("UTF-8")); + return is; + } + + /** + * 灏哠tring杞崲鎴怚nputStream + * + * @param in + * @return + * @throws Exception + */ + public static byte[] StringTObyte(String in) { + byte[] bytes = null; + try { + bytes = InputStreamTOByte(StringTOInputStream(in)); + } catch (IOException e) { + } catch (Exception e) { + e.printStackTrace(); + } + return bytes; + } + + /** + * 灏咺nputStream杞崲鎴恇yte鏁扮粍 + * + * @param in + * InputStream + * @return byte[] + * @throws IOException + */ + public static byte[] InputStreamTOByte(InputStream in) throws IOException { + + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + byte[] data = new byte[BUFFER_SIZE]; + int count = -1; + while ((count = in.read(data, 0, BUFFER_SIZE)) != -1) + outStream.write(data, 0, count); + + data = null; + return outStream.toByteArray(); + } + + /** + * 灏哹yte鏁扮粍杞崲鎴怚nputStream + * + * @param in + * @return + * @throws Exception + */ + public static InputStream byteTOFInputStream(byte[] in) throws Exception { + + InputStream is = new StringInputStream(InputStreamTOString(StreamUtils.byteTOInputStream(in))); + return is; + } + /** + * 灏哹yte鏁扮粍杞崲鎴怚nputStream + * + * @param in + * @return + * @throws Exception + */ + public static InputStream byteTOInputStream(byte[] in) throws Exception { + + ByteArrayInputStream is = new ByteArrayInputStream(in); + return is; + } + + /** + * 灏哹yte鏁扮粍杞崲鎴怱tring + * + * @param in + * @return + * @throws Exception + */ + public static String byteTOString(byte[] in) { + + InputStream is = null; + try { + is = byteTOInputStream(in); + } catch (Exception e) { + e.printStackTrace(); + } + return InputStreamTOString(is, "UTF-8"); + } + /** + * 灏哹yte鏁扮粍杞崲鎴怱tring + * + * @param in + * @return + * @throws Exception + */ + public static String getString(String in) { + + String is = null; + try { + is = byteTOString(StringTObyte(in)); + } catch (Exception e) { + e.printStackTrace(); + } + return is; + } + + // InputStream 杞崲鎴恇yte[] + public byte[] getBytes(InputStream is) throws IOException { + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] b = new byte[BUFFER_SIZE]; + int len = 0; + + while ((len = is.read(b, 0, BUFFER_SIZE)) != -1) { + baos.write(b, 0, len); + } + + baos.flush(); + + byte[] bytes = baos.toByteArray(); + + org.jeecgframework.core.util.LogUtil.info(new String(bytes)); + + return bytes; + } + /** + * 鏍规嵁鏂囦欢璺緞鍒涘缓鏂囦欢杈撳叆娴佸鐞 + * 浠ュ瓧鑺備负鍗曚綅锛堥潪 unicode 锛 + * @param path + * @return + */ + public static FileInputStream getFileInputStream(String filepath) { + FileInputStream fileInputStream = null; + try { + fileInputStream = new FileInputStream(filepath); + } catch (FileNotFoundException e) { + System.out.print("閿欒淇℃伅:鏂囦欢涓嶅瓨鍦"); + e.printStackTrace(); + } + return fileInputStream; + } + /** + * 鏍规嵁鏂囦欢瀵硅薄鍒涘缓鏂囦欢杈撳叆娴佸鐞 + * 浠ュ瓧鑺備负鍗曚綅锛堥潪 unicode 锛 + * @param path + * @return + */ + public static FileInputStream getFileInputStream(File file) { + FileInputStream fileInputStream = null; + try { + fileInputStream = new FileInputStream(file); + } catch (FileNotFoundException e) { + System.out.print("閿欒淇℃伅:鏂囦欢涓嶅瓨鍦"); + e.printStackTrace(); + } + return fileInputStream; + } + /** + * 鏍规嵁鏂囦欢瀵硅薄鍒涘缓鏂囦欢杈撳嚭娴佸鐞 + * 浠ュ瓧鑺備负鍗曚綅锛堥潪 unicode 锛 + * @param file + * @param append true:鏂囦欢浠ヨ拷鍔犳柟寮忔墦寮,false:鍒欒鐩栧師鏂囦欢鐨勫唴瀹 + * @return + */ + public static FileOutputStream getFileOutputStream(File file,boolean append) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(file,append); + } catch (FileNotFoundException e) { + System.out.print("閿欒淇℃伅:鏂囦欢涓嶅瓨鍦"); + e.printStackTrace(); + } + return fileOutputStream; + } + /** + * 鏍规嵁鏂囦欢璺緞鍒涘缓鏂囦欢杈撳嚭娴佸鐞 + * 浠ュ瓧鑺備负鍗曚綅锛堥潪 unicode 锛 + * @param path + * @param append true:鏂囦欢浠ヨ拷鍔犳柟寮忔墦寮,false:鍒欒鐩栧師鏂囦欢鐨勫唴瀹 + * @return + */ + public static FileOutputStream getFileOutputStream(String filepath,boolean append) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(filepath,append); + } catch (FileNotFoundException e) { + System.out.print("閿欒淇℃伅:鏂囦欢涓嶅瓨鍦"); + e.printStackTrace(); + } + return fileOutputStream; + } + + public static File getFile(String filepath) { + return new File(filepath); + } + public static ByteArrayOutputStream getByteArrayOutputStream() { + return new ByteArrayOutputStream(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/util/StringUtil.java b/src/main/java/org/jeecgframework/core/util/StringUtil.java new file mode 100644 index 00000000..2c58a760 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/StringUtil.java @@ -0,0 +1,1824 @@ +package org.jeecgframework.core.util; + +import java.beans.XMLDecoder; +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang.RandomStringUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.io.HTMLWriter; +import org.dom4j.io.OutputFormat; + +/** + * 瀛楃涓插鐞嗗強杞崲宸ュ叿绫 + * @author 寮犱唬娴 + */ +public class StringUtil { + private static Pattern numericPattern = Pattern.compile("^[0-9\\-]+$"); + private static Pattern numericStringPattern = Pattern.compile("^[0-9\\-\\-]+$"); + private static Pattern floatNumericPattern = Pattern.compile("^[0-9\\-\\.]+$"); + private static Pattern abcPattern = Pattern.compile("^[a-z|A-Z]+$"); + public static final String splitStrPattern = ",|锛寍;|锛泑銆亅\\.|銆倈-|_|\\(|\\)|\\[|\\]|\\{|\\}|\\\\|/| |銆|\""; + private static Log logger = LogFactory.getLog(StringUtil.class); + + /** + * 鍒ゆ柇鏄惁鏁板瓧琛ㄧず + * + * @param src + * 婧愬瓧绗︿覆 + * @return 鏄惁鏁板瓧鐨勬爣蹇 + */ + public static boolean isNumeric(String src) { + boolean return_value = false; + if (src != null && src.length() > 0) { + Matcher m = numericPattern.matcher(src); + if (m.find()) { + return_value = true; + } + } + return return_value; + } + + /** + * 鍒ゆ柇鏄惁鏁板瓧琛ㄧず + * + * @param src + * 婧愬瓧绗︿覆 + * @return 鏄惁鏁板瓧鐨勬爣蹇 + */ + public static boolean isNumericString(String src) { + boolean return_value = false; + if (src != null && src.length() > 0) { + Matcher m = numericStringPattern.matcher(src); + if (m.find()) { + return_value = true; + } + } + return return_value; + } + + /** + * 鍒ゆ柇鏄惁绾瓧姣嶇粍鍚 + * + * @param src + * 婧愬瓧绗︿覆 + * @return 鏄惁绾瓧姣嶇粍鍚堢殑鏍囧織 + */ + public static boolean isABC(String src) { + boolean return_value = false; + if (src != null && src.length() > 0) { + Matcher m = abcPattern.matcher(src); + if (m.find()) { + return_value = true; + } + } + return return_value; + } + + /** + * 鍒ゆ柇鏄惁娴偣鏁板瓧琛ㄧず + * + * @param src + * 婧愬瓧绗︿覆 + * @return 鏄惁鏁板瓧鐨勬爣蹇 + */ + public static boolean isFloatNumeric(String src) { + boolean return_value = false; + if (src != null && src.length() > 0) { + Matcher m = floatNumericPattern.matcher(src); + if (m.find()) { + return_value = true; + } + } + return return_value; + } + + /** + * 鎶妔tring array or list鐢ㄧ粰瀹氱殑绗﹀彿symbol杩炴帴鎴愪竴涓瓧绗︿覆 + * + * @param array + * @param symbol + * @return + */ + public static String joinString(List array, String symbol) { + String result = ""; + if (array != null) { + for (int i = 0; i < array.size(); i++) { + String temp = array.get(i).toString(); + if (temp != null && temp.trim().length() > 0) + result += (temp + symbol); + } + if (result.length() > 1) + result = result.substring(0, result.length() - 1); + } + return result; + } + + public static String subStringNotEncode(String subject, int size) { + if (subject != null && subject.length() > size) { + subject = subject.substring(0, size) + "..."; + } + return subject; + } + + /** + * 鎴彇瀛楃涓层瓒呭嚭鐨勫瓧绗︾敤symbol浠f浛 銆銆 + * + * @param len + * 銆瀛楃涓查暱搴︺闀垮害璁¢噺鍗曚綅涓轰竴涓狦BK姹夊瓧銆銆涓や釜鑻辨枃瀛楁瘝璁$畻涓轰竴涓崟浣嶉暱搴 + * @param str + * @param symbol + * @return + */ + public static String getLimitLengthString(String str, int len, String symbol) { + int iLen = len * 2; + int counterOfDoubleByte = 0; + String strRet = ""; + try { + if (str != null) { + byte[] b = str.getBytes("GBK"); + if (b.length <= iLen) { + return str; + } + for (int i = 0; i < iLen; i++) { + if (b[i] < 0) { + counterOfDoubleByte++; + } + } + if (counterOfDoubleByte % 2 == 0) { + strRet = new String(b, 0, iLen, "GBK") + symbol; + return strRet; + } else { + strRet = new String(b, 0, iLen - 1, "GBK") + symbol; + return strRet; + } + } else { + return ""; + } + } catch (Exception ex) { + return str.substring(0, len); + } finally { + strRet = null; + } + } + + /** + * 鎴彇瀛楃涓层瓒呭嚭鐨勫瓧绗︾敤symbol浠f浛 銆銆 + * + * @param len + * 銆瀛楃涓查暱搴︺闀垮害璁¢噺鍗曚綅涓轰竴涓狦BK姹夊瓧銆銆涓や釜鑻辨枃瀛楁瘝璁$畻涓轰竴涓崟浣嶉暱搴 + * @param str + * @param symbol + * @return12 + */ + public static String getLimitLengthString(String str, int len) { + return getLimitLengthString(str, len, "..."); + } + + /** + * + * 鎴彇瀛楃锛屼笉杞爜 + * + * @param subject + * @param size + * @return + */ + public static String subStrNotEncode(String subject, int size) { + if (subject.length() > size) { + subject = subject.substring(0, size); + } + return subject; + } + + /** + * 鎶妔tring array or list鐢ㄧ粰瀹氱殑绗﹀彿symbol杩炴帴鎴愪竴涓瓧绗︿覆 + * + * @param array + * @param symbol + * @return + */ + public static String joinString(String[] array, String symbol) { + String result = ""; + if (array != null) { + for (int i = 0; i < array.length; i++) { + String temp = array[i]; + if (temp != null && temp.trim().length() > 0) + result += (temp + symbol); + } + if (result.length() > 1) + result = result.substring(0, result.length() - 1); + } + return result; + } + + /** + * 鍙栧緱瀛楃涓茬殑瀹為檯闀垮害锛堣冭檻浜嗘眽瀛楃殑鎯呭喌锛 + * + * @param SrcStr + * 婧愬瓧绗︿覆 + * @return 瀛楃涓茬殑瀹為檯闀垮害 + */ + public static int getStringLen(String SrcStr) { + int return_value = 0; + if (SrcStr != null) { + char[] theChars = SrcStr.toCharArray(); + for (int i = 0; i < theChars.length; i++) { + return_value += (theChars[i] <= 255) ? 1 : 2; + } + } + return return_value; + } + + /** + * 妫鏌ユ暟鎹覆涓槸鍚﹀寘鍚潪娉曞瓧绗﹂泦 + * + * @param str + * @return [true]|[false] 鍖呭惈|涓嶅寘鍚 + */ + public static boolean check(String str) { + String sIllegal = "'\""; + int len = sIllegal.length(); + if (null == str) + return false; + for (int i = 0; i < len; i++) { + if (str.indexOf(sIllegal.charAt(i)) != -1) + return true; + } + + return false; + } + + /*************************************************************************** + * getHideEmailPrefix - 闅愯棌閭欢鍦板潃鍓嶇紑銆 + * + * @param email + * - EMail閭鍦板潃 渚嬪: linwenguo@koubei.com 绛夌瓑... + * @return 杩斿洖宸查殣钘忓墠缂閭欢鍦板潃, 濡 *********@koubei.com. + * @version 1.0 (2006.11.27) Wilson Lin + **************************************************************************/ + public static String getHideEmailPrefix(String email) { + if (null != email) { + int index = email.lastIndexOf('@'); + if (index > 0) { + email = repeat("*", index).concat(email.substring(index)); + } + } + return email; + } + + /*************************************************************************** + * repeat - 閫氳繃婧愬瓧绗︿覆閲嶅鐢熸垚N娆$粍鎴愭柊鐨勫瓧绗︿覆銆 + * + * @param src + * - 婧愬瓧绗︿覆 渚嬪: 绌烘牸(" "), 鏄熷彿("*"), "娴欐睙" 绛夌瓑... + * @param num + * - 閲嶅鐢熸垚娆℃暟 + * @return 杩斿洖宸茬敓鎴愮殑閲嶅瀛楃涓 + * @version 1.0 (2006.10.10) Wilson Lin + **************************************************************************/ + public static String repeat(String src, int num) { + StringBuffer s = new StringBuffer(); + for (int i = 0; i < num; i++) + s.append(src); + return s.toString(); + } + + /** + * 鏍规嵁鎸囧畾鐨勫瓧绗︽妸婧愬瓧绗︿覆鍒嗗壊鎴愪竴涓暟缁 + * + * @param src + * @return + */ + public static List parseString2ListByCustomerPattern(String pattern, String src) { + + if (src == null) + return null; + List list = new ArrayList(); + String[] result = src.split(pattern); + for (int i = 0; i < result.length; i++) { + list.add(result[i]); + } + return list; + } + + /** + * 鏍规嵁鎸囧畾鐨勫瓧绗︽妸婧愬瓧绗︿覆鍒嗗壊鎴愪竴涓暟缁 + * + * @param src + * @return + */ + public static List parseString2ListByPattern(String src) { + String pattern = "锛寍,|銆亅銆"; + return parseString2ListByCustomerPattern(pattern, src); + } + + /** + * 鏍煎紡鍖栦竴涓猣loat + * + * @param format + * 瑕佹牸寮忓寲鎴愮殑鏍煎紡 such as #.00, #.# + */ + + public static String formatFloat(float f, String format) { + DecimalFormat df = new DecimalFormat(format); + return df.format(f); + } + + /** + * 鍒ゆ柇鏄惁鏄┖瀛楃涓 null鍜"" 閮借繑鍥 true + * + * @author Robin Chang + * @param s + * @return + */ + public static boolean isEmpty(String s) { + if (s != null && !s.equals("")) { + return false; + } + return true; + } + + /** + * 鑷畾涔夌殑鍒嗛殧瀛楃涓插嚱鏁 渚嬪: 1,2,3 =>[1,2,3] 3涓厓绱 ,2,3=>[,2,3] 3涓厓绱 ,2,3,=>[,2,3,] 4涓厓绱 ,,,=>[,,,] 4涓厓绱 + * + * 5.22绠楁硶淇敼锛屼负鎻愰珮閫熷害涓嶇敤姝e垯琛ㄨ揪寮 涓や釜闂撮殧绗,,杩斿洖""鍏冪礌 + * + * @param split + * 鍒嗗壊瀛楃 榛樿, + * @param src + * 杈撳叆瀛楃涓 + * @return 鍒嗛殧鍚庣殑list + * @author Robin + */ + public static List splitToList(String split, String src) { + // 榛樿, + String sp = ","; + if (split != null && split.length() == 1) { + sp = split; + } + List r = new ArrayList(); + int lastIndex = -1; + int index = src.indexOf(sp); + if (-1 == index && src != null) { + r.add(src); + return r; + } + while (index >= 0) { + if (index > lastIndex) { + r.add(src.substring(lastIndex + 1, index)); + } else { + r.add(""); + } + + lastIndex = index; + index = src.indexOf(sp, index + 1); + if (index == -1) { + r.add(src.substring(lastIndex + 1, src.length())); + } + } + return r; + } + + /** + * 鎶 鍚=鍊 鍙傛暟琛ㄨ浆鎹㈡垚瀛楃涓 (a=1,b=2 =>a=1&b=2) + * + * @param map + * @return + */ + public static String linkedHashMapToString(LinkedHashMap map) { + if (map != null && map.size() > 0) { + String result = ""; + Iterator it = map.keySet().iterator(); + while (it.hasNext()) { + String name = (String) it.next(); + String value = (String) map.get(name); + result += (result.equals("")) ? "" : "&"; + result += String.format("%s=%s", name, value); + } + return result; + } + return null; + } + + /** + * 瑙f瀽瀛楃涓茶繑鍥 鍚嶇О=鍊肩殑鍙傛暟琛 (a=1&b=2 => a=1,b=2) + * + * @see test.koubei.util.StringUtilTest#testParseStr() + * @param str + * @return + */ + @SuppressWarnings("unchecked") + public static LinkedHashMap toLinkedHashMap(String str) { + if (str != null && !str.equals("") && str.indexOf("=") > 0) { + LinkedHashMap result = new LinkedHashMap(); + + String name = null; + String value = null; + int i = 0; + while (i < str.length()) { + char c = str.charAt(i); + switch (c) { + case 61: // = + value = ""; + break; + case 38: // & + if (name != null && value != null && !name.equals("")) { + result.put(name, value); + } + name = null; + value = null; + break; + default: + if (value != null) { + value = (value != null) ? (value + c) : "" + c; + } else { + name = (name != null) ? (name + c) : "" + c; + } + } + i++; + + } + + if (name != null && value != null && !name.equals("")) { + result.put(name, value); + } + + return result; + + } + return null; + } + + /** + * 鏍规嵁杈撳叆鐨勫涓В閲婂拰涓嬫爣杩斿洖涓涓 + * + * @param captions + * 渚嬪:"鏃,鐖卞共鍑,涓鑸,姣旇緝涔" + * @param index + * 1 + * @return 涓鑸 + */ + public static String getCaption(String captions, int index) { + if (index > 0 && captions != null && !captions.equals("")) { + String[] ss = captions.split(","); + if (ss != null && ss.length > 0 && index < ss.length) { + return ss[index]; + } + } + return null; + } + + /** + * 鏁板瓧杞瓧绗︿覆,濡傛灉num<=0 鍒欒緭鍑""; + * + * @param num + * @return + */ + public static String numberToString(Object num) { + if (num == null) { + return null; + } else if (num instanceof Integer && (Integer) num > 0) { + return Integer.toString((Integer) num); + } else if (num instanceof Long && (Long) num > 0) { + return Long.toString((Long) num); + } else if (num instanceof Float && (Float) num > 0) { + return Float.toString((Float) num); + } else if (num instanceof Double && (Double) num > 0) { + return Double.toString((Double) num); + } else { + return ""; + } + } + + /** + * 璐у竵杞瓧绗︿覆 + * + * @param money + * @param style + * 鏍峰紡 [default]瑕佹牸寮忓寲鎴愮殑鏍煎紡 such as #.00, #.# + * @return + */ + + public static String moneyToString(Object money, String style) { + if (money != null && style != null && (money instanceof Double || money instanceof Float)) { + Double num = (Double) money; + + if (style.equalsIgnoreCase("default")) { + // 缂虹渷鏍峰紡 0 涓嶈緭鍑 ,濡傛灉娌℃湁杈撳嚭灏忔暟浣嶅垯涓嶈緭鍑.0 + if (num == 0) { + // 涓嶈緭鍑0 + return ""; + } else if ((num * 10 % 10) == 0) { + // 娌℃湁灏忔暟 + return Integer.toString((int) num.intValue()); + } else { + // 鏈夊皬鏁 + return num.toString(); + } + + } else { + DecimalFormat df = new DecimalFormat(style); + return df.format(num); + } + } + return null; + } + + /** + * 鍦╯ou涓槸鍚﹀瓨鍦╢inds 濡傛灉鎸囧畾鐨刦inds瀛楃涓叉湁涓涓湪sou涓壘鍒,杩斿洖true; + * + * @param sou + * @param find + * @return + */ + public static boolean strPos(String sou, String... finds) { + if (sou != null && finds != null && finds.length > 0) { + for (int i = 0; i < finds.length; i++) { + if (sou.indexOf(finds[i]) > -1) + return true; + } + } + return false; + } + + public static boolean strPos(String sou, List finds) { + if (sou != null && finds != null && finds.size() > 0) { + for (String s : finds) { + if (sou.indexOf(s) > -1) + return true; + } + } + return false; + } + + public static boolean strPos(String sou, String finds) { + List t = splitToList(",", finds); + return strPos(sou, t); + } + + /** + * 鍒ゆ柇涓や釜瀛楃涓叉槸鍚︾浉绛 濡傛灉閮戒负null鍒欏垽鏂负鐩哥瓑,涓涓负null鍙︿竴涓猲ot null鍒欏垽鏂笉鐩哥瓑 鍚﹀垯濡傛灉s1=s2鍒欑浉绛 + * + * @param s1 + * @param s2 + * @return + */ + public static boolean equals(String s1, String s2) { + if (StringUtil.isEmpty(s1) && StringUtil.isEmpty(s2)) { + return true; + } else if (!StringUtil.isEmpty(s1) && !StringUtil.isEmpty(s2)) { + return s1.equals(s2); + } + return false; + } + + public static int toInt(String s) { + if (s != null && !"".equals(s.trim())) { + try { + return Integer.parseInt(s); + } catch (Exception e) { + return 0; + } + } + return 0; + } + + public static double toDouble(String s) { + if (s != null && !"".equals(s.trim())) { + return Double.parseDouble(s); + } + return 0; + } + + /** + * 鎶妜ml 杞负object + * + * @param xml + * @return + */ + public static Object xmlToObject(String xml) { + try { + ByteArrayInputStream in = new ByteArrayInputStream(xml.getBytes("UTF8")); + XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(in)); + return decoder.readObject(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static long toLong(String s) { + try { + if (s != null && !"".equals(s.trim())) + return Long.parseLong(s); + } catch (Exception exception) { + } + return 0L; + } + + public static String simpleEncrypt(String str) { + if (str != null && str.length() > 0) { + // str = str.replaceAll("0","a"); + str = str.replaceAll("1", "b"); + // str = str.replaceAll("2","c"); + str = str.replaceAll("3", "d"); + // str = str.replaceAll("4","e"); + str = str.replaceAll("5", "f"); + str = str.replaceAll("6", "g"); + str = str.replaceAll("7", "h"); + str = str.replaceAll("8", "i"); + str = str.replaceAll("9", "j"); + } + return str; + + } + + /** + * 杩囨护鐢ㄦ埛杈撳叆鐨刄RL鍦板潃锛堥槻娌荤敤鎴峰箍鍛婏級 鐩墠鍙拡瀵逛互http鎴杦ww寮澶寸殑URL鍦板潃 鏈柟娉曡皟鐢ㄧ殑姝e垯琛ㄨ揪寮忥紝涓嶅缓璁敤鍦ㄥ鎬ц兘涓ユ牸鐨勫湴鏂逛緥濡:寰幆鍙妉ist椤甸潰绛 + * + * @author fengliang + * @param str + * 闇瑕佸鐞嗙殑瀛楃涓 + * @return 杩斿洖澶勭悊鍚庣殑瀛楃涓 + */ + public static String removeURL(String str) { + if (str != null) + str = str.toLowerCase().replaceAll("(http|www|com|cn|org|\\.)+", ""); + return str; + } + + /** + * 闅忓嵆鐢熸垚鎸囧畾浣嶆暟鐨勫惈鏁板瓧楠岃瘉鐮佸瓧绗︿覆 + * + * @author Peltason + * @date 2007-5-9 + * @param bit + * 鎸囧畾鐢熸垚楠岃瘉鐮佷綅鏁 + * @return String + */ + public static String numRandom(int bit) { + if (bit == 0) + bit = 6; // 榛樿6浣 + String str = ""; + str = "0123456789";// 鍒濆鍖栫瀛 + return RandomStringUtils.random(bit, str);// 杩斿洖6浣嶇殑瀛楃涓 + } + + /** + * 闅忓嵆鐢熸垚鎸囧畾浣嶆暟鐨勫惈楠岃瘉鐮佸瓧绗︿覆 + * + * @author Peltason + * + * @date 2007-5-9 + * @param bit + * 鎸囧畾鐢熸垚楠岃瘉鐮佷綅鏁 + * @return String + */ + public static String random(int bit) { + if (bit == 0) + bit = 6; // 榛樿6浣 + // 鍥犱负o鍜0,l鍜1寰堥毦鍖哄垎,鎵浠,鍘绘帀澶у皬鍐欑殑o鍜宭 + String str = ""; + str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz";// 鍒濆鍖栫瀛 + return RandomStringUtils.random(bit, str);// 杩斿洖6浣嶇殑瀛楃涓 + } + + /** + * Wap椤甸潰鐨勯潪娉曞瓧绗︽鏌 + * + * @author hugh115 + * @date 2007-06-29 + * @param str + * @return + */ + public static String replaceWapStr(String str) { + if (str != null) { + str = str.replaceAll("", ""); + str = str.replaceAll("", ""); + str = str.replaceAll("", ""); + str = str.replaceAll("", ""); + str = str.replaceAll("", ""); + + str = str.replace('$', '锛'); + + str = str.replaceAll("&", "锛"); + str = str.replace('&', '锛'); + + str = str.replace('<', '锛'); + + str = str.replace('>', '锛'); + + } + return str; + } + + /** + * 瀛楃涓茶浆float 濡傛灉寮傚父杩斿洖0.00 + * + * @param s + * 杈撳叆鐨勫瓧绗︿覆 + * @return 杞崲鍚庣殑float + */ + public static Float toFloat(String s) { + try { + return Float.parseFloat(s); + } catch (NumberFormatException e) { + return new Float(0); + } + } + + /** + * 椤甸潰涓幓闄ゅ瓧绗︿覆涓殑绌烘牸銆佸洖杞︺佹崲琛岀銆佸埗琛ㄧ + * + * @author shazao + * @date 2007-08-17 + * @param str + * @return + */ + public static String replaceBlank(String str) { + if (str != null) { + Pattern p = Pattern.compile("\\s*|\t|\r|\n"); + Matcher m = p.matcher(str); + str = m.replaceAll(""); + } + return str; + } + + /** + * 鍏ㄨ鐢熸垚鍗婅 + * + * @author bailong + * @date 2007-08-29 + * @param str + * @return + */ + public static String Q2B(String QJstr) { + String outStr = ""; + String Tstr = ""; + byte[] b = null; + for (int i = 0; i < QJstr.length(); i++) { + try { + Tstr = QJstr.substring(i, i + 1); + b = Tstr.getBytes("unicode"); + } catch (java.io.UnsupportedEncodingException e) { + if (logger.isErrorEnabled()) { + logger.error(e); + } + } + if (b[3] == -1) { + b[2] = (byte) (b[2] + 32); + b[3] = 0; + try { + outStr = outStr + new String(b, "unicode"); + } catch (java.io.UnsupportedEncodingException ex) { + if (logger.isErrorEnabled()) { + logger.error(ex); + } + } + } else { + outStr = outStr + Tstr; + } + } + return outStr; + } + + /** + * + * 杞崲缂栫爜 + * + * @param s + * 婧愬瓧绗︿覆 + * @param fencode + * 婧愮紪鐮佹牸寮 + * @param bencode + * 鐩爣缂栫爜鏍煎紡 + * @return 鐩爣缂栫爜 + */ + public static String changCoding(String s, String fencode, String bencode) { + String str; + try { + if (StringUtil.isNotEmpty(s)) { + str = new String(s.getBytes(fencode), bencode); + } else { + str = ""; + } + return str; + } catch (UnsupportedEncodingException e) { + return s; + } + } + + /** + * @param str + * @return + ************************************************************************* + */ + public static String removeHTMLLableExe(String str) { + str = stringReplace(str, ">\\s*<", "><"); + str = stringReplace(str, " ", " ");// 鏇挎崲绌烘牸 + str = stringReplace(str, "
    ", "\n");// 鍘

    + str = stringReplace(str, "<([^<>]+)>", "");// 鍘绘帀<>鍐呯殑瀛楃 + str = stringReplace(str, "\\s\\s\\s*", " ");// 灏嗗涓┖鐧藉彉鎴愪竴涓┖鏍 + str = stringReplace(str, "^\\s*", "");// 鍘绘帀澶寸殑绌虹櫧 + str = stringReplace(str, "\\s*$", "");// 鍘绘帀灏剧殑绌虹櫧 + str = stringReplace(str, " +", " "); + return str; + } + + /** + * 闄ゅ幓html鏍囩 + * + * @param str + * 婧愬瓧绗︿覆 + * @return 鐩爣瀛楃涓 + */ + public static String removeHTMLLable(String str) { + str = stringReplace(str, "\\s", "");// 鍘绘帀椤甸潰涓婄湅涓嶅埌鐨勫瓧绗 + str = stringReplace(str, "
    ", "\n");// 鍘

    + str = stringReplace(str, "<([^<>]+)>", "");// 鍘绘帀<>鍐呯殑瀛楃 + str = stringReplace(str, " ", " ");// 鏇挎崲绌烘牸 + str = stringReplace(str, "&(\\S)(\\S?)(\\S?)(\\S?);", "");// 鍘

    + return str; + } + + /** + * 鍘绘帀HTML鏍囩涔嬪鐨勫瓧绗︿覆 + * + * @param str + * 婧愬瓧绗︿覆 + * @return 鐩爣瀛楃涓 + */ + public static String removeOutHTMLLable(String str) { + str = stringReplace(str, ">([^<>]+)<", "><"); + str = stringReplace(str, "^([^<>]+)<", "<"); + str = stringReplace(str, ">([^<>]+)$", ">"); + return str; + } + + /** + * + * 瀛楃涓叉浛鎹 + * + * @param str + * 婧愬瓧绗︿覆 + * @param sr + * 姝e垯琛ㄨ揪寮忔牱寮 + * @param sd + * 鏇挎崲鏂囨湰 + * @return 缁撴灉涓 + */ + public static String stringReplace(String str, String sr, String sd) { + String regEx = sr; + Pattern p = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE); + Matcher m = p.matcher(str); + str = m.replaceAll(sd); + return str; + } + + /** + * + * 灏唄tml鐨勭渷鐣ュ啓娉曟浛鎹㈡垚闈炵渷鐣ュ啓娉 + * + * @param str + * html瀛楃涓 + * @param pt + * 鏍囩濡倀able + * @return 缁撴灉涓 + */ + public static String fomateToFullForm(String str, String pt) { + String regEx = "<" + pt + "\\s+([\\S&&[^<>]]*)/>"; + Pattern p = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE); + Matcher m = p.matcher(str); + String[] sa = null; + String sf = ""; + String sf2 = ""; + String sf3 = ""; + for (; m.find();) { + sa = p.split(str); + if (sa == null) { + break; + } + sf = str.substring(sa[0].length(), str.indexOf("/>", sa[0].length())); + sf2 = sf + ">"; + sf3 = str.substring(sa[0].length() + sf.length() + 2); + str = sa[0] + sf2 + sf3; + sa = null; + } + return str; + } + + /** + * + * 寰楀埌瀛楃涓茬殑瀛愪覆浣嶇疆搴忓垪 + * + * @param str + * 瀛楃涓 + * @param sub + * 瀛愪覆 + * @param b + * true瀛愪覆鍓嶇,false瀛愪覆鍚庣 + * @return 瀛楃涓茬殑瀛愪覆浣嶇疆搴忓垪 + */ + public static int[] getSubStringPos(String str, String sub, boolean b) { + // int[] i = new int[(new Integer((str.length()-stringReplace( str , sub + // , "" ).length())/sub.length())).intValue()] ; + String[] sp = null; + int l = sub.length(); + sp = splitString(str, sub); + if (sp == null) { + return null; + } + int[] ip = new int[sp.length - 1]; + for (int i = 0; i < sp.length - 1; i++) { + ip[i] = sp[i].length() + l; + if (i != 0) { + ip[i] += ip[i - 1]; + } + } + if (b) { + for (int j = 0; j < ip.length; j++) { + ip[j] = ip[j] - l; + } + } + return ip; + } + + /** + * + * 鏍规嵁姝e垯琛ㄨ揪寮忓垎鍓插瓧绗︿覆 + * + * @param str + * 婧愬瓧绗︿覆 + * @param ms + * 姝e垯琛ㄨ揪寮 + * @return 鐩爣瀛楃涓茬粍 + */ + public static String[] splitString(String str, String ms) { + String regEx = ms; + Pattern p = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE); + String[] sp = p.split(str); + return sp; + } + + /** + * 鏍规嵁姝e垯琛ㄨ揪寮忔彁鍙栧瓧绗︿覆,鐩稿悓鐨勫瓧绗︿覆鍙繑鍥炰竴涓 + * + * @param str婧愬瓧绗︿覆 + * @param pattern + * 姝e垯琛ㄨ揪寮 + * @return 鐩爣瀛楃涓叉暟鎹粍 + ************************************************************************* + */ + + // 鈽呬紶鍏ヤ竴涓瓧绗︿覆锛屾妸绗﹀悎pattern鏍煎紡鐨勫瓧绗︿覆鏀惧叆瀛楃涓叉暟缁 + // java.util.regex鏄竴涓敤姝e垯琛ㄨ揪寮忔墍璁㈠埗鐨勬ā寮忔潵瀵瑰瓧绗︿覆杩涜鍖归厤宸ヤ綔鐨勭被搴撳寘 + public static String[] getStringArrayByPattern(String str, String pattern) { + Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE); + Matcher matcher = p.matcher(str); + // 鑼冨瀷 + Set result = new HashSet();// 鐩殑鏄細鐩稿悓鐨勫瓧绗︿覆鍙繑鍥炰竴涓傘傘 涓嶉噸澶嶅厓绱 + // boolean find() 灏濊瘯鍦ㄧ洰鏍囧瓧绗︿覆閲屾煡鎵句笅涓涓尮閰嶅瓙涓层 + while (matcher.find()) { + for (int i = 0; i < matcher.groupCount(); i++) { // int groupCount() + // 杩斿洖褰撳墠鏌ユ壘鎵鑾峰緱鐨勫尮閰嶇粍鐨勬暟閲忋 + // org.jeecgframework.core.util.LogUtil.info(matcher.group(i)); + result.add(matcher.group(i)); + + } + } + String[] resultStr = null; + if (result.size() > 0) { + resultStr = new String[result.size()]; + return result.toArray(resultStr);// 灏哠et result杞寲涓篠tring[] resultStr + } + return resultStr; + + } + + /** + * 寰楀埌绗竴涓猙,e涔嬮棿鐨勫瓧绗︿覆,骞惰繑鍥瀍鍚庣殑瀛愪覆 + * + * @param s + * 婧愬瓧绗︿覆 + * @param b + * 鏍囧織寮濮 + * @param e + * 鏍囧織缁撴潫 + * @return b,e涔嬮棿鐨勫瓧绗︿覆 + */ + + /* + * String aaa="abcdefghijklmn"; String[] bbb=StringProcessor.midString(aaa, "b","l"); org.jeecgframework.core.util.LogUtil.info("bbb[0]:"+bbb[0]);//cdefghijk org.jeecgframework.core.util.LogUtil.info("bbb[1]:"+bbb[1]);//lmn 鈽呰繖涓柟娉曟槸寰楀埌绗簩涓弬鏁板拰绗笁涓弬鏁颁箣闂寸殑瀛楃涓,璧嬬粰鍏冪礌0;鐒跺悗鎶婂厓绱0浠h〃鐨勫瓧绗︿覆涔嬪悗鐨,璧嬬粰鍏冪礌1 + */ + + /* + * String aaa="abcdefgllhijklmn5465"; String[] bbb=StringProcessor.midString(aaa, "b","l"); //ab cdefg llhijklmn5465 // 鍏冪礌0 鍏冪礌1 + */ + public static String[] midString(String s, String b, String e) { + int i = s.indexOf(b) + b.length(); + int j = s.indexOf(e, i); + String[] sa = new String[2]; + if (i < b.length() || j < i + 1 || i > j) { + sa[1] = s; + sa[0] = null; + return sa; + } else { + sa[0] = s.substring(i, j); + sa[1] = s.substring(j); + return sa; + } + } + + /** + * 甯︽湁鍓嶄竴娆℃浛浠e簭鍒楃殑姝e垯琛ㄨ揪寮忔浛浠 + * + * @param s + * @param pf + * @param pb + * @param start + * @return + */ + public static String stringReplace(String s, String pf, String pb, int start) { + Pattern pattern_hand = Pattern.compile(pf); + Matcher matcher_hand = pattern_hand.matcher(s); + int gc = matcher_hand.groupCount(); + int pos = start; + String sf1 = ""; + String sf2 = ""; + String sf3 = ""; + int if1 = 0; + String strr = ""; + while (matcher_hand.find(pos)) { + sf1 = matcher_hand.group(); + if1 = s.indexOf(sf1, pos); + if (if1 >= pos) { + strr += s.substring(pos, if1); + pos = if1 + sf1.length(); + sf2 = pb; + for (int i = 1; i <= gc; i++) { + sf3 = "\\" + i; + sf2 = replaceAll(sf2, sf3, matcher_hand.group(i)); + } + strr += sf2; + } else { + return s; + } + } + strr = s.substring(0, start) + strr; + return strr; + } + + /** + * 瀛樻枃鏈浛鎹 + * + * @param s + * 婧愬瓧绗︿覆 + * @param sf + * 瀛愬瓧绗︿覆 + * @param sb + * 鏇挎崲瀛楃涓 + * @return 鏇挎崲鍚庣殑瀛楃涓 + */ + public static String replaceAll(String s, String sf, String sb) { + int i = 0, j = 0; + int l = sf.length(); + boolean b = true; + boolean o = true; + String str = ""; + do { + j = i; + i = s.indexOf(sf, j); + if (i > j) { + str += s.substring(j, i); + str += sb; + i += l; + o = false; + } else { + str += s.substring(j); + b = false; + } + } while (b); + if (o) { + str = s; + } + return str; + } + + // 瀛楃涓茬殑鏇挎崲 + public static String replace(String strSource, String strOld, String strNew) { + if (strSource == null) { + return null; + } + int i = 0; + if ((i = strSource.indexOf(strOld, i)) >= 0) { + char[] cSrc = strSource.toCharArray(); + char[] cTo = strNew.toCharArray(); + int len = strOld.length(); + StringBuffer buf = new StringBuffer(cSrc.length); + buf.append(cSrc, 0, i).append(cTo); + i += len; + int j = i; + while ((i = strSource.indexOf(strOld, i)) > 0) { + buf.append(cSrc, j, i - j).append(cTo); + i += len; + j = i; + } + buf.append(cSrc, j, cSrc.length - j); + return buf.toString(); + } + return strSource; + } + + /** + * 鍒ゆ柇鏄惁涓庣粰瀹氬瓧绗︿覆鏍峰紡鍖归厤 + * + * @param str + * 瀛楃涓 + * @param pattern + * 姝e垯琛ㄨ揪寮忔牱寮 + * @return 鏄惁鍖归厤鏄痶rue,鍚alse + */ + public static boolean isMatch(String str, String pattern) { + Pattern pattern_hand = Pattern.compile(pattern); + Matcher matcher_hand = pattern_hand.matcher(str); + boolean b = matcher_hand.matches(); + return b; + } + + /** + * 鎴彇瀛楃涓 + * + * @param s + * 婧愬瓧绗︿覆 + * @param jmp + * 璺宠繃jmp + * @param sb + * 鍙栧湪sb + * @param se + * 浜巗e + * @return 涔嬮棿鐨勫瓧绗︿覆 + */ + public static String subStringExe(String s, String jmp, String sb, String se) { + if (isEmpty(s)) { + return ""; + } + int i = s.indexOf(jmp); + if (i >= 0 && i < s.length()) { + s = s.substring(i + 1); + } + i = s.indexOf(sb); + if (i >= 0 && i < s.length()) { + s = s.substring(i + 1); + } + if (se == "") { + return s; + } else { + i = s.indexOf(se); + if (i >= 0 && i < s.length()) { + s = s.substring(i + 1); + } + return s; + } + } + + /** + * ************************************************************************* 鐢ㄨ閫氳繃URL浼犺緭鐨勫唴瀹硅繘琛岀紪鐮 + * + * @param 婧愬瓧绗︿覆 + * @return 缁忚繃缂栫爜鐨勫唴瀹 + ************************************************************************* + */ + public static String URLEncode(String src) { + String return_value = ""; + try { + if (src != null) { + return_value = URLEncoder.encode(src, "GBK"); + + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return_value = src; + } + + return return_value; + } + + /** + * ************************************************************************* + * + * @author 鏉庨攱 2007.4.18 + * @param 浼犲叆 + * 福test照楼(北大门&# 24635 ;店)福 + * @return 缁忚繃瑙g爜鐨勫唴瀹 + ************************************************************************* + */ + public static String getGBK(String str) { + + return transfer(str); + } + + public static String transfer(String str) { + Pattern p = Pattern.compile("&#\\d+;"); + Matcher m = p.matcher(str); + while (m.find()) { + String old = m.group(); + str = str.replaceAll(old, getChar(old)); + } + return str; + } + + public static String getChar(String str) { + String dest = str.substring(2, str.length() - 1); + char ch = (char) Integer.parseInt(dest); + return "" + ch; + } + + /** + * yahoo棣栭〉涓垏鍓插瓧绗︿覆. + * + * @author yxg + * @date 2007-09-17 + * @param str + * @return + */ + public static String subYhooString(String subject, int size) { + subject = subject.substring(1, size); + return subject; + } + + public static String subYhooStringDot(String subject, int size) { + subject = subject.substring(1, size) + "..."; + return subject; + } + + /** + * 娉涘瀷鏂规硶(閫氱敤)锛屾妸list杞崲鎴愪互鈥,鈥濈浉闅旂殑瀛楃涓 璋冪敤鏃舵敞鎰忕被鍨嬪垵濮嬪寲锛堢敵鏄庣被鍨嬶級 濡傦細List intList = new ArrayList(); 璋冪敤鏂规硶锛歋tringUtil.listTtoString(intList); 鏁堢巼锛歭ist涓4鏉′俊鎭紝1000000娆¤皟鐢ㄦ椂闂翠负850ms宸﹀彸 + * + * @author fengliang + * @serialData 2008-01-09 + * @param + * 娉涘瀷 + * @param list + * list鍒楄〃 + * @return 浠モ,鈥濈浉闅旂殑瀛楃涓 + */ + public static String listTtoString(List list) { + if (list == null || list.size() < 1) + return ""; + Iterator i = list.iterator(); + if (!i.hasNext()) + return ""; + StringBuilder sb = new StringBuilder(); + for (;;) { + T e = i.next(); + sb.append(e); + if (!i.hasNext()) + return sb.toString(); + sb.append(","); + } + } + + /** + * 鎶婃暣褰㈡暟缁勮浆鎹㈡垚浠モ,鈥濈浉闅旂殑瀛楃涓 + * + * @author fengliang + * @serialData 2008-01-08 + * @param a + * 鏁扮粍a + * @return 浠モ,鈥濈浉闅旂殑瀛楃涓 + */ + public static String intArraytoString(int[] a) { + if (a == null) + return ""; + int iMax = a.length - 1; + if (iMax == -1) + return ""; + StringBuilder b = new StringBuilder(); + for (int i = 0;; i++) { + b.append(a[i]); + if (i == iMax) + return b.toString(); + b.append(","); + } + } + + /** + * 鍒ゆ柇鏂囧瓧鍐呭閲嶅 + * + * @author 娌欐灒 + * @Date 2008-04-17 + */ + public static boolean isContentRepeat(String content) { + int similarNum = 0; + int forNum = 0; + int subNum = 0; + int thousandNum = 0; + String startStr = ""; + String nextStr = ""; + boolean result = false; + float endNum = (float) 0.0; + if (content != null && content.length() > 0) { + if (content.length() % 1000 > 0) + thousandNum = (int) Math.floor(content.length() / 1000) + 1; + else + thousandNum = (int) Math.floor(content.length() / 1000); + if (thousandNum < 3) + subNum = 100 * thousandNum; + else if (thousandNum < 6) + subNum = 200 * thousandNum; + else if (thousandNum < 9) + subNum = 300 * thousandNum; + else + subNum = 3000; + for (int j = 1; j < subNum; j++) { + if (content.length() % j > 0) + forNum = (int) Math.floor(content.length() / j) + 1; + else + forNum = (int) Math.floor(content.length() / j); + if (result || j >= content.length()) + break; + else { + for (int m = 0; m < forNum; m++) { + if (m * j > content.length() || (m + 1) * j > content.length() || (m + 2) * j > content.length()) + break; + startStr = content.substring(m * j, (m + 1) * j); + nextStr = content.substring((m + 1) * j, (m + 2) * j); + if (startStr.equals(nextStr)) { + similarNum = similarNum + 1; + endNum = (float) similarNum / forNum; + if (endNum > 0.4) { + result = true; + break; + } + } else + similarNum = 0; + } + } + } + } + return result; + } + + /** + * 鍒ゆ柇鏄惁鏄┖瀛楃涓 null鍜"" null杩斿洖result,鍚﹀垯杩斿洖瀛楃涓 + * + * @param s + * @return + */ + public static String isEmpty(String s, String result) { + if (s != null && !s.equals("")) { + return s; + } + return result; + } + + /** + * 鍒ゆ柇瀵硅薄鏄惁涓虹┖ + * + * @param str + * @return + */ + public static boolean isNotEmpty(Object str) { + boolean flag = true; + if (str != null && !str.equals("")) { + if (str.toString().length() > 0) { + flag = true; + } + } else { + flag = false; + } + return flag; + } + + /** + * 鍏ㄨ瀛楃鍙樺崐瑙掑瓧绗 + * + * @author shazao + * @date 2008-04-03 + * @param str + * @return + */ + public static String full2Half(String str) { + if (str == null || "".equals(str)) + return ""; + StringBuffer sb = new StringBuffer(); + + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + + if (c >= 65281 && c < 65373) + sb.append((char) (c - 65248)); + else + sb.append(str.charAt(i)); + } + + return sb.toString(); + + } + + /** + * 鍏ㄨ鎷彿杞负鍗婅 + * + * @author shazao + * @date 2007-11-29 + * @param str + * @return + */ + public static String replaceBracketStr(String str) { + if (str != null && str.length() > 0) { + str = str.replaceAll("锛", "("); + str = str.replaceAll("锛", ")"); + } + return str; + } + + /** + * 瑙f瀽瀛楃涓茶繑鍥瀖ap閿煎(渚嬶細a=1&b=2 => a=1,b=2) + * + * @param query + * 婧愬弬鏁板瓧绗︿覆 + * @param split1 + * 閿煎涔嬮棿鐨勫垎闅旂锛堜緥锛&锛 + * @param split2 + * key涓巚alue涔嬮棿鐨勫垎闅旂锛堜緥锛=锛 + * @param dupLink + * 閲嶅鍙傛暟鍚嶇殑鍙傛暟鍊间箣闂寸殑杩炴帴绗︼紝杩炴帴鍚庣殑瀛楃涓蹭綔涓鸿鍙傛暟鐨勫弬鏁板硷紝鍙负null null锛氫笉鍏佽閲嶅鍙傛暟鍚嶅嚭鐜帮紝鍒欓潬鍚庣殑鍙傛暟鍊间細瑕嗙洊鎺夐潬鍓嶇殑鍙傛暟鍊笺 + * @return map + * @author sky + */ + @SuppressWarnings("unchecked") + public static Map parseQuery(String query, char split1, char split2, String dupLink) { + if (!isEmpty(query) && query.indexOf(split2) > 0) { + Map result = new HashMap(); + + String name = null; + String value = null; + String tempValue = ""; + int len = query.length(); + for (int i = 0; i < len; i++) { + char c = query.charAt(i); + if (c == split2) { + value = ""; + } else if (c == split1) { + if (!isEmpty(name) && value != null) { + if (dupLink != null) { + tempValue = result.get(name); + if (tempValue != null) { + value += dupLink + tempValue; + } + } + result.put(name, value); + } + name = null; + value = null; + } else if (value != null) { + value += c; + } else { + name = (name != null) ? (name + c) : "" + c; + } + } + + if (!isEmpty(name) && value != null) { + if (dupLink != null) { + tempValue = result.get(name); + if (tempValue != null) { + value += dupLink + tempValue; + } + } + result.put(name, value); + } + + return result; + } + return null; + } + + /** + * 灏唋ist 鐢ㄤ紶鍏ョ殑鍒嗛殧绗︾粍瑁呬负String + * + * @param list + * @param slipStr + * @return String + */ + @SuppressWarnings("unchecked") + public static String listToStringSlipStr(List list, String slipStr) { + StringBuffer returnStr = new StringBuffer(); + if (list != null && list.size() > 0) { + for (int i = 0; i < list.size(); i++) { + returnStr.append(list.get(i)).append(slipStr); + } + } + if (returnStr.toString().length() > 0) + return returnStr.toString().substring(0, returnStr.toString().lastIndexOf(slipStr)); + else + return ""; + } + + /** + * 鑾峰彇浠巗tart寮濮嬬敤*鏇挎崲len涓暱搴﹀悗鐨勫瓧绗︿覆 + * + * @param str + * 瑕佹浛鎹㈢殑瀛楃涓 + * @param start + * 寮濮嬩綅缃 + * @param len + * 闀垮害 + * @return 鏇挎崲鍚庣殑瀛楃涓 + */ + public static String getMaskStr(String str, int start, int len) { + if (StringUtil.isEmpty(str)) { + return str; + } + if (str.length() < start) { + return str; + } + + // 鑾峰彇*涔嬪墠鐨勫瓧绗︿覆 + String ret = str.substring(0, start); + + // 鑾峰彇鏈澶氳兘鎵撶殑*涓暟 + int strLen = str.length(); + if (strLen < start + len) { + len = strLen - start; + } + + // 鏇挎崲鎴* + for (int i = 0; i < len; i++) { + ret += "*"; + } + + // 鍔犱笂*涔嬪悗鐨勫瓧绗︿覆 + if (strLen > start + len) { + ret += str.substring(start + len); + } + + return ret; + } + + /** + * 鏍规嵁浼犲叆鐨勫垎鍓茬鍙,鎶婁紶鍏ョ殑瀛楃涓插垎鍓蹭负List瀛楃涓 + * + * @param slipStr + * 鍒嗛殧鐨勫瓧绗︿覆 + * @param src + * 瀛楃涓 + * @return 鍒楄〃 + */ + public static List stringToStringListBySlipStr(String slipStr, String src) { + + if (src == null) + return null; + List list = new ArrayList(); + String[] result = src.split(slipStr); + for (int i = 0; i < result.length; i++) { + list.add(result[i]); + } + return list; + } + + /** + * 鎴彇瀛楃涓 + * + * @param str + * 鍘熷瀛楃涓 + * @param len + * 瑕佹埅鍙栫殑闀垮害 + * @param tail + * 缁撴潫鍔犱笂鐨勫悗缂 + * @return 鎴彇鍚庣殑瀛楃涓 + */ + public static String getHtmlSubString(String str, int len, String tail) { + if (str == null || str.length() <= len) { + return str; + } + int length = str.length(); + char c = ' '; + String tag = null; + String name = null; + int size = 0; + String result = ""; + boolean isTag = false; + List tags = new ArrayList(); + int i = 0; + for (int end = 0, spanEnd = 0; i < length && len > 0; i++) { + c = str.charAt(i); + if (c == '<') { + end = str.indexOf('>', i); + } + + if (end > 0) { + // 鎴彇鏍囩 + tag = str.substring(i, end + 1); + int n = tag.length(); + if (tag.endsWith("/>")) { + isTag = true; + } else if (tag.startsWith("= 0 && name.equals(tags.get(size))) { + isTag = true; + tags.remove(size); + } + } else { // 寮濮嬬 + spanEnd = tag.indexOf(' ', 0); + spanEnd = spanEnd > 0 ? spanEnd : n; + name = tag.substring(1, spanEnd); + if (name.trim().length() > 0) { + // 濡傛灉鏈夌粨鏉熺鍒欎负html鏍囩 + spanEnd = str.indexOf("", end); + if (spanEnd > 0) { + isTag = true; + tags.add(name); + } + } + } + // 闈瀐tml鏍囩瀛楃 + if (!isTag) { + if (n >= len) { + result += tag.substring(0, len); + break; + } else { + len -= n; + } + } + + result += tag; + isTag = false; + i = end; + end = 0; + } else { // 闈瀐tml鏍囩瀛楃 + len--; + result += c; + } + } + // 娣诲姞鏈粨鏉熺殑html鏍囩 + for (String endTag : tags) { + result += ""; + } + if (i < length) { + result += tail; + } + return result; + } + + public static String getProperty(String property) { + if (property.contains("_")) { + return property.replaceAll("_", "\\."); + } + return property; + } + + /** + * 瑙f瀽鍓嶅彴encodeURIComponent缂栫爜鍚庣殑鍙傛暟 + * + * @param encodeURIComponent + * (encodeURIComponent(no)) + * @return + */ + public static String getEncodePra(String property) { + String trem = ""; + if (isNotEmpty(property)) { + try { + trem = URLDecoder.decode(property, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + return trem; + } + + // 鍒ゆ柇涓涓瓧绗︿覆鏄惁閮戒负鏁板瓧 + public boolean isDigit(String strNum) { + Pattern pattern = Pattern.compile("[0-9]{1,}"); + Matcher matcher = pattern.matcher((CharSequence) strNum); + return matcher.matches(); + } + + // 鎴彇鏁板瓧 + public String getNumbers(String content) { + Pattern pattern = Pattern.compile("\\d+"); + Matcher matcher = pattern.matcher(content); + while (matcher.find()) { + return matcher.group(0); + } + return ""; + } + + // 鎴彇闈炴暟瀛 + public String splitNotNumber(String content) { + Pattern pattern = Pattern.compile("\\D+"); + Matcher matcher = pattern.matcher(content); + while (matcher.find()) { + return matcher.group(0); + } + return ""; + } + + /** + * 鍒ゆ柇鏌愪釜瀛楃涓叉槸鍚﹀瓨鍦ㄤ簬鏁扮粍涓 + * + * @param stringArray + * 鍘熸暟缁 + * @param source + * 鏌ユ壘鐨勫瓧绗︿覆 + * @return 鏄惁鎵惧埌 + */ + public static boolean contains(String[] stringArray, String source) { + // 杞崲涓簂ist + List tempList = Arrays.asList(stringArray); + + // 鍒╃敤list鐨勫寘鍚柟娉,杩涜鍒ゆ柇 + if (tempList.contains(source)) { + return true; + } else { + return false; + } + } + + /** + * html 蹇呴』鏄牸寮忚壇濂界殑 + * @param str + * @return + * @throws Exception + */ + public static String formatHtml(String str) throws Exception { + Document document = null; + document = DocumentHelper.parseText(str); + + OutputFormat format = OutputFormat.createPrettyPrint(); + format.setEncoding("utf-8"); + StringWriter writer = new StringWriter(); + + HTMLWriter htmlWriter = new HTMLWriter(writer, format); + + htmlWriter.write(document); + htmlWriter.close(); + return writer.toString(); + } + + /** + * 棣栧瓧姣嶅ぇ鍐 + * @param realName + * @return + */ + public static String firstUpperCase(String realName) { + return StringUtils.replaceChars(realName, realName.substring(0, 1),realName.substring(0, 1).toUpperCase()); + } + + /** + * 棣栧瓧姣嶅皬鍐 + * @param realName + * @return + */ + public static String firstLowerCase(String realName) { + return StringUtils.replaceChars(realName, realName.substring(0, 1),realName.substring(0, 1).toLowerCase()); + } + + /** + * 鍒ゆ柇杩欎釜绫绘槸涓嶆槸java鑷甫鐨勭被 + * @param clazz + * @return + */ + public static boolean isJavaClass(Class clazz) { + boolean isBaseClass = false; + if(clazz.isArray()){ + isBaseClass = false; + }else if (clazz.isPrimitive()||clazz.getPackage()==null + || clazz.getPackage().getName().equals("java.lang") + || clazz.getPackage().getName().equals("java.math") + || clazz.getPackage().getName().equals("java.util")) { + isBaseClass = true; + } + return isBaseClass; + } + + /** + * 鍒ゆ柇杩欎釜绫绘槸涓嶆槸java鑷甫鐨勭被 + * @param clazz + * @return + */ + public static String getEmptyString() { + return ""; + } +} diff --git a/src/main/java/org/jeecgframework/core/util/SysThemesUtil.java b/src/main/java/org/jeecgframework/core/util/SysThemesUtil.java new file mode 100644 index 00000000..5194a485 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/SysThemesUtil.java @@ -0,0 +1,153 @@ +package org.jeecgframework.core.util; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang.StringUtils; +import org.jeecgframework.core.enums.SysThemesEnum; + +/** + * + * 绯荤粺鏍峰紡鑾峰彇宸ュ叿绫 + * @author Administrator + * + */ +public class SysThemesUtil { + + /** + * 鑾峰彇绯荤粺椋庢牸 + * @param request + * @return + */ + public static SysThemesEnum getSysTheme(HttpServletRequest request){ + String indexStyle = null; + try { + Cookie[] cookies = request.getCookies(); + for (Cookie cookie : cookies) { + if (cookie == null || StringUtils.isEmpty(cookie.getName())) { + continue; + } + if (cookie.getName().equalsIgnoreCase("JEECGINDEXSTYLE")) { + indexStyle = cookie.getValue(); + } + } + } catch (Exception e) { + } + return SysThemesEnum.toEnum(indexStyle); + } + + /** + * easyui.css 鏍峰紡 + * @param sysThemesEnum + * @return + */ + public static String getEasyUiTheme(SysThemesEnum sysThemesEnum){ + StringBuffer sb = new StringBuffer(""); + sb.append(""); + return sb.toString(); + } + + /** + * easyui main.css + * @param sysThemesEnum + * @return + */ + public static String getEasyUiMainTheme(SysThemesEnum sysThemesEnum){ + StringBuffer sb = new StringBuffer(""); + if("metro".equals(sysThemesEnum.getThemes())){ + sb.append(""); + } + return sb.toString(); + } + + /** + * tools common.css 鏍峰紡 + * @param sysThemesEnum + * @return + */ + public static String getCommonTheme(SysThemesEnum sysThemesEnum){ + StringBuffer sb = new StringBuffer(""); + if("metro".equals(sysThemesEnum.getThemes())){ + sb.append(""); + }else{ + sb.append(""); + } + return sb.toString(); + } + + /** + * lhgdialog 鏍峰紡 + * @param sysThemesEnum + * @return + */ + public static String getLhgdialogTheme(SysThemesEnum sysThemesEnum){ + StringBuffer sb = new StringBuffer(""); + if("metro".equals(sysThemesEnum.getThemes())){ + sb.append(""); + }else{ + sb.append(""); + } + return sb.toString(); + } + + /** + * graphreport report.css 鏍峰紡 + * @param sysThemesEnum + * @return + */ + public static String getReportTheme(SysThemesEnum sysThemesEnum){ + StringBuffer sb = new StringBuffer(""); + if("metro".equals(sysThemesEnum.getThemes())){ + sb.append(""); + + }else{ + sb.append(""); + } + return sb.toString(); + } + + /** + * Validform divfrom 鏍峰紡 + * @param sysThemesEnum + * @return + */ + public static String getValidformDivfromTheme(SysThemesEnum sysThemesEnum){ + StringBuffer sb = new StringBuffer(""); + if("metro".equals(sysThemesEnum.getThemes())){ + sb.append(""); + }else{ + sb.append(""); + } + return sb.toString(); + } + + /** + * Validform style.css + * @param sysThemesEnum + * @return + */ + public static String getValidformStyleTheme(SysThemesEnum sysThemesEnum){ + StringBuffer sb = new StringBuffer(""); + if("metro".equals(sysThemesEnum.getThemes())){ + sb.append(""); + }else{ + sb.append(""); + } + return sb.toString(); + } + + /** + * Validform tablefrom.css + * @param sysThemesEnum + * @return + */ + public static String getValidformTablefrom(SysThemesEnum sysThemesEnum){ + StringBuffer sb = new StringBuffer(""); + if("metro".equals(sysThemesEnum.getThemes())){ + sb.append(""); + }else{ + sb.append(""); + } + return sb.toString(); + } +} diff --git a/src/main/java/org/jeecgframework/core/util/SystemPath.java b/src/main/java/org/jeecgframework/core/util/SystemPath.java new file mode 100644 index 00000000..19e7504f --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/SystemPath.java @@ -0,0 +1,44 @@ +package org.jeecgframework.core.util; + + +/** + * + * @author wanye + * @date Dec 14, 2008 + * @version v 1.0 + * @description 寰楀埌褰撳墠搴旂敤鐨勭郴缁熻矾寰 + */ +public class SystemPath { + + public static String getSysPath() + { + String path= Thread.currentThread().getContextClassLoader().getResource("").toString(); + String temp=path.replaceFirst("file:/", "").replaceFirst("WEB-INF/classes/", ""); + String separator= System.getProperty("file.separator"); + String resultPath=temp.replaceAll("/", separator+separator); + return resultPath; + } + public static String getClassPath() + { + String path= Thread.currentThread().getContextClassLoader().getResource("").toString(); + String temp=path.replaceFirst("file:/", ""); + String separator= System.getProperty("file.separator"); + String resultPath=temp.replaceAll("/", separator+separator); + return resultPath; + } + public static String getSystempPath() + { + return System.getProperty("java.io.tmpdir"); + } + public static String getSeparator() + { + return System.getProperty("file.separator"); + } + + public static void main(String[] args){ + org.jeecgframework.core.util.LogUtil.info(getSysPath()); + org.jeecgframework.core.util.LogUtil.info(System.getProperty("java.io.tmpdir")); + org.jeecgframework.core.util.LogUtil.info(getSeparator()); + org.jeecgframework.core.util.LogUtil.info(getClassPath()); + } +} diff --git a/src/main/java/org/jeecgframework/core/util/ToEntityUtil.java b/src/main/java/org/jeecgframework/core/util/ToEntityUtil.java new file mode 100644 index 00000000..739f9648 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/ToEntityUtil.java @@ -0,0 +1,75 @@ +package org.jeecgframework.core.util; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * ?* @author HongChongYuan ?* @date 2012-1-12 ?* @time 涓嬪崍04:05:13 ? + */ +public final class ToEntityUtil { + + @SuppressWarnings("unchecked") + public static T toEntityList(List datas, Class clas, String... labels) { + // 杩斿洖瀹炰綋鍒楄〃 + List entitys = new ArrayList(); + for (int i = 0; i < datas.size(); i++) { + // 缁撴灉闆嗗璞 + Object[] data = (Object[]) datas.get(i); + T entity; + try { + entity = toEntity(clas, data, labels); + entitys.add(entity); + } catch (Exception e) { + e.printStackTrace(); + } + + } + return (T) entitys; + } + + @SuppressWarnings("unchecked") + public static T toEntity(Class clas, Object[] data, String... labels) + throws Exception { + // 鍒涘缓瀵硅薄瀹炰緥 + T entity = (T) clas.newInstance(); + // 姣忎釜瀛楁杩涜璧嬪 + for (int j = 0; j < labels.length; j++) { + if (null == data[j] || 0 == data[j].toString().trim().length()) { + continue; + } + // 寰楀埌璁惧兼柟娉曞悕绉 + String methodName = "set" + + ((labels[j].charAt(0) + "").toUpperCase()) + + labels[j].substring(1); + // 寰楀埌瀛楁鍚嶇О + Field field = entity.getClass().getDeclaredField(labels[j]); + // 寰楀埌瀛楁绫诲瀷 + String parameterType = field.getType().getSimpleName(); + // 寰楀埌璁惧兼柟娉 + Method method = entity.getClass().getDeclaredMethod(methodName, + field.getType()); + String val = data[j].toString(); + if (parameterType.equals("String")) { + method.invoke(entity, val); + } else if (parameterType.equals("Character")) { + method.invoke(entity, val.charAt(0)); + } else if (parameterType.equals("Boolean")) { + method.invoke(entity, + val.equals("true") || val.equals("1") ? true : false); + } else if (parameterType.equals("Short")) { + method.invoke(entity, Short.parseShort(val)); + } else if (parameterType.equals("Integer")) { + method.invoke(entity, Integer.parseInt(val)); + } else if (parameterType.equals("Float")) { + method.invoke(entity, Float.parseFloat(val)); + } else if (parameterType.equals("Long")) { + method.invoke(entity, Long.parseLong(val)); + } else if (parameterType.equals("Double")) { + method.invoke(entity, Double.parseDouble(val)); + } + } + return entity; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/core/util/UUIDGenerator.java b/src/main/java/org/jeecgframework/core/util/UUIDGenerator.java new file mode 100644 index 00000000..9ffa294d --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/UUIDGenerator.java @@ -0,0 +1,94 @@ +package org.jeecgframework.core.util; + + +import java.net.InetAddress; + +/** + * + * @author 寮犱唬娴 + * + */ +public class UUIDGenerator { + + + /** + * 浜х敓涓涓32浣嶇殑UUID + * + * @return + */ + + public static String generate() { + return new StringBuilder(32).append(format(getIP())).append( + format(getJVM())).append(format(getHiTime())).append( + format(getLoTime())).append(format(getCount())).toString(); + + } + + private static final int IP; + static { + int ipadd; + try { + ipadd = toInt(InetAddress.getLocalHost().getAddress()); + } catch (Exception e) { + ipadd = 0; + } + IP = ipadd; + } + + private static short counter = (short) 0; + + private static final int JVM = (int) (System.currentTimeMillis() >>> 8); + + private final static String format(int intval) { + String formatted = Integer.toHexString(intval); + StringBuilder buf = new StringBuilder("00000000"); + buf.replace(8 - formatted.length(), 8, formatted); + return buf.toString(); + } + + private final static String format(short shortval) { + String formatted = Integer.toHexString(shortval); + StringBuilder buf = new StringBuilder("0000"); + buf.replace(4 - formatted.length(), 4, formatted); + return buf.toString(); + } + + private final static int getJVM() { + return JVM; + } + + private final static short getCount() { + synchronized (UUIDGenerator.class) { + if (counter < 0) + counter = 0; + return counter++; + } + } + + /** + * Unique in a local network + */ + private final static int getIP() { + return IP; + } + + /** + * Unique down to millisecond + */ + private final static short getHiTime() { + return (short) (System.currentTimeMillis() >>> 32); + } + + private final static int getLoTime() { + return (int) System.currentTimeMillis(); + } + + private final static int toInt(byte[] bytes) { + int result = 0; + for (int i = 0; i < 4; i++) { + result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i]; + } + return result; + } + +} diff --git a/src/main/java/org/jeecgframework/core/util/UploadUtils.java b/src/main/java/org/jeecgframework/core/util/UploadUtils.java new file mode 100644 index 00000000..04c479a8 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/UploadUtils.java @@ -0,0 +1,344 @@ +package org.jeecgframework.core.util; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; + +/** + * 鏂囦欢涓婁紶宸ュ叿绫 + * + * @author yangdc + * @date Apr 18, 2012 + * + *
    + * 
    + */ +public class UploadUtils { + /** + * 琛ㄥ崟瀛楁甯搁噺 + */ + public static final String FORM_FIELDS = "form_fields"; + /** + * 鏂囦欢鍩熷父閲 + */ + public static final String FILE_FIELDS = "file_fields"; + + // 鏈澶ф枃浠跺ぇ灏 + private long maxSize = 1000000; + // 瀹氫箟鍏佽涓婁紶鐨勬枃浠舵墿灞曞悕 + private Map extMap = new HashMap(); + // 鏂囦欢淇濆瓨鐩綍鐩稿璺緞 + private String basePath = "upload"; + // 鏂囦欢鐨勭洰褰曞悕 + private String dirName = "images"; + // 涓婁紶涓存椂璺緞 + private static final String TEMP_PATH = "/temp"; + private String tempPath = basePath + TEMP_PATH; + // 鑻ヤ笉鎸囧畾鍒欐枃浠跺悕榛樿涓 yyyyMMddHHmmss_xyz + private String fileName; + + // 鏂囦欢淇濆瓨鐩綍璺緞 + private String savePath; + // 鏂囦欢淇濆瓨鐩綍url + private String saveUrl; + // 鏂囦欢鏈缁堢殑url鍖呮嫭鏂囦欢鍚 + private String fileUrl; + + public UploadUtils() { + // 鍏朵腑images,flashs,medias,files,瀵瑰簲鏂囦欢澶瑰悕绉,瀵瑰簲dirName + // key鏂囦欢澶瑰悕绉 + // value璇ユ枃浠跺す鍐呭彲浠ヤ笂浼犳枃浠剁殑鍚庣紑鍚 + extMap.put("images", "gif,jpg,jpeg,png,bmp"); + extMap.put("flashs", "swf,flv"); + extMap.put("medias", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb"); + extMap.put("files", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2"); + } + + /** + * 鏂囦欢涓婁紶 + * + * @param request + * @return infos info[0] 楠岃瘉鏂囦欢鍩熻繑鍥為敊璇俊鎭 info[1] 涓婁紶鏂囦欢閿欒淇℃伅 info[2] savePath info[3] saveUrl info[4] fileUrl + */ + @SuppressWarnings("unchecked") + public String[] uploadFile(HttpServletRequest request) { + String[] infos = new String[5]; + // 楠岃瘉 + infos[0] = this.validateFields(request); + // 鍒濆鍖栬〃鍗曞厓绱 + Map fieldsMap = new HashMap(); + if (infos[0].equals("true")) { + fieldsMap = this.initFields(request); + } + // 涓婁紶 + List fiList = (List) fieldsMap.get(UploadUtils.FILE_FIELDS); + if (fiList != null) { + for (FileItem item : fiList) { + infos[1] = this.saveFile(item); + } + infos[2] = savePath; + infos[3] = saveUrl; + infos[4] = fileUrl; + } + return infos; + } + + /** + * 涓婁紶楠岃瘉,骞跺垵濮嬪寲鏂囦欢鐩綍 + * + * @param request + */ + private String validateFields(HttpServletRequest request) { + String errorInfo = "true"; + // boolean errorFlag = true; + // 鑾峰彇鍐呭绫诲瀷 + String contentType = request.getContentType(); + int contentLength = request.getContentLength(); + // 鏂囦欢淇濆瓨鐩綍璺緞 + savePath = request.getSession().getServletContext().getRealPath("/") + basePath + "/"; + // 鏂囦欢淇濆瓨鐩綍URL + saveUrl = request.getContextPath() + "/" + basePath + "/"; + File uploadDir = new File(savePath); + if (contentType == null || !contentType.startsWith("multipart")) { + // TODO + org.jeecgframework.core.util.LogUtil.info("璇锋眰涓嶅寘鍚玬ultipart/form-data娴"); + errorInfo = "璇锋眰涓嶅寘鍚玬ultipart/form-data娴"; + } else if (maxSize < contentLength) { + // TODO + org.jeecgframework.core.util.LogUtil.info("涓婁紶鏂囦欢澶у皬瓒呭嚭鏂囦欢鏈澶уぇ灏"); + errorInfo = "涓婁紶鏂囦欢澶у皬瓒呭嚭鏂囦欢鏈澶уぇ灏廩" + maxSize + "]"; + } else if (!ServletFileUpload.isMultipartContent(request)) { + // TODO + errorInfo = "璇烽夋嫨鏂囦欢"; + } else if (!uploadDir.isDirectory()) {// 妫鏌ョ洰褰 + // TODO + errorInfo = "涓婁紶鐩綍[" + savePath + "]涓嶅瓨鍦"; + } else if (!uploadDir.canWrite()) { + // TODO + errorInfo = "涓婁紶鐩綍[" + savePath + "]娌℃湁鍐欐潈闄"; + } else if (!extMap.containsKey(dirName)) { + // TODO + errorInfo = "鐩綍鍚嶄笉姝g‘"; + } else { + // .../basePath/dirName/ + // 鍒涘缓鏂囦欢澶 + savePath += dirName + "/"; + saveUrl += dirName + "/"; + File saveDirFile = new File(savePath); + if (!saveDirFile.exists()) { + saveDirFile.mkdirs(); + } + // .../basePath/dirName/yyyyMMdd/ + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + String ymd = sdf.format(new Date()); + savePath += ymd + "/"; + saveUrl += ymd + "/"; + File dirFile = new File(savePath); + if (!dirFile.exists()) { + dirFile.mkdirs(); + } + + // 鑾峰彇涓婁紶涓存椂璺緞 + tempPath = request.getSession().getServletContext().getRealPath("/") + tempPath + "/"; + File file = new File(tempPath); + if (!file.exists()) { + file.mkdirs(); + } + } + + return errorInfo; + } + + /** + * 澶勭悊涓婁紶鍐呭 + * + * @param request + * @param maxSize + * @return + */ + @SuppressWarnings("unchecked") + private Map initFields(HttpServletRequest request) { + + // 瀛樺偍琛ㄥ崟瀛楁鍜岄潪琛ㄥ崟瀛楁 + Map map = new HashMap(); + + // 绗竴姝ワ細鍒ゆ柇request + boolean isMultipart = ServletFileUpload.isMultipartContent(request); + // 绗簩姝ワ細瑙f瀽request + if (isMultipart) { + // Create a factory for disk-based file items + DiskFileItemFactory factory = new DiskFileItemFactory(); + + // 闃鍊,瓒呰繃杩欎釜鍊兼墠浼氬啓鍒颁复鏃剁洰褰,鍚﹀垯鍦ㄥ唴瀛樹腑 + factory.setSizeThreshold(1024 * 1024 * 10); + factory.setRepository(new File(tempPath)); + + // Create a new file upload handler + ServletFileUpload upload = new ServletFileUpload(factory); + + upload.setHeaderEncoding("UTF-8"); + + // 鏈澶т笂浼犻檺鍒 + upload.setSizeMax(maxSize); + + /* FileItem */ + List items = null; + // Parse the request + try { + items = upload.parseRequest(request); + } catch (FileUploadException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // 绗3姝ワ細澶勭悊uploaded items + if (items != null && items.size() > 0) { + Iterator iter = items.iterator(); + // 鏂囦欢鍩熷璞 + List list = new ArrayList(); + // 琛ㄥ崟瀛楁 + Map fields = new HashMap(); + while (iter.hasNext()) { + FileItem item = iter.next(); + // 澶勭悊鎵鏈夎〃鍗曞厓绱犲拰鏂囦欢鍩熻〃鍗曞厓绱 + if (item.isFormField()) { // 琛ㄥ崟鍏冪礌 + String name = item.getFieldName(); + String value = item.getString(); + fields.put(name, value); + } else { // 鏂囦欢鍩熻〃鍗曞厓绱 + list.add(item); + } + } + map.put(FORM_FIELDS, fields); + map.put(FILE_FIELDS, list); + } + } + return map; + } + + /** + * 淇濆瓨鏂囦欢 + * + * @param obj + * 瑕佷笂浼犵殑鏂囦欢鍩 + * @param file + * @return + */ + private String saveFile(FileItem item) { + String error = "true"; + String fileName = item.getName(); + String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); + + if (item.getSize() > maxSize) { // 妫鏌ユ枃浠跺ぇ灏 + // TODO + error = "涓婁紶鏂囦欢澶у皬瓒呰繃闄愬埗"; + } else if (!Arrays. asList(extMap.get(dirName).split(",")).contains(fileExt)) {// 妫鏌ユ墿灞曞悕 + error = "涓婁紶鏂囦欢鎵╁睍鍚嶆槸涓嶅厑璁哥殑鎵╁睍鍚嶃俓n鍙厑璁" + extMap.get(dirName) + "鏍煎紡銆"; + } else { + String newFileName; + if ("".equals(fileName.trim())) { + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); + newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt; + } else { + newFileName = fileName + "." + fileExt; + } + // .../basePath/dirName/yyyyMMdd/yyyyMMddHHmmss_xxx.xxx + fileUrl = saveUrl + newFileName; + try { + File uploadedFile = new File(savePath, newFileName); + + item.write(uploadedFile); + + /* + * FileOutputStream fos = new FileOutputStream(uploadFile); // 鏂囦欢鍏ㄥ湪鍐呭瓨涓 if (item.isInMemory()) { fos.write(item.get()); } else { InputStream is = item.getInputStream(); byte[] buffer = + * new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { fos.write(buffer, 0, len); } is.close(); } fos.close(); item.delete(); + */ + } catch (IOException e) { + e.printStackTrace(); + org.jeecgframework.core.util.LogUtil.info("涓婁紶澶辫触浜嗭紒锛侊紒"); + } catch (Exception e) { + e.printStackTrace(); + } + } + return error; + } + + /** **********************get/set鏂规硶********************************* */ + + public String getSavePath() { + return savePath; + } + + public String getSaveUrl() { + return saveUrl; + } + + public long getMaxSize() { + return maxSize; + } + + public void setMaxSize(long maxSize) { + this.maxSize = maxSize; + } + + public Map getExtMap() { + return extMap; + } + + public void setExtMap(Map extMap) { + this.extMap = extMap; + } + + public String getBasePath() { + return basePath; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + tempPath = basePath + TEMP_PATH; + } + + public String getDirName() { + return dirName; + } + + public void setDirName(String dirName) { + this.dirName = dirName; + } + + public String getTempPath() { + return tempPath; + } + + public void setTempPath(String tempPath) { + this.tempPath = tempPath; + } + + public String getFileUrl() { + return fileUrl; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + +} diff --git a/src/main/java/org/jeecgframework/core/util/YouBianCodeUtil.java b/src/main/java/org/jeecgframework/core/util/YouBianCodeUtil.java new file mode 100644 index 00000000..5c0eff64 --- /dev/null +++ b/src/main/java/org/jeecgframework/core/util/YouBianCodeUtil.java @@ -0,0 +1,151 @@ +package org.jeecgframework.core.util; + +/** + * 娴佹按鍙风敓鎴愯鍒(鎸夐粯璁よ鍒欓掑锛屾暟瀛椾粠1-99寮濮嬮掑锛屾暟瀛楀埌99锛岄掑瀛楁瘝;浣嶆暟涓嶅澧炲姞浣嶆暟) + * A001 + * A001A002 + * @author zhangdaihao + * + */ +public class YouBianCodeUtil { + + // 鏁板瓧浣嶆暟(榛樿鐢熸垚3浣嶇殑鏁板瓧) + private static final int numLength = 2; + + /** + * 鏍规嵁鍓嶄竴涓猚ode锛岃幏鍙栧悓绾т笅涓涓猚ode + * 渚嬪:褰撳墠鏈澶ode涓篋01A04锛屼笅涓涓猚ode涓猴細D01A05 + * + * @param code + * @return + */ + public static String getNextYouBianCode(String code) { + String newcode = ""; + if (code == null || code =="") { + String zimu = "A"; + String num = getStrNum(1); + newcode = zimu + num; + } else { + String before_code = code.substring(0, code.length() - 1- numLength); + String after_code = code.substring(code.length() - 1 - numLength,code.length()); + char after_code_zimu = after_code.substring(0, 1).charAt(0); + Integer after_code_num = Integer.parseInt(after_code.substring(1)); +// System.out.println(after_code); +// System.out.println(after_code_zimu); +// System.out.println(after_code_num); + + String nextNum = ""; + char nextZimu = 'A'; + // 鍏堝垽鏂暟瀛楃瓑浜999*锛屽垯璁℃暟浠1閲嶆柊寮濮嬶紝閫掑 + if (after_code_num == getMaxNumByLength(numLength)) { + nextNum = getNextStrNum(0); + } else { + nextNum = getNextStrNum(after_code_num); + } + // 鍏堝垽鏂暟瀛楃瓑浜999*锛屽垯瀛楁瘝浠嶢閲嶆柊寮濮,閫掑 + if(after_code_num == getMaxNumByLength(numLength)) { + nextZimu = getNextZiMu(after_code_zimu); + }else{ + nextZimu = after_code_zimu; + } + + // 渚嬪Z99锛屼笅涓涓猚ode灏辨槸Z99A01 + if ('Z' == after_code_zimu && getMaxNumByLength(numLength) == after_code_num) { + newcode = code + (nextZimu + nextNum); + } else { + newcode = before_code + (nextZimu + nextNum); + } + } + return newcode; + + } + + /** + * 鏍规嵁鐖朵翰code,鑾峰彇涓嬬骇鐨勪笅涓涓猚ode + * + * 渚嬪锛氱埗浜睠ODE:A01 + * 褰撳墠CODE:A01B03 + * 鑾峰彇鐨刢ode:A01B04 + * + * @param parentCode + * @return + */ + public static String getSubYouBianCode(String parentCode,String localCode) { + if(localCode!=null && localCode!=""){ + return getNextYouBianCode(localCode); + }else{ + parentCode = parentCode + "A"+ getNextStrNum(0); + } + return parentCode; + } + + + + /** + * 灏嗘暟瀛楀墠闈綅鏁拌ˉ闆 + * + * @param num + * @return + */ + private static String getNextStrNum(int num) { + return getStrNum(getNextNum(num)); + } + + /** + * 灏嗘暟瀛楀墠闈綅鏁拌ˉ闆 + * + * @param num + * @return + */ + private static String getStrNum(int num) { + String s = String.format("%0" + numLength + "d", num); + return s; + } + + /** + * 閫掑鑾峰彇涓嬩釜鏁板瓧 + * + * @param num + * @return + */ + private static int getNextNum(int num) { + num++; + return num; + } + + /** + * 閫掑鑾峰彇涓嬩釜瀛楁瘝 + * + * @param num + * @return + */ + private static char getNextZiMu(char zimu) { + if (zimu == 'Z') { + return 'A'; + } + zimu++; + return zimu; + } + + /** + * 鏍规嵁鏁板瓧浣嶆暟鑾峰彇鏈澶у + * @param length + * @return + */ + private static int getMaxNumByLength(int length){ + if(length==0){ + return 0; + } + String max_num = ""; + for (int i=0;i map = new HashMap(); + + public static Map getMap() { + return map; + } + + public static boolean isEmpty(Object object) { + if (object == null) { + return (true); + } + if (object.equals("")) { + return (true); + } + if (object.equals("null")) { + return (true); + } + return (false); + } + + public static boolean isNotEmpty(Object object) { + if (object != null && !object.equals("") && !object.equals("null")) { + return (true); + } + return (false); + } + + public static String decode(String strIn, String sourceCode, String targetCode) { + String temp = code2code(strIn, sourceCode, targetCode); + return temp; + } + + public static String StrToUTF(String strIn, String sourceCode, String targetCode) { + strIn = ""; + try { + strIn = new String(strIn.getBytes("ISO-8859-1"), "GBK"); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return strIn; + + } + + private static String code2code(String strIn, String sourceCode, String targetCode) { + String strOut = null; + if (strIn == null || (strIn.trim()).equals("")) + return strIn; + try { + byte[] b = strIn.getBytes(sourceCode); + for (int i = 0; i < b.length; i++) { + System.out.print(b[i] + " "); + } + strOut = new String(b, targetCode); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return strOut; + } + + public static int getInt(String s, int defval) { + if (s == null || s == "") { + return (defval); + } + try { + return (Integer.parseInt(s)); + } catch (NumberFormatException e) { + return (defval); + } + } + + public static int getInt(String s) { + if (s == null || s == "") { + return 0; + } + try { + return (Integer.parseInt(s)); + } catch (NumberFormatException e) { + return 0; + } + } + + public static int getInt(String s, Integer df) { + if (s == null || s == "") { + return df; + } + try { + return (Integer.parseInt(s)); + } catch (NumberFormatException e) { + return 0; + } + } + + public static Integer[] getInts(String[] s) { + Integer[] integer = new Integer[s.length]; + if (s == null) { + return null; + } + for (int i = 0; i < s.length; i++) { + integer[i] = Integer.parseInt(s[i]); + } + return integer; + + } + + public static double getDouble(String s, double defval) { + if (s == null || s == "") { + return (defval); + } + try { + return (Double.parseDouble(s)); + } catch (NumberFormatException e) { + return (defval); + } + } + + public static double getDou(Double s, double defval) { + if (s == null) { + return (defval); + } + return s; + } + + public static Short getShort(String s) { + if (StringUtil.isNotEmpty(s)) { + return (Short.parseShort(s)); + } else { + return null; + } + } + + public static int getInt(Object object, int defval) { + if (isEmpty(object)) { + return (defval); + } + try { + return (Integer.parseInt(object.toString())); + } catch (NumberFormatException e) { + return (defval); + } + } + + public static int getInt(BigDecimal s, int defval) { + if (s == null) { + return (defval); + } + return s.intValue(); + } + + public static Integer[] getIntegerArry(String[] object) { + int len = object.length; + Integer[] result = new Integer[len]; + try { + for (int i = 0; i < len; i++) { + result[i] = new Integer(object[i].trim()); + } + return result; + } catch (NumberFormatException e) { + return null; + } + } + + public static String getString(String s) { + return (getString(s, "")); + } + + public static String getString(Object object) { + if (isEmpty(object)) { + return ""; + } + return (object.toString().trim()); + } + + public static String getString(int i) { + return (String.valueOf(i)); + } + + public static String getString(float i) { + return (String.valueOf(i)); + } + + public static String getString(String s, String defval) { + if (isEmpty(s)) { + return (defval); + } + return (s.trim()); + } + + public static String getString(Object s, String defval) { + if (isEmpty(s)) { + return (defval); + } + return (s.toString().trim()); + } + + public static long stringToLong(String str) { + Long test = new Long(0); + try { + test = Long.valueOf(str); + } catch (Exception e) { + } + return test.longValue(); + } + + /** + * 鑾峰彇鏈満IP + */ + public static String getIp() { + String ip = null; + try { + InetAddress address = InetAddress.getLocalHost(); + ip = address.getHostAddress(); + + } catch (UnknownHostException e) { + e.printStackTrace(); + } + return ip; + } + + /** + * 鍒ゆ柇涓涓被鏄惁涓哄熀鏈暟鎹被鍨嬨 + * + * @param clazz + * 瑕佸垽鏂殑绫汇 + * @return true 琛ㄧず涓哄熀鏈暟鎹被鍨嬨 + */ + private static boolean isBaseDataType(Class clazz) throws Exception { + return (clazz.equals(String.class) || clazz.equals(Integer.class) || clazz.equals(Byte.class) || clazz.equals(Long.class) || clazz.equals(Double.class) || clazz.equals(Float.class) || clazz.equals(Character.class) || clazz.equals(Short.class) || clazz.equals(BigDecimal.class) || clazz.equals(BigInteger.class) || clazz.equals(Boolean.class) || clazz.equals(Date.class) || clazz.isPrimitive()); + } + + /** + * @param request + * IP + * @return IP Address + */ + public static String getIpAddrByRequest(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return ip; + } + + /** + * @return 鏈満IP + * @throws SocketException + */ + public static String getRealIp() throws SocketException { + String localip = null;// 鏈湴IP锛屽鏋滄病鏈夐厤缃缃慖P鍒欒繑鍥炲畠 + String netip = null;// 澶栫綉IP + + Enumeration netInterfaces = NetworkInterface.getNetworkInterfaces(); + InetAddress ip = null; + boolean finded = false;// 鏄惁鎵惧埌澶栫綉IP + while (netInterfaces.hasMoreElements() && !finded) { + NetworkInterface ni = netInterfaces.nextElement(); + Enumeration address = ni.getInetAddresses(); + while (address.hasMoreElements()) { + ip = address.nextElement(); + if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 澶栫綉IP + netip = ip.getHostAddress(); + finded = true; + break; + } else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 鍐呯綉IP + localip = ip.getHostAddress(); + } + } + } + + if (netip != null && !"".equals(netip)) { + return netip; + } else { + return localip; + } + } + + /** + * java鍘婚櫎瀛楃涓蹭腑鐨勭┖鏍笺佸洖杞︺佹崲琛岀銆佸埗琛ㄧ + * + * @param str + * @return + */ + public static String replaceBlank(String str) { + String dest = ""; + if (str != null) { + Pattern p = Pattern.compile("\\s*|\t|\r|\n"); + Matcher m = p.matcher(str); + dest = m.replaceAll(""); + } + return dest; + + } + + /** + * 鍒ゆ柇鍏冪礌鏄惁鍦ㄦ暟缁勫唴 + * + * @param substring + * @param source + * @return + */ + public static boolean isIn(String substring, String[] source) { + if (source == null || source.length == 0) { + return false; + } + for (int i = 0; i < source.length; i++) { + String aSource = source[i]; + if (aSource.equals(substring)) { + return true; + } + } + return false; + } + + /** + * 鑾峰彇Map瀵硅薄 + */ + public static Map getHashMap() { + return new HashMap(); + } + + /** + * SET杞崲MAP + * + * @param str + * @return + */ + public static Map SetToMap(Set setobj) { + Map map = getHashMap(); + for (Iterator iterator = setobj.iterator(); iterator.hasNext();) { + Map.Entry entry = (Map.Entry) iterator.next(); + map.put(entry.getKey().toString(), entry.getValue() == null ? "" : entry.getValue().toString().trim()); + } + return map; + + } + + public static boolean isInnerIP(String ipAddress) { + boolean isInnerIp = false; + long ipNum = getIpNum(ipAddress); + /** + * 绉佹湁IP锛欰绫 10.0.0.0-10.255.255.255 B绫 172.16.0.0-172.31.255.255 C绫 192.168.0.0-192.168.255.255 褰撶劧锛岃繕鏈127杩欎釜缃戞鏄幆鍥炲湴鍧 + **/ + long aBegin = getIpNum("10.0.0.0"); + long aEnd = getIpNum("10.255.255.255"); + long bBegin = getIpNum("172.16.0.0"); + long bEnd = getIpNum("172.31.255.255"); + long cBegin = getIpNum("192.168.0.0"); + long cEnd = getIpNum("192.168.255.255"); + isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) || ipAddress.equals("127.0.0.1"); + return isInnerIp; + } + + private static long getIpNum(String ipAddress) { + String[] ip = ipAddress.split("\\."); + long a = Integer.parseInt(ip[0]); + long b = Integer.parseInt(ip[1]); + long c = Integer.parseInt(ip[2]); + long d = Integer.parseInt(ip[3]); + + long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d; + return ipNum; + } + + private static boolean isInner(long userIp, long begin, long end) { + return (userIp >= begin) && (userIp <= end); + } + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/AuthFilterTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/AuthFilterTag.java new file mode 100644 index 00000000..6bc06d1a --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/AuthFilterTag.java @@ -0,0 +1,95 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.ApplicationContextUtil; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.web.system.pojo.base.TSOperation; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +/** + * + * @Title:AuthFilterTag + * @description:鍒楄〃鎸夐挳鏉冮檺杩囨护 + * @author 璧典繆澶 + * @date Aug 24, 2013 7:46:57 PM + * @version V1.0 + */ +public class AuthFilterTag extends TagSupport{ + /**鍒楄〃瀹瑰櫒鐨処D*/ + protected String name; + @Autowired + private static SystemService systemService; + public int doStartTag() throws JspException { + return super.doStartTag(); + } + + public int doEndTag() throws JspException { + try { + JspWriter out = this.pageContext.getOut(); + out.print(end().toString()); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + + } + protected Object end() { + StringBuilder out = new StringBuilder(); + getAuthFilter(out); + return out; + } + /** + * 鑾峰彇闅愯棌鎸夐挳鐨凧S浠g爜 + * @param out + */ + @SuppressWarnings("unchecked") + protected void getAuthFilter(StringBuilder out) { + out.append(""); + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/AutocompleteTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/AutocompleteTag.java new file mode 100644 index 00000000..5f40c005 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/AutocompleteTag.java @@ -0,0 +1,139 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.util.StringUtil; + + +/** + * + * 鑷姩琛ュ叏 + * jquery ui Autocomplete + * @author: 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class AutocompleteTag extends TagSupport { + private static final long serialVersionUID = 1L; + private String name;//鎺т欢鍚嶇О + private String dataSource = "commonController.do?getAutoList";//鏁版嵁婧 + private Integer minLength=2;//瑙﹀彂鎻愮ず鏂囧瓧闀垮害 + private String labelField;//鎻愮ず鏄剧ず鐨勫瓧娈 + private String searchField;//鏌ヨ鍏抽敭瀛楀瓧娈 + private String valueField;//浼犻掑悗鍙扮殑瀛楁 + private String entityName;//瀹炰綋鍚嶇О + private String selectfun;//閫変腑鍚庤皟鐢ㄧ殑鍑芥暟 + private String label;//浼犲叆鏄剧ず鍊 + private String value;//浼犲叆闅愯棌鍩熷 + private String datatype = "*";//鏁版嵁楠岃瘉绫诲瀷 + private String nullmsg = "";//鏁版嵁涓虹┖鏃堕獙璇 + private String errormsg = "杈撳叆鏍煎紡涓嶅";//鏁版嵁鏍煎紡涓嶅鏃堕獙璇 + private String closefun;//娌℃湁閫夋嫨涓嬫媺椤圭洰鐨勫鐞嗗嚱鏁 + private String parse; + private String formatItem; + private String result; + private Integer maxRows = 10;//鏄剧ず鐨勬渶澶氱殑鏉℃暟 + + public void setClosefun(String closefun) { + this.closefun = closefun; + } + public void setDatatype(String datatype) { + this.datatype = datatype; + } + public void setNullmsg(String nullmsg) { + this.nullmsg = nullmsg; + } + public void setErrormsg(String errormsg) { + this.errormsg = errormsg; + } + public void setLabel(String label) { + this.label = label; + } + public void setValue(String value) { + this.value = value; + } + + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + public int doEndTag() throws JspTagException { + try { + JspWriter out = this.pageContext.getOut(); + out.print(end().toString()); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + public StringBuffer end() { + StringBuffer nsb = new StringBuffer(); + nsb.append("") + .append(""); + if(StringUtil.isNotEmpty(label)){ + nsb.append(" value="+label+" readonly=true"); + } + nsb.append(""); + return nsb; + } + public void setName(String name) { + this.name = name; + } + public void setParse(String parse) { + this.parse = parse; + } + public void setFormatItem(String formatItem) { + this.formatItem = formatItem; + } + public void setResult(String result) { + this.result = result; + } + public void setDataSource(String dataSource) { + this.dataSource = dataSource; + } + public void setMinLength(Integer minLength) { + this.minLength = minLength; + } + public void setLabelField(String labelField) { + this.labelField = labelField; + } + public void setValueField(String valueField) { + this.valueField = valueField; + } + public void setEntityName(String entityName) { + this.entityName = entityName; + } + public void setSearchField(String searchField) { + this.searchField = searchField; + } + public void setSelectfun(String selectfun) { + this.selectfun = selectfun; + } + public void setMaxRows(Integer maxRows){ + if(maxRows==null){ + maxRows = 10; + } + this.maxRows = maxRows; + } +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/BaseTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/BaseTag.java new file mode 100644 index 00000000..c9fa7b47 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/BaseTag.java @@ -0,0 +1,196 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import jodd.util.StringUtil; + +import org.jeecgframework.core.enums.SysThemesEnum; +import org.jeecgframework.core.util.SysThemesUtil; +import org.jeecgframework.core.util.oConvertUtils; + + +/** + * + * @author 寮犱唬娴 + * + */ +public class BaseTag extends TagSupport { + private static final long serialVersionUID = 1L; + protected String type = "default";// 鍔犺浇绫诲瀷 + protected String cssTheme ; + + public String getCssTheme() { + return cssTheme; + } + + + public void setCssTheme(String cssTheme) { + this.cssTheme = cssTheme; + } + + public void setType(String type) { + this.type = type; + } + + + public int doStartTag() throws JspException { + return EVAL_PAGE; + } + + + public int doEndTag() throws JspException { + try { + JspWriter out = this.pageContext.getOut(); + StringBuffer sb = new StringBuffer(); +/*// update-start--Author:longjb Date:20150408 for锛氭墜鍔ㄨ缃寚瀹氬睘鎬т富棰樹紭鍏 + //if (cssTheme == null) {// + Cookie[] cookies = ((HttpServletRequest) super.pageContext + .getRequest()).getCookies(); + for (Cookie cookie : cookies) { + if (cookie == null || StringUtils.isEmpty(cookie.getName())) { + continue; + } + if (cookie.getName().equalsIgnoreCase("JEECGCSSTHEME")) { + cssTheme = cookie.getValue(); + } + } + //} + if(cssTheme==null||"".equals(cssTheme)){ + cssTheme="default"; + }*/ + SysThemesEnum sysThemesEnum = SysThemesUtil.getSysTheme((HttpServletRequest) super.pageContext.getRequest()); + String types[] = type.split(","); + + //鎻掑叆澶氳瑷鑴氭湰 + String lang = (String)((HttpServletRequest) this.pageContext.getRequest()).getSession().getAttribute("lang"); + String langjs = StringUtil.replace("", "{0}", lang); + sb.append(langjs); + + if (oConvertUtils.isIn("jquery-webos", types)) { + sb.append(""); + } else if (oConvertUtils.isIn("jquery", types)) { + sb.append(""); + sb.append(""); + sb.append(""); + } + if (oConvertUtils.isIn("ckeditor", types)) { + sb.append(""); + sb.append(""); + } + if (oConvertUtils.isIn("ckfinder", types)) { + sb.append(""); + sb.append(""); + } + if (oConvertUtils.isIn("easyui", types)) { + sb.append(""); +// sb.append(""); + sb.append(SysThemesUtil.getEasyUiTheme(sysThemesEnum)); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + } + if (oConvertUtils.isIn("DatePicker", types)) { + sb.append(""); + } + if (oConvertUtils.isIn("jqueryui", types)) { + sb.append(""); + sb.append(""); + } + if (oConvertUtils.isIn("jqueryui-sortable", types)) { + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + } + if (oConvertUtils.isIn("prohibit", types)) { + sb.append(""); } + if (oConvertUtils.isIn("designer", types)) { + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + + //鍔犺浇easyui澶氳瑷 + sb.append(StringUtil.replace("", "{0}", lang)); + + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + + } + if (oConvertUtils.isIn("tools", types)) { +// sb.append(""); + sb.append(SysThemesUtil.getCommonTheme(sysThemesEnum)); +// sb.append(""); + sb.append(SysThemesUtil.getLhgdialogTheme(sysThemesEnum)); + sb.append(StringUtil.replace("", "{0}", lang)); + + sb.append(""); + sb.append(""); + sb.append(""); + } + if (oConvertUtils.isIn("toptip", types)) { + sb.append(""); + sb.append(""); + } + if (oConvertUtils.isIn("autocomplete", types)) { + sb.append(""); + sb.append(""); + } + if (oConvertUtils.isIn("jeasyuiextensions", types)) { + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + } + out.print(sb.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/ChooseTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/ChooseTag.java new file mode 100644 index 00000000..0e013787 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/ChooseTag.java @@ -0,0 +1,308 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; +import java.util.UUID; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.UUIDGenerator; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.springframework.beans.factory.annotation.Autowired; + + +/** + * + * 绫绘弿杩帮細閫夋嫨鍣ㄦ爣绛 + * + * @author: 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class ChooseTag extends TagSupport { + protected String hiddenName; + protected String textname;//鏄剧ず鏂囨湰妗嗗瓧娈 + protected String icon; + protected String title; + protected String url; + protected String top; + protected String left; + protected String width; + protected String height; + protected String name; + protected String hiddenid;// 闅愯棌妗嗗彇鍊糏D + protected Boolean isclear = false; + protected String fun;//鑷畾涔夊嚱鏁 + protected String inputTextname; + protected String langArg; + protected Boolean isInit = false;//鏄惁鍒濆鍖 + + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + + public int doEndTag() throws JspTagException { + try { + title = MutiLangUtil.doMutiLang(title, langArg); + JspWriter out = this.pageContext.getOut(); + out.print(end().toString()); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + + public StringBuffer end() { + String confirm = MutiLangUtil.getMutiLangInstance().getLang("common.confirm"); + String cancel = MutiLangUtil.getMutiLangInstance().getLang("common.cancel"); + String methodname = UUIDGenerator.generate().replaceAll("-", ""); + StringBuffer sb = new StringBuffer(); + sb.append("{0}", "{0}", MutiLangUtil.getMutiLangInstance().getLang("common.select", langArg))); + if (isclear&&StringUtil.isNotEmpty(textname)) { + sb.append("{0}", "{0}", MutiLangUtil.getMutiLangInstance().getLang("common.clear", langArg))); + } + sb.append(""); + return sb; + } + /** + * 娓呴櫎 + * @param sb + */ + private void clearAll(StringBuffer sb,String methodname) { + String[] textnames=null; + String[] inputTextnames=null; + textnames = textname.split(","); + if(StringUtil.isNotEmpty(inputTextname)){ + inputTextnames = inputTextname.split(","); + }else{ + inputTextnames = textnames; + } + if (isclear&&StringUtil.isNotEmpty(textname)) { + sb.append("function clearAll_"+methodname+"(){"); + for (int i = 0; i < textnames.length; i++) { + inputTextnames[i]=inputTextnames[i].replaceAll("\\[", "\\\\\\\\[").replaceAll("\\]", "\\\\\\\\]").replaceAll("\\.", "\\\\\\\\."); + sb.append("if($(\'#" + inputTextnames[i] + "\').length>=1){"); + sb.append("$(\'#" + inputTextnames[i] + "\').val('');"); + sb.append("$(\'#" + inputTextnames[i] + "\').blur();"); + sb.append("}"); + sb.append("if($(\"input[name='" + inputTextnames[i] + "']\").length>=1){"); + sb.append("$(\"input[name='" + inputTextnames[i] + "']\").val('');"); + sb.append("$(\"input[name='" + inputTextnames[i] + "']\").blur();"); + sb.append("}"); + } + sb.append("$(\'#" + hiddenName + "\').val(\"\");"); + sb.append("}"); + } + } + /** + * 鐐瑰嚮纭畾鍥炲~ + * @param sb + */ + private void callback(StringBuffer sb,String methodname) { + sb.append("function clickcallback_"+methodname+"(){"); + sb.append("iframe = this.iframe.contentWindow;"); + String[] textnames=null; + String[] inputTextnames=null; + if(StringUtil.isNotEmpty(textname)) + { + textnames = textname.split(","); + if(StringUtil.isNotEmpty(inputTextname)){ + inputTextnames = inputTextname.split(","); + }else{ + inputTextnames = textnames; + } + for (int i = 0; i < textnames.length; i++) { + inputTextnames[i]=inputTextnames[i].replaceAll("\\[", "\\\\\\\\[").replaceAll("\\]", "\\\\\\\\]").replaceAll("\\.", "\\\\\\\\."); + sb.append("var " + textnames[i] + "=iframe.get" + name + "Selections(\'" + textnames[i] + "\'); "); + sb.append("if($(\'#" + inputTextnames[i] + "\').length>=1){"); + sb.append("$(\'#" + inputTextnames[i] + "\').val(" + textnames[i] + ");"); + sb.append("$(\'#" + inputTextnames[i] + "\').blur();"); + sb.append("}"); + sb.append("if($(\"input[name='" + inputTextnames[i] + "']\").length>=1){"); + sb.append("$(\"input[name='" + inputTextnames[i] + "']\").val(" + textnames[i] + ");"); + sb.append("$(\"input[name='" + inputTextnames[i] + "']\").blur();"); + sb.append("}"); + } + } + if(StringUtil.isNotEmpty(hiddenName)){ + sb.append("var id =iframe.get" + name + "Selections(\'" + hiddenid + "\');"); + sb.append("if (id!== undefined &&id!=\"\"){"); + sb.append("$(\'#" + hiddenName + "\').val(id);"); + sb.append("}"); + } + if(StringUtil.isNotEmpty(fun)) + { + sb.append(""+fun+"();");//鎵ц鑷畾涔夊嚱鏁 + } + sb.append("}"); + } + + + public void setHiddenName(String hiddenName) { + this.hiddenName = hiddenName; + } + + public void setName(String name) { + this.name = name; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public void setTextname(String textname) { + this.textname = textname; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setUrl(String url) { + this.url = url; + } + + public void setTop(String top) { + this.top = top; + } + + public void setLeft(String left) { + this.left = left; + } + + public void setWidth(String width) { + this.width = width; + } + + public void setHeight(String height) { + this.height = height; + } + + public void setIsclear(Boolean isclear) { + this.isclear = isclear; + } + + public void setHiddenid(String hiddenid) { + this.hiddenid = hiddenid; + } + public void setFun(String fun) { + this.fun = fun; + } + + public String getInputTextname() { + return inputTextname; + } + + public void setInputTextname(String inputTextname) { + this.inputTextname = inputTextname; + } + + public String getLangArg() { + return langArg; + } + + public void setLangArg(String langArg) { + this.langArg = langArg; + } + + public void setIsInit(Boolean isInit) { + this.isInit = isInit; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/CkeditorTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/CkeditorTag.java new file mode 100644 index 00000000..18dd869c --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/CkeditorTag.java @@ -0,0 +1,105 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.util.PropertiesUtil; +import org.jeecgframework.core.util.StringUtil; + +/** + * + * @author 寮犱唬娴 + * + */ +public class CkeditorTag extends TagSupport { + + private static final long serialVersionUID = 1L; + protected String name;// 灞炴у悕绉 + protected String value;// 榛樿鍊 + protected boolean isfinder;// 鏄惁鍔犺浇ckfinder(榛樿true) + protected String type;// 鍏跺畠灞炴(鐢ㄦ硶:height:400,uiColor:'#9AB8F3' 鐢,鍒嗗壊) + + public boolean isIsfinder() { + return isfinder; + } + + public void setIsfinder(boolean isfinder) { + this.isfinder = isfinder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + + public int doEndTag() throws JspTagException { + try { + JspWriter out = this.pageContext.getOut(); + out.print(end().toString()); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + + public StringBuffer end() { + StringBuffer sb = new StringBuffer(); + + sb.append(""); + sb.append(""); + return sb; + } +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/CkfinderTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/CkfinderTag.java new file mode 100644 index 00000000..3f234874 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/CkfinderTag.java @@ -0,0 +1,120 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.util.StringUtil; + +/** + * ckfinder鏍囩 + * + * @author Alexander + * + */ +public class CkfinderTag extends TagSupport { + + private static final long serialVersionUID = 1L; + protected String name;// 灞炴у悕绉 + protected String value;// 榛樿鍊 + protected String width;// 鏄剧ず鍥剧墖瀹(涓婁紶绫诲瀷涓篒mages鏃) + protected String height;// 鏄剧ず鍥剧墖楂(涓婁紶绫诲瀷涓篒mages鏃) + protected String buttonClass;// 鎸夐挳鏍峰紡 + protected String buttonValue;// 鎸夐挳鍚嶇О + protected String uploadType;// 涓婁紶绫诲瀷(Images,Files,Flash) + + public String getButtonValue() { + return buttonValue; + } + + public void setButtonValue(String buttonValue) { + this.buttonValue = buttonValue; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getWidth() { + return width; + } + + public void setWidth(String width) { + this.width = width; + } + + public String getHeight() { + return height; + } + + public void setHeight(String height) { + this.height = height; + } + + public String getButtonClass() { + return buttonClass; + } + + public void setButtonClass(String buttonClass) { + this.buttonClass = buttonClass; + } + + public String getUploadType() { + return uploadType; + } + + public void setUploadType(String uploadType) { + this.uploadType = uploadType; + } + + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + + public int doEndTag() throws JspTagException { + try { + JspWriter out = this.pageContext.getOut(); + out.print(end().toString()); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + + public StringBuffer end() { + StringBuffer sb = new StringBuffer(); + if ("Images".equals(uploadType)) { + sb.append(""); + } else { + sb.append(""); + sb.append(""); + } + sb.append(""); + sb.append(""); + return sb; + } +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/ColorChangeTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/ColorChangeTag.java new file mode 100644 index 00000000..7bc9277e --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/ColorChangeTag.java @@ -0,0 +1,35 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +/** + * + * 绫绘弿杩帮細鏀瑰彉HTML鎺т欢棰滆壊 + * + * @author: 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class ColorChangeTag extends TagSupport { + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + public int doEndTag() throws JspTagException { + try { + JspWriter out = this.pageContext.getOut(); + out.print(end().toString()); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + public StringBuffer end() { + StringBuffer sb = new StringBuffer(); + return sb; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/ComboBoxTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/ComboBoxTag.java new file mode 100644 index 00000000..45669bac --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/ComboBoxTag.java @@ -0,0 +1,82 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.common.model.json.ComboBox; + + +/** + * + * 绫绘弿杩帮細涓嬫媺閫夋嫨妗嗘爣绛 + * + * @author: 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class ComboBoxTag extends TagSupport { + protected String id;// ID + protected String text;// 鏄剧ず鏂囨湰 + protected String url;//杩滅▼鏁版嵁 + protected String name;//鎺т欢鍚嶇О + protected Integer width;//瀹藉害 + protected Integer listWidth;//涓嬫媺妗嗗搴 + protected Integer listHeight;//涓嬫媺妗嗛珮搴 + protected boolean editable;//瀹氫箟鏄惁鍙互鐩存帴鍒版枃鏈煙涓敭鍏ユ枃鏈 + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + public int doEndTag() throws JspTagException { + try { + JspWriter out = this.pageContext.getOut(); + out.print(end().toString()); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + public StringBuffer end() { + StringBuffer sb = new StringBuffer(); + ComboBox comboBox=new ComboBox(); + comboBox.setText(text); + comboBox.setId(id); + sb.append(""); + sb.append(" " + +""); + return sb; + } + public void setId(String id) { + this.id = id; + } + public void setText(String text) { + this.text = text; + } + public void setUrl(String url) { + this.url = url; + } + public void setName(String name) { + this.name = name; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/ComboTreeTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/ComboTreeTag.java new file mode 100644 index 00000000..f883c3f4 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/ComboTreeTag.java @@ -0,0 +1,81 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +/** + * + * 绫绘弿杩帮細涓嬫媺鏍戝舰鑿滃崟 + * + * @author: 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class ComboTreeTag extends TagSupport { + protected String id;// ID + protected String url;// 杩滅▼鏁版嵁 + protected String name;// 鎺т欢鍚嶇О + protected String width;// 瀹藉害 + protected String value;// 鎺т欢鍊 + private boolean multiple=false;//鏄惁澶氶 + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + + public int doEndTag() throws JspTagException { + try { + JspWriter out = this.pageContext.getOut(); + out.print(end().toString()); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + + public StringBuffer end() { + StringBuffer sb = new StringBuffer(); + width = (width == null) ? "140" : width; + sb.append(""); + sb.append(""); + return sb; + } + + public void setId(String id) { + this.id = id; + } + + public void setUrl(String url) { + this.url = url; + } + + public void setName(String name) { + this.name = name; + } + + public void setWidth(String width) { + this.width = width; + } + + public void setValue(String value) { + this.value = value; + } + public void setMultiple(boolean multiple) { + this.multiple = multiple; + } +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/DataGridColumnTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridColumnTag.java new file mode 100644 index 00000000..35b3a0f1 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridColumnTag.java @@ -0,0 +1,195 @@ +package org.jeecgframework.tag.core.easyui; + +import org.jeecgframework.core.util.MutiLangUtil; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.tagext.Tag; +import javax.servlet.jsp.tagext.TagSupport; + +/** + * + * 绫绘弿杩帮細鍒楄〃瀛楁澶勭悊椤圭洰 + * + * 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class DataGridColumnTag extends TagSupport { + private static final long serialVersionUID = 1L; + protected String title; + protected String field; + protected Integer width; + protected String rowspan; + protected String colspan; + protected String align; + protected boolean sortable=true; + protected boolean checkbox; + protected String formatter; + protected boolean hidden=false; + protected String replace; + protected String treefield; + protected boolean image; + protected boolean query=false; + private String queryMode = "single";//瀛楁鏌ヨ妯″紡锛歴ingle鍗曞瓧娈垫煡璇紱scope鑼冨洿鏌ヨ + + //protected boolean autoLoadData = true; // 鍒楄〃鏄惁鑷姩鍔犺浇鏁版嵁 + private boolean frozenColumn=false; // 鏄惁鏄啺鍐诲垪 榛樿涓嶆槸 + protected boolean bSearchable=true; + protected String url;//鑷畾涔夐摼鎺 + protected String funname="openwindow";//鑷畾涔夊嚱鏁板悕绉 + protected String arg;//鑷畾涔夐摼鎺ヤ紶鍏ュ弬鏁板瓧娈 + protected String dictionary; //鏁版嵁瀛楀吀缁勭紪鐮 + protected boolean popup=false; //鏄惁鍚敤popup妯″紡閫夋嫨 榛樿涓嶅惎鐢 + protected String extend; //鎵╁睍灞炴 + protected String style; //Td鐨凜SS + protected String imageSize;//鑷畾涔夊浘鐗囨樉绀哄ぇ灏 + protected String downloadName;//闄勪欢涓嬭浇 + private boolean autocomplete = false;//鑷姩瀹屾垚 + private String extendParams;//鎵╁睍鍙傛暟 + private String langArg; + + public int doEndTag() throws JspTagException { + title = MutiLangUtil.doMutiLang(title, langArg); + + Tag t = findAncestorWithClass(this, DataGridTag.class); + DataGridTag parent = (DataGridTag) t; + parent.setColumn(title,field,width,rowspan,colspan,align,sortable,checkbox,formatter,hidden,replace,treefield,image,imageSize,query,url,funname,arg,queryMode, dictionary,popup,frozenColumn,extend,style,downloadName,autocomplete,extendParams); + return EVAL_PAGE; + } + + public void setDownloadName(String downloadName) { + this.downloadName = downloadName; + } + + public void setImageSize(String imageSize) { + this.imageSize = imageSize; + } + + public void setArg(String arg) { + this.arg = arg; + } + + public void setUrl(String url) { + this.url = url; + } + + public void setFunname(String funname) { + this.funname = funname; + } + + public void setbSearchable(boolean bSearchable) { + this.bSearchable = bSearchable; + } + + public void setQuery(boolean query) { + this.query = query; + } + + public void setImage(boolean image) { + this.image = image; + } + + public void setTreefield(String treefield) { + this.treefield = treefield; + } + + public void setReplace(String replace) { + this.replace = replace; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setField(String field) { + this.field = field; + } + + public void setWidth(Integer width) { + this.width = width; + } + + public void setRowspan(String rowspan) { + this.rowspan = rowspan; + } + + public void setColspan(String colspan) { + this.colspan = colspan; + } + + public void setAlign(String align) { + this.align = align; + } + + public void setSortable(boolean sortable) { + this.sortable = sortable; + } + + public void setCheckbox(boolean checkbox) { + this.checkbox = checkbox; + } + + public void setFormatter(String formatter) { + this.formatter = formatter; + } + + public void setHidden(boolean hidden) { + this.hidden = hidden; + } + + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + + + public void setDictionary(String dictionary) { + this.dictionary = dictionary; + } + public String getQueryMode() { + return queryMode; + } + + public boolean isPopup() { + return popup; + } + + public void setPopup(boolean popup) { + this.popup = popup; + } + + public void setQueryMode(String queryMode) { + this.queryMode = queryMode; + } + + public boolean isFrozenColumn() { + return frozenColumn; + } + + public void setFrozenColumn(boolean frozenColumn) { + this.frozenColumn = frozenColumn; + } + + public String getExtend() { + return extend; + } + + public void setExtend(String extend) { + this.extend = extend; + } + + public void setStyle(String style) { + this.style = style; + } + + public void setAutocomplete(boolean autocomplete) { + this.autocomplete = autocomplete; + } + + public void setExtendParams(String extendParams) { + this.extendParams = extendParams; + } + + public void setLangArg(String langArg) { + this.langArg = langArg; + } +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/DataGridConfOptTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridConfOptTag.java new file mode 100644 index 00000000..170ebe30 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridConfOptTag.java @@ -0,0 +1,47 @@ +package org.jeecgframework.tag.core.easyui; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.tagext.Tag; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.util.MutiLangUtil; + +/** + * + * 绫绘弿杩帮細鍒楄〃鎿嶄綔椤瑰鐞嗘爣绛 + * + * 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class DataGridConfOptTag extends TagSupport { + protected String url; + protected String title; + private String message;//璇㈤棶閾炬帴鐨勬彁绀鸿 + private String exp;//鍒ゆ柇閾炬帴鏄惁鏄剧ず鐨勮〃杈惧紡 + private String operationCode;//鎸夐挳鐨勬搷浣淐ode + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + public int doEndTag() throws JspTagException { + Tag t = findAncestorWithClass(this, DataGridTag.class); + DataGridTag parent = (DataGridTag) t; + parent.setConfUrl(url,MutiLangUtil.getMutiLangInstance().getLang(title),MutiLangUtil.getMutiLangInstance().getLang(message),exp,operationCode); + return EVAL_PAGE; + } + public void setExp(String exp) { + this.exp = exp; + } + public void setUrl(String url) { + this.url = url; + } + public void setTitle(String title) { + this.title = title; + } + public void setMessage(String message) { + this.message = message; + } + public void setOperationCode(String operationCode) { + this.operationCode = operationCode; + } +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/DataGridDefOptTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridDefOptTag.java new file mode 100644 index 00000000..50903a5e --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridDefOptTag.java @@ -0,0 +1,43 @@ +package org.jeecgframework.tag.core.easyui; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.tagext.Tag; +import javax.servlet.jsp.tagext.TagSupport; + +/** + * + * 绫绘弿杩帮細鍒楄〃榛樿鎿嶄綔椤规爣绛 + * + * 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class DataGridDefOptTag extends TagSupport { + protected String url; + protected String title; + private String exp;//鍒ゆ柇閾炬帴鏄惁鏄剧ず鐨勮〃杈惧紡 + private String operationCode;//鎸夐挳鐨勬搷浣淐ode + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + public int doEndTag() throws JspTagException { + Tag t = findAncestorWithClass(this, DataGridTag.class); + DataGridTag parent = (DataGridTag) t; + parent.setDefUrl(url, title, exp,operationCode); + return EVAL_PAGE; + } + + public void setExp(String exp) { + this.exp = exp; + } + public void setUrl(String url) { + this.url = url; + } + public void setTitle(String title) { + this.title = title; + } + public void setOperationCode(String operationCode) { + this.operationCode = operationCode; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/DataGridDelOptTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridDelOptTag.java new file mode 100644 index 00000000..bf357ac1 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridDelOptTag.java @@ -0,0 +1,63 @@ +package org.jeecgframework.tag.core.easyui; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.tagext.Tag; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.util.ApplicationContextUtil; +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * 绫绘弿杩帮細鍒楄〃鍒犻櫎鎿嶄綔椤规爣绛 + * + * @author 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class DataGridDelOptTag extends TagSupport { + protected String url; + protected String title; + private String message;//璇㈤棶閾炬帴鐨勬彁绀鸿 + private String exp;//鍒ゆ柇閾炬帴鏄惁鏄剧ず鐨勮〃杈惧紡 + private String funname;//鑷畾涔夊嚱鏁板悕绉 + + private String operationCode;//鎸夐挳鐨勬搷浣淐ode + private String langArg; + + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + public int doEndTag() throws JspTagException { + title = MutiLangUtil.doMutiLang(title, langArg); + + Tag t = findAncestorWithClass(this, DataGridTag.class); + DataGridTag parent = (DataGridTag) t; + parent.setDelUrl(url, title, message, exp, funname,operationCode); + return EVAL_PAGE; + } + public void setFunname(String funname) { + this.funname = funname; + } + public void setExp(String exp) { + this.exp = exp; + } + public void setUrl(String url) { + this.url = url; + } + public void setTitle(String title) { + this.title = title; + } + public void setMessage(String message) { + this.message = message; + } + public void setOperationCode(String operationCode) { + this.operationCode = operationCode; + } + + public void setLangArg(String langArg) { + this.langArg = langArg; + } +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/DataGridFunOptTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridFunOptTag.java new file mode 100644 index 00000000..45fed4bb --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridFunOptTag.java @@ -0,0 +1,57 @@ +package org.jeecgframework.tag.core.easyui; + +import org.jeecgframework.core.util.ApplicationContextUtil; +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.tagext.Tag; +import javax.servlet.jsp.tagext.TagSupport; + +/** + * + * 绫绘弿杩帮細鍒楄〃鑷畾涔夊嚱鏁版搷浣滈」澶勭悊鏍囩 + * + @author 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class DataGridFunOptTag extends TagSupport { + + protected String title; + private String exp;//鍒ゆ柇閾炬帴鏄惁鏄剧ず鐨勮〃杈惧紡 + private String funname;//鑷畾涔夊嚱鏁板悕绉 + private String operationCode;//鎸夐挳鐨勬搷浣淐ode + private String langArg;//鎸夐挳鐨勬搷浣淐ode + + + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + public int doEndTag() throws JspTagException { + title = MutiLangUtil.doMutiLang(title, langArg); + + Tag t = findAncestorWithClass(this, DataGridTag.class); + DataGridTag parent = (DataGridTag) t; + parent.setFunUrl(title,exp,funname,operationCode); + return EVAL_PAGE; + } + public void setFunname(String funname) { + this.funname = funname; + } + public void setExp(String exp) { + this.exp = exp; + } + public void setTitle(String title) { + this.title = title; + } + public void setOperationCode(String operationCode) { + this.operationCode = operationCode; + } + + public void setLangArg(String langArg) { + this.langArg = langArg; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/DataGridOpenOptTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridOpenOptTag.java new file mode 100644 index 00000000..054bbc13 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridOpenOptTag.java @@ -0,0 +1,56 @@ +package org.jeecgframework.tag.core.easyui; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.tagext.Tag; +import javax.servlet.jsp.tagext.TagSupport; + +/** + * + * 绫绘弿杩帮細鍒楄〃寮瑰嚭绐楁搷浣滈」澶勭悊鏍囩 + * + @author 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class DataGridOpenOptTag extends TagSupport { + protected String url;//寮瑰嚭椤甸潰鍦板潃 + protected String width="100%";//寮瑰嚭绐楀彛瀹藉害 + protected String height="100%";//寮瑰嚭绐楀彛楂樺害 + protected String title;//閾炬帴鏍囬 + private String exp;//鍒ゆ柇閾炬帴鏄惁鏄剧ず鐨勮〃杈惧紡 + private String operationCode;//鎸夐挳鐨勬搷浣淐ode + + private String openModel = "OpenWin"; //寮瑰嚭鏂瑰紡 + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + public int doEndTag() throws JspTagException { + Tag t = findAncestorWithClass(this, DataGridTag.class); + DataGridTag parent = (DataGridTag) t; + parent.setOpenUrl(url,title,width,height,exp,operationCode,openModel); + return EVAL_PAGE; + } + public void setWidth(String width) { + this.width = width; + } + public void setHeight(String height) { + this.height = height; + } + public void setExp(String exp) { + this.exp = exp; + } + + public void setUrl(String url) { + this.url = url; + } + public void setTitle(String title) { + this.title = title; + } + public void setOperationCode(String operationCode) { + this.operationCode = operationCode; + } + public void setOpenModel(String openModel) { + this.openModel = openModel; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/DataGridTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridTag.java new file mode 100644 index 00000000..6d04f332 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridTag.java @@ -0,0 +1,2055 @@ +package org.jeecgframework.tag.core.easyui; + +import com.google.gson.Gson; + +import net.sf.json.JSONObject; + +import org.apache.commons.lang.StringUtils; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.enums.SysThemesEnum; +import org.jeecgframework.core.util.*; +import org.jeecgframework.tag.vo.easyui.ColumnValue; +import org.jeecgframework.tag.vo.easyui.DataGridColumn; +import org.jeecgframework.tag.vo.easyui.DataGridUrl; +import org.jeecgframework.tag.vo.easyui.OptTypeDirection; +import org.jeecgframework.web.system.pojo.base.TSOperation; +import org.jeecgframework.web.system.pojo.base.TSType; +import org.jeecgframework.web.system.pojo.base.TSTypegroup; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import java.io.IOException; +import java.text.MessageFormat; +import java.util.*; + + +/** + * + * 绫绘弿杩帮細DATAGRID鏍囩澶勭悊绫 + * + @author 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +@SuppressWarnings({"serial","rawtypes","unchecked","static-access"}) +public class DataGridTag extends TagSupport { + protected String fields = "";// 鏄剧ず瀛楁 + protected String searchFields = "";// 鏌ヨ瀛楁 Author:qiulu Date:20130618 for锛氭坊鍔犲鍖洪棿鏌ヨ鐨勬敮鎸 + protected String name;// 琛ㄦ牸鏍囩ず + protected String title;// 琛ㄦ牸鏍囩ず + protected String idField="id";// 涓婚敭瀛楁 + protected boolean treegrid = false;// 鏄惁鏄爲褰㈠垪琛 + protected List urlList = new ArrayList();// 鍒楄〃鎿嶄綔鏄剧ず + protected List toolBarList = new ArrayList();// 宸ュ叿鏉″垪琛 + protected List columnList = new ArrayList();// 鍒楄〃鎿嶄綔鏄剧ず + protected List columnValueList = new ArrayList();// 鍊兼浛鎹㈤泦鍚 + protected List columnStyleList = new ArrayList();// 棰滆壊鏇挎崲闆嗗悎 + public Map map;// 灏佽鏌ヨ鏉′欢 + private String actionUrl;// 鍒嗛〉鎻愪氦璺緞 + public int allCount; + public int curPageNo; + public int pageSize = 10; + public boolean pagination = true;// 鏄惁鏄剧ず鍒嗛〉 + private String width; + private String height; + private boolean checkbox = false;// 鏄惁鏄剧ず澶嶉夋 + private boolean showPageList = true;// 瀹氫箟鏄惁鏄剧ず椤甸潰鍒楄〃 + private boolean openFirstNode = false;//鏄笉鏄睍寮绗竴涓妭鐐 + private boolean fit = true;// 鏄惁鍏佽琛ㄦ牸鑷姩缂╂斁锛屼互閫傚簲鐖跺鍣 + private boolean fitColumns = true;// 褰撲负true鏃讹紝鑷姩灞曞紑/鍚堝悓鍒楃殑澶у皬锛屼互閫傚簲鐨勫搴︼紝闃叉妯悜婊氬姩. + private String sortName;//瀹氫箟鐨勫垪杩涜鎺掑簭 + private String sortOrder = "asc";//瀹氫箟鍒楃殑鎺掑簭椤哄簭锛屽彧鑳芥槸"閫掑"鎴"闄嶅簭". + private boolean showRefresh = true;// 瀹氫箟鏄惁鏄剧ず鍒锋柊鎸夐挳 + private boolean showText = true;// 瀹氫箟鏄惁鏄剧ず鍒锋柊鎸夐挳 + private String style = "easyui";// 鍒楄〃鏍峰紡easyui,datatables + private String onLoadSuccess;// 鏁版嵁鍔犺浇瀹屾垚璋冪敤鏂规硶 + private String onClick;// 鍗曞嚮浜嬩欢璋冪敤鏂规硶 + private String onDblClick;// 鍙屽嚮浜嬩欢璋冪敤鏂规硶 + private String queryMode = "single";//鏌ヨ妯″紡 + private String entityName;//瀵瑰簲鐨勫疄浣撳璞 + private String rowStyler;//rowStyler鍑芥暟 + private String extendParams;//鎵╁睍鍙傛暟,easyui鏈夌殑,浣嗘槸jeecg娌℃湁鐨勫弬鏁拌繘琛屾墿灞 + private boolean autoLoadData=true; // 鍒楄〃鏄惁鑷姩鍔犺浇鏁版嵁 + //private boolean frozenColumn=false; // 鏄惁鏄啺鍐诲垪 榛樿涓嶆槸 + private String langArg; + + private boolean queryBuilder = false;// 楂樼骇鏌ヨ鍣 + public boolean isQueryBuilder() { + return queryBuilder; + } + + public void setQueryBuilder(boolean queryBulder) { + this.queryBuilder = queryBulder; + } + + //json杞崲涓殑绯荤粺淇濈暀瀛 + protected static Map syscode = new HashMap(); + static{ + syscode.put("class", "clazz"); + } + + @Autowired + private static SystemService systemService; + + public void setOnLoadSuccess(String onLoadSuccess) { + this.onLoadSuccess = onLoadSuccess; + } + + public void setOnClick(String onClick) { + this.onClick = onClick; + } + + public void setOnDblClick(String onDblClick) { + this.onDblClick = onDblClick; + } + + public void setShowText(boolean showText) { + this.showText = showText; + } + + public void setPagination(boolean pagination) { + this.pagination = pagination; + } + + public void setCheckbox(boolean checkbox) { + this.checkbox = checkbox; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public void setTreegrid(boolean treegrid) { + this.treegrid = treegrid; + } + + public void setWidth(String width) { + this.width = width; + } + + public void setHeight(String height) { + this.height = height; + } + + public void setIdField(String idField) { + this.idField = idField; + } + + public void setActionUrl(String actionUrl) { + this.actionUrl = actionUrl; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setName(String name) { + this.name = name; + } + + public void setFit(boolean fit) { + this.fit = fit; + } + + public void setShowPageList(boolean showPageList) { + this.showPageList = showPageList; + } + + public void setShowRefresh(boolean showRefresh) { + this.showRefresh = showRefresh; + } + /** + * 璁剧疆璇㈤棶鎿嶄綔URL + */ + public void setConfUrl(String url, String title, String message, String exp,String operationCode) { + DataGridUrl dataGridUrl = new DataGridUrl(); + dataGridUrl.setTitle(title); + dataGridUrl.setUrl(url); + dataGridUrl.setType(OptTypeDirection.Confirm); + dataGridUrl.setMessage(message); + dataGridUrl.setExp(exp); + installOperationCode(dataGridUrl, operationCode,urlList); + } + + /** + * 璁剧疆鍒犻櫎鎿嶄綔URL + */ + public void setDelUrl(String url, String title, String message, String exp, String funname,String operationCode) { + DataGridUrl dataGridUrl = new DataGridUrl(); + dataGridUrl.setTitle(title); + dataGridUrl.setUrl(url); + dataGridUrl.setType(OptTypeDirection.Del); + dataGridUrl.setMessage(message); + dataGridUrl.setExp(exp); + dataGridUrl.setFunname(funname); + installOperationCode(dataGridUrl, operationCode,urlList); + } + /** + * 璁剧疆榛樿鎿嶄綔URL + */ + public void setDefUrl(String url, String title, String exp,String operationCode) { + DataGridUrl dataGridUrl = new DataGridUrl(); + dataGridUrl.setTitle(title); + dataGridUrl.setUrl(url); + dataGridUrl.setType(OptTypeDirection.Deff); + dataGridUrl.setExp(exp); + installOperationCode(dataGridUrl, operationCode,urlList); + + } + /** + * 璁剧疆宸ュ叿鏉 + * @param height2 + * @param width2 + */ + public void setToolbar(String url, String title, String icon, String exp,String onclick, String funname,String operationCode, String width2, String height2) { + DataGridUrl dataGridUrl = new DataGridUrl(); + dataGridUrl.setTitle(title); + dataGridUrl.setUrl(url); + dataGridUrl.setType(OptTypeDirection.ToolBar); + dataGridUrl.setIcon(icon); + dataGridUrl.setOnclick(onclick); + dataGridUrl.setExp(exp); + dataGridUrl.setFunname(funname); + dataGridUrl.setWidth(String.valueOf(width2)); + dataGridUrl.setHeight(String.valueOf(height2)); + installOperationCode(dataGridUrl, operationCode,toolBarList); + + } + + /** + * 璁剧疆鑷畾涔夊嚱鏁版搷浣淯RL + */ + public void setFunUrl(String title, String exp, String funname,String operationCode) { + DataGridUrl dataGridUrl = new DataGridUrl(); + dataGridUrl.setTitle(title); + dataGridUrl.setType(OptTypeDirection.Fun); + dataGridUrl.setExp(exp); + dataGridUrl.setFunname(funname); + installOperationCode(dataGridUrl, operationCode,urlList); + + } + + /** + * 璁剧疆鑷畾涔夊嚱鏁版搷浣淯RL + */ + public void setOpenUrl(String url, String title, String width, String height, String exp,String operationCode, String openModel) { + DataGridUrl dataGridUrl = new DataGridUrl(); + dataGridUrl.setTitle(title); + dataGridUrl.setUrl(url); + dataGridUrl.setWidth(width); + dataGridUrl.setHeight(height); + dataGridUrl.setType(OptTypeDirection.valueOf(openModel)); + dataGridUrl.setExp(exp); + installOperationCode(dataGridUrl, operationCode,urlList); + + } + + /** + * + * Summary: setColumn(璁剧疆瀛楁) + * + * @param title + * @param field + * @param width + */ + public void setColumn(String title, String field, Integer width, String rowspan, + String colspan, String align, boolean sortable, boolean checkbox, + String formatter, boolean hidden, String replace, + String treefield, boolean image,String imageSize, + boolean query, String url, String funname, + String arg,String queryMode, String dictionary,boolean popup, + boolean frozenColumn,String extend, + String style,String downloadName,boolean isAuto,String extendParams) { + DataGridColumn dataGridColumn = new DataGridColumn(); + dataGridColumn.setAlign(align); + dataGridColumn.setCheckbox(checkbox); + dataGridColumn.setColspan(colspan); + dataGridColumn.setField(field); + dataGridColumn.setFormatter(formatter); + dataGridColumn.setHidden(hidden); + dataGridColumn.setRowspan(rowspan); + dataGridColumn.setSortable(sortable); + dataGridColumn.setTitle(title); + dataGridColumn.setWidth(width); + dataGridColumn.setTreefield(treefield); + dataGridColumn.setImage(image); + dataGridColumn.setImageSize(imageSize); + dataGridColumn.setReplace(replace); + dataGridColumn.setQuery(query); + dataGridColumn.setUrl(url); + dataGridColumn.setFunname(funname); + dataGridColumn.setArg(arg); + dataGridColumn.setQueryMode(queryMode); + dataGridColumn.setDictionary(dictionary); + dataGridColumn.setPopup(popup); + dataGridColumn.setFrozenColumn(frozenColumn); + dataGridColumn.setExtend(extend); + dataGridColumn.setStyle(style); + dataGridColumn.setDownloadName(downloadName); + dataGridColumn.setAutocomplete(isAuto); + dataGridColumn.setExtendParams(extendParams); + columnList.add(dataGridColumn); + Set operationCodes = (Set) super.pageContext.getRequest().getAttribute(Globals.OPERATIONCODES); + if (null!=operationCodes) { + for (String MyoperationCode : operationCodes) { + if (oConvertUtils.isEmpty(MyoperationCode)) + break; + systemService = ApplicationContextUtil.getContext().getBean( + SystemService.class); + TSOperation operation = systemService.getEntity(TSOperation.class, MyoperationCode); + if(operation.getOperationcode().equals(field)){ + columnList.remove(dataGridColumn); + } + } + } + + + + if (field != "opt") { + fields += field + ","; + if ("group".equals(queryMode)) { + searchFields += field + "," + field + "_begin," + field + "_end,"; + } else { + searchFields += field + ","; + } + } + if (replace != null) { + String[] test = replace.split(","); + String lang_key = ""; + String text = ""; + String value = ""; + for (String string : test) { + lang_key = string.substring(0, string.indexOf("_")); + text += MutiLangUtil.getMutiLangInstance().getLang(lang_key) + ","; + + value += string.substring(string.indexOf("_") + 1) + ","; + } + setColumn(field, text, value); + + } + if (!StringUtils.isBlank(dictionary)&&(!popup)) { + if(dictionary.contains(",")){ + ; + String[] dic = dictionary.split(","); + String text = ""; + String value = ""; + String sql = "select " + dic[1] + " as field," + dic[2] + + " as text from " + dic[0]; + systemService = ApplicationContextUtil.getContext().getBean( + SystemService.class); + List> list = systemService.findForJdbc(sql); + for (Map map : list){ + text += map.get("text") + ","; + value += map.get("field") + ","; + } + if(list.size()>0) + setColumn(field, text, value); + }else{ + String text = ""; + String value = ""; + List typeList = TSTypegroup.allTypes.get(dictionary.toLowerCase()); + if (typeList != null && !typeList.isEmpty()) { + for (TSType type : typeList) { + text += MutiLangUtil.doMutiLang(type.getTypename(), "") + ","; + value += type.getTypecode() + ","; + } + setColumn(field, text, value); + } + } + } + if(StringUtil.isNotEmpty(style)){ + String[] temp = style.split(","); + String text = ""; + String value = ""; + if(temp.length == 1&&temp[0].indexOf("_")==-1){ + text = temp[0]; + }else{ + for (String string : temp) { + text += string.substring(0, string.indexOf("_")) + ","; + value += string.substring(string.indexOf("_") + 1) + ","; + } + } + setStyleColumn(field, text, value); + } + } + + /** + * 璁剧疆 棰滆壊鏇挎崲鍊 + * @param field + * @param text + * @param value + */ + private void setStyleColumn(String field, String text, String value) { + ColumnValue columnValue = new ColumnValue(); + columnValue.setName(field); + columnValue.setText(text); + columnValue.setValue(value); + columnStyleList.add(columnValue); + } + + /** + * + * Summary: setColumn(璁剧疆瀛楁鏇挎崲鍊) + * + * @param name + * @param text + * @param value + */ + public void setColumn(String name, String text, String value) { + ColumnValue columnValue = new ColumnValue(); + columnValue.setName(name); + columnValue.setText(text); + columnValue.setValue(value); + columnValueList.add(columnValue); + } + + public int doStartTag() throws JspTagException { + // 娓呯┖璧勬簮 + urlList.clear(); + toolBarList.clear(); + columnValueList.clear(); + columnStyleList.clear(); + columnList.clear(); + fields = ""; + searchFields = ""; + return EVAL_PAGE; + } + + + public int doEndTag() throws JspException { + try { + title = MutiLangUtil.doMutiLang(title, langArg); + + JspWriter out = this.pageContext.getOut(); +// String indexStyle =null; +//-----author:jg_longjb----start-----date:20150408--------for:璇诲彇cookie涓婚鏍峰紡 ace鐣岄潰涓媡able鐨勮緭鍑 +// Cookie[] cookies = ((HttpServletRequest) super.pageContext +// .getRequest()).getCookies(); +// for (Cookie cookie : cookies) { +// if (cookie == null || StringUtils.isEmpty(cookie.getName())) { +// continue; +// } +// if (cookie.getName().equalsIgnoreCase("JEECGINDEXSTYLE")) { +// indexStyle = cookie.getValue(); +// } +// } + SysThemesEnum sysThemesEnum = SysThemesUtil.getSysTheme((HttpServletRequest) super.pageContext.getRequest()); + if (style.equals("easyui")) { + if("ace".equals(sysThemesEnum.getStyle())){ + out.print(this.aceStyleTable().toString()); + }else{ + out.print(end().toString()); + } + }else{ + out.print(datatables().toString()); + out.flush(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + + /** + * datatables鏋勯犳柟娉 + * + * @return + */ + public StringBuffer datatables() { + StringBuffer sb = new StringBuffer(); + sb.append(""); + sb.append("
    "); + return sb; + + } + + public void setStyle(String style) { + this.style = style; + } + + /** + * easyui鏋勯犳柟娉 + * + * @return + */ + public StringBuffer end() { + String grid = ""; + StringBuffer sb = new StringBuffer(); + width = (width == null) ? "auto" : width; + height = (height == null) ? "auto" : height; + sb.append(""); + sb.append("
    "); + sb.append("
    "); + if(hasQueryColum(columnList)){ + sb.append("
    "); + //-----longjb1 澧炲姞鐢ㄤ簬楂樼骇鏌ヨ鐨勫弬鏁伴」 + sb.append(""); + //濡傛灉琛ㄥ崟鏄粍鍚堟煡璇 + if("group".equals(getQueryMode())){ + for (DataGridColumn col : columnList) { + if (col.isQuery()) { + sb.append(""); + sb.append(""+col.getTitle()+"锛"); + if("single".equals(col.getQueryMode())){ + if(!StringUtil.isEmpty(col.getReplace())){ + sb.append(""); + }else if(!StringUtil.isEmpty(col.getDictionary())){ + if(col.getDictionary().contains(",")&&col.isPopup()){ + String[] dic = col.getDictionary().split(","); + String sql = "select " + dic[1] + " as field," + dic[2] + + " as text from " + dic[0]; + System.out.println(dic[0]+"--"+dic[1]+"--"+dic[2]); + // + sb.append(" "); + }else if(col.getDictionary().contains(",")&&(!col.isPopup())){ + String[] dic = col.getDictionary().split(","); + String sql = "select " + dic[1] + " as field," + dic[2] + + " as text from " + dic[0]; + systemService = ApplicationContextUtil.getContext().getBean( + SystemService.class); + List> list = systemService.findForJdbc(sql); + sb.append(""); + }else{ + Map> typedatas = TSTypegroup.allTypes; + List types = typedatas.get(col.getDictionary().toLowerCase()); + sb.append(""); + } + }else if(col.isAutocomplete()){ + sb.append(getAutoSpan(col.getField().replaceAll("_","\\."),extendAttribute(col.getExtend()))); + }else{ + + sb.append(""); + } + }else if("group".equals(col.getQueryMode())){ + sb.append(""); + sb.append("~"); + sb.append(""); + } + sb.append(""); + } + } + } + sb.append("
    "); + } + if(toolBarList.size()==0 && !hasQueryColum(columnList)){ + sb.append("
    "); + }else{ + sb.append("
    "); + } + sb.append(""); + if(toolBarList.size()>0) + { + for (DataGridUrl toolBar : toolBarList) { + sb.append(""+toolBar.getTitle()+""); + } + } + sb.append(""); + if("group".equals(getQueryMode()) && hasQueryColum(columnList)){//濡傛灉琛ㄥ崟鏄粍鍚堟煡璇 + sb.append(""); + sb.append("{0}", "{0}", MutiLangUtil.getMutiLangInstance().getLang("common.query"))); + sb.append("{0}", "{0}", MutiLangUtil.getMutiLangInstance().getLang("common.reset")) ); + if(queryBuilder){ + sb.append("{0}", "{0}", MutiLangUtil.getMutiLangInstance().getLang("common.querybuilder")) ); + }sb.append(""); + }else if("single".equals(getQueryMode())&& hasQueryColum(columnList)){//濡傛灉琛ㄥ崟鏄崟鏌ヨ + sb.append(""); + sb.append(""); + sb.append("
    "); + for (DataGridColumn col : columnList) { + if (col.isQuery()) { + sb.append("
    "+col.getTitle()+"
    "); + } + } + sb.append("
    "); + sb.append("
    "); + } + sb.append("
    "); + if(queryBuilder){ + addQueryBuilder(sb,"easyui-linkbutton"); + } + return sb; + } + + + /** + * 鐢熸垚鎵╁睍灞炴 + * @param field + * @return + */ + private String extendAttribute(String field) { + if(StringUtil.isEmpty(field)){ + return ""; + } + field = dealSyscode(field,1); + StringBuilder re = new StringBuilder(); + try{ + JSONObject obj = JSONObject.fromObject(field); + Iterator it = obj.keys(); + while(it.hasNext()){ + String key = String.valueOf(it.next()); + JSONObject nextObj =((JSONObject)obj.get(key)); + Iterator itvalue =nextObj.keys(); + re.append(key+"="+"\""); + if(nextObj.size()<=1){ + String onlykey = String.valueOf(itvalue.next()); + if("value".equals(onlykey)){ + re.append(nextObj.get(onlykey)+""); + }else{ + re.append(onlykey+":"+nextObj.get(onlykey)+""); + } + }else{ + while(itvalue.hasNext()){ + String multkey = String.valueOf(itvalue.next()); + String multvalue = nextObj.getString(multkey); + re.append(multkey+":"+multvalue+","); + } + re.deleteCharAt(re.length()-1); + } + re.append("\" "); + } + }catch (Exception e) { + e.printStackTrace(); + return ""; + } + return dealSyscode(re.toString(), 2); + } + + + /** + * 鐢熸垚鎵╁睍灞炴 + * @param field + * @return + */ + private String extendAttributeOld(String field) { + StringBuffer sb = new StringBuffer(); + //澧炲姞鎵╁睍灞炴 + if (!StringUtils.isBlank(field)) { + Gson gson = new Gson(); + Map mp = gson.fromJson(field, Map.class); + for(Map.Entry entry: mp.entrySet()) { + sb.append(entry.getKey()+"=" + gson.toJson(entry.getValue()) + "\""); + } + } + return sb.toString(); + } + + /** + * 澶勭悊鍚﹀惈鏈塲son杞崲涓殑淇濈暀瀛 + * @param field + * @param flag 1:杞崲 2:杩樺師 + * @return + */ + private String dealSyscode(String field,int flag) { + String change = field; + Iterator it = syscode.keySet().iterator(); + while(it.hasNext()){ + String key = String.valueOf(it.next()); + String value = String.valueOf(syscode.get(key)); + if(flag==1){ + change = field.replaceAll(key, value); + }else if(flag==2){ + change = field.replaceAll(value, key); + } + } + return change; + } + /** + * 鍒ゆ柇鏄惁瀛樺湪鏌ヨ瀛楁 + * @return hasQuery true琛ㄧず鏈夋煡璇㈠瓧娈,false琛ㄧず娌℃湁 + */ + protected boolean hasQueryColum(List columnList ) { + boolean hasQuery = false; + for (DataGridColumn col : columnList) { + if(col.isQuery()){ + hasQuery = true; + } + } + return hasQuery; + } + /** + * 鎷艰鎿嶄綔鍦板潃 + * + * @param sb + */ + protected void getOptUrl(StringBuffer sb) { + //娉細鎿嶄綔鍒楄〃浼氬甫鍏ュ悎璁″垪涓幓锛屾晠鍔犳鍒ゆ柇 + sb.append("if(!rec.id){return '';}"); + List list = urlList; + sb.append("var href='';"); + for (DataGridUrl dataGridUrl : list) { + String url = dataGridUrl.getUrl(); + MessageFormat formatter = new MessageFormat(""); + if (dataGridUrl.getValue() != null) { + String[] testvalue = dataGridUrl.getValue().split(","); + List value = new ArrayList(); + for (String string : testvalue) { + value.add("\"+rec." + string + " +\""); + } + url = formatter.format(url, value.toArray()); + } + if (url != null && dataGridUrl.getValue() == null) { + + url = formatUrl(url); + } + String exp = dataGridUrl.getExp();// 鍒ゆ柇鏄剧ず琛ㄨ揪寮 + if (StringUtil.isNotEmpty(exp)) { + String[] ShowbyFields = exp.split("&&"); + for (String ShowbyField : ShowbyFields) { + int beginIndex = ShowbyField.indexOf("#"); + int endIndex = ShowbyField.lastIndexOf("#"); + String exptype = ShowbyField.substring(beginIndex + 1, endIndex);// 琛ㄨ揪寮忕被鍨 + String field = ShowbyField.substring(0, beginIndex);// 鍒ゆ柇鏄剧ず渚濇嵁瀛楁 + String[] values = ShowbyField.substring(endIndex + 1, ShowbyField.length()).split(",");// 浼犲叆瀛楁鍊 + String value = ""; + for (int i = 0; i < values.length; i++) { + value += "'" + "" + values[i] + "" + "'"; + if (i < values.length - 1) { + value += ","; + } + } + if ("eq".equals(exptype)) { + sb.append("if($.inArray(rec." + field + ",[" + value + "])>=0){"); + } + if ("ne".equals(exptype)) { + sb.append("if($.inArray(rec." + field + ",[" + value + "])<0){"); + } + if ("empty".equals(exptype) && value.equals("'true'")) { + sb.append("if(rec." + field + "==''){"); + } + if ("empty".equals(exptype) && value.equals("'false'")) { + sb.append("if(rec." + field + "!=''){"); + } + } + } + + if (OptTypeDirection.Confirm.equals(dataGridUrl.getType())) { + sb.append("href+=\"[ \";"); + } + if (OptTypeDirection.Del.equals(dataGridUrl.getType())) { + sb.append("href+=\"[\";"); + } + if (OptTypeDirection.Fun.equals(dataGridUrl.getType())) { + String name = TagUtil.getFunction(dataGridUrl.getFunname()); + String parmars = TagUtil.getFunParams(dataGridUrl.getFunname()); + sb.append("href+=\"[\";"); + } + if (OptTypeDirection.OpenWin.equals(dataGridUrl.getType())) { + sb.append("href+=\"[\";"); + } //update-end--Author:liuht Date:20130228 for锛氬脊鍑虹獥鍙h缃弬鏁颁笉鐢熸晥 + if (OptTypeDirection.Deff.equals(dataGridUrl.getType())) { + sb.append("href+=\"[\";"); + } + if (OptTypeDirection.OpenTab.equals(dataGridUrl.getType())) { + sb.append("href+=\"[\";"); + } + sb.append("href+=\"" + dataGridUrl.getTitle() + "]\";"); + + if (StringUtil.isNotEmpty(exp)) { + for (int i = 0; i < exp.split("&&").length; i++) { + sb.append("}"); + } + + } + } + sb.append("return href;"); + } + + /** + * 鍒楄嚜瀹氫箟鍑芥暟 + * + * @param sb + * @param column + */ + protected void getFun(StringBuffer sb, DataGridColumn column) { + String url = column.getUrl(); + url = formatUrl(url); + sb.append("var href=\"\";"); + sb.append("return href+value+\'\';"); + + } + + /** + * 鏍煎紡鍖朥RL + * + * @return + */ + protected String formatUrl(String url) { + MessageFormat formatter = new MessageFormat(""); + String parurlvalue = ""; + if (url.indexOf("&") >= 0) { + String beforeurl = url.substring(0, url.indexOf("&"));// 鎴彇璇锋眰鍦板潃 + String parurl = url.substring(url.indexOf("&") + 1, url.length());// 鎴彇鍙傛暟 + String[] pras = parurl.split("&"); + List value = new ArrayList(); + int j = 0; + for (int i = 0; i < pras.length; i++) { + if (pras[i].indexOf("{") >= 0 || pras[i].indexOf("#") >= 0) { + String field = pras[i].substring(pras[i].indexOf("{") + 1, pras[i].lastIndexOf("}")); + parurlvalue += "&" + pras[i].replace("{" + field + "}", "{" + j + "}"); + value.add("\"+rec." + field + " +\""); + j++; + } else { + parurlvalue += "&" + pras[i]; + } + } + url = formatter.format(beforeurl + parurlvalue, value.toArray()); + } + return url; + + } + /** + * 鎷兼帴瀛楁 鏅氬垪 + * + * @param sb + * + */ + protected void getField(StringBuffer sb){ + getField( sb,1); + } + /** + * 鎷兼帴瀛楁 + * + * @param sb + * @frozen 0 鍐板喕鍒 1 鏅氬垪 + */ + protected void getField(StringBuffer sb,int frozen) { + // 澶嶉夋 + if (checkbox&&frozen==0) { + sb.append("{field:\'ck\',checkbox:\'true\'},"); + } + int i = 0; + for (DataGridColumn column : columnList) { + i++; + if((column.isFrozenColumn()&&frozen==0)||(!column.isFrozenColumn()&&frozen==1)){ + String field; + if (treegrid) { + field = column.getTreefield(); + } else { + field = column.getField(); + } + sb.append("{field:\'" + field + "\',title:\'" + column.getTitle() + "\'"); + if(column.getWidth() != null){ + sb.append(",width:"+column.getWidth()); + } + if (column.getAlign()!=null){ + sb.append(",align:\'" + column.getAlign() + "\'"); + } + if(StringUtils.isNotEmpty(column.getExtendParams())){ + sb.append(","+column.getExtendParams().substring(0, + column.getExtendParams().length()-1)); + } + // 闅愯棌瀛楁 + if (column.isHidden()) { + sb.append(",hidden:true"); + } + if (!treegrid) { + // 瀛楁鎺掑簭 + if ((column.isSortable()) && (field.indexOf("_") <= 0 && field != "opt")) { + sb.append(",sortable:" + column.isSortable() + ""); + } + } + // 鏄剧ず鍥剧墖 + if (column.isImage()) { + sb.append(",formatter:function(value,rec,index){"); + sb.append(" return '';}"); + } + // 鑷畾涔夋樉绀哄浘鐗 + if (column.getImageSize() != null) { + String[] tld = column.getImageSize().split(","); + sb.append(",formatter:function(value,rec,index){"); + sb.append(" return '';}"); + tld = null; + } + if(column.getDownloadName() != null){ + sb.append(",formatter:function(value,rec,index){"); + sb.append(" return '" + + column.getDownloadName() + "';}"); + } + // 鑷畾涔夐摼鎺 + if (column.getUrl() != null) { + sb.append(",formatter:function(value,rec,index){"); + this.getFun(sb, column); + sb.append("}"); + } + if(column.getFormatter()!=null) + { + sb.append(",formatter:function(value,rec,index){"); + sb.append(" return new Date().format('"+column.getFormatter()+"',value);}"); + } + // 鍔犲叆鎿嶄綔 + if (column.getField().equals("opt")) { + sb.append(",formatter:function(value,rec,index){"); + // sb.append("return \""); + this.getOptUrl(sb); + sb.append("}"); + } + // 鍊兼浛鎻 + if (columnValueList.size() > 0 && !column.getField().equals("opt")) { + String testString = ""; + for (ColumnValue columnValue : columnValueList) { + if (columnValue.getName().equals(column.getField())) { + String[] value = columnValue.getValue().split(","); + String[] text = columnValue.getText().split(","); + sb.append(",formatter:function(value,rec,index){"); + sb.append("var valArray = value.split(\",\");"); + sb.append("if(valArray.length > 1){"); + sb.append("var checkboxValue = \"\";"); + sb.append("for(var k=0; k 0 && !column.getField().equals("opt")) { + String testString = ""; + for (ColumnValue columnValue : columnStyleList) { + if (columnValue.getName().equals(column.getField())) { + String[] value = columnValue.getValue().split(","); + String[] text = columnValue.getText().split(","); + sb.append(",styler:function(value,rec,index){"); + if((value.length == 0||StringUtils.isEmpty(value[0]))&&text.length==1){ + if(text[0].indexOf("(")>-1){ + testString = " return \'" + text[0].replace("(", "(value,rec,index") + "\'"; + }else{ + testString = " return \'" + text[0] + "\'"; + } + }else{ + for (int j = 0; j < value.length; j++) { + testString += "if(value=='" + value[j] + "'){return \'" + text[j] + "\'}"; + } + } + sb.append(testString); + sb.append("}"); + } + } + + } + sb.append("}"); + // 鍘婚櫎鏈熬, + if (i < columnList.size()) { + sb.append(","); + } + } + } + } + /** + * 璁剧疆鍒嗛〉鏉′俊鎭 + * + * @param sb + */ + protected void setPager(StringBuffer sb, String grid) { + sb.append("$(\'#" + name + "\')." + grid + "(\'getPager\').pagination({"); + sb.append("beforePageText:\'\'," + "afterPageText:\'/{pages}\',"); + if (showText) { + sb.append("displayMsg:\'{from}-{to}" + MutiLangUtil.getMutiLangInstance().getLang("common.total") + " {total}" + MutiLangUtil.getMutiLangInstance().getLang("common.item") + "\',"); + } else { + sb.append("displayMsg:\'\',"); + } + if (showPageList == true) { + sb.append("showPageList:true,"); + } else { + sb.append("showPageList:false,"); + } + sb.append("showRefresh:" + showRefresh + ""); + sb.append("});");// end getPager + sb.append("$(\'#" + name + "\')." + grid + "(\'getPager\').pagination({"); + sb.append("onBeforeRefresh:function(pageNumber, pageSize){ $(this).pagination(\'loading\');$(this).pagination(\'loaded\'); }"); + sb.append("});"); + } + //鍒楄〃鏌ヨ妗嗗嚱鏁 + protected void searchboxFun(StringBuffer sb,String grid) + { + sb.append("function "+name+"searchbox(value,name){"); + sb.append("var queryParams=$(\'#" + name + "\').datagrid('options').queryParams;"); + sb.append("queryParams[name]=value;queryParams.searchfield=name;$(\'#" + name + "\')." + grid + "(\'reload\');}"); + sb.append("$(\'#"+name+"searchbox\').searchbox({"); + sb.append("searcher:function(value,name){"); + sb.append(""+name+"searchbox(value,name);"); + sb.append("},"); + sb.append("menu:\'#"+name+"mm\',"); + sb.append(StringUtil.replaceAll("prompt:\'{0}\'", "{0}", MutiLangUtil.getMutiLangInstance().getLang("common.please.input.query.keyword"))); + sb.append("});"); + } + + public String getNoAuthOperButton(){ + StringBuffer sb = new StringBuffer(); + if(ResourceUtil.getSessionUserName().getUserName().equals("admin")|| !Globals.BUTTON_AUTHORITY_CHECK){ + }else{ + Set operationCodes = (Set) super.pageContext.getRequest().getAttribute(Globals.OPERATIONCODES); + if (null!=operationCodes) { + for (String MyoperationCode : operationCodes) { + if (oConvertUtils.isEmpty(MyoperationCode)) + break; + systemService = ApplicationContextUtil.getContext().getBean( + SystemService.class); + TSOperation operation = systemService.getEntity(TSOperation.class, MyoperationCode); + if (operation.getOperationcode().startsWith(".") || operation.getOperationcode().startsWith("#")){ + if (operation.getOperationType().intValue()==Globals.OPERATION_TYPE_HIDE){ + //out.append("$(\""+name+"\").find(\"#"+operation.getOperationcode().replaceAll(" ", "")+"\").hide();"); + sb.append("$(\""+operation.getOperationcode().replaceAll(" ", "")+"\").hide();"); + }else { + //out.append("$(\""+name+"\").find(\"#"+operation.getOperationcode().replaceAll(" ", "")+"\").find(\":input\").attr(\"disabled\",\"disabled\");"); + sb.append("$(\""+operation.getOperationcode().replaceAll(" ", "")+"\").attr(\"disabled\",\"disabled\");"); + sb.append("$(\""+operation.getOperationcode().replaceAll(" ", "")+"\").find(\":input\").attr(\"disabled\",\"disabled\");"); + } + } + } + } + + } + org.jeecgframework.core.util.LogUtil.info("----getNoAuthOperButton-------"+sb.toString()); + return sb.toString(); + } + + /** + * 鎻忚堪锛氱粍瑁呰彍鍗曟寜閽搷浣滄潈闄 + * dateGridUrl锛歶rl + * operationCode锛氭搷浣滅爜 + * optList锛 鎿嶄綔鍒楄〃 + * @version 1.0 + */ + private void installOperationCode(DataGridUrl dataGridUrl,String operationCode,List optList){ + if(ResourceUtil.getSessionUserName().getUserName().equals("admin")|| !Globals.BUTTON_AUTHORITY_CHECK){ + optList.add(dataGridUrl); + }else if(!oConvertUtils.isEmpty(operationCode)){ + Set operationCodes = (Set) super.pageContext.getRequest().getAttribute(Globals.OPERATIONCODES); + if (null!=operationCodes) { + List operationCodesStr = new ArrayList(); + for (String MyoperationCode : operationCodes) { + if (oConvertUtils.isEmpty(MyoperationCode)) + break; + systemService = ApplicationContextUtil.getContext().getBean( + SystemService.class); + TSOperation operation = systemService.getEntity(TSOperation.class, MyoperationCode); + operationCodesStr.add(operation.getOperationcode()); + } + if (!operationCodesStr.contains(operationCode)){ + optList.add(dataGridUrl); + } + } + }else { + optList.add(dataGridUrl); + } + } + + /** + * 鑾峰彇鑷姩琛ュ叏鐨刾anel + * @param filed + * @author JueYue + * @return + */ + private String getAutoSpan(String filed,String extend){ + String id = filed.replaceAll("\\.","_"); + StringBuffer nsb = new StringBuffer(); + nsb.append("") + .append("", "{0}", MutiLangUtil.getMutiLangInstance().getLang("input.error"))); + return nsb.toString(); + } + /** + * 鑾峰彇瀹炰綋绫诲悕绉,娌℃湁杩欐牴鎹鍒欒缃 + * @return + */ + private String getEntityName() { + if(StringUtils.isEmpty(entityName)){ + entityName = actionUrl.substring(0,actionUrl.indexOf("Controller")); + entityName = (entityName.charAt(0)+"").toUpperCase()+entityName.substring(1)+"Entity"; + } + return entityName; + } + + public boolean isFitColumns() { + return fitColumns; + } + + public void setFitColumns(boolean fitColumns) { + this.fitColumns = fitColumns; + } + + public String getSortName() { + return sortName; + } + + public void setSortName(String sortName) { + this.sortName = sortName; + } + + public String getSortOrder() { + return sortOrder; + } + + public void setSortOrder(String sortOrder) { + this.sortOrder = sortOrder; + } + public String getQueryMode() { + return queryMode; + } + + public void setQueryMode(String queryMode) { + this.queryMode = queryMode; + } + + public boolean isAutoLoadData() { + return autoLoadData; + } + + public void setAutoLoadData(boolean autoLoadData) { + this.autoLoadData = autoLoadData; + } + + public void setOpenFirstNode(boolean openFirstNode) { + this.openFirstNode = openFirstNode; + } + + public void setEntityName(String entityName) { + this.entityName = entityName; + } + + public void setRowStyler(String rowStyler) { + this.rowStyler = rowStyler; + } + + public void setExtendParams(String extendParams) { + this.extendParams = extendParams; + } + + public void setLangArg(String langArg) { + this.langArg = langArg; + } + + //-----author:jg_longjb----start-----date:20150408--------for:鏂板ace 鐣岄潰涓嬬殑button class鏍峰紡 + public StringBuffer aceStyleTable() { + String grid = ""; + StringBuffer sb = new StringBuffer(); + width = (width == null) ? "auto" : width; + height = (height == null) ? "auto" : height; + sb.append(""); + sb.append("
    "); + sb.append("
    "); + if(hasQueryColum(columnList)){ + sb.append("
    "); + sb.append(""); + //濡傛灉琛ㄥ崟鏄粍鍚堟煡璇 + if("group".equals(getQueryMode())){ + for (DataGridColumn col : columnList) { + if (col.isQuery()) { + sb.append(""); + sb.append(""+col.getTitle()+"锛"); + if("single".equals(col.getQueryMode())){ + if(!StringUtil.isEmpty(col.getReplace())){ + sb.append(""); + }else if(!StringUtil.isEmpty(col.getDictionary())){ + if(col.getDictionary().contains(",")){ + String[] dic = col.getDictionary().split(","); + String sql = "select " + dic[1] + " as field," + dic[2] + + " as text from " + dic[0]; + systemService = ApplicationContextUtil.getContext().getBean( + SystemService.class); + List> list = systemService.findForJdbc(sql); + sb.append(""); + }else{ + Map> typedatas = TSTypegroup.allTypes; + List types = typedatas.get(col.getDictionary().toLowerCase()); + sb.append(""); + } + }else if(col.isAutocomplete()){ + sb.append(getAutoSpan(col.getField().replaceAll("_","\\."),extendAttribute(col.getExtend()))); + }else{ + sb.append(""); + } + }else if("group".equals(col.getQueryMode())){ + sb.append(""); + sb.append("~"); + sb.append(""); + + } + sb.append(""); + } + } + } + sb.append("
    "); + } + if(toolBarList.size()==0 && !hasQueryColum(columnList)){ + sb.append("
    "); + }else{ + sb.append("
    "); + } + sb.append(""); + if(toolBarList.size()>0) + { + for (DataGridUrl toolBar : toolBarList) { + + sb.append(""+toolBar.getTitle()+""); + } + } + sb.append(""); + if("group".equals(getQueryMode()) && hasQueryColum(columnList)){//濡傛灉琛ㄥ崟鏄粍鍚堟煡璇 + sb.append(""); + sb.append("{0}", "{0}", MutiLangUtil.getMutiLangInstance().getLang("common.query"))); + sb.append("{0}", "{0}", MutiLangUtil.getMutiLangInstance().getLang("common.reset")) ); + if(queryBuilder){ + sb.append("{0}", "{0}", MutiLangUtil.getMutiLangInstance().getLang("common.querybuilder")) ); + }sb.append(""); + }else if("single".equals(getQueryMode())&& hasQueryColum(columnList)){//濡傛灉琛ㄥ崟鏄崟鏌ヨ + sb.append(""); + sb.append(""); + sb.append("
    "); + for (DataGridColumn col : columnList) { + if (col.isQuery()) { + sb.append("
    "+col.getTitle()+"
    "); + } + } + sb.append("
    "); + sb.append("
    "); + } + sb.append("
    "); + if(queryBuilder){ + addQueryBuilder(sb,"button"); + } + return sb; + } + + + //-----author:jg_longjb----start-----date:20150427--------for:鏂板楂樼骇鏌ヨ鍣╭ueryBuilder + private void appendLine(StringBuffer sb,String str) { + String format = "\r\n"; //璋冭瘯 鏍煎紡鍖 + sb.append(str).append(format); + } + /** + * TODO 璇█鍋氭垚澶氳缈昏瘧锛屼繚鐣欏巻鍙叉煡璇㈣褰 + * @param sb + */ + private void addQueryBuilder(StringBuffer sb,String buttonSytle) { + + appendLine(sb,"
    "); + appendLine(sb,"
    "); + appendLine(sb,"
    "); + appendLine(sb,"
    "); + appendLine(sb,"
    "); + appendLine( + sb, + "
      "); + appendLine(sb, "
    "); + appendLine(sb, "
    "); + appendLine(sb, "
    "); + appendLine(sb,"
    "); + appendLine(sb," "); + appendLine(sb,""); + appendLine(sb," "); + sb + .append(" "); + sb + .append(" "); + sb + .append(""); + sb + .append(" "); + appendLine(sb,""); + appendLine(sb," "); + appendLine(sb," "); + appendLine(sb,"
    鍏崇郴瀛楁> typedatas = TSTypegroup.allTypes; + List types = typedatas.get("rulecon"); + if (types != null) { + for (int i=0;i鏉′欢鍒犻櫎';}\">鎿嶄綔
    "); + appendLine(sb,"
    "); + appendLine(sb,"
    "); + appendLine(sb,"纭畾"); + appendLine(sb,"鍙栨秷"); + appendLine(sb,"
    "); + appendLine(sb,"
    "); + appendLine(sb,"
    "); + appendLine(sb,"
    "); + appendLine(sb,"
    "); + appendLine(sb,"
    娣诲姞
    "); + appendLine(sb,"
    缂栬緫
    "); + appendLine(sb,"
    淇濆瓨
    "); + appendLine(sb,"
    鍒犻櫎
    "); + appendLine(sb,"
    "); + appendLine(sb,"
    鍙栨秷
    "); + appendLine(sb,"
    Expand
    "); + appendLine(sb,"
    "); + appendLine(sb,"
    缂栬緫
    "); + appendLine(sb,"
    鍒犻櫎
    "); + //宸插湪baseTag涓紩鍏 +// appendLine(sb,""); +// appendLine(sb,""); + appendLine(sb,""); + } + /** + * hibernate瀛楁鍚嶈浆鎹负鏁版嵁搴撳悕绉帮紝鍙敮鎸佹爣鍑嗗懡鍚 + * 鍚﹀垯杞崲閿欒 + * @param fieldName + * @return + */ + String getDBFieldName(String fieldName){ + StringBuffer sb=new StringBuffer(); + for(int i=0;i='A'){ + sb.append("_").append((char)((int)c+32)); + }else{ + sb.append(c); + } + } + return sb.toString(); + } +//----author:jg_longjb----start-----date:20150427--------for:鏂板灏佽鏌ヨ鍣ㄧ粍浠---- +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/DataGridToolBarTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridToolBarTag.java new file mode 100644 index 00000000..1ff75acd --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/DataGridToolBarTag.java @@ -0,0 +1,77 @@ +package org.jeecgframework.tag.core.easyui; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.tagext.Tag; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.util.ApplicationContextUtil; +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author 寮犱唬娴 + * 绫绘弿杩帮細鍒楄〃宸ュ叿鏉℃爣绛 + */ +public class DataGridToolBarTag extends TagSupport { + protected String url; + protected String title; + private String exp;//鍒ゆ柇閾炬帴鏄惁鏄剧ず鐨勮〃杈惧紡 + private String funname;//鑷畾涔夊嚱鏁板悕绉 + private String icon;//鍥炬爣 + private String onclick; + private String width; + private String height; + private String operationCode;//鎸夐挳鐨勬搷浣淐ode + private String langArg;//鎸夐挳鐨勬搷浣淐ode + + + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + public int doEndTag() throws JspTagException { + title = MutiLangUtil.doMutiLang(title, langArg); + + Tag t = findAncestorWithClass(this, DataGridTag.class); + DataGridTag parent = (DataGridTag) t; + parent.setToolbar(url, title, icon, exp,onclick, funname,operationCode,width,height); + return EVAL_PAGE; + } + + public void setFunname(String funname) { + this.funname = funname; + } + public void setExp(String exp) { + this.exp = exp; + } + public void setUrl(String url) { + this.url = url; + } + public void setTitle(String title) { + this.title = title; + } + public void setIcon(String icon) { + this.icon = icon; + } + public void setOnclick(String onclick) { + this.onclick = onclick; + } + public void setOperationCode(String operationCode) { + this.operationCode = operationCode; + } + public String getWidth() { + return width; + } + public void setWidth(String width) { + this.width = width; + } + public String getHeight() { + return height; + } + public void setHeight(String height) { + this.height = height; + } + public void setLangArg(String langArg) { + this.langArg = langArg; + } +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/DictSelectTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/DictSelectTag.java new file mode 100644 index 00000000..858359ad --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/DictSelectTag.java @@ -0,0 +1,392 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.web.system.pojo.base.TSType; +import org.jeecgframework.web.system.pojo.base.TSTypegroup; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.commons.lang.StringUtils; +import org.jeecgframework.core.util.ApplicationContextUtil; +import org.jeecgframework.core.util.MutiLangUtil; +import org.springframework.beans.factory.annotation.Autowired; + +import com.google.gson.Gson; + +/** + * + * 閫夋嫨涓嬫媺妗 + * + * @author: lianglaiyang + * @date锛 鏃ユ湡锛2013-04-18 + * @version 1.0 + */ +public class DictSelectTag extends TagSupport { + + private static final long serialVersionUID = 1; + private String typeGroupCode; // 鏁版嵁瀛楀吀绫诲瀷 + private String field; // 閫夋嫨琛ㄥ崟鐨凬ame EAMPLE: + private String defaultVal; // 榛樿鍊 + private String divClass; // DIV鏍峰紡 + private String labelClass; // Label鏍峰紡 + private String title; // label鏄剧ず鍊 + private boolean hasLabel = true; // 鏄惁鏄剧ずlabel + private String type;// 鎺т欢绫诲瀷select|radio|checkbox + private String dictTable;// 鑷畾涔夊瓧鍏歌〃 + private String dictField;// 鑷畾涔夊瓧鍏歌〃鐨勫尮閰嶅瓧娈-瀛楀吀鐨勭紪鐮佸 + private String dictText;// 鑷畾涔夊瓧鍏歌〃鐨勬樉绀烘枃鏈-瀛楀吀鐨勬樉绀哄 + private String extendJson;//鎵╁睍鍙傛暟 + private String dictCondition; + public String getDictCondition() { + return dictCondition; + } + + public void setDictCondition(String dicCondition) { + this.dictCondition = dicCondition; + } + @Autowired + private static SystemService systemService; + + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + + public int doEndTag() throws JspTagException { + try { + JspWriter out = this.pageContext.getOut(); + out.print(end().toString()); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + + public StringBuffer end() { + + StringBuffer sb = new StringBuffer(); + if (StringUtils.isBlank(divClass)) { + divClass = "form"; // 榛樿form鏍峰紡 + } + if (StringUtils.isBlank(labelClass)) { + labelClass = "Validform_label"; // 榛樿label鏍峰紡 + } + if (dictTable != null) { + List> list = queryDic(); + if ("radio".equals(type)) { + for (Map map : list) { + radio(map.get("text").toString(), map.get("field") + .toString(), sb); + } + } else if ("checkbox".equals(type)) { + for (Map map : list) { + checkbox(map.get("text").toString(), map.get("field") + .toString(), sb); + } + } else if("text".equals(type)){ + for (Map map : list) { + text(map.get("text").toString(), map.get("field") + .toString(), sb); + } + }else { + sb.append(""); + } + } else { + TSTypegroup typeGroup = TSTypegroup.allTypeGroups.get(this.typeGroupCode.toLowerCase()); + List types = TSTypegroup.allTypes.get(this.typeGroupCode.toLowerCase()); + if (hasLabel) { + sb.append("
    "); + sb.append(""); + } + if ("radio".equals(type)) { + for (TSType type : types) { + radio(type.getTypename(), type.getTypecode(), sb); + } + } else if ("checkbox".equals(type)) { + for (TSType type : types) { + checkbox(type.getTypename(), type.getTypecode(), sb); + } + }else if ("text".equals(type)) { + for (TSType type : types) { + text(type.getTypename(), type.getTypecode(), sb); + } + } else { + sb.append(""); + } + if (hasLabel) { + sb.append("
    "); + } + } + } + + return sb; + } + /** + * 鏂囨湰妗嗘柟娉 + * @param name + * @param code + * @param sb + */ + private void text(String name, String code, StringBuffer sb) { + if (code.equals(this.defaultVal)) { + sb.append(""); + } else { + } + } + + + /** + * 鍗曢夋鏂规硶 + * + * @浣滆咃細Alexander + * + * @param name + * @param code + * @param sb + */ + private void radio(String name, String code, StringBuffer sb) { + if (code.equals(this.defaultVal)) { + sb.append(""); + } else { + sb.append(""); + } + sb.append(MutiLangUtil.getMutiLangInstance().getLang(name)); + } + + /** + * 澶嶉夋鏂规硶 + * + * @浣滆咃細Alexander + * + * @param name + * @param code + * @param sb + */ + private void checkbox(String name, String code, StringBuffer sb) { + String[] values = this.defaultVal.split(","); + Boolean checked = false; + for (int i = 0; i < values.length; i++) { + String value = values[i]; + if (code.equals(value)) { + checked = true; + break; + } + checked = false; + } + if(checked){ + sb.append(""); + } else { + sb.append(""); + } + sb.append(MutiLangUtil.getMutiLangInstance().getLang(name)); + } + + /** + * 閫夋嫨妗嗘柟娉 + * + * @浣滆咃細Alexander + * + * @param name + * @param code + * @param sb + */ + private void select(String name, String code, StringBuffer sb) { + if (code.equals(this.defaultVal)) { + sb.append(" "); + } + + /** + * 鏌ヨ鑷畾涔夋暟鎹瓧鍏 + * + * @浣滆咃細Alexander + */ + private List> queryDic() { + String sql = "select " + dictField + " as field," + dictText + + " as text from " + dictTable; + if(dictCondition!=null){ + sql+=dictCondition; + } + systemService = ApplicationContextUtil.getContext().getBean( + SystemService.class); + List> list = systemService.findForJdbc(sql); + return list; + } + + public String getTypeGroupCode() { + return typeGroupCode; + } + + public void setTypeGroupCode(String typeGroupCode) { + this.typeGroupCode = typeGroupCode; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDefaultVal() { + return defaultVal; + } + + public void setDefaultVal(String defaultVal) { + this.defaultVal = defaultVal; + } + + public String getDivClass() { + return divClass; + } + + public void setDivClass(String divClass) { + this.divClass = divClass; + } + + public String getLabelClass() { + return labelClass; + } + + public void setLabelClass(String labelClass) { + this.labelClass = labelClass; + } + + public String getField() { + return field; + } + + public void setField(String field) { + this.field = field; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public boolean isHasLabel() { + return hasLabel; + } + + public void setHasLabel(boolean hasLabel) { + this.hasLabel = hasLabel; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getDictTable() { + return dictTable; + } + + public void setDictTable(String dictTable) { + this.dictTable = dictTable; + } + + public String getDictField() { + return dictField; + } + + public void setDictField(String dictField) { + this.dictField = dictField; + } + + public String getDictText() { + return dictText; + } + + public void setDictText(String dictText) { + this.dictText = dictText; + } + public String getExtendJson() { + return extendJson; + } + + public void setExtendJson(String extendJson) { + this.extendJson = extendJson; + } +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/FormValidationTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/FormValidationTag.java new file mode 100644 index 00000000..d35b3f81 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/FormValidationTag.java @@ -0,0 +1,309 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.enums.SysThemesEnum; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.SysThemesUtil; + +/** + * + * @author 寮犱唬娴 + * + */ +public class FormValidationTag extends TagSupport { + private static final long serialVersionUID = 8360534826228271024L; + protected String formid = "formobj";// 琛ㄥ崟FORM ID + protected Boolean refresh = true; + protected String callback;// 鍥炶皟鍑芥暟 + protected String beforeSubmit;// 鎻愪氦鍓嶅鐞嗗嚱鏁 + protected String btnsub = "btn_sub";// 浠D涓烘爣璁拌Е鍙戞彁浜や簨浠 + protected String btnreset = "btn_reset";// 浠D涓烘爣璁拌Е鍙戞彁浜や簨浠 + protected String layout = "div";// 琛ㄥ崟甯冨眬 + protected String usePlugin;// 澶栬皟鎻掍欢 + protected boolean dialog = true;// 鏄惁鏄脊鍑虹獥鍙fā寮 + protected String action;// 琛ㄥ崟鎻愪氦璺緞 + protected String tabtitle;// 琛ㄥ崟閫夐」鍗 + protected String tiptype = "4";//鏍¢獙鏂瑰紡 + protected String styleClass ;//table 鏍峰紡 + protected String cssTheme;//涓婚鏍峰紡鐩綍榛樿涓虹┖ + + public String getCssTheme() { + return cssTheme; + } + + public void setCssTheme(String cssTheme) { + this.cssTheme = cssTheme; + } + public String getStyleClass() { + return styleClass; + } + + public void setStyleClass(String styleClass) { + this.styleClass = styleClass; + } + public void setTabtitle(String tabtitle) { + this.tabtitle = tabtitle; + } + + public void setDialog(boolean dialog) { + this.dialog = dialog; + } + + public void setBtnsub(String btnsub) { + this.btnsub = btnsub; + } + + public void setRefresh(Boolean refresh) { + this.refresh = refresh; + } + + public void setBtnreset(String btnreset) { + this.btnreset = btnreset; + } + + public void setFormid(String formid) { + this.formid = formid; + } + + public void setAction(String action) { + this.action = action; + } + + + public int doStartTag() throws JspException { + try { + JspWriter out = this.pageContext.getOut(); +/*// if(cssTheme==null){//鎵嬪伐璁剧疆鍊间紭鍏 + Cookie[] cookies = ((HttpServletRequest) super.pageContext + .getRequest()).getCookies(); + for (Cookie cookie : cookies) { + if (cookie == null || StringUtils.isEmpty(cookie.getName())) { + continue; + } + if (cookie.getName().equalsIgnoreCase("JEECGCSSTHEME")) { + cssTheme = cookie.getValue(); + } + } +// } + if(cssTheme==null||"default".equals(cssTheme))cssTheme="";*/ + StringBuffer sb = new StringBuffer(); + if ("div".equals(layout)) { + sb.append("
    "); + sb.append("
    "); + sb.append("
    "); + } + sb.append("
    "); + if ("btn_sub".equals(btnsub) && dialog) + sb.append(""); + out.print(sb.toString()); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + + + public int doEndTag() throws JspException { + try { + String lang = (String)((HttpServletRequest) this.pageContext.getRequest()).getSession().getAttribute("lang"); + SysThemesEnum sysThemesEnum = SysThemesUtil.getSysTheme((HttpServletRequest) super.pageContext.getRequest()); + JspWriter out = this.pageContext.getOut(); + StringBuffer sb = new StringBuffer(); + if (layout.equals("div")) { +// if("metro".equals(cssTheme)){ +// sb.append(""); +// }else{ +// sb.append(""); +// } + //divfrom.css + sb.append(SysThemesUtil.getValidformDivfromTheme(sysThemesEnum)); + if (tabtitle != null) + sb.append(""); + } +// if("metro".equals(cssTheme)){ +// sb.append(""); +// sb.append(""); +// }else{ +// sb.append(""); +// sb.append(""); +// } + //style.css + sb.append(SysThemesUtil.getValidformStyleTheme(sysThemesEnum)); + //tablefrom.css + sb.append(SysThemesUtil.getValidformTablefrom(sysThemesEnum)); + sb.append(StringUtil.replace("", "{0}", lang)); + sb.append(StringUtil.replace("", "{0}", lang)); + sb.append(StringUtil.replace("", "{0}", lang)); + + if (usePlugin != null) { + if (usePlugin.indexOf("jqtransform") >= 0) { + sb.append(""); + sb.append(""); + } + if (usePlugin.indexOf("password") >= 0) { + sb.append(""); + } + } + sb.append(""); + sb.append(""); + sb.append("
    "); + if ("div".equals(layout)) { + sb.append("
    "); + if (tabtitle != null) { + String[] tabtitles = tabtitle.split(","); + sb.append("
    "); + sb.append("
      "); + for (String string : tabtitles) { + sb.append("
    • "); + sb.append("" + string + ""); + sb.append("
    • "); + } + sb.append("
    "); + sb.append("
    "); + } + sb.append("
    "); + } + out.print(sb.toString()); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + + public void setUsePlugin(String usePlugin) { + this.usePlugin = usePlugin; + } + + public void setLayout(String layout) { + this.layout = layout; + } + + public void setBeforeSubmit(String beforeSubmit) { + this.beforeSubmit = beforeSubmit; + } + + public void setCallback(String callback) { + this.callback = callback; + } + + public String getTiptype() { + return tiptype; + } + + public void setTiptype(String tiptype) { + this.tiptype = tiptype; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/MenuTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/MenuTag.java new file mode 100644 index 00000000..22a15f35 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/MenuTag.java @@ -0,0 +1,107 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.web.system.pojo.base.TSFunction; + +import org.jeecgframework.core.util.ListtoMenu; + + +/** + * + * 绫绘弿杩帮細鑿滃崟鏍囩 + * + * 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class MenuTag extends TagSupport { + private static final long serialVersionUID = 1L; + protected String style="easyui";//鑿滃崟鏍峰紡 + protected List parentFun;//涓绾ц彍鍗 + protected List childFun;//浜岀骇鑿滃崟 + protected Map> menuFun;//鑿滃崟Map + + + public void setParentFun(List parentFun) { + this.parentFun = parentFun; + } + + public void setChildFun(List childFun) { + this.childFun = childFun; + } + + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + + public int doEndTag() throws JspTagException { + try { + JspWriter out = this.pageContext.getOut(); + String menu = (String) this.pageContext.getSession().getAttribute("leftMenuCache"+style); + if(menu!=null){ + out.print(menu); + }else{ + menu=end().toString(); + this.pageContext.getSession().setAttribute("leftMenuCache"+style,menu); + out.print(menu); + + } + + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + + public StringBuffer end() { + StringBuffer sb = new StringBuffer(); + if (style.equals("easyui")) { + sb.append("
      "); + sb.append(ListtoMenu.getEasyuiMultistageTree(menuFun, style)); + sb.append("
    "); + } + if(style.equals("shortcut")) +// { sb.append("
    "); + { + sb.append("
    "); + sb.append(ListtoMenu.getEasyuiMultistageTree(menuFun, style)); + sb.append("
    "); + } + if(style.equals("bootstrap")) + { + sb.append(ListtoMenu.getBootMenu(parentFun, childFun)); + } + if(style.equals("json")) + { + sb.append(""); + } + if(style.equals("june_bootstrap")) + { + sb.append(ListtoMenu.getBootstrapMenu(menuFun)); + } + if(style.equals("ace")) + { + sb.append(ListtoMenu.getAceMultistageTree(menuFun)); + } + return sb; + } + public void setStyle(String style) { + this.style = style; + } + + public void setMenuFun(Map> menuFun) { + this.menuFun = menuFun; + } + + + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/MutiLangTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/MutiLangTag.java new file mode 100644 index 00000000..804c02b0 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/MutiLangTag.java @@ -0,0 +1,62 @@ + +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; +import org.jeecgframework.core.util.ApplicationContextUtil; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.springframework.beans.factory.annotation.Autowired; +import org.jeecgframework.core.util.StringUtil; + + +/** + * 绫绘弿杩帮細MutiLang鏍囩澶勭悊绫 + * + * @author 楂樼暀鍒 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +@SuppressWarnings({ "serial", "rawtypes", "unchecked", "static-access" }) +public class MutiLangTag extends TagSupport { + protected String langKey; + protected String langArg; + + @Autowired + private static MutiLangServiceI mutiLangService; + + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + + public int doEndTag() throws JspTagException { + try { + JspWriter out = this.pageContext.getOut(); + out.print(end().toString()); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + + public StringBuffer end() { + if (mutiLangService == null) + { + mutiLangService = ApplicationContextUtil.getContext().getBean(MutiLangServiceI.class); + } + + String lang_context = mutiLangService.getLang(langKey, langArg); + + return new StringBuffer(lang_context); + } + + public void setLangKey(String langKey) { + this.langKey = langKey; + } + + public void setLangArg(String langArg) { + this.langArg = langArg; + } +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/PagerUtil.java b/src/main/java/org/jeecgframework/tag/core/easyui/PagerUtil.java new file mode 100644 index 00000000..144c256a --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/PagerUtil.java @@ -0,0 +1,158 @@ +package org.jeecgframework.tag.core.easyui; + +import java.util.Map; + +/** + * + * @author 寮犱唬娴 + * + */ +public class PagerUtil { + private int curPageNO = 1; // 褰撳墠椤 + private int rowsCount; // 璁板綍琛屾暟 + private int pageCount; // 椤垫暟 + private String actionUrl;// 鐩爣ACTION + private Map map;// 灏佽鏌ヨ鏉′欢 + public PagerUtil(int curPageNo, int allCount, int pageSize, Map map,String actionUrl) { + this.curPageNO = curPageNo; + this.rowsCount = allCount; + this.map = map; + this.actionUrl=actionUrl; + this.pageCount = (int) Math.ceil((double) allCount / pageSize); + } + // 绗竴椤 + public int first() { + return 1; + } + + // 鏈鍚庝竴椤 + public int last() { + return pageCount; + } + + // 涓婁竴椤 + public int previous() { + return (curPageNO - 1 < 1) ? 1 : curPageNO - 1; + } + + // 涓嬩竴椤 + public int next() { + return (curPageNO + 1 > pageCount) ? pageCount : curPageNO + 1; + } + + // 绗竴椤 + public boolean isFirst() { + return (curPageNO == 1) ? true : false; + } + + // 鏈鍚庝竴椤 + public boolean isLast() { + return (curPageNO == pageCount) ? true : false; + } + protected StringBuffer getStrByImage(StringBuffer sb) { + String join = getJoin(); + String conditions = getConditions(); + sb.append("" + "\n"); + sb.append(" " + rowsCount + "鏉 褰撳墠绗" + curPageNO + "/" + pageCount + "椤   "); + if (isFirst()) + sb.append("  "); + else { + sb.append(""); + sb.append(" "); + } + if (curPageNO - pageCount == 0 || pageCount == 0 || pageCount == 1) + sb.append("   "); + else { + sb.append(" "); + sb.append(" "); + } + + if (pageCount == 1 || pageCount == 0) { + sb.append("  杞埌: 椤 "); + sb.append("   "); + } else { + sb.append("  杞埌: 椤 "); + sb.append("  棣栭〉 "); + sb.append("涓婁竴椤 "); + } + if (isLast() || rowsCount == 0) + sb.append("灏鹃〉 "); + else { + sb.append("涓嬩竴椤 "); + sb.append("灏鹃〉 "); + } + sb.append(" 鍏" + rowsCount + "鏉¤褰 "); + + str += " 杞埌"; + sb.append(str); + return sb; + } +/** + * Summary: + * getConditions(鎷兼帴缁勫悎鏌ヨ鏉′欢) + * @return + */ + protected String getConditions() { + String conditions = ""; + if (map != null) { + + for (Map.Entry entry : map.entrySet()) { + conditions += "&" + entry.getKey() + "=" + entry.getValue(); + } + } + return conditions; + + } +/** + * + * Summary: + * getJoin(鍒ゆ柇杩炴帴绗) + * @return + */ + protected String getJoin() { + String join = ""; + if (actionUrl.indexOf("?") == -1) { + join = "?"; + } else { + join = "&"; + } + return join; + + } + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/TabTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/TabTag.java new file mode 100644 index 00000000..1a6ef55f --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/TabTag.java @@ -0,0 +1,83 @@ +package org.jeecgframework.tag.core.easyui; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.tagext.Tag; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.util.ApplicationContextUtil; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * 绫绘弿杩帮細閫夐」鍗¢夐」鏍囩 + * + * 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class TabTag extends TagSupport { + private String href;//閫夐」鍗¤姹傚湴鍧 + private String iframe;//閫夐」鍗frame鏂规硶璇锋眰鍦板潃 + private String id;//閫夐」鍗″敮涓ID + private String title;//鏍囬 + private String icon="icon-default";//鍥炬爣 + private String width;//瀹藉害 + private String heigth;//楂樺害 + private boolean cache;//鏄惁鎵撳紑缂撳啿濡備负TRUE鍒欏垏鎹㈤夐」鍗′細鍐嶆鍙戦佽姹 + private String content; + private boolean closable=false;//鏄惁甯﹀叧闂寜閽 + private String langArg; + + @Autowired + private static MutiLangServiceI mutiLangService; + + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + public int doEndTag() throws JspTagException { + Tag t = findAncestorWithClass(this, TabsTag.class); + TabsTag parent = (TabsTag) t; + parent.setTab( id, title,iframe, href, icon, cache, content, width, heigth,closable); + return EVAL_PAGE; + } + public void setHref(String href) { + this.href = href; + } + public void setId(String id) { + this.id = id; + } + public void setTitle(String title) { + //add by Rocky, 澶勭悊澶氳瑷 + if(mutiLangService == null) + { + mutiLangService = ApplicationContextUtil.getContext().getBean(MutiLangServiceI.class); + } + + String lang_context = mutiLangService.getLang(title, langArg); + + this.title = lang_context; + } + public void setIcon(String icon) { + this.icon = icon; + } + public void setWidth(String width) { + this.width = width; + } + public void setHeigth(String heigth) { + this.heigth = heigth; + } + public void setCache(boolean cache) { + this.cache = cache; + } + public void setContent(String content) { + this.content = content; + } + public void setClosable(boolean closable) { + this.closable = closable; + } + public void setIframe(String iframe) { + this.iframe = iframe; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/TabsTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/TabsTag.java new file mode 100644 index 00000000..0d4d7199 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/TabsTag.java @@ -0,0 +1,188 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.tag.vo.easyui.Tab; + + +/** + * + * 绫绘弿杩帮細閫夐」鍗℃爣绛 + * + * 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class TabsTag extends TagSupport { + private String id;// 瀹瑰櫒ID + private String width;// 瀹藉害 + private String heigth;// 楂樺害 + private boolean plain;// 绠娲佹ā寮 + private boolean fit = true;// 閾烘弧娴忚鍣 + private boolean border;// 杈规 + private String scrollIncrement;// 婊氬姩澧為噺 + private String scrollDuration;// 婊氬姩鏃堕棿 + private boolean tools;// 宸ュ叿鏍 + private boolean tabs = true;// 鏄惁鍒涘缓鐖跺鍣 + private boolean iframe = true;// 鏄惁鏄痠frame鏂瑰紡 + private String tabPosition = "top";// 閫夐」鍗′綅缃 + + public void setIframe(boolean iframe) { + this.iframe = iframe; + } + + public void setTabs(boolean tabs) { + this.tabs = tabs; + } + + public void setId(String id) { + this.id = id; + } + + public void setWidth(String width) { + this.width = width; + } + + public void setHeigth(String heigth) { + this.heigth = heigth; + } + + public void setPlain(boolean plain) { + this.plain = plain; + } + + public void setFit(boolean fit) { + this.fit = fit; + } + + public void setBorder(boolean border) { + this.border = border; + } + + public void setScrollIncrement(String scrollIncrement) { + this.scrollIncrement = scrollIncrement; + } + + public void setScrollDuration(String scrollDuration) { + this.scrollDuration = scrollDuration; + } + + public void setTools(boolean tools) { + this.tools = tools; + } + + public void setTabPosition(String tabPosition) { + this.tabPosition = tabPosition; + } + + public void setTabList(List tabList) { + this.tabList = tabList; + } + + private List tabList = new ArrayList(); + + public int doStartTag() throws JspTagException { + tabList.clear(); + return EVAL_PAGE; + } + + public int doEndTag() throws JspTagException { + try { + JspWriter out = this.pageContext.getOut(); + out.print(end().toString()); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + + public StringBuffer end() { + StringBuffer sb = new StringBuffer(); + if (iframe) { + sb.append(""); + } + if (tabs) { + //澧炲姞width灞炴э紝fit灞炴т箣鍓嶅啓姝伙紝鏀逛负鐢遍〉闈㈣瀹氾紝涓嶅~榛樿true + sb.append("
    "); + if (!iframe) { + for (Tab tab : tabList) { + if (tab.getHref() != null) { + sb.append("
    "); + } else { + sb.append("
    "); + sb.append("\';"); + sb.append("
    "); + } + + } + } + sb.append("
    "); + + } + return sb; + } + + public void setTab(String id, String title,String iframe, String href, String iconCls, boolean cache, String content, String width, String heigth, boolean closable) { + Tab tab = new Tab(); + tab.setId(id); + tab.setTitle(title); + tab.setHref(href); + tab.setCache(cache); + tab.setIframe(iframe); + tab.setContent(content); + tab.setHeigth(heigth); + tab.setIcon(iconCls); + tab.setWidth(width); + tab.setClosable(closable); + tabList.add(tab); + } + +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/TagUtil.java b/src/main/java/org/jeecgframework/tag/core/easyui/TagUtil.java new file mode 100644 index 00000000..93b0667b --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/TagUtil.java @@ -0,0 +1,564 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; +import java.io.PrintWriter; +import java.lang.reflect.Field; +import java.util.*; + +import javax.servlet.http.HttpServletResponse; + +import org.codehaus.jackson.JsonGenerationException; +import org.codehaus.jackson.map.JsonMappingException; +import org.codehaus.jackson.map.ObjectMapper; +import org.jeecgframework.core.common.hibernate.qbc.PageList; +import org.jeecgframework.core.common.model.json.ComboBox; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.util.ReflectHelper; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.tag.vo.datatable.DataTableReturn; +import org.jeecgframework.tag.vo.easyui.Autocomplete; +import org.jeecgframework.web.system.pojo.base.TSRole; + +import com.alibaba.fastjson.JSONObject; + +/** + * + * 绫绘弿杩帮細鏍囩宸ュ叿绫 + * + * @author: 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-28 鏃堕棿锛氫笂鍗09:58:00 + * @version 1.1 + * @author liuht 淇敼涓嶈兘杈撳叆鍙屽紩鍙烽棶棰樿В鍐 + */ +public class TagUtil { + /** + * Summary: getFiled(鑾峰緱瀹炰綋Bean涓墍鏈夊睘鎬) + * + * @param objClass + * @return + * @throws ClassNotFoundException + */ + public static Field[] getFiled(Class objClass) throws ClassNotFoundException { + Field[] field = null; + if (objClass != null) { + Class class1 = Class.forName(objClass.getName()); + field = class1.getDeclaredFields();// 杩欓噷渚挎槸鑾峰緱瀹炰綋Bean涓墍鏈夊睘鎬х殑鏂规硶 + return field; + } else { + return field; + } + } + + /** + * + * 鑾峰彇瀵硅薄鍐呭搴斿瓧娈电殑鍊 + * @param fields + */ + public static Object fieldNametoValues(String FiledName, Object o){ + Object value = ""; + String fieldName = ""; + String childFieldName = null; + ReflectHelper reflectHelper=new ReflectHelper(o); + if (FiledName.indexOf("_") == -1) { + if(FiledName.indexOf(".") == -1){ + fieldName = FiledName; + }else{ + fieldName = FiledName.substring(0, FiledName.indexOf("."));//澶栭敭瀛楁寮曠敤鍚 + childFieldName = FiledName.substring(FiledName.indexOf(".") + 1);//澶栭敭瀛楁鍚 + } + } else { + fieldName = FiledName.substring(0, FiledName.indexOf("_"));//澶栭敭瀛楁寮曠敤鍚 + childFieldName = FiledName.substring(FiledName.indexOf("_") + 1);//澶栭敭瀛楁鍚 + } + value = reflectHelper.getMethodValue(fieldName)==null?"":reflectHelper.getMethodValue(fieldName); + if (value !=""&&value != null && (FiledName.indexOf("_") != -1||FiledName.indexOf(".") != -1)) { + if(value instanceof List) { + Object tempValue = ""; + for (Object listValue : (List)value) { + tempValue = tempValue.toString() + fieldNametoValues(childFieldName, listValue) + ","; + } + value = tempValue; + } else { + value = fieldNametoValues(childFieldName, value); + } + } + if(value != "" && value != null) { + value = converunicode(value.toString()); + } + return value; + } + static Object converunicode(String jsonValue){ + StringBuffer sb = new StringBuffer(); + for (int i=0; i list, String[] footers) throws Exception { + Object[] values = new Object[fields.length]; + StringBuffer jsonTemp = new StringBuffer(); + jsonTemp.append("{\"total\":" + total + ",\"rows\":["); + int i; + String fieldName; + for (int j = 0; j < list.size(); ++j) { + jsonTemp.append("{\"state\":\"closed\","); + for (i = 0; i < fields.length; ++i) { + fieldName = fields[i].toString(); + if (list.get(j) instanceof Map) + values[i] = ((Map) list.get(j)).get(fieldName); + else { + values[i] = fieldNametoValues(fieldName, list.get(j)); + } + jsonTemp.append("\"" + fieldName + "\"" + ":\"" + String.valueOf(values[i]).replace("\"", "\\\"") + "\""); + if (i != fields.length - 1) { + jsonTemp.append(","); + } + } + if (j != list.size() - 1) + jsonTemp.append("},"); + else { + jsonTemp.append("}"); + } + } + jsonTemp.append("]"); + if (footers != null) { + jsonTemp.append(","); + jsonTemp.append("\"footer\":["); + jsonTemp.append("{"); + jsonTemp.append("\"name\":\"鍚堣\","); + for (String footer : footers) { + String footerFiled = footer.split(":")[0]; + Object value = null; + if (footer.split(":").length == 2) + value = footer.split(":")[1]; + else { + value = getTotalValue(footerFiled, list); + } + jsonTemp.append("\"" + footerFiled + "\":\"" + value + "\","); + } + if (jsonTemp.lastIndexOf(",") == jsonTemp.length()) { + jsonTemp = jsonTemp.deleteCharAt(jsonTemp.length()); + } + jsonTemp.append("}"); + jsonTemp.append("]"); + } + jsonTemp.append("}"); + return jsonTemp.toString(); + } + /** + * 璁$畻鎸囧畾鍒楃殑鍚堣 + * @param filed 瀛楁鍚 + * @param list 鍒楄〃鏁版嵁 + * @return + */ + private static Object getTotalValue(String fieldName, List list) { + Double sum = 0D; + try { + for (int j = 0; j < list.size(); j++) { + Double v = 0d; + String vstr = String.valueOf(fieldNametoValues(fieldName, list.get(j))); + if (!StringUtil.isEmpty(vstr)) { + v = Double.valueOf(vstr); + } else { + + } + sum += v; + } + } catch (Exception e) { + return ""; + } + return sum; + } + /** + * 寰幆LIST瀵硅薄鎷兼帴鑷姩瀹屾垚鎺т欢鏁版嵁 + * @param fields + * @param total + * @param list + * @throws Exception + */ + public static String getAutoList(Autocomplete autocomplete, List list) throws Exception { + String field = autocomplete.getLabelField() + "," + autocomplete.getValueField(); + String[] fields = field.split(","); + Object[] values = new Object[fields.length]; + StringBuffer jsonTemp = new StringBuffer(); + jsonTemp.append("{\"totalResultsCount\":\"1\",\"geonames\":["); + if (list.size() > 0) { + for (int j = 0; j < list.size(); j++) { + jsonTemp.append("{'nodate':'yes',"); + for (int i = 0; i < fields.length; i++) { + String fieldName = fields[i].toString(); + values[i] = fieldNametoValues(fieldName, list.get(j)); + jsonTemp.append("\"").append(fieldName).append("\"").append(":\"").append(values[i]).append("\""); + if (i != fields.length - 1) { + jsonTemp.append(","); + } + } + if (j != list.size() - 1) { + jsonTemp.append("},"); + } else { + jsonTemp.append("}"); + } + } + } else { + jsonTemp.append("{'nodate':'鏁版嵁涓嶅瓨鍦'}"); + } + jsonTemp.append("]}"); + return JSONObject.toJSONString(jsonTemp).toString(); + } + /** + * 寰幆LIST瀵硅薄鎷兼帴DATATABLE鏍煎紡鐨凧SON鏁版嵁 + * @param fields + * @param total + * @param list + */ + private static String datatable(String field, int total, List list) throws Exception { + String[] fields = field.split(","); + Object[] values = new Object[fields.length]; + StringBuffer jsonTemp = new StringBuffer(); + jsonTemp.append("{\"iTotalDisplayRecords\":" + total + ",\"iTotalRecords\":" + total + ",\"aaData\":["); + for (int j = 0; j < list.size(); j++) { + jsonTemp.append("{"); + for (int i = 0; i < fields.length; i++) { + String fieldName = fields[i].toString(); + values[i] = fieldNametoValues(fieldName, list.get(j)); + jsonTemp.append("\"" + fieldName + "\"" + ":\"" + values[i] + "\""); + if (i != fields.length - 1) { + jsonTemp.append(","); + } + } + if (j != list.size() - 1) { + jsonTemp.append("},"); + } else { + jsonTemp.append("}"); + } + } + jsonTemp.append("]}"); + return jsonTemp.toString(); + } + + /** + * 杩斿洖鍒楄〃JSONObject瀵硅薄 + * @param field + * @param dataGrid + * @return + */ + private static JSONObject getJson(DataGrid dg) { + JSONObject jObject = null; + try { + if(!StringUtil.isEmpty(dg.getFooter())){ + jObject = JSONObject.parseObject(listtojson(dg.getField().split(","), dg.getTotal(), dg.getResults(),dg.getFooter().split(","))); + }else{ + jObject = JSONObject.parseObject(listtojson(dg.getField().split(","), dg.getTotal(), dg.getResults(),null)); + } + } catch (Exception e) { + e.printStackTrace(); + } + return jObject; + + } + /** + * 杩斿洖鍒楄〃JSONObject瀵硅薄 + * @param field + * @param dataGrid + * @return + */ + private static JSONObject getJson(DataTableReturn dataTable,String field) { + JSONObject jObject = null; + try { + jObject = JSONObject.parseObject(datatable(field, dataTable.getiTotalDisplayRecords(), dataTable.getAaData())); + } catch (Exception e) { + e.printStackTrace(); + } + return jObject; + + } + + + /** + * 鑾峰彇鎸囧畾瀛楁绫诲瀷 Summary: getColumnType(璇风敤涓鍙ヨ瘽鎻忚堪杩欎釜鏂规硶鐨勪綔鐢) + * + * @param fileName + * @param fields + * @return + */ + public static String getColumnType(String fileName, Field[] fields) { + String type = ""; + if (fields.length > 0) { + for (int i = 0; i < fields.length; i++) { + String name = fields[i].getName(); // 鑾峰彇灞炴х殑鍚嶅瓧 + String filedType = fields[i].getGenericType().toString(); // 鑾峰彇灞炴х殑绫诲瀷 + if (fileName.equals(name)) { + if (filedType.equals("class java.lang.Integer")) { + filedType = "int"; + type = filedType; + }else if (filedType.equals("class java.lang.Short")) { + filedType = "short"; + type = filedType; + }else if (filedType.equals("class java.lang.Double")) { + filedType = "double"; + type = filedType; + }else if (filedType.equals("class java.util.Date")) { + filedType = "date"; + type = filedType; + }else if (filedType.equals("class java.lang.String")) { + filedType = "string"; + type = filedType; + }else if (filedType.equals("class java.sql.Timestamp")) { + filedType = "Timestamp"; + type = filedType; + }else if (filedType.equals("class java.lang.Character")) { + filedType = "character"; + type = filedType; + }else if (filedType.equals("class java.lang.Boolean")) { + filedType = "boolean"; + type = filedType; + }else if (filedType.equals("class java.lang.Long")) { + filedType = "long"; + type = filedType; + } + + } + } + } + return type; + } + + /** + * + * Summary: getSortColumnIndex(鑾峰彇鎸囧畾瀛楁绱㈠紩) + * + * @param fileName + * @param fieldString + * @return + */ + protected static String getSortColumnIndex(String fileName, String[] fieldString) { + String index = ""; + if (fieldString.length > 0) { + for (int i = 0; i < fieldString.length; i++) { + if (fileName.equals(fieldString[i])) { + int j = i + 1; + index = oConvertUtils.getString(j); + } + } + } + return index; + + } + + // JSON杩斿洖椤甸潰MAP鏂瑰紡 + public static void ListtoView(HttpServletResponse response, PageList pageList) { + response.setContentType("application/json"); + response.setHeader("Cache-Control", "no-store"); + Map map = new HashMap(); + map.put("total", pageList.getCount()); + map.put("rows", pageList.getResultList()); + ObjectMapper mapper = new ObjectMapper(); +// JSONObject jsonObject = JSONObject.fromObject(map); + try { + mapper.writeValue(response.getWriter(), map); + } catch (JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 鎺т欢绫诲瀷锛歟asyui + * 杩斿洖datagrid JSON鏁版嵁 + * @param response + * @param dataGrid + */ + public static void datagrid(HttpServletResponse response,DataGrid dg) { + response.setContentType("application/json"); + response.setHeader("Cache-Control", "no-store"); + JSONObject object = TagUtil.getJson(dg); + try { + PrintWriter pw=response.getWriter(); + pw.write(object.toString()); + pw.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** + * 鎺т欢绫诲瀷锛歞atatable + * 杩斿洖datatable JSON鏁版嵁 + * @param response + * @param datatable + */ + public static void datatable(HttpServletResponse response, DataTableReturn dataTableReturn,String field) { + response.setContentType("application/json"); + response.setHeader("Cache-Control", "no-store"); + JSONObject object = TagUtil.getJson(dataTableReturn,field); + try { + response.getWriter().write(object.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 鎵嬪伐鎷兼帴JSON + */ + public static String getComboBoxJson(List list, List roles) { + StringBuffer buffer = new StringBuffer(); + buffer.append("["); + for (TSRole node : list) { + if (roles.size() > 0) { + buffer.append("{\"id\":" + node.getId() + ",\"text\":\"" + node.getRoleName() + "\""); + for (TSRole node1 : roles) { + if (node.getId() == node1.getId()) { + buffer.append(",\"selected\":true"); + } + } + buffer.append("},"); + } else { + buffer.append("{\"id\":" + node.getId() + ",\"text\":\"" + node.getRoleName() + "\"},"); + } + + } + buffer.append("]"); + + // 灏,\n]鏇挎崲鎴怽n] + + String tmp = buffer.toString(); + tmp = tmp.replaceAll(",]", "]"); + return tmp; + + } + + /** + * 鏍规嵁妯″瀷鐢熸垚JSON + * @param all 鍏ㄩ儴瀵硅薄 + * @param in 宸叉嫢鏈夌殑瀵硅薄 + * @param comboBox 妯″瀷 + * @return + */ + public static List getComboBox(List all, List in, ComboBox comboBox) { + List comboxBoxs = new ArrayList(); + String[] fields = new String[] { comboBox.getId(), comboBox.getText() }; + Object[] values = new Object[fields.length]; + for (Object node : all) { + ComboBox box = new ComboBox(); + ReflectHelper reflectHelper=new ReflectHelper(node); + for (int i = 0; i < fields.length; i++) { + String fieldName = fields[i].toString(); + values[i] = reflectHelper.getMethodValue(fieldName); + } + box.setId(values[0].toString()); + box.setText(values[1].toString()); + if (in != null) { + for (Object node1 : in) { + ReflectHelper reflectHelper2=new ReflectHelper(node); + if (node1 != null) { + String fieldName = fields[0].toString(); + String test = reflectHelper2.getMethodValue(fieldName).toString(); + if (values[0].toString().equals(test)) { + box.setSelected(true); + } + } + } + } + comboxBoxs.add(box); + } + return comboxBoxs; + + } + /** + * 鑾峰彇鑷畾涔夊嚱鏁板悕 + * + * @param functionname + * @return + */ + public static String getFunction(String functionname) { + int index = functionname.indexOf("("); + if (index == -1) { + return functionname; + } else { + return functionname.substring(0, functionname.indexOf("(")); + } + } + + /** + * 鑾峰彇鑷畾涔夊嚱鏁扮殑鍙傛暟 + * + * @param functionname + * @return + */ + public static String getFunParams(String functionname) { + int index = functionname.indexOf("("); + String param = ""; + if (index != -1) { + String testparam = functionname.substring( + functionname.indexOf("(") + 1, functionname.length() - 1); + if (StringUtil.isNotEmpty(testparam)) { + String[] params = testparam.split(","); + for (String string : params) { + param += (string.indexOf("{") != -1) ? ("'\"+" + + string.substring(1, string.length() - 1) + "+\"',") + : ("'\"+rec." + string + "+\"',"); + } + } + } + param += "'\"+index+\"'";// 浼犲嚭琛岀储寮曞彿鍙傛暟 + return param; + } +} diff --git a/src/main/java/org/jeecgframework/tag/core/easyui/UploadTag.java b/src/main/java/org/jeecgframework/tag/core/easyui/UploadTag.java new file mode 100644 index 00000000..a2b6f0b1 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/core/easyui/UploadTag.java @@ -0,0 +1,250 @@ +package org.jeecgframework.tag.core.easyui; + +import java.io.IOException; + +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +import org.jeecgframework.core.util.MutiLangUtil; + +/** + * + * 绫绘弿杩帮細涓婁紶鏍囩 + * + * 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class UploadTag extends TagSupport { + private static final long serialVersionUID = 1L; + protected String id;// ID + protected String uploader;//url + protected String name;//鎺т欢鍚嶇О + protected String formData;//鍙傛暟鍚嶇О + protected String extend="";//涓婁紶鏂囦欢鐨勬墿灞曞悕 + protected String buttonText="娴忚";//鎸夐挳鏂囨湰 + protected boolean multi=true;//鏄惁澶氭枃浠 + protected String queueID="filediv";//鏂囦欢瀹瑰櫒ID + protected boolean dialog=true;//鏄惁鏄脊鍑虹獥鍙fā寮 + protected String callback; + protected boolean auto=false;//鏄惁鑷姩涓婁紶 + protected String onUploadSuccess;//涓婁紶鎴愬姛澶勭悊鍑芥暟 + protected boolean view=false;//鐢熸垚鏌ョ湅鍒犻櫎閾炬帴 + protected String formId;//鍙傛暟鍚嶇О + + public String getFormId() { + return formId; + } + public void setFormId(String formId) { + this.formId = formId; + } + + public void setView(boolean view) { + this.view = view; + } + public void setOnUploadSuccess(String onUploadSuccess) { + this.onUploadSuccess = onUploadSuccess; + } + public void setAuto(boolean auto) { + this.auto = auto; + } + public void setCallback(String callback) { + this.callback = callback; + } + public void setDialog(boolean dialog) { + this.dialog = dialog; + } + public void setQueueID(String queueID) { + this.queueID = queueID; + } + public void setButtonText(String buttonText) { + this.buttonText = buttonText; + } + public void setMulti(boolean multi) { + this.multi = multi; + } + public void setUploader(String uploader) { + this.uploader = uploader; + } + public void setName(String name) { + this.name = name; + } + public int doStartTag() throws JspTagException { + return EVAL_PAGE; + } + public int doEndTag() throws JspTagException { + try { + JspWriter out = this.pageContext.getOut(); + out.print(end().toString()); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + public StringBuffer end() { + StringBuffer sb = new StringBuffer(); + if("pic".equals(extend)) + { + extend="*.jpg;*,jpeg;*.png;*.gif;*.bmp;*.ico;*.tif"; + } + if(extend.equals("office")) + { + extend="*.doc;*.docx;*.txt;*.ppt;*.xls;*.xlsx;*.html;*.htm"; + } + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + if(view) + { + sb.append(""); + sb.append(""); + } + + return sb; + } + + /** + * 鑾峰彇涓婁紶璺緞,淇敼jsessionid浼犱笉鍒板悗鍙扮殑bug jueyue --- 20130916 + * @return + */ + private String getUploader() { + return uploader+"&sessionId="+pageContext.getSession().getId()+"',"; + } + + public void setId(String id) { + this.id = id; + } + public void setFormData(String formData) { + this.formData = formData; + } + public void setExtend(String extend) { + this.extend = extend; + } + + + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/datatable/ColumnInfo.java b/src/main/java/org/jeecgframework/tag/vo/datatable/ColumnInfo.java new file mode 100644 index 00000000..429fafce --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/datatable/ColumnInfo.java @@ -0,0 +1,100 @@ +package org.jeecgframework.tag.vo.datatable; + +/** + * 鍒椾俊鎭 + * + * @author 寮犱唬娴 + * @date 2012-7-26 涓嬪崍3:07:40 + */ +public class ColumnInfo { + + /** + * 鍒楀悕 + */ + private String name; + /** + * 鏄惁姝e垯 + */ + private Boolean regex; + /** + * 鏌ユ壘 + */ + private Boolean searchable; + /** + * 鏌ユ壘 + */ + private String search; + public String getSearch() { + return search; + } + + public void setSearch(String search) { + this.search = search; + } + + /** + * 鎺掑簭 + */ + private Boolean sortable; + + /** + * @return 鍒楀悕 + */ + public String getName() { + return name; + } + + /** + * @param name + * 鍒楀悕 + */ + public void setName(String name) { + this.name = name; + } + + /** + * @return 鏄惁姝e垯 + */ + public Boolean getRegex() { + return regex; + } + + /** + * @param regex + * 鏄惁姝e垯 + */ + public void setRegex(Boolean regex) { + this.regex = regex; + } + + /** + * @return 鏌ユ壘 + */ + public Boolean getSearchable() { + return searchable; + } + + /** + * @param searchable + * 鏌ユ壘 + */ + public void setSearchable(Boolean searchable) { + this.searchable = searchable; + } + + /** + * @return 鎺掑簭 + */ + public Boolean getSortable() { + return sortable; + } + + /** + * @param sortable + * 鎺掑簭 + */ + public void setSortable(Boolean sortable) { + this.sortable = sortable; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/datatable/DataTableReturn.java b/src/main/java/org/jeecgframework/tag/vo/datatable/DataTableReturn.java new file mode 100644 index 00000000..4c71d522 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/datatable/DataTableReturn.java @@ -0,0 +1,97 @@ +package org.jeecgframework.tag.vo.datatable; + +import java.util.List; + +/** + * DataTables鏈熸湜鐨勮繑鍥炴暟鎹牸寮 + * + * @author 寮犱唬娴 + * @date 2012-7-26 涓婂崍11:23:17 + */ +public class DataTableReturn { + /** + * 杩囨护鍓嶆昏褰曟暟 + */ + private Integer iTotalRecords; + /** + * 杩囨护鍚庢昏褰曟暟 + */ + private Integer iTotalDisplayRecords; + /** + * 椤甸潰鍙戞潵鐨勫弬鏁帮紝鍘熸牱杩斿洖 + */ + private Integer sEcho; + + /** + * 杩斿洖鐨勫叿浣撴暟鎹 + */ + private List aaData; + + /** + * @return 杩囨护鍓嶆昏褰曟暟 + */ + public Integer getiTotalRecords() { + return iTotalRecords; + } + + /** + * @param iTotalRecords + * 杩囨护鍓嶆昏褰曟暟 + */ + public void setiTotalRecords(Integer iTotalRecords) { + this.iTotalRecords = iTotalRecords; + } + + /** + * @return 杩囨护鍚庢昏褰曟暟 + */ + public Integer getiTotalDisplayRecords() { + return iTotalDisplayRecords; + } + + /** + * @param iTotalDisplayRecords + * 杩囨护鍚庢昏褰曟暟 + */ + public void setiTotalDisplayRecords(Integer iTotalDisplayRecords) { + this.iTotalDisplayRecords = iTotalDisplayRecords; + } + + /** + * @return 椤甸潰鍙戞潵鐨勫弬鏁帮紝鍘熸牱杩斿洖 + */ + public Integer getsEcho() { + return sEcho; + } + + /** + * @param sEcho + * 椤甸潰鍙戞潵鐨勫弬鏁帮紝鍘熸牱杩斿洖 + */ + public void setsEcho(Integer sEcho) { + this.sEcho = sEcho; + } + + /** + * @return 杩斿洖鐨勫叿浣撴暟鎹 + */ + public List getAaData() { + return aaData; + } + + /** + * @param aaData + * 杩斿洖鐨勫叿浣撴暟鎹 + */ + public void setAaData(List aaData) { + this.aaData = aaData; + } + public DataTableReturn(Integer iTotalRecords, Integer iTotalDisplayRecords, + Integer sEcho, List aaData) { + this.iTotalRecords = iTotalRecords; + this.iTotalDisplayRecords = iTotalDisplayRecords; + this.sEcho = sEcho; + this.aaData = aaData; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/datatable/DataTables.java b/src/main/java/org/jeecgframework/tag/vo/datatable/DataTables.java new file mode 100644 index 00000000..6a51796a --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/datatable/DataTables.java @@ -0,0 +1,199 @@ +package org.jeecgframework.tag.vo.datatable; + +import java.text.MessageFormat; + +import javax.servlet.http.HttpServletRequest; + +public class DataTables { + private HttpServletRequest request; // 鍐呴儴浣跨敤鐨 Request 瀵硅薄 + private String sEchoParameter = "sEcho"; + + // 璧峰绱㈠紩鍜岄暱搴 + private String iDisplayStartParameter = "iDisplayStart"; + private String iDisplayLengthParameter = "iDisplayLength"; + + // 鍒楁暟 + private String iColumnsParameter = "iColumns"; + private String sColumnsParameter = "sColumns"; + private String sColumns; + + // 鍙備笌鎺掑簭鍒楁暟 + private String iSortingColsParameter = "iSortingCols"; + private String iSortColPrefixParameter = "iSortCol_"; // 鎺掑簭鍒楃殑绱㈠紩 + private String sSortDirPrefixParameter = "sSortDir_"; // 鎺掑簭鐨勬柟鍚 + // asc, desc + + // 姣忎竴鍒楃殑鍙帓搴忔 + private String bSortablePrefixParameter = "bSortable_"; + + // 鍏ㄥ眬鎼滅储 + private String sSearchParameter = "sSearch"; + private String bRegexParameter = "bRegex"; + + // 姣忎竴鍒楃殑鎼滅储 + private String bSearchablePrefixParameter = "bSearchable_"; + private String sSearchPrefixParameter = "sSearch_"; + private String bEscapeRegexPrefixParameter = "bRegex_"; + + public SortInfo[] getSortColumns() { + return sortColumns; + } + + public void setSortColumns(SortInfo[] sortColumns) { + this.sortColumns = sortColumns; + } + + public int getColumnCount() { + return ColumnCount; + } + + public void setColumnCount(int columnCount) { + ColumnCount = columnCount; + } + + public ColumnInfo[] getColumns() { + return columns; + } + + public void setColumns(ColumnInfo[] columns) { + this.columns = columns; + } + + public String getSearch() { + return search; + } + + public void setSearch(String search) { + this.search = search; + } + + public Boolean getRegex() { + return regex; + } + + public void setRegex(Boolean regex) { + this.regex = regex; + } + + public Integer getEcho() { + return echo; + } + + public int getDisplayStart() { + return displayStart; + } + + public int getDisplayLength() { + return displayLength; + } + + public int getSortingCols() { + return sortingCols; + } + + private Integer echo; + + private int displayStart; + + private int displayLength; + + // 鍙備笌鎺掑簭鐨勫垪 + private int sortingCols; + public int iSortingCols; + + // 鎺掑簭鍒 + private SortInfo[] sortColumns; + + private int ColumnCount; + + private ColumnInfo[] columns; + + private String search; + + private Boolean regex; + + public void DataTablePram(HttpServletRequest httpRequest) { + this.request = httpRequest; + } + + public DataTables(HttpServletRequest request) // 鐢ㄤ簬 MVC 妯″紡涓嬬殑鏋勯犲嚱鏁 + { + this.request = request; + + this.echo = this.ParseIntParameter(sEchoParameter); + this.displayStart = this.ParseIntParameter(iDisplayStartParameter); + this.displayLength = this.ParseIntParameter(iDisplayLengthParameter); + this.sortingCols = this.ParseIntParameter(iSortingColsParameter); + + this.search = this.ParseStringParameter(sSearchParameter); + this.regex = this.ParseStringParameter(bRegexParameter) == "true"; + + // 鎺掑簭鐨勫垪 + int count = sortingCols; + this.sortColumns = new SortInfo[count]; + MessageFormat formatter = new MessageFormat(""); + for (int i = 0; i < count; i++) { + SortInfo sortInfo = new SortInfo(); + sortInfo.setColumnId(this.ParseIntParameter(formatter.format("iSortCol_{0}", i))); + String aString = this.ParseStringParameter(formatter.format("sSortDir_{0}", i)); + if (this.ParseStringParameter(formatter.format("sSortDir_{0}", i)).equals("desc")) { + sortInfo.setSortOrder(SortDirection.asc); + } else { + sortInfo.setSortOrder(SortDirection.desc); + } + this.sortColumns[i] = sortInfo; + } + + this.ColumnCount = this.ParseIntParameter(iColumnsParameter); + + count = this.ColumnCount; + this.columns = new ColumnInfo[count]; + + String[] names = this.ParseStringParameter(sColumnsParameter).split(","); + this.sColumns = this.ParseStringParameter(sColumnsParameter); + + for (int i = 0; i < names.length; i++) { + ColumnInfo col = new ColumnInfo(); + col.setName(names[i]); + col.setSortable(this.ParseBooleanParameter(formatter.format("bSortable_{0}", i))); + col.setSearchable(this.ParseBooleanParameter(formatter.format("bSearchable_{0}", i))); + col.setSearch(this.ParseStringParameter(formatter.format("sSearch_{0}", i))); + col.setRegex(this.ParseStringParameter(formatter.format("bRegex_{0}", i)) == "true"); + columns[i] = col; + } + } + + public String getsColumns() { + return sColumns; + } + + public void setsColumns(String sColumns) { + this.sColumns = sColumns; + } + + private int ParseIntParameter(String name) // 瑙f瀽涓烘暣鏁 + { + int result = 0; + String parameter = this.request.getParameter(name); + if (parameter != null) { + result = Integer.parseInt(parameter); + } + return result; + } + + private String ParseStringParameter(String name) // 瑙f瀽涓哄瓧绗︿覆 + { + return this.request.getParameter(name); + } + + private Boolean ParseBooleanParameter(String name) // 瑙f瀽涓哄竷灏旂被鍨 + { + Boolean result = false; + String parameter = this.request.getParameter(name); + if (parameter != null) { + result = Boolean.parseBoolean(parameter); + } + return result; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/datatable/FilterInfo.java b/src/main/java/org/jeecgframework/tag/vo/datatable/FilterInfo.java new file mode 100644 index 00000000..26f1ef6f --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/datatable/FilterInfo.java @@ -0,0 +1,50 @@ +package org.jeecgframework.tag.vo.datatable; + +/** + * 杩囨护鏌ユ壘 + * + * @author 寮犱唬娴 + * @date 2012-7-26 涓嬪崍3:07:40 + */ +public class FilterInfo { + + /** + * 鏌ユ壘鐨勫垪鍚 + */ + private String name; + /** + * 鏌ユ壘鐨勫 + */ + private String search; + + /** + * @return 鏌ユ壘鐨勫垪鍚 + */ + public String getName() { + return name; + } + + /** + * @param name + * 鏌ユ壘鐨勫垪鍚 + */ + public void setName(String name) { + this.name = name; + } + + /** + * @return 鏌ユ壘鐨勫 + */ + public String getSearch() { + return search; + } + + /** + * @param search + * 鏌ユ壘鐨勫 + */ + public void setSearch(String search) { + this.search = search; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/datatable/SortDirection.java b/src/main/java/org/jeecgframework/tag/vo/datatable/SortDirection.java new file mode 100644 index 00000000..d9896598 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/datatable/SortDirection.java @@ -0,0 +1,12 @@ +package org.jeecgframework.tag.vo.datatable; +/** +* @Description: TODO(鎺掑簭瀹氫箟) +* asc 鍗囧簭 +* @author 寮犱唬娴 +* desc 闄嶅簭 +*/ +public enum SortDirection { + asc, // 鍗囧簭 + desc + // 闄嶅簭 +} diff --git a/src/main/java/org/jeecgframework/tag/vo/datatable/SortInfo.java b/src/main/java/org/jeecgframework/tag/vo/datatable/SortInfo.java new file mode 100644 index 00000000..fc2da1c4 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/datatable/SortInfo.java @@ -0,0 +1,49 @@ +package org.jeecgframework.tag.vo.datatable; + +/** + * 鎺掑簭鍊 + * @author 寮犱唬娴 + * @date 2012-7-26 涓嬪崍3:07:40 + */ +public class SortInfo { + + /** + * 鎺掑簭鍒楀悕 + */ + private Integer columnId; + /** + * desc or asc + */ + private SortDirection sortOrder; + + /** + * @return 鎺掑簭鍒楀悕 + */ + public Integer getColumnId() { + return columnId; + } + + /** + * @param columnId + * 鎺掑簭鍒楀悕 + */ + public void setColumnId(Integer columnId) { + this.columnId = columnId; + } + + /** + * @return desc or asc + */ + public SortDirection getSortOrder() { + return sortOrder; + } + + /** + * @param sortOrder + * desc or asc + */ + public void setSortOrder(SortDirection sortOrder) { + this.sortOrder = sortOrder; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/Autocomplete.java b/src/main/java/org/jeecgframework/tag/vo/easyui/Autocomplete.java new file mode 100644 index 00000000..ed22d413 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/Autocomplete.java @@ -0,0 +1,61 @@ +package org.jeecgframework.tag.vo.easyui; +/** + * + * @author 寮犱唬娴 + * + */ +public class Autocomplete { + private String entityName;//瀹炰綋鍚嶇О + private String labelField;//鎻愮ず鏄剧ず鐨勫瓧娈 + private String valueField;//浼犻掑悗鍙扮殑瀛楁 + private String searchField;//鏌ヨ鍏抽敭瀛楀瓧娈 + private String trem;//鏌ヨ浼犻掔殑鍊 + private Integer maxRows; + private Integer curPage; + public String getSearchField() { + return searchField; + } + public void setSearchField(String searchField) { + this.searchField = searchField; + } + public String getEntityName() { + return entityName; + } + public void setEntityName(String entityName) { + this.entityName = entityName; + } + public String getTrem() { + return trem; + } + public void setTrem(String trem) { + this.trem = trem; + } + public String getLabelField() { + return labelField; + } + public void setLabelField(String labelField) { + this.labelField = labelField; + } + public String getValueField() { + return valueField; + } + public void setValueField(String valueField) { + this.valueField = valueField; + } + public Integer getMaxRows() { + return maxRows; + } + public void setMaxRows(Integer maxRows) { + this.maxRows = maxRows; + } + public Integer getCurPage() { + if(curPage==null||curPage<1){ + curPage = 1; + } + return curPage; + } + public void setCurPage(Integer curPage) { + this.curPage = curPage; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/Carousel.java b/src/main/java/org/jeecgframework/tag/vo/easyui/Carousel.java new file mode 100644 index 00000000..8e141ee5 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/Carousel.java @@ -0,0 +1,33 @@ +package org.jeecgframework.tag.vo.easyui; + +/** + * Carousel + * + * @author 寮犱唬娴 + * + */ +public class Carousel { + private String path; //鍥剧墖璺緞 + private String message; //鍥剧墖淇℃伅鎻忚堪 + private boolean active=false; //褰撳墠鏄剧ず椤 + public String getPath() { + return path; + } + public void setPath(String path) { + this.path = path; + } + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + public boolean isActive() { + return active; + } + public void setActive(boolean active) { + this.active = active; + } + + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/ColumnValue.java b/src/main/java/org/jeecgframework/tag/vo/easyui/ColumnValue.java new file mode 100644 index 00000000..458e8f80 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/ColumnValue.java @@ -0,0 +1,36 @@ +package org.jeecgframework.tag.vo.easyui; +/** + * + * @author 寮犱唬娴 + * + */ +public class ColumnValue { + private String name; + private String text; + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/ComboTreeModel.java b/src/main/java/org/jeecgframework/tag/vo/easyui/ComboTreeModel.java new file mode 100644 index 00000000..4a4f8ecd --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/ComboTreeModel.java @@ -0,0 +1,59 @@ +package org.jeecgframework.tag.vo.easyui; + + + /** + * @ClassName: ComboTreeModel + * @Description: TODO(涓嬫媺鏍戝舰閫夋嫨妗嗘ā鍨嬭缃被) + * @author 寮犱唬娴 + * @date 2013-1-6 涓嬪崍07:24:22 + * + */ +public class ComboTreeModel implements java.io.Serializable { + private String idField; + private String textField; + private String iconCls;// 鍓嶉潰鐨勫皬鍥炬爣鏍峰紡 + private String childField;// 瀛愯妭鐐 + private String srcField;//鍦板潃瀛楁 + + public ComboTreeModel(String idField, String textField, String childField) { + this.idField = idField; + this.textField = textField; + this.childField = childField; + } + public ComboTreeModel(String idField, String textField, String childField, String srcField) { + this.idField = idField; + this.textField = textField; + this.childField = childField; + this.srcField = srcField; + } + public String getIconCls() { + return iconCls; + } + public void setIconCls(String iconCls) { + this.iconCls = iconCls; + } + public String getChildField() { + return childField; + } + public void setChildField(String childField) { + this.childField = childField; + } + public String getIdField() { + return idField; + } + public void setIdField(String idField) { + this.idField = idField; + } + public String getTextField() { + return textField; + } + public void setTextField(String textField) { + this.textField = textField; + } + public String getSrcField() { + return srcField; + } + public void setSrcField(String srcField) { + this.srcField = srcField; + } +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/DataGridColumn.java b/src/main/java/org/jeecgframework/tag/vo/easyui/DataGridColumn.java new file mode 100644 index 00000000..cd784865 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/DataGridColumn.java @@ -0,0 +1,263 @@ +package org.jeecgframework.tag.vo.easyui; +/** + * + * 绫绘弿杩帮細鍒楄〃瀛楁妯″瀷 + * + * @author: 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class DataGridColumn { + protected String title;//琛ㄦ牸鍒楀悕 + protected String field;//鏁版嵁搴撳搴斿瓧娈 + protected Integer width;//瀹藉害 + protected String rowspan;//璺ㄥ垪 + protected String colspan;//璺ㄨ + protected String align;//瀵归綈鏂瑰紡 + protected boolean sortable;//鏄惁鎺掑簭 + protected boolean checkbox;//鏄惁鏄剧ず澶嶉夋 + protected String formatter;//鏍煎紡鍖栧嚱鏁 + protected boolean hidden;//鏄惁闅愯棌 + protected String treefield;// + protected boolean image;//鏄惁鏄浘鐗 + protected boolean query;//鏄惁鏌ヨ + protected String queryMode = "single";//瀛楁鏌ヨ妯″紡锛歴ingle鍗曞瓧娈垫煡璇紱group鑼冨洿鏌ヨ + + protected boolean autoLoadData = true; // 鍒楄〃鏄惁鑷姩鍔犺浇鏁版嵁 + private boolean frozenColumn=false; // 鏄惁鏄啺鍐诲垪 榛樿涓嶆槸 + protected String url;//鑷畾涔夐摼鎺 + protected String funname="openwindow";//鑷畾涔夊嚱鏁板悕绉 + protected String arg; + protected String dictionary; + protected boolean popup=false; //鏄惁鍚敤popup妯″紡閫夋嫨 榛樿涓嶅惎鐢 + protected String replace; + protected String extend; + protected String style; //鍒楃殑棰滆壊鍊 + protected String imageSize;//鑷畾涔夊浘鐗囨樉绀哄ぇ灏 + protected String downloadName;//闄勪欢涓嬭浇 + protected boolean autocomplete;//鑷姩琛ュ叏 + protected String extendParams;//鎵╁睍鍙傛暟,easyui鏈夌殑,浣嗘槸jeecg娌℃湁鐨勫弬鏁拌繘琛屾墿灞 + public String getDownloadName() { + return downloadName; + } + + public void setDownloadName(String downloadName) { + this.downloadName = downloadName; + } + + public String getImageSize() { + return imageSize; + } + + public void setImageSize(String imageSize) { + this.imageSize = imageSize; + } + + public boolean isQuery() { + return query; + } + + public String getArg() { + return arg; + } + + public void setArg(String arg) { + this.arg = arg; + } + + public void setQuery(boolean query) { + this.query = query; + } + + public boolean isImage() { + return image; + } + + public void setImage(boolean image) { + this.image = image; + } + + public String getTreefield() { + return treefield; + } + + public void setTreefield(String treefield) { + this.treefield = treefield; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setField(String field) { + this.field = field; + } + + public void setWidth(Integer width) { + this.width = width; + } + + public void setRowspan(String rowspan) { + this.rowspan = rowspan; + } + + public void setColspan(String colspan) { + this.colspan = colspan; + } + + public void setAlign(String align) { + this.align = align; + } + + public void setSortable(boolean sortable) { + this.sortable = sortable; + } + + public void setCheckbox(boolean checkbox) { + this.checkbox = checkbox; + } + + public void setFormatter(String formatter) { + this.formatter = formatter; + } + public boolean isHidden() { + return hidden; + } + + public void setHidden(boolean hidden) { + this.hidden = hidden; + } + + public String getTitle() { + return title; + } + + public String getField() { + return field; + } + + public Integer getWidth() { + return width; + } + + public String getRowspan() { + return rowspan; + } + + public String getColspan() { + return colspan; + } + + public String getAlign() { + return align; + } + + public boolean isSortable() { + return sortable; + } + + public boolean isCheckbox() { + return checkbox; + } + + public String getFormatter() { + return formatter; + } + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getFunname() { + return funname; + } + + public void setFunname(String funname) { + this.funname = funname; + } + + public String getDictionary() { + return dictionary; + } + + public void setDictionary(String dictionary) { + this.dictionary = dictionary; + } + public boolean isPopup() { + return popup; + } + + public void setPopup(boolean popup) { + this.popup = popup; + } + + public String getQueryMode() { + return queryMode; + } + + public void setQueryMode(String queryMode) { + this.queryMode = queryMode; + } + + public String getReplace() { + return replace; + } + + public void setReplace(String replace) { + this.replace = replace; + } + + public boolean isAutoLoadData() { + return autoLoadData; + } + + public void setAutoLoadData(boolean autoLoadData) { + this.autoLoadData = autoLoadData; + } + + public boolean isFrozenColumn() { + return frozenColumn; + } + + public void setFrozenColumn(boolean frozenColumn) { + this.frozenColumn = frozenColumn; + } + + public String getExtend() { + return extend; + } + + public void setExtend(String extend) { + this.extend = extend; + } + + public String getStyle() { + return style; + } + + public void setStyle(String style) { + this.style = style; + } + + public boolean isAutocomplete() { + return autocomplete; + } + + public void setAutocomplete(boolean autocomplete) { + this.autocomplete = autocomplete; + } + + public String getExtendParams() { + return extendParams; + } + + public void setExtendParams(String extendParams) { + this.extendParams = extendParams; + } + + + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/DataGridUrl.java b/src/main/java/org/jeecgframework/tag/vo/easyui/DataGridUrl.java new file mode 100644 index 00000000..561f77c6 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/DataGridUrl.java @@ -0,0 +1,120 @@ +package org.jeecgframework.tag.vo.easyui; + +/** + * + * @author 寮犱唬娴 + * + */ +public class DataGridUrl { + private String url;//鎿嶄綔閾炬帴鍦板潃 + private String title;//鎸夐挳鍚嶇О + private String icon;//鎸夐挳鍥炬爣 + private String value;//浼犲叆鍙傛暟 + private String width;//寮瑰嚭绐楀搴 + private String height;//寮瑰嚭绐楅珮搴 + private OptTypeDirection type;//鎸夐挳绫诲瀷 + private String isbtn;//鏄惁鏄搷浣滈夐」浠ュ鐨勯摼鎺 + private String message;//璇㈤棶閾炬帴鐨勬彁绀鸿 + private String exp;//鍒ゆ柇閾炬帴鏄惁鏄剧ず鐨勮〃杈惧紡 + private String funname;//鑷畾涔夊嚱鏁板悕绉 + private boolean isRadio;//鏄惁鏄崟閫夋 + private String onclick;//閫夐」鍗曞嚮浜嬩欢 + public String getOnclick() { + return onclick; + } + + public void setOnclick(String onclick) { + this.onclick = onclick; + } + + public void setRadio(boolean isRadio) { + this.isRadio = isRadio; + } + + public String getFunname() { + return funname; + } + public void setFunname(String funname) { + this.funname = funname; + } + + public String getMessage() { + return message; + } + public String getExp() { + return exp; + } + + public void setExp(String exp) { + this.exp = exp; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getIsbtn() { + return isbtn; + } + + public void setIsbtn(String isbtn) { + this.isbtn = isbtn; + } + + public void setType(OptTypeDirection type) { + this.type = type; + } + + public OptTypeDirection getType() { + return type; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + public boolean isRadio() { + return isRadio; + } + public String getWidth() { + return width; + } + + public void setWidth(String width) { + this.width = width; + } + + public String getHeight() { + return height; + } + public String getIcon() { + return icon; + } + public void setHeight(String height) { + this.height = height; + } + public void setIcon(String icon) { + this.icon = icon; + } + + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/DropDownMenu.java b/src/main/java/org/jeecgframework/tag/vo/easyui/DropDownMenu.java new file mode 100644 index 00000000..a8923efa --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/DropDownMenu.java @@ -0,0 +1,47 @@ +package org.jeecgframework.tag.vo.easyui; +/** + * + * 绫绘弿杩帮細鍒楄〃瀛楁妯″瀷 + * + * @author: 寮犱唬娴 + * @date锛 鏃ユ湡锛2012-12-7 鏃堕棿锛氫笂鍗10:17:45 + * @version 1.0 + */ +public class DropDownMenu { + protected String name;// + protected String classLi; + protected String href; + protected String icon; + protected String color; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getClassLi() { + return classLi; + } + public void setClassLi(String classLi) { + this.classLi = classLi; + } + public String getHref() { + return href; + } + public void setHref(String href) { + this.href = href; + } + public String getIcon() { + return icon; + } + public void setIcon(String icon) { + this.icon = icon; + } + public String getColor() { + return color; + } + public void setColor(String color) { + this.color = color; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/OptTypeDirection.java b/src/main/java/org/jeecgframework/tag/vo/easyui/OptTypeDirection.java new file mode 100644 index 00000000..d45e6f90 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/OptTypeDirection.java @@ -0,0 +1,9 @@ +package org.jeecgframework.tag.vo.easyui; +/** +* 鍒楄〃鎿嶄綔绫诲瀷 +* @author 寮犱唬娴 +*/ +public enum OptTypeDirection { + Deff,Del,Fun,OpenWin,Confirm,ToolBar,OpenTab + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/SortColumn.java b/src/main/java/org/jeecgframework/tag/vo/easyui/SortColumn.java new file mode 100644 index 00000000..a49c9b5b --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/SortColumn.java @@ -0,0 +1,70 @@ +package org.jeecgframework.tag.vo.easyui; + +/** + * + * @author 寮犱唬娴 + * + */ +public class SortColumn { + /** + * 鎺掑簭绱㈠紩 + */ + protected String index; + /** + * 鑷畾涔夋帓搴忓睘鎬 + */ + protected String order; + /** + * 鎺掑簭绫诲瀷 + */ + protected String type; + /** + * 鎺掑簭瀛楁鍚嶅瓧 + */ + protected String name; + /** + * 鑷畾涔夊彇鍊 + */ + protected String value; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getIndex() { + return index; + } + + public void setIndex(String index) { + this.index = index; + } + + public String getOrder() { + return order; + } + + public void setOrder(String order) { + this.order = order; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/Tab.java b/src/main/java/org/jeecgframework/tag/vo/easyui/Tab.java new file mode 100644 index 00000000..abd56367 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/Tab.java @@ -0,0 +1,107 @@ +package org.jeecgframework.tag.vo.easyui; + +/** + * TAB妯″瀷 + * + * @author 寮犱唬娴 + * + */ +public class Tab { + private String href; + private String iframe; + private String id; + private String title; + private String icon = "'icon-default'"; + private String width;// 瀹藉害 + private String heigth;// 楂樺害 + private boolean cache; + private String content; + private boolean closable=true; + /** + * @return the closable + */ + public boolean isClosable() { + return closable; + } + + /** + * @param closable + * the closable to set + */ + public void setClosable(boolean closable) { + this.closable = closable; + } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getWidth() { + return width; + } + + public void setWidth(String width) { + this.width = width; + } + + public String getHeigth() { + return heigth; + } + + public void setHeigth(String heigth) { + this.heigth = heigth; + } + + public boolean isCache() { + return cache; + } + + public void setCache(boolean cache) { + this.cache = cache; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + public String getIframe() { + return iframe; + } + + public void setIframe(String iframe) { + this.iframe = iframe; + } + + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/TabMenu.java b/src/main/java/org/jeecgframework/tag/vo/easyui/TabMenu.java new file mode 100644 index 00000000..075ae442 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/TabMenu.java @@ -0,0 +1,54 @@ +package org.jeecgframework.tag.vo.easyui; + +/** + * TAB妯″瀷 + * + * @author 寮犱唬娴 + * + */ +public class TabMenu { + private String classLi ;//li涓婃牱寮 + private String url; //url鍦板潃 + private String title;//鍚嶇О + private String icon;//鏍囩鍥炬爣 + private String iconColor;//鏍囩鍥炬爣棰滆壊 + private boolean tab=true;//鏄惁涓哄彲鍒囨崲鏍囩椤 + public boolean isTab() { + return tab; + } + public void setTab(boolean tab) { + this.tab = tab; + } + public String getClassLi() { + return classLi; + } + public void setClassLi(String classLi) { + this.classLi = classLi; + } + public String getUrl() { + return url; + } + public void setUrl(String url) { + this.url = url; + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public String getIcon() { + return icon; + } + public void setIcon(String icon) { + this.icon = icon; + } + public String getIconColor() { + return iconColor; + } + public void setIconColor(String iconColor) { + this.iconColor = iconColor; + } + + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/TreeGridModel.java b/src/main/java/org/jeecgframework/tag/vo/easyui/TreeGridModel.java new file mode 100644 index 00000000..bd700a66 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/TreeGridModel.java @@ -0,0 +1,106 @@ +package org.jeecgframework.tag.vo.easyui; + +import java.util.Map; + +/** + * + * @ClassName: TreeGridModel + * @Description: TODO(鏍戝舰鍒楄〃妯″瀷璁剧疆绫) + * @author 寮犱唬娴 + * @date 2013-1-6 涓嬪崍07:24:22 + * + */ +public class TreeGridModel implements java.io.Serializable { + private String idField; + private String textField; + private String childList; + private String parentId; + private String parentText; + private String code; + private String src; + private String roleid; + private String icon; + private String order; + private String functionType; + + public String getFunctionType() { + return functionType; + } + public void setFunctionType(String functionType) { + this.functionType = functionType; + } + + private Map fieldMap; // 瀛樺偍瀹炰綋瀛楁淇℃伅瀹瑰櫒锛歬ey-瀛楁鍚嶇О锛寁alue-瀛楁鍊 + + public String getOrder() { + return order; + } + public void setOrder(String order) { + this.order = order; + } + public String getIcon() { + return icon; + } + public void setIcon(String icon) { + this.icon = icon; + } + public String getRoleid() { + return roleid; + } + public void setRoleid(String roleid) { + this.roleid = roleid; + } + public String getParentText() { + return parentText; + } + public void setParentText(String parentText) { + this.parentText = parentText; + } + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } + + public String getSrc() { + return src; + } + public void setSrc(String src) { + this.src = src; + } + public String getParentId() { + return parentId; + } + public void setParentId(String parentId) { + this.parentId = parentId; + } + public String getIdField() { + return idField; + } + public void setIdField(String idField) { + this.idField = idField; + } + public String getTextField() { + return textField; + } + public void setTextField(String textField) { + this.textField = textField; + } + public String getChildList() { + return childList; + } + public void setChildList(String childList) { + this.childList = childList; + } + + public Map getFieldMap() { + return fieldMap; + } + + public void setFieldMap(Map fieldMap) { + this.fieldMap = fieldMap; + } + + +} diff --git a/src/main/java/org/jeecgframework/tag/vo/easyui/TreeSelect.java b/src/main/java/org/jeecgframework/tag/vo/easyui/TreeSelect.java new file mode 100644 index 00000000..81b5f4d6 --- /dev/null +++ b/src/main/java/org/jeecgframework/tag/vo/easyui/TreeSelect.java @@ -0,0 +1,46 @@ +package org.jeecgframework.tag.vo.easyui; +import java.io.Writer; +import javax.servlet.jsp.tagext.TagSupport; + + +public class TreeSelect extends TagSupport { + /*protected String value; + protected String id; + protected String pid; + protected String name; + protected String text; + protected String width; 值 + + public void setWidth(String width) { + this.width = width; + } + + public void setId(String id) { + this.id = id; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public void setName(String name) { + this.name = name; + } + + public void setText(String text) { + this.text = text; + } + + public void setValue(String value) { + this.value = value; + } + + +*/ + + public String end(Writer writer, String body) { + StringBuffer sb = new StringBuffer(); + + return sb.toString(); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/common/CgAutoListConstant.java b/src/main/java/org/jeecgframework/web/cgform/common/CgAutoListConstant.java new file mode 100644 index 00000000..eb5306fe --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/common/CgAutoListConstant.java @@ -0,0 +1,131 @@ +package org.jeecgframework.web.cgform.common; + +/** + * + * @Title:CgAutoListConstant + * @description:鍔ㄦ佸垪琛ㄥ父閲 + * @author 璧典繆澶 + * @date Jul 5, 2013 3:01:27 PM + * @version V1.0 + */ +public class CgAutoListConstant { + /** 閰嶇疆鐨刬d */ + public static final String CONFIG_ID = "config_id"; + /** 閰嶇疆鐨勫悕绉 */ + public static final String CONFIG_NAME = "config_name"; + /** 鏄惁涓烘爲褰 */ + public static final String CONFIG_ISTREE = "config_istree"; + /** 鏄惁鍒嗛〉 */ + public static final String CONFIG_ISPAGINATION = "config_ispagination"; + /** 鏄惁鏄剧ず澶嶉夋 */ + public static final String CONFIG_ISCHECKBOX = "config_ischeckbox"; + /** 鏌ヨ妯″紡 */ + public static final String CONFIG_QUERYMODE = "config_querymode"; + /** 瀛楁鍒楄〃 */ + public static final String CONFIG_FIELDLIST = "config_fieldList"; + /** 鏌ヨ瀛楁 */ + public static final String CONFIG_QUERYLIST = "config_queryList"; + /** 鎸夐挳缁 */ + public static final String CONFIG_BUTTONLIST = "config_buttons"; + /** 鍒楄〃JS澧炲己 */ + public static final String CONFIG_JSENHANCE = "config_jsenhance"; + /** 鏃犳潈闄愮殑鎸夐挳 */ + public static final String CONFIG_NOLIST = "config_nolist"; + /** 鏃犳潈闄愮殑鎸夐挳涓 */ + public static final String CONFIG_NOLISTSTR = "config_noliststr"; + /** iframe */ + public static final String CONFIG_IFRAME = "config_iframe"; + /** 琛ㄥ悕 */ + public static final String TABLENAME = "tableName"; + /** 瀛楁涓 */ + public static final String FILEDS = "fileds"; + public static final String INITQUERY = "initquery"; + /** 瀛楁缂栫爜 */ + public static final String FILED_ID = "field_id"; + /** 瀛楁鍚嶇О */ + public static final String FIELD_TITLE = "field_title"; + /** 瀛楁鏄惁鏄剧ず */ + public static final String FIELD_ISSHOW = "field_isShow"; + /** 瀛楁鏄惁鏌ヨ */ + public static final String FIELD_ISQUERY = "field_isQuery"; + /** 瀛楁鏌ヨ妯″紡 */ + public static final String FIELD_QUERYMODE = "field_queryMode"; + /** 瀛楁鏄剧ず妯″紡 */ + public static final String FIELD_SHOWTYPE = "field_showType"; + /** 瀛楁绫诲瀷 */ + public static final String FIELD_TYPE = "field_type"; + /** 瀛楁闀垮害 */ + public static final String FIELD_LENGTH = "field_length"; + /** 瀛楁href */ + public static final String FIELD_HREF = "field_href"; + /** 瀛楁榛樿鍊 */ + public static final String FIELD_VALUE = "field_value"; + /** 瀛楁榛樿鍊 */ + public static final String FIELD_VALUE_BEGIN = "field_value_begin"; + /** 瀛楁榛樿鍊 */ + public static final String FIELD_VALUE_END = "field_value_end"; + /** 瀛楀吀table */ + public static final String FIELD_DICTTABLE = "field_dictTable"; + /** 瀛楀吀code */ + public static final String FIELD_DICTFIELD = "field_dictField"; + /** 瀛楀吀鏁版嵁 */ + public static final String FIELD_DICTLIST = "field_dictlist"; + + /** 鏍戝舰鑿滃崟鐖禝D */ + public static final String TREE_PARENTID_FIELDNAME = "tree_parentid_fieldname"; + /** 鏍戝舰鑿滃崟id */ + public static final String TREE_ID_FIELDNAME = "tree_id_fieldname"; + /** 鏍戝舰鑿滃崟鍒 */ + public static final String TREE_FIELDNAME = "tree_fieldname"; + + /** 閫昏緫true */ + public static final String BOOL_TRUE = "Y"; + /** 閫昏緫false */ + public static final String BOOL_FALSE = "N"; + /** 鏄剧ず妯″紡Date */ + public static final String TYPE_DATE = "Date"; + /** 鏄剧ず妯″紡String */ + public static final String TYPE_STRING = "String"; + /** 鏄剧ず妯″紡Integer */ + public static final String TYPE_INTEGER = "Integer"; + /** 鏄剧ず妯″紡Double */ + public static final String TYPE_DOUBLE = "Double"; + /** 鏌ヨ鎿嶄綔= */ + public static final String OP_EQ = " = "; + /** 鏌ヨ鎿嶄綔>= */ + public static final String OP_RQ = " >= "; + /** 鏌ヨ鎿嶄綔<= */ + public static final String OP_LQ = " <= "; + /** 鏌ヨ鎿嶄綔like */ + public static final String OP_LIKE = " LIKE "; + + /** 绯荤粺瀛楀吀鍒嗙粍琛 */ + public static final String SYS_DICGROUP = "t_s_typegroup"; + /** 绯荤粺瀛楀吀琛 */ + public static final String SYS_DIC = "t_s_type"; + + /** 鏅鸿兘琛ㄥ崟鐢熸垚鐨勮〃鐨勫墠缂涓簀form_ */ + public static final String jform_ = "jform_"; + + /** sql澧炲己insert */ + public static final String SQL_INSERT = "insert"; + /** sql澧炲己update */ + public static final String SQL_UPDATE = "update"; + /** 琛ㄥ崟鐗堟湰鍙 */ + public static final String CONFIG_VERSION = "jformVersion"; + + /** 1-鍗曡〃,2-涓昏〃,3-浠庤〃 */ + public static final int JFORM_TYPE_SINGLE_TABLE = 1; + public static final int JFORM_TYPE_MAIN_TALBE = 2; + public static final int JFORM_TYPE_SUB_TABLE = 3; + + /** + * ===============绯荤粺鍙橀噺绾﹀畾瀛楁================= + */ + /** 绯荤粺妯″紡璁剧疆key */ + public static final String SYS_MODE_KEY = "sqlReadMode"; + /** 绯荤粺妯″紡--寮鍙戞ā寮 */ + public static final String SYS_MODE_DEV = "DEV"; + /** 绯荤粺妯″紡--鍙戝竷妯″紡 */ + public static final String SYS_MODE_PUB = "PUB"; +} diff --git a/src/main/java/org/jeecgframework/web/cgform/common/CommUtils.java b/src/main/java/org/jeecgframework/web/cgform/common/CommUtils.java new file mode 100644 index 00000000..74b83a12 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/common/CommUtils.java @@ -0,0 +1,144 @@ +package org.jeecgframework.web.cgform.common; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.cgform.exception.BusinessException; + +/** + * @author 寮犱唬娴 + * @date 2013-08-11 09:47:30 + * @version V1.0 + */ +public class CommUtils { + + + /** + * 鎺掗櫎鐩稿簲鍚嶇О鐨勫睘鎬э紝杩斿洖鍓╀綑灞炴ч敭瀵 + * String filterName[]={"name1","name2","name3"}; + * @param filterName + * @return + */ + @SuppressWarnings("unchecked") + public static Map attributeMapFilter(Map map,String[] filterName) + { + for(int i=0;i mapConvert(Map map) { + Map dataMap= new HashMap(0); + if(map!=null){ + Iterator it=map.entrySet().iterator(); + while(it.hasNext()){ + Map.Entry entry=(Map.Entry)it.next(); + Object ok=entry.getKey(); + Object ov=entry.getValue()==null?"":entry.getValue(); + String key=ok.toString(); + String keyval=""; + String[] value=new String[1]; + if(ov instanceof String[]){ + value=(String[])ov; + }else{ + value[0]=ov.toString(); + } + keyval+=value[0]; + for(int k=1;k>> mapConvertMore(Map map,String tableName) { + Map>> fanalMap = new HashMap>>(); + Map> dataMap= new HashMap>(0); + Map mapField = null; + if(map!=null){ + Iterator it=map.entrySet().iterator(); + while(it.hasNext()){ + Map.Entry entry=(Map.Entry)it.next(); + Object ok=entry.getKey(); + Object ov=entry.getValue()==null?"":entry.getValue(); + String key=ok.toString(); + String keyval=""; + String[] value=new String[1]; + if(ov instanceof String[]){ + value=(String[])ov; + }else{ + value[0]=ov.toString(); + } + keyval+=value[0]; + for(int k=1;k(0); + if(keyArr.length==1){ + if(dataMap.get(tableName)!=null){ + mapField = dataMap.get(tableName); + } + mapField.put(keyArr[0], keyval); + dataMap.put(tableName, mapField); + }else if(keyArr.length==2){ + if(dataMap.get(keyArr[0])!=null){ + mapField = dataMap.get(keyArr[0]); + } + mapField.put(keyArr[1], keyval); + dataMap.put(keyArr[0], mapField); + } + } + } + List> listField = null; + if(dataMap.size()>0){ + Iterator it=dataMap.entrySet().iterator(); + while(it.hasNext()){ + Map.Entry entry=(Map.Entry)it.next(); + String ok=(String)entry.getKey(); + Map ov=(Map)entry.getValue(); + listField = new ArrayList>(); + if(ok.indexOf("[")!=-1){ + ok = ok.substring(0,ok.indexOf("[")); + } + if(fanalMap.get(ok)!=null){ + listField = fanalMap.get(ok); + } + listField.add(ov); + fanalMap.put(ok, listField); + + } + } + return fanalMap; + } + + + public static Map convertFKMap(Map fieldMap,Map mainMap,List> fkFieldList) throws BusinessException { + if(fkFieldList!=null){ + for(Map fkField:fkFieldList){ + if(mainMap.get((String)fkField.get("main_field"))!=null){ + fieldMap.put((String)fkField.get("field_name"), mainMap.get((String)fkField.get("main_field"))); + }else{ + throw new BusinessException("琛ㄥ崟涓病鏈夊閿細"+(String)fkField.get("main_field")); + } + } + } + return fieldMap; + } + + public static void main(String[] args) { + String str = "jform_tbd[0].name"; + String strs [] = str.split("\\."); + org.jeecgframework.core.util.LogUtil.info(strs.length+""); + org.jeecgframework.core.util.LogUtil.info(strs[0].substring(0,strs[0].indexOf("["))); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/common/FormHtmlUtil.java b/src/main/java/org/jeecgframework/web/cgform/common/FormHtmlUtil.java new file mode 100644 index 00000000..f858ce7a --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/common/FormHtmlUtil.java @@ -0,0 +1,318 @@ +package org.jeecgframework.web.cgform.common; + +import org.jeecgframework.core.util.StringUtil; + +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +/** + * @author 寮犱唬娴 + * @date 2013-08-11 09:47:30 + * @version V1.0 + */ +public class FormHtmlUtil { + + + /** + *鏍规嵁CgFormFieldEntity琛ㄥ睘鎬ч厤缃紝杩斿洖琛ㄥ崟HTML浠g爜 + */ + public static String getFormHTML(CgFormFieldEntity cgFormFieldEntity){ + String html=""; + if(cgFormFieldEntity.getShowType().equals("text")){ + html=getTextFormHtml(cgFormFieldEntity); + }else if(cgFormFieldEntity.getShowType().equals("password")){ + html=getPwdFormHtml(cgFormFieldEntity); + }else if(cgFormFieldEntity.getShowType().equals("radio")){ + html=getRadioFormHtml(cgFormFieldEntity); + }else if(cgFormFieldEntity.getShowType().equals("checkbox")){ + html=getCheckboxFormHtml(cgFormFieldEntity); + }else if(cgFormFieldEntity.getShowType().equals("list")){ + html=getListFormHtml(cgFormFieldEntity); + }else if(cgFormFieldEntity.getShowType().equals("date")){ + html=getDateFormHtml(cgFormFieldEntity); + }else if(cgFormFieldEntity.getShowType().equals("datetime")){ + html=getDatetimeFormHtml(cgFormFieldEntity); + }else if(cgFormFieldEntity.getShowType().equals("file")){ + html=getFileFormHtml(cgFormFieldEntity); + }else if(cgFormFieldEntity.getShowType().equals("textarea")){ + html=getTextAreaFormHtml(cgFormFieldEntity); + }else if(cgFormFieldEntity.getShowType().equals("popup")){ + html=getPopupFormHtml(cgFormFieldEntity); + } + else { + html=getTextFormHtml(cgFormFieldEntity); + } + return html; + } + /** + * 杩斿洖textarea鐨勮〃鍗昲tml + * @param cgFormFieldEntity + * @return style="width: 300px" class="inputxt" rows="6" + */ + private static String getTextAreaFormHtml( + CgFormFieldEntity cgFormFieldEntity) { + StringBuilder html = new StringBuilder(""); + html.append(" "); + return html.toString(); + } + + /** + *杩斿洖text绫诲瀷鐨勮〃鍗昲tml + */ + private static String getTextFormHtml(CgFormFieldEntity cgFormFieldEntity) + { + StringBuilder html = new StringBuilder(""); + html.append("0){ + html.append("style=\"width:").append(cgFormFieldEntity.getFieldLength()).append("px\" "); + } + html.append("value=\"\\${").append(cgFormFieldEntity.getFieldName()).append("?if_exists?html}\" "); + if("Y".equals(cgFormFieldEntity.getIsNull())){ + html.append("ignore=\"ignore\" "); + } + if(cgFormFieldEntity.getFieldValidType()!=null&&cgFormFieldEntity.getFieldValidType().length()>0){ + html.append("datatype=\"").append(cgFormFieldEntity.getFieldValidType()).append("\" "); + }else{ + if("int".equals(cgFormFieldEntity.getType())){ + html.append("datatype=\"n\" "); + }else if("double".equals(cgFormFieldEntity.getType())){ + html.append("datatype=\"\\/^(-?\\\\d+)(\\\\.\\\\d+)?\\$\\/\" "); + }else{ + html.append("datatype=\"*\" "); + } + } + html.append("\\/>"); + return html.toString(); + } + + /** + *杩斿洖password绫诲瀷鐨勮〃鍗昲tml + */ + private static String getPwdFormHtml(CgFormFieldEntity cgFormFieldEntity) + { + StringBuilder html = new StringBuilder(""); + html.append("0){ + html.append("style=\"width:").append(cgFormFieldEntity.getFieldLength()).append("px\" "); + } + html.append("value=\"\\${").append(cgFormFieldEntity.getFieldName()).append("?if_exists?html}\" "); + if("Y".equals(cgFormFieldEntity.getIsNull())){ + html.append("ignore=\"ignore\" "); + } + if(cgFormFieldEntity.getFieldValidType()!=null&&cgFormFieldEntity.getFieldValidType().length()>0){ + html.append("datatype=\"").append(cgFormFieldEntity.getFieldValidType()).append("\" "); + }else{ + html.append("datatype=\"*\" "); + } + html.append("\\/>"); + return html.toString(); + } + + + /** + *杩斿洖radio绫诲瀷鐨勮〃鍗昲tml + */ + private static String getRadioFormHtml(CgFormFieldEntity cgFormFieldEntity) + { + + if(StringUtil.isEmpty(cgFormFieldEntity.getDictField())){ + return getTextFormHtml(cgFormFieldEntity); + }else{ + StringBuilder html = new StringBuilder(""); + html.append("<@DictData name=\""+cgFormFieldEntity.getDictField()+"\""); + if(!StringUtil.isEmpty(cgFormFieldEntity.getDictTable())){ + html.append(" tablename=\""+cgFormFieldEntity.getDictTable()+"\""); + } + html.append(" var=\"dictDataList\">"); + html.append("<#list dictDataList as dictdata>"); + html.append(" "); + html.append(" checked=\"true\" "); + html.append(" "); + html.append(">"); + html.append("\\${dictdata.typename?if_exists?html}"); + html.append(" "); + html.append(" "); + return html.toString(); + } + } + + + /** + *杩斿洖checkbox绫诲瀷鐨勮〃鍗昲tml ${data['${po.field_name}']?if_exists?html} + */ + private static String getCheckboxFormHtml(CgFormFieldEntity cgFormFieldEntity) + { + if(StringUtil.isEmpty(cgFormFieldEntity.getDictField())){ + return getTextFormHtml(cgFormFieldEntity); + }else{ + StringBuilder html = new StringBuilder(""); + html.append("<#assign checkboxstr>\\${data['").append(cgFormFieldEntity.getFieldName()).append("']?if_exists?html}"); + html.append("<#assign checkboxlist=checkboxstr?split(\",\")> "); + html.append("<@DictData name=\""+cgFormFieldEntity.getDictField()+"\""); + if(!StringUtil.isEmpty(cgFormFieldEntity.getDictTable())){ + html.append(" tablename=\""+cgFormFieldEntity.getDictTable()+"\""); + } + html.append(" var=\"dictDataList\">"); + html.append("<#list dictDataList as dictdata>"); + html.append(" "); + html.append("<#if dictdata.typecode=='\\${x?if_exists?html}'>"); + html.append(" checked=\"true\" "); + html.append(" "); + html.append(" "); + html.append(">"); + html.append("\\${dictdata.typename?if_exists?html}"); + html.append(" "); + html.append(" "); + return html.toString(); + } + } + + + /** + *杩斿洖list绫诲瀷鐨勮〃鍗昲tml + */ + private static String getListFormHtml(CgFormFieldEntity cgFormFieldEntity) + { + if(StringUtil.isEmpty(cgFormFieldEntity.getDictField())){ + return getTextFormHtml(cgFormFieldEntity); + }else{ + StringBuilder html = new StringBuilder(""); + html.append("<@DictData name=\""+cgFormFieldEntity.getDictField()+"\""); + if(!StringUtil.isEmpty(cgFormFieldEntity.getDictText())){ + html.append(" text=\""+cgFormFieldEntity.getDictText()+"\""); + } + if(!StringUtil.isEmpty(cgFormFieldEntity.getDictTable())){ + html.append(" tablename=\""+cgFormFieldEntity.getDictTable()+"\""); + } + html.append(" var=\"dictDataList\">"); + html.append(""); + html.append(" "); + return html.toString(); + } + } + + + /** + *杩斿洖date绫诲瀷鐨勮〃鍗昲tml + */ + private static String getDateFormHtml(CgFormFieldEntity cgFormFieldEntity) + { + StringBuilder html = new StringBuilder(""); + html.append("0){ + html.append("style=\"width:").append(cgFormFieldEntity.getFieldLength()).append("px\" "); + } + html.append("value=\"\\${").append(cgFormFieldEntity.getFieldName()).append("?if_exists?html}\" "); + if("Y".equals(cgFormFieldEntity.getIsNull())){ + html.append("ignore=\"ignore\" "); + } + if(cgFormFieldEntity.getFieldValidType()!=null&&cgFormFieldEntity.getFieldValidType().length()>0){ + html.append("datatype=\"").append(cgFormFieldEntity.getFieldValidType()).append("\" "); + }else{ + html.append("datatype=\"*\" "); + } + html.append("\\/>"); + return html.toString(); + } + + /** + *杩斿洖datetime绫诲瀷鐨勮〃鍗昲tml + */ + private static String getDatetimeFormHtml(CgFormFieldEntity cgFormFieldEntity) + { + StringBuilder html = new StringBuilder(""); + html.append("0){ + html.append("style=\"width:").append(cgFormFieldEntity.getFieldLength()).append("px\" "); + } + html.append("value=\"\\${").append(cgFormFieldEntity.getFieldName()).append("?if_exists?html}\" "); + if("Y".equals(cgFormFieldEntity.getIsNull())){ + html.append("ignore=\"ignore\" "); + } + if(cgFormFieldEntity.getFieldValidType()!=null&&cgFormFieldEntity.getFieldValidType().length()>0){ + html.append("datatype=\"").append(cgFormFieldEntity.getFieldValidType()).append("\" "); + }else{ + html.append("datatype=\"*\" "); + } + html.append("\\/>"); + return html.toString(); + } + + /** + *杩斿洖file绫诲瀷鐨勮〃鍗昲tml + */ + private static String getFileFormHtml(CgFormFieldEntity cgFormFieldEntity) + { + StringBuilder html = new StringBuilder(""); + html.append("0){ + html.append("style=\"width:").append(cgFormFieldEntity.getFieldLength()).append("px\" "); + } + html.append("value=\"\\${").append(cgFormFieldEntity.getFieldName()).append("?if_exists?html}\" "); + html.append("\\/>"); + return html.toString(); + } + + + /** + *杩斿洖popup绫诲瀷鐨勮〃鍗昲tml + */ + private static String getPopupFormHtml(CgFormFieldEntity cgFormFieldEntity) + { + StringBuilder html = new StringBuilder(""); + html.append("0){ + html.append("style=\"width:").append(cgFormFieldEntity.getFieldLength()).append("px\" "); + } + html.append("value=\"\\${").append(cgFormFieldEntity.getFieldName()).append("?if_exists?html}\" "); + html.append("onclick=\"inputClick(this,'"+cgFormFieldEntity.getDictText()+"','"+cgFormFieldEntity.getDictTable()+"');\" "); + if("Y".equals(cgFormFieldEntity.getIsNull())){ + html.append("ignore=\"ignore\" "); + } + if(cgFormFieldEntity.getFieldValidType()!=null&&cgFormFieldEntity.getFieldValidType().length()>0){ + html.append("datatype=\"").append(cgFormFieldEntity.getFieldValidType()).append("\" "); + }else{ + html.append("datatype=\"*\" "); + } + html.append("\\/>"); + return html.toString(); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/common/OfficeHtmlUtil.java b/src/main/java/org/jeecgframework/web/cgform/common/OfficeHtmlUtil.java new file mode 100644 index 00000000..a52dbd1c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/common/OfficeHtmlUtil.java @@ -0,0 +1,510 @@ +package org.jeecgframework.web.cgform.common; + +import java.io.ByteArrayOutputStream; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpSession; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import jodd.util.StringUtil; + +import org.apache.poi.hwpf.HWPFDocument; +import org.apache.poi.hwpf.converter.WordToHtmlConverter; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.LogUtil; +import org.w3c.dom.Document; + +import com.jacob.activeX.ActiveXComponent; +import com.jacob.com.Dispatch; +import com.jacob.com.Variant; + + +public class OfficeHtmlUtil { + + int WORD_HTML = 8; + int WORD_TXT = 7; + int EXCEL_HTML = 44; + + //娓呴櫎HTML鏍囩鍖归厤鍐呭 + private final static String regEx_style = "<[\\s]*?(style|xml|meta|font|xml|del|ins|o:p|head|!)[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?(style|xml|meta|font|xml|del|ins|o:p|head|>)[\\s]*?>"; + + //娓呴櫎澶氫綑灞炴у尮閰嶅唴瀹 + private final static String regEx_attr1 = "[\\s] ?xmlns?(:v|:o|:w|)=\"([^\"]+)\""; + private final static String regEx_attr2 = "style=\'([^\']+)\'"; + private final static String regEx_attr3 = "[\\s]?(class|lang)=([^?(\\s|>)]+)"; + private final static String regEx_attr4 = "]+>"; + private final static String regEx_attr5 = "<\\/span>"; + + + //杩囨护甯冨眬纭搴 + private final static String regEx_attr7 = "width=.[0-9]*"; + //杩囨护鏂囧瓧椤舵牸 + private final static String regEx_attr8 = "valign=top"; + + //鐢熸垚杈撳叆妗嗗尮閰嶅唴瀹 + private final static String regEx_attr6 = "\\#{([a-zA-Z_0-9]+)\\}"; + + //鏇挎崲鏍囩 閽堝浜绫诲瀷鏍囩 + private final static String regEx_replace = "[^>]+>"; + + /** + * WORD杞琀TML + * + * @param docfile + * WORD鏂囦欢鍏ㄨ矾寰 + * @param htmlfile + * 杞崲鍚嶩TML瀛樻斁璺緞 + */ + public void wordToHtml(String docfile, String htmlfile) { + ActiveXComponent app = new ActiveXComponent("Word.Application"); // 鍚姩word + try { + app.setProperty("Visible", new Variant(false)); + Dispatch docs = app.getProperty("Documents").toDispatch(); + Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[] { docfile, new Variant(false), new Variant(true) }, new int[1]).toDispatch(); + Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { htmlfile, new Variant(WORD_HTML) }, new int[1]); + Variant f = new Variant(false); + Dispatch.call(doc, "Close", f); + } catch (Exception e) { + e.printStackTrace(); + } finally { + app.invoke("Quit", new Variant[] {}); + } + } + + /** + * WORD杞琀TML + * + * @param docfile + * WORD鏂囦欢鍏ㄨ矾寰 + * @param htmlfile + * 杞崲鍚嶩TML瀛樻斁璺緞 + * @throws Throwable + * add by duanql 2013-07-17 + */ + + public void WordConverterHtml(String docfile, String htmlfile){ + try { + InputStream input = new FileInputStream(docfile); + HWPFDocument wordDocument = new HWPFDocument(input); + WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument()); + wordToHtmlConverter.processDocument(wordDocument); + Document htmlDocument = wordToHtmlConverter.getDocument(); + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + DOMSource domSource = new DOMSource(htmlDocument); + StreamResult streamResult = new StreamResult(outStream); + + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer serializer = tf.newTransformer(); + serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); + serializer.setOutputProperty(OutputKeys.INDENT, "yes"); + serializer.setOutputProperty(OutputKeys.METHOD, "html"); + serializer.transform(domSource, streamResult); + outStream.close(); + + String content = new String(outStream.toByteArray(), "UTF-8"); + stringToFile(content,htmlfile); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * EXCEL杞琀TML + * + * @param xlsfile + * EXCEL鏂囦欢鍏ㄨ矾寰 + * @param htmlfile + * 杞崲鍚嶩TML瀛樻斁璺緞 + */ + public void excelToHtml(String xlsfile, String htmlfile) { + ActiveXComponent app = new ActiveXComponent("Excel.Application"); // 鍚姩excel + try { + app.setProperty("Visible", new Variant(false)); + Dispatch excels = app.getProperty("Workbooks").toDispatch(); + Dispatch excel = Dispatch.invoke(excels, "Open", Dispatch.Method, new Object[] { xlsfile, new Variant(false), new Variant(true) }, new int[1]).toDispatch(); + Dispatch.invoke(excel, "SaveAs", Dispatch.Method, new Object[] { htmlfile, new Variant(EXCEL_HTML) }, new int[1]); + Variant f = new Variant(false); + Dispatch.call(excel, "Close", f); + org.jeecgframework.core.util.LogUtil.info("wordtohtml杞崲鎴愬姛"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + app.invoke("Quit", new Variant[] {}); + } + } + + /** + * 璇绘枃浠跺埌瀛楃涓 + * + * @param filename 瑕佽鐨勬枃浠跺悕绉 + * + */ + public String getInfo(String tmpFile) throws IOException { + StringBuffer sbFile = null; + try{ + + FileInputStream fin = new FileInputStream(tmpFile); + InputStreamReader in = null; + + char[] buffer = new char[4096]; + int len; + sbFile = new StringBuffer(); + in = new InputStreamReader(fin,"gb2312"); + while ( (len = in.read(buffer)) != -1) { + String s = new String(buffer, 0, len); + sbFile.append(s); + } + }catch (IOException e4) { + LogUtil.error(e4.toString()); + } + + return sbFile.toString(); + } + /** + * 瀛楃涓插啓鍏ユ枃浠 + * + * @param str 瑕佸啓鍏ョ殑瀛楃涓 + * @param filename 瑕佸啓鍏ョ殑鏂囦欢鍚嶇О + * + */ + + public void stringToFile(String str,String filename){ + try + { + FileOutputStream fout = new FileOutputStream(filename); + + OutputStreamWriter out = null; + out = new OutputStreamWriter(fout,"gb2312"); + out.write(str); + out.close(); + }catch (IOException e4) { + LogUtil.error(e4.toString()); + } + } + + /** + * 鏍囩鏇挎崲 閽堝浜绫诲瀷鏍囩 + * + * @param sourceStr html婧愬瓧绗︿覆 + * @param oldStr 瑕佹浛鎹㈢殑鏍囩瀛楃涓 + * @param newStr 鏇挎崲鍚庣殑鏍囩鍐呭 + * + */ + + public String regExReplace(String sourceStr,String oldStr,String newStr){ + java.util.regex.Pattern pattern; + java.util.regex.Matcher matcher; + String ls_comStr = oldStr+regEx_replace; + String ls_returnStr=""; + try + { + pattern = Pattern.compile(ls_comStr,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(sourceStr); + ls_returnStr = matcher.replaceAll(newStr); + + }catch (Exception e) { + LogUtil.error(e.toString()); + } + + return ls_returnStr; + } + + + /** + * 澶勭悊HTML + * + * @param htmlStr + * 瑕佸鐞嗙殑HTML + */ + public String doHtml(String htmlStr) { + java.util.regex.Pattern pattern; + java.util.regex.Matcher matcher; + + HttpSession session = ContextHolderUtils.getSession(); + String lang = (String)session.getAttribute("lang"); + + try{ + pattern = Pattern.compile(regEx_style,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); + + pattern = Pattern.compile(regEx_attr1,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); + + pattern = Pattern.compile(regEx_attr2,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); + + pattern = Pattern.compile(regEx_attr3,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(" "); + + pattern = Pattern.compile(regEx_attr4,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); + + pattern = Pattern.compile(regEx_attr5,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); +// pattern = Pattern.compile(regEx_attr7,Pattern.CASE_INSENSITIVE); +// matcher = pattern.matcher(htmlStr); +// htmlStr = matcher.replaceAll(""); + + pattern = Pattern.compile(regEx_attr8,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); + + //include + StringBuilder ls_include = new StringBuilder(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + + ls_include.append(""); + + ls_include.append(StringUtil.replace("", "{0}", lang)); + + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + //ls_include.append(""); + ls_include.append("\r\n]+>",Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); + + pattern = Pattern.compile("<\\/p>",Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); +*/ + + //娣诲姞
    璇彞 + String ls_form = "\r\n" + + "\r\n" + + "\r\n" + + "\r\n#{jform_hidden_field}璇彞 + pattern = Pattern.compile("",Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll("\r\n"); + + /* + //娣诲姞input璇彞 + pattern = Pattern.compile(regEx_attr6,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + + StringBuffer sb = new StringBuffer(); + String thStr = ""; + String inputStr = ""; + + boolean result = matcher.find(); + while(result) { + thStr = matcher.group(1); +// inputStr = ""; + inputStr = ""; + if(fieldMap.get(thStr)!=null){ + inputStr = FormHtmlUtil.getFormHTML(fieldMap.get(thStr)); + inputStr +=" "; + } + matcher.appendReplacement(sb, inputStr); + result = matcher.find(); + } + matcher.appendTail(sb); + htmlStr = sb.toString(); + */ + + }catch(Exception e) { + LogUtil.error(e.getMessage()); + } + return htmlStr; + } + + + /** + * 澶勭悊HTML poi杞崲鐢熸垚鐨刪tml + * + * @param htmlStr 瑕佸鐞嗙殑HTML + * + * add by Duanql 2013-07-22 + */ + public String doPoiHtml(String htmlStr) { + java.util.regex.Pattern pattern; + java.util.regex.Matcher matcher; + + //娓呴櫎HTML鏍囩鍖归厤鍐呭 + String regEx_poi1 = "]+>"; + + String regEx_poi2 = "<[\\s]*?(style)[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?(style)[\\s]*?>"; + + String regEx_poi3 = "[\\s]?(class|lang)=([^?(\\s|>)]+)"; + + HttpSession session = ContextHolderUtils.getSession(); + String lang = (String)session.getAttribute("lang"); + + try{ + + + pattern = Pattern.compile(regEx_poi1,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); + + pattern = Pattern.compile(regEx_poi2,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); + + pattern = Pattern.compile(regEx_poi3,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); + + pattern = Pattern.compile("b2\"",Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); + pattern = Pattern.compile("|",Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); + + //include + StringBuilder ls_include = new StringBuilder(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + + ls_include.append(StringUtil.replace("", "{0}", lang)); + + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append(""); + ls_include.append("\r\n]+>",Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); + + pattern = Pattern.compile("<\\/p>",Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll(""); +*/ + + //娣诲姞
    璇彞 + String ls_form = "\r\n" + + "\r\n" + + "\r\n" + + "\r\n璇彞 + pattern = Pattern.compile("",Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + htmlStr = matcher.replaceAll("\r\n"); + + /* + //娣诲姞input璇彞 + pattern = Pattern.compile(regEx_attr6,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + + StringBuffer sb = new StringBuffer(); + String thStr = ""; + String inputStr = ""; + + boolean result = matcher.find(); + while(result) { + thStr = matcher.group(1); +// inputStr = ""; + inputStr = ""; + if(fieldMap.get(thStr)!=null){ + inputStr = FormHtmlUtil.getFormHTML(fieldMap.get(thStr)); + inputStr +=" "; + } + matcher.appendReplacement(sb, inputStr); + result = matcher.find(); + } + matcher.appendTail(sb); + htmlStr = sb.toString(); + */ + + }catch(Exception e) { + LogUtil.error(e.getMessage()); + } + return htmlStr; + } + + + public static void main(String[] args) { + try{ + OfficeHtmlUtil wordtohtml = new OfficeHtmlUtil(); +// wordtohtml.wordToHtml("D://jeecg//qjd.doc", "D://jeecg//test.html"); + wordtohtml.WordConverterHtml("D://jeecg//qjd.doc", "D://jeecg//test.html"); + String htmlStr = wordtohtml.getInfo("D://jeecg//test.html"); + htmlStr = wordtohtml.doPoiHtml(htmlStr); + wordtohtml.stringToFile(htmlStr,"D://jeecg//tt.html"); + }catch (IOException e4) {} + + } + + + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/common/spring-mvc-cgform.xml b/src/main/java/org/jeecgframework/web/cgform/common/spring-mvc-cgform.xml new file mode 100644 index 00000000..97e37a12 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/common/spring-mvc-cgform.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + cgformButtonController.do?save + cgformButtonController.do?del + cgformButtonSqlController.do?save + cgformButtonSqlController.do?del + cgformFtlController.do?save + cgformFtlController.do?del + cgformFtlController.do?active + cgformFtlController.do?cancleActive + cgformEnhanceJsController.do?save + cgformEnhanceJsController.do?del + cgFormHeadController.do?save + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/autolist/CgAutoListController.java b/src/main/java/org/jeecgframework/web/cgform/controller/autolist/CgAutoListController.java new file mode 100644 index 00000000..dc6cdf75 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/autolist/CgAutoListController.java @@ -0,0 +1,603 @@ +package org.jeecgframework.web.cgform.controller.autolist; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.jeecgframework.web.cgform.common.CgAutoListConstant; +import org.jeecgframework.web.cgform.engine.FreemarkerHelper; +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.service.autolist.CgTableServiceI; +import org.jeecgframework.web.cgform.service.autolist.ConfigServiceI; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; +import org.jeecgframework.web.cgform.util.QueryParamUtil; +import org.jeecgframework.web.system.pojo.base.DictEntity; +import org.jeecgframework.web.system.pojo.base.TSOperation; +import org.jeecgframework.web.system.service.SystemService; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.enums.SysThemesEnum; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.JeecgDataAutorUtils; +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.SysThemesUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * + * @Title:CgAutoListController + * @description:鍔ㄦ佸垪琛ㄦ帶鍒跺櫒[鏍规嵁琛ㄥ悕璇诲彇閰嶇疆鏂囦欢锛岃繘琛屽姩鎬佹暟鎹睍鐜癩 + * @author 璧典繆澶 + * @date Jul 5, 2013 2:55:36 PM + * @version V1.0 + */ +@Controller +@RequestMapping("/cgAutoListController") +public class CgAutoListController extends BaseController{ + @Autowired + private ConfigServiceI configService; + @Autowired + private CgTableServiceI cgTableService; + @Autowired + private SystemService systemService; + @Autowired + private CgFormFieldServiceI cgFormFieldService; + private static Logger log = Logger.getLogger(CgAutoListController.class); + /** + * 鍔ㄦ佸垪琛ㄥ睍鐜板叆鍙 + * @param id 鍔ㄦ侀厤缃甀D + * @param request + * @param response + */ + @RequestMapping(params = "list") + public void list(String id, HttpServletRequest request, + HttpServletResponse response) { + long start = System.currentTimeMillis(); + //step.1 鏍规嵁琛ㄥ悕鑾峰彇璇ヨ〃鍗曠殑閰嶇疆鍙傛暟 + String jversion = cgFormFieldService.getCgFormVersionByTableName(id); + Map configs = configService.queryConfigs(id,jversion); + //step.2 鑾峰彇鍒楄〃ftl妯℃澘璺緞 + FreemarkerHelper viewEngine = new FreemarkerHelper(); + Map paras = new HashMap(); + //step.3 灏佽椤甸潰鏁版嵁 + loadVars(configs,paras,request); + //step.4 缁勫悎妯℃澘+鏁版嵁鍙傛暟锛岃繘琛岄〉闈㈠睍鐜 + String html = viewEngine.parseTemplate("/org/jeecgframework/web/cgform/engine/autolist/autolist.ftl", paras); + try { + response.setContentType("text/html"); + response.setHeader("Cache-Control", "no-store"); + PrintWriter writer = response.getWriter(); + writer.println(html); + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + long end = System.currentTimeMillis(); + log.debug("鍔ㄦ佸垪琛ㄧ敓鎴愯楁椂锛"+(end-start)+" ms"); + } + + /** + * 鍔ㄦ佸垪琛ㄦ暟鎹煡璇 + * @param configId 閰嶇疆id 淇浣跨敤id浼氶犳垚涓婚敭鏌ヨ鐨勫啿绐 + * @param page 鍒嗛〉椤甸潰 + * @param rows 鍒嗛〉澶у皬 + * @param request + * @param response + * @param dataGrid + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "datagrid") + public void datagrid(String configId,String page,String field,String rows,String sort,String order, HttpServletRequest request, + HttpServletResponse response, DataGrid dataGrid) { + Object dataRuleSql =JeecgDataAutorUtils.loadDataSearchConditonSQLString(); //request.getAttribute(Globals.MENU_DATA_AUTHOR_RULE_SQL); + long start = System.currentTimeMillis(); + //step.1 鑾峰彇鍔ㄦ侀厤缃 + String jversion = cgFormFieldService.getCgFormVersionByTableName(configId); + Map configs = configService.queryConfigs(configId,jversion); + String table = (String) configs.get(CgAutoListConstant.TABLENAME); + Map params = new HashMap(); + //step.2 鑾峰彇鏌ヨ鏉′欢浠ュ強鍊 + List beans = (List) configs.get(CgAutoListConstant.FILEDS); + Map fieldMap = new HashMap(); + for(CgFormFieldEntity b:beans){ + QueryParamUtil.loadQueryParams(request,b,params); + fieldMap.put(b.getFieldName(), new String[]{b.getType(), b.getFieldDefault()}); + } + + //鍙傛暟澶勭悊 + boolean isTree = configs.get(CgAutoListConstant.CONFIG_ISTREE) == null ? false + : CgAutoListConstant.BOOL_TRUE.equalsIgnoreCase(configs.get(CgAutoListConstant.CONFIG_ISTREE).toString()); + String treeId = request.getParameter("id"); + String parentIdFieldName = null; + String parentIdDefault = null; + String parentIdFieldType = null; + if(isTree) { + parentIdFieldName = configs.get(CgAutoListConstant.TREE_PARENTID_FIELDNAME).toString(); + parentIdFieldType = fieldMap.get(parentIdFieldName)[0]; + parentIdDefault = fieldMap.get(parentIdFieldName)[1]; + if("null".equalsIgnoreCase(parentIdDefault)) { + parentIdDefault = null; + } + if(treeId == null) { + treeId = parentIdDefault; + }else { + if(parentIdFieldType.equalsIgnoreCase(CgAutoListConstant.TYPE_STRING)) { + treeId = "'" + treeId + "'"; + } + } + if(treeId == null) { + params.put(parentIdFieldName, " is null"); + }else { + params.put(parentIdFieldName, "=" + treeId); + } + } + + int p = page==null?1:Integer.parseInt(page); + int r = rows==null?99999:Integer.parseInt(rows); + //step.3 杩涜鏌ヨ杩斿洖缁撴灉锛屽鏋滀负tree鐨勪笅绾ф暟鎹紝鍒欎笉闇瑕佸垎椤 + List> result = null; + if(isTree && treeId !=null) { + //闃叉涓嬬骇鏁版嵁澶ぇ锛屾渶澶у彧鍙500鏉 + result=cgTableService.querySingle(table, field.toString(), params,sort,order, 1, 500); + }else { + result=cgTableService.querySingle(table, field.toString(), params,sort,order, p,r ); + } + + //treeform 澶勭悊鏄惁鏈変笅绾ц彍鍗 + if(isTree) { + cgTableService.treeFromResultHandle(table, parentIdFieldName, parentIdFieldType, + result); + } + + //澶勭悊椤甸潰涓嫢瀛樺湪checkbox鍙兘鏄剧ずcode鍊艰屼笉鑳芥樉绀簍ext鍊奸棶棰 + Map dicMap = new HashMap(); + for(CgFormFieldEntity b:beans){ + loadDic(dicMap, b); + List dicList = (List)dicMap.get(CgAutoListConstant.FIELD_DICTLIST); + if(dicList.size() > 0){ + for(Map resultMap:result){ + StringBuffer sb = new StringBuffer(); + String value = (String)resultMap.get(b.getFieldName()); + if(oConvertUtils.isEmpty(value)){continue;} + String[] arrayVal = value.split(","); + if(arrayVal.length > 1){ + for(String val:arrayVal){ + for(DictEntity dictEntity:dicList){ + if(val.equals(dictEntity.getTypecode())){ + sb.append(dictEntity.getTypename()); + sb.append(","); + } + + } + } + resultMap.put(b.getFieldName(), sb.toString().substring(0, sb.toString().length()-1)); + } + + } + } + } + Long size = cgTableService.getQuerySingleSize(table, field, params); + dealDic(result,beans); + response.setContentType("application/json"); + response.setHeader("Cache-Control", "no-store"); + PrintWriter writer; + try { + writer = response.getWriter(); + if(isTree && treeId !=null) { + //涓嬬骇鍒楄〃 + writer.println(QueryParamUtil.getJson(result)); + }else { + writer.println(QueryParamUtil.getJson(result,size)); + } + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + long end = System.currentTimeMillis(); + log.debug("鍔ㄦ佸垪琛ㄦ煡璇㈣楁椂锛"+(end-start)+" ms"); + } + + /** + * 澶勭悊鏁版嵁瀛楀吀 + * @param result 鏌ヨ鐨勭粨鏋滈泦 + * @param beans 瀛楁閰嶇疆 + */ + @SuppressWarnings("unchecked") + private void dealDic(List> result, + List beans) { + for(CgFormFieldEntity bean:beans){ + String dicTable = bean.getDictTable();//瀛楀吀Table + String dicCode = bean.getDictField();//瀛楀吀Code + String dicText= bean.getDictText();//瀛楀吀text + if(StringUtil.isEmpty(dicTable)&& StringUtil.isEmpty(dicCode)){ + //涓嶉渶瑕佸鐞嗗瓧鍏 + continue; + }else{ + if(!bean.getShowType().equals("popup")){ + List dicDataList = queryDic(dicTable, dicCode,dicText); + for(Map r:result){ + String value = String.valueOf(r.get(bean.getFieldName())); +// for(Map m:dicDatas){ +// String typecode = String.valueOf(m.get("typecode")); +// String typename = String.valueOf(m.get("typename")); +// if(value.equalsIgnoreCase(typecode)){ +// r.put(bean.getFieldName(),typename); +// } +// } + for(DictEntity dictEntity:dicDataList){ + if(value.equalsIgnoreCase(dictEntity.getTypecode())){ + r.put(bean.getFieldName(),MutiLangUtil.getMutiLangInstance().getLang(dictEntity.getTypename())); + } + } + } + } + } + } + } + + /** + * 鍒犻櫎鍔ㄦ佽〃 + * @param configId 閰嶇疆id + * @param id 涓婚敭 + * @param request + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(String configId,String id, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + String jversion = cgFormFieldService.getCgFormVersionByTableName(configId); + String table = (String) configService.queryConfigs(configId,jversion).get(CgAutoListConstant.TABLENAME); + cgTableService.delete(table, id); + String message = "鍒犻櫎鎴愬姛"; + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + j.setMsg(message); + return j; + } + /** + * 鍒犻櫎鍔ㄦ佽〃-鎵归噺 + * @param configId 閰嶇疆id + * @param id 涓婚敭 + * @param request + * @return + */ + @RequestMapping(params = "delBatch") + @ResponseBody + public AjaxJson delBatch(String configId,String ids, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + String jversion = cgFormFieldService.getCgFormVersionByTableName(configId); + String table = (String) configService.queryConfigs(configId,jversion).get(CgAutoListConstant.TABLENAME); + String message = "鍒犻櫎鎴愬姛"; + try { + String[] id = ids.split(","); + cgTableService.deleteBatch(table, id); + } catch (Exception e) { + message = e.getMessage(); + } + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + j.setMsg(message); + return j; + } + + /** + * 瑁呰浇瑕佷紶鍏ュ埌ftl涓殑鍙橀噺 + * @param configs 浠庢暟鎹簱涓彇鍑烘潵鐨勯厤缃 + * @param paras 瑕佷紶鍏tl鐨勫弬鏁帮紙闇瑕佸configs杩涜涓浜涙敼閫狅級 + * @param request + * @return 瑕佷紶鍏tl鐨勫弬鏁帮紙璇ユ柟娉曠洿鎺ユ搷浣減aras瀹瑰櫒锛屽綋鐒跺彲浠ヤ娇鐢ㄦ杩斿洖鍊硷級 + */ + @SuppressWarnings("unchecked") + private Map loadVars(Map configs,Map paras, HttpServletRequest request) { + paras.putAll(configs); + List fieldList = new ArrayList(); + List queryList = new ArrayList(); + StringBuilder fileds = new StringBuilder(); + StringBuilder initQuery = new StringBuilder(); + Set operationCodes = (Set) request.getAttribute(Globals.OPERATIONCODES); + Map operationCodesMap = new HashMap(); + if(operationCodes != null){ + TSOperation tsOperation; + for (String id : operationCodes) { + tsOperation = systemService.getEntity(TSOperation.class, id); + if(tsOperation != null && tsOperation.getOperationType() == 0 && tsOperation.getStatus() == 0){ + operationCodesMap.put(tsOperation.getOperationcode(), tsOperation); + } + } + } + for (CgFormFieldEntity bean : (List) configs.get(CgAutoListConstant.FILEDS)) { + if(operationCodesMap.containsKey(bean.getFieldName())) { + continue; + } + Map fm = new HashMap(); + fm.put(CgAutoListConstant.FILED_ID, bean.getFieldName()); + fm.put(CgAutoListConstant.FIELD_TITLE, bean.getContent()); + String isShowList = bean.getIsShowList(); + if(StringUtil.isEmpty(isShowList)){ + if("id".equalsIgnoreCase(bean.getFieldName())){ + isShowList = CgAutoListConstant.BOOL_FALSE; + }else{ + isShowList = CgAutoListConstant.BOOL_TRUE; + } + } + fm.put(CgAutoListConstant.FIELD_ISSHOW, isShowList); + fm.put(CgAutoListConstant.FIELD_QUERYMODE, bean.getQueryMode()); + fm.put(CgAutoListConstant.FIELD_SHOWTYPE, bean.getShowType()); + fm.put(CgAutoListConstant.FIELD_TYPE, bean.getType()); + fm.put(CgAutoListConstant.FIELD_LENGTH, bean.getFieldLength()==null?"120":bean.getFieldLength()); + fm.put(CgAutoListConstant.FIELD_HREF, bean.getFieldHref()==null?"":bean.getFieldHref()); + loadDic(fm,bean); + fieldList.add(fm); + if (CgAutoListConstant.BOOL_TRUE.equals(bean.getIsQuery())) { + Map fmq = new HashMap(); + fmq.put(CgAutoListConstant.FILED_ID, bean.getFieldName()); + fmq.put(CgAutoListConstant.FIELD_TITLE, bean.getContent()); + fmq.put(CgAutoListConstant.FIELD_QUERYMODE, bean.getQueryMode()); + fmq.put(CgAutoListConstant.FIELD_TYPE, bean.getType()); + fmq.put(CgAutoListConstant.FIELD_SHOWTYPE, bean.getShowType()); + fmq.put(CgAutoListConstant.FIELD_DICTFIELD, bean.getDictField()); + fmq.put(CgAutoListConstant.FIELD_DICTTABLE, bean.getDictTable()); + fmq.put(CgAutoListConstant.FIELD_ISQUERY,"Y"); + loadDefaultValue(fmq,bean,request); + loadDic(fmq,bean); + queryList.add(fmq); + } + loadUrlDataFilter(queryList,bean,request); + loadInitQuery(initQuery,bean,request); + fileds.append(bean.getFieldName()).append(","); + } + loadAuth(paras, request); + loadIframeConfig(paras, request); + paras.put(CgAutoListConstant.CONFIG_FIELDLIST, fieldList); + paras.put(CgAutoListConstant.CONFIG_QUERYLIST, queryList); + paras.put(CgAutoListConstant.FILEDS, fileds); + paras.put(CgAutoListConstant.INITQUERY, initQuery); + return paras; + } + /** + * 鍔犺浇iframe璁剧疆 + * @param paras + * @param request + */ + private void loadIframeConfig(Map paras, + HttpServletRequest request) { + HttpSession session = ContextHolderUtils.getSession(); + String lang = (String)session.getAttribute("lang"); + + //濡傛灉鍒楄〃浠frame褰㈠紡鐨勮瘽锛岄渶瑕佸姞鍏ユ牱寮忔枃浠 + StringBuilder sb= new StringBuilder(""); + if(!request.getQueryString().contains("isHref")){ +// String cssTheme ="default"; +// Cookie[] cookies = request.getCookies(); +// for (Cookie cookie : cookies) { +// if (cookie == null || StringUtils.isEmpty(cookie.getName())) { +// continue; +// } +// if (cookie.getName().equalsIgnoreCase("JEECGCSSTHEME")) { +// cssTheme = cookie.getValue(); +// } +// } +// if(StringUtil.isEmpty(cssTheme)){ +// cssTheme ="default"; +// } + SysThemesEnum sysThemesEnum = SysThemesUtil.getSysTheme(request); + sb.append(""); + sb.append(""); + sb.append(""); +// sb.append(""); + sb.append(SysThemesUtil.getEasyUiTheme(sysThemesEnum)); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); +// sb.append(""); + sb.append(SysThemesUtil.getCommonTheme(sysThemesEnum)); +// sb.append(""); + sb.append(SysThemesUtil.getLhgdialogTheme(sysThemesEnum)); + sb.append(StringUtil.replace("", "{0}", lang)); + + sb.append(""); +// if("metro".equals(cssTheme)){ +// sb.append(""); +// } + sb.append(SysThemesUtil.getEasyUiMainTheme(sysThemesEnum)); + }else{ + } + paras.put(CgAutoListConstant.CONFIG_IFRAME, sb.toString()); + } + /** + * 鍔犺浇鎸夐挳鏉冮檺 + * @param paras + * @param request + */ + private void loadAuth(Map paras, HttpServletRequest request) { + List nolist = (List) request.getAttribute(Globals.NOAUTO_OPERATIONCODES); + if(ResourceUtil.getSessionUserName().getUserName().equals("admin")|| !Globals.BUTTON_AUTHORITY_CHECK){ + nolist = null; + } + String nolistStr = ""; + if(nolist!=null){ + for(TSOperation operation:nolist){ + nolistStr+=operation.getOperationcode(); + nolistStr+=","; + } + } + paras.put(CgAutoListConstant.CONFIG_NOLIST, nolist==null?new ArrayList(0):nolist); + paras.put(CgAutoListConstant.CONFIG_NOLISTSTR, nolistStr==null?"":nolistStr); + } + /** + * 鍔犺浇鍒楄〃鍒濆鏌ヨ鏉′欢- + * @param initQuery + * @param bean + * @param request + */ + private void loadInitQuery(StringBuilder initQuery, CgFormFieldEntity bean, + HttpServletRequest request) { + if(bean.getFieldName().equalsIgnoreCase("id")){ + return; + } + String paramV = request.getParameter(bean.getFieldName()); + String paramVbegin = request.getParameter(bean.getFieldName()+"_begin"); + String paramVend = request.getParameter(bean.getFieldName()+"_end"); + paramV = getSystemValue(paramV); + if(!StringUtil.isEmpty(paramV)){ + initQuery.append("&"+bean.getFieldName()+"="+paramV); + } + if(!StringUtil.isEmpty(paramVbegin)){ + initQuery.append("&"+bean.getFieldName()+"_begin="+paramVbegin); + } + if(!StringUtil.isEmpty(paramVend)){ + initQuery.append("&"+bean.getFieldName()+"_end="+paramVend); + } + } + + /** + * 鍔犺浇URL涓殑杩囨护鍙傛暟[鍦ㄦ湭閰嶇疆鏌ヨ瀛楁鐨勬儏鍐典笅锛屼綔涓篽idden鎺т欢浣跨敤] + * @param queryList + * @param bean + * @param request + */ + @SuppressWarnings("unchecked") + private void loadUrlDataFilter(List queryList, CgFormFieldEntity bean, + HttpServletRequest request) { + String paramV = request.getParameter(bean.getFieldName()); + String paramVbegin = request.getParameter(bean.getFieldName()+"_begin"); + String paramVend = request.getParameter(bean.getFieldName()+"_end"); + if(bean.getFieldName().equalsIgnoreCase("id")){ + return; + } + for(Map mq:queryList){ + if(mq.containsValue(bean.getFieldName())){ + return; + } + } + if(!StringUtil.isEmpty(paramV) || !StringUtil.isEmpty(paramVbegin) ||!StringUtil.isEmpty(paramVend)){ + Map fmq = new HashMap(); + fmq.put(CgAutoListConstant.FILED_ID, bean.getFieldName()); + fmq.put(CgAutoListConstant.FIELD_TITLE, bean.getContent()); + fmq.put(CgAutoListConstant.FIELD_QUERYMODE, bean.getQueryMode()); + fmq.put(CgAutoListConstant.FIELD_TYPE, bean.getType()); + fmq.put(CgAutoListConstant.FIELD_ISQUERY,"N"); + paramV = getSystemValue(paramV); + fmq.put(CgAutoListConstant.FIELD_VALUE, paramV); + paramVend = getSystemValue(paramVend); + fmq.put(CgAutoListConstant.FIELD_VALUE_BEGIN, StringUtil.isEmpty(paramVbegin)?"":paramVbegin); + fmq.put(CgAutoListConstant.FIELD_VALUE_END, StringUtil.isEmpty(paramVend)?"":paramVend); + queryList.add(fmq); + } + } + + /** + * 鍔犺浇URL涓殑杩囨护鍙傛暟[鍦ㄥ凡閰嶇疆鏌ヨ瀛楁鐨勬儏鍐典笅锛岀粰璇ユ煡璇㈠瓧娈靛姞涓婇粯璁ゅ糫 + * @param fmq + * @param bean + * @param request + */ + @SuppressWarnings("unchecked") + private void loadDefaultValue(Map fmq, CgFormFieldEntity bean, + HttpServletRequest request) { + if(bean.getQueryMode().equalsIgnoreCase("single")){ + String paramV = request.getParameter(bean.getFieldName()); + if(!StringUtil.isEmpty(paramV)){ + paramV = getSystemValue(paramV); + fmq.put(CgAutoListConstant.FIELD_VALUE, paramV); + } + }else if(bean.getQueryMode().equalsIgnoreCase("group")){ + String paramVbegin = request.getParameter(bean.getFieldName()+"_begin"); + String paramVend = request.getParameter(bean.getFieldName()+"_end"); + fmq.put(CgAutoListConstant.FIELD_VALUE_BEGIN, StringUtil.isEmpty(paramVbegin)?"":paramVbegin); + fmq.put(CgAutoListConstant.FIELD_VALUE_END, StringUtil.isEmpty(paramVend)?"":paramVend); + } + } + + /** + * 瑁呰浇鏁版嵁瀛楀吀 + * @param m 瑕佹斁鍏reemarker鐨勬暟鎹 + * @param bean 璇诲彇鍑烘潵鐨勫姩鎬侀厤缃暟鎹 + */ + @SuppressWarnings("unchecked") + private void loadDic(Map m, CgFormFieldEntity bean) { + String dicT = bean.getDictTable();//瀛楀吀Table + String dicF = bean.getDictField();//瀛楀吀Code + String dicText = bean.getDictText();//瀛楀吀Text + if(StringUtil.isEmpty(dicT)&& StringUtil.isEmpty(dicF)){ + //濡傛灉杩欎袱涓瓧娈甸兘涓虹┖锛屽垯娌℃湁鏁版嵁瀛楀吀 + m.put(CgAutoListConstant.FIELD_DICTLIST, new ArrayList(0)); + return; + } + if(!bean.getShowType().equals("popup")){ + List dicDatas = queryDic(dicT, dicF,dicText); + m.put(CgAutoListConstant.FIELD_DICTLIST, dicDatas); + }else{ + m.put(CgAutoListConstant.FIELD_DICTLIST, new ArrayList(0)); + } + } + /** + * 鏌ヨ鏁版嵁瀛楀吀 + * @param dicTable 鏁版嵁瀛楀吀琛 + * @param dicCode 鏁版嵁瀛楀吀瀛楁 + * @param dicText 鏁版嵁瀛楀吀鏄剧ず鏂囨湰 + * @return + */ + private List queryDic(String dicTable, String dicCode,String dicText) { +// StringBuilder dicSql = new StringBuilder(); +// if(StringUtil.isEmpty(dicTable)){//step.1 濡傛灉娌℃湁瀛楀吀琛ㄥ垯浣跨敤绯荤粺瀛楀吀琛 +// dicTable = CgAutoListConstant.SYS_DIC; +// dicSql.append(" SELECT TYPECODE,TYPENAME FROM"); +// dicSql.append(" "+dicTable); +// dicSql.append(" "+"WHERE TYPEGROUPID = "); +// dicSql.append(" "+"(SELECT ID FROM "+CgAutoListConstant.SYS_DICGROUP+" WHERE TYPEGROUPCODE = '"+dicCode+"' )"); +// }else{//step.2 濡傛灉缁欏畾浜嗗瓧鍏歌〃鍒欎娇鐢ㄨ瀛楀吀琛紝杩欎釜鍔熻兘闇瑕佸湪琛ㄥ崟閰嶇疆杩藉姞瀛楁 +// //table琛ㄦ煡璇 +// dicSql.append("SELECT DISTINCT ").append(dicCode).append(" as typecode, "); +// if(dicText!=null&&dicText.length()>0){ +// dicSql.append(dicText).append(" as typename "); +// }else{ +// dicSql.append(dicCode).append(" as typename "); +// } +// dicSql.append(" FROM ").append(dicTable); +// dicSql.append(" ORDER BY ").append(dicCode); +// } +// //step.3 瀛楀吀鏁版嵁 +// List> dicDatas = systemService.findForJdbc(dicSql.toString()); + return systemService.queryDict(dicTable, dicCode, dicText); + } + + private String getSystemValue(String sysVarName) { + if(StringUtil.isEmpty(sysVarName)){ + return sysVarName; + } + if(sysVarName.contains("{") && sysVarName.contains("}")){ + sysVarName = sysVarName.replaceAll("\\{", ""); + sysVarName = sysVarName.replaceAll("\\}", ""); + sysVarName =sysVarName.replace("sys.", ""); + return ResourceUtil.getUserSystemData(sysVarName); + }else{ + return sysVarName; + } + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/build/CgFormBuildController.java b/src/main/java/org/jeecgframework/web/cgform/controller/build/CgFormBuildController.java new file mode 100644 index 00000000..05a81248 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/build/CgFormBuildController.java @@ -0,0 +1,374 @@ +package org.jeecgframework.web.cgform.controller.build; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.jeecgframework.web.cgform.common.CgAutoListConstant; +import org.jeecgframework.web.cgform.common.CommUtils; +import org.jeecgframework.web.cgform.engine.TempletContext; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.entity.upload.CgUploadEntity; +import org.jeecgframework.web.cgform.exception.BusinessException; +import org.jeecgframework.web.cgform.service.build.DataBaseService; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.enums.SysThemesEnum; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.SysThemesUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import freemarker.template.Template; +import freemarker.template.TemplateException; + +/** + * @ClassName: formBuildController + * @Description: 璇诲彇妯℃澘鐢熸垚濉姤琛ㄥ崟锛堟坊鍔犮佷慨鏀癸級-鎵ц琛ㄥ崟鏁版嵁娣诲姞鍜屼慨鏀规搷浣 + * @author 鍛ㄤ繆宄 + */ +@Scope("prototype") +@Controller +@RequestMapping("/cgFormBuildController") +public class CgFormBuildController extends BaseController { + private static final Logger logger = Logger.getLogger(CgFormBuildController.class); + private String message; + + @Autowired + private TempletContext templetContext; + @Autowired + private DataBaseService dataBaseService; + + @Autowired + private CgFormFieldServiceI cgFormFieldService; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + /** + * form琛ㄥ崟椤甸潰璺宠浆 + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "ftlForm") + public void ftlForm(HttpServletRequest request,HttpServletResponse response) { + try { + long start = System.currentTimeMillis(); + String tableName =request.getParameter("tableName"); + String ftlVersion =request.getParameter("ftlVersion"); + Template template = templetContext.getTemplate(tableName, ftlVersion); + StringWriter stringWriter = new StringWriter(); + BufferedWriter writer = new BufferedWriter(stringWriter); + Map data = new HashMap(); + String id = request.getParameter("id"); + //鑾峰彇鐗堟湰鍙 + String version = cgFormFieldService.getCgFormVersionByTableName(tableName); + //瑁呰浇琛ㄥ崟閰嶇疆 + Map configData = cgFormFieldService.getFtlFormConfig(tableName,version); + data = new HashMap(configData); + //濡傛灉璇ヨ〃鏄富琛ㄦ煡鍑哄叧鑱旂殑闄勮〃 + CgFormHeadEntity head = (CgFormHeadEntity)data.get("head"); + Map dataForm = new HashMap(); + if(StringUtils.isNotEmpty(id)){ + dataForm = dataBaseService.findOneForJdbc(tableName, id); + } + Iterator it=dataForm.entrySet().iterator(); + while(it.hasNext()){ + Map.Entry entry=(Map.Entry)it.next(); + String ok=(String)entry.getKey(); + Object ov=entry.getValue(); + data.put(ok, ov); + } + Map tableData = new HashMap(); + //鑾峰彇涓昏〃鎴栧崟琛ㄨ〃鍗曟暟鎹 + tableData.put(tableName, dataForm); + //鑾峰彇闄勮〃琛ㄨ〃鍗曟暟鎹 + if(StringUtils.isNotEmpty(id)){ + if(head.getJformType()==CgAutoListConstant.JFORM_TYPE_MAIN_TALBE){ + String subTableStr = head.getSubTableStr(); + if(StringUtils.isNotEmpty(subTableStr)){ + String [] subTables = subTableStr.split(","); + List> subTableData = new ArrayList>(); + for(String subTable:subTables){ + subTableData = cgFormFieldService.getSubTableData(tableName,subTable,id); + tableData.put(subTable, subTableData); + } + } + } + } + //瑁呰浇鍗曡〃/(涓昏〃鍜岄檮琛)琛ㄥ崟鏁版嵁 + data.put("data", tableData); + data.put("id", id); + //椤甸潰鏍峰紡js寮曠敤 + data.put(CgAutoListConstant.CONFIG_IFRAME, getHtmlHead(request)); + //瑁呰浇闄勪欢淇℃伅鏁版嵁 + pushFiles(data,id); + template.process(data, writer); + String content = stringWriter.toString(); + response.setContentType("text/html;charset=utf-8"); + response.getWriter().print(content); + long end = System.currentTimeMillis(); + logger.debug("鑷畾涔夎〃鍗曠敓鎴愯楁椂锛"+(end-start)+" ms"); + } catch (IOException e) { + e.printStackTrace(); + } catch (TemplateException e) { + e.printStackTrace(); + } + + } + + private String getHtmlHead(HttpServletRequest request){ + HttpSession session = ContextHolderUtils.getSession(); + String lang = (String)session.getAttribute("lang"); + StringBuilder sb= new StringBuilder(""); + SysThemesEnum sysThemesEnum = SysThemesUtil.getSysTheme(request); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(SysThemesUtil.getEasyUiTheme(sysThemesEnum)); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); +// sb.append(""); + //common.css + sb.append(SysThemesUtil.getCommonTheme(sysThemesEnum)); +// sb.append(""); + sb.append(SysThemesUtil.getLhgdialogTheme(sysThemesEnum)); + sb.append(StringUtil.replace("", "{0}", lang)); + sb.append(""); + sb.append(SysThemesUtil.getEasyUiMainTheme(sysThemesEnum)); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + //style.css + sb.append(SysThemesUtil.getValidformStyleTheme(sysThemesEnum)); + //tablefrom.css + sb.append(SysThemesUtil.getValidformTablefrom(sysThemesEnum)); + + return sb.toString(); + } + + /** + * 濡傛灉琛ㄥ崟甯︽湁闄勪欢锛屽垯鏌ヨ鍑烘潵浼犻掑埌椤甸潰 + * @param data 浼犲線椤甸潰鐨勬暟鎹鍣 + * @param id 琛ㄥ崟涓婚敭锛岀敤鎴锋煡鎵鹃檮浠舵暟鎹 + */ + private void pushFiles(Map data, String id) { + List uploadBeans = cgFormFieldService.findByProperty(CgUploadEntity.class, "cgformId", id); + List> files = new ArrayList>(0); + for(CgUploadEntity b:uploadBeans){ + String title = b.getAttachmenttitle();//闄勪欢鍚 + String fileKey = b.getId();//闄勪欢涓婚敭 + String path = b.getRealpath();//闄勪欢璺緞 + String field = b.getCgformField();//琛ㄥ崟涓綔涓洪檮浠舵帶浠剁殑瀛楁 + Map file = new HashMap(); + file.put("title", title); + file.put("fileKey", fileKey); + file.put("path", path); + file.put("field", field==null?"":field); + files.add(file); + } + data.put("filesList", files); + } + + /** + * 淇濆瓨鎴栨洿鏂 + * + * @param jeecgDemo + * @param request + * @return + * @throws Exception + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "saveOrUpdate") + @ResponseBody + public AjaxJson saveOrUpdate(HttpServletRequest request) throws Exception{ + AjaxJson j = new AjaxJson(); + Map data = request.getParameterMap(); + if(data!=null){ + data = CommUtils.mapConvert(data); + String tableName = (String)data.get("tableName"); + String id = (String)data.get("id"); + //鎵撳嵃娴嬭瘯 + Iterator it=data.entrySet().iterator(); + while(it.hasNext()){ + Map.Entry entry=(Map.Entry)it.next(); + Object ok=entry.getKey(); + Object ov=entry.getValue()==null?"":entry.getValue(); + logger.debug("name:"+ok.toString()+";value:"+ov.toString()); + } + if(StringUtils.isEmpty(id)){ + //娑堥櫎涓嶆槸琛ㄧ殑瀛楁 + String [] filterName = {"tableName","saveOrUpdate"}; + data = CommUtils.attributeMapFilter(data,filterName); + //淇濆瓨鏁版嵁搴 + try { + Object pkValue = null; + pkValue = dataBaseService.getPkValue(tableName); + data.put("id", pkValue); + int num = dataBaseService.insertTable(tableName, data); + if (num>0) { + j.setSuccess(true); + message = "涓氬姟鎻愪氦鎴愬姛"; + }else { + j.setSuccess(false); + message = "涓氬姟鎻愪氦澶辫触"; + } + } catch (Exception e) { + e.printStackTrace(); + j.setSuccess(false); + message = e.getMessage(); + } + }else{ + //娑堥櫎涓嶆槸琛ㄧ殑瀛楁 + String [] filterName = {"tableName","saveOrUpdate","id"}; + data = CommUtils.attributeMapFilter(data,filterName); + //鏇存柊鏁版嵁搴 + try { + int num = dataBaseService.updateTable(tableName, id, data); + if (num>0) { + j.setSuccess(true); + message = "涓氬姟鏇存柊鎴愬姛"; + }else { + j.setSuccess(false); + message = "涓氬姟鏇存柊澶辫触"; + } + + } catch (Exception e) { + e.printStackTrace(); + j.setSuccess(false); + message = e.getMessage(); + } + } + } + j.setMsg(message); + j.setObj(data); + return j; + } + + + + /** + * 淇濆瓨鎴栨洿鏂 + * + * @param jeecgDemo + * @param request + * @return + * @throws Exception + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "saveOrUpdateMore") + @ResponseBody + public AjaxJson saveOrUpdateMore(HttpServletRequest request) throws Exception{ + AjaxJson j = new AjaxJson(); + Map data = request.getParameterMap(); + if(data!=null){ + data = CommUtils.mapConvert(data); + String tableName = (String)data.get("tableName"); + String id = (String)data.get("id"); + //鎵撳嵃娴嬭瘯 + Iterator it=data.entrySet().iterator(); + while(it.hasNext()){ + Map.Entry entry=(Map.Entry)it.next(); + Object ok=entry.getKey(); + Object ov=entry.getValue()==null?"":entry.getValue(); + logger.debug("name:"+ok.toString()+";value:"+ov.toString()); + } + Map>> mapMore =CommUtils.mapConvertMore(data, tableName); + if(StringUtils.isEmpty(id)){ + logger.info("涓瀵瑰娣诲姞!!!!!"); + try { + Map result = dataBaseService.insertTableMore(mapMore, tableName); + data.put("id", result.get("id")); + j.setSuccess(true); + message = "娣诲姞鎴愬姛"; + } catch (BusinessException e) { + e.printStackTrace(); + j.setSuccess(false); + message = e.getMessage(); + } + + }else{ + logger.info("涓瀵瑰淇敼!!!!!"); + try { + dataBaseService.updateTableMore(mapMore, tableName); + j.setSuccess(true); + message = "鏇存柊鎴愬姛"; + } catch (BusinessException e) { + e.printStackTrace(); + j.setSuccess(false); + message = e.getMessage(); + } + } + } + j.setMsg(message); + j.setObj(data); + return j; + } + + + /** + * 鑷畾涔夋寜閽紙瑙﹀彂瀵瑰簲鐨勫悗鍙版柟娉曪級 + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "doButton") + @ResponseBody + public AjaxJson doButton(HttpServletRequest request){ + AjaxJson j = new AjaxJson(); + try { + String formId = request.getParameter("formId"); + String buttonCode = request.getParameter("buttonCode"); + String tableName = request.getParameter("tableName"); + String id = request.getParameter("id"); + Map data = dataBaseService.findOneForJdbc(tableName, id); + if(data!=null){ + //鎵撳嵃娴嬭瘯 + Iterator it=data.entrySet().iterator(); + while(it.hasNext()){ + Map.Entry entry=(Map.Entry)it.next(); + Object ok=entry.getKey(); + Object ov=entry.getValue()==null?"":entry.getValue(); + logger.debug("name:"+ok.toString()+";value:"+ov.toString()); + } + data = CommUtils.mapConvert(data); + dataBaseService.executeSqlExtend(formId, buttonCode, data); + } + j.setSuccess(true); + message = "鎿嶄綔鎴愬姛"; + } catch (Exception e) { + e.printStackTrace(); + message = "鎿嶄綔澶辫触"; + } + j.setMsg(message); + return j; + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/build/CgformSqlController.java b/src/main/java/org/jeecgframework/web/cgform/controller/build/CgformSqlController.java new file mode 100644 index 00000000..9be98f55 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/build/CgformSqlController.java @@ -0,0 +1,288 @@ +package org.jeecgframework.web.cgform.controller.build; + +import java.beans.PropertyDescriptor; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecgframework.web.cgform.dao.config.CgFormVersionDao; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.pojo.config.CgFormHeadPojo; +import org.jeecgframework.web.cgform.service.migrate.MigrateForm; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.model.common.DBTable; +import org.jeecgframework.core.common.model.common.UploadFile; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.util.LogUtil; +import org.jeecgframework.core.util.ReflectHelper; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Scope; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.core.namedparam.SqlParameterSource; +import org.springframework.stereotype.Controller; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import com.thoughtworks.xstream.XStream; + +/** + * @Title: Controller + * @Description: sql瀵煎叆瀵煎嚭 + * @author duanqilu + * @date 2013-09-04 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/cgformSqlController") +public class CgformSqlController extends BaseController { + /** + * Logger for this class + */ + @SuppressWarnings("unused") + private static final Logger logger = Logger + .getLogger(CgformSqlController.class); + @Autowired + private CgFormVersionDao cgFormVersionDao; + + @Autowired + @Qualifier("jdbcTemplate") + private JdbcTemplate jdbcTemplate; + @Autowired + @Qualifier("namedParameterJdbcTemplate") + private NamedParameterJdbcTemplate namedJdbcTemplate; + + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + /** + * 瀵煎嚭 Form(閲囩敤SQL鏂瑰紡) + * + * @return + * @throws SQLException + */ + @RequestMapping(params = "doMigrateOut") + public void doMigrateOut(HttpServletRequest request,HttpServletResponse response){ + String ids = request.getParameter("ids"); // 鑾峰緱閫夋嫨琛ㄥ崟ID + //List listSQL = new ArrayList(); + try { + //listSQL = MigrateForm.createSQL(ids, jdbcTemplate);// 鍒涘缓鏌ヨ璇彞 + //MigrateForm.executeSQL(listSQL, jdbcTemplate);// 鐢熸垚sql骞舵嫾瑁 + List dbTables = MigrateForm.buildExportDbTableList(ids, jdbcTemplate); //鍒涘缓瀵煎嚭鐨勬暟鎹璞 + //MigrateForm.generateXmlDataOutFlieContent(ids, jdbcDao); + //update by duanqilu 2013-12-05 澧炲姞澶氳〃鍗曞鍑哄姛鑳 + String ls_id=""; + if(ids.indexOf(",")>0){ + ls_id=ids.substring(0, ids.indexOf(",")); + } + else{ + ls_id = ids; + } + CgFormHeadEntity cgFormHeadEntity = cgFormVersionDao.getCgFormById(ls_id); + //update by duanqilu 2013-12-05 澧炲姞澶氳〃鍗曞鍑哄姛鑳 + //MigrateForm.createFile(request,cgFormHeadEntity.getTableName()) + String ls_filename = cgFormHeadEntity.getTableName();// 鍒涘缓鏂囦欢 + String destFileDir = ResourceUtil.getSystempPath()+"/"+ls_filename; + MigrateForm.generateXmlDataOutFlieContent(dbTables, destFileDir); + ls_filename = MigrateForm.zip(null, "", destFileDir); // 鍘嬬缉鏂囦欢 + // 鏂囦欢涓嬭浇 + File file = new File(ls_filename); + String filename = file.getName(); + InputStream fis = new BufferedInputStream(new FileInputStream(ls_filename)); + // 杈撳嚭鐢熸垚鐨剒ip鏂囦欢 + // 娓呯┖response + response.reset(); + // 璁剧疆response鐨凥eader + response.setContentType("text/html;charset=utf-8"); + request.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Length", "" + file.length()); + OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename=" + + new String(filename.getBytes("utf-8"), "ISO8859-1")); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) { + toClient.write(buffer, 0, bytesRead); + } + toClient.write(buffer); + toClient.flush(); + toClient.close(); + fis.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 瀵煎叆sql鏂囦欢璺宠浆 + * + * @param icon + * @param req + * @return + */ + @RequestMapping(params = "toCgformMigrate") + public ModelAndView toCgformMigrate(HttpServletRequest req) { + return new ModelAndView("jeecg/cgform/config/cgformMigrateSqlInclude"); + } + + /** + * 瀵煎叆Form(閲囩敤SQL鏂瑰紡) + * + * @param ids + * @return + * @throws Exception + */ + @RequestMapping(params = "doMigrateIn", method = RequestMethod.POST) + @ResponseBody + public AjaxJson doMigrateIn(HttpServletRequest request, + HttpServletResponse response) { + AjaxJson j = new AjaxJson(); + String ls_file = ""; + UploadFile uploadFile = new UploadFile(request, ls_file); + uploadFile.setCusPath(""); + uploadFile.setSwfpath(""); + String uploadbasepath = uploadFile.getBasePath();// 鏂囦欢涓婁紶鏍圭洰褰 + if (uploadbasepath == null) { + uploadbasepath = ResourceUtil.getConfigByName("uploadpath"); + } + String path = uploadbasepath + "\\";// 鏂囦欢淇濆瓨鍦ㄧ‖鐩樼殑鐩稿璺緞 + String realPath = uploadFile.getMultipartRequest().getSession() + .getServletContext().getRealPath("\\") + + path;// 鏂囦欢鐨勭‖鐩樼湡瀹炶矾寰 + message = null; + try { + File file = new File(realPath); + if (!file.exists()) { + file.mkdir();// 鑻ョ洰褰曚笉瀛樺湪锛屽垱寤烘牴鐩綍 + } + uploadFile.getMultipartRequest().setCharacterEncoding("UTF-8"); + MultipartHttpServletRequest multipartRequest = uploadFile + .getMultipartRequest(); + Map fileMap = multipartRequest.getFileMap(); + String fileName = ""; + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile mf = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 + fileName = mf.getOriginalFilename();// 鑾峰彇鏂囦欢鍚 + String savePath = realPath + fileName; + File savefile = new File(savePath); + String ls_tmp = savefile.getName(); + /*String sqlfilename = realPath + + ls_tmp.substring(0, ls_tmp.lastIndexOf(".")) + "\\" + + ls_tmp.substring(0, ls_tmp.lastIndexOf(".")) + ".sql";*/ + FileCopyUtils.copy(mf.getBytes(), savefile); + MigrateForm.unzip(savePath, ""); + String sqlFileDir = realPath + ls_tmp.substring(0, ls_tmp.lastIndexOf(".")); + File sqlDirFile = new File(sqlFileDir); + String sqlfilename = sqlDirFile.getPath() + "/"; + if(sqlDirFile.isDirectory()){ + sqlfilename += sqlDirFile.list()[0]; + } + /*OfficeHtmlUtil officeHtml = new OfficeHtmlUtil(); + String sqlStr = officeHtml.getInfo(sqlfilename); + String[] sqlStrs = sqlStr.split(";"); + for (String exesql : sqlStrs) { + if (!StringUtil.isEmpty(exesql) && !"\n".equals(exesql)) { + jdbcTemplate.execute(exesql); + } + }*/ + XStream xStream = new XStream(); + xStream.processAnnotations(DBTable.class); + @SuppressWarnings("unchecked") + List dbTables = (List) xStream.fromXML(new File(sqlfilename)); + if(!dbTables.isEmpty() && dbTables.size()>0){ + for (DBTable dbTable : dbTables) { + mergeMigrateInComponent(dbTable); + } + } + } + } catch (Exception e1) { + e1.printStackTrace(); + LogUtil.error(e1.toString()); + message = e1.toString(); + } + if (StringUtil.isNotEmpty(message)) + j.setMsg("SQL鏂囦欢瀵煎叆澶辫触," + message); + else + j.setMsg("SQL鏂囦欢瀵煎叆鎴愬姛"); + + return j; + } + + private void mergeMigrateInComponent(DBTable dbTable) { + Class clazz = dbTable.getClass1(); + if(null != clazz){ + List dataList = dbTable.getTableData(); + if(null == dataList || dataList.size() < 1) return; + Map idMap = new HashMap(); + String id = ""; + String countSql = ""; + SqlParameterSource sqlParameterSource; + List> idList = new ArrayList>(); + for (T t : dataList) { + ReflectHelper reflectHelper = new ReflectHelper(t); + List ignores = new ArrayList(); + ignores.add("class"); + PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(clazz); + for (PropertyDescriptor pd : pds) { + if(null == reflectHelper.getMethodValue(pd.getName())){ + ignores.add(pd.getName()); + } + } + if(t instanceof CgFormHeadPojo){ + reflectHelper.setMethodValue("isDbsynch", "N"); + } + id = (String) reflectHelper.getMethodValue("id"); + countSql = "select id from "+ dbTable.getTableName() + " where id=?"; + if(t instanceof CgFormHeadPojo){ + countSql = "select id from "+ dbTable.getTableName() + " where table_name=?"; + id = oConvertUtils.getString(reflectHelper.getMethodValue("tableName")); + } + idList = jdbcTemplate.queryForList(countSql, id); + sqlParameterSource = MigrateForm.generateParameterMap(t, ignores); + if(idList.size() > 0 && t instanceof CgFormHeadPojo){ + idMap.put("id", oConvertUtils.getString(idList.get(0).get("id"))); + namedJdbcTemplate.update("delete from cgform_field where table_id=:id", idMap); + namedJdbcTemplate.update("delete from cgform_head where id=:id", idMap); + namedJdbcTemplate.update(MigrateForm.generateInsertSql(dbTable.getTableName(), clazz, ignores), sqlParameterSource); + } else if(idList.size() > 0){ + namedJdbcTemplate.update(MigrateForm.generateUpdateSql(dbTable.getTableName(), clazz, ignores), sqlParameterSource); + } else { + namedJdbcTemplate.update(MigrateForm.generateInsertSql(dbTable.getTableName(), clazz, ignores), sqlParameterSource); + } + } + } + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/button/CgformButtonController.java b/src/main/java/org/jeecgframework/web/cgform/controller/button/CgformButtonController.java new file mode 100644 index 00000000..f6807d02 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/button/CgformButtonController.java @@ -0,0 +1,167 @@ +package org.jeecgframework.web.cgform.controller.button; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.cgform.entity.button.CgformButtonEntity; +import org.jeecgframework.web.cgform.service.button.CgformButtonServiceI; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: 琛ㄥ崟鑷畾涔夋寜閽 + * @author 寮犱唬娴 + * @date 2013-08-07 20:16:26 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/cgformButtonController") +public class CgformButtonController extends BaseController { + /** + * Logger for this class + */ + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger(CgformButtonController.class); + + @Autowired + private CgformButtonServiceI cgformButtonService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 琛ㄥ崟鑷畾涔夋寜閽垪琛 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "cgformButton") + public ModelAndView cgformButton(HttpServletRequest request) { + String formId = request.getParameter("formId"); + String tableName = request.getParameter("tableName"); + request.setAttribute("formId", formId); + request.setAttribute("tableName", tableName); + return new ModelAndView("jeecg/cgform/button/cgformButtonList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @SuppressWarnings("unchecked") + @RequestMapping(params = "datagrid") + public void datagrid(CgformButtonEntity cgformButton,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(CgformButtonEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, cgformButton, request.getParameterMap()); + this.cgformButtonService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎琛ㄥ崟鑷畾涔夋寜閽 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(CgformButtonEntity cgformButton, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + cgformButton = systemService.getEntity(CgformButtonEntity.class, cgformButton.getId()); + message = "鍒犻櫎鎴愬姛"; + cgformButtonService.delete(cgformButton); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞琛ㄥ崟鑷畾涔夋寜閽 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(CgformButtonEntity cgformButton, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if("add".equalsIgnoreCase(cgformButton.getButtonCode()) + ||"update".equalsIgnoreCase(cgformButton.getButtonCode()) + ||"delete".equalsIgnoreCase(cgformButton.getButtonCode())){ + message = "鎸夐挳缂栫爜涓嶈兘鏄痑dd/update/delete"; + j.setMsg(message); + return j; + } + List list = cgformButtonService.checkCgformButton(cgformButton); + if(list!=null&&list.size()>0){ + message = "鎸夐挳缂栫爜宸茬粡瀛樺湪"; + j.setMsg(message); + return j; + } + if (StringUtil.isNotEmpty(cgformButton.getId())) { + message = "鏇存柊鎴愬姛"; + CgformButtonEntity t = cgformButtonService.get(CgformButtonEntity.class, cgformButton.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(cgformButton, t); + cgformButtonService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + message = "娣诲姞鎴愬姛"; + cgformButtonService.save(cgformButton); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + + /** + * 琛ㄥ崟鑷畾涔夋寜閽垪琛ㄩ〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(CgformButtonEntity cgformButton, HttpServletRequest req) { + if (StringUtil.isNotEmpty(cgformButton.getId())) { + cgformButton = cgformButtonService.getEntity(CgformButtonEntity.class, cgformButton.getId()); + } + req.setAttribute("cgformButtonPage", cgformButton); + return new ModelAndView("jeecg/cgform/button/cgformButton"); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/button/CgformButtonSqlController.java b/src/main/java/org/jeecgframework/web/cgform/controller/button/CgformButtonSqlController.java new file mode 100644 index 00000000..d5a626da --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/button/CgformButtonSqlController.java @@ -0,0 +1,194 @@ +package org.jeecgframework.web.cgform.controller.button; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.cgform.entity.button.CgformButtonEntity; +import org.jeecgframework.web.cgform.entity.button.CgformButtonSqlEntity; +import org.jeecgframework.web.cgform.service.button.CgformButtonServiceI; +import org.jeecgframework.web.cgform.service.button.CgformButtonSqlServiceI; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: 鎸夐挳sql澧炲己 + * @author 寮犱唬娴 + * @date 2013-08-07 23:09:23 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/cgformButtonSqlController") +public class CgformButtonSqlController extends BaseController { + /** + * Logger for this class + */ + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger(CgformButtonSqlController.class); + + @Autowired + private CgformButtonSqlServiceI cgformButtonSqlService; + @Autowired + private CgformButtonServiceI cgformButtonService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 鎸夐挳sql澧炲己鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "cgformButtonSql") + public ModelAndView cgformButtonSql(HttpServletRequest request) { + String formId = request.getParameter("formId"); + String tableName = request.getParameter("tableName"); + request.setAttribute("formId", formId); + request.setAttribute("tableName", tableName); + return new ModelAndView("jeecg/cgform/button/cgformButtonSqlList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @SuppressWarnings("unchecked") + @RequestMapping(params = "datagrid") + public void datagrid(CgformButtonSqlEntity cgformButtonSql,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(CgformButtonSqlEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, cgformButtonSql, request.getParameterMap()); + this.cgformButtonSqlService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎鎸夐挳sql澧炲己 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(CgformButtonSqlEntity cgformButtonSql, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + cgformButtonSql = systemService.getEntity(CgformButtonSqlEntity.class, cgformButtonSql.getId()); + message = "鍒犻櫎鎴愬姛"; + cgformButtonSqlService.delete(cgformButtonSql); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + /** + * 鏌ユ壘鏁版嵁 + * + * @return + */ + @RequestMapping(params = "doCgformButtonSql") + @ResponseBody + public AjaxJson doCgformButtonSql(CgformButtonSqlEntity cgformButtonSql, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + CgformButtonSqlEntity cgformSql = cgformButtonSqlService.getCgformButtonSqlByCodeFormId(cgformButtonSql.getButtonCode(), cgformButtonSql.getFormId()); + if(cgformSql!=null){ + j.setObj(cgformSql); + j.setSuccess(true); + }else{ + j.setSuccess(false); + } + return j; + } + + + /** + * 娣诲姞鎸夐挳sql澧炲己 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(CgformButtonSqlEntity cgformButtonSql, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + List list = cgformButtonSqlService.checkCgformButtonSql(cgformButtonSql); + if(list!=null&&list.size()>0){ + message = "鎸夐挳缂栫爜宸茬粡瀛樺湪"; + j.setMsg(message); + return j; + } + if (StringUtil.isNotEmpty(cgformButtonSql.getId())) { + message = "鏇存柊鎴愬姛"; + CgformButtonSqlEntity t = cgformButtonSqlService.get(CgformButtonSqlEntity.class, cgformButtonSql.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(cgformButtonSql, t); + cgformButtonSqlService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + message = "娣诲姞鎴愬姛"; + cgformButtonSqlService.save(cgformButtonSql); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + + /** + * 鎸夐挳sql澧炲己鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(CgformButtonSqlEntity cgformButtonSql, HttpServletRequest req) { + //鏍规嵁buttonCode鍜宖ormId鍒濆鍖栨暟鎹 + cgformButtonSql.setButtonCode("add"); + if (StringUtil.isNotEmpty(cgformButtonSql.getButtonCode())&&StringUtil.isNotEmpty(cgformButtonSql.getFormId())) { + CgformButtonSqlEntity cgformButtonSqlVo = cgformButtonSqlService.getCgformButtonSqlByCodeFormId(cgformButtonSql.getButtonCode(), cgformButtonSql.getFormId()); + if(cgformButtonSqlVo!=null){ + cgformButtonSql = cgformButtonSqlVo; + } + } + List list = cgformButtonService.getCgformButtonListByFormId(cgformButtonSql.getFormId()); + if(list==null){ + list = new ArrayList(); + } + req.setAttribute("buttonList", list); + req.setAttribute("cgformButtonSqlPage", cgformButtonSql); + return new ModelAndView("jeecg/cgform/button/cgformButtonSql"); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/cgformcategory/CgformCategoryController.java b/src/main/java/org/jeecgframework/web/cgform/controller/cgformcategory/CgformCategoryController.java new file mode 100644 index 00000000..e32d22ce --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/cgformcategory/CgformCategoryController.java @@ -0,0 +1,140 @@ +package org.jeecgframework.web.cgform.controller.cgformcategory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.cgform.entity.category.CgformCategoryEntity; +import org.jeecgframework.web.cgform.service.cgformcategory.CgformCategoryServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.util.MyBeanUtils; + +/** + * 琛ㄥ崟鍒嗙被绠$悊 + * + * @author JueYue + * @date 2014骞10鏈14鏃 涓嬪崍10:32:17 + */ +@Controller +@RequestMapping("/cgformCategoryController") +public class CgformCategoryController { + /** + * Logger for this class + */ + private static final Logger logger = Logger + .getLogger(CgformCategoryController.class); + + private static final String CGFORM_CATEGORY_LIST = "jeecg/cgform/cgformcategory/cgformCategoryList"; + private static final String CGFORM_CATEGORY = "jeecg/cgform/cgformcategory/cgformCategory"; + + @Autowired + private CgformCategoryServiceI cgformCategoryService; + + @Autowired + private SystemService systemService; + + /** + * 琛ㄥ崟鍒嗙被绠$悊鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "cgformCategory") + public String cgformCategory(HttpServletRequest request) { + return CGFORM_CATEGORY_LIST; + } + + @RequestMapping(params = "datagrid") + public void datagrid(CgformCategoryEntity cgformCategory, + HttpServletRequest request, HttpServletResponse response, + DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(CgformCategoryEntity.class, + dataGrid); + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, + cgformCategory); + this.cgformCategoryService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎琛ㄥ崟鍒嗙被绠$悊 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(CgformCategoryEntity cgformCategory, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + try { + cgformCategory = cgformCategoryService.getEntity( + CgformCategoryEntity.class, cgformCategory.getId()); + j.setMsg("琛ㄥ崟鍒嗙被绠$悊鍒犻櫎鎴愬姛"); + cgformCategoryService.delete(cgformCategory); + systemService.addLog(j.getMsg(), Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + } catch (Exception e) { + logger.error(e.getMessage(), e.fillInStackTrace()); + j.setMsg("琛ㄥ崟鍒嗙被绠$悊鍒犻櫎澶辫触"); + } + return j; + } + + /** + * 娣诲姞琛ㄥ崟鍒嗙被绠$悊 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(CgformCategoryEntity cgformCategory, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + try { + if (StringUtil.isNotEmpty(cgformCategory.getId())) { + j.setMsg("琛ㄥ崟鍒嗙被绠$悊鏇存柊鎴愬姛"); + CgformCategoryEntity t = cgformCategoryService.get( + CgformCategoryEntity.class, cgformCategory.getId()); + MyBeanUtils.copyBeanNotNull2Bean(cgformCategory, t); + cgformCategoryService.saveOrUpdate(t); + systemService.addLog(j.getMsg(), Globals.Log_Type_UPDATE, + Globals.Log_Leavel_INFO); + } else { + j.setMsg("琛ㄥ崟鍒嗙被绠$悊娣诲姞鎴愬姛"); + cgformCategoryService.save(cgformCategory); + systemService.addLog(j.getMsg(), Globals.Log_Type_INSERT, + Globals.Log_Leavel_INFO); + } + } catch (Exception e) { + logger.error(e.getMessage(), e.fillInStackTrace()); + j.setMsg("琛ㄥ崟鍒嗙被绠$悊鏇存柊澶辫触"); + } + return j; + } + + /** + * 琛ㄥ崟鍒嗙被绠$悊鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public String addorupdate(CgformCategoryEntity cgformCategory, + HttpServletRequest req) { + if (StringUtil.isNotEmpty(cgformCategory.getId())) { + cgformCategory = cgformCategoryService.getEntity( + CgformCategoryEntity.class, cgformCategory.getId()); + req.setAttribute("cgformCategoryPage", cgformCategory); + } + return CGFORM_CATEGORY; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/cgformftl/CgformFtlController.java b/src/main/java/org/jeecgframework/web/cgform/controller/cgformftl/CgformFtlController.java new file mode 100644 index 00000000..18708056 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/cgformftl/CgformFtlController.java @@ -0,0 +1,612 @@ +package org.jeecgframework.web.cgform.controller.cgformftl; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.jeecgframework.web.cgform.common.OfficeHtmlUtil; +import org.jeecgframework.web.cgform.entity.cgformftl.CgformFtlEntity; +import org.jeecgframework.web.cgform.service.cgformftl.CgformFtlServiceI; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.common.UploadFile; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.DateUtils; +import org.jeecgframework.core.util.FileUtils; +import org.jeecgframework.core.util.FormUtil; +import org.jeecgframework.core.util.LogUtil; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: 涓婁紶Word杞崲涓篺reemarker琛ㄥ崟 + * @author 娈靛叾褰 + * @date 2013-07-03 17:42:05 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/cgformFtlController") +public class CgformFtlController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger + .getLogger(CgformFtlController.class); + + @Autowired + private CgformFtlServiceI cgformFtlService; + @Autowired + private SystemService systemService; + @Autowired + private CgFormFieldServiceI cgFormFieldService; + + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + /** + * 妯℃澘灞曠ず + * + * @author 瀹夎秴 + * @return + */ + @RequestMapping(params = "formEkeditor") + public ModelAndView ckeditor(HttpServletRequest request, String id) { + CgformFtlEntity t = systemService.get(CgformFtlEntity.class, id); + request.setAttribute("cgformFtlEntity", t); + if (t.getFtlContent() == null) { + request.setAttribute("contents", ""); + } else { + request.setAttribute("contents", new String(t.getFtlContent())); + } + //------longjb 20150513----for锛氫慨鏀瑰鍔犳柊鐨勭紪杈戝櫒ueditor椤甸潰------ + if(request.getParameter("editorType")==null){ + return new ModelAndView("jeecg/cgform/cgformftl/ckeditor"); + }else{ + return new ModelAndView("jeecg/cgform/cgformftl/"+request.getParameter("editorType")); + } + } + + /** + * 妯℃澘缂栬緫淇濆瓨 + * + * @author 瀹夎秴 + * @return + */ + @RequestMapping(params = "saveFormEkeditor") + @ResponseBody + public AjaxJson saveCkeditor(HttpServletRequest request, + CgformFtlEntity cgformFtlEntity, String contents) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(cgformFtlEntity.getId())) { + CgformFtlEntity t = systemService.get(CgformFtlEntity.class, + cgformFtlEntity.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(cgformFtlEntity, t); + t.setFtlContent(contents); + systemService.saveOrUpdate(t); + j.setSuccess(true); + j.setMsg("鏇存柊鎴愬姛"); + } catch (Exception e) { + e.printStackTrace(); + j.setSuccess(false); + j.setMsg("鏇存柊澶辫触"); + } + } + return j; + } + + /** + * Word杞現tl鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "cgformFtl") + public ModelAndView cgformFtl(HttpServletRequest request) { + String formid = request.getParameter("formid"); + request.setAttribute("formid", formid); + return new ModelAndView("jeecg/cgform/cgformftl/cgformFtlList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @SuppressWarnings("unchecked") + @RequestMapping(params = "datagrid") + public void datagrid(CgformFtlEntity cgformFtl, HttpServletRequest request, + HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(CgformFtlEntity.class, dataGrid); + // 鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, + cgformFtl, request.getParameterMap()); + this.cgformFtlService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎Word杞現tl + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(CgformFtlEntity cgformFtl, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + cgformFtl = systemService.getEntity(CgformFtlEntity.class, + cgformFtl.getId()); + message = "鍒犻櫎鎴愬姛"; + cgformFtlService.delete(cgformFtl); + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + /** + * 婵娲籉tl + * + * @return + */ + @RequestMapping(params = "active") + @ResponseBody + public AjaxJson active(CgformFtlEntity cgformFtl, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + try { + // 鍒ゆ柇鏈夋病鏈夋縺娲昏繃鐨勬ā鏉 + cgformFtl = systemService.getEntity(CgformFtlEntity.class, + cgformFtl.getId()); + if (!cgformFtlService.hasActive(cgformFtl.getCgformId())) { + cgformFtl.setFtlStatus("1"); + cgformFtlService.saveOrUpdate(cgformFtl); + message = "婵娲绘垚鍔"; + systemService.addLog(message, Globals.Log_Type_UPDATE, + Globals.Log_Leavel_INFO); + j.setSuccess(true); + j.setMsg(message); + } else { + message = "宸叉湁婵娲绘ā鏉匡紝璇峰彇娑堝悗鍐嶈繘琛屾縺娲"; + j.setSuccess(true); + j.setMsg(message); + } + } catch (Exception e) { + logger.info(e.getMessage()); + message = "婵娲诲け璐"; + j.setSuccess(false); + j.setMsg(message); + } + return j; + } + + /** + * 鍙栨秷婵娲籉tl + * + * @return + */ + @RequestMapping(params = "cancleActive") + @ResponseBody + public AjaxJson cancleActive(CgformFtlEntity cgformFtl, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + try { + cgformFtl = systemService.getEntity(CgformFtlEntity.class, + cgformFtl.getId()); + cgformFtl.setFtlStatus("0"); + cgformFtlService.saveOrUpdate(cgformFtl); + message = "鍙栨秷婵娲绘垚鍔"; + systemService.addLog(message, Globals.Log_Type_UPDATE, + Globals.Log_Leavel_INFO); + j.setSuccess(true); + j.setMsg(message); + } catch (Exception e) { + logger.info(e.getMessage()); + message = "鍙栨秷婵娲诲け璐"; + j.setSuccess(false); + j.setMsg(message); + } + return j; + } + + /** + * 娣诲姞Word杞現tl + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(CgformFtlEntity cgformFtl, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(cgformFtl.getId())) { + message = "鏇存柊鎴愬姛"; + CgformFtlEntity t = cgformFtlService.get(CgformFtlEntity.class, + cgformFtl.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(cgformFtl, t); + cgformFtlService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, + Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + message = "娣诲姞鎴愬姛"; + cgformFtlService.save(cgformFtl); + systemService.addLog(message, Globals.Log_Type_INSERT, + Globals.Log_Leavel_INFO); + } + + return j; + } + + /** + * 杞現tl鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(CgformFtlEntity cgformFtl, + HttpServletRequest req) { + if (StringUtil.isNotEmpty(cgformFtl.getId())) { + cgformFtl = cgformFtlService.getEntity(CgformFtlEntity.class, + cgformFtl.getId()); + } + HttpSession session = ContextHolderUtils.getSession(); + String lang = (String)session.getAttribute("lang"); + StringBuffer sb = new StringBuffer(); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + + sb.append(""); + + sb.append("
    "); + sb.append(""); + sb.append(""); + + sb.append(""); + + + req.setAttribute("cgformStr", sb); + req.setAttribute("cgformFtlPage", cgformFtl); + if("02".equals(cgformFtl.getEditorType())){ + return new ModelAndView("jeecg/cgform/cgformftl/cgformFtlUEditor"); + }else if("03".equals(cgformFtl.getEditorType())){ + return new ModelAndView("jeecg/cgform/cgformftl/cgformFtl"); + }else{ + return new ModelAndView("jeecg/cgform/cgformftl/cgformFtlEditor"); + } + } + + /** + * 淇濆瓨杞崲琛ㄥ崟鏂囦欢 + * + * @param ids + * @return + * @throws Exception + */ + @RequestMapping(params = "saveWordFiles", method = RequestMethod.POST) + @ResponseBody + public AjaxJson saveWordFiles(HttpServletRequest request, + HttpServletResponse response, CgformFtlEntity cgformFtl) { + AjaxJson j = new AjaxJson(); + Map attributes = new HashMap(); + + LogUtil.info("-------------------------step.1-------------------------------------"); + String fileKey = oConvertUtils.getString(request.getParameter("id"));// 鏂囦欢ID + String cgformId = oConvertUtils.getString(request + .getParameter("cgformId"));// formid + String cgformName = oConvertUtils.getString(request + .getParameter("cgformName"));// formname + String ftlStatus = oConvertUtils.getString(request + .getParameter("ftlStatus"));// formStatus + if (oConvertUtils.isEmpty(ftlStatus)) { + ftlStatus = "0"; + } + + if (StringUtil.isNotEmpty(fileKey)) { + cgformFtl.setId(fileKey); + cgformFtl = systemService.getEntity(CgformFtlEntity.class, fileKey); + } else { + cgformFtl.setFtlVersion(cgformFtlService.getNextVarsion(cgformId)); + } + LogUtil.info("-------------------------step.2-------------------------------------"); + cgformFtl.setCgformId(cgformId); + cgformFtl.setCgformName(cgformName); + cgformFtl.setFtlStatus(ftlStatus); + + UploadFile uploadFile = new UploadFile(request, cgformFtl); + uploadFile.setCusPath("forms"); + message = null; + try { + + uploadFile.getMultipartRequest().setCharacterEncoding("UTF-8"); + MultipartHttpServletRequest multipartRequest = uploadFile + .getMultipartRequest(); + + String uploadbasepath = uploadFile.getBasePath();// 鏂囦欢涓婁紶鏍圭洰褰 + if (uploadbasepath == null) { + uploadbasepath = ResourceUtil.getConfigByName("uploadpath"); + } + Map fileMap = multipartRequest.getFileMap(); + // 鏂囦欢鏁版嵁搴撲繚瀛樿矾寰 + String path = uploadbasepath + "\\";// 鏂囦欢淇濆瓨鍦ㄧ‖鐩樼殑鐩稿璺緞 + String realPath = uploadFile.getMultipartRequest().getSession() + .getServletContext().getRealPath("\\") + + path;// 鏂囦欢鐨勭‖鐩樼湡瀹炶矾寰 + File file = new File(realPath); + if (!file.exists()) { + file.mkdir();// 鍒涘缓鏍圭洰褰 + } + if (uploadFile.getCusPath() != null) { + realPath += uploadFile.getCusPath() + "\\"; + path += uploadFile.getCusPath() + "\\"; + file = new File(realPath); + if (!file.exists()) { + file.mkdir();// 鍒涘缓鏂囦欢鑷畾涔夊瓙鐩綍 + } + } else { + realPath += DateUtils.getDataString(DateUtils.yyyyMMdd) + "\\"; + path += DateUtils.getDataString(DateUtils.yyyyMMdd) + "\\"; + file = new File(realPath); + if (!file.exists()) { + file.mkdir();// 鍒涘缓鏂囦欢鏃堕棿瀛愮洰褰 + } + } + LogUtil.info("-------------------------step.3-------------------------------------"); + String fileName = ""; + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile mf = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 + fileName = mf.getOriginalFilename();// 鑾峰彇鏂囦欢鍚 + String extend = FileUtils.getExtend(fileName);// 鑾峰彇鏂囦欢鎵╁睍鍚 + String myfilename = ""; + String myhtmlfilename = ""; + String noextfilename = "";// 涓嶅甫鎵╁睍鍚 + if (uploadFile.isRename()) { + + noextfilename = DateUtils + .getDataString(DateUtils.yyyymmddhhmmss) + + StringUtil.random(8);// 鑷畾涔夋枃浠跺悕绉 + myfilename = noextfilename + "." + extend;// 鑷畾涔夋枃浠跺悕绉 + } else { + myfilename = fileName; + } + + String savePath = realPath + myfilename;// 鏂囦欢淇濆瓨鍏ㄨ矾寰 + cgformFtl.setFtlWordUrl(fileName); + File savefile = new File(savePath); + FileCopyUtils.copy(mf.getBytes(), savefile); + + myhtmlfilename = realPath + noextfilename + ".html"; + String myftlfilename = realPath + noextfilename + ".ftl"; + LogUtil.info("-------------------------step.4-------------------------------------"); + // 寮濮嬭浆鎹㈣〃鍗曟枃浠 + OfficeHtmlUtil officeHtml = new OfficeHtmlUtil(); + + // 鏂瑰紡涓锛歫acob.jar鏂瑰紡word杞琱tml + officeHtml.wordToHtml(savePath, myhtmlfilename); + String htmlStr = officeHtml.getInfo(myhtmlfilename); + htmlStr = officeHtml.doHtml(htmlStr); + + // 鏂瑰紡浜岋細poi鏂瑰紡word杞琱tml + // officeHtml.WordConverterHtml(savePath, myhtmlfilename); + // String htmlStr = officeHtml.getInfo(myhtmlfilename); + // htmlStr = officeHtml.doPoiHtml(htmlStr); + + officeHtml.stringToFile(htmlStr, myftlfilename); + // js plugin start + StringBuilder script = new StringBuilder(""); + script.append("
    "); + script.append(""); + script.append(""); + + + script.append(""); + htmlStr = htmlStr.replace("", script.toString() + + ""); + // js plugin end + cgformFtl.setFtlContent(htmlStr); + cgformFtlService.saveOrUpdate(cgformFtl); + LogUtil.info("-------------------------step.5-------------------------------------"); + } + } catch (Exception e1) { + LogUtil.error(e1.toString()); + message = e1.toString(); + } + + attributes.put("id", cgformFtl.getId()); + if (StringUtil.isNotEmpty(message)) + j.setMsg("Word杞現tl澶辫触," + message); + else + j.setMsg("Word杞現tl鎴愬姛"); + j.setAttributes(attributes); + + return j; + } + // for锛氭斁寮僯acob鍜宲oi涓婁紶word锛屾敼鐢╟keditor + @RequestMapping(params = "cgformFtl2") + public ModelAndView cgformFtl2(HttpServletRequest request) { + String formid = request.getParameter("formid"); + request.setAttribute("formid", formid); + return new ModelAndView("jeecg/cgform/cgformftl/cgformFtlList2"); + } + + @RequestMapping(params = "saveEditor") + @ResponseBody + public AjaxJson saveEditor(CgformFtlEntity cgformFtl, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + String fileKey = oConvertUtils.getString(request.getParameter("id"));// 鏂囦欢ID + String cgformId = oConvertUtils.getString(request + .getParameter("cgformId")); + String cgformName = oConvertUtils.getString(request + .getParameter("cgformName")); + String ftlStatus = oConvertUtils.getString(request + .getParameter("ftlStatus")); + String ftlVersion = oConvertUtils.getString(request + .getParameter("ftlVersion")); + String ftlWordUrl = oConvertUtils.getString(request + .getParameter("ftlWordUrl")); + String createBy = oConvertUtils.getString(request + .getParameter("createBy")); + String createName = oConvertUtils.getString(request + .getParameter("createName")); + String createDate = oConvertUtils.getString(request + .getParameter("createDate")); + if (oConvertUtils.isEmpty(ftlStatus)) + ftlStatus = "0"; + + cgformFtl.setCgformId(cgformId); + cgformFtl.setCgformName(cgformName); + cgformFtl.setFtlStatus(ftlStatus); + if (StringUtil.isNotEmpty(fileKey)) { + cgformFtl.setId(fileKey); + if(StringUtil.isNotEmpty(ftlVersion)) + cgformFtl.setFtlVersion(Integer.valueOf(ftlVersion)); + if (StringUtil.isNotEmpty(ftlWordUrl)) + cgformFtl.setFtlWordUrl(ftlWordUrl); + if (StringUtil.isNotEmpty(createBy)) + cgformFtl.setCreateBy(createBy); + if (StringUtil.isNotEmpty(createName)) + cgformFtl.setCreateName(createName); + if (StringUtil.isNotEmpty(createDate)) + cgformFtl.setCreateDate(DateUtils.str2Date(createDate, DateUtils.date_sdf)); + + if (cgformFtl.getFtlContent()!=null&&cgformFtl.getFtlContent().indexOf("" + + "" + + "" + + "#{jform_hidden_field}", "")); + } + cgformFtlService.saveOrUpdate(cgformFtl); + j.setMsg("淇敼鎴愬姛"); + } else { + cgformFtl.setFtlVersion(cgformFtlService.getNextVarsion(cgformId)); + + String ls_form = "
    " + + "" + + "" + + "#{jform_hidden_field}", "")); + cgformFtlService.save(cgformFtl); + j.setMsg("涓婁紶鎴愬姛"); + } + Map attributes = new HashMap(); + attributes.put("id", cgformFtl.getId()); + j.setAttributes(attributes); + return j; + } + // for锛氭斁寮僯acob鍜宲oi涓婁紶word锛屾敼鐢╟keditor +//----------longjb 20150602 ---for: html瑙f瀽棰勮 + @RequestMapping(params = "parseUeditor") + @ResponseBody + public AjaxJson parseUeditor(String parseForm,String action,HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + try { + System.out.println(parseForm); +// System.out.println(contentData); + JSONObject json = new JSONObject().fromObject(parseForm); + System.out.println(json.getString("parse")); + System.out.println(json.getString("data")); + // 鍒ゆ柇鏈夋病鏈夋縺娲昏繃鐨勬ā鏉 + message = FormUtil.GetHtml(json.getString("parse"),json.getString("data"), action); + j.setSuccess(true); + j.setMsg(message); + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + message = "瑙f瀽寮傚父"+e.getMessage(); + j.setSuccess(false); + j.setMsg(message); + } + return j; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/config/CgFormHeadController.java b/src/main/java/org/jeecgframework/web/cgform/controller/config/CgFormHeadController.java new file mode 100644 index 00000000..5dfba284 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/config/CgFormHeadController.java @@ -0,0 +1,536 @@ +package org.jeecgframework.web.cgform.controller.config; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.exception.BusinessException; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; +import org.jeecgframework.web.cgform.service.impl.config.util.FieldNumComparator; +import org.jeecgframework.web.system.service.SystemService; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +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; + +/** + * @Title: Controller + * @Description: 鏅鸿兘琛ㄥ崟閰嶇疆 + * @author 灞堢劧鍗 + * @date 2013-06-30 11:36:53 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/cgFormHeadController") +public class CgFormHeadController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger + .getLogger(CgFormHeadController.class); + @Autowired + private CgFormFieldServiceI cgFormFieldService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + /** + * 鑷姩鐢熸垚琛ㄥ睘鎬у垪琛 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "cgFormHeadList") + public ModelAndView cgFormHead(HttpServletRequest request) { + return new ModelAndView("jeecg/cgform/config/cgFormHeadList"); + } + /** + * 鎻愪緵閫夋嫨鐨勭晫闈 + * @param request + * @return + */ + @RequestMapping(params = "cgForms") + public ModelAndView cgForms(HttpServletRequest request) { + return new ModelAndView("jeecg/cgform/config/cgForms"); + } + @RequestMapping(params = "goCgFormSynChoice") + public ModelAndView goCgFormSynChoice(HttpServletRequest request) { + return new ModelAndView("jeecg/cgform/config/cgformSynChoice"); + } + + @RequestMapping(params = "popmenulink") + public ModelAndView popmenulink(ModelMap modelMap, + @RequestParam String url, + @RequestParam String title, HttpServletRequest request) { + modelMap.put("title",title); + modelMap.put("url",url); + return new ModelAndView("jeecg/cgform/config/popmenulink"); + } + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(CgFormHeadEntity cgFormHead, + HttpServletRequest request, HttpServletResponse response, + DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(CgFormHeadEntity.class, + dataGrid); + // 鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, + cgFormHead); + this.cgFormFieldService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎鑷姩鐢熸垚琛ㄥ睘鎬 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(CgFormHeadEntity cgFormHead, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + cgFormHead = systemService.getEntity(CgFormHeadEntity.class, + cgFormHead.getId()); + message = "鍒犻櫎鎴愬姛"; + cgFormFieldService.deleteCgForm(cgFormHead); + cgFormFieldService.removeSubTableStr4Main(cgFormHead); + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + /** + * 绉婚櫎鑷姩鐢熸垚琛ㄥ睘鎬 + * + * @return + */ + @RequestMapping(params = "rem") + @ResponseBody + public AjaxJson rem(CgFormHeadEntity cgFormHead, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + cgFormHead = systemService.getEntity(CgFormHeadEntity.class, + cgFormHead.getId()); + message = "绉婚櫎鎴愬姛"; + cgFormFieldService.delete(cgFormHead); + cgFormFieldService.removeSubTableStr4Main(cgFormHead); + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + /** + * 鍒犻櫎鑷姩鐢熸垚琛ㄥ睘鎬 + * + * @return + */ + @RequestMapping(params = "delField") + @ResponseBody + public AjaxJson delField(CgFormFieldEntity cgFormField, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + cgFormField = systemService.getEntity(CgFormFieldEntity.class, + cgFormField.getId()); + message = cgFormField.getFieldName()+"鍒犻櫎鎴愬姛"; + cgFormFieldService.delete(cgFormField); + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 鍚屾琛ㄥ崟閰嶇疆鍒版暟鎹簱 + * + * @param ids + * @return + */ + @RequestMapping(params = "doDbSynch") + @ResponseBody + public AjaxJson doDbSynch(CgFormHeadEntity cgFormHead,String synMethod, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + cgFormHead = systemService.getEntity(CgFormHeadEntity.class, + cgFormHead.getId()); + //鍚屾鏁版嵁搴 + try { + boolean bl = cgFormFieldService.dbSynch(cgFormHead,synMethod); + if(bl){ + //杩藉姞涓昏〃鐨勯檮琛ㄤ覆 + cgFormFieldService.appendSubTableStr4Main(cgFormHead); + message = "鍚屾鎴愬姛"; + j.setMsg(message); + }else{ + message = "鍚屾澶辫触"; + j.setMsg(message); + return j; + } + } catch (BusinessException e) { + j.setMsg(e.getMessage()); + return j; + } + return j; + } + + + + /** + * 娣诲姞鑷姩鐢熸垚琛ㄥ睘鎬 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(CgFormHeadEntity cgFormHead, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + CgFormHeadEntity oldTable =cgFormFieldService.getEntity(CgFormHeadEntity.class, cgFormHead.getId()); + cgFormFieldService.removeSubTableStr4Main(oldTable); + //step.1 濡傛灉鏁版嵁琛ㄥ凡缁忓垱寤,鍒欎笉鑳芥洿鏀逛富閿瓥鐣(鍚庣画閫氳繃寮哄埗鍚屾瑙e喅姝ら棶棰) + /*if(cgFormHead.getId()!=null){ + boolean tableexist = cgFormFieldService.checkTableExist(cgFormHead.getTableName()); + if(tableexist){ + if(!cgFormHead.getJformPkType().equalsIgnoreCase(oldTable.getJformPkType())){ + if((cgFormHead.getJformPkType().equalsIgnoreCase("NATIVE")||cgFormHead.getJformPkType().equalsIgnoreCase("SEQUENCE")) + &&(oldTable.getJformPkType().equalsIgnoreCase("NATIVE")||oldTable.getJformPkType().equalsIgnoreCase("SEQUENCE"))){ + //native鍜宻equence鍙互浜掕浆 + }else{ + throw new org.jeecgframework.core.common.exception.BusinessException("鏁版嵁琛ㄥ凡缁忓垱寤,涓嶈兘鏇存崲涓婚敭绛栫暐"); + } + } + } + } + */ + //step.2 鍒ゅ畾琛ㄦ牸鏄惁瀛樺湪 + CgFormHeadEntity table = judgeTableIsNotExit(cgFormHead,oldTable); + //step.3 鍒锋柊orderNum骞朵笖鍘婚噸澶 + refreshFormFieldOrderNum(cgFormHead); + + + if (StringUtil.isNotEmpty(cgFormHead.getId())&&table!=null) { + List formFieldEntities = table.getColumns(); + for (CgFormFieldEntity cgFormFieldEntity : formFieldEntities) { + if (StringUtil.isEmpty(cgFormFieldEntity.getOldFieldName()) + && StringUtil.isNotEmpty(cgFormFieldEntity.getFieldName())) { + cgFormFieldEntity.setFieldName(cgFormFieldEntity.getFieldName().toLowerCase()); + cgFormFieldEntity.setOldFieldName(cgFormFieldEntity.getFieldName()); + } + + } + cgFormFieldService.updateTable(table,null); + cgFormFieldService.appendSubTableStr4Main(table); + cgFormFieldService.sortSubTableStr(table); + systemService.addLog(message, Globals.Log_Type_UPDATE, + Globals.Log_Leavel_INFO); + } else if (StringUtil.isEmpty(cgFormHead.getId())&&table==null) { + List formFieldEntities = cgFormHead.getColumns(); + for (CgFormFieldEntity cgFormFieldEntity : formFieldEntities) { + if (StringUtil.isEmpty(cgFormFieldEntity.getOldFieldName())) { + cgFormFieldEntity.setFieldName(cgFormFieldEntity.getFieldName().toLowerCase()); + cgFormFieldEntity.setOldFieldName(cgFormFieldEntity.getFieldName()); + } + + } + cgFormFieldService.saveTable(cgFormHead); + systemService.addLog(message, Globals.Log_Type_INSERT, + Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + /** + * 璁剧疆OrderNum + * @param cgFormHead + */ + private void refreshFormFieldOrderNum(CgFormHeadEntity cgFormHead) { + Collections.sort(cgFormHead.getColumns(),new FieldNumComparator()); + for(int i = 0;i getColumnList(CgFormHeadEntity cgFormHead,String type, + HttpServletRequest req) { + + List columnList = new ArrayList(); + if (StringUtil.isNotEmpty(cgFormHead.getId())) { + CriteriaQuery cq = new CriteriaQuery(CgFormFieldEntity.class); + cq.eq("table.id", cgFormHead.getId()); + cq.add(); + columnList = cgFormFieldService + .getListByCriteriaQuery(cq, false); + //瀵瑰瓧娈靛垪鎸夐『搴忔帓搴 + Collections.sort(columnList,new FieldNumComparator()); + }else{ +// CgFormFieldEntity field = new CgFormFieldEntity(); +// field.setFieldName("id"); +// field.setLength(36); +// field.setContent("涓婚敭"); +// field.setIsKey("Y"); +// field.setIsNull("N"); +// field.setOrderNum(1); +// field.setType("string"); +// field.setPointLength(0); +// field.setIsShow("N"); +// field.setIsShowList("N"); +// field.setFieldLength(120); +// columnList.add(field); + columnList=getInitDataList(); + } + return columnList; + } + /** + * 娣诲姞鍒濆鍖栧垪 + * @return + */ + private List getInitDataList(){ + List columnList = new ArrayList(); + + columnList.add(initCgFormFieldEntityId()); + columnList.add(initCgFormFieldEntityString("create_name","鍒涘缓浜哄悕绉")); + columnList.add(initCgFormFieldEntityString("create_by","鍒涘缓浜虹櫥褰曞悕绉")); + columnList.add(initCgFormFieldEntityTime("create_date","鍒涘缓鏃ユ湡")); + columnList.add(initCgFormFieldEntityString("update_name","鏇存柊浜哄悕绉")); + columnList.add(initCgFormFieldEntityString("update_by","鏇存柊浜虹櫥褰曞悕绉")); + columnList.add(initCgFormFieldEntityTime("update_date","鏇存柊鏃ユ湡")); + return columnList; + } + /** + * 娣诲姞榛樿id + * @return + */ + private CgFormFieldEntity initCgFormFieldEntityId(){ + CgFormFieldEntity field = new CgFormFieldEntity(); + field.setFieldName("id"); + field.setLength(36); + field.setContent("涓婚敭"); + field.setIsKey("Y"); + field.setIsNull("N"); + field.setOrderNum(1); + field.setType("string"); + field.setPointLength(0); + field.setIsShow("N"); + field.setIsShowList("N"); + field.setFieldLength(120); + return field; + } + + /** + * 娣诲姞榛樿鏁版嵁 + * @return + */ + private CgFormFieldEntity initCgFormFieldEntityString(String fieldName,String content){ + CgFormFieldEntity field = new CgFormFieldEntity(); + field.setFieldName(fieldName); + field.setLength(50); + field.setContent(content); + field.setIsKey("N"); + field.setIsNull("Y"); + field.setOrderNum(2); + field.setType("string"); + field.setPointLength(0); + field.setIsShow("N"); + field.setIsShowList("N"); + field.setFieldLength(120); + return field; + } + + /** + * 娣诲姞榛樿鏃堕棿 + * @return + */ + private CgFormFieldEntity initCgFormFieldEntityTime(String fieldName,String content){ + CgFormFieldEntity field = new CgFormFieldEntity(); + field.setFieldName(fieldName); + field.setLength(20); + field.setContent(content); + field.setIsKey("N"); + field.setIsNull("Y"); + field.setOrderNum(3); + field.setType("Date"); + field.setPointLength(0); + field.setIsShow("N"); + field.setIsShowList("N"); + field.setFieldLength(120); + field.setShowType("date"); + return field; + } + /** + * 鍒ゆ柇琛ㄦ牸鏄宸茬粡鍒涘缓 + * + * @return AjaxJson 涓殑success + */ + @RequestMapping(params = "checkIsExit") + @ResponseBody + public AjaxJson checkIsExit(String name, + HttpServletRequest req) { + AjaxJson j = new AjaxJson(); + j.setSuccess(cgFormFieldService.judgeTableIsExit(name)); + return j; + } + /** + * sql鎻掍欢 椤甸潰璺宠浆 + * @return + */ + @RequestMapping(params = "sqlPlugin") + public ModelAndView sqlPlugin(String id,HttpServletRequest request) { + CgFormHeadEntity bean = cgFormFieldService.getEntity( + CgFormHeadEntity.class, id); + request.setAttribute("bean", bean); + return new ModelAndView("jeecg/cgform/config/cgFormSqlPlugin"); + } + /** + * sql 鎻掍欢淇濆瓨 + * @param id 閰嶇疆id + * @param sql_plug_in 鎻掍欢鍐呭 + * @param request + * @return + */ + @RequestMapping(params = "sqlPluginSave") + @ResponseBody + public AjaxJson sqlPluginSave(String id,String sql_plug_in, + HttpServletRequest request) { + CgFormHeadEntity bean = cgFormFieldService.getEntity( + CgFormHeadEntity.class, id); + //bean.setSqlPlugIn(sql_plug_in); + cgFormFieldService.updateTable(bean,null); + message = "淇濆瓨鎴愬姛"; + systemService.addLog(message, Globals.Log_Type_INSERT, + Globals.Log_Leavel_INFO); + AjaxJson j = new AjaxJson(); + j.setMsg(message); + return j; + } + /** + * js鎻掍欢 椤甸潰璺宠浆 + * @return + */ + @RequestMapping(params = "jsPlugin") + public ModelAndView jsPlugin(String id,HttpServletRequest request) { + CgFormHeadEntity bean = cgFormFieldService.getEntity( + CgFormHeadEntity.class, id); + request.setAttribute("bean", bean); + return new ModelAndView("jeecg/cgform/config/cgFormJsPlugin"); + } + /** + * js 鎻掍欢淇濆瓨 + * @param id 閰嶇疆id + * @param js_plug_in 鎻掍欢鍐呭 + * @param request + * @return + */ + @RequestMapping(params = "jsPluginSave") + @ResponseBody + public AjaxJson jsPluginSave(String id,String js_plug_in, + HttpServletRequest request) { + CgFormHeadEntity bean = cgFormFieldService.getEntity( + CgFormHeadEntity.class, id); + //bean.setJsPlugIn(js_plug_in);鍋滅敤jsPlugIn杩欎釜瀛楁 + cgFormFieldService.updateTable(bean,null); + message = "淇濆瓨鎴愬姛"; + systemService.addLog(message, Globals.Log_Type_INSERT, + Globals.Log_Leavel_INFO); + AjaxJson j = new AjaxJson(); + j.setMsg(message); + return j; + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/enhance/CgformEnhanceJsController.java b/src/main/java/org/jeecgframework/web/cgform/controller/enhance/CgformEnhanceJsController.java new file mode 100644 index 00000000..27773850 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/enhance/CgformEnhanceJsController.java @@ -0,0 +1,171 @@ +package org.jeecgframework.web.cgform.controller.enhance; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.cgform.entity.enhance.CgformEnhanceJsEntity; +import org.jeecgframework.web.cgform.service.enhance.CgformEnhanceJsServiceI; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: JS澧炲己 + * @author 寮犱唬娴 + * @date 2013-08-11 09:47:30 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/cgformEnhanceJsController") +public class CgformEnhanceJsController extends BaseController { + /** + * Logger for this class + */ + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger(CgformEnhanceJsController.class); + + @Autowired + private CgformEnhanceJsServiceI cgformenhanceJsService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * JS澧炲己鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "cgformenhanceJs") + public ModelAndView cgformenhanceJs(HttpServletRequest request) { + return new ModelAndView("jeecg/cgform/enhance/cgformenhanceJsList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @SuppressWarnings("unchecked") + @RequestMapping(params = "datagrid") + public void datagrid(CgformEnhanceJsEntity cgformenhanceJs,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(CgformEnhanceJsEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, cgformenhanceJs, request.getParameterMap()); + this.cgformenhanceJsService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎JS澧炲己 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(CgformEnhanceJsEntity cgformenhanceJs, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + cgformenhanceJs = systemService.getEntity(CgformEnhanceJsEntity.class, cgformenhanceJs.getId()); + message = "鍒犻櫎鎴愬姛"; + cgformenhanceJsService.delete(cgformenhanceJs); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + /** + * 鏌ユ壘鏁版嵁 + * + * @return + */ + @RequestMapping(params = "doCgformEnhanceJs") + @ResponseBody + public AjaxJson doCgformEnhanceJs(CgformEnhanceJsEntity cgformenhanceJs, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + CgformEnhanceJsEntity cgformenJs = cgformenhanceJsService.getCgformEnhanceJsByTypeFormId(cgformenhanceJs.getCgJsType(), cgformenhanceJs.getFormId()); + if(cgformenJs!=null){ + j.setObj(cgformenJs); + j.setSuccess(true); + }else{ + j.setSuccess(false); + } + return j; + } + + /** + * 娣诲姞JS澧炲己 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(CgformEnhanceJsEntity cgformenhanceJs, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(cgformenhanceJs.getId())) { + message = "鏇存柊鎴愬姛"; + CgformEnhanceJsEntity t = cgformenhanceJsService.get(CgformEnhanceJsEntity.class, cgformenhanceJs.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(cgformenhanceJs, t); + cgformenhanceJsService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + message = "娣诲姞鎴愬姛"; + cgformenhanceJsService.save(cgformenhanceJs); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + + /** + * JS澧炲己鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(CgformEnhanceJsEntity cgformenhanceJs, HttpServletRequest req) { + //鏍规嵁cgJsType鍜宖ormId鍒濆鍖栨暟鎹 + cgformenhanceJs.setCgJsType("form"); + if (StringUtil.isNotEmpty(cgformenhanceJs.getCgJsType())&&StringUtil.isNotEmpty(cgformenhanceJs.getFormId())) { + CgformEnhanceJsEntity cgformenJs = cgformenhanceJsService.getCgformEnhanceJsByTypeFormId(cgformenhanceJs.getCgJsType(), cgformenhanceJs.getFormId()); + if(cgformenJs!=null){ + cgformenhanceJs = cgformenJs; + } + } + req.setAttribute("cgformenhanceJsPage", cgformenhanceJs); + return new ModelAndView("jeecg/cgform/enhance/cgformenhanceJs"); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/excel/ExcelTempletController.java b/src/main/java/org/jeecgframework/web/cgform/controller/excel/ExcelTempletController.java new file mode 100644 index 00000000..f7d6b130 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/excel/ExcelTempletController.java @@ -0,0 +1,317 @@ +package org.jeecgframework.web.cgform.controller.excel; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.cgform.common.CgAutoListConstant; +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.service.autolist.CgTableServiceI; +import org.jeecgframework.web.cgform.service.autolist.ConfigServiceI; +import org.jeecgframework.web.cgform.service.build.DataBaseService; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; +import org.jeecgframework.web.cgform.service.excel.ExcelTempletService; +import org.jeecgframework.web.cgform.service.impl.config.util.FieldNumComparator; +import org.jeecgframework.web.cgform.util.QueryParamUtil; +import org.jeecgframework.web.system.pojo.base.DictEntity; +import org.jeecgframework.web.system.service.SystemService; +import org.apache.log4j.Logger; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.util.BrowserUtils; +import org.jeecgframework.core.util.ExceptionUtil; +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.UUIDGenerator; +import org.jeecgframework.core.util.oConvertUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +/** + * @ClassName: excelTempletController + * @Description: excel妯$増澶勭悊 + * @author huiyong + */ +@Scope("prototype") +@Controller +@RequestMapping("/excelTempletController") +public class ExcelTempletController extends BaseController { + private static final Logger logger = Logger + .getLogger(ExcelTempletController.class); + private String message; + @Autowired + private ConfigServiceI configService; + @Autowired + private CgFormFieldServiceI cgFormFieldService; + @Autowired + private DataBaseService dataBaseService; + @Autowired + private CgTableServiceI cgTableService; + @Autowired + private SystemService systemService; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + /** + * 瀵煎嚭excel妯$増 + * + * @param request + * @param response + */ + @SuppressWarnings("all") + @RequestMapping(params = "exportXls") + public void exportXls(HttpServletRequest request, + HttpServletResponse response,String field, DataGrid dataGrid) { + + String codedFileName = "鏂囦欢"; + String sheetName="瀵煎嚭淇℃伅"; + List lists = null; + if (StringUtil.isNotEmpty(request.getParameter("tableName"))) { + String configId = request.getParameter("tableName"); + String jversion = cgFormFieldService.getCgFormVersionByTableName(configId); + Map configs = configService.queryConfigs(configId,jversion); + Map params = new HashMap(); + //step.2 鑾峰彇鏌ヨ鏉′欢浠ュ強鍊 + List beans = (List) configs.get(CgAutoListConstant.FILEDS); + for(CgFormFieldEntity b:beans){ +// if(CgAutoListConstant.BOOL_TRUE.equals(b.getIsQuery())){ + QueryParamUtil.loadQueryParams(request,b,params); +// } + } + List> result=cgTableService.querySingle(configId, field.toString(), params,null,null, 1,99999 ); + + //琛ㄥ崟鍒楅泦鍚 + lists = (List) configs.get(CgAutoListConstant.FILEDS); + for (int i = lists.size() - 1; i >= 0; i--) { + if(!field.contains(lists.get(i).getFieldName())){ + lists.remove(i); + } + } + + //澶勭悊椤甸潰涓嫢瀛樺湪checkbox鍙兘鏄剧ずcode鍊艰屼笉鑳芥樉绀簍ext鍊奸棶棰 + Map dicMap = new HashMap(); + for(CgFormFieldEntity b:beans){ + loadDic(dicMap, b); + List dicList = (List)dicMap.get(CgAutoListConstant.FIELD_DICTLIST); + if(dicList.size() > 0){ + for(Map resultMap:result){ + StringBuffer sb = new StringBuffer(); + String value = (String)resultMap.get(b.getFieldName()); + if(oConvertUtils.isEmpty(value)){continue;} + String[] arrayVal = value.split(","); + if(arrayVal.length > 1){ + for(String val:arrayVal){ + for(DictEntity dictEntity:dicList){ + if(val.equals(dictEntity.getTypecode())){ + sb.append(dictEntity.getTypename()); + sb.append(","); + } + + } + } + resultMap.put(b.getFieldName(), sb.toString().substring(0, sb.toString().length()-1)); + } + + } + } + } + dealDic(result,beans); + // 瀵瑰瓧娈靛垪鎸夐『搴忔帓搴 + Collections.sort(lists, new FieldNumComparator()); + //琛ㄧ殑涓枃鍚嶇О + sheetName = (String)configs.get(CgAutoListConstant.CONFIG_NAME); + //琛ㄧ殑鑻辨枃鍚嶇О + String tableName = (String)configs.get(CgAutoListConstant.TABLENAME); + //瀵煎嚭鏂囦欢鍚嶇О form琛ㄥ崟涓枃鍚-v鐗堟湰鍙.xsl + codedFileName = sheetName+"_"+tableName+"-v"+(String)configs.get(CgAutoListConstant.CONFIG_VERSION); + // 鐢熸垚鎻愮ず淇℃伅锛 + response.setContentType("application/vnd.ms-excel"); + + OutputStream fOut = null; + try { + + // 鏍规嵁娴忚鍣ㄨ繘琛岃浆鐮侊紝浣垮叾鏀寔涓枃鏂囦欢鍚 + String browse = BrowserUtils.checkBrowse(request); + if ("MSIE".equalsIgnoreCase(browse.substring(0, 4))) { + response.setHeader("content-disposition", + "attachment;filename=" + + java.net.URLEncoder.encode(codedFileName, + "UTF-8") + ".xls"); + } else { + String newtitle = new String(codedFileName.getBytes("UTF-8"), + "ISO8859-1"); + response.setHeader("content-disposition", + "attachment;filename=" + newtitle + ".xls"); + } + // 浜х敓宸ヤ綔绨垮璞 + HSSFWorkbook workbook = null; + workbook = ExcelTempletService.exportExcel(sheetName, lists,result); + fOut = response.getOutputStream(); + workbook.write(fOut); + } catch (UnsupportedEncodingException e1) { + + } catch (Exception e) { + + } finally { + try { + fOut.flush(); + fOut.close(); + } catch (IOException e) { + + } + } + } else { + throw new BusinessException("鍙傛暟閿欒"); + } + + } + + @RequestMapping(params = "goImplXls" , method = RequestMethod.GET) + public ModelAndView goImplXls(HttpServletRequest request) { + request.setAttribute("tableName", request.getParameter("tableName")); + return new ModelAndView("jeecg/cgform/excel/upload"); + } + + /** + * 涓婁紶妯$増鏁版嵁 + * @param request + * @param response + * @return + */ + @RequestMapping(params = "importExcel", method = RequestMethod.POST) + @ResponseBody + @SuppressWarnings("all") + public AjaxJson importExcel(HttpServletRequest request, HttpServletResponse response) { + String message = "涓婁紶鎴愬姛"; + AjaxJson j = new AjaxJson(); + String configId = request.getParameter("tableName"); + String jversion = cgFormFieldService.getCgFormVersionByTableName(configId); + Map configs = configService.queryConfigs(configId,jversion); + //鏁版嵁搴撲腑鐗堟湰鍙 + String version = (String)configs.get(CgAutoListConstant.CONFIG_VERSION); + List lists = (List) configs.get(CgAutoListConstant.FILEDS); + + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 + //涓婁紶鏂囦欢鐨勭増鏈彿 + String docVersion = getDocVersion(file.getOriginalFilename()); + if (docVersion.equals(version)) { + List> listDate; + try { + //璇诲彇excel妯$増鏁版嵁 + listDate = (List>) ExcelTempletService.importExcelByIs(file.getInputStream(), lists); + if (listDate==null) { + message = "璇嗗埆妯$増鏁版嵁閿欒"; + logger.error(message); + }else{ + for (Map map : listDate) { + map.put("id", UUIDGenerator.generate()); + int num = dataBaseService.insertTable(configId, map); + } + message = "鏂囦欢瀵煎叆鎴愬姛锛"; + } + } catch (IOException e) { + message = "鏂囦欢瀵煎叆澶辫触锛"; + logger.error(ExceptionUtil.getExceptionMessage(e)); + } + }else{ + message = "妯$増鏂囦欢鐗堟湰鍜岃〃杈句笉鍖归厤锛岃閲嶆柊涓嬭浇妯$増"; + logger.error(message); + } + } + j.setMsg(message); + return j; + } + /** + * 杩斿洖妯$増鏂囦欢鐨勭増鏈彿 + * 榛樿鏂囦欢鍚嶆槸锛 form琛ㄥ崟涓枃鍚-v鐗堟湰鍙.xsl + * 涔熸湁鍙兘鏄細 form琛ㄥ崟涓枃鍚-v鐗堟湰鍙(1).xsl + * @param docName + * @return + */ + private static String getDocVersion(String docName){ + if(docName.indexOf("(")>0){ + return docName.substring(docName.indexOf("-v")+2, docName.indexOf("(")); + }else { + return docName.substring(docName.indexOf("-v")+2, docName.indexOf(".")); + } + } + + private void loadDic(Map m, CgFormFieldEntity bean) { + String dicT = bean.getDictTable();//瀛楀吀Table + String dicF = bean.getDictField();//瀛楀吀Code + String dicText = bean.getDictText();//瀛楀吀Text + if(StringUtil.isEmpty(dicT)&& StringUtil.isEmpty(dicF)){ + //濡傛灉杩欎袱涓瓧娈甸兘涓虹┖锛屽垯娌℃湁鏁版嵁瀛楀吀 + m.put(CgAutoListConstant.FIELD_DICTLIST, new ArrayList(0)); + return; + } + if(!bean.getShowType().equals("popup")){ + List dicDatas = queryDic(dicT, dicF,dicText); + m.put(CgAutoListConstant.FIELD_DICTLIST, dicDatas); + }else{ + m.put(CgAutoListConstant.FIELD_DICTLIST, new ArrayList(0)); + } + } + + private List queryDic(String dicTable, String dicCode,String dicText) { + return this.systemService.queryDict(dicTable, dicCode, dicText); + } + + /** + * 澶勭悊鏁版嵁瀛楀吀 + * @param result 鏌ヨ鐨勭粨鏋滈泦 + * @param beans 瀛楁閰嶇疆 + */ + @SuppressWarnings("unchecked") + private void dealDic(List> result, + List beans) { + for(CgFormFieldEntity bean:beans){ + String dicTable = bean.getDictTable();//瀛楀吀Table + String dicCode = bean.getDictField();//瀛楀吀Code + String dicText= bean.getDictText();//瀛楀吀text + if(StringUtil.isEmpty(dicTable)&& StringUtil.isEmpty(dicCode)){ + //涓嶉渶瑕佸鐞嗗瓧鍏 + continue; + }else{ + if(!bean.getShowType().equals("popup")){ + List dicDataList = queryDic(dicTable, dicCode,dicText); + for(Map r:result){ + String value = String.valueOf(r.get(bean.getFieldName())); + for(DictEntity dictEntity:dicDataList){ + if(value.equalsIgnoreCase(dictEntity.getTypecode())){ + r.put(bean.getFieldName(),MutiLangUtil.getMutiLangInstance().getLang(dictEntity.getTypename())); + } + } + } + } + } + } + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/generate/GenerateController.java b/src/main/java/org/jeecgframework/web/cgform/controller/generate/GenerateController.java new file mode 100644 index 00000000..a093d687 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/generate/GenerateController.java @@ -0,0 +1,436 @@ +package org.jeecgframework.web.cgform.controller.generate; + +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.jeecgframework.codegenerate.database.JeecgReadTable; +import org.jeecgframework.codegenerate.generate.CgformCodeGenerate; +import org.jeecgframework.codegenerate.generate.onetomany.CgformCodeGenerateOneToMany; +import org.jeecgframework.codegenerate.pojo.CreateFileProperty; +import org.jeecgframework.codegenerate.pojo.onetomany.CodeParamEntity; +import org.jeecgframework.codegenerate.pojo.onetomany.SubTableEntity; +import org.jeecgframework.codegenerate.util.CodeResourceUtil; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.web.cgform.entity.button.CgformButtonEntity; +import org.jeecgframework.web.cgform.entity.button.CgformButtonSqlEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.entity.enhance.CgformEnhanceJsEntity; +import org.jeecgframework.web.cgform.entity.generate.GenerateEntity; +import org.jeecgframework.web.cgform.entity.generate.GenerateSubListEntity; +import org.jeecgframework.web.cgform.service.button.CgformButtonServiceI; +import org.jeecgframework.web.cgform.service.button.CgformButtonSqlServiceI; +import org.jeecgframework.web.cgform.service.cgformftl.CgformFtlServiceI; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; +import org.jeecgframework.web.cgform.service.enhance.CgformEnhanceJsServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * + * @Title:CgGenerateController + * @description:鏅鸿兘琛ㄥ崟浠g爜鐢熸垚鍣╗鏍规嵁鏅鸿兘琛ㄥ崟閰嶇疆+浠g爜鐢熸垚璁剧疆->鐢熸垚浠g爜] + * @author 璧典繆澶 + * @date Sep 7, 2013 12:19:32 PM + * @version V1.0 + */ +@Controller +@RequestMapping("/generateController") +public class GenerateController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger + .getLogger(GenerateController.class); + @Autowired + private SystemService systemService; + @Autowired + private CgFormFieldServiceI cgFormFieldService; + @Autowired + private CgformButtonServiceI cgformButtonService; + @Autowired + private CgformButtonSqlServiceI cgformButtonSqlService; + @Autowired + private CgformEnhanceJsServiceI cgformEnhanceJsService; + @Autowired + private CgformFtlServiceI cgformFtlService; + /** + * 浠g爜鐢熸垚閰嶇疆椤甸潰 + * @param request + * @return + */ + @RequestMapping(params = "gogenerate") + public ModelAndView gogenerate( CgFormHeadEntity cgFormHead,HttpServletRequest request) { + if (StringUtil.isNotEmpty(cgFormHead.getId())) { + cgFormHead = cgFormFieldService.getEntity( + CgFormHeadEntity.class, cgFormHead.getId()); + }else{ + throw new RuntimeException("琛ㄥ崟閰嶇疆涓嶅瓨鍦"); + } + String returnModelAndView = null; + Map entityNameMap = new HashMap(0); + if(cgFormHead.getJformType()==1 || cgFormHead.getJformType()==3){ + //濡傛灉鏄崟琛ㄦ垨鑰呴檮琛紝鍒欒繘鍏ュ崟琛ㄦā鍨 + returnModelAndView = "jeecg/cgform/generate/single"; + }else{ + //濡傛灉鏄富琛紝鍒欒繘鍏ヤ竴瀵瑰妯″瀷 + List subTableList = new ArrayList(); + if(StringUtil.isNotEmpty(cgFormHead.getSubTableStr())){ + String[] subTables = cgFormHead.getSubTableStr().split(","); + for(String subTable :subTables){ + CgFormHeadEntity subHead = cgFormFieldService.getCgFormHeadByTableName(subTable); + subTableList.add(subHead); + entityNameMap.put(subHead.getTableName(), JeecgReadTable.formatFieldCapital(subHead.getTableName())); + } + } + request.setAttribute("subTableList", subTableList); + returnModelAndView = "jeecg/cgform/generate/one2many"; + } + String projectPath = CodeResourceUtil.getProject_path(); + try{ + Cookie[] cookies=request.getCookies(); + if(cookies!=null){ + for(int i=0;i鍔熻兘锛"+ftlDescription); + }else{ + j.setMsg("琛╗"+tableName+"] 鍦ㄦ暟鎹簱涓紝涓嶅瓨鍦"); + } + + } catch (Exception e1) { + e1.printStackTrace(); + j.setMsg(e1.getMessage()); + throw new RuntimeException(e1.getMessage()); + } + try { + String projectPath = URLEncoder.encode(generateEntity.getProjectPath(), "UTF-8"); + Cookie cookie = new Cookie("cookie_projectPath",projectPath ); + cookie.setMaxAge(60*60*24*30); //cookie 淇濆瓨30澶 + response.addCookie(cookie); + response.getWriter().print(j.getJsonStr()); + response.getWriter().flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** + * 棰勫鐞嗕竴浜 + * @param html + * @param cgFormHead + * @return + */ + private String hanlderForGenerate(String html, CgFormHeadEntity cgFormHead) { + html = replaceAddJSP(html); + html = html.replace("cgFormBuildController.do?saveOrUpdate", "{entityName?uncap_first}Controller.do?doAdd"); + html = html.replace("", ""); + html = html.replace("", ""); + return html; + } + /** + * 鏇挎崲#{} 涓${} + * @param cgformJspHtml + * @return + */ + private String replaceAddJSP(String cgformJspHtml) { + String key,realKey; + while (cgformJspHtml.indexOf("#{") > 0) { + key = cgformJspHtml.substring(cgformJspHtml.indexOf("#{"),cgformJspHtml.indexOf("}",cgformJspHtml.indexOf("#{"))+1); + realKey = key.substring(2, key.length() -1); + cgformJspHtml = cgformJspHtml.replace(key, ""); + } + return cgformJspHtml; + } + + + /** + * 浠g爜鐢熸垚鎵ц-涓瀵瑰 + * @param generateEntity + * @param request + * @return + */ + @RequestMapping(params = "dogenerateOne2Many") + @ResponseBody + public void dogenerateOne2Many(CodeParamEntity codeParamEntityIn,GenerateSubListEntity subTableListEntity,HttpServletRequest request,HttpServletResponse response){ + AjaxJson j = new AjaxJson(); + //step.1 璁剧疆涓昏〃 + //浠庡墠鍙拌幏鍙栵細codeParamEntityIn + //step.2 璁剧疆瀛愯〃闆嗗悎 + //浠庡墠鍙拌幏鍙栵細subTabParamIn,骞惰缃閿瓧娈 + try{ + //step.3 濉厖涓昏〃鐨勬墍鏈夋櫤鑳借〃鍗曢厤缃 + String mainTable = codeParamEntityIn.getTableName(); + //涓昏〃鐨勬櫤鑳借〃鍗曢厤缃 + GenerateEntity mainG = new GenerateEntity(); + mainG.setProjectPath(subTableListEntity.getProjectPath()); + mainG.setPackageStyle(subTableListEntity.getPackageStyle()); + CgFormHeadEntity mCgFormHead = cgFormFieldService.getCgFormHeadByTableName(mainTable); + getCgformConfig(mCgFormHead, mainG); + //step.4 濉厖瀛愯〃鐨勬墍鏈夋櫤鑳借〃鍗曢厤缃 + Map subsG = new HashMap(); + List subTabParamIn = subTableListEntity.getSubTabParamIn(); + for(SubTableEntity po:subTabParamIn){ + String sTableName = po.getTableName(); + CgFormHeadEntity cgSubHead = cgFormFieldService.getCgFormHeadByTableName(sTableName); + List colums = cgSubHead.getColumns(); + String[] foreignKeys =getForeignkeys(colums); + po.setForeignKeys(foreignKeys); + GenerateEntity subG = new GenerateEntity(); + getCgformConfig(cgSubHead, subG); + subG.setEntityName(po.getEntityName()); + subG.setEntityPackage(po.getEntityPackage()); + subG.setFieldRowNum(1); + subG.setFtlDescription(po.getFtlDescription()); + subG.setForeignKeys(foreignKeys); + subG.setTableName(po.getTableName()); + subG.setProjectPath(subTableListEntity.getProjectPath()); + subG.setPackageStyle(subTableListEntity.getPackageStyle()); + subsG.put(sTableName, subG); + } + codeParamEntityIn.setSubTabParam(subTabParamIn); + //step.5 涓瀵瑰(鐖跺瓙琛)鏁版嵁妯″瀷,浠g爜鐢熸垚 + CgformCodeGenerateOneToMany.oneToManyCreate(subTabParamIn, codeParamEntityIn,mainG,subsG); + j.setMsg("鎴愬姛鐢熸垚澧炲垹鏀规煡->鍔熻兘锛"+codeParamEntityIn.getFtlDescription()); + }catch (Exception e) { + e.printStackTrace(); + j.setMsg(e.getMessage()); + throw new RuntimeException(e.getMessage()); + } + try { + String projectPath = URLEncoder.encode(subTableListEntity.getProjectPath(), "UTF-8"); + Cookie cookie = new Cookie("cookie_projectPath",projectPath ); + cookie.setMaxAge(60*60*24*30); //cookie 淇濆瓨30澶 + response.addCookie(cookie); + response.getWriter().print(j.getJsonStr()); + response.getWriter().flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** + * 鑾峰彇鏅鸿兘琛ㄥ崟涓閿細鏍规嵁鏄惁璁剧疆浜嗕富琛ㄤ互鍙婁富琛ㄥ瓧娈垫潵鍒ゆ柇 + * @param colums + * @return + */ + private String[] getForeignkeys(List colums) { + List fs = new ArrayList(0); + for(CgFormFieldEntity c : colums){ + if(StringUtil.isNotEmpty(c.getMainTable()) && StringUtil.isNotEmpty(c.getMainField())){ + fs.add(c.getFieldName().toUpperCase()); + } + } + String[] foreignkeys = (String[]) fs.toArray(new String[fs.size()]); + return foreignkeys; + } + /** + * 鑾峰彇鏅鸿兘琛ㄥ崟鐨勬墍鏈夐厤缃 + * @param cgFormHead + * @param generateEntity + * @throws Exception + */ + private void getCgformConfig(CgFormHeadEntity cgFormHead, + GenerateEntity generateEntity) throws Exception { + int filedNums = cgFormHead.getColumns().size(); + List buttons = null; + Map buttonSqlMap = new LinkedHashMap(); + //琛ㄥ崟閰嶇疆 + cgFormHead = cgFormFieldService.getEntity( + CgFormHeadEntity.class, cgFormHead.getId()); + //鎸夐挳閰嶇疆 + buttons = cgformButtonService.getCgformButtonListByFormId(cgFormHead.getId()); + //鎸夐挳SQL澧炲己 + for(CgformButtonEntity cb:buttons){ + CgformButtonSqlEntity cbs = cgformButtonSqlService.getCgformButtonSqlByCodeFormId(cb.getButtonCode(), cgFormHead.getId()); + buttonSqlMap.put(cb.getButtonCode(), cbs==null?new String[]{}:cbs.getCgbSqlStr().replaceAll("(\r\n|\r|\n|\n\r)", "").split(";")); + } + CgformButtonSqlEntity cbsAdd = cgformButtonSqlService.getCgformButtonSqlByCodeFormId("add", cgFormHead.getId()); + buttonSqlMap.put("add", cbsAdd==null?new String[]{}:cbsAdd.getCgbSqlStr().replaceAll("(\r\n|\r|\n|\n\r)", "").split(";")); + CgformButtonSqlEntity cbsUpdate = cgformButtonSqlService.getCgformButtonSqlByCodeFormId("update", cgFormHead.getId()); + buttonSqlMap.put("update", cbsUpdate==null?new String[]{}:cbsUpdate.getCgbSqlStr().replaceAll("(\r\n|\r|\n|\n\r)", "").split(";")); + CgformButtonSqlEntity cbsDelete = cgformButtonSqlService.getCgformButtonSqlByCodeFormId("delete", cgFormHead.getId()); + buttonSqlMap.put("delete", cbsDelete==null?new String[]{}:cbsDelete.getCgbSqlStr().replaceAll("(\r\n|\r|\n|\n\r)", "").split(";")); + //JS澧炲己-鍒楄〃 + CgformEnhanceJsEntity listJs = cgformEnhanceJsService.getCgformEnhanceJsByTypeFormId("list", cgFormHead.getId()); + CgformEnhanceJsEntity listJsCopy = null; + try{ + listJsCopy = listJs.deepCopy(); + }catch (Exception e) { + logger.debug(e.getMessage()); + } + //JS澧炲己-琛ㄥ崟 + CgformEnhanceJsEntity formJs = cgformEnhanceJsService.getCgformEnhanceJsByTypeFormId("form", cgFormHead.getId()); + CgformEnhanceJsEntity formJsCopy = null; + try{ + formJsCopy = formJs.deepCopy(); + }catch (Exception e) { + logger.debug(e.getMessage()); + } + //灏唈s涓甫鏈塷nline瀛楁鍚嶇殑 杞崲鎴恓ava鍛藉悕 + for(CgFormFieldEntity field : cgFormHead.getColumns()){ + String fieldName = field.getFieldName(); + if(listJsCopy!=null){ + listJsCopy.setCgJsStr(listJsCopy.getCgJsStr().replace(fieldName, JeecgReadTable.formatField(fieldName))); + } + if(formJsCopy!=null){ + formJsCopy.setCgJsStr(formJsCopy.getCgJsStr().replace(fieldName, JeecgReadTable.formatField(fieldName))); + } + } + generateEntity.setButtons(buttons); + generateEntity.setButtonSqlMap(buttonSqlMap); + generateEntity.setCgFormHead(cgFormHead); + generateEntity.setListJs(listJsCopy); + generateEntity.setFormJs(formJsCopy); + } + /** + * 璺宠浆鍒版枃浠跺す鐩綍鏍 + * @param request + * @return + */ + @RequestMapping(params = "goFileTree") + public ModelAndView goFileTree(HttpServletRequest request) { + return new ModelAndView("jeecg/cgform/generate/fileTree"); + } + /** + * 杩斿洖瀛愮洰褰昷son + * @param parentNode + * @return + */ + @RequestMapping(params = "doExpandFileTree") + @ResponseBody + public Object doExpandFileTree(String parentNode){ + JSONArray fjson = new JSONArray(); + try{ + if(StringUtil.isEmpty(parentNode)){ + //杩斿洖纾佺洏椹卞姩鍣ㄦ牴鐩綍 + File[] roots = File.listRoots(); + for(File r:roots){ + JSONObject item = new JSONObject(); + item.put("id", r.getAbsolutePath()); + item.put("text", r.getPath()); + item.put("iconCls", "icon-folder"); + if(hasDirs(r)){ + item.put("state", "closed"); + }else{ + item.put("state", "open"); + } + fjson.add(item); + } + }else{ + try { + parentNode = new String(parentNode.getBytes("ISO-8859-1"), "UTF-8"); + } catch (UnsupportedEncodingException e1) { + e1.printStackTrace(); + } + //杩斿洖瀛愮洰褰曢泦 + File parent = new File(parentNode); + File[] chs = parent.listFiles(); + for(File r:chs){ + JSONObject item = new JSONObject(); + if(r.isDirectory()){ + item.put("id", r.getAbsolutePath()); + item.put("text", r.getPath()); + if(hasDirs(r)){ + item.put("state", "closed"); + }else{ + item.put("state", "open"); + } + fjson.add(item); + }else{ + + } + } + } + }catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("璇ユ枃浠跺す涓嶅彲閫夋嫨"); + } + return fjson; + } + private boolean hasDirs(File dir){ + try{ + if(dir.listFiles().length==0){ + // item.put("state", "open"); + return false; + }else{ + // item.put("state", "closed"); + return true; + } + }catch (Exception e) { + logger.info(e.getMessage()); + return false; + } + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/trans/CgformTransController.java b/src/main/java/org/jeecgframework/web/cgform/controller/trans/CgformTransController.java new file mode 100644 index 00000000..a373e973 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/trans/CgformTransController.java @@ -0,0 +1,248 @@ +package org.jeecgframework.web.cgform.controller.trans; + +import java.io.IOException; +import java.io.PrintWriter; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.jeecgframework.codegenerate.database.JeecgReadTable; +import org.jeecgframework.codegenerate.pojo.Columnt; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.vo.datatable.SortDirection; +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.entity.consts.DataBaseConst; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +/** + * 鑷畾涔夎〃鍗曢嗗悜鐢熸垚 + * + * @author Alexander + * @date 20130927 + */ +@Controller +@RequestMapping("/cgformTransController") +public class CgformTransController { + + @Autowired + private CgFormFieldServiceI cgFormFieldService; + + /** + * 鑷姩鐢熸垚琛ㄥ睘鎬у垪琛 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "trans") + public ModelAndView trans(HttpServletRequest request) { + return new ModelAndView("jeecg/cgform/trans/transList"); + } + + @RequestMapping(params = "datagrid") + public void datagrid(HttpServletRequest request, + HttpServletResponse response, DataGrid dataGrid) { + String tableName = request.getParameter("id"); + + List list = new ArrayList(); + try { + list = new JeecgReadTable().readAllTableNames(); + } catch (SQLException e1) { + e1.printStackTrace(); + } + String html = ""; + Collections.sort(list,new StringSort(dataGrid.getOrder())); + List tables = cgFormFieldService.findByQueryString("select tableName from CgFormHeadEntity"); + list.removeAll(tables); + List index = new ArrayList(); + if (StringUtil.isNotEmpty(tableName)) { + for (int i = 0; i < list.size(); i++) { + if (list.get(i).contains(tableName)) + index.add(list.get(i)); + } + html = getJson(index, index.size()); + } else + html = getJson(list, list.size()); + try { + response.setContentType("text/html"); + response.setHeader("Cache-Control", "no-store"); + PrintWriter writer = response.getWriter(); + writer.println(html); + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @RequestMapping(params = "transEditor") + @ResponseBody + public AjaxJson transEditor(HttpServletRequest request, String id) + throws Exception { + AjaxJson j = new AjaxJson(); + String ids[] = id.split(","); + String no = ""; + String yes = ""; + for (int i = 0; i < ids.length; i++) { + if (StringUtil.isNotEmpty(ids[i])) { + List cffList = cgFormFieldService + .findByProperty(CgFormHeadEntity.class, "tableName", + ids[i]); + if (cffList.size() > 0) { + if (no != "") + no += ","; + no += ids[i]; + continue; + } + List list = new JeecgReadTable() + .readOriginalTableColumn(ids[i]); + CgFormHeadEntity cgFormHead = new CgFormHeadEntity(); + cgFormHead.setJformType(1); + cgFormHead.setIsCheckbox("Y"); + cgFormHead.setIsDbSynch("Y"); + cgFormHead.setIsTree("N"); + cgFormHead.setQuerymode("group"); + cgFormHead.setTableName(ids[i].toLowerCase()); + cgFormHead.setIsPagination("Y"); + cgFormHead.setContent(ids[i]); + cgFormHead.setJformVersion("1"); + List columnsList = new ArrayList(); + for (int k = 0; k < list.size(); k++) { + Columnt columnt = list.get(k); + String fieldName = columnt.getFieldDbName(); + CgFormFieldEntity cgFormField = new CgFormFieldEntity(); + cgFormField.setFieldName(columnt.getFieldDbName() + .toLowerCase()); + if (StringUtil.isNotEmpty(columnt.getFiledComment())) + cgFormField.setContent(columnt.getFiledComment()); + else + cgFormField.setContent(columnt.getFieldName()); + cgFormField.setIsKey("N"); + cgFormField.setIsShow("Y"); + cgFormField.setIsShowList("Y"); + cgFormField.setOrderNum(k + 2); + cgFormField.setQueryMode("group"); + cgFormField.setLength(0); + cgFormField.setFieldLength(120); + cgFormField.setPointLength(0); + cgFormField.setShowType("text"); + cgFormField.setIsNull(columnt.getNullable()); + if("id".equalsIgnoreCase(fieldName)){ + String[] pkTypeArr = {"java.lang.Integer","java.lang.Long"}; + String idFiledType = columnt.getFieldType(); + if(Arrays.asList(pkTypeArr).contains(idFiledType)){ + //濡傛灉涓婚敭鏄暟瀛楃被鍨,鍒欒缃负鑷闀 + cgFormHead.setJformPkType("NATIVE"); + }else{ + //鍚﹀垯璁剧疆涓篣UID + cgFormHead.setJformPkType("UUID"); + } + cgFormField.setIsKey("Y"); + cgFormField.setIsShow("N"); + cgFormField.setIsShowList("N"); + } + if ("java.lang.Integer".equalsIgnoreCase(columnt.getFieldType())){ + cgFormField.setType(DataBaseConst.INT); + }else if ("java.lang.Long".equalsIgnoreCase(columnt.getFieldType())) { + cgFormField.setType(DataBaseConst.INT); + } else if ("java.util.Date".equalsIgnoreCase(columnt.getFieldType())) { + cgFormField.setType(DataBaseConst.DATE); + cgFormField.setShowType("date"); + } else if ("java.lang.Double".equalsIgnoreCase(columnt.getFieldType()) + ||"java.lang.Float".equalsIgnoreCase(columnt.getFieldType())) { + cgFormField.setType(DataBaseConst.DOUBLE); + } else if ("java.math.BigDecimal".equalsIgnoreCase(columnt.getFieldType())) { + cgFormField.setType(DataBaseConst.BIGDECIMAL); + } else if (columnt.getFieldType().contains("blob")) { + cgFormField.setType(DataBaseConst.BLOB); + columnt.setCharmaxLength(null); + } else { + cgFormField.setType(DataBaseConst.STRING); + } + if (StringUtil.isNotEmpty(columnt.getCharmaxLength())) { + if (Long.valueOf(columnt.getCharmaxLength()) >= 3000) { + cgFormField.setType(DataBaseConst.TEXT); + cgFormField.setShowType(DataBaseConst.TEXTAREA); + try{//鏈夊彲鑳介暱搴﹁秴鍑篿nt鐨勯暱搴 + cgFormField.setLength(Integer.valueOf(columnt.getCharmaxLength())); + }catch(Exception e){} + } else { + cgFormField.setLength(Integer.valueOf(columnt + .getCharmaxLength())); + } + } else { + if (StringUtil.isNotEmpty(columnt.getPrecision())) { + cgFormField.setLength(Integer.valueOf(columnt + .getPrecision())); + } + else{ + if(cgFormField.getType().equals(DataBaseConst.INT)){ + cgFormField.setLength(10); + } + } + if (StringUtil.isNotEmpty(columnt.getScale())) + cgFormField.setPointLength(Integer.valueOf(columnt + .getScale())); + + } + columnsList.add(cgFormField); + } + cgFormHead.setColumns(columnsList); + cgFormFieldService.saveTable(cgFormHead, ""); + if (yes != "") + yes += ","; + yes += ids[i]; + } + } + Map map = new HashMap(); + map.put("no", no); + map.put("yes", yes); + j.setObj(map); + return j; + } + + public static String getJson(List result, Integer size) { + JSONObject main = new JSONObject(); + JSONArray rows = new JSONArray(); + main.put("total", size); + for (String m : result) { + JSONObject item = new JSONObject(); + item.put("id", m); + rows.add(item); + } + main.put("rows", rows); + return main.toString(); + } + private class StringSort implements Comparator{ + + private SortDirection sortOrder; + + public StringSort(SortDirection sortDirection){ + this.sortOrder = sortDirection; + } + + + public int compare(String prev, String next) { + return sortOrder.equals(SortDirection.asc)? + prev.compareTo(next):next.compareTo(prev); + } + + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/controller/upload/CgUploadController.java b/src/main/java/org/jeecgframework/web/cgform/controller/upload/CgUploadController.java new file mode 100644 index 00000000..b6ac474b --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/controller/upload/CgUploadController.java @@ -0,0 +1,116 @@ +package org.jeecgframework.web.cgform.controller.upload; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.cgform.entity.upload.CgUploadEntity; +import org.jeecgframework.web.cgform.service.upload.CgUploadServiceI; +import org.jeecgframework.web.system.pojo.base.TSAttachment; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.model.common.UploadFile; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * + * @Title:CgUploadController + * @description:鏅鸿兘琛ㄥ崟鏂囦欢涓婁紶鎺у埗鍣 + * @author 璧典繆澶 + * @date Jul 24, 2013 9:10:44 PM + * @version V1.0 + */ +@Scope("prototype") +@Controller +@RequestMapping("/cgUploadController") +public class CgUploadController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger + .getLogger(CgUploadController.class); + @Autowired + private SystemService systemService; + @Autowired + private CgUploadServiceI cgUploadService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + /** + * 淇濆瓨鏂囦欢 + * @param request + * @param response + * @param cgUploadEntity 鏅鸿兘琛ㄥ崟鏂囦欢涓婁紶瀹炰綋 + * @return + */ + @RequestMapping(params = "saveFiles", method = RequestMethod.POST) + @ResponseBody + public AjaxJson saveFiles(HttpServletRequest request, HttpServletResponse response, CgUploadEntity cgUploadEntity) { + AjaxJson j = new AjaxJson(); + Map attributes = new HashMap(); + String fileKey = oConvertUtils.getString(request.getParameter("fileKey"));// 鏂囦欢ID + String id = oConvertUtils.getString(request.getParameter("cgFormId"));//鍔ㄦ佽〃涓婚敭ID + String tableName = oConvertUtils.getString(request.getParameter("cgFormName"));//鍔ㄦ佽〃鍚 + String cgField = oConvertUtils.getString(request.getParameter("cgFormField"));//鍔ㄦ佽〃涓婁紶鎺т欢瀛楁 + if(!StringUtil.isEmpty(id)){ + cgUploadEntity.setCgformId(id); + cgUploadEntity.setCgformName(tableName); + cgUploadEntity.setCgformField(cgField); + } + if (StringUtil.isNotEmpty(fileKey)) { + cgUploadEntity.setId(fileKey); + cgUploadEntity = systemService.getEntity(CgUploadEntity.class, fileKey); + } + UploadFile uploadFile = new UploadFile(request, cgUploadEntity); + uploadFile.setCusPath("files"); + uploadFile.setSwfpath("swfpath"); + uploadFile.setByteField(null);//涓嶅瓨浜岃繘鍒跺唴瀹 + cgUploadEntity = systemService.uploadFile(uploadFile); + cgUploadService.writeBack(id, tableName, cgField, fileKey, cgUploadEntity.getRealpath()); + attributes.put("fileKey", cgUploadEntity.getId()); + attributes.put("viewhref", "commonController.do?objfileList&fileKey=" + cgUploadEntity.getId()); + attributes.put("delurl", "commonController.do?delObjFile&fileKey=" + cgUploadEntity.getId()); + j.setMsg("鎿嶄綔鎴愬姛"); + j.setAttributes(attributes); + return j; + } + + /** + * 鍒犻櫎鏂囦欢 + * @param request + * @return + */ + @RequestMapping(params = "delFile") + @ResponseBody + public AjaxJson delFile( HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + String id = request.getParameter("id"); + CgUploadEntity file = systemService.getEntity(CgUploadEntity.class, id); + message = "" + file.getAttachmenttitle() + "琚垹闄ゆ垚鍔"; + cgUploadService.deleteFile(file); + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + j.setSuccess(true); + j.setMsg(message); + return j; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/dao/config/CgFormFieldDao.java b/src/main/java/org/jeecgframework/web/cgform/dao/config/CgFormFieldDao.java new file mode 100644 index 00000000..7608b127 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/dao/config/CgFormFieldDao.java @@ -0,0 +1,27 @@ +package org.jeecgframework.web.cgform.dao.config; + +import java.util.List; +import java.util.Map; + +import org.jeecgframework.minidao.annotation.Arguments; +import org.jeecgframework.minidao.annotation.MiniDao; +import org.springframework.stereotype.Repository; + +/** + * + * @Title:CgFormFieldDao + * @description: + * @author 寮犱唬娴 + * @date Aug 24, 2013 11:33:33 AM + * @version V1.0 + */ +@Repository("cgFormFieldDao") +public interface CgFormFieldDao { + + @Arguments("tableName") + public List> getCgFormFieldByTableName(String tableName); + + @Arguments("tableName") + public List> getCgFormHiddenFieldByTableName(String tableName); + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/dao/config/CgFormVersionDao.java b/src/main/java/org/jeecgframework/web/cgform/dao/config/CgFormVersionDao.java new file mode 100644 index 00000000..b7ecf805 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/dao/config/CgFormVersionDao.java @@ -0,0 +1,28 @@ +package org.jeecgframework.web.cgform.dao.config; + +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; + +import org.jeecgframework.minidao.annotation.Arguments; +import org.jeecgframework.minidao.annotation.MiniDao; +import org.springframework.stereotype.Repository; + +/** + * + * @Title:CgFormFieldDao + * @description: + * @author 璧典繆澶 + * @date Aug 24, 2013 11:33:33 AM + * @version V1.0 + */ +@Repository("cgFormVersionDao") +public interface CgFormVersionDao { + @Arguments("tableName") + public String getCgFormVersionByTableName(String tableName); + @Arguments("id") + public String getCgFormVersionById(String id); + @Arguments({"newVersion","formId"}) + public void updateVersion(String newVersion,String formId); + + @Arguments({"id"}) + public CgFormHeadEntity getCgFormById(String id); +} diff --git a/src/main/java/org/jeecgframework/web/cgform/dao/upload/CgFormUploadDao.java b/src/main/java/org/jeecgframework/web/cgform/dao/upload/CgFormUploadDao.java new file mode 100644 index 00000000..7dd09036 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/dao/upload/CgFormUploadDao.java @@ -0,0 +1,29 @@ +package org.jeecgframework.web.cgform.dao.upload; + +import org.jeecgframework.minidao.annotation.Arguments; +import org.jeecgframework.minidao.annotation.MiniDao; +import org.springframework.stereotype.Repository; + +/** + * + * @Title:CgFormUploadDao + * @description:鏅鸿兘琛ㄥ崟鏂囦欢涓婁紶 + * @author 璧典繆澶 + * @date Aug 27, 2013 8:42:55 PM + * @version V1.0 + */ + +@Repository("cgFormUploadDao") +public interface CgFormUploadDao { + /** + * 灏嗘枃浠朵笂浼犵殑淇℃伅鍥炲~鍒颁笟鍔¤〃涓 + * @param cgFormId 鍔ㄦ佽〃涓婚敭ID + * @param cgFormName 鍔ㄦ佽〃鍚 + * @param cgFormField 鍔ㄦ佽〃涓婁紶鎺т欢瀛楁 + * @param fileId 鏂囦欢ID + * @param fileUrl 鏂囦欢璺緞 + * @return + */ + @Arguments({"cgFormId","cgFormName","cgFormField","fileId","fileUrl"}) + public void updateBackFileInfo(String cgFormId,String cgFormName,String cgFormField,String fileId,String fileUrl); +} diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/DBTempletLoader.java b/src/main/java/org/jeecgframework/web/cgform/engine/DBTempletLoader.java new file mode 100644 index 00000000..a081b735 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/DBTempletLoader.java @@ -0,0 +1,210 @@ +package org.jeecgframework.web.cgform.engine; + +import freemarker.cache.TemplateLoader; +import org.jeecgframework.web.cgform.common.CgAutoListConstant; +import org.jeecgframework.web.cgform.common.FormHtmlUtil; +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.service.cgformftl.CgformFtlServiceI; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.stereotype.Component; + +import java.io.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @ClassName: DBTempletLoader + * @Description: (妯℃澘鍔犺浇澶勭悊绫) + * @author zhoujunfeng + */ +@Component("templetLoader") +public class DBTempletLoader implements TemplateLoader { + + public static final String TEMPLET = "org/jeecgframework/web/cgform/engine/jform.ftl"; + public static final String TEMPLET_ONE_MANY = "org/jeecgframework/web/cgform/engine/jformunion.ftl"; + //鐢熸垚杈撳叆妗嗗尮閰嶅唴瀹 + private final static String regEx_attr = "\\#\\{([a-zA-Z_0-9]+)\\}"; + + @Autowired + private CgformFtlServiceI cgformFtlService; + + @Autowired + private CgFormFieldServiceI cgFormFieldService; + + + public Object findTemplateSource(String name) throws IOException { + //update by Robin postgreSQL 淇澶у皬鍐欑殑闂 2013-03-13 + name = name.replace("_zh_cn", "").replace("_ZH_CN", "").replace("_zh_CN", ""); + name = name.replace("_en_us", "").replace("_EN_US", "").replace("_en_US", ""); + //update by Robin postgreSQL 淇澶у皬鍐欑殑闂 2013-03-13 + org.jeecgframework.core.util.LogUtil.info("table name----------->"+name); + Object obj = getObject(name); + return obj; + } + + + public long getLastModified(Object templateSource) { + return 0; + } + + + public Reader getReader(Object templateSource, String encoding) throws IOException { + Reader br = new StringReader(""); + if (templateSource instanceof InputStreamReader) { + br = new BufferedReader((InputStreamReader)templateSource); + } else { + StringBuilder str = (StringBuilder)templateSource; + br = new StringReader(str.toString()); + } + return br; + } + + private Object getObject(String name) throws IOException { + + String ftlVersion = ""; + String ftlVersionParam = "&ftlVersion="; + if(name.contains(ftlVersionParam)) { + ftlVersion = name.substring(name.indexOf(ftlVersionParam) + ftlVersionParam.length()); + name = name.substring(0, name.indexOf(ftlVersionParam)); + } + + PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver(); + if(name.lastIndexOf(".ftl")==-1){//鍒ゆ柇鏄惁涓篿nclude鐨勬ā鏉 + //濡傛灉鏄富琛ㄧ洿鎺ヨ蛋涓瀵瑰妯℃澘 + CgFormHeadEntity head = cgFormFieldService.getCgFormHeadByTableName(name); + if(head==null)return null; + if(head.getJformType()==CgAutoListConstant.JFORM_TYPE_MAIN_TALBE){ + Resource[] resources = patternResolver.getResources(TEMPLET_ONE_MANY); + InputStreamReader inputStreamReader =null; + if (resources != null && resources.length > 0) { + inputStreamReader = new InputStreamReader(resources[0].getInputStream(),"UTF-8"); + } + return inputStreamReader; + } + //1銆佹牴鎹畉able name 鏌ヨcgformftl 鏈夊垯鑾峰彇妯℃澘鍐呭 + //2銆佹病鏈塩gformftl 鍒欐煡璇gformfield 鏍规嵁cgformfield鐢熸垚妯℃澘 + + Map cgformFtlEntity = new HashMap(); + if (ftlVersion != null && ftlVersion.length() > 0) { + cgformFtlEntity = cgformFtlService.getCgformFtlByTableName(name, ftlVersion); + } else { + cgformFtlEntity = cgformFtlService.getCgformFtlByTableName(name); + } + + if(cgformFtlEntity!=null){ + String content = (String) (cgformFtlEntity.get("ftl_content")==null?"":cgformFtlEntity.get("ftl_content")); + content = initFormHtml( content, name); + org.jeecgframework.core.util.LogUtil.info(content); + return new StringBuilder(content); + }else{ + Resource[] resources = patternResolver.getResources(TEMPLET); + InputStreamReader inputStreamReader =null; + if (resources != null && resources.length > 0) { + inputStreamReader = new InputStreamReader(resources[0].getInputStream(),"UTF-8"); + } + return inputStreamReader; + } + }else{ + Resource[] resources = patternResolver.getResources(name); + InputStreamReader inputStreamReader =null; + if (resources != null && resources.length > 0) { + inputStreamReader = new InputStreamReader(resources[0].getInputStream(),"UTF-8"); + } + return inputStreamReader; + } + } + + + public void closeTemplateSource(Object templateSource) throws IOException { + + } + + /** + * 鑾峰彇jform.ftl鐨勮矾寰 + */ +// private String getFilePath(String fileName){ +// String path = DBTempletLoader.class.getResource("").toString(); +// if (path != null) +// { +// String systemType = System.getProperty("os.name"); +// if(systemType.toLowerCase().indexOf("window")!=-1){ +// path = path.substring(6, path.indexOf("WEB-INF") + 8)+"classes/jeecg/cgform/engine/";//window +// }else{ +// path = path.substring(5, path.indexOf("WEB-INF") + 8)+"classes/jeecg/cgform/engine/";//linux +// } +// try { +// path = java.net.URLDecoder.decode(path,"UTF-8"); +// } catch (UnsupportedEncodingException e) { +// e.printStackTrace(); +// } +// org.jeecgframework.core.util.LogUtil.info("current path :" + path); +// } +// return (path + fileName); +// } + + + private String initFormHtml(String htmlStr,String tableName){ + Pattern pattern; + Matcher matcher; + try { + //鏍规嵁formid鑾峰彇鎵鏈夌殑CgFormFieldEntity + Map fieldMap = cgFormFieldService.getAllCgFormFieldByTableName(tableName); + //鏍规嵁formid鑾峰彇鎵鏈夌殑CgFormFieldEntity + List hiddenFielList = cgFormFieldService.getHiddenCgFormFieldByTableName(tableName); + + //娣诲姞input璇彞 + pattern = Pattern.compile(regEx_attr,Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(htmlStr); + + StringBuffer sb = new StringBuffer(); + String thStr = ""; + String inputStr = ""; + + boolean result = matcher.find(); + while(result) { + thStr = matcher.group(1); + inputStr = ""; + if("jform_hidden_field".equals(thStr)){ + inputStr = getHiddenForm(hiddenFielList); + }else{ + if(fieldMap.get(thStr)!=null){ + CgFormFieldEntity cgFormFieldEntity = fieldMap.get(thStr); + if("Y".equals(cgFormFieldEntity.getIsShow())){ + inputStr = FormHtmlUtil.getFormHTML(cgFormFieldEntity); + inputStr +=" "; + } + } + } + matcher.appendReplacement(sb, inputStr); + result = matcher.find(); + } + matcher.appendTail(sb); + htmlStr = sb.toString(); + } catch (Exception e) { + e.printStackTrace(); + } + return htmlStr; + } + + private String getHiddenForm(List hiddenFielList){ + StringBuffer html = new StringBuffer(""); + if(hiddenFielList!=null&&hiddenFielList.size()>0){ + for(CgFormFieldEntity cgFormFieldEntity:hiddenFielList){ + html.append("\r\n"); + } + } + return html.toString(); + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/FreemarkerHelper.java b/src/main/java/org/jeecgframework/web/cgform/engine/FreemarkerHelper.java new file mode 100644 index 00000000..abb20dc6 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/FreemarkerHelper.java @@ -0,0 +1,46 @@ +package org.jeecgframework.web.cgform.engine; + +import java.io.StringWriter; +import java.util.Map; + +import freemarker.template.Configuration; +import freemarker.template.Template; +/** + * + * @Title:FreemarkerHelper + * @description:Freemarker寮曟搸鍗忓姪绫 + * @author 璧典繆澶 + * @date Jul 5, 2013 2:58:29 PM + * @version V1.0 + */ +public class FreemarkerHelper { + private static Configuration _tplConfig = new Configuration(); + static{ + _tplConfig.setClassForTemplateLoading(FreemarkerHelper.class, "/"); + } + + /** + * 瑙f瀽ftl + * @param tplName 妯℃澘鍚 + * @param encoding 缂栫爜 + * @param paras 鍙傛暟 + * @return + */ + public String parseTemplate(String tplName, String encoding, + Map paras) { + try { + StringWriter swriter = new StringWriter(); + Template mytpl = null; + mytpl = _tplConfig.getTemplate(tplName, encoding); + mytpl.process(paras, swriter); + return swriter.toString(); + } catch (Exception e) { + e.printStackTrace(); + return e.toString(); + } + + } + public String parseTemplate(String tplName, Map paras) { + return this.parseTemplate(tplName, "utf-8", paras); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/TempletContext.java b/src/main/java/org/jeecgframework/web/cgform/engine/TempletContext.java new file mode 100644 index 00000000..a22d0bd9 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/TempletContext.java @@ -0,0 +1,130 @@ +package org.jeecgframework.web.cgform.engine; + +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateDirectiveModel; +import net.sf.ehcache.Cache; +import net.sf.ehcache.CacheManager; +import net.sf.ehcache.Element; +import org.jeecgframework.core.util.PropertiesUtil; +import org.jeecgframework.web.cgform.common.CgAutoListConstant; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.io.IOException; +import java.util.Locale; +import java.util.Map; + +@Component("templetContext") +public class TempletContext { + + @Resource(name = "freemarker") + private Configuration freemarker; + + @Autowired + private CgFormFieldServiceI cgFormFieldService; + + private Map tags; + + private static final String ENCODING = "UTF-8"; + + private static Cache ehCache;//ehcache + /** + * 绯荤粺妯″紡锛 + * PUB-鐢熶骇锛堜娇鐢╡hcache锛 + * DEV-寮鍙 + */ + private static String _sysMode = null; + static{ + PropertiesUtil util = new PropertiesUtil("sysConfig.properties"); + _sysMode = util.readProperty(CgAutoListConstant.SYS_MODE_KEY); + if(CgAutoListConstant.SYS_MODE_PUB.equalsIgnoreCase(_sysMode)){ + ehCache = CacheManager.getInstance().getCache("dictCache");//姘镐箙缂撳瓨鍧 + } + } + + @PostConstruct + public void init() { + if (tags == null) + return; + for (String key : tags.keySet()) { + freemarker.setSharedVariable(key, tags.get(key)); + } + } + + public Locale getLocale() { + return freemarker.getLocale(); + } + + public Template getTemplate(String tableName, String ftlVersion) { + Template template = null; + if (tableName == null) { + return null; + } + if (ftlVersion != null && ftlVersion.length() > 0) { + tableName = tableName + "&ftlVersion=" + ftlVersion; + } + try { + if(CgAutoListConstant.SYS_MODE_DEV.equalsIgnoreCase(_sysMode)){//寮鍙戞ā寮 + template = freemarker.getTemplate(tableName,freemarker.getLocale(), ENCODING); + }else if(CgAutoListConstant.SYS_MODE_PUB.equalsIgnoreCase(_sysMode)){//鐢熶骇妯″紡锛堢紦瀛橈級 + //鑾峰彇鐗堟湰鍙 + String version = cgFormFieldService.getCgFormVersionByTableName(tableName); + template = getTemplateFromCache(tableName, ENCODING,version); + }else{ + throw new RuntimeException("sysConfig.properties鐨刦reeMarkerMode閰嶇疆閿欒锛(PUB:鐢熶骇妯″紡锛孌EV:寮鍙戞ā寮)"); + } + return template; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + + } + + /** + * 浠庣紦瀛樹腑璇诲彇ftl妯℃澘 + * @param template + * @param encoding + * @return + */ + public Template getTemplateFromCache(String tableName,String encoding,String version){ + Template template = null; + try { + //cache鐨勯敭锛氱被鍚.鏂规硶鍚.鍙傛暟鍚 + String cacheKey = FreemarkerHelper.class.getName()+".getTemplateFormCache."+tableName+"."+version; + Element element = ehCache.get(cacheKey); + if(element==null){ + template = freemarker.getTemplate(tableName,freemarker.getLocale(), ENCODING); + element = new Element(cacheKey, template); + ehCache.put(element); + }else{ + template = (Template)element.getObjectValue(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return template; + } + + public Configuration getFreemarker() { + return freemarker; + } + + public void setFreemarker(Configuration freemarker) { + this.freemarker = freemarker; + } + + public Map getTags() { + return tags; + } + + public void setTags(Map tags) { + this.tags = tags; + } + + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/autolist/autolist.ftl b/src/main/java/org/jeecgframework/web/cgform/engine/autolist/autolist.ftl new file mode 100644 index 00000000..b3a88e03 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/autolist/autolist.ftl @@ -0,0 +1,406 @@ +${config_iframe} + +
    +
    +
    +<#if config_querymode == "group"> + <#list config_queryList as x> + <#if x['field_isQuery']=="Y"> + + ${x['field_title']}锛 + + <#if x['field_queryMode']=="group"> + <#if x['field_isQuery']=="Y"> + class="Wdate" onclick="WdatePicker({dateFmt:'yyyy-MM-dd'});" value="${x['field_value_begin']}" /> + ~ + class="Wdate" onclick="WdatePicker({dateFmt:'yyyy-MM-dd'});" value="${x['field_value_end']}"/> + <#else> + + + + + <#if x['field_queryMode']=="single"> + <#if x['field_isQuery']=="Y"> + <#if (x['field_dictlist']?size >0)> + + + <#if (x['field_dictlist']?size <= 0)> + <#if x['field_showType']!='popup'> + class="Wdate" onclick="WdatePicker({dateFmt:'yyyy-MM-dd'});" value="${x['field_value']?if_exists?default('')}" /> + <#else> + + + + <#else> + + + + + + +
    +
    + + + 褰曞叆 + 缂栬緫 + 鎵归噺鍒犻櫎 + 鏌ョ湅 + Excel鏁版嵁瀵煎叆 + Excel瀵煎嚭 + + <#list config_buttons as x> + <#if x['buttonStyle'] == 'button' && x['buttonStatus']=='1'> + + onclick="doBusButton('cgFormBuildController.do?doButton&formId=${x['formId']}&buttonCode=${x['buttonCode']}&tableName=${config_id}','${x['buttonName']}','${config_id}List')">${x['buttonName']} + <#else> + onclick="${x['buttonCode']}();">${x['buttonName']} + + + + + +<#if (config_queryList?size >0)> + <#if config_querymode == "group" > + + 鏌ヨ + 閲嶇疆 + + + <#if config_querymode == "single"> + + +
    + <#list config_queryList as x> + <#if x['field_isQuery']=="Y"> +
    ${x['field_title']}
    + <#else> + + +
    +
    + + +
    +
    diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/demo.ftl b/src/main/java/org/jeecgframework/web/cgform/engine/demo.ftl new file mode 100644 index 00000000..d7ee708c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/demo.ftl @@ -0,0 +1,28 @@ + + + + DEMO绀轰緥 + + + +
    + + + + + + + + + +
    + + + + 鐢ㄦ埛鍚嶈寖鍥村湪2~10浣嶅瓧绗 +
    +
    + diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/hibernate/tableTemplate.ftl b/src/main/java/org/jeecgframework/web/cgform/engine/hibernate/tableTemplate.ftl new file mode 100644 index 00000000..238edff1 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/hibernate/tableTemplate.ftl @@ -0,0 +1,125 @@ + + + + + <#if entity.columns?exists> + <#list entity.columns as attr> + <#if attr.fieldName == "id"> + <#if entity.jformPkType?if_exists?html=='UUID'> + + + + <#elseif entity.jformPkType?if_exists?html=='NATIVE'> + <#if dataType=='MYSQL'> + + + + <#elseif dataType=='ORACLE'> + + + + <#elseif dataType=='SQLSERVER'> + + + + <#elseif dataType=='POSTGRESQL'> + + + + + <#elseif entity.jformPkType?if_exists?html=='SEQUENCE'> + <#if dataType=='MYSQL'> + + + + <#elseif dataType=='ORACLE'> + + + ${entity.jformPkSequence} + + + + <#elseif dataType=='SQLSERVER'> + + + + <#elseif dataType=='POSTGRESQL'> + + + + + <#else> + + + + + + <#else> + + <#case "string"> + type="java.lang.String" + <#break> + <#case "Text"> + type="text" + <#break> + <#case "int"> + type="java.lang.Integer" + <#break> + <#case "double"> + <#if dataType=='MYSQL'> + type="java.lang.Double" + <#elseif dataType=='ORACLE'> + type="java.math.BigDecimal" + <#elseif dataType=='POSTGRESQL'> + type="java.math.BigDecimal" + <#elseif dataType=='SQLSERVER'> + type="java.math.BigDecimal" + + <#break> + <#case "Date"> + <#if dataType=='MYSQL'> + type="java.util.Date" + <#elseif dataType=='ORACLE'> + type="java.sql.Timestamp" + <#elseif dataType=='POSTGRESQL'> + type="java.util.Date" + <#elseif dataType=='SQLSERVER'> + type="java.util.Date" + + <#break> + <#case "BigDecimal"> + <#if dataType=='MYSQL'> + type="java.lang.Double" + <#elseif dataType=='ORACLE'> + type="java.math.BigDecimal" + <#elseif dataType=='POSTGRESQL'> + type="java.math.BigDecimal" + <#elseif dataType=='SQLSERVER'> + type="java.math.BigDecimal" + + <#break> + <#case "Blob"> + <#if dataType=='MYSQL'> + type="blob" + <#elseif dataType=='ORACLE'> + type="blob" + <#elseif dataType=='POSTGRESQL'> + type="binary" + <#elseif dataType=='SQLSERVER'> + type="image" + + <#break> + access="property"> + + precision="${attr.length}" scale="${attr.pointLength}"<#else>length="${attr.length}" + <#if attr.fieldDefault?exists&&attr.fieldDefault!=''>default="${attr.fieldDefault}" + not-null="<#if attr.isNull == "Y">false<#else>true" unique="false"> + ${attr.content} + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/jform.ftl b/src/main/java/org/jeecgframework/web/cgform/engine/jform.ftl new file mode 100644 index 00000000..db23db62 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/jform.ftl @@ -0,0 +1,337 @@ +<#setting number_format="0.#####################"> + + + + + ${config_iframe} + + +
    + + + + <#list columnhidden as po> + + + + <#list columns as po> + <#if (columns?size>10)> + <#if po_index%2==0> + + + <#else> + + + + + <#if (columns?size>10)> + <#if (po_index%2==0)&&(!po_has_next)> + + + + <#if (po_index%2!=0)||(!po_has_next)> + + + <#else> + + + + + <#list columnsarea as po> + <#if (columns?size>10)> + + + + + <#else> + + + + + + + + + +
    + + + <#if po.show_type=='text'> + readonly = "readonly" + <#if po.field_valid_type?if_exists?html != ''> + datatype="${po.field_valid_type?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" <#if po.is_null == 'Y'>ignore="ignore" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" <#if po.is_null == 'Y'>ignore="ignore" + <#else> + <#if po.is_null != 'Y'>datatype="*" + + > + <#elseif po.show_type=='password'> + readonly = "readonly" + <#if po.field_valid_type?if_exists?html != ''> + datatype="${po.field_valid_type?if_exists?html}" + <#else> + <#if po.is_null != 'Y'>datatype="*" + > + + <#elseif po.show_type=='radio'> + <@DictData name="${po.dict_field?if_exists?html}" text="${po.dict_text?if_exists?html}" tablename="${po.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*" + <#if po.operationCodesReadOnly?if_exists>onclick="return false;" + <#if dictdata.typecode?if_exists?html=="${data['${tableName}']['${po.field_name}']?if_exists?html}"> checked="true" > + ${dictdata.typename?if_exists?html} + + + + <#elseif po.show_type=='checkbox'> + <#assign checkboxstr>${data['${tableName}']['${po.field_name}']?if_exists?html} + <#assign checkboxlist=checkboxstr?split(",")> + <@DictData name="${po.dict_field?if_exists?html}" text="${po.dict_text?if_exists?html}" tablename="${po.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + onclick="return false;" + <#if dictdata_index==0&&po.is_null != 'Y'>datatype="*" + <#list checkboxlist as x > + <#if dictdata.typecode?if_exists?html=="${x?if_exists?html}"> checked="true" > + ${dictdata.typename?if_exists?html} + + + + <#elseif po.show_type=='list'> + <@DictData name="${po.dict_field?if_exists?html}" text="${po.dict_text?if_exists?html}" tablename="${po.dict_table?if_exists?html}" var="dataList"> + + + + <#elseif po.show_type=='date'> + readonly = "readonly" + <#if po.field_valid_type?if_exists?html != ''> + datatype="${po.field_valid_type?if_exists?html}" + <#else> + <#if po.is_null != 'Y'>datatype="*" + > + + <#elseif po.show_type=='datetime'> + readonly = "readonly" + <#if po.field_valid_type?if_exists?html != ''> + datatype="${po.field_valid_type?if_exists?html}" + <#else> + <#if po.is_null != 'Y'>datatype="*" + > + + <#elseif po.show_type=='popup'> + readonly = "readonly" + <#if po.field_valid_type?if_exists?html != ''> + datatype="${po.field_valid_type?if_exists?html}" + <#else> + <#if po.is_null != 'Y'>datatype="*" + > + + <#elseif po.show_type=='file'> + + <#list filesList as fileB> + <#if fileB['field'] == po.field_name> + + + + + + + + +
    ${fileB['title']}涓嬭浇棰勮鍒犻櫎
    + <#if !(po.operationCodesReadOnly ??)> +
    + +
    +
    + + <#else> + + datatype="${po.field_valid_type?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.is_null != 'Y'>datatype="*" + + > + + + + +
    + + +
    + + + + + +
    + + + + + +
    + +
    + + + + \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/jformhead.ftl b/src/main/java/org/jeecgframework/web/cgform/engine/jformhead.ftl new file mode 100644 index 00000000..19811e9c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/jformhead.ftl @@ -0,0 +1,199 @@ + + + <#list columnhidden as po> + + + + <#list columns as po> + <#if po_index%2==0> + + + + + <#if (po_index%2==0)&&(!po_has_next)> + + + + <#if (po_index%2!=0)||(!po_has_next)> + + + + + <#list columnsarea as po> + + + + + +
    + + + <#if po.show_type=='text'> + + datatype="${po.field_valid_type?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.is_null != 'Y'>datatype="*" + > + + <#elseif po.show_type=='password'> + + datatype="${po.field_valid_type?if_exists?html}" + <#else> + <#if po.is_null != 'Y'>datatype="*" + > + + <#elseif po.show_type=='radio'> + <@DictData name="${po.dict_field?if_exists?html}" text="${po.dict_text?if_exists?html}" tablename="${po.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*" + <#if dictdata.typecode?if_exists?html=="${data['${tableName}']['${po.field_name}']?if_exists?html}"> checked="true" > + ${dictdata.typename?if_exists?html} + + + + <#elseif po.show_type=='checkbox'> + <#assign checkboxstr>${data['${tableName}']['${po.field_name}']?if_exists?html} + <#assign checkboxlist=checkboxstr?split(",")> + <@DictData name="${po.dict_field?if_exists?html}" text="${po.dict_text?if_exists?html}" tablename="${po.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*" + <#list checkboxlist as x > + <#if dictdata.typecode?if_exists?html=="${x?if_exists?html}"> checked="true" > + ${dictdata.typename?if_exists?html} + + + + <#elseif po.show_type=='list'> + <@DictData name="${po.dict_field?if_exists?html}" text="${po.dict_text?if_exists?html}" tablename="${po.dict_table?if_exists?html}" var="dataList"> + + + + <#elseif po.show_type=='date'> + + datatype="${po.field_valid_type?if_exists?html}" + <#else> + <#if po.is_null != 'Y'>datatype="*" + > + + <#elseif po.show_type=='datetime'> + + datatype="${po.field_valid_type?if_exists?html}" + <#else> + <#if po.is_null != 'Y'>datatype="*" + > + + <#elseif po.show_type=='popup'> + + datatype="${po.field_valid_type?if_exists?html}" + <#else> + <#if po.is_null != 'Y'>datatype="*" + > + + <#elseif po.show_type=='file'> + + <#list filesList as fileB> + <#if fileB['field'] == po.field_name> + + + + + + + + +
    ${fileB['title']}涓嬭浇棰勮鍒犻櫎
    +
    + +
    +
    + <#else> + + datatype="${po.field_valid_type?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.is_null != 'Y'>datatype="*" + > + + + +
    + + +
    + + + + + +
    \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/jformonetomany.ftl b/src/main/java/org/jeecgframework/web/cgform/engine/jformonetomany.ftl new file mode 100644 index 00000000..a7e6fa64 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/jformonetomany.ftl @@ -0,0 +1,328 @@ + +
    + + +
    + + + + + <#list field['${sub}'].fieldList as subTableField > + + + + + <#if data['${sub}']?exists&&(data['${sub}']?size>0) > + <#list data['${sub}'] as subTableData > + + + + <#list field['${sub}'].fieldList as subTableField > + + + + + <#else> + + + + <#list field['${sub}'].fieldList as subTableField > + + + + + +
    搴忓彿鎿嶄綔${subTableField.content?if_exists?html}
    + + + <#list field['${sub}'].hiddenFieldList as subTableField > + + + + <#if subTableField.show_type=='text'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.type == 'int'> + datatype="n" + <#elseif subTableField.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='password'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='radio'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*" + <#if dictdata.typecode?if_exists?html=="${subTableData['${subTableField.field_name}']?if_exists?html}"> checked="true" > + ${dictdata.typename?if_exists?html} + + + + <#elseif subTableField.show_type=='checkbox'> + <#assign checkboxstr>${subTableData['${subTableField.field_name}']?if_exists?html} + <#assign checkboxlist=checkboxstr?split(",")> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*" + <#list checkboxlist as x > + <#if dictdata.typecode?if_exists?html=="${x?if_exists?html}"> checked="true" > + ${dictdata.typename?if_exists?html} + + + + <#elseif subTableField.show_type=='list'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + + + + <#elseif subTableField.show_type=='date'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='datetime'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='popup'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='file'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#else> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.type == 'int'> + datatype="n" + <#elseif subTableField.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + +
    + + + <#list field['${sub}'].hiddenFieldList as subTableField > + + + + <#if subTableField.show_type=='text'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.type == 'int'> + datatype="n" + <#elseif subTableField.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='password'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='radio'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*" > + ${dictdata.typename?if_exists?html} + + + + <#elseif subTableField.show_type=='checkbox'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*"> + ${dictdata.typename?if_exists?html} + + + + <#elseif subTableField.show_type=='list'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + + + + <#elseif subTableField.show_type=='date'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='datetime'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='popup'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='file'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#else> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.type == 'int'> + datatype="n" + <#elseif subTableField.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + +
    +
    +
    + \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/jformonetomanytpl.ftl b/src/main/java/org/jeecgframework/web/cgform/engine/jformonetomanytpl.ftl new file mode 100644 index 00000000..e3ceafec --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/jformonetomanytpl.ftl @@ -0,0 +1,134 @@ + + +
    + + + + <#list field['${sub}'].hiddenFieldList as subTableField > + + + + <#list field['${sub}'].fieldList as subTableField > + + <#if subTableField.show_type=='text'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.type == 'int'> + datatype="n" + <#elseif subTableField.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='password'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='radio'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*" > + ${dictdata.typename?if_exists?html} + + + + <#elseif subTableField.show_type=='checkbox'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*" > + ${dictdata.typename?if_exists?html} + + + + <#elseif subTableField.show_type=='list'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + + + + <#elseif subTableField.show_type=='date'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='datetime'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='popup'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='file'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#else> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.type == 'int'> + datatype="n" + <#elseif subTableField.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + + + + + \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/jformonetoone.ftl b/src/main/java/org/jeecgframework/web/cgform/engine/jformonetoone.ftl new file mode 100644 index 00000000..10f6271f --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/jformonetoone.ftl @@ -0,0 +1,357 @@ + +
    +
    + + <#if data['${sub}']?exists&&(data['${sub}']?size>0) > + <#if (data['${sub}']?size>1) > +
    璇ラ檮琛ㄤ笅瀛樺湪澶氭潯鏁版嵁
    + <#else> + <#list data['${sub}'] as subTableData > + + <#list field['${sub}'].hiddenFieldList as subTableField > + + + <#list field['${sub}'].fieldNoAreaList as subTableField > + <#if subTableField_index%2==0> + + + + + <#if (subTableField_index%2==0)&&(!subTableField_has_next)> + + + + <#if (subTableField_index%2!=0)||(!subTableField_has_next)> + + + + <#list field['${sub}'].fieldAreaList as subTableField> + + + + + + + + <#else> + + <#list field['${sub}'].hiddenFieldList as subTableField > + + + <#list field['${sub}'].fieldNoAreaList as subTableField > + <#if subTableField_index%2==0> + + + + + <#if (subTableField_index%2==0)&&(!subTableField_has_next)> + + + + <#if (subTableField_index%2!=0)||(!subTableField_has_next)> + + + + <#list field['${sub}'].fieldAreaList as subTableField> + + + + + + +
    + + + <#if subTableField.show_type=='text'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.type == 'int'> + datatype="n" + <#elseif subTableField.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='password'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='radio'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*" + <#if dictdata.typecode?if_exists?html=="${subTableData['${subTableField.field_name}']?if_exists?html}"> checked="true" > + ${dictdata.typename?if_exists?html} + + + + <#elseif subTableField.show_type=='checkbox'> + <#assign checkboxstr>${subTableData['${subTableField.field_name}']?if_exists?html} + <#assign checkboxlist=checkboxstr?split(",")> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*" + <#list checkboxlist as x > + <#if dictdata.typecode?if_exists?html=="${x?if_exists?html}"> checked="true" > + ${dictdata.typename?if_exists?html} + + + + <#elseif subTableField.show_type=='list'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + + + + <#elseif subTableField.show_type=='date'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='datetime'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='popup'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='file'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#else> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.type == 'int'> + datatype="n" + <#elseif subTableField.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + + + + +
    + + + + + +
    + + + <#if subTableField.show_type=='text'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.type == 'int'> + datatype="n" + <#elseif subTableField.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='password'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='radio'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*"> + ${dictdata.typename?if_exists?html} + + + + <#elseif subTableField.show_type=='checkbox'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + <#list dataList as dictdata> + datatype="*"> + ${dictdata.typename?if_exists?html} + + + + <#elseif subTableField.show_type=='list'> + <@DictData name="${subTableField.dict_field?if_exists?html}" text="${subTableField.dict_text?if_exists?html}" tablename="${subTableField.dict_table?if_exists?html}" var="dataList"> + + + + <#elseif subTableField.show_type=='date'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='datetime'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='popup'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#elseif subTableField.show_type=='file'> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + <#else> + + datatype="${subTableField.field_valid_type?if_exists?html}" + <#else> + <#if subTableField.type == 'int'> + datatype="n" + <#elseif subTableField.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if subTableField.is_null != 'Y'>datatype="*" + > + + + + + +
    + + + + + +
    +
    +
    + \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/jformunion.ftl b/src/main/java/org/jeecgframework/web/cgform/engine/jformunion.ftl new file mode 100644 index 00000000..37a205fc --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/jformunion.ftl @@ -0,0 +1,150 @@ +<#setting number_format="0.#####################"> + + + + 璁㈠崟淇℃伅 + ${config_iframe} + + + +
    + <#include "org/jeecgframework/web/cgform/engine/jformhead.ftl"> + + + +
    +
    +
    + <#assign subTableStr>${head.subTableStr?if_exists?html} + <#assign subtablelist=subTableStr?split(",")> + <#list subtablelist as sub > + <#if field['${sub}']?exists > + <#if field['${sub}'].head.relationType==1 > + <#include "org/jeecgframework/web/cgform/engine/jformonetoone.ftl"> + <#else> + <#include "org/jeecgframework/web/cgform/engine/jformonetomany.ftl"> + + + +
    +
    + +
    + + + <#assign subTableStr>${head.subTableStr?if_exists?html} + <#assign subtablelist=subTableStr?split(",")> + <#list subtablelist as sub > + <#if field['${sub}']?exists > + <#if field['${sub}'].head.relationType!=1 > + <#include "org/jeecgframework/web/cgform/engine/jformonetomanytpl.ftl"> + + + +
    + + + \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/engine/tag/DictDataTag.java b/src/main/java/org/jeecgframework/web/cgform/engine/tag/DictDataTag.java new file mode 100644 index 00000000..b525c5da --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/engine/tag/DictDataTag.java @@ -0,0 +1,111 @@ +package org.jeecgframework.web.cgform.engine.tag; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.web.system.pojo.base.TSType; +import org.jeecgframework.web.system.pojo.base.TSTypegroup; +import org.jeecgframework.web.system.service.SystemService; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import freemarker.core.Environment; +import freemarker.template.SimpleCollection; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; +import freemarker.template.TemplateModelException; +import freemarker.template.TemplateScalarModel; + +/** + * 鑷畾涔夊瓧鍏歌〃鏍囩 + * + * @author Zhoujf + * + */ +@Component("dictDataTag") +public class DictDataTag implements TemplateDirectiveModel { + + private static final Logger LOG = LoggerFactory + .getLogger(DictDataTag.class); + + @Autowired + private SystemService systemService; + + @SuppressWarnings("unchecked") + public void execute(Environment env, Map params, TemplateModel[] loopVars, + TemplateDirectiveBody body) throws TemplateException, IOException { + + // 鏁版嵁鍚嶇О + String name = getAttribute(params, "name"); + if (name == null) { + throw new TemplateException( + "Can not find attribute 'name' in data tag", env); + } + String text = getAttribute(params, "text"); + String tablename = getAttribute(params, "tablename"); + // 鍙橀噺鍚嶇О + String var = getAttribute(params, "var"); + // 鍔犲叆鏁版嵁 + var = var != null ? var : name; + + if (tablename == null || tablename.trim().length() <= 0) { + // 鏍规嵁dict_field鏌ヨ瀛楀吀琛╨ist + List dataList = TSTypegroup.allTypes + .get(name.toLowerCase()); + if (dataList == null) { + dataList = new ArrayList(); + } + for(TSType s:dataList){ + String names = s.getTypename(); + s.setTypename(MutiLangUtil.getMutiLangInstance().getLang(names)); + } + env.setGlobalVariable(var, new SimpleCollection(dataList)); + } else { + // table琛ㄦ煡璇 + StringBuilder sql = new StringBuilder(""); + sql.append("select distinct ").append(name) + .append(" as typecode, "); + if (text == null || text.trim().length() <= 0) { + sql.append(name).append(" as typename "); + } else { + sql.append(text).append(" as typename "); + } + sql.append(" from ").append(tablename); + sql.append(" order by ").append(name); + List> dataList = systemService.findForJdbc(sql + .toString()); + env.setGlobalVariable(var, new SimpleCollection(dataList)); + } + body.render(env.getOut()); + } + + /** + * 鍙栧緱鏍囩鍙傛暟 + * + * @param params + * @param name + * @return + */ + @SuppressWarnings("unchecked") + private String getAttribute(Map params, String name) { + String value = null; + if (params.containsKey(name)) { + TemplateModel paramValue = (TemplateModel) params.get(name); + try { + value = ((TemplateScalarModel) paramValue).getAsString(); + } catch (TemplateModelException e) { + LOG.error("get attribute '{}' error", name, e); + } + } + return value; + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/autolist/AutoFieldEntity.java b/src/main/java/org/jeecgframework/web/cgform/entity/autolist/AutoFieldEntity.java new file mode 100644 index 00000000..4bd3bdb3 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/autolist/AutoFieldEntity.java @@ -0,0 +1,66 @@ +package org.jeecgframework.web.cgform.entity.autolist; +/** + * 鍔ㄦ佸垪琛ㄥ瓧娈甸厤缃疄浣 + * @author 璧典繆澶 + * @date Jul 4, 2013 + */ +public class AutoFieldEntity { + /** 瀛楁缂栫爜*/ + private String name; + /** 瀛楁鍚嶇О*/ + private String title; + /** 鏄惁闅愯棌*/ + private boolean isHidden; + /** 鏄惁鏌ヨ*/ + private boolean isQuery; + /** 鏌ヨ妯″紡*/ + private String queryMode; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public boolean isQuery() { + return isQuery; + } + public void setQuery(boolean isQuery) { + this.isQuery = isQuery; + } + public String getQueryMode() { + return queryMode; + } + public void setQueryMode(String queryMode) { + this.queryMode = queryMode; + } + public AutoFieldEntity(String name, String title, boolean isQuery, + String queryMode) { + this.name = name; + this.title = title; + this.isQuery = isQuery; + this.queryMode = queryMode; + } + public boolean isHidden() { + return isHidden; + } + public void setHidden(boolean isHidden) { + this.isHidden = isHidden; + } + public AutoFieldEntity(String name, String title, boolean isHidden, + boolean isQuery, String queryMode) { + this.name = name; + this.title = title; + this.isHidden = isHidden; + this.isQuery = isQuery; + this.queryMode = queryMode; + } + public AutoFieldEntity() { + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/button/CgformButtonEntity.java b/src/main/java/org/jeecgframework/web/cgform/entity/button/CgformButtonEntity.java new file mode 100644 index 00000000..e5497efc --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/button/CgformButtonEntity.java @@ -0,0 +1,200 @@ +package org.jeecgframework.web.cgform.entity.button; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 琛ㄥ崟鑷畾涔夋寜閽 + * @author 寮犱唬娴 + * @date 2013-08-07 20:16:26 + * @version V1.0 + * + */ +@Entity +@Table(name = "cgform_button", schema = "") +@SuppressWarnings("serial") +public class CgformButtonEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**澶栭敭鍏宠仈cgform_head*/ + private java.lang.String formId; + /**鎸夐挳缂栫爜*/ + private java.lang.String buttonCode; + /**鎸夐挳鍚嶇О*/ + private java.lang.String buttonName; + /**鎸夐挳鏍峰紡link/button*/ + private java.lang.String buttonStyle; + /**鍔ㄤ綔绫诲瀷:js/bus*/ + private java.lang.String optType; + /**鏄剧ず琛ㄨ揪寮:exp="status#eq#0"*/ + private java.lang.String exp; + /**0:绂佺敤/1:浣跨敤*/ + private java.lang.String buttonStatus; + /**椤哄簭*/ + private java.lang.Integer orderNum; + /**鎸夐挳鍥炬爣鏍峰紡*/ + private java.lang.String buttonIcon; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 澶栭敭鍏宠仈cgform_head + */ + @Column(name ="FORM_ID",nullable=true,length=32) + public java.lang.String getFormId(){ + return this.formId; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 澶栭敭鍏宠仈cgform_head + */ + public void setFormId(java.lang.String formId){ + this.formId = formId; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎸夐挳缂栫爜 + */ + @Column(name ="BUTTON_CODE",nullable=true,length=50) + public java.lang.String getButtonCode(){ + return this.buttonCode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎸夐挳缂栫爜 + */ + public void setButtonCode(java.lang.String buttonCode){ + this.buttonCode = buttonCode; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎸夐挳鍚嶇О + */ + @Column(name ="BUTTON_NAME",nullable=true,length=50) + public java.lang.String getButtonName(){ + return this.buttonName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎸夐挳鍚嶇О + */ + public void setButtonName(java.lang.String buttonName){ + this.buttonName = buttonName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎸夐挳鏍峰紡link/button + */ + @Column(name ="BUTTON_STYLE",nullable=true,length=20) + public java.lang.String getButtonStyle(){ + return this.buttonStyle; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎸夐挳鏍峰紡link/button + */ + public void setButtonStyle(java.lang.String buttonStyle){ + this.buttonStyle = buttonStyle; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍔ㄤ綔绫诲瀷:js/bus + */ + @Column(name ="OPT_TYPE",nullable=true,length=20) + public java.lang.String getOptType(){ + return this.optType; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍔ㄤ綔绫诲瀷:js/bus + */ + public void setOptType(java.lang.String optType){ + this.optType = optType; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄剧ず琛ㄨ揪寮:exp="status#eq#0" + */ + @Column(name ="EXP",nullable=true,length=255) + public java.lang.String getExp(){ + return this.exp; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄剧ず琛ㄨ揪寮:exp="status#eq#0" + */ + public void setExp(java.lang.String exp){ + this.exp = exp; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 0:绂佺敤/1:浣跨敤 + */ + @Column(name ="BUTTON_STATUS",nullable=true,length=2) + public java.lang.String getButtonStatus(){ + return this.buttonStatus; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 0:绂佺敤/1:浣跨敤 + */ + public void setButtonStatus(java.lang.String buttonStatus){ + this.buttonStatus = buttonStatus; + } + + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 椤哄簭 + */ + @Column(name ="order_num",nullable=true,length=4) + public java.lang.Integer getOrderNum() { + return orderNum; + } + + public void setOrderNum(java.lang.Integer orderNum) { + this.orderNum = orderNum; + } + + @Column(name ="button_icon",nullable=true,length=20) + public java.lang.String getButtonIcon() { + return buttonIcon; + } + + public void setButtonIcon(java.lang.String buttonIcon) { + this.buttonIcon = buttonIcon; + } + + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/button/CgformButtonSqlEntity.java b/src/main/java/org/jeecgframework/web/cgform/entity/button/CgformButtonSqlEntity.java new file mode 100644 index 00000000..5d6e8034 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/button/CgformButtonSqlEntity.java @@ -0,0 +1,155 @@ +package org.jeecgframework.web.cgform.entity.button; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; + +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 鎸夐挳sql澧炲己 + * @author 寮犱唬娴 + * @date 2013-08-07 23:09:23 + * @version V1.0 + * + */ +@Entity +@Table(name = "cgform_button_sql", schema = "") +@SuppressWarnings("serial") +public class CgformButtonSqlEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**澶栭敭鍏宠仈cgform_head*/ + private java.lang.String formId; + /**鎸夐挳缂栫爜*/ + private java.lang.String buttonCode; + /**绉板悕*/ + private java.lang.String cgbSqlName; + /**寮哄sql*/ + private byte[] cgbSql; + /**寮哄sql Str*/ + private String cgbSqlStr; + /**鎻忚堪*/ + private java.lang.String content; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 澶栭敭鍏宠仈cgform_head + */ + @Column(name ="FORM_ID",nullable=true,length=32) + public java.lang.String getFormId(){ + return this.formId; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 澶栭敭鍏宠仈cgform_head + */ + public void setFormId(java.lang.String formId){ + this.formId = formId; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎸夐挳缂栫爜 + */ + @Column(name ="BUTTON_CODE",nullable=true,length=50) + public java.lang.String getButtonCode(){ + return this.buttonCode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎸夐挳缂栫爜 + */ + public void setButtonCode(java.lang.String buttonCode){ + this.buttonCode = buttonCode; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 绉板悕 + */ + @Column(name ="CGB_SQL_NAME",nullable=true,length=50) + public java.lang.String getCgbSqlName(){ + return this.cgbSqlName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 绉板悕 + */ + public void setCgbSqlName(java.lang.String cgbSqlName){ + this.cgbSqlName = cgbSqlName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 寮哄sql + */ + @Column(name ="CGB_SQL",nullable=true) + public byte[] getCgbSql(){ + return this.cgbSql; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 寮哄sql + */ + public void setCgbSql(byte[] cgbSql){ + this.cgbSql = cgbSql; + } + + @Transient + public String getCgbSqlStr() { + if(cgbSql!=null){ + cgbSqlStr = new String(cgbSql); + } + return cgbSqlStr; + } + + public void setCgbSqlStr(String cgbSqlStr) { + this.cgbSqlStr = cgbSqlStr; + if(cgbSqlStr!=null){ + this.cgbSql = cgbSqlStr.getBytes(); + } + } + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎻忚堪 + */ + @Column(name ="CONTENT",nullable=true,length=1000) + public java.lang.String getContent(){ + return this.content; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎻忚堪 + */ + public void setContent(java.lang.String content){ + this.content = content; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/category/CgformCategoryEntity.java b/src/main/java/org/jeecgframework/web/cgform/entity/category/CgformCategoryEntity.java new file mode 100644 index 00000000..31ec569a --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/category/CgformCategoryEntity.java @@ -0,0 +1,50 @@ +package org.jeecgframework.web.cgform.entity.category; + +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.system.pojo.base.TSCategoryEntity; + +/** + * Online Coding 鍒嗙被绠$悊 + * + * @author JueYue + * @date 2014骞10鏈14鏃 涓嬪崍10:23:08 + */ +@Entity +@Table(name = "cgform_category", schema = "") +public class CgformCategoryEntity extends IdEntity { + /** + * 琛ㄥ崟 + */ + private CgFormHeadEntity form; + /** + * 鍒嗙被 + */ + private TSCategoryEntity category; + + @ManyToOne(targetEntity = CgFormHeadEntity.class) + @JoinColumn(name = "cgform_id", referencedColumnName = "id") + public CgFormHeadEntity getForm() { + return form; + } + + public void setForm(CgFormHeadEntity form) { + this.form = form; + } + + @ManyToOne(targetEntity = TSCategoryEntity.class) + @JoinColumn(name = "category_code", referencedColumnName = "code") + public TSCategoryEntity getCategory() { + return category; + } + + public void setCategory(TSCategoryEntity category) { + this.category = category; + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/cgformftl/CgformFtlEntity.java b/src/main/java/org/jeecgframework/web/cgform/entity/cgformftl/CgformFtlEntity.java new file mode 100644 index 00000000..b6d59da3 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/cgformftl/CgformFtlEntity.java @@ -0,0 +1,274 @@ +package org.jeecgframework.web.cgform.entity.cgformftl; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: Word杞現tl + * @author 寮犱唬娴 + * @date 2013-07-03 17:42:06 + * @version V1.0 + * + */ +@Entity +@Table(name = "cgform_ftl", schema = "") +@SuppressWarnings("serial") +public class CgformFtlEntity implements java.io.Serializable { + /**涓婚敭*/ + private java.lang.String id; + /**琛ㄥ崟ID*/ + private java.lang.String cgformId; + /**琛ㄥ崟鍚嶇О*/ + private java.lang.String cgformName; + /**鐗堟湰鍙*/ + private java.lang.Integer ftlVersion; + /**琛ㄥ崟妯℃澘鍐呭*/ + private String ftlContent; + /**婵娲荤姸鎬*/ + private java.lang.String ftlStatus; + /**word璺緞*/ + private java.lang.String ftlWordUrl; + /**鍒涘缓浜篒D*/ + private java.lang.String createBy; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDate; + /**淇敼浜篒D*/ + private java.lang.String updateBy; + /**淇敼浜哄悕绉*/ + private java.lang.String updateName; + /**淇敼鏃堕棿*/ + private java.util.Date updateDate; + /**妯℃澘绫诲瀷 01 ckeditor 02 鑷畾涔 03 */ + private java.lang.String editorType; + @Column(name ="EDITOR_TYPE",nullable=false,length=32) + public java.lang.String getEditorType() { + return editorType; + } + + public void setEditorType(java.lang.String editorType) { + this.editorType = editorType; + } + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 琛ㄥ崟ID + */ + @Column(name ="CGFORM_ID",nullable=false,length=36) + public java.lang.String getCgformId(){ + return this.cgformId; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 琛ㄥ崟ID + */ + public void setCgformId(java.lang.String cgformId){ + this.cgformId = cgformId; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 琛ㄥ崟鍚嶇О + */ + @Column(name ="CGFORM_NAME",nullable=false,length=100) + public java.lang.String getCgformName(){ + return this.cgformName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 琛ㄥ崟鍚嶇О + */ + public void setCgformName(java.lang.String cgformName){ + this.cgformName = cgformName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鐗堟湰鍙 + */ + @Column(name ="FTL_VERSION",nullable=false,length=10) + public java.lang.Integer getFtlVersion(){ + return this.ftlVersion; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鐗堟湰鍙 + */ + public void setFtlVersion(java.lang.Integer ftlVersion){ + this.ftlVersion = ftlVersion; + } + /** + *鏂规硶: 鍙栧緱byte[] + *@return: byte[] 琛ㄥ崟妯℃澘鍐呭 + */ + @Lob + @Column(name ="FTL_CONTENT",nullable=true) + public String getFtlContent(){ + return this.ftlContent; + } + + /** + *鏂规硶: 璁剧疆byte[] + *@param: byte[] 琛ㄥ崟妯℃澘鍐呭 + */ + public void setFtlContent(String ftlContent){ + this.ftlContent = ftlContent; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 婵娲荤姸鎬 + */ + @Column(name ="FTL_STATUS",nullable=true,length=50) + public java.lang.String getFtlStatus(){ + return this.ftlStatus; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 婵娲荤姸鎬 + */ + public void setFtlStatus(java.lang.String ftlStatus){ + this.ftlStatus = ftlStatus; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String word璺緞 + */ + @Column(name ="FTL_WORD_URL",nullable=true,length=200) + public java.lang.String getFtlWordUrl(){ + return this.ftlWordUrl; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String word璺緞 + */ + public void setFtlWordUrl(java.lang.String ftlWordUrl){ + this.ftlWordUrl = ftlWordUrl; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜篒D + */ + @Column(name ="CREATE_BY",nullable=true,length=36) + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜篒D + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + @Column(name ="CREATE_NAME",nullable=true,length=32) + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + @Column(name ="CREATE_DATE",nullable=true) + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜篒D + */ + @Column(name ="UPDATE_BY",nullable=true,length=36) + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜篒D + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜哄悕绉 + */ + @Column(name ="UPDATE_NAME",nullable=true,length=32) + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 淇敼鏃堕棿 + */ + @Column(name ="UPDATE_DATE",nullable=true) + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 淇敼鏃堕棿 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/config/CgFormFieldEntity.java b/src/main/java/org/jeecgframework/web/cgform/entity/config/CgFormFieldEntity.java new file mode 100644 index 00000000..a8d0b5ba --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/config/CgFormFieldEntity.java @@ -0,0 +1,552 @@ +package org.jeecgframework.web.cgform.entity.config; + + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + + +import org.codehaus.jackson.annotate.JsonAutoDetect; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.ForeignKey; +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 鑷姩鐢熸垚琛ㄧ殑鍒楀睘鎬 + * @author jueyue + * @date 2013-06-30 11:37:32 + * @version V1.0 + * + */ +@Entity +@Table(name = "cgform_field", schema = "") +@DynamicUpdate(true) +@DynamicInsert(true) +@JsonAutoDetect +@SuppressWarnings("serial") +public class CgFormFieldEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**瀛楁鍚嶇О*/ + private java.lang.String fieldName; + /**鍏宠仈鐨勮〃*/ + private CgFormHeadEntity table; + /**瀛楁闀垮害*/ + private java.lang.Integer length; + /**灏忔暟鐐归暱搴*/ + private java.lang.Integer pointLength; + /**瀛楁绫诲瀷*/ + private java.lang.String type; + /**鏄惁鍏佽绌哄*/ + private java.lang.String isNull; + /**鍦ㄨ〃涓殑椤哄簭*/ + private java.lang.Integer orderNum; + /**鏄惁涓婚敭*/ + private java.lang.String isKey; + /**鏄惁鏄剧ず*/ + private java.lang.String isShow; + /**鏄惁鍦ㄥ垪琛ㄤ笂鏄剧ず*/ + private java.lang.String isShowList; + /**鏄剧ず绫诲瀷*/ + private java.lang.String showType; + /**鏄惁鐢熶骇鏌ヨ瀛楁*/ + private java.lang.String isQuery; + /**鎺т欢闀垮害*/ + private java.lang.Integer fieldLength; + /**瀛楁Href*/ + private java.lang.String fieldHref; + /**鎺т欢鏍¢獙*/ + private java.lang.String fieldValidType; + /**鏌ヨ绫诲瀷single(榛樿锛氬崟瀛楁鏌ヨ),group(鑼冨洿鏌ヨ)*/ + private java.lang.String queryMode; + /**鍔熻兘娉ㄩ噴*/ + private java.lang.String content; + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDate; + /**鍒涘缓浜篒D*/ + private java.lang.String createBy; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**淇敼鏃堕棿*/ + private java.util.Date updateDate; + /**淇敼浜篒D*/ + private java.lang.String updateBy; + /**淇敼浜哄悕绉*/ + private java.lang.String updateName; + /**瀛楀吀Code*/ + private java.lang.String dictField; + /**瀛楀吀Table*/ + private java.lang.String dictTable; + /**瀛楀吀Text*/ + private java.lang.String dictText; + /**涓昏〃鍚*/ + private java.lang.String mainTable; + /**涓昏〃瀛楁*/ + private java.lang.String mainField; + /**鏃х殑瀛楁鍚嶇О*/ + private java.lang.String oldFieldName; + /**瀛楁榛樿鍊*/ + private java.lang.String fieldDefault; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="id",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 瀛楁鍚嶇О + */ + @Column(name ="field_name",nullable=false,length=32) + public java.lang.String getFieldName(){ + return this.fieldName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 瀛楁鍚嶇О + */ + public void setFieldName(java.lang.String fieldName){ + this.fieldName = fieldName; + } + /** + *鏂规硶: 鍙栧緱TablePropertyEntity + *@return: TablePropertyEntity 鍏宠仈鐨勮〃锛╋激 + */ + @ManyToOne + @JoinColumn(name ="table_id",nullable=false,referencedColumnName="id") + @JsonIgnore + @ForeignKey(name="null") + public CgFormHeadEntity getTable(){ + return this.table; + } + + /** + *鏂规硶: 璁剧疆TablePropertyEntity + *@param: TablePropertyEntity 鍏宠仈鐨勮〃ID + */ + public void setTable(CgFormHeadEntity table){ + this.table = table; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 瀛楁闀垮害 + */ + @Column(name ="length",nullable=false,precision=10,scale=0) + public java.lang.Integer getLength(){ + return this.length; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 瀛楁闀垮害 + */ + public void setLength(java.lang.Integer length){ + this.length = length; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 灏忔暟鐐归暱搴 + */ + @Column(name ="point_length",nullable=true,precision=10,scale=0) + public java.lang.Integer getPointLength(){ + return this.pointLength; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 灏忔暟鐐归暱搴 + */ + public void setPointLength(java.lang.Integer pointLength){ + this.pointLength = pointLength; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 瀛楁绫诲瀷 + */ + @Column(name ="type",nullable=false,length=32) + public java.lang.String getType(){ + return this.type; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 瀛楁绫诲瀷 + */ + public void setType(java.lang.String type){ + this.type = type; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁鍏佽绌哄 + */ + @Column(name ="is_null",nullable=true,length=5) + public java.lang.String getIsNull(){ + return this.isNull; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄惁鍏佽绌哄 + */ + public void setIsNull(java.lang.String isNull){ + this.isNull = isNull; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁鏄剧ず + */ + @Column(name ="is_show",nullable=true,length=5) + public java.lang.String getIsShow(){ + return this.isShow; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄惁鏄剧ず + */ + public void setIsShow(java.lang.String isShow){ + this.isShow = isShow; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄剧ず绫诲瀷 + */ + @Column(name ="show_type",nullable=true,length=10) + public java.lang.String getShowType(){ + return this.showType; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄剧ず绫诲瀷 + */ + public void setShowType(java.lang.String showType){ + this.showType = showType; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁鐢熶骇鏌ヨ瀛楁 + */ + @Column(name ="is_query",nullable=true,length=5) + public java.lang.String getIsQuery(){ + return this.isQuery; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄惁鐢熶骇鏌ヨ瀛楁 + */ + public void setIsQuery(java.lang.String isQuery){ + this.isQuery = isQuery; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏌ヨ绫诲瀷single(榛樿锛氬崟瀛楁鏌ヨ),group(鑼冨洿鏌ヨ) + */ + @Column(name ="query_mode",nullable=true,length=10) + public java.lang.String getQueryMode(){ + return this.queryMode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏌ヨ绫诲瀷single(榛樿锛氬崟瀛楁鏌ヨ),group(鑼冨洿鏌ヨ) + */ + public void setQueryMode(java.lang.String queryMode){ + this.queryMode = queryMode; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍔熻兘娉ㄩ噴 + */ + @Column(name ="content",nullable=false,length=200) + public java.lang.String getContent(){ + return this.content; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍔熻兘娉ㄩ噴 + */ + public void setContent(java.lang.String content){ + this.content = content; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + @Column(name ="create_date",nullable=true) + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜篒D + */ + @Column(name ="create_by",nullable=true) + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜篒D + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + @Column(name ="create_name",nullable=true,length=32) + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 淇敼鏃堕棿 + */ + @Column(name ="update_date",nullable=true) + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 淇敼鏃堕棿 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜篒D + */ + @Column(name ="update_by",nullable=true,length=32) + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜篒D + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜哄悕绉 + */ + @Column(name ="update_name",nullable=true,length=32) + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍦ㄨ〃涓殑椤哄簭 + */ + @Column(name ="order_num",nullable=true,length=4) + public java.lang.Integer getOrderNum() { + return orderNum; + } + + public void setOrderNum(java.lang.Integer orderNum) { + this.orderNum = orderNum; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁涓轰富閿 + */ + @Column(name ="is_key",nullable=true,length=2) + public java.lang.String getIsKey() { + return isKey; + } + + public void setIsKey(java.lang.String isKey) { + this.isKey = isKey; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 鎺т欢闀垮害 + */ + @Column(name ="field_length",nullable=true,length=10) + public java.lang.Integer getFieldLength() { + return fieldLength; + } + + public void setFieldLength(java.lang.Integer field_length) { + this.fieldLength = field_length; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 瀛楁Href + */ + @Column(name ="field_href",nullable=true,length=200) + public java.lang.String getFieldHref() { + return fieldHref; + } + + public void setFieldHref(java.lang.String field_href) { + this.fieldHref = field_href; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎺т欢鏍¢獙 + */ + @Column(name ="field_valid_type",nullable=true,length=10) + public java.lang.String getFieldValidType() { + return fieldValidType; + } + + public void setFieldValidType(java.lang.String field_valid_type) { + this.fieldValidType = field_valid_type; + } + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 瀛楀吀Code + * */ + @Column(name ="dict_field",nullable=true,length=100) + public java.lang.String getDictField() { + return dictField; + } + + public void setDictField(java.lang.String dictField) { + this.dictField = dictField; + } + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 瀛楀吀Table + * */ + @Column(name ="dict_table",nullable=true,length=100) + public java.lang.String getDictTable() { + return dictTable; + } + + public void setDictTable(java.lang.String dictTable) { + this.dictTable = dictTable; + } + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 涓昏〃鍚嶇О + * */ + @Column(name ="main_table",nullable=true,length=100) + public java.lang.String getMainTable() { + return mainTable; + } + + public void setMainTable(java.lang.String mainTable) { + this.mainTable = mainTable; + } + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 涓昏〃鍚嶇О + * */ + @Column(name ="main_field",nullable=true,length=100) + public java.lang.String getMainField() { + return mainField; + } + + public void setMainField(java.lang.String mainField) { + this.mainField = mainField; + } + + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 涓昏〃鍚嶇О + * */ + @Column(name ="old_field_name",nullable=true,length=32) + public java.lang.String getOldFieldName() { + return oldFieldName; + } + + public void setOldFieldName(java.lang.String oldFieldName) { + this.oldFieldName = oldFieldName; + } + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 鏄惁鍦ㄥ垪琛ㄤ笂鏄剧ず + * */ + @Column(name ="is_show_list",nullable=true,length=5) + public java.lang.String getIsShowList() { + return isShowList; + } + + public void setIsShowList(java.lang.String isShowList) { + this.isShowList = isShowList; + } + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 瀛楀吀鏂囨湰 + * */ + @Column(name ="dict_text",nullable=true,length=100) + public java.lang.String getDictText() { + return dictText; + } + + public void setDictText(java.lang.String dictText) { + this.dictText = dictText; + } + + @Column(name ="field_default",nullable=true,length=20) + public java.lang.String getFieldDefault() { + if (fieldDefault != null) { + fieldDefault = fieldDefault.trim(); + } + return fieldDefault; + } + + public void setFieldDefault(java.lang.String fieldDefault) { + this.fieldDefault = fieldDefault; + } + + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/config/CgFormHeadEntity.java b/src/main/java/org/jeecgframework/web/cgform/entity/config/CgFormHeadEntity.java new file mode 100644 index 00000000..2c8383d2 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/config/CgFormHeadEntity.java @@ -0,0 +1,434 @@ +package org.jeecgframework.web.cgform.entity.config; + +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; + + +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.OrderBy; + +/** + * @Title: Entity + * @Description: 鑷姩鐢熸垚琛ㄥ睘鎬 + * @author jueyue + * @date 2013-06-30 11:36:53 + * @version V1.0 + * + */ +@Entity +@Table(name = "cgform_head", schema = "") +@DynamicUpdate(true) +@DynamicInsert(true) +@SuppressWarnings("serial") +public class CgFormHeadEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**琛ㄦ牸鍚嶇О*/ + private java.lang.String tableName; + /**dategrid鏄惁涓烘爲褰*/ + private java.lang.String isTree; + /**datagrid鏄惁鍒嗛〉*/ + private java.lang.String isPagination; + /**鏄惁鍚屾浜嗘暟鎹簱*/ + private java.lang.String isDbSynch; + /**datagrid鏄惁鏄剧ず澶嶉夋*/ + private java.lang.String isCheckbox; + /**鏌ヨ妯″紡锛歴ingle(鍗曟潯浠舵煡璇細榛樿),group(缁勫悎鏌ヨ)*/ + private java.lang.String querymode; + /**鍔熻兘娉ㄩ噴*/ + private java.lang.String content; + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDate; + /**鍒涘缓浜篒D*/ + private java.lang.String createBy; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**淇敼鏃堕棿*/ + private java.util.Date updateDate; + /**淇敼浜*/ + private java.lang.String updateBy; + /**淇敼浜哄悕绉*/ + private java.lang.String updateName; + /**琛ㄥ崟鐗堟湰*/ + private java.lang.String jformVersion; + /**琛ㄥ崟绫诲瀷*/ + private Integer jformType; + /**琛ㄥ崟涓婚敭绛栫暐*/ + private java.lang.String jformPkType; + /**琛ㄥ崟涓婚敭绛栫暐-搴忓垪(閽堝oracle绛夋暟鎹簱)*/ + private java.lang.String jformPkSequence; + /**闄勮〃鍏宠仈绫诲瀷*/ + private Integer relationType; + /**闄勮〃娓呭崟*/ + private String subTableStr; + /**涓瀵瑰Tab椤哄簭*/ + private Integer tabOrder; + /** + * 琛ㄦ牸鍒楀睘鎬 + */ + private List columns; + + /**鏍戝舰鍒楄〃 鐖秈d鍒楀悕*/ + private java.lang.String treeParentIdFieldName; + /**鏍戝舰鍒楄〃 id鍒楀悕*/ + private java.lang.String treeIdFieldname; + /**鏍戝舰鍒楄〃 鑿滃崟鍒楀悕*/ + private java.lang.String treeFieldname; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="id",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 琛ㄦ牸鍚嶇О + */ + @Column(name ="table_name",nullable=false,length=50) + public java.lang.String getTableName(){ + return this.tableName; + } + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 琛ㄦ牸鍚嶇О + */ + public void setTableName(java.lang.String tableName){ + this.tableName = tableName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String dategrid鏄惁涓烘爲褰 + */ + @Column(name ="is_tree",nullable=false,length=5) + public java.lang.String getIsTree(){ + return this.isTree; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String dategrid鏄惁涓烘爲褰 + */ + public void setIsTree(java.lang.String isTree){ + this.isTree = isTree; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String datagrid鏄惁鍒嗛〉 + */ + @Column(name ="is_pagination",nullable=false,length=5) + public java.lang.String getIsPagination(){ + return this.isPagination; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String datagrid鏄惁鍒嗛〉 + */ + public void setIsPagination(java.lang.String isPagination){ + this.isPagination = isPagination; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁鍚屾浜嗘暟鎹簱 + */ + @Column(name ="is_dbsynch",nullable=false,length=20) + public java.lang.String getIsDbSynch(){ + return this.isDbSynch; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄惁鍚屾浜嗘暟鎹簱 + */ + public void setIsDbSynch(java.lang.String isDbSynch){ + this.isDbSynch = isDbSynch; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String datagrid鏄惁鏄剧ず澶嶉夋 + */ + @Column(name ="is_checkbox",nullable=false,length=5) + public java.lang.String getIsCheckbox(){ + return this.isCheckbox; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String datagrid鏄惁鏄剧ず澶嶉夋 + */ + public void setIsCheckbox(java.lang.String isCheckbox){ + this.isCheckbox = isCheckbox; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏌ヨ妯″紡锛歴ingle(鍗曟潯浠舵煡璇細榛樿),group(缁勫悎鏌ヨ) + */ + @Column(name ="querymode",nullable=false,length=10) + public java.lang.String getQuerymode(){ + return this.querymode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏌ヨ妯″紡锛歴ingle(鍗曟潯浠舵煡璇細榛樿),group(缁勫悎鏌ヨ) + */ + public void setQuerymode(java.lang.String querymode){ + this.querymode = querymode; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍔熻兘娉ㄩ噴 + */ + @Column(name ="content",nullable=false,length=200) + public java.lang.String getContent(){ + return this.content; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍔熻兘娉ㄩ噴 + */ + public void setContent(java.lang.String content){ + this.content = content; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + @Column(name ="create_date",nullable=true) + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜篒D + */ + @Column(name ="create_by",nullable=true,length=32) + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜篒D + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + @Column(name ="create_name",nullable=true,length=32) + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 淇敼鏃堕棿 + */ + @Column(name ="update_date",nullable=true) + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 淇敼鏃堕棿 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜篒D + */ + @Column(name ="update_by",nullable=true,length=32) + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜篒D + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜哄悕绉 + */ + @Column(name ="update_name",nullable=true,length=32) + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } + + @OneToMany(cascade=CascadeType.REMOVE,mappedBy="table") + @OrderBy(clause="orderNum asc") + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 琛ㄥ崟鐗堟湰鍙 + */ + @Column(name ="jform_version",nullable=false,length=10) + public java.lang.String getJformVersion() { + return jformVersion; + } + + public void setJformVersion(java.lang.String jformVersion) { + this.jformVersion = jformVersion; + } + /** + *鏂规硶: 鍙栧緱Integer + *1-鍗曡〃,2-涓昏〃,3-浠庤〃 + *@return: INteger 琛ㄥ崟绫诲瀷 + */ + @Column(name ="jform_type",nullable=false,length=1) + public Integer getJformType() { + return jformType; + } + + public void setJformType(Integer jformType) { + this.jformType = jformType; + } + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭绛栫暐 + */ + @Column(name ="jform_pk_type",nullable=true,length=100) + public java.lang.String getJformPkType() { + return jformPkType; + } + + public void setJformPkType(java.lang.String jformPkType) { + this.jformPkType = jformPkType; + } + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭绛栫暐-搴忓垪 + */ + @Column(name ="jform_pk_sequence",nullable=true,length=200) + public java.lang.String getJformPkSequence() { + return jformPkSequence; + } + + public void setJformPkSequence(java.lang.String jformPkSequence) { + this.jformPkSequence = jformPkSequence; + } + + @Column(name ="sub_table_str",nullable=true,length=1000) + public String getSubTableStr() { + return subTableStr; + } + + public void setSubTableStr(String subTableStr) { + this.subTableStr = subTableStr; + } + + /** + *鏂规硶: 鍙栧緱Integer + *0锛氫竴瀵瑰 1锛氫竴瀵逛竴 + *@return: INteger 闄勮〃鍏宠仈绫诲瀷 + */ + @Column(name ="relation_type",nullable=true,length=1) + public Integer getRelationType() { + return relationType; + } + + public void setRelationType(Integer relationType) { + this.relationType = relationType; + } + + @Column(name ="tab_order", nullable=true, length=1) + public Integer getTabOrder() { + return tabOrder; + } + + public void setTabOrder(Integer tabOrder) { + this.tabOrder = tabOrder; + } + + @Column(name ="tree_parentid_fieldname",nullable=true,length=50) + public java.lang.String getTreeParentIdFieldName() { + return treeParentIdFieldName; + } + + public void setTreeParentIdFieldName(java.lang.String treeParentIdFieldName) { + this.treeParentIdFieldName = treeParentIdFieldName; + } + + @Column(name ="tree_id_fieldname",nullable=true,length=50) + public java.lang.String getTreeIdFieldname() { + return treeIdFieldname; + } + + public void setTreeIdFieldname(java.lang.String treeIdFieldname) { + this.treeIdFieldname = treeIdFieldname; + } + + @Column(name ="tree_fieldname",nullable=true,length=50) + public java.lang.String getTreeFieldname() { + return treeFieldname; + } + + public void setTreeFieldname(java.lang.String treeFieldname) { + this.treeFieldname = treeFieldname; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/config/CgSubTableVO.java b/src/main/java/org/jeecgframework/web/cgform/entity/config/CgSubTableVO.java new file mode 100644 index 00000000..7be7f8e9 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/config/CgSubTableVO.java @@ -0,0 +1,81 @@ +package org.jeecgframework.web.cgform.entity.config; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * + * @Title:CgSubTableVO + * @description: + * @author 寮犱唬娴 + * @date Aug 24, 2013 11:33:33 AM + * @version V1.0 + */ +public class CgSubTableVO { + + CgFormHeadEntity head = new CgFormHeadEntity(); + + //涓瀵瑰浣跨敤 + List> fieldList = new ArrayList>(); + //涓瀵瑰銆佷竴瀵逛竴浣跨敤 + List> hiddenFieldList = new ArrayList>(); + + //涓瀵逛竴浣跨敤 + List> fieldNoAreaList = new ArrayList>(); + //涓瀵逛竴浣跨敤 + List> fieldAreaList = new ArrayList>(); + + + public CgFormHeadEntity getHead() { + return head; + } + + public void setHead(CgFormHeadEntity head) { + this.head = head; + } + + public List> getFieldList() { + return fieldList; + } + + public void setFieldList(List> fieldList) { + this.fieldList = fieldList; + for(Map map:fieldList){ + if("Y".equals((String)map.get("is_show"))){ + if("textarea".equals((String)map.get("show_type"))){ + this.fieldAreaList.add(map); + }else{ + this.fieldNoAreaList.add(map); + } + } + } + } + + public List> getHiddenFieldList() { + return hiddenFieldList; + } + + public void setHiddenFieldList(List> hiddenFieldList) { + this.hiddenFieldList = hiddenFieldList; + } + + public List> getFieldNoAreaList() { + return fieldNoAreaList; + } + + public void setFieldNoAreaList(List> fieldNoAreaList) { + this.fieldNoAreaList = fieldNoAreaList; + } + + public List> getFieldAreaList() { + return fieldAreaList; + } + + public void setFieldAreaList(List> fieldAreaList) { + this.fieldAreaList = fieldAreaList; + } + + + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/consts/DataBaseConst.java b/src/main/java/org/jeecgframework/web/cgform/entity/consts/DataBaseConst.java new file mode 100644 index 00000000..e8edafc2 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/consts/DataBaseConst.java @@ -0,0 +1,34 @@ +package org.jeecgframework.web.cgform.entity.consts; +/** + * 鏁版嵁搴撳父閲忔枃浠 + * @author JueYue + * @date 2013骞12鏈25鏃 + * @version 1.0 + */ +public class DataBaseConst { + + public final static String BIGDECIMAL = "BigDecimal"; + + public final static String BLOB = "Blob"; + + public final static String DATE = "Date"; + + public final static String DATETIME = "datetime"; + + public final static String DECIMAL = "decimal"; + + public final static String DOUBLE = "double"; + + public final static String INT = "int"; + + public final static String NUMBER = "number"; + + public final static String STRING = "string"; + + public final static String TEXT = "Text"; + + public final static String TEXTAREA = "textarea"; + + public final static String VARCHAR = "varchar"; + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/enhance/CgformEnhanceJsEntity.java b/src/main/java/org/jeecgframework/web/cgform/entity/enhance/CgformEnhanceJsEntity.java new file mode 100644 index 00000000..20b6bfa5 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/enhance/CgformEnhanceJsEntity.java @@ -0,0 +1,160 @@ +package org.jeecgframework.web.cgform.entity.enhance; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; + +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: JS澧炲己 + * @author 寮犱唬娴 + * @date 2013-08-11 09:47:30 + * @version V1.0 + * + */ +@Entity +@Table(name = "cgform_enhance_js", schema = "") +@SuppressWarnings("serial") +public class CgformEnhanceJsEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**formId*/ + private java.lang.String formId; + /**js澧炲己绫诲瀷锛坒orm/list锛*/ + private java.lang.String cgJsType; + /**澧炲己js*/ + private byte[] cgJs; + + /**澧炲己js Str*/ + private String cgJsStr; + + /**鎻忚堪*/ + private java.lang.String content; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String formId + */ + @Column(name ="FORM_ID",nullable=true,length=32) + public java.lang.String getFormId(){ + return this.formId; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String formId + */ + public void setFormId(java.lang.String formId){ + this.formId = formId; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String js澧炲己绫诲瀷锛坒orm/list锛 + */ + @Column(name ="CG_JS_TYPE",nullable=true,length=20) + public java.lang.String getCgJsType(){ + return this.cgJsType; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String js澧炲己绫诲瀷锛坒orm/list锛 + */ + public void setCgJsType(java.lang.String cgJsType){ + this.cgJsType = cgJsType; + } + /** + *鏂规硶: 鍙栧緱byte[] + *@return: byte[] 澧炲己js + */ + @Column(name ="CG_JS",nullable=true,length=65535) + public byte[] getCgJs(){ + return this.cgJs; + } + + /** + *鏂规硶: 璁剧疆byte[] + *@param: byte[] 澧炲己js + */ + public void setCgJs(byte[] cgJs){ + this.cgJs = cgJs; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎻忚堪 + */ + @Column(name ="CONTENT",nullable=true,length=1000) + public java.lang.String getContent(){ + return this.content; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎻忚堪 + */ + public void setContent(java.lang.String content){ + this.content = content; + } + + @Transient + public String getCgJsStr() { + if(cgJs!=null){ + cgJsStr = new String(cgJs); + } + return cgJsStr; + } + + public void setCgJsStr(String cgJsStr) { + this.cgJsStr = cgJsStr; + if(cgJsStr!=null){ + this.cgJs = cgJsStr.getBytes(); + } + } + + /** + * 娣卞害澶嶅埗 + * @return + * @throws Exception + */ + public CgformEnhanceJsEntity deepCopy() throws Exception{ + //灏嗚瀵硅薄搴忓垪鍖栨垚娴,鍥犱负鍐欏湪娴侀噷鐨勬槸瀵硅薄鐨勪竴涓嫹璐濓紝鑰屽師瀵硅薄浠嶇劧瀛樺湪浜嶫VM閲岄潰銆傛墍浠ュ埄鐢ㄨ繖涓壒鎬у彲浠ュ疄鐜板璞$殑娣辨嫹璐 + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(this); + + //灏嗘祦搴忓垪鍖栨垚瀵硅薄 + ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); + ObjectInputStream ois = new ObjectInputStream(bis); + return (CgformEnhanceJsEntity) ois.readObject(); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/generate/GenerateEntity.java b/src/main/java/org/jeecgframework/web/cgform/entity/generate/GenerateEntity.java new file mode 100644 index 00000000..287b0578 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/generate/GenerateEntity.java @@ -0,0 +1,202 @@ +package org.jeecgframework.web.cgform.entity.generate; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.cgform.entity.button.CgformButtonEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.entity.enhance.CgformEnhanceJsEntity; + +/** + * + * @Title:GenerateEntity + * @description:浠g爜鐢熸垚瀹炰綋 + * @author 璧典繆澶 + * @date Sep 7, 2013 1:10:18 PM + * @version V1.0 + */ +public class GenerateEntity implements java.io.Serializable{ + /** + * + */ + private static final long serialVersionUID = 7821940124097563556L; + private String entityPackage;// 鍖呭悕锛堝皬鍐欙級 + private String entityName;// 瀹炰綋鍚嶏紙棣栧瓧姣嶅ぇ鍐欙級 + private String tableName; // 琛ㄥ悕 + private String ftlDescription;// 鍔熻兘鎻忚堪 + private String primaryKeyPolicy = "uuid";// 涓婚敭鐢熸垚绛栫暐 + private String[] foreignKeys;// 瀛愯〃锛氬閿(涓棿閫楀彿闅斿紑) + private Integer fieldRowNum;// 涓琛屾斁鍑犱釜瀛楁 + private String projectPath;//宸ョ▼璺緞 + private String packageStyle;//浠g爜鍖呴鏍 + /* + * --------------鏅鸿兘琛ㄥ崟閰嶇疆 + */ + /** + * 琛ㄥ崟閰嶇疆鎶ご + */ + private CgFormHeadEntity cgFormHead; + /** + * 鎸夐挳閰嶇疆 + */ + private List buttons; + /** + * 鎸夐挳SQL澧炲己閰嶇疆 + */ + private Map buttonSqlMap; + /** + * 鍒楄〃JS澧炲己 + */ + private CgformEnhanceJsEntity listJs; + /** + * 琛ㄥ崟Js澧炲己 + */ + private CgformEnhanceJsEntity formJs; + + public String getEntityPackage() { + return entityPackage; + } + + public void setEntityPackage(String entityPackage) { + this.entityPackage = entityPackage; + } + + public String getEntityName() { + return entityName; + } + + public void setEntityName(String entityName) { + this.entityName = entityName; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getFtlDescription() { + return ftlDescription; + } + + public void setFtlDescription(String ftlDescription) { + this.ftlDescription = ftlDescription; + } + + public String getPrimaryKeyPolicy() { + return primaryKeyPolicy; + } + + public void setPrimaryKeyPolicy(String primaryKeyPolicy) { + this.primaryKeyPolicy = primaryKeyPolicy; + } + + public String[] getForeignKeys() { + return foreignKeys; + } + + public void setForeignKeys(String[] foreignKeys) { + this.foreignKeys = foreignKeys; + } + + public Integer getFieldRowNum() { + return fieldRowNum; + } + + public void setFieldRowNum(Integer fieldRowNum) { + this.fieldRowNum = fieldRowNum; + } + + public CgFormHeadEntity getCgFormHead() { + return cgFormHead; + } + + public void setCgFormHead(CgFormHeadEntity cgFormHead) { + this.cgFormHead = cgFormHead; + } + + public List getButtons() { + return buttons; + } + + public void setButtons(List buttons) { + this.buttons = buttons; + } + + + + public Map getButtonSqlMap() { + return buttonSqlMap; + } + + public void setButtonSqlMap(Map buttonSqlMap) { + this.buttonSqlMap = buttonSqlMap; + } + + public CgformEnhanceJsEntity getListJs() { + return listJs==null?new CgformEnhanceJsEntity():listJs; + } + + public void setListJs(CgformEnhanceJsEntity listJs) { + this.listJs = listJs; + } + + public CgformEnhanceJsEntity getFormJs() { + return formJs==null?new CgformEnhanceJsEntity():formJs; + } + + public void setFormJs(CgformEnhanceJsEntity formJs) { + this.formJs = formJs; + } + + public String getProjectPath() { + String pt = projectPath; + if(pt!=null){ + pt = pt.replace("\\", "/"); + if(!pt.endsWith("/")){ + pt = pt+"/"; + } + } + return pt; + } + + public void setProjectPath(String projectPath) { + this.projectPath = projectPath; + } + + + public String getPackageStyle() { + return packageStyle; + } + + public void setPackageStyle(String packageStyle) { + this.packageStyle = packageStyle; + } + + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + /** + * 娣卞害澶嶅埗 + * @return + * @throws Exception + */ + public GenerateEntity deepCopy() throws Exception{ + //灏嗚瀵硅薄搴忓垪鍖栨垚娴,鍥犱负鍐欏湪娴侀噷鐨勬槸瀵硅薄鐨勪竴涓嫹璐濓紝鑰屽師瀵硅薄浠嶇劧瀛樺湪浜嶫VM閲岄潰銆傛墍浠ュ埄鐢ㄨ繖涓壒鎬у彲浠ュ疄鐜板璞$殑娣辨嫹璐 + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(this); + + //灏嗘祦搴忓垪鍖栨垚瀵硅薄 + ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); + ObjectInputStream ois = new ObjectInputStream(bis); + return (GenerateEntity) ois.readObject(); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/generate/GenerateSubListEntity.java b/src/main/java/org/jeecgframework/web/cgform/entity/generate/GenerateSubListEntity.java new file mode 100644 index 00000000..70f706dd --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/generate/GenerateSubListEntity.java @@ -0,0 +1,55 @@ +package org.jeecgframework.web.cgform.entity.generate; + +import java.util.List; + +import org.jeecgframework.codegenerate.pojo.onetomany.SubTableEntity; +/** + * + * @Title:SubTableListEntity + * @description:浠g爜鐢熸垚涓瀵瑰妯″瀷 + * @author 璧典繆澶 + * @date Sep 7, 2013 3:42:09 PM + * @version V1.0 + */ +public class GenerateSubListEntity { + private String projectPath; + private String packageStyle; + /** + * 浠g爜鐢熸垚鐨勭墿鐞嗛厤缃 + */ + private List subTabParamIn; + + + public List getSubTabParamIn() { + return subTabParamIn; + } + + public void setSubTabParamIn(List subTabParamIn) { + this.subTabParamIn = subTabParamIn; + } + + public String getProjectPath() { + String pt = projectPath; + if(pt!=null){ + pt = pt.replace("\\", "/"); + if(!pt.endsWith("/")){ + pt = pt+"/"; + } + } + return pt; + } + + public void setProjectPath(String projectPath) { + this.projectPath = projectPath; + } + + public String getPackageStyle() { + return packageStyle; + } + + public void setPackageStyle(String packageStyle) { + this.packageStyle = packageStyle; + } + + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/entity/upload/CgUploadEntity.java b/src/main/java/org/jeecgframework/web/cgform/entity/upload/CgUploadEntity.java new file mode 100644 index 00000000..6e9db65d --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/entity/upload/CgUploadEntity.java @@ -0,0 +1,54 @@ +package org.jeecgframework.web.cgform.entity.upload; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.Table; + +import org.jeecgframework.web.system.pojo.base.TSAttachment; + +/** + * + * @Title:CgUploadEntity + * @description: 鏅鸿兘琛ㄥ崟鏂囦欢涓婁紶 + * @author 璧典繆澶 + * @date Jul 24, 2013 9:01:55 PM + * @version V1.0 + */ +@Entity +@Table(name = "cgform_uploadfiles", schema = "") +@PrimaryKeyJoinColumn(name = "id") +@SuppressWarnings("serial") +public class CgUploadEntity extends TSAttachment implements java.io.Serializable{ + + /**鑷畾涔夎〃鍚*/ + private String cgformName; + /**鑷畾涔夎〃鐨勪富閿*/ + private String cgformId; + /**鑷畾涔夎〃涓婁紶鎺т欢缁戝畾瀛楁*/ + private String cgformField; + + @Column(name ="CGFORM_ID",nullable=false,length=36) + public String getCgformId() { + return cgformId; + } + public void setCgformId(String cgformId) { + this.cgformId = cgformId; + } + @Column(name ="CGFORM_NAME",nullable=false,length=100) + public String getCgformName() { + return cgformName; + } + public void setCgformName(String cgformName) { + this.cgformName = cgformName; + } + @Column(name ="CGFORM_FIELD",nullable=false,length=100) + public String getCgformField() { + return cgformField; + } + public void setCgformField(String cgformField) { + this.cgformField = cgformField; + } + + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/exception/BusinessException.java b/src/main/java/org/jeecgframework/web/cgform/exception/BusinessException.java new file mode 100644 index 00000000..82f80509 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/exception/BusinessException.java @@ -0,0 +1,10 @@ +package org.jeecgframework.web.cgform.exception; + +@SuppressWarnings("serial") +public class BusinessException extends Exception { + + public BusinessException(String msg) + { + super(msg); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/exception/DBException.java b/src/main/java/org/jeecgframework/web/cgform/exception/DBException.java new file mode 100644 index 00000000..c85c907f --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/exception/DBException.java @@ -0,0 +1,10 @@ +package org.jeecgframework.web.cgform.exception; + +@SuppressWarnings("serial") +public class DBException extends Exception { + + public DBException(String msg) + { + super(msg); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/interceptors/CgFormVersionInterceptor.java b/src/main/java/org/jeecgframework/web/cgform/interceptors/CgFormVersionInterceptor.java new file mode 100644 index 00000000..327efe1f --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/interceptors/CgFormVersionInterceptor.java @@ -0,0 +1,70 @@ +package org.jeecgframework.web.cgform.interceptors; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.interceptors.AuthInterceptor; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +/** + * + * @author 寮犱唬娴 + * + */ +public class CgFormVersionInterceptor implements HandlerInterceptor { + private List includeUrls; + + private static final Logger logger = Logger.getLogger(AuthInterceptor.class); + @Autowired + private CgFormFieldServiceI cgFormFieldService; + + public void afterCompletion(HttpServletRequest arg0, + HttpServletResponse arg1, Object arg2, Exception arg3) + throws Exception { + String requestPath = ResourceUtil.getRequestPath(arg0);// 鐢ㄦ埛璁块棶鐨勮祫婧愬湴鍧 + if(!includeUrls.contains(requestPath)){ + return; + } + //鑾峰彇琛ㄥ崟ID + String formId = arg0.getParameter("formId"); + if(StringUtil.isEmpty(formId)){ + return; + }else{ + try{ + cgFormFieldService.updateVersion(formId); + }catch (Exception e) { + e.printStackTrace(); + logger.debug(e.getMessage()); + } + } + } + + + public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, + Object arg2, ModelAndView arg3) throws Exception { + } + + + public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, + Object arg2) throws Exception { + return true; + } + + public List getIncludeUrls() { + return includeUrls; + } + + public void setIncludeUrls(List includeUrls) { + this.includeUrls = includeUrls; + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/pojo/config/CgFormFieldPojo.java b/src/main/java/org/jeecgframework/web/cgform/pojo/config/CgFormFieldPojo.java new file mode 100644 index 00000000..2e1b3f09 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/pojo/config/CgFormFieldPojo.java @@ -0,0 +1,492 @@ +package org.jeecgframework.web.cgform.pojo.config; + +/** + * @Title: Entity + * @Description: 鑷姩鐢熸垚琛ㄧ殑鍒楀睘鎬 + * @author jueyue + * @date 2013-06-30 11:37:32 + * @version V1.0 + * + */ +@SuppressWarnings("serial") +public class CgFormFieldPojo implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**瀛楁鍚嶇О*/ + private java.lang.String fieldName; + /**鍏宠仈鐨勮〃*/ + private String tableId; + /**瀛楁闀垮害*/ + private java.lang.Integer length; + /**灏忔暟鐐归暱搴*/ + private java.lang.Integer pointLength; + /**瀛楁绫诲瀷*/ + private java.lang.String type; + /**鏄惁鍏佽绌哄*/ + private java.lang.String isNull; + /**鍦ㄨ〃涓殑椤哄簭*/ + private java.lang.Integer orderNum; + /**鏄惁涓婚敭*/ + private java.lang.String isKey; + /**鏄惁鏄剧ず*/ + private java.lang.String isShow; + /**鏄惁鍦ㄥ垪琛ㄤ笂鏄剧ず*/ + private java.lang.String isShowList; + /**鏄剧ず绫诲瀷*/ + private java.lang.String showType; + /**鏄惁鐢熶骇鏌ヨ瀛楁*/ + private java.lang.String isQuery; + /**鎺т欢闀垮害*/ + private java.lang.Integer fieldLength; + /**瀛楁Href*/ + private java.lang.String fieldHref; + /**鎺т欢鏍¢獙*/ + private java.lang.String fieldValidType; + /**鏌ヨ绫诲瀷single(榛樿锛氬崟瀛楁鏌ヨ),group(鑼冨洿鏌ヨ)*/ + private java.lang.String queryMode; + /**鍔熻兘娉ㄩ噴*/ + private java.lang.String content; + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDate; + /**鍒涘缓浜篒D*/ + private java.lang.String createBy; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**淇敼鏃堕棿*/ + private java.util.Date updateDate; + /**淇敼浜篒D*/ + private java.lang.String updateBy; + /**淇敼浜哄悕绉*/ + private java.lang.String updateName; + /**瀛楀吀Code*/ + private java.lang.String dictField; + /**瀛楀吀Table*/ + private java.lang.String dictTable; + /**瀛楀吀Text*/ + private java.lang.String dictText; + /**涓昏〃鍚*/ + private java.lang.String mainTable; + /**涓昏〃瀛楁*/ + private java.lang.String mainField; + /**鏃х殑瀛楁鍚嶇О*/ + private java.lang.String oldFieldName; + /**瀛楁榛樿鍊*/ + private java.lang.String fieldDefault; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 瀛楁鍚嶇О + */ + public java.lang.String getFieldName(){ + return this.fieldName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 瀛楁鍚嶇О + */ + public void setFieldName(java.lang.String fieldName){ + this.fieldName = fieldName; + } + /** + *鏂规硶: 鍙栧緱TablePropertyEntity + *@return: TablePropertyEntity 鍏宠仈鐨勮〃锛╋激 + */ + public String getTableId(){ + return this.tableId; + } + + /** + *鏂规硶: 璁剧疆TablePropertyEntity + *@param: TablePropertyEntity 鍏宠仈鐨勮〃ID + */ + public void setTableId(String tableId){ + this.tableId = tableId; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 瀛楁闀垮害 + */ + public java.lang.Integer getLength(){ + return this.length; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 瀛楁闀垮害 + */ + public void setLength(java.lang.Integer length){ + this.length = length; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 灏忔暟鐐归暱搴 + */ + public java.lang.Integer getPointLength(){ + return this.pointLength; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 灏忔暟鐐归暱搴 + */ + public void setPointLength(java.lang.Integer pointLength){ + this.pointLength = pointLength; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 瀛楁绫诲瀷 + */ + public java.lang.String getType(){ + return this.type; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 瀛楁绫诲瀷 + */ + public void setType(java.lang.String type){ + this.type = type; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁鍏佽绌哄 + */ + public java.lang.String getIsNull(){ + return this.isNull; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄惁鍏佽绌哄 + */ + public void setIsNull(java.lang.String isNull){ + this.isNull = isNull; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁鏄剧ず + */ + public java.lang.String getIsShow(){ + return this.isShow; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄惁鏄剧ず + */ + public void setIsShow(java.lang.String isShow){ + this.isShow = isShow; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄剧ず绫诲瀷 + */ + public java.lang.String getShowType(){ + return this.showType; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄剧ず绫诲瀷 + */ + public void setShowType(java.lang.String showType){ + this.showType = showType; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁鐢熶骇鏌ヨ瀛楁 + */ + public java.lang.String getIsQuery(){ + return this.isQuery; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄惁鐢熶骇鏌ヨ瀛楁 + */ + public void setIsQuery(java.lang.String isQuery){ + this.isQuery = isQuery; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏌ヨ绫诲瀷single(榛樿锛氬崟瀛楁鏌ヨ),group(鑼冨洿鏌ヨ) + */ + public java.lang.String getQueryMode(){ + return this.queryMode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏌ヨ绫诲瀷single(榛樿锛氬崟瀛楁鏌ヨ),group(鑼冨洿鏌ヨ) + */ + public void setQueryMode(java.lang.String queryMode){ + this.queryMode = queryMode; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍔熻兘娉ㄩ噴 + */ + public java.lang.String getContent(){ + return this.content; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍔熻兘娉ㄩ噴 + */ + public void setContent(java.lang.String content){ + this.content = content; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜篒D + */ + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜篒D + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 淇敼鏃堕棿 + */ + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 淇敼鏃堕棿 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜篒D + */ + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜篒D + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜哄悕绉 + */ + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍦ㄨ〃涓殑椤哄簭 + */ + public java.lang.Integer getOrderNum() { + return orderNum; + } + + public void setOrderNum(java.lang.Integer orderNum) { + this.orderNum = orderNum; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁涓轰富閿 + */ + public java.lang.String getIsKey() { + return isKey; + } + + public void setIsKey(java.lang.String isKey) { + this.isKey = isKey; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 鎺т欢闀垮害 + */ + public java.lang.Integer getFieldLength() { + return fieldLength; + } + + public void setFieldLength(java.lang.Integer field_length) { + this.fieldLength = field_length; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 瀛楁Href + */ + public java.lang.String getFieldHref() { + return fieldHref; + } + + public void setFieldHref(java.lang.String field_href) { + this.fieldHref = field_href; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎺т欢鏍¢獙 + */ + public java.lang.String getFieldValidType() { + return fieldValidType; + } + + public void setFieldValidType(java.lang.String field_valid_type) { + this.fieldValidType = field_valid_type; + } + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 瀛楀吀Code + * */ + public java.lang.String getDictField() { + return dictField; + } + + public void setDictField(java.lang.String dictField) { + this.dictField = dictField; + } + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 瀛楀吀Table + * */ + public java.lang.String getDictTable() { + return dictTable; + } + + public void setDictTable(java.lang.String dictTable) { + this.dictTable = dictTable; + } + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 涓昏〃鍚嶇О + * */ + public java.lang.String getMainTable() { + return mainTable; + } + + public void setMainTable(java.lang.String mainTable) { + this.mainTable = mainTable; + } + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 涓昏〃鍚嶇О + * */ + public java.lang.String getMainField() { + return mainField; + } + + public void setMainField(java.lang.String mainField) { + this.mainField = mainField; + } + + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 涓昏〃鍚嶇О + * */ + public java.lang.String getOldFieldName() { + return oldFieldName; + } + + public void setOldFieldName(java.lang.String oldFieldName) { + this.oldFieldName = oldFieldName; + } + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 鏄惁鍦ㄥ垪琛ㄤ笂鏄剧ず + * */ + public java.lang.String getIsShowList() { + return isShowList; + } + + public void setIsShowList(java.lang.String isShowList) { + this.isShowList = isShowList; + } + /** + * 鏂规硶: 鍙栧緱 java.lang.String + * @return 瀛楀吀鏂囨湰 + * */ + public java.lang.String getDictText() { + return dictText; + } + + public void setDictText(java.lang.String dictText) { + this.dictText = dictText; + } + + public java.lang.String getFieldDefault() { + if (fieldDefault != null) { + fieldDefault = fieldDefault.trim(); + } + return fieldDefault; + } + + public void setFieldDefault(java.lang.String fieldDefault) { + this.fieldDefault = fieldDefault; + } + + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/pojo/config/CgFormHeadPojo.java b/src/main/java/org/jeecgframework/web/cgform/pojo/config/CgFormHeadPojo.java new file mode 100644 index 00000000..287bd5d1 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/pojo/config/CgFormHeadPojo.java @@ -0,0 +1,343 @@ +package org.jeecgframework.web.cgform.pojo.config; + + +/** + * @Title: Entity + * @Description: 鑷姩鐢熸垚琛ㄥ睘鎬 + * @author jueyue + * @date 2013-06-30 11:36:53 + * @version V1.0 + * + */ +@SuppressWarnings("serial") +public class CgFormHeadPojo implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**琛ㄦ牸鍚嶇О*/ + private java.lang.String tableName; + /**dategrid鏄惁涓烘爲褰*/ + private java.lang.String isTree; + /**datagrid鏄惁鍒嗛〉*/ + private java.lang.String isPagination; + /**鏄惁鍚屾浜嗘暟鎹簱*/ + private java.lang.String isDbsynch; + /**datagrid鏄惁鏄剧ず澶嶉夋*/ + private java.lang.String isCheckbox; + /**鏌ヨ妯″紡锛歴ingle(鍗曟潯浠舵煡璇細榛樿),group(缁勫悎鏌ヨ)*/ + private java.lang.String querymode; + /**鍔熻兘娉ㄩ噴*/ + private java.lang.String content; + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDate; + /**鍒涘缓浜篒D*/ + private java.lang.String createBy; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**淇敼鏃堕棿*/ + private java.util.Date updateDate; + /**淇敼浜*/ + private java.lang.String updateBy; + /**淇敼浜哄悕绉*/ + private java.lang.String updateName; + /**琛ㄥ崟鐗堟湰*/ + private java.lang.String jformVersion; + /**琛ㄥ崟绫诲瀷*/ + private Integer jformType; + /**琛ㄥ崟涓婚敭绛栫暐*/ + private java.lang.String jformPkType; + /**琛ㄥ崟涓婚敭绛栫暐-搴忓垪(閽堝oracle绛夋暟鎹簱)*/ + private java.lang.String jformPkSequence; + /**闄勮〃鍏宠仈绫诲瀷*/ + private Integer relationType; + /**闄勮〃娓呭崟*/ + private String subTableStr; + /**涓瀵瑰Tab椤哄簭*/ + private Integer tabOrder; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 琛ㄦ牸鍚嶇О + */ + public java.lang.String getTableName(){ + return this.tableName; + } + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 琛ㄦ牸鍚嶇О + */ + public void setTableName(java.lang.String tableName){ + this.tableName = tableName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String dategrid鏄惁涓烘爲褰 + */ + public java.lang.String getIsTree(){ + return this.isTree; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String dategrid鏄惁涓烘爲褰 + */ + public void setIsTree(java.lang.String isTree){ + this.isTree = isTree; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String datagrid鏄惁鍒嗛〉 + */ + public java.lang.String getIsPagination(){ + return this.isPagination; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String datagrid鏄惁鍒嗛〉 + */ + public void setIsPagination(java.lang.String isPagination){ + this.isPagination = isPagination; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁鍚屾浜嗘暟鎹簱 + */ + public java.lang.String getIsDbsynch(){ + return this.isDbsynch; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄惁鍚屾浜嗘暟鎹簱 + */ + public void setIsDbsynch(java.lang.String isDbsynch){ + this.isDbsynch = isDbsynch; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String datagrid鏄惁鏄剧ず澶嶉夋 + */ + public java.lang.String getIsCheckbox(){ + return this.isCheckbox; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String datagrid鏄惁鏄剧ず澶嶉夋 + */ + public void setIsCheckbox(java.lang.String isCheckbox){ + this.isCheckbox = isCheckbox; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏌ヨ妯″紡锛歴ingle(鍗曟潯浠舵煡璇細榛樿),group(缁勫悎鏌ヨ) + */ + public java.lang.String getQuerymode(){ + return this.querymode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏌ヨ妯″紡锛歴ingle(鍗曟潯浠舵煡璇細榛樿),group(缁勫悎鏌ヨ) + */ + public void setQuerymode(java.lang.String querymode){ + this.querymode = querymode; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍔熻兘娉ㄩ噴 + */ + public java.lang.String getContent(){ + return this.content; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍔熻兘娉ㄩ噴 + */ + public void setContent(java.lang.String content){ + this.content = content; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜篒D + */ + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜篒D + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 淇敼鏃堕棿 + */ + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 淇敼鏃堕棿 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜篒D + */ + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜篒D + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜哄悕绉 + */ + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 琛ㄥ崟鐗堟湰鍙 + */ + public java.lang.String getJformVersion() { + return jformVersion; + } + + public void setJformVersion(java.lang.String jformVersion) { + this.jformVersion = jformVersion; + } + /** + *鏂规硶: 鍙栧緱Integer + *1-鍗曡〃,2-涓昏〃,3-浠庤〃 + *@return: INteger 琛ㄥ崟绫诲瀷 + */ + public Integer getJformType() { + return jformType; + } + + public void setJformType(Integer jformType) { + this.jformType = jformType; + } + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭绛栫暐 + */ + public java.lang.String getJformPkType() { + return jformPkType; + } + + public void setJformPkType(java.lang.String jformPkType) { + this.jformPkType = jformPkType; + } + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭绛栫暐-搴忓垪 + */ + public java.lang.String getJformPkSequence() { + return jformPkSequence; + } + + public void setJformPkSequence(java.lang.String jformPkSequence) { + this.jformPkSequence = jformPkSequence; + } + + public String getSubTableStr() { + return subTableStr; + } + + public void setSubTableStr(String subTableStr) { + this.subTableStr = subTableStr; + } + + /** + *鏂规硶: 鍙栧緱Integer + *0锛氫竴瀵瑰 1锛氫竴瀵逛竴 + *@return: INteger 闄勮〃鍏宠仈绫诲瀷 + */ + public Integer getRelationType() { + return relationType; + } + + public void setRelationType(Integer relationType) { + this.relationType = relationType; + } + + public Integer getTabOrder() { + return tabOrder; + } + + public void setTabOrder(Integer tabOrder) { + this.tabOrder = tabOrder; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/autolist/CgTableServiceI.java b/src/main/java/org/jeecgframework/web/cgform/service/autolist/CgTableServiceI.java new file mode 100644 index 00000000..fb776ebc --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/autolist/CgTableServiceI.java @@ -0,0 +1,71 @@ +package org.jeecgframework.web.cgform.service.autolist; + +import java.util.List; +import java.util.Map; +/** + * + * @Title:CgTableServiceI + * @description:鍔ㄦ佽〃鏈嶅姟鎺ュ彛 + * @author 璧典繆澶 + * @date Jul 5, 2013 3:01:55 PM + * @version V1.0 + */ +public interface CgTableServiceI { + /** + * 鍗曡〃鏉′欢鍒嗛〉鏌ヨ + * @param table 琛 + * @param field 瀛楁锛堜互閫楀彿鍒嗛殧锛 + * @param params 鏌ヨ鏉′欢 + * @param page 鍒嗛〉 + * @param rows 椤甸潰澶у皬 + * @return + */ + public List querySingle(String table,String field,Map params, int page,int rows); + /** + * 鍗曡〃鏉′欢鍒嗛〉鏌ヨ+鎺掑簭 + * @param table 琛 + * @param field 瀛楁锛堜互閫楀彿鍒嗛殧锛 + * @param params 鏌ヨ鏉′欢 + * @param sort 鎺掑簭瀛楁 + * @param order 鎺掑簭瑙勫垯 + * @param page 鍒嗛〉 + * @param rows 椤甸潰澶у皬 + * @return + */ + public List querySingle(String table,String field,Map params,String sort,String order, int page,int rows); + /** + * 鑾峰緱鏁版嵁澶у皬 + * @param table 琛 + * @param field 瀛楁锛堜互閫楀彿鍒嗛殧锛 + * @param params 鏌ヨ鏉′欢 + * @param page 鍒嗛〉 + * @param rows 椤甸潰澶у皬 + * @return + */ + public Long getQuerySingleSize(String table,String field,Map params); + /** + * 鍒犻櫎鍗曟潯鏁版嵁 + * @param table 琛 + * @param id 涓婚敭 + * @return + */ + public boolean delete(String table,Object id); + /** + * 鍒犻櫎澶氭潯鏁版嵁 + * @param table 琛 + * @param ids 涓婚敭涓,浠ラ楀彿鍒嗛殧 + * @return + */ + public boolean deleteBatch(String table,String[] ids); + + /** + * 鏍戝舰鑿滃崟缁撴灉澶勭悊 + * @param table + * @param parentIdFieldName + * @param parentIdFieldType + * @param result + */ + public void treeFromResultHandle(String table, String parentIdFieldName, + String parentIdFieldType, List> result); + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/autolist/ConfigServiceI.java b/src/main/java/org/jeecgframework/web/cgform/service/autolist/ConfigServiceI.java new file mode 100644 index 00000000..53f85c83 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/autolist/ConfigServiceI.java @@ -0,0 +1,19 @@ +package org.jeecgframework.web.cgform.service.autolist; + +import java.util.Map; +/** + * + * @Title:ConfigServiceI + * @description:鍔ㄦ侀厤缃湇鍔℃帴鍙 + * @author 璧典繆澶 + * @date Jul 5, 2013 3:02:11 PM + * @version V1.0 + */ +public interface ConfigServiceI { + /** + * 璇诲彇鍔ㄦ佽〃閰嶇疆 + * @param configId 鏍囩ず閰嶇疆鐨刬d + * @return + */ + public Map queryConfigs(String configId,String jversion); +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/build/DataBaseService.java b/src/main/java/org/jeecgframework/web/cgform/service/build/DataBaseService.java new file mode 100644 index 00000000..24d73772 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/build/DataBaseService.java @@ -0,0 +1,32 @@ +package org.jeecgframework.web.cgform.service.build; + +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.cgform.exception.BusinessException; + +/** + * + * @author 寮犱唬娴 + * + */ +public interface DataBaseService { + + public int insertTable(String tableName, Map data); + + public int updateTable(String tableName,Object id, Map data); + + public Map findOneForJdbc(String tableName, String id); + + public Map insertTableMore(Map>> mapMore,String mainTableName) throws BusinessException; + + public boolean updateTableMore(Map>> mapMore,String mainTableName) throws BusinessException; + + /** + * sql涓氬姟澧炲己 + * + */ + public void executeSqlExtend(String formId,String buttonCode,Map data); + + public Object getPkValue(String tableName); +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/button/CgformButtonServiceI.java b/src/main/java/org/jeecgframework/web/cgform/service/button/CgformButtonServiceI.java new file mode 100644 index 00000000..30ab89d9 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/button/CgformButtonServiceI.java @@ -0,0 +1,31 @@ +package org.jeecgframework.web.cgform.service.button; + +import java.util.List; + +import org.jeecgframework.web.cgform.entity.button.CgformButtonEntity; + +import org.jeecgframework.core.common.service.CommonService; + +/** + * + * @author 寮犱唬娴 + * + */ +public interface CgformButtonServiceI extends CommonService{ + + /** + * 鏌ヨ鎸夐挳list + * @param formId + * @return + */ + public List getCgformButtonListByFormId(String formId); + + /** + * 鏍¢獙鎸夐挳鍞竴鎬 + * @param cgformButtonEntity + * @return + */ + public List checkCgformButton(CgformButtonEntity cgformButtonEntity); + + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/button/CgformButtonSqlServiceI.java b/src/main/java/org/jeecgframework/web/cgform/service/button/CgformButtonSqlServiceI.java new file mode 100644 index 00000000..3ad381c9 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/button/CgformButtonSqlServiceI.java @@ -0,0 +1,26 @@ +package org.jeecgframework.web.cgform.service.button; + +import java.util.List; + +import org.jeecgframework.web.cgform.entity.button.CgformButtonEntity; +import org.jeecgframework.web.cgform.entity.button.CgformButtonSqlEntity; + +import org.jeecgframework.core.common.service.CommonService; + +public interface CgformButtonSqlServiceI extends CommonService{ + + /** + * 鏍¢獙鎸夐挳sql澧炲己鍞竴鎬 + * @param cgformButtonEntity + * @return + */ + public List checkCgformButtonSql(CgformButtonSqlEntity cgformButtonSqlEntity); + + /** + * 鏍规嵁buttonCode鍜宖ormId鍒濆鍖栨暟鎹 + * @param buttonCode + * @param formId + * @return + */ + public CgformButtonSqlEntity getCgformButtonSqlByCodeFormId(String buttonCode,String formId); +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/cgformcategory/CgformCategoryServiceI.java b/src/main/java/org/jeecgframework/web/cgform/service/cgformcategory/CgformCategoryServiceI.java new file mode 100644 index 00000000..8012d34c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/cgformcategory/CgformCategoryServiceI.java @@ -0,0 +1,7 @@ +package org.jeecgframework.web.cgform.service.cgformcategory; + +import org.jeecgframework.core.common.service.CommonService; + +public interface CgformCategoryServiceI extends CommonService{ + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/cgformftl/CgformFtlServiceI.java b/src/main/java/org/jeecgframework/web/cgform/service/cgformftl/CgformFtlServiceI.java new file mode 100644 index 00000000..590e7787 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/cgformftl/CgformFtlServiceI.java @@ -0,0 +1,42 @@ +package org.jeecgframework.web.cgform.service.cgformftl; + +import org.jeecgframework.core.common.service.CommonService; + +import java.util.Map; + +public interface CgformFtlServiceI extends CommonService{ + /** + * 鏍规嵁tableName鑾峰彇form妯℃澘淇℃伅 + *
  • 鏍规嵁 ftlVersion 鐨勫艰幏鍙栨ā鏉匡紝濡傛灉璇ュ弬鏁颁负绌猴紝鍒欓粯璁ゅ彇绗竴涓縺娲荤殑妯℃澘
  • + * @param tableName tableName + * @param ftlVersion ftlVersion + * @return form妯℃澘淇℃伅 + */ + public Map getCgformFtlByTableName(String tableName, String ftlVersion); + + /** + * 鏍规嵁tableName鑾峰彇form妯℃澘淇℃伅 + */ + public Map getCgformFtlByTableName(String tableName); + + /** + * 鑾峰緱鏂板鏁版嵁鐨勭増鏈彿 + * @param cgformId + * @return + */ + public int getNextVarsion(String cgformId); + + /** + * 鏄惁鏈夊凡缁忔縺娲荤殑妯℃澘 + * @param cgformId + * @return + */ + public boolean hasActive(String cgformId); + /** + * 鑾峰彇鐢ㄦ埛鑷畾涔夋ā鏉跨殑HTML,婵娲荤殑 + * @param id + * @return + */ + public String getUserFormFtl(String id); + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/config/CgFormFieldServiceI.java b/src/main/java/org/jeecgframework/web/cgform/service/config/CgFormFieldServiceI.java new file mode 100644 index 00000000..7d8a43a6 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/config/CgFormFieldServiceI.java @@ -0,0 +1,188 @@ +package org.jeecgframework.web.cgform.service.config; + +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.exception.BusinessException; + +import org.jeecgframework.core.common.service.CommonService; + +public interface CgFormFieldServiceI extends CommonService { + /** + * 鏇存柊琛 + * + * @param t + */ + void updateTable(CgFormHeadEntity t, String sign); + + /** + * 鍒涘缓琛 + * + * @param tableProperty + */ + void saveTable(CgFormHeadEntity tableProperty); + + /** + * 閲嶈浇鍒涘缓琛 + * + * @param cgFormHead + * @param a + */ + public void saveTable(CgFormHeadEntity cgFormHead, String a); + + /** + * 鍒ゆ柇琛ㄦ槸涓嶆槸鍐嶆暟鎹簱涓瓨鍦ㄤ簡 + * + * @param tableName + * @return + */ + Boolean judgeTableIsExit(String tableName); + + /** + * 鍚屾鏁版嵁搴 + * @param synMethod + * + * @return + */ + public boolean dbSynch(CgFormHeadEntity cgFormHead, String synMethod) + throws BusinessException; + + /** + * 鍒犻櫎杩欎釜閰嶇疆琛ㄥ崟 杩炲悓琛 + * + * @param cgFormHead + */ + void deleteCgForm(CgFormHeadEntity cgFormHead); + + /** + * 鏍规嵁tablename 鑾峰彇琛ㄥ崟閰嶇疆 + * + * @return + */ + public List> getCgFormFieldByTableName(String tableName); + + /** + * 鏍规嵁formid 鑾峰彇琛ㄥ崟瀛楁閰嶇疆 + * + * @return + */ + public Map getCgFormFieldByFormId(String formid); + + /** + * 鏍规嵁tableName 鑾峰彇琛ㄥ崟閰嶇疆 + * + * @return + */ + public CgFormHeadEntity getCgFormHeadByTableName(String tableName); + + /** + * 鏍规嵁tableName 鑾峰彇琛ㄥ崟鎵鏈夐厤缃俊鎭 + * + * @return + */ + public Map getAllCgFormFieldByTableName( + String tableName); + + /** + * 鏍规嵁tableName 鑾峰彇琛ㄥ崟鎵鏈夐厤缃俊鎭(缂撳瓨) + * + * @return + */ + public Map getAllCgFormFieldByTableName( + String tableName, String version); + + /** + * 鏍规嵁tableName 鑾峰彇琛ㄥ崟鎵鏈塰idden閰嶇疆淇℃伅 + * + * @return + */ + public List getHiddenCgFormFieldByTableName( + String tableName); + + /** + * 鑾峰彇涓昏〃鍏宠仈鐨勯檮琛ㄧ殑淇℃伅 + * + * @return + */ + public List> getSubTableData(String mainTableName, + String subTableName, Object mainTableId); + + /** + * 鏇存柊涓昏〃鐨勯檮琛ㄤ覆-鐢ㄤ簬琛ㄩ厤缃彁浜ゆ椂璋冪敤 + * + * @author 璧典繆澶 + * @param entity + * 琛ㄥ崟閰嶇疆 + * @return 鏇存柊鏄惁鎴愬姛 + */ + public boolean appendSubTableStr4Main(CgFormHeadEntity entity); + + /** + * 鍓旈櫎涓昏〃鐨勯檮琛ㄤ覆-鐢ㄤ簬琛ㄩ厤缃慨鏀规椂璋冪敤 + * + * @author 璧典繆澶 + * @param entity + * 琛ㄥ崟閰嶇疆 + * @return 鏇存柊鏄惁鎴愬姛 + */ + public boolean removeSubTableStr4Main(CgFormHeadEntity entity); + + /** + * 鎸塼abOrder鎺掑簭subTableStr + * + * @author fancq + * @param entity + */ + public void sortSubTableStr(CgFormHeadEntity entity); + + /** + * 鑾峰彇琛ㄥ崟鐨勭増鏈彿 + * + * @param tableName + * 琛ㄥ崟鍚 + * @return + */ + public String getCgFormVersionByTableName(String tableName); + + /** + * 鑾峰彇琛ㄥ崟鐨勭増鏈彿 + * + * @param id + * 琛ㄥ崟id + * @return + */ + public String getCgFormVersionById(String id); + + /** + * 鏇存柊琛ㄥ崟鐨勭増鏈彿 + * + * @return + */ + public boolean updateVersion(String formId); + + /** + * 鑾峰彇琛ㄥ崟閰嶇疆 + * + * @param tableName + * @param version + * @return + */ + public Map getFtlFormConfig(String tableName, String version); + + /** + * 鏍规嵁tableName 鑾峰彇琛ㄥ崟閰嶇疆 鏍规嵁鐗堟湰鍙风紦瀛 + * + * @return + */ + public CgFormHeadEntity getCgFormHeadByTableName(String tableName, + String version); + /** + * 鍒ゆ柇鏁版嵁琛ㄦ槸鍚﹀瓨鍦 + * @param tableName + * @return + */ + public boolean checkTableExist(String tableName); + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/config/DbTableHandleI.java b/src/main/java/org/jeecgframework/web/cgform/service/config/DbTableHandleI.java new file mode 100644 index 00000000..8c630fa2 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/config/DbTableHandleI.java @@ -0,0 +1,62 @@ +package org.jeecgframework.web.cgform.service.config; + +import org.jeecgframework.web.cgform.exception.DBException; +import org.jeecgframework.web.cgform.service.impl.config.util.ColumnMeta; + +public interface DbTableHandleI { + /** + * + * @param columnMeta + * @return + */ +// String getUpdateFieldDesc(ColumnMeta columnMeta,ColumnMeta datacolumnMeta); + /** + * + * @param columnMeta + * @return + */ + String getAddColumnSql(ColumnMeta columnMeta); + /** + * + * @param columnMeta + * @return + */ + String getReNameFieldName(ColumnMeta columnMeta); + /** + * 淇敼瀛楁 + * @param cgformcolumnMeta form鐨勮嚜鍔ㄩ厤缃俊鎭 + * @param datacolumnMeta 鏁版嵁搴撹〃鐨勫瓧娈典俊鎭 + * @return + */ + String getUpdateColumnSql(ColumnMeta cgformcolumnMeta,ColumnMeta datacolumnMeta) throws DBException; + /** + * 鏍规嵁鏁版嵁绫诲瀷杞崲绫荤被鍨 + * @return + */ + String getMatchClassTypeByDataType(String dataType,int digits); + /** + * 鍒犻櫎琛 + * @param tableName + * @return + */ + String dropTableSQL(String tableName); + /** + * 鍒犻櫎瀛楁 + * @param fieldName + * @return + */ + String getDropColumnSql(String fieldName); + /** + * 娣诲姞娉ㄩ噴 + *@param columnMeta + *@return + */ + String getCommentSql(ColumnMeta columnMeta); + /** + * 澶勭悊鐗规畩sql + * @param cgformcolumnMeta + * @param datacolumnMeta + * @return + */ + String getSpecialHandle(ColumnMeta cgformcolumnMeta,ColumnMeta datacolumnMeta); +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/config/DbTableServiceI.java b/src/main/java/org/jeecgframework/web/cgform/service/config/DbTableServiceI.java new file mode 100644 index 00000000..fe06d712 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/config/DbTableServiceI.java @@ -0,0 +1,43 @@ +package org.jeecgframework.web.cgform.service.config; + +import org.springframework.jdbc.core.JdbcTemplate; + +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; + + +/** + * 琛ㄧ殑鎿嶄綔 + * @author jueyue + * + */ +public interface DbTableServiceI { + + /** + * 鍒涘缓琛 + * @param tableProperty + * @return SQL + */ + String createTableSQL(CgFormHeadEntity tableProperty); + + /** + * 鍒犻櫎琛 + * @param tableProperty + * @return SQL + */ + String dropTableSQL(CgFormHeadEntity tableProperty); + /** + * 鍒ゆ柇琛ㄦ牸鏄惁瀛樺湪 + * @param tableName + * @return SQL + */ + String createIsExitSql(String tableName); + /** + * 鏇存柊琛 + * @param cgFormHead + * @param jdbcTemplate + * @return SQL + */ + String updateTableSQL(CgFormHeadEntity cgFormHead, JdbcTemplate jdbcTemplate); + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/enhance/CgformEnhanceJsServiceI.java b/src/main/java/org/jeecgframework/web/cgform/service/enhance/CgformEnhanceJsServiceI.java new file mode 100644 index 00000000..bc3a6eb8 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/enhance/CgformEnhanceJsServiceI.java @@ -0,0 +1,16 @@ +package org.jeecgframework.web.cgform.service.enhance; + +import org.jeecgframework.web.cgform.entity.enhance.CgformEnhanceJsEntity; + +import org.jeecgframework.core.common.service.CommonService; + +public interface CgformEnhanceJsServiceI extends CommonService{ + + /** + * 鏍规嵁cgJsType鍜宖ormId鏌ユ壘鏁版嵁 + * @param cgJsType + * @param formId + * @return + */ + public CgformEnhanceJsEntity getCgformEnhanceJsByTypeFormId(String cgJsType,String formId); +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/excel/ExcelTempletService.java b/src/main/java/org/jeecgframework/web/cgform/service/excel/ExcelTempletService.java new file mode 100644 index 00000000..c2b8e31c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/excel/ExcelTempletService.java @@ -0,0 +1,305 @@ +package org.jeecgframework.web.cgform.service.excel; + +import java.io.InputStream; +import java.text.DateFormat; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFRichTextString; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.RichTextString; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.jeecgframework.core.common.exception.BusinessException; + +/** + * 妯$増瀵煎嚭宸ュ叿绫 + * + * @author huiyong + * + */ +public class ExcelTempletService { + //榛樿鍒楀 + //TODO 鎱у媷 浠庢暟鎹簱鎴栬呴厤缃枃浠惰缃粯璁ゅ垪瀹 + private static int maxColumnWidth = 30; + private static int minColumnWidth = 12; + //TODO 鏂囦欢鐢熸垚鐨勭┖琛屽お澶氱殑璇濓紝濉啓鏂囦欢鍙堟病鏈夊~鍐欐弧鐨勮瘽锛岀┖琛屾暟鎹湪瀵煎叆鐨勬椂鍊欎細瀵煎叆绌烘暟鎹繘鏁版嵁搴擄紝 + private static int defaultBlankRow = 1; + /** + * 瀵煎嚭excel妯$増 + * @param title + * @param titleSet + * @param datalist + * @return + */ + public static HSSFWorkbook exportExcel(String title, Collection dataSet, List> datalist) { + // 浣跨敤userModel妯″紡瀹炵幇鐨勶紝褰揺xcel鏂囨。鍑虹幇10涓囩骇鍒殑澶ф暟鎹枃浠跺彲鑳藉鑷碠OM鍐呭瓨婧㈠嚭 + return exportExcelInUserModel2File(title, dataSet,datalist); + } + + @SuppressWarnings("unchecked") + private static HSSFWorkbook exportExcelInUserModel2File(String title, + Collection dataSet, List> datalist) { + // 澹版槑涓涓伐浣滆杽 + HSSFWorkbook workbook = null; + try { + // 棣栧厛妫鏌ユ暟鎹湅鏄惁鏄纭殑 + if (dataSet == null || dataSet.size() == 0) { + throw new Exception("瀵煎嚭鏁版嵁涓虹┖锛"); + } + if (title == null) { + throw new Exception("浼犲叆鍙傛暟涓嶈兘涓虹┖锛"); + } + // 澹版槑涓涓伐浣滆杽 + workbook = new HSSFWorkbook(); + // 鐢熸垚涓涓〃鏍 + Sheet sheet = workbook.createSheet(title); + int index = 0; + // 浜х敓琛ㄦ牸鏍囬琛 + Row row = sheet.createRow(index); + row.setHeight((short) 450); + CellStyle titleStyle = getTitleStyle(workbook); + Iterator it = dataSet.iterator(); + while (it.hasNext()) { + CgFormFieldEntity type = (CgFormFieldEntity) it.next(); + // 杈撳叆闇瑕佹樉绀虹殑瀛楁淇℃伅 + if (type.getIsShow().equals("Y")) { + Cell cell = row.createCell(index); + RichTextString text = new HSSFRichTextString(type + .getContent()); + cell.setCellValue(text); + // 璁剧疆鍒楀 + int columnWidth = type.getLength()==0?minColumnWidth:type.getLength()>maxColumnWidth?maxColumnWidth:type.getLength(); + sheet.setColumnWidth(index,256 * columnWidth); + cell.setCellStyle(titleStyle); + index++; + //鏍囬鍒椾笅鏂归粯璁ょ粰涓夎鐨勮竟妗嗙┖浣嶇疆 + } + setBlankRows(defaultBlankRow,index,workbook); + } + for (int i = 0; i < datalist.size(); i++) { + it = dataSet.iterator(); + row = sheet.createRow(i+1); + index = 0; + while (it.hasNext()) { + CgFormFieldEntity type = (CgFormFieldEntity) it.next(); + // 杈撳叆闇瑕佹樉绀虹殑瀛楁淇℃伅 + if (type.getIsShow().equals("Y")) { + Cell cell = row.createCell(index); + if(datalist.get(i).get(type.getFieldName()) != null){ + RichTextString text = new HSSFRichTextString(datalist.get(i).get(type.getFieldName()).toString()); + cell.setCellValue(text); + } + //鏍囬鍒椾笅鏂归粯璁ょ粰涓夎鐨勮竟妗嗙┖浣嶇疆 + index++; + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return workbook; + } + /** + * exce琛ㄥご鍗曞厓鏍兼牱寮忓鐞 + * @param workbook + * @return + */ + public static HSSFCellStyle getTitleStyle(HSSFWorkbook workbook) { + // 浜х敓Excel琛ㄥご + HSSFCellStyle titleStyle = workbook.createCellStyle(); + titleStyle.setBorderBottom(HSSFCellStyle.BORDER_DOUBLE); // 璁剧疆杈规鏍峰紡 + titleStyle.setBorderLeft((short) 2); // 宸﹁竟妗 + titleStyle.setBorderRight((short) 2); // 鍙宠竟妗 + titleStyle.setBorderTop((short) 2); // 宸﹁竟妗 + titleStyle.setBorderBottom((short) 2); // 鍙宠竟妗 + titleStyle.setBorderTop(HSSFCellStyle.BORDER_DOUBLE); // 椤惰竟妗 + titleStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index); // 濉厖鐨勮儗鏅鑹 + titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); + + titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); // 濉厖鍥炬 + + return titleStyle; + } + + //鐢熸垚澶氬皯琛岀殑甯︽湁姣旇竟妗嗙殑绌鸿 + public static void setBlankRows(int rows,int columns,HSSFWorkbook workbook){ + //寰楀埌绗竴椤 + Sheet sheet = workbook.getSheetAt(0); + //鏍峰紡 + CellStyle cellStyle = getOneStyle(workbook); + for (int i = 1; i <=rows; i++) { + Row row = sheet.createRow(i); + for (int j = 0; j < columns; j++) { + row.createCell(j).setCellStyle(cellStyle); + } + } + } + + public static HSSFCellStyle getTwoStyle(HSSFWorkbook workbook) { + // 浜х敓Excel琛ㄥご + HSSFCellStyle style = workbook.createCellStyle(); + style.setBorderLeft((short) 1); // 宸﹁竟妗 + style.setBorderRight((short) 1); // 鍙宠竟妗 + style.setBorderBottom((short) 1); + style.setBorderTop((short) 1); + style.setFillForegroundColor(HSSFColor.LIGHT_TURQUOISE.index); // 濉厖鐨勮儗鏅鑹 + style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); // 濉厖鍥炬 + return style; + } + + public static HSSFCellStyle getOneStyle(HSSFWorkbook workbook) { + // 浜х敓Excel琛ㄥご + HSSFCellStyle style = workbook.createCellStyle(); + style.setBorderLeft((short) 1); // 宸﹁竟妗 + style.setBorderRight((short) 1); // 鍙宠竟妗 + style.setBorderBottom((short) 1); + style.setBorderTop((short) 1); + return style; + } + + + /** + * 瀵煎叆 excel + * @param inputstream + * : 鏂囦欢杈撳叆娴 + * @param pojoClass + * : 瀵瑰簲鐨勫鍏ュ璞 (姣忚璁板綍) + * @return + */ + public static Collection importExcelByIs(InputStream inputstream, + List lists) { + Map fieldMap = ConvertDate(lists); + //杩斿洖鐨勬暟鎹被鍨 + List> tObject = new ArrayList>(); + try { + // 灏嗕紶鍏ョ殑File鏋勯犱负FileInputStream; + // // 寰楀埌宸ヤ綔琛 + HSSFWorkbook book = new HSSFWorkbook(inputstream); + // // 寰楀埌绗竴椤 + HSSFSheet sheet = book.getSheetAt(0); + // // 寰楀埌绗竴闈㈢殑鎵鏈夎 + Iterator row = sheet.rowIterator(); + // 寰楀埌绗竴琛岋紝涔熷氨鏄爣棰樿 + Row title = row.next(); + // 寰楀埌绗竴琛岀殑鎵鏈夊垪 + Iterator cellTitle = title.cellIterator(); + // 灏嗘爣棰樼殑鏂囧瓧鍐呭鏀惧叆鍒颁竴涓猰ap涓 + Map titlemap = new HashMap(); + // 浠庢爣棰樼涓鍒楀紑濮 + int i = 0; + // 寰幆鏍囬鎵鏈夌殑鍒 + while (cellTitle.hasNext()) { + Cell cell = cellTitle.next(); + String value = cell.getStringCellValue(); + if (fieldMap.get(value)==null) { + throw new BusinessException("瀵煎叆鏁版嵁excel鍒楀悕鏈変笉鑳借瘑鍒殑鍒"); + } + titlemap.put(i, value); + i = i + 1; + } + // 鐢ㄦ潵鏍煎紡鍖栨棩鏈熺殑DateFormat + Map retMap=null; + while (row.hasNext()) { + retMap= new HashMap(); + // 鏍囬涓嬬殑绗竴琛 + Row rown = row.next(); + // 琛岀殑鎵鏈夊垪 + Iterator cellbody = rown.cellIterator(); + int k = 0; + // 閬嶅巻涓琛岀殑鍒 + while (cellbody.hasNext()) { + Cell cell = cellbody.next(); + // 杩欓噷寰楀埌姝ゅ垪鐨勫搴旂殑鏍囬 + String titleString = (String) titlemap.get(k); + if (fieldMap.containsKey(titleString)) { + retMap.put(fieldMap.get(titleString).getFieldName(), getCellValueString(cell)); + } + // 涓嬩竴鍒 + k = k + 1; + } + tObject.add(retMap); + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return tObject; + } + //TODO huiyong excel鏃ユ湡鏍煎紡澶勭悊榛樿濡傛锛岄渶瑕佷粠鏁版嵁搴撴垨鑰呴厤缃枃浠惰鍙 + public final static DateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + /** + * 寰楀埌鏌愪釜鏍煎瓙鐨勫 宸茬粡瀵硅繃鏃舵柟娉曡繘琛屾洿鏂 + * + * @param cell + * 鏍煎瓙瀵硅薄 + * @return 鏍煎瓙鐨勫 + */ + public static String getCellValueString(Cell cell) { + if (cell == null) { + return null; + } + // 鏃堕棿瀵硅薄 鐗规畩澶勭悊 + int dataFormat = cell.getCellStyle().getDataFormat(); + + if (dataFormat == 14 || dataFormat == 178 || dataFormat == 180 || dataFormat == 181 + || dataFormat == 182) { + return getDateValue(cell); + } + String value = null; + switch (cell.getCellType()) { + case Cell.CELL_TYPE_NUMERIC : + value = new DecimalFormat("0.##########").format(cell.getNumericCellValue()); + break; + case Cell.CELL_TYPE_STRING : + // value = cell.getStringCellValue(); + value = cell.getRichStringCellValue().toString(); + break; + case Cell.CELL_TYPE_FORMULA : + value = String.valueOf(cell.getCellFormula()); + break; + case Cell.CELL_TYPE_BLANK : + // value = String.valueOf(cell.getStringCellValue()); + value = String.valueOf(cell.getRichStringCellValue().toString()); + break; + case Cell.CELL_TYPE_BOOLEAN : + value = String.valueOf(cell.getBooleanCellValue()); + break; + case Cell.CELL_TYPE_ERROR : + value = String.valueOf(cell.getErrorCellValue()); + break; + } + return value; + } + /** + * 杩斿洖鏃堕棿鍐呯殑鐗规畩鏃堕棿鏍煎紡 OFFICE2003 + * @param cell + * @return + */ + private static String getDateValue(Cell cell){ + return DEFAULT_DATE_FORMAT.format(cell.getDateCellValue()); + } + /** + * 鏁版嵁澶勭悊 + */ + private static Map ConvertDate(List lists){ + Map maps = new HashMap(); + + for (CgFormFieldEntity cgFormFieldEntity : lists) { + maps.put(cgFormFieldEntity.getContent(), cgFormFieldEntity); + } + return maps; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/autolist/CgTableServiceImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/autolist/CgTableServiceImpl.java new file mode 100644 index 00000000..e4aec038 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/autolist/CgTableServiceImpl.java @@ -0,0 +1,217 @@ +package org.jeecgframework.web.cgform.service.impl.autolist; + +import java.util.HashMap; +import java.io.File; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.cgform.common.CgAutoListConstant; +import org.jeecgframework.web.cgform.common.CommUtils; +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.entity.upload.CgUploadEntity; +import org.jeecgframework.web.cgform.service.autolist.CgTableServiceI; +import org.jeecgframework.web.cgform.service.build.DataBaseService; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; +import org.jeecgframework.web.cgform.util.QueryParamUtil; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.service.CommonService; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.FileUtils; +import org.jeecgframework.core.util.JeecgDataAutorUtils; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * + * @Title:CgTableServiceImpl + * @description:鍔ㄦ佽〃鏁版嵁鏈嶅姟瀹炵幇 + * @author 璧典繆澶 + * @date Jul 5, 2013 9:34:51 PM + * @version V1.0 + */ +@Service("cgTableService") +@Transactional +public class CgTableServiceImpl extends CommonServiceImpl implements CgTableServiceI { + @Autowired + private CommonService commonService; + + @Autowired + private DataBaseService dataBaseService; + + @Autowired + private CgFormFieldServiceI cgFormFieldService; + + @SuppressWarnings("unchecked") + + public List> querySingle(String table, String field, Map params, + int page, int rows) { + StringBuilder sqlB = new StringBuilder(); + dealQuerySql(table,field,params,sqlB); + List> result = commonService.findForJdbcParam(sqlB + .toString(), page, rows); + return result; + } + + public List> querySingle(String table, String field, Map params, + String sort, String order, int page, int rows) { + StringBuilder sqlB = new StringBuilder(); + dealQuerySql(table,field,params,sqlB); + if(!StringUtil.isEmpty(sort)&& !StringUtil.isEmpty(order)){ + sqlB.append(" ORDER BY "+sort+" "+ order); + } + List> result = commonService.findForJdbcParam(sqlB + .toString(), page, rows); + return result; + } + + @SuppressWarnings("unchecked") + + public boolean delete(String table, Object id) { + try{ + CgFormHeadEntity head = cgFormFieldService.getCgFormHeadByTableName(table); + Map data = dataBaseService.findOneForJdbc(table, id.toString()); + if(data!=null){ + //鎵撳嵃娴嬭瘯 + Iterator it=data.entrySet().iterator(); + while(it.hasNext()){ + Map.Entry entry=(Map.Entry)it.next(); + Object ok=entry.getKey(); + Object ov=entry.getValue()==null?"":entry.getValue(); + org.jeecgframework.core.util.LogUtil.info("name:"+ok.toString()+";value:"+ov.toString()); + } + data = CommUtils.mapConvert(data); + dataBaseService.executeSqlExtend(head.getId(), "delete", data); + } + //step.1 鍒犻櫎琛 + StringBuilder deleteSql = new StringBuilder(); + deleteSql.append("DELETE FROM "+table+" WHERE id = ?"); + if(!QueryParamUtil.sql_inj(id.toString())){ + commonService.executeSql(deleteSql.toString(), id); + } + //step.2 鍒ゆ柇鏄惁鏈夋槑缁嗚〃,杩涜杩炲甫鍒犻櫎 + String[] subTables = head.getSubTableStr()==null?new String[0]:head.getSubTableStr().split(","); + for(String subTable:subTables){ + Map fields = cgFormFieldService.getAllCgFormFieldByTableName(subTable); + String subFkField = null; + Iterator it = fields.keySet().iterator(); + for(;it.hasNext();){ + String fieldName = (String) it.next(); + CgFormFieldEntity fieldc = fields.get(fieldName); + if(StringUtil.isNotEmpty(fieldc.getMainTable())){ + if(table.equalsIgnoreCase(fieldc.getMainTable())){ + subFkField = fieldName; + } + } + } + if(StringUtil.isNotEmpty(subFkField)){ + String dsql = "delete from "+subTable+" "+"where "+subFkField+" = ? "; + this.executeSql(dsql,id); + } + } +//--------longjb-start--20150526 ----for:add step.3 鍒ゆ柇鏄惁鏈夐檮浠跺瓧娈,杩涜杩炲甫鍒犻櫎闄勪欢鍙婇檮浠惰〃--------------- + List uploadBeans = cgFormFieldService.findByProperty(CgUploadEntity.class, "cgformId", id); + if(uploadBeans!=null){ + for(CgUploadEntity b:uploadBeans){ + String path = ResourceUtil.getSysPath()+File.separator+b.getRealpath();//闄勪欢璺緞 + FileUtils.delete(path); + cgFormFieldService.deleteEntityById(CgUploadEntity.class, b.getId()); + } + } +//--------longjb-end--20150526 ----for:add step.3 鍒ゆ柇鏄惁鏈夐檮浠跺瓧娈,杩涜杩炲甫鍒犻櫎闄勪欢鍙婇檮浠惰〃--------------- + }catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + @SuppressWarnings("unchecked") + private void dealQuerySql(String table, String field, Map params,StringBuilder sqlB){ + sqlB.append(" SELECT "); + for (String f : field.split(",")) { + sqlB.append(f); + sqlB.append(","); + } + sqlB.deleteCharAt(sqlB.length() - 1); + sqlB.append(" FROM " + table); + if (params.size() >= 1) { + sqlB.append(" WHERE 1=1 "); + Iterator it = params.keySet().iterator(); + while (it.hasNext()) { + String key = String.valueOf(it.next()); + String value = String.valueOf(params.get(key)); + if (!StringUtil.isEmpty(value) && !"null".equalsIgnoreCase(value)) { + sqlB.append(" AND "); + sqlB.append(" " + key + value ); + } + } + } + Object dataRuleSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();//ContextHolderUtils.getRequest().getAttribute(Globals.MENU_DATA_AUTHOR_RULE_SQL); + if(dataRuleSql != null && !dataRuleSql.equals("")){ + if(params.size() == 0) { + sqlB.append(" WHERE 1=1 "); + } + sqlB.append(dataRuleSql); + } + } + + + @SuppressWarnings("unchecked") + + public Long getQuerySingleSize(String table, String field, Map params) { + StringBuilder sqlB = new StringBuilder(); + dealQuerySql(table,"count(*) as query_size,",params,sqlB); + List> result = commonService.findForJdbc(sqlB.toString()); + if(result.size()>=1){ + return Long.parseLong(String.valueOf(result.get(0).get("query_size"))); + }else{ + return 0L; + } + } + + public boolean deleteBatch(String table, String[] ids) { + try{ + for(String id:ids){ + delete(table, id); + } + }catch (Exception e) { + throw new BusinessException(e.getMessage()); + } + return true; + } + + @Override + public void treeFromResultHandle(String table, String parentIdFieldName, + String parentIdFieldType, List> result) { + if(result != null && result.size() > 0) { + String parentIds = ""; + for (int i = 0; i < result.size(); i++) { + Map resultMap = result.get(i); + if(parentIdFieldType.equalsIgnoreCase(CgAutoListConstant.TYPE_STRING)) { + parentIds += ",'" + resultMap.get("id") + "'"; + }else { + parentIds += "," + resultMap.get("id"); + } + } + parentIds = parentIds.substring(1); + String subSQL = "select `" + parentIdFieldName + "`, count(*) ct from " + table + " a where a.`" + parentIdFieldName + "` in" + "(" + parentIds + ") group by a.`" + parentIdFieldName + "`"; + List> subCountResult = this.findForJdbc(subSQL); + Map subCountMap = new HashMap(); + for (Map map : subCountResult) { + subCountMap.put(map.get(parentIdFieldName).toString(), map.get("ct")); + } + for(Map resultMap:result){ + String state = "closed"; + if(subCountMap.get(resultMap.get("id").toString()) == null) { + state = "open"; + } + resultMap.put("state", state); + } + } + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/autolist/ConfigServiceImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/autolist/ConfigServiceImpl.java new file mode 100644 index 00000000..1ee8f702 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/autolist/ConfigServiceImpl.java @@ -0,0 +1,90 @@ +package org.jeecgframework.web.cgform.service.impl.autolist; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.cgform.common.CgAutoListConstant; +import org.jeecgframework.web.cgform.entity.button.CgformButtonEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.entity.enhance.CgformEnhanceJsEntity; +import org.jeecgframework.web.cgform.service.autolist.ConfigServiceI; +import org.jeecgframework.web.cgform.service.button.CgformButtonServiceI; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; +import org.jeecgframework.web.cgform.service.enhance.CgformEnhanceJsServiceI; + +import org.jeecgframework.core.annotation.Ehcache; +import org.jeecgframework.core.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +/** + * + * @Title:ConfigServiceImpl + * @description:鍔ㄦ侀厤缃湇鍔″疄鐜 + * @author 璧典繆澶 + * @date Jul 5, 2013 9:35:22 PM + * @version V1.0 + */ +@Service("configService") +@Transactional +public class ConfigServiceImpl implements ConfigServiceI { + @Autowired + private CgFormFieldServiceI tablePropertyService; + @Autowired + private CgformButtonServiceI cgformButtonService; + @Autowired + private CgformEnhanceJsServiceI cgformEnhanceJsService; + + /** + * tableName 琛ㄥ崟鍚 + */ + @Ehcache + public Map queryConfigs(String tableName,String jversion) { + //step.1 瑕佽繑鍥炵殑閰嶇疆鏁版嵁 + Map configs = new HashMap(); + //step.2 鑾峰彇鍔ㄦ佽〃閰嶇疆 + CgFormHeadEntity tableEntity = null; + try{ + tableEntity = tablePropertyService.findByProperty(CgFormHeadEntity.class, "tableName", tableName).get(0); + loadConfigs(configs,tableEntity); + }catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("娌℃湁鎵惧埌璇ュ姩鎬佸垪琛"); + } + return configs; + } + + private void loadConfigs(Map configs, CgFormHeadEntity tableEntity) { + //鑾峰彇鍔ㄦ佽〃鏄庣粏閰嶇疆 + List columns = tableEntity.getColumns(); + configs.put(CgAutoListConstant.CONFIG_ID, tableEntity.getTableName()); + configs.put(CgAutoListConstant.CONFIG_NAME, tableEntity.getContent()); + configs.put(CgAutoListConstant.TABLENAME,tableEntity.getTableName()); + configs.put(CgAutoListConstant.CONFIG_ISCHECKBOX,tableEntity.getIsCheckbox()); + configs.put(CgAutoListConstant.CONFIG_ISPAGINATION,tableEntity.getIsPagination()); + configs.put(CgAutoListConstant.CONFIG_ISTREE,tableEntity.getIsTree()); + configs.put(CgAutoListConstant.CONFIG_QUERYMODE,tableEntity.getQuerymode()); + configs.put(CgAutoListConstant.FILEDS,columns); + configs.put(CgAutoListConstant.CONFIG_VERSION, tableEntity.getJformVersion()); + configs.put(CgAutoListConstant.TREE_PARENTID_FIELDNAME, tableEntity.getTreeParentIdFieldName()); + configs.put(CgAutoListConstant.TREE_ID_FIELDNAME, tableEntity.getTreeIdFieldname()); + configs.put(CgAutoListConstant.TREE_FIELDNAME, tableEntity.getTreeFieldname()); + String formId = tableEntity.getId(); + List buttons = cgformButtonService.getCgformButtonListByFormId(formId); + configs.put(CgAutoListConstant.CONFIG_BUTTONLIST,buttons.size()>0?buttons:new ArrayList(0)); + String jsCode = ""; + CgformEnhanceJsEntity jsEnhance = cgformEnhanceJsService.getCgformEnhanceJsByTypeFormId("list", formId); + if(jsEnhance!=null){ + jsCode = jsEnhance.getCgJsStr(); + if(StringUtil.isEmpty(jsCode)){ + jsCode = ""; + } + } + configs.put(CgAutoListConstant.CONFIG_JSENHANCE,jsCode); + } + + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/build/DataBaseServiceImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/build/DataBaseServiceImpl.java new file mode 100644 index 00000000..6af9ce23 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/build/DataBaseServiceImpl.java @@ -0,0 +1,585 @@ +package org.jeecgframework.web.cgform.service.impl.build; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.jeecgframework.web.cgform.common.CgAutoListConstant; +import org.jeecgframework.web.cgform.common.CommUtils; +import org.jeecgframework.web.cgform.entity.button.CgformButtonSqlEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.exception.BusinessException; +import org.jeecgframework.web.cgform.service.build.DataBaseService; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.constant.DataBaseConstant; +import org.jeecgframework.core.util.DBTypeUtil; +import org.jeecgframework.core.util.DateUtils; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.UUIDGenerator; +import org.jeecgframework.core.util.oConvertUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataRetrievalFailureException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; +import org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer; +import org.springframework.jdbc.support.incrementer.PostgreSQLSequenceMaxValueIncrementer; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @ClassName: DataBaseServiceImpl + * @Description: (琛ㄥ崟妯℃澘鏁版嵁鎿嶄綔service) + * @author zhoujunfeng + */ +@Service("dataBaseService") +@Transactional +public class DataBaseServiceImpl extends CommonServiceImpl implements DataBaseService{ + private static final Logger logger = Logger.getLogger(DataBaseServiceImpl.class); + @Autowired + private CgFormFieldServiceI cgFormFieldService; + @Autowired + private AbstractRoutingDataSource dataSource; + @Autowired + private JdbcTemplate jdbcTemplate; + /** + * 琛ㄥ崟娣诲姞 + * @param tableName 琛ㄥ悕 + * @param data 娣诲姞鐨勬暟鎹甿ap + */ + + public int insertTable(String tableName, Map data) { + CgFormHeadEntity cgFormHeadEntity = cgFormFieldService.getCgFormHeadByTableName(tableName); + //绯荤粺涓婁笅鏂囧彉閲忚祴鍊 + fillInsertSysVar(data); + //涓婚敭閫傞厤鍣紙鏍规嵁涓嶅悓鐨勬暟鎹簱杩涜鐢熸垚锛 + keyAdapter(cgFormHeadEntity,data); + //鏁版嵁绫诲瀷杞崲锛坉ate锛宨nt锛宒ouble绛夌瓑锛 + dataAdapter(tableName,data); + String comma = ""; + StringBuffer insertKey = new StringBuffer(); + StringBuffer insertValue = new StringBuffer(); + for (Entry entry : data.entrySet()) { + // 鍒ゆ柇key鏄惁涓鸿〃閰嶇疆鐨勫睘鎬 + if(isContainsFieled(tableName,entry.getKey())){ + //鎻掑叆SQL璇硶,鍏煎澶氭暟鎹簱,鍘绘帀鍗曞紩鍙 + insertKey.append(comma + entry.getKey()); + if(entry.getValue()!=null && entry.getValue().toString().length()>0){ + insertValue.append(comma + ":"+entry.getKey()); + }else{ + insertValue.append(comma + "null"); + } + comma = ", "; + + } + } + String sql = "INSERT INTO " + tableName + " (" + insertKey + ") VALUES (" + insertValue + ")"; + Object key = null; + try { + //绫诲瀷杞崲鍐茬獊 + try { + key = this.executeSqlReturnKey(sql,data); + } catch (DataRetrievalFailureException e) { + } + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + if(key!=null && key instanceof Long){ + data.put("id", key); + } + if(cgFormHeadEntity!=null){ + executeSqlExtend(cgFormHeadEntity.getId(),"add",data); + } + return 1; + } + /** + * 鏍规嵁鏁版嵁搴撳拰涓婚敭绛栫暐鏉ラ傞厤Insert鐨剆ql璇彞 + * @param cgFormHeadEntity 琛ㄥ崟閰嶇疆 + * @param data 鎻掑叆鐨勬暟鎹 + */ + private void keyAdapter(CgFormHeadEntity cgFormHeadEntity, + Map data) { + String pkType = cgFormHeadEntity.getJformPkType(); + String dbType = DBTypeUtil.getDBType(); + if("NATIVE".equalsIgnoreCase(pkType)||"SEQUENCE".equalsIgnoreCase(pkType)){ + if("sqlserver".equalsIgnoreCase(dbType)){ + //濡傛灉鏄暟鎹簱鑷,sqlserver鐨刬nsert璇彞涓笉鍏佽鍑虹幇璇ュ瓧娈 + data.remove("id"); + } + } + } + /** + * 鏁版嵁绫诲瀷閫傞厤-鏍规嵁琛ㄥ崟閰嶇疆鐨勫瓧娈电被鍨嬪皢鍓嶅彴浼犻掔殑鍊煎皢map-value杞崲鎴愮浉搴旂殑绫诲瀷 + * @param tableName 琛ㄥ崟鍚 + * @param data 鏁版嵁 + */ + private Map dataAdapter(String tableName,Map data) { + //step.1 鑾峰彇琛ㄥ崟鐨勫瓧娈甸厤缃 + Map fieldConfigs =cgFormFieldService.getAllCgFormFieldByTableName(tableName); + //step.2 杩唬灏嗚鎸佷箙鍖栫殑鏁版嵁 + Iterator it = fieldConfigs.keySet().iterator(); + for(;it.hasNext();){ + Object key = it.next(); + //鏍规嵁琛ㄥ崟閰嶇疆鐨勫瓧娈靛悕 鑾峰彇 鍓嶅彴鏁版嵁 + Object beforeV = data.get(key.toString().toLowerCase()); + + //濡傛灉鍊间笉涓虹┖ + if(oConvertUtils.isNotEmpty(beforeV)){ + //鑾峰彇瀛楁閰嶇疆-瀛楁绫诲瀷 + CgFormFieldEntity fieldConfig = fieldConfigs.get(key); + String type = fieldConfig.getType(); + //鏍规嵁绫诲瀷杩涜鍊肩殑閫傞厤 + if("date".equalsIgnoreCase(type)){ + //鏃ユ湡->java.util.Date + Object newV = String.valueOf(beforeV); + try { + String dateType = fieldConfig.getShowType(); + if("datetime".equalsIgnoreCase(dateType)){ + newV = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(String.valueOf(beforeV)); + }else if("date".equalsIgnoreCase(dateType)){ + newV = new SimpleDateFormat("yyyy-MM-dd").parse(String.valueOf(beforeV)); + } + if(data.containsKey(key)){ + data.put(String.valueOf(key), newV); + } + } catch (ParseException e) { + e.printStackTrace(); + } + }else if("int".equalsIgnoreCase(type)){ + //int->java.lang.Integer + Object newV = null; + try{ + newV = Integer.parseInt(String.valueOf(beforeV)); + }catch (Exception e) { + e.printStackTrace(); + } + if(data.containsKey(key)){ + data.put(String.valueOf(key), newV); + } + }else if("double".equalsIgnoreCase(type)){ + //double->java.lang.Double + Object newV = new Double(0); + try{ + newV = Double.parseDouble(String.valueOf(beforeV)); + }catch (Exception e) { + e.printStackTrace(); + } + if(data.containsKey(key)){ + data.put(String.valueOf(key), newV); + } + } + } else if(oConvertUtils.isNotEmpty(fieldConfigs.get(key).getFieldDefault())) { + data.remove(key.toString().toLowerCase()); + } + } + return data; + } + + /** + * 琛ㄥ崟淇敼 + * @param tableName 琛ㄥ悕 + * @param id 琛ㄦ暟鎹甶d + * @param data 淇敼鐨勬暟鎹甿ap + */ + + public int updateTable(String tableName, Object id, Map data) { + fillUpdateSysVar(data); + dataAdapter(tableName,data); + String comma = ""; + StringBuffer sqlBuffer = new StringBuffer(); + sqlBuffer.append("update ").append(tableName).append(" set "); + for (Entry entry : data.entrySet()) { + // 鍒ゆ柇key鏄惁涓鸿〃閰嶇疆鐨勫睘鎬 + if(isContainsFieled(tableName,entry.getKey())){ + if(entry.getValue()!=null&&entry.getValue().toString().length()>0){ + sqlBuffer.append(comma).append(entry.getKey()).append("=:"+entry.getKey()+" "); + }else{ + sqlBuffer.append(comma).append(entry.getKey()).append("=null"); + } + comma = ", "; + } + } + + if(id instanceof java.lang.String){ + sqlBuffer.append(" where id='").append(id).append("'"); + }else{ + sqlBuffer.append(" where id=").append(id); + } + CgFormHeadEntity cgFormHeadEntity = cgFormFieldService.getCgFormHeadByTableName(tableName); + int num = this.executeSql(sqlBuffer.toString(), data); + + if(cgFormHeadEntity!=null){ + executeSqlExtend(cgFormHeadEntity.getId(),"update",data); + } + return num; + } + + /** + * 鏌ヨ琛ㄥ崟 + * @param tableName 琛ㄥ悕 + * @param id 琛ㄦ暟鎹甶d + */ + + public Map findOneForJdbc(String tableName, String id) { + StringBuffer sqlBuffer = new StringBuffer(); + sqlBuffer.append("select * from ").append(tableName); + sqlBuffer.append(" where id='").append(id).append("'"); + Map map = this.findOneForJdbc(sqlBuffer.toString()); + return map; + } + + /** + * sql涓氬姟澧炲己 + * + */ + public void executeSqlExtend(String formId,String buttonCode,Map data){ + //鏍规嵁formId鍜宐uttonCode鑾峰彇 + CgformButtonSqlEntity cgformButtonSqlVo = getCgformButtonSqlByCodeFormId(buttonCode,formId); + if(cgformButtonSqlVo!=null){ + //鑾峰彇sql鍙傛暟娉ㄥ叆鍙傛暟 + String sqlPlugin = cgformButtonSqlVo.getCgbSqlStr(); + if(StringUtils.isNotEmpty(sqlPlugin)){ + String [] sqls = sqlPlugin.split(";"); + for(String sql:sqls){ + if(sql.toLowerCase().indexOf(CgAutoListConstant.SQL_INSERT)!=-1 + ||sql.toLowerCase().indexOf(CgAutoListConstant.SQL_UPDATE)!=-1){ + //鎵цsql + logger.debug("sql plugin -------->"+sql); + sql = formateSQl(sql, data); + logger.debug("sql plugin -------->"+sql); + int num = this.executeSql(sql); + if(num>0){ + logger.debug("sql plugin --execute success------>"+sql); + }else{ + logger.debug("sql plugin --execute fail------>"+sql); + } + } + } + } + } + } + + private CgformButtonSqlEntity getCgformButtonSqlByCodeFormId(String buttonCode, String formId) { + StringBuilder hql = new StringBuilder(""); + hql.append(" from CgformButtonSqlEntity t"); + hql.append(" where t.formId=?"); + hql.append(" and t.buttonCode =?"); + List list = this.findHql(hql.toString(),formId,buttonCode); + if(list!=null&&list.size()>0){ + return list.get(0); + } + return null; + } + + + /** + * sql鍊兼浛鎹 + * @param sql + * @param params + * @return + */ + private String formateSQl(String sql, Map params) { + sql = replaceExtendSqlSysVar(sql); + if (params == null) { + return sql; + } + if(sql.toLowerCase().indexOf(CgAutoListConstant.SQL_INSERT)!=-1){ + sql = sql.replace("#{UUID}", UUIDGenerator.generate()); + } + for (String key : params.keySet()) { +// sql = sql.replace("${" + key + "}", "'"+String.valueOf(params.get(key))+"'"); + sql = sql.replace("#{" + key + "}",String.valueOf(params.get(key))); + } + return sql; + } + + @SuppressWarnings("unchecked") + + public Map insertTableMore(Map>> mapMore, String mainTableName) throws BusinessException { + //鎻掑叆涓昏〃淇℃伅 + Map mainMap = mapMore.get(mainTableName).get(0); + //娑堥櫎瀛楁 + String [] filterName = {"tableName","saveOrUpdateMore"}; + mainMap = CommUtils.attributeMapFilter(mainMap,filterName); + Object pkValue = getPkValue(mainTableName); + mainMap.put("id", pkValue); + insertTable(mainTableName, mainMap); + + //鎻掑叆闄勮〃淇℃伅 + //鍘婚櫎涓昏〃淇℃伅 + String [] filterMainTable = {mainTableName}; + mapMore = CommUtils.attributeMapFilter(mapMore,filterMainTable); + Iterator it=mapMore.entrySet().iterator(); + while(it.hasNext()){ + Map.Entry entry=(Map.Entry)it.next(); + String ok=(String)entry.getKey(); + List> ov=(List>)entry.getValue(); + for(Map fieldMap:ov){ + //澶勭悊鍏宠仈閿 + List> fkFieldList = getFKField(mainTableName, ok); + Object subPkValue = getPkValue(ok); + fieldMap.put("id", subPkValue); + fieldMap = CommUtils.convertFKMap(fieldMap,mainMap,fkFieldList); + insertTable(ok, fieldMap); + } + } + return mainMap; + } + + @SuppressWarnings("unchecked") + + public boolean updateTableMore(Map>> mapMore, String mainTableName) throws BusinessException { + //鏇存柊涓昏〃淇℃伅 + Map mainMap = mapMore.get(mainTableName).get(0); + Object mainTableId = mainMap.get("id"); + //娑堥櫎瀛楁 + String [] filterName = {"tableName","saveOrUpdateMore","id"}; + mainMap = CommUtils.attributeMapFilter(mainMap,filterName); + updateTable(mainTableName,mainTableId, mainMap); + mainMap.put("id", mainTableId); + //鏇存柊闄勮〃淇℃伅 + String [] filterMainTable = {mainTableName}; + mapMore = CommUtils.attributeMapFilter(mapMore,filterMainTable); + Iterator it=mapMore.entrySet().iterator(); + while(it.hasNext()){ + Map.Entry entry=(Map.Entry)it.next(); + String ok=(String)entry.getKey(); + List> ov=(List>)entry.getValue(); + //澶勭悊鍏宠仈閿 + List> fkFieldList = getFKField(mainTableName, ok); + //鏍规嵁涓昏〃id鑾峰彇闄勮〃淇℃伅 + Map> subTableDateMap = getSubTableData(fkFieldList, mainTableName, ok, mainTableId); + for(Map fieldMap:ov){ + Object subId = fieldMap.get("id")==null?"":fieldMap.get("id"); + if(subId==null || "".equals(String.valueOf(subId))){ + fieldMap = CommUtils.convertFKMap(fieldMap,mainMap,fkFieldList); + fieldMap.put("id", getPkValue(ok)); + insertTable(ok, fieldMap); + }else{ + fieldMap = CommUtils.convertFKMap(fieldMap,mainMap,fkFieldList); + //娑堥櫎瀛楁 + String [] subFilterName = {"id"}; + fieldMap = CommUtils.attributeMapFilter(fieldMap,subFilterName); + updateTable(ok,subId,fieldMap); + //鍓旈櫎宸茬粡鏇存柊浜嗙殑鏁版嵁 + if(subTableDateMap.containsKey(subId)){ + subTableDateMap.remove(subId); + } + } + } + //subTableDateMap涓墿浣欑殑鏁版嵁灏辨槸鍒犻櫎鐨勬暟鎹 + if(subTableDateMap.size()>0){ + Iterator itSub=subTableDateMap.entrySet().iterator(); + while(itSub.hasNext()){ + Map.Entry entrySub=(Map.Entry)itSub.next(); + Object subId=entrySub.getKey(); + deleteSubTableDataById(subId,ok); + } + } + } + return true; + } + + /** + * 鑾峰緱涓昏〃闄勮〃鍏宠仈閿 + * + * @param mainTableName 涓昏〃鍚 + * @param subTableName 闄勮〃鍚 + * @return + */ + private List> getFKField(String mainTableName, String subTableName) { + StringBuilder sql1 = new StringBuilder(""); + sql1.append("select f.* from cgform_field f ,cgform_head h"); + sql1.append(" where f.table_id = h.id "); + sql1.append(" and h.table_name=? "); + sql1.append(" and f.main_table=? "); + List> list = this.findForJdbc(sql1.toString(), subTableName,mainTableName); + return list; + } + + /** + * 鏍规嵁涓昏〃id鑾峰彇闄勮〃淇℃伅 + * + * @param fkFieldList 涓昏〃闄勮〃鍏宠仈閿 + * @param mainTableName 涓昏〃鍚 + * @param subTableName 闄勮〃鍚 + * @param mainTableId 涓昏〃id + * @return + */ + private Map> getSubTableData(List> fkFieldList,String mainTableName, String subTableName,Object mainTableId) { + + StringBuilder sql2 = new StringBuilder(""); + sql2.append("select sub.* from ").append(subTableName).append(" sub "); + sql2.append(", ").append(mainTableName).append(" main "); + sql2.append("where 1=1 "); + if(fkFieldList!=null&&fkFieldList.size()>0){ + for(Map map :fkFieldList){ + if(map.get("main_field")!=null){ + sql2.append(" and sub.").append((String)map.get("field_name")).append("=").append("main.").append((String)map.get("main_field")); + } + } + } + sql2.append(" and main.id= ? "); + List> subTableDataList = this.findForJdbc(sql2.toString(),mainTableId); + Map> dataMap = new HashMap>(); + if(subTableDataList!=null){ + for(Map map:subTableDataList){ + dataMap.put(map.get("id"), map); + } + } + return dataMap; + } + /** + * 鏍规嵁涓婚敭绛栫暐鑾峰彇瀹為檯鎻掑叆鐨勪富閿 + * @param tableName 琛ㄥ崟鍚嶇О + * @return + */ + public Object getPkValue(String tableName) { + Object pkValue = null; + CgFormHeadEntity cghead = cgFormFieldService.getCgFormHeadByTableName(tableName); + String dbType = DBTypeUtil.getDBType(); + String pkType = cghead.getJformPkType(); + String pkSequence = cghead.getJformPkSequence(); + if(StringUtil.isNotEmpty(pkType)&&"UUID".equalsIgnoreCase(pkType)){ + pkValue = UUIDGenerator.generate(); + }else if(StringUtil.isNotEmpty(pkType)&&"NATIVE".equalsIgnoreCase(pkType)){ + if(StringUtil.isNotEmpty(dbType)&&"oracle".equalsIgnoreCase(dbType)){ + OracleSequenceMaxValueIncrementer incr = new OracleSequenceMaxValueIncrementer(dataSource, "HIBERNATE_SEQUENCE"); + try{ + pkValue = incr.nextLongValue(); + }catch (Exception e) { + logger.error(e,e); + } + }else if(StringUtil.isNotEmpty(dbType)&&"postgres".equalsIgnoreCase(dbType)){ + PostgreSQLSequenceMaxValueIncrementer incr = new PostgreSQLSequenceMaxValueIncrementer(dataSource, "HIBERNATE_SEQUENCE"); + try{ + pkValue = incr.nextLongValue(); + }catch (Exception e) { + logger.error(e,e); + } + }else{ + pkValue = null; + } + }else if(StringUtil.isNotEmpty(pkType)&&"SEQUENCE".equalsIgnoreCase(pkType)){ + if(StringUtil.isNotEmpty(dbType)&&"oracle".equalsIgnoreCase(dbType)){ + OracleSequenceMaxValueIncrementer incr = new OracleSequenceMaxValueIncrementer(dataSource, pkSequence); + try{ + pkValue = incr.nextLongValue(); + }catch (Exception e) { + logger.error(e,e); + } + }else if(StringUtil.isNotEmpty(dbType)&&"postgres".equalsIgnoreCase(dbType)){ + PostgreSQLSequenceMaxValueIncrementer incr = new PostgreSQLSequenceMaxValueIncrementer(dataSource, pkSequence); + try{ + pkValue = incr.nextLongValue(); + }catch (Exception e) { + logger.error(e,e); + } + }else{ + pkValue = null; + } + }else{ + pkValue = UUIDGenerator.generate(); + } + return pkValue; + } + /** + * 鏍规嵁id鍒犻櫎闄勮〃淇℃伅 + * + * @param subId 闄勮〃鏁版嵁 + * @param subTableName 闄勮〃鍚 + * @return + */ + private void deleteSubTableDataById(Object subId,String subTableName){ + StringBuilder sql = new StringBuilder(""); + sql.append(" delete from ").append(subTableName).append(" where id = ? "); + + this.executeSql(sql.toString(), subId); + } + /** + * 鏇存柊鎿嶄綔鏃跺皢绯荤粺鍙橀噺绾﹀畾鐨勫瓧娈佃祴鍊 + * @param data + */ + private void fillUpdateSysVar(Map data) { + if(data.containsKey(DataBaseConstant.UPDATE_DATE_TABLE)){ + data.put(DataBaseConstant.UPDATE_DATE_TABLE, DateUtils.formatDate()); + } + if(data.containsKey(DataBaseConstant.UPDATE_TIME_TABLE)){ + data.put(DataBaseConstant.UPDATE_TIME_TABLE, DateUtils.formatTime()); + } + if(data.containsKey(DataBaseConstant.UPDATE_BY_TABLE)){ + data.put(DataBaseConstant.UPDATE_BY_TABLE, ResourceUtil.getUserSystemData(DataBaseConstant.SYS_USER_CODE)); + } + if(data.containsKey(DataBaseConstant.UPDATE_NAME_TABLE)){ + data.put(DataBaseConstant.UPDATE_NAME_TABLE, ResourceUtil.getUserSystemData(DataBaseConstant.SYS_USER_NAME)); + } + } + + /** + * 鎻掑叆鎿嶄綔鏃跺皢绯荤粺鍙橀噺绾﹀畾鐨勫瓧娈佃祴鍊 + * @param data + */ + private void fillInsertSysVar(Map data) { + if(data.containsKey(DataBaseConstant.CREATE_DATE_TABLE)){ + data.put(DataBaseConstant.CREATE_DATE_TABLE, DateUtils.formatDate()); + } + if(data.containsKey(DataBaseConstant.CREATE_TIME_TABLE)){ + data.put(DataBaseConstant.CREATE_TIME_TABLE, DateUtils.formatTime()); + } + if(data.containsKey(DataBaseConstant.CREATE_BY_TABLE)){ + data.put(DataBaseConstant.CREATE_BY_TABLE, ResourceUtil.getUserSystemData(DataBaseConstant.SYS_USER_CODE)); + } + if(data.containsKey(DataBaseConstant.CREATE_NAME_TABLE)){ + data.put(DataBaseConstant.CREATE_NAME_TABLE, ResourceUtil.getUserSystemData(DataBaseConstant.SYS_USER_NAME)); + } + if(data.containsKey(DataBaseConstant.SYS_COMPANY_CODE_TABLE)){ + data.put(DataBaseConstant.SYS_COMPANY_CODE_TABLE, ResourceUtil.getUserSystemData(DataBaseConstant.SYS_COMPANY_CODE)); + } + if(data.containsKey(DataBaseConstant.SYS_ORG_CODE_TABLE)){ + data.put(DataBaseConstant.SYS_ORG_CODE_TABLE, ResourceUtil.getUserSystemData(DataBaseConstant.SYS_ORG_CODE)); + } + if(data.containsKey(DataBaseConstant.SYS_USER_CODE_TABLE)){ + data.put(DataBaseConstant.SYS_USER_CODE_TABLE, ResourceUtil.getUserSystemData(DataBaseConstant.SYS_USER_CODE)); + } + } + /** + * 灏哠ql澧炲己涓殑绯荤粺鍙橀噺鏇挎崲鎺 + * @param sql + * @return + */ + private String replaceExtendSqlSysVar(String sql){ + sql = sql.replace("{"+DataBaseConstant.SYS_USER_CODE_TABLE+"}", ResourceUtil.getUserSystemData(DataBaseConstant.SYS_USER_CODE)) + .replace("{"+DataBaseConstant.SYS_USER_NAME_TABLE+"}", ResourceUtil.getUserSystemData(DataBaseConstant.SYS_USER_NAME)) + .replace("{"+DataBaseConstant.SYS_ORG_CODE_TABLE+"}", ResourceUtil.getUserSystemData(DataBaseConstant.SYS_ORG_CODE)) + .replace("{"+DataBaseConstant.SYS_COMPANY_CODE_TABLE+"}", ResourceUtil.getUserSystemData(DataBaseConstant.SYS_COMPANY_CODE)) + .replace("{"+DataBaseConstant.SYS_DATE_TABLE+"}", DateUtils.formatDate()) + .replace("{"+DataBaseConstant.SYS_TIME_TABLE+"}", DateUtils.formatTime()); + return sql; + } + + private Map getAllFieldByTableName(String tableName){ + //鑾峰彇鐗堟湰鍙 + String version = cgFormFieldService.getCgFormVersionByTableName(tableName); + Map map = cgFormFieldService.getAllCgFormFieldByTableName(tableName, version); + return map; + } + + //鍒ゆ柇key鏄惁涓鸿〃閰嶇疆鐨勫睘鎬 + private boolean isContainsFieled(String tableName,String fieledName){ + boolean flag = false; + if(getAllFieldByTableName(tableName).containsKey(fieledName)){ + flag = true; + } + return flag; + } +} + diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/button/CgformButtonServiceImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/button/CgformButtonServiceImpl.java new file mode 100644 index 00000000..a4fc584e --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/button/CgformButtonServiceImpl.java @@ -0,0 +1,48 @@ +package org.jeecgframework.web.cgform.service.impl.button; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.jeecgframework.web.cgform.entity.button.CgformButtonEntity; +import org.jeecgframework.web.cgform.service.button.CgformButtonServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; + +@Service("cgformButtonService") +@Transactional +public class CgformButtonServiceImpl extends CommonServiceImpl implements CgformButtonServiceI { + + /** + * 鏌ヨ鎸夐挳list + * @param formId + * @return + */ + + public List getCgformButtonListByFormId(String formId) { + StringBuilder hql = new StringBuilder(""); + hql.append(" from CgformButtonEntity t"); + hql.append(" where t.formId=? order by t.orderNum asc"); + List list = this.findHql(hql.toString(), formId); + return list; + } + + /** + * 鏍¢獙鎸夐挳鍞竴鎬 + * @param cgformButtonEntity + * @return + */ + + public List checkCgformButton(CgformButtonEntity cgformButtonEntity) { + StringBuilder hql = new StringBuilder(""); + hql.append(" from CgformButtonEntity t"); + hql.append(" where t.formId='").append(cgformButtonEntity.getFormId()).append("'"); + hql.append(" and t.buttonCode ='").append(cgformButtonEntity.getButtonCode()).append("'"); + if(cgformButtonEntity.getId()!=null){ + hql.append(" and t.id !='").append(cgformButtonEntity.getId()).append("'"); + } + List list = this.findHql(hql.toString()); + return list; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/button/CgformButtonSqlServiceImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/button/CgformButtonSqlServiceImpl.java new file mode 100644 index 00000000..ebbf00db --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/button/CgformButtonSqlServiceImpl.java @@ -0,0 +1,48 @@ +package org.jeecgframework.web.cgform.service.impl.button; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.jeecgframework.web.cgform.entity.button.CgformButtonSqlEntity; +import org.jeecgframework.web.cgform.service.button.CgformButtonSqlServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; + +@Service("cgformButtonSqlService") +@Transactional +public class CgformButtonSqlServiceImpl extends CommonServiceImpl implements CgformButtonSqlServiceI { + + /** + * 鏍¢獙鎸夐挳sql澧炲己鍞竴鎬 + * @param cgformButtonEntity + * @return + */ + + public List checkCgformButtonSql( + CgformButtonSqlEntity cgformButtonSqlEntity) { + StringBuilder hql = new StringBuilder(""); + hql.append(" from CgformButtonSqlEntity t"); + hql.append(" where t.formId='").append(cgformButtonSqlEntity.getFormId()).append("'"); + hql.append(" and t.buttonCode ='").append(cgformButtonSqlEntity.getButtonCode()).append("'"); + if(cgformButtonSqlEntity.getId()!=null){ + hql.append(" and t.id !='").append(cgformButtonSqlEntity.getId()).append("'"); + } + List list = this.findHql(hql.toString()); + return list; + } + + + public CgformButtonSqlEntity getCgformButtonSqlByCodeFormId(String buttonCode, String formId) { + StringBuilder hql = new StringBuilder(""); + hql.append(" from CgformButtonSqlEntity t"); + hql.append(" where t.formId='").append(formId).append("'"); + hql.append(" and t.buttonCode ='").append(buttonCode).append("'"); + List list = this.findHql(hql.toString()); + if(list!=null&&list.size()>0){ + return list.get(0); + } + return null; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/cgformcategory/CgformCategoryServiceImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/cgformcategory/CgformCategoryServiceImpl.java new file mode 100644 index 00000000..c6a7c38d --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/cgformcategory/CgformCategoryServiceImpl.java @@ -0,0 +1,12 @@ +package org.jeecgframework.web.cgform.service.impl.cgformcategory; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.web.cgform.service.cgformcategory.CgformCategoryServiceI; + +@Service("cgformCategoryService") +@Transactional +public class CgformCategoryServiceImpl extends CommonServiceImpl implements CgformCategoryServiceI { + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/cgformftl/CgformFtlServiceImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/cgformftl/CgformFtlServiceImpl.java new file mode 100644 index 00000000..234b44a6 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/cgformftl/CgformFtlServiceImpl.java @@ -0,0 +1,86 @@ +package org.jeecgframework.web.cgform.service.impl.cgformftl; + +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.web.cgform.entity.cgformftl.CgformFtlEntity; +import org.jeecgframework.web.cgform.service.cgformftl.CgformFtlServiceI; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +@Service("cgformFtlService") +@Transactional +public class CgformFtlServiceImpl extends CommonServiceImpl implements CgformFtlServiceI { + @Override + public Map getCgformFtlByTableName(String tableName, String ftlVersion) { + StringBuilder sql = new StringBuilder(""); + sql.append("select ftl.* from cgform_ftl ftl,cgform_head head"); + sql.append(" where ftl.cgform_id=head.id"); + sql.append(" and ftl.ftl_version=? "); + sql.append(" and head.table_name=? "); + List> list = this.findForJdbc(sql.toString(), ftlVersion, tableName); + if(list!=null&&list.size()>0){ + return list.get(0); + } + return null; + } + + /** + * 鏍规嵁tableName鑾峰彇form妯℃澘淇℃伅 + */ + + public Map getCgformFtlByTableName(String tableName) { + StringBuilder sql = new StringBuilder(""); + sql.append("select ftl.* from cgform_ftl ftl,cgform_head head"); + sql.append(" where ftl.cgform_id=head.id"); + sql.append(" and ftl.ftl_status='1'"); + sql.append(" and head.table_name=? "); + List> list = this.findForJdbc(sql.toString(), tableName); + if(list!=null&&list.size()>0){ + return list.get(0); + } + return null; + } + + + public int getNextVarsion(String cgformId) { + StringBuilder sql = new StringBuilder(""); + sql.append("select (max(ftl_version)+1) as varsion from cgform_ftl"); + sql.append(" where cgform_id = ? "); + Map map = this.findOneForJdbc(sql.toString(), cgformId); + if(map!=null){ + int varsion = map.get("varsion")==null?1:Integer.valueOf(map.get("varsion").toString()); + return varsion; + } + return 1; + } + + + public boolean hasActive(String cgformId) { + StringBuilder sql = new StringBuilder(""); + sql.append("select * from cgform_ftl"); + sql.append(" where ftl_status = '1' "); + sql.append(" and cgform_id = ? "); + Map map = this.findOneForJdbc(sql.toString(), cgformId); + if(map!=null){ + return true; + } + return false; + } + + @Override + public String getUserFormFtl(String id) { + CriteriaQuery cq = new CriteriaQuery(CgformFtlEntity.class); + cq.eq("cgformId", id); + cq.eq("ftlStatus", "1"); + cq.add(); + List list = this.getListByCriteriaQuery(cq,false); + if(list.size() == 1){ + return list.get(0).getFtlContent(); + } + return null; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/config/CgFormFieldServiceImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/CgFormFieldServiceImpl.java new file mode 100644 index 00000000..7e0b01de --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/CgFormFieldServiceImpl.java @@ -0,0 +1,710 @@ +package org.jeecgframework.web.cgform.service.impl.config; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.jeecgframework.web.cgform.common.CgAutoListConstant; +import org.jeecgframework.web.cgform.dao.config.CgFormFieldDao; +import org.jeecgframework.web.cgform.dao.config.CgFormVersionDao; +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.entity.config.CgSubTableVO; +import org.jeecgframework.web.cgform.entity.enhance.CgformEnhanceJsEntity; +import org.jeecgframework.web.cgform.exception.BusinessException; +import org.jeecgframework.web.cgform.service.cgformftl.CgformFtlServiceI; +import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI; +import org.jeecgframework.web.cgform.service.config.DbTableHandleI; +import org.jeecgframework.web.cgform.service.enhance.CgformEnhanceJsServiceI; +import org.jeecgframework.web.cgform.service.impl.config.util.DbTableProcess; +import org.jeecgframework.web.cgform.service.impl.config.util.DbTableUtil; +import org.jeecgframework.web.cgform.util.PublicUtil; +import org.jeecgframework.web.system.pojo.base.TSOperation; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.jeecgframework.core.annotation.Ehcache; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.orm.hibernate4.SessionFactoryUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.sun.star.uno.RuntimeException; + +@Service("cgFormFieldService") +@Transactional +public class CgFormFieldServiceImpl extends CommonServiceImpl implements + CgFormFieldServiceI { + /** + * Logger for this class + */ + private static final Logger logger = Logger + .getLogger(CgFormFieldServiceImpl.class); + //鍚屾鏂瑰紡锛氭櫘閫氬悓姝 + private static final String SYN_NORMAL = "normal"; + //鍚屾鏂瑰紡锛氬己鍒跺悓姝 + private static final String SYN_FORCE = "force"; + @Autowired + @Qualifier("jdbcTemplate") + private JdbcTemplate jdbcTemplate; + @Autowired + private CgFormVersionDao cgFormVersionDao; + @Autowired + private CgformFtlServiceI cgformFtlService; + @Autowired + private CgformEnhanceJsServiceI cgformEnhanceJsService; + @Autowired + private CgFormFieldDao cgFormFieldDao; + + + public synchronized void updateTable(CgFormHeadEntity t, String sign) { + CgFormFieldEntity column; + boolean databaseFieldIsChange = false; + for (int i = 0; i < t.getColumns().size(); i++) { + column = t.getColumns().get(i); + if(oConvertUtils.isEmpty(column.getFieldName())){ + continue; + } + column.setTable(t); + // 璁剧疆checkbox鐨勫 + PublicUtil.judgeCheckboxValue(column,"isNull,isShow,isShowList,isQuery,isKey"); + if (oConvertUtils.isEmpty(column.getId())) { + databaseFieldIsChange = true; + this.save(column); + } else { + CgFormFieldEntity c = this.getEntity(CgFormFieldEntity.class,column.getId()); + if (!databaseFieldIsChange && databaseFieldIsChange(c, column)) { + databaseFieldIsChange = true; + } + try { + MyBeanUtils.copyBeanNotNull2Bean(column, c); + } catch (Exception e) { + e.printStackTrace(); + logger.error(e); + } + this.saveOrUpdate(c); + } + } + t.setIsDbSynch(databaseFieldIsChange ? "N" : t.getIsDbSynch()); + + //琛ㄥ崟閰嶇疆淇敼锛岀増鏈彿鏈崌绾 + Integer newVerion = Integer.parseInt(t.getJformVersion())+1; + t.setJformVersion(newVerion.toString()); + this.saveOrUpdate(t); + } + + /** + * 鍒ゆ柇鏁版嵁搴撳瓧娈垫槸鍚︿慨鏀逛簡 + * + * @param oldColumn + * @param newColumn + * @return + */ + private boolean databaseFieldIsChange(CgFormFieldEntity oldColumn, + CgFormFieldEntity newColumn) { + if (!PublicUtil.compareValue(oldColumn.getFieldName(), newColumn.getFieldName()) + || !PublicUtil.compareValue(oldColumn.getContent(),newColumn.getContent()) + || !PublicUtil.compareValue(oldColumn.getLength(),newColumn.getLength()) + || !PublicUtil.compareValue(oldColumn.getPointLength(),newColumn.getPointLength()) + || !PublicUtil.compareValue(oldColumn.getType(),newColumn.getType()) + || !PublicUtil.compareValue(oldColumn.getIsNull(),newColumn.getIsNull()) + || !PublicUtil.compareValue(oldColumn.getOrderNum(),newColumn.getOrderNum()) + || !PublicUtil.compareValue(oldColumn.getIsKey(),newColumn.getIsKey()) + || !PublicUtil.compareValue(oldColumn.getMainTable(),newColumn.getMainTable()) + || !PublicUtil.compareValue(oldColumn.getMainField(),newColumn.getMainField()) + ||!PublicUtil.compareValue(oldColumn.getFieldDefault(),newColumn.getFieldDefault()) + ) + { + return true; + } + return false; + } + + + + public void saveTable(CgFormHeadEntity cgFormHead) { + cgFormHead.setJformVersion("1"); + cgFormHead.setIsDbSynch("N"); + cgFormHead.setId((String) this.getSession().save(cgFormHead)); + CgFormFieldEntity column; + for (int i = 0; i < cgFormHead.getColumns().size(); i++) { + column = cgFormHead.getColumns().get(i); + PublicUtil.judgeCheckboxValue(column, + "isNull,isShow,isShowList,isQuery,isKey"); + column.setTable(cgFormHead); + this.save(column); + } + } + + /** + * 閲嶈浇鍒涘缓琛 + * + * @param cgFormHead + * @param a + */ + + public void saveTable(CgFormHeadEntity cgFormHead, String a) { + cgFormHead.setId((String) this.getSession().save(cgFormHead)); + CgFormFieldEntity column; + for (int i = 0; i < cgFormHead.getColumns().size(); i++) { + column = cgFormHead.getColumns().get(i); + PublicUtil.judgeCheckboxValue(column, + "isNull,isShow,isShowList,isQuery,isKey"); + column.setTable(cgFormHead); + this.save(column); + } + } + + + public Boolean judgeTableIsExit(String tableName) { + Connection conn = null; + ResultSet rs = null; + String tableNamePattern = tableName; + try { + String[] types = { "TABLE" }; + conn = SessionFactoryUtils.getDataSource( + getSession().getSessionFactory()).getConnection(); + String dataBaseType = DbTableUtil.getDataType(getSession()); + if("ORACLE".equals(dataBaseType)){ + tableNamePattern = tableName.toUpperCase(); + //鐢变簬PostgreSQL鏄ぇ灏忓啓鏁忔劅鐨勶紝骞堕粯璁ゅSQL璇彞涓殑鏁版嵁搴撳璞″悕绉拌浆鎹负灏忓啓 + }else if ("POSTGRESQL".equals(dataBaseType)){ + tableNamePattern = tableName.toLowerCase(); + } + DatabaseMetaData dbMetaData = conn.getMetaData(); + rs = dbMetaData.getTables(null,null,tableNamePattern, types); + if (rs.next()) { + return true; + } else { + return false; + } + } catch (SQLException e) { + throw new RuntimeException(); + }finally{//鍏抽棴杩炴帴 + try { + if(rs!=null){rs.close();} + if(conn!=null){conn.close();} + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + /** + * 鍚屾鏁版嵁搴 + * + * @throws BusinessException + */ + public boolean dbSynch(CgFormHeadEntity cgFormHead,String synMethod) + throws BusinessException { + try { + if(SYN_NORMAL.equals(synMethod)){ + //鏅氭柟寮忓悓姝 + // step.1鍒ゆ柇琛ㄦ槸鍚﹀瓨鍦 + if (judgeTableIsExit(cgFormHead.getTableName())) { + // 鏇存柊琛ㄦ搷浣 + DbTableProcess dbTableProcess = new DbTableProcess(getSession()); + List updateTable = dbTableProcess.updateTable( + cgFormHead, getSession()); + for (String sql : updateTable) { + if(StringUtils.isNotEmpty(sql)){ + this.executeSql(sql); + } + } + } else { + // 涓嶅瓨鍦ㄧ殑鎯呭喌涓嬶紝鍒涘缓鏂拌〃 + try { + DbTableProcess.createOrDropTable(cgFormHead, getSession()); + } catch (Exception e) { + logger.error(e.getMessage(),e); + throw new BusinessException("鍚屾澶辫触:鍒涘缓鏂拌〃鍑洪敊"); + } + } + cgFormHead.setIsDbSynch("Y"); + this.saveOrUpdate(cgFormHead); + }else if(SYN_FORCE.equals(synMethod)){ + //寮哄埗鏂瑰紡鍚屾 + try { + try{ + String sql = getTableUtil().dropTableSQL(cgFormHead.getTableName()); + this.executeSql(sql); + }catch (Exception e) { + //閮ㄥ垎鏁版嵁搴撳湪娌℃湁琛ㄨ屾墽琛屽垹琛ㄨ鍙ユ椂浼氭姤閿 + logger.error(e.getMessage()); + } + DbTableProcess.createOrDropTable(cgFormHead, getSession()); + cgFormHead.setIsDbSynch("Y"); + this.saveOrUpdate(cgFormHead); + } catch (Exception e) { + logger.error(e.getMessage(),e); + throw new BusinessException("鍚屾澶辫触:鍒涘缓鏂拌〃鍑洪敊"); + } + } + }catch (BusinessException e) { + logger.error(e.getMessage(),e); + throw new BusinessException(e.getMessage()); + }catch (Exception e) { + logger.error(e.getMessage(),e); + throw new BusinessException("鍚屾澶辫触:鏁版嵁搴撲笉鏀寔鏈淇敼,濡傛灉涓嶉渶瑕佷繚鐣欐暟鎹,璇峰皾璇曞己鍒跺悓姝"); + } + return true; + } + + + public void deleteCgForm(CgFormHeadEntity cgFormHead) { + if (judgeTableIsExit(cgFormHead.getTableName())) { + String sql = getTableUtil().dropTableSQL(cgFormHead.getTableName()); + this.executeSql(sql); + } + this.delete(cgFormHead); + + } + + /** + * 鑾峰彇鏁版嵁鎿嶄綔鎺ュ彛 + * + * @return + */ + private DbTableHandleI getTableUtil() { + return DbTableUtil.getTableHandle(getSession()); + } + + + public List> getCgFormFieldByTableName(String tableName) { + List> list = cgFormFieldDao.getCgFormFieldByTableName(tableName); + return list; + } + + private List> getCgFormHiddenFieldByTableName( + String tableName) { + List> list = cgFormFieldDao.getCgFormHiddenFieldByTableName(tableName); + if (list != null && list.size() > 0) { + for (Map map : list) { + if ("id".equalsIgnoreCase((String) map.get("field_name"))) { + list.remove(map); + break; + } + } + } else { + list = new ArrayList>(); + } + return list; + } + + + public Map getCgFormFieldByFormId(String formid) { + StringBuilder hql = new StringBuilder(""); + hql.append("from CgFormFieldEntity f"); + hql.append(" where f.table.id=? "); + List list = this.findHql(hql.toString(), formid); + Map map = new HashMap(); + if (list != null && list.size() > 0) { + for (CgFormFieldEntity po : list) { + map.put(po.getFieldName(), po); + } + } + return map; + } + + + public Map getAllCgFormFieldByTableName( + String tableName) { + StringBuilder hql = new StringBuilder(""); + hql.append("from CgFormFieldEntity f"); + hql.append(" where f.table.tableName=? "); + List list = this.findHql(hql.toString(), tableName); + Map map = new HashMap(); + if (list != null && list.size() > 0) { + for (CgFormFieldEntity po : list) { + map.put(po.getFieldName(), po); + } + } + return map; + } + + + @Ehcache + public Map getAllCgFormFieldByTableName( + String tableName, String version) { + StringBuilder hql = new StringBuilder(""); + hql.append("from CgFormFieldEntity f"); + hql.append(" where f.table.tableName=? "); + List list = this.findHql(hql.toString(), tableName); + Map map = new HashMap(); + if (list != null && list.size() > 0) { + for (CgFormFieldEntity po : list) { + map.put(po.getFieldName(), po); + } + } + return map; + } + + + public CgFormHeadEntity getCgFormHeadByTableName(String tableName) { + StringBuilder hql = new StringBuilder(""); + hql.append("from CgFormHeadEntity f"); + hql.append(" where f.tableName=? "); + List list = this.findHql(hql.toString(), tableName); + if (list != null && list.size() > 0) { + return list.get(0); + } + return null; + } + + + public List> getSubTableData(String mainTableName, + String subTableName, Object mainTableId) { + StringBuilder sql1 = new StringBuilder(""); + sql1.append("select f.* from cgform_field f ,cgform_head h"); + sql1.append(" where f.table_id = h.id "); + sql1.append(" and h.table_name=? "); + sql1.append(" and f.main_table=? "); + List> list = this.findForJdbc(sql1.toString(), + subTableName, mainTableName); + + StringBuilder sql2 = new StringBuilder(""); + sql2.append("select sub.* from ").append(subTableName).append(" sub "); + sql2.append(", ").append(mainTableName).append(" main "); + sql2.append("where 1=1 "); + if (list != null && list.size() > 0) { + for (Map map : list) { + if (map.get("main_field") != null) { + sql2.append(" and sub.") + .append((String) map.get("field_name")).append("=") + .append("main.") + .append((String) map.get("main_field")); + } + } + } + sql2.append(" and main.id= ? "); + List> subTableDataList = this.findForJdbc( + sql2.toString(), mainTableId); + return subTableDataList; + } + + + public boolean appendSubTableStr4Main(CgFormHeadEntity entity) { + // step.1 鑾峰彇鏈〃鐨勫悕绉 + String thisSubTable = entity.getTableName(); + List columns = entity.getColumns(); + // step.2 鎵弿瀛楁閰嶇疆锛屽惊鐜鐞嗗~鏈変富琛ㄤ互鍙婁富琛ㄥ瓧娈电殑鏉$洰 + for (CgFormFieldEntity fieldE : columns) { + String mainT = fieldE.getMainTable(); + String mainF = fieldE.getMainField(); + if (!StringUtil.isEmpty(mainT) && !StringUtil.isEmpty(mainF)) { + CgFormHeadEntity mainE = this.getCgFormHeadByTableName(mainT); + if (mainE == null) { + continue; + } + // step.4 杩藉姞澶勭悊涓昏〃鐨勯檮琛ㄤ覆 + String subTableStr = String + .valueOf(mainE.getSubTableStr() == null ? "" : mainE + .getSubTableStr()); + // step.5 鍒ゆ柇鏄惁宸茬粡瀛樺湪浜庨檮琛ㄤ覆 + if (!subTableStr.contains(thisSubTable)) { + // step.6 杩藉姞鍒伴檮琛ㄤ覆 + if (!StringUtil.isEmpty(subTableStr)) { + subTableStr += "," + thisSubTable; + } else { + subTableStr += thisSubTable; + } + mainE.setSubTableStr(subTableStr); + logger.info("--涓昏〃" + mainE.getTableName() + "鐨勯檮琛ㄤ覆锛" + + mainE.getSubTableStr()); + } + // step.7 鏇存柊涓昏〃鐨勮〃閰嶇疆 + this.updateTable(mainE, "sign"); + } + } + return true; + } + + + public boolean removeSubTableStr4Main(CgFormHeadEntity entity) { + if (entity == null) { + return false; + } + // step.1 鑾峰彇鏈〃鐨勫悕绉 + String thisSubTable = entity.getTableName(); + List columns = entity.getColumns(); + // step.2 鎵弿瀛楁閰嶇疆锛屽惊鐜鐞嗗~鏈変富琛ㄤ互鍙婁富琛ㄥ瓧娈电殑鏉$洰 + for (CgFormFieldEntity fieldE : columns) { + String mainT = fieldE.getMainTable(); + String mainF = fieldE.getMainField(); + if (!StringUtil.isEmpty(mainT) && !StringUtil.isEmpty(mainF)) { + CgFormHeadEntity mainE = this.getCgFormHeadByTableName(mainT); + if (mainE == null) { + continue; + } + // step.4 杩藉姞澶勭悊涓昏〃鐨勯檮琛ㄤ覆 + String subTableStr = String + .valueOf(mainE.getSubTableStr() == null ? "" : mainE + .getSubTableStr()); + // step.5 鍒ゆ柇鏄惁宸茬粡瀛樺湪浜庨檮琛ㄤ覆 + if (subTableStr.contains(thisSubTable)) { + // step.6 鍓旈櫎涓昏〃鐨勯檮琛ㄤ覆 + if (subTableStr.contains(thisSubTable + ",")) { + subTableStr = subTableStr.replace(thisSubTable + ",", + ""); + } else if(subTableStr.contains(","+thisSubTable)){ + subTableStr = subTableStr.replace("," + thisSubTable, + ""); + } else{ + subTableStr = subTableStr.replace(thisSubTable,""); + } + mainE.setSubTableStr(subTableStr); + logger.info("--涓昏〃" + mainE.getTableName() + "鐨勯檮琛ㄤ覆锛" + + mainE.getSubTableStr()); + // step.7 鏇存柊涓昏〃鐨勮〃閰嶇疆,涓嶇敤鏇存柊,鍥犱负hibernate鏄鍙栫殑缂撳瓨,鎵浠ュ拰閭h竟鎿嶄綔鐨勫璞℃槸涓涓殑 + //this.updateTable(mainE, null); + } + } + } + return true; + } + + + public void sortSubTableStr(CgFormHeadEntity entity) { + if (entity == null) + return; + CgFormHeadEntity main = null; + List columns = entity.getColumns(); + for (CgFormFieldEntity fieldE : columns) { + String mainT = fieldE.getMainTable(); + String mainF = fieldE.getMainField(); + if (!StringUtil.isEmpty(mainT) && !StringUtil.isEmpty(mainF)) { + CgFormHeadEntity mainE = this.getCgFormHeadByTableName(mainT); + if (mainE == null) { + continue; + } + main = mainE; + } + } + if(main==null){ + return; + } + String subTableStr = main.getSubTableStr(); + if(StringUtils.isNotEmpty(subTableStr)){ + String [] subTables = subTableStr.split(","); + if (subTables.length <= 1) + return; + List subList = new ArrayList(); + for(String subTable : subTables){ + CgFormHeadEntity sub = this.getCgFormHeadByTableName(subTable); + subList.add(sub); + } + Collections.sort(subList, new Comparator() { + public int compare(CgFormHeadEntity arg0, CgFormHeadEntity arg1) { + Integer tabOrder0 = arg0.getTabOrder(); + if (tabOrder0 == null) { + tabOrder0 = 0; + } + Integer tabOrder1 = arg1.getTabOrder(); + if (tabOrder1 == null) { + tabOrder1 = 0; + } + return tabOrder0.compareTo(tabOrder1); + } + }); + subTableStr = ""; + for (CgFormHeadEntity sub : subList) { + subTableStr += sub.getTableName() + ","; + } + subTableStr = subTableStr.substring(0, subTableStr.length() - 1); + main.setSubTableStr(subTableStr); + this.updateTable(main, "sign"); + } + } + + + public String getCgFormVersionByTableName(String tableName) { + String version = cgFormVersionDao + .getCgFormVersionByTableName(tableName); + return StringUtil.isEmpty(version) ? "0" : version; + + } + + + public String getCgFormVersionById(String id) { + String version = cgFormVersionDao.getCgFormVersionById(id); + return StringUtil.isEmpty(version) ? "0" : version; + } + + /** + * 鑾峰彇琛ㄥ崟閰嶇疆 + * + * @param tableName + * @param version + * @return + */ + public Map getFtlFormConfig(String tableName, String version) { + Map data = new HashMap(); + Map field = new HashMap(); + CgFormHeadEntity head = this.getCgFormHeadByTableName(tableName, + version); + data.put("head", head); + if (head.getJformType() == CgAutoListConstant.JFORM_TYPE_MAIN_TALBE) { + CgSubTableVO subtableVo = new CgSubTableVO(); + String subTableStr = head.getSubTableStr(); + if (StringUtils.isNotEmpty(subTableStr)) { + String[] subTables = subTableStr.split(","); + List> subTalbeFieldList = new ArrayList>(); + List> subTalbeHiddenFieldList = new ArrayList>(); + for (String subTable : subTables) { + subTalbeFieldList = this + .getCgFormFieldByTableName(subTable); + subTalbeHiddenFieldList = this + .getCgFormHiddenFieldByTableName(subTable); + CgFormHeadEntity subhead = this + .getCgFormHeadByTableName(subTable); + subtableVo = new CgSubTableVO(); + subtableVo.setHead(subhead); + subtableVo.setFieldList(subTalbeFieldList); + subtableVo.setHiddenFieldList(subTalbeHiddenFieldList); + field.put(subTable, subtableVo); + } + } + } + // 瑁呰浇闄勮〃琛ㄥ崟閰嶇疆 + data.put("field", field); + data.put("tableName", tableName); + List> fieldList = null; + if (head.getJformType() == CgAutoListConstant.JFORM_TYPE_MAIN_TALBE) { + // 鏌ヨ涓昏〃鎴栧崟琛ㄨ〃鍗曢厤缃 + fieldList = this.getCgFormFieldByTableName(tableName); + } else { + Map cgformFtlEntity = cgformFtlService + .getCgformFtlByTableName(tableName); + if (cgformFtlEntity == null) { + // 鏌ヨ涓昏〃鎴栧崟琛ㄨ〃鍗曢厤缃 + fieldList = this.getCgFormFieldByTableName(tableName); + } + } + // 闅愯棌瀛楁 鍓旈櫎id + List> hiddenFieldList = getCgFormHiddenFieldByTableName(tableName); + data.put("columnhidden", hiddenFieldList); + //澶勭悊涓閬嶆潈闄愰棶棰 + Set operationCodes = (Set) ContextHolderUtils.getRequest().getAttribute(Globals.OPERATIONCODES); + Map operationCodesMap = new HashMap(); + if(operationCodes != null){ + TSOperation tsOperation; + for (String id : operationCodes) { + tsOperation = this.getEntity(TSOperation.class, id); + if(tsOperation != null && tsOperation.getStatus() == 0){ + operationCodesMap.put(tsOperation.getOperationcode(), tsOperation); + } + } + } + if (fieldList != null) { + List> list = new ArrayList>(); + List> textareaList = new ArrayList>(); + for (Map map : fieldList) { + if(operationCodesMap.containsKey(map.get("field_name"))){ + if(operationCodesMap.get(map.get("field_name")).getOperationType() == 0){ + hiddenFieldList.add(map); + continue; + } else { + map.put("operationCodesReadOnly",true); + } + } + if (!"textarea".equals((String) map.get("show_type"))) { + list.add(map); + } else { + textareaList.add(map); + } + } + data.put("columns", list); + data.put("columnsarea", textareaList); + } + // js澧炲己 + String jsCode = ""; + CgformEnhanceJsEntity jsEnhance = cgformEnhanceJsService + .getCgformEnhanceJsByTypeFormId("form", head.getId()); + if (jsEnhance != null) { + jsCode = jsEnhance.getCgJsStr(); + } + data.put("js_plug_in", jsCode); + return data; + } + + /** + * 鏍规嵁tableName 鑾峰彇琛ㄥ崟閰嶇疆 鏍规嵁鐗堟湰鍙风紦瀛 + * + * @param tableName + * @param version + * @return + */ + @Ehcache + public CgFormHeadEntity getCgFormHeadByTableName(String tableName, + String version) { + StringBuilder hql = new StringBuilder(""); + hql.append("from CgFormHeadEntity f"); + hql.append(" where f.tableName=? "); + List list = this.findHql(hql.toString(), tableName); + if (list != null && list.size() > 0) { + return list.get(0); + } + return null; + } + + + public synchronized boolean updateVersion(String formId) { + try { + int newV = Integer.parseInt(cgFormVersionDao + .getCgFormVersionById(formId)) + 1; + cgFormVersionDao.updateVersion(String.valueOf(newV + ""), formId); + } catch (Exception e) { + e.printStackTrace(); + logger.debug(e.getMessage()); + return false; + } + return true; + } + + + public List getHiddenCgFormFieldByTableName( + String tableName) { + StringBuilder hql = new StringBuilder(""); + hql.append("from CgFormFieldEntity f"); + hql.append(" where f.isShow !='Y' and f.table.tableName=? "); + List list = this.findHql(hql.toString(), tableName); + if (list != null && list.size() > 0) { + for (CgFormFieldEntity po : list) { + if ("id".equalsIgnoreCase(po.getFieldName())) { + list.remove(po); + break; + } + } + } else { + list = new ArrayList(); + } + return list; + } + + + public boolean checkTableExist(String tableName) { + boolean result =true; + try{ + this.findForJdbc("select count(*) from "+tableName); + }catch(Exception e){ + result =false; + } + return result; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/config/DbTableMysqlHandleImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/DbTableMysqlHandleImpl.java new file mode 100644 index 00000000..9c772e89 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/DbTableMysqlHandleImpl.java @@ -0,0 +1,122 @@ +package org.jeecgframework.web.cgform.service.impl.config; + +import org.apache.commons.lang.StringUtils; + +import org.jeecgframework.web.cgform.service.config.DbTableHandleI; +import org.jeecgframework.web.cgform.service.impl.config.util.ColumnMeta; + + +/** + * mysql鐨勮〃宸ュ叿绫 + */ +public class DbTableMysqlHandleImpl implements DbTableHandleI { + + + public String getAddColumnSql(ColumnMeta columnMeta) { + return " ADD COLUMN "+getAddFieldDesc(columnMeta)+";"; + } + + + public String getReNameFieldName(ColumnMeta columnMeta) { + return "CHANGE COLUMN "+columnMeta.getOldColumnName() +" "+getRenameFieldDesc(columnMeta)+ " ;"; + } + + + public String getUpdateColumnSql(ColumnMeta cgformcolumnMeta,ColumnMeta datacolumnMeta) { + return " MODIFY COLUMN "+getUpdateFieldDesc(cgformcolumnMeta,datacolumnMeta)+";"; + } + + + public String getMatchClassTypeByDataType(String dataType,int digits) { + String result =""; + if (dataType.equalsIgnoreCase("varchar")) { + result="string"; + } else if(dataType.equalsIgnoreCase("double")){ + result="double"; + }else if (dataType.equalsIgnoreCase("int")) { + result="int"; + }else if (dataType.equalsIgnoreCase("Date")) { + result="date"; + }else if (dataType.equalsIgnoreCase("Datetime")) { + result="date"; + }else if (dataType.equalsIgnoreCase("decimal")){ + result="bigdecimal"; + }else if (dataType.equalsIgnoreCase("text")){ + result="text"; + }else if (dataType.equalsIgnoreCase("blob")){ + result="blob"; + } + return result; + } + + + public String dropTableSQL(String tableName) { + return " DROP TABLE IF EXISTS "+tableName+" ;"; + } + + + public String getDropColumnSql(String fieldName) { + return " DROP COLUMN "+fieldName+";"; + } + /** + * 灏唃et...FieldDesc杩欎簺鏂规硶涓叡鍚岀殑鍐呭鎶藉嚭鏉 + * @param cgfromcolumnMeta + * @param datacolumnMeta + * @return + */ + private String getFieldDesc(ColumnMeta cgfromcolumnMeta,ColumnMeta datacolumnMeta){ + String result =""; + if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("string")){ + result = cgfromcolumnMeta.getColumnName()+" varchar("+cgfromcolumnMeta.getColumnSize()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("date")){ + result = cgfromcolumnMeta.getColumnName()+" datetime"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("int")){ + result = cgfromcolumnMeta.getColumnName()+" int("+cgfromcolumnMeta.getColumnSize()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("double")){ + result = cgfromcolumnMeta.getColumnName()+" double("+cgfromcolumnMeta.getColumnSize()+","+cgfromcolumnMeta.getDecimalDigits()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("bigdecimal")){ + result = cgfromcolumnMeta.getColumnName()+" decimal("+cgfromcolumnMeta.getColumnSize()+","+cgfromcolumnMeta.getDecimalDigits()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("text")){ + result = cgfromcolumnMeta.getColumnName()+" text "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("blob")){ + result = cgfromcolumnMeta.getColumnName()+" blob "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + } + result += (StringUtils.isNotEmpty(cgfromcolumnMeta.getComment())?" COMMENT '"+cgfromcolumnMeta.getComment()+"'":" "); + result += (StringUtils.isNotEmpty(cgfromcolumnMeta.getFieldDefault())?" DEFAULT "+cgfromcolumnMeta.getFieldDefault():" "); + String pkType = cgfromcolumnMeta.getPkType(); + if("id".equalsIgnoreCase(cgfromcolumnMeta.getColumnName())&&pkType!=null&& + ("SEQUENCE".equalsIgnoreCase(pkType)||"NATIVE".equalsIgnoreCase(pkType))){ + result += " AUTO_INCREMENT "; + } + return result; + } + + private String getUpdateFieldDesc(ColumnMeta cgfromcolumnMeta,ColumnMeta datacolumnMeta) { + String result = this.getFieldDesc(cgfromcolumnMeta, datacolumnMeta); + return result; + } + + private String getAddFieldDesc(ColumnMeta cgfromcolumnMeta) { + String result = this.getFieldDesc(cgfromcolumnMeta, null); + return result; + } + + private String getRenameFieldDesc(ColumnMeta cgfromcolumnMeta) { + String result = this.getFieldDesc(cgfromcolumnMeta, null); + return result; + } + /** + * Mysql娉ㄩ噴鏄拰淇敼鐨剆ql涓璧风殑,鎵浠ヨ繑鍥炵┖瀛楃涓插氨鍙互浜 + */ + + public String getCommentSql(ColumnMeta columnMeta) { + return ""; + } + + + public String getSpecialHandle(ColumnMeta cgformcolumnMeta, + ColumnMeta datacolumnMeta) { + return null; + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/config/DbTableOracleHandleImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/DbTableOracleHandleImpl.java new file mode 100644 index 00000000..b3db81e8 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/DbTableOracleHandleImpl.java @@ -0,0 +1,120 @@ +package org.jeecgframework.web.cgform.service.impl.config; + +import org.apache.commons.lang.StringUtils; + +import org.jeecgframework.web.cgform.service.config.DbTableHandleI; +import org.jeecgframework.web.cgform.service.impl.config.util.ColumnMeta; + + +/** + * oracle鐨勮〃宸ュ叿绫 + * oracle璇彞缁撳熬涓嶈兘浣跨敤 ; + */ +public class DbTableOracleHandleImpl implements DbTableHandleI { + + + public String getAddColumnSql(ColumnMeta columnMeta) { + return " ADD "+getAddFieldDesc(columnMeta)+""; + } + + + public String getReNameFieldName(ColumnMeta columnMeta) { + return "RENAME COLUMN "+columnMeta.getOldColumnName() +" TO "+columnMeta.getColumnName()+""; + } + + + public String getUpdateColumnSql(ColumnMeta cgformcolumnMeta,ColumnMeta datacolumnMeta) { + return " MODIFY "+getUpdateFieldDesc(cgformcolumnMeta,datacolumnMeta)+""; + } + + + public String getMatchClassTypeByDataType(String dataType,int digits) { + String result =""; + if (dataType.equalsIgnoreCase("varchar2")) { + result="string"; + } else if(dataType.equalsIgnoreCase("double")){ + result="double"; + }else if (dataType.equalsIgnoreCase("number") && digits==0) { + result="int"; + }else if (dataType.equalsIgnoreCase("number") && digits!=0) { + result="double"; + }else if (dataType.equalsIgnoreCase("int")) { + result="int"; + }else if (dataType.equalsIgnoreCase("Date")) { + result="date"; + }else if (dataType.equalsIgnoreCase("Datetime")) { + result="date"; + } + return result; + } + + + public String dropTableSQL(String tableName) { + return " DROP TABLE "+tableName.toLowerCase()+" "; + } + + + public String getDropColumnSql(String fieldName) { + return " DROP COLUMN "+fieldName.toUpperCase()+""; + } + + private String getAddFieldDesc(ColumnMeta columnMeta) { + String result =""; + if(columnMeta.getColunmType().equalsIgnoreCase("string")){ + result = columnMeta.getColumnName()+" varchar2("+columnMeta.getColumnSize()+")"; + }else if(columnMeta.getColunmType().equalsIgnoreCase("date")){ + result = columnMeta.getColumnName()+" datetime"; + }else if(columnMeta.getColunmType().equalsIgnoreCase("int")){ + result = columnMeta.getColumnName()+" NUMBER("+columnMeta.getColumnSize()+")"; + }else if(columnMeta.getColunmType().equalsIgnoreCase("double")){ + result = columnMeta.getColumnName()+" NUMBER("+columnMeta.getColumnSize()+","+columnMeta.getDecimalDigits()+")"; + }else if(columnMeta.getColunmType().equalsIgnoreCase("bigdecimal")){ + result = columnMeta.getColumnName()+" NUMBER("+columnMeta.getColumnSize()+","+columnMeta.getDecimalDigits()+")"; + }else if(columnMeta.getColunmType().equalsIgnoreCase("text")){ + result = columnMeta.getColumnName()+" CLOB "; + }else if(columnMeta.getColunmType().equalsIgnoreCase("blob")){ + result = columnMeta.getColumnName()+" BLOB "; + } + result += (StringUtils.isNotEmpty(columnMeta.getFieldDefault())?" DEFAULT "+columnMeta.getFieldDefault():" "); + result += (columnMeta.getIsNullable().equals("Y")?" NULL":" NOT NULL"); + return result; + } + private String getUpdateFieldDesc(ColumnMeta cgformcolumnMeta,ColumnMeta datacolumnMeta) { + String result =""; + String isnull=""; + //oracle瀵逛簬鏄惁涓虹┖蹇呴』璺熷師鏉ョ殑姣斿 + if (!datacolumnMeta.getIsNullable().equals(cgformcolumnMeta.getIsNullable())) { + isnull=(cgformcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + } + + if(cgformcolumnMeta.getColunmType().equalsIgnoreCase("string")||cgformcolumnMeta.getColunmType().equalsIgnoreCase("text")){ + result = cgformcolumnMeta.getColumnName()+" varchar2("+cgformcolumnMeta.getColumnSize()+")"+isnull; + + }else if(cgformcolumnMeta.getColunmType().equalsIgnoreCase("date")){ + result = cgformcolumnMeta.getColumnName()+" date "+isnull; + + }else if(cgformcolumnMeta.getColunmType().equalsIgnoreCase("int")){ + result = cgformcolumnMeta.getColumnName()+" NUMBER("+cgformcolumnMeta.getColumnSize()+") "+isnull; + + }else if(cgformcolumnMeta.getColunmType().equalsIgnoreCase("double")){ + result = cgformcolumnMeta.getColumnName()+" NUMBER("+cgformcolumnMeta.getColumnSize()+","+cgformcolumnMeta.getDecimalDigits()+") "+isnull; + }else if(cgformcolumnMeta.getColunmType().equalsIgnoreCase("bigdecimal")){ + result = cgformcolumnMeta.getColumnName()+" NUMBER("+cgformcolumnMeta.getColumnSize()+","+cgformcolumnMeta.getDecimalDigits()+") "+isnull; + } + result += (StringUtils.isNotEmpty(cgformcolumnMeta.getFieldDefault())?" DEFAULT "+cgformcolumnMeta.getFieldDefault():" "); + result += isnull; + return result; + } + + + public String getCommentSql(ColumnMeta columnMeta) { + return "COMMENT ON COLUMN "+columnMeta.getTableName()+"."+columnMeta.getColumnName()+" IS '" +columnMeta.getComment()+"'"; + } + + + public String getSpecialHandle(ColumnMeta cgformcolumnMeta, + ColumnMeta datacolumnMeta) { + return null; + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/config/DbTablePostgresHandleImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/DbTablePostgresHandleImpl.java new file mode 100644 index 00000000..a98f7410 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/DbTablePostgresHandleImpl.java @@ -0,0 +1,166 @@ +package org.jeecgframework.web.cgform.service.impl.config; + +import org.apache.commons.lang.StringUtils; + +import org.jeecgframework.web.cgform.exception.BusinessException; +import org.jeecgframework.web.cgform.exception.DBException; +import org.jeecgframework.web.cgform.service.config.DbTableHandleI; +import org.jeecgframework.web.cgform.service.impl.config.util.ColumnMeta; + + +/** + * postgres鐨勮〃宸ュ叿绫 + */ +public class DbTablePostgresHandleImpl implements DbTableHandleI { + + + public String getAddColumnSql(ColumnMeta columnMeta) { + return " ADD COLUMN "+getAddFieldDesc(columnMeta)+";"; + } + + + public String getReNameFieldName(ColumnMeta columnMeta) { + return " RENAME COLUMN "+columnMeta.getOldColumnName() +" to "+columnMeta.getColumnName()+";"; + } + + + public String getUpdateColumnSql(ColumnMeta cgformcolumnMeta,ColumnMeta datacolumnMeta)throws DBException { + return " ALTER COLUMN "+getUpdateFieldDesc(cgformcolumnMeta,datacolumnMeta)+";"; + } + + + public String getSpecialHandle(ColumnMeta cgformcolumnMeta, + ColumnMeta datacolumnMeta) { + return " ALTER COLUMN "+getUpdateFieldDefault(cgformcolumnMeta,datacolumnMeta)+";"; + } + + + public String getMatchClassTypeByDataType(String dataType,int digits) { + String result =""; + if (dataType.equalsIgnoreCase("varchar")) { + result="string"; + } else if(dataType.equalsIgnoreCase("double")){ + result="double"; + }else if (dataType.contains("int")) { + result="int"; + }else if (dataType.equalsIgnoreCase("Date")) { + result="date"; + }else if (dataType.equalsIgnoreCase("timestamp")) { + result="date"; + }else if (dataType.equalsIgnoreCase("bytea")) { + result="blob"; + }else if (dataType.equalsIgnoreCase("text")) { + result="text"; + }else if (dataType.equalsIgnoreCase("decimal")) { + result="bigdecimal"; + }else if (dataType.equalsIgnoreCase("numeric")) { + //double鍜宒ecimal閮戒細杩斿洖numeric锛屽厛鏆傛椂杩斿洖bigdecimal + result="bigdecimal"; + } + return result; + } + + + public String dropTableSQL(String tableName) { + return " DROP TABLE "+tableName+" ;"; + } + + + public String getDropColumnSql(String fieldName) { + return " DROP COLUMN "+fieldName+";"; + } + + private String getUpdateFieldDesc(ColumnMeta cgfromcolumnMeta,ColumnMeta datacolumnMeta) throws DBException { + String result =""; + //TODO 瀵逛簬闈炵┖鎯呭喌 锛岄渶瑕佺壒娈婂鍔犵害鏉熸柟娉曪紝榛樿鏄┖ + if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("string")){ + result = cgfromcolumnMeta.getColumnName()+" type character varying("+cgfromcolumnMeta.getColumnSize()+")"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("date")){ + result = cgfromcolumnMeta.getColumnName()+" type datetime"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("int")){ + //postpres鏁版嵁搴撴暣褰㈡病鏈夐暱搴︽蹇 + result = cgfromcolumnMeta.getColumnName()+" type int4 "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("double")){ + result = cgfromcolumnMeta.getColumnName()+" type numeric("+cgfromcolumnMeta.getColumnSize()+","+cgfromcolumnMeta.getDecimalDigits()+")"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("BigDecimal")){ + result = cgfromcolumnMeta.getColumnName()+" type decimal("+cgfromcolumnMeta.getColumnSize()+","+cgfromcolumnMeta.getDecimalDigits()+")"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("text")){ + result = cgfromcolumnMeta.getColumnName()+" type text("+cgfromcolumnMeta.getColumnSize()+")"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("blob")){ +// bytea绫诲瀷涓嶅彲淇敼锛屼慨鏀逛細鎶ラ敊 + throw new DBException("blob绫诲瀷涓嶅彲淇敼"); + } + return result; + } + + private String getUpdateFieldDefault(ColumnMeta cgfromcolumnMeta,ColumnMeta datacolumnMeta) { + String result =""; + + if(!cgfromcolumnMeta.equalsDefault(datacolumnMeta)){ + if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("string")){ + result = cgfromcolumnMeta.getColumnName(); + result += (StringUtils.isNotEmpty(cgfromcolumnMeta.getFieldDefault())?" SET DEFAULT "+cgfromcolumnMeta.getFieldDefault():" DROP DEFAULT"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("date")){ + result = cgfromcolumnMeta.getColumnName(); + result += (StringUtils.isNotEmpty(cgfromcolumnMeta.getFieldDefault())?" SET DEFAULT "+cgfromcolumnMeta.getFieldDefault():" DROP DEFAULT"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("int")){ + result = cgfromcolumnMeta.getColumnName(); + result += (StringUtils.isNotEmpty(cgfromcolumnMeta.getFieldDefault())?" SET DEFAULT "+cgfromcolumnMeta.getFieldDefault():" DROP DEFAULT"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("double")){ + result = cgfromcolumnMeta.getColumnName(); + result += (StringUtils.isNotEmpty(cgfromcolumnMeta.getFieldDefault())?" SET DEFAULT "+cgfromcolumnMeta.getFieldDefault():" DROP DEFAULT"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("bigdecimal")){ + result = cgfromcolumnMeta.getColumnName(); + result += (StringUtils.isNotEmpty(cgfromcolumnMeta.getFieldDefault())?" SET DEFAULT "+cgfromcolumnMeta.getFieldDefault():" DROP DEFAULT"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("text")){ + result = cgfromcolumnMeta.getColumnName(); + result += (StringUtils.isNotEmpty(cgfromcolumnMeta.getFieldDefault())?" SET DEFAULT "+cgfromcolumnMeta.getFieldDefault():" DROP DEFAULT"); + } + + } + return result; + } + + + private String getAddFieldDesc(ColumnMeta cgfromcolumnMeta) { + String result =""; + if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("string")){ + result = cgfromcolumnMeta.getColumnName()+" character varying("+cgfromcolumnMeta.getColumnSize()+")"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("date")){ + result = cgfromcolumnMeta.getColumnName()+" datetime"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("int")){ + result = cgfromcolumnMeta.getColumnName()+" int4"; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("double")){ + result = cgfromcolumnMeta.getColumnName()+" numeric("+cgfromcolumnMeta.getColumnSize()+","+cgfromcolumnMeta.getDecimalDigits()+")"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("bigdecimal")){ + result = cgfromcolumnMeta.getColumnName()+" decimal("+cgfromcolumnMeta.getColumnSize()+","+cgfromcolumnMeta.getDecimalDigits()+")"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("blob")){ + result = cgfromcolumnMeta.getColumnName()+" bytea("+cgfromcolumnMeta.getColumnSize()+")"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("text")){ + result = cgfromcolumnMeta.getColumnName()+" text("+cgfromcolumnMeta.getColumnSize()+")"+" "; + } + result += (StringUtils.isNotEmpty(cgfromcolumnMeta.getFieldDefault())?" DEFAULT "+cgfromcolumnMeta.getFieldDefault():" "); + return result; + } + + private String getRenameFieldDesc(ColumnMeta cgfromcolumnMeta) { + String result =""; + if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("string")){ + result = cgfromcolumnMeta.getColumnName()+" character varying("+cgfromcolumnMeta.getColumnSize()+")"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("date")){ + result = cgfromcolumnMeta.getColumnName()+" datetime"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("int")){ + result = cgfromcolumnMeta.getColumnName()+" int("+cgfromcolumnMeta.getColumnSize()+")"+" "; + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("double")){ + result = cgfromcolumnMeta.getColumnName()+" numeric("+cgfromcolumnMeta.getColumnSize()+","+cgfromcolumnMeta.getDecimalDigits()+")"+" "; + } + return result; + } + + + public String getCommentSql(ColumnMeta columnMeta) { + return "COMMENT ON COLUMN "+columnMeta.getTableName()+"."+columnMeta.getColumnName()+" IS '" +columnMeta.getComment()+"'"; + } + + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/config/DbTableServiceMysqlImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/DbTableServiceMysqlImpl.java new file mode 100644 index 00000000..ee9f910b --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/DbTableServiceMysqlImpl.java @@ -0,0 +1,176 @@ +package org.jeecgframework.web.cgform.service.impl.config; + +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.Map; + +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.service.config.DbTableServiceI; +import org.jeecgframework.web.cgform.service.impl.config.util.DbTableUtil; +import org.jeecgframework.web.cgform.service.impl.config.util.FieldNumComparator; + +import org.jeecgframework.codegenerate.util.CodeResourceUtil; +import org.jeecgframework.core.util.StringUtil; +import org.springframework.jdbc.core.JdbcTemplate; + + +/** + * mysql鐨勮〃宸ュ叿绫 + * @author jueyue + * + */ +public class DbTableServiceMysqlImpl implements DbTableServiceI { + + + + public String createTableSQL(CgFormHeadEntity cgFormHead) { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE TABLE "); + sb.append(cgFormHead.getTableName()+" ("); + CgFormFieldEntity column,agoColumn = null; + Collections.sort(cgFormHead.getColumns(), new FieldNumComparator()); + String idField = ""; + Collections.sort(cgFormHead.getColumns(),new FieldNumComparator()); + for(int i = 0;i0){agoColumn = cgFormHead.getColumns().get(i-1);} + column = cgFormHead.getColumns().get(i); + sb.append(getColumnPorperty(column,agoColumn,false)); + if(column.getIsKey().equals("Y")){ + idField+=DbTableUtil.translatorToDbField(DbTableUtil.translatorToDbField(column.getFieldName()))+","; + } + } + sb.append(" PRIMARY KEY ("+idField.substring(0, idField.length()-1)+")"); + sb.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + return sb.toString(); + } + + + public String dropTableSQL(CgFormHeadEntity tableProperty) { + return " DROP TABLE IF EXISTS "+tableProperty.getTableName()+" ;"; + } + + + public String updateTableSQL(CgFormHeadEntity cgFormHead, JdbcTemplate jdbcTemplate) { + String sql = "select column_name,data_type,column_comment,numeric_precision,numeric_scale,character_maximum_length," + + "is_nullable nullable from information_schema.columns where table_name = '"+cgFormHead.getTableName()+"'and table_schema = '"+CodeResourceUtil.DATABASE_NAME+"';"; + + Map fieldMap = DbTableUtil.getColumnMap(jdbcTemplate.queryForList(sql)); + StringBuilder sb = new StringBuilder(); + sb.append(createChangeTableSql(cgFormHead)); + CgFormFieldEntity column,agoColumn = null; + String idField = ""; + //step1 :瀵瑰垪杩涜鎺掑簭 + Collections.sort(cgFormHead.getColumns(),new FieldNumComparator()); + for(int i = 0;i0){agoColumn = cgFormHead.getColumns().get(i-1);} + column = cgFormHead.getColumns().get(i); + //step2 :鍒ゆ柇鏄惁鏈夎繖涓瓧娈 鏈 鏇存柊 娌℃湁 娣诲姞 + if(fieldMap.containsKey(DbTableUtil.translatorToDbField(column.getFieldName()))){ + sb.append(createUpdateColumnSql(column,agoColumn)); + fieldMap.remove(DbTableUtil.translatorToDbField(column.getFieldName())); + }else{ + sb.append(createAddColumnSql(column,agoColumn)); + } + if(column.getIsKey().equals("Y")){ + idField+=DbTableUtil.translatorToDbField(column.getFieldName())+","; + } + + } + //step3 :鏌ョ湅杩樺墿浣欑殑瀛楁,璇存槑宸茬粡琚垹闄や簡,鍒犻櫎鎺 + Collection c = fieldMap.values(); + Iterator it = c.iterator(); + for (;it.hasNext();) { + Map field = (Map) it.next(); + sb.append(createDropColumn(field.get("column_name").toString())); + } + sb.append("DROP PRIMARY KEY,ADD PRIMARY KEY ("+idField.substring(0, idField.length()-1)+")"); + return sb.toString(); + } + + /** + * 鍒涘缓澧炲姞瀛楁鐨剆ql + * @param column + * @param agoColumn + * @return + */ + private String createAddColumnSql(CgFormFieldEntity column, CgFormFieldEntity agoColumn) { + return " ADD COLUMN "+getColumnPorperty(column,agoColumn,true); + } + /** + * 鍒涘缓鏇存柊瀛楁鐨剆ql + * @param newColumn + * @param agoColumn + * @return + */ + private String createUpdateColumnSql(CgFormFieldEntity newColumn, CgFormFieldEntity agoColumn) { + return " MODIFY COLUMN "+getColumnPorperty(newColumn,agoColumn,true); + } + /** + * 鍒涘缓鍒犻櫎瀛楁鐨剆ql + * @param fieldName + * @return + */ + private String createDropColumn(String fieldName) { + return " DROP COLUMN "+fieldName+","; + } + + /** + * 鑾峰彇杩欎釜瀛楁鐨勫睘鎬 + * @param column + * @param agoColumn + * @param isUpdate + * @return + */ + private String getColumnPorperty(CgFormFieldEntity column, CgFormFieldEntity agoColumn, boolean isUpdate){ + String result = " " + DbTableUtil.translatorToDbField(column.getFieldName())+" " + +getFieldType(column)+" "; + result+=StringUtil.isEmpty(column.getIsNull())?" NOT NULL ":"NULL"; + result+=" COMMENT '"+column.getContent()+"' "; + if(isUpdate){ + String agoFiled = " FIRST "; + if(agoColumn!=null){ + agoFiled = " AFTER "+DbTableUtil.translatorToDbField(agoColumn.getFieldName()); + } + result+=agoFiled; + } + return result +", "; + } + + + /** + * 鑾峰彇瀛楁绫诲瀷 + * @param cloumn + * @return + */ + private String getFieldType(CgFormFieldEntity cloumn){ + String result =""; + if(cloumn.getType().equals("string")){ + result = "varchar("+cloumn.getLength()+")"; + }else if(cloumn.getType().equals("Date")){ + result = "datetime"; + }else if(cloumn.getType().equals("int")){ + result = cloumn.getType()+"("+cloumn.getLength()+")"; + }else if(cloumn.getType().equals("double")){ + result = cloumn.getType()+"("+cloumn.getLength()+","+cloumn.getPointLength()+")"; + } + return result; + } + /** + * 淇敼瀛楁鐨剆ql + * @param table + * @return + */ + private String createChangeTableSql(CgFormHeadEntity table) { + return "ALTER TABLE "+table.getTableName()+" "; + } + + + public String createIsExitSql(String tableName) { + return "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_NAME='"+tableName+"' and table_schema = '"+CodeResourceUtil.DATABASE_NAME+"';"; + } + + + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/config/TableSQLServerHandleImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/TableSQLServerHandleImpl.java new file mode 100644 index 00000000..1a09e1bd --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/TableSQLServerHandleImpl.java @@ -0,0 +1,134 @@ +package org.jeecgframework.web.cgform.service.impl.config; + +import org.apache.commons.lang.StringUtils; +import org.jeecgframework.core.util.StringUtil; + +import org.jeecgframework.web.cgform.service.config.DbTableHandleI; +import org.jeecgframework.web.cgform.service.impl.config.util.ColumnMeta; + + +/** + * SQLSERVER鐨勮〃宸ュ叿绫 + */ +public class TableSQLServerHandleImpl implements DbTableHandleI { + + + public String getAddColumnSql(ColumnMeta columnMeta) { + return " ADD "+getAddFieldDesc(columnMeta)+";"; + } + + + public String getReNameFieldName(ColumnMeta columnMeta) { + //sp_rename 'TOA_E_ARTICLE.version','processVersion','COLUMN'; + return " sp_rename '"+columnMeta.getTableName()+"."+columnMeta.getOldColumnName()+"', '"+columnMeta.getColumnName()+"', 'COLUMN';"; + //return "ALTER COLUMN "+columnMeta.getOldColumnName() +" "+getRenameFieldDesc(columnMeta)+";"; + } + + + public String getUpdateColumnSql(ColumnMeta cgformcolumnMeta,ColumnMeta datacolumnMeta) { + return " ALTER COLUMN "+getUpdateFieldDesc(cgformcolumnMeta,datacolumnMeta)+";"; + } + + + public String getMatchClassTypeByDataType(String dataType,int digits) { + String result =""; + if (dataType.equalsIgnoreCase("varchar")) { + result="string"; + } else if(dataType.equalsIgnoreCase("double")){ + result="double"; + }else if (dataType.equalsIgnoreCase("int")) { + result="int"; + }else if (dataType.equalsIgnoreCase("Date")) { + result="date"; + }else if (dataType.equalsIgnoreCase("Datetime")) { + result="date"; + }else if (dataType.equalsIgnoreCase("numeric")) { + result="double"; + } + return result; + } + + + public String dropTableSQL(String tableName) { + return " DROP TABLE "+tableName+" ;"; + } + + + public String getDropColumnSql(String fieldName) { + return " DROP COLUMN "+fieldName+";"; + } + + private String getUpdateFieldDesc(ColumnMeta cgfromcolumnMeta,ColumnMeta datacolumnMeta) { + String result =""; + if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("string")){ + result = cgfromcolumnMeta.getColumnName()+" varchar("+cgfromcolumnMeta.getColumnSize()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("date")){ + result = cgfromcolumnMeta.getColumnName()+" datetime"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("int")){ + result = cgfromcolumnMeta.getColumnName()+" int"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("double")){ + result = cgfromcolumnMeta.getColumnName()+" numeric("+cgfromcolumnMeta.getColumnSize()+","+cgfromcolumnMeta.getDecimalDigits()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + } + result += (StringUtils.isNotEmpty(cgfromcolumnMeta.getFieldDefault())?" DEFAULT "+cgfromcolumnMeta.getFieldDefault():" "); + return result; + } + + private String getAddFieldDesc(ColumnMeta cgfromcolumnMeta) { + String result =""; + if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("string")){ + result = cgfromcolumnMeta.getColumnName()+" varchar("+cgfromcolumnMeta.getColumnSize()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("date")){ + result = cgfromcolumnMeta.getColumnName()+" datetime"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("int")){ + result = cgfromcolumnMeta.getColumnName()+" int("+cgfromcolumnMeta.getColumnSize()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("double")){ + result = cgfromcolumnMeta.getColumnName()+" double("+cgfromcolumnMeta.getColumnSize()+","+cgfromcolumnMeta.getDecimalDigits()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("bigdecimal")){ + result = cgfromcolumnMeta.getColumnName()+" decimal("+cgfromcolumnMeta.getColumnSize()+","+cgfromcolumnMeta.getDecimalDigits()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("text")){ + result = cgfromcolumnMeta.getColumnName()+" text"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("blob")){ + result = cgfromcolumnMeta.getColumnName()+" varbinary("+cgfromcolumnMeta.getColumnSize()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }//update-end--Author:liuht Date:20131223 + result += (StringUtils.isNotEmpty(cgfromcolumnMeta.getFieldDefault())?" DEFAULT "+cgfromcolumnMeta.getFieldDefault():" "); + return result; + } + + private String getRenameFieldDesc(ColumnMeta cgfromcolumnMeta) { + String result =""; + if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("string")){ + result = cgfromcolumnMeta.getColumnName()+" varchar("+cgfromcolumnMeta.getColumnSize()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("date")){ + result = cgfromcolumnMeta.getColumnName()+" datetime"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("int")){ + result = cgfromcolumnMeta.getColumnName()+" int("+cgfromcolumnMeta.getColumnSize()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + }else if(cgfromcolumnMeta.getColunmType().equalsIgnoreCase("double")){ + result = cgfromcolumnMeta.getColumnName()+" double("+cgfromcolumnMeta.getColumnSize()+","+cgfromcolumnMeta.getDecimalDigits()+")"+" "+(cgfromcolumnMeta.getIsNullable().equals("Y")?"NULL":"NOT NULL"); + } + return result; + } + + + public String getCommentSql(ColumnMeta columnMeta) { + StringBuffer commentSql = new StringBuffer("EXECUTE "); + if(StringUtil.isEmpty(columnMeta.getOldColumnName())){ + commentSql.append("sp_addextendedproperty"); + } else { + commentSql.append("sp_updateextendedproperty"); + } + commentSql.append(" N'MS_Description', '"); + commentSql.append(columnMeta.getComment()); + commentSql.append("', N'SCHEMA', N'dbo', N'TABLE', N'"); + commentSql.append(columnMeta.getTableName()); + commentSql.append("', N'COLUMN', N'"); + commentSql.append(columnMeta.getColumnName() +"'"); + return commentSql.toString(); + } + + + public String getSpecialHandle(ColumnMeta cgformcolumnMeta, + ColumnMeta datacolumnMeta) { + return null; + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/config/util/ColumnMeta.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/util/ColumnMeta.java new file mode 100644 index 00000000..4b170fb2 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/util/ColumnMeta.java @@ -0,0 +1,147 @@ +package org.jeecgframework.web.cgform.service.impl.config.util; + +import org.apache.commons.lang.StringUtils; + +public class ColumnMeta { + private String tableName; + private String columnId; + private String columnName; + private int columnSize; + private String colunmType; + private String comment;//澶囨敞 + private String fieldDefault;//榛樿鍊 + private int decimalDigits; + private String isNullable; //Y 鏄 N 鍚 + private String pkType;//涓婚敭绛栫暐 + private String oldColumnName;//鍘熸潵鐨勫瓧娈靛悕 + + + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof ColumnMeta)) { + return false; + } + ColumnMeta meta = (ColumnMeta)obj; + //鏃堕棿绫诲瀷涓嶆瘮杈冮暱搴 + if (colunmType.contains("date") || colunmType.contains("blob") || colunmType.contains("text")) { + return columnName.equals(meta.getColumnName()) + &&isNullable.equals(meta.isNullable) + &&isEquals(comment,meta.getComment())&&isEquals(fieldDefault,meta.getFieldDefault()); + } + /*else if (colunmType.contains("int")) { + return columnName.equals(meta.getColumnName())&& colunmType.equals(meta.getColunmType()) + &&isNullable.equals(meta.isNullable); + } */ + + else { + return colunmType.equals(meta.getColunmType()) + &&isNullable.equals(meta.isNullable)&&columnSize==meta.getColumnSize() + &&isEquals(comment,meta.getComment())&&isEquals(fieldDefault,meta.getFieldDefault()); + } + } + + public boolean equalsDefault(ColumnMeta meta){ + if (meta == this) { + return true; + } + return isEquals(comment,meta.getComment()); + } + + public boolean equalsComment(ColumnMeta meta){ + if (meta == this) { + return true; + } + return isEquals(comment,meta.getComment()); + } + + private boolean isEquals(String newS,String oldS){ + boolean booN = StringUtils.isNotEmpty(newS); + boolean booO = StringUtils.isNotEmpty(oldS); + if(booN!=booO){return false;} + if(booN){return newS.equals(oldS);} + return true; + } + + public String getColumnName() { + return columnName; + } + public int getColumnSize() { + return columnSize; + } + public String getColunmType() { + return colunmType; + } + public String getComment() { + return comment; + } + public int getDecimalDigits() { + return decimalDigits; + } + public String getIsNullable() { + return isNullable; + } + public String getOldColumnName() { + return oldColumnName; + } + + + public int hashCode() { + return columnSize + colunmType.hashCode()*columnName.hashCode(); + } + public void setColumnName(String columnName) { + this.columnName = columnName; + } + public void setColumnSize(int columnSize) { + this.columnSize = columnSize; + } + + public void setColunmType(String colunmType) { + this.colunmType = colunmType; + } + public void setComment(String comment) { + this.comment = comment; + } + public void setDecimalDigits(int decimalDigits) { + this.decimalDigits = decimalDigits; + } + public void setIsNullable(String isNullable) { + this.isNullable = isNullable; + } + public void setOldColumnName(String oldColumnName) { + this.oldColumnName = oldColumnName; + } + + public String toString() { + return columnName+","+colunmType+","+isNullable+","+columnSize; + } + public String getColumnId() { + return columnId; + } + public void setColumnId(String columnId) { + this.columnId = columnId; + } + public String getTableName() { + return tableName; + } + public void setTableName(String tableName) { + this.tableName = tableName; + } + public String getFieldDefault() { + return fieldDefault; + } + public void setFieldDefault(String fieldDefault) { + this.fieldDefault = fieldDefault; + } + + public String getPkType() { + return pkType; + } + + public void setPkType(String pkType) { + this.pkType = pkType; + } + + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/config/util/DbTableProcess.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/util/DbTableProcess.java new file mode 100644 index 00000000..fed7c8a0 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/util/DbTableProcess.java @@ -0,0 +1,346 @@ +package org.jeecgframework.web.cgform.service.impl.config.util; + +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.internal.SessionImpl; +import org.hibernate.tool.hbm2ddl.SchemaExport; +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.exception.DBException; +import org.jeecgframework.web.cgform.service.config.DbTableHandleI; +import org.springframework.orm.hibernate4.SessionFactoryUtils; + +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; + +/** + * 閫氳繃hibernate鍜岃剼鏈潵澶勭悊鏉ュ悓姝ユ暟鎹簱 + * 瀵逛簬淇敼鏁版嵁搴撶殑瀛楁锛岃冭檻鍚勭鏁版嵁搴撶殑鎯呭喌锛屽瓧娈靛悕绉板叏閮ㄣ佺被鍨嬩慨鏀规垚澶у啓 + */ +public class DbTableProcess { + private static final Logger logger = Logger.getLogger(DbTableProcess.class); + private static DbTableHandleI dbTableHandle; + + + public DbTableProcess(Session session) { + dbTableHandle = DbTableUtil.getTableHandle(session); + } + + public static void createOrDropTable(CgFormHeadEntity table, Session session) throws IOException, TemplateException, HibernateException, SQLException, DBException { + Template t; + t = getConfig("/org/jeecgframework/web/cgform/engine/hibernate").getTemplate("tableTemplate.ftl"); + Writer out = new StringWriter(); + //妯℃澘瀵逛簬鏁板瓧瓒呰繃1000锛屼細鑷姩鏍煎紡涓1,,000(绂佹杞崲) + t.setNumberFormat("0.#####################"); + t.process(getRootMap(table,DbTableUtil.getDataType(session)), out); + String xml = out.toString(); + logger.info(xml); + createTable(xml, table, session); + } + + + @SuppressWarnings("all") + private static Object getRootMap(CgFormHeadEntity table,String dataType) { + Map map = new HashMap(); + for(CgFormFieldEntity field :table.getColumns()){ + field.setFieldDefault(judgeIsNumber(field.getFieldDefault())); + } + map.put("entity", table); + map.put("dataType", dataType); + return map; + } + + + + public List updateTable(CgFormHeadEntity table,Session session) throws DBException{ + //StringBuilder sb = new StringBuilder(); + String tableName = DbTableUtil.getDataType(session).equals("ORACLE")?table.getTableName().toUpperCase():table.getTableName(); + String alterTable="alter table "+tableName+" "; + List strings = new ArrayList(); + //瀵硅〃鐨勪慨鏀瑰垪鍜屽垹闄ゅ垪鐨勫鐞嗭紝瑙e喅hibernate娌℃湁璇ユ満鍒 + try { + Map dataBaseColumnMetaMap = getColumnMetadataFormDataBase(null ,tableName,session); + + Map cgFormColumnMetaMap = getColumnMetadataFormCgForm(table); + + Map newAndOldFieldMap =getNewAndOldFieldName(table); + + + for (String columnName : cgFormColumnMetaMap.keySet()) { + if(!dataBaseColumnMetaMap.containsKey(columnName)){//琛ㄥ鏋滀笉瀛樺湪璇ュ垪锛屽垯瑕佸琛ㄥ仛淇敼銆佸鍔犮佸垹闄よ鍒楀姩浣 姝ゅ鏃犳硶澶勭悊鍒犻櫎鐨勫垪锛屽洜涓哄湪杩欎釜寰幆涓棤娉曡幏寰楄鍒 + //濡傛灉鏃у垪涓寘鍚繖涓垪鍚嶏紝璇存槑鏄慨鏀瑰悕绉扮殑 + ColumnMeta cgFormColumnMeta = cgFormColumnMetaMap.get(columnName); + if(newAndOldFieldMap.containsKey(columnName)&&(dataBaseColumnMetaMap.containsKey(newAndOldFieldMap.get(columnName)))){ + ColumnMeta dataColumnMeta = dataBaseColumnMetaMap.get(newAndOldFieldMap.get(columnName)); + if (DbTableUtil.getDataType(session).equals("SQLSERVER")) { + //sqlserver 淇敼绫诲悕绉伴渶瑕佽皟鐢ㄥ瓨鍌ㄨ繃绋 + strings.add(getReNameFieldName(cgFormColumnMeta)); + }else { + strings.add(alterTable+getReNameFieldName(cgFormColumnMeta)); + } + //鎵ц瀹屾垚涔嬪悗淇敼鎴愪竴鑷 fildname鍜宱ldfieldname + updateFieldName(columnName, cgFormColumnMeta.getColumnId(),session); + //淇敼琛ㄥ悕涔嬪悗缁х画鍒ゆ柇鍊兼湁娌℃湁鍙樺寲,鏈夊彉鍖栫户缁慨鏀瑰 + if (!dataColumnMeta.equals(cgFormColumnMeta)) { + strings.add(alterTable+getUpdateColumnSql(cgFormColumnMeta,dataColumnMeta)); + if (DbTableUtil.getDataType(session).equals("POSTGRESQL")) { + strings.add(alterTable + getUpdateSpecialSql(cgFormColumnMeta, dataColumnMeta)); + } + } + //鍒ゆ柇娉ㄩ噴鏄笉鏄浉鍚,淇敼娉ㄩ噴 + if(!dataColumnMeta.equalsComment(cgFormColumnMeta)){ + strings.add(getCommentSql(cgFormColumnMeta)); + } + }else{//涓嶅寘鍚氨鏄澧炲姞 + strings.add(alterTable+getAddColumnSql(cgFormColumnMeta)); + if(StringUtils.isNotEmpty(cgFormColumnMeta.getComment())){ + strings.add(getCommentSql(cgFormColumnMeta)); + } + } + }else {//宸茬粡瀛樺湪鐨勫垽鏂槸鍚︿慨鏀逛簡绫诲瀷闀垮害銆傘 + //鍒ゆ柇鏄惁绫诲瀷銆侀暱搴︺佹槸鍚︿负绌恒佺簿搴﹁淇敼锛屽鏋滄湁淇敼鍒欏鐞嗕慨鏀 + ColumnMeta dataColumnMeta = dataBaseColumnMetaMap.get(columnName); + ColumnMeta cgFormColumnMeta = cgFormColumnMetaMap.get(columnName); + //濡傛灉涓嶇浉鍚岋紝鍒欒〃绀烘湁鍙樺寲锛屽垯闇瑕佷慨鏀 + if (!dataColumnMeta.equals(cgFormColumnMeta)) { + strings.add(alterTable+getUpdateColumnSql(cgFormColumnMeta,dataColumnMeta)); + } + if(!dataColumnMeta.equalsComment(cgFormColumnMeta)){ + strings.add(getCommentSql(cgFormColumnMeta)); + } + } + + } + + //鍒犻櫎鏁版嵁搴撶殑鍒 + //瑕佸垽鏂繖涓垪涓嶆槸淇敼鐨 + for (String columnName : dataBaseColumnMetaMap.keySet()) { + if ((!cgFormColumnMetaMap.containsKey(columnName.toLowerCase()))&& (!newAndOldFieldMap.containsValue(columnName.toLowerCase()))) { + strings.add(alterTable+getDropColumnSql(columnName)); + } + } + + } catch (SQLException e1) { + throw new RuntimeException(); + } + logger.info(strings.toString()); + return strings; + } + + private static void createTable(String xml, CgFormHeadEntity table, + Session session) throws HibernateException, SQLException, DBException { + + //FIXME 鑰冭檻JNDI鐨勬儏鍐 + //閲嶆柊鏋勫缓涓涓狢onfiguration + org.hibernate.cfg.Configuration newconf=new org.hibernate.cfg.Configuration(); + newconf.addXML(xml) + .setProperty("hibernate.dialect",((SessionImpl)session).getFactory().getDialect().getClass().getName()); +// .setProperty("hibernate.connection.username",propertiesUtil.readProperty("jdbc.username.jeecg")) +// .setProperty("hibernate.connection.password",propertiesUtil.readProperty("jdbc.password.jeecg")) +// .setProperty("hibernate.dialect",propertiesUtil.readProperty("hibernate.dialect")) +// .setProperty("hibernate.connection.url",propertiesUtil.readProperty("jdbc.url.jeecg")) +// .setProperty("hibernate.connection.driver_class",propertiesUtil.readProperty("jdbc.driver.class")); +// + SchemaExport dbExport; + dbExport = new SchemaExport(newconf,SessionFactoryUtils.getDataSource( + session.getSessionFactory()).getConnection()); + dbExport.execute(true, true, false, true); + + //鎶涘嚭鎵ц寮傚父锛屾姏鍑虹涓涓嵆鍙 + @SuppressWarnings("unchecked") + List exceptionList = dbExport.getExceptions(); + for (Exception exception : exceptionList) { + throw new DBException(exception.getMessage()); + } + } + + /** + * 妯$増閰嶇疆 + * @param resource + * @return + */ + private static Configuration getConfig(String resource) { + + Configuration cfg = new Configuration(); + cfg.setDefaultEncoding("UTF-8"); + cfg.setClassForTemplateLoading(DbTableProcess.class, resource); + return cfg; + } + + + /** + * 鑾峰彇鏁版嵁搴撲腑鍒楃殑鎻忚堪 + * @param tableName + * @param session + * @return + * @throws SQLException + */ + public static Map getColumnMetadataFormDataBase(String schemaName, String tableName, Session session) throws SQLException{ + Connection conn = SessionFactoryUtils.getDataSource(session.getSessionFactory()).getConnection(); + DatabaseMetaData dbMetaData = conn.getMetaData(); + ResultSet rs = dbMetaData.getColumns(null, schemaName, tableName, "%"); + ColumnMeta columnMeta; + Map columnMap = new HashMap(); + while (rs.next()){ + columnMeta = new ColumnMeta(); + columnMeta.setTableName(rs.getString("COLUMN_NAME").toLowerCase()); + columnMeta.setColumnName(rs.getString("COLUMN_NAME").toLowerCase()); + columnMeta.setColunmType(dbTableHandle.getMatchClassTypeByDataType(rs.getString("TYPE_NAME"),rs.getInt("DECIMAL_DIGITS"))); + columnMeta.setColumnSize(rs.getInt("COLUMN_SIZE")); + columnMeta.setDecimalDigits(rs.getInt("DECIMAL_DIGITS")); + columnMeta.setIsNullable(rs.getInt("NULLABLE")==1?"Y":"N"); + columnMeta.setComment(rs.getString("REMARKS")); + columnMeta.setFieldDefault(judgeIsNumber(rs.getString("COLUMN_DEF"))==null?"":judgeIsNumber(rs.getString("COLUMN_DEF"))); + logger.info("getColumnMetadataFormDataBase --->COLUMN_NAME:"+rs.getString("COLUMN_NAME")+" TYPE_NAME :"+rs.getString("TYPE_NAME") + +" DECIMAL_DIGITS:"+rs.getInt("DECIMAL_DIGITS")+" COLUMN_SIZE:"+rs.getInt("COLUMN_SIZE")); + columnMap.put(rs.getString("COLUMN_NAME").toLowerCase(), columnMeta); + } + + return columnMap; + } + + /** + * 杩斿洖cgForm涓垪鐨勬弿杩颁俊鎭 + * @param table + * @return + */ + public static Map getColumnMetadataFormCgForm(CgFormHeadEntity table){ + Map map = new HashMap(); + List cgFormFieldEntities = table.getColumns(); + ColumnMeta columnMeta; + for (CgFormFieldEntity cgFormFieldEntity : cgFormFieldEntities) { + columnMeta = new ColumnMeta(); + columnMeta.setTableName(table.getTableName().toLowerCase()); + columnMeta.setColumnId(cgFormFieldEntity.getId()); + columnMeta.setColumnName(cgFormFieldEntity.getFieldName().toLowerCase()); + columnMeta.setColumnSize(cgFormFieldEntity.getLength()); + columnMeta.setColunmType(cgFormFieldEntity.getType().toLowerCase()); + columnMeta.setIsNullable(cgFormFieldEntity.getIsNull()); + columnMeta.setComment(cgFormFieldEntity.getContent()); + columnMeta.setDecimalDigits(cgFormFieldEntity.getPointLength()); + columnMeta.setFieldDefault(judgeIsNumber(cgFormFieldEntity.getFieldDefault())); + columnMeta.setPkType(table.getJformPkType()==null?"UUID":table.getJformPkType()); + columnMeta.setOldColumnName(cgFormFieldEntity.getOldFieldName()!=null?cgFormFieldEntity.getOldFieldName().toLowerCase():null); + logger.info("getColumnMetadataFormCgForm ---->COLUMN_NAME:"+cgFormFieldEntity.getFieldName().toLowerCase()+" TYPE_NAME:"+cgFormFieldEntity.getType().toLowerCase() + +" DECIMAL_DIGITS:"+cgFormFieldEntity.getPointLength()+" COLUMN_SIZE:"+cgFormFieldEntity.getLength()); + map.put(cgFormFieldEntity.getFieldName().toLowerCase(), columnMeta); + + } + return map; + } + + /** + * 杩斿洖cgForm涓垪鍚嶇殑鏂板拰鏃х殑瀵瑰簲鍏崇郴 + * @param table + * @return + */ + public static Map getNewAndOldFieldName(CgFormHeadEntity table){ + Map map = new HashMap(); + List cgFormFieldEntities = table.getColumns(); + for (CgFormFieldEntity cgFormFieldEntity : cgFormFieldEntities) { + map.put(cgFormFieldEntity.getFieldName(), cgFormFieldEntity.getOldFieldName()); + } + return map; + } + + /** + * 鍒涘缓鍒犻櫎瀛楁鐨剆ql + * @param fieldName + * @return + */ + private static String getDropColumnSql(String fieldName) { + //ALTER TABLE `test` DROP COLUMN `aaaa`; + return dbTableHandle.getDropColumnSql(fieldName); + } + + /** + * 鍒涘缓鏇存柊瀛楁鐨剆ql + * @param newColumn + * @param agoColumn + * @return + */ + private static String getUpdateColumnSql(ColumnMeta cgformcolumnMeta,ColumnMeta datacolumnMeta)throws DBException { + //modify birthday varchar2(10) not null; + //return " MODIFY COLUMN "+getFieldDesc(columnMeta)+","; + return dbTableHandle.getUpdateColumnSql(cgformcolumnMeta,datacolumnMeta); + } + + /** + * 澶勭悊鐗规畩sql + * @param cgformcolumnMeta + * @param datacolumnMeta + * @return + */ + private static String getUpdateSpecialSql(ColumnMeta cgformcolumnMeta,ColumnMeta datacolumnMeta) { + return dbTableHandle.getSpecialHandle(cgformcolumnMeta,datacolumnMeta); + } + + /** + * 淇敼鍒楀悕 + * @param columnMeta + * @return + */ + private static String getReNameFieldName(ColumnMeta columnMeta){ + //CHANGE COLUMN `name1` `name2` varchar(50) NULL COMMENT '濮撳悕'; + //return "CHANGE COLUMN "+columnMeta.getOldColumnName() +" "+getFieldDesc(columnMeta)+","; + return dbTableHandle.getReNameFieldName(columnMeta); + } + + /** + * 鍒涘缓澧炲姞瀛楁鐨剆ql + * @param column + * @param agoColumn + * @return + */ + private static String getAddColumnSql(ColumnMeta columnMeta) { + //return " ADD COLUMN "+getFieldDesc(columnMeta)+","; + return dbTableHandle.getAddColumnSql(columnMeta); + } + + /** + * 娣诲姞娉ㄩ噴鐨剆ql + *@Author JueYue + *@date 2013骞12鏈1鏃 + *@param cgFormColumnMeta + *@return + */ + private String getCommentSql(ColumnMeta columnMeta) { + return dbTableHandle.getCommentSql(columnMeta); + } + + private int updateFieldName(String columnName,String id,Session session){ + return session.createSQLQuery("update cgform_field set old_field_name= '"+columnName+"' where id='"+id+"'").executeUpdate(); + } + /** + * 鍒ゆ柇鏄笉鏁板瓧,涓嶆槸鏁板瓧鐨勮瘽鍔犱笂'' + *@Author JueYue + *@date 2013骞11鏈27鏃 + *@param text + *@return + */ + private static String judgeIsNumber(String text){ + if(StringUtils.isNotEmpty(text)){ + try{ + Double.valueOf(text); + }catch(Exception e){ + text = "'"+text+"'"; + } + } + return text; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/config/util/DbTableUtil.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/util/DbTableUtil.java new file mode 100644 index 00000000..15da927c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/util/DbTableUtil.java @@ -0,0 +1,108 @@ +package org.jeecgframework.web.cgform.service.impl.config.util; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.cgform.service.config.DbTableHandleI; +import org.jeecgframework.web.cgform.service.config.DbTableServiceI; +import org.jeecgframework.web.cgform.service.impl.config.DbTableMysqlHandleImpl; +import org.jeecgframework.web.cgform.service.impl.config.DbTableOracleHandleImpl; +import org.jeecgframework.web.cgform.service.impl.config.DbTablePostgresHandleImpl; +import org.jeecgframework.web.cgform.service.impl.config.DbTableServiceMysqlImpl; +import org.jeecgframework.web.cgform.service.impl.config.TableSQLServerHandleImpl; + +import org.hibernate.Session; +import org.hibernate.internal.SessionImpl; + +/** + * 鏁版嵁搴撳伐鍏风被 + * @author jueyue + * 2013骞7鏈6鏃 + */ +public class DbTableUtil { + + /** + * 鑾峰彇鍒楃殑Map + * key 鏄 cloumn_name value 鏄 List> + * @param queryForList + * @return + */ + public static Map getColumnMap( + List> queryForList) { + Map columnMap = new HashMap(); + for(int i =0 ;i _a + * @param fileName + * @return + */ + public static String translatorToDbField(String fileName){ + + //鍘绘帀杞崲 + return fileName; +// String name = ""; +// char[] chars = fileName.toCharArray(); +// for(int i =0 ;i'A'&&chars[i]<'Z'?("_"+Character.toLowerCase(chars[i])):chars[i]; +// } +// return name; + } + + /** + * 鑾峰彇DB 缁存姢琛ㄧ殑宸ュ叿绫 + * @return + */ + public static DbTableServiceI getTableUtil(Session session) { + DbTableServiceI tableUtil = null; + String dialect = ((SessionImpl)session).getFactory().getDialect() + .getClass().getName(); + if (dialect.equals("org.hibernate.dialect.MySQLDialect")) { + tableUtil = new DbTableServiceMysqlImpl(); + } + return tableUtil; + } + + public static DbTableHandleI getTableHandle(Session session) { + DbTableHandleI dbTableHandle = null; + String dialect = ((SessionImpl)session).getFactory().getDialect() + .getClass().getName(); + if (dialect.equals("org.hibernate.dialect.MySQLDialect")) { + dbTableHandle = new DbTableMysqlHandleImpl(); + }else if (dialect.contains("Oracle")) { + dbTableHandle = new DbTableOracleHandleImpl(); + }else if (dialect.equals("org.hibernate.dialect.PostgreSQLDialect")) { + dbTableHandle = new DbTablePostgresHandleImpl(); + }else if (dialect.equals("org.hibernate.dialect.SQLServerDialect")) { + dbTableHandle = new TableSQLServerHandleImpl(); + } + return dbTableHandle; + } + + /** + * 鏁版嵁搴撶被鍨 + * @param session + * @return + */ + + public static String getDataType(Session session){ + String dataType="MYSQL"; + String dialect = ((SessionImpl)session).getFactory().getDialect() + .getClass().getName(); + if (dialect.equals("org.hibernate.dialect.MySQLDialect")) { + dataType="MYSQL"; + }else if (dialect.contains("Oracle")) { + dataType="ORACLE"; + }else if (dialect.equals("org.hibernate.dialect.PostgreSQLDialect")) { + dataType = "POSTGRESQL"; + }else if (dialect.equals("org.hibernate.dialect.SQLServerDialect")) { + dataType="SQLSERVER"; + } + return dataType; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/config/util/FieldNumComparator.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/util/FieldNumComparator.java new file mode 100644 index 00000000..43f06fe4 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/config/util/FieldNumComparator.java @@ -0,0 +1,22 @@ +package org.jeecgframework.web.cgform.service.impl.config.util; + +import java.util.Comparator; + +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +/** + * 瀛楁 椤哄簭 鎺掑簭 + * @author jueyue + * 2013骞7鏈6鏃 + */ +public class FieldNumComparator implements Comparator { + + + public int compare(CgFormFieldEntity o1, CgFormFieldEntity o2) { + if (o1 == null || o1.getOrderNum() == null || o2 == null || o2.getOrderNum() == null) + return -1; + Integer thisVal = o1.getOrderNum(); + Integer anotherVal = o2.getOrderNum(); + return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1)); + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/enhance/CgformEnhanceJsServiceImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/enhance/CgformEnhanceJsServiceImpl.java new file mode 100644 index 00000000..47b1f6b4 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/enhance/CgformEnhanceJsServiceImpl.java @@ -0,0 +1,35 @@ +package org.jeecgframework.web.cgform.service.impl.enhance; + +import java.util.List; + +import org.jeecgframework.web.cgform.entity.enhance.CgformEnhanceJsEntity; +import org.jeecgframework.web.cgform.service.enhance.CgformEnhanceJsServiceI; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service("cgformenhanceJsService") +@Transactional +public class CgformEnhanceJsServiceImpl extends CommonServiceImpl implements CgformEnhanceJsServiceI { + + /** + * 鏍规嵁cgJsType鍜宖ormId鏌ユ壘鏁版嵁 + * @param cgJsType + * @param formId + * @return + */ + + public CgformEnhanceJsEntity getCgformEnhanceJsByTypeFormId(String cgJsType, String formId) { + StringBuilder hql = new StringBuilder(""); + hql.append(" from CgformEnhanceJsEntity t"); + hql.append(" where t.formId='").append(formId).append("'"); + hql.append(" and t.cgJsType ='").append(cgJsType).append("'"); + List list = this.findHql(hql.toString()); + if(list!=null&&list.size()>0){ + return list.get(0); + } + return null; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/service/impl/upload/CgUploadServiceImpl.java b/src/main/java/org/jeecgframework/web/cgform/service/impl/upload/CgUploadServiceImpl.java new file mode 100644 index 00000000..ec392b9d --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/impl/upload/CgUploadServiceImpl.java @@ -0,0 +1,48 @@ +package org.jeecgframework.web.cgform.service.impl.upload; + +import java.util.Map; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.FileUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.jeecgframework.web.cgform.dao.upload.CgFormUploadDao; +import org.jeecgframework.web.cgform.entity.upload.CgUploadEntity; +import org.jeecgframework.web.cgform.service.upload.CgUploadServiceI; +@Service("cgUploadService") +@Transactional +public class CgUploadServiceImpl extends CommonServiceImpl implements CgUploadServiceI { + @Autowired + private CgFormUploadDao cgFormUploadDao; + + public void deleteFile(CgUploadEntity file) { + //step.1 鍒犻櫎闄勪欢 + String sql = "select * from t_s_attachment where id = ?"; + Map attachmentMap = commonDao.findOneForJdbc(sql, file.getId()); + //闄勪欢鐩稿璺緞 + String realpath = (String) attachmentMap.get("realpath"); + String fileName = FileUtils.getFilePrefix2(realpath); + + //鑾峰彇閮ㄧ讲椤圭洰缁濆鍦板潃 + String realPath = ContextHolderUtils.getSession().getServletContext().getRealPath("/"); + FileUtils.delete(realPath+realpath); + FileUtils.delete(realPath+fileName+".pdf"); + FileUtils.delete(realPath+fileName+".swf"); + //step.2 鍒犻櫎鏁版嵁 + commonDao.delete(file); + } + + + public void writeBack(String cgFormId,String cgFormName,String cgFormField,String fileId,String fileUrl) { + try{ + cgFormUploadDao.updateBackFileInfo(cgFormId, cgFormName, cgFormField, fileId, fileUrl); + }catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("鏂囦欢涓婁紶澶辫触锛"+e.getMessage()); + } + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/migrate/MigrateForm.java b/src/main/java/org/jeecgframework/web/cgform/service/migrate/MigrateForm.java new file mode 100644 index 00000000..c089433d --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/migrate/MigrateForm.java @@ -0,0 +1,777 @@ +package org.jeecgframework.web.cgform.service.migrate; + +import java.beans.PropertyDescriptor; +import java.io.BufferedOutputStream; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecgframework.web.cgform.entity.button.CgformButtonEntity; +import org.jeecgframework.web.cgform.entity.button.CgformButtonSqlEntity; +import org.jeecgframework.web.cgform.entity.cgformftl.CgformFtlEntity; +import org.jeecgframework.web.cgform.entity.enhance.CgformEnhanceJsEntity; +import org.jeecgframework.web.cgform.entity.upload.CgUploadEntity; +import org.jeecgframework.web.cgform.exception.BusinessException; +import org.jeecgframework.web.cgform.pojo.config.CgFormFieldPojo; +import org.jeecgframework.web.cgform.pojo.config.CgFormHeadPojo; +import org.jeecgframework.web.cgform.util.PublicUtil; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.apache.tools.zip.ZipEntry; +import org.apache.tools.zip.ZipFile; +import org.apache.tools.zip.ZipOutputStream; +import org.jeecgframework.core.common.model.common.DBTable; +import org.jeecgframework.core.util.ReflectHelper; +import org.springframework.beans.BeanUtils; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowCallbackHandler; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.SqlParameterSource; +import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper; +import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.jdbc.support.rowset.SqlRowSetMetaData; +import org.springframework.stereotype.Service; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.converters.basic.NullConverter; + +/** + * 杩佺Щ琛ㄥ崟宸ュ叿绫 + * + * @author duanqilu + * @author Hank + * @param + * @date 2013-09-10 + * @date 2014-01-25 + */ +@Service("MigrateForm") +public class MigrateForm { + private static final Logger logger = Logger.getLogger(MigrateForm.class); + static InputStream inStream = null; + private static String insert = "INSERT INTO";// 鎻掑叆sql + private static String values = "VALUES";// values鍏抽敭瀛 + + private static List insertList = new ArrayList();// 鍏ㄥ眬瀛樻斁insertsql鏂囦欢鐨勬暟鎹 + private static String basePath = ""; + + + /** + * 鎷艰鏌ヨ璇彞 + * + * @ids:閫変腑琛ㄥ崟鐨処Ds + * @return 杩斿洖select闆嗗悎 + */ + @Deprecated + public static List createSQL(String ids, JdbcTemplate jdbcTemplate) { + List listSQL = new ArrayList();// SQL璇彞鍒楄〃 + listSQL.clear(); + String[] idList = ids.split(",");// 鑾峰緱鎸囧畾鐨処D鏁版嵁 + String ls_sql = ""; + String ls_tmpsql = ""; + String ls_subid = ""; + String subTable = ""; + List rowsList = null; + List subRowsList = null; + Map sqlMap = null; + Map subSqlMap = null; + for (String id : idList) { + ls_sql = "select * from cgform_head where id='" + id + "'"; // 鑾峰緱瀵煎嚭琛ㄥ崟 + listSQL.add(ls_sql); + + ls_tmpsql = "select * from cgform_field where table_id='" + id + "'"; // 鑾峰緱瀵煎嚭琛ㄥ崟鐨勫瓧娈 + listSQL.add(ls_tmpsql); + // 鑾峰緱鑷畾涔夋寜閽暟鎹 + ls_tmpsql = "select * from cgform_button where form_id ='" + id + "'"; + listSQL.add(ls_tmpsql); + // 鑾峰緱JS澧炲己鏁版嵁 + ls_tmpsql = "select * from cgform_enhance_js where form_id ='" + id + "'"; + listSQL.add(ls_tmpsql); + // 鑾峰緱SQL澧炲己鏁版嵁 + ls_tmpsql = "select * from cgform_button_sql where form_id ='" + id + "'"; + listSQL.add(ls_tmpsql); + // 鑾峰緱妯℃澘鏁版嵁 + ls_tmpsql = "select * from cgform_ftl where cgform_id ='" + id + "'"; + listSQL.add(ls_tmpsql); + // 鑾峰緱涓婁紶鏂囦欢鏁版嵁 + ls_tmpsql = "select * from cgform_uploadfiles where cgform_id ='" + id + "'"; + listSQL.add(ls_tmpsql); + + rowsList = jdbcTemplate.queryForList(ls_sql); + if (rowsList != null && rowsList.size() > 0) { + sqlMap = (Map) rowsList.get(0); + subTable = (String) sqlMap.get("sub_table_str"); // 鑾峰緱瀛愯〃 + if (subTable != null && !"".equals(subTable)) { + String[] subs = subTable.split(","); + for (String sub : subs) { + // 鑾峰緱瀵煎嚭瀛愯〃琛ㄥ崟 + ls_tmpsql = "select * from cgform_head where table_name='" + sub + "'"; + listSQL.add(ls_tmpsql); + subRowsList = jdbcTemplate.queryForList(ls_tmpsql); + if (subRowsList != null && subRowsList.size() > 0) { + subSqlMap = (Map) subRowsList.get(0); + ls_subid = (String) subSqlMap.get("id"); + // 鑾峰緱瀵煎嚭瀛愯〃瀛楁 + ls_tmpsql = "select * from cgform_field where table_id='" + ls_subid + "'"; + listSQL.add(ls_tmpsql); + // 鑾峰緱瀛愯〃鑷畾涔夋寜閽暟鎹 + ls_tmpsql = "select * from cgform_button where form_id ='" + ls_subid + "'"; + listSQL.add(ls_tmpsql); + // 鑾峰緱瀛愯〃JS澧炲己鏁版嵁 + ls_tmpsql = "select * from cgform_enhance_js where form_id ='" + ls_subid + "'"; + listSQL.add(ls_tmpsql); + // 鑾峰緱瀛愯〃SQL澧炲己鏁版嵁 + ls_tmpsql = "select * from cgform_button_sql where form_id ='" + ls_subid + "'"; + listSQL.add(ls_tmpsql); + // 鑾峰緱瀛愯〃妯℃澘鏁版嵁 + ls_tmpsql = "select * from cgform_ftl where cgform_id ='" + ls_subid + "'"; + listSQL.add(ls_tmpsql); + // 鑾峰緱瀛愯〃涓婁紶鏂囦欢鏁版嵁 + ls_tmpsql = "select * from cgform_uploadfiles where cgform_id ='" + ls_subid + "'"; + listSQL.add(ls_tmpsql); + } + } + } + + } + } + return listSQL; + } + + public static List buildExportDbTableList(String ids, JdbcTemplate jdbcTemplate) throws Exception { + List listTables = new ArrayList();// SQL璇彞鍒楄〃 + listTables.clear(); + String ls_sql = ""; + String ls_tmpsql = ""; + String ls_subid = ""; + String subTable = ""; + List rowsList = null; + List subRowsList = null; + Map sqlMap = null; + Map subSqlMap = null; + String[] idList = ids.split(",");// 鑾峰緱鎸囧畾鐨処D鏁版嵁 + for (String id : idList) { + ls_sql = "select * from cgform_head where id='" + id + "'"; // 鑾峰緱瀵煎嚭琛ㄥ崟 + listTables.add(bulidDbTableFromSQL(ls_sql, CgFormHeadPojo.class, jdbcTemplate)); + + ls_tmpsql = "select * from cgform_field where table_id='" + id + "'"; // 鑾峰緱瀵煎嚭琛ㄥ崟鐨勫瓧娈 + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgFormFieldPojo.class, jdbcTemplate)); + // 鑾峰緱鑷畾涔夋寜閽暟鎹 + ls_tmpsql = "select * from cgform_button where form_id ='" + id + "'"; + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgformButtonEntity.class, jdbcTemplate)); + // 鑾峰緱JS澧炲己鏁版嵁 + ls_tmpsql = "select * from cgform_enhance_js where form_id ='" + id + "'"; + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgformEnhanceJsEntity.class, jdbcTemplate)); + // 鑾峰緱SQL澧炲己鏁版嵁 + ls_tmpsql = "select * from cgform_button_sql where form_id ='" + id + "'"; + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgformButtonSqlEntity.class, jdbcTemplate)); + // 鑾峰緱妯℃澘鏁版嵁 + ls_tmpsql = "select * from cgform_ftl where cgform_id ='" + id + "'"; + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgformFtlEntity.class, jdbcTemplate)); + // 鑾峰緱涓婁紶鏂囦欢鏁版嵁 + ls_tmpsql = "select * from cgform_uploadfiles where cgform_id ='" + id + "'"; + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgUploadEntity.class, jdbcTemplate)); + + rowsList = jdbcTemplate.queryForList(ls_sql); + if (rowsList != null && rowsList.size() > 0) { + sqlMap = (Map) rowsList.get(0); + subTable = (String) sqlMap.get("sub_table_str"); // 鑾峰緱瀛愯〃 + if (subTable != null && !"".equals(subTable)) { + String[] subs = subTable.split(","); + for (String sub : subs) { + // 鑾峰緱瀵煎嚭瀛愯〃琛ㄥ崟 + ls_tmpsql = "select * from cgform_head where table_name='" + sub + "'"; + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgFormHeadPojo.class, jdbcTemplate)); + subRowsList = jdbcTemplate.queryForList(ls_tmpsql); + if (subRowsList != null && subRowsList.size() > 0) { + subSqlMap = (Map) subRowsList.get(0); + ls_subid = (String) subSqlMap.get("id"); + // 鑾峰緱瀵煎嚭瀛愯〃瀛楁 + ls_tmpsql = "select * from cgform_field where table_id='" + ls_subid + "'"; + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgFormFieldPojo.class, jdbcTemplate)); + // 鑾峰緱瀛愯〃鑷畾涔夋寜閽暟鎹 + ls_tmpsql = "select * from cgform_button where form_id ='" + ls_subid + "'"; + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgformButtonEntity.class, jdbcTemplate)); + // 鑾峰緱瀛愯〃JS澧炲己鏁版嵁 + ls_tmpsql = "select * from cgform_enhance_js where form_id ='" + ls_subid + "'"; + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgformEnhanceJsEntity.class, jdbcTemplate)); + // 鑾峰緱瀛愯〃SQL澧炲己鏁版嵁 + ls_tmpsql = "select * from cgform_button_sql where form_id ='" + ls_subid + "'"; + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgformButtonSqlEntity.class, jdbcTemplate)); + // 鑾峰緱瀛愯〃妯℃澘鏁版嵁 + ls_tmpsql = "select * from cgform_ftl where cgform_id ='" + ls_subid + "'"; + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgformFtlEntity.class, jdbcTemplate)); + // 鑾峰緱瀛愯〃涓婁紶鏂囦欢鏁版嵁 + ls_tmpsql = "select * from cgform_uploadfiles where cgform_id ='" + ls_subid + "'"; + listTables.add(bulidDbTableFromSQL(ls_tmpsql, CgUploadEntity.class, jdbcTemplate)); + } + } + } + + } + } + return listTables; + } + + /** + * 鎵цsql骞惰繑鍥炴彃鍏ql璇彞 + * + * @param sqlRsmd + * @param listSQL + * @throws SQLException + */ + public static void executeSQL(List listSQL, JdbcTemplate jdbcTemplate) throws Exception { + getColumnNameAndColumeValue(listSQL, jdbcTemplate); + } + + public static DBTable bulidDbTableFromSQL(String sql, Class clazz, JdbcTemplate jdbcTemplate) throws InstantiationException, IllegalAccessException, Exception { + DBTable dbTable = new DBTable(); + dbTable.setTableName(PublicUtil.getTableName(sql)); + dbTable.setClass1(clazz); + List dataList = jdbcTemplate.query(sql, ParameterizedBeanPropertyRowMapper.newInstance(clazz)); + dbTable.setTableData(dataList); + return dbTable; + } + + /** + * 鑾峰彇鍒楀悕鍜屽垪鍊 + * + * @param listSQL + * @param sqlRowSet + * @param jdbcTemplate + * @return + * @throws SQLException + */ + public static void getColumnNameAndColumeValue(List listSQL, JdbcTemplate jdbcTemplate) throws Exception { + if (listSQL.size() > 0) { + insertList.clear(); + insertList.add("SET FOREIGN_KEY_CHECKS=0;");// 鍙栨秷澶栭敭妫鏌 + SqlRowSet sqlRowSet = null; + String ls_id = ""; + for (int j = 0; j < listSQL.size(); j++) { + String sql = String.valueOf(listSQL.get(j)); // 閫愭潯鑾峰彇sql璇彞 + sqlRowSet = jdbcTemplate.queryForRowSet(sql); + SqlRowSetMetaData sqlRsmd = sqlRowSet.getMetaData(); + int columnCount = sqlRsmd.getColumnCount(); // 鑾峰緱琛ㄥ瓧娈典釜鏁 + String tableName = sqlRsmd.getTableName(columnCount); // 鑾峰緱琛ㄥ悕绉 + if(StringUtils.isEmpty(tableName)){ + tableName = PublicUtil.getTableName(sql); + } + String tableId=""; + while (sqlRowSet.next()) { + StringBuffer ColumnName = new StringBuffer(); + StringBuffer ColumnValue = new StringBuffer(); + + for (int i = 1; i <= columnCount; i++) { + String value = sqlRowSet.getString(i); + if (value == null || "".equals(value)) { + value = ""; + } + Map fieldMap = new HashMap(); + fieldMap.put("name", sqlRsmd.getColumnName(i)); + fieldMap.put("fieldType", String.valueOf(sqlRsmd.getColumnType(i))); + // 鐢熸垚鎻掑叆鏁版嵁sql璇彞 + if (i == 1) { + // 鍏堢敓鎴愬垹闄ゆ寚瀹欼D璇彞锛屾竻闄ょ幇鏈夊啿绐佹暟鎹 + insertList.add("delete from " + tableName + " where " + sqlRsmd.getColumnName(i) + "='" + value + "';"); + + ColumnName.append(sqlRsmd.getColumnName(i)); + ls_id = value; + tableId = value; + if (Types.CHAR == sqlRsmd.getColumnType(i) || Types.VARCHAR == sqlRsmd.getColumnType(i)) { + ColumnValue.append("'").append(value).append("',"); + } else if (Types.SMALLINT == sqlRsmd.getColumnType(i) || Types.INTEGER == sqlRsmd.getColumnType(i) || Types.BIGINT == sqlRsmd.getColumnType(i) || Types.FLOAT == sqlRsmd.getColumnType(i) || Types.DOUBLE == sqlRsmd.getColumnType(i) || Types.NUMERIC == sqlRsmd.getColumnType(i) || Types.DECIMAL == sqlRsmd.getColumnType(i)) { + if ("".equals(value)) value = "0"; + ColumnValue.append(value).append(","); + } else if (Types.DATE == sqlRsmd.getColumnType(i) || Types.TIME == sqlRsmd.getColumnType(i) || Types.TIMESTAMP == sqlRsmd.getColumnType(i)) { + if ("".equals(value)) + value = "2000-01-01"; + ColumnValue.append("'").append(value).append("',"); + } else { + ColumnValue.append(value).append(","); + } + } else if (i == columnCount) { + ColumnName.append("," + sqlRsmd.getColumnName(i)); + if (Types.CHAR == sqlRsmd.getColumnType(i) || Types.VARCHAR == sqlRsmd.getColumnType(i) || Types.LONGVARCHAR == sqlRsmd.getColumnType(i)) { + ColumnValue.append("'").append(value).append("'"); + } else if (Types.SMALLINT == sqlRsmd.getColumnType(i) || Types.INTEGER == sqlRsmd.getColumnType(i) || Types.BIGINT == sqlRsmd.getColumnType(i) || Types.FLOAT == sqlRsmd.getColumnType(i) || Types.DOUBLE == sqlRsmd.getColumnType(i) || Types.NUMERIC == sqlRsmd.getColumnType(i) || Types.DECIMAL == sqlRsmd.getColumnType(i)) { + if ("".equals(value)) value = "0"; + ColumnValue.append(value); + } else if (Types.DATE == sqlRsmd.getColumnType(i) || Types.TIME == sqlRsmd.getColumnType(i) || Types.TIMESTAMP == sqlRsmd.getColumnType(i)) { + if ("".equals(value)) + value = "2000-01-01"; + ColumnValue.append("'").append(value).append("'"); + } else { + ColumnValue.append(value).append(""); + } + } else { + ColumnName.append("," + sqlRsmd.getColumnName(i)); + if (Types.CHAR == sqlRsmd.getColumnType(i) || Types.VARCHAR == sqlRsmd.getColumnType(i) || Types.LONGVARCHAR == sqlRsmd.getColumnType(i)) { + ColumnValue.append("'").append(value).append("'").append(","); + } else if (Types.SMALLINT == sqlRsmd.getColumnType(i) || Types.INTEGER == sqlRsmd.getColumnType(i) || Types.BIGINT == sqlRsmd.getColumnType(i) || Types.FLOAT == sqlRsmd.getColumnType(i) || Types.DOUBLE == sqlRsmd.getColumnType(i) || Types.NUMERIC == sqlRsmd.getColumnType(i) || Types.DECIMAL == sqlRsmd.getColumnType(i)) { + if ("".equals(value)) value = "0"; + ColumnValue.append(value).append(","); + } else if (Types.DATE == sqlRsmd.getColumnType(i) || Types.TIME == sqlRsmd.getColumnType(i) || Types.TIMESTAMP == sqlRsmd.getColumnType(i)) { + if ("".equals(value)) + value = "2000-01-01"; + ColumnValue.append("'").append(value).append("',"); + } else if (Types.BLOB == sqlRsmd.getColumnType(i) || Types.LONGVARCHAR == sqlRsmd.getColumnType(i) || Types.LONGNVARCHAR == sqlRsmd.getColumnType(i) || Types.BINARY == sqlRsmd.getColumnType(i) || Types.LONGVARBINARY == sqlRsmd.getColumnType(i) || Types.VARBINARY == sqlRsmd.getColumnType(i)) { + String ls_tmp = getBlob(ls_id, tableName, sqlRsmd.getColumnName(i), jdbcTemplate); + ColumnValue.append(ls_tmp).append(","); + } else { + ColumnValue.append(value).append(","); + } + } + + } + + insertSQL(tableName, ColumnName, ColumnValue);// 鎷艰骞舵斁鍒板叏灞list閲岄潰 + if(tableName.equals("cgform_head")){ + insertList.add("update cgform_head set is_dbsynch='N' where id='"+tableId+"';");// 璁句负鏈悓姝 + } + + } + } + + } + } + + /** + * 鎷艰insertsql 鏀惧埌鍏ㄥ眬list閲岄潰 + * + * @param ColumnName + * @param ColumnValue + */ + public static void insertSQL(String tablename, StringBuffer ColumnName, StringBuffer ColumnValue) { + StringBuffer insertSQL = new StringBuffer(); + // 鎷艰sql璇彞 + insertSQL.append(insert).append(" ").append(tablename).append("(").append(ColumnName.toString()).append(")").append(values).append("(").append(ColumnValue.toString()).append(");"); + insertList.add(insertSQL.toString()); // 鏀惧埌鍏ㄥ眬list閲岄潰 + } + + public static void generateXmlDataOutFlieContent(List dbTables, String parentDir) throws BusinessException{ + File file = new File(parentDir); + if (!file.exists()) { + buildFile(parentDir, true); + } + try { + XStream xStream = new XStream(); + xStream.registerConverter(new NullConverter()); + xStream.processAnnotations(DBTable.class); + FileOutputStream outputStream = new FileOutputStream(buildFile(parentDir+"/migrateExport.xml", false)); + Writer writer = new OutputStreamWriter(outputStream, "UTF-8"); + writer.write("\r\n"); + xStream.toXML(dbTables, writer); + } catch (Exception e) { + throw new BusinessException(e.getMessage()); + } + } + + /** + * 鍒涘缓insertsql.sql骞跺鍑烘暟鎹 + */ + public static String createFile(HttpServletRequest request,String ids) { + String savePath = request.getSession().getServletContext().getRealPath("/") + basePath + "/"+ids+"_migrate.sql"; + File file = new File(savePath); + if (!file.exists()) { + try { + file.createNewFile(); + } catch (IOException e) { + logger.info("鍒涘缓鏂囦欢鍚嶅け璐ワ紒锛"); + e.printStackTrace(); + } + } + FileWriter fw = null; + BufferedWriter bw = null; + try { + fw = new FileWriter(file); + bw = new BufferedWriter(fw); + if (insertList.size() > 0) { + for (int i = 0; i < insertList.size(); i++) { + bw.append(insertList.get(i)); + bw.append("\n"); + } + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + bw.close(); + fw.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return savePath; + } + + /** + * 浠ユ祦鏂瑰紡鑾峰緱blog,image绛夊ぇ鏁版嵁 + * + * @param id + * 瀛楁涓婚敭 + * @param tableName + * 琛ㄥ悕 + * @param ColumnName + * 瀛楁鍚 + * @param jdbcTemplate + */ + public static String getBlob(String id, String tableName, final String columnName, JdbcTemplate jdbcTemplate) { + String ls_sql = "select " + columnName + " from " + tableName + " where id='" + id + "'"; + + // 鏌ヨ骞惰幏寰楄緭鍏ユ祦 + jdbcTemplate.query(ls_sql, new RowCallbackHandler() { + + public void processRow(ResultSet rs) throws SQLException { + inStream = rs.getBinaryStream(columnName); + } + }); + + // 璇诲彇娴佹暟鎹苟杞崲鎴16杩涘埗瀛楃涓 + if (inStream != null) { + StringBuffer readInBuffer = new StringBuffer(); + readInBuffer.append("0x"); + byte[] b = new byte[4096]; + try { + + for (; (inStream.read(b)) != -1;) { + readInBuffer.append(byte2HexStr(b)); + } + } catch (IOException e) { + + e.printStackTrace(); + } + String ls_return = readInBuffer.toString().trim(); + if ("0x".equals(ls_return)) { + ls_return = ls_return + "00"; + } + return ls_return; + } else { + return "0x00"; + } + } + + /** + * 杞崲byte[]涓16杩涘埗瀛楃涓 + * + * @param b + * 瑕佽浆鎹㈢殑byte鏁版嵁 + */ + public static String byte2HexStr(byte[] b) { + String hs = ""; + String stmp = ""; + for (int n = 0; n < b.length; n++) { + if (b[n] == 0) + break; // 鍒ゆ柇鏁版嵁缁撴潫 + stmp = (Integer.toHexString(b[n] & 0XFF)); + if (stmp.length() == 1) + hs = hs + "0" + stmp; + else + hs = hs + stmp; + } + return hs.toUpperCase(); + } + + /** + * 鍘嬬缉 + * + * @param zipFileName + * 鍘嬬缉浜х敓鐨剒ip鍖呮枃浠跺悕--甯﹁矾寰,濡傛灉涓簄ull鎴栫┖鍒欓粯璁ゆ寜鏂囦欢鍚嶇敓浜у帇缂╂枃浠跺悕 + * @param relativePath + * 鐩稿璺緞锛岄粯璁や负绌 + * @param directory + * 鏂囦欢鎴栫洰褰曠殑缁濆璺緞 + * @throws FileNotFoundException + * @throws IOException + */ + public static String zip(String zipFileName, String relativePath, String directory) throws FileNotFoundException, IOException { + String fileName = zipFileName; + if (fileName == null || fileName.trim().equals("")) { + File temp = new File(directory); + if (temp.isDirectory()) { + fileName = directory + ".zip"; + } else { + if (directory.indexOf(".") > 0) { + fileName = directory.substring(0, directory.lastIndexOf(".")) + ".zip"; + } else { + fileName = directory + ".zip"; + } + } + } + ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(fileName)); + try { + zip(zos, relativePath, directory); + } catch (IOException ex) { + throw ex; + } finally { + if (null != zos) { + zos.close(); + } + } + return fileName; + } + + /** + * 鍘嬬缉 + * + * @param zos + * 鍘嬬缉杈撳嚭娴 + * @param relativePath + * 鐩稿璺緞 + * @param absolutPath + * 鏂囦欢鎴栨枃浠跺す缁濆璺緞 + * @throws IOException + */ + private static void zip(ZipOutputStream zos, String relativePath, String absolutPath) throws IOException { + File file = new File(absolutPath); + if (file.isDirectory()) { + File[] files = file.listFiles(); + for (int i = 0; i < files.length; i++) { + File tempFile = files[i]; + if (tempFile.isDirectory()) { + String newRelativePath = relativePath + tempFile.getName() + File.separator; + createZipNode(zos, newRelativePath); + zip(zos, newRelativePath, tempFile.getPath()); + } else { + zipFile(zos, tempFile, relativePath); + } + } + } else { + zipFile(zos, file, relativePath); + } + } + + /** + * * 鍘嬬缉鏂囦欢 + * + * @param zos + * 鍘嬬缉杈撳嚭娴 + * @param file + * 鏂囦欢瀵硅薄 + * @param relativePath + * 鐩稿璺緞 + * @throws IOException + */ + private static void zipFile(ZipOutputStream zos, File file, String relativePath) throws IOException { + ZipEntry entry = new ZipEntry(relativePath + file.getName()); + zos.putNextEntry(entry); + InputStream is = null; + try { + is = new FileInputStream(file); + int BUFFERSIZE = 2 << 10; + int length = 0; + byte[] buffer = new byte[BUFFERSIZE]; + while ((length = is.read(buffer, 0, BUFFERSIZE)) >= 0) { + zos.write(buffer, 0, length); + } + zos.flush(); + zos.closeEntry(); + } catch (IOException ex) { + throw ex; + } finally { + if (null != is) { + is.close(); + } + } + } + + /** + * 鍒涘缓鐩綍 + * + * @param zos + * zip杈撳嚭娴 + * @param relativePath + * 鐩稿璺緞 + * @throws IOException + */ + private static void createZipNode(ZipOutputStream zos, String relativePath) throws IOException { + ZipEntry zipEntry = new ZipEntry(relativePath); + zos.putNextEntry(zipEntry); + zos.closeEntry(); + } + + /** + * 瑙e帇缂﹝ip鍖 + * + * @param zipFilePath + * zip鏂囦欢璺緞 + * @param targetPath + * 瑙e帇缂╁埌鐨勪綅缃紝濡傛灉涓簄ull鎴栫┖瀛楃涓插垯榛樿瑙e帇缂╁埌璺焭ip鍖呭悓鐩綍璺焭ip鍖呭悓鍚嶇殑鏂囦欢澶逛笅 + * @throws IOException + */ + public static void unzip(String zipFilePath, String targetPath) throws IOException { + OutputStream os = null; + InputStream is = null; + ZipFile zipFile = null; + try { + zipFile = new ZipFile(zipFilePath); + String directoryPath = ""; + if (null == targetPath || "".equals(targetPath)) { + directoryPath = zipFilePath.substring(0, zipFilePath.lastIndexOf(".")); + } else { + directoryPath = targetPath; + } + Enumeration entryEnum = zipFile.getEntries(); + if (null != entryEnum) { + ZipEntry zipEntry = null; + while (entryEnum.hasMoreElements()) { + zipEntry = (ZipEntry) entryEnum.nextElement(); + if (zipEntry.isDirectory()) { + directoryPath = directoryPath + File.separator + zipEntry.getName(); + org.jeecgframework.core.util.LogUtil.info(directoryPath); + continue; + } + if (zipEntry.getSize() > 0) { + // 鏂囦欢 + File targetFile = buildFile(directoryPath + File.separator + zipEntry.getName(), false); + os = new BufferedOutputStream(new FileOutputStream(targetFile)); + is = zipFile.getInputStream(zipEntry); + byte[] buffer = new byte[4096]; + int readLen = 0; + while ((readLen = is.read(buffer, 0, 4096)) >= 0) { + os.write(buffer, 0, readLen); + } + os.flush(); + os.close(); + } else { + // 绌虹洰褰 + buildFile(directoryPath + File.separator + zipEntry.getName(), true); + } + } + } + } catch (IOException ex) { + throw ex; + } finally { + if (null != zipFile) { + zipFile = null; + } + if (null != is) { + is.close(); + } + if (null != os) { + os.close(); + } + } + } + + /** + * 鐢熶骇鏂囦欢 濡傛灉鏂囦欢鎵鍦ㄨ矾寰勪笉瀛樺湪鍒欑敓鎴愯矾寰 + * + * @param fileName + * 鏂囦欢鍚 甯﹁矾寰 + * @param isDirectory + * 鏄惁涓鸿矾寰 + */ + public static File buildFile(String fileName, boolean isDirectory) { + File target = new File(fileName); + if (isDirectory) { + target.mkdirs(); + } else { + if (!target.getParentFile().exists()) { + target.getParentFile().mkdirs(); + target = new File(target.getAbsolutePath()); + } + } + return target; + } + + public static String generateInsertSql(String tableName, Class clazz, List ignores){ + StringBuffer insertSql = new StringBuffer("insert into " + tableName + "("); + String tableField = ""; + String clazzProperties=""; + PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(clazz); + for (PropertyDescriptor pd : pds) { + if(null != ignores && ignores.size()>0){ + if(ignores.contains(pd.getName())) continue; + } + if (pd.getWriteMethod() != null) { + if(tableField.length()>0 && clazzProperties.length()>0){ + tableField += ","; + clazzProperties += ","; + } + tableField += underscoreName(pd.getName()); + clazzProperties += ":" + pd.getName(); + } + } + insertSql.append(tableField); + insertSql.append(") values("); + insertSql.append(clazzProperties); + insertSql.append(")"); + org.jeecgframework.core.util.LogUtil.info("generate insertSql for "+ clazz.getName() + ":" +insertSql.toString()); + return insertSql.toString(); + } + + public static String generateUpdateSql(String tableName, Class clazz, List ignores){ + StringBuffer updateSql = new StringBuffer("update " + tableName + " set "); + String updateProperties = ""; + PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(clazz); + for (PropertyDescriptor pd : pds) { + if(null != ignores && ignores.size()>0){ + if(ignores.contains(pd.getName())) continue; + } + if(pd.getName().toLowerCase().equals("id")){// || pd.getPropertyType().equals(List.class) + continue; + } + if (pd.getWriteMethod() != null) { + if(updateProperties.length()>0){ + updateProperties += ","; + } + updateProperties += underscoreName(pd.getName()) + "=:" + pd.getName(); + } + } + updateSql.append(updateProperties); + updateSql.append(" where id=:id"); + org.jeecgframework.core.util.LogUtil.info("generate updateSql for "+ clazz.getName() + ":" +updateSql.toString()); + return updateSql.toString(); + } + + public static SqlParameterSource generateParameterMap(Object t, List ignores){ + Map paramMap = new HashMap(); + ReflectHelper reflectHelper = new ReflectHelper(t); + PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(t.getClass()); + for (PropertyDescriptor pd : pds) { + if(null != ignores && ignores.contains(pd.getName())){ + continue; + } + paramMap.put(pd.getName(), reflectHelper.getMethodValue(pd.getName())); + } + MapSqlParameterSource sqlParameterSource = new MapSqlParameterSource(paramMap); + return sqlParameterSource; + } + + private static String underscoreName(String name) { + StringBuilder result = new StringBuilder(); + if (name != null && name.length() > 0) { + result.append(name.substring(0, 1).toLowerCase()); + for (int i = 1; i < name.length(); i++) { + String s = name.substring(i, i + 1); + if (s.equals(s.toUpperCase())) { + result.append("_"); + result.append(s.toLowerCase()); + } + else { + result.append(s); + } + } + } + return result.toString(); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/service/upload/CgUploadServiceI.java b/src/main/java/org/jeecgframework/web/cgform/service/upload/CgUploadServiceI.java new file mode 100644 index 00000000..558ff101 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/service/upload/CgUploadServiceI.java @@ -0,0 +1,27 @@ +package org.jeecgframework.web.cgform.service.upload; + +import org.jeecgframework.core.common.service.CommonService; + +import org.jeecgframework.web.cgform.entity.upload.CgUploadEntity; +/** + * + * @Title:CgUploadServiceI + * @description:鏅鸿兘琛ㄥ崟鏂囦欢涓婁紶鏈嶅姟 + * @author 璧典繆澶 + * @date Jul 24, 2013 9:55:07 PM + * @version V1.0 + */ +public interface CgUploadServiceI extends CommonService{ + /** + * 鍒犻櫎鏂囦欢 + * @param file + */ + public void deleteFile(CgUploadEntity file); + /** + * 灏嗘枃浠朵俊鎭洖濉埌鏅鸿兘琛ㄥ崟鐨勮〃涓 + * @param cgFormId + * @param cgFormName + * @param cgFormField + */ + public void writeBack(String cgFormId,String cgFormName,String cgFormField,String fileId,String fileUrl); +} diff --git a/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormFieldDao_getCgFormFieldByTableName.sql b/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormFieldDao_getCgFormFieldByTableName.sql new file mode 100644 index 00000000..02808a3f --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormFieldDao_getCgFormFieldByTableName.sql @@ -0,0 +1,4 @@ +select f.* from cgform_field f,cgform_head h + where f.table_id = h.id and f.is_show='Y' + and h.table_name=:tableName order by f.order_num + \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormFieldDao_getCgFormHiddenFieldByTableName.sql b/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormFieldDao_getCgFormHiddenFieldByTableName.sql new file mode 100644 index 00000000..77f6f237 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormFieldDao_getCgFormHiddenFieldByTableName.sql @@ -0,0 +1,4 @@ +select f.* from cgform_field f,cgform_head h + where f.table_id = h.id and f.is_show <> 'Y' + and h.table_name=:tableName order by f.order_num + \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormVersionDao_getCgFormById.sql b/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormVersionDao_getCgFormById.sql new file mode 100644 index 00000000..1fe45caa --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormVersionDao_getCgFormById.sql @@ -0,0 +1,4 @@ +select +* +from cgform_head +where id = :id \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormVersionDao_getCgFormVersionById.sql b/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormVersionDao_getCgFormVersionById.sql new file mode 100644 index 00000000..fb4e649c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormVersionDao_getCgFormVersionById.sql @@ -0,0 +1,4 @@ +select +jform_version +from cgform_head +where id = '${id}' \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormVersionDao_getCgFormVersionByTableName.sql b/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormVersionDao_getCgFormVersionByTableName.sql new file mode 100644 index 00000000..dc18d50f --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormVersionDao_getCgFormVersionByTableName.sql @@ -0,0 +1,4 @@ +select +jform_version +from cgform_head +where table_name = '${tableName}' \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormVersionDao_updateVersion.sql b/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormVersionDao_updateVersion.sql new file mode 100644 index 00000000..2dceb641 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/sql/config/CgFormVersionDao_updateVersion.sql @@ -0,0 +1 @@ +update cgform_head set jform_version = '${newVersion}' where id = '${formId}' \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/sql/upload/CgFormUploadDao_updateBackFileInfo.sql b/src/main/java/org/jeecgframework/web/cgform/sql/upload/CgFormUploadDao_updateBackFileInfo.sql new file mode 100644 index 00000000..a962a2b6 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/sql/upload/CgFormUploadDao_updateBackFileInfo.sql @@ -0,0 +1 @@ +update ${cgFormName} set ${cgFormField} = '${fileUrl}' where id='${cgFormId}' \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgform/util/PublicUtil.java b/src/main/java/org/jeecgframework/web/cgform/util/PublicUtil.java new file mode 100644 index 00000000..b3ffc1ef --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/util/PublicUtil.java @@ -0,0 +1,84 @@ +package org.jeecgframework.web.cgform.util; + +import java.util.Date; + +import org.jeecgframework.core.util.ReflectHelper; +import org.jeecgframework.core.util.ResourceUtil; + +/** + * 鍏叡鏂规硶 + * @author jueyue + * + */ +public class PublicUtil { + /** + * 琛ㄦ牸涓鑸氱敤瀛楁createDate,createBy,createName + * updateDate,updateBy,updateName + * @param obj + * @param isUpdate + */ + public static void setCommonForTable(Object obj, boolean isCreate){ + ReflectHelper reflectHelper=new ReflectHelper(obj); + if(isCreate){ + reflectHelper.setMethodValue("createDate", new Date()); + reflectHelper.setMethodValue("createBy", ResourceUtil.getSessionUserName().getId()); + reflectHelper.setMethodValue("createName", ResourceUtil.getSessionUserName().getUserName()); + } + reflectHelper.setMethodValue("updateDate", new Date()); + reflectHelper.setMethodValue("updateBy", ResourceUtil.getSessionUserName().getId()); + reflectHelper.setMethodValue("updateName", ResourceUtil.getSessionUserName().getUserName()); + } + /** + * 璁剧疆checkbox鐨勫 -- Y/N + * @param obj + * @param params 浠ラ楀彿闅斿紑 "isNull,isShow,isQuery,isKey" + */ + public static void judgeCheckboxValue(Object obj,String params){ + ReflectHelper reflectHelper=new ReflectHelper(obj); + String [] paramsArr = params.split(","); + for(int i = 0;i1){ + s = s.substring(0, s.indexOf("where")); + } + return s.trim(); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgform/util/QueryParamUtil.java b/src/main/java/org/jeecgframework/web/cgform/util/QueryParamUtil.java new file mode 100644 index 00000000..7e293cdb --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgform/util/QueryParamUtil.java @@ -0,0 +1,243 @@ +package org.jeecgframework.web.cgform.util; + +import java.io.UnsupportedEncodingException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.jeecgframework.core.util.DBTypeUtil; +import org.jeecgframework.core.util.StringUtil; + +import org.jeecgframework.web.cgform.common.CgAutoListConstant; +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; + +/** + * + * @Title:QueryParamUtil + * @description:鍒楄〃鏌ヨ鏉′欢澶勭悊宸ュ叿 + * @author 璧典繆澶 + * @date Jul 5, 2013 10:22:31 PM + * @version V1.0 + */ +public class QueryParamUtil { + /** + * 缁勮鏌ヨ鍙傛暟 + * @param request 璇锋眰(鏌ヨ鍊间粠姝ゅ鍙) + * @param b CgFormFieldEntity瀹炰綋 + * @param params 鍙傛暟瀛樻斁 + */ + @SuppressWarnings("unchecked") + public static void loadQueryParams(HttpServletRequest request, CgFormFieldEntity b, Map params) { + if("single".equals(b.getQueryMode())){ + //鍗曟潯浠剁粍瑁呮柟寮 + String value = request.getParameter(b.getFieldName()); + try { + if(StringUtil.isEmpty(value)){ + return; + } + String uri = request.getQueryString(); + if(uri.contains(b.getFieldName()+"=")){ + String contiansChinesevalue = new String(value.getBytes("ISO-8859-1"), "UTF-8"); + value = contiansChinesevalue; + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return; + } + sql_inj_throw(value); + value = applyType(b.getType(),value); + if(!StringUtil.isEmpty(value)){ + if(value.contains("*")){ + //妯$硦鏌ヨ + value = value.replaceAll("\\*", "%"); + params.put(b.getFieldName(), CgAutoListConstant.OP_LIKE+value); + }else{ + params.put(b.getFieldName(), CgAutoListConstant.OP_EQ+value); + } + } + }else if("group".equals(b.getQueryMode())){ + //鑼冨洿鏌ヨ缁勮 + String begin = request.getParameter(b.getFieldName()+"_begin"); + sql_inj_throw(begin); + begin= applyType(b.getType(),begin); + String end = request.getParameter(b.getFieldName()+"_end"); + sql_inj_throw(end); + end= applyType(b.getType(),end); + if(!StringUtil.isEmpty(begin)){ + String re = CgAutoListConstant.OP_RQ+begin; + if(!StringUtil.isEmpty(end)){ + re +=" AND "+b.getFieldName()+CgAutoListConstant.OP_LQ+end; + } + params.put(b.getFieldName(), re); + }else if(!StringUtil.isEmpty(end)){ + String re = CgAutoListConstant.OP_LQ+end; + params.put(b.getFieldName(), re); + } + } + } + /** + * 鏍规嵁瀛楁绫诲瀷 杩涜澶勭悊 + * @param fieldType 瀛楁绫诲瀷 + * @param value 鍊 + * @return + */ + public static String applyType(String fieldType, String value) { + if(!StringUtil.isEmpty(value)){ + String result = ""; + if(CgAutoListConstant.TYPE_STRING.equalsIgnoreCase(fieldType)){ + result = "'" +value+ "'"; + }else if(CgAutoListConstant.TYPE_DATE.equalsIgnoreCase(fieldType)){ + result = getDateFunction(value, "yyyy-MM-dd"); + }else if(CgAutoListConstant.TYPE_DOUBLE.equalsIgnoreCase(fieldType)){ + result = value; + }else if(CgAutoListConstant.TYPE_INTEGER.equalsIgnoreCase(fieldType)){ + result = value; + }else{ + result = value; + } + return result; + }else{ + return ""; + } + } + + /** + * 闃叉sql娉ㄥ叆 + * @param str 杈撳叆sql + * @return 鏄惁瀛樺湪娉ㄥ叆鍏抽敭瀛 + */ + public static boolean sql_inj(String str) { + if(StringUtil.isEmpty(str)){ + return false; + } + String inj_str = "'|and|exec|insert|select|delete|update|count|chr|mid|master|truncate|char|declare|;|or|+|,"; +// String inj_str = "'|and|exec|insert|select|delete|update|count|chr|mid|master|truncate|char|declare|;|or|-|+|,"; + String inj_stra[] = inj_str.split("\\|"); + for (int i = 0; i < inj_stra.length; i++) { + if (str.indexOf(" "+inj_stra[i]+" ") >= 0) { + return true; + } + } + return false; + } + /** + * 褰撳瓨鍦╯ql娉ㄥ叆鏃舵姏寮傚父 + * @param str 杈撳叆sql + */ + public static void sql_inj_throw(String str){ + if(sql_inj(str)){ + throw new RuntimeException("璇锋敞鎰,濉叆鐨勫弬鏁板彲鑳藉瓨鍦⊿QL娉ㄥ叆!"); + } + } + /** + * 鑾峰彇鏁版嵁搴撶被鍨 + * @return + */ + public static String getDBType(){ + return DBTypeUtil.getDBType(); + } + /** + * 璺ㄦ暟鎹簱杩斿洖鏃ユ湡鍑芥暟 + * @param dateStr 鏃ユ湡鍊 + * @param dateFormat 鏃ユ湡鏍煎紡 + * @return 鏃ユ湡鍑芥暟 + */ + public static String getDateFunction(String dateStr,String dateFormat){ + String dbType = getDBType(); + String dateFunction = ""; + if("mysql".equalsIgnoreCase(dbType)){ + //mysql鏃ユ湡鍑芥暟 + dateFunction = "'"+dateStr+"'"; + }else if("oracle".equalsIgnoreCase(dbType)){ + //oracle鏃ユ湡鍑芥暟 + dateFunction = "TO_DATE('"+dateStr+"','"+dateFormat+"')"; + }else if("sqlserver".equalsIgnoreCase(dbType)){ + //sqlserver鏃ユ湡鍑芥暟 + dateFunction = "(CONVERT(VARCHAR,'"+dateStr+"') as DATETIME)"; + }else if("postgres".equalsIgnoreCase(dbType)){ + //postgres鏃ユ湡鍑芥暟 + dateFunction = "'"+dateStr+"'::date "; + }else{ + dateFunction = dateStr; + } + return dateFunction; + } + /** + * 灏嗙粨鏋滈泦杞寲涓哄垪琛╦son鏍煎紡 + * @param result 缁撴灉闆 + * @param size 鎬诲ぇ灏 + * @return 澶勭悊濂界殑json鏍煎紡 + */ + @SuppressWarnings("unchecked") + public static String getJson(List> result,Long size){ + JSONObject main = new JSONObject(); + JSONArray rows = new JSONArray(); + main.put("total",size ); + for(Map m:result){ + JSONObject item = new JSONObject(); + Iterator it =m.keySet().iterator(); + while(it.hasNext()){ + String key = (String) it.next(); + String value =String.valueOf(m.get(key)); + key = key.toLowerCase(); + if(key.contains("time")||key.contains("date")){ + value = datatimeFormat(value); + } + item.put(key,value ); + } + rows.add(item); + } + main.put("rows", rows); + return main.toString(); + } + + /** + * 灏嗙粨鏋滈泦杞寲涓哄垪琛╦son鏍煎紡(涓嶅惈鍒嗛〉淇℃伅) + * @param result 缁撴灉闆 + * @param size 鎬诲ぇ灏 + * @return 澶勭悊濂界殑json鏍煎紡 + */ + @SuppressWarnings("unchecked") + public static String getJson(List> result){ + JSONArray rows = new JSONArray(); + for(Map m:result){ + JSONObject item = new JSONObject(); + Iterator it =m.keySet().iterator(); + while(it.hasNext()){ + String key = (String) it.next(); + String value =String.valueOf(m.get(key)); + key = key.toLowerCase(); + if(key.contains("time")||key.contains("date")){ + value = datatimeFormat(value); + } + item.put(key,value ); + } + rows.add(item); + } + return rows.toString(); + } + + /** + * 灏嗘绉掓暟鍘绘帀 + * @param datetime + * @return + */ + public static String datatimeFormat(String datetime){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); + SimpleDateFormat dateFormatTo = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date d = null; + try{ + d = dateFormat.parse(datetime); + return dateFormatTo.format(d); + }catch (Exception e) { + return datetime; + } + } +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/common/CgReportConstant.java b/src/main/java/org/jeecgframework/web/cgreport/common/CgReportConstant.java new file mode 100644 index 00000000..67091015 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/common/CgReportConstant.java @@ -0,0 +1,64 @@ +package org.jeecgframework.web.cgreport.common; +/** + * + * @Title:CgReportConstant + * @description:鍔ㄦ佹姤琛ㄥ父閲忕被 + * @author 璧典繆澶 + * @date Jul 30, 2013 9:16:18 AM + * @version V1.0 + */ +public class CgReportConstant { + /** 鎶ご閰嶇疆 */ + public static final String MAIN= "main"; + /** 鏄庣粏閰嶇疆*/ + public static final String ITEMS= "items"; + /** 閰嶇疆鐨刬d*/ + public static final String CONFIG_ID="config_id"; + /** 閰嶇疆鐨勫悕绉*/ + public static final String CONFIG_NAME="config_name"; + /** 瀛楁鍒楄〃*/ + public static final String CONFIG_FIELDLIST = "config_fieldList"; + /** 鏌ヨ瀛楁*/ + public static final String CONFIG_QUERYLIST ="config_queryList"; + /**瀛楀吀鏁版嵁*/ + public static final String FIELD_DICTLIST = "field_dictlist"; + /**绯荤粺瀛楀吀琛*/ + public static final String SYS_DIC="t_s_type"; + /**绯荤粺瀛楀吀鍒嗙粍琛*/ + public static final String SYS_DICGROUP="t_s_typegroup"; + /** 鎶ご閰嶇疆-鏌ヨSQL*/ + public static final String CONFIG_SQL= "cgreport_sql"; + /** 瀛楀吀缂栫爜*/ + public static final String ITEM_DICCODE= "dict_code"; + /** 鍙栧艰〃杈惧紡*/ + public static final String ITEM_REPLACE = "replace_value"; + /** 鏄庣粏閰嶇疆-瀛楁鍚*/ + public static final String ITEM_FIELDNAME = "field_name"; + /** 鏄庣粏閰嶇疆-鏄惁鏌ヨ*/ + public static final String ITEM_ISQUERY = "search_flag"; + /** 鏄庣粏閰嶇疆-瀛楁绫诲瀷*/ + public static final String ITEM_FIELDTYPE = "field_type"; + /** 鏄庣粏閰嶇疆-鏌ヨ妯″紡*/ + public static final String ITEM_QUERYMODE = "search_mode"; + /**閫昏緫true*/ + public static final String BOOL_TRUE= "Y"; + /**閫昏緫false*/ + public static final String BOOL_FALSE= "N"; + /**鏌ヨ鎿嶄綔=*/ + public static final String OP_EQ = " = "; + /**鏌ヨ鎿嶄綔>=*/ + public static final String OP_RQ = " >= "; + /**鏌ヨ鎿嶄綔<=*/ + public static final String OP_LQ = " <= "; + /**鏌ヨ鎿嶄綔like*/ + public static final String OP_LIKE = " LIKE "; + /**鏄剧ず妯″紡Date*/ + public static final String TYPE_DATE = "Date"; + /**鏄剧ず妯″紡String*/ + public static final String TYPE_STRING = "String"; + /**鏄剧ず妯″紡Integer*/ + public static final String TYPE_INTEGER = "Integer"; + /**鏄剧ず妯″紡Double*/ + public static final String TYPE_DOUBLE = "Double"; + +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/controller/core/CgReportController.java b/src/main/java/org/jeecgframework/web/cgreport/controller/core/CgReportController.java new file mode 100644 index 00000000..37034b27 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/controller/core/CgReportController.java @@ -0,0 +1,327 @@ +package org.jeecgframework.web.cgreport.controller.core; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.enums.SysThemesEnum; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.SysThemesUtil; +import org.jeecgframework.web.cgform.common.CgAutoListConstant; +import org.jeecgframework.web.cgform.engine.FreemarkerHelper; +import org.jeecgframework.web.cgreport.common.CgReportConstant; +import org.jeecgframework.web.cgreport.exception.CgReportNotFoundException; +import org.jeecgframework.web.cgreport.service.core.CgReportServiceI; +import org.jeecgframework.web.cgreport.util.CgReportQueryParamUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +/** + * + * @Title:CgReportController + * @description:鍔ㄦ佹姤琛ㄥ睍绀烘帶鍒跺櫒 + * @author 璧典繆澶 + * @date Jul 29, 2013 9:39:40 PM + * @version V1.0 + */ +@Controller +@RequestMapping("/cgReportController") +public class CgReportController extends BaseController { + @Autowired + private CgReportServiceI cgReportService; + /** + * 鍔ㄦ佹姤琛ㄥ睍鐜板叆鍙 + * @param id 鍔ㄦ侀厤缃甀D-code + * @param request + * @param response + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "list") + public void list(String id, HttpServletRequest request, + HttpServletResponse response) { + //step.1 鏍规嵁id鑾峰彇璇ュ姩鎬佹姤琛ㄧ殑閰嶇疆鍙傛暟 + Map cgReportMap = null; + try{ + cgReportMap = cgReportService.queryCgReportConfig(id); + }catch (Exception e) { + throw new CgReportNotFoundException("鍔ㄦ佹姤琛ㄩ厤缃笉瀛樺湪!"); + } + //step.2 鑾峰彇鍒楄〃ftl妯℃澘璺緞 + FreemarkerHelper viewEngine = new FreemarkerHelper(); + //step.3 缁勫悎妯℃澘+鏁版嵁鍙傛暟锛岃繘琛岄〉闈㈠睍鐜 + loadVars(cgReportMap); + //step.4 椤甸潰css js寮曠敤 + cgReportMap.put(CgAutoListConstant.CONFIG_IFRAME, getHtmlHead(request)); + String html = viewEngine.parseTemplate("/org/jeecgframework/web/cgreport/engine/core/cgreportlist.ftl", cgReportMap); + try { + response.setContentType("text/html"); + response.setHeader("Cache-Control", "no-store"); + PrintWriter writer = response.getWriter(); + writer.println(html); + System.out.println(html); + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private String getHtmlHead(HttpServletRequest request){ + HttpSession session = ContextHolderUtils.getSession(); + String lang = (String)session.getAttribute("lang"); + StringBuilder sb= new StringBuilder(""); + SysThemesEnum sysThemesEnum = SysThemesUtil.getSysTheme(request); + sb.append(""); + sb.append(""); + sb.append(SysThemesUtil.getEasyUiTheme(sysThemesEnum)); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(SysThemesUtil.getLhgdialogTheme(sysThemesEnum)); + sb.append(StringUtil.replace("", "{0}", lang)); + sb.append(""); + return sb.toString(); + } + + /** + * popup鍏ュ彛 + * @param id 鍔ㄦ侀厤缃甀D-code + * @param request + * @param response + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "popup") + public void popup(String id, HttpServletRequest request, + HttpServletResponse response) { + //step.1 鏍规嵁id鑾峰彇璇ュ姩鎬佹姤琛ㄧ殑閰嶇疆鍙傛暟 + Map cgReportMap = null; + try{ + cgReportMap = cgReportService.queryCgReportConfig(id); + }catch (Exception e) { + throw new CgReportNotFoundException("鍔ㄦ佹姤琛ㄩ厤缃笉瀛樺湪!"); + } + //step.2 鑾峰彇鍒楄〃ftl妯℃澘璺緞 + FreemarkerHelper viewEngine = new FreemarkerHelper(); + //step.3 缁勫悎妯℃澘+鏁版嵁鍙傛暟锛岃繘琛岄〉闈㈠睍鐜 + loadVars(cgReportMap); + //step.4 椤甸潰css js寮曠敤 + cgReportMap.put(CgAutoListConstant.CONFIG_IFRAME, getHtmlHead(request)); + String html = viewEngine.parseTemplate("/org/jeecgframework/web/cgreport/engine/core/cgreportlistpopup.ftl", cgReportMap); + try { + response.setContentType("text/html"); + response.setHeader("Cache-Control", "no-store"); + PrintWriter writer = response.getWriter(); + writer.println(html); + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** + * 缁勮妯$増鍙傛暟 + * @param cgReportMap + */ + @SuppressWarnings("unchecked") + private void loadVars(Map cgReportMap) { + Map mainM = (Map) cgReportMap.get(CgReportConstant.MAIN); + List> fieldList = (List>) cgReportMap.get(CgReportConstant.ITEMS); + List> queryList = new ArrayList>(0); + for(Map fl:fieldList){ + fl.put(CgReportConstant.ITEM_FIELDNAME, ((String)fl.get(CgReportConstant.ITEM_FIELDNAME)).toLowerCase()); + String isQuery = (String) fl.get(CgReportConstant.ITEM_ISQUERY); + if(CgReportConstant.BOOL_TRUE.equalsIgnoreCase(isQuery)){ + loadDic(fl,fl); + queryList.add(fl); + } + } + cgReportMap.put(CgReportConstant.CONFIG_ID, mainM.get("code")); + cgReportMap.put(CgReportConstant.CONFIG_NAME, mainM.get("name")); + cgReportMap.put(CgReportConstant.CONFIG_FIELDLIST, fieldList); + cgReportMap.put(CgReportConstant.CONFIG_QUERYLIST, queryList); + } + + + /** + * 澶勭悊鏁版嵁瀛楀吀 + * @param result 鏌ヨ鐨勭粨鏋滈泦 + * @param beans 瀛楁閰嶇疆 + */ + @SuppressWarnings("unchecked") + private void dealDic(List> result, + List> beans) { + for(Map bean:beans){ + String dict_code = (String) bean.get(CgReportConstant.ITEM_DICCODE); + if(StringUtil.isEmpty(dict_code)){ + //涓嶉渶瑕佸鐞嗗瓧鍏 + continue; + }else{ + List> dicDatas = queryDic(dict_code); + for(Map r:result){ + String value = String.valueOf(r.get(bean.get(CgReportConstant.ITEM_FIELDNAME))); + for(Map m:dicDatas){ + String typecode = String.valueOf(m.get("typecode")); + String typename = String.valueOf(m.get("typename")); + if(value.equalsIgnoreCase(typecode)){ + r.put(bean.get(CgReportConstant.ITEM_FIELDNAME),typename); + } + } + } + } + } + } + /** + * 澶勭悊鍙栧艰〃杈惧紡 + * @param result + * @param beans + */ + @SuppressWarnings("unchecked") + private void dealReplace(List> result, + List> beans){ + for(Map bean:beans){ + try{ + //鑾峰彇鍙栧艰〃杈惧紡 + String replace = (String) bean.get(CgReportConstant.ITEM_REPLACE); + if(StringUtil.isEmpty(replace)){ + continue; + } + String[] groups = replace.split(","); + for(String g:groups){ + String[] items = g.split("_"); + String v = items[0];//閫昏緫鍒ゆ柇鍊 + String txt = items[1];//瑕佽浆鎹㈢殑鏂囨湰 + for(Map r:result){ + String value = String.valueOf(r.get(bean.get(CgReportConstant.ITEM_FIELDNAME))); + if(value.equalsIgnoreCase(v)){ + r.put(bean.get(CgReportConstant.ITEM_FIELDNAME),txt); + } + } + } + }catch (Exception e) { + //杩欓噷鍑虹幇寮傚父鍘熷洜鏄洜涓哄彇鍊艰〃杈惧紡涓嶆纭 + e.printStackTrace(); + throw new BusinessException("鍙栧艰〃杈惧紡涓嶆纭"); + } + } + } + /** + * 鍔ㄦ佹姤琛ㄦ暟鎹煡璇 + * @param configId 閰嶇疆id-code + * @param page 鍒嗛〉椤甸潰 + * @param rows 鍒嗛〉澶у皬 + * @param request + * @param response + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "datagrid") + public void datagrid(String configId,String page,String field,String rows, HttpServletRequest request, + HttpServletResponse response) { + //step.1 鏍规嵁id鑾峰彇璇ュ姩鎬佹姤琛ㄧ殑閰嶇疆鍙傛暟 + Map cgReportMap = null; + try{ + cgReportMap = cgReportService.queryCgReportConfig(configId); + if(cgReportMap.size()<=0){ + throw new CgReportNotFoundException("鍔ㄦ佹姤琛ㄩ厤缃笉瀛樺湪!"); + } + }catch (Exception e) { + throw new CgReportNotFoundException("鏌ユ壘鍔ㄦ佹姤琛ㄩ厤缃け璐!"+e.getMessage()); + } + //step.2 鑾峰彇璇ラ厤缃殑鏌ヨSQL + Map configM = (Map) cgReportMap.get(CgReportConstant.MAIN); + String querySql = (String) configM.get(CgReportConstant.CONFIG_SQL); + List> items = (List>) cgReportMap.get(CgReportConstant.ITEMS); + Map queryparams = new LinkedHashMap(); + for(Map item:items){ + String isQuery = (String) item.get(CgReportConstant.ITEM_ISQUERY); + if(CgReportConstant.BOOL_TRUE.equalsIgnoreCase(isQuery)){ + //step.3 瑁呰浇鏌ヨ鏉′欢 + CgReportQueryParamUtil.loadQueryParams(request, item, queryparams); + } + } + //step.4 杩涜鏌ヨ杩斿洖缁撴灉 + int p = page==null?1:Integer.parseInt(page); + int r = rows==null?99999:Integer.parseInt(rows); + List> result= cgReportService.queryByCgReportSql(querySql, queryparams, p, r); + long size = cgReportService.countQueryByCgReportSql(querySql, queryparams); + dealDic(result,items); + dealReplace(result,items); + response.setContentType("application/json"); + response.setHeader("Cache-Control", "no-store"); + PrintWriter writer; + try { + writer = response.getWriter(); + writer.println(CgReportQueryParamUtil.getJson(result,size)); + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** + * 瑙f瀽SQL锛岃繑鍥炲瓧娈甸泦 + * @param sql + * @return + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "getFields", method = RequestMethod.POST) + @ResponseBody + public Object getSqlFields(String sql){ + List result = null; + Map reJson = new HashMap(); + try{ + result = cgReportService.getSqlFields(sql); + }catch (Exception e) { + e.printStackTrace(); + String errorInfo = "瑙f瀽澶辫触!

    澶辫触鍘熷洜锛"; + errorInfo += e.getMessage(); + reJson.put("status", "error"); + reJson.put("datas", errorInfo); + return reJson; + } + reJson.put("status", "success"); + reJson.put("datas", result); + return reJson; + } + /** + * 瑁呰浇鏁版嵁瀛楀吀 + * @param m 瑕佹斁鍏reemarker鐨勬暟鎹 + * @param bean 璇诲彇鍑烘潵鐨勫姩鎬侀厤缃暟鎹 + */ + @SuppressWarnings("unchecked") + private void loadDic(Map m, Map cgReportMap) { + String dict_code = (String) cgReportMap.get("dict_code"); + if(StringUtil.isEmpty(dict_code)){ + m.put(CgReportConstant.FIELD_DICTLIST, new ArrayList(0)); + return; + } + List> dicDatas = queryDic(dict_code); + m.put(CgReportConstant.FIELD_DICTLIST, dicDatas); + } + /** + * 鏌ヨ鏁版嵁瀛楀吀 + * @param diccode 瀛楀吀缂栫爜 + * @return + */ + private List> queryDic(String diccode) { + StringBuilder dicSql = new StringBuilder(); + dicSql.append(" SELECT TYPECODE,TYPENAME FROM"); + dicSql.append(" "+CgReportConstant.SYS_DIC); + dicSql.append(" "+"WHERE TYPEGROUPID = "); + dicSql.append(" "+"(SELECT ID FROM "+CgReportConstant.SYS_DICGROUP+" WHERE TYPEGROUPCODE = '"+diccode+"' )"); + List> dicDatas = cgReportService.findForJdbc(dicSql.toString()); + return dicDatas; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/controller/core/CgreportConfigHeadController.java b/src/main/java/org/jeecgframework/web/cgreport/controller/core/CgreportConfigHeadController.java new file mode 100644 index 00000000..41a460a8 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/controller/core/CgreportConfigHeadController.java @@ -0,0 +1,244 @@ +package org.jeecgframework.web.cgreport.controller.core; +import java.util.List; +import java.text.SimpleDateFormat; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.util.MyBeanUtils; + +import org.jeecgframework.web.cgreport.entity.core.CgreportConfigHeadEntity; +import org.jeecgframework.web.cgreport.page.core.CgreportConfigHeadPage; +import org.jeecgframework.web.cgreport.service.core.CgreportConfigHeadServiceI; +import org.jeecgframework.web.cgreport.entity.core.CgreportConfigItemEntity; +/** + * @Title: Controller + * @Description: 鍔ㄦ佹姤琛ㄩ厤缃姮澶 + * @author 寮犱唬娴 + * @date 2013-12-07 16:00:21 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/cgreportConfigHeadController") +public class CgreportConfigHeadController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(CgreportConfigHeadController.class); + + @Autowired + private CgreportConfigHeadServiceI cgreportConfigHeadService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 鍔ㄦ佹姤琛ㄩ厤缃姮澶村垪琛 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "cgreportConfigHead") + public ModelAndView cgreportConfigHead(HttpServletRequest request) { + return new ModelAndView("jeecg/cgreport/core/cgreportConfigHeadList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(CgreportConfigHeadEntity cgreportConfigHead,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(CgreportConfigHeadEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, cgreportConfigHead); + try{ + //鑷畾涔夎拷鍔犳煡璇㈡潯浠 + }catch (Exception e) { + throw new BusinessException(e.getMessage()); + } + cq.add(); + this.cgreportConfigHeadService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎鍔ㄦ佹姤琛ㄩ厤缃姮澶 + * + * @return + */ + @RequestMapping(params = "doDel") + @ResponseBody + public AjaxJson doDel(CgreportConfigHeadEntity cgreportConfigHead, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + cgreportConfigHead = systemService.getEntity(CgreportConfigHeadEntity.class, cgreportConfigHead.getId()); + message = "鍔ㄦ佹姤琛ㄩ厤缃姮澶村垹闄ゆ垚鍔"; + try{ + cgreportConfigHeadService.delete(cgreportConfigHead); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "鍔ㄦ佹姤琛ㄩ厤缃姮澶村垹闄ゅけ璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鎵归噺鍒犻櫎鍔ㄦ佹姤琛ㄩ厤缃姮澶 + * + * @return + */ + @RequestMapping(params = "doBatchDel") + @ResponseBody + public AjaxJson doBatchDel(String ids,HttpServletRequest request){ + AjaxJson j = new AjaxJson(); + message = "鍔ㄦ佹姤琛ㄩ厤缃姮澶村垹闄ゆ垚鍔"; + try{ + for(String id:ids.split(",")){ + CgreportConfigHeadEntity cgreportConfigHead = systemService.getEntity(CgreportConfigHeadEntity.class, id); + cgreportConfigHeadService.delete(cgreportConfigHead); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + } + }catch(Exception e){ + e.printStackTrace(); + message = "鍔ㄦ佹姤琛ㄩ厤缃姮澶村垹闄ゅけ璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 娣诲姞鍔ㄦ佹姤琛ㄩ厤缃姮澶 + * + * @param ids + * @return + */ + @RequestMapping(params = "doAdd") + @ResponseBody + public AjaxJson doAdd(CgreportConfigHeadEntity cgreportConfigHead,CgreportConfigHeadPage cgreportConfigHeadPage, HttpServletRequest request) { + List cgreportConfigItemList = cgreportConfigHeadPage.getCgreportConfigItemList(); + AjaxJson j = new AjaxJson(); + message = "娣诲姞鎴愬姛"; + try{ + cgreportConfigHeadService.addMain(cgreportConfigHead, cgreportConfigItemList); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "鍔ㄦ佹姤琛ㄩ厤缃姮澶存坊鍔犲け璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + /** + * 鏇存柊鍔ㄦ佹姤琛ㄩ厤缃姮澶 + * + * @param ids + * @return + */ + @RequestMapping(params = "doUpdate") + @ResponseBody + public AjaxJson doUpdate(CgreportConfigHeadEntity cgreportConfigHead,CgreportConfigHeadPage cgreportConfigHeadPage, HttpServletRequest request) { + List cgreportConfigItemList = cgreportConfigHeadPage.getCgreportConfigItemList(); + AjaxJson j = new AjaxJson(); + message = "鏇存柊鎴愬姛"; + try{ + cgreportConfigHeadService.updateMain(cgreportConfigHead, cgreportConfigItemList); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "鏇存柊鍔ㄦ佹姤琛ㄩ厤缃姮澶村け璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鍔ㄦ佹姤琛ㄩ厤缃姮澶存柊澧為〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "goAdd") + public ModelAndView goAdd(CgreportConfigHeadEntity cgreportConfigHead, HttpServletRequest req) { + if (StringUtil.isNotEmpty(cgreportConfigHead.getId())) { + cgreportConfigHead = cgreportConfigHeadService.getEntity(CgreportConfigHeadEntity.class, cgreportConfigHead.getId()); + req.setAttribute("cgreportConfigHeadPage", cgreportConfigHead); + } + return new ModelAndView("jeecg/cgreport/core/cgreportConfigHead-add"); + } + + /** + * 鍔ㄦ佹姤琛ㄩ厤缃姮澶寸紪杈戦〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "goUpdate") + public ModelAndView goUpdate(CgreportConfigHeadEntity cgreportConfigHead, HttpServletRequest req) { + if (StringUtil.isNotEmpty(cgreportConfigHead.getId())) { + cgreportConfigHead = cgreportConfigHeadService.getEntity(CgreportConfigHeadEntity.class, cgreportConfigHead.getId()); + req.setAttribute("cgreportConfigHeadPage", cgreportConfigHead); + } + return new ModelAndView("jeecg/cgreport/core/cgreportConfigHead-update"); + } + + + /** + * 鍔犺浇鏄庣粏鍒楄〃[鍔ㄦ佹姤琛ㄩ厤缃槑缁哴 + * + * @return + */ + @RequestMapping(params = "cgreportConfigItemList") + public ModelAndView cgreportConfigItemList(CgreportConfigHeadEntity cgreportConfigHead, HttpServletRequest req) { + + //=================================================================================== + //鑾峰彇鍙傛暟 + Object id0 = cgreportConfigHead.getId(); + //=================================================================================== + //鏌ヨ-鍔ㄦ佹姤琛ㄩ厤缃槑缁 + String hql0 = "from CgreportConfigItemEntity where 1 = 1 AND cGRHEAD_ID = ? "; + try{ + List cgreportConfigItemEntityList = systemService.findHql(hql0,id0); + req.setAttribute("cgreportConfigItemList", cgreportConfigItemEntityList); + }catch(Exception e){ + logger.info(e.getMessage()); + } + return new ModelAndView("jeecg/cgreport/core/cgreportConfigItemList"); + } + +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/controller/excel/CgExportExcelController.java b/src/main/java/org/jeecgframework/web/cgreport/controller/excel/CgExportExcelController.java new file mode 100644 index 00000000..af948a49 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/controller/excel/CgExportExcelController.java @@ -0,0 +1,116 @@ +package org.jeecgframework.web.cgreport.controller.excel; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.cgreport.common.CgReportConstant; +import org.jeecgframework.web.cgreport.exception.CgReportNotFoundException; +import org.jeecgframework.web.cgreport.service.core.CgReportServiceI; +import org.jeecgframework.web.cgreport.service.excel.CgReportExcelServiceI; +import org.jeecgframework.web.cgreport.util.CgReportQueryParamUtil; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.util.BrowserUtils; +import org.jeecgframework.core.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +/** + * + * @Title:ExportExcelController + * @description:鎶ヨ〃excel瀵煎嚭 + * @author 璧典繆澶 + * @date Aug 1, 2013 10:52:26 AM + * @version V1.0 + */ +@Controller +@RequestMapping("/cgExportExcelController") +public class CgExportExcelController extends BaseController { + @Autowired + private CgReportServiceI cgReportService; + @Autowired + private CgReportExcelServiceI cgReportExcelService; + /** + * 灏嗘姤琛ㄥ鍑轰负excel + * @param request + * @param response + */ + @SuppressWarnings("all") + @RequestMapping(params = "exportXls") + public void exportXls(HttpServletRequest request, + HttpServletResponse response) { + //step.1 璁剧疆锛岃幏鍙栭厤缃俊鎭 + String codedFileName = "鎶ヨ〃"; + String sheetName="瀵煎嚭淇℃伅"; + if (StringUtil.isNotEmpty(request.getParameter("configId"))) { + String configId = request.getParameter("configId"); + Map cgReportMap = null; + try{ + cgReportMap = cgReportService.queryCgReportConfig(configId); + }catch (Exception e) { + throw new CgReportNotFoundException("鍔ㄦ佹姤琛ㄩ厤缃笉瀛樺湪!"); + } + List> fieldList = (List>) cgReportMap.get(CgReportConstant.ITEMS); + Map configM = (Map) cgReportMap.get(CgReportConstant.MAIN); + codedFileName = configM.get("name")+codedFileName; + String querySql = (String) configM.get(CgReportConstant.CONFIG_SQL); + List> items = (List>) cgReportMap.get(CgReportConstant.ITEMS); + Map queryparams = new LinkedHashMap(); + for(Map item:items){ + String isQuery = (String) item.get(CgReportConstant.ITEM_ISQUERY); + if(CgReportConstant.BOOL_TRUE.equalsIgnoreCase(isQuery)){ + //step.2 瑁呰浇鏌ヨ鏉′欢 + CgReportQueryParamUtil.loadQueryParams(request, item, queryparams); + } + } + //step.3 杩涜鏌ヨ杩斿洖缁撴灉 + List> result= cgReportService.queryByCgReportSql(querySql, queryparams, -1, -1); + + response.setContentType("application/vnd.ms-excel"); + OutputStream fOut = null; + try { + + //step.4 鏍规嵁娴忚鍣ㄨ繘琛岃浆鐮侊紝浣垮叾鏀寔涓枃鏂囦欢鍚 + String browse = BrowserUtils.checkBrowse(request); + if ("MSIE".equalsIgnoreCase(browse.substring(0, 4))) { + response.setHeader("content-disposition", + "attachment;filename=" + + java.net.URLEncoder.encode(codedFileName, + "UTF-8") + ".xls"); + } else { + String newtitle = new String(codedFileName.getBytes("UTF-8"), + "ISO8859-1"); + response.setHeader("content-disposition", + "attachment;filename=" + newtitle + ".xls"); + } + //step.5 浜х敓宸ヤ綔绨垮璞 + HSSFWorkbook workbook = null; + workbook = cgReportExcelService.exportExcel(codedFileName, fieldList, result); + fOut = response.getOutputStream(); + workbook.write(fOut); + } catch (UnsupportedEncodingException e1) { + + } catch (Exception e) { + + } finally { + try { + fOut.flush(); + fOut.close(); + } catch (IOException e) { + + } + } + } else { + throw new BusinessException("鍙傛暟閿欒"); + } + } +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/dao/core/CgReportDao.java b/src/main/java/org/jeecgframework/web/cgreport/dao/core/CgReportDao.java new file mode 100644 index 00000000..d6c1a41e --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/dao/core/CgReportDao.java @@ -0,0 +1,23 @@ +package org.jeecgframework.web.cgreport.dao.core; + +import java.util.List; +import java.util.Map; + +import org.jeecgframework.minidao.annotation.Arguments; +import org.jeecgframework.minidao.annotation.MiniDao; +import org.springframework.stereotype.Repository; + +/** + * + * @author zhangdaihao + * + */ +@Repository("cgReportDao") +public interface CgReportDao{ + + @Arguments("configId") + List> queryCgReportItems(String configId); + + @Arguments("id") + Map queryCgReportMainConfig(String id); +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/engine/core/cgreportlist.ftl b/src/main/java/org/jeecgframework/web/cgreport/engine/core/cgreportlist.ftl new file mode 100644 index 00000000..6c6e74cb --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/engine/core/cgreportlist.ftl @@ -0,0 +1,135 @@ +${config_iframe} + +
    +
    +
    + <#list config_queryList as x> + + ${x['field_txt']}锛 + <#if x['search_mode']=="group"> + class="easyui-datebox" /> + ~ + class="easyui-datebox" /> + + <#if x['search_mode']=="single"> + <#if (x['field_dictlist']?size >0)> + + + <#if (x['field_dictlist']?size <= 0)> + class="easyui-datebox" /> + + + + +
    +
    + + 瀵煎嚭excel + + +<#if (config_queryList?size >0)> + + 鏌ヨ + 閲嶇疆 + + +
    +
    diff --git a/src/main/java/org/jeecgframework/web/cgreport/engine/core/cgreportlistpopup.ftl b/src/main/java/org/jeecgframework/web/cgreport/engine/core/cgreportlistpopup.ftl new file mode 100644 index 00000000..8f779129 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/engine/core/cgreportlistpopup.ftl @@ -0,0 +1,92 @@ +${config_iframe} + +
    +
    +
    + <#list config_queryList as x> + + ${x['field_txt']}锛 + <#if x['search_mode']=="group"> + class="easyui-datebox" /> + ~ + class="easyui-datebox" /> + + <#if x['search_mode']=="single"> + <#if (x['field_dictlist']?size >0)> + + + <#if (x['field_dictlist']?size <= 0)> + class="easyui-datebox" /> + + + + +
    +
    +<#if (config_queryList?size >0)> + + 鏌ヨ + 閲嶇疆 + + +
    +
    diff --git a/src/main/java/org/jeecgframework/web/cgreport/entity/core/CgreportConfigHeadEntity.java b/src/main/java/org/jeecgframework/web/cgreport/entity/core/CgreportConfigHeadEntity.java new file mode 100644 index 00000000..71ecfd0b --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/entity/core/CgreportConfigHeadEntity.java @@ -0,0 +1,225 @@ +package org.jeecgframework.web.cgreport.entity.core; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 鍔ㄦ佹姤琛ㄩ厤缃姮澶 + * @author 寮犱唬娴 + * @date 2013-12-07 16:00:21 + * @version V1.0 + * + */ +@Entity +@Table(name = "jform_cgreport_head", schema = "") +@SuppressWarnings("serial") +public class CgreportConfigHeadEntity implements java.io.Serializable { + /**涓婚敭*/ + private java.lang.String id; + /**缂栫爜*/ + private java.lang.String code; + /**鍚嶇О*/ + private java.lang.String name; + /**鏌ヨ鏁版嵁SQL*/ + private java.lang.String cgrSql; + /**鎻忚堪*/ + private java.lang.String content; + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDate; + /**鍒涘缓浜篒D*/ + private java.lang.String createBy; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**淇敼鏃堕棿*/ + private java.util.Date updateDate; + /**淇敼浜*/ + private java.lang.String updateBy; + /**淇敼浜哄悕绉*/ + private java.lang.String updateName; + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=36) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 缂栫爜 + */ + @Column(name ="CODE",nullable=false,length=36) + public java.lang.String getCode(){ + return this.code; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 缂栫爜 + */ + public void setCode(java.lang.String code){ + this.code = code; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍚嶇О + */ + @Column(name ="NAME",nullable=false,length=100) + public java.lang.String getName(){ + return this.name; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍚嶇О + */ + public void setName(java.lang.String name){ + this.name = name; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏌ヨ鏁版嵁SQL + */ + @Column(name ="CGR_SQL",nullable=false,length=2000) + public java.lang.String getCgrSql(){ + return this.cgrSql; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏌ヨ鏁版嵁SQL + */ + public void setCgrSql(java.lang.String cgrSql){ + this.cgrSql = cgrSql; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎻忚堪 + */ + @Column(name ="CONTENT",nullable=false,length=1000) + public java.lang.String getContent(){ + return this.content; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎻忚堪 + */ + public void setContent(java.lang.String content){ + this.content = content; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + @Column(name ="create_date",nullable=true) + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜篒D + */ + @Column(name ="create_by",nullable=true,length=32) + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜篒D + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + @Column(name ="create_name",nullable=true,length=32) + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 淇敼鏃堕棿 + */ + @Column(name ="update_date",nullable=true) + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 淇敼鏃堕棿 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜篒D + */ + @Column(name ="update_by",nullable=true,length=32) + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜篒D + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜哄悕绉 + */ + @Column(name ="update_name",nullable=true,length=32) + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/entity/core/CgreportConfigItemEntity.java b/src/main/java/org/jeecgframework/web/cgreport/entity/core/CgreportConfigItemEntity.java new file mode 100644 index 00000000..6e263cd5 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/entity/core/CgreportConfigItemEntity.java @@ -0,0 +1,248 @@ +package org.jeecgframework.web.cgreport.entity.core; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 鍔ㄦ佹姤琛ㄩ厤缃槑缁 + * @author 寮犱唬娴 + * @date 2013-12-07 16:00:21 + * @version V1.0 + * + */ +@Entity +@Table(name = "jform_cgreport_item", schema = "") +@SuppressWarnings("serial") +public class CgreportConfigItemEntity implements java.io.Serializable { + /**涓婚敭*/ + private java.lang.String id; + /**瀛楁鍚*/ + private java.lang.String fieldName; + /**瀛楁搴忓彿*/ + private java.lang.Integer orderNum; + /**瀛楁鏂囨湰*/ + private java.lang.String fieldTxt; + /**瀛楁绫诲瀷*/ + private java.lang.String fieldType; + //update_begin by:Robin for:TASK #344 鍔ㄦ佹姤琛ㄩ渶瑕佸鍔狅紝瀛楁鏄惁鏄剧ず锛屽瓧娈礹erf + /**瀛楁href*/ + private String fieldHref; + /**鏄惁鏄剧ず*/ + private String isShow; + //update_begin by:Robin for:TASK #344 鍔ㄦ佹姤琛ㄩ渶瑕佸鍔狅紝瀛楁鏄惁鏄剧ず锛屽瓧娈礹erf + /**鏌ヨ妯″紡*/ + private java.lang.String sMode; + /**鍙栧艰〃杈惧紡*/ + private java.lang.String replaceVa; + /**瀛楀吀Code*/ + private java.lang.String dictCode; + /**鏄惁鏌ヨ*/ + private java.lang.String sFlag; + /**澶栭敭*/ + private java.lang.String cgrheadId; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=36) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 瀛楁鍚 + */ + @Column(name ="FIELD_NAME",nullable=true,length=36) + public java.lang.String getFieldName(){ + return this.fieldName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 瀛楁鍚 + */ + public void setFieldName(java.lang.String fieldName){ + this.fieldName = fieldName; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 瀛楁搴忓彿 + */ + @Column(name ="ORDER_NUM",nullable=true,length=10) + public java.lang.Integer getOrderNum(){ + return this.orderNum; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 瀛楁搴忓彿 + */ + public void setOrderNum(java.lang.Integer orderNum){ + this.orderNum = orderNum; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 瀛楁鏂囨湰 + */ + @Column(name ="FIELD_TXT",nullable=true,length=1000) + public java.lang.String getFieldTxt(){ + return this.fieldTxt; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 瀛楁鏂囨湰 + */ + public void setFieldTxt(java.lang.String fieldTxt){ + this.fieldTxt = fieldTxt; + } + + + /** + * @return isShow + */ + @Column(name = "IS_SHOW",nullable=true,length=5) + public String getIsShow() { + return isShow; + } + + /** + * @param isShow 瑕佽缃殑 isShow + */ + public void setIsShow(String isShow) { + this.isShow = isShow; + } + + /** + * @return fieldHref + */ + @Column(name ="FIELD_HREF",nullable=true,length=120) + public String getFieldHref() { + return fieldHref; + } + + /** + * @param fieldHref 瑕佽缃殑 fieldHref + */ + public void setFieldHref(String fieldHref) { + this.fieldHref = fieldHref; + } + + + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 瀛楁绫诲瀷 + */ + @Column(name ="FIELD_TYPE",nullable=true,length=10) + public java.lang.String getFieldType(){ + return this.fieldType; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 瀛楁绫诲瀷 + */ + public void setFieldType(java.lang.String fieldType){ + this.fieldType = fieldType; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏌ヨ妯″紡 + */ + @Column(name ="S_MODE",nullable=true,length=10) + public java.lang.String getSMode(){ + return this.sMode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏌ヨ妯″紡 + */ + public void setSMode(java.lang.String sMode){ + this.sMode = sMode; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍙栧艰〃杈惧紡 + */ + @Column(name ="REPLACE_VA",nullable=true,length=36) + public java.lang.String getReplaceVa(){ + return this.replaceVa; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍙栧艰〃杈惧紡 + */ + public void setReplaceVa(java.lang.String replaceVa){ + this.replaceVa = replaceVa; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 瀛楀吀Code + */ + @Column(name ="DICT_CODE",nullable=true,length=36) + public java.lang.String getDictCode(){ + return this.dictCode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 瀛楀吀Code + */ + public void setDictCode(java.lang.String dictCode){ + this.dictCode = dictCode; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁鏌ヨ + */ + @Column(name ="S_FLAG",nullable=true,length=2) + public java.lang.String getSFlag(){ + return this.sFlag; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄惁鏌ヨ + */ + public void setSFlag(java.lang.String sFlag){ + this.sFlag = sFlag; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 澶栭敭 + */ + @Column(name ="CGRHEAD_ID",nullable=true,length=36) + public java.lang.String getCgrheadId(){ + return this.cgrheadId; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 澶栭敭 + */ + public void setCgrheadId(java.lang.String cgrheadId){ + this.cgrheadId = cgrheadId; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/exception/CgReportNotFoundException.java b/src/main/java/org/jeecgframework/web/cgreport/exception/CgReportNotFoundException.java new file mode 100644 index 00000000..cddcf733 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/exception/CgReportNotFoundException.java @@ -0,0 +1,19 @@ +package org.jeecgframework.web.cgreport.exception; +/** + * + * @Title:CgReportNotFoundException + * @description:鍔ㄦ佹姤琛ㄩ厤缃病鏈夋壘鍒板紓甯 + * @author 璧典繆澶 + * @date Jul 30, 2013 9:56:12 AM + * @version V1.0 + */ +public class CgReportNotFoundException extends RuntimeException { + /** + * + */ + private static final long serialVersionUID = 1L; + + public CgReportNotFoundException(String msg) { + super(msg); + } +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/page/core/CgreportConfigHeadPage.java b/src/main/java/org/jeecgframework/web/cgreport/page/core/CgreportConfigHeadPage.java new file mode 100644 index 00000000..c5fa0e44 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/page/core/CgreportConfigHeadPage.java @@ -0,0 +1,136 @@ +package org.jeecgframework.web.cgreport.page.core; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.ArrayList; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; + +import org.jeecgframework.web.cgreport.entity.core.CgreportConfigItemEntity; + +/** + * @Title: Entity + * @Description: 鍔ㄦ佹姤琛ㄩ厤缃姮澶 + * @author 寮犱唬娴 + * @date 2013-12-07 16:00:21 + * @version V1.0 + * + */ +@Entity +@Table(name = "jform_cgreport_head", schema = "") +@SuppressWarnings("serial") +public class CgreportConfigHeadPage implements java.io.Serializable { + /**淇濆瓨-鍔ㄦ佹姤琛ㄩ厤缃槑缁*/ + private List cgreportConfigItemList = new ArrayList(); + public List getCgreportConfigItemList() { + return cgreportConfigItemList; + } + public void setCgreportConfigItemList(List cgreportConfigItemList) { + this.cgreportConfigItemList = cgreportConfigItemList; + } + + + /**涓婚敭*/ + private java.lang.String id; + /**缂栫爜*/ + private java.lang.String code; + /**鍚嶇О*/ + private java.lang.String name; + /**鏌ヨ鏁版嵁SQL*/ + private java.lang.String cgrSql; + /**鎻忚堪*/ + private java.lang.String content; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=36) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 缂栫爜 + */ + @Column(name ="CODE",nullable=false,length=36) + public java.lang.String getCode(){ + return this.code; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 缂栫爜 + */ + public void setCode(java.lang.String code){ + this.code = code; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍚嶇О + */ + @Column(name ="NAME",nullable=false,length=100) + public java.lang.String getName(){ + return this.name; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍚嶇О + */ + public void setName(java.lang.String name){ + this.name = name; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏌ヨ鏁版嵁SQL + */ + @Column(name ="CGR_SQL",nullable=false,length=2000) + public java.lang.String getCgrSql(){ + return this.cgrSql; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏌ヨ鏁版嵁SQL + */ + public void setCgrSql(java.lang.String cgrSql){ + this.cgrSql = cgrSql; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎻忚堪 + */ + @Column(name ="CONTENT",nullable=false,length=1000) + public java.lang.String getContent(){ + return this.content; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎻忚堪 + */ + public void setContent(java.lang.String content){ + this.content = content; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/service/core/CgReportServiceI.java b/src/main/java/org/jeecgframework/web/cgreport/service/core/CgReportServiceI.java new file mode 100644 index 00000000..1215f4d8 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/service/core/CgReportServiceI.java @@ -0,0 +1,57 @@ +package org.jeecgframework.web.cgreport.service.core; + +import java.util.List; +import java.util.Map; + +import org.jeecgframework.core.common.service.CommonService; + +/** + * + * @Title:CgReportServiceI + * @description:鍔ㄦ佹姤琛ㄦ湇鍔℃帴鍙 + * @author 璧典繆澶 + * @date Jul 30, 2013 8:43:01 AM + * @version V1.0 + */ +public interface CgReportServiceI extends CommonService{ + /** + * 鏍规嵁鎶ヨ〃鐨処D鑾峰緱鎶ヨ〃鐨勬姮澶撮厤缃互鍙婃槑缁嗛厤缃 + * @param reportId + * @return + */ + public Map queryCgReportConfig(String reportId); + /** + * 鏍规嵁鎶ヨ〃id鑾峰緱鎶ヨ〃鎶ご閰嶇疆 + * @param reportId + * @return + */ + public Map queryCgReportMainConfig(String reportId); + /** + * 鏍规嵁鎶ヨ〃id鑾峰緱鎶ヨ〃鏄庣粏閰嶇疆 + * @param reportId + * @return + */ + public List> queryCgReportItems(String reportId); + /** + * 鎵ц鎶ヨ〃SQL鑾峰彇缁撴灉闆 + * @param sql 鎶ヨ〃SQL + * @param params 鏌ヨ鏉′欢 + * @param page 椤甸潰鏁 + * @param rows 瑕佽幏鍙栫殑鏉$洰鎬绘暟 + * @return + */ + public List> queryByCgReportSql(String sql,Map params,int page,int rows); + /** + * 鑾峰彇鎶ヨ〃sql缁撴灉闆嗗ぇ灏 + * @param sql 鎶ヨ〃SQL + * @param params 鏌ヨ鏉′欢 + * @return + */ + public long countQueryByCgReportSql(String sql,Map params); + /** + * 閫氳繃鎵цsql鑾峰緱璇ql璇彞涓殑瀛楁闆嗗悎 + * @param sql 鎶ヨ〃sql + * @return + */ + public List getSqlFields(String sql); +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/service/core/CgreportConfigHeadServiceI.java b/src/main/java/org/jeecgframework/web/cgreport/service/core/CgreportConfigHeadServiceI.java new file mode 100644 index 00000000..031a55b7 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/service/core/CgreportConfigHeadServiceI.java @@ -0,0 +1,44 @@ +package org.jeecgframework.web.cgreport.service.core; + +import java.util.List; +import org.jeecgframework.core.common.service.CommonService; +import org.jeecgframework.web.cgreport.entity.core.CgreportConfigHeadEntity; +import java.io.Serializable; +import org.jeecgframework.web.cgreport.entity.core.CgreportConfigItemEntity; + +public interface CgreportConfigHeadServiceI extends CommonService{ + + public void delete(T entity); + /** + * 娣诲姞涓瀵瑰 + * + */ + public void addMain(CgreportConfigHeadEntity cgreportConfigHead, + List cgreportConfigItemList) ; + /** + * 淇敼涓瀵瑰 + * + */ + public void updateMain(CgreportConfigHeadEntity cgreportConfigHead, + List cgreportConfigItemList); + public void delMain (CgreportConfigHeadEntity cgreportConfigHead); + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(CgreportConfigHeadEntity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(CgreportConfigHeadEntity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(CgreportConfigHeadEntity t); +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/service/excel/CgReportExcelServiceI.java b/src/main/java/org/jeecgframework/web/cgreport/service/excel/CgReportExcelServiceI.java new file mode 100644 index 00000000..3d0e8c46 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/service/excel/CgReportExcelServiceI.java @@ -0,0 +1,25 @@ +package org.jeecgframework.web.cgreport.service.excel; + +import java.util.Collection; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.jeecgframework.core.common.service.CommonService; + +/** + * + * @Title:CgReportExcelServiceI + * @description:鍔ㄦ佹姤琛╡xcel瀵煎嚭 + * @author 璧典繆澶 + * @date Aug 1, 2013 8:53:54 AM + * @version V1.0 + */ +public interface CgReportExcelServiceI extends CommonService{ + /** + * + * @param title 鏍囬 + * @param titleSet 鎶ヨ〃澶 + * @param dataSet 鎶ヨ〃鍐呭 + * @return + */ + public HSSFWorkbook exportExcel(String title, Collection titleSet,Collection dataSet); +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/service/impl/core/CgReportServiceImpl.java b/src/main/java/org/jeecgframework/web/cgreport/service/impl/core/CgReportServiceImpl.java new file mode 100644 index 00000000..ccf257dd --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/service/impl/core/CgReportServiceImpl.java @@ -0,0 +1,122 @@ +package org.jeecgframework.web.cgreport.service.impl.core; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.jeecgframework.web.cgreport.common.CgReportConstant; +import org.jeecgframework.web.cgreport.dao.core.CgReportDao; +import org.jeecgframework.web.cgreport.service.core.CgReportServiceI; + +import org.jeecgframework.core.common.dao.jdbc.JdbcDao; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service(value="cgReportService") +@Transactional +public class CgReportServiceImpl extends CommonServiceImpl implements + CgReportServiceI { + @Autowired + private JdbcDao jdbcDao; + @Autowired + private CgReportDao cgReportDao; + + + public Map queryCgReportConfig(String reportId) { + Map cgReportM = new HashMap(0); + Map mainM = queryCgReportMainConfig(reportId); + List> itemsM = queryCgReportItems(reportId); + cgReportM.put(CgReportConstant.MAIN, mainM); + cgReportM.put(CgReportConstant.ITEMS, itemsM); + return cgReportM; + } + + public Map queryCgReportMainConfig(String reportId){ +// String sql = JeecgSqlUtil.getMethodSql(JeecgSqlUtil.getMethodUrl()); +// Map parameters = new LinkedHashMap(); +// parameters.put("id", reportId); +// Map mainM = jdbcDao.findForMap(sql, parameters); + + //閲囩敤MiniDao瀹炵幇鏂瑰紡 + return cgReportDao.queryCgReportMainConfig(reportId); + } + + public List> queryCgReportItems(String reportId){ +// String sql = JeecgSqlUtil.getMethodSql(JeecgSqlUtil.getMethodUrl()); +// Map parameters = new LinkedHashMap(); +// parameters.put("configId", reportId); +// List> items = jdbcDao.findForListMap(sql, parameters); + + //閲囩敤MiniDao瀹炵幇鏂瑰紡 + return cgReportDao.queryCgReportItems(reportId); + } + @SuppressWarnings("unchecked") + + public List> queryByCgReportSql(String sql, Map params, + int page, int rows) { + String querySql = getFullSql(sql,params); + List> result = null; + if(page==-1 && rows==-1){ + result = jdbcDao.findForJdbc(querySql); + }else{ + result = jdbcDao.findForJdbc(querySql, page, rows); + } + return result; + } + /** + * 鑾峰彇鎷艰鏌ヨ鏉′欢涔嬪悗鐨剆ql + * @param sql + * @param params + * @return + */ + @SuppressWarnings("unchecked") + private String getFullSql(String sql,Map params){ + StringBuilder sqlB = new StringBuilder(); + sqlB.append("SELECT t.* FROM ( "); + sqlB.append(sql+" "); + sqlB.append(") t "); + if (params.size() >= 1) { + sqlB.append("WHERE 1=1 "); + Iterator it = params.keySet().iterator(); + while (it.hasNext()) { + String key = String.valueOf(it.next()); + String value = String.valueOf(params.get(key)); + if (!StringUtil.isEmpty(value) && !"null".equals(value)) { + sqlB.append(" AND "); + sqlB.append(" " + key + value ); + } + } + } + return sqlB.toString(); + } + @SuppressWarnings("unchecked") + + public long countQueryByCgReportSql(String sql, Map params) { + String querySql = getFullSql(sql,params); + querySql = "SELECT COUNT(*) FROM ("+querySql+") t2"; + long result = jdbcDao.findForLong(querySql,new HashMap(0)); + return result; + } + @SuppressWarnings( "unchecked" ) + + public List getSqlFields(String sql) { + if(oConvertUtils.isEmpty(sql)){ + return null; + } + List> result = jdbcDao.findForJdbc(sql, 1, 1); + if(result.size()<1){ + throw new BusinessException("璇ユ姤琛╯ql娌℃湁鏁版嵁"); + } + Set fieldsSet= result.get(0).keySet(); + List fileds = new ArrayList(fieldsSet); + return fileds; + } +} diff --git a/src/main/java/org/jeecgframework/web/cgreport/service/impl/core/CgreportConfigHeadServiceImpl.java b/src/main/java/org/jeecgframework/web/cgreport/service/impl/core/CgreportConfigHeadServiceImpl.java new file mode 100644 index 00000000..2b4d296d --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/service/impl/core/CgreportConfigHeadServiceImpl.java @@ -0,0 +1,144 @@ +package org.jeecgframework.web.cgreport.service.impl.core; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.web.cgreport.service.core.CgreportConfigHeadServiceI; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import java.util.ArrayList; +import java.util.UUID; +import java.io.Serializable; + +import org.jeecgframework.web.cgreport.entity.core.CgreportConfigHeadEntity; +import org.jeecgframework.web.cgreport.entity.core.CgreportConfigItemEntity; +@Service("cgreportConfigHeadService") +@Transactional +public class CgreportConfigHeadServiceImpl extends CommonServiceImpl implements CgreportConfigHeadServiceI { + + public void delete(T entity) { + super.delete(entity); + //鎵ц鍒犻櫎鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doDelSql((CgreportConfigHeadEntity)entity); + } + + public void addMain(CgreportConfigHeadEntity cgreportConfigHead, + List cgreportConfigItemList){ + //淇濆瓨涓讳俊鎭 + this.save(cgreportConfigHead); + + /**淇濆瓨-鍔ㄦ佹姤琛ㄩ厤缃槑缁*/ + for(CgreportConfigItemEntity cgreportConfigItem:cgreportConfigItemList){ + //澶栭敭璁剧疆 + cgreportConfigItem.setCgrheadId(cgreportConfigHead.getId()); + this.save(cgreportConfigItem); + } + //鎵ц鏂板鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doAddSql(cgreportConfigHead); + } + + + public void updateMain(CgreportConfigHeadEntity cgreportConfigHead, + List cgreportConfigItemList) { + //淇濆瓨涓昏〃淇℃伅 + this.saveOrUpdate(cgreportConfigHead); + //=================================================================================== + //鑾峰彇鍙傛暟 + Object id0 = cgreportConfigHead.getId(); + //=================================================================================== + //1.鏌ヨ鍑烘暟鎹簱鐨勬槑缁嗘暟鎹-鍔ㄦ佹姤琛ㄩ厤缃槑缁 + String hql0 = "from CgreportConfigItemEntity where 1 = 1 AND cGRHEAD_ID = ? "; + List cgreportConfigItemOldList = this.findHql(hql0,id0); + //2.绛涢夋洿鏂版槑缁嗘暟鎹-鍔ㄦ佹姤琛ㄩ厤缃槑缁 + for(CgreportConfigItemEntity oldE:cgreportConfigItemOldList){ + boolean isUpdate = false; + for(CgreportConfigItemEntity sendE:cgreportConfigItemList){ + //闇瑕佹洿鏂扮殑鏄庣粏鏁版嵁-鍔ㄦ佹姤琛ㄩ厤缃槑缁 + if(oldE.getId().equals(sendE.getId())){ + try { + MyBeanUtils.copyBeanNotNull2Bean(sendE,oldE); + this.saveOrUpdate(oldE); + } catch (Exception e) { + e.printStackTrace(); + throw new BusinessException(e.getMessage()); + } + isUpdate= true; + break; + } + } + if(!isUpdate){ + //濡傛灉鏁版嵁搴撳瓨鍦ㄧ殑鏄庣粏锛屽墠鍙版病鏈変紶閫掕繃鏉ュ垯鏄垹闄-鍔ㄦ佹姤琛ㄩ厤缃槑缁 + super.delete(oldE); + } + + } + //3.鎸佷箙鍖栨柊澧炵殑鏁版嵁-鍔ㄦ佹姤琛ㄩ厤缃槑缁 + for(CgreportConfigItemEntity cgreportConfigItem:cgreportConfigItemList){ + if(StringUtil.isEmpty(cgreportConfigItem.getId())){ + //澶栭敭璁剧疆 + cgreportConfigItem.setCgrheadId(cgreportConfigHead.getId()); + this.save(cgreportConfigItem); + } + } + //鎵ц鏇存柊鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doUpdateSql(cgreportConfigHead); + } + + + public void delMain(CgreportConfigHeadEntity cgreportConfigHead) { + //鍒犻櫎涓昏〃淇℃伅 + this.delete(cgreportConfigHead); + //=================================================================================== + //鑾峰彇鍙傛暟 + Object id0 = cgreportConfigHead.getId(); + //=================================================================================== + //鍒犻櫎-鍔ㄦ佹姤琛ㄩ厤缃槑缁 + String hql0 = "from CgreportConfigItemEntity where 1 = 1 AND cGRHEAD_ID = ? "; + List cgreportConfigItemOldList = this.findHql(hql0,id0); + this.deleteAllEntitie(cgreportConfigItemOldList); + } + + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(CgreportConfigHeadEntity t){ + return true; + } + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(CgreportConfigHeadEntity t){ + return true; + } + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(CgreportConfigHeadEntity t){ + return true; + } + + /** + * 鏇挎崲sql涓殑鍙橀噺 + * @param sql + * @return + */ + public String replaceVal(String sql,CgreportConfigHeadEntity t){ + sql = sql.replace("#{id}",String.valueOf(t.getId())); + sql = sql.replace("#{code}",String.valueOf(t.getCode())); + sql = sql.replace("#{name}",String.valueOf(t.getName())); + sql = sql.replace("#{cgr_sql}",String.valueOf(t.getCgrSql())); + sql = sql.replace("#{content}",String.valueOf(t.getContent())); + sql = sql.replace("#{UUID}",UUID.randomUUID().toString()); + return sql; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/cgreport/service/impl/excel/CgReportExcelServiceImpl.java b/src/main/java/org/jeecgframework/web/cgreport/service/impl/excel/CgReportExcelServiceImpl.java new file mode 100644 index 00000000..ca3487d6 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/cgreport/service/impl/excel/CgReportExcelServiceImpl.java @@ -0,0 +1,141 @@ +package org.jeecgframework.web.cgreport.service.impl.excel; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.cgreport.service.excel.CgReportExcelServiceI; + +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFRichTextString; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.RichTextString; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +@Service(value="cgReportExcelService") +@Transactional +public class CgReportExcelServiceImpl extends CommonServiceImpl implements + CgReportExcelServiceI { + @SuppressWarnings("unchecked") + + public HSSFWorkbook exportExcel(String title, Collection titleSet, + Collection dataSet) { + // 澹版槑涓涓伐浣滆杽 + HSSFWorkbook workbook = null; + try { + // 棣栧厛妫鏌ユ暟鎹湅鏄惁鏄纭殑 + if (titleSet == null || titleSet.size() == 0) { + throw new Exception("璇诲彇琛ㄥご澶辫触锛"); + } + if (title == null) { + title = ""; + } + // 澹版槑涓涓伐浣滆杽 + workbook = new HSSFWorkbook(); + // 鐢熸垚涓涓〃鏍 + Sheet sheet = workbook.createSheet(title); + int rindex = 0; + int cindex = 0; + // 浜х敓琛ㄦ牸鏍囬琛 + Row row = sheet.createRow(rindex); + row.setHeight((short) 450); + CellStyle titleStyle = getTitleStyle(workbook); +// Iterator itTitle = titleSet.iterator(); + List titleList = (List) titleSet; + Iterator itData = dataSet.iterator(); + //閬嶅巻鏍囬琛 + for(Map titleM : titleList){ + String titleContent = (String) titleM.get("field_txt"); + Cell cell = row.createCell(cindex); + RichTextString text = new HSSFRichTextString(titleContent); + cell.setCellValue(text); + cell.setCellStyle(titleStyle); + cindex++; + } + HSSFCellStyle bodyStyle = getOneStyle(workbook); + //閬嶅巻鍐呭 + while (itData.hasNext()) { + cindex = 0; + rindex++; + row = sheet.createRow(rindex); + Map dataM = (Map) itData.next();//鑾峰彇姣忎竴琛岀殑鍐呭 + for(Map titleM : titleList){ + String field = (String) titleM.get("field_name"); + String content = dataM.get(field)==null?"":dataM.get(field).toString(); + Cell cell = row.createCell(cindex); + RichTextString text = new HSSFRichTextString(content); + cell.setCellStyle(bodyStyle); + cell.setCellValue(text); + cindex++; + } + } + for(int i=0; i courses = this.courseService.getListByCriteriaQuery(cq,false); + + map.put(NormalExcelConstants.FILE_NAME,"鐢ㄦ埛淇℃伅"); + map.put(NormalExcelConstants.CLASS,CourseEntity.class); + map.put(NormalExcelConstants.PARAMS,new ExportParams("璇剧▼鍒楄〃", "瀵煎嚭浜:Jeecg", + "瀵煎嚭淇℃伅")); + map.put(NormalExcelConstants.DATA_LIST,courses); + return NormalExcelConstants.JEECG_EXCEL_VIEW; + + } + /** + * 瀵煎嚭excel 浣挎ā鏉 + * + * @param request + * @param response + */ + @RequestMapping(params = "exportXlsByTest") + public String exportXlsByTest(CourseEntity course,HttpServletRequest request,HttpServletResponse response + , DataGrid dataGrid,ModelMap modelMap) { + Map map = new HashMap(); + map.put("month", 10); + Map temp; + for(int i = 1;i<8;i++){ + temp = new HashMap(); + temp.put("per", i*10); + temp.put("mon", i*1000); + temp.put("summon", i*10000); + map.put("i"+i, temp); + } + modelMap.put(TemplateExcelConstants.FILE_NAME,"宸ヨ祫缁熻淇℃伅"); + modelMap.put(TemplateExcelConstants.PARAMS,new TemplateExportParams("export/template/exportTemp.xls",1)); + modelMap.put(TemplateExcelConstants.MAP_DATA,map); + return TemplateExcelConstants.JEECG_TEMPLATE_EXCEL_VIEW; + } + /** + * 瀵煎嚭excel 浣挎ā鏉 + * + * @param request + * @param response + */ + @RequestMapping(params = "exportXlsByT") + public String exportXlsByT(CourseEntity course,HttpServletRequest request,HttpServletResponse response + , DataGrid dataGrid,ModelMap modelMap) { + CriteriaQuery cq = new CriteriaQuery(CourseEntity.class, dataGrid); + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, course, request.getParameterMap()); + List courses = this.courseService.getListByCriteriaQuery(cq,false); + Map map = new HashMap(); + map.put("year", "2013"); + map.put("sunCourses", courses.size()); + Map obj = new HashMap(); + map.put("obj", obj); + obj.put("name", courses.size()); + modelMap.put(TemplateExcelConstants.FILE_NAME,"璇剧▼淇℃伅"); + modelMap.put(TemplateExcelConstants.PARAMS,new TemplateExportParams("export/template/exportTemp.xls")); + modelMap.put(TemplateExcelConstants.MAP_DATA,map); + modelMap.put(TemplateExcelConstants.CLASS,CourseEntity.class); + modelMap.put(TemplateExcelConstants.LIST_DATA,courses); + return TemplateExcelConstants.JEECG_TEMPLATE_EXCEL_VIEW; + } + /** + * 瀵煎嚭Word 浣挎ā鏉 + * + * @param request + * @param response + */ + @RequestMapping(params = "exportDocByT") + public String exportDocByT(CourseEntity course,HttpServletRequest request,HttpServletResponse response + , DataGrid dataGrid,ModelMap modelMap) { + CriteriaQuery cq = new CriteriaQuery(CourseEntity.class, dataGrid); + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, course, request.getParameterMap()); + List courses = this.courseService.getListByCriteriaQuery(cq,false); + Map map = new HashMap(); + map.put("Q1", "289782002"); + map.put("Q2", "106259349"); + map.put("Q3", "106838471"); + map.put("w1", "175449166"); + map.put("w2", "287090836"); + map.put("Author", "scott"); + map.put("email", "scott@jeecg.org"); + map.put("list", courses); + modelMap.put(TemplateWordConstants.FILE_NAME,"Word娴嬭瘯"); + modelMap.put(TemplateWordConstants.MAP_DATA,map); + modelMap.put(TemplateWordConstants.URL,"export/template/test.docx"); + return TemplateWordConstants.JEECG_TEMPLATE_WORD_VIEW; + } + + @RequestMapping(params = "importExcel", method = RequestMethod.POST) + @ResponseBody + public AjaxJson importExcel(HttpServletRequest request, HttpServletResponse response) { + AjaxJson j = new AjaxJson(); + + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(2); + params.setNeedSave(true); + try { + List listCourses = ExcelImportUtil.importExcel(file.getInputStream(),CourseEntity.class,params); + for (CourseEntity course : listCourses) { + if(course.getName()!=null){ + courseService.saveCourse(course); + } + } + j.setMsg("鏂囦欢瀵煎叆鎴愬姛锛"); + } catch (Exception e) { + j.setMsg("鏂囦欢瀵煎叆澶辫触锛"); + logger.error(ExceptionUtil.getExceptionMessage(e)); + }finally{ + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return j; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/DemoController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/DemoController.java new file mode 100644 index 00000000..9deb7f42 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/DemoController.java @@ -0,0 +1,315 @@ +package org.jeecgframework.web.demo.controller.test; + +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecgframework.web.system.pojo.base.TSDemo; +import org.jeecgframework.web.system.pojo.base.TSFunction; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.ComboTree; +import org.jeecgframework.core.common.model.json.TreeGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.tag.vo.easyui.ComboTreeModel; +import org.jeecgframework.tag.vo.easyui.TreeGridModel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.util.HtmlUtils; + + +/** + * @ClassName: demoController + * @Description: TODO(婕旂ず渚嬪瓙澶勭悊绫) + * @author jeecg + */ +@Scope("prototype") +@Controller +@RequestMapping("/demoController") +public class DemoController extends BaseController { + private static final Logger logger = Logger.getLogger(DemoController.class); + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + /** + * demo娣诲姞椤甸潰璺宠浆 + */ + @RequestMapping(params = "aorudemo") + public ModelAndView aorudemo(TSDemo demo, HttpServletRequest request) { + String type = oConvertUtils.getString(request.getParameter("type")); + if (demo.getId() != null) { + demo = systemService.getEntity(TSDemo.class, demo.getId()); + request.setAttribute("demo", demo); + } + if (type.equals("table")) { + return new ModelAndView("jeecg/demo/base/tabledemo"); + } else if(type.equals("tableupdate")){ + return new ModelAndView("jeecg/demo/base/demoTab"); + }else{ + return new ModelAndView("jeecg/demo/base/demo"); + } + + } + + /** + * 鐖剁骇DEMO涓嬫媺鑿滃崟 + */ + @RequestMapping(params = "pDemoList") + @ResponseBody + public List pDemoList(HttpServletRequest request, ComboTree comboTree) { + CriteriaQuery cq = new CriteriaQuery(TSDemo.class); + if (comboTree.getId() != null) { + cq.eq("TSDemo.id", comboTree.getId()); + } + if (comboTree.getId() == null) { + cq.isNull("TSDemo"); + } + cq.add(); + List demoList = systemService.getListByCriteriaQuery(cq, false); + List comboTrees = new ArrayList(); + ComboTreeModel comboTreeModel = new ComboTreeModel("id", "demotitle", "tsDemos", "demourl"); + comboTrees = systemService.ComboTree(demoList, comboTreeModel, null, false); + return comboTrees; + } + @RequestMapping(params = "demoTurn") + @ResponseBody + public String demoTurn(String id){ + String code = systemService.get(TSDemo.class, id).getDemocode(); + return HtmlUtils.htmlUnescape(code); + } + + /** + * demo椤甸潰璺宠浆 + */ + @RequestMapping(params = "demoIframe") + public ModelAndView demoIframe(HttpServletRequest request) { + CriteriaQuery cq = new CriteriaQuery(TSDemo.class); + cq.isNull("TSDemo.id"); + cq.add(); + List demoList = systemService.getListByCriteriaQuery(cq, false); + request.setAttribute("demoList", demoList); + return new ModelAndView("jeecg/demo/base/demoIframe"); + } + + /** + * demo椤甸潰璺宠浆 + */ + @RequestMapping(params = "demoList") + public ModelAndView demoList(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/base/demoList"); + } + + + /** + * 鏉冮檺鍒楄〃 + */ + @RequestMapping(params = "demoGrid") + @ResponseBody + public List demoGrid(HttpServletRequest request, TreeGrid treegrid) { + CriteriaQuery cq = new CriteriaQuery(TSDemo.class); + if (treegrid.getId() != null) { + cq.eq("TSDemo.id", treegrid.getId()); + } + if (treegrid.getId() == null) { + cq.isNull("TSDemo"); + } + cq.add(); + List demoList = systemService.getListByCriteriaQuery(cq, false); + TreeGridModel treeGridModel = new TreeGridModel(); + treeGridModel.setTextField("demotitle"); + treeGridModel.setParentText("TSDemo_demotitle"); + treeGridModel.setParentId("TSDemo_id"); + treeGridModel.setSrc("demourl"); + treeGridModel.setIdField("id"); + treeGridModel.setChildList("tsDemos"); + List treeGrids = systemService.treegrid(demoList, treeGridModel); + return treeGrids; + } + + /** + * demoCode椤甸潰璺宠浆 + */ + @RequestMapping(params = "demoCode") + public ModelAndView demoCode(TSDemo demo, HttpServletRequest request) { + List list = systemService.getList(TSDemo.class); + demo = list.get(0); + request.setAttribute("demo", demo); + return new ModelAndView("jeecg/demo/base/democode"); + } + + /** + * AJAX 绀轰緥涓嬫媺妗 + * + * @param req + * @return + */ + @RequestMapping(params = "getDemo") + @ResponseBody + public AjaxJson getDemo(HttpServletRequest req) { + AjaxJson j = new AjaxJson(); + String id = StringUtil.getEncodePra(req.getParameter("id")); + String floor = ""; + CriteriaQuery cq = new CriteriaQuery(TSFunction.class); + cq.eq("TSFunction.id", id); + cq.add(); + List functions = systemService.getListByCriteriaQuery(cq, false); + if (functions.size() > 0) { + for (TSFunction function : functions) { + floor += "" + function.getFunctionName() + "  "; + } + } else { + floor += "娌℃湁瀛愰」鐩!"; + } + + j.setMsg(floor); + return j; + } + + + /** + * 涓婁紶TABS璺宠浆 + */ + @RequestMapping(params = "uploadTabs") + public ModelAndView uploadTabs(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/base/upload/uploadTabs"); + } + /** + * 鍥剧墖棰勮TABS璺宠浆 + */ + @RequestMapping(params = "imgViewTabs") + public ModelAndView imgViewTabs(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/base/picview/imgViewTabs"); + } + /** + * 琛ㄥ崟楠岃瘉TABS璺宠浆 + */ + @RequestMapping(params = "formTabs") + public ModelAndView formTabs(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/base/formvalid/formTabs"); + } + /** + * 鍔ㄦ佹ā鏉縏ABS璺宠浆 + */ + @RequestMapping(params = "templeteTabs") + public ModelAndView templeteTabs(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/base/template/templateiframe"); + } + /** + * 涓婁紶婕旂ず + */ + @RequestMapping(params = "autoupload") + public ModelAndView autoupload(HttpServletRequest request) { + String turn=oConvertUtils.getString(request.getParameter("turn")); + return new ModelAndView("jeecg/demo/base/"+turn+""); + } + + /** + *涓嬫媺鑱斿姩璺宠浆 + */ + @RequestMapping(params = "select") + public ModelAndView select(HttpServletRequest request) { + // 鏂伴椈 + CriteriaQuery cq2 = new CriteriaQuery(TSFunction.class); + cq2.eq("functionLevel",Globals.Function_Leave_ONE); + cq2.add(); + List funList = systemService.getListByCriteriaQuery(cq2, true); + request.setAttribute("funList", funList); + return new ModelAndView("jeecg/demo/base/AJAX/select"); + } + /** + *鏁版嵁瀛楀吀涓嬫媺 + */ + @RequestMapping(params = "dictSelect") + public ModelAndView dictSelect(HttpServletRequest request) { + request.setAttribute("process", "default"); + return new ModelAndView("jeecg/demo/base/dict/dictSelect"); + } + /** + * 鍦板浘demo + * @param request + * @return + */ + @RequestMapping(params = "mapDemo") + public ModelAndView mapDemo(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/base/map/mapDemo2"); + } + /** + * 淇濆瓨DEMO缁存姢 + * + * @param jeecgDemo + * @param request + * @return + * @throws Exception + */ + @RequestMapping(params = "saveDemo") + @ResponseBody + public AjaxJson saveDemo(TSDemo demo, HttpServletRequest request) throws Exception{ + AjaxJson j = new AjaxJson(); + if (!StringUtil.isEmpty(demo.getId())) { + message = "Demo缁存姢渚嬪瓙: " + demo.getDemotitle() + "琚洿鏂版垚鍔"; + TSDemo entity = this.systemService.get(TSDemo.class, demo.getId()); + MyBeanUtils.copyBeanNotNull2Bean(demo, entity); + + if (demo.getTSDemo() == null || StringUtil.isEmpty(demo.getTSDemo().getId())) { + entity.setTSDemo(null); + } + this.systemService.saveOrUpdate(entity); + }else { + message = "Demo渚嬪瓙: " + demo.getDemotitle() + "琚坊鍔犳垚鍔"; + if (demo.getTSDemo() == null || StringUtil.isEmpty(demo.getTSDemo().getId())) { + demo.setTSDemo(null); + } + this.systemService.save(demo); + } + j.setMsg(message); + return j; + } + + + /** + * 鍒犻櫎Demo + * + * @return + */ + @RequestMapping(params = "delDemo") + @ResponseBody + public AjaxJson del(TSDemo demo, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + demo = systemService.getEntity(TSDemo.class, demo.getId()); + message = "Demo: " + demo.getDemotitle() + "琚垹闄 鎴愬姛"; + // 鍒犻櫎閮ㄩ棬涔嬪墠鏇存柊涓庝箣鐩稿叧鐨勫疄浣 + //upEntity(demo); + systemService.delete(demo); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/FileUploadController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/FileUploadController.java new file mode 100644 index 00000000..16bfc0a0 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/FileUploadController.java @@ -0,0 +1,134 @@ +package org.jeecgframework.web.demo.controller.test; + +import java.io.File; +import java.io.IOException; +import java.util.Iterator; +import java.util.LinkedList; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.web.demo.entity.test.FileMeta; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +/** + * + * 绫 鍚 绉帮細 FileUploadController 绫 鎻 杩帮細 jQuery File Upload 渚嬪瓙 鍒 寤 浜猴細 yiming.zhang + * 鑱旂郴鏂瑰紡锛 1374250553@qq.com 鍒涘缓鏃堕棿锛 2014-2-19 涓嬪崍11:25:22 + * + * 淇 鏀 浜猴細 Administrator 鎿嶄綔鏃堕棿锛 2014-2-19 涓嬪崍11:25:22 鎿嶄綔鍘熷洜锛 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/fileUploadController") +public class FileUploadController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(FileUploadController.class); + + @Autowired + private SystemService systemService; + private String message; + + + LinkedList files = new LinkedList(); + FileMeta fileMeta = null; + + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + /** + * 鏂规硶鎻忚堪: (杩欓噷鐢ㄤ竴鍙ヨ瘽鎻忚堪杩欎釜鏂规硶鐨勪綔鐢) + * 浣 鑰咃細 yiming.zhang + * 鏃 鏈燂細 2014-2-20-涓嬪崍10:27:45 + * @param request + * @return + * 杩斿洖绫诲瀷锛 ModelAndView + */ + @RequestMapping(params = "fileUploadSample") + public ModelAndView webOfficeSample(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/fileUploadSample"); + } + + @RequestMapping(params = "upload", method = RequestMethod.POST) + @ResponseBody + public LinkedList upload(MultipartHttpServletRequest request, HttpServletResponse response) { + //1. build an iterator + Iterator itr = request.getFileNames(); + MultipartFile mpf = null; + + //2. get each file + while (itr.hasNext()) { + + //2.1 get next MultipartFile + mpf = request.getFile(itr.next()); + System.out.println(mpf.getOriginalFilename() + " uploaded! " + files.size()); + + //2.2 if files > 10 remove the first from the list + if (files.size() >= 10) + files.pop(); + + //2.3 create new fileMeta + fileMeta = new FileMeta(); + fileMeta.setFileName(mpf.getOriginalFilename()); + fileMeta.setFileSize(mpf.getSize() / 1024 + " Kb"); + fileMeta.setFileType(mpf.getContentType()); + + try { + fileMeta.setBytes(mpf.getBytes()); + + + String path ="upload/"; + String realPath = request.getSession().getServletContext().getRealPath("/") + "/" + path ;// 鏂囦欢鐨勭‖鐩樼湡瀹炶矾寰 + String savePath = realPath + mpf.getOriginalFilename();// 鏂囦欢淇濆瓨鍏ㄨ矾寰 + + // copy file to local disk (make sure the path "e.g. D:/temp/files" exists) + FileCopyUtils.copy(mpf.getBytes(),new File(savePath)); + + } catch (IOException e) { + e.printStackTrace(); + } + //2.4 add to files + files.add(fileMeta); + + } + + // result will be like this + // [{"fileName":"app_engine-85x77.png","fileSize":"8 Kb","fileType":"image/png"},...] + return files; + } + + @RequestMapping(params = "view", method = {RequestMethod.GET,RequestMethod.POST}) + public void get(HttpServletResponse response,String index){ + FileMeta getFile = files.get(Integer.parseInt(index)); + try { + response.setContentType(getFile.getFileType()); + response.setHeader("Content-disposition", "attachment; filename=\""+getFile.getFileName()+"\""); + FileCopyUtils.copy(getFile.getBytes(), response.getOutputStream()); + }catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgBlobDataController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgBlobDataController.java new file mode 100644 index 00000000..9917ce28 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgBlobDataController.java @@ -0,0 +1,202 @@ +package org.jeecgframework.web.demo.controller.test; +import java.io.BufferedOutputStream; +import java.io.InputStream; +import java.sql.Blob; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.demo.entity.test.JeecgBlobDataEntity; +import org.jeecgframework.web.demo.service.test.JeecgBlobDataServiceI; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.ExceptionUtil; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: Blob鍨嬫暟鎹搷浣滀緥瀛 + * @author Quainty + * @date 2013-06-07 14:46:08 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/jeecgBlobDataController") +public class JeecgBlobDataController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(JeecgBlobDataController.class); + + @Autowired + private JeecgBlobDataServiceI jeecgBlobDataService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * Blob鍨嬫暟鎹搷浣滀緥瀛愬垪琛 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "jeecgBlobData") + public ModelAndView jeecgBlobData(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/jeecgBlobDataList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(JeecgBlobDataEntity jeecgBlobData,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(JeecgBlobDataEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, jeecgBlobData); + this.jeecgBlobDataService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎Blob鍨嬫暟鎹搷浣滀緥瀛 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(JeecgBlobDataEntity jeecgBlobData, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + jeecgBlobData = systemService.getEntity(JeecgBlobDataEntity.class, jeecgBlobData.getId()); + message = "鍒犻櫎鎴愬姛"; + jeecgBlobDataService.delete(jeecgBlobData); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + @RequestMapping(params = "download") + public void exportXls(HttpServletRequest request, String fileId, HttpServletResponse response) { + // 浠庢暟鎹簱鍙栧緱鏁版嵁 + JeecgBlobDataEntity obj = systemService.getEntity(JeecgBlobDataEntity.class, fileId); + try { + Blob attachment = obj.getAttachmentcontent(); + response.setContentType("application/x-msdownload;"); + response.setHeader("Content-disposition", "attachment; filename=" + + new String((obj.getAttachmenttitle()+"."+obj.getExtend()).getBytes("GBK"), "ISO8859-1")); + //浠庢暟鎹簱涓鍙栧嚭鏉 , 杈撳嚭缁欎笅杞界敤 + InputStream bis = attachment.getBinaryStream(); + BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[2048]; + int bytesRead; + long lTotalLen = 0; + while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { + bos.write(buff, 0, bytesRead); + lTotalLen += bytesRead; + } + response.setHeader("Content-Length", String.valueOf(lTotalLen)); + bos.flush(); + bos.close(); + } catch (Exception e){ + e.printStackTrace(); + } + } + @RequestMapping(params = "upload") + @ResponseBody + public AjaxJson upload(HttpServletRequest request, String documentTitle, HttpServletResponse response) { + AjaxJson j = new AjaxJson(); + + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 + try { + jeecgBlobDataService.saveObj(documentTitle, file); + j.setMsg("鏂囦欢瀵煎叆鎴愬姛锛"); + } catch (Exception e) { + j.setMsg("鏂囦欢瀵煎叆澶辫触锛"); + logger.error(ExceptionUtil.getExceptionMessage(e)); + } + //break; // 涓嶆敮鎸佸涓枃浠跺鍏ワ紵 + } + + return j; + } + + + /** + * 娣诲姞Blob鍨嬫暟鎹搷浣滀緥瀛 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(JeecgBlobDataEntity jeecgBlobData, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(jeecgBlobData.getId())) { + message = "鏇存柊鎴愬姛"; + JeecgBlobDataEntity t = jeecgBlobDataService.get(JeecgBlobDataEntity.class, jeecgBlobData.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(jeecgBlobData, t); + jeecgBlobDataService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + message = "娣诲姞鎴愬姛"; + jeecgBlobDataService.save(jeecgBlobData); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + + return j; + } + + /** + * Blob鍨嬫暟鎹搷浣滀緥瀛愬垪琛ㄩ〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(JeecgBlobDataEntity jeecgBlobData, HttpServletRequest req) { + if (StringUtil.isNotEmpty(jeecgBlobData.getId())) { + jeecgBlobData = jeecgBlobDataService.getEntity(JeecgBlobDataEntity.class, jeecgBlobData.getId()); + req.setAttribute("jeecgBlobDataPage", jeecgBlobData); + } + return new ModelAndView("jeecg/demo/test/jeecgBlobData"); + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgDemoCkfinderController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgDemoCkfinderController.java new file mode 100644 index 00000000..b70e3ac0 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgDemoCkfinderController.java @@ -0,0 +1,171 @@ +package org.jeecgframework.web.demo.controller.test; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.util.MyBeanUtils; + +import org.jeecgframework.web.demo.entity.test.JeecgDemoCkfinderEntity; +import org.jeecgframework.web.demo.service.test.JeecgDemoCkfinderServiceI; + +/** + * @Title: Controller + * @Description: ckeditor+ckfinder渚嬪瓙 + * @author Alexander + * @date 2013-09-19 18:29:20 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/jeecgDemoCkfinderController") +public class JeecgDemoCkfinderController extends BaseController { + + @Autowired + private JeecgDemoCkfinderServiceI jeecgDemoCkfinderService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + /** + * ckeditor+ckfinder渚嬪瓙鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "jeecgDemoCkfinder") + public ModelAndView jeecgDemoCkfinder(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/jeecgDemoCkfinderList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(JeecgDemoCkfinderEntity jeecgDemoCkfinder, + HttpServletRequest request, HttpServletResponse response, + DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(JeecgDemoCkfinderEntity.class, + dataGrid); + // 鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, + jeecgDemoCkfinder, request.getParameterMap()); + this.jeecgDemoCkfinderService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎ckeditor+ckfinder渚嬪瓙 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(JeecgDemoCkfinderEntity jeecgDemoCkfinder, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + jeecgDemoCkfinder = systemService.getEntity( + JeecgDemoCkfinderEntity.class, jeecgDemoCkfinder.getId()); + message = "ckeditor+ckfinder渚嬪瓙鍒犻櫎鎴愬姛"; + jeecgDemoCkfinderService.delete(jeecgDemoCkfinder); + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + /** + * 娣诲姞ckeditor+ckfinder渚嬪瓙 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(JeecgDemoCkfinderEntity jeecgDemoCkfinder, + HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(jeecgDemoCkfinder.getId())) { + message = "ckeditor+ckfinder渚嬪瓙鏇存柊鎴愬姛"; + JeecgDemoCkfinderEntity t = jeecgDemoCkfinderService.get( + JeecgDemoCkfinderEntity.class, jeecgDemoCkfinder.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(jeecgDemoCkfinder, t); + jeecgDemoCkfinderService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, + Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + message = "ckeditor+ckfinder渚嬪瓙鏇存柊澶辫触"; + } + } else { + message = "ckeditor+ckfinder渚嬪瓙娣诲姞鎴愬姛"; + jeecgDemoCkfinderService.save(jeecgDemoCkfinder); + systemService.addLog(message, Globals.Log_Type_INSERT, + Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + + /** + * ckeditor+ckfinder渚嬪瓙鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(JeecgDemoCkfinderEntity jeecgDemoCkfinder, + HttpServletRequest req) { + if (StringUtil.isNotEmpty(jeecgDemoCkfinder.getId())) { + jeecgDemoCkfinder = jeecgDemoCkfinderService.getEntity( + JeecgDemoCkfinderEntity.class, jeecgDemoCkfinder.getId()); + req.setAttribute("jeecgDemoCkfinderPage", jeecgDemoCkfinder); + } + return new ModelAndView("jeecg/demo/test/jeecgDemoCkfinder"); + } + + /** + * ckeditor+ckfinder渚嬪瓙棰勮 + * + * @return + */ + @RequestMapping(params = "preview") + public ModelAndView preview(JeecgDemoCkfinderEntity jeecgDemoCkfinder, + HttpServletRequest req) { + if (StringUtil.isNotEmpty(jeecgDemoCkfinder.getId())) { + jeecgDemoCkfinder = jeecgDemoCkfinderService.getEntity( + JeecgDemoCkfinderEntity.class, jeecgDemoCkfinder.getId()); + req.setAttribute("ckfinderPreview", jeecgDemoCkfinder); + } + return new ModelAndView("jeecg/demo/test/jeecgDemoCkfinderPreview"); + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgDemoController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgDemoController.java new file mode 100644 index 00000000..6a59248e --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgDemoController.java @@ -0,0 +1,399 @@ +package org.jeecgframework.web.demo.controller.test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.demo.entity.test.CKEditorEntity; +import org.jeecgframework.web.demo.entity.test.JeecgDemo; +import org.jeecgframework.web.demo.service.test.JeecgDemoServiceI; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.annotation.config.AutoMenu; +import org.jeecgframework.core.annotation.config.AutoMenuOperation; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: 鍗曡〃妯″瀷锛圖EMO锛 + * @author 寮犱唬娴 + * @date 2013-01-23 17:12:40 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/jeecgDemoController") +@AutoMenu(name = "甯哥敤Demo", url = "jeecgDemoController.do?jeecgDemo") +public class JeecgDemoController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(JeecgDemoController.class); + + @Autowired + private JeecgDemoServiceI jeecgDemoService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + /** + * popup 渚嬪瓙 + * @param request + * @return + */ + @RequestMapping(params = "popup") + public ModelAndView popup(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/jeecgDemo/popup"); + } + /** + * popup 渚嬪瓙 + * @param request + * @return + */ + @RequestMapping(params = "selectUserList") + public ModelAndView selectUserList(HttpServletRequest request) { + String departsReplace = ""; + List departList = systemService.getList(TSDepart.class); + for (TSDepart depart : departList) { + if (departsReplace.length() > 0) { + departsReplace += ","; + } + departsReplace += depart.getDepartname() + "_" + depart.getId(); + } + request.setAttribute("departsReplace", departsReplace); + return new ModelAndView("jeecg/demo/jeecgDemo/selectUserList"); + } + + /** + * ckeditor 渚嬪瓙 + * + * @return + */ + @RequestMapping(params = "ckeditor") + public ModelAndView ckeditor(HttpServletRequest request) { +// CKEditorEntity t = jeecgDemoService.get(CKEditorEntity.class, "1"); + CKEditorEntity t = jeecgDemoService.loadAll(CKEditorEntity.class).get(0); + request.setAttribute("cKEditorEntity", t); + if(t.getContents() == null ){ + request.setAttribute("contents", ""); + }else { + request.setAttribute("contents", new String (t.getContents())); + } + return new ModelAndView("jeecg/demo/jeecgDemo/ckeditor"); + } + /** + * ckeditor saveCkeditor + * + * @return + */ + @RequestMapping(params = "saveCkeditor") + @ResponseBody + public AjaxJson saveCkeditor(HttpServletRequest request,CKEditorEntity cKEditor , String contents) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(cKEditor.getId())) { + CKEditorEntity t =jeecgDemoService.get(CKEditorEntity.class, cKEditor.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(cKEditor, t); + t.setContents(contents.getBytes()); + jeecgDemoService.saveOrUpdate(t); + j.setMsg("鏇存柊鎴愬姛"); + } catch (Exception e) { + e.printStackTrace(); + j.setMsg("鏇存柊澶辫触"); + } + } else { + cKEditor.setContents(contents.getBytes()); + jeecgDemoService.save(cKEditor); + } + return j; + } + + /** + * JeecgDemo 鎵撳嵃棰勮璺宠浆 + * @param jeecgDemo + * @param req + * @return + */ + @RequestMapping(params = "print") + public ModelAndView print(JeecgDemo jeecgDemo, HttpServletRequest req) { + // 鑾峰彇閮ㄩ棬淇℃伅 + List departList = systemService.getList(TSDepart.class); + req.setAttribute("departList", departList); + + if (StringUtil.isNotEmpty(jeecgDemo.getId())) { + jeecgDemo = jeecgDemoService.getEntity(JeecgDemo.class, jeecgDemo + .getId()); + req.setAttribute("jgDemo", jeecgDemo); + if ("0".equals(jeecgDemo.getSex())) + req.setAttribute("sex", "鐢"); + if ("1".equals(jeecgDemo.getSex())) + req.setAttribute("sex", "濂"); + } + return new ModelAndView("jeecg/demo/jeecgDemo/jeecgDemoPrint"); + } + + /** + * JeecgDemo渚嬪瓙鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "jeecgDemo") + public ModelAndView jeecgDemo(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/jeecgDemo/jeecgDemoList"); + } + /** + * JeecgDemo渚嬪瓙鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "jeecgDemo2") + public ModelAndView jeecgDemo2(HttpServletRequest request) { + //request.setAttribute("sex", "1"); + request.setAttribute("status", "1"); + return new ModelAndView("jeecg/demo/jeecgDemo/jeecgDemoList2"); + } + /** + * easyuiAJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(JeecgDemo jeecgDemo,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(JeecgDemo.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, jeecgDemo,request.getParameterMap()); + this.jeecgDemoService.getDataGridReturn(cq, true); + String total_salary = String.valueOf(jeecgDemoService.findOneForJdbc("select sum(salary) as ssum from jeecg_demo").get("ssum")); + /* + * 璇存槑锛氭牸寮忎负 瀛楁鍚:鍊(鍙夛紝涓嶅啓璇ュ兼椂涓哄垎椤垫暟鎹殑鍚堣) 澶氫釜鍚堣 浠 , 鍒嗗壊 + */ + dataGrid.setFooter("salary:"+(total_salary.equalsIgnoreCase("null")?"0.0":total_salary)+",age,email:鍚堣"); + TagUtil.datagrid(response, dataGrid); + } + + @RequestMapping(params = "datagrid2") + public void datagrid2(JeecgDemo jeecgDemo,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(JeecgDemo.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, jeecgDemo,request.getParameterMap()); + this.jeecgDemoService.getDataGridReturn(cq, true); + //String total_salary = String.valueOf(jeecgDemoService.findOneForJdbc("select sum(salary) as ssum from jeecg_demo").get("ssum")); + //request.setAttribute("maptest", "1"); + /* + * 璇存槑锛氭牸寮忎负 瀛楁鍚:鍊(鍙夛紝涓嶅啓璇ュ兼椂涓哄垎椤垫暟鎹殑鍚堣) 澶氫釜鍚堣 浠 , 鍒嗗壊 + */ + //dataGrid.setFooter("salary:"+(total_salary.equalsIgnoreCase("null")?"0.0":total_salary)+",age,email:鍚堣"); + + TagUtil.datagrid(response, dataGrid); + } + /** + * 鏉冮檺鍒楄〃 + */ + @RequestMapping(params = "combox") + @ResponseBody + public List combox(HttpServletRequest request, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(JeecgDemo.class); + List ls = this.jeecgDemoService.getListByCriteriaQuery(cq, false); + return ls; + } + /** + * 鍒犻櫎JeecgDemo渚嬪瓙 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(JeecgDemo jeecgDemo, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + jeecgDemo = systemService.getEntity(JeecgDemo.class, jeecgDemo.getId()); + message = "JeecgDemo渚嬪瓙: " + jeecgDemo.getUserName() + "琚垹闄 鎴愬姛"; + jeecgDemoService.delete(jeecgDemo); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞JeecgDemo渚嬪瓙 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + @AutoMenuOperation(name="娣诲姞",code = "add") + public AjaxJson save(JeecgDemo jeecgDemo, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(jeecgDemo.getId())) { + message = "JeecgDemo渚嬪瓙: " + jeecgDemo.getUserName() + "琚洿鏂版垚鍔"; + JeecgDemo t =jeecgDemoService.get(JeecgDemo.class, jeecgDemo.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(jeecgDemo, t); + jeecgDemoService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + message = "JeecgDemo渚嬪瓙: " + jeecgDemo.getUserName() + "琚坊鍔犳垚鍔"; + jeecgDemo.setStatus("0"); + jeecgDemoService.save(jeecgDemo); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + + return j; + } + + + /** + * 瀹℃牳鎶ラ敊 + * + * @param ids + * @return + */ + @RequestMapping(params = "saveAuthor") + @ResponseBody + public AjaxJson saveAuthor(JeecgDemo jeecgDemo, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(jeecgDemo.getId())) { + message = "娴嬭瘯-鐢ㄦ埛鐢宠鎴愬姛"; + JeecgDemo t =jeecgDemoService.get(JeecgDemo.class, jeecgDemo.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(jeecgDemo, t); + t.setStatus("1"); + jeecgDemoService.saveOrUpdate(t); + j.setMsg(message); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } + return j; + } + + /** + * JeecgDemo渚嬪瓙鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(JeecgDemo jeecgDemo, HttpServletRequest req) { + //鑾峰彇閮ㄩ棬淇℃伅 + List departList = systemService.getList(TSDepart.class); + req.setAttribute("departList", departList); + + Map sexMap = new HashMap(); + sexMap.put(0, "鐢"); + sexMap.put(1, "濂"); + req.setAttribute("sexMap", sexMap); + + if (StringUtil.isNotEmpty(jeecgDemo.getId())) { + jeecgDemo = jeecgDemoService.getEntity(JeecgDemo.class, jeecgDemo.getId()); + req.setAttribute("jgDemo", jeecgDemo); + } + return new ModelAndView("jeecg/demo/jeecgDemo/jeecgDemo"); + } + + /** + * JeecgDemo渚嬪瓙鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdatemobile") + public ModelAndView addorupdatemobile(JeecgDemo jeecgDemo, HttpServletRequest req) { + //鑾峰彇閮ㄩ棬淇℃伅 + List departList = systemService.getList(TSDepart.class); + req.setAttribute("departList", departList); + + Map sexMap = new HashMap(); + sexMap.put(0, "鐢"); + sexMap.put(1, "濂"); + req.setAttribute("sexMap", sexMap); + + if (StringUtil.isNotEmpty(jeecgDemo.getId())) { + jeecgDemo = jeecgDemoService.getEntity(JeecgDemo.class, jeecgDemo.getId()); + req.setAttribute("jgDemo", jeecgDemo); + } + return new ModelAndView("jeecg/demo/jeecgDemo/jeecgDemomobile"); + } + + /** + * 璁剧疆绛惧悕璺宠浆椤甸潰 + * + * @param request + * @return + */ + @RequestMapping(params = "doCheck") + public ModelAndView doCheck(HttpServletRequest request) { + String id = request.getParameter("id"); + request.setAttribute("id", id); + if (StringUtil.isNotEmpty(id)) { + JeecgDemo jeecgDemo = jeecgDemoService.getEntity(JeecgDemo.class,id); + request.setAttribute("jeecgDemo", jeecgDemo); + } + return new ModelAndView("jeecg/demo/jeecgDemo/jeecgDemo-check"); + } + + /** + * 鍏ㄩ夊垹闄emo瀹炰緥绠$悊 + * + * @return + * @author tanghan + * @date 2013-07-13 14:53:00 + */ + @RequestMapping(params = "doDeleteALLSelect") + @ResponseBody + public AjaxJson doDeleteALLSelect(JeecgDemo jeecgDemo, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + String ids = request.getParameter("ids"); + String[] entitys = ids.split(","); + List list = new ArrayList(); + for(int i=0;i0){ + sql += " where id in ('"+ids.replaceAll(",", "','")+"')"; + } + List list = jdbcDao.find(sql, JeecgDemo.class, null); + //jdbcDao.executeSql("delete from jeecg_demo", null); + dbTable.setTableData(list); + xStream.processAnnotations(DBTable.class); + FileOutputStream outputStream = new FileOutputStream(savePath); + Writer writer = new OutputStreamWriter(outputStream, "UTF-8"); + writer.write("\r\n"); + xStream.toXML(dbTable, writer); + logger.debug("create doMigrateOut file: " + savePath); + String ls_filename = MigrateForm.zip(null, "", savePath); // 鍘嬬缉鏂囦欢 + // 鏂囦欢涓嬭浇 + file = new File(ls_filename); + String filename = file.getName(); + InputStream fis = new BufferedInputStream(new FileInputStream(ls_filename)); + // 杈撳嚭鐢熸垚鐨剒ip鏂囦欢 + // 娓呯┖response + response.reset(); + // 璁剧疆response鐨凥eader + response.setContentType("text/html;charset=utf-8"); + request.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Length", "" + file.length()); + OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename=" + + new String(filename.getBytes("utf-8"), "ISO8859-1")); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) { + toClient.write(buffer, 0, bytesRead); + } + toClient.write(buffer); + toClient.flush(); + toClient.close(); + fis.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 瀵煎叆鏂囦欢璺宠浆 + * @return + */ + @RequestMapping(params = "toMigrate") + public ModelAndView toCgformMigrate(HttpServletRequest req) { + return new ModelAndView("jeecg/demo/jeecgDemo/cgformMigrateInclude"); + } + + /** + * 瀵煎嚭鏁版嵁涓簒ml + * @param request + * @param response + */ + @ResponseBody + @RequestMapping(params = "doMigrateIn") + public AjaxJson doMigrateIn(HttpServletRequest request,HttpServletResponse response){ + AjaxJson j = new AjaxJson(); + String ls_file = ""; + UploadFile uploadFile = new UploadFile(request, ls_file); + uploadFile.setCusPath(""); + uploadFile.setSwfpath(""); + String uploadbasepath = uploadFile.getBasePath();// 鏂囦欢涓婁紶鏍圭洰褰 + if (uploadbasepath == null) { + uploadbasepath = ResourceUtil.getConfigByName("uploadpath"); + } + String path = uploadbasepath + "\\";// 鏂囦欢淇濆瓨鍦ㄧ‖鐩樼殑鐩稿璺緞 + String realPath = uploadFile.getMultipartRequest().getSession() + .getServletContext().getRealPath("\\") + + path;// 鏂囦欢鐨勭‖鐩樼湡瀹炶矾寰 + message = null; + try { + File file = new File(realPath); + if (!file.exists()) { + file.mkdir();// 鑻ョ洰褰曚笉瀛樺湪锛屽垱寤烘牴鐩綍 + } + uploadFile.getMultipartRequest().setCharacterEncoding("UTF-8"); + MultipartHttpServletRequest multipartRequest = uploadFile + .getMultipartRequest(); + Map fileMap = multipartRequest.getFileMap(); + String fileName = ""; + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile mf = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 + fileName = mf.getOriginalFilename();// 鑾峰彇鏂囦欢鍚 + String savePath = realPath + fileName; + File savefile = new File(savePath); + String ls_tmp = savefile.getName(); + FileCopyUtils.copy(mf.getBytes(), savefile); + MigrateForm.unzip(savePath, ""); + String sqlFileDir = realPath + ls_tmp.substring(0, ls_tmp.lastIndexOf(".")); + File sqlDirFile = new File(sqlFileDir); + String sqlfilename = sqlDirFile.getPath() + "/"; + if(sqlDirFile.isDirectory()){ + sqlfilename += sqlDirFile.list()[0]; + } + XStream xStream = new XStream(); + xStream.processAnnotations(DBTable.class); + DBTable dbTable = (DBTable) xStream.fromXML(new File(sqlfilename)); + if(dbTable.getClass1() != null ){ + //List list = dbTable.getTableData(); + commonService.batchSave(dbTable.getTableData()); + /*org.jeecgframework.core.util.LogUtil.info(list.size()); + for (Object object : list) { + commonService.save(object); + }*/ + } + } + } catch (Exception e1) { + LogUtil.error(e1.toString()); + message = e1.toString(); + } + if (StringUtil.isNotEmpty(message)) + j.setMsg("SQL鏂囦欢瀵煎叆澶辫触," + message); + else + j.setMsg("SQL鏂囦欢瀵煎叆鎴愬姛"); + + return j; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgEasyUIController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgEasyUIController.java new file mode 100644 index 00000000..91c3d42a --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgEasyUIController.java @@ -0,0 +1,182 @@ +package org.jeecgframework.web.demo.controller.test; + + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.demo.entity.test.JeecgJdbcEntity; +import org.jeecgframework.web.demo.service.test.JeecgJdbcServiceI; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.service.SystemService; +import net.sf.json.JSONObject; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: 椤甸潰涓嶇敤鑷畾涔夋爣绛 + *@author 寮犱唬娴 + */ +@Scope("prototype") +@Controller +@RequestMapping("/jeecgEasyUIController") +public class JeecgEasyUIController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(JeecgEasyUIController.class); + + @Autowired + private JeecgJdbcServiceI jeecgJdbcService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + /** + * 椤甸潰涓嶇敤鑷畾涔夋爣绛 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "jeecgEasyUI") + public ModelAndView jeecgEasyUI(HttpServletRequest request) { + String departsReplace = ""; + List departList = systemService.getList(TSDepart.class); + for (TSDepart depart : departList) { + if (departsReplace.length() > 0) { + departsReplace += ","; + } + departsReplace += depart.getDepartname() + "_" + depart.getId(); + } + request.setAttribute("departsReplace", departsReplace); + return new ModelAndView("jeecg/demo/notag/jeecgEasyUIList"); + + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(JeecgJdbcEntity jeecgJdbc,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + // 鏂瑰紡1, 鐢ㄥ簳灞傝嚜甯︾殑鏂瑰紡寰瀵硅薄涓鍊 ------------------- + /* + this.jeecgJdbcService.getDatagrid1(jeecgJdbc, dataGrid); + TagUtil.datagrid(response, dataGrid); + // end of 鏂瑰紡1 ========================================= */ + /* + this.jeecgJdbcService.getDatagrid2(jeecgJdbc, dataGrid); + TagUtil.datagrid(response, dataGrid); + // end of 鏂瑰紡2 ========================================= */ + //* + JSONObject jObject = this.jeecgJdbcService.getDatagrid3(jeecgJdbc, dataGrid); + responseDatagrid(response, jObject); + // end of 鏂瑰紡3 ========================================= */ + } + + /** + * 鍒犻櫎閫氳繃JDBC璁块棶鏁版嵁搴 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(JeecgJdbcEntity jeecgJdbc, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + + String sql = "delete from jeecg_demo where id='" + jeecgJdbc.getId() + "'"; + jeecgJdbcService.executeSql(sql); + + message = "鍒犻櫎鎴愬姛"; + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞閫氳繃JDBC璁块棶鏁版嵁搴 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(JeecgJdbcEntity jeecgJdbc, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(jeecgJdbc.getId())) { + message = "鏇存柊鎴愬姛"; + JeecgJdbcEntity t = jeecgJdbcService.get(JeecgJdbcEntity.class, jeecgJdbc.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(jeecgJdbc, t); + jeecgJdbcService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + message = "娣诲姞鎴愬姛"; + jeecgJdbcService.save(jeecgJdbc); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + + return j; + } + + /** + * 閫氳繃JDBC璁块棶鏁版嵁搴撳垪琛ㄩ〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(JeecgJdbcEntity jeecgJdbc, HttpServletRequest req) { + if (StringUtil.isNotEmpty(jeecgJdbc.getId())) { + jeecgJdbc = jeecgJdbcService.getEntity(JeecgJdbcEntity.class, jeecgJdbc.getId()); + req.setAttribute("jeecgJdbcPage", jeecgJdbc); + } + List departList = systemService.getList(TSDepart.class); + req.setAttribute("departList", departList); + return new ModelAndView("jeecg/demo/notag/jeecgEasyUI"); + } + // 浠ヤ笅鍚勫嚱鏁板彲浠ユ彁鎴愬叡鐢ㄩ儴浠 (Add by Quainty) + public void responseDatagrid(HttpServletResponse response, JSONObject jObject) { + response.setContentType("application/json"); + response.setHeader("Cache-Control", "no-store"); + try { + PrintWriter pw=response.getWriter(); + pw.write(jObject.toString()); + pw.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgJdbcController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgJdbcController.java new file mode 100644 index 00000000..3f625d92 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgJdbcController.java @@ -0,0 +1,187 @@ +package org.jeecgframework.web.demo.controller.test; +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.demo.entity.test.JeecgJdbcEntity; +import org.jeecgframework.web.demo.service.test.JeecgJdbcServiceI; +import org.jeecgframework.web.system.service.SystemService; +import net.sf.json.JSONObject; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: 閫氳繃JDBC璁块棶鏁版嵁搴 + * @author Quainty + * @date 2013-05-20 13:18:38 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/jeecgJdbcController") +public class JeecgJdbcController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(JeecgJdbcController.class); + + @Autowired + private JeecgJdbcServiceI jeecgJdbcService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 閫氳繃JDBC璁块棶鏁版嵁搴撳垪琛 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "jeecgJdbc") + public ModelAndView jeecgJdbc(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/jeecgJdbcList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(JeecgJdbcEntity jeecgJdbc,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + // 鏂瑰紡1, 鐢ㄥ簳灞傝嚜甯︾殑鏂瑰紡寰瀵硅薄涓鍊 ------------------- + /* + this.jeecgJdbcService.getDatagrid1(jeecgJdbc, dataGrid); + TagUtil.datagrid(response, dataGrid); + // end of 鏂瑰紡1 ========================================= */ + /* + this.jeecgJdbcService.getDatagrid2(jeecgJdbc, dataGrid); + TagUtil.datagrid(response, dataGrid); + // end of 鏂瑰紡2 ========================================= */ + //* + JSONObject jObject = this.jeecgJdbcService.getDatagrid3(jeecgJdbc, dataGrid); + responseDatagrid(response, jObject); + // end of 鏂瑰紡3 ========================================= */ + } + + /** + * 鍒犻櫎閫氳繃JDBC璁块棶鏁版嵁搴 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(JeecgJdbcEntity jeecgJdbc, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + + String sql = "delete from jeecg_demo where id='" + jeecgJdbc.getId() + "'"; + jeecgJdbcService.executeSql(sql); + + message = "鍒犻櫎鎴愬姛"; + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞閫氳繃JDBC璁块棶鏁版嵁搴 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(JeecgJdbcEntity jeecgJdbc, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(jeecgJdbc.getId())) { + message = "鏇存柊鎴愬姛"; + JeecgJdbcEntity t = jeecgJdbcService.get(JeecgJdbcEntity.class, jeecgJdbc.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(jeecgJdbc, t); + jeecgJdbcService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + message = "娣诲姞鎴愬姛"; + jeecgJdbcService.save(jeecgJdbc); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + + return j; + } + + /** + * 閫氳繃JDBC璁块棶鏁版嵁搴撳垪琛ㄩ〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(JeecgJdbcEntity jeecgJdbc, HttpServletRequest req) { + if (StringUtil.isNotEmpty(jeecgJdbc.getId())) { + jeecgJdbc = jeecgJdbcService.getEntity(JeecgJdbcEntity.class, jeecgJdbc.getId()); + req.setAttribute("jeecgJdbcPage", jeecgJdbc); + } + return new ModelAndView("jeecg/demo/test/jeecgJdbc"); + } + // 浠ヤ笅鍚勫嚱鏁板彲浠ユ彁鎴愬叡鐢ㄩ儴浠 (Add by Quainty) + public void responseDatagrid(HttpServletResponse response, JSONObject jObject) { + response.setContentType("application/json"); + response.setHeader("Cache-Control", "no-store"); + try { + PrintWriter pw=response.getWriter(); + pw.write(jObject.toString()); + pw.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + @RequestMapping(params = "dictParameter") + public String dictParameter(){ + return "jeecg/demo/base/jdbc/jdbc-list"; + } + + /** + * JDBC DEMO 鏄剧ず鍒楄〃 + * + * @return + */ + @RequestMapping(params = "listAllDictParaByJdbc") + public void listAllDictParaByJdbc(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + + this.jeecgJdbcService.listAllByJdbc(dataGrid); + TagUtil.datagrid(response, dataGrid); + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgMatterBomController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgMatterBomController.java new file mode 100644 index 00000000..94beb0ff --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgMatterBomController.java @@ -0,0 +1,241 @@ +package org.jeecgframework.web.demo.controller.test; + +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.ComboTree; +import org.jeecgframework.core.common.model.json.TreeGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.vo.easyui.ComboTreeModel; +import org.jeecgframework.tag.vo.easyui.TreeGridModel; +import org.jeecgframework.web.demo.entity.test.JeecgMatterBom; +import org.jeecgframework.web.demo.service.test.JeecgMatterBomServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +/** + *
  • 绫诲瀷鍚嶇О锛 + *
  • 璇存槑锛氱墿鏂橞om鏄剧ず鎺у埗绫 + *
  • 鍒涘缓浜猴細 娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ +@Scope("prototype") +@Controller +@RequestMapping("/jeecgMatterBomController") +public class JeecgMatterBomController extends BaseController { + + @Autowired + private JeecgMatterBomServiceI jeecgMatterBomService; + + @Autowired + private SystemService systemService; + + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + /** + *
  • 鏂规硶鍚嶏細goList + *
  • @param request HttpServletRequest + *
  • @return 鍒楄〃椤甸潰 + *
  • 杩斿洖绫诲瀷锛歁odelAndView + *
  • 璇存槑锛氳烦杞埌鐗╂枡Bom鍒楄〃椤甸潰 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-13 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @RequestMapping(params = "goList") + public ModelAndView goList(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/jeecgMatterBomList"); + } + + /** + *
  • 鏂规硶鍚嶏細doTreeGrid + *
  • @param entity JeecgMatterBom + *
  • @param request HttpServletRequest + *
  • @param response HttpServletResponse + *
  • @param treegrid TreeGrid + *
  • @return 鐗╂枡Bom treegrid闆嗗悎 + *
  • 杩斿洖绫诲瀷锛歀ist + *
  • 璇存槑锛氳幏鍙栫墿鏂橞om treegrid闆嗗悎 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-13 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @RequestMapping(params = "doTreeGrid") + @ResponseBody + public List doTreeGrid(JeecgMatterBom entity, HttpServletRequest request, HttpServletResponse response, TreeGrid treegrid) { + CriteriaQuery cq = new CriteriaQuery(JeecgMatterBom.class); + if("yes".equals(request.getParameter("isSearch"))) { + treegrid.setId(null); + entity.setId(null); + } + if(null != entity.getCode()) { + HqlGenerateUtil.installHql(cq, entity); + } + if (treegrid.getId() != null) { + cq.eq("parent.id", treegrid.getId()); + } else { + cq.isNull("parent"); + } + cq.add(); + List list = jeecgMatterBomService.getListByCriteriaQuery(cq, false); + if(list.size() == 0 && entity.getCode() != null) { + cq = new CriteriaQuery(JeecgMatterBom.class); + JeecgMatterBom parent = new JeecgMatterBom(); + entity.setParent(parent); + HqlGenerateUtil.installHql(cq, entity); + list = jeecgMatterBomService.getListByCriteriaQuery(cq, false); + } + List treeGrids = new ArrayList(); + TreeGridModel treeGridModel = new TreeGridModel(); + treeGridModel.setTextField("name"); + treeGridModel.setParentText("parent_name"); + treeGridModel.setParentId("parent_id"); + treeGridModel.setSrc("code"); + treeGridModel.setIdField("id"); + treeGridModel.setChildList("children"); + treeGrids = jeecgMatterBomService.treegrid(list, treeGridModel); + return treeGrids; + } + + /** + *
  • 鏂规硶鍚嶏細goEdit + *
  • @param entity JeecgMatterBom + *
  • @param request HttpServletRequest + *
  • @return 褰曞叆鎴栫紪杈戦〉闈 + *
  • 杩斿洖绫诲瀷锛歁odelAndView + *
  • 璇存槑锛氳烦杞埌褰曞叆鎴栫紪杈戦〉闈 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-13 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @RequestMapping(params = "goEdit") + public ModelAndView goEdit(JeecgMatterBom entity, HttpServletRequest request) { + if (StringUtil.isNotEmpty(entity.getId())) { + entity = jeecgMatterBomService.getEntity(JeecgMatterBom.class, entity.getId()); + request.setAttribute("entity", entity); + } + return new ModelAndView("jeecg/demo/test/jeecgMatterBom"); + } + + /** + *
  • 鏂规硶鍚嶏細getChildren + *
  • @param request HttpServletRequest + *
  • @param comboTree ComboTree + *
  • @return 鐗╂枡Bom ComboTree闆嗗悎 + *
  • 杩斿洖绫诲瀷锛歀ist + *
  • 璇存槑锛氳幏鍙栫墿鏂橞om ComboTree闆嗗悎 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-13 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @RequestMapping(params = "getChildren") + @ResponseBody + public List getChildren(HttpServletRequest request, ComboTree comboTree) { + CriteriaQuery cq = new CriteriaQuery(JeecgMatterBom.class); + if (comboTree.getId() != null) { + cq.eq("parent.id", comboTree.getId()); + } else { + cq.isNull("parent"); + } + cq.add(); + List list = jeecgMatterBomService.getListByCriteriaQuery(cq, false); + ComboTreeModel comboTreeModel = new ComboTreeModel("id", "name", "children"); + List comboTrees = systemService.ComboTree(list, comboTreeModel, null, false); + return comboTrees; + + } + + /** + *
  • 鏂规硶鍚嶏細doSave + *
  • @param entity JeecgMatterBom + *
  • @param request HttpServletRequest + *
  • @return ajax鎻愮ず淇℃伅 + *
  • 杩斿洖绫诲瀷锛欰jaxJson + *
  • 璇存槑锛氫繚瀛樻垨鏇存柊鐗╂枡Bom + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-13 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @RequestMapping(params = "doSave") + @ResponseBody + public AjaxJson doSave(JeecgMatterBom entity, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + //璁剧疆涓婄骇鐗╂枡Bom + String parentId = request.getParameter("parent.id"); + if (StringUtil.isEmpty(parentId)) { + entity.setParent(null); + } + if (StringUtil.isNotEmpty(entity.getId())) { + message = "鏇存柊鎴愬姛"; + JeecgMatterBom t = jeecgMatterBomService.get(JeecgMatterBom.class, entity.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(entity, t); + jeecgMatterBomService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + message = "娣诲姞鎴愬姛"; + jeecgMatterBomService.save(entity); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + + return j; + } + + /** + *
  • 鏂规硶鍚嶏細doDelete + *
  • @param entity JeecgMatterBom + *
  • @param request HttpServletRequest + *
  • @return ajax鎻愮ず淇℃伅 + *
  • 杩斿洖绫诲瀷锛欰jaxJson + *
  • 璇存槑锛氬垹闄ょ墿鏂橞om + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-13 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @RequestMapping(params = "doDelete") + @ResponseBody + public AjaxJson doDelete(JeecgMatterBom entity, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + + jeecgMatterBomService.deleteEntityById(JeecgMatterBom.class, entity.getId()); + + message = "鍒犻櫎鎴愬姛"; + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgMinidaoController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgMinidaoController.java new file mode 100644 index 00000000..3095d69c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgMinidaoController.java @@ -0,0 +1,159 @@ +package org.jeecgframework.web.demo.controller.test; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.demo.entity.test.JeecgMinidaoEntity; +import org.jeecgframework.web.demo.service.test.JeecgMinidaoServiceI; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: Minidao渚嬪瓙 + * @author fancq + * @date 2013-12-23 21:18:59 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/jeecgMinidaoController") +public class JeecgMinidaoController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(JeecgMinidaoController.class); + + @Autowired + private JeecgMinidaoServiceI jeecgMinidaoService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * Minidao渚嬪瓙鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "jeecgMinidao") + public ModelAndView jeecgMinidao(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/jeecgMinidaoList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(JeecgMinidaoEntity jeecgMinidao,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + List list = jeecgMinidaoService.listAll(jeecgMinidao, dataGrid.getPage(), dataGrid.getRows()); + Integer count = jeecgMinidaoService.getCount(); + dataGrid.setTotal(count); + dataGrid.setResults(list); + String total_salary = String.valueOf(jeecgMinidaoService.getSumSalary()); + /* + * 璇存槑锛氭牸寮忎负 瀛楁鍚:鍊(鍙夛紝涓嶅啓璇ュ兼椂涓哄垎椤垫暟鎹殑鍚堣) 澶氫釜鍚堣 浠 , 鍒嗗壊 + */ + dataGrid.setFooter("salary:"+(total_salary.equalsIgnoreCase("null")?"0.0":total_salary)+",age,email:鍚堣"); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎Minidao渚嬪瓙 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(JeecgMinidaoEntity jeecgMinidao, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + jeecgMinidao = jeecgMinidaoService.getEntity(JeecgMinidaoEntity.class, jeecgMinidao.getId()); + message = "Minidao渚嬪瓙鍒犻櫎鎴愬姛"; + jeecgMinidaoService.delete(jeecgMinidao); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞Minidao渚嬪瓙 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(JeecgMinidaoEntity jeecgMinidao, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(jeecgMinidao.getId())) { + message = "Minidao渚嬪瓙鏇存柊鎴愬姛"; + JeecgMinidaoEntity t = jeecgMinidaoService.getEntity(JeecgMinidaoEntity.class, jeecgMinidao.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(jeecgMinidao, t); + jeecgMinidaoService.update(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + message = "Minidao渚嬪瓙鏇存柊澶辫触"; + } + } else { + message = "Minidao渚嬪瓙娣诲姞鎴愬姛"; + jeecgMinidao.setStatus("0"); + jeecgMinidaoService.insert(jeecgMinidao); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + + /** + * Minidao渚嬪瓙鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(JeecgMinidaoEntity jeecgMinidao, HttpServletRequest req) { + //鑾峰彇閮ㄩ棬淇℃伅 + List departList = systemService.getList(TSDepart.class); + req.setAttribute("departList", departList); + + if (StringUtil.isNotEmpty(jeecgMinidao.getId())) { + jeecgMinidao = jeecgMinidaoService.getEntity(JeecgMinidaoEntity.class, jeecgMinidao.getId()); + req.setAttribute("jeecgMinidaoPage", jeecgMinidao); + } + return new ModelAndView("jeecg/demo/test/jeecgMinidao"); + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgNoteController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgNoteController.java new file mode 100644 index 00000000..2b2475fc --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgNoteController.java @@ -0,0 +1,156 @@ +package org.jeecgframework.web.demo.controller.test; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.service.SystemService; + +import org.jeecgframework.web.demo.entity.test.JeecgNoteEntity; +import org.jeecgframework.web.demo.service.test.JeecgNoteServiceI; + +/** + * @Title: Controller + * @Description: 鍏憡 + * @author 寮犱唬娴 + * @date 2013-03-12 14:06:34 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/jeecgNoteController") +public class JeecgNoteController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(JeecgNoteController.class); + + @Autowired + private JeecgNoteServiceI jeecgNoteService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 鍏憡鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "jeecgNote") + public ModelAndView jeecgNote(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/jeecgNoteList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(JeecgNoteEntity jeecgNote,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(JeecgNoteEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, jeecgNote); + this.jeecgNoteService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎鍏憡 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(JeecgNoteEntity jeecgNote, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + jeecgNote = systemService.getEntity(JeecgNoteEntity.class, jeecgNote.getId()); + message = "鍒犻櫎鎴愬姛"; + jeecgNoteService.delete(jeecgNote); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞鍏憡 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(JeecgNoteEntity jeecgNote, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(jeecgNote.getId())) { + message = "鏇存柊鎴愬姛"; + jeecgNoteService.saveOrUpdate(jeecgNote); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } else { + message = "娣诲姞鎴愬姛"; + jeecgNoteService.save(jeecgNote); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + + return j; + } + + /** + * 鍏憡鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(JeecgNoteEntity jeecgNote, HttpServletRequest req) { + if (StringUtil.isNotEmpty(jeecgNote.getId())) { + jeecgNote = jeecgNoteService.getEntity(JeecgNoteEntity.class, jeecgNote.getId()); + req.setAttribute("jeecgNotePage", jeecgNote); + } + return new ModelAndView("jeecg/demo/test/jeecgNote"); + } + /** + * 鍏憡鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdateNoBtn") + public ModelAndView addorupdateNoBtn(JeecgNoteEntity jeecgNote, HttpServletRequest req) { + if (StringUtil.isNotEmpty(jeecgNote.getId())) { + jeecgNote = jeecgNoteService.getEntity(JeecgNoteEntity.class, jeecgNote.getId()); + req.setAttribute("jeecgNotePage", jeecgNote); + } + return new ModelAndView("jeecg/demo/test/jeecgNoteNoBtn"); + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgOrderMainController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgOrderMainController.java new file mode 100644 index 00000000..cc7529f2 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgOrderMainController.java @@ -0,0 +1,171 @@ +package org.jeecgframework.web.demo.controller.test; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.demo.entity.test.JeecgOrderCustomEntity; +import org.jeecgframework.web.demo.entity.test.JeecgOrderMainEntity; +import org.jeecgframework.web.demo.entity.test.JeecgOrderProductEntity; +import org.jeecgframework.web.demo.page.JeecgOrderMainPage; +import org.jeecgframework.web.demo.service.test.JeecgOrderMainServiceI; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: 璁㈠崟淇℃伅 + * @author 寮犱唬娴 + * @date 2013-03-19 22:01:34 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/jeecgOrderMainController") +public class JeecgOrderMainController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(JeecgOrderMainController.class); + + @Autowired + private JeecgOrderMainServiceI jeecgOrderMainService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 璁㈠崟淇℃伅鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "jeecgOrderMain") + public ModelAndView jeecgOrderMain(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/jeecgOrderMainList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(JeecgOrderMainEntity.class, dataGrid); + this.jeecgOrderMainService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎璁㈠崟淇℃伅 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(JeecgOrderMainEntity jeecgOrderMain, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + jeecgOrderMain = systemService.getEntity(JeecgOrderMainEntity.class, jeecgOrderMain.getId()); + message = "鍒犻櫎鎴愬姛"; + jeecgOrderMainService.delMain(jeecgOrderMain); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞璁㈠崟鍙婃槑缁嗕俊鎭 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(JeecgOrderMainEntity jeecgOrderMain ,JeecgOrderMainPage jeecgOrderMainPage, + HttpServletRequest request) { + List jeecgOrderProducList = jeecgOrderMainPage.getJeecgOrderProductList(); + List jeecgOrderCustomList = jeecgOrderMainPage.getJeecgOrderCustomList(); + Boolean jeecgOrderCustomShow = "true".equals(request.getParameter("jeecgOrderCustomShow")); + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(jeecgOrderMain.getId())) { + message = "鏇存柊鎴愬姛"; + jeecgOrderMainService.updateMain(jeecgOrderMain, jeecgOrderProducList, jeecgOrderCustomList,jeecgOrderCustomShow); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } else { + message = "娣诲姞鎴愬姛"; + jeecgOrderMainService.addMain(jeecgOrderMain, jeecgOrderProducList, jeecgOrderCustomList); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + /** + * 璁㈠崟淇℃伅鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(JeecgOrderMainEntity jeecgOrderMain, HttpServletRequest req) { + if (StringUtil.isNotEmpty(jeecgOrderMain.getId())) { + jeecgOrderMain = jeecgOrderMainService.getEntity(JeecgOrderMainEntity.class, jeecgOrderMain.getId()); + req.setAttribute("jeecgOrderMainPage", jeecgOrderMain); + } + return new ModelAndView("jeecg/demo/test/jeecgOrderMain"); + } + /** + * 鍔犺浇浜у搧鍒楄〃椤甸潰 + * + * @return + */ + @RequestMapping(params = "jeecgOrderProductList") + public ModelAndView jeecgOrderProductList(JeecgOrderMainEntity jeecgOrderMain, HttpServletRequest req) { + if (StringUtil.isNotEmpty(jeecgOrderMain.getGoOrderCode())) { + List jeecgOrderProductEntityList = jeecgOrderMainService.findByProperty(JeecgOrderProductEntity.class, "goOrderCode", jeecgOrderMain.getGoOrderCode()); + req.setAttribute("jeecgOrderProductList", jeecgOrderProductEntityList); + } + return new ModelAndView("jeecg/demo/test/jeecgOrderProductList"); + } + + /** + * 鍔犺浇瀹㈡埛鍒楄〃椤甸潰 + * + * @return + */ + @RequestMapping(params = "jeecgOrderCustomList") + public ModelAndView jeecgOrderCustomList(JeecgOrderMainEntity jeecgOrderMain, HttpServletRequest req) { + if (StringUtil.isNotEmpty(jeecgOrderMain.getGoOrderCode())) { + List jeecgJeecgOrderCustomEntityList = jeecgOrderMainService.findByProperty(JeecgOrderCustomEntity.class, "goOrderCode", jeecgOrderMain.getGoOrderCode()); + req.setAttribute("jeecgOrderCustomList", jeecgJeecgOrderCustomEntityList); + } + return new ModelAndView("jeecg/demo/test/jeecgOrderCustomList"); + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgOrderMainNoTagController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgOrderMainNoTagController.java new file mode 100644 index 00000000..cb559540 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/JeecgOrderMainNoTagController.java @@ -0,0 +1,152 @@ +package org.jeecgframework.web.demo.controller.test; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.demo.entity.test.JeecgOrderCustomEntity; +import org.jeecgframework.web.demo.entity.test.JeecgOrderMainEntity; +import org.jeecgframework.web.demo.entity.test.JeecgOrderProductEntity; +import org.jeecgframework.web.demo.page.JeecgOrderMainPage; +import org.jeecgframework.web.demo.service.test.JeecgOrderMainServiceI; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: 璁㈠崟淇℃伅 + * @author 寮犱唬娴 + * @date 2013-03-19 22:01:34 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/jeecgOrderMainNoTagController") +public class JeecgOrderMainNoTagController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(JeecgOrderMainController.class); + + @Autowired + private JeecgOrderMainServiceI jeecgOrderMainService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 璁㈠崟淇℃伅鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "jeecgOrderMainNoTag") + public ModelAndView jeecgOrderMain(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/notag/jeecgOrderMainListNoTag"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(JeecgOrderMainEntity.class, dataGrid); + this.jeecgOrderMainService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎璁㈠崟淇℃伅 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(JeecgOrderMainEntity jeecgOrderMain, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + jeecgOrderMain = systemService.getEntity(JeecgOrderMainEntity.class, jeecgOrderMain.getId()); + message = "鍒犻櫎鎴愬姛"; + jeecgOrderMainService.delMain(jeecgOrderMain); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞璁㈠崟鍙婃槑缁嗕俊鎭 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(JeecgOrderMainEntity jeecgOrderMain ,JeecgOrderMainPage jeecgOrderMainPage, + HttpServletRequest request) { + List jeecgOrderProducList = jeecgOrderMainPage.getJeecgOrderProductList(); + List jeecgOrderCustomList = jeecgOrderMainPage.getJeecgOrderCustomList(); + Boolean jeecgOrderCustomShow = "true".equals(request.getParameter("jeecgOrderCustomShow")); + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(jeecgOrderMain.getId())) { + message = "鏇存柊鎴愬姛"; + jeecgOrderMainService.updateMain(jeecgOrderMain, jeecgOrderProducList, jeecgOrderCustomList,jeecgOrderCustomShow); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } else { + message = "娣诲姞鎴愬姛"; + jeecgOrderMainService.addMain(jeecgOrderMain, jeecgOrderProducList, jeecgOrderCustomList); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + /** + * 璁㈠崟淇℃伅鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdateNoTag") + public ModelAndView addorupdate(JeecgOrderMainEntity jeecgOrderMain, HttpServletRequest req) { + if (StringUtil.isNotEmpty(jeecgOrderMain.getId())) { + jeecgOrderMain = jeecgOrderMainService.getEntity(JeecgOrderMainEntity.class, jeecgOrderMain.getId()); + req.setAttribute("jeecgOrderMainPage", jeecgOrderMain); + } + if (StringUtil.isNotEmpty(jeecgOrderMain.getGoOrderCode())) { + List jeecgOrderProductEntityList = jeecgOrderMainService.findByProperty(JeecgOrderProductEntity.class, "goOrderCode", jeecgOrderMain.getGoOrderCode()); + req.setAttribute("jeecgOrderProductList", jeecgOrderProductEntityList); + } + if (StringUtil.isNotEmpty(jeecgOrderMain.getGoOrderCode())) { + List jeecgJeecgOrderCustomEntityList = jeecgOrderMainService.findByProperty(JeecgOrderCustomEntity.class, "goOrderCode", jeecgOrderMain.getGoOrderCode()); + req.setAttribute("jeecgOrderCustomList", jeecgJeecgOrderCustomEntityList); + } + return new ModelAndView("jeecg/demo/notag/jeecgOrderMainNoTag"); + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/JpPersonController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/JpPersonController.java new file mode 100644 index 00000000..5bc4797b --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/JpPersonController.java @@ -0,0 +1,251 @@ +package org.jeecgframework.web.demo.controller.test; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.ExceptionUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.UUIDGenerator; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.entity.vo.NormalExcelConstants; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.demo.entity.test.JpPersonEntity; +import org.jeecgframework.web.demo.service.test.JpPersonServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * @author 寮犱唬娴 + * @version V1.0 + * @Title: Controller + * @Description: Excel瀵煎嚭 + * @date 2013-03-23 21:45:28 + */ +@Scope("prototype") +@Controller +@RequestMapping("/jpPersonController") +public class JpPersonController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(JpPersonController.class); + + @Autowired + private JpPersonServiceI jpPersonService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * Excel瀵煎嚭鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "jpPerson") + public ModelAndView jpPerson(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/jpPersonList"); + } + + /** + * 瀵煎嚭excel + * + * @param request + * @param response + */ + @RequestMapping(params = "exportXls") + public String exportXls(HttpServletRequest request, HttpServletResponse response + ,ModelMap map) { + List jpPersons = this.jpPersonService.loadAll(JpPersonEntity.class); + map.put(NormalExcelConstants.FILE_NAME, "鐢ㄦ埛淇℃伅"); + map.put(NormalExcelConstants.CLASS, JpPersonEntity.class); + map.put(NormalExcelConstants.PARAMS, new ExportParams(null, null, "瀵煎嚭淇℃伅")); + map.put(NormalExcelConstants.DATA_LIST, jpPersons); + return NormalExcelConstants.JEECG_EXCEL_VIEW; + } + + @RequestMapping(params = "goImplXls") + public ModelAndView goImplXls(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/upload"); + } + + // 鑰佺殑EasyUI涓婁紶鏂瑰紡锛2013/05/28搴熷純锛 + @RequestMapping(params = "implXls") + @ResponseBody + public AjaxJson implXls(HttpServletRequest request, HttpServletResponse response) { + AjaxJson j = new AjaxJson(); + MultipartHttpServletRequest mulRequest = (MultipartHttpServletRequest) request; + MultipartFile file = mulRequest.getFile("filedata"); + List listPersons; + try { + boolean isSuccess = true; + listPersons = ExcelImportUtil.importExcel( + file.getInputStream(), JpPersonEntity.class,new ImportParams()); + for (JpPersonEntity person : listPersons) { + person.setId(UUIDGenerator.generate()); + if (person.getAge() == null || person.getCreatedt() == null || person.getSalary() == null) { + isSuccess = false; + break; + } else { + jpPersonService.save(person); + } + } + if (isSuccess) + j.setMsg("鏂囦欢瀵煎叆鎴愬姛锛"); + else + j.setMsg("鏂囦欢鏍煎紡涓嶆纭紝瀵煎叆澶辫触锛"); + } catch (IOException e) { + j.setMsg("鏂囦欢瀵煎叆澶辫触锛"); + logger.error(ExceptionUtil.getExceptionMessage(e)); + } catch (Exception e) { + j.setMsg("鏂囦欢鏍煎紡涓嶆纭紝瀵煎叆澶辫触锛"); + } + return j; + } + + // 缁熶竴鐨凟xcel涓婁紶瀵煎叆鏂瑰紡 + @RequestMapping(params = "importExcel", method = RequestMethod.POST) + @ResponseBody + public AjaxJson importExcel(HttpServletRequest request, HttpServletResponse response) { + AjaxJson j = new AjaxJson(); + + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 + List listPersons; + try { + listPersons = ExcelImportUtil.importExcel( + file.getInputStream(), JpPersonEntity.class,new ImportParams()); + for (JpPersonEntity person : listPersons) { + if (person.getAge() != null) { + person.setId(UUIDGenerator.generate()); + jpPersonService.save(person); + } + } + j.setMsg("鏂囦欢瀵煎叆鎴愬姛锛"); + } catch (Exception e) { + j.setMsg("鏂囦欢瀵煎叆澶辫触锛"); + logger.error(ExceptionUtil.getExceptionMessage(e)); + } + //break; // 涓嶆敮鎸佸涓枃浠跺鍏ワ紵 + } + + return j; + } + + @RequestMapping("check") + public void check(HttpServletRequest request, HttpServletResponse response) { + try { + if ("open".equals(request.getSession().getAttribute("state"))) { + request.getSession().setAttribute("state", null); + response.getWriter().write("true"); + response.getWriter().flush(); + } else { + response.getWriter().write("false"); + response.getWriter().flush(); + } + } catch (IOException e) { + } + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(JpPersonEntity.class, dataGrid); + this.jpPersonService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎Excel瀵煎嚭 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(JpPersonEntity jpPerson, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + jpPerson = systemService.getEntity(JpPersonEntity.class, jpPerson.getId()); + message = "鍒犻櫎鎴愬姛"; + jpPersonService.delete(jpPerson); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞Excel瀵煎嚭 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(JpPersonEntity jpPerson, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(jpPerson.getId())) { + message = "鏇存柊鎴愬姛"; + jpPersonService.saveOrUpdate(jpPerson); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } else { + message = "娣诲姞鎴愬姛"; + jpPersonService.save(jpPerson); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + + return j; + } + + /** + * Excel瀵煎嚭鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(JpPersonEntity jpPerson, HttpServletRequest req) { + if (StringUtil.isNotEmpty(jpPerson.getId())) { + jpPerson = jpPersonService.getEntity(JpPersonEntity.class, jpPerson.getId()); + req.setAttribute("jpPersonPage", jpPerson); + } + return new ModelAndView("jeecg/demo/test/jpPerson"); + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/OptimisticLockingController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/OptimisticLockingController.java new file mode 100644 index 00000000..ecfe9eca --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/OptimisticLockingController.java @@ -0,0 +1,157 @@ +package org.jeecgframework.web.demo.controller.test; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.util.MyBeanUtils; + +import org.jeecgframework.web.demo.entity.test.OptimisticLockingEntity; +import org.jeecgframework.web.demo.service.test.OptimisticLockingServiceI; + +/** + * @Title: Controller + * @Description: 涔愯閿佹祴璇 + * @author 寮犱唬娴 + * @date 2013-06-24 14:46:42 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/optimisticLockingController") +public class OptimisticLockingController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(OptimisticLockingController.class); + + @Autowired + private OptimisticLockingServiceI optimisticLockingService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 涔愯閿佹祴璇曞垪琛 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "optimisticLocking") + public ModelAndView optimisticLocking(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/optimisticLockingList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(OptimisticLockingEntity optimisticLocking,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(OptimisticLockingEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, optimisticLocking, request.getParameterMap()); + this.optimisticLockingService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎涔愯閿佹祴璇 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(OptimisticLockingEntity optimisticLocking, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + optimisticLocking = systemService.getEntity(OptimisticLockingEntity.class, optimisticLocking.getId()); + message = "鍒犻櫎鎴愬姛"; + optimisticLockingService.delete(optimisticLocking); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞涔愯閿佹祴璇 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(OptimisticLockingEntity optimisticLocking, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + //optimisticLockingService.dd(); + if (StringUtil.isNotEmpty(optimisticLocking.getId())) { + message = "鏇存柊鎴愬姛"; + OptimisticLockingEntity t = optimisticLockingService.get(OptimisticLockingEntity.class, optimisticLocking.getId()); + try { + org.jeecgframework.core.util.LogUtil.info("鎻愪氦鐨勭増鏈彿锛"+optimisticLocking.getVer()+"锛屽綋鍓嶇増鏈彿锛"+t.getVer()); + if(optimisticLocking.getVer()< t.getVer()){ + j.setSuccess(false); + j.setMsg("鎻愪氦鐨勬暟鎹凡杩囨湡"); + throw new Exception("鎻愪氦鐨勬暟鎹凡杩囨湡"); + } + MyBeanUtils.copyBeanNotNull2Bean(optimisticLocking, t); + optimisticLockingService.updateEntitie(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + message = "娣诲姞鎴愬姛"; + optimisticLockingService.save(optimisticLocking); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + + return j; + } + + /** + * 涔愯閿佹祴璇曞垪琛ㄩ〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(OptimisticLockingEntity optimisticLocking, HttpServletRequest req) { + if (StringUtil.isNotEmpty(optimisticLocking.getId())) { + optimisticLocking = optimisticLockingService.getEntity(OptimisticLockingEntity.class, optimisticLocking.getId()); + req.setAttribute("optimisticLockingPage", optimisticLocking); + } + return new ModelAndView("jeecg/demo/test/optimisticLocking"); + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/ReportDemoController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/ReportDemoController.java new file mode 100644 index 00000000..9950f95c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/ReportDemoController.java @@ -0,0 +1,210 @@ +package org.jeecgframework.web.demo.controller.test; + +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.apache.batik.transcoder.Transcoder; +import org.apache.batik.transcoder.TranscoderException; +import org.apache.batik.transcoder.TranscoderInput; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.image.JPEGTranscoder; +import org.apache.batik.transcoder.image.PNGTranscoder; +import org.apache.fop.svg.PDFTranscoder; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.dao.jdbc.JdbcDao; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.common.model.json.Highchart; +import org.jeecgframework.core.util.DBTypeUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + + +/** + * 鎶ヨ〃demo鎺у埗鍣 + * + * @author xiehs + * + */ +@Controller +@RequestMapping("/reportDemoController") +public class ReportDemoController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(ReportDemoController.class); + //鐝骇瀛︾敓浜烘暟姣斾緥鍒嗘瀽鍥介檯鍖朘ey + private static final String CLASS_STUDENT_COUNT_ANALYSIS = "class.student.count.analysis"; + + private SystemService systemService; + + @Autowired + private MutiLangServiceI mutiLangService; + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + + @RequestMapping(params = "listAllStatisticByJdbc") + public void listAllStatisticByJdbc(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + List> maplist=systemService.findForJdbc("SELECT s.classname classname ,count(className) personcount FROM T_s_Student s group by s.className", null); + Long countSutent = systemService.getCountForJdbc("SELECT COUNT(1) FROM T_S_student WHERE 1=1"); + for(Map map:maplist){ + Long personcount = Long.parseLong(map.get("personcount").toString()); + Double percentage = 0.0; + if (personcount != null && personcount.intValue() != 0) { + percentage = new Double(personcount)/countSutent; + } + + map.put("rate", String.format("%.2f", percentage*100)+"%"); + } + Long count = 0L; + if(JdbcDao.DATABSE_TYPE_SQLSERVER.equals(DBTypeUtil.getDBType())){ + count = systemService.getCountForJdbcParam("select count(0) from (SELECT s.className classname ,count(className) totalclass FROM T_s_Student s group by s.className) as t( classname, totalclass)",null); + }else{ + count = systemService.getCountForJdbcParam("select count(0) from (SELECT s.className ,count(className) FROM T_s_Student s group by s.className)t",null); + } + + dataGrid.setTotal(count.intValue()); + dataGrid.setResults(maplist); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 缁熻闆嗗悎椤甸潰 + * + * @return + */ + @RequestMapping(params = "studentStatisticTabs") + public ModelAndView studentStatisticTabs(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/base/report/reportDemo"); + } + + + /** + * 鎶ヨ〃鏁版嵁鐢熸垚 + * + * @return + */ + @RequestMapping(params = "studentCount") + @ResponseBody + public List studentCount(HttpServletRequest request,String reportType, HttpServletResponse response) { + List list = new ArrayList(); + Highchart hc = new Highchart(); + StringBuffer sb = new StringBuffer(); + sb.append("SELECT className ,count(className) FROM TSStudent group by className"); + List userBroswerList = systemService.findByQueryString(sb.toString()); + Long count = systemService.getCountForJdbc("SELECT COUNT(1) FROM T_S_student WHERE 1=1"); + List lt = new ArrayList(); + hc = new Highchart(); + hc.setName(mutiLangService.getLang(CLASS_STUDENT_COUNT_ANALYSIS)); + hc.setType(reportType); + Map map; + if (userBroswerList.size() > 0) { + for (Object object : userBroswerList) { + map = new HashMap(); + Object[] obj = (Object[]) object; + map.put("name", obj[0]); + map.put("y", obj[1]); + Long groupCount = (Long) obj[1]; + Double percentage = 0.0; + if (count != null && count.intValue() != 0) { + percentage = new Double(groupCount)/count; + } + map.put("percentage", percentage*100); + lt.add(map); + } + } + hc.setData(lt); + list.add(hc); + return list; + } + + /** + * 鎶ヨ〃鎵撳嵃 + * @param request + * @param response + * @throws IOException + */ + @RequestMapping(params = "export") + public void export(HttpServletRequest request, HttpServletResponse response) + throws IOException { + request.setCharacterEncoding("utf-8"); + response.setCharacterEncoding("utf-8"); + String type = request.getParameter("type"); + String svg = request.getParameter("svg"); + String filename = request.getParameter("filename"); + + filename = filename == null ? "chart" : filename; + ServletOutputStream out = response.getOutputStream(); + try { + if (null != type && null != svg) { + svg = svg.replaceAll(":rect", "rect"); + String ext = ""; + Transcoder t = null; + if (type.equals("image/png")) { + ext = "png"; + t = new PNGTranscoder(); + } else if (type.equals("image/jpeg")) { + ext = "jpg"; + t = new JPEGTranscoder(); + } else if (type.equals("application/pdf")) { + ext = "pdf"; + t = (Transcoder) new PDFTranscoder(); + } else if (type.equals("image/svg+xml")) + ext = "svg"; + response.addHeader("Content-Disposition", + "attachment; filename=" + new String(filename.getBytes("GBK"),"ISO-8859-1") + "." + ext); + response.addHeader("Content-Type", type); + + if (null != t) { + TranscoderInput input = new TranscoderInput( + new StringReader(svg)); + TranscoderOutput output = new TranscoderOutput(out); + + try { + t.transcode(input, output); + } catch (TranscoderException e) { + out + .print("Problem transcoding stream. See the web logs for more details."); + e.printStackTrace(); + } + } else if (ext.equals("svg")) { + // out.print(svg); + OutputStreamWriter writer = new OutputStreamWriter(out, + "UTF-8"); + writer.append(svg); + writer.close(); + } else + out.print("Invalid type: " + type); + } else { + response.addHeader("Content-Type", "text/html"); + out + .println("Usage:\n\tParameter [svg]: The DOM Element to be converted." + + "\n\tParameter [type]: The destination MIME type for the elment to be transcoded."); + } + } finally { + if (out != null) { + out.flush(); + out.close(); + } + } + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/TFinanceController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/TFinanceController.java new file mode 100644 index 00000000..2299a67e --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/TFinanceController.java @@ -0,0 +1,217 @@ +package org.jeecgframework.web.demo.controller.test; +import java.util.HashMap; +import java.util.Map; + +import javax.imageio.stream.FileCacheImageInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.demo.entity.test.TFinanceEntity; +import org.jeecgframework.web.demo.entity.test.TFinanceFilesEntity; +import org.jeecgframework.web.demo.service.test.TFinanceServiceI; +import org.jeecgframework.web.system.pojo.base.TSDocument; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.commons.io.FileUtils; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.common.UploadFile; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartRequest; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: 璧勯噾绠$悊 + * @author 寮犱唬娴 + * @date 2013-06-27 00:10:59 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/tFinanceController") +public class TFinanceController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(TFinanceController.class); + + @Autowired + private TFinanceServiceI tFinanceService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 璧勯噾绠$悊鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "tFinance") + public ModelAndView tFinance(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/tFinanceList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(TFinanceEntity tFinance,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TFinanceEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, tFinance, request.getParameterMap()); + this.tFinanceService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + + /** + * 淇濆瓨鏂囦欢 + * + * @param ids + * @return + * @throws Exception + */ + @RequestMapping(params = "saveFiles", method = RequestMethod.POST) + @ResponseBody + public AjaxJson saveFiles(HttpServletRequest request, HttpServletResponse response, TFinanceFilesEntity financeFile) { + AjaxJson j = new AjaxJson(); + Map attributes = new HashMap(); + String fileKey = oConvertUtils.getString(request.getParameter("fileKey"));// 鏂囦欢ID + + String financeId = oConvertUtils.getString(request.getParameter("financeId"));//璧勯噾ID + + if (StringUtil.isNotEmpty(fileKey)) { + financeFile.setId(fileKey); + financeFile = systemService.getEntity(TFinanceFilesEntity.class, fileKey); + + } + TFinanceEntity finance = systemService.getEntity(TFinanceEntity.class, financeId); + financeFile.setFinance(finance); + UploadFile uploadFile = new UploadFile(request, financeFile); + uploadFile.setCusPath("files"); + uploadFile.setSwfpath("swfpath"); + uploadFile.setByteField(null);//涓嶅瓨浜岃繘鍒跺唴瀹 + financeFile = systemService.uploadFile(uploadFile); + attributes.put("fileKey", financeFile.getId()); + attributes.put("viewhref", "commonController.do?objfileList&fileKey=" + financeFile.getId()); + attributes.put("delurl", "commonController.do?delObjFile&fileKey=" + financeFile.getId()); + j.setMsg("鏂囦欢娣诲姞鎴愬姛"); + j.setAttributes(attributes); + + return j; + } + + /** + * 鍒犻櫎璧勯噾绠$悊 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(TFinanceEntity tFinance, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + tFinance = systemService.getEntity(TFinanceEntity.class, tFinance.getId()); + message = "鍒犻櫎鎴愬姛"; + tFinanceService.deleteFinance(tFinance); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞璧勯噾绠$悊 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(TFinanceEntity tFinance, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(tFinance.getId())) { + message = "鏇存柊鎴愬姛"; + TFinanceEntity t = tFinanceService.get(TFinanceEntity.class, tFinance.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(tFinance, t); + tFinanceService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + message = "娣诲姞鎴愬姛"; + tFinanceService.save(tFinance); + + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + j.setObj(tFinance); + return j; + } + + + /** + * 鍒犻櫎鏂囨。 + * + * @param ids + * @return + */ + @RequestMapping(params = "delFile") + @ResponseBody + public AjaxJson delFile( HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + String id = request.getParameter("id"); + TFinanceFilesEntity file = systemService.getEntity(TFinanceFilesEntity.class, id); + message = "" + file.getAttachmenttitle() + "琚垹闄ゆ垚鍔"; + tFinanceService.deleteFile(file); + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + j.setSuccess(true); + j.setMsg(message); + return j; + } + + /** + * 璧勯噾绠$悊鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(TFinanceEntity tFinance, HttpServletRequest req) { + if (StringUtil.isNotEmpty(tFinance.getId())) { + tFinance = tFinanceService.getEntity(TFinanceEntity.class, tFinance.getId()); + req.setAttribute("tFinancePage", tFinance); + } + return new ModelAndView("jeecg/demo/test/tFinance"); + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/UserNoPageController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/UserNoPageController.java new file mode 100644 index 00000000..dcf907fe --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/UserNoPageController.java @@ -0,0 +1,76 @@ +package org.jeecgframework.web.demo.controller.test; + +import org.jeecgframework.web.system.controller.core.UserController; +import org.jeecgframework.web.system.pojo.base.*; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.web.system.service.UserService; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @ClassName: NoPageController + * @Description: 瀵圭敤鎴穌atagrid鍋氭棤鍒嗛〉鐨勪緥瀛 + * @author cici + */ +@Controller +@RequestMapping("/userNoPageController") +public class UserNoPageController { + /** + * Logger for this class + */ + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger(UserController.class); + + private UserService userService; + private SystemService systemService; + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + @Autowired + public void setUserService(UserService userService) { + this.userService = userService; + } + /** + * 鐢ㄦ埛鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "user") + public String user(HttpServletRequest request) { + String departsReplace = ""; + List departList = systemService.getList(TSDepart.class); + for (TSDepart depart : departList) { + if (departsReplace.length() > 0) { + departsReplace += ","; + } + departsReplace += depart.getDepartname() + "_" + depart.getId(); + } + request.setAttribute("departsReplace", departsReplace); + return "jeecg/demo/base/nopage/userList"; + } + @RequestMapping(params = "datagridNoPage") + public void datagridNoPage(TSUser user,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSUser.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, user); + + Short[] userstate = new Short[] { Globals.User_Normal, Globals.User_ADMIN }; + cq.in("status", userstate); + cq.add(); + this.systemService.getDataGridReturn(cq, false); + TagUtil.datagrid(response, dataGrid); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/controller/test/WebOfficeController.java b/src/main/java/org/jeecgframework/web/demo/controller/test/WebOfficeController.java new file mode 100644 index 00000000..12efa7da --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/controller/test/WebOfficeController.java @@ -0,0 +1,242 @@ +package org.jeecgframework.web.demo.controller.test; +import java.io.BufferedOutputStream; +import java.io.InputStream; +import java.sql.Blob; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.ExceptionUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.util.MyBeanUtils; + +import org.jeecgframework.web.demo.entity.test.JeecgBlobDataEntity; +import org.jeecgframework.web.demo.entity.test.WebOfficeEntity; +import org.jeecgframework.web.demo.service.test.WebOfficeServiceI; + +/** + * @Title: Controller + * @Description: WebOffice渚嬪瓙 + * @author 寮犱唬娴 + * @date 2013-07-08 10:54:19 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/webOfficeController") +public class WebOfficeController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(WebOfficeController.class); + + @Autowired + private WebOfficeServiceI webOfficeService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * WebOffice渚嬪瓙鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "webOffice") + public ModelAndView webOffice(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/webOfficeList"); + } + + /** + * 鏂规硶鎻忚堪: 瀹樻柟绀轰緥 + * 浣 鑰咃細 yiming.zhang + * 鏃 鏈燂細 Nov 30, 2013-11:18:26 AM + * @param request + * @return + * 杩斿洖绫诲瀷锛 ModelAndView + */ + @RequestMapping(params = "webOfficeSample") + public ModelAndView webOfficeSample(HttpServletRequest request) { + return new ModelAndView("jeecg/demo/test/webOfficeSample"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(WebOfficeEntity webOffice,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(WebOfficeEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, webOffice, request.getParameterMap()); + this.webOfficeService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎WebOffice渚嬪瓙 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(WebOfficeEntity webOffice, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + webOffice = systemService.getEntity(WebOfficeEntity.class, webOffice.getId()); + message = "鍒犻櫎鎴愬姛"; + webOfficeService.delete(webOffice); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞WebOffice渚嬪瓙 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(WebOfficeEntity webOffice, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(webOffice.getId())) { + message = "鏇存柊鎴愬姛"; + WebOfficeEntity t = webOfficeService.get(WebOfficeEntity.class, webOffice.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(webOffice, t); + webOfficeService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + message = "娣诲姞鎴愬姛"; + webOfficeService.save(webOffice); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + + return j; + } + + /** + * WebOffice渚嬪瓙鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(WebOfficeEntity webOffice, HttpServletRequest req) { + if (StringUtil.isNotEmpty(webOffice.getId())) { + webOffice = webOfficeService.getEntity(WebOfficeEntity.class, webOffice.getId()); + req.setAttribute("webOfficePage", webOffice); + } + return new ModelAndView("jeecg/demo/test/webOffice"); + } + + /** + * WebOffice渚嬪瓙鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "newDocument") + public ModelAndView newDocument(WebOfficeEntity webOffice, HttpServletRequest req) { + if (StringUtil.isNotEmpty(webOffice.getId())) { + webOffice = webOfficeService.getEntity(WebOfficeEntity.class, webOffice.getId()); + req.setAttribute("docId", webOffice.getId()); + req.setAttribute("fileType", webOffice.getDoctype()); + req.setAttribute("docData", webOffice); + } else { + req.setAttribute("docId", ""); + req.setAttribute("fileType", req.getParameter("fileType")); + } + return new ModelAndView("jeecg/demo/test/webOfficeEdit"); + } +// @RequestMapping(params = "getWebOfficeView") +// public ModelAndView getWebOfficeView(HttpServletRequest req) { +// return new ModelAndView("jeecg/demo/test/webOfficeView"); +// } + + @RequestMapping(params = "getDoc") + public void getDoc(HttpServletRequest request, Integer fileId, HttpServletResponse response) { + // 浠庢暟鎹簱鍙栧緱鏁版嵁 + WebOfficeEntity obj = systemService.getEntity(WebOfficeEntity.class, fileId); + try { + Blob attachment = obj.getDoccontent(); + response.setContentType("application/x-msdownload;"); + response.setHeader("Content-disposition", "attachment; filename=" + + new String((obj.getDoctitle()+"."+obj.getDoctype()).getBytes("GBK"), "ISO8859-1")); + //浠庢暟鎹簱涓鍙栧嚭鏉 , 杈撳嚭缁欎笅杞界敤 + InputStream bis = attachment.getBinaryStream(); + BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[2048]; + int bytesRead; + long lTotalLen = 0; + while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { + bos.write(buff, 0, bytesRead); + lTotalLen += bytesRead; + } + response.setHeader("Content-Length", String.valueOf(lTotalLen)); + bos.flush(); + bos.close(); + } catch (Exception e){ + e.printStackTrace(); + } + } + @RequestMapping(params = "saveDoc") + @ResponseBody + public AjaxJson saveDoc(WebOfficeEntity webOffice, HttpServletRequest request, HttpServletResponse response) { + AjaxJson j = new AjaxJson(); + + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 + try { + webOfficeService.saveObj(webOffice, file); + j.setMsg("鏂囦欢瀵煎叆鎴愬姛锛"); + } catch (Exception e) { + j.setMsg("鏂囦欢瀵煎叆澶辫触锛"); + logger.error(ExceptionUtil.getExceptionMessage(e)); + } + //break; // 涓嶆敮鎸佸涓枃浠跺鍏ワ紵 + } + + return j; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/dao/test/JeecgMinidaoDao.java b/src/main/java/org/jeecgframework/web/demo/dao/test/JeecgMinidaoDao.java new file mode 100644 index 00000000..68ee0ac2 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/dao/test/JeecgMinidaoDao.java @@ -0,0 +1,47 @@ +package org.jeecgframework.web.demo.dao.test; + +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.demo.entity.test.JeecgMinidaoEntity; + +import org.jeecgframework.minidao.annotation.Arguments; +import org.jeecgframework.minidao.annotation.MiniDao; +import org.jeecgframework.minidao.annotation.ResultType; +import org.jeecgframework.minidao.annotation.Sql; +import org.jeecgframework.minidao.hibernate.MiniDaoSupportHiber; +import org.springframework.stereotype.Repository; + +/** + * Minidao渚嬪瓙 + * @author fancq + * + */ +//@Repository("jeecgMinidaoDao") +@MiniDao +public interface JeecgMinidaoDao extends MiniDaoSupportHiber { + @Arguments({"jeecgMinidao", "page", "rows"}) + public List getAllEntities(JeecgMinidaoEntity jeecgMinidao, int page, int rows); + + @Arguments({"jeecgMinidao", "page", "rows"}) + @ResultType(JeecgMinidaoEntity.class) + public List getAllEntities2(JeecgMinidaoEntity jeecgMinidao, int page, int rows); + + //@Arguments("id") + //JeecgMinidaoEntity getJeecgMinidao(String id); + + @Sql("SELECT count(*) FROM jeecg_minidao") + Integer getCount(); + + @Sql("SELECT SUM(salary) FROM jeecg_minidao") + Integer getSumSalary(); + + /*@Arguments("jeecgMinidao") + int update(JeecgMinidaoEntity jeecgMinidao); + + @Arguments("jeecgMinidao") + void insert(JeecgMinidaoEntity jeecgMinidao); + + @Arguments("jeecgMinidao") + void delete(JeecgMinidaoEntity jeecgMinidao);*/ +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/CKEditorEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/CKEditorEntity.java new file mode 100644 index 00000000..0c6de9b2 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/CKEditorEntity.java @@ -0,0 +1,68 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; + +/** + * @Title: Entity + * @Description: HTML 缂栬緫鍣 + * @author 寮犱唬娴 + * @date 2013-07-08 16:19:21 + * @version V1.0 + * + */ +@Entity +@Table(name = "ck_editor", schema = "") +@SuppressWarnings("serial") +public class CKEditorEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**contents*/ + private byte[] contents; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱byte[] + *@return: byte[] contents + */ + @Column(name ="CONTENTS",nullable=true,length=65535) + public byte[] getContents(){ + return this.contents; + } + + /** + *鏂规硶: 璁剧疆byte[] + *@param: byte[] contents + */ + public void setContents(byte[] contents){ + this.contents = contents; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/CourseEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/CourseEntity.java new file mode 100644 index 00000000..95c5908b --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/CourseEntity.java @@ -0,0 +1,110 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.GenericGenerator; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; +import org.jeecgframework.poi.excel.annotation.ExcelEntity; +import org.jeecgframework.poi.excel.annotation.ExcelTarget; + + +/** + * @Title: Entity + * @Description: 璇剧▼ + * @author jueyue + * @date 2013-08-31 22:53:07 + * @version V1.0 + * + */ +@Entity +@Table(name = "jeecg_demo_course", schema = "") +@DynamicUpdate(true) +@DynamicInsert(true) +@SuppressWarnings("serial") +@ExcelTarget("courseEntity") +public class CourseEntity implements java.io.Serializable { + /**涓婚敭*/ + private java.lang.String id; + /**璇剧▼鍚嶇О*/ + @Excel(name="璇剧▼鍚嶇О",orderNum="1",needMerge=true) + private java.lang.String name; + /**鑰佸笀涓婚敭*/ + @ExcelEntity() + private TeacherEntity teacher; + + @ExcelCollection(name="閫夎瀛︾敓",orderNum="4") + private List students; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 璇剧▼鍚嶇О + */ + @Column(name ="NAME",nullable=true,length=25) + public java.lang.String getName(){ + return this.name; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 璇剧▼鍚嶇О + */ + public void setName(java.lang.String name){ + this.name = name; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鑰佸笀涓婚敭 + */ + @ManyToOne(cascade=CascadeType.REMOVE) + public TeacherEntity getTeacher() { + return teacher; + } + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鑰佸笀涓婚敭 + */ + public void setTeacher(TeacherEntity teacher) { + this.teacher = teacher; + } + + @OneToMany(mappedBy="course",cascade=CascadeType.REMOVE) + public List getStudents() { + return students; + } + + public void setStudents(List students) { + this.students = students; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/FileMeta.java b/src/main/java/org/jeecgframework/web/demo/entity/test/FileMeta.java new file mode 100644 index 00000000..30d97324 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/FileMeta.java @@ -0,0 +1,35 @@ +package org.jeecgframework.web.demo.entity.test; + +public class FileMeta { + + private String fileName; + private String fileSize; + private String fileType; + + private byte[] bytes; + + public String getFileName() { + return fileName; + } + public void setFileName(String fileName) { + this.fileName = fileName; + } + public String getFileSize() { + return fileSize; + } + public void setFileSize(String fileSize) { + this.fileSize = fileSize; + } + public String getFileType() { + return fileType; + } + public void setFileType(String fileType) { + this.fileType = fileType; + } + public byte[] getBytes() { + return bytes; + } + public void setBytes(byte[] bytes) { + this.bytes = bytes; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgBlobDataEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgBlobDataEntity.java new file mode 100644 index 00000000..c27b4ef1 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgBlobDataEntity.java @@ -0,0 +1,264 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.sql.Blob; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: Blob鍨嬫暟鎹搷浣滀緥瀛 + * @author 寮犱唬娴 + * @date 2013-06-07 14:46:09 + * @version V1.0 + * + */ +@Entity +@Table(name = "t_s_attachment", schema = "") +@SuppressWarnings("serial") +public class JeecgBlobDataEntity implements java.io.Serializable { + /**涓婚敭ID*/ + private java.lang.String id; + /**鐢ㄦ埛ID*/ + private java.lang.String userid; + /**businesskey*/ + private java.lang.String businesskey; + /**绫诲瀷ID*/ + private java.lang.String infotypeid; + /**attachmenttitle*/ + private java.lang.String attachmenttitle; + /**闄勪欢璺緞*/ + private java.lang.String realpath; + /**subclassname*/ + private java.lang.String subclassname; + /**createdate*/ + private java.util.Date createdate; + /**闄勪欢鍐呭*/ + private Blob attachmentcontent; + /**flash璺緞*/ + private java.lang.String swfpath; + /**note*/ + private java.lang.String note; + /**extend*/ + private java.lang.String extend; + /**busentityname*/ + private java.lang.String busentityname; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭ID + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭ID + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鐢ㄦ埛ID + */ + @Column(name ="USERID",nullable=true,length=32) + public java.lang.String getUserid(){ + return this.userid; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鐢ㄦ埛ID + */ + public void setUserid(java.lang.String userid){ + this.userid = userid; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String businesskey + */ + @Column(name ="BUSINESSKEY",nullable=true,length=32) + public java.lang.String getBusinesskey(){ + return this.businesskey; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String businesskey + */ + public void setBusinesskey(java.lang.String businesskey){ + this.businesskey = businesskey; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 绫诲瀷ID + */ + @Column(name ="INFOTYPEID",nullable=true,length=32) + public java.lang.String getInfotypeid(){ + return this.infotypeid; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 绫诲瀷ID + */ + public void setInfotypeid(java.lang.String infotypeid){ + this.infotypeid = infotypeid; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String attachmenttitle + */ + @Column(name ="ATTACHMENTTITLE",nullable=true,length=100) + public java.lang.String getAttachmenttitle(){ + return this.attachmenttitle; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String attachmenttitle + */ + public void setAttachmenttitle(java.lang.String attachmenttitle){ + this.attachmenttitle = attachmenttitle; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 闄勪欢璺緞 + */ + @Column(name ="REALPATH",nullable=true,length=100) + public java.lang.String getRealpath(){ + return this.realpath; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 闄勪欢璺緞 + */ + public void setRealpath(java.lang.String realpath){ + this.realpath = realpath; + } + /** + *鏂规硶: 鍙栧緱java.lang.Object + *@return: java.lang.Object subclassname + */ + @Column(name ="SUBCLASSNAME",nullable=true,length=65535) + public java.lang.String getSubclassname(){ + return this.subclassname; + } + + /** + *鏂规硶: 璁剧疆java.lang.Object + *@param: java.lang.Object subclassname + */ + public void setSubclassname(java.lang.String subclassname){ + this.subclassname = subclassname; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date createdate + */ + @Column(name ="CREATEDATE",nullable=true) + public java.util.Date getCreatedate(){ + return this.createdate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date createdate + */ + public void setCreatedate(java.util.Date createdate){ + this.createdate = createdate; + } + /** + *鏂规硶: 鍙栧緱byte[] + *@return: byte[] 闄勪欢鍐呭 + */ + @Column(name ="ATTACHMENTCONTENT",length=3000) + public Blob getAttachmentcontent(){ + return this.attachmentcontent; + } + + /** + *鏂规硶: 璁剧疆byte[] + *@param: byte[] 闄勪欢鍐呭 + */ + public void setAttachmentcontent(Blob attachmentcontent){ + this.attachmentcontent = attachmentcontent; + } + /** + *鏂规硶: 鍙栧緱java.lang.Object + *@return: java.lang.Object flash璺緞 + */ + @Column(name ="SWFPATH",nullable=true,length=65535) + public java.lang.String getSwfpath(){ + return this.swfpath; + } + + /** + *鏂规硶: 璁剧疆java.lang.Object + *@param: java.lang.Object flash璺緞 + */ + public void setSwfpath(java.lang.String swfpath){ + this.swfpath = swfpath; + } + /** + *鏂规硶: 鍙栧緱java.lang.Object + *@return: java.lang.Object note + */ + @Column(name ="NOTE",nullable=true,length=65535) + public java.lang.String getNote(){ + return this.note; + } + + /** + *鏂规硶: 璁剧疆java.lang.Object + *@param: java.lang.Object note + */ + public void setNote(java.lang.String note){ + this.note = note; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String extend + */ + @Column(name ="EXTEND",nullable=true,length=32) + public java.lang.String getExtend(){ + return this.extend; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String extend + */ + public void setExtend(java.lang.String extend){ + this.extend = extend; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String busentityname + */ + @Column(name ="BUSENTITYNAME",nullable=true,length=100) + public java.lang.String getBusentityname(){ + return this.busentityname; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String busentityname + */ + public void setBusentityname(java.lang.String busentityname){ + this.busentityname = busentityname; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgDemo.java b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgDemo.java new file mode 100644 index 00000000..6b79c58e --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgDemo.java @@ -0,0 +1,225 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; + +/** + * JeecgDemo娴嬭瘯琛 + * + */ +@Entity +@Table(name = "jeecg_demo") +@Inheritance(strategy = InheritanceType.JOINED) +public class JeecgDemo extends IdEntity implements java.io.Serializable { + private static final long serialVersionUID = 1L; + + /**鎵嬫満鍙风爜*/ + private java.lang.String mobilePhone; + /**鍔炲叕鐢佃瘽*/ + private java.lang.String officePhone; + /**鐢靛瓙閭*/ + private java.lang.String email; + /**age*/ + private java.lang.Integer age; + /**宸ヨ祫*/ + private BigDecimal salary; + /**鐢熸棩*/ + private Date birthday; + /**鍒涘缓鏃堕棿*/ + private Date createDate; + /**鎬у埆*/ + private java.lang.String sex; + /**閮ㄩ棬ID*/ + private java.lang.String depId; + /**鐢ㄦ埛鍚*/ + private java.lang.String userName; + /**鐘舵*/ + private java.lang.String status; + /**澶囨敞*/ + private java.lang.String content; + + + public java.lang.String getStatus() { + return status; + } + @Column(name ="status",nullable=true) + public void setStatus(java.lang.String status) { + this.status = status; + } + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎵嬫満鍙风爜 + */ + @Column(name ="MOBILE_PHONE",nullable=true) + public java.lang.String getMobilePhone(){ + return this.mobilePhone; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎵嬫満鍙风爜 + */ + public void setMobilePhone(java.lang.String mobilePhone){ + this.mobilePhone = mobilePhone; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍔炲叕鐢佃瘽 + */ + @Column(name ="OFFICE_PHONE",nullable=true) + public java.lang.String getOfficePhone(){ + return this.officePhone; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍔炲叕鐢佃瘽 + */ + public void setOfficePhone(java.lang.String officePhone){ + this.officePhone = officePhone; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鐢靛瓙閭 + */ + @Column(name ="EMAIL",nullable=true) + public java.lang.String getEmail(){ + return this.email; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鐢靛瓙閭 + */ + public void setEmail(java.lang.String email){ + this.email = email; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer age + */ + @Column(name ="AGE",nullable=true) + public java.lang.Integer getAge(){ + return this.age; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer age + */ + public void setAge(java.lang.Integer age){ + this.age = age; + } + /** + *鏂规硶: 鍙栧緱BigDecimal + *@return: BigDecimal 宸ヨ祫 + */ + @Column(name ="SALARY",nullable=true) + public BigDecimal getSalary(){ + return this.salary; + } + + /** + *鏂规硶: 璁剧疆BigDecimal + *@param: BigDecimal 宸ヨ祫 + */ + public void setSalary(BigDecimal salary){ + this.salary = salary; + } + /** + *鏂规硶: 鍙栧緱Date + *@return: Date 鐢熸棩 + */ + @Column(name ="BIRTHDAY",nullable=true) + public Date getBirthday(){ + return this.birthday; + } + + /** + *鏂规硶: 璁剧疆Date + *@param: Date 鐢熸棩 + */ + public void setBirthday(Date birthday){ + this.birthday = birthday; + } + /** + *鏂规硶: 鍙栧緱java.sql.Timestamp + *@return: java.sql.Timestamp 鍒涘缓鏃堕棿 + */ + @Column(name ="create_date",nullable=true) + public Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆Date + *@param: Date 鍒涘缓鏃堕棿 + */ + public void setCreateDate(Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 鎬у埆 + */ + @Column(name ="SEX",nullable=true) + public java.lang.String getSex(){ + return this.sex; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 鎬у埆 + */ + public void setSex(java.lang.String sex){ + this.sex = sex; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 閮ㄩ棬ID + */ + @Column(name ="DEP_ID",nullable=true) + public java.lang.String getDepId(){ + return this.depId; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 閮ㄩ棬ID + */ + public void setDepId(java.lang.String depId){ + this.depId = depId; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鐢ㄦ埛鍚 + */ + @Column(name ="USER_NAME",nullable=false) + public java.lang.String getUserName(){ + return this.userName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鐢ㄦ埛鍚 + */ + public void setUserName(java.lang.String userName){ + this.userName = userName; + } + public java.lang.String getContent() { + return content; + } + public void setContent(java.lang.String content) { + this.content = content; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgDemoCkfinderEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgDemoCkfinderEntity.java new file mode 100644 index 00000000..2c5487ea --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgDemoCkfinderEntity.java @@ -0,0 +1,116 @@ +package org.jeecgframework.web.demo.entity.test; + +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: ckeditor+ckfinder渚嬪瓙 + * @author Alexander + * @date 2013-09-19 18:29:21 + * @version V1.0 + * + */ +@Entity +@Table(name = "ck_finder", schema = "") +@SuppressWarnings("serial") +public class JeecgDemoCkfinderEntity implements java.io.Serializable { + /** id */ + private java.lang.String id; + /** 鍥剧墖 */ + private java.lang.String image; + /** 闄勪欢 */ + private java.lang.String attachment; + /** 澶囨敞 */ + private java.lang.String remark; + + /** + * 鏂规硶: 鍙栧緱java.lang.String + * + * @return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name = "ID", nullable = false, length = 32) + public java.lang.String getId() { + return this.id; + } + + /** + * 鏂规硶: 璁剧疆java.lang.String + * + * @param: java.lang.String id + */ + public void setId(java.lang.String id) { + this.id = id; + } + + /** + * 鏂规硶: 鍙栧緱java.lang.String + * + * @return: java.lang.String 鍥剧墖 + */ + @Column(name = "IMAGE", nullable = true, length = 255) + public java.lang.String getImage() { + return this.image; + } + + /** + * 鏂规硶: 璁剧疆java.lang.String + * + * @param: java.lang.String 鍥剧墖 + */ + public void setImage(java.lang.String image) { + this.image = image; + } + + /** + * 鏂规硶: 鍙栧緱java.lang.String + * + * @return: java.lang.String 闄勪欢 + */ + @Column(name = "ATTACHMENT", nullable = true, length = 255) + public java.lang.String getAttachment() { + return this.attachment; + } + + /** + * 鏂规硶: 璁剧疆java.lang.String + * + * @param: java.lang.String 闄勪欢 + */ + public void setAttachment(java.lang.String attachment) { + this.attachment = attachment; + } + + /** + * 鏂规硶: 鍙栧緱java.lang.Object + * + * @return: java.lang.Object 澶囨敞 + */ + @Lob + @Basic(fetch = FetchType.LAZY) + @Column(name = "REMARK", nullable = true) + public java.lang.String getRemark() { + return this.remark; + } + + /** + * 鏂规硶: 璁剧疆java.lang.Object + * + * @param: java.lang.Object 澶囨敞 + */ + public void setRemark(java.lang.String remark) { + this.remark = remark; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgJdbcEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgJdbcEntity.java new file mode 100644 index 00000000..d1e65cc4 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgJdbcEntity.java @@ -0,0 +1,230 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; + +/** + * @Title: Entity + * @Description: 閫氳繃JDBC璁块棶鏁版嵁搴 + * @author 寮犱唬娴 + * @date 2013-05-20 13:18:38 + * @version V1.0 + * + */ +@Entity +@Table(name = "jeecg_demo", schema = "") +@SuppressWarnings("serial") +public class JeecgJdbcEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**age*/ + private java.lang.Integer age; + /**birthday*/ + private java.util.Date birthday; + /**createTime*/ + private java.util.Date createTime; + /**depId*/ + private java.lang.String depId; + /**email*/ + private java.lang.String email; + /**mobilePhone*/ + private java.lang.String mobilePhone; + /**officePhone*/ + private java.lang.String officePhone; + /**salary*/ + private BigDecimal salary; + /**sex*/ + private java.lang.String sex; + /**userName*/ + private java.lang.String userName; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer age + */ + @Column(name ="AGE",nullable=true,precision=10,scale=0) + public java.lang.Integer getAge(){ + return this.age; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer age + */ + public void setAge(java.lang.Integer age){ + this.age = age; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date birthday + */ + @Column(name ="BIRTHDAY",nullable=true) + public java.util.Date getBirthday(){ + return this.birthday; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date birthday + */ + public void setBirthday(java.util.Date birthday){ + this.birthday = birthday; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date createTime + */ + @Column(name ="CREATE_TIME",nullable=true) + public java.util.Date getCreateTime(){ + return this.createTime; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date createTime + */ + public void setCreateTime(java.util.Date createTime){ + this.createTime = createTime; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String depId + */ + @Column(name ="DEP_ID",nullable=true,length=255) + public java.lang.String getDepId(){ + return this.depId; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String depId + */ + public void setDepId(java.lang.String depId){ + this.depId = depId; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String email + */ + @Column(name ="EMAIL",nullable=true,length=255) + public java.lang.String getEmail(){ + return this.email; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String email + */ + public void setEmail(java.lang.String email){ + this.email = email; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String mobilePhone + */ + @Column(name ="MOBILE_PHONE",nullable=true,length=255) + public java.lang.String getMobilePhone(){ + return this.mobilePhone; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String mobilePhone + */ + public void setMobilePhone(java.lang.String mobilePhone){ + this.mobilePhone = mobilePhone; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String officePhone + */ + @Column(name ="OFFICE_PHONE",nullable=true,length=255) + public java.lang.String getOfficePhone(){ + return this.officePhone; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String officePhone + */ + public void setOfficePhone(java.lang.String officePhone){ + this.officePhone = officePhone; + } + /** + *鏂规硶: 鍙栧緱BigDecimal + *@return: BigDecimal salary + */ + @Column(name ="SALARY",nullable=true,precision=19,scale=2) + public BigDecimal getSalary(){ + return this.salary; + } + + /** + *鏂规硶: 璁剧疆BigDecimal + *@param: BigDecimal salary + */ + public void setSalary(BigDecimal salary){ + this.salary = salary; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String sex + */ + @Column(name ="SEX",nullable=true,length=4) + public java.lang.String getSex(){ + return this.sex; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String sex + */ + public void setSex(java.lang.String sex){ + this.sex = sex; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String userName + */ + @Column(name ="USER_NAME",nullable=false,length=255) + public java.lang.String getUserName(){ + return this.userName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String userName + */ + public void setUserName(java.lang.String userName){ + this.userName = userName; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgMatterBom.java b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgMatterBom.java new file mode 100644 index 00000000..c512d19c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgMatterBom.java @@ -0,0 +1,383 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.OrderBy; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; + +/** + *
  • 绫诲瀷鍚嶇О锛 + *
  • 璇存槑锛氱墿鏂橞om + *
  • 鍒涘缓浜猴細 娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-11 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ +@Entity +@Table(name = "jeecg_matter_bom") +public class JeecgMatterBom extends IdEntity { + + /** 缂栫爜 */ + private String code; + + /** 涓婄骇鐗╂枡Bom */ + private JeecgMatterBom parent; + + /** 涓嬬骇鐗╂枡Bom */ + private List children = new ArrayList(); + + /** 鍚嶇О */ + private String name; + + /** 鍗曚綅 */ + private String unit; + + /** 澶у皬 */ + private String weight; + + /** 浠锋牸 */ + private BigDecimal price; + + /** 搴撳瓨 */ + private Integer stock = 0; + + /** 浜у湴 */ + private String address; + + /** 鐢熶骇鏃ユ湡 */ + private Date productionDate; + + /** 鏁伴噺 */ + private Integer quantity = 0; + + /** + *
  • 鏂规硶鍚嶏細getAddress + *
  • @return 浜у湴 + *
  • 杩斿洖绫诲瀷锛歋tring + *
  • 璇存槑锛氳幏鍙栦骇鍦 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-11 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @Column(length = 255) + public String getAddress() { + return address; + } + + /** + *
  • 鏂规硶鍚嶏細setAddress + *
  • @param address 浜у湴 + *
  • 杩斿洖绫诲瀷锛歷oid + *
  • 璇存槑锛氳缃骇鍦 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-11 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + public void setAddress(String address) { + this.address = address; + } + + /** + *
  • 鏂规硶鍚嶏細getCode + *
  • @return 缂栫爜 + *
  • 杩斿洖绫诲瀷锛歋tring + *
  • 璇存槑锛氳幏鍙栫紪鐮 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-11 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @Column(nullable = false, length = 50) + public String getCode() { + return code; + } + + /** + *
  • 鏂规硶鍚嶏細setCode + *
  • @param code 缂栫爜 + *
  • 杩斿洖绫诲瀷锛歷oid + *
  • 璇存槑锛氳缃紪鐮 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-11 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + public void setCode(String code) { + this.code = code; + } + + /** + *
  • 鏂规硶鍚嶏細getName + *
  • @return 鍚嶇О + *
  • 杩斿洖绫诲瀷锛歋tring + *
  • 璇存槑锛氳幏鍙栧悕绉 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-11 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @Column(nullable = false, length = 50) + public String getName() { + return name; + } + + /** + *
  • 鏂规硶鍚嶏細setName + *
  • @param name 鍚嶇О + *
  • 杩斿洖绫诲瀷锛歷oid + *
  • 璇存槑锛氳缃悕绉 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-11 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + public void setName(String name) { + this.name = name; + } + + /** + *
  • 鏂规硶鍚嶏細getParent + *
  • @return 涓婄骇鐗╂枡Bom + *
  • 杩斿洖绫诲瀷锛欽eecgMatterBom + *
  • 璇存槑锛氳幏鍙栦笂绾х墿鏂橞om + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @ManyToOne(fetch = FetchType.LAZY) + public JeecgMatterBom getParent() { + return parent; + } + + /** + *
  • 鏂规硶鍚嶏細setParent + *
  • @param parent 涓婄骇鐗╂枡Bom + *
  • 杩斿洖绫诲瀷锛歷oid + *
  • 璇存槑锛氳缃笂绾х墿鏂橞om + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + public void setParent(JeecgMatterBom parent) { + this.parent = parent; + } + + /** + *
  • 鏂规硶鍚嶏細getChildren + *
  • @return 涓嬬骇鐗╂枡Bom + *
  • 杩斿洖绫诲瀷锛歋et + *
  • 璇存槑锛氳幏鍙栦笅绾х墿鏂橞om + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.LAZY) + @OrderBy("code asc") + public List getChildren() { + return children; + } + + /** + *
  • 鏂规硶鍚嶏細setChildren + *
  • @param children 涓嬬骇鐗╂枡Bom + *
  • 杩斿洖绫诲瀷锛歷oid + *
  • 璇存槑锛氳缃笅绾х墿鏂橞om + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + public void setChildren(List children) { + this.children = children; + } + + /** + *
  • 鏂规硶鍚嶏細getPrice + *
  • @return 浠锋牸 + *
  • 杩斿洖绫诲瀷锛欱igDecimal + *
  • 璇存槑锛氳幏鍙栦环鏍 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @Column(nullable = false, precision = 21, scale = 6) + public BigDecimal getPrice() { + return price; + } + + /** + *
  • 鏂规硶鍚嶏細setPrice + *
  • @param price 浠锋牸 + *
  • 杩斿洖绫诲瀷锛歷oid + *
  • 璇存槑锛氳缃环鏍 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + public void setPrice(BigDecimal price) { + this.price = price; + } + + /** + *
  • 鏂规硶鍚嶏細getProductionDate + *
  • @return 鐢熶骇鏃ユ湡 + *
  • 杩斿洖绫诲瀷锛欴ate + *
  • 璇存槑锛氳幏鍙栫敓浜ф棩鏈 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + public Date getProductionDate() { + return productionDate; + } + + /** + *
  • 鏂规硶鍚嶏細setProductionDate + *
  • @param productionDate 鐢熶骇鏃ユ湡 + *
  • 杩斿洖绫诲瀷锛歷oid + *
  • 璇存槑锛氳缃敓浜ф棩鏈 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + public void setProductionDate(Date productionDate) { + this.productionDate = productionDate; + } + + /** + *
  • 鏂规硶鍚嶏細getQuantity + *
  • @return 鏁伴噺 + *
  • 杩斿洖绫诲瀷锛欼nteger + *
  • 璇存槑锛氳幏鍙栨暟閲 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @Column(nullable = false) + public Integer getQuantity() { + return quantity; + } + + /** + *
  • 鏂规硶鍚嶏細setQuantity + *
  • @param quantity 鏁伴噺 + *
  • 杩斿洖绫诲瀷锛歷oid + *
  • 璇存槑锛氳缃暟閲 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + /** + *
  • 鏂规硶鍚嶏細getStock + *
  • @return 搴撳瓨 + *
  • 杩斿洖绫诲瀷锛欼nteger + *
  • 璇存槑锛氳幏鍙栧簱瀛 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @Column(nullable = false) + public Integer getStock() { + return stock; + } + + /** + *
  • 鏂规硶鍚嶏細setStock + *
  • @param stock 搴撳瓨 + *
  • 杩斿洖绫诲瀷锛歷oid + *
  • 璇存槑锛氳缃簱瀛 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + public void setStock(Integer stock) { + this.stock = stock; + } + + /** + *
  • 鏂规硶鍚嶏細getUnit + *
  • @return 鍗曚綅 + *
  • 杩斿洖绫诲瀷锛歋tring + *
  • 璇存槑锛氳幏鍙栧崟浣 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @Column(length = 50) + public String getUnit() { + return unit; + } + + /** + *
  • 鏂规硶鍚嶏細setUnit + *
  • @param unit 鍗曚綅 + *
  • 杩斿洖绫诲瀷锛歷oid + *
  • 璇存槑锛氳缃崟浣 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + public void setUnit(String unit) { + this.unit = unit; + } + + /** + *
  • 鏂规硶鍚嶏細getWeight + *
  • @return 澶у皬 + *
  • 杩斿洖绫诲瀷锛歋tring + *
  • 璇存槑锛氳幏鍙栧ぇ灏 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + @Column(length = 50) + public String getWeight() { + return weight; + } + + /** + *
  • 鏂规硶鍚嶏細setWeight + *
  • @param weight 澶у皬 + *
  • 杩斿洖绫诲瀷锛歷oid + *
  • 璇存槑锛氳缃ぇ灏 + *
  • 鍒涘缓浜猴細娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ + public void setWeight(String weight) { + this.weight = weight; + } + +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgMinidaoEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgMinidaoEntity.java new file mode 100644 index 00000000..3c03cfc4 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgMinidaoEntity.java @@ -0,0 +1,268 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: Minidao渚嬪瓙 + * @author 寮犱唬娴 + * @date 2013-12-23 21:18:59 + * @version V1.0 + * + */ +@Entity +@Table(name = "jeecg_minidao", schema = "") +@DynamicUpdate(true) +@DynamicInsert(true) +@SuppressWarnings("serial") +public class JeecgMinidaoEntity implements java.io.Serializable { + /**涓婚敭*/ + private java.lang.String id; + /**骞撮緞*/ + private java.lang.Integer age; + /**鐢熸棩*/ + private java.util.Date birthday; + /**璇存槑*/ + private java.lang.String content; + /**鍒涘缓鏃堕棿*/ + private java.util.Date createTime; + /**閮ㄩ棬*/ + private java.lang.String depId; + /**鐢靛瓙閭*/ + private java.lang.String email; + /**鎵嬫満*/ + private java.lang.String mobilePhone; + /**鍔炲叕鐢佃瘽*/ + private java.lang.String officePhone; + /**宸ヨ祫*/ + private BigDecimal salary; + /**鎬у埆*/ + private java.lang.Integer sex; + /**鐘舵*/ + private java.lang.String status; + /**鐢ㄦ埛鍚*/ + private java.lang.String userName; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 骞撮緞 + */ + @Column(name ="AGE",nullable=true,precision=10,scale=0) + public java.lang.Integer getAge(){ + return this.age; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 骞撮緞 + */ + public void setAge(java.lang.Integer age){ + this.age = age; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鐢熸棩 + */ + @Column(name ="BIRTHDAY",nullable=true) + public java.util.Date getBirthday(){ + return this.birthday; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鐢熸棩 + */ + public void setBirthday(java.util.Date birthday){ + this.birthday = birthday; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 璇存槑 + */ + @Column(name ="CONTENT",nullable=true,length=255) + public java.lang.String getContent(){ + return this.content; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 璇存槑 + */ + public void setContent(java.lang.String content){ + this.content = content; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + @Column(name ="CREATE_TIME",nullable=true) + public java.util.Date getCreateTime(){ + return this.createTime; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateTime(java.util.Date createTime){ + this.createTime = createTime; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 閮ㄩ棬 + */ + @Column(name ="DEP_ID",nullable=true,length=255) + public java.lang.String getDepId(){ + return this.depId; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 閮ㄩ棬 + */ + public void setDepId(java.lang.String depId){ + this.depId = depId; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鐢靛瓙閭 + */ + @Column(name ="EMAIL",nullable=true,length=255) + public java.lang.String getEmail(){ + return this.email; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鐢靛瓙閭 + */ + public void setEmail(java.lang.String email){ + this.email = email; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎵嬫満 + */ + @Column(name ="MOBILE_PHONE",nullable=true,length=255) + public java.lang.String getMobilePhone(){ + return this.mobilePhone; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎵嬫満 + */ + public void setMobilePhone(java.lang.String mobilePhone){ + this.mobilePhone = mobilePhone; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍔炲叕鐢佃瘽 + */ + @Column(name ="OFFICE_PHONE",nullable=true,length=255) + public java.lang.String getOfficePhone(){ + return this.officePhone; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍔炲叕鐢佃瘽 + */ + public void setOfficePhone(java.lang.String officePhone){ + this.officePhone = officePhone; + } + /** + *鏂规硶: 鍙栧緱BigDecimal + *@return: BigDecimal 宸ヨ祫 + */ + @Column(name ="SALARY",nullable=true,precision=19,scale=2) + public BigDecimal getSalary(){ + return this.salary; + } + + /** + *鏂规硶: 璁剧疆BigDecimal + *@param: BigDecimal 宸ヨ祫 + */ + public void setSalary(BigDecimal salary){ + this.salary = salary; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 鎬у埆 + */ + @Column(name ="SEX",nullable=true,precision=10,scale=0) + public java.lang.Integer getSex(){ + return this.sex; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 鎬у埆 + */ + public void setSex(java.lang.Integer sex){ + this.sex = sex; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鐘舵 + */ + @Column(name ="STATUS",nullable=true,length=255) + public java.lang.String getStatus(){ + return this.status; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鐘舵 + */ + public void setStatus(java.lang.String status){ + this.status = status; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鐢ㄦ埛鍚 + */ + @Column(name ="USER_NAME",nullable=false,length=255) + public java.lang.String getUserName(){ + return this.userName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鐢ㄦ埛鍚 + */ + public void setUserName(java.lang.String userName){ + this.userName = userName; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgNoteEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgNoteEntity.java new file mode 100644 index 00000000..036895bd --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgNoteEntity.java @@ -0,0 +1,140 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; + +/** + * @Title: Entity + * @Description: 鍏憡 + * @author 寮犱唬娴 + * @date 2013-03-12 14:06:35 + * @version V1.0 + * + */ +@Entity +@Table(name = "jg_person", schema = "") +@SuppressWarnings("serial") +public class JeecgNoteEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**骞撮緞*/ + private java.lang.Integer age; + /**鐢熸棩*/ + private java.util.Date birthday; + /**鍑虹敓鏃ユ湡*/ + private java.util.Date createdt; + /**鐢ㄦ埛鍚*/ + private java.lang.String name; + /**宸ヨ祫*/ + private BigDecimal salary; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 骞撮緞 + */ + @Column(name ="AGE",nullable=true) + public java.lang.Integer getAge(){ + return this.age; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 骞撮緞 + */ + public void setAge(java.lang.Integer age){ + this.age = age; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鐢熸棩 + */ + @Column(name ="BIRTHDAY",nullable=true) + public java.util.Date getBirthday(){ + return this.birthday; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鐢熸棩 + */ + public void setBirthday(java.util.Date birthday){ + this.birthday = birthday; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍑虹敓鏃ユ湡 + */ + @Column(name ="CREATEDT",nullable=true) + public java.util.Date getCreatedt(){ + return this.createdt; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍑虹敓鏃ユ湡 + */ + public void setCreatedt(java.util.Date createdt){ + this.createdt = createdt; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鐢ㄦ埛鍚 + */ + @Column(name ="NAME",nullable=false) + public java.lang.String getName(){ + return this.name; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鐢ㄦ埛鍚 + */ + public void setName(java.lang.String name){ + this.name = name; + } + /** + *鏂规硶: 鍙栧緱BigDecimal + *@return: BigDecimal 宸ヨ祫 + */ + @Column(name ="SALARY",nullable=true) + public BigDecimal getSalary(){ + return this.salary; + } + + /** + *鏂规硶: 璁剧疆BigDecimal + *@param: BigDecimal 宸ヨ祫 + */ + public void setSalary(BigDecimal salary){ + this.salary = salary; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgOrderCustomEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgOrderCustomEntity.java new file mode 100644 index 00000000..a8412d43 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgOrderCustomEntity.java @@ -0,0 +1,316 @@ +package org.jeecgframework.web.demo.entity.test; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 璁㈠崟瀹㈡埛淇℃伅 + * @author 寮犱唬娴 + * @date 2013-03-19 22:14:01 + * @version V1.0 + * + */ +@Entity +@Table(name = "jeecg_order_custom", schema = "") +@SuppressWarnings("serial") +public class JeecgOrderCustomEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**鍥㈣喘璁㈠崟鍙*/ + private java.lang.String goOrderCode; + /**濮撳悕*/ + private java.lang.String gocCusName; + /**鎬у埆*/ + private java.lang.String gocSex; + /**韬唤璇佸彿*/ + private java.lang.String gocIdcard; + /**鎶ょ収鍙*/ + private java.lang.String gocPassportCode; + /**涓氬姟*/ + private java.lang.String gocBussContent; + /**澶囨敞*/ + private java.lang.String gocContent; + /**鍒涘缓浜*/ + private java.lang.String crtuser; + /**鍒涘缓浜哄悕瀛*/ + private java.lang.String crtuserName; + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDt; + /**淇敼浜*/ + private java.lang.String modifier; + /**淇敼浜哄悕瀛*/ + private java.lang.String modifierName; + /**淇敼鏃堕棿*/ + private java.util.Date modifyDt; + /**鍒犻櫎鏍囪*/ + private java.lang.Integer delflag; + /**鍒犻櫎鏃堕棿*/ + private java.util.Date delDt; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍥㈣喘璁㈠崟鍙 + */ + @Column(name ="GO_ORDER_CODE",nullable=false,length=12) + public java.lang.String getGoOrderCode(){ + return this.goOrderCode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍥㈣喘璁㈠崟鍙 + */ + public void setGoOrderCode(java.lang.String goOrderCode){ + this.goOrderCode = goOrderCode; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 濮撳悕 + */ + @Column(name ="GOC_CUS_NAME",nullable=true,length=16) + public java.lang.String getGocCusName(){ + return this.gocCusName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 濮撳悕 + */ + public void setGocCusName(java.lang.String gocCusName){ + this.gocCusName = gocCusName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎬у埆 + */ + @Column(name ="GOC_SEX",nullable=true) + public java.lang.String getGocSex(){ + return this.gocSex; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎬у埆 + */ + public void setGocSex(java.lang.String gocSex){ + this.gocSex = gocSex; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 韬唤璇佸彿 + */ + @Column(name ="GOC_IDCARD",nullable=true,length=18) + public java.lang.String getGocIdcard(){ + return this.gocIdcard; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 韬唤璇佸彿 + */ + public void setGocIdcard(java.lang.String gocIdcard){ + this.gocIdcard = gocIdcard; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎶ょ収鍙 + */ + @Column(name ="GOC_PASSPORT_CODE",nullable=true,length=10) + public java.lang.String getGocPassportCode(){ + return this.gocPassportCode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎶ょ収鍙 + */ + public void setGocPassportCode(java.lang.String gocPassportCode){ + this.gocPassportCode = gocPassportCode; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓氬姟 + */ + @Column(name ="GOC_BUSS_CONTENT",nullable=true,length=33) + public java.lang.String getGocBussContent(){ + return this.gocBussContent; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓氬姟 + */ + public void setGocBussContent(java.lang.String gocBussContent){ + this.gocBussContent = gocBussContent; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 澶囨敞 + */ + @Column(name ="GOC_CONTENT",nullable=true,length=66) + public java.lang.String getGocContent(){ + return this.gocContent; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 澶囨敞 + */ + public void setGocContent(java.lang.String gocContent){ + this.gocContent = gocContent; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜 + */ + @Column(name ="CRTUSER",nullable=true,length=12) + public java.lang.String getCrtuser(){ + return this.crtuser; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜 + */ + public void setCrtuser(java.lang.String crtuser){ + this.crtuser = crtuser; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕瀛 + */ + @Column(name ="CRTUSER_NAME",nullable=true,length=10) + public java.lang.String getCrtuserName(){ + return this.crtuserName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕瀛 + */ + public void setCrtuserName(java.lang.String crtuserName){ + this.crtuserName = crtuserName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + @Column(name ="CREATE_DT",nullable=true) + public java.util.Date getCreateDt(){ + return this.createDt; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDt(java.util.Date createDt){ + this.createDt = createDt; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜 + */ + @Column(name ="MODIFIER",nullable=true,length=12) + public java.lang.String getModifier(){ + return this.modifier; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜 + */ + public void setModifier(java.lang.String modifier){ + this.modifier = modifier; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜哄悕瀛 + */ + @Column(name ="MODIFIER_NAME",nullable=true,length=10) + public java.lang.String getModifierName(){ + return this.modifierName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜哄悕瀛 + */ + public void setModifierName(java.lang.String modifierName){ + this.modifierName = modifierName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 淇敼鏃堕棿 + */ + @Column(name ="MODIFY_DT",nullable=true) + public java.util.Date getModifyDt(){ + return this.modifyDt; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 淇敼鏃堕棿 + */ + public void setModifyDt(java.util.Date modifyDt){ + this.modifyDt = modifyDt; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 鍒犻櫎鏍囪 + */ + @Column(name ="DELFLAG",nullable=true,precision=10,scale=0) + public java.lang.Integer getDelflag(){ + return this.delflag; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 鍒犻櫎鏍囪 + */ + public void setDelflag(java.lang.Integer delflag){ + this.delflag = delflag; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒犻櫎鏃堕棿 + */ + @Column(name ="DEL_DT",nullable=true) + public java.util.Date getDelDt(){ + return this.delDt; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒犻櫎鏃堕棿 + */ + public void setDelDt(java.util.Date delDt){ + this.delDt = delDt; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgOrderMainEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgOrderMainEntity.java new file mode 100644 index 00000000..9d858d46 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgOrderMainEntity.java @@ -0,0 +1,354 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 璁㈠崟淇℃伅 + * @author 寮犱唬娴 + * @date 2013-03-19 22:01:34 + * @version V1.0 + * + */ +@Entity +@Table(name = "jeecg_order_main", schema = "") +@SuppressWarnings("serial") +public class JeecgOrderMainEntity implements java.io.Serializable { + /**涓婚敭*/ + private java.lang.String id; + /**璁㈠崟鍙*/ + private java.lang.String goOrderCode; + /**璁㈠崟绫诲瀷*/ + private java.lang.String goderType; + /**椤惧绫诲瀷 : 1鐩村 2鍚岃*/ + private java.lang.String usertype; + /**鑱旂郴浜*/ + private java.lang.String goContactName; + /**鎵嬫満*/ + private java.lang.String goTelphone; + /**璁㈠崟浜烘暟*/ + private java.lang.Integer goOrderCount; + /**鎬讳环(涓嶅惈杩旀)*/ + private BigDecimal goAllPrice; + /**杩旀*/ + private BigDecimal goReturnPrice; + /**澶囨敞*/ + private java.lang.String goContent; + /**鍒涘缓浜*/ + private java.lang.String crtuser; + /**鍒涘缓浜哄悕瀛*/ + private java.lang.String crtuserName; + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDt; + /**淇敼浜*/ + private java.lang.String modifier; + /**淇敼浜哄悕瀛*/ + private java.lang.String modifierName; + /**淇敼鏃堕棿*/ + private java.util.Date modifyDt; + /**鍒犻櫎鏍囪*/ + private java.lang.Integer delflag; + /**鍒犻櫎鏃堕棿*/ + private java.util.Date delDt; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 璁㈠崟鍙 + */ + @Column(name ="GO_ORDER_CODE",nullable=false,length=12) + public java.lang.String getGoOrderCode(){ + return this.goOrderCode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 璁㈠崟鍙 + */ + public void setGoOrderCode(java.lang.String goOrderCode){ + this.goOrderCode = goOrderCode; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 璁㈠崟绫诲瀷 + */ + @Column(name ="GODER_TYPE",nullable=true) + public java.lang.String getGoderType(){ + return this.goderType; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 璁㈠崟绫诲瀷 + */ + public void setGoderType(java.lang.String goderType){ + this.goderType = goderType; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 椤惧绫诲瀷 : 1鐩村 2鍚岃 + */ + @Column(name ="USERTYPE",nullable=true) + public java.lang.String getUsertype(){ + return this.usertype; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 椤惧绫诲瀷 : 1鐩村 2鍚岃 + */ + public void setUsertype(java.lang.String usertype){ + this.usertype = usertype; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鑱旂郴浜 + */ + @Column(name ="GO_CONTACT_NAME",nullable=true,length=16) + public java.lang.String getGoContactName(){ + return this.goContactName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鑱旂郴浜 + */ + public void setGoContactName(java.lang.String goContactName){ + this.goContactName = goContactName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎵嬫満 + */ + @Column(name ="GO_TELPHONE",nullable=true,length=11) + public java.lang.String getGoTelphone(){ + return this.goTelphone; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎵嬫満 + */ + public void setGoTelphone(java.lang.String goTelphone){ + this.goTelphone = goTelphone; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 璁㈠崟浜烘暟 + */ + @Column(name ="GO_ORDER_COUNT",nullable=true,precision=10,scale=0) + public java.lang.Integer getGoOrderCount(){ + return this.goOrderCount; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 璁㈠崟浜烘暟 + */ + public void setGoOrderCount(java.lang.Integer goOrderCount){ + this.goOrderCount = goOrderCount; + } + /** + *鏂规硶: 鍙栧緱BigDecimal + *@return: BigDecimal 鎬讳环(涓嶅惈杩旀) + */ + @Column(name ="GO_ALL_PRICE",nullable=true,precision=10,scale=2) + public BigDecimal getGoAllPrice(){ + return this.goAllPrice; + } + + /** + *鏂规硶: 璁剧疆BigDecimal + *@param: BigDecimal 鎬讳环(涓嶅惈杩旀) + */ + public void setGoAllPrice(BigDecimal goAllPrice){ + this.goAllPrice = goAllPrice; + } + /** + *鏂规硶: 鍙栧緱BigDecimal + *@return: BigDecimal 杩旀 + */ + @Column(name ="GO_RETURN_PRICE",nullable=true,precision=10,scale=2) + public BigDecimal getGoReturnPrice(){ + return this.goReturnPrice; + } + + /** + *鏂规硶: 璁剧疆BigDecimal + *@param: BigDecimal 杩旀 + */ + public void setGoReturnPrice(BigDecimal goReturnPrice){ + this.goReturnPrice = goReturnPrice; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 澶囨敞 + */ + @Column(name ="GO_CONTENT",nullable=true,length=66) + public java.lang.String getGoContent(){ + return this.goContent; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 澶囨敞 + */ + public void setGoContent(java.lang.String goContent){ + this.goContent = goContent; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜 + */ + @Column(name ="CRTUSER",nullable=true,length=12) + public java.lang.String getCrtuser(){ + return this.crtuser; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜 + */ + public void setCrtuser(java.lang.String crtuser){ + this.crtuser = crtuser; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕瀛 + */ + @Column(name ="CRTUSER_NAME",nullable=true,length=10) + public java.lang.String getCrtuserName(){ + return this.crtuserName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕瀛 + */ + public void setCrtuserName(java.lang.String crtuserName){ + this.crtuserName = crtuserName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + @Column(name ="CREATE_DT",nullable=true) + public java.util.Date getCreateDt(){ + return this.createDt; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDt(java.util.Date createDt){ + this.createDt = createDt; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜 + */ + @Column(name ="MODIFIER",nullable=true,length=12) + public java.lang.String getModifier(){ + return this.modifier; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜 + */ + public void setModifier(java.lang.String modifier){ + this.modifier = modifier; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜哄悕瀛 + */ + @Column(name ="MODIFIER_NAME",nullable=true,length=10) + public java.lang.String getModifierName(){ + return this.modifierName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜哄悕瀛 + */ + public void setModifierName(java.lang.String modifierName){ + this.modifierName = modifierName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 淇敼鏃堕棿 + */ + @Column(name ="MODIFY_DT",nullable=true) + public java.util.Date getModifyDt(){ + return this.modifyDt; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 淇敼鏃堕棿 + */ + public void setModifyDt(java.util.Date modifyDt){ + this.modifyDt = modifyDt; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 鍒犻櫎鏍囪 + */ + @Column(name ="DELFLAG",nullable=true,precision=10,scale=0) + public java.lang.Integer getDelflag(){ + return this.delflag; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 鍒犻櫎鏍囪 + */ + public void setDelflag(java.lang.Integer delflag){ + this.delflag = delflag; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒犻櫎鏃堕棿 + */ + @Column(name ="DEL_DT",nullable=true) + public java.util.Date getDelDt(){ + return this.delDt; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒犻櫎鏃堕棿 + */ + public void setDelDt(java.util.Date delDt){ + this.delDt = delDt; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgOrderProductEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgOrderProductEntity.java new file mode 100644 index 00000000..2c246bdd --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/JeecgOrderProductEntity.java @@ -0,0 +1,318 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 璁㈠崟浜у搧淇℃伅 + * @author 寮犱唬娴 + * @date 2013-03-19 22:15:01 + * @version V1.0 + * + */ +@Entity +@Table(name = "jeecg_order_product", schema = "") +@SuppressWarnings("serial") +public class JeecgOrderProductEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**鍥㈣喘璁㈠崟鍙*/ + private java.lang.String goOrderCode; + /**鏈嶅姟椤圭洰绫诲瀷*/ + private java.lang.String gopProductType; + /**浜у搧鍚嶇О*/ + private java.lang.String gopProductName; + /**涓暟*/ + private java.lang.Integer gopCount; + /**鍗曚环*/ + private BigDecimal gopOnePrice; + /**灏忚*/ + private BigDecimal gopSumPrice; + /**澶囨敞*/ + private java.lang.String gopContent; + /**鍒涘缓浜*/ + private java.lang.String crtuser; + /**鍒涘缓浜哄悕瀛*/ + private java.lang.String crtuserName; + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDt; + /**淇敼浜*/ + private java.lang.String modifier; + /**淇敼浜哄悕瀛*/ + private java.lang.String modifierName; + /**淇敼鏃堕棿*/ + private java.util.Date modifyDt; + /**鍒犻櫎鏍囪*/ + private java.lang.Integer delflag; + /**鍒犻櫎鏃堕棿*/ + private java.util.Date delDt; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍥㈣喘璁㈠崟鍙 + */ + @Column(name ="GO_ORDER_CODE",nullable=false,length=12) + public java.lang.String getGoOrderCode(){ + return this.goOrderCode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍥㈣喘璁㈠崟鍙 + */ + public void setGoOrderCode(java.lang.String goOrderCode){ + this.goOrderCode = goOrderCode; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏈嶅姟椤圭洰绫诲瀷 + */ + @Column(name ="GOP_PRODUCT_TYPE",nullable=false,length=1) + public java.lang.String getGopProductType(){ + return this.gopProductType; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏈嶅姟椤圭洰绫诲瀷 + */ + public void setGopProductType(java.lang.String gopProductType){ + this.gopProductType = gopProductType; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 浜у搧鍚嶇О + */ + @Column(name ="GOP_PRODUCT_NAME",nullable=true,length=33) + public java.lang.String getGopProductName(){ + return this.gopProductName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 浜у搧鍚嶇О + */ + public void setGopProductName(java.lang.String gopProductName){ + this.gopProductName = gopProductName; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 涓暟 + */ + @Column(name ="GOP_COUNT",nullable=true,precision=10,scale=0) + public java.lang.Integer getGopCount(){ + return this.gopCount; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 涓暟 + */ + public void setGopCount(java.lang.Integer gopCount){ + this.gopCount = gopCount; + } + /** + *鏂规硶: 鍙栧緱BigDecimal + *@return: BigDecimal 鍗曚环 + */ + @Column(name ="GOP_ONE_PRICE",nullable=true,precision=10,scale=2) + public BigDecimal getGopOnePrice(){ + return this.gopOnePrice; + } + + /** + *鏂规硶: 璁剧疆BigDecimal + *@param: BigDecimal 鍗曚环 + */ + public void setGopOnePrice(BigDecimal gopOnePrice){ + this.gopOnePrice = gopOnePrice; + } + /** + *鏂规硶: 鍙栧緱BigDecimal + *@return: BigDecimal 灏忚 + */ + @Column(name ="GOP_SUM_PRICE",nullable=true,precision=10,scale=2) + public BigDecimal getGopSumPrice(){ + return this.gopSumPrice; + } + + /** + *鏂规硶: 璁剧疆BigDecimal + *@param: BigDecimal 灏忚 + */ + public void setGopSumPrice(BigDecimal gopSumPrice){ + this.gopSumPrice = gopSumPrice; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 澶囨敞 + */ + @Column(name ="GOP_CONTENT",nullable=true,length=66) + public java.lang.String getGopContent(){ + return this.gopContent; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 澶囨敞 + */ + public void setGopContent(java.lang.String gopContent){ + this.gopContent = gopContent; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜 + */ + @Column(name ="CRTUSER",nullable=true,length=12) + public java.lang.String getCrtuser(){ + return this.crtuser; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜 + */ + public void setCrtuser(java.lang.String crtuser){ + this.crtuser = crtuser; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕瀛 + */ + @Column(name ="CRTUSER_NAME",nullable=true,length=10) + public java.lang.String getCrtuserName(){ + return this.crtuserName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕瀛 + */ + public void setCrtuserName(java.lang.String crtuserName){ + this.crtuserName = crtuserName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + @Column(name ="CREATE_DT",nullable=true) + public java.util.Date getCreateDt(){ + return this.createDt; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDt(java.util.Date createDt){ + this.createDt = createDt; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜 + */ + @Column(name ="MODIFIER",nullable=true,length=12) + public java.lang.String getModifier(){ + return this.modifier; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜 + */ + public void setModifier(java.lang.String modifier){ + this.modifier = modifier; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜哄悕瀛 + */ + @Column(name ="MODIFIER_NAME",nullable=true,length=10) + public java.lang.String getModifierName(){ + return this.modifierName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜哄悕瀛 + */ + public void setModifierName(java.lang.String modifierName){ + this.modifierName = modifierName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 淇敼鏃堕棿 + */ + @Column(name ="MODIFY_DT",nullable=true) + public java.util.Date getModifyDt(){ + return this.modifyDt; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 淇敼鏃堕棿 + */ + public void setModifyDt(java.util.Date modifyDt){ + this.modifyDt = modifyDt; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 鍒犻櫎鏍囪 + */ + @Column(name ="DELFLAG",nullable=true,precision=10,scale=0) + public java.lang.Integer getDelflag(){ + return this.delflag; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 鍒犻櫎鏍囪 + */ + public void setDelflag(java.lang.Integer delflag){ + this.delflag = delflag; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒犻櫎鏃堕棿 + */ + @Column(name ="DEL_DT",nullable=true) + public java.util.Date getDelDt(){ + return this.delDt; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒犻櫎鏃堕棿 + */ + public void setDelDt(java.util.Date delDt){ + this.delDt = delDt; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/JpPersonEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/JpPersonEntity.java new file mode 100644 index 00000000..255a4e26 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/JpPersonEntity.java @@ -0,0 +1,146 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Title: Entity + * @Description: Excel瀵煎嚭 + * @author 寮犱唬娴 + * @date 2013-03-23 21:45:28 + * @version V1.0 + * + */ +@Entity +@Table(name = "jg_person", schema = "") +@SuppressWarnings("serial") +public class JpPersonEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**骞撮緞*/ + @Excel(name="骞撮緞", width = 10) + private java.lang.Integer age; + /**鐢熸棩*/ + @Excel(name="鐢熸棩", format = "yyyy-MM-dd", width = 30) + private java.util.Date birthday; + /**鍑虹敓鏃ユ湡*/ + @Excel(name="鍑虹敓鏃ユ湡", format ="yyyy-MM-dd HH:mm:ss", width = 30) + private java.util.Date createdt; + /**鐢ㄦ埛鍚*/ + @Excel(name="鐢ㄦ埛鍚", height = 20) + private java.lang.String name; + /**宸ヨ祫*/ + @Excel(name="宸ヨ祫") + private BigDecimal salary; + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 骞撮緞 + */ + @Column(name ="AGE",nullable=false,precision=10,scale=0) + public java.lang.Integer getAge(){ + return this.age; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 骞撮緞 + */ + public void setAge(java.lang.Integer age){ + this.age = age; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鐢熸棩 + */ + @Column(name ="BIRTHDAY",nullable=true) + public java.util.Date getBirthday(){ + return this.birthday; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鐢熸棩 + */ + public void setBirthday(java.util.Date birthday){ + this.birthday = birthday; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍑虹敓鏃ユ湡 + */ + @Column(name ="CREATEDT",nullable=false) + public java.util.Date getCreatedt(){ + return this.createdt; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍑虹敓鏃ユ湡 + */ + public void setCreatedt(java.util.Date createdt){ + this.createdt = createdt; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鐢ㄦ埛鍚 + */ + @Column(name ="NAME",nullable=true,length=255) + public java.lang.String getName(){ + return this.name; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鐢ㄦ埛鍚 + */ + public void setName(java.lang.String name){ + this.name = name; + } + /** + *鏂规硶: 鍙栧緱BigDecimal + *@return: BigDecimal 宸ヨ祫 + */ + @Column(name ="SALARY",nullable=false,precision=19,scale=2) + public BigDecimal getSalary(){ + return this.salary; + } + + /** + *鏂规硶: 璁剧疆BigDecimal + *@param: BigDecimal 宸ヨ祫 + */ + public void setSalary(BigDecimal salary){ + this.salary = salary; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/OptimisticLockingEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/OptimisticLockingEntity.java new file mode 100644 index 00000000..6a48b569 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/OptimisticLockingEntity.java @@ -0,0 +1,127 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Version; + +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.OptimisticLock; + +import javax.persistence.SequenceGenerator; + +/** + * @Title: Entity + * @Description: 涔愯閿佹祴璇 + * @author 寮犱唬娴 + * @date 2013-06-24 14:46:42 + * @version V1.0 + * + */ +@Entity +@Table(name = "OPTIMISTIC_LOCKING", schema = "") +@SuppressWarnings("serial") +public class OptimisticLockingEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**name*/ + private java.lang.String name; + /**age*/ + private java.lang.Integer age; + /**account*/ + private java.lang.Integer account; + /**ver*/ + private java.lang.Integer ver; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String name + */ + @Column(name ="NAME",nullable=true,length=85) + public java.lang.String getName(){ + return this.name; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String name + */ + public void setName(java.lang.String name){ + this.name = name; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer age + */ + @Column(name ="AGE",nullable=true,precision=10,scale=0) + public java.lang.Integer getAge(){ + return this.age; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer age + */ + public void setAge(java.lang.Integer age){ + this.age = age; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer account + */ + @Column(name ="ACCOUNT",nullable=true,precision=10,scale=0) + public java.lang.Integer getAccount(){ + return this.account; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer account + */ + public void setAccount(java.lang.Integer account){ + this.account = account; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer ver + */ + @Version + @Column(name="VER") + public java.lang.Integer getVer(){ + return this.ver; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer ver + */ + public void setVer(java.lang.Integer ver){ + this.ver = ver; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/QueryCondition.java b/src/main/java/org/jeecgframework/web/demo/entity/test/QueryCondition.java new file mode 100644 index 00000000..5f776886 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/QueryCondition.java @@ -0,0 +1,64 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.util.List; + +public class QueryCondition { + String field; + String type; + String condition; + String value; + String relation; + List children; + + public List getChildren() { + return children; + } + public void setChildren(List children) { + this.children = children; + } + public String getField() { + return field; + } + public void setField(String field) { + this.field = field; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getCondition() { + return condition; + } + public void setCondition(String condition) { + this.condition = condition; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + public String getRelation() { + return relation; + } + public void setRelation(String relation) { + this.relation = relation; + } + public String toString(){ + StringBuffer sb =new StringBuffer(); + sb.append(this.relation).append(" "); + sb.append(this.field).append(" ") + .append(this.condition).append(" "); + if("java.util.Date".equals(this.type)){ + sb.append("to_date('").append(this.value).append("','yyyy-MM-dd')"); + }else if("java.lang.Number".equals(this.type) + ||this.condition.indexOf("in")>0){//TODO 闇瑕佹寜绫诲瀷澶勭悊 + sb.append(this.value); + }else{ + sb.append("'").append(this.value).append("'");//TODO 闇瑕佸鐞嗙壒娈婂瓧绗 + } + return sb.toString(); + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/StudentEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/StudentEntity.java new file mode 100644 index 00000000..5ef7b3b7 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/StudentEntity.java @@ -0,0 +1,122 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.GenericGenerator; +import org.jeecgframework.poi.excel.annotation.Excel; + +import javax.persistence.SequenceGenerator; + +/** + * @Title: Entity + * @Description: 瀛︾敓 + * @author jueyue + * @date 2013-08-31 22:53:34 + * @version V1.0 + * + */ +@Entity +@Table(name = "jeecg_demo_student", schema = "") +@DynamicUpdate(true) +@DynamicInsert(true) +@SuppressWarnings("serial") +public class StudentEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**瀛︾敓濮撳悕*/ + @Excel(name="瀛︾敓濮撳悕") + private java.lang.String name; + /**瀛︾敓鎬у埆*/ + @Excel(name="瀛︾敓鎬у埆",replace = {"濂崇敓_1","鐢风敓_0"}) + private java.lang.String sex; + + @Excel(name="鍑虹敓鏃ユ湡",exportFormat="yyyy-MM-dd HH:mm:ss",importFormat="yyyy-MM-dd HH:mm:ss") + private Date birthday; + /**璇剧▼涓婚敭*/ + private CourseEntity course; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 瀛︾敓濮撳悕 + */ + @Column(name ="NAME",nullable=true,length=32) + public java.lang.String getName(){ + return this.name; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 瀛︾敓濮撳悕 + */ + public void setName(java.lang.String name){ + this.name = name; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 瀛︾敓鎬у埆 + */ + @Column(name ="SEX",nullable=true,length=1) + public java.lang.String getSex(){ + return this.sex; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 瀛︾敓鎬у埆 + */ + public void setSex(java.lang.String sex){ + this.sex = sex; + } + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "COURSE_ID") + public CourseEntity getCourse() { + return course; + } + + public void setCourse(CourseEntity course) { + this.course = course; + } + + @Column(name ="BIRTHDAY",nullable=true) + public Date getBirthday() { + return birthday; + } + + public void setBirthday(Date birthday) { + this.birthday = birthday; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/TFinanceEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/TFinanceEntity.java new file mode 100644 index 00000000..099d8682 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/TFinanceEntity.java @@ -0,0 +1,348 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 璧勯噾绠$悊 + * @author tanghong + * @date 2013-06-26 23:57:04 + * @version V1.0 + * + */ +@Entity +@Table(name = "t_finance", schema = "") +@SuppressWarnings("serial") +public class TFinanceEntity implements java.io.Serializable { + /**涓婚敭*/ + private java.lang.String id; + /**绫诲埆*/ + private java.lang.String category; + /**骞翠唤*/ + private java.lang.Integer happenyear; + /**鎷ㄦ鏃堕棿*/ + private java.util.Date paytime; + /**鏀舵鍗曚綅*/ + private java.lang.String collectorg; + /**鎷ㄦ鏂囦欢绫诲埆*/ + private java.lang.String approfiletype; + /**鎸囨爣鏂囧彿*/ + private java.lang.String zbwno; + /**閲戦鍚堣*/ + private java.lang.Float moneytotal; + /**鏀嚭绉戠洰*/ + private java.lang.String expenseaccount; + /**璧勯噾鐢ㄩ*/ + private java.lang.String moneyuse; + /**鍒楁敮鍦板尯*/ + private java.lang.String moneyarea; + /**璧勯噾鏉ユ簮*/ + private java.lang.String moneysource; + /**閲囪喘骞翠唤*/ + private java.lang.String buyyear; + /**閲囪喘椤圭洰鍙*/ + private java.lang.String buyprojectno; + /**閲囪喘椤圭洰鍗曚綅*/ + private java.lang.String buyprojectorg; + /**閲囪喘閲戦*/ + private java.lang.Float buymoney; + /**閲囪喘鐢ㄩ*/ + private java.lang.String buyuse; + + private List financeFiles; + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 绫诲埆 + */ + @Column(name ="CATEGORY",nullable=true,length=255) + public java.lang.String getCategory(){ + return this.category; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 绫诲埆 + */ + public void setCategory(java.lang.String category){ + this.category = category; + } + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer 骞翠唤 + */ + @Column(name ="HAPPENYEAR",nullable=true,precision=10,scale=0) + public java.lang.Integer getHappenyear(){ + return this.happenyear; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer 骞翠唤 + */ + public void setHappenyear(java.lang.Integer happenyear){ + this.happenyear = happenyear; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鎷ㄦ鏃堕棿 + */ + @Column(name ="PAYTIME",nullable=true) + public java.util.Date getPaytime(){ + return this.paytime; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鎷ㄦ鏃堕棿 + */ + public void setPaytime(java.util.Date paytime){ + this.paytime = paytime; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏀舵鍗曚綅 + */ + @Column(name ="COLLECTORG",nullable=true,length=255) + public java.lang.String getCollectorg(){ + return this.collectorg; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏀舵鍗曚綅 + */ + public void setCollectorg(java.lang.String collectorg){ + this.collectorg = collectorg; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎷ㄦ鏂囦欢绫诲埆 + */ + @Column(name ="APPROFILETYPE",nullable=true,length=255) + public java.lang.String getApprofiletype(){ + return this.approfiletype; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎷ㄦ鏂囦欢绫诲埆 + */ + public void setApprofiletype(java.lang.String approfiletype){ + this.approfiletype = approfiletype; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎸囨爣鏂囧彿 + */ + @Column(name ="ZBWNO",nullable=true,length=255) + public java.lang.String getZbwno(){ + return this.zbwno; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎸囨爣鏂囧彿 + */ + public void setZbwno(java.lang.String zbwno){ + this.zbwno = zbwno; + } + /** + *鏂规硶: 鍙栧緱java.lang.Float + *@return: java.lang.Float 閲戦鍚堣 + */ + @Column(name ="MONEYTOTAL",nullable=true,precision=12) + public java.lang.Float getMoneytotal(){ + return this.moneytotal; + } + + /** + *鏂规硶: 璁剧疆java.lang.Float + *@param: java.lang.Float 閲戦鍚堣 + */ + public void setMoneytotal(java.lang.Float moneytotal){ + this.moneytotal = moneytotal; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏀嚭绉戠洰 + */ + @Column(name ="EXPENSEACCOUNT",nullable=true,length=255) + public java.lang.String getExpenseaccount(){ + return this.expenseaccount; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏀嚭绉戠洰 + */ + public void setExpenseaccount(java.lang.String expenseaccount){ + this.expenseaccount = expenseaccount; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 璧勯噾鐢ㄩ + */ + @Column(name ="MONEYUSE",nullable=true,length=255) + public java.lang.String getMoneyuse(){ + return this.moneyuse; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 璧勯噾鐢ㄩ + */ + public void setMoneyuse(java.lang.String moneyuse){ + this.moneyuse = moneyuse; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒楁敮鍦板尯 + */ + @Column(name ="MONEYAREA",nullable=true,length=255) + public java.lang.String getMoneyarea(){ + return this.moneyarea; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒楁敮鍦板尯 + */ + public void setMoneyarea(java.lang.String moneyarea){ + this.moneyarea = moneyarea; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 璧勯噾鏉ユ簮 + */ + @Column(name ="MONEYSOURCE",nullable=true,length=255) + public java.lang.String getMoneysource(){ + return this.moneysource; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 璧勯噾鏉ユ簮 + */ + public void setMoneysource(java.lang.String moneysource){ + this.moneysource = moneysource; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 閲囪喘骞翠唤 + */ + @Column(name ="BUYYEAR",nullable=true,length=255) + public java.lang.String getBuyyear(){ + return this.buyyear; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 閲囪喘骞翠唤 + */ + public void setBuyyear(java.lang.String buyyear){ + this.buyyear = buyyear; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 閲囪喘椤圭洰鍙 + */ + @Column(name ="BUYPROJECTNO",nullable=true,length=255) + public java.lang.String getBuyprojectno(){ + return this.buyprojectno; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 閲囪喘椤圭洰鍙 + */ + public void setBuyprojectno(java.lang.String buyprojectno){ + this.buyprojectno = buyprojectno; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 閲囪喘椤圭洰鍗曚綅 + */ + @Column(name ="BUYPROJECTORG",nullable=true,length=255) + public java.lang.String getBuyprojectorg(){ + return this.buyprojectorg; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 閲囪喘椤圭洰鍗曚綅 + */ + public void setBuyprojectorg(java.lang.String buyprojectorg){ + this.buyprojectorg = buyprojectorg; + } + /** + *鏂规硶: 鍙栧緱java.lang.Float + *@return: java.lang.Float 閲囪喘閲戦 + */ + @Column(name ="BUYMONEY",nullable=true,precision=12) + public java.lang.Float getBuymoney(){ + return this.buymoney; + } + + /** + *鏂规硶: 璁剧疆java.lang.Float + *@param: java.lang.Float 閲囪喘閲戦 + */ + public void setBuymoney(java.lang.Float buymoney){ + this.buymoney = buymoney; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 閲囪喘鐢ㄩ + */ + @Column(name ="BUYUSE",nullable=true,length=255) + public java.lang.String getBuyuse(){ + return this.buyuse; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 閲囪喘鐢ㄩ + */ + public void setBuyuse(java.lang.String buyuse){ + this.buyuse = buyuse; + } + + @OneToMany(mappedBy="finance",cascade={CascadeType.REMOVE}) + public List getFinanceFiles() { + return financeFiles; + } + + public void setFinanceFiles(List financeFiles) { + this.financeFiles = financeFiles; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/TFinanceFilesEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/TFinanceFilesEntity.java new file mode 100644 index 00000000..518a7e72 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/TFinanceFilesEntity.java @@ -0,0 +1,40 @@ +package org.jeecgframework.web.demo.entity.test; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.Table; + +import org.jeecgframework.web.system.pojo.base.TSAttachment; + +/** + * @Title: Entity + * @Description: 璧勯噾绠$悊闄勪欢 + * @author tanghong + * @date 2013-06-26 23:57:04 + * @version V1.0 + * + */ +@Entity +@Table(name = "t_finance_files", schema = "") +@PrimaryKeyJoinColumn(name = "id") +@SuppressWarnings("serial") +public class TFinanceFilesEntity extends TSAttachment implements java.io.Serializable { + + private TFinanceEntity finance; + + + @ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REFRESH},fetch = FetchType.LAZY) + @JoinColumn(name = "financeId") + public TFinanceEntity getFinance() { + return finance; + } + + public void setFinance(TFinanceEntity finance) { + this.finance = finance; + } + +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/TSStudent.java b/src/main/java/org/jeecgframework/web/demo/entity/test/TSStudent.java new file mode 100644 index 00000000..1e8397fa --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/TSStudent.java @@ -0,0 +1,36 @@ +package org.jeecgframework.web.demo.entity.test; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; + +@Entity +@Table(name = "t_s_student") +public class TSStudent extends IdEntity implements java.io.Serializable{ + private String name; + private String sex; + private String className; + @Column(name = "name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + @Column(name = "sex") + public String getSex() { + return sex; + } + public void setSex(String sex) { + this.sex = sex; + } + @Column(name = "classname") + public String getClassName() { + return className; + } + public void setClassName(String className) { + this.className = className; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/TeacherEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/TeacherEntity.java new file mode 100644 index 00000000..b642e6b4 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/TeacherEntity.java @@ -0,0 +1,91 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.apache.commons.lang.StringUtils; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.GenericGenerator; +import org.jeecgframework.poi.excel.annotation.Excel; + +import javax.persistence.SequenceGenerator; + +/** + * @Title: Entity + * @Description: 璇剧▼鑰佸笀 + * @author jueyue + * @date 2013-08-31 22:52:17 + * @version V1.0 + * + */ +@Entity +@Table(name = "jeecg_demo_teacher", schema = "") +@DynamicUpdate(true) +@DynamicInsert(true) +@SuppressWarnings("serial") +public class TeacherEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**name*/ + @Excel(name="鑰佸笀濮撳悕",orderNum="2",needMerge=true) + private java.lang.String name; + + @Excel(name="鑰佸笀鐓х墖",orderNum="3",type=2,height=15,width=20) + private java.lang.String pic; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String name + */ + @Column(name ="NAME",nullable=true,length=12) + public java.lang.String getName(){ + return this.name; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String name + */ + public void setName(java.lang.String name){ + this.name = name; + } + + public java.lang.String getPic() { +// if(StringUtils.isEmpty(pic)){ +// pic = "plug-in/login/images/jeecg.png"; +// } + return pic; + } + + public void setPic(java.lang.String pic) { + this.pic = pic; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/entity/test/WebOfficeEntity.java b/src/main/java/org/jeecgframework/web/demo/entity/test/WebOfficeEntity.java new file mode 100644 index 00000000..fbf190fe --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/entity/test/WebOfficeEntity.java @@ -0,0 +1,136 @@ +package org.jeecgframework.web.demo.entity.test; + +import java.sql.Blob; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * @Title: Entity + * @Description: WebOffice渚嬪瓙 + * @author 寮犱唬娴 + * @date 2013-07-08 10:54:19 + * @version V1.0 + * + */ +@Entity +@Table(name = "doc", schema = "") +@SuppressWarnings("serial") +public class WebOfficeEntity implements java.io.Serializable { + /**id*/ + private java.lang.Integer id; + /**docid*/ + private java.lang.String docid; + /**doctitle*/ + private java.lang.String doctitle; + /**doctype*/ + private java.lang.String doctype; + /**docdate*/ + private java.util.Date docdate; + /**doccontent*/ + private Blob doccontent; + + /** + *鏂规硶: 鍙栧緱java.lang.Integer + *@return: java.lang.Integer id + */ + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name ="ID",nullable=false,length=32) + public java.lang.Integer getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.Integer + *@param: java.lang.Integer id + */ + public void setId(java.lang.Integer id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String docid + */ + @Column(name ="DOCID",nullable=true,length=255) + public java.lang.String getDocid(){ + return this.docid; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String docid + */ + public void setDocid(java.lang.String docid){ + this.docid = docid; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String doctitle + */ + @Column(name ="DOCTITLE",nullable=true,length=255) + public java.lang.String getDoctitle(){ + return this.doctitle; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String doctitle + */ + public void setDoctitle(java.lang.String doctitle){ + this.doctitle = doctitle; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String doctype + */ + @Column(name ="DOCTYPE",nullable=true,length=255) + public java.lang.String getDoctype(){ + return this.doctype; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String doctype + */ + public void setDoctype(java.lang.String doctype){ + this.doctype = doctype; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date docdate + */ + @Column(name ="DOCDATE",nullable=true) + public java.util.Date getDocdate(){ + return this.docdate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date docdate + */ + public void setDocdate(java.util.Date docdate){ + this.docdate = docdate; + } + /** + *鏂规硶: 鍙栧緱Blob + *@return: Blob doccontent + */ + @Column(name ="DOCCONTENT",nullable=true) + public Blob getDoccontent(){ + return this.doccontent; + } + + /** + *鏂规硶: 璁剧疆Blob + *@param: Blob doccontent + */ + public void setDoccontent(Blob doccontent){ + this.doccontent = doccontent; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/page/JeecgOrderMainPage.java b/src/main/java/org/jeecgframework/web/demo/page/JeecgOrderMainPage.java new file mode 100644 index 00000000..87f26df7 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/page/JeecgOrderMainPage.java @@ -0,0 +1,35 @@ +package org.jeecgframework.web.demo.page; + +import java.util.ArrayList; +import java.util.List; + +import org.jeecgframework.web.demo.entity.test.JeecgOrderCustomEntity; +import org.jeecgframework.web.demo.entity.test.JeecgOrderProductEntity; + +/** + * @Title: Entity + * @Description: 璁㈠崟淇℃伅 VO + * @author 寮犱唬娴 + * @date 2013-03-19 22:01:34 + * @version V1.0 + * + */ +@SuppressWarnings("serial") +public class JeecgOrderMainPage implements java.io.Serializable { + /**璁㈠崟瀹㈡埛鏄庣粏*/ + private List jeecgOrderCustomList = new ArrayList(); + public List getJeecgOrderCustomList() { + return jeecgOrderCustomList; + } + public void setJeecgOrderCustomList(List jeecgOrderCustomList) { + this.jeecgOrderCustomList = jeecgOrderCustomList; + } + /**璁㈠崟浜у搧鏄庣粏*/ + private List jeecgOrderProductList = new ArrayList(); + public List getJeecgOrderProductList() { + return jeecgOrderProductList; + } + public void setJeecgOrderProductList(List jeecgOrderProductList) { + this.jeecgOrderProductList = jeecgOrderProductList; + } +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/CourseServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/CourseServiceImpl.java new file mode 100644 index 00000000..f2f34985 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/CourseServiceImpl.java @@ -0,0 +1,36 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.jeecgframework.web.demo.entity.test.CourseEntity; +import org.jeecgframework.web.demo.entity.test.StudentEntity; +import org.jeecgframework.web.demo.service.test.CourseServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; + +@Service("courseService") +@Transactional +public class CourseServiceImpl extends CommonServiceImpl implements CourseServiceI { + + + public void saveCourse(CourseEntity course) { + this.save(course.getTeacher()); + this.save(course); + for (StudentEntity s :course.getStudents()){ + s.setCourse(course); + } + this.batchSave(course.getStudents()); + + } + + + public void updateCourse(CourseEntity course) { + this.updateEntitie(course); + this.updateEntitie(course.getTeacher()); + for (StudentEntity s :course.getStudents()){ + s.setCourse(course); + this.saveOrUpdate(s); + } + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgBlobDataServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgBlobDataServiceImpl.java new file mode 100644 index 00000000..28934146 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgBlobDataServiceImpl.java @@ -0,0 +1,38 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import java.io.IOException; +import java.sql.Blob; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import org.jeecgframework.web.demo.entity.test.JeecgBlobDataEntity; +import org.jeecgframework.web.demo.service.test.JeecgBlobDataServiceI; + +import org.hibernate.LobHelper; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; + +@Service("jeecgBlobDataService") +@Transactional +public class JeecgBlobDataServiceImpl extends CommonServiceImpl implements JeecgBlobDataServiceI { + + public void saveObj(String documentTitle, MultipartFile file) { + JeecgBlobDataEntity obj = new JeecgBlobDataEntity(); + LobHelper lobHelper = commonDao.getSession().getLobHelper(); + Blob data; + try { + data = lobHelper.createBlob(file.getInputStream(), 0); + obj.setAttachmentcontent(data); + } catch (IOException e) { + e.printStackTrace(); + } + obj.setAttachmenttitle(documentTitle); + String sFileName = file.getOriginalFilename(); + int iPos = sFileName.lastIndexOf('.'); + if (iPos >= 0) { + obj.setExtend(sFileName.substring(iPos+1)); + } + super.save(obj); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgDemoCkfinderServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgDemoCkfinderServiceImpl.java new file mode 100644 index 00000000..830e36af --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgDemoCkfinderServiceImpl.java @@ -0,0 +1,14 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.jeecgframework.web.demo.service.test.JeecgDemoCkfinderServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; + +@Service("jeecgDemoCkfinderService") +@Transactional +public class JeecgDemoCkfinderServiceImpl extends CommonServiceImpl implements + JeecgDemoCkfinderServiceI { + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgDemoServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgDemoServiceImpl.java new file mode 100644 index 00000000..2aea598a --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgDemoServiceImpl.java @@ -0,0 +1,14 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import org.jeecgframework.web.demo.service.test.JeecgDemoServiceI; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service("jeecgDemoService") +@Transactional +public class JeecgDemoServiceImpl extends CommonServiceImpl implements JeecgDemoServiceI { + +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgJdbcServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgJdbcServiceImpl.java new file mode 100644 index 00000000..f5d066eb --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgJdbcServiceImpl.java @@ -0,0 +1,292 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.demo.entity.test.JeecgJdbcEntity; +import org.jeecgframework.web.demo.service.test.JeecgJdbcServiceI; +import net.sf.json.JSONObject; + +import org.jeecgframework.core.common.dao.jdbc.JdbcDao; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.JeecgSqlUtil; +import org.jeecgframework.core.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service("jeecgJdbcService") +@Transactional +public class JeecgJdbcServiceImpl extends CommonServiceImpl implements JeecgJdbcServiceI { + + @Autowired + private JdbcDao jdbcDao; + + // wait to do: 鍙傛暟(JeecgJdbcEntity pageObj, DataGrid dataGrid)涓敤鍒扮殑鏁版嵁涓嶅锛屽彲浠ヨ冭檻鍙樹竴涓嬨傘傘 + // 瀹為檯涓婂彧鏈塹uery鐨勬潯浠讹紝浠ュ強dataGrid閲岀殑鍒嗛〉鐨勬暟鎹 + + // 鏂瑰紡1, 鐢ㄥ簳灞傝嚜甯︾殑鏂瑰紡寰瀵硅薄涓鍊 ------------------- + + public void getDatagrid1(JeecgJdbcEntity pageObj, DataGrid dataGrid) { + //* + String sqlWhere = getSqlWhere(pageObj); + + // 鍙栧嚭鎬绘暟鎹潯鏁帮紙涓轰簡鍒嗛〉澶勭悊, 濡傛灉涓嶇敤鍒嗛〉锛屽彇iCount鍊肩殑杩欎釜澶勭悊鍙互涓嶈锛 + String sqlCnt = "select count(*) from jeecg_demo t"; + if (!sqlWhere.isEmpty()) { + sqlCnt += " where" + sqlWhere; + } + Long iCount = getCountForJdbcParam(sqlCnt, null); + + + String sql = "select t.id,t.user_name as userName,d.departname as depId,t.sex,t.age,t.birthday,t.email,t.mobile_phone as mobilePhone from jeecg_demo t left join t_s_depart d on d.id=t.dep_id"; + if (!sqlWhere.isEmpty()) { + sql += " where" + sqlWhere; + } + // 缁撴灉寰JeecgDemo杩欎釜绫荤殑鍚勫睘鎬т腑璁惧硷紙灞炴у悕濡傛灉鍜屾暟鎹簱涓笉涓鑷达紝闇瑕佸湪SQL鏂囦腑鍛藉埆鍚嶏紝濡倁serName锛 + List list = findObjForJdbc(sql, dataGrid.getPage(), dataGrid.getRows(), JeecgJdbcEntity.class); + // sex(鎬у埆鐨勫鐞嗚鏂瑰紡2,鍙被浼煎鐞嗭紝閲嶆柊寰幆涓閬) + + // 杩斿洖Grid鏁版嵁 + dataGrid.setResults(list); + dataGrid.setTotal(iCount.intValue()); + } + // end of 鏂瑰紡1 ========================================= */ + + public void getDatagrid2(JeecgJdbcEntity pageObj, DataGrid dataGrid) { + String sqlWhere = getSqlWhere(pageObj); + + // 鍙栧嚭鎬绘暟鎹潯鏁帮紙涓轰簡鍒嗛〉澶勭悊, 濡傛灉涓嶇敤鍒嗛〉锛屽彇iCount鍊肩殑杩欎釜澶勭悊鍙互涓嶈锛 + String sqlCnt = "select count(*) from jeecg_demo t"; + if (!sqlWhere.isEmpty()) { + sqlCnt += " where" + sqlWhere; + } + Long iCount = getCountForJdbcParam(sqlCnt, null); + + + String sql = "select t.*,d.departname from jeecg_demo t left join t_s_depart d on d.id=t.dep_id"; + if (!sqlWhere.isEmpty()) { + sql += " where" + sqlWhere; + } + List> mapList = findForJdbc(sql, dataGrid.getPage(), dataGrid.getRows()); + + List list = new ArrayList(); + JeecgJdbcEntity obj = null; + for(Map m:mapList){ + try { + obj = new JeecgJdbcEntity(); + obj.setId((String)m.get("id")); + obj.setUserName((String)m.get("user_name")); + obj.setDepId((String)m.get("departname")); + String sex = (String)m.get("sex"); + if (sex == null) { + obj.setSex(""); + } else if (sex.equals("0")) { + obj.setSex("鐢"); + } else { + obj.setSex("濂"); + } + obj.setAge((Integer)m.get("age")); + Date birthday = (Date)m.get("birthday"); + if (birthday != null) { + obj.setBirthday(birthday); + } + obj.setEmail((String)m.get("email")); + obj.setMobilePhone((String)m.get("mobile_phone")); + list.add(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 杩斿洖Grid鏁版嵁 + dataGrid.setResults(list); + dataGrid.setTotal(iCount.intValue()); + } + // end of 鏂瑰紡2 ========================================= */ + + // 鎺ㄨ崘鏂规硶 + + public JSONObject getDatagrid3(JeecgJdbcEntity pageObj, DataGrid dataGrid) { + String sqlWhere = getSqlWhere(pageObj); + + // 鍙栧嚭鎬绘暟鎹潯鏁帮紙涓轰簡鍒嗛〉澶勭悊, 濡傛灉涓嶇敤鍒嗛〉锛屽彇iCount鍊肩殑杩欎釜澶勭悊鍙互涓嶈锛 + String sqlCnt = "select count(*) from jeecg_demo t"; + if (!sqlWhere.isEmpty()) { + sqlCnt += " where" + sqlWhere; + } + Long iCount = getCountForJdbcParam(sqlCnt, null); + + // 鍙栧嚭褰撳墠椤电殑鏁版嵁 + String sql = "select t.*,d.departname from jeecg_demo t left join t_s_depart d on d.id=t.dep_id"; + if (!sqlWhere.isEmpty()) { + sql += " where" + sqlWhere; + } + List> mapList = findForJdbc(sql, dataGrid.getPage(), dataGrid.getRows()); + + // 灏嗙粨鏋滈泦杞崲鎴愰〉闈笂瀵瑰簲鐨勬暟鎹泦 + Db2Page[] db2Pages = { + new Db2Page("id") + ,new Db2Page("userName", "user_name", null) + ,new Db2Page("depId", "departName", null) + ,new Db2Page("sex", null, new MyDataExchangerSex()) + ,new Db2Page("age") + ,new Db2Page("birthday") + ,new Db2Page("email") + ,new Db2Page("mobilePhone", "mobile_phone", null) + }; + JSONObject jObject = getJsonDatagridEasyUI(mapList, iCount.intValue(), db2Pages); + return jObject; + // end of 鏂瑰紡3 ========================================= */ + } + + // 鎷兼煡璇㈡潯浠讹紙where璇彞锛 + String getSqlWhere(JeecgJdbcEntity pageObj) { + // 鎷煎嚭鏉′欢璇彞 + String sqlWhere = ""; + if (StringUtil.isNotEmpty(pageObj.getUserName())) { + if (!sqlWhere.isEmpty()) { + sqlWhere += " and"; + } + sqlWhere += " t.user_name like '%" + pageObj.getUserName() + "%'"; + } + if (StringUtil.isNotEmpty(pageObj.getMobilePhone())) { + if (!sqlWhere.isEmpty()) { + sqlWhere += " and"; + } + sqlWhere += " t.mobile_phone like '%" + pageObj.getMobilePhone() + "%'"; + } + return sqlWhere; + } + // 浠ヤ笅鍚勫嚱鏁板彲浠ユ彁鎴愬叡鐢ㄩ儴浠 (Add by Quainty) + /** + * 杩斿洖easyUI鐨凞ataGrid鏁版嵁鏍煎紡鐨凧SONObject瀵硅薄 + * @param mapList : 浠庢暟鎹簱鐩存帴鍙栧緱鐨勭粨鏋滈泦鍒楄〃 + * @param iTotalCnt : 浠庢暟鎹簱鐩存帴鍙栧緱鐨勭粨鏋滈泦鎬绘暟鎹潯鏁 + * @param dataExchanger : 椤甸潰琛ㄧず鏁版嵁涓庢暟鎹簱瀛楁鐨勫搴斿叧绯诲垪琛 + * @return JSONObject + */ + public JSONObject getJsonDatagridEasyUI(List> mapList, int iTotalCnt, Db2Page[] dataExchanger) { + //easyUI鐨刣ataGrid鏂瑰紡 锛嶏紞锛嶏紞杩欓儴鍒嗗彲浠ユ彁鍙栨垚缁熶竴澶勭悊 + String jsonTemp = "{\'total\':" + iTotalCnt + ",\'rows\':["; + for (int j = 0; j < mapList.size(); j++) { + Map m = mapList.get(j); + if (j > 0) { + jsonTemp += ","; + } + jsonTemp += "{"; + for (int i = 0; i < dataExchanger.length; i++) { + if (i > 0) { + jsonTemp += ","; + } + jsonTemp += "'" + dataExchanger[i].getKey() + "'" + ":"; + Object objValue = dataExchanger[i].getData(m); + if (objValue == null) { + jsonTemp += "null"; + } else { + jsonTemp += "'" + objValue + "'"; + } + } + jsonTemp += "}"; + } + jsonTemp += "]}"; + JSONObject jObject = JSONObject.fromObject(jsonTemp); + return jObject; + } + + // 鏁版嵁鍙樻崲鐨勭粺涓鎺ュ彛 + interface IMyDataExchanger { + public Object exchange(Object value); + } + // 椤甸潰琛ㄧず鏁版嵁涓庢暟鎹簱瀛楁鐨勫搴斿叧绯 + class Db2Page { + String fieldPage; // 椤甸潰鐨刦ieldID + String columnDB; // 鏁版嵁搴撶殑瀛楁鍚 + IMyDataExchanger dataExchanger; // 鏁版嵁鍙樻崲 + + // 鏋勯犲嚱鏁1锛氬綋椤甸潰鐨刦ieldID涓庢暟鎹簱瀛楁涓鑷存椂锛堟暟鎹篃涓嶇敤鍙樻崲锛 + public Db2Page(String fieldPage) { + this.fieldPage = fieldPage; + this.columnDB = fieldPage; + this.dataExchanger = null; + } + // 鏋勯犲嚱鏁2锛氬綋椤甸潰鐨刦ieldID涓庢暟鎹簱瀛楁涓嶄竴鑷存椂锛堟暟鎹笉鐢ㄥ彉鎹級 + public Db2Page(String fieldPage, String columnDB) { + this.fieldPage = fieldPage; + if (columnDB == null) {// 涓巉ieldPage鐩稿悓 + this.columnDB = fieldPage; + } else { + this.columnDB = columnDB; + } + this.dataExchanger = null; + } + // 鏋勯犲嚱鏁3锛氬綋椤甸潰鐨刦ieldID涓庢暟鎹簱瀛楁涓嶄竴鑷达紝涓旀暟鎹杩涜鍙樻崲锛堝綋鐒堕兘鐢ㄨ繖涓瀯閫犲嚱鏁颁篃琛岋級 + public Db2Page(String fieldPage, String columnDB, IMyDataExchanger dataExchanger) { + this.fieldPage = fieldPage; + if (columnDB == null) {// 涓巉ieldPage鐩稿悓 + this.columnDB = fieldPage; + } else { + this.columnDB = columnDB; + } + this.dataExchanger = dataExchanger; + } + + /** + * 鍙栭〉闈㈣〃绀虹粦瀹氱殑fieldID + */ + public String getKey() { + return fieldPage; + } + + /** + * 鍙栭〉闈㈣〃绀哄搴旂殑鍊 + * @param mapDB : 浠庢暟鎹簱鐩存帴鍙栧緱鐨勭粨鏋滈泦(涓鏉℃暟鎹殑MAP) + * @return Object : 椤甸潰琛ㄧず瀵瑰簲鐨勫 + */ + public Object getData(Map mapDB) { + Object objValue = mapDB.get(columnDB); + if (objValue == null) { + return null; + } else { + if (dataExchanger != null) { + return dataExchanger.exchange(objValue); + } else { + return objValue; + } + } + } + } + + // 鎬у埆鐨勬暟鎹彉鎹㈠疄浣 + class MyDataExchangerSex implements IMyDataExchanger { + public Object exchange(Object value) { + if (value == null) { + return ""; + } else if ("0".equals(value.toString())) { + return "鐢"; + } else { + return "濂"; + } + } + } + + + public void listAllByJdbc(DataGrid dataGrid) { + //浠庡搴旇矾寰勪腑锛岃幏鍙朣QL [/jeecg/demo/sql/test/JeecgJdbcService_listAllByJdbc.sql] + String sql = JeecgSqlUtil.getMethodSql(JeecgSqlUtil.getMethodUrl()); + + String countsql = JeecgSqlUtil.getCountSqlBySql(sql); + List> maplist = jdbcDao.findForJdbcParam(sql, dataGrid.getPage(), dataGrid.getRows()); + Long count = jdbcDao.getCountForJdbcParam(countsql); + dataGrid.setTotal(count.intValue()); + dataGrid.setResults(maplist); + } + + public static void main(String[] args) { + JeecgJdbcServiceImpl service = new JeecgJdbcServiceImpl(); + service.listAllByJdbc(null); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgMatterBomServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgMatterBomServiceImpl.java new file mode 100644 index 00000000..a49a6f35 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgMatterBomServiceImpl.java @@ -0,0 +1,22 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import org.jeecgframework.web.demo.service.test.JeecgMatterBomServiceI; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *
  • 绫诲瀷鍚嶇О锛 + *
  • 璇存槑锛氱墿鏂橞om涓氬姟鎺ュ彛瀹炵幇绫 + *
  • 鍒涘缓浜猴細 娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ +@Service("jeecgMatterBomService") +@Transactional +public class JeecgMatterBomServiceImpl extends CommonServiceImpl implements + JeecgMatterBomServiceI { + +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgMinidaoServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgMinidaoServiceImpl.java new file mode 100644 index 00000000..43770fd6 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgMinidaoServiceImpl.java @@ -0,0 +1,57 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import java.util.List; +import org.jeecgframework.web.demo.dao.test.JeecgMinidaoDao; +import org.jeecgframework.web.demo.entity.test.JeecgMinidaoEntity; +import org.jeecgframework.web.demo.service.test.JeecgMinidaoServiceI; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Minidao渚嬪瓙 + * @author fancq + * + */ +@Service("jeecgMinidaoService") +@Transactional +public class JeecgMinidaoServiceImpl implements JeecgMinidaoServiceI { + @Autowired + private JeecgMinidaoDao jeecgMinidaoDao; + + public List listAll(JeecgMinidaoEntity jeecgMinidao, int page, int rows) { + List entities = jeecgMinidaoDao.getAllEntities2(jeecgMinidao, page, rows); + return entities; + } + + public JeecgMinidaoEntity getEntity(Class clazz, String id) { + JeecgMinidaoEntity jeecgMinidao = (JeecgMinidaoEntity)jeecgMinidaoDao.getByIdHiber(clazz, id); + return jeecgMinidao; + } + + public void insert(JeecgMinidaoEntity jeecgMinidao) { + jeecgMinidaoDao.saveByHiber(jeecgMinidao); + } + + public void update(JeecgMinidaoEntity jeecgMinidao) { + jeecgMinidaoDao.updateByHiber(jeecgMinidao); + } + + public void delete(JeecgMinidaoEntity jeecgMinidao) { + jeecgMinidaoDao.deleteByHiber(jeecgMinidao); + } + + public void deleteAllEntitie(List entities) { + for (JeecgMinidaoEntity entity : entities) { + jeecgMinidaoDao.deleteByHiber(entity); + } + } + + public Integer getCount() { + return jeecgMinidaoDao.getCount(); + } + + public Integer getSumSalary() { + return jeecgMinidaoDao.getSumSalary(); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgNoteServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgNoteServiceImpl.java new file mode 100644 index 00000000..2c37456c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgNoteServiceImpl.java @@ -0,0 +1,13 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.jeecgframework.web.demo.service.test.JeecgNoteServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; + +@Service("jeecgNoteService") +@Transactional +public class JeecgNoteServiceImpl extends CommonServiceImpl implements JeecgNoteServiceI { + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgOrderMainServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgOrderMainServiceImpl.java new file mode 100644 index 00000000..4ac3a869 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JeecgOrderMainServiceImpl.java @@ -0,0 +1,74 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import java.util.List; + +import org.jeecgframework.web.demo.entity.test.JeecgOrderCustomEntity; +import org.jeecgframework.web.demo.entity.test.JeecgOrderMainEntity; +import org.jeecgframework.web.demo.entity.test.JeecgOrderProductEntity; +import org.jeecgframework.web.demo.service.test.JeecgOrderMainServiceI; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service("jeecgOrderMainService") +@Transactional +public class JeecgOrderMainServiceImpl extends CommonServiceImpl implements JeecgOrderMainServiceI { + + + public void addMain(JeecgOrderMainEntity jeecgOrderMain, + List jeecgOrderProducList, + List jeecgOrderCustomList){ + //淇濆瓨璁㈠崟涓讳俊鎭 + this.save(jeecgOrderMain); + //淇濆瓨璁㈠崟浜у搧鏄庣粏 + for(JeecgOrderProductEntity product:jeecgOrderProducList){ + //澶栭敭璁剧疆 + product.setGoOrderCode(jeecgOrderMain.getGoOrderCode()); + this.save(product); + } + //淇濆瓨璁㈠崟瀹㈡埛鏄庣粏 + for(JeecgOrderCustomEntity custom:jeecgOrderCustomList){ + //澶栭敭璁剧疆 + custom.setGoOrderCode(jeecgOrderMain.getGoOrderCode()); + this.save(custom); + } + } + + + public void updateMain(JeecgOrderMainEntity jeecgOrderMain, + List jeecgOrderProducList, + List jeecgOrderCustomList, + boolean jeecgOrderCustomShow) { + //淇濆瓨璁㈠崟涓讳俊鎭 + this.saveOrUpdate(jeecgOrderMain); + //鍒犻櫎璁㈠崟浜у搧鏄庣粏 + this.commonDao.deleteAllEntitie(this.findByProperty(JeecgOrderProductEntity.class, "goOrderCode", jeecgOrderMain.getGoOrderCode())); + //淇濆瓨璁㈠崟浜у搧鏄庣粏 + for(JeecgOrderProductEntity product:jeecgOrderProducList){ + //澶栭敭璁剧疆 + product.setGoOrderCode(jeecgOrderMain.getGoOrderCode()); + this.save(product); + } + if(jeecgOrderCustomShow){ + //鍒犻櫎璁㈠崟瀹㈡埛鏄庣粏 + this.commonDao.deleteAllEntitie(this.findByProperty(JeecgOrderCustomEntity.class, "goOrderCode", jeecgOrderMain.getGoOrderCode())); + //淇濆瓨璁㈠崟瀹㈡埛鏄庣粏 + for(JeecgOrderCustomEntity custom:jeecgOrderCustomList){ + //澶栭敭璁剧疆 + custom.setGoOrderCode(jeecgOrderMain.getGoOrderCode()); + this.save(custom); + } + } + } + + + public void delMain(JeecgOrderMainEntity jeecgOrderMain) { + //鍒犻櫎涓昏〃淇℃伅 + this.delete(jeecgOrderMain); + //鍒犻櫎璁㈠崟浜у搧鏄庣粏 + this.deleteAllEntitie(this.findByProperty(JeecgOrderProductEntity.class, "goOrderCode", jeecgOrderMain.getGoOrderCode())); + //鍒犻櫎璁㈠崟瀹㈡埛鏄庣粏 + this.commonDao.deleteAllEntitie(this.findByProperty(JeecgOrderCustomEntity.class, "goOrderCode", jeecgOrderMain.getGoOrderCode())); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/JpPersonServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JpPersonServiceImpl.java new file mode 100644 index 00000000..f593fe90 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/JpPersonServiceImpl.java @@ -0,0 +1,13 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.jeecgframework.web.demo.service.test.JpPersonServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; + +@Service("jpPersonService") +@Transactional +public class JpPersonServiceImpl extends CommonServiceImpl implements JpPersonServiceI { + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/OptimisticLockingServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/OptimisticLockingServiceImpl.java new file mode 100644 index 00000000..754805af --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/OptimisticLockingServiceImpl.java @@ -0,0 +1,37 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import org.jeecgframework.web.demo.entity.test.OptimisticLockingEntity; +import org.jeecgframework.web.demo.service.test.OptimisticLockingServiceI; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service("optimisticLockingService") +@Transactional +public class OptimisticLockingServiceImpl extends CommonServiceImpl implements OptimisticLockingServiceI { + public void dd (){ + Session session1=getSession(); + Session session2=getSession(); + OptimisticLockingEntity stu1=this.get(OptimisticLockingEntity.class, "2c91992b3f74fd05013f74fda0260001"); + OptimisticLockingEntity stu2=this.get(OptimisticLockingEntity.class, "2c91992b3f74fd05013f74fda0260001"); + + //杩欐椂鍊欙紝涓や釜鐗堟湰鍙锋槸鐩稿悓鐨 + org.jeecgframework.core.util.LogUtil.info("v1="+stu1.getVer()+"--v2="+stu2.getVer()); + + Transaction tx1=session1.beginTransaction(); + stu1.setAccount(200); + tx1.commit(); + //杩欐椂鍊欙紝涓や釜鐗堟湰鍙锋槸涓嶅悓鐨勶紝鍏朵腑涓涓殑鐗堟湰鍙烽掑浜 + org.jeecgframework.core.util.LogUtil.info("v1="+stu1.getVer()+"--v2="+stu2.getVer()); + + Transaction tx2=session2.beginTransaction(); + stu2.setAccount(500); + + tx2.rollback(); + session2.close(); + session1.close(); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/TFinanceServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/TFinanceServiceImpl.java new file mode 100644 index 00000000..f2abef48 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/TFinanceServiceImpl.java @@ -0,0 +1,66 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.FileUtils; +import org.jeecgframework.core.util.ResourceUtil; + +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.demo.entity.test.TFinanceEntity; +import org.jeecgframework.web.demo.entity.test.TFinanceFilesEntity; +import org.jeecgframework.web.demo.service.test.TFinanceServiceI; +import org.jeecgframework.web.system.pojo.base.TSAttachment; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service("tFinanceService") +@Transactional +public class TFinanceServiceImpl extends CommonServiceImpl implements TFinanceServiceI { + + /** + * 闄勪欢鍒犻櫎 + */ + public void deleteFile(TFinanceFilesEntity file) { + + //[1].鍒犻櫎闄勪欢 + String sql = "select * from t_s_attachment where id = ?"; + Map attachmentMap = commonDao.findOneForJdbc(sql, file.getId()); + //闄勪欢鐩稿璺緞 + String realpath = (String) attachmentMap.get("realpath"); + String fileName = FileUtils.getFilePrefix2(realpath); + + //鑾峰彇閮ㄧ讲椤圭洰缁濆鍦板潃 + String realPath = ContextHolderUtils.getSession().getServletContext().getRealPath("/"); + FileUtils.delete(realPath+realpath); + FileUtils.delete(realPath+fileName+".pdf"); + FileUtils.delete(realPath+fileName+".swf"); + //[2].鍒犻櫎鏁版嵁 + commonDao.delete(file); + } + + /** + * 璧勯噾绠$悊鍒犻櫎 + */ + public void deleteFinance(TFinanceEntity finance) { + //[1].涓婁紶闄勪欢鍒犻櫎 + String attach_sql = "select * from t_s_attachment where id in (select id from t_finance_files where financeId = ?)"; + List> attachmentList = commonDao.findForJdbc(attach_sql, finance.getId()); + for(Map map:attachmentList){ + //闄勪欢鐩稿璺緞 + String realpath = (String) map.get("realpath"); + String fileName = FileUtils.getFilePrefix2(realpath); + + //鑾峰彇閮ㄧ讲椤圭洰缁濆鍦板潃 + String realPath = ContextHolderUtils.getSession().getServletContext().getRealPath("/"); + FileUtils.delete(realPath+realpath); + FileUtils.delete(realPath+fileName+".pdf"); + FileUtils.delete(realPath+fileName+".swf"); + } + //[2].鍒犻櫎璧勯噾绠$悊 + commonDao.delete(finance); + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/TaskDemoServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/TaskDemoServiceImpl.java new file mode 100644 index 00000000..6bbab916 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/TaskDemoServiceImpl.java @@ -0,0 +1,17 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import java.util.Date; + +import org.springframework.stereotype.Service; + +import org.jeecgframework.web.demo.service.test.TaskDemoServiceI; +@Service("taskDemoService") +public class TaskDemoServiceImpl implements TaskDemoServiceI { + + + public void work() { + org.jeecgframework.core.util.LogUtil.info(new Date().getTime()); + org.jeecgframework.core.util.LogUtil.info("----------浠诲姟娴嬭瘯-------"); + } + +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/impl/test/WebOfficeServiceImpl.java b/src/main/java/org/jeecgframework/web/demo/service/impl/test/WebOfficeServiceImpl.java new file mode 100644 index 00000000..8ed7c559 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/impl/test/WebOfficeServiceImpl.java @@ -0,0 +1,49 @@ +package org.jeecgframework.web.demo.service.impl.test; + +import java.io.IOException; +import java.sql.Blob; +import java.util.Date; + +import org.jeecgframework.web.demo.entity.test.WebOfficeEntity; +import org.jeecgframework.web.demo.service.test.WebOfficeServiceI; + +import org.hibernate.LobHelper; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.StringUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +@Service("webOfficeService") +@Transactional +public class WebOfficeServiceImpl extends CommonServiceImpl implements WebOfficeServiceI { + + public void saveObj(WebOfficeEntity docObj, MultipartFile file) { + WebOfficeEntity obj = null; + if (StringUtil.isNotEmpty(docObj.getId())) { + obj = commonDao.getEntity(WebOfficeEntity.class, docObj.getId()); + if (obj == null) { + return;//fail + } + } else { + obj = new WebOfficeEntity(); + BeanUtils.copyProperties(docObj, obj); + String sFileName = file.getOriginalFilename(); + int iPos = sFileName.lastIndexOf('.'); + if (iPos >= 0) { + obj.setDoctype(sFileName.substring(iPos+1)); + } + } + obj.setDocdate(new Date()); + LobHelper lobHelper = commonDao.getSession().getLobHelper(); + Blob data; + try { + data = lobHelper.createBlob(file.getInputStream(), 0); + obj.setDoccontent(data); + } catch (IOException e) { + e.printStackTrace(); + } + super.save(obj); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/CourseServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/CourseServiceI.java new file mode 100644 index 00000000..7fee4683 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/CourseServiceI.java @@ -0,0 +1,24 @@ +package org.jeecgframework.web.demo.service.test; + +import org.jeecgframework.web.demo.entity.test.CourseEntity; + +import org.jeecgframework.core.common.service.CommonService; + +public interface CourseServiceI extends CommonService{ + + /** + * 淇濆瓨璇剧▼ + *@Author JueYue + *@date 2013-11-10 + *@param course + */ + void saveCourse(CourseEntity course); + /** + * 鏇存柊璇剧▼ + *@Author JueYue + *@date 2013-11-10 + *@param course + */ + void updateCourse(CourseEntity course); + +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/JeecgBlobDataServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgBlobDataServiceI.java new file mode 100644 index 00000000..0cb3ba0c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgBlobDataServiceI.java @@ -0,0 +1,9 @@ +package org.jeecgframework.web.demo.service.test; + +import org.jeecgframework.core.common.service.CommonService; +import org.springframework.web.multipart.MultipartFile; + +public interface JeecgBlobDataServiceI extends CommonService{ + public void saveObj(String documentTitle, MultipartFile file); + +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/JeecgDemoCkfinderServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgDemoCkfinderServiceI.java new file mode 100644 index 00000000..b8049124 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgDemoCkfinderServiceI.java @@ -0,0 +1,7 @@ +package org.jeecgframework.web.demo.service.test; + +import org.jeecgframework.core.common.service.CommonService; + +public interface JeecgDemoCkfinderServiceI extends CommonService{ + +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/JeecgDemoServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgDemoServiceI.java new file mode 100644 index 00000000..260e0bcb --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgDemoServiceI.java @@ -0,0 +1,8 @@ +package org.jeecgframework.web.demo.service.test; + +import org.jeecgframework.core.common.service.CommonService; + + +public interface JeecgDemoServiceI extends CommonService{ + +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/JeecgJdbcServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgJdbcServiceI.java new file mode 100644 index 00000000..0589f94e --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgJdbcServiceI.java @@ -0,0 +1,14 @@ +package org.jeecgframework.web.demo.service.test; + +import org.jeecgframework.web.demo.entity.test.JeecgJdbcEntity; +import net.sf.json.JSONObject; + +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.common.service.CommonService; + +public interface JeecgJdbcServiceI extends CommonService{ + public void getDatagrid1(JeecgJdbcEntity pageObj, DataGrid dataGrid); + public void getDatagrid2(JeecgJdbcEntity pageObj, DataGrid dataGrid); + public JSONObject getDatagrid3(JeecgJdbcEntity pageObj, DataGrid dataGrid); + public void listAllByJdbc(DataGrid dataGrid); +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/JeecgMatterBomServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgMatterBomServiceI.java new file mode 100644 index 00000000..eeb6e079 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgMatterBomServiceI.java @@ -0,0 +1,15 @@ +package org.jeecgframework.web.demo.service.test; + +import org.jeecgframework.core.common.service.CommonService; + +/** + *
  • 绫诲瀷鍚嶇О锛 + *
  • 璇存槑锛氱墿鏂橞om涓氬姟鎺ュ彛绫 + *
  • 鍒涘缓浜猴細 娓╀繆 + *
  • 鍒涘缓鏃ユ湡锛2013-8-12 + *
  • 淇敼浜猴細 + *
  • 淇敼鏃ユ湡锛 + */ +public interface JeecgMatterBomServiceI extends CommonService { + +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/JeecgMinidaoServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgMinidaoServiceI.java new file mode 100644 index 00000000..8feb251f --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgMinidaoServiceI.java @@ -0,0 +1,28 @@ +package org.jeecgframework.web.demo.service.test; + +import java.util.List; + +import org.jeecgframework.web.demo.entity.test.JeecgMinidaoEntity; + +/** + * Minidao渚嬪瓙 + * @author fancq + * + */ +public interface JeecgMinidaoServiceI { + public List listAll(JeecgMinidaoEntity jeecgMinidao, int page, int rows); + + public JeecgMinidaoEntity getEntity(Class clazz, String id); + + public void insert(JeecgMinidaoEntity jeecgMinidao); + + public void update(JeecgMinidaoEntity jeecgMinidao); + + public void delete(JeecgMinidaoEntity jeecgMinidao); + + public void deleteAllEntitie(List entities); + + public Integer getCount(); + + public Integer getSumSalary(); +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/JeecgNoteServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgNoteServiceI.java new file mode 100644 index 00000000..daf5862d --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgNoteServiceI.java @@ -0,0 +1,7 @@ +package org.jeecgframework.web.demo.service.test; + +import org.jeecgframework.core.common.service.CommonService; + +public interface JeecgNoteServiceI extends CommonService{ + +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/JeecgOrderMainServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgOrderMainServiceI.java new file mode 100644 index 00000000..f700ef85 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/JeecgOrderMainServiceI.java @@ -0,0 +1,24 @@ +package org.jeecgframework.web.demo.service.test; + +import java.util.List; + +import org.jeecgframework.web.demo.entity.test.JeecgOrderCustomEntity; +import org.jeecgframework.web.demo.entity.test.JeecgOrderMainEntity; +import org.jeecgframework.web.demo.entity.test.JeecgOrderProductEntity; + +import org.jeecgframework.core.common.service.CommonService; + + +public interface JeecgOrderMainServiceI extends CommonService{ + /** + * 娣诲姞涓瀵瑰 + * + */ + public void addMain(JeecgOrderMainEntity jeecgOrderMain,List jeecgOrderProducList,List jeecgOrderCustomList) ; + /** + * 淇敼涓瀵瑰 + * + */ + public void updateMain(JeecgOrderMainEntity jeecgOrderMain,List jeecgOrderProducList,List jeecgOrderCustomList,boolean jeecgOrderCustomShow) ; + public void delMain (JeecgOrderMainEntity jeecgOrderMain); +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/JpPersonServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/JpPersonServiceI.java new file mode 100644 index 00000000..89d1ff00 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/JpPersonServiceI.java @@ -0,0 +1,7 @@ +package org.jeecgframework.web.demo.service.test; + +import org.jeecgframework.core.common.service.CommonService; + +public interface JpPersonServiceI extends CommonService{ + +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/OptimisticLockingServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/OptimisticLockingServiceI.java new file mode 100644 index 00000000..0b988ccf --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/OptimisticLockingServiceI.java @@ -0,0 +1,7 @@ +package org.jeecgframework.web.demo.service.test; + +import org.jeecgframework.core.common.service.CommonService; + +public interface OptimisticLockingServiceI extends CommonService{ + public void dd (); +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/TFinanceServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/TFinanceServiceI.java new file mode 100644 index 00000000..9a7874b4 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/TFinanceServiceI.java @@ -0,0 +1,14 @@ +package org.jeecgframework.web.demo.service.test; + +import org.jeecgframework.web.demo.entity.test.TFinanceEntity; +import org.jeecgframework.web.demo.entity.test.TFinanceFilesEntity; + +import org.jeecgframework.core.common.service.CommonService; + +public interface TFinanceServiceI extends CommonService{ + + void deleteFile(TFinanceFilesEntity file); + + void deleteFinance(TFinanceEntity finance); + +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/TaskDemoServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/TaskDemoServiceI.java new file mode 100644 index 00000000..d629d215 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/TaskDemoServiceI.java @@ -0,0 +1,7 @@ +package org.jeecgframework.web.demo.service.test; + +public interface TaskDemoServiceI { + + public void work(); + +} diff --git a/src/main/java/org/jeecgframework/web/demo/service/test/WebOfficeServiceI.java b/src/main/java/org/jeecgframework/web/demo/service/test/WebOfficeServiceI.java new file mode 100644 index 00000000..3da6176e --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/service/test/WebOfficeServiceI.java @@ -0,0 +1,10 @@ +package org.jeecgframework.web.demo.service.test; + +import org.jeecgframework.web.demo.entity.test.WebOfficeEntity; + +import org.jeecgframework.core.common.service.CommonService; +import org.springframework.web.multipart.MultipartFile; + +public interface WebOfficeServiceI extends CommonService{ + public void saveObj(WebOfficeEntity docObj, MultipartFile file); +} diff --git a/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgJdbcService_listAllByJdbc.sql b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgJdbcService_listAllByJdbc.sql new file mode 100644 index 00000000..cc793774 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgJdbcService_listAllByJdbc.sql @@ -0,0 +1,2 @@ +SELECT * + FROM t_s_base_user \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_delete.sql b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_delete.sql new file mode 100644 index 00000000..4d4f5c4b --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_delete.sql @@ -0,0 +1,2 @@ +DELETE jeecg_minidao +WHERE id=:jeecgMinidao.id \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_getAllEntities.sql b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_getAllEntities.sql new file mode 100644 index 00000000..e74ca225 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_getAllEntities.sql @@ -0,0 +1,25 @@ +SELECT * FROM jeecg_minidao WHERE +<#if jeecgMinidao.userName ?exists && jeecgMinidao.userName ?length gt 0> + and user_name = :jeecgMinidao.userName + +<#if jeecgMinidao.mobilePhone ?exists && jeecgMinidao.mobilePhone ?length gt 0> + and mobile_phone = :jeecgMinidao.mobilePhone + +<#if jeecgMinidao.officePhone ?exists && jeecgMinidao.officePhone ?length gt 0> + and office_phone = :jeecgMinidao.officePhone + +<#if jeecgMinidao.email ?exists && jeecgMinidao.email ?length gt 0> + and email = :jeecgMinidao.email + +<#if jeecgMinidao.age ?exists && jeecgMinidao.age ?length gt 0> + and age = :jeecgMinidao.age + +<#if jeecgMinidao.salary ?exists && jeecgMinidao.salary ?length gt 0> + and salary = :jeecgMinidao.salary + +<#if jeecgMinidao.sex ?exists && jeecgMinidao.sex ?length gt 0> + and sex = :jeecgMinidao.sex + +<#if jeecgMinidao.status ?exists && jeecgMinidao.status ?length gt 0> + and status = :jeecgMinidao.status + diff --git a/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_getAllEntities2.sql b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_getAllEntities2.sql new file mode 100644 index 00000000..e74ca225 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_getAllEntities2.sql @@ -0,0 +1,25 @@ +SELECT * FROM jeecg_minidao WHERE +<#if jeecgMinidao.userName ?exists && jeecgMinidao.userName ?length gt 0> + and user_name = :jeecgMinidao.userName + +<#if jeecgMinidao.mobilePhone ?exists && jeecgMinidao.mobilePhone ?length gt 0> + and mobile_phone = :jeecgMinidao.mobilePhone + +<#if jeecgMinidao.officePhone ?exists && jeecgMinidao.officePhone ?length gt 0> + and office_phone = :jeecgMinidao.officePhone + +<#if jeecgMinidao.email ?exists && jeecgMinidao.email ?length gt 0> + and email = :jeecgMinidao.email + +<#if jeecgMinidao.age ?exists && jeecgMinidao.age ?length gt 0> + and age = :jeecgMinidao.age + +<#if jeecgMinidao.salary ?exists && jeecgMinidao.salary ?length gt 0> + and salary = :jeecgMinidao.salary + +<#if jeecgMinidao.sex ?exists && jeecgMinidao.sex ?length gt 0> + and sex = :jeecgMinidao.sex + +<#if jeecgMinidao.status ?exists && jeecgMinidao.status ?length gt 0> + and status = :jeecgMinidao.status + diff --git a/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_getJeecgDemo.sql b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_getJeecgDemo.sql new file mode 100644 index 00000000..9aa42e60 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_getJeecgDemo.sql @@ -0,0 +1 @@ +SELECT * FROM jeecg_minidao WHERE id=:id \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_insert.sql b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_insert.sql new file mode 100644 index 00000000..e51e7756 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_insert.sql @@ -0,0 +1,14 @@ +INSERT INTO jeecg_minidao(id, age, birthday, content, dep_id, email, mobile_phone, office_phone, salary, sex, user_name) +VALUES( + :jeecgMinidao.id, + :jeecgMinidao.age, + :jeecgMinidao.birthday, + :jeecgMinidao.content, + :jeecgMinidao.depId, + :jeecgMinidao.email, + :jeecgMinidao.mobilePhone, + :jeecgMinidao.officePhone, + :jeecgMinidao.salary, + :jeecgMinidao.sex, + :jeecgMinidao.userName +) \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_update.sql b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_update.sql new file mode 100644 index 00000000..c65c8a59 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/demo/sql/test/JeecgMinidaoDao_update.sql @@ -0,0 +1,9 @@ +UPDATE jeecg_minidao +SET +<#if jeecgMinidao.age ?exists && jeecgMinidao.age ?length gt 0> + age=:jeecgMinidao.age, + +<#if jeecgMinidao.userName ?exists && jeecgMinidao.userName ?length gt 0> + userName=:jeecgMinidao.userName + +WHERE id=:jeecgMinidao.id \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/graphreport/controller/GraphReportController.java b/src/main/java/org/jeecgframework/web/graphreport/controller/GraphReportController.java new file mode 100644 index 00000000..83cde64e --- /dev/null +++ b/src/main/java/org/jeecgframework/web/graphreport/controller/GraphReportController.java @@ -0,0 +1,509 @@ +package org.jeecgframework.web.graphreport.controller; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.jeecgframework.web.cgform.common.CgAutoListConstant; +import org.jeecgframework.web.cgform.engine.FreemarkerHelper; +import org.jeecgframework.web.cgreport.common.CgReportConstant; +import org.jeecgframework.web.cgreport.exception.CgReportNotFoundException; +import org.jeecgframework.web.cgreport.service.excel.CgReportExcelServiceI; +import org.jeecgframework.web.cgreport.util.CgReportQueryParamUtil; +import org.jeecgframework.web.graphreport.service.core.GraphReportServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.enums.SysThemesEnum; +import org.jeecgframework.core.util.BrowserUtils; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.SysThemesUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * + * @Title:CgReportController + * @description:鍥捐〃閰嶇疆鎺у埗鍣 + * @author 閽熶笘浜 + * @date 2015.4.11 + * @version V1.0 + */ +@Controller +@RequestMapping("/graphReportController") +public class GraphReportController extends BaseController { + @Autowired + private GraphReportServiceI graphReportService; + @Autowired + private SystemService systemService; + @Autowired + private CgReportExcelServiceI cgReportExcelService; + + /** + * 鍔ㄦ佹姤琛ㄥ睍鐜板叆鍙 + * @param id 鍔ㄦ侀厤缃甀D-code + * @param request + * @param response + */ + @RequestMapping(params = "list") + public void list(String id, HttpServletRequest request, + HttpServletResponse response) { + //step.1 鏍规嵁id鑾峰彇璇ュ姩鎬佹姤琛ㄧ殑閰嶇疆鍙傛暟 + Map cgReportMap = null; + try{ + cgReportMap = graphReportService.queryCgReportConfig(id); + }catch (Exception e) { + throw new CgReportNotFoundException("鍔ㄦ佹姤琛ㄩ厤缃笉瀛樺湪!"); + } + //step.2 鑾峰彇鍒楄〃ftl妯℃澘璺緞 + FreemarkerHelper viewEngine = new FreemarkerHelper(); + //step.3 缁勫悎妯℃澘+鏁版嵁鍙傛暟锛岃繘琛岄〉闈㈠睍鐜 + loadVars(cgReportMap); + + //step.4 椤甸潰css js寮曠敤 + cgReportMap.put(CgAutoListConstant.CONFIG_IFRAME, getHtmlHead(request)); + + String html = viewEngine.parseTemplate("/org/jeecgframework/web/graphreport/engine/core/graphreportlist.ftl", cgReportMap); + try { + response.setContentType("text/html"); + response.setHeader("Cache-Control", "no-store"); + PrintWriter writer = response.getWriter(); + writer.println(html); + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private String getHtmlHead(HttpServletRequest request){ + HttpSession session = ContextHolderUtils.getSession(); + String lang = (String)session.getAttribute("lang"); + StringBuilder sb= new StringBuilder(""); + SysThemesEnum sysThemesEnum = SysThemesUtil.getSysTheme(request); + sb.append(SysThemesUtil.getReportTheme(sysThemesEnum)); + sb.append(SysThemesUtil.getCommonTheme(sysThemesEnum)); + sb.append(""); + sb.append(""); + sb.append(SysThemesUtil.getEasyUiTheme(sysThemesEnum)); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(SysThemesUtil.getLhgdialogTheme(sysThemesEnum)); + sb.append(StringUtil.replace("", "{0}", lang)); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append(""); + return sb.toString(); + } + + + /** + * popup鍏ュ彛 + * @param id 鍔ㄦ侀厤缃甀D-code + * @param request + * @param response + */ + @RequestMapping(params = "popup") + public void popup(String id, HttpServletRequest request, + HttpServletResponse response) { + //step.1 鏍规嵁id鑾峰彇璇ュ姩鎬佹姤琛ㄧ殑閰嶇疆鍙傛暟 + Map cgReportMap = null; + try{ + cgReportMap = graphReportService.queryCgReportConfig(id); + }catch (Exception e) { + throw new CgReportNotFoundException("鍔ㄦ佹姤琛ㄩ厤缃笉瀛樺湪!"); + } + //step.2 鑾峰彇鍒楄〃ftl妯℃澘璺緞 + FreemarkerHelper viewEngine = new FreemarkerHelper(); + //step.3 缁勫悎妯℃澘+鏁版嵁鍙傛暟锛岃繘琛岄〉闈㈠睍鐜 + loadVars(cgReportMap); + + //step.4 椤甸潰css js寮曠敤 + cgReportMap.put(CgAutoListConstant.CONFIG_IFRAME, getHtmlHead(request)); + + String html = viewEngine.parseTemplate("/org/jeecgframework/web/cgreport/engine/core/cgreportlistpopup.ftl", cgReportMap); + try { + response.setContentType("text/html"); + response.setHeader("Cache-Control", "no-store"); + PrintWriter writer = response.getWriter(); + writer.println(html); + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** + * 缁勮妯$増鍙傛暟 + * @param cgReportMap + */ + @SuppressWarnings("unchecked") + private void loadVars(Map cgReportMap) { + Map mainM = (Map) cgReportMap.get(CgReportConstant.MAIN); + List> fieldList = (List>) cgReportMap.get(CgReportConstant.ITEMS); + List> queryList = new ArrayList>(0); + //鍥捐〃鏁版嵁 + List> graphList = new ArrayList>(0); + //tab鏁版嵁 + Set tabSet = new HashSet(); + List tabList = new ArrayList(); + + for(Map fl:fieldList){ + fl.put(CgReportConstant.ITEM_FIELDNAME, ((String)fl.get(CgReportConstant.ITEM_FIELDNAME)).toLowerCase()); + String isQuery = (String) fl.get(CgReportConstant.ITEM_ISQUERY); + if(CgReportConstant.BOOL_TRUE.equalsIgnoreCase(isQuery)){ + loadDic(fl,fl); + queryList.add(fl); + } + if("y".equals(fl.get("is_graph")) || "Y".equals(fl.get("is_graph"))) { + graphList.add(fl); + String tabName = (fl.get("tab_name") == null ? "" : fl.get("tab_name").toString()); + if(!tabSet.contains(tabName)) { + tabList.add(tabName); + tabSet.add(tabName); + } + } + } + cgReportMap.put(CgReportConstant.CONFIG_ID, mainM.get("code")); + cgReportMap.put(CgReportConstant.CONFIG_NAME, mainM.get("name")); + cgReportMap.put(CgReportConstant.CONFIG_FIELDLIST, fieldList); + cgReportMap.put(CgReportConstant.CONFIG_QUERYLIST, queryList); + cgReportMap.put("graphList", graphList); + cgReportMap.put("tabList", tabList); + } + + + /** + * 澶勭悊鏁版嵁瀛楀吀 + * @param result 鏌ヨ鐨勭粨鏋滈泦 + * @param beans 瀛楁閰嶇疆 + */ + @SuppressWarnings("unchecked") + private void dealDic(List> result, + List> beans) { + for(Map bean:beans){ + String dict_code = (String) bean.get(CgReportConstant.ITEM_DICCODE); + if(StringUtil.isEmpty(dict_code)){ + //涓嶉渶瑕佸鐞嗗瓧鍏 + continue; + }else{ + List> dicDatas = queryDicBySQL(dict_code); + + for(Map r:result){ + String value = String.valueOf(r.get(bean.get(CgReportConstant.ITEM_FIELDNAME))); + for(Map m:dicDatas){ + String typecode = String.valueOf(m.get("typecode")); + String typename = String.valueOf(m.get("typename")); + if(value.equalsIgnoreCase(typecode)){ + r.put(bean.get(CgReportConstant.ITEM_FIELDNAME),typename); + } + } + } + } + } + } + + /** + * 鏌ヨ鏁版嵁瀛楀吀锛屾墿灞曚簡瀵筍QL鐨勬敮鎸 + * @param dictCodeOrSQL 瀛楀吀缂栫爜鎴朣QL + * @author bit 2014-4-19 + */ + private List> queryDicBySQL(String dictCodeOrSQL) { + List> dicDatas = null; + dictCodeOrSQL = dictCodeOrSQL.trim(); + if(dictCodeOrSQL.toLowerCase().startsWith("select ")) { + dictCodeOrSQL = dictCodeOrSQL.replaceAll("'[kK][eE][yY]'", "'typecode'").replaceAll("'[vV][aA][lL][uU][eE]'", "'typename'"); + dicDatas = systemService.findForJdbc(dictCodeOrSQL, null); + }else { + dicDatas = queryDic(dictCodeOrSQL); + } + return dicDatas; + } + + /** + * 澶勭悊鍙栧艰〃杈惧紡 + * @param result + * @param beans + */ + @SuppressWarnings("unchecked") + private void dealReplace(List> result, + List> beans){ + for(Map bean:beans){ + try{ + //鑾峰彇鍙栧艰〃杈惧紡 + String replace = (String) bean.get(CgReportConstant.ITEM_REPLACE); + if(StringUtil.isEmpty(replace)){ + continue; + } + String[] groups = replace.split(","); + for(String g:groups){ + String[] items = g.split("_"); + String v = items[0];//閫昏緫鍒ゆ柇鍊 + String txt = items[1];//瑕佽浆鎹㈢殑鏂囨湰 + for(Map r:result){ + String value = String.valueOf(r.get(bean.get(CgReportConstant.ITEM_FIELDNAME))); + if(value.equalsIgnoreCase(v)){ + r.put(bean.get(CgReportConstant.ITEM_FIELDNAME),txt); + } + } + } + }catch (Exception e) { + //杩欓噷鍑虹幇寮傚父鍘熷洜鏄洜涓哄彇鍊艰〃杈惧紡涓嶆纭 + e.printStackTrace(); + throw new BusinessException("鍙栧艰〃杈惧紡涓嶆纭"); + } + } + } + /** + * 鍔ㄦ佹姤琛ㄦ暟鎹煡璇(涓嶅垎椤) + * @param configId 閰嶇疆id-code + * @param request + * @param response + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "datagridGraph") + public void datagridGraph(String configId, HttpServletRequest request, HttpServletResponse response) { + //step.1 鏍规嵁id鑾峰彇璇ュ姩鎬佹姤琛ㄧ殑閰嶇疆鍙傛暟 + Map cgReportMap = null; + try{ + cgReportMap = graphReportService.queryCgReportConfig(configId); + if(cgReportMap.size()<=0){ + throw new CgReportNotFoundException("鍔ㄦ佹姤琛ㄩ厤缃笉瀛樺湪!"); + } + }catch (Exception e) { + throw new CgReportNotFoundException("鏌ユ壘鍔ㄦ佹姤琛ㄩ厤缃け璐!"+e.getMessage()); + } + try { + //step.2 鑾峰彇璇ラ厤缃殑鏌ヨSQL + Map configM = (Map) cgReportMap.get(CgReportConstant.MAIN); + String querySql = (String) configM.get("CGR_SQL"); + List> items = (List>) cgReportMap.get(CgReportConstant.ITEMS); + Map queryparams = new LinkedHashMap(); + for(Map item:items){ + String isQuery = (String) item.get(CgReportConstant.ITEM_ISQUERY); + if(CgReportConstant.BOOL_TRUE.equalsIgnoreCase(isQuery)){ + //step.3 瑁呰浇鏌ヨ鏉′欢 + CgReportQueryParamUtil.loadQueryParams(request, item, queryparams); + } + } + //step.4 杩涜鏌ヨ杩斿洖缁撴灉 + List> result= graphReportService.queryByCgReportSql(querySql, queryparams, -1, -1); + dealDic(result,items); + dealReplace(result,items); + + //瀵煎嚭execel + List fields = new ArrayList(); + List> configItems = (List>) cgReportMap.get(CgReportConstant.ITEMS); + for (Map map : configItems) { + if("Y".equals(map.get("is_show"))) { + fields.add(map.get("field_txt").toString()); + fields.add(map.get("field_name").toString()); + } + } + if(exportExecel(request, response, configM.get("content").toString(), configM.get("content").toString(), fields.toArray(new String[fields.size()]), result, null)) { + return; + } + + response.setContentType("application/json"); + response.setHeader("Cache-Control", "no-store"); + PrintWriter writer; + + writer = response.getWriter(); + writer.println(CgReportQueryParamUtil.getJson(result, -1L)); + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + /** + * 鍔ㄦ佹姤琛ㄦ暟鎹煡璇 + * @param configId 閰嶇疆id-code + * @param page 鍒嗛〉椤甸潰 + * @param rows 鍒嗛〉澶у皬 + * @param request + * @param response + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "datagrid") + public void datagrid(String configId,String page,String field,String rows, HttpServletRequest request, + HttpServletResponse response) { + //step.1 鏍规嵁id鑾峰彇璇ュ姩鎬佹姤琛ㄧ殑閰嶇疆鍙傛暟 + Map cgReportMap = null; + try{ + cgReportMap = graphReportService.queryCgReportConfig(configId); + if(cgReportMap.size()<=0){ + throw new CgReportNotFoundException("鍔ㄦ佹姤琛ㄩ厤缃笉瀛樺湪!"); + } + }catch (Exception e) { + throw new CgReportNotFoundException("鏌ユ壘鍔ㄦ佹姤琛ㄩ厤缃け璐!"+e.getMessage()); + } + //step.2 鑾峰彇璇ラ厤缃殑鏌ヨSQL + Map configM = (Map) cgReportMap.get(CgReportConstant.MAIN); + String querySql = (String) configM.get(CgReportConstant.CONFIG_SQL); + List> items = (List>) cgReportMap.get(CgReportConstant.ITEMS); + Map queryparams = new LinkedHashMap(); + for(Map item:items){ + String isQuery = (String) item.get(CgReportConstant.ITEM_ISQUERY); + if(CgReportConstant.BOOL_TRUE.equalsIgnoreCase(isQuery)){ + //step.3 瑁呰浇鏌ヨ鏉′欢 + CgReportQueryParamUtil.loadQueryParams(request, item, queryparams); + } + } + //step.4 杩涜鏌ヨ杩斿洖缁撴灉 + int p = page==null?1:Integer.parseInt(page); + int r = rows==null?99999:Integer.parseInt(rows); + List> result= graphReportService.queryByCgReportSql(querySql, queryparams, p, r); + long size = graphReportService.countQueryByCgReportSql(querySql, queryparams); + dealDic(result,items); + dealReplace(result,items); + response.setContentType("application/json"); + response.setHeader("Cache-Control", "no-store"); + PrintWriter writer; + try { + writer = response.getWriter(); + writer.println(CgReportQueryParamUtil.getJson(result,size)); + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** + * 瑙f瀽SQL锛岃繑鍥炲瓧娈甸泦 + * @param sql + * @return + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "getFields", method = RequestMethod.POST) + @ResponseBody + public Object getSqlFields(String sql){ + List result = null; + Map reJson = new HashMap(); + try{ + result = graphReportService.getSqlFields(sql); + }catch (Exception e) { + e.printStackTrace(); + String errorInfo = "瑙f瀽澶辫触!

    澶辫触鍘熷洜锛"; + errorInfo += e.getMessage(); + reJson.put("status", "error"); + reJson.put("datas", errorInfo); + return reJson; + } + reJson.put("status", "success"); + reJson.put("datas", result); + return reJson; + } + /** + * 瑁呰浇鏁版嵁瀛楀吀 + * @param m 瑕佹斁鍏reemarker鐨勬暟鎹 + * @param bean 璇诲彇鍑烘潵鐨勫姩鎬侀厤缃暟鎹 + */ + @SuppressWarnings("unchecked") + private void loadDic(Map m, Map cgReportMap) { + String dict_code = (String) cgReportMap.get("dict_code"); + if(StringUtil.isEmpty(dict_code)){ + m.put(CgReportConstant.FIELD_DICTLIST, new ArrayList(0)); + return; + } + List> dicDatas = queryDicBySQL(dict_code); + m.put(CgReportConstant.FIELD_DICTLIST, dicDatas); + } + /** + * 鏌ヨ鏁版嵁瀛楀吀 + * @param diccode 瀛楀吀缂栫爜 + * @return + */ + private List> queryDic(String diccode) { + StringBuilder dicSql = new StringBuilder(); + dicSql.append(" SELECT TYPECODE,TYPENAME FROM"); + dicSql.append(" "+CgReportConstant.SYS_DIC); + dicSql.append(" "+"WHERE TYPEGROUPID = "); + dicSql.append(" "+"(SELECT ID FROM "+CgReportConstant.SYS_DICGROUP+" WHERE TYPEGROUPCODE = '"+diccode+"' )"); + List> dicDatas = graphReportService.findForJdbc(dicSql.toString()); + return dicDatas; + } + + /** + * 瀵煎嚭execel + */ + private boolean exportExecel(HttpServletRequest request, HttpServletResponse response, + String title, String tagName, String[] fields, List> list, Map params) { + if(!"1".equals(request.getParameter("export"))) { + return false; + } + + if(params == null) { + params = new HashMap(); + } + if(StringUtil.isEmpty(tagName)) { + tagName = title; + } + + response.setContentType("application/vnd.ms-excel"); + OutputStream fOut = null; + try { + //step.4 鏍规嵁娴忚鍣ㄨ繘琛岃浆鐮侊紝浣垮叾鏀寔涓枃鏂囦欢鍚 + String browse = BrowserUtils.checkBrowse(request); + if ("MSIE".equalsIgnoreCase(browse.substring(0, 4))) { + response.setHeader("content-disposition", + "attachment;filename=" + java.net.URLEncoder.encode(title, "UTF-8") + ".xls"); + } else { + String newtitle = new String(title.getBytes("UTF-8"), "ISO8859-1"); + response.setHeader("content-disposition", + "attachment;filename=" + newtitle + ".xls"); + } + //step.5 浜х敓宸ヤ綔绨垮璞 + HSSFWorkbook workbook = null; + + + List> fieldList = new ArrayList>(); + for (int i = 0; i < fields.length; i++,i++) { + Map map = new HashMap(); + map.put("field_txt", fields[i]); + map.put("field_name", fields[i + 1]); + fieldList.add(map); + } + + workbook = cgReportExcelService.exportExcel(tagName, fieldList, list); + fOut = response.getOutputStream(); + workbook.write(fOut); + //TODO 澧炲姞鎿嶄綔鏃ュ織 + //systemService.addLog(MsgUtil.getOperationLogMsg("瀵煎嚭鎴愬姛", title, params), Globals.Log_Type_EXPORT, + // Globals.Log_Leavel_INFO); + } catch (UnsupportedEncodingException e1) { + e1.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + fOut.flush(); + fOut.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return true; + } +} diff --git a/src/main/java/org/jeecgframework/web/graphreport/engine/core/graphreportlist.ftl b/src/main/java/org/jeecgframework/web/graphreport/engine/core/graphreportlist.ftl new file mode 100644 index 00000000..694fe564 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/graphreport/engine/core/graphreportlist.ftl @@ -0,0 +1,314 @@ + + + + +${config_iframe} + + +
    +
    + <#list config_queryList as x> + + ${x['field_txt']}锛 + <#if x['search_mode']=="group"> + class="Wdate" onclick="WdatePicker({dateFmt:'yyyy-MM-dd'});" /> + ~ + class="Wdate" onclick="WdatePicker({dateFmt:'yyyy-MM-dd'});" /> + + <#if x['search_mode']=="single"> + <#if (x['field_dictlist']?size >0)> + <#if x['field_type']=="ComboGrid"> + + + <#else> + + + + <#if (x['field_dictlist']?size <= 0)> + class="Wdate" onclick="WdatePicker({dateFmt:'yyyy-MM-dd'});" /> + + + + + <#if (config_queryList?size > 0)> + + 鏌ヨ + 閲嶇疆 + + +
    +
    + +
    +
    +

    ${main['name']}

    +
    +
    +
    + <#if (tabList?size > 1)> +
    +
      + <#list tabList as x> +
    • class="on" >${x}
    • + +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +

    鏁版嵁鏄庣粏

    +
    + + + +
    +
    +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/graphreport/service/core/GraphReportServiceI.java b/src/main/java/org/jeecgframework/web/graphreport/service/core/GraphReportServiceI.java new file mode 100644 index 00000000..2c7ee860 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/graphreport/service/core/GraphReportServiceI.java @@ -0,0 +1,57 @@ +package org.jeecgframework.web.graphreport.service.core; + +import java.util.List; +import java.util.Map; + +import org.jeecgframework.core.common.service.CommonService; + +/** + * + * @Title:CgReportServiceI + * @description:鍥捐〃閰嶇疆鏈嶅姟鎺ュ彛 + * @author 閽熶笘浜 + * @date 2015.4.11 + * @version V1.0 + */ +public interface GraphReportServiceI extends CommonService{ + /** + * 鏍规嵁鎶ヨ〃鐨処D鑾峰緱鎶ヨ〃鐨勬姮澶撮厤缃互鍙婃槑缁嗛厤缃 + * @param reportId + * @return + */ + public Map queryCgReportConfig(String reportId); + /** + * 鏍规嵁鎶ヨ〃id鑾峰緱鎶ヨ〃鎶ご閰嶇疆 + * @param reportId + * @return + */ + public Map queryCgReportMainConfig(String reportId); + /** + * 鏍规嵁鎶ヨ〃id鑾峰緱鎶ヨ〃鏄庣粏閰嶇疆 + * @param reportId + * @return + */ + public List> queryCgReportItems(String reportId); + /** + * 鎵ц鎶ヨ〃SQL鑾峰彇缁撴灉闆 + * @param sql 鎶ヨ〃SQL + * @param params 鏌ヨ鏉′欢 + * @param page 椤甸潰鏁 + * @param rows 瑕佽幏鍙栫殑鏉$洰鎬绘暟 + * @return + */ + public List> queryByCgReportSql(String sql,Map params,int page,int rows); + /** + * 鑾峰彇鎶ヨ〃sql缁撴灉闆嗗ぇ灏 + * @param sql 鎶ヨ〃SQL + * @param params 鏌ヨ鏉′欢 + * @return + */ + public long countQueryByCgReportSql(String sql,Map params); + /** + * 閫氳繃鎵цsql鑾峰緱璇ql璇彞涓殑瀛楁闆嗗悎 + * @param sql 鎶ヨ〃sql + * @return + */ + public List getSqlFields(String sql); +} diff --git a/src/main/java/org/jeecgframework/web/graphreport/service/impl/core/GraphReportServiceImpl.java b/src/main/java/org/jeecgframework/web/graphreport/service/impl/core/GraphReportServiceImpl.java new file mode 100644 index 00000000..2aa6a40b --- /dev/null +++ b/src/main/java/org/jeecgframework/web/graphreport/service/impl/core/GraphReportServiceImpl.java @@ -0,0 +1,173 @@ +package org.jeecgframework.web.graphreport.service.impl.core; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.jeecgframework.web.cgreport.common.CgReportConstant; +import org.jeecgframework.web.cgreport.dao.core.CgReportDao; +import org.jeecgframework.web.graphreport.service.core.GraphReportServiceI; +import org.jeecgframework.core.common.dao.jdbc.JdbcDao; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service(value="graphReportService") +@Transactional +public class GraphReportServiceImpl extends CommonServiceImpl implements + GraphReportServiceI { + @Autowired + private JdbcDao jdbcDao; + @Autowired + private CgReportDao cgReportDao; + + + public Map queryCgReportConfig(String reportId) { + Map cgReportM = new HashMap(0); + Map mainM = jdbcDao.findForJdbc("SELECT * from jform_graphreport_head where code=?", new Object[]{reportId}).get(0); + List> itemsM = jdbcDao.findForJdbc("SELECT * from jform_graphreport_item where cgreport_head_id=? order by order_num asc", new Object[]{mainM.get("id")}); + cgReportM.put(CgReportConstant.MAIN, mainM); + cgReportM.put(CgReportConstant.ITEMS, itemsM); + return cgReportM; + } + + public Map queryCgReportMainConfig(String reportId){ +// String sql = JeecgSqlUtil.getMethodSql(JeecgSqlUtil.getMethodUrl()); +// Map parameters = new LinkedHashMap(); +// parameters.put("id", reportId); +// Map mainM = jdbcDao.findForMap(sql, parameters); + + //閲囩敤MiniDao瀹炵幇鏂瑰紡 + return cgReportDao.queryCgReportMainConfig(reportId); + } + + public List> queryCgReportItems(String reportId){ +// String sql = JeecgSqlUtil.getMethodSql(JeecgSqlUtil.getMethodUrl()); +// Map parameters = new LinkedHashMap(); +// parameters.put("configId", reportId); +// List> items = jdbcDao.findForListMap(sql, parameters); + + //閲囩敤MiniDao瀹炵幇鏂瑰紡 + return cgReportDao.queryCgReportItems(reportId); + } + @SuppressWarnings("unchecked") + + public List> queryByCgReportSql(String sql, Map params, + int page, int rows) { + sql = handleElInSQL(sql, params); + String querySql = getFullSql(sql,params); + List> result = null; + if(page==-1 && rows==-1){ + result = jdbcDao.findForJdbc(querySql); + }else{ + result = jdbcDao.findForJdbc(querySql, page, rows); + } + return result; + } + + /** + * 澶勭悊SQL鐨剓}鏉′欢琛ㄨ揪寮 + */ + public String handleElInSQL(String sql, Map params) { + Pattern p = Pattern.compile("\\{[^}]+\\}"); + Matcher m = p.matcher(sql); + //濡傛灉鏉′欢涓瓨鍦ㄦ鏍囩鍒欐浛鎹 + while (m.find()) { + String oel = m.group(); + String el = oel.replace("{", "").replace("}", "").trim(); + //鏇挎崲{xx:xx}鏍囩 + if(el.indexOf(":") != -1) { + String[] elSplit = el.split(":"); + String elKey = elSplit[0].trim(); + String elValue = elSplit[1].trim(); + //濡傛灉鏉′欢涓瓨鍦ㄦ鏍囩鍒欐浛鎹 + Object condValue = params.get(elSplit[1].trim()); + if(condValue != null) { + sql = sql.replace(oel, elKey + condValue.toString().replace(" " + elValue + " ", " " + elKey + " ")); + }else { + sql = sql.replace(oel, "1=1"); + } + params.remove(elValue); + }else { + //鏇挎崲{xx}鏍囩 + Object condValue = params.get(el); + if(condValue != null) { + sql = sql.replace(oel, el + condValue.toString()); + }else { + sql = sql.replace(oel, "1=1"); + } + params.remove(el); + } + } + return sql; + } + + /** + * 鑾峰彇鎷艰鏌ヨ鏉′欢涔嬪悗鐨剆ql + * @param sql + * @param params + * @return + */ + @SuppressWarnings("unchecked") + private String getFullSql(String sql,Map params){ + //鎻愬彇sql涓殑order by閮ㄥ垎锛屽湪涓嬮潰杩藉姞鍒癝QL缁撳熬 + String orderBy = ""; + Pattern p = Pattern.compile("order +by.*",Pattern.CASE_INSENSITIVE); + Matcher m = p.matcher(sql); + if(m.find()) { + orderBy = " " + m.group(); + sql = sql.replace(orderBy, ""); + } + + StringBuilder sqlB = new StringBuilder(); + sqlB.append("SELECT t.* FROM ( "); + sqlB.append(sql+" "); + sqlB.append(") t "); + if (params.size() >= 1) { + sqlB.append("WHERE 1=1 "); + Iterator it = params.keySet().iterator(); + while (it.hasNext()) { + String key = String.valueOf(it.next()); + String value = String.valueOf(params.get(key)); + if (!StringUtil.isEmpty(value) && !"null".equals(value)) { + sqlB.append(" AND "); + sqlB.append(" " + key + value ); + } + } + } + //order by杩藉姞鍒癝QL缁撳熬 + sqlB.append(orderBy); + return sqlB.toString(); + } + @SuppressWarnings("unchecked") + + public long countQueryByCgReportSql(String sql, Map params) { + String querySql = getFullSql(sql,params); + querySql = "SELECT COUNT(*) FROM ("+querySql+") t2"; + long result = jdbcDao.findForLong(querySql,new HashMap(0)); + return result; + } + @SuppressWarnings( "unchecked" ) + + public List getSqlFields(String sql) { + if(oConvertUtils.isEmpty(sql)){ + return null; + } + List> result = jdbcDao.findForJdbc(sql, 1, 1); + if(result.size()<1){ + throw new BusinessException("璇ユ姤琛╯ql娌℃湁鏁版嵁"); + } + Set fieldsSet= result.get(0).keySet(); + List fileds = new ArrayList(fieldsSet); + return fileds; + } +} diff --git a/src/main/java/org/jeecgframework/web/rest/controller/UserRestController.java b/src/main/java/org/jeecgframework/web/rest/controller/UserRestController.java new file mode 100644 index 00000000..f0276e05 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/rest/controller/UserRestController.java @@ -0,0 +1,101 @@ +package org.jeecgframework.web.rest.controller; + +import java.net.URI; +import java.util.List; +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validator; + +import org.jeecgframework.web.system.pojo.base.TSUser; +import org.jeecgframework.web.system.service.UserService; + +import org.jeecgframework.core.beanvalidator.BeanValidators; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +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.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.util.UriComponentsBuilder; + +/** + * TSUser鐨凴estful API鐨凜ontroller. + * + * @author liuht + */ +@Controller +@RequestMapping(value = "/user") +public class UserRestController { + + @Autowired + private UserService userService; + + @Autowired + private Validator validator; + + @RequestMapping(method = RequestMethod.GET) + @ResponseBody + public List list() { + List listUsers=userService.getList(TSUser.class); + return listUsers; + } + + @RequestMapping(value = "/{id}", method = RequestMethod.GET) + @ResponseBody + public ResponseEntity get(@PathVariable("id") Long id) { + TSUser task = userService.get(TSUser.class, id); + if (task == null) { + return new ResponseEntity(HttpStatus.NOT_FOUND); + } + return new ResponseEntity(task, HttpStatus.OK); + } + + @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public ResponseEntity create(@RequestBody TSUser user, UriComponentsBuilder uriBuilder) { + //璋冪敤JSR303 Bean Validator杩涜鏍¢獙锛屽鏋滃嚭閿欒繑鍥炲惈400閿欒鐮佸強json鏍煎紡鐨勯敊璇俊鎭. + Set> failures = validator.validate(user); + if (!failures.isEmpty()) { + return new ResponseEntity(BeanValidators.extractPropertyAndMessage(failures), HttpStatus.BAD_REQUEST); + } + + //淇濆瓨鐢ㄦ埛 + userService.save(user); + + //鎸夌収Restful椋庢牸绾﹀畾锛屽垱寤烘寚鍚戞柊浠诲姟鐨剈rl, 涔熷彲浠ョ洿鎺ヨ繑鍥瀒d鎴栧璞. + String id = user.getId(); + URI uri = uriBuilder.path("/rest/user/" + id).build().toUri(); + HttpHeaders headers = new HttpHeaders(); + headers.setLocation(uri); + + return new ResponseEntity(headers, HttpStatus.CREATED); + } + + @RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity update(@RequestBody TSUser user) { + //璋冪敤JSR303 Bean Validator杩涜鏍¢獙锛屽鏋滃嚭閿欒繑鍥炲惈400閿欒鐮佸強json鏍煎紡鐨勯敊璇俊鎭. + Set> failures = validator.validate(user); + if (!failures.isEmpty()) { + return new ResponseEntity(BeanValidators.extractPropertyAndMessage(failures), HttpStatus.BAD_REQUEST); + } + + //淇濆瓨 + userService.saveOrUpdate(user); + + //鎸塕estful绾﹀畾锛岃繑鍥204鐘舵佺爜, 鏃犲唴瀹. 涔熷彲浠ヨ繑鍥200鐘舵佺爜. + return new ResponseEntity(HttpStatus.NO_CONTENT); + } + + @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) + @ResponseStatus(HttpStatus.NO_CONTENT) + public void delete(@PathVariable("id") Long id) { + userService.deleteEntityById(TSUser.class, id); + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/controller/TSSmsController.java b/src/main/java/org/jeecgframework/web/sms/controller/TSSmsController.java new file mode 100644 index 00000000..fd4712e5 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/controller/TSSmsController.java @@ -0,0 +1,356 @@ +package org.jeecgframework.web.sms.controller; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.sms.entity.TSSmsEntity; +import org.jeecgframework.web.sms.service.TSSmsServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + + + +/** + * @Title: Controller + * @Description: 娑堟伅鍙戦佽褰曡〃 + * @author onlineGenerator + * @date 2014-09-18 00:01:53 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/tSSmsController") +public class TSSmsController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(TSSmsController.class); + + @Autowired + private TSSmsServiceI tSSmsService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 娑堟伅鍙戦佽褰曡〃鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "tSSms") + public ModelAndView tSSms(HttpServletRequest request) { + return new ModelAndView("org/jeecgframework/web/sms/tSSmsList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(TSSmsEntity tSSms,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSSmsEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, tSSms, request.getParameterMap()); + try{ + //鑷畾涔夎拷鍔犳煡璇㈡潯浠 + }catch (Exception e) { + throw new BusinessException(e.getMessage()); + } + cq.add(); + this.tSSmsService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎娑堟伅鍙戦佽褰曡〃 + * + * @return + */ + @RequestMapping(params = "doDel") + @ResponseBody + public AjaxJson doDel(TSSmsEntity tSSms, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + tSSms = systemService.getEntity(TSSmsEntity.class, tSSms.getId()); + message = "娑堟伅鍙戦佽褰曡〃鍒犻櫎鎴愬姛"; + try{ + tSSmsService.delete(tSSms); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "娑堟伅鍙戦佽褰曡〃鍒犻櫎澶辫触"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鎵归噺鍒犻櫎娑堟伅鍙戦佽褰曡〃 + * + * @return + */ + @RequestMapping(params = "doBatchDel") + @ResponseBody + public AjaxJson doBatchDel(String ids,HttpServletRequest request){ + AjaxJson j = new AjaxJson(); + message = "娑堟伅鍙戦佽褰曡〃鍒犻櫎鎴愬姛"; + try{ + for(String id:ids.split(",")){ + TSSmsEntity tSSms = systemService.getEntity(TSSmsEntity.class, + id + ); + tSSmsService.delete(tSSms); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + } + }catch(Exception e){ + e.printStackTrace(); + message = "娑堟伅鍙戦佽褰曡〃鍒犻櫎澶辫触"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞娑堟伅鍙戦佽褰曡〃 + * + * @param ids + * @return + */ + @RequestMapping(params = "doAdd") + @ResponseBody + public AjaxJson doAdd(TSSmsEntity tSSms, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + message = "娑堟伅鍙戦佽褰曡〃娣诲姞鎴愬姛"; + try{ + tSSmsService.save(tSSms); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "娑堟伅鍙戦佽褰曡〃娣诲姞澶辫触"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鏇存柊娑堟伅鍙戦佽褰曡〃 + * + * @param ids + * @return + */ + @RequestMapping(params = "doUpdate") + @ResponseBody + public AjaxJson doUpdate(TSSmsEntity tSSms, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + message = "娑堟伅鍙戦佽褰曡〃鏇存柊鎴愬姛"; + TSSmsEntity t = tSSmsService.get(TSSmsEntity.class, tSSms.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(tSSms, t); + tSSmsService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + message = "娑堟伅鍙戦佽褰曡〃鏇存柊澶辫触"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + + /** + * 娑堟伅鍙戦佽褰曡〃鏂板椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "goAdd") + public ModelAndView goAdd(TSSmsEntity tSSms, HttpServletRequest req) { + if (StringUtil.isNotEmpty(tSSms.getId())) { + tSSms = tSSmsService.getEntity(TSSmsEntity.class, tSSms.getId()); + req.setAttribute("tSSmsPage", tSSms); + } + return new ModelAndView("org/jeecgframework/web/sms/tSSms-add"); + } + /** + * 娑堟伅鍙戦佽褰曡〃缂栬緫椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "goUpdate") + public ModelAndView goUpdate(TSSmsEntity tSSms, HttpServletRequest req) { + if (StringUtil.isNotEmpty(tSSms.getId())) { + tSSms = tSSmsService.getEntity(TSSmsEntity.class, tSSms.getId()); + req.setAttribute("tSSmsPage", tSSms); + } + return new ModelAndView("org/jeecgframework/web/sms/tSSms-update"); + } + + /** + * 瀵煎叆鍔熻兘璺宠浆 + * + * @return + */ + @RequestMapping(params = "upload") + public ModelAndView upload(HttpServletRequest req) { + return new ModelAndView("org/jeecgframework/web/sms/tSSmsUpload"); + } + + /** + * 瀵煎嚭excel + * + * @param request + * @param response + + @RequestMapping(params = "exportXls") + public void exportXls(TSSmsEntity tSSms,HttpServletRequest request,HttpServletResponse response + , DataGrid dataGrid) { + response.setContentType("application/vnd.ms-excel"); + String codedFileName = null; + OutputStream fOut = null; + try { + codedFileName = "娑堟伅鍙戦佽褰曡〃"; + // 鏍规嵁娴忚鍣ㄨ繘琛岃浆鐮侊紝浣垮叾鏀寔涓枃鏂囦欢鍚 + if (BrowserUtils.isIE(request)) { + response.setHeader( + "content-disposition", + "attachment;filename=" + + java.net.URLEncoder.encode(codedFileName, + "UTF-8") + ".xls"); + } else { + String newtitle = new String(codedFileName.getBytes("UTF-8"), + "ISO8859-1"); + response.setHeader("content-disposition", + "attachment;filename=" + newtitle + ".xls"); + } + // 浜х敓宸ヤ綔绨垮璞 + HSSFWorkbook workbook = null; + CriteriaQuery cq = new CriteriaQuery(TSSmsEntity.class, dataGrid); + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, tSSms, request.getParameterMap()); + + List tSSmss = this.tSSmsService.getListByCriteriaQuery(cq,false); + workbook = ExcelExportUtil.exportExcel(new ExportParams("娑堟伅鍙戦佽褰曡〃鍒楄〃", "瀵煎嚭浜:"+ResourceUtil.getSessionUserName().getRealName(), + "瀵煎嚭淇℃伅"), TSSmsEntity.class, tSSmss); + fOut = response.getOutputStream(); + workbook.write(fOut); + } catch (Exception e) { + } finally { + try { + fOut.flush(); + fOut.close(); + } catch (IOException e) { + + } + } + } */ + /** + * 瀵煎嚭excel 浣挎ā鏉 + * + * @param request + * @param response + + @RequestMapping(params = "exportXlsByT") + public void exportXlsByT(TSSmsEntity tSSms,HttpServletRequest request,HttpServletResponse response + , DataGrid dataGrid) { + response.setContentType("application/vnd.ms-excel"); + String codedFileName = null; + OutputStream fOut = null; + try { + codedFileName = "娑堟伅鍙戦佽褰曡〃"; + // 鏍规嵁娴忚鍣ㄨ繘琛岃浆鐮侊紝浣垮叾鏀寔涓枃鏂囦欢鍚 + if (BrowserUtils.isIE(request)) { + response.setHeader( + "content-disposition", + "attachment;filename=" + + java.net.URLEncoder.encode(codedFileName, + "UTF-8") + ".xls"); + } else { + String newtitle = new String(codedFileName.getBytes("UTF-8"), + "ISO8859-1"); + response.setHeader("content-disposition", + "attachment;filename=" + newtitle + ".xls"); + } + // 浜х敓宸ヤ綔绨垮璞 + HSSFWorkbook workbook = null; + workbook = ExcelExportUtil.exportExcel(new ExportParams("娑堟伅鍙戦佽褰曡〃鍒楄〃", "瀵煎嚭浜:"+ResourceUtil.getSessionUserName().getRealName(), + "瀵煎嚭淇℃伅"), TSSmsEntity.class, null); + fOut = response.getOutputStream(); + workbook.write(fOut); + } catch (Exception e) { + } finally { + try { + fOut.flush(); + fOut.close(); + } catch (IOException e) { + + } + } + } + */ + @SuppressWarnings("unchecked") + @RequestMapping(params = "importExcel", method = RequestMethod.POST) + @ResponseBody + public AjaxJson importExcel(HttpServletRequest request, HttpServletResponse response) { + AjaxJson j = new AjaxJson(); + +// MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; +// Map fileMap = multipartRequest.getFileMap(); +// for (Map.Entry entity : fileMap.entrySet()) { +// MultipartFile file = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 +// ImportParams params = new ImportParams(); +// params.setTitleRows(2); +// params.setSecondTitleRows(1); +// params.setNeedSave(true); +// try { +// List listTSSmsEntitys = +// (List)ExcelImportUtil.importExcelByIs(file.getInputStream(),TSSmsEntity.class,params); +// for (TSSmsEntity tSSms : listTSSmsEntitys) { +// tSSmsService.save(tSSms); +// } +// j.setMsg("鏂囦欢瀵煎叆鎴愬姛锛"); +// } catch (Exception e) { +// j.setMsg("鏂囦欢瀵煎叆澶辫触锛"); +// logger.error(ExceptionUtil.getExceptionMessage(e)); +// }finally{ +// try { +// file.getInputStream().close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } + return j; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/controller/TSSmsSqlController.java b/src/main/java/org/jeecgframework/web/sms/controller/TSSmsSqlController.java new file mode 100644 index 00000000..04f992a1 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/controller/TSSmsSqlController.java @@ -0,0 +1,357 @@ +package org.jeecgframework.web.sms.controller; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.web.sms.entity.TSSmsSqlEntity; +import org.jeecgframework.web.sms.service.TSSmsSqlServiceI; + + + +/** + * @Title: Controller + * @Description: 涓氬姟SQL琛 + * @author onlineGenerator + * @date 2014-09-17 23:52:58 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/tSSmsSqlController") +public class TSSmsSqlController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(TSSmsSqlController.class); + + @Autowired + private TSSmsSqlServiceI tSSmsSqlService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 涓氬姟SQL琛ㄥ垪琛 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "tSSmsSql") + public ModelAndView tSSmsSql(HttpServletRequest request) { + return new ModelAndView("org/jeecgframework/web/sms/tSSmsSqlList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(TSSmsSqlEntity tSSmsSql,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSSmsSqlEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, tSSmsSql, request.getParameterMap()); + try{ + //鑷畾涔夎拷鍔犳煡璇㈡潯浠 + }catch (Exception e) { + throw new BusinessException(e.getMessage()); + } + cq.add(); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎涓氬姟SQL琛 + * + * @return + */ + @RequestMapping(params = "doDel") + @ResponseBody + public AjaxJson doDel(TSSmsSqlEntity tSSmsSql, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + tSSmsSql = systemService.getEntity(TSSmsSqlEntity.class, tSSmsSql.getId()); + message = "涓氬姟SQL琛ㄥ垹闄ゆ垚鍔"; + try{ + systemService.delete(tSSmsSql); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "涓氬姟SQL琛ㄥ垹闄ゅけ璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鎵归噺鍒犻櫎涓氬姟SQL琛 + * + * @return + */ + @RequestMapping(params = "doBatchDel") + @ResponseBody + public AjaxJson doBatchDel(String ids,HttpServletRequest request){ + AjaxJson j = new AjaxJson(); + message = "涓氬姟SQL琛ㄥ垹闄ゆ垚鍔"; + try{ + for(String id:ids.split(",")){ + TSSmsSqlEntity tSSmsSql = systemService.getEntity(TSSmsSqlEntity.class, + id + ); + systemService.delete(tSSmsSql); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + } + }catch(Exception e){ + e.printStackTrace(); + message = "涓氬姟SQL琛ㄥ垹闄ゅけ璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞涓氬姟SQL琛 + * + * @param ids + * @return + */ + @RequestMapping(params = "doAdd") + @ResponseBody + public AjaxJson doAdd(TSSmsSqlEntity tSSmsSql, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + message = "涓氬姟SQL琛ㄦ坊鍔犳垚鍔"; + try{ + tSSmsSqlService.save(tSSmsSql); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "涓氬姟SQL琛ㄦ坊鍔犲け璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鏇存柊涓氬姟SQL琛 + * + * @param ids + * @return + */ + @RequestMapping(params = "doUpdate") + @ResponseBody + public AjaxJson doUpdate(TSSmsSqlEntity tSSmsSql, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + message = "涓氬姟SQL琛ㄦ洿鏂版垚鍔"; + TSSmsSqlEntity t = systemService.get(TSSmsSqlEntity.class, tSSmsSql.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(tSSmsSql, t); + systemService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + message = "涓氬姟SQL琛ㄦ洿鏂板け璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + + /** + * 涓氬姟SQL琛ㄦ柊澧為〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "goAdd") + public ModelAndView goAdd(TSSmsSqlEntity tSSmsSql, HttpServletRequest req) { + if (StringUtil.isNotEmpty(tSSmsSql.getId())) { + tSSmsSql = systemService.getEntity(TSSmsSqlEntity.class, tSSmsSql.getId()); + req.setAttribute("tSSmsSqlPage", tSSmsSql); + } + return new ModelAndView("org/jeecgframework/web/sms/tSSmsSql-add"); + } + /** + * 涓氬姟SQL琛ㄧ紪杈戦〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "goUpdate") + public ModelAndView goUpdate(TSSmsSqlEntity tSSmsSql, HttpServletRequest req) { + if (StringUtil.isNotEmpty(tSSmsSql.getId())) { + tSSmsSql = systemService.getEntity(TSSmsSqlEntity.class, tSSmsSql.getId()); + req.setAttribute("tSSmsSqlPage", tSSmsSql); + } + return new ModelAndView("org/jeecgframework/web/sms/tSSmsSql-update"); + } + + /** + * 瀵煎叆鍔熻兘璺宠浆 + * + * @return + */ + @RequestMapping(params = "upload") + public ModelAndView upload(HttpServletRequest req) { + return new ModelAndView("org/jeecgframework/web/sms/tSSmsSqlUpload"); + } + + /** + * 瀵煎嚭excel + * + * @param request + * @param response + */ +// @RequestMapping(params = "exportXls") +// public void exportXls(TSSmsSqlEntity tSSmsSql,HttpServletRequest request,HttpServletResponse response +// , DataGrid dataGrid) { +// response.setContentType("application/vnd.ms-excel"); +// String codedFileName = null; +// OutputStream fOut = null; +// try { +// codedFileName = "涓氬姟SQL琛"; +// // 鏍规嵁娴忚鍣ㄨ繘琛岃浆鐮侊紝浣垮叾鏀寔涓枃鏂囦欢鍚 +// if (BrowserUtils.isIE(request)) { +// response.setHeader( +// "content-disposition", +// "attachment;filename=" +// + java.net.URLEncoder.encode(codedFileName, +// "UTF-8") + ".xls"); +// } else { +// String newtitle = new String(codedFileName.getBytes("UTF-8"), +// "ISO8859-1"); +// response.setHeader("content-disposition", +// "attachment;filename=" + newtitle + ".xls"); +// } +// // 浜х敓宸ヤ綔绨垮璞 +// HSSFWorkbook workbook = null; +// CriteriaQuery cq = new CriteriaQuery(TSSmsSqlEntity.class, dataGrid); +// org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, tSSmsSql, request.getParameterMap()); +// +// List tSSmsSqls = this.systemService.getListByCriteriaQuery(cq,false); +// workbook = ExcelExportUtil.exportExcel(new ExportParams("涓氬姟SQL琛ㄥ垪琛", "瀵煎嚭浜:"+ResourceUtil.getSessionUserName().getRealName(), +// "瀵煎嚭淇℃伅"), TSSmsSqlEntity.class, tSSmsSqls); +// fOut = response.getOutputStream(); +// workbook.write(fOut); +// } catch (Exception e) { +// } finally { +// try { +// fOut.flush(); +// fOut.close(); +// } catch (IOException e) { +// +// } +// } +// } + /** + * 瀵煎嚭excel 浣挎ā鏉 + * + * @param request + * @param response + */ +// @RequestMapping(params = "exportXlsByT") +// public void exportXlsByT(TSSmsSqlEntity tSSmsSql,HttpServletRequest request,HttpServletResponse response +// , DataGrid dataGrid) { +// response.setContentType("application/vnd.ms-excel"); +// String codedFileName = null; +// OutputStream fOut = null; +// try { +// codedFileName = "涓氬姟SQL琛"; +// // 鏍规嵁娴忚鍣ㄨ繘琛岃浆鐮侊紝浣垮叾鏀寔涓枃鏂囦欢鍚 +// if (BrowserUtils.isIE(request)) { +// response.setHeader( +// "content-disposition", +// "attachment;filename=" +// + java.net.URLEncoder.encode(codedFileName, +// "UTF-8") + ".xls"); +// } else { +// String newtitle = new String(codedFileName.getBytes("UTF-8"), +// "ISO8859-1"); +// response.setHeader("content-disposition", +// "attachment;filename=" + newtitle + ".xls"); +// } +// // 浜х敓宸ヤ綔绨垮璞 +// HSSFWorkbook workbook = null; +// workbook = ExcelExportUtil.exportExcel(new ExportParams("涓氬姟SQL琛ㄥ垪琛", "瀵煎嚭浜:"+ResourceUtil.getSessionUserName().getRealName(), +// "瀵煎嚭淇℃伅"), TSSmsSqlEntity.class, null); +// fOut = response.getOutputStream(); +// workbook.write(fOut); +// } catch (Exception e) { +// } finally { +// try { +// fOut.flush(); +// fOut.close(); +// } catch (IOException e) { +// +// } +// } +// } + + @SuppressWarnings("unchecked") + @RequestMapping(params = "importExcel", method = RequestMethod.POST) + @ResponseBody + public AjaxJson importExcel(HttpServletRequest request, HttpServletResponse response) { + AjaxJson j = new AjaxJson(); + +// MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; +// Map fileMap = multipartRequest.getFileMap(); +// for (Map.Entry entity : fileMap.entrySet()) { +// MultipartFile file = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 +// ImportParams params = new ImportParams(); +// params.setTitleRows(2); +// params.setSecondTitleRows(1); +// params.setNeedSave(true); +// try { +// List listTSSmsSqlEntitys = +// (List)ExcelImportUtil.importExcelByIs(file.getInputStream(),TSSmsSqlEntity.class,params); +// for (TSSmsSqlEntity tSSmsSql : listTSSmsSqlEntitys) { +// systemService.save(tSSmsSql); +// } +// j.setMsg("鏂囦欢瀵煎叆鎴愬姛锛"); +// } catch (Exception e) { +// j.setMsg("鏂囦欢瀵煎叆澶辫触锛"); +// logger.error(ExceptionUtil.getExceptionMessage(e)); +// }finally{ +// try { +// file.getInputStream().close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } + return j; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/controller/TSSmsTemplateController.java b/src/main/java/org/jeecgframework/web/sms/controller/TSSmsTemplateController.java new file mode 100644 index 00000000..5ec0e092 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/controller/TSSmsTemplateController.java @@ -0,0 +1,357 @@ +package org.jeecgframework.web.sms.controller; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.web.sms.entity.TSSmsTemplateEntity; +import org.jeecgframework.web.sms.service.TSSmsTemplateServiceI; + + + +/** + * @Title: Controller + * @Description: 娑堟伅妯℃湰琛 + * @author onlineGenerator + * @date 2014-09-17 23:52:46 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/tSSmsTemplateController") +public class TSSmsTemplateController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(TSSmsTemplateController.class); + + @Autowired + private TSSmsTemplateServiceI tSSmsTemplateService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 娑堟伅妯℃湰琛ㄥ垪琛 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "tSSmsTemplate") + public ModelAndView tSSmsTemplate(HttpServletRequest request) { + return new ModelAndView("org/jeecgframework/web/sms/tSSmsTemplateList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(TSSmsTemplateEntity tSSmsTemplate,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSSmsTemplateEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, tSSmsTemplate, request.getParameterMap()); + try{ + //鑷畾涔夎拷鍔犳煡璇㈡潯浠 + }catch (Exception e) { + throw new BusinessException(e.getMessage()); + } + cq.add(); + this.tSSmsTemplateService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎娑堟伅妯℃湰琛 + * + * @return + */ + @RequestMapping(params = "doDel") + @ResponseBody + public AjaxJson doDel(TSSmsTemplateEntity tSSmsTemplate, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + tSSmsTemplate = systemService.getEntity(TSSmsTemplateEntity.class, tSSmsTemplate.getId()); + message = "娑堟伅妯℃湰琛ㄥ垹闄ゆ垚鍔"; + try{ + tSSmsTemplateService.delete(tSSmsTemplate); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "娑堟伅妯℃湰琛ㄥ垹闄ゅけ璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鎵归噺鍒犻櫎娑堟伅妯℃湰琛 + * + * @return + */ + @RequestMapping(params = "doBatchDel") + @ResponseBody + public AjaxJson doBatchDel(String ids,HttpServletRequest request){ + AjaxJson j = new AjaxJson(); + message = "娑堟伅妯℃湰琛ㄥ垹闄ゆ垚鍔"; + try{ + for(String id:ids.split(",")){ + TSSmsTemplateEntity tSSmsTemplate = systemService.getEntity(TSSmsTemplateEntity.class, + id + ); + tSSmsTemplateService.delete(tSSmsTemplate); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + } + }catch(Exception e){ + e.printStackTrace(); + message = "娑堟伅妯℃湰琛ㄥ垹闄ゅけ璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞娑堟伅妯℃湰琛 + * + * @param ids + * @return + */ + @RequestMapping(params = "doAdd") + @ResponseBody + public AjaxJson doAdd(TSSmsTemplateEntity tSSmsTemplate, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + message = "娑堟伅妯℃湰琛ㄦ坊鍔犳垚鍔"; + try{ + tSSmsTemplateService.save(tSSmsTemplate); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "娑堟伅妯℃湰琛ㄦ坊鍔犲け璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鏇存柊娑堟伅妯℃湰琛 + * + * @param ids + * @return + */ + @RequestMapping(params = "doUpdate") + @ResponseBody + public AjaxJson doUpdate(TSSmsTemplateEntity tSSmsTemplate, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + message = "娑堟伅妯℃湰琛ㄦ洿鏂版垚鍔"; + TSSmsTemplateEntity t = tSSmsTemplateService.get(TSSmsTemplateEntity.class, tSSmsTemplate.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(tSSmsTemplate, t); + tSSmsTemplateService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + message = "娑堟伅妯℃湰琛ㄦ洿鏂板け璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + + /** + * 娑堟伅妯℃湰琛ㄦ柊澧為〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "goAdd") + public ModelAndView goAdd(TSSmsTemplateEntity tSSmsTemplate, HttpServletRequest req) { + if (StringUtil.isNotEmpty(tSSmsTemplate.getId())) { + tSSmsTemplate = tSSmsTemplateService.getEntity(TSSmsTemplateEntity.class, tSSmsTemplate.getId()); + req.setAttribute("tSSmsTemplatePage", tSSmsTemplate); + } + return new ModelAndView("org/jeecgframework/web/sms/tSSmsTemplate-add"); + } + /** + * 娑堟伅妯℃湰琛ㄧ紪杈戦〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "goUpdate") + public ModelAndView goUpdate(TSSmsTemplateEntity tSSmsTemplate, HttpServletRequest req) { + if (StringUtil.isNotEmpty(tSSmsTemplate.getId())) { + tSSmsTemplate = tSSmsTemplateService.getEntity(TSSmsTemplateEntity.class, tSSmsTemplate.getId()); + req.setAttribute("tSSmsTemplatePage", tSSmsTemplate); + } + return new ModelAndView("org/jeecgframework/web/sms/tSSmsTemplate-update"); + } + + /** + * 瀵煎叆鍔熻兘璺宠浆 + * + * @return + */ + @RequestMapping(params = "upload") + public ModelAndView upload(HttpServletRequest req) { + return new ModelAndView("org/jeecgframework/web/sms/tSSmsTemplateUpload"); + } + + /** + * 瀵煎嚭excel + * + * @param request + * @param response + */ +// @RequestMapping(params = "exportXls") +// public void exportXls(TSSmsTemplateEntity tSSmsTemplate,HttpServletRequest request,HttpServletResponse response +// , DataGrid dataGrid) { +// response.setContentType("application/vnd.ms-excel"); +// String codedFileName = null; +// OutputStream fOut = null; +// try { +// codedFileName = "娑堟伅妯℃湰琛"; +// // 鏍规嵁娴忚鍣ㄨ繘琛岃浆鐮侊紝浣垮叾鏀寔涓枃鏂囦欢鍚 +// if (BrowserUtils.isIE(request)) { +// response.setHeader( +// "content-disposition", +// "attachment;filename=" +// + java.net.URLEncoder.encode(codedFileName, +// "UTF-8") + ".xls"); +// } else { +// String newtitle = new String(codedFileName.getBytes("UTF-8"), +// "ISO8859-1"); +// response.setHeader("content-disposition", +// "attachment;filename=" + newtitle + ".xls"); +// } +// // 浜х敓宸ヤ綔绨垮璞 +// HSSFWorkbook workbook = null; +// CriteriaQuery cq = new CriteriaQuery(TSSmsTemplateEntity.class, dataGrid); +// org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, tSSmsTemplate, request.getParameterMap()); +// +// List tSSmsTemplates = this.tSSmsTemplateService.getListByCriteriaQuery(cq,false); +// workbook = ExcelExportUtil.exportExcel(new ExportParams("娑堟伅妯℃湰琛ㄥ垪琛", "瀵煎嚭浜:"+ResourceUtil.getSessionUserName().getRealName(), +// "瀵煎嚭淇℃伅"), TSSmsTemplateEntity.class, tSSmsTemplates); +// fOut = response.getOutputStream(); +// workbook.write(fOut); +// } catch (Exception e) { +// } finally { +// try { +// fOut.flush(); +// fOut.close(); +// } catch (IOException e) { +// +// } +// } +// } + /** + * 瀵煎嚭excel 浣挎ā鏉 + * + * @param request + * @param response + */ +// @RequestMapping(params = "exportXlsByT") +// public void exportXlsByT(TSSmsTemplateEntity tSSmsTemplate,HttpServletRequest request,HttpServletResponse response +// , DataGrid dataGrid) { +// response.setContentType("application/vnd.ms-excel"); +// String codedFileName = null; +// OutputStream fOut = null; +// try { +// codedFileName = "娑堟伅妯℃湰琛"; +// // 鏍规嵁娴忚鍣ㄨ繘琛岃浆鐮侊紝浣垮叾鏀寔涓枃鏂囦欢鍚 +// if (BrowserUtils.isIE(request)) { +// response.setHeader( +// "content-disposition", +// "attachment;filename=" +// + java.net.URLEncoder.encode(codedFileName, +// "UTF-8") + ".xls"); +// } else { +// String newtitle = new String(codedFileName.getBytes("UTF-8"), +// "ISO8859-1"); +// response.setHeader("content-disposition", +// "attachment;filename=" + newtitle + ".xls"); +// } +// // 浜х敓宸ヤ綔绨垮璞 +// HSSFWorkbook workbook = null; +// workbook = ExcelExportUtil.exportExcel(new ExportParams("娑堟伅妯℃湰琛ㄥ垪琛", "瀵煎嚭浜:"+ResourceUtil.getSessionUserName().getRealName(), +// "瀵煎嚭淇℃伅"), TSSmsTemplateEntity.class, null); +// fOut = response.getOutputStream(); +// workbook.write(fOut); +// } catch (Exception e) { +// } finally { +// try { +// fOut.flush(); +// fOut.close(); +// } catch (IOException e) { +// +// } +// } +// } + + @SuppressWarnings("unchecked") + @RequestMapping(params = "importExcel", method = RequestMethod.POST) + @ResponseBody + public AjaxJson importExcel(HttpServletRequest request, HttpServletResponse response) { + AjaxJson j = new AjaxJson(); + +// MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; +// Map fileMap = multipartRequest.getFileMap(); +// for (Map.Entry entity : fileMap.entrySet()) { +// MultipartFile file = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 +// ImportParams params = new ImportParams(); +// params.setTitleRows(2); +// params.setSecondTitleRows(1); +// params.setNeedSave(true); +// try { +// List listTSSmsTemplateEntitys = +// (List)ExcelImportUtil.importExcelByIs(file.getInputStream(),TSSmsTemplateEntity.class,params); +// for (TSSmsTemplateEntity tSSmsTemplate : listTSSmsTemplateEntitys) { +// tSSmsTemplateService.save(tSSmsTemplate); +// } +// j.setMsg("鏂囦欢瀵煎叆鎴愬姛锛"); +// } catch (Exception e) { +// j.setMsg("鏂囦欢瀵煎叆澶辫触锛"); +// logger.error(ExceptionUtil.getExceptionMessage(e)); +// }finally{ +// try { +// file.getInputStream().close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } + return j; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/controller/TSSmsTemplateSqlController.java b/src/main/java/org/jeecgframework/web/sms/controller/TSSmsTemplateSqlController.java new file mode 100644 index 00000000..492f9aae --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/controller/TSSmsTemplateSqlController.java @@ -0,0 +1,385 @@ +package org.jeecgframework.web.sms.controller; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.web.sms.entity.TSSmsTemplateSqlEntity; +import org.jeecgframework.web.sms.service.TSSmsTemplateSqlServiceI; +import org.jeecgframework.web.sms.util.TuiSongMsgUtil; + + + +/** + * @Title: Controller + * @Description: 娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛 + * @author onlineGenerator + * @date 2014-09-17 23:44:17 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/tSSmsTemplateSqlController") +public class TSSmsTemplateSqlController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(TSSmsTemplateSqlController.class); + + @Autowired + private TSSmsTemplateSqlServiceI tSSmsTemplateSqlService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + /** + * 娑堟伅鎺ㄩ佹祴璇 + * @param tSSmsTemplateSql + * @param request + * @return + */ + @RequestMapping(params = "pushMsg") + @ResponseBody + public AjaxJson pushMsg(TSSmsTemplateSqlEntity tSSmsTemplateSql, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtils.isBlank(tSSmsTemplateSql.getCode())){ + j.setSuccess(false); + j.setMsg("閰嶇疆CODE涓嶈兘涓虹┖"); + }else { + Map map = new HashMap(); + map.put("id", "4028d881436d514601436d521ae80165"); + String r = TuiSongMsgUtil.sendMessage("娑堟伅鎺ㄩ佹祴璇333","2", tSSmsTemplateSql.getCode(), map, "411944058@qq.com"); + if (!"success".equals(r)){ + j.setSuccess(false); + j.setMsg(r); + } + } + return j; + } + + /** + * 娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄥ垪琛 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "tSSmsTemplateSql") + public ModelAndView tSSmsTemplateSql(HttpServletRequest request) { + return new ModelAndView("org/jeecgframework/web/sms/tSSmsTemplateSqlList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(TSSmsTemplateSqlEntity tSSmsTemplateSql,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSSmsTemplateSqlEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, tSSmsTemplateSql, request.getParameterMap()); + try{ + //鑷畾涔夎拷鍔犳煡璇㈡潯浠 + }catch (Exception e) { + throw new BusinessException(e.getMessage()); + } + cq.add(); + this.tSSmsTemplateSqlService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛 + * + * @return + */ + @RequestMapping(params = "doDel") + @ResponseBody + public AjaxJson doDel(TSSmsTemplateSqlEntity tSSmsTemplateSql, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + tSSmsTemplateSql = systemService.getEntity(TSSmsTemplateSqlEntity.class, tSSmsTemplateSql.getId()); + message = "娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄥ垹闄ゆ垚鍔"; + try{ + tSSmsTemplateSqlService.delete(tSSmsTemplateSql); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄥ垹闄ゅけ璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鎵归噺鍒犻櫎娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛 + * + * @return + */ + @RequestMapping(params = "doBatchDel") + @ResponseBody + public AjaxJson doBatchDel(String ids,HttpServletRequest request){ + AjaxJson j = new AjaxJson(); + message = "娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄥ垹闄ゆ垚鍔"; + try{ + for(String id:ids.split(",")){ + TSSmsTemplateSqlEntity tSSmsTemplateSql = systemService.getEntity(TSSmsTemplateSqlEntity.class, + id + ); + tSSmsTemplateSqlService.delete(tSSmsTemplateSql); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + } + }catch(Exception e){ + e.printStackTrace(); + message = "娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄥ垹闄ゅけ璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛 + * + * @param ids + * @return + */ + @RequestMapping(params = "doAdd") + @ResponseBody + public AjaxJson doAdd(TSSmsTemplateSqlEntity tSSmsTemplateSql, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + message = "娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄦ坊鍔犳垚鍔"; + try{ + tSSmsTemplateSqlService.save(tSSmsTemplateSql); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄦ坊鍔犲け璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鏇存柊娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛 + * + * @param ids + * @return + */ + @RequestMapping(params = "doUpdate") + @ResponseBody + public AjaxJson doUpdate(TSSmsTemplateSqlEntity tSSmsTemplateSql, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + message = "娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄦ洿鏂版垚鍔"; + TSSmsTemplateSqlEntity t = tSSmsTemplateSqlService.get(TSSmsTemplateSqlEntity.class, tSSmsTemplateSql.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(tSSmsTemplateSql, t); + tSSmsTemplateSqlService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + message = "娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄦ洿鏂板け璐"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + + /** + * 娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄦ柊澧為〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "goAdd") + public ModelAndView goAdd(TSSmsTemplateSqlEntity tSSmsTemplateSql, HttpServletRequest req) { + if (StringUtil.isNotEmpty(tSSmsTemplateSql.getId())) { + tSSmsTemplateSql = tSSmsTemplateSqlService.getEntity(TSSmsTemplateSqlEntity.class, tSSmsTemplateSql.getId()); + req.setAttribute("tSSmsTemplateSqlPage", tSSmsTemplateSql); + } + return new ModelAndView("org/jeecgframework/web/sms/tSSmsTemplateSql-add"); + } + /** + * 娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄧ紪杈戦〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "goUpdate") + public ModelAndView goUpdate(TSSmsTemplateSqlEntity tSSmsTemplateSql, HttpServletRequest req) { + if (StringUtil.isNotEmpty(tSSmsTemplateSql.getId())) { + tSSmsTemplateSql = tSSmsTemplateSqlService.getEntity(TSSmsTemplateSqlEntity.class, tSSmsTemplateSql.getId()); + req.setAttribute("tSSmsTemplateSqlPage", tSSmsTemplateSql); + } + return new ModelAndView("org/jeecgframework/web/sms/tSSmsTemplateSql-update"); + } + + /** + * 瀵煎叆鍔熻兘璺宠浆 + * + * @return + */ + @RequestMapping(params = "upload") + public ModelAndView upload(HttpServletRequest req) { + return new ModelAndView("org/jeecgframework/web/sms/tSSmsTemplateSqlUpload"); + } + + /** + * 瀵煎嚭excel + * + * @param request + * @param response + */ +// @RequestMapping(params = "exportXls") +// public void exportXls(TSSmsTemplateSqlEntity tSSmsTemplateSql,HttpServletRequest request,HttpServletResponse response +// , DataGrid dataGrid) { +// response.setContentType("application/vnd.ms-excel"); +// String codedFileName = null; +// OutputStream fOut = null; +// try { +// codedFileName = "娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛"; +// // 鏍规嵁娴忚鍣ㄨ繘琛岃浆鐮侊紝浣垮叾鏀寔涓枃鏂囦欢鍚 +// if (BrowserUtils.isIE(request)) { +// response.setHeader( +// "content-disposition", +// "attachment;filename=" +// + java.net.URLEncoder.encode(codedFileName, +// "UTF-8") + ".xls"); +// } else { +// String newtitle = new String(codedFileName.getBytes("UTF-8"), +// "ISO8859-1"); +// response.setHeader("content-disposition", +// "attachment;filename=" + newtitle + ".xls"); +// } +// // 浜х敓宸ヤ綔绨垮璞 +// HSSFWorkbook workbook = null; +// CriteriaQuery cq = new CriteriaQuery(TSSmsTemplateSqlEntity.class, dataGrid); +// org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, tSSmsTemplateSql, request.getParameterMap()); +// +// List tSSmsTemplateSqls = this.tSSmsTemplateSqlService.getListByCriteriaQuery(cq,false); +// workbook = ExcelExportUtil.exportExcel(new ExportParams("娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄥ垪琛", "瀵煎嚭浜:"+ResourceUtil.getSessionUserName().getRealName(), +// "瀵煎嚭淇℃伅"), TSSmsTemplateSqlEntity.class, tSSmsTemplateSqls); +// fOut = response.getOutputStream(); +// workbook.write(fOut); +// } catch (Exception e) { +// } finally { +// try { +// fOut.flush(); +// fOut.close(); +// } catch (IOException e) { +// +// } +// } +// } +// /** +// * 瀵煎嚭excel 浣挎ā鏉 +// * +// * @param request +// * @param response +// */ +// @RequestMapping(params = "exportXlsByT") +// public void exportXlsByT(TSSmsTemplateSqlEntity tSSmsTemplateSql,HttpServletRequest request,HttpServletResponse response +// , DataGrid dataGrid) { +// response.setContentType("application/vnd.ms-excel"); +// String codedFileName = null; +// OutputStream fOut = null; +// try { +// codedFileName = "娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛"; +// // 鏍规嵁娴忚鍣ㄨ繘琛岃浆鐮侊紝浣垮叾鏀寔涓枃鏂囦欢鍚 +// if (BrowserUtils.isIE(request)) { +// response.setHeader( +// "content-disposition", +// "attachment;filename=" +// + java.net.URLEncoder.encode(codedFileName, +// "UTF-8") + ".xls"); +// } else { +// String newtitle = new String(codedFileName.getBytes("UTF-8"), +// "ISO8859-1"); +// response.setHeader("content-disposition", +// "attachment;filename=" + newtitle + ".xls"); +// } +// // 浜х敓宸ヤ綔绨垮璞 +// HSSFWorkbook workbook = null; +// workbook = ExcelExportUtil.exportExcel(new ExportParams("娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛ㄥ垪琛", "瀵煎嚭浜:"+ResourceUtil.getSessionUserName().getRealName(), +// "瀵煎嚭淇℃伅"), TSSmsTemplateSqlEntity.class, null); +// fOut = response.getOutputStream(); +// workbook.write(fOut); +// } catch (Exception e) { +// } finally { +// try { +// fOut.flush(); +// fOut.close(); +// } catch (IOException e) { +// +// } +// } +// } + + @SuppressWarnings("unchecked") + @RequestMapping(params = "importExcel", method = RequestMethod.POST) + @ResponseBody + public AjaxJson importExcel(HttpServletRequest request, HttpServletResponse response) { + AjaxJson j = new AjaxJson(); + +// MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; +// Map fileMap = multipartRequest.getFileMap(); +// for (Map.Entry entity : fileMap.entrySet()) { +// MultipartFile file = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 +// ImportParams params = new ImportParams(); +// params.setTitleRows(2); +// //params.setSecondTitleRows(1); +// params.setNeedSave(true); +// try { +// List listTSSmsTemplateSqlEntitys = +// (List)ExcelImportUtil.importExcelByIs(file.getInputStream(),TSSmsTemplateSqlEntity.class,params); +// for (TSSmsTemplateSqlEntity tSSmsTemplateSql : listTSSmsTemplateSqlEntitys) { +// tSSmsTemplateSqlService.save(tSSmsTemplateSql); +// } +// j.setMsg("鏂囦欢瀵煎叆鎴愬姛锛"); +// } catch (Exception e) { +// j.setMsg("鏂囦欢瀵煎叆澶辫触锛"); +// logger.error(ExceptionUtil.getExceptionMessage(e)); +// }finally{ +// try { +// file.getInputStream().close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } + return j; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/entity/TSSmsEntity.java b/src/main/java/org/jeecgframework/web/sms/entity/TSSmsEntity.java new file mode 100644 index 00000000..1d9e87db --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/entity/TSSmsEntity.java @@ -0,0 +1,316 @@ +package org.jeecgframework.web.sms.entity; + +import java.math.BigDecimal; +import java.util.Date; +import java.lang.String; +import java.lang.Double; +import java.lang.Integer; +import java.math.BigDecimal; +import javax.xml.soap.Text; +import java.sql.Blob; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Title: Entity + * @Description: 娑堟伅鍙戦佽褰曡〃 + * @author onlineGenerator + * @date 2014-09-18 00:01:53 + * @version V1.0 + * + */ +@Entity +@Table(name = "t_s_sms", schema = "") +@SuppressWarnings("serial") +public class TSSmsEntity implements java.io.Serializable { + /**涓婚敭*/ + private java.lang.String id; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**鍒涘缓浜虹櫥褰曞悕绉*/ + private java.lang.String createBy; + /**鍒涘缓鏃ユ湡*/ + private java.util.Date createDate; + /**鏇存柊浜哄悕绉*/ + private java.lang.String updateName; + /**鏇存柊浜虹櫥褰曞悕绉*/ + private java.lang.String updateBy; + /**鏇存柊鏃ユ湡*/ + private java.util.Date updateDate; + /**娑堟伅鏍囬*/ + @Excel(name="娑堟伅鏍囬") + private java.lang.String esTitle; + /**娑堟伅绫诲瀷*/ + @Excel(name="娑堟伅绫诲瀷") + private java.lang.String esType; + /**鍙戦佷汉*/ + @Excel(name="鍙戦佷汉") + private java.lang.String esSender; + /**鎺ユ敹浜*/ + @Excel(name="鎺ユ敹浜") + private java.lang.String esReceiver; + /**鍐呭*/ + @Excel(name="鍐呭") + private java.lang.String esContent; + /**鍙戦佹椂闂*/ + @Excel(name="鍙戦佹椂闂") + private java.util.Date esSendtime; + /**鍙戦佺姸鎬*/ + @Excel(name="鍙戦佺姸鎬") + private java.lang.String esStatus; + /**澶囨敞*/ + @Excel(name="澶囨敞") + private java.lang.String remark; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=36) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + @Column(name ="CREATE_NAME",nullable=true,length=50) + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜虹櫥褰曞悕绉 + */ + @Column(name ="CREATE_BY",nullable=true,length=50) + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜虹櫥褰曞悕绉 + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃ユ湡 + */ + @Column(name ="CREATE_DATE",nullable=true,length=20) + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃ユ湡 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏇存柊浜哄悕绉 + */ + @Column(name ="UPDATE_NAME",nullable=true,length=50) + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏇存柊浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏇存柊浜虹櫥褰曞悕绉 + */ + @Column(name ="UPDATE_BY",nullable=true,length=50) + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏇存柊浜虹櫥褰曞悕绉 + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鏇存柊鏃ユ湡 + */ + @Column(name ="UPDATE_DATE",nullable=true,length=20) + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鏇存柊鏃ユ湡 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 娑堟伅鏍囬 + */ + @Column(name ="ES_TITLE",nullable=true,length=32) + public java.lang.String getEsTitle(){ + return this.esTitle; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 娑堟伅鏍囬 + */ + public void setEsTitle(java.lang.String esTitle){ + this.esTitle = esTitle; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 娑堟伅绫诲瀷 + */ + @Column(name ="ES_TYPE",nullable=true,length=1) + public java.lang.String getEsType(){ + return this.esType; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 娑堟伅绫诲瀷 + */ + public void setEsType(java.lang.String esType){ + this.esType = esType; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍙戦佷汉 + */ + @Column(name ="ES_SENDER",nullable=true,length=50) + public java.lang.String getEsSender(){ + return this.esSender; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍙戦佷汉 + */ + public void setEsSender(java.lang.String esSender){ + this.esSender = esSender; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鎺ユ敹浜 + */ + @Column(name ="ES_RECEIVER",nullable=true,length=50) + public java.lang.String getEsReceiver(){ + return this.esReceiver; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鎺ユ敹浜 + */ + public void setEsReceiver(java.lang.String esReceiver){ + this.esReceiver = esReceiver; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍐呭 + */ + @Column(name ="ES_CONTENT",nullable=true,length=1000) + public java.lang.String getEsContent(){ + return this.esContent; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍐呭 + */ + public void setEsContent(java.lang.String esContent){ + this.esContent = esContent; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍙戦佹椂闂 + */ + @Column(name ="ES_SENDTIME",nullable=true,length=32) + public java.util.Date getEsSendtime(){ + return this.esSendtime; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍙戦佹椂闂 + */ + public void setEsSendtime(java.util.Date esSendtime){ + this.esSendtime = esSendtime; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍙戦佺姸鎬 + */ + @Column(name ="ES_STATUS",nullable=true,length=1) + public java.lang.String getEsStatus(){ + return this.esStatus; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍙戦佺姸鎬 + */ + public void setEsStatus(java.lang.String esStatus){ + this.esStatus = esStatus; + } + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 澶囨敞 + */ + @Column(name ="remark",nullable=true,length=1) + public java.lang.String getRemark(){ + return this.remark; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 澶囨敞 + */ + public void setRemark(java.lang.String remark){ + this.remark = remark; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/entity/TSSmsSqlEntity.java b/src/main/java/org/jeecgframework/web/sms/entity/TSSmsSqlEntity.java new file mode 100644 index 00000000..dc0d147d --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/entity/TSSmsSqlEntity.java @@ -0,0 +1,201 @@ +package org.jeecgframework.web.sms.entity; + +import java.math.BigDecimal; +import java.util.Date; +import java.lang.String; +import java.lang.Double; +import java.lang.Integer; +import java.math.BigDecimal; +import javax.xml.soap.Text; +import java.sql.Blob; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Title: Entity + * @Description: 涓氬姟SQL琛 + * @author onlineGenerator + * @date 2014-09-17 23:52:58 + * @version V1.0 + * + */ +@Entity +@Table(name = "t_s_sms_sql", schema = "") +@SuppressWarnings("serial") +public class TSSmsSqlEntity implements java.io.Serializable { + /**涓婚敭*/ + private java.lang.String id; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**鍒涘缓浜虹櫥褰曞悕绉*/ + private java.lang.String createBy; + /**鍒涘缓鏃ユ湡*/ + private java.util.Date createDate; + /**鏇存柊浜哄悕绉*/ + private java.lang.String updateName; + /**鏇存柊浜虹櫥褰曞悕绉*/ + private java.lang.String updateBy; + /**鏇存柊鏃ユ湡*/ + private java.util.Date updateDate; + /**SQL鍚嶇О*/ + @Excel(name="SQL鍚嶇О") + private java.lang.String sqlName; + /**SQL鍐呭*/ + @Excel(name="SQL鍐呭") + private java.lang.String sqlContent; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=36) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + @Column(name ="CREATE_NAME",nullable=true,length=50) + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜虹櫥褰曞悕绉 + */ + @Column(name ="CREATE_BY",nullable=true,length=50) + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜虹櫥褰曞悕绉 + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃ユ湡 + */ + @Column(name ="CREATE_DATE",nullable=true,length=20) + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃ユ湡 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏇存柊浜哄悕绉 + */ + @Column(name ="UPDATE_NAME",nullable=true,length=50) + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏇存柊浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏇存柊浜虹櫥褰曞悕绉 + */ + @Column(name ="UPDATE_BY",nullable=true,length=50) + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏇存柊浜虹櫥褰曞悕绉 + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鏇存柊鏃ユ湡 + */ + @Column(name ="UPDATE_DATE",nullable=true,length=20) + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鏇存柊鏃ユ湡 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String SQL鍚嶇О + */ + @Column(name ="SQL_NAME",nullable=true,length=32) + public java.lang.String getSqlName(){ + return this.sqlName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String SQL鍚嶇О + */ + public void setSqlName(java.lang.String sqlName){ + this.sqlName = sqlName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String SQL鍐呭 + */ + @Column(name ="SQL_CONTENT",nullable=true,length=1000) + public java.lang.String getSqlContent(){ + return this.sqlContent; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String SQL鍐呭 + */ + public void setSqlContent(java.lang.String sqlContent){ + this.sqlContent = sqlContent; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/entity/TSSmsTemplateEntity.java b/src/main/java/org/jeecgframework/web/sms/entity/TSSmsTemplateEntity.java new file mode 100644 index 00000000..718871e6 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/entity/TSSmsTemplateEntity.java @@ -0,0 +1,220 @@ +package org.jeecgframework.web.sms.entity; + +import java.math.BigDecimal; +import java.util.Date; +import java.lang.String; +import java.lang.Double; +import java.lang.Integer; +import java.math.BigDecimal; +import javax.xml.soap.Text; +import java.sql.Blob; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Title: Entity + * @Description: 娑堟伅妯℃湰琛 + * @author onlineGenerator + * @date 2014-09-17 23:52:46 + * @version V1.0 + * + */ +@Entity +@Table(name = "t_s_sms_template", schema = "") +@SuppressWarnings("serial") +public class TSSmsTemplateEntity implements java.io.Serializable { + /**涓婚敭*/ + private java.lang.String id; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**鍒涘缓浜虹櫥褰曞悕绉*/ + private java.lang.String createBy; + /**鍒涘缓鏃ユ湡*/ + private java.util.Date createDate; + /**鏇存柊浜哄悕绉*/ + private java.lang.String updateName; + /**鏇存柊浜虹櫥褰曞悕绉*/ + private java.lang.String updateBy; + /**鏇存柊鏃ユ湡*/ + private java.util.Date updateDate; + /**妯℃澘绫诲瀷*/ + @Excel(name="妯℃澘绫诲瀷") + private java.lang.String templateType; + /**妯℃澘鍚嶇О*/ + @Excel(name="妯℃澘鍚嶇О") + private java.lang.String templateName; + /**妯℃澘鍐呭*/ + @Excel(name="妯℃澘鍐呭") + private java.lang.String templateContent; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=36) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + @Column(name ="CREATE_NAME",nullable=true,length=50) + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜虹櫥褰曞悕绉 + */ + @Column(name ="CREATE_BY",nullable=true,length=50) + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜虹櫥褰曞悕绉 + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃ユ湡 + */ + @Column(name ="CREATE_DATE",nullable=true,length=20) + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃ユ湡 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏇存柊浜哄悕绉 + */ + @Column(name ="UPDATE_NAME",nullable=true,length=50) + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏇存柊浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏇存柊浜虹櫥褰曞悕绉 + */ + @Column(name ="UPDATE_BY",nullable=true,length=50) + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏇存柊浜虹櫥褰曞悕绉 + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鏇存柊鏃ユ湡 + */ + @Column(name ="UPDATE_DATE",nullable=true,length=20) + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鏇存柊鏃ユ湡 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 妯℃澘绫诲瀷 + */ + @Column(name ="TEMPLATE_TYPE",nullable=true,length=1) + public java.lang.String getTemplateType(){ + return this.templateType; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 妯℃澘绫诲瀷 + */ + public void setTemplateType(java.lang.String templateType){ + this.templateType = templateType; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 妯℃澘鍚嶇О + */ + @Column(name ="TEMPLATE_NAME",nullable=true,length=50) + public java.lang.String getTemplateName(){ + return this.templateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 妯℃澘鍚嶇О + */ + public void setTemplateName(java.lang.String templateName){ + this.templateName = templateName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 妯℃澘鍐呭 + */ + @Column(name ="TEMPLATE_CONTENT",nullable=true,length=1000) + public java.lang.String getTemplateContent(){ + return this.templateContent; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 妯℃澘鍐呭 + */ + public void setTemplateContent(java.lang.String templateContent){ + this.templateContent = templateContent; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/entity/TSSmsTemplateSqlEntity.java b/src/main/java/org/jeecgframework/web/sms/entity/TSSmsTemplateSqlEntity.java new file mode 100644 index 00000000..d4450a71 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/entity/TSSmsTemplateSqlEntity.java @@ -0,0 +1,239 @@ +package org.jeecgframework.web.sms.entity; + +import java.math.BigDecimal; +import java.util.Date; +import java.lang.String; +import java.lang.Double; +import java.lang.Integer; +import java.math.BigDecimal; +import javax.xml.soap.Text; +import java.sql.Blob; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Title: Entity + * @Description: 娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛 + * @author onlineGenerator + * @date 2014-09-17 23:44:17 + * @version V1.0 + * + */ +@Entity +@Table(name = "t_s_sms_template_sql", schema = "") +@SuppressWarnings("serial") +public class TSSmsTemplateSqlEntity implements java.io.Serializable { + /**涓婚敭*/ + private java.lang.String id; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**鍒涘缓浜虹櫥褰曞悕绉*/ + private java.lang.String createBy; + /**鍒涘缓鏃ユ湡*/ + private java.util.Date createDate; + /**鏇存柊浜哄悕绉*/ + private java.lang.String updateName; + /**鏇存柊浜虹櫥褰曞悕绉*/ + private java.lang.String updateBy; + /**鏇存柊鏃ユ湡*/ + private java.util.Date updateDate; + /**閰嶇疆CODE*/ + @Excel(name="閰嶇疆CODE") + private java.lang.String code; + /**閰嶇疆鍚嶇О*/ + @Excel(name="閰嶇疆鍚嶇О") + private java.lang.String name; + /**涓氬姟SQLID*/ + @Excel(name="涓氬姟SQLID") + private java.lang.String sqlId; + /**娑堟伅妯℃湰ID*/ + @Excel(name="娑堟伅妯℃湰ID") + private java.lang.String templateId; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=36) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + @Column(name ="CREATE_NAME",nullable=true,length=50) + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜虹櫥褰曞悕绉 + */ + @Column(name ="CREATE_BY",nullable=true,length=50) + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜虹櫥褰曞悕绉 + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃ユ湡 + */ + @Column(name ="CREATE_DATE",nullable=true,length=20) + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃ユ湡 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏇存柊浜哄悕绉 + */ + @Column(name ="UPDATE_NAME",nullable=true,length=50) + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏇存柊浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏇存柊浜虹櫥褰曞悕绉 + */ + @Column(name ="UPDATE_BY",nullable=true,length=50) + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏇存柊浜虹櫥褰曞悕绉 + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鏇存柊鏃ユ湡 + */ + @Column(name ="UPDATE_DATE",nullable=true,length=20) + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鏇存柊鏃ユ湡 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 閰嶇疆CODE + */ + @Column(name ="CODE",nullable=true,length=32) + public java.lang.String getCode(){ + return this.code; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 閰嶇疆CODE + */ + public void setCode(java.lang.String code){ + this.code = code; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 閰嶇疆鍚嶇О + */ + @Column(name ="NAME",nullable=true,length=32) + public java.lang.String getName(){ + return this.name; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 閰嶇疆鍚嶇О + */ + public void setName(java.lang.String name){ + this.name = name; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓氬姟SQLID + */ + @Column(name ="SQL_ID",nullable=true,length=32) + public java.lang.String getSqlId(){ + return this.sqlId; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓氬姟SQLID + */ + public void setSqlId(java.lang.String sqlId){ + this.sqlId = sqlId; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 娑堟伅妯℃湰ID + */ + @Column(name ="TEMPLATE_ID",nullable=true,length=32) + public java.lang.String getTemplateId(){ + return this.templateId; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 娑堟伅妯℃湰ID + */ + public void setTemplateId(java.lang.String templateId){ + this.templateId = templateId; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/service/TSSmsServiceI.java b/src/main/java/org/jeecgframework/web/sms/service/TSSmsServiceI.java new file mode 100644 index 00000000..51768643 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/service/TSSmsServiceI.java @@ -0,0 +1,35 @@ +package org.jeecgframework.web.sms.service; +import org.jeecgframework.web.sms.entity.TSSmsEntity; +import org.jeecgframework.core.common.service.CommonService; + +import java.io.Serializable; + +public interface TSSmsServiceI extends CommonService{ + + public void delete(T entity); + + public Serializable save(T entity); + + public void saveOrUpdate(T entity); + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(TSSmsEntity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(TSSmsEntity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(TSSmsEntity t); + + public void send(); +} diff --git a/src/main/java/org/jeecgframework/web/sms/service/TSSmsSqlServiceI.java b/src/main/java/org/jeecgframework/web/sms/service/TSSmsSqlServiceI.java new file mode 100644 index 00000000..d5e7cdaa --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/service/TSSmsSqlServiceI.java @@ -0,0 +1,47 @@ +package org.jeecgframework.web.sms.service; +import org.jeecgframework.web.sms.entity.TSSmsSqlEntity; +import org.jeecgframework.core.common.service.CommonService; + +import java.io.Serializable; +import java.util.Map; + +public interface TSSmsSqlServiceI extends CommonService{ + + public void delete(T entity); + + public Serializable save(T entity); + + public void saveOrUpdate(T entity); + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(TSSmsSqlEntity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(TSSmsSqlEntity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(TSSmsSqlEntity t); + /** + * + * getMap(杩欓噷鐢ㄤ竴鍙ヨ瘽鎻忚堪杩欎釜鏂规硶鐨勪綔鐢) + * + * @Title: getMap + * @Description: TODO + * @param @param sql + * @param @param map + * @param @return 璁惧畾鏂囦欢 + * @return Map 杩斿洖绫诲瀷 + * @throws + */ + public Map getMap(String sql,Map map); +} diff --git a/src/main/java/org/jeecgframework/web/sms/service/TSSmsTemplateServiceI.java b/src/main/java/org/jeecgframework/web/sms/service/TSSmsTemplateServiceI.java new file mode 100644 index 00000000..b8f9cd22 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/service/TSSmsTemplateServiceI.java @@ -0,0 +1,33 @@ +package org.jeecgframework.web.sms.service; +import org.jeecgframework.web.sms.entity.TSSmsTemplateEntity; +import org.jeecgframework.core.common.service.CommonService; + +import java.io.Serializable; + +public interface TSSmsTemplateServiceI extends CommonService{ + + public void delete(T entity); + + public Serializable save(T entity); + + public void saveOrUpdate(T entity); + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(TSSmsTemplateEntity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(TSSmsTemplateEntity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(TSSmsTemplateEntity t); +} diff --git a/src/main/java/org/jeecgframework/web/sms/service/TSSmsTemplateSqlServiceI.java b/src/main/java/org/jeecgframework/web/sms/service/TSSmsTemplateSqlServiceI.java new file mode 100644 index 00000000..a57a3254 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/service/TSSmsTemplateSqlServiceI.java @@ -0,0 +1,33 @@ +package org.jeecgframework.web.sms.service; +import org.jeecgframework.web.sms.entity.TSSmsTemplateSqlEntity; +import org.jeecgframework.core.common.service.CommonService; + +import java.io.Serializable; + +public interface TSSmsTemplateSqlServiceI extends CommonService{ + + public void delete(T entity); + + public Serializable save(T entity); + + public void saveOrUpdate(T entity); + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(TSSmsTemplateSqlEntity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(TSSmsTemplateSqlEntity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(TSSmsTemplateSqlEntity t); +} diff --git a/src/main/java/org/jeecgframework/web/sms/service/impl/TSSmsServiceImpl.java b/src/main/java/org/jeecgframework/web/sms/service/impl/TSSmsServiceImpl.java new file mode 100644 index 00000000..2203436a --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/service/impl/TSSmsServiceImpl.java @@ -0,0 +1,158 @@ +package org.jeecgframework.web.sms.service.impl; +import java.io.PrintWriter; +import java.io.Serializable; +import java.net.ConnectException; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +import javax.mail.AuthenticationFailedException; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.PropertiesUtil; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.jeecgframework.web.sms.entity.TSSmsEntity; +import org.jeecgframework.web.sms.service.TSSmsServiceI; +import org.jeecgframework.web.sms.util.CMPPSenderUtil; +import org.jeecgframework.web.sms.util.Constants; +import org.jeecgframework.web.sms.util.MailUtil; + +import com.sun.mail.smtp.SMTPAddressFailedException; + +@Service("tSSmsService") +@Transactional +public class TSSmsServiceImpl extends CommonServiceImpl implements TSSmsServiceI { + + + public void delete(T entity) { + super.delete(entity); + //鎵ц鍒犻櫎鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doDelSql((TSSmsEntity)entity); + } + + public Serializable save(T entity) { + Serializable t = super.save(entity); + //鎵ц鏂板鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doAddSql((TSSmsEntity)entity); + return t; + } + + public void saveOrUpdate(T entity) { + super.saveOrUpdate(entity); + //鎵ц鏇存柊鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doUpdateSql((TSSmsEntity)entity); + } + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(TSSmsEntity t){ + return true; + } + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(TSSmsEntity t){ + return true; + } + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(TSSmsEntity t){ + return true; + } + + /** + * 鏇挎崲sql涓殑鍙橀噺 + * @param sql + * @return + */ + public String replaceVal(String sql,TSSmsEntity t){ + sql = sql.replace("#{id}",String.valueOf(t.getId())); + sql = sql.replace("#{create_name}",String.valueOf(t.getCreateName())); + sql = sql.replace("#{create_by}",String.valueOf(t.getCreateBy())); + sql = sql.replace("#{create_date}",String.valueOf(t.getCreateDate())); + sql = sql.replace("#{update_name}",String.valueOf(t.getUpdateName())); + sql = sql.replace("#{update_by}",String.valueOf(t.getUpdateBy())); + sql = sql.replace("#{update_date}",String.valueOf(t.getUpdateDate())); + sql = sql.replace("#{es_title}",String.valueOf(t.getEsTitle())); + sql = sql.replace("#{es_type}",String.valueOf(t.getEsType())); + sql = sql.replace("#{es_sender}",String.valueOf(t.getEsSender())); + sql = sql.replace("#{es_receiver}",String.valueOf(t.getEsReceiver())); + sql = sql.replace("#{es_content}",String.valueOf(t.getEsContent())); + sql = sql.replace("#{es_sendtime}",String.valueOf(t.getEsSendtime())); + sql = sql.replace("#{es_status}",String.valueOf(t.getEsStatus())); + sql = sql.replace("#{UUID}",UUID.randomUUID().toString()); + return sql; + } + /** + * 娑堟伅鍙戦佹帴鍙e疄鐜 + */ + @Override + @Transactional + public void send() { + System.out.println("===============娑堟伅鍙戞壂鎻忓紑濮================="); + //List smsSendList = findHql("from TSSmsEntity e where e.esStatus = ? or e.esStatus = ? ", Constants.SMS_SEND_STATUS_1,Constants.SMS_SEND_STATUS_3); + List smsSendList = findHql("from TSSmsEntity e where e.esStatus = ?", Constants.SMS_SEND_STATUS_1); + if(smsSendList==null || smsSendList.size()==0){ + return; + } + PropertiesUtil util = new PropertiesUtil("sysConfig.properties"); + for (TSSmsEntity tsSmsEntity : smsSendList) { + String remark = ""; + if(Constants.SMS_SEND_TYPE_2.equals(tsSmsEntity.getEsType())){ + //閭欢 + try { + MailUtil.sendEmail(util.readProperty("mail.smtpHost"), tsSmsEntity.getEsReceiver(),tsSmsEntity.getEsTitle(), + tsSmsEntity.getEsContent(), util.readProperty("mail.sender"), + util.readProperty("mail.user"), util.readProperty("mail.pwd")); + tsSmsEntity.setEsStatus(Constants.SMS_SEND_STATUS_2); + tsSmsEntity.setEsSendtime(new Date()); + remark = "鍙戦佹垚鍔"; + tsSmsEntity.setRemark(remark); + updateEntitie(tsSmsEntity); + } catch (Exception e) { + //tsSmsEntity.setEsStatus(Constants.SMS_SEND_STATUS_3); + if (e instanceof AuthenticationFailedException){ + remark = "璁よ瘉澶辫触閿欒鐨勭敤鎴峰悕鎴栬呭瘑鐮"; + }else if (e instanceof SMTPAddressFailedException){ + remark = "鎺ュ彈閭鏍煎紡涓嶅"; + }else if (e instanceof ConnectException){ + remark = "閭欢鏈嶅姟鍣ㄨ繛鎺ュけ璐"; + }else{ + remark = e.getMessage(); + } + //System.out.println(remark); + //e.printStackTrace(); + tsSmsEntity.setEsStatus(Constants.SMS_SEND_STATUS_3); + tsSmsEntity.setEsSendtime(new Date()); + tsSmsEntity.setRemark(remark); + updateEntitie(tsSmsEntity); + } + } + if(Constants.SMS_SEND_TYPE_1.equals(tsSmsEntity.getEsType())){ + //鐭俊 + String r = CMPPSenderUtil.sendMsg(tsSmsEntity.getEsReceiver(), tsSmsEntity.getEsContent()); + if ("0".equals(r)){ + tsSmsEntity.setEsStatus(Constants.SMS_SEND_STATUS_2); + }else { + tsSmsEntity.setEsStatus(Constants.SMS_SEND_STATUS_3); + } + } + //鏇存柊鍙戦佺姸鎬 + tsSmsEntity.setRemark(remark); + tsSmsEntity.setEsSendtime(new Date()); + updateEntitie(tsSmsEntity); + } + System.out.println("===============娑堟伅鍙戞壂鎻忕粨鏉================="); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/sms/service/impl/TSSmsSqlServiceImpl.java b/src/main/java/org/jeecgframework/web/sms/service/impl/TSSmsSqlServiceImpl.java new file mode 100644 index 00000000..8cbc1f2a --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/service/impl/TSSmsSqlServiceImpl.java @@ -0,0 +1,46 @@ +package org.jeecgframework.web.sms.service.impl; +import org.jeecgframework.web.sms.service.TSSmsSqlServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.web.sms.entity.TSSmsSqlEntity; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Map; +import java.util.UUID; +import java.io.Serializable; + +import javax.annotation.Resource; + +@Service("tSSmsSqlService") +@Transactional +public class TSSmsSqlServiceImpl extends CommonServiceImpl implements TSSmsSqlServiceI { + + @Resource + private JdbcTemplate jdbcTemplate; + @Override + public boolean doAddSql(TSSmsSqlEntity t) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean doDelSql(TSSmsSqlEntity t) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean doUpdateSql(TSSmsSqlEntity t) { + // TODO Auto-generated method stub + return false; + } +/** + * 鎵ц涓氬姟鏌ヨ鍑烘潵鐨剆ql + */ + public Map getMap(String sql,Map map){ + return this.jdbcTemplate.queryForMap(sql, map); + + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/sms/service/impl/TSSmsTemplateServiceImpl.java b/src/main/java/org/jeecgframework/web/sms/service/impl/TSSmsTemplateServiceImpl.java new file mode 100644 index 00000000..e6bbf3c8 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/service/impl/TSSmsTemplateServiceImpl.java @@ -0,0 +1,78 @@ +package org.jeecgframework.web.sms.service.impl; +import org.jeecgframework.web.sms.service.TSSmsTemplateServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.web.sms.entity.TSSmsTemplateEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.UUID; +import java.io.Serializable; + +@Service("tSSmsTemplateService") +@Transactional +public class TSSmsTemplateServiceImpl extends CommonServiceImpl implements TSSmsTemplateServiceI { + + + public void delete(T entity) { + super.delete(entity); + //鎵ц鍒犻櫎鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doDelSql((TSSmsTemplateEntity)entity); + } + + public Serializable save(T entity) { + Serializable t = super.save(entity); + //鎵ц鏂板鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doAddSql((TSSmsTemplateEntity)entity); + return t; + } + + public void saveOrUpdate(T entity) { + super.saveOrUpdate(entity); + //鎵ц鏇存柊鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doUpdateSql((TSSmsTemplateEntity)entity); + } + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(TSSmsTemplateEntity t){ + return true; + } + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(TSSmsTemplateEntity t){ + return true; + } + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(TSSmsTemplateEntity t){ + return true; + } + + /** + * 鏇挎崲sql涓殑鍙橀噺 + * @param sql + * @return + */ + public String replaceVal(String sql,TSSmsTemplateEntity t){ + sql = sql.replace("#{id}",String.valueOf(t.getId())); + sql = sql.replace("#{create_name}",String.valueOf(t.getCreateName())); + sql = sql.replace("#{create_by}",String.valueOf(t.getCreateBy())); + sql = sql.replace("#{create_date}",String.valueOf(t.getCreateDate())); + sql = sql.replace("#{update_name}",String.valueOf(t.getUpdateName())); + sql = sql.replace("#{update_by}",String.valueOf(t.getUpdateBy())); + sql = sql.replace("#{update_date}",String.valueOf(t.getUpdateDate())); + sql = sql.replace("#{template_type}",String.valueOf(t.getTemplateType())); + sql = sql.replace("#{template_name}",String.valueOf(t.getTemplateName())); + sql = sql.replace("#{template_content}",String.valueOf(t.getTemplateContent())); + sql = sql.replace("#{UUID}",UUID.randomUUID().toString()); + return sql; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/sms/service/impl/TSSmsTemplateSqlServiceImpl.java b/src/main/java/org/jeecgframework/web/sms/service/impl/TSSmsTemplateSqlServiceImpl.java new file mode 100644 index 00000000..f7fea0c1 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/service/impl/TSSmsTemplateSqlServiceImpl.java @@ -0,0 +1,79 @@ +package org.jeecgframework.web.sms.service.impl; +import org.jeecgframework.web.sms.service.TSSmsTemplateSqlServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.web.sms.entity.TSSmsTemplateSqlEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.UUID; +import java.io.Serializable; + +@Service("tSSmsTemplateSqlService") +@Transactional +public class TSSmsTemplateSqlServiceImpl extends CommonServiceImpl implements TSSmsTemplateSqlServiceI { + + + public void delete(T entity) { + super.delete(entity); + //鎵ц鍒犻櫎鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doDelSql((TSSmsTemplateSqlEntity)entity); + } + + public Serializable save(T entity) { + Serializable t = super.save(entity); + //鎵ц鏂板鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doAddSql((TSSmsTemplateSqlEntity)entity); + return t; + } + + public void saveOrUpdate(T entity) { + super.saveOrUpdate(entity); + //鎵ц鏇存柊鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doUpdateSql((TSSmsTemplateSqlEntity)entity); + } + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(TSSmsTemplateSqlEntity t){ + return true; + } + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(TSSmsTemplateSqlEntity t){ + return true; + } + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(TSSmsTemplateSqlEntity t){ + return true; + } + + /** + * 鏇挎崲sql涓殑鍙橀噺 + * @param sql + * @return + */ + public String replaceVal(String sql,TSSmsTemplateSqlEntity t){ + sql = sql.replace("#{id}",String.valueOf(t.getId())); + sql = sql.replace("#{create_name}",String.valueOf(t.getCreateName())); + sql = sql.replace("#{create_by}",String.valueOf(t.getCreateBy())); + sql = sql.replace("#{create_date}",String.valueOf(t.getCreateDate())); + sql = sql.replace("#{update_name}",String.valueOf(t.getUpdateName())); + sql = sql.replace("#{update_by}",String.valueOf(t.getUpdateBy())); + sql = sql.replace("#{update_date}",String.valueOf(t.getUpdateDate())); + sql = sql.replace("#{code}",String.valueOf(t.getCode())); + sql = sql.replace("#{name}",String.valueOf(t.getName())); + sql = sql.replace("#{sql_id}",String.valueOf(t.getSqlId())); + sql = sql.replace("#{template_id}",String.valueOf(t.getTemplateId())); + sql = sql.replace("#{UUID}",UUID.randomUUID().toString()); + return sql; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/sms/util/CMPPSenderUtil.java b/src/main/java/org/jeecgframework/web/sms/util/CMPPSenderUtil.java new file mode 100644 index 00000000..8d53fc8f --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/CMPPSenderUtil.java @@ -0,0 +1,237 @@ +// ~ CopyRight 漏 2012 USTC SINOVATE SOFTWARE CO.LTD All Rights Reserved. +package org.jeecgframework.web.sms.util; + +import java.io.IOException; +import java.net.URLEncoder; + +import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.params.HttpMethodParams; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.jeecgframework.web.sms.util.msg.util.MsgContainer; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +/** + * 鎻忚堪锛欳MPPSenderUtil CMPP3.0鍗忚鍙戦佺煭淇℃墍鏈夊墠鍙拌皟鐢ㄧ殑鐭俊鍙戦佹柟娉曞湪姝
    + * 鐗堟湰:1.0.0
    map, String sentTo) { + // TODO Auto-generated method stub + try { + TSSmsEntity tss=new TSSmsEntity(); + tss.setEsType(msgType); + tss.setEsTitle(title); + tss.setEsReceiver(sentTo); + tss.setEsStatus(Constants.SMS_SEND_STATUS_1); + String hql="from TSSmsTemplateSqlEntity as tempSql where tempSql.code=? "; + String smsContent=""; + List tssmsTemplateSqlList=getTssmsTemplateSqlInstance().findHql(hql, code); + for (TSSmsTemplateSqlEntity tsSmsTemplateSqlEntity : tssmsTemplateSqlList) { + TSSmsSqlEntity tsSmsSqlEntity = getTSSmsServiceInstance().getEntity(TSSmsSqlEntity.class, tsSmsTemplateSqlEntity.getSqlId()); + String templateSql= tsSmsSqlEntity.getSqlContent();//鑾峰彇瀵瑰簲涓氬姟sql琛ㄤ腑鐨剆ql璇彞 + TSSmsTemplateEntity tsSmsTemplateEntity= getTSSmsServiceInstance().getEntity(TSSmsTemplateEntity.class, tsSmsTemplateSqlEntity.getTemplateId()); + String templateContent=tsSmsTemplateEntity.getTemplateContent();//鑾峰彇妯℃澘琛ㄧ殑瀵瑰簲鐨勬ā鏉垮唴瀹 + //鎵ц鏌ヨ鍑烘潵鐨勬ā鏉縮ql + Map rootMap = getRootMapBySql(templateSql,map); + StringReader strR= new StringReader(templateContent); + Template template = new Template("strTemplate", strR, new Configuration()); + StringWriter stringWriter = new StringWriter(); + BufferedWriter writer = new BufferedWriter(stringWriter); + template.process(rootMap, writer); + smsContent = stringWriter.toString(); + } + tss.setEsContent(smsContent); + getTSSmsServiceInstance().save(tss); //瀵瑰簱杩涜鏌ヨ鎿嶄綔 + return "success"; + + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + return e.getMessage(); + } + } + public static NamedParameterJdbcTemplate getNamedParameterJdbcTemplate(){ + + if(namedParameterJdbcTemplate==null){ + namedParameterJdbcTemplate=ApplicationContextUtil.getContext().getBean(NamedParameterJdbcTemplate.class); + + } + return namedParameterJdbcTemplate; + } + + /** + * + * getTSSmsServiceInstance 鑾峰彇鐭俊service + * + * @Title: getTSSmsServiceInstance + * @Description: TODO + * @param @return 璁惧畾鏂囦欢 + * @return TSSmsServiceI 杩斿洖绫诲瀷 + * @throws + */ + public static Configuration getConfiguration(){ + + if(configuration==null){ + configuration=ApplicationContextUtil.getContext().getBean(Configuration.class); + } + return configuration; + } + /** + * + * getRootMapBySql 鑾峰彇涓氬姟SQL鐨勯厤缃暟鎹 + * + * @Title: getSearchSql + * @Description: TODO + * @param @param templateSql + * @param @param map + * @param @return 璁惧畾鏂囦欢 + * @return String 杩斿洖绫诲瀷 + * @throws + */ + public static Map getRootMapBySql(String templateSql,Map map){ + //璋冪敤鏌ヨsql鐨勬柟娉曟墽琛屾sql + SqlParameterSource sqlp = new MapSqlParameterSource(map); + return getNamedParameterJdbcTemplate().queryForMap(templateSql, sqlp); + } + /** + * + * getTemplateServiceSql 鑾峰彇鐭俊sql鍏蜂綋鐨剆ql鍐呭 + * + * @Title: getTemplateServiceSql + * @Description: TODO + * @param @param sqlId + * @param @return 璁惧畾鏂囦欢 + * @return String 杩斿洖绫诲瀷 + * @throws + */ + public static String getTemplateSql(String sqlId){ + String hql="from TSSmsSqlEntity as tssSql where tssSql.id=?"; + ListtssmsSqlList=getTSSmsSqlInstance().findHql(hql, sqlId); + String sqlContent=""; + for (TSSmsSqlEntity tsSmsSqlEntity : tssmsSqlList) { + sqlContent=tsSmsSqlEntity.getSqlContent(); + } + return sqlContent; + } + /** + * + * getTemplateContent 鑾峰彇妯℃澘鍐呭 + * + * @Title: getTemplateContent + * @Description: TODO + * @param @param templateId + * @param @return 璁惧畾鏂囦欢 + * @return String 杩斿洖绫诲瀷 + * @throws + */ + public static String getTemplateContent(String templateId){ + String hql="from TSSmsTemplateEntity as template where template.id=? "; + List tSSmsTemplateList=getTssmsTemplateInstance().findHql(hql, templateId); + String templateConetent=""; + for (TSSmsTemplateEntity tsSmsTemplateEntity : tSSmsTemplateList) { + templateConetent=tsSmsTemplateEntity.getTemplateContent(); + } + return templateConetent; + } + + /** + * + * getTSSmsServiceInstance 鑾峰彇鐭俊service + * + * @Title: getTSSmsServiceInstance + * @Description: TODO + * @param @return 璁惧畾鏂囦欢 + * @return TSSmsServiceI 杩斿洖绫诲瀷 + * @throws + */ + public static TSSmsServiceI getTSSmsServiceInstance(){ + + if(tSSmsService==null){ + tSSmsService=ApplicationContextUtil.getContext().getBean(TSSmsServiceI.class); + + } + return tSSmsService; + } + /** + * + * getTssmsTemplateSqlInstance 鑾峰彇鐭俊妯℃澘鍏宠仈service瀹炰綋 + * + * @Title: getTssmsTemplateSqlInstance + * @Description: TODO + * @param @return 璁惧畾鏂囦欢 + * @return TSSmsTemplateSqlServiceI 杩斿洖绫诲瀷 + * @throws + */ + public static TSSmsTemplateSqlServiceI getTssmsTemplateSqlInstance(){ + + if(tSSmsTemplateSqlService==null){ + + tSSmsTemplateSqlService=ApplicationContextUtil.getContext().getBean(TSSmsTemplateSqlServiceI.class); + + } + return tSSmsTemplateSqlService; + } + /** + * + * getTssmsTemplateInstance 鑾峰彇鍏蜂綋鐨勬ā鏉縮ervice瀹炰綋 + * + * @Title: getTssmsTemplateInstance + * @Description: TODO + * @param @return 璁惧畾鏂囦欢 + * @return TSSmsTemplateServiceI 杩斿洖绫诲瀷 + * @throws + */ + public static TSSmsTemplateServiceI getTssmsTemplateInstance(){ + if(tSSmsTemplateService==null){ + + tSSmsTemplateService=ApplicationContextUtil.getContext().getBean(TSSmsTemplateServiceI.class); + } + return tSSmsTemplateService; + } + /** + * + * getTSSmsSqlInstance 鑾峰彇涓氬姟sql service瀹炰綋 + * + * @Title: getTSSmsSqlInstance + * @Description: TODO + * @param @return 璁惧畾鏂囦欢 + * @return TSSmsSqlServiceI 杩斿洖绫诲瀷 + * @throws + */ + public static TSSmsSqlServiceI getTSSmsSqlInstance(){ + if(tSSmsSqlService==null){ + + tSSmsSqlService=ApplicationContextUtil.getContext().getBean(TSSmsSqlServiceI.class); + } + return tSSmsSqlService; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/XmlResolve.java b/src/main/java/org/jeecgframework/web/sms/util/XmlResolve.java new file mode 100644 index 00000000..364c5b9e --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/XmlResolve.java @@ -0,0 +1,9 @@ +package org.jeecgframework.web.sms.util; +/** + * + * @author cmzcheng xml鎶ユ枃瑙f瀽 + * + */ +public class XmlResolve { + +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgActiveTestResp.java b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgActiveTestResp.java new file mode 100644 index 00000000..4a6876ec --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgActiveTestResp.java @@ -0,0 +1,66 @@ +package org.jeecgframework.web.sms.util.msg.domain; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.log4j.Logger; + +/** + * 娴嬭瘯婵娲诲搷搴旂被. + * + * @author 绋嬪窛
    + * 閭锛 cmzcheng@gmail.com
    + * 鎻忚堪锛
    + * @version:1.0.0
    + * 鏃ユ湡锛 2013-4-24 涓嬪崍2:21:00
    + * CopyRight 漏 2012 chinaMobile.ahcmcc + */ +public class MsgActiveTestResp extends MsgHead { + private static Logger logger = Logger.getLogger(MsgActiveTestResp.class); + private byte reserved;// + + /** + * . + * + * @param data + * byte[] + */ + public MsgActiveTestResp(byte[] data) { + if (data.length == 8 + 1) { + ByteArrayInputStream bins = new ByteArrayInputStream(data); + DataInputStream dins = new DataInputStream(bins); + try { + this.setTotalLength(data.length + 4); + this.setCommandId(dins.readInt()); + this.setSequenceId(dins.readInt()); + this.reserved = dins.readByte(); + dins.close(); + bins.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + logger.info("閾捐矾妫鏌,瑙f瀽鏁版嵁鍖呭嚭閿欙紝鍖呴暱搴︿笉涓鑷淬傞暱搴︿负:" + data.length); + } + } + + /** + * . + * + * @return byte + */ + public byte getReserved() { + return reserved; + } + + /** + * . + * + * @param reserved + * byte + */ + public void setReserved(byte reserved) { + this.reserved = reserved; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgCommand.java b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgCommand.java new file mode 100644 index 00000000..4d1e8417 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgCommand.java @@ -0,0 +1,23 @@ +package org.jeecgframework.web.sms.util.msg.domain; +/** + * 鐭俊鍛戒护浠g爜鏍囪瘑. + * 閾炬帴璇锋眰銆佺粓姝㈣繛鎺ヨ姹傘佹彁浜ょ煭淇¤姹傘侀暱閾炬帴婵娲荤瓑 + * @author skycc + * 2014-11-17 11:34 + */ +public interface MsgCommand { + int CMPP_CONNECT=0x00000001;//CMPP_CONNECT璇锋眰杩炴帴 + int CMPP_CONNECT_RESP=0x80000001;//璇锋眰杩炴帴搴旂瓟 + int CMPP_TERMINATE=0x00000002;// 缁堟杩炴帴 + int CMPP_TERMINATE_RESP=0x80000002; //缁堟杩炴帴搴旂瓟 + int CMPP_SUBMIT=0x00000004; //鎻愪氦鐭俊 + int CMPP_SUBMIT_RESP=0x80000004; //鎻愪氦鐭俊搴旂瓟 + int CMPP_DELIVER=0x00000005; //鐭俊涓嬪彂 + int CMPP_DELIVER_RESP=0x80000005; //涓嬪彂鐭俊搴旂瓟 + int CMPP_QUERY=0x00000006; //鍙戦佺煭淇$姸鎬佹煡璇 + int CMPP_QUERY_RESP=0x80000006; //鍙戦佺煭淇$姸鎬佹煡璇㈠簲绛 + int CMPP_CANCEL=0x00000007; //鍒犻櫎鐭俊 + int CMPP_CANCEL_RESP=0x80000007; //鍒犻櫎鐭俊搴旂瓟 + int CMPP_ACTIVE_TEST=0x00000008; //婵娲绘祴璇 + int CMPP_ACTIVE_TEST_RESP=0x80000008; //婵娲绘祴璇曞簲绛 +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgConnect.java b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgConnect.java new file mode 100644 index 00000000..55cd342c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgConnect.java @@ -0,0 +1,133 @@ +package org.jeecgframework.web.sms.util.msg.domain; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.log4j.Logger; + +import org.jeecgframework.web.sms.util.msg.util.MsgUtils; + + + +/** + * SP璇锋眰杩炴帴鍒癐SMG娑堟伅浣撳畾涔塁MPP_CONNECT鎿嶄綔鐨勭洰鐨勬槸SP鍚慖SMG娉ㄥ唽浣滀负涓涓悎娉昐P韬唤. + * 鑻ユ敞鍐屾垚鍔熷悗鍗冲缓绔嬩簡搴旂敤灞傜殑杩炴帴锛屾鍚嶴P鍙互閫氳繃姝SMG鎺ユ敹鍜屽彂閫佺煭淇°
    + * Source_Addr:Octet String 婧愬湴鍧锛屾澶勪负SP_Id锛屽嵆SP鐨勪紒涓氫唬鐮併
    + * AuthenticatorSource:Octet String 鐢ㄤ簬閴村埆婧愬湴鍧銆傚叾鍊奸氳繃鍗曞悜MD5 hash璁$畻寰楀嚭锛岃〃绀哄涓嬶細 + * AuthenticatorSource =MD5锛圫ource_Addr+9 瀛楄妭鐨0 +shared secret+timestamp锛 Shared + * secret 鐢变腑鍥界Щ鍔ㄤ笌婧愬湴鍧瀹炰綋浜嬪厛鍟嗗畾锛宼imestamp鏍煎紡涓猴細MMDDHHMMSS锛屽嵆鏈堟棩鏃跺垎绉掞紝10浣嶃
    + * Version:Unsigned Integer + * 鍙屾柟鍗忓晢鐨勭増鏈彿(楂樹綅4bit琛ㄧず涓荤増鏈彿,浣庝綅4bit琛ㄧず娆$増鏈彿)锛屽浜3.0鐨勭増鏈紝楂4bit涓3锛屼綆4浣嶄负0
    + * Timestamp:Unsigned Integer 鏃堕棿鎴崇殑鏄庢枃,鐢卞鎴风浜х敓,鏍煎紡涓篗MDDHHMMSS锛屽嵆鏈堟棩鏃跺垎绉掞紝10浣嶆暟瀛楃殑鏁村瀷锛屽彸瀵归綈 銆
    + */ +public class MsgConnect extends MsgHead { + private static Logger logger = Logger.getLogger(MsgConnect.class); + private String sourceAddr;// 婧愬湴鍧锛屾澶勪负SP_Id锛屽嵆SP鐨勪紒涓氫唬鐮併 + private byte[] authenticatorSource;// 鐢ㄤ簬閴村埆婧愬湴鍧銆傚叾鍊奸氳繃鍗曞悜MD5 + // hash璁$畻寰楀嚭锛岃〃绀哄涓嬶細AuthenticatorSource = + // MD5锛圫ource_Addr+9 瀛楄妭鐨0 +shared + // secret+timestamp锛 Shared secret + // 鐢变腑鍥界Щ鍔ㄤ笌婧愬湴鍧瀹炰綋浜嬪厛鍟嗗畾锛宼imestamp鏍煎紡涓猴細MMDDHHMMSS锛屽嵆鏈堟棩鏃跺垎绉掞紝10浣嶃 + private byte version;// 鍙屾柟鍗忓晢鐨勭増鏈彿(楂樹綅4bit琛ㄧず涓荤増鏈彿,浣庝綅4bit琛ㄧず娆$増鏈彿)锛屽浜3.0鐨勭増鏈紝楂4bit涓3锛屼綆4浣嶄负0 + private int timestamp;// 鏃堕棿鎴崇殑鏄庢枃,鐢卞鎴风浜х敓,鏍煎紡涓篗MDDHHMMSS锛屽嵆鏈堟棩鏃跺垎绉掞紝10浣嶆暟瀛楃殑鏁村瀷锛屽彸瀵归綈 銆 + + /** + * . + * + * @return byte[] + */ + public byte[] toByteArry() { + ByteArrayOutputStream bous = new ByteArrayOutputStream(); + DataOutputStream dous = new DataOutputStream(bous); + try { + dous.writeInt(this.getTotalLength()); + dous.writeInt(this.getCommandId()); + dous.writeInt(this.getSequenceId()); + MsgUtils.writeString(dous, this.sourceAddr, 6); + dous.write(authenticatorSource); + dous.writeByte(0x30); + dous.writeInt(Integer.parseInt(MsgUtils.getTimestamp())); + dous.close(); + } catch (IOException e) { + logger.error("灏佽閾炬帴浜岃繘鍒舵暟缁勫け璐ャ"); + } + return bous.toByteArray(); + } + + /** + * . + * + * @return String + */ + public String getSourceAddr() { + return sourceAddr; + } + + /** + * . + * + * @param sourceAddr + * String + */ + public void setSourceAddr(String sourceAddr) { + this.sourceAddr = sourceAddr; + } + + /** + * . + * + * @return String + */ + public byte[] getAuthenticatorSource() { + return authenticatorSource; + } + + /** + * . + * + * @param authenticatorSource + * String + */ + public void setAuthenticatorSource(byte[] authenticatorSource) { + this.authenticatorSource = authenticatorSource; + } + + /** + * . + * + * @return String + */ + public byte getVersion() { + return version; + } + + /** + * . + * + * @param version + * String + */ + public void setVersion(byte version) { + this.version = version; + } + + /** + * . + * + * @return String + */ + public int getTimestamp() { + return timestamp; + } + + /** + * . + * + * @param timestamp + * String + */ + public void setTimestamp(int timestamp) { + this.timestamp = timestamp; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgConnectResp.java b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgConnectResp.java new file mode 100644 index 00000000..f37bdbfe --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgConnectResp.java @@ -0,0 +1,148 @@ +package org.jeecgframework.web.sms.util.msg.domain; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.log4j.Logger; + +/** + * . ISMG浠MPP_CONNECT_RESP娑堟伅鍝嶅簲SP鐨勯摼鎺ヨ姹傘
    + * status鍝嶅簲鐘舵佺姸鎬 0锛氭纭 1锛氭秷鎭粨鏋勯敊 2锛氶潪娉曟簮鍦板潃 3锛氳璇侀敊 4锛氱増鏈お楂 5~ 锛氬叾浠栭敊璇
    + * authenticatorISMG SMG璁よ瘉鐮侊紝鐢ㄤ簬閴村埆ISMG銆 鍏跺奸氳繃鍗曞悜MD5 hash璁$畻寰楀嚭锛岃〃绀哄涓嬶細 Authent + * icatorISMG =MD5锛圫tatus+AuthenticatorSource+shared secret锛夛紝Shared secret + * 鐢变腑鍥界Щ鍔ㄤ笌婧愬湴鍧瀹炰綋浜嬪厛鍟嗗畾锛 AuthenticatorSource涓烘簮鍦板潃瀹炰綋鍙戦佺粰ISMG鐨勫搴旀秷鎭疌MPP_Connect涓殑鍊笺 + * 璁よ瘉鍑洪敊鏃讹紝姝ら」涓虹┖銆
    + * version鏈嶅姟鍣ㄦ敮鎸佺殑鏈楂樼増鏈彿锛屽浜3.0鐨勭増鏈紝楂4bit涓3锛屼綆4浣嶄负0
    + */ +public class MsgConnectResp extends MsgHead { + private static Logger logger = Logger.getLogger(MsgConnectResp.class); + private int status;// 鍝嶅簲鐘舵佺姸鎬 0锛氭纭 1锛氭秷鎭粨鏋勯敊 2锛氶潪娉曟簮鍦板潃 3锛氳璇侀敊 4锛氱増鏈お楂 5~ 锛氬叾浠栭敊璇 + private String statusStr;// 鍝嶅簲鐘舵佺姸鎬 0锛氭纭 1锛氭秷鎭粨鏋勯敊 2锛氶潪娉曟簮鍦板潃 3锛氳璇侀敊 4锛氱増鏈お楂 5~ + // 锛氬叾浠栭敊璇 + private byte[] authenticatorISMG;// ISMG璁よ瘉鐮侊紝鐢ㄤ簬閴村埆ISMG銆 鍏跺奸氳繃鍗曞悜MD5 + // hash璁$畻寰楀嚭锛岃〃绀哄涓嬶細 AuthenticatorISMG + // =MD5锛圫tatus+AuthenticatorSource+shared + // secret锛夛紝Shared secret + // 鐢变腑鍥界Щ鍔ㄤ笌婧愬湴鍧瀹炰綋浜嬪厛鍟嗗畾锛孉uthenticatorSource涓烘簮鍦板潃瀹炰綋鍙戦佺粰ISMG鐨勫搴旀秷鎭疌MPP_Connect涓殑鍊笺 + // 璁よ瘉鍑洪敊鏃讹紝姝ら」涓虹┖銆 + private byte version;// 鏈嶅姟鍣ㄦ敮鎸佺殑鏈楂樼増鏈彿锛屽浜3.0鐨勭増鏈紝楂4bit涓3锛屼綆4浣嶄负0 + + /** + * . + * + * @param data + * byte[] + */ + public MsgConnectResp(byte[] data) { + if (data.length == 8 + 4 + 16 + 1) { + ByteArrayInputStream bins = new ByteArrayInputStream(data); + DataInputStream dins = new DataInputStream(bins); + try { + this.setTotalLength(data.length + 4); + this.setCommandId(dins.readInt()); + this.setSequenceId(dins.readInt()); + this.setStatus(dins.readInt()); + byte[] aiByte = new byte[16]; + dins.read(aiByte); + this.authenticatorISMG = aiByte; + this.version = dins.readByte(); + dins.close(); + bins.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + logger.info("閾炬帴鑷矷MSP,瑙f瀽鏁版嵁鍖呭嚭閿欙紝鍖呴暱搴︿笉涓鑷淬傞暱搴︿负:" + data.length); + } + } + + /** + * . + * + * @return int + */ + public int getStatus() { + return status; + } + + /** + * . + * + * @param status + * int + */ + public void setStatus(int status) { + this.status = status; + switch (status) { + case 0: + statusStr = "姝g‘"; + break; + case 1: + statusStr = "娑堟伅缁撴瀯閿"; + break; + case 2: + statusStr = "闈炴硶婧愬湴鍧"; + break; + case 3: + statusStr = "璁よ瘉閿"; + break; + case 4: + statusStr = "鐗堟湰澶珮"; + break; + case 5: + statusStr = "鍏朵粬閿欒"; + break; + default: + statusStr = status + ":鏈煡"; + break; + } + } + + /** + * . + * + * @return byte[] + */ + public byte[] getAuthenticatorISMG() { + return authenticatorISMG; + } + + /** + * . + * + * @param authenticatorISMG + * byte[] + */ + public void setAuthenticatorISMG(byte[] authenticatorISMG) { + this.authenticatorISMG = authenticatorISMG; + } + + /** + * . + * + * @return byte + */ + public byte getVersion() { + return version; + } + + /** + * . + * + * @param version + * byte + */ + public void setVersion(byte version) { + this.version = version; + } + + /** + * . + * + * @return String + */ + public String getStatusStr() { + return statusStr; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgDeliver.java b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgDeliver.java new file mode 100644 index 00000000..4bc3884c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgDeliver.java @@ -0,0 +1,474 @@ +package org.jeecgframework.web.sms.util.msg.domain; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.log4j.Logger; + +/** + * CMPP_DELIVER鎿嶄綔鐨勭洰鐨勬槸ISMG鎶婁粠鐭俊涓績鎴栧叾瀹僆SMG杞彂鏉ョ殑鐭俊閫佷氦SP锛孲P浠MPP_DELIVER_RESP娑堟伅鍥炲簲. + */ +public class MsgDeliver extends MsgHead { + private static Logger logger = Logger.getLogger(MsgDeliver.class); + private long msgId; + private String destId;// 21 鐩殑鍙风爜 String + private String serviceId;// 10 涓氬姟鏍囪瘑 String + private byte tPPid = 0; + private byte tPUdhi = 0; + private byte msgFmt = 15; + private String srcTerminalId;// 婧愮粓绔疢SISDN鍙风爜 + private byte srcTerminalType = 0;// 婧愮粓绔彿鐮佺被鍨嬶紝0锛氱湡瀹炲彿鐮侊紱1锛氫吉鐮 + private byte registeredDelivery = 0;// 鏄惁涓虹姸鎬佹姤鍛 0锛氶潪鐘舵佹姤鍛1锛氱姸鎬佹姤鍛 + private byte msgLength;// 娑堟伅闀垮害 + private String msgContent;// 娑堟伅闀垮害 + private String linkID; + + private long msgIdReport; + private String stat; + private String submitTime; + private String doneTime; + private String destTerminalId; + private int sMSCSequence; + private int result;// 瑙f瀽缁撴灉 + + /** + * . + * + * @param data + * byte[] + */ + public MsgDeliver(byte[] data) { + if (data.length > 8 + 8 + 21 + 10 + 1 + 1 + 1 + 32 + 1 + 1 + 1 + 20) {// +Msg_length+ + String fmtStr = "gb2312"; + ByteArrayInputStream bins = new ByteArrayInputStream(data); + DataInputStream dins = new DataInputStream(bins); + try { + this.setTotalLength(data.length + 4); + this.setCommandId(dins.readInt()); + this.setSequenceId(dins.readInt()); + this.msgId = dins.readLong();// Msg_Id + byte[] destIdByte = new byte[21]; + dins.read(destIdByte); + this.destId = new String(destIdByte);// 21 鐩殑鍙风爜 String + byte[] service_IdByte = new byte[10]; + dins.read(service_IdByte); + this.serviceId = new String(service_IdByte);// 10 涓氬姟鏍囪瘑 String + this.tPPid = dins.readByte(); + this.tPUdhi = dins.readByte(); + this.msgFmt = dins.readByte(); + fmtStr = this.msgFmt == 8 ? "utf-8" : "gb2312"; + byte[] src_terminal_IdByte = new byte[32]; + dins.read(src_terminal_IdByte); + this.srcTerminalId = new String(src_terminal_IdByte);// 婧愮粓绔疢SISDN鍙风爜 + this.srcTerminalType = dins.readByte();// 婧愮粓绔彿鐮佺被鍨嬶紝0锛氱湡瀹炲彿鐮侊紱1锛氫吉鐮 + this.registeredDelivery = dins.readByte();// 鏄惁涓虹姸鎬佹姤鍛 + // 0锛氶潪鐘舵佹姤鍛1锛氱姸鎬佹姤鍛 + this.msgLength = dins.readByte();// 娑堟伅闀垮害 + byte[] msg_ContentByte = new byte[msgLength]; + dins.read(msg_ContentByte); + if (registeredDelivery == 1) { + this.msgContent = new String(msg_ContentByte, fmtStr);// 娑堟伅闀垮害 + if (msgLength == 8 + 7 + 10 + 10 + 21 + 4) { + ByteArrayInputStream binsC = new ByteArrayInputStream( + data); + DataInputStream dinsC = new DataInputStream(binsC); + this.msgIdReport = dinsC.readLong(); + byte[] startByte = new byte[7]; + dinsC.read(startByte); + this.stat = new String(startByte, fmtStr); + byte[] submit_timeByte = new byte[10]; + dinsC.read(submit_timeByte); + this.submitTime = new String(submit_timeByte, fmtStr); + byte[] done_timeByte = new byte[7]; + dinsC.read(done_timeByte); + this.doneTime = new String(done_timeByte, fmtStr); + byte[] dest_terminal_IdByte = new byte[21]; + dinsC.read(dest_terminal_IdByte); + this.destTerminalId = new String(dest_terminal_IdByte, + fmtStr); + this.sMSCSequence = dinsC.readInt(); + dinsC.close(); + binsC.close(); + this.result = 0;// 姝g‘ + } else { + this.result = 1;// 娑堟伅缁撴瀯閿 + } + } else { + this.msgContent = new String(msg_ContentByte, fmtStr);// 娑堟伅闀垮害 + } + byte[] linkIDByte = new byte[20]; + this.linkID = new String(linkIDByte); + this.result = 0;// 姝g‘ + dins.close(); + bins.close(); + } catch (IOException e) { + this.result = 8;// 娑堟伅缁撴瀯閿 + } + } else { + this.result = 1;// 娑堟伅缁撴瀯閿 + logger.info("鐭俊缃戝叧CMPP_DELIVER,瑙f瀽鏁版嵁鍖呭嚭閿欙紝鍖呴暱搴︿笉涓鑷淬傞暱搴︿负:" + data.length); + } + } + + /** + * . + * + * @return long + */ + public long getMsgId() { + return msgId; + } + + /** + * . + * + * @param msgId + * long + */ + public void setMsgId(long msgId) { + this.msgId = msgId; + } + + /** + * . + * + * @return String + */ + public String getDestId() { + return destId; + } + + /** + * . + * + * @param destId + * String + */ + public void setDestId(String destId) { + this.destId = destId; + } + + /** + * . + * + * @return String + */ + public String getServiceId() { + return serviceId; + } + + /** + * . + * + * @param serviceId + * String + */ + public void setServiceId(String serviceId) { + this.serviceId = serviceId; + } + + /** + * . + * + * @return byte + */ + public byte getTPPid() { + return tPPid; + } + + /** + * . + * + * @param tpPid + * byte + */ + public void setTPPid(byte tpPid) { + tPPid = tpPid; + } + + /** + * . + * + * @return byte + */ + public byte getTPUdhi() { + return tPUdhi; + } + + /** + * . + * + * @param tpUdhi + * byte + */ + public void setTPUdhi(byte tpUdhi) { + tPUdhi = tpUdhi; + } + + /** + * . + * + * @return byte + */ + public byte getMsgFmt() { + return msgFmt; + } + + /** + * . + * + * @param msgFmt + * byte + */ + public void setMsgFmt(byte msgFmt) { + this.msgFmt = msgFmt; + } + + /** + * . + * + * @return String + */ + public String getSrcTerminalId() { + return srcTerminalId; + } + + /** + * . + * + * @param srcTerminalId + * String + */ + public void setSrcTerminalId(String srcTerminalId) { + this.srcTerminalId = srcTerminalId; + } + + /** + * . + * + * @return byte + */ + public byte getSrcTerminalType() { + return srcTerminalType; + } + + /** + * . + * + * @param srcTerminalType + * byte + */ + public void setSrcTerminalType(byte srcTerminalType) { + this.srcTerminalType = srcTerminalType; + } + + /** + * . + * + * @return byte + */ + public byte getRegisteredDelivery() { + return registeredDelivery; + } + + /** + * . + * + * @param registeredDelivery + * byte + */ + public void setRegisteredDelivery(byte registeredDelivery) { + this.registeredDelivery = registeredDelivery; + } + + /** + * . + * + * @return byte + */ + public byte getMsgLength() { + return msgLength; + } + + /** + * . + * + * @param msgLength + * byte + */ + public void setMsgLength(byte msgLength) { + this.msgLength = msgLength; + } + + /** + * . + * + * @return byte + */ + public String getMsgContent() { + return msgContent; + } + + /** + * . + * + * @param msgContent + * String + */ + public void setMsgContent(String msgContent) { + this.msgContent = msgContent; + } + + /** + * . + * + * @return String + */ + public String getLinkID() { + return linkID; + } + + /** + * . + * + * @param linkID + * String + */ + public void setLinkID(String linkID) { + this.linkID = linkID; + } + + /** + * . + * + * @return long + */ + public long getMsgIdReport() { + return msgIdReport; + } + + /** + * . + * + * @param msgIdReport + * long + */ + public void setMsgIdReport(long msgIdReport) { + this.msgIdReport = msgIdReport; + } + + /** + * . + * + * @return String + */ + public String getStat() { + return stat; + } + + /** + * . + * + * @param stat + * String + */ + public void setStat(String stat) { + this.stat = stat; + } + + /** + * . + * + * @return String + */ + public String getSubmitTime() { + return submitTime; + } + + /** + * . + * + * @param submitTime + * String + */ + public void setSubmitTime(String submitTime) { + this.submitTime = submitTime; + } + + /** + * . + * + * @return String + */ + public String getDoneTime() { + return doneTime; + } + + /** + * . + * + * @param doneTime + * String + */ + public void setDoneTime(String doneTime) { + this.doneTime = doneTime; + } + + /** + * . + * + * @return String + */ + public String getDestTerminalId() { + return destTerminalId; + } + + /** + * . + * + * @param destTerminalId + * String + */ + public void setDestTerminalId(String destTerminalId) { + this.destTerminalId = destTerminalId; + } + + /** + * . + * + * @return String + */ + public int getSMSCSequence() { + return sMSCSequence; + } + + /** + * . + * + * @param sMSCSequence + * int + */ + public void setSMSCSequence(int sMSCSequence) { + this.sMSCSequence = sMSCSequence; + } + + /** + * . + * + * @return int + */ + public int getResult() { + return result; + } + + /** + * . + * + * @param result + * int + */ + public void setResult(int result) { + this.result = result; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgDeliverResp.java b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgDeliverResp.java new file mode 100644 index 00000000..f3a43503 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgDeliverResp.java @@ -0,0 +1,84 @@ +package org.jeecgframework.web.sms.util.msg.domain; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.log4j.Logger; + +/** + * + * SP浠MPP_DELIVER_RESP娑堟伅鍥炲簲. + * + * @author 绋嬪窛
    + * 閭锛 cmzcheng@gmail.com
    + * 鎻忚堪锛
    + * @version:1.0.0
    + * 鏃ユ湡锛 2013-4-24 涓嬪崍2:20:07
    + * CopyRight 漏 2012 chinaMobile.ahcmcc + */ +public class MsgDeliverResp extends MsgHead { + private static Logger logger = Logger.getLogger(MsgDeliverResp.class); + private long msgId;// 淇℃伅鏍囪瘑锛圕MPP_DELIVER涓殑Msg_Id瀛楁锛 + private int result;// 缁撴灉 0锛氭纭 1锛氭秷鎭粨鏋勯敊 2锛氬懡浠ゅ瓧閿 3锛氭秷鎭簭鍙烽噸澶 4锛氭秷鎭暱搴﹂敊 5锛氳祫璐逛唬鐮侀敊 + // 6锛氳秴杩囨渶澶т俊鎭暱 7锛氫笟鍔′唬鐮侀敊8: 娴侀噺鎺у埗閿9~ 锛氬叾浠栭敊璇 + + /** + * . + * + * @return byte[] + */ + public byte[] toByteArry() { + ByteArrayOutputStream bous = new ByteArrayOutputStream(); + DataOutputStream dous = new DataOutputStream(bous); + try { + dous.writeInt(this.getTotalLength()); + dous.writeInt(this.getCommandId()); + dous.writeInt(this.getSequenceId()); + dous.writeLong(this.msgId); + dous.writeInt(this.result); + dous.close(); + } catch (IOException e) { + logger.error("灏佽閾炬帴浜岃繘鍒舵暟缁勫け璐ャ"); + } + return bous.toByteArray(); + } + + /** + * . + * + * @return long + */ + public long getMsgId() { + return msgId; + } + + /** + * . + * + * @param msgId + * long + */ + public void setMsgId(long msgId) { + this.msgId = msgId; + } + + /** + * . + * + * @return int + */ + public int getResult() { + return result; + } + + /** + * . + * + * @param result + * int + */ + public void setResult(int result) { + this.result = result; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgHead.java b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgHead.java new file mode 100644 index 00000000..d7298817 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgHead.java @@ -0,0 +1,133 @@ +package org.jeecgframework.web.sms.util.msg.domain; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.log4j.Logger; + +/** + * . 鎵鏈夎姹傜殑娑堟伅澶
    + * totalLength 娑堟伅鎬婚暱搴
    + * commandId 鍛戒护绫诲瀷
    + * sequenceId 娑堟伅娴佹按鍙,椤哄簭绱姞,姝ラ暱涓1,寰幆浣跨敤锛堜竴瀵硅姹傚拰搴旂瓟娑堟伅鐨勬祦姘村彿蹇呴』鐩稿悓锛
    + * Unsigned Integer 鏃犵鍙锋暣鏁
    + * Integer 鏁存暟锛屽彲涓烘鏁存暟銆佽礋鏁存暟鎴栭浂
    + * Octet String 瀹氶暱瀛楃涓诧紝浣嶆暟涓嶈冻鏃讹紝濡傛灉宸﹁ˉ0鍒欒ˉASCII琛ㄧず鐨勯浂浠ュ~鍏咃紝濡傛灉鍙宠ˉ0鍒欒ˉ浜岃繘鍒剁殑闆朵互琛ㄧず瀛楃涓茬殑缁撴潫绗 + * + * @author skycc + * 2014-11-17 11:34 + */ + +public class MsgHead { + private Logger logger = Logger.getLogger(MsgHead.class); + private int totalLength;// Unsigned Integer 娑堟伅鎬婚暱搴 + private int commandId;// Unsigned Integer 鍛戒护绫诲瀷 + private int sequenceId;// Unsigned Integer + // 娑堟伅娴佹按鍙,椤哄簭绱姞,姝ラ暱涓1,寰幆浣跨敤锛堜竴瀵硅姹傚拰搴旂瓟娑堟伅鐨勬祦姘村彿蹇呴』鐩稿悓锛 + + /** + * . + * + * @return byte[] + */ + public byte[] toByteArry() { + ByteArrayOutputStream bous = new ByteArrayOutputStream(); + DataOutputStream dous = new DataOutputStream(bous); + try { + dous.writeInt(this.getTotalLength()); + dous.writeInt(this.getCommandId()); + dous.writeInt(this.getSequenceId()); + dous.close(); + } catch (IOException e) { + logger.error("灏佽CMPP娑堟伅澶翠簩杩涘埗鏁扮粍澶辫触銆"); + } + return bous.toByteArray(); + } + + /** + * . + * + * @param data + * byte[] + */ + public MsgHead(byte[] data) { + ByteArrayInputStream bins = new ByteArrayInputStream(data); + DataInputStream dins = new DataInputStream(bins); + try { + this.setTotalLength(data.length + 4); + this.setCommandId(dins.readInt()); + this.setSequenceId(dins.readInt()); + dins.close(); + bins.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * . + */ + public MsgHead() { + super(); + } + + /** + * . + * + * @return int + */ + public int getTotalLength() { + return totalLength; + } + + /** + * . + * + * @param totalLength + * int + */ + public void setTotalLength(int totalLength) { + this.totalLength = totalLength; + } + + /** + * . + * + * @return int + */ + public int getCommandId() { + return commandId; + } + + /** + * . + * + * @param commandId + * int + */ + public void setCommandId(int commandId) { + this.commandId = commandId; + } + + /** + * . + * + * @return int + */ + public int getSequenceId() { + return sequenceId; + } + + /** + * . + * + * @param sequenceId + * int + */ + public void setSequenceId(int sequenceId) { + this.sequenceId = sequenceId; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgSubmit.java b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgSubmit.java new file mode 100644 index 00000000..0fcee8b0 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgSubmit.java @@ -0,0 +1,564 @@ +package org.jeecgframework.web.sms.util.msg.domain; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.log4j.Logger; + +import org.jeecgframework.web.sms.util.msg.util.MsgUtils; + + + +/** + * 鎻愪氦鐭俊鐨勬秷鎭牸寮. + * + * @author 绋嬪窛
    + * 閭锛 cmzcheng@gmail.com
    + * 鎻忚堪锛
    + * @version:1.0.0
    + * 鏃ユ湡锛 2013-4-24 涓嬪崍2:22:28
    + * CopyRight 漏 2012 chinaMobile.ahcmcc + */ +public class MsgSubmit extends MsgHead { + private static Logger logger = Logger.getLogger(MsgSubmit.class); + private long msgId = 0; + private byte pkTotal = 0x01; + private byte pkNumber = 0x01; + private byte registeredDelivery = 0x00; + private byte msgLevel = 0x01; + private String serviceId = ""; + private byte feeUserType = 0x00;// 璋佹帴鏀讹紝璁¤皝鐨勮垂 + private String feeTerminalId = ""; + private byte feeTerminalType = 0x00; + private byte tpPId = 0x00; + private byte tpUdhi = 0x00; + private byte msgFmt = 0x0f; + private String msgSrc; + // 01锛氬鈥滆璐圭敤鎴峰彿鐮佲濆厤璐癸紱 + // 02锛氬鈥滆璐圭敤鎴峰彿鐮佲濇寜鏉¤淇℃伅璐癸紱 + // 03锛氬鈥滆璐圭敤鎴峰彿鐮佲濇寜鍖呮湀鏀跺彇淇℃伅璐 + + private String feeType = "01";// 榛樿涓烘寜鏉 + private String feeCode = "000000"; + private String valIdTime = "";// 鏆備笉鏀寔 + private String atTime = "";// 鏆備笉鏀寔 + // SP鐨勬湇鍔′唬鐮佹垨鍓嶇紑涓烘湇鍔′唬鐮佺殑闀垮彿鐮, + // 缃戝叧灏嗚鍙风爜瀹屾暣鐨勫~鍒癝MPP鍗忚Submit_SM娑堟伅鐩稿簲鐨剆ource_addr瀛楁锛岃鍙风爜鏈缁堝湪鐢ㄦ埛鎵嬫満涓婃樉绀轰负鐭秷鎭殑涓诲彨鍙风爜銆 + private String srcId; + private byte destUsrTl = 0x01;// 涓嶆敮鎸佺兢鍙 + private String destTerminalId;// 鎺ユ敹鎵嬫満鍙风爜锛 + private byte destTerminalType = 0x00;// 鐪熷疄鍙风爜 + private byte msgLength; + private byte[] msgContent; + // 鐐规挱涓氬姟浣跨敤鐨凩inkID锛岄潪鐐规挱绫讳笟鍔$殑MT娴佺▼涓嶄娇鐢ㄨ瀛楁 + private String linkID = ""; + + /** + * . + * + * @return byte[] + */ + public byte[] toByteArry() { + ByteArrayOutputStream bous = new ByteArrayOutputStream(); + DataOutputStream dous = new DataOutputStream(bous); + try { + dous.writeInt(this.getTotalLength()); + dous.writeInt(this.getCommandId()); + dous.writeInt(this.getSequenceId()); + dous.writeLong(this.msgId);// Msg_Id 淇℃伅鏍囪瘑锛岀敱SP鎺ュ叆鐨勭煭淇$綉鍏虫湰韬骇鐢燂紝鏈濉┖ + dous.writeByte(this.pkTotal);// Pk_total 鐩稿悓Msg_Id鐨勪俊鎭绘潯鏁 + dous.writeByte(this.pkNumber);// Pk_number 鐩稿悓Msg_Id鐨勪俊鎭簭鍙凤紝浠1寮濮 + dous.writeByte(this.registeredDelivery);// Registered_Delivery + // 鏄惁瑕佹眰杩斿洖鐘舵佺‘璁ゆ姤鍛 + dous.writeByte(this.msgLevel);// Msg_level 淇℃伅绾у埆 + MsgUtils.writeString(dous, this.serviceId, 10);// Service_Id + // 涓氬姟鏍囪瘑锛屾槸鏁板瓧銆佸瓧姣嶅拰绗﹀彿鐨勭粍鍚堛 + dous.writeByte(this.feeUserType);// Fee_UserType 璁¤垂鐢ㄦ埛绫诲瀷瀛楁 + // 0锛氬鐩殑缁堢MSISDN璁¤垂锛 + // 1锛氬婧愮粓绔疢SISDN璁¤垂锛 + // 2锛氬SP璁¤垂; + // 3锛氳〃绀烘湰瀛楁鏃犳晥锛屽璋佽璐瑰弬瑙丗ee_terminal_Id瀛楁銆 + MsgUtils.writeString(dous, this.feeTerminalId, 32);// Fee_terminal_Id + // 琚璐圭敤鎴风殑鍙风爜 + dous.writeByte(this.feeTerminalType);// Fee_terminal_type + // 琚璐圭敤鎴风殑鍙风爜绫诲瀷锛0锛氱湡瀹炲彿鐮侊紱1锛氫吉鐮 + dous.writeByte(this.tpPId);// TP_pId + dous.writeByte(this.tpUdhi);// TP_udhi + dous.writeByte(this.msgFmt);// Msg_Fmt + MsgUtils.writeString(dous, this.msgSrc, 6);// Msg_src 淇℃伅鍐呭鏉ユ簮(SP_Id) + MsgUtils.writeString(dous, this.feeType, 2);// FeeType 璧勮垂绫诲埆 + MsgUtils.writeString(dous, this.feeCode, 6);// FeeCode + MsgUtils.writeString(dous, this.valIdTime, 17);// 瀛樻椿鏈夋晥鏈 + MsgUtils.writeString(dous, this.atTime, 17);// 瀹氭椂鍙戦佹椂闂 + MsgUtils.writeString(dous, this.srcId, 21);// Src_Id spCode + dous.writeByte(this.destUsrTl);// DestUsr_tl + MsgUtils.writeString(dous, this.destTerminalId, 32);// Dest_terminal_Id + dous.writeByte(this.destTerminalType);// Dest_terminal_type + // 鎺ユ敹鐭俊鐨勭敤鎴风殑鍙风爜绫诲瀷锛0锛氱湡瀹炲彿鐮侊紱1锛氫吉鐮 + dous.writeByte(this.msgLength);// Msg_Length + dous.write(this.msgContent);// 淇℃伅鍐呭 + MsgUtils.writeString(dous, this.linkID, 20);// 鐐规挱涓氬姟浣跨敤鐨凩inkID + dous.close(); + } catch (IOException e) { + logger.error("灏佽鐭俊鍙戦佷簩杩涘埗鏁扮粍澶辫触銆"); + } + return bous.toByteArray(); + } + + /** + * . + * + * @return long + */ + public long getMsgId() { + return msgId; + } + + /** + * . + * + * @param msgId + * long + */ + public void setMsgId(long msgId) { + this.msgId = msgId; + } + + /** + * . + * + * @return long + */ + public long getPkTotal() { + return pkTotal; + } + + /** + * . + * + * @param pkTotal + * byte + */ + public void setPkTotal(byte pkTotal) { + this.pkTotal = pkTotal; + } + + /** + * . + * + * @return byte + */ + public byte getPkNumber() { + return pkNumber; + } + + /** + * . + * + * @param pkNumber + * byte + */ + public void setPkNumber(byte pkNumber) { + this.pkNumber = pkNumber; + } + + /** + * . + * + * @return byte + */ + public byte getRegisteredDelivery() { + return registeredDelivery; + } + + /** + * . + * + * @param registeredDelivery + * byte + */ + public void setRegisteredDelivery(byte registeredDelivery) { + this.registeredDelivery = registeredDelivery; + } + + /** + * . + * + * @return byte + */ + public byte getMsgLevel() { + return msgLevel; + } + + /** + * . + * + * @param msgLevel + * byte + */ + public void setMsgLevel(byte msgLevel) { + this.msgLevel = msgLevel; + } + + /** + * . + * + * @return String + */ + public String getServiceId() { + return serviceId; + } + + /** + * . + * + * @param serviceId + * String + */ + public void setServiceId(String serviceId) { + this.serviceId = serviceId; + } + + /** + * . + * + * @return byte + */ + public byte getFeeUserType() { + return feeUserType; + } + + /** + * . + * + * @param feeUserType + * byte + */ + public void setFeeUserType(byte feeUserType) { + this.feeUserType = feeUserType; + } + + /** + * . + * + * @return String + */ + public String getFeeTerminalId() { + return feeTerminalId; + } + + /** + * . + * + * @param feeTerminalId + * String + */ + public void setFeeTerminalId(String feeTerminalId) { + this.feeTerminalId = feeTerminalId; + } + + /** + * . + * + * @return byte + */ + public byte getFeeTerminalType() { + return feeTerminalType; + } + + /** + * . + * + * @param feeTerminalType + * byte + */ + public void setFeeTerminalType(byte feeTerminalType) { + this.feeTerminalType = feeTerminalType; + } + + /** + * . + * + * @return byte + */ + public byte getTpPId() { + return tpPId; + } + + /** + * . + * + * @param tpPId + * byte + */ + public void setTpPId(byte tpPId) { + this.tpPId = tpPId; + } + + /** + * . + * + * @return byte + */ + public byte getTpUdhi() { + return tpUdhi; + } + + /** + * . + * + * @param tpUdhi + * byte + */ + public void setTpUdhi(byte tpUdhi) { + this.tpUdhi = tpUdhi; + } + + /** + * . + * + * @return byte + */ + public byte getMsgFmt() { + return msgFmt; + } + + /** + * . + * + * @param msgFmt + * byte + */ + public void setMsgFmt(byte msgFmt) { + this.msgFmt = msgFmt; + } + + /** + * . + * + * @return String + */ + public String getMsgSrc() { + return msgSrc; + } + + /** + * . + * + * @param msgSrc + * String + */ + public void setMsgSrc(String msgSrc) { + this.msgSrc = msgSrc; + } + + /** + * . + * + * @return String + */ + public String getFeeType() { + return feeType; + } + + /** + * . + * + * @param feeType + * String + */ + public void setFeeType(String feeType) { + this.feeType = feeType; + } + + /** + * . + * + * @return String + */ + public String getFeeCode() { + return feeCode; + } + + /** + * . + * + * @param feeCode + * String + */ + public void setFeeCode(String feeCode) { + this.feeCode = feeCode; + } + + /** + * . + * + * @return String + */ + public String getValIdTime() { + return valIdTime; + } + + /** + * . + * + * @param valIdTime + * String + */ + public void setValIdTime(String valIdTime) { + this.valIdTime = valIdTime; + } + + /** + * . + * + * @return String + */ + public String getAtTime() { + return atTime; + } + + /** + * . + * + * @param atTime + * String + */ + public void setAtTime(String atTime) { + this.atTime = atTime; + } + + /** + * . + * + * @return String + */ + public String getSrcId() { + return srcId; + } + + /** + * . + * + * @param srcId + * String + */ + public void setSrcId(String srcId) { + this.srcId = srcId; + } + + /** + * . + * + * @return String + */ + public byte getDestUsrTl() { + return destUsrTl; + } + + /** + * . + * + * @param destUsrTl + * String + */ + public void setDestUsrTl(byte destUsrTl) { + this.destUsrTl = destUsrTl; + } + + /** + * . + * + * @return String + */ + public String getDestTerminalId() { + return destTerminalId; + } + + /** + * . + * + * @param destTerminalId + * String + */ + public void setDestTerminalId(String destTerminalId) { + this.destTerminalId = destTerminalId; + } + + /** + * . + * + * @return byte + */ + public byte getDestTerminalType() { + return destTerminalType; + } + + /** + * . + * + * @param destTerminalType + * byte + */ + public void setDestTerminalType(byte destTerminalType) { + this.destTerminalType = destTerminalType; + } + + /** + * . + * + * @return byte + */ + public byte getMsgLength() { + return msgLength; + } + + /** + * . + * + * @param msgLength + * byte + */ + public void setMsgLength(byte msgLength) { + this.msgLength = msgLength; + } + + /** + * . + * + * @return byte[] + */ + public byte[] getMsgContent() { + return msgContent; + } + + /** + * . + * + * @param msgContent + * byte[] + */ + public void setMsgContent(byte[] msgContent) { + this.msgContent = msgContent; + } + + /** + * . + * + * @return String + */ + public String getLinkID() { + return linkID; + } + + /** + * . + * + * @param linkID + * String + */ + public void setLinkID(String linkID) { + this.linkID = linkID; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgSubmitResp.java b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgSubmitResp.java new file mode 100644 index 00000000..86435ad4 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/domain/MsgSubmitResp.java @@ -0,0 +1,90 @@ +package org.jeecgframework.web.sms.util.msg.domain; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.log4j.Logger; + +/** + * 鎻愪氦浠g爜鍚庣殑搴旂瓟娑堟伅瑙f瀽. + * + * @author 绋嬪窛
    + * 閭锛 cmzcheng@gmail.com
    + * 鎻忚堪锛
    + * @version:1.0.0
    + * 鏃ユ湡锛 2013-4-24 涓嬪崍2:22:49
    + * CopyRight 漏 2012 chinaMobile.ahcmcc + */ +public class MsgSubmitResp extends MsgHead { + private static Logger logger = Logger.getLogger(MsgSubmitResp.class); + private long msgId; + private int result;// 缁撴灉 0锛氭纭 1锛氭秷鎭粨鏋勯敊 2锛氬懡浠ゅ瓧閿 3锛氭秷鎭簭鍙烽噸澶 4锛氭秷鎭暱搴﹂敊 5锛氳祫璐逛唬鐮侀敊 + // 6锛氳秴杩囨渶澶т俊鎭暱 7锛氫笟鍔′唬鐮侀敊 8锛氭祦閲忔帶鍒堕敊 9锛氭湰缃戝叧涓嶈礋璐f湇鍔℃璁¤垂鍙风爜 10锛歋rc_Id閿欒 + // 11锛歁sg_src閿欒 12锛欶ee_terminal_Id閿欒 + // 13锛欴est_terminal_Id閿欒 + + /** + * . + * + * @param data + * byte[] + */ + public MsgSubmitResp(byte[] data) { + if (data.length == 8 + 8 + 4) { + ByteArrayInputStream bins = new ByteArrayInputStream(data); + DataInputStream dins = new DataInputStream(bins); + try { + this.setTotalLength(data.length + 4); + this.setCommandId(dins.readInt()); + this.setSequenceId(dins.readInt()); + this.msgId = dins.readLong(); + this.result = dins.readInt(); + dins.close(); + bins.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + logger.info("鍙戦佺煭淇MSP鍥炲,瑙f瀽鏁版嵁鍖呭嚭閿欙紝鍖呴暱搴︿笉涓鑷淬傞暱搴︿负:" + data.length); + } + } + + /** + * . + * + * @return long + */ + public long getMsgId() { + return msgId; + } + + /** + * . + * + * @param msgId + * long + */ + public void setMsgId(long msgId) { + this.msgId = msgId; + } + + /** + * . + * + * @return int + */ + public int getResult() { + return result; + } + + /** + * . + * + * @param result + * int + */ + public void setResult(int result) { + this.result = result; + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/util/CmppSender.java b/src/main/java/org/jeecgframework/web/sms/util/msg/util/CmppSender.java new file mode 100644 index 00000000..4a9bc993 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/util/CmppSender.java @@ -0,0 +1,229 @@ +package org.jeecgframework.web.sms.util.msg.util; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.EOFException; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.apache.log4j.Logger; + +import org.jeecgframework.web.sms.util.msg.domain.MsgActiveTestResp; +import org.jeecgframework.web.sms.util.msg.domain.MsgCommand; +import org.jeecgframework.web.sms.util.msg.domain.MsgConnectResp; +import org.jeecgframework.web.sms.util.msg.domain.MsgDeliver; +import org.jeecgframework.web.sms.util.msg.domain.MsgDeliverResp; +import org.jeecgframework.web.sms.util.msg.domain.MsgHead; +import org.jeecgframework.web.sms.util.msg.domain.MsgSubmitResp; + + + +/** + * 鍚姩涓涓嚎绋嬪幓鎺ユ敹鍜屽彂閫佹暟鎹紝濡傛灉闃熷垪澶勭悊瀹屾瘯灏卞叧闂嚎绋. + * + * @author 銆乻kycc + * @date 2014-11-17 + */ +public class CmppSender { + private static Logger logger = Logger.getLogger(CmppSender.class); + private List sendData = new ArrayList();// 闇瑕佸彂鍑虹殑浜岃繘鍒舵暟鎹槦鍒 + private List getData = new ArrayList();// 闇瑕佹帴鍙楃殑浜岃繘鍒堕槦鍒 + private DataOutputStream out; + private DataInputStream in; + + /** + * . + * + * @param out + * DataOutputStream + * @param in + * DataInputStream + * @param sendData + * List + */ + public CmppSender(DataOutputStream out, DataInputStream in, + List sendData) { + super(); + this.sendData = sendData; + this.out = out; + this.in = in; + } + + /** + * . + * + * @throws Exception + * Exception + */ + public void start() throws Exception { + if (out != null && null != sendData) { + for (byte[] data : sendData) { + logger.info("鍙戦佺殑浜岃繘鍒堕槦鍒楅噷data闀垮害====" + data.length); + sendMsg(data); + byte[] returnData = getInData(); + logger.info("鍙戦佺殑浜岃繘鍒堕槦鍒楅噷鍝嶅簲鍊肩殑闀垮害====" + returnData.length); + if (null != returnData) { + getData.add(returnData); + } + } + } + if (in != null && null != getData) { + for (byte[] data : getData) { + logger.info("鎺ユ敹鐨勪簩杩涘埗闃熷垪閲宒ata闀垮害====" + data.length); + if (data.length >= 8) { + MsgHead head = new MsgHead(data); + switch (head.getCommandId()) { + case MsgCommand.CMPP_CONNECT_RESP: + logger.info("閾炬帴鑷崇煭淇$綉鍏充箣鍓峝ata闀垮害====" + data.length); + MsgConnectResp connectResp = new MsgConnectResp(data); + logger.info("蹇秷骞冲彴" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date()) + "閾炬帴鐭俊缃戝叧,鐘舵:" + + connectResp.getStatusStr() + " 搴忓垪鍙凤細" + + connectResp.getSequenceId()); + break; + case MsgCommand.CMPP_ACTIVE_TEST_RESP: + MsgActiveTestResp activeResp = new MsgActiveTestResp( + data); + logger.info("蹇秷骞冲彴" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date()) + "鐭俊缃戝叧涓庣煭淇$綉鍏宠繘琛岃繛鎺ユ鏌" + + " 搴忓垪鍙凤細" + activeResp.getSequenceId()); + break; + case MsgCommand.CMPP_SUBMIT_RESP: + MsgSubmitResp submitResp = new MsgSubmitResp(data); + logger.info("蹇秷骞冲彴" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date()) + "鍚戠敤鎴蜂笅鍙戠煭淇★紝鐘舵佺爜:" + + submitResp.getResult() + " 搴忓垪鍙凤細" + + submitResp.getSequenceId()); + break; + case MsgCommand.CMPP_TERMINATE_RESP: + logger.info("蹇秷骞冲彴" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date()) + "鎷嗛櫎涓嶪SMG鐨勯摼鎺" + + " 搴忓垪鍙凤細" + head.getSequenceId()); + break; + case MsgCommand.CMPP_CANCEL_RESP: + logger.info("CMPP_CANCEL_RESP 搴忓垪鍙凤細" + + head.getSequenceId()); + break; + case MsgCommand.CMPP_CANCEL: + logger.info("CMPP_CANCEL 搴忓垪鍙凤細" + head.getSequenceId()); + break; + case MsgCommand.CMPP_DELIVER: + MsgDeliver msgDeliver = new MsgDeliver(data); + if (msgDeliver.getResult() == 0) { + logger.info("CMPP_DELIVER 搴忓垪鍙凤細" + + head.getSequenceId() + + "锛屾槸鍚︽秷鎭洖澶" + + (msgDeliver.getRegisteredDelivery() == 0 ? "涓嶆槸,娑堟伅鍐呭锛" + + msgDeliver.getMsgContent() + : "鏄紝鐩殑鎵嬫満鍙凤細" + + msgDeliver + .getDestTerminalId())); + } else { + logger.info("CMPP_DELIVER 搴忓垪鍙凤細" + + head.getSequenceId()); + } + MsgDeliverResp msgDeliverResp = new MsgDeliverResp(); + msgDeliverResp.setTotalLength(12 + 8 + 4); + msgDeliverResp + .setCommandId(MsgCommand.CMPP_DELIVER_RESP); + msgDeliverResp.setSequenceId(MsgUtils.getSequence()); + msgDeliverResp.setMsgId(msgDeliver.getMsgId()); + msgDeliverResp.setResult(msgDeliver.getResult()); + sendMsg(msgDeliverResp.toByteArry());// 杩涜鍥炲 + break; + case MsgCommand.CMPP_DELIVER_RESP: + logger.info("CMPP_DELIVER_RESP 搴忓垪鍙凤細" + + head.getSequenceId()); + break; + case MsgCommand.CMPP_QUERY: + logger.info("CMPP_QUERY 搴忓垪鍙凤細" + head.getSequenceId()); + break; + case MsgCommand.CMPP_QUERY_RESP: + logger.info("CMPP_QUERY_RESP 搴忓垪鍙凤細" + + head.getSequenceId()); + break; + case MsgCommand.CMPP_TERMINATE: + logger.info("CMPP_TERMINATE 搴忓垪鍙凤細" + + head.getSequenceId()); + break; + case MsgCommand.CMPP_CONNECT: + logger.info("CMPP_CONNECT 搴忓垪鍙凤細" + head.getSequenceId()); + break; + case MsgCommand.CMPP_ACTIVE_TEST: + logger.info("CMPP_ACTIVE_TEST 搴忓垪鍙凤細" + + head.getSequenceId()); + break; + case MsgCommand.CMPP_SUBMIT: + logger.info("CMPP_SUBMIT 搴忓垪鍙凤細" + head.getSequenceId()); + break; + default: + logger.error("鏃犳硶瑙f瀽IMSP杩斿洖鐨勫寘缁撴瀯锛氬寘闀垮害涓" + + head.getTotalLength()); + break; + } + } + } + } + } + + /** + * . + * + * @return List + */ + public List getGetData() { + return getData; + } + + /** + * 鍦ㄦ湰杩炵粨涓婂彂閫佸凡鎵撳寘鍚庣殑娑堟伅鐨勫瓧鑺. + * + * @param data + * :瑕佸彂閫佹秷鎭殑瀛楄妭 + * @return boolean + * + * @exception Exception Exception + */ + private boolean sendMsg(byte[] data) throws Exception { + try { + out.write(data); + out.flush(); + return true; + } catch (NullPointerException ef) { + logger.error("鍦ㄦ湰杩炵粨涓婂彂閫佸凡鎵撳寘鍚庣殑娑堟伅鐨勫瓧鑺:鏃犲瓧鑺傝緭鍏"); + } + return false; + } +/** + * . + * @return byte[] + * @throws IOException IOException + * + */ + private byte[] getInData() throws IOException { + try { + int len = in.readInt(); + logger.info("杈撳叆鐨勬祦閲岃鍙栫殑len==" + len); + if (null != in && 0 != len) { + byte[] data = new byte[len - 4]; + in.read(data); + return data; + } else { + return null; + } + } catch (NullPointerException ef) { + logger.error("鍦ㄦ湰杩炵粨涓婃帴鍙楀瓧鑺傛秷鎭:鏃犳祦杈撳叆"); + return null; + } catch (EOFException eof) { + logger.error("鍦ㄦ湰杩炵粨涓婃帴鍙楀瓧鑺傛秷鎭:" + eof.getMessage()); + return null; + } + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/util/MsgActivityTimer.java b/src/main/java/org/jeecgframework/web/sms/util/msg/util/MsgActivityTimer.java new file mode 100644 index 00000000..341fd188 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/util/MsgActivityTimer.java @@ -0,0 +1,36 @@ +package org.jeecgframework.web.sms.util.msg.util; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.scheduling.quartz.QuartzJobBean; + +/** + * 鍋氭縺娲绘祴璇曠敤鐨勫垽鏂槸鍚﹀湪杩炴帴濡傛灉涓嶅湪杩涜閾捐矾杩炴帴. + * @author 绋嬪窛 + *
    閭锛 cmzcheng@gmail.com + *
    鎻忚堪锛 + *
    @version:1.0.0 + *
    鏃ユ湡锛 2013-4-24 涓嬪崍2:36:25 + *
    CopyRight 漏 2012 chinaMobile.ahcmcc + */ +public class MsgActivityTimer extends QuartzJobBean { + /** + * 鐭俊鎺ュ彛闀块摼鎺ワ紝瀹氭椂杩涜閾捐矾妫鏌. + * @param arg0 JobExecutionContext + * @exception JobExecutionException JobExecutionException + */ + protected void executeInternal(JobExecutionContext arg0) + throws JobExecutionException { + System.out.println("脳脳脳脳脳脳脳脳脳脳脳脳脳寮濮嬮摼璺鏌ッ椕椕椕椕椕椕椕椕椕椕椕椕椕"); + int count = 0; + boolean result = MsgContainer.activityTestISMG(); + while (!result) { + count++; + result = MsgContainer.activityTestISMG(); + if (count >= (MsgConfig.getConnectCount() - 1)) {// 濡傛灉鍐嶆閾捐矾妫鏌ユ鏁拌秴杩囦袱娆″垯缁堟杩炴帴 + break; + } + } + System.out.println("脳脳脳脳脳脳脳脳脳脳脳脳脳閾捐矾妫鏌ョ粨鏉熋椕椕椕椕椕椕椕椕椕椕椕椕椕"); + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/util/MsgConfig.java b/src/main/java/org/jeecgframework/web/sms/util/msg/util/MsgConfig.java new file mode 100644 index 00000000..08e3663b --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/util/MsgConfig.java @@ -0,0 +1,88 @@ +package org.jeecgframework.web.sms.util.msg.util; + +import java.util.ResourceBundle; + +/** + * 鐢ㄤ簬鑾峰彇鐭俊鎺ュ彛閰嶇疆鍙傛暟. + * + * @author skycc + * 2014-11-17 11:34 + */ +public class MsgConfig { + private static final ResourceBundle resourceBundle = ResourceBundle + .getBundle("MsgConfig"); + + /** + * . + * + * @param key + * String + * @return String + */ + public static String get(String key) { + return resourceBundle.getString(key); + } + + /** + * 鑾峰彇浜掕仈缃戠煭淇$綉鍏矷P. + * + * @return String + */ + public static String getIsmgIp() { + return MsgConfig.get("ismgIp"); + } + + /** + * 鑾峰彇浜掕仈缃戠煭淇$綉鍏崇鍙e彿. + * + * @return int + */ + public static int getIsmgPort() { + return Integer.parseInt(MsgConfig.get("ismgPort")); + } + + /** + * 鑾峰彇sp浼佷笟浠g爜. + * + * @return String + */ + public static String getSpId() { + return MsgConfig.get("spId"); + } + + /** + * 鑾峰彇sp涓嬪彂鐭俊鍙风爜. + * + * @return String + */ + public static String getSpCode() { + return MsgConfig.get("spCode"); + } + + /** + * 鑾峰彇sp sharedSecret. + * + * @return String + */ + public static String getSpSharedSecret() { + return MsgConfig.get("sharedSecret"); + } + + /** + * 鑾峰彇閾炬帴鐨勬鏁. + * + * @return int + */ + public static int getConnectCount() { + return Integer.parseInt(MsgConfig.get("connectCount")); + } + + /** + * 鑾峰彇閾炬帴鐨勮秴鏃舵椂闂. + * + * @return int + */ + public static int getTimeOut() { + return Integer.parseInt(MsgConfig.get("timeOut")); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/util/MsgContainer.java b/src/main/java/org/jeecgframework/web/sms/util/msg/util/MsgContainer.java new file mode 100644 index 00000000..3a0468c0 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/util/MsgContainer.java @@ -0,0 +1,644 @@ +package org.jeecgframework.web.sms.util.msg.util; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; +import java.net.UnknownHostException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.apache.log4j.Logger; + +import org.jeecgframework.web.sms.util.msg.domain.MsgCommand; +import org.jeecgframework.web.sms.util.msg.domain.MsgConnect; +import org.jeecgframework.web.sms.util.msg.domain.MsgHead; +import org.jeecgframework.web.sms.util.msg.domain.MsgSubmit; + + +/** + * 鐭俊鎺ュ彛瀹瑰櫒锛屽崟渚嬭幏寰楅摼鎺ュ璞. + * + * @author 寮犵浼 2011-08-22 14:20 + * + */ +public class MsgContainer { + private static Logger logger = Logger.getLogger(MsgContainer.class); + private static Socket msgSocket; + private static DataInputStream in; + private static DataOutputStream out; + + /** + * . + * + * @return DataInputStream + */ + public static DataInputStream getSocketDIS() { + if (in == null || null == msgSocket || msgSocket.isClosed() + || !msgSocket.isConnected()) { + try { + in = new DataInputStream(MsgContainer.getSocketInstance() + .getInputStream()); + } catch (IOException e) { + in = null; + } + } + return in; + } + + /** + * . + * + * @return DataOutputStream + */ + public static DataOutputStream getSocketDOS() { + if (out == null || null == msgSocket || msgSocket.isClosed() + || !msgSocket.isConnected()) { + try { + out = new DataOutputStream(MsgContainer.getSocketInstance() + .getOutputStream()); + } catch (IOException e) { + out = null; + } + } + return out; + } + + /** + * . + * + * @return Socket + */ + public static Socket getSocketInstance() { + if (null == msgSocket || msgSocket.isClosed() + || !msgSocket.isConnected()) { + try { + in = null; + out = null; + msgSocket = new Socket(MsgConfig.getIsmgIp(), + MsgConfig.getIsmgPort()); + msgSocket.setKeepAlive(true); + in = getSocketDIS(); + out = getSocketDOS(); + int count = 0; + boolean result = connectISMG(); + logger.info("result" + result); + while (!result) { + count++; + result = connectISMG(); + if (count >= (MsgConfig.getConnectCount() - 1)) {// 濡傛灉鍐嶆杩炴帴娆℃暟瓒呰繃涓ゆ鍒欑粓姝㈣繛鎺 + break; + } + }// */ + } catch (UnknownHostException e) { + logger.error("Socket閾炬帴鐭俊缃戝叧绔彛鍙蜂笉姝g‘锛" + e.getMessage()); + // 閾炬帴鐭俊缃戝叧 + } catch (IOException e) { + logger.error("Socket閾炬帴鐭俊缃戝叧澶辫触锛" + e.getMessage()); + } + } + return msgSocket; + } + + /** + * 鍒涘缓Socket閾炬帴鍚庤姹傞摼鎺SMG. + * + * @return boolean + */ + private static boolean connectISMG() { + MsgConnect connect = new MsgConnect(); + connect.setTotalLength(12 + 6 + 16 + 1 + 4);// 娑堟伅鎬婚暱搴︼紝绾ф诲瓧鑺傛暟:4+4+4(娑堟伅澶)+6+16+1+4(娑堟伅涓讳綋) + connect.setCommandId(MsgCommand.CMPP_CONNECT);// 鏍囪瘑鍒涘缓杩炴帴 + connect.setSequenceId(MsgUtils.getSequence());// 搴忓垪锛岀敱鎴戜滑鎸囧畾 + connect.setSourceAddr(MsgConfig.getSpId());// 鎴戜滑鐨勪紒涓氫唬鐮 + connect.setAuthenticatorSource(MsgUtils.getAuthenticatorSource( + MsgConfig.getSpId(), MsgConfig.getSpSharedSecret()));// md5(浼佷笟浠g爜+瀵嗗寵+鏃堕棿鎴) + connect.setTimestamp(Integer.parseInt(MsgUtils.getTimestamp()));// 鏃堕棿鎴(MMDDHHMMSS) + // connect.setTimestamp(1104230904);//鏃堕棿鎴(MMDDHHMMSS)423202240 + connect.setVersion((byte) 0x30);// 鐗堟湰鍙 楂4bit涓3锛屼綆4浣嶄负0 + logger.error("娑堟伅闀垮害:" + connect.getTotalLength()); + logger.error("鏍囪瘑:" + connect.getCommandId()); + logger.error("搴忓垪:" + connect.getSequenceId()); + logger.error("浼佷笟id:" + connect.getSourceAddr()); + logger.error("md5:" + connect.getAuthenticatorSource().length); + logger.error("鏃堕棿鎴:" + connect.getTimestamp()); + logger.error("鐗堟湰鍙:" + connect.getVersion()); + List dataList = new ArrayList(); + dataList.add(connect.toByteArry()); + CmppSender sender = new CmppSender(getSocketDOS(), getSocketDIS(), + dataList); + try { + sender.start(); + return true; + } catch (Exception e) { + try { + out.close(); + } catch (IOException e1) { + out = null; + } + return false; + } + } + + /** + * 鐭俊鍙戦佽姹傚彲鐩存帴璋冪敤姝よ繘琛岀煭淇″彂閫. + * + * @param msg + * String + * @param cusMsisdn + * String + * @return boolean + */ + public static boolean sendMsg(String msg, String cusMsisdn) { + try { + if (msg.getBytes("utf-8").length < 140) {// 鐭煭淇 + boolean result = sendShortMsg(msg, cusMsisdn); + int count = 0; + while (!result) { + count++; + result = sendShortMsg(msg, cusMsisdn); + if (count >= (MsgConfig.getConnectCount() - 1)) {// 濡傛灉鍐嶆杩炴帴娆℃暟瓒呰繃涓ゆ鍒欑粓姝㈣繛鎺 + break; + } + } + return result; + } else {// 闀跨煭淇 + boolean result = sendLongMsg(msg, cusMsisdn); + int count = 0; + while (!result) { + count++; + result = sendLongMsg(msg, cusMsisdn); + if (count >= (MsgConfig.getConnectCount() - 1)) {// 濡傛灉鍐嶆杩炴帴娆℃暟瓒呰繃涓ゆ鍒欑粓姝㈣繛鎺 + break; + } + } + return result; + } + } catch (Exception e) { + try { + out.close(); + } catch (IOException e1) { + out = null; + } + return false; + } + } + + /** + * 鍙戦亀eb push鐭俊. + * + * @param url + * wap缃戝潃 + * @param desc + * 鎻忚堪 + * @param cusMsisdn + * 鐭俊 + * @return boolean + */ + public static boolean sendWapPushMsg(String url, String desc, + String cusMsisdn) { + try { + int msgContent = 12 + 9 + 9 + url.getBytes("utf-8").length + 3 + + desc.getBytes("utf-8").length + 3; + if (msgContent < 140) { + boolean result = sendShortWapPushMsg(url, desc, cusMsisdn); + int count = 0; + while (!result) { + count++; + result = sendShortWapPushMsg(url, desc, cusMsisdn); + if (count >= (MsgConfig.getConnectCount() - 1)) {// 濡傛灉鍐嶆杩炴帴娆℃暟瓒呰繃涓ゆ鍒欑粓姝㈣繛鎺 + break; + } + } + return result; + } else { + boolean result = sendLongWapPushMsg(url, desc, cusMsisdn); + int count = 0; + while (!result) { + count++; + result = sendLongWapPushMsg(url, desc, cusMsisdn); + if (count >= (MsgConfig.getConnectCount() - 1)) {// 濡傛灉鍐嶆杩炴帴娆℃暟瓒呰繃涓ゆ鍒欑粓姝㈣繛鎺 + break; + } + } + return result; + } + } catch (Exception e) { + try { + out.close(); + } catch (IOException e1) { + out = null; + } + logger.error("鍙戦亀eb push鐭俊:" + e.getMessage()); + return false; + } + } + + /** + * 鍙戦佺煭鐭俊. + * + * @param msg + * String + * @param cusMsisdn + * String + * @return boolean + */ + private static boolean sendShortMsg(String msg, String cusMsisdn) { + try { + int seq = MsgUtils.getSequence(); + MsgSubmit submit = new MsgSubmit(); + submit.setTotalLength(12 + 8 + 1 + 1 + 1 + 1 + 10 + 1 + 32 + 1 + 1 + + 1 + 1 + 6 + 2 + 6 + 17 + 17 + 21 + 1 + 32 + 1 + 1 + + msg.length() * 2 + 20); + submit.setCommandId(MsgCommand.CMPP_SUBMIT); + submit.setSequenceId(seq); + submit.setPkTotal((byte) 0x01); + submit.setPkNumber((byte) 0x01); + submit.setRegisteredDelivery((byte) 0x00); + submit.setMsgLevel((byte) 0x01); + submit.setFeeUserType((byte) 0x00); + submit.setFeeTerminalId(""); + submit.setFeeTerminalType((byte) 0x00); + submit.setTpPId((byte) 0x00); + submit.setTpUdhi((byte) 0x00); + submit.setMsgFmt((byte) 0x0f); + submit.setMsgSrc(MsgConfig.getSpId()); + submit.setSrcId(MsgConfig.getSpCode()); + submit.setDestTerminalId(cusMsisdn); + submit.setMsgLength((byte) (msg.length() * 2)); + submit.setMsgContent(msg.getBytes("gb2312")); + + List dataList = new ArrayList(); + dataList.add(submit.toByteArry()); + CmppSender sender = new CmppSender(getSocketDOS(), getSocketDIS(), + dataList); + sender.start(); + logger.info("鏁版嵁涔愬洯浜" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date()) + "鍚" + cusMsisdn + + "涓嬪彂鐭煭淇★紝搴忓垪鍙蜂负:" + seq); + return true; + } catch (Exception e) { + try { + out.close(); + } catch (IOException e1) { + out = null; + } + logger.error("鍙戦佺煭鐭俊" + e.getMessage()); + return false; + } + } + + /** + * 鍙戦侀暱鐭俊. + * + * @param msg + * String + * @param cusMsisdn + * String + * @return boolean + */ + private static boolean sendLongMsg(String msg, String cusMsisdn) { + try { + byte[] allByte = msg.getBytes("UTF-16BE"); + List dataList = new ArrayList(); + int msgLength = allByte.length; + int maxLength = 140; + int msgSendCount = msgLength % (maxLength - 6) == 0 ? msgLength + / (maxLength - 6) : msgLength / (maxLength - 6) + 1; + // 鐭俊鎭唴瀹瑰ご鎷兼帴 + byte[] msgHead = new byte[6]; + msgHead[0] = 0x05; + msgHead[1] = 0x00; + msgHead[2] = 0x03; + msgHead[3] = (byte) MsgUtils.getSequence(); + msgHead[4] = (byte) msgSendCount; + msgHead[5] = 0x01; + int seqId = MsgUtils.getSequence(); + for (int i = 0; i < msgSendCount; i++) { + // msgHead[3]=(byte)MsgUtils.getSequence(); + msgHead[5] = (byte) (i + 1); + byte[] needMsg = null; + // 娑堟伅澶+娑堟伅鍐呭鎷嗗垎 + if (i != msgSendCount - 1) { + int start = (maxLength - 6) * i; + int end = (maxLength - 6) * (i + 1); + needMsg = MsgUtils.getMsgBytes(allByte, start, end); + } else { + int start = (maxLength - 6) * i; + int end = allByte.length; + needMsg = MsgUtils.getMsgBytes(allByte, start, end); + } + int subLength = needMsg.length + msgHead.length; + byte[] sendMsg = new byte[needMsg.length + msgHead.length]; + System.arraycopy(msgHead, 0, sendMsg, 0, 6); + System.arraycopy(needMsg, 0, sendMsg, 6, needMsg.length); + MsgSubmit submit = new MsgSubmit(); + submit.setTotalLength(12 + 8 + 1 + 1 + 1 + 1 + 10 + 1 + 32 + 1 + + 1 + 1 + 1 + 6 + 2 + 6 + 17 + 17 + 21 + 1 + 32 + 1 + 1 + + subLength + 20); + submit.setCommandId(MsgCommand.CMPP_SUBMIT); + submit.setSequenceId(seqId); + submit.setPkTotal((byte) msgSendCount); + submit.setPkNumber((byte) (i + 1)); + submit.setRegisteredDelivery((byte) 0x00); + submit.setMsgLevel((byte) 0x01); + submit.setFeeUserType((byte) 0x00); + submit.setFeeTerminalId(""); + submit.setFeeTerminalType((byte) 0x00); + submit.setTpPId((byte) 0x00); + submit.setTpUdhi((byte) 0x01); + submit.setMsgFmt((byte) 0x08); + submit.setMsgSrc(MsgConfig.getSpId()); + submit.setSrcId(MsgConfig.getSpCode()); + submit.setDestTerminalId(cusMsisdn); + submit.setMsgLength((byte) subLength); + submit.setMsgContent(sendMsg); + dataList.add(submit.toByteArry()); + } + CmppSender sender = new CmppSender(getSocketDOS(), getSocketDIS(), + dataList); + sender.start(); + logger.info("鏁版嵁涔愬洯浜" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date()) + "鍚" + cusMsisdn + + "涓嬪彂闀跨煭淇★紝搴忓垪鍙蜂负:" + seqId); + return true; + } catch (Exception e) { + try { + out.close(); + } catch (IOException e1) { + out = null; + } + logger.error("鍙戦侀暱鐭俊" + e.getMessage()); + return false; + } + } + + /** + * 鎷嗛櫎涓嶪SMG鐨勯摼鎺. + * + * @return boolean + */ + public static boolean cancelISMG() { + try { + MsgHead head = new MsgHead(); + head.setTotalLength(12);// 娑堟伅鎬婚暱搴︼紝绾ф诲瓧鑺傛暟:4+4+4(娑堟伅澶)+6+16+1+4(娑堟伅涓讳綋) + head.setCommandId(MsgCommand.CMPP_TERMINATE);// 鏍囪瘑鍒涘缓杩炴帴 + head.setSequenceId(MsgUtils.getSequence());// 搴忓垪锛岀敱鎴戜滑鎸囧畾 + + List dataList = new ArrayList(); + dataList.add(head.toByteArry()); + CmppSender sender = new CmppSender(getSocketDOS(), getSocketDIS(), + dataList); + sender.start(); + getSocketInstance().close(); + out.close(); + in.close(); + return true; + } catch (Exception e) { + try { + out.close(); + in.close(); + } catch (IOException e1) { + in = null; + out = null; + } + logger.error("鎷嗛櫎涓嶪SMG鐨勯摼鎺" + e.getMessage()); + return false; + } + } + + /** + * 閾捐矾妫鏌. + * + * @return boolean + */ + public static boolean activityTestISMG() { + try { + logger.info("activityTestISMG================start"); + MsgHead head = new MsgHead(); + head.setTotalLength(12);// 娑堟伅鎬婚暱搴︼紝绾ф诲瓧鑺傛暟:4+4+4(娑堟伅澶)+6+16+1+4(娑堟伅涓讳綋) + head.setCommandId(MsgCommand.CMPP_ACTIVE_TEST);// 鏍囪瘑鍒涘缓杩炴帴 + head.setSequenceId(MsgUtils.getSequence());// 搴忓垪锛岀敱鎴戜滑鎸囧畾 + List dataList = new ArrayList(); + dataList.add(head.toByteArry()); + CmppSender sender = new CmppSender(getSocketDOS(), getSocketDIS(), + dataList); + sender.start(); + logger.info("activityTestISMG================end"); + return true; + } catch (Exception e) { + try { + out.close(); + logger.info("activityTestISMG================end"); + } catch (IOException e1) { + out = null; + } + logger.error("閾捐矾妫鏌" + e.getMessage()); + return false; + } + } + + /** + * 鍙戦亀eb push 鐭煭淇. + * + * @param url + * wap缃戝潃 + * @param desc + * 鎻忚堪 + * @param cusMsisdn + * 鐭俊 + * @return boolean + */ + private static boolean sendShortWapPushMsg(String url, String desc, + String cusMsisdn) { + try { + // length 12 + byte[] szWapPushHeader1 = { 0x0B, 0x05, 0x04, 0x0B, (byte) 0x84, + 0x23, (byte) 0xF0, 0x00, 0x03, 0x03, 0x01, 0x01 }; + // length 9 + byte[] szWapPushHeader2 = { 0x29, 0x06, 0x06, 0x03, (byte) 0xAE, + (byte) 0x81, (byte) 0xEA, (byte) 0x8D, (byte) 0xCA }; + // length 9 + byte[] szWapPushIndicator = { 0x02, 0x05, 0x6A, 0x00, 0x45, + (byte) 0xC6, 0x08, 0x0C, 0x03 }; + // 鍘婚櫎浜唄ttp://鍓嶇紑鐨刄TF8缂栫爜鐨刄rl鍦板潃"鐨勪簩杩涘埗缂栫爜 + byte[] szWapPushUrl = url.getBytes("utf-8"); + // length 3 + byte[] szWapPushDisplayTextHeader = { 0x00, 0x01, 0x03 }; + // 鎯冲湪鎵嬫満涓婃樉绀虹殑鍏充簬杩欎釜URL鐨勬枃瀛楄鏄,UTF8缂栫爜鐨勪簩杩涘埗 + byte szMsg[] = desc.getBytes("utf-8"); + // length 3 + byte[] szEndOfWapPush = { 0x00, 0x01, 0x01 }; + int msgLength = 12 + 9 + 9 + szWapPushUrl.length + 3 + szMsg.length + + 3; + int seq = MsgUtils.getSequence(); + MsgSubmit submit = new MsgSubmit(); + submit.setTotalLength(12 + 8 + 1 + 1 + 1 + 1 + 10 + 1 + 32 + 1 + 1 + + 1 + 1 + 6 + 2 + 6 + 17 + 17 + 21 + 1 + 32 + 1 + 1 + + msgLength + 20); + submit.setCommandId(MsgCommand.CMPP_SUBMIT); + submit.setSequenceId(seq); + submit.setPkTotal((byte) 0x01); + submit.setPkNumber((byte) 0x01); + submit.setRegisteredDelivery((byte) 0x00); + submit.setMsgLevel((byte) 0x01); + submit.setFeeUserType((byte) 0x00); + submit.setFeeTerminalId(""); + submit.setFeeTerminalType((byte) 0x00); + submit.setTpPId((byte) 0x00); + submit.setTpUdhi((byte) 0x01); + submit.setMsgFmt((byte) 0x04); + submit.setMsgSrc(MsgConfig.getSpId()); + submit.setSrcId(MsgConfig.getSpCode()); + submit.setDestTerminalId(cusMsisdn); + submit.setMsgLength((byte) msgLength); + byte[] sendMsg = new byte[12 + 9 + 9 + szWapPushUrl.length + 3 + + szMsg.length + 3]; + System.arraycopy(szWapPushHeader1, 0, sendMsg, 0, 12); + System.arraycopy(szWapPushHeader2, 0, sendMsg, 12, 9); + System.arraycopy(szWapPushIndicator, 0, sendMsg, 12 + 9, 9); + System.arraycopy(szWapPushUrl, 0, sendMsg, 12 + 9 + 9, + szWapPushUrl.length); + System.arraycopy(szWapPushDisplayTextHeader, 0, sendMsg, + 12 + 9 + 9 + szWapPushUrl.length, 3); + System.arraycopy(szMsg, 0, sendMsg, 12 + 9 + 9 + + szWapPushUrl.length + 3, szMsg.length); + System.arraycopy(szEndOfWapPush, 0, sendMsg, 12 + 9 + 9 + + szWapPushUrl.length + 3 + szMsg.length, 3); + submit.setMsgContent(sendMsg); + List dataList = new ArrayList(); + dataList.add(submit.toByteArry()); + CmppSender sender = new CmppSender(getSocketDOS(), getSocketDIS(), + dataList); + sender.start(); + logger.info("鏁版嵁涔愬洯浜" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date()) + "鍚" + cusMsisdn + + "涓嬪彂web push鐭煭淇★紝搴忓垪鍙蜂负:" + seq); + return true; + } catch (Exception e) { + try { + out.close(); + } catch (IOException e1) { + out = null; + } + logger.error("鍙戦亀eb push鐭煭淇" + e.getMessage()); + return false; + } + } + + /** + * 鍙戦亀eb push 闀跨煭淇. + * + * @param url + * wap缃戝潃 + * @param desc + * 鎻忚堪 + * @param cusMsisdn + * 鐭俊 + * @return boolean + */ + private static boolean sendLongWapPushMsg(String url, String desc, + String cusMsisdn) { + try { + List dataList = new ArrayList(); + // length 12 + byte[] wdp = { 0x0B, 0x05, 0x04, 0x0B, (byte) 0x84, 0x23, + (byte) 0xF0, 0x00, 0x03, 0x03, 0x01, 0x01 }; + // 闇瑕佹媶鍒嗙殑閮ㄥ垎 + // length 9 + byte[] wsp = { 0x29, 0x06, 0x06, 0x03, (byte) 0xAE, (byte) 0x81, + (byte) 0xEA, (byte) 0x8D, (byte) 0xCA }; + // length 9 + byte[] szWapPushIndicator = { 0x02, 0x05, 0x6A, 0x00, 0x45, + (byte) 0xC6, 0x08, 0x0C, 0x03 }; + // 鍘婚櫎浜唄ttp://鍓嶇紑鐨刄TF8缂栫爜鐨刄rl鍦板潃"鐨勪簩杩涘埗缂栫爜 + byte[] szWapPushUrl = url.getBytes("utf-8"); + // length 3 + byte[] szWapPushDisplayTextHeader = { 0x00, 0x01, 0x03 }; + // 鎯冲湪鎵嬫満涓婃樉绀虹殑鍏充簬杩欎釜URL鐨勬枃瀛楄鏄,UTF8缂栫爜鐨勪簩杩涘埗 + byte szMsg[] = desc.getBytes("utf-8"); + // length 3 + byte[] szEndOfWapPush = { 0x00, 0x01, 0x01 }; + byte[] allByte = new byte[9 + 9 + szWapPushUrl.length + 3 + + szMsg.length + 3]; + + System.arraycopy(wsp, 0, allByte, 0, 9); + System.arraycopy(szWapPushIndicator, 0, allByte, 9, 9); + System.arraycopy(szWapPushUrl, 0, allByte, 18, szWapPushUrl.length); + System.arraycopy(szWapPushDisplayTextHeader, 0, allByte, + 18 + szWapPushUrl.length, 3); + System.arraycopy(szMsg, 0, allByte, 18 + szWapPushUrl.length + 3, + szMsg.length); + System.arraycopy(szEndOfWapPush, 0, allByte, 18 + + szWapPushUrl.length + 3 + szMsg.length, 3); + int msgMax = 140; + int msgCount = allByte.length % (msgMax - wdp.length) == 0 ? allByte.length + / (msgMax - wdp.length) + : allByte.length / (msgMax - wdp.length) + 1; + wdp[10] = (byte) msgCount; + int seqId = MsgUtils.getSequence(); + for (int i = 0; i < msgCount; i++) { + wdp[11] = (byte) (i + 1); + byte[] needMsg = null; + // 娑堟伅澶+娑堟伅鍐呭鎷嗗垎 + if (i != msgCount - 1) { + int start = (msgMax - wdp.length) * i; + int end = (msgMax - wdp.length) * (i + 1); + needMsg = MsgUtils.getMsgBytes(allByte, start, end); + } else { + int start = (msgMax - wdp.length) * i; + int end = allByte.length; + needMsg = MsgUtils.getMsgBytes(allByte, start, end); + } + int msgLength = needMsg.length + wdp.length; + MsgSubmit submit = new MsgSubmit(); + submit.setTotalLength(12 + 8 + 1 + 1 + 1 + 1 + 10 + 1 + 32 + 1 + + 1 + 1 + 1 + 6 + 2 + 6 + 17 + 17 + 21 + 1 + 32 + 1 + 1 + + msgLength + 20); + submit.setCommandId(MsgCommand.CMPP_SUBMIT); + submit.setSequenceId(seqId); + submit.setPkTotal((byte) msgCount); + submit.setPkNumber((byte) (i + 1)); + submit.setRegisteredDelivery((byte) 0x00); + submit.setMsgLevel((byte) 0x01); + submit.setFeeUserType((byte) 0x00); + submit.setFeeTerminalId(""); + submit.setFeeTerminalType((byte) 0x00); + submit.setTpPId((byte) 0x00); + submit.setTpUdhi((byte) 0x01); + submit.setMsgFmt((byte) 0x04); + submit.setMsgSrc(MsgConfig.getSpId()); + submit.setSrcId(MsgConfig.getSpCode()); + submit.setDestTerminalId(cusMsisdn); + submit.setMsgLength((byte) msgLength); + byte[] sendMsg = new byte[wdp.length + needMsg.length]; + System.arraycopy(wdp, 0, sendMsg, 0, wdp.length); + System.arraycopy(needMsg, 0, sendMsg, wdp.length, + needMsg.length); + submit.setMsgContent(sendMsg); + dataList.add(submit.toByteArry()); + } + CmppSender sender = new CmppSender(getSocketDOS(), getSocketDIS(), + dataList); + sender.start(); + logger.info("鏁版嵁涔愬洯浜" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date()) + "鍚" + cusMsisdn + + "涓嬪彂web pus闀跨煭淇★紝搴忓垪鍙蜂负:" + seqId); + return true; + } catch (Exception e) { + try { + out.close(); + } catch (IOException e1) { + out = null; + } + logger.error("鍙戦亀eb push闀跨煭淇" + e.getMessage()); + return false; + } + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/msg/util/MsgUtils.java b/src/main/java/org/jeecgframework/web/sms/util/msg/util/MsgUtils.java new file mode 100644 index 00000000..f3f45ed5 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/msg/util/MsgUtils.java @@ -0,0 +1,180 @@ +package org.jeecgframework.web.sms.util.msg.util; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 鐭俊鎺ュ彛杈呭姪宸ュ叿绫. + * + * @author 寮犵浼 2011-08-22 15:03 + */ +public class MsgUtils { + private static int sequenceId = 0;// 搴忓垪缂栧彿 + + /** + * 搴忓垪 鑷. + * + * @return int + */ + public static int getSequence() { + ++sequenceId; + if (sequenceId > 255) { + sequenceId = 0; + } + return sequenceId; + } + + /** + * 鏃堕棿鎴崇殑鏄庢枃,鐢卞鎴风浜х敓,鏍煎紡涓篗MDDHHMMSS锛屽嵆鏈堟棩鏃跺垎绉掞紝10浣嶆暟瀛楃殑鏁村瀷锛屽彸瀵归綈 . + * + * @return String + */ + public static String getTimestamp() { + DateFormat format = new SimpleDateFormat("MMddHHmmss"); + return format.format(new Date()); + } + + /** + * . 鐢ㄤ簬閴村埆婧愬湴鍧銆傚叾鍊奸氳繃鍗曞悜MD5 hash璁$畻寰楀嚭锛岃〃绀哄涓嬶細 AuthenticatorSource = + * MD5锛圫ource_Addr+9 瀛楄妭鐨0 +shared secret+timestamp锛 Shared secret + * 鐢变腑鍥界Щ鍔ㄤ笌婧愬湴鍧瀹炰綋浜嬪厛鍟嗗畾锛宼imestamp鏍煎紡涓猴細MMDDHHMMSS锛屽嵆鏈堟棩鏃跺垎绉掞紝10浣嶃 + * @param spId String + * @param secret String + * @return byte[] + */ + public static byte[] getAuthenticatorSource(String spId, String secret) { + try { + MessageDigest md5 = MessageDigest.getInstance("MD5"); + byte[] data = (spId + "\0\0\0\0\0\0\0\0\0" + secret + MsgUtils + .getTimestamp()).getBytes(); + return md5.digest(data); + } catch (NoSuchAlgorithmException e) { + System.out.println("SP閾炬帴鍒癐SMG鎷兼帴AuthenticatorSource澶辫触锛" + + e.getMessage()); + return null; + } + } + + /** + * 鍚戞祦涓啓鍏ユ寚瀹氬瓧鑺傞暱搴︾殑瀛楃涓诧紝涓嶈冻鏃惰ˉ0. + * + * @param dous + * :瑕佸啓鍏ョ殑娴佸璞 + * @param s + * :瑕佸啓鍏ョ殑瀛楃涓 + * @param len + * :鍐欏叆闀垮害,涓嶈冻琛0 + */ + public static void writeString(DataOutputStream dous, String s, int len) { + + try { + byte[] data = s.getBytes("gb2312"); + if (data.length > len) { + System.out.println("鍚戞祦涓啓鍏ョ殑瀛楃涓茶秴闀匡紒瑕佸啓" + len + " 瀛楃涓叉槸:" + s); + } + int srcLen = data.length; + dous.write(data); + while (srcLen < len) { + dous.write('\0'); + srcLen++; + } + } catch (IOException e) { + System.out.println("鍚戞祦涓啓鍏ユ寚瀹氬瓧鑺傞暱搴︾殑瀛楃涓插け璐ワ細" + e.getMessage()); + } + } + + /** + * 浠庢祦涓鍙栨寚瀹氶暱搴︾殑瀛楄妭锛岃浆鎴愬瓧绗︿覆杩斿洖. + * + * @param ins + * :瑕佽鍙栫殑娴佸璞 + * @param len + * :瑕佽鍙栫殑瀛楃涓查暱搴 + * @return :璇诲彇鍒扮殑瀛楃涓 + */ + public static String readString(java.io.DataInputStream ins, int len) { + byte[] b = new byte[len]; + try { + ins.read(b); + String s = new String(b); + s = s.trim(); + return s; + } catch (IOException e) { + return ""; + } + } + + /** + * 鎴彇瀛楄妭. + * + * @param msg byte[] + * @param start int + * @param end int + * @return byte[] + */ + public static byte[] getMsgBytes(byte[] msg, int start, int end) { + byte[] msgByte = new byte[end - start]; + int j = 0; + for (int i = start; i < end; i++) { + msgByte[j] = msg[i]; + j++; + } + return msgByte; + } + + /** + * UCS2瑙g爜. + * + * @param src + * UCS2 婧愪覆 + * @return 瑙g爜鍚庣殑UTF-16BE瀛楃涓 + */ + public static String decodeUCS2(String src) { + byte[] bytes = new byte[src.length() / 2]; + for (int i = 0; i < src.length(); i += 2) { + bytes[i / 2] = (byte) (Integer + .parseInt(src.substring(i, i + 2), 16)); + } + String reValue = ""; + try { + reValue = new String(bytes, "UTF-16BE"); + } catch (UnsupportedEncodingException e) { + reValue = ""; + } + return reValue; + + } + + /** + * UCS2缂栫爜. + * + * @param src + * UTF-16BE缂栫爜鐨勬簮涓 + * @return 缂栫爜鍚庣殑UCS2涓 + */ + public static String encodeUCS2(String src) { + byte[] bytes; + try { + bytes = src.getBytes("UTF-16BE"); + } catch (UnsupportedEncodingException e) { + bytes = new byte[0]; + } + StringBuffer reValue = new StringBuffer(); + StringBuffer tem = new StringBuffer(); + for (int i = 0; i < bytes.length; i++) { + tem.delete(0, tem.length()); + tem.append(Integer.toHexString(bytes[i] & 0xFF)); + if (tem.length() == 1) { + tem.insert(0, '0'); + } + reValue.append(tem); + } + return reValue.toString().toUpperCase(); + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/task/SmsSendTask.java b/src/main/java/org/jeecgframework/web/sms/util/task/SmsSendTask.java new file mode 100644 index 00000000..90fa1f87 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/task/SmsSendTask.java @@ -0,0 +1,39 @@ +package org.jeecgframework.web.sms.util.task; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import org.jeecgframework.web.sms.service.TSSmsServiceI; + + + +/** + * + * @ClassName:SmsSendTask 鎵鏈変俊鎭殑鍙戦佸畾鏃朵换鍔$被 + * @Description: TODO + * @author Comsys-skyCc cmzcheng@gmail.com + * @date 2014-11-13 涓嬪崍5:06:34 + * + */ +@Service("smsSendTask") +public class SmsSendTask { + + @Autowired + private TSSmsServiceI tSSmsService; + + @Scheduled(cron="0 0/1 * * * ?") + public void run() { + long start = System.currentTimeMillis(); + org.jeecgframework.core.util.LogUtil.info("===================娑堟伅涓棿浠跺畾鏃朵换鍔″紑濮==================="); + try { + tSSmsService.send(); + } catch (Exception e) { + //e.printStackTrace(); + } + org.jeecgframework.core.util.LogUtil.info("===================娑堟伅涓棿浠跺畾鏃朵换鍔$粨鏉==================="); + long end = System.currentTimeMillis(); + long times = end - start; + org.jeecgframework.core.util.LogUtil.info("鎬昏楁椂"+times+"姣"); + } +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/task/SmsSendTaskJob.java b/src/main/java/org/jeecgframework/web/sms/util/task/SmsSendTaskJob.java new file mode 100644 index 00000000..6eb36c12 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/task/SmsSendTaskJob.java @@ -0,0 +1,5 @@ +package org.jeecgframework.web.sms.util.task; + +public class SmsSendTaskJob { + +} diff --git a/src/main/java/org/jeecgframework/web/sms/util/webservice/XmlConstant.java b/src/main/java/org/jeecgframework/web/sms/util/webservice/XmlConstant.java new file mode 100644 index 00000000..eae402b3 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/sms/util/webservice/XmlConstant.java @@ -0,0 +1,27 @@ +package org.jeecgframework.web.sms.util.webservice; +/** + * + * @author skycc + * @desc xml鎶ユ枃甯搁噺绫 + * + */ +public class XmlConstant { + + public static final String ACCOUNT=""; + public static final String PASSWORD=""; + + /** + * 鐭俊涓嬪彂鎺ュ彛 + */ +public static final String SMS_SEND="" + + "" + + "%s" + + "%s" + + "" + + "%s" + + "%s" + + "銆愮鍚嶅唴瀹广 "+//绛惧悕闇瑕佺敤鈥溿愩戔濇爣璁" + " "+ //鎵╁睍鍙风爜" + "%s//瀹氭椂涓嬪彂鏃堕棿" + + ""; +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/CategoryController.java b/src/main/java/org/jeecgframework/web/system/controller/core/CategoryController.java new file mode 100644 index 00000000..0645982d --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/CategoryController.java @@ -0,0 +1,248 @@ +package org.jeecgframework.web.system.controller.core; + +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.ComboTree; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.common.model.json.TreeGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.vo.easyui.ComboTreeModel; +import org.jeecgframework.tag.vo.easyui.TreeGridModel; +import org.jeecgframework.web.system.pojo.base.TSCategoryEntity; +import org.jeecgframework.web.system.pojo.base.TSIcon; +import org.jeecgframework.web.system.service.CategoryServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.util.MyBeanUtils; + +/** + * @Title: Controller + * @Description: 鍒嗙被绠$悊 + * @author JueYue + * @date 2014-09-16 21:50:55 + * @version V1.0 + * + */ +@Controller +@RequestMapping("/categoryController") +public class CategoryController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger + .getLogger(CategoryController.class); + + private static final String CATEGORY_LIST = "system/category/categoryList"; + private static final String CATEGORY_ADD_OR_UPDATE = "system/category/category"; + + @Autowired + private CategoryServiceI categoryService; + + @Autowired + private SystemService systemService; + + /** + * 鍒嗙被绠$悊鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "category") + public String category(HttpServletRequest request) { + return CATEGORY_LIST; + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @SuppressWarnings("unchecked") + @RequestMapping(params = "datagrid") + @ResponseBody + public List datagrid(TSCategoryEntity category, + HttpServletRequest request, HttpServletResponse response, + DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSCategoryEntity.class, dataGrid); + if (category.getId() == null || StringUtils.isEmpty(category.getId())) { + cq.isNull("parent"); + } else { + cq.eq("parent.code", category.getId()); + category.setId(null); + } + // 鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, + category, request.getParameterMap()); + List list = this.categoryService + .getListByCriteriaQuery(cq, false); + List treeGrids = new ArrayList(); + TreeGridModel treeGridModel = new TreeGridModel(); + treeGridModel.setIdField("code"); + treeGridModel.setSrc("id"); + treeGridModel.setTextField("name"); + treeGridModel.setIcon("icon_iconPath"); + treeGridModel.setParentText("parent_name"); + treeGridModel.setParentId("parent_code"); + treeGridModel.setChildList("list"); + treeGrids = systemService.treegrid(list, treeGridModel); + return treeGrids; + } + + /** + * 鍒犻櫎鍒嗙被绠$悊 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(TSCategoryEntity tSCategory, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + tSCategory = systemService.getEntity(TSCategoryEntity.class, + tSCategory.getId()); + j.setMsg("鍒嗙被绠$悊鍒犻櫎鎴愬姛"); + categoryService.delete(tSCategory); + systemService.addLog(j.getMsg(), Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + return j; + } + + /** + * 娣诲姞鍒嗙被绠$悊 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(TSCategoryEntity category, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(category.getId())) { + j.setMsg("鍒嗙被绠$悊鏇存柊鎴愬姛"); + TSCategoryEntity t = categoryService.get(TSCategoryEntity.class, + category.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(category, t); + categoryService.saveOrUpdate(t); + systemService.addLog(j.getMsg(), Globals.Log_Type_UPDATE, + Globals.Log_Leavel_INFO); + } catch (Exception e) { + logger.error(e.getMessage(), e.fillInStackTrace()); + j.setMsg("鍒嗙被绠$悊鏇存柊澶辫触"); + } + } else { + j.setMsg("鍒嗙被绠$悊娣诲姞鎴愬姛"); + categoryService.saveCategory(category); + systemService.addLog(j.getMsg(), Globals.Log_Type_INSERT, + Globals.Log_Leavel_INFO); + } + return j; + } + + /** + * 鍒嗙被绠$悊鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public String addorupdate(ModelMap map, TSCategoryEntity category) { + if (StringUtil.isNotEmpty(category.getCode())) { + category = categoryService.findUniqueByProperty(TSCategoryEntity.class, + "code",category.getCode()); + map.put("categoryPage", category); + } + map.put("iconlist", systemService.findByProperty(TSIcon.class, + "iconType", (short) 1)); + if (category.getParent() != null + && StringUtil.isNotEmpty(category.getParent().getCode())) { + TSCategoryEntity parent = categoryService.findUniqueByProperty(TSCategoryEntity.class, "code", category.getParent().getCode()); + category.setParent(parent); + map.put("categoryPage", category); + } + return CATEGORY_ADD_OR_UPDATE; + } + + @RequestMapping(params = "combotree") + @ResponseBody + public List combotree(String selfCode, ComboTree comboTree) { + CriteriaQuery cq = new CriteriaQuery(TSCategoryEntity.class); + if (StringUtils.isNotEmpty(comboTree.getId())) { + cq.createAlias("parent", "parent"); + cq.eq("parent.code", comboTree.getId()); + } else if (StringUtils.isNotEmpty(selfCode)) { + cq.eq("code", selfCode); + } else { + cq.isNull("parent"); + } + cq.add(); + List categoryList = systemService + .getListByCriteriaQuery(cq, false); + List comboTrees = new ArrayList(); + ComboTreeModel comboTreeModel = new ComboTreeModel("code", "name", "list"); + comboTrees = systemService.ComboTree(categoryList, comboTreeModel, + null, false); + MutiLangUtil.setMutiTree(comboTrees); + return comboTrees; + } + + /** + * 閴翠簬鏍戠殑闂,杩欓噷鑷繁鍔犺浇鍏ㄩ儴鏁版嵁鏉ュ仛鍚屾鏍 + * + * @param comboTree + * @return + */ + @RequestMapping(params = "tree") + @ResponseBody + public List tree(String selfCode,ComboTree comboTree, boolean isNew) { + CriteriaQuery cq = new CriteriaQuery(TSCategoryEntity.class); + if (StringUtils.isNotEmpty(comboTree.getId())) { + cq.createAlias("parent", "parent"); + cq.eq("parent.code", comboTree.getId()); + } else if (StringUtils.isNotEmpty(selfCode)) { + cq.eq("code", selfCode); + } else { + cq.isNull("parent"); + } + cq.add(); + List categoryList = systemService + .getListByCriteriaQuery(cq, false); + List comboTrees = new ArrayList(); + for (int i = 0; i < categoryList.size(); i++) { + comboTrees.add(categoryConvertToTree(categoryList.get(i))); + } + return comboTrees; + } + + private ComboTree categoryConvertToTree(TSCategoryEntity entity) { + ComboTree tree = new ComboTree(); + tree.setId(entity.getCode()); + tree.setText(entity.getName()); + tree.setIconCls(entity.getIcon().getIconClas()); + if (entity.getList() != null && entity.getList().size() > 0) { + List comboTrees = new ArrayList(); + for (int i = 0; i < entity.getList().size(); i++) { + comboTrees.add(categoryConvertToTree(entity.getList().get( + i))); + } + tree.setChildren(comboTrees); + } + return tree; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/CommonController.java b/src/main/java/org/jeecgframework/web/system/controller/core/CommonController.java new file mode 100644 index 00000000..bee73726 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/CommonController.java @@ -0,0 +1,307 @@ +package org.jeecgframework.web.system.controller.core; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.web.system.pojo.base.TSAttachment; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.common.UploadFile; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.common.model.json.ImportFile; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.FileUtils; +import org.jeecgframework.core.util.ImportUtil; +import org.jeecgframework.core.util.JSONHelper; +import org.jeecgframework.core.util.MyClassLoader; +import org.jeecgframework.core.util.ReflectHelper; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.tag.vo.easyui.Autocomplete; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + + +/** + * 閫氱敤涓氬姟澶勭悊 + * + * @author 寮犱唬娴 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/commonController") +public class CommonController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(CommonController.class); + private SystemService systemService; + private String message; + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + /** + * 閫氱敤鍒楄〃椤甸潰璺宠浆 + */ + @RequestMapping(params = "listTurn") + public ModelAndView listTurn(HttpServletRequest request) { + String turn = request.getParameter("turn");// 璺宠浆鐨勭洰鏍囬〉闈 + return new ModelAndView(turn); + } + + /** + * 闄勪欢棰勮椤甸潰鎵撳紑閾炬帴 + * + * @return + */ + @RequestMapping(params = "openViewFile") + public ModelAndView openViewFile(HttpServletRequest request) { + String fileid = request.getParameter("fileid"); + String subclassname = oConvertUtils.getString(request.getParameter("subclassname"), "org.jeecgframework.web.system.pojo.base.TSAttachment"); + String contentfield = oConvertUtils.getString(request.getParameter("contentfield")); + Class fileClass = MyClassLoader.getClassByScn(subclassname);// 闄勪欢鐨勫疄闄呯被 + Object fileobj = systemService.getEntity(fileClass, fileid); + ReflectHelper reflectHelper = new ReflectHelper(fileobj); + String extend = oConvertUtils.getString(reflectHelper.getMethodValue("extend")); + if ("dwg".equals(extend)) { + String realpath = oConvertUtils.getString(reflectHelper.getMethodValue("realpath")); + request.setAttribute("realpath", realpath); + return new ModelAndView("common/upload/dwgView"); + } else if (FileUtils.isPicture(extend)) { + String realpath = oConvertUtils.getString(reflectHelper.getMethodValue("realpath")); + request.setAttribute("realpath", realpath); + request.setAttribute("fileid", fileid); + request.setAttribute("subclassname", subclassname); + request.setAttribute("contentfield", contentfield); + return new ModelAndView("common/upload/imageView"); + } else { + String swfpath = oConvertUtils.getString(reflectHelper.getMethodValue("swfpath")); + request.setAttribute("swfpath", swfpath); + return new ModelAndView("common/upload/swfView"); + } + + } + + /** + * 闄勪欢棰勮璇诲彇 + * + * @return + */ + @RequestMapping(params = "viewFile") + public void viewFile(HttpServletRequest request, HttpServletResponse response) { + String fileid =oConvertUtils.getString(request.getParameter("fileid")); + String subclassname = oConvertUtils.getString(request.getParameter("subclassname"), "com.jeecg.base.pojo.TSAttachment"); + Class fileClass = MyClassLoader.getClassByScn(subclassname);// 闄勪欢鐨勫疄闄呯被 + Object fileobj = systemService.getEntity(fileClass, fileid); + ReflectHelper reflectHelper = new ReflectHelper(fileobj); + UploadFile uploadFile = new UploadFile(request, response); + String contentfield = oConvertUtils.getString(request.getParameter("contentfield"), uploadFile.getByteField()); + byte[] content = (byte[]) reflectHelper.getMethodValue(contentfield); + String path = oConvertUtils.getString(reflectHelper.getMethodValue("realpath")); + String extend = oConvertUtils.getString(reflectHelper.getMethodValue("extend")); + String attachmenttitle = oConvertUtils.getString(reflectHelper.getMethodValue("attachmenttitle")); + uploadFile.setExtend(extend); + uploadFile.setTitleField(attachmenttitle); + uploadFile.setRealPath(path); + uploadFile.setContent(content); + //uploadFile.setView(true); + systemService.viewOrDownloadFile(uploadFile); + } + + @RequestMapping(params = "importdata") + public ModelAndView importdata() { + return new ModelAndView("system/upload"); + } + + /** + * 鐢熸垚XML鏂囦欢 + * + * @return + */ + @RequestMapping(params = "createxml") + public void createxml(HttpServletRequest request, HttpServletResponse response) { + String field = request.getParameter("field"); + String entityname = request.getParameter("entityname"); + ImportFile importFile = new ImportFile(request, response); + importFile.setField(field); + importFile.setEntityName(entityname); + importFile.setFileName(entityname + ".bak"); + importFile.setEntityClass(MyClassLoader.getClassByScn(entityname)); + systemService.createXml(importFile); + } + + /** + * 鐢熸垚XML鏂囦欢parserXml + * + * @return + */ + @RequestMapping(params = "parserXml") + @ResponseBody + public AjaxJson parserXml(HttpServletRequest request, HttpServletResponse response) { + AjaxJson json = new AjaxJson(); + String fileName = null; + UploadFile uploadFile = new UploadFile(request); + String ctxPath = request.getSession().getServletContext().getRealPath(""); + File file = new File(ctxPath); + if (!file.exists()) { + file.mkdir();// 鍒涘缓鏂囦欢鏍圭洰褰 + } + MultipartHttpServletRequest multipartRequest = uploadFile.getMultipartRequest(); + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile mf = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 + fileName = mf.getOriginalFilename();// 鑾峰彇鏂囦欢鍚 + String savePath = file.getPath() + "/" + fileName; + File savefile = new File(savePath); + try { + FileCopyUtils.copy(mf.getBytes(), savefile); + } catch (IOException e) { + e.printStackTrace(); + } + } + systemService.parserXml(ctxPath + "/" + fileName); + json.setSuccess(true); + return json; + } + + /** + * 鑷姩瀹屾垚璇锋眰杩斿洖鏁版嵁 + * + * @param request + * @param responss + */ + @RequestMapping(params = "getAutoList") + public void getAutoList(HttpServletRequest request, HttpServletResponse response, Autocomplete autocomplete) { + String jsonp = request.getParameter("jsonpcallback"); + String trem = StringUtil.getEncodePra(request.getParameter("trem"));// 閲嶆柊瑙f瀽鍙傛暟 + autocomplete.setTrem(trem); + List autoList = systemService.getAutoList(autocomplete); + String labelFields = autocomplete.getLabelField(); + String[] fieldArr = labelFields.split(","); + String valueField = autocomplete.getValueField(); + String[] allFieldArr = null; + if (StringUtil.isNotEmpty(valueField)) { + allFieldArr = new String[fieldArr.length+1]; + for (int i=0; i + * 缁勭粐鏈烘瀯涓嬪瓨鍦ㄥ瓙鏈烘瀯鏃 + *
  • 涓嶅厑璁稿垹闄 缁勭粐鏈烘瀯
  • + * + *
      + * 缁勭粐鏈烘瀯涓嬪瓨鍦ㄧ敤鎴锋椂 + *
    • 涓嶅厑璁稿垹闄 缁勭粐鏈烘瀯
    • + *
    + *
      + * 缁勭粐鏈烘瀯涓 涓嶅瓨鍦ㄥ瓙鏈烘瀯 涓 涓嶅瓨鍦ㄧ敤鎴锋椂 + *
    • 鍒犻櫎 缁勭粐鏈烘瀯-瑙掕壊 淇℃伅
    • + *
    • 鍒犻櫎 缁勭粐鏈烘瀯 淇℃伅
    • + *
    + * @return 鍒犻櫎鐨勭粨鏋滀俊鎭 + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(TSDepart depart, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + depart = systemService.getEntity(TSDepart.class, depart.getId()); + message = MutiLangUtil.paramDelSuccess("common.department"); + if (depart.getTSDeparts().size() == 0) { + Long userCount = systemService.getCountForJdbc("select count(1) from t_s_user_org where org_id='" + depart.getId() + "'"); + if(userCount == 0) { // 缁勭粐鏈烘瀯涓嬫病鏈夌敤鎴锋椂锛岃缁勭粐鏈烘瀯鎵嶅厑璁稿垹闄ゃ + systemService.executeSql("delete from t_s_role_org where org_id=?", depart.getId()); + systemService.delete(depart); + + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + } + } else { + message = MutiLangUtil.paramDelFail("common.department"); + } + + j.setMsg(message); + return j; + } + + public void upEntity(TSDepart depart) { + List users = systemService.findByProperty(TSUser.class, "TSDepart.id", depart.getId()); + if (users.size() > 0) { + for (TSUser tsUser : users) { + //tsUser.setTSDepart(null); + //systemService.saveOrUpdate(tsUser); + systemService.delete(tsUser); + } + } + } + + /** + * 娣诲姞閮ㄩ棬 + * + * @param depart + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(TSDepart depart, HttpServletRequest request) { + // 璁剧疆涓婄骇閮ㄩ棬 + String pid = request.getParameter("TSPDepart.id"); + if (pid.equals("")) { + depart.setTSPDepart(null); + } + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(depart.getId())) { + message = MutiLangUtil.paramUpdSuccess("common.department"); + userService.saveOrUpdate(depart); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } else { + message = MutiLangUtil.paramAddSuccess("common.department"); + userService.save(depart); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + + j.setMsg(message); + return j; + } + @RequestMapping(params = "add") + public ModelAndView add(TSDepart depart, HttpServletRequest req) { + List departList = systemService.getList(TSDepart.class); + req.setAttribute("departList", departList); +// 杩欎釜if浠g爜娈垫病鏈夌敤鍚э紝娉ㄩ噴涔 +// if (StringUtil.isNotEmpty(depart.getId())) { +// TSDepart tspDepart = new TSDepart(); +// TSDepart tsDepart = new TSDepart(); +// depart = systemService.getEntity(TSDepart.class, depart.getId()); +// tspDepart.setId(depart.getId()); +// tspDepart.setDepartname(depart.getDepartname()); +// tsDepart.setTSPDepart(tspDepart); +// req.setAttribute("depart", tsDepart); +// } + req.setAttribute("pid", depart.getId()); + return new ModelAndView("system/depart/depart"); + } + /** + * 閮ㄩ棬鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "update") + public ModelAndView update(TSDepart depart, HttpServletRequest req) { + List departList = systemService.getList(TSDepart.class); + req.setAttribute("departList", departList); + if (StringUtil.isNotEmpty(depart.getId())) { + depart = systemService.getEntity(TSDepart.class, depart.getId()); + req.setAttribute("depart", depart); + } + return new ModelAndView("system/depart/depart"); + } + + /** + * 鐖剁骇鏉冮檺鍒楄〃 + * + * @param request + * @param comboTree + * @return + */ + @RequestMapping(params = "setPFunction") + @ResponseBody + public List setPFunction(HttpServletRequest request, ComboTree comboTree) { + CriteriaQuery cq = new CriteriaQuery(TSDepart.class); + if(null != request.getParameter("selfId")){ + cq.notEq("id", request.getParameter("selfId")); + } + if (comboTree.getId() != null) { + cq.eq("TSPDepart.id", comboTree.getId()); + } + if (comboTree.getId() == null) { + cq.isNull("TSPDepart"); + } + cq.add(); + List departsList = systemService.getListByCriteriaQuery(cq, false); + List comboTrees = new ArrayList(); + ComboTreeModel comboTreeModel = new ComboTreeModel("id", "departname", "TSDeparts"); + comboTrees = systemService.ComboTree(departsList, comboTreeModel, null, true); + return comboTrees; + + } + /** + * 閮ㄩ棬鍒楄〃锛屾爲褰㈠睍绀 + * @param request + * @param response + * @param treegrid + * @return + */ + @RequestMapping(params = "departgrid") + @ResponseBody + public Object departgrid(TSDepart tSDepart,HttpServletRequest request, HttpServletResponse response, TreeGrid treegrid) { + CriteriaQuery cq = new CriteriaQuery(TSDepart.class); + if("yes".equals(request.getParameter("isSearch"))){ + treegrid.setId(null); + tSDepart.setId(null); + } + if(null != tSDepart.getDepartname()){ + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, tSDepart); + } + if (treegrid.getId() != null) { + cq.eq("TSPDepart.id", treegrid.getId()); + } + if (treegrid.getId() == null) { + cq.isNull("TSPDepart"); + } + cq.add(); + List departList =null; + departList=systemService.getListByCriteriaQuery(cq, false); + if(departList.size()==0&&tSDepart.getDepartname()!=null){ + cq = new CriteriaQuery(TSDepart.class); + TSDepart parDepart = new TSDepart(); + tSDepart.setTSPDepart(parDepart); + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, tSDepart); + departList =systemService.getListByCriteriaQuery(cq, false); + } + List treeGrids = new ArrayList(); + TreeGridModel treeGridModel = new TreeGridModel(); + treeGridModel.setTextField("departname"); + treeGridModel.setParentText("TSPDepart_departname"); + treeGridModel.setParentId("TSPDepart_id"); + treeGridModel.setSrc("description"); + treeGridModel.setIdField("id"); + treeGridModel.setChildList("TSDeparts"); + Map fieldMap = new HashMap(); + fieldMap.put("orgCode", "orgCode"); + fieldMap.put("orgType", "orgType"); + treeGridModel.setFieldMap(fieldMap); + treeGrids = systemService.treegrid(departList, treeGridModel); + + JSONArray jsonArray = new JSONArray(); + for (TreeGrid treeGrid : treeGrids) { + jsonArray.add(JSON.parse(treeGrid.toJson())); + } + return jsonArray; + } + //---- + /** + * 鏂规硶鎻忚堪: 鏌ョ湅鎴愬憳鍒楄〃 + * 浣 鑰咃細 yiming.zhang + * 鏃 鏈燂細 Dec 4, 2013-8:53:39 PM + * @param request + * @param departid + * @return + * 杩斿洖绫诲瀷锛 ModelAndView + */ + @RequestMapping(params = "userList") + public ModelAndView userList(HttpServletRequest request, String departid) { + request.setAttribute("departid", departid); + return new ModelAndView("system/depart/departUserList"); + } + + /** + * 鏂规硶鎻忚堪: 鎴愬憳鍒楄〃dataGrid + * 浣 鑰咃細 yiming.zhang + * 鏃 鏈燂細 Dec 4, 2013-10:40:17 PM + * @param user + * @param request + * @param response + * @param dataGrid + * 杩斿洖绫诲瀷锛 void + */ + @RequestMapping(params = "userDatagrid") + public void userDatagrid(TSUser user,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSUser.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, user); + String departid = oConvertUtils.getString(request.getParameter("departid")); + if (!StringUtil.isEmpty(departid)) { + DetachedCriteria dc = cq.getDetachedCriteria(); + DetachedCriteria dcDepart = dc.createCriteria("userOrgList"); + dcDepart.add(Restrictions.eq("tsDepart.id", departid)); + // 杩欑鏂瑰紡涔熸槸鍙互鐨 +// DetachedCriteria dcDepart = dc.createAlias("userOrgList", "userOrg"); +// dcDepart.add(Restrictions.eq("userOrg.tsDepart.id", departid)); + } + Short[] userstate = new Short[] { Globals.User_Normal, Globals.User_ADMIN }; + cq.in("status", userstate); + cq.add(); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + //---- + /** + * 鑾峰彇鏈烘瀯鏍-combotree + * @param request + * @return + */ + @RequestMapping(params = "getOrgTree") + @ResponseBody + public List getOrgTree(HttpServletRequest request) { +// findHql涓嶈兘澶勭悊is null鏉′欢 +// List departsList = systemService.findHql("from TSPDepart where TSPDepart.id is null"); + List departsList = systemService.findByQueryString("from TSDepart where TSPDepart.id is null"); + List comboTrees = new ArrayList(); + ComboTreeModel comboTreeModel = new ComboTreeModel("id", "departname", "TSDeparts"); + comboTrees = systemService.ComboTree(departsList, comboTreeModel, null, true); + return comboTrees; + } + /** + * 娣诲姞 鐢ㄦ埛鍒扮粍缁囨満鏋 鐨勯〉闈 璺宠浆 + * @param req request + * @return 澶勭悊缁撴灉淇℃伅 + */ + @RequestMapping(params = "goAddUserToOrg") + public ModelAndView goAddUserToOrg(HttpServletRequest req) { + req.setAttribute("orgId", req.getParameter("orgId")); + return new ModelAndView("system/depart/noCurDepartUserList"); + } + /** + * 鑾峰彇 闄ゅ綋鍓 缁勭粐涔嬪鐨勭敤鎴蜂俊鎭垪琛 + * @param request request + * @return 澶勭悊缁撴灉淇℃伅 + */ + @RequestMapping(params = "addUserToOrgList") + public void addUserToOrgList(TSUser user, HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + String orgId = request.getParameter("orgId"); + + CriteriaQuery cq = new CriteriaQuery(TSUser.class, dataGrid); + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, user); + + // 鑾峰彇 褰撳墠缁勭粐鏈烘瀯鐨勭敤鎴蜂俊鎭 + CriteriaQuery subCq = new CriteriaQuery(TSUserOrg.class); + subCq.setProjection(Property.forName("tsUser.id")); + subCq.eq("tsDepart.id", orgId); + subCq.add(); + + cq.add(Property.forName("id").notIn(subCq.getDetachedCriteria())); + cq.add(); + + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + /** + * 娣诲姞 鐢ㄦ埛鍒扮粍缁囨満鏋 + * @param req request + * @return 澶勭悊缁撴灉淇℃伅 + */ + @RequestMapping(params = "doAddUserToOrg") + @ResponseBody + public AjaxJson doAddUserToOrg(HttpServletRequest req) { + AjaxJson j = new AjaxJson(); + TSDepart depart = systemService.getEntity(TSDepart.class, req.getParameter("orgId")); + saveOrgUserList(req, depart); + message = MutiLangUtil.paramAddSuccess("common.user"); +// systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + j.setMsg(message); + + return j; + } + /** + * 淇濆瓨 缁勭粐鏈烘瀯-鐢ㄦ埛 鍏崇郴淇℃伅 + * @param request request + * @param depart depart + */ + private void saveOrgUserList(HttpServletRequest request, TSDepart depart) { + String orgIds = oConvertUtils.getString(request.getParameter("userIds")); + + List userOrgList = new ArrayList(); + List userIdList = extractIdListByComma(orgIds); + for (String userId : userIdList) { + TSUser user = new TSUser(); + user.setId(userId); + + TSUserOrg userOrg = new TSUserOrg(); + userOrg.setTsUser(user); + userOrg.setTsDepart(depart); + + userOrgList.add(userOrg); + } + if (!userOrgList.isEmpty()) { + systemService.batchSave(userOrgList); + } + } + /** + * 鐢ㄦ埛閫夋嫨鏈烘瀯鍒楄〃璺宠浆椤甸潰 + * + * @return + */ + @RequestMapping(params = "departSelect") + public String departSelect() { + return "system/depart/departSelect"; + } + /** + * 瑙掕壊鏄剧ず鍒楄〃 + * + * @param response response + * @param dataGrid dataGrid + */ + @RequestMapping(params = "departSelectDataGrid") + public void datagridRole(HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSDepart.class, dataGrid); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/DuplicateCheckAction.java b/src/main/java/org/jeecgframework/web/system/controller/core/DuplicateCheckAction.java new file mode 100644 index 00000000..9b904ddf --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/DuplicateCheckAction.java @@ -0,0 +1,67 @@ +package org.jeecgframework.web.system.controller.core; + +import javax.servlet.http.HttpServletRequest; +import org.jeecgframework.web.system.pojo.base.DuplicateCheckPage; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.dao.jdbc.JdbcDao; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + + +/** + * @Title: Action + * @Description: 鏍¢獙宸ュ叿Action + * @author 寮犱唬娴 + * @date 2013-09-12 22:27:30 + * @version V1.0 + */ +@Controller +@RequestMapping("/duplicateCheckAction") +public class DuplicateCheckAction extends BaseController { + + private static final Logger logger = Logger.getLogger(DuplicateCheckAction.class); + + @Autowired + //SQL 浣跨敤JdbcDao + private JdbcDao jdbcDao; + + /** + * 鏍¢獙鏁版嵁鏄惁鍦ㄧ郴缁熶腑鏄惁瀛樺湪 + * @return + */ + @RequestMapping(params = "doDuplicateCheck") + @ResponseBody + public AjaxJson doDuplicateCheck(DuplicateCheckPage duplicateCheckPage, HttpServletRequest request) { + + AjaxJson j = new AjaxJson(); + Long num = null; + + if(StringUtils.isNotBlank(duplicateCheckPage.getRowObid())){ + //[2].缂栬緫椤甸潰鏍¢獙 + String sql = "SELECT count(*) FROM "+duplicateCheckPage.getTableName() + +" WHERE "+duplicateCheckPage.getFieldName() +" =? and id != ?"; + num = jdbcDao.getCountForJdbcParam(sql, new Object[]{duplicateCheckPage.getFieldVlaue(),duplicateCheckPage.getRowObid()}); + }else{ + //[1].娣诲姞椤甸潰鏍¢獙 + String sql = "SELECT count(*) FROM "+duplicateCheckPage.getTableName() + +" WHERE "+duplicateCheckPage.getFieldName() +" =?"; + num = jdbcDao.getCountForJdbcParam(sql, new Object[]{duplicateCheckPage.getFieldVlaue()}); + } + + if(num==null||num==0){ + //璇ュ煎彲鐢 + j.setSuccess(true); + j.setMsg("璇ュ煎彲鐢紒"); + }else{ + //璇ュ间笉鍙敤 + j.setSuccess(false); + j.setMsg("璇ュ间笉鍙敤锛岀郴缁熶腑宸插瓨鍦紒"); + } + return j; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/DynamicDataSourceController.java b/src/main/java/org/jeecgframework/web/system/controller/core/DynamicDataSourceController.java new file mode 100644 index 00000000..dbbba184 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/DynamicDataSourceController.java @@ -0,0 +1,151 @@ +package org.jeecgframework.web.system.controller.core; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.pojo.base.DynamicDataSourceEntity; +import org.jeecgframework.web.system.service.DynamicDataSourceServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.util.MyBeanUtils; + +/** + * @Title: Controller + * @Description: 鏁版嵁婧愰厤缃 + * @author zhangdaihao + * @date 2014-09-05 13:22:10 + * @version V1.0 + * + */ +@Controller +@RequestMapping("/dynamicDataSourceController") +public class DynamicDataSourceController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(DynamicDataSourceController.class); + + @Autowired + private DynamicDataSourceServiceI dynamicDataSourceService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 鏁版嵁婧愰厤缃垪琛 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "dbSource") + public ModelAndView dbSource(HttpServletRequest request) { + return new ModelAndView("system/dbsource/dbSourceList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(DynamicDataSourceEntity dbSource,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(DynamicDataSourceEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, dbSource, request.getParameterMap()); + this.dynamicDataSourceService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + + } + + /** + * 鍒犻櫎鏁版嵁婧愰厤缃 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(DynamicDataSourceEntity dbSource, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + dbSource = systemService.getEntity(DynamicDataSourceEntity.class, dbSource.getId()); + + message = MutiLangUtil.paramDelSuccess("common.datasource.manage"); + + dynamicDataSourceService.delete(dbSource); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞鏁版嵁婧愰厤缃 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(DynamicDataSourceEntity dbSource, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(dbSource.getId())) { + message = MutiLangUtil.paramUpdSuccess("common.datasource.manage"); + DynamicDataSourceEntity t = dynamicDataSourceService.get(DynamicDataSourceEntity.class, dbSource.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(dbSource, t); + dynamicDataSourceService.saveOrUpdate(t); + dynamicDataSourceService.refleshCache(); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + message = MutiLangUtil.paramUpdFail("common.datasource.manage"); + } + } else { + message = MutiLangUtil.paramAddSuccess("common.datasource.manage"); + + dynamicDataSourceService.save(dbSource); + dynamicDataSourceService.refleshCache(); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + + /** + * 鏁版嵁婧愰厤缃垪琛ㄩ〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(DynamicDataSourceEntity dbSource, HttpServletRequest req) { + if (StringUtil.isNotEmpty(dbSource.getId())) { + dbSource = dynamicDataSourceService.getEntity(DynamicDataSourceEntity.class, dbSource.getId()); + req.setAttribute("dbSourcePage", dbSource); + } + return new ModelAndView("system/dbsource/dbSource"); + } +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/FunctionController.java b/src/main/java/org/jeecgframework/web/system/controller/core/FunctionController.java new file mode 100644 index 00000000..57cecfd7 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/FunctionController.java @@ -0,0 +1,653 @@ +package org.jeecgframework.web.system.controller.core; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.ComboTree; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.common.model.json.TreeGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.core.util.NumberComparator; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.tag.vo.datatable.SortDirection; +import org.jeecgframework.tag.vo.easyui.ComboTreeModel; +import org.jeecgframework.tag.vo.easyui.TreeGridModel; +import org.jeecgframework.web.system.pojo.base.TSDataRule; +import org.jeecgframework.web.system.pojo.base.TSFunction; +import org.jeecgframework.web.system.pojo.base.TSIcon; +import org.jeecgframework.web.system.pojo.base.TSOperation; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.web.system.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * 鑿滃崟鏉冮檺澶勭悊绫 + * + * @author 寮犱唬娴 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/functionController") +public class FunctionController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger + .getLogger(FunctionController.class); + private UserService userService; + private SystemService systemService; + private String message = null; + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + public UserService getUserService() { + return userService; + + } + + @Autowired + public void setUserService(UserService userService) { + this.userService = userService; + } + + /** + * 鏉冮檺鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "function") + public ModelAndView function() { + return new ModelAndView("system/function/functionList"); + } + + /** + * 鎿嶄綔鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "operation") + public ModelAndView operation(HttpServletRequest request, String functionId) { + request.setAttribute("functionId", functionId); + return new ModelAndView("system/operation/operationList"); + } + + /** + * 鏁版嵁瑙勫垯鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "dataRule") + public ModelAndView operationData(HttpServletRequest request, + String functionId) { + request.setAttribute("functionId", functionId); + return new ModelAndView("system/dataRule/ruleDataList"); + } + + /** + * easyuiAJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + */ + + @RequestMapping(params = "datagrid") + public void datagrid(HttpServletRequest request, + HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSFunction.class, dataGrid); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * easyuiAJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + */ + + @RequestMapping(params = "opdategrid") + public void opdategrid(HttpServletRequest request, + HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSOperation.class, dataGrid); + String functionId = oConvertUtils.getString(request + .getParameter("functionId")); + cq.eq("TSFunction.id", functionId); + cq.add(); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎鏉冮檺 + * + * @param function + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(TSFunction function, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + function = systemService.getEntity(TSFunction.class, function.getId()); + message = MutiLangUtil.paramDelSuccess("common.menu"); + systemService + .updateBySqlString("delete from t_s_role_function where functionid='" + + function.getId() + "'"); + try{ + systemService.delete(function); + }catch (Exception e){ + e.printStackTrace(); + message=MutiLangUtil.getMutiLangInstance().getLang("common.menu.del.fail"); + } + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + + // // 鍒犻櫎鏉冮檺鏃跺厛鍒犻櫎鏉冮檺涓庤鑹蹭箣闂村叧鑱旇〃淇℃伅 + // List roleFunctions = + // systemService.findByProperty(TSRoleFunction.class, "TSFunction.id", + // function.getId()); + // + // if (roleFunctions.size() > 0) { + // j.setMsg("鑿滃崟宸插垎閰嶆棤娉曞垹闄"); + // + // } + // else { + // userService.delete(function); + // systemService.addLog(message, Globals.Log_Type_DEL, + // Globals.Log_Leavel_INFO); + // } + + j.setMsg(message); + return j; + } + + /** + * 鍒犻櫎鎿嶄綔 + * + * @param operation + * @return + */ + @RequestMapping(params = "delop") + @ResponseBody + public AjaxJson delop(TSOperation operation, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + operation = systemService.getEntity(TSOperation.class, + operation.getId()); + message = MutiLangUtil.paramDelSuccess("common.operation"); + userService.delete(operation); + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + + j.setMsg(message); + + return j; + } + + /** + * 閫掑綊鏇存柊瀛愯彍鍗曠殑FunctionLevel + * @param subFunction + * @param parent + */ + private void updateSubFunction(List subFunction,TSFunction parent) { + if(subFunction.size() ==0){//娌℃湁瀛愯彍鍗曟槸缁撴潫 + return; + }else{ + for (TSFunction tsFunction : subFunction) { + tsFunction.setFunctionLevel(Short.valueOf(parent.getFunctionLevel() + + 1 + "")); + systemService.saveOrUpdate(tsFunction); + List subFunction1 = systemService.findByProperty(TSFunction.class, "TSFunction.id", tsFunction.getId()); + updateSubFunction(subFunction1,tsFunction); + } + } + } + + /** + * 鏉冮檺褰曞叆 + * + * @param function + * @return + */ + @RequestMapping(params = "saveFunction") + @ResponseBody + public AjaxJson saveFunction(TSFunction function, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + function.setFunctionUrl(function.getFunctionUrl().trim()); + String functionOrder = function.getFunctionOrder(); + if (StringUtils.isEmpty(functionOrder)) { + function.setFunctionOrder("0"); + } + if (function.getTSFunction().getId().equals("")) { + function.setTSFunction(null); + } else { + TSFunction parent = systemService.getEntity(TSFunction.class, + function.getTSFunction().getId()); + function.setFunctionLevel(Short.valueOf(parent.getFunctionLevel() + + 1 + "")); + } + if (StringUtil.isNotEmpty(function.getId())) { + message = MutiLangUtil.paramUpdSuccess("common.menu"); + userService.saveOrUpdate(function); + systemService.addLog(message, Globals.Log_Type_UPDATE, + Globals.Log_Leavel_INFO); + List subFunction = systemService.findByProperty(TSFunction.class, "TSFunction.id", function.getId()); + updateSubFunction(subFunction,function); + + systemService.flushRoleFunciton(function.getId(), function); + + } else { + if (function.getFunctionLevel().equals(Globals.Function_Leave_ONE)) { + List functionList = systemService.findByProperty( + TSFunction.class, "functionLevel", + Globals.Function_Leave_ONE); + // int ordre=functionList.size()+1; + // function.setFunctionOrder(Globals.Function_Order_ONE+ordre); + function.setFunctionOrder(function.getFunctionOrder()); + } else { + List functionList = systemService.findByProperty( + TSFunction.class, "functionLevel", + Globals.Function_Leave_TWO); + // int ordre=functionList.size()+1; + // function.setFunctionOrder(Globals.Function_Order_TWO+ordre); + function.setFunctionOrder(function.getFunctionOrder()); + } + message = MutiLangUtil.paramAddSuccess("common.menu"); + systemService.save(function); + systemService.addLog(message, Globals.Log_Type_INSERT, + Globals.Log_Leavel_INFO); + } + + j.setMsg(message); + return j; + } + + /** + * 鎿嶄綔褰曞叆 + * + * @param operation + * @return + */ + @RequestMapping(params = "saveop") + @ResponseBody + public AjaxJson saveop(TSOperation operation, HttpServletRequest request) { + String pid = request.getParameter("TSFunction.id"); + if (pid.equals("")) { + operation.setTSFunction(null); + } + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(operation.getId())) { + message = MutiLangUtil.paramUpdSuccess("common.operation"); + userService.saveOrUpdate(operation); + systemService.addLog(message, Globals.Log_Type_UPDATE, + Globals.Log_Leavel_INFO); + } else { + message = MutiLangUtil.paramAddSuccess("common.operation"); + userService.save(operation); + systemService.addLog(message, Globals.Log_Type_INSERT, + Globals.Log_Leavel_INFO); + } + + j.setMsg(message); + return j; + } + + /** + * 鏉冮檺鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(TSFunction function, HttpServletRequest req) { + String functionid = req.getParameter("id"); + List fuinctionlist = systemService + .getList(TSFunction.class); + req.setAttribute("flist", fuinctionlist); + // List iconlist = systemService.getList(TSIcon.class); + List iconlist = systemService + .findByQueryString("from TSIcon where iconType != 3"); + req.setAttribute("iconlist", iconlist); + List iconDeskList = systemService + .findByQueryString("from TSIcon where iconType = 3"); + req.setAttribute("iconDeskList", iconDeskList); + if (functionid != null) { + function = systemService.getEntity(TSFunction.class, functionid); + req.setAttribute("function", function); + } + if (function.getTSFunction() != null + && function.getTSFunction().getId() != null) { + function.setFunctionLevel((short) 1); + function.setTSFunction((TSFunction) systemService.getEntity( + TSFunction.class, function.getTSFunction().getId())); + req.setAttribute("function", function); + } + return new ModelAndView("system/function/function"); + } + + /** + * 鎿嶄綔鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdateop") + public ModelAndView addorupdateop(TSOperation operation, + HttpServletRequest req) { + List iconlist = systemService.getList(TSIcon.class); + req.setAttribute("iconlist", iconlist); + if (operation.getId() != null) { + operation = systemService.getEntity(TSOperation.class, + operation.getId()); + req.setAttribute("operation", operation); + } + String functionId = oConvertUtils.getString(req + .getParameter("functionId")); + req.setAttribute("functionId", functionId); + return new ModelAndView("system/operation/operation"); + } + + /** + * 鏉冮檺鍒楄〃 + */ + @RequestMapping(params = "functionGrid") + @ResponseBody + public List functionGrid(HttpServletRequest request, + TreeGrid treegrid) { + CriteriaQuery cq = new CriteriaQuery(TSFunction.class); + String selfId = request.getParameter("selfId"); + if (selfId != null) { + cq.notEq("id", selfId); + } + if (treegrid.getId() != null) { + cq.eq("TSFunction.id", treegrid.getId()); + } + if (treegrid.getId() == null) { + cq.isNull("TSFunction"); + } + cq.addOrder("functionOrder", SortDirection.asc); + cq.add(); + List functionList = systemService.getListByCriteriaQuery(cq, false); + Collections.sort(functionList, new NumberComparator()); + List treeGrids = new ArrayList(); + TreeGridModel treeGridModel = new TreeGridModel(); + treeGridModel.setIcon("TSIcon_iconPath"); + treeGridModel.setTextField("functionName"); + treeGridModel.setParentText("TSFunction_functionName"); + treeGridModel.setParentId("TSFunction_id"); + treeGridModel.setSrc("functionUrl"); + treeGridModel.setIdField("id"); + treeGridModel.setChildList("TSFunctions"); + // 娣诲姞鎺掑簭瀛楁 + treeGridModel.setOrder("functionOrder"); + + treeGridModel.setFunctionType("functionType"); + + treeGrids = systemService.treegrid(functionList, treeGridModel); + + MutiLangUtil.setMutiTree(treeGrids); + return treeGrids; + } + + /** + * 鏉冮檺鍒楄〃 + */ + @RequestMapping(params = "functionList") + @ResponseBody + public void functionList(HttpServletRequest request, + HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSFunction.class, dataGrid); + String id = oConvertUtils.getString(request.getParameter("id")); + cq.isNull("TSFunction"); + if (id != null) { + cq.eq("TSFunction.id", id); + } + cq.add(); + List functionList = systemService.getListByCriteriaQuery( + cq, false); + List treeGrids = new ArrayList(); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鐖剁骇鏉冮檺涓嬫媺鑿滃崟 + */ + @RequestMapping(params = "setPFunction") + @ResponseBody + public List setPFunction(HttpServletRequest request, + ComboTree comboTree) { + CriteriaQuery cq = new CriteriaQuery(TSFunction.class); + if (null != request.getParameter("selfId")) { + cq.notEq("id", request.getParameter("selfId")); + } + if (comboTree.getId() != null) { + cq.eq("TSFunction.id", comboTree.getId()); + } + if (comboTree.getId() == null) { + cq.isNull("TSFunction"); + } + cq.add(); + List functionList = systemService.getListByCriteriaQuery( + cq, false); + List comboTrees = new ArrayList(); + ComboTreeModel comboTreeModel = new ComboTreeModel("id", + "functionName", "TSFunctions"); + comboTrees = systemService.ComboTree(functionList, comboTreeModel, + null, false); + MutiLangUtil.setMutiTree(comboTrees); + return comboTrees; + } + /** + * 鑿滃崟妯$硦妫绱㈠姛鑳 + * + * @return + */ + @RequestMapping(params = "searchApp") + public ModelAndView searchApp(TSFunction function, HttpServletRequest req) { + + String name = req.getParameter("name"); + String menuListMap = ""; + // String menuListMap = + // "
    "; + CriteriaQuery cq = new CriteriaQuery(TSFunction.class); + + cq.notEq("functionLevel", Short.valueOf("0")); + if (name == null || "".equals(name)) { + cq.isNull("TSFunction"); + } else { + String name1 = "%" + name + "%"; + cq.like("functionName", name1); + } + cq.add(); + List functionList = systemService.getListByCriteriaQuery( + cq, false); + if (functionList.size() > 0 && functionList != null) { + for (int i = 0; i < functionList.size(); i++) { + // menuListMap = menuListMap + + // ""; + } + } else { + menuListMap = menuListMap + "寰堥仐鎲撅紝鍦ㄧ郴缁熶腑娌℃湁妫绱㈠埌涓庘" + name + "鈥濈浉鍏崇殑淇℃伅锛"; + } + // menuListMap = menuListMap + "
    "; + System.out.println("-------------------------------" + menuListMap); + req.setAttribute("menuListMap", menuListMap); + return new ModelAndView("system/function/menuAppList"); + } + + /** + * + * addorupdaterule 鏁版嵁瑙勫垯鏉冮檺鐨勭紪杈戝拰鏂板 + * + * @Title: addorupdaterule + * @Description: TODO + * @param @param operation + * @param @param req + * @param @return 璁惧畾鏂囦欢 + * @return ModelAndView 杩斿洖绫诲瀷 + * @throws + */ + @RequestMapping(params = "addorupdaterule") + public ModelAndView addorupdaterule(TSDataRule operation, + HttpServletRequest req) { + List iconlist = systemService.getList(TSIcon.class); + req.setAttribute("iconlist", iconlist); + if (operation.getId() != null) { + operation = systemService.getEntity(TSDataRule.class, + operation.getId()); + req.setAttribute("operation", operation); + } + String functionId = oConvertUtils.getString(req + .getParameter("functionId")); + req.setAttribute("functionId", functionId); + return new ModelAndView("system/dataRule/ruleData"); + } + + /** + * + * opdategrid 鏁版嵁瑙勫垯鐨勫垪琛ㄧ晫闈 + * + * @Title: opdategrid + * @Description: TODO + * @param @param request + * @param @param response + * @param @param dataGrid 璁惧畾鏂囦欢 + * @return void 杩斿洖绫诲瀷 + * @throws + */ + @RequestMapping(params = "ruledategrid") + public void ruledategrid(HttpServletRequest request, + HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSDataRule.class, dataGrid); + String functionId = oConvertUtils.getString(request + .getParameter("functionId")); + cq.eq("TSFunction.id", functionId); + cq.add(); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * + * delrule 鍒犻櫎鏁版嵁鏉冮檺瑙勫垯 + * + * @Title: delrule + * @Description: TODO + * @param @param operation + * @param @param request + * @param @return 璁惧畾鏂囦欢 + * @return AjaxJson 杩斿洖绫诲瀷 + * @throws + */ + @RequestMapping(params = "delrule") + @ResponseBody + public AjaxJson delrule(TSDataRule operation, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + operation = systemService + .getEntity(TSDataRule.class, operation.getId()); + message = MutiLangUtil.paramDelSuccess("common.operation"); + userService.delete(operation); + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + + j.setMsg(message); + + return j; + } + + /** + * + * saverule淇濆瓨瑙勫垯鏉冮檺鍊 + * + * @Title: saverule + * @Description: TODO + * @param @param operation + * @param @param request + * @param @return 璁惧畾鏂囦欢 + * @return AjaxJson 杩斿洖绫诲瀷 + * @throws + */ + @RequestMapping(params = "saverule") + @ResponseBody + public AjaxJson saverule(TSDataRule operation, HttpServletRequest request) { + + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(operation.getId())) { + message = MutiLangUtil.paramUpdSuccess("common.operation"); + userService.saveOrUpdate(operation); + systemService.addLog(message, Globals.Log_Type_UPDATE, + Globals.Log_Leavel_INFO); + } else { + if (justHaveDataRule(operation) == 0) { + message = MutiLangUtil.paramAddSuccess("common.operation"); + userService.save(operation); + systemService.addLog(message, Globals.Log_Type_INSERT, + Globals.Log_Leavel_INFO); + } else { + + message = "鎿嶄綔 瀛楁瑙勫垯宸插瓨鍦"; + } + } + j.setMsg(message); + return j; + } + + public int justHaveDataRule(TSDataRule dataRule) { + String sql = "SELECT id FROM t_s_data_rule WHERE functionId='"+dataRule.getTSFunction() + .getId()+"' AND rule_column='"+dataRule.getRuleColumn()+"' AND rule_conditions='"+dataRule + .getRuleConditions()+"'"; + + List hasOperList = this.systemService.findListbySql(sql); + return hasOperList.size(); + } +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/IconController.java b/src/main/java/org/jeecgframework/web/system/controller/core/IconController.java new file mode 100644 index 00000000..86b85b2e --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/IconController.java @@ -0,0 +1,310 @@ +package org.jeecgframework.web.system.controller.core; + +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.util.List; + +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.web.system.pojo.base.TSFunction; +import org.jeecgframework.web.system.pojo.base.TSIcon; +import org.jeecgframework.web.system.pojo.base.TSOperation; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.jeecgframework.web.system.service.SystemService; + +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.common.UploadFile; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + + +/** + * 鍥炬爣淇℃伅澶勭悊绫 + * + * @author 寮犱唬娴 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/iconController") +public class IconController extends BaseController { + private SystemService systemService; + + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + /** + * 鍥炬爣鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "icon") + public ModelAndView icon() { + return new ModelAndView("system/icon/iconList"); + } + + /** + * easyuiAJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + */ + @RequestMapping(params = "datagrid") + public void datagrid(TSIcon icon,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSIcon.class, dataGrid); + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, icon); + cq.add(); + this.systemService.getDataGridReturn(cq, true); + IconImageUtil.convertDataGrid(dataGrid, request);//鍏堟妸鏁版嵁搴撶殑byte瀛樻垚鍥剧墖鍒颁复鏃剁洰褰曪紝鍐嶇粰姣忎釜TsIcon璁剧疆鐩綍璺緞 + TagUtil.datagrid(response, dataGrid); + } + + /** + * 涓婁紶鍥炬爣 + * + * @param request + * @return + * @throws Exception + */ + @RequestMapping(params = "saveOrUpdateIcon", method = RequestMethod.POST) + @ResponseBody + public AjaxJson saveOrUpdateIcon(HttpServletRequest request) throws Exception { + AjaxJson j = new AjaxJson(); + TSIcon icon = new TSIcon(); + Short iconType = oConvertUtils.getShort(request.getParameter("iconType")); + String iconName = oConvertUtils.getString(request.getParameter("iconName")); + String id = request.getParameter("id"); + icon.setId(id); + icon.setIconName(iconName); + icon.setIconType(iconType); + // uploadFile.setBasePath("images/accordion"); + UploadFile uploadFile = new UploadFile(request, icon); + uploadFile.setCusPath("plug-in/accordion/images"); + uploadFile.setExtend("extend"); + uploadFile.setTitleField("iconclas"); + uploadFile.setRealPath("iconPath"); + uploadFile.setObject(icon); + uploadFile.setByteField("iconContent"); + uploadFile.setRename(false); + systemService.uploadFile(uploadFile); + // 鍥炬爣鐨刢ss鏍峰紡 + String css = "." + icon.getIconClas() + "{background:url('../images/" + icon.getIconClas() + "." + icon.getExtend() + "') no-repeat}"; + write(request, css); + message = MutiLangUtil.paramAddSuccess("common.icon"); + j.setMsg(message); + return j; + } + /** + * 娌℃湁涓婁紶鏂囦欢鏃舵洿鏂颁俊鎭 + * + * @param request + * @return + * @throws Exception + */ + @SuppressWarnings("deprecation") + @RequestMapping(params = "update", method = RequestMethod.POST) + @ResponseBody + public AjaxJson update(HttpServletRequest request) throws Exception { + AjaxJson j = new AjaxJson(); + Short iconType = oConvertUtils.getShort(request.getParameter("iconType")); + String iconName = java.net.URLDecoder.decode(oConvertUtils.getString(request.getParameter("iconName"))); + String id = request.getParameter("id"); + TSIcon icon = new TSIcon(); + if (StringUtil.isNotEmpty(id)) { + icon = systemService.get(TSIcon.class, id); + icon.setId(id); + } + icon.setIconName(iconName); + icon.setIconType(iconType); + systemService.saveOrUpdate(icon); + // 鍥炬爣鐨刢ss鏍峰紡 + String css = "." + icon.getIconClas() + "{background:url('../images/" + icon.getIconClas() + "." + icon.getExtend() + "') no-repeat}"; + write(request, css); + message = "鏇存柊鎴愬姛"; + j.setMsg(message); + return j; + } + /** + * 娣诲姞鍥炬爣鏍峰紡 + * + * @param request + * @param css + */ + protected void write(HttpServletRequest request, String css) { + try { + String path = request.getSession().getServletContext().getRealPath("/plug-in/accordion/css/icons.css"); + File file = new File(path); + if (!file.exists()) { + file.createNewFile(); + } + FileWriter out = new FileWriter(file, true); + out.write("\r\n"); + out.write(css); + out.close(); + } catch (Exception e) { + } + } + + /** + * 鎭㈠鍥炬爣锛堝皢鏁版嵁搴撳浘鏍囨暟鎹啓鍏ュ浘鏍囧瓨鏀剧殑璺緞涓嬶級 + * + * @param request + * @return + * @throws Exception + */ + @RequestMapping(params = "repair") + @ResponseBody + public AjaxJson repair(HttpServletRequest request) throws Exception { + AjaxJson json = new AjaxJson(); + List icons = systemService.loadAll(TSIcon.class); + String rootpath = request.getSession().getServletContext().getRealPath("/"); + String csspath = request.getSession().getServletContext().getRealPath("/plug-in/accordion/css/icons.css"); + // 娓呯┖CSS鏂囦欢鍐呭 + clearFile(csspath); + for (TSIcon c : icons) { + File file = new File(rootpath + c.getIconPath()); + if (!file.exists()) { + byte[] content = c.getIconContent(); + if (content != null) { + BufferedImage imag = ImageIO.read(new ByteArrayInputStream(content)); + ImageIO.write(imag, "PNG", file);// 杈撳嚭鍒 png 鏂囦欢 + } + } + String css = "." + c.getIconClas() + "{background:url('../images/" + c.getIconClas() + "." + c.getExtend() + "') no-repeat}"; + write(request, css); + } + json.setMsg(MutiLangUtil.paramAddSuccess("common.icon.style")); + json.setSuccess(true); + return json; + } + + /** + * 娓呯┖鏂囦欢鍐呭 + * + * @param path + */ + protected void clearFile(String path) { + try { + FileOutputStream fos = new FileOutputStream(new File(path)); + fos.write("".getBytes()); + fos.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 鍒犻櫎鍥炬爣 + * + * @param icon + * @param request + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(TSIcon icon, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + + icon = systemService.getEntity(TSIcon.class, icon.getId()); + + boolean isPermit=isPermitDel(icon); + + if(isPermit){ + systemService.delete(icon); + + message = MutiLangUtil.paramDelSuccess("common.icon"); + + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + + return j; + } + + message = MutiLangUtil.paramDelFail("common.icon,common.icon.isusing"); + j.setMsg(message); + + return j; + } + + /** + * 妫鏌ユ槸鍚﹀厑璁稿垹闄よ鍥炬爣銆 + * @param icon 鍥炬爣銆 + * @return true鍏佽锛沠alse涓嶅厑璁革紱 + */ + private boolean isPermitDel(TSIcon icon) { + List functions = systemService.findByProperty(TSFunction.class, "TSIcon.id", icon.getId()); + if (functions==null||functions.isEmpty()) { + return true; + } + return false; + } + + public void upEntity(TSIcon icon) { + List functions = systemService.findByProperty(TSFunction.class, "TSIcon.id", icon.getId()); + if (functions.size() > 0) { + for (TSFunction tsFunction : functions) { + tsFunction.setTSIcon(null); + systemService.saveOrUpdate(tsFunction); + } + } + List operations = systemService.findByProperty(TSOperation.class, "TSIcon.id", icon.getId()); + if (operations.size() > 0) { + for (TSOperation tsOperation : operations) { + tsOperation.setTSIcon(null); + systemService.saveOrUpdate(tsOperation); + } + } + } + + /** + * 鍥炬爣椤甸潰璺宠浆 + * + * @param icon + * @param req + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(TSIcon icon, HttpServletRequest req) { + if (StringUtil.isNotEmpty(icon.getId())) { + icon = systemService.getEntity(TSIcon.class, icon.getId()); + req.setAttribute("icon", icon); + } + return new ModelAndView("system/icon/icons"); + } +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/IconImageUtil.java b/src/main/java/org/jeecgframework/web/system/controller/core/IconImageUtil.java new file mode 100644 index 00000000..1f466188 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/IconImageUtil.java @@ -0,0 +1,111 @@ +package org.jeecgframework.web.system.controller.core; + +import org.jeecgframework.web.system.pojo.base.TSIcon; +import org.jeecgframework.core.common.model.json.DataGrid; + +import javax.imageio.stream.FileImageOutputStream; +import javax.servlet.http.HttpServletRequest; +import java.io.*; +import java.util.List; +import java.util.UUID; + +/** + * User: MaCiCi + * Date: 13-7-26 + * Time: 涓嬪崍2:07 + */ +public class IconImageUtil { + /** + * 鎶婃暟鎹簱涓浘鐗嘼yte锛屽瓨鍒伴」鐩畉emp鐩綍涓嬶紝骞朵笖鎶婅矾寰勮繑璁剧疆缁橳sIcon + * @param dataGrid + * @param request + */ + public static void convertDataGrid(DataGrid dataGrid,HttpServletRequest request){ + String fileDirName=request.getSession().getServletContext().getRealPath("")+File.separator+"temp"; + delFolder(fileDirName); + File fileDir = new File(fileDirName); + if (!fileDir.exists()) { + fileDir.mkdirs(); + } + try { + List list=dataGrid.getResults(); + for(Object obj:list){ + TSIcon icon=(TSIcon)obj; + String fileName="icon"+ UUID.randomUUID()+"."+icon.getExtend(); + File tempFile=new File(fileDirName+File.separator+fileName); + if(icon.getIconContent()!=null){ + byte2image(icon.getIconContent(),tempFile); + icon.setIconPath("temp/"+fileName); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + //byte鏁扮粍鍒板浘鐗 + private static void byte2image(byte[] data,File file){ + if( data.length < 3 ) return; + FileImageOutputStream imageOutput = null; + String fileName=null; + try { + imageOutput = new FileImageOutputStream(file); + imageOutput.write(data, 0, data.length); + } catch(Exception ex) { + ex.printStackTrace(); + } finally { + try { + imageOutput.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 鍒犻櫎鏂囦欢澶 + * @param folderPath 鏂囦欢澶瑰畬鏁寸粷瀵硅矾寰 + */ + private static void delFolder(String folderPath) { + try { + delAllFile(folderPath); //鍒犻櫎瀹岄噷闈㈡墍鏈夊唴瀹 + File folder = new File(folderPath); + folder.delete(); //鍒犻櫎绌烘枃浠跺す + } catch (Exception e) { + e.printStackTrace(); + } + } + /** + * 鍒犻櫎鎸囧畾鏂囦欢澶逛笅鎵鏈夋枃浠 + * @param path 鏂囦欢澶瑰畬鏁寸粷瀵硅矾寰 + * @return + */ + private static boolean delAllFile(String path) { + boolean flag = false; + File file = new File(path); + if (!file.exists()) { + return flag; + } + if (!file.isDirectory()) { + return flag; + } + String[] tempList = file.list(); + File temp = null; + for (int i = 0; i < tempList.length; i++) { + if (path.endsWith(File.separator)) { + temp = new File(path + tempList[i]); + } else { + temp = new File(path + File.separator + tempList[i]); + } + if (temp.isFile()) { + temp.delete(); + } + if (temp.isDirectory()) { + delAllFile(path + "/" + tempList[i]);//鍏堝垹闄ゆ枃浠跺す閲岄潰鐨勬枃浠 + delFolder(path + "/" + tempList[i]);//鍐嶅垹闄ょ┖鏂囦欢澶 + flag = true; + } + } + return flag; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/LogController.java b/src/main/java/org/jeecgframework/web/system/controller/core/LogController.java new file mode 100644 index 00000000..88c39e54 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/LogController.java @@ -0,0 +1,295 @@ +package org.jeecgframework.web.system.controller.core; + +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.StringReader; +import java.sql.Timestamp; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.batik.transcoder.Transcoder; +import org.apache.batik.transcoder.TranscoderException; +import org.apache.batik.transcoder.TranscoderInput; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.image.JPEGTranscoder; +import org.apache.batik.transcoder.image.PNGTranscoder; +import org.apache.fop.svg.PDFTranscoder; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.common.model.json.Highchart; +import org.jeecgframework.core.util.DateUtils; +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.pojo.base.TSLog; +import org.jeecgframework.web.system.service.LogService; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + + +/** + * 鏃ュ織澶勭悊绫 + * + * @author 寮犱唬娴 + * + */ +@Controller +@RequestMapping("/logController") +public class LogController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(LogController.class); + + //鐢ㄦ埛娴忚鍣ㄧ粺璁″垎鏋愮殑鍥介檯鍖朘EY + private static final String USER_BROWSER_ANALYSIS = "user.browser.analysis"; + private SystemService systemService; + + private LogService logService; + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + @Autowired + public void setLogService(LogService logService) { + this.logService = logService; + } + + /** + * 鏃ュ織鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "log") + public ModelAndView log() { + return new ModelAndView("system/log/logList"); + } + + /** + * easyuiAJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + */ + @RequestMapping(params = "datagrid") + public void datagrid(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSLog.class, dataGrid); + String loglevel = request.getParameter("loglevel"); + if (loglevel == null || loglevel.equals("0")) { + } else { + cq.eq("loglevel", oConvertUtils.getShort(loglevel)); + cq.add(); + } +// add-begin--Author:zhangguoming Date:20140427 for锛氭坊鍔犳煡璇㈡潯浠 鎿嶄綔鏃堕棿 + String operatetime_begin = request.getParameter("operatetime_begin"); + if(operatetime_begin != null) { + Timestamp beginValue = null; + try { + beginValue = DateUtils.parseTimestamp(operatetime_begin, "yyyy-MM-dd"); + } catch (ParseException e) { + e.printStackTrace(); + } + cq.ge("operatetime", beginValue); + } + String operatetime_end = request.getParameter("operatetime_end"); + if(operatetime_end != null) { + if (operatetime_end.length() == 10) { + operatetime_end =operatetime_end + " 23:59:59"; + } + Timestamp endValue = null; + try { + endValue = DateUtils.parseTimestamp(operatetime_end, "yyyy-MM-dd hh:mm:ss"); + } catch (ParseException e) { + e.printStackTrace(); + } + cq.le("operatetime", endValue); + } + cq.add(); +// add-end--Author:zhangguoming Date:20140427 for锛氭坊鍔犳煡璇㈡潯浠 鎿嶄綔鏃堕棿 + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鑾峰彇鏃ュ織璇︽儏 + * @param tsLog + * @param request + * @return + * @Author fangwenrong + * @Date 2015-05-10 + */ + @RequestMapping(params = "logDetail") + public ModelAndView logDetail(TSLog tsLog,HttpServletRequest request){ + if (StringUtil.isNotEmpty(tsLog.getId())) { + tsLog = logService.getEntity(TSLog.class, tsLog.getId()); + request.setAttribute("tsLog", tsLog); + } + return new ModelAndView("system/log/logDetail"); + + } + + /** + * @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(TSTimeTaskEntity timeTask, HttpServletRequest req) { + if (StringUtil.isNotEmpty(timeTask.getId())) { + timeTask = timeTaskService.getEntity(TSTimeTaskEntity.class, timeTask.getId()); + req.setAttribute("timeTaskPage", timeTask); + } + return new ModelAndView("system/timetask/timeTask"); + } + */ + + + /** + * 缁熻闆嗗悎椤甸潰 + * + * @return + */ + @RequestMapping(params = "statisticTabs") + public ModelAndView statisticTabs(HttpServletRequest request) { + return new ModelAndView("system/log/statisticTabs"); + } + /** + * 鐢ㄦ埛娴忚鍣ㄤ娇鐢ㄧ粺璁″浘 + * + * @return + */ + @RequestMapping(params = "userBroswer") + public ModelAndView userBroswer(String reportType, HttpServletRequest request) { + request.setAttribute("reportType", reportType); + if("pie".equals(reportType)){ + return new ModelAndView("system/log/userBroswerPie"); + }else if("line".equals(reportType)) { + return new ModelAndView("system/log/userBroswerLine"); + } + return new ModelAndView("system/log/userBroswer"); + } + + /** + * 鎶ヨ〃鏁版嵁鐢熸垚 + * + * @return + */ + @RequestMapping(params = "getBroswerBar") + @ResponseBody + public List getBroswerBar(HttpServletRequest request,String reportType, HttpServletResponse response) { + List list = new ArrayList(); + Highchart hc = new Highchart(); + StringBuffer sb = new StringBuffer(); + sb.append("SELECT broswer ,count(broswer) FROM TSLog group by broswer"); + List userBroswerList = systemService.findByQueryString(sb.toString()); + Long count = systemService.getCountForJdbc("SELECT COUNT(1) FROM T_S_Log WHERE 1=1"); + List lt = new ArrayList(); + hc = new Highchart(); + hc.setName(MutiLangUtil.getMutiLangInstance().getLang(USER_BROWSER_ANALYSIS)); + hc.setType(reportType); + Map map; + if (userBroswerList.size() > 0) { + for (Object object : userBroswerList) { + map = new HashMap(); + Object[] obj = (Object[]) object; + map.put("name", obj[0]); + map.put("y", obj[1]); + Long groupCount = (Long) obj[1]; + Double percentage = 0.0; + if (count != null && count.intValue() != 0) { + percentage = new Double(groupCount)/count; + } + map.put("percentage", percentage*100); + lt.add(map); + } + } + hc.setData(lt); + list.add(hc); + return list; + } + + /** + * hightchart瀵煎嚭鍥剧墖 + * + * @param request + * @param response + * @throws IOException + */ + @RequestMapping(params = "export") + public void export(HttpServletRequest request, HttpServletResponse response) + throws IOException { + request.setCharacterEncoding("utf-8"); + response.setCharacterEncoding("utf-8"); + String type = request.getParameter("type"); + String svg = request.getParameter("svg"); + String filename = request.getParameter("filename"); + + filename = filename == null ? "chart" : filename; + ServletOutputStream out = response.getOutputStream(); + try { + if (null != type && null != svg) { + svg = svg.replaceAll(":rect", "rect"); + String ext = ""; + Transcoder t = null; + if (type.equals("image/png")) { + ext = "png"; + t = new PNGTranscoder(); + } else if (type.equals("image/jpeg")) { + ext = "jpg"; + t = new JPEGTranscoder(); + } else if (type.equals("application/pdf")) { + ext = "pdf"; + t = (Transcoder) new PDFTranscoder(); + } else if (type.equals("image/svg+xml")) + ext = "svg"; + response.addHeader("Content-Disposition", + "attachment; filename=" + new String(filename.getBytes("GBK"),"ISO-8859-1") + "." + ext); + response.addHeader("Content-Type", type); + + if (null != t) { + TranscoderInput input = new TranscoderInput( + new StringReader(svg)); + TranscoderOutput output = new TranscoderOutput(out); + + try { + t.transcode(input, output); + } catch (TranscoderException e) { + out.print("Problem transcoding stream. See the web logs for more details."); + e.printStackTrace(); + } + } else if (ext.equals("svg")) { + // out.print(svg); + OutputStreamWriter writer = new OutputStreamWriter(out, + "UTF-8"); + writer.append(svg); + writer.close(); + } else + out.print("Invalid type: " + type); + } else { + response.addHeader("Content-Type", "text/html"); + out + .println("Usage:\n\tParameter [svg]: The DOM Element to be converted." + + "\n\tParameter [type]: The destination MIME type for the elment to be transcoded."); + } + } finally { + if (out != null) { + out.flush(); + out.close(); + } + } + } + +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/LoginController.java b/src/main/java/org/jeecgframework/web/system/controller/core/LoginController.java new file mode 100644 index 00000000..9362bdf3 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/LoginController.java @@ -0,0 +1,566 @@ +package org.jeecgframework.web.system.controller.core; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.enums.SysThemesEnum; +import org.jeecgframework.core.extend.datasource.DataSourceContextHolder; +import org.jeecgframework.core.extend.datasource.DataSourceType; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.IpUtil; +import org.jeecgframework.core.util.ListtoMenu; +import org.jeecgframework.core.util.NumberComparator; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.SysThemesUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.web.system.manager.ClientManager; +import org.jeecgframework.web.system.pojo.base.Client; +import org.jeecgframework.web.system.pojo.base.TSConfig; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.pojo.base.TSFunction; +import org.jeecgframework.web.system.pojo.base.TSRole; +import org.jeecgframework.web.system.pojo.base.TSRoleFunction; +import org.jeecgframework.web.system.pojo.base.TSRoleUser; +import org.jeecgframework.web.system.pojo.base.TSUser; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.web.system.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.view.RedirectView; + +/** + * 鐧婚檰鍒濆鍖栨帶鍒跺櫒 + * @author 寮犱唬娴 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/loginController") +public class LoginController extends BaseController{ + private Logger log = Logger.getLogger(LoginController.class); + private SystemService systemService; + private UserService userService; + private String message = null; + + @Autowired + private MutiLangServiceI mutiLangService; + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + @Autowired + public void setUserService(UserService userService) { + + this.userService = userService; + } + + @RequestMapping(params = "goPwdInit") + public String goPwdInit() { + return "login/pwd_init"; + } + + /** + * admin璐︽埛瀵嗙爜鍒濆鍖 + * + * @param request + * @return + */ + @RequestMapping(params = "pwdInit") + public ModelAndView pwdInit(HttpServletRequest request) { + ModelAndView modelAndView = null; + TSUser user = new TSUser(); + user.setUserName("admin"); + String newPwd = "123456"; + userService.pwdInit(user, newPwd); + modelAndView = new ModelAndView(new RedirectView( + "loginController.do?login")); + return modelAndView; + } + + /** + * 妫鏌ョ敤鎴峰悕绉 + * + * @param user + * @param req + * @return + */ + @RequestMapping(params = "checkuser") + @ResponseBody + public AjaxJson checkuser(TSUser user, HttpServletRequest req) { + HttpSession session = ContextHolderUtils.getSession(); + DataSourceContextHolder + .setDataSourceType(DataSourceType.dataSource_jeecg); + AjaxJson j = new AjaxJson(); + if (req.getParameter("langCode")!=null) { + req.getSession().setAttribute("lang", req.getParameter("langCode")); + } + String randCode = req.getParameter("randCode"); + if (StringUtils.isEmpty(randCode)) { + j.setMsg(mutiLangService.getLang("common.enter.verifycode")); + j.setSuccess(false); + } else if (!randCode.equalsIgnoreCase(String.valueOf(session.getAttribute("randCode")))) { + // todo "randCode"鍜岄獙璇佺爜servlet涓鍙橀噺涓鏍凤紝閫氳繃缁熶竴鐨勭郴缁熷父閲忛厤缃瘮杈冨ソ锛屾殏鏃朵笉鐭ラ亾绯荤粺甯搁噺鏀惧湪浠涔堝湴鏂瑰悎閫 + j.setMsg(mutiLangService.getLang("common.verifycode.error")); + j.setSuccess(false); + } else { + int users = userService.getList(TSUser.class).size(); + + if (users == 0) { + j.setMsg("a"); + j.setSuccess(false); + } else { + TSUser u = userService.checkUserExits(user); + if(u == null) { + j.setMsg(mutiLangService.getLang("common.username.or.password.error")); + j.setSuccess(false); + return j; + } + TSUser u2 = userService.getEntity(TSUser.class, u.getId()); + + if (u != null&&u2.getStatus()!=0) { + // if (user.getUserKey().equals(u.getUserKey())) { + + + if (true) { + Map attrMap = new HashMap(); + j.setAttributes(attrMap); + + String orgId = req.getParameter("orgId"); + if (oConvertUtils.isEmpty(orgId)) { // 娌℃湁浼犵粍缁囨満鏋勫弬鏁帮紝鍒欒幏鍙栧綋鍓嶇敤鎴风殑缁勭粐鏈烘瀯 + Long orgNum = systemService.getCountForJdbc("select count(1) from t_s_user_org where user_id = '" + u.getId() + "'"); + if (orgNum > 1) { + attrMap.put("orgNum", orgNum); + attrMap.put("user", u2); + } else { + Map userOrgMap = systemService.findOneForJdbc("select org_id as orgId from t_s_user_org where user_id=?", u2.getId()); + saveLoginSuccessInfo(req, u2, (String) userOrgMap.get("orgId")); + } + } else { + attrMap.put("orgNum", 1); + + saveLoginSuccessInfo(req, u2, orgId); + } + } else { + j.setMsg(mutiLangService.getLang("common.check.shield")); + j.setSuccess(false); + } + } else { + j.setMsg(mutiLangService.getLang("common.username.or.password.error")); + j.setSuccess(false); + } + } + } + return j; + } + /** + * 淇濆瓨鐢ㄦ埛鐧诲綍鐨勪俊鎭紝骞跺皢褰撳墠鐧诲綍鐢ㄦ埛鐨勭粍缁囨満鏋勮祴鍊煎埌鐢ㄦ埛瀹炰綋涓紱 + * @param req request + * @param user 褰撳墠鐧诲綍鐢ㄦ埛 + * @param orgId 缁勭粐涓婚敭 + */ + private void saveLoginSuccessInfo(HttpServletRequest req, TSUser user, String orgId) { + TSDepart currentDepart = systemService.get(TSDepart.class, orgId); + user.setCurrentDepart(currentDepart); + + HttpSession session = ContextHolderUtils.getSession(); + message = mutiLangService.getLang("common.user") + ": " + user.getUserName() + "[" + + currentDepart.getDepartname() + "]" + mutiLangService.getLang("common.login.success"); + + Client client = new Client(); + client.setIp(IpUtil.getIpAddr(req)); + client.setLogindatetime(new Date()); + client.setUser(user); + ClientManager.getInstance().addClinet(session.getId(), client); + // 娣诲姞鐧婚檰鏃ュ織 + systemService.addLog(message, Globals.Log_Type_LOGIN, Globals.Log_Leavel_INFO); + } + + /** + * 鐢ㄦ埛鐧诲綍 + * + * @param request + * @return + */ + @RequestMapping(params = "login") + public String login(ModelMap modelMap,HttpServletRequest request) { + DataSourceContextHolder.setDataSourceType(DataSourceType.dataSource_jeecg); + TSUser user = ResourceUtil.getSessionUserName(); + String roles = ""; + if (user != null) { + List rUsers = systemService.findByProperty(TSRoleUser.class, "TSUser.id", user.getId()); + for (TSRoleUser ru : rUsers) { + TSRole role = ru.getTSRole(); + roles += role.getRoleName() + ","; + } + if (roles.length() > 0) { + roles = roles.substring(0, roles.length() - 1); + } + modelMap.put("roleName", roles); + modelMap.put("userName", user.getUserName()); + modelMap.put("currentOrgName", ClientManager.getInstance().getClient().getUser().getCurrentDepart().getDepartname()); + request.getSession().setAttribute("CKFinder_UserRole", "admin"); + +/* // 榛樿椋庢牸 + String indexStyle = "shortcut"; + Cookie[] cookies = request.getCookies(); + for (Cookie cookie : cookies) { + if (cookie == null || StringUtils.isEmpty(cookie.getName())) { + continue; + } + if (cookie.getName().equalsIgnoreCase("JEECGINDEXSTYLE")) { + indexStyle = cookie.getValue(); + } + } + // 瑕佹坊鍔犺嚜宸辩殑椋庢牸锛屽鍒朵笅闈笁琛屽嵆鍙 +// if (StringUtils.isNotEmpty(indexStyle) +// && indexStyle.equalsIgnoreCase("bootstrap")) { +// return "main/bootstrap_main"; +// } +// if (StringUtils.isNotEmpty(indexStyle) +// && indexStyle.equalsIgnoreCase("shortcut")) { +// return "main/shortcut_main"; +// } +// +// if (StringUtils.isNotEmpty(indexStyle) +// && indexStyle.equalsIgnoreCase("sliding")) { +// return "main/sliding_main"; +// } + if (StringUtils.isNotEmpty(indexStyle)&& + !"default".equalsIgnoreCase(indexStyle)&& + !"undefined".equalsIgnoreCase(indexStyle)) { + if("ace".equals(indexStyle)){ + request.setAttribute("menuMap", getFunctionMap(user)); + } + log.info("main/"+indexStyle.toLowerCase()+"_main"); + return "main/"+indexStyle.toLowerCase()+"_main"; + } + */ + SysThemesEnum sysTheme = SysThemesUtil.getSysTheme(request); + if("ace".equals(sysTheme.getStyle())){ + request.setAttribute("menuMap", getFunctionMap(user)); + } + return sysTheme.getIndexPath(); + } else { + return "login/login"; + } + + } + + /** + * 閫鍑虹郴缁 + * + * @param request + * @return + */ + @RequestMapping(params = "logout") + public ModelAndView logout(HttpServletRequest request) { + HttpSession session = ContextHolderUtils.getSession(); + TSUser user = ResourceUtil.getSessionUserName(); + systemService.addLog("鐢ㄦ埛" + user.getUserName() + "宸查鍑", + Globals.Log_Type_EXIT, Globals.Log_Leavel_INFO); + ClientManager.getInstance().removeClinet(session.getId()); + session.invalidate(); + ModelAndView modelAndView = new ModelAndView(new RedirectView( + "loginController.do?login")); + return modelAndView; + } + + /** + * 鑿滃崟璺宠浆 + * + * @return + */ + @RequestMapping(params = "left") + public ModelAndView left(HttpServletRequest request) { + TSUser user = ResourceUtil.getSessionUserName(); + HttpSession session = ContextHolderUtils.getSession(); + ModelAndView modelAndView = new ModelAndView(); + // 鐧婚檰鑰呯殑鏉冮檺 + if (user.getId() == null) { + session.removeAttribute(Globals.USER_SESSION); + modelAndView.setView(new RedirectView("loginController.do?login")); + }else{ + List configs = userService.loadAll(TSConfig.class); + for (TSConfig tsConfig : configs) { + request.setAttribute(tsConfig.getCode(), tsConfig.getContents()); + } + modelAndView.setViewName("main/left"); + request.setAttribute("menuMap", getFunctionMap(user)); + } + return modelAndView; + } + + /** + * 鑾峰彇鏉冮檺鐨刴ap + * + * @param user + * @return + */ + private Map> getFunctionMap(TSUser user) { + HttpSession session = ContextHolderUtils.getSession(); + Client client = ClientManager.getInstance().getClient(session.getId()); + if (client.getFunctionMap() == null || client.getFunctionMap().size() == 0) { + Map> functionMap = new HashMap>(); + Map loginActionlist = getUserFunction(user); + if (loginActionlist.size() > 0) { + Collection allFunctions = loginActionlist.values(); + for (TSFunction function : allFunctions) { + if(function.getFunctionType().intValue()==Globals.Function_TYPE_FROM.intValue()){ + //濡傛灉涓鸿〃鍗曟垨鑰呭脊鍑 涓嶆樉绀哄湪绯荤粺鑿滃崟閲岄潰 + continue; + } + if (!functionMap.containsKey(function.getFunctionLevel() + 0)) { + functionMap.put(function.getFunctionLevel() + 0, + new ArrayList()); + } + functionMap.get(function.getFunctionLevel() + 0).add(function); + } + // 鑿滃崟鏍忔帓搴 + Collection> c = functionMap.values(); + for (List list : c) { + Collections.sort(list, new NumberComparator()); + } + } + client.setFunctionMap(functionMap); + return functionMap; + }else{ + return client.getFunctionMap(); + } + } + + /** + * 鑾峰彇鐢ㄦ埛鑿滃崟鍒楄〃 + * + * @param user + * @return + */ + private Map getUserFunction(TSUser user) { + HttpSession session = ContextHolderUtils.getSession(); + Client client = ClientManager.getInstance().getClient(session.getId()); + if (client.getFunctions() == null || client.getFunctions().size() == 0) { + Map loginActionlist = new HashMap(); + /*String hql="from TSFunction t where t.id in (select d.TSFunction.id from TSRoleFunction d where d.TSRole.id in(select t.TSRole.id from TSRoleUser t where t.TSUser.id ='"+ + user.getId()+"' ))"; + String hql2="from TSFunction t where t.id in ( select b.tsRole.id from TSRoleOrg b where b.tsDepart.id in(select a.tsDepart.id from TSUserOrg a where a.tsUser.id='"+ + user.getId()+"'))"; + List list = systemService.findHql(hql); + log.info("role functions: "+list.size()); + for(TSFunction function:list){ + loginActionlist.put(function.getId(),function); + } + List list2 = systemService.findHql(hql2); + log.info("org functions: "+list2.size()); + for(TSFunction function:list2){ + loginActionlist.put(function.getId(),function); + }*/ + StringBuilder hqlsb1=new StringBuilder("select distinct f from TSFunction f,TSRoleFunction rf,TSRoleUser ru ") + .append("where ru.TSRole.id=rf.TSRole.id and rf.TSFunction.id=f.id and ru.TSUser.id=? "); + StringBuilder hqlsb2=new StringBuilder("select distinct c from TSFunction c,TSRoleOrg b,TSUserOrg a ") + .append("where a.tsDepart.id=b.tsDepart.id and b.tsRole.id=c.id and a.tsUser.id=?"); + List list1 = systemService.findHql(hqlsb1.toString(),user.getId()); + List list2 = systemService.findHql(hqlsb2.toString(),user.getId()); + for(TSFunction function:list1){ + loginActionlist.put(function.getId(),function); + } + for(TSFunction function:list2){ + loginActionlist.put(function.getId(),function); + } + client.setFunctions(loginActionlist); + } + return client.getFunctions(); + } + + /** + * 鏍规嵁 瑙掕壊瀹炰綋 缁勮 鐢ㄦ埛鏉冮檺鍒楄〃 + * @param loginActionlist 鐧诲綍鐢ㄦ埛鐨勬潈闄愬垪琛 + * @param role 瑙掕壊瀹炰綋 + * @deprecated + */ + private void assembleFunctionsByRole(Map loginActionlist, TSRole role) { + List roleFunctionList = systemService.findByProperty(TSRoleFunction.class, "TSRole.id", role.getId()); + for (TSRoleFunction roleFunction : roleFunctionList) { + TSFunction function = roleFunction.getTSFunction(); + if(function.getFunctionType().intValue()==Globals.Function_TYPE_FROM.intValue()){ + //濡傛灉涓鸿〃鍗曟垨鑰呭脊鍑 涓嶆樉绀哄湪绯荤粺鑿滃崟閲岄潰 + continue; + } + loginActionlist.put(function.getId(), function); + } + } + + /** + * 棣栭〉璺宠浆 + * + * @return + */ + @RequestMapping(params = "home") + public ModelAndView home(HttpServletRequest request) { + return new ModelAndView("main/home"); + } + /** + * 鏃犳潈闄愰〉闈㈡彁绀鸿烦杞 + * + * @return + */ + @RequestMapping(params = "noAuth") + public ModelAndView noAuth(HttpServletRequest request) { + return new ModelAndView("common/noAuth"); + } + /** + * @Title: top + * @Description: bootstrap澶撮儴鑿滃崟璇锋眰 + * @param request + * @return ModelAndView + * @throws + */ + @RequestMapping(params = "top") + public ModelAndView top(HttpServletRequest request) { + TSUser user = ResourceUtil.getSessionUserName(); + HttpSession session = ContextHolderUtils.getSession(); + // 鐧婚檰鑰呯殑鏉冮檺 + if (user.getId() == null) { + session.removeAttribute(Globals.USER_SESSION); + return new ModelAndView( + new RedirectView("loginController.do?login")); + } + request.setAttribute("menuMap", getFunctionMap(user)); + List configs = userService.loadAll(TSConfig.class); + for (TSConfig tsConfig : configs) { + request.setAttribute(tsConfig.getCode(), tsConfig.getContents()); + } + return new ModelAndView("main/bootstrap_top"); + } + /** + * @Title: top + * @author gaofeng + * @Description: shortcut澶撮儴鑿滃崟璇锋眰 + * @param request + * @return ModelAndView + * @throws + */ + @RequestMapping(params = "shortcut_top") + public ModelAndView shortcut_top(HttpServletRequest request) { + TSUser user = ResourceUtil.getSessionUserName(); + HttpSession session = ContextHolderUtils.getSession(); + // 鐧婚檰鑰呯殑鏉冮檺 + if (user.getId() == null) { + session.removeAttribute(Globals.USER_SESSION); + return new ModelAndView( + new RedirectView("loginController.do?login")); + } + request.setAttribute("menuMap", getFunctionMap(user)); + List configs = userService.loadAll(TSConfig.class); + for (TSConfig tsConfig : configs) { + request.setAttribute(tsConfig.getCode(), tsConfig.getContents()); + } + return new ModelAndView("main/shortcut_top"); + } + + /** + * @Title: top + * @author:gaofeng + * @Description: shortcut澶撮儴鑿滃崟涓绾ц彍鍗曞垪琛紝骞跺皢鍏剁敤ajax浼犲埌椤甸潰锛屽疄鐜板姩鎬佹帶鍒朵竴绾ц彍鍗曞垪琛 + * @return AjaxJson + * @throws + */ + @RequestMapping(params = "primaryMenu") + @ResponseBody + public String getPrimaryMenu() { + List primaryMenu = getFunctionMap(ResourceUtil.getSessionUserName()).get(0); + String floor = ""; + if (primaryMenu == null) { + return floor; + } + for (TSFunction function : primaryMenu) { + if(function.getFunctionLevel() == 0) { + + String lang_key = function.getFunctionName(); + String lang_context = mutiLangService.getLang(lang_key); + + if("Online 寮鍙".equals(lang_context)){ + + floor += "
  • " + + " " + "
  • "; + }else if("缁熻鏌ヨ".equals(lang_context)){ + + floor += "
  • " + + " " + "
  • "; + }else if("绯荤粺绠$悊".equals(lang_context)){ + + floor += "
  • " + + " " + "
  • "; + }else if("甯哥敤绀轰緥".equals(lang_context)){ + + floor += "
  • " + + " " + "
  • "; + }else if("绯荤粺鐩戞帶".equals(lang_context)){ + + floor += "
  • " + + " " + "
  • "; + }else if(lang_context.contains("娑堟伅鎺ㄩ")){ + String s = "
    娑堟伅鎺ㄩ
    "; + floor += "
  • " + + " " + + s +"
  • "; + }else{ + //鍏朵粬鐨勪负榛樿閫氱敤鐨勫浘鐗囨ā寮 + String s = ""; + if(lang_context.length()>=5 && lang_context.length()<7){ + s = "
    "+ lang_context +"
    "; + }else if(lang_context.length()<5){ + s = "
    "+ lang_context +"
    "; + }else if(lang_context.length()>=7){ + s = "
    "+ lang_context.substring(0, 6) +"
    "; + } + floor += "
  • " + + " " + + s +"
  • "; + } + } + } + + return floor; + } + + + /** + * 浜戞闈㈣繑鍥烇細鐢ㄦ埛鏉冮檺鑿滃崟 + */ + @RequestMapping(params = "getPrimaryMenuForWebos") + @ResponseBody + public AjaxJson getPrimaryMenuForWebos() { + AjaxJson j = new AjaxJson(); + //灏嗚彍鍗曞姞杞藉埌Session锛岀敤鎴峰彧鍦ㄧ櫥褰曠殑鏃跺欏姞杞戒竴娆 + Object getPrimaryMenuForWebos = ContextHolderUtils.getSession().getAttribute("getPrimaryMenuForWebos"); + if(oConvertUtils.isNotEmpty(getPrimaryMenuForWebos)){ + j.setMsg(getPrimaryMenuForWebos.toString()); + }else{ + String PMenu = ListtoMenu.getWebosMenu(getFunctionMap(ResourceUtil.getSessionUserName())); + ContextHolderUtils.getSession().setAttribute("getPrimaryMenuForWebos", PMenu); + j.setMsg(PMenu); + } + return j; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/MutiLangController.java b/src/main/java/org/jeecgframework/web/system/controller/core/MutiLangController.java new file mode 100644 index 00000000..14b71e57 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/MutiLangController.java @@ -0,0 +1,176 @@ +package org.jeecgframework.web.system.controller.core; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.pojo.base.MutiLangEntity; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Title: Controller + * @Description: 澶氳瑷 + * @author Rocky + * @date 2014-06-28 00:09:31 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/mutiLangController") +public class MutiLangController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(MutiLangController.class); + + @Autowired + private MutiLangServiceI mutiLangService; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + /** + * 澶氳瑷鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "mutiLang") + public ModelAndView mutiLang(HttpServletRequest request) { + return new ModelAndView("system/mutilang/mutiLangList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + */ + + @RequestMapping(params = "datagrid") + public void datagrid(MutiLangEntity mutiLang, HttpServletRequest request, + HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(MutiLangEntity.class, dataGrid); + // 鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, mutiLang, request.getParameterMap()); + this.mutiLangService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎澶氳瑷 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(MutiLangEntity mutiLang, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + mutiLang = systemService.getEntity(MutiLangEntity.class, mutiLang.getId()); + message = MutiLangUtil.paramDelSuccess("common.language"); + mutiLangService.delete(mutiLang); + mutiLangService.initAllMutiLang(); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + j.setMsg(message); + return j; + } + + /** + * 娣诲姞澶氳瑷 + * + * @param mutiLang + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(MutiLangEntity mutiLang, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(mutiLang.getId())) { + message = MutiLangUtil.paramUpdSuccess("common.language"); + MutiLangEntity t = mutiLangService.get(MutiLangEntity.class, mutiLang.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(mutiLang, t); + mutiLangService.saveOrUpdate(t); + mutiLangService.initAllMutiLang(); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + message = MutiLangUtil.paramUpdFail("common.language"); + } + } else { + if(MutiLangUtil.existLangContext( mutiLang.getLangContext())) + { + message = mutiLangService.getLang("common.langcontext.exist"); + } + if(StringUtil.isEmpty(message)) + { + mutiLangService.save(mutiLang); + message = MutiLangUtil.paramAddSuccess("common.language"); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + } + + mutiLangService.putMutiLang(mutiLang); + j.setMsg(message); + return j; + } + + /** + * 澶氳瑷鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(MutiLangEntity mutiLang, + HttpServletRequest req) { + if (StringUtil.isNotEmpty(mutiLang.getId())) { + mutiLang = mutiLangService.getEntity(MutiLangEntity.class, mutiLang.getId()); + req.setAttribute("mutiLangPage", mutiLang); + mutiLangService.putMutiLang(mutiLang); + } + return new ModelAndView("system/mutilang/mutiLang"); + } + + + /** + * 鍒锋柊鍓嶇缂撳瓨 + * @param request + */ + @RequestMapping(params = "refreshCach") + @ResponseBody + public AjaxJson refreshCach(HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + try { + mutiLangService.refleshMutiLangCach(); + message = mutiLangService.getLang("common.refresh.success"); + } catch (Exception e) { + message = mutiLangService.getLang("common.refresh.fail"); + } + j.setMsg(message); + return j; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/RepairController.java b/src/main/java/org/jeecgframework/web/system/controller/core/RepairController.java new file mode 100644 index 00000000..21e12a0d --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/RepairController.java @@ -0,0 +1,64 @@ +package org.jeecgframework.web.system.controller.core; + +import org.jeecgframework.web.system.service.RepairService; +import org.jeecgframework.web.system.service.SystemService; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +/** + * @Description 淇鏁版嵁搴 + * @ClassName: RepairController + * @author tanghan + * @date 2013-7-19 涓嬪崍01:23:08 + */ +@Scope("prototype") +@Controller +@RequestMapping("/repairController") +public class RepairController extends BaseController { + + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(RepairController.class); + + private SystemService systemService; + + private RepairService repairService; + + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Autowired + public void setRepairService(RepairService repairService) { + this.repairService = repairService; + } + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + /** + * @Description repair + */ + @RequestMapping(params = "repair") + public ModelAndView repair() { + repairService.deleteAndRepair(); + systemService.initAllTypeGroups(); //鍒濆鍖栫紦瀛 + return new ModelAndView("login/login"); + } + +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/RoleController.java b/src/main/java/org/jeecgframework/web/system/controller/core/RoleController.java new file mode 100644 index 00000000..3197e38c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/RoleController.java @@ -0,0 +1,816 @@ +package org.jeecgframework.web.system.controller.core; + +import org.apache.log4j.Logger; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.Property; +import org.hibernate.criterion.Restrictions; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.*; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.*; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.tag.vo.easyui.ComboTreeModel; +import org.jeecgframework.tag.vo.easyui.TreeGridModel; +import org.jeecgframework.web.system.pojo.base.*; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.web.system.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.*; + +/** + * 瑙掕壊澶勭悊绫 + * + * @author 寮犱唬娴 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/roleController") +public class RoleController extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(RoleController.class); + private UserService userService; + private SystemService systemService; + private String message = null; + + @Autowired + private MutiLangServiceI mutiLangService; + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + public UserService getUserService() { + return userService; + } + + @Autowired + public void setUserService(UserService userService) { + this.userService = userService; + } + + /** + * 瑙掕壊鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "role") + public ModelAndView role() { + return new ModelAndView("system/role/roleList"); + } + + /** + * easyuiAJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + */ + + @RequestMapping(params = "roleGrid") + public void roleGrid(TSRole role, HttpServletRequest request, + HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSRole.class, dataGrid); + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, + role); + cq.add(); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + ; + } + + /** + * 鍒犻櫎瑙掕壊 + * + * @param ids + * @return + */ + @RequestMapping(params = "delRole") + @ResponseBody + public AjaxJson delRole(TSRole role, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + int count = userService.getUsersOfThisRole(role.getId()); + if (count == 0) { + // 鍒犻櫎瑙掕壊涔嬪墠鍏堝垹闄よ鑹叉潈闄愬叧绯 + delRoleFunction(role); + systemService.executeSql("delete from t_s_role_org where role_id=?", role.getId()); // 鍒犻櫎 瑙掕壊-鏈烘瀯 鍏崇郴淇℃伅 + role = systemService.getEntity(TSRole.class, role.getId()); + userService.delete(role); + message = "瑙掕壊: " + role.getRoleName() + "琚垹闄ゆ垚鍔"; + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + } else { + message = "瑙掕壊: 浠嶈鐢ㄦ埛浣跨敤锛岃鍏堝垹闄ゅ叧鑱斿叧绯"; + } + j.setMsg(message); + return j; + } + + /** + * 妫鏌ヨ鑹 + * + * @param role + * @return + */ + @RequestMapping(params = "checkRole") + @ResponseBody + public ValidForm checkRole(TSRole role, HttpServletRequest request, + HttpServletResponse response) { + ValidForm v = new ValidForm(); + String roleCode = oConvertUtils + .getString(request.getParameter("param")); + String code = oConvertUtils.getString(request.getParameter("code")); + List roles = systemService.findByProperty(TSRole.class, + "roleCode", roleCode); + if (roles.size() > 0 && !code.equals(roleCode)) { + v.setInfo("瑙掕壊缂栫爜宸插瓨鍦"); + v.setStatus("n"); + } + return v; + } + + /** + * 鍒犻櫎瑙掕壊鏉冮檺 + * + * @param role + */ + protected void delRoleFunction(TSRole role) { + List roleFunctions = systemService.findByProperty( + TSRoleFunction.class, "TSRole.id", role.getId()); + if (roleFunctions.size() > 0) { + for (TSRoleFunction tsRoleFunction : roleFunctions) { + systemService.delete(tsRoleFunction); + } + } + List roleUsers = systemService.findByProperty( + TSRoleUser.class, "TSRole.id", role.getId()); + for (TSRoleUser tsRoleUser : roleUsers) { + systemService.delete(tsRoleUser); + } + } + + /** + * 瑙掕壊褰曞叆 + * + * @param role + * @return + */ + @RequestMapping(params = "saveRole") + @ResponseBody + public AjaxJson saveRole(TSRole role, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(role.getId())) { + message = "瑙掕壊: " + role.getRoleName() + "琚洿鏂版垚鍔"; + userService.saveOrUpdate(role); + systemService.addLog(message, Globals.Log_Type_UPDATE, + Globals.Log_Leavel_INFO); + } else { + message = "瑙掕壊: " + role.getRoleName() + "琚坊鍔犳垚鍔"; + userService.save(role); + systemService.addLog(message, Globals.Log_Type_INSERT, + Globals.Log_Leavel_INFO); + } + + return j; + } + + /** + * 瑙掕壊鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "fun") + public ModelAndView fun(HttpServletRequest request) { + String roleId = request.getParameter("roleId"); + request.setAttribute("roleId", roleId); + return new ModelAndView("system/role/roleSet"); + } + /** + + * 瑙掕壊鎵鏈夌敤鎴蜂俊鎭垪琛ㄩ〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "userList") + public ModelAndView userList(HttpServletRequest request) { + request.setAttribute("roleId", request.getParameter("roleId")); + return new ModelAndView("system/role/roleUserList"); + } + + /** + * 鐢ㄦ埛鍒楄〃鏌ヨ + * @param request + * @param response + * @param dataGrid + */ + @RequestMapping(params = "roleUserDatagrid") + public void roleUserDatagrid(TSUser user,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSUser.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + String roleId = request.getParameter("roleId"); + List roleUser = systemService.findByProperty(TSRoleUser.class, "TSRole.id", roleId); + /* + // zhanggm锛氳繖涓煡璇㈤昏緫涔熷彲浠ヤ娇鐢ㄨ繖绉 瀛愭煡璇㈢殑鏂瑰紡杩涜鏌ヨ + CriteriaQuery subCq = new CriteriaQuery(TSRoleUser.class); + subCq.setProjection(Property.forName("TSUser.id")); + subCq.eq("TSRole.id", roleId); + subCq.add(); + cq.add(Property.forName("id").in(subCq.getDetachedCriteria())); + cq.add(); + */ + Criterion cc = null; + if (roleUser.size() > 0) { + for(int i = 0; i < roleUser.size(); i++){ + if(i == 0){ + cc = Restrictions.eq("id", roleUser.get(i).getTSUser().getId()); + }else{ + cc = cq.getor(cc, Restrictions.eq("id", roleUser.get(i).getTSUser().getId())); + } + } + }else { + cc =Restrictions.eq("id", "-1"); + } + cq.add(cc); + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, user); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鑾峰彇鐢ㄦ埛鍒楄〃 + * + * @param user + * @param request + * @param response + * @param dataGrid + * @return + */ + @RequestMapping(params = "getUserList") + @ResponseBody + public List getUserList(TSUser user, HttpServletRequest request, + ComboTree comboTree) { + List comboTrees = new ArrayList(); + String roleId = request.getParameter("roleId"); + List loginActionlist = new ArrayList(); + if (user != null) { + + List roleUser = systemService.findByProperty(TSRoleUser.class, "TSRole.id", roleId); + if (roleUser.size() > 0) { + for (TSRoleUser ru : roleUser) { + loginActionlist.add(ru.getTSUser()); + } + } + } + ComboTreeModel comboTreeModel = new ComboTreeModel("id", "userName", "TSUser"); + comboTrees = systemService.ComboTree(loginActionlist,comboTreeModel,loginActionlist, false); + return comboTrees; + } + /** + * 瑙掕壊鏍戝垪琛ㄩ〉闈㈣烦杞 + * + * @return + */ + @RequestMapping(params = "roleTree") + public ModelAndView roleTree(HttpServletRequest request) { + request.setAttribute("orgId", request.getParameter("orgId")); + return new ModelAndView("system/role/roleTree"); + } + + /** + * 鑾峰彇 缁勭粐鏈烘瀯鐨勮鑹叉爲 + * + * @param request + * request + * @return 缁勭粐鏈烘瀯鐨勮鑹叉爲 + */ + @RequestMapping(params = "getRoleTree") + @ResponseBody + public List getRoleTree(HttpServletRequest request) { + ComboTreeModel comboTreeModel = new ComboTreeModel("id", "roleName", ""); + String orgId = request.getParameter("orgId"); + List orgRoleArrList = systemService + .findHql( + "from TSRole r, TSRoleOrg ro, TSDepart o WHERE r.id=ro.tsRole.id AND ro.tsDepart.id=o.id AND o.id=?", + orgId); + List orgRoleList = new ArrayList(); + for (Object[] roleArr : orgRoleArrList) { + orgRoleList.add((TSRole) roleArr[0]); + } + + List allRoleList = this.systemService.getList(TSRole.class); + List comboTrees = systemService.ComboTree(allRoleList, + comboTreeModel, orgRoleList, false); + + return comboTrees; + } + + /** + * 鏇存柊 缁勭粐鏈烘瀯鐨勮鑹插垪琛 + * + * @param request + * request + * @return 鎿嶄綔缁撴灉 + */ + @RequestMapping(params = "updateOrgRole") + @ResponseBody + public AjaxJson updateOrgRole(HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + try { + String orgId = request.getParameter("orgId"); + String roleIds = request.getParameter("roleIds"); + List roleIdList = extractIdListByComma(roleIds); + systemService.executeSql("delete from t_s_role_org where org_id=?", + orgId); + if (!roleIdList.isEmpty()) { + List roleOrgList = new ArrayList(); + TSDepart depart = new TSDepart(); + depart.setId(orgId); + for (String roleId : roleIdList) { + TSRole role = new TSRole(); + role.setId(roleId); + + TSRoleOrg roleOrg = new TSRoleOrg(); + roleOrg.setTsRole(role); + roleOrg.setTsDepart(depart); + roleOrgList.add(roleOrg); + } + systemService.batchSave(roleOrgList); + } + j.setMsg("瑙掕壊鏇存柊鎴愬姛"); + } catch (Exception e) { + logger.error(ExceptionUtil.getExceptionMessage(e)); + j.setMsg("瑙掕壊鏇存柊澶辫触"); + } + return j; + } + + /** + * 璁剧疆鏉冮檺 + * + * @param role + * @param request + * @param comboTree + * @return + */ + @RequestMapping(params = "setAuthority") + @ResponseBody + public List setAuthority(TSRole role, + HttpServletRequest request, ComboTree comboTree) { + CriteriaQuery cq = new CriteriaQuery(TSFunction.class); + if (comboTree.getId() != null) { + cq.eq("TSFunction.id", comboTree.getId()); + } + if (comboTree.getId() == null) { + cq.isNull("TSFunction"); + } + cq.notEq("functionLevel", Short.parseShort("-1")); + cq.add(); + List functionList = systemService.getListByCriteriaQuery( + cq, false); + Collections.sort(functionList, new NumberComparator()); + List comboTrees = new ArrayList(); + String roleId = request.getParameter("roleId"); + List loginActionlist = new ArrayList();// 宸叉湁鏉冮檺鑿滃崟 + role = this.systemService.get(TSRole.class, roleId); + if (role != null) { + List roleFunctionList = systemService + .findByProperty(TSRoleFunction.class, "TSRole.id", + role.getId()); + if (roleFunctionList.size() > 0) { + for (TSRoleFunction roleFunction : roleFunctionList) { + TSFunction function = (TSFunction) roleFunction + .getTSFunction(); + loginActionlist.add(function); + } + } + } + ComboTreeModel comboTreeModel = new ComboTreeModel("id", + "functionName", "TSFunctions"); + comboTrees = systemService.ComboTree(functionList, comboTreeModel, + loginActionlist, false); + + MutiLangUtil.setMutiTree(comboTrees); + return comboTrees; + } + + /** + * 鏇存柊鏉冮檺 + * + * @param request + * @return + */ + @RequestMapping(params = "updateAuthority") + @ResponseBody + public AjaxJson updateAuthority(HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + try { + String roleId = request.getParameter("roleId"); + String rolefunction = request.getParameter("rolefunctions"); + TSRole role = this.systemService.get(TSRole.class, roleId); + List roleFunctionList = systemService + .findByProperty(TSRoleFunction.class, "TSRole.id", + role.getId()); + Map map = new HashMap(); + for (TSRoleFunction functionOfRole : roleFunctionList) { + map.put(functionOfRole.getTSFunction().getId(), functionOfRole); + } + String[] roleFunctions = rolefunction.split(","); + Set set = new HashSet(); + for (String s : roleFunctions) { + set.add(s); + } + updateCompare(set, role, map); + j.setMsg("鏉冮檺鏇存柊鎴愬姛"); + } catch (Exception e) { + logger.error(ExceptionUtil.getExceptionMessage(e)); + j.setMsg("鏉冮檺鏇存柊澶辫触"); + } + return j; + } + + /** + * 鏉冮檺姣旇緝 + * + * @param set + * 鏈鏂扮殑鏉冮檺鍒楄〃 + * @param role + * 褰撳墠瑙掕壊 + * @param map + * 鏃х殑鏉冮檺鍒楄〃 + */ + private void updateCompare(Set set, TSRole role, + Map map) { + List entitys = new ArrayList(); + List deleteEntitys = new ArrayList(); + for (String s : set) { + if (map.containsKey(s)) { + map.remove(s); + } else { + TSRoleFunction rf = new TSRoleFunction(); + TSFunction f = this.systemService.get(TSFunction.class, s); + rf.setTSFunction(f); + rf.setTSRole(role); + entitys.add(rf); + } + } + Collection collection = map.values(); + Iterator it = collection.iterator(); + for (; it.hasNext();) { + deleteEntitys.add(it.next()); + } + systemService.batchSave(entitys); + systemService.deleteAllEntitie(deleteEntitys); + + } + + /** + * 瑙掕壊椤甸潰璺宠浆 + * + * @param role + * @param req + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(TSRole role, HttpServletRequest req) { + if (role.getId() != null) { + role = systemService.getEntity(TSRole.class, role.getId()); + req.setAttribute("role", role); + } + return new ModelAndView("system/role/role"); + } + + /** + * 鏉冮檺鎿嶄綔鍒楄〃 + * + * @param treegrid + * @param request + * @return + */ + @RequestMapping(params = "setOperate") + @ResponseBody + public List setOperate(HttpServletRequest request, + TreeGrid treegrid) { + String roleId = request.getParameter("roleId"); + CriteriaQuery cq = new CriteriaQuery(TSFunction.class); + if (treegrid.getId() != null) { + cq.eq("TSFunction.id", treegrid.getId()); + } + if (treegrid.getId() == null) { + cq.isNull("TSFunction"); + } + cq.add(); + List functionList = systemService.getListByCriteriaQuery( + cq, false); + List treeGrids = new ArrayList(); + Collections.sort(functionList, new SetListSort()); + TreeGridModel treeGridModel = new TreeGridModel(); + treeGridModel.setRoleid(roleId); + treeGrids = systemService.treegrid(functionList, treeGridModel); + return treeGrids; + + } + + /** + * 鎿嶄綔褰曞叆 + * + * @param request + * @return + */ + @RequestMapping(params = "saveOperate") + @ResponseBody + public AjaxJson saveOperate(HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + String fop = request.getParameter("fp"); + String roleId = request.getParameter("roleId"); + // 褰曞叆鎿嶄綔鍓嶆竻绌轰笂涓娆$殑鎿嶄綔鏁版嵁 + clearp(roleId); + String[] fun_op = fop.split(","); + String aa = ""; + String bb = ""; + // 鍙湁涓涓閫変腑 + if (fun_op.length == 1) { + bb = fun_op[0].split("_")[1]; + aa = fun_op[0].split("_")[0]; + savep(roleId, bb, aa); + } else { + // 鑷冲皯2涓閫変腑 + for (int i = 0; i < fun_op.length; i++) { + String cc = fun_op[i].split("_")[0]; // 鎿嶄綔id + if (i > 0 && bb.equals(fun_op[i].split("_")[1])) { + aa += "," + cc; + if (i == (fun_op.length - 1)) { + savep(roleId, bb, aa); + } + } else if (i > 0) { + savep(roleId, bb, aa); + aa = fun_op[i].split("_")[0]; // 鎿嶄綔ID + if (i == (fun_op.length - 1)) { + bb = fun_op[i].split("_")[1]; // 鏉冮檺id + savep(roleId, bb, aa); + } + + } else { + aa = fun_op[i].split("_")[0]; // 鎿嶄綔ID + } + bb = fun_op[i].split("_")[1]; // 鏉冮檺id + + } + } + + return j; + } + + /** + * 鏇存柊鎿嶄綔 + * + * @param roleId + * @param functionid + * @param ids + */ + public void savep(String roleId, String functionid, String ids) { + // String hql = "from TSRoleFunction t where" + " t.TSRole.id=" + + // oConvertUtils.getInt(roleId,0) + // + " " + "and t.TSFunction.id=" + oConvertUtils.getInt(functionid,0); + CriteriaQuery cq = new CriteriaQuery(TSRoleFunction.class); + cq.eq("TSRole.id", roleId); + cq.eq("TSFunction.id", functionid); + cq.add(); + List rFunctions = systemService.getListByCriteriaQuery( + cq, false); + if (rFunctions.size() > 0) { + TSRoleFunction roleFunction = rFunctions.get(0); + roleFunction.setOperation(ids); + systemService.saveOrUpdate(roleFunction); + } + } + + /** + * 娓呯┖鎿嶄綔 + * + * @param roleId + */ + public void clearp(String roleId) { + List rFunctions = systemService.findByProperty( + TSRoleFunction.class, "TSRole.id", roleId); + if (rFunctions.size() > 0) { + for (TSRoleFunction tRoleFunction : rFunctions) { + tRoleFunction.setOperation(null); + systemService.saveOrUpdate(tRoleFunction); + } + } + } + + /** + * 鎸夐挳鏉冮檺灞曠ず + * + * @param request + * @param functionId + * @param roleId + * @return + */ + @RequestMapping(params = "operationListForFunction") + public ModelAndView operationListForFunction(HttpServletRequest request, + String functionId, String roleId) { + CriteriaQuery cq = new CriteriaQuery(TSOperation.class); + cq.eq("TSFunction.id", functionId); + cq.eq("status", Short.valueOf("0")); + cq.add(); + List operationList = this.systemService + .getListByCriteriaQuery(cq, false); + Set operationCodes = systemService + .getOperationCodesByRoleIdAndFunctionId(roleId, functionId); + request.setAttribute("operationList", operationList); + request.setAttribute("operationcodes", operationCodes); + request.setAttribute("functionId", functionId); + return new ModelAndView("system/role/operationListForFunction"); + } + + /** + * 鏇存柊鎸夐挳鏉冮檺 + * + * @param request + * @return + */ + @RequestMapping(params = "updateOperation") + @ResponseBody + public AjaxJson updateOperation(HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + String roleId = request.getParameter("roleId"); + String functionId = request.getParameter("functionId"); + String operationcodes = null; + try { + operationcodes = URLDecoder.decode( + request.getParameter("operationcodes"), "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + CriteriaQuery cq1 = new CriteriaQuery(TSRoleFunction.class); + cq1.eq("TSRole.id", roleId); + cq1.eq("TSFunction.id", functionId); + cq1.add(); + List rFunctions = systemService.getListByCriteriaQuery( + cq1, false); + if (null != rFunctions && rFunctions.size() > 0) { + TSRoleFunction tsRoleFunction = rFunctions.get(0); + tsRoleFunction.setOperation(operationcodes); + systemService.saveOrUpdate(tsRoleFunction); + } + j.setMsg("鎸夐挳鏉冮檺鏇存柊鎴愬姛"); + return j; + } + +//chengchuan鏁版嵁瑙勫垯杩囨护浠g爜 + + /** + * 鎸夐挳鏉冮檺灞曠ず + * + * @param request + * @param functionId + * @param roleId + * @return + */ + @RequestMapping(params = "dataRuleListForFunction") + public ModelAndView dataRuleListForFunction(HttpServletRequest request, + String functionId, String roleId) { + CriteriaQuery cq = new CriteriaQuery(TSDataRule.class); + cq.eq("TSFunction.id", functionId); + cq.add(); + List dataRuleList = this.systemService + .getListByCriteriaQuery(cq, false); + Set dataRulecodes = systemService + .getOperationCodesByRoleIdAndruleDataId(roleId, functionId); + request.setAttribute("dataRuleList", dataRuleList); + request.setAttribute("dataRulecodes", dataRulecodes); + request.setAttribute("functionId", functionId); + return new ModelAndView("system/role/dataRuleListForFunction"); + } + + + /** + * 鏇存柊鎸夐挳鏉冮檺 + * + * @param request + * @return + */ + @RequestMapping(params = "updateDataRule") + @ResponseBody + public AjaxJson updateDataRule(HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + String roleId = request.getParameter("roleId"); + String functionId = request.getParameter("functionId"); + String dataRulecodes = null; + try { + dataRulecodes = URLDecoder.decode( + request.getParameter("dataRulecodes"), "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + CriteriaQuery cq1 = new CriteriaQuery(TSRoleFunction.class); + cq1.eq("TSRole.id", roleId); + cq1.eq("TSFunction.id", functionId); + cq1.add(); + List rFunctions = systemService.getListByCriteriaQuery( + cq1, false); + if (null != rFunctions && rFunctions.size() > 0) { + TSRoleFunction tsRoleFunction = rFunctions.get(0); + tsRoleFunction.setDataRule(dataRulecodes); + systemService.saveOrUpdate(tsRoleFunction); + } + j.setMsg("鏁版嵁鏉冮檺鏇存柊鎴愬姛"); + return j; + } + + + + /** + * 娣诲姞 鐢ㄦ埛鍒拌鑹 鐨勯〉闈 璺宠浆 + * @param req request + * @return 澶勭悊缁撴灉淇℃伅 + */ + @RequestMapping(params = "goAddUserToRole") + public ModelAndView goAddUserToOrg(HttpServletRequest req) { + return new ModelAndView("system/role/noCurRoleUserList"); + } + + /** + * 鑾峰彇 闄ゅ綋鍓 瑙掕壊涔嬪鐨勭敤鎴蜂俊鎭垪琛 + * @param request request + * @return 澶勭悊缁撴灉淇℃伅 + */ + @RequestMapping(params = "addUserToRoleList") + public void addUserToOrgList(TSUser user, HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + String roleId = request.getParameter("roleId"); + + CriteriaQuery cq = new CriteriaQuery(TSUser.class, dataGrid); + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, user); + + // 鑾峰彇 褰撳墠缁勭粐鏈烘瀯鐨勭敤鎴蜂俊鎭 + CriteriaQuery subCq = new CriteriaQuery(TSRoleUser.class); + subCq.setProjection(Property.forName("TSUser.id")); + subCq.eq("TSRole.id", roleId); + subCq.add(); + + + cq.add(Property.forName("id").notIn(subCq.getDetachedCriteria())); + cq.add(); + + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + /** + * 娣诲姞 鐢ㄦ埛鍒拌鑹 + * @param req request + * @return 澶勭悊缁撴灉淇℃伅 + */ + @RequestMapping(params = "doAddUserToRole") + @ResponseBody + public AjaxJson doAddUserToOrg(HttpServletRequest req) { + AjaxJson j = new AjaxJson(); + TSRole role = systemService.getEntity(TSRole.class, req.getParameter("roleId")); + saveRoleUserList(req, role); + message = MutiLangUtil.paramAddSuccess("common.user"); +// systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + j.setMsg(message); + + return j; + } + /** + * 淇濆瓨 瑙掕壊-鐢ㄦ埛 鍏崇郴淇℃伅 + * @param request request + * @param depart depart + */ + private void saveRoleUserList(HttpServletRequest request, TSRole role) { + String userIds = oConvertUtils.getString(request.getParameter("userIds")); + + List roleUserList = new ArrayList(); + List userIdList = extractIdListByComma(userIds); + for (String userId : userIdList) { + TSUser user = new TSUser(); + user.setId(userId); + + TSRoleUser roleUser = new TSRoleUser(); + roleUser.setTSUser(user); + roleUser.setTSRole(role); + + roleUserList.add(roleUser); + } + if (!roleUserList.isEmpty()) { + systemService.batchSave(roleUserList); + } + } +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/SystemController.java b/src/main/java/org/jeecgframework/web/system/controller/core/SystemController.java new file mode 100644 index 00000000..d63e3b1e --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/SystemController.java @@ -0,0 +1,1080 @@ +package org.jeecgframework.web.system.controller.core; + +import org.apache.log4j.Logger; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.common.UploadFile; +import org.jeecgframework.core.common.model.json.*; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.extend.hqlsearch.parse.ObjectParseUtil; +import org.jeecgframework.core.extend.hqlsearch.parse.PageValueConvertRuleEnum; +import org.jeecgframework.core.extend.hqlsearch.parse.vo.HqlRuleEnum; +import org.jeecgframework.core.util.*; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.tag.vo.easyui.ComboTreeModel; +import org.jeecgframework.tag.vo.easyui.TreeGridModel; +import org.jeecgframework.web.system.manager.ClientManager; +import org.jeecgframework.web.system.manager.ClientSort; +import org.jeecgframework.web.system.pojo.base.*; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.web.system.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.view.RedirectView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +/** + * 绫诲瀷瀛楁澶勭悊绫 + * + * @author 寮犱唬娴 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/systemController") +public class SystemController extends BaseController { + private static final Logger logger = Logger.getLogger(SystemController.class); + private UserService userService; + private SystemService systemService; + private MutiLangServiceI mutiLangService; + + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + @Autowired + public void setMutiLangService(MutiLangServiceI mutiLangService) { + this.mutiLangService = mutiLangService; + } + + public UserService getUserService() { + return userService; + } + + @Autowired + public void setUserService(UserService userService) { + this.userService = userService; + } + @RequestMapping(params = "druid") + public ModelAndView druid() { + return new ModelAndView(new RedirectView("druid/index.html")); + } + /** + * 绫诲瀷瀛楀吀鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "typeGroupTabs") + public ModelAndView typeGroupTabs(HttpServletRequest request) { + List typegroupList = systemService.loadAll(TSTypegroup.class); + request.setAttribute("typegroupList", typegroupList); + return new ModelAndView("system/type/typeGroupTabs"); + } + + /** + * 绫诲瀷鍒嗙粍鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "typeGroupList") + public ModelAndView typeGroupList(HttpServletRequest request) { + return new ModelAndView("system/type/typeGroupList"); + } + + /** + * 绫诲瀷鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "typeList") + public ModelAndView typeList(HttpServletRequest request) { + String typegroupid = request.getParameter("typegroupid"); + TSTypegroup typegroup = systemService.getEntity(TSTypegroup.class, typegroupid); + request.setAttribute("typegroup", typegroup); + return new ModelAndView("system/type/typeList"); + } + + /** + * easyuiAJAX璇锋眰鏁版嵁 + */ + + @RequestMapping(params = "typeGroupGrid") + public void typeGroupGrid(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid, TSTypegroup typegroup) { + CriteriaQuery cq = new CriteriaQuery(TSTypegroup.class, dataGrid); +// add-start--Author:zhangguoming Date:20140929 for锛氬璇█鏉′欢娣诲姞 + String typegroupname = request.getParameter("typegroupname"); + if(typegroupname != null && typegroupname.trim().length() > 0) { + typegroupname = typegroupname.trim(); + List typegroupnameKeyList = systemService.findByQueryString("select typegroupname from TSTypegroup"); + MutiLangSqlCriteriaUtil.assembleCondition(typegroupnameKeyList, cq, "typegroupname", typegroupname); + } + this.systemService.getDataGridReturn(cq, true); + MutiLangUtil.setMutiLangValueForList(dataGrid.getResults(), "typegroupname"); +// add-end--Author:zhangguoming Date:20140929 for锛氬璇█鏉′欢娣诲姞 + + TagUtil.datagrid(response, dataGrid); + } + + + /** + * easyuiAJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + */ + + @RequestMapping(params = "typeGrid") + public void typeGrid(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + String typegroupid = request.getParameter("typegroupid"); + String typename = request.getParameter("typename"); + CriteriaQuery cq = new CriteriaQuery(TSType.class, dataGrid); + cq.eq("TSTypegroup.id", typegroupid); + cq.like("typename", typename); + cq.add(); + this.systemService.getDataGridReturn(cq, true); + // add-start--Author:zhangguoming Date:20140928 for锛氬鐞嗗璇█ + MutiLangUtil.setMutiLangValueForList(dataGrid.getResults(), "typename"); + // add-end--Author:zhangguoming Date:20140928 for锛氬鐞嗗璇█ + + TagUtil.datagrid(response, dataGrid); + } + + // add-start--Author:zhangguoming Date:20140928 for锛氭暟鎹瓧鍏镐慨鏀 + /** + * 璺宠浆鍒扮被鍨嬮〉闈 + * @param request request + * @return + */ + @RequestMapping(params = "goTypeGrid") + public ModelAndView goTypeGrid(HttpServletRequest request) { + String typegroupid = request.getParameter("typegroupid"); + request.setAttribute("typegroupid", typegroupid); + return new ModelAndView("system/type/typeListForTypegroup"); + } + // add-end--Author:zhangguoming Date:20140928 for锛氭暟鎹瓧鍏镐慨鏀 +// @RequestMapping(params = "typeGroupTree") +// @ResponseBody +// public List typeGroupTree(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { +// CriteriaQuery cq = new CriteriaQuery(TSTypegroup.class); +// List typeGroupList = systemService.getListByCriteriaQuery(cq, false); +// List trees = new ArrayList(); +// for (TSTypegroup obj : typeGroupList) { +// ComboTree tree = new ComboTree(); +// tree.setId(obj.getId()); +// tree.setText(obj.getTypegroupname()); +// List types = obj.getTSTypes(); +// if (types != null) { +// if (types.size() > 0) { +// //tree.setState("closed"); +// List children = new ArrayList(); +// for (TSType type : types) { +// ComboTree tree2 = new ComboTree(); +// tree2.setId(type.getId()); +// tree2.setText(type.getTypename()); +// children.add(tree2); +// } +// tree.setChildren(children); +// } +// } +// //tree.setChecked(false); +// trees.add(tree); +// } +// return trees; +// } + + @RequestMapping(params = "typeGridTree") + @ResponseBody + @Deprecated // add-begin-end--Author:zhangguoming Date:20140928 for锛氭暟鎹瓧鍏镐慨鏀癸紝璇ユ柟娉曞惎鐢紝鏁版嵁瀛楀吀涓嶅湪宸叉爲缁撴瀯灞曠ず浜 + public List typeGridTree(HttpServletRequest request, TreeGrid treegrid) { + CriteriaQuery cq; + List treeGrids = new ArrayList(); + if (treegrid.getId() != null) { + cq = new CriteriaQuery(TSType.class); + cq.eq("TSTypegroup.id", treegrid.getId().substring(1)); + cq.add(); + List typeList = systemService.getListByCriteriaQuery(cq, false); + for (TSType obj : typeList) { + TreeGrid treeNode = new TreeGrid(); + treeNode.setId("T"+obj.getId()); + treeNode.setText(obj.getTypename()); + treeNode.setCode(obj.getTypecode()); + treeGrids.add(treeNode); + } + } else { + cq = new CriteriaQuery(TSTypegroup.class); +// add-begin--Author:zhangguoming Date:20140807 for锛氭坊鍔犲瓧鍏告煡璇㈡潯浠 + String typegroupcode = request.getParameter("typegroupcode"); + if(typegroupcode != null ) { + //begin--Author:JueYue Date:2014-8-23 for锛氫慨鏀规煡璇㈡嫾瑁 + HqlRuleEnum rule = PageValueConvertRuleEnum + .convert(typegroupcode); + Object value = PageValueConvertRuleEnum.replaceValue(rule, + typegroupcode); + ObjectParseUtil.addCriteria(cq, "typegroupcode", rule, value); + //end--Author:JueYue Date:2014-8-23 for锛氫慨鏀规煡璇㈡嫾瑁 + cq.add(); + } + String typegroupname = request.getParameter("typegroupname"); + if(typegroupname != null && typegroupname.trim().length() > 0) { + typegroupname = typegroupname.trim(); + List typegroupnameKeyList = systemService.findByQueryString("select typegroupname from TSTypegroup"); + MutiLangSqlCriteriaUtil.assembleCondition(typegroupnameKeyList, cq, "typegroupname", typegroupname); + } +// add-end--Author:zhangguoming Date:20140807 for锛氭坊鍔犲瓧鍏告煡璇㈡潯浠 + List typeGroupList = systemService.getListByCriteriaQuery(cq, false); + for (TSTypegroup obj : typeGroupList) { + TreeGrid treeNode = new TreeGrid(); + treeNode.setId("G"+obj.getId()); + treeNode.setText(obj.getTypegroupname()); + treeNode.setCode(obj.getTypegroupcode()); + treeNode.setState("closed"); + treeGrids.add(treeNode); + } + } + MutiLangUtil.setMutiTree(treeGrids); + return treeGrids; + } + +// private void assembleConditionForMutilLang(CriteriaQuery cq, String typegroupname, List typegroupnameKeyList) { +// Map typegroupnameMap = new HashMap(); +// for (String nameKey : typegroupnameKeyList) { +// String name = mutiLangService.getLang(nameKey); +// typegroupnameMap.put(nameKey, name); +// } +// List tepegroupnameParamList = new ArrayList(); +// for (Map.Entry entry : typegroupnameMap.entrySet()) { +// String key = entry.getKey(); +// String value = entry.getValue(); +// if (typegroupname.startsWith("*") && typegroupname.endsWith("*")) { +// if (value.contains(typegroupname)) { +// tepegroupnameParamList.add(key); +// } +// } else if(typegroupname.startsWith("*")) { +// if (value.endsWith(typegroupname.substring(1))) { +// tepegroupnameParamList.add(key); +// } +// } else if(typegroupname.endsWith("*")) { +// if (value.startsWith(typegroupname.substring(0, typegroupname.length() -1))) { +// tepegroupnameParamList.add(key); +// } +// } else { +// if (value.equals(typegroupname)) { +// tepegroupnameParamList.add(key); +// } +// } +// } +// +// if (tepegroupnameParamList.size() > 0) { +// cq.in("typegroupname", tepegroupnameParamList.toArray()); +// cq.add(); +// } +// } + + /** + * 鍒犻櫎绫诲瀷鍒嗙粍鎴栬呯被鍨嬶紙ID浠寮澶寸殑鏄垎缁勶級 + * + * @return + */ + @RequestMapping(params = "delTypeGridTree") + @ResponseBody + public AjaxJson delTypeGridTree(String id, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (id.startsWith("G")) {//鍒嗙粍 + TSTypegroup typegroup = systemService.getEntity(TSTypegroup.class, id.substring(1)); + message = "鏁版嵁瀛楀吀鍒嗙粍: " + mutiLangService.getLang(typegroup.getTypegroupname()) + "琚垹闄 鎴愬姛"; + systemService.delete(typegroup); + } else { + TSType type = systemService.getEntity(TSType.class, id.substring(1)); + message = "鏁版嵁瀛楀吀绫诲瀷: " + mutiLangService.getLang(type.getTypename()) + "琚垹闄 鎴愬姛"; + systemService.delete(type); + } + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + //鍒锋柊缂撳瓨 + systemService.refleshTypeGroupCach(); + j.setMsg(message); + return j; + } + + /** + * 鍒犻櫎绫诲瀷鍒嗙粍 + * + * @return + */ + @RequestMapping(params = "delTypeGroup") + @ResponseBody + public AjaxJson delTypeGroup(TSTypegroup typegroup, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + typegroup = systemService.getEntity(TSTypegroup.class, typegroup.getId()); +// add-begin--Author:zhangguoming Date:20140929 for锛氭暟鎹瓧鍏镐慨鏀 + message = "绫诲瀷鍒嗙粍: " + mutiLangService.getLang(typegroup.getTypegroupname()) + " 琚垹闄 鎴愬姛"; + if (ListUtils.isNullOrEmpty(typegroup.getTSTypes())) { + systemService.delete(typegroup); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + //鍒锋柊缂撳瓨 + systemService.refleshTypeGroupCach(); + } else { + message = "绫诲瀷鍒嗙粍: " + mutiLangService.getLang(typegroup.getTypegroupname()) + " 涓嬫湁绫诲瀷淇℃伅锛屼笉鑳藉垹闄わ紒"; + } +// add-end--Author:zhangguoming Date:20140929 for锛氭暟鎹瓧鍏镐慨鏀 + j.setMsg(message); + return j; + } + + /** + * 鍒犻櫎绫诲瀷 + * + * @return + */ + @RequestMapping(params = "delType") + @ResponseBody + public AjaxJson delType(TSType type, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + type = systemService.getEntity(TSType.class, type.getId()); + message = "绫诲瀷: " + mutiLangService.getLang(type.getTypename()) + "琚垹闄 鎴愬姛"; + systemService.delete(type); + //鍒锋柊缂撳瓨 + systemService.refleshTypesCach(type); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + j.setMsg(message); + return j; + } + + /** + * 妫鏌ュ垎缁勪唬鐮 + * + * @param request + * @return + */ + @RequestMapping(params = "checkTypeGroup") + @ResponseBody + public ValidForm checkTypeGroup(HttpServletRequest request) { + ValidForm v = new ValidForm(); + String typegroupcode=oConvertUtils.getString(request.getParameter("param")); + String code=oConvertUtils.getString(request.getParameter("code")); + List typegroups=systemService.findByProperty(TSTypegroup.class,"typegroupcode",typegroupcode); + if(typegroups.size()>0&&!code.equals(typegroupcode)) + { + v.setInfo("鍒嗙粍宸插瓨鍦"); + v.setStatus("n"); + } + return v; + } + /** + * 娣诲姞绫诲瀷鍒嗙粍 + * + * @param typegroup + * @return + */ + @RequestMapping(params = "saveTypeGroup") + @ResponseBody + public AjaxJson saveTypeGroup(TSTypegroup typegroup, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(typegroup.getId())) { + message = "绫诲瀷鍒嗙粍: " + mutiLangService.getLang(typegroup.getTypegroupname()) + "琚洿鏂版垚鍔"; + userService.saveOrUpdate(typegroup); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } else { + message = "绫诲瀷鍒嗙粍: " + mutiLangService.getLang(typegroup.getTypegroupname()) + "琚坊鍔犳垚鍔"; + userService.save(typegroup); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + //鍒锋柊缂撳瓨 + systemService.refleshTypeGroupCach(); + j.setMsg(message); + return j; + } + /** + * 妫鏌ョ被鍨嬩唬鐮 + * + * @param request + * @return + */ + @RequestMapping(params = "checkType") + @ResponseBody + public ValidForm checkType(HttpServletRequest request) { + ValidForm v = new ValidForm(); + String typecode=oConvertUtils.getString(request.getParameter("param")); + String code=oConvertUtils.getString(request.getParameter("code")); + String typeGroupCode=oConvertUtils.getString(request.getParameter("typeGroupCode")); + StringBuilder hql = new StringBuilder("FROM ").append(TSType.class.getName()).append(" AS entity WHERE 1=1 "); + hql.append(" AND entity.TSTypegroup.typegroupcode = '").append(typeGroupCode).append("'"); + hql.append(" AND entity.typecode = '").append(typecode).append("'"); + List types = this.systemService.findByQueryString(hql.toString()); + if(types.size()>0&&!code.equals(typecode)) + { + v.setInfo("绫诲瀷宸插瓨鍦"); + v.setStatus("n"); + } + return v; + } + /** + * 娣诲姞绫诲瀷 + * + * @param type + * @return + */ + @RequestMapping(params = "saveType") + @ResponseBody + public AjaxJson saveType(TSType type, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(type.getId())) { + message = "绫诲瀷: " + mutiLangService.getLang(type.getTypename()) + "琚洿鏂版垚鍔"; + userService.saveOrUpdate(type); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } else { + message = "绫诲瀷: " + mutiLangService.getLang(type.getTypename()) + "琚坊鍔犳垚鍔"; + userService.save(type); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + //鍒锋柊缂撳瓨 + systemService.refleshTypesCach(type); + j.setMsg(message); + return j; + } + + + + /** + * 绫诲瀷鍒嗙粍鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "aouTypeGroup") + public ModelAndView aouTypeGroup(TSTypegroup typegroup, HttpServletRequest req) { + if (typegroup.getId() != null) { + typegroup = systemService.getEntity(TSTypegroup.class, typegroup.getId()); + req.setAttribute("typegroup", typegroup); + } + return new ModelAndView("system/type/typegroup"); + } + + /** + * 绫诲瀷鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdateType") + public ModelAndView addorupdateType(TSType type, HttpServletRequest req) { + String typegroupid = req.getParameter("typegroupid"); + req.setAttribute("typegroupid", typegroupid); + TSTypegroup typegroup = systemService.findUniqueByProperty(TSTypegroup.class, "id", typegroupid); + String typegroupname = typegroup.getTypegroupname(); + req.setAttribute("typegroupname", mutiLangService.getLang(typegroupname)); + if (StringUtil.isNotEmpty(type.getId())) { + type = systemService.getEntity(TSType.class, type.getId()); + req.setAttribute("type", type); + } + return new ModelAndView("system/type/type"); + } + + /* + * *****************閮ㄩ棬绠$悊鎿嶄綔**************************** + */ + + /** + * 閮ㄩ棬鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "depart") + public ModelAndView depart() { + return new ModelAndView("system/depart/departList"); + } + + /** + * easyuiAJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + */ + + @RequestMapping(params = "datagridDepart") + public void datagridDepart(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSDepart.class, dataGrid); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + ; + } + + /** + * 鍒犻櫎閮ㄩ棬 + * + * @return + */ + @RequestMapping(params = "delDepart") + @ResponseBody + public AjaxJson delDepart(TSDepart depart, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + depart = systemService.getEntity(TSDepart.class, depart.getId()); + message = "閮ㄩ棬: " + depart.getDepartname() + "琚垹闄 鎴愬姛"; + systemService.delete(depart); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + return j; + } + + /** + * 娣诲姞閮ㄩ棬 + * + * @param depart + * @return + */ + @RequestMapping(params = "saveDepart") + @ResponseBody + public AjaxJson saveDepart(TSDepart depart, HttpServletRequest request) { + // 璁剧疆涓婄骇閮ㄩ棬 + String pid = request.getParameter("TSPDepart.id"); + if (pid.equals("")) { + depart.setTSPDepart(null); + } + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(depart.getId())) { + userService.saveOrUpdate(depart); + message = MutiLangUtil.paramUpdSuccess("common.department"); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + + } else { + String orgCode = systemService.generateOrgCode(depart.getId(), pid); + depart.setOrgCode(orgCode); + userService.save(depart); + message = MutiLangUtil.paramAddSuccess("common.department"); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + + } + j.setMsg(message); + return j; + } + + /** + * 閮ㄩ棬鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdateDepart") + public ModelAndView addorupdateDepart(TSDepart depart, HttpServletRequest req) { + List departList = systemService.getList(TSDepart.class); + req.setAttribute("departList", departList); + if (depart.getId() != null) { + depart = systemService.getEntity(TSDepart.class, depart.getId()); + req.setAttribute("depart", depart); + } + return new ModelAndView("system/depart/depart"); + } + + /** + * 鐖剁骇鏉冮檺鍒楄〃 + * + * @param request + * @return + */ + @RequestMapping(params = "setPFunction") + @ResponseBody + public List setPFunction(HttpServletRequest request, ComboTree comboTree) { + CriteriaQuery cq = new CriteriaQuery(TSDepart.class); + if (StringUtil.isNotEmpty(comboTree.getId())) { + cq.eq("TSPDepart.id", comboTree.getId()); + } + if (StringUtil.isEmpty(comboTree.getId())) { + cq.isNull("TSPDepart.id"); + } + cq.add(); + List departsList = systemService.getListByCriteriaQuery(cq, false); + List comboTrees = new ArrayList(); + comboTrees = systemService.comTree(departsList, comboTree); + return comboTrees; + + } + + /* + * *****************瑙掕壊绠$悊鎿嶄綔**************************** + */ + /** + * 瑙掕壊鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "role") + public ModelAndView role() { + return new ModelAndView("system/role/roleList"); + } + + /** + * easyuiAJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + */ + + @RequestMapping(params = "datagridRole") + public void datagridRole(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSRole.class, dataGrid); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎瑙掕壊 + * + * @param ids + * @return + */ + @RequestMapping(params = "delRole") + @ResponseBody + public AjaxJson delRole(TSRole role, String ids, HttpServletRequest request) { + message = "瑙掕壊: " + role.getRoleName() + "琚垹闄ゆ垚鍔"; + AjaxJson j = new AjaxJson(); + role = systemService.getEntity(TSRole.class, role.getId()); + userService.delete(role); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + j.setMsg(message); + return j; + } + + /** + * 瑙掕壊褰曞叆 + * + * @param role + * @return + */ + @RequestMapping(params = "saveRole") + @ResponseBody + public AjaxJson saveRole(TSRole role, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (role.getId() != null) { + message = "瑙掕壊: " + role.getRoleName() + "琚洿鏂版垚鍔"; + userService.saveOrUpdate(role); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } else { + message = "瑙掕壊: " + role.getRoleName() + "琚坊鍔犳垚鍔"; + userService.saveOrUpdate(role); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + + /** + * 瑙掕壊鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "fun") + public ModelAndView fun(HttpServletRequest request) { + Integer roleid = oConvertUtils.getInt(request.getParameter("roleid"), 0); + request.setAttribute("roleid", roleid); + return new ModelAndView("system/role/roleList"); + } + + /** + * 璁剧疆鏉冮檺 + * + * @param role + * @param request + * @return + */ + @RequestMapping(params = "setAuthority") + @ResponseBody + public List setAuthority(TSRole role, HttpServletRequest request, ComboTree comboTree) { + CriteriaQuery cq = new CriteriaQuery(TSFunction.class); + if (comboTree.getId() != null) { + cq.eq("TFunction.functionid", oConvertUtils.getInt(comboTree.getId(), 0)); + } + if (comboTree.getId() == null) { + cq.isNull("TFunction"); + } + cq.add(); + List functionList = systemService.getListByCriteriaQuery(cq, false); + List comboTrees = new ArrayList(); + Integer roleid = oConvertUtils.getInt(request.getParameter("roleid"), 0); + List loginActionlist = new ArrayList();// 宸叉湁鏉冮檺鑿滃崟 + role = this.systemService.get(TSRole.class, roleid); + if (role != null) { + List roleFunctionList = systemService.findByProperty(TSRoleFunction.class, "TSRole.id", role.getId()); + if (roleFunctionList.size() > 0) { + for (TSRoleFunction roleFunction : roleFunctionList) { + TSFunction function = (TSFunction) roleFunction.getTSFunction(); + loginActionlist.add(function); + } + } + } + ComboTreeModel comboTreeModel = new ComboTreeModel("id", "functionName", "TSFunctions"); + comboTrees = systemService.ComboTree(functionList, comboTreeModel, loginActionlist, false); + return comboTrees; + } + + /** + * 鏇存柊鏉冮檺 + * + * @param request + * @return + */ + @RequestMapping(params = "updateAuthority") + public String updateAuthority(HttpServletRequest request) { + Integer roleid = oConvertUtils.getInt(request.getParameter("roleid"), 0); + String rolefunction = request.getParameter("rolefunctions"); + TSRole role = this.systemService.get(TSRole.class, roleid); + List roleFunctionList = systemService.findByProperty(TSRoleFunction.class, "TSRole.id", role.getId()); + systemService.deleteAllEntitie(roleFunctionList); + String[] roleFunctions = null; + if (rolefunction != "") { + roleFunctions = rolefunction.split(","); + for (String s : roleFunctions) { + TSRoleFunction rf = new TSRoleFunction(); + TSFunction f = this.systemService.get(TSFunction.class, Integer.valueOf(s)); + rf.setTSFunction(f); + rf.setTSRole(role); + this.systemService.save(rf); + } + } + return "system/role/roleList"; + } + + /** + * 瑙掕壊椤甸潰璺宠浆 + * + * @param role + * @param req + * @return + */ + @RequestMapping(params = "addorupdateRole") + public ModelAndView addorupdateRole(TSRole role, HttpServletRequest req) { + if (role.getId() != null) { + role = systemService.getEntity(TSRole.class, role.getId()); + req.setAttribute("role", role); + } + return new ModelAndView("system/role/role"); + } + + /** + * 鎿嶄綔鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "operate") + public ModelAndView operate(HttpServletRequest request) { + String roleid = request.getParameter("roleid"); + request.setAttribute("roleid", roleid); + return new ModelAndView("system/role/functionList"); + } + + /** + * 鏉冮檺鎿嶄綔鍒楄〃 + * + * @param request + * @return + */ + @RequestMapping(params = "setOperate") + @ResponseBody + public List setOperate(HttpServletRequest request, TreeGrid treegrid) { + String roleid = request.getParameter("roleid"); + CriteriaQuery cq = new CriteriaQuery(TSFunction.class); + if (treegrid.getId() != null) { + cq.eq("TFunction.functionid", oConvertUtils.getInt(treegrid.getId(), 0)); + } + if (treegrid.getId() == null) { + cq.isNull("TFunction"); + } + cq.add(); + List functionList = systemService.getListByCriteriaQuery(cq, false); + List treeGrids = new ArrayList(); + Collections.sort(functionList, new SetListSort()); + TreeGridModel treeGridModel = new TreeGridModel(); + treeGridModel.setRoleid(roleid); + treeGrids = systemService.treegrid(functionList, treeGridModel); + return treeGrids; + + } + + /** + * 鎿嶄綔褰曞叆 + * + * @param request + * @return + */ + @RequestMapping(params = "saveOperate") + @ResponseBody + public AjaxJson saveOperate(HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + String fop = request.getParameter("fp"); + String roleid = request.getParameter("roleid"); + // 褰曞叆鎿嶄綔鍓嶆竻绌轰笂涓娆$殑鎿嶄綔鏁版嵁 + clearp(roleid); + String[] fun_op = fop.split(","); + String aa = ""; + String bb = ""; + // 鍙湁涓涓閫変腑 + if (fun_op.length == 1) { + bb = fun_op[0].split("_")[1]; + aa = fun_op[0].split("_")[0]; + savep(roleid, bb, aa); + } else { + // 鑷冲皯2涓閫変腑 + for (int i = 0; i < fun_op.length; i++) { + String cc = fun_op[i].split("_")[0]; // 鎿嶄綔id + if (i > 0 && bb.equals(fun_op[i].split("_")[1])) { + aa += "," + cc; + if (i == (fun_op.length - 1)) { + savep(roleid, bb, aa); + } + } else if (i > 0) { + savep(roleid, bb, aa); + aa = fun_op[i].split("_")[0]; // 鎿嶄綔ID + if (i == (fun_op.length - 1)) { + bb = fun_op[i].split("_")[1]; // 鏉冮檺id + savep(roleid, bb, aa); + } + + } else { + aa = fun_op[i].split("_")[0]; // 鎿嶄綔ID + } + bb = fun_op[i].split("_")[1]; // 鏉冮檺id + + } + } + + return j; + } + + /** + * 鏇存柊鎿嶄綔 + * + * @param roleid + * @param functionid + * @param ids + */ + public void savep(String roleid, String functionid, String ids) { + String hql = "from TRoleFunction t where" + " t.TSRole.id=" + roleid + " " + "and t.TFunction.functionid=" + functionid; + TSRoleFunction rFunction = systemService.singleResult(hql); + if (rFunction != null) { + rFunction.setOperation(ids); + systemService.saveOrUpdate(rFunction); + } + } + + /** + * 娓呯┖鎿嶄綔 + * + * @param roleid + */ + public void clearp(String roleid) { + String hql = "from TRoleFunction t where" + " t.TSRole.id=" + roleid; + List rFunctions = systemService.findByQueryString(hql); + if (rFunctions.size() > 0) { + for (TSRoleFunction tRoleFunction : rFunctions) { + tRoleFunction.setOperation(null); + systemService.saveOrUpdate(tRoleFunction); + } + } + } + + /************************************** 鐗堟湰缁存姢 ************************************/ + + /** + * 鐗堟湰缁存姢鍒楄〃 + */ + @RequestMapping(params = "versionList") + public void versionList(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSVersion.class, dataGrid); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + ; + } + + /** + * 鍒犻櫎鐗堟湰 + */ + + @RequestMapping(params = "delVersion") + @ResponseBody + public AjaxJson delVersion(TSVersion version, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + version = systemService.getEntity(TSVersion.class, version.getId()); + message = "鐗堟湰锛" + version.getVersionName() + "琚垹闄 鎴愬姛"; + systemService.delete(version); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + return j; + } + + /** + * 鐗堟湰娣诲姞璺宠浆 + * + * @param req + * @return + */ + @RequestMapping(params = "addversion") + public ModelAndView addversion(HttpServletRequest req) { + return new ModelAndView("system/version/version"); + } + + /** + * 淇濆瓨鐗堟湰 + * + * @param request + * @return + * @throws Exception + */ + @RequestMapping(params = "saveVersion", method = RequestMethod.POST) + @ResponseBody + public AjaxJson saveVersion(HttpServletRequest request) throws Exception { + AjaxJson j = new AjaxJson(); + TSVersion version = new TSVersion(); + String versionName = request.getParameter("versionName"); + String versionCode = request.getParameter("versionCode"); + version.setVersionCode(versionCode); + version.setVersionName(versionName); + systemService.save(version); + j.setMsg("鐗堟湰淇濆瓨鎴愬姛"); + return j; + } + + /** + * 鏂伴椈娉曡鏂囦欢鍒楄〃 + */ + @RequestMapping(params = "documentList") + public void documentList(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSDocument.class, dataGrid); + String typecode = oConvertUtils.getString(request.getParameter("typecode")); + cq.createAlias("TSType", "TSType"); + cq.eq("TSType.typecode", typecode); + cq.add(); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎鏂囨。 + * + * @param document + * @return + */ + @RequestMapping(params = "delDocument") + @ResponseBody + public AjaxJson delDocument(TSDocument document, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + document = systemService.getEntity(TSDocument.class, document.getId()); + message = "" + document.getDocumentTitle() + "琚垹闄ゆ垚鍔"; + userService.delete(document); + systemService.addLog(message, Globals.Log_Type_DEL, + Globals.Log_Leavel_INFO); + j.setSuccess(true); + j.setMsg(message); + return j; + } + + /** + * 鏂囦欢娣诲姞璺宠浆 + * + * @param req + * @return + */ + @RequestMapping(params = "addFiles") + public ModelAndView addFiles(HttpServletRequest req) { + return new ModelAndView("system/document/files"); + } + + /** + * 淇濆瓨鏂囦欢 + * + * @param document + * @return + * @throws Exception + */ + @RequestMapping(params = "saveFiles", method = RequestMethod.POST) + @ResponseBody + public AjaxJson saveFiles(HttpServletRequest request, HttpServletResponse response, TSDocument document) { + AjaxJson j = new AjaxJson(); + Map attributes = new HashMap(); + TSTypegroup tsTypegroup=systemService.getTypeGroup("fieltype","鏂囨。鍒嗙被"); + TSType tsType = systemService.getType("files","闄勪欢", tsTypegroup); + String fileKey = oConvertUtils.getString(request.getParameter("fileKey"));// 鏂囦欢ID + String documentTitle = oConvertUtils.getString(request.getParameter("documentTitle"));// 鏂囦欢鏍囬 + if (StringUtil.isNotEmpty(fileKey)) { + document.setId(fileKey); + document = systemService.getEntity(TSDocument.class, fileKey); + document.setDocumentTitle(documentTitle); + + } + document.setSubclassname(MyClassLoader.getPackPath(document)); + document.setCreatedate(DateUtils.gettimestamp()); + document.setTSType(tsType); + UploadFile uploadFile = new UploadFile(request, document); + uploadFile.setCusPath("files"); + uploadFile.setSwfpath("swfpath"); + document = systemService.uploadFile(uploadFile); + attributes.put("url", document.getRealpath()); + attributes.put("fileKey", document.getId()); + attributes.put("name", document.getAttachmenttitle()); + attributes.put("viewhref", "commonController.do?objfileList&fileKey=" + document.getId()); + attributes.put("delurl", "commonController.do?delObjFile&fileKey=" + document.getId()); + j.setMsg("鏂囦欢娣诲姞鎴愬姛"); + j.setAttributes(attributes); + return j; + } + + /** + * 鍦ㄧ嚎鐢ㄦ埛鍒楄〃 + * @param request + * @param response + * @param dataGrid + */ + + @RequestMapping(params = "datagridOnline") + public void datagridOnline(Client tSOnline,HttpServletRequest request, + HttpServletResponse response, DataGrid dataGrid) { + List onlines = new ArrayList(); + onlines.addAll(ClientManager.getInstance().getAllClient()); + dataGrid.setTotal(onlines.size()); + dataGrid.setResults(getClinetList(onlines,dataGrid)); + TagUtil.datagrid(response, dataGrid); + } + /** + * 鑾峰彇褰撳墠椤甸潰鐨勭敤鎴峰垪琛 + * @param onlines + * @param dataGrid + * @return + */ + private List getClinetList(List onlines, DataGrid dataGrid) { + Collections.sort(onlines, new ClientSort()); + List result = new ArrayList(); + for(int i = (dataGrid.getPage()-1)*dataGrid.getRows(); + i territoryGrid(HttpServletRequest request, TreeGrid treegrid) { + CriteriaQuery cq = new CriteriaQuery(TSTerritory.class); + if (treegrid.getId() != null) { + cq.eq("TSTerritory.id", treegrid.getId()); + } + if (treegrid.getId() == null) { + cq.eq("TSTerritory.id","1");//杩欎釜鏄叏鍥芥渶楂樼骇 + } + + cq.addOrder("territorySort", SortDirection.asc); + cq.add(); + List territoryList = systemService.getListByCriteriaQuery(cq, false); + List treeGrids = new ArrayList(); + TreeGridModel treeGridModel = new TreeGridModel(); + treeGridModel.setIcon(""); + treeGridModel.setTextField("territoryName"); + treeGridModel.setParentText("TSTerritory_territoryName"); + treeGridModel.setParentId("TSTerritory_id"); + treeGridModel.setSrc("territoryCode"); + treeGridModel.setIdField("id"); + treeGridModel.setChildList("TSTerritorys"); + treeGridModel.setOrder("territorySort"); + treeGrids = systemService.treegrid(territoryList, treeGridModel); + return treeGrids; + } + /** + *鍦板煙鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(TSTerritory territory, HttpServletRequest req) { + String functionid = req.getParameter("id"); + if (functionid != null) { + territory = systemService.getEntity(TSTerritory.class, functionid); + req.setAttribute("territory", territory); + } + if(territory.getTSTerritory()!=null && territory.getTSTerritory().getId()!=null){ + territory.setTSTerritory((TSTerritory)systemService.getEntity(TSTerritory.class, territory.getTSTerritory().getId())); + req.setAttribute("territory", territory); + } + return new ModelAndView("system/territory/territory"); + } + /** + * 鍦板煙鐖剁骇涓嬫媺鑿滃崟 + */ + @RequestMapping(params = "setPTerritory") + @ResponseBody + public List setPTerritory(HttpServletRequest request, ComboTree comboTree) { + CriteriaQuery cq = new CriteriaQuery(TSTerritory.class); + if (comboTree.getId() != null) { + cq.eq("TSTerritory.id", comboTree.getId()); + } + if (comboTree.getId() == null) { + cq.isNull("TSTerritory"); + } + cq.add(); + List territoryList = systemService.getListByCriteriaQuery(cq, false); + List comboTrees = new ArrayList(); + ComboTreeModel comboTreeModel = new ComboTreeModel("id", "territoryName", "TSTerritorys"); + comboTrees = systemService.ComboTree(territoryList, comboTreeModel, null, false); + return comboTrees; + } + /** + * 鍦板煙淇濆瓨 + */ + @RequestMapping(params = "saveTerritory") + @ResponseBody + public AjaxJson saveTerritory(TSTerritory territory, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + String functionOrder = territory.getTerritorySort(); + if(StringUtils.isEmpty(functionOrder)){ + territory.setTerritorySort("0"); + } + if (territory.getTSTerritory().getId().equals("")) { + territory.setTSTerritory(null); + }else{ + TSTerritory parent = systemService.getEntity(TSTerritory.class, territory.getTSTerritory().getId()); + territory.setTerritoryLevel(Short.valueOf(parent.getTerritoryLevel()+1+"")); + } + if (StringUtil.isNotEmpty(territory.getId())) { + message = "鍦板煙: " + territory.getTerritoryName() + "琚洿鏂版垚鍔"; + systemService.saveOrUpdate(territory); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + + message = MutiLangUtil.paramUpdSuccess("common.area"); + } else { + territory.setTerritorySort(territory.getTerritorySort()); + message = "鍦板煙: " + territory.getTerritoryName() + "琚坊鍔犳垚鍔"; + systemService.save(territory); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + + message = MutiLangUtil.paramAddSuccess("common.area"); + } + + j.setMsg(message); + + return j; + } + + /** + * 鍦板煙鍒犻櫎 + * + * @param ids + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(TSTerritory territory, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + territory = systemService.getEntity(TSTerritory.class, territory.getId()); + message = "鍦板煙: " + territory.getTerritoryName() + "琚垹闄ゆ垚鍔"; + systemService.delete(territory); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + message = MutiLangUtil.paramDelSuccess("common.area"); + j.setMsg(message); + return j; + } + +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/TimeTaskController.java b/src/main/java/org/jeecgframework/web/system/controller/core/TimeTaskController.java new file mode 100644 index 00000000..1d9e0372 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/TimeTaskController.java @@ -0,0 +1,197 @@ +package org.jeecgframework.web.system.controller.core; +import java.text.ParseException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.quartz.CronTrigger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.timer.DynamicTask; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.pojo.base.TSTimeTaskEntity; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.web.system.service.TimeTaskServiceI; + +import org.jeecgframework.core.util.MyBeanUtils; + + +/** + * @Title: Controller + * @Description: 瀹氭椂浠诲姟绠$悊 + * @author jueyue + * @date 2013-09-21 20:47:43 + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/timeTaskController") +public class TimeTaskController extends BaseController { + + @Autowired + private TimeTaskServiceI timeTaskService; + @Autowired + private DynamicTask dynamicTask; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * 瀹氭椂浠诲姟绠$悊鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "timeTask") + public ModelAndView timeTask(HttpServletRequest request) { + return new ModelAndView("system/timetask/timeTaskList"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(TSTimeTaskEntity timeTask,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSTimeTaskEntity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, timeTask, request.getParameterMap()); + this.timeTaskService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎瀹氭椂浠诲姟绠$悊 + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(TSTimeTaskEntity timeTask, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + timeTask = systemService.getEntity(TSTimeTaskEntity.class, timeTask.getId()); + message = "瀹氭椂浠诲姟绠$悊鍒犻櫎鎴愬姛"; + timeTaskService.delete(timeTask); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞瀹氭椂浠诲姟绠$悊 + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(TSTimeTaskEntity timeTask, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + CronTrigger trigger = new CronTrigger(); + try { + trigger.setCronExpression(timeTask.getCronExpression()); + } catch (ParseException e) { + j.setMsg("Cron琛ㄨ揪寮忛敊璇"); + return j; + } + if (StringUtil.isNotEmpty(timeTask.getId())) { + message = "瀹氭椂浠诲姟绠$悊鏇存柊鎴愬姛"; + TSTimeTaskEntity t = timeTaskService.get(TSTimeTaskEntity.class, timeTask.getId()); + try { + if(!timeTask.getCronExpression().equals(t.getCronExpression())){ + timeTask.setIsEffect("0"); + } + MyBeanUtils.copyBeanNotNull2Bean(timeTask, t); + timeTaskService.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + message = "瀹氭椂浠诲姟绠$悊鏇存柊澶辫触"; + } + } else { + message = "瀹氭椂浠诲姟绠$悊娣诲姞鎴愬姛"; + timeTaskService.save(timeTask); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + + /** + * 瀹氭椂浠诲姟绠$悊鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(TSTimeTaskEntity timeTask, HttpServletRequest req) { + if (StringUtil.isNotEmpty(timeTask.getId())) { + timeTask = timeTaskService.getEntity(TSTimeTaskEntity.class, timeTask.getId()); + req.setAttribute("timeTaskPage", timeTask); + } + return new ModelAndView("system/timetask/timeTask"); + } + + /** + * 鏇存柊浠诲姟鏃堕棿浣夸箣鐢熸晥 + */ + @RequestMapping(params = "updateTime") + @ResponseBody + public AjaxJson updateTime(TSTimeTaskEntity timeTask, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + timeTask = timeTaskService.get(TSTimeTaskEntity.class, timeTask.getId()); + boolean isUpdate = dynamicTask.updateCronExpression(timeTask.getTaskId() , timeTask.getCronExpression()); + if(isUpdate){ + timeTask.setIsEffect("1"); + timeTask.setIsStart("1"); + timeTaskService.updateEntitie(timeTask); + } + j.setMsg(isUpdate?"瀹氭椂浠诲姟绠$悊鏇存柊鎴愬姛":"瀹氭椂浠诲姟绠$悊鏇存柊澶辫触"); + return j; + } + /** + * 鍚姩鎴栬呭仠姝换鍔 + */ + @RequestMapping(params = "startOrStopTask") + @ResponseBody + public AjaxJson startOrStopTask(TSTimeTaskEntity timeTask, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + boolean isStart = timeTask.getIsStart().equals("1"); + timeTask = timeTaskService.get(TSTimeTaskEntity.class, timeTask.getId()); + boolean isSuccess = dynamicTask.startOrStop(timeTask.getTaskId() ,isStart); + if(isSuccess){ + timeTask.setIsStart(isStart?"1":"0"); + timeTaskService.updateEntitie(timeTask); + systemService.addLog((isStart?"寮鍚换鍔":"鍋滄浠诲姟")+timeTask.getTaskId(), + Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } + j.setMsg(isSuccess?"瀹氭椂浠诲姟绠$悊鏇存柊鎴愬姛":"瀹氭椂浠诲姟绠$悊鏇存柊澶辫触"); + return j; + } + +} diff --git a/src/main/java/org/jeecgframework/web/system/controller/core/UserController.java b/src/main/java/org/jeecgframework/web/system/controller/core/UserController.java new file mode 100644 index 00000000..b8b31a1b --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/controller/core/UserController.java @@ -0,0 +1,921 @@ +package org.jeecgframework.web.system.controller.core; + +import com.alibaba.fastjson.JSON; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.hibernate.criterion.Property; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.common.UploadFile; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.ComboBox; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.common.model.json.ValidForm; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.enums.SysThemesEnum; +import org.jeecgframework.core.util.*; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.tag.vo.datatable.DataTableReturn; +import org.jeecgframework.tag.vo.datatable.DataTables; +import org.jeecgframework.web.system.manager.ClientManager; +import org.jeecgframework.web.system.pojo.base.*; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.web.system.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.*; + + +/** + * @ClassName: UserController + * @Description: TODO(鐢ㄦ埛绠$悊澶勭悊绫) + * @author 寮犱唬娴 + */ +@Scope("prototype") +@Controller +@RequestMapping("/userController") +public class UserController extends BaseController { + /** + * Logger for this class + */ + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger(UserController.class); + + private UserService userService; + private SystemService systemService; + private String message = null; + + @Autowired + public void setSystemService(SystemService systemService) { + this.systemService = systemService; + } + + @Autowired + public void setUserService(UserService userService) { + this.userService = userService; + } + + + /** + * 鑿滃崟鍒楄〃 + * + * @param request + * @return + */ + @RequestMapping(params = "menu") + public void menu(HttpServletRequest request, HttpServletResponse response) { + SetListSort sort = new SetListSort(); + TSUser u = ResourceUtil.getSessionUserName(); + // 鐧婚檰鑰呯殑鏉冮檺 + Set loginActionlist = new HashSet();// 宸叉湁鏉冮檺鑿滃崟 + List rUsers = systemService.findByProperty(TSRoleUser.class, "TSUser.id", u.getId()); + for (TSRoleUser ru : rUsers) { + TSRole role = ru.getTSRole(); + List roleFunctionList = systemService.findByProperty(TSRoleFunction.class, "TSRole.id", role.getId()); + if (roleFunctionList.size() > 0) { + for (TSRoleFunction roleFunction : roleFunctionList) { + TSFunction function = (TSFunction) roleFunction.getTSFunction(); + loginActionlist.add(function); + } + } + } + List bigActionlist = new ArrayList();// 涓绾ф潈闄愯彍鍗 + List smailActionlist = new ArrayList();// 浜岀骇鏉冮檺鑿滃崟 + if (loginActionlist.size() > 0) { + for (TSFunction function : loginActionlist) { + if (function.getFunctionLevel() == 0) { + bigActionlist.add(function); + } else if (function.getFunctionLevel() == 1) { + smailActionlist.add(function); + } + } + } + // 鑿滃崟鏍忔帓搴 + Collections.sort(bigActionlist, sort); + Collections.sort(smailActionlist, sort); + String logString = ListtoMenu.getMenu(bigActionlist, smailActionlist); + // request.setAttribute("loginMenu",logString); + try { + response.getWriter().write(logString); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 鐢ㄦ埛鍒楄〃椤甸潰璺宠浆[璺宠浆鍒版爣绛惧拰鎵嬪伐缁撳悎鐨刪tml椤甸潰] + * + * @return + */ + @RequestMapping(params = "userDemo") + public String userDemo(HttpServletRequest request) { + // 缁欓儴闂ㄦ煡璇㈡潯浠朵腑鐨勪笅鎷夋鍑嗗鏁版嵁 + List departList = systemService.getList(TSDepart.class); + request.setAttribute("departsReplace", RoletoJson.listToReplaceStr(departList, "departname", "id")); + return "system/user/userList2"; + } + + + /** + * 鐢ㄦ埛鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "user") + public String user(HttpServletRequest request) { + // 缁欓儴闂ㄦ煡璇㈡潯浠朵腑鐨勪笅鎷夋鍑嗗鏁版嵁 + List departList = systemService.getList(TSDepart.class); + request.setAttribute("departsReplace", RoletoJson.listToReplaceStr(departList, "departname", "id")); + return "system/user/userList"; + } + + /** + * 鐢ㄦ埛淇℃伅 + * + * @return + */ + @RequestMapping(params = "userinfo") + public String userinfo(HttpServletRequest request) { + TSUser user = ResourceUtil.getSessionUserName(); + request.setAttribute("user", user); + return "system/user/userinfo"; + } + + /** + * 淇敼瀵嗙爜 + * + * @return + */ + @RequestMapping(params = "changepassword") + public String changepassword(HttpServletRequest request) { + TSUser user = ResourceUtil.getSessionUserName(); + request.setAttribute("user", user); + return "system/user/changepassword"; + } + + + + /** + * 淇敼瀵嗙爜 + * + * @return + */ + @RequestMapping(params = "savenewpwd") + @ResponseBody + public AjaxJson savenewpwd(HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + TSUser user = ResourceUtil.getSessionUserName(); + String password = oConvertUtils.getString(request.getParameter("password")); + String newpassword = oConvertUtils.getString(request.getParameter("newpassword")); + String pString = PasswordUtil.encrypt(user.getUserName(), password, PasswordUtil.getStaticSalt()); + if (!pString.equals(user.getPassword())) { + j.setMsg("鍘熷瘑鐮佷笉姝g‘"); + j.setSuccess(false); + } else { + try { + user.setPassword(PasswordUtil.encrypt(user.getUserName(), newpassword, PasswordUtil.getStaticSalt())); + } catch (Exception e) { + e.printStackTrace(); + } + systemService.updateEntitie(user); + j.setMsg("淇敼鎴愬姛"); + + } + return j; + } + + + /** + * + * 淇敼鐢ㄦ埛瀵嗙爜 + * @author Chj + */ + + @RequestMapping(params = "changepasswordforuser") + public ModelAndView changepasswordforuser(TSUser user, HttpServletRequest req) { + if (StringUtil.isNotEmpty(user.getId())) { + user = systemService.getEntity(TSUser.class, user.getId()); + req.setAttribute("user", user); + idandname(req, user); + System.out.println(user.getPassword()+"-----"+user.getRealName()); + } + return new ModelAndView("system/user/adminchangepwd"); + } + + + + @RequestMapping(params = "savenewpwdforuser") + @ResponseBody + public AjaxJson savenewpwdforuser(HttpServletRequest req) { + AjaxJson j = new AjaxJson(); + String id = oConvertUtils.getString(req.getParameter("id")); + String password = oConvertUtils.getString(req.getParameter("password")); + if (StringUtil.isNotEmpty(id)) { + TSUser users = systemService.getEntity(TSUser.class,id); + System.out.println(users.getUserName()); + users.setPassword(PasswordUtil.encrypt(users.getUserName(), password, PasswordUtil.getStaticSalt())); + users.setStatus(Globals.User_Normal); + users.setActivitiSync(users.getActivitiSync()); + systemService.updateEntitie(users); + message = "鐢ㄦ埛: " + users.getUserName() + "瀵嗙爜閲嶇疆鎴愬姛"; + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } + + j.setMsg(message); + + return j; + } + /** + * 閿佸畾璐︽埛 + + * + * @author pu.chen + */ + @RequestMapping(params = "lock") + @ResponseBody + public AjaxJson lock(String id, HttpServletRequest req) { + AjaxJson j = new AjaxJson(); + + TSUser user = systemService.getEntity(TSUser.class, id); + if("admin".equals(user.getUserName())){ + message = "瓒呯骇绠$悊鍛榌admin]涓嶅彲鎿嶄綔"; + j.setMsg(message); + return j; + } + String lockValue=req.getParameter("lockvalue"); + + user.setStatus(new Short(lockValue)); + try{ + userService.updateEntitie(user); + if("0".equals(lockValue)){ + message = "鐢ㄦ埛锛" + user.getUserName() + "閿佸畾鎴愬姛!"; + }else if("1".equals(lockValue)){ + message = "鐢ㄦ埛锛" + user.getUserName() + "婵娲绘垚鍔!"; + } + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + }catch(Exception e){ + message = "鎿嶄綔澶辫触!"; + } + j.setMsg(message); + return j; + } + + + /** + * 寰楀埌瑙掕壊鍒楄〃 + * + * @return + */ + @RequestMapping(params = "role") + @ResponseBody + public List role(HttpServletResponse response, HttpServletRequest request, ComboBox comboBox) { + String id = request.getParameter("id"); + List comboBoxs = new ArrayList(); + List roles = new ArrayList(); + if (StringUtil.isNotEmpty(id)) { + List roleUser = systemService.findByProperty(TSRoleUser.class, "TSUser.id", id); + if (roleUser.size() > 0) { + for (TSRoleUser ru : roleUser) { + roles.add(ru.getTSRole()); + } + } + } + List roleList = systemService.getList(TSRole.class); + comboBoxs = TagUtil.getComboBox(roleList, roles, comboBox); + return comboBoxs; + } + + /** + * 寰楀埌閮ㄩ棬鍒楄〃 + * + * @return + */ + @RequestMapping(params = "depart") + @ResponseBody + public List depart(HttpServletResponse response, HttpServletRequest request, ComboBox comboBox) { + String id = request.getParameter("id"); + List comboBoxs = new ArrayList(); + List departs = new ArrayList(); + if (StringUtil.isNotEmpty(id)) { + TSUser user = systemService.get(TSUser.class, id); +// if (user.getTSDepart() != null) { +// TSDepart depart = systemService.get(TSDepart.class, user.getTSDepart().getId()); +// departs.add(depart); +// } + // todo zhanggm 鑾峰彇鎸囧畾鐢ㄦ埛鐨勭粍缁囨満鏋勫垪琛 + List resultList = systemService.findHql("from TSDepart d,TSUserOrg uo where d.id=uo.orgId and uo.id=?", id); + for (TSDepart[] departArr : resultList) { + departs.add(departArr[0]); + } + } + List departList = systemService.getList(TSDepart.class); + comboBoxs = TagUtil.getComboBox(departList, departs, comboBox); + return comboBoxs; + } + + /** + * easyuiAJAX鐢ㄦ埛鍒楄〃璇锋眰鏁版嵁 + * @param request + * @param response + * @param dataGrid + */ + @RequestMapping(params = "datagrid") + public void datagrid(TSUser user,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSUser.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, user); + + Short[] userstate = new Short[]{Globals.User_Normal, Globals.User_ADMIN, Globals.User_Forbidden}; + cq.in("status", userstate); + String orgIds = request.getParameter("orgIds"); + List orgIdList = extractIdListByComma(orgIds); + // 鑾峰彇 褰撳墠缁勭粐鏈烘瀯鐨勭敤鎴蜂俊鎭 + if (!CollectionUtils.isEmpty(orgIdList)) { + CriteriaQuery subCq = new CriteriaQuery(TSUserOrg.class); + subCq.setProjection(Property.forName("tsUser.id")); + subCq.in("tsDepart.id", orgIdList.toArray()); + subCq.add(); + + cq.add(Property.forName("id").in(subCq.getDetachedCriteria())); + } + + cq.add(); + this.systemService.getDataGridReturn(cq, true); + List cfeList = new ArrayList(); + for (Object o : dataGrid.getResults()) { + if (o instanceof TSUser) { + TSUser cfe = (TSUser) o; + if (cfe.getId() != null && !"".equals(cfe.getId())) { + List roleUser = systemService.findByProperty(TSRoleUser.class, "TSUser.id", cfe.getId()); + if (roleUser.size() > 0) { + String roleName = ""; + for (TSRoleUser ru : roleUser) { + roleName += ru.getTSRole().getRoleName() + ","; + } + roleName = roleName.substring(0, roleName.length() - 1); + cfe.setUserKey(roleName); + } + } + cfeList.add(cfe); + } + } + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鐢ㄦ埛淇℃伅褰曞叆鍜屾洿鏂 + * + * @param user + * @param req + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(TSUser user, HttpServletRequest req) { + AjaxJson j = new AjaxJson(); + if("admin".equals(user.getUserName())){ + message = "瓒呯骇绠$悊鍛榌admin]涓嶅彲鍒犻櫎"; + j.setMsg(message); + return j; + } + user = systemService.getEntity(TSUser.class, user.getId()); + List roleUser = systemService.findByProperty(TSRoleUser.class, "TSUser.id", user.getId()); + if (!user.getStatus().equals(Globals.User_ADMIN)) { + if (roleUser.size()>0) { + // 鍒犻櫎鐢ㄦ埛鏃跺厛鍒犻櫎鐢ㄦ埛鍜岃鑹插叧绯昏〃 + delRoleUser(user); + systemService.executeSql("delete from t_s_user_org where user_id=?", user.getId()); // 鍒犻櫎 鐢ㄦ埛-鏈烘瀯 鏁版嵁 + userService.delete(user); + message = "鐢ㄦ埛锛" + user.getUserName() + "鍒犻櫎鎴愬姛"; + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + } else { + userService.delete(user); + message = "鐢ㄦ埛锛" + user.getUserName() + "鍒犻櫎鎴愬姛"; + } + } else { + message = "瓒呯骇绠$悊鍛樹笉鍙垹闄"; + } + + j.setMsg(message); + return j; + } + + public void delRoleUser(TSUser user) { + // 鍚屾鍒犻櫎鐢ㄦ埛瑙掕壊鍏宠仈琛 + List roleUserList = systemService.findByProperty(TSRoleUser.class, "TSUser.id", user.getId()); + if (roleUserList.size() >= 1) { + for (TSRoleUser tRoleUser : roleUserList) { + systemService.delete(tRoleUser); + } + } + } + /** + * 妫鏌ョ敤鎴峰悕 + * + * @param ids + * @return + */ + @RequestMapping(params = "checkUser") + @ResponseBody + public ValidForm checkUser(HttpServletRequest request) { + ValidForm v = new ValidForm(); + String userName=oConvertUtils.getString(request.getParameter("param")); + String code=oConvertUtils.getString(request.getParameter("code")); + List roles=systemService.findByProperty(TSUser.class,"userName",userName); + if(roles.size()>0&&!code.equals(userName)) + { + v.setInfo("鐢ㄦ埛鍚嶅凡瀛樺湪"); + v.setStatus("n"); + } + return v; + } + + /** + * 鐢ㄦ埛褰曞叆 + * + * @param user + * @param req + * @return + */ + + @RequestMapping(params = "saveUser") + @ResponseBody + public AjaxJson saveUser(HttpServletRequest req, TSUser user) { + AjaxJson j = new AjaxJson(); + // 寰楀埌鐢ㄦ埛鐨勮鑹 + String roleid = oConvertUtils.getString(req.getParameter("roleid")); + String password = oConvertUtils.getString(req.getParameter("password")); + if (StringUtil.isNotEmpty(user.getId())) { + TSUser users = systemService.getEntity(TSUser.class, user.getId()); + users.setEmail(user.getEmail()); + users.setOfficePhone(user.getOfficePhone()); + users.setMobilePhone(user.getMobilePhone()); + systemService.executeSql("delete from t_s_user_org where user_id=?", user.getId()); + saveUserOrgList(req, user); +// users.setTSDepart(user.getTSDepart()); + users.setRealName(user.getRealName()); + users.setStatus(Globals.User_Normal); + users.setActivitiSync(user.getActivitiSync()); + systemService.updateEntitie(users); + List ru = systemService.findByProperty(TSRoleUser.class, "TSUser.id", user.getId()); + systemService.deleteAllEntitie(ru); + message = "鐢ㄦ埛: " + users.getUserName() + "鏇存柊鎴愬姛"; + if (StringUtil.isNotEmpty(roleid)) { + saveRoleUser(users, roleid); + } + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } else { + TSUser users = systemService.findUniqueByProperty(TSUser.class, "userName",user.getUserName()); + if (users != null) { + message = "鐢ㄦ埛: " + users.getUserName() + "宸茬粡瀛樺湪"; + } else { + user.setPassword(PasswordUtil.encrypt(user.getUserName(), password, PasswordUtil.getStaticSalt())); +// if (user.getTSDepart().equals("")) { +// user.setTSDepart(null); +// } + user.setStatus(Globals.User_Normal); + systemService.save(user); + // todo zhanggm 淇濆瓨澶氫釜缁勭粐鏈烘瀯 + saveUserOrgList(req, user); + message = "鐢ㄦ埛: " + user.getUserName() + "娣诲姞鎴愬姛"; + if (StringUtil.isNotEmpty(roleid)) { + saveRoleUser(user, roleid); + } + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + + } + j.setMsg(message); + + return j; + } + /** + * 淇濆瓨 鐢ㄦ埛-缁勭粐鏈烘瀯 鍏崇郴淇℃伅 + * @param request request + * @param user user + */ + private void saveUserOrgList(HttpServletRequest request, TSUser user) { + String orgIds = oConvertUtils.getString(request.getParameter("orgIds")); + + List userOrgList = new ArrayList(); + List orgIdList = extractIdListByComma(orgIds); + for (String orgId : orgIdList) { + TSDepart depart = new TSDepart(); + depart.setId(orgId); + + TSUserOrg userOrg = new TSUserOrg(); + userOrg.setTsUser(user); + userOrg.setTsDepart(depart); + + userOrgList.add(userOrg); + } + if (!userOrgList.isEmpty()) { + systemService.batchSave(userOrgList); + } + } + + protected void saveRoleUser(TSUser user, String roleidstr) { + String[] roleids = roleidstr.split(","); + for (int i = 0; i < roleids.length; i++) { + TSRoleUser rUser = new TSRoleUser(); + TSRole role = systemService.getEntity(TSRole.class, roleids[i]); + rUser.setTSRole(role); + rUser.setTSUser(user); + systemService.save(rUser); + + } + } + + /** + * 鐢ㄦ埛閫夋嫨瑙掕壊璺宠浆椤甸潰 + * + * @return + */ + @RequestMapping(params = "roles") + public ModelAndView roles(HttpServletRequest request) { + //--author锛歾houjf-----start----date:20150531--------for: 缂栬緫鐢ㄦ埛锛岄夋嫨瑙掕壊,寮瑰嚭鐨勮鑹插垪琛ㄩ〉闈紝榛樿娌¢変腑 + ModelAndView mv = new ModelAndView("system/user/users"); + String ids = oConvertUtils.getString(request.getParameter("ids")); + mv.addObject("ids", ids); + return mv; + } + + /** + * 瑙掕壊鏄剧ず鍒楄〃 + * + * @param request + * @param response + * @param dataGrid + */ + @RequestMapping(params = "datagridRole") + public void datagridRole(TSRole tsRole, HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSRole.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, tsRole); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * easyuiAJAX璇锋眰鏁版嵁锛 鐢ㄦ埛閫夋嫨瑙掕壊鍒楄〃 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(TSUser user, HttpServletRequest req) { + List departList = new ArrayList(); + String departid = oConvertUtils.getString(req.getParameter("departid")); + if(!StringUtil.isEmpty(departid)){ + departList.add((TSDepart)systemService.getEntity(TSDepart.class,departid)); + }else { + departList.addAll((List)systemService.getList(TSDepart.class)); + } + req.setAttribute("departList", departList); + List orgIdList = new ArrayList(); + if (StringUtil.isNotEmpty(user.getId())) { + user = systemService.getEntity(TSUser.class, user.getId()); + + req.setAttribute("user", user); + idandname(req, user); + + orgIdList = systemService.findHql("select d.id from TSDepart d,TSUserOrg uo where d.id=uo.tsDepart.id and uo.tsUser.id=?", new String[]{user.getId()}); + } + req.setAttribute("orgIdList", JSON.toJSON(orgIdList)); + + return new ModelAndView("system/user/user"); + } + /** + * 鐢ㄦ埛鐨勭櫥褰曞悗鐨勭粍缁囨満鏋勯夋嫨椤甸潰 + * @param request request + * @return 鐢ㄦ埛閫夋嫨缁勭粐鏈烘瀯椤甸潰 + */ + @RequestMapping(params = "userOrgSelect") + public ModelAndView userOrgSelect(HttpServletRequest request) { + List orgList = new ArrayList(); + String userId = oConvertUtils.getString(request.getParameter("userId")); + + List orgArrList = systemService.findHql("from TSDepart d,TSUserOrg uo where d.id=uo.tsDepart.id and uo.tsUser.id=?", new String[]{userId}); + for (Object[] departs : orgArrList) { + orgList.add((TSDepart) departs[0]); + } + request.setAttribute("orgList", orgList); + + TSUser user = systemService.getEntity(TSUser.class, userId); + request.setAttribute("user", user); + + return new ModelAndView("system/user/userOrgSelect"); + } + + public void idandname(HttpServletRequest req, TSUser user) { + List roleUsers = systemService.findByProperty(TSRoleUser.class, "TSUser.id", user.getId()); + String roleId = ""; + String roleName = ""; + if (roleUsers.size() > 0) { + for (TSRoleUser tRoleUser : roleUsers) { + roleId += tRoleUser.getTSRole().getId() + ","; + roleName += tRoleUser.getTSRole().getRoleName() + ","; + } + } + req.setAttribute("id", roleId); + req.setAttribute("roleName", roleName); + + } + + /** + * 鏍规嵁閮ㄩ棬鍜岃鑹查夋嫨鐢ㄦ埛璺宠浆椤甸潰 + */ + @RequestMapping(params = "choose") + public String choose(HttpServletRequest request) { + List roles = systemService.loadAll(TSRole.class); + request.setAttribute("roleList", roles); + return "system/membership/checkuser"; + } + + /** + * 閮ㄩ棬鍜岃鑹查夋嫨鐢ㄦ埛鐨刾anel璺宠浆椤甸潰 + * + * @param request + * @return + */ + @RequestMapping(params = "chooseUser") + public String chooseUser(HttpServletRequest request) { + String departid = request.getParameter("departid"); + String roleid = request.getParameter("roleid"); + request.setAttribute("roleid", roleid); + request.setAttribute("departid", departid); + return "system/membership/userlist"; + } + + /** + * 閮ㄩ棬鍜岃鑹查夋嫨鐢ㄦ埛鐨勭敤鎴锋樉绀哄垪琛 + * + * @param request + * @param response + * @param dataGrid + */ + @RequestMapping(params = "datagridUser") + public void datagridUser(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + String departid = request.getParameter("departid"); + String roleid = request.getParameter("roleid"); + CriteriaQuery cq = new CriteriaQuery(TSUser.class, dataGrid); + if (departid.length() > 0) { + cq.eq("TDepart.departid", oConvertUtils.getInt(departid, 0)); + cq.add(); + } + String userid = ""; + if (roleid.length() > 0) { + List roleUsers = systemService.findByProperty(TSRoleUser.class, "TRole.roleid", oConvertUtils.getInt(roleid, 0)); + if (roleUsers.size() > 0) { + for (TSRoleUser tRoleUser : roleUsers) { + userid += tRoleUser.getTSUser().getId() + ","; + } + } + cq.in("userid", oConvertUtils.getInts(userid.split(","))); + cq.add(); + } + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鏍规嵁閮ㄩ棬鍜岃鑹查夋嫨鐢ㄦ埛璺宠浆椤甸潰 + */ + @RequestMapping(params = "roleDepart") + public String roleDepart(HttpServletRequest request) { + List roles = systemService.loadAll(TSRole.class); + request.setAttribute("roleList", roles); + return "system/membership/roledepart"; + } + + /** + * 閮ㄩ棬鍜岃鑹查夋嫨鐢ㄦ埛鐨刾anel璺宠浆椤甸潰 + * + * @param request + * @return + */ + @RequestMapping(params = "chooseDepart") + public ModelAndView chooseDepart(HttpServletRequest request) { + String nodeid = request.getParameter("nodeid"); + ModelAndView modelAndView = null; + if (nodeid.equals("role")) { + modelAndView = new ModelAndView("system/membership/users"); + } else { + modelAndView = new ModelAndView("system/membership/departList"); + } + return modelAndView; + } + + /** + * 閮ㄩ棬鍜岃鑹查夋嫨鐢ㄦ埛鐨勭敤鎴锋樉绀哄垪琛 + * + * @param request + * @param response + * @param dataGrid + */ + @RequestMapping(params = "datagridDepart") + public void datagridDepart(HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSDepart.class, dataGrid); + systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 娴嬭瘯 + * + * @param user + * @param req + * @return + */ + @RequestMapping(params = "test") + public void test(HttpServletRequest request, HttpServletResponse response) { + String jString = request.getParameter("_dt_json"); + DataTables dataTables = new DataTables(request); + CriteriaQuery cq = new CriteriaQuery(TSUser.class, dataTables); + String username = request.getParameter("userName"); + if (username != null) { + cq.like("userName", username); + cq.add(); + } + DataTableReturn dataTableReturn = systemService.getDataTableReturn(cq, true); + TagUtil.datatable(response, dataTableReturn, "id,userName,mobilePhone,TSDepart_departname"); + } + + /** + * 鐢ㄦ埛鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "index") + public String index() { + return "bootstrap/main"; + } + + /** + * 鐢ㄦ埛鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "main") + public String main() { + return "bootstrap/test"; + } + + /** + * 娴嬭瘯 + * + * @return + */ + @RequestMapping(params = "testpage") + public String testpage(HttpServletRequest request) { + return "test/test"; + } + + /** + * 璁剧疆绛惧悕璺宠浆椤甸潰 + * + * @param request + * @return + */ + @RequestMapping(params = "addsign") + public ModelAndView addsign(HttpServletRequest request) { + String id = request.getParameter("id"); + request.setAttribute("id", id); + return new ModelAndView("system/user/usersign"); + } + + /** + * 鐢ㄦ埛褰曞叆 + * + * @param user + * @param req + * @return + */ + + @RequestMapping(params = "savesign", method = RequestMethod.POST) + @ResponseBody + public AjaxJson savesign(HttpServletRequest req) { + UploadFile uploadFile = new UploadFile(req); + String id = uploadFile.get("id"); + TSUser user = systemService.getEntity(TSUser.class, id); + uploadFile.setRealPath("signatureFile"); + uploadFile.setCusPath("signature"); + uploadFile.setByteField("signature"); + uploadFile.setBasePath("resources"); + uploadFile.setRename(false); + uploadFile.setObject(user); + AjaxJson j = new AjaxJson(); + message = user.getUserName() + "璁剧疆绛惧悕鎴愬姛"; + systemService.uploadFile(uploadFile); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + j.setMsg(message); + + return j; + } + /** + * 娴嬭瘯缁勫悎鏌ヨ鍔熻兘 + * @param user + * @param request + * @param response + * @param dataGrid + */ + @RequestMapping(params = "testSearch") + public void testSearch(TSUser user, HttpServletRequest request,HttpServletResponse response,DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(TSUser.class, dataGrid); + if(user.getUserName()!=null){ + cq.like("userName", user.getUserName()); + } + if(user.getRealName()!=null){ + cq.like("realName", user.getRealName()); + } + cq.add(); + this.systemService.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + @RequestMapping(params = "changestyle") + public String changeStyle(HttpServletRequest request) { + TSUser user = ResourceUtil.getSessionUserName(); + if(user==null){ + return "login/login"; + } +// String indexStyle = "shortcut"; +// String cssTheme=""; +// Cookie[] cookies = request.getCookies(); +// for (Cookie cookie : cookies) { +// if(cookie==null || StringUtils.isEmpty(cookie.getName())){ +// continue; +// } +// if(cookie.getName().equalsIgnoreCase("JEECGINDEXSTYLE")){ +// indexStyle = cookie.getValue(); +// } +// if(cookie.getName().equalsIgnoreCase("JEECGCSSTHEME")){ +// cssTheme = cookie.getValue(); +// } +// } + SysThemesEnum sysThemesEnum = SysThemesUtil.getSysTheme(request); + request.setAttribute("indexStyle", sysThemesEnum.getStyle()); +// request.setAttribute("cssTheme", cssTheme); + return "system/user/changestyle"; + } + /** + * @Title: saveStyle + * @Description: 淇敼棣栭〉鏍峰紡 + * @param request + * @return AjaxJson + * @throws + */ + @RequestMapping(params = "savestyle") + @ResponseBody + public AjaxJson saveStyle(HttpServletRequest request,HttpServletResponse response) { + AjaxJson j = new AjaxJson(); + j.setSuccess(Boolean.FALSE); + TSUser user = ResourceUtil.getSessionUserName(); + if(user!=null){ + String indexStyle = request.getParameter("indexStyle"); +// String cssTheme = request.getParameter("cssTheme"); +// if(StringUtils.isNotEmpty(cssTheme)){ +// Cookie cookie4css = new Cookie("JEECGCSSTHEME", cssTheme); +// cookie4css.setMaxAge(3600*24*30); +// response.addCookie(cookie4css); +// logger.info("cssTheme:"+cssTheme); +// }else if("ace".equals(indexStyle)){ +// Cookie cookie4css = new Cookie("JEECGCSSTHEME", "metro"); +// cookie4css.setMaxAge(3600*24*30); +// response.addCookie(cookie4css); +// logger.info("cssTheme:metro"); +// }else { +// Cookie cookie4css = new Cookie("JEECGCSSTHEME", ""); +// cookie4css.setMaxAge(3600*24*30); +// response.addCookie(cookie4css); +// logger.info("cssTheme:default"); +// } + + if(StringUtils.isNotEmpty(indexStyle)){ + Cookie cookie = new Cookie("JEECGINDEXSTYLE", indexStyle); + //璁剧疆cookie鏈夋晥鏈熶负涓涓湀 + cookie.setMaxAge(3600*24*30); + response.addCookie(cookie); + logger.info("indexStyle:"+indexStyle); + j.setSuccess(Boolean.TRUE); + j.setMsg("鏍峰紡淇敼鎴愬姛锛岃鍒锋柊椤甸潰"); + } + ClientManager.getInstance().getClient().getFunctions().clear(); + }else{ + j.setMsg("璇风櫥褰曞悗鍐嶆搷浣"); + } + return j; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/dao/JeecgDictDao.java b/src/main/java/org/jeecgframework/web/system/dao/JeecgDictDao.java new file mode 100644 index 00000000..0563e12c --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/dao/JeecgDictDao.java @@ -0,0 +1,63 @@ +/**=========================================== + * Copyright (C) 2014 Tempus + * All rights reserved + * + * 椤 鐩 鍚嶏細 jeecg-framework + * 鏂 浠 鍚嶏細 JeecgDictDao.java + * 鐗堟湰淇℃伅锛 V1.0.0 + * 浣 鑰咃細 Administrator + * 鏃 鏈燂細 2014骞5鏈11鏃-涓婂崍2:07:36 + * + ============================================*/ + +package org.jeecgframework.web.system.dao; + +import java.util.List; + +import org.jeecgframework.minidao.annotation.Arguments; +import org.jeecgframework.minidao.annotation.ResultType; +import org.jeecgframework.web.system.pojo.base.DictEntity; +import org.springframework.stereotype.Repository; + +/** + * 绫 鍚 绉帮細 JeecgDictDao + * 绫 鎻 杩帮細 + * 鍒 寤 浜猴細 yiming.zhang + * 鑱旂郴鏂瑰紡锛 1374250553@qq.com + * 鍒涘缓鏃堕棿锛 2014骞5鏈11鏃 涓婂崍2:07:36 + * + * 淇 鏀 浜猴細 Administrator + * 鎿嶄綔鏃堕棿锛 2014骞5鏈11鏃 涓婂崍2:07:36 + * 鎿嶄綔鍘熷洜锛 + * + */ +@Repository("jeecgDictDao") +public interface JeecgDictDao { + + /** + * 鏂规硶鎻忚堪: 鏌ヨ鑷畾涔夊瓧鍏 + * 浣 鑰咃細 yiming.zhang + * 鏃 鏈燂細 2014骞5鏈13鏃-涓嬪崍8:27:26 + * @param dicTable + * @param dicCode + * @param dicText + * @return + * 杩斿洖绫诲瀷锛 List + */ + @Arguments({"dicTable", "dicCode", "dicText"}) + @ResultType(DictEntity.class) + public List queryCustomDict(String dicTable, String dicCode,String dicText); + + + /** + * 鏂规硶鎻忚堪: 鏌ヨ绯荤粺瀛楀吀 + * 浣 鑰咃細 yiming.zhang + * 鏃 鏈燂細 2014骞5鏈13鏃-涓嬪崍8:27:00 + * @param dicCode + * @return + * 杩斿洖绫诲瀷锛 List + */ + @Arguments({"dicCode"}) + @ResultType(DictEntity.class) + public List querySystemDict(String dicCode); +} diff --git a/src/main/java/org/jeecgframework/web/system/dao/repair/RepairDao.java b/src/main/java/org/jeecgframework/web/system/dao/repair/RepairDao.java new file mode 100644 index 00000000..a7e2a642 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/dao/repair/RepairDao.java @@ -0,0 +1,16 @@ +package org.jeecgframework.web.system.dao.repair; + +import org.springframework.stereotype.Repository; + +/** + * 宸ョ▼淇 + * @author JueYue + * @date 2013-11-11 + * @version 1.0 + */ +@Repository("repairDao") +public interface RepairDao { + + public void batchRepairTerritory(); + +} diff --git a/src/main/java/org/jeecgframework/web/system/listener/CkfinderConfiguration.java b/src/main/java/org/jeecgframework/web/system/listener/CkfinderConfiguration.java new file mode 100644 index 00000000..156c0f07 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/listener/CkfinderConfiguration.java @@ -0,0 +1,37 @@ +package org.jeecgframework.web.system.listener; + +import javax.servlet.ServletConfig; + +import org.jeecgframework.core.util.ResourceUtil; + +import com.ckfinder.connector.configuration.Configuration; + +/** + * @Title: listener + * @Description: ckfinder鐩戝惉鍣 + * @author Alexander + * @date 2013-09-19 23:01:20 + * @version V1.0 + * + */ +public class CkfinderConfiguration extends Configuration { + + String path = ""; + + public CkfinderConfiguration(ServletConfig servletConfig) { + super(servletConfig); + path = servletConfig.getServletContext().getContextPath(); + } + + + public void init() throws Exception { + super.init(); + String files = ResourceUtil.getConfigByName("ck.userfiles"); + if (files.contains("http://")) + this.baseURL = files; + else + this.baseURL = path + "/" + files + "/"; + this.baseDir = ResourceUtil.getConfigByName("ck.baseDir"); + } + +} diff --git a/src/main/java/org/jeecgframework/web/system/listener/InitListener.java b/src/main/java/org/jeecgframework/web/system/listener/InitListener.java new file mode 100644 index 00000000..94c80db9 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/listener/InitListener.java @@ -0,0 +1,60 @@ +package org.jeecgframework.web.system.listener; + +import javax.servlet.ServletContextEvent; + +import org.jeecgframework.web.system.service.DynamicDataSourceServiceI; +import org.jeecgframework.web.system.service.MenuInitService; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.util.ResourceUtil; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + + +/** + * 绯荤粺鍒濆鍖栫洃鍚櫒,鍦ㄧ郴缁熷惎鍔ㄦ椂杩愯,杩涜涓浜涘垵濮嬪寲宸ヤ綔 + * @author laien + * + */ +public class InitListener implements javax.servlet.ServletContextListener { + + + public void contextDestroyed(ServletContextEvent arg0) { + + } + + + public void contextInitialized(ServletContextEvent event) { + WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()); + SystemService systemService = (SystemService) webApplicationContext.getBean("systemService"); + MenuInitService menuInitService = (MenuInitService) webApplicationContext.getBean("menuInitService"); + MutiLangServiceI mutiLangService = (MutiLangServiceI) webApplicationContext.getBean("mutiLangService"); + DynamicDataSourceServiceI dynamicDataSourceService = (DynamicDataSourceServiceI) webApplicationContext.getBean("dynamicDataSourceService"); + + /** + * 绗竴閮ㄥ垎锛氬鏁版嵁瀛楀吀杩涜缂撳瓨 + */ + systemService.initAllTypeGroups(); + systemService.initAllTSIcons(); + + + /** + * 绗簩閮ㄥ垎锛氳嚜鍔ㄥ姞杞芥柊澧炶彍鍗曞拰鑿滃崟鎿嶄綔鏉冮檺 + * 璇存槑锛氬彧浼氭坊鍔狅紝涓嶄細鍒犻櫎锛堟坊鍔犲湪浠g爜灞傞厤缃紝浣嗘槸鍦ㄦ暟鎹簱灞傛湭閰嶇疆鐨勶級 + */ + if("true".equals(ResourceUtil.getConfigByName("auto.scan.menu.flag").toLowerCase())){ + menuInitService.initMenu(); + } + + /** + * 绗笁閮ㄥ垎锛氬姞杞藉璇█鍐呭 + */ + mutiLangService.initAllMutiLang(); + + /** + * 绗洓閮ㄥ垎锛氬姞杞介厤缃殑鏁版嵁婧愪俊鎭 + */ + dynamicDataSourceService.initDynamicDataSource(); + } + +} diff --git a/src/main/java/org/jeecgframework/web/system/listener/OnlineListener.java b/src/main/java/org/jeecgframework/web/system/listener/OnlineListener.java new file mode 100644 index 00000000..16e27c19 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/listener/OnlineListener.java @@ -0,0 +1,51 @@ +package org.jeecgframework.web.system.listener; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; + +import org.jeecgframework.web.system.manager.ClientManager; + +import org.springframework.context.ApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + + +/** + * 鐩戝惉鍦ㄧ嚎鐢ㄦ埛涓婄嚎涓嬬嚎 add by duanql 2013-06-07 + */ +public class OnlineListener implements ServletContextListener,HttpSessionListener { + + private static ApplicationContext ctx = null; + + public OnlineListener() { + } + + + public void sessionCreated(HttpSessionEvent httpSessionEvent) { + } + + + public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { + ClientManager.getInstance().removeClinet(httpSessionEvent.getSession().getId()); + } + + /** + * 鏈嶅姟鍣ㄥ垵濮嬪寲 + */ + + public void contextInitialized(ServletContextEvent evt) { + ctx = WebApplicationContextUtils.getWebApplicationContext(evt.getServletContext()); + } + + public static ApplicationContext getCtx() { + return ctx; + } + + + public void contextDestroyed(ServletContextEvent paramServletContextEvent) { + + } + +} diff --git a/src/main/java/org/jeecgframework/web/system/manager/ClientManager.java b/src/main/java/org/jeecgframework/web/system/manager/ClientManager.java new file mode 100644 index 00000000..c26c9a78 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/manager/ClientManager.java @@ -0,0 +1,74 @@ +package org.jeecgframework.web.system.manager; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.web.system.pojo.base.Client; + + +/** + * 瀵瑰湪绾跨敤鎴风殑绠$悊 + * @author JueYue + * @date 2013-9-28 + * @version 1.0 + */ +public class ClientManager { + + private static ClientManager instance = new ClientManager(); + + private ClientManager(){ + + } + + public static ClientManager getInstance(){ + return instance; + } + //private Map map = new HashMap(); + private ConcurrentHashMap map = new ConcurrentHashMap(); + /** + * + * @param sessionId + * @param client + */ + public void addClinet(String sessionId,Client client){ + Client old=map.get(sessionId); + if(old==null){ + map.putIfAbsent(sessionId, client); + }else{ + map.replace(sessionId, old,client); + } + } + /** + * sessionId + */ + public void removeClinet(String sessionId){ + map.remove(sessionId); + } + /** + * + * @param sessionId + * @return + */ + public Client getClient(String sessionId){ + return StringUtil.isEmpty(sessionId)?null:map.get(sessionId); + } + /** + * + * @return + */ + public Client getClient(){ + return map.get(ContextHolderUtils.getSession().getId()); + } + /** + * + * @return + */ + public Collection getAllClient(){ + return map.values(); + } + +} diff --git a/src/main/java/org/jeecgframework/web/system/manager/ClientSort.java b/src/main/java/org/jeecgframework/web/system/manager/ClientSort.java new file mode 100644 index 00000000..d7a5e427 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/manager/ClientSort.java @@ -0,0 +1,14 @@ +package org.jeecgframework.web.system.manager; + +import java.util.Comparator; + +import org.jeecgframework.web.system.pojo.base.Client; + +public class ClientSort implements Comparator { + + + public int compare(Client prev, Client now) { + return (int) (now.getLogindatetime().getTime()-prev.getLogindatetime().getTime()); + } + +} diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/Client.java b/src/main/java/org/jeecgframework/web/system/pojo/base/Client.java new file mode 100644 index 00000000..5d78fb7d --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/Client.java @@ -0,0 +1,72 @@ +package org.jeecgframework.web.system.pojo.base; + +import java.util.List; +import java.util.Map; + +/** + * 鍦ㄧ嚎鐢ㄦ埛瀵硅薄 + * + * @author JueYue + * @date 2013-9-28 + * @version 1.0 + */ +public class Client implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + + private TSUser user; + + private Map functions; + private Map> functionMap; + public Map> getFunctionMap() { + return functionMap; + } + + public void setFunctionMap(Map> functionMap) { + this.functionMap = functionMap; + } + + /** + * 鐢ㄦ埛IP + */ + private java.lang.String ip; + /** + *鐧诲綍鏃堕棿 + */ + private java.util.Date logindatetime; + + public TSUser getUser() { + return user; + } + + public void setUser(TSUser user) { + this.user = user; + } + + + public Map getFunctions() { + return functions; + } + + public void setFunctions(Map functions) { + this.functions = functions; + } + + public java.lang.String getIp() { + return ip; + } + + public void setIp(java.lang.String ip) { + this.ip = ip; + } + + public java.util.Date getLogindatetime() { + return logindatetime; + } + + public void setLogindatetime(java.util.Date logindatetime) { + this.logindatetime = logindatetime; + } + + +} diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/DictEntity.java b/src/main/java/org/jeecgframework/web/system/pojo/base/DictEntity.java new file mode 100644 index 00000000..a8f5c3e2 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/DictEntity.java @@ -0,0 +1,43 @@ +/**=========================================== + * Copyright (C) 2014 Tempus + * All rights reserved + * + * 椤 鐩 鍚嶏細 jeecg-framework + * 鏂 浠 鍚嶏細 DictEntity.java + * 鐗堟湰淇℃伅锛 V1.0.0 + * 浣 鑰咃細 Administrator + * 鏃 鏈燂細 2014骞5鏈11鏃-涓婂崍1:57:29 + * + ============================================*/ + +package org.jeecgframework.web.system.pojo.base; + +/** + * 绫 鍚 绉帮細 DictEntity + * 绫 鎻 杩帮細 + * 鍒 寤 浜猴細 yiming.zhang + * 鑱旂郴鏂瑰紡锛 1374250553@qq.com + * 鍒涘缓鏃堕棿锛 2014骞5鏈11鏃 涓婂崍1:57:29 + * + * 淇 鏀 浜猴細 Administrator + * 鎿嶄綔鏃堕棿锛 2014骞5鏈11鏃 涓婂崍1:57:29 + * 鎿嶄綔鍘熷洜锛 + * + */ +public class DictEntity { + private String typecode; + private String typename; + + public String getTypecode() { + return typecode; + } + public void setTypecode(String typecode) { + this.typecode = typecode; + } + public String getTypename() { + return typename; + } + public void setTypename(String typename) { + this.typename = typename; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/DuplicateCheckPage.java b/src/main/java/org/jeecgframework/web/system/pojo/base/DuplicateCheckPage.java new file mode 100644 index 00000000..0d3ccf12 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/DuplicateCheckPage.java @@ -0,0 +1,65 @@ +package org.jeecgframework.web.system.pojo.base; + +/** + *@绫:DuplicateCheckPage + *@浣滆:寮犱唬娴 + *@E-mail:zhangdaiscott@163.com + *@鏃ユ湡:2012-11-15 + *update-begin--Author:yankang Date:201309012 for锛歔TASK#63]UI搴撳父鐢ㄦ帶浠跺弬鑰冪ず渚嬨愰噸澶嶆牎楠屻 + *update-end--Author:yankang Date:20130912 for锛歔TASK#63]UI搴撳父鐢ㄦ帶浠跺弬鑰冪ず渚嬨愰噸澶嶆牎楠屻 + */ + +@SuppressWarnings("serial") +public class DuplicateCheckPage implements java.io.Serializable { + + /** + * 琛ㄥ悕 + */ + private String tableName; + + /** + * 瀛楁鍚 + */ + private String fieldName; + + /** + * 瀛楁鍊 + */ + private String fieldVlaue; + + /**缂栬緫鏁版嵁ID*/ + private String rowObid; + + public String getRowObid() { + return rowObid; + } + + public void setRowObid(String rowObid) { + this.rowObid = rowObid; + } + + public String getTableName() { + return tableName; + } + + public String getFieldName() { + return fieldName; + } + + public String getFieldVlaue() { + return fieldVlaue; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public void setFieldVlaue(String fieldVlaue) { + this.fieldVlaue = fieldVlaue; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/DynamicDataSourceEntity.java b/src/main/java/org/jeecgframework/web/system/pojo/base/DynamicDataSourceEntity.java new file mode 100644 index 00000000..d2c033de --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/DynamicDataSourceEntity.java @@ -0,0 +1,182 @@ +package org.jeecgframework.web.system.pojo.base; + +import java.util.HashMap; +import java.util.Map; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 鏁版嵁婧愰厤缃 + * @author zhangdaihao + * @date 2014-09-05 13:22:10 + * @version V1.0 + * + */ +@Entity +@Table(name = "t_s_data_source", schema = "") +@DynamicUpdate(true) +@DynamicInsert(true) +@SuppressWarnings("serial") +public class DynamicDataSourceEntity implements java.io.Serializable { + + public static Map DynamicDataSourceMap = new HashMap(); + + //鐢ㄤ簬灏哻ode,name鏀惧叆鍒扮紦瀛樹腑 + + /**id*/ + private java.lang.String id; + /**dbKey*/ + private java.lang.String dbKey; + /**description*/ + private java.lang.String description; + /**driverClass*/ + private java.lang.String driverClass; + /**url*/ + private java.lang.String url; + /**dbUser*/ + private java.lang.String dbUser; + /**dbPassword*/ + private java.lang.String dbPassword; + /**dbType*/ + private java.lang.String dbType; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,precision=36,length=36) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String dbKey + */ + @Column(name ="DB_KEY",nullable=false,precision=50,length=50) + public java.lang.String getDbKey(){ + return this.dbKey; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String dbKey + */ + public void setDbKey(java.lang.String dbKey){ + this.dbKey = dbKey; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String description + */ + @Column(name ="DESCRIPTION",nullable=false,precision=50,length=50) + public java.lang.String getDescription(){ + return this.description; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String description + */ + public void setDescription(java.lang.String description){ + this.description = description; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String driverClass + */ + @Column(name ="DRIVER_CLASS",nullable=false,precision=50,length=50) + public java.lang.String getDriverClass(){ + return this.driverClass; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String driverClass + */ + public void setDriverClass(java.lang.String driverClass){ + this.driverClass = driverClass; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String url + */ + @Column(name ="URL",nullable=false,precision=100,length=100) + public java.lang.String getUrl(){ + return this.url; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String url + */ + public void setUrl(java.lang.String url){ + this.url = url; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String dbUser + */ + @Column(name ="DB_USER",nullable=false,precision=50,length=50) + public java.lang.String getDbUser(){ + return this.dbUser; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String dbUser + */ + public void setDbUser(java.lang.String dbUser){ + this.dbUser = dbUser; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String dbPassword + */ + @Column(name ="DB_PASSWORD",nullable=true,precision=50,length=50) + public java.lang.String getDbPassword(){ + return this.dbPassword; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String dbPassword + */ + public void setDbPassword(java.lang.String dbPassword){ + this.dbPassword = dbPassword; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String dbType + */ + @Column(name ="DB_TYPE",nullable=true,precision=50,length=50) + public java.lang.String getDbType(){ + return this.dbType; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String dbType + */ + public void setDbType(java.lang.String dbType){ + this.dbType = dbType; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/MutiLangEntity.java b/src/main/java/org/jeecgframework/web/system/pojo/base/MutiLangEntity.java new file mode 100644 index 00000000..0a30a8e8 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/MutiLangEntity.java @@ -0,0 +1,219 @@ +package org.jeecgframework.web.system.pojo.base; + +import java.util.HashMap; +import java.util.Map; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 澶氳瑷 + * @author Rocky + * @date 2014-06-28 00:09:31 + * @version V1.0 + * + */ +@Entity +@Table(name = "t_s_muti_lang", schema = "") +@DynamicUpdate(true) +@DynamicInsert(true) +@SuppressWarnings("serial") +public class MutiLangEntity implements java.io.Serializable { + /**涓婚敭*/ + private java.lang.String id; + /**璇█涓婚敭*/ + private java.lang.String langKey; + /**鍐呭*/ + private java.lang.String langContext; + /**璇█*/ + private java.lang.String langCode; + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDate; + /**鍒涘缓浜虹紪鍙*/ + private java.lang.String createBy; + /**鍒涘缓浜哄鍚*/ + private java.lang.String createName; + /**鏇存柊鏃ユ湡*/ + private java.util.Date updateDate; + /**鏇存柊浜虹紪鍙*/ + private java.lang.String updateBy; + /**鏇存柊浜哄鍚*/ + private java.lang.String updateName; + + /**key:common.dash_board_en_us, value:Dashboard **/ + public static Map mutiLangMap = new HashMap(); + + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 涓婚敭 + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 涓婚敭 + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 璇█涓婚敭 + */ + @Column(name ="LANG_KEY",nullable=false,length=50) + public java.lang.String getLangKey(){ + return this.langKey; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 璇█涓婚敭 + */ + public void setLangKey(java.lang.String langKey){ + this.langKey = langKey; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍐呭 + */ + @Column(name ="LANG_CONTEXT",nullable=false,length=500) + public java.lang.String getLangContext(){ + return this.langContext; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍐呭 + */ + public void setLangContext(java.lang.String langContext){ + this.langContext = langContext; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 璇█ + */ + @Column(name ="LANG_CODE",nullable=false,length=50) + public java.lang.String getLangCode(){ + return this.langCode; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 璇█ + */ + public void setLangCode(java.lang.String langCode){ + this.langCode = langCode; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + @Column(name ="CREATE_DATE",nullable=false) + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜虹紪鍙 + */ + @Column(name ="CREATE_BY",nullable=false,length=50) + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜虹紪鍙 + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄鍚 + */ + @Column(name ="CREATE_NAME",nullable=false,length=50) + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄鍚 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鏇存柊鏃ユ湡 + */ + @Column(name ="UPDATE_DATE",nullable=false) + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鏇存柊鏃ユ湡 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏇存柊浜虹紪鍙 + */ + @Column(name ="UPDATE_BY",nullable=false,length=50) + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏇存柊浜虹紪鍙 + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏇存柊浜哄鍚 + */ + @Column(name ="UPDATE_NAME",nullable=false,length=50) + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏇存柊浜哄鍚 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSAttachment.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSAttachment.java new file mode 100644 index 00000000..2f111224 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSAttachment.java @@ -0,0 +1,138 @@ +package org.jeecgframework.web.system.pojo.base; + +import java.sql.Timestamp; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.JoinColumn; +import javax.persistence.Lob; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; + + +/** + * @author 寮犱唬娴 + * 椤圭洰闄勪欢鐖惰〃(鍏朵粬闄勪欢琛ㄩ渶缁ф壙璇ヨ〃) + */ +@Entity +@Table(name = "t_s_attachment") +@Inheritance(strategy = InheritanceType.JOINED) +public class TSAttachment extends IdEntity implements java.io.Serializable { + + + /** + * serialVersionUID:TODO锛堢敤涓鍙ヨ瘽鎻忚堪杩欎釜鍙橀噺琛ㄧず浠涔堬級 + * @since Ver 1.1 + */ + + private static final long serialVersionUID = 1L; + private TSUser TSUser;// 鍒涘缓浜 + private String businessKey;// 涓氬姟绫讳富閿 + private String subclassname;// 瀛愮被鍚嶇О鍏ㄨ矾寰 + private String attachmenttitle;// 闄勪欢鍚嶇О + private byte[] attachmentcontent;// 闄勪欢鍐呭 + private String realpath;// 闄勪欢鐗╃悊璺緞 + private Timestamp createdate; + private String note; + private String swfpath;// swf鏍煎紡璺緞 + private String extend;// 鎵╁睍鍚 + + @Column(name = "extend", length = 32) + public String getExtend() { + return extend; + } + + public void setExtend(String extend) { + this.extend = extend; + } + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "userid") + public TSUser getTSUser() { + return this.TSUser; + } + + public void setTSUser(TSUser TSUser) { + this.TSUser = TSUser; + } + + @Column(name = "businesskey", length = 32) + public String getBusinessKey() { + return businessKey; + } + + public void setBusinessKey(String businessKey) { + this.businessKey = businessKey; + } + + @Column(name = "attachmenttitle", length = 100) + public String getAttachmenttitle() { + return this.attachmenttitle; + } + + public void setAttachmenttitle(String attachmenttitle) { + this.attachmenttitle = attachmenttitle; + } + + @Column(name = "attachmentcontent",length=3000) + @Lob + public byte[] getAttachmentcontent() { + return this.attachmentcontent; + } + + public void setAttachmentcontent(byte[] attachmentcontent) { + this.attachmentcontent = attachmentcontent; + } + + @Column(name = "realpath", length = 100) + public String getRealpath() { + return this.realpath; + } + + public void setRealpath(String realpath) { + this.realpath = realpath; + } + + + @Column(name = "createdate", length = 35) + public Timestamp getCreatedate() { + return createdate; + } + + public void setCreatedate(Timestamp createdate) { + this.createdate = createdate; + } + + @Column(name = "note", length = 300) + public String getNote() { + return this.note; + } + + public void setNote(String note) { + this.note = note; + } + + @Column(name = "swfpath", length = 300) + public String getSwfpath() { + return this.swfpath; + } + + public void setSwfpath(String swfpath) { + this.swfpath = swfpath; + } + @Column(name = "subclassname", length = 300) + public String getSubclassname() { + return subclassname; + } + + public void setSubclassname(String subclassname) { + this.subclassname = subclassname; + } + + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSBaseUser.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSBaseUser.java new file mode 100644 index 00000000..7c22e159 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSBaseUser.java @@ -0,0 +1,126 @@ +package org.jeecgframework.web.system.pojo.base; + +import org.codehaus.jackson.annotate.JsonIgnore; +import org.jeecgframework.core.common.entity.IdEntity; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +/** + * 绯荤粺鐢ㄦ埛鐖剁被琛 + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_base_user") +@Inheritance(strategy = InheritanceType.JOINED) +public class TSBaseUser extends IdEntity implements java.io.Serializable { + private static final long serialVersionUID = 1L; + private String userName;// 鐢ㄦ埛鍚 + private String realName;// 鐪熷疄濮撳悕 + private String browser;// 鐢ㄦ埛浣跨敤娴忚鍣ㄧ被鍨 + private String userKey;// 鐢ㄦ埛楠岃瘉鍞竴鏍囩ず + private String password;//鐢ㄦ埛瀵嗙爜 + private Short activitiSync;//鏄惁鍚屾宸ヤ綔娴佸紩鎿 + private Short status;// 鐘舵1锛氬湪绾,2锛氱绾,0锛氱鐢 + private byte[] signature;// 绛惧悕鏂囦欢 + // private TSDepart TSDepart = new TSDepart();// 閮ㄩ棬 + private List userOrgList = new ArrayList(); + private TSDepart currentDepart = new TSDepart();// 褰撳墠閮ㄩ棬 + + @Column(name = "signature",length=3000) + public byte[] getSignature() { + return signature; + } + public void setSignature(byte[] signature) { + this.signature = signature; + } + + @Column(name = "browser", length = 20) + public String getBrowser() { + return browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + @Column(name = "userkey", length = 200) + public String getUserKey() { + return userKey; + } + + public void setUserKey(String userKey) { + this.userKey = userKey; + } + + @Column(name = "status") + public Short getStatus() { + return this.status; + } + + public void setStatus(Short status) { + this.status = status; + } + public Short getActivitiSync() { + return activitiSync; + } + @Column(name = "activitisync") + public void setActivitiSync(Short activitiSync) { + this.activitiSync = activitiSync; + } + + + @Column(name = "password", length = 100) + public String getPassword() { + return this.password; + } + + public void setPassword(String password) { + this.password = password; + } +// @JsonIgnore //getList鏌ヨ杞崲涓哄垪琛ㄦ椂澶勭悊json杞崲寮傚父 +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "departid") +// public TSDepart getTSDepart() { +// return this.TSDepart; +// } +// +// public void setTSDepart(TSDepart TSDepart) { +// this.TSDepart = TSDepart; +// } + @Column(name = "username", nullable = false, length = 10) + public String getUserName() { + return this.userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + @Column(name = "realname", length = 50) + public String getRealName() { + return this.realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + @Transient + public TSDepart getCurrentDepart() { + return currentDepart; + } + + public void setCurrentDepart(TSDepart currentDepart) { + this.currentDepart = currentDepart; + } + + @JsonIgnore + @OneToMany(mappedBy = "tsUser") + public List getUserOrgList() { + return userOrgList; + } + + public void setUserOrgList(List userOrgList) { + this.userOrgList = userOrgList; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSCategoryEntity.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSCategoryEntity.java new file mode 100644 index 00000000..122ddb05 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSCategoryEntity.java @@ -0,0 +1,295 @@ +package org.jeecgframework.web.system.pojo.base; + +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 鍒嗙被绠$悊 + * @author JueYue + * @date 2014-09-16 21:50:55 + * @version V1.0 + * + */ +@Entity +@Table(name = "t_s_category", schema = "") +@DynamicUpdate(true) +@DynamicInsert(true) +public class TSCategoryEntity implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + /** id */ + private java.lang.String id; + /** 绫诲瀷鍚嶇О */ + private java.lang.String name; + /** 绫诲瀷缂栫爜 */ + private java.lang.String code; + /** 鍒嗙被鍥炬爣 */ + private TSIcon icon; + /** 鍒涘缓浜哄悕绉 */ + private java.lang.String createName; + /** 鍒涘缓浜虹櫥褰曞悕绉 */ + private java.lang.String createBy; + /** 鍒涘缓鏃ユ湡 */ + private java.util.Date createDate; + /** 鏇存柊浜哄悕绉 */ + private java.lang.String updateName; + /** 鏇存柊浜虹櫥褰曞悕绉 */ + private java.lang.String updateBy; + /** 鏇存柊鏃ユ湡 */ + private java.util.Date updateDate; + /** 缁勭粐 */ + private java.lang.String sysOrgCode; + /** 鍏徃 */ + private java.lang.String sysCompanyCode; + /** 涓婄骇 */ + private TSCategoryEntity parent; + + private List list; + + /** + * 鏂规硶: 鍙栧緱java.lang.String + * + * @return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name = "ID", nullable = false, length = 36) + public java.lang.String getId() { + return this.id; + } + + /** + * 鏂规硶: 璁剧疆java.lang.String + * + * @param: java.lang.String id + */ + public void setId(java.lang.String id) { + this.id = id; + } + + /** + * 鏂规硶: 鍙栧緱java.lang.String + * + * @return: java.lang.String 鍒涘缓浜哄悕绉 + */ + @Column(name = "CREATE_NAME", nullable = true, length = 50) + public java.lang.String getCreateName() { + return this.createName; + } + + /** + * 鏂规硶: 璁剧疆java.lang.String + * + * @param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName) { + this.createName = createName; + } + + /** + * 鏂规硶: 鍙栧緱java.lang.String + * + * @return: java.lang.String 鍒涘缓浜虹櫥褰曞悕绉 + */ + @Column(name = "CREATE_BY", nullable = true, length = 50) + public java.lang.String getCreateBy() { + return this.createBy; + } + + /** + * 鏂规硶: 璁剧疆java.lang.String + * + * @param: java.lang.String 鍒涘缓浜虹櫥褰曞悕绉 + */ + public void setCreateBy(java.lang.String createBy) { + this.createBy = createBy; + } + + /** + * 鏂规硶: 鍙栧緱java.util.Date + * + * @return: java.util.Date 鍒涘缓鏃ユ湡 + */ + @Column(name = "CREATE_DATE", nullable = true) + public java.util.Date getCreateDate() { + return this.createDate; + } + + /** + * 鏂规硶: 璁剧疆java.util.Date + * + * @param: java.util.Date 鍒涘缓鏃ユ湡 + */ + public void setCreateDate(java.util.Date createDate) { + this.createDate = createDate; + } + + /** + * 鏂规硶: 鍙栧緱java.lang.String + * + * @return: java.lang.String 鏇存柊浜哄悕绉 + */ + @Column(name = "UPDATE_NAME", nullable = true, length = 50) + public java.lang.String getUpdateName() { + return this.updateName; + } + + /** + * 鏂规硶: 璁剧疆java.lang.String + * + * @param: java.lang.String 鏇存柊浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName) { + this.updateName = updateName; + } + + /** + * 鏂规硶: 鍙栧緱java.lang.String + * + * @return: java.lang.String 鏇存柊浜虹櫥褰曞悕绉 + */ + @Column(name = "UPDATE_BY", nullable = true, length = 50) + public java.lang.String getUpdateBy() { + return this.updateBy; + } + + /** + * 鏂规硶: 璁剧疆java.lang.String + * + * @param: java.lang.String 鏇存柊浜虹櫥褰曞悕绉 + */ + public void setUpdateBy(java.lang.String updateBy) { + this.updateBy = updateBy; + } + + /** + * 鏂规硶: 鍙栧緱java.util.Date + * + * @return: java.util.Date 鏇存柊鏃ユ湡 + */ + @Column(name = "UPDATE_DATE", nullable = true) + public java.util.Date getUpdateDate() { + return this.updateDate; + } + + /** + * 鏂规硶: 璁剧疆java.util.Date + * + * @param: java.util.Date 鏇存柊鏃ユ湡 + */ + public void setUpdateDate(java.util.Date updateDate) { + this.updateDate = updateDate; + } + + /** + * 鏂规硶: 鍙栧緱java.lang.String + * + * @return: java.lang.String 绫诲瀷鍚嶇О + */ + @Column(name = "NAME", nullable = true, length = 32) + public java.lang.String getName() { + return this.name; + } + + /** + * 鏂规硶: 璁剧疆java.lang.String + * + * @param: java.lang.String 绫诲瀷鍚嶇О + */ + public void setName(java.lang.String name) { + this.name = name; + } + + /** + * 鏂规硶: 鍙栧緱java.lang.String + * + * @return: java.lang.String 绫诲瀷缂栫爜 + */ + @Column(name = "CODE", nullable = true, length = 32) + public java.lang.String getCode() { + return this.code; + } + + /** + * 鏂规硶: 璁剧疆java.lang.String + * + * @param: java.lang.String 绫诲瀷缂栫爜 + */ + public void setCode(java.lang.String code) { + this.code = code; + } + + /** + * 鏂规硶: 鍙栧緱TSCategoryEntity + * + * @return: TSCategoryEntity 涓婄骇code + */ + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "PARENT_CODE",referencedColumnName = "code") + public TSCategoryEntity getParent() { + return this.parent; + } + + /** + * 鏂规硶: 璁剧疆TSCategoryEntity + * + * @param: TSCategoryEntity 涓婄骇 + */ + public void setParent(TSCategoryEntity parent) { + this.parent = parent; + } + + @Column(name = "SYS_ORG_CODE", nullable = true, length = 15) + public java.lang.String getSysOrgCode() { + return sysOrgCode; + } + + public void setSysOrgCode(java.lang.String sysOrgCode) { + this.sysOrgCode = sysOrgCode; + } + + @Column(name = "SYS_COMPANY_CODE", nullable = true, length = 15) + public java.lang.String getSysCompanyCode() { + return sysCompanyCode; + } + + public void setSysCompanyCode(java.lang.String sysCompanyCode) { + this.sysCompanyCode = sysCompanyCode; + } + + @OneToMany(cascade = CascadeType.REMOVE, mappedBy = "parent") + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + @ManyToOne() + @JoinColumn(name = "ICON_ID") + public TSIcon getIcon() { + return icon; + } + + public void setIcon(TSIcon icon) { + this.icon = icon; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSConfig.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSConfig.java new file mode 100644 index 00000000..60400377 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSConfig.java @@ -0,0 +1,76 @@ +package org.jeecgframework.web.system.pojo.base; +// default package + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; +import org.jeecgframework.core.common.entity.IdEntity; + +/** + * TConfig entity. + * 绯荤粺閰嶇疆绫 + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_config") +public class TSConfig extends IdEntity implements java.io.Serializable { + + private TSUser TSUser; + private String code; + private String name; + private String contents; + private String note; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "userid") + public TSUser getTSUser() { + return this.TSUser; + } + + public void setTSUser(TSUser TSUser) { + this.TSUser = TSUser; + } + @Column(name = "code", length = 100) + public String getCode() { + return this.code; + } + + public void setCode(String code) { + this.code = code; + } + + @Column(name = "name", nullable = false, length = 100) + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + @Column(name = "content", length = 300) + public String getContents() { + return this.contents; + } + + public void setContents(String contents) { + this.contents = contents; + } + + @Column(name = "note", length = 300) + public String getNote() { + return this.note; + } + + public void setNote(String note) { + this.note = note; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSDataRule.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSDataRule.java new file mode 100644 index 00000000..eb6e7f2d --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSDataRule.java @@ -0,0 +1,153 @@ +package org.jeecgframework.web.system.pojo.base; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; +/** + * + * @ClassName: TSDataRule 鏁版嵁瑙勫垯鏉冮檺琛 + * @Description: TODO + * @author Comsys-skyCc cmzcheng@gmail.com + * @date 2014-8-19 涓嬪崍2:19:29 + */ +@Entity +@Table(name = "t_s_data_rule") +public class TSDataRule extends IdEntity implements Serializable { + + /** + * @Fields serialVersionUID : TODO锛堢敤涓鍙ヨ瘽鎻忚堪杩欎釜鍙橀噺琛ㄧず浠涔堬級 + */ + + private static final long serialVersionUID = 1L; + /* + * 瑙勫垯鍚嶇О + */ + private String ruleName; + /* + * 瑙勫垯瀛楁 + */ + private String ruleColumn; + /* + * 瑙勫垯鏉′欢 + */ + private String ruleConditions; + /* + * 瑙勫垯鍊 + */ + private String ruleValue; + /* + * 鍒涘缓浜篿d + */ + private String createBy; + /* + * 鍒涘缓浜哄悕绉 + */ + private String createName; + /* + * 鍒涘缓鏃ユ湡 + */ + private Date createDate; + /* + * 鏇存柊浜篿d + */ + private String updateBy; + /* + * 鏇存柊浜哄悕鍐 + */ + private String updateName; + + private TSFunction TSFunction = new TSFunction(); + /* + *鏇存柊鏃ユ湡 + */ + private Date updateDate; + @Column(name ="rule_name",nullable=false,length=32) + public String getRuleName() { + return ruleName; + } + public void setRuleName(String ruleName) { + this.ruleName = ruleName; + } + @Column(name ="rule_column",nullable=false,length=100) + public String getRuleColumn() { + return ruleColumn; + } + public void setRuleColumn(String ruleColumn) { + this.ruleColumn = ruleColumn; + } + @Column(name ="rule_conditions",nullable=false,length=100) + public String getRuleConditions() { + return ruleConditions; + } + public void setRuleConditions(String ruleConditions) { + this.ruleConditions = ruleConditions; + } + + @Column(name ="rule_value",nullable=false,length=100) + public String getRuleValue() { + return ruleValue; + } + public void setRuleValue(String ruleValue) { + this.ruleValue = ruleValue; + } + @Column(name ="create_by",nullable=false,length=32) + public String getCreateBy() { + return createBy; + } + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + @Column(name ="create_name",nullable=false,length=32) + public String getCreateName() { + return createName; + } + public void setCreateName(String createName) { + this.createName = createName; + } + @Column(name ="create_date",nullable=false) + public Date getCreateDate() { + return createDate; + } + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + @Column(name ="update_by",nullable=false,length=32) + public String getUpdateBy() { + return updateBy; + } + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + @Column(name ="update_name",nullable=false,length=32) + public String getUpdateName() { + return updateName; + } + public void setUpdateName(String updateName) { + this.updateName = updateName; + } + @Column(name ="update_date",nullable=false) + public Date getUpdateDate() { + return updateDate; + } + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "functionId") + public TSFunction getTSFunction() { + return TSFunction; + } + + public void setTSFunction(TSFunction tSFunction) { + TSFunction = tSFunction; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSDemo.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSDemo.java new file mode 100644 index 00000000..ffed1dfc --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSDemo.java @@ -0,0 +1,83 @@ +package org.jeecgframework.web.system.pojo.base; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; + +/** + * 渚嬪瓙婕旂ず + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_demo") +public class TSDemo extends IdEntity implements java.io.Serializable { + private String demotitle;//DEMO鏍囬 + private String demourl;//DEMO鍦板潃 + private TSDemo TSDemo;//涓婄骇 + private Short demoorder;//DEMO鎺掑簭 + private String democode;//渚嬪瓙浠g爜 + private List tsDemos = new ArrayList(); + @Column(name = "demotitle", length = 200) + public String getDemotitle() { + return demotitle; + } + + public void setDemotitle(String demotitle) { + this.demotitle = demotitle; + } + + @Column(name = "demourl", length = 200) + public String getDemourl() { + return demourl; + } + + public void setDemourl(String demourl) { + this.demourl = demourl; + } + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "demopid") + public TSDemo getTSDemo() { + return TSDemo; + } + + public void setTSDemo(TSDemo tSDemo) { + TSDemo = tSDemo; + } + + @Column(name = "demoorder") + public Short getDemoorder() { + return demoorder; + } + + public void setDemoorder(Short demoorder) { + this.demoorder = demoorder; + } + + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TSDemo") + public List getTsDemos() { + return tsDemos; + } + + public void setTsDemos(List tsDemos) { + this.tsDemos = tsDemos; + } + @Column(name = "democode", length = 8000) + public String getDemocode() { + return democode; + } + + public void setDemocode(String democode) { + this.democode = democode; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSDepart.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSDepart.java new file mode 100644 index 00000000..416e3dc6 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSDepart.java @@ -0,0 +1,85 @@ +package org.jeecgframework.web.system.pojo.base; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; + +/** + * 閮ㄩ棬鏈烘瀯琛 + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_depart") +public class TSDepart extends IdEntity implements java.io.Serializable { + private TSDepart TSPDepart;//涓婄骇閮ㄩ棬 + private String departname;//閮ㄩ棬鍚嶇О + private String description;//閮ㄩ棬鎻忚堪 + private String orgCode;//鏈烘瀯缂栫爜 + private String orgType;//鏈烘瀯缂栫爜 + private List TSDeparts = new ArrayList();//涓嬪睘閮ㄩ棬 + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "parentdepartid") + public TSDepart getTSPDepart() { + return this.TSPDepart; + } + + public void setTSPDepart(TSDepart TSPDepart) { + this.TSPDepart = TSPDepart; + } + + @Column(name = "departname", nullable = false, length = 100) + public String getDepartname() { + return this.departname; + } + + public void setDepartname(String departname) { + this.departname = departname; + } + + @Column(name = "description", length = 500) + public String getDescription() { + return this.description; + } + + public void setDescription(String description) { + this.description = description; + } + + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TSPDepart") + public List getTSDeparts() { + return TSDeparts; + } + + public void setTSDeparts(List tSDeparts) { + TSDeparts = tSDeparts; + } + + @Column(name = "org_code", length = 64) + public String getOrgCode() { + return orgCode; + } + + public void setOrgCode(String orgCode) { + this.orgCode = orgCode; + } + + @Column(name = "org_type", length = 1) + public String getOrgType() { + return orgType; + } + + public void setOrgType(String orgType) { + this.orgType = orgType; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSDocument.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSDocument.java new file mode 100644 index 00000000..62a3fb64 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSDocument.java @@ -0,0 +1,61 @@ +package org.jeecgframework.web.system.pojo.base; +// default package + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.Table; + +/** + * 鏂囨。涓嬭浇,鏂伴椈,娉曡琛 + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_document") +@PrimaryKeyJoinColumn(name = "id") +public class TSDocument extends TSAttachment implements java.io.Serializable { + private String documentTitle;//鏂囨。鏍囬 + private byte[] pictureIndex;//鐒︾偣鍥惧鑸 + private Short documentState;//鐘舵侊細0鏈彂甯冿紝1宸插彂甯 + private Short showHome;//鏄惁棣栭〉鏄剧ず + private TSType TSType;//鏂囨。鍒嗙被 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "typeid") + public TSType getTSType() { + return TSType; + } + public void setTSType(TSType tSType) { + TSType = tSType; + } + @Column(name = "documenttitle", length = 100) + public String getDocumentTitle() { + return documentTitle; + } + public void setDocumentTitle(String documentTitle) { + this.documentTitle = documentTitle; + } + @Column(name = "pictureindex",length=3000) + public byte[] getPictureIndex() { + return pictureIndex; + } + public void setPictureIndex(byte[] pictureIndex) { + this.pictureIndex = pictureIndex; + } + @Column(name = "documentstate") + public Short getDocumentState() { + return documentState; + } + public void setDocumentState(Short documentState) { + this.documentState = documentState; + } + @Column(name = "showhome") + public Short getShowHome() { + return showHome; + } + public void setShowHome(Short showHome) { + this.showHome = showHome; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSFileno.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSFileno.java new file mode 100644 index 00000000..032c8e89 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSFileno.java @@ -0,0 +1,60 @@ +package org.jeecgframework.web.system.pojo.base; + +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import org.jeecgframework.core.common.entity.IdEntity; + + +/** + * TLog entity. + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_fileno") +public class TSFileno extends IdEntity implements java.io.Serializable { + private String filenoBefore; + private int filenoNum; + private Date filenoYear; + private String filenoType; + + @Column(name = "filenobefore", length = 32) + public String getFilenoBefore() { + return filenoBefore; + } + + public void setFilenoBefore(String filenoBefore) { + this.filenoBefore = filenoBefore; + } + @Column(name = "filenonum") + public int getFilenoNum() { + return filenoNum; + } + + public void setFilenoNum(int filenoNum) { + this.filenoNum = filenoNum; + } + + @Column(name = "filenotype", length = 32) + public String getFilenoType() { + return filenoType; + } + + public void setFilenoType(String filenoType) { + this.filenoType = filenoType; + } + @Temporal(TemporalType.DATE) + @Column(name = "filenoYear", length = 13) + public Date getFilenoYear() { + return filenoYear; + } + + public void setFilenoYear(Date filenoYear) { + this.filenoYear = filenoYear; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSFunction.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSFunction.java new file mode 100644 index 00000000..7516b106 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSFunction.java @@ -0,0 +1,149 @@ +package org.jeecgframework.web.system.pojo.base; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.Formula; +import org.jeecgframework.core.common.entity.IdEntity; + +/** + *鑿滃崟鏉冮檺琛 + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_function") +@org.hibernate.annotations.Proxy(lazy = false) + +public class TSFunction extends IdEntity implements java.io.Serializable { + private TSFunction TSFunction;//鐖惰彍鍗 + private String functionName;//鑿滃崟鍚嶇О + private Short functionLevel;//鑿滃崟绛夌骇 + private String functionUrl;//鑿滃崟鍦板潃 + private Short functionIframe;//鑿滃崟鍦板潃鎵撳紑鏂瑰紡 + private String functionOrder;//鑿滃崟鎺掑簭 + private Short functionType;//鑿滃崟绫诲瀷 + private TSIcon TSIcon = new TSIcon();//鑿滃崟鍥炬爣 + private TSIcon TSIconDesk;// 浜戞闈㈣彍鍗曞浘鏍 + + /*private int subFunctionSize; + @Formula(value = "(SELECT count(t_s_function.id) FROM t_s_function where t_s_function.parentfunctionid = id)") + public int getSubFunctionSize() { + return subFunctionSize; + }*/ + public boolean hasSubFunction(Map> map) { + if(map.containsKey(this.getFunctionLevel()+1)){ + return hasSubFunction(map.get(this.getFunctionLevel()+1)); + } + return false; + } + public boolean hasSubFunction(List functions) { + for (TSFunction f : functions) { + if(f.getTSFunction().getId().equals(this.getId())){ + return true; + } + } + return false; + } + /*public void setSubFunctionSize(int subFunctionSize) { + this.subFunctionSize = subFunctionSize; + }*/ + + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "desk_iconid") + public TSIcon getTSIconDesk() { + return TSIconDesk; + } + public void setTSIconDesk(TSIcon TSIconDesk) { + this.TSIconDesk = TSIconDesk; + } + + private List TSFunctions = new ArrayList(); + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "iconid") + public TSIcon getTSIcon() { + return TSIcon; + } + public void setTSIcon(TSIcon tSIcon) { + TSIcon = tSIcon; + } + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "parentfunctionid") + public TSFunction getTSFunction() { + return this.TSFunction; + } + + public void setTSFunction(TSFunction TSFunction) { + this.TSFunction = TSFunction; + } + + @Column(name = "functionname", nullable = false, length = 50) + public String getFunctionName() { + return this.functionName; + } + + public void setFunctionName(String functionName) { + this.functionName = functionName; + } + + @Column(name = "functionlevel") + public Short getFunctionLevel() { + return this.functionLevel; + } + + public void setFunctionLevel(Short functionLevel) { + this.functionLevel = functionLevel; + } + + @Column(name = "functiontype") + public Short getFunctionType() { + return this.functionType; + } + + public void setFunctionType(Short functionType) { + this.functionType = functionType; + } + + @Column(name = "functionurl", length = 100) + public String getFunctionUrl() { + return this.functionUrl; + } + + public void setFunctionUrl(String functionUrl) { + this.functionUrl = functionUrl; + } + @Column(name = "functionorder") + public String getFunctionOrder() { + return functionOrder; + } + + public void setFunctionOrder(String functionOrder) { + this.functionOrder = functionOrder; + } + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TSFunction") + public List getTSFunctions() { + return TSFunctions; + } + public void setTSFunctions(List TSFunctions) { + this.TSFunctions = TSFunctions; + } + @Column(name = "functioniframe") + public Short getFunctionIframe() { + return functionIframe; + } + public void setFunctionIframe(Short functionIframe) { + this.functionIframe = functionIframe; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSIcon.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSIcon.java new file mode 100644 index 00000000..ee6995d9 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSIcon.java @@ -0,0 +1,89 @@ +package org.jeecgframework.web.system.pojo.base; +// default package + +import static javax.persistence.GenerationType.SEQUENCE; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; +import org.jeecgframework.core.common.entity.IdEntity; + +/** + * TIcon entity. + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_icon") +public class TSIcon extends IdEntity implements java.io.Serializable { + public static Map allTSIcons = new HashMap(); + + private String iconName; + private Short iconType; + private String iconPath; + private byte[] iconContent; + private String iconClas; + private String extend; + @Column(name = "name", nullable = false, length = 100) + public String getIconName() { + return this.iconName; + } + + public void setIconName(String iconName) { + this.iconName = iconName; + } + + @Column(name = "type") + public Short getIconType() { + return this.iconType; + } + + public void setIconType(Short iconType) { + this.iconType = iconType; + } + + @Column(name = "path", length = 300,precision =300) + public String getIconPath() { + return this.iconPath; + } + + public void setIconPath(String iconPath) { + this.iconPath = iconPath; + } + @Column(name = "iconclas", length = 200) + public String getIconClas() { + return iconClas; + } + public void setIconClas(String iconClas) { + this.iconClas = iconClas; + } + + public void setIconContent(byte[] iconContent) { + this.iconContent = iconContent; + } + @Column(name = "content",length = 1000,precision =3000) + public byte[] getIconContent() { + return iconContent; + } + @Column(name = "extend") + public String getExtend() { + return extend; + } + + public void setExtend(String extend) { + this.extend = extend; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSLog.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSLog.java new file mode 100644 index 00000000..fcbd2093 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSLog.java @@ -0,0 +1,92 @@ +package org.jeecgframework.web.system.pojo.base; + +import java.sql.Timestamp; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; + + +/** + * TLog entity. + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_log") +public class TSLog extends IdEntity implements java.io.Serializable { + private TSUser TSUser; + private Short loglevel; + private Timestamp operatetime; + private Short operatetype; + private String logcontent; + private String broswer;//鐢ㄦ埛娴忚鍣ㄧ被鍨 + private String note; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "userid") + public TSUser getTSUser() { + return this.TSUser; + } + + public void setTSUser(TSUser TSUser) { + this.TSUser = TSUser; + } + + @Column(name = "loglevel") + public Short getLoglevel() { + return this.loglevel; + } + + public void setLoglevel(Short loglevel) { + this.loglevel = loglevel; + } + + @Column(name = "operatetime", nullable = false, length = 35) + public Timestamp getOperatetime() { + return this.operatetime; + } + + public void setOperatetime(Timestamp operatetime) { + this.operatetime = operatetime; + } + + @Column(name = "operatetype") + public Short getOperatetype() { + return this.operatetype; + } + + public void setOperatetype(Short operatetype) { + this.operatetype = operatetype; + } + + @Column(name = "logcontent", nullable = false, length = 2000) + public String getLogcontent() { + return this.logcontent; + } + + public void setLogcontent(String logcontent) { + this.logcontent = logcontent; + } + + @Column(name = "note", length = 300) + public String getNote() { + return this.note; + } + + public void setNote(String note) { + this.note = note; + } + @Column(name = "broswer", length = 100) + public String getBroswer() { + return broswer; + } + + public void setBroswer(String broswer) { + this.broswer = broswer; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSOperation.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSOperation.java new file mode 100644 index 00000000..dc1c2c27 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSOperation.java @@ -0,0 +1,107 @@ +package org.jeecgframework.web.system.pojo.base; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; + +/** + * 鏉冮檺鎿嶄綔琛 + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_operation") +public class TSOperation extends IdEntity implements java.io.Serializable { + private String operationname; + private String operationcode; + private String operationicon; + private Short status; + private TSIcon TSIcon = new TSIcon(); + private TSFunction TSFunction = new TSFunction(); + + private Short operationType; + + @Column(name = "operationtype") + public Short getOperationType() { + return operationType; + } + + public void setOperationType(Short operationType) { + this.operationType = operationType; + } + + @Column(name = "operationname", length = 50) + public String getOperationname() { + return this.operationname; + } + + public void setOperationname(String operationname) { + this.operationname = operationname; + } + + @Column(name = "operationcode", length = 50) + public String getOperationcode() { + return this.operationcode; + } + + public void setOperationcode(String operationcode) { + this.operationcode = operationcode; + } + + @Column(name = "operationicon", length = 100) + public String getOperationicon() { + return this.operationicon; + } + + public void setOperationicon(String operationicon) { + this.operationicon = operationicon; + } + + @Column(name = "status") + public Short getStatus() { + return this.status; + } + + public void setStatus(Short status) { + this.status = status; + } + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "iconid") + public TSIcon getTSIcon() { + return TSIcon; + } + + public void setTSIcon(TSIcon tSIcon) { + TSIcon = tSIcon; + } + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "functionid") + public TSFunction getTSFunction() { + return TSFunction; + } + + public void setTSFunction(TSFunction tSFunction) { + TSFunction = tSFunction; + } + + @Override + public boolean equals(Object obj) { + if(this == obj) + return false; + if(obj == null) + return false; + if(getClass() != obj.getClass() ) + return false; + TSOperation other = (TSOperation)obj; + if (getId().equals(other.getId())){ + return true; + }else { + return false; + } + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSOpinTemplate.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSOpinTemplate.java new file mode 100644 index 00000000..09b9559b --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSOpinTemplate.java @@ -0,0 +1,38 @@ +package org.jeecgframework.web.system.pojo.base; +// default package + +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; +import org.jeecgframework.core.common.entity.IdEntity; + +/** + * TType entity. + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_opintemplate") +public class TSOpinTemplate extends IdEntity implements java.io.Serializable { + private String descript; + @Column(name = "descript", length = 100) + public String getDescript() { + return descript; + } + + public void setDescript(String descript) { + this.descript = descript; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSRole.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSRole.java new file mode 100644 index 00000000..b8f2a758 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSRole.java @@ -0,0 +1,148 @@ +package org.jeecgframework.web.system.pojo.base; + +import static javax.persistence.GenerationType.SEQUENCE; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; +import org.jeecgframework.core.common.entity.IdEntity; + +/** + * 瑙掕壊琛 + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_role") +public class TSRole extends IdEntity implements java.io.Serializable { + private String roleName;//瑙掕壊鍚嶇О + private String roleCode;//瑙掕壊缂栫爜 + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDate; + /**鍒涘缓浜篒D*/ + private java.lang.String createBy; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**淇敼鏃堕棿*/ + private java.util.Date updateDate; + /**淇敼浜*/ + private java.lang.String updateBy; + /**淇敼浜哄悕绉*/ + private java.lang.String updateName; + @Column(name = "rolename", nullable = false, length = 100) + public String getRoleName() { + return this.roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + @Column(name = "rolecode", length = 10) + public String getRoleCode() { + return this.roleCode; + } + + public void setRoleCode(String roleCode) { + this.roleCode = roleCode; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + @Column(name ="create_date",nullable=true) + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜篒D + */ + @Column(name ="create_by",nullable=true,length=32) + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜篒D + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + @Column(name ="create_name",nullable=true,length=32) + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 淇敼鏃堕棿 + */ + @Column(name ="update_date",nullable=true) + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 淇敼鏃堕棿 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜篒D + */ + @Column(name ="update_by",nullable=true,length=32) + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜篒D + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜哄悕绉 + */ + @Column(name ="update_name",nullable=true,length=32) + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSRoleFunction.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSRoleFunction.java new file mode 100644 index 00000000..9eb851a2 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSRoleFunction.java @@ -0,0 +1,63 @@ +package org.jeecgframework.web.system.pojo.base; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; +import org.jeecgframework.core.common.entity.IdEntity; + +/** + * TRoleFunction entity. + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_role_function") +public class TSRoleFunction extends IdEntity implements java.io.Serializable { + private TSFunction TSFunction; + private TSRole TSRole; + private String operation; + private String dataRule; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "functionid") + public TSFunction getTSFunction() { + return this.TSFunction; + } + + public void setTSFunction(TSFunction TSFunction) { + this.TSFunction = TSFunction; + } + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "roleid") + public TSRole getTSRole() { + return this.TSRole; + } + + public void setTSRole(TSRole TSRole) { + this.TSRole = TSRole; + } + + @Column(name = "operation", length = 100) + public String getOperation() { + return this.operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + @Column(name = "datarule", length = 100) + public String getDataRule() { + return dataRule; + } + + public void setDataRule(String dataRule) { + this.dataRule = dataRule; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSRoleOrg.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSRoleOrg.java new file mode 100644 index 00000000..9cf41b8d --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSRoleOrg.java @@ -0,0 +1,40 @@ +package org.jeecgframework.web.system.pojo.base; + +import org.jeecgframework.core.common.entity.IdEntity; + +import javax.persistence.*; + +/** + * 瑙掕壊-缁勭粐鏈烘瀯 瀹炰綋 + *

    + *

    User: zhanggm guomingzhang2008@gmail.com

    + *

    Date: 2014-08-21 13:48

    + * + * @author 寮犲浗鏄 + */ +@Entity +@Table(name = "t_s_role_org") +public class TSRoleOrg extends IdEntity implements java.io.Serializable { + private TSDepart tsDepart; + private TSRole tsRole; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "org_id") + public TSDepart getTsDepart() { + return tsDepart; + } + + public void setTsDepart(TSDepart tsDepart) { + this.tsDepart = tsDepart; + } + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "role_id") + public TSRole getTsRole() { + return tsRole; + } + + public void setTsRole(TSRole tsRole) { + this.tsRole = tsRole; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSRoleUser.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSRoleUser.java new file mode 100644 index 00000000..a17473a0 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSRoleUser.java @@ -0,0 +1,45 @@ +package org.jeecgframework.web.system.pojo.base; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; +import org.jeecgframework.core.common.entity.IdEntity; + +/** + * TSRoleUser entity. + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_role_user") +public class TSRoleUser extends IdEntity implements java.io.Serializable { + private TSUser TSUser; + private TSRole TSRole; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "userid") + public TSUser getTSUser() { + return this.TSUser; + } + + public void setTSUser(TSUser TSUser) { + this.TSUser = TSUser; + } + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "roleid") + public TSRole getTSRole() { + return this.TSRole; + } + + public void setTSRole(TSRole TSRole) { + this.TSRole = TSRole; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSTerritory.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSTerritory.java new file mode 100644 index 00000000..67fe0a29 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSTerritory.java @@ -0,0 +1,103 @@ +package org.jeecgframework.web.system.pojo.base; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.hibernate.annotations.ForeignKey; +import org.jeecgframework.core.common.entity.IdEntity; + +/** + *鍦板煙绠$悊琛 + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_territory") +public class TSTerritory extends IdEntity implements java.io.Serializable { + private static final long serialVersionUID = 1L; + private TSTerritory TSTerritory;//鐖跺湴鍩 + private String territoryName;//鍦板煙鍚嶇О + private Short territoryLevel;//绛夌骇 + private String territorySort;//鍚屽尯鍩熶腑鐨勬樉绀洪『搴 + private String territoryCode;//鍖哄煙鐮 + private String territoryPinyin;//鍖哄煙鍚嶇О鎷奸煶 + private double xwgs84;//wgs84鏍煎紡缁忓害(mapabc 鐨勫潗鏍囩郴) + private double ywgs84;//wgs84鏍煎紡绾害(mapabc 鐨勫潗鏍囩郴) + private List TSTerritorys = new ArrayList(); + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "territoryparentid") + @ForeignKey(name="null")//鍙栨秷hibernate鐨勫閿敓鎴 + public TSTerritory getTSTerritory() { + return this.TSTerritory; + } + public void setTSTerritory(TSTerritory TSTerritory) { + this.TSTerritory = TSTerritory; + } + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TSTerritory") + public List getTSTerritorys() { + return TSTerritorys; + } + public void setTSTerritorys(List TSTerritorys) { + this.TSTerritorys = TSTerritorys; + } + @Column(name = "territoryname", nullable = false, length = 50) + public String getTerritoryName() { + return territoryName; + } + + public void setTerritoryName(String territoryName) { + this.territoryName = territoryName; + } + + @Column(name = "territorysort",nullable = false,length = 3) + public String getTerritorySort() { + return territorySort; + } + + public void setTerritorySort(String territorySort) { + this.territorySort = territorySort; + } + @Column(name = "territorylevel",nullable = false,length = 1) + public Short getTerritoryLevel() { + return territoryLevel; + } + public void setTerritoryLevel(Short territoryLevel) { + this.territoryLevel = territoryLevel; + } + @Column(name = "territorycode",nullable = false,length = 10) + public String getTerritoryCode() { + return territoryCode; + } + public void setTerritoryCode(String territoryCode) { + this.territoryCode = territoryCode; + } + @Column(name = "territory_pinyin",nullable = true,length = 40) + public String getTerritoryPinyin() { + return territoryPinyin; + } + public void setTerritoryPinyin(String territoryPinyin) { + this.territoryPinyin = territoryPinyin; + } + @Column(name = "x_wgs84",nullable = false,length = 40) + public double getXwgs84() { + return xwgs84; + } + public void setXwgs84(double xwgs84) { + this.xwgs84 = xwgs84; + } + @Column(name = "y_wgs84",nullable = false,length = 40) + public double getYwgs84() { + return ywgs84; + } + public void setYwgs84(double ywgs84) { + this.ywgs84 = ywgs84; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSTimeTaskEntity.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSTimeTaskEntity.java new file mode 100644 index 00000000..c7930af4 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSTimeTaskEntity.java @@ -0,0 +1,248 @@ +package org.jeecgframework.web.system.pojo.base; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.GenericGenerator; + +/** + * @Title: Entity + * @Description: 瀹氭椂浠诲姟绠$悊 + * @author JueYue + * @date 2013-09-21 20:47:43 + * @version V1.0 + * + */ +@Entity +@Table(name = "t_s_timetask", schema = "") +@DynamicUpdate(true) +@DynamicInsert(true) +@SuppressWarnings("serial") +public class TSTimeTaskEntity implements java.io.Serializable { + /**id*/ + private java.lang.String id; + /**浠诲姟ID*/ + private java.lang.String taskId; + /**浠诲姟鎻忚堪*/ + private java.lang.String taskDescribe; + /**cron琛ㄨ揪寮*/ + private java.lang.String cronExpression; + /**鏄惁鐢熸晥浜0鏈敓鏁,1鐢熸晥浜*/ + private java.lang.String isEffect; + /**鏄惁杩愯0鍋滄,1杩愯*/ + private java.lang.String isStart; + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDate; + /**鍒涘缓浜篒D*/ + private java.lang.String createBy; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**淇敼鏃堕棿*/ + private java.util.Date updateDate; + /**淇敼浜篒D*/ + private java.lang.String updateBy; + /**淇敼浜哄悕绉*/ + private java.lang.String updateName; + + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String id + */ + + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + @Column(name ="ID",nullable=false,length=32) + public java.lang.String getId(){ + return this.id; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String id + */ + public void setId(java.lang.String id){ + this.id = id; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 浠诲姟ID + */ + @Column(name ="TASK_ID",nullable=false,length=100) + public java.lang.String getTaskId(){ + return this.taskId; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 浠诲姟ID + */ + public void setTaskId(java.lang.String taskId){ + this.taskId = taskId; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 浠诲姟鎻忚堪 + */ + @Column(name ="TASK_DESCRIBE",nullable=false,length=50) + public java.lang.String getTaskDescribe(){ + return this.taskDescribe; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 浠诲姟鎻忚堪 + */ + public void setTaskDescribe(java.lang.String taskDescribe){ + this.taskDescribe = taskDescribe; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String cron琛ㄨ揪寮 + */ + @Column(name ="CRON_EXPRESSION",nullable=false,length=100) + public java.lang.String getCronExpression(){ + return this.cronExpression; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String cron琛ㄨ揪寮 + */ + public void setCronExpression(java.lang.String cronExpression){ + this.cronExpression = cronExpression; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁鐢熸晥浜0鏈敓鏁,1鐢熸晥浜 + */ + @Column(name ="IS_EFFECT",nullable=false,length=1) + public java.lang.String getIsEffect(){ + return this.isEffect; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄惁鐢熸晥浜0鏈敓鏁,1鐢熸晥浜 + */ + public void setIsEffect(java.lang.String isEffect){ + this.isEffect = isEffect; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鏄惁杩愯0鍋滄,1杩愯 + */ + @Column(name ="IS_START",nullable=false,length=1) + public java.lang.String getIsStart(){ + return this.isStart; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鏄惁杩愯0鍋滄,1杩愯 + */ + public void setIsStart(java.lang.String isStart){ + this.isStart = isStart; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + @Column(name ="CREATE_DATE",nullable=true) + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜篒D + */ + @Column(name ="CREATE_BY",nullable=true,length=32) + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜篒D + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + @Column(name ="CREATE_NAME",nullable=true,length=32) + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 淇敼鏃堕棿 + */ + @Column(name ="UPDATE_DATE",nullable=true) + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 淇敼鏃堕棿 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜篒D + */ + @Column(name ="UPDATE_BY",nullable=true,length=32) + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜篒D + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜哄悕绉 + */ + @Column(name ="UPDATE_NAME",nullable=true,length=32) + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSType.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSType.java new file mode 100644 index 00000000..f4e05309 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSType.java @@ -0,0 +1,90 @@ +package org.jeecgframework.web.system.pojo.base; +// default package + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; + +/** + * 閫氱敤绫诲瀷瀛楀吀琛 + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_type") +public class TSType extends IdEntity implements java.io.Serializable { + + private TSTypegroup TSTypegroup;//绫诲瀷鍒嗙粍 + private TSType TSType;//鐖剁被鍨 + private String typename;//绫诲瀷鍚嶇О + private String typecode;//绫诲瀷缂栫爜 +// private List TSProcesses = new ArrayList(); + private List TSTypes =new ArrayList(); + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "typegroupid") + public TSTypegroup getTSTypegroup() { + return this.TSTypegroup; + } + + public void setTSTypegroup(TSTypegroup TSTypegroup) { + this.TSTypegroup = TSTypegroup; + } + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "typepid") + public TSType getTSType() { + return this.TSType; + } + + public void setTSType(TSType TSType) { + this.TSType = TSType; + } + + @Column(name = "typename", length = 50) + public String getTypename() { + return this.typename; + } + + public void setTypename(String typename) { + this.typename = typename; + } + + @Column(name = "typecode", length = 50) + public String getTypecode() { + return this.typecode; + } + + public void setTypecode(String typecode) { + this.typecode = typecode; + } + +// @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TSType") +// public List getTSProcesses() { +// return this.TSProcesses; +// } +// +// public void setTSProcesses(List TSProcesses) { +// this.TSProcesses = TSProcesses; +// } + + + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TSType") + public List getTSTypes() { + return this.TSTypes; + } + + public void setTSTypes(List TSTypes) { + this.TSTypes = TSTypes; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSTypegroup.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSTypegroup.java new file mode 100644 index 00000000..66425d18 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSTypegroup.java @@ -0,0 +1,59 @@ +package org.jeecgframework.web.system.pojo.base; +// default package + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; + +/** + * TTypegroup entity. + */ +@Entity +@Table(name = "t_s_typegroup") +public class TSTypegroup extends IdEntity implements java.io.Serializable { + public static Map allTypeGroups = new HashMap(); + public static Map> allTypes = new HashMap>(); + + + + private String typegroupname; + private String typegroupcode; + private List TSTypes = new ArrayList(); + @Column(name = "typegroupname", length = 50) + public String getTypegroupname() { + return this.typegroupname; + } + + public void setTypegroupname(String typegroupname) { + this.typegroupname = typegroupname; + } + + @Column(name = "typegroupcode", length = 50) + public String getTypegroupcode() { + return this.typegroupcode; + } + + public void setTypegroupcode(String typegroupcode) { + this.typegroupcode = typegroupcode; + } + + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TSTypegroup") + public List getTSTypes() { + return this.TSTypes; + } + + public void setTSTypes(List TSTypes) { + this.TSTypes = TSTypes; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSUser.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSUser.java new file mode 100644 index 00000000..4ea8fb71 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSUser.java @@ -0,0 +1,167 @@ +package org.jeecgframework.web.system.pojo.base; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.Table; + +/** + * 绯荤粺鐢ㄦ埛琛 + * @author 寮犱唬娴 + */ +@Entity +@Table(name = "t_s_user") +@PrimaryKeyJoinColumn(name = "id") +public class TSUser extends TSBaseUser implements java.io.Serializable { + private static final long serialVersionUID = 1L; + private String signatureFile;// 绛惧悕鏂囦欢 + private String mobilePhone;// 鎵嬫満 + private String officePhone;// 鍔炲叕鐢佃瘽 + private String email;// 閭 + /**鍒涘缓鏃堕棿*/ + private java.util.Date createDate; + /**鍒涘缓浜篒D*/ + private java.lang.String createBy; + /**鍒涘缓浜哄悕绉*/ + private java.lang.String createName; + /**淇敼鏃堕棿*/ + private java.util.Date updateDate; + /**淇敼浜*/ + private java.lang.String updateBy; + /**淇敼浜哄悕绉*/ + private java.lang.String updateName; + @Column(name = "signatureFile", length = 100) + public String getSignatureFile() { + return this.signatureFile; + } + + public void setSignatureFile(String signatureFile) { + this.signatureFile = signatureFile; + } + + @Column(name = "mobilePhone", length = 30) + public String getMobilePhone() { + return this.mobilePhone; + } + + public void setMobilePhone(String mobilePhone) { + this.mobilePhone = mobilePhone; + } + + @Column(name = "officePhone", length = 20) + public String getOfficePhone() { + return this.officePhone; + } + + public void setOfficePhone(String officePhone) { + this.officePhone = officePhone; + } + + @Column(name = "email", length = 50) + public String getEmail() { + return this.email; + } + + public void setEmail(String email) { + this.email = email; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 鍒涘缓鏃堕棿 + */ + @Column(name ="create_date",nullable=true) + public java.util.Date getCreateDate(){ + return this.createDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 鍒涘缓鏃堕棿 + */ + public void setCreateDate(java.util.Date createDate){ + this.createDate = createDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜篒D + */ + @Column(name ="create_by",nullable=true,length=32) + public java.lang.String getCreateBy(){ + return this.createBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜篒D + */ + public void setCreateBy(java.lang.String createBy){ + this.createBy = createBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 鍒涘缓浜哄悕绉 + */ + @Column(name ="create_name",nullable=true,length=32) + public java.lang.String getCreateName(){ + return this.createName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 鍒涘缓浜哄悕绉 + */ + public void setCreateName(java.lang.String createName){ + this.createName = createName; + } + /** + *鏂规硶: 鍙栧緱java.util.Date + *@return: java.util.Date 淇敼鏃堕棿 + */ + @Column(name ="update_date",nullable=true) + public java.util.Date getUpdateDate(){ + return this.updateDate; + } + + /** + *鏂规硶: 璁剧疆java.util.Date + *@param: java.util.Date 淇敼鏃堕棿 + */ + public void setUpdateDate(java.util.Date updateDate){ + this.updateDate = updateDate; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜篒D + */ + @Column(name ="update_by",nullable=true,length=32) + public java.lang.String getUpdateBy(){ + return this.updateBy; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜篒D + */ + public void setUpdateBy(java.lang.String updateBy){ + this.updateBy = updateBy; + } + /** + *鏂规硶: 鍙栧緱java.lang.String + *@return: java.lang.String 淇敼浜哄悕绉 + */ + @Column(name ="update_name",nullable=true,length=32) + public java.lang.String getUpdateName(){ + return this.updateName; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String 淇敼浜哄悕绉 + */ + public void setUpdateName(java.lang.String updateName){ + this.updateName = updateName; + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSUserOrg.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSUserOrg.java new file mode 100644 index 00000000..8eb90bd1 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSUserOrg.java @@ -0,0 +1,40 @@ +package org.jeecgframework.web.system.pojo.base; + +import org.jeecgframework.core.common.entity.IdEntity; + +import javax.persistence.*; + +/** + * 鐢ㄦ埛-缁勭粐鏈烘瀯 瀹炰綋 + *

    + *

    User: zhanggm guomingzhang2008@gmail.com

    + *

    Date: 2014-08-22 15:39

    + * + * @author 寮犲浗鏄 + */ +@Entity +@Table(name = "t_s_user_org") +public class TSUserOrg extends IdEntity implements java.io.Serializable { + private TSUser tsUser; + private TSDepart tsDepart; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "user_id") + public TSUser getTsUser() { + return tsUser; + } + + public void setTsUser(TSUser tsDepart) { + this.tsUser = tsDepart; + } + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "org_id") + public TSDepart getTsDepart() { + return tsDepart; + } + + public void setTsDepart(TSDepart tsDepart) { + this.tsDepart = tsDepart; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/pojo/base/TSVersion.java b/src/main/java/org/jeecgframework/web/system/pojo/base/TSVersion.java new file mode 100644 index 00000000..177cb828 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/pojo/base/TSVersion.java @@ -0,0 +1,49 @@ +package org.jeecgframework.web.system.pojo.base; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; + +import org.jeecgframework.core.common.entity.IdEntity; +/** + * 绋嬪簭鐗堟湰鎺у埗琛 + * @author 寮犱唬娴 + * + */ +@Entity +@Table(name = "t_s_version") +public class TSVersion extends IdEntity implements java.io.Serializable { + private String versionName;//鐗堟湰鍚嶇О + private String versionCode;//鐗堟湰缂栫爜 + private String loginPage;//鐧婚檰鍏ュ彛椤甸潰 + private String versionNum;//鐗堟湰鍙 + @Column(name = "versionname", length = 30) + public String getVersionName() { + return versionName; + } + public void setVersionName(String versionName) { + this.versionName = versionName; + } + + @Column(name = "versioncode", length = 50) + public String getVersionCode() { + return versionCode; + } + public void setVersionCode(String versionCode) { + this.versionCode = versionCode; + } + @Column(name = "loginpage", length = 100) + public String getLoginPage() { + return loginPage; + } + public void setLoginPage(String loginPage) { + this.loginPage = loginPage; + } + @Column(name = "versionnum", length = 20) + public String getVersionNum() { + return versionNum; + } + public void setVersionNum(String versionNum) { + this.versionNum = versionNum; + } +} diff --git a/src/main/java/org/jeecgframework/web/system/service/CategoryServiceI.java b/src/main/java/org/jeecgframework/web/system/service/CategoryServiceI.java new file mode 100644 index 00000000..b4e7fe6a --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/CategoryServiceI.java @@ -0,0 +1,13 @@ +package org.jeecgframework.web.system.service; + +import org.jeecgframework.core.common.service.CommonService; +import org.jeecgframework.web.system.pojo.base.TSCategoryEntity; + +public interface CategoryServiceI extends CommonService{ + /** + * 淇濆瓨鍒嗙被绠$悊 + * @param category + */ + void saveCategory(TSCategoryEntity category); + +} diff --git a/src/main/java/org/jeecgframework/web/system/service/DeclareService.java b/src/main/java/org/jeecgframework/web/system/service/DeclareService.java new file mode 100644 index 00000000..0f99ae19 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/DeclareService.java @@ -0,0 +1,18 @@ +package org.jeecgframework.web.system.service; + +import java.util.List; + +import org.jeecgframework.web.system.pojo.base.TSAttachment; + +import org.jeecgframework.core.common.service.CommonService; + +/** + * + * @author 寮犱唬娴 + * + */ +public interface DeclareService extends CommonService{ + + public List getAttachmentsByCode(String businessKey,String description); + +} diff --git a/src/main/java/org/jeecgframework/web/system/service/DynamicDataSourceServiceI.java b/src/main/java/org/jeecgframework/web/system/service/DynamicDataSourceServiceI.java new file mode 100644 index 00000000..d57aa5e6 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/DynamicDataSourceServiceI.java @@ -0,0 +1,13 @@ +package org.jeecgframework.web.system.service; + +import java.util.List; + +import org.jeecgframework.core.common.service.CommonService; +import org.jeecgframework.web.system.pojo.base.DynamicDataSourceEntity; + +public interface DynamicDataSourceServiceI extends CommonService{ + + public List initDynamicDataSource(); + + public void refleshCache(); +} diff --git a/src/main/java/org/jeecgframework/web/system/service/LogService.java b/src/main/java/org/jeecgframework/web/system/service/LogService.java new file mode 100644 index 00000000..315366c5 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/LogService.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.jeecgframework.web.system.service; + +import org.jeecgframework.core.common.service.CommonService; + + +/** + * 鏃ュ織Service鎺ュ彛 + * @author 鏂规枃鑽 + * + */ +public interface LogService extends CommonService{ + +} diff --git a/src/main/java/org/jeecgframework/web/system/service/MenuInitService.java b/src/main/java/org/jeecgframework/web/system/service/MenuInitService.java new file mode 100644 index 00000000..709ad4df --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/MenuInitService.java @@ -0,0 +1,13 @@ +package org.jeecgframework.web.system.service; + +import org.jeecgframework.core.common.service.CommonService; + +/** + * + * @author 寮犱唬娴 + * + */ +public interface MenuInitService extends CommonService{ + + public void initMenu(); +} diff --git a/src/main/java/org/jeecgframework/web/system/service/MutiLangServiceI.java b/src/main/java/org/jeecgframework/web/system/service/MutiLangServiceI.java new file mode 100644 index 00000000..90865c83 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/MutiLangServiceI.java @@ -0,0 +1,26 @@ +package org.jeecgframework.web.system.service; + +import org.jeecgframework.core.common.service.CommonService; +import org.jeecgframework.web.system.pojo.base.MutiLangEntity; + +public interface MutiLangServiceI extends CommonService{ + + public void initAllMutiLang(); + + public String getLang(String lang_key); + + public String getLang(String lang_key, String args); + + public void refleshMutiLangCach(); + + /** + * 鏇存柊缂撳瓨锛屾彃鍏ョ紦瀛 + */ + public void putMutiLang(MutiLangEntity mutiLangEntity); + + /** + * 鏇存柊缂撳瓨锛屾彃鍏ョ紦瀛 + */ + public void putMutiLang(String langKey,String langCode,String langContext); + +} diff --git a/src/main/java/org/jeecgframework/web/system/service/RepairService.java b/src/main/java/org/jeecgframework/web/system/service/RepairService.java new file mode 100644 index 00000000..6057dafe --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/RepairService.java @@ -0,0 +1,26 @@ +package org.jeecgframework.web.system.service; + +import org.jeecgframework.core.common.service.CommonService; + +/** + * @Description 淇鏁版嵁搴揝ervice + * @ClassName: RepairService + * @author tanghan + * @date 2013-7-19 涓嬪崍01:31:00 + */ +public interface RepairService extends CommonService{ + + /** + * @Description 淇鏁版嵁搴 + * @author tanghan 2013-7-19 + */ + public void repair(); + + /** + * @Description 鍏堟竻绌烘暟鎹簱锛岀劧鍚庡啀淇鏁版嵁搴 + * @author tanghan 2013-7-19 + */ + + public void deleteAndRepair(); + +} diff --git a/src/main/java/org/jeecgframework/web/system/service/SystemService.java b/src/main/java/org/jeecgframework/web/system/service/SystemService.java new file mode 100644 index 00000000..24f1c47a --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/SystemService.java @@ -0,0 +1,145 @@ +package org.jeecgframework.web.system.service; + +import java.util.List; +import java.util.Set; + +import org.jeecgframework.web.system.pojo.base.DictEntity; +import org.jeecgframework.web.system.pojo.base.TSFunction; +import org.jeecgframework.web.system.pojo.base.TSIcon; +import org.jeecgframework.web.system.pojo.base.TSType; +import org.jeecgframework.web.system.pojo.base.TSTypegroup; +import org.jeecgframework.web.system.pojo.base.TSUser; +import org.jeecgframework.core.common.service.CommonService; + +/** + * + * @author 寮犱唬娴 + * + */ +public interface SystemService extends CommonService{ + /** + * 鏂规硶鎻忚堪: 鏌ヨ鏁版嵁瀛楀吀 + * 浣 鑰咃細 yiming.zhang + * 鏃 鏈燂細 2014骞5鏈11鏃-涓嬪崍4:22:42 + * @param dicTable + * @param dicCode + * @param dicText + * @return + * 杩斿洖绫诲瀷锛 List + */ + public List queryDict(String dicTable,String dicCode, String dicText); + + /** + * 鐧婚檰鐢ㄦ埛妫鏌 + * @param user + * @return + * @throws Exception + */ + public TSUser checkUserExits(TSUser user) throws Exception; + /** + * 鏃ュ織娣诲姞 + * @param LogContent 鍐呭 + * @param loglevel 绾у埆 + * @param operatetype 绫诲瀷 + * @param TUser 鎿嶄綔浜 + */ + public void addLog(String LogContent, Short loglevel,Short operatetype); + /** + * 鏍规嵁绫诲瀷缂栫爜鍜岀被鍨嬪悕绉拌幏鍙朤ype,濡傛灉涓虹┖鍒欏垱寤轰竴涓 + * @param typecode + * @param typename + * @return + */ + public TSType getType(String typecode,String typename,TSTypegroup tsTypegroup); + /** + * 鏍规嵁绫诲瀷鍒嗙粍缂栫爜鍜屽悕绉拌幏鍙朤ypeGroup,濡傛灉涓虹┖鍒欏垱寤轰竴涓 + * @param typecode + * @param typename + * @return + */ + public TSTypegroup getTypeGroup(String typegroupcode,String typgroupename); + /** + * 鏍规嵁鐢ㄦ埛ID 鍜 鑿滃崟Id 鑾峰彇 鍏锋湁鎿嶄綔鏉冮檺鐨勬寜閽瓹odes + * @param roleId + * @param functionId + * @return + */ + public Set getOperationCodesByUserIdAndFunctionId(String userId,String functionId); + /** + * 鏍规嵁瑙掕壊ID 鍜 鑿滃崟Id 鑾峰彇 鍏锋湁鎿嶄綔鏉冮檺鐨勬寜閽瓹odes + * @param roleId + * @param functionId + * @return + */ + public Set getOperationCodesByRoleIdAndFunctionId(String roleId,String functionId); + /** + * 鏍规嵁缂栫爜鑾峰彇瀛楀吀缁 + * + * @param typegroupCode + * @return + */ + public TSTypegroup getTypeGroupByCode(String typegroupCode); + /** + * 瀵规暟鎹瓧鍏歌繘琛岀紦瀛 + */ + public void initAllTypeGroups(); + + /** + * 鍒锋柊瀛楀吀缂撳瓨 + * @param type + */ + public void refleshTypesCach(TSType type); + /** + * 鍒锋柊瀛楀吀鍒嗙粍缂撳瓨 + */ + public void refleshTypeGroupCach(); + /** + * 鍒锋柊鑿滃崟 + * + * @param id + */ + public void flushRoleFunciton(String id, TSFunction newFunciton); + + /** + * 鐢熸垚缁勭粐鏈烘瀯缂栫爜 + * @param id 缁勭粐鏈烘瀯涓婚敭 + * @param pid 缁勭粐鏈烘瀯鐨勭埗绾т富閿 + * @return 缁勭粐鏈烘瀯缂栫爜 + */ + String generateOrgCode(String id, String pid); + + /** + * + * getOperationCodesByRoleIdAndruleDataId + * 鏍规嵁瑙掕壊id 鍜 鑿滃崟Id 鑾峰彇 鍏锋湁鎿嶄綔鏉冮檺鐨勬暟鎹鍒 + * + * @Title: getOperationCodesByRoleIdAndruleDataId + * @Description: TODO + * @param @param roleId + * @param @param functionId + * @param @return 璁惧畾鏂囦欢 + * @return Set 杩斿洖绫诲瀷 + * @throws + */ + + public Set getOperationCodesByRoleIdAndruleDataId(String roleId,String functionId); + + public Set getOperationCodesByUserIdAndDataId(String userId,String functionId); + + /** + * 鍔犺浇鎵鏈夊浘鏍 + * @return + */ + public void initAllTSIcons(); + + /** + * 鏇存柊鍥炬爣 + * @param icon + */ + public void upTSIcons(TSIcon icon); + /** + * 鍒犻櫎鍥炬爣 + * @param icon + */ + public void delTSIcons(TSIcon icon); +} diff --git a/src/main/java/org/jeecgframework/web/system/service/TimeTaskServiceI.java b/src/main/java/org/jeecgframework/web/system/service/TimeTaskServiceI.java new file mode 100644 index 00000000..f4eea397 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/TimeTaskServiceI.java @@ -0,0 +1,7 @@ +package org.jeecgframework.web.system.service; + +import org.jeecgframework.core.common.service.CommonService; + +public interface TimeTaskServiceI extends CommonService{ + +} diff --git a/src/main/java/org/jeecgframework/web/system/service/UserService.java b/src/main/java/org/jeecgframework/web/system/service/UserService.java new file mode 100644 index 00000000..584a84c5 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/UserService.java @@ -0,0 +1,24 @@ +package org.jeecgframework.web.system.service; + +import org.jeecgframework.core.common.service.CommonService; + +import org.jeecgframework.web.system.pojo.base.TSUser; +/** + * + * @author 寮犱唬娴 + * + */ +public interface UserService extends CommonService{ + + public TSUser checkUserExits(TSUser user); + public String getUserRole(TSUser user); + public void pwdInit(TSUser user, String newPwd); + /** + * 鍒ゆ柇杩欎釜瑙掕壊鏄笉鏄繕鏈夌敤鎴蜂娇鐢 + *@Author JueYue + *@date 2013-11-12 + *@param id + *@return + */ + public int getUsersOfThisRole(String id); +} diff --git a/src/main/java/org/jeecgframework/web/system/service/impl/CategoryServiceImpl.java b/src/main/java/org/jeecgframework/web/system/service/impl/CategoryServiceImpl.java new file mode 100644 index 00000000..1385349b --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/impl/CategoryServiceImpl.java @@ -0,0 +1,60 @@ +package org.jeecgframework.web.system.service.impl; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.apache.commons.lang.StringUtils; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.web.system.pojo.base.TSCategoryEntity; +import org.jeecgframework.web.system.service.CategoryServiceI; + +@Service("tSCategoryService") +@Transactional +public class CategoryServiceImpl extends CommonServiceImpl implements + CategoryServiceI { + + private static final String MAX_SQL = "SELECT MAX(code) FROM t_s_category WHERE parent_code"; + + @Override + public void saveCategory(TSCategoryEntity category) { + category.setCode(getCategoryCoade(category)); + this.save(category); + } + + /** + * 鑾峰彇绫诲瀷缂栫爜 鍔犻攣闃叉骞跺彂闂 + * + * @param category + * @return + */ + private synchronized String getCategoryCoade(TSCategoryEntity category) { + Long maxCode = null; + //step 1 椤剁骇code鍙寜鐓у簭鍒楀闀 + if (category.getParent() == null + || StringUtils.isEmpty(category.getParent().getCode())) { + category.setParent(null); + maxCode = this.getCountForJdbc(MAX_SQL + " IS NULL"); + maxCode = maxCode == 0 ? 1 : maxCode + 1; + return String.format( + "%0" + + Integer.valueOf(ResourceUtil + .getConfigByName("categoryCodeLengthType")) + + "d", maxCode); + } + //step 2鎸夌収涓嬬骇搴忓垪鍚戜笂鎺掑簭 + TSCategoryEntity parent = this.findUniqueByProperty(TSCategoryEntity.class,"code", category + .getParent().getCode()); + //闃叉hibernate缂撳瓨鎸佷箙鍖栧紓甯 + category.setParent(parent); + maxCode = this.getCountForJdbc(MAX_SQL + " = '" + + category.getParent().getCode()+"' and code like '"+ category.getParent().getCode()+"%'"); + maxCode = maxCode == 0 ? 1 : Long.valueOf(maxCode.toString() + .substring(parent.getCode().length())) + 1; + return parent.getCode() + + String.format( + "%0" + + Integer.valueOf(ResourceUtil + .getConfigByName("categoryCodeLengthType")) + + "d", maxCode); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/service/impl/DeclareServiceImpl.java b/src/main/java/org/jeecgframework/web/system/service/impl/DeclareServiceImpl.java new file mode 100644 index 00000000..328d9ca8 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/impl/DeclareServiceImpl.java @@ -0,0 +1,23 @@ +package org.jeecgframework.web.system.service.impl; + +import java.util.List; + +import org.jeecgframework.web.system.pojo.base.TSAttachment; +import org.jeecgframework.web.system.service.DeclareService; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service("declareService") +@Transactional +public class DeclareServiceImpl extends CommonServiceImpl implements DeclareService { + + public List getAttachmentsByCode(String businessKey,String description) + { + String hql="from TSAttachment t where t.businessKey='"+businessKey+"' and t.description='"+description+"'"; + return commonDao.findByQueryString(hql); + } + +} diff --git a/src/main/java/org/jeecgframework/web/system/service/impl/DynamicDataSourceServiceImpl.java b/src/main/java/org/jeecgframework/web/system/service/impl/DynamicDataSourceServiceImpl.java new file mode 100644 index 00000000..bf5068fa --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/impl/DynamicDataSourceServiceImpl.java @@ -0,0 +1,36 @@ +package org.jeecgframework.web.system.service.impl; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.web.system.service.DynamicDataSourceServiceI; +import org.jeecgframework.web.system.pojo.base.DynamicDataSourceEntity; + +@Service("dynamicDataSourceService") +@Transactional +public class DynamicDataSourceServiceImpl extends CommonServiceImpl implements DynamicDataSourceServiceI { + + /**鍒濆鍖栨暟鎹簱淇℃伅锛孴OMCAT鍚姩鏃剁洿鎺ュ姞鍏ュ埌鍐呭瓨涓**/ + public List initDynamicDataSource() { + DynamicDataSourceEntity.DynamicDataSourceMap.clear(); + + List dynamicSourceEntityList = this.commonDao.loadAll(DynamicDataSourceEntity.class); + + for (DynamicDataSourceEntity dynamicSourceEntity : dynamicSourceEntityList) { + DynamicDataSourceEntity.DynamicDataSourceMap.put(dynamicSourceEntity.getDbKey(), dynamicSourceEntity); + } + return dynamicSourceEntityList; + } + + public static DynamicDataSourceEntity getDbSourceEntityByKey(String dbKey) { + DynamicDataSourceEntity dynamicDataSourceEntity = DynamicDataSourceEntity.DynamicDataSourceMap.get(dbKey); + + return dynamicDataSourceEntity; + } + + public void refleshCache() { + initDynamicDataSource(); + } +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/service/impl/LogServiceImpl.java b/src/main/java/org/jeecgframework/web/system/service/impl/LogServiceImpl.java new file mode 100644 index 00000000..3c82462f --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/impl/LogServiceImpl.java @@ -0,0 +1,15 @@ +package org.jeecgframework.web.system.service.impl; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.web.system.service.LogService; +import org.springframework.stereotype.Service; + +/** + * 鏃ュ織Service鎺ュ彛瀹炵幇绫 + * @author 鏂规枃鑽 + * + */ +@Service("logService") +public class LogServiceImpl extends CommonServiceImpl implements LogService{ + +} diff --git a/src/main/java/org/jeecgframework/web/system/service/impl/MenuInitServiceImpl.java b/src/main/java/org/jeecgframework/web/system/service/impl/MenuInitServiceImpl.java new file mode 100644 index 00000000..f0730096 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/impl/MenuInitServiceImpl.java @@ -0,0 +1,163 @@ +package org.jeecgframework.web.system.service.impl; + +import java.io.Serializable; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.jeecgframework.web.system.pojo.base.TSFunction; +import org.jeecgframework.web.system.pojo.base.TSIcon; +import org.jeecgframework.web.system.pojo.base.TSOperation; +import org.jeecgframework.web.system.service.MenuInitService; +import org.jeecgframework.web.system.util.PackagesToScanUtil; + +import org.jeecgframework.core.annotation.config.AutoMenu; +import org.jeecgframework.core.annotation.config.AutoMenuOperation; +import org.jeecgframework.core.annotation.config.MenuCodeType; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.StringUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service("menuInitService") +@Transactional +public class MenuInitServiceImpl extends CommonServiceImpl implements + MenuInitService { + + private static final String KEY_SPLIT = "-";//map key 鍒嗛殧绗 + private static final String MENU_TYPE_ID = "#";//閲囩敤鎺т欢ID鏂瑰紡鐨刢ode鍓嶇紑 + private static final String MENU_TYPE_CSS = ".";//閲囩敤Css鏍峰紡鏂瑰紡鐨刢ode鍓嶇紑 + + + public void initMenu() { + // 1.鎵弿椤圭洰涓嬶紝鎵鏈塩lass锛屽垽鏂甫鏈夋爣绛継AutoMenu + // TODO + // 2.寰幆鍒ゆ柇@AutoMenu鍦ㄧ郴缁熶腑鏄惁瀛樺湪,濡傛灉涓嶅瓨鍦ㄨ繘琛屾彃鍏ワ紝濡傛灉瀛樺湪涓嶅啀鎻掑叆 + // 姣旇緝瑙勫垯[鑿滃崟鍚嶇О-绛夌骇-鑿滃崟鍦板潃锛氬叏鍖归厤] + + // 3.鍔犺浇@AutoMenu涓嬪甫鏈夋爣绛継AutoMenuOperation鎵鏈夋柟娉 + + // 4.寰幆@AutoMenuOperation鏂规硶鏍囩锛屽垽鏂鑿滃崟涓嬫槸鍚︽湁璇ユ搷浣滅爜閰嶇疆锛屽鏋滃瓨鍦ㄤ笉鎻掑叆锛屼笉瀛樺湪杩涜鎻掑叆 + // 姣旇緝瑙勫垯[鑿滃崟ID-鎿嶄綔鐮 锛氬叏鍖归厤] + + List functionList = this.loadAll(TSFunction.class); + List operationList = this.loadAll(TSOperation.class); + + Map functionMap = new HashMap();//鑿滃崟map,key涓鸿彍鍗曞尮閰嶈鍒欑殑瀛楃涓 + Map operationMap = new HashMap();//鑿滃崟鎿嶄綔鎸夐挳map,key涓鸿彍鍗曟搷浣滄寜閽尮閰嶈鍒欑殑瀛楃涓 + + //璁剧疆鑿滃崟map + for (TSFunction function : functionList) { + StringBuffer key = new StringBuffer(); + key.append(function.getFunctionName() == null ? "" : function.getFunctionName()); + key.append(KEY_SPLIT); + key.append(function.getFunctionLevel() == null ? "" : function.getFunctionLevel()); + key.append(KEY_SPLIT); + key.append(function.getFunctionUrl() == null ? "" : function.getFunctionUrl()); + functionMap.put(key.toString(), function); + } + //璁剧疆鑿滃崟鎿嶄綔鎸夐挳map + for (TSOperation operation : operationList) { + StringBuffer key = new StringBuffer(); + key.append(operation.getTSFunction() == null ? "" : operation.getTSFunction().getId()); + key.append(KEY_SPLIT); + key.append(operation.getOperationcode() == null ? "" : operation.getOperationcode()); + operationMap.put(key.toString(), operation); + } + + //鎵弿Src鐩綍涓 + Set> classSet = PackagesToScanUtil.getClasses(".*"); + for (Class clazz : classSet) { + //鍒ゆ柇褰撳墠绫绘槸鍚﹁缃簡鑿滃崟娉ㄨВ + //鏈缃彍鍗曟敞瑙e氨绠楀湪璇ョ被鐨勬柟娉曚笂璁剧疆浜嗚彍鍗曟搷浣滄寜閽敞瑙d篃涓嶈繘琛岃彍鍗曟搷浣滄寜閽殑鍖归厤 + if (clazz.isAnnotationPresent(AutoMenu.class)) { + AutoMenu autoMenu = clazz.getAnnotation(AutoMenu.class); + //鑿滃崟鍚嶇О蹇呴』濉啓锛屽惁鍒欎笉杩涜鑿滃崟鍜岃彍鍗曟搷浣滄寜閽殑鍖归厤 + if (StringUtil.isNotEmpty(autoMenu.name())) { + StringBuffer menuKey = new StringBuffer(); + menuKey.append(autoMenu.name()); + menuKey.append(KEY_SPLIT); + menuKey.append(autoMenu.level() == null ? "" : autoMenu.level()); + menuKey.append(KEY_SPLIT); + menuKey.append(autoMenu.url() == null ? "" : autoMenu.url()); + + TSFunction function = null; + //鍒ゆ柇鑿滃崟map鐨刱ey鏄惁鍖呭惈褰撳墠key锛屼笉鍖呭惈鍒欐彃鍏ヤ竴鏉¤彍鍗曟暟鎹 + if (!functionMap.containsKey(menuKey.toString())) { + function = new TSFunction(); + function.setFunctionName(autoMenu.name()); + function.setFunctionIframe(null); + function.setFunctionLevel(Short.valueOf(autoMenu.level())); + function.setFunctionOrder(Integer.toString(autoMenu.order())); + function.setFunctionUrl(autoMenu.url()); + function.setTSFunction(null); + + String iconId = autoMenu.icon(); + if (StringUtil.isNotEmpty(iconId)) { + Object obj = this.get(TSIcon.class, iconId); + if(obj!=null){ + function.setTSIcon((TSIcon)obj); + }else{ + function.setTSIcon(null); + } + } else { + function.setTSIcon(null); + } + Serializable id = this.save(function); + function.setId(id.toString()); + } else { + function = functionMap.get(menuKey.toString()); + } + + //鑾峰彇璇ョ被鐨勬墍鏈夋柟娉 + Method[] methods = clazz.getDeclaredMethods(); + for(Method method : methods){ + //鍒ゆ柇褰撳墠鏂规硶鏄惁璁剧疆浜嗚彍鍗曟搷浣滄寜閽敞瑙 + if (method.isAnnotationPresent(AutoMenuOperation.class)) { + AutoMenuOperation autoMenuOperation = method.getAnnotation(AutoMenuOperation.class); + //鎿嶄綔鐮佸繀椤诲~鍐欙紝鍚﹀垯涓嶈繘琛岃彍鍗曟搷浣滄寜閽殑鍖归厤 + if (StringUtil.isNotEmpty(autoMenuOperation.code())) { + StringBuffer menuOperationKey = new StringBuffer(); + menuOperationKey.append(function == null ? "" : function.getId()); + menuOperationKey.append(KEY_SPLIT); + + String code = ""; + //璁剧疆code鍓嶇紑 + if (autoMenuOperation.codeType() == MenuCodeType.TAG) { + code = autoMenuOperation.code(); + } else if (autoMenuOperation.codeType() == MenuCodeType.ID) { + code = MENU_TYPE_ID + autoMenuOperation.code(); + } else if (autoMenuOperation.codeType() == MenuCodeType.CSS) { + code = MENU_TYPE_CSS + autoMenuOperation.code(); + } + menuOperationKey.append(code); + + //鍒ゆ柇鑿滃崟鎿嶄綔鎸夐挳map鐨刱ey鏄惁鍖呭惈褰撳墠key锛屼笉鍖呭惈鍒欐彃鍏ヤ竴鏉¤彍鍗曟搷浣滄寜閽暟鎹 + if (!operationMap.containsKey(menuOperationKey.toString())) { + TSOperation operation = new TSOperation(); + operation.setOperationname(autoMenuOperation.name()); + operation.setOperationcode(code); + operation.setOperationicon(null); + operation.setStatus(Short.parseShort(Integer.toString(autoMenuOperation.status()))); + operation.setTSFunction(function); + + String iconId = autoMenuOperation.icon(); + if (StringUtil.isNotEmpty(iconId)) { + TSIcon icon = new TSIcon(); + icon.setId(iconId); + operation.setTSIcon(icon); + } else { + operation.setTSIcon(null); + } + this.save(operation); + } + } + } + } + } + } + } + } +} diff --git a/src/main/java/org/jeecgframework/web/system/service/impl/MutiLangServiceImpl.java b/src/main/java/org/jeecgframework/web/system/service/impl/MutiLangServiceImpl.java new file mode 100644 index 00000000..c8bd1e52 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/impl/MutiLangServiceImpl.java @@ -0,0 +1,96 @@ +package org.jeecgframework.web.system.service.impl; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.BrowserUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.web.system.pojo.base.MutiLangEntity; +import org.jeecgframework.web.system.service.MutiLangServiceI; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service("mutiLangService") +@Transactional +public class MutiLangServiceImpl extends CommonServiceImpl implements MutiLangServiceI { + + @Autowired + private HttpServletRequest request; + + /**鍒濆鍖栬瑷淇℃伅锛孴OMCAT鍚姩鏃剁洿鎺ュ姞鍏ュ埌鍐呭瓨涓**/ + public void initAllMutiLang() { + List mutiLang = this.commonDao.loadAll(MutiLangEntity.class); + + for (MutiLangEntity mutiLangEntity : mutiLang) { + MutiLangEntity.mutiLangMap.put(mutiLangEntity.getLangKey() + "_" + mutiLangEntity.getLangCode(), mutiLangEntity.getLangContext()); + } + } + + /** + * 鏇存柊缂撳瓨锛屾彃鍏ョ紦瀛 + */ + public void putMutiLang(String langKey,String langCode,String langContext) { + MutiLangEntity.mutiLangMap.put(langKey + "_" + langCode, langContext); + } + + /** + * 鏇存柊缂撳瓨锛屾彃鍏ョ紦瀛 + */ + public void putMutiLang(MutiLangEntity mutiLangEntity) { + MutiLangEntity.mutiLangMap.put(mutiLangEntity.getLangKey() + "_" + mutiLangEntity.getLangCode(), mutiLangEntity.getLangContext()); + } + + + /**鍙 o_muti_lang.lang_key 鐨勫艰繑鍥炲綋鍓嶈瑷鐨勫**/ + public String getLang(String langKey) + { + String language = BrowserUtils.getBrowserLanguage(request); + + if(request.getSession().getAttribute("lang") != null) + { + language = (String)request.getSession().getAttribute("lang"); + } + + String langContext = MutiLangEntity.mutiLangMap.get(langKey + "_" + language); + + if(StringUtil.isEmpty(langContext)) + { + langContext = MutiLangEntity.mutiLangMap.get("common.notfind.langkey" + "_" + request.getSession().getAttribute("lang")); + if("null".equals(langContext)||langContext==null ||langKey.startsWith("?")){ + langContext = ""; + } + langContext = langContext + langKey; + } + return langContext; + } + + public String getLang(String lanKey, String langArg) { + String langContext = StringUtil.getEmptyString(); + if(StringUtil.isEmpty(langArg)) + { + langContext = getLang(lanKey); + } else + { + String[] argArray = langArg.split(","); + langContext = getLang(lanKey); + + for(int i=0; i< argArray.length; i++) + { + String langKeyArg = argArray[i].trim(); + String langKeyContext = getLang(langKeyArg); + langContext = StringUtil.replace(langContext, "{" + i + "}", langKeyContext); + } + } + return langContext; + } + + /** 鍒锋柊澶氳瑷cach **/ + public void refleshMutiLangCach() { + MutiLangEntity.mutiLangMap.clear(); + initAllMutiLang(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/service/impl/RepairServiceImpl.java b/src/main/java/org/jeecgframework/web/system/service/impl/RepairServiceImpl.java new file mode 100644 index 00000000..8c7cb053 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/impl/RepairServiceImpl.java @@ -0,0 +1,4312 @@ +package org.jeecgframework.web.system.service.impl; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.jeecgframework.web.cgform.engine.FreemarkerHelper; +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.cgform.entity.enhance.CgformEnhanceJsEntity; +import org.jeecgframework.web.demo.entity.test.CKEditorEntity; +import org.jeecgframework.web.demo.entity.test.CourseEntity; +import org.jeecgframework.web.demo.entity.test.JeecgDemoCkfinderEntity; +import org.jeecgframework.web.demo.entity.test.JeecgJdbcEntity; +import org.jeecgframework.web.demo.entity.test.JeecgMatterBom; +import org.jeecgframework.web.demo.entity.test.JeecgNoteEntity; +import org.jeecgframework.web.demo.entity.test.JeecgOrderCustomEntity; +import org.jeecgframework.web.demo.entity.test.JeecgOrderMainEntity; +import org.jeecgframework.web.demo.entity.test.JeecgOrderProductEntity; +import org.jeecgframework.web.demo.entity.test.StudentEntity; +import org.jeecgframework.web.demo.entity.test.TSStudent; +import org.jeecgframework.web.demo.entity.test.TeacherEntity; +import org.jeecgframework.web.system.dao.repair.RepairDao; +import org.jeecgframework.web.system.pojo.base.*; +import org.jeecgframework.web.system.service.RepairService; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @Description 淇鏁版嵁搴揝ervice + * @ClassName: RepairService + * @author tanghan + * @date 2013-7-19 涓嬪崍01:31:00 + */ +@Service("repairService") +@Transactional +public class RepairServiceImpl extends CommonServiceImpl implements + RepairService { + + @Autowired + private RepairDao repairDao; + + /** + * @Description 鍏堟竻绌烘暟鎹簱锛岀劧鍚庡啀淇鏁版嵁搴 + * @author tanghan 2013-7-19 + */ + + public void deleteAndRepair() { + // 鐢变簬琛ㄤ腑鏈変富澶栭敭鍏崇郴锛屾竻绌烘暟鎹簱闇娉ㄦ剰 + commonDao.executeHql("delete TSLog"); + commonDao.executeHql("delete CKEditorEntity"); + commonDao.executeHql("delete CgformEnhanceJsEntity"); + commonDao.executeHql("delete CgFormFieldEntity"); + commonDao.executeHql("delete CgFormHeadEntity"); + commonDao.executeHql("delete TSAttachment"); + commonDao.executeHql("delete TSOperation"); + commonDao.executeHql("delete TSRoleFunction"); + commonDao.executeHql("delete TSRoleUser"); + commonDao.executeHql("delete TSUser"); + commonDao.executeHql("delete TSBaseUser"); + commonDao.executeHql("update TSFunction ts set ts.TSFunction = null"); + commonDao.executeHql("delete TSFunction"); + commonDao.executeHql("update TSDepart t set t.TSPDepart = null"); + commonDao.executeHql("delete TSDepart"); + commonDao.executeHql("delete TSIcon"); + commonDao.executeHql("delete TSRole"); + commonDao.executeHql("delete TSType"); + commonDao.executeHql("delete TSTypegroup"); + commonDao.executeHql("update TSDemo t set t.TSDemo = null"); + commonDao.executeHql("delete TSDemo"); + commonDao.executeHql("delete JeecgDemoCkfinderEntity"); + commonDao.executeHql("delete TSTimeTaskEntity"); + commonDao.executeHql("update TSTerritory t set t.TSTerritory = null"); + commonDao.executeHql("delete TSTerritory"); + commonDao.executeHql("delete StudentEntity"); + commonDao.executeHql("delete CourseEntity"); + commonDao.executeHql("delete TeacherEntity"); + commonDao.executeHql("delete JeecgJdbcEntity "); + commonDao.executeHql("delete JeecgOrderMainEntity "); + commonDao.executeHql("delete JeecgOrderProductEntity "); + commonDao.executeHql("delete JeecgOrderCustomEntity "); + commonDao.executeHql("delete JeecgNoteEntity "); + commonDao.executeHql("update JeecgMatterBom mb set mb.parent = null"); + commonDao.executeHql("delete JeecgMatterBom "); + repair(); + } + + /** + * @Description 淇鏁版嵁搴 + * @author tanghan 2013-7-19 + */ + + synchronized public void repair() { + //repairCkFinder();// 淇鏅鸿兘琛ㄥ崟ck_finder鏁版嵁搴 + repaireIcon(); // 淇鍥炬爣 + repairAttachment(); // 淇敼闄勪欢 + repairDepart();// 淇閮ㄩ棬琛 + repairMenu();// 淇鑿滃崟鏉冮檺 + repairRole();// 淇瑙掕壊 + repairUser(); // 淇鍩烘湰鐢ㄦ埛 + repairTypeAndGroup();// 淇瀛楀吀绫诲瀷 + repairType();// 淇瀛楀吀鍊 + repairOperation(); // 淇鎿嶄綔琛 + repairRoleFunction();// 淇瑙掕壊鍜屾潈闄愮殑鍏崇郴 + repairUserRole();// 淇鐢ㄦ埛鍜岃鑹茬殑鍏崇郴 + repairDemo(); // 淇Demo琛紝(椤甸潰琛ㄥ崟楠岃瘉鍔熻兘); + repairLog();// 淇鏃ュ織琛 + repairCkEditor(); // 淇姝よ〃锛屽垵濮嬪寲HTML鍦ㄧ嚎缂栬緫鍔熻兘 + repairCgFormHead();// 淇鏅鸿兘琛ㄥ崟header琛 + repairCgFormField(); // 淇鍦ㄧ嚎琛ㄥ崟瀛楁 + repairTask();//淇浠诲姟绠$悊 + repairExcel();//淇Excel瀵煎嚭瀵煎叆demo + repairDao.batchRepairTerritory();//淇鍦板煙绠$悊 + repairJdbcEntity();//淇琛ㄥ崟渚嬪瓙鏃爐ag + repairJeecgNoteEntity();//琛ㄥ崟妯″瀷 + repairOrder();//淇璁㈠崟涓瀵瑰 + repairMatterBom();//淇鐗╂枡Bom + repairReportEntity();//淇鎶ヨ〃缁熻demo + } + + /** + * 淇鐗╂枡Bom + *@Author fancq + *@date 2013-11-14 + */ + private void repairMatterBom() { + JeecgMatterBom entity = new JeecgMatterBom(); + entity.setCode("001"); + entity.setName("鐢佃剳"); + entity.setUnit("鍙"); + entity.setWeight("100"); + entity.setPrice(new BigDecimal(5000)); + entity.setStock(10); + entity.setAddress("骞夸笢娣卞湷"); + entity.setProductionDate(new Date()); + entity.setQuantity(5); + commonDao.save(entity); + + JeecgMatterBom entity2 = new JeecgMatterBom(); + entity2.setCode("001001"); + entity2.setName("涓绘澘"); + entity2.setUnit("涓"); + entity2.setWeight("60"); + entity2.setPrice(new BigDecimal(800)); + entity2.setStock(18); + entity2.setAddress("涓婃捣"); + entity2.setProductionDate(new Date()); + entity2.setQuantity(6); + entity2.setParent(entity); + commonDao.save(entity2); + } + + /** + * 淇璁㈠崟涓瀵瑰 + *@Author JueYue + *@date 2013-11-12 + */ + private void repairOrder() { + JeecgOrderMainEntity main = new JeecgOrderMainEntity(); + main.setGoAllPrice(new BigDecimal(1111111)); + main.setGoContactName("alex"); + main.setGoContent("鍒斁杈f"); + main.setGoderType("1"); + main.setGoOrderCode("11111AAA"); + main.setGoOrderCount(1); + main.setGoReturnPrice(new BigDecimal(100)); + main.setUsertype("1"); + commonDao.save(main); + JeecgOrderProductEntity product = new JeecgOrderProductEntity(); + product.setGoOrderCode(main.getGoOrderCode()); + product.setGopCount(1); + product.setGopOnePrice(new BigDecimal(100)); + product.setGopProductName("鏈鏈缇庡懗鐨勫湴閿呴浮"); + product.setGopProductType("1"); + product.setGopSumPrice(new BigDecimal(100)); + commonDao.save(product); + JeecgOrderCustomEntity coustom = new JeecgOrderCustomEntity(); + coustom.setGoOrderCode(main.getGoOrderCode()); + coustom.setGocCusName("灏忔槑"); + coustom.setGocSex("1"); + commonDao.save(coustom); + } + + /** + * 淇琛ㄥ崟妯″瀷 + *@Author JueYue + *@date 2013-11-12 + */ + private void repairJeecgNoteEntity() { + JeecgNoteEntity entity = new JeecgNoteEntity(); + entity.setAge(10); + entity.setBirthday(new Date()); + entity.setCreatedt(new Date()); + entity.setName("灏忕孩"); + entity.setSalary(new BigDecimal(1000)); + commonDao.save(entity); + } + + /** + * 淇琛ㄥ崟渚嬪瓙鏃爐ag + * @throws ParseException + *@Author JueYue + *@date 2013-11-12 + */ + private void repairJdbcEntity(){ + JeecgJdbcEntity entity = new JeecgJdbcEntity(); + entity.setAge(12); + entity.setBirthday(DateUtils.str2Date("2014-02-14",new SimpleDateFormat("yyyy-MM-dd"))); + entity.setDepId("123"); + entity.setEmail("demo@jeecg.com"); + entity.setMobilePhone("13111111111"); + entity.setOfficePhone("66666666"); + entity.setSalary(new BigDecimal(111111)); + entity.setSex("1"); + entity.setUserName("灏忔槑"); + commonDao.save(entity); + } + + /** + * 淇Excel瀵煎嚭瀵煎叆鏁版嵁 + *@Author JueYue + *@date 2013-11-10 + */ + private void repairExcel() { + CourseEntity course = new CourseEntity(); + course.setName("娴疯醇鐜"); + TeacherEntity teacher = new TeacherEntity(); + teacher.setName("璺"); + teacher.setPic("upload/Teacher/pic3345280233.PNG"); + course.setTeacher(teacher); + List list = new ArrayList(); + StudentEntity student = new StudentEntity(); + student.setName("鍗撴礇"); + student.setSex("0"); + list.add(student); + student = new StudentEntity(); + student.setName("灞辨不 "); + student.setSex("0"); + list.add(student); + course.setStudents(list); + commonDao.save(course.getTeacher()); + commonDao.save(course); + commonDao.save(course); + for (StudentEntity s :course.getStudents()){ + s.setCourse(course); + } + commonDao.batchSave(course.getStudents()); + } + + /** + * 淇浠诲姟绠$悊 + * @author JueYue + * @serialData 2013骞11鏈5鏃 + */ + private void repairTask() { + TSTimeTaskEntity task = new TSTimeTaskEntity(); + task.setTaskId("taskDemoServiceTaskCronTrigger"); + task.setTaskDescribe("娴嬭瘯Demo"); + task.setCronExpression("0 0/1 * * * ?"); + task.setIsEffect("0"); + task.setIsStart("0"); + commonDao.saveOrUpdate(task); + } + + /** + * @Description 淇鏅鸿兘琛ㄥ崟ck_finder鏁版嵁搴 + * @author Alexander 2013-10-13 + */ + private void repairCkFinder() { + JeecgDemoCkfinderEntity ckfinder = new JeecgDemoCkfinderEntity(); + ckfinder.setImage("/jeecg/userfiles/images/%E6%9C%AA%E5%91%BD%E5%90%8D.jpg"); + ckfinder.setAttachment("/jeecg/userfiles/files/JEECG%20UI%E6%A0%87%E7%AD%BE%E5%BA%93%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3v3_2.pdf"); + String str = "\"\"
    \r\n鍙埍鐨勫皬鐚
    \r\n
    \r\n1CRM姒傝堪
    \r\n11姒傚康\r\n\r\n

    CRM鏄竴椤瑰晢涓氭垬鐣ワ紝瀹冩槸鎸夌収瀹㈡埛缁嗗垎鍘熷垯鏈夋晥鐨勭粍缁囦紒涓氳祫婧愶紝鏉ュ煿鍏讳互瀹㈡埛涓轰腑蹇冪殑缁忚惀琛屼负浠ュ強瀹炴柦浠瀹㈡埛涓轰腑蹇冪殑涓氬姟娴佺▼锛屼互姝や负鎵嬫鏉ユ彁楂樹紒涓氱殑鑾峰埄鑳藉姏銆佹敹鍏ュ強瀹㈡埛婊℃剰搴︺

    \r\n\r\n

    U8CRM鍚屾牱鏄熀浜庡鎴蜂负涓績搴旂敤鍘熷垯锛鎶婂鎴蜂綔涓轰紒涓氭渶閲嶈鐨勮祫婧愶紝鍥寸粫瀹㈡埛鐨勭敓鍛藉懆鏈燂紝浠庡鎴锋帴瑙﹀紑濮嬶紝鍒板鎴蜂氦鏄撱佸鎴锋湇鍔$殑鍏ㄧ▼杩涜璺熻釜绠$悊銆佽繃绋嬬洃鎺э紝骞堕氳繃瀵瑰鎴峰瑙掑害鍒嗘瀽锛岃瘑鍒鎴锋弧瓒冲害鍜屼环鍊煎害锛屼粠鑰屼笉鏂敼杩涗骇鍝佸拰鏈嶅姟锛屼娇瀹㈡埛浠峰兼渶澶у寲銆佺粓韬寲銆

    \r\n1锛2搴旂敤浠峰\r\n\r\n

    缁熶竴浼佷笟鐨勫鎴疯祫婧愶細绯荤粺甯姪浼佷笟寤虹珛瀹屾暣鐨勫鎴枫佽仈绯讳汉璧勬簮妗f锛屼笉鍚岀殑缁勭粐銆侀儴闂ㄥ彲浠ユ牴鎹祫婧愭潈闄愯闂浉鍏崇殑瀹㈡埛璧勬枡銆

    \r\n娣卞叆鎸栨帢浠峰煎鎴凤細绯荤粺甯姪鐢ㄦ埛寤虹珛浠峰艰瘎浼颁綋绯伙紝鍩轰簬瀹㈡埛浜ゆ槗鏁版嵁锛屽瑙掑害銆佸叏鏂逛綅璇勪及瀹㈡埛浠峰笺傞氳繃瀹㈡埛浠峰肩殑璇勪及锛屾寲鎺樹环鍊煎鎴凤紝杩涜屾洿濂界殑鏈嶅姟浠峰煎鎴枫備緥濡傦紝甯姪浼佷笟鍙戠幇甯︽潵80%閿鍞敹鍏ョ殑20%浠峰煎鎴枫\r\n\r\n

    璺熻釜鍜岀洃鎺ч攢鍞満浼氾細绯荤粺渚ч噸鍞墠涓氬姟绠$悊锛屼粠瀹㈡埛鍚戜紒涓氳〃杈炬剰鍚戝紑濮嬶紝鍥寸粫閿鍞嚎绱笉鍚岄樁娈碉紝鎻愪緵瀵瑰晢鏈哄鎴疯喘涔版剰鍚戙佹帴瑙﹁繃绋嬨佺珵浜夊鎵嬨侀樁娈佃瘎浼扮瓑淇℃伅鐨勮拷韪褰曪紝骞堕氳繃閿鍞紡鏂楁湁鏁堢洃鐫f暣涓攢鍞繃绋嬫槸鍚︽甯搞

    \r\n\r\n

    绉戝棰勬祴鏈潵閿鍞儏鍐碉細鎻愪緵浜嗕竴绉嶉娴嬫ā寮忥紝绯荤粺鍙互鎸夌収閿鍞晢鏈虹殑棰勬湡閿鍞敹鍏ュ拰棰勮鎴愪氦鏃堕棿锛岀瀛︾殑棰勬祴鏈潵鍙兘瀹炵幇鐨勯攢鍞敹鍏ャ

    \r\n\r\n

    鎻愪緵绉戝鐞嗘х殑鍒嗘瀽鍐崇瓥锛氱郴缁熸彁渚涘熀浜庡鎴峰畬鏁翠笟鍔★紙瀹㈡埛鍏崇郴绠$悊銆佷緵搴旈摼鍜岃储鍔★級鐨勫喅绛栧垎鏋愶紝骞堕氳繃鎶ヨ〃鐨勫舰寮忓睍鐜扮粰鐢ㄦ埛锛岃緟鍔╀紒涓氬仛鍑烘暟瀛楀寲鍐崇瓥銆

    \r\n璧勬簮鍏变韩锛欳RM绯荤粺涓庝紒涓氶攢鍞郴缁熴佽储鍔$郴缁熺瓑闆嗘垚搴旂敤锛屽疄鐜颁紒涓氫俊鎭寲鐨勬暣鍚堝拰鍏变韩銆
    \r\n "; + ckfinder.setRemark(str); + commonDao.saveOrUpdate(ckfinder); + } + + /** + * @Description 淇鏅鸿兘琛ㄥ崟Head鏁版嵁搴 + * @author tanghan 2013-7-28 + */ + private void repairCgFormHead() { + CgFormHeadEntity order_main = new CgFormHeadEntity(); + order_main.setTableName("jform_order_main"); + order_main.setIsTree("N"); + order_main.setIsPagination("Y"); + order_main.setIsCheckbox("N"); + order_main.setQuerymode("group"); + order_main.setIsDbSynch("N"); + order_main.setContent("璁㈠崟涓讳俊鎭"); + order_main.setCreateBy("admin"); + order_main.setCreateDate(new Date()); + order_main.setJformPkType("UUID"); + // order_main.setJsPlugIn("0"); + // order_main.setSqlPlugIn("0"); + order_main.setCreateName("绠$悊鍛"); + order_main.setJformVersion("57"); + order_main.setJformType(2); + order_main.setRelationType(0); + order_main.setSubTableStr("jform_order_ticket,jform_order_customer"); + commonDao.saveOrUpdate(order_main); + + CgFormHeadEntity leave = new CgFormHeadEntity(); + leave.setTableName("jform_leave"); + leave.setIsTree("N"); + leave.setIsPagination("Y"); + leave.setIsCheckbox("N"); + leave.setJformPkType("UUID"); + leave.setQuerymode("group"); + leave.setIsDbSynch("N"); + leave.setContent("璇峰亣鍗"); + leave.setCreateBy("admin"); + leave.setCreateDate(new Date()); + // leave.setJsPlugIn("0"); + // leave.setSqlPlugIn("0"); + leave.setCreateName("绠$悊鍛"); + leave.setJformVersion("51"); + leave.setJformType(1); + leave.setRelationType(0); + commonDao.saveOrUpdate(leave); +// CgFormHeadEntity cgreport_head = new CgFormHeadEntity(); +// cgreport_head.setTableName("jform_cgreport_head"); +// cgreport_head.setIsTree("N"); +// cgreport_head.setIsPagination("Y"); +// cgreport_head.setIsCheckbox("N"); +// cgreport_head.setQuerymode("single"); +// cgreport_head.setIsDbSynch("N"); +// cgreport_head.setContent("鍔ㄦ佹姤琛ㄩ厤缃姮澶"); +// cgreport_head.setCreateBy("admin"); +// cgreport_head.setCreateDate(new Date()); + /* + * cgreport_head.setJsPlugIn("$(function(){"+"\r\n" + + * "$(\"body\").append(\"\");" + * +"\r\n" + + * "var $btn = $(\"
    \");" + * +"\r\n" +"$(\"#cgr_sql\").after($btn);"+"\r\n" + * +"$btn.click(function(){"+"\r\n" +" $.ajax({"+"\r\n" + * +" url:\"cgReportController.do?getFields\","+"\r\n" + * +" data:{sql:$(\"#cgr_sql\").val()},"+"\r\n" + * +" type:\"Post\","+"\r\n" +" dataType:\"json\","+"\r\n" + * +" success:function(data){"+"\r\n" + * +" if(data.status==\"success\"){"+"\r\n" + * +" $(\"#add_jform_cgreport_item_table\").empty();"+"\r\n" + * +" $.each(data.datas,function(index,e){"+"\r\n" + + * " var $tr = $(\"#add_jform_cgreport_item_table_template tr\").clone();" + * +"\r\n" +" $tr.find(\"td:eq(1) :text\").val(e);"+"\r\n" + * +" $tr.find(\"td:eq(2) :text\").val(index);"+"\r\n" + * +" $tr.find(\"td:eq(3) :text\").val(e);"+"\r\n" + * +" $(\"#add_jform_cgreport_item_table\").append($tr);"+"\r\n" + * +" }); "+"\r\n" + * +" resetTrNum(\"add_jform_cgreport_item_table\");"+"\r\n" + * +" }"+"\r\n" +" }"+"\r\n" +" });"+"\r\n" +" });"+"\r\n" +"});"); + * cgreport_head.setSqlPlugIn("0"); + */ +// cgreport_head.setCreateName("绠$悊鍛"); +// cgreport_head.setJformVersion("87"); +// cgreport_head.setJformType(2); +// cgreport_head.setRelationType(0); +// cgreport_head.setSubTableStr("jform_cgreport_item"); +// /* cgreport_head.setSqlPlugIn("select * from t_s_user"); */ +// +// commonDao.saveOrUpdate(cgreport_head); +// +// CgFormHeadEntity cgreport_item = new CgFormHeadEntity(); +// cgreport_item.setTableName("jform_cgreport_item"); +// cgreport_item.setIsTree("N"); +// cgreport_item.setIsPagination("Y"); +// cgreport_item.setIsCheckbox("N"); +// cgreport_item.setQuerymode("single"); +// cgreport_item.setIsDbSynch("N"); +// cgreport_item.setContent("鍔ㄦ佹姤琛ㄩ厤缃槑缁"); +// cgreport_item.setCreateBy("admin"); +// cgreport_item.setCreateDate(new Date()); +// /* +// * cgreport_item.setJsPlugIn("0"); cgreport_item.setSqlPlugIn("0"); +// */ +// cgreport_item.setCreateName("绠$悊鍛"); +// cgreport_item.setJformVersion("12"); +// cgreport_item.setJformType(3); +// cgreport_item.setRelationType(0); +// commonDao.saveOrUpdate(cgreport_item); + + CgFormHeadEntity customer = new CgFormHeadEntity(); + customer.setTableName("jform_order_customer"); + customer.setIsTree("N"); + customer.setIsPagination("Y"); + customer.setIsCheckbox("Y"); + customer.setQuerymode("single"); + customer.setIsDbSynch("N"); + customer.setContent("璁㈠崟瀹㈡埛淇℃伅"); + customer.setCreateBy("admin"); + customer.setJformPkType("UUID"); + customer.setCreateDate(new Date()); + /* + * customer.setJsPlugIn("alert(' hello world ');"); + * customer.setSqlPlugIn("0"); + */ + customer.setCreateName("绠$悊鍛"); + customer.setJformVersion("16"); + customer.setJformType(3); + customer.setRelationType(0); + commonDao.saveOrUpdate(customer); + + CgFormHeadEntity ticket = new CgFormHeadEntity(); + ticket.setTableName("jform_order_ticket"); + ticket.setIsTree("N"); + ticket.setIsPagination("Y"); + ticket.setIsCheckbox("N"); + ticket.setQuerymode("single"); + ticket.setIsDbSynch("N"); + ticket.setJformPkType("UUID"); + ticket.setContent("璁㈠崟鏈虹エ淇℃伅"); + ticket.setCreateBy("admin"); + ticket.setCreateDate(new Date()); + /* + * ticket.setJsPlugIn( + * "$(\"input/[name=\'name\']\").change( function() { \r\n 杩欓噷鍙互鍐欎簺楠岃瘉浠g爜 \r\n var name = $(\"#name\").val(); \r\nalert(name);});" + * ); ticket.setSqlPlugIn("0"); + */ + ticket.setCreateName("绠$悊鍛"); + ticket.setJformVersion("20"); + ticket.setJformType(3); + ticket.setRelationType(0); + commonDao.saveOrUpdate(ticket); + + CgFormHeadEntity price1 = new CgFormHeadEntity(); + price1.setTableName("jform_price1"); + price1.setIsTree("N"); + price1.setIsPagination("Y"); + price1.setIsCheckbox("N"); + price1.setQuerymode("group"); + price1.setIsDbSynch("N"); + price1.setJformPkType("UUID"); + price1.setContent("浠锋牸璁よ瘉鏈烘瀯缁熻琛"); + price1.setCreateBy("admin"); + price1.setCreateDate(new Date()); + /* + * price1.setJsPlugIn("0"); price1.setSqlPlugIn("0"); + */ + price1.setCreateName("绠$悊鍛"); + price1.setJformVersion("3"); + price1.setJformType(1); + price1.setRelationType(0); + commonDao.saveOrUpdate(price1); + + } + + /** + * @Description 鍚屾鏅鸿兘琛ㄥ崟瀛楁琛 + * @author tanghan 2013-7-28 + */ + private void repairCgFormField() { + // 琛ㄥ崟[璁㈠崟涓讳俊鎭痌 - 瀛楁娓呭崟 + CgFormHeadEntity jform_order_main = commonDao.findByProperty( + CgFormHeadEntity.class, "tableName", "jform_order_main").get(0); + CgFormFieldEntity jform_order_main_id = new CgFormFieldEntity(); + jform_order_main_id.setFieldName("id"); + jform_order_main_id.setTable(jform_order_main); + jform_order_main_id.setFieldLength(0); + jform_order_main_id.setIsKey("Y"); + jform_order_main_id.setIsNull("N"); + jform_order_main_id.setIsQuery("N"); + jform_order_main_id.setIsShow("N"); + jform_order_main_id.setIsShowList("N"); + jform_order_main_id.setShowType("text"); + jform_order_main_id.setLength(36); + jform_order_main_id.setType("string"); + jform_order_main_id.setOrderNum(0); + jform_order_main_id.setPointLength(0); + jform_order_main_id.setQueryMode("single"); + jform_order_main_id.setContent("涓婚敭"); + jform_order_main_id.setCreateBy("admin"); + jform_order_main_id.setCreateDate(new Date()); + jform_order_main_id.setCreateName("绠$悊鍛"); + jform_order_main_id.setDictField(""); + jform_order_main_id.setDictTable(""); + jform_order_main_id.setMainTable(""); + jform_order_main_id.setMainField(""); + commonDao.saveOrUpdate(jform_order_main_id); + + CgFormFieldEntity jform_order_main_order_code = new CgFormFieldEntity(); + jform_order_main_order_code.setFieldName("order_code"); + jform_order_main_order_code.setTable(jform_order_main); + jform_order_main_order_code.setFieldLength(0); + jform_order_main_order_code.setIsKey("N"); + jform_order_main_order_code.setIsNull("Y"); + jform_order_main_order_code.setIsQuery("Y"); + jform_order_main_order_code.setIsShow("Y"); + jform_order_main_order_code.setIsShowList("Y"); + jform_order_main_order_code.setShowType("text"); + jform_order_main_order_code.setLength(50); + jform_order_main_order_code.setType("string"); + jform_order_main_order_code.setOrderNum(1); + jform_order_main_order_code.setPointLength(0); + jform_order_main_order_code.setQueryMode("single"); + jform_order_main_order_code.setContent("璁㈠崟鍙"); + jform_order_main_order_code.setCreateBy("admin"); + jform_order_main_order_code.setCreateDate(new Date()); + jform_order_main_order_code.setCreateName("绠$悊鍛"); + jform_order_main_order_code.setDictField(""); + jform_order_main_order_code.setDictTable(""); + jform_order_main_order_code.setMainTable(""); + jform_order_main_order_code.setMainField(""); + commonDao.saveOrUpdate(jform_order_main_order_code); + + CgFormFieldEntity jform_order_main_order_date = new CgFormFieldEntity(); + jform_order_main_order_date.setFieldName("order_date"); + jform_order_main_order_date.setTable(jform_order_main); + jform_order_main_order_date.setFieldLength(0); + jform_order_main_order_date.setIsKey("N"); + jform_order_main_order_date.setIsNull("Y"); + jform_order_main_order_date.setIsQuery("Y"); + jform_order_main_order_date.setIsShow("Y"); + jform_order_main_order_date.setIsShowList("Y"); + jform_order_main_order_date.setShowType("date"); + jform_order_main_order_date.setLength(20); + jform_order_main_order_date.setType("Date"); + jform_order_main_order_date.setOrderNum(2); + jform_order_main_order_date.setPointLength(0); + jform_order_main_order_date.setQueryMode("single"); + jform_order_main_order_date.setContent("璁㈠崟鏃ユ湡"); + jform_order_main_order_date.setCreateBy("admin"); + jform_order_main_order_date.setCreateDate(new Date()); + jform_order_main_order_date.setCreateName("绠$悊鍛"); + jform_order_main_order_date.setDictField(""); + jform_order_main_order_date.setDictTable(""); + jform_order_main_order_date.setMainTable(""); + jform_order_main_order_date.setMainField(""); + commonDao.saveOrUpdate(jform_order_main_order_date); + + CgFormFieldEntity jform_order_main_order_money = new CgFormFieldEntity(); + jform_order_main_order_money.setFieldName("order_money"); + jform_order_main_order_money.setTable(jform_order_main); + jform_order_main_order_money.setFieldLength(0); + jform_order_main_order_money.setIsKey("N"); + jform_order_main_order_money.setIsNull("Y"); + jform_order_main_order_money.setIsQuery("Y"); + jform_order_main_order_money.setIsShow("Y"); + jform_order_main_order_money.setIsShowList("Y"); + jform_order_main_order_money.setShowType("text"); + jform_order_main_order_money.setLength(10); + jform_order_main_order_money.setType("double"); + jform_order_main_order_money.setOrderNum(3); + jform_order_main_order_money.setPointLength(3); + jform_order_main_order_money.setQueryMode("single"); + jform_order_main_order_money.setContent("璁㈠崟閲戦"); + jform_order_main_order_money.setCreateBy("admin"); + jform_order_main_order_money.setCreateDate(new Date()); + jform_order_main_order_money.setCreateName("绠$悊鍛"); + jform_order_main_order_money.setDictField(""); + jform_order_main_order_money.setDictTable(""); + jform_order_main_order_money.setMainTable(""); + jform_order_main_order_money.setMainField(""); + commonDao.saveOrUpdate(jform_order_main_order_money); + + CgFormFieldEntity jform_order_main_content = new CgFormFieldEntity(); + jform_order_main_content.setFieldName("content"); + jform_order_main_content.setTable(jform_order_main); + jform_order_main_content.setFieldLength(0); + jform_order_main_content.setIsKey("N"); + jform_order_main_content.setIsNull("Y"); + jform_order_main_content.setIsQuery("Y"); + jform_order_main_content.setIsShow("Y"); + jform_order_main_content.setIsShowList("Y"); + jform_order_main_content.setShowType("text"); + jform_order_main_content.setLength(255); + jform_order_main_content.setType("string"); + jform_order_main_content.setOrderNum(4); + jform_order_main_content.setPointLength(0); + jform_order_main_content.setQueryMode("single"); + jform_order_main_content.setContent("澶囨敞"); + jform_order_main_content.setCreateBy("admin"); + jform_order_main_content.setCreateDate(new Date()); + jform_order_main_content.setCreateName("绠$悊鍛"); + jform_order_main_content.setDictField(""); + jform_order_main_content.setDictTable(""); + jform_order_main_content.setMainTable(""); + jform_order_main_content.setMainField(""); + commonDao.saveOrUpdate(jform_order_main_content); + + // 琛ㄥ崟[璇峰亣鍗昡 - 瀛楁娓呭崟 + CgFormHeadEntity jform_leave = commonDao.findByProperty( + CgFormHeadEntity.class, "tableName", "jform_leave").get(0); + CgFormFieldEntity jform_leave_id = new CgFormFieldEntity(); + jform_leave_id.setFieldName("id"); + jform_leave_id.setTable(jform_leave); + jform_leave_id.setFieldLength(0); + jform_leave_id.setIsKey("Y"); + jform_leave_id.setIsNull("N"); + jform_leave_id.setIsQuery("N"); + jform_leave_id.setIsShow("N"); + jform_leave_id.setIsShowList("N"); + jform_leave_id.setShowType("text"); + jform_leave_id.setLength(36); + jform_leave_id.setType("string"); + jform_leave_id.setOrderNum(0); + jform_leave_id.setPointLength(0); + jform_leave_id.setQueryMode("single"); + jform_leave_id.setContent("涓婚敭"); + jform_leave_id.setCreateBy("admin"); + jform_leave_id.setCreateDate(new Date()); + jform_leave_id.setCreateName("绠$悊鍛"); + jform_leave_id.setDictField(""); + jform_leave_id.setDictTable(""); + jform_leave_id.setMainTable(""); + jform_leave_id.setMainField(""); + commonDao.saveOrUpdate(jform_leave_id); + + CgFormFieldEntity jform_leave_title = new CgFormFieldEntity(); + jform_leave_title.setFieldName("title"); + jform_leave_title.setTable(jform_leave); + jform_leave_title.setFieldLength(0); + jform_leave_title.setIsKey("N"); + jform_leave_title.setIsNull("N"); + jform_leave_title.setIsQuery("N"); + jform_leave_title.setIsShow("Y"); + jform_leave_title.setIsShowList("Y"); + jform_leave_title.setShowType("text"); + jform_leave_title.setLength(50); + jform_leave_title.setType("string"); + jform_leave_title.setOrderNum(1); + jform_leave_title.setPointLength(0); + jform_leave_title.setQueryMode("single"); + jform_leave_title.setContent("璇峰亣鏍囬"); + jform_leave_title.setCreateBy("admin"); + jform_leave_title.setCreateDate(new Date()); + jform_leave_title.setCreateName("绠$悊鍛"); + jform_leave_title.setDictField(""); + jform_leave_title.setDictTable(""); + jform_leave_title.setMainTable(""); + jform_leave_title.setMainField(""); + commonDao.saveOrUpdate(jform_leave_title); + + CgFormFieldEntity jform_leave_people = new CgFormFieldEntity(); + jform_leave_people.setFieldName("people"); + jform_leave_people.setTable(jform_leave); + jform_leave_people.setFieldLength(0); + jform_leave_people.setIsKey("N"); + jform_leave_people.setIsNull("N"); + jform_leave_people.setIsQuery("Y"); + jform_leave_people.setIsShow("Y"); + jform_leave_people.setIsShowList("Y"); + jform_leave_people.setShowType("text"); + jform_leave_people.setLength(20); + jform_leave_people.setType("string"); + jform_leave_people.setOrderNum(2); + jform_leave_people.setPointLength(0); + jform_leave_people.setQueryMode("single"); + jform_leave_people.setContent("璇峰亣浜"); + jform_leave_people.setCreateBy("admin"); + jform_leave_people.setCreateDate(new Date()); + jform_leave_people.setCreateName("绠$悊鍛"); + jform_leave_people.setDictField(""); + jform_leave_people.setDictTable(""); + jform_leave_people.setMainTable(""); + jform_leave_people.setMainField(""); + commonDao.saveOrUpdate(jform_leave_people); + + CgFormFieldEntity jform_leave_sex = new CgFormFieldEntity(); + jform_leave_sex.setFieldName("sex"); + jform_leave_sex.setTable(jform_leave); + jform_leave_sex.setFieldLength(0); + jform_leave_sex.setIsKey("N"); + jform_leave_sex.setIsNull("N"); + jform_leave_sex.setIsQuery("Y"); + jform_leave_sex.setIsShow("Y"); + jform_leave_sex.setIsShowList("Y"); + jform_leave_sex.setShowType("list"); + jform_leave_sex.setLength(10); + jform_leave_sex.setType("string"); + jform_leave_sex.setOrderNum(3); + jform_leave_sex.setPointLength(0); + jform_leave_sex.setQueryMode("single"); + jform_leave_sex.setContent("鎬у埆"); + jform_leave_sex.setCreateBy("admin"); + jform_leave_sex.setCreateDate(new Date()); + jform_leave_sex.setCreateName("绠$悊鍛"); + jform_leave_sex.setDictField("sex"); + jform_leave_sex.setDictTable(""); + jform_leave_sex.setMainTable(""); + jform_leave_sex.setMainField(""); + commonDao.saveOrUpdate(jform_leave_sex); + + CgFormFieldEntity jform_leave_begindate = new CgFormFieldEntity(); + jform_leave_begindate.setFieldName("begindate"); + jform_leave_begindate.setTable(jform_leave); + jform_leave_begindate.setFieldLength(0); + jform_leave_begindate.setIsKey("N"); + jform_leave_begindate.setIsNull("N"); + jform_leave_begindate.setIsQuery("N"); + jform_leave_begindate.setIsShow("Y"); + jform_leave_begindate.setIsShowList("Y"); + jform_leave_begindate.setShowType("date"); + jform_leave_begindate.setLength(0); + jform_leave_begindate.setType("Date"); + jform_leave_begindate.setOrderNum(4); + jform_leave_begindate.setPointLength(0); + jform_leave_begindate.setQueryMode("group"); + jform_leave_begindate.setContent("璇峰亣寮濮嬫椂闂"); + jform_leave_begindate.setCreateBy("admin"); + jform_leave_begindate.setCreateDate(new Date()); + jform_leave_begindate.setCreateName("绠$悊鍛"); + jform_leave_begindate.setDictField(""); + jform_leave_begindate.setDictTable(""); + jform_leave_begindate.setMainTable(""); + jform_leave_begindate.setMainField(""); + commonDao.saveOrUpdate(jform_leave_begindate); + + CgFormFieldEntity jform_leave_enddate = new CgFormFieldEntity(); + jform_leave_enddate.setFieldName("enddate"); + jform_leave_enddate.setTable(jform_leave); + jform_leave_enddate.setFieldLength(0); + jform_leave_enddate.setIsKey("N"); + jform_leave_enddate.setIsNull("N"); + jform_leave_enddate.setIsQuery("N"); + jform_leave_enddate.setIsShow("Y"); + jform_leave_enddate.setIsShowList("Y"); + jform_leave_enddate.setShowType("datetime"); + jform_leave_enddate.setLength(0); + jform_leave_enddate.setType("Date"); + jform_leave_enddate.setOrderNum(5); + jform_leave_enddate.setPointLength(0); + jform_leave_enddate.setQueryMode("group"); + jform_leave_enddate.setContent("璇峰亣缁撴潫鏃堕棿"); + jform_leave_enddate.setCreateBy("admin"); + jform_leave_enddate.setCreateDate(new Date()); + jform_leave_enddate.setCreateName("绠$悊鍛"); + jform_leave_enddate.setDictField(""); + jform_leave_enddate.setDictTable(""); + jform_leave_enddate.setMainTable(""); + jform_leave_enddate.setMainField(""); + commonDao.saveOrUpdate(jform_leave_enddate); + + CgFormFieldEntity jform_leave_hol_dept = new CgFormFieldEntity(); + jform_leave_hol_dept.setFieldName("hol_dept"); + jform_leave_hol_dept.setTable(jform_leave); + jform_leave_hol_dept.setFieldLength(0); + jform_leave_hol_dept.setIsKey("N"); + jform_leave_hol_dept.setIsNull("N"); + jform_leave_hol_dept.setIsQuery("N"); + jform_leave_hol_dept.setIsShow("Y"); + jform_leave_hol_dept.setIsShowList("Y"); + jform_leave_hol_dept.setShowType("list"); + jform_leave_hol_dept.setLength(32); + jform_leave_hol_dept.setType("string"); + jform_leave_hol_dept.setOrderNum(7); + jform_leave_hol_dept.setPointLength(0); + jform_leave_hol_dept.setQueryMode("single"); + jform_leave_hol_dept.setContent("鎵灞為儴闂"); + jform_leave_hol_dept.setCreateBy("admin"); + jform_leave_hol_dept.setCreateDate(new Date()); + jform_leave_hol_dept.setCreateName("绠$悊鍛"); + jform_leave_hol_dept.setDictField("id"); + jform_leave_hol_dept.setDictTable("t_s_depart"); + jform_leave_hol_dept.setDictText("departname"); + jform_leave_hol_dept.setMainTable(""); + jform_leave_hol_dept.setMainField(""); + commonDao.saveOrUpdate(jform_leave_hol_dept); + + CgFormFieldEntity jform_leave_hol_reson = new CgFormFieldEntity(); + jform_leave_hol_reson.setFieldName("hol_reson"); + jform_leave_hol_reson.setTable(jform_leave); + jform_leave_hol_reson.setFieldLength(0); + jform_leave_hol_reson.setIsKey("N"); + jform_leave_hol_reson.setIsNull("N"); + jform_leave_hol_reson.setIsQuery("N"); + jform_leave_hol_reson.setIsShow("Y"); + jform_leave_hol_reson.setIsShowList("Y"); + jform_leave_hol_reson.setShowType("text"); + jform_leave_hol_reson.setLength(255); + jform_leave_hol_reson.setType("string"); + jform_leave_hol_reson.setOrderNum(8); + jform_leave_hol_reson.setPointLength(0); + jform_leave_hol_reson.setQueryMode("single"); + jform_leave_hol_reson.setContent("璇峰亣鍘熷洜"); + jform_leave_hol_reson.setCreateBy("admin"); + jform_leave_hol_reson.setCreateDate(new Date()); + jform_leave_hol_reson.setCreateName("绠$悊鍛"); + jform_leave_hol_reson.setDictField(""); + jform_leave_hol_reson.setDictTable(""); + jform_leave_hol_reson.setMainTable(""); + jform_leave_hol_reson.setMainField(""); + commonDao.saveOrUpdate(jform_leave_hol_reson); + + CgFormFieldEntity jform_leave_dep_leader = new CgFormFieldEntity(); + jform_leave_dep_leader.setFieldName("dep_leader"); + jform_leave_dep_leader.setTable(jform_leave); + jform_leave_dep_leader.setFieldLength(0); + jform_leave_dep_leader.setIsKey("N"); + jform_leave_dep_leader.setIsNull("N"); + jform_leave_dep_leader.setIsQuery("N"); + jform_leave_dep_leader.setIsShow("Y"); + jform_leave_dep_leader.setIsShowList("Y"); + jform_leave_dep_leader.setShowType("text"); + jform_leave_dep_leader.setLength(20); + jform_leave_dep_leader.setType("string"); + jform_leave_dep_leader.setOrderNum(9); + jform_leave_dep_leader.setPointLength(0); + jform_leave_dep_leader.setQueryMode("single"); + jform_leave_dep_leader.setContent("閮ㄩ棬瀹℃壒浜"); + jform_leave_dep_leader.setCreateBy("admin"); + jform_leave_dep_leader.setCreateDate(new Date()); + jform_leave_dep_leader.setCreateName("绠$悊鍛"); + jform_leave_dep_leader.setDictField(""); + jform_leave_dep_leader.setDictTable(""); + jform_leave_dep_leader.setMainTable(""); + jform_leave_dep_leader.setMainField(""); + commonDao.saveOrUpdate(jform_leave_dep_leader); + + CgFormFieldEntity jform_leave_content = new CgFormFieldEntity(); + jform_leave_content.setFieldName("content"); + jform_leave_content.setTable(jform_leave); + jform_leave_content.setFieldLength(0); + jform_leave_content.setIsKey("N"); + jform_leave_content.setIsNull("N"); + jform_leave_content.setIsQuery("N"); + jform_leave_content.setIsShow("Y"); + jform_leave_content.setIsShowList("Y"); + jform_leave_content.setShowType("text"); + jform_leave_content.setLength(255); + jform_leave_content.setType("string"); + jform_leave_content.setOrderNum(10); + jform_leave_content.setPointLength(0); + jform_leave_content.setQueryMode("single"); + jform_leave_content.setContent("閮ㄩ棬瀹℃壒鎰忚"); + jform_leave_content.setCreateBy("admin"); + jform_leave_content.setCreateDate(new Date()); + jform_leave_content.setCreateName("绠$悊鍛"); + jform_leave_content.setDictField(""); + jform_leave_content.setDictTable(""); + jform_leave_content.setMainTable(""); + jform_leave_content.setMainField(""); + commonDao.saveOrUpdate(jform_leave_content); + + CgFormFieldEntity jform_leave_day_num = new CgFormFieldEntity(); + jform_leave_day_num.setFieldName("day_num"); + jform_leave_day_num.setTable(jform_leave); + jform_leave_day_num.setFieldLength(120); + jform_leave_day_num.setIsKey("N"); + jform_leave_day_num.setIsNull("Y"); + jform_leave_day_num.setIsQuery("N"); + jform_leave_day_num.setIsShow("Y"); + jform_leave_day_num.setIsShowList("Y"); + jform_leave_day_num.setShowType("text"); + jform_leave_day_num.setLength(10); + jform_leave_day_num.setType("int"); + jform_leave_day_num.setOrderNum(6); + jform_leave_day_num.setPointLength(0); + jform_leave_day_num.setQueryMode("single"); + jform_leave_day_num.setContent("璇峰亣澶╂暟"); + jform_leave_day_num.setCreateBy("admin"); + jform_leave_day_num.setCreateDate(new Date()); + jform_leave_day_num.setCreateName("绠$悊鍛"); + jform_leave_day_num.setDictField(""); + jform_leave_day_num.setDictTable(""); + jform_leave_day_num.setMainTable(""); + jform_leave_day_num.setMainField(""); + commonDao.saveOrUpdate(jform_leave_day_num); + // 琛ㄥ崟[鍔ㄦ佹姤琛ㄩ厤缃姮澶碷 - 瀛楁娓呭崟 +// CgFormHeadEntity jform_cgreport_head = commonDao.findByProperty( +// CgFormHeadEntity.class, "tableName", "jform_cgreport_head") +// .get(0); +// CgFormFieldEntity jform_cgreport_head_id = new CgFormFieldEntity(); +// // begin - 鍔ㄦ佹姤琛ㄩ厤缃殑js澧炲己 +// String cgReportFormId = jform_cgreport_head.getId(); +// CgformEnhanceJsEntity cgReportJs = new CgformEnhanceJsEntity(); +// cgReportJs.setCgJsType("form"); +// cgReportJs +// .setCgJs(new BigInteger( +// "242866756E6374696F6E28297B0D0A242822626F647922292E617070656E6428223C6C696E6B20687265663D5C22706C75672D696E2F6C68674469616C6F672F736B696E732F64656661756C742E6373735C222072656C3D5C227374796C6573686565745C222069643D5C226C68676469616C6F676C696E6B5C223E22293B0D0A766172202462746E203D202428223C64697620636C6173733D5C2275695F627574746F6E735C2220207374796C653D5C22646973706C61793A696E6C696E652D626C6F636B3B5C223E3C696E707574207374796C653D5C22706F736974696F6E3A2072656C61746976653B746F703A202D3870783B5C2220636C6173733D5C2275695F73746174655F686967686C696768745C2220747970653D5C22627574746F6E5C222076616C75653D5C2273716CBDE2CEF65C22202020202020202069643D5C2273716C416E616C797A655C22202F3E3C2F6469763E22293B0D0A242822236367725F73716C22292E6166746572282462746E293B0D0A2462746E2E636C69636B2866756E6374696F6E28297B0D0A20242E616A6178287B0D0A202020202075726C3A2263675265706F7274436F6E74726F6C6C65722E646F3F6765744669656C6473222C0D0A20202020646174613A7B73716C3A242822236367725F73716C22292E76616C28297D2C0D0A09747970653A22506F7374222C0D0A2020202064617461547970653A226A736F6E222C0D0A20202020737563636573733A66756E6374696F6E2864617461297B0D0A202020202020696628646174612E7374617475733D3D227375636365737322297B0D0A202020202020202020242822236164645F6A666F726D5F63677265706F72745F6974656D5F7461626C6522292E656D70747928293B0D0A202020202020242E6561636828646174612E64617461732C66756E6374696F6E28696E6465782C65297B0D0A202020202020202076617220247472203D20242822236164645F6A666F726D5F63677265706F72745F6974656D5F7461626C655F74656D706C61746520747222292E636C6F6E6528293B0D0A2020202020202474722E66696E64282274643A6571283129203A7465787422292E76616C2865293B0D0A202020202020202474722E66696E64282274643A6571283229203A7465787422292E76616C28696E646578293B0D0A202020202020202474722E66696E64282274643A6571283329203A7465787422292E76616C2865293B0D0A20202020202020242822236164645F6A666F726D5F63677265706F72745F6974656D5F7461626C6522292E617070656E6428247472293B0D0A2020202020207D293B200D0A20202020726573657454724E756D28226164645F6A666F726D5F63677265706F72745F6974656D5F7461626C6522293B0D0A202020207D656C73657B0D0A0909242E6D657373616765722E616C6572742827B4EDCEF3272C646174612E6461746173293B0D0A097D0D0A20207D0D0A20207D293B0D0A207D293B0D0A7D293B", +// 16).toByteArray()); +// cgReportJs.setFormId(cgReportFormId); +// commonDao.saveOrUpdate(cgReportJs); +// // end - 鍔ㄦ佹姤琛ㄩ厤缃殑js澧炲己 +// jform_cgreport_head_id.setFieldName("id"); +// jform_cgreport_head_id.setTable(jform_cgreport_head); +// jform_cgreport_head_id.setFieldLength(120); +// jform_cgreport_head_id.setIsKey("Y"); +// jform_cgreport_head_id.setIsNull("N"); +// jform_cgreport_head_id.setIsQuery("N"); +// jform_cgreport_head_id.setIsShow("N"); +// jform_cgreport_head_id.setIsShowList("N"); +// jform_cgreport_head_id.setShowType("checkbox"); +// jform_cgreport_head_id.setLength(36); +// jform_cgreport_head_id.setType("string"); +// jform_cgreport_head_id.setOrderNum(0); +// jform_cgreport_head_id.setPointLength(0); +// jform_cgreport_head_id.setQueryMode("single"); +// jform_cgreport_head_id.setContent("涓婚敭"); +// jform_cgreport_head_id.setCreateBy("admin"); +// jform_cgreport_head_id.setCreateDate(new Date()); +// jform_cgreport_head_id.setCreateName("绠$悊鍛"); +// jform_cgreport_head_id.setDictField(""); +// jform_cgreport_head_id.setDictTable(""); +// jform_cgreport_head_id.setMainTable(""); +// jform_cgreport_head_id.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_head_id); +// +// CgFormFieldEntity jform_cgreport_head_code = new CgFormFieldEntity(); +// jform_cgreport_head_code.setFieldName("code"); +// jform_cgreport_head_code.setTable(jform_cgreport_head); +// jform_cgreport_head_code.setFieldLength(120); +// jform_cgreport_head_code.setIsKey("N"); +// jform_cgreport_head_code.setIsNull("N"); +// jform_cgreport_head_code.setIsQuery("Y"); +// jform_cgreport_head_code.setIsShow("Y"); +// jform_cgreport_head_code.setIsShowList("Y"); +// jform_cgreport_head_code.setShowType("text"); +// jform_cgreport_head_code.setLength(36); +// jform_cgreport_head_code.setType("string"); +// jform_cgreport_head_code.setOrderNum(1); +// jform_cgreport_head_code.setPointLength(0); +// jform_cgreport_head_code.setQueryMode("single"); +// jform_cgreport_head_code.setContent("缂栫爜"); +// jform_cgreport_head_code.setCreateBy("admin"); +// jform_cgreport_head_code.setCreateDate(new Date()); +// jform_cgreport_head_code.setCreateName("绠$悊鍛"); +// jform_cgreport_head_code.setDictField(""); +// jform_cgreport_head_code.setDictTable(""); +// jform_cgreport_head_code.setMainTable(""); +// jform_cgreport_head_code.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_head_code); +// +// CgFormFieldEntity jform_cgreport_head_name = new CgFormFieldEntity(); +// jform_cgreport_head_name.setFieldName("name"); +// jform_cgreport_head_name.setTable(jform_cgreport_head); +// jform_cgreport_head_name.setFieldLength(120); +// jform_cgreport_head_name.setIsKey("N"); +// jform_cgreport_head_name.setIsNull("N"); +// jform_cgreport_head_name.setIsQuery("Y"); +// jform_cgreport_head_name.setIsShow("Y"); +// jform_cgreport_head_name.setIsShowList("Y"); +// jform_cgreport_head_name.setShowType("text"); +// jform_cgreport_head_name.setLength(100); +// jform_cgreport_head_name.setType("string"); +// jform_cgreport_head_name.setOrderNum(2); +// jform_cgreport_head_name.setPointLength(0); +// jform_cgreport_head_name.setQueryMode("single"); +// jform_cgreport_head_name.setContent("鍚嶇О"); +// jform_cgreport_head_name.setCreateBy("admin"); +// jform_cgreport_head_name.setCreateDate(new Date()); +// jform_cgreport_head_name.setCreateName("绠$悊鍛"); +// jform_cgreport_head_name.setDictField(""); +// jform_cgreport_head_name.setDictTable(""); +// jform_cgreport_head_name.setMainTable(""); +// jform_cgreport_head_name.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_head_name); +// +// CgFormFieldEntity jform_cgreport_head_cgr_sql = new CgFormFieldEntity(); +// jform_cgreport_head_cgr_sql.setFieldName("cgr_sql"); +// jform_cgreport_head_cgr_sql.setTable(jform_cgreport_head); +// jform_cgreport_head_cgr_sql.setFieldLength(120); +// jform_cgreport_head_cgr_sql.setIsKey("N"); +// jform_cgreport_head_cgr_sql.setIsNull("N"); +// jform_cgreport_head_cgr_sql.setIsQuery("Y"); +// jform_cgreport_head_cgr_sql.setIsShow("Y"); +// jform_cgreport_head_cgr_sql.setIsShowList("Y"); +// jform_cgreport_head_cgr_sql.setShowType("textarea"); +// jform_cgreport_head_cgr_sql.setLength(2000); +// jform_cgreport_head_cgr_sql.setType("string"); +// jform_cgreport_head_cgr_sql.setOrderNum(3); +// jform_cgreport_head_cgr_sql.setPointLength(0); +// jform_cgreport_head_cgr_sql.setQueryMode("single"); +// jform_cgreport_head_cgr_sql.setContent("鏌ヨ鏁版嵁SQL"); +// jform_cgreport_head_cgr_sql.setCreateBy("admin"); +// jform_cgreport_head_cgr_sql.setCreateDate(new Date()); +// jform_cgreport_head_cgr_sql.setCreateName("绠$悊鍛"); +// jform_cgreport_head_cgr_sql.setDictField(""); +// jform_cgreport_head_cgr_sql.setDictTable(""); +// jform_cgreport_head_cgr_sql.setMainTable(""); +// jform_cgreport_head_cgr_sql.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_head_cgr_sql); +// +// CgFormFieldEntity jform_cgreport_head_content = new CgFormFieldEntity(); +// jform_cgreport_head_content.setFieldName("content"); +// jform_cgreport_head_content.setTable(jform_cgreport_head); +// jform_cgreport_head_content.setFieldLength(120); +// jform_cgreport_head_content.setIsKey("N"); +// jform_cgreport_head_content.setIsNull("N"); +// jform_cgreport_head_content.setIsQuery("Y"); +// jform_cgreport_head_content.setIsShow("Y"); +// jform_cgreport_head_content.setIsShowList("Y"); +// jform_cgreport_head_content.setShowType("textarea"); +// jform_cgreport_head_content.setLength(1000); +// jform_cgreport_head_content.setType("string"); +// jform_cgreport_head_content.setOrderNum(4); +// jform_cgreport_head_content.setPointLength(0); +// jform_cgreport_head_content.setQueryMode("single"); +// jform_cgreport_head_content.setContent("鎻忚堪"); +// jform_cgreport_head_content.setCreateBy("admin"); +// jform_cgreport_head_content.setCreateDate(new Date()); +// jform_cgreport_head_content.setCreateName("绠$悊鍛"); +// jform_cgreport_head_content.setDictField(""); +// jform_cgreport_head_content.setDictTable(""); +// jform_cgreport_head_content.setMainTable(""); +// jform_cgreport_head_content.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_head_content); +// +// // 琛ㄥ崟[鍔ㄦ佹姤琛ㄩ厤缃槑缁哴 - 瀛楁娓呭崟 +// CgFormHeadEntity jform_cgreport_item = commonDao.findByProperty( +// CgFormHeadEntity.class, "tableName", "jform_cgreport_item") +// .get(0); +// CgFormFieldEntity jform_cgreport_item_id = new CgFormFieldEntity(); +// jform_cgreport_item_id.setFieldName("id"); +// jform_cgreport_item_id.setTable(jform_cgreport_item); +// jform_cgreport_item_id.setFieldLength(120); +// jform_cgreport_item_id.setIsKey("Y"); +// jform_cgreport_item_id.setIsNull("N"); +// jform_cgreport_item_id.setIsQuery("N"); +// jform_cgreport_item_id.setIsShow("N"); +// jform_cgreport_item_id.setIsShowList("N"); +// jform_cgreport_item_id.setShowType("checkbox"); +// jform_cgreport_item_id.setLength(36); +// jform_cgreport_item_id.setType("string"); +// jform_cgreport_item_id.setOrderNum(0); +// jform_cgreport_item_id.setPointLength(0); +// jform_cgreport_item_id.setQueryMode("single"); +// jform_cgreport_item_id.setContent("涓婚敭"); +// jform_cgreport_item_id.setCreateBy("admin"); +// jform_cgreport_item_id.setCreateDate(new Date()); +// jform_cgreport_item_id.setCreateName("绠$悊鍛"); +// jform_cgreport_item_id.setDictField(""); +// jform_cgreport_item_id.setDictTable(""); +// jform_cgreport_item_id.setMainTable(""); +// jform_cgreport_item_id.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_item_id); +// +// CgFormFieldEntity jform_cgreport_item_field_name = new CgFormFieldEntity(); +// jform_cgreport_item_field_name.setFieldName("field_name"); +// jform_cgreport_item_field_name.setTable(jform_cgreport_item); +// jform_cgreport_item_field_name.setFieldLength(120); +// jform_cgreport_item_field_name.setIsKey("N"); +// jform_cgreport_item_field_name.setIsNull("Y"); +// jform_cgreport_item_field_name.setIsQuery("N"); +// jform_cgreport_item_field_name.setIsShow("Y"); +// jform_cgreport_item_field_name.setIsShowList("Y"); +// jform_cgreport_item_field_name.setShowType("text"); +// jform_cgreport_item_field_name.setLength(36); +// jform_cgreport_item_field_name.setType("string"); +// jform_cgreport_item_field_name.setOrderNum(1); +// jform_cgreport_item_field_name.setPointLength(0); +// jform_cgreport_item_field_name.setQueryMode("single"); +// jform_cgreport_item_field_name.setContent("瀛楁鍚"); +// jform_cgreport_item_field_name.setCreateBy("admin"); +// jform_cgreport_item_field_name.setCreateDate(new Date()); +// jform_cgreport_item_field_name.setCreateName("绠$悊鍛"); +// jform_cgreport_item_field_name.setDictField(""); +// jform_cgreport_item_field_name.setDictTable(""); +// jform_cgreport_item_field_name.setMainTable(""); +// jform_cgreport_item_field_name.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_item_field_name); +// +// CgFormFieldEntity jform_cgreport_item_order_num = new CgFormFieldEntity(); +// jform_cgreport_item_order_num.setFieldName("order_num"); +// jform_cgreport_item_order_num.setTable(jform_cgreport_item); +// jform_cgreport_item_order_num.setFieldLength(120); +// jform_cgreport_item_order_num.setIsKey("N"); +// jform_cgreport_item_order_num.setIsNull("Y"); +// jform_cgreport_item_order_num.setIsQuery("N"); +// jform_cgreport_item_order_num.setIsShow("Y"); +// jform_cgreport_item_order_num.setIsShowList("Y"); +// jform_cgreport_item_order_num.setShowType("text"); +// jform_cgreport_item_order_num.setLength(10); +// jform_cgreport_item_order_num.setType("int"); +// jform_cgreport_item_order_num.setOrderNum(2); +// jform_cgreport_item_order_num.setPointLength(0); +// jform_cgreport_item_order_num.setQueryMode("single"); +// jform_cgreport_item_order_num.setContent("瀛楁搴忓彿"); +// jform_cgreport_item_order_num.setCreateBy("admin"); +// jform_cgreport_item_order_num.setCreateDate(new Date()); +// jform_cgreport_item_order_num.setCreateName("绠$悊鍛"); +// jform_cgreport_item_order_num.setDictField(""); +// jform_cgreport_item_order_num.setDictTable(""); +// jform_cgreport_item_order_num.setMainTable(""); +// jform_cgreport_item_order_num.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_item_order_num); +// +// CgFormFieldEntity jform_cgreport_item_s_mode = new CgFormFieldEntity(); +// jform_cgreport_item_s_mode.setFieldName("s_mode"); +// jform_cgreport_item_s_mode.setTable(jform_cgreport_item); +// jform_cgreport_item_s_mode.setFieldLength(120); +// jform_cgreport_item_s_mode.setIsKey("N"); +// jform_cgreport_item_s_mode.setIsNull("Y"); +// jform_cgreport_item_s_mode.setIsQuery("N"); +// jform_cgreport_item_s_mode.setIsShow("Y"); +// jform_cgreport_item_s_mode.setIsShowList("Y"); +// jform_cgreport_item_s_mode.setShowType("list"); +// jform_cgreport_item_s_mode.setLength(10); +// jform_cgreport_item_s_mode.setType("string"); +// jform_cgreport_item_s_mode.setOrderNum(5); +// jform_cgreport_item_s_mode.setPointLength(0); +// jform_cgreport_item_s_mode.setQueryMode("single"); +// jform_cgreport_item_s_mode.setContent("鏌ヨ妯″紡"); +// jform_cgreport_item_s_mode.setCreateBy("admin"); +// jform_cgreport_item_s_mode.setCreateDate(new Date()); +// jform_cgreport_item_s_mode.setCreateName("绠$悊鍛"); +// jform_cgreport_item_s_mode.setDictField("searchmode"); +// jform_cgreport_item_s_mode.setDictTable(""); +// jform_cgreport_item_s_mode.setMainTable(""); +// jform_cgreport_item_s_mode.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_item_s_mode); +// +// CgFormFieldEntity jform_cgreport_item_replace_va = new CgFormFieldEntity(); +// jform_cgreport_item_replace_va.setFieldName("replace_va"); +// jform_cgreport_item_replace_va.setTable(jform_cgreport_item); +// jform_cgreport_item_replace_va.setFieldLength(120); +// jform_cgreport_item_replace_va.setIsKey("N"); +// jform_cgreport_item_replace_va.setIsNull("Y"); +// jform_cgreport_item_replace_va.setIsQuery("N"); +// jform_cgreport_item_replace_va.setIsShow("Y"); +// jform_cgreport_item_replace_va.setIsShowList("Y"); +// jform_cgreport_item_replace_va.setShowType("text"); +// jform_cgreport_item_replace_va.setLength(36); +// jform_cgreport_item_replace_va.setType("string"); +// jform_cgreport_item_replace_va.setOrderNum(6); +// jform_cgreport_item_replace_va.setPointLength(0); +// jform_cgreport_item_replace_va.setQueryMode("single"); +// jform_cgreport_item_replace_va.setContent("鍙栧艰〃杈惧紡"); +// jform_cgreport_item_replace_va.setCreateBy("admin"); +// jform_cgreport_item_replace_va.setCreateDate(new Date()); +// jform_cgreport_item_replace_va.setCreateName("绠$悊鍛"); +// jform_cgreport_item_replace_va.setDictField(""); +// jform_cgreport_item_replace_va.setDictTable(""); +// jform_cgreport_item_replace_va.setMainTable(""); +// jform_cgreport_item_replace_va.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_item_replace_va); +// +// CgFormFieldEntity jform_cgreport_item_dict_code = new CgFormFieldEntity(); +// jform_cgreport_item_dict_code.setFieldName("dict_code"); +// jform_cgreport_item_dict_code.setTable(jform_cgreport_item); +// jform_cgreport_item_dict_code.setFieldLength(120); +// jform_cgreport_item_dict_code.setIsKey("N"); +// jform_cgreport_item_dict_code.setIsNull("Y"); +// jform_cgreport_item_dict_code.setIsQuery("N"); +// jform_cgreport_item_dict_code.setIsShow("Y"); +// jform_cgreport_item_dict_code.setIsShowList("Y"); +// jform_cgreport_item_dict_code.setShowType("text"); +// jform_cgreport_item_dict_code.setLength(36); +// jform_cgreport_item_dict_code.setType("string"); +// jform_cgreport_item_dict_code.setOrderNum(7); +// jform_cgreport_item_dict_code.setPointLength(0); +// jform_cgreport_item_dict_code.setQueryMode("single"); +// jform_cgreport_item_dict_code.setContent("瀛楀吀Code"); +// jform_cgreport_item_dict_code.setCreateBy("admin"); +// jform_cgreport_item_dict_code.setCreateDate(new Date()); +// jform_cgreport_item_dict_code.setCreateName("绠$悊鍛"); +// jform_cgreport_item_dict_code.setDictField(""); +// jform_cgreport_item_dict_code.setDictTable(""); +// jform_cgreport_item_dict_code.setMainTable(""); +// jform_cgreport_item_dict_code.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_item_dict_code); +// +// CgFormFieldEntity jform_cgreport_item_s_flag = new CgFormFieldEntity(); +// jform_cgreport_item_s_flag.setFieldName("s_flag"); +// jform_cgreport_item_s_flag.setTable(jform_cgreport_item); +// jform_cgreport_item_s_flag.setFieldLength(120); +// jform_cgreport_item_s_flag.setIsKey("N"); +// jform_cgreport_item_s_flag.setIsNull("Y"); +// jform_cgreport_item_s_flag.setIsQuery("N"); +// jform_cgreport_item_s_flag.setIsShow("Y"); +// jform_cgreport_item_s_flag.setIsShowList("Y"); +// jform_cgreport_item_s_flag.setShowType("list"); +// jform_cgreport_item_s_flag.setLength(2); +// jform_cgreport_item_s_flag.setType("string"); +// jform_cgreport_item_s_flag.setOrderNum(8); +// jform_cgreport_item_s_flag.setPointLength(0); +// jform_cgreport_item_s_flag.setQueryMode("single"); +// jform_cgreport_item_s_flag.setContent("鏄惁鏌ヨ"); +// jform_cgreport_item_s_flag.setCreateBy("admin"); +// jform_cgreport_item_s_flag.setCreateDate(new Date()); +// jform_cgreport_item_s_flag.setCreateName("绠$悊鍛"); +// jform_cgreport_item_s_flag.setDictField("yesorno"); +// jform_cgreport_item_s_flag.setDictTable(""); +// jform_cgreport_item_s_flag.setMainTable(""); +// jform_cgreport_item_s_flag.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_item_s_flag); +// +// CgFormFieldEntity jform_cgreport_item_cgrhead_id = new CgFormFieldEntity(); +// jform_cgreport_item_cgrhead_id.setFieldName("cgrhead_id"); +// jform_cgreport_item_cgrhead_id.setTable(jform_cgreport_item); +// jform_cgreport_item_cgrhead_id.setFieldLength(120); +// jform_cgreport_item_cgrhead_id.setIsKey("N"); +// jform_cgreport_item_cgrhead_id.setIsNull("Y"); +// jform_cgreport_item_cgrhead_id.setIsQuery("N"); +// jform_cgreport_item_cgrhead_id.setIsShow("N"); +// jform_cgreport_item_cgrhead_id.setIsShowList("N"); +// jform_cgreport_item_cgrhead_id.setShowType("text"); +// jform_cgreport_item_cgrhead_id.setLength(36); +// jform_cgreport_item_cgrhead_id.setType("string"); +// jform_cgreport_item_cgrhead_id.setOrderNum(9); +// jform_cgreport_item_cgrhead_id.setPointLength(0); +// jform_cgreport_item_cgrhead_id.setQueryMode("single"); +// jform_cgreport_item_cgrhead_id.setContent("澶栭敭"); +// jform_cgreport_item_cgrhead_id.setCreateBy("admin"); +// jform_cgreport_item_cgrhead_id.setCreateDate(new Date()); +// jform_cgreport_item_cgrhead_id.setCreateName("绠$悊鍛"); +// jform_cgreport_item_cgrhead_id.setDictField(""); +// jform_cgreport_item_cgrhead_id.setDictTable(""); +// jform_cgreport_item_cgrhead_id.setMainTable("jform_cgreport_head"); +// jform_cgreport_item_cgrhead_id.setMainField("id"); +// commonDao.saveOrUpdate(jform_cgreport_item_cgrhead_id); +// +// CgFormFieldEntity jform_cgreport_item_field_txt = new CgFormFieldEntity(); +// jform_cgreport_item_field_txt.setFieldName("field_txt"); +// jform_cgreport_item_field_txt.setTable(jform_cgreport_item); +// jform_cgreport_item_field_txt.setFieldLength(120); +// jform_cgreport_item_field_txt.setIsKey("N"); +// jform_cgreport_item_field_txt.setIsNull("Y"); +// jform_cgreport_item_field_txt.setIsQuery("N"); +// jform_cgreport_item_field_txt.setIsShow("Y"); +// jform_cgreport_item_field_txt.setIsShowList("Y"); +// jform_cgreport_item_field_txt.setShowType("text"); +// jform_cgreport_item_field_txt.setLength(1000); +// jform_cgreport_item_field_txt.setType("string"); +// jform_cgreport_item_field_txt.setOrderNum(3); +// jform_cgreport_item_field_txt.setPointLength(0); +// jform_cgreport_item_field_txt.setQueryMode("single"); +// jform_cgreport_item_field_txt.setContent("瀛楁鏂囨湰"); +// jform_cgreport_item_field_txt.setCreateBy("admin"); +// jform_cgreport_item_field_txt.setCreateDate(new Date()); +// jform_cgreport_item_field_txt.setCreateName("绠$悊鍛"); +// jform_cgreport_item_field_txt.setDictField(""); +// jform_cgreport_item_field_txt.setDictTable(""); +// jform_cgreport_item_field_txt.setMainTable(""); +// jform_cgreport_item_field_txt.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_item_field_txt); +// +// CgFormFieldEntity jform_cgreport_item_field_type = new CgFormFieldEntity(); +// jform_cgreport_item_field_type.setFieldName("field_type"); +// jform_cgreport_item_field_type.setTable(jform_cgreport_item); +// jform_cgreport_item_field_type.setFieldLength(120); +// jform_cgreport_item_field_type.setIsKey("N"); +// jform_cgreport_item_field_type.setIsNull("Y"); +// jform_cgreport_item_field_type.setIsQuery("N"); +// jform_cgreport_item_field_type.setIsShow("Y"); +// jform_cgreport_item_field_type.setIsShowList("Y"); +// jform_cgreport_item_field_type.setShowType("list"); +// jform_cgreport_item_field_type.setLength(10); +// jform_cgreport_item_field_type.setType("string"); +// jform_cgreport_item_field_type.setOrderNum(4); +// jform_cgreport_item_field_type.setPointLength(0); +// jform_cgreport_item_field_type.setQueryMode("single"); +// jform_cgreport_item_field_type.setContent("瀛楁绫诲瀷"); +// jform_cgreport_item_field_type.setCreateBy("admin"); +// jform_cgreport_item_field_type.setCreateDate(new Date()); +// jform_cgreport_item_field_type.setCreateName("绠$悊鍛"); +// jform_cgreport_item_field_type.setDictField("fieldtype"); +// jform_cgreport_item_field_type.setDictTable(""); +// jform_cgreport_item_field_type.setMainTable(""); +// jform_cgreport_item_field_type.setMainField(""); +// commonDao.saveOrUpdate(jform_cgreport_item_field_type); + + // 琛ㄥ崟[璁㈠崟瀹㈡埛淇℃伅] - 瀛楁娓呭崟 + CgFormHeadEntity jform_order_customer = commonDao.findByProperty( + CgFormHeadEntity.class, "tableName", "jform_order_customer") + .get(0); + CgFormFieldEntity jform_order_customer_id = new CgFormFieldEntity(); + jform_order_customer_id.setFieldName("id"); + jform_order_customer_id.setTable(jform_order_customer); + jform_order_customer_id.setFieldLength(0); + jform_order_customer_id.setIsKey("Y"); + jform_order_customer_id.setIsNull("N"); + jform_order_customer_id.setIsQuery("N"); + jform_order_customer_id.setIsShow("N"); + jform_order_customer_id.setIsShowList("N"); + jform_order_customer_id.setShowType("text"); + jform_order_customer_id.setLength(36); + jform_order_customer_id.setType("string"); + jform_order_customer_id.setOrderNum(0); + jform_order_customer_id.setPointLength(0); + jform_order_customer_id.setQueryMode("single"); + jform_order_customer_id.setContent("涓婚敭"); + jform_order_customer_id.setCreateBy("admin"); + jform_order_customer_id.setCreateDate(new Date()); + jform_order_customer_id.setCreateName("绠$悊鍛"); + jform_order_customer_id.setDictField(""); + jform_order_customer_id.setDictTable(""); + jform_order_customer_id.setMainTable(""); + jform_order_customer_id.setMainField(""); + commonDao.saveOrUpdate(jform_order_customer_id); + + CgFormFieldEntity jform_order_customer_name = new CgFormFieldEntity(); + jform_order_customer_name.setFieldName("name"); + jform_order_customer_name.setTable(jform_order_customer); + jform_order_customer_name.setFieldLength(0); + jform_order_customer_name.setIsKey("N"); + jform_order_customer_name.setIsNull("Y"); + jform_order_customer_name.setIsQuery("Y"); + jform_order_customer_name.setIsShow("Y"); + jform_order_customer_name.setIsShowList("Y"); + jform_order_customer_name.setShowType("text"); + jform_order_customer_name.setLength(32); + jform_order_customer_name.setType("string"); + jform_order_customer_name.setOrderNum(1); + jform_order_customer_name.setPointLength(0); + jform_order_customer_name.setQueryMode("single"); + jform_order_customer_name.setContent("瀹㈡埛鍚"); + jform_order_customer_name.setCreateBy("admin"); + jform_order_customer_name.setCreateDate(new Date()); + jform_order_customer_name.setCreateName("绠$悊鍛"); + jform_order_customer_name.setDictField(""); + jform_order_customer_name.setDictTable(""); + jform_order_customer_name.setMainTable(""); + jform_order_customer_name.setMainField(""); + commonDao.saveOrUpdate(jform_order_customer_name); + + CgFormFieldEntity jform_order_customer_money = new CgFormFieldEntity(); + jform_order_customer_money.setFieldName("money"); + jform_order_customer_money.setTable(jform_order_customer); + jform_order_customer_money.setFieldLength(0); + jform_order_customer_money.setIsKey("N"); + jform_order_customer_money.setIsNull("Y"); + jform_order_customer_money.setIsQuery("Y"); + jform_order_customer_money.setIsShow("Y"); + jform_order_customer_money.setIsShowList("Y"); + jform_order_customer_money.setShowType("text"); + jform_order_customer_money.setLength(10); + jform_order_customer_money.setType("double"); + jform_order_customer_money.setOrderNum(2); + jform_order_customer_money.setPointLength(2); + jform_order_customer_money.setQueryMode("group"); + jform_order_customer_money.setContent("鍗曚环"); + jform_order_customer_money.setCreateBy("admin"); + jform_order_customer_money.setCreateDate(new Date()); + jform_order_customer_money.setCreateName("绠$悊鍛"); + jform_order_customer_money.setDictField(""); + jform_order_customer_money.setDictTable(""); + jform_order_customer_money.setMainTable(""); + jform_order_customer_money.setMainField(""); + commonDao.saveOrUpdate(jform_order_customer_money); + + CgFormFieldEntity jform_order_customer_fk_id = new CgFormFieldEntity(); + jform_order_customer_fk_id.setFieldName("fk_id"); + jform_order_customer_fk_id.setTable(jform_order_customer); + jform_order_customer_fk_id.setFieldLength(120); + jform_order_customer_fk_id.setIsKey("N"); + jform_order_customer_fk_id.setIsNull("N"); + jform_order_customer_fk_id.setIsQuery("Y"); + jform_order_customer_fk_id.setIsShow("N"); + jform_order_customer_fk_id.setIsShowList("N"); + jform_order_customer_fk_id.setShowType("text"); + jform_order_customer_fk_id.setLength(36); + jform_order_customer_fk_id.setType("string"); + jform_order_customer_fk_id.setOrderNum(5); + jform_order_customer_fk_id.setPointLength(0); + jform_order_customer_fk_id.setQueryMode("single"); + jform_order_customer_fk_id.setContent("澶栭敭"); + jform_order_customer_fk_id.setCreateBy("admin"); + jform_order_customer_fk_id.setCreateDate(new Date()); + jform_order_customer_fk_id.setCreateName("绠$悊鍛"); + jform_order_customer_fk_id.setDictField(""); + jform_order_customer_fk_id.setDictTable(""); + jform_order_customer_fk_id.setMainTable("jform_order_main"); + jform_order_customer_fk_id.setMainField("id"); + commonDao.saveOrUpdate(jform_order_customer_fk_id); + + CgFormFieldEntity jform_order_customer_telphone = new CgFormFieldEntity(); + jform_order_customer_telphone.setFieldName("telphone"); + jform_order_customer_telphone.setTable(jform_order_customer); + jform_order_customer_telphone.setFieldLength(120); + jform_order_customer_telphone.setIsKey("N"); + jform_order_customer_telphone.setIsNull("Y"); + jform_order_customer_telphone.setIsQuery("Y"); + jform_order_customer_telphone.setIsShow("Y"); + jform_order_customer_telphone.setIsShowList("Y"); + jform_order_customer_telphone.setShowType("text"); + jform_order_customer_telphone.setLength(32); + jform_order_customer_telphone.setType("string"); + jform_order_customer_telphone.setOrderNum(4); + jform_order_customer_telphone.setPointLength(0); + jform_order_customer_telphone.setQueryMode("single"); + jform_order_customer_telphone.setContent("鐢佃瘽"); + jform_order_customer_telphone.setCreateBy("admin"); + jform_order_customer_telphone.setCreateDate(new Date()); + jform_order_customer_telphone.setCreateName("绠$悊鍛"); + jform_order_customer_telphone.setDictField(""); + jform_order_customer_telphone.setDictTable(""); + jform_order_customer_telphone.setMainTable(""); + jform_order_customer_telphone.setMainField(""); + commonDao.saveOrUpdate(jform_order_customer_telphone); + + CgFormFieldEntity jform_order_customer_sex = new CgFormFieldEntity(); + jform_order_customer_sex.setFieldName("sex"); + jform_order_customer_sex.setTable(jform_order_customer); + jform_order_customer_sex.setFieldLength(120); + jform_order_customer_sex.setIsKey("N"); + jform_order_customer_sex.setIsNull("Y"); + jform_order_customer_sex.setIsQuery("Y"); + jform_order_customer_sex.setIsShow("Y"); + jform_order_customer_sex.setIsShowList("Y"); + jform_order_customer_sex.setShowType("select"); + jform_order_customer_sex.setLength(4); + jform_order_customer_sex.setType("string"); + jform_order_customer_sex.setOrderNum(3); + jform_order_customer_sex.setPointLength(0); + jform_order_customer_sex.setQueryMode("single"); + jform_order_customer_sex.setContent("鎬у埆"); + jform_order_customer_sex.setCreateBy("admin"); + jform_order_customer_sex.setCreateDate(new Date()); + jform_order_customer_sex.setCreateName("绠$悊鍛"); + jform_order_customer_sex.setDictField("sex"); + jform_order_customer_sex.setDictTable(""); + jform_order_customer_sex.setMainTable(""); + jform_order_customer_sex.setMainField(""); + commonDao.saveOrUpdate(jform_order_customer_sex); + + // 琛ㄥ崟[璁㈠崟鏈虹エ淇℃伅] - 瀛楁娓呭崟 + CgFormHeadEntity jform_order_ticket = commonDao.findByProperty( + CgFormHeadEntity.class, "tableName", "jform_order_ticket").get( + 0); + CgFormFieldEntity jform_order_ticket_id = new CgFormFieldEntity(); + jform_order_ticket_id.setFieldName("id"); + jform_order_ticket_id.setTable(jform_order_ticket); + jform_order_ticket_id.setFieldLength(120); + jform_order_ticket_id.setIsKey("Y"); + jform_order_ticket_id.setIsNull("N"); + jform_order_ticket_id.setIsQuery("N"); + jform_order_ticket_id.setIsShow("N"); + jform_order_ticket_id.setIsShowList("N"); + jform_order_ticket_id.setShowType("checkbox"); + jform_order_ticket_id.setLength(36); + jform_order_ticket_id.setType("string"); + jform_order_ticket_id.setOrderNum(0); + jform_order_ticket_id.setPointLength(0); + jform_order_ticket_id.setQueryMode("single"); + jform_order_ticket_id.setContent("涓婚敭"); + jform_order_ticket_id.setCreateBy("admin"); + jform_order_ticket_id.setCreateDate(new Date()); + jform_order_ticket_id.setCreateName("绠$悊鍛"); + jform_order_ticket_id.setDictField(""); + jform_order_ticket_id.setDictTable(""); + jform_order_ticket_id.setMainTable(""); + jform_order_ticket_id.setMainField(""); + commonDao.saveOrUpdate(jform_order_ticket_id); + + CgFormFieldEntity jform_order_ticket_ticket_code = new CgFormFieldEntity(); + jform_order_ticket_ticket_code.setFieldName("ticket_code"); + jform_order_ticket_ticket_code.setTable(jform_order_ticket); + jform_order_ticket_ticket_code.setFieldLength(120); + jform_order_ticket_ticket_code.setIsKey("N"); + jform_order_ticket_ticket_code.setIsNull("N"); + jform_order_ticket_ticket_code.setIsQuery("Y"); + jform_order_ticket_ticket_code.setIsShow("Y"); + jform_order_ticket_ticket_code.setIsShowList("Y"); + jform_order_ticket_ticket_code.setShowType("text"); + jform_order_ticket_ticket_code.setLength(100); + jform_order_ticket_ticket_code.setType("string"); + jform_order_ticket_ticket_code.setOrderNum(1); + jform_order_ticket_ticket_code.setPointLength(0); + jform_order_ticket_ticket_code.setQueryMode("single"); + jform_order_ticket_ticket_code.setContent("鑸彮鍙"); + jform_order_ticket_ticket_code.setCreateBy("admin"); + jform_order_ticket_ticket_code.setCreateDate(new Date()); + jform_order_ticket_ticket_code.setCreateName("绠$悊鍛"); + jform_order_ticket_ticket_code.setDictField(""); + jform_order_ticket_ticket_code.setDictTable(""); + jform_order_ticket_ticket_code.setMainTable(""); + jform_order_ticket_ticket_code.setMainField(""); + commonDao.saveOrUpdate(jform_order_ticket_ticket_code); + + CgFormFieldEntity jform_order_ticket_tickect_date = new CgFormFieldEntity(); + jform_order_ticket_tickect_date.setFieldName("tickect_date"); + jform_order_ticket_tickect_date.setTable(jform_order_ticket); + jform_order_ticket_tickect_date.setFieldLength(120); + jform_order_ticket_tickect_date.setIsKey("N"); + jform_order_ticket_tickect_date.setIsNull("N"); + jform_order_ticket_tickect_date.setIsQuery("Y"); + jform_order_ticket_tickect_date.setIsShow("Y"); + jform_order_ticket_tickect_date.setIsShowList("Y"); + jform_order_ticket_tickect_date.setShowType("datetime"); + jform_order_ticket_tickect_date.setLength(10); + jform_order_ticket_tickect_date.setType("Date"); + jform_order_ticket_tickect_date.setOrderNum(2); + jform_order_ticket_tickect_date.setPointLength(0); + jform_order_ticket_tickect_date.setQueryMode("single"); + jform_order_ticket_tickect_date.setContent("鑸彮鏃堕棿"); + jform_order_ticket_tickect_date.setCreateBy("admin"); + jform_order_ticket_tickect_date.setCreateDate(new Date()); + jform_order_ticket_tickect_date.setCreateName("绠$悊鍛"); + jform_order_ticket_tickect_date.setDictField(""); + jform_order_ticket_tickect_date.setDictTable(""); + jform_order_ticket_tickect_date.setMainTable(""); + jform_order_ticket_tickect_date.setMainField(""); + commonDao.saveOrUpdate(jform_order_ticket_tickect_date); + + CgFormFieldEntity jform_order_ticket_fck_id = new CgFormFieldEntity(); + jform_order_ticket_fck_id.setFieldName("fck_id"); + jform_order_ticket_fck_id.setTable(jform_order_ticket); + jform_order_ticket_fck_id.setFieldLength(120); + jform_order_ticket_fck_id.setIsKey("N"); + jform_order_ticket_fck_id.setIsNull("N"); + jform_order_ticket_fck_id.setIsQuery("N"); + jform_order_ticket_fck_id.setIsShow("N"); + jform_order_ticket_fck_id.setIsShowList("N"); + jform_order_ticket_fck_id.setShowType("text"); + jform_order_ticket_fck_id.setLength(36); + jform_order_ticket_fck_id.setType("string"); + jform_order_ticket_fck_id.setOrderNum(3); + jform_order_ticket_fck_id.setPointLength(0); + jform_order_ticket_fck_id.setQueryMode("single"); + jform_order_ticket_fck_id.setContent("澶栭敭"); + jform_order_ticket_fck_id.setCreateBy("admin"); + jform_order_ticket_fck_id.setCreateDate(new Date()); + jform_order_ticket_fck_id.setCreateName("绠$悊鍛"); + jform_order_ticket_fck_id.setDictField(""); + jform_order_ticket_fck_id.setDictTable(""); + jform_order_ticket_fck_id.setMainTable("jform_order_main"); + jform_order_ticket_fck_id.setMainField("id"); + commonDao.saveOrUpdate(jform_order_ticket_fck_id); + + // 琛ㄥ崟[浠锋牸璁よ瘉鏈烘瀯缁熻琛╙ - 瀛楁娓呭崟 + CgFormHeadEntity jform_price1 = commonDao.findByProperty( + CgFormHeadEntity.class, "tableName", "jform_price1").get(0); + CgFormFieldEntity jform_price1_id = new CgFormFieldEntity(); + jform_price1_id.setFieldName("id"); + jform_price1_id.setTable(jform_price1); + jform_price1_id.setFieldLength(0); + jform_price1_id.setIsKey("Y"); + jform_price1_id.setIsNull("N"); + jform_price1_id.setIsQuery("N"); + jform_price1_id.setIsShow("N"); + jform_price1_id.setIsShowList("N"); + jform_price1_id.setShowType("text"); + jform_price1_id.setLength(36); + jform_price1_id.setType("string"); + jform_price1_id.setOrderNum(0); + jform_price1_id.setPointLength(0); + jform_price1_id.setQueryMode("single"); + jform_price1_id.setContent("涓婚敭"); + jform_price1_id.setCreateBy("admin"); + jform_price1_id.setCreateDate(new Date()); + jform_price1_id.setCreateName("绠$悊鍛"); + jform_price1_id.setDictField(""); + jform_price1_id.setDictTable(""); + jform_price1_id.setMainTable(""); + jform_price1_id.setMainField(""); + commonDao.saveOrUpdate(jform_price1_id); + + CgFormFieldEntity jform_price1_a = new CgFormFieldEntity(); + jform_price1_a.setFieldName("a"); + jform_price1_a.setTable(jform_price1); + jform_price1_a.setFieldLength(0); + jform_price1_a.setIsKey("N"); + jform_price1_a.setIsNull("N"); + jform_price1_a.setIsQuery("Y"); + jform_price1_a.setIsShow("Y"); + jform_price1_a.setIsShowList("Y"); + jform_price1_a.setShowType("text"); + jform_price1_a.setLength(10); + jform_price1_a.setType("double"); + jform_price1_a.setOrderNum(1); + jform_price1_a.setPointLength(2); + jform_price1_a.setQueryMode("group"); + jform_price1_a.setContent("鏈烘瀯鍚堣"); + jform_price1_a.setCreateBy("admin"); + jform_price1_a.setCreateDate(new Date()); + jform_price1_a.setCreateName("绠$悊鍛"); + jform_price1_a.setDictField(""); + jform_price1_a.setDictTable(""); + jform_price1_a.setMainTable(""); + jform_price1_a.setMainField(""); + commonDao.saveOrUpdate(jform_price1_a); + + CgFormFieldEntity jform_price1_b1 = new CgFormFieldEntity(); + jform_price1_b1.setFieldName("b1"); + jform_price1_b1.setTable(jform_price1); + jform_price1_b1.setFieldLength(0); + jform_price1_b1.setIsKey("N"); + jform_price1_b1.setIsNull("N"); + jform_price1_b1.setIsQuery("N"); + jform_price1_b1.setIsShow("Y"); + jform_price1_b1.setIsShowList("Y"); + jform_price1_b1.setShowType("text"); + jform_price1_b1.setLength(10); + jform_price1_b1.setType("double"); + jform_price1_b1.setOrderNum(2); + jform_price1_b1.setPointLength(2); + jform_price1_b1.setQueryMode("group"); + jform_price1_b1.setContent("琛屾斂灏忚"); + jform_price1_b1.setCreateBy("admin"); + jform_price1_b1.setCreateDate(new Date()); + jform_price1_b1.setCreateName("绠$悊鍛"); + jform_price1_b1.setDictField(""); + jform_price1_b1.setDictTable(""); + jform_price1_b1.setMainTable(""); + jform_price1_b1.setMainField(""); + commonDao.saveOrUpdate(jform_price1_b1); + + CgFormFieldEntity jform_price1_b11 = new CgFormFieldEntity(); + jform_price1_b11.setFieldName("b11"); + jform_price1_b11.setTable(jform_price1); + jform_price1_b11.setFieldLength(0); + jform_price1_b11.setIsKey("N"); + jform_price1_b11.setIsNull("N"); + jform_price1_b11.setIsQuery("N"); + jform_price1_b11.setIsShow("Y"); + jform_price1_b11.setIsShowList("Y"); + jform_price1_b11.setShowType("text"); + jform_price1_b11.setLength(100); + jform_price1_b11.setType("string"); + jform_price1_b11.setOrderNum(3); + jform_price1_b11.setPointLength(0); + jform_price1_b11.setQueryMode("group"); + jform_price1_b11.setContent("琛屾斂鐪"); + jform_price1_b11.setCreateBy("admin"); + jform_price1_b11.setCreateDate(new Date()); + jform_price1_b11.setCreateName("绠$悊鍛"); + jform_price1_b11.setDictField(""); + jform_price1_b11.setDictTable(""); + jform_price1_b11.setMainTable(""); + jform_price1_b11.setMainField(""); + commonDao.saveOrUpdate(jform_price1_b11); + + CgFormFieldEntity jform_price1_b12 = new CgFormFieldEntity(); + jform_price1_b12.setFieldName("b12"); + jform_price1_b12.setTable(jform_price1); + jform_price1_b12.setFieldLength(0); + jform_price1_b12.setIsKey("N"); + jform_price1_b12.setIsNull("N"); + jform_price1_b12.setIsQuery("N"); + jform_price1_b12.setIsShow("Y"); + jform_price1_b12.setIsShowList("Y"); + jform_price1_b12.setShowType("text"); + jform_price1_b12.setLength(100); + jform_price1_b12.setType("string"); + jform_price1_b12.setOrderNum(4); + jform_price1_b12.setPointLength(0); + jform_price1_b12.setQueryMode("group"); + jform_price1_b12.setContent("琛屾斂甯"); + jform_price1_b12.setCreateBy("admin"); + jform_price1_b12.setCreateDate(new Date()); + jform_price1_b12.setCreateName("绠$悊鍛"); + jform_price1_b12.setDictField(""); + jform_price1_b12.setDictTable(""); + jform_price1_b12.setMainTable(""); + jform_price1_b12.setMainField(""); + commonDao.saveOrUpdate(jform_price1_b12); + + CgFormFieldEntity jform_price1_b13 = new CgFormFieldEntity(); + jform_price1_b13.setFieldName("b13"); + jform_price1_b13.setTable(jform_price1); + jform_price1_b13.setFieldLength(0); + jform_price1_b13.setIsKey("N"); + jform_price1_b13.setIsNull("N"); + jform_price1_b13.setIsQuery("N"); + jform_price1_b13.setIsShow("Y"); + jform_price1_b13.setIsShowList("Y"); + jform_price1_b13.setShowType("text"); + jform_price1_b13.setLength(100); + jform_price1_b13.setType("string"); + jform_price1_b13.setOrderNum(5); + jform_price1_b13.setPointLength(0); + jform_price1_b13.setQueryMode("single"); + jform_price1_b13.setContent("琛屾斂鍘"); + jform_price1_b13.setCreateBy("admin"); + jform_price1_b13.setCreateDate(new Date()); + jform_price1_b13.setCreateName("绠$悊鍛"); + jform_price1_b13.setDictField(""); + jform_price1_b13.setDictTable(""); + jform_price1_b13.setMainTable(""); + jform_price1_b13.setMainField(""); + commonDao.saveOrUpdate(jform_price1_b13); + + CgFormFieldEntity jform_price1_b2 = new CgFormFieldEntity(); + jform_price1_b2.setFieldName("b2"); + jform_price1_b2.setTable(jform_price1); + jform_price1_b2.setFieldLength(0); + jform_price1_b2.setIsKey("N"); + jform_price1_b2.setIsNull("N"); + jform_price1_b2.setIsQuery("N"); + jform_price1_b2.setIsShow("Y"); + jform_price1_b2.setIsShowList("Y"); + jform_price1_b2.setShowType("text"); + jform_price1_b2.setLength(10); + jform_price1_b2.setType("double"); + jform_price1_b2.setOrderNum(6); + jform_price1_b2.setPointLength(2); + jform_price1_b2.setQueryMode("single"); + jform_price1_b2.setContent("浜嬩笟鍚堣"); + jform_price1_b2.setCreateBy("admin"); + jform_price1_b2.setCreateDate(new Date()); + jform_price1_b2.setCreateName("绠$悊鍛"); + jform_price1_b2.setDictField(""); + jform_price1_b2.setDictTable(""); + jform_price1_b2.setMainTable(""); + jform_price1_b2.setMainField(""); + commonDao.saveOrUpdate(jform_price1_b2); + + CgFormFieldEntity jform_price1_b3 = new CgFormFieldEntity(); + jform_price1_b3.setFieldName("b3"); + jform_price1_b3.setTable(jform_price1); + jform_price1_b3.setFieldLength(0); + jform_price1_b3.setIsKey("N"); + jform_price1_b3.setIsNull("N"); + jform_price1_b3.setIsQuery("N"); + jform_price1_b3.setIsShow("Y"); + jform_price1_b3.setIsShowList("Y"); + jform_price1_b3.setShowType("text"); + jform_price1_b3.setLength(10); + jform_price1_b3.setType("double"); + jform_price1_b3.setOrderNum(7); + jform_price1_b3.setPointLength(2); + jform_price1_b3.setQueryMode("single"); + jform_price1_b3.setContent("鍙傚叕灏忚"); + jform_price1_b3.setCreateBy("admin"); + jform_price1_b3.setCreateDate(new Date()); + jform_price1_b3.setCreateName("绠$悊鍛"); + jform_price1_b3.setDictField(""); + jform_price1_b3.setDictTable(""); + jform_price1_b3.setMainTable(""); + jform_price1_b3.setMainField(""); + commonDao.saveOrUpdate(jform_price1_b3); + + CgFormFieldEntity jform_price1_b31 = new CgFormFieldEntity(); + jform_price1_b31.setFieldName("b31"); + jform_price1_b31.setTable(jform_price1); + jform_price1_b31.setFieldLength(0); + jform_price1_b31.setIsKey("N"); + jform_price1_b31.setIsNull("N"); + jform_price1_b31.setIsQuery("N"); + jform_price1_b31.setIsShow("Y"); + jform_price1_b31.setIsShowList("Y"); + jform_price1_b31.setShowType("text"); + jform_price1_b31.setLength(100); + jform_price1_b31.setType("string"); + jform_price1_b31.setOrderNum(8); + jform_price1_b31.setPointLength(0); + jform_price1_b31.setQueryMode("single"); + jform_price1_b31.setContent("鍙傚叕鐪"); + jform_price1_b31.setCreateBy("admin"); + jform_price1_b31.setCreateDate(new Date()); + jform_price1_b31.setCreateName("绠$悊鍛"); + jform_price1_b31.setDictField(""); + jform_price1_b31.setDictTable(""); + jform_price1_b31.setMainTable(""); + jform_price1_b31.setMainField(""); + commonDao.saveOrUpdate(jform_price1_b31); + + CgFormFieldEntity jform_price1_b32 = new CgFormFieldEntity(); + jform_price1_b32.setFieldName("b32"); + jform_price1_b32.setTable(jform_price1); + jform_price1_b32.setFieldLength(0); + jform_price1_b32.setIsKey("N"); + jform_price1_b32.setIsNull("N"); + jform_price1_b32.setIsQuery("N"); + jform_price1_b32.setIsShow("Y"); + jform_price1_b32.setIsShowList("Y"); + jform_price1_b32.setShowType("text"); + jform_price1_b32.setLength(100); + jform_price1_b32.setType("string"); + jform_price1_b32.setOrderNum(9); + jform_price1_b32.setPointLength(0); + jform_price1_b32.setQueryMode("single"); + jform_price1_b32.setContent("鍙傚叕甯"); + jform_price1_b32.setCreateBy("admin"); + jform_price1_b32.setCreateDate(new Date()); + jform_price1_b32.setCreateName("绠$悊鍛"); + jform_price1_b32.setDictField(""); + jform_price1_b32.setDictTable(""); + jform_price1_b32.setMainTable(""); + jform_price1_b32.setMainField(""); + commonDao.saveOrUpdate(jform_price1_b32); + + CgFormFieldEntity jform_price1_b33 = new CgFormFieldEntity(); + jform_price1_b33.setFieldName("b33"); + jform_price1_b33.setTable(jform_price1); + jform_price1_b33.setFieldLength(0); + jform_price1_b33.setIsKey("N"); + jform_price1_b33.setIsNull("N"); + jform_price1_b33.setIsQuery("N"); + jform_price1_b33.setIsShow("Y"); + jform_price1_b33.setIsShowList("Y"); + jform_price1_b33.setShowType("text"); + jform_price1_b33.setLength(100); + jform_price1_b33.setType("string"); + jform_price1_b33.setOrderNum(10); + jform_price1_b33.setPointLength(0); + jform_price1_b33.setQueryMode("single"); + jform_price1_b33.setContent("鍙傚叕鍘"); + jform_price1_b33.setCreateBy("admin"); + jform_price1_b33.setCreateDate(new Date()); + jform_price1_b33.setCreateName("绠$悊鍛"); + jform_price1_b33.setDictField(""); + jform_price1_b33.setDictTable(""); + jform_price1_b33.setMainTable(""); + jform_price1_b33.setMainField(""); + commonDao.saveOrUpdate(jform_price1_b33); + + CgFormFieldEntity jform_price1_c1 = new CgFormFieldEntity(); + jform_price1_c1.setFieldName("c1"); + jform_price1_c1.setTable(jform_price1); + jform_price1_c1.setFieldLength(0); + jform_price1_c1.setIsKey("N"); + jform_price1_c1.setIsNull("N"); + jform_price1_c1.setIsQuery("N"); + jform_price1_c1.setIsShow("Y"); + jform_price1_c1.setIsShowList("Y"); + jform_price1_c1.setShowType("text"); + jform_price1_c1.setLength(10); + jform_price1_c1.setType("double"); + jform_price1_c1.setOrderNum(11); + jform_price1_c1.setPointLength(2); + jform_price1_c1.setQueryMode("single"); + jform_price1_c1.setContent("鍏ㄩ鎷ㄦ"); + jform_price1_c1.setCreateBy("admin"); + jform_price1_c1.setCreateDate(new Date()); + jform_price1_c1.setCreateName("绠$悊鍛"); + jform_price1_c1.setDictField(""); + jform_price1_c1.setDictTable(""); + jform_price1_c1.setMainTable(""); + jform_price1_c1.setMainField(""); + commonDao.saveOrUpdate(jform_price1_c1); + + CgFormFieldEntity jform_price1_c2 = new CgFormFieldEntity(); + jform_price1_c2.setFieldName("c2"); + jform_price1_c2.setTable(jform_price1); + jform_price1_c2.setFieldLength(0); + jform_price1_c2.setIsKey("N"); + jform_price1_c2.setIsNull("N"); + jform_price1_c2.setIsQuery("N"); + jform_price1_c2.setIsShow("Y"); + jform_price1_c2.setIsShowList("Y"); + jform_price1_c2.setShowType("text"); + jform_price1_c2.setLength(10); + jform_price1_c2.setType("double"); + jform_price1_c2.setOrderNum(12); + jform_price1_c2.setPointLength(2); + jform_price1_c2.setQueryMode("single"); + jform_price1_c2.setContent("宸鎷ㄦ"); + jform_price1_c2.setCreateBy("admin"); + jform_price1_c2.setCreateDate(new Date()); + jform_price1_c2.setCreateName("绠$悊鍛"); + jform_price1_c2.setDictField(""); + jform_price1_c2.setDictTable(""); + jform_price1_c2.setMainTable(""); + jform_price1_c2.setMainField(""); + commonDao.saveOrUpdate(jform_price1_c2); + + CgFormFieldEntity jform_price1_c3 = new CgFormFieldEntity(); + jform_price1_c3.setFieldName("c3"); + jform_price1_c3.setTable(jform_price1); + jform_price1_c3.setFieldLength(0); + jform_price1_c3.setIsKey("N"); + jform_price1_c3.setIsNull("N"); + jform_price1_c3.setIsQuery("N"); + jform_price1_c3.setIsShow("Y"); + jform_price1_c3.setIsShowList("Y"); + jform_price1_c3.setShowType("text"); + jform_price1_c3.setLength(10); + jform_price1_c3.setType("double"); + jform_price1_c3.setOrderNum(13); + jform_price1_c3.setPointLength(2); + jform_price1_c3.setQueryMode("single"); + jform_price1_c3.setContent("鑷敹鑷敮"); + jform_price1_c3.setCreateBy("admin"); + jform_price1_c3.setCreateDate(new Date()); + jform_price1_c3.setCreateName("绠$悊鍛"); + jform_price1_c3.setDictField(""); + jform_price1_c3.setDictTable(""); + jform_price1_c3.setMainTable(""); + jform_price1_c3.setMainField(""); + commonDao.saveOrUpdate(jform_price1_c3); + + CgFormFieldEntity jform_price1_d = new CgFormFieldEntity(); + jform_price1_d.setFieldName("d"); + jform_price1_d.setTable(jform_price1); + jform_price1_d.setFieldLength(0); + jform_price1_d.setIsKey("N"); + jform_price1_d.setIsNull("N"); + jform_price1_d.setIsQuery("Y"); + jform_price1_d.setIsShow("Y"); + jform_price1_d.setIsShowList("Y"); + jform_price1_d.setShowType("text"); + jform_price1_d.setLength(10); + jform_price1_d.setType("int"); + jform_price1_d.setOrderNum(14); + jform_price1_d.setPointLength(2); + jform_price1_d.setQueryMode("single"); + jform_price1_d.setContent("缁忚垂鍚堣"); + jform_price1_d.setCreateBy("admin"); + jform_price1_d.setCreateDate(new Date()); + jform_price1_d.setCreateName("绠$悊鍛"); + jform_price1_d.setDictField(""); + jform_price1_d.setDictTable(""); + jform_price1_d.setMainTable(""); + jform_price1_d.setMainField(""); + commonDao.saveOrUpdate(jform_price1_d); + + CgFormFieldEntity jform_price1_d1 = new CgFormFieldEntity(); + jform_price1_d1.setFieldName("d1"); + jform_price1_d1.setTable(jform_price1); + jform_price1_d1.setFieldLength(0); + jform_price1_d1.setIsKey("N"); + jform_price1_d1.setIsNull("N"); + jform_price1_d1.setIsQuery("N"); + jform_price1_d1.setIsShow("Y"); + jform_price1_d1.setIsShowList("Y"); + jform_price1_d1.setShowType("text"); + jform_price1_d1.setLength(1000); + jform_price1_d1.setType("string"); + jform_price1_d1.setOrderNum(15); + jform_price1_d1.setPointLength(0); + jform_price1_d1.setQueryMode("single"); + jform_price1_d1.setContent("鏈烘瀯璧勮川"); + jform_price1_d1.setCreateBy("admin"); + jform_price1_d1.setCreateDate(new Date()); + jform_price1_d1.setCreateName("绠$悊鍛"); + jform_price1_d1.setDictField(""); + jform_price1_d1.setDictTable(""); + jform_price1_d1.setMainTable(""); + jform_price1_d1.setMainField(""); + commonDao.saveOrUpdate(jform_price1_d1); + + } + + /** + * @Description 淇HTML鍦ㄧ嚎缂栬緫鍔熻兘 + * @author tanghan 2013-7-28 + */ + private void repairCkEditor() { + CKEditorEntity ckEditor = new CKEditorEntity(); + String str = "" + + "" + + "" + + "" + + "" + + "" + + "

    闄勪欢2锛

    " + + "浠锋牸璁よ瘉浜哄憳缁熻琛" + + "

    濉姤鍗曚綅锛堢洊绔狅級锛

    " + + "

    鍗曚綅浠g爜鍙凤細 " + + "                  " + + "                   " + + "                   " + + "  鍗曚綅锛氫汉濉               " + + "    鎶ユ棩鏈燂細      骞   鏈   鏃

    <" + + "form action='cgFormBuildController.do?saveOrUpdate' id='formobj' method='post' name='formobj'>" + + " " + + "#{jform_hidden_field}" + + "

     

    " + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "

     

     

    鍚堣

     

     

    浜烘暟

    " + + "

     

    瀛﹀巻

     

    鍙栧緱鐨勶紙涓婂矖锛夋墽涓氳祫鏍

    " + + "

    涓撲笟鎶鏈亴绉

    锛堢粡娴庣郴鍒椼佸伐绋嬬郴鍒楋級

    " + + "

    鍦ㄧ紪浜哄憳

    鑱樼敤浜哄憳

    " + + "

    涓存椂(鍊熺敤)浜哄憳

    楂樹腑

    澶т笓

    " + + "

    鏈

    鐮旂┒鐢

    鍏跺畠

    浠锋牸

    " + + "

    閴磋瘉鍛

    浠锋牸

    閴磋瘉甯

    澶嶆牳

    瑁佸畾鍛

    鍏跺畠

    鍒濈骇

    涓骇

    " + + "

    楂樼骇

    鍏跺畠

    鏈崟浣

    鍏跺畠

    闀挎湡

    鐭湡

    A1

    B1

    B2

    B3

    B4

    B5

    C1

    C2

    C3

    C4

    C5

    D1

    D2

    D3

    " + + "

    D4

    E1

    E2

    E3

    E4

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

    " + + "

     

    濉姤璇存槑锛

    涓銆佸悎璁★紙A锛夛細濉姤鑷崇粺璁℃埅姝㈡湡鐨勬湰鏈烘瀯鐨勪汉鍛樻绘暟銆

    " + + "

    浜屻佷汉鏁帮細

    鍦ㄧ紪浜哄憳锛氬垎鍒寜鐓т环鏍艰璇佹満鏋勭紪鍒跺唴鍙婂叾瀹冨叿鏈変环鏍间富绠¢儴闂ㄧ紪鍒剁殑瀹炴湁浜烘暟濉姤鍦˙1銆丅2鏍忓唴銆" + + "

    鑱樼敤浜哄憳锛氭寜鐓х粡浠锋牸涓荤閮ㄩ棬鎴栦环鏍艰璇佹満鏋勪汉浜嬮儴闂ㄨ鍙殑骞剁璁笁骞翠互涓婄殑宸ヤ綔鍚堝悓鐨勪汉鍛橈紙B3锛夛紱浠ュ強娌℃湁缁忚繃浠" + + "鏍间富绠¢儴闂ㄦ垨浠锋牸璁よ瘉鏈烘瀯浜轰簨閮ㄩ棬璁ゅ彲鐨勭璁㈠悎鍚屽皯浜庝笁骞寸殑浜哄憳锛圔4锛夊垎鍒潵杩涜缁熻銆

    涓存椂锛堝熺敤锛変汉鍛橈紙B5锛夛細鐗规寚" + + "澶栬仒鐨勪复鏃跺伐锛屾垨鑰呭伐浣滃叧绯讳笉鍦ㄦ湰鍗曚綅涓旀棤闀挎湡鑱樼敤鍚堝悓鐨勫熻皟浜哄憳绛夈

    涓夈佽〃鍐呭悇鏍忕洰鍏崇郴

    A=B1+B2+B3+B4+B5=C1+" + + "C2+C3+C4+C5=D1+D2+D3+D4=E1+E2+E3+E4

    "; + ckEditor.setContents(str.getBytes()); + commonDao.saveOrUpdate(ckEditor); + } + + /** + * @Description 淇鏃ュ織琛 + * @author tanghan 2013-7-28 + */ + private void repairLog() { + TSUser admin = commonDao.findByProperty(TSUser.class, "signatureFile", + "images/renfang/qm/licf.gif").get(0); + try { + TSLog log1 = new TSLog(); + log1.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log1.setBroswer("Chrome"); + log1.setNote("169.254.200.136"); + log1.setTSUser(admin); + log1.setOperatetime(DateUtils.parseTimestamp("2013-4-24 16:22:40", + "yyyy-MM-dd HH:mm")); + log1.setOperatetype((short) 1); + log1.setLoglevel((short) 1); + commonDao.saveOrUpdate(log1); + + TSLog log2 = new TSLog(); + log2.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log2.setBroswer("Chrome"); + log2.setNote("10.10.10.1"); + log2.setTSUser(admin); + log2.setOperatetime(DateUtils.parseTimestamp("2013-4-24 17:12:22", + "yyyy-MM-dd HH:mm")); + log2.setOperatetype((short) 1); + log2.setLoglevel((short) 1); + commonDao.saveOrUpdate(log2); + + TSLog log3 = new TSLog(); + log3.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log3.setBroswer("Chrome"); + log3.setNote("169.254.218.201"); + log3.setTSUser(admin); + log3.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:37:11", + "yyyy-MM-dd HH:mm")); + log3.setOperatetype((short) 1); + log3.setLoglevel((short) 1); + commonDao.saveOrUpdate(log3); + + TSLog log4 = new TSLog(); + log4.setLogcontent("鐢ㄦ埛admin宸查鍑"); + log4.setBroswer("Chrome"); + log4.setNote("169.254.218.201"); + log4.setTSUser(admin); + log4.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:38:33", + "yyyy-MM-dd HH:mm")); + log4.setOperatetype((short) 1); + log4.setLoglevel((short) 2); + commonDao.saveOrUpdate(log4); + + TSLog log5 = new TSLog(); + log5.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log5.setBroswer("MSIE 9.0"); + log5.setNote("169.254.218.201"); + log5.setTSUser(admin); + log5.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:38:42", + "yyyy-MM-dd HH:mm")); + log5.setOperatetype((short) 1); + log5.setLoglevel((short) 1); + commonDao.saveOrUpdate(log5); + + TSLog log6 = new TSLog(); + log6.setLogcontent("JeecgDemo渚嬪瓙: 12琚垹闄 鎴愬姛"); + log6.setBroswer("MSIE 9.0"); + log6.setNote("169.254.218.201"); + log6.setTSUser(admin); + log6.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:39:00", + "yyyy-MM-dd HH:mm")); + log6.setOperatetype((short) 1); + log6.setLoglevel((short) 4); + commonDao.saveOrUpdate(log6); + + TSLog log7 = new TSLog(); + log7.setLogcontent("JeecgDemo渚嬪瓙: 12琚垹闄 鎴愬姛"); + log7.setBroswer("MSIE 9.0"); + log7.setNote("169.254.218.201"); + log7.setTSUser(admin); + log7.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:39:02", + "yyyy-MM-dd HH:mm")); + log7.setOperatetype((short) 1); + log7.setLoglevel((short) 4); + commonDao.saveOrUpdate(log7); + + TSLog log8 = new TSLog(); + log8.setLogcontent("JeecgDemo渚嬪瓙: 12琚垹闄 鎴愬姛"); + log8.setBroswer("Chrome"); + log8.setNote("169.254.218.201"); + log8.setTSUser(admin); + log8.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:39:04", + "yyyy-MM-dd HH:mm")); + log8.setOperatetype((short) 1); + log8.setLoglevel((short) 4); + commonDao.saveOrUpdate(log8); + + TSLog log9 = new TSLog(); + log9.setLogcontent("鏉冮檺: 鍗曡〃妯″瀷琚洿鏂版垚鍔"); + log9.setBroswer("MSIE 9.0"); + log9.setNote("169.254.218.201"); + log9.setTSUser(admin); + log9.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:39:30", + "yyyy-MM-dd HH:mm")); + log9.setOperatetype((short) 1); + log9.setLoglevel((short) 5); + commonDao.saveOrUpdate(log9); + + TSLog log10 = new TSLog(); + log10.setLogcontent("鍒犻櫎鎴愬姛"); + log10.setBroswer("Chrome"); + log10.setNote("169.254.218.201"); + log10.setTSUser(admin); + log10.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:39:38", + "yyyy-MM-dd HH:mm")); + log10.setOperatetype((short) 1); + log10.setLoglevel((short) 4); + commonDao.saveOrUpdate(log10); + + TSLog log11 = new TSLog(); + log11.setLogcontent("鍒犻櫎鎴愬姛"); + log11.setBroswer("MSIE 9.0"); + log11.setNote("169.254.218.201"); + log11.setTSUser(admin); + log11.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:39:40", + "yyyy-MM-dd HH:mm")); + log11.setOperatetype((short) 1); + log11.setLoglevel((short) 4); + commonDao.saveOrUpdate(log11); + + TSLog log12 = new TSLog(); + log12.setLogcontent("鍒犻櫎鎴愬姛"); + log12.setBroswer("Chrome"); + log12.setNote("169.254.218.201"); + log12.setTSUser(admin); + log12.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:39:41", + "yyyy-MM-dd HH:mm")); + log12.setOperatetype((short) 1); + log12.setLoglevel((short) 4); + commonDao.saveOrUpdate(log12); + + TSLog log13 = new TSLog(); + log13.setLogcontent("鍒犻櫎鎴愬姛"); + log13.setBroswer("Firefox"); + log13.setNote("169.254.218.201"); + log13.setTSUser(admin); + log13.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:39:42", + "yyyy-MM-dd HH:mm")); + log13.setOperatetype((short) 1); + log13.setLoglevel((short) 4); + commonDao.saveOrUpdate(log13); + + TSLog log14 = new TSLog(); + log14.setLogcontent("娣诲姞鎴愬姛"); + log14.setBroswer("Chrome"); + log14.setNote("169.254.218.201"); + log14.setTSUser(admin); + log14.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:40:00", + "yyyy-MM-dd HH:mm")); + log14.setOperatetype((short) 1); + log14.setLoglevel((short) 3); + commonDao.saveOrUpdate(log14); + + TSLog log15 = new TSLog(); + log15.setLogcontent("鏇存柊鎴愬姛"); + log15.setBroswer("Chrome"); + log15.setNote("169.254.218.201"); + log15.setTSUser(admin); + log15.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:40:04", + "yyyy-MM-dd HH:mm")); + log15.setOperatetype((short) 1); + log15.setLoglevel((short) 5); + commonDao.saveOrUpdate(log15); + + TSLog log16 = new TSLog(); + log16.setLogcontent("JeecgDemo渚嬪瓙: 12琚坊鍔犳垚鍔"); + log16.setBroswer("Chrome"); + log16.setNote("169.254.218.201"); + log16.setTSUser(admin); + log16.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:40:44", + "yyyy-MM-dd HH:mm")); + log16.setOperatetype((short) 1); + log16.setLoglevel((short) 3); + commonDao.saveOrUpdate(log16); + + TSLog log17 = new TSLog(); + log17.setLogcontent("閮ㄩ棬: 淇℃伅閮ㄨ鏇存柊鎴愬姛"); + log17.setBroswer("Chrome"); + log17.setNote("169.254.218.201"); + log17.setTSUser(admin); + log17.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:41:26", + "yyyy-MM-dd HH:mm")); + log17.setOperatetype((short) 1); + log17.setLoglevel((short) 5); + commonDao.saveOrUpdate(log17); + + TSLog log18 = new TSLog(); + log18.setLogcontent("閮ㄩ棬: 璁捐閮ㄨ鏇存柊鎴愬姛"); + log18.setBroswer("Chrome"); + log18.setNote("169.254.218.201"); + log18.setTSUser(admin); + log18.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:41:38", + "yyyy-MM-dd HH:mm")); + log18.setOperatetype((short) 1); + log18.setLoglevel((short) 5); + commonDao.saveOrUpdate(log18); + + TSLog log19 = new TSLog(); + log19.setLogcontent("绫诲瀷: 淇℃伅閮ㄦ祦绋嬭鏇存柊鎴愬姛"); + log19.setBroswer("Chrome"); + log19.setNote("169.254.218.201"); + log19.setTSUser(admin); + log19.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:46:55", + "yyyy-MM-dd HH:mm")); + log19.setOperatetype((short) 1); + log19.setLoglevel((short) 5); + commonDao.saveOrUpdate(log19); + + TSLog log20 = new TSLog(); + log20.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log20.setBroswer("Chrome"); + log20.setNote("169.254.218.201"); + log20.setTSUser(admin); + log20.setOperatetime(DateUtils.parseTimestamp("2013-3-10 15:48:47", + "yyyy-MM-dd HH:mm")); + log20.setOperatetype((short) 1); + log20.setLoglevel((short) 1); + commonDao.saveOrUpdate(log20); + + TSLog log21 = new TSLog(); + log21.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log21.setBroswer("Firefox"); + log21.setNote("169.254.218.201"); + log21.setTSUser(admin); + log21.setOperatetime(DateUtils.parseTimestamp("2013-3-21 23:23:52", + "yyyy-MM-dd HH:mm")); + log21.setOperatetype((short) 1); + log21.setLoglevel((short) 1); + commonDao.saveOrUpdate(log21); + + TSLog log22 = new TSLog(); + log22.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log22.setBroswer("Chrome"); + log22.setNote("169.254.218.201"); + log22.setTSUser(admin); + log22.setOperatetime(DateUtils.parseTimestamp("2013-3-21 23:26:22", + "yyyy-MM-dd HH:mm")); + log22.setOperatetype((short) 1); + log22.setLoglevel((short) 1); + commonDao.saveOrUpdate(log22); + + TSLog log23 = new TSLog(); + log23.setLogcontent("鏉冮檺: 涓瀵瑰瀹炰緥琚坊鍔犳垚鍔"); + log23.setBroswer("Chrome"); + log23.setNote("169.254.218.201"); + log23.setTSUser(admin); + log23.setOperatetime(DateUtils.parseTimestamp("2013-3-21 23:28:34", + "yyyy-MM-dd HH:mm")); + log23.setOperatetype((short) 1); + log23.setLoglevel((short) 3); + commonDao.saveOrUpdate(log23); + + TSLog log24 = new TSLog(); + log24.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log24.setBroswer("Chrome"); + log24.setNote("169.254.218.201"); + log24.setTSUser(admin); + log24.setOperatetime(DateUtils.parseTimestamp("2013-3-22 8:25:07", + "yyyy-MM-dd HH:mm")); + log24.setOperatetype((short) 1); + log24.setLoglevel((short) 1); + commonDao.saveOrUpdate(log24); + + TSLog log25 = new TSLog(); + log25.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log25.setBroswer("Firefox"); + log25.setNote("169.254.218.201"); + log25.setTSUser(admin); + log25.setOperatetime(DateUtils.parseTimestamp("2013-3-22 9:05:25", + "yyyy-MM-dd HH:mm")); + log25.setOperatetype((short) 1); + log25.setLoglevel((short) 1); + commonDao.saveOrUpdate(log25); + + TSLog log26 = new TSLog(); + log26.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log26.setBroswer("Chrome"); + log26.setNote("169.254.218.201"); + log26.setTSUser(admin); + log26.setOperatetime(DateUtils.parseTimestamp("2013-3-22 9:09:05", + "yyyy-MM-dd HH:mm")); + log26.setOperatetype((short) 1); + log26.setLoglevel((short) 1); + commonDao.saveOrUpdate(log26); + + TSLog log27 = new TSLog(); + log27.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log27.setBroswer("MSIE 8.0"); + log27.setNote("169.254.218.201"); + log27.setTSUser(admin); + log27.setOperatetime(DateUtils.parseTimestamp("2013-3-22 9:28:50", + "yyyy-MM-dd HH:mm")); + log27.setOperatetype((short) 1); + log27.setLoglevel((short) 1); + commonDao.saveOrUpdate(log27); + + TSLog log28 = new TSLog(); + log28.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log28.setBroswer("Firefox"); + log28.setNote("169.254.218.201"); + log28.setTSUser(admin); + log28.setOperatetime(DateUtils.parseTimestamp("2013-3-22 10:32:59", + "yyyy-MM-dd HH:mm")); + log28.setOperatetype((short) 1); + log28.setLoglevel((short) 1); + commonDao.saveOrUpdate(log28); + + TSLog log29 = new TSLog(); + log29.setLogcontent("鐗╁搧: 绗旇鏈坊鍔犳垚鍔"); + log29.setBroswer("Chrome"); + log29.setNote("169.254.218.201"); + log29.setTSUser(admin); + log29.setOperatetime(DateUtils.parseTimestamp("2013-3-22 10:35:44", + "yyyy-MM-dd HH:mm")); + log29.setOperatetype((short) 1); + log29.setLoglevel((short) 3); + commonDao.saveOrUpdate(log29); + + TSLog log30 = new TSLog(); + log30.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log30.setBroswer("Firefox"); + log30.setNote("169.254.218.201"); + log30.setTSUser(admin); + log30.setOperatetime(DateUtils.parseTimestamp("2013-3-22 10:41:46", + "yyyy-MM-dd HH:mm")); + log30.setOperatetype((short) 1); + log30.setLoglevel((short) 1); + commonDao.saveOrUpdate(log30); + + TSLog log31 = new TSLog(); + log31.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log31.setBroswer("Firefox"); + log31.setNote("169.254.218.201"); + log31.setTSUser(admin); + log31.setOperatetime(DateUtils.parseTimestamp("2013-3-22 16:11:14", + "yyyy-MM-dd HH:mm")); + log31.setOperatetype((short) 1); + log31.setLoglevel((short) 1); + commonDao.saveOrUpdate(log31); + + TSLog log32 = new TSLog(); + log32.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log32.setBroswer("Chrome"); + log32.setNote("169.254.218.201"); + log32.setTSUser(admin); + log32.setOperatetime(DateUtils.parseTimestamp("2013-3-22 21:49:43", + "yyyy-MM-dd HH:mm")); + log32.setOperatetype((short) 1); + log32.setLoglevel((short) 1); + commonDao.saveOrUpdate(log32); + + TSLog log33 = new TSLog(); + log33.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log33.setBroswer("Chrome"); + log33.setNote("169.254.218.201"); + log33.setTSUser(admin); + log33.setOperatetime(DateUtils.parseTimestamp("2013-3-22 23:17:12", + "yyyy-MM-dd HH:mm")); + log33.setOperatetype((short) 1); + log33.setLoglevel((short) 1); + commonDao.saveOrUpdate(log33); + + TSLog log34 = new TSLog(); + log34.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log34.setBroswer("Chrome"); + log34.setNote("169.254.218.201"); + log34.setTSUser(admin); + log34.setOperatetime(DateUtils.parseTimestamp("2013-3-22 23:27:22", + "yyyy-MM-dd HH:mm")); + log34.setOperatetype((short) 1); + log34.setLoglevel((short) 1); + commonDao.saveOrUpdate(log34); + + TSLog log35 = new TSLog(); + log35.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log35.setBroswer("Chrome"); + log35.setNote("169.254.218.201"); + log35.setTSUser(admin); + log35.setOperatetime(DateUtils.parseTimestamp("2013-3-23 0:16:10", + "yyyy-MM-dd HH:mm")); + log35.setOperatetype((short) 1); + log35.setLoglevel((short) 1); + commonDao.saveOrUpdate(log35); + + TSLog log36 = new TSLog(); + log36.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log36.setBroswer("Chrome"); + log36.setNote("169.254.218.201"); + log36.setTSUser(admin); + log36.setOperatetime(DateUtils.parseTimestamp("2013-3-23 0:22:46", + "yyyy-MM-dd HH:mm")); + log36.setOperatetype((short) 1); + log36.setLoglevel((short) 1); + commonDao.saveOrUpdate(log36); + + TSLog log37 = new TSLog(); + log37.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log37.setBroswer("Firefox"); + log37.setNote("169.254.218.201"); + log37.setTSUser(admin); + log37.setOperatetime(DateUtils.parseTimestamp("2013-3-23 0:31:11", + "yyyy-MM-dd HH:mm")); + log37.setOperatetype((short) 1); + log37.setLoglevel((short) 1); + commonDao.saveOrUpdate(log37); + + TSLog log38 = new TSLog(); + log38.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log38.setBroswer("Chrome"); + log38.setNote("169.254.218.201"); + log38.setTSUser(admin); + log38.setOperatetime(DateUtils.parseTimestamp("2013-3-23 14:23:36", + "yyyy-MM-dd HH:mm")); + log38.setOperatetype((short) 1); + log38.setLoglevel((short) 1); + commonDao.saveOrUpdate(log38); + + TSLog log39 = new TSLog(); + log39.setLogcontent("娴佺▼鍙傛暟: 涓讳换瀹℃壒琚坊鍔犳垚鍔"); + log39.setBroswer("Chrome"); + log39.setNote("169.254.218.201"); + log39.setTSUser(admin); + log39.setOperatetime(DateUtils.parseTimestamp("2013-3-23 15:05:30", + "yyyy-MM-dd HH:mm")); + log39.setOperatetype((short) 1); + log39.setLoglevel((short) 3); + commonDao.saveOrUpdate(log39); + + TSLog log40 = new TSLog(); + log40.setLogcontent("涓氬姟鍙傛暟: 鍏ヨ亴鐢宠琚坊鍔犳垚鍔"); + log40.setBroswer("Firefox"); + log40.setNote("169.254.218.201"); + log40.setTSUser(admin); + log40.setOperatetime(DateUtils.parseTimestamp("2013-3-23 15:05:42", + "yyyy-MM-dd HH:mm")); + log40.setOperatetype((short) 1); + log40.setLoglevel((short) 3); + commonDao.saveOrUpdate(log40); + + TSLog log41 = new TSLog(); + log41.setLogcontent("鏉冮檺: 鍏ヨ亴鐢宠琚坊鍔犳垚鍔"); + log41.setBroswer("Chrome"); + log41.setNote("169.254.218.201"); + log41.setTSUser(admin); + log41.setOperatetime(DateUtils.parseTimestamp("2013-3-23 15:12:56", + "yyyy-MM-dd HH:mm")); + log41.setOperatetype((short) 1); + log41.setLoglevel((short) 3); + commonDao.saveOrUpdate(log41); + + TSLog log42 = new TSLog(); + log42.setLogcontent("鏉冮檺: 鍏ヨ亴鍔炵悊琚坊鍔犳垚鍔"); + log42.setBroswer("Firefox"); + log42.setNote("169.254.218.201"); + log42.setTSUser(admin); + log42.setOperatetime(DateUtils.parseTimestamp("2013-3-23 15:13:23", + "yyyy-MM-dd HH:mm")); + log42.setOperatetype((short) 1); + log42.setLoglevel((short) 3); + commonDao.saveOrUpdate(log42); + + TSLog log43 = new TSLog(); + log43.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log43.setBroswer("Chrome"); + log43.setNote("10.10.10.1"); + log43.setTSUser(admin); + log43.setOperatetime(DateUtils.parseTimestamp("2013-5-6 15:27:19", + "yyyy-MM-dd HH:mm")); + log43.setOperatetype((short) 1); + log43.setLoglevel((short) 1); + commonDao.saveOrUpdate(log43); + + TSLog log44 = new TSLog(); + log44.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log44.setBroswer("MSIE 8.0"); + log44.setNote("192.168.197.1"); + log44.setTSUser(admin); + log44.setOperatetime(DateUtils.parseTimestamp("2013-7-7 15:16:05", + "yyyy-MM-dd HH:mm")); + log44.setOperatetype((short) 1); + log44.setLoglevel((short) 1); + commonDao.saveOrUpdate(log44); + + TSLog log45 = new TSLog(); + log45.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log45.setBroswer("MSIE 8.0"); + log45.setNote("192.168.197.1"); + log45.setTSUser(admin); + log45.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:02:38", + "yyyy-MM-dd HH:mm")); + log45.setOperatetype((short) 1); + log45.setLoglevel((short) 1); + commonDao.saveOrUpdate(log45); + + TSLog log46 = new TSLog(); + log46.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log46.setBroswer("MSIE 8.0"); + log46.setNote("192.168.197.1"); + log46.setTSUser(admin); + log46.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:07:49", + "yyyy-MM-dd HH:mm")); + log46.setOperatetype((short) 1); + log46.setLoglevel((short) 1); + commonDao.saveOrUpdate(log46); + + TSLog log47 = new TSLog(); + log47.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log47.setBroswer("MSIE 8.0"); + log47.setNote("192.168.197.1"); + log47.setTSUser(admin); + log47.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:09:10", + "yyyy-MM-dd HH:mm")); + log47.setOperatetype((short) 1); + log47.setLoglevel((short) 1); + commonDao.saveOrUpdate(log47); + + TSLog log48 = new TSLog(); + log48.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log48.setBroswer("MSIE 8.0"); + log48.setNote("192.168.197.1"); + log48.setTSUser(admin); + log48.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:11:49", + "yyyy-MM-dd HH:mm")); + log48.setOperatetype((short) 1); + log48.setLoglevel((short) 1); + commonDao.saveOrUpdate(log48); + + TSLog log49 = new TSLog(); + log49.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log49.setBroswer("MSIE 8.0"); + log49.setNote("192.168.197.1"); + log49.setTSUser(admin); + log49.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:13:44", + "yyyy-MM-dd HH:mm")); + log49.setOperatetype((short) 1); + log49.setLoglevel((short) 1); + commonDao.saveOrUpdate(log49); + + TSLog log50 = new TSLog(); + log50.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log50.setBroswer("MSIE 8.0"); + log50.setNote("192.168.197.1"); + log50.setTSUser(admin); + log50.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:16:52", + "yyyy-MM-dd HH:mm")); + log50.setOperatetype((short) 1); + log50.setLoglevel((short) 1); + commonDao.saveOrUpdate(log50); + + TSLog log51 = new TSLog(); + log51.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log51.setBroswer("MSIE 8.0"); + log51.setNote("192.168.197.1"); + log51.setTSUser(admin); + log51.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:19:18", + "yyyy-MM-dd HH:mm")); + log51.setOperatetype((short) 1); + log51.setLoglevel((short) 1); + commonDao.saveOrUpdate(log51); + + TSLog log52 = new TSLog(); + log52.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log52.setBroswer("MSIE 8.0"); + log52.setNote("192.168.197.1"); + log52.setTSUser(admin); + log52.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:27:05", + "yyyy-MM-dd HH:mm")); + log52.setOperatetype((short) 1); + log52.setLoglevel((short) 1); + commonDao.saveOrUpdate(log52); + + TSLog log53 = new TSLog(); + log53.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log53.setBroswer("MSIE 8.0"); + log53.setNote("192.168.197.1"); + log53.setTSUser(admin); + log53.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:42:32", + "yyyy-MM-dd HH:mm")); + log53.setOperatetype((short) 1); + log53.setLoglevel((short) 1); + commonDao.saveOrUpdate(log53); + + TSLog log54 = new TSLog(); + log54.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log54.setBroswer("MSIE 8.0"); + log54.setNote("192.168.197.1"); + log54.setTSUser(admin); + log54.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:44:38", + "yyyy-MM-dd HH:mm")); + log54.setOperatetype((short) 1); + log54.setLoglevel((short) 1); + commonDao.saveOrUpdate(log54); + + TSLog log55 = new TSLog(); + log55.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log55.setBroswer("MSIE 8.0"); + log55.setNote("192.168.197.1"); + log55.setTSUser(admin); + log55.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:49:06", + "yyyy-MM-dd HH:mm")); + log55.setOperatetype((short) 1); + log55.setLoglevel((short) 1); + commonDao.saveOrUpdate(log55); + + TSLog log56 = new TSLog(); + log56.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log56.setBroswer("MSIE 8.0"); + log56.setNote("192.168.197.1"); + log56.setTSUser(admin); + log56.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:50:51", + "yyyy-MM-dd HH:mm")); + log56.setOperatetype((short) 1); + log56.setLoglevel((short) 1); + commonDao.saveOrUpdate(log56); + + TSLog log57 = new TSLog(); + log57.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log57.setBroswer("MSIE 8.0"); + log57.setNote("192.168.197.1"); + log57.setTSUser(admin); + log57.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:53:48", + "yyyy-MM-dd HH:mm")); + log57.setOperatetype((short) 1); + log57.setLoglevel((short) 1); + commonDao.saveOrUpdate(log57); + + TSLog log58 = new TSLog(); + log58.setLogcontent("淇敼鎴愬姛"); + log58.setBroswer("MSIE 8.0"); + log58.setNote("192.168.197.1"); + log58.setTSUser(admin); + log58.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:56:45", + "yyyy-MM-dd HH:mm")); + log58.setOperatetype((short) 1); + log58.setLoglevel((short) 5); + commonDao.saveOrUpdate(log58); + + TSLog log59 = new TSLog(); + log59.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log59.setBroswer("MSIE 8.0"); + log59.setNote("192.168.197.1"); + log59.setTSUser(admin); + log59.setOperatetime(DateUtils.parseTimestamp("2013-7-7 16:59:22", + "yyyy-MM-dd HH:mm")); + log59.setOperatetype((short) 1); + log59.setLoglevel((short) 1); + commonDao.saveOrUpdate(log59); + + TSLog log60 = new TSLog(); + log60.setLogcontent("鍒涘缓鎴愬姛"); + log60.setBroswer("MSIE 8.0"); + log60.setNote("192.168.197.1"); + log60.setTSUser(admin); + log60.setOperatetime(DateUtils.parseTimestamp("2013-7-7 17:22:42", + "yyyy-MM-dd HH:mm")); + log60.setOperatetype((short) 1); + log60.setLoglevel((short) 3); + commonDao.saveOrUpdate(log60); + + TSLog log61 = new TSLog(); + log61.setLogcontent("淇敼鎴愬姛"); + log61.setBroswer("MSIE 8.0"); + log61.setNote("192.168.197.1"); + log61.setTSUser(admin); + log61.setOperatetime(DateUtils.parseTimestamp("2013-7-7 17:26:03", + "yyyy-MM-dd HH:mm")); + log61.setOperatetype((short) 1); + log61.setLoglevel((short) 5); + commonDao.saveOrUpdate(log61); + + TSLog log62 = new TSLog(); + log62.setLogcontent("鍒犻櫎鎴愬姛"); + log62.setBroswer("MSIE 8.0"); + log62.setNote("192.168.197.1"); + log62.setTSUser(admin); + log62.setOperatetime(DateUtils.parseTimestamp("2013-7-7 17:31:00", + "yyyy-MM-dd HH:mm")); + log62.setOperatetype((short) 1); + log62.setLoglevel((short) 4); + commonDao.saveOrUpdate(log62); + + TSLog log63 = new TSLog(); + log63.setLogcontent("淇敼鎴愬姛"); + log63.setBroswer("MSIE 8.0"); + log63.setNote("192.168.197.1"); + log63.setTSUser(admin); + log63.setOperatetime(DateUtils.parseTimestamp("2013-7-7 17:35:02", + "yyyy-MM-dd HH:mm")); + log63.setOperatetype((short) 1); + log63.setLoglevel((short) 5); + commonDao.saveOrUpdate(log63); + + TSLog log64 = new TSLog(); + log64.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log64.setBroswer("MSIE 8.0"); + log64.setNote("192.168.197.1"); + log64.setTSUser(admin); + log64.setOperatetime(DateUtils.parseTimestamp("2013-7-7 17:46:39", + "yyyy-MM-dd HH:mm")); + log64.setOperatetype((short) 1); + log64.setLoglevel((short) 1); + commonDao.saveOrUpdate(log64); + + TSLog log65 = new TSLog(); + log65.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log65.setBroswer("MSIE 8.0"); + log65.setNote("192.168.197.1"); + log65.setTSUser(admin); + log65.setOperatetime(DateUtils.parseTimestamp("2013-7-7 17:55:01", + "yyyy-MM-dd HH:mm")); + log65.setOperatetype((short) 1); + log65.setLoglevel((short) 1); + commonDao.saveOrUpdate(log65); + + TSLog log66 = new TSLog(); + log66.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log66.setBroswer("MSIE 8.0"); + log66.setNote("192.168.197.1"); + log66.setTSUser(admin); + log66.setOperatetime(DateUtils.parseTimestamp("2013-7-7 18:08:56", + "yyyy-MM-dd HH:mm")); + log66.setOperatetype((short) 1); + log66.setLoglevel((short) 1); + commonDao.saveOrUpdate(log66); + + TSLog log67 = new TSLog(); + log67.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log67.setBroswer("MSIE 8.0"); + log67.setNote("192.168.197.1"); + log67.setTSUser(admin); + log67.setOperatetime(DateUtils.parseTimestamp("2013-7-7 18:13:02", + "yyyy-MM-dd HH:mm")); + log67.setOperatetype((short) 1); + log67.setLoglevel((short) 1); + commonDao.saveOrUpdate(log67); + + TSLog log68 = new TSLog(); + log68.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log68.setBroswer("MSIE 8.0"); + log68.setNote("192.168.197.1"); + log68.setTSUser(admin); + log68.setOperatetime(DateUtils.parseTimestamp("2013-7-7 18:15:50", + "yyyy-MM-dd HH:mm")); + log68.setOperatetype((short) 1); + log68.setLoglevel((short) 1); + commonDao.saveOrUpdate(log68); + + TSLog log69 = new TSLog(); + log69.setLogcontent("淇敼鎴愬姛"); + log69.setBroswer("MSIE 8.0"); + log69.setNote("192.168.197.1"); + log69.setTSUser(admin); + log69.setOperatetime(DateUtils.parseTimestamp("2013-7-7 18:28:42", + "yyyy-MM-dd HH:mm")); + log69.setOperatetype((short) 1); + log69.setLoglevel((short) 5); + commonDao.saveOrUpdate(log69); + + TSLog log70 = new TSLog(); + log70.setLogcontent("淇敼鎴愬姛"); + log70.setBroswer("MSIE 8.0"); + log70.setNote("192.168.197.1"); + log70.setTSUser(admin); + log70.setOperatetime(DateUtils.parseTimestamp("2013-7-7 18:29:12", + "yyyy-MM-dd HH:mm")); + log70.setOperatetype((short) 1); + log70.setLoglevel((short) 5); + commonDao.saveOrUpdate(log70); + + TSLog log71 = new TSLog(); + log71.setLogcontent("淇敼鎴愬姛"); + log71.setBroswer("MSIE 8.0"); + log71.setNote("192.168.197.1"); + log71.setTSUser(admin); + log71.setOperatetime(DateUtils.parseTimestamp("2013-7-7 18:30:12", + "yyyy-MM-dd HH:mm")); + log71.setOperatetype((short) 1); + log71.setLoglevel((short) 5); + commonDao.saveOrUpdate(log71); + + TSLog log72 = new TSLog(); + log72.setLogcontent("淇敼鎴愬姛"); + log72.setBroswer("MSIE 8.0"); + log72.setNote("192.168.197.1"); + log72.setTSUser(admin); + log72.setOperatetime(DateUtils.parseTimestamp("2013-7-7 18:31:00", + "yyyy-MM-dd HH:mm")); + log72.setOperatetype((short) 1); + log72.setLoglevel((short) 5); + commonDao.saveOrUpdate(log72); + + TSLog log73 = new TSLog(); + log73.setLogcontent("淇敼鎴愬姛"); + log73.setBroswer("MSIE 8.0"); + log73.setNote("192.168.197.1"); + log73.setTSUser(admin); + log73.setOperatetime(DateUtils.parseTimestamp("2013-7-7 18:31:26", + "yyyy-MM-dd HH:mm")); + log73.setOperatetype((short) 1); + log73.setLoglevel((short) 5); + commonDao.saveOrUpdate(log73); + + TSLog log74 = new TSLog(); + log74.setLogcontent("鐗╁搧: 555娣诲姞鎴愬姛"); + log74.setBroswer("MSIE 9.0"); + log74.setNote("192.168.1.103"); + log74.setTSUser(admin); + log74.setOperatetime(DateUtils.parseTimestamp("2013-3-20 23:03:06", + "yyyy-MM-dd HH:mm")); + log74.setOperatetype((short) 1); + log74.setLoglevel((short) 3); + commonDao.saveOrUpdate(log74); + + TSLog log75 = new TSLog(); + log75.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log75.setBroswer("MSIE 9.0"); + log75.setNote("192.168.1.103"); + log75.setTSUser(admin); + log75.setOperatetime(DateUtils.parseTimestamp("2013-3-20 23:19:25", + "yyyy-MM-dd HH:mm")); + log75.setOperatetype((short) 1); + log75.setLoglevel((short) 1); + commonDao.saveOrUpdate(log75); + + TSLog log76 = new TSLog(); + log76.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log76.setBroswer("MSIE 9.0"); + log76.setNote("192.168.1.103"); + log76.setTSUser(admin); + log76.setOperatetime(DateUtils.parseTimestamp("2013-3-21 20:09:02", + "yyyy-MM-dd HH:mm")); + log76.setOperatetype((short) 1); + log76.setLoglevel((short) 1); + commonDao.saveOrUpdate(log76); + + TSLog log77 = new TSLog(); + log77.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log77.setBroswer("MSIE 9.0"); + log77.setNote("192.168.1.103"); + log77.setTSUser(admin); + log77.setOperatetime(DateUtils.parseTimestamp("2013-3-21 20:27:25", + "yyyy-MM-dd HH:mm")); + log77.setOperatetype((short) 1); + log77.setLoglevel((short) 1); + commonDao.saveOrUpdate(log77); + + TSLog log78 = new TSLog(); + log78.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log78.setBroswer("MSIE 9.0"); + log78.setNote("192.168.1.103"); + log78.setTSUser(admin); + log78.setOperatetime(DateUtils.parseTimestamp("2013-3-21 20:44:40", + "yyyy-MM-dd HH:mm")); + log78.setOperatetype((short) 1); + log78.setLoglevel((short) 1); + commonDao.saveOrUpdate(log78); + + TSLog log79 = new TSLog(); + log79.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log79.setBroswer("MSIE 9.0"); + log79.setNote("192.168.1.103"); + log79.setTSUser(admin); + log79.setOperatetime(DateUtils.parseTimestamp("2013-3-21 20:54:13", + "yyyy-MM-dd HH:mm")); + log79.setOperatetype((short) 1); + log79.setLoglevel((short) 1); + commonDao.saveOrUpdate(log79); + + TSLog log80 = new TSLog(); + log80.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log80.setBroswer("MSIE 9.0"); + log80.setNote("192.168.1.103"); + log80.setTSUser(admin); + log80.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:01:54", + "yyyy-MM-dd HH:mm")); + log80.setOperatetype((short) 1); + log80.setLoglevel((short) 1); + commonDao.saveOrUpdate(log80); + + TSLog log81 = new TSLog(); + log81.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log81.setBroswer("MSIE 9.0"); + log81.setNote("192.168.1.103"); + log81.setTSUser(admin); + log81.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:13:05", + "yyyy-MM-dd HH:mm")); + log81.setOperatetype((short) 1); + log81.setLoglevel((short) 1); + commonDao.saveOrUpdate(log81); + + TSLog log82 = new TSLog(); + log82.setLogcontent("鐗╁搧: 55娣诲姞鎴愬姛"); + log82.setBroswer("MSIE 9.0"); + log82.setNote("192.168.1.103"); + log82.setTSUser(admin); + log82.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:15:07", + "yyyy-MM-dd HH:mm")); + log82.setOperatetype((short) 1); + log82.setLoglevel((short) 3); + commonDao.saveOrUpdate(log82); + + TSLog log83 = new TSLog(); + log83.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log83.setBroswer("MSIE 9.0"); + log83.setNote("192.168.1.103"); + log83.setTSUser(admin); + log83.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:22:57", + "yyyy-MM-dd HH:mm")); + log83.setOperatetype((short) 1); + log83.setLoglevel((short) 1); + commonDao.saveOrUpdate(log83); + + TSLog log84 = new TSLog(); + log84.setLogcontent("鐗╁搧: 55娣诲姞鎴愬姛"); + log84.setBroswer("MSIE 9.0"); + log84.setNote("192.168.1.103"); + log84.setTSUser(admin); + log84.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:23:12", + "yyyy-MM-dd HH:mm")); + log84.setOperatetype((short) 1); + log84.setLoglevel((short) 3); + commonDao.saveOrUpdate(log84); + + TSLog log85 = new TSLog(); + log85.setLogcontent("鐗╁搧: 33娣诲姞鎴愬姛"); + log85.setBroswer("MSIE 9.0"); + log85.setNote("192.168.1.103"); + log85.setTSUser(admin); + log85.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:23:47", + "yyyy-MM-dd HH:mm")); + log85.setOperatetype((short) 1); + log85.setLoglevel((short) 3); + commonDao.saveOrUpdate(log85); + + TSLog log86 = new TSLog(); + log86.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log86.setBroswer("MSIE 9.0"); + log86.setNote("192.168.1.103"); + log86.setTSUser(admin); + log86.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:25:09", + "yyyy-MM-dd HH:mm")); + log86.setOperatetype((short) 1); + log86.setLoglevel((short) 1); + commonDao.saveOrUpdate(log86); + + TSLog log87 = new TSLog(); + log87.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log87.setBroswer("MSIE 9.0"); + log87.setNote("192.168.1.103"); + log87.setTSUser(admin); + log87.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:27:58", + "yyyy-MM-dd HH:mm")); + log87.setOperatetype((short) 1); + log87.setLoglevel((short) 1); + commonDao.saveOrUpdate(log87); + + TSLog log88 = new TSLog(); + log88.setLogcontent("鏉冮檺: 閲囪喘瀹℃壒琚坊鍔犳垚鍔"); + log88.setBroswer("MSIE 9.0"); + log88.setNote("192.168.1.103"); + log88.setTSUser(admin); + log88.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:29:04", + "yyyy-MM-dd HH:mm")); + log88.setOperatetype((short) 1); + log88.setLoglevel((short) 3); + commonDao.saveOrUpdate(log88); + + TSLog log89 = new TSLog(); + log89.setLogcontent("鏉冮檺: 閲囪喘瀹℃壒琚洿鏂版垚鍔"); + log89.setBroswer("MSIE 9.0"); + log89.setNote("192.168.1.103"); + log89.setTSUser(admin); + log89.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:29:56", + "yyyy-MM-dd HH:mm")); + log89.setOperatetype((short) 1); + log89.setLoglevel((short) 5); + commonDao.saveOrUpdate(log89); + + TSLog log90 = new TSLog(); + log90.setLogcontent("鏉冮檺: 閲囪喘瀹℃壒琚洿鏂版垚鍔"); + log90.setBroswer("MSIE 9.0"); + log90.setNote("192.168.1.103"); + log90.setTSUser(admin); + log90.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:30:08", + "yyyy-MM-dd HH:mm")); + log90.setOperatetype((short) 1); + log90.setLoglevel((short) 5); + commonDao.saveOrUpdate(log90); + + TSLog log91 = new TSLog(); + log91.setLogcontent("鐢ㄦ埛: admin鏇存柊鎴愬姛"); + log91.setBroswer("MSIE 9.0"); + log91.setNote("192.168.1.103"); + log91.setTSUser(admin); + log91.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:31:21", + "yyyy-MM-dd HH:mm")); + log91.setOperatetype((short) 1); + log91.setLoglevel((short) 5); + commonDao.saveOrUpdate(log91); + + TSLog log92 = new TSLog(); + log92.setLogcontent("娴佺▼鍙傛暟: 閲囪喘瀹℃壒鍛樺鎵硅娣诲姞鎴愬姛"); + log92.setBroswer("MSIE 9.0"); + log92.setNote("192.168.1.103"); + log92.setTSUser(admin); + log92.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:36:03", + "yyyy-MM-dd HH:mm")); + log92.setOperatetype((short) 1); + log92.setLoglevel((short) 3); + commonDao.saveOrUpdate(log92); + + TSLog log93 = new TSLog(); + log93.setLogcontent("娴佺▼鍙傛暟: 閲囪喘瀹℃壒鍛樺鎵硅鏇存柊鎴愬姛"); + log93.setBroswer("MSIE 9.0"); + log93.setNote("192.168.1.103"); + log93.setTSUser(admin); + log93.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:36:11", + "yyyy-MM-dd HH:mm")); + log93.setOperatetype((short) 1); + log93.setLoglevel((short) 5); + commonDao.saveOrUpdate(log93); + + TSLog log94 = new TSLog(); + log94.setLogcontent("娴佺▼鍙傛暟: 閲囪喘瀹℃壒鍛樺鎵硅鏇存柊鎴愬姛"); + log94.setBroswer("MSIE 9.0"); + log94.setNote("192.168.1.103"); + log94.setTSUser(admin); + log94.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:37:16", + "yyyy-MM-dd HH:mm")); + log94.setOperatetype((short) 1); + log94.setLoglevel((short) 5); + commonDao.saveOrUpdate(log94); + + TSLog log95 = new TSLog(); + log95.setLogcontent("娴佺▼绫诲埆: 閲囪喘瀹℃壒鍛樺鎵硅鍒犻櫎 鎴愬姛"); + log95.setBroswer("MSIE 9.0"); + log95.setNote("192.168.1.103"); + log95.setTSUser(admin); + log95.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:38:20", + "yyyy-MM-dd HH:mm")); + log95.setOperatetype((short) 1); + log95.setLoglevel((short) 4); + commonDao.saveOrUpdate(log95); + + TSLog log96 = new TSLog(); + log96.setLogcontent("鐗╁搧: 44娣诲姞鎴愬姛"); + log96.setBroswer("MSIE 9.0"); + log96.setNote("192.168.1.103"); + log96.setTSUser(admin); + log96.setOperatetime(DateUtils.parseTimestamp("2013-3-21 21:43:51", + "yyyy-MM-dd HH:mm")); + log96.setOperatetype((short) 1); + log96.setLoglevel((short) 3); + commonDao.saveOrUpdate(log96); + + TSLog log97 = new TSLog(); + log97.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log97.setBroswer("MSIE 9.0"); + log97.setNote("192.168.1.105"); + log97.setTSUser(admin); + log97.setOperatetime(DateUtils.parseTimestamp("2013-2-7 10:10:29", + "yyyy-MM-dd HH:mm")); + log97.setOperatetype((short) 1); + log97.setLoglevel((short) 1); + commonDao.saveOrUpdate(log97); + + TSLog log98 = new TSLog(); + log98.setLogcontent("鏉冮檺: 涓婁紶涓嬭浇琚坊鍔犳垚鍔"); + log98.setBroswer("MSIE 9.0"); + log98.setNote("192.168.1.105"); + log98.setTSUser(admin); + log98.setOperatetime(DateUtils.parseTimestamp("2013-2-7 11:07:26", + "yyyy-MM-dd HH:mm")); + log98.setOperatetype((short) 1); + log98.setLoglevel((short) 3); + commonDao.saveOrUpdate(log98); + + TSLog log99 = new TSLog(); + log99.setLogcontent("鏉冮檺: 鎻掍欢婕旂ず琚垹闄ゆ垚鍔"); + log99.setBroswer("MSIE 9.0"); + log99.setNote("192.168.1.105"); + log99.setTSUser(admin); + log99.setOperatetime(DateUtils.parseTimestamp("2013-2-7 11:07:39", + "yyyy-MM-dd HH:mm")); + log99.setOperatetype((short) 1); + log99.setLoglevel((short) 4); + commonDao.saveOrUpdate(log99); + + TSLog log100 = new TSLog(); + log100.setLogcontent("鐢ㄦ埛: admin鐧诲綍鎴愬姛"); + log100.setBroswer("MSIE 9.0"); + log100.setNote("192.168.1.105"); + log100.setTSUser(admin); + log100.setOperatetime(DateUtils.parseTimestamp("2013-2-7 11:07:54", + "yyyy-MM-dd HH:mm")); + log100.setOperatetype((short) 1); + log100.setLoglevel((short) 1); + commonDao.saveOrUpdate(log100); + } catch (ParseException e) { + e.printStackTrace(); + } + } + + /** + * @Description 淇Demo琛紝锛堢晫闈㈣〃鍗曢獙璇佸姛鑳斤級 + * @author tanghan 2013-7-23 + */ + private void repairDemo() { + TSDemo demo = new TSDemo(); + // 澶嶆潅瀛楃涓叉枃鏈鍙栵紝閲囩敤鏂囦欢鏂瑰紡瀛樺偍 + String html = new FreemarkerHelper().parseTemplate("/org/jeecgframework/web/system/txt/valid-code-demo.ftl", null); + demo.setDemocode(html); + demo.setDemotitle("琛ㄥ崟楠岃瘉"); + commonDao.saveOrUpdate(demo); + + } + + /** + * @Description 淇User琛 + * @author tanghan 2013-7-23 + */ + private void repairUser() { + TSDepart eiu = commonDao.findByProperty(TSDepart.class, "departname", + "淇℃伅閮").get(0); + TSDepart RAndD = commonDao.findByProperty(TSDepart.class, "departname", + "鐮斿彂瀹").get(0); + TSUser admin = new TSUser(); + admin.setSignatureFile("images/renfang/qm/licf.gif"); + admin.setStatus((short) 1); + admin.setRealName("绠$悊鍛"); + admin.setUserName("admin"); + admin.setPassword("c44b01947c9e6e3f"); +// admin.setTSDepart(eiu); + admin.setActivitiSync((short) 1); + commonDao.saveOrUpdate(admin); + TSUserOrg adminUserOrg = new TSUserOrg(); + adminUserOrg.setTsUser(admin); + adminUserOrg.setTsDepart(eiu); + commonDao.save(adminUserOrg); + + TSUser scott = new TSUser(); + scott.setMobilePhone("13426432910"); + scott.setOfficePhone("7496661"); + scott.setEmail("zhangdaiscott@163.com"); + scott.setStatus((short) 1); + scott.setRealName("寮犱唬娴"); + scott.setUserName("scott"); + scott.setPassword("97c07a884bf272b5"); +// scott.setTSDepart(RAndD); + scott.setActivitiSync((short) 0); + commonDao.saveOrUpdate(scott); + TSUserOrg scottUserOrg = new TSUserOrg(); + scottUserOrg.setTsUser(scott); + scottUserOrg.setTsDepart(eiu); + commonDao.save(scottUserOrg); + + TSUser buyer = new TSUser(); + buyer.setStatus((short) 1); + buyer.setRealName("閲囪喘鍛"); + buyer.setUserName("cgy"); + buyer.setPassword("f2322ec2fb9f40d1"); +// buyer.setTSDepart(eiu); + buyer.setActivitiSync((short) 0); + commonDao.saveOrUpdate(buyer); + TSUserOrg buyerUserOrg = new TSUserOrg(); + buyerUserOrg.setTsUser(buyer); + buyerUserOrg.setTsDepart(eiu); + commonDao.save(buyerUserOrg); + + TSUser approver = new TSUser(); + approver.setStatus((short) 1); + approver.setRealName("閲囪喘瀹℃壒鍛"); + approver.setUserName("cgspy"); + approver.setPassword("a324509dc1a3089a"); +// approver.setTSDepart(eiu); + approver.setActivitiSync((short) 1); + commonDao.saveOrUpdate(approver); + TSUserOrg approverUserOrg = new TSUserOrg(); + approverUserOrg.setTsUser(approver); + approverUserOrg.setTsDepart(eiu); + commonDao.save(approverUserOrg); + } + + /** + * @Description 淇鐢ㄦ埛瑙掕壊琛 + * @author tanghan 2013-7-23 + */ + private void repairUserRole() { + TSRole admin = commonDao.findByProperty(TSRole.class, "roleCode", + "admin").get(0); + TSRole manager = commonDao.findByProperty(TSRole.class, "roleCode", + "manager").get(0); + List user = commonDao.loadAll(TSUser.class); + for (int i = 0; i < user.size(); i++) { + if (user.get(i).getEmail() != null) { + TSRoleUser roleuser = new TSRoleUser(); + roleuser.setTSUser(user.get(i)); + roleuser.setTSRole(manager); + commonDao.saveOrUpdate(roleuser); + } else { + TSRoleUser roleuser = new TSRoleUser(); + roleuser.setTSUser(user.get(i)); + roleuser.setTSRole(admin); + commonDao.saveOrUpdate(roleuser); + } + if (user.get(i).getSignatureFile() != null) { + TSRoleUser roleuser = new TSRoleUser(); + roleuser.setTSUser(user.get(i)); + roleuser.setTSRole(admin); + commonDao.saveOrUpdate(roleuser); + } + } + + } + + /** + * @Description 淇瑙掕壊鏉冮檺琛 + * @author tanghan 2013-7-23 + */ + private void repairRoleFunction() { + TSRole admin = commonDao.findByProperty(TSRole.class, "roleCode", + "admin").get(0); + TSRole manager = commonDao.findByProperty(TSRole.class, "roleCode", + "manager").get(0); + List list = commonDao.loadAll(TSFunction.class); + for (int i = 0; i < list.size(); i++) { + TSRoleFunction adminroleFunction = new TSRoleFunction(); + TSRoleFunction managerFunction = new TSRoleFunction(); + adminroleFunction.setTSFunction(list.get(i)); + managerFunction.setTSFunction(list.get(i)); + adminroleFunction.setTSRole(admin); + managerFunction.setTSRole(manager); + if (list.get(i).getFunctionName().equals("Demo绀轰緥")) { + adminroleFunction.setOperation("add,szqm,"); + } + commonDao.saveOrUpdate(adminroleFunction); + commonDao.saveOrUpdate(managerFunction); + } + } + + /** + * @Description 淇鎿嶄綔鎸夐挳琛 + * @author tanghan 2013-7-23 + */ + private void repairOperation() { + TSIcon back = commonDao.findByProperty(TSIcon.class, "iconName", "杩斿洖") + .get(0); + TSFunction function = commonDao.findByProperty(TSFunction.class, + "functionName", "Demo绀轰緥").get(0); + + TSOperation add = new TSOperation(); + add.setOperationname("褰曞叆"); + add.setOperationcode("add"); + add.setTSIcon(back); + add.setTSFunction(function); + commonDao.saveOrUpdate(add); + + TSOperation edit = new TSOperation(); + edit.setOperationname("缂栬緫"); + edit.setOperationcode("edit"); + edit.setTSIcon(back); + edit.setTSFunction(function); + commonDao.saveOrUpdate(edit); + + TSOperation del = new TSOperation(); + del.setOperationname("鍒犻櫎"); + del.setOperationcode("del"); + del.setTSIcon(back); + del.setTSFunction(function); + commonDao.saveOrUpdate(del); + + TSOperation szqm = new TSOperation(); + szqm.setOperationname("瀹℃牳"); + szqm.setOperationcode("szqm"); + szqm.setTSIcon(back); + szqm.setTSFunction(function); + commonDao.saveOrUpdate(szqm); + } + + /** + * @Description 淇绫诲瀷鍒嗙粍琛 + * @author tanghan 2013-7-20 + */ + private void repairTypeAndGroup() { + TSTypegroup icontype = new TSTypegroup(); + icontype.setTypegroupname("鍥炬爣绫诲瀷"); + icontype.setTypegroupcode("icontype"); + commonDao.saveOrUpdate(icontype); + + TSTypegroup ordertype = new TSTypegroup(); + ordertype.setTypegroupname("璁㈠崟绫诲瀷"); + ordertype.setTypegroupcode("order"); + commonDao.saveOrUpdate(ordertype); + + TSTypegroup custom = new TSTypegroup(); + custom.setTypegroupname("瀹㈡埛绫诲瀷"); + custom.setTypegroupcode("custom"); + commonDao.saveOrUpdate(custom); + + TSTypegroup servicetype = new TSTypegroup(); + servicetype.setTypegroupname("鏈嶅姟椤圭洰绫诲瀷"); + servicetype.setTypegroupcode("service"); + commonDao.saveOrUpdate(servicetype); + + TSTypegroup searchMode = new TSTypegroup(); + searchMode.setTypegroupname("鏌ヨ妯″紡"); + searchMode.setTypegroupcode("searchmode"); + commonDao.saveOrUpdate(searchMode); + + TSTypegroup yesOrno = new TSTypegroup(); + yesOrno.setTypegroupname("閫昏緫鏉′欢"); + yesOrno.setTypegroupcode("yesorno"); + commonDao.saveOrUpdate(yesOrno); + + TSTypegroup fieldtype = new TSTypegroup(); + fieldtype.setTypegroupname("瀛楁绫诲瀷"); + fieldtype.setTypegroupcode("fieldtype"); + commonDao.saveOrUpdate(fieldtype); + + TSTypegroup datatable = new TSTypegroup(); + datatable.setTypegroupname("鏁版嵁琛"); + datatable.setTypegroupcode("database"); + commonDao.saveOrUpdate(datatable); + + TSTypegroup filetype = new TSTypegroup(); + filetype.setTypegroupname("鏂囨。鍒嗙被"); + filetype.setTypegroupcode("fieltype"); + commonDao.saveOrUpdate(filetype); + + TSTypegroup sex = new TSTypegroup(); + sex.setTypegroupname("鎬у埆绫"); + sex.setTypegroupcode("sex"); + commonDao.saveOrUpdate(sex); + } + + /** + * @Description 淇绫诲瀷琛 + * @author tanghan 2013-7-22 + */ + private void repairType() { + TSTypegroup icontype = commonDao.findByProperty(TSTypegroup.class, + "typegroupname", "鍥炬爣绫诲瀷").get(0); + TSTypegroup ordertype = commonDao.findByProperty(TSTypegroup.class, + "typegroupname", "璁㈠崟绫诲瀷").get(0); + TSTypegroup custom = commonDao.findByProperty(TSTypegroup.class, + "typegroupname", "瀹㈡埛绫诲瀷").get(0); + TSTypegroup servicetype = commonDao.findByProperty(TSTypegroup.class, + "typegroupname", "鏈嶅姟椤圭洰绫诲瀷").get(0); + TSTypegroup datatable = commonDao.findByProperty(TSTypegroup.class, + "typegroupname", "鏁版嵁琛").get(0); + TSTypegroup filetype = commonDao.findByProperty(TSTypegroup.class, + "typegroupname", "鏂囨。鍒嗙被").get(0); + TSTypegroup sex = commonDao.findByProperty(TSTypegroup.class, + "typegroupname", "鎬у埆绫").get(0); + TSTypegroup searchmode = commonDao.findByProperty(TSTypegroup.class, + "typegroupname", "鏌ヨ妯″紡").get(0); + TSTypegroup yesorno = commonDao.findByProperty(TSTypegroup.class, + "typegroupname", "閫昏緫鏉′欢").get(0); + TSTypegroup fieldtype = commonDao.findByProperty(TSTypegroup.class, + "typegroupname", "瀛楁绫诲瀷").get(0); + + TSType menu = new TSType(); + menu.setTypename("鑿滃崟鍥炬爣"); + menu.setTypecode("2"); + menu.setTSTypegroup(icontype); + commonDao.saveOrUpdate(menu); + + TSType systemicon = new TSType(); + systemicon.setTypename("绯荤粺鍥炬爣"); + systemicon.setTypecode("1"); + systemicon.setTSTypegroup(icontype); + commonDao.saveOrUpdate(systemicon); + + TSType file = new TSType(); + file.setTypename("闄勪欢"); + file.setTypecode("files"); + file.setTSTypegroup(filetype); + commonDao.saveOrUpdate(file); + + TSType goodorder = new TSType(); + goodorder.setTypename("浼樿川璁㈠崟"); + goodorder.setTypecode("1"); + goodorder.setTSTypegroup(ordertype); + commonDao.saveOrUpdate(goodorder); + + TSType general = new TSType(); + general.setTypename("鏅氳鍗"); + general.setTypecode("2"); + general.setTSTypegroup(ordertype); + commonDao.saveOrUpdate(general); + + TSType sign = new TSType(); + sign.setTypename("绛剧害瀹㈡埛"); + sign.setTypecode("1"); + sign.setTSTypegroup(custom); + commonDao.saveOrUpdate(sign); + + TSType commoncustom = new TSType(); + commoncustom.setTypename("鏅氬鎴"); + commoncustom.setTypecode("2"); + commoncustom.setTSTypegroup(custom); + commonDao.saveOrUpdate(commoncustom); + + TSType vipservice = new TSType(); + vipservice.setTypename("鐗规畩鏈嶅姟"); + vipservice.setTypecode("1"); + vipservice.setTSTypegroup(servicetype); + commonDao.saveOrUpdate(vipservice); + + TSType commonservice = new TSType(); + commonservice.setTypename("鏅氭湇鍔"); + commonservice.setTypecode("2"); + commonservice.setTSTypegroup(servicetype); + commonDao.saveOrUpdate(commonservice); + + // TSType leave = new TSType(); + // leave.setTypename("璇峰亣娴佺▼"); + // leave.setTypecode("leave"); + // commonDao.saveOrUpdate(leave); + + TSType single = new TSType(); + single.setTypename("鍗曟潯浠舵煡璇"); + single.setTypecode("single"); + single.setTSTypegroup(searchmode); + commonDao.saveOrUpdate(single); + + TSType group = new TSType(); + group.setTypename("鑼冨洿鏌ヨ"); + group.setTypecode("group"); + group.setTSTypegroup(searchmode); + commonDao.saveOrUpdate(group); + + TSType yes = new TSType(); + yes.setTypename("鏄"); + yes.setTypecode("Y"); + yes.setTSTypegroup(yesorno); + commonDao.saveOrUpdate(yes); + + TSType no = new TSType(); + no.setTypename("鍚"); + no.setTypecode("N"); + no.setTSTypegroup(yesorno); + commonDao.saveOrUpdate(no); + + TSType type_integer = new TSType(); + type_integer.setTypename("Integer"); + type_integer.setTypecode("Integer"); + type_integer.setTSTypegroup(fieldtype); + commonDao.saveOrUpdate(type_integer); + + TSType type_date = new TSType(); + type_date.setTypename("Date"); + type_date.setTypecode("Date"); + type_date.setTSTypegroup(fieldtype); + commonDao.saveOrUpdate(type_date); + + TSType type_string = new TSType(); + type_string.setTypename("String"); + type_string.setTypecode("String"); + type_string.setTSTypegroup(fieldtype); + commonDao.saveOrUpdate(type_string); + + TSType type_long = new TSType(); + type_long.setTypename("Long"); + type_long.setTypecode("Long"); + type_long.setTSTypegroup(fieldtype); + commonDao.saveOrUpdate(type_long); + + TSType workflow = new TSType(); + workflow.setTypename("宸ヤ綔娴佸紩鎿庤〃"); + workflow.setTypecode("act"); + workflow.setTSTypegroup(datatable); + commonDao.saveOrUpdate(workflow); + + TSType systable = new TSType(); + systable.setTypename("绯荤粺鍩虹琛"); + systable.setTypecode("t_s"); + systable.setTSTypegroup(datatable); + commonDao.saveOrUpdate(systable); + + TSType business = new TSType(); + business.setTypename("涓氬姟琛"); + business.setTypecode("t_b"); + business.setTSTypegroup(datatable); + commonDao.saveOrUpdate(business); + + TSType customwork = new TSType(); + customwork.setTypename("鑷畾涔夊紩鎿庤〃"); + customwork.setTypecode("t_p"); + customwork.setTSTypegroup(datatable); + commonDao.saveOrUpdate(customwork); + + TSType news = new TSType(); + news.setTypename("鏂伴椈"); + news.setTypecode("news"); + news.setTSTypegroup(filetype); + commonDao.saveOrUpdate(news); + + TSType man = new TSType(); + man.setTypename("鐢锋"); + man.setTypecode("0"); + man.setTSTypegroup(sex); + commonDao.saveOrUpdate(man); + + TSType woman = new TSType(); + woman.setTypename("濂虫"); + woman.setTypecode("1"); + woman.setTSTypegroup(sex); + commonDao.saveOrUpdate(woman); + } + + /** + * @Description 淇瑙掕壊琛 + * @author tanghan 2013-7-20 + */ + private void repairRole() { + TSRole admin = new TSRole(); + admin.setRoleName("绠$悊鍛"); + admin.setRoleCode("admin"); + commonDao.saveOrUpdate(admin); + + TSRole manager = new TSRole(); + manager.setRoleName("鏅氱敤鎴"); + manager.setRoleCode("manager"); + commonDao.saveOrUpdate(manager); + + } + + /** + * @Description 淇閮ㄩ棬琛 + * @author tanghan 2013-7-20 + */ + private void repairDepart() { + TSDepart eiu = new TSDepart(); + eiu.setDepartname("淇℃伅閮"); + eiu.setDescription("12"); + commonDao.saveOrUpdate(eiu); + + TSDepart desgin = new TSDepart(); + desgin.setDepartname("璁捐閮"); + commonDao.saveOrUpdate(desgin); + + TSDepart RAndD = new TSDepart(); + RAndD.setDepartname("鐮斿彂瀹"); + RAndD.setDescription("鐮斿彂鎶鏈毦棰"); + RAndD.setTSPDepart(desgin); + commonDao.saveOrUpdate(RAndD); + } + + /** + * @Description 淇闄勪欢琛 + * @author tanghan 2013-7-20 + */ + private void repairAttachment() { + TSAttachment jro = new TSAttachment(); + jro.setAttachmenttitle("JR079839867R90000001000"); + jro.setRealpath("JR079839867R90000001000"); + jro.setSwfpath("upload/files/20130719201109hDr31jP1.swf"); + jro.setExtend("doc"); + commonDao.saveOrUpdate(jro); + + TSAttachment treaty = new TSAttachment(); + treaty.setAttachmenttitle("JEECG骞冲彴鍗忚"); + treaty.setRealpath("JEECG骞冲彴鍗忚"); + treaty.setSwfpath("upload/files/20130719201156sYHjSFJj.swf"); + treaty.setExtend("docx"); + commonDao.saveOrUpdate(treaty); + + TSAttachment analyse = new TSAttachment(); + analyse.setAttachmenttitle("鍒嗘瀽JEECG涓庡叾浠栫殑寮婧愰」鐩殑涓嶈冻鍜屼紭鍔"); + analyse.setRealpath("鍒嗘瀽JEECG涓庡叾浠栫殑寮婧愰」鐩殑涓嶈冻鍜屼紭鍔"); + analyse.setSwfpath("upload/files/20130719201727ZLEX1OSf.swf"); + analyse.setExtend("docx"); + commonDao.saveOrUpdate(analyse); + + TSAttachment DMS = new TSAttachment(); + DMS.setAttachmenttitle("DMS-T3绗笁鏂圭璧佷笟鍔℃帴鍙e紑鍙戣鏄"); + DMS.setRealpath("DMS-T3绗笁鏂圭璧佷笟鍔℃帴鍙e紑鍙戣鏄"); + DMS.setSwfpath("upload/files/20130719201841LzcgqUek.swf"); + DMS.setExtend("docx"); + commonDao.saveOrUpdate(DMS); + + TSAttachment sap = new TSAttachment(); + sap.setAttachmenttitle("SAP-闇姹傝鏄庝功-閲戣瀺鏈嶅姟鍏徃-绗笁鏂圭璧佷笟鍔¢渶姹俈1.7-鐮斿彂"); + sap.setRealpath("SAP-闇姹傝鏄庝功-閲戣瀺鏈嶅姟鍏徃-绗笁鏂圭璧佷笟鍔¢渶姹俈1.7-鐮斿彂"); + sap.setSwfpath("upload/files/20130719201925mkCrU47P.swf"); + sap.setExtend("doc"); + commonDao.saveOrUpdate(sap); + + TSAttachment standard = new TSAttachment(); + standard.setAttachmenttitle("JEECG鍥㈤槦寮鍙戣鑼"); + standard.setRealpath("JEECG鍥㈤槦寮鍙戣鑼"); + standard.setSwfpath("upload/files/20130724103633fvOTwNSV.swf"); + standard.setExtend("txt"); + commonDao.saveOrUpdate(standard); + + TSAttachment temple = new TSAttachment(); + temple.setAttachmenttitle("绗竴妯℃澘"); + temple.setRealpath("绗竴妯℃澘"); + temple.setSwfpath("upload/files/20130724104603pHDw4QUT.swf"); + temple.setExtend("doc"); + commonDao.saveOrUpdate(temple); + + TSAttachment githubhelp = new TSAttachment(); + githubhelp.setAttachmenttitle("github鍏ラ棬浣跨敤鏁欑▼"); + githubhelp.setRealpath("github鍏ラ棬浣跨敤鏁欑▼"); + githubhelp.setSwfpath("upload/files/20130704200345EakUH3WB.swf"); + githubhelp.setExtend("doc"); + commonDao.saveOrUpdate(githubhelp); + + TSAttachment githelp = new TSAttachment(); + githelp.setAttachmenttitle("github鍏ラ棬浣跨敤鏁欑▼"); + githelp.setRealpath("github鍏ラ棬浣跨敤鏁欑▼"); + githelp.setSwfpath("upload/files/20130704200651IE8wPdZ4.swf"); + githelp.setExtend("doc"); + commonDao.saveOrUpdate(githelp); + + TSAttachment settable = new TSAttachment(); + settable.setAttachmenttitle("锛堝紶浠f旦锛-閲戣瀺鏈嶅姟鍏徃鏈烘瀯宀椾綅鑱岃矗涓庝换鑱岃祫鏍艰缃〃(鏍规嵁妯℃澘濉啓锛"); + settable.setRealpath("锛堝紶浠f旦锛-閲戣瀺鏈嶅姟鍏徃鏈烘瀯宀椾綅鑱岃矗涓庝换鑱岃祫鏍艰缃〃(鏍规嵁妯℃澘濉啓锛"); + settable.setSwfpath("upload/files/20130704201022KhdRW1Gd.swf"); + settable.setExtend("xlsx"); + commonDao.saveOrUpdate(settable); + + TSAttachment eim = new TSAttachment(); + eim.setAttachmenttitle("EIM201_CN"); + eim.setRealpath("EIM201_CN"); + eim.setSwfpath("upload/files/20130704201046JVAkvvOt.swf"); + eim.setExtend("pdf"); + commonDao.saveOrUpdate(eim); + + TSAttachment github = new TSAttachment(); + github.setAttachmenttitle("github鍏ラ棬浣跨敤鏁欑▼"); + github.setRealpath("github鍏ラ棬浣跨敤鏁欑▼"); + github.setSwfpath("upload/files/20130704201116Z8NhEK57.swf"); + github.setExtend("doc"); + commonDao.saveOrUpdate(github); + + TSAttachment taghelp = new TSAttachment(); + taghelp.setAttachmenttitle("JEECGUI鏍囩搴撳府鍔╂枃妗3.2"); + taghelp.setRealpath("JEECGUI鏍囩搴撳府鍔╂枃妗3.2"); + taghelp.setSwfpath("upload/files/20130704201125DQg8hi2x.swf"); + taghelp.setExtend("pdf"); + commonDao.saveOrUpdate(taghelp); + } + + /** + * @Description 淇鍥炬爣琛 + * @author tanghan 2013-7-19 + */ + private void repaireIcon() { + org.jeecgframework.core.util.LogUtil.info("淇鍥炬爣涓"); + + TSIcon defaultIcon = new TSIcon(); + defaultIcon.setIconName("榛樿鍥"); + defaultIcon.setIconType((short) 1); + defaultIcon.setIconPath("plug-in/accordion/images/default.png"); + defaultIcon.setIconClas("default"); + defaultIcon.setExtend("png"); + commonDao.saveOrUpdate(defaultIcon); + + TSIcon back = new TSIcon(); + back.setIconName("杩斿洖"); + back.setIconType((short) 1); + back.setIconPath("plug-in/accordion/images/back.png"); + back.setIconClas("back"); + back.setExtend("png"); + commonDao.saveOrUpdate(back); + + TSIcon pie = new TSIcon(); + + pie.setIconName("楗煎浘"); + pie.setIconType((short) 1); + pie.setIconPath("plug-in/accordion/images/pie.png"); + pie.setIconClas("pie"); + pie.setExtend("png"); + commonDao.saveOrUpdate(pie); + + TSIcon pictures = new TSIcon(); + pictures.setIconName("鍥剧墖"); + pictures.setIconType((short) 1); + pictures.setIconPath("plug-in/accordion/images/pictures.png"); + pictures.setIconClas("pictures"); + pictures.setExtend("png"); + commonDao.saveOrUpdate(pictures); + + TSIcon pencil = new TSIcon(); + pencil.setIconName("绗"); + pencil.setIconType((short) 1); + pencil.setIconPath("plug-in/accordion/images/pencil.png"); + pencil.setIconClas("pencil"); + pencil.setExtend("png"); + commonDao.saveOrUpdate(pencil); + + TSIcon map = new TSIcon(); + map.setIconName("鍦板浘"); + map.setIconType((short) 1); + map.setIconPath("plug-in/accordion/images/map.png"); + map.setIconClas("map"); + map.setExtend("png"); + commonDao.saveOrUpdate(map); + + TSIcon group_add = new TSIcon(); + group_add.setIconName("缁"); + group_add.setIconType((short) 1); + group_add.setIconPath("plug-in/accordion/images/group_add.png"); + group_add.setIconClas("group_add"); + group_add.setExtend("png"); + commonDao.saveOrUpdate(group_add); + + TSIcon calculator = new TSIcon(); + calculator.setIconName("璁$畻鍣"); + calculator.setIconType((short) 1); + calculator.setIconPath("plug-in/accordion/images/calculator.png"); + calculator.setIconClas("calculator"); + calculator.setExtend("png"); + commonDao.saveOrUpdate(calculator); + + TSIcon folder = new TSIcon(); + folder.setIconName("鏂囦欢澶"); + folder.setIconType((short) 1); + folder.setIconPath("plug-in/accordion/images/folder.png"); + folder.setIconClas("folder"); + folder.setExtend("png"); + commonDao.saveOrUpdate(folder); + } + + /** + * 淇妗岄潰榛樿鍥炬爣 + * @param iconName 鍥炬爣鍚嶇О + * @param iconLabelName 鍥炬爣灞曠ず鍚嶇О + * @return 鍥炬爣瀹炰綋 + */ + private TSIcon repairInconForDesk(String iconName, String iconLabelName) { + String iconPath = "plug-in/sliding/icon/" + iconName + ".png"; + TSIcon deskIncon = new TSIcon(); + deskIncon.setIconName(iconLabelName); + deskIncon.setIconType((short) 3); + deskIncon.setIconPath(iconPath); + deskIncon.setIconClas("deskIcon"); + deskIncon.setExtend("png"); + commonDao.saveOrUpdate(deskIncon); + + return deskIncon; + } + + /** + * @Description 淇鑿滃崟鏉冮檺 + * @author tanghan 2013-7-19 + */ + private void repairMenu() { + TSIcon defaultIcon = commonDao.findByProperty(TSIcon.class, "iconName", "榛樿鍥") + .get(0); + TSIcon group_add = commonDao.findByProperty(TSIcon.class, "iconName", + "缁").get(0); + TSIcon pie = commonDao.findByProperty(TSIcon.class, "iconName", "楗煎浘") + .get(0); + TSIcon folder = commonDao.findByProperty(TSIcon.class, "iconName", + "鏂囦欢澶").get(0); + org.jeecgframework.core.util.LogUtil.info(defaultIcon.getIconPath()); + TSFunction autoinput = new TSFunction(); + autoinput.setFunctionName("Online 寮鍙"); + autoinput.setFunctionUrl(""); + autoinput.setFunctionLevel((short) 0); + autoinput.setFunctionOrder("1"); + autoinput.setTSIcon(folder); + commonDao.saveOrUpdate(autoinput); + + TSFunction sys = new TSFunction(); + sys.setFunctionName("绯荤粺绠$悊"); + sys.setFunctionUrl(""); + sys.setFunctionLevel((short) 0); + sys.setFunctionOrder("5"); + sys.setTSIcon(group_add); + commonDao.saveOrUpdate(sys); + + TSFunction state = new TSFunction(); + state.setFunctionName("缁熻鏌ヨ"); + state.setFunctionUrl(""); + state.setFunctionLevel((short) 0); + state.setFunctionOrder("3"); + state.setTSIcon(folder); + commonDao.saveOrUpdate(state); + + TSFunction commondemo = new TSFunction(); + commondemo.setFunctionName("甯哥敤绀轰緥"); + commondemo.setFunctionUrl(""); + commondemo.setFunctionLevel((short) 0); + commondemo.setFunctionOrder("8"); + commondemo.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(commondemo); + + TSFunction syscontrol = new TSFunction(); + syscontrol.setFunctionName("绯荤粺鐩戞帶"); + syscontrol.setFunctionUrl(""); + syscontrol.setFunctionLevel((short) 0); + syscontrol.setFunctionOrder("11"); + syscontrol.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(syscontrol); + TSFunction user = new TSFunction(); + user.setFunctionName("鐢ㄦ埛绠$悊"); + user.setFunctionUrl("userController.do?user"); + user.setFunctionLevel((short) 1); + user.setFunctionOrder("5"); + user.setTSFunction(sys); + user.setTSIcon(defaultIcon); + user.setTSIconDesk(repairInconForDesk("Finder", "鐢ㄦ埛绠$悊")); + commonDao.saveOrUpdate(user); + + TSFunction role = new TSFunction(); + role.setFunctionName("瑙掕壊绠$悊"); + role.setFunctionUrl("roleController.do?role"); + role.setFunctionLevel((short) 1); + role.setFunctionOrder("6"); + role.setTSFunction(sys); + role.setTSIcon(defaultIcon); + role.setTSIconDesk(repairInconForDesk("friendgroup", "瑙掕壊绠$悊")); + commonDao.saveOrUpdate(role); + + TSFunction menu = new TSFunction(); + menu.setFunctionName("鑿滃崟绠$悊"); + menu.setFunctionUrl("functionController.do?function"); + menu.setFunctionLevel((short) 1); + menu.setFunctionOrder("7"); + menu.setTSFunction(sys); + menu.setTSIcon(defaultIcon); + menu.setTSIconDesk(repairInconForDesk("kaikai", "鑿滃崟绠$悊")); + commonDao.saveOrUpdate(menu); + + TSFunction typegroup = new TSFunction(); + typegroup.setFunctionName("鏁版嵁瀛楀吀"); + typegroup.setFunctionUrl("systemController.do?typeGroupList"); + typegroup.setFunctionLevel((short) 1); + typegroup.setFunctionOrder("6"); + typegroup.setTSFunction(sys); + typegroup.setTSIcon(defaultIcon); + typegroup.setTSIconDesk(repairInconForDesk("friendnear", "鏁版嵁瀛楀吀")); + commonDao.saveOrUpdate(typegroup); + + TSFunction icon = new TSFunction(); + icon.setFunctionName("鍥炬爣绠$悊"); + icon.setFunctionUrl("iconController.do?icon"); + icon.setFunctionLevel((short) 1); + icon.setFunctionOrder("18"); + icon.setTSFunction(sys); + icon.setTSIcon(defaultIcon); + icon.setTSIconDesk(repairInconForDesk("kxjy", "鍥炬爣绠$悊")); + commonDao.saveOrUpdate(icon); + + TSFunction depart = new TSFunction(); + depart.setFunctionName("閮ㄩ棬绠$悊"); + depart.setFunctionUrl("departController.do?depart"); + depart.setFunctionLevel((short) 1); + depart.setFunctionOrder("22"); + depart.setTSFunction(sys); + depart.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(depart); + + TSFunction territory = new TSFunction(); + territory.setFunctionName("鍦板煙绠$悊"); + territory.setFunctionUrl("territoryController.do?territory"); + territory.setFunctionLevel((short) 1); + territory.setFunctionOrder("22"); + territory.setTSFunction(sys); + territory.setTSIcon(pie); + commonDao.saveOrUpdate(territory); + TSFunction useranalyse = new TSFunction(); + useranalyse.setFunctionName("鐢ㄦ埛鍒嗘瀽"); + useranalyse.setFunctionUrl("logController.do?statisticTabs&isIframe"); + useranalyse.setFunctionLevel((short) 1); + useranalyse.setFunctionOrder("17"); + useranalyse.setTSFunction(state); + useranalyse.setTSIcon(pie); + useranalyse.setTSIconDesk(repairInconForDesk("User", "鐢ㄦ埛鍒嗘瀽")); + commonDao.saveOrUpdate(useranalyse); + TSFunction formconfig = new TSFunction(); + formconfig.setFunctionName("琛ㄥ崟閰嶇疆"); + formconfig.setFunctionUrl("cgFormHeadController.do?cgFormHeadList"); + formconfig.setFunctionLevel((short) 1); + formconfig.setFunctionOrder("1"); + formconfig.setTSFunction(autoinput); + formconfig.setTSIcon(defaultIcon); + formconfig.setTSIconDesk(repairInconForDesk("Applications Folder", "琛ㄥ崟閰嶇疆")); + commonDao.saveOrUpdate(formconfig); + TSFunction formconfig1 = new TSFunction(); + formconfig1.setFunctionName("鍔ㄦ佹姤琛ㄩ厤缃"); + formconfig1.setFunctionUrl("cgreportConfigHeadController.do?cgreportConfigHead"); + formconfig1.setFunctionLevel((short) 1); + formconfig1.setFunctionOrder("2"); + formconfig1.setTSFunction(autoinput); + formconfig1.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(formconfig1); + TSFunction druid = new TSFunction(); + druid.setFunctionName("鏁版嵁鐩戞帶"); + druid.setFunctionUrl("dataSourceController.do?goDruid&isIframe"); + druid.setFunctionLevel((short) 1); + druid.setFunctionOrder("11"); + druid.setTSFunction(syscontrol); + druid.setTSIcon(defaultIcon); + druid.setTSIconDesk(repairInconForDesk("Super Disk", "鏁版嵁鐩戞帶")); + commonDao.saveOrUpdate(druid); + + TSFunction log = new TSFunction(); + log.setFunctionName("绯荤粺鏃ュ織"); + log.setFunctionUrl("logController.do?log"); + log.setFunctionLevel((short) 1); + log.setFunctionOrder("21"); + log.setTSFunction(syscontrol); + log.setTSIcon(defaultIcon); + log.setTSIconDesk(repairInconForDesk("fastsearch", "绯荤粺鏃ュ織")); + commonDao.saveOrUpdate(log); + + TSFunction timeTask = new TSFunction(); + timeTask.setFunctionName("瀹氭椂浠诲姟"); + timeTask.setFunctionUrl("timeTaskController.do?timeTask"); + timeTask.setFunctionLevel((short) 1); + timeTask.setFunctionOrder("21"); + timeTask.setTSFunction(syscontrol); + timeTask.setTSIcon(defaultIcon); + timeTask.setTSIconDesk(repairInconForDesk("Utilities", "瀹氭椂浠诲姟")); + commonDao.saveOrUpdate(timeTask); + TSFunction formcheck = new TSFunction(); + formcheck.setFunctionName("琛ㄥ崟楠岃瘉"); + formcheck.setFunctionUrl("demoController.do?formTabs"); + formcheck.setFunctionLevel((short) 1); + formcheck.setFunctionOrder("1"); + formcheck.setTSFunction(commondemo); + formcheck.setTSIcon(defaultIcon); + formcheck.setTSIconDesk(repairInconForDesk("qidianzhongwen", "琛ㄥ崟楠岃瘉")); + commonDao.saveOrUpdate(formcheck); + + TSFunction demo = new TSFunction(); + demo.setFunctionName("Demo绀轰緥"); + demo.setFunctionUrl("jeecgDemoController.do?jeecgDemo"); + demo.setFunctionLevel((short) 1); + demo.setFunctionOrder("2"); + demo.setTSFunction(commondemo); + demo.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(demo); + + TSFunction minidao = new TSFunction(); + minidao.setFunctionName("Minidao渚嬪瓙"); + minidao.setFunctionUrl("jeecgMinidaoController.do?jeecgMinidao"); + minidao.setFunctionLevel((short) 1); + minidao.setFunctionOrder("2"); + minidao.setTSFunction(commondemo); + minidao.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(minidao); + + TSFunction onetable = new TSFunction(); + onetable.setFunctionName("鍗曡〃妯″瀷"); + onetable.setFunctionUrl("jeecgNoteController.do?jeecgNote"); + onetable.setFunctionLevel((short) 1); + onetable.setFunctionOrder("3"); + onetable.setTSFunction(commondemo); + onetable.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(onetable); + + TSFunction onetoMany = new TSFunction(); + onetoMany.setFunctionName("涓瀵瑰妯″瀷"); + onetoMany.setFunctionUrl("jeecgOrderMainController.do?jeecgOrderMain"); + onetoMany.setFunctionLevel((short) 1); + onetoMany.setFunctionOrder("4"); + onetoMany.setTSFunction(commondemo); + onetoMany.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(onetoMany); + + TSFunction excel = new TSFunction(); + excel.setFunctionName("Excel瀵煎叆瀵煎嚭"); + excel.setFunctionUrl("courseController.do?course"); + excel.setFunctionLevel((short) 1); + excel.setFunctionOrder("5"); + excel.setTSFunction(commondemo); + excel.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(excel); + + TSFunction uploadownload = new TSFunction(); + uploadownload.setFunctionName("涓婁紶涓嬭浇"); + uploadownload + .setFunctionUrl("commonController.do?listTurn&turn=system/document/filesList"); + uploadownload.setFunctionLevel((short) 1); + uploadownload.setFunctionOrder("6"); + uploadownload.setTSFunction(commondemo); + uploadownload.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(uploadownload); + + TSFunction jqueryFileUpload = new TSFunction(); + jqueryFileUpload.setFunctionName("JqueryFileUpload绀轰緥"); + jqueryFileUpload.setFunctionUrl("fileUploadController.do?fileUploadSample&isIframe"); + jqueryFileUpload.setFunctionLevel((short) 1); + jqueryFileUpload.setFunctionOrder("6"); + jqueryFileUpload.setTSFunction(commondemo); + jqueryFileUpload.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(jqueryFileUpload); + + TSFunction nopaging = new TSFunction(); + nopaging.setFunctionName("鏃犲垎椤靛垪琛"); + nopaging.setFunctionUrl("userNoPageController.do?user"); + nopaging.setFunctionLevel((short) 1); + nopaging.setFunctionOrder("7"); + nopaging.setTSIcon(defaultIcon); + nopaging.setTSFunction(commondemo); + commonDao.saveOrUpdate(nopaging); + + TSFunction jdbcdemo = new TSFunction(); + jdbcdemo.setFunctionName("jdbc绀轰緥"); + jdbcdemo.setFunctionUrl("jeecgJdbcController.do?jeecgJdbc"); + jdbcdemo.setFunctionLevel((short) 1); + jdbcdemo.setFunctionOrder("8"); + jdbcdemo.setTSFunction(commondemo); + jdbcdemo.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(jdbcdemo); + + TSFunction sqlsep = new TSFunction(); + sqlsep.setFunctionName("SQL鍒嗙"); + sqlsep.setFunctionUrl("jeecgJdbcController.do?dictParameter"); + sqlsep.setFunctionLevel((short) 1); + sqlsep.setTSIcon(defaultIcon); + sqlsep.setFunctionOrder("9"); + sqlsep.setTSFunction(commondemo); + commonDao.saveOrUpdate(sqlsep); + + TSFunction dicttag = new TSFunction(); + dicttag.setFunctionName("瀛楀吀鏍囩"); + dicttag.setFunctionUrl("demoController.do?dictSelect"); + dicttag.setFunctionLevel((short) 1); + dicttag.setFunctionOrder("10"); + dicttag.setTSFunction(commondemo); + dicttag.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(dicttag); + + TSFunction demomaintain = new TSFunction(); + demomaintain.setFunctionName("琛ㄥ崟寮瑰嚭椋庢牸"); + demomaintain.setFunctionUrl("demoController.do?demoList"); + demomaintain.setFunctionLevel((short) 1); + demomaintain.setFunctionOrder("11"); + demomaintain.setTSFunction(commondemo); + demomaintain.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(demomaintain); + + TSFunction democlassify = new TSFunction(); + democlassify.setFunctionName("鐗规畩甯冨眬"); + democlassify.setFunctionUrl("demoController.do?demoIframe"); + democlassify.setFunctionLevel((short) 1); + democlassify.setFunctionOrder("12"); + democlassify.setTSFunction(commondemo); + democlassify.setTSIcon(defaultIcon); + democlassify.setTSIconDesk(repairInconForDesk("xiami", "鐗规畩甯冨眬")); + commonDao.saveOrUpdate(democlassify); + + TSFunction notag1 = new TSFunction(); + notag1.setFunctionName("鍗曡〃渚嬪瓙(鏃燭ag)"); + notag1.setFunctionUrl("jeecgEasyUIController.do?jeecgEasyUI"); + notag1.setFunctionLevel((short) 1); + notag1.setFunctionOrder("13"); + notag1.setTSFunction(commondemo); + notag1.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(notag1); + + TSFunction notag2 = new TSFunction(); + notag2.setFunctionName("涓瀵瑰渚嬪瓙(鏃燭ag)"); + notag2.setFunctionUrl("jeecgOrderMainNoTagController.do?jeecgOrderMainNoTag"); + notag2.setFunctionLevel((short) 1); + notag2.setFunctionOrder("14"); + notag2.setTSFunction(commondemo); + notag2.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(notag2); + + TSFunction htmledit = new TSFunction(); + htmledit.setFunctionName("HTML缂栬緫鍣"); + htmledit.setFunctionUrl("jeecgDemoController.do?ckeditor&isIframe"); + htmledit.setFunctionLevel((short) 1); + htmledit.setFunctionOrder("15"); + htmledit.setTSFunction(commondemo); + htmledit.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(htmledit); + + TSFunction weboffice = new TSFunction(); + weboffice.setFunctionName("鍦ㄧ嚎word(IE)"); + weboffice.setFunctionUrl("webOfficeController.do?webOffice"); + weboffice.setFunctionLevel((short) 1); + weboffice.setFunctionOrder("16"); + weboffice.setTSFunction(commondemo); + weboffice.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(weboffice); + + TSFunction Office = new TSFunction(); + Office.setFunctionName("WebOffice瀹樻柟渚嬪瓙"); + Office.setFunctionUrl("webOfficeController.do?webOfficeSample&isIframe"); + Office.setFunctionLevel((short) 1); + Office.setFunctionOrder("17"); + Office.setTSIcon(defaultIcon); + Office.setTSFunction(commondemo); + commonDao.saveOrUpdate(Office); + + TSFunction finance = new TSFunction(); + finance.setFunctionName("澶氶檮浠剁鐞"); + finance.setFunctionUrl("tFinanceController.do?tFinance"); + finance.setFunctionLevel((short) 1); + finance.setFunctionOrder("18"); + finance.setTSFunction(commondemo); + finance.setTSIcon(defaultIcon); + finance.setTSIconDesk(repairInconForDesk("vadio", "澶氶檮浠剁鐞")); + commonDao.saveOrUpdate(finance); + + TSFunction userdemo = new TSFunction(); + userdemo.setFunctionName("Datagrid鎵嬪伐Html"); + userdemo.setFunctionUrl("userController.do?userDemo"); + userdemo.setFunctionLevel((short) 1); + userdemo.setFunctionOrder("19"); + userdemo.setTSFunction(commondemo); + userdemo.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(userdemo); + TSFunction matterBom = new TSFunction(); + matterBom.setFunctionName("鐗╂枡Bom"); + matterBom.setFunctionUrl("jeecgMatterBomController.do?goList"); + matterBom.setFunctionLevel((short) 1); + matterBom.setFunctionOrder("20"); + matterBom.setTSFunction(commondemo); + matterBom.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(matterBom); + TSFunction reportdemo = new TSFunction(); + reportdemo.setFunctionName("鎶ヨ〃绀轰緥"); + reportdemo.setFunctionUrl("reportDemoController.do?studentStatisticTabs&isIframe"); + reportdemo.setFunctionLevel((short) 1); + reportdemo.setFunctionOrder("21"); + reportdemo.setTSFunction(state); + reportdemo.setTSIcon(pie); + commonDao.saveOrUpdate(reportdemo); + + TSFunction ckfinder = new TSFunction(); + ckfinder.setFunctionName("ckfinder渚嬪瓙"); + ckfinder.setFunctionUrl("jeecgDemoCkfinderController.do?jeecgDemoCkfinder"); + ckfinder.setFunctionLevel((short) 1); + ckfinder.setFunctionOrder("100"); + ckfinder.setTSFunction(commondemo); + ckfinder.setTSIcon(defaultIcon); + commonDao.saveOrUpdate(ckfinder); + } + + /** + * 淇鎶ヨ〃缁熻demo + *@Author fancq + *@date 2013-11-14 + */ + private void repairReportEntity() { + TSStudent entity=null; + entity = new TSStudent(); + entity.setName("寮犱笁"); + entity.setSex("f"); + entity.setClassName("1鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鏉庡洓"); + entity.setSex("f"); + entity.setClassName("1鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鐜嬩簲"); + entity.setSex("m"); + entity.setClassName("1鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("璧靛叚"); + entity.setSex("f"); + entity.setClassName("1鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("寮犱笁"); + entity.setSex("f"); + entity.setClassName("2鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鏉庡洓"); + entity.setSex("f"); + entity.setClassName("2鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鐜嬩簲"); + entity.setSex("m"); + entity.setClassName("2鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("璧靛叚"); + entity.setSex("f"); + entity.setClassName("2鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("寮犱笁"); + entity.setSex("f"); + entity.setClassName("3鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鏉庡洓"); + entity.setSex("f"); + entity.setClassName("3鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鐜嬩簲"); + entity.setSex("m"); + entity.setClassName("3鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鏉庡洓"); + entity.setSex("f"); + entity.setClassName("3鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鐜嬩簲"); + entity.setSex("m"); + entity.setClassName("3鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("璧靛叚"); + entity.setSex("f"); + entity.setClassName("3鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("寮犱笁"); + entity.setSex("f"); + entity.setClassName("4鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鏉庡洓"); + entity.setSex("f"); + entity.setClassName("4鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鐜嬩簲"); + entity.setSex("m"); + entity.setClassName("4鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("璧靛叚"); + entity.setSex("f"); + entity.setClassName("4鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("寮犱笁"); + entity.setSex("m"); + entity.setClassName("5鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鏉庡洓"); + entity.setSex("f"); + entity.setClassName("5鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鐜嬩簲"); + entity.setSex("m"); + entity.setClassName("5鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("璧靛叚"); + entity.setSex("m"); + entity.setClassName("5鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("璧靛叚"); + entity.setSex("m"); + entity.setClassName("5鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鏉庡洓"); + entity.setSex("f"); + entity.setClassName("5鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("鐜嬩簲"); + entity.setSex("m"); + entity.setClassName("5鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("璧靛叚"); + entity.setSex("m"); + entity.setClassName("5鐝"); + commonDao.save(entity); + + entity = new TSStudent(); + entity.setName("璧靛叚"); + entity.setSex("m"); + entity.setClassName("5鐝"); + commonDao.save(entity); + + } +} diff --git a/src/main/java/org/jeecgframework/web/system/service/impl/SystemServiceImpl.java b/src/main/java/org/jeecgframework/web/system/service/impl/SystemServiceImpl.java new file mode 100644 index 00000000..3b9f0c6f --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/impl/SystemServiceImpl.java @@ -0,0 +1,322 @@ +package org.jeecgframework.web.system.service.impl; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.BrowserUtils; +import org.jeecgframework.core.util.ContextHolderUtils; +import org.jeecgframework.core.util.DateUtils; +import org.jeecgframework.core.util.MutiLangUtil; +import org.jeecgframework.core.util.ResourceUtil; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import org.jeecgframework.web.system.dao.JeecgDictDao; +import org.jeecgframework.web.system.pojo.base.*; +import org.jeecgframework.web.system.service.SystemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +@Service("systemService") +@Transactional +public class SystemServiceImpl extends CommonServiceImpl implements SystemService { + @Autowired + private JeecgDictDao jeecgDictDao; + + public TSUser checkUserExits(TSUser user) throws Exception { + return this.commonDao.getUserByUserIdAndUserNameExits(user); + } + + public List queryDict(String dicTable, String dicCode,String dicText){ + List dictList = null; + //step.1 濡傛灉娌℃湁瀛楀吀琛ㄥ垯浣跨敤绯荤粺瀛楀吀琛 + if(StringUtil.isEmpty(dicTable)){ + dictList = jeecgDictDao.querySystemDict(dicCode); + for(DictEntity t:dictList){ + t.setTypename(MutiLangUtil.getMutiLangInstance().getLang(t.getTypename())); + } + }else { + dicText = StringUtil.isEmpty(dicText, dicCode); + dictList = jeecgDictDao.queryCustomDict(dicTable, dicCode, dicText); + } + return dictList; + } + + /** + * 娣诲姞鏃ュ織 + */ + public void addLog(String logcontent, Short loglevel, Short operatetype) { + HttpServletRequest request = ContextHolderUtils.getRequest(); + String broswer = BrowserUtils.checkBrowse(request); + TSLog log = new TSLog(); + log.setLogcontent(logcontent); + log.setLoglevel(loglevel); + log.setOperatetype(operatetype); + log.setNote(oConvertUtils.getIp()); + log.setBroswer(broswer); + log.setOperatetime(DateUtils.gettimestamp()); + log.setTSUser(ResourceUtil.getSessionUserName()); + commonDao.save(log); + } + + /** + * 鏍规嵁绫诲瀷缂栫爜鍜岀被鍨嬪悕绉拌幏鍙朤ype,濡傛灉涓虹┖鍒欏垱寤轰竴涓 + * + * @param typecode + * @param typename + * @return + */ + public TSType getType(String typecode, String typename, TSTypegroup tsTypegroup) { + //TSType actType = commonDao.findUniqueByProperty(TSType.class, "typecode", typecode,tsTypegroup.getId()); + List ls = commonDao.findHql("from TSType where typecode = ? and typegroupid = ?",typecode,tsTypegroup.getId()); + TSType actType = null; + if (ls == null || ls.size()==0) { + actType = new TSType(); + actType.setTypecode(typecode); + actType.setTypename(typename); + actType.setTSTypegroup(tsTypegroup); + commonDao.save(actType); + }else{ + actType = ls.get(0); + } + return actType; + + } + + /** + * 鏍规嵁绫诲瀷鍒嗙粍缂栫爜鍜屽悕绉拌幏鍙朤ypeGroup,濡傛灉涓虹┖鍒欏垱寤轰竴涓 + * + * @param typecode + * @param typename + * @return + */ + public TSTypegroup getTypeGroup(String typegroupcode, String typgroupename) { + TSTypegroup tsTypegroup = commonDao.findUniqueByProperty(TSTypegroup.class, "typegroupcode", typegroupcode); + if (tsTypegroup == null) { + tsTypegroup = new TSTypegroup(); + tsTypegroup.setTypegroupcode(typegroupcode); + tsTypegroup.setTypegroupname(typgroupename); + commonDao.save(tsTypegroup); + } + return tsTypegroup; + } + + + public TSTypegroup getTypeGroupByCode(String typegroupCode) { + TSTypegroup tsTypegroup = commonDao.findUniqueByProperty(TSTypegroup.class, "typegroupcode", typegroupCode); + return tsTypegroup; + } + + + public void initAllTypeGroups() { + List typeGroups = this.commonDao.loadAll(TSTypegroup.class); + for (TSTypegroup tsTypegroup : typeGroups) { + TSTypegroup.allTypeGroups.put(tsTypegroup.getTypegroupcode().toLowerCase(), tsTypegroup); + List types = this.commonDao.findByProperty(TSType.class, "TSTypegroup.id", tsTypegroup.getId()); + TSTypegroup.allTypes.put(tsTypegroup.getTypegroupcode().toLowerCase(), types); + } + } + + + public void refleshTypesCach(TSType type) { + TSTypegroup tsTypegroup = type.getTSTypegroup(); + TSTypegroup typeGroupEntity = this.commonDao.get(TSTypegroup.class, tsTypegroup.getId()); + List types = this.commonDao.findByProperty(TSType.class, "TSTypegroup.id", tsTypegroup.getId()); + TSTypegroup.allTypes.put(typeGroupEntity.getTypegroupcode().toLowerCase(), types); + } + + + public void refleshTypeGroupCach() { + TSTypegroup.allTypeGroups.clear(); + List typeGroups = this.commonDao.loadAll(TSTypegroup.class); + for (TSTypegroup tsTypegroup : typeGroups) { + TSTypegroup.allTypeGroups.put(tsTypegroup.getTypegroupcode().toLowerCase(), tsTypegroup); + } + } + + /** + * 鏍规嵁瑙掕壊ID 鍜 鑿滃崟Id 鑾峰彇 鍏锋湁鎿嶄綔鏉冮檺鐨勬寜閽瓹odes + * @param roleId + * @param functionId + * @return + */ + public Set getOperationCodesByRoleIdAndFunctionId(String roleId, String functionId) { + Set operationCodes = new HashSet(); + TSRole role = commonDao.get(TSRole.class, roleId); + CriteriaQuery cq1 = new CriteriaQuery(TSRoleFunction.class); + cq1.eq("TSRole.id", role.getId()); + cq1.eq("TSFunction.id", functionId); + cq1.add(); + List rFunctions = getListByCriteriaQuery(cq1, false); + if (null != rFunctions && rFunctions.size() > 0) { + TSRoleFunction tsRoleFunction = rFunctions.get(0); + if (null != tsRoleFunction.getOperation()) { + String[] operationArry = tsRoleFunction.getOperation().split(","); + for (int i = 0; i < operationArry.length; i++) { + operationCodes.add(operationArry[i]); + } + } + } + return operationCodes; + } + + /** + * 鏍规嵁鐢ㄦ埛ID 鍜 鑿滃崟Id 鑾峰彇 鍏锋湁鎿嶄綔鏉冮檺鐨勬寜閽瓹odes + * @param roleId + * @param functionId + * @return + */ + public Set getOperationCodesByUserIdAndFunctionId(String userId, String functionId) { + Set operationCodes = new HashSet(); + List rUsers = findByProperty(TSRoleUser.class, "TSUser.id", userId); + for (TSRoleUser ru : rUsers) { + TSRole role = ru.getTSRole(); + CriteriaQuery cq1 = new CriteriaQuery(TSRoleFunction.class); + cq1.eq("TSRole.id", role.getId()); + cq1.eq("TSFunction.id", functionId); + cq1.add(); + List rFunctions = getListByCriteriaQuery(cq1, false); + if (null != rFunctions && rFunctions.size() > 0) { + TSRoleFunction tsRoleFunction = rFunctions.get(0); + if (null != tsRoleFunction.getOperation()) { + String[] operationArry = tsRoleFunction.getOperation().split(","); + for (int i = 0; i < operationArry.length; i++) { + operationCodes.add(operationArry[i]); + } + } + } + } + return operationCodes; + } + + public void flushRoleFunciton(String id, TSFunction newFunction) { + TSFunction functionEntity = this.getEntity(TSFunction.class, id); + if (functionEntity.getTSIcon() == null || !StringUtil.isNotEmpty(functionEntity.getTSIcon().getId())) { + return; + } + TSIcon oldIcon = this.getEntity(TSIcon.class, functionEntity.getTSIcon().getId()); + if (!oldIcon.getIconClas().equals(newFunction.getTSIcon().getIconClas())) { + // 鍒锋柊缂撳瓨 + HttpSession session = ContextHolderUtils.getSession(); + TSUser user = ResourceUtil.getSessionUserName(); + List rUsers = this.findByProperty(TSRoleUser.class, "TSUser.id", user.getId()); + for (TSRoleUser ru : rUsers) { + TSRole role = ru.getTSRole(); + session.removeAttribute(role.getId()); + } + } + } + + public String generateOrgCode(String id, String pid) { + int orgCodeLength = 2; // 榛樿缂栫爜闀垮害 + if ("3".equals(ResourceUtil.getOrgCodeLengthType())) { // 绫诲瀷2-缂栫爜闀垮害涓3锛屽001 + orgCodeLength = 3; + } + + String newOrgCode = ""; + if(!StringUtils.hasText(pid)) { // 绗竴绾х紪鐮 + String sql = "select max(t.org_code) orgCode from t_s_depart t where t.parentdepartid is null"; + Map pOrgCodeMap = commonDao.findOneForJdbc(sql); + if(pOrgCodeMap.get("orgCode") != null) { + String curOrgCode = pOrgCodeMap.get("orgCode").toString(); + newOrgCode = String.format("%0" + orgCodeLength + "d", Integer.valueOf(curOrgCode) + 1); + } else { + newOrgCode = String.format("%0" + orgCodeLength + "d", 1); + } + } else { // 涓嬬骇缂栫爜 + String sql = "select max(t.org_code) orgCode from t_s_depart t where t.parentdepartid = ?"; + Map orgCodeMap = commonDao.findOneForJdbc(sql, pid); + if(orgCodeMap.get("orgCode") != null) { // 褰撳墠鍩烘湰鏈夌紪鐮佹椂 + String curOrgCode = orgCodeMap.get("orgCode").toString(); + String pOrgCode = curOrgCode.substring(0, curOrgCode.length() - orgCodeLength); + String subOrgCode = curOrgCode.substring(curOrgCode.length() - orgCodeLength, curOrgCode.length()); + newOrgCode = pOrgCode + String.format("%0" + orgCodeLength + "d", Integer.valueOf(subOrgCode) + 1); + } else { // 褰撳墠绾у埆娌℃湁缂栫爜鏃 + String pOrgCodeSql = "select max(t.org_code) orgCode from t_s_depart t where t.id = ?"; + Map pOrgCodeMap = commonDao.findOneForJdbc(pOrgCodeSql, pid); + String curOrgCode = pOrgCodeMap.get("orgCode").toString(); + newOrgCode = curOrgCode + String.format("%0" + orgCodeLength + "d", 1); + } + } + + return newOrgCode; + } + + public Set getOperationCodesByRoleIdAndruleDataId(String roleId, + String functionId) { + Set operationCodes = new HashSet(); + TSRole role = commonDao.get(TSRole.class, roleId); + CriteriaQuery cq1 = new CriteriaQuery(TSRoleFunction.class); + cq1.eq("TSRole.id", role.getId()); + cq1.eq("TSFunction.id", functionId); + cq1.add(); + List rFunctions = getListByCriteriaQuery(cq1, false); + if (null != rFunctions && rFunctions.size() > 0) { + TSRoleFunction tsRoleFunction = rFunctions.get(0); + if (null != tsRoleFunction.getDataRule()) { + String[] operationArry = tsRoleFunction.getDataRule().split(","); + for (int i = 0; i < operationArry.length; i++) { + operationCodes.add(operationArry[i]); + } + } + } + return operationCodes; + } + + public Set getOperationCodesByUserIdAndDataId(String userId, + String functionId) { + // TODO Auto-generated method stub + Set dataRulecodes = new HashSet(); + List rUsers = findByProperty(TSRoleUser.class, "TSUser.id", userId); + for (TSRoleUser ru : rUsers) { + TSRole role = ru.getTSRole(); + CriteriaQuery cq1 = new CriteriaQuery(TSRoleFunction.class); + cq1.eq("TSRole.id", role.getId()); + cq1.eq("TSFunction.id", functionId); + cq1.add(); + List rFunctions = getListByCriteriaQuery(cq1, false); + if (null != rFunctions && rFunctions.size() > 0) { + TSRoleFunction tsRoleFunction = rFunctions.get(0); + if (null != tsRoleFunction.getDataRule()) { + String[] operationArry = tsRoleFunction.getDataRule().split(","); + for (int i = 0; i < operationArry.length; i++) { + dataRulecodes.add(operationArry[i]); + } + } + } + } + return dataRulecodes; + } + /** + * 鍔犺浇鎵鏈夊浘鏍 + * @return + */ + public void initAllTSIcons() { + List list = this.loadAll(TSIcon.class); + for (TSIcon tsIcon : list) { + TSIcon.allTSIcons.put(tsIcon.getId(), tsIcon); + } + } + /** + * 鏇存柊鍥炬爣 + * @param icon + */ + public void upTSIcons(TSIcon icon) { + TSIcon.allTSIcons.put(icon.getId(), icon); + } + /** + * 鏇存柊鍥炬爣 + * @param icon + */ + public void delTSIcons(TSIcon icon) { + TSIcon.allTSIcons.remove(icon.getId()); + } +} diff --git a/src/main/java/org/jeecgframework/web/system/service/impl/TimeTaskServiceImpl.java b/src/main/java/org/jeecgframework/web/system/service/impl/TimeTaskServiceImpl.java new file mode 100644 index 00000000..93eb8064 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/impl/TimeTaskServiceImpl.java @@ -0,0 +1,14 @@ +package org.jeecgframework.web.system.service.impl; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.jeecgframework.web.system.service.TimeTaskServiceI; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; + +@Service("timeTaskService") +@Transactional +public class TimeTaskServiceImpl extends CommonServiceImpl implements TimeTaskServiceI { + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/service/impl/UserServiceImpl.java b/src/main/java/org/jeecgframework/web/system/service/impl/UserServiceImpl.java new file mode 100644 index 00000000..f3641d72 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/service/impl/UserServiceImpl.java @@ -0,0 +1,42 @@ +package org.jeecgframework.web.system.service.impl; + +import org.jeecgframework.web.system.pojo.base.TSRoleUser; +import org.jeecgframework.web.system.pojo.base.TSUser; +import org.jeecgframework.web.system.service.UserService; + +import org.hibernate.Criteria; +import org.hibernate.criterion.Projections; +import org.hibernate.criterion.Restrictions; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * + * @author 寮犱唬娴 + * + */ +@Service("userService") +@Transactional +public class UserServiceImpl extends CommonServiceImpl implements UserService { + + public TSUser checkUserExits(TSUser user){ + return this.commonDao.getUserByUserIdAndUserNameExits(user); + } + public String getUserRole(TSUser user){ + return this.commonDao.getUserRole(user); + } + + public void pwdInit(TSUser user,String newPwd) { + this.commonDao.pwdInit(user,newPwd); + } + + public int getUsersOfThisRole(String id) { + Criteria criteria = getSession().createCriteria(TSRoleUser.class); + criteria.add(Restrictions.eq("TSRole.id", id)); + int allCounts = ((Long) criteria.setProjection( + Projections.rowCount()).uniqueResult()).intValue(); + return allCounts; + } + +} diff --git a/src/main/java/org/jeecgframework/web/system/servlet/RandCodeImageServlet.java b/src/main/java/org/jeecgframework/web/system/servlet/RandCodeImageServlet.java new file mode 100644 index 00000000..5142efde --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/servlet/RandCodeImageServlet.java @@ -0,0 +1,237 @@ +/** + * + */ +package org.jeecgframework.web.system.servlet; + +import org.jeecgframework.core.util.ResourceUtil; + +import javax.imageio.ImageIO; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.Random; + +//import com.sun.image.codec.jpeg.JPEGCodec; +//import com.sun.image.codec.jpeg.JPEGEncodeParam; +//import com.sun.image.codec.jpeg.JPEGImageEncoder; + +/** + * 闅忔満鐢熸垚楠岃瘉鍥剧墖 + * + * @author 寮犲浗鏄 guomingzhang2008@gmail.com
    + * 2012-2-27 涓嬪崍3:35:03 + * + */ +public class RandCodeImageServlet extends HttpServlet { + private static final long serialVersionUID = -1257947018545327308L; + private static final String SESSION_KEY_OF_RAND_CODE = "randCode"; // todo 瑕佺粺涓甯搁噺 + /** + * + */ + private static final int count = 200; + + /** + * 瀹氫箟鍥惧舰澶у皬 + */ + private static final int width = 105; + /** + * 瀹氫箟鍥惧舰澶у皬 + */ + private static final int height = 35; + // private Font mFont = new Font("Arial Black", Font.PLAIN, 15); //璁剧疆瀛椾綋 + /** + * 骞叉壈绾跨殑闀垮害=1.414*lineWidth + */ + private static final int lineWidth = 2; + + @Override + public void doGet(final HttpServletRequest request, + final HttpServletResponse response) throws ServletException, + IOException { + // 璁剧疆椤甸潰涓嶇紦瀛 + response.setHeader("Pragma", "No-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); + // response.setContentType("image/png"); + + // 鍦ㄥ唴瀛樹腑鍒涘缓鍥捐薄 + final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + // 鑾峰彇鍥惧舰涓婁笅鏂 + final Graphics2D graphics = (Graphics2D) image.getGraphics(); + + // 璁惧畾鑳屾櫙棰滆壊 + graphics.setColor(Color.WHITE); // ---1 + graphics.fillRect(0, 0, width, height); + // 璁惧畾杈规棰滆壊 +// graphics.setColor(getRandColor(100, 200)); // ---2 + graphics.drawRect(0, 0, width - 1, height - 1); + + final Random random = new Random(); + // 闅忔満浜х敓骞叉壈绾匡紝浣垮浘璞′腑鐨勮璇佺爜涓嶆槗琚叾瀹冪▼搴忔帰娴嬪埌 + for (int i = 0; i < count; i++) { + graphics.setColor(getRandColor(150, 200)); // ---3 + + final int x = random.nextInt(width - lineWidth - 1) + 1; // 淇濊瘉鐢诲湪杈规涔嬪唴 + final int y = random.nextInt(height - lineWidth - 1) + 1; + final int xl = random.nextInt(lineWidth); + final int yl = random.nextInt(lineWidth); + graphics.drawLine(x, y, x + xl, y + yl); + } + + // 鍙栭殢鏈轰骇鐢熺殑璁よ瘉鐮(4浣嶆暟瀛) + final String resultCode = exctractRandCode(); + for (int i = 0; i < resultCode.length(); i++) { + // 灏嗚璇佺爜鏄剧ず鍒板浘璞′腑,璋冪敤鍑芥暟鍑烘潵鐨勯鑹茬浉鍚岋紝鍙兘鏄洜涓虹瀛愬お鎺ヨ繎锛屾墍浠ュ彧鑳界洿鎺ョ敓鎴 + // graphics.setColor(new Color(20 + random.nextInt(130), 20 + random + // .nextInt(130), 20 + random.nextInt(130))); + + // 璁剧疆瀛椾綋棰滆壊 + graphics.setColor(Color.BLACK); + // 璁剧疆瀛椾綋鏍峰紡 +// graphics.setFont(new Font("Arial Black", Font.ITALIC, 18)); + graphics.setFont(new Font("Times New Roman", Font.BOLD, 24)); + // 璁剧疆瀛楃锛屽瓧绗﹂棿璺濓紝涓婅竟璺 + graphics.drawString(String.valueOf(resultCode.charAt(i)), (23 * i) + 8, 26); + } + + // 灏嗚璇佺爜瀛樺叆SESSION + request.getSession().setAttribute(SESSION_KEY_OF_RAND_CODE, resultCode); + // 鍥捐薄鐢熸晥 + graphics.dispose(); + + // 杈撳嚭鍥捐薄鍒伴〉闈 + ImageIO.write(image, "JPEG", response.getOutputStream()); + } + + @Override + public void doPost(final HttpServletRequest request, + final HttpServletResponse response) throws ServletException, + IOException { + doGet(request, response); + } + + /** + * @return 闅忔満鐮 + */ + private String exctractRandCode() { + final String randCodeType = ResourceUtil.getRandCodeType(); + int randCodeLength = Integer.parseInt(ResourceUtil.getRandCodeLength()); + if (randCodeType == null) { + return RandCodeImageEnum.NUMBER_CHAR.generateStr(randCodeLength); + } else { + switch (randCodeType.charAt(0)) { + case '1': + return RandCodeImageEnum.NUMBER_CHAR.generateStr(randCodeLength); + case '2': + return RandCodeImageEnum.LOWER_CHAR.generateStr(randCodeLength); + case '3': + return RandCodeImageEnum.UPPER_CHAR.generateStr(randCodeLength); + case '4': + return RandCodeImageEnum.LETTER_CHAR.generateStr(randCodeLength); + case '5': + return RandCodeImageEnum.ALL_CHAR.generateStr(randCodeLength); + + default: + return RandCodeImageEnum.NUMBER_CHAR.generateStr(randCodeLength); + } + } + } + + /** + * 鎻忚堪锛 + * + * @param fc + * 鎻忚堪锛 + * @param bc + * 鎻忚堪锛 + * + * @return 鎻忚堪锛 + */ + private Color getRandColor(int fc, int bc) { // 鍙栧緱缁欏畾鑼冨洿闅忔満棰滆壊 + final Random random = new Random(); + if (fc > 255) { + fc = 255; + } + if (bc > 255) { + bc = 255; + } + + final int r = fc + random.nextInt(bc - fc); + final int g = fc + random.nextInt(bc - fc); + final int b = fc + random.nextInt(bc - fc); + + return new Color(r, g, b); + } +} + +/** + * 楠岃瘉鐮佽緟鍔╃被 + * + * @author 寮犲浗鏄 guomingzhang2008@gmail.com
    + * 2012-2-28 涓嬪崍2:15:14 + * + */ +enum RandCodeImageEnum { + /** + * 娣峰悎瀛楃涓 + */ + ALL_CHAR("0123456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), // 鍘婚櫎灏忓啓鐨刲鍜宱杩欎釜涓や釜涓嶅鏄撳尯鍒嗙殑瀛楃锛 + /** + * 瀛楃 + */ + LETTER_CHAR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), + /** + * 灏忓啓瀛楁瘝 + */ + LOWER_CHAR("abcdefghijklmnopqrstuvwxyz"), + /** + * 鏁板瓧 + */ + NUMBER_CHAR("0123456789"), + /** + * 澶у啓瀛楃 + */ + UPPER_CHAR("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + /** + * 寰呯敓鎴愮殑瀛楃涓 + */ + private String charStr; + + /** + * @param charStr + */ + private RandCodeImageEnum(final String charStr) { + this.charStr = charStr; + } + + /** + * 鐢熶骇闅忔満楠岃瘉鐮 + * + * @param codeLength + * 楠岃瘉鐮佺殑闀垮害 + * @return 楠岃瘉鐮 + */ + public String generateStr(final int codeLength) { + final StringBuffer sb = new StringBuffer(); + final Random random = new Random(); + final String sourseStr = getCharStr(); + + for (int i = 0; i < codeLength; i++) { + sb.append(sourseStr.charAt(random.nextInt(sourseStr.length()))); + } + + return sb.toString(); + } + + /** + * @return the {@link #charStr} + */ + public String getCharStr() { + return charStr; + } + +} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/sql/JeecgDictDao_queryCustomDict.sql b/src/main/java/org/jeecgframework/web/system/sql/JeecgDictDao_queryCustomDict.sql new file mode 100644 index 00000000..634bb5a3 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/sql/JeecgDictDao_queryCustomDict.sql @@ -0,0 +1 @@ +select DISTINCT ${dicCode} as TYPECODE , ${dicText} as TYPENAME from ${dicTable} order by ${dicCode} \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/sql/JeecgDictDao_querySystemDict.sql b/src/main/java/org/jeecgframework/web/system/sql/JeecgDictDao_querySystemDict.sql new file mode 100644 index 00000000..5a6bc285 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/sql/JeecgDictDao_querySystemDict.sql @@ -0,0 +1,4 @@ +select DISTINCT TYPECODE as TYPECODE, TYPENAME as TYPENAME +from t_s_type t,t_s_typegroup g +where g.typegroupcode = '${dicCode}' +and t.typegroupid = g.id \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/sql/repair/RepairDao_batchRepairTerritory.sql b/src/main/java/org/jeecgframework/web/system/sql/repair/RepairDao_batchRepairTerritory.sql new file mode 100644 index 00000000..9dc9d373 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/sql/repair/RepairDao_batchRepairTerritory.sql @@ -0,0 +1,900 @@ +INSERT INTO t_s_territory VALUES ('1', '100', '1', '鍏ㄥ浗', 'qg', '0', '106.258754', '38.471318', '0'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('100', '371300', '3', '涓存矀甯', 'LYS', '0', '118.356448', '35.104672', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('101', '371400', '3', '寰峰窞甯', 'DZS', '0', '116.357465', '37.434093', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('102', '371500', '3', '鑱婂煄甯', 'LCS', '0', '115.985371', '36.4567039', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('103', '371600', '3', '婊ㄥ窞甯', 'BZS', '0', '117.970703', '37.38199', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('104', '371700', '3', '鑿忔辰甯', 'HZS', '0', '115.480656', '35.23375', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('195', '370100', '3', '娴庡崡甯', 'JNS', '0', '116.994917', '36.665282', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('89', '370200', '3', '闈掑矝甯', 'QDS', '0', '120.382504', '36.06722', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('90', '370300', '3', '娣勫崥甯', 'ZBS', '0', '118.055007', '36.813497', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('91', '370400', '3', '鏋e簞甯', 'ZZS', '0', '117.323725', '34.810488', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('92', '370500', '3', '涓滆惀甯', 'DYS', '0', '118.674767', '37.434751', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('93', '370600', '3', '鐑熷彴甯', 'YTS', '0', '121.447926', '37.463819', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('94', '370700', '3', '娼嶅潑甯', 'WFS', '0', '119.16193', '36.706691', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('95', '370800', '3', '娴庡畞甯', 'JNS', '0', '116.587099', '35.414921', '18'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('10', '00000016', '2', '娌冲崡鐪', 'HNS', '0', '113.687228', '34.76819', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('11', '00000008', '2', '榛戦緳姹熺渷', 'HLJS', '0', '126.662507', '45.7421699', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('12', '20000000', '2', '涓婃捣甯', 'SHS', '0', '121.473704', '31.230393', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('13', '00000010', '2', '姹熻嫃鐪', 'JSS', '0', '118.763232', '32.061707', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('14', '00000011', '2', '娴欐睙鐪', 'ZJS', '0', '120.153676', '30.26586', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('15', '00000012', '2', '瀹夊窘鐪', 'AHS', '0', '117.284923', '31.861184', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('16', '00000013', '2', '绂忓缓鐪', 'FJS', '0', '119.296506', '26.099933', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('17', '00000014', '2', '姹熻タ鐪', 'JXS', '0', '115.909175', '28.674424', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('18', '00000015', '2', '灞变笢鐪', 'SDS', '0', '117.020411', '36.668627', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('19', '00000017', '2', '婀栧寳鐪', 'HBS', '0', '114.341921', '30.545861', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('20', '00000018', '2', '婀栧崡鐪', 'HNS', '0', '112.98381', '28.112444', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('21', '40000000', '2', '閲嶅簡甯', 'ZQS', '0', '106.551557', '29.56301', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('22', '00000022', '2', '鍥涘窛鐪', 'SCS', '0', '104.075931', '30.651652', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('23', '00000019', '2', '骞夸笢鐪', 'GDS', '0', '113.266531', '23.132191', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('24', '00000020', '2', '骞胯タ澹棌鑷不鍖', 'GXZZZZQ', '0', '108.327546', '22.815478', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('25', '00000021', '2', '娴峰崡鐪', 'HNS', '0', '110.349229', '20.017378', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('26', '810000', '2', '棣欐腐鐗瑰埆琛屾斂鍖', 'XGTBXZQ', '0', '114.109497', '22.396428', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('27', '820000', '2', '婢抽棬鐗瑰埆琛屾斂鍖', 'AMTBXZQ', '0', '113.543873', '22.198745', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('28', '00000023', '2', '璐靛窞鐪', 'GZS', '0', '106.707116', '26.598026', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('29', '00000024', '2', '浜戝崡鐪', 'YNS', '0', '102.709812', '25.045359', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('3', '00000006', '2', '杈藉畞鐪', 'LNS', '0', '123.42944', '41.835441', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('30', '00000025', '2', '瑗胯棌鑷不鍖', 'XCZZQ', '0', '91.1170059', '29.647951', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('31', '00000026', '2', '闄曡タ鐪', 'SXS', '0', '108.954239', '34.265472', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('32', '00000027', '2', '鐢樿們鐪', 'GSS', '0', '103.826308', '36.059421', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('33', '00000028', '2', '闈掓捣鐪', 'QHS', '0', '101.780199', '36.620901', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('34', '00000029', '2', '瀹佸鍥炴棌鑷不鍖', 'NXHZZZQ', '0', '106.258754', '38.471318', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('35', '00000030', '2', '鏂扮枂缁村惥灏旇嚜娌诲尯', 'XJWWEZZQ', '0', '87.6278119', '43.793028', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('4', '00000007', '2', '鍚夋灄鐪', 'JLS', '0', '125.326065', '43.896082', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('5', '10000000', '2', '鍖椾含甯', 'BJS', '0', '116.407413', '39.904214', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('6', '30000000', '2', '澶╂触甯', 'TJS', '0', '117.200983', '39.084158', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('7', '00000003', '2', '娌冲寳鐪', 'HBS', '0', '114.468665', '38.037057', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('8', '00000004', '2', '灞辫タ鐪', 'SXS', '0', '112.562569', '37.873376', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('9', '00000005', '2', '鍐呰挋鍙よ嚜娌诲尯', 'NMGZZQ', '0', '111.765618', '40.817498', '1'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1000', '370903', '4', '宀卞渤鍖', 'DYQ', '0', '117.041582', '36.18799', '96'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1001', '370921', '4', '瀹侀槼鍘', 'NYX', '0', '116.805797', '35.758787', '96'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1002', '370923', '4', '涓滃钩鍘', 'DPX', '0', '116.470304', '35.937102', '96'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1003', '370982', '4', '鏂版嘲甯', 'XTS', '0', '117.767953', '35.909032', '96'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1004', '370983', '4', '鑲ュ煄甯', 'FCS', '0', '116.768358', '36.182571', '96'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1005', '371002', '4', '鐜繝鍖', 'HCQ', '0', '122.123444', '37.501991', '97'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1006', '371081', '4', '鏂囩櫥甯', 'WDS', '0', '122.058128', '37.1939129', '97'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1007', '371082', '4', '鑽f垚甯', 'RCS', '0', '122.486676', '37.165249', '97'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1008', '371083', '4', '涔冲北甯', 'RSS', '0', '121.539764', '36.919816', '97'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1009', '371102', '4', '涓滄腐鍖', 'DGQ', '0', '119.462228', '35.425475', '98'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1010', '371103', '4', '宀氬北鍖', 'LSQ', '0', '119.318813', '35.121816', '98'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1011', '371121', '4', '浜旇幉鍘', 'WLX', '0', '119.208744', '35.750095', '98'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1012', '371122', '4', '鑾掑幙', 'JX', '0', '118.837131', '35.579868', '98'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1013', '371202', '4', '鑾卞煄鍖', 'LCQ', '0', '117.659864', '36.203208', '99'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1014', '371203', '4', '閽㈠煄鍖', 'GCQ', '0', '117.811355', '36.058572', '99'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1015', '371302', '4', '鍏板北鍖', 'LSQ', '0', '118.347707', '35.051729', '100'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1016', '371311', '4', '缃楀簞鍖', 'LZQ', '0', '118.284786', '34.996741', '100'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1017', '371312', '4', '娌充笢鍖', 'HDQ', '0', '118.402893', '35.089917', '100'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1018', '371321', '4', '娌傚崡鍘', 'YNX', '0', '118.465213', '35.549976', '100'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1019', '371322', '4', '閮煄鍘', 'TCX', '0', '118.367263', '34.613557', '100'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1020', '371323', '4', '娌傛按鍘', 'YSX', '0', '118.627918', '35.79045', '100'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1021', '371324', '4', '鑻嶅北鍘', 'CSX', '0', '118.07065', '34.857149', '100'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1022', '371325', '4', '璐瑰幙', 'FX', '0', '117.977868', '35.26634', '100'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1023', '371326', '4', '骞抽倯鍘', 'PYX', '0', '117.640352', '35.5059429', '100'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1024', '371327', '4', '鑾掑崡鍘', 'JNX', '0', '118.835163', '35.174846', '100'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1025', '371328', '4', '钂欓槾鍘', 'MYX', '0', '117.945085', '35.710032', '100'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1026', '371329', '4', '涓存箔鍘', 'LSX', '0', '118.650782', '34.919852', '100'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1027', '371402', '4', '寰峰煄鍖', 'DCQ', '0', '116.299434', '37.451272', '101'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1028', '371421', '4', '闄靛幙', 'LX', '0', '116.576176', '37.33579', '101'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1029', '371422', '4', '瀹佹触鍘', 'NJX', '0', '116.800324', '37.652329', '101'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1030', '371423', '4', '搴嗕簯鍘', 'QYX', '0', '117.385123', '37.77539', '101'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1031', '371424', '4', '涓撮倯鍘', 'LYX', '0', '116.86665', '37.189864', '101'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1032', '371425', '4', '榻愭渤鍘', 'QHX', '0', '116.758917', '36.795011', '101'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1033', '371426', '4', '骞冲師鍘', 'PYX', '0', '116.434187', '37.165419', '101'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1034', '371427', '4', '澶忔触鍘', 'XJX', '0', '116.001726', '36.948371', '101'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1035', '371428', '4', '姝﹀煄鍘', 'WCX', '0', '116.069302', '37.213311', '101'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1036', '371481', '4', '涔愰櫟甯', 'LLS', '0', '117.231935', '37.729907', '101'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1037', '371482', '4', '绂瑰煄甯', 'YCS', '0', '116.638387', '36.934259', '101'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1038', '371502', '4', '涓滄槍搴滃尯', 'DCFQ', '0', '115.988484', '36.434697', '102'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1039', '371521', '4', '闃宠胺鍘', 'YGX', '0', '115.79182', '36.114392', '102'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1040', '371522', '4', '鑾樺幙', 'SX', '0', '115.671191', '36.233599', '102'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1041', '371523', '4', '鑼屽钩鍘', 'CPX', '0', '116.255282', '36.5807639', '102'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1042', '371524', '4', '涓滈樋鍘', 'DAX', '0', '116.24758', '36.334917', '102'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1043', '371525', '4', '鍐犲幙', 'GX', '0', '115.44274', '36.484009', '102'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1044', '371526', '4', '楂樺攼鍘', 'GTX', '0', '116.231478', '36.866062', '102'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1045', '371581', '4', '涓存竻甯', 'LQS', '0', '115.704881', '36.838277', '102'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1046', '371602', '4', '婊ㄥ煄鍖', 'BCQ', '0', '118.019146', '37.43206', '103'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1047', '371621', '4', '鎯犳皯鍘', 'HMX', '0', '117.510451', '37.489769', '103'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1048', '371622', '4', '闃充俊鍘', 'YXX', '0', '117.578262', '37.641106', '103'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1049', '371623', '4', '鏃犳#鍘', 'WDX', '0', '117.625696', '37.770261', '103'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1050', '371624', '4', '娌惧寲鍘', 'ZHX', '0', '118.132199', '37.698281', '103'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1051', '371625', '4', '鍗氬叴鍘', 'BXX', '0', '118.131815', '37.150226', '103'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1052', '371626', '4', '閭瑰钩鍘', 'ZPX', '0', '117.743109', '36.862989', '103'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1053', '371702', '4', '鐗′腹鍖', 'MDQ', '0', '115.417827', '35.252512', '104'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1054', '371721', '4', '鏇瑰幙', 'CX', '0', '115.542328', '34.825508', '104'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1055', '371722', '4', '鍗曞幙', 'DX', '0', '116.107428', '34.778808', '104'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1056', '371723', '4', '鎴愭鍘', 'CWX', '0', '115.889765', '34.952459', '104'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1057', '371724', '4', '宸ㄩ噹鍘', 'JYX', '0', '116.094674', '35.396261', '104'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1058', '371725', '4', '閮撳煄鍘', 'YCX', '0', '115.943613', '35.599758', '104'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1059', '371726', '4', '閯勫煄鍘', 'JCX', '0', '115.510193', '35.563408', '104'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1060', '371727', '4', '瀹氶櫠鍘', 'DTX', '0', '115.573094', '35.071', '104'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1061', '371728', '4', '涓滄槑鍘', 'DMX', '0', '115.089905', '35.289368', '104'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1839', '370102', '4', '鍘嗕笅鍖', 'LXQ', '0', '117.07653', '36.666344', '195'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1840', '370103', '4', '甯備腑鍖', 'SZQ', '0', '116.997475', '36.6511749', '195'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1841', '370104', '4', '妲愯崼鍖', 'HYQ', '0', '116.90113', '36.651301', '195'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1842', '370105', '4', '澶╂ˉ鍖', 'TQQ', '0', '116.987492', '36.678016', '195'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1843', '370112', '4', '鍘嗗煄鍖', 'LCQ', '0', '117.065222', '36.680171', '195'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('926', '370113', '4', '闀挎竻鍖', 'CQQ', '0', '116.751959', '36.553691', '195'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('927', '370124', '4', '骞抽槾鍘', 'PYX', '0', '116.456187', '36.289265', '195'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('928', '370125', '4', '娴庨槼鍘', 'JYX', '0', '117.173529', '36.978547', '195'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('929', '370126', '4', '鍟嗘渤鍘', 'SHX', '0', '117.157183', '37.309045', '195'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('930', '370181', '4', '绔犱笜甯', 'ZQS', '0', '117.534326', '36.714015', '195'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('931', '370202', '4', '甯傚崡鍖', 'SNQ', '0', '120.412392', '36.075651', '89'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('932', '370203', '4', '甯傚寳鍖', 'SBQ', '0', '120.374801', '36.087661', '89'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('933', '370205', '4', '鍥涙柟鍖', 'SFQ', '0', '120.366454', '36.103993', '89'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('934', '370211', '4', '榛勫矝鍖', 'HDQ', '0', '120.198054', '35.960935', '89'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('935', '370212', '4', '宕傚北鍖', 'LSQ', '0', '120.468956', '36.107538', '89'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('936', '370213', '4', '鏉庢钵鍖', 'LCQ', '0', '120.432864', '36.145476', '89'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('937', '370214', '4', '鍩庨槼鍖', 'CYQ', '0', '120.396529', '36.307061', '89'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('938', '370281', '4', '鑳跺窞甯', 'JZS', '0', '120.033345', '36.264664', '89'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('939', '370282', '4', '鍗冲ⅷ甯', 'JMS', '0', '120.447162', '36.389401', '89'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('940', '370283', '4', '骞冲害甯', 'PDS', '0', '119.960014', '36.7867', '89'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('941', '370284', '4', '鑳跺崡甯', 'JNS', '0', '120.04643', '35.8725', '89'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('942', '370285', '4', '鑾辫タ甯', 'LXS', '0', '120.51769', '36.889084', '89'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('943', '370302', '4', '娣勫窛鍖', 'ZCQ', '0', '117.966842', '36.643449', '90'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('944', '370303', '4', '寮犲簵鍖', 'ZDQ', '0', '118.017656', '36.806773', '90'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('945', '370304', '4', '鍗氬北鍖', 'BSQ', '0', '117.861698', '36.494752', '90'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('946', '370305', '4', '涓存穭鍖', 'LZQ', '0', '118.308977', '36.827343', '90'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('947', '370306', '4', '鍛ㄦ潙鍖', 'ZCQ', '0', '117.869877', '36.803109', '90'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('948', '370321', '4', '妗撳彴鍘', 'HTX', '0', '118.097955', '36.959623', '90'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('949', '370322', '4', '楂橀潚鍘', 'GQX', '0', '117.826916', '37.171063', '90'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('950', '370323', '4', '娌傛簮鍘', 'YYX', '0', '118.170979', '36.184827', '90'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('951', '370402', '4', '甯備腑鍖', 'SZQ', '0', '117.556124', '34.864114', '91'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('952', '370403', '4', '钖涘煄鍖', 'YCQ', '0', '117.263157', '34.795206', '91'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('953', '370404', '4', '宄勫煄鍖', 'YCQ', '0', '117.590819', '34.772236', '91'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('954', '370405', '4', '鍙板効搴勫尯', 'TEZQ', '0', '117.733832', '34.562528', '91'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('955', '370406', '4', '灞变涵鍖', 'STQ', '0', '117.461343', '35.099549', '91'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('956', '370481', '4', '婊曞窞甯', 'TZS', '0', '117.164388', '35.084021', '91'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('957', '370502', '4', '涓滆惀鍖', 'DYQ', '0', '118.582184', '37.448964', '92'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('958', '370503', '4', '娌冲彛鍖', 'HKQ', '0', '118.525579', '37.886138', '92'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('959', '370521', '4', '鍨﹀埄鍘', 'KLX', '0', '118.547627', '37.58754', '92'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('960', '370522', '4', '鍒╂触鍘', 'LJX', '0', '118.255273', '37.49026', '92'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('961', '370523', '4', '骞块ザ鍘', 'GRX', '0', '118.407045', '37.0537', '92'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('962', '370602', '4', '鑺濈綐鍖', 'ZFQ', '0', '121.400031', '37.540687', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('963', '370611', '4', '绂忓北鍖', 'FSQ', '0', '121.267697', '37.498051', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('964', '370612', '4', '鐗熷钩鍖', 'MPQ', '0', '121.600512', '37.386901', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('965', '370613', '4', '鑾卞北鍖', 'LSQ', '0', '121.445304', '37.511305', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('966', '370614', '4', '寮鍙戝尯', 'KFQ', '0', '121.251001', '37.554683', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('967', '370634', '4', '闀垮矝鍘', 'CDX', '0', '120.736584', '37.921417', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('968', '370681', '4', '榫欏彛甯', 'LKS', '0', '120.477836', '37.646064', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('969', '370682', '4', '鑾遍槼甯', 'LYS', '0', '120.711607', '36.97891', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('970', '370683', '4', '鑾卞窞甯', 'LZS', '0', '119.942327', '37.177017', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('971', '370684', '4', '钃幈甯', 'PLS', '0', '120.758848', '37.810661', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('972', '370685', '4', '鎷涜繙甯', 'ZYS', '0', '120.434072', '37.355469', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('973', '370686', '4', '鏍栭湠甯', 'QXS', '0', '120.849675', '37.335123', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('974', '370687', '4', '娴烽槼甯', 'HYS', '0', '121.158477', '36.776425', '93'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('975', '370702', '4', '娼嶅煄鍖', 'WCQ', '0', '119.024836', '36.7281', '94'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('976', '370703', '4', '瀵掍涵鍖', 'HTQ', '0', '119.219734', '36.775491', '94'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('977', '370704', '4', '鍧婂瓙鍖', 'FZQ', '0', '119.166485', '36.654448', '94'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('978', '370705', '4', '濂庢枃鍖', 'KWQ', '0', '119.132486', '36.707676', '94'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('979', '370724', '4', '涓存湊鍘', 'LQX', '0', '118.542982', '36.5125059', '94'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('980', '370725', '4', '鏄屼箰鍘', 'CLX', '0', '118.829914', '36.706945', '94'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('981', '370781', '4', '闈掑窞甯', 'QZS', '0', '118.479622', '36.684528', '94'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('982', '370782', '4', '璇稿煄甯', 'ZCS', '0', '119.410103', '35.995654', '94'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('983', '370783', '4', '瀵垮厜甯', 'SGS', '0', '118.790652', '36.85548', '94'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('984', '370784', '4', '瀹変笜甯', 'AQS', '0', '119.218978', '36.478494', '94'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('985', '370785', '4', '楂樺瘑甯', 'GMS', '0', '119.755597', '36.3825949', '94'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('986', '370786', '4', '鏄岄倯甯', 'CYS', '0', '119.398525', '36.85882', '94'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('987', '370802', '4', '甯備腑鍖', 'SZQ', '0', '116.596614', '35.40819', '95'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('988', '370811', '4', '浠诲煄鍖', 'RCQ', '0', '116.628562', '35.433727', '95'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('989', '370826', '4', '寰北鍘', 'WSX', '0', '117.128946', '34.8071', '95'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('990', '370827', '4', '楸煎彴鍘', 'YTX', '0', '116.650608', '35.012749', '95'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('991', '370828', '4', '閲戜埂鍘', 'JXX', '0', '116.311532', '35.06662', '95'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('992', '370829', '4', '鍢夌ゥ鍘', 'JXX', '0', '116.342442', '35.407829', '95'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('993', '370830', '4', '姹朵笂鍘', 'WSX', '0', '116.489043', '35.732799', '95'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('994', '370831', '4', '娉楁按鍘', 'SSX', '0', '117.251195', '35.664323', '95'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('995', '370832', '4', '姊佸北鍘', 'LSX', '0', '116.096044', '35.802306', '95'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('996', '370881', '4', '鏇查槣甯', 'QFS', '0', '116.986532', '35.581137', '95'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('997', '370882', '4', '鍏栧窞甯', 'YZS', '0', '116.783834', '35.553144', '95'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('998', '370883', '4', '閭瑰煄甯', 'ZCS', '0', '117.003743', '35.405185', '95'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('999', '370902', '4', '娉板北鍖', 'TSQ', '0', '117.135354', '36.192084', '96'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('184', '360100', '3', '鍗楁槍甯', 'NCS', '0', '115.858089', '28.68316', '17'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('185', '360200', '3', '鏅痉闀囧競', 'JDZS', '0', '117.17842', '29.268836', '17'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('186', '360300', '3', '钀嶄埂甯', 'PXS', '0', '113.854676', '27.622865', '17'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('187', '360400', '3', '涔濇睙甯', 'JJS', '0', '116.001951', '29.705103', '17'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('188', '360500', '3', '鏂颁綑甯', 'XYS', '0', '114.91741', '27.817819', '17'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('189', '360600', '3', '楣版江甯', 'YTS', '0', '117.069202', '28.260189', '17'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('190', '360700', '3', '璧e窞甯', 'GZS', '0', '114.935025', '25.831925', '17'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('191', '360800', '3', '鍚夊畨甯', 'JAS', '0', '114.992912', '27.113039', '17'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('192', '360900', '3', '瀹滄槬甯', 'YCS', '0', '114.416778', '27.815619', '17'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('193', '361000', '3', '鎶氬窞甯', 'FZS', '0', '116.358176', '27.9492', '17'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('194', '361100', '3', '涓婇ザ甯', 'SRS', '0', '117.943433', '28.454863', '17'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1739', '360102', '4', '涓滄箹鍖', 'DHQ', '0', '115.89901', '28.6849159', '184'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1740', '360103', '4', '瑗挎箹鍖', 'XHQ', '0', '115.877287', '28.656887', '184'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1741', '360104', '4', '闈掍簯璋卞尯', 'QYPQ', '0', '115.925749', '28.621169', '184'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1742', '360105', '4', '婀鹃噷鍖', 'WLQ', '0', '115.730994', '28.714869', '184'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1743', '360111', '4', '闈掑北婀栧尯', 'QSHQ', '0', '115.962144', '28.682985', '184'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1744', '360121', '4', '鍗楁槍鍘', 'NCX', '0', '115.944162', '28.545459', '184'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1745', '360122', '4', '鏂板缓鍘', 'XJX', '0', '115.815233', '28.692437', '184'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1746', '360123', '4', '瀹変箟鍘', 'AYX', '0', '115.549199', '28.844429', '184'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1747', '360124', '4', '杩涜搐鍘', 'JXX', '0', '116.240924', '28.376918', '184'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1748', '360202', '4', '鏄屾睙鍖', 'CJQ', '0', '117.183688', '29.27342', '185'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1749', '360203', '4', '鐝犲北鍖', 'ZSQ', '0', '117.202336', '29.301272', '185'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1750', '360222', '4', '娴鍘', 'FLX', '0', '117.215061', '29.351739', '185'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1751', '360281', '4', '涔愬钩甯', 'LPS', '0', '117.129169', '28.961902', '185'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1752', '360302', '4', '瀹夋簮鍖', 'AYQ', '0', '113.87073', '27.615202', '186'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1753', '360313', '4', '婀樹笢鍖', 'XDQ', '0', '113.733059', '27.640075', '186'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1754', '360321', '4', '鑾茶姳鍘', 'LHX', '0', '113.961465', '27.127669', '186'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1755', '360322', '4', '涓婃牀鍘', 'SLX', '0', '113.795219', '27.880567', '186'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1756', '360323', '4', '鑺︽邯鍘', 'LXX', '0', '114.029595', '27.631145', '186'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1757', '360402', '4', '搴愬北鍖', 'LSQ', '0', '115.989212', '29.671775', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1758', '360403', '4', '娴旈槼鍖', 'XYQ', '0', '115.990399', '29.72746', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1759', '360421', '4', '涔濇睙鍘', 'JJX', '0', '115.911314', '29.608456', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1760', '360423', '4', '姝﹀畞鍘', 'WNX', '0', '115.100579', '29.256323', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1761', '360424', '4', '淇按鍘', 'XSX', '0', '114.547356', '29.025707', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1762', '360425', '4', '姘镐慨鍘', 'YXX', '0', '115.809111', '29.021824', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1763', '360426', '4', '寰峰畨鍘', 'DAX', '0', '115.756883', '29.314348', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1764', '360427', '4', '鏄熷瓙鍘', 'XZX', '0', '116.044893', '29.448037', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1765', '360428', '4', '閮芥槍鍘', 'DCX', '0', '116.204099', '29.273194', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1766', '360429', '4', '婀栧彛鍘', 'HKX', '0', '116.220266', '29.73944', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1767', '360430', '4', '褰辰鍘', 'PZX', '0', '116.549359', '29.896061', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1768', '360481', '4', '鐟炴槍甯', 'RCS', '0', '115.681504', '29.673795', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1769', '360499', '4', '鍏遍潚鍩', 'GQC', '0', '115.774', '29.2417', '187'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1770', '360502', '4', '娓濇按鍖', 'YSQ', '0', '114.944574', '27.80038', '188'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1771', '360521', '4', '鍒嗗疁鍘', 'FYX', '0', '114.692039', '27.814628', '188'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1772', '360602', '4', '鏈堟箹鍖', 'YHQ', '0', '117.036676', '28.238797', '189'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1773', '360622', '4', '浣欐睙鍘', 'YJX', '0', '116.818871', '28.204174', '189'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1774', '360681', '4', '璐垫邯甯', 'GXS', '0', '117.245497', '28.292519', '189'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1775', '360702', '4', '绔犺础鍖', 'ZGQ', '0', '114.941826', '25.862827', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1776', '360721', '4', '璧e幙', 'GX', '0', '115.011561', '25.860691', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1777', '360722', '4', '淇′赴鍘', 'XFX', '0', '114.922963', '25.386278', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1778', '360723', '4', '澶т綑鍘', 'DYX', '0', '114.362094', '25.401283', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1779', '360724', '4', '涓婄姽鍘', 'SYX', '0', '114.551371', '25.784978', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1780', '360725', '4', '宕囦箟鍘', 'CYX', '0', '114.308273', '25.681879', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1781', '360726', '4', '瀹夎繙鍘', 'AYX', '0', '115.393922', '25.136925', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1782', '360727', '4', '榫欏崡鍘', 'LNX', '0', '114.789811', '24.911107', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1783', '360728', '4', '瀹氬崡鍘', 'DNX', '0', '115.027845', '24.78441', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1784', '360729', '4', '鍏ㄥ崡鍘', 'QNX', '0', '114.530125', '24.742401', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1785', '360730', '4', '瀹侀兘鍘', 'NDX', '0', '116.009472', '26.470116', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1786', '360731', '4', '浜庨兘鍘', 'YDX', '0', '115.41551', '25.952066', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1787', '360732', '4', '鍏村浗鍘', 'XGX', '0', '115.36319', '26.337937', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1788', '360733', '4', '浼氭槍鍘', 'HCX', '0', '115.786057', '25.600272', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1789', '360734', '4', '瀵讳箤鍘', 'YWX', '0', '115.646525', '24.963322', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1790', '360735', '4', '鐭冲煄鍘', 'SCX', '0', '116.354201', '26.32686', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1791', '360781', '4', '鐟為噾甯', 'RJS', '0', '116.02713', '25.885561', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1792', '360782', '4', '鍗楀悍甯', 'NKS', '0', '114.765238', '25.661356', '190'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1793', '360802', '4', '鍚夊窞鍖', 'JZQ', '0', '114.994307', '27.129975', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1794', '360803', '4', '闈掑師鍖', 'QYQ', '0', '115.01424', '27.081719', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1795', '360821', '4', '鍚夊畨鍘', 'JAX', '0', '114.907659', '27.040142', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1796', '360822', '4', '鍚夋按鍘', 'JSX', '0', '115.135507', '27.229632', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1797', '360823', '4', '宄℃睙鍘', 'XJX', '0', '115.316566', '27.582901', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1798', '360824', '4', '鏂板共鍘', 'XGX', '0', '115.393043', '27.740809', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1799', '360825', '4', '姘镐赴鍘', 'YFX', '0', '115.441477', '27.317869', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1800', '360826', '4', '娉板拰鍘', 'THX', '0', '114.908861', '26.790231', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1801', '360827', '4', '閬傚窛鍘', 'SCX', '0', '114.52098', '26.311894', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1802', '360828', '4', '涓囧畨鍘', 'WAX', '0', '114.786256', '26.458257', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1803', '360829', '4', '瀹夌鍘', 'AFX', '0', '114.619893', '27.392874', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1804', '360830', '4', '姘告柊鍘', 'YXX', '0', '114.242675', '26.945233', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1805', '360881', '4', '浜曞唸灞卞競', 'JGSS', '0', '114.289182', '26.748186', '191'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1806', '360902', '4', '琚佸窞鍖', 'YZQ', '0', '114.424657', '27.798846', '192'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1807', '360921', '4', '濂夋柊鍘', 'FXX', '0', '115.384904', '28.700806', '192'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1808', '360922', '4', '涓囪浇鍘', 'WZX', '0', '114.447551', '28.10455', '192'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1809', '360923', '4', '涓婇珮鍘', 'SGX', '0', '114.924494', '28.232827', '192'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1810', '360924', '4', '瀹滀赴鍘', 'YFX', '0', '114.803542', '28.393613', '192'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1811', '360925', '4', '闈栧畨鍘', 'JAX', '0', '115.362629', '28.861475', '192'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1812', '360926', '4', '閾滈紦鍘', 'TGX', '0', '114.37098', '28.520747', '192'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1813', '360981', '4', '涓板煄甯', 'FCS', '0', '115.771195', '28.159325', '192'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1814', '360982', '4', '妯熸爲甯', 'ZSS', '0', '115.546063', '28.055796', '192'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1815', '360983', '4', '楂樺畨甯', 'GAS', '0', '115.375618', '28.417261', '192'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1816', '361002', '4', '涓村窛鍖', 'LCQ', '0', '116.31136', '27.934529', '193'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1817', '361021', '4', '鍗楀煄鍘', 'NCX', '0', '116.644658', '27.552748', '193'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1818', '361022', '4', '榛庡窛鍘', 'LCX', '0', '116.907508', '27.282382', '193'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1819', '361023', '4', '鍗椾赴鍘', 'NFX', '0', '116.525725', '27.218445', '193'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1820', '361024', '4', '宕囦粊鍘', 'CRX', '0', '116.061164', '27.764681', '193'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1821', '361025', '4', '涔愬畨鍘', 'LAX', '0', '115.837895', '27.420441', '193'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1822', '361026', '4', '瀹滈粍鍘', 'YHX', '0', '116.222128', '27.546146', '193'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1823', '361027', '4', '閲戞邯鍘', 'JXX', '0', '116.775435', '27.908337', '193'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1824', '361028', '4', '璧勬邯鍘', 'ZXX', '0', '117.060264', '27.706102', '193'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1825', '361029', '4', '涓滀埂鍘', 'DXX', '0', '116.590465', '28.236118', '193'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1826', '361030', '4', '骞挎槍鍘', 'GCX', '0', '116.325757', '26.837267', '193'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1827', '361102', '4', '淇″窞鍖', 'XZQ', '0', '117.966823', '28.43121', '194'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1828', '361121', '4', '涓婇ザ鍘', 'SRX', '0', '117.90785', '28.448983', '194'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1829', '361122', '4', '骞夸赴鍘', 'GFX', '0', '118.19124', '28.436286', '194'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1830', '361123', '4', '鐜夊北鍘', 'YSX', '0', '118.245124', '28.682055', '194'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1831', '361124', '4', '閾呭北鍘', 'QSX', '0', '117.709451', '28.315217', '194'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1832', '361125', '4', '妯嘲鍘', 'HFX', '0', '117.596452', '28.407118', '194'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1833', '361126', '4', '寮嬮槼鍘', 'YYX', '0', '117.449588', '28.378044', '194'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1834', '361127', '4', '浣欏共鍘', 'YGX', '0', '116.695647', '28.702302', '194'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1835', '361128', '4', '閯遍槼鍘', 'PYX', '0', '116.699746', '29.011699', '194'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1836', '361129', '4', '涓囧勾鍘', 'WNX', '0', '117.058445', '28.694582', '194'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1837', '361130', '4', '濠烘簮鍘', 'WYX', '0', '117.861911', '29.2480249', '194'); +INSERT INTO t_s_territory (ID, territorycode, territorylevel, territoryname, territory_pinyin, territorysort, x_wgs84, y_wgs84, territoryparentid) + +VALUES ('1838', '361181', '4', '寰峰叴甯', 'DXS', '0', '117.578713', '28.946464', '194'); + + + + + diff --git a/src/main/java/org/jeecgframework/web/system/txt/valid-code-demo.ftl b/src/main/java/org/jeecgframework/web/system/txt/valid-code-demo.ftl new file mode 100644 index 00000000..b5660451 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/txt/valid-code-demo.ftl @@ -0,0 +1,67 @@ +
    + + + +
    +
    + + + +
    +
    + + + + 闃呰 + + + + 闊充箰 + + + + 杩愬姩 + + +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    \ No newline at end of file diff --git a/src/main/java/org/jeecgframework/web/system/util/PackagesToScanUtil.java b/src/main/java/org/jeecgframework/web/system/util/PackagesToScanUtil.java new file mode 100644 index 00000000..cf000843 --- /dev/null +++ b/src/main/java/org/jeecgframework/web/system/util/PackagesToScanUtil.java @@ -0,0 +1,238 @@ +package org.jeecgframework.web.system.util; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.net.JarURLConnection; +import java.net.URL; +import java.net.URLDecoder; +import java.util.Enumeration; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +import org.apache.log4j.Logger; + +/** + * + * @Title:MiniDaoHandler + * @description:Mini Bean Scan + * @author 寮犱唬娴 + * @mail zhangdaiscott@163.com + * @category www.jeecg.org + * @date 20130817 + * @version V1.0 + */ +public class PackagesToScanUtil { + private static final Logger logger = Logger.getLogger(PackagesToScanUtil.class); + private static final String SUB_PACKAGE_SCREEN__SUFFIX = ".*"; + private static final String SUB_PACKAGE_SCREEN__SUFFIX_RE = ".\\*";//鏇挎崲浣跨敤 + + /** + * 浠庡寘package涓幏鍙栨墍鏈夌殑Class + * + * @param pack + * @return + */ + public static Set> getClasses(String pack) { + // 鏄惁寰幆杩唬 + boolean recursive = false; + String[] packArr = {}; + + if (pack.lastIndexOf(SUB_PACKAGE_SCREEN__SUFFIX) != -1) { + packArr = pack.split(SUB_PACKAGE_SCREEN__SUFFIX_RE); + if (packArr.length > 1) { + // 闇瑕佸尮閰嶄腑闂寸殑浠绘剰灞傚寘 + pack = packArr[0]; + for (int i = 0; i < packArr.length; i++) { + packArr[i] = packArr[i].replace(SUB_PACKAGE_SCREEN__SUFFIX.substring(1), ""); + } + } else { + pack = pack.replace(SUB_PACKAGE_SCREEN__SUFFIX, ""); + } + recursive = true; + } + + // 绗竴涓猚lass绫荤殑闆嗗悎 + Set> classes = new LinkedHashSet>(); + + // 鑾峰彇鍖呯殑鍚嶅瓧 骞惰繘琛屾浛鎹 + String packageName = pack; + String packageDirName = packageName.replace('.', '/'); + // 瀹氫箟涓涓灇涓剧殑闆嗗悎 骞惰繘琛屽惊鐜潵澶勭悊杩欎釜鐩綍涓嬬殑things + Enumeration dirs; + try { + dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName); + // 寰幆杩唬涓嬪幓 + while (dirs.hasMoreElements()) { + // 鑾峰彇涓嬩竴涓厓绱 + URL url = dirs.nextElement(); + // 寰楀埌鍗忚鐨勫悕绉 + String protocol = url.getProtocol(); + // 濡傛灉鏄互鏂囦欢鐨勫舰寮忎繚瀛樺湪鏈嶅姟鍣ㄤ笂 + if ("file".equals(protocol)) { + logger.debug("-------------- file绫诲瀷鐨勬壂鎻 ----------------"); + // 鑾峰彇鍖呯殑鐗╃悊璺緞 + String filePath = URLDecoder.decode(url.getFile(), "UTF-8"); + + // 浠ユ枃浠剁殑鏂瑰紡鎵弿鏁翠釜鍖呬笅鐨勬枃浠 骞舵坊鍔犲埌闆嗗悎涓 + findAndAddClassesInPackageByFile(packageName, packArr, filePath, recursive, classes); + } else if ("jar".equals(protocol)) { + findAndAddClassesInPackageByJarFile(packageName, packArr, url, packageDirName, recursive, classes); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + return classes; + } + + /** + * 浠ユ枃浠剁殑褰㈠紡鏉ヨ幏鍙栧寘涓嬬殑鎵鏈塁lass + * + *
    + * + * @author cmh + * @version 2014-2-16 涓嬪崍6:59:03 + * @param packageName + * @param packArr + * @param packagePath + * @param recursive + * @param classes + */ + private static void findAndAddClassesInPackageByFile(String packageName, String[] packArr, String packagePath, final boolean recursive, Set> classes) { + // 鑾峰彇姝ゅ寘鐨勭洰褰 寤虹珛涓涓狥ile + File dir = new File(packagePath); + // 濡傛灉涓嶅瓨鍦ㄦ垨鑰 涔熶笉鏄洰褰曞氨鐩存帴杩斿洖 + if (!dir.exists() || !dir.isDirectory()) { + // log.warn("鐢ㄦ埛瀹氫箟鍖呭悕 " + packageName + " 涓嬫病鏈変换浣曟枃浠"); + return; + } + // 濡傛灉瀛樺湪 灏辫幏鍙栧寘涓嬬殑鎵鏈夋枃浠 鍖呮嫭鐩綍 + File[] dirfiles = dir.listFiles(new FileFilter() { + // 鑷畾涔夎繃婊よ鍒 濡傛灉鍙互寰幆(鍖呭惈瀛愮洰褰) 鎴栧垯鏄互.class缁撳熬鐨勬枃浠(缂栬瘧濂界殑java绫绘枃浠) + public boolean accept(File file) { + return (recursive && file.isDirectory()) || (file.getName().endsWith(".class")); + } + }); + // 寰幆鎵鏈夋枃浠 + for (File file : dirfiles) { + // 濡傛灉鏄洰褰 鍒欑户缁壂鎻 + if (file.isDirectory()) { + findAndAddClassesInPackageByFile(packageName + "." + file.getName(), packArr, file.getAbsolutePath(), recursive, classes); + } else { + // 濡傛灉鏄痡ava绫绘枃浠 鍘绘帀鍚庨潰鐨.class 鍙暀涓嬬被鍚 + String className = file.getName().substring(0, file.getName().length() - 6); + try { + // 娣诲姞鍒伴泦鍚堜腑鍘 + // classes.add(Class.forName(packageName + '.' + + // className)); + // 缁忚繃鍥炲鍚屽鐨勬彁閱掞紝杩欓噷鐢╢orName鏈変竴浜涗笉濂斤紝浼氳Е鍙憇tatic鏂规硶锛屾病鏈変娇鐢╟lassLoader鐨刲oad骞插噣 + String classUrl = packageName + '.' + className; + // 鍒ゆ柇鏄惁鏄互鐐瑰紑澶 + if (classUrl.startsWith(".")) { + classUrl = classUrl.replaceFirst(".", ""); + } + + boolean flag = true; + if(packArr.length>1){ + for (int i = 1; i < packArr.length; i++) { + if (classUrl.indexOf(packArr[i]) <= -1) { + flag = flag && false; + } else { + flag = flag && true; + } + } + } + + if (flag) { + classes.add(Thread.currentThread().getContextClassLoader().loadClass(classUrl)); + } + } catch (ClassNotFoundException e) { + logger.error("娣诲姞鐢ㄦ埛鑷畾涔夎鍥剧被閿欒 鎵句笉鍒版绫荤殑.class鏂囦欢"); + e.printStackTrace(); + } + } + } + } + + /** + * 浠ar鏂囦欢鐨勫舰寮忔潵鑾峰彇鍖呬笅鐨勬墍鏈塁lass + * + *
    + * @author cmh + * @version 2014-2-16 涓嬪崍7:51:05 + * @param packageName + * @param url + * @param packageDirName + * @param recursive + * @param classes + */ + private static void findAndAddClassesInPackageByJarFile(String packageName, String[] packArr, URL url, String packageDirName, final boolean recursive, Set> classes) { + // 濡傛灉鏄痡ar鍖呮枃浠 + // 瀹氫箟涓涓狫arFile + logger.debug("------------------------ jar绫诲瀷鐨勬壂鎻 ----------------------"); + JarFile jar; + try { + // 鑾峰彇jar + jar = ((JarURLConnection) url.openConnection()).getJarFile(); + // 浠庢jar鍖 寰楀埌涓涓灇涓剧被 + Enumeration entries = jar.entries(); + // 鍚屾牱鐨勮繘琛屽惊鐜凯浠 + while (entries.hasMoreElements()) { + // 鑾峰彇jar閲岀殑涓涓疄浣 鍙互鏄洰褰 鍜屼竴浜沯ar鍖呴噷鐨勫叾浠栨枃浠 濡侻ETA-INF绛夋枃浠 + JarEntry entry = entries.nextElement(); + String name = entry.getName(); + // 濡傛灉鏄互/寮澶寸殑 + if (name.charAt(0) == '/') { + // 鑾峰彇鍚庨潰鐨勫瓧绗︿覆 + name = name.substring(1); + } + // 濡傛灉鍓嶅崐閮ㄥ垎鍜屽畾涔夌殑鍖呭悕鐩稿悓 + if (name.startsWith(packageDirName)) { + int idx = name.lastIndexOf('/'); + // 濡傛灉浠"/"缁撳熬 鏄竴涓寘 + if (idx != -1) { + // 鑾峰彇鍖呭悕 鎶"/"鏇挎崲鎴"." + packageName = name.substring(0, idx).replace('/', '.'); + } + // 濡傛灉鍙互杩唬涓嬪幓 骞朵笖鏄竴涓寘 + if ((idx != -1) || recursive) { + // 濡傛灉鏄竴涓.class鏂囦欢 鑰屼笖涓嶆槸鐩綍 + if (name.endsWith(".class") && !entry.isDirectory()) { + // 鍘绘帀鍚庨潰鐨".class" 鑾峰彇鐪熸鐨勭被鍚 + String className = name.substring(packageName.length() + 1, name.length() - 6); + try { + // 娣诲姞鍒癱lasses + + boolean flag = true; + if(packArr.length>1){ + for (int i = 1; i < packArr.length; i++) { + if (packageName.indexOf(packArr[i]) <= -1) { + flag = flag && false; + } else { + flag = flag && true; + } + } + } + + if(flag){ + classes.add(Class.forName(packageName + '.' + className)); + } + } catch (ClassNotFoundException e) { + logger.error("娣诲姞鐢ㄦ埛鑷畾涔夎鍥剧被閿欒 鎵句笉鍒版绫荤殑.class鏂囦欢"); + e.printStackTrace(); + } + } + } + } + } + } catch (IOException e) { + logger.error("鍦ㄦ壂鎻忕敤鎴峰畾涔夎鍥炬椂浠巎ar鍖呰幏鍙栨枃浠跺嚭閿"); + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/test/JeecgInitDB.java b/src/main/java/test/JeecgInitDB.java new file mode 100644 index 00000000..5c77a7ad --- /dev/null +++ b/src/main/java/test/JeecgInitDB.java @@ -0,0 +1,336 @@ +package test; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity; +import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity; +import org.jeecgframework.web.system.pojo.base.TSAttachment; +import org.jeecgframework.web.system.pojo.base.TSBaseUser; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.pojo.base.TSFunction; +import org.jeecgframework.web.system.pojo.base.TSLog; +import org.jeecgframework.web.system.pojo.base.TSRole; +import org.jeecgframework.web.system.pojo.base.TSType; +import org.jeecgframework.web.system.pojo.base.TSTypegroup; +import org.jeecgframework.web.system.pojo.base.TSUser; +import freemarker.template.Configuration; +import freemarker.template.DefaultObjectWrapper; +import freemarker.template.Template; + + +/** + * @Description + * @ClassName: JeecgInitDB + * @author tanghan + * @date 2013-7-19 涓嬪崍04:24:51 + */ + +public class JeecgInitDB { + + private static Connection con=null; + + + public static Connection getConnection() throws ClassNotFoundException, SQLException{ + if(con == null){ + Class.forName("com.mysql.jdbc.Driver"); + con=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jeecg", "root","root"); + } + return con; + } + + public static void main(String[] args) throws Exception { + Configuration cfg = new Configuration(); + String sql1="select * from t_s_attachment"; + String sql2="select * from t_s_base_user"; + String sql3="select * from t_s_depart"; + String sql4="select * from t_s_role"; + String sql5="select * from t_s_user"; + String sql6="select * from t_s_typegroup"; + String sql7 = "select * from t_s_function"; + String sql8 = "select * from t_s_type"; + String sql9 = "select * from t_s_log limit 100"; + String sql10 = "select * from cgform_field where table_id ="; //姝ゅ鐢变簬闇瑕佹洿鍏穋gform_head鐢熸垚锛屾晠鍙兘鍗曚釜鐢熸垚 + String sql11 = "select * from cgform_head "; + Statement st=null; + ResultSet rs=null; + try { + cfg.setDirectoryForTemplateLoading(new File("E:/Workspace-jeecg/jeecg-v3-simple-new/src/test")); + cfg.setObjectWrapper(new DefaultObjectWrapper()); + Template temp = cfg.getTemplate("init.ftl","UTF-8"); + con=getConnection(); + st=con.createStatement(); + rs=st.executeQuery(sql1); + int i=1; + Map root = new HashMap(); + List att = new ArrayList(); + while(rs.next()) + { + TSAttachment tsAttachment = new TSAttachment(); + tsAttachment.setId(i+""); + tsAttachment.setAttachmenttitle(rs.getString("attachmenttitle")); + tsAttachment.setRealpath(rs.getString("attachmenttitle")); + tsAttachment.setSwfpath(rs.getString("swfpath")); + tsAttachment.setExtend(rs.getString("extend")); + att.add(tsAttachment); + i++; + } + root.put("animals", att); + + + rs=st.executeQuery(sql2); + i=1; + List user = new ArrayList(); + while(rs.next()) + { + TSBaseUser baseUser = new TSBaseUser(); + baseUser.setId(i+""); + baseUser.setUserKey(rs.getString("userkey")); + baseUser.setStatus(rs.getShort("status")); + baseUser.setRealName(rs.getString("realname")); + baseUser.setUserName(rs.getString("username")); + baseUser.setPassword(rs.getString("password")); + baseUser.setActivitiSync(rs.getShort("activitisync")); + user.add(baseUser); + i++; + } + root.put("baseuser", user); + + + rs=st.executeQuery(sql3); + List dep = new ArrayList(); + i=1; + while(rs.next()) + { + TSDepart tsDepart = new TSDepart(); + tsDepart.setId(i+""); + tsDepart.setDepartname(rs.getString("departname")); + tsDepart.setDescription(rs.getString("description")); + dep.add(tsDepart); + i++; + } + root.put("depart", dep); + + + rs=st.executeQuery(sql4); + List role = new ArrayList(); + i=1; + while(rs.next()) + { + org.jeecgframework.core.util.LogUtil.info(rs.getString("rolename")); + TSRole tsRole = new TSRole(); + tsRole.setId(i+""); + tsRole.setRoleName(rs.getString("rolename")); + tsRole.setRoleCode(rs.getString("rolecode")); + role.add(tsRole); + i++; + } + root.put("role", role); + + rs=st.executeQuery(sql5); + List susers = new ArrayList(); + i=1; + while(rs.next()) + { + TSUser suer = new TSUser(); + suer.setId(i+""); +// org.jeecgframework.core.util.LogUtil.info(rs.getString("signaturefile")); +// suer.setSignatureFile(rs.getString("signaturefile")); + suer.setMobilePhone(rs.getString("mobilephone")); + suer.setOfficePhone(rs.getString("officephone")); + suer.setEmail(rs.getString("email")); + susers.add(suer); + i++; + } + root.put("suser", susers); + + rs=st.executeQuery(sql6); + List typegroup = new ArrayList(); + i=1; + while(rs.next()) + { + TSTypegroup tsTypegroup = new TSTypegroup(); + tsTypegroup.setId(i+""); +// org.jeecgframework.core.util.LogUtil.info(rs.getString("signaturefile")); +// suer.setSignatureFile(rs.getString("signaturefile")); + tsTypegroup.setTypegroupname(rs.getString("typegroupname")); + tsTypegroup.setTypegroupcode(rs.getString("typegroupcode")); + typegroup.add(tsTypegroup); + i++; + } + root.put("typegroup", typegroup); + + rs=st.executeQuery(sql7); + List function = new ArrayList(); + i=1; + while(rs.next()) + { + TSFunction tsFunction = new TSFunction(); + tsFunction.setId(i+""); + tsFunction.setFunctionName(rs.getString("functionName")); + tsFunction.setFunctionUrl(rs.getString("functionUrl")); + tsFunction.setFunctionLevel(rs.getShort("functionLevel")); + tsFunction.setFunctionOrder(rs.getString("functionOrder")); + function.add(tsFunction); + i++; + } + root.put("menu", function); + + rs=st.executeQuery(sql8); + List type = new ArrayList(); + i=1; + while(rs.next()) + { + TSType tsType = new TSType(); + tsType.setId(i+""); +// org.jeecgframework.core.util.LogUtil.info(rs.getString("signaturefile")); +// suer.setSignatureFile(rs.getString("signaturefile")); + tsType.setTypename(rs.getString("typename")); + tsType.setTypecode(rs.getString("typecode")); + type.add(tsType); + i++; + } + root.put("type", type); + + rs=st.executeQuery(sql9); + List log = new ArrayList(); + i=1; + while(rs.next()) + { + TSLog slog = new TSLog(); + slog.setId(i+""); +// org.jeecgframework.core.util.LogUtil.info(rs.getString("signaturefile")); +// suer.setSignatureFile(rs.getString("signaturefile")); +// tsType.setTypename(rs.getString("typename")); +// tsType.setTypecode(rs.getString("typecode")); +// type.add(tsType); + slog.setId(i+""); +// org.jeecgframework.core.util.LogUtil.info(rs.getString("logcontent")); + slog.setLogcontent(rs.getString("logcontent")); + slog.setLoglevel(rs.getShort("loglevel")); + slog.setBroswer(rs.getString("broswer")); + slog.setNote(rs.getString("note")); + slog.setOperatetime(rs.getTimestamp("operatetime")); + slog.setOperatetype(rs.getShort("operatetype")); + log.add(slog); + i++; + } + root.put("log", log); + + rs=st.executeQuery(sql11); + List cghead = new ArrayList(); + i=1; + while(rs.next()) + { + CgFormHeadEntity head = new CgFormHeadEntity(); + head.setId(i+""); + head.setTableName(rs.getString("table_name")); + head.setIsTree(rs.getString("is_tree")); + head.setIsPagination(rs.getString("is_pagination")); + head.setQuerymode(rs.getString("queryMode")); + head.setIsCheckbox(rs.getString("is_checkbox")); + head.setIsDbSynch(rs.getString("is_dbsynch")); + head.setContent(rs.getString("content")); + head.setJformVersion(rs.getString("JFORM_VERSION")); + head.setJformType(rs.getInt("jform_type")); + head.setColumns(getCgFormItem(sql10, rs.getString("id"))); + cghead.add(head); + i++; + } + root.put("cghead", cghead); +// rs=st.executeQuery(sql10); +// List cgfield = new ArrayList(); +// i=1; +// while(rs.next()) +// { +// CgFormFieldEntity filed = new CgFormFieldEntity(); +// filed.setFieldName(rs.getString("field_name")); +// filed.setLength(rs.getInt("length")); +// filed.setType(rs.getString("type")); +// filed.setPointLength(rs.getInt("point_length")); +// filed.setIsNull(rs.getString("is_null")); +// filed.setIsKey(rs.getString("is_key")); +// filed.setIsQuery(rs.getString("is_query")); +// filed.setIsShow(rs.getString("is_show")); +// filed.setShowType(rs.getString("show_type")); +// filed.setOrderNum(rs.getInt("order_num")); +// filed.setFieldHref(rs.getString("field_href")); +// filed.setFieldLength(rs.getInt("field_length")); +// filed.setFieldValidType(rs.getString("field_valid_type")); +// filed.setQueryMode(rs.getString("query_mode")); +// filed.setContent(rs.getString("content")); +// filed.setDictTable(rs.getString("dict_table")); +// filed.setDictField(rs.getString("dict_field")); +// filed.setMainField(rs.getString("main_field")); +// filed.setMainTable(rs.getString("main_table")); +// cgfield.add(filed); +// i++; +// } +// root.put("cgfield", cgfield); + + + Writer out = new OutputStreamWriter(new FileOutputStream("RepairServiceImpl.java"), "UTF-8"); + temp.process(root, out); + out.flush(); + out.close(); + org.jeecgframework.core.util.LogUtil.info("Successfull................"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + + /** + * 鑾峰彇琛ㄥ崟瀛楁鏂规硶 + * @param sql10 + * @param cgformhead_id + * @return + * @throws Exception + */ + public static List getCgFormItem(String sql10,String cgformhead_id) throws Exception{ + Statement st =con.createStatement(); + ResultSet rs = st.executeQuery(sql10+"'"+cgformhead_id.trim()+"'"); + List cgfield = new ArrayList(); + int i=1; + while(rs.next()) + { + CgFormFieldEntity filed = new CgFormFieldEntity(); + filed.setFieldName(rs.getString("field_name")); + filed.setLength(rs.getInt("length")); + filed.setType(rs.getString("type")); + filed.setPointLength(rs.getInt("point_length")); + filed.setIsNull(rs.getString("is_null")); + filed.setIsKey(rs.getString("is_key")); + filed.setIsQuery(rs.getString("is_query")); + filed.setIsShow(rs.getString("is_show")); + filed.setShowType(rs.getString("show_type")); + filed.setOrderNum(rs.getInt("order_num")); + filed.setFieldHref(rs.getString("field_href")); + filed.setFieldLength(rs.getInt("field_length")); + filed.setFieldValidType(rs.getString("field_valid_type")); + filed.setQueryMode(rs.getString("query_mode")); + filed.setContent(rs.getString("content")); + filed.setDictTable(rs.getString("dict_table")); + filed.setDictField(rs.getString("dict_field")); + filed.setMainField(rs.getString("main_field")); + filed.setMainTable(rs.getString("main_table")); + cgfield.add(filed); + i++; + } + return cgfield; + } + +} diff --git a/src/main/java/test/JeecgOneGUI.java b/src/main/java/test/JeecgOneGUI.java new file mode 100644 index 00000000..163bcaa2 --- /dev/null +++ b/src/main/java/test/JeecgOneGUI.java @@ -0,0 +1,17 @@ +package test; + +import org.jeecgframework.codegenerate.window.CodeWindow; + + +/** + * 銆愬崟琛ㄦā鍨嬨戜唬鐮佺敓鎴愬櫒鍏ュ彛 + * @author 寮犱唬娴 + * + */ +public class JeecgOneGUI { + + public static void main(String[] args) { + CodeWindow codeWindow = new CodeWindow(); + codeWindow.pack(); + } +} diff --git a/src/main/java/test/JeecgOneToMainUtil.java b/src/main/java/test/JeecgOneToMainUtil.java new file mode 100644 index 00000000..52ad0071 --- /dev/null +++ b/src/main/java/test/JeecgOneToMainUtil.java @@ -0,0 +1,57 @@ +package test; + +import java.util.ArrayList; +import java.util.List; + +import org.jeecgframework.codegenerate.generate.onetomany.CodeGenerateOneToMany; +import org.jeecgframework.codegenerate.pojo.onetomany.CodeParamEntity; +import org.jeecgframework.codegenerate.pojo.onetomany.SubTableEntity; + + +/** + * 浠g爜鐢熸垚鍣ㄥ叆鍙c愪竴瀵瑰銆 + * @author 寮犱唬娴 + * + */ +public class JeecgOneToMainUtil { + + /** + * 涓瀵瑰(鐖跺瓙琛)鏁版嵁妯″瀷锛岀敓鎴愭柟娉 + * @param args + */ + public static void main(String[] args) { + //绗竴姝ワ細璁剧疆涓昏〃 + CodeParamEntity codeParamEntityIn = new CodeParamEntity(); + codeParamEntityIn.setTableName("jeecg_order_main");//涓昏〃[琛ㄥ悕] + codeParamEntityIn.setEntityName("OrderMain"); //涓昏〃[瀹炰綋鍚峕 + codeParamEntityIn.setEntityPackage("jeecg"); //涓昏〃[鍖呭悕] + codeParamEntityIn.setFtlDescription("璁㈠崟涓绘暟鎹"); //涓昏〃[鎻忚堪] + + //绗簩姝ワ細璁剧疆瀛愯〃闆嗗悎 + List subTabParamIn = new ArrayList(); + //[1].瀛愯〃涓 + SubTableEntity po = new SubTableEntity(); + po.setTableName("jeecg_order_custom");//瀛愯〃[琛ㄥ悕] + po.setEntityName("OrderCustoms"); //瀛愯〃[瀹炰綋鍚峕 + po.setEntityPackage("jeecg"); //瀛愯〃[鍖匽 + po.setFtlDescription("璁㈠崟瀹㈡埛鏄庣粏"); //瀛愯〃[鎻忚堪] + //瀛愯〃[澶栭敭:涓庝富琛ㄥ叧鑱斿閿甝 + //璇存槑锛氳繖閲岄潰鐨勫閿槸瀛愯〃鐨勫閿瓧娈,闈炰富琛ㄥ拰瀛愯〃鐨勫搴斿叧绯 GORDER_ID淇敼涓篒D + po.setForeignKeys(new String[]{"ID","GO_ORDER_CODE"}); + subTabParamIn.add(po); + //[2].瀛愯〃浜 + SubTableEntity po2 = new SubTableEntity(); + po2.setTableName("jeecg_order_product"); //瀛愯〃[琛ㄥ悕] + po2.setEntityName("OrderProduct"); //瀛愯〃[瀹炰綋鍚峕 + po2.setEntityPackage("jeecg"); //瀛愯〃[鍖匽 + po2.setFtlDescription("璁㈠崟浜у搧鏄庣粏"); //瀛愯〃[鎻忚堪] + //瀛愯〃[澶栭敭:涓庝富琛ㄥ叧鑱斿閿甝 + //璇存槑锛氳繖閲岄潰鐨勫閿槸瀛愯〃鐨勫閿瓧娈,闈炰富琛ㄥ拰瀛愯〃鐨勫搴斿叧绯 GORDER_ID淇敼涓篒D + po2.setForeignKeys(new String[]{"ID","GO_ORDER_CODE"}); + subTabParamIn.add(po2); + codeParamEntityIn.setSubTabParam(subTabParamIn); + + //绗笁姝ワ細涓瀵瑰(鐖跺瓙琛)鏁版嵁妯″瀷,浠g爜鐢熸垚 + CodeGenerateOneToMany.oneToManyCreate(subTabParamIn, codeParamEntityIn); + } +} diff --git a/src/main/java/test/init.ftl b/src/main/java/test/init.ftl new file mode 100644 index 00000000..f29a90b1 --- /dev/null +++ b/src/main/java/test/init.ftl @@ -0,0 +1,338 @@ +package jeecg.system.service.impl; + +import org.jeecgframework.web.system.pojo.base.TSFunction; +import org.jeecgframework.web.system.pojo.base.TSIcon; +import org.jeecgframework.web.system.service.RepairService; + +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @Description 淇鏁版嵁搴揝ervice + * @ClassName: RepairService + * @author tanghan + * @date 2013-7-19 涓嬪崍01:31:00 + */ +@Service("repairService") +@Transactional +public class RepairServiceImpl extends CommonServiceImpl implements RepairService{ + + /** + * @Description 鍏堟竻绌烘暟鎹簱锛岀劧鍚庡啀淇鏁版嵁搴 + * @author tanghan 2013-7-19 + */ + + public void deleteAndRepair() { + + } + + /** + * @Description 淇鏁版嵁搴 + * @author tanghan 2013-7-19 + */ + + synchronized public void repair() { + repaireIcon(); //淇鍥炬爣 + repairAttachment(); //淇敼闄勪欢 + repairDepart(); + repairMenu();// 淇鑿滃崟鏉冮檺銆愭潈闄愭帶鍒跺埌鑿滃崟绾у埆銆 + repairRole();// 淇瑙掕壊 + repairUser();// 淇鐢ㄦ埛 +// repairRoleAuth();// 淇瑙掕壊鍜屾潈闄愮殑鍏崇郴 +// repairUserRole();// 淇鐢ㄦ埛鍜岃鑹茬殑鍏崇郴 +// repairDict();// 淇瀛楀吀 +// repairOrg();// 淇缁勭粐鏈烘瀯 + } + +/** + * @Description + * @author tanghan 2013-7-28 + */ + private void repairCgFormField() { + <#list cghead as hd> + //琛ㄥ崟[${hd.content}] - 瀛楁娓呭崟 + CgFormHeadEntity ${hd.tableName} = commonDao.findByProperty(CgFormHeadEntity.class, "tableName", "${hd.tableName}").get(0); + <#list hd.columns as f> + CgFormFieldEntity ${hd.tableName}_${f.fieldName} = new CgFormFieldEntity(); + ${hd.tableName}_${f.fieldName}.setFieldName("${f.fieldName}"); + ${hd.tableName}_${f.fieldName}.setTable(${hd.tableName}); + ${hd.tableName}_${f.fieldName}.setFieldLength(${f.fieldLength}); + ${hd.tableName}_${f.fieldName}.setIsKey("${f.isKey}"); + ${hd.tableName}_${f.fieldName}.setIsNull("${f.isNull}"); + ${hd.tableName}_${f.fieldName}.setIsQuery("${f.isQuery}"); + ${hd.tableName}_${f.fieldName}.setIsShow("${f.isShow}"); + ${hd.tableName}_${f.fieldName}.setShowType("${f.showType}"); + ${hd.tableName}_${f.fieldName}.setLength(${f.length}); + ${hd.tableName}_${f.fieldName}.setType("${f.type}"); + ${hd.tableName}_${f.fieldName}.setOrderNum(${f.orderNum}); + ${hd.tableName}_${f.fieldName}.setPointLength(${f.pointLength}); + ${hd.tableName}_${f.fieldName}.setQueryMode("${f.queryMode}"); + ${hd.tableName}_${f.fieldName}.setContent("${f.content}"); + ${hd.tableName}_${f.fieldName}.setCreateBy("admin"); + ${hd.tableName}_${f.fieldName}.setCreateDate(new Date()); + ${hd.tableName}_${f.fieldName}.setCreateName("绠$悊鍛"); + ${hd.tableName}_${f.fieldName}.setDictField("${f.dictField}"); + ${hd.tableName}_${f.fieldName}.setDictTable("${f.dictTable}"); + ${hd.tableName}_${f.fieldName}.setMainTable("${f.mainTable}"); + ${hd.tableName}_${f.fieldName}.setMainField("${f.mainField}"); + commonDao.saveOrUpdate(${hd.tableName}_${f.fieldName}); + + + + } + + + /** + * @Description + * @author tanghan 2013-7-28 + */ + private void repairFormHead() { + <#list cghead as hd> + CgFormHeadEntity cgHead${hd.id} = new CgFormHeadEntity(); + cgHead${hd.id}.setTableName("${hd.tableName}"); + cgHead${hd.id}.setIsTree("${hd.isTree}"); + cgHead${hd.id}.setIsPagination("${hd.isPagination}"); + cgHead${hd.id}.setIsCheckbox("${hd.isCheckbox}"); + cgHead${hd.id}.setQuerymode("${hd.querymode}"); + cgHead${hd.id}.setIsDbSynch("N"); + cgHead${hd.id}.setContent("${hd.content}"); + cgHead${hd.id}.setCreateBy("admin"); + cgHead${hd.id}.setCreateDate(new Date()); + cgHead${hd.id}.setJsPlugIn("0"); + cgHead${hd.id}.setSqlPlugIn("0"); + cgHead${hd.id}.setCreateName("绠$悊鍛"); + cgHead${hd.id}.setJformVersion("${hd.jformVersion}"); + cgHead${hd.id}.setJformType(${hd.jformType}); + commonDao.saveOrUpdate(cgHead${hd.id}); + + + } + + /** + * @Description + * @author tanghan 2013-7-28 + */ + private void repairCkEditor() { + } + + + /** + * @Description + * @author tanghan 2013-7-28 + */ + private void repairLog() { + TSUser admin = commonDao.findByProperty(TSUser.class, "signatureFile", "images/renfang/qm/licf.gif").get(0); + try { + <#list log as ll> + TSLog log${ll.id} = new TSLog(); + log${ll.id}.setLogcontent("${ll.logcontent}"); + log${ll.id}.setBroswer("${ll.broswer}"); + log${ll.id}.setNote("${ll.note}"); + log${ll.id}.setTSUser(admin); + log${ll.id}.setOperatetime(DataUtils.parseTimestamp("${ll.operatetime}", "yyyy-MM-dd HH:mm")); + log${ll.id}.setOperatetype((short)${ll.operatetype}); + log${ll.id}.setLoglevel((short)${ll.loglevel}); + commonDao.saveOrUpdate(log${ll.id}); + + + } catch (ParseException e) { + e.printStackTrace(); + } + } + + /** + * @Description + * @author tanghan 2013-7-22 + */ + private void repairBaseUser() { + TSDepart eiu = commonDao.findByProperty(TSDepart.class, "departname", "淇℃伅閮").get(0); + TSDepart RAndD = commonDao.findByProperty(TSDepart.class, "departname", "淇℃伅閮").get(0); + <#list baseuser as bb> + TSBaseUser tsBaseUser${bb.id} = new TSBaseUser(); + tsBaseUser${bb.id}.setStatus((short)${bb.status}); + tsBaseUser${bb.id}.setRealName("${bb.realName}"); + tsBaseUser${bb.id}.setUserName("${bb.userName}"); + tsBaseUser${bb.id}.setPassword("${bb.password}"); + tsBaseUser${bb.id}.setTSDepart(eiu); + tsBaseUser${bb.id}.setActivitiSync((short)${bb.activitiSync}); + commonDao.saveOrUpdate(tsBaseUser${bb.id}); + + + } + + + /** + * @Description + * @author tanghan 2013-7-22 + */ + private void repairType() { + <#list type as t> + TSType type${t.id} = new TSType(); + type${t.id}.setTypename("${t.typename}"); + type${t.id}.setTypecode("${t.typecode}"); + commonDao.saveOrUpdate(type${t.id}); + + + } + + private void repairTypeAndGroup() { + <#list typegroup as p> + TSTypegroup tsTypegroup${p.id} = new TSTypegroup(); + tsTypegroup${p.id}.setTypegroupname("${p.typegroupname}"); + tsTypegroup${p.id}.setTypegroupcode("${p.typegroupcode}"); + commonDao.saveOrUpdate(tsTypegroup${p.id}); + + } + + /** + * @Description + * @author tanghan 2013-7-20 + */ + private void repairUser() { + <#list suser as pp> + TSUser suser${pp.id} = new TSUser(); + suser${pp.id}.setMobilePhone("${pp.mobilePhone}"); + suser${pp.id}.setOfficePhone("${pp.officePhone}"); + suser${pp.id}.setEmail("${pp.email}"); + commonDao.saveOrUpdate(suser${pp.id}); + + } + + /** + * @Description + * @author tanghan 2013-7-20 + */ + + private void repairRole() { + <#list role as p> + TSRole tsRole${p.id} = new TSRole(); + tsRole${p.id}.setRoleName("${p.roleName}"); + tsRole${p.id}.setRoleCode("${p.roleCode}"); + commonDao.saveOrUpdate(tsRole${p.id}); + + } + + + /** + * @Description + * @author tanghan 2013-7-20 + */ + private void repairDepart() { + <#list depart as po> + TSDepart tsDepart${po.id} = new TSDepart(); + tsDepart${po.id}.setDepartname("${po.departname}"); + tsDepart${po.id}.setDescription("${po.description}"); + commonDao.saveOrUpdate(tsDepart${po.id}); + + } + + + /** + * @Description + * @author tanghan 2013-7-20 + */ + + private void repareAttachment() { + <#list animals as being> + TSAttachment tsAttachment${being.id} = new TSAttachment(); + tsAttachment${being.id}.setAttachmenttitle("${being.attachmenttitle}"); + tsAttachment${being.id}.setRealpath("${being.realpath}"); + tsAttachment${being.id}.setSwfpath("${being.swfpath}"); + tsAttachment${being.id}.setExtend("${being.extend}"); + commonDao.saveOrUpdate(tsAttachment${being.id}); + + } + + + /** + * @Description + * @author tanghan 2013-7-19 + */ + private void repaireIcon() { + System.out.println("淇鍥炬爣涓"); + TSIcon back = new TSIcon(); + back.setIconName("杩斿洖"); + back.setIconType((short)1); + back.setIconPath("plug-in/accordion/images/back.png"); + back.setIconClas("back"); + back.setExtend("png"); + commonDao.saveOrUpdate(back); + + TSIcon pie = new TSIcon(); + + pie.setIconName("楗煎浘"); + pie.setIconType((short)1); + pie.setIconPath("plug-in/accordion/images/pie.png"); + pie.setIconClas("pie"); + pie.setExtend("png"); + commonDao.saveOrUpdate(pie); + + TSIcon pictures = new TSIcon(); + pictures.setIconName("鍥剧墖"); + pictures.setIconType((short)1); + pictures.setIconPath("plug-in/accordion/images/pictures.png"); + pictures.setIconClas("pictures"); + pictures.setExtend("png"); + commonDao.saveOrUpdate(pictures); + + TSIcon pencil = new TSIcon(); + pencil.setIconName("绗"); + pencil.setIconType((short)1); + pencil.setIconPath("plug-in/accordion/images/pencil.png"); + pencil.setIconClas("pencil"); + pencil.setExtend("png"); + commonDao.saveOrUpdate(pencil); + + TSIcon map = new TSIcon(); + map.setIconName("鍦板浘"); + map.setIconType((short)1); + map.setIconPath("plug-in/accordion/images/map.png"); + map.setIconClas("map"); + map.setExtend("png"); + commonDao.saveOrUpdate(map); + + TSIcon group_add = new TSIcon(); + group_add.setIconName("缁"); + group_add.setIconType((short)1); + group_add.setIconPath("plug-in/accordion/images/group_add.png"); + group_add.setIconClas("group_add"); + group_add.setExtend("png"); + commonDao.saveOrUpdate(group_add); + + TSIcon calculator = new TSIcon(); + calculator.setIconName("璁$畻鍣"); + calculator.setIconType((short)1); + calculator.setIconPath("plug-in/accordion/images/calculator.png"); + calculator.setIconClas("calculator"); + calculator.setExtend("png"); + commonDao.saveOrUpdate(calculator); + + TSIcon folder = new TSIcon(); + folder.setIconName("鏂囦欢澶"); + folder.setIconType((short)1); + folder.setIconPath("plug-in/accordion/images/folder.png"); + folder.setIconClas("folder"); + folder.setExtend("png"); + commonDao.saveOrUpdate(folder); + } + + /** + * @Description 淇鑿滃崟鏉冮檺 + * @author tanghan 2013-7-19 + */ + + private void repairMenu() { + <#list menu as mm> + TSFunction tsFunction${mm.id} = new TSFunction(); + tsFunction${mm.id}.setFunctionName("${mm.functionName}"); + tsFunction${mm.id}.setFunctionUrl("${mm.functionUrl}"); + tsFunction${mm.id}.setFunctionLevel((short)${mm.functionLevel}); + tsFunction${mm.id}.setFunctionOrder("${mm.functionOrder}"); + commonDao.saveOrUpdate(tsFunction${mm.id}); + + + } + + +} diff --git a/src/main/resources/CKfinderConfig.xml b/src/main/resources/CKfinderConfig.xml new file mode 100644 index 00000000..526aaa9b --- /dev/null +++ b/src/main/resources/CKfinderConfig.xml @@ -0,0 +1,169 @@ + + + + true + + + + + + + + 10000 + 10000 + 80 + + UTF-8 + + + + + %BASE_URL%files/ + %BASE_DIR%files + 0 + 7z,aiff,asf,avi,bmp,csv,doc,docx,fla,flv,gif,gz,gzip,jpeg,jpg,mid,mov,mp3,mp4,mpc,mpeg,mpg,ods,odt,pdf,png,ppt,pptx,pxd,qt,ram,rar,rm,rmi,rmvb,rtf,sdc,sitd,swf,sxc,sxw,tar,tgz,tif,tiff,txt,vsd,wav,wma,wmv,xls,xlsx,zip + + + + + %BASE_URL%images/ + %BASE_DIR%images + 0 + bmp,gif,jpeg,jpg,png + + + + %BASE_URL%flash/ + %BASE_DIR%flash + 0 + swf,flv + + + + + CKFinder_UserRole + + + admin + * + / + true + true + true + true + true + true + true + true + + + + true + %BASE_URL%_thumbs/ + %BASE_DIR%_thumbs + false + 100 + 100 + 80 + + + false + + true + + true + + true + + html,htm,xml,js + + false + + + .* + CVS + + + + .* + + + + imageresize + com.ckfinder.connector.plugins.ImageResize + + + + + + + + fileeditor + com.ckfinder.connector.plugins.FileEditor + + + + + + + + com.ckfinder.connector.configuration.ConfigurationPathBuilder + diff --git a/src/main/resources/dbconfig.properties b/src/main/resources/dbconfig.properties new file mode 100644 index 00000000..1bb60aa9 --- /dev/null +++ b/src/main/resources/dbconfig.properties @@ -0,0 +1,34 @@ +#SQLServer2005浠ヤ笂 +#hibernate.dialect=org.hibernate.dialect.SQLServerDialect +#validationQuery.sqlserver=SELECT 1 +#jdbc.url.jeecg=jdbc:sqlserver://192.168.0.199:1697;DatabaseName=jeecg +#jdbc.username.jeecg=sa +#jdbc.password.jeecg=SA +#jdbc.dbType=sqlserver + +#postgresSQL +#hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +#validationQuery.sqlserver=SELECT 1 +#jdbc.url.jeecg=jdbc:postgresql://localhost:5432/jeecg +#jdbc.username.jeecg=postgres +#jdbc.password.jeecg=postgres +#jdbc.dbType=postgres + +#MySQL +hibernate.dialect=org.hibernate.dialect.MySQLDialect +validationQuery.sqlserver=SELECT 1 +jdbc.url.jeecg=jdbc:mysql://localhost:3306/jeecg_gjh?useUnicode=true&characterEncoding=UTF-8 +jdbc.username.jeecg=root +jdbc.password.jeecg=root +jdbc.dbType=mysql + +#Oracle +#hibernate.dialect=org.hibernate.dialect.OracleDialect +#validationQuery.sqlserver=SELECT 1 FROM DUAL +#jdbc.url.jeecg=jdbc:oracle:thin:@60.208.13.44:1521:dhtest +#jdbc.username.jeecg=jeecg +#jdbc.password.jeecg=jeecg +#jdbc.dbType=oracle + +#鏇存柊|鍒涘缓|楠岃瘉鏁版嵁搴撹〃缁撴瀯|涓嶄綔鏀瑰彉 榛樿update(create,validate,none) +hibernate.hbm2ddl.auto=none diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml new file mode 100644 index 00000000..dfbc4471 --- /dev/null +++ b/src/main/resources/ehcache.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/jeecg/jeecg_config.properties b/src/main/resources/jeecg/jeecg_config.properties new file mode 100644 index 00000000..8bd4f01f --- /dev/null +++ b/src/main/resources/jeecg/jeecg_config.properties @@ -0,0 +1,30 @@ +#default code path +#source_root_package=src +#webroot_package=WebRoot + +#maven code path +source_root_package=src.main.java +webroot_package=src.main.webapp + +#bussi_package[User defined] +bussi_package=com.buss + + +#ftl resource url +templatepath=jeecg/template +system_encoding=utf-8 + +#Table key [User defined] +jeecg_generate_table_id=id +#Search Param num [User defined] +jeecg_ui_search_filed_num=1 + +#jeecg convert flag[true/false] +jeecg_filed_convert=true + + +#ui_filter_fields \u8fc7\u6ee4\u4e0d\u9700\u8981\u9875\u9762\u751f\u6210\u7684\u8868\u5b57\u6bb5 +ui_filter_fields=create_date,create_datetime,create_by,create_key,create_name,create_realname,create_departmentid,create_departmentname,update_date,update_datetime,update_by,update_key,update_name,update_realname,update_departmentid,update_departmentname +#\ +project_path=D:\\workspace-JEECGONE\\jeecg-framework + diff --git a/src/main/resources/jeecg/jeecg_database.properties b/src/main/resources/jeecg/jeecg_database.properties new file mode 100644 index 00000000..8aab6925 --- /dev/null +++ b/src/main/resources/jeecg/jeecg_database.properties @@ -0,0 +1,21 @@ +#mysql +diver_name=com.mysql.jdbc.Driver +url=jdbc:mysql://localhost:3306/jeecg_gjh?useUnicode=true&characterEncoding=UTF-8 +username=root +password=root +database_name=jeecg_gjh + +#oracle +#diver_name=oracle.jdbc.driver.OracleDriver +#url=jdbc:oracle:thin:@192.168.0.199:1521:jeecg +#username=jeecg +#password=jeecg +#database_name=jeecg + +#postgre +#diver_name=org.postgresql.Driver +#url=jdbc:postgresql://localhost:5432/jeecg +#username=postgres +#password=postgres +#database_name=jeecg + diff --git a/src/main/resources/jeecg/template/cgform_controllerTemplate.ftl b/src/main/resources/jeecg/template/cgform_controllerTemplate.ftl new file mode 100644 index 00000000..1c9f2010 --- /dev/null +++ b/src/main/resources/jeecg/template/cgform_controllerTemplate.ftl @@ -0,0 +1,382 @@ +<#if packageStyle == "service"> +package ${bussiPackage}.${entityPackage}.controller; +import ${bussiPackage}.${entityPackage}.entity.${entityName}Entity; +import ${bussiPackage}.${entityPackage}.service.${entityName}ServiceI; +<#else> +package ${bussiPackage}.controller.${entityPackage}; +import ${bussiPackage}.entity.${entityPackage}.${entityName}Entity; +import ${bussiPackage}.service.${entityPackage}.${entityName}ServiceI; + +import java.util.List; +import java.text.SimpleDateFormat; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import org.springframework.context.annotation.Scope; +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.util.MyBeanUtils; + +import java.io.OutputStream; +import org.jeecgframework.core.util.BrowserUtils; +import org.jeecgframework.poi.excel.ExcelExportUtil; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.entity.TemplateExportParams; +import org.jeecgframework.poi.excel.entity.vo.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.vo.TemplateExcelConstants; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.jeecgframework.core.util.ResourceUtil; +import java.io.IOException; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import java.util.Map; +import org.jeecgframework.core.util.ExceptionUtil; + + + +/** + * @Title: Controller + * @Description: ${ftl_description} + * @author onlineGenerator + * @date ${ftl_create_time} + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/${entityName?uncap_first}Controller") +public class ${entityName}Controller extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(${entityName}Controller.class); + + @Autowired + private ${entityName}ServiceI ${entityName?uncap_first}Service; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * ${ftl_description}鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "${entityName?uncap_first}") + public ModelAndView ${entityName?uncap_first}(HttpServletRequest request) { + return new ModelAndView("${bussiPackage?replace(".","/")}/${entityPackage}/${entityName?uncap_first}List"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(${entityName}Entity ${entityName?uncap_first},HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(${entityName}Entity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, ${entityName?uncap_first}, request.getParameterMap()); + try{ + //鑷畾涔夎拷鍔犳煡璇㈡潯浠 + <#list columns as po> + <#if po.isQuery =='Y' && po.queryMode =='group'> + String query_${po.fieldName}_begin = request.getParameter("${po.fieldName}_begin"); + String query_${po.fieldName}_end = request.getParameter("${po.fieldName}_end"); + if(StringUtil.isNotEmpty(query_${po.fieldName}_begin)){ + <#if po.type == "java.util.Date"> + cq.ge("${po.fieldName}", new SimpleDateFormat("yyyy-MM-dd").parse(query_${po.fieldName}_begin)); + <#else> + cq.ge("${po.fieldName}", Integer.parseInt(query_${po.fieldName}_begin)); + + } + if(StringUtil.isNotEmpty(query_${po.fieldName}_end)){ + <#if po.type == "java.util.Date"> + cq.le("${po.fieldName}", new SimpleDateFormat("yyyy-MM-dd").parse(query_${po.fieldName}_end)); + <#else> + cq.le("${po.fieldName}", Integer.parseInt(query_${po.fieldName}_end)); + + } + + + }catch (Exception e) { + throw new BusinessException(e.getMessage()); + } + cq.add(); + this.${entityName?uncap_first}Service.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎${ftl_description} + * + * @return + */ + @RequestMapping(params = "doDel") + @ResponseBody + public AjaxJson doDel(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + ${entityName?uncap_first} = systemService.getEntity(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + message = "${ftl_description}鍒犻櫎鎴愬姛"; + try{ + ${entityName?uncap_first}Service.delete(${entityName?uncap_first}); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "${ftl_description}鍒犻櫎澶辫触"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鎵归噺鍒犻櫎${ftl_description} + * + * @return + */ + @RequestMapping(params = "doBatchDel") + @ResponseBody + public AjaxJson doBatchDel(String ids,HttpServletRequest request){ + AjaxJson j = new AjaxJson(); + message = "${ftl_description}鍒犻櫎鎴愬姛"; + try{ + for(String id:ids.split(",")){ + ${entityName}Entity ${entityName?uncap_first} = systemService.getEntity(${entityName}Entity.class, + <#if cgformConfig.cgFormHead.jformPkType?if_exists?html == "UUID"> + id + <#elseif cgformConfig.cgFormHead.jformPkType?if_exists?html == "NATIVE"> + Integer.parseInt(id) + <#elseif cgformConfig.cgFormHead.jformPkType?if_exists?html == "SEQUENCE"> + Integer.parseInt(id) + <#else> + id + + ); + ${entityName?uncap_first}Service.delete(${entityName?uncap_first}); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + } + }catch(Exception e){ + e.printStackTrace(); + message = "${ftl_description}鍒犻櫎澶辫触"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞${ftl_description} + * + * @param ids + * @return + */ + @RequestMapping(params = "doAdd") + @ResponseBody + public AjaxJson doAdd(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + message = "${ftl_description}娣诲姞鎴愬姛"; + try{ + ${entityName?uncap_first}Service.save(${entityName?uncap_first}); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "${ftl_description}娣诲姞澶辫触"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鏇存柊${ftl_description} + * + * @param ids + * @return + */ + @RequestMapping(params = "doUpdate") + @ResponseBody + public AjaxJson doUpdate(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + message = "${ftl_description}鏇存柊鎴愬姛"; + ${entityName}Entity t = ${entityName?uncap_first}Service.get(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(${entityName?uncap_first}, t); + ${entityName?uncap_first}Service.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + message = "${ftl_description}鏇存柊澶辫触"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + <#list buttons as btn> + <#if btn.buttonStyle =='button' && btn.optType=='action'> + /** + * 鑷畾涔夋寜閽-sql澧炲己-${btn.buttonName} + * @param ids + * @return + */ + @RequestMapping(params = "do${btn.buttonCode?cap_first}") + @ResponseBody + public AjaxJson do${btn.buttonCode?cap_first}(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + message = "${btn.buttonName}鎴愬姛"; + ${entityName}Entity t = ${entityName?uncap_first}Service.get(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + try{ + ${entityName?uncap_first}Service.do${btn.buttonCode?cap_first}Sql(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "${btn.buttonName}澶辫触"; + } + j.setMsg(message); + return j; + } + + + + /** + * ${ftl_description}鏂板椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "goAdd") + public ModelAndView goAdd(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest req) { + if (StringUtil.isNotEmpty(${entityName?uncap_first}.getId())) { + ${entityName?uncap_first} = ${entityName?uncap_first}Service.getEntity(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + req.setAttribute("${entityName?uncap_first}Page", ${entityName?uncap_first}); + } + return new ModelAndView("${bussiPackage?replace(".","/")}/${entityPackage}/${entityName?uncap_first}-add"); + } + /** + * ${ftl_description}缂栬緫椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "goUpdate") + public ModelAndView goUpdate(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest req) { + if (StringUtil.isNotEmpty(${entityName?uncap_first}.getId())) { + ${entityName?uncap_first} = ${entityName?uncap_first}Service.getEntity(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + req.setAttribute("${entityName?uncap_first}Page", ${entityName?uncap_first}); + } + return new ModelAndView("${bussiPackage?replace(".","/")}/${entityPackage}/${entityName?uncap_first}-update"); + } + + /** + * 瀵煎叆鍔熻兘璺宠浆 + * + * @return + */ + @RequestMapping(params = "upload") + public ModelAndView upload(HttpServletRequest req) { + req.setAttribute("controller_name","${entityName?uncap_first}Controller"); + return new ModelAndView("common/upload/pub_excel_upload"); + } + + /** + * 瀵煎嚭excel + * + * @param request + * @param response + */ + @RequestMapping(params = "exportXls") + public String exportXls(${entityName}Entity ${entityName?uncap_first},HttpServletRequest request,HttpServletResponse response + , DataGrid dataGrid,ModelMap modelMap) { + CriteriaQuery cq = new CriteriaQuery(${entityName}Entity.class, dataGrid); + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, ${entityName?uncap_first}, request.getParameterMap()); + List<${entityName}Entity> ${entityName?uncap_first}s = this.${entityName?uncap_first}Service.getListByCriteriaQuery(cq,false); + modelMap.put(NormalExcelConstants.FILE_NAME,"${ftl_description}"); + modelMap.put(NormalExcelConstants.CLASS,${entityName}Entity.class); + modelMap.put(NormalExcelConstants.PARAMS,new ExportParams("${ftl_description}鍒楄〃", "瀵煎嚭浜:"+ResourceUtil.getSessionUserName().getRealName(), + "瀵煎嚭淇℃伅")); + modelMap.put(NormalExcelConstants.DATA_LIST,${entityName?uncap_first}s); + return NormalExcelConstants.JEECG_EXCEL_VIEW; + } + /** + * 瀵煎嚭excel 浣挎ā鏉 + * + * @param request + * @param response + */ + @RequestMapping(params = "exportXlsByT") + public String exportXlsByT(${entityName}Entity ${entityName?uncap_first},HttpServletRequest request,HttpServletResponse response + , DataGrid dataGrid,ModelMap modelMap) { + modelMap.put(TemplateExcelConstants.FILE_NAME, "${ftl_description}"); + modelMap.put(TemplateExcelConstants.PARAMS,new TemplateExportParams("Excel妯℃澘鍦板潃")); + modelMap.put(TemplateExcelConstants.MAP_DATA,null); + modelMap.put(TemplateExcelConstants.CLASS,${entityName}Entity.class); + modelMap.put(TemplateExcelConstants.LIST_DATA,null); + return TemplateExcelConstants.JEECG_TEMPLATE_EXCEL_VIEW; + } + + @SuppressWarnings("unchecked") + @RequestMapping(params = "importExcel", method = RequestMethod.POST) + @ResponseBody + public AjaxJson importExcel(HttpServletRequest request, HttpServletResponse response) { + AjaxJson j = new AjaxJson(); + + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 鑾峰彇涓婁紶鏂囦欢瀵硅薄 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<${entityName}Entity> list${entityName}Entitys = ExcelImportUtil.importExcel(file.getInputStream(),${entityName}Entity.class,params); + for (${entityName}Entity ${entityName?uncap_first} : list${entityName}Entitys) { + ${entityName?uncap_first}Service.save(${entityName?uncap_first}); + } + j.setMsg("鏂囦欢瀵煎叆鎴愬姛锛"); + } catch (Exception e) { + j.setMsg("鏂囦欢瀵煎叆澶辫触锛"); + logger.error(ExceptionUtil.getExceptionMessage(e)); + }finally{ + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return j; + } +} diff --git a/src/main/resources/jeecg/template/cgform_entityTemplate.ftl b/src/main/resources/jeecg/template/cgform_entityTemplate.ftl new file mode 100644 index 00000000..14e700ca --- /dev/null +++ b/src/main/resources/jeecg/template/cgform_entityTemplate.ftl @@ -0,0 +1,83 @@ +<#if packageStyle == "service"> +package ${bussiPackage}.${entityPackage}.entity; +<#else> +package ${bussiPackage}.entity.${entityPackage}; + + +import java.math.BigDecimal; +import java.util.Date; +import java.lang.String; +import java.lang.Double; +import java.lang.Integer; +import java.math.BigDecimal; +import javax.xml.soap.Text; +import java.sql.Blob; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Title: Entity + * @Description: ${ftl_description} + * @author onlineGenerator + * @date ${ftl_create_time} + * @version V1.0 + * + */ +@Entity +@Table(name = "${tableName}", schema = "") +<#if cgformConfig.cgFormHead.jformPkType?if_exists?html == "SEQUENCE"> +@SequenceGenerator(name="SEQ_GEN", sequenceName="${cgformConfig.cgFormHead.jformPkSequence}") + +@SuppressWarnings("serial") +public class ${entityName}Entity implements java.io.Serializable { + <#list columns as po> + /**${po.content}*/ + <#if po.isShow != 'N'> + @Excel(name="${po.content}") + + private ${po.type} ${po.fieldName}; + + + <#list columns as po> + /** + *鏂规硶: 鍙栧緱${po.type} + *@return: ${po.type} ${po.content} + */ + <#if po.fieldName == jeecg_table_id> + <#if cgformConfig.cgFormHead.jformPkType?if_exists?html == "UUID"> + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + <#elseif cgformConfig.cgFormHead.jformPkType?if_exists?html == "NATIVE"> + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + <#elseif cgformConfig.cgFormHead.jformPkType?if_exists?html == "SEQUENCE"> + @Id + @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_GEN") + <#else> + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + + + @Column(name ="${fieldMeta[po.fieldName]}",nullable=<#if po.isNull == 'Y'>true<#else>false<#if po.pointLength != 0>,scale=${po.pointLength}<#if po.length !=0>,length=${po.length?c}) + public ${po.type} get${po.fieldName?cap_first}(){ + return this.${po.fieldName}; + } + + /** + *鏂规硶: 璁剧疆${po.type} + *@param: ${po.type} ${po.content} + */ + public void set${po.fieldName?cap_first}(${po.type} ${po.fieldName}){ + this.${po.fieldName} = ${po.fieldName}; + } + +} diff --git a/src/main/resources/jeecg/template/cgform_jsEnhanceTemplate.ftl b/src/main/resources/jeecg/template/cgform_jsEnhanceTemplate.ftl new file mode 100644 index 00000000..86862b83 --- /dev/null +++ b/src/main/resources/jeecg/template/cgform_jsEnhanceTemplate.ftl @@ -0,0 +1,53 @@ +${cgformConfig.formJs.cgJsStr?if_exists} + +//閫氱敤寮瑰嚭寮忔枃浠朵笂浼 +function commonUpload(callback){ + $.dialog({ + content: "url:systemController.do?commonUpload", + lock : true, + title:"鏂囦欢涓婁紶", + zIndex:2100, + width:700, + height: 200, + parent:windowapi, + cache:false, + ok: function(){ + var iframe = this.iframe.contentWindow; + iframe.uploadCallback(callback); + return true; + }, + cancelVal: '鍏抽棴', + cancel: function(){ + } + }); +} +function browseImages(inputId, Img) {// 鍥剧墖绠$悊鍣紝鍙涓笂浼犲叡鐢 + var finder = new CKFinder(); + finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 + $("#" + Img).attr("src", fileUrl); + $("#" + inputId).attr("value", fileUrl); + }; + finder.resourceType = 'Images';// 鎸囧畾ckfinder鍙负鍥剧墖杩涜绠$悊 + finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID + finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃) + finder.defaultLanguage = 'zh-cn'; + finder.popup(); + } +function browseFiles(inputId, file) {// 鏂囦欢绠$悊鍣紝鍙涓笂浼犲叡鐢 + var finder = new CKFinder(); + finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 + $("#" + file).attr("href", fileUrl); + $("#" + inputId).attr("value", fileUrl); + decode(fileUrl, file); + }; + finder.resourceType = 'Files';// 鎸囧畾ckfinder鍙负鏂囦欢杩涜绠$悊 + finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID + finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃) + finder.defaultLanguage = 'zh-cn'; + finder.popup(); +} +function decode(value, id) {//value浼犲叆鍊,id鎺ュ彈鍊 + var last = value.lastIndexOf("/"); + var filename = value.substring(last + 1, value.length); + $("#" + id).text(decodeURIComponent(filename)); +} \ No newline at end of file diff --git a/src/main/resources/jeecg/template/cgform_jsListEnhanceTemplate.ftl b/src/main/resources/jeecg/template/cgform_jsListEnhanceTemplate.ftl new file mode 100644 index 00000000..9f6655e4 --- /dev/null +++ b/src/main/resources/jeecg/template/cgform_jsListEnhanceTemplate.ftl @@ -0,0 +1 @@ +${cgformConfig.listJs.cgJsStr?if_exists} \ No newline at end of file diff --git a/src/main/resources/jeecg/template/cgform_jspDivTemplate_add.ftl b/src/main/resources/jeecg/template/cgform_jspDivTemplate_add.ftl new file mode 100644 index 00000000..10beec98 --- /dev/null +++ b/src/main/resources/jeecg/template/cgform_jspDivTemplate_add.ftl @@ -0,0 +1,96 @@ +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + + ${ftl_description} + + + + + <#list columns as po> + <#if po.isShow == 'N'> + + + +
    + <#list columns as po> + <#if po.isShow == 'Y'> +
    + + <#if po.showType=='text'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + <#elseif po.showType=='popup'> + datatype="${po.fieldValidType?if_exists?html}" <#else><#if po.type == 'int'>datatype="n" <#elseif po.type=='double'>datatype="/^(-?\d+)(\.\d+)?$/" <#else><#if po.isNull != 'Y'>datatype="*" <#if po.dictTable?if_exists?html!=""> onclick="inputClick(this,'${po.dictField}','${po.dictTable}')"> + <#elseif po.showType=='textarea'> + + <#elseif po.showType=='password'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + <#elseif po.showType=='radio' || po.showType=='select' || po.showType=='checkbox' || po.showType=='list'> + dictTable="${po.dictTable?if_exists?html}" dictField="${po.dictField?if_exists?html}" dictText="${po.dictText?if_exists?html}"<#else>typeGroupCode="${po.dictField}" defaultVal="${'$'}{${entityName?uncap_first}Page.${po.fieldName}}" hasLabel="false" title="${po.content}"> + <#elseif po.showType=='date'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='datetime'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='file'> + + 鏆傛椂鏈笂浼犳枃浠 + + <#else> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + + +
    + <#if> + +
    +
    + + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/cgform_jspDivTemplate_update.ftl b/src/main/resources/jeecg/template/cgform_jspDivTemplate_update.ftl new file mode 100644 index 00000000..bf8fb2da --- /dev/null +++ b/src/main/resources/jeecg/template/cgform_jspDivTemplate_update.ftl @@ -0,0 +1,103 @@ +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + + ${ftl_description} + + + + + <#list columns as po> + <#if po.isShow == 'N'> + + + +
    + <#list columns as po> + <#if po.isShow == 'Y'> +
    + + <#if po.showType=='text'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value='${'$'}{${entityName?uncap_first}Page.${po.fieldName}}'> + <#elseif po.showType=='popup'> + datatype="${po.fieldValidType?if_exists?html}" <#else><#if po.type == 'int'>datatype="n" <#elseif po.type=='double'>datatype="/^(-?\d+)(\.\d+)?$/" <#else><#if po.isNull != 'Y'>datatype="*" <#if po.dictTable?if_exists?html!="">onclick="inputClick(this,'${po.dictField}','${po.dictTable}')" value='${'$'}{${entityName?uncap_first}Page.${po.fieldName}}'> + <#elseif po.showType=='textarea'> + + <#elseif po.showType=='password'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value='${'$'}{${entityName?uncap_first}Page.${po.fieldName}}'> + <#elseif po.showType=='radio' || po.showType=='select' || po.showType=='checkbox' || po.showType=='list'> + dictTable="${po.dictTable?if_exists?html}" dictField="${po.dictField?if_exists?html}" dictText="${po.dictText?if_exists?html}"<#else>typeGroupCode="${po.dictField}" defaultVal="${'$'}{${entityName?uncap_first}Page.${po.fieldName}}" hasLabel="false" title="${po.content}"> + <#elseif po.showType=='date'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value=''> + <#elseif po.showType=='datetime'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value=''> + <#elseif po.showType=='file'> + + + 鏆傛椂鏈笂浼犳枃浠 + + + 涓嬭浇 + + + <#else> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value='${'$'}{${entityName?uncap_first}Page.${po.fieldName}}'> + + +
    + <#if> + +
    +
    + + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/cgform_jspListTemplate.ftl b/src/main/resources/jeecg/template/cgform_jspListTemplate.ftl new file mode 100644 index 00000000..9e7bf4fa --- /dev/null +++ b/src/main/resources/jeecg/template/cgform_jspListTemplate.ftl @@ -0,0 +1,71 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + +
    +
    + + <#list columns as po> + formatter="yyyy-MM-dd hh:mm:ss"<#else><#if po.showType?index_of("date")!=-1>formatter="yyyy-MM-dd" <#if po.isShowList?if_exists?html =='N'>hidden="true"<#else> <#if po.isQuery =='Y'>query="true" <#if po.queryMode =='single'>queryMode="single"<#elseif po.queryMode =='group'>queryMode="group" <#if po.dictTable?if_exists?html!="">dictionary="${po.dictTable},${po.dictField},${po.dictText}" <#if po.showType=='popup'>popup="true"<#else><#if po.dictTable?if_exists?html=="" && po.dictField?if_exists?html!="">dictionary="${po.dictField}" width="${po.fieldLength}"> + + + + + + + + + + + <#list buttons as btn> + <#if btn.buttonStyle =='button' && btn.buttonStatus == '1'> + url="${entityName?uncap_first}Controller.do?do${btn.buttonCode?cap_first}" funname="do${btn.buttonCode?cap_first}"<#else> funname="${btn.buttonCode}" > + + + +
    +
    + + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/cgform_jspTableTemplate_add.ftl b/src/main/resources/jeecg/template/cgform_jspTableTemplate_add.ftl new file mode 100644 index 00000000..998f6986 --- /dev/null +++ b/src/main/resources/jeecg/template/cgform_jspTableTemplate_add.ftl @@ -0,0 +1,143 @@ +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + + ${ftl_description} + + + + + + + + <#list columns as po> + <#if po.isShow == 'N'> + + + + + <#list pageColumns as po> + <#if (pageColumns?size>10)> + <#if po_index%2==0> + + + <#else> + + + + + <#if (columns?size>10)> + <#if (po_index%2==0)&&(!po_has_next)> + + + + <#if (po_index%2!=0)||(!po_has_next)> + + + <#else> + + + +
    + + + <#if po.showType=='text'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + <#elseif po.showType=='popup'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + <#if po.dictTable?if_exists?html!=""> onclick="inputClick(this,'${po.dictField}','${po.dictTable}')"> + <#elseif po.showType=='textarea'> + + <#elseif po.showType=='password'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + + > + <#elseif po.showType=='radio' || po.showType=='select' || po.showType=='checkbox' || po.showType=='list'> + dictTable="${po.dictTable?if_exists?html}" dictField="${po.dictField?if_exists?html}" dictText="${po.dictText?if_exists?html}"<#else>typeGroupCode="${po.dictField}" defaultVal="${'$'}{${entityName?uncap_first}Page.${po.fieldName}}" hasLabel="false" title="${po.content}"> + <#elseif po.showType=='date'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='datetime'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='file'> + + 鏆傛椂鏈笂浼犳枃浠 + + + <#else> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + + + + + + +
    +
    + + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/cgform_jspTableTemplate_update.ftl b/src/main/resources/jeecg/template/cgform_jspTableTemplate_update.ftl new file mode 100644 index 00000000..674e9696 --- /dev/null +++ b/src/main/resources/jeecg/template/cgform_jspTableTemplate_update.ftl @@ -0,0 +1,150 @@ +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + + ${ftl_description} + + + + + + + + <#list columns as po> + <#if po.isShow == 'N'> + + + + + <#list pageColumns as po> + <#if (pageColumns?size>10)> + <#if po_index%2==0> + + + <#else> + + + + + <#if (columns?size>10)> + <#if (po_index%2==0)&&(!po_has_next)> + + + + <#if (po_index%2!=0)||(!po_has_next)> + + + <#else> + + + +
    + + + <#if po.showType=='text'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + + value='${'$'}{${entityName?uncap_first}Page.${po.fieldName}}'> + <#elseif po.showType=='popup'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + <#if po.dictTable?if_exists?html!=""> onclick="inputClick(this,'${po.dictField}','${po.dictTable}')" value='${'$'}{${entityName?uncap_first}Page.${po.fieldName}}'> + <#elseif po.showType=='textarea'> + + <#elseif po.showType=='password'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value='${'$'}{${entityName?uncap_first}Page.${po.fieldName}}'> + <#elseif po.showType=='radio' || po.showType=='select' || po.showType=='checkbox' || po.showType=='list'> + dictTable="${po.dictTable?if_exists?html}" dictField="${po.dictField?if_exists?html}" dictText="${po.dictText?if_exists?html}"<#else>typeGroupCode="${po.dictField}" defaultVal="${'$'}{${entityName?uncap_first}Page.${po.fieldName}}" hasLabel="false" title="${po.content}"> + <#elseif po.showType=='date'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value=''> + <#elseif po.showType=='datetime'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value=''> + <#elseif po.showType=='file'> + + + 鏆傛椂鏈笂浼犳枃浠 + + + 涓嬭浇 + + + + <#else> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value='${'$'}{${entityName?uncap_first}Page.${po.fieldName}}'> + + + + + + +
    +
    + + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/cgform_jspTemplateUpload.jsp.ftl b/src/main/resources/jeecg/template/cgform_jspTemplateUpload.jsp.ftl new file mode 100644 index 00000000..ea0c88d8 --- /dev/null +++ b/src/main/resources/jeecg/template/cgform_jspTemplateUpload.jsp.ftl @@ -0,0 +1,17 @@ +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + +Excel瀵煎叆 + + + + +
    +
    +
    +
    +
    + + diff --git a/src/main/resources/jeecg/template/cgform_serviceITemplate.ftl b/src/main/resources/jeecg/template/cgform_serviceITemplate.ftl new file mode 100644 index 00000000..1a56b269 --- /dev/null +++ b/src/main/resources/jeecg/template/cgform_serviceITemplate.ftl @@ -0,0 +1,48 @@ +<#if packageStyle == "service"> +package ${bussiPackage}.${entityPackage}.service; +import ${bussiPackage}.${entityPackage}.entity.${entityName}Entity; +<#else> +package ${bussiPackage}.service.${entityPackage}; +import ${bussiPackage}.entity.${entityPackage}.${entityName}Entity; + +import org.jeecgframework.core.common.service.CommonService; + +import java.io.Serializable; + +public interface ${entityName}ServiceI extends CommonService{ + + public void delete(T entity); + + public Serializable save(T entity); + + public void saveOrUpdate(T entity); + + <#list buttons as btn> + <#if btn.buttonStyle =='button' && btn.optType=='action'> + /** + * 鑷畾涔夋寜閽-sql澧炲己-${btn.buttonName} + * @param id + * @return + */ + public boolean do${btn.buttonCode?cap_first}Sql(${entityName}Entity t); + + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(${entityName}Entity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(${entityName}Entity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(${entityName}Entity t); +} diff --git a/src/main/resources/jeecg/template/cgform_serviceImplTemplate.ftl b/src/main/resources/jeecg/template/cgform_serviceImplTemplate.ftl new file mode 100644 index 00000000..71a9b050 --- /dev/null +++ b/src/main/resources/jeecg/template/cgform_serviceImplTemplate.ftl @@ -0,0 +1,110 @@ +<#if packageStyle == "service"> +package ${bussiPackage}.${entityPackage}.service.impl; +import ${bussiPackage}.${entityPackage}.service.${entityName}ServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import ${bussiPackage}.${entityPackage}.entity.${entityName}Entity; +<#else> +package ${bussiPackage}.service.impl.${entityPackage}; +import ${bussiPackage}.service.${entityPackage}.${entityName}ServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import ${bussiPackage}.entity.${entityPackage}.${entityName}Entity; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.UUID; +import java.io.Serializable; + +@Service("${entityName?uncap_first}Service") +@Transactional +public class ${entityName}ServiceImpl extends CommonServiceImpl implements ${entityName}ServiceI { + + + public void delete(T entity) { + super.delete(entity); + //鎵ц鍒犻櫎鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doDelSql((${entityName}Entity)entity); + } + + public Serializable save(T entity) { + Serializable t = super.save(entity); + //鎵ц鏂板鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doAddSql((${entityName}Entity)entity); + return t; + } + + public void saveOrUpdate(T entity) { + super.saveOrUpdate(entity); + //鎵ц鏇存柊鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doUpdateSql((${entityName}Entity)entity); + } + <#list buttons as btn> + <#if btn.buttonStyle =='button' && btn.optType=='action'> + /** + * 鑷畾涔夋寜閽-sql澧炲己-${btn.buttonName} + * @param id + * @return + */ + public boolean do${btn.buttonCode?cap_first}Sql(${entityName}Entity t){ + <#list buttonSqlMap[btn.buttonCode] as sql> + //sql澧炲己绗${sql_index+1}鏉 + String sqlEnhance_${sql_index+1} ="${sql}"; + this.executeSql(replaceVal(sqlEnhance_${sql_index+1},t)); + + return true; + } + + + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(${entityName}Entity t){ + <#list buttonSqlMap['add'] as sql> + //sql澧炲己绗${sql_index+1}鏉 + String sqlEnhance_${sql_index+1} ="${sql}"; + this.executeSql(replaceVal(sqlEnhance_${sql_index+1},t)); + + return true; + } + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(${entityName}Entity t){ + <#list buttonSqlMap['update'] as sql> + //sql澧炲己绗${sql_index+1}鏉 + String sqlEnhance_${sql_index+1} ="${sql}"; + this.executeSql(replaceVal(sqlEnhance_${sql_index+1},t)); + + return true; + } + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(${entityName}Entity t){ + <#list buttonSqlMap['delete'] as sql> + //sql澧炲己绗${sql_index+1}鏉 + String sqlEnhance_${sql_index+1} ="${sql}"; + this.executeSql(replaceVal(sqlEnhance_${sql_index+1},t)); + + return true; + } + + /** + * 鏇挎崲sql涓殑鍙橀噺 + * @param sql + * @return + */ + public String replaceVal(String sql,${entityName}Entity t){ + <#list columns as po> + sql = sql.replace("${'#'}{${fieldMeta[po.fieldName]?lower_case}}",String.valueOf(t.get${po.fieldName?cap_first}())); + + sql = sql.replace("${'#'}{UUID}",UUID.randomUUID().toString()); + return sql; + } +} \ No newline at end of file diff --git a/src/main/resources/jeecg/template/controllerTemplate.ftl b/src/main/resources/jeecg/template/controllerTemplate.ftl new file mode 100644 index 00000000..48fd0ca0 --- /dev/null +++ b/src/main/resources/jeecg/template/controllerTemplate.ftl @@ -0,0 +1,151 @@ +package ${bussiPackage}.controller.${entityPackage}; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.util.MyBeanUtils; + +import ${bussiPackage}.entity.${entityPackage}.${entityName}Entity; +import ${bussiPackage}.service.${entityPackage}.${entityName}ServiceI; + +/** + * @Title: Controller + * @Description: ${ftl_description} + * @author zhangdaihao + * @date ${ftl_create_time} + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/${entityName?uncap_first}Controller") +public class ${entityName}Controller extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(${entityName}Controller.class); + + @Autowired + private ${entityName}ServiceI ${entityName?uncap_first}Service; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * ${ftl_description}鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "${entityName?uncap_first}") + public ModelAndView ${entityName?uncap_first}(HttpServletRequest request) { + return new ModelAndView("${bussiPackage?replace(".","/")}/${entityPackage}/${entityName?uncap_first}List"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(${entityName}Entity ${entityName?uncap_first},HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(${entityName}Entity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, ${entityName?uncap_first}, request.getParameterMap()); + this.${entityName?uncap_first}Service.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎${ftl_description} + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + ${entityName?uncap_first} = systemService.getEntity(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + message = "${ftl_description}鍒犻櫎鎴愬姛"; + ${entityName?uncap_first}Service.delete(${entityName?uncap_first}); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞${ftl_description} + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(${entityName?uncap_first}.getId())) { + message = "${ftl_description}鏇存柊鎴愬姛"; + ${entityName}Entity t = ${entityName?uncap_first}Service.get(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + try { + MyBeanUtils.copyBeanNotNull2Bean(${entityName?uncap_first}, t); + ${entityName?uncap_first}Service.saveOrUpdate(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } catch (Exception e) { + e.printStackTrace(); + message = "${ftl_description}鏇存柊澶辫触"; + } + } else { + message = "${ftl_description}娣诲姞鎴愬姛"; + ${entityName?uncap_first}Service.save(${entityName?uncap_first}); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + + /** + * ${ftl_description}鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest req) { + if (StringUtil.isNotEmpty(${entityName?uncap_first}.getId())) { + ${entityName?uncap_first} = ${entityName?uncap_first}Service.getEntity(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + req.setAttribute("${entityName?uncap_first}Page", ${entityName?uncap_first}); + } + return new ModelAndView("${bussiPackage?replace(".","/")}/${entityPackage}/${entityName?uncap_first}"); + } +} diff --git a/src/main/resources/jeecg/template/entityTemplate.ftl b/src/main/resources/jeecg/template/entityTemplate.ftl new file mode 100644 index 00000000..b03c5370 --- /dev/null +++ b/src/main/resources/jeecg/template/entityTemplate.ftl @@ -0,0 +1,72 @@ +package ${bussiPackage}.entity.${entityPackage}; + +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; + +/** + * @Title: Entity + * @Description: ${ftl_description} + * @author zhangdaihao + * @date ${ftl_create_time} + * @version V1.0 + * + */ +@Entity +@Table(name = "${tableName}", schema = "") +@DynamicUpdate(true) +@DynamicInsert(true) +@SuppressWarnings("serial") +public class ${entityName}Entity implements java.io.Serializable { + <#list originalColumns as po> + /**${po.filedComment}*/ + private ${po.fieldType} ${po.fieldName}; + + + <#list originalColumns as po> + /** + *鏂规硶: 鍙栧緱${po.fieldType} + *@return: ${po.fieldType} ${po.filedComment} + */ + <#if po.fieldName == jeecg_table_id> + + <#if jeecg_primary_key_policy == 'uuid'> + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + + <#if jeecg_primary_key_policy == 'identity'> + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + + <#if jeecg_primary_key_policy == 'sequence'> + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="sequence") + @SequenceGenerator(name="sequence",sequenceName="${jeecg_sequence_code}",allocationSize=1) + + + @Column(name ="${po.fieldDbName}",nullable=<#if po.nullable == 'Y'>true<#else>false<#if po.precision != ''>,precision=${po.precision}<#if po.scale != ''>,scale=${po.scale}<#if po.charmaxLength != ''>,length=${po.charmaxLength}) + public ${po.fieldType} get${po.fieldName?cap_first}(){ + return this.${po.fieldName}; + } + + /** + *鏂规硶: 璁剧疆${po.fieldType} + *@param: ${po.fieldType} ${po.filedComment} + */ + public void set${po.fieldName?cap_first}(${po.fieldType} ${po.fieldName}){ + this.${po.fieldName} = ${po.fieldName}; + } + +} diff --git a/src/main/resources/jeecg/template/jspDivTemplate.ftl b/src/main/resources/jeecg/template/jspDivTemplate.ftl new file mode 100644 index 00000000..6ca4654f --- /dev/null +++ b/src/main/resources/jeecg/template/jspDivTemplate.ftl @@ -0,0 +1,23 @@ +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + + ${ftl_description} + + + + + +
    + <#list columns as po> +
    + + class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px"<#elseif po.classType=='easyui-datebox'>class="Wdate" onClick="WdatePicker()" style="width: 150px"<#else>class="${po.classType}" id="${po.fieldName}" name="${po.fieldName}" <#if po.nullable == 'Y'>ignore="ignore" + <#if po.fieldType?index_of("time")!=-1> value=""<#else><#if po.fieldType?index_of("date")!=-1>value=""<#else>value="${'$'}{${entityName?uncap_first}Page.${po.fieldName}}"<#if po.optionType?trim?length !=0> datatype="${po.optionType}"> + +
    + +
    +
    + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/jspListTemplate.ftl b/src/main/resources/jeecg/template/jspListTemplate.ftl new file mode 100644 index 00000000..e4925727 --- /dev/null +++ b/src/main/resources/jeecg/template/jspListTemplate.ftl @@ -0,0 +1,18 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + +
    +
    + + + <#list columns as po> + formatter="yyyy-MM-dd hh:mm:ss"<#else><#if po.fieldType?index_of("date")!=-1>formatter="yyyy-MM-dd" width="120"> + + + + + + + +
    +
    \ No newline at end of file diff --git a/src/main/resources/jeecg/template/jspTableTemplate.ftl b/src/main/resources/jeecg/template/jspTableTemplate.ftl new file mode 100644 index 00000000..1df67d15 --- /dev/null +++ b/src/main/resources/jeecg/template/jspTableTemplate.ftl @@ -0,0 +1,29 @@ +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + + ${ftl_description} + + + + + + + <#list columns as po> + + + + + +
    + + + class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px"<#elseif po.classType=='easyui-datebox'>class="Wdate" onClick="WdatePicker()" style="width: 150px"<#else>class="${po.classType}" id="${po.fieldName}" name="${po.fieldName}" <#if po.nullable == 'Y'>ignore="ignore" + <#if po.fieldType?index_of("time")!=-1> value=""<#else><#if po.fieldType?index_of("date")!=-1>value=""<#else>value="${'$'}{${entityName?uncap_first}Page.${po.fieldName}}"<#if po.optionType?trim?length !=0> datatype="${po.optionType}"> + +
    +
    + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/cgform_controllerTemplate.ftl b/src/main/resources/jeecg/template/onetomany/cgform_controllerTemplate.ftl new file mode 100644 index 00000000..bee6df0d --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_controllerTemplate.ftl @@ -0,0 +1,315 @@ +<#if packageStyle == "service"> +package ${bussiPackage}.${entityPackage}.controller; +import ${bussiPackage}.${entityPackage}.entity.${entityName}Entity; +import ${bussiPackage}.${entityPackage}.service.${entityName}ServiceI; +import ${bussiPackage}.${entityPackage}.page.${entityName}Page; +<#list subTab as sub> +import ${bussiPackage}.${sub.entityPackage}.entity.${sub.entityName}Entity; + +<#else> +package ${bussiPackage}.controller.${entityPackage}; +import ${bussiPackage}.entity.${entityPackage}.${entityName}Entity; +import ${bussiPackage}.service.${entityPackage}.${entityName}ServiceI; +import ${bussiPackage}.page.${entityPackage}.${entityName}Page; +<#list subTab as sub> +import ${bussiPackage}.entity.${sub.entityPackage}.${sub.entityName}Entity; + + +import java.util.List; +import java.text.SimpleDateFormat; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.context.annotation.Scope; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.util.MyBeanUtils; + + +/** + * @Title: Controller + * @Description: ${ftl_description} + * @author onlineGenerator + * @date ${ftl_create_time} + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/${entityName?uncap_first}Controller") +public class ${entityName}Controller extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(${entityName}Controller.class); + + @Autowired + private ${entityName}ServiceI ${entityName?uncap_first}Service; + @Autowired + private SystemService systemService; + + + /** + * ${ftl_description}鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "${entityName?uncap_first}") + public ModelAndView ${entityName?uncap_first}(HttpServletRequest request) { + return new ModelAndView("${bussiPackage?replace(".","/")}/${entityPackage}/${entityName?uncap_first}List"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(${entityName}Entity ${entityName?uncap_first},HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(${entityName}Entity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, ${entityName?uncap_first}); + try{ + //鑷畾涔夎拷鍔犳煡璇㈡潯浠 + <#list columns as po> + <#if po.isQuery =='Y' && po.queryMode =='group'> + String query_${po.fieldName}_begin = request.getParameter("${po.fieldName}_begin"); + String query_${po.fieldName}_end = request.getParameter("${po.fieldName}_end"); + if(StringUtil.isNotEmpty(query_${po.fieldName}_begin)){ + <#if po.type == "java.util.Date"> + cq.ge("${po.fieldName}", new SimpleDateFormat("yyyy-MM-dd").parse(query_${po.fieldName}_begin)); + <#else> + cq.ge("${po.fieldName}", Integer.parseInt(query_${po.fieldName}_begin)); + + } + if(StringUtil.isNotEmpty(query_${po.fieldName}_end)){ + <#if po.type == "java.util.Date"> + cq.le("${po.fieldName}", new SimpleDateFormat("yyyy-MM-dd").parse(query_${po.fieldName}_end)); + <#else> + cq.le("${po.fieldName}", Integer.parseInt(query_${po.fieldName}_end)); + + } + + + }catch (Exception e) { + throw new BusinessException(e.getMessage()); + } + cq.add(); + this.${entityName?uncap_first}Service.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎${ftl_description} + * + * @return + */ + @RequestMapping(params = "doDel") + @ResponseBody + public AjaxJson doDel(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + ${entityName?uncap_first} = systemService.getEntity(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + String message = "${ftl_description}鍒犻櫎鎴愬姛"; + try{ + ${entityName?uncap_first}Service.delMain(${entityName?uncap_first}); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "${ftl_description}鍒犻櫎澶辫触"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 鎵归噺鍒犻櫎${ftl_description} + * + * @return + */ + @RequestMapping(params = "doBatchDel") + @ResponseBody + public AjaxJson doBatchDel(String ids,HttpServletRequest request){ + AjaxJson j = new AjaxJson(); + String message = "${ftl_description}鍒犻櫎鎴愬姛"; + try{ + for(String id:ids.split(",")){ + ${entityName}Entity ${entityName?uncap_first} = systemService.getEntity(${entityName}Entity.class, + <#if cgformConfig.cgFormHead.jformPkType?if_exists?html == "UUID"> + id + <#elseif cgformConfig.cgFormHead.jformPkType?if_exists?html == "NATIVE"> + Integer.parseInt(id) + <#elseif cgformConfig.cgFormHead.jformPkType?if_exists?html == "SEQUENCE"> + Integer.parseInt(id) + <#else> + id + + ); + ${entityName?uncap_first}Service.delMain(${entityName?uncap_first}); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + } + }catch(Exception e){ + e.printStackTrace(); + message = "${ftl_description}鍒犻櫎澶辫触"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * 娣诲姞${ftl_description} + * + * @param ids + * @return + */ + @RequestMapping(params = "doAdd") + @ResponseBody + public AjaxJson doAdd(${entityName}Entity ${entityName?uncap_first},${entityName}Page ${entityName?uncap_first}Page, HttpServletRequest request) { + <#list subTab as sub> + List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List = ${entityName?uncap_first}Page.get${sub.entityName}List(); + + AjaxJson j = new AjaxJson(); + String message = "娣诲姞鎴愬姛"; + try{ + ${entityName?uncap_first}Service.addMain(${entityName?uncap_first}, <#list subTab as sub>${sub.entityName?uncap_first}List<#if sub_has_next>,); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "${ftl_description}娣诲姞澶辫触"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + /** + * 鏇存柊${ftl_description} + * + * @param ids + * @return + */ + @RequestMapping(params = "doUpdate") + @ResponseBody + public AjaxJson doUpdate(${entityName}Entity ${entityName?uncap_first},${entityName}Page ${entityName?uncap_first}Page, HttpServletRequest request) { + <#list subTab as sub> + List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List = ${entityName?uncap_first}Page.get${sub.entityName}List(); + + AjaxJson j = new AjaxJson(); + String message = "鏇存柊鎴愬姛"; + try{ + ${entityName?uncap_first}Service.updateMain(${entityName?uncap_first}, <#list subTab as sub>${sub.entityName?uncap_first}List<#if sub_has_next>,); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "鏇存柊${ftl_description}澶辫触"; + throw new BusinessException(e.getMessage()); + } + j.setMsg(message); + return j; + } + + /** + * ${ftl_description}鏂板椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "goAdd") + public ModelAndView goAdd(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest req) { + if (StringUtil.isNotEmpty(${entityName?uncap_first}.getId())) { + ${entityName?uncap_first} = ${entityName?uncap_first}Service.getEntity(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + req.setAttribute("${entityName?uncap_first}Page", ${entityName?uncap_first}); + } + return new ModelAndView("${bussiPackage?replace(".","/")}/${entityPackage}/${entityName?uncap_first}-add"); + } + + /** + * ${ftl_description}缂栬緫椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "goUpdate") + public ModelAndView goUpdate(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest req) { + if (StringUtil.isNotEmpty(${entityName?uncap_first}.getId())) { + ${entityName?uncap_first} = ${entityName?uncap_first}Service.getEntity(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + req.setAttribute("${entityName?uncap_first}Page", ${entityName?uncap_first}); + } + return new ModelAndView("${bussiPackage?replace(".","/")}/${entityPackage}/${entityName?uncap_first}-update"); + } + + + <#list subTab as sub> + /** + * 鍔犺浇鏄庣粏鍒楄〃[${sub.ftlDescription}] + * + * @return + */ + @RequestMapping(params = "${sub.entityName?uncap_first}List") + public ModelAndView ${sub.entityName?uncap_first}List(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest req) { + + //=================================================================================== + //鑾峰彇鍙傛暟 + <#list sub.foreignKeys as key> + <#if key?lower_case?index_of("${jeecg_table_id}")!=-1> + Object ${jeecg_table_id}${sub_index} = ${entityName?uncap_first}.get${jeecg_table_id?cap_first}(); + <#else> + Object ${key?uncap_first}${sub_index} = ${entityName?uncap_first}.get${key}(); + + + //=================================================================================== + //鏌ヨ-${sub.ftlDescription} + String hql${sub_index} = "from ${sub.entityName}Entity where 1 = 1<#list sub.foreignKeys as key> AND ${key?uncap_first} = ? "; + try{ + List<${sub.entityName}Entity> ${sub.entityName?uncap_first}EntityList = systemService.findHql(hql${sub_index},<#list sub.foreignKeys as key><#if key?lower_case?index_of("${jeecg_table_id}")!=-1>${jeecg_table_id}${sub_index}<#else>${key?uncap_first}${sub_index}<#if key_has_next>,); + req.setAttribute("${sub.entityName?uncap_first}List", ${sub.entityName?uncap_first}EntityList); + }catch(Exception e){ + logger.info(e.getMessage()); + } + return new ModelAndView("${bussiPackage?replace(".","/")}/${sub.entityPackage}/${sub.entityName?uncap_first}List"); + } + + + <#list buttons as btn> + <#if btn.buttonStyle =='button' && btn.optType=='action'> + /** + * 鑷畾涔夋寜閽-sql澧炲己-${btn.buttonName} + * @param ids + * @return + */ + @RequestMapping(params = "do${btn.buttonCode?cap_first}") + @ResponseBody + public AjaxJson do${btn.buttonCode?cap_first}(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + message = "${btn.buttonName}鎴愬姛"; + ${entityName}Entity t = ${entityName?uncap_first}Service.get(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + try{ + ${entityName?uncap_first}Service.do${btn.buttonCode?cap_first}Sql(t); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + }catch(Exception e){ + e.printStackTrace(); + message = "${btn.buttonName}澶辫触"; + } + j.setMsg(message); + return j; + } + + +} diff --git a/src/main/resources/jeecg/template/onetomany/cgform_entityTemplate.ftl b/src/main/resources/jeecg/template/onetomany/cgform_entityTemplate.ftl new file mode 100644 index 00000000..2a5866c8 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_entityTemplate.ftl @@ -0,0 +1,101 @@ +<#if packageStyle == "service"> +package ${bussiPackage}.${entityPackage}.entity; +<#else> +package ${bussiPackage}.entity.${entityPackage}; + +import java.math.BigDecimal; +import java.util.Date; +import java.lang.String; +import java.lang.Double; +import java.lang.Integer; +import java.math.BigDecimal; +import javax.xml.soap.Text; +import java.sql.Blob; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; + +/** + * @Title: Entity + * @Description: ${ftl_description} + * @author onlineGenerator + * @date ${ftl_create_time} + * @version V1.0 + * + */ +@Entity +@Table(name = "${tableName}", schema = "") +<#if cgformConfig.cgFormHead.jformPkType?if_exists?html == "SEQUENCE"> +@SequenceGenerator(name="SEQ_GEN", sequenceName="${cgformConfig.cgFormHead.jformPkSequence}") + +@SuppressWarnings("serial") +public class ${entityName}Entity implements java.io.Serializable { + <#list columns as po> + /**${po.content}*/ + <#if po.type == "javax.xml.soap.Text"> + private java.lang.String ${po.fieldName}; + + <#if po.type != "javax.xml.soap.Text"> + private ${po.type} ${po.fieldName}; + + + + <#list columns as po> + /** + *鏂规硶: 鍙栧緱${po.type} + *@return: ${po.type} ${po.content} + */ + <#if po.fieldName == jeecg_table_id> + <#if cgformConfig.cgFormHead.jformPkType?if_exists?html == "UUID"> + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + <#elseif cgformConfig.cgFormHead.jformPkType?if_exists?html == "NATIVE"> + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + <#elseif cgformConfig.cgFormHead.jformPkType?if_exists?html == "SEQUENCE"> + @Id + @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_GEN") + <#else> + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + + + + <#if po.type == "javax.xml.soap.Text"> + @Column(name ="${fieldMeta[po.fieldName]}",nullable=<#if po.isNull == 'Y'>true<#else>false<#if po.pointLength != 0>,scale=${po.pointLength},length=1000) + public java.lang.String get${po.fieldName?cap_first}(){ + return this.${po.fieldName}; + } + + /** + *鏂规硶: 璁剧疆java.lang.String + *@param: java.lang.String ${po.content} + */ + public void set${po.fieldName?cap_first}(java.lang.String ${po.fieldName}){ + this.${po.fieldName} = ${po.fieldName}; + } + + <#if po.type != "javax.xml.soap.Text"> + @Column(name ="${fieldMeta[po.fieldName]}",nullable=<#if po.isNull == 'Y'>true<#else>false<#if po.pointLength != 0>,scale=${po.pointLength}<#if po.length !=0>,length=${po.length?c}) + public ${po.type} get${po.fieldName?cap_first}(){ + return this.${po.fieldName}; + } + + /** + *鏂规硶: 璁剧疆${po.type} + *@param: ${po.type} ${po.content} + */ + public void set${po.fieldName?cap_first}(${po.type} ${po.fieldName}){ + this.${po.fieldName} = ${po.fieldName}; + } + + + +} diff --git a/src/main/resources/jeecg/template/onetomany/cgform_jsEnhanceTemplate.ftl b/src/main/resources/jeecg/template/onetomany/cgform_jsEnhanceTemplate.ftl new file mode 100644 index 00000000..114ef241 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_jsEnhanceTemplate.ftl @@ -0,0 +1,94 @@ +${cgformConfig.formJs.cgJsStr?if_exists} + +//鍒濆鍖栦笅鏍 +function resetTrNum(tableId) { + $tbody = $("#"+tableId+""); + $tbody.find('>tr').each(function(i){ + $(':input, select,button,a', this).each(function(){ + var $this = $(this), name = $this.attr('name'),id=$this.attr('id'),onclick_str=$this.attr('onclick'), val = $this.val(); + if(name!=null){ + if (name.indexOf("#index#") >= 0){ + $this.attr("name",name.replace('#index#',i)); + }else{ + var s = name.indexOf("["); + var e = name.indexOf("]"); + var new_name = name.substring(s+1,e); + $this.attr("name",name.replace(new_name,i)); + } + } + if(id!=null){ + if (id.indexOf("#index#") >= 0){ + $this.attr("id",id.replace('#index#',i)); + }else{ + var s = id.indexOf("["); + var e = id.indexOf("]"); + var new_id = id.substring(s+1,e); + $this.attr("id",id.replace(new_id,i)); + } + } + if(onclick_str!=null){ + if (onclick_str.indexOf("#index#") >= 0){ + $this.attr("onclick",onclick_str.replace(/#index#/g,i)); + }else{ + } + } + }); + $(this).find('div[name=\'xh\']').html(i+1); + }); +} +//閫氱敤寮瑰嚭寮忔枃浠朵笂浼 +function commonUpload(callback,inputId){ + $.dialog({ + content: "url:systemController.do?commonUpload", + lock : true, + title:"鏂囦欢涓婁紶", + zIndex:2100, + width:700, + height: 200, + parent:windowapi, + cache:false, + ok: function(){ + var iframe = this.iframe.contentWindow; + iframe.uploadCallback(callback,inputId); + return true; + }, + cancelVal: '鍏抽棴', + cancel: function(){ + } + }); +} +//閫氱敤寮瑰嚭寮忔枃浠朵笂浼-鍥炶皟 +function commonUploadDefaultCallBack(url,name,inputId){ + $("#"+inputId+"_href").attr('href',url).html('涓嬭浇'); + $("#"+inputId).val(url); +} +function browseImages(inputId, Img) {// 鍥剧墖绠$悊鍣紝鍙涓笂浼犲叡鐢 + var finder = new CKFinder(); + finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 + $("#" + Img).attr("src", fileUrl); + $("#" + inputId).attr("value", fileUrl); + }; + finder.resourceType = 'Images';// 鎸囧畾ckfinder鍙负鍥剧墖杩涜绠$悊 + finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID + finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃) + finder.defaultLanguage = 'zh-cn'; + finder.popup(); + } +function browseFiles(inputId, file) {// 鏂囦欢绠$悊鍣紝鍙涓笂浼犲叡鐢 + var finder = new CKFinder(); + finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 + $("#" + file).attr("href", fileUrl); + $("#" + inputId).attr("value", fileUrl); + decode(fileUrl, file); + }; + finder.resourceType = 'Files';// 鎸囧畾ckfinder鍙负鏂囦欢杩涜绠$悊 + finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID + finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃) + finder.defaultLanguage = 'zh-cn'; + finder.popup(); +} +function decode(value, id) {//value浼犲叆鍊,id鎺ュ彈鍊 + var last = value.lastIndexOf("/"); + var filename = value.substring(last + 1, value.length); + $("#" + id).text(decodeURIComponent(filename)); +} \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/cgform_jsListEnhanceTemplate.ftl b/src/main/resources/jeecg/template/onetomany/cgform_jsListEnhanceTemplate.ftl new file mode 100644 index 00000000..9f6655e4 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_jsListEnhanceTemplate.ftl @@ -0,0 +1 @@ +${cgformConfig.listJs.cgJsStr?if_exists} \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/cgform_jspListTemplate.ftl b/src/main/resources/jeecg/template/onetomany/cgform_jspListTemplate.ftl new file mode 100644 index 00000000..9e7bf4fa --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_jspListTemplate.ftl @@ -0,0 +1,71 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + +
    +
    + + <#list columns as po> + formatter="yyyy-MM-dd hh:mm:ss"<#else><#if po.showType?index_of("date")!=-1>formatter="yyyy-MM-dd" <#if po.isShowList?if_exists?html =='N'>hidden="true"<#else> <#if po.isQuery =='Y'>query="true" <#if po.queryMode =='single'>queryMode="single"<#elseif po.queryMode =='group'>queryMode="group" <#if po.dictTable?if_exists?html!="">dictionary="${po.dictTable},${po.dictField},${po.dictText}" <#if po.showType=='popup'>popup="true"<#else><#if po.dictTable?if_exists?html=="" && po.dictField?if_exists?html!="">dictionary="${po.dictField}" width="${po.fieldLength}"> + + + + + + + + + + + <#list buttons as btn> + <#if btn.buttonStyle =='button' && btn.buttonStatus == '1'> + url="${entityName?uncap_first}Controller.do?do${btn.buttonCode?cap_first}" funname="do${btn.buttonCode?cap_first}"<#else> funname="${btn.buttonCode}" > + + + +
    +
    + + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/cgform_jspSubTemplate.ftl b/src/main/resources/jeecg/template/onetomany/cgform_jspSubTemplate.ftl new file mode 100644 index 00000000..b2aca897 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_jspSubTemplate.ftl @@ -0,0 +1,5 @@ +<#if cgformConfig.cgFormHead.relationType==1 > + <#include "cgform_jspSubTemplate_one2one.ftl"> + <#else> + <#include "cgform_jspSubTemplate_one2many.ftl"> + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/cgform_jspSubTemplate_one2many.ftl b/src/main/resources/jeecg/template/onetomany/cgform_jspSubTemplate_one2many.ftl new file mode 100644 index 00000000..19ef69e7 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_jspSubTemplate_one2many.ftl @@ -0,0 +1,252 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + + + + + <#list pageColumns as po> + <#assign check = 0 > + <#list foreignKeys as key> + <#if fieldMeta[po.fieldName]==key?uncap_first> + <#assign check = 1 > + <#break> + + + <#if check==0> + + + + + + + + + + <#list columns as po> + <#if po.isShow=="N"> + + + + <#list pageColumns as po> + <#assign check = 0 > + <#list foreignKeys as key> + <#if fieldMeta[po.fieldName]==key?uncap_first> + <#assign check = 1 > + <#break> + + + <#if check==0> + + + + + + 0 }"> + + + + + <#list columns as po> + <#if po.isShow=="N"> + + + + <#list pageColumns as po> + <#assign check = 0 > + <#list foreignKeys as key> + <#if fieldMeta[po.fieldName]==key?uncap_first> + <#assign check = 1 > + <#break> + + + <#if check==0> + + + + + + + +
    搴忓彿鎿嶄綔 + ${po.content} +
    1
    + <#if po.showType == "text"> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + <#elseif po.showType=='password'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + <#elseif po.showType=='radio' || po.showType=='select' || po.showType=='checkbox' || po.showType=='list'> + dictTable="po.dictTable" dictField="${po.dictField?if_exists?html}" dictText="${po.dictText?if_exists?html}"<#else>typeGroupCode="${po.dictField}" defaultVal="${'$'}{${entityName?uncap_first}Page.${po.fieldName}}" hasLabel="false" title="${po.content}"> + <#elseif po.showType=='date'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='datetime'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='file'> + + 鏈笂浼 +
    + + <#else> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + + +
    ${'$'}{stuts.index+1 }
    + <#if po.showType == "text"> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value="${'$'}{poVal.${po.fieldName} }"> + <#elseif po.showType=='password'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value="${'$'}{poVal.${po.fieldName} }"> + <#elseif po.showType=='radio' || po.showType=='select' || po.showType=='checkbox' || po.showType=='list'> + dictTable="${po.dictTable?if_exists?html}" dictField="${po.dictField?if_exists?html}" dictText="${po.dictText?if_exists?html}"<#else>typeGroupCode="${po.dictField}" defaultVal="${'$'}{poVal.${po.fieldName} }" hasLabel="false" title="${po.content}"> + <#elseif po.showType=='date'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + value=""> + <#elseif po.showType=='datetime'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + value=""> + <#elseif po.showType=='file'> + + + 鏈笂浼 + + + 涓嬭浇 + +
    + + <#else> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value="${'$'}{poVal.${po.fieldName} }"> + + +
    diff --git a/src/main/resources/jeecg/template/onetomany/cgform_jspSubTemplate_one2one.ftl b/src/main/resources/jeecg/template/onetomany/cgform_jspSubTemplate_one2one.ftl new file mode 100644 index 00000000..05d6d684 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_jspSubTemplate_one2one.ftl @@ -0,0 +1,244 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + +
    + + + + + <#list columns as po> + <#if po.isShow=="N"> + + + + + <#list pageColumns as po> + <#assign check = 0 > + <#list foreignKeys as key> + <#if fieldMeta[po.fieldName]==key?uncap_first> + <#assign check = 1 > + <#break> + + + <#if check==0> + <#if po_index%2==0> + + + + + <#if (po_index+1)%2==0> + + <#else> + <#if !po_has_next> + + + + + + + 0 }"> + + + <#list columns as po> + <#if po.isShow=="N"> + + + + + <#list pageColumns as po> + <#assign check = 0 > + <#list foreignKeys as key> + <#if fieldMeta[po.fieldName]==key?uncap_first> + <#assign check = 1 > + <#break> + + + <#if check==0> + <#if po_index%2==0> + + + + + <#if (po_index+1)%2==0> + + <#else> + <#if !po_has_next> + + + + + + + + +
    + + + <#if po.showType == "text"> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + <#elseif po.showType=='password'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + <#elseif po.showType=='radio' || po.showType=='select' || po.showType=='checkbox' || po.showType=='list'> + dictTable="po.dictTable" dictField="${po.dictField?if_exists?html}" dictText="${po.dictText?if_exists?html}"<#else>typeGroupCode="${po.dictField}" defaultVal="${'$'}{${entityName?uncap_first}Page.${po.fieldName}}" hasLabel="false" title="${po.content}"> + <#elseif po.showType=='date'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='file'> + + 鏆傛椂鏈笂浼犳枃浠 + + + <#elseif po.showType=='datetime'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#else> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + + +
    + + + <#if po.showType == "text"> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value="${'$'}{poVal.${po.fieldName} }"> + <#elseif po.showType=='password'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value="${'$'}{poVal.${po.fieldName} }"> + <#elseif po.showType=='radio' || po.showType=='select' || po.showType=='checkbox' || po.showType=='list'> + dictTable="${po.dictTable?if_exists?html}" dictField="${po.dictField?if_exists?html}" dictText="${po.dictText?if_exists?html}"<#else>typeGroupCode="${po.dictField}" defaultVal="${'$'}{${entityName?uncap_first}Page.${po.fieldName}}" hasLabel="false" title="${po.content}"> + <#elseif po.showType=='date'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + value=""> + <#elseif po.showType=='datetime'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + value=""> + <#elseif po.showType=='file'> + + + 鏆傛椂鏈笂浼犳枃浠 + + + 涓嬭浇 + + + + <#else> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value="${'$'}{poVal.${po.fieldName} }"> + + +
    +
    \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/cgform_jspTemplate.ftl b/src/main/resources/jeecg/template/onetomany/cgform_jspTemplate.ftl new file mode 100644 index 00000000..1f23b6aa --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_jspTemplate.ftl @@ -0,0 +1,89 @@ +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + + ${ftl_description} + + + + + + + + <#list columns as po> + <#if po_index%2==0> + + <#else> + <#if !po_has_next> + + + + + + <#if (po_index+1)%2==0> + + <#else> + <#if !po_has_next> + + + + +
    + class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px"<#elseif po.classType=='easyui-datebox'>class="Wdate" onClick="WdatePicker()" style="width: 150px"<#else>class="${po.classType}" id="${po.fieldName}" name="${po.fieldName}" <#if po.nullable == 'Y'>ignore="ignore" + <#if po.fieldType?index_of("time")!=-1> value=""<#else><#if po.fieldType?index_of("date")!=-1>value=""<#else>value="${'$'}{${entityName?uncap_first}Page.${po.fieldName}}"<#if po.optionType?trim?length !=0> datatype="${po.optionType}"> + +
    +
    + <%-- 澧炲姞涓涓猟iv锛岀敤浜庤皟鑺傞〉闈㈠ぇ灏忥紝鍚﹀垯榛樿澶皬 --%> +
    + + <#list subTab as sub> + &${jeecg_table_id}=${"$"}{${entityName?uncap_first}Page.${jeecg_table_id}}<#else>&${key?uncap_first}=${"$"}{${entityName?uncap_first}Page.${key?uncap_first}}" icon="icon-search" title="${sub.ftlDescription}" id="${sub.entityName?uncap_first}"> + + +
    +
    + + + <#list subTab as sub> + + + + <#list sub.subColums as po> + <#assign check = 0 > + <#list sub.foreignKeys as key> + <#if fieldMeta[po.fieldName]==key?uncap_first> + <#assign check = 1 > + <#break> + + + <#if check==0> + + + + + + +
    + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/cgform_jspTemplate_add.ftl b/src/main/resources/jeecg/template/onetomany/cgform_jspTemplate_add.ftl new file mode 100644 index 00000000..aa9b7c87 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_jspTemplate_add.ftl @@ -0,0 +1,216 @@ +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + + ${ftl_description} + + + + + + + + <#list columns as po> + <#if po.isShow == 'N'> + + + + + <#list pageColumns as po> + <#if po_index%2==0> + + + + + <#if (po_index+1)%2==0> + + <#else> + <#if !po_has_next> + + + + +
    + + + <#if po.showType=='text'> + datatype="${po.fieldValidType?if_exists?html}" <#else><#if po.type == 'int'>datatype="n" <#elseif po.type=='double'>datatype="/^(-?\d+)(\.\d+)?$/" <#else><#if po.isNull != 'Y'>datatype="*"> + <#elseif po.showType=='popup'> + datatype="${po.fieldValidType?if_exists?html}" <#else><#if po.type == 'int'>datatype="n" <#elseif po.type=='double'>datatype="/^(-?\d+)(\.\d+)?$/" <#else><#if po.isNull != 'Y'>datatype="*" <#if po.dictTable?if_exists?html!=""> onclick="inputClick(this,'${po.dictField}','${po.dictTable}')"> + <#elseif po.showType=='textarea'> + + <#elseif po.showType=='password'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + <#elseif po.showType=='radio' || po.showType=='select' || po.showType=='checkbox' || po.showType=='list'> + dictTable="${po.dictTable?if_exists?html}" dictField="${po.dictField?if_exists?html}" dictText="${po.dictText?if_exists?html}"<#else>typeGroupCode="${po.dictField}" hasLabel="false" title="${po.content}"> + <#elseif po.showType=='date'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='datetime'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='file'> + + 鏆傛椂鏈笂浼犳枃浠 + + + <#else> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + + + +
    +
    + <%-- 澧炲姞涓涓猟iv锛岀敤浜庤皟鑺傞〉闈㈠ぇ灏忥紝鍚﹀垯榛樿澶皬 --%> +
    + + <#list subTab as sub> + &${jeecg_table_id}=${"$"}{${entityName?uncap_first}Page.${jeecg_table_id}}<#else>&${key?uncap_first}=${"$"}{${entityName?uncap_first}Page.${key?uncap_first}}" icon="icon-search" title="${sub.ftlDescription}" id="${sub.entityName?uncap_first}"> + + +
    +
    + + + <#list subTab as sub> + + + + + <#list subPageColumnsMap[sub.tableName] as po> + <#assign check = 0 > + <#list sub.foreignKeys as key> + <#if subFieldMeta[po.fieldName]==key?uncap_first> + <#assign check = 1 > + <#break> + + + <#if check==0> + + + + + + +
    + <#if po.showType == "text"> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + <#elseif po.showType=='password'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + <#elseif po.showType=='radio' || po.showType=='select' || po.showType=='checkbox' || po.showType=='list'> + dictTable="${po.dictTable?if_exists?html}" dictField="${po.dictField?if_exists?html}" dictText="${po.dictText?if_exists?html}"<#else>typeGroupCode="${po.dictField}" defaultVal="" hasLabel="false" title="${po.content}"> + <#elseif po.showType=='date'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='datetime'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='file'> + + 鏈笂浼 +
    + + <#else> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + + +
    + + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/cgform_jspTemplate_update.ftl b/src/main/resources/jeecg/template/onetomany/cgform_jspTemplate_update.ftl new file mode 100644 index 00000000..3dcba2b6 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_jspTemplate_update.ftl @@ -0,0 +1,221 @@ +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + + ${ftl_description} + + + + + + + + <#list columns as po> + <#if po.isShow == 'N'> + + + + + <#list pageColumns as po> + <#if po_index%2==0> + + + + + <#if (po_index+1)%2==0> + + <#else> + <#if !po_has_next> + + + + +
    + + + <#if po.showType=='text'> + datatype="${po.fieldValidType?if_exists?html}" <#else><#if po.type == 'int'>datatype="n" <#elseif po.type=='double'>datatype="/^(-?\d+)(\.\d+)?$/" <#else><#if po.isNull != 'Y'>datatype="*" value='${'$'}{${entityName?uncap_first}Page.${po.fieldName}}'> + <#elseif po.showType=='popup'> + datatype="${po.fieldValidType?if_exists?html}" <#else><#if po.type == 'int'>datatype="n" <#elseif po.type=='double'>datatype="/^(-?\d+)(\.\d+)?$/" <#else><#if po.isNull != 'Y'>datatype="*" <#if po.dictTable?if_exists?html!=""> onclick="inputClick(this,'${po.dictField}','${po.dictTable}')" value='${'$'}{${entityName?uncap_first}Page.${po.fieldName}}'> + <#elseif po.showType=='textarea'> + + <#elseif po.showType=='password'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value='${'$'}{${entityName?uncap_first}Page.${po.fieldName}}'> + <#elseif po.showType=='radio' || po.showType=='select' || po.showType=='checkbox' || po.showType=='list'> + dictTable="${po.dictTable?if_exists?html}" dictField="${po.dictField?if_exists?html}" dictText="${po.dictText?if_exists?html}"<#else>typeGroupCode="${po.dictField}" defaultVal="${'$'}{${entityName?uncap_first}Page.${po.fieldName}}" hasLabel="false" title="${po.content}"> + <#elseif po.showType=='date'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + value=''> + <#elseif po.showType=='datetime'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + value=''> + <#elseif po.showType=='file'> + + + 鏆傛椂鏈笂浼犳枃浠 + + + 涓嬭浇 + + + + <#else> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + value='${'$'}{${entityName?uncap_first}Page.${po.fieldName}}'> + + + +
    +
    + <%-- 澧炲姞涓涓猟iv锛岀敤浜庤皟鑺傞〉闈㈠ぇ灏忥紝鍚﹀垯榛樿澶皬 --%> +
    + + <#list subTab as sub> + &${jeecg_table_id}=${"$"}{${entityName?uncap_first}Page.${jeecg_table_id}}<#else>&${key?uncap_first}=${"$"}{${entityName?uncap_first}Page.${key?uncap_first}}" icon="icon-search" title="${sub.ftlDescription}" id="${sub.entityName?uncap_first}"> + + +
    +
    + + + <#list subTab as sub> + + + + + <#list subPageColumnsMap[sub.tableName] as po> + <#assign check = 0 > + <#list sub.foreignKeys as key> + <#if subFieldMeta[po.fieldName]==key?uncap_first> + <#assign check = 1 > + <#break> + + + <#if check==0> + + + + + + +
    + <#if po.showType == "text"> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + <#elseif po.showType=='password'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + <#elseif po.showType=='radio' || po.showType=='select' || po.showType=='checkbox' || po.showType=='list'> + dictTable="${po.dictTable?if_exists?html}" dictField="${po.dictField?if_exists?html}" dictText="${po.dictText?if_exists?html}"<#else>typeGroupCode="${po.dictField}" defaultVal="" hasLabel="false" title="${po.content}"> + <#elseif po.showType=='date'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='datetime'> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.isNull != 'Y'>datatype="*" + > + <#elseif po.showType=='file'> + + 鏈笂浼 +
    + + <#else> + + datatype="${po.fieldValidType?if_exists?html}" + <#else> + <#if po.type == 'int'> + datatype="n" + <#elseif po.type=='double'> + datatype="/^(-?\d+)(\.\d+)?$/" + <#else> + <#if po.isNull != 'Y'>datatype="*" + + > + + +
    + + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/cgform_pageTemplate.ftl b/src/main/resources/jeecg/template/onetomany/cgform_pageTemplate.ftl new file mode 100644 index 00000000..03691066 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_pageTemplate.ftl @@ -0,0 +1,73 @@ + +<#if packageStyle == "service"> +package ${bussiPackage}.${entityPackage}.page; +import ${bussiPackage}.${entityPackage}.entity.${entityName}Entity; +<#list subTab as sub> +import ${bussiPackage}.${sub.entityPackage}.entity.${sub.entityName}Entity; + +<#else> +package ${bussiPackage}.page.${entityPackage}; +import ${bussiPackage}.entity.${entityPackage}.${entityName}Entity; +<#list subTab as sub> +import ${bussiPackage}.entity.${sub.entityPackage}.${sub.entityName}Entity; + + + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.ArrayList; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; + + +/** + * @Title: Entity + * @Description: ${ftl_description} + * @author onlineGenerator + * @date ${ftl_create_time} + * @version V1.0 + * + */ +public class ${entityName}Page implements java.io.Serializable { + <#list subTab as sub> + /**淇濆瓨-${sub.ftlDescription}*/ + private List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List = new ArrayList<${sub.entityName}Entity>(); + public List<${sub.entityName}Entity> get${sub.entityName}List() { + return ${sub.entityName?uncap_first}List; + } + public void set${sub.entityName}List(List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List) { + this.${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}List; + } + + + <#list columns as po> + /**${po.content}*/ + private ${po.type} ${po.fieldName}; + + + <#list columns as po> + /** + *鏂规硶: 鍙栧緱${po.type} + *@return: ${po.type} ${po.content} + */ + public ${po.type} get${po.fieldName?cap_first}(){ + return this.${po.fieldName}; + } + + /** + *鏂规硶: 璁剧疆${po.type} + *@param: ${po.type} ${po.content} + */ + public void set${po.fieldName?cap_first}(${po.type} ${po.fieldName}){ + this.${po.fieldName} = ${po.fieldName}; + } + +} diff --git a/src/main/resources/jeecg/template/onetomany/cgform_serviceITemplate.ftl b/src/main/resources/jeecg/template/onetomany/cgform_serviceITemplate.ftl new file mode 100644 index 00000000..cfb62685 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_serviceITemplate.ftl @@ -0,0 +1,64 @@ +<#if packageStyle == "service"> +package ${bussiPackage}.${entityPackage}.service; +import ${bussiPackage}.${entityPackage}.entity.${entityName}Entity; +<#list subTab as sub> +import ${bussiPackage}.${sub.entityPackage}.entity.${sub.entityName}Entity; + +<#else> +package ${bussiPackage}.service.${entityPackage}; +import ${bussiPackage}.entity.${entityPackage}.${entityName}Entity; +<#list subTab as sub> +import ${bussiPackage}.entity.${sub.entityPackage}.${sub.entityName}Entity; + + + +import java.util.List; +import org.jeecgframework.core.common.service.CommonService; +import java.io.Serializable; + +public interface ${entityName}ServiceI extends CommonService{ + + public void delete(T entity); + /** + * 娣诲姞涓瀵瑰 + * + */ + public void addMain(${entityName}Entity ${entityName?uncap_first}, + <#list subTab as sub>List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List<#if sub_has_next>,) ; + /** + * 淇敼涓瀵瑰 + * + */ + public void updateMain(${entityName}Entity ${entityName?uncap_first}, + <#list subTab as sub>List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List<#if sub_has_next>,); + public void delMain (${entityName}Entity ${entityName?uncap_first}); + + <#list buttons as btn> + <#if btn.buttonStyle =='button' && btn.optType=='action'> + /** + * 鑷畾涔夋寜閽-sql澧炲己-${btn.buttonName} + * @param id + * @return + */ + public boolean do${btn.buttonCode?cap_first}Sql(${entityName}Entity t); + + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(${entityName}Entity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(${entityName}Entity t); + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(${entityName}Entity t); +} diff --git a/src/main/resources/jeecg/template/onetomany/cgform_serviceImplTemplate.ftl b/src/main/resources/jeecg/template/onetomany/cgform_serviceImplTemplate.ftl new file mode 100644 index 00000000..0d102345 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/cgform_serviceImplTemplate.ftl @@ -0,0 +1,222 @@ +<#if packageStyle == "service"> +package ${bussiPackage}.${entityPackage}.service.impl; +import ${bussiPackage}.${entityPackage}.service.${entityName}ServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import ${bussiPackage}.${entityPackage}.entity.${entityName}Entity; +<#list subTab as sub> +import ${bussiPackage}.${sub.entityPackage}.entity.${sub.entityName}Entity; + +<#else> +package ${bussiPackage}.service.impl.${entityPackage}; +import ${bussiPackage}.service.${entityPackage}.${entityName}ServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import ${bussiPackage}.entity.${entityPackage}.${entityName}Entity; +<#list subTab as sub> +import ${bussiPackage}.entity.${sub.entityPackage}.${sub.entityName}Entity; + + + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.util.MyBeanUtils; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.core.util.oConvertUtils; +import java.util.ArrayList; +import java.util.UUID; +import java.io.Serializable; + + +@Service("${entityName?uncap_first}Service") +@Transactional +public class ${entityName}ServiceImpl extends CommonServiceImpl implements ${entityName}ServiceI { + + public void delete(T entity) { + super.delete(entity); + //鎵ц鍒犻櫎鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doDelSql((${entityName}Entity)entity); + } + + public void addMain(${entityName}Entity ${entityName?uncap_first}, + <#list subTab as sub>List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List<#if sub_has_next>,){ + //淇濆瓨涓讳俊鎭 + this.save(${entityName?uncap_first}); + + <#list subTab as sub> + /**淇濆瓨-${sub.ftlDescription}*/ + for(${sub.entityName}Entity ${sub.entityName?uncap_first}:${sub.entityName?uncap_first}List){ + <#list sub.foreignKeys as key> + //澶栭敭璁剧疆 + <#if key?lower_case?index_of("${jeecg_table_id}")!=-1> + ${sub.entityName?uncap_first}.set${subFieldMeta1[key]?cap_first}(${entityName?uncap_first}.get${jeecg_table_id?cap_first}()); + <#else> + ${sub.entityName?uncap_first}.set${subFieldMeta1[key]?cap_first}(${entityName?uncap_first}.get${key}()); + + + this.save(${sub.entityName?uncap_first}); + } + + //鎵ц鏂板鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doAddSql(${entityName?uncap_first}); + } + + + public void updateMain(${entityName}Entity ${entityName?uncap_first}, + <#list subTab as sub>List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List<#if sub_has_next>,) { + //淇濆瓨涓昏〃淇℃伅 + this.saveOrUpdate(${entityName?uncap_first}); + //=================================================================================== + //鑾峰彇鍙傛暟 + <#list subTab as sub> + <#list sub.foreignKeys as key> + <#if key?lower_case?index_of("${jeecg_table_id}")!=-1> + Object ${jeecg_table_id}${sub_index} = ${entityName?uncap_first}.get${jeecg_table_id?cap_first}(); + <#else> + Object ${key?uncap_first}${sub_index} = ${entityName?uncap_first}.get${key}(); + + + + <#list subTab as sub> + //=================================================================================== + //1.鏌ヨ鍑烘暟鎹簱鐨勬槑缁嗘暟鎹-${sub.ftlDescription} + String hql${sub_index} = "from ${sub.entityName}Entity where 1 = 1<#list sub.foreignKeys as key> AND ${key?uncap_first} = ? "; + List<${sub.entityName}Entity> ${sub.entityName?uncap_first}OldList = this.findHql(hql${sub_index},<#list sub.foreignKeys as key><#if key?lower_case?index_of("${jeecg_table_id}")!=-1>${jeecg_table_id}${sub_index}<#else>${key?uncap_first}${sub_index}<#if key_has_next>,); + //2.绛涢夋洿鏂版槑缁嗘暟鎹-${sub.ftlDescription} + for(${sub.entityName}Entity oldE:${sub.entityName?uncap_first}OldList){ + boolean isUpdate = false; + for(${sub.entityName}Entity sendE:${sub.entityName?uncap_first}List){ + //闇瑕佹洿鏂扮殑鏄庣粏鏁版嵁-${sub.ftlDescription} + if(oldE.getId().equals(sendE.getId())){ + try { + MyBeanUtils.copyBeanNotNull2Bean(sendE,oldE); + this.saveOrUpdate(oldE); + } catch (Exception e) { + e.printStackTrace(); + throw new BusinessException(e.getMessage()); + } + isUpdate= true; + break; + } + } + if(!isUpdate){ + //濡傛灉鏁版嵁搴撳瓨鍦ㄧ殑鏄庣粏锛屽墠鍙版病鏈変紶閫掕繃鏉ュ垯鏄垹闄-${sub.ftlDescription} + super.delete(oldE); + } + + } + //3.鎸佷箙鍖栨柊澧炵殑鏁版嵁-${sub.ftlDescription} + for(${sub.entityName}Entity ${sub.entityName?uncap_first}:${sub.entityName?uncap_first}List){ + if(oConvertUtils.isEmpty(${sub.entityName?uncap_first}.getId())){ + //澶栭敭璁剧疆 + <#list sub.foreignKeys as key> + <#if key?lower_case?index_of("${jeecg_table_id}")!=-1> + ${sub.entityName?uncap_first}.set${subFieldMeta1[key]?cap_first}(${entityName?uncap_first}.get${jeecg_table_id?cap_first}()); + <#else> + ${sub.entityName?uncap_first}.set${subFieldMeta1[key]?cap_first}(${entityName?uncap_first}.get${key}()); + + + this.save(${sub.entityName?uncap_first}); + } + } + + //鎵ц鏇存柊鎿嶄綔閰嶇疆鐨剆ql澧炲己 + this.doUpdateSql(${entityName?uncap_first}); + } + + + public void delMain(${entityName}Entity ${entityName?uncap_first}) { + //鍒犻櫎涓昏〃淇℃伅 + this.delete(${entityName?uncap_first}); + //=================================================================================== + //鑾峰彇鍙傛暟 + <#list subTab as sub> + <#list sub.foreignKeys as key> + <#if key?lower_case?index_of("${jeecg_table_id}")!=-1> + Object ${jeecg_table_id}${sub_index} = ${entityName?uncap_first}.get${jeecg_table_id?cap_first}(); + <#else> + Object ${key?uncap_first}${sub_index} = ${entityName?uncap_first}.get${key}(); + + + + <#list subTab as sub> + //=================================================================================== + //鍒犻櫎-${sub.ftlDescription} + String hql${sub_index} = "from ${sub.entityName}Entity where 1 = 1<#list sub.foreignKeys as key> AND ${key?uncap_first} = ? "; + List<${sub.entityName}Entity> ${sub.entityName?uncap_first}OldList = this.findHql(hql${sub_index},<#list sub.foreignKeys as key><#if key?lower_case?index_of("${jeecg_table_id}")!=-1>${jeecg_table_id}${sub_index}<#else>${key?uncap_first}${sub_index}<#if key_has_next>,); + this.deleteAllEntitie(${sub.entityName?uncap_first}OldList); + + } + + <#list buttons as btn> + <#if btn.buttonStyle =='button' && btn.optType=='action'> + /** + * 鑷畾涔夋寜閽-sql澧炲己-${btn.buttonName} + * @param id + * @return + */ + public boolean do${btn.buttonCode?cap_first}Sql(${entityName}Entity t){ + <#list buttonSqlMap[btn.buttonCode] as sql> + //sql澧炲己绗${sql_index+1}鏉 + String sqlEnhance_${sql_index+1} ="${sql}"; + this.executeSql(replaceVal(sqlEnhance_${sql_index+1},t)); + + return true; + } + + + + /** + * 榛樿鎸夐挳-sql澧炲己-鏂板鎿嶄綔 + * @param id + * @return + */ + public boolean doAddSql(${entityName}Entity t){ + <#list buttonSqlMap['add'] as sql> + //sql澧炲己绗${sql_index+1}鏉 + String sqlEnhance_${sql_index+1} ="${sql}"; + this.executeSql(replaceVal(sqlEnhance_${sql_index+1},t)); + + return true; + } + /** + * 榛樿鎸夐挳-sql澧炲己-鏇存柊鎿嶄綔 + * @param id + * @return + */ + public boolean doUpdateSql(${entityName}Entity t){ + <#list buttonSqlMap['update'] as sql> + //sql澧炲己绗${sql_index+1}鏉 + String sqlEnhance_${sql_index+1} ="${sql}"; + this.executeSql(replaceVal(sqlEnhance_${sql_index+1},t)); + + return true; + } + /** + * 榛樿鎸夐挳-sql澧炲己-鍒犻櫎鎿嶄綔 + * @param id + * @return + */ + public boolean doDelSql(${entityName}Entity t){ + <#list buttonSqlMap['delete'] as sql> + //sql澧炲己绗${sql_index+1}鏉 + String sqlEnhance_${sql_index+1} ="${sql}"; + this.executeSql(replaceVal(sqlEnhance_${sql_index+1},t)); + + return true; + } + + /** + * 鏇挎崲sql涓殑鍙橀噺 + * @param sql + * @return + */ + public String replaceVal(String sql,${entityName}Entity t){ + <#list columns as po> + sql = sql.replace("${'#'}{${fieldMeta[po.fieldName]?lower_case}}",String.valueOf(t.get${po.fieldName?cap_first}())); + + sql = sql.replace("${'#'}{UUID}",UUID.randomUUID().toString()); + return sql; + } +} \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/controllerTemplate.ftl b/src/main/resources/jeecg/template/onetomany/controllerTemplate.ftl new file mode 100644 index 00000000..f5cd0eec --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/controllerTemplate.ftl @@ -0,0 +1,184 @@ +package ${bussiPackage}.controller.${entityPackage}; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.core.common.controller.BaseController; +import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; +import org.jeecgframework.core.common.model.json.AjaxJson; +import org.jeecgframework.core.common.model.json.DataGrid; +import org.jeecgframework.core.constant.Globals; +import org.jeecgframework.core.util.StringUtil; +import org.jeecgframework.tag.core.easyui.TagUtil; +import org.jeecgframework.web.system.pojo.base.TSDepart; +import org.jeecgframework.web.system.service.SystemService; +import org.jeecgframework.core.util.MyBeanUtils; + +import ${bussiPackage}.entity.${entityPackage}.${entityName}Entity; +import ${bussiPackage}.page.${entityPackage}.${entityName}Page; +import ${bussiPackage}.service.${entityPackage}.${entityName}ServiceI; +<#list subTab as sub> +import ${bussiPackage}.entity.${sub.entityPackage}.${sub.entityName}Entity; + +/** + * @Title: Controller + * @Description: ${ftl_description} + * @author zhangdaihao + * @date ${ftl_create_time} + * @version V1.0 + * + */ +@Scope("prototype") +@Controller +@RequestMapping("/${entityName?uncap_first}Controller") +public class ${entityName}Controller extends BaseController { + /** + * Logger for this class + */ + private static final Logger logger = Logger.getLogger(${entityName}Controller.class); + + @Autowired + private ${entityName}ServiceI ${entityName?uncap_first}Service; + @Autowired + private SystemService systemService; + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + /** + * ${ftl_description}鍒楄〃 椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "${entityName?uncap_first}") + public ModelAndView ${entityName?uncap_first}(HttpServletRequest request) { + return new ModelAndView("${bussiPackage?replace(".","/")}/${entityPackage}/${entityName?uncap_first}List"); + } + + /** + * easyui AJAX璇锋眰鏁版嵁 + * + * @param request + * @param response + * @param dataGrid + * @param user + */ + + @RequestMapping(params = "datagrid") + public void datagrid(${entityName}Entity ${entityName?uncap_first},HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) { + CriteriaQuery cq = new CriteriaQuery(${entityName}Entity.class, dataGrid); + //鏌ヨ鏉′欢缁勮鍣 + org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, ${entityName?uncap_first}); + this.${entityName?uncap_first}Service.getDataGridReturn(cq, true); + TagUtil.datagrid(response, dataGrid); + } + + /** + * 鍒犻櫎${ftl_description} + * + * @return + */ + @RequestMapping(params = "del") + @ResponseBody + public AjaxJson del(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest request) { + AjaxJson j = new AjaxJson(); + ${entityName?uncap_first} = systemService.getEntity(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + message = "鍒犻櫎鎴愬姛"; + ${entityName?uncap_first}Service.delete(${entityName?uncap_first}); + systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO); + + j.setMsg(message); + return j; + } + + + /** + * 娣诲姞${ftl_description} + * + * @param ids + * @return + */ + @RequestMapping(params = "save") + @ResponseBody + public AjaxJson save(${entityName}Entity ${entityName?uncap_first},${entityName}Page ${entityName?uncap_first}Page, HttpServletRequest request) { + <#list subTab as sub> + List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List = ${entityName?uncap_first}Page.get${sub.entityName}List(); + + AjaxJson j = new AjaxJson(); + if (StringUtil.isNotEmpty(${entityName?uncap_first}.getId())) { + message = "鏇存柊鎴愬姛"; + ${entityName?uncap_first}Service.updateMain(${entityName?uncap_first}, <#list subTab as sub>${sub.entityName?uncap_first}List<#if sub_has_next>,); + systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); + } else { + message = "娣诲姞鎴愬姛"; + ${entityName?uncap_first}Service.addMain(${entityName?uncap_first}, <#list subTab as sub>${sub.entityName?uncap_first}List<#if sub_has_next>,); + systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); + } + j.setMsg(message); + return j; + } + + /** + * ${ftl_description}鍒楄〃椤甸潰璺宠浆 + * + * @return + */ + @RequestMapping(params = "addorupdate") + public ModelAndView addorupdate(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest req) { + if (StringUtil.isNotEmpty(${entityName?uncap_first}.getId())) { + ${entityName?uncap_first} = ${entityName?uncap_first}Service.getEntity(${entityName}Entity.class, ${entityName?uncap_first}.getId()); + req.setAttribute("${entityName?uncap_first}Page", ${entityName?uncap_first}); + } + return new ModelAndView("${bussiPackage?replace(".","/")}/${entityPackage}/${entityName?uncap_first}"); + } + + + <#list subTab as sub> + /** + * 鍔犺浇鏄庣粏鍒楄〃[${sub.ftlDescription}] + * + * @return + */ + @RequestMapping(params = "${sub.entityName?uncap_first}List") + public ModelAndView ${sub.entityName?uncap_first}List(${entityName}Entity ${entityName?uncap_first}, HttpServletRequest req) { + + //=================================================================================== + //鑾峰彇鍙傛暟 + <#list sub.foreignKeys as key> + <#if key?lower_case?index_of("${jeecg_table_id}")!=-1> + Object ${jeecg_table_id}${sub_index} = ${entityName?uncap_first}.get${jeecg_table_id?cap_first}(); + <#else> + Object ${key?uncap_first}${sub_index} = ${entityName?uncap_first}.get${key}(); + + + //=================================================================================== + //鏌ヨ-${sub.ftlDescription} + String hql${sub_index} = "from ${sub.entityName}Entity where 1 = 1<#list sub.foreignKeys as key> AND ${key?uncap_first} = ? "; + try{ + List<${sub.entityName}Entity> ${sub.entityName?uncap_first}EntityList = systemService.findHql(hql${sub_index},<#list sub.foreignKeys as key><#if key?lower_case?index_of("${jeecg_table_id}")!=-1>${jeecg_table_id}${sub_index}<#else>${key?uncap_first}${sub_index}<#if key_has_next>,); + req.setAttribute("${sub.entityName?uncap_first}List", ${sub.entityName?uncap_first}EntityList); + }catch(Exception e){ + logger.info(e.getMessage()); + } + return new ModelAndView("${bussiPackage?replace(".","/")}/${entityPackage}/${sub.entityName?uncap_first}List"); + } + + + +} diff --git a/src/main/resources/jeecg/template/onetomany/entityTemplate.ftl b/src/main/resources/jeecg/template/onetomany/entityTemplate.ftl new file mode 100644 index 00000000..163f489f --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/entityTemplate.ftl @@ -0,0 +1,67 @@ +package ${bussiPackage}.entity.${entityPackage}; + +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; + +/** + * @Title: Entity + * @Description: ${ftl_description} + * @author zhangdaihao + * @date ${ftl_create_time} + * @version V1.0 + * + */ +@Entity +@Table(name = "${tableName}", schema = "") +@SuppressWarnings("serial") +public class ${entityName}Entity implements java.io.Serializable { + <#list originalColumns as po> + /**${po.filedComment}*/ + private ${po.fieldType} ${po.fieldName}; + + + <#list originalColumns as po> + /** + *鏂规硶: 鍙栧緱${po.fieldType} + *@return: ${po.fieldType} ${po.filedComment} + */ + <#if po.fieldName == jeecg_table_id> + + <#if jeecg_primary_key_policy == 'uuid'> + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + + <#if jeecg_primary_key_policy == 'identity'> + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + + <#if jeecg_primary_key_policy == 'sequence'> + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="sequence") + @SequenceGenerator(name="sequence",sequenceName="${jeecg_sequence_code}",allocationSize=1) + + + @Column(name ="${po.fieldDbName}",nullable=<#if po.nullable == 'Y'>true<#else>false<#if po.precision != ''>,precision=${po.precision}<#if po.scale != ''>,scale=${po.scale}<#if po.charmaxLength != ''&& po.charmaxLength?length lte 8 >,length=${po.charmaxLength}) + public ${po.fieldType} get${po.fieldName?cap_first}(){ + return this.${po.fieldName}; + } + + /** + *鏂规硶: 璁剧疆${po.fieldType} + *@param: ${po.fieldType} ${po.filedComment} + */ + public void set${po.fieldName?cap_first}(${po.fieldType} ${po.fieldName}){ + this.${po.fieldName} = ${po.fieldName}; + } + +} diff --git a/src/main/resources/jeecg/template/onetomany/jspListTemplate.ftl b/src/main/resources/jeecg/template/onetomany/jspListTemplate.ftl new file mode 100644 index 00000000..b573fe69 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/jspListTemplate.ftl @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> +
    +
    + + + <#list columns as po> + formatter="yyyy-MM-dd hh:mm:ss"<#else><#if po.fieldType?index_of("date")!=-1>formatter="yyyy-MM-dd"> + + + + + + +
    +
    \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/jspSubTemplate.ftl b/src/main/resources/jeecg/template/onetomany/jspSubTemplate.ftl new file mode 100644 index 00000000..9d1482ac --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/jspSubTemplate.ftl @@ -0,0 +1,86 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + +
    + + + + + <#list columns as po> + <#assign check = 0 > + <#list foreignKeys as key> + <#if po.fieldName==key?uncap_first> + <#assign check = 1 > + <#break> + + + <#if check==0> + + + + + + + + + + <#list columns as po> + <#assign check = 0 > + <#list foreignKeys as key> + <#if po.fieldName==key?uncap_first> + <#assign check = 1 > + <#break> + + + <#if check==0> + + + + + + 0 }"> + + + + + + <#list columns as po> + <#assign check = 0 > + <#list foreignKeys as key> + <#if po.fieldName==key?uncap_first> + <#assign check = 1 > + <#break> + + + <#if check==0> + + + + + + + +
    搴忓彿鎿嶄綔<#if po.filedComment?length lt 7 >${po.filedComment}<#else>${po.filedComment[0..6]}
    1
    ${'$'}{stuts.index+1 }
    +
    \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/jspTemplate.ftl b/src/main/resources/jeecg/template/onetomany/jspTemplate.ftl new file mode 100644 index 00000000..4d1b9b7a --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/jspTemplate.ftl @@ -0,0 +1,87 @@ +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + + ${ftl_description} + + + + + + + + <#list columns as po> + <#if po_index%2==0> + + + + + <#if (po_index+1)%2==0> + + <#else> + <#if !po_has_next> + + + + +
    + class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px"<#elseif po.classType=='easyui-datebox'>class="Wdate" onClick="WdatePicker()" style="width: 150px"<#else>class="${po.classType}" id="${po.fieldName}" name="${po.fieldName}" <#if po.nullable == 'Y'>ignore="ignore" + <#if po.fieldType?index_of("time")!=-1> value=""<#else><#if po.fieldType?index_of("date")!=-1>value=""<#else>value="${'$'}{${entityName?uncap_first}Page.${po.fieldName}}"<#if po.optionType?trim?length !=0> datatype="${po.optionType}"> + +
    +
    + <%-- 澧炲姞涓涓猟iv锛岀敤浜庤皟鑺傞〉闈㈠ぇ灏忥紝鍚﹀垯榛樿澶皬 --%> +
    + + <#list subTab as sub> + &${jeecg_table_id}=${"$"}{${entityName?uncap_first}Page.${jeecg_table_id}}<#else>&${key?uncap_first}=${"$"}{${entityName?uncap_first}Page.${key?uncap_first}}" icon="icon-search" title="${sub.ftlDescription}" id="${sub.entityName?uncap_first}"> + + +
    +
    + + + <#list subTab as sub> + + + + + <#list sub.subColums as po> + <#assign check = 0 > + <#list sub.foreignKeys as key> + <#if po.fieldName==key?uncap_first> + <#assign check = 1 > + <#break> + + + <#if check==0> + + + + + + +
    + \ No newline at end of file diff --git a/src/main/resources/jeecg/template/onetomany/pageTemplate.ftl b/src/main/resources/jeecg/template/onetomany/pageTemplate.ftl new file mode 100644 index 00000000..55cd0edc --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/pageTemplate.ftl @@ -0,0 +1,85 @@ +package ${bussiPackage}.page.${entityPackage}; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.ArrayList; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; +import javax.persistence.SequenceGenerator; + +<#list subTab as sub> +import ${bussiPackage}.entity.${sub.entityPackage}.${sub.entityName}Entity; + + +/** + * @Title: Entity + * @Description: ${ftl_description} + * @author zhangdaihao + * @date ${ftl_create_time} + * @version V1.0 + * + */ +@Entity +@Table(name = "${tableName}", schema = "") +@SuppressWarnings("serial") +public class ${entityName}Page implements java.io.Serializable { + <#list subTab as sub> + /**淇濆瓨-${sub.ftlDescription}*/ + private List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List = new ArrayList<${sub.entityName}Entity>(); + public List<${sub.entityName}Entity> get${sub.entityName}List() { + return ${sub.entityName?uncap_first}List; + } + public void set${sub.entityName}List(List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List) { + this.${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}List; + } + + + + <#list originalColumns as po> + /**${po.filedComment}*/ + private ${po.fieldType} ${po.fieldName}; + + + <#list originalColumns as po> + /** + *鏂规硶: 鍙栧緱${po.fieldType} + *@return: ${po.fieldType} ${po.filedComment} + */ + <#if po.fieldName == jeecg_table_id> + + <#if jeecg_primary_key_policy == 'uuid'> + @Id + @GeneratedValue(generator = "paymentableGenerator") + @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") + + <#if jeecg_primary_key_policy == 'identity'> + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + + <#if jeecg_primary_key_policy == 'sequence'> + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="sequence") + @SequenceGenerator(name="sequence",sequenceName="${jeecg_sequence_code}",allocationSize=1) + + + @Column(name ="${po.fieldDbName}",nullable=<#if po.nullable == 'Y'>true<#else>false<#if po.precision != ''>,precision=${po.precision}<#if po.scale != ''>,scale=${po.scale}<#if po.charmaxLength != ''&& po.charmaxLength?length lte 8 >,length=${po.charmaxLength}) + public ${po.fieldType} get${po.fieldName?cap_first}(){ + return this.${po.fieldName}; + } + + /** + *鏂规硶: 璁剧疆${po.fieldType} + *@param: ${po.fieldType} ${po.filedComment} + */ + public void set${po.fieldName?cap_first}(${po.fieldType} ${po.fieldName}){ + this.${po.fieldName} = ${po.fieldName}; + } + +} diff --git a/src/main/resources/jeecg/template/onetomany/serviceITemplate.ftl b/src/main/resources/jeecg/template/onetomany/serviceITemplate.ftl new file mode 100644 index 00000000..4cc7ab39 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/serviceITemplate.ftl @@ -0,0 +1,25 @@ +package ${bussiPackage}.service.${entityPackage}; + +import java.util.List; +import org.jeecgframework.core.common.service.CommonService; +import ${bussiPackage}.entity.${entityPackage}.${entityName}Entity; +<#list subTab as sub> +import ${bussiPackage}.entity.${sub.entityPackage}.${sub.entityName}Entity; + + +public interface ${entityName}ServiceI extends CommonService{ + + /** + * 娣诲姞涓瀵瑰 + * + */ + public void addMain(${entityName}Entity ${entityName?uncap_first}, + <#list subTab as sub>List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List<#if sub_has_next>,) ; + /** + * 淇敼涓瀵瑰 + * + */ + public void updateMain(${entityName}Entity ${entityName?uncap_first}, + <#list subTab as sub>List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List<#if sub_has_next>,); + public void delMain (${entityName}Entity ${entityName?uncap_first}); +} diff --git a/src/main/resources/jeecg/template/onetomany/serviceImplTemplate.ftl b/src/main/resources/jeecg/template/onetomany/serviceImplTemplate.ftl new file mode 100644 index 00000000..caa4a9b3 --- /dev/null +++ b/src/main/resources/jeecg/template/onetomany/serviceImplTemplate.ftl @@ -0,0 +1,129 @@ +package ${bussiPackage}.service.impl.${entityPackage}; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import ${bussiPackage}.service.${entityPackage}.${entityName}ServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; +import org.jeecgframework.core.common.exception.BusinessException; +import org.jeecgframework.core.util.MyBeanUtils; +import ${bussiPackage}.entity.${entityPackage}.${entityName}Entity; +<#list subTab as sub> +import ${bussiPackage}.entity.${sub.entityPackage}.${sub.entityName}Entity; + +@Service("${entityName?uncap_first}Service") +@Transactional +public class ${entityName}ServiceImpl extends CommonServiceImpl implements ${entityName}ServiceI { + + + public void addMain(${entityName}Entity ${entityName?uncap_first}, + <#list subTab as sub>List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List<#if sub_has_next>,){ + //淇濆瓨涓讳俊鎭 + this.save(${entityName?uncap_first}); + + <#list subTab as sub> + /**淇濆瓨-${sub.ftlDescription}*/ + for(${sub.entityName}Entity ${sub.entityName?uncap_first}:${sub.entityName?uncap_first}List){ + <#list sub.foreignKeys as key> + //澶栭敭璁剧疆 + <#if key?lower_case?index_of("${jeecg_table_id}")!=-1> + ${sub.entityName?uncap_first}.set${key}(${entityName?uncap_first}.get${jeecg_table_id?cap_first}()); + <#else> + ${sub.entityName?uncap_first}.set${key}(${entityName?uncap_first}.get${key}()); + + + this.save(${sub.entityName?uncap_first}); + } + + } + + + public void updateMain(${entityName}Entity ${entityName?uncap_first}, + <#list subTab as sub>List<${sub.entityName}Entity> ${sub.entityName?uncap_first}List<#if sub_has_next>,) { + //淇濆瓨璁㈠崟涓讳俊鎭 + this.saveOrUpdate(${entityName?uncap_first}); + + + //=================================================================================== + //鑾峰彇鍙傛暟 + <#list subTab as sub> + <#list sub.foreignKeys as key> + <#if key?lower_case?index_of("${jeecg_table_id}")!=-1> + Object ${jeecg_table_id}${sub_index} = ${entityName?uncap_first}.get${jeecg_table_id?cap_first}(); + <#else> + Object ${key?uncap_first}${sub_index} = ${entityName?uncap_first}.get${key}(); + + + + <#list subTab as sub> + //=================================================================================== + //1.鏌ヨ鍑烘暟鎹簱鐨勬槑缁嗘暟鎹-${sub.ftlDescription} + String hql${sub_index} = "from ${sub.entityName}Entity where 1 = 1<#list sub.foreignKeys as key> AND ${key?uncap_first} = ? "; + List<${sub.entityName}Entity> ${sub.entityName?uncap_first}OldList = this.findHql(hql${sub_index},<#list sub.foreignKeys as key><#if key?lower_case?index_of("${jeecg_table_id}")!=-1>${jeecg_table_id}${sub_index}<#else>${key?uncap_first}${sub_index}<#if key_has_next>,); + //2.绛涢夋洿鏂版槑缁嗘暟鎹-${sub.ftlDescription} + for(${sub.entityName}Entity oldE:${sub.entityName?uncap_first}OldList){ + boolean isUpdate = false; + for(${sub.entityName}Entity sendE:${sub.entityName?uncap_first}List){ + //闇瑕佹洿鏂扮殑鏄庣粏鏁版嵁-${sub.ftlDescription} + if(oldE.getId().equals(sendE.getId())){ + try { + MyBeanUtils.copyBeanNotNull2Bean(sendE,oldE); + this.saveOrUpdate(oldE); + } catch (Exception e) { + e.printStackTrace(); + throw new BusinessException(e.getMessage()); + } + isUpdate= true; + break; + } + } + if(!isUpdate){ + //濡傛灉鏁版嵁搴撳瓨鍦ㄧ殑鏄庣粏锛屽墠鍙版病鏈変紶閫掕繃鏉ュ垯鏄垹闄-${sub.ftlDescription} + super.delete(oldE); + } + + } + //3.鎸佷箙鍖栨柊澧炵殑鏁版嵁-${sub.ftlDescription} + for(${sub.entityName}Entity ${sub.entityName?uncap_first}:${sub.entityName?uncap_first}List){ + if(${sub.entityName?uncap_first}.getId()==null){ + //澶栭敭璁剧疆 + <#list sub.foreignKeys as key> + <#if key?lower_case?index_of("${jeecg_table_id}")!=-1> + ${sub.entityName?uncap_first}.set${key}(${entityName?uncap_first}.get${jeecg_table_id?cap_first}()); + <#else> + ${sub.entityName?uncap_first}.set${key}(${entityName?uncap_first}.get${key}()); + + + this.save(${sub.entityName?uncap_first}); + } + } + + + } + + + public void delMain(${entityName}Entity ${entityName?uncap_first}) { + //鍒犻櫎涓昏〃淇℃伅 + this.delete(${entityName?uncap_first}); + + //=================================================================================== + //鑾峰彇鍙傛暟 + <#list subTab as sub> + <#list sub.foreignKeys as key> + <#if key?lower_case?index_of("${jeecg_table_id}")!=-1> + Object ${jeecg_table_id}${sub_index} = ${entityName?uncap_first}.get${jeecg_table_id?cap_first}(); + <#else> + Object ${key?uncap_first}${sub_index} = ${entityName?uncap_first}.get${key}(); + + + + <#list subTab as sub> + //=================================================================================== + //鍒犻櫎-${sub.ftlDescription} + String hql${sub_index} = "from ${sub.entityName}Entity where 1 = 1<#list sub.foreignKeys as key> AND ${key?uncap_first} = ? "; + List<${sub.entityName}Entity> ${sub.entityName?uncap_first}OldList = this.findHql(hql${sub_index},<#list sub.foreignKeys as key><#if key?lower_case?index_of("${jeecg_table_id}")!=-1>${jeecg_table_id}${sub_index}<#else>${key?uncap_first}${sub_index}<#if key_has_next>,); + this.deleteAllEntitie(${sub.entityName?uncap_first}OldList); + + } + +} \ No newline at end of file diff --git a/src/main/resources/jeecg/template/serviceITemplate.ftl b/src/main/resources/jeecg/template/serviceITemplate.ftl new file mode 100644 index 00000000..f4433481 --- /dev/null +++ b/src/main/resources/jeecg/template/serviceITemplate.ftl @@ -0,0 +1,7 @@ +package ${bussiPackage}.service.${entityPackage}; + +import org.jeecgframework.core.common.service.CommonService; + +public interface ${entityName}ServiceI extends CommonService{ + +} diff --git a/src/main/resources/jeecg/template/serviceImplTemplate.ftl b/src/main/resources/jeecg/template/serviceImplTemplate.ftl new file mode 100644 index 00000000..b4bfc026 --- /dev/null +++ b/src/main/resources/jeecg/template/serviceImplTemplate.ftl @@ -0,0 +1,13 @@ +package ${bussiPackage}.service.impl.${entityPackage}; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import ${bussiPackage}.service.${entityPackage}.${entityName}ServiceI; +import org.jeecgframework.core.common.service.impl.CommonServiceImpl; + +@Service("${entityName?uncap_first}Service") +@Transactional +public class ${entityName}ServiceImpl extends CommonServiceImpl implements ${entityName}ServiceI { + +} \ No newline at end of file diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties new file mode 100644 index 00000000..45051ae8 --- /dev/null +++ b/src/main/resources/log4j.properties @@ -0,0 +1,13 @@ +log4j.rootLogger=info,A1,R +log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1.Target=System.out +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=[%c]%m%n + +log4j.appender.R=org.apache.log4j.DailyRollingFileAppender +log4j.appender.R.File=../jeecglogs/jeecg_log_.txt +log4j.appender.R.layout=org.apache.log4j.PatternLayout +log4j.appender.R.Append = true +log4j.appender.R.ImmediateFlush = true +log4j.appender.R.DatePattern = '.' yyyy - MM - dd '.txt' +log4j.appender.R.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n diff --git a/src/main/resources/spring-minidao.xml b/src/main/resources/spring-minidao.xml new file mode 100644 index 00000000..409a479c --- /dev/null +++ b/src/main/resources/spring-minidao.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/spring-mvc-aop.xml b/src/main/resources/spring-mvc-aop.xml new file mode 100644 index 00000000..68a009ad --- /dev/null +++ b/src/main/resources/spring-mvc-aop.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/spring-mvc-context.xml b/src/main/resources/spring-mvc-context.xml new file mode 100644 index 00000000..c3572727 --- /dev/null +++ b/src/main/resources/spring-mvc-context.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/spring-mvc-hibernate.xml b/src/main/resources/spring-mvc-hibernate.xml new file mode 100644 index 00000000..b5f7220a --- /dev/null +++ b/src/main/resources/spring-mvc-hibernate.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + ${hibernate.dialect} + ${hibernate.hbm2ddl.auto} + true + true + false + + + + + + org.jeecgframework.web.system.pojo.* + org.jeecgframework.web.demo.entity.* + org.jeecgframework.web.test.entity.* + org.jeecgframework.web.cgform.entity.* + org.jeecgframework.web.cgreport.entity.* + org.jeecgframework.web.sms.* + com.buss.* + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/spring-mvc-timeTask.xml b/src/main/resources/spring-mvc-timeTask.xml new file mode 100644 index 00000000..73645338 --- /dev/null +++ b/src/main/resources/spring-mvc-timeTask.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/spring-mvc.xml b/src/main/resources/spring-mvc.xml new file mode 100644 index 00000000..4cc9de83 --- /dev/null +++ b/src/main/resources/spring-mvc.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + text/html;charset=UTF-8 + + + + + + + + + + + + + + + + + + + + + + + + + 104857600 + + + 4096 + + + + + + + + + + + + + + + + + + + + + + + + + + + + loginController.do?goPwdInit + loginController.do?pwdInit + loginController.do?login + loginController.do?checkuser + repairController.do?repair + repairController.do?deleteAndRepair + + userController.do?userOrgSelect + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/sysConfig.properties b/src/main/resources/sysConfig.properties new file mode 100644 index 00000000..2dd40f9c --- /dev/null +++ b/src/main/resources/sysConfig.properties @@ -0,0 +1,59 @@ +\ufeff#SESSION +sessionVersion=sessionVersion +# +templatepath=docTemp +# +uploadpath=upload + +office_home=D://OpenOffice + + +#DEV(\u751f\u4ea7\u6a21\u5f0f)/PUB(\u5f00\u53d1\u6a21\u5f0f) +sqlReadMode=PUB + +#database type for spring jdbc +jdbc.url.jeecg=mysql + +#\u6309\u94ae\u6743\u9650\u5f00\u5173 +button.authority.jeecg=true + +#auto scan menu flag true or false +auto.scan.menu.flag=false + +#ckfinder upload files\u5982\u679c\u4e0d\u60f3\u628a\u6587\u4ef6\u653e\u5728\u975e\u672c\u9879\u76ee\u4e0b\uff0cck.userfiles\u53ef\u4ee5\u76f4\u63a5\u6307\u5b9a\u672c\u9879\u76ee\u4e0b +# \u7684\u6587\u4ef6\u5939\u540d\uff0c\u5e76\u628ack.baseDir\u7559\u7a7a\u5373\u53ef +####\u6307\u5b9a\u975e\u672c\u9879\u76ee\u7684http\u5730\u5740\uff0c\u7528\u4e8eckfinder\u6307\u5b9a\u6587\u4ef6\u5e93 +ck.userfiles=http://localhost:8080/jeecg/userfiles +####ckfinder\u6307\u5b9a\u6587\u4ef6\u5e93\u7684\u7edd\u5bf9\u8def\u5f84(\u8bf7\u6539\u4e3a\u81ea\u5df1\u7684) +ck.baseDir=E\:/Program Files/apache-tomcat-6.0.20/webapps/jeecg/userfiles +####\u662f\u5426\u4e3a\u6bcf\u4f4d\u7528\u6237\u521b\u5efa\u4e00\u4e2a\u72ec\u6709\u7684\u6587\u4ef6\u5939\u5b58\u653e\u6587\u4ef6(true/false) +ck.isOnlyUser=true + +#ckeditor config +filebrowserBrowseUrl='plug-in/ckfinder/ckfinder.html' +filebrowserImageBrowseUrl='plug-in/ckfinder/ckfinder.html?type=Images' +filebrowserFlashBrowseUrl='plug-in/ckfinder/ckfinder.html?type=Flash' +filebrowserUploadUrl='plug-in/ckfinder/core/connector/java/connector.java?command=QuickUpload&type=Files' +filebrowserImageUploadUrl='plug-in/ckfinder/core/connector/java/connector.java?command=QuickUpload&type=Images' +filebrowserFlashUploadUrl='plug-in/ckfinder/core/connector/java/connector.java?command=QuickUpload&type=Flash' + +# \u9a8c\u8bc1\u7801\u914d\u7f6e +# \u9a8c\u8bc1\u7801\u957f\u5ea6 +randCodeLength=4 +# \u9a8c\u8bc1\u7801\u7c7b\u578b\uff1a1-\u6570\u5b57\uff0c2-\u5c0f\u5199\u5b57\u6bcd\uff0c3-\u5927\u5199\u5b57\u7b26\uff0c4-\u5b57\u7b26,5-\u6df7\u5408\u5b57\u7b26\u4e32\uff0c +randCodeType=5 +#update-end--Author:zhangguoming Date:20140226 for\uff1a\u6dfb\u52a0\u9a8c\u8bc1\u7801 + +#update-start--Author:zhangguoming Date:20140901 for\uff1a\u4fee\u6539\u7f16\u7801\u957f\u5ea6\u7684\u5b9a\u4e49 +# \u7ec4\u7ec7\u7ed3\u6784\u7f16\u7801\u957f\u5ea6\u7c7b\u578b\uff1a2-\u4e24\u4f4d\u6570\u5b57\u30013-3\u4e3a\u6570\u5b57\uff0c\u5982\u679c\u7c7b\u578b\u4e0d\u662f2\u6216\u80053\uff0c\u5219\u957f\u5ea6\u9ed8\u8ba4\u4e3a\u4e24\u4f4d\uff1b +orgCodeLengthType=2 +#update-end--Author:zhangguoming Date:20140901 for\uff1a\u4fee\u6539\u7f16\u7801\u957f\u5ea6\u7684\u5b9a\u4e49 +# \u7c7b\u578b\u7ed3\u6784\u7f16\u7801\u957f\u5ea6\u7c7b\u578b\uff1a2-\u4e24\u4f4d\u6570\u5b57\u30013-3\u4f4d\u6570\u5b57\u4f9d\u6b21\u7c7b\u63a8,\u6700\u4f4e2\u4f4d +categoryCodeLengthType=2 + + +mail.smtpHost=smtp.126.com +mail.sender=anchaodaren@126.com +mail.user=anchaodaren +mail.pwd=************ + diff --git a/src/main/webapp/META-INF/MANIFEST.MF b/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 00000000..254272e1 --- /dev/null +++ b/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/src/main/webapp/WEB-INF/cgi/proxy.cgi b/src/main/webapp/WEB-INF/cgi/proxy.cgi new file mode 100644 index 00000000..c7ed6629 --- /dev/null +++ b/src/main/webapp/WEB-INF/cgi/proxy.cgi @@ -0,0 +1,80 @@ +#!/usr/bin/env python + + +"""This is a blind proxy that we use to get around browser +restrictions that prevent the Javascript from loading pages not on the +same server as the Javascript. This has several problems: it's less +efficient, it might break some sites, and it's a security risk because +people can use this proxy to browse the web and possibly do bad stuff +with it. It only loads pages via http and https, but it can load any +content type. It supports GET and POST requests.""" + +import urllib2 +import cgi +import sys, os + +# Designed to prevent Open Proxy type stuff. + +allowedHosts = ['www.openlayers.org', 'openlayers.org', + 'labs.metacarta.com', 'world.freemap.in', + 'prototype.openmnnd.org', 'geo.openplans.org', + 'sigma.openplans.org', 'demo.opengeo.org', + 'www.openstreetmap.org', 'sample.azavea.com', + 'v2.suite.opengeo.org', 'v-swe.uni-muenster.de:8080', + 'vmap0.tiles.osgeo.org', 'www.openrouteservice.org','192.168.1.241:8080'] + +method = os.environ["REQUEST_METHOD"] + +if method == "POST": + qs = os.environ["QUERY_STRING"] + d = cgi.parse_qs(qs) + if d.has_key("url"): + url = d["url"][0] + else: + url = "http://www.openlayers.org" +else: + fs = cgi.FieldStorage() + url = fs.getvalue('url', "http://www.openlayers.org") + +try: + host = url.split("/")[2] + if allowedHosts and not host in allowedHosts: + print "Status: 502 Bad Gateway" + print "Content-Type: text/plain" + print + print "This proxy does not allow you to access that location (%s)." % (host,) + print + print os.environ + + elif url.startswith("http://") or url.startswith("https://"): + + if method == "POST": + length = int(os.environ["CONTENT_LENGTH"]) + headers = {"Content-Type": os.environ["CONTENT_TYPE"]} + body = sys.stdin.read(length) + r = urllib2.Request(url, body, headers) + y = urllib2.urlopen(r) + else: + y = urllib2.urlopen(url) + + # print content type header + i = y.info() + if i.has_key("Content-Type"): + print "Content-Type: %s" % (i["Content-Type"]) + else: + print "Content-Type: text/plain" + print + + print y.read() + + y.close() + else: + print "Content-Type: text/plain" + print + print "Illegal request." + +except Exception, E: + print "Status: 500 Unexpected Error" + print "Content-Type: text/plain" + print + print "Some unexpected error occurred. Error text was:", E diff --git a/src/main/webapp/WEB-INF/lib/json.jar b/src/main/webapp/WEB-INF/lib/json.jar new file mode 100644 index 00000000..ed0bc93a Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/json.jar differ diff --git a/src/main/webapp/WEB-INF/lib/ueditor-1.1.1.jar b/src/main/webapp/WEB-INF/lib/ueditor-1.1.1.jar new file mode 100644 index 00000000..8bed6b79 Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/ueditor-1.1.1.jar differ diff --git a/src/main/webapp/WEB-INF/tld/easyui.tld b/src/main/webapp/WEB-INF/tld/easyui.tld new file mode 100644 index 00000000..5ac958d0 --- /dev/null +++ b/src/main/webapp/WEB-INF/tld/easyui.tld @@ -0,0 +1,1389 @@ + + + + 1.0 + 1.2 + t + /easyui-tags + "鑷畾涔夋爣绛" + + + mutiLang + org.jeecgframework.tag.core.easyui.MutiLangTag + JSP + 澶氳瑷杈撳嚭 + + langKey + true + true + 鎺т欢鍚嶇О + + + + langArg + false + true + 鍙傛暟 + + + + + base + org.jeecgframework.tag.core.easyui.BaseTag + JSP + 鐖剁被鏍囩鐢熸垚JS CSS + + type + true + true + 鍔犺浇绫诲瀷 + + + cssTheme + true + easyui theme锛堢洰褰 榛樿default锛 + + + + datagrid + org.jeecgframework.tag.core.easyui.DataGridTag + JSP + 鏁版嵁鍒楄〃 + + name + true + true + 鍒楄〃TABLE鏍囩ず + + + treegrid + true + 鏄惁鏄爲褰㈠垪琛 鍊间负true 鎴栬協alse + + + actionUrl + true + true + 鍒嗛〉鎻愪氦鐨勮矾寰 + + + pagination + true + 鏄惁鍒嗛〉 true,false + + + title + true + 琛ㄦ牸鏍囬 + + + idField + true + 涓婚敭瀛楁 + + + width + true + 琛ㄦ牸瀹藉害 + + + height + true + 琛ㄦ牸楂樺害 + + + checkbox + true + 鏄惁鏄剧ず澶嶉夋 + + + fit + true + 鏄惁閫傚簲鐖跺鍣,true 榛樿 ,false + + + sortName + true + 瀹氫箟鐨勫垪杩涜鎺掑簭 + + + sortOrder + true + 瀹氫箟鍒楃殑鎺掑簭椤哄簭锛屽彧鑳芥槸"閫掑 asc"鎴"闄嶅簭desc" + + + fitColumns + true + 褰撲负true鏃讹紝鑷姩灞曞紑/鍚堝悓鍒楃殑澶у皬锛屼互閫傚簲鐨勫搴︼紝闃叉妯悜婊氬姩 + + + showPageList + true + 鏄惁鏄剧ず椤甸潰鍒楄〃 + + + showRefresh + true + 鏄惁鏄剧ず鍒锋柊鎸夐挳 + + + showText + true + 鏄惁鏄剧ず鍒嗛〉淇℃伅 + + + style + true + 琛ㄦ牸鏍峰紡easyui,datatables + + + pageSize + true + 姣忛〉鏄剧ず鏉℃暟 + + + onLoadSuccess + true + 鏁版嵁鍔犺浇鎴愯皟鐢ㄦ柟娉 + + + onDblClick + true + 鍙屽嚮璋冪敤鏂规硶 + + + onClick + true + 鍗曞嚮璋冪敤鏂规硶 tree 涓媐unction(rowData),dataGrid + 涓媐unction(rowIndex,rowData) + + + queryMode + true + 鏌ヨ妯″紡锛歴ingle(鍗曟潯浠舵煡璇細榛樿),group(缁勫悎鏌ヨ) + + + autoLoadData + true + 鍒楄〃椤甸潰鏁版嵁鍔犺浇妯″紡銆倀rue鑷姩鍔犺浇鏁版嵁锛宖alse鎵嬪姩鍔犺浇锛岄粯璁や负true + + + openFirstNode + true + 鏄笉鏄睍寮绗竴涓妭鐐,鍦ㄦ爲褰㈡儏鍐典笅,true灞曞紑,false涓嶅睍寮榛樿false + + + entityName + true + 瀵瑰簲鐨勫疄浣撳璞,濡傛灉entity鍜宑ontroller閮芥槸瑙勫垯鐨勫彲浠ヤ笉濉,鑷姩琛ュ叏鏍囩鍋氬叧鑱 + + + rowStyler + true + 琛 css鍑芥暟 鎸囧畾鍚嶇О灏卞彲浠,璋冪敤涓 functionName(index,row)杩欐牱璋冪敤 + + + extendParams + true + datagrid 鐨勬墿灞曞瓧娈,濡傛灉easyui涓婇潰鏈変絾鏄痡eecg娌℃湁杩欎釜灞炴у彲浠ヨ嚜宸辨坊鍔 + 娣诲姞瑙勫垯鍜宔asyui鐨刦ield涓鑷 + + + queryBuilder + true + 鏄惁浣跨敤楂樼骇鏌ヨ鍣╰rue,false + + + + dgCol + org.jeecgframework.tag.core.easyui.DataGridColumnTag + JSP + 鍒楄〃瀛楁 + + title + true + true + 瀛楁鏍囬 + + + + langArg + false + true + 澶氳瑷鍙傛暟 + + + + field + true + true + 瀛楁鍊 + + + width + true + 瀛楁瀹藉害 + + + rowspan + true + 瀛楁璺ㄥ垪 + + + colspan + true + 瀛楁璺ㄨ + + + align + true + 鏁版嵁瀵归綈鏂瑰紡锛屽彲閫夊兼湁left,right,center + + + sortable + true + 鏄惁鎺掑簭 + + + checkbox + true + 鏄惁鏄剧ず閫夋嫨妗 + + + formatter + true + 鑷畾涔夊嚱鏁板悕绉 + + + hidden + true + 鍒楅殣钘(闅愯棌:false) + + + replace + true + 瀛楁鍊兼浛鎹(鏍煎紡 锛歰ld_new,old2_new2) + + + treefield + true + 鏍戝舰鑿滃崟瀵瑰簲瀛楁 + + + image + true + 鏄惁鏄剧ず鍥剧墖瀛楁 + + + imageSize + true + 鑷畾涔夊ぇ灏忔樉绀(鏍煎紡锛歸idth,height) + + + query + true + 鏄惁涓烘坊鍔犳煡璇㈠垪 + + + queryMode + true + 瀛楁鏌ヨ妯″紡锛歴ingle(榛樿锛氬崟瀛楁鏌ヨ),group(鑼冨洿鏌ヨ) + + + frozenColumn + false + 鏄惁鏄啺鍐诲垪銆傞粯璁alse + + + funname + false + true + 鑷畾涔夊嚱鏁 + + + url + false + true + 鑷畾涔夐摼鎺ュ湴鍧 + + + dictionary + false + true + 鏁版嵁瀛楀吀缁勭紪鐮 鎴 鑷畾涔夊瓧鍏(鏍煎紡锛氳〃鍚,缂栫爜,鏄剧ず鏂囨湰) + + + extend + false + true + 鎵╁睍灞炴(閲囩敤json鏍煎紡)鏌ヨ鐨勬椂鍊欎娇鐢 + + + style + false + true + td CSS 灞炴 + + + downloadName + true + 闄勪欢涓嬭浇 + + + autocomplete + true + 鑷姩琛ュ叏,true 鑷姩琛ュ叏,false涓嶈ˉ鍏,榛樿false 濉啓褰撳墠瀛楁 + + + extendParams + true + datagrid field 鐨勬墿灞曞瓧娈,濡傛灉easyui涓婇潰鏈変絾鏄痡eecg娌℃湁杩欎釜灞炴у彲浠ヨ嚜宸辨坊鍔 + 娣诲姞瑙勫垯鍜宔asyui鐨刦ield涓鑷 + + + popup + true + 鏄惁鍚敤popup妯″紡 + + + + dgDelOpt + org.jeecgframework.tag.core.easyui.DataGridDelOptTag + JSP + 鍒楄〃鍒犻櫎鎿嶄綔 + + url + true + true + 鍒楄〃鎿嶄綔URL + + + title + true + true + 鎿嶄綔鏍囬 + + + + langArg + false + true + 澶氳瑷鍙傛暟 + + + + message + true + 璇㈤棶鍐呭 + + + exp + true + 鏄惁鏄剧ず鏀归摼鎺ョ殑琛ㄨ揪寮,渚 瀛楁鍚#琛ㄨ揪寮忕鍙#瀛楁鍊(name#eq#admin) + 琛ㄨ揪寮忕被鍨嬫敮鎸乪q,ne,empty + + + funname + true + 鑷畾涔夊嚱鏁板悕绉 + + + operationCode + true + 鎸夐挳鎿嶄綔Code + + + + dgDefOpt + org.jeecgframework.tag.core.easyui.DataGridDefOptTag + JSP + 鍒楄〃URL鎿嶄綔 + + url + true + true + 鍒楄〃鎿嶄綔URL + + + title + true + true + 鎿嶄綔鏍囬 + + + exp + true + 鏄惁鏄剧ず鏀归摼鎺ョ殑琛ㄨ揪寮,渚 瀛楁鍚#琛ㄨ揪寮忕鍙#瀛楁鍊(name#eq#admin) + 琛ㄨ揪寮忕被鍨嬫敮鎸乪q,ne,empty + + + operationCode + true + 鎸夐挳鎿嶄綔Code + + + + dgOpenOpt + org.jeecgframework.tag.core.easyui.DataGridOpenOptTag + JSP + 寮瑰嚭绐楁ā寮忔搷浣 + + url + true + true + 鍒楄〃鎿嶄綔URL + + + title + true + true + 鎿嶄綔鏍囬 + + + width + true + 寮瑰嚭绐楀搴 + + + height + true + 寮瑰嚭绐楅珮搴 + + + exp + true + 鏄惁鏄剧ず鏀归摼鎺ョ殑琛ㄨ揪寮,渚 瀛楁鍚#琛ㄨ揪寮忕鍙#瀛楁鍊(name#eq#admin) + 琛ㄨ揪寮忕被鍨嬫敮鎸乪q,ne,empty + + + operationCode + true + 鎸夐挳鎿嶄綔Code + + + openModel + true + 寮瑰嚭鏂瑰紡[OpenWin/OpenTab] + + + + dgFunOpt + org.jeecgframework.tag.core.easyui.DataGridFunOptTag + JSP + 鍒楄〃鑷畾涔夊嚱鏁版搷浣 + + title + true + true + 鎿嶄綔鏍囬 + + + + langArg + false + true + 澶氳瑷鍙傛暟 + + + + exp + true + 鏄惁鏄剧ず鏀归摼鎺ョ殑琛ㄨ揪寮,渚 瀛楁鍚#琛ㄨ揪寮忕鍙#瀛楁鍊(name#eq#admin) + 琛ㄨ揪寮忕被鍨嬫敮鎸乪q,ne,empty + + + funname + true + true + 鑷畾涔夊嚱鏁板悕绉(鍙紶鍑轰换鎰忓瓧娈) + + + operationCode + true + 鎸夐挳鎿嶄綔Code + + + + dgToolBar + org.jeecgframework.tag.core.easyui.DataGridToolBarTag + JSP + 鍒楄〃宸ュ叿鏉℃爣绛 + + url + true + 宸ュ叿鏉¢夐」URL + + + icon + true + 宸ュ叿鏉¢夐」鍥炬爣 + + + + title + true + true + 宸ュ叿鏉¢夐」鏍囬 + + + + langArg + false + true + 澶氳瑷鍙傛暟 + + + + funname + true + 宸ュ叿鏉¢夐」鑷畾涔夊嚱鏁 + + + width + true + 寮瑰嚭妗嗗搴 + + + height + true + 寮瑰嚭妗嗛珮搴 + + + onclick + true + 宸ュ叿鏉¢夐」onclick浜嬩欢 + + + operationCode + true + 鎸夐挳鎿嶄綔Code + + + + dgConfOpt + org.jeecgframework.tag.core.easyui.DataGridConfOptTag + JSP + 鍒楄〃璇㈤棶鎿嶄綔 + + url + true + true + 鍒楄〃鎿嶄綔URL + + + title + true + true + 鎿嶄綔鏍囬 + + + exp + true + 鏄惁鏄剧ず鏀归摼鎺ョ殑琛ㄨ揪寮,渚 瀛楁鍚#琛ㄨ揪寮忕鍙#瀛楁鍊(name#eq#admin) + 琛ㄨ揪寮忕被鍨嬫敮鎸乪q,ne,empty + + + message + true + true + 璇㈤棶鍐呭 + + + operationCode + true + 鎸夐挳鎿嶄綔Code + + + + comboBox + org.jeecgframework.tag.core.easyui.ComboBoxTag + JSP + 涓嬫媺閫夋嫨妗 + + name + true + true + 鎺т欢鍚嶇О + + + url + true + true + 杩滅▼鏁版嵁 + + + id + true + true + ID瀵瑰簲瀛楁 + + + text + true + true + text瀵瑰簲瀛楁 + + + width + true + width瀵瑰簲瀛楁 + + + listWidth + true + listWidth瀵瑰簲瀛楁 + + + listHeight + true + listHeight瀵瑰簲瀛楁 + + + + comboTree + org.jeecgframework.tag.core.easyui.ComboTreeTag + JSP + 涓嬫媺鏍戝舰閫夋嫨妗 + + name + true + true + 鎺т欢鍚嶇О + + + url + true + true + 杩滅▼鏁版嵁 + + + id + true + true + ID瀵瑰簲瀛楁 + + + width + true + width瀵瑰簲瀛楁 + + + value + true + + + + multiple + true + 鏄惁澶氶 + + + + tabs + org.jeecgframework.tag.core.easyui.TabsTag + JSP + 閫夐」鍗℃爣绛 + + id + true + true + 瀹瑰櫒ID + + + width + true + 瀹藉害 + + + heigth + true + 楂樺害 + + + plain + true + 濡傛灉璁剧疆涓簍rue锛屽皢涓嶆樉绀烘帶鍒堕潰鏉胯儗鏅 + + + fit + true + 璁剧疆涓簍rue鏃讹紝閫夐」鍗$殑澶у皬灏嗛摵婊″畠鎵鍦ㄧ殑瀹瑰櫒锛堟祻瑙堝櫒锛 + + + border + true + 濡傛灉璁剧疆true锛屽皢鏄剧ず閫夐」鍗℃墍鍦ㄥ鍣紙鎺у埗闈㈡澘锛夌殑杈规 + + + scrollIncrement + true + 閫夐」鍗℃粴鍔ㄦ潯姣忔婊氬姩鐨勫儚绱犲 + + + scrollDuration + true + 姣忔婊氬姩鎸佺画鐨勬椂闂达紝鍗曚綅涓烘绉 + + + tools + true + 鎺у埗闈㈡澘鍙充晶鐨勫伐鍏锋爮锛屾瘡涓伐鍏烽夐」閮借窡閾炬帴鎸夐挳涓鏍 + + + tabs + true + 鏄惁鍒涘缓鐖跺鍣 + + + iframe + true + 鏄惁鏄疘frame鍒涘缓HREF + + + tabPosition + true + 閫夐」鍗′綅缃(top,left,right,bottom) + + + + tab + org.jeecgframework.tag.core.easyui.TabTag + JSP + 閫夐」鍗¢夐」鏍囩 + + id + true + true + ID瀵瑰簲瀛楁 + + + title + true + true + tab鏍囬 + + + heigth + true + tab楂樺害 + + + width + true + 瀹藉害 + + + href + true + href + + + iframe + true + ID瀵瑰簲瀛楁 + + + icon + true + 閫夐」鍗″浘鏍 + + + closable + true + 閫夐」鍗℃槸鍚﹀甫鍏抽棴鎸夐挳 + + + + upload + org.jeecgframework.tag.core.easyui.UploadTag + JSP + 閫夐」鍗¢夐」鏍囩 + + id + true + true + ID瀵瑰簲瀛楁 + + + name + true + true + 鎺т欢鍚嶇О + + + formData + true + 鍚庡彴鎺ュ彈鐨勫弬鏁,鍙栨帶浠禝D + + + uploader + true + true + uploader + + + extend + true + true + 涓婁紶鏂囦欢鎵╁睍鍚(鍙夌被鍨嬬粍1,鍥剧墖锛歱ic,2,鏂囨。锛歰ffice) + + + buttonText + false + true + 鎺т欢鏄剧ず鏂囨湰 + + + multi + false + true + 鏄惁澶氭枃浠朵笂浼 + + + queueID + false + true + 鏂囦欢瀹瑰櫒ID + + + dialog + false + true + 鏄惁鏄脊鍑虹獥鍙fā寮 + + + callback + false + 鍥炶皟鍑芥暟 + + + auto + false + 鏄惁鑷姩涓婁紶 + + + onUploadSuccess + false + 涓婁紶鎴愬姛澶勭悊鍑芥暟 + + + view + false + 鏄惁鐢熸垚鏌ョ湅鍒犻櫎閾炬帴榛樿false,濡備负true闇瑕佸湪鍚庡彴杩斿洖JSON涓坊鍔犳煡鐪嬪弬鏁(viewhref)鍜屽垹闄ゅ弬鏁(delurl) + + + formId + true + 鍚庡彴鎺ュ彈琛ㄥ崟id, 涓嶅彲涓巉ormData鍚屾椂浣跨敤 + + + + ckfinder + org.jeecgframework.tag.core.easyui.CkfinderTag + JSP + ckfinder鏍囩 + + name + true + true + 灞炴у悕绉 + + + value + true + 榛樿鍊 + + + width + false + 鏄剧ず鍥剧墖瀹(涓婁紶绫诲瀷涓篒mages鏃) + + + height + false + 鏄剧ず鍥剧墖楂(涓婁紶绫诲瀷涓篒mages鏃) + + + buttonClass + false + 鎸夐挳鏍峰紡 + + + buttonValue + false + 鎸夐挳鏂囨湰 + + + uploadType + true + false + 涓婁紶绫诲瀷(Images,Files,Flash) + + + + ckeditor + org.jeecgframework.tag.core.easyui.CkeditorTag + JSP + ckeditor鏍囩 + + name + true + true + 灞炴у悕绉 + + + value + true + 榛樿鍊 + + + isfinder + true + false + 鏄惁鍔犺浇ckfinder + + + type + false + 鍏跺畠灞炴(鐢ㄦ硶:height:400,uiColor:'#9AB8F3' 鐢,鍒嗗壊) + + + + formvalid + org.jeecgframework.tag.core.easyui.FormValidationTag + JSP + 琛ㄥ崟楠岃瘉鏍囩 + + action + true + 琛ㄥ崟鎻愪氦璺緞 + + + formid + true + true + Form Id + + + refresh + false + 鏄惁鍒锋柊鐖堕〉闈 + + + callback + false + 鍥炶皟鍑芥暟 + + + beforeSubmit + false + 鎻愪氦涔嬪墠澶勭悊鍑芥暟 + + + btnsub + false + 瑙﹀彂鎻愪氦浜嬩欢鎸夐挳(榛樿鍊硷細btn_sub) + + + btnreset + false + 瑙﹀彂琛ㄥ崟閲嶇疆浜嬩欢鎸夐挳(榛樿鍊硷細btn_reset) + + + layout + true + false + 琛ㄥ崟甯冨眬 + + + usePlugin + false + 澶栬皟鎻掍欢(鍙夋彃浠,jqtransform:琛ㄥ崟缇庡寲) + + + dialog + true + true + 鏄惁鏄脊鍑虹獥鍙fā寮 + + + tabtitle + false + true + 琛ㄥ崟閫夐」鍗″垎缁勬爣棰 + + + tiptype + false + true + 琛ㄥ崟鏍¢獙鎻愮ず鏂瑰紡 1:寮瑰嚭鏂瑰紡,2-4锛氫晶杈规彁绀 + + + styleClass + false + true + css class + + + cssTheme + false + true + formdiv.css涓婚鐩綍 + + + + + choose + org.jeecgframework.tag.core.easyui.ChooseTag + JSP + 111 + 閫夊垯鎿嶄綔 + + hiddenName + true + 闅愯棌鍩熸帶浠剁殑ID + + + hiddenid + true + 闅愯棌鍩熸帶浠跺湪寮瑰嚭鍒楄〃涓殑瀵瑰簲瀛楁 + + + textname + true + 鏄剧ず鍩熸帶浠跺湪寮瑰嚭鍒楄〃涓殑瀵瑰簲瀛楁 + + + inputTextname + true + 鏄剧ず鍩熸帶浠剁殑ID + + + name + true + true + datagrid鍚嶇О + + + icon + true + true + 閫夋嫨鎸夐挳鐨勫浘鏍 + + + height + true + 寮瑰嚭妗嗙殑瀹藉害 + + + width + true + 寮瑰嚭妗嗙殑楂樺害 + + + left + true + 寮瑰嚭妗嗙殑浣嶇疆 + + + top + true + 寮瑰嚭妗嗙殑浣嶇疆 + + + url + true + true + url + + + title + true + true + 鏍囬 + + + + langArg + false + true + 澶氳瑷鍙傛暟 + + + + isclear + true + 鏍囬 + + + fun + true + 鑷畾涔夊嚱鏁 + + + isInit + true + 鏄惁浼犲叆鍒濆鍖栧 + + + + + colorchange + org.jeecgframework.tag.core.easyui.ColorChangeTag + JSP + 鏀瑰彉HTML鎺т欢棰滆壊 + 111 + 鏀瑰彉HTML鎺т欢棰滆壊 + + + + menu + org.jeecgframework.tag.core.easyui.MenuTag + JSP + 宸︿晶鑿滃崟鐢熸垚鎺т欢 + 111 + 宸︿晶鑿滃崟鐢熸垚鎺т欢鍙夋牱寮廵asyui,bootstrap,json + + style + true + 鑿滃崟鏍峰紡 + + + parentFun + false + true + 涓绾ц彍鍗 + + + childFun + false + true + 浜岀骇鑿滃崟 + + + menuFun + false + true + 鑿滃崟淇℃伅 + + + + + autocomplete + org.jeecgframework.tag.core.easyui.AutocompleteTag + JSP + 鑷姩瀹屾垚鎺т欢 + 111 + 鏁版嵁鑷姩琛ュ叏 + + name + true + true + 鎺т欢鍚嶇О + + + entityName + true + true + 鏁版嵁婧愬搴斿疄浣 + + + dataSource + false + true + 鏁版嵁婧 + + + minLength + false + true + 鎻愮ず瑙﹀彂鏂囧瓧闀垮害 + + + labelField + true + true + 鏄剧ず鏂囨湰瀵瑰簲鐨勫疄浣撳瓧娈 + + + valueField + true + true + 鍙栧煎瓧娈靛搴斿疄浣撳瓧娈 + + + label + false + true + 浼犲叆鏄剧ず鏂囨湰 + + + value + false + true + 浼犲叆闅愯棌鍩熷 + + + searchField + true + true + 鏌ヨ鍏抽敭瀛楀搴斿疄浣撳瓧娈 + + + selectfun + false + true + 涓嬫媺閫夋嫨浜嬩欢璋冪敤鍑芥暟 + + + closefun + false + true + 涓嬫媺閫夐」鍏抽棴璋冪敤鍑芥暟 + + + datatype + false + true + 鏁版嵁绫诲瀷 + + + nullmsg + false + true + 鏁版嵁涓虹┖鏃舵彁绀 + + + errormsg + false + true + 鏁版嵁鏍煎紡閿欒鏃舵彁绀 + + + parse + false + true + 杞崲鏁版嵁 + + + formatItem + false + true + 鏍煎紡鍖栬鏄剧ず鐨勬暟鎹 + + + result + false + true + 閫夋嫨鍚庡洖璋冩柟娉 + + + maxRows + false + true + 鏈澶氭樉绀烘潯鏁 + + + + + dictSelect + org.jeecgframework.tag.core.easyui.DictSelectTag + JSP + 涓嬫媺閫夋嫨鎺т欢 + 111 + 涓嬫媺閫夋嫨鎺т欢 + + typeGroupCode + false + true + 鏁版嵁瀛楀吀绫诲瀷缂栫爜 + + + field + true + true + SELECT琛ㄥ崟鐨凬ame + + + extendJson + false + true + 鎵╁睍鍙傛暟(json鏍煎紡) + + + id + false + true + SELECT琛ㄥ崟鐨処d + + + defaultVal + false + true + 榛樿閫夋嫨鐨刅alue + + + divClass + false + true + DIV鏍峰紡 + + + labelClass + false + true + Label鏍峰紡 + + + title + false + true + Label鏄剧ず鍊 + + + hasLabel + true + 鏄惁鏄剧ずLabel + + + type + true + 鎺т欢鏍煎紡 select|radio|checkbox + + + + dictTable + true + 鑷畾涔夊瓧鍏歌〃 + + + dictField + true + 鑷畾涔夊瓧鍏歌〃鐨勫尮閰嶅瓧娈-瀛楀吀鐨勭紪鐮佸 + + + dictText + true + 鑷畾涔夊瓧鍏歌〃鐨勬樉绀烘枃鏈-瀛楀吀鐨勬樉绀哄 + + + dictCondition + true + 鑷畾涔夊瓧鍏歌〃鐨勬樉绀烘枃鏈-瀛楀吀鏌ヨ鏉′欢 + + + + + authFilter + org.jeecgframework.tag.core.easyui.AuthFilterTag + JSP + 鎸夐挳鏉冮檺鏍囩 + 灏嗗綋鍓嶇敤鎴峰搴旇彍鍗曚腑涓嶆嫢鏈夋寜閽潈闄愮殑鎸夐挳鍜屾搷浣滈殣钘 + + name + true + 鎸夐挳瀹瑰櫒鐨処D + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..3271d6eb --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,213 @@ + + + jeecg-framework-3.5.2 + + webAppRootKey + jeecg + + + log4jConfigLocation + classpath:log4j.properties + + + org.springframework.web.util.Log4jConfigListener + + + contextConfigLocation + classpath:spring-*.xml + + + openSessionInViewFilter + org.springframework.orm.hibernate4.support.OpenSessionInViewFilter + + singleSession + true + + + + openSessionInViewFilter + *.do + + + 瀛楃闆嗚繃婊ゅ櫒 + encodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + 瀛楃闆嗙紪鐮 + encoding + UTF-8 + + + + encodingFilter + /* + + + druidWebStatFilter + com.alibaba.druid.support.http.WebStatFilter + + exclusions + /css/*,/context/*,/plug-in/*,*.js,*.css,*/druid*,/attached/*,*.jsp + + + principalSessionName + sessionInfo + + + profileEnable + true + + + + druidWebStatFilter + /* + + + spring鐩戝惉鍣 + org.springframework.web.context.ContextLoaderListener + + + Introspector缂撳瓨娓呴櫎鐩戝惉鍣 + org.springframework.web.util.IntrospectorCleanupListener + + + request鐩戝惉鍣 + org.springframework.web.context.request.RequestContextListener + + + 绯荤粺鍒濆鍖栫洃鍚櫒 + org.jeecgframework.web.system.listener.InitListener + + + + + org.jeecgframework.web.system.listener.OnlineListener + + + + spring mvc servlet + springMvc + org.springframework.web.servlet.DispatcherServlet + + spring mvc 閰嶇疆鏂囦欢 + contextConfigLocation + classpath:spring-mvc.xml + + 1 + + + springMvc + *.do + + + druidStatView + com.alibaba.druid.support.http.StatViewServlet + + + springMvc + *.action + + + + + restSpringMvc + org.springframework.web.servlet.DispatcherServlet + + spring mvc 閰嶇疆鏂囦欢 + contextConfigLocation + classpath:spring-mvc.xml + + + + restSpringMvc + /rest/* + + + + druidStatView + /webpage/system/druid/* + + + + + ConnectorServlet + com.ckfinder.connector.ConnectorServlet + + XMLConfig + /WEB-INF/classes/CKfinderConfig.xml + + + debug + false + + + + configuration + org.jeecgframework.web.system.listener.CkfinderConfiguration + + 2 + + + ConnectorServlet + /plug-in/ckfinder/core/connector/java/connector.java + + + + RandCodeImage + org.jeecgframework.web.system.servlet.RandCodeImageServlet + + + RandCodeImage + /randCodeImage + + + + + FileUploadFilter + com.ckfinder.connector.FileUploadFilter + + sessionCookieName + jsessionid + + + sessionParameterName + JSESSIONID + + + + FileUploadFilter + /plug-in/ckfinder/core/connector/java/connector.java + + + + + + + ecsideExport + org.jeecgframework.core.aop.GZipFilter + + + ecsideExport + * + + + + + 404 + /webpage/common/404.jsp + + + + + + 30 + + + + /webpage/login/login.jsp + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/weblogic.xml b/src/main/webapp/WEB-INF/weblogic.xml new file mode 100644 index 00000000..48249182 --- /dev/null +++ b/src/main/webapp/WEB-INF/weblogic.xml @@ -0,0 +1,6 @@ + + + + true + + \ No newline at end of file diff --git a/src/main/webapp/context/mytags.jsp b/src/main/webapp/context/mytags.jsp new file mode 100644 index 00000000..e9a18304 --- /dev/null +++ b/src/main/webapp/context/mytags.jsp @@ -0,0 +1,9 @@ +<%@ taglib prefix="t" uri="/easyui-tags"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt"%> +<% +String path = request.getContextPath(); +String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path; +%> + \ No newline at end of file diff --git a/src/main/webapp/export/template/exportTemp.xls b/src/main/webapp/export/template/exportTemp.xls new file mode 100644 index 00000000..649d33ac Binary files /dev/null and b/src/main/webapp/export/template/exportTemp.xls differ diff --git a/src/main/webapp/export/template/test.docx b/src/main/webapp/export/template/test.docx new file mode 100644 index 00000000..d8588840 Binary files /dev/null and b/src/main/webapp/export/template/test.docx differ diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 00000000..c38169bb --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,5 @@ + + +

    Hello World!

    + + diff --git a/src/main/webapp/init.jsp b/src/main/webapp/init.jsp new file mode 100644 index 00000000..fc0ab7af --- /dev/null +++ b/src/main/webapp/init.jsp @@ -0,0 +1,25 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@include file="/context/mytags.jsp"%> + + + +鏁版嵁搴撳垵濮嬪寲涓..... + + + +<%--update-end--Author:zhangguoming Date:20140609 for锛氫簯妗岄潰锛屾竻闄ゆ闈㈠浘鏍囩殑cookie鍘嗗彶璁板綍--%> + + + +JEECG 鍒濆鍖栨暟鎹簱 + + diff --git a/src/main/webapp/plug-in/Flexpaper/FlexPaperViewer.swf b/src/main/webapp/plug-in/Flexpaper/FlexPaperViewer.swf new file mode 100644 index 00000000..df296e78 Binary files /dev/null and b/src/main/webapp/plug-in/Flexpaper/FlexPaperViewer.swf differ diff --git a/src/main/webapp/plug-in/Flexpaper/flexpaper_flash.js b/src/main/webapp/plug-in/Flexpaper/flexpaper_flash.js new file mode 100644 index 00000000..0edc9a2a --- /dev/null +++ b/src/main/webapp/plug-in/Flexpaper/flexpaper_flash.js @@ -0,0 +1,449 @@ +window.$FlexPaper = window["$FlexPaper"] = function(){ + if (window['flexpaper']) + return window['flexpaper']; + else + window['flexpaper'] = window.FlexPaperViewer_Instance.getApi(); + + return window['flexpaper']; +}; + +/** +* +* FlexPaper constructor (name of swf, name of placeholder, config) +* +*/ +window.FlexPaperViewer = window.$f = function() { + var config = arguments[2].config; + + window.FlexPaperViewer_Instance = flashembed(arguments[1], { + + src: arguments[0]+".swf", + version: [10, 0], + expressInstall: "js/expressinstall.swf" + },{ + SwfFile : config.SwfFile, + Scale : config.Scale, + ZoomTransition : config.ZoomTransition, + ZoomTime : config.ZoomTime, + ZoomInterval : config.ZoomInterval, + FitPageOnLoad : config.FitPageOnLoad, + FitWidthOnLoad : config.FitWidthOnLoad, + FullScreenAsMaxWindow : config.FullScreenAsMaxWindow, + ProgressiveLoading : config.ProgressiveLoading, + MinZoomSize : config.MinZoomSize, + MaxZoomSize : config.MaxZoomSize, + SearchMatchAll : config.SearchMatchAll, + SearchServiceUrl : config.SearchServiceUrl, + InitViewMode : config.InitViewMode, + BitmapBasedRendering : config.BitmapBasedRendering, + StartAtPage : config.StartAtPage, + PrintPaperAsBitmap : config.PrintPaperAsBitmap, + AutoAdjustPrintSize : config.AutoAdjustPrintSize, + + ViewModeToolsVisible : config.ViewModeToolsVisible, + ZoomToolsVisible : config.ZoomToolsVisible, + NavToolsVisible : config.NavToolsVisible, + CursorToolsVisible : config.CursorToolsVisible, + SearchToolsVisible : config.SearchToolsVisible, + + RenderingOrder : config.RenderingOrder, + + localeChain : config.localeChain, + key : config.key + }); +}; + + + +/** + * Handles the event of external links getting clicked in the document. + * + * @example onExternalLinkClicked("http://www.google.com") + * + * @param String link + */ +function onExternalLinkClicked(link){ + // alert("link " + link + " clicked" ); + window.location.href = link; +} + +/** + * Recieves progress information about the document being loaded + * + * @example onProgress( 100,10000 ); + * + * @param int loaded + * @param int total + */ +function onProgress(loadedBytes,totalBytes){ +} + +/** + * Handles the event of a document is in progress of loading + * + */ +function onDocumentLoading(){ +} + +/** + * Receives messages about the current page being changed + * + * @example onCurrentPageChanged( 10 ); + * + * @param int pagenum + */ +function onCurrentPageChanged(pagenum){ +} + +/** + * Receives messages about the document being loaded + * + * @example onDocumentLoaded( 20 ); + * + * @param int totalPages + */ +function onDocumentLoaded(totalPages){ +} + +/** + * Handles the event of a document is in progress of loading + * + */ +function onPageLoading(pageNumber){ +} + +/** + * Receives messages about the page loaded + * + * @example onPageLoaded( 1 ); + * + * @param int pageNumber + */ +function onPageLoaded(pageNumber){ +} + +/** + * Receives error messages when a document is not loading properly + * + * @example onDocumentLoadedError( "Network error" ); + * + * @param String errorMessage + */ +function onDocumentLoadedError(errMessage){ +} + +/** + * Receives error messages when a document has finished printed + * + * @example onDocumentPrinted(); + * + */ +function onDocumentPrinted(){ +} + + + +/** + * + * FlexPaper embedding functionality. Based on FlashEmbed + * + */ + +(function() { + + var IE = document.all, + URL = 'http://www.adobe.com/go/getflashplayer', + JQUERY = typeof jQuery == 'function', + RE = /(\d+)[^\d]+(\d+)[^\d]*(\d*)/, + GLOBAL_OPTS = { + // very common opts + width: '100%', + height: '100%', + id: "_" + ("" + Math.random()).slice(9), + + // flashembed defaults + allowfullscreen: true, + allowscriptaccess: 'always', + quality: 'high', + + // flashembed specific options + version: [3, 0], + onFail: null, + expressInstall: null, + w3c: false, + cachebusting: false + }; + + if(IE){GLOBAL_OPTS.cachebusting=true;} + + // version 9 bugfix: (http://blog.deconcept.com/2006/07/28/swfobject-143-released/) + if (window.attachEvent) { + window.attachEvent("onbeforeunload", function() { + __flash_unloadHandler = function() {}; + __flash_savedUnloadHandler = function() {}; + }); + } + + // simple extend + function extend(to, from) { + if (from) { + for (var key in from) { + if (from.hasOwnProperty(key)) { + to[key] = from[key]; + } + } + } + return to; + } + + // used by asString method + function map(arr, func) { + var newArr = []; + for (var i in arr) { + if (arr.hasOwnProperty(i)) { + newArr[i] = func(arr[i]); + } + } + return newArr; + } + + window.flashembed = function(root, opts, conf) { + + // root must be found / loaded + if (typeof root == 'string') { + root = document.getElementById(root.replace("#", "")); + } + + // not found + if (!root) { return; } + + root.onclick = function(){return false;} + + if (typeof opts == 'string') { + opts = {src: opts}; + } + + return new Flash(root, extend(extend({}, GLOBAL_OPTS), opts), conf); + }; + + // flashembed "static" API + var f = extend(window.flashembed, { + + conf: GLOBAL_OPTS, + + getVersion: function() { + var fo, ver; + + try { + ver = navigator.plugins["Shockwave Flash"].description.slice(16); + } catch(e) { + + try { + fo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); + ver = fo && fo.GetVariable("$version"); + + } catch(err) { + try { + fo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); + ver = fo && fo.GetVariable("$version"); + } catch(err2) { } + } + } + + ver = RE.exec(ver); + return ver ? [ver[1], ver[3]] : [0, 0]; + }, + + asString: function(obj) { + + if (obj === null || obj === undefined) { return null; } + var type = typeof obj; + if (type == 'object' && obj.push) { type = 'array'; } + + switch (type){ + + case 'string': + obj = obj.replace(new RegExp('(["\\\\])', 'g'), '\\$1'); + + // flash does not handle %- characters well. transforms "50%" to "50pct" (a dirty hack, I admit) + obj = obj.replace(/^\s?(\d+\.?\d+)%/, "$1pct"); + return '"' +obj+ '"'; + + case 'array': + return '['+ map(obj, function(el) { + return f.asString(el); + }).join(',') +']'; + + case 'function': + return '"function()"'; + + case 'object': + var str = []; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + str.push('"'+prop+'":'+ f.asString(obj[prop])); + } + } + return '{'+str.join(',')+'}'; + } + + // replace ' --> " and remove spaces + return String(obj).replace(/\s/g, " ").replace(/\'/g, "\""); + }, + + getHTML: function(opts, conf) { + + opts = extend({}, opts); + + /******* OBJECT tag and it's attributes *******/ + var html = ''; + } + + // not allowed params + opts.width = opts.height = opts.id = opts.w3c = opts.src = null; + opts.onFail = opts.version = opts.expressInstall = null; + + for (var key in opts) { + if (opts[key]) { + html += ''; + } + } + + /******* FLASHVARS *******/ + var vars = ""; + + if (conf) { + for (var k in conf) { + if (conf[k]) { + var val = conf[k]; + vars += k +'='+ (/function|object/.test(typeof val) ? f.asString(val) : val) + '&'; + } + } + vars = vars.slice(0, -1); + html += ''; + } + + html += ""; + + return html; + }, + + isSupported: function(ver) { + return VERSION[0] > ver[0] || VERSION[0] == ver[0] && VERSION[1] >= ver[1]; + } + + }); + + var VERSION = f.getVersion(); + + function Flash(root, opts, conf) { + + // version is ok + if (f.isSupported(opts.version)) { + root.innerHTML = f.getHTML(opts, conf); + + // express install + } else if (opts.expressInstall && f.isSupported([6, 65])) { + root.innerHTML = f.getHTML(extend(opts, {src: opts.expressInstall}), { + MMredirectURL: location.href, + MMplayerType: 'PlugIn', + MMdoctitle: document.title + }); + + } else { + + // fail #2.1 custom content inside container + if (!root.innerHTML.replace(/\s/g, '')) { + /* root.innerHTML = + "

    Flash version " + opts.version + " or greater is required

    " + + "

    " + + (VERSION[0] > 0 ? "Your version is " + VERSION : "You have no flash plugin installed") + + "

    " + + + (root.tagName == 'A' ? "

    Click here to download latest version

    " : + "

    Download latest version from here

    "); + */ + var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); + + root.innerHTML = "Get Adobe Flash player"; + + if (root.tagName == 'A') { + root.onclick = function() { + location.href = URL; + }; + } + } + + // onFail + if (opts.onFail) { + var ret = opts.onFail.call(this); + if (typeof ret == 'string') { root.innerHTML = ret; } + } + } + + // http://flowplayer.org/forum/8/18186#post-18593 + if (IE) { + window[opts.id] = document.getElementById(opts.id); + } + + // API methods for callback + extend(this, { + + getRoot: function() { + return root; + }, + + getOptions: function() { + return opts; + }, + + + getConf: function() { + return conf; + }, + + getApi: function() { + return root.firstChild; + } + + }); + } + + // setup jquery support + if (JQUERY) { + + // tools version number + jQuery.tools = jQuery.tools || {version: '1.2.5'}; + + jQuery.tools.flashembed = { + conf: GLOBAL_OPTS + }; + + jQuery.fn.flashembed = function(opts, conf) { + return this.each(function() { + $(this).data("flashembed", flashembed(this, opts, conf)); + }); + }; + } + +})(); \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/bootstrap-ie.js b/src/main/webapp/plug-in/Formdesign/js/bootstrap-ie.js new file mode 100644 index 00000000..9043eb9e --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/bootstrap-ie.js @@ -0,0 +1,416 @@ +(function($) { + $.eb = $.eb || {}; + + // $.eb.ie = function (min,max) { + // // return true; + // if ($.browser.msie) { + // var v = Math.floor($.browser.version); + // if (v >= min && v <= max) { + // return true; + // } + // } + // return false; + // } + $.eb.ie6 = function () { + return navigator.userAgent.toLowerCase().indexOf('msie 6.0') > -1; + // alert(navigator.userAgent.toLowerCase().indexOf('msie 6.0')); + } + + + $.eb.color = function () { + var pad = function(num, totalChars) { + var pad = '0'; + num = num + ''; + while (num.length < totalChars) { + num = pad + num; + } + return num; + }; + + // Ratio is between 0 and 1 + this.changeColor = function(color, ratio, darker) { + // Trim trailing/leading whitespace + color = color.replace(/^\s*|\s*$/, ''); + + // Expand three-digit hex + color = color.replace( + /^#?([a-f0-9])([a-f0-9])([a-f0-9])$/i, + '#$1$1$2$2$3$3' + ); + + // Calculate ratio + var difference = Math.round(ratio * 256) * (darker ? -1 : 1), + // Determine if input is RGB(A) + rgb = color.match(new RegExp('^rgba?\\(\\s*' + + '(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])' + + '\\s*,\\s*' + + '(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])' + + '\\s*,\\s*' + + '(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])' + + '(?:\\s*,\\s*' + + '(0|1|0?\\.\\d+))?' + + '\\s*\\)$' + , 'i')), + alpha = !!rgb && rgb[4] != null ? rgb[4] : null, + + // Convert hex to decimal + decimal = !!rgb? [rgb[1], rgb[2], rgb[3]] : color.replace( + /^#?([a-f0-9][a-f0-9])([a-f0-9][a-f0-9])([a-f0-9][a-f0-9])/i, + function() { + return parseInt(arguments[1], 16) + ',' + + parseInt(arguments[2], 16) + ',' + + parseInt(arguments[3], 16); + } + ).split(/,/), + returnValue; + + // Return RGB(A) + return !!rgb ? + 'rgb' + (alpha !== null ? 'a' : '') + '(' + + Math[darker ? 'max' : 'min']( + parseInt(decimal[0], 10) + difference, darker ? 0 : 255 + ) + ', ' + + Math[darker ? 'max' : 'min']( + parseInt(decimal[1], 10) + difference, darker ? 0 : 255 + ) + ', ' + + Math[darker ? 'max' : 'min']( + parseInt(decimal[2], 10) + difference, darker ? 0 : 255 + ) + + (alpha !== null ? ', ' + alpha : '') + + ')' : + // Return hex + [ + '#', + pad(Math[darker ? 'max' : 'min']( + parseInt(decimal[0], 10) + difference, darker ? 0 : 255 + ).toString(16), 2), + pad(Math[darker ? 'max' : 'min']( + parseInt(decimal[1], 10) + difference, darker ? 0 : 255 + ).toString(16), 2), + pad(Math[darker ? 'max' : 'min']( + parseInt(decimal[2], 10) + difference, darker ? 0 : 255 + ).toString(16), 2) + ].join(''); + }; + this.lighten = function(color, ratio) { + return changeColor(color, ratio, false); + }; + this.darken = function(color, ratio) { + return changeColor(color, ratio, true); + }; + return this; + }(); + + + function bootstrapIE6(el) { + var dropdownWidthFix = function (el) { + el.each(function () { + var w = 0; + $(this).children('li').each(function() { + var aw = $(this).outerWidth(); + if (aw > w) w = aw; + }); + + $(this).width(w); + }); + } + + if ($.eb.ie6()) { + el = el || $('html'); + + //------------- + // GRID + //------------- + + //------------- + // dropdown + //------------- + // fix for IE6 not support li:hover + var i, lis = ['dropdown-submenu']; + for (i = 0; i < lis.length; i++) { + var child = 'li.' + lis[i]; + var hover = lis[i] + '-hover'; + $('ul', el).on('mouseenter', child, function () { + $(this).addClass(hover); + }).on('mouseleave', child, function () { + $(this).removeClass(hover); + }); + } + + /// fix :after selector -- dropdown-submenu > a:after + $('.dropdown-submenu > a', el).after(''); + + /// fix multi class selector -- .dropdown-submenu.pull-left + $('.dropdown-submenu.pull-left', el).removeClass('pull-left').addClass('dropdown-submenu-pull-left'); + // $('.navbar .nav.pull-right').removeClass('pull-right').addClass('nav-pull-right'); + + /// fix ul li 100% width bug, set ul width to max width of it's sub li + dropdownWidthFix($('.dropdown-menu:visible', el)); + + + //------------- + // buttons + //------------- + var btnColorCls = ['btn-primary','btn-warning','btn-danger','btn-success','btn-info','btn-inverse']; + var btnSizeCls = ['btn-mini','btn-small','btn-large']; + $('.btn-group', el).parent().find('.btn-group:eq(0)').addClass('btn-group-first'); + $('.btn', el).parent().find('.btn:eq(0)').addClass('btn-first'); + + // fix button:hover + $('body', el).on('mouseenter', '.btn', function () { + var btn = $(this); + var hover = 'btn-hover'; + btn.data('ie6hover',hover); + $.each(btnColorCls, function (k,v) { + if (btn.hasClass(v)) { + hover = v + '-hover'; + btn.data('ie6hover',hover); + return false; + } + }); + btn.addClass(hover); + }).on('mouseleave', '.btn', function () { + var btn = $(this); + var hover = btn.data('ie6hover'); + btn.removeData('ie6hover'); + if (hover) btn.removeClass(hover); + }); + + // fix .btn.dropdown-toggle, .btn-primary.dropdown-toggle ... + // fix .btn.dropdown-toggle, .btn-small.dropdown-toggle ... + $('.btn.dropdown-toggle', el).each(function () { + var btn = $(this); + var ddt = 'btn-dropdown-toggle'; + btn.addClass(ddt); + + ddt = null; + $.each(btnColorCls, function (k,v) { + if (btn.hasClass(v)) { + ddt = v + '-dropdown-toggle'; + return false; + } + }); + if (ddt) btn.addClass(ddt); + + ddt = null; + $.each(btnSizeCls, function (k,v) { + if (btn.hasClass(v)) { + ddt = v + '-dropdown-toggle'; + return false; + } + }); + if (ddt) btn.addClass(ddt); + }); + + // fix split button dropdown toggle background color + $('.btn + .btn.dropdown-toggle', el).each(function () { + var btn = $(this); + var c = btn.css('background-color'); + // alert($.eb.color.darken(c, .2)); + btn.css('background-color', $.eb.color.darken(c, .1)); + }); + + // fix .btn-group.open + var dropdownPropertyChange = function(e) { + var self = $(this); + var cls = e.data.cls; + + /// fix ul li 100% width bug, set ul width to max width of it's sub li + var el = $('.dropdown-menu:visible', this); + if (el.length) dropdownWidthFix(el); + + if (self.hasClass('open') && !self.hasClass(cls+'-open')) { + self.addClass(cls+'-open'); + } + else if (!self.hasClass('open') && self.hasClass(cls+'-open')) { + self.removeClass(cls+'-open'); + } + + self.one('propertychange', {cls:cls}, dropdownPropertyChange); + }; + $.each(['btn-group', 'dropdown'], function (k,cls) { + $('.'+cls, el).one('propertychange', {cls:cls}, dropdownPropertyChange); + }); + + // fix .btn.disabled selector + $('.btn.disabled', el).addClass('btn-disabled'); + + var btnPropertyChange = function (e) { + var self = $(this); + var cls = e.data.cls; + + if (self.hasClass('disabled') && !self.hasClass(cls+'-disabled')) { + self.addClass(cls+'-disabled'); + } + else if (!self.hasClass('disabled') && self.hasClass(cls+'-disabled')) { + self.removeClass(cls+'-disabled'); + } + + self.one('propertychange', {cls:cls}, btnPropertyChange); + } + $.each(['btn'], function (k,cls) { + $('.'+cls, el).one('propertychange', {cls:cls}, btnPropertyChange); + }); + + + //------------- + // table + //------------- + + // fix table-hover effect + $('table.table-hover', el).on('mouseenter', 'tr', function () { + $(this).addClass('tr-hover'); + }).on('mouseleave', 'tr', function () { + $(this).removeClass('tr-hover'); + }); + + //------------- + // form + //------------- + + // fix input[type=xxx] selector + $('input[type="file"], input[type="image"], input[type="submit"], input[type="reset"], input[type="button"], input[type="radio"], input[type="checkbox"], input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"]', el).each(function () { + var input = $(this); + input.addClass('input-'+input.attr('type')); + }); + + // fix form-horizontal controls margin-left + $('.form-horizontal .controls:first-child', el).addClass('controls-first-child'); + + // fix .checkbox.inline + $('.checkbox.inline', el).addClass('checkbox-inline'); + $('.radio.inline', el).addClass('radio-inline'); + + // fix select[multiple], select[size] + $('select[multiple]', el).addClass('select-multiple'); + $('select[size]', el).addClass('select-size'); + + // fix tag[disabled] + $('input[disabled], select[disabled], textarea[disabled]', el).each(function () { + var self = $(this); + self.addClass(self[0].tagName.toLowerCase()+'-disabled'); + }); + +// $('input,select,textarea', el).on('propertychange', function() { +// var self = $(this); +// if (self.data('chgDisabled')) return; + +// var cls = self[0].tagName.toLowerCase(); +// // alert(self.attr('disabled')); +// if (self.attr('disabled') && !self.hasClass(cls+'-disabled')) { +// // alert('abc'); +// self.addClass(cls+'-disabled'); +// self.data('chgDisabled', true); +// } +// else if (!self.attr('disabled') && self.hasClass(cls+'-disabled')) { +// self.removeClass(cls+'-disabled'); +// self.data('chgDisabled', true); +// } +// }); + +// $('input,select,textarea', el).on('propertychange', function() { +// var self = $(this); +// if (self.data('chgReadonly')) return; + +// var cls = self[0].tagName.toLowerCase(); + +// if (self.attr('readonly') && !self.hasClass(cls+'-readonly')) { +// self.addClass(cls+'-readonly'); +// self.data('chgReadonly', true); +// } +// else if (typeof self.attr('readonly') == 'undefined' && self.hasClass(cls+'-readonly')) { +// self.removeClass(cls+'-readonly'); +// self.data('chgReadonly', true); +// } +// }); + + // fix tag[readonly] + $('input[readonly], select[readonly], textarea[readonly]', el).each(function () { + var self = $(this); + self.addClass(self[0].tagName.toLowerCase()+'-readonly'); + }); + + // fix input[type=xxx][disabled] + $('input[type="radio"][disabled], input[type="checkbox"][disabled]', el).each(function () { + var self = $(this); + self.addClass(self.attr('type').toLowerCase()+'-disabled'); + }); + + // fix input[type=xxx][readonly] + $('input[type="radio"][readonly], input[type="checkbox"][readonly]', el).each(function () { + var self = $(this); + self.addClass(self.attr('type').toLowerCase()+'-readonly'); + }); + + // fix.control-group.warning ... + var ctlGrpTypeCls = ['warning','success','error','info']; + $.each(ctlGrpTypeCls, function (k,v) { + $('.control-group.'+v, el).addClass('control-group-'+v); + }); + + var controlGroupPropertyChange = function(e) { + if(e.originalEvent.propertyName.toLowerCase() == 'classname') { + var self = $(this); + $.each(ctlGrpTypeCls, function (k,v) { + var ieCls = 'control-group-'+v; + if (self.hasClass(v)) { + if (!self.hasClass(ieCls)) { + self.addClass(ieCls); + } + } + else { + if (self.hasClass(ieCls)) { + self.removeClass(ieCls); + } + } + }); + } + $(this).one('propertychange', controlGroupPropertyChange); + }; + $('.control-group', el).one('propertychange', controlGroupPropertyChange); + + //------------- + // popover + //------------- + // $('.popover .arrow', el).after(''); + + //------------- + // pagination + //------------- + $('.pagination ul li:first-child', el).addClass('first-child'); + + + //------------- + // icons + //------------- + $('[class^="icon-"],[class*=" icon-"]').each(function () { + var self = $(this); + if (!self.hasClass('icon-xxx')) { + self.addClass('icon-xxx'); + self.css('background-position-y', + (parseInt(self.css('background-position-y')) + 1)+'px'); + } + }); + + //------------- + // carousel + //------------- + $('.carousel-control.left', el).removeClass('left').addClass('carousel-control-left'); + $('.carousel-control.right', el).removeClass('right').addClass('carousel-control-right'); + $('.carousel-caption').each(function() { + var self = $(this); + var padding = self.outerWidth() - self.width(); + self.width(self.parents('.carousel-inner .item').width() - padding); + }); + + + } + } + $.bootstrapIE6 = bootstrapIE6; + + + $(document).ready(function () { + bootstrapIE6(); + }); + +})(jQuery); diff --git a/src/main/webapp/plug-in/Formdesign/js/html5shiv.min.js b/src/main/webapp/plug-in/Formdesign/js/html5shiv.min.js new file mode 100644 index 00000000..448cebd7 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/html5shiv.min.js @@ -0,0 +1,8 @@ +/* + HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); +a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; +c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| +"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); +if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d #mq-test-1 { width: 42px; }',d.insertBefore(f,e),c=42===g.offsetWidth,d.removeChild(f),{matches:c,media:a}}}(document); + +/*! Respond.js v1.3.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */ +(function(a){"use strict";function x(){u(!0)}var b={};if(a.respond=b,b.update=function(){},b.mediaQueriesSupported=a.matchMedia&&a.matchMedia("only all").matches,!b.mediaQueriesSupported){var q,r,t,c=a.document,d=c.documentElement,e=[],f=[],g=[],h={},i=30,j=c.getElementsByTagName("head")[0]||d,k=c.getElementsByTagName("base")[0],l=j.getElementsByTagName("link"),m=[],n=function(){for(var b=0;l.length>b;b++){var c=l[b],d=c.href,e=c.media,f=c.rel&&"stylesheet"===c.rel.toLowerCase();d&&f&&!h[d]&&(c.styleSheet&&c.styleSheet.rawCssText?(p(c.styleSheet.rawCssText,d,e),h[d]=!0):(!/^([a-zA-Z:]*\/\/)/.test(d)&&!k||d.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&m.push({href:d,media:e}))}o()},o=function(){if(m.length){var b=m.shift();v(b.href,function(c){p(c,b.href,b.media),h[b.href]=!0,a.setTimeout(function(){o()},0)})}},p=function(a,b,c){var d=a.match(/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi),g=d&&d.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+b+"$2$3")},i=!g&&c;b.length&&(b+="/"),i&&(g=1);for(var j=0;g>j;j++){var k,l,m,n;i?(k=c,f.push(h(a))):(k=d[j].match(/@media *([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1,f.push(RegExp.$2&&h(RegExp.$2))),m=k.split(","),n=m.length;for(var o=0;n>o;o++)l=m[o],e.push({media:l.split("(")[0].match(/(only\s+)?([a-zA-Z]+)\s?/)&&RegExp.$2||"all",rules:f.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},s=function(){var a,b=c.createElement("div"),e=c.body,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",e||(e=f=c.createElement("body"),e.style.background="none"),e.appendChild(b),d.insertBefore(e,d.firstChild),a=b.offsetWidth,f?d.removeChild(e):e.removeChild(b),a=t=parseFloat(a)},u=function(b){var h="clientWidth",k=d[h],m="CSS1Compat"===c.compatMode&&k||c.body[h]||k,n={},o=l[l.length-1],p=(new Date).getTime();if(b&&q&&i>p-q)return a.clearTimeout(r),r=a.setTimeout(u,i),void 0;q=p;for(var v in e)if(e.hasOwnProperty(v)){var w=e[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?t||s():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?t||s():1)),w.hasquery&&(z&&A||!(z||m>=x)||!(A||y>=m))||(n[w.media]||(n[w.media]=[]),n[w.media].push(f[w.rules]))}for(var C in g)g.hasOwnProperty(C)&&g[C]&&g[C].parentNode===j&&j.removeChild(g[C]);for(var D in n)if(n.hasOwnProperty(D)){var E=c.createElement("style"),F=n[D].join("\n");E.type="text/css",E.media=D,j.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(c.createTextNode(F)),g.push(E)}},v=function(a,b){var c=w();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},w=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}();n(),b.update=n,a.addEventListener?a.addEventListener("resize",x,!1):a.attachEvent&&a.attachEvent("onresize",x)}})(this); diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/1.4.3鐗堟湰Ueditor.txt b/src/main/webapp/plug-in/Formdesign/js/ueditor/1.4.3鐗堟湰Ueditor.txt new file mode 100644 index 00000000..4806148d --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/1.4.3鐗堟湰Ueditor.txt @@ -0,0 +1,3 @@ +formdesign 瀹屽叏鍏煎鏂扮増Ueditor + +绁濅綘鐢熸椿鎰夊揩 ^_^ 浠g爜娌ug ^_^ \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/anchor/anchor.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/anchor/anchor.html new file mode 100644 index 00000000..f277847a --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/anchor/anchor.html @@ -0,0 +1,40 @@ + + + + + + + + +
    + +
    + + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/attachment.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/attachment.css new file mode 100644 index 00000000..548b4284 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/attachment.css @@ -0,0 +1,681 @@ +@charset "utf-8"; +/* dialog鏍峰紡 */ +.wrapper { + zoom: 1; + width: 630px; + *width: 626px; + height: 380px; + margin: 0 auto; + padding: 10px; + position: relative; + font-family: sans-serif; +} + +/*tab鏍峰紡妗嗗ぇ灏*/ +.tabhead { + float:left; +} +.tabbody { + width: 100%; + height: 346px; + position: relative; + clear: both; +} + +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} + +.tabbody .panel.focus { + width: 100%; + height: 346px; + display: block; +} + +/* 涓婁紶闄勪欢 */ +.tabbody #upload.panel { + width: 0; + height: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); + background: #fff; + display: block; +} + +.tabbody #upload.panel.focus { + width: 100%; + height: 346px; + display: block; + clip: auto; +} + +#upload .queueList { + margin: 0; + width: 100%; + height: 100%; + position: absolute; + overflow: hidden; +} + +#upload p { + margin: 0; +} + +.element-invisible { + width: 0 !important; + height: 0 !important; + border: 0; + padding: 0; + margin: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); +} + +#upload .placeholder { + margin: 10px; + border: 2px dashed #e6e6e6; + *border: 0px dashed #e6e6e6; + height: 172px; + padding-top: 150px; + text-align: center; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top:0; + *top: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 300px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; +} + +#upload .filelist li { + width: 113px; + height: 113px; + background: url(./images/bg.png); + text-align: center; + margin: 9px 0 0 9px; + *margin: 6px 0 0 6px; + position: relative; + display: block; + float: left; + overflow: hidden; + font-size: 12px; +} + +#upload .filelist li p.log { + position: relative; + top: -45px; +} + +#upload .filelist li p.title { + position: absolute; + top: 0; + left: 0; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + top: 5px; + text-indent: 5px; + text-align: left; +} + +#upload .filelist li p.progress { + position: absolute; + width: 100%; + bottom: 0; + left: 0; + height: 8px; + overflow: hidden; + z-index: 50; + margin: 0; + border-radius: 0; + background: none; + -webkit-box-shadow: 0 0 0; +} + +#upload .filelist li p.progress span { + display: none; + overflow: hidden; + width: 0; + height: 100%; + background: #1483d8 url(./images/progress.png) repeat-x; + + -webit-transition: width 200ms linear; + -moz-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; + transition: width 200ms linear; + + -webkit-animation: progressmove 2s linear infinite; + -moz-animation: progressmove 2s linear infinite; + -o-animation: progressmove 2s linear infinite; + -ms-animation: progressmove 2s linear infinite; + animation: progressmove 2s linear infinite; + + -webkit-transform: translateZ(0); +} + +@-webkit-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@-moz-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +#upload .filelist li p.imgWrap { + position: relative; + z-index: 2; + line-height: 113px; + vertical-align: middle; + overflow: hidden; + width: 113px; + height: 113px; + + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + + -webit-transition: 200ms ease-out; + -moz-transition: 200ms ease-out; + -o-transition: 200ms ease-out; + -ms-transition: 200ms ease-out; + transition: 200ms ease-out; +} +#upload .filelist li p.imgWrap.notimage { + margin-top: 0; + width: 111px; + height: 111px; + border: 1px #eeeeee solid; +} +#upload .filelist li p.imgWrap.notimage i.file-preview { + margin-top: 15px; +} + +#upload .filelist li img { + width: 100%; +} + +#upload .filelist li p.error { + background: #f43838; + color: #fff; + position: absolute; + bottom: 0; + left: 0; + height: 28px; + line-height: 28px; + width: 100%; + z-index: 100; + display:none; +} + +#upload .filelist li .success { + display: block; + position: absolute; + left: 0; + bottom: 0; + height: 40px; + width: 100%; + z-index: 200; + background: url(./images/success.png) no-repeat right bottom; + background-image: url(./images/success.gif) \9; +} + +#upload .filelist li.filePickerBlock { + width: 113px; + height: 113px; + background: url(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display:none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display:none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused{ + background: #00b7ee; + color: #fff; + border-color: transparent; +} +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover{ + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter:alpha(opacity=60); + -moz-opacity:0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + + + +/* 鍥剧墖绠$悊鏍峰紡 */ +#online { + width: 100%; + height: 336px; + padding: 10px 0 0 0; +} +#online #fileList{ + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + position: relative; +} +#online ul { + display: block; + list-style: none; + margin: 0; + padding: 0; +} +#online li { + float: left; + display: block; + list-style: none; + padding: 0; + width: 113px; + height: 113px; + margin: 0 0 9px 9px; + *margin: 0 0 6px 6px; + background-color: #eee; + overflow: hidden; + cursor: pointer; + position: relative; +} +#online li.clearFloat { + float: none; + clear: both; + display: block; + width:0; + height:0; + margin: 0; + padding: 0; +} +#online li img { + cursor: pointer; +} +#online li div.file-wrapper { + cursor: pointer; + position: absolute; + display: block; + width: 111px; + height: 111px; + border: 1px solid #eee; + background: url("./images/bg.png") repeat; +} +#online li div span.file-title{ + display: block; + padding: 0 3px; + margin: 3px 0 0 0; + font-size: 12px; + height: 13px; + color: #555555; + text-align: center; + width: 107px; + white-space: nowrap; + word-break: break-all; + overflow: hidden; + text-overflow: ellipsis; +} +#online li .icon { + cursor: pointer; + width: 113px; + height: 113px; + position: absolute; + top: 0; + left: 0; + z-index: 2; + border: 0; + background-repeat: no-repeat; +} +#online li .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; +} +#online li.selected .icon { + background-image: url(images/success.png); + background-image: url(images/success.gif) \9; + background-position: 75px 75px; +} +#online li.selected .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; + background-position: 72px 72px; +} + + +/* 鍦ㄧ嚎鏂囦欢鐨勬枃浠堕瑙堝浘鏍 */ +i.file-preview { + display: block; + margin: 10px auto; + width: 70px; + height: 70px; + background-image: url("./images/file-icons.png"); + background-image: url("./images/file-icons.gif") \9; + background-position: -140px center; + background-repeat: no-repeat; +} +i.file-preview.file-type-dir{ + background-position: 0 center; +} +i.file-preview.file-type-file{ + background-position: -140px center; +} +i.file-preview.file-type-filelist{ + background-position: -210px center; +} +i.file-preview.file-type-zip, +i.file-preview.file-type-rar, +i.file-preview.file-type-7z, +i.file-preview.file-type-tar, +i.file-preview.file-type-gz, +i.file-preview.file-type-bz2{ + background-position: -280px center; +} +i.file-preview.file-type-xls, +i.file-preview.file-type-xlsx{ + background-position: -350px center; +} +i.file-preview.file-type-doc, +i.file-preview.file-type-docx{ + background-position: -420px center; +} +i.file-preview.file-type-ppt, +i.file-preview.file-type-pptx{ + background-position: -490px center; +} +i.file-preview.file-type-vsd{ + background-position: -560px center; +} +i.file-preview.file-type-pdf{ + background-position: -630px center; +} +i.file-preview.file-type-txt, +i.file-preview.file-type-md, +i.file-preview.file-type-json, +i.file-preview.file-type-htm, +i.file-preview.file-type-xml, +i.file-preview.file-type-html, +i.file-preview.file-type-js, +i.file-preview.file-type-css, +i.file-preview.file-type-php, +i.file-preview.file-type-jsp, +i.file-preview.file-type-asp{ + background-position: -700px center; +} +i.file-preview.file-type-apk{ + background-position: -770px center; +} +i.file-preview.file-type-exe{ + background-position: -840px center; +} +i.file-preview.file-type-ipa{ + background-position: -910px center; +} +i.file-preview.file-type-mp4, +i.file-preview.file-type-swf, +i.file-preview.file-type-mkv, +i.file-preview.file-type-avi, +i.file-preview.file-type-flv, +i.file-preview.file-type-mov, +i.file-preview.file-type-mpg, +i.file-preview.file-type-mpeg, +i.file-preview.file-type-ogv, +i.file-preview.file-type-webm, +i.file-preview.file-type-rm, +i.file-preview.file-type-rmvb{ + background-position: -980px center; +} +i.file-preview.file-type-ogg, +i.file-preview.file-type-wav, +i.file-preview.file-type-wmv, +i.file-preview.file-type-mid, +i.file-preview.file-type-mp3{ + background-position: -1050px center; +} +i.file-preview.file-type-jpg, +i.file-preview.file-type-jpeg, +i.file-preview.file-type-gif, +i.file-preview.file-type-bmp, +i.file-preview.file-type-png, +i.file-preview.file-type-psd{ + background-position: -140px center; +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/attachment.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/attachment.html new file mode 100644 index 00000000..2ae92820 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/attachment.html @@ -0,0 +1,60 @@ + + + + + ueditor鍥剧墖瀵硅瘽妗 + + + + + + + + + + + + + + +
    +
    + + +
    +
    + +
    +
    +
    +
    + 0% + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
      +
    • +
    +
    +
    + + +
    +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/attachment.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/attachment.js new file mode 100644 index 00000000..ce3be633 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/attachment.js @@ -0,0 +1,754 @@ +/** + * User: Jinqn + * Date: 14-04-08 + * Time: 涓嬪崍16:34 + * 涓婁紶鍥剧墖瀵硅瘽妗嗛昏緫浠g爜,鍖呮嫭tab: 杩滅▼鍥剧墖/涓婁紶鍥剧墖/鍦ㄧ嚎鍥剧墖/鎼滅储鍥剧墖 + */ + +(function () { + + var uploadFile, + onlineFile; + + window.onload = function () { + initTabs(); + initButtons(); + }; + + /* 鍒濆鍖杢ab鏍囩 */ + function initTabs() { + var tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + setTabFocus(target.getAttribute('data-content-id')); + }); + } + + setTabFocus('upload'); + } + + /* 鍒濆鍖杢abbody */ + function setTabFocus(id) { + if(!id) return; + var i, bodyId, tabs = $G('tabhead').children; + for (i = 0; i < tabs.length; i++) { + bodyId = tabs[i].getAttribute('data-content-id') + if (bodyId == id) { + domUtils.addClass(tabs[i], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + } else { + domUtils.removeClasses(tabs[i], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + switch (id) { + case 'upload': + uploadFile = uploadFile || new UploadFile('queueList'); + break; + case 'online': + onlineFile = onlineFile || new OnlineFile('fileList'); + break; + } + } + + /* 鍒濆鍖杘nok浜嬩欢 */ + function initButtons() { + + dialog.onok = function () { + var list = [], id, tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + if (domUtils.hasClass(tabs[i], 'focus')) { + id = tabs[i].getAttribute('data-content-id'); + break; + } + } + + switch (id) { + case 'upload': + list = uploadFile.getInsertList(); + var count = uploadFile.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '杩樻湁2涓湭涓婁紶鏂囦欢'.replace(/[\d]/, count) + ''); + return false; + } + break; + case 'online': + list = onlineFile.getInsertList(); + break; + } + + editor.execCommand('insertfile', list); + }; + } + + + /* 涓婁紶闄勪欢 */ + function UploadFile(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + UploadFile.prototype = { + init: function () { + this.fileList = []; + this.initContainer(); + this.initUploader(); + }, + initContainer: function () { + this.$queue = this.$wrap.find('.filelist'); + }, + /* 鍒濆鍖栧鍣 */ + initUploader: function () { + var _this = this, + $ = jQuery, // just in case. Make sure it's not an other libaray. + $wrap = _this.$wrap, + // 鍥剧墖瀹瑰櫒 + $queue = $wrap.find('.filelist'), + // 鐘舵佹爮锛屽寘鎷繘搴﹀拰鎺у埗鎸夐挳 + $statusBar = $wrap.find('.statusBar'), + // 鏂囦欢鎬讳綋閫夋嫨淇℃伅銆 + $info = $statusBar.find('.info'), + // 涓婁紶鎸夐挳 + $upload = $wrap.find('.uploadBtn'), + // 涓婁紶鎸夐挳 + $filePickerBtn = $wrap.find('.filePickerBtn'), + // 涓婁紶鎸夐挳 + $filePickerBlock = $wrap.find('.filePickerBlock'), + // 娌¢夋嫨鏂囦欢涔嬪墠鐨勫唴瀹广 + $placeHolder = $wrap.find('.placeholder'), + // 鎬讳綋杩涘害鏉 + $progress = $statusBar.find('.progress').hide(), + // 娣诲姞鐨勬枃浠舵暟閲 + fileCount = 0, + // 娣诲姞鐨勬枃浠舵诲ぇ灏 + fileSize = 0, + // 浼樺寲retina, 鍦╮etina涓嬭繖涓兼槸2 + ratio = window.devicePixelRatio || 1, + // 缂╃暐鍥惧ぇ灏 + thumbnailWidth = 113 * ratio, + thumbnailHeight = 113 * ratio, + // 鍙兘鏈塸edding, ready, uploading, confirm, done. + state = '', + // 鎵鏈夋枃浠剁殑杩涘害淇℃伅锛宬ey涓篺ile id + percentages = {}, + supportTransition = (function () { + var s = document.createElement('p').style, + r = 'transition' in s || + 'WebkitTransition' in s || + 'MozTransition' in s || + 'msTransition' in s || + 'OTransition' in s; + s = null; + return r; + })(), + // WebUploader瀹炰緥 + uploader, + actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')), + fileMaxSize = editor.getOpt('fileMaxSize'), + acceptExtensions = (editor.getOpt('fileAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');; + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
    ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('fileActionName')) { + $('#filePickerReady').after($('
    ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('fileFieldName'), + duplicate: true, + fileSingleSizeLimit: fileMaxSize, + compress: false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 褰撴湁鏂囦欢娣诲姞杩涙潵鏃舵墽琛岋紝璐熻矗view鐨勫垱寤 + function addFile(file) { + var $li = $('
  • ' + + '

    ' + file.name + '

    ' + + '

    ' + + '

    ' + + '
  • '), + + $btns = $('
    ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
    ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

    ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) { + $wrap.empty().addClass('notimage').append('' + + '' + file.name + ''); + } else { + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + } + percentages[ file.id ] = [ file.size, 0 ]; + file.rotation = 0; + + /* 妫鏌ユ枃浠舵牸寮 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 鎴愬姛 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[ file.id ][ 1 ] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[ file.id ][ 1 ] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 璐熻矗view鐨勯攢姣 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[ file.id ]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[ 0 ]; + loaded += v[ 0 ] * v[ 1 ]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 鏈夋嫨鏂囦欢 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); $info.hide(); + uploader.refresh(); + break; + + /* 鍙互寮濮嬩笂浼 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 涓婁紶涓 */ + case 'uploading': + $progress.show(); $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 鏆傚仠涓婁紶 */ + case 'paused': + $progress.show(); $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount). + replace('_KB', WebUploader.formatSize(fileSize)). + replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 娣诲姞棰濆鐨凣ET鍙傛暟 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //杩欓噷鍙互閫氳繃data瀵硅薄娣诲姞POST鍙傛暟 + header['X_Requested_With'] = 'XMLHttpRequest'; + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[ file.id ][ 1 ] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + if (json.state == 'SUCCESS') { + _this.fileList.push(json); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, file) { + if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { + addFile(file); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++]; ) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + getInsertList: function () { + var i, link, data, list = [], + prefix = editor.getOpt('fileUrlPrefix'); + for (i = 0; i < this.fileList.length; i++) { + data = this.fileList[i]; + link = data.url; + list.push({ + title: data.original || link.substr(link.lastIndexOf('/') + 1), + url: prefix + link + }); + } + return list; + } + }; + + + /* 鍦ㄧ嚎闄勪欢 */ + function OnlineFile(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + OnlineFile.prototype = { + init: function () { + this.initContainer(); + this.initEvents(); + this.initData(); + }, + /* 鍒濆鍖栧鍣 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 鍒濆鍖栨粴鍔ㄤ簨浠,婊氬姩鍒板湴姝ヨ嚜鍔ㄦ媺鍙栨暟鎹 */ + initEvents: function () { + var _this = this; + + /* 婊氬姩鎷夊彇鍥剧墖 */ + domUtils.on($G('fileList'), 'scroll', function(e){ + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getFileData(); + } + }); + /* 閫変腑鍥剧墖 */ + domUtils.on(this.list, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + /* 鍒濆鍖栫涓娆$殑鏁版嵁 */ + initData: function () { + + /* 鎷夊彇鏁版嵁闇瑕佷娇鐢ㄧ殑鍊 */ + this.state = 0; + this.listSize = editor.getOpt('fileManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 绗竴娆℃媺鍙栨暟鎹 */ + this.getFileData(); + }, + /* 鍚戝悗鍙版媺鍙栧浘鐗囧垪琛ㄦ暟鎹 */ + getFileData: function () { + var _this = this; + + if(!_this.listEnd && !this.isLoadingData) { + this.isLoadingData = true; + ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), { + timeout: 100000, + data: utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + method: 'get', + onsuccess: function (r) { + try { + var json = eval('(' + r.responseText + ')'); + if (json.state == 'SUCCESS') { + _this.pushData(json.list); + _this.listIndex = parseInt(json.start) + parseInt(json.list.length); + if(_this.listIndex >= json.total) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if(r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + onerror: function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 娣诲姞鍥剧墖鍒板垪琛ㄧ晫闈笂 */ + pushData: function (list) { + var i, item, img, filetype, preview, icon, _this = this, + urlPrefix = editor.getOpt('fileManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + if(list[i] && list[i].url) { + item = document.createElement('li'); + icon = document.createElement('span'); + filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1); + + if ( "png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1 ) { + preview = document.createElement('img'); + domUtils.on(preview, 'load', (function(image){ + return function(){ + _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); + }; + })(preview)); + preview.width = 113; + preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); + } else { + var ic = document.createElement('i'), + textSpan = document.createElement('span'); + textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1); + preview = document.createElement('div'); + preview.appendChild(ic); + preview.appendChild(textSpan); + domUtils.addClass(preview, 'file-wrapper'); + domUtils.addClass(textSpan, 'file-title'); + domUtils.addClass(ic, 'file-type-' + filetype); + domUtils.addClass(ic, 'file-preview'); + } + domUtils.addClass(icon, 'icon'); + item.setAttribute('data-url', urlPrefix + list[i].url); + if (list[i].original) { + item.setAttribute('data-title', list[i].original); + } + + item.appendChild(preview); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 鏀瑰彉鍥剧墖澶у皬 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = []; + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var url = lis[i].getAttribute('data-url'); + var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1); + list.push({ + title: title, + url: url + }); + } + } + return list; + } + }; + + +})(); \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif new file mode 100644 index 00000000..9ca4fb6a Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_default.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_default.png new file mode 100644 index 00000000..50ac1cb1 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_default.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif new file mode 100644 index 00000000..206fede4 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif new file mode 100644 index 00000000..2e3b7a28 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif new file mode 100644 index 00000000..5d5dec02 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif new file mode 100644 index 00000000..b351a1f2 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif new file mode 100644 index 00000000..26019b09 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif new file mode 100644 index 00000000..bbb65c83 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif new file mode 100644 index 00000000..ccb26fbe Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif new file mode 100644 index 00000000..2e8743a2 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif new file mode 100644 index 00000000..5359e46d Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif new file mode 100644 index 00000000..e7b8dd21 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif new file mode 100644 index 00000000..e86c1c66 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/alignicon.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/alignicon.gif new file mode 100644 index 00000000..005a5ac6 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/alignicon.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/alignicon.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/alignicon.png new file mode 100644 index 00000000..4b6c444b Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/alignicon.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/bg.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/bg.png new file mode 100644 index 00000000..580be0a0 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/bg.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/file-icons.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/file-icons.gif new file mode 100644 index 00000000..d8c02c27 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/file-icons.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/file-icons.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/file-icons.png new file mode 100644 index 00000000..3ff82c8c Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/file-icons.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/icons.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/icons.gif new file mode 100644 index 00000000..78459dea Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/icons.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/icons.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/icons.png new file mode 100644 index 00000000..12e47001 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/icons.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/image.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/image.png new file mode 100644 index 00000000..19699f6a Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/image.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/progress.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/progress.png new file mode 100644 index 00000000..717c4865 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/progress.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/success.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/success.gif new file mode 100644 index 00000000..8d4f3112 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/success.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/success.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/success.png new file mode 100644 index 00000000..94f968dc Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/attachment/images/success.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/background.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/background.css new file mode 100644 index 00000000..5c41fe9a --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/background.css @@ -0,0 +1,94 @@ +.wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative} +.tabbody{height:225px;} +.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;} +.tabbody .focus { display: block;} + +body{font-size: 12px;color: #888;overflow: hidden;} +input,label{vertical-align:middle} +.clear{clear: both;} +.pl{padding-left: 18px;padding-left: 23px\9;} + +#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;} +#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;} +#imageList img {cursor: pointer;border: 2px solid white;} + +.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;} +.content div{margin: 10px 0 10px 5px;} +.content .iptradio{margin: 0px 5px 5px 0px;} +.txt{width:280px;} + +.wrapcolor{height: 19px;} +div.color{float: left;margin: 0;} +#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;} +div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;} +#custom input{height: 15px;min-height: 15px;width:20px;} +#repeatType{width:100px;} + + +/* 鍥剧墖绠$悊鏍峰紡 */ +#imgManager { + width: 100%; + height: 225px; +} +#imgManager #imageList{ + width: 100%; + overflow-x: hidden; + overflow-y: auto; +} +#imgManager ul { + display: block; + list-style: none; + margin: 0; + padding: 0; +} +#imgManager li { + float: left; + display: block; + list-style: none; + padding: 0; + width: 113px; + height: 113px; + margin: 9px 0 0 19px; + background-color: #eee; + overflow: hidden; + cursor: pointer; + position: relative; +} +#imgManager li.clearFloat { + float: none; + clear: both; + display: block; + width:0; + height:0; + margin: 0; + padding: 0; +} +#imgManager li img { + cursor: pointer; +} +#imgManager li .icon { + cursor: pointer; + width: 113px; + height: 113px; + position: absolute; + top: 0; + left: 0; + z-index: 2; + border: 0; + background-repeat: no-repeat; +} +#imgManager li .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; +} +#imgManager li.selected .icon { + background-image: url(images/success.png); + background-position: 75px 75px; +} +#imgManager li.selected .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; + background-position: 72px 72px; +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/background.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/background.html new file mode 100644 index 00000000..3cc2ac1e --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/background.html @@ -0,0 +1,56 @@ + + + + + + + + +
    +
    + + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + : +
    +
    +
    +
    +
    + +
    +
    + : +
    +
    + :x:px  y:px +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/background.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/background.js new file mode 100644 index 00000000..9a4a1315 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/background.js @@ -0,0 +1,376 @@ +(function () { + + var onlineImage, + backupStyle = editor.queryCommandValue('background'); + + window.onload = function () { + initTabs(); + initColorSelector(); + }; + + /* 鍒濆鍖杢ab鏍囩 */ + function initTabs(){ + var tabs = $G('tabHeads').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + for (var j = 0; j < tabs.length; j++) { + if(tabs[j] == target){ + tabs[j].className = "focus"; + var contentId = tabs[j].getAttribute('data-content-id'); + $G(contentId).style.display = "block"; + if(contentId == 'imgManager') { + initImagePanel(); + } + }else { + tabs[j].className = ""; + $G(tabs[j].getAttribute('data-content-id')).style.display = "none"; + } + } + }); + } + } + + /* 鍒濆鍖栭鑹茶缃 */ + function initColorSelector () { + var obj = editor.queryCommandValue('background'); + if (obj) { + var color = obj['background-color'], + repeat = obj['background-repeat'] || 'repeat', + image = obj['background-image'] || '', + position = obj['background-position'] || 'center center', + pos = position.split(' '), + x = parseInt(pos[0]) || 0, + y = parseInt(pos[1]) || 0; + + if(repeat == 'no-repeat' && (x || y)) repeat = 'self'; + + image = image.match(/url[\s]*\(([^\)]*)\)/); + image = image ? image[1]:''; + updateFormState('colored', color, image, repeat, x, y); + } else { + updateFormState(); + } + + var updateHandler = function () { + updateFormState(); + updateBackground(); + } + domUtils.on($G('nocolorRadio'), 'click', updateBackground); + domUtils.on($G('coloredRadio'), 'click', updateHandler); + domUtils.on($G('url'), 'keyup', function(){ + if($G('url').value && $G('alignment').style.display == "none") { + utils.each($G('repeatType').children, function(item){ + item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false); + }); + } + updateHandler(); + }); + domUtils.on($G('repeatType'), 'change', updateHandler); + domUtils.on($G('x'), 'keyup', updateBackground); + domUtils.on($G('y'), 'keyup', updateBackground); + + initColorPicker(); + } + + /* 鍒濆鍖栭鑹查夋嫨鍣 */ + function initColorPicker() { + var me = editor, + cp = $G("colorPicker"); + + /* 鐢熸垚棰滆壊閫夋嫨鍣╱i瀵硅薄 */ + var popup = new UE.ui.Popup({ + content: new UE.ui.ColorPicker({ + noColorText: me.getLang("clearColor"), + editor: me, + onpickcolor: function (t, color) { + updateFormState('colored', color); + updateBackground(); + UE.ui.Popup.postHide(); + }, + onpicknocolor: function (t, color) { + updateFormState('colored', 'transparent'); + updateBackground(); + UE.ui.Popup.postHide(); + } + }), + editor: me, + onhide: function () { + } + }); + + /* 璁剧疆棰滆壊閫夋嫨鍣 */ + domUtils.on(cp, "click", function () { + popup.showAnchor(this); + }); + domUtils.on(document, 'mousedown', function (evt) { + var el = evt.target || evt.srcElement; + UE.ui.Popup.postHide(el); + }); + domUtils.on(window, 'scroll', function () { + UE.ui.Popup.postHide(); + }); + } + + /* 鍒濆鍖栧湪绾垮浘鐗囧垪琛 */ + function initImagePanel() { + onlineImage = onlineImage || new OnlineImage('imageList'); + } + + /* 鏇存柊鑳屾櫙鑹茶缃潰鏉 */ + function updateFormState (radio, color, url, align, x, y) { + var nocolorRadio = $G('nocolorRadio'), + coloredRadio = $G('coloredRadio'); + + if(radio) { + nocolorRadio.checked = (radio == 'colored' ? false:'checked'); + coloredRadio.checked = (radio == 'colored' ? 'checked':false); + } + if(color) { + domUtils.setStyle($G("colorPicker"), "background-color", color); + } + + if(url && /^\//.test(url)) { + var a = document.createElement('a'); + a.href = url; + browser.ie && (a.href = a.href); + url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash); + } + + if(url || url === '') { + $G('url').value = url; + } + if(align) { + utils.each($G('repeatType').children, function(item){ + item.selected = (align == item.getAttribute('value') ? 'selected':false); + }); + } + if(x || y) { + $G('x').value = parseInt(x) || 0; + $G('y').value = parseInt(y) || 0; + } + + $G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none'; + $G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none'; + } + + /* 鏇存柊鑳屾櫙棰滆壊 */ + function updateBackground () { + if ($G('coloredRadio').checked) { + var color = domUtils.getStyle($G("colorPicker"), "background-color"), + bgimg = $G("url").value, + align = $G("repeatType").value, + backgroundObj = { + "background-repeat": "no-repeat", + "background-position": "center center" + }; + + if (color) backgroundObj["background-color"] = color; + if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')'; + if (align == 'self') { + backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px"; + } else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') { + backgroundObj["background-repeat"] = align; + } + + editor.execCommand('background', backgroundObj); + } else { + editor.execCommand('background', null); + } + } + + + /* 鍦ㄧ嚎鍥剧墖 */ + function OnlineImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + OnlineImage.prototype = { + init: function () { + this.reset(); + this.initEvents(); + }, + /* 鍒濆鍖栧鍣 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.id = 'imageListUl'; + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 鍒濆鍖栨粴鍔ㄤ簨浠,婊氬姩鍒板湴姝ヨ嚜鍔ㄦ媺鍙栨暟鎹 */ + initEvents: function () { + var _this = this; + + /* 婊氬姩鎷夊彇鍥剧墖 */ + domUtils.on($G('imageList'), 'scroll', function(e){ + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getImageData(); + } + }); + /* 閫変腑鍥剧墖 */ + domUtils.on(this.container, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode, + nodes = $G('imageListUl').childNodes; + + if (li.tagName.toLowerCase() == 'li') { + updateFormState('nocolor', null, ''); + for (var i = 0, node; node = nodes[i++];) { + if (node == li && !domUtils.hasClass(node, 'selected')) { + domUtils.addClass(node, 'selected'); + updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat'); + } else { + domUtils.removeClasses(node, 'selected'); + } + } + updateBackground(); + } + }); + }, + /* 鍒濆鍖栫涓娆$殑鏁版嵁 */ + initData: function () { + + /* 鎷夊彇鏁版嵁闇瑕佷娇鐢ㄧ殑鍊 */ + this.state = 0; + this.listSize = editor.getOpt('imageManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 绗竴娆℃媺鍙栨暟鎹 */ + this.getImageData(); + }, + /* 閲嶇疆鐣岄潰 */ + reset: function() { + this.initContainer(); + this.initData(); + }, + /* 鍚戝悗鍙版媺鍙栧浘鐗囧垪琛ㄦ暟鎹 */ + getImageData: function () { + var _this = this; + + if(!_this.listEnd && !this.isLoadingData) { + this.isLoadingData = true; + var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), + isJsonp = utils.isCrossDomainUrl(url); + ajax.request(url, { + 'timeout': 100000, + 'dataType': isJsonp ? 'jsonp':'', + 'data': utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + 'method': 'get', + 'onsuccess': function (r) { + try { + var json = isJsonp ? r:eval('(' + r.responseText + ')'); + if (json.state == 'SUCCESS') { + _this.pushData(json.list); + _this.listIndex = parseInt(json.start) + parseInt(json.list.length); + if(_this.listIndex >= json.total) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if(r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + 'onerror': function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 娣诲姞鍥剧墖鍒板垪琛ㄧ晫闈笂 */ + pushData: function (list) { + var i, item, img, icon, _this = this, + urlPrefix = editor.getOpt('imageManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + if(list[i] && list[i].url) { + item = document.createElement('li'); + img = document.createElement('img'); + icon = document.createElement('span'); + + domUtils.on(img, 'load', (function(image){ + return function(){ + _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); + } + })(img)); + img.width = 113; + img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); + img.setAttribute('_src', urlPrefix + list[i].url); + domUtils.addClass(icon, 'icon'); + + item.appendChild(img); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 鏀瑰彉鍥剧墖澶у皬 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = [], align = getAlign(); + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var img = lis[i].firstChild, + src = img.getAttribute('_src'); + list.push({ + src: src, + _src: src, + floatStyle: align + }); + } + + } + return list; + } + }; + + dialog.onok = function () { + updateBackground(); + editor.fireEvent('saveScene'); + }; + dialog.oncancel = function () { + editor.execCommand('background', backupStyle); + }; + +})(); \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/images/bg.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/images/bg.png new file mode 100644 index 00000000..580be0a0 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/images/bg.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/images/success.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/images/success.png new file mode 100644 index 00000000..94f968dc Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/background/images/success.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/chart.config.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/chart.config.js new file mode 100644 index 00000000..678b00de --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/chart.config.js @@ -0,0 +1,65 @@ +/* + * 鍥捐〃閰嶇疆鏂囦欢 + * */ + + +//涓嶅悓绫诲瀷鐨勯厤缃 +var typeConfig = [ + { + chart: { + type: 'line' + }, + plotOptions: { + line: { + dataLabels: { + enabled: false + }, + enableMouseTracking: true + } + } + }, { + chart: { + type: 'line' + }, + plotOptions: { + line: { + dataLabels: { + enabled: true + }, + enableMouseTracking: false + } + } + }, { + chart: { + type: 'area' + } + }, { + chart: { + type: 'bar' + } + }, { + chart: { + type: 'column' + } + }, { + chart: { + plotBackgroundColor: null, + plotBorderWidth: null, + plotShadow: false + }, + plotOptions: { + pie: { + allowPointSelect: true, + cursor: 'pointer', + dataLabels: { + enabled: true, + color: '#000000', + connectorColor: '#000000', + formatter: function() { + return ''+ this.point.name +': '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %'; + } + } + } + } + } +]; diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/charts.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/charts.css new file mode 100644 index 00000000..ac3c7645 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/charts.css @@ -0,0 +1,165 @@ +html, body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + overflow-x: hidden; +} + +.main { + width: 100%; + overflow: hidden; +} + +.table-view { + height: 100%; + float: left; + margin: 20px; + width: 40%; +} + +.table-view .table-container { + width: 100%; + margin-bottom: 50px; + overflow: scroll; +} + +.table-view th { + padding: 5px 10px; + background-color: #F7F7F7; +} + +.table-view td { + width: 50px; + text-align: center; + padding:0; +} + +.table-container input { + width: 40px; + padding: 5px; + border: none; + outline: none; +} + +.table-view caption { + font-size: 18px; + text-align: left; +} + +.charts-view { + /*margin-left: 49%!important;*/ + width: 50%; + margin-left: 49%; + height: 400px; +} + +.charts-container { + border-left: 1px solid #c3c3c3; +} + +.charts-format fieldset { + padding-left: 20px; + margin-bottom: 50px; +} + +.charts-format legend { + padding-left: 10px; + padding-right: 10px; +} + +.format-item-container { + padding: 20px; +} + +.format-item-container label { + display: block; + margin: 10px 0; +} + +.charts-format .data-item { + border: 1px solid black; + outline: none; + padding: 2px 3px; +} + +/* 鍥捐〃绫诲瀷 */ + +.charts-type { + margin-top: 50px; + height: 300px; +} + +.scroll-view { + border: 1px solid #c3c3c3; + border-left: none; + border-right: none; + overflow: hidden; +} + +.scroll-container { + margin: 20px; + width: 100%; + overflow: hidden; +} + +.scroll-bed { + width: 10000px; + _margin-top: 20px; + -webkit-transition: margin-left .5s ease; + -moz-transition: margin-left .5s ease; + transition: margin-left .5s ease; +} + +.view-box { + display: inline-block; + *display: inline; + *zoom: 1; + margin-right: 20px; + border: 2px solid white; + line-height: 0; + overflow: hidden; + cursor: pointer; +} + +.view-box img { + border: 1px solid #cecece; +} + +.view-box.selected { + border-color: #7274A7; +} + +.button-container { + margin-bottom: 20px; + text-align: center; +} + +.button-container a { + display: inline-block; + width: 100px; + height: 25px; + line-height: 25px; + border: 1px solid #c2ccd1; + margin-right: 30px; + text-decoration: none; + color: black; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} + +.button-container a:HOVER { + background: #fcfcfc; +} + +.button-container a:ACTIVE { + border-top-color: #c2ccd1; + box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1); +} + +.edui-charts-not-data { + height: 100px; + line-height: 100px; + text-align: center; +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/charts.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/charts.html new file mode 100644 index 00000000..70e23149 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/charts.html @@ -0,0 +1,89 @@ + + + + chart + + + + + +
    +
    +

    +
    +

    +
    +
    +
    + +
    + + +
    +
    +
    +
    + +
    + + + + +
    +
    +
    + +
    + +

    +
    +
    +
    + +
    + +

    +
    +
    +
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/charts.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/charts.js new file mode 100644 index 00000000..37344fd1 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/charts.js @@ -0,0 +1,519 @@ +/* + * 鍥剧墖杞崲瀵硅瘽妗嗚剼鏈 + **/ + +var tableData = [], + //缂栬緫鍣ㄩ〉闈able + editorTable = null, + chartsConfig = window.typeConfig, + resizeTimer = null, + //鍒濆榛樿鍥捐〃绫诲瀷 + currentChartType = 0; + +window.onload = function () { + + editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true); + + //鏈壘鍒拌〃鏍硷紝 鏄剧ず閿欒椤甸潰 + if ( !editorTable ) { + document.body.innerHTML = "
    鏈壘鍒版暟鎹
    "; + return; + } + + //鍒濆鍖栧浘琛ㄧ被鍨嬮夋嫨 + initChartsTypeView(); + renderTable( editorTable ); + initEvent(); + initUserConfig( editorTable.getAttribute( "data-chart" ) ); + $( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" ); + updateViewType( currentChartType ); + + dialog.addListener( "resize", function () { + + if ( resizeTimer != null ) { + window.clearTimeout( resizeTimer ); + } + + resizeTimer = window.setTimeout( function () { + + resizeTimer = null; + + renderCharts(); + + }, 500 ); + + } ); + +}; + +function initChartsTypeView () { + + var contents = []; + + for ( var i = 0, len = chartsConfig.length; i
    ' ); + + } + + $( "#scrollBed" ).html( contents.join( "" ) ); + +} + +//娓叉煋table锛 浠ヤ究鐢ㄦ埛淇敼鏁版嵁 +function renderTable ( table ) { + + var tableHtml = []; + + //鏋勯犳暟鎹 + for ( var i = 0, row; row = table.rows[ i ]; i++ ) { + + tableData[ i ] = []; + tableHtml[ i ] = []; + + for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) { + + var value = getCellValue( cell ); + + if ( i > 0 && j > 0 ) { + value = +value; + } + + if ( i === 0 || j === 0 ) { + tableHtml[ i ].push( ''+ value +'' ); + } else { + tableHtml[ i ].push( '' ); + } + + tableData[ i ][ j ] = value; + + } + + tableHtml[ i ] = tableHtml[ i ].join( "" ); + + } + + //draw 琛ㄦ牸 + $( "#tableContainer" ).html( ''+ tableHtml.join( "" ) +'
    ' ); + +} + +/* + * 鏍规嵁琛ㄦ牸宸叉湁鐨勫浘琛ㄥ睘鎬у垵濮嬪寲褰撳墠鍥捐〃灞炴 + */ +function initUserConfig ( config ) { + + var parsedConfig = {}; + + if ( !config ) { + return; + } + + config = config.split( ";" ); + + $.each( config, function ( index, item ) { + + item = item.split( ":" ); + parsedConfig[ item[ 0 ] ] = item[ 1 ]; + + } ); + + setUserConfig( parsedConfig ); + +} + +function initEvent () { + + var cacheValue = null, + //鍥捐〃绫诲瀷鏁 + typeViewCount = chartsConfig.length- 1, + $chartsTypeViewBox = $( '#scrollBed .view-box' ); + + $( ".charts-format" ).delegate( ".format-ctrl", "change", function () { + + renderCharts(); + + } ) + + $( ".table-view" ).delegate( ".data-item", "focus", function () { + + cacheValue = this.value; + + } ).delegate( ".data-item", "blur", function () { + + if ( this.value !== cacheValue ) { + renderCharts(); + } + + cacheValue = null; + + } ); + + $( "#buttonContainer" ).delegate( "a", "click", function (e) { + + e.preventDefault(); + + if ( this.getAttribute( "data-title" ) === 'prev' ) { + + if ( currentChartType > 0 ) { + currentChartType--; + updateViewType( currentChartType ); + } + + } else { + + if ( currentChartType < typeViewCount ) { + currentChartType++; + updateViewType( currentChartType ); + } + + } + + } ); + + //鍥捐〃绫诲瀷鍙樺寲 + $( '#scrollBed' ).delegate( ".view-box", "click", function (e) { + + var index = $( this ).attr( "data-chart-type" ); + $chartsTypeViewBox.removeClass( "selected" ); + $( $chartsTypeViewBox[ index ] ).addClass( "selected" ); + + currentChartType = index | 0; + + //楗煎浘锛 绂佺敤閮ㄥ垎閰嶇疆 + if ( currentChartType === chartsConfig.length - 1 ) { + + disableNotPieConfig(); + + //鍚敤瀹屾暣閰嶇疆 + } else { + + enableNotPieConfig(); + + } + + renderCharts(); + + } ); + +} + +function renderCharts () { + + var data = collectData(); + + $('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], { + + credits: { + enabled: false + }, + exporting: { + enabled: false + }, + title: { + text: data.title, + x: -20 //center + }, + subtitle: { + text: data.subTitle, + x: -20 + }, + xAxis: { + title: { + text: data.xTitle + }, + categories: data.categories + }, + yAxis: { + title: { + text: data.yTitle + }, + plotLines: [{ + value: 0, + width: 1, + color: '#808080' + }] + }, + tooltip: { + enabled: true, + valueSuffix: data.suffix + }, + legend: { + layout: 'vertical', + align: 'right', + verticalAlign: 'middle', + borderWidth: 1 + }, + series: data.series + + } )); + +} + +function updateViewType ( index ) { + + $( "#scrollBed" ).css( 'marginLeft', -index*324+'px' ); + +} + +function collectData () { + + var form = document.forms[ 'data-form' ], + data = null; + + if ( currentChartType !== chartsConfig.length - 1 ) { + + data = getSeriesAndCategories(); + $.extend( data, getUserConfig() ); + + //楗煎浘鏁版嵁鏍煎紡 + } else { + data = getSeriesForPieChart(); + data.title = form[ 'title' ].value; + data.suffix = form[ 'unit' ].value; + } + + return data; + +} + +/** + * 鑾峰彇鐢ㄦ埛閰嶇疆淇℃伅 + */ +function getUserConfig () { + + var form = document.forms[ 'data-form' ], + info = { + title: form[ 'title' ].value, + subTitle: form[ 'sub-title' ].value, + xTitle: form[ 'x-title' ].value, + yTitle: form[ 'y-title' ].value, + suffix: form[ 'unit' ].value, + //鏁版嵁瀵归綈鏂瑰紡 + tableDataFormat: getTableDataFormat (), + //楗煎浘鎻愮ず鏂囧瓧 + tip: $( "#tipInput" ).val() + }; + + return info; + +} + +function setUserConfig ( config ) { + + var form = document.forms[ 'data-form' ]; + + config.title && ( form[ 'title' ].value = config.title ); + config.subTitle && ( form[ 'sub-title' ].value = config.subTitle ); + config.xTitle && ( form[ 'x-title' ].value = config.xTitle ); + config.yTitle && ( form[ 'y-title' ].value = config.yTitle ); + config.suffix && ( form[ 'unit' ].value = config.suffix ); + config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true ); + config.tip && ( form[ 'tip' ].value = config.tip ); + currentChartType = config.chartType || 0; + +} + +function getSeriesAndCategories () { + + var form = document.forms[ 'data-form' ], + series = [], + categories = [], + tmp = [], + tableData = getTableData(); + + //鍙嶈浆鏁版嵁 + if ( getTableDataFormat() === "-1" ) { + + for ( var i = 0, len = tableData.length; i < len; i++ ) { + + for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) { + + if ( !tmp[ j ] ) { + tmp[ j ] = []; + } + + tmp[ j ][ i ] = tableData[ i ][ j ]; + + } + + } + + tableData = tmp; + + } + + categories = tableData[0].slice( 1 ); + + for ( var i = 1, data; data = tableData[ i ]; i++ ) { + + series.push( { + name: data[ 0 ], + data: data.slice( 1 ) + } ); + + } + + return { + series: series, + categories: categories + }; + +} + +/* + * 鑾峰彇鏁版嵁婧愭暟鎹榻愭柟寮 + */ +function getTableDataFormat () { + + var form = document.forms[ 'data-form' ], + items = form['charts-format']; + + return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value; + +} + +/* + * 绂佺敤闈為ゼ鍥剧被鍨嬬殑閰嶇疆椤 + */ +function disableNotPieConfig() { + + updateConfigItem( 'disable' ); + +} + +/* + * 鍚敤闈為ゼ鍥剧被鍨嬬殑閰嶇疆椤 + */ +function enableNotPieConfig() { + + updateConfigItem( 'enable' ); + +} + +function updateConfigItem ( value ) { + + var table = $( "#showTable" )[ 0 ], + isDisable = value === 'disable' ? true : false; + + //table涓殑input澶勭悊 + for ( var i = 2 , row; row = table.rows[ i ]; i++ ) { + + for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { + + $( "input", cell ).attr( "disabled", isDisable ); + + } + + } + + //鍏朵粬椤瑰鐞 + $( "input.not-pie-item" ).attr( "disabled", isDisable ); + $( "#tipInput" ).attr( "disabled", !isDisable ) + +} + +/* + * 鑾峰彇楗煎浘鏁版嵁 + * 楗煎浘鐨勬暟鎹彧鍙栫涓琛岀殑 + **/ +function getSeriesForPieChart () { + + var series = { + type: 'pie', + name: $("#tipInput").val(), + data: [] + }, + tableData = getTableData(); + + + for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) { + + var title = tableData[ 0 ][ j ], + val = tableData[ 1 ][ j ]; + + series.data.push( [ title, val ] ); + + } + + return { + series: [ series ] + }; + +} + +function getTableData () { + + var table = document.getElementById( "showTable" ), + xCount = table.rows[0].cells.length - 1, + values = getTableInputValue(); + + for ( var i = 0, value; value = values[ i ]; i++ ) { + + tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ]; + + } + + return tableData; + +} + +function getTableInputValue () { + + var table = document.getElementById( "showTable" ), + inputs = table.getElementsByTagName( "input" ), + values = []; + + for ( var i = 0, input; input = inputs[ i ]; i++ ) { + values.push( input.value | 0 ); + } + + return values; + +} + +function getCellValue ( cell ) { + + var value = utils.trim( ( cell.innerText || cell.textContent || '' ) ); + + return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' ); + +} + + +//dialog纭浜嬩欢 +dialog.onok = function () { + + //鏀堕泦淇℃伅 + var form = document.forms[ 'data-form' ], + info = getUserConfig(); + + //娣诲姞鍥捐〃绫诲瀷 + info.chartType = currentChartType; + + //鍚屾琛ㄦ牸鏁版嵁鍒扮紪杈戝櫒 + syncTableData(); + + //鎵ц鍥捐〃鍛戒护 + editor.execCommand( 'charts', info ); + +}; + +/* + * 鍚屾鍥捐〃缂栬緫瑙嗗浘鐨勮〃鏍兼暟鎹埌缂栬緫鍣ㄩ噷鐨勫師濮嬭〃鏍 + */ +function syncTableData () { + + var tableData = getTableData(); + + for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) { + + for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { + + cell.innerHTML = tableData[ i ] [ j ]; + + } + + } + +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts0.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts0.png new file mode 100644 index 00000000..9485e5ed Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts0.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts1.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts1.png new file mode 100644 index 00000000..b5a00392 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts1.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts2.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts2.png new file mode 100644 index 00000000..7c91a39f Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts2.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts3.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts3.png new file mode 100644 index 00000000..a6bc29bf Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts3.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts4.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts4.png new file mode 100644 index 00000000..742006ad Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts4.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts5.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts5.png new file mode 100644 index 00000000..c49a2960 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/charts/images/charts5.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/emotion.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/emotion.css new file mode 100644 index 00000000..f801105a --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/emotion.css @@ -0,0 +1,43 @@ +.jd img{ + background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.pp img{ + background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:25px;height:25px;display:block; +} +.ldw img{ + background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.tsj img{ + background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.cat img{ + background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.bb img{ + background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.youa img{ + background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} + +.smileytable td {height: 37px;} +#tabPanel{margin-left:5px;overflow: hidden;} +#tabContent {float:left;background:#FFFFFF;} +#tabContent div{display: none;width:480px;overflow:hidden;} +#tabIconReview.show{left:17px;display:block;} +.menuFocus{background:#ACCD3C;} +.menuDefault{background:#FFFFFF;} +#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;} +img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;} + +.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;} +.tabbody table{width: 100%;} +.tabbody td{border:1px solid #BAC498;} +.tabbody td span{display: block;zoom:1;padding:0 4px;} \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/emotion.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/emotion.html new file mode 100644 index 00000000..fca08509 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/emotion.html @@ -0,0 +1,54 @@ + + + + + + + + + + +
    +
    + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/emotion.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/emotion.js new file mode 100644 index 00000000..6e158a91 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/emotion.js @@ -0,0 +1,186 @@ +window.onload = function () { + editor.setOpt({ + emotionLocalization:false + }); + + emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/"; + emotion.SmileyBox = createTabList( emotion.tabNum ); + emotion.tabExist = createArr( emotion.tabNum ); + + initImgName(); + initEvtHandler( "tabHeads" ); +}; + +function initImgName() { + for ( var pro in emotion.SmilmgName ) { + var tempName = emotion.SmilmgName[pro], + tempBox = emotion.SmileyBox[pro], + tempStr = ""; + + if ( tempBox.length ) return; + for ( var i = 1; i <= tempName[1]; i++ ) { + tempStr = tempName[0]; + if ( i < 10 ) tempStr = tempStr + '0'; + tempStr = tempStr + i + '.gif'; + tempBox.push( tempStr ); + } + } +} + +function initEvtHandler( conId ) { + var tabHeads = $G( conId ); + for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) { + var tabObj = tabHeads.childNodes[i]; + if ( tabObj.nodeType == 1 ) { + domUtils.on( tabObj, "click", (function ( index ) { + return function () { + switchTab( index ); + }; + })( j ) ); + j++; + } + } + switchTab( 0 ); + $G( "tabIconReview" ).style.display = 'none'; +} + +function InsertSmiley( url, evt ) { + var obj = { + src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url + }; + obj._src = obj.src; + editor.execCommand( 'insertimage', obj ); + if ( !evt.ctrlKey ) { + dialog.popup.hide(); + } +} + +function switchTab( index ) { + + autoHeight( index ); + if ( emotion.tabExist[index] == 0 ) { + emotion.tabExist[index] = 1; + createTab( 'tab' + index ); + } + //鑾峰彇鍛堢幇鍏冪礌鍙ユ焺鏁扮粍 + var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ), + tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ), + i = 0, L = tabHeads.length; + //闅愯棌鎵鏈夊憟鐜板厓绱 + for ( ; i < L; i++ ) { + tabHeads[i].className = ""; + tabBodys[i].style.display = "none"; + } + //鏄剧ず瀵瑰簲鍛堢幇鍏冪礌 + tabHeads[index].className = "focus"; + tabBodys[index].style.display = "block"; +} + +function autoHeight( index ) { + var iframe = dialog.getDom( "iframe" ), + parent = iframe.parentNode.parentNode; + switch ( index ) { + case 0: + iframe.style.height = "380px"; + parent.style.height = "392px"; + break; + case 1: + iframe.style.height = "220px"; + parent.style.height = "232px"; + break; + case 2: + iframe.style.height = "260px"; + parent.style.height = "272px"; + break; + case 3: + iframe.style.height = "300px"; + parent.style.height = "312px"; + break; + case 4: + iframe.style.height = "140px"; + parent.style.height = "152px"; + break; + case 5: + iframe.style.height = "260px"; + parent.style.height = "272px"; + break; + case 6: + iframe.style.height = "230px"; + parent.style.height = "242px"; + break; + default: + + } +} + + +function createTab( tabName ) { + var faceVersion = "?v=1.1", //鐗堟湰鍙 + tab = $G( tabName ), //鑾峰彇灏嗚鐢熸垚鐨凞iv鍙ユ焺 + imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //鑾峰彇鏄剧ず琛ㄦ儏鍜岄瑙堣〃鎯呯殑璺緞 + positionLine = 11 / 2, //涓棿鏁 + iWidth = iHeight = 35, //鍥剧墖闀垮 + iColWidth = 3, //琛ㄦ牸鍓╀綑绌洪棿鐨勬樉绀烘瘮渚 + tableCss = emotion.imageCss[tabName], + cssOffset = emotion.imageCssOffset[tabName], + textHTML = [''], + i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage, + sUrl, realUrl, posflag, offset, infor; + + for ( ; i < imgNum; ) { + textHTML.push( '' ); + for ( var j = 0; j < imgColNum; j++, i++ ) { + faceImage = emotion.SmileyBox[tabName][i]; + if ( faceImage ) { + sUrl = imagePath + faceImage + faceVersion; + realUrl = imagePath + faceImage; + posflag = j < positionLine ? 0 : 1; + offset = cssOffset * i * (-1) - 1; + infor = emotion.SmileyInfor[tabName][i]; + + textHTML.push( '' ); + } + textHTML.push( '' ); + } + textHTML.push( '
    ' ); + textHTML.push( '' ); + textHTML.push( '' ); + textHTML.push( '' ); + } else { + textHTML.push( '' ); + } + textHTML.push( '
    ' ); + textHTML = textHTML.join( "" ); + tab.innerHTML = textHTML; +} + +function over( td, srcPath, posFlag ) { + td.style.backgroundColor = "#ACCD3C"; + $G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")"; + if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show"; + $G( "tabIconReview" ).style.display = 'block'; +} + +function out( td ) { + td.style.backgroundColor = "transparent"; + var tabIconRevew = $G( "tabIconReview" ); + tabIconRevew.className = ""; + tabIconRevew.style.display = 'none'; +} + +function createTabList( tabNum ) { + var obj = {}; + for ( var i = 0; i < tabNum; i++ ) { + obj["tab" + i] = []; + } + return obj; +} + +function createArr( tabNum ) { + var arr = []; + for ( var i = 0; i < tabNum; i++ ) { + arr[i] = 0; + } + return arr; +} + diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/0.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/0.gif new file mode 100644 index 00000000..6964168b Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/0.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/bface.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/bface.gif new file mode 100644 index 00000000..14fe618a Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/bface.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/cface.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/cface.gif new file mode 100644 index 00000000..bff947f5 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/cface.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/fface.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/fface.gif new file mode 100644 index 00000000..0d8a6afe Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/fface.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/jxface2.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/jxface2.gif new file mode 100644 index 00000000..a959c90f Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/jxface2.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/neweditor-tab-bg.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/neweditor-tab-bg.png new file mode 100644 index 00000000..8f398b09 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/neweditor-tab-bg.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/tface.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/tface.gif new file mode 100644 index 00000000..1354f54b Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/tface.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/wface.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/wface.gif new file mode 100644 index 00000000..5667160d Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/wface.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/yface.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/yface.gif new file mode 100644 index 00000000..51608be0 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/emotion/images/yface.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/gmap/gmap.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/gmap/gmap.html new file mode 100644 index 00000000..c4cbfe69 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/gmap/gmap.html @@ -0,0 +1,89 @@ + + + + + + + + + + +
    + + + + + + +
    +
    +
    + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/help/help.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/help/help.css new file mode 100644 index 00000000..4478475f --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/help/help.css @@ -0,0 +1,7 @@ +.wrapper{width: 370px;margin: 10px auto;zoom: 1;} +.tabbody{height: 360px;} +.tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;} +.tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;} +.tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;} +.tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;} +.tabbody table thead{font-weight: bold;line-height: 25px;} \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/help/help.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/help/help.html new file mode 100644 index 00000000..9e50060e --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/help/help.html @@ -0,0 +1,82 @@ + + + + 甯姪 + + + + + +
    +
    + + +
    +
    +
    +

    UEditor

    +

    +

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ctrl+b
    ctrl+c
    ctrl+x
    ctrl+v
    ctrl+y
    ctrl+z
    ctrl+i
    ctrl+u
    ctrl+a
    shift+enter
    alt+z
    +
    +
    +
    + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/help/help.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/help/help.js new file mode 100644 index 00000000..9a2272e3 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/help/help.js @@ -0,0 +1,56 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 涓嬪崍1:06 + * To change this template use File | Settings | File Templates. + */ +/** + * tab鐐瑰嚮澶勭悊浜嬩欢 + * @param tabHeads + * @param tabBodys + * @param obj + */ +function clickHandler( tabHeads,tabBodys,obj ) { + //head鏍峰紡鏇存敼 + for ( var k = 0, len = tabHeads.length; k < len; k++ ) { + tabHeads[k].className = ""; + } + obj.className = "focus"; + //body鏄鹃殣 + var tabSrc = obj.getAttribute( "tabSrc" ); + for ( var j = 0, length = tabBodys.length; j < length; j++ ) { + var body = tabBodys[j], + id = body.getAttribute( "id" ); + body.onclick = function(){ + this.style.zoom = 1; + }; + if ( id != tabSrc ) { + body.style.zIndex = 1; + } else { + body.style.zIndex = 200; + } + } + +} + +/** + * TAB鍒囨崲 + * @param tabParentId tab鐨勭埗鑺傜偣ID鎴栬呭璞℃湰韬 + */ +function switchTab( tabParentId ) { + var tabElements = $G( tabParentId ).children, + tabHeads = tabElements[0].children, + tabBodys = tabElements[1].children; + + for ( var i = 0, length = tabHeads.length; i < length; i++ ) { + var head = tabHeads[i]; + if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); + head.onclick = function () { + clickHandler(tabHeads,tabBodys,this); + } + } +} +switchTab("helptab"); + +document.getElementById('version').innerHTML = parent.UE.version; \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/image.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/image.css new file mode 100644 index 00000000..52c2295e --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/image.css @@ -0,0 +1,894 @@ +@charset "utf-8"; +/* dialog鏍峰紡 */ +.wrapper { + zoom: 1; + width: 630px; + *width: 626px; + height: 380px; + margin: 0 auto; + padding: 10px; + position: relative; + font-family: sans-serif; +} + +/*tab鏍峰紡妗嗗ぇ灏*/ +.tabhead { + float:left; +} +.tabbody { + width: 100%; + height: 346px; + position: relative; + clear: both; +} + +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} + +.tabbody .panel.focus { + width: 100%; + height: 346px; + display: block; +} + +/* 鍥剧墖瀵归綈鏂瑰紡 */ +.alignBar{ + float:right; + margin-top: 5px; + position: relative; +} + +.alignBar .algnLabel{ + float:left; + height: 20px; + line-height: 20px; +} + +.alignBar #alignIcon{ + zoom:1; + _display: inline; + display: inline-block; + position: relative; +} +.alignBar #alignIcon span{ + float: left; + cursor: pointer; + display: block; + width: 19px; + height: 17px; + margin-right: 3px; + margin-left: 3px; + background-image: url(./images/alignicon.jpg); +} +.alignBar #alignIcon .none-align{ + background-position: 0 -18px; +} +.alignBar #alignIcon .left-align{ + background-position: -20px -18px; +} +.alignBar #alignIcon .right-align{ + background-position: -40px -18px; +} +.alignBar #alignIcon .center-align{ + background-position: -60px -18px; +} +.alignBar #alignIcon .none-align.focus{ + background-position: 0 0; +} +.alignBar #alignIcon .left-align.focus{ + background-position: -20px 0; +} +.alignBar #alignIcon .right-align.focus{ + background-position: -40px 0; +} +.alignBar #alignIcon .center-align.focus{ + background-position: -60px 0; +} + + + + +/* 杩滅▼鍥剧墖鏍峰紡 */ +#remote { + z-index: 200; +} + +#remote .top{ + width: 100%; + margin-top: 25px; +} +#remote .left{ + display: block; + float: left; + width: 300px; + height:10px; +} +#remote .right{ + display: block; + float: right; + width: 300px; + height:10px; +} +#remote .row{ + margin-left: 20px; + clear: both; + height: 40px; +} + +#remote .row label{ + text-align: center; + width: 50px; + zoom:1; + _display: inline; + display:inline-block; + vertical-align: middle; +} +#remote .row label.algnLabel{ + float: left; + +} + +#remote input.text{ + width: 150px; + padding: 3px 6px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +#remote input.text:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); +} +#remote #url{ + width: 500px; + margin-bottom: 2px; +} +#remote #width, +#remote #height{ + width: 20px; + margin-left: 2px; + margin-right: 2px; +} +#remote #border, +#remote #vhSpace, +#remote #title{ + width: 180px; + margin-right: 5px; +} +#remote #lock{ +} +#remote #lockicon{ + zoom: 1; + _display:inline; + display: inline-block; + width: 20px; + height: 20px; + background: url("../../themes/default/images/lock.gif") -13px -13px no-repeat; + vertical-align: middle; +} +#remote #preview{ + clear: both; + width: 260px; + height: 240px; + z-index: 9999; + margin-top: 10px; + background-color: #eee; + overflow: hidden; +} + +/* 涓婁紶鍥剧墖 */ +.tabbody #upload.panel { + width: 0; + height: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); + background: #fff; + display: block; +} + +.tabbody #upload.panel.focus { + width: 100%; + height: 346px; + display: block; + clip: auto; +} + +#upload .queueList { + margin: 0; + width: 100%; + height: 100%; + position: absolute; + overflow: hidden; +} + +#upload p { + margin: 0; +} + +.element-invisible { + width: 0 !important; + height: 0 !important; + border: 0; + padding: 0; + margin: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); +} + +#upload .placeholder { + margin: 10px; + border: 2px dashed #e6e6e6; + *border: 0px dashed #e6e6e6; + height: 172px; + padding-top: 150px; + text-align: center; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top:0; + *top: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 300px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; + position: relative; +} + +#upload .filelist li { + width: 113px; + height: 113px; + background: url(./images/bg.png); + text-align: center; + margin: 9px 0 0 9px; + *margin: 6px 0 0 6px; + position: relative; + display: block; + float: left; + overflow: hidden; + font-size: 12px; +} + +#upload .filelist li p.log { + position: relative; + top: -45px; +} + +#upload .filelist li p.title { + position: absolute; + top: 0; + left: 0; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + top: 5px; + text-indent: 5px; + text-align: left; +} + +#upload .filelist li p.progress { + position: absolute; + width: 100%; + bottom: 0; + left: 0; + height: 8px; + overflow: hidden; + z-index: 50; + margin: 0; + border-radius: 0; + background: none; + -webkit-box-shadow: 0 0 0; +} + +#upload .filelist li p.progress span { + display: none; + overflow: hidden; + width: 0; + height: 100%; + background: #1483d8 url(./images/progress.png) repeat-x; + + -webit-transition: width 200ms linear; + -moz-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; + transition: width 200ms linear; + + -webkit-animation: progressmove 2s linear infinite; + -moz-animation: progressmove 2s linear infinite; + -o-animation: progressmove 2s linear infinite; + -ms-animation: progressmove 2s linear infinite; + animation: progressmove 2s linear infinite; + + -webkit-transform: translateZ(0); +} + +@-webkit-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@-moz-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +#upload .filelist li p.imgWrap { + position: relative; + z-index: 2; + line-height: 113px; + vertical-align: middle; + overflow: hidden; + width: 113px; + height: 113px; + + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + + -webit-transition: 200ms ease-out; + -moz-transition: 200ms ease-out; + -o-transition: 200ms ease-out; + -ms-transition: 200ms ease-out; + transition: 200ms ease-out; +} + +#upload .filelist li img { + width: 100%; +} + +#upload .filelist li p.error { + background: #f43838; + color: #fff; + position: absolute; + bottom: 0; + left: 0; + height: 28px; + line-height: 28px; + width: 100%; + z-index: 100; + display:none; +} + +#upload .filelist li .success { + display: block; + position: absolute; + left: 0; + bottom: 0; + height: 40px; + width: 100%; + z-index: 200; + background: url(./images/success.png) no-repeat right bottom; + background: url(./images/success.gif) no-repeat right bottom \9; +} + +#upload .filelist li.filePickerBlock { + width: 113px; + height: 113px; + background: url(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display:none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display:none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused{ + background: #00b7ee; + color: #fff; + border-color: transparent; +} +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover{ + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter:alpha(opacity=60); + -moz-opacity:0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + + + +/* 鍥剧墖绠$悊鏍峰紡 */ +#online { + width: 100%; + height: 336px; + padding: 10px 0 0 0; +} +#online #imageList{ + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + position: relative; +} +#online ul { + display: block; + list-style: none; + margin: 0; + padding: 0; +} +#online li { + float: left; + display: block; + list-style: none; + padding: 0; + width: 113px; + height: 113px; + margin: 0 0 9px 9px; + *margin: 0 0 6px 6px; + background-color: #eee; + overflow: hidden; + cursor: pointer; + position: relative; +} +#online li.clearFloat { + float: none; + clear: both; + display: block; + width:0; + height:0; + margin: 0; + padding: 0; +} +#online li img { + cursor: pointer; +} +#online li .icon { + cursor: pointer; + width: 113px; + height: 113px; + position: absolute; + top: 0; + left: 0; + z-index: 2; + border: 0; + background-repeat: no-repeat; +} +#online li .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; +} +#online li.selected .icon { + background-image: url(images/success.png); + background-image: url(images/success.gif)\9; + background-position: 75px 75px; +} +#online li.selected .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; + background-position: 72px 72px; +} + + +/* 鍥剧墖鎼滅储鏍峰紡 */ +#search .searchBar { + width: 100%; + height: 30px; + margin: 10px 0 5px 0; + padding: 0; +} + +#search input.text{ + width: 150px; + padding: 3px 6px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +#search input.text:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); +} +#search input.searchTxt { + margin-left:5px; + padding-left: 5px; + background: #FFF; + width: 300px; + *width: 260px; + height: 21px; + line-height: 21px; + float: left; + dislay: block; +} + +#search .searchType { + width: 65px; + height: 28px; + padding:0; + line-height: 28px; + border: 1px solid #d7d7d7; + border-radius: 0; + vertical-align: top; + margin-left: 5px; + float: left; + dislay: block; +} + +#search #searchBtn, +#search #searchReset { + display: inline-block; + margin-bottom: 0; + margin-right: 5px; + padding: 4px 10px; + font-weight: 400; + text-align: center; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + font-size: 14px; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + vertical-align: top; + float: right; +} + +#search #searchBtn { + color: white; + border-color: #285e8e; + background-color: #3b97d7; +} +#search #searchReset { + color: #333; + border-color: #ccc; + background-color: #fff; +} +#search #searchBtn:hover { + background-color: #3276b1; +} +#search #searchReset:hover { + background-color: #eee; +} + +#search .msg { + margin-left: 5px; +} + +#search .searchList{ + width: 100%; + height: 300px; + overflow: hidden; + clear: both; +} +#search .searchList ul{ + margin:0; + padding:0; + list-style:none; + clear: both; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + zoom: 1; + position: relative; +} + +#search .searchList li { + list-style:none; + float: left; + display: block; + width: 115px; + margin: 5px 10px 5px 20px; + *margin: 5px 10px 5px 15px; + padding:0; + font-size: 12px; + box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + position: relative; + vertical-align: top; + text-align: center; + overflow: hidden; + cursor: pointer; + filter: alpha(Opacity=100); + -moz-opacity: 1; + opacity: 1; + border: 2px solid #eee; +} + +#search .searchList li.selected { + filter: alpha(Opacity=40); + -moz-opacity: 0.4; + opacity: 0.4; + border: 2px solid #00a0e9; +} + +#search .searchList li p { + background-color: #eee; + margin: 0; + padding: 0; + position: relative; + width:100%; + height:115px; + overflow: hidden; +} + +#search .searchList li p img { + cursor: pointer; + border: 0; +} + +#search .searchList li a { + color: #999; + border-top: 1px solid #F2F2F2; + background: #FAFAFA; + text-align: center; + display: block; + padding: 0 5px; + width: 105px; + height:32px; + line-height:32px; + white-space:nowrap; + text-overflow:ellipsis; + text-decoration: none; + overflow: hidden; + word-break: break-all; +} + +#search .searchList a:hover { + text-decoration: underline; + color: #333; +} +#search .searchList .clearFloat{ + clear: both; +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/image.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/image.html new file mode 100644 index 00000000..08ca022d --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/image.html @@ -0,0 +1,120 @@ + + + + + ueditor鍥剧墖瀵硅瘽妗 + + + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    + +   px +   px + +
    +
    + + px +
    +
    + + px +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + 0% + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
      +
    • +
    +
    +
    + + +
    +
    +
    + + + + +
    +
    + + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/image.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/image.js new file mode 100644 index 00000000..c4f52aa8 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/image.js @@ -0,0 +1,1139 @@ +/** + * User: Jinqn + * Date: 14-04-08 + * Time: 涓嬪崍16:34 + * 涓婁紶鍥剧墖瀵硅瘽妗嗛昏緫浠g爜,鍖呮嫭tab: 杩滅▼鍥剧墖/涓婁紶鍥剧墖/鍦ㄧ嚎鍥剧墖/鎼滅储鍥剧墖 + */ + +(function () { + + var remoteImage, + uploadImage, + onlineImage, + searchImage; + + window.onload = function () { + initTabs(); + initAlign(); + initButtons(); + }; + + /* 鍒濆鍖杢ab鏍囩 */ + function initTabs() { + var tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + setTabFocus(target.getAttribute('data-content-id')); + }); + } + + var img = editor.selection.getRange().getClosedNode(); + if (img && img.tagName && img.tagName.toLowerCase() == 'img') { + setTabFocus('remote'); + } else { + setTabFocus('upload'); + } + } + + /* 鍒濆鍖杢abbody */ + function setTabFocus(id) { + if(!id) return; + var i, bodyId, tabs = $G('tabhead').children; + for (i = 0; i < tabs.length; i++) { + bodyId = tabs[i].getAttribute('data-content-id'); + if (bodyId == id) { + domUtils.addClass(tabs[i], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + } else { + domUtils.removeClasses(tabs[i], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + switch (id) { + case 'remote': + remoteImage = remoteImage || new RemoteImage(); + break; + case 'upload': + setAlign(editor.getOpt('imageInsertAlign')); + uploadImage = uploadImage || new UploadImage('queueList'); + break; + case 'online': + setAlign(editor.getOpt('imageManagerInsertAlign')); + onlineImage = onlineImage || new OnlineImage('imageList'); + onlineImage.reset(); + break; + case 'search': + setAlign(editor.getOpt('imageManagerInsertAlign')); + searchImage = searchImage || new SearchImage(); + break; + } + } + + /* 鍒濆鍖杘nok浜嬩欢 */ + function initButtons() { + + dialog.onok = function () { + var remote = false, list = [], id, tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + if (domUtils.hasClass(tabs[i], 'focus')) { + id = tabs[i].getAttribute('data-content-id'); + break; + } + } + + switch (id) { + case 'remote': + list = remoteImage.getInsertList(); + break; + case 'upload': + list = uploadImage.getInsertList(); + var count = uploadImage.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '杩樻湁2涓湭涓婁紶鏂囦欢'.replace(/[\d]/, count) + ''); + return false; + } + break; + case 'online': + list = onlineImage.getInsertList(); + break; + case 'search': + list = searchImage.getInsertList(); + remote = true; + break; + } + + if(list) { + editor.execCommand('insertimage', list); + remote && editor.fireEvent("catchRemoteImage"); + } + }; + } + + + /* 鍒濆鍖栧鍏舵柟寮忕殑鐐瑰嚮浜嬩欢 */ + function initAlign(){ + /* 鐐瑰嚮align鍥炬爣 */ + domUtils.on($G("alignIcon"), 'click', function(e){ + var target = e.target || e.srcElement; + if(target.className && target.className.indexOf('-align') != -1) { + setAlign(target.getAttribute('data-align')); + } + }); + } + + /* 璁剧疆瀵归綈鏂瑰紡 */ + function setAlign(align){ + align = align || 'none'; + var aligns = $G("alignIcon").children; + for(i = 0; i < aligns.length; i++){ + if(aligns[i].getAttribute('data-align') == align) { + domUtils.addClass(aligns[i], 'focus'); + $G("align").value = aligns[i].getAttribute('data-align'); + } else { + domUtils.removeClasses(aligns[i], 'focus'); + } + } + } + /* 鑾峰彇瀵归綈鏂瑰紡 */ + function getAlign(){ + var align = $G("align").value || 'none'; + return align == 'none' ? '':align; + } + + + /* 鍦ㄧ嚎鍥剧墖 */ + function RemoteImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + RemoteImage.prototype = { + init: function () { + this.initContainer(); + this.initEvents(); + }, + initContainer: function () { + this.dom = { + 'url': $G('url'), + 'width': $G('width'), + 'height': $G('height'), + 'border': $G('border'), + 'vhSpace': $G('vhSpace'), + 'title': $G('title'), + 'align': $G('align') + }; + var img = editor.selection.getRange().getClosedNode(); + if (img) { + this.setImage(img); + } + }, + initEvents: function () { + var _this = this, + locker = $G('lock'); + + /* 鏀瑰彉url */ + domUtils.on($G("url"), 'keyup', updatePreview); + domUtils.on($G("border"), 'keyup', updatePreview); + domUtils.on($G("title"), 'keyup', updatePreview); + + domUtils.on($G("width"), 'keyup', function(){ + updatePreview(); + if(locker.checked) { + var proportion =locker.getAttribute('data-proportion'); + $G('height').value = Math.round(this.value / proportion); + } else { + _this.updateLocker(); + } + }); + domUtils.on($G("height"), 'keyup', function(){ + updatePreview(); + if(locker.checked) { + var proportion =locker.getAttribute('data-proportion'); + $G('width').value = Math.round(this.value * proportion); + } else { + _this.updateLocker(); + } + }); + domUtils.on($G("lock"), 'change', function(){ + var proportion = parseInt($G("width").value) /parseInt($G("height").value); + locker.setAttribute('data-proportion', proportion); + }); + + function updatePreview(){ + _this.setPreview(); + } + }, + updateLocker: function(){ + var width = $G('width').value, + height = $G('height').value, + locker = $G('lock'); + if(width && height && width == parseInt(width) && height == parseInt(height)) { + locker.disabled = false; + locker.title = ''; + } else { + locker.checked = false; + locker.disabled = 'disabled'; + locker.title = lang.remoteLockError; + } + }, + setImage: function(img){ + /* 涓嶆槸姝e父鐨勫浘鐗 */ + if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute("src") || !img.src) return; + + var wordImgFlag = img.getAttribute("word_img"), + src = wordImgFlag ? wordImgFlag.replace("&", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&", "&")), + align = editor.queryCommandValue("imageFloat"); + + /* 闃叉onchange浜嬩欢寰幆璋冪敤 */ + if (src !== $G("url").value) $G("url").value = src; + if(src) { + /* 璁剧疆琛ㄥ崟鍐呭 */ + $G("width").value = img.width || ''; + $G("height").value = img.height || ''; + $G("border").value = img.getAttribute("border") || '0'; + $G("vhSpace").value = img.getAttribute("vspace") || '0'; + $G("title").value = img.title || img.alt || ''; + setAlign(align); + this.setPreview(); + this.updateLocker(); + } + }, + getData: function(){ + var data = {}; + for(var k in this.dom){ + data[k] = this.dom[k].value; + } + return data; + }, + setPreview: function(){ + var url = $G('url').value, + ow = $G('width').value, + oh = $G('height').value, + border = $G('border').value, + title = $G('title').value, + preview = $G('preview'), + width, + height; + + width = ((!ow || !oh) ? preview.offsetWidth:Math.min(ow, preview.offsetWidth)); + width = width+(border*2) > preview.offsetWidth ? width:(preview.offsetWidth - (border*2)); + height = (!ow || !oh) ? '':width*oh/ow; + + if(url) { + preview.innerHTML = ''; + } + }, + getInsertList: function () { + var data = this.getData(); + if(data['url']) { + return [{ + src: data['url'], + _src: data['url'], + width: data['width'] || '', + height: data['height'] || '', + border: data['border'] || '', + floatStyle: data['align'] || '', + vspace: data['vhSpace'] || '', + title: data['title'] || '', + alt: data['title'] || '', + style: "width:" + data['width'] + "px;height:" + data['height'] + "px;" + }]; + } else { + return []; + } + } + }; + + + + /* 涓婁紶鍥剧墖 */ + function UploadImage(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + UploadImage.prototype = { + init: function () { + this.imageList = []; + this.initContainer(); + this.initUploader(); + }, + initContainer: function () { + this.$queue = this.$wrap.find('.filelist'); + }, + /* 鍒濆鍖栧鍣 */ + initUploader: function () { + var _this = this, + $ = jQuery, // just in case. Make sure it's not an other libaray. + $wrap = _this.$wrap, + // 鍥剧墖瀹瑰櫒 + $queue = $wrap.find('.filelist'), + // 鐘舵佹爮锛屽寘鎷繘搴﹀拰鎺у埗鎸夐挳 + $statusBar = $wrap.find('.statusBar'), + // 鏂囦欢鎬讳綋閫夋嫨淇℃伅銆 + $info = $statusBar.find('.info'), + // 涓婁紶鎸夐挳 + $upload = $wrap.find('.uploadBtn'), + // 涓婁紶鎸夐挳 + $filePickerBtn = $wrap.find('.filePickerBtn'), + // 涓婁紶鎸夐挳 + $filePickerBlock = $wrap.find('.filePickerBlock'), + // 娌¢夋嫨鏂囦欢涔嬪墠鐨勫唴瀹广 + $placeHolder = $wrap.find('.placeholder'), + // 鎬讳綋杩涘害鏉 + $progress = $statusBar.find('.progress').hide(), + // 娣诲姞鐨勬枃浠舵暟閲 + fileCount = 0, + // 娣诲姞鐨勬枃浠舵诲ぇ灏 + fileSize = 0, + // 浼樺寲retina, 鍦╮etina涓嬭繖涓兼槸2 + ratio = window.devicePixelRatio || 1, + // 缂╃暐鍥惧ぇ灏 + thumbnailWidth = 113 * ratio, + thumbnailHeight = 113 * ratio, + // 鍙兘鏈塸edding, ready, uploading, confirm, done. + state = '', + // 鎵鏈夋枃浠剁殑杩涘害淇℃伅锛宬ey涓篺ile id + percentages = {}, + supportTransition = (function () { + var s = document.createElement('p').style, + r = 'transition' in s || + 'WebkitTransition' in s || + 'MozTransition' in s || + 'msTransition' in s || + 'OTransition' in s; + s = null; + return r; + })(), + // WebUploader瀹炰緥 + uploader, + actionUrl = editor.getActionUrl(editor.getOpt('imageActionName')), + acceptExtensions = (editor.getOpt('imageAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''), + imageMaxSize = editor.getOpt('imageMaxSize'), + imageCompressBorder = editor.getOpt('imageCompressBorder'); + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
    ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('imageActionName')) { + $('#filePickerReady').after($('
    ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + accept: { + title: 'Images', + extensions: acceptExtensions, + mimeTypes: 'image/*' + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('imageFieldName'), + duplicate: true, + fileSingleSizeLimit: imageMaxSize, // 榛樿 2 M + compress: editor.getOpt('imageCompressEnable') ? { + width: imageCompressBorder, + height: imageCompressBorder, + // 鍥剧墖璐ㄩ噺锛屽彧鏈塼ype涓篳image/jpeg`鐨勬椂鍊欐墠鏈夋晥銆 + quality: 90, + // 鏄惁鍏佽鏀惧ぇ锛屽鏋滄兂瑕佺敓鎴愬皬鍥剧殑鏃跺欎笉澶辩湡锛屾閫夐」搴旇璁剧疆涓篺alse. + allowMagnify: false, + // 鏄惁鍏佽瑁佸壀銆 + crop: false, + // 鏄惁淇濈暀澶撮儴meta淇℃伅銆 + preserveHeaders: true + }:false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 褰撴湁鏂囦欢娣诲姞杩涙潵鏃舵墽琛岋紝璐熻矗view鐨勫垱寤 + function addFile(file) { + var $li = $('
  • ' + + '

    ' + file.name + '

    ' + + '

    ' + + '

    ' + + '
  • '), + + $btns = $('
    ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
    ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

    ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + percentages[ file.id ] = [ file.size, 0 ]; + file.rotation = 0; + + /* 妫鏌ユ枃浠舵牸寮 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 鎴愬姛 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[ file.id ][ 1 ] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[ file.id ][ 1 ] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 璐熻矗view鐨勯攢姣 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[ file.id ]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[ 0 ]; + loaded += v[ 0 ] * v[ 1 ]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 鏈夋嫨鏂囦欢 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); $info.hide(); + uploader.refresh(); + break; + + /* 鍙互寮濮嬩笂浼 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 涓婁紶涓 */ + case 'uploading': + $progress.show(); $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 鏆傚仠涓婁紶 */ + case 'paused': + $progress.show(); $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount). + replace('_KB', WebUploader.formatSize(fileSize)). + replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 娣诲姞棰濆鐨凣ET鍙傛暟 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //杩欓噷鍙互閫氳繃data瀵硅薄娣诲姞POST鍙傛暟 + header['X_Requested_With'] = 'XMLHttpRequest'; + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[ file.id ][ 1 ] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + if (json.state == 'SUCCESS') { + _this.imageList.push(json); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, file) { + if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { + addFile(file); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++]; ) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + destroy: function () { + this.$wrap.remove(); + }, + getInsertList: function () { + var i, data, list = [], + align = getAlign(), + prefix = editor.getOpt('imageUrlPrefix'); + for (i = 0; i < this.imageList.length; i++) { + data = this.imageList[i]; + list.push({ + src: prefix + data.url, + _src: prefix + data.url, + title: data.title, + alt: data.original, + floatStyle: align + }); + } + return list; + } + }; + + + /* 鍦ㄧ嚎鍥剧墖 */ + function OnlineImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + OnlineImage.prototype = { + init: function () { + this.reset(); + this.initEvents(); + }, + /* 鍒濆鍖栧鍣 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 鍒濆鍖栨粴鍔ㄤ簨浠,婊氬姩鍒板湴姝ヨ嚜鍔ㄦ媺鍙栨暟鎹 */ + initEvents: function () { + var _this = this; + + /* 婊氬姩鎷夊彇鍥剧墖 */ + domUtils.on($G('imageList'), 'scroll', function(e){ + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getImageData(); + } + }); + /* 閫変腑鍥剧墖 */ + domUtils.on(this.container, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + /* 鍒濆鍖栫涓娆$殑鏁版嵁 */ + initData: function () { + + /* 鎷夊彇鏁版嵁闇瑕佷娇鐢ㄧ殑鍊 */ + this.state = 0; + this.listSize = editor.getOpt('imageManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 绗竴娆℃媺鍙栨暟鎹 */ + this.getImageData(); + }, + /* 閲嶇疆鐣岄潰 */ + reset: function() { + this.initContainer(); + this.initData(); + }, + /* 鍚戝悗鍙版媺鍙栧浘鐗囧垪琛ㄦ暟鎹 */ + getImageData: function () { + var _this = this; + + if(!_this.listEnd && !this.isLoadingData) { + this.isLoadingData = true; + var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), + isJsonp = utils.isCrossDomainUrl(url); + ajax.request(url, { + 'timeout': 100000, + 'dataType': isJsonp ? 'jsonp':'', + 'data': utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + 'method': 'get', + 'onsuccess': function (r) { + try { + var json = isJsonp ? r:eval('(' + r.responseText + ')'); + if (json.state == 'SUCCESS') { + _this.pushData(json.list); + _this.listIndex = parseInt(json.start) + parseInt(json.list.length); + if(_this.listIndex >= json.total) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if(r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + 'onerror': function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 娣诲姞鍥剧墖鍒板垪琛ㄧ晫闈笂 */ + pushData: function (list) { + var i, item, img, icon, _this = this, + urlPrefix = editor.getOpt('imageManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + if(list[i] && list[i].url) { + item = document.createElement('li'); + img = document.createElement('img'); + icon = document.createElement('span'); + + domUtils.on(img, 'load', (function(image){ + return function(){ + _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); + } + })(img)); + img.width = 113; + img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); + img.setAttribute('_src', urlPrefix + list[i].url); + domUtils.addClass(icon, 'icon'); + + item.appendChild(img); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 鏀瑰彉鍥剧墖澶у皬 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = [], align = getAlign(); + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var img = lis[i].firstChild, + src = img.getAttribute('_src'); + list.push({ + src: src, + _src: src, + alt: src.substr(src.lastIndexOf('/') + 1), + floatStyle: align + }); + } + + } + return list; + } + }; + + /*鎼滅储鍥剧墖 */ + function SearchImage() { + this.init(); + } + SearchImage.prototype = { + init: function () { + this.initEvents(); + }, + initEvents: function(){ + var _this = this; + + /* 鐐瑰嚮鎼滅储鎸夐挳 */ + domUtils.on($G('searchBtn'), 'click', function(){ + var key = $G('searchTxt').value; + if(key && key != lang.searchRemind) { + _this.getImageData(); + } + }); + /* 鐐瑰嚮娓呴櫎濡 */ + domUtils.on($G('searchReset'), 'click', function(){ + $G('searchTxt').value = lang.searchRemind; + $G('searchListUl').innerHTML = ''; + $G('searchType').selectedIndex = 0; + }); + /* 鎼滅储妗嗚仛鐒 */ + domUtils.on($G('searchTxt'), 'focus', function(){ + var key = $G('searchTxt').value; + if(key && key == lang.searchRemind) { + $G('searchTxt').value = ''; + } + }); + /* 鎼滅储妗嗗洖杞﹂敭鎼滅储 */ + domUtils.on($G('searchTxt'), 'keydown', function(e){ + var keyCode = e.keyCode || e.which; + if (keyCode == 13) { + $G('searchBtn').click(); + } + }); + + /* 閫変腑鍥剧墖 */ + domUtils.on($G('searchList'), 'click', function(e){ + var target = e.target || e.srcElement, + li = target.parentNode.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + encodeToGb2312:function (str){ + if(!str) return ''; + var strOut = "", + z = 'D2BBB6A18140C6DF814181428143CDF2D5C9C8FDC9CFCFC2D8A2B2BBD3EB8144D8A4B3F38145D7A8C7D2D8A7CAC08146C7F0B1FBD2B5B4D4B6ABCBBFD8A9814781488149B6AA814AC1BDD1CF814BC9A5D8AD814CB8F6D1BEE3DCD6D0814D814EB7E1814FB4AE8150C1D98151D8BC8152CDE8B5A4CEAAD6F78153C0F6BED9D8AF815481558156C4CB8157BEC38158D8B1C3B4D2E58159D6AECEDAD5A7BAF5B7A6C0D6815AC6B9C5D2C7C7815BB9D4815CB3CBD2D2815D815ED8BFBEC5C6F2D2B2CFB0CFE7815F816081618162CAE981638164D8C081658166816781688169816AC2F2C2D2816BC8E9816C816D816E816F817081718172817381748175C7AC8176817781788179817A817B817CC1CB817DD3E8D5F9817ECAC2B6FED8A1D3DABFF78180D4C6BBA5D8C1CEE5BEAE81818182D8A88183D1C7D0A9818481858186D8BDD9EFCDF6BFBA8187BDBBBAA5D2E0B2FABAE0C4B68188CFEDBEA9CDA4C1C18189818A818BC7D7D9F1818CD9F4818D818E818F8190C8CBD8E9819181928193D2DACAB2C8CAD8ECD8EAD8C6BDF6C6CDB3F08194D8EBBDF1BDE98195C8D4B4D381968197C2D88198B2D6D7D0CACBCBFBD5CCB8B6CFC98199819A819BD9DAD8F0C7AA819CD8EE819DB4FAC1EED2D4819E819FD8ED81A0D2C7D8EFC3C781A181A281A3D1F681A4D6D9D8F281A5D8F5BCFEBCDB81A681A781A8C8CE81A9B7DD81AAB7C281ABC6F381AC81AD81AE81AF81B081B181B2D8F8D2C181B381B4CEE9BCBFB7FCB7A5D0DD81B581B681B781B881B9D6DAD3C5BBEFBBE1D8F181BA81BBC9A1CEB0B4AB81BCD8F381BDC9CBD8F6C2D7D8F781BE81BFCEB1D8F981C081C181C2B2AEB9C081C3D9A381C4B0E981C5C1E681C6C9EC81C7CBC581C8CBC6D9A481C981CA81CB81CC81CDB5E881CE81CFB5AB81D081D181D281D381D481D5CEBBB5CDD7A1D7F4D3D381D6CCE581D7BACE81D8D9A2D9DCD3E0D8FDB7F0D7F7D8FED8FAD9A1C4E381D981DAD3B6D8F4D9DD81DBD8FB81DCC5E581DD81DEC0D081DF81E0D1F0B0DB81E181E2BCD1D9A681E3D9A581E481E581E681E7D9ACD9AE81E8D9ABCAB981E981EA81EBD9A9D6B681EC81ED81EEB3DED9A881EFC0FD81F0CACC81F1D9AA81F2D9A781F381F4D9B081F581F6B6B181F781F881F9B9A981FAD2C081FB81FCCFC081FD81FEC2C28240BDC4D5ECB2E0C7C8BFEBD9AD8241D9AF8242CEEABAEE82438244824582468247C7D682488249824A824B824C824D824E824F8250B1E3825182528253B4D9B6EDD9B48254825582568257BFA182588259825AD9DEC7CEC0FED9B8825B825C825D825E825FCBD7B7FD8260D9B58261D9B7B1A3D3E1D9B98262D0C58263D9B682648265D9B18266D9B2C1A9D9B382678268BCF3D0DEB8A98269BEE3826AD9BD826B826C826D826ED9BA826FB0B3827082718272D9C28273827482758276827782788279827A827B827C827D827E8280D9C4B1B68281D9BF82828283B5B98284BEF3828582868287CCC8BAF2D2D08288D9C38289828ABDE8828BB3AB828C828D828ED9C5BEEB828FD9C6D9BBC4DF8290D9BED9C1D9C0829182928293829482958296829782988299829A829BD5AE829CD6B5829DC7E3829E829F82A082A1D9C882A282A382A4BCD9D9CA82A582A682A7D9BC82A8D9CBC6AB82A982AA82AB82AC82ADD9C982AE82AF82B082B1D7F682B2CDA382B382B482B582B682B782B882B982BABDA182BB82BC82BD82BE82BF82C0D9CC82C182C282C382C482C582C682C782C882C9C5BCCDB582CA82CB82CCD9CD82CD82CED9C7B3A5BFFE82CF82D082D182D2B8B582D382D4C0FC82D582D682D782D8B0F882D982DA82DB82DC82DD82DE82DF82E082E182E282E382E482E582E682E782E882E982EA82EB82EC82EDB4F682EED9CE82EFD9CFB4A2D9D082F082F1B4DF82F282F382F482F582F6B0C182F782F882F982FA82FB82FC82FDD9D1C9B582FE8340834183428343834483458346834783488349834A834B834C834D834E834F83508351CFF1835283538354835583568357D9D283588359835AC1C5835B835C835D835E835F836083618362836383648365D9D6C9AE8366836783688369D9D5D9D4D9D7836A836B836C836DCBDB836EBDA9836F8370837183728373C6A7837483758376837783788379837A837B837C837DD9D3D9D8837E83808381D9D9838283838384838583868387C8E583888389838A838B838C838D838E838F839083918392839383948395C0DC8396839783988399839A839B839C839D839E839F83A083A183A283A383A483A583A683A783A883A983AA83AB83AC83AD83AE83AF83B083B183B2B6F9D8A3D4CA83B3D4AAD0D6B3E4D5D783B4CFC8B9E283B5BFCB83B6C3E283B783B883B9B6D283BA83BBCDC3D9EED9F083BC83BD83BEB5B383BFB6B583C083C183C283C383C4BEA483C583C6C8EB83C783C8C8AB83C983CAB0CBB9ABC1F9D9E283CBC0BCB9B283CCB9D8D0CBB1F8C6E4BEDFB5E4D7C883CDD1F8BCE6CADE83CE83CFBCBDD9E6D8E783D083D1C4DA83D283D3B8D4C8BD83D483D5B2E1D4D983D683D783D883D9C3B083DA83DBC3E1DAA2C8DF83DCD0B483DDBEFCC5A983DE83DF83E0B9DA83E1DAA383E2D4A9DAA483E383E483E583E683E7D9FBB6AC83E883E9B7EBB1F9D9FCB3E5BEF683EABFF6D2B1C0E483EB83EC83EDB6B3D9FED9FD83EE83EFBEBB83F083F183F2C6E083F3D7BCDAA183F4C1B983F5B5F2C1E883F683F7BCF583F8B4D583F983FA83FB83FC83FD83FE844084418442C1DD8443C4FD84448445BCB8B7B284468447B7EF84488449844A844B844C844DD9EC844EC6BE844FBFADBBCB84508451B5CA8452DBC9D0D78453CDB9B0BCB3F6BBF7DBCABAAF8454D4E4B5B6B5F3D8D6C8D084558456B7D6C7D0D8D78457BFAF84588459DBBBD8D8845A845BD0CCBBAE845C845D845EEBBEC1D0C1F5D4F2B8D5B4B4845FB3F584608461C9BE846284638464C5D0846584668467C5D9C0FB8468B1F08469D8D9B9CE846AB5BD846B846CD8DA846D846ED6C6CBA2C8AFC9B2B4CCBFCC846FB9F48470D8DBD8DCB6E7BCC1CCEA847184728473847484758476CFF78477D8DDC7B084788479B9D0BDA3847A847BCCDE847CC6CA847D847E848084818482D8E08483D8DE84848485D8DF848684878488B0FE8489BEE7848ACAA3BCF4848B848C848D848EB8B1848F8490B8EE849184928493849484958496849784988499849AD8E2849BBDCB849CD8E4D8E3849D849E849F84A084A1C5FC84A284A384A484A584A684A784A8D8E584A984AAD8E684AB84AC84AD84AE84AF84B084B1C1A684B2C8B0B0ECB9A6BCD3CEF1DBBDC1D384B384B484B584B6B6AFD6FAC5ACBDD9DBBEDBBF84B784B884B9C0F8BEA2C0CD84BA84BB84BC84BD84BE84BF84C084C184C284C3DBC0CAC684C484C584C6B2AA84C784C884C9D3C284CAC3E384CBD1AB84CC84CD84CE84CFDBC284D0C0D584D184D284D3DBC384D4BFB184D584D684D784D884D984DAC4BC84DB84DC84DD84DEC7DA84DF84E084E184E284E384E484E584E684E784E884E9DBC484EA84EB84EC84ED84EE84EF84F084F1D9E8C9D784F284F384F4B9B4CEF0D4C884F584F684F784F8B0FCB4D284F9D0D984FA84FB84FC84FDD9E984FEDECBD9EB8540854185428543D8B0BBAFB1B18544B3D7D8CE85458546D4D185478548BDB3BFEF8549CFBB854A854BD8D0854C854D854EB7CB854F85508551D8D185528553855485558556855785588559855A855BC6A5C7F8D2BD855C855DD8D2C4E4855ECAAE855FC7A78560D8A68561C9FDCEE7BBDCB0EB856285638564BBAAD0AD8565B1B0D7E4D7BF8566B5A5C2F4C4CF85678568B2A98569B2B7856AB1E5DFB2D5BCBFA8C2ACD8D5C2B1856BD8D4CED4856CDAE0856DCEC0856E856FD8B4C3AED3A1CEA38570BCB4C8B4C2D18571BEEDD0B68572DAE18573857485758576C7E485778578B3A78579B6F2CCFCC0FA857A857BC0F7857CD1B9D1E1D8C7857D857E85808581858285838584B2DE85858586C0E58587BAF185888589D8C8858AD4AD858B858CCFE1D8C9858DD8CACFC3858EB3F8BEC7858F859085918592D8CB8593859485958596859785988599DBCC859A859B859C859DC8A5859E859F85A0CFD885A1C8FEB2CE85A285A385A485A585A6D3D6B2E6BCB0D3D1CBABB7B485A785A885A9B7A285AA85ABCAE585ACC8A1CADCB1E4D0F085ADC5D185AE85AF85B0DBC5B5FE85B185B2BFDAB9C5BEE4C1ED85B3DFB6DFB5D6BBBDD0D5D9B0C8B6A3BFC9CCA8DFB3CAB7D3D285B4D8CFD2B6BAC5CBBECCBE85B5DFB7B5F0DFB485B685B785B8D3F585B9B3D4B8F785BADFBA85BBBACFBCAAB5F585BCCDACC3FBBAF3C0F4CDC2CFF2DFB8CFC585BDC2C0DFB9C2F085BE85BF85C0BEFD85C1C1DFCDCCD2F7B7CDDFC185C2DFC485C385C4B7F1B0C9B6D6B7D485C5BAACCCFDBFD4CBB1C6F485C6D6A8DFC585C7CEE2B3B385C885C9CEFCB4B585CACEC7BAF085CBCEE185CCD1BD85CD85CEDFC085CF85D0B4F485D1B3CA85D2B8E6DFBB85D385D485D585D6C4C585D7DFBCDFBDDFBEC5BBDFBFDFC2D4B1DFC385D8C7BACED885D985DA85DB85DC85DDC4D885DEDFCA85DFDFCF85E0D6DC85E185E285E385E485E585E685E785E8DFC9DFDACEB685E9BAC7DFCEDFC8C5DE85EA85EBC9EBBAF4C3FC85EC85EDBED785EEDFC685EFDFCD85F0C5D885F185F285F385F4D5A6BACD85F5BECCD3BDB8C085F6D6E485F7DFC7B9BEBFA785F885F9C1FCDFCBDFCC85FADFD085FB85FC85FD85FE8640DFDBDFE58641DFD7DFD6D7C9DFE3DFE4E5EBD2A7DFD28642BFA98643D4DB8644BFC8DFD4864586468647CFCC86488649DFDD864AD1CA864BDFDEB0A7C6B7DFD3864CBAE5864DB6DFCDDBB9FED4D5864E864FDFDFCFECB0A5DFE7DFD1D1C6DFD5DFD8DFD9DFDC8650BBA98651DFE0DFE18652DFE2DFE6DFE8D3B486538654865586568657B8E7C5B6DFEAC9DAC1A8C4C486588659BFDECFF8865A865B865CD5DCDFEE865D865E865F866086618662B2B88663BADFDFEC8664DBC18665D1E48666866786688669CBF4B4BD866AB0A6866B866C866D866E866FDFF1CCC6DFF286708671DFED867286738674867586768677DFE986788679867A867BDFEB867CDFEFDFF0BBBD867D867EDFF386808681DFF48682BBA38683CADBCEA8E0A7B3AA8684E0A6868586868687E0A186888689868A868BDFFE868CCDD9DFFC868DDFFA868EBFD0D7C4868FC9CC86908691DFF8B0A186928693869486958696DFFD869786988699869ADFFBE0A2869B869C869D869E869FE0A886A086A186A286A3B7C886A486A5C6A1C9B6C0B2DFF586A686A7C5BE86A8D8C4DFF9C4F686A986AA86AB86AC86AD86AEE0A3E0A4E0A5D0A586AF86B0E0B4CCE486B1E0B186B2BFA6E0AFCEB9E0ABC9C686B386B4C0AEE0AEBAEDBAB0E0A986B586B686B7DFF686B8E0B386B986BAE0B886BB86BC86BDB4ADE0B986BE86BFCFB2BAC886C0E0B086C186C286C386C486C586C686C7D0FA86C886C986CA86CB86CC86CD86CE86CF86D0E0AC86D1D4FB86D2DFF786D3C5E786D4E0AD86D5D3F786D6E0B6E0B786D786D886D986DA86DBE0C4D0E186DC86DD86DEE0BC86DF86E0E0C9E0CA86E186E286E3E0BEE0AAC9A4E0C186E4E0B286E586E686E786E886E9CAC8E0C386EAE0B586EBCECB86ECCBC3E0CDE0C6E0C286EDE0CB86EEE0BAE0BFE0C086EF86F0E0C586F186F2E0C7E0C886F3E0CC86F4E0BB86F586F686F786F886F9CBD4E0D586FAE0D6E0D286FB86FC86FD86FE87408741E0D0BCCE87428743E0D18744B8C2D8C587458746874787488749874A874B874CD0EA874D874EC2EF874F8750E0CFE0BD875187528753E0D4E0D387548755E0D78756875787588759E0DCE0D8875A875B875CD6F6B3B0875DD7EC875ECBBB875F8760E0DA8761CEFB876287638764BAD987658766876787688769876A876B876C876D876E876F8770E0E1E0DDD2AD87718772877387748775E0E287768777E0DBE0D9E0DF87788779E0E0877A877B877C877D877EE0DE8780E0E4878187828783C6F7D8ACD4EBE0E6CAC98784878587868787E0E587888789878A878BB8C1878C878D878E878FE0E7E0E887908791879287938794879587968797E0E9E0E387988799879A879B879C879D879EBABFCCE7879F87A087A1E0EA87A287A387A487A587A687A787A887A987AA87AB87AC87AD87AE87AF87B0CFF987B187B287B387B487B587B687B787B887B987BA87BBE0EB87BC87BD87BE87BF87C087C187C2C8C287C387C487C587C6BDC087C787C887C987CA87CB87CC87CD87CE87CF87D087D187D287D3C4D287D487D587D687D787D887D987DA87DB87DCE0EC87DD87DEE0ED87DF87E0C7F4CBC487E1E0EEBBD8D8B6D2F2E0EFCDC587E2B6DA87E387E487E587E687E787E8E0F187E9D4B087EA87EBC0A7B4D187EC87EDCEA7E0F087EE87EF87F0E0F2B9CC87F187F2B9FACDBCE0F387F387F487F5C6D4E0F487F6D4B287F7C8A6E0F6E0F587F887F987FA87FB87FC87FD87FE8840884188428843884488458846884788488849E0F7884A884BCDC1884C884D884ECAA5884F885088518852D4DADBD7DBD98853DBD8B9E7DBDCDBDDB5D888548855DBDA8856885788588859885ADBDBB3A1DBDF885B885CBBF8885DD6B7885EDBE0885F886088618862BEF988638864B7BB8865DBD0CCAEBFB2BBB5D7F8BFD38866886788688869886ABFE9886B886CBCE1CCB3DBDEB0D3CEEBB7D8D7B9C6C2886D886EC0A4886FCCB98870DBE7DBE1C6BADBE38871DBE88872C5F7887388748875DBEA88768877DBE9BFC088788879887ADBE6DBE5887B887C887D887E8880B4B9C0ACC2A2DBE2DBE48881888288838884D0CDDBED88858886888788888889C0DDDBF2888A888B888C888D888E888F8890B6E28891889288938894DBF3DBD2B9B8D4ABDBEC8895BFD1DBF08896DBD18897B5E68898DBEBBFE58899889A889BDBEE889CDBF1889D889E889FDBF988A088A188A288A388A488A588A688A788A8B9A1B0A388A988AA88AB88AC88AD88AE88AFC2F188B088B1B3C7DBEF88B288B3DBF888B4C6D2DBF488B588B6DBF5DBF7DBF688B788B8DBFE88B9D3F2B2BA88BA88BB88BCDBFD88BD88BE88BF88C088C188C288C388C4DCA488C5DBFB88C688C788C888C9DBFA88CA88CB88CCDBFCC5E0BBF988CD88CEDCA388CF88D0DCA588D1CCC388D288D388D4B6D1DDC088D588D688D7DCA188D8DCA288D988DA88DBC7B588DC88DD88DEB6E988DF88E088E1DCA788E288E388E488E5DCA688E6DCA9B1A488E788E8B5CC88E988EA88EB88EC88EDBFB088EE88EF88F088F188F2D1DF88F388F488F588F6B6C288F788F888F988FA88FB88FC88FD88FE894089418942894389448945DCA88946894789488949894A894B894CCBFAEBF3894D894E894FCBDC89508951CBFE895289538954CCC189558956895789588959C8FB895A895B895C895D895E895FDCAA89608961896289638964CCEEDCAB89658966896789688969896A896B896C896D896E896F897089718972897389748975DBD38976DCAFDCAC8977BEB38978CAFB8979897A897BDCAD897C897D897E89808981898289838984C9CAC4B989858986898789888989C7BDDCAE898A898B898CD4F6D0E6898D898E898F89908991899289938994C4ABB6D589958996899789988999899A899B899C899D899E899F89A089A189A289A389A489A589A6DBD489A789A889A989AAB1DA89AB89AC89ADDBD589AE89AF89B089B189B289B389B489B589B689B789B8DBD689B989BA89BBBABE89BC89BD89BE89BF89C089C189C289C389C489C589C689C789C889C9C8C089CA89CB89CC89CD89CE89CFCABFC8C989D0D7B389D1C9F989D289D3BFC789D489D5BAF889D689D7D2BC89D889D989DA89DB89DC89DD89DE89DFE2BA89E0B4A689E189E2B1B889E389E489E589E689E7B8B489E8CFC489E989EA89EB89ECD9E7CFA6CDE289ED89EED9EDB6E089EFD2B989F089F1B9BB89F289F389F489F5E2B9E2B789F6B4F389F7CCECCCABB7F289F8D8B2D1EBBABB89F9CAA789FA89FBCDB789FC89FDD2C4BFE4BCD0B6E189FEDEC58A408A418A428A43DEC6DBBC8A44D1D98A458A46C6E6C4CEB7EE8A47B7DC8A488A49BFFCD7E08A4AC6F58A4B8A4CB1BCDEC8BDB1CCD7DECA8A4DDEC98A4E8A4F8A508A518A52B5EC8A53C9DD8A548A55B0C28A568A578A588A598A5A8A5B8A5C8A5D8A5E8A5F8A608A618A62C5AEC5AB8A63C4CC8A64BCE9CBFD8A658A668A67BAC38A688A698A6AE5F9C8E7E5FACDFD8A6BD7B1B8BEC2E88A6CC8D18A6D8A6EE5FB8A6F8A708A718A72B6CABCCB8A738A74D1FDE6A18A75C3EE8A768A778A788A79E6A48A7A8A7B8A7C8A7DE5FEE6A5CDD78A7E8A80B7C1E5FCE5FDE6A38A818A82C4DDE6A88A838A84E6A78A858A868A878A888A898A8AC3C38A8BC6DE8A8C8A8DE6AA8A8E8A8F8A908A918A928A938A94C4B78A958A968A97E6A2CABC8A988A998A9A8A9BBDE3B9C3E6A6D0D5CEAF8A9C8A9DE6A9E6B08A9ED2A68A9FBDAAE6AD8AA08AA18AA28AA38AA4E6AF8AA5C0D18AA68AA7D2CC8AA88AA98AAABCA78AAB8AAC8AAD8AAE8AAF8AB08AB18AB28AB38AB48AB58AB6E6B18AB7D2F68AB88AB98ABAD7CB8ABBCDFE8ABCCDDEC2A6E6ABE6ACBDBFE6AEE6B38ABD8ABEE6B28ABF8AC08AC18AC2E6B68AC3E6B88AC48AC58AC68AC7C4EF8AC88AC98ACAC4C88ACB8ACCBEEAC9EF8ACD8ACEE6B78ACFB6F08AD08AD18AD2C3E48AD38AD48AD58AD68AD78AD88AD9D3E9E6B48ADAE6B58ADBC8A28ADC8ADD8ADE8ADF8AE0E6BD8AE18AE28AE3E6B98AE48AE58AE68AE78AE8C6C58AE98AEACDF1E6BB8AEB8AEC8AED8AEE8AEF8AF08AF18AF28AF38AF4E6BC8AF58AF68AF78AF8BBE98AF98AFA8AFB8AFC8AFD8AFE8B40E6BE8B418B428B438B44E6BA8B458B46C0B78B478B488B498B4A8B4B8B4C8B4D8B4E8B4FD3A4E6BFC9F4E6C38B508B51E6C48B528B538B548B55D0F68B568B578B588B598B5A8B5B8B5C8B5D8B5E8B5F8B608B618B628B638B648B658B668B67C3BD8B688B698B6A8B6B8B6C8B6D8B6EC3C4E6C28B6F8B708B718B728B738B748B758B768B778B788B798B7A8B7B8B7CE6C18B7D8B7E8B808B818B828B838B84E6C7CFB18B85EBF48B868B87E6CA8B888B898B8A8B8B8B8CE6C58B8D8B8EBCDEC9A98B8F8B908B918B928B938B94BCB58B958B96CFD38B978B988B998B9A8B9BE6C88B9CE6C98B9DE6CE8B9EE6D08B9F8BA08BA1E6D18BA28BA38BA4E6CBB5D58BA5E6CC8BA68BA7E6CF8BA88BA9C4DB8BAAE6C68BAB8BAC8BAD8BAE8BAFE6CD8BB08BB18BB28BB38BB48BB58BB68BB78BB88BB98BBA8BBB8BBC8BBD8BBE8BBF8BC08BC18BC28BC38BC48BC58BC6E6D28BC78BC88BC98BCA8BCB8BCC8BCD8BCE8BCF8BD08BD18BD2E6D4E6D38BD38BD48BD58BD68BD78BD88BD98BDA8BDB8BDC8BDD8BDE8BDF8BE08BE18BE28BE38BE48BE58BE68BE78BE88BE98BEA8BEB8BECE6D58BEDD9F88BEE8BEFE6D68BF08BF18BF28BF38BF48BF58BF68BF7E6D78BF88BF98BFA8BFB8BFC8BFD8BFE8C408C418C428C438C448C458C468C47D7D3E6DD8C48E6DEBFD7D4D08C49D7D6B4E6CBEFE6DAD8C3D7CED0A28C4AC3CF8C4B8C4CE6DFBCBEB9C2E6DBD1A78C4D8C4EBAA2C2CF8C4FD8AB8C508C518C52CAEBE5EE8C53E6DC8C54B7F58C558C568C578C58C8E68C598C5AC4F58C5B8C5CE5B2C4FE8C5DCBFCE5B3D5AC8C5ED3EECAD8B0B28C5FCBCECDEA8C608C61BAEA8C628C638C64E5B58C65E5B48C66D7DAB9D9D6E6B6A8CDF0D2CBB1A6CAB58C67B3E8C9F3BFCDD0FBCAD2E5B6BBC28C688C698C6ACFDCB9AC8C6B8C6C8C6D8C6ED4D78C6F8C70BAA6D1E7CFFCBCD28C71E5B7C8DD8C728C738C74BFEDB1F6CBDE8C758C76BCC58C77BCC4D2FAC3DCBFDC8C788C798C7A8C7BB8BB8C7C8C7D8C7EC3C28C80BAAED4A28C818C828C838C848C858C868C878C888C89C7DEC4AFB2EC8C8AB9D18C8B8C8CE5BBC1C88C8D8C8ED5AF8C8F8C908C918C928C93E5BC8C94E5BE8C958C968C978C988C998C9A8C9BB4E7B6D4CBC2D1B0B5BC8C9C8C9DCAD98C9EB7E28C9F8CA0C9E48CA1BDAB8CA28CA3CEBED7F08CA48CA58CA68CA7D0A18CA8C9D98CA98CAAB6FBE6D8BCE28CABB3BE8CACC9D08CADE6D9B3A28CAE8CAF8CB08CB1DECC8CB2D3C8DECD8CB3D2A28CB48CB58CB68CB7DECE8CB88CB98CBA8CBBBECD8CBC8CBDDECF8CBE8CBF8CC0CAACD2FCB3DFE5EAC4E1BEA1CEB2C4F2BED6C6A8B2E38CC18CC2BED38CC38CC4C7FCCCEBBDECCEDD8CC58CC6CABAC6C1E5ECD0BC8CC78CC88CC9D5B98CCA8CCB8CCCE5ED8CCD8CCE8CCF8CD0CAF48CD1CDC0C2C58CD2E5EF8CD3C2C4E5F08CD48CD58CD68CD78CD88CD98CDAE5F8CDCD8CDBC9BD8CDC8CDD8CDE8CDF8CE08CE18CE2D2D9E1A88CE38CE48CE58CE6D3EC8CE7CBEAC6F18CE88CE98CEA8CEB8CECE1AC8CED8CEE8CEFE1A7E1A98CF08CF1E1AAE1AF8CF28CF3B2ED8CF4E1ABB8DAE1ADE1AEE1B0B5BAE1B18CF58CF68CF78CF88CF9E1B3E1B88CFA8CFB8CFC8CFD8CFED1D28D40E1B6E1B5C1EB8D418D428D43E1B78D44D4C08D45E1B28D46E1BAB0B68D478D488D498D4AE1B48D4BBFF98D4CE1B98D4D8D4EE1BB8D4F8D508D518D528D538D54E1BE8D558D568D578D588D598D5AE1BC8D5B8D5C8D5D8D5E8D5F8D60D6C58D618D628D638D648D658D668D67CFBF8D688D69E1BDE1BFC2CD8D6AB6EB8D6BD3F88D6C8D6DC7CD8D6E8D6FB7E58D708D718D728D738D748D758D768D778D788D79BEFE8D7A8D7B8D7C8D7D8D7E8D80E1C0E1C18D818D82E1C7B3E78D838D848D858D868D878D88C6E98D898D8A8D8B8D8C8D8DB4DE8D8ED1C28D8F8D908D918D92E1C88D938D94E1C68D958D968D978D988D99E1C58D9AE1C3E1C28D9BB1C08D9C8D9D8D9ED5B8E1C48D9F8DA08DA18DA28DA3E1CB8DA48DA58DA68DA78DA88DA98DAA8DABE1CCE1CA8DAC8DAD8DAE8DAF8DB08DB18DB28DB3EFFA8DB48DB5E1D3E1D2C7B68DB68DB78DB88DB98DBA8DBB8DBC8DBD8DBE8DBF8DC0E1C98DC18DC2E1CE8DC3E1D08DC48DC58DC68DC78DC88DC98DCA8DCB8DCC8DCD8DCEE1D48DCFE1D1E1CD8DD08DD1E1CF8DD28DD38DD48DD5E1D58DD68DD78DD88DD98DDA8DDB8DDC8DDD8DDE8DDF8DE08DE18DE2E1D68DE38DE48DE58DE68DE78DE88DE98DEA8DEB8DEC8DED8DEE8DEF8DF08DF18DF28DF38DF48DF58DF68DF78DF8E1D78DF98DFA8DFBE1D88DFC8DFD8DFE8E408E418E428E438E448E458E468E478E488E498E4A8E4B8E4C8E4D8E4E8E4F8E508E518E528E538E548E55E1DA8E568E578E588E598E5A8E5B8E5C8E5D8E5E8E5F8E608E618E62E1DB8E638E648E658E668E678E688E69CEA18E6A8E6B8E6C8E6D8E6E8E6F8E708E718E728E738E748E758E76E7DD8E77B4A8D6DD8E788E79D1B2B3B28E7A8E7BB9A4D7F3C7C9BEDEB9AE8E7CCED78E7D8E7EB2EEDBCF8E80BCBAD2D1CBC8B0CD8E818E82CFEF8E838E848E858E868E87D9E3BDED8E888E89B1D2CAD0B2BC8E8ACBA7B7AB8E8BCAA68E8C8E8D8E8ECFA38E8F8E90E0F8D5CAE0FB8E918E92E0FAC5C1CCFB8E93C1B1E0F9D6E3B2AFD6C4B5DB8E948E958E968E978E988E998E9A8E9BB4F8D6A18E9C8E9D8E9E8E9F8EA0CFAFB0EF8EA18EA2E0FC8EA38EA48EA58EA68EA7E1A1B3A38EA88EA9E0FDE0FEC3B18EAA8EAB8EAC8EADC3DD8EAEE1A2B7F98EAF8EB08EB18EB28EB38EB4BBCF8EB58EB68EB78EB88EB98EBA8EBBE1A3C4BB8EBC8EBD8EBE8EBF8EC0E1A48EC18EC2E1A58EC38EC4E1A6B4B18EC58EC68EC78EC88EC98ECA8ECB8ECC8ECD8ECE8ECF8ED08ED18ED28ED3B8C9C6BDC4EA8ED4B2A28ED5D0D28ED6E7DBBBC3D3D7D3C48ED7B9E3E2CF8ED88ED98EDAD7AF8EDBC7ECB1D38EDC8EDDB4B2E2D18EDE8EDF8EE0D0F2C2AEE2D08EE1BFE2D3A6B5D7E2D2B5EA8EE2C3EDB8FD8EE3B8AE8EE4C5D3B7CFE2D48EE58EE68EE78EE8E2D3B6C8D7F98EE98EEA8EEB8EEC8EEDCDA58EEE8EEF8EF08EF18EF2E2D88EF3E2D6CAFCBFB5D3B9E2D58EF48EF58EF68EF7E2D78EF88EF98EFA8EFB8EFC8EFD8EFE8F408F418F42C1AEC0C88F438F448F458F468F478F48E2DBE2DAC0AA8F498F4AC1CE8F4B8F4C8F4D8F4EE2DC8F4F8F508F518F528F538F548F558F568F578F588F598F5AE2DD8F5BE2DE8F5C8F5D8F5E8F5F8F608F618F628F638F64DBC88F65D1D3CDA28F668F67BDA88F688F698F6ADEC3D8A5BFAADBCDD2ECC6FAC5AA8F6B8F6C8F6DDEC48F6EB1D7DFAE8F6F8F708F71CABD8F72DFB18F73B9AD8F74D2FD8F75B8A5BAEB8F768F77B3DA8F788F798F7AB5DCD5C58F7B8F7C8F7D8F7EC3D6CFD2BBA18F80E5F3E5F28F818F82E5F48F83CDE48F84C8F58F858F868F878F888F898F8A8F8BB5AFC7BF8F8CE5F68F8D8F8E8F8FECB08F908F918F928F938F948F958F968F978F988F998F9A8F9B8F9C8F9D8F9EE5E68F9FB9E9B5B18FA0C2BCE5E8E5E7E5E98FA18FA28FA38FA4D2CD8FA58FA68FA7E1EAD0CE8FA8CDAE8FA9D1E58FAA8FABB2CAB1EB8FACB1F2C5ED8FAD8FAED5C3D3B08FAFE1DC8FB08FB18FB2E1DD8FB3D2DB8FB4B3B9B1CB8FB58FB68FB7CDF9D5F7E1DE8FB8BEB6B4FD8FB9E1DFBADCE1E0BBB2C2C9E1E18FBA8FBB8FBCD0EC8FBDCDBD8FBE8FBFE1E28FC0B5C3C5C7E1E38FC18FC2E1E48FC38FC48FC58FC6D3F98FC78FC88FC98FCA8FCB8FCCE1E58FCDD1AD8FCE8FCFE1E6CEA28FD08FD18FD28FD38FD48FD5E1E78FD6B5C28FD78FD88FD98FDAE1E8BBD58FDB8FDC8FDD8FDE8FDFD0C4E2E0B1D8D2E48FE08FE1E2E18FE28FE3BCC9C8CC8FE4E2E3ECFEECFDDFAF8FE58FE68FE7E2E2D6BECDFCC3A68FE88FE98FEAE3C38FEB8FECD6D2E2E78FED8FEEE2E88FEF8FF0D3C78FF18FF2E2ECBFEC8FF3E2EDE2E58FF48FF5B3C08FF68FF78FF8C4EE8FF98FFAE2EE8FFB8FFCD0C38FFDBAF6E2E9B7DEBBB3CCACCBCBE2E4E2E6E2EAE2EB8FFE90409041E2F790429043E2F4D4F5E2F390449045C5AD9046D5FAC5C2B2C090479048E2EF9049E2F2C1AFCBBC904A904BB5A1E2F9904C904D904EBCB1E2F1D0D4D4B9E2F5B9D6E2F6904F90509051C7D390529053905490559056E2F0905790589059905A905BD7DCEDA1905C905DE2F8905EEDA5E2FECAD1905F906090619062906390649065C1B59066BBD090679068BFD69069BAE3906A906BCBA1906C906D906EEDA6EDA3906F9070EDA29071907290739074BBD6EDA7D0F490759076EDA4BADEB6F7E3A1B6B2CCF1B9A79077CFA2C7A190789079BFD2907A907BB6F1907CE2FAE2FBE2FDE2FCC4D5E3A2907DD3C1907E90809081E3A7C7C49082908390849085CFA490869087E3A9BAB790889089908A908BE3A8908CBBDA908DE3A3908E908F9090E3A4E3AA9091E3A69092CEF2D3C690939094BBBC90959096D4C39097C4FA90989099EDA8D0FCE3A5909AC3F5909BE3ADB1AF909CE3B2909D909E909FBCC290A090A1E3ACB5BF90A290A390A490A590A690A790A890A9C7E9E3B090AA90AB90ACBEAACDEF90AD90AE90AF90B090B1BBF390B290B390B4CCE890B590B6E3AF90B7E3B190B8CFA7E3AE90B9CEA9BBDD90BA90BB90BC90BD90BEB5EBBEE5B2D2B3CD90BFB1B9E3ABB2D1B5ACB9DFB6E890C090C1CFEBE3B790C2BBCC90C390C4C8C7D0CA90C590C690C790C890C9E3B8B3EE90CA90CB90CC90CDEDA990CED3FAD3E490CF90D090D1EDAAE3B9D2E290D290D390D490D590D6E3B590D790D890D990DAD3DE90DB90DC90DD90DEB8D0E3B390DF90E0E3B6B7DF90E1E3B4C0A290E290E390E4E3BA90E590E690E790E890E990EA90EB90EC90ED90EE90EF90F090F190F290F390F490F590F690F7D4B890F890F990FA90FB90FC90FD90FE9140B4C89141E3BB9142BBC59143C9F791449145C9E5914691479148C4BD9149914A914B914C914D914E914FEDAB9150915191529153C2FD9154915591569157BBDBBFAE91589159915A915B915C915D915ECEBF915F916091619162E3BC9163BFB6916491659166916791689169916A916B916C916D916E916F9170917191729173917491759176B1EF91779178D4F79179917A917B917C917DE3BE917E9180918191829183918491859186EDAD918791889189918A918B918C918D918E918FE3BFBAA9EDAC91909191E3BD91929193919491959196919791989199919A919BE3C0919C919D919E919F91A091A1BAB691A291A391A4B6AE91A591A691A791A891A9D0B891AAB0C3EDAE91AB91AC91AD91AE91AFEDAFC0C191B0E3C191B191B291B391B491B591B691B791B891B991BA91BB91BC91BD91BE91BF91C091C1C5B391C291C391C491C591C691C791C891C991CA91CB91CC91CD91CE91CFE3C291D091D191D291D391D491D591D691D791D8DCB291D991DA91DB91DC91DD91DEEDB091DFB8EA91E0CEECEAA7D0E7CAF9C8D6CFB7B3C9CED2BDE491E191E2E3DEBBF2EAA8D5BD91E3C6DDEAA991E491E591E6EAAA91E7EAACEAAB91E8EAAEEAAD91E991EA91EB91ECBDD891EDEAAF91EEC2BE91EF91F091F191F2B4C1B4F791F391F4BBA791F591F691F791F891F9ECE6ECE5B7BFCBF9B1E291FAECE791FB91FC91FDC9C8ECE8ECE991FECAD6DED0B2C5D4FA92409241C6CBB0C7B4F2C8D3924292439244CDD092459246BFB8924792489249924A924B924C924DBFDB924E924FC7A4D6B49250C0A9DED1C9A8D1EFC5A4B0E7B3B6C8C592519252B0E292539254B7F692559256C5FA92579258B6F39259D5D2B3D0BCBC925A925B925CB3AD925D925E925F9260BEF1B0D1926192629263926492659266D2D6CAE3D7A59267CDB6B6B6BFB9D5DB9268B8A7C5D79269926A926BDED2BFD9C2D5C7C0926CBBA4B1A8926D926EC5EA926F9270C5FBCCA79271927292739274B1A7927592769277B5D692789279927AC4A8927BDED3D1BAB3E9927CC3F2927D927EB7F79280D6F4B5A3B2F0C4B4C4E9C0ADDED49281B0E8C5C4C1E09282B9D59283BEDCCDD8B0CE9284CDCFDED6BED0D7BEDED5D5D0B0DD92859286C4E292879288C2A3BCF09289D3B5C0B9C5A1B2A6D4F1928A928BC0A8CAC3DED7D5FC928CB9B0928DC8ADCBA9928EDED9BFBD928F929092919292C6B4D7A7CAB0C4C39293B3D6B9D29294929592969297D6B8EAFCB0B492989299929A929BBFE6929C929DCCF4929E929F92A092A1CDDA92A292A392A4D6BFC2CE92A5CECECCA2D0AEC4D3B5B2DED8D5F5BCB7BBD392A692A7B0A492A8C5B2B4EC92A992AA92ABD5F192AC92ADEAFD92AE92AF92B092B192B292B3DEDACDA692B492B5CDEC92B692B792B892B9CEE6DEDC92BACDB1C0A692BB92BCD7BD92BDDEDBB0C6BAB4C9D3C4F3BEE892BE92BF92C092C1B2B692C292C392C492C592C692C792C892C9C0CCCBF092CABCF1BBBBB5B792CB92CC92CDC5F592CEDEE692CF92D092D1DEE3BEDD92D292D3DEDF92D492D592D692D7B4B7BDDD92D892D9DEE0C4ED92DA92DB92DC92DDCFC692DEB5E092DF92E092E192E2B6DECADAB5F4DEE592E3D5C692E4DEE1CCCDC6FE92E5C5C592E692E792E8D2B492E9BEF292EA92EB92EC92ED92EE92EF92F0C2D392F1CCBDB3B892F2BDD392F3BFD8CDC6D1DAB4EB92F4DEE4DEDDDEE792F5EAFE92F692F7C2B0DEE292F892F9D6C0B5A792FAB2F492FBDEE892FCDEF292FD92FE934093419342DEED9343DEF193449345C8E0934693479348D7E1DEEFC3E8CCE19349B2E5934A934B934CD2BE934D934E934F9350935193529353DEEE9354DEEBCED59355B4A79356935793589359935ABFABBEBE935B935CBDD2935D935E935F9360DEE99361D4AE9362DEDE9363DEEA9364936593669367C0BF9368DEECB2F3B8E9C2A79369936ABDC1936B936C936D936E936FDEF5DEF893709371B2ABB4A493729373B4EAC9A6937493759376937793789379DEF6CBD1937AB8E3937BDEF7DEFA937C937D937E9380DEF9938193829383CCC29384B0E1B4EE93859386938793889389938AE5BA938B938C938D938E938FD0AF93909391B2EB9392EBA19393DEF493949395C9E3DEF3B0DAD2A1B1F79396CCAF939793989399939A939B939C939DDEF0939ECBA4939F93A093A1D5AA93A293A393A493A593A6DEFB93A793A893A993AA93AB93AC93AD93AEB4DD93AFC4A693B093B193B2DEFD93B393B493B593B693B793B893B993BA93BB93BCC3FEC4A1DFA193BD93BE93BF93C093C193C293C3C1CC93C4DEFCBEEF93C5C6B293C693C793C893C993CA93CB93CC93CD93CEB3C5C8F693CF93D0CBBADEFE93D193D2DFA493D393D493D593D6D7B293D793D893D993DA93DBB3B793DC93DD93DE93DFC1C393E093E1C7CBB2A5B4E993E2D7AB93E393E493E593E6C4EC93E7DFA2DFA393E8DFA593E9BAB393EA93EB93ECDFA693EDC0DE93EE93EFC9C393F093F193F293F393F493F593F6B2D9C7E693F7DFA793F8C7DC93F993FA93FB93FCDFA8EBA293FD93FE944094419442CBD3944394449445DFAA9446DFA99447B2C194489449944A944B944C944D944E944F9450945194529453945494559456945794589459945A945B945C945D945E945F9460C5CA94619462946394649465946694679468DFAB9469946A946B946C946D946E946F9470D4DC94719472947394749475C8C19476947794789479947A947B947C947D947E948094819482DFAC94839484948594869487BEF094889489DFADD6A7948A948B948C948DEAB7EBB6CAD5948ED8FCB8C4948FB9A594909491B7C5D5FE94929493949494959496B9CA94979498D0A7F4CD9499949AB5D0949B949CC3F4949DBEC8949E949F94A0EBB7B0BD94A194A2BDCC94A3C1B294A4B1D6B3A894A594A694A7B8D2C9A294A894A9B6D894AA94AB94AC94ADEBB8BEB494AE94AF94B0CAFD94B1C7C394B2D5FB94B394B4B7F394B594B694B794B894B994BA94BB94BC94BD94BE94BF94C094C194C294C3CEC494C494C594C6D5ABB1F394C794C894C9ECB3B0DF94CAECB594CB94CC94CDB6B794CEC1CF94CFF5FAD0B194D094D1D5E594D2CED394D394D4BDEFB3E294D5B8AB94D6D5B694D7EDBD94D8B6CF94D9CBB9D0C294DA94DB94DC94DD94DE94DF94E094E1B7BD94E294E3ECB6CAA994E494E594E6C5D494E7ECB9ECB8C2C3ECB794E894E994EA94EBD0FDECBA94ECECBBD7E594ED94EEECBC94EF94F094F1ECBDC6EC94F294F394F494F594F694F794F894F9CEDE94FABCC894FB94FCC8D5B5A9BEC9D6BCD4E794FD94FED1AED0F1EAB8EAB9EABABAB59540954195429543CAB1BFF595449545CDFA9546954795489549954AEAC0954BB0BAEABE954C954DC0A5954E954F9550EABB9551B2FD9552C3F7BBE8955395549555D2D7CEF4EABF955695579558EABC9559955A955BEAC3955CD0C7D3B3955D955E955F9560B4BA9561C3C1D7F29562956395649565D5D19566CAC79567EAC595689569EAC4EAC7EAC6956A956B956C956D956ED6E7956FCFD495709571EACB9572BBCE9573957495759576957795789579BDFAC9CE957A957BEACC957C957DC9B9CFFEEACAD4CEEACDEACF957E9580CDED9581958295839584EAC99585EACE95869587CEEE9588BBDE9589B3BF958A958B958C958D958EC6D5BEB0CEFA958F95909591C7E79592BEA7EAD095939594D6C7959595969597C1C095989599959AD4DD959BEAD1959C959DCFBE959E959F95A095A1EAD295A295A395A495A5CAEE95A695A795A895A9C5AFB0B595AA95AB95AC95AD95AEEAD495AF95B095B195B295B395B495B595B695B7EAD3F4DF95B895B995BA95BB95BCC4BA95BD95BE95BF95C095C1B1A995C295C395C495C5E5DF95C695C795C895C9EAD595CA95CB95CC95CD95CE95CF95D095D195D295D395D495D595D695D795D895D995DA95DB95DC95DD95DE95DF95E095E195E295E3CAEF95E4EAD6EAD7C6D895E595E695E795E895E995EA95EB95ECEAD895ED95EEEAD995EF95F095F195F295F395F4D4BB95F5C7FAD2B7B8FC95F695F7EAC295F8B2DC95F995FAC2FC95FBD4F8CCE6D7EE95FC95FD95FE9640964196429643D4C2D3D0EBC3C5F39644B7FE96459646EBD4964796489649CBB7EBDE964AC0CA964B964C964DCDFB964EB3AF964FC6DA965096519652965396549655EBFC9656C4BE9657CEB4C4A9B1BED4FD9658CAF59659D6EC965A965BC6D3B6E4965C965D965E965FBBFA96609661D0E096629663C9B19664D4D3C8A896659666B8CB9667E8BEC9BC96689669E8BB966AC0EED0D3B2C4B4E5966BE8BC966C966DD5C8966E966F967096719672B6C59673E8BDCAF8B8DCCCF5967496759676C0B496779678D1EEE8BFE8C29679967ABABC967BB1ADBDDC967CEABDE8C3967DE8C6967EE8CB9680968196829683E8CC9684CBC9B0E59685BCAB96869687B9B996889689E8C1968ACDF7968BE8CA968C968D968E968FCEF69690969196929693D5ED9694C1D6E8C49695C3B69696B9FBD6A6E8C8969796989699CAE0D4E6969AE8C0969BE8C5E8C7969CC7B9B7E3969DE8C9969EBFDDE8D2969F96A0E8D796A1E8D5BCDCBCCFE8DB96A296A396A496A596A696A796A896A9E8DE96AAE8DAB1FA96AB96AC96AD96AE96AF96B096B196B296B396B4B0D8C4B3B8CCC6E2C8BEC8E196B596B696B7E8CFE8D4E8D696B8B9F1E8D8D7F596B9C4FB96BAE8DC96BB96BCB2E996BD96BE96BFE8D196C096C1BCED96C296C3BFC2E8CDD6F996C4C1F8B2F196C596C696C796C896C996CA96CB96CCE8DF96CDCAC1E8D996CE96CF96D096D1D5A496D2B1EAD5BBE8CEE8D0B6B0E8D396D3E8DDC0B896D4CAF796D5CBA896D696D7C6DCC0F596D896D996DA96DB96DCE8E996DD96DE96DFD0A396E096E196E296E396E496E596E6E8F2D6EA96E796E896E996EA96EB96EC96EDE8E0E8E196EE96EF96F0D1F9BACBB8F996F196F2B8F1D4D4E8EF96F3E8EEE8ECB9F0CCD2E8E6CEA6BFF296F4B0B8E8F1E8F096F5D7C096F6E8E496F7CDA9C9A396F8BBB8BDDBE8EA96F996FA96FB96FC96FD96FE9740974197429743E8E2E8E3E8E5B5B5E8E7C7C5E8EBE8EDBDB0D7AE9744E8F897459746974797489749974A974B974CE8F5974DCDB0E8F6974E974F9750975197529753975497559756C1BA9757E8E89758C3B7B0F09759975A975B975C975D975E975F9760E8F4976197629763E8F7976497659766B9A3976797689769976A976B976C976D976E976F9770C9D2977197729773C3CECEE0C0E69774977597769777CBF39778CCDDD0B59779977ACAE1977BE8F3977C977D977E9780978197829783978497859786BCEC9787E8F997889789978A978B978C978DC3DE978EC6E5978FB9F79790979197929793B0F497949795D7D897969797BCAC9798C5EF9799979A979B979C979DCCC4979E979FE9A697A097A197A297A397A497A597A697A797A897A9C9AD97AAE9A2C0E297AB97AC97ADBFC397AE97AF97B0E8FEB9D797B1E8FB97B297B397B497B5E9A497B697B797B8D2CE97B997BA97BB97BC97BDE9A397BED6B2D7B597BFE9A797C0BDB797C197C297C397C497C597C697C797C897C997CA97CB97CCE8FCE8FD97CD97CE97CFE9A197D097D197D297D397D497D597D697D7CDD697D897D9D2AC97DA97DB97DCE9B297DD97DE97DF97E0E9A997E197E297E3B4AA97E4B4BB97E597E6E9AB97E797E897E997EA97EB97EC97ED97EE97EF97F097F197F297F397F497F597F697F7D0A897F897F9E9A597FA97FBB3FE97FC97FDE9ACC0E397FEE9AA98409841E9B998429843E9B89844984598469847E9AE98489849E8FA984A984BE9A8984C984D984E984F9850BFACE9B1E9BA98519852C2A5985398549855E9AF9856B8C59857E9AD9858D3DCE9B4E9B5E9B79859985A985BE9C7985C985D985E985F98609861C0C6E9C598629863E9B098649865E9BBB0F19866986798689869986A986B986C986D986E986FE9BCD5A598709871E9BE9872E9BF987398749875E9C198769877C1F198789879C8B6987A987B987CE9BD987D987E988098819882E9C29883988498859886988798889889988AE9C3988BE9B3988CE9B6988DBBB1988E988F9890E9C0989198929893989498959896BCF7989798989899E9C4E9C6989A989B989C989D989E989F98A098A198A298A398A498A5E9CA98A698A798A898A9E9CE98AA98AB98AC98AD98AE98AF98B098B198B298B3B2DB98B4E9C898B598B698B798B898B998BA98BB98BC98BD98BEB7AE98BF98C098C198C298C398C498C598C698C798C898C998CAE9CBE9CC98CB98CC98CD98CE98CF98D0D5C198D1C4A398D298D398D498D598D698D7E9D898D8BAE198D998DA98DB98DCE9C998DDD3A398DE98DF98E0E9D498E198E298E398E498E598E698E7E9D7E9D098E898E998EA98EB98ECE9CF98ED98EEC7C198EF98F098F198F298F398F498F598F6E9D298F798F898F998FA98FB98FC98FDE9D9B3C898FEE9D399409941994299439944CFF0994599469947E9CD99489949994A994B994C994D994E994F995099519952B3F79953995499559956995799589959E9D6995A995BE9DA995C995D995ECCB4995F99609961CFAD99629963996499659966996799689969996AE9D5996BE9DCE9DB996C996D996E996F9970E9DE99719972997399749975997699779978E9D19979997A997B997C997D997E99809981E9DD9982E9DFC3CA9983998499859986998799889989998A998B998C998D998E998F9990999199929993999499959996999799989999999A999B999C999D999E999F99A099A199A299A399A499A599A699A799A899A999AA99AB99AC99AD99AE99AF99B099B199B299B399B499B599B699B799B899B999BA99BB99BC99BD99BE99BF99C099C199C299C399C499C599C699C799C899C999CA99CB99CC99CD99CE99CF99D099D199D299D399D499D599D699D799D899D999DA99DB99DC99DD99DE99DF99E099E199E299E399E499E599E699E799E899E999EA99EB99EC99ED99EE99EF99F099F199F299F399F499F5C7B7B4CEBBB6D0C0ECA399F699F7C5B799F899F999FA99FB99FC99FD99FE9A409A419A42D3FB9A439A449A459A46ECA49A47ECA5C6DB9A489A499A4ABFEE9A4B9A4C9A4D9A4EECA69A4F9A50ECA7D0AA9A51C7B89A529A53B8E89A549A559A569A579A589A599A5A9A5B9A5C9A5D9A5E9A5FECA89A609A619A629A639A649A659A669A67D6B9D5FDB4CBB2BDCEE4C6E79A689A69CDE19A6A9A6B9A6C9A6D9A6E9A6F9A709A719A729A739A749A759A769A77B4F59A78CBC0BCDF9A799A7A9A7B9A7CE9E2E9E3D1EAE9E59A7DB4F9E9E49A7ED1B3CAE2B2D09A80E9E89A819A829A839A84E9E6E9E79A859A86D6B39A879A889A89E9E9E9EA9A8A9A8B9A8C9A8D9A8EE9EB9A8F9A909A919A929A939A949A959A96E9EC9A979A989A999A9A9A9B9A9C9A9D9A9EECAFC5B9B6CE9A9FD2F39AA09AA19AA29AA39AA49AA59AA6B5EE9AA7BBD9ECB19AA89AA9D2E39AAA9AAB9AAC9AAD9AAECEE39AAFC4B89AB0C3BF9AB19AB2B6BED8B9B1C8B1CFB1D1C5FE9AB3B1D09AB4C3AB9AB59AB69AB79AB89AB9D5B19ABA9ABB9ABC9ABD9ABE9ABF9AC09AC1EBA4BAC19AC29AC39AC4CCBA9AC59AC69AC7EBA59AC8EBA79AC99ACA9ACBEBA89ACC9ACD9ACEEBA69ACF9AD09AD19AD29AD39AD49AD5EBA9EBABEBAA9AD69AD79AD89AD99ADAEBAC9ADBCACFD8B5C3F19ADCC3A5C6F8EBADC4CA9ADDEBAEEBAFEBB0B7D59ADE9ADF9AE0B7FA9AE1EBB1C7E29AE2EBB39AE3BAA4D1F5B0B1EBB2EBB49AE49AE59AE6B5AAC2C8C7E89AE7EBB59AE8CBAEE3DF9AE99AEAD3C09AEB9AEC9AED9AEED9DB9AEF9AF0CDA1D6ADC7F39AF19AF29AF3D9E0BBE39AF4BABAE3E29AF59AF69AF79AF89AF9CFAB9AFA9AFB9AFCE3E0C9C79AFDBAB99AFE9B409B41D1B4E3E1C8EAB9AFBDADB3D8CEDB9B429B43CCC09B449B459B46E3E8E3E9CDF49B479B489B499B4A9B4BCCAD9B4CBCB39B4DE3EA9B4EE3EB9B4F9B50D0DA9B519B529B53C6FBB7DA9B549B55C7DFD2CACED69B56E3E4E3EC9B57C9F2B3C19B589B59E3E79B5A9B5BC6E3E3E59B5C9B5DEDB3E3E69B5E9B5F9B609B61C9B39B62C5E69B639B649B65B9B59B66C3BB9B67E3E3C5BDC1A4C2D9B2D79B68E3EDBBA6C4AD9B69E3F0BEDA9B6A9B6BE3FBE3F5BAD39B6C9B6D9B6E9B6FB7D0D3CD9B70D6CED5D3B9C1D5B4D1D89B719B729B739B74D0B9C7F69B759B769B77C8AAB2B49B78C3DA9B799B7A9B7BE3EE9B7C9B7DE3FCE3EFB7A8E3F7E3F49B7E9B809B81B7BA9B829B83C5A29B84E3F6C5DDB2A8C6FC9B85C4E09B869B87D7A29B88C0E1E3F99B899B8AE3FAE3FDCCA9E3F39B8BD3BE9B8CB1C3EDB4E3F1E3F29B8DE3F8D0BAC6C3D4F3E3FE9B8E9B8FBDE09B909B91E4A79B929B93E4A69B949B959B96D1F3E4A39B97E4A99B989B999B9AC8F79B9B9B9C9B9D9B9ECFB49B9FE4A8E4AEC2E59BA09BA1B6B49BA29BA39BA49BA59BA69BA7BDF29BA8E4A29BA99BAABAE9E4AA9BAB9BACE4AC9BAD9BAEB6FDD6DEE4B29BAFE4AD9BB09BB19BB2E4A19BB3BBEECDDDC7A2C5C99BB49BB5C1F79BB6E4A49BB7C7B3BDACBDBDE4A59BB8D7C7B2E29BB9E4ABBCC3E4AF9BBABBEBE4B0C5A8E4B19BBB9BBC9BBD9BBED5E3BFA39BBFE4BA9BC0E4B79BC1E4BB9BC29BC3E4BD9BC49BC5C6D69BC69BC7BAC6C0CB9BC89BC99BCAB8A1E4B49BCB9BCC9BCD9BCED4A19BCF9BD0BAA3BDFE9BD19BD29BD3E4BC9BD49BD59BD69BD79BD8CDBF9BD99BDAC4F99BDB9BDCCFFBC9E69BDD9BDED3BF9BDFCFD19BE09BE1E4B39BE2E4B8E4B9CCE99BE39BE49BE59BE69BE7CCCE9BE8C0D4E4B5C1B0E4B6CED09BE9BBC1B5D39BEAC8F3BDA7D5C7C9ACB8A2E4CA9BEB9BECE4CCD1C49BED9BEED2BA9BEF9BF0BAAD9BF19BF2BAD49BF39BF49BF59BF69BF79BF8E4C3B5ED9BF99BFA9BFBD7CDE4C0CFFDE4BF9BFC9BFD9BFEC1DCCCCA9C409C419C429C43CAE79C449C459C469C47C4D79C48CCD4E4C89C499C4A9C4BE4C7E4C19C4CE4C4B5AD9C4D9C4ED3D99C4FE4C69C509C519C529C53D2F9B4E39C54BBB49C559C56C9EE9C57B4BE9C589C599C5ABBEC9C5BD1CD9C5CCCEDEDB59C5D9C5E9C5F9C609C619C629C639C64C7E59C659C669C679C68D4A89C69E4CBD7D5E4C29C6ABDA5E4C59C6B9C6CD3E69C6DE4C9C9F89C6E9C6FE4BE9C709C71D3E59C729C73C7FEB6C99C74D4FCB2B3E4D79C759C769C77CEC29C78E4CD9C79CEBC9C7AB8DB9C7B9C7CE4D69C7DBFCA9C7E9C809C81D3CE9C82C3EC9C839C849C859C869C879C889C899C8AC5C8E4D89C8B9C8C9C8D9C8E9C8F9C909C919C92CDC4E4CF9C939C949C959C96E4D4E4D59C97BAFE9C98CFE69C999C9AD5BF9C9B9C9C9C9DE4D29C9E9C9F9CA09CA19CA29CA39CA49CA59CA69CA79CA8E4D09CA99CAAE4CE9CAB9CAC9CAD9CAE9CAF9CB09CB19CB29CB39CB49CB59CB69CB79CB89CB9CDE5CAAA9CBA9CBB9CBCC0A39CBDBDA6E4D39CBE9CBFB8C89CC09CC19CC29CC39CC4E4E7D4B49CC59CC69CC79CC89CC99CCA9CCBE4DB9CCC9CCD9CCEC1EF9CCF9CD0E4E99CD19CD2D2E79CD39CD4E4DF9CD5E4E09CD69CD7CFAA9CD89CD99CDA9CDBCBDD9CDCE4DAE4D19CDDE4E59CDEC8DCE4E39CDF9CE0C4E7E4E29CE1E4E19CE29CE39CE4B3FCE4E89CE59CE69CE79CE8B5E19CE99CEA9CEBD7CC9CEC9CED9CEEE4E69CEFBBAC9CF0D7D2CCCFEBF89CF1E4E49CF29CF3B9F69CF49CF59CF6D6CDE4D9E4DCC2FAE4DE9CF7C2CBC0C4C2D09CF8B1F5CCB29CF99CFA9CFB9CFC9CFD9CFE9D409D419D429D43B5CE9D449D459D469D47E4EF9D489D499D4A9D4B9D4C9D4D9D4E9D4FC6AF9D509D519D52C6E19D539D54E4F59D559D569D579D589D59C2A99D5A9D5B9D5CC0ECD1DDE4EE9D5D9D5E9D5F9D609D619D629D639D649D659D66C4AE9D679D689D69E4ED9D6A9D6B9D6C9D6DE4F6E4F4C2FE9D6EE4DD9D6FE4F09D70CAFE9D71D5C49D729D73E4F19D749D759D769D779D789D799D7AD1FA9D7B9D7C9D7D9D7E9D809D819D82E4EBE4EC9D839D849D85E4F29D86CEAB9D879D889D899D8A9D8B9D8C9D8D9D8E9D8F9D90C5CB9D919D929D93C7B19D94C2BA9D959D969D97E4EA9D989D999D9AC1CA9D9B9D9C9D9D9D9E9D9F9DA0CCB6B3B19DA19DA29DA3E4FB9DA4E4F39DA59DA69DA7E4FA9DA8E4FD9DA9E4FC9DAA9DAB9DAC9DAD9DAE9DAF9DB0B3CE9DB19DB29DB3B3BAE4F79DB49DB5E4F9E4F8C5EC9DB69DB79DB89DB99DBA9DBB9DBC9DBD9DBE9DBF9DC09DC19DC2C0BD9DC39DC49DC59DC6D4E89DC79DC89DC99DCA9DCBE5A29DCC9DCD9DCE9DCF9DD09DD19DD29DD39DD49DD59DD6B0C49DD79DD8E5A49DD99DDAE5A39DDB9DDC9DDD9DDE9DDF9DE0BCA49DE1E5A59DE29DE39DE49DE59DE69DE7E5A19DE89DE99DEA9DEB9DEC9DED9DEEE4FEB1F49DEF9DF09DF19DF29DF39DF49DF59DF69DF79DF89DF9E5A89DFAE5A9E5A69DFB9DFC9DFD9DFE9E409E419E429E439E449E459E469E47E5A7E5AA9E489E499E4A9E4B9E4C9E4D9E4E9E4F9E509E519E529E539E549E559E569E579E589E599E5A9E5B9E5C9E5D9E5E9E5F9E609E619E629E639E649E659E669E679E68C6D99E699E6A9E6B9E6C9E6D9E6E9E6F9E70E5ABE5AD9E719E729E739E749E759E769E77E5AC9E789E799E7A9E7B9E7C9E7D9E7E9E809E819E829E839E849E859E869E879E889E89E5AF9E8A9E8B9E8CE5AE9E8D9E8E9E8F9E909E919E929E939E949E959E969E979E989E999E9A9E9B9E9C9E9D9E9EB9E09E9F9EA0E5B09EA19EA29EA39EA49EA59EA69EA79EA89EA99EAA9EAB9EAC9EAD9EAEE5B19EAF9EB09EB19EB29EB39EB49EB59EB69EB79EB89EB99EBABBF0ECE1C3F09EBBB5C6BBD29EBC9EBD9EBE9EBFC1E9D4EE9EC0BEC49EC19EC29EC3D7C69EC4D4D6B2D3ECBE9EC59EC69EC79EC8EAC19EC99ECA9ECBC2AFB4B69ECC9ECD9ECED1D79ECF9ED09ED1B3B49ED2C8B2BFBBECC09ED39ED4D6CB9ED59ED6ECBFECC19ED79ED89ED99EDA9EDB9EDC9EDD9EDE9EDF9EE09EE19EE29EE3ECC5BEE6CCBFC5DABEBC9EE4ECC69EE5B1FE9EE69EE79EE8ECC4D5A8B5E39EE9ECC2C1B6B3E39EEA9EEBECC3CBB8C0C3CCFE9EEC9EED9EEE9EEFC1D29EF0ECC89EF19EF29EF39EF49EF59EF69EF79EF89EF99EFA9EFB9EFC9EFDBAE6C0D39EFED6F29F409F419F42D1CC9F439F449F459F46BFBE9F47B7B3C9D5ECC7BBE29F48CCCCBDFDC8C89F49CFA99F4A9F4B9F4C9F4D9F4E9F4F9F50CDE99F51C5EB9F529F539F54B7E99F559F569F579F589F599F5A9F5B9F5C9F5D9F5E9F5FD1C9BAB89F609F619F629F639F64ECC99F659F66ECCA9F67BBC0ECCB9F68ECE2B1BAB7D99F699F6A9F6B9F6C9F6D9F6E9F6F9F709F719F729F73BDB99F749F759F769F779F789F799F7A9F7BECCCD1E6ECCD9F7C9F7D9F7E9F80C8BB9F819F829F839F849F859F869F879F889F899F8A9F8B9F8C9F8D9F8EECD19F8F9F909F919F92ECD39F93BBCD9F94BCE59F959F969F979F989F999F9A9F9B9F9C9F9D9F9E9F9F9FA09FA1ECCF9FA2C9B79FA39FA49FA59FA69FA7C3BA9FA8ECE3D5D5ECD09FA99FAA9FAB9FAC9FADD6F39FAE9FAF9FB0ECD2ECCE9FB19FB29FB39FB4ECD49FB5ECD59FB69FB7C9BF9FB89FB99FBA9FBB9FBC9FBDCFA89FBE9FBF9FC09FC19FC2D0DC9FC39FC49FC59FC6D1AC9FC79FC89FC99FCAC8DB9FCB9FCC9FCDECD6CEF59FCE9FCF9FD09FD19FD2CAECECDA9FD39FD49FD59FD69FD79FD89FD9ECD99FDA9FDB9FDCB0BE9FDD9FDE9FDF9FE09FE19FE2ECD79FE3ECD89FE49FE59FE6ECE49FE79FE89FE99FEA9FEB9FEC9FED9FEE9FEFC8BC9FF09FF19FF29FF39FF49FF59FF69FF79FF89FF9C1C79FFA9FFB9FFC9FFD9FFEECDCD1E0A040A041A042A043A044A045A046A047A048A049ECDBA04AA04BA04CA04DD4EFA04EECDDA04FA050A051A052A053A054DBC6A055A056A057A058A059A05AA05BA05CA05DA05EECDEA05FA060A061A062A063A064A065A066A067A068A069A06AB1ACA06BA06CA06DA06EA06FA070A071A072A073A074A075A076A077A078A079A07AA07BA07CA07DA07EA080A081ECDFA082A083A084A085A086A087A088A089A08AA08BECE0A08CD7A6A08DC5C0A08EA08FA090EBBCB0AEA091A092A093BEF4B8B8D2AFB0D6B5F9A094D8B3A095CBACA096E3DDA097A098A099A09AA09BA09CA09DC6ACB0E6A09EA09FA0A0C5C6EBB9A0A1A0A2A0A3A0A4EBBAA0A5A0A6A0A7EBBBA0A8A0A9D1C0A0AAC5A3A0ABEAF2A0ACC4B2A0ADC4B5C0CEA0AEA0AFA0B0EAF3C4C1A0B1CEEFA0B2A0B3A0B4A0B5EAF0EAF4A0B6A0B7C9FCA0B8A0B9C7A3A0BAA0BBA0BCCCD8CEFEA0BDA0BEA0BFEAF5EAF6CFACC0E7A0C0A0C1EAF7A0C2A0C3A0C4A0C5A0C6B6BFEAF8A0C7EAF9A0C8EAFAA0C9A0CAEAFBA0CBA0CCA0CDA0CEA0CFA0D0A0D1A0D2A0D3A0D4A0D5A0D6EAF1A0D7A0D8A0D9A0DAA0DBA0DCA0DDA0DEA0DFA0E0A0E1A0E2C8AEE1EBA0E3B7B8E1ECA0E4A0E5A0E6E1EDA0E7D7B4E1EEE1EFD3CCA0E8A0E9A0EAA0EBA0ECA0EDA0EEE1F1BFF1E1F0B5D2A0EFA0F0A0F1B1B7A0F2A0F3A0F4A0F5E1F3E1F2A0F6BAFCA0F7E1F4A0F8A0F9A0FAA0FBB9B7A0FCBED1A0FDA0FEAA40AA41C4FCAA42BADDBDC6AA43AA44AA45AA46AA47AA48E1F5E1F7AA49AA4AB6C0CFC1CAA8E1F6D5F8D3FCE1F8E1FCE1F9AA4BAA4CE1FAC0EAAA4DE1FEE2A1C0C7AA4EAA4FAA50AA51E1FBAA52E1FDAA53AA54AA55AA56AA57AA58E2A5AA59AA5AAA5BC1D4AA5CAA5DAA5EAA5FE2A3AA60E2A8B2FEE2A2AA61AA62AA63C3CDB2C2E2A7E2A6AA64AA65E2A4E2A9AA66AA67E2ABAA68AA69AA6AD0C9D6EDC3A8E2ACAA6BCFD7AA6CAA6DE2AEAA6EAA6FBAEFAA70AA71E9E0E2ADE2AAAA72AA73AA74AA75BBABD4B3AA76AA77AA78AA79AA7AAA7BAA7CAA7DAA7EAA80AA81AA82AA83E2B0AA84AA85E2AFAA86E9E1AA87AA88AA89AA8AE2B1AA8BAA8CAA8DAA8EAA8FAA90AA91AA92E2B2AA93AA94AA95AA96AA97AA98AA99AA9AAA9BAA9CAA9DE2B3CCA1AA9EE2B4AA9FAAA0AB40AB41AB42AB43AB44AB45AB46AB47AB48AB49AB4AAB4BE2B5AB4CAB4DAB4EAB4FAB50D0FEAB51AB52C2CAAB53D3F1AB54CDF5AB55AB56E7E0AB57AB58E7E1AB59AB5AAB5BAB5CBEC1AB5DAB5EAB5FAB60C2EAAB61AB62AB63E7E4AB64AB65E7E3AB66AB67AB68AB69AB6AAB6BCDE6AB6CC3B5AB6DAB6EE7E2BBB7CFD6AB6FC1E1E7E9AB70AB71AB72E7E8AB73AB74E7F4B2A3AB75AB76AB77AB78E7EAAB79E7E6AB7AAB7BAB7CAB7DAB7EE7ECE7EBC9BAAB80AB81D5E4AB82E7E5B7A9E7E7AB83AB84AB85AB86AB87AB88AB89E7EEAB8AAB8BAB8CAB8DE7F3AB8ED6E9AB8FAB90AB91AB92E7EDAB93E7F2AB94E7F1AB95AB96AB97B0E0AB98AB99AB9AAB9BE7F5AB9CAB9DAB9EAB9FABA0AC40AC41AC42AC43AC44AC45AC46AC47AC48AC49AC4AC7F2AC4BC0C5C0EDAC4CAC4DC1F0E7F0AC4EAC4FAC50AC51E7F6CBF6AC52AC53AC54AC55AC56AC57AC58AC59AC5AE8A2E8A1AC5BAC5CAC5DAC5EAC5FAC60D7C1AC61AC62E7FAE7F9AC63E7FBAC64E7F7AC65E7FEAC66E7FDAC67E7FCAC68AC69C1D5C7D9C5FDC5C3AC6AAC6BAC6CAC6DAC6EC7EDAC6FAC70AC71AC72E8A3AC73AC74AC75AC76AC77AC78AC79AC7AAC7BAC7CAC7DAC7EAC80AC81AC82AC83AC84AC85AC86E8A6AC87E8A5AC88E8A7BAF7E7F8E8A4AC89C8F0C9AAAC8AAC8BAC8CAC8DAC8EAC8FAC90AC91AC92AC93AC94AC95AC96E8A9AC97AC98B9E5AC99AC9AAC9BAC9CAC9DD1FEE8A8AC9EAC9FACA0AD40AD41AD42E8AAAD43E8ADE8AEAD44C1A7AD45AD46AD47E8AFAD48AD49AD4AE8B0AD4BAD4CE8ACAD4DE8B4AD4EAD4FAD50AD51AD52AD53AD54AD55AD56AD57AD58E8ABAD59E8B1AD5AAD5BAD5CAD5DAD5EAD5FAD60AD61E8B5E8B2E8B3AD62AD63AD64AD65AD66AD67AD68AD69AD6AAD6BAD6CAD6DAD6EAD6FAD70AD71E8B7AD72AD73AD74AD75AD76AD77AD78AD79AD7AAD7BAD7CAD7DAD7EAD80AD81AD82AD83AD84AD85AD86AD87AD88AD89E8B6AD8AAD8BAD8CAD8DAD8EAD8FAD90AD91AD92B9CFAD93F0ACAD94F0ADAD95C6B0B0EAC8BFAD96CDDFAD97AD98AD99AD9AAD9BAD9CAD9DCECDEAB1AD9EAD9FADA0AE40EAB2AE41C6BFB4C9AE42AE43AE44AE45AE46AE47AE48EAB3AE49AE4AAE4BAE4CD5E7AE4DAE4EAE4FAE50AE51AE52AE53AE54DDF9AE55EAB4AE56EAB5AE57EAB6AE58AE59AE5AAE5BB8CADFB0C9F5AE5CCCF0AE5DAE5EC9FAAE5FAE60AE61AE62AE63C9FBAE64AE65D3C3CBA6AE66B8A6F0AEB1C2AE67E5B8CCEFD3C9BCD7C9EAAE68B5E7AE69C4D0B5E9AE6AEEAEBBADAE6BAE6CE7DEAE6DEEAFAE6EAE6FAE70AE71B3A9AE72AE73EEB2AE74AE75EEB1BDE7AE76EEB0CEB7AE77AE78AE79AE7AC5CFAE7BAE7CAE7DAE7EC1F4DBCEEEB3D0F3AE80AE81AE82AE83AE84AE85AE86AE87C2D4C6E8AE88AE89AE8AB7ACAE8BAE8CAE8DAE8EAE8FAE90AE91EEB4AE92B3EBAE93AE94AE95BBFBEEB5AE96AE97AE98AE99AE9AE7DCAE9BAE9CAE9DEEB6AE9EAE9FBDAEAEA0AF40AF41AF42F1E2AF43AF44AF45CAE8AF46D2C9F0DAAF47F0DBAF48F0DCC1C6AF49B8EDBECEAF4AAF4BF0DEAF4CC5B1F0DDD1F1AF4DF0E0B0CCBDEAAF4EAF4FAF50AF51AF52D2DFF0DFAF53B4AFB7E8F0E6F0E5C6A3F0E1F0E2B4C3AF54AF55F0E3D5EEAF56AF57CCDBBED2BCB2AF58AF59AF5AF0E8F0E7F0E4B2A1AF5BD6A2D3B8BEB7C8ACAF5CAF5DF0EAAF5EAF5FAF60AF61D1F7AF62D6CCBADBF0E9AF63B6BBAF64AF65CDB4AF66AF67C6A6AF68AF69AF6AC1A1F0EBF0EEAF6BF0EDF0F0F0ECAF6CBBBEF0EFAF6DAF6EAF6FAF70CCB5F0F2AF71AF72B3D5AF73AF74AF75AF76B1D4AF77AF78F0F3AF79AF7AF0F4F0F6B4E1AF7BF0F1AF7CF0F7AF7DAF7EAF80AF81F0FAAF82F0F8AF83AF84AF85F0F5AF86AF87AF88AF89F0FDAF8AF0F9F0FCF0FEAF8BF1A1AF8CAF8DAF8ECEC1F1A4AF8FF1A3AF90C1F6F0FBCADDAF91AF92B4F1B1F1CCB1AF93F1A6AF94AF95F1A7AF96AF97F1ACD5CEF1A9AF98AF99C8B3AF9AAF9BAF9CF1A2AF9DF1ABF1A8F1A5AF9EAF9FF1AAAFA0B040B041B042B043B044B045B046B0A9F1ADB047B048B049B04AB04BB04CF1AFB04DF1B1B04EB04FB050B051B052F1B0B053F1AEB054B055B056B057D1A2B058B059B05AB05BB05CB05DB05EF1B2B05FB060B061F1B3B062B063B064B065B066B067B068B069B9EFB06AB06BB5C7B06CB0D7B0D9B06DB06EB06FD4EDB070B5C4B071BDD4BBCAF0A7B072B073B8DEB074B075F0A8B076B077B0A8B078F0A9B079B07ACDEEB07BB07CF0AAB07DB07EB080B081B082B083B084B085B086B087F0ABB088B089B08AB08BB08CB08DB08EB08FB090C6A4B091B092D6E5F1E4B093F1E5B094B095B096B097B098B099B09AB09BB09CB09DC3F3B09EB09FD3DBB0A0B140D6D1C5E8B141D3AFB142D2E6B143B144EEC1B0BBD5B5D1CEBCE0BAD0B145BFF8B146B8C7B5C1C5CCB147B148CAA2B149B14AB14BC3CBB14CB14DB14EB14FB150EEC2B151B152B153B154B155B156B157B158C4BFB6A2B159EDECC3A4B15AD6B1B15BB15CB15DCFE0EDEFB15EB15FC5CEB160B6DCB161B162CAA1B163B164EDEDB165B166EDF0EDF1C3BCB167BFB4B168EDEEB169B16AB16BB16CB16DB16EB16FB170B171B172B173EDF4EDF2B174B175B176B177D5E6C3DFB178EDF3B179B17AB17BEDF6B17CD5A3D1A3B17DB17EB180EDF5B181C3D0B182B183B184B185B186EDF7BFF4BEECEDF8B187CCF7B188D1DBB189B18AB18BD7C5D5F6B18CEDFCB18DB18EB18FEDFBB190B191B192B193B194B195B196B197EDF9EDFAB198B199B19AB19BB19CB19DB19EB19FEDFDBEA6B1A0B240B241B242B243CBAFEEA1B6BDB244EEA2C4C0B245EDFEB246B247BDDEB2C7B248B249B24AB24BB24CB24DB24EB24FB250B251B252B253B6C3B254B255B256EEA5D8BAEEA3EEA6B257B258B259C3E9B3F2B25AB25BB25CB25DB25EB25FEEA7EEA4CFB9B260B261EEA8C2F7B262B263B264B265B266B267B268B269B26AB26BB26CB26DEEA9EEAAB26EDEABB26FB270C6B3B271C7C6B272D6F5B5C9B273CBB2B274B275B276EEABB277B278CDABB279EEACB27AB27BB27CB27DB27ED5B0B280EEADB281F6C4B282B283B284B285B286B287B288B289B28AB28BB28CB28DB28EDBC7B28FB290B291B292B293B294B295B296B297B4A3B298B299B29AC3ACF1E6B29BB29CB29DB29EB29FCAB8D2D3B2A0D6AAB340EFF2B341BED8B342BDC3EFF3B6CCB0ABB343B344B345B346CAAFB347B348EDB6B349EDB7B34AB34BB34CB34DCEF9B7AFBFF3EDB8C2EBC9B0B34EB34FB350B351B352B353EDB9B354B355C6F6BFB3B356B357B358EDBCC5F8B359D1D0B35AD7A9EDBAEDBBB35BD1E2B35CEDBFEDC0B35DEDC4B35EB35FB360EDC8B361EDC6EDCED5E8B362EDC9B363B364EDC7EDBEB365B366C5E9B367B368B369C6C6B36AB36BC9E9D4D2EDC1EDC2EDC3EDC5B36CC0F9B36DB4A1B36EB36FB370B371B9E8B372EDD0B373B374B375B376EDD1B377EDCAB378EDCFB379CEF8B37AB37BCBB6EDCCEDCDB37CB37DB37EB380B381CFF5B382B383B384B385B386B387B388B389B38AB38BB38CB38DEDD2C1F2D3B2EDCBC8B7B38EB38FB390B391B392B393B394B395BCEFB396B397B398B399C5F0B39AB39BB39CB39DB39EB39FB3A0B440B441B442EDD6B443B5EFB444B445C2B5B0ADCBE9B446B447B1AEB448EDD4B449B44AB44BCDEBB5E2B44CEDD5EDD3EDD7B44DB44EB5FAB44FEDD8B450EDD9B451EDDCB452B1CCB453B454B455B456B457B458B459B45AC5F6BCEEEDDACCBCB2EAB45BB45CB45DB45EEDDBB45FB460B461B462C4EBB463B464B4C5B465B466B467B0F5B468B469B46AEDDFC0DAB4E8B46BB46CB46DB46EC5CDB46FB470B471EDDDBFC4B472B473B474EDDEB475B476B477B478B479B47AB47BB47CB47DB47EB480B481B482B483C4A5B484B485B486EDE0B487B488B489B48AB48BEDE1B48CEDE3B48DB48EC1D7B48FB490BBC7B491B492B493B494B495B496BDB8B497B498B499EDE2B49AB49BB49CB49DB49EB49FB4A0B540B541B542B543B544B545EDE4B546B547B548B549B54AB54BB54CB54DB54EB54FEDE6B550B551B552B553B554EDE5B555B556B557B558B559B55AB55BB55CB55DB55EB55FB560B561B562B563EDE7B564B565B566B567B568CABEECEAC0F1B569C9E7B56AECEBC6EEB56BB56CB56DB56EECECB56FC6EDECEDB570B571B572B573B574B575B576B577B578ECF0B579B57AD7E6ECF3B57BB57CECF1ECEEECEFD7A3C9F1CBEEECF4B57DECF2B57EB580CFE9B581ECF6C6B1B582B583B584B585BCC0B586ECF5B587B588B589B58AB58BB58CB58DB5BBBBF6B58EECF7B58FB590B591B592B593D9F7BDFBB594B595C2BBECF8B596B597B598B599ECF9B59AB59BB59CB59DB8A3B59EB59FB5A0B640B641B642B643B644B645B646ECFAB647B648B649B64AB64BB64CB64DB64EB64FB650B651B652ECFBB653B654B655B656B657B658B659B65AB65BB65CB65DECFCB65EB65FB660B661B662D3EDD8AEC0EBB663C7DDBACCB664D0E3CBBDB665CDBAB666B667B8D1B668B669B1FCB66AC7EFB66BD6D6B66CB66DB66EBFC6C3EBB66FB670EFF5B671B672C3D8B673B674B675B676B677B678D7E2B679B67AB67BEFF7B3D3B67CC7D8D1EDB67DD6C8B67EEFF8B680EFF6B681BBFDB3C6B682B683B684B685B686B687B688BDD5B689B68AD2C6B68BBBE0B68CB68DCFA1B68EEFFCEFFBB68FB690EFF9B691B692B693B694B3CCB695C9D4CBB0B696B697B698B699B69AEFFEB69BB69CB0DEB69DB69ED6C9B69FB6A0B740EFFDB741B3EDB742B743F6D5B744B745B746B747B748B749B74AB74BB74CB74DB74EB74FB750B751B752CEC8B753B754B755F0A2B756F0A1B757B5BEBCDABBFCB758B8E5B759B75AB75BB75CB75DB75EC4C2B75FB760B761B762B763B764B765B766B767B768F0A3B769B76AB76BB76CB76DCBEBB76EB76FB770B771B772B773B774B775B776B777B778B779B77AB77BB77CB77DB77EB780B781B782B783B784B785B786F0A6B787B788B789D1A8B78ABEBFC7EEF1B6F1B7BFD5B78BB78CB78DB78EB4A9F1B8CDBBB78FC7D4D5ADB790F1B9B791F1BAB792B793B794B795C7CFB796B797B798D2A4D6CFB799B79AF1BBBDD1B4B0BEBDB79BB79CB79DB4DCCED1B79EBFDFF1BDB79FB7A0B840B841BFFAF1BCB842F1BFB843B844B845F1BEF1C0B846B847B848B849B84AF1C1B84BB84CB84DB84EB84FB850B851B852B853B854B855C1FEB856B857B858B859B85AB85BB85CB85DB85EB85FB860C1A2B861B862B863B864B865B866B867B868B869B86ACAFAB86BB86CD5BEB86DB86EB86FB870BEBABEB9D5C2B871B872BFA2B873CDAFF1B5B874B875B876B877B878B879BDDFB87AB6CBB87BB87CB87DB87EB880B881B882B883B884D6F1F3C3B885B886F3C4B887B8CDB888B889B88AF3C6F3C7B88BB0CAB88CF3C5B88DF3C9CBF1B88EB88FB890F3CBB891D0A6B892B893B1CAF3C8B894B895B896F3CFB897B5D1B898B899F3D7B89AF3D2B89BB89CB89DF3D4F3D3B7FBB89EB1BFB89FF3CEF3CAB5DAB8A0F3D0B940B941F3D1B942F3D5B943B944B945B946F3CDB947BCE3B948C1FDB949F3D6B94AB94BB94CB94DB94EB94FF3DAB950F3CCB951B5C8B952BDEEF3DCB953B954B7A4BFF0D6FECDB2B955B4F0B956B2DFB957F3D8B958F3D9C9B8B959F3DDB95AB95BF3DEB95CF3E1B95DB95EB95FB960B961B962B963B964B965B966B967F3DFB968B969F3E3F3E2B96AB96BF3DBB96CBFEAB96DB3EFB96EF3E0B96FB970C7A9B971BCF2B972B973B974B975F3EBB976B977B978B979B97AB97BB97CB9BFB97DB97EF3E4B980B981B982B2ADBBFEB983CBE3B984B985B986B987F3EDF3E9B988B989B98AB9DCF3EEB98BB98CB98DF3E5F3E6F3EAC2E1F3ECF3EFF3E8BCFDB98EB98FB990CFE4B991B992F3F0B993B994B995F3E7B996B997B998B999B99AB99BB99CB99DF3F2B99EB99FB9A0BA40D7ADC6AABA41BA42BA43BA44F3F3BA45BA46BA47BA48F3F1BA49C2A8BA4ABA4BBA4CBA4DBA4EB8DDF3F5BA4FBA50F3F4BA51BA52BA53B4DBBA54BA55BA56F3F6F3F7BA57BA58BA59F3F8BA5ABA5BBA5CC0BABA5DBA5EC0E9BA5FBA60BA61BA62BA63C5F1BA64BA65BA66BA67F3FBBA68F3FABA69BA6ABA6BBA6CBA6DBA6EBA6FBA70B4D8BA71BA72BA73F3FEF3F9BA74BA75F3FCBA76BA77BA78BA79BA7ABA7BF3FDBA7CBA7DBA7EBA80BA81BA82BA83BA84F4A1BA85BA86BA87BA88BA89BA8AF4A3BBC9BA8BBA8CF4A2BA8DBA8EBA8FBA90BA91BA92BA93BA94BA95BA96BA97BA98BA99F4A4BA9ABA9BBA9CBA9DBA9EBA9FB2BEF4A6F4A5BAA0BB40BB41BB42BB43BB44BB45BB46BB47BB48BB49BCAEBB4ABB4BBB4CBB4DBB4EBB4FBB50BB51BB52BB53BB54BB55BB56BB57BB58BB59BB5ABB5BBB5CBB5DBB5EBB5FBB60BB61BB62BB63BB64BB65BB66BB67BB68BB69BB6ABB6BBB6CBB6DBB6EC3D7D9E1BB6FBB70BB71BB72BB73BB74C0E0F4CCD7D1BB75BB76BB77BB78BB79BB7ABB7BBB7CBB7DBB7EBB80B7DBBB81BB82BB83BB84BB85BB86BB87F4CEC1A3BB88BB89C6C9BB8AB4D6D5B3BB8BBB8CBB8DF4D0F4CFF4D1CBDABB8EBB8FF4D2BB90D4C1D6E0BB91BB92BB93BB94B7E0BB95BB96BB97C1B8BB98BB99C1BBF4D3BEACBB9ABB9BBB9CBB9DBB9EB4E2BB9FBBA0F4D4F4D5BEABBC40BC41F4D6BC42BC43BC44F4DBBC45F4D7F4DABC46BAFDBC47F4D8F4D9BC48BC49BC4ABC4BBC4CBC4DBC4EB8E2CCC7F4DCBC4FB2DABC50BC51C3D3BC52BC53D4E3BFB7BC54BC55BC56BC57BC58BC59BC5AF4DDBC5BBC5CBC5DBC5EBC5FBC60C5B4BC61BC62BC63BC64BC65BC66BC67BC68F4E9BC69BC6ACFB5BC6BBC6CBC6DBC6EBC6FBC70BC71BC72BC73BC74BC75BC76BC77BC78CEC9BC79BC7ABC7BBC7CBC7DBC7EBC80BC81BC82BC83BC84BC85BC86BC87BC88BC89BC8ABC8BBC8CBC8DBC8ECBD8BC8FCBF7BC90BC91BC92BC93BDF4BC94BC95BC96D7CFBC97BC98BC99C0DBBC9ABC9BBC9CBC9DBC9EBC9FBCA0BD40BD41BD42BD43BD44BD45BD46BD47BD48BD49BD4ABD4BBD4CBD4DBD4EBD4FBD50BD51BD52BD53BD54BD55BD56BD57BD58BD59BD5ABD5BBD5CBD5DBD5EBD5FBD60BD61BD62BD63BD64BD65BD66BD67BD68BD69BD6ABD6BBD6CBD6DBD6EBD6FBD70BD71BD72BD73BD74BD75BD76D0F5BD77BD78BD79BD7ABD7BBD7CBD7DBD7EF4EABD80BD81BD82BD83BD84BD85BD86BD87BD88BD89BD8ABD8BBD8CBD8DBD8EBD8FBD90BD91BD92BD93BD94BD95BD96BD97BD98BD99BD9ABD9BBD9CBD9DBD9EBD9FBDA0BE40BE41BE42BE43BE44BE45BE46BE47BE48BE49BE4ABE4BBE4CF4EBBE4DBE4EBE4FBE50BE51BE52BE53F4ECBE54BE55BE56BE57BE58BE59BE5ABE5BBE5CBE5DBE5EBE5FBE60BE61BE62BE63BE64BE65BE66BE67BE68BE69BE6ABE6BBE6CBE6DBE6EBE6FBE70BE71BE72BE73BE74BE75BE76BE77BE78BE79BE7ABE7BBE7CBE7DBE7EBE80BE81BE82BE83BE84BE85BE86BE87BE88BE89BE8ABE8BBE8CBE8DBE8EBE8FBE90BE91BE92BE93BE94BE95BE96BE97BE98BE99BE9ABE9BBE9CBE9DBE9EBE9FBEA0BF40BF41BF42BF43BF44BF45BF46BF47BF48BF49BF4ABF4BBF4CBF4DBF4EBF4FBF50BF51BF52BF53BF54BF55BF56BF57BF58BF59BF5ABF5BBF5CBF5DBF5EBF5FBF60BF61BF62BF63BF64BF65BF66BF67BF68BF69BF6ABF6BBF6CBF6DBF6EBF6FBF70BF71BF72BF73BF74BF75BF76BF77BF78BF79BF7ABF7BBF7CBF7DBF7EBF80F7E3BF81BF82BF83BF84BF85B7B1BF86BF87BF88BF89BF8AF4EDBF8BBF8CBF8DBF8EBF8FBF90BF91BF92BF93BF94BF95BF96BF97BF98BF99BF9ABF9BBF9CBF9DBF9EBF9FBFA0C040C041C042C043C044C045C046C047C048C049C04AC04BC04CC04DC04EC04FC050C051C052C053C054C055C056C057C058C059C05AC05BC05CC05DC05EC05FC060C061C062C063D7EBC064C065C066C067C068C069C06AC06BC06CC06DC06EC06FC070C071C072C073C074C075C076C077C078C079C07AC07BF4EEC07CC07DC07EE6F9BEC0E6FABAECE6FBCFCBE6FCD4BCBCB6E6FDE6FEBCCDC8D2CEB3E7A1C080B4BFE7A2C9B4B8D9C4C9C081D7DDC2DAB7D7D6BDCEC6B7C4C082C083C5A6E7A3CFDFE7A4E7A5E7A6C1B7D7E9C9F0CFB8D6AFD6D5E7A7B0EDE7A8E7A9C9DCD2EFBEADE7AAB0F3C8DEBDE1E7ABC8C6C084E7ACBBE6B8F8D1A4E7ADC2E7BEF8BDCACDB3E7AEE7AFBEEED0E5C085CBE7CCD0BCCCE7B0BCA8D0F7E7B1C086D0F8E7B2E7B3B4C2E7B4E7B5C9FECEACC3E0E7B7B1C1B3F1C087E7B8E7B9D7DBD5C0E7BAC2CCD7BAE7BBE7BCE7BDBCEAC3E5C0C2E7BEE7BFBCA9C088E7C0E7C1E7B6B6D0E7C2C089E7C3E7C4BBBAB5DEC2C6B1E0E7C5D4B5E7C6B8BFE7C8E7C7B7ECC08AE7C9B2F8E7CAE7CBE7CCE7CDE7CEE7CFE7D0D3A7CBF5E7D1E7D2E7D3E7D4C9C9E7D5E7D6E7D7E7D8E7D9BDC9E7DAF3BEC08BB8D7C08CC8B1C08DC08EC08FC090C091C092C093F3BFC094F3C0F3C1C095C096C097C098C099C09AC09BC09CC09DC09EB9DECDF8C09FC0A0D8E8BAB1C140C2DEEEB7C141B7A3C142C143C144C145EEB9C146EEB8B0D5C147C148C149C14AC14BEEBBD5D6D7EFC14CC14DC14ED6C3C14FC150EEBDCAF0C151EEBCC152C153C154C155EEBEC156C157C158C159EEC0C15AC15BEEBFC15CC15DC15EC15FC160C161C162C163D1F2C164C7BCC165C3C0C166C167C168C169C16AB8E1C16BC16CC16DC16EC16FC1E7C170C171F4C6D0DFF4C7C172CFDBC173C174C8BAC175C176F4C8C177C178C179C17AC17BC17CC17DF4C9F4CAC17EF4CBC180C181C182C183C184D9FAB8FEC185C186E5F1D3F0C187F4E0C188CECCC189C18AC18BB3E1C18CC18DC18EC18FF1B4C190D2EEC191F4E1C192C193C194C195C196CFE8F4E2C197C198C7CCC199C19AC19BC19CC19DC19EB5D4B4E4F4E4C19FC1A0C240F4E3F4E5C241C242F4E6C243C244C245C246F4E7C247BAB2B0BFC248F4E8C249C24AC24BC24CC24DC24EC24FB7ADD2EDC250C251C252D2ABC0CFC253BFBCEBA3D5DFEAC8C254C255C256C257F1F3B6F8CBA3C258C259C4CDC25AF1E7C25BF1E8B8FBF1E9BAC4D4C5B0D2C25CC25DF1EAC25EC25FC260F1EBC261F1ECC262C263F1EDF1EEF1EFF1F1F1F0C5D5C264C265C266C267C268C269F1F2C26AB6FAC26BF1F4D2AEDEC7CBCAC26CC26DB3DCC26EB5A2C26FB9A2C270C271C4F4F1F5C272C273F1F6C274C275C276C1C4C1FBD6B0F1F7C277C278C279C27AF1F8C27BC1AAC27CC27DC27EC6B8C280BEDBC281C282C283C284C285C286C287C288C289C28AC28BC28CC28DC28EF1F9B4CFC28FC290C291C292C293C294F1FAC295C296C297C298C299C29AC29BC29CC29DC29EC29FC2A0C340EDB2EDB1C341C342CBE0D2DEC343CBC1D5D8C344C8E2C345C0DFBCA1C346C347C348C349C34AC34BEBC1C34CC34DD0A4C34ED6E2C34FB6C7B8D8EBC0B8CEC350EBBFB3A6B9C9D6ABC351B7F4B7CAC352C353C354BCE7B7BEEBC6C355EBC7B0B9BFCFC356EBC5D3FDC357EBC8C358C359EBC9C35AC35BB7CEC35CEBC2EBC4C9F6D6D7D5CDD0B2EBCFCEB8EBD0C35DB5A8C35EC35FC360C361C362B1B3EBD2CCA5C363C364C365C366C367C368C369C5D6EBD3C36AEBD1C5DFEBCECAA4EBD5B0FBC36BC36CBAFAC36DC36ED8B7F1E3C36FEBCAEBCBEBCCEBCDEBD6E6C0EBD9C370BFE8D2C8EBD7EBDCB8ECEBD8C371BDBAC372D0D8C373B0B7C374EBDDC4DCC375C376C377C378D6ACC379C37AC37BB4E0C37CC37DC2F6BCB9C37EC380EBDAEBDBD4E0C6EAC4D4EBDFC5A7D9F5C381B2B1C382EBE4C383BDC5C384C385C386EBE2C387C388C389C38AC38BC38CC38DC38EC38FC390C391C392C393EBE3C394C395B8ACC396CDD1EBE5C397C398C399EBE1C39AC1B3C39BC39CC39DC39EC39FC6A2C3A0C440C441C442C443C444C445CCF3C446EBE6C447C0B0D2B8EBE7C448C449C44AB8AFB8ADC44BEBE8C7BBCDF3C44CC44DC44EEBEAEBEBC44FC450C451C452C453EBEDC454C455C456C457D0C8C458EBF2C459EBEEC45AC45BC45CEBF1C8F9C45DD1FCEBECC45EC45FEBE9C460C461C462C463B8B9CFD9C4E5EBEFEBF0CCDACDC8B0F2C464EBF6C465C466C467C468C469EBF5C46AB2B2C46BC46CC46DC46EB8E0C46FEBF7C470C471C472C473C474C475B1ECC476C477CCC5C4A4CFA5C478C479C47AC47BC47CEBF9C47DC47EECA2C480C5F2C481EBFAC482C483C484C485C486C487C488C489C9C5C48AC48BC48CC48DC48EC48FE2DFEBFEC490C491C492C493CDCEECA1B1DBD3B7C494C495D2DCC496C497C498EBFDC499EBFBC49AC49BC49CC49DC49EC49FC4A0C540C541C542C543C544C545C546C547C548C549C54AC54BC54CC54DC54EB3BCC54FC550C551EAB0C552C553D7D4C554F4ABB3F4C555C556C557C558C559D6C1D6C2C55AC55BC55CC55DC55EC55FD5E9BECAC560F4A7C561D2A8F4A8F4A9C562F4AABECBD3DFC563C564C565C566C567C9E0C9E1C568C569F3C2C56ACAE6C56BCCF2C56CC56DC56EC56FC570C571E2B6CBB4C572CEE8D6DBC573F4ADF4AEF4AFC574C575C576C577F4B2C578BABDF4B3B0E3F4B0C579F4B1BDA2B2D5C57AF4B6F4B7B6E6B2B0CFCFF4B4B4ACC57BF4B5C57CC57DF4B8C57EC580C581C582C583F4B9C584C585CDA7C586F4BAC587F4BBC588C589C58AF4BCC58BC58CC58DC58EC58FC590C591C592CBD2C593F4BDC594C595C596C597F4BEC598C599C59AC59BC59CC59DC59EC59FF4BFC5A0C640C641C642C643F4DEC1BCBCE8C644C9ABD1DEE5F5C645C646C647C648DCB3D2D5C649C64ADCB4B0ACDCB5C64BC64CBDDAC64DDCB9C64EC64FC650D8C2C651DCB7D3F3C652C9D6DCBADCB6C653DCBBC3A2C654C655C656C657DCBCDCC5DCBDC658C659CEDFD6A5C65ADCCFC65BDCCDC65CC65DDCD2BDE6C2ABC65EDCB8DCCBDCCEDCBEB7D2B0C5DCC7D0BEDCC1BBA8C65FB7BCDCCCC660C661DCC6DCBFC7DBC662C663C664D1BFDCC0C665C666DCCAC667C668DCD0C669C66ACEADDCC2C66BDCC3DCC8DCC9B2D4DCD1CBD5C66CD4B7DCDBDCDFCCA6DCE6C66DC3E7DCDCC66EC66FBFC1DCD9C670B0FAB9B6DCE5DCD3C671DCC4DCD6C8F4BFE0C672C673C674C675C9BBC676C677C678B1BDC679D3A2C67AC67BDCDAC67CC67DDCD5C67EC6BBC680DCDEC681C682C683C684C685D7C2C3AFB7B6C7D1C3A9DCE2DCD8DCEBDCD4C686C687DCDDC688BEA5DCD7C689DCE0C68AC68BDCE3DCE4C68CDCF8C68DC68EDCE1DDA2DCE7C68FC690C691C692C693C694C695C696C697C698BCEBB4C4C699C69AC3A3B2E7DCFAC69BDCF2C69CDCEFC69DDCFCDCEED2F0B2E8C69EC8D7C8E3DCFBC69FDCEDC6A0C740C741DCF7C742C743DCF5C744C745BEA3DCF4C746B2DDC747C748C749C74AC74BDCF3BCF6DCE8BBC4C74CC0F3C74DC74EC74FC750C751BCD4DCE9DCEAC752DCF1DCF6DCF9B5B4C753C8D9BBE7DCFEDCFDD3ABDDA1DDA3DDA5D2F1DDA4DDA6DDA7D2A9C754C755C756C757C758C759C75ABAC9DDA9C75BC75CDDB6DDB1DDB4C75DC75EC75FC760C761C762C763DDB0C6CEC764C765C0F2C766C767C768C769C9AFC76AC76BC76CDCECDDAEC76DC76EC76FC770DDB7C771C772DCF0DDAFC773DDB8C774DDACC775C776C777C778C779C77AC77BDDB9DDB3DDADC4AAC77CC77DC77EC780DDA8C0B3C1ABDDAADDABC781DDB2BBF1DDB5D3A8DDBAC782DDBBC3A7C783C784DDD2DDBCC785C786C787DDD1C788B9BDC789C78ABED5C78BBEFAC78CC78DBACAC78EC78FC790C791DDCAC792DDC5C793DDBFC794C795C796B2CBDDC3C797DDCBB2A4DDD5C798C799C79ADDBEC79BC79CC79DC6D0DDD0C79EC79FC7A0C840C841DDD4C1E2B7C6C842C843C844C845C846DDCEDDCFC847C848C849DDC4C84AC84BC84CDDBDC84DDDCDCCD1C84EDDC9C84FC850C851C852DDC2C3C8C6BCCEAEDDCCC853DDC8C854C855C856C857C858C859DDC1C85AC85BC85CDDC6C2DCC85DC85EC85FC860C861C862D3A9D3AADDD3CFF4C8F8C863C864C865C866C867C868C869C86ADDE6C86BC86CC86DC86EC86FC870DDC7C871C872C873DDE0C2E4C874C875C876C877C878C879C87AC87BDDE1C87CC87DC87EC880C881C882C883C884C885C886DDD7C887C888C889C88AC88BD6F8C88CDDD9DDD8B8F0DDD6C88DC88EC88FC890C6CFC891B6ADC892C893C894C895C896DDE2C897BAF9D4E1DDE7C898C899C89AB4D0C89BDDDAC89CBFFBDDE3C89DDDDFC89EDDDDC89FC8A0C940C941C942C943C944B5D9C945C946C947C948DDDBDDDCDDDEC949BDAFDDE4C94ADDE5C94BC94CC94DC94EC94FC950C951C952DDF5C953C3C9C954C955CBE2C956C957C958C959DDF2C95AC95BC95CC95DC95EC95FC960C961C962C963C964C965C966D8E1C967C968C6D1C969DDF4C96AC96BC96CD5F4DDF3DDF0C96DC96EDDECC96FDDEFC970DDE8C971C972D0EEC973C974C975C976C8D8DDEEC977C978DDE9C979C97ADDEACBF2C97BDDEDC97CC97DB1CDC97EC980C981C982C983C984C0B6C985BCBBDDF1C986C987DDF7C988DDF6DDEBC989C98AC98BC98CC98DC5EEC98EC98FC990DDFBC991C992C993C994C995C996C997C998C999C99AC99BDEA4C99CC99DDEA3C99EC99FC9A0CA40CA41CA42CA43CA44CA45CA46CA47CA48DDF8CA49CA4ACA4BCA4CC3EFCA4DC2FBCA4ECA4FCA50D5E1CA51CA52CEB5CA53CA54CA55CA56DDFDCA57B2CCCA58CA59CA5ACA5BCA5CCA5DCA5ECA5FCA60C4E8CADFCA61CA62CA63CA64CA65CA66CA67CA68CA69CA6AC7BEDDFADDFCDDFEDEA2B0AAB1CECA6BCA6CCA6DCA6ECA6FDEACCA70CA71CA72CA73DEA6BDB6C8EFCA74CA75CA76CA77CA78CA79CA7ACA7BCA7CCA7DCA7EDEA1CA80CA81DEA5CA82CA83CA84CA85DEA9CA86CA87CA88CA89CA8ADEA8CA8BCA8CCA8DDEA7CA8ECA8FCA90CA91CA92CA93CA94CA95CA96DEADCA97D4CCCA98CA99CA9ACA9BDEB3DEAADEAECA9CCA9DC0D9CA9ECA9FCAA0CB40CB41B1A1DEB6CB42DEB1CB43CB44CB45CB46CB47CB48CB49DEB2CB4ACB4BCB4CCB4DCB4ECB4FCB50CB51CB52CB53CB54D1A6DEB5CB55CB56CB57CB58CB59CB5ACB5BDEAFCB5CCB5DCB5EDEB0CB5FD0BDCB60CB61CB62DEB4CAEDDEB9CB63CB64CB65CB66CB67CB68DEB8CB69DEB7CB6ACB6BCB6CCB6DCB6ECB6FCB70DEBBCB71CB72CB73CB74CB75CB76CB77BDE5CB78CB79CB7ACB7BCB7CB2D8C3EACB7DCB7EDEBACB80C5BACB81CB82CB83CB84CB85CB86DEBCCB87CB88CB89CB8ACB8BCB8CCB8DCCD9CB8ECB8FCB90CB91B7AACB92CB93CB94CB95CB96CB97CB98CB99CB9ACB9BCB9CCB9DCB9ECB9FCBA0CC40CC41D4E5CC42CC43CC44DEBDCC45CC46CC47CC48CC49DEBFCC4ACC4BCC4CCC4DCC4ECC4FCC50CC51CC52CC53CC54C4A2CC55CC56CC57CC58DEC1CC59CC5ACC5BCC5CCC5DCC5ECC5FCC60CC61CC62CC63CC64CC65CC66CC67CC68DEBECC69DEC0CC6ACC6BCC6CCC6DCC6ECC6FCC70CC71CC72CC73CC74CC75CC76CC77D5BACC78CC79CC7ADEC2CC7BCC7CCC7DCC7ECC80CC81CC82CC83CC84CC85CC86CC87CC88CC89CC8ACC8BF2AEBBA2C2B2C5B0C2C7CC8CCC8DF2AFCC8ECC8FCC90CC91CC92D0E9CC93CC94CC95D3DDCC96CC97CC98EBBDCC99CC9ACC9BCC9CCC9DCC9ECC9FCCA0B3E6F2B0CD40F2B1CD41CD42CAADCD43CD44CD45CD46CD47CD48CD49BAE7F2B3F2B5F2B4CBE4CFBAF2B2CAB4D2CFC2ECCD4ACD4BCD4CCD4DCD4ECD4FCD50CEC3F2B8B0F6F2B7CD51CD52CD53CD54CD55F2BECD56B2CFCD57CD58CD59CD5ACD5BCD5CD1C1F2BACD5DCD5ECD5FCD60CD61F2BCD4E9CD62CD63F2BBF2B6F2BFF2BDCD64F2B9CD65CD66F2C7F2C4F2C6CD67CD68F2CAF2C2F2C0CD69CD6ACD6BF2C5CD6CCD6DCD6ECD6FCD70D6FBCD71CD72CD73F2C1CD74C7F9C9DFCD75F2C8B9C6B5B0CD76CD77F2C3F2C9F2D0F2D6CD78CD79BBD7CD7ACD7BCD7CF2D5CDDCCD7DD6EBCD7ECD80F2D2F2D4CD81CD82CD83CD84B8F2CD85CD86CD87CD88F2CBCD89CD8ACD8BF2CEC2F9CD8CD5DDF2CCF2CDF2CFF2D3CD8DCD8ECD8FF2D9D3BCCD90CD91CD92CD93B6EACD94CAF1CD95B7E4F2D7CD96CD97CD98F2D8F2DAF2DDF2DBCD99CD9AF2DCCD9BCD9CCD9DCD9ED1D1F2D1CD9FCDC9CDA0CECFD6A9CE40F2E3CE41C3DBCE42F2E0CE43CE44C0AFF2ECF2DECE45F2E1CE46CE47CE48F2E8CE49CE4ACE4BCE4CF2E2CE4DCE4EF2E7CE4FCE50F2E6CE51CE52F2E9CE53CE54CE55F2DFCE56CE57F2E4F2EACE58CE59CE5ACE5BCE5CCE5DCE5ED3ACF2E5B2F5CE5FCE60F2F2CE61D0ABCE62CE63CE64CE65F2F5CE66CE67CE68BBC8CE69F2F9CE6ACE6BCE6CCE6DCE6ECE6FF2F0CE70CE71F2F6F2F8F2FACE72CE73CE74CE75CE76CE77CE78CE79F2F3CE7AF2F1CE7BCE7CCE7DBAFBCE7EB5FBCE80CE81CE82CE83F2EFF2F7F2EDF2EECE84CE85CE86F2EBF3A6CE87F3A3CE88CE89F3A2CE8ACE8BF2F4CE8CC8DACE8DCE8ECE8FCE90CE91F2FBCE92CE93CE94F3A5CE95CE96CE97CE98CE99CE9ACE9BC3F8CE9CCE9DCE9ECE9FCEA0CF40CF41CF42F2FDCF43CF44F3A7F3A9F3A4CF45F2FCCF46CF47CF48F3ABCF49F3AACF4ACF4BCF4CCF4DC2DDCF4ECF4FF3AECF50CF51F3B0CF52CF53CF54CF55CF56F3A1CF57CF58CF59F3B1F3ACCF5ACF5BCF5CCF5DCF5EF3AFF2FEF3ADCF5FCF60CF61CF62CF63CF64CF65F3B2CF66CF67CF68CF69F3B4CF6ACF6BCF6CCF6DF3A8CF6ECF6FCF70CF71F3B3CF72CF73CF74F3B5CF75CF76CF77CF78CF79CF7ACF7BCF7CCF7DCF7ED0B7CF80CF81CF82CF83F3B8CF84CF85CF86CF87D9F9CF88CF89CF8ACF8BCF8CCF8DF3B9CF8ECF8FCF90CF91CF92CF93CF94CF95F3B7CF96C8E4F3B6CF97CF98CF99CF9AF3BACF9BCF9CCF9DCF9ECF9FF3BBB4C0CFA0D040D041D042D043D044D045D046D047D048D049D04AD04BD04CD04DEEC3D04ED04FD050D051D052D053F3BCD054D055F3BDD056D057D058D1AAD059D05AD05BF4ACD0C6D05CD05DD05ED05FD060D061D0D0D1DCD062D063D064D065D066D067CFCED068D069BDD6D06AD1C3D06BD06CD06DD06ED06FD070D071BAE2E1E9D2C2F1C2B2B9D072D073B1EDF1C3D074C9C0B3C4D075D9F2D076CBA5D077F1C4D078D079D07AD07BD6D4D07CD07DD07ED080D081F1C5F4C0F1C6D082D4ACF1C7D083B0C0F4C1D084D085F4C2D086D087B4FCD088C5DBD089D08AD08BD08CCCBBD08DD08ED08FD0E4D090D091D092D093D094CDE0D095D096D097D098D099F1C8D09AD9F3D09BD09CD09DD09ED09FD0A0B1BBD140CFAED141D142D143B8A4D144D145D146D147D148F1CAD149D14AD14BD14CF1CBD14DD14ED14FD150B2C3C1D1D151D152D7B0F1C9D153D154F1CCD155D156D157D158F1CED159D15AD15BD9F6D15CD2E1D4A3D15DD15EF4C3C8B9D15FD160D161D162D163F4C4D164D165F1CDF1CFBFE3F1D0D166D167F1D4D168D169D16AD16BD16CD16DD16EF1D6F1D1D16FC9D1C5E1D170D171D172C2E3B9FCD173D174F1D3D175F1D5D176D177D178B9D3D179D17AD17BD17CD17DD17ED180F1DBD181D182D183D184D185BAD6D186B0FDF1D9D187D188D189D18AD18BF1D8F1D2F1DAD18CD18DD18ED18FD190F1D7D191D192D193C8ECD194D195D196D197CDCAF1DDD198D199D19AD19BE5BDD19CD19DD19EF1DCD19FF1DED1A0D240D241D242D243D244D245D246D247D248F1DFD249D24ACFE5D24BD24CD24DD24ED24FD250D251D252D253D254D255D256D257D258D259D25AD25BD25CD25DD25ED25FD260D261D262D263F4C5BDF3D264D265D266D267D268D269F1E0D26AD26BD26CD26DD26ED26FD270D271D272D273D274D275D276D277D278D279D27AD27BD27CD27DF1E1D27ED280D281CEF7D282D2AAD283F1FBD284D285B8B2D286D287D288D289D28AD28BD28CD28DD28ED28FD290D291D292D293D294D295D296D297D298D299D29AD29BD29CD29DD29ED29FD2A0D340D341D342D343D344D345D346D347D348D349D34AD34BD34CD34DD34ED34FD350D351D352D353D354D355D356D357D358D359D35AD35BD35CD35DD35EBCFBB9DBD35FB9E6C3D9CAD3EAE8C0C0BEF5EAE9EAEAEAEBD360EAECEAEDEAEEEAEFBDC7D361D362D363F5FBD364D365D366F5FDD367F5FED368F5FCD369D36AD36BD36CBDE2D36DF6A1B4A5D36ED36FD370D371F6A2D372D373D374F6A3D375D376D377ECB2D378D379D37AD37BD37CD37DD37ED380D381D382D383D384D1D4D385D386D387D388D389D38AD9EAD38BD38CD38DD38ED38FD390D391D392D393D394D395D396D397D398D399D39AD39BD39CD39DD39ED39FD3A0D440D441D442D443D444D445D446D447D448D449D44AD44BD44CD44DD44ED44FD450D451D452D453D454D455D456D457D458D459D45AD45BD45CD45DD45ED45FF6A4D460D461D462D463D464D465D466D467D468EEBAD469D46AD46BD46CD46DD46ED46FD470D471D472D473D474D475D476D477D478D479D47AD47BD47CD47DD47ED480D481D482D483D484D485D486D487D488D489D48AD48BD48CD48DD48ED48FD490D491D492D493D494D495D496D497D498D499D5B2D49AD49BD49CD49DD49ED49FD4A0D540D541D542D543D544D545D546D547D3FECCDCD548D549D54AD54BD54CD54DD54ED54FCAC4D550D551D552D553D554D555D556D557D558D559D55AD55BD55CD55DD55ED55FD560D561D562D563D564D565D566D567D568D569D56AD56BD56CD56DD56ED56FD570D571D572D573D574D575D576D577D578D579D57AD57BD57CD57DD57ED580D581D582D583D584D585D586D587D588D589D58AD58BD58CD58DD58ED58FD590D591D592D593D594D595D596D597D598D599D59AD59BD59CD59DD59ED59FD5A0D640D641D642D643D644D645D646D647D648D649D64AD64BD64CD64DD64ED64FD650D651D652D653D654D655D656D657D658D659D65AD65BD65CD65DD65ED65FD660D661D662E5C0D663D664D665D666D667D668D669D66AD66BD66CD66DD66ED66FD670D671D672D673D674D675D676D677D678D679D67AD67BD67CD67DD67ED680D681F6A5D682D683D684D685D686D687D688D689D68AD68BD68CD68DD68ED68FD690D691D692D693D694D695D696D697D698D699D69AD69BD69CD69DD69ED69FD6A0D740D741D742D743D744D745D746D747D748D749D74AD74BD74CD74DD74ED74FD750D751D752D753D754D755D756D757D758D759D75AD75BD75CD75DD75ED75FBEAFD760D761D762D763D764C6A9D765D766D767D768D769D76AD76BD76CD76DD76ED76FD770D771D772D773D774D775D776D777D778D779D77AD77BD77CD77DD77ED780D781D782D783D784D785D786D787D788D789D78AD78BD78CD78DD78ED78FD790D791D792D793D794D795D796D797D798DAA5BCC6B6A9B8BCC8CFBCA5DAA6DAA7CCD6C8C3DAA8C6FDD799D1B5D2E9D1B6BCC7D79ABDB2BBE4DAA9DAAAD1C8DAABD0EDB6EFC2DBD79BCBCFB7EDC9E8B7C3BEF7D6A4DAACDAADC6C0D7E7CAB6D79CD5A9CBDFD5EFDAAED6DFB4CADAB0DAAFD79DD2EBDAB1DAB2DAB3CAD4DAB4CAABDAB5DAB6B3CFD6EFDAB7BBB0B5AEDAB8DAB9B9EED1AFD2E8DABAB8C3CFEAB2EFDABBDABCD79EBDEBCEDCD3EFDABDCEF3DABED3D5BBE5DABFCBB5CBD0DAC0C7EBD6EEDAC1C5B5B6C1DAC2B7CCBFCEDAC3DAC4CBADDAC5B5F7DAC6C1C2D7BBDAC7CCB8D79FD2EAC4B1DAC8B5FDBBD1DAC9D0B3DACADACBCEBDDACCDACDDACEB2F7DAD1DACFD1E8DAD0C3D5DAD2D7A0DAD3DAD4DAD5D0BBD2A5B0F9DAD6C7ABDAD7BDF7C3A1DAD8DAD9C3FDCCB7DADADADBC0BEC6D7DADCDADDC7B4DADEDADFB9C8D840D841D842D843D844D845D846D847D848BBEDD849D84AD84BD84CB6B9F4F8D84DF4F9D84ED84FCDE3D850D851D852D853D854D855D856D857F5B9D858D859D85AD85BEBE0D85CD85DD85ED85FD860D861CFF3BBBFD862D863D864D865D866D867D868BAC0D4A5D869D86AD86BD86CD86DD86ED86FE1D9D870D871D872D873F5F4B1AAB2F2D874D875D876D877D878D879D87AF5F5D87BD87CF5F7D87DD87ED880BAD1F5F6D881C3B2D882D883D884D885D886D887D888F5F9D889D88AD88BF5F8D88CD88DD88ED88FD890D891D892D893D894D895D896D897D898D899D89AD89BD89CD89DD89ED89FD8A0D940D941D942D943D944D945D946D947D948D949D94AD94BD94CD94DD94ED94FD950D951D952D953D954D955D956D957D958D959D95AD95BD95CD95DD95ED95FD960D961D962D963D964D965D966D967D968D969D96AD96BD96CD96DD96ED96FD970D971D972D973D974D975D976D977D978D979D97AD97BD97CD97DD97ED980D981D982D983D984D985D986D987D988D989D98AD98BD98CD98DD98ED98FD990D991D992D993D994D995D996D997D998D999D99AD99BD99CD99DD99ED99FD9A0DA40DA41DA42DA43DA44DA45DA46DA47DA48DA49DA4ADA4BDA4CDA4DDA4EB1B4D5EAB8BADA4FB9B1B2C6D4F0CFCDB0DCD5CBBBF5D6CAB7B7CCB0C6B6B1E1B9BAD6FCB9E1B7A1BCFAEADAEADBCCF9B9F3EADCB4FBC3B3B7D1BAD8EADDD4F4EADEBCD6BBDFEADFC1DEC2B8D4DFD7CAEAE0EAE1EAE4EAE2EAE3C9DEB8B3B6C4EAE5CAEAC9CDB4CDDA50DA51E2D9C5E2EAE6C0B5DA52D7B8EAE7D7ACC8FCD8D3D8CDD4DEDA53D4F9C9C4D3AEB8D3B3E0DA54C9E2F4F6DA55DA56DA57BAD5DA58F4F7DA59DA5AD7DFDA5BDA5CF4F1B8B0D5D4B8CFC6F0DA5DDA5EDA5FDA60DA61DA62DA63DA64DA65B3C3DA66DA67F4F2B3ACDA68DA69DA6ADA6BD4BDC7F7DA6CDA6DDA6EDA6FDA70F4F4DA71DA72F4F3DA73DA74DA75DA76DA77DA78DA79DA7ADA7BDA7CCCCBDA7DDA7EDA80C8A4DA81DA82DA83DA84DA85DA86DA87DA88DA89DA8ADA8BDA8CDA8DF4F5DA8ED7E3C5BFF5C0DA8FDA90F5BBDA91F5C3DA92F5C2DA93D6BAF5C1DA94DA95DA96D4BEF5C4DA97F5CCDA98DA99DA9ADA9BB0CFB5F8DA9CF5C9F5CADA9DC5DCDA9EDA9FDAA0DB40F5C5F5C6DB41DB42F5C7F5CBDB43BEE0F5C8B8FADB44DB45DB46F5D0F5D3DB47DB48DB49BFE7DB4AB9F2F5BCF5CDDB4BDB4CC2B7DB4DDB4EDB4FCCF8DB50BCF9DB51F5CEF5CFF5D1B6E5F5D2DB52F5D5DB53DB54DB55DB56DB57DB58DB59F5BDDB5ADB5BDB5CF5D4D3BBDB5DB3ECDB5EDB5FCCA4DB60DB61DB62DB63F5D6DB64DB65DB66DB67DB68DB69DB6ADB6BF5D7BEE1F5D8DB6CDB6DCCDFF5DBDB6EDB6FDB70DB71DB72B2C8D7D9DB73F5D9DB74F5DAF5DCDB75F5E2DB76DB77DB78F5E0DB79DB7ADB7BF5DFF5DDDB7CDB7DF5E1DB7EDB80F5DEF5E4F5E5DB81CCE3DB82DB83E5BFB5B8F5E3F5E8CCA3DB84DB85DB86DB87DB88F5E6F5E7DB89DB8ADB8BDB8CDB8DDB8EF5BEDB8FDB90DB91DB92DB93DB94DB95DB96DB97DB98DB99DB9AB1C4DB9BDB9CF5BFDB9DDB9EB5C5B2E4DB9FF5ECF5E9DBA0B6D7DC40F5EDDC41F5EADC42DC43DC44DC45DC46F5EBDC47DC48B4DADC49D4EADC4ADC4BDC4CF5EEDC4DB3F9DC4EDC4FDC50DC51DC52DC53DC54F5EFF5F1DC55DC56DC57F5F0DC58DC59DC5ADC5BDC5CDC5DDC5EF5F2DC5FF5F3DC60DC61DC62DC63DC64DC65DC66DC67DC68DC69DC6ADC6BC9EDB9AADC6CDC6DC7FBDC6EDC6FB6E3DC70DC71DC72DC73DC74DC75DC76CCC9DC77DC78DC79DC7ADC7BDC7CDC7DDC7EDC80DC81DC82DC83DC84DC85DC86DC87DC88DC89DC8AEAA6DC8BDC8CDC8DDC8EDC8FDC90DC91DC92DC93DC94DC95DC96DC97DC98DC99DC9ADC9BDC9CDC9DDC9EDC9FDCA0DD40DD41DD42DD43DD44DD45DD46DD47DD48DD49DD4ADD4BDD4CDD4DDD4EDD4FDD50DD51DD52DD53DD54DD55DD56DD57DD58DD59DD5ADD5BDD5CDD5DDD5EDD5FDD60DD61DD62DD63DD64DD65DD66DD67DD68DD69DD6ADD6BDD6CDD6DDD6EDD6FDD70DD71DD72DD73DD74DD75DD76DD77DD78DD79DD7ADD7BDD7CDD7DDD7EDD80DD81DD82DD83DD84DD85DD86DD87DD88DD89DD8ADD8BDD8CDD8DDD8EDD8FDD90DD91DD92DD93DD94DD95DD96DD97DD98DD99DD9ADD9BDD9CDD9DDD9EDD9FDDA0DE40DE41DE42DE43DE44DE45DE46DE47DE48DE49DE4ADE4BDE4CDE4DDE4EDE4FDE50DE51DE52DE53DE54DE55DE56DE57DE58DE59DE5ADE5BDE5CDE5DDE5EDE5FDE60B3B5D4FEB9ECD0F9DE61E9EDD7AAE9EEC2D6C8EDBAE4E9EFE9F0E9F1D6E1E9F2E9F3E9F5E9F4E9F6E9F7C7E1E9F8D4D8E9F9BDCEDE62E9FAE9FBBDCFE9FCB8A8C1BEE9FDB1B2BBD4B9F5E9FEDE63EAA1EAA2EAA3B7F8BCADDE64CAE4E0CED4AFCFBDD5B7EAA4D5DEEAA5D0C1B9BCDE65B4C7B1D9DE66DE67DE68C0B1DE69DE6ADE6BDE6CB1E6B1E7DE6DB1E8DE6EDE6FDE70DE71B3BDC8E8DE72DE73DE74DE75E5C1DE76DE77B1DFDE78DE79DE7AC1C9B4EFDE7BDE7CC7A8D3D8DE7DC6F9D1B8DE7EB9FDC2F5DE80DE81DE82DE83DE84D3ADDE85D4CBBDFCDE86E5C2B7B5E5C3DE87DE88BBB9D5E2DE89BDF8D4B6CEA5C1ACB3D9DE8ADE8BCCF6DE8CE5C6E5C4E5C8DE8DE5CAE5C7B5CFC6C8DE8EB5FCE5C5DE8FCAF6DE90DE91E5C9DE92DE93DE94C3D4B1C5BCA3DE95DE96DE97D7B7DE98DE99CDCBCBCDCACACCD3E5CCE5CBC4E6DE9ADE9BD1A1D1B7E5CDDE9CE5D0DE9DCDB8D6F0E5CFB5DDDE9ECDBEDE9FE5D1B6BADEA0DF40CDA8B9E4DF41CAC5B3D1CBD9D4ECE5D2B7EADF42DF43DF44E5CEDF45DF46DF47DF48DF49DF4AE5D5B4FEE5D6DF4BDF4CDF4DDF4EDF4FE5D3E5D4DF50D2DDDF51DF52C2DFB1C6DF53D3E2DF54DF55B6DDCBECDF56E5D7DF57DF58D3F6DF59DF5ADF5BDF5CDF5DB1E9DF5EB6F4E5DAE5D8E5D9B5C0DF5FDF60DF61D2C5E5DCDF62DF63E5DEDF64DF65DF66DF67DF68DF69E5DDC7B2DF6AD2A3DF6BDF6CE5DBDF6DDF6EDF6FDF70D4E2D5DADF71DF72DF73DF74DF75E5E0D7F1DF76DF77DF78DF79DF7ADF7BDF7CE5E1DF7DB1DCD1FBDF7EE5E2E5E4DF80DF81DF82DF83E5E3DF84DF85E5E5DF86DF87DF88DF89DF8AD2D8DF8BB5CBDF8CE7DFDF8DDAF5DF8EDAF8DF8FDAF6DF90DAF7DF91DF92DF93DAFAD0CFC4C7DF94DF95B0EEDF96DF97DF98D0B0DF99DAF9DF9AD3CABAAADBA2C7F1DF9BDAFCDAFBC9DBDAFDDF9CDBA1D7DEDAFEC1DADF9DDF9EDBA5DF9FDFA0D3F4E040E041DBA7DBA4E042DBA8E043E044BDBCE045E046E047C0C9DBA3DBA6D6A3E048DBA9E049E04AE04BDBADE04CE04DE04EDBAEDBACBAC2E04FE050E051BFA4DBABE052E053E054DBAAD4C7B2BFE055E056DBAFE057B9F9E058DBB0E059E05AE05BE05CB3BBE05DE05EE05FB5A6E060E061E062E063B6BCDBB1E064E065E066B6F5E067DBB2E068E069E06AE06BE06CE06DE06EE06FE070E071E072E073E074E075E076E077E078E079E07AE07BB1C9E07CE07DE07EE080DBB4E081E082E083DBB3DBB5E084E085E086E087E088E089E08AE08BE08CE08DE08EDBB7E08FDBB6E090E091E092E093E094E095E096DBB8E097E098E099E09AE09BE09CE09DE09EE09FDBB9E0A0E140DBBAE141E142D3CFF4FAC7F5D7C3C5E4F4FCF4FDF4FBE143BEC6E144E145E146E147D0EFE148E149B7D3E14AE14BD4CDCCAAE14CE14DF5A2F5A1BAA8F4FECBD6E14EE14FE150F5A4C0D2E151B3EAE152CDAAF5A5F5A3BDB4F5A8E153F5A9BDCDC3B8BFE1CBE1F5AAE154E155E156F5A6F5A7C4F0E157E158E159E15AE15BF5ACE15CB4BCE15DD7EDE15EB4D7F5ABF5AEE15FE160F5ADF5AFD0D1E161E162E163E164E165E166E167C3D1C8A9E168E169E16AE16BE16CE16DF5B0F5B1E16EE16FE170E171E172E173F5B2E174E175F5B3F5B4F5B5E176E177E178E179F5B7F5B6E17AE17BE17CE17DF5B8E17EE180E181E182E183E184E185E186E187E188E189E18AB2C9E18BD3D4CACDE18CC0EFD6D8D2B0C1BFE18DBDF0E18EE18FE190E191E192E193E194E195E196E197B8AAE198E199E19AE19BE19CE19DE19EE19FE1A0E240E241E242E243E244E245E246E247E248E249E24AE24BE24CE24DE24EE24FE250E251E252E253E254E255E256E257E258E259E25AE25BE25CE25DE25EE25FE260E261E262E263E264E265E266E267E268E269E26AE26BE26CE26DE26EE26FE270E271E272E273E274E275E276E277E278E279E27AE27BE27CE27DE27EE280E281E282E283E284E285E286E287E288E289E28AE28BE28CE28DE28EE28FE290E291E292E293E294E295E296E297E298E299E29AE29BE29CE29DE29EE29FE2A0E340E341E342E343E344E345E346E347E348E349E34AE34BE34CE34DE34EE34FE350E351E352E353E354E355E356E357E358E359E35AE35BE35CE35DE35EE35FE360E361E362E363E364E365E366E367E368E369E36AE36BE36CE36DBCF8E36EE36FE370E371E372E373E374E375E376E377E378E379E37AE37BE37CE37DE37EE380E381E382E383E384E385E386E387F6C6E388E389E38AE38BE38CE38DE38EE38FE390E391E392E393E394E395E396E397E398E399E39AE39BE39CE39DE39EE39FE3A0E440E441E442E443E444E445F6C7E446E447E448E449E44AE44BE44CE44DE44EE44FE450E451E452E453E454E455E456E457E458E459E45AE45BE45CE45DE45EF6C8E45FE460E461E462E463E464E465E466E467E468E469E46AE46BE46CE46DE46EE46FE470E471E472E473E474E475E476E477E478E479E47AE47BE47CE47DE47EE480E481E482E483E484E485E486E487E488E489E48AE48BE48CE48DE48EE48FE490E491E492E493E494E495E496E497E498E499E49AE49BE49CE49DE49EE49FE4A0E540E541E542E543E544E545E546E547E548E549E54AE54BE54CE54DE54EE54FE550E551E552E553E554E555E556E557E558E559E55AE55BE55CE55DE55EE55FE560E561E562E563E564E565E566E567E568E569E56AE56BE56CE56DE56EE56FE570E571E572E573F6C9E574E575E576E577E578E579E57AE57BE57CE57DE57EE580E581E582E583E584E585E586E587E588E589E58AE58BE58CE58DE58EE58FE590E591E592E593E594E595E596E597E598E599E59AE59BE59CE59DE59EE59FF6CAE5A0E640E641E642E643E644E645E646E647E648E649E64AE64BE64CE64DE64EE64FE650E651E652E653E654E655E656E657E658E659E65AE65BE65CE65DE65EE65FE660E661E662F6CCE663E664E665E666E667E668E669E66AE66BE66CE66DE66EE66FE670E671E672E673E674E675E676E677E678E679E67AE67BE67CE67DE67EE680E681E682E683E684E685E686E687E688E689E68AE68BE68CE68DE68EE68FE690E691E692E693E694E695E696E697E698E699E69AE69BE69CE69DF6CBE69EE69FE6A0E740E741E742E743E744E745E746E747F7E9E748E749E74AE74BE74CE74DE74EE74FE750E751E752E753E754E755E756E757E758E759E75AE75BE75CE75DE75EE75FE760E761E762E763E764E765E766E767E768E769E76AE76BE76CE76DE76EE76FE770E771E772E773E774E775E776E777E778E779E77AE77BE77CE77DE77EE780E781E782E783E784E785E786E787E788E789E78AE78BE78CE78DE78EE78FE790E791E792E793E794E795E796E797E798E799E79AE79BE79CE79DE79EE79FE7A0E840E841E842E843E844E845E846E847E848E849E84AE84BE84CE84DE84EF6CDE84FE850E851E852E853E854E855E856E857E858E859E85AE85BE85CE85DE85EE85FE860E861E862E863E864E865E866E867E868E869E86AE86BE86CE86DE86EE86FE870E871E872E873E874E875E876E877E878E879E87AF6CEE87BE87CE87DE87EE880E881E882E883E884E885E886E887E888E889E88AE88BE88CE88DE88EE88FE890E891E892E893E894EEC4EEC5EEC6D5EBB6A4EEC8EEC7EEC9EECAC7A5EECBEECCE895B7B0B5F6EECDEECFE896EECEE897B8C6EED0EED1EED2B6DBB3AED6D3C4C6B1B5B8D6EED3EED4D4BFC7D5BEFBCED9B9B3EED6EED5EED8EED7C5A5EED9EEDAC7AEEEDBC7AFEEDCB2A7EEDDEEDEEEDFEEE0EEE1D7EAEEE2EEE3BCD8EEE4D3CBCCFAB2ACC1E5EEE5C7A6C3ADE898EEE6EEE7EEE8EEE9EEEAEEEBEEECE899EEEDEEEEEEEFE89AE89BEEF0EEF1EEF2EEF4EEF3E89CEEF5CDADC2C1EEF6EEF7EEF8D5A1EEF9CFB3EEFAEEFBE89DEEFCEEFDEFA1EEFEEFA2B8F5C3FAEFA3EFA4BDC2D2BFB2F9EFA5EFA6EFA7D2F8EFA8D6FDEFA9C6CCE89EEFAAEFABC1B4EFACCFFACBF8EFAEEFADB3FAB9F8EFAFEFB0D0E2EFB1EFB2B7E6D0BFEFB3EFB4EFB5C8F1CCE0EFB6EFB7EFB8EFB9EFBAD5E0EFBBB4EDC3AAEFBCE89FEFBDEFBEEFBFE8A0CEFDEFC0C2E0B4B8D7B6BDF5E940CFC7EFC3EFC1EFC2EFC4B6A7BCFCBEE2C3CCEFC5EFC6E941EFC7EFCFEFC8EFC9EFCAC7C2EFF1B6CDEFCBE942EFCCEFCDB6C6C3BEEFCEE943EFD0EFD1EFD2D5F2E944EFD3C4F7E945EFD4C4F8EFD5EFD6B8E4B0F7EFD7EFD8EFD9E946EFDAEFDBEFDCEFDDE947EFDEBEB5EFE1EFDFEFE0E948EFE2EFE3C1CDEFE4EFE5EFE6EFE7EFE8EFE9EFEAEFEBEFECC0D8E949EFEDC1ADEFEEEFEFEFF0E94AE94BCFE2E94CE94DE94EE94FE950E951E952E953B3A4E954E955E956E957E958E959E95AE95BE95CE95DE95EE95FE960E961E962E963E964E965E966E967E968E969E96AE96BE96CE96DE96EE96FE970E971E972E973E974E975E976E977E978E979E97AE97BE97CE97DE97EE980E981E982E983E984E985E986E987E988E989E98AE98BE98CE98DE98EE98FE990E991E992E993E994E995E996E997E998E999E99AE99BE99CE99DE99EE99FE9A0EA40EA41EA42EA43EA44EA45EA46EA47EA48EA49EA4AEA4BEA4CEA4DEA4EEA4FEA50EA51EA52EA53EA54EA55EA56EA57EA58EA59EA5AEA5BC3C5E3C5C9C1E3C6EA5CB1D5CECAB4B3C8F2E3C7CFD0E3C8BCE4E3C9E3CAC3C6D5A2C4D6B9EBCEC5E3CBC3F6E3CCEA5DB7A7B8F3BAD2E3CDE3CED4C4E3CFEA5EE3D0D1CBE3D1E3D2E3D3E3D4D1D6E3D5B2FBC0BBE3D6EA5FC0ABE3D7E3D8E3D9EA60E3DAE3DBEA61B8B7DAE2EA62B6D3EA63DAE4DAE3EA64EA65EA66EA67EA68EA69EA6ADAE6EA6BEA6CEA6DC8EEEA6EEA6FDAE5B7C0D1F4D2F5D5F3BDD7EA70EA71EA72EA73D7E8DAE8DAE7EA74B0A2CDD3EA75DAE9EA76B8BDBCCAC2BDC2A4B3C2DAEAEA77C2AAC4B0BDB5EA78EA79CFDEEA7AEA7BEA7CDAEBC9C2EA7DEA7EEA80EA81EA82B1DDEA83EA84EA85DAECEA86B6B8D4BAEA87B3FDEA88EA89DAEDD4C9CFD5C5E3EA8ADAEEEA8BEA8CEA8DEA8EEA8FDAEFEA90DAF0C1EACCD5CFDDEA91EA92EA93EA94EA95EA96EA97EA98EA99EA9AEA9BEA9CEA9DD3E7C2A1EA9EDAF1EA9FEAA0CBE5EB40DAF2EB41CBE6D2FEEB42EB43EB44B8F4EB45EB46DAF3B0AFCFB6EB47EB48D5CFEB49EB4AEB4BEB4CEB4DEB4EEB4FEB50EB51EB52CBEDEB53EB54EB55EB56EB57EB58EB59EB5ADAF4EB5BEB5CE3C4EB5DEB5EC1A5EB5FEB60F6BFEB61EB62F6C0F6C1C4D1EB63C8B8D1E3EB64EB65D0DBD1C5BCAFB9CDEB66EFF4EB67EB68B4C6D3BAF6C2B3FBEB69EB6AF6C3EB6BEB6CB5F1EB6DEB6EEB6FEB70EB71EB72EB73EB74EB75EB76F6C5EB77EB78EB79EB7AEB7BEB7CEB7DD3EAF6A7D1A9EB7EEB80EB81EB82F6A9EB83EB84EB85F6A8EB86EB87C1E3C0D7EB88B1A2EB89EB8AEB8BEB8CCEEDEB8DD0E8F6ABEB8EEB8FCFF6EB90F6AAD5F0F6ACC3B9EB91EB92EB93BBF4F6AEF6ADEB94EB95EB96C4DEEB97EB98C1D8EB99EB9AEB9BEB9CEB9DCBAAEB9ECFBCEB9FEBA0EC40EC41EC42EC43EC44EC45EC46EC47EC48F6AFEC49EC4AF6B0EC4BEC4CF6B1EC4DC2B6EC4EEC4FEC50EC51EC52B0D4C5F9EC53EC54EC55EC56F6B2EC57EC58EC59EC5AEC5BEC5CEC5DEC5EEC5FEC60EC61EC62EC63EC64EC65EC66EC67EC68EC69C7E0F6A6EC6AEC6BBEB8EC6CEC6DBEB2EC6EB5E5EC6FEC70B7C7EC71BFBFC3D2C3E6EC72EC73D8CCEC74EC75EC76B8EFEC77EC78EC79EC7AEC7BEC7CEC7DEC7EEC80BDF9D1A5EC81B0D0EC82EC83EC84EC85EC86F7B0EC87EC88EC89EC8AEC8BEC8CEC8DEC8EF7B1EC8FEC90EC91EC92EC93D0ACEC94B0B0EC95EC96EC97F7B2F7B3EC98F7B4EC99EC9AEC9BC7CAEC9CEC9DEC9EEC9FECA0ED40ED41BECFED42ED43F7B7ED44ED45ED46ED47ED48ED49ED4AF7B6ED4BB1DEED4CF7B5ED4DED4EF7B8ED4FF7B9ED50ED51ED52ED53ED54ED55ED56ED57ED58ED59ED5AED5BED5CED5DED5EED5FED60ED61ED62ED63ED64ED65ED66ED67ED68ED69ED6AED6BED6CED6DED6EED6FED70ED71ED72ED73ED74ED75ED76ED77ED78ED79ED7AED7BED7CED7DED7EED80ED81CEA4C8CDED82BAABE8B8E8B9E8BABEC2ED83ED84ED85ED86ED87D2F4ED88D4CFC9D8ED89ED8AED8BED8CED8DED8EED8FED90ED91ED92ED93ED94ED95ED96ED97ED98ED99ED9AED9BED9CED9DED9EED9FEDA0EE40EE41EE42EE43EE44EE45EE46EE47EE48EE49EE4AEE4BEE4CEE4DEE4EEE4FEE50EE51EE52EE53EE54EE55EE56EE57EE58EE59EE5AEE5BEE5CEE5DEE5EEE5FEE60EE61EE62EE63EE64EE65EE66EE67EE68EE69EE6AEE6BEE6CEE6DEE6EEE6FEE70EE71EE72EE73EE74EE75EE76EE77EE78EE79EE7AEE7BEE7CEE7DEE7EEE80EE81EE82EE83EE84EE85EE86EE87EE88EE89EE8AEE8BEE8CEE8DEE8EEE8FEE90EE91EE92EE93EE94EE95EE96EE97EE98EE99EE9AEE9BEE9CEE9DEE9EEE9FEEA0EF40EF41EF42EF43EF44EF45D2B3B6A5C7EAF1FCCFEECBB3D0EBE7EFCDE7B9CBB6D9F1FDB0E4CBCCF1FED4A4C2ADC1ECC6C4BEB1F2A1BCD5EF46F2A2F2A3EF47F2A4D2C3C6B5EF48CDC7F2A5EF49D3B1BFC5CCE2EF4AF2A6F2A7D1D5B6EEF2A8F2A9B5DFF2AAF2ABEF4BB2FCF2ACF2ADC8A7EF4CEF4DEF4EEF4FEF50EF51EF52EF53EF54EF55EF56EF57EF58EF59EF5AEF5BEF5CEF5DEF5EEF5FEF60EF61EF62EF63EF64EF65EF66EF67EF68EF69EF6AEF6BEF6CEF6DEF6EEF6FEF70EF71B7E7EF72EF73ECA9ECAAECABEF74ECACEF75EF76C6AEECADECAEEF77EF78EF79B7C9CAB3EF7AEF7BEF7CEF7DEF7EEF80EF81E2B8F7CFEF82EF83EF84EF85EF86EF87EF88EF89EF8AEF8BEF8CEF8DEF8EEF8FEF90EF91EF92EF93EF94EF95EF96EF97EF98EF99EF9AEF9BEF9CEF9DEF9EEF9FEFA0F040F041F042F043F044F7D0F045F046B2CDF047F048F049F04AF04BF04CF04DF04EF04FF050F051F052F053F054F055F056F057F058F059F05AF05BF05CF05DF05EF05FF060F061F062F063F7D1F064F065F066F067F068F069F06AF06BF06CF06DF06EF06FF070F071F072F073F074F075F076F077F078F079F07AF07BF07CF07DF07EF080F081F082F083F084F085F086F087F088F089F7D3F7D2F08AF08BF08CF08DF08EF08FF090F091F092F093F094F095F096E2BBF097BCA2F098E2BCE2BDE2BEE2BFE2C0E2C1B7B9D2FBBDA4CACEB1A5CBC7F099E2C2B6FCC8C4E2C3F09AF09BBDC8F09CB1FDE2C4F09DB6F6E2C5C4D9F09EF09FE2C6CFDAB9DDE2C7C0A1F0A0E2C8B2F6F140E2C9F141C1F3E2CAE2CBC2F8E2CCE2CDE2CECAD7D8B8D9E5CFE3F142F143F144F145F146F147F148F149F14AF14BF14CF0A5F14DF14EDCB0F14FF150F151F152F153F154F155F156F157F158F159F15AF15BF15CF15DF15EF15FF160F161F162F163F164F165F166F167F168F169F16AF16BF16CF16DF16EF16FF170F171F172F173F174F175F176F177F178F179F17AF17BF17CF17DF17EF180F181F182F183F184F185F186F187F188F189F18AF18BF18CF18DF18EF18FF190F191F192F193F194F195F196F197F198F199F19AF19BF19CF19DF19EF19FF1A0F240F241F242F243F244F245F246F247F248F249F24AF24BF24CF24DF24EF24FF250F251F252F253F254F255F256F257F258F259F25AF25BF25CF25DF25EF25FF260F261F262F263F264F265F266F267F268F269F26AF26BF26CF26DF26EF26FF270F271F272F273F274F275F276F277F278F279F27AF27BF27CF27DF27EF280F281F282F283F284F285F286F287F288F289F28AF28BF28CF28DF28EF28FF290F291F292F293F294F295F296F297F298F299F29AF29BF29CF29DF29EF29FF2A0F340F341F342F343F344F345F346F347F348F349F34AF34BF34CF34DF34EF34FF350F351C2EDD4A6CDD4D1B1B3DBC7FDF352B2B5C2BFE6E0CABBE6E1E6E2BED4E6E3D7A4CDD5E6E5BCDDE6E4E6E6E6E7C2EEF353BDBEE6E8C2E6BAA7E6E9F354E6EAB3D2D1E9F355F356BFA5E6EBC6EFE6ECE6EDF357F358E6EEC6ADE6EFF359C9A7E6F0E6F1E6F2E5B9E6F3E6F4C2E2E6F5E6F6D6E8E6F7F35AE6F8B9C7F35BF35CF35DF35EF35FF360F361F7BBF7BAF362F363F364F365F7BEF7BCBAA1F366F7BFF367F7C0F368F369F36AF7C2F7C1F7C4F36BF36CF7C3F36DF36EF36FF370F371F7C5F7C6F372F373F374F375F7C7F376CBE8F377F378F379F37AB8DFF37BF37CF37DF37EF380F381F7D4F382F7D5F383F384F385F386F7D6F387F388F389F38AF7D8F38BF7DAF38CF7D7F38DF38EF38FF390F391F392F393F394F395F7DBF396F7D9F397F398F399F39AF39BF39CF39DD7D7F39EF39FF3A0F440F7DCF441F442F443F444F445F446F7DDF447F448F449F7DEF44AF44BF44CF44DF44EF44FF450F451F452F453F454F7DFF455F456F457F7E0F458F459F45AF45BF45CF45DF45EF45FF460F461F462DBCBF463F464D8AAF465F466F467F468F469F46AF46BF46CE5F7B9EDF46DF46EF46FF470BFFDBBEAF7C9C6C7F7C8F471F7CAF7CCF7CBF472F473F474F7CDF475CEBAF476F7CEF477F478C4A7F479F47AF47BF47CF47DF47EF480F481F482F483F484F485F486F487F488F489F48AF48BF48CF48DF48EF48FF490F491F492F493F494F495F496F497F498F499F49AF49BF49CF49DF49EF49FF4A0F540F541F542F543F544F545F546F547F548F549F54AF54BF54CF54DF54EF54FF550F551F552F553F554F555F556F557F558F559F55AF55BF55CF55DF55EF55FF560F561F562F563F564F565F566F567F568F569F56AF56BF56CF56DF56EF56FF570F571F572F573F574F575F576F577F578F579F57AF57BF57CF57DF57EF580F581F582F583F584F585F586F587F588F589F58AF58BF58CF58DF58EF58FF590F591F592F593F594F595F596F597F598F599F59AF59BF59CF59DF59EF59FF5A0F640F641F642F643F644F645F646F647F648F649F64AF64BF64CF64DF64EF64FF650F651F652F653F654F655F656F657F658F659F65AF65BF65CF65DF65EF65FF660F661F662F663F664F665F666F667F668F669F66AF66BF66CF66DF66EF66FF670F671F672F673F674F675F676F677F678F679F67AF67BF67CF67DF67EF680F681F682F683F684F685F686F687F688F689F68AF68BF68CF68DF68EF68FF690F691F692F693F694F695F696F697F698F699F69AF69BF69CF69DF69EF69FF6A0F740F741F742F743F744F745F746F747F748F749F74AF74BF74CF74DF74EF74FF750F751F752F753F754F755F756F757F758F759F75AF75BF75CF75DF75EF75FF760F761F762F763F764F765F766F767F768F769F76AF76BF76CF76DF76EF76FF770F771F772F773F774F775F776F777F778F779F77AF77BF77CF77DF77EF780D3E3F781F782F6CFF783C2B3F6D0F784F785F6D1F6D2F6D3F6D4F786F787F6D6F788B1ABF6D7F789F6D8F6D9F6DAF78AF6DBF6DCF78BF78CF78DF78EF6DDF6DECFCAF78FF6DFF6E0F6E1F6E2F6E3F6E4C0F0F6E5F6E6F6E7F6E8F6E9F790F6EAF791F6EBF6ECF792F6EDF6EEF6EFF6F0F6F1F6F2F6F3F6F4BEA8F793F6F5F6F6F6F7F6F8F794F795F796F797F798C8FAF6F9F6FAF6FBF6FCF799F79AF6FDF6FEF7A1F7A2F7A3F7A4F7A5F79BF79CF7A6F7A7F7A8B1EEF7A9F7AAF7ABF79DF79EF7ACF7ADC1DBF7AEF79FF7A0F7AFF840F841F842F843F844F845F846F847F848F849F84AF84BF84CF84DF84EF84FF850F851F852F853F854F855F856F857F858F859F85AF85BF85CF85DF85EF85FF860F861F862F863F864F865F866F867F868F869F86AF86BF86CF86DF86EF86FF870F871F872F873F874F875F876F877F878F879F87AF87BF87CF87DF87EF880F881F882F883F884F885F886F887F888F889F88AF88BF88CF88DF88EF88FF890F891F892F893F894F895F896F897F898F899F89AF89BF89CF89DF89EF89FF8A0F940F941F942F943F944F945F946F947F948F949F94AF94BF94CF94DF94EF94FF950F951F952F953F954F955F956F957F958F959F95AF95BF95CF95DF95EF95FF960F961F962F963F964F965F966F967F968F969F96AF96BF96CF96DF96EF96FF970F971F972F973F974F975F976F977F978F979F97AF97BF97CF97DF97EF980F981F982F983F984F985F986F987F988F989F98AF98BF98CF98DF98EF98FF990F991F992F993F994F995F996F997F998F999F99AF99BF99CF99DF99EF99FF9A0FA40FA41FA42FA43FA44FA45FA46FA47FA48FA49FA4AFA4BFA4CFA4DFA4EFA4FFA50FA51FA52FA53FA54FA55FA56FA57FA58FA59FA5AFA5BFA5CFA5DFA5EFA5FFA60FA61FA62FA63FA64FA65FA66FA67FA68FA69FA6AFA6BFA6CFA6DFA6EFA6FFA70FA71FA72FA73FA74FA75FA76FA77FA78FA79FA7AFA7BFA7CFA7DFA7EFA80FA81FA82FA83FA84FA85FA86FA87FA88FA89FA8AFA8BFA8CFA8DFA8EFA8FFA90FA91FA92FA93FA94FA95FA96FA97FA98FA99FA9AFA9BFA9CFA9DFA9EFA9FFAA0FB40FB41FB42FB43FB44FB45FB46FB47FB48FB49FB4AFB4BFB4CFB4DFB4EFB4FFB50FB51FB52FB53FB54FB55FB56FB57FB58FB59FB5AFB5BC4F1F0AFBCA6F0B0C3F9FB5CC5B8D1BBFB5DF0B1F0B2F0B3F0B4F0B5D1BCFB5ED1ECFB5FF0B7F0B6D4A7FB60CDD2F0B8F0BAF0B9F0BBF0BCFB61FB62B8EBF0BDBAE8FB63F0BEF0BFBEE9F0C0B6ECF0C1F0C2F0C3F0C4C8B5F0C5F0C6FB64F0C7C5F4FB65F0C8FB66FB67FB68F0C9FB69F0CAF7BDFB6AF0CBF0CCF0CDFB6BF0CEFB6CFB6DFB6EFB6FF0CFBAD7FB70F0D0F0D1F0D2F0D3F0D4F0D5F0D6F0D8FB71FB72D3A5F0D7FB73F0D9FB74FB75FB76FB77FB78FB79FB7AFB7BFB7CFB7DF5BAC2B9FB7EFB80F7E4FB81FB82FB83FB84F7E5F7E6FB85FB86F7E7FB87FB88FB89FB8AFB8BFB8CF7E8C2B4FB8DFB8EFB8FFB90FB91FB92FB93FB94FB95F7EAFB96F7EBFB97FB98FB99FB9AFB9BFB9CC2F3FB9DFB9EFB9FFBA0FC40FC41FC42FC43FC44FC45FC46FC47FC48F4F0FC49FC4AFC4BF4EFFC4CFC4DC2E9FC4EF7E1F7E2FC4FFC50FC51FC52FC53BBC6FC54FC55FC56FC57D9E4FC58FC59FC5ACAF2C0E8F0A4FC5BBADAFC5CFC5DC7ADFC5EFC5FFC60C4ACFC61FC62F7ECF7EDF7EEFC63F7F0F7EFFC64F7F1FC65FC66F7F4FC67F7F3FC68F7F2F7F5FC69FC6AFC6BFC6CF7F6FC6DFC6EFC6FFC70FC71FC72FC73FC74FC75EDE9FC76EDEAEDEBFC77F6BCFC78FC79FC7AFC7BFC7CFC7DFC7EFC80FC81FC82FC83FC84F6BDFC85F6BEB6A6FC86D8BEFC87FC88B9C4FC89FC8AFC8BD8BBFC8CDCB1FC8DFC8EFC8FFC90FC91FC92CAF3FC93F7F7FC94FC95FC96FC97FC98FC99FC9AFC9BFC9CF7F8FC9DFC9EF7F9FC9FFCA0FD40FD41FD42FD43FD44F7FBFD45F7FAFD46B1C7FD47F7FCF7FDFD48FD49FD4AFD4BFD4CF7FEFD4DFD4EFD4FFD50FD51FD52FD53FD54FD55FD56FD57C6EBECB4FD58FD59FD5AFD5BFD5CFD5DFD5EFD5FFD60FD61FD62FD63FD64FD65FD66FD67FD68FD69FD6AFD6BFD6CFD6DFD6EFD6FFD70FD71FD72FD73FD74FD75FD76FD77FD78FD79FD7AFD7BFD7CFD7DFD7EFD80FD81FD82FD83FD84FD85B3DDF6B3FD86FD87F6B4C1E4F6B5F6B6F6B7F6B8F6B9F6BAC8A3F6BBFD88FD89FD8AFD8BFD8CFD8DFD8EFD8FFD90FD91FD92FD93C1FAB9A8EDE8FD94FD95FD96B9EAD9DFFD97FD98FD99FD9AFD9'; + + for (var i = 0; i < str.length; i++) { + var c = str.charAt(i), + code = str.charCodeAt(i); + if (c == " ") strOut += "+"; + else if (code >= 19968 && code <= 40869) { + var index = code - 19968; + strOut += "%" + z.substr(index * 4, 2) + "%" + z.substr(index * 4 + 2, 2); + } else { + strOut += "%" + str.charCodeAt(i).toString(16); + } + } + return strOut; + }, + /* 鏀瑰彉鍥剧墖澶у皬 */ + scale: function (img, w, h) { + var ow = img.width, + oh = img.height; + + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + }, + getImageData: function(){ + var _this = this, + key = $G('searchTxt').value, + type = $G('searchType').value, + keepOriginName = editor.options.keepOriginName ? "1" : "0", + url = "http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimagejson&istype=2&rn=32&fm=index&pv=&word=" + _this.encodeToGb2312(key) + type + "&keeporiginname=" + keepOriginName + "&" + +new Date; + + $G('searchListUl').innerHTML = lang.searchLoading; + ajax.request(url, { + 'dataType': 'jsonp', + 'charset': 'GB18030', + 'onsuccess':function(json){ + var list = []; + if(json && json.data) { + for(var i = 0; i < json.data.length; i++) { + if(json.data[i].objURL) { + list.push({ + title: json.data[i].fromPageTitleEnc, + src: json.data[i].objURL, + url: json.data[i].fromURL + }); + } + } + } + _this.setList(list); + }, + 'onerror':function(){ + $G('searchListUl').innerHTML = lang.searchRetry; + } + }); + }, + /* 娣诲姞鍥剧墖鍒板垪琛ㄧ晫闈笂 */ + setList: function (list) { + var i, item, p, img, link, _this = this, + listUl = $G('searchListUl'); + + listUl.innerHTML = ''; + if(list.length) { + for (i = 0; i < list.length; i++) { + item = document.createElement('li'); + p = document.createElement('p'); + img = document.createElement('img'); + link = document.createElement('a'); + + img.onload = function () { + _this.scale(this, 113, 113); + }; + img.width = 113; + img.setAttribute('src', list[i].src); + + link.href = list[i].url; + link.target = '_blank'; + link.title = list[i].title; + link.innerHTML = list[i].title; + + p.appendChild(img); + item.appendChild(p); + item.appendChild(link); + listUl.appendChild(item); + } + } else { + listUl.innerHTML = lang.searchRetry; + } + }, + getInsertList: function () { + var child, + src, + align = getAlign(), + list = [], + items = $G('searchListUl').children; + for(var i = 0; i < items.length; i++) { + child = items[i].firstChild && items[i].firstChild.firstChild; + if(child.tagName && child.tagName.toLowerCase() == 'img' && domUtils.hasClass(items[i], 'selected')) { + src = child.src; + list.push({ + src: src, + _src: src, + alt: src.substr(src.lastIndexOf('/') + 1), + floatStyle: align + }); + } + } + return list; + } + }; + +})(); diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/alignicon.jpg b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/alignicon.jpg new file mode 100644 index 00000000..754755b1 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/alignicon.jpg differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/bg.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/bg.png new file mode 100644 index 00000000..580be0a0 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/bg.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/icons.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/icons.gif new file mode 100644 index 00000000..78459dea Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/icons.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/icons.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/icons.png new file mode 100644 index 00000000..12e47001 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/icons.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/image.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/image.png new file mode 100644 index 00000000..19699f6a Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/image.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/progress.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/progress.png new file mode 100644 index 00000000..717c4865 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/progress.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/success.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/success.gif new file mode 100644 index 00000000..8d4f3112 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/success.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/success.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/success.png new file mode 100644 index 00000000..94f968dc Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/image/images/success.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/insertframe/insertframe.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/insertframe/insertframe.html new file mode 100644 index 00000000..7f1f3e9a --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/insertframe/insertframe.html @@ -0,0 +1,98 @@ + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + +
    px
    px
    + +
    +
    + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/internal.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/internal.js new file mode 100644 index 00000000..44dc17fb --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/internal.js @@ -0,0 +1,81 @@ +(function () { + var parent = window.parent; + //dialog瀵硅薄 + dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )]; + //褰撳墠鎵撳紑dialog鐨勭紪杈戝櫒瀹炰緥 + editor = dialog.editor; + + UE = parent.UE; + + domUtils = UE.dom.domUtils; + + utils = UE.utils; + + browser = UE.browser; + + ajax = UE.ajax; + + $G = function ( id ) { + return document.getElementById( id ) + }; + //focus鍏冪礌 + $focus = function ( node ) { + setTimeout( function () { + if ( browser.ie ) { + var r = node.createTextRange(); + r.collapse( false ); + r.select(); + } else { + node.focus() + } + }, 0 ) + }; + utils.loadFile(document,{ + href:editor.options.themePath + editor.options.theme + "/dialogbase.css?cache="+Math.random(), + tag:"link", + type:"text/css", + rel:"stylesheet" + }); + lang = editor.getLang(dialog.className.split( "-" )[2]); + if(lang){ + domUtils.on(window,'load',function () { + + var langImgPath = editor.options.langPath + editor.options.lang + "/images/"; + //閽堝闈欐佽祫婧 + for ( var i in lang["static"] ) { + var dom = $G( i ); + if(!dom) continue; + var tagName = dom.tagName, + content = lang["static"][i]; + if(content.src){ + //clone + content = utils.extend({},content,false); + content.src = langImgPath + content.src; + } + if(content.style){ + content = utils.extend({},content,false); + content.style = content.style.replace(/url\s*\(/g,"url(" + langImgPath) + } + switch ( tagName.toLowerCase() ) { + case "var": + dom.parentNode.replaceChild( document.createTextNode( content ), dom ); + break; + case "select": + var ops = dom.options; + for ( var j = 0, oj; oj = ops[j]; ) { + oj.innerHTML = content.options[j++]; + } + for ( var p in content ) { + p != "options" && dom.setAttribute( p, content[p] ); + } + break; + default : + domUtils.setAttributes( dom, content); + } + } + } ); + } + + +})(); + diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/link/link.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/link/link.html new file mode 100644 index 00000000..55ab4d1e --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/link/link.html @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/map/map.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/map/map.html new file mode 100644 index 00000000..e763b8eb --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/map/map.html @@ -0,0 +1,135 @@ + + + + + + + + + + +
    + + + + + + + + + +
    ::
    +
    + +
    + + + + + diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/map/show.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/map/show.html new file mode 100644 index 00000000..329cfebf --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/map/show.html @@ -0,0 +1,118 @@ + + + + + + + 鐧惧害鍦板浘API鑷畾涔夊湴鍥 + + + + + + + +
    + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/music/music.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/music/music.css new file mode 100644 index 00000000..8fb7a94c --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/music/music.css @@ -0,0 +1,30 @@ +.wrapper{margin: 5px 10px;} + +.searchBar{height:30px;padding:7px 0 3px;text-align:center;} +.searchBtn{font-size:13px;height:24px;} + +.resultBar{width:460px;margin:5px auto;border: 1px solid #CCC;border-radius: 5px;box-shadow: 2px 2px 5px #D3D6DA;overflow: hidden;} + +.listPanel{overflow: hidden;} +.panelon{display:block;} +.paneloff{display:none} + +.page{width:220px;margin:20px auto;overflow: hidden;} +.pageon{float:right;width:24px;line-height:24px;height:24px;margin-right: 5px;background: none;border: none;color: #000;font-weight: bold;text-align:center} +.pageoff{float:right;width:24px;line-height:24px;height:24px;cursor:pointer;background-color: #fff; + border: 1px solid #E7ECF0;color: #2D64B3;margin-right: 5px;text-decoration: none;text-align:center;} + +.m-box{width:460px;} +.m-m{float: left;line-height: 20px;height: 20px;} +.m-h{height:24px;line-height:24px;padding-left: 46px;background-color:#FAFAFA;border-bottom: 1px solid #DAD8D8;font-weight: bold;font-size: 12px;color: #333;} +.m-l{float:left;width:40px; } +.m-t{float:left;width:140px;} +.m-s{float:left;width:110px;} +.m-z{float:left;width:100px;} +.m-try-t{float: left;width: 60px;;} + +.m-try{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/try_music.gif') no-repeat ;} +.m-trying{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat ;} + +.loading{width:95px;height:7px;font-size:7px;margin:60px auto;background:url(http://static.tieba.baidu.com/tb/editor/images/loading.gif) no-repeat} +.empty{width:300px;height:40px;padding:2px;margin:50px auto;line-height:40px; color:#006699;text-align:center;} \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/music/music.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/music/music.html new file mode 100644 index 00000000..e7ef04f3 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/music/music.html @@ -0,0 +1,32 @@ + + + + + 鎻掑叆闊充箰 + + + + +
    + +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/music/music.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/music/music.js new file mode 100644 index 00000000..1c538bf6 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/music/music.js @@ -0,0 +1,192 @@ +function Music() { + this.init(); +} +(function () { + var pages = [], + panels = [], + selectedItem = null; + Music.prototype = { + total:70, + pageSize:10, + dataUrl:"http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common", + playerUrl:"http://box.baidu.com/widget/flash/bdspacesong.swf", + + init:function () { + var me = this; + domUtils.on($G("J_searchName"), "keyup", function (event) { + var e = window.event || event; + if (e.keyCode == 13) { + me.dosearch(); + } + }); + domUtils.on($G("J_searchBtn"), "click", function () { + me.dosearch(); + }); + }, + callback:function (data) { + var me = this; + me.data = data.song_list; + setTimeout(function () { + $G('J_resultBar').innerHTML = me._renderTemplate(data.song_list); + }, 300); + }, + dosearch:function () { + var me = this; + selectedItem = null; + var key = $G('J_searchName').value; + if (utils.trim(key) == "")return false; + key = encodeURIComponent(key); + me._sent(key); + }, + doselect:function (i) { + var me = this; + if (typeof i == 'object') { + selectedItem = i; + } else if (typeof i == 'number') { + selectedItem = me.data[i]; + } + }, + onpageclick:function (id) { + var me = this; + for (var i = 0; i < pages.length; i++) { + $G(pages[i]).className = 'pageoff'; + $G(panels[i]).className = 'paneloff'; + } + $G('page' + id).className = 'pageon'; + $G('panel' + id).className = 'panelon'; + }, + listenTest:function (elem) { + var me = this, + view = $G('J_preview'), + is_play_action = (elem.className == 'm-try'), + old_trying = me._getTryingElem(); + + if (old_trying) { + old_trying.className = 'm-try'; + view.innerHTML = ''; + } + if (is_play_action) { + elem.className = 'm-trying'; + view.innerHTML = me._buildMusicHtml(me._getUrl(true)); + } + }, + _sent:function (param) { + var me = this; + $G('J_resultBar').innerHTML = '
    '; + + utils.loadFile(document, { + src:me.dataUrl + '&query=' + param + '&page_size=' + me.total + '&callback=music.callback&.r=' + Math.random(), + tag:"script", + type:"text/javascript", + defer:"defer" + }); + }, + _removeHtml:function (str) { + var reg = /<\s*\/?\s*[^>]*\s*>/gi; + return str.replace(reg, ""); + }, + _getUrl:function (isTryListen) { + var me = this; + var param = 'from=tiebasongwidget&url=&name=' + encodeURIComponent(me._removeHtml(selectedItem.title)) + '&artist=' + + encodeURIComponent(me._removeHtml(selectedItem.author)) + '&extra=' + + encodeURIComponent(me._removeHtml(selectedItem.album_title)) + + '&autoPlay='+isTryListen+'' + '&loop=true'; + return me.playerUrl + "?" + param; + }, + _getTryingElem:function () { + var s = $G('J_listPanel').getElementsByTagName('span'); + + for (var i = 0; i < s.length; i++) { + if (s[i].className == 'm-trying') + return s[i]; + } + return null; + }, + _buildMusicHtml:function (playerUrl) { + var html = ' 12) + return s.substring(0, 5) + '...'; + if (!s) s = " "; + return s; + }, + _rebuildData:function (data) { + var me = this, + newData = [], + d = me.pageSize, + itembox; + for (var i = 0; i < data.length; i++) { + if ((i + d) % d == 0) { + itembox = []; + newData.push(itembox) + } + itembox.push(data[i]); + } + return newData; + }, + _renderTemplate:function (data) { + var me = this; + if (data.length == 0)return '
    ' + lang.emptyTxt + '
    '; + data = me._rebuildData(data); + var s = [], p = [], t = []; + s.push('
    '); + p.push('
    '); + for (var i = 0, tmpList; tmpList = data[i++];) { + panels.push('panel' + i); + pages.push('page' + i); + if (i == 1) { + s.push('
    '); + if (data.length != 1) { + t.push('
    ' + (i ) + '
    '); + } + } else { + s.push('
    '); + t.push('
    ' + (i ) + '
    '); + } + s.push('
    '); + s.push('
    ' + lang.chapter + '' + lang.singer + + '' + lang.special + '' + lang.listenTest + '
    '); + for (var j = 0, tmpObj; tmpObj = tmpList[j++];) { + s.push(''); + } + s.push('
    '); + s.push('
    '); + } + t.reverse(); + p.push(t.join('')); + s.push('
    '); + p.push('
    '); + return s.join('') + p.join(''); + }, + exec:function () { + var me = this; + if (selectedItem == null) return; + $G('J_preview').innerHTML = ""; + editor.execCommand('music', { + url:me._getUrl(false), + width:400, + height:95 + }); + } + }; +})(); + + + diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/preview/preview.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/preview/preview.html new file mode 100644 index 00000000..f6b433bc --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/preview/preview.html @@ -0,0 +1,40 @@ + + + + + + + + + + +
    + +
    + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/addimg.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/addimg.png new file mode 100644 index 00000000..03a87135 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/addimg.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/brush.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/brush.png new file mode 100644 index 00000000..efa6fdb0 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/brush.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/delimg.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/delimg.png new file mode 100644 index 00000000..5a892e40 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/delimg.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/delimgH.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/delimgH.png new file mode 100644 index 00000000..2f0c5c9d Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/delimgH.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/empty.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/empty.png new file mode 100644 index 00000000..03751962 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/empty.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/emptyH.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/emptyH.png new file mode 100644 index 00000000..838ca723 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/emptyH.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/eraser.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/eraser.png new file mode 100644 index 00000000..63e87cec Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/eraser.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/redo.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/redo.png new file mode 100644 index 00000000..12cd9bbe Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/redo.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/redoH.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/redoH.png new file mode 100644 index 00000000..d9f33d38 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/redoH.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/scale.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/scale.png new file mode 100644 index 00000000..935a3f3e Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/scale.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/scaleH.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/scaleH.png new file mode 100644 index 00000000..72e64a9d Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/scaleH.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/size.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/size.png new file mode 100644 index 00000000..83668450 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/size.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/undo.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/undo.png new file mode 100644 index 00000000..084c7cc7 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/undo.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/undoH.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/undoH.png new file mode 100644 index 00000000..fde7eb3c Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/images/undoH.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/scrawl.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/scrawl.css new file mode 100644 index 00000000..b18430dc --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/scrawl.css @@ -0,0 +1,72 @@ +/*common +*/ +body{margin: 0;} +table{width:100%;} +table td{padding:2px 4px;vertical-align: middle;} +a{text-decoration: none;} +em{font-style: normal;} +.border_style1{border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;} +/*module +*/ +.main{margin: 8px;overflow: hidden;} + +.hot{float:left;height:335px;} +.drawBoard{position: relative; cursor: crosshair;} +.brushBorad{position: absolute;left:0;top:0;z-index: 998;} +.picBoard{border: none;text-align: center;line-height: 300px;cursor: default;} +.operateBar{margin-top:10px;font-size:12px;text-align: center;} +.operateBar span{margin-left: 10px;} + +.drawToolbar{float:right;width:110px;height:300px;overflow: hidden;} +.colorBar{margin-top:10px;font-size: 12px;text-align: center;} +.colorBar a{display:block;width: 10px;height: 10px;border:1px solid #1006F1;border-radius: 3px; box-shadow:2px 2px 5px #d3d6da;opacity: 0.3} +.sectionBar{margin-top:15px;font-size: 12px;text-align: center;} +.sectionBar a{display:inline-block;width:10px;height:12px;color: #888;text-indent: -999px;opacity: 0.3} +.size1{background: url('images/size.png') 1px center no-repeat ;} +.size2{background: url('images/size.png') -10px center no-repeat;} +.size3{background: url('images/size.png') -22px center no-repeat;} +.size4{background: url('images/size.png') -35px center no-repeat;} + +.addImgH{position: relative;} +.addImgH_form{position: absolute;left: 18px;top: -1px;width: 75px;height: 21px;opacity: 0;cursor: pointer;} +.addImgH_form input{width: 100%;} +/*scrawl閬僵灞 +*/ +.maskLayerNull{display: none;} +.maskLayer{position: absolute;top:0;left:0;width: 100%; height: 100%;opacity: 0.7; + background-color: #fff;text-align:center;font-weight:bold;line-height:300px;z-index: 1000;} +/*btn state +*/ +.previousStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undoH.png');cursor: pointer;} +.previousStepH .text{color:#888;cursor:pointer;} +.previousStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undo.png');cursor:default;} +.previousStep .text{color:#ccc;cursor:default;} + +.nextStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redoH.png');cursor: pointer;} +.nextStepH .text{color:#888;cursor:pointer;} +.nextStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redo.png');cursor:default;} +.nextStep .text{color:#ccc;cursor:default;} + +.clearBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/emptyH.png');cursor: pointer;} +.clearBoardH .text{color:#888;cursor:pointer;} +.clearBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/empty.png');cursor:default;} +.clearBoard .text{color:#ccc;cursor:default;} + +.scaleBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scaleH.png');cursor: pointer;} +.scaleBoardH .text{color:#888;cursor:pointer;} +.scaleBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scale.png');cursor:default;} +.scaleBoard .text{color:#ccc;cursor:default;} + +.removeImgH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimgH.png');cursor: pointer;} +.removeImgH .text{color:#888;cursor:pointer;} +.removeImg .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimg.png');cursor:default;} +.removeImg .text{color:#ccc;cursor:default;} + +.addImgH .icon{vertical-align:top;display: inline-block;width:16px;height:16px;background-image: url('images/addimg.png')} +.addImgH .text{color:#888;cursor:pointer;} +/*icon +*/ +.brushIcon{display: inline-block;width:16px;height:16px;background-image: url('images/brush.png')} +.eraserIcon{display: inline-block;width:16px;height:16px;background-image: url('images/eraser.png')} + + diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/scrawl.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/scrawl.html new file mode 100644 index 00000000..9371abd7 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/scrawl.html @@ -0,0 +1,95 @@ + + + + + + + + + + +
    +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + 1 + 3 + 5 + 7 +
    +
    + + 1 + 3 + 5 + 7 +
    +
    +
    + + +
    + +
    + +
    +
    +
    + + + + +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/scrawl.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/scrawl.js new file mode 100644 index 00000000..e0c005e7 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/scrawl/scrawl.js @@ -0,0 +1,671 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-5-22 + * Time: 涓婂崍11:38 + * To change this template use File | Settings | File Templates. + */ +var scrawl = function (options) { + options && this.initOptions(options); +}; +(function () { + var canvas = $G("J_brushBoard"), + context = canvas.getContext('2d'), + drawStep = [], //undo redo瀛樺偍 + drawStepIndex = 0; //undo redo鎸囬拡 + + scrawl.prototype = { + isScrawl:false, //鏄惁娑傞甫 + brushWidth:-1, //鐢荤瑪绮楃粏 + brushColor:"", //鐢荤瑪棰滆壊 + + initOptions:function (options) { + var me = this; + me.originalState(options);//鍒濆椤甸潰鐘舵 + me._buildToolbarColor(options.colorList);//鍔ㄦ佺敓鎴愰鑹查夋嫨闆嗗悎 + + me._addBoardListener(options.saveNum);//娣诲姞鐢绘澘澶勭悊 + me._addOPerateListener(options.saveNum);//娣诲姞undo redo clearBoard澶勭悊 + me._addColorBarListener();//娣诲姞棰滆壊閫夋嫨澶勭悊 + me._addBrushBarListener();//娣诲姞鐢荤瑪澶у皬澶勭悊 + me._addEraserBarListener();//娣诲姞姗$毊澶у皬澶勭悊 + me._addAddImgListener();//娣诲姞澧炴坊鑳屾櫙鍥剧墖澶勭悊 + me._addRemoveImgListenter();//鍒犻櫎鑳屾櫙鍥剧墖澶勭悊 + me._addScalePicListenter();//娣诲姞缂╂斁澶勭悊 + me._addClearSelectionListenter();//娣诲姞娓呮閫変腑鐘舵佸鐞 + + me._originalColorSelect(options.drawBrushColor);//鍒濆鍖栭鑹查変腑 + me._originalBrushSelect(options.drawBrushSize);//鍒濆鍖栫敾绗旈変腑 + me._clearSelection();//娓呮閫変腑鐘舵 + }, + + originalState:function (options) { + var me = this; + + me.brushWidth = options.drawBrushSize;//鍚屾鐢荤瑪绮楃粏 + me.brushColor = options.drawBrushColor;//鍚屾鐢荤瑪棰滆壊 + + context.lineWidth = me.brushWidth;//鍒濆鐢荤瑪澶у皬 + context.strokeStyle = me.brushColor;//鍒濆鐢荤瑪棰滆壊 + context.fillStyle = "transparent";//鍒濆鐢诲竷鑳屾櫙棰滆壊 + context.lineCap = "round";//鍘婚櫎閿娇 + context.fill(); + }, + _buildToolbarColor:function (colorList) { + var tmp = null, arr = []; + arr.push(""); + for (var i = 0, color; color = colorList[i++];) { + if ((i - 1) % 5 == 0) { + if (i != 1) { + arr.push(""); + } + arr.push(""); + } + tmp = '#' + color; + arr.push(""); + } + arr.push("
    "); + $G("J_colorBar").innerHTML = arr.join(""); + }, + + _addBoardListener:function (saveNum) { + var me = this, + margin = 0, + startX = -1, + startY = -1, + isMouseDown = false, + isMouseMove = false, + isMouseUp = false, + buttonPress = 0, button, flag = ''; + + margin = parseInt(domUtils.getComputedStyle($G("J_wrap"), "margin-left")); + drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height)); + drawStepIndex += 1; + + domUtils.on(canvas, ["mousedown", "mousemove", "mouseup", "mouseout"], function (e) { + button = browser.webkit ? e.which : buttonPress; + switch (e.type) { + case 'mousedown': + buttonPress = 1; + flag = 1; + isMouseDown = true; + isMouseUp = false; + isMouseMove = false; + me.isScrawl = true; + startX = e.clientX - margin;//10涓哄杈硅窛鎬诲拰 + startY = e.clientY - margin; + context.beginPath(); + break; + case 'mousemove' : + if (!flag && button == 0) { + return; + } + if (!flag && button) { + startX = e.clientX - margin;//10涓哄杈硅窛鎬诲拰 + startY = e.clientY - margin; + context.beginPath(); + flag = 1; + } + if (isMouseUp || !isMouseDown) { + return; + } + var endX = e.clientX - margin, + endY = e.clientY - margin; + + context.moveTo(startX, startY); + context.lineTo(endX, endY); + context.stroke(); + startX = endX; + startY = endY; + isMouseMove = true; + break; + case 'mouseup': + buttonPress = 0; + if (!isMouseDown)return; + if (!isMouseMove) { + context.arc(startX, startY, context.lineWidth, 0, Math.PI * 2, false); + context.fillStyle = context.strokeStyle; + context.fill(); + } + context.closePath(); + me._saveOPerate(saveNum); + isMouseDown = false; + isMouseMove = false; + isMouseUp = true; + startX = -1; + startY = -1; + break; + case 'mouseout': + flag = ''; + buttonPress = 0; + if (button == 1) return; + context.closePath(); + break; + } + }); + }, + _addOPerateListener:function (saveNum) { + var me = this; + domUtils.on($G("J_previousStep"), "click", function () { + if (drawStepIndex > 1) { + drawStepIndex -= 1; + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + context.putImageData(drawStep[drawStepIndex - 1], 0, 0); + me.btn2Highlight("J_nextStep"); + drawStepIndex == 1 && me.btn2disable("J_previousStep"); + } + }); + domUtils.on($G("J_nextStep"), "click", function () { + if (drawStepIndex > 0 && drawStepIndex < drawStep.length) { + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + context.putImageData(drawStep[drawStepIndex], 0, 0); + drawStepIndex += 1; + me.btn2Highlight("J_previousStep"); + drawStepIndex == drawStep.length && me.btn2disable("J_nextStep"); + } + }); + domUtils.on($G("J_clearBoard"), "click", function () { + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + drawStep = []; + me._saveOPerate(saveNum); + drawStepIndex = 1; + me.isScrawl = false; + me.btn2disable("J_previousStep"); + me.btn2disable("J_nextStep"); + me.btn2disable("J_clearBoard"); + }); + }, + _addColorBarListener:function () { + var me = this; + domUtils.on($G("J_colorBar"), "click", function (e) { + var target = me.getTarget(e), + color = target.title; + if (!!color) { + me._addColorSelect(target); + + me.brushColor = color; + context.globalCompositeOperation = "source-over"; + context.lineWidth = me.brushWidth; + context.strokeStyle = color; + } + }); + }, + _addBrushBarListener:function () { + var me = this; + domUtils.on($G("J_brushBar"), "click", function (e) { + var target = me.getTarget(e), + size = browser.ie ? target.innerText : target.text; + if (!!size) { + me._addBESelect(target); + + context.globalCompositeOperation = "source-over"; + context.lineWidth = parseInt(size); + context.strokeStyle = me.brushColor; + me.brushWidth = context.lineWidth; + } + }); + }, + _addEraserBarListener:function () { + var me = this; + domUtils.on($G("J_eraserBar"), "click", function (e) { + var target = me.getTarget(e), + size = browser.ie ? target.innerText : target.text; + if (!!size) { + me._addBESelect(target); + + context.lineWidth = parseInt(size); + context.globalCompositeOperation = "destination-out"; + context.strokeStyle = "#FFF"; + } + }); + }, + _addAddImgListener:function () { + var file = $G("J_imgTxt"); + if (!window.FileReader) { + $G("J_addImg").style.display = 'none'; + $G("J_removeImg").style.display = 'none'; + $G("J_sacleBoard").style.display = 'none'; + } + domUtils.on(file, "change", function (e) { + var frm = file.parentNode; + addMaskLayer(lang.backgroundUploading); + + var target = e.target || e.srcElement, + reader = new FileReader(); + reader.onload = function(evt){ + var target = evt.target || evt.srcElement; + ue_callback(target.result, 'SUCCESS'); + }; + reader.readAsDataURL(target.files[0]); + frm.reset(); + }); + }, + _addRemoveImgListenter:function () { + var me = this; + domUtils.on($G("J_removeImg"), "click", function () { + $G("J_picBoard").innerHTML = ""; + me.btn2disable("J_removeImg"); + me.btn2disable("J_sacleBoard"); + }); + }, + _addScalePicListenter:function () { + domUtils.on($G("J_sacleBoard"), "click", function () { + var picBoard = $G("J_picBoard"), + scaleCon = $G("J_scaleCon"), + img = picBoard.children[0]; + + if (img) { + if (!scaleCon) { + picBoard.style.cssText = "position:relative;z-index:999;"+picBoard.style.cssText; + img.style.cssText = "position: absolute;top:" + (canvas.height - img.height) / 2 + "px;left:" + (canvas.width - img.width) / 2 + "px;"; + var scale = new ScaleBoy(); + picBoard.appendChild(scale.init()); + scale.startScale(img); + } else { + if (scaleCon.style.visibility == "visible") { + scaleCon.style.visibility = "hidden"; + picBoard.style.position = ""; + picBoard.style.zIndex = ""; + } else { + scaleCon.style.visibility = "visible"; + picBoard.style.cssText += "position:relative;z-index:999"; + } + } + } + }); + }, + _addClearSelectionListenter:function () { + var doc = document; + domUtils.on(doc, 'mousemove', function (e) { + if (browser.ie && browser.version < 11) + doc.selection.clear(); + else + window.getSelection().removeAllRanges(); + }); + }, + _clearSelection:function () { + var list = ["J_operateBar", "J_colorBar", "J_brushBar", "J_eraserBar", "J_picBoard"]; + for (var i = 0, group; group = list[i++];) { + domUtils.unSelectable($G(group)); + } + }, + + _saveOPerate:function (saveNum) { + var me = this; + if (drawStep.length <= saveNum) { + if(drawStepIndex"); + } + scale.innerHTML = arr.join(""); + return scale; + } + + var rect = [ + //[left, top, width, height] + [1, 1, -1, -1], + [0, 1, 0, -1], + [0, 1, 1, -1], + [1, 0, -1, 0], + [0, 0, 1, 0], + [1, 0, -1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1] + ]; + ScaleBoy.prototype = { + init:function () { + _appendStyle(); + var me = this, + scale = me.dom = _getDom(); + + me.scaleMousemove.fp = me; + domUtils.on(scale, 'mousedown', function (e) { + var target = e.target || e.srcElement; + me.start = {x:e.clientX, y:e.clientY}; + if (target.className.indexOf('hand') != -1) { + me.dir = target.className.replace('hand', ''); + } + domUtils.on(document.body, 'mousemove', me.scaleMousemove); + e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true; + }); + domUtils.on(document.body, 'mouseup', function (e) { + if (me.start) { + domUtils.un(document.body, 'mousemove', me.scaleMousemove); + if (me.moved) { + me.updateScaledElement({position:{x:scale.style.left, y:scale.style.top}, size:{w:scale.style.width, h:scale.style.height}}); + } + delete me.start; + delete me.moved; + delete me.dir; + } + }); + return scale; + }, + startScale:function (objElement) { + var me = this, Idom = me.dom; + + Idom.style.cssText = 'visibility:visible;top:' + objElement.style.top + ';left:' + objElement.style.left + ';width:' + objElement.offsetWidth + 'px;height:' + objElement.offsetHeight + 'px;'; + me.scalingElement = objElement; + }, + updateScaledElement:function (objStyle) { + var cur = this.scalingElement, + pos = objStyle.position, + size = objStyle.size; + if (pos) { + typeof pos.x != 'undefined' && (cur.style.left = pos.x); + typeof pos.y != 'undefined' && (cur.style.top = pos.y); + } + if (size) { + size.w && (cur.style.width = size.w); + size.h && (cur.style.height = size.h); + } + }, + updateStyleByDir:function (dir, offset) { + var me = this, + dom = me.dom, tmp; + + rect['def'] = [1, 1, 0, 0]; + if (rect[dir][0] != 0) { + tmp = parseInt(dom.style.left) + offset.x; + dom.style.left = me._validScaledProp('left', tmp) + 'px'; + } + if (rect[dir][1] != 0) { + tmp = parseInt(dom.style.top) + offset.y; + dom.style.top = me._validScaledProp('top', tmp) + 'px'; + } + if (rect[dir][2] != 0) { + tmp = dom.clientWidth + rect[dir][2] * offset.x; + dom.style.width = me._validScaledProp('width', tmp) + 'px'; + } + if (rect[dir][3] != 0) { + tmp = dom.clientHeight + rect[dir][3] * offset.y; + dom.style.height = me._validScaledProp('height', tmp) + 'px'; + } + if (dir === 'def') { + me.updateScaledElement({position:{x:dom.style.left, y:dom.style.top}}); + } + }, + scaleMousemove:function (e) { + var me = arguments.callee.fp, + start = me.start, + dir = me.dir || 'def', + offset = {x:e.clientX - start.x, y:e.clientY - start.y}; + + me.updateStyleByDir(dir, offset); + arguments.callee.fp.start = {x:e.clientX, y:e.clientY}; + arguments.callee.fp.moved = 1; + }, + _validScaledProp:function (prop, value) { + var ele = this.dom, + wrap = $G("J_picBoard"); + + value = isNaN(value) ? 0 : value; + switch (prop) { + case 'left': + return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value; + case 'top': + return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value; + case 'width': + return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value; + case 'height': + return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value; + } + } + }; +})(); + +//鍚庡彴鍥炶皟 +function ue_callback(url, state) { + var doc = document, + picBorard = $G("J_picBoard"), + img = doc.createElement("img"); + + //鍥剧墖缂╂斁 + function scale(img, max, oWidth, oHeight) { + var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight; + if (ow > max || oh > max) { + if (ow >= oh) { + if (width = ow - max) { + percent = (width / ow).toFixed(2); + img.height = oh - oh * percent; + img.width = max; + } + } else { + if (height = oh - max) { + percent = (height / oh).toFixed(2); + img.width = ow - ow * percent; + img.height = max; + } + } + } + } + + //绉婚櫎閬僵灞 + removeMaskLayer(); + //鐘舵佸搷搴 + if (state == "SUCCESS") { + picBorard.innerHTML = ""; + img.onload = function () { + scale(this, 300); + picBorard.appendChild(img); + + var obj = new scrawl(); + obj.btn2Highlight("J_removeImg"); + //trace 2457 + obj.btn2Highlight("J_sacleBoard"); + }; + img.src = url; + } else { + alert(state); + } +} +//鍘绘帀閬僵灞 +function removeMaskLayer() { + var maskLayer = $G("J_maskLayer"); + maskLayer.className = "maskLayerNull"; + maskLayer.innerHTML = ""; + dialog.buttons[0].setDisabled(false); +} +//娣诲姞閬僵灞 +function addMaskLayer(html) { + var maskLayer = $G("J_maskLayer"); + dialog.buttons[0].setDisabled(true); + maskLayer.className = "maskLayer"; + maskLayer.innerHTML = html; +} +//鎵ц纭鎸夐挳鏂规硶 +function exec(scrawlObj) { + if (scrawlObj.isScrawl) { + addMaskLayer(lang.scrawlUpLoading); + var base64 = scrawlObj.getCanvasData(); + if (!!base64) { + var options = { + timeout:100000, + onsuccess:function (xhr) { + if (!scrawlObj.isCancelScrawl) { + var responseObj; + responseObj = eval("(" + xhr.responseText + ")"); + if (responseObj.state == "SUCCESS") { + var imgObj = {}, + url = editor.options.scrawlUrlPrefix + responseObj.url; + imgObj.src = url; + imgObj._src = url; + imgObj.alt = responseObj.original || ''; + imgObj.title = responseObj.title || ''; + editor.execCommand("insertImage", imgObj); + dialog.close(); + } else { + alert(responseObj.state); + } + + } + }, + onerror:function () { + alert(lang.imageError); + dialog.close(); + } + }; + options[editor.getOpt('scrawlFieldName')] = base64; + + var actionUrl = editor.getActionUrl(editor.getOpt('scrawlActionName')), + params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params); + ajax.request(url, options); + } + } else { + addMaskLayer(lang.noScarwl + "   "); + } +} + diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/searchreplace/searchreplace.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/searchreplace/searchreplace.html new file mode 100644 index 00000000..b91f1901 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/searchreplace/searchreplace.html @@ -0,0 +1,102 @@ + + + + + + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    :
    + +
    + + +
    +   +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    :
    :
    + +
    + + + + +
    +   +
    + +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/searchreplace/searchreplace.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/searchreplace/searchreplace.js new file mode 100644 index 00000000..1b528573 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/searchreplace/searchreplace.js @@ -0,0 +1,164 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 涓嬪崍12:29 + * To change this template use File | Settings | File Templates. + */ + +//娓呯┖涓婃鏌ラ夌殑鐥曡抗 +editor.firstForSR = 0; +editor.currentRangeForSR = null; +//缁檛ab娉ㄥ唽鍒囨崲浜嬩欢 +/** + * tab鐐瑰嚮澶勭悊浜嬩欢 + * @param tabHeads + * @param tabBodys + * @param obj + */ +function clickHandler( tabHeads,tabBodys,obj ) { + //head鏍峰紡鏇存敼 + for ( var k = 0, len = tabHeads.length; k < len; k++ ) { + tabHeads[k].className = ""; + } + obj.className = "focus"; + //body鏄鹃殣 + var tabSrc = obj.getAttribute( "tabSrc" ); + for ( var j = 0, length = tabBodys.length; j < length; j++ ) { + var body = tabBodys[j], + id = body.getAttribute( "id" ); + if ( id != tabSrc ) { + body.style.zIndex = 1; + } else { + body.style.zIndex = 200; + } + } + +} + +/** + * TAB鍒囨崲 + * @param tabParentId tab鐨勭埗鑺傜偣ID鎴栬呭璞℃湰韬 + */ +function switchTab( tabParentId ) { + var tabElements = $G( tabParentId ).children, + tabHeads = tabElements[0].children, + tabBodys = tabElements[1].children; + + for ( var i = 0, length = tabHeads.length; i < length; i++ ) { + var head = tabHeads[i]; + if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); + head.onclick = function () { + clickHandler(tabHeads,tabBodys,this); + } + } +} +$G('searchtab').onmousedown = function(){ + $G('search-msg').innerHTML = ''; + $G('replace-msg').innerHTML = '' +} +//鏄惁鍖哄垎澶у皬鍐 +function getMatchCase(id) { + return $G(id).checked ? true : false; +} +//鏌ユ壘 +$G("nextFindBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:1, + casesensitive:getMatchCase("matchCase") + }; + if (!frCommond(obj)) { + var bk = editor.selection.getRange().createBookmark(); + $G('search-msg').innerHTML = lang.getEnd; + editor.selection.getRange().moveToBookmark(bk).select(); + + + } +}; +$G("nextReplaceBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt1").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:1, + casesensitive:getMatchCase("matchCase1") + }; + frCommond(obj); +}; +$G("preFindBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:-1, + casesensitive:getMatchCase("matchCase") + }; + if (!frCommond(obj)) { + $G('search-msg').innerHTML = lang.getStart; + } +}; +$G("preReplaceBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt1").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:-1, + casesensitive:getMatchCase("matchCase1") + }; + frCommond(obj); +}; +//鏇挎崲 +$G("repalceBtn").onclick = function () { + var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, + replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); + if (!findtxt) { + return false; + } + if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { + return false; + } + obj = { + searchStr:findtxt, + dir:1, + casesensitive:getMatchCase("matchCase1"), + replaceStr:replacetxt + }; + frCommond(obj); +}; +//鍏ㄩ儴鏇挎崲 +$G("repalceAllBtn").onclick = function () { + var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, + replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); + if (!findtxt) { + return false; + } + if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { + return false; + } + obj = { + searchStr:findtxt, + casesensitive:getMatchCase("matchCase1"), + replaceStr:replacetxt, + all:true + }; + var num = frCommond(obj); + if (num) { + $G('replace-msg').innerHTML = lang.countMsg.replace("{#count}", num); + } +}; +//鎵ц +var frCommond = function (obj) { + return editor.execCommand("searchreplace", obj); +}; +switchTab("searchtab"); \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/snapscreen/snapscreen.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/snapscreen/snapscreen.html new file mode 100644 index 00000000..cf8209ee --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/snapscreen/snapscreen.html @@ -0,0 +1,58 @@ + + + + + + + + + +
    +

    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/spechars/spechars.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/spechars/spechars.html new file mode 100644 index 00000000..0b5c416f --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/spechars/spechars.html @@ -0,0 +1,21 @@ + + + + + + + + + +
    +
    +
    + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/spechars/spechars.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/spechars/spechars.js new file mode 100644 index 00000000..f4c155e1 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/spechars/spechars.js @@ -0,0 +1,57 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 涓嬪崍1:09 + * To change this template use File | Settings | File Templates. + */ +var charsContent = [ + { name:"tsfh", title:lang.tsfh, content:toArray("銆,銆,路,藟,藝,篓,銆,銆,鈥,锝,鈥,鈥,鈥,鈥,鈥,鈥,銆,銆,銆,銆,銆,銆,銆,銆,銆,銆,銆,銆,銆,銆,卤,脳,梅,鈭,鈭,鈭,鈭,鈭,鈭,鈭,鈭,鈭,鈭,鈯,鈭,鈭,鈱,鈯,鈭,鈭,鈮,鈮,鈮,鈭,鈭,鈮,鈮,鈮,鈮,鈮,鈭,鈭,鈭,鈾,鈾,掳,鈥,鈥,鈩,锛,陇,锟,锟,鈥,搂,鈩,鈽,鈽,鈼,鈼,鈼,鈼,鈼,鈻,鈻,鈻,鈻,鈥,鈫,鈫,鈫,鈫,銆,銆,銆,銆,銆,銆,銆,銆,銆,銆,銑,銕,銕,銕,銕,銕,銕,銖,銖,銖,銖,銖,锔,锟,锟,鈩,藠,藡,藱,鈥,鈥,鈥,鈥,鈩,鈩,鈫,鈫,鈫,鈫,鈭,鈭,鈭,鈮,鈮,鈮,鈯,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈺,鈻,鈻,鈻,鈻,鈻,鈻,鈻,锟,鈻,鈻,鈻,鈻,鈻,鈻,鈻,鈻,鈻,鈻,鈻,鈻,鈻,鈼,鈼,鈼,鈼,鈽,鈯,銆,銆,銆")}, + { name:"lmsz", title:lang.lmsz, content:toArray("鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪,鈪")}, + { name:"szfh", title:lang.szfh, content:toArray("鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈶,鈶,鈶,鈶,鈶,鈶,鈶,鈶,鈶,鈶,鈶,鈶,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈷,鈶,鈶,鈶,鈶,鈶,鈶,鈶,鈶,鈶,鈶,銏,銏,銏,銏,銏,銏,銏,銏,銏,銏")}, + { name:"rwfh", title:lang.rwfh, content:toArray("銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銇,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銈,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉,銉")}, + { name:"xlzm", title:lang.xlzm, content:toArray("螒,螔,螕,螖,螘,螙,螚,螛,螜,螝,螞,螠,螡,螢,螣,螤,巍,危,韦,违,桅,围,唯,惟,伪,尾,纬,未,蔚,味,畏,胃,喂,魏,位,渭,谓,尉,慰,蟺,蟻,蟽,蟿,蠀,蠁,蠂,蠄,蠅")}, + { name:"ewzm", title:lang.ewzm, content:toArray("袗,袘,袙,袚,袛,袝,衼,袞,袟,袠,袡,袣,袥,袦,袧,袨,袩,袪,小,孝,校,肖,啸,笑,效,楔,些,歇,蝎,鞋,协,挟,携,邪,斜,胁,谐,写,械,褢,卸,蟹,懈,泄,泻,谢,屑,薪,芯,锌,褉,褋,褌,褍,褎,褏,褑,褔,褕,褖,褗,褘,褜,褝,褞,褟")}, + { name:"pyzm", title:lang.pyzm, content:toArray("膩,谩,菐,脿,膿,茅,臎,猫,墨,铆,菒,矛,艒,贸,菕,貌,奴,煤,菙,霉,菛,菢,菤,菧,眉")}, + { name:"yyyb", title:lang.yyyb, content:toArray("i:,i,e,忙,蕦,蓹:,蓹,u:,u,蓴:,蓴,a:,ei,ai,蓴i,蓹u,au,i蓹,蔚蓹,u蓹,p,t,k,b,d,g,f,s,蕛,胃,h,v,z,蕭,冒,t蕛,tr,ts,d蕭,dr,dz,m,n,艐,l,r,w,j,")}, + { name:"zyzf", title:lang.zyzf, content:toArray("銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊,銊")} +]; +(function createTab(content) { + for (var i = 0, ci; ci = content[i++];) { + var span = document.createElement("span"); + span.setAttribute("tabSrc", ci.name); + span.innerHTML = ci.title; + if (i == 1)span.className = "focus"; + domUtils.on(span, "click", function () { + var tmps = $G("tabHeads").children; + for (var k = 0, sk; sk = tmps[k++];) { + sk.className = ""; + } + tmps = $G("tabBodys").children; + for (var k = 0, sk; sk = tmps[k++];) { + sk.style.display = "none"; + } + this.className = "focus"; + $G(this.getAttribute("tabSrc")).style.display = ""; + }); + $G("tabHeads").appendChild(span); + domUtils.insertAfter(span, document.createTextNode("\n")); + var div = document.createElement("div"); + div.id = ci.name; + div.style.display = (i == 1) ? "" : "none"; + var cons = ci.content; + for (var j = 0, con; con = cons[j++];) { + var charSpan = document.createElement("span"); + charSpan.innerHTML = con; + domUtils.on(charSpan, "click", function () { + editor.execCommand("insertHTML", this.innerHTML); + dialog.close(); + }); + div.appendChild(charSpan); + } + $G("tabBodys").appendChild(div); + } +})(charsContent); +function toArray(str) { + return str.split(","); +} diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/dragicon.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/dragicon.png new file mode 100644 index 00000000..f26203bf Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/dragicon.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittable.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittable.css new file mode 100644 index 00000000..c6f9396c --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittable.css @@ -0,0 +1,84 @@ +body{ + overflow: hidden; + width: 540px; +} +.wrapper { + margin: 10px auto 0; + font-size: 12px; + overflow: hidden; + width: 520px; + height: 315px; +} + +.clear { + clear: both; +} + +.wrapper .left { + float: left; + margin-left: 10px;; +} + +.wrapper .right { + float: right; + border-left: 2px dotted #EDEDED; + padding-left: 15px; +} + +.section { + margin-bottom: 15px; + width: 240px; + overflow: hidden; +} + +.section h3 { + font-weight: bold; + padding: 5px 0; + margin-bottom: 10px; + border-bottom: 1px solid #EDEDED; + font-size: 12px; +} + +.section ul { + list-style: none; + overflow: hidden; + clear: both; + +} + +.section li { + float: left; + width: 120px;; +} + +.section .tone { + width: 80px;; +} + +.section .preview { + width: 220px; +} + +.section .preview table { + text-align: center; + vertical-align: middle; + color: #666; +} + +.section .preview caption { + font-weight: bold; +} + +.section .preview td { + border-width: 1px; + border-style: solid; + height: 22px; +} + +.section .preview th { + border-style: solid; + border-color: #DDD; + border-width: 2px 1px 1px 1px; + height: 22px; + background-color: #F7F7F7; +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittable.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittable.html new file mode 100644 index 00000000..3c412fb8 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittable.html @@ -0,0 +1,64 @@ + + + + + + + + +
    +
    +
    +

    +
      +
    • + +
    • +
    • + +
    • +
    +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    +
    +

    +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    +
    +

    +
      +
    • + + +
    • +
    +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittable.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittable.js new file mode 100644 index 00000000..11dbee7c --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittable.js @@ -0,0 +1,237 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-12-19 + * Time: 涓嬪崍4:55 + * To change this template use File | Settings | File Templates. + */ +(function () { + var title = $G("J_title"), + titleCol = $G("J_titleCol"), + caption = $G("J_caption"), + sorttable = $G("J_sorttable"), + autoSizeContent = $G("J_autoSizeContent"), + autoSizePage = $G("J_autoSizePage"), + tone = $G("J_tone"), + me, + preview = $G("J_preview"); + + var editTable = function () { + me = this; + me.init(); + }; + editTable.prototype = { + init:function () { + var colorPiker = new UE.ui.ColorPicker({ + editor:editor + }), + colorPop = new UE.ui.Popup({ + editor:editor, + content:colorPiker + }); + + title.checked = editor.queryCommandState("inserttitle") == -1; + titleCol.checked = editor.queryCommandState("inserttitlecol") == -1; + caption.checked = editor.queryCommandState("insertcaption") == -1; + sorttable.checked = editor.queryCommandState("enablesort") == 1; + + var enablesortState = editor.queryCommandState("enablesort"), + disablesortState = editor.queryCommandState("disablesort"); + + sorttable.checked = !!(enablesortState < 0 && disablesortState >=0); + sorttable.disabled = !!(enablesortState < 0 && disablesortState < 0); + sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg:''; + + me.createTable(title.checked, titleCol.checked, caption.checked); + me.setAutoSize(); + me.setColor(me.getColor()); + + domUtils.on(title, "click", me.titleHanler); + domUtils.on(titleCol, "click", me.titleColHanler); + domUtils.on(caption, "click", me.captionHanler); + domUtils.on(sorttable, "click", me.sorttableHanler); + domUtils.on(autoSizeContent, "click", me.autoSizeContentHanler); + domUtils.on(autoSizePage, "click", me.autoSizePageHanler); + + domUtils.on(tone, "click", function () { + colorPop.showAnchor(tone); + }); + domUtils.on(document, 'mousedown', function () { + colorPop.hide(); + }); + colorPiker.addListener("pickcolor", function () { + me.setColor(arguments[1]); + colorPop.hide(); + }); + colorPiker.addListener("picknocolor", function () { + me.setColor(""); + colorPop.hide(); + }); + }, + + createTable:function (hasTitle, hasTitleCol, hasCaption) { + var arr = [], + sortSpan = '^'; + arr.push(""); + if (hasCaption) { + arr.push("") + } + if (hasTitle) { + arr.push(""); + if(hasTitleCol) { arr.push(""); } + for (var j = 0; j < 5; j++) { + arr.push(""); + } + arr.push(""); + } + for (var i = 0; i < 6; i++) { + arr.push(""); + if(hasTitleCol) { arr.push("") } + for (var k = 0; k < 5; k++) { + arr.push("") + } + arr.push(""); + } + arr.push("
    " + lang.captionName + "
    " + lang.titleName + "" + lang.titleName + "
    " + lang.titleName + "" + lang.cellsName + "
    "); + preview.innerHTML = arr.join(""); + this.updateSortSpan(); + }, + titleHanler:function () { + var example = $G("J_example"), + frg=document.createDocumentFragment(), + color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), + colCount = example.rows[0].children.length; + + if (title.checked) { + example.insertRow(0); + for (var i = 0, node; i < colCount; i++) { + node = document.createElement("th"); + node.innerHTML = lang.titleName; + frg.appendChild(node); + } + example.rows[0].appendChild(frg); + + } else { + domUtils.remove(example.rows[0]); + } + me.setColor(color); + me.updateSortSpan(); + }, + titleColHanler:function () { + var example = $G("J_example"), + color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), + colArr = example.rows, + colCount = colArr.length; + + if (titleCol.checked) { + for (var i = 0, node; i < colCount; i++) { + node = document.createElement("th"); + node.innerHTML = lang.titleName; + colArr[i].insertBefore(node, colArr[i].children[0]); + } + } else { + for (var i = 0; i < colCount; i++) { + domUtils.remove(colArr[i].children[0]); + } + } + me.setColor(color); + me.updateSortSpan(); + }, + captionHanler:function () { + var example = $G("J_example"); + if (caption.checked) { + var row = document.createElement('caption'); + row.innerHTML = lang.captionName; + example.insertBefore(row, example.firstChild); + } else { + domUtils.remove(domUtils.getElementsByTagName(example, 'caption')[0]); + } + }, + sorttableHanler:function(){ + me.updateSortSpan(); + }, + autoSizeContentHanler:function () { + var example = $G("J_example"); + example.removeAttribute("width"); + }, + autoSizePageHanler:function () { + var example = $G("J_example"); + var tds = example.getElementsByTagName(example, "td"); + utils.each(tds, function (td) { + td.removeAttribute("width"); + }); + example.setAttribute('width', '100%'); + }, + updateSortSpan: function(){ + var example = $G("J_example"), + row = example.rows[0]; + + var spans = domUtils.getElementsByTagName(example,"span"); + utils.each(spans,function(span){ + span.parentNode.removeChild(span); + }); + if (sorttable.checked) { + utils.each(row.cells, function(cell, i){ + var span = document.createElement("span"); + span.innerHTML = "^"; + cell.appendChild(span); + }); + } + }, + getColor:function () { + var start = editor.selection.getStart(), color, + cell = domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + color = cell && domUtils.getComputedStyle(cell, "border-color"); + if (!color) color = "#DDDDDD"; + return color; + }, + setColor:function (color) { + var example = $G("J_example"), + arr = domUtils.getElementsByTagName(example, "td").concat( + domUtils.getElementsByTagName(example, "th"), + domUtils.getElementsByTagName(example, "caption") + ); + + tone.value = color; + utils.each(arr, function (node) { + node.style.borderColor = color; + }); + + }, + setAutoSize:function () { + var me = this; + autoSizePage.checked = true; + me.autoSizePageHanler(); + } + }; + + new editTable; + + dialog.onok = function () { + editor.__hasEnterExecCommand = true; + + var checks = { + title:"inserttitle deletetitle", + titleCol:"inserttitlecol deletetitlecol", + caption:"insertcaption deletecaption", + sorttable:"enablesort disablesort" + }; + editor.fireEvent('saveScene'); + for(var i in checks){ + var cmds = checks[i].split(" "), + input = $G("J_" + i); + if(input["checked"]){ + editor.queryCommandState(cmds[0])!=-1 &&editor.execCommand(cmds[0]); + }else{ + editor.queryCommandState(cmds[1])!=-1 &&editor.execCommand(cmds[1]); + } + } + + editor.execCommand("edittable", tone.value); + autoSizeContent.checked ?editor.execCommand('adaptbytext') : ""; + autoSizePage.checked ? editor.execCommand("adaptbywindow") : ""; + editor.fireEvent('saveScene'); + + editor.__hasEnterExecCommand = false; + }; +})(); \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittd.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittd.html new file mode 100644 index 00000000..49a52f71 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittd.html @@ -0,0 +1,61 @@ + + + + + + + + +
    + + +
    + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittip.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittip.html new file mode 100644 index 00000000..954f7bb6 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/table/edittip.html @@ -0,0 +1,33 @@ + + + + 琛ㄦ牸鍒犻櫎鎻愮ず + + + + +
    +
    + +
    +
    + +
    +
    + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/config.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/config.js new file mode 100644 index 00000000..417b8f78 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/config.js @@ -0,0 +1,42 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-8-8 + * Time: 涓嬪崍2:00 + * To change this template use File | Settings | File Templates. + */ +var templates = [ + { + "pre":"pre0.png", + 'title':lang.blank, + 'preHtml':'

     娆㈣繋浣跨敤UEditor锛

    ', + "html":'

    娆㈣繋浣跨敤UEditor锛

    ' + + }, + { + "pre":"pre1.png", + 'title':lang.blog, + 'preHtml':'

    娣卞叆鐞嗚ВRange

    UEditor浜屾寮鍙

    浠涔堟槸Range

    瀵逛簬鈥滄彃鍏モ濋夐」鍗′笂鐨勫簱锛屽湪璁捐鏃堕兘鍏呭垎鑰冭檻浜嗗叾涓殑椤逛笌鏂囨。鏁翠綋澶栬鐨勫崗璋冩с


    Range鑳藉共浠涔

    鍦ㄢ滃紑濮嬧濋夐」鍗′笂锛岄氳繃浠庡揩閫熸牱寮忓簱涓负鎵閫夋枃鏈夋嫨涓绉嶅瑙傦紝鎮ㄥ彲浠ユ柟渚垮湴鏇存敼鏂囨。涓墍閫夋枃鏈殑鏍煎紡銆

    ', + "html":'

    [閿叆鏂囨。鏍囬]

    [閿叆鏂囨。鍓爣棰榏

    [鏍囬 1]

    瀵逛簬鈥滄彃鍏モ濋夐」鍗′笂鐨勫簱锛屽湪璁捐鏃堕兘鍏呭垎鑰冭檻浜嗗叾涓殑椤逛笌鏂囨。鏁翠綋澶栬鐨勫崗璋冩с 鎮ㄥ彲浠ヤ娇鐢ㄨ繖浜涘簱鏉ユ彃鍏ヨ〃鏍笺侀〉鐪夈侀〉鑴氥佸垪琛ㄣ佸皝闈互鍙婂叾浠栨枃妗f瀯寤哄熀鍧椼 鎮ㄥ垱寤虹殑鍥剧墖銆佸浘琛ㄦ垨鍏崇郴鍥句篃灏嗕笌褰撳墠鐨勬枃妗e瑙傚崗璋冧竴鑷淬

    [鏍囬 2]

    鍦ㄢ滃紑濮嬧濋夐」鍗′笂锛岄氳繃浠庡揩閫熸牱寮忓簱涓负鎵閫夋枃鏈夋嫨涓绉嶅瑙傦紝鎮ㄥ彲浠ユ柟渚垮湴鏇存敼鏂囨。涓墍閫夋枃鏈殑鏍煎紡銆 鎮ㄨ繕鍙互浣跨敤鈥滃紑濮嬧濋夐」鍗′笂鐨勫叾浠栨帶浠舵潵鐩存帴璁剧疆鏂囨湰鏍煎紡銆傚ぇ澶氭暟鎺т欢閮藉厑璁告偍閫夋嫨鏄娇鐢ㄥ綋鍓嶄富棰樺瑙傦紝杩樻槸浣跨敤鏌愮鐩存帴鎸囧畾鐨勬牸寮忋

    [鏍囬 3]

    瀵逛簬鈥滄彃鍏モ濋夐」鍗′笂鐨勫簱锛屽湪璁捐鏃堕兘鍏呭垎鑰冭檻浜嗗叾涓殑椤逛笌鏂囨。鏁翠綋澶栬鐨勫崗璋冩с 鎮ㄥ彲浠ヤ娇鐢ㄨ繖浜涘簱鏉ユ彃鍏ヨ〃鏍笺侀〉鐪夈侀〉鑴氥佸垪琛ㄣ佸皝闈互鍙婂叾浠栨枃妗f瀯寤哄熀鍧椼 鎮ㄥ垱寤虹殑鍥剧墖銆佸浘琛ㄦ垨鍏崇郴鍥句篃灏嗕笌褰撳墠鐨勬枃妗e瑙傚崗璋冧竴鑷淬


    ' + + }, + { + "pre":"pre2.png", + 'title':lang.resume, + 'preHtml':'

    WEB鍓嶇寮鍙戠畝鍘


    鑱旂郴鐢佃瘽锛[閿叆鎮ㄧ殑鐢佃瘽]

    鐢靛瓙閭欢锛[閿叆鎮ㄧ殑鐢靛瓙閭欢鍦板潃]

    瀹跺涵浣忓潃锛[閿叆鎮ㄧ殑鍦板潃]

    鐩爣鑱屼綅

    WEB鍓嶇鐮斿彂宸ョ▼甯

    瀛﹀巻

    1. [璧锋鏃堕棿] [瀛︽牎鍚嶇О] [鎵瀛︿笓涓歖 [鎵鑾峰浣峕

    宸ヤ綔缁忛獙


    ', + "html":'

    [姝ゅ閿叆绠鍘嗘爣棰榏


    銆愭澶勬彃鍏ョ収鐗囥


    鑱旂郴鐢佃瘽锛[閿叆鎮ㄧ殑鐢佃瘽]


    鐢靛瓙閭欢锛[閿叆鎮ㄧ殑鐢靛瓙閭欢鍦板潃]


    瀹跺涵浣忓潃锛[閿叆鎮ㄧ殑鍦板潃]


    鐩爣鑱屼綅

    [姝ゅ閿叆鎮ㄧ殑鏈熸湜鑱屼綅]

    瀛﹀巻

    1. [閿叆璧锋鏃堕棿] [閿叆瀛︽牎鍚嶇О] [閿叆鎵瀛︿笓涓歖 [閿叆鎵鑾峰浣峕

    2. [閿叆璧锋鏃堕棿] [閿叆瀛︽牎鍚嶇О] [閿叆鎵瀛︿笓涓歖 [閿叆鎵鑾峰浣峕

    宸ヤ綔缁忛獙

    1. [閿叆璧锋鏃堕棿] [閿叆鍏徃鍚嶇О] [閿叆鑱屼綅鍚嶇О]

      1. [閿叆璐熻矗椤圭洰] [閿叆椤圭洰绠浠媇

      2. [閿叆璐熻矗椤圭洰] [閿叆椤圭洰绠浠媇

    2. [閿叆璧锋鏃堕棿] [閿叆鍏徃鍚嶇О] [閿叆鑱屼綅鍚嶇О]

      1. [閿叆璐熻矗椤圭洰] [閿叆椤圭洰绠浠媇

    鎺屾彙鎶鑳

     [杩欓噷鍙互閿叆鎮ㄦ墍鎺屾彙鐨勬妧鑳絔

    ' + + }, + { + "pre":"pre3.png", + 'title':lang.richText, + 'preHtml':'

    [姝ゅ閿叆鏂囩珷鏍囬]

    鍥炬枃娣锋帓鏂规硶

    鍥剧墖灞呭乏锛屾枃瀛楀洿缁曞浘鐗囨帓鐗

    鏂规硶锛氬湪鏂囧瓧鍓嶉潰鎻掑叆鍥剧墖锛岃缃眳宸﹀榻愶紝鐒跺悗鍗冲彲鍦ㄥ彸杈硅緭鍏ュ琛屾枃


    杩樻湁娌℃湁浠涔堝叾浠栫殑鐜粫鏂瑰紡鍛紵杩欓噷鏄眳鍙崇幆缁


    娆㈣繋澶у澶氬灏濊瘯锛屼负UEditor鎻愪緵鏇村楂樿川閲忔ā鏉匡紒

    ', + "html":'


    [姝ゅ閿叆鏂囩珷鏍囬]

    鍥炬枃娣锋帓鏂规硶

    1. 鍥剧墖灞呭乏锛屾枃瀛楀洿缁曞浘鐗囨帓鐗

    鏂规硶锛氬湪鏂囧瓧鍓嶉潰鎻掑叆鍥剧墖锛岃缃眳宸﹀榻愶紝鐒跺悗鍗冲彲鍦ㄥ彸杈硅緭鍏ュ琛屾枃鏈


    2. 鍥剧墖灞呭彸锛屾枃瀛楀洿缁曞浘鐗囨帓鐗

    鏂规硶锛氬湪鏂囧瓧鍓嶉潰鎻掑叆鍥剧墖锛岃缃眳鍙冲榻愶紝鐒跺悗鍗冲彲鍦ㄥ乏杈硅緭鍏ュ琛屾枃鏈


    3. 鍥剧墖灞呬腑鐜粫鎺掔増

    鏂规硶锛氫翰锛岃繖涓湡蹇冩病鏈夊姙娉曘傘傘



    杩樻湁娌℃湁浠涔堝叾浠栫殑鐜粫鏂瑰紡鍛紵杩欓噷鏄眳鍙崇幆缁


    娆㈣繋澶у澶氬灏濊瘯锛屼负UEditor鎻愪緵鏇村楂樿川閲忔ā鏉匡紒


    鍗犱綅


    鍗犱綅


    鍗犱綅


    鍗犱綅


    鍗犱綅



    ' + }, + { + "pre":"pre4.png", + 'title':lang.sciPapers, + 'preHtml':'

    [閿叆鏂囩珷鏍囬]

    鎽樿锛氳繖閲屽彲浠ヨ緭鍏ュ緢闀垮緢闀垮緢闀垮緢闀垮緢闀垮緢闀垮緢闀垮緢闀垮緢宸殑鎽樿

    鏍囬 1

    杩欓噷鍙互杈撳叆寰堝鍐呭锛屽彲浠ュ浘鏂囨贩鎺掞紝鍙互鏈夊垪琛ㄧ瓑銆

    鏍囬 2

    1. 鍒楄〃 1

    2. 鍒楄〃 2

      1. 澶氱骇鍒楄〃 1

      2. 澶氱骇鍒楄〃 2

    3. 鍒楄〃 3

    鏍囬 3

    鏉ヤ釜鏂囧瓧鍥炬枃娣锋帓鐨


    ', + 'html':'

    [閿叆鏂囩珷鏍囬]

    鎽樿锛氳繖閲屽彲浠ヨ緭鍏ュ緢闀垮緢闀垮緢闀垮緢闀垮緢闀垮緢闀垮緢闀垮緢闀垮緢宸殑鎽樿

    鏍囬 1

    杩欓噷鍙互杈撳叆寰堝鍐呭锛屽彲浠ュ浘鏂囨贩鎺掞紝鍙互鏈夊垪琛ㄧ瓑銆

    鏍囬 2

    鏉ヤ釜鍒楄〃鐬呯瀰锛

    1. 鍒楄〃 1

    2. 鍒楄〃 2

      1. 澶氱骇鍒楄〃 1

      2. 澶氱骇鍒楄〃 2

    3. 鍒楄〃 3

    鏍囬 3

    鏉ヤ釜鏂囧瓧鍥炬枃娣锋帓鐨

    杩欓噷鍙互澶氳

    鍙宠竟鏄浘鐗

    缁濆娌℃湁闂鐨勶紝涓嶄俊浣犱篃鍙互璇曡瘯鐪


    ' + } +]; \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/bg.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/bg.gif new file mode 100644 index 00000000..8c1d10ad Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/bg.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre0.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre0.png new file mode 100644 index 00000000..8f3c16ab Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre0.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre1.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre1.png new file mode 100644 index 00000000..5a03f969 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre1.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre2.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre2.png new file mode 100644 index 00000000..5a55672c Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre2.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre3.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre3.png new file mode 100644 index 00000000..d852d29f Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre3.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre4.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre4.png new file mode 100644 index 00000000..0d7bc72a Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/images/pre4.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/template.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/template.css new file mode 100644 index 00000000..6c1608df --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/template.css @@ -0,0 +1,18 @@ +.wrap{ padding: 5px;font-size: 14px;} +.left{width:425px;float: left;} +.right{width:160px;border: 1px solid #ccc;float: right;padding: 5px;margin-right: 5px;} +.right .pre{height: 332px;overflow-y: auto;} +.right .preitem{border: white 1px solid;margin: 5px 0;padding: 2px 0;} +.right .preitem:hover{background-color: lemonChiffon;cursor: pointer;border: #ccc 1px solid;} +.right .preitem img{display: block;margin: 0 auto;width:100px;} +.clear{clear: both;} +.top{height:26px;line-height: 26px;padding: 5px;} +.bottom{height:320px;width:100%;margin: 0 auto;} +.transparent{ background: url("images/bg.gif") repeat;} +.bottom table tr td{border:1px dashed #ccc;} +#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;} +.border_style1{padding:2px;border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;} +p{margin: 5px 0} +table{clear:both;margin-bottom:10px;border-collapse:collapse;word-break:break-all;} +li{clear:both} +ol{padding-left:40px; } \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/template.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/template.html new file mode 100644 index 00000000..d9903a48 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/template.html @@ -0,0 +1,26 @@ + + + + + + + + + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + + + diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/template.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/template.js new file mode 100644 index 00000000..80a334b3 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/template/template.js @@ -0,0 +1,53 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-8-8 + * Time: 涓嬪崍2:09 + * To change this template use File | Settings | File Templates. + */ +(function () { + var me = editor, + preview = $G( "preview" ), + preitem = $G( "preitem" ), + tmps = templates, + currentTmp; + var initPre = function () { + var str = ""; + for ( var i = 0, tmp; tmp = tmps[i++]; ) { + str += '
    '; + } + preitem.innerHTML = str; + }; + var pre = function ( n ) { + var tmp = tmps[n - 1]; + currentTmp = tmp; + clearItem(); + domUtils.setStyles( preitem.childNodes[n - 1], { + "background-color":"lemonChiffon", + "border":"#ccc 1px solid" + } ); + preview.innerHTML = tmp.preHtml ? tmp.preHtml : ""; + }; + var clearItem = function () { + var items = preitem.children; + for ( var i = 0, item; item = items[i++]; ) { + domUtils.setStyles( item, { + "background-color":"", + "border":"white 1px solid" + } ); + } + }; + dialog.onok = function () { + if ( !$G( "issave" ).checked ){ + me.execCommand( "cleardoc" ); + } + var obj = { + html:currentTmp && currentTmp.html + }; + me.execCommand( "template", obj ); + }; + initPre(); + window.pre = pre; + pre(2) + +})(); \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/bg.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/bg.png new file mode 100644 index 00000000..580be0a0 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/bg.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/center_focus.jpg b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/center_focus.jpg new file mode 100644 index 00000000..262b0291 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/center_focus.jpg differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/file-icons.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/file-icons.gif new file mode 100644 index 00000000..d8c02c27 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/file-icons.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/file-icons.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/file-icons.png new file mode 100644 index 00000000..3ff82c8c Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/file-icons.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/icons.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/icons.gif new file mode 100644 index 00000000..78459dea Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/icons.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/icons.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/icons.png new file mode 100644 index 00000000..12e47001 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/icons.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/image.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/image.png new file mode 100644 index 00000000..19699f6a Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/image.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/left_focus.jpg b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/left_focus.jpg new file mode 100644 index 00000000..7886d276 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/left_focus.jpg differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/none_focus.jpg b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/none_focus.jpg new file mode 100644 index 00000000..7c768dcb Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/none_focus.jpg differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/progress.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/progress.png new file mode 100644 index 00000000..717c4865 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/progress.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/right_focus.jpg b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/right_focus.jpg new file mode 100644 index 00000000..173e10d2 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/right_focus.jpg differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/success.gif b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/success.gif new file mode 100644 index 00000000..8d4f3112 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/success.gif differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/success.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/success.png new file mode 100644 index 00000000..94f968dc Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/images/success.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/video.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/video.css new file mode 100644 index 00000000..5870e7a1 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/video.css @@ -0,0 +1,635 @@ +@charset "utf-8"; +.wrapper{ width: 570px;_width:575px;margin: 10px auto; zoom:1;position: relative} +.tabbody{height: 335px;} +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} +.tabbody .panel.focus { + width: 100%; + height: 335px; + display: block; +} + +.tabbody .panel table td{vertical-align: middle;} +#videoUrl { + width: 490px; + height: 21px; + line-height: 21px; + margin: 8px 5px; + background: #FFF; + border: 1px solid #d7d7d7; +} +#videoSearchTxt{margin-left:15px;background: #FFF;width:200px;height:21px;line-height:21px;border: 1px solid #d7d7d7;} +#searchList{width: 570px;overflow: auto;zoom:1;height: 270px;} +#searchList div{float: left;width: 120px;height: 135px;margin: 5px 15px;} +#searchList img{margin: 2px 8px;cursor: pointer;border: 2px solid #fff} /*涓嶇敤缂╃暐鍥*/ +#searchList p{margin-left: 10px;} +#videoType{ + width: 65px; + height: 23px; + line-height: 22px; + border: 1px solid #d7d7d7; +} +#videoSearchBtn,#videoSearchReset{ + /*width: 80px;*/ + height: 25px; + line-height: 25px; + background: #eee; + border: 1px solid #d7d7d7; + cursor: pointer; + padding: 0 5px; +} + + + +#preview{position: relative;width: 420px;padding:0;overflow: hidden; margin-left: 10px; _margin-left:5px; height: 280px;background-color: #ddd;float: left} +#preview .previewMsg {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;background-color: #666;} +#preview .previewMsg span{display:block;margin: 125px auto 0 auto;text-align:center;font-size:18px;color:#fff;} +#preview .previewVideo {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;} +.edui-video-wrapper fieldset{ + border: 1px solid #ddd; + padding-left: 5px; + margin-bottom: 20px; + padding-bottom: 5px; + width: 115px; +} + +#videoInfo {width: 120px;float: left;margin-left: 10px;_margin-left:7px;} +fieldset{ + border: 1px solid #ddd; + padding-left: 5px; + margin-bottom: 20px; + padding-bottom: 5px; + width: 115px; +} +fieldset legend{font-weight: bold;} +fieldset p{line-height: 30px;} +fieldset input.txt{ + width: 65px; + height: 21px; + line-height: 21px; + margin: 8px 5px; + background: #FFF; + border: 1px solid #d7d7d7; +} +label.url{font-weight: bold;margin-left: 5px;color: #06c;} +#videoFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;} +#videoFloat .focus{opacity: 1;filter: alpha(opacity = 100)} +span.view{display: inline-block;width: 30px;float: right;cursor: pointer;color: blue} + + + + +/* upload video */ +.tabbody #upload.panel { + width: 0; + height: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); + background: #fff; + display: block; +} +.tabbody #upload.panel.focus { + width: 100%; + height: 335px; + display: block; + clip: auto; +} +#upload_alignment div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;} +#upload_alignment .focus{opacity: 1;filter: alpha(opacity = 100)} +#upload_left { width:427px; float:left; } +#upload_left .controller { height: 30px; clear: both; } +#uploadVideoInfo{margin-top:10px;float:right;padding-right:8px;} + +#upload .queueList { + margin: 0; +} + +#upload p { + margin: 0; +} + +.element-invisible { + width: 0 !important; + height: 0 !important; + border: 0; + padding: 0; + margin: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); +} + +#upload .placeholder { + margin: 10px; + margin-right:0; + border: 2px dashed #e6e6e6; + *border: 0px dashed #e6e6e6; + height: 161px; + padding-top: 150px; + text-align: center; + width: 97%; + float: left; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top:0; + *margin-left: 0; + *left: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 285px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; +} + +#upload .filelist li { + width: 113px; + height: 113px; + background: url(./images/bg.png); + text-align: center; + margin: 15px 0 0 20px; + *margin: 15px 0 0 15px; + position: relative; + display: block; + float: left; + overflow: hidden; + font-size: 12px; +} + +#upload .filelist li p.log { + position: relative; + top: -45px; +} + +#upload .filelist li p.title { + position: absolute; + top: 0; + left: 0; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + top: 5px; + text-indent: 5px; + text-align: left; +} + +#upload .filelist li p.progress { + position: absolute; + width: 100%; + bottom: 0; + left: 0; + height: 8px; + overflow: hidden; + z-index: 50; + margin: 0; + border-radius: 0; + background: none; + -webkit-box-shadow: 0 0 0; +} + +#upload .filelist li p.progress span { + display: none; + overflow: hidden; + width: 0; + height: 100%; + background: #1483d8 url(./images/progress.png) repeat-x; + + -webit-transition: width 200ms linear; + -moz-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; + transition: width 200ms linear; + + -webkit-animation: progressmove 2s linear infinite; + -moz-animation: progressmove 2s linear infinite; + -o-animation: progressmove 2s linear infinite; + -ms-animation: progressmove 2s linear infinite; + animation: progressmove 2s linear infinite; + + -webkit-transform: translateZ(0); +} + +@-webkit-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@-moz-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +#upload .filelist li p.imgWrap { + position: relative; + z-index: 2; + line-height: 113px; + vertical-align: middle; + overflow: hidden; + width: 113px; + height: 113px; + + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + + -webit-transition: 200ms ease-out; + -moz-transition: 200ms ease-out; + -o-transition: 200ms ease-out; + -ms-transition: 200ms ease-out; + transition: 200ms ease-out; +} +#upload .filelist li p.imgWrap.notimage { + margin-top: 0; + width: 111px; + height: 111px; + border: 1px #eeeeee solid; +} +#upload .filelist li p.imgWrap.notimage i.file-preview { + margin-top: 15px; +} + +#upload .filelist li img { + width: 100%; +} + +#upload .filelist li p.error { + background: #f43838; + color: #fff; + position: absolute; + bottom: 0; + left: 0; + height: 28px; + line-height: 28px; + width: 100%; + z-index: 100; + display:none; +} + +#upload .filelist li .success { + display: block; + position: absolute; + left: 0; + bottom: 0; + height: 40px; + width: 100%; + z-index: 200; + background: url(./images/success.png) no-repeat right bottom; + background-image: url(./images/success.gif) \9; +} + +#upload .filelist li.filePickerBlock { + width: 113px; + height: 113px; + background: url(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display:none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display:none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused{ + background: #00b7ee; + color: #fff; + border-color: transparent; +} +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover{ + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter:alpha(opacity=60); + -moz-opacity:0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + + +/* 鍦ㄧ嚎鏂囦欢鐨勬枃浠堕瑙堝浘鏍 */ +i.file-preview { + display: block; + margin: 10px auto; + width: 70px; + height: 70px; + background-image: url("./images/file-icons.png"); + background-image: url("./images/file-icons.gif") \9; + background-position: -140px center; + background-repeat: no-repeat; +} +i.file-preview.file-type-dir{ + background-position: 0 center; +} +i.file-preview.file-type-file{ + background-position: -140px center; +} +i.file-preview.file-type-filelist{ + background-position: -210px center; +} +i.file-preview.file-type-zip, +i.file-preview.file-type-rar, +i.file-preview.file-type-7z, +i.file-preview.file-type-tar, +i.file-preview.file-type-gz, +i.file-preview.file-type-bz2{ + background-position: -280px center; +} +i.file-preview.file-type-xls, +i.file-preview.file-type-xlsx{ + background-position: -350px center; +} +i.file-preview.file-type-doc, +i.file-preview.file-type-docx{ + background-position: -420px center; +} +i.file-preview.file-type-ppt, +i.file-preview.file-type-pptx{ + background-position: -490px center; +} +i.file-preview.file-type-vsd{ + background-position: -560px center; +} +i.file-preview.file-type-pdf{ + background-position: -630px center; +} +i.file-preview.file-type-txt, +i.file-preview.file-type-md, +i.file-preview.file-type-json, +i.file-preview.file-type-htm, +i.file-preview.file-type-xml, +i.file-preview.file-type-html, +i.file-preview.file-type-js, +i.file-preview.file-type-css, +i.file-preview.file-type-php, +i.file-preview.file-type-jsp, +i.file-preview.file-type-asp{ + background-position: -700px center; +} +i.file-preview.file-type-apk{ + background-position: -770px center; +} +i.file-preview.file-type-exe{ + background-position: -840px center; +} +i.file-preview.file-type-ipa{ + background-position: -910px center; +} +i.file-preview.file-type-mp4, +i.file-preview.file-type-swf, +i.file-preview.file-type-mkv, +i.file-preview.file-type-avi, +i.file-preview.file-type-flv, +i.file-preview.file-type-mov, +i.file-preview.file-type-mpg, +i.file-preview.file-type-mpeg, +i.file-preview.file-type-ogv, +i.file-preview.file-type-webm, +i.file-preview.file-type-rm, +i.file-preview.file-type-rmvb{ + background-position: -980px center; +} +i.file-preview.file-type-ogg, +i.file-preview.file-type-wav, +i.file-preview.file-type-wmv, +i.file-preview.file-type-mid, +i.file-preview.file-type-mp3{ + background-position: -1050px center; +} +i.file-preview.file-type-jpg, +i.file-preview.file-type-jpeg, +i.file-preview.file-type-gif, +i.file-preview.file-type-bmp, +i.file-preview.file-type-png, +i.file-preview.file-type-psd{ + background-position: -140px center; +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/video.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/video.html new file mode 100644 index 00000000..50078829 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/video.html @@ -0,0 +1,86 @@ + + + + + + + + + +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + 0% + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
      +
    • +
    +
    +
    +
    +
    + + + + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/video.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/video.js new file mode 100644 index 00000000..8d99b9f1 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/video/video.js @@ -0,0 +1,789 @@ +/** + * Created by JetBrains PhpStorm. + * User: taoqili + * Date: 12-2-20 + * Time: 涓婂崍11:19 + * To change this template use File | Settings | File Templates. + */ + +(function(){ + + var video = {}, + uploadVideoList = [], + isModifyUploadVideo = false, + uploadFile; + + window.onload = function(){ + $focus($G("videoUrl")); + initTabs(); + initVideo(); + initUpload(); + }; + + /* 鍒濆鍖杢ab鏍囩 */ + function initTabs(){ + var tabs = $G('tabHeads').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var j, bodyId, target = e.target || e.srcElement; + for (j = 0; j < tabs.length; j++) { + bodyId = tabs[j].getAttribute('data-content-id'); + if(tabs[j] == target){ + domUtils.addClass(tabs[j], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + }else { + domUtils.removeClasses(tabs[j], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + }); + } + } + + function initVideo(){ + createAlignButton( ["videoFloat", "upload_alignment"] ); + addUrlChangeListener($G("videoUrl")); + addOkListener(); + + //缂栬緫瑙嗛鏃跺垵濮嬪寲鐩稿叧淇℃伅 + (function(){ + var img = editor.selection.getRange().getClosedNode(),url; + if(img && img.className){ + var hasFakedClass = (img.className == "edui-faked-video"), + hasUploadClass = img.className.indexOf("edui-upload-video")!=-1; + if(hasFakedClass || hasUploadClass) { + $G("videoUrl").value = url = img.getAttribute("_url"); + $G("videoWidth").value = img.width; + $G("videoHeight").value = img.height; + var align = domUtils.getComputedStyle(img,"float"), + parentAlign = domUtils.getComputedStyle(img.parentNode,"text-align"); + updateAlignButton(parentAlign==="center"?"center":align); + } + if(hasUploadClass) { + isModifyUploadVideo = true; + } + } + createPreviewVideo(url); + })(); + } + + /** + * 鐩戝惉纭鍜屽彇娑堜袱涓寜閽簨浠讹紝鐢ㄦ埛鎵ц鎻掑叆鎴栬呮竻绌烘鍦ㄦ挱鏀剧殑瑙嗛瀹炰緥鎿嶄綔 + */ + function addOkListener(){ + dialog.onok = function(){ + $G("preview").innerHTML = ""; + var currentTab = findFocus("tabHeads","tabSrc"); + switch(currentTab){ + case "video": + return insertSingle(); + break; + case "videoSearch": + return insertSearch("searchList"); + break; + case "upload": + return insertUpload(); + break; + } + }; + dialog.oncancel = function(){ + $G("preview").innerHTML = ""; + }; + } + + /** + * 渚濇嵁浼犲叆鐨刟lign鍊兼洿鏂版寜閽俊鎭 + * @param align + */ + function updateAlignButton( align ) { + var aligns = $G( "videoFloat" ).children; + for ( var i = 0, ci; ci = aligns[i++]; ) { + if ( ci.getAttribute( "name" ) == align ) { + if ( ci.className !="focus" ) { + ci.className = "focus"; + } + } else { + if ( ci.className =="focus" ) { + ci.className = ""; + } + } + } + } + + /** + * 灏嗗崟涓棰戜俊鎭彃鍏ョ紪杈戝櫒涓 + */ + function insertSingle(){ + var width = $G("videoWidth"), + height = $G("videoHeight"), + url=$G('videoUrl').value, + align = findFocus("videoFloat","name"); + if(!url) return false; + if ( !checkNum( [width, height] ) ) return false; + editor.execCommand('insertvideo', { + url: convert_url(url), + width: width.value, + height: height.value, + align: align + }, isModifyUploadVideo ? 'upload':null); + } + + /** + * 灏嗗厓绱爄d涓嬬殑鎵鏈変唬琛ㄨ棰戠殑鍥剧墖鎻掑叆缂栬緫鍣ㄤ腑 + * @param id + */ + function insertSearch(id){ + var imgs = domUtils.getElementsByTagName($G(id),"img"), + videoObjs=[]; + for(var i=0,img; img=imgs[i++];){ + if(img.getAttribute("selected")){ + videoObjs.push({ + url:img.getAttribute("ue_video_url"), + width:420, + height:280, + align:"none" + }); + } + } + editor.execCommand('insertvideo',videoObjs); + } + + /** + * 鎵惧埌id涓嬪叿鏈塮ocus绫荤殑鑺傜偣骞惰繑鍥炶鑺傜偣涓嬬殑鏌愪釜灞炴 + * @param id + * @param returnProperty + */ + function findFocus( id, returnProperty ) { + var tabs = $G( id ).children, + property; + for ( var i = 0, ci; ci = tabs[i++]; ) { + if ( ci.className=="focus" ) { + property = ci.getAttribute( returnProperty ); + break; + } + } + return property; + } + function convert_url(url){ + if ( !url ) return ''; + url = utils.trim(url) + .replace(/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, 'player.youku.com/player.php/sid/$1/v.swf') + .replace(/(www\.)?youtube\.com\/watch\?v=([\w\-]+)/i, "www.youtube.com/v/$2") + .replace(/youtu.be\/(\w+)$/i, "www.youtube.com/v/$1") + .replace(/v\.ku6\.com\/.+\/([\w\.]+)\.html.*$/i, "player.ku6.com/refer/$1/v.swf") + .replace(/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "player.56.com/v_$1.swf") + .replace(/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "player.56.com/v_$1.swf") + .replace(/v\.pps\.tv\/play_([\w]+)\.html.*$/i, "player.pps.tv/player/sid/$1/v.swf") + .replace(/www\.letv\.com\/ptv\/vplay\/([\d]+)\.html.*$/i, "i7.imgs.letv.com/player/swfPlayer.swf?id=$1&autoplay=0") + .replace(/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "www.tudou.com/v/$1") + .replace(/v\.qq\.com\/cover\/[\w]+\/[\w]+\/([\w]+)\.html/i, "static.video.qq.com/TPout.swf?vid=$1") + .replace(/v\.qq\.com\/.+[\?\&]vid=([^&]+).*$/i, "static.video.qq.com/TPout.swf?vid=$1") + .replace(/my\.tv\.sohu\.com\/[\w]+\/[\d]+\/([\d]+)\.shtml.*$/i, "share.vrs.sohu.com/my/v.swf&id=$1"); + + return url; + } + + /** + * 妫娴嬩紶鍏ョ殑鎵鏈塱nput妗嗕腑杈撳叆鐨勯暱瀹芥槸鍚︽槸姝f暟 + * @param nodes input妗嗛泦鍚堬紝 + */ + function checkNum( nodes ) { + for ( var i = 0, ci; ci = nodes[i++]; ) { + var value = ci.value; + if ( !isNumber( value ) && value) { + alert( lang.numError ); + ci.value = ""; + ci.focus(); + return false; + } + } + return true; + } + + /** + * 鏁板瓧鍒ゆ柇 + * @param value + */ + function isNumber( value ) { + return /(0|^[1-9]\d*$)/.test( value ); + } + + /** + * 鍒涘缓鍥剧墖娴姩閫夋嫨鎸夐挳 + * @param ids + */ + function createAlignButton( ids ) { + for ( var i = 0, ci; ci = ids[i++]; ) { + var floatContainer = $G( ci ), + nameMaps = {"none":lang['default'], "left":lang.floatLeft, "right":lang.floatRight, "center":lang.block}; + for ( var j in nameMaps ) { + var div = document.createElement( "div" ); + div.setAttribute( "name", j ); + if ( j == "none" ) div.className="focus"; + div.style.cssText = "background:url(images/" + j + "_focus.jpg);"; + div.setAttribute( "title", nameMaps[j] ); + floatContainer.appendChild( div ); + } + switchSelect( ci ); + } + } + + /** + * 閫夋嫨鍒囨崲 + * @param selectParentId + */ + function switchSelect( selectParentId ) { + var selects = $G( selectParentId ).children; + for ( var i = 0, ci; ci = selects[i++]; ) { + domUtils.on( ci, "click", function () { + for ( var j = 0, cj; cj = selects[j++]; ) { + cj.className = ""; + cj.removeAttribute && cj.removeAttribute( "class" ); + } + this.className = "focus"; + } ) + } + } + + /** + * 鐩戝惉url鏀瑰彉浜嬩欢 + * @param url + */ + function addUrlChangeListener(url){ + if (browser.ie) { + url.onpropertychange = function () { + createPreviewVideo( this.value ); + } + } else { + url.addEventListener( "input", function () { + createPreviewVideo( this.value ); + }, false ); + } + } + + /** + * 鏍规嵁url鐢熸垚瑙嗛棰勮 + * @param url + */ + function createPreviewVideo(url){ + if ( !url )return; + + var conUrl = convert_url(url); + + $G("preview").innerHTML = '
    '+lang.urlError+'
    '+ + '' + + ''; + } + + + /* 鎻掑叆涓婁紶瑙嗛 */ + function insertUpload(){ + var videoObjs=[], + uploadDir = editor.getOpt('videoUrlPrefix'), + width = $G('upload_width').value || 420, + height = $G('upload_height').value || 280, + align = findFocus("upload_alignment","name") || 'none'; + for(var key in uploadVideoList) { + var file = uploadVideoList[key]; + videoObjs.push({ + url: uploadDir + file.url, + width:width, + height:height, + align:align + }); + } + + var count = uploadFile.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '杩樻湁2涓湭涓婁紶鏂囦欢'.replace(/[\d]/, count) + ''); + return false; + } else { + editor.execCommand('insertvideo', videoObjs, 'upload'); + } + } + + /*鍒濆鍖栦笂浼犳爣绛*/ + function initUpload(){ + uploadFile = new UploadFile('queueList'); + } + + + /* 涓婁紶闄勪欢 */ + function UploadFile(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + UploadFile.prototype = { + init: function () { + this.fileList = []; + this.initContainer(); + this.initUploader(); + }, + initContainer: function () { + this.$queue = this.$wrap.find('.filelist'); + }, + /* 鍒濆鍖栧鍣 */ + initUploader: function () { + var _this = this, + $ = jQuery, // just in case. Make sure it's not an other libaray. + $wrap = _this.$wrap, + // 鍥剧墖瀹瑰櫒 + $queue = $wrap.find('.filelist'), + // 鐘舵佹爮锛屽寘鎷繘搴﹀拰鎺у埗鎸夐挳 + $statusBar = $wrap.find('.statusBar'), + // 鏂囦欢鎬讳綋閫夋嫨淇℃伅銆 + $info = $statusBar.find('.info'), + // 涓婁紶鎸夐挳 + $upload = $wrap.find('.uploadBtn'), + // 涓婁紶鎸夐挳 + $filePickerBtn = $wrap.find('.filePickerBtn'), + // 涓婁紶鎸夐挳 + $filePickerBlock = $wrap.find('.filePickerBlock'), + // 娌¢夋嫨鏂囦欢涔嬪墠鐨勫唴瀹广 + $placeHolder = $wrap.find('.placeholder'), + // 鎬讳綋杩涘害鏉 + $progress = $statusBar.find('.progress').hide(), + // 娣诲姞鐨勬枃浠舵暟閲 + fileCount = 0, + // 娣诲姞鐨勬枃浠舵诲ぇ灏 + fileSize = 0, + // 浼樺寲retina, 鍦╮etina涓嬭繖涓兼槸2 + ratio = window.devicePixelRatio || 1, + // 缂╃暐鍥惧ぇ灏 + thumbnailWidth = 113 * ratio, + thumbnailHeight = 113 * ratio, + // 鍙兘鏈塸edding, ready, uploading, confirm, done. + state = '', + // 鎵鏈夋枃浠剁殑杩涘害淇℃伅锛宬ey涓篺ile id + percentages = {}, + supportTransition = (function () { + var s = document.createElement('p').style, + r = 'transition' in s || + 'WebkitTransition' in s || + 'MozTransition' in s || + 'msTransition' in s || + 'OTransition' in s; + s = null; + return r; + })(), + // WebUploader瀹炰緥 + uploader, + actionUrl = editor.getActionUrl(editor.getOpt('videoActionName')), + fileMaxSize = editor.getOpt('videoMaxSize'), + acceptExtensions = (editor.getOpt('videoAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');; + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
    ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('videoActionName')) { + $('#filePickerReady').after($('
    ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('videoFieldName'), + duplicate: true, + fileSingleSizeLimit: fileMaxSize, + compress: false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 褰撴湁鏂囦欢娣诲姞杩涙潵鏃舵墽琛岋紝璐熻矗view鐨勫垱寤 + function addFile(file) { + var $li = $('
  • ' + + '

    ' + file.name + '

    ' + + '

    ' + + '

    ' + + '
  • '), + + $btns = $('
    ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
    ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

    ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) { + $wrap.empty().addClass('notimage').append('' + + '' + file.name + ''); + } else { + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src || (/^data:/.test(src) && browser.ie && browser.version <= 7)) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + } + percentages[ file.id ] = [ file.size, 0 ]; + file.rotation = 0; + + /* 妫鏌ユ枃浠舵牸寮 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 鎴愬姛 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[ file.id ][ 1 ] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[ file.id ][ 1 ] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 璐熻矗view鐨勯攢姣 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[ file.id ]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[ 0 ]; + loaded += v[ 0 ] * v[ 1 ]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 鏈夋嫨鏂囦欢 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); $info.hide(); + uploader.refresh(); + break; + + /* 鍙互寮濮嬩笂浼 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 涓婁紶涓 */ + case 'uploading': + $progress.show(); $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 鏆傚仠涓婁紶 */ + case 'paused': + $progress.show(); $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount). + replace('_KB', WebUploader.formatSize(fileSize)). + replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 娣诲姞棰濆鐨凣ET鍙傛暟 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //杩欓噷鍙互閫氳繃data瀵硅薄娣诲姞POST鍙傛暟 + header['X_Requested_With'] = 'XMLHttpRequest'; + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[ file.id ][ 1 ] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + if (json.state == 'SUCCESS') { + uploadVideoList.push({ + 'url': json.url, + 'type': json.type, + 'original':json.original + }); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, file) { + if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { + addFile(file); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++]; ) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + refresh: function(){ + this.uploader.refresh(); + } + }; + +})(); \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/webapp/webapp.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/webapp/webapp.html new file mode 100644 index 00000000..16143779 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/webapp/webapp.html @@ -0,0 +1,53 @@ + + + + + + + + + +
    +
    +
    + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/fClipboard_ueditor.swf b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/fClipboard_ueditor.swf new file mode 100644 index 00000000..ac5d27f8 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/fClipboard_ueditor.swf differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/imageUploader.swf b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/imageUploader.swf new file mode 100644 index 00000000..2a554cad Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/imageUploader.swf differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/tangram.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/tangram.js new file mode 100644 index 00000000..2ebd8fd3 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/tangram.js @@ -0,0 +1,1495 @@ +// Copyright (c) 2009, Baidu Inc. All rights reserved. +// +// Licensed under the BSD License +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http:// tangram.baidu.com/license.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + /** + * @namespace T Tangram涓冨阀鏉 + * @name T + * @version 1.6.0 +*/ + +/** + * 澹版槑baidu鍖 + * @author: allstar, erik, meizz, berg + */ +var T, + baidu = T = baidu || {version: "1.5.0"}; +baidu.guid = "$BAIDU$"; +baidu.$$ = window[baidu.guid] = window[baidu.guid] || {global:{}}; + +/** + * 浣跨敤flash璧勬簮灏佽鐨勪竴浜涘姛鑳 + * @namespace baidu.flash + */ +baidu.flash = baidu.flash || {}; + +/** + * 鎿嶄綔dom鐨勬柟娉 + * @namespace baidu.dom + */ +baidu.dom = baidu.dom || {}; + + +/** + * 浠庢枃妗d腑鑾峰彇鎸囧畾鐨凞OM鍏冪礌 + * @name baidu.dom.g + * @function + * @grammar baidu.dom.g(id) + * @param {string|HTMLElement} id 鍏冪礌鐨刬d鎴朌OM鍏冪礌. + * @shortcut g,T.G + * @meta standard + * @see baidu.dom.q + * + * @return {HTMLElement|null} 鑾峰彇鐨勫厓绱狅紝鏌ユ壘涓嶅埌鏃惰繑鍥瀗ull,濡傛灉鍙傛暟涓嶅悎娉曪紝鐩存帴杩斿洖鍙傛暟. + */ +baidu.dom.g = function(id) { + if (!id) return null; + if ('string' == typeof id || id instanceof String) { + return document.getElementById(id); + } else if (id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) { + return id; + } + return null; +}; +baidu.g = baidu.G = baidu.dom.g; + + +/** + * 鎿嶄綔鏁扮粍鐨勬柟娉 + * @namespace baidu.array + */ + +baidu.array = baidu.array || {}; + + +/** + * 閬嶅巻鏁扮粍涓墍鏈夊厓绱 + * @name baidu.array.each + * @function + * @grammar baidu.array.each(source, iterator[, thisObject]) + * @param {Array} source 闇瑕侀亶鍘嗙殑鏁扮粍 + * @param {Function} iterator 瀵规瘡涓暟缁勫厓绱犺繘琛岃皟鐢ㄧ殑鍑芥暟锛岃鍑芥暟鏈変袱涓弬鏁帮紝绗竴涓负鏁扮粍鍏冪礌锛岀浜屼釜涓烘暟缁勭储寮曞硷紝function (item, index)銆 + * @param {Object} [thisObject] 鍑芥暟璋冪敤鏃剁殑this鎸囬拡锛屽鏋滄病鏈夋鍙傛暟锛岄粯璁ゆ槸褰撳墠閬嶅巻鐨勬暟缁 + * @remark + * each鏂规硶涓嶆敮鎸佸Object鐨勯亶鍘,瀵筄bject鐨勯亶鍘嗕娇鐢╞aidu.object.each 銆 + * @shortcut each + * @meta standard + * + * @returns {Array} 閬嶅巻鐨勬暟缁 + */ + +baidu.each = baidu.array.forEach = baidu.array.each = function (source, iterator, thisObject) { + var returnValue, item, i, len = source.length; + + if ('function' == typeof iterator) { + for (i = 0; i < len; i++) { + item = source[i]; + returnValue = iterator.call(thisObject || source, item, i); + + if (returnValue === false) { + break; + } + } + } + return source; +}; + +/** + * 瀵硅瑷灞傞潰鐨勫皝瑁咃紝鍖呮嫭绫诲瀷鍒ゆ柇銆佹ā鍧楁墿灞曘佺户鎵垮熀绫讳互鍙婂璞¤嚜瀹氫箟浜嬩欢鐨勬敮鎸併 + * @namespace baidu.lang + */ +baidu.lang = baidu.lang || {}; + + +/** + * 鍒ゆ柇鐩爣鍙傛暟鏄惁涓篺unction鎴朏unction瀹炰緥 + * @name baidu.lang.isFunction + * @function + * @grammar baidu.lang.isFunction(source) + * @param {Any} source 鐩爣鍙傛暟 + * @version 1.2 + * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate + * @meta standard + * @returns {boolean} 绫诲瀷鍒ゆ柇缁撴灉 + */ +baidu.lang.isFunction = function (source) { + return '[object Function]' == Object.prototype.toString.call(source); +}; + +/** + * 鍒ゆ柇鐩爣鍙傛暟鏄惁string绫诲瀷鎴朣tring瀵硅薄 + * @name baidu.lang.isString + * @function + * @grammar baidu.lang.isString(source) + * @param {Any} source 鐩爣鍙傛暟 + * @shortcut isString + * @meta standard + * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate + * + * @returns {boolean} 绫诲瀷鍒ゆ柇缁撴灉 + */ +baidu.lang.isString = function (source) { + return '[object String]' == Object.prototype.toString.call(source); +}; +baidu.isString = baidu.lang.isString; + + +/** + * 鍒ゆ柇娴忚鍣ㄧ被鍨嬪拰鐗规х殑灞炴 + * @namespace baidu.browser + */ +baidu.browser = baidu.browser || {}; + + +/** + * 鍒ゆ柇鏄惁涓簅pera娴忚鍣 + * @property opera opera鐗堟湰鍙 + * @grammar baidu.browser.opera + * @meta standard + * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome + * @returns {Number} opera鐗堟湰鍙 + */ + +/** + * opera 浠10寮濮嬩笉鏄敤opera鍚庨潰鐨勫瓧绗︿覆杩涜鐗堟湰鐨勫垽鏂 + * 鍦˙rowser identification鏈鍚庢坊鍔燰ersion + 鏁板瓧杩涜鐗堟湰鏍囪瘑 + * opera鍚庨潰鐨勬暟瀛椾繚鎸佸湪9.80涓嶅彉 + */ +baidu.browser.opera = /opera(\/| )(\d+(\.\d+)?)(.+?(version\/(\d+(\.\d+)?)))?/i.test(navigator.userAgent) ? + ( RegExp["\x246"] || RegExp["\x242"] ) : undefined; + + +/** + * 鍦ㄧ洰鏍囧厓绱犵殑鎸囧畾浣嶇疆鎻掑叆HTML浠g爜 + * @name baidu.dom.insertHTML + * @function + * @grammar baidu.dom.insertHTML(element, position, html) + * @param {HTMLElement|string} element 鐩爣鍏冪礌鎴栫洰鏍囧厓绱犵殑id + * @param {string} position 鎻掑叆html鐨勪綅缃俊鎭紝鍙栧间负beforeBegin,afterBegin,beforeEnd,afterEnd + * @param {string} html 瑕佹彃鍏ョ殑html + * @remark + * + * 瀵逛簬position鍙傛暟锛屽ぇ灏忓啓涓嶆晱鎰
    + * 鍙傛暟鐨勬剰鎬濓細beforeBegin<span>afterBegin this is span! beforeEnd</span> afterEnd
    + * 姝ゅ锛屽鏋滀娇鐢ㄦ湰鍑芥暟鎻掑叆甯︽湁script鏍囩鐨凥TML瀛楃涓诧紝script鏍囩瀵瑰簲鐨勮剼鏈皢涓嶄細琚墽琛屻 + * + * @shortcut insertHTML + * @meta standard + * + * @returns {HTMLElement} 鐩爣鍏冪礌 + */ +baidu.dom.insertHTML = function (element, position, html) { + element = baidu.dom.g(element); + var range,begin; + if (element.insertAdjacentHTML && !baidu.browser.opera) { + element.insertAdjacentHTML(position, html); + } else { + range = element.ownerDocument.createRange(); + position = position.toUpperCase(); + if (position == 'AFTERBEGIN' || position == 'BEFOREEND') { + range.selectNodeContents(element); + range.collapse(position == 'AFTERBEGIN'); + } else { + begin = position == 'BEFOREBEGIN'; + range[begin ? 'setStartBefore' : 'setEndAfter'](element); + range.collapse(begin); + } + range.insertNode(range.createContextualFragment(html)); + } + return element; +}; + +baidu.insertHTML = baidu.dom.insertHTML; + +/** + * 鎿嶄綔flash瀵硅薄鐨勬柟娉曪紝鍖呮嫭鍒涘缓flash瀵硅薄銆佽幏鍙杅lash瀵硅薄浠ュ強鍒ゆ柇flash鎻掍欢鐨勭増鏈彿 + * @namespace baidu.swf + */ +baidu.swf = baidu.swf || {}; + + +/** + * 娴忚鍣ㄦ敮鎸佺殑flash鎻掍欢鐗堟湰 + * @property version 娴忚鍣ㄦ敮鎸佺殑flash鎻掍欢鐗堟湰 + * @grammar baidu.swf.version + * @return {String} 鐗堟湰鍙 + * @meta standard + */ +baidu.swf.version = (function () { + var n = navigator; + if (n.plugins && n.mimeTypes.length) { + var plugin = n.plugins["Shockwave Flash"]; + if (plugin && plugin.description) { + return plugin.description + .replace(/([a-zA-Z]|\s)+/, "") + .replace(/(\s)+r/, ".") + ".0"; + } + } else if (window.ActiveXObject && !window.opera) { + for (var i = 12; i >= 2; i--) { + try { + var c = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + i); + if (c) { + var version = c.GetVariable("$version"); + return version.replace(/WIN/g,'').replace(/,/g,'.'); + } + } catch(e) {} + } + } +})(); + +/** + * 鎿嶄綔瀛楃涓茬殑鏂规硶 + * @namespace baidu.string + */ +baidu.string = baidu.string || {}; + + +/** + * 瀵圭洰鏍囧瓧绗︿覆杩涜html缂栫爜 + * @name baidu.string.encodeHTML + * @function + * @grammar baidu.string.encodeHTML(source) + * @param {string} source 鐩爣瀛楃涓 + * @remark + * 缂栫爜瀛楃鏈5涓細&<>"' + * @shortcut encodeHTML + * @meta standard + * @see baidu.string.decodeHTML + * + * @returns {string} html缂栫爜鍚庣殑瀛楃涓 + */ +baidu.string.encodeHTML = function (source) { + return String(source) + .replace(/&/g,'&') + .replace(//g,'>') + .replace(/"/g, """) + .replace(/'/g, "'"); +}; + +baidu.encodeHTML = baidu.string.encodeHTML; + +/** + * 鍒涘缓flash瀵硅薄鐨刪tml瀛楃涓 + * @name baidu.swf.createHTML + * @function + * @grammar baidu.swf.createHTML(options) + * + * @param {Object} options 鍒涘缓flash鐨勯夐」鍙傛暟 + * @param {string} options.id 瑕佸垱寤虹殑flash鐨勬爣璇 + * @param {string} options.url flash鏂囦欢鐨剈rl + * @param {String} options.errorMessage 鏈畨瑁協lash player鎴杅lash player鐗堟湰鍙疯繃浣庢椂鐨勬彁绀 + * @param {string} options.ver 鏈浣庨渶瑕佺殑flash player鐗堟湰鍙 + * @param {string} options.width flash鐨勫搴 + * @param {string} options.height flash鐨勯珮搴 + * @param {string} options.align flash鐨勫榻愭柟寮忥紝鍏佽鍊硷細middle/left/right/top/bottom + * @param {string} options.base 璁剧疆鐢ㄤ簬瑙f瀽swf鏂囦欢涓殑鎵鏈夌浉瀵硅矾寰勮鍙ョ殑鍩烘湰鐩綍鎴朥RL + * @param {string} options.bgcolor swf鏂囦欢鐨勮儗鏅壊 + * @param {string} options.salign 璁剧疆缂╂斁鐨剆wf鏂囦欢鍦ㄧ敱width鍜宧eight璁剧疆瀹氫箟鐨勫尯鍩熷唴鐨勪綅缃傚厑璁稿硷細l/r/t/b/tl/tr/bl/br + * @param {boolean} options.menu 鏄惁鏄剧ず鍙抽敭鑿滃崟锛屽厑璁稿硷細true/false + * @param {boolean} options.loop 鎾斁鍒版渶鍚庝竴甯ф椂鏄惁閲嶆柊鎾斁锛屽厑璁稿硷細 true/false + * @param {boolean} options.play flash鏄惁鍦ㄦ祻瑙堝櫒鍔犺浇鏃跺氨寮濮嬫挱鏀俱傚厑璁稿硷細true/false + * @param {string} options.quality 璁剧疆flash鎾斁鐨勭敾璐紝鍏佽鍊硷細low/medium/high/autolow/autohigh/best + * @param {string} options.scale 璁剧疆flash鍐呭濡備綍缂╂斁鏉ラ傚簲璁剧疆鐨勫楂樸傚厑璁稿硷細showall/noborder/exactfit + * @param {string} options.wmode 璁剧疆flash鐨勬樉绀烘ā寮忋傚厑璁稿硷細window/opaque/transparent + * @param {string} options.allowscriptaccess 璁剧疆flash涓庨〉闈㈢殑閫氫俊鏉冮檺銆傚厑璁稿硷細always/never/sameDomain + * @param {string} options.allownetworking 璁剧疆swf鏂囦欢涓厑璁镐娇鐢ㄧ殑缃戠粶API銆傚厑璁稿硷細all/internal/none + * @param {boolean} options.allowfullscreen 鏄惁鍏佽flash鍏ㄥ睆銆傚厑璁稿硷細true/false + * @param {boolean} options.seamlesstabbing 鍏佽璁剧疆鎵ц鏃犵紳璺虫牸锛屼粠鑰屼娇鐢ㄦ埛鑳借烦鍑篺lash搴旂敤绋嬪簭銆傝鍙傛暟鍙兘鍦ㄥ畨瑁匜lash7鍙婃洿楂樼増鏈殑Windows涓娇鐢ㄣ傚厑璁稿硷細true/false + * @param {boolean} options.devicefont 璁剧疆闈欐佹枃鏈璞℃槸鍚︿互璁惧瀛椾綋鍛堢幇銆傚厑璁稿硷細true/false + * @param {boolean} options.swliveconnect 绗竴娆″姞杞絝lash鏃舵祻瑙堝櫒鏄惁搴斿惎鍔↗ava銆傚厑璁稿硷細true/false + * @param {Object} options.vars 瑕佷紶閫掔粰flash鐨勫弬鏁帮紝鏀寔JSON鎴杝tring绫诲瀷銆 + * + * @see baidu.swf.create + * @meta standard + * @returns {string} flash瀵硅薄鐨刪tml瀛楃涓 + */ +baidu.swf.createHTML = function (options) { + options = options || {}; + var version = baidu.swf.version, + needVersion = options['ver'] || '6.0.0', + vUnit1, vUnit2, i, k, len, item, tmpOpt = {}, + encodeHTML = baidu.string.encodeHTML; + for (k in options) { + tmpOpt[k] = options[k]; + } + options = tmpOpt; + if (version) { + version = version.split('.'); + needVersion = needVersion.split('.'); + for (i = 0; i < 3; i++) { + vUnit1 = parseInt(version[i], 10); + vUnit2 = parseInt(needVersion[i], 10); + if (vUnit2 < vUnit1) { + break; + } else if (vUnit2 > vUnit1) { + return ''; + } + } + } else { + return ''; + } + + var vars = options['vars'], + objProperties = ['classid', 'codebase', 'id', 'width', 'height', 'align']; + options['align'] = options['align'] || 'middle'; + options['classid'] = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000'; + options['codebase'] = 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0'; + options['movie'] = options['url'] || ''; + delete options['vars']; + delete options['url']; + if ('string' == typeof vars) { + options['flashvars'] = vars; + } else { + var fvars = []; + for (k in vars) { + item = vars[k]; + fvars.push(k + "=" + encodeURIComponent(item)); + } + options['flashvars'] = fvars.join('&'); + } + var str = [''); + var params = { + 'wmode' : 1, + 'scale' : 1, + 'quality' : 1, + 'play' : 1, + 'loop' : 1, + 'menu' : 1, + 'salign' : 1, + 'bgcolor' : 1, + 'base' : 1, + 'allowscriptaccess' : 1, + 'allownetworking' : 1, + 'allowfullscreen' : 1, + 'seamlesstabbing' : 1, + 'devicefont' : 1, + 'swliveconnect' : 1, + 'flashvars' : 1, + 'movie' : 1 + }; + + for (k in options) { + item = options[k]; + k = k.toLowerCase(); + if (params[k] && (item || item === false || item === 0)) { + str.push(''); + } + } + options['src'] = options['movie']; + options['name'] = options['id']; + delete options['id']; + delete options['movie']; + delete options['classid']; + delete options['codebase']; + options['type'] = 'application/x-shockwave-flash'; + options['pluginspage'] = 'http://www.macromedia.com/go/getflashplayer'; + str.push(''); + + return str.join(''); +}; + + +/** + * 鍦ㄩ〉闈腑鍒涘缓涓涓猣lash瀵硅薄 + * @name baidu.swf.create + * @function + * @grammar baidu.swf.create(options[, container]) + * + * @param {Object} options 鍒涘缓flash鐨勯夐」鍙傛暟 + * @param {string} options.id 瑕佸垱寤虹殑flash鐨勬爣璇 + * @param {string} options.url flash鏂囦欢鐨剈rl + * @param {String} options.errorMessage 鏈畨瑁協lash player鎴杅lash player鐗堟湰鍙疯繃浣庢椂鐨勬彁绀 + * @param {string} options.ver 鏈浣庨渶瑕佺殑flash player鐗堟湰鍙 + * @param {string} options.width flash鐨勫搴 + * @param {string} options.height flash鐨勯珮搴 + * @param {string} options.align flash鐨勫榻愭柟寮忥紝鍏佽鍊硷細middle/left/right/top/bottom + * @param {string} options.base 璁剧疆鐢ㄤ簬瑙f瀽swf鏂囦欢涓殑鎵鏈夌浉瀵硅矾寰勮鍙ョ殑鍩烘湰鐩綍鎴朥RL + * @param {string} options.bgcolor swf鏂囦欢鐨勮儗鏅壊 + * @param {string} options.salign 璁剧疆缂╂斁鐨剆wf鏂囦欢鍦ㄧ敱width鍜宧eight璁剧疆瀹氫箟鐨勫尯鍩熷唴鐨勪綅缃傚厑璁稿硷細l/r/t/b/tl/tr/bl/br + * @param {boolean} options.menu 鏄惁鏄剧ず鍙抽敭鑿滃崟锛屽厑璁稿硷細true/false + * @param {boolean} options.loop 鎾斁鍒版渶鍚庝竴甯ф椂鏄惁閲嶆柊鎾斁锛屽厑璁稿硷細 true/false + * @param {boolean} options.play flash鏄惁鍦ㄦ祻瑙堝櫒鍔犺浇鏃跺氨寮濮嬫挱鏀俱傚厑璁稿硷細true/false + * @param {string} options.quality 璁剧疆flash鎾斁鐨勭敾璐紝鍏佽鍊硷細low/medium/high/autolow/autohigh/best + * @param {string} options.scale 璁剧疆flash鍐呭濡備綍缂╂斁鏉ラ傚簲璁剧疆鐨勫楂樸傚厑璁稿硷細showall/noborder/exactfit + * @param {string} options.wmode 璁剧疆flash鐨勬樉绀烘ā寮忋傚厑璁稿硷細window/opaque/transparent + * @param {string} options.allowscriptaccess 璁剧疆flash涓庨〉闈㈢殑閫氫俊鏉冮檺銆傚厑璁稿硷細always/never/sameDomain + * @param {string} options.allownetworking 璁剧疆swf鏂囦欢涓厑璁镐娇鐢ㄧ殑缃戠粶API銆傚厑璁稿硷細all/internal/none + * @param {boolean} options.allowfullscreen 鏄惁鍏佽flash鍏ㄥ睆銆傚厑璁稿硷細true/false + * @param {boolean} options.seamlesstabbing 鍏佽璁剧疆鎵ц鏃犵紳璺虫牸锛屼粠鑰屼娇鐢ㄦ埛鑳借烦鍑篺lash搴旂敤绋嬪簭銆傝鍙傛暟鍙兘鍦ㄥ畨瑁匜lash7鍙婃洿楂樼増鏈殑Windows涓娇鐢ㄣ傚厑璁稿硷細true/false + * @param {boolean} options.devicefont 璁剧疆闈欐佹枃鏈璞℃槸鍚︿互璁惧瀛椾綋鍛堢幇銆傚厑璁稿硷細true/false + * @param {boolean} options.swliveconnect 绗竴娆″姞杞絝lash鏃舵祻瑙堝櫒鏄惁搴斿惎鍔↗ava銆傚厑璁稿硷細true/false + * @param {Object} options.vars 瑕佷紶閫掔粰flash鐨勫弬鏁帮紝鏀寔JSON鎴杝tring绫诲瀷銆 + * + * @param {HTMLElement|string} [container] flash瀵硅薄鐨勭埗瀹瑰櫒鍏冪礌锛屼笉浼犻掕鍙傛暟鏃跺湪褰撳墠浠g爜浣嶇疆鍒涘缓flash瀵硅薄銆 + * @meta standard + * @see baidu.swf.createHTML,baidu.swf.getMovie + */ +baidu.swf.create = function (options, target) { + options = options || {}; + var html = baidu.swf.createHTML(options) + || options['errorMessage'] + || ''; + + if (target && 'string' == typeof target) { + target = document.getElementById(target); + } + baidu.dom.insertHTML( target || document.body ,'beforeEnd',html ); +}; +/** + * 鍒ゆ柇鏄惁涓篿e娴忚鍣 + * @name baidu.browser.ie + * @field + * @grammar baidu.browser.ie + * @returns {Number} IE鐗堟湰鍙 + */ +baidu.browser.ie = baidu.ie = /msie (\d+\.\d+)/i.test(navigator.userAgent) ? (document.documentMode || + RegExp['\x241']) : undefined; + +/** + * 绉婚櫎鏁扮粍涓殑椤 + * @name baidu.array.remove + * @function + * @grammar baidu.array.remove(source, match) + * @param {Array} source 闇瑕佺Щ闄ら」鐨勬暟缁 + * @param {Any} match 瑕佺Щ闄ょ殑椤 + * @meta standard + * @see baidu.array.removeAt + * + * @returns {Array} 绉婚櫎鍚庣殑鏁扮粍 + */ +baidu.array.remove = function (source, match) { + var len = source.length; + + while (len--) { + if (len in source && source[len] === match) { + source.splice(len, 1); + } + } + return source; +}; + +/** + * 鍒ゆ柇鐩爣鍙傛暟鏄惁Array瀵硅薄 + * @name baidu.lang.isArray + * @function + * @grammar baidu.lang.isArray(source) + * @param {Any} source 鐩爣鍙傛暟 + * @meta standard + * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate + * + * @returns {boolean} 绫诲瀷鍒ゆ柇缁撴灉 + */ +baidu.lang.isArray = function (source) { + return '[object Array]' == Object.prototype.toString.call(source); +}; + + + +/** + * 灏嗕竴涓彉閲忚浆鎹㈡垚array + * @name baidu.lang.toArray + * @function + * @grammar baidu.lang.toArray(source) + * @param {mix} source 闇瑕佽浆鎹㈡垚array鐨勫彉閲 + * @version 1.3 + * @meta standard + * @returns {array} 杞崲鍚庣殑array + */ +baidu.lang.toArray = function (source) { + if (source === null || source === undefined) + return []; + if (baidu.lang.isArray(source)) + return source; + if (typeof source.length !== 'number' || typeof source === 'string' || baidu.lang.isFunction(source)) { + return [source]; + } + if (source.item) { + var l = source.length, array = new Array(l); + while (l--) + array[l] = source[l]; + return array; + } + + return [].slice.call(source); +}; + +/** + * 鑾峰緱flash瀵硅薄鐨勫疄渚 + * @name baidu.swf.getMovie + * @function + * @grammar baidu.swf.getMovie(name) + * @param {string} name flash瀵硅薄鐨勫悕绉 + * @see baidu.swf.create + * @meta standard + * @returns {HTMLElement} flash瀵硅薄鐨勫疄渚 + */ +baidu.swf.getMovie = function (name) { + var movie = document[name], ret; + return baidu.browser.ie == 9 ? + movie && movie.length ? + (ret = baidu.array.remove(baidu.lang.toArray(movie),function(item){ + return item.tagName.toLowerCase() != "embed"; + })).length == 1 ? ret[0] : ret + : movie + : movie || window[name]; +}; + + +baidu.flash._Base = (function(){ + + var prefix = 'bd__flash__'; + + /** + * 鍒涘缓涓涓殢鏈虹殑瀛楃涓 + * @private + * @return {String} + */ + function _createString(){ + return prefix + Math.floor(Math.random() * 2147483648).toString(36); + }; + + /** + * 妫鏌lash鐘舵 + * @private + * @param {Object} target flash瀵硅薄 + * @return {Boolean} + */ + function _checkReady(target){ + if(typeof target !== 'undefined' && typeof target.flashInit !== 'undefined' && target.flashInit()){ + return true; + }else{ + return false; + } + }; + + /** + * 璋冪敤涔嬪墠杩涜鍘嬫爤鐨勫嚱鏁 + * @private + * @param {Array} callQueue 璋冪敤闃熷垪 + * @param {Object} target flash瀵硅薄 + * @return {Null} + */ + function _callFn(callQueue, target){ + var result = null; + + callQueue = callQueue.reverse(); + baidu.each(callQueue, function(item){ + result = target.call(item.fnName, item.params); + item.callBack(result); + }); + }; + + /** + * 涓轰紶鍏ョ殑鍖垮悕鍑芥暟鍒涘缓鍑芥暟鍚 + * @private + * @param {String|Function} fun 浼犲叆鐨勫尶鍚嶅嚱鏁版垨鑰呭嚱鏁板悕 + * @return {String} + */ + function _createFunName(fun){ + var name = ''; + + if(baidu.lang.isFunction(fun)){ + name = _createString(); + window[name] = function(){ + fun.apply(window, arguments); + }; + + return name; + }else if(baidu.lang.isString){ + return fun; + } + }; + + /** + * 缁樺埗flash + * @private + * @param {Object} options 鍒涘缓鍙傛暟 + * @return {Object} + */ + function _render(options){ + if(!options.id){ + options.id = _createString(); + } + + var container = options.container || ''; + delete(options.container); + + baidu.swf.create(options, container); + + return baidu.swf.getMovie(options.id); + }; + + return function(options, callBack){ + var me = this, + autoRender = (typeof options.autoRender !== 'undefined' ? options.autoRender : true), + createOptions = options.createOptions || {}, + target = null, + isReady = false, + callQueue = [], + timeHandle = null, + callBack = callBack || []; + + /** + * 灏唂lash鏂囦欢缁樺埗鍒伴〉闈笂 + * @public + * @return {Null} + */ + me.render = function(){ + target = _render(createOptions); + + if(callBack.length > 0){ + baidu.each(callBack, function(funName, index){ + callBack[index] = _createFunName(options[funName] || new Function()); + }); + } + me.call('setJSFuncName', [callBack]); + }; + + /** + * 杩斿洖flash鐘舵 + * @return {Boolean} + */ + me.isReady = function(){ + return isReady; + }; + + /** + * 璋冪敤flash鎺ュ彛鐨勭粺涓鍏ュ彛 + * @param {String} fnName 璋冪敤鐨勫嚱鏁板悕 + * @param {Array} params 浼犲叆鐨勫弬鏁扮粍鎴愮殑鏁扮粍,鑻ヤ笉璁歌鍙傛暟锛岄渶浼犲叆绌烘暟缁 + * @param {Function} [callBack] 寮傛璋冪敤鍚庡皢杩斿洖鍊间綔涓哄弬鏁扮殑璋冪敤鍥炶皟鍑芥暟锛屽鏃犺繑鍥炲硷紝鍙互涓嶄紶鍏ユ鍙傛暟 + * @return {Null} + */ + me.call = function(fnName, params, callBack){ + if(!fnName) return null; + callBack = callBack || new Function(); + + var result = null; + + if(isReady){ + result = target.call(fnName, params); + callBack(result); + }else{ + callQueue.push({ + fnName: fnName, + params: params, + callBack: callBack + }); + + (!timeHandle) && (timeHandle = setInterval(_check, 200)); + } + }; + + /** + * 涓轰紶鍏ョ殑鍖垮悕鍑芥暟鍒涘缓鍑芥暟鍚 + * @public + * @param {String|Function} fun 浼犲叆鐨勫尶鍚嶅嚱鏁版垨鑰呭嚱鏁板悕 + * @return {String} + */ + me.createFunName = function(fun){ + return _createFunName(fun); + }; + + /** + * 妫鏌lash鏄惁ready锛 骞惰繘琛岃皟鐢 + * @private + * @return {Null} + */ + function _check(){ + if(_checkReady(target)){ + clearInterval(timeHandle); + timeHandle = null; + _call(); + + isReady = true; + } + }; + + /** + * 璋冪敤涔嬪墠杩涜鍘嬫爤鐨勫嚱鏁 + * @private + * @return {Null} + */ + function _call(){ + _callFn(callQueue, target); + callQueue = []; + } + + autoRender && me.render(); + }; +})(); + + + +/** + * 鍒涘缓flash based imageUploader + * @class + * @grammar baidu.flash.imageUploader(options) + * @param {Object} createOptions 鍒涘缓flash鏃堕渶瑕佺殑鍙傛暟锛岃鍙傜収baidu.swf.create鏂囨。 + * @config {Object} vars 鍒涘缓imageUploader鏃舵墍闇瑕佺殑鍙傛暟 + * @config {Number} vars.gridWidth 姣忎竴涓瑙堝浘鐗囨墍鍗犵殑瀹藉害锛屽簲璇ヤ负flash瀵涚殑鏁撮櫎 + * @config {Number} vars.gridHeight 姣忎竴涓瑙堝浘鐗囨墍鍗犵殑楂樺害锛屽簲璇ヤ负flash楂樼殑鏁撮櫎 + * @config {Number} vars.picWidth 鍗曞紶棰勮鍥剧墖鐨勫搴 + * @config {Number} vars.picHeight 鍗曞紶棰勮鍥剧墖鐨勯珮搴 + * @config {String} vars.uploadDataFieldName POST璇锋眰涓浘鐗囨暟鎹殑key,榛樿鍊'picdata' + * @config {String} vars.picDescFieldName POST璇锋眰涓浘鐗囨弿杩扮殑key,榛樿鍊'picDesc' + * @config {Number} vars.maxSize 鏂囦欢鐨勬渶澶т綋绉,鍗曚綅'MB' + * @config {Number} vars.compressSize 涓婁紶鍓嶅鏋滃浘鐗囦綋绉秴杩囪鍊硷紝浼氬厛鍘嬬缉 + * @config {Number} vars.maxNum:32 鏈澶т笂浼犲灏戜釜鏂囦欢 + * @config {Number} vars.compressLength 鑳芥帴鍙楃殑鏈澶ц竟闀匡紝瓒呰繃璇ュ间細绛夋瘮鍘嬬缉 + * @config {String} vars.url 涓婁紶鐨剈rl鍦板潃 + * @config {Number} vars.mode mode == 0鏃讹紝鏄娇鐢ㄦ粴鍔ㄦ潯锛宮ode == 1鏃讹紝鎷変几flash, 榛樿鍊间负0 + * @see baidu.swf.createHTML + * @param {String} backgroundUrl 鑳屾櫙鍥剧墖璺緞 + * @param {String} listBacgroundkUrl 甯冨眬鎺т欢鑳屾櫙 + * @param {String} buttonUrl 鎸夐挳鍥剧墖涓嶈儗鏅 + * @param {String|Function} selectFileCallback 閫夋嫨鏂囦欢鐨勫洖璋 + * @param {String|Function} exceedFileCallback鏂囦欢瓒呭嚭闄愬埗鐨勬渶澶т綋绉椂鐨勫洖璋 + * @param {String|Function} deleteFileCallback 鍒犻櫎鏂囦欢鐨勫洖璋 + * @param {String|Function} startUploadCallback 寮濮嬩笂浼犳煇涓枃浠舵椂鐨勫洖璋 + * @param {String|Function} uploadCompleteCallback 鏌愪釜鏂囦欢涓婁紶瀹屾垚鐨勫洖璋 + * @param {String|Function} uploadErrorCallback 鏌愪釜鏂囦欢涓婁紶澶辫触鐨勫洖璋 + * @param {String|Function} allCompleteCallback 鍏ㄩ儴涓婁紶瀹屾垚鏃剁殑鍥炶皟 + * @param {String|Function} changeFlashHeight 鏀瑰彉Flash鐨勯珮搴︼紝mode==1鐨勬椂鍊欐墠鏈夌敤 + */ +baidu.flash.imageUploader = baidu.flash.imageUploader || function(options){ + + var me = this, + options = options || {}, + _flash = new baidu.flash._Base(options, [ + 'selectFileCallback', + 'exceedFileCallback', + 'deleteFileCallback', + 'startUploadCallback', + 'uploadCompleteCallback', + 'uploadErrorCallback', + 'allCompleteCallback', + 'changeFlashHeight' + ]); + /** + * 寮濮嬫垨鍥炲涓婁紶鍥剧墖 + * @public + * @return {Null} + */ + me.upload = function(){ + _flash.call('upload'); + }; + + /** + * 鏆傚仠涓婁紶鍥剧墖 + * @public + * @return {Null} + */ + me.pause = function(){ + _flash.call('pause'); + }; + me.addCustomizedParams = function(index,obj){ + _flash.call('addCustomizedParams',[index,obj]); + } +}; + +/** + * 鎿嶄綔鍘熺敓瀵硅薄鐨勬柟娉 + * @namespace baidu.object + */ +baidu.object = baidu.object || {}; + + +/** + * 灏嗘簮瀵硅薄鐨勬墍鏈夊睘鎬ф嫹璐濆埌鐩爣瀵硅薄涓 + * @author erik + * @name baidu.object.extend + * @function + * @grammar baidu.object.extend(target, source) + * @param {Object} target 鐩爣瀵硅薄 + * @param {Object} source 婧愬璞 + * @see baidu.array.merge + * @remark + * +1.鐩爣瀵硅薄涓紝涓庢簮瀵硅薄key鐩稿悓鐨勬垚鍛樺皢浼氳瑕嗙洊銆
    +2.婧愬璞$殑prototype鎴愬憳涓嶄細鎷疯礉銆 + + * @shortcut extend + * @meta standard + * + * @returns {Object} 鐩爣瀵硅薄 + */ +baidu.extend = +baidu.object.extend = function (target, source) { + for (var p in source) { + if (source.hasOwnProperty(p)) { + target[p] = source[p]; + } + } + + return target; +}; + + + + + +/** + * 鍒涘缓flash based fileUploader + * @class + * @grammar baidu.flash.fileUploader(options) + * @param {Object} options + * @config {Object} createOptions 鍒涘缓flash鏃堕渶瑕佺殑鍙傛暟锛岃鍙傜収baidu.swf.create鏂囨。 + * @config {String} createOptions.width + * @config {String} createOptions.height + * @config {Number} maxNum 鏈澶у彲閫夋枃浠舵暟 + * @config {Function|String} selectFile + * @config {Function|String} exceedMaxSize + * @config {Function|String} deleteFile + * @config {Function|String} uploadStart + * @config {Function|String} uploadComplete + * @config {Function|String} uploadError + * @config {Function|String} uploadProgress + */ +baidu.flash.fileUploader = baidu.flash.fileUploader || function(options){ + var me = this, + options = options || {}; + + options.createOptions = baidu.extend({ + wmod: 'transparent' + },options.createOptions || {}); + + var _flash = new baidu.flash._Base(options, [ + 'selectFile', + 'exceedMaxSize', + 'deleteFile', + 'uploadStart', + 'uploadComplete', + 'uploadError', + 'uploadProgress' + ]); + + _flash.call('setMaxNum', options.maxNum ? [options.maxNum] : [1]); + + /** + * 璁剧疆褰撻紶鏍囩Щ鍔ㄥ埌flash涓婃椂锛屾槸鍚﹀彉鎴愭墜鍨 + * @public + * @param {Boolean} isCursor + * @return {Null} + */ + me.setHandCursor = function(isCursor){ + _flash.call('setHandCursor', [isCursor || false]); + }; + + /** + * 璁剧疆榧犳爣鐩稿簲鍑芥暟鍚 + * @param {String|Function} fun + */ + me.setMSFunName = function(fun){ + _flash.call('setMSFunName',[_flash.createFunName(fun)]); + }; + + /** + * 鎵ц涓婁紶鎿嶄綔 + * @param {String} url 涓婁紶鐨剈rl + * @param {String} fieldName 涓婁紶鐨勮〃鍗曞瓧娈靛悕 + * @param {Object} postData 閿煎锛屼笂浼犵殑POST鏁版嵁 + * @param {Number|Array|null|-1} [index]涓婁紶鐨勬枃浠跺簭鍒 + * Int鍊间笂浼犺鏂囦欢 + * Array涓娆′覆琛屼笂浼犺搴忓垪鏂囦欢 + * -1/null涓婁紶鎵鏈夋枃浠 + * @return {Null} + */ + me.upload = function(url, fieldName, postData, index){ + + if(typeof url !== 'string' || typeof fieldName !== 'string') return null; + if(typeof index === 'undefined') index = -1; + + _flash.call('upload', [url, fieldName, postData, index]); + }; + + /** + * 鍙栨秷涓婁紶鎿嶄綔 + * @public + * @param {Number|-1} index + */ + me.cancel = function(index){ + if(typeof index === 'undefined') index = -1; + _flash.call('cancel', [index]); + }; + + /** + * 鍒犻櫎鏂囦欢 + * @public + * @param {Number|Array} [index] 瑕佸垹闄ょ殑index锛屼笉浼犲垯鍏ㄩ儴鍒犻櫎 + * @param {Function} callBack + * */ + me.deleteFile = function(index, callBack){ + + var callBackAll = function(list){ + callBack && callBack(list); + }; + + if(typeof index === 'undefined'){ + _flash.call('deleteFilesAll', [], callBackAll); + return; + }; + + if(typeof index === 'Number') index = [index]; + index.sort(function(a,b){ + return b-a; + }); + baidu.each(index, function(item){ + _flash.call('deleteFileBy', item, callBackAll); + }); + }; + + /** + * 娣诲姞鏂囦欢绫诲瀷锛屾敮鎸乵acType + * @public + * @param {Object|Array[Object]} type {description:String, extention:String} + * @return {Null}; + */ + me.addFileType = function(type){ + var type = type || [[]]; + + if(type instanceof Array) type = [type]; + else type = [[type]]; + _flash.call('addFileTypes', type); + }; + + /** + * 璁剧疆鏂囦欢绫诲瀷锛屾敮鎸乵acType + * @public + * @param {Object|Array[Object]} type {description:String, extention:String} + * @return {Null}; + */ + me.setFileType = function(type){ + var type = type || [[]]; + + if(type instanceof Array) type = [type]; + else type = [[type]]; + _flash.call('setFileTypes', type); + }; + + /** + * 璁剧疆鍙夋枃浠剁殑鏁伴噺闄愬埗 + * @public + * @param {Number} num + * @return {Null} + */ + me.setMaxNum = function(num){ + _flash.call('setMaxNum', [num]); + }; + + /** + * 璁剧疆鍙夋枃浠跺ぇ灏忛檺鍒讹紝浠ュ厗M涓哄崟浣 + * @public + * @param {Number} num,0涓烘棤闄愬埗 + * @return {Null} + */ + me.setMaxSize = function(num){ + _flash.call('setMaxSize', [num]); + }; + + /** + * @public + */ + me.getFileAll = function(callBack){ + _flash.call('getFileAll', [], callBack); + }; + + /** + * @public + * @param {Number} index + * @param {Function} [callBack] + */ + me.getFileByIndex = function(index, callBack){ + _flash.call('getFileByIndex', [], callBack); + }; + + /** + * @public + * @param {Number} index + * @param {function} [callBack] + */ + me.getStatusByIndex = function(index, callBack){ + _flash.call('getStatusByIndex', [], callBack); + }; +}; + +/** + * 浣跨敤鍔ㄦ乻cript鏍囩璇锋眰鏈嶅姟鍣ㄨ祫婧愶紝鍖呮嫭鐢辨湇鍔″櫒绔殑鍥炶皟鍜屾祻瑙堝櫒绔殑鍥炶皟 + * @namespace baidu.sio + */ +baidu.sio = baidu.sio || {}; + +/** + * + * @param {HTMLElement} src script鑺傜偣 + * @param {String} url script鑺傜偣鐨勫湴鍧 + * @param {String} [charset] 缂栫爜 + */ +baidu.sio._createScriptTag = function(scr, url, charset){ + scr.setAttribute('type', 'text/javascript'); + charset && scr.setAttribute('charset', charset); + scr.setAttribute('src', url); + document.getElementsByTagName('head')[0].appendChild(scr); +}; + +/** + * 鍒犻櫎script鐨勫睘鎬э紝鍐嶅垹闄cript鏍囩锛屼互瑙e喅淇鍐呭瓨娉勬紡鐨勯棶棰 + * + * @param {HTMLElement} src script鑺傜偣 + */ +baidu.sio._removeScriptTag = function(scr){ + if (scr.clearAttributes) { + scr.clearAttributes(); + } else { + for (var attr in scr) { + if (scr.hasOwnProperty(attr)) { + delete scr[attr]; + } + } + } + if(scr && scr.parentNode){ + scr.parentNode.removeChild(scr); + } + scr = null; +}; + + +/** + * 閫氳繃script鏍囩鍔犺浇鏁版嵁锛屽姞杞藉畬鎴愮敱娴忚鍣ㄧ瑙﹀彂鍥炶皟 + * @name baidu.sio.callByBrowser + * @function + * @grammar baidu.sio.callByBrowser(url, opt_callback, opt_options) + * @param {string} url 鍔犺浇鏁版嵁鐨剈rl + * @param {Function|string} opt_callback 鏁版嵁鍔犺浇缁撴潫鏃惰皟鐢ㄧ殑鍑芥暟鎴栧嚱鏁板悕 + * @param {Object} opt_options 鍏朵粬鍙夐」 + * @config {String} [charset] script鐨勫瓧绗﹂泦 + * @config {Integer} [timeOut] 瓒呮椂鏃堕棿锛岃秴杩囪繖涓椂闂村皢涓嶅啀鍝嶅簲鏈姹傦紝骞惰Е鍙憃nfailure鍑芥暟 + * @config {Function} [onfailure] timeOut璁惧畾鍚庢墠鐢熸晥锛屽埌杈捐秴鏃舵椂闂存椂瑙﹀彂鏈嚱鏁 + * @remark + * 1銆佷笌callByServer涓嶅悓锛宑allback鍙傛暟鍙敮鎸丗unction绫诲瀷锛屼笉鏀寔string銆 + * 2銆佸鏋滆姹備簡涓涓笉瀛樺湪鐨勯〉闈紝callback鍑芥暟鍦↖E/opera涓嬩篃浼氳璋冪敤锛屽洜姝や娇鐢ㄨ呴渶瑕佸湪onsuccess鍑芥暟涓垽鏂暟鎹槸鍚︽纭姞杞姐 + * @meta standard + * @see baidu.sio.callByServer + */ +baidu.sio.callByBrowser = function (url, opt_callback, opt_options) { + var scr = document.createElement("SCRIPT"), + scriptLoaded = 0, + options = opt_options || {}, + charset = options['charset'], + callback = opt_callback || function(){}, + timeOut = options['timeOut'] || 0, + timer; + scr.onload = scr.onreadystatechange = function () { + if (scriptLoaded) { + return; + } + + var readyState = scr.readyState; + if ('undefined' == typeof readyState + || readyState == "loaded" + || readyState == "complete") { + scriptLoaded = 1; + try { + callback(); + clearTimeout(timer); + } finally { + scr.onload = scr.onreadystatechange = null; + baidu.sio._removeScriptTag(scr); + } + } + }; + + if( timeOut ){ + timer = setTimeout(function(){ + scr.onload = scr.onreadystatechange = null; + baidu.sio._removeScriptTag(scr); + options.onfailure && options.onfailure(); + }, timeOut); + } + + baidu.sio._createScriptTag(scr, url, charset); +}; + +/** + * 閫氳繃script鏍囩鍔犺浇鏁版嵁锛屽姞杞藉畬鎴愮敱鏈嶅姟鍣ㄧ瑙﹀彂鍥炶皟 + * @name baidu.sio.callByServer + * @function + * @grammar baidu.sio.callByServer(url, callback[, opt_options]) + * @param {string} url 鍔犺浇鏁版嵁鐨剈rl. + * @param {Function|string} callback 鏈嶅姟鍣ㄧ璋冪敤鐨勫嚱鏁版垨鍑芥暟鍚嶃傚鏋滄病鏈夋寚瀹氭湰鍙傛暟锛屽皢鍦║RL涓鎵緊ptions['queryField']鍋氫负callback鐨勬柟娉曞悕. + * @param {Object} opt_options 鍔犺浇鏁版嵁鏃剁殑閫夐」. + * @config {string} [charset] script鐨勫瓧绗﹂泦 + * @config {string} [queryField] 鏈嶅姟鍣ㄧcallback璇锋眰瀛楁鍚嶏紝榛樿涓篶allback + * @config {Integer} [timeOut] 瓒呮椂鏃堕棿(鍗曚綅锛歮s)锛岃秴杩囪繖涓椂闂村皢涓嶅啀鍝嶅簲鏈姹傦紝骞惰Е鍙憃nfailure鍑芥暟 + * @config {Function} [onfailure] timeOut璁惧畾鍚庢墠鐢熸晥锛屽埌杈捐秴鏃舵椂闂存椂瑙﹀彂鏈嚱鏁 + * @remark + * 濡傛灉url涓凡缁忓寘鍚玨ey涓衡渙ptions['queryField']鈥濈殑query椤癸紝灏嗕細琚浛鎹㈡垚callback涓弬鏁颁紶閫掓垨鑷姩鐢熸垚鐨勫嚱鏁板悕銆 + * @meta standard + * @see baidu.sio.callByBrowser + */ +baidu.sio.callByServer = /**@function*/function(url, callback, opt_options) { + var scr = document.createElement('SCRIPT'), + prefix = 'bd__cbs__', + callbackName, + callbackImpl, + options = opt_options || {}, + charset = options['charset'], + queryField = options['queryField'] || 'callback', + timeOut = options['timeOut'] || 0, + timer, + reg = new RegExp('(\\?|&)' + queryField + '=([^&]*)'), + matches; + + if (baidu.lang.isFunction(callback)) { + callbackName = prefix + Math.floor(Math.random() * 2147483648).toString(36); + window[callbackName] = getCallBack(0); + } else if(baidu.lang.isString(callback)){ + callbackName = callback; + } else { + if (matches = reg.exec(url)) { + callbackName = matches[2]; + } + } + + if( timeOut ){ + timer = setTimeout(getCallBack(1), timeOut); + } + url = url.replace(reg, '\x241' + queryField + '=' + callbackName); + + if (url.search(reg) < 0) { + url += (url.indexOf('?') < 0 ? '?' : '&') + queryField + '=' + callbackName; + } + baidu.sio._createScriptTag(scr, url, charset); + + /* + * 杩斿洖涓涓嚱鏁帮紝鐢ㄤ簬绔嬪嵆锛堟寕鍦╳indow涓婏級鎴栬呰秴鏃讹紙鎸傚湪setTimeout涓級鏃舵墽琛 + */ + function getCallBack(onTimeOut){ + /*global callbackName, callback, scr, options;*/ + return function(){ + try { + if( onTimeOut ){ + options.onfailure && options.onfailure(); + }else{ + callback.apply(window, arguments); + clearTimeout(timer); + } + window[callbackName] = null; + delete window[callbackName]; + } catch (exception) { + } finally { + baidu.sio._removeScriptTag(scr); + } + } + } +}; + +/** + * 閫氳繃璇锋眰涓涓浘鐗囩殑鏂瑰紡浠ゆ湇鍔″櫒瀛樺偍涓鏉℃棩蹇 + * @function + * @grammar baidu.sio.log(url) + * @param {string} url 瑕佸彂閫佺殑鍦板潃. + * @author: int08h,leeight + */ +baidu.sio.log = function(url) { + var img = new Image(), + key = 'tangram_sio_log_' + Math.floor(Math.random() * + 2147483648).toString(36); + window[key] = img; + + img.onload = img.onerror = img.onabort = function() { + img.onload = img.onerror = img.onabort = null; + + window[key] = null; + img = null; + }; + img.src = url; +}; + + + +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json.js + * author: erik + * version: 1.1.0 + * date: 2009/12/02 + */ + + +/** + * 鎿嶄綔json瀵硅薄鐨勬柟娉 + * @namespace baidu.json + */ +baidu.json = baidu.json || {}; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/parse.js + * author: erik, berg + * version: 1.2 + * date: 2009/11/23 + */ + + + +/** + * 灏嗗瓧绗︿覆瑙f瀽鎴恓son瀵硅薄銆傛敞锛氫笉浼氳嚜鍔ㄧ闄ょ┖鏍 + * @name baidu.json.parse + * @function + * @grammar baidu.json.parse(data) + * @param {string} source 闇瑕佽В鏋愮殑瀛楃涓 + * @remark + * 璇ユ柟娉曠殑瀹炵幇涓巈cma-262绗簲鐗堜腑瑙勫畾鐨凧SON.parse涓嶅悓锛屾殏鏃跺彧鏀寔浼犲叆涓涓弬鏁般傚悗缁細杩涜鍔熻兘涓板瘜銆 + * @meta standard + * @see baidu.json.stringify,baidu.json.decode + * + * @returns {JSON} 瑙f瀽缁撴灉json瀵硅薄 + */ +baidu.json.parse = function (data) { + //2010/12/09锛氭洿鏂拌嚦涓嶄娇鐢ㄥ師鐢焢arse锛屼笉妫娴嬬敤鎴疯緭鍏ユ槸鍚︽纭 + return (new Function("return (" + data + ")"))(); +}; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/decode.js + * author: erik, cat + * version: 1.3.4 + * date: 2010/12/23 + */ + + + +/** + * 灏嗗瓧绗︿覆瑙f瀽鎴恓son瀵硅薄锛屼负杩囨椂鎺ュ彛锛屼粖鍚庝細琚玝aidu.json.parse浠f浛 + * @name baidu.json.decode + * @function + * @grammar baidu.json.decode(source) + * @param {string} source 闇瑕佽В鏋愮殑瀛楃涓 + * @meta out + * @see baidu.json.encode,baidu.json.parse + * + * @returns {JSON} 瑙f瀽缁撴灉json瀵硅薄 + */ +baidu.json.decode = baidu.json.parse; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/stringify.js + * author: erik + * version: 1.1.0 + * date: 2010/01/11 + */ + + + +/** + * 灏唈son瀵硅薄搴忓垪鍖 + * @name baidu.json.stringify + * @function + * @grammar baidu.json.stringify(value) + * @param {JSON} value 闇瑕佸簭鍒楀寲鐨刯son瀵硅薄 + * @remark + * 璇ユ柟娉曠殑瀹炵幇涓巈cma-262绗簲鐗堜腑瑙勫畾鐨凧SON.stringify涓嶅悓锛屾殏鏃跺彧鏀寔浼犲叆涓涓弬鏁般傚悗缁細杩涜鍔熻兘涓板瘜銆 + * @meta standard + * @see baidu.json.parse,baidu.json.encode + * + * @returns {string} 搴忓垪鍖栧悗鐨勫瓧绗︿覆 + */ +baidu.json.stringify = (function () { + /** + * 瀛楃涓插鐞嗘椂闇瑕佽浆涔夌殑瀛楃琛 + * @private + */ + var escapeMap = { + "\b": '\\b', + "\t": '\\t', + "\n": '\\n', + "\f": '\\f', + "\r": '\\r', + '"' : '\\"', + "\\": '\\\\' + }; + + /** + * 瀛楃涓插簭鍒楀寲 + * @private + */ + function encodeString(source) { + if (/["\\\x00-\x1f]/.test(source)) { + source = source.replace( + /["\\\x00-\x1f]/g, + function (match) { + var c = escapeMap[match]; + if (c) { + return c; + } + c = match.charCodeAt(); + return "\\u00" + + Math.floor(c / 16).toString(16) + + (c % 16).toString(16); + }); + } + return '"' + source + '"'; + } + + /** + * 鏁扮粍搴忓垪鍖 + * @private + */ + function encodeArray(source) { + var result = ["["], + l = source.length, + preComma, i, item; + + for (i = 0; i < l; i++) { + item = source[i]; + + switch (typeof item) { + case "undefined": + case "function": + case "unknown": + break; + default: + if(preComma) { + result.push(','); + } + result.push(baidu.json.stringify(item)); + preComma = 1; + } + } + result.push("]"); + return result.join(""); + } + + /** + * 澶勭悊鏃ユ湡搴忓垪鍖栨椂鐨勮ˉ闆 + * @private + */ + function pad(source) { + return source < 10 ? '0' + source : source; + } + + /** + * 鏃ユ湡搴忓垪鍖 + * @private + */ + function encodeDate(source){ + return '"' + source.getFullYear() + "-" + + pad(source.getMonth() + 1) + "-" + + pad(source.getDate()) + "T" + + pad(source.getHours()) + ":" + + pad(source.getMinutes()) + ":" + + pad(source.getSeconds()) + '"'; + } + + return function (value) { + switch (typeof value) { + case 'undefined': + return 'undefined'; + + case 'number': + return isFinite(value) ? String(value) : "null"; + + case 'string': + return encodeString(value); + + case 'boolean': + return String(value); + + default: + if (value === null) { + return 'null'; + } else if (value instanceof Array) { + return encodeArray(value); + } else if (value instanceof Date) { + return encodeDate(value); + } else { + var result = ['{'], + encode = baidu.json.stringify, + preComma, + item; + + for (var key in value) { + if (Object.prototype.hasOwnProperty.call(value, key)) { + item = value[key]; + switch (typeof item) { + case 'undefined': + case 'unknown': + case 'function': + break; + default: + if (preComma) { + result.push(','); + } + preComma = 1; + result.push(encode(key) + ':' + encode(item)); + } + } + } + result.push('}'); + return result.join(''); + } + } + }; +})(); +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/encode.js + * author: erik, cat + * version: 1.3.4 + * date: 2010/12/23 + */ + + + +/** + * 灏唈son瀵硅薄搴忓垪鍖栵紝涓鸿繃鏃舵帴鍙o紝浠婂悗浼氳baidu.json.stringify浠f浛 + * @name baidu.json.encode + * @function + * @grammar baidu.json.encode(value) + * @param {JSON} value 闇瑕佸簭鍒楀寲鐨刯son瀵硅薄 + * @meta out + * @see baidu.json.decode,baidu.json.stringify + * + * @returns {string} 搴忓垪鍖栧悗鐨勫瓧绗︿覆 + */ +baidu.json.encode = baidu.json.stringify; diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/wordimage.html b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/wordimage.html new file mode 100644 index 00000000..6cf60674 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/wordimage.html @@ -0,0 +1,111 @@ + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    + +
    + : +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/wordimage.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/wordimage.js new file mode 100644 index 00000000..98f3a226 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/dialogs/wordimage/wordimage.js @@ -0,0 +1,157 @@ +/** + * Created by JetBrains PhpStorm. + * User: taoqili + * Date: 12-1-30 + * Time: 涓嬪崍12:50 + * To change this template use File | Settings | File Templates. + */ + + + +var wordImage = {}; +//(function(){ +var g = baidu.g, + flashObj,flashContainer; + +wordImage.init = function(opt, callbacks) { + showLocalPath("localPath"); + //createCopyButton("clipboard","localPath"); + createFlashUploader(opt, callbacks); + addUploadListener(); + addOkListener(); +}; + +function hideFlash(){ + flashObj = null; + flashContainer.innerHTML = ""; +} +function addOkListener() { + dialog.onok = function() { + if (!imageUrls.length) return; + var urlPrefix = editor.getOpt('imageUrlPrefix'), + images = domUtils.getElementsByTagName(editor.document,"img"); + editor.fireEvent('saveScene'); + for (var i = 0,img; img = images[i++];) { + var src = img.getAttribute("word_img"); + if (!src) continue; + for (var j = 0,url; url = imageUrls[j++];) { + if (src.indexOf(url.original.replace(" ","")) != -1) { + img.src = urlPrefix + url.url; + img.setAttribute("_src", urlPrefix + url.url); //鍚屾椂淇敼"_src"灞炴 + img.setAttribute("title",url.title); + domUtils.removeAttributes(img, ["word_img","style","width","height"]); + editor.fireEvent("selectionchange"); + break; + } + } + } + editor.fireEvent('saveScene'); + hideFlash(); + }; + dialog.oncancel = function(){ + hideFlash(); + } +} + +/** + * 缁戝畾寮濮嬩笂浼犱簨浠 + */ +function addUploadListener() { + g("upload").onclick = function () { + flashObj.upload(); + this.style.display = "none"; + }; +} + +function showLocalPath(id) { + //鍗曞紶缂栬緫 + var img = editor.selection.getRange().getClosedNode(); + var images = editor.execCommand('wordimage'); + if(images.length==1 || img && img.tagName == 'IMG'){ + g(id).value = images[0]; + return; + } + var path = images[0]; + var leftSlashIndex = path.lastIndexOf("/")||0, //涓嶅悓鐗堟湰鐨刣oc鍜屾祻瑙堝櫒閮藉彲鑳藉奖鍝嶅埌杩欎釜绗﹀彿锛屾晠鐩存帴鍒ゆ柇涓ょ + rightSlashIndex = path.lastIndexOf("\\")||0, + separater = leftSlashIndex > rightSlashIndex ? "/":"\\" ; + + path = path.substring(0, path.lastIndexOf(separater)+1); + g(id).value = path; +} + +function createFlashUploader(opt, callbacks) { + //鐢变簬lang.flashI18n鏄潤鎬佸睘鎬э紝涓嶅彲浠ョ洿鎺ヨ繘琛屼慨鏀癸紝鍚﹀垯浼氬奖鍝嶅埌鍚庣画鍐呭 + var i18n = utils.extend({},lang.flashI18n); + //澶勭悊鍥剧墖璧勬簮鍦板潃鐨勭紪鐮侊紝琛ュ叏绛夐棶棰 + for(var i in i18n){ + if(!(i in {"lang":1,"uploadingTF":1,"imageTF":1,"textEncoding":1}) && i18n[i]){ + i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + "/images/" + i18n[i]); + } + } + opt = utils.extend(opt,i18n,false); + var option = { + createOptions:{ + id:'flash', + url:opt.flashUrl, + width:opt.width, + height:opt.height, + errorMessage:lang.flashError, + wmode:browser.safari ? 'transparent' : 'window', + ver:'10.0.0', + vars:opt, + container:opt.container + } + }; + + option = extendProperty(callbacks, option); + flashObj = new baidu.flash.imageUploader(option); + flashContainer = $G(opt.container); +} + +function extendProperty(fromObj, toObj) { + for (var i in fromObj) { + if (!toObj[i]) { + toObj[i] = fromObj[i]; + } + } + return toObj; +} + +//})(); + +function getPasteData(id) { + baidu.g("msg").innerHTML = lang.copySuccess + "
    "; + setTimeout(function() { + baidu.g("msg").innerHTML = ""; + }, 5000); + return baidu.g(id).value; +} + +function createCopyButton(id, dataFrom) { + baidu.swf.create({ + id:"copyFlash", + url:"fClipboard_ueditor.swf", + width:"58", + height:"25", + errorMessage:"", + bgColor:"#CBCBCB", + wmode:"transparent", + ver:"10.0.0", + vars:{ + tid:dataFrom + } + }, id + ); + + var clipboard = baidu.swf.getMovie("copyFlash"); + var clipinterval = setInterval(function() { + if (clipboard && clipboard.flashInit) { + clearInterval(clipinterval); + clipboard.setHandCursor(true); + clipboard.setContentFuncName("getPasteData"); + //clipboard.setMEFuncName("mouseEventHandler"); + } + }, 500); +} +createCopyButton("clipboard", "localPath"); \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/Readme.txt b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/Readme.txt new file mode 100644 index 00000000..cd1be920 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/Readme.txt @@ -0,0 +1,6 @@ + +Leipi Form Design ! + +http://formdesign.leipi.org + +2014/6/9 \ No newline at end of file diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap-ie.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap-ie.js new file mode 100644 index 00000000..9043eb9e --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap-ie.js @@ -0,0 +1,416 @@ +(function($) { + $.eb = $.eb || {}; + + // $.eb.ie = function (min,max) { + // // return true; + // if ($.browser.msie) { + // var v = Math.floor($.browser.version); + // if (v >= min && v <= max) { + // return true; + // } + // } + // return false; + // } + $.eb.ie6 = function () { + return navigator.userAgent.toLowerCase().indexOf('msie 6.0') > -1; + // alert(navigator.userAgent.toLowerCase().indexOf('msie 6.0')); + } + + + $.eb.color = function () { + var pad = function(num, totalChars) { + var pad = '0'; + num = num + ''; + while (num.length < totalChars) { + num = pad + num; + } + return num; + }; + + // Ratio is between 0 and 1 + this.changeColor = function(color, ratio, darker) { + // Trim trailing/leading whitespace + color = color.replace(/^\s*|\s*$/, ''); + + // Expand three-digit hex + color = color.replace( + /^#?([a-f0-9])([a-f0-9])([a-f0-9])$/i, + '#$1$1$2$2$3$3' + ); + + // Calculate ratio + var difference = Math.round(ratio * 256) * (darker ? -1 : 1), + // Determine if input is RGB(A) + rgb = color.match(new RegExp('^rgba?\\(\\s*' + + '(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])' + + '\\s*,\\s*' + + '(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])' + + '\\s*,\\s*' + + '(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])' + + '(?:\\s*,\\s*' + + '(0|1|0?\\.\\d+))?' + + '\\s*\\)$' + , 'i')), + alpha = !!rgb && rgb[4] != null ? rgb[4] : null, + + // Convert hex to decimal + decimal = !!rgb? [rgb[1], rgb[2], rgb[3]] : color.replace( + /^#?([a-f0-9][a-f0-9])([a-f0-9][a-f0-9])([a-f0-9][a-f0-9])/i, + function() { + return parseInt(arguments[1], 16) + ',' + + parseInt(arguments[2], 16) + ',' + + parseInt(arguments[3], 16); + } + ).split(/,/), + returnValue; + + // Return RGB(A) + return !!rgb ? + 'rgb' + (alpha !== null ? 'a' : '') + '(' + + Math[darker ? 'max' : 'min']( + parseInt(decimal[0], 10) + difference, darker ? 0 : 255 + ) + ', ' + + Math[darker ? 'max' : 'min']( + parseInt(decimal[1], 10) + difference, darker ? 0 : 255 + ) + ', ' + + Math[darker ? 'max' : 'min']( + parseInt(decimal[2], 10) + difference, darker ? 0 : 255 + ) + + (alpha !== null ? ', ' + alpha : '') + + ')' : + // Return hex + [ + '#', + pad(Math[darker ? 'max' : 'min']( + parseInt(decimal[0], 10) + difference, darker ? 0 : 255 + ).toString(16), 2), + pad(Math[darker ? 'max' : 'min']( + parseInt(decimal[1], 10) + difference, darker ? 0 : 255 + ).toString(16), 2), + pad(Math[darker ? 'max' : 'min']( + parseInt(decimal[2], 10) + difference, darker ? 0 : 255 + ).toString(16), 2) + ].join(''); + }; + this.lighten = function(color, ratio) { + return changeColor(color, ratio, false); + }; + this.darken = function(color, ratio) { + return changeColor(color, ratio, true); + }; + return this; + }(); + + + function bootstrapIE6(el) { + var dropdownWidthFix = function (el) { + el.each(function () { + var w = 0; + $(this).children('li').each(function() { + var aw = $(this).outerWidth(); + if (aw > w) w = aw; + }); + + $(this).width(w); + }); + } + + if ($.eb.ie6()) { + el = el || $('html'); + + //------------- + // GRID + //------------- + + //------------- + // dropdown + //------------- + // fix for IE6 not support li:hover + var i, lis = ['dropdown-submenu']; + for (i = 0; i < lis.length; i++) { + var child = 'li.' + lis[i]; + var hover = lis[i] + '-hover'; + $('ul', el).on('mouseenter', child, function () { + $(this).addClass(hover); + }).on('mouseleave', child, function () { + $(this).removeClass(hover); + }); + } + + /// fix :after selector -- dropdown-submenu > a:after + $('.dropdown-submenu > a', el).after(''); + + /// fix multi class selector -- .dropdown-submenu.pull-left + $('.dropdown-submenu.pull-left', el).removeClass('pull-left').addClass('dropdown-submenu-pull-left'); + // $('.navbar .nav.pull-right').removeClass('pull-right').addClass('nav-pull-right'); + + /// fix ul li 100% width bug, set ul width to max width of it's sub li + dropdownWidthFix($('.dropdown-menu:visible', el)); + + + //------------- + // buttons + //------------- + var btnColorCls = ['btn-primary','btn-warning','btn-danger','btn-success','btn-info','btn-inverse']; + var btnSizeCls = ['btn-mini','btn-small','btn-large']; + $('.btn-group', el).parent().find('.btn-group:eq(0)').addClass('btn-group-first'); + $('.btn', el).parent().find('.btn:eq(0)').addClass('btn-first'); + + // fix button:hover + $('body', el).on('mouseenter', '.btn', function () { + var btn = $(this); + var hover = 'btn-hover'; + btn.data('ie6hover',hover); + $.each(btnColorCls, function (k,v) { + if (btn.hasClass(v)) { + hover = v + '-hover'; + btn.data('ie6hover',hover); + return false; + } + }); + btn.addClass(hover); + }).on('mouseleave', '.btn', function () { + var btn = $(this); + var hover = btn.data('ie6hover'); + btn.removeData('ie6hover'); + if (hover) btn.removeClass(hover); + }); + + // fix .btn.dropdown-toggle, .btn-primary.dropdown-toggle ... + // fix .btn.dropdown-toggle, .btn-small.dropdown-toggle ... + $('.btn.dropdown-toggle', el).each(function () { + var btn = $(this); + var ddt = 'btn-dropdown-toggle'; + btn.addClass(ddt); + + ddt = null; + $.each(btnColorCls, function (k,v) { + if (btn.hasClass(v)) { + ddt = v + '-dropdown-toggle'; + return false; + } + }); + if (ddt) btn.addClass(ddt); + + ddt = null; + $.each(btnSizeCls, function (k,v) { + if (btn.hasClass(v)) { + ddt = v + '-dropdown-toggle'; + return false; + } + }); + if (ddt) btn.addClass(ddt); + }); + + // fix split button dropdown toggle background color + $('.btn + .btn.dropdown-toggle', el).each(function () { + var btn = $(this); + var c = btn.css('background-color'); + // alert($.eb.color.darken(c, .2)); + btn.css('background-color', $.eb.color.darken(c, .1)); + }); + + // fix .btn-group.open + var dropdownPropertyChange = function(e) { + var self = $(this); + var cls = e.data.cls; + + /// fix ul li 100% width bug, set ul width to max width of it's sub li + var el = $('.dropdown-menu:visible', this); + if (el.length) dropdownWidthFix(el); + + if (self.hasClass('open') && !self.hasClass(cls+'-open')) { + self.addClass(cls+'-open'); + } + else if (!self.hasClass('open') && self.hasClass(cls+'-open')) { + self.removeClass(cls+'-open'); + } + + self.one('propertychange', {cls:cls}, dropdownPropertyChange); + }; + $.each(['btn-group', 'dropdown'], function (k,cls) { + $('.'+cls, el).one('propertychange', {cls:cls}, dropdownPropertyChange); + }); + + // fix .btn.disabled selector + $('.btn.disabled', el).addClass('btn-disabled'); + + var btnPropertyChange = function (e) { + var self = $(this); + var cls = e.data.cls; + + if (self.hasClass('disabled') && !self.hasClass(cls+'-disabled')) { + self.addClass(cls+'-disabled'); + } + else if (!self.hasClass('disabled') && self.hasClass(cls+'-disabled')) { + self.removeClass(cls+'-disabled'); + } + + self.one('propertychange', {cls:cls}, btnPropertyChange); + } + $.each(['btn'], function (k,cls) { + $('.'+cls, el).one('propertychange', {cls:cls}, btnPropertyChange); + }); + + + //------------- + // table + //------------- + + // fix table-hover effect + $('table.table-hover', el).on('mouseenter', 'tr', function () { + $(this).addClass('tr-hover'); + }).on('mouseleave', 'tr', function () { + $(this).removeClass('tr-hover'); + }); + + //------------- + // form + //------------- + + // fix input[type=xxx] selector + $('input[type="file"], input[type="image"], input[type="submit"], input[type="reset"], input[type="button"], input[type="radio"], input[type="checkbox"], input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"]', el).each(function () { + var input = $(this); + input.addClass('input-'+input.attr('type')); + }); + + // fix form-horizontal controls margin-left + $('.form-horizontal .controls:first-child', el).addClass('controls-first-child'); + + // fix .checkbox.inline + $('.checkbox.inline', el).addClass('checkbox-inline'); + $('.radio.inline', el).addClass('radio-inline'); + + // fix select[multiple], select[size] + $('select[multiple]', el).addClass('select-multiple'); + $('select[size]', el).addClass('select-size'); + + // fix tag[disabled] + $('input[disabled], select[disabled], textarea[disabled]', el).each(function () { + var self = $(this); + self.addClass(self[0].tagName.toLowerCase()+'-disabled'); + }); + +// $('input,select,textarea', el).on('propertychange', function() { +// var self = $(this); +// if (self.data('chgDisabled')) return; + +// var cls = self[0].tagName.toLowerCase(); +// // alert(self.attr('disabled')); +// if (self.attr('disabled') && !self.hasClass(cls+'-disabled')) { +// // alert('abc'); +// self.addClass(cls+'-disabled'); +// self.data('chgDisabled', true); +// } +// else if (!self.attr('disabled') && self.hasClass(cls+'-disabled')) { +// self.removeClass(cls+'-disabled'); +// self.data('chgDisabled', true); +// } +// }); + +// $('input,select,textarea', el).on('propertychange', function() { +// var self = $(this); +// if (self.data('chgReadonly')) return; + +// var cls = self[0].tagName.toLowerCase(); + +// if (self.attr('readonly') && !self.hasClass(cls+'-readonly')) { +// self.addClass(cls+'-readonly'); +// self.data('chgReadonly', true); +// } +// else if (typeof self.attr('readonly') == 'undefined' && self.hasClass(cls+'-readonly')) { +// self.removeClass(cls+'-readonly'); +// self.data('chgReadonly', true); +// } +// }); + + // fix tag[readonly] + $('input[readonly], select[readonly], textarea[readonly]', el).each(function () { + var self = $(this); + self.addClass(self[0].tagName.toLowerCase()+'-readonly'); + }); + + // fix input[type=xxx][disabled] + $('input[type="radio"][disabled], input[type="checkbox"][disabled]', el).each(function () { + var self = $(this); + self.addClass(self.attr('type').toLowerCase()+'-disabled'); + }); + + // fix input[type=xxx][readonly] + $('input[type="radio"][readonly], input[type="checkbox"][readonly]', el).each(function () { + var self = $(this); + self.addClass(self.attr('type').toLowerCase()+'-readonly'); + }); + + // fix.control-group.warning ... + var ctlGrpTypeCls = ['warning','success','error','info']; + $.each(ctlGrpTypeCls, function (k,v) { + $('.control-group.'+v, el).addClass('control-group-'+v); + }); + + var controlGroupPropertyChange = function(e) { + if(e.originalEvent.propertyName.toLowerCase() == 'classname') { + var self = $(this); + $.each(ctlGrpTypeCls, function (k,v) { + var ieCls = 'control-group-'+v; + if (self.hasClass(v)) { + if (!self.hasClass(ieCls)) { + self.addClass(ieCls); + } + } + else { + if (self.hasClass(ieCls)) { + self.removeClass(ieCls); + } + } + }); + } + $(this).one('propertychange', controlGroupPropertyChange); + }; + $('.control-group', el).one('propertychange', controlGroupPropertyChange); + + //------------- + // popover + //------------- + // $('.popover .arrow', el).after(''); + + //------------- + // pagination + //------------- + $('.pagination ul li:first-child', el).addClass('first-child'); + + + //------------- + // icons + //------------- + $('[class^="icon-"],[class*=" icon-"]').each(function () { + var self = $(this); + if (!self.hasClass('icon-xxx')) { + self.addClass('icon-xxx'); + self.css('background-position-y', + (parseInt(self.css('background-position-y')) + 1)+'px'); + } + }); + + //------------- + // carousel + //------------- + $('.carousel-control.left', el).removeClass('left').addClass('carousel-control-left'); + $('.carousel-control.right', el).removeClass('right').addClass('carousel-control-right'); + $('.carousel-caption').each(function() { + var self = $(this); + var padding = self.outerWidth() - self.width(); + self.width(self.parents('.carousel-inner .item').width() - padding); + }); + + + } + } + $.bootstrapIE6 = bootstrapIE6; + + + $(document).ready(function () { + bootstrapIE6(); + }); + +})(jQuery); diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-ie6.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-ie6.css new file mode 100644 index 00000000..4fe12e36 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-ie6.css @@ -0,0 +1,5773 @@ +/*! + * Bootstrap v2.2.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + display: inline; + float: left; + width: 940px; + min-height: 1px; + margin-left: 20px; +} + +.span11 { + display: inline; + float: left; + width: 860px; + min-height: 1px; + margin-left: 20px; +} + +.span10 { + display: inline; + float: left; + width: 780px; + min-height: 1px; + margin-left: 20px; +} + +.span9 { + display: inline; + float: left; + width: 700px; + min-height: 1px; + margin-left: 20px; +} + +.span8 { + display: inline; + float: left; + width: 620px; + min-height: 1px; + margin-left: 20px; +} + +.span7 { + display: inline; + float: left; + width: 540px; + min-height: 1px; + margin-left: 20px; +} + +.span6 { + display: inline; + float: left; + width: 460px; + min-height: 1px; + margin-left: 20px; +} + +.span5 { + display: inline; + float: left; + width: 380px; + min-height: 1px; + margin-left: 20px; +} + +.span4 { + display: inline; + float: left; + width: 300px; + min-height: 1px; + margin-left: 20px; +} + +.span3 { + display: inline; + float: left; + width: 220px; + min-height: 1px; + margin-left: 20px; +} + +.span2 { + display: inline; + float: left; + width: 140px; + min-height: 1px; + margin-left: 20px; +} + +.span1 { + display: inline; + float: left; + width: 60px; + min-height: 1px; + margin-left: 20px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.span-first-child { + margin-left: 10px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + display: block; + float: left; + width: 100%; + *width: 99.94680851063829%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid .span11 { + display: block; + float: left; + width: 100%; + width: 91.48936170212765%; + *width: 91.43617021276594%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid .span10 { + display: block; + float: left; + width: 100%; + width: 82.97872340425532%; + *width: 82.92553191489361%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid .span9 { + display: block; + float: left; + width: 100%; + width: 74.46808510638297%; + *width: 74.41489361702126%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid .span8 { + display: block; + float: left; + width: 100%; + width: 65.95744680851064%; + *width: 65.90425531914893%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid .span7 { + display: block; + float: left; + width: 100%; + width: 57.44680851063829%; + *width: 57.39361702127659%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid .span6 { + display: block; + float: left; + width: 100%; + width: 48.93617021276595%; + *width: 48.88297872340425%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid .span5 { + display: block; + float: left; + width: 100%; + width: 40.42553191489362%; + *width: 40.37234042553192%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid .span4 { + display: block; + float: left; + width: 100%; + width: 31.914893617021278%; + *width: 31.861702127659576%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid .span3 { + display: block; + float: left; + width: 100%; + width: 23.404255319148934%; + *width: 23.351063829787233%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid .span2 { + display: block; + float: left; + width: 100%; + width: 14.893617021276595%; + *width: 14.840425531914894%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid .span1 { + display: block; + float: left; + width: 100%; + width: 6.382978723404255%; + *width: 6.329787234042553%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +.row-fluid .span-first-child { + margin-left: 0; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + *margin-left: -7px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +.input-text, +.input-password, +.input-datetime, +.input-datetime-local, +.input-date, +.input-month, +.input-time, +.input-week, +.input-number, +.input-email, +.input-url, +.input-search, +.input-tel, +.input-color, +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +.input-text, +.input-password, +.input-datetime, +.input-datetime-local, +.input-date, +.input-month, +.input-time, +.input-week, +.input-number, +.input-email, +.input-url, +.input-search, +.input-tel, +.input-color, +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +.input-text:focus, +.input-password:focus, +.input-datetime:focus, +.input-datetime-local:focus, +.input-date:focus, +.input-month:focus, +.input-time:focus, +.input-week:focus, +.input-number:focus, +.input-email:focus, +.input-url:focus, +.input-search:focus, +.input-tel:focus, +.input-color:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; + cursor: pointer; +} + +.input-file, +.input-image, +.input-submit, +.input-reset, +.input-button, +.input-radio, +.input-checkbox { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +.select-multiple, +.select-size { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; + _padding-left: 0; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline, +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline, +.radio-inline .checkbox-inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12 { + float: none; + width: 926px; + margin-left: 0; +} + +.uneditable-input-span12 { + width: 926px; +} + +input.span11, +textarea.span11 { + float: none; + width: 846px; + margin-left: 0; +} + +.uneditable-input-span11 { + width: 846px; +} + +input.span10, +textarea.span10 { + float: none; + width: 766px; + margin-left: 0; +} + +.uneditable-input-span10 { + width: 766px; +} + +input.span9, +textarea.span9 { + float: none; + width: 686px; + margin-left: 0; +} + +.uneditable-input-span9 { + width: 686px; +} + +input.span8, +textarea.span8 { + float: none; + width: 606px; + margin-left: 0; +} + +.uneditable-input-span8 { + width: 606px; +} + +input.span7, +textarea.span7 { + float: none; + width: 526px; + margin-left: 0; +} + +.uneditable-input-span7 { + width: 526px; +} + +input.span6, +textarea.span6 { + float: none; + width: 446px; + margin-left: 0; +} + +.uneditable-input-span6 { + width: 446px; +} + +input.span5, +textarea.span5 { + float: none; + width: 366px; + margin-left: 0; +} + +.uneditable-input-span5 { + width: 366px; +} + +input.span4, +textarea.span4 { + float: none; + width: 286px; + margin-left: 0; +} + +.uneditable-input-span4 { + width: 286px; +} + +input.span3, +textarea.span3 { + float: none; + width: 206px; + margin-left: 0; +} + +.uneditable-input-span3 { + width: 206px; +} + +input.span2, +textarea.span2 { + float: none; + width: 126px; + margin-left: 0; +} + +.uneditable-input-span2 { + width: 126px; +} + +input.span1, +textarea.span1 { + float: none; + width: 46px; + margin-left: 0; +} + +.uneditable-input-span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +.input-disabled, +.select-disabled, +.textarea-disabled, +.input-readonly, +.select-readonly, +.textarea-readonly { + cursor: not-allowed; + background-color: #eeeeee; +} + +.radio-disabled, +.checkbox-disabled, +.radio-readonly, +.checkbox-readonly { + background-color: transparent; +} + +.control-group-warning label, +.control-group-warning .help-block, +.control-group-warning .help-inline { + color: #c09853; +} + +.control-group-warning * label { + color: inherit; +} + +.control-group-warning .checkbox, +.control-group-warning .radio, +.control-group-warning input, +.control-group-warning select, +.control-group-warning textarea { + color: #c09853; +} + +.control-group-warning input, +.control-group-warning select, +.control-group-warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group-warning input:focus, +.control-group-warning select:focus, +.control-group-warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group-warning .input-prepend .add-on, +.control-group-warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group-error label, +.control-group-error .help-block, +.control-group-error .help-inline { + color: #b94a48; +} + +.control-group-error * label { + color: inherit; +} + +.control-group-error .checkbox, +.control-group-error .radio, +.control-group-error input, +.control-group-error select, +.control-group-error textarea { + color: #b94a48; +} + +.control-group-error input, +.control-group-error select, +.control-group-error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group-error input:focus, +.control-group-error select:focus, +.control-group-error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group-error .input-prepend .add-on, +.control-group-error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group-success label, +.control-group-success .help-block, +.control-group-success .help-inline { + color: #468847; +} + +.control-group-success * label { + color: inherit; +} + +.control-group-success .checkbox, +.control-group-success .radio, +.control-group-success input, +.control-group-success select, +.control-group-success textarea { + color: #468847; +} + +.control-group-success input, +.control-group-success select, +.control-group-success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group-success input:focus, +.control-group-success select:focus, +.control-group-success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group-success .input-prepend .add-on, +.control-group-success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group-info label, +.control-group-info .help-block, +.control-group-info .help-inline { + color: #3a87ad; +} + +.control-group-info * label { + color: inherit; +} + +.control-group-info .checkbox, +.control-group-info .radio, +.control-group-info input, +.control-group-info select, +.control-group-info textarea { + color: #3a87ad; +} + +.control-group-info input, +.control-group-info select, +.control-group-info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group-info input:focus, +.control-group-info select:focus, +.control-group-info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group-info .input-prepend .add-on, +.control-group-info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:required:invalid, +textarea:focus:required:invalid, +select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:required:invalid:focus, +textarea:focus:required:invalid:focus, +select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + margin-bottom: 5px; + font-size: 0; + white-space: nowrap; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn { + *margin-top: 1px; + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; + *margin-right: -2px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn, +.input-append select + .btn-group .btn, +.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; + *margin-left: -2px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls-first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child th:first-child, +.table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child th:last-child, +.table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child th:first-child, +.table-bordered tbody:last-child tr:last-child td:first-child, +.table-bordered tfoot:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child th:last-child, +.table-bordered tbody:last-child tr:last-child td:last-child, +.table-bordered tfoot:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody tr:nth-child(odd) td, +.table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} + +.table-hover tbody .tr-hover td, +.table-hover tbody .tr-hover th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success td { + background-color: #dff0d8; +} + +.table tbody tr.error td { + background-color: #f2dede; +} + +.table tbody tr.warning td { + background-color: #fcf8e3; +} + +.table tbody tr.info td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover td { + background-color: #c4e3f3; +} + +.icon-xxx { + display: inline-block; + _display: inline; + width: 14px; + _width: 14px; + height: 14px; + _height: 19px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + _vertical-align: middle; + background-image: url("../img/glyphicons-halflings.png"); + _background-image: url("../img/glyphicons-halflings-8.png"); + background-position: 14px 14px; + background-repeat: no-repeat; + _zoom: 1; +} + +/* White icons with optional class, or on hover/active states of certain elements */ + +.icon-white { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; + /* fix for IE6 BFC */ + + display: inline; + *zoom: 1; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + *display: inline; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; + *zoom: 1; +} + +/* fix for IE6 */ + +.caret { + width: 0; + height: 0; + line-height: 0; + border-color: #000000 transparent transparent; + *border-color: #000000 #fffffe #fffffe; + border-style: solid; + border-width: 4px 4px 0; + *filter: progid:DXImageTransform.Microsoft.Chroma(color=#fffffe); +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + *width: auto !important; + *width: 160px; + *height: 1px; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu li a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; + *zoom: 1; +} + +.dropdown-menu li a:hover, +.dropdown-menu li a:focus, +.dropdown-submenu:hover a, +.dropdown-submenu-hover a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +/* fix for IE6 li:hover */ + +.dropdown-submenu-hover * a { + *color: inherit; + *background-color: #fffffe; + *background-image: none; + *filter: none; + *filter: chroma(color=#fffffe); +} + +.dropdown-menu .active a, +.dropdown-menu .active a:hover { + color: #333333; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu .disabled a, +.dropdown-menu .disabled a:hover { + color: #999999; +} + +.dropdown-menu .disabled a:hover { + text-decoration: none; + cursor: default; + background-color: transparent; + *background-color: #fffffe; + background-image: none; + *filter: chroma(color=#fffffe); +} + +.open { + *z-index: 1000; +} + +.open .dropdown-menu { + display: block; + /* fix for IE6 inline-block */ + + *zoom: 1; +} + +.pull-right .dropdown-menu { + right: 0; + left: auto; +} + +.pull-right * .dropdown-menu { + right: auto; + left: 0; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; + /* fix for IE6 absolute element will expand parent element's height */ + + *display: inline; + *zoom: 1; +} + +.dropdown-submenu .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover .dropdown-menu, +.dropdown-submenu-hover .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + *border-color: #fffffe; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; + *filter: chroma(color=#fffffe); + *zoom: 1; +} + +/* fix for IE6 */ + +.dropdown-submenu .dropdown-tri { + display: block; + float: right; + width: 0; + height: 0; + margin: -1.3em 5px 0 0; + line-height: 0; + border-color: transparent transparent transparent #cccccc; + _border-color: #fffffe #fffffe #fffffe #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + _filter: chroma(color=#fffffe); + zoom: 1; +} + +.dropdown-submenu:hover a:after, +.dropdown-submenu-hover .dropdown-tri { + border-left-color: #ffffff; +} + +.dropdown-submenu-pull-left { + float: none; + /* fix for IE6 */ + +} + +.dropdown-submenu-pull-left .dropdown-menu { + left: -100%; + margin-left: 10px; + *margin-left: 18px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown-submenu-pull-left * .dropdown-menu { + left: 0; + margin-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + _padding-top: 3px; + _padding-bottom: 3px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + *line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #bbbbbb; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #a2a2a2; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn.btn-hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + *background-color: #d9d9d9; + /* Buttons in IE7 don't get borders, so darken on hover */ + + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn:active, +.btn.active { + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled], +.btn-disabled { + cursor: default; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +.btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +.btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +a.btn { + *padding-top: 5px; + *padding-bottom: 5px; +} + +a.btn.btn-large { + *padding-top: 13px; + *padding-bottom: 15px; +} + +a.btn.btn-small { + *padding-top: 4px; + *padding-bottom: 4px; +} + +a.btn.btn-mini { + *padding-top: 3px; + *padding-bottom: 3px; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 2px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini { + padding: 1px 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn { + border-color: #c5c5c5; + border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-primary.btn-primary-hover { + color: #fff; + background-color: #0044cc; + *background-color: #003bb3; +} + +a.btn-primary-hover:hover { + color: #fff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-warning.btn-warning-hover { + color: #fff; + background-color: #f89406; + *background-color: #df8505; +} + +a.btn-warning-hover:hover { + color: #fff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-danger.btn-danger-hover { + color: #fff; + background-color: #bd362f; + *background-color: #a9302a; +} + +a.btn-danger-hover:hover { + color: #fff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-success.btn-success-hover { + color: #fff; + background-color: #51a351; + *background-color: #499249; +} + +a.btn-success-hover:hover { + color: #fff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-info.btn-info-hover { + color: #fff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +a.btn-info-hover:hover { + color: #fff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +.btn-inverse.btn-inverse-hover { + color: #fff; + background-color: #222222; + *background-color: #3c3c3c; +} + +a.btn-inverse-hover:hover { + color: #fff; + background-color: #222222; + *background-color: #3c3c3c; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover { + color: #333333; + text-decoration: none; +} + +.btn-disabled { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + filter: alpha(opacity=35); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group { + margin-left: 5px; +} + +.btn-group-first { + /* fix for IE6 */ + + margin-left: 0; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar .btn .btn-group { + margin-left: 5px; +} + +.btn-toolbar .btn-first, +.btn-toolbar .btn-group-first { + margin-left: 0; +} + +.btn-group .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group .btn { + margin-left: -1px; +} + +.btn-group .btn-first { + margin-left: 0; +} + +.btn-group .btn, +.btn-group .dropdown-menu { + font-size: 14px; +} + +.btn-group .dropdown-menu .divider { + _margin: 5px 0 -5px; +} + +.btn-group .btn-mini { + font-size: 11px; +} + +.btn-group .btn-small { + font-size: 12px; +} + +.btn-group .btn-large { + font-size: 16px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group .dropdown-toggle { + padding-right: 9px; + padding-left: 9px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group .btn-mini-dropdown-toggle { + padding-right: 7px; + padding-left: 7px; +} + +.btn-group .btn-large-dropdown-toggle { + padding-right: 17px; + padding-left: 17px; +} + +.btn-group-open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group-open .btn-dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group-open .btn-primary-dropdown-toggle { + background-color: #0044cc; +} + +.btn-group-open .btn-warning-dropdown-toggle { + background-color: #f89406; +} + +.btn-group-open .btn-danger-dropdown-toggle { + background-color: #bd362f; +} + +.btn-group-open .btn-success-dropdown-toggle { + background-color: #51a351; +} + +.btn-group-open .btn-info-dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group-open .btn-inverse-dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + _display: inline; + _height: 8px; + margin-top: 8px; + margin-left: 0; + _vertical-align: middle; + _zoom: 1; +} + +.btn-mini .caret, +.btn-small .caret { + _height: 10px; +} + +.btn-mini .caret, +.btn-small .caret, +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + _height: 9px; + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical .btn { + display: block; + float: none; + width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + color: #c09853; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert h4 { + *display: inline; + margin: 0; + *zoom: 1; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block p, +.alert-block ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav li a { + display: block; + *zoom: 1; +} + +.nav * li a { + display: inline; +} + +.nav li * a { + display: inline; +} + +.nav li a:hover { + text-decoration: none; + background-color: #eeeeee; +} + +.nav * li a:hover { + text-decoration: inherit; + background-color: inherit; +} + +.nav li * a:hover { + text-decoration: inherit; + background-color: inherit; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; + *zoom: 1; +} + +.nav .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list li a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list li a { + padding: 3px 15px; +} + +.nav-list * li a { + padding: 0; + margin-right: 0; + margin-left: 0; + text-shadow: none; +} + +.nav-list li * a { + padding: 0; + margin-right: 0; + margin-left: 0; + text-shadow: none; +} + +.nav-list .active a, +.nav-list .active a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list * .active a, +.nav-list * .active a:hover { + color: inherit; + text-shadow: none; + background-color: inherit; +} + +.nav-list .active * a, +.nav-list .active * a:hover { + color: inherit; + text-shadow: none; + background-color: inherit; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs li, +.nav-pills li { + float: left; +} + +.nav-tabs * li, +.nav-pills * li { + float: none; +} + +.nav-tabs li a, +.nav-pills li a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs * li a, +.nav-pills * li a { + padding: 0; + margin: 0; + line-height: auto; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs li { + margin-bottom: -1px; + *background-color: #ffffff; + *zoom: 1; +} + +.nav-tabs * li { + zoom: normal; +} + +.nav-tabs li a { + *display: inline; + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + *background-color: #fffffe; + border: 1px solid transparent; + *border: 1px solid #fffffe; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; + *filter: chroma(color=#fffffe); + *zoom: 1; +} + +.nav-tabs li a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs * li a { + padding: 0; + line-height: auto; + background-color: inherit; + border: none; + filter: none; + zoom: normal; +} + +.nav-tabs .active a, +.nav-tabs .active a:hover { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + *border: 1px solid #999; + border-bottom-color: transparent; +} + +.nav-tabs * .active a, +.nav-tabs * .active a:hover { + color: inherit; + background-color: inherit; + border: none; +} + +.nav-pills li { + *background-color: #ffffff; + *zoom: 1; +} + +.nav-pills * li { + background-color: inherit; + zoom: normal; +} + +.nav-pills li a { + *display: inline; + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + *zoom: 1; +} + +.nav-pills * li a { + padding: 0; + margin: 0; + -webkit-border-radius: none; + -moz-border-radius: none; + border-radius: none; + zoom: normal; +} + +.nav-pills .active a, +.nav-pills .active a:hover { + color: #ffffff; + background-color: #0088cc; +} + +.nav-pills * .active a, +.nav-pills * .active a:hover { + color: inherit; + background-color: inherit; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + /* fix for IE6 li:hover */ + +} + +.nav-tabs .dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs .dropdown-menu li a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; + *zoom: 1; +} + +.nav-tabs .dropdown-menu li a:hover, +.nav-tabs .dropdown-menu li a:focus, +.nav-tabs .dropdown-menu .dropdown-submenu:hover a, +.nav-tabs .dropdown-menu .dropdown-submenu-hover a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.nav-tabs .dropdown-menu .dropdown-submenu-hover * a { + *color: inherit; + *background-color: #fffffe; + *background-image: none; + *filter: none; + *filter: chroma(color=#fffffe); +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + /* fix for IE6 li:hover */ + +} + +.nav-pills .dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-pills .dropdown-menu li a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; + *zoom: 1; +} + +.nav-pills .dropdown-menu li a:hover, +.nav-pills .dropdown-menu li a:focus, +.nav-pills .dropdown-menu .dropdown-submenu:hover a, +.nav-pills .dropdown-menu .dropdown-submenu-hover a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.nav-pills .dropdown-menu .dropdown-submenu-hover * a { + *color: inherit; + *background-color: #fffffe; + *background-image: none; + *filter: none; + *filter: chroma(color=#fffffe); +} + +.nav-tabs .dropdown-toggle { + *padding-top: 10px; + *padding-bottom: 12px; +} + +.nav-pills .dropdown-toggle { + *padding-top: 8px; + *padding-bottom: 6px; + *margin-bottom: 3px; +} + +.nav .dropdown-toggle .caret { + width: 0; + height: 0; + margin-top: 6px; + line-height: 0; + border-color: #0088cc transparent transparent; + *border-color: #0088cc #fffffe #fffffe; + border-top-color: #0088cc; + border-bottom-color: #0088cc; + border-style: solid; + border-width: 4px 4px 0; + *filter: progid:DXImageTransform.Microsoft.Chroma(color=#fffffe); +} + +.nav .dropdown-toggle:hover .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav .dropdown.active a:hover { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav li.dropdown-open.active a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown-open .caret, +.nav li.dropdown-open.active .caret, +.nav li.dropdown-open a:hover .caret { + width: 0; + height: 0; + line-height: 0; + border-color: #ffffff transparent transparent; + *border-color: #ffffff #fffffe #fffffe; + border-top-color: #ffffff; + border-bottom-color: #ffffff; + border-style: solid; + border-width: 4px 4px 0; + opacity: 1; + filter: alpha(opacity=100); + *filter: progid:DXImageTransform.Microsoft.Chroma(color=#fffffe); +} + +.tabs-stacked .open > a:hover { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below .nav-tabs, +.tabs-right .nav-tabs, +.tabs-left .nav-tabs { + border-bottom: 0; +} + +.tab-content .tab-pane, +.pill-content .pill-pane { + display: none; + *background-color: #ffffff; + *zoom: 1; +} + +.tab-content .active, +.pill-content .active { + display: block; +} + +.tabs-below .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below * .nav-tabs { + border-top: none; +} + +.tabs-below .nav-tabs li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below * .nav-tabs li { + margin-top: 0; + margin-bottom: -1px; +} + +.tabs-below .nav-tabs li a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below .nav-tabs li a:hover { + border-top-color: #ddd; + border-bottom-color: #fff; +} + +.tabs-below * .nav-tabs li a { + -webkit-border-radius: none; + -moz-border-radius: none; + border-radius: none; +} + +.tabs-below * .nav-tabs li a:hover { + border-top-color: inherit; + border-bottom-color: inherit; +} + +.tabs-below .nav-tabs .active a, +.tabs-below .nav-tabs .active a:hover { + border-color: transparent #999 #999 #999; +} + +.tabs-below * .nav-tabs .active a, +.tabs-below * .nav-tabs .active a:hover { + border-color: inherit; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav .disabled a { + color: #999999; +} + +.nav * .disabled a { + color: inherit; +} + +.nav .disabled a:hover { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.nav * .disabled a:hover { + text-decoration: underline; + cursor: default; + background-color: inherit; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; + color: #777777; +} + +.navbar-inner { + _height: 40px; + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + _margin-left: -10px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover { + text-decoration: none; +} + +.navbar .container-fluid .brand { + _margin-left: -10px; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 6px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav li { + float: left; +} + +.navbar .nav * li { + float: none; +} + +.navbar .nav li a { + *display: inline; + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.navbar .nav * li a { + padding: 0; + color: inherit; + text-decoration: inherit; + text-shadow: inherit; +} + +.navbar .nav li * a { + padding: 0; + color: inherit; + text-decoration: inherit; + text-shadow: inherit; +} + +.navbar .nav .dropdown-toggle { + /* fix for IE6 */ + + _padding: 12px; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav li a:focus, +.navbar .nav li a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav * li a:focus, +.navbar .nav * li a:hover { + color: inherit; + text-decoration: inherit; + background-color: inherit; +} + +.navbar .nav .active a, +.navbar .nav .active a:hover, +.navbar .nav .active a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .nav * .active a, +.navbar .nav * .active a:hover, +.navbar .nav * .active a:focus { + color: inherit; + text-decoration: inherit; + background-color: inherit; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav li .dropdown-menu { + /* fix for IE6 li:hover */ + +} + +.navbar .nav li .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav li .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar .nav li .dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.navbar .nav li .dropdown-menu li a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; + *zoom: 1; +} + +.navbar .nav li .dropdown-menu li a:hover, +.navbar .nav li .dropdown-menu li a:focus, +.navbar .nav li .dropdown-menu .dropdown-submenu:hover a, +.navbar .nav li .dropdown-menu .dropdown-submenu-hover a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.navbar .nav li .dropdown-menu .dropdown-submenu-hover * a { + *color: inherit; + *background-color: #fffffe; + *background-image: none; + *filter: none; + *filter: chroma(color=#fffffe); +} + +.navbar-fixed-bottom .nav li .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav li .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown.open .dropdown-toggle, +.navbar .nav li.dropdown.active .dropdown-toggle, +.navbar .nav li.dropdown.open.active .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open .dropdown-toggle .caret, +.navbar .nav li.dropdown.active .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right li .dropdown-menu, +.navbar .nav li .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right li .dropdown-menu:before, +.navbar .nav li .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right li .dropdown-menu:after, +.navbar .nav li .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right li .dropdown-menu .dropdown-menu, +.navbar .nav li .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse { + color: #999999; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav li a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav li a:hover { + color: #ffffff; +} + +.navbar-inverse .nav li a:focus, +.navbar-inverse .nav li a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active a, +.navbar-inverse .nav .active a:hover, +.navbar-inverse .nav .active a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb .active { + color: #999999; + background-color: #f5f5f5; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul li { + display: inline; +} + +.pagination ul li a, +.pagination ul li span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul li a:hover, +.pagination ul .active a, +.pagination ul .active span { + background-color: #f5f5f5; +} + +.pagination ul .active a, +.pagination ul .active span { + color: #999999; + cursor: default; +} + +.pagination ul .disabled span, +.pagination ul .disabled a, +.pagination ul .disabled a:hover { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul li.first-child a, +.pagination ul li.first-child span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul li:last-child a, +.pagination ul li:last-child span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul li a, +.pagination-large ul li span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul li:first-child a, +.pagination-large ul li:first-child span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul li:last-child a, +.pagination-large ul li:last-child span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul li:first-child a, +.pagination-small ul li:first-child a, +.pagination-mini ul li:first-child span, +.pagination-small ul li:first-child span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul li:last-child a, +.pagination-small ul li:last-child a, +.pagination-mini ul li:last-child span, +.pagination-small ul li:last-child span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul li a, +.pagination-small ul li span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul li a, +.pagination-mini ul li span { + padding: 1px 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li a, +.pager li span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next a, +.pager .next span { + float: right; +} + +.pager .previous a, +.pager .previous span { + float: left; +} + +.pager .disabled a, +.pager .disabled a:hover, +.pager .disabled span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + margin-top: -3px; +} + +.tooltip.right { + margin-left: 3px; +} + +.tooltip.bottom { + margin-top: 3px; +} + +.tooltip.left { + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + width: 0; + height: 0; + margin-left: -5px; + line-height: 0; + border-color: #000000 transparent transparent; + *border-color: #000000 #fffffe #fffffe; + border-top-color: #000000; + border-style: solid; + border-width: 5px 5px 0; + *filter: progid:DXImageTransform.Microsoft.Chroma(color=#fffffe); +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + width: 0; + height: 0; + margin-top: -5px; + line-height: 0; + border-color: transparent #000000 transparent transparent; + *border-color: #fffffe #000000 #fffffe #fffffe; + border-right-color: #000000; + border-style: solid; + border-width: 5px 5px 5px 0; + *filter: progid:DXImageTransform.Microsoft.Chroma(color=#fffffe); +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + width: 0; + height: 0; + margin-top: -5px; + line-height: 0; + border-color: transparent transparent transparent #000000; + *border-color: #fffffe #fffffe #fffffe #000000; + border-left-color: #000000; + border-style: solid; + border-width: 5px 0 5px 5px; + *filter: progid:DXImageTransform.Microsoft.Chroma(color=#fffffe); +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + width: 0; + height: 0; + margin-left: -5px; + line-height: 0; + border-color: transparent transparent #000000; + *border-color: #fffffe #fffffe #000000; + border-bottom-color: #000000; + border-style: solid; + border-width: 0 5px 5px; + *filter: progid:DXImageTransform.Microsoft.Chroma(color=#fffffe); +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + width: 236px; + padding: 1px; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover-content p, +.popover-content ul, +.popover-content ol { + margin-bottom: 0; +} + +.popover .arrow, +.popover .arrow-after { + position: absolute; + display: inline-block; + *display: inline; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + *zoom: 1; +} + +.popover .arrow-after { + z-index: -1; + content: ""; +} + +.popover.top .arrow { + *bottom: -12px; + left: 50%; + width: 0; + height: 0; + margin-left: -10px; + line-height: 0; + border-color: #cccccc transparent transparent; + *border-color: #cccccc #fffffe #fffffe; + border-top-color: #ffffff; + border-style: solid; + border-width: 10px 10px 0; + *filter: progid:DXImageTransform.Microsoft.Chroma(color=#fffffe); +} + +.popover.top .arrow.arrow-after { + bottom: -1px; + left: -11px; + border-top-color: rgba(0, 0, 0, 0.25); + border-width: 11px 11px 0; +} + +.popover.right .arrow { + top: 50%; + *left: -10px; + width: 0; + height: 0; + margin-top: -10px; + line-height: 0; + border-color: transparent #cccccc transparent transparent; + *border-color: #fffffe #cccccc #fffffe #fffffe; + border-right-color: #ffffff; + border-style: solid; + border-width: 10px 10px 10px 0; + *filter: progid:DXImageTransform.Microsoft.Chroma(color=#fffffe); +} + +.popover.right .arrow-after { + bottom: -11px; + left: -1px; + border-right-color: rgba(0, 0, 0, 0.25); + border-width: 11px 11px 11px 0; +} + +.popover.bottom .arrow { + *top: -10px; + left: 50%; + width: 0; + height: 0; + margin-left: -10px; + line-height: 0; + border-color: transparent transparent #cccccc; + *border-color: #fffffe #fffffe #cccccc; + border-bottom-color: #ffffff; + border-style: solid; + border-width: 0 10px 10px; + *filter: progid:DXImageTransform.Microsoft.Chroma(color=#fffffe); +} + +.popover.bottom .arrow-after { + top: -1px; + left: -11px; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-width: 0 11px 11px; +} + +.popover.left .arrow { + top: 50%; + *right: -10px; + width: 0; + height: 0; + margin-top: -10px; + line-height: 0; + border-color: transparent transparent transparent #cccccc; + *border-color: #fffffe #fffffe #fffffe #cccccc; + border-left-color: #ffffff; + border-style: solid; + border-width: 10px 0 10px 10px; + *filter: progid:DXImageTransform.Microsoft.Chroma(color=#fffffe); +} + +.popover.left .arrow-after { + right: -1px; + bottom: -11px; + border-left-color: rgba(0, 0, 0, 0.25); + border-width: 11px 0 11px 11px; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel .item img { + display: block; + *width: 100%; + *height: auto; + line-height: 1; +} + +.carousel .active, +.carousel .next, +.carousel .prev { + display: block; +} + +.carousel .active { + left: 0; +} + +.carousel .next, +.carousel .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel .next { + left: 100%; +} + +.carousel .prev { + left: -100%; +} + +.carousel .next.left, +.carousel .prev.right { + left: 0; +} + +.carousel .active.left { + left: -100%; +} + +.carousel .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control-right { + right: 15px; + left: auto; +} + +.carousel-control-left { + left: 15px; +} + +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); + _filter: alpha(opacity=70); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-ie6.min.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-ie6.min.css new file mode 100644 index 00000000..04b8c351 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-ie6.min.css @@ -0,0 +1 @@ +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{display:inline;float:left;width:940px;min-height:1px;margin-left:20px}.span11{display:inline;float:left;width:860px;min-height:1px;margin-left:20px}.span10{display:inline;float:left;width:780px;min-height:1px;margin-left:20px}.span9{display:inline;float:left;width:700px;min-height:1px;margin-left:20px}.span8{display:inline;float:left;width:620px;min-height:1px;margin-left:20px}.span7{display:inline;float:left;width:540px;min-height:1px;margin-left:20px}.span6{display:inline;float:left;width:460px;min-height:1px;margin-left:20px}.span5{display:inline;float:left;width:380px;min-height:1px;margin-left:20px}.span4{display:inline;float:left;width:300px;min-height:1px;margin-left:20px}.span3{display:inline;float:left;width:220px;min-height:1px;margin-left:20px}.span2{display:inline;float:left;width:140px;min-height:1px;margin-left:20px}.span1{display:inline;float:left;width:60px;min-height:1px;margin-left:20px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.span-first-child{margin-left:10px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{display:block;float:left;width:100%;*width:99.94680851063829%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid .span11{display:block;float:left;width:100%;width:91.48936170212765%;*width:91.43617021276594%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid .span10{display:block;float:left;width:100%;width:82.97872340425532%;*width:82.92553191489361%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid .span9{display:block;float:left;width:100%;width:74.46808510638297%;*width:74.41489361702126%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid .span8{display:block;float:left;width:100%;width:65.95744680851064%;*width:65.90425531914893%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid .span7{display:block;float:left;width:100%;width:57.44680851063829%;*width:57.39361702127659%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid .span6{display:block;float:left;width:100%;width:48.93617021276595%;*width:48.88297872340425%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid .span5{display:block;float:left;width:100%;width:40.42553191489362%;*width:40.37234042553192%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid .span4{display:block;float:left;width:100%;width:31.914893617021278%;*width:31.861702127659576%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid .span3{display:block;float:left;width:100%;width:23.404255319148934%;*width:23.351063829787233%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid .span2{display:block;float:left;width:100%;width:14.893617021276595%;*width:14.840425531914894%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid .span1{display:block;float:left;width:100%;width:6.382978723404255%;*width:6.329787234042553%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}.row-fluid .span-first-child{margin-left:0}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;*margin-left:-7px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,.input-text,.input-password,.input-datetime,.input-datetime-local,.input-date,.input-month,.input-time,.input-week,.input-number,.input-email,.input-url,.input-search,.input-tel,.input-color,.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,.input-text,.input-password,.input-datetime,.input-datetime-local,.input-date,.input-month,.input-time,.input-week,.input-number,.input-email,.input-url,.input-search,.input-tel,.input-color,.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,.input-text:focus,.input-password:focus,.input-datetime:focus,.input-datetime-local:focus,.input-date:focus,.input-month:focus,.input-time:focus,.input-week:focus,.input-number:focus,.input-email:focus,.input-url:focus,.input-search:focus,.input-tel:focus,.input-color:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal;cursor:pointer}.input-file,.input-image,.input-submit,.input-reset,.input-button,.input-radio,.input-checkbox{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}.select-multiple,.select-size{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px;_padding-left:0}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline,.radio-inline,.checkbox-inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline,.radio-inline .checkbox-inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12{float:none;width:926px;margin-left:0}.uneditable-input-span12{width:926px}input.span11,textarea.span11{float:none;width:846px;margin-left:0}.uneditable-input-span11{width:846px}input.span10,textarea.span10{float:none;width:766px;margin-left:0}.uneditable-input-span10{width:766px}input.span9,textarea.span9{float:none;width:686px;margin-left:0}.uneditable-input-span9{width:686px}input.span8,textarea.span8{float:none;width:606px;margin-left:0}.uneditable-input-span8{width:606px}input.span7,textarea.span7{float:none;width:526px;margin-left:0}.uneditable-input-span7{width:526px}input.span6,textarea.span6{float:none;width:446px;margin-left:0}.uneditable-input-span6{width:446px}input.span5,textarea.span5{float:none;width:366px;margin-left:0}.uneditable-input-span5{width:366px}input.span4,textarea.span4{float:none;width:286px;margin-left:0}.uneditable-input-span4{width:286px}input.span3,textarea.span3{float:none;width:206px;margin-left:0}.uneditable-input-span3{width:206px}input.span2,textarea.span2{float:none;width:126px;margin-left:0}.uneditable-input-span2{width:126px}input.span1,textarea.span1{float:none;width:46px;margin-left:0}.uneditable-input-span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}.input-disabled,.select-disabled,.textarea-disabled,.input-readonly,.select-readonly,.textarea-readonly{cursor:not-allowed;background-color:#eee}.radio-disabled,.checkbox-disabled,.radio-readonly,.checkbox-readonly{background-color:transparent}.control-group-warning label,.control-group-warning .help-block,.control-group-warning .help-inline{color:#c09853}.control-group-warning * label{color:inherit}.control-group-warning .checkbox,.control-group-warning .radio,.control-group-warning input,.control-group-warning select,.control-group-warning textarea{color:#c09853}.control-group-warning input,.control-group-warning select,.control-group-warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group-warning input:focus,.control-group-warning select:focus,.control-group-warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group-warning .input-prepend .add-on,.control-group-warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group-error label,.control-group-error .help-block,.control-group-error .help-inline{color:#b94a48}.control-group-error * label{color:inherit}.control-group-error .checkbox,.control-group-error .radio,.control-group-error input,.control-group-error select,.control-group-error textarea{color:#b94a48}.control-group-error input,.control-group-error select,.control-group-error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group-error input:focus,.control-group-error select:focus,.control-group-error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group-error .input-prepend .add-on,.control-group-error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group-success label,.control-group-success .help-block,.control-group-success .help-inline{color:#468847}.control-group-success * label{color:inherit}.control-group-success .checkbox,.control-group-success .radio,.control-group-success input,.control-group-success select,.control-group-success textarea{color:#468847}.control-group-success input,.control-group-success select,.control-group-success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group-success input:focus,.control-group-success select:focus,.control-group-success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group-success .input-prepend .add-on,.control-group-success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group-info label,.control-group-info .help-block,.control-group-info .help-inline{color:#3a87ad}.control-group-info * label{color:inherit}.control-group-info .checkbox,.control-group-info .radio,.control-group-info input,.control-group-info select,.control-group-info textarea{color:#3a87ad}.control-group-info input,.control-group-info select,.control-group-info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group-info input:focus,.control-group-info select:focus,.control-group-info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group-info .input-prepend .add-on,.control-group-info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{*margin-top:1px;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;*margin-right:-2px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn,.input-append select+.btn-group .btn,.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px;*margin-left:-2px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls-first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody .tr-hover td,.table-hover tbody .tr-hover th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.warning td{background-color:#fcf8e3}.table tbody tr.info td{background-color:#d9edf7}.table-hover tbody tr.success:hover td{background-color:#d0e9c6}.table-hover tbody tr.error:hover td{background-color:#ebcccc}.table-hover tbody tr.warning:hover td{background-color:#faf2cc}.table-hover tbody tr.info:hover td{background-color:#c4e3f3}.icon-xxx{display:inline-block;_display:inline;width:14px;_width:14px;height:14px;_height:19px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;_vertical-align:middle;background-image:url("../img/glyphicons-halflings.png");_background-image:url("../img/glyphicons-halflings-8.png");background-position:14px 14px;background-repeat:no-repeat;_zoom:1}.icon-white{background-image:url("../img/glyphicons-halflings-white.png")}.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative;display:inline;*zoom:1}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;*display:inline;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";*zoom:1}.caret{width:0;height:0;line-height:0;border-color:#000 transparent transparent;*border-color:#000 #fffffe #fffffe;border-style:solid;border-width:4px 4px 0;*filter:progid:DXImageTransform.Microsoft.Chroma(color=#fffffe)}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;*width:auto!important;*width:160px;*height:1px;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu li a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap;*zoom:1}.dropdown-menu li a:hover,.dropdown-menu li a:focus,.dropdown-submenu:hover a,.dropdown-submenu-hover a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-submenu-hover * a{*color:inherit;*background-color:#fffffe;*background-image:none;*filter:none;*filter:chroma(color=#fffffe)}.dropdown-menu .active a,.dropdown-menu .active a:hover{color:#333;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .disabled a,.dropdown-menu .disabled a:hover{color:#999}.dropdown-menu .disabled a:hover{text-decoration:none;cursor:default;background-color:transparent;*background-color:#fffffe;background-image:none;*filter:chroma(color=#fffffe)}.open{*z-index:1000}.open .dropdown-menu{display:block;*zoom:1}.pull-right .dropdown-menu{right:0;left:auto}.pull-right * .dropdown-menu{right:auto;left:0}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative;*display:inline;*zoom:1}.dropdown-submenu .dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover .dropdown-menu,.dropdown-submenu-hover .dropdown-menu{display:block}.dropup .dropdown-submenu .dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;*border-color:#fffffe;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" ";*filter:chroma(color=#fffffe);*zoom:1}.dropdown-submenu .dropdown-tri{display:block;float:right;width:0;height:0;margin:-1.3em 5px 0 0;line-height:0;border-color:transparent transparent transparent #ccc;_border-color:#fffffe #fffffe #fffffe #ccc;border-style:solid;border-width:5px 0 5px 5px;_filter:chroma(color=#fffffe);zoom:1}.dropdown-submenu:hover a:after,.dropdown-submenu-hover .dropdown-tri{border-left-color:#fff}.dropdown-submenu-pull-left{float:none}.dropdown-submenu-pull-left .dropdown-menu{left:-100%;margin-left:10px;*margin-left:18px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown-submenu-pull-left * .dropdown-menu{left:0;margin-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.btn{display:inline-block;*display:inline;padding:4px 12px;_padding-top:3px;_padding-bottom:3px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn.btn-hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:active,.btn.active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled],.btn-disabled{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn.btn-large{*padding-top:7px;*padding-bottom:7px}.btn.btn-small{*padding-top:3px;*padding-bottom:3px}.btn.btn-mini{*padding-top:1px;*padding-bottom:1px}a.btn{*padding-top:5px;*padding-bottom:5px}a.btn.btn-large{*padding-top:13px;*padding-bottom:15px}a.btn.btn-small{*padding-top:4px;*padding-bottom:4px}a.btn.btn-mini{*padding-top:3px;*padding-bottom:3px}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:2px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini{padding:1px 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-primary.btn-primary-hover{color:#fff;background-color:#04c;*background-color:#003bb3}a.btn-primary-hover:hover{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-warning.btn-warning-hover{color:#fff;background-color:#f89406;*background-color:#df8505}a.btn-warning-hover:hover{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-danger.btn-danger-hover{color:#fff;background-color:#bd362f;*background-color:#a9302a}a.btn-danger-hover:hover{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-success.btn-success-hover{color:#fff;background-color:#51a351;*background-color:#499249}a.btn-success-hover:hover{color:#fff;background-color:#51a351;*background-color:#499249}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-info.btn-info-hover{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}a.btn-info-hover:hover{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}.btn-inverse.btn-inverse-hover{color:#fff;background-color:#222;*background-color:#3c3c3c}a.btn-inverse-hover:hover{color:#fff;background-color:#222;*background-color:#3c3c3c}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover{color:#333;text-decoration:none}.btn-disabled{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);filter:alpha(opacity=35);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group{margin-left:5px}.btn-group-first{margin-left:0}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar .btn .btn-group{margin-left:5px}.btn-toolbar .btn-first,.btn-toolbar .btn-group-first{margin-left:0}.btn-group .btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group .btn{margin-left:-1px}.btn-group .btn-first{margin-left:0}.btn-group .btn,.btn-group .dropdown-menu{font-size:14px}.btn-group .dropdown-menu .divider{_margin:5px 0 -5px}.btn-group .btn-mini{font-size:11px}.btn-group .btn-small{font-size:12px}.btn-group .btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group .dropdown-toggle{padding-right:9px;padding-left:9px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group .btn-mini-dropdown-toggle{padding-right:7px;padding-left:7px}.btn-group .btn-large-dropdown-toggle{padding-right:17px;padding-left:17px}.btn-group-open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group-open .btn-dropdown-toggle{background-color:#e6e6e6}.btn-group-open .btn-primary-dropdown-toggle{background-color:#04c}.btn-group-open .btn-warning-dropdown-toggle{background-color:#f89406}.btn-group-open .btn-danger-dropdown-toggle{background-color:#bd362f}.btn-group-open .btn-success-dropdown-toggle{background-color:#51a351}.btn-group-open .btn-info-dropdown-toggle{background-color:#2f96b4}.btn-group-open .btn-inverse-dropdown-toggle{background-color:#222}.btn .caret{_display:inline;_height:8px;margin-top:8px;margin-left:0;_vertical-align:middle;_zoom:1}.btn-mini .caret,.btn-small .caret{_height:10px}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{_height:9px;border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert h4{*display:inline;margin:0;*zoom:1}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block p,.alert-block ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav li a{display:block;*zoom:1}.nav * li a{display:inline}.nav li * a{display:inline}.nav li a:hover{text-decoration:none;background-color:#eee}.nav * li a:hover{text-decoration:inherit;background-color:inherit}.nav li * a:hover{text-decoration:inherit;background-color:inherit}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase;*zoom:1}.nav .nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list li a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list li a{padding:3px 15px}.nav-list * li a{padding:0;margin-right:0;margin-left:0;text-shadow:none}.nav-list li * a{padding:0;margin-right:0;margin-left:0;text-shadow:none}.nav-list .active a,.nav-list .active a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list * .active a,.nav-list * .active a:hover{color:inherit;text-shadow:none;background-color:inherit}.nav-list .active * a,.nav-list .active * a:hover{color:inherit;text-shadow:none;background-color:inherit}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs li,.nav-pills li{float:left}.nav-tabs * li,.nav-pills * li{float:none}.nav-tabs li a,.nav-pills li a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs * li a,.nav-pills * li a{padding:0;margin:0;line-height:auto}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs li{margin-bottom:-1px;*background-color:#fff;*zoom:1}.nav-tabs * li{zoom:normal}.nav-tabs li a{*display:inline;padding-top:8px;padding-bottom:8px;line-height:20px;*background-color:#fffffe;border:1px solid transparent;*border:1px solid #fffffe;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;*filter:chroma(color=#fffffe);*zoom:1}.nav-tabs li a:hover{border-color:#eee #eee #ddd}.nav-tabs * li a{padding:0;line-height:auto;background-color:inherit;border:0;filter:none;zoom:normal}.nav-tabs .active a,.nav-tabs .active a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;*border:1px solid #999;border-bottom-color:transparent}.nav-tabs * .active a,.nav-tabs * .active a:hover{color:inherit;background-color:inherit;border:0}.nav-pills li{*background-color:#fff;*zoom:1}.nav-pills * li{background-color:inherit;zoom:normal}.nav-pills li a{*display:inline;padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;*zoom:1}.nav-pills * li a{padding:0;margin:0;-webkit-border-radius:none;-moz-border-radius:none;border-radius:none;zoom:normal}.nav-pills .active a,.nav-pills .active a:hover{color:#fff;background-color:#08c}.nav-pills * .active a,.nav-pills * .active a:hover{color:inherit;background-color:inherit}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-tabs .dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs .dropdown-menu li a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap;*zoom:1}.nav-tabs .dropdown-menu li a:hover,.nav-tabs .dropdown-menu li a:focus,.nav-tabs .dropdown-menu .dropdown-submenu:hover a,.nav-tabs .dropdown-menu .dropdown-submenu-hover a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.nav-tabs .dropdown-menu .dropdown-submenu-hover * a{*color:inherit;*background-color:#fffffe;*background-image:none;*filter:none;*filter:chroma(color=#fffffe)}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav-pills .dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-pills .dropdown-menu li a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap;*zoom:1}.nav-pills .dropdown-menu li a:hover,.nav-pills .dropdown-menu li a:focus,.nav-pills .dropdown-menu .dropdown-submenu:hover a,.nav-pills .dropdown-menu .dropdown-submenu-hover a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.nav-pills .dropdown-menu .dropdown-submenu-hover * a{*color:inherit;*background-color:#fffffe;*background-image:none;*filter:none;*filter:chroma(color=#fffffe)}.nav-tabs .dropdown-toggle{*padding-top:10px;*padding-bottom:12px}.nav-pills .dropdown-toggle{*padding-top:8px;*padding-bottom:6px;*margin-bottom:3px}.nav .dropdown-toggle .caret{width:0;height:0;margin-top:6px;line-height:0;border-color:#08c transparent transparent;*border-color:#08c #fffffe #fffffe;border-top-color:#08c;border-bottom-color:#08c;border-style:solid;border-width:4px 4px 0;*filter:progid:DXImageTransform.Microsoft.Chroma(color=#fffffe)}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav .dropdown.active a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav li.dropdown-open.active a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown-open .caret,.nav li.dropdown-open.active .caret,.nav li.dropdown-open a:hover .caret{width:0;height:0;line-height:0;border-color:#fff transparent transparent;*border-color:#fff #fffffe #fffffe;border-top-color:#fff;border-bottom-color:#fff;border-style:solid;border-width:4px 4px 0;opacity:1;filter:alpha(opacity=100);*filter:progid:DXImageTransform.Microsoft.Chroma(color=#fffffe)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0}.tab-content .tab-pane,.pill-content .pill-pane{display:none;*background-color:#fff;*zoom:1}.tab-content .active,.pill-content .active{display:block}.tabs-below .nav-tabs{border-top:1px solid #ddd}.tabs-below * .nav-tabs{border-top:0}.tabs-below .nav-tabs li{margin-top:-1px;margin-bottom:0}.tabs-below * .nav-tabs li{margin-top:0;margin-bottom:-1px}.tabs-below .nav-tabs li a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below .nav-tabs li a:hover{border-top-color:#ddd;border-bottom-color:#fff}.tabs-below * .nav-tabs li a{-webkit-border-radius:none;-moz-border-radius:none;border-radius:none}.tabs-below * .nav-tabs li a:hover{border-top-color:inherit;border-bottom-color:inherit}.tabs-below .nav-tabs .active a,.tabs-below .nav-tabs .active a:hover{border-color:transparent #999 #999 #999}.tabs-below * .nav-tabs .active a,.tabs-below * .nav-tabs .active a:hover{border-color:inherit}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav .disabled a{color:#999}.nav * .disabled a{color:inherit}.nav .disabled a:hover{text-decoration:none;cursor:default;background-color:transparent}.nav * .disabled a:hover{text-decoration:underline;cursor:default;background-color:inherit}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible;color:#777}.navbar-inner{_height:40px;min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;_margin-left:-10px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar .container-fluid .brand{_margin-left:-10px}.navbar-text{margin-bottom:0;line-height:40px}.navbar-link{color:#777}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav li{float:left}.navbar .nav * li{float:none}.navbar .nav li a{*display:inline;float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff;*zoom:1}.navbar .nav * li a{padding:0;color:inherit;text-decoration:inherit;text-shadow:inherit}.navbar .nav li * a{padding:0;color:inherit;text-decoration:inherit;text-shadow:inherit}.navbar .nav .dropdown-toggle{_padding:12px}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav li a:focus,.navbar .nav li a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav * li a:focus,.navbar .nav * li a:hover{color:inherit;text-decoration:inherit;background-color:inherit}.navbar .nav .active a,.navbar .nav .active a:hover,.navbar .nav .active a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .nav * .active a,.navbar .nav * .active a:hover,.navbar .nav * .active a:focus{color:inherit;text-decoration:inherit;background-color:inherit;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav li .dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav li .dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar .nav li .dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.navbar .nav li .dropdown-menu li a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap;*zoom:1}.navbar .nav li .dropdown-menu li a:hover,.navbar .nav li .dropdown-menu li a:focus,.navbar .nav li .dropdown-menu .dropdown-submenu:hover a,.navbar .nav li .dropdown-menu .dropdown-submenu-hover a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.navbar .nav li .dropdown-menu .dropdown-submenu-hover * a{*color:inherit;*background-color:#fffffe;*background-image:none;*filter:none;*filter:chroma(color=#fffffe)}.navbar-fixed-bottom .nav li .dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav li .dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown.open .dropdown-toggle,.navbar .nav li.dropdown.active .dropdown-toggle,.navbar .nav li.dropdown.open.active .dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown .dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open .dropdown-toggle .caret,.navbar .nav li.dropdown.active .dropdown-toggle .caret,.navbar .nav li.dropdown.open.active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right li .dropdown-menu,.navbar .nav li .dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right li .dropdown-menu:before,.navbar .nav li .dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right li .dropdown-menu:after,.navbar .nav li .dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right li .dropdown-menu .dropdown-menu,.navbar .nav li .dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav li a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav li a:hover{color:#fff}.navbar-inverse .nav li a:focus,.navbar-inverse .nav li a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active a,.navbar-inverse .nav .active a:hover,.navbar-inverse .nav .active a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999;background-color:#f5f5f5}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul li{display:inline}.pagination ul li a,.pagination ul li span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul li a:hover,.pagination ul .active a,.pagination ul .active span{background-color:#f5f5f5}.pagination ul .active a,.pagination ul .active span{color:#999;cursor:default}.pagination ul .disabled span,.pagination ul .disabled a,.pagination ul .disabled a:hover{color:#999;cursor:default;background-color:transparent}.pagination ul li.first-child a,.pagination ul li.first-child span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul li:last-child a,.pagination ul li:last-child span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul li a,.pagination-large ul li span{padding:11px 19px;font-size:17.5px}.pagination-large ul li:first-child a,.pagination-large ul li:first-child span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul li:last-child a,.pagination-large ul li:last-child span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul li:first-child a,.pagination-small ul li:first-child a,.pagination-mini ul li:first-child span,.pagination-small ul li:first-child span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul li:last-child a,.pagination-small ul li:last-child a,.pagination-mini ul li:last-child span,.pagination-small ul li:last-child span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul li a,.pagination-small ul li span{padding:2px 10px;font-size:11.9px}.pagination-mini ul li a,.pagination-mini ul li span{padding:1px 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li a,.pager li span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a,.pager .next span{float:right}.pager .previous a,.pager .previous span{float:left}.pager .disabled a,.pager .disabled a:hover,.pager .disabled span{color:#999;cursor:default;background-color:#fff}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;width:0;height:0;margin-left:-5px;line-height:0;border-color:#000 transparent transparent;*border-color:#000 #fffffe #fffffe;border-top-color:#000;border-style:solid;border-width:5px 5px 0;*filter:progid:DXImageTransform.Microsoft.Chroma(color=#fffffe)}.tooltip.right .tooltip-arrow{top:50%;left:0;width:0;height:0;margin-top:-5px;line-height:0;border-color:transparent #000 transparent transparent;*border-color:#fffffe #000 #fffffe #fffffe;border-right-color:#000;border-style:solid;border-width:5px 5px 5px 0;*filter:progid:DXImageTransform.Microsoft.Chroma(color=#fffffe)}.tooltip.left .tooltip-arrow{top:50%;right:0;width:0;height:0;margin-top:-5px;line-height:0;border-color:transparent transparent transparent #000;*border-color:#fffffe #fffffe #fffffe #000;border-left-color:#000;border-style:solid;border-width:5px 0 5px 5px;*filter:progid:DXImageTransform.Microsoft.Chroma(color=#fffffe)}.tooltip.bottom .tooltip-arrow{top:0;left:50%;width:0;height:0;margin-left:-5px;line-height:0;border-color:transparent transparent #000;*border-color:#fffffe #fffffe #000;border-bottom-color:#000;border-style:solid;border-width:0 5px 5px;*filter:progid:DXImageTransform.Microsoft.Chroma(color=#fffffe)}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow-after{position:absolute;display:inline-block;*display:inline;width:0;height:0;border-color:transparent;border-style:solid;*zoom:1}.popover .arrow-after{z-index:-1;content:""}.popover.top .arrow{*bottom:-12px;left:50%;width:0;height:0;margin-left:-10px;line-height:0;border-color:#ccc transparent transparent;*border-color:#ccc #fffffe #fffffe;border-top-color:#fff;border-style:solid;border-width:10px 10px 0;*filter:progid:DXImageTransform.Microsoft.Chroma(color=#fffffe)}.popover.top .arrow.arrow-after{bottom:-1px;left:-11px;border-top-color:rgba(0,0,0,0.25);border-width:11px 11px 0}.popover.right .arrow{top:50%;*left:-10px;width:0;height:0;margin-top:-10px;line-height:0;border-color:transparent #ccc transparent transparent;*border-color:#fffffe #ccc #fffffe #fffffe;border-right-color:#fff;border-style:solid;border-width:10px 10px 10px 0;*filter:progid:DXImageTransform.Microsoft.Chroma(color=#fffffe)}.popover.right .arrow-after{bottom:-11px;left:-1px;border-right-color:rgba(0,0,0,0.25);border-width:11px 11px 11px 0}.popover.bottom .arrow{*top:-10px;left:50%;width:0;height:0;margin-left:-10px;line-height:0;border-color:transparent transparent #ccc;*border-color:#fffffe #fffffe #ccc;border-bottom-color:#fff;border-style:solid;border-width:0 10px 10px;*filter:progid:DXImageTransform.Microsoft.Chroma(color=#fffffe)}.popover.bottom .arrow-after{top:-1px;left:-11px;border-bottom-color:rgba(0,0,0,0.25);border-width:0 11px 11px}.popover.left .arrow{top:50%;*right:-10px;width:0;height:0;margin-top:-10px;line-height:0;border-color:transparent transparent transparent #ccc;*border-color:#fffffe #fffffe #fffffe #ccc;border-left-color:#fff;border-style:solid;border-width:10px 0 10px 10px;*filter:progid:DXImageTransform.Microsoft.Chroma(color=#fffffe)}.popover.left .arrow-after{right:-1px;bottom:-11px;border-left-color:rgba(0,0,0,0.25);border-width:11px 0 11px 11px}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item img{display:block;*width:100%;*height:auto;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control-right{right:15px;left:auto}.carousel-control-left{left:15px}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75);_filter:alpha(opacity=70)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-responsive.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-responsive.css new file mode 100644 index 00000000..c0bba15b --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-responsive.css @@ -0,0 +1,1109 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-responsive.min.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-responsive.min.css new file mode 100644 index 00000000..96a435be --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-responsive.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap.css new file mode 100644 index 00000000..5b7fe7e8 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap.css @@ -0,0 +1,6167 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover, +a:focus { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover, +a.muted:focus { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover, +a.text-error:focus { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover, +a.text-info:focus { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover, +a.text-success:focus { + color: #356635; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + padding-right: 5px; + padding-left: 5px; + *zoom: 1; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + font-size: 0; + white-space: nowrap; + vertical-align: middle; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success > td { + background-color: #dff0d8; +} + +.table tbody tr.error > td { + background-color: #f2dede; +} + +.table tbody tr.warning > td { + background-color: #fcf8e3; +} + +.table tbody tr.info > td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover > td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover > td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover > td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover > td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/focus/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + width: 16px; + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover, +.navbar-link:focus { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-title:empty { + display: none; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} + +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} + +.carousel-indicators .active { + background-color: #fff; +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap.min.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap.min.css new file mode 100644 index 00000000..df96c864 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/ie.css b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/ie.css new file mode 100644 index 00000000..25d84575 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/ie.css @@ -0,0 +1,59 @@ +/* NAVBAR */ + +/* !CPU HIGH, fix for IE6 shake when scroll */ +* html,* html body { + _background-image:url(about:blank); + _background-attachment:fixed; +} +/* !CPU HIGH, fix for IE6 not support fixed position */ +.navbar-fixed-top { + _position:absolute; + _bottom:auto; + _top:expression(eval(document.documentElement.scrollTop)); +} +/* !CPU HIGH, fix for IE6 not support fixed position */ +.navbar-fixed-bottom { + _position:absolute; + _bottom:auto; + _top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0))); +} + +/* DROPDOWN */ +.dropup, +.dropdown { + *zoom:1; +} + +/* CLOSE */ +.close { + _font-size: 15px; +} + +.modal-header h3 { + *display: inline; + *zoom:1; +} + +/* MODALS */ +.modal-backdrop { + _position: absolute; + _top:0; + _margin-top:0; + _width:expression(eval(document.documentElement.scrollWidth)); + _height:expression(eval(document.documentElement.scrollHeight)); +} +.modal { + _position:absolute; + _top:0; + _margin-top:0; + _top:expression(eval(document.documentElement.scrollTop)); +} +.modal.fade.in { + _filter:alpha(opacity=100); +} +.modal-backdrop { + _filter: alpha(opacity=80); +} +.modal-body { + _height:expression(this.scrollHeight > 400 ? "400px" : "auto"); +} diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/img/glyphicons-halflings-white.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/img/glyphicons-halflings-white.png new file mode 100644 index 00000000..3bf6484a Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/img/glyphicons-halflings-white.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/img/glyphicons-halflings.png b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/img/glyphicons-halflings.png new file mode 100644 index 00000000..a9969993 Binary files /dev/null and b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/img/glyphicons-halflings.png differ diff --git a/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/js/bootstrap.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/js/bootstrap.js new file mode 100644 index 00000000..44109f62 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/formdesign/bootstrap/js/bootstrap.js @@ -0,0 +1,2280 @@ +/* =================================================== + * bootstrap-transition.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#transitions + * =================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $(function () { + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.jQuery);/* ========================================================== + * bootstrap-alert.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#alerts + * ========================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT NO CONFLICT + * ================= */ + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + /* ALERT DATA-API + * ============== */ + + $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) + +}(window.jQuery);/* ============================================================ + * bootstrap-button.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#buttons + * ============================================================ + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON NO CONFLICT + * ================== */ + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + /* BUTTON DATA-API + * =============== */ + + $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + +}(window.jQuery);/* ========================================================== + * bootstrap-carousel.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#carousel + * ========================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + if (this.interval) clearInterval(this.interval); + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , getActiveIndex: function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + return this.$items.index(this.$active) + } + + , to: function (pos) { + var activeIndex = this.getActiveIndex() + , that = this + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activeIndex == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + , direction: direction + }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + , slideIndex + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('carousel').pause().to(slideIndex).cycle() + } + + e.preventDefault() + }) + +}(window.jQuery);/* ============================================================= + * bootstrap-collapse.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#collapse + * ============================================================= + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning || this.$element.hasClass('in')) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning || !this.$element.hasClass('in')) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.jQuery);/* ============================================================ + * bootstrap-dropdown.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#dropdowns + * ============================================================ + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement) { + // if mobile we we use a backdrop because click events don't delegate + $('' + }, + 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) { + //鏂板涓涓弬鏁癿enu, 璇ュ弬鏁板瓨鍌ㄤ簡menuItem鎵瀵瑰簲鐨刴enu寮曠敤 + 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 鏂板涓涓弬鏁癿enu, 璇ュ弬鏁板瓨鍌ㄤ簡menuItem鎵瀵瑰簲鐨刴enu寮曠敤 + * @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鍜宨tem鎻愭垚閫氱敤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; + + //淇濆瓨鐜鐨刼verflow鍊 + 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) { + //鏈塸op鏄剧ず灏变笉闅愯棌蹇嵎鑿滃崟 + 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璺熺紪杈戝櫒鐨勯傞厤灞 +//閭d釜鎸夐挳寮瑰嚭鏄痙ialog锛屾槸涓嬫媺绛愮瓑閮芥槸鍦ㄨ繖涓猨s涓厤缃 +//鑷繁鍐欑殑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涓嶅垱寤篸ialog + 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; + } + + //鎺ュ彈澶栭儴瀹氬埗鐨刄I + + 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/plug-in/Formdesign/js/ueditor/ueditor.all.min.js b/src/main/webapp/plug-in/Formdesign/js/ueditor/ueditor.all.min.js new file mode 100644 index 00000000..c89aa8c4 --- /dev/null +++ b/src/main/webapp/plug-in/Formdesign/js/ueditor/ueditor.all.min.js @@ -0,0 +1,709 @@ +(function(){function W(d,c,b){var a;c=c.toLowerCase();return(a=d.__allListeners||b&&(d.__allListeners={}))&&(a[c]||b&&(a[c]=[]))}function X(d,c,b,a,e,h){a=a&&d[c];var g;for(!a&&(a=d[b]);!a&&(g=(g||d).parentNode);){if("BODY"==g.tagName||h&&!h(g))return null;a=g[b]}return a&&e&&!e(a)?X(a,c,b,!1,e):a}UEDITOR_CONFIG=window.UEDITOR_CONFIG||{};var s=window.baidu||{};window.baidu=s;window.UE=s.editor=window.UE||{};UE.plugins={};UE.commands={};UE.instants={};UE.I18N={};UE._customizeUI={};UE.version="1.4.3"; +var L=UE.dom={},r=UE.browser=function(){var d=navigator.userAgent.toLowerCase(),c=window.opera,b={ie:/(msie\s|trident.*rv:)([\w.]+)/.test(d),opera:!!c&&c.version,webkit:-1a||b.quirks;b.ie9above=8a;b.ie11above=10a}b.gecko&&(e=d.match(/rv:([\d\.]+)/))&&(e=e[1].split("."),a=1E4*e[0]+100*(e[1]||0)+1*(e[2]||0));/chrome\/(\d+\.\d)/i.test(d)&&(b.chrome=+RegExp.$1);/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(d)&&!/chrome/i.test(d)&& +(b.safari=+(RegExp.$1||RegExp.$2));b.opera&&(a=parseFloat(c.version()));b.webkit&&(a=parseFloat(d.match(/ applewebkit\/(\d+)/)[1]));b.version=a;b.isCompatible=!b.mobile&&(b.ie&&6<=a||b.gecko&&10801<=a||b.opera&&9.5<=a||b.air&&1<=a||b.webkit&&522<=a||!1);return b}(),I=r.ie,ma=r.opera,p=UE.utils={each:function(d,c,b){if(null!=d)if(d.length===+d.length)for(var a=0,e=d.length;a=b&&e===c)return a=h,!1});return a},removeItem:function(d,c){for(var b=0,a=d.length;b'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g, +function(b,a){return a?b:{"<":"<","&":"&",'"':""",">":">","'":"'"}[b]}):""},html:function(d){return d?d.replace(/&((g|l|quo)t|amp|#39|nbsp);/g,function(c){return{"<":"<","&":"&",""":'"',">":">","'":"'"," ":" "}[c]}):""},cssStyleToDomStyle:function(){var d=document.createElement("div").style,c={"float":void 0!=d.cssFloat?"cssFloat":void 0!=d.styleFloat?"styleFloat":"float"};return function(b){return c[b]||(c[b]=b.toLowerCase().replace(/-./g,function(a){return a.charAt(1).toUpperCase()}))}}(), +loadFile:function(){function d(b,a){try{for(var e=0,h;h=c[e++];)if(h.doc===b&&h.url==(a.src||a.href))return h}catch(g){return null}}var c=[];return function(b,a,e){var h=d(b,a);if(h)h.ready?e&&e():h.funs.push(e);else if(c.push({doc:b,url:a.src||a.href,funs:[e]}),!b.body){e=[];for(var g in a)"tag"!=g&&e.push(g+'="'+a[g]+'"');b.write("<"+a.tag+" "+e.join(" ")+" >")}else if(!a.id||!b.getElementById(a.id)){var l=b.createElement(a.tag);delete a.tag;for(g in a)l.setAttribute(g,a[g]);l.onload= +l.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){h=d(b,a);if(0a?"0"+a:a};return function(a){switch(typeof a){case "undefined":return"undefined";case "number":return isFinite(a)?String(a):"null";case "string":return c(a);case "boolean":return String(a);default:if(null===a)return"null";if(p.isArray(a)){var e=["["],h=a.length,g,l,k;for(l=0;lr.version?{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder"}:{tabindex:"tabIndex",readonly:"readOnly"},oa=p.listToMap("-webkit-box -moz-box block list-item table table-row-group table-header-group table-footer-group table-row table-column-group table-column table-cell table-caption".split(" ")), +f=L.domUtils={NODE_ELEMENT:1,NODE_DOCUMENT:9,NODE_TEXT:3,NODE_COMMENT:8,NODE_DOCUMENT_FRAGMENT:11,POSITION_IDENTICAL:0,POSITION_DISCONNECTED:1,POSITION_FOLLOWING:2,POSITION_PRECEDING:4,POSITION_IS_CONTAINED:8,POSITION_CONTAINS:16,fillChar:I&&"6"==r.version?"\ufeff":"\u200b",keys:{8:1,46:1,16:1,17:1,18:1,37:1,38:1,39:1,40:1,13:1},getPosition:function(d,c){if(d===c)return 0;var b,a=[d],e=[c];for(b=d;b=b.parentNode;){if(b===c)return 10;a.push(b)}for(b=c;b=b.parentNode;){if(b===d)return 20;e.push(b)}a.reverse(); +e.reverse();if(a[0]!==e[0])return 1;for(b=-1;b++,a[b]===e[b];);d=a[b];for(c=e[b];d=d.nextSibling;)if(d===c)return 4;return 2},getNodeIndex:function(d,c){for(var b=d,a=0;b=b.previousSibling;)c&&3==b.nodeType?b.nodeType!=b.nextSibling.nodeType&&a++:a++;return a},inDoc:function(d,c){return 10==f.getPosition(d,c)},findParent:function(d,c,b){if(d&&!f.isBody(d))for(d=b?d:d.parentNode;d;){if(!c||c(d)||f.isBody(d))return c&&!c(d)&&f.isBody(d)?null:d;d=d.parentNode}return null},findParentByTagName:function(d, +c,b,a){c=p.listToMap(p.isArray(c)?c:[c]);return f.findParent(d,function(e){return c[e.tagName]&&!(a&&a(e))},b)},findParents:function(d,c,b,a){for(c=c&&(b&&b(d)||!b)?[d]:[];d=f.findParent(d,b);)c.push(d);return a?c:c.reverse()},insertAfter:function(d,c){return d.nextSibling?d.parentNode.insertBefore(c,d.nextSibling):d.parentNode.appendChild(c)},remove:function(d,c){var b=d.parentNode,a;if(b){if(c&&d.hasChildNodes())for(;a=d.firstChild;)b.insertBefore(a,d);b.removeChild(d)}return d},getNextDomNode:function(d, +c,b,a){return X(d,"firstChild","nextSibling",c,b,a)},getPreDomNode:function(d,c,b,a){return X(d,"lastChild","previousSibling",c,b,a)},isBookmarkNode:function(d){return 1==d.nodeType&&d.id&&/^_baidu_bookmark_/i.test(d.id)},getWindow:function(d){d=d.ownerDocument||d;return d.defaultView||d.parentWindow},getCommonAncestor:function(d,c){if(d===c)return d;for(var b=[d],a=[c],e=d,h=-1;e=e.parentNode;){if(e===c)return e;b.push(e)}for(e=c;e=e.parentNode;){if(e===d)return e;a.push(e)}b.reverse();for(a.reverse();h++, +b[h]===a[h];);return 0==h?null:b[h-1]},clearEmptySibling:function(d,c,b){function a(a,b){for(var g;a&&!f.isBookmarkNode(a)&&(f.isEmptyInlineElement(a)||!RegExp("[^\t\n\r"+f.fillChar+"]").test(a.nodeValue));)g=a[b],f.remove(a),a=g}!c&&a(d.nextSibling,"nextSibling");!b&&a(d.previousSibling,"previousSibling")},split:function(d,c){var b=d.ownerDocument;if(r.ie&&c==d.nodeValue.length){var a=b.createTextNode("");return f.insertAfter(d,a)}a=d.splitText(c);r.ie8&&(b=b.createTextNode(""),f.insertAfter(a,b), +f.remove(b));return a},isWhitespace:function(d){return!RegExp("[^ \t\n\r"+f.fillChar+"]").test(d.nodeValue)},getXY:function(d){for(var c=0,b=0;d.offsetParent;)b+=d.offsetTop,c+=d.offsetLeft,d=d.offsetParent;return{x:c,y:b}},on:function(d,c,b){var a=p.isArray(c)?c:p.trim(c).split(/\s+/),e=a.length;if(e)for(;e--;)if(c=a[e],d.addEventListener)d.addEventListener(c,b,!1);else{b._d||(b._d={els:[]});var h=c+b.toString(),g=p.indexOf(b._d.els,d);b._d[h]&&-1!=g||(-1==g&&b._d.els.push(d),b._d[h]||(b._d[h]=function(a){return b.call(a.srcElement, +a||window.event)}),d.attachEvent("on"+c,b._d[h]))}d=null},un:function(d,c,b){var a=p.isArray(c)?c:p.trim(c).split(/\s+/),e=a.length;if(e)for(;e--;)if(c=a[e],d.removeEventListener)d.removeEventListener(c,b,!1);else{var h=c+b.toString();try{d.detachEvent("on"+c,b._d?b._d[h]:b)}catch(g){}b._d&&b._d[h]&&(c=p.indexOf(b._d.els,d),-1!=c&&b._d.els.splice(c,1),0==b._d.els.length&&delete b._d[h])}},isSameElement:function(d,c){if(d.tagName!=c.tagName)return!1;var b=d.attributes,a=c.attributes;if(!I&&b.length!= +a.length)return!1;for(var e,h,g=0,l=0,k=0;e=b[k++];){if("style"==e.nodeName)if(e.specified&&g++,f.isSameStyle(d,c))continue;else return!1;if(I)if(e.specified)g++,h=a.getNamedItem(e.nodeName);else continue;else h=c.attributes[e.nodeName];if(!h.specified||e.nodeValue!=h.nodeValue)return!1}if(I){for(k=0;h=a[k++];)h.specified&&l++;if(g!=l)return!1}return!0},isSameStyle:function(d,c){var b=d.style.cssText.replace(/( ?; ?)/g,";").replace(/( ?: ?)/g,":"),a=c.style.cssText.replace(/( ?; ?)/g,";").replace(/( ?: ?)/g, +":");if(r.opera){b=d.style;a=c.style;if(b.length!=a.length)return!1;for(var e in b)if(!/^(\d+|csstext)$/i.test(e)&&b[e]!=a[e])return!1;return!0}if(!b||!a)return b==a;b=b.split(";");a=a.split(";");if(b.length!=a.length)return!1;e=0;for(var h;h=b[e++];)if(-1==p.indexOf(a,h))return!1;return!0},isBlockElm:function(d){return 1==d.nodeType&&(v.$block[d.tagName]||oa[f.getComputedStyle(d,"display")])&&!v.$nonChild[d.tagName]},isBody:function(d){return d&&1==d.nodeType&&"body"==d.tagName.toLowerCase()},breakParent:function(d, +c){var b,a=d,e=d,h,g;do{a=a.parentNode;h?(b=a.cloneNode(!1),b.appendChild(h),h=b,b=a.cloneNode(!1),b.appendChild(g),g=b):(h=a.cloneNode(!1),g=h.cloneNode(!1));for(;b=e.previousSibling;)h.insertBefore(b,h.firstChild);for(;b=e.nextSibling;)g.appendChild(b);e=a}while(c!==a);b=c.parentNode;b.insertBefore(h,c);b.insertBefore(g,c);b.insertBefore(d,g);f.remove(c);return d},isEmptyInlineElement:function(d){if(1!=d.nodeType||!v.$removeEmpty[d.tagName])return 0;for(d=d.firstChild;d;){if(f.isBookmarkNode(d)|| +1==d.nodeType&&!f.isEmptyInlineElement(d)||3==d.nodeType&&!f.isWhitespace(d))return 0;d=d.nextSibling}return 1},trimWhiteTextNode:function(d){function c(b){for(var a;(a=d[b])&&3==a.nodeType&&f.isWhitespace(a);)d.removeChild(a)}c("firstChild");c("lastChild")},mergeChild:function(d,c,b){c=f.getElementsByTagName(d,d.tagName.toLowerCase());for(var a=0,e;e=c[a++];)if(e.parentNode&&!f.isBookmarkNode(e))if("span"==e.tagName.toLowerCase()){if(d===e.parentNode&&(f.trimWhiteTextNode(d),1==d.childNodes.length)){d.style.cssText= +e.style.cssText+";"+d.style.cssText;f.remove(e,!0);continue}e.style.cssText=d.style.cssText+";"+e.style.cssText;if(b){var h=b.style;if(h)for(var h=h.split(";"),g=0,l;l=h[g++];)e.style[p.cssStyleToDomStyle(l.split(":")[0])]=l.split(":")[1]}f.isSameStyle(e,d)&&f.remove(e,!0)}else f.isSameElement(d,e)&&f.remove(e,!0)},getElementsByTagName:function(d,c,b){if(b&&p.isString(b)){var a=b;b=function(e){return f.hasClass(e,a)}}c=p.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var e=[],h=0,g;g=c[h++];){g=d.getElementsByTagName(g); +for(var l=0,k;k=g[l++];)b&&!b(k)||e.push(k)}return e},mergeToParent:function(d){for(var c=d.parentNode;c&&v.$removeEmpty[c.tagName];){if(c.tagName==d.tagName||"A"==c.tagName){f.trimWhiteTextNode(c);if("SPAN"==c.tagName&&!f.isSameStyle(c,d)||"A"==c.tagName&&"SPAN"==d.tagName)if(1r.version&&"font-size"==c&&!d.style.fontSize&&!v.$empty[d.tagName]&&!v.$nonChild[d.tagName]){var b=d.ownerDocument.createElement("span");b.style.cssText="padding:0;border:0;font-family:simsun;";b.innerHTML=".";d.appendChild(b);var a=b.offsetHeight;d.removeChild(b);b=null;return a+"px"}try{b=f.getStyle(d,c)||(window.getComputedStyle?f.getWindow(d).getComputedStyle(d, +"").getPropertyValue(c):(d.currentStyle||d.style)[p.cssStyleToDomStyle(c)])}catch(e){return""}return p.transUnitToPx(p.fixColor(c,b))},removeClasses:function(d,c){c=p.isArray(c)?c:p.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var b=0,a,e=d.className;a=c[b++];)e=e.replace(RegExp("\\b"+a+"\\b"),"");(e=p.trim(e).replace(/[ ]{2,}/g," "))?d.className=e:f.removeAttributes(d,["class"])},addClass:function(d,c){if(d){c=p.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var b=0,a,e=d.className;a=c[b++];)RegExp("\\b"+ +a+"\\b").test(e)||(e+=" "+a);d.className=p.trim(e)}},hasClass:function(d,c){if(p.isRegExp(c))return c.test(d.className);c=p.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var b=0,a,e=d.className;a=c[b++];)if(!RegExp("\\b"+a+"\\b","i").test(e))return!1;return b-1==c.length},preventDefault:function(d){d.preventDefault?d.preventDefault():d.returnValue=!1},removeStyle:function(d,c){r.ie?("color"==c&&(c="(^|;)"+c),d.style.cssText=d.style.cssText.replace(RegExp(c+"[^:]*:[^;]+;?","ig"),"")):d.style.removeProperty? +d.style.removeProperty(c):d.style.removeAttribute(p.cssStyleToDomStyle(c));d.style.cssText||f.removeAttributes(d,["style"])},getStyle:function(d,c){var b=d.style[p.cssStyleToDomStyle(c)];return p.fixColor(c,b)},setStyle:function(d,c,b){d.style[p.cssStyleToDomStyle(c)]=b;p.trim(d.style.cssText)||this.removeAttributes(d,"style")},setStyles:function(d,c){for(var b in c)c.hasOwnProperty(b)&&f.setStyle(d,b,c[b])},removeDirtyAttr:function(d){for(var c=0,b,a=d.getElementsByTagName("*");b=a[c++];)b.removeAttribute("_moz_dirty"); +d.removeAttribute("_moz_dirty")},getChildCount:function(d,c){var b=0,a=d.firstChild;for(c=c||function(){return 1};a;)c(a)&&b++,a=a.nextSibling;return b},isEmptyNode:function(d){return!d.firstChild||0==f.getChildCount(d,function(c){return!f.isBr(c)&&!f.isBookmarkNode(c)&&!f.isWhitespace(c)})},clearSelectedArr:function(d){for(var c;c=d.pop();)f.removeAttributes(c,["class"])},scrollToView:function(d,c,b){var a=function(){var a=c.document,b="CSS1Compat"==a.compatMode;return{width:(b?a.documentElement.clientWidth: +a.body.clientWidth)||0,height:(b?a.documentElement.clientHeight:a.body.clientHeight)||0}}().height;b=-1*a+b+(d.offsetHeight||0);d=f.getXY(d);b+=d.y;d=function(a){if("pageXOffset"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};a=a.document;return{x:a.documentElement.scrollLeft||a.body.scrollLeft||0,y:a.documentElement.scrollTop||a.body.scrollTop||0}}(c).y;(b>d||bb?-20:20))},isBr:function(d){return 1==d.nodeType&&"BR"==d.tagName},isFillChar:function(d,c){if(3!=d.nodeType)return!1; +var b=d.nodeValue;return c?RegExp("^"+f.fillChar).test(b):!b.replace(RegExp(f.fillChar,"g"),"").length},isStartInblock:function(d){d=d.cloneRange();var c=0,b=d.startContainer,a;if(1==b.nodeType&&b.childNodes[d.startOffset])for(var b=b.childNodes[d.startOffset],e=b.previousSibling;e&&f.isFillChar(e);)b=e,e=e.previousSibling;this.isFillChar(b,!0)&&1==d.startOffset&&(d.setStartBefore(b),b=d.startContainer);for(;b&&f.isFillChar(b);)a=b,b=b.previousSibling;a&&(d.setStartBefore(a),b=d.startContainer);for(1== +b.nodeType&&f.isEmptyNode(b)&&1==d.startOffset&&d.setStart(b,0).collapse(!0);!d.startOffset;){b=d.startContainer;if(f.isBlockElm(b)||f.isBody(b)){c=1;break}var e=d.startContainer.previousSibling,h;if(e){for(;e&&f.isFillChar(e);)h=e,e=e.previousSibling;h?d.setStartBefore(h):d.setStartBefore(d.startContainer)}else d.setStartBefore(d.startContainer)}return c&&!f.isBody(d.startContainer)?1:0},isEmptyBlock:function(d,c){if(1!=d.nodeType)return 0;c=c||RegExp("[ \u00a0\t\r\n"+f.fillChar+"]","g");if(0/.test(d.outerHTML):0==d.attributes.length},isCustomeNode:function(d){return 1==d.nodeType&&d.getAttribute("_ue_custom_node_")},isTagNode:function(d,c){return 1==d.nodeType&&RegExp("\\b"+d.tagName+"\\b","i").test(c)},filterNodeList:function(d,c,b){var a=[];if(!p.isFunction(c)){var e=c;c=function(a){return-1!=p.indexOf(p.isArray(e)?e:e.split(" "),a.tagName.toLowerCase())}}p.each(d, +function(e){c(e)&&a.push(e)});return 0==a.length?null:1!=a.length&&b?a:a[0]},isInNodeEndBoundary:function(d,c){var b=d.startContainer;if(3==b.nodeType&&d.startOffset!=b.nodeValue.length||1==b.nodeType&&d.startOffset!=b.childNodes.length)return 0;for(;b!==c;){if(b.nextSibling)return 0;b=b.parentNode}return 1},isBoundaryNode:function(d,c){for(var b;!f.isBody(d);)if(b=d,d=d.parentNode,b!==d[c])return!1;return!0},fillHtml:r.ie11below?" ":"
    "},P=RegExp(f.fillChar,"g");(function(){function d(a){return!a.collapsed&& +1==a.startContainer.nodeType&&a.startContainer===a.endContainer&&1==a.endOffset-a.startOffset}function c(a,e,g,b){1==e.nodeType&&(v.$empty[e.tagName]||v.$nonChild[e.tagName])&&(g=f.getNodeIndex(e)+(a?0:1),e=e.parentNode);a?(b.startContainer=e,b.startOffset=g,b.endContainer||b.collapse(!0)):(b.endContainer=e,b.endOffset=g,b.startContainer||b.collapse(!1));b.collapsed=b.startContainer&&b.endContainer&&b.startContainer===b.endContainer&&b.startOffset==b.endOffset;return b}function b(a,e){var g=a.startContainer, +b=a.endContainer,c=a.startOffset,l=a.endOffset,k=a.document,h=k.createDocumentFragment(),d,p;1==g.nodeType&&(g=g.childNodes[c]||(d=g.appendChild(k.createTextNode(""))));1==b.nodeType&&(b=b.childNodes[l]||(p=b.appendChild(k.createTextNode(""))));if(g===b&&3==g.nodeType)return h.appendChild(k.createTextNode(g.substringData(c,l-c))),e&&(g.deleteData(c,l-c),a.collapse(!0)),h;for(var A,N,r=h,s=f.findParents(g,!0),v=f.findParents(b,!0),z=0;s[z]==v[z];)z++;for(var H=z,D;D=s[H];H++){A=D.nextSibling;D==g? +d||(3==a.startContainer.nodeType?(r.appendChild(k.createTextNode(g.nodeValue.slice(c))),e&&g.deleteData(c,g.nodeValue.length-c)):r.appendChild(e?g:g.cloneNode(!0))):(N=D.cloneNode(!1),r.appendChild(N));for(;A&&A!==b&&A!==v[H];)D=A.nextSibling,r.appendChild(e?A:A.cloneNode(!0)),A=D;r=N}r=h;s[z]||(r.appendChild(s[z-1].cloneNode(!1)),r=r.firstChild);for(H=z;c=v[H];H++){A=c.previousSibling;c==b?p||3!=a.endContainer.nodeType||(r.appendChild(k.createTextNode(b.substringData(0,l))),e&&b.deleteData(0,l)): +(N=c.cloneNode(!1),r.appendChild(N));if(H!=z||!s[z])for(;A&&A!==g;)c=A.previousSibling,r.insertBefore(e?A:A.cloneNode(!0),r.firstChild),A=c;r=N}e&&a.setStartBefore(v[z]?s[z]?v[z]:s[z-1]:v[z-1]).collapse(!0);d&&f.remove(d);p&&f.remove(p);return h}function a(a,g){try{if(l&&f.inDoc(l,a))if(l.nodeValue.replace(P,"").length)l.nodeValue=l.nodeValue.replace(P,"");else{var e=l.parentNode;for(f.remove(l);e&&f.isEmptyInlineElement(e)&&(r.safari?!(f.getPosition(e,g)&f.POSITION_CONTAINS):!e.contains(g));)l=e.parentNode, +f.remove(e),e=l}}catch(b){}}function e(a,e){var g;for(a=a[e];a&&f.isFillChar(a);)g=a[e],f.remove(a),a=g}var h=0,g=f.fillChar,l,k=L.Range=function(a){this.startContainer=this.startOffset=this.endContainer=this.endOffset=null;this.document=a;this.collapsed=!0};k.prototype={cloneContents:function(){return this.collapsed?null:b(this,0)},deleteContents:function(){var a;this.collapsed||b(this,1);r.webkit&&(a=this.startContainer,3!=a.nodeType||a.nodeValue.length||(this.setStartBefore(a).collapse(!0),f.remove(a))); +return this},extractContents:function(){return this.collapsed?null:b(this,2)},setStart:function(a,e){return c(!0,a,e,this)},setEnd:function(a,e){return c(!1,a,e,this)},setStartAfter:function(a){return this.setStart(a.parentNode,f.getNodeIndex(a)+1)},setStartBefore:function(a){return this.setStart(a.parentNode,f.getNodeIndex(a))},setEndAfter:function(a){return this.setEnd(a.parentNode,f.getNodeIndex(a)+1)},setEndBefore:function(a){return this.setEnd(a.parentNode,f.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(){return(new k(this.document)).setStart(this.startContainer,this.startOffset).setEnd(this.endContainer, +this.endOffset)},collapse:function(a){a?(this.endContainer=this.startContainer,this.endOffset=this.startOffset):(this.startContainer=this.endContainer,this.startOffset=this.endOffset);this.collapsed=!0;return this},shrinkBoundary:function(a){function e(a){return 1==a.nodeType&&!f.isBookmarkNode(a)&&!v.$empty[a.tagName]&&!v.$nonChild[a.tagName]}for(var g,b=this.collapsed;1==this.startContainer.nodeType&&(g=this.startContainer.childNodes[this.startOffset])&&e(g);)this.setStart(g,0);if(b)return this.collapse(!0); +if(!a)for(;1==this.endContainer.nodeType&&0=g.nodeValue.length)this.setStartAfter(g);else{var l=f.split(g,e);g===c?this.setEnd(l,this.endOffset-e):g.parentNode===c&&(this.endOffset+=1);this.setStartBefore(l)}if(b)return this.collapse(!0)}a||(e=this.endOffset,c=this.endContainer,3==c.nodeType&&(0==e?this.setEndBefore(c):(e=b.nodeValue.length)a["set"+e.replace(/(\w)/,function(a){return a.toUpperCase()})+"After"](b)}if(a||!this.collapsed)g(this,"start"),g(this,"end");return this},insertNode:function(a){var g=a,e=1;11==a.nodeType&&(g=a.firstChild,e=a.childNodes.length);this.trimBoundary(!0);var b=this.startContainer,c=b.childNodes[this.startOffset];c?b.insertBefore(a,c):b.appendChild(a);g.parentNode===this.endContainer&&(this.endOffset+=e);return this.setStartBefore(g)}, +setCursor:function(a,g){return this.collapse(!a).select(g)},createBookmark:function(a,g){var e,b=this.document.createElement("span");b.style.cssText="display:none;line-height:0px;";b.appendChild(this.document.createTextNode("\u200d"));b.id="_baidu_bookmark_start_"+(g?"":h++);this.collapsed||(e=b.cloneNode(!0),e.id="_baidu_bookmark_end_"+(g?"":h++));this.insertNode(b);e&&this.collapse().insertNode(e).setEndBefore(e);this.setStartAfter(b);return{start:a?b.id:b,end:e?a?e.id:e:null,id:a}},moveToBookmark:function(a){var e= +a.id?this.document.getElementById(a.start):a.start;a=a.end&&a.id?this.document.getElementById(a.end):a.end;this.setStartBefore(e);f.remove(e);a?(this.setEndBefore(a),f.remove(a)):this.collapse(!0);return this},enlarge:function(a,e){var g=f.isBody,b,c,l=this.document.createTextNode("");if(a){c=this.startContainer;1==c.nodeType?c.childNodes[this.startOffset]?b=c=c.childNodes[this.startOffset]:(c.appendChild(l),b=c=l):b=c;for(;;){if(f.isBlockElm(c)){for(c=b;(b=c.previousSibling)&&!f.isBlockElm(b);)c= +b;this.setStartBefore(c);break}b=c;c=c.parentNode}c=this.endContainer;1==c.nodeType?((b=c.childNodes[this.endOffset])?c.insertBefore(l,b):c.appendChild(l),b=c=l):b=c;for(;;){if(f.isBlockElm(c)){for(c=b;(b=c.nextSibling)&&!f.isBlockElm(b);)c=b;this.setEndAfter(c);break}b=c;c=c.parentNode}l.parentNode===this.endContainer&&this.endOffset--;f.remove(l)}if(!this.collapsed){for(;!(0!=this.startOffset||e&&e(this.startContainer)||g(this.startContainer));)this.setStartBefore(this.startContainer);for(;!(this.endOffset!= +(1==this.endContainer.nodeType?this.endContainer.childNodes.length:this.endContainer.nodeValue.length)||e&&e(this.endContainer)||g(this.endContainer));)this.setEndAfter(this.endContainer)}return this},enlargeToBlockElm:function(a){for(;!f.isBlockElm(this.startContainer);)this.setStartBefore(this.startContainer);if(!a)for(;!f.isBlockElm(this.endContainer);)this.setEndAfter(this.endContainer);return this},adjustmentBoundary:function(){if(!this.collapsed){for(;!f.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(;!f.isBody(this.endContainer)&&!this.endOffset&&this.endContainer[3==this.endContainer.nodeType?"nodeValue":"childNodes"].length;)this.setEndBefore(this.endContainer)}return this},applyInlineStyle:function(a,e,g){if(this.collapsed)return this;this.trimBoundary().enlarge(!1,function(a){return 1== +a.nodeType&&f.isBlockElm(a)}).adjustmentBoundary();for(var b=this.createBookmark(),c=b.end,l=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!f.isWhitespace(a)},k=f.getNextDomNode(b.start,!1,l),h,d,p=this.cloneRange();k&&f.getPosition(k,c)&f.POSITION_PRECEDING;)if(3==k.nodeType||v[a][k.tagName]){p.setStartBefore(k);for(h=k;h&&(3==h.nodeType||v[a][h.tagName])&&h!==c;)d=h,h=f.getNextDomNode(h,1==h.nodeType,null,function(e){return v[a][e.tagName]});var k=p.setEndAfter(d).extractContents(), +A;if(g&&0l&&(l=0);k.push(l);return k}var g={},c=this;g.startAddress=b(!0);a||(g.endAddress=c.collapsed?[].concat(g.startAddress):b());return g},moveToAddress:function(a,e){function g(a, +e){for(var c=b.document.body,l,k,h=0,d,f=a.length;hw)n=t+1;else return{container:g,offset:b(k)}}if(-1==t){d.moveToElementText(g); +d.setEndPoint("StartToStart",a);d=d.text.replace(/(\r\n|\r)/g,"\n").length;c=g.childNodes;if(!d)return k=c[c.length-1],{container:k,offset:k.nodeValue.length};for(b=c.length;0r.version?"":"")+""+(b.iframeCssUrl?"":"")+(b.initialStyle?"":"")+""];for(var I=0;I");G.push("");G.push("");G.push("");E.setPos=B;E.onload=Y;D.write("");D.cfg=E;D.write(G.join(""))}function B(I){var G=I.position.left,B=I.position.top,C=I.el;if(C==S)return;if(C!=I.srcEl&&(O(C)=="none"||C.type=="hidden"))C=I.srcEl;var H=V(C),$=F(X),D=L(U),A=Z(U),E=$dp.dd.offsetHeight,_=$dp.dd.offsetWidth;if(isNaN(B))B=0;if(($.topM+H.bottom+E>D.height)&&($.topM+H.top-E>0))B+=A.top+$.topM+H.top-E-2;else B+=A.top+$.topM+Math.min(H.bottom,D.height-E)+2;if(isNaN(G))G=0;G+=A.left+Math.min($.leftM+H.left,D.width-_-5)-(R?2:0);I.dd.style.top=B+"px";I.dd.style.left=G+"px"}}})() \ No newline at end of file diff --git a/src/main/webapp/plug-in/My97DatePicker/calendar.js b/src/main/webapp/plug-in/My97DatePicker/calendar.js new file mode 100644 index 00000000..34654583 --- /dev/null +++ b/src/main/webapp/plug-in/My97DatePicker/calendar.js @@ -0,0 +1,5 @@ +/* + * My97 DatePicker 4.8 Beta2 + * License: http://www.my97.net/dp/license.asp + */ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('k($4j.3X){$f={};19(o p 4i $2l)k(5Z $2l[p]=="6d"){$f[p]={};19(o 4B 4i $2l[p])$f[p][4B]=$2l[p][4B]}q $f[p]=$2l[p]}q $f=$2l;19(p 4i $4j)$f[p]=$4j[p];o $c;k($62){6o.2N.7c("6W",l($){k(!$)h.2h();t $});6o.2N.7b("6N",l(){o $=h.6K;3l($.5f!=1)$=$.7e;t $});7a.2N.2T=l($,b){o A=$.1l(/6C/,"");b.6B=l($){6M.1Q=$;t b()};h.7g(A,b.6B,1n)}}l 5n(){$c=h;h.2F=[];$d=1P.75("x");$d.1d="4r";$d.1I="<1t Y=3Y><1t Y=3Y><1x 2t=0 2r=0 2u=0><1j><18 7V=2><4k 1E=7W>&4A;<1t Y=7u 4g=2><1t 1f=\\":\\" Y=6i 6p><1t Y=6q 4g=2><1t 1f=\\":\\" Y=6i 6p><1t Y=6q 4g=2><18><1N 1E=7s><1j><18><1N 1E=7r><1t Y=4h 1E=7y 3a=1N><1t Y=4h 1E=7C 3a=1N><1t Y=4h 1E=73 3a=1N>";6S($d,l(){3x()});A();h.5o();$f.22=[1P,$d.1K,$d.1v,$d.2B,$d.2Q,$d.2S,$d.2W,$d.2d,$d.1X];19(o B=0;B<$f.22.u;B++){o b=$f.22[B];b.34=B==$f.22.u-1?$f.22[1]:$f.22[B+1];$f.2T(b,"56",4P)}$();4K("y,M,H,m,s");$d.5s.1r=l(){58(1)};$d.5t.1r=l(){58(-1)};$d.4s.1r=l(){k($d.1F.1c.2g!="6t"){$c.4I();3v($d.1F)}q 1m($d.1F)};1P.6G.4x($d);l A(){o b=$("a");1q=$("x"),1M=$("1t"),4n=$("1N"),5q=$("4k");$d.3R=b[0];$d.3H=b[1];$d.3E=b[3];$d.3G=b[2];$d.41=1q[9];$d.1K=1M[0];$d.1v=1M[1];$d.4z=1q[0];$d.3C=1q[4];$d.3g=1q[6];$d.1F=1q[10];$d.2Y=1q[11];$d.2V=1q[12];$d.6F=1q[13];$d.6I=1q[14];$d.6T=1q[15];$d.4s=1q[16];$d.3Z=1q[17];$d.2B=1M[2];$d.2Q=1M[4];$d.2S=1M[6];$d.2W=1M[7];$d.2d=1M[8];$d.1X=1M[9];$d.5s=4n[0];$d.5t=4n[1];$d.5w=5q[0];l $($){t $d.6P($)}}l $(){$d.3R.1r=l(){$1L=$1L<=0?$1L-1:-1;k($1L%5==0){$d.1v.1U();t}$d.1v.1f=$n.y-1;$d.1v.2m()};$d.3H.1r=l(){$n.2q("M",-1);$d.1K.2m()};$d.3E.1r=l(){$n.2q("M",1);$d.1K.2m()};$d.3G.1r=l(){$1L=$1L>=0?$1L+1:1;k($1L%5==0){$d.1v.1U();t}$d.1v.1f=$n.y+1;$d.1v.2m()}}}5n.2N={5o:l(){$1L=0;$f.5h=h;k($f.3L&&$f.z.3L!=1h){$f.z.3L=1a;$f.z.4d()}h.4w();$n=h.5J=1b 1G();$1B=1b 1G();$1u=h.2A=1b 1G();h.1A=h.3j($f.1A);h.2L=$f.2L==1h?($f.Z.25&&$f.Z.25?1n:1a):$f.2L;$f.3r=$f.3r==1h?($f.4t&&$f.Z.d?1n:1a):$f.3r;h.4a=h.3p("7A");h.5S=h.3p("7G");h.5U=h.3p("7H");h.5O=h.3p("7F");h.1T=h.3s($f.1T,$f.1T!=$f.5A?$f.1Z:$f.2G,$f.5A);h.1W=h.3s($f.1W,$f.1W!=$f.5B?$f.1Z:$f.2G,$f.5B);k(h.1T.2z(h.1W)>0)$f.4o=$1k.7D;k(h.1R()){h.5C();h.3F=$f.z[$f.1y]}q h.35(1n,2);4H($n);$d.5w.1I=$1k.7q;$d.2W.1f=$1k.7o;$d.2d.1f=$1k.7p;$d.1X.1f=$1k.7w;$d.1X.28=!$c.1w($1u);h.5Y();h.6O();k($f.4o)7v($f.4o);h.4F();k($f.z.5f==1&&$f.z["3z"]===6J){$f.2T($f.z,"56",4P);$f.2T($f.z,"2m",l(){k($f&&$f.1J.1c.2g=="2s"){$c.3I();k($f.5h.3F!=$f.z[$f.1y]&&$f.z.7t)4J($f.z,"7I")}});$f.z["3z"]=1n}$c.1i=$f.z;3x()},5C:l(){o b=h.3f();k(b!=0){o $;k(b>0)$=h.1W;q $=h.1T;k($f.Z.3T){$n.y=$.y;$n.M=$.M;$n.d=$.d}k($f.Z.25){$n.H=$.H;$n.m=$.m;$n.s=$.s}}},3i:l(J,C,Q,E,B,G,F,K,L){o $;k(J&&J.1R)$=J;q{$=1b 1G();k(J!=""){C=C||$f.1A;o H,P=0,O,A=/3d|2n|3m|y|2w|3b|3K|M|1J|d|%2i|4O|H|4U|m|4V|s|3h|D|4Z|W|w/g,b=C.2Z(A);A.2C=0;k(L)O=J.43(/\\W+/);q{o D=0,M="^";3l((O=A.3k(C))!==1h){k(D>=0)M+=C.1D(D,O.3Q);D=A.2C;2R(O[0]){1e"3d":M+="(\\\\d{4})";1g;1e"2n":M+="(\\\\d{3})";1g;1e"2w":1e"3b":1e"3h":1e"D":M+="(\\\\D+)";1g;63:M+="(\\\\d\\\\d?)";1g}}M+=".*$";O=1b 4u(M).3k(J);P=1}k(O){19(H=0;H=0){A=A.1l(/%2i/g,"0");$.d=0;$.M=2e($.M)+1}$.1S()}t $},1R:l(){o b,$;k($f.7R||($f.6c!=""&&$f.z[$f.1y]=="")){b=h.3j($f.6c);$=$f.1Z}q{b=$f.z[$f.1y];$=h.1A}$n.2k(h.3i(b,$));k(b!=""){o A=1;k($f.Z.3T&&!h.4l($n)){$n.y=$1B.y;$n.M=$1B.M;$n.d=$1B.d;A=0}k($f.Z.25&&!h.4m($n)){$n.H=$1B.H;$n.m=$1B.m;$n.s=$1B.s;A=0}t A&&h.1w($n)}t 1},4l:l($){k($.y!=1h)$=2I($.y,4)+"-"+$.M+"-"+$.d;t $.2Z(/^((\\d{2}(([6f][7Q])|([6e][26]))[\\-\\/\\s]?((((0?[6b])|(1[68]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[67])))|(((0?[69])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([6f][7P])|([6e][72]))[\\-\\/\\s]?((((0?[6b])|(1[68]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[67])))|(((0?[69])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$/)},4m:l($){k($.H!=1h)$=$.H+":"+$.m+":"+$.s;t $.2Z(/^([0-9]|([0-1][0-9])|([2][0-3])):([0-9]|([0-5][0-9])):([0-9]|([0-5][0-9]))$/)},3f:l($,A){$=$||$n;o b=$.2z(h.1T,A);k(b>0){b=$.2z(h.1W,A);k(b<0)b=0}t b},1w:l($,A,B){A=A||$f.Z.49;o b=h.3f($,A);k(b==0){b=1;k(A=="d"&&B==1h)B=24.5F((1b 1z($.y,$.M-1,$.d).1H()-$f.3M+7)%7);b=!h.5T(B)&&!h.5M($,A)}q b=0;t b},5L:l(){o b=$f.z,A=h,$=$f.z[$f.1y];k($f.4q>=0&&$f.4q<=2&&$!=1h){k($!="")A.2A.2k(A.3i($,A.1A));k($==""||(A.4l(A.2A)&&A.4m(A.2A)&&A.1w(A.2A))){k($!=""){A.5J.2k(A.2A);A.3D()}q A.3W("")}q t 1n}t 1a},3I:l($){3x();k(h.5L()){h.35(1a);$f.1m()}q{k($){2J($);h.35(1n,2)}q h.35(1n);$f.20()}},44:l(){o E,C,D,K,A,H=1b 2p(),F=$1k.5l,G=$f.3M,I="",$="",b=1b 1G($n.y,$n.M,$n.d,0,0,0),J=b.y,B=b.M;A=1-1b 1z(J,B-1,1).1H()+G;k(A>1)A-=7;H.a("<1x Y=5E 2U=33% 2u=0 2t=0 2r=0>");H.a("<1j Y=5H 4D=5P>");k($f.5G)H.a("<18>"+F[0]+"");19(E=0;E<7;E++)H.a("<18>"+F[(G+E)%7+1]+"");H.a("");19(E=1,C=A;E<7;E++){H.a("<1j>");19(D=0;D<7;D++){b.1R(J,B,C++);b.1S();k(b.M==B){K=1a;k(b.2z($1u,"d")==0)I="74";q k(b.2z($1B,"d")==0)I="6X";q I=($f.5D&&(0==(G+D)%7||6==(G+D)%7)?"7i":"7j");$=($f.5D&&(0==(G+D)%7||6==(G+D)%7)?"7h":"7k")}q k($f.5y){K=1a;I="7l";$="7f"}q K=1n;k($f.5G&&D==0&&(E<4||K))H.a("<18 Y=77>"+4v(b,$f.3M==0?1:0)+"");H.a("<18 ");k(K){k(h.1w(b,"d",D)){k(h.5R(24.5F((1b 1z(b.y,b.M-1,b.d).1H()-$f.3M+7)%7))||h.5V(b))I="78";H.a("1r=\\"2K("+b.y+","+b.M+","+b.d+");\\" ");H.a("2y=\\"h.1d=\'"+$+"\'\\" ");H.a("2v=\\"h.1d=\'"+I+"\'\\" ")}q I="7d";H.a("Y="+I);H.a(">"+b.d+"")}q H.a(">")}H.a("")}H.a("");t H.j()},5M:l(b,A){o $=h.4e(b,h.4a,A);t(h.4a&&$f.5N)?!$:$},5T:l($){t h.4f($,h.5S)},5V:l($){t h.4e($,h.5U)},5R:l($){t h.4f($,h.5O)},4e:l($,B,A){o b=A=="d"?$f.4E:$f.1Z;t B?B.4Q(h.3J(b,$)):0},4f:l(b,$){t $?$.4Q(b):0},2H:l(p,c,r,e,2b){o s=1b 2p(),4c=2b?"r"+p:p;5Q=$n[p];s.a("<1x 2t=0 2r=3 2u=0");19(o i=0;i");19(o j=0;j"+(p=="M"?$1k.29[$n[p]-1]:$n[p])+"")}s.a("")}s.a("");$n[p]=5Q;t s.j()},4C:l($,b){k($){o A=$.7n;k($6y)A=$.7m().2D;b.1c.2D=A}},6Z:l($){h.4C($,$d.3C);$d.3C.1I=h.2H("M",2,6,"i+j*6+1",$==$d.2c)},4b:l(b,B,A){o $=1b 2p();A=A||b==$d.2o;B=3e(B,$n.y-5);$.a(h.2H("y",2,5,B+"+i+j*5",A));$.a("<1x 2t=0 2r=3 2u=0 4D=5P><1j><18 ");$.a(h.1T.y\\91<18 Y=\'1C\' 2y=\\"h.1d=\'2E\'\\" 2v=\\"h.1d=\'1C\'\\" 3N=\\"1m($d.3g);$d.1v.4d();\\">\\5I<18 ");$.a(h.1W.y>B+10?"Y=\'1C\' 2y=\\"h.1d=\'2E\'\\" 2v=\\"h.1d=\'1C\'\\" 3N=\'k(1Q.2h)1Q.2h();1Q.4X=1a;$c.4b(0,"+(B+10)+","+A+")\'":"Y=\'4p\'");$.a(">\\8S");h.4C(b,$d.3g);$d.3g.1I=$.j()},3S:l(A,b,$){$d[A+"D"].1I=h.2H(A,6,b,$)},8P:l(){h.3S("H",4,"i * 6 + j")},8T:l(){h.3S("m",2,"i * 30 + j * 5")},8X:l(){h.3S("s",1,"j * 10")},4I:l(C,A){h.6m();o $=A?">a/<94 8U>8V=8O \\"8Q:8R\\"=97 \\"98.95.99//:8Z\\"=93 a<".43("").92().6s(""):$1k.90,B=h.2F,E=B.1c,b=1b 2p();b.a("<1x Y=5E 2U=33% 2f=33% 2u=0 2t=0 2r=0>");b.a("<1j Y=5H><18>"+$+"");k(!C)b.a("\\5I");b.a("");19(o D=0;D<18 1c=\'4M-4D:2D\' 2M=\'2M\' Y=\'1C\' 2y=\\"h.1d=\'2E\'\\" 2v=\\"h.1d=\'1C\'\\" 1r=\\"");b.a("2K("+B[D].y+", "+B[D].M+", "+B[D].d+","+B[D].H+","+B[D].m+","+B[D].s+");\\">");b.a("&4A;"+h.3J(1h,B[D]));b.a("")}q b.a("<1j><18 Y=\'1C\'>&4A;");b.a("");$d.1F.1I=b.j()},4w:l(){$(/w/);$(/4Z|W/);$(/3h|D/);$(/3d|2n|3m|y/);$(/2w|3b|3K|M/);$(/1J|d/);$(/4O|H/);$(/4U|m/);$(/4V|s/);$f.Z.3T=($f.Z.y||$f.Z.M||$f.Z.d)?1a:1n;$f.Z.25=($f.Z.H||$f.Z.m||$f.Z.s)?1a:1n;$f.2G=$f.2G.1l(/%1z/,$f.4E).1l(/%8N/,$f.66);k($f.Z.3T){k($f.Z.25)$f.1Z=$f.2G;q $f.1Z=$f.4E}q $f.1Z=$f.66;l $(b){o $=(b+"").5c(1,2);$f.Z[$]=b.3k($f.1A)?($f.Z.49=$,1a):1n}},5Y:l(){o $=0;$f.Z.y?($=1,20($d.1v,$d.3R,$d.3G)):1m($d.1v,$d.3R,$d.3G);$f.Z.M?($=1,20($d.1K,$d.3H,$d.3E)):1m($d.1K,$d.3H,$d.3E);$?20($d.4z):1m($d.4z);k($f.Z.25){20($d.2V);3t($d.2B,$f.Z.H);3t($d.2Q,$f.Z.m);3t($d.2S,$f.Z.s)}q 1m($d.2V);3c($d.2W,$f.61);3c($d.2d,$f.64);3c($d.1X,$f.4t);3c($d.4s,!$f.5v&&$f.Z.d&&$f.8h);k($f.3X||!($f.61||$f.64||$f.4t))1m($d.3Z);q 20($d.3Z)},35:l(B,D){o A=$f.z,b=$62?"Y":"1d";k(B)C(A);q{k(D==1h)D=$f.4q;2R(D){1e 0:k(8f($1k.8g)){A[$f.1y]=h.3F;C(A)}q $(A);1g;1e 1:A[$f.1y]=h.3F;C(A);1g;1e 2:$(A);1g}}l C(A){o B=A.1d;k(B){o $=B.1l(/5j/g,"");k(B!=$)A.5m(b,$)}}l $($){$.5m(b,$.1d+" 5j")}},1Y:l(D,b,$){$=$||$1u;o H,C=[D+D,D],E,A=$[D],F=l($){t 2I(A,$.u)};2R(D){1e"w":A=1H($);1g;1e"D":o G=1H($)+1;F=l($){t $.u==2?$1k.8k[G]:$1k.5l[G]};1g;1e"W":A=4v($);1g;1e"y":C=["3d","2n","3m","y"];b=b||C[0];F=l(b){t 2I((b.u<4)?(b.u<3?$.y%33:($.y+5g-$f.5i)%8o):A,b.u)};1g;1e"M":C=["2w","3b","3K","M"];F=l($){t($.u==4)?$1k.5k[A-1]:($.u==3)?$1k.29[A-1]:2I(A,$.u)};1g}b=b||D+D;k("3n".1p(D)>-1&&D!="y"&&!$f.Z[D])k("8p".1p(D)>-1)A=0;q A=1;o B=[];19(H=0;H=0){B[H]=F(E);b=b.1l(E,"{"+H+"}")}}19(H=0;H=0){o A=1b 1G();A.2k($);A.d=0;A.M=2e(A.M)+1;A.1S();b=b.1l(/%2i/g,A.d)}o B="8n";19(o D=0;D<1j><18 5z=5u>");$.a(h.44());$.a("<18 5z=5u>");$n.2q("M",1);$.a(h.44());$d.2c=$d.1K.5p(1a);$d.2o=$d.1v.5p(1a);$d.41.4x($d.2c);$d.41.4x($d.2o);$d.2c.1f=$1k.29[$n.M-1];$d.2c["3u"]=$n.M;$d.2o.1f=$n.y;4K("6D,6u");$d.2c.1d=$d.2o.1d="3Y";$n.2q("M",-1);$.a("");$d.2Y.1I=$.j()}q{$d.1d="4r";$d.2Y.1I=h.44()}k(!$f.Z.d||$f.84){h.4I(1a);3v($d.1F)}q 1m($d.1F);h.5e()},5e:l(){o b=88.1P.6P("8c");19(o C=0;C=B){A+=B;$d.1c.2f=A}q $d.1c.2f=$;b[C].1c.2f=24.65(A,$d.36)+"6Q"}}$d.1F.1c.2U=$d.2Y.6V;$d.1F.1c.2f=$d.2Y.36},4R:l(){$n.d=24.8a(1b 1z($n.y,$n.M,0).3o(),$n.d);$1u.2k($n);h.3D();k(!$f.3X)k(h.1w($n)){4G();1m($f.1J)}k($f.6H)2j("6H")},6O:l(){$d.2W.1r=l(){k(!2j("8F")){$f.z[$f.1y]="";$c.3W("");4G();1m($f.1J);k($f.6E)2j("6E")}};$d.1X.1r=l(){2K()};k(h.1w($1B)){$d.2d.28=1n;$d.2d.1r=l(){$n.2k($1B);2K()}}q $d.2d.28=1a},6m:l(){o H,G,A,F,C=[],$=5,E=$f.6g.u,b=$f.Z.49;k(E>$)E=$;q k(b=="m"||b=="s")C=[-60,-30,0,30,60,-15,15,-45,45];q 19(H=0;H<$;H++)C[H]=$n[b]-2+H;19(H=G=0;H=0)$=3q(A,0,59);k($1u[b]!=A&&!2j(b+"8v")){o C=$c.3f();k(C==0)21(b,$);q k(C<0)B($c.1T);q k(C>0)B($c.1W);$d.1X.28=!$c.1w($1u);k("8A".1p(b)>=0)$c.4F();2j(b+"8y")}l B($){4H($c.1w($)?$:$1u)}}l 4H($){21("y",$.y);21("M",$.M);21("d",$.d);21("H",$.H);21("m",$.m);21("s",$.s)}l 2K(F,B,b,D,C,A){o $=1b 1G($n.y,$n.M,$n.d,$n.H,$n.m,$n.s);$n.1R(F,B,b,D,C,A);k(!2j("8w")){o E=$.y==F&&$.M==B&&$.d==b;k(!E&&2O.u!=0){c("y",F);c("M",B);c("d",b);$c.1i=$f.z;3V()}k($c.2L||E||2O.u==0)$c.4R()}q $n=$}l 3V(){k($f.3r){$c.3D();$f.z.1U()}}l 2j($){o b;k($f[$])b=$f[$].4W($f.z,$f);t b}l 21(b,$){k($==1h)$=$n[b];$1u[b]=$n[b]=$;k("8x".1p(b)>=0)$d[b+"I"].1f=$;k(b=="M"){$d.1K["3u"]=$;$d.1K.1f=$1k.29[$-1]}}l 3q(b,$,A){k(b<$)b=$;q k(b>A)b=A;t b}l 6S($,b){$f.2T($,"56",l(){o $=1Q,A=($.52==6J)?$.54:$.52;k(A==9)b()})}l 2I($,b){$=$+"";3l($.u=0?C:5;19(o D=0;D<=C;D++){B=A.1O(D);b=h[B]-$[B];k(b>0)t 1;q k(b<0)t-1}t 0},1S:l(){o $=1b 1z(h.y,h.M-1,h.d,h.H,h.m,h.s);h.y=$.5d();h.M=$.5b()+1;h.d=$.3o();h.H=$.5a();h.m=$.4Y();h.s=$.4N();t!6r(h.y)},2q:l(b,$){k("3n".1p(b)>=0){o A=h.d;k(b=="M")h.d=1;h[b]+=$;h.1S();h.d=A}}};l 2e($){t 8z($,10)}l 3w($,b){t 3e(2e($),b)}l 1s($,A,b){t 3w($,3e(A,b))}l 3e($,b){t $==1h||6r($)?b:$}l 4J(A,$){k($6y)A.4J("6C"+$);q{o b=1P.8q("8s");b.8t($,1a,1a);A.8I(b)}}l 42($){o A,B,b="y,M,H,m,s,6u,6D".43(",");19(B=0;B=0?6l(v):$n[p];k(p=="y"){2b=h==$d.2o;k(2b&&$n.M==12)$n.y-=1}q k(p=="M"){2b=h==$d.2c;k(2b){4T=$1k.29[$n[p]-1];k(6h==12)$n.y+=1;$n.2q("M",-1)}k($1u.M==$n.M)h.1f=4T||$1k.29[$n[p]-1];k(($1u.y!=$n.y))c("y",$n.y)}47("c(\\""+p+"\\","+$n[p]+")");k(6n!==1a){k(p=="y"||p=="M")h.1d="3Y";1m($d[p+"D"])}3V()}l 2J($){k($.2h){$.2h();$.8G()}q{$.4X=1a;$.6W=1n}k($5x)$.54=0}l 4K($){o A=$.43(",");19(o B=0;B=96&&Q<=83)Q-=48;k($f.85&&53){k(!H.34){H.34=$f.22[1];$c.1i=$f.z}k(H==$f.z)$c.1i=$f.z;k(Q==27)k(H==$f.z){$c.3I();t}q $f.z.1U();k(Q>=37&&Q<=40){o U;k($c.1i==$f.z||$c.1i==$d.1X)k($f.Z.d){U="d";k(Q==38)$n[U]-=7;q k(Q==39)$n[U]+=1;q k(Q==37)$n[U]-=1;q $n[U]+=7;$n.1S();c("y",$n["y"]);c("M",$n["M"]);c("d",$n[U]);2J(M);t}q{U=$f.Z.49;$d[U+"I"].1U()}U=U||42($c.1i);k(U){k(Q==38||Q==39)$n[U]+=1;q $n[U]-=1;$n.1S();$c.1i.1f=$n[U];3U.4W($c.1i,1a);$c.1i.51()}}q k(Q==9){o D=H.34;19(o R=0;R<$f.22.u;R++)k(D.28==1a||D.36==0)D=D.34;q 1g;k($c.1i!=D){$c.1i=D;D.1U()}}q k(Q==13){3U.4W($c.1i);k($c.1i.3a=="1N")$c.1i.8e();q $c.4R();$c.1i=$f.z}}q k(Q==9&&H==$f.z)$c.3I();k($f.8m&&!$5x&&!$f.3L&&$c.1i==$f.z&&(Q>=48&&Q<=57)){o T=$f.z,S=T.1f,F=E(T),I={1V:"",1o:[]},R=0,K,N=0,X=0,O=0,J,b=/3d|2n|3m|y|3K|M|1J|d|%2i|4O|H|4U|m|4V|s|4Z|W|w/g,L=$f.1A.2Z(b),B,A,$,V,W,G,J=0;k(S!=""){O=S.2Z(/[0-9]/g);O=O==1h?0:O.u;19(R=0;R=0?1:0;k(O==1&&F>=S.u)F=S.u-1}S=S.1D(0,F)+8j.8i(Q)+S.1D(F+O);F++;19(R=0;R=0){S+=$f.1A.1D(N,X);k(F>=N+J&&F<=X+J)F+=X-N}N=b.2C;G=N-X;B=I.1V.1D(0,G);A=K[0].1O(0);$=2e(B.1O(0));k(I.1V.u>1){V=I.1V.1O(1);W=$*10+2e(V)}q{V="";W=$}k(I.1o[X+1]||A=="M"&&W>12||A=="d"&&W>31||A=="H"&&W>23||"6a".1p(A)>=0&&W>59){k(K[0].u==2)B="0"+$;q B=$;F++}q k(G==1){B=W;G++;J++}S+=B;I.1V=I.1V.1D(G);k(I.1V=="")1g}T.1f=S;P(T,F);2J(M)}k(53&&$c.1i!=$f.z&&!((Q>=48&&Q<=57)||Q==8||Q==46))2J(M);l E(A){o b=0;k($f.4L.1P.5X){o B=$f.4L.1P.5X.82(),$=B.4M.u;B.6z("4S",-A.1f.u);b=B.4M.u-$}q k(A.55||A.55=="0")b=A.55;t b}l P(b,A){k(b.5r){b.1U();b.5r(A,A)}q k(b.6U){o $=b.6U();$.7B(1a);$.7x("4S",A);$.6z("4S",A);$.51()}}}1P.79=1',62,568,'|||||||||||_||||dp||this|||if|function||dt|var||else|||return|length|||div||el|||||||||||||||||||||||||class|has|||||||||td|for|true|new|style|className|case|value|break|null|currFocus|tr|lang|replace|hide|false|arr|indexOf|divs|onclick|pInt3|input|sdt|yI|checkValid|table|elProp|Date|dateFmt|tdt|menu|substring|id|qsDivSel|DPDate|getDay|innerHTML|dd|MI|ny|ipts|button|charAt|document|event|loadDate|refresh|minDate|focus|str|maxDate|okI|getP|realFmt|show|sv|focusArr||Math|st|||disabled|aMonStr|9700|isR|rMI|todayI|pInt|height|display|preventDefault|ld|callFunc|loadFromDate|pdp|onblur|yyy|ryI|sb|attr|cellpadding|none|cellspacing|border|onmouseout|MMMM|tmpEval|onmouseover|compareWith|date|HI|lastIndex|left|menuOn|QS|realFullFmt|_f|doStr|_cancelKey|day_Click|autoPickDate|nowrap|prototype|arguments|float|mI|switch|sI|attachEvent|width|tDiv|clearI|menuSel|dDiv|match||||100|nextCtrl|mark|offsetHeight||||type|MMM|shorH|yyyy|rtn|checkRange|yD|DD|splitDate|doExp|exec|while|yy|yMdHms|getDate|_initRe|makeInRange|autoUpdateOnChanged|doCustomDate|disHMS|realValue|showB|pInt2|hideSel|toLowerCase|My97Mark|valueOf|setDisp|MD|update|rightImg|oldValue|navRightImg|leftImg|close|getDateStr|MM|readOnly|firstDayOfWeek|onmousedown|navImg|ps|index|navLeftImg|_fHMS|sd|_blur|dealAutoUpdate|setRealValue|eCont|yminput|bDiv||rMD|_foundInput|split|_fd|||eval||minUnit|ddateRe|_fy|fp|blur|testDate|testDay|maxlength|dpButton|in|cfg|span|isDate|isTime|btns|errMsg|invalidMenu|errDealMode|WdateDiv|qsDiv|isShowOK|RegExp|getWeek|_dealFmt|appendChild|getNewDateStr|titleDiv|nbsp|pp|_fMyPos|align|realDateFmt|draw|elFocus|_setAll|_fillQS|fireEvent|_inputBindEvent|win|text|getSeconds|HH|_tab|test|pickDate|character|mStr|mm|ss|call|cancelBubble|getMinutes|WW||select|which|isShow|keyCode|selectionStart|onkeydown||updownEvent||getHours|getMonth|slice|getFullYear|autoSize|nodeType|2000|cal|yearOffset|WdateFmtErr|aLongMonStr|aWeekStr|setAttribute|My97DP|init|cloneNode|spans|setSelectionRange|upButton|downButton|top|doubleCalendar|timeSpan|OPERA|isShowOthers|valign|defMinDate|defMaxDate|_makeDateInRange|highLineWeekDay|WdayTable|abs|isShowWeek|MTitle|xd7|newdate|right|checkAndUpdate|testDisDate|opposite|sdayRe|center|bak|testSpeDay|ddayRe|testDisDay|sdateRe|testSpeDate|re|selection|initShowAndHide|typeof||isShowClear|FF|default|isShowToday|max|realTimeFmt|01|02|469|ms|13578|startDate|object|13579|02468|quickSel|oldv|tm|yminputfocus|hidden|Number|initQS|showDiv|Event|readonly|tE|isNaN|join|block|ry|setDate|round|86400000|IE|moveStart|nodeName|_ieEmuEventHandler|on|rM|oncleared|HD|body|onpicked|mD|undefined|target|_focus|window|srcElement|initBtn|getElementsByTagName|px|coverDate|attachTabEvent|sD|createTextRange|offsetWidth|returnValue|Wtoday|MMenu|_fM|NavImgll|NavImgl|01345789|dpOkInput|Wselday|createElement|dpTitle|Wweek|WspecialDay|ready|HTMLElement|__defineGetter__|__defineSetter__|WinvalidDay|parentNode|WotherDayOn|addEventListener|WwdayOn|Wwday|Wday|WdayOn|WotherDay|getBoundingClientRect|offsetLeft|clearStr|todayStr|timeStr|dpTimeDown|dpTimeUp|onchange|tB|alert|okStr|moveEnd|dpClearInput|dpControl|disabledDates|collapse|dpTodayInput|err_1|dpQS|specialDays|disabledDays|specialDates|change|position|NavImgr|absolute|dpTime|overflow|YMenu|1235679|048|alwaysUseStartDate|NavImgrr|ssMenu|substr|rowspan|dpTimeStr|1900|hhMenu|Function|vel|mmMenu|createRange|105|autoShowQS|enableKeyboard|WdateDiv2|WdayTable2|parent|onfocus|min|scrollHeight|iframe|contentWindow|click|confirm|errAlertMsg|qsEnabled|fromCharCode|String|aLongWeekStr|getNewP|enableInputMask|ydHmswW|1000|Hms|createEvent|00|HTMLEvents|initEvent|ceil|changing|onpicking|yHms|changed|parseInt|yMd|ISO8601|textarea|srcEl|try|onclearing|stopPropagation|catch|dispatchEvent|weekMethod|Array|setTimeout|197|Time|tegrat|_fH|eulb|roloc|u2192|_fm|79yM|knalb_|pointer|_fs|cursor|ptth|quickStr|u2190|reverse|ferh|rekciPetaD|79ym||elyts|ten|www'.split('|'),0,{})) \ No newline at end of file diff --git a/src/main/webapp/plug-in/My97DatePicker/lang/en.js b/src/main/webapp/plug-in/My97DatePicker/lang/en.js new file mode 100644 index 00000000..31598854 --- /dev/null +++ b/src/main/webapp/plug-in/My97DatePicker/lang/en.js @@ -0,0 +1,14 @@ +var $lang={ +errAlertMsg: "Invalid date or the date out of range,redo or not?", +aWeekStr: ["wk", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], +aLongWeekStr:["wk","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"], +aMonStr: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], +aLongMonStr: ["January","February","March","April","May","June","July","August","September","October","November","December"], +clearStr: "Clear", +todayStr: "Today", +okStr: "OK", +updateStr: "OK", +timeStr: "Time", +quickStr: "Quick Selection", +err_1: 'MinDate Cannot be bigger than MaxDate!' +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/My97DatePicker/lang/zh-cn.js b/src/main/webapp/plug-in/My97DatePicker/lang/zh-cn.js new file mode 100644 index 00000000..70e5e4f3 --- /dev/null +++ b/src/main/webapp/plug-in/My97DatePicker/lang/zh-cn.js @@ -0,0 +1,14 @@ +var $lang={ +errAlertMsg: "\u4E0D\u5408\u6CD5\u7684\u65E5\u671F\u683C\u5F0F\u6216\u8005\u65E5\u671F\u8D85\u51FA\u9650\u5B9A\u8303\u56F4,\u9700\u8981\u64A4\u9500\u5417?", +aWeekStr: ["\u5468","\u65E5","\u4E00","\u4E8C","\u4E09","\u56DB","\u4E94","\u516D"], +aLongWeekStr:["\u5468","\u661F\u671F\u65E5","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D"], +aMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00","\u5341\u4E8C"], +aLongMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"], +clearStr: "\u6E05\u7A7A", +todayStr: "\u4ECA\u5929", +okStr: "\u786E\u5B9A", +updateStr: "\u786E\u5B9A", +timeStr: "\u65F6\u95F4", +quickStr: "\u5FEB\u901F\u9009\u62E9", +err_1: '\u6700\u5C0F\u65E5\u671F\u4E0D\u80FD\u5927\u4E8E\u6700\u5927\u65E5\u671F!' +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/My97DatePicker/lang/zh-tw.js b/src/main/webapp/plug-in/My97DatePicker/lang/zh-tw.js new file mode 100644 index 00000000..b92e0eec --- /dev/null +++ b/src/main/webapp/plug-in/My97DatePicker/lang/zh-tw.js @@ -0,0 +1,14 @@ +var $lang={ +errAlertMsg: "\u4E0D\u5408\u6CD5\u7684\u65E5\u671F\u683C\u5F0F\u6216\u8005\u65E5\u671F\u8D85\u51FA\u9650\u5B9A\u7BC4\u570D,\u9700\u8981\u64A4\u92B7\u55CE?", +aWeekStr: ["\u5468","\u65E5","\u4E00","\u4E8C","\u4E09","\u56DB","\u4E94","\u516D"], +aLongWeekStr:["\u5468","\u661F\u671F\u65E5","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D"], +aMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00","\u5341\u4E8C"], +aLongMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"], +clearStr: "\u6E05\u7A7A", +todayStr: "\u4ECA\u5929", +okStr: "\u78BA\u5B9A", +updateStr: "\u78BA\u5B9A", +timeStr: "\u6642\u9593", +quickStr: "\u5FEB\u901F\u9078\u64C7", +err_1: '\u6700\u5C0F\u65E5\u671F\u4E0D\u80FD\u5927\u65BC\u6700\u5927\u65E5\u671F!' +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/My97DatePicker/skin/WdatePicker.css b/src/main/webapp/plug-in/My97DatePicker/skin/WdatePicker.css new file mode 100644 index 00000000..8d447b57 --- /dev/null +++ b/src/main/webapp/plug-in/My97DatePicker/skin/WdatePicker.css @@ -0,0 +1,10 @@ +.Wdate{ + border:#999 1px solid; + height:20px; + background:#fff url(datePicker.gif) no-repeat right; +} + +.WdateFmtErr{ + font-weight:bold; + color:red; +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/My97DatePicker/skin/datePicker.gif b/src/main/webapp/plug-in/My97DatePicker/skin/datePicker.gif new file mode 100644 index 00000000..d6bf40c9 Binary files /dev/null and b/src/main/webapp/plug-in/My97DatePicker/skin/datePicker.gif differ diff --git a/src/main/webapp/plug-in/My97DatePicker/skin/default/datepicker.css b/src/main/webapp/plug-in/My97DatePicker/skin/default/datepicker.css new file mode 100644 index 00000000..29d5432f --- /dev/null +++ b/src/main/webapp/plug-in/My97DatePicker/skin/default/datepicker.css @@ -0,0 +1,246 @@ +/* + * My97 DatePicker 4.7 + */ + +.WdateDiv{ + width:180px; + background-color:#FFFFFF; + border:#bbb 1px solid; + padding:2px; +} + +.WdateDiv2{ + width:360px; +} +.WdateDiv *{font-size:9pt;} + +.WdateDiv .NavImg a{ + display:block; + cursor:pointer; + height:16px; + width:16px; +} + +.WdateDiv .NavImgll a{ + float:left; + background:transparent url(img.gif) no-repeat scroll 0 0; +} +.WdateDiv .NavImgl a{ + float:left; + background:transparent url(img.gif) no-repeat scroll -16px 0; +} +.WdateDiv .NavImgr a{ + float:right; + background:transparent url(img.gif) no-repeat scroll -32px 0; +} +.WdateDiv .NavImgrr a{ + float:right; + background:transparent url(img.gif) no-repeat scroll -48px 0; +} + +.WdateDiv #dpTitle{ + height:24px; + margin-bottom:2px; + padding:1px; +} + +.WdateDiv .yminput{ + margin-top:2px; + text-align:center; + height:20px; + border:0px; + width:50px; + cursor:pointer; +} + +.WdateDiv .yminputfocus{ + margin-top:2px; + text-align:center; + font-weight:bold; + height:20px; + color:blue; + border:#ccc 1px solid; + width:50px; +} + +.WdateDiv .menuSel{ + z-index:1; + position:absolute; + background-color:#FFFFFF; + border:#ccc 1px solid; + display:none; +} + +.WdateDiv .menu{ + cursor:pointer; + background-color:#fff; +} + +.WdateDiv .menuOn{ + cursor:pointer; + background-color:#BEEBEE; +} + +.WdateDiv .invalidMenu{ + color:#aaa; +} + +.WdateDiv .YMenu{ + margin-top:20px; + +} + +.WdateDiv .MMenu{ + margin-top:20px; + *width:62px; +} + +.WdateDiv .hhMenu{ + margin-top:-90px; + margin-left:26px; +} + +.WdateDiv .mmMenu{ + margin-top:-46px; + margin-left:26px; +} + +.WdateDiv .ssMenu{ + margin-top:-24px; + margin-left:26px; +} + + .WdateDiv .Wweek { + text-align:center; + background:#DAF3F5; + border-right:#BDEBEE 1px solid; + } + +.WdateDiv .MTitle{ + background-color:#BDEBEE; +} +.WdateDiv .WdayTable2{ + border-collapse:collapse; + border:#c5d9e8 1px solid; +} +.WdateDiv .WdayTable2 table{ + border:0; +} + +.WdateDiv .WdayTable{ + line-height:20px; + border:#c5d9e8 1px solid; +} +.WdateDiv .WdayTable td{ + text-align:center; +} + +.WdateDiv .Wday{ + cursor:pointer; +} + +.WdateDiv .WdayOn{ + cursor:pointer; + background-color:#C0EBEF; +} + +.WdateDiv .Wwday{ + cursor:pointer; + color:#FF2F2F; +} + +.WdateDiv .WwdayOn{ + cursor:pointer; + color:#000; + background-color:#C0EBEF; +} +.WdateDiv .Wtoday{ + cursor:pointer; + color:blue; +} +.WdateDiv .Wselday{ + background-color:#A9E4E9; +} +.WdateDiv .WspecialDay{ + background-color:#66F4DF; +} + +.WdateDiv .WotherDay{ + cursor:pointer; + color:#6A6AFF; +} + +.WdateDiv .WotherDayOn{ + cursor:pointer; + background-color:#C0EBEF; +} + +.WdateDiv .WinvalidDay{ + color:#aaa; +} + +.WdateDiv #dpTime{ + float:left; + margin-top:3px; + margin-right:30px; +} + +.WdateDiv #dpTime #dpTimeStr{ + margin-left:1px; +} + +.WdateDiv #dpTime input{ + width:18px; + height:20px; + text-align:center; + border:#ccc 1px solid; +} + +.WdateDiv #dpTime .tB{ + border-right:0px; +} + +.WdateDiv #dpTime .tE{ + border-left:0; + border-right:0; +} + +.WdateDiv #dpTime .tm{ + width:7px; + border-left:0; + border-right:0; +} + +.WdateDiv #dpTime #dpTimeUp{ + height:10px; + width:13px; + border:0px; + background:url(img.gif) no-repeat -32px -16px; +} + +.WdateDiv #dpTime #dpTimeDown{ + height:10px; + width:13px; + border:0px; + background:url(img.gif) no-repeat -48px -16px; +} + + .WdateDiv #dpQS { + float:left; + margin-right:3px; + margin-top:3px; + background:url(img.gif) no-repeat 0px -16px; + width:20px; + height:20px; + cursor:pointer; + } +.WdateDiv #dpControl { + text-align:right; +} +.WdateDiv .dpButton{ + height:20px; + width:45px; + border:#ccc 1px solid; + margin-top:2px; + margin-right:1px; +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/My97DatePicker/skin/default/img.gif b/src/main/webapp/plug-in/My97DatePicker/skin/default/img.gif new file mode 100644 index 00000000..053205d8 Binary files /dev/null and b/src/main/webapp/plug-in/My97DatePicker/skin/default/img.gif differ diff --git a/src/main/webapp/plug-in/My97DatePicker/skin/whyGreen/bg.jpg b/src/main/webapp/plug-in/My97DatePicker/skin/whyGreen/bg.jpg new file mode 100644 index 00000000..75516a63 Binary files /dev/null and b/src/main/webapp/plug-in/My97DatePicker/skin/whyGreen/bg.jpg differ diff --git a/src/main/webapp/plug-in/My97DatePicker/skin/whyGreen/datepicker.css b/src/main/webapp/plug-in/My97DatePicker/skin/whyGreen/datepicker.css new file mode 100644 index 00000000..f8426f5d --- /dev/null +++ b/src/main/webapp/plug-in/My97DatePicker/skin/whyGreen/datepicker.css @@ -0,0 +1,256 @@ +/* + * My97 DatePicker 4.7 Skin:whyGreen + */ +.WdateDiv{ + width:180px; + background-color:#fff; + border:#C5E1E4 1px solid; + padding:2px; +} + +.WdateDiv2{ + width:360px; +} +.WdateDiv *{font-size:9pt;} + +.WdateDiv .NavImg a{ + cursor:pointer; + display:block; + width:16px; + height:16px; + margin-top:1px; +} + +.WdateDiv .NavImgll a{ + float:left; + background:url(img.gif) no-repeat; +} +.WdateDiv .NavImgl a{ + float:left; + background:url(img.gif) no-repeat -16px 0px; +} +.WdateDiv .NavImgr a{ + float:right; + background:url(img.gif) no-repeat -32px 0px; +} +.WdateDiv .NavImgrr a{ + float:right; + background:url(img.gif) no-repeat -48px 0px; +} + +.WdateDiv #dpTitle{ + height:24px; + padding:1px; + border:#c5d9e8 1px solid; + background:url(bg.jpg); + margin-bottom:2px; +} + +.WdateDiv .yminput{ + margin-top:2px; + text-align:center; + border:0px; + height:20px; + width:50px; + color:#034c50; + background-color:transparent; + cursor:pointer; +} + +.WdateDiv .yminputfocus{ + margin-top:2px; + text-align:center; + border:#939393 1px solid; + font-weight:bold; + color:#034c50; + height:20px; + width:50px; +} + +.WdateDiv .menuSel{ + z-index:1; + position:absolute; + background-color:#FFFFFF; + border:#A3C6C8 1px solid; + display:none; +} + +.WdateDiv .menu{ + cursor:pointer; + background-color:#fff; + color:#11777C; +} + +.WdateDiv .menuOn{ + cursor:pointer; + background-color:#BEEBEE; +} + +.WdateDiv .invalidMenu{ + color:#aaa; +} + +.WdateDiv .YMenu{ + margin-top:20px; +} + +.WdateDiv .MMenu{ + margin-top:20px; + *width:62px; +} + +.WdateDiv .hhMenu{ + margin-top:-90px; + margin-left:26px; +} + +.WdateDiv .mmMenu{ + margin-top:-46px; + margin-left:26px; +} + +.WdateDiv .ssMenu{ + margin-top:-24px; + margin-left:26px; +} + + .WdateDiv .Wweek { + text-align:center; + background:#DAF3F5; + border-right:#BDEBEE 1px solid; + } + +.WdateDiv .MTitle{ + color:#13777e; + background-color:#bdebee; +} +.WdateDiv .WdayTable2{ + border-collapse:collapse; + border:#BEE9F0 1px solid; +} +.WdateDiv .WdayTable2 table{ + border:0; +} + +.WdateDiv .WdayTable{ + line-height:20px; + color:#13777e; + background-color:#edfbfb; + border:#BEE9F0 1px solid; +} +.WdateDiv .WdayTable td{ + text-align:center; +} + +.WdateDiv .Wday{ + cursor:pointer; +} + +.WdateDiv .WdayOn{ + cursor:pointer; + background-color:#74d2d9 ; +} + +.WdateDiv .Wwday{ + cursor:pointer; + color:#ab1e1e; +} + +.WdateDiv .WwdayOn{ + cursor:pointer; + background-color:#74d2d9; +} +.WdateDiv .Wtoday{ + cursor:pointer; + color:blue; +} +.WdateDiv .Wselday{ + background-color:#A7E2E7; +} +.WdateDiv .WspecialDay{ + background-color:#66F4DF; +} + +.WdateDiv .WotherDay{ + cursor:pointer; + color:#0099CC; +} + +.WdateDiv .WotherDayOn{ + cursor:pointer; + background-color:#C0EBEF; +} + +.WdateDiv .WinvalidDay{ + color:#aaa; +} + +.WdateDiv #dpTime{ + float:left; + margin-top:3px; + margin-right:30px; +} + +.WdateDiv #dpTime #dpTimeStr{ + margin-left:1px; + color:#497F7F; +} + +.WdateDiv #dpTime input{ + height:20px; + width:18px; + text-align:center; + color:#333; + border:#61CAD0 1px solid; +} + +.WdateDiv #dpTime .tB{ + border-right:0px; +} + +.WdateDiv #dpTime .tE{ + border-left:0; + border-right:0; +} + +.WdateDiv #dpTime .tm{ + width:7px; + border-left:0; + border-right:0; +} + +.WdateDiv #dpTime #dpTimeUp{ + height:10px; + width:13px; + border:0px; + background:url(img.gif) no-repeat -32px -16px; +} + +.WdateDiv #dpTime #dpTimeDown{ + height:10px; + width:13px; + border:0px; + background:url(img.gif) no-repeat -48px -16px; +} + + .WdateDiv #dpQS { + float:left; + margin-right:3px; + margin-top:3px; + background:url(img.gif) no-repeat 0px -16px; + width:20px; + height:20px; + cursor:pointer; + } +.WdateDiv #dpControl { + text-align:right; + margin-top:3px; +} +.WdateDiv .dpButton{ + height:20px; + width:45px; + margin-top:2px; + border:#38B1B9 1px solid; + background-color:#CFEBEE; + color:#08575B; +} \ No newline at end of file diff --git a/src/main/webapp/plug-in/My97DatePicker/skin/whyGreen/img.gif b/src/main/webapp/plug-in/My97DatePicker/skin/whyGreen/img.gif new file mode 100644 index 00000000..4003f20f Binary files /dev/null and b/src/main/webapp/plug-in/My97DatePicker/skin/whyGreen/img.gif differ diff --git a/src/main/webapp/plug-in/OpenLayers-2.11/OpenLayers.js b/src/main/webapp/plug-in/OpenLayers-2.11/OpenLayers.js new file mode 100644 index 00000000..9523007d --- /dev/null +++ b/src/main/webapp/plug-in/OpenLayers-2.11/OpenLayers.js @@ -0,0 +1,2885 @@ +/* + + OpenLayers.js -- OpenLayers Map Viewer Library + + Copyright 2005-2011 OpenLayers Contributors, released under the FreeBSD + license. Please see http://svn.openlayers.org/trunk/openlayers/license.txt + for the full text of the license. + + Includes compressed code under the following licenses: + + (For uncompressed versions of the code used please see the + OpenLayers SVN repository: ) + +*/ + +/* Contains portions of Prototype.js: + * + * Prototype JavaScript framework, version 1.4.0 + * (c) 2005 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://prototype.conio.net/ + * + *--------------------------------------------------------------------------*/ + +/** +* +* Contains portions of Rico +* +* Copyright 2005 Sabre Airline Solutions +* +* Licensed under the Apache License, Version 2.0 (the "License"); you +* may not use this file except in compliance with the License. You +* may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +* implied. See the License for the specific language governing +* permissions and limitations under the License. +* +**/ + +/** + * Contains XMLHttpRequest.js + * Copyright 2007 Sergey Ilinsky (http://www.ilinsky.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +/** + * Contains portions of Gears + * + * Copyright 2007, Google Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of Google Inc. nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Sets up google.gears.*, which is *the only* supported way to access Gears. + * + * Circumvent this file at your own risk! + * + * In the future, Gears may automatically define google.gears.* without this + * file. Gears may use these objects to transparently fix bugs and compatibility + * issues. Applications that use the code below will continue to work seamlessly + * when that happens. + */ + +/** + * OpenLayers.Util.pagePosition is based on Yahoo's getXY method, which is + * Copyright (c) 2006, Yahoo! Inc. + * All rights reserved. + * + * Redistribution and use of this software in source and binary forms, with or + * without modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Yahoo! Inc. nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission of Yahoo! Inc. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */(function(){if(window.google&&google.gears){return;} +var factory=null;if(typeof GearsFactory!='undefined'){factory=new GearsFactory();}else{try{factory=new ActiveXObject('Gears.Factory');if(factory.getBuildInfo().indexOf('ie_mobile')!=-1){factory.privateSetGlobalObject(this);}}catch(e){if((typeof navigator.mimeTypes!='undefined')&&navigator.mimeTypes["application/x-googlegears"]){factory=document.createElement("object");factory.style.display="none";factory.width=0;factory.height=0;factory.type="application/x-googlegears";document.documentElement.appendChild(factory);}}} +if(!factory){return;} +if(!window.google){google={};} +if(!google.gears){google.gears={factory:factory};}})();var OpenLayers={VERSION_NUMBER:"Release 2.11",singleFile:true,_getScriptLocation:(function(){var r=new RegExp("(^|(.*?\\/))(OpenLayers\.js)(\\?|$)"),s=document.getElementsByTagName('script'),src,m,l="";for(var i=0,len=s.length;i1){var newArgs=[C,P].concat(Array.prototype.slice.call(arguments).slice(1,len-1),F);OpenLayers.inherit.apply(null,newArgs);}else{C.prototype=F;} +return C;};OpenLayers.Class.isPrototype=function(){};OpenLayers.Class.create=function(){return function(){if(arguments&&arguments[0]!=OpenLayers.Class.isPrototype){this.initialize.apply(this,arguments);}};};OpenLayers.Class.inherit=function(P){var C=function(){P.call(this);};var newArgs=[C].concat(Array.prototype.slice.call(arguments));OpenLayers.inherit.apply(null,newArgs);return C.prototype;};OpenLayers.inherit=function(C,P){var F=function(){};F.prototype=P.prototype;C.prototype=new F;var i,l,o;for(i=2,l=arguments.length;i0;},CLASS_NAME:"OpenLayers.Protocol.Response"});OpenLayers.Protocol.Response.SUCCESS=1;OpenLayers.Protocol.Response.FAILURE=0;OpenLayers.Protocol.SQL=OpenLayers.Class(OpenLayers.Protocol,{databaseName:'ol',tableName:"ol_vector_features",postReadFiltering:true,initialize:function(options){OpenLayers.Protocol.prototype.initialize.apply(this,[options]);},destroy:function(){OpenLayers.Protocol.prototype.destroy.apply(this);},supported:function(){return false;},evaluateFilter:function(feature,filter){return filter&&this.postReadFiltering?filter.evaluate(feature):true;},CLASS_NAME:"OpenLayers.Protocol.SQL"});OpenLayers.Console={log:function(){},debug:function(){},info:function(){},warn:function(){},error:function(){},userError:function(error){alert(error);},assert:function(){},dir:function(){},dirxml:function(){},trace:function(){},group:function(){},groupEnd:function(){},time:function(){},timeEnd:function(){},profile:function(){},profileEnd:function(){},count:function(){},CLASS_NAME:"OpenLayers.Console"};(function(){var scripts=document.getElementsByTagName("script");for(var i=0,len=scripts.length;i0){fig=parseFloat(num.toPrecision(sig));} +return fig;},format:function(num,dec,tsep,dsep){dec=(typeof dec!="undefined")?dec:0;tsep=(typeof tsep!="undefined")?tsep:OpenLayers.Number.thousandsSeparator;dsep=(typeof dsep!="undefined")?dsep:OpenLayers.Number.decimalSeparator;if(dec!=null){num=parseFloat(num.toFixed(dec));} +var parts=num.toString().split(".");if(parts.length==1&&dec==null){dec=0;} +var integer=parts[0];if(tsep){var thousands=/(-?[0-9]+)([0-9]{3})/;while(thousands.test(integer)){integer=integer.replace(thousands,"$1"+tsep+"$2");}} +var str;if(dec==0){str=integer;}else{var rem=parts.length>1?parts[1]:"0";if(dec!=null){rem=rem+new Array(dec-rem.length+1).join("0");} +str=integer+dsep+rem;} +return str;}};if(!Number.prototype.limitSigDigs){Number.prototype.limitSigDigs=function(sig){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Number.limitSigDigs'}));return OpenLayers.Number.limitSigDigs(this,sig);};} +OpenLayers.Function={bind:function(func,object){var args=Array.prototype.slice.apply(arguments,[2]);return function(){var newArgs=args.concat(Array.prototype.slice.apply(arguments,[0]));return func.apply(object,newArgs);};},bindAsEventListener:function(func,object){return function(event){return func.call(object,event||window.event);};},False:function(){return false;},True:function(){return true;},Void:function(){}};if(!Function.prototype.bind){Function.prototype.bind=function(){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Function.bind'}));Array.prototype.unshift.apply(arguments,[this]);return OpenLayers.Function.bind.apply(null,arguments);};} +if(!Function.prototype.bindAsEventListener){Function.prototype.bindAsEventListener=function(object){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Function.bindAsEventListener'}));return OpenLayers.Function.bindAsEventListener(this,object);};} +OpenLayers.Array={filter:function(array,callback,caller){var selected=[];if(Array.prototype.filter){selected=array.filter(callback,caller);}else{var len=array.length;if(typeof callback!="function"){throw new TypeError();} +for(var i=0;ithis.right)){this.right=bounds.right;} +if((this.top==null)||(bounds.top>this.top)){this.top=bounds.top;}}}},containsLonLat:function(ll,inclusive){return this.contains(ll.lon,ll.lat,inclusive);},containsPixel:function(px,inclusive){return this.contains(px.x,px.y,inclusive);},contains:function(x,y,inclusive){if(inclusive==null){inclusive=true;} +if(x==null||y==null){return false;} +x=OpenLayers.Util.toFloat(x);y=OpenLayers.Util.toFloat(y);var contains=false;if(inclusive){contains=((x>=this.left)&&(x<=this.right)&&(y>=this.bottom)&&(y<=this.top));}else{contains=((x>this.left)&&(xthis.bottom)&&(y=this.bottom)&&(bounds.bottom<=this.top))||((this.bottom>=bounds.bottom)&&(this.bottom<=bounds.top)));var inTop=(((bounds.top>=this.bottom)&&(bounds.top<=this.top))||((this.top>bounds.bottom)&&(this.top=this.left)&&(bounds.left<=this.right))||((this.left>=bounds.left)&&(this.left<=bounds.right)));var inRight=(((bounds.right>=this.left)&&(bounds.right<=this.right))||((this.right>=bounds.left)&&(this.right<=bounds.right)));intersects=((inBottom||inTop)&&(inLeft||inRight));} +return intersects;},containsBounds:function(bounds,partial,inclusive){if(partial==null){partial=false;} +if(inclusive==null){inclusive=true;} +var bottomLeft=this.contains(bounds.left,bounds.bottom,inclusive);var bottomRight=this.contains(bounds.right,bounds.bottom,inclusive);var topLeft=this.contains(bounds.left,bounds.top,inclusive);var topRight=this.contains(bounds.right,bounds.top,inclusive);return(partial)?(bottomLeft||bottomRight||topLeft||topRight):(bottomLeft&&bottomRight&&topLeft&&topRight);},determineQuadrant:function(lonlat){var quadrant="";var center=this.getCenterLonLat();quadrant+=(lonlat.lat=maxExtent.right&&newBounds.right>maxExtent.right){newBounds=newBounds.add(-maxExtent.getWidth(),0);}} +return newBounds;},CLASS_NAME:"OpenLayers.Bounds"});OpenLayers.Bounds.fromString=function(str,reverseAxisOrder){var bounds=str.split(",");return OpenLayers.Bounds.fromArray(bounds,reverseAxisOrder);};OpenLayers.Bounds.fromArray=function(bbox,reverseAxisOrder){return reverseAxisOrder===true?new OpenLayers.Bounds(parseFloat(bbox[1]),parseFloat(bbox[0]),parseFloat(bbox[3]),parseFloat(bbox[2])):new OpenLayers.Bounds(parseFloat(bbox[0]),parseFloat(bbox[1]),parseFloat(bbox[2]),parseFloat(bbox[3]));};OpenLayers.Bounds.fromSize=function(size){return new OpenLayers.Bounds(0,size.h,size.w,0);};OpenLayers.Bounds.oppositeQuadrant=function(quadrant){var opp="";opp+=(quadrant.charAt(0)=='t')?'b':'t';opp+=(quadrant.charAt(1)=='l')?'r':'l';return opp;};OpenLayers.Element={visible:function(element){return OpenLayers.Util.getElement(element).style.display!='none';},toggle:function(){for(var i=0,len=arguments.length;imaxExtent.right){newLonLat.lon-=maxExtent.getWidth();}} +return newLonLat;},CLASS_NAME:"OpenLayers.LonLat"});OpenLayers.LonLat.fromString=function(str){var pair=str.split(",");return new OpenLayers.LonLat(pair[0],pair[1]);};OpenLayers.LonLat.fromArray=function(arr){var gotArr=OpenLayers.Util.isArray(arr),lon=gotArr&&arr[0],lat=gotArr&&arr[1];return new OpenLayers.LonLat(lon,lat);};OpenLayers.Pixel=OpenLayers.Class({x:0.0,y:0.0,initialize:function(x,y){this.x=parseFloat(x);this.y=parseFloat(y);},toString:function(){return("x="+this.x+",y="+this.y);},clone:function(){return new OpenLayers.Pixel(this.x,this.y);},equals:function(px){var equals=false;if(px!=null){equals=((this.x==px.x&&this.y==px.y)||(isNaN(this.x)&&isNaN(this.y)&&isNaN(px.x)&&isNaN(px.y)));} +return equals;},distanceTo:function(px){return Math.sqrt(Math.pow(this.x-px.x,2)+ +Math.pow(this.y-px.y,2));},add:function(x,y){if((x==null)||(y==null)){var msg=OpenLayers.i18n("pixelAddError");OpenLayers.Console.error(msg);return null;} +return new OpenLayers.Pixel(this.x+x,this.y+y);},offset:function(px){var newPx=this.clone();if(px){newPx=this.add(px.x,px.y);} +return newPx;},CLASS_NAME:"OpenLayers.Pixel"});OpenLayers.Size=OpenLayers.Class({w:0.0,h:0.0,initialize:function(w,h){this.w=parseFloat(w);this.h=parseFloat(h);},toString:function(){return("w="+this.w+",h="+this.h);},clone:function(){return new OpenLayers.Size(this.w,this.h);},equals:function(sz){var equals=false;if(sz!=null){equals=((this.w==sz.w&&this.h==sz.h)||(isNaN(this.w)&&isNaN(this.h)&&isNaN(sz.w)&&isNaN(sz.h)));} +return equals;},CLASS_NAME:"OpenLayers.Size"});OpenLayers.Util=OpenLayers.Util||{};OpenLayers.Util.getElement=function(){var elements=[];for(var i=0,len=arguments.length;i=0;i--){if(array[i]==item){array.splice(i,1);}} +return array;};OpenLayers.Util.clearArray=function(array){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'array = []'}));array.length=0;};OpenLayers.Util.indexOf=function(array,obj){if(typeof array.indexOf=="function"){return array.indexOf(obj);}else{for(var i=0,len=array.length;i=0.0&&parseFloat(opacity)<1.0){element.style.filter='alpha(opacity='+(opacity*100)+')';element.style.opacity=opacity;}else if(parseFloat(opacity)==1.0){element.style.filter='';element.style.opacity='';}};OpenLayers.Util.createDiv=function(id,px,sz,imgURL,position,border,overflow,opacity){var dom=document.createElement('div');if(imgURL){dom.style.backgroundImage='url('+imgURL+')';} +if(!id){id=OpenLayers.Util.createUniqueID("OpenLayersDiv");} +if(!position){position="absolute";} +OpenLayers.Util.modifyDOMElement(dom,id,px,sz,position,border,overflow,opacity);return dom;};OpenLayers.Util.createImage=function(id,px,sz,imgURL,position,border,opacity,delayDisplay){var image=document.createElement("img");if(!id){id=OpenLayers.Util.createUniqueID("OpenLayersDiv");} +if(!position){position="relative";} +OpenLayers.Util.modifyDOMElement(image,id,px,sz,position,border,null,opacity);if(delayDisplay){image.style.display="none";OpenLayers.Event.observe(image,"load",OpenLayers.Function.bind(OpenLayers.Util.onImageLoad,image));OpenLayers.Event.observe(image,"error",OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError,image));} +image.style.alt=id;image.galleryImg="no";if(imgURL){image.src=imgURL;} +return image;};OpenLayers.Util.setOpacity=function(element,opacity){OpenLayers.Util.modifyDOMElement(element,null,null,null,null,null,null,opacity);};OpenLayers.Util.onImageLoad=function(){if(!this.viewRequestID||(this.map&&this.viewRequestID==this.map.viewRequestID)){this.style.display="";} +OpenLayers.Element.removeClass(this,"olImageLoadError");};OpenLayers.IMAGE_RELOAD_ATTEMPTS=0;OpenLayers.Util.onImageLoadError=function(){this._attempts=(this._attempts)?(this._attempts+1):1;if(this._attempts<=OpenLayers.IMAGE_RELOAD_ATTEMPTS){var urls=this.urls;if(urls&&OpenLayers.Util.isArray(urls)&&urls.length>1){var src=this.src.toString();var current_url,k;for(k=0;current_url=urls[k];k++){if(src.indexOf(current_url)!=-1){break;}} +var guess=Math.floor(urls.length*Math.random());var new_url=urls[guess];k=0;while(new_url==current_url&&k++<4){guess=Math.floor(urls.length*Math.random());new_url=urls[guess];} +this.src=src.replace(current_url,new_url);}else{this.src=this.src;}}else{OpenLayers.Element.addClass(this,"olImageLoadError");} +this.style.display="";};OpenLayers.Util.alphaHackNeeded=null;OpenLayers.Util.alphaHack=function(){if(OpenLayers.Util.alphaHackNeeded==null){var arVersion=navigator.appVersion.split("MSIE");var version=parseFloat(arVersion[1]);var filter=false;try{filter=!!(document.body.filters);}catch(e){} +OpenLayers.Util.alphaHackNeeded=(filter&&(version>=5.5)&&(version<7));} +return OpenLayers.Util.alphaHackNeeded;};OpenLayers.Util.modifyAlphaImageDiv=function(div,id,px,sz,imgURL,position,border,sizing,opacity){OpenLayers.Util.modifyDOMElement(div,id,px,sz,position,null,null,opacity);var img=div.childNodes[0];if(imgURL){img.src=imgURL;} +OpenLayers.Util.modifyDOMElement(img,div.id+"_innerImage",null,sz,"relative",border);if(OpenLayers.Util.alphaHack()){if(div.style.display!="none"){div.style.display="inline-block";} +if(sizing==null){sizing="scale";} +div.style.filter="progid:DXImageTransform.Microsoft"+".AlphaImageLoader(src='"+img.src+"', "+"sizingMethod='"+sizing+"')";if(parseFloat(div.style.opacity)>=0.0&&parseFloat(div.style.opacity)<1.0){div.style.filter+=" alpha(opacity="+div.style.opacity*100+")";} +img.style.filter="alpha(opacity=0)";}};OpenLayers.Util.createAlphaImageDiv=function(id,px,sz,imgURL,position,border,sizing,opacity,delayDisplay){var div=OpenLayers.Util.createDiv();var img=OpenLayers.Util.createImage(null,null,null,null,null,null,null,false);div.appendChild(img);if(delayDisplay){img.style.display="none";OpenLayers.Event.observe(img,"load",OpenLayers.Function.bind(OpenLayers.Util.onImageLoad,div));OpenLayers.Event.observe(img,"error",OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError,div));} +OpenLayers.Util.modifyAlphaImageDiv(div,id,px,sz,imgURL,position,border,sizing,opacity);return div;};OpenLayers.Util.upperCaseObject=function(object){var uObject={};for(var key in object){uObject[key.toUpperCase()]=object[key];} +return uObject;};OpenLayers.Util.applyDefaults=function(to,from){to=to||{};var fromIsEvt=typeof window.Event=="function"&&from instanceof window.Event;for(var key in from){if(to[key]===undefined||(!fromIsEvt&&from.hasOwnProperty&&from.hasOwnProperty(key)&&!to.hasOwnProperty(key))){to[key]=from[key];}} +if(!fromIsEvt&&from&&from.hasOwnProperty&&from.hasOwnProperty('toString')&&!to.hasOwnProperty('toString')){to.toString=from.toString;} +return to;};OpenLayers.Util.getParameterString=function(params){var paramsArray=[];for(var key in params){var value=params[key];if((value!=null)&&(typeof value!='function')){var encodedValue;if(typeof value=='object'&&value.constructor==Array){var encodedItemArray=[];var item;for(var itemIndex=0,len=value.length;itemIndex1e-12&&--iterLimit>0){var sinLambda=Math.sin(lambda),cosLambda=Math.cos(lambda);var sinSigma=Math.sqrt((cosU2*sinLambda)*(cosU2*sinLambda)+ +(cosU1*sinU2-sinU1*cosU2*cosLambda)*(cosU1*sinU2-sinU1*cosU2*cosLambda));if(sinSigma==0){return 0;} +var cosSigma=sinU1*sinU2+cosU1*cosU2*cosLambda;var sigma=Math.atan2(sinSigma,cosSigma);var alpha=Math.asin(cosU1*cosU2*sinLambda/sinSigma);var cosSqAlpha=Math.cos(alpha)*Math.cos(alpha);var cos2SigmaM=cosSigma-2*sinU1*sinU2/cosSqAlpha;var C=f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));lambdaP=lambda;lambda=L+(1-C)*f*Math.sin(alpha)*(sigma+C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));} +if(iterLimit==0){return NaN;} +var uSq=cosSqAlpha*(a*a-b*b)/(b*b);var A=1+uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));var B=uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));var deltaSigma=B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)- +B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));var s=b*A*(sigma-deltaSigma);var d=s.toFixed(3)/1000;return d;};OpenLayers.Util.destinationVincenty=function(lonlat,brng,dist){var u=OpenLayers.Util;var ct=u.VincentyConstants;var a=ct.a,b=ct.b,f=ct.f;var lon1=lonlat.lon;var lat1=lonlat.lat;var s=dist;var alpha1=u.rad(brng);var sinAlpha1=Math.sin(alpha1);var cosAlpha1=Math.cos(alpha1);var tanU1=(1-f)*Math.tan(u.rad(lat1));var cosU1=1/Math.sqrt((1+tanU1*tanU1)),sinU1=tanU1*cosU1;var sigma1=Math.atan2(tanU1,cosAlpha1);var sinAlpha=cosU1*sinAlpha1;var cosSqAlpha=1-sinAlpha*sinAlpha;var uSq=cosSqAlpha*(a*a-b*b)/(b*b);var A=1+uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));var B=uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));var sigma=s/(b*A),sigmaP=2*Math.PI;while(Math.abs(sigma-sigmaP)>1e-12){var cos2SigmaM=Math.cos(2*sigma1+sigma);var sinSigma=Math.sin(sigma);var cosSigma=Math.cos(sigma);var deltaSigma=B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)- +B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));sigmaP=sigma;sigma=s/(b*A)+deltaSigma;} +var tmp=sinU1*sinSigma-cosU1*cosSigma*cosAlpha1;var lat2=Math.atan2(sinU1*cosSigma+cosU1*sinSigma*cosAlpha1,(1-f)*Math.sqrt(sinAlpha*sinAlpha+tmp*tmp));var lambda=Math.atan2(sinSigma*sinAlpha1,cosU1*cosSigma-sinU1*sinSigma*cosAlpha1);var C=f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));var L=lambda-(1-C)*f*sinAlpha*(sigma+C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));var revAz=Math.atan2(sinAlpha,-tmp);return new OpenLayers.LonLat(lon1+u.deg(L),u.deg(lat2));};OpenLayers.Util.getParameters=function(url){url=(url===null||url===undefined)?window.location.href:url;var paramsString="";if(OpenLayers.String.contains(url,'?')){var start=url.indexOf('?')+1;var end=OpenLayers.String.contains(url,"#")?url.indexOf('#'):url.length;paramsString=url.substring(start,end);} +var parameters={};var pairs=paramsString.split(/[&;]/);for(var i=0,len=pairs.length;i1.0)?(1.0/scale):scale;return normScale;};OpenLayers.Util.getResolutionFromScale=function(scale,units){var resolution;if(scale){if(units==null){units="degrees";} +var normScale=OpenLayers.Util.normalizeScale(scale);resolution=1/(normScale*OpenLayers.INCHES_PER_UNIT[units]*OpenLayers.DOTS_PER_INCH);} +return resolution;};OpenLayers.Util.getScaleFromResolution=function(resolution,units){if(units==null){units="degrees";} +var scale=resolution*OpenLayers.INCHES_PER_UNIT[units]*OpenLayers.DOTS_PER_INCH;return scale;};OpenLayers.Util.safeStopPropagation=function(evt){OpenLayers.Event.stop(evt,true);};OpenLayers.Util.pagePosition=function(forElement){var pos=[0,0];var viewportElement=OpenLayers.Util.getViewportElement();if(!forElement||forElement==window||forElement==viewportElement){return pos;} +var BUGGY_GECKO_BOX_OBJECT=OpenLayers.IS_GECKO&&document.getBoxObjectFor&&OpenLayers.Element.getStyle(forElement,'position')=='absolute'&&(forElement.style.top==''||forElement.style.left=='');var parent=null;var box;if(forElement.getBoundingClientRect){box=forElement.getBoundingClientRect();var scrollTop=viewportElement.scrollTop;var scrollLeft=viewportElement.scrollLeft;pos[0]=box.left+scrollLeft;pos[1]=box.top+scrollTop;}else if(document.getBoxObjectFor&&!BUGGY_GECKO_BOX_OBJECT){box=document.getBoxObjectFor(forElement);var vpBox=document.getBoxObjectFor(viewportElement);pos[0]=box.screenX-vpBox.screenX;pos[1]=box.screenY-vpBox.screenY;}else{pos[0]=forElement.offsetLeft;pos[1]=forElement.offsetTop;parent=forElement.offsetParent;if(parent!=forElement){while(parent){pos[0]+=parent.offsetLeft;pos[1]+=parent.offsetTop;parent=parent.offsetParent;}} +var browser=OpenLayers.BROWSER_NAME;if(browser=="opera"||(browser=="safari"&&OpenLayers.Element.getStyle(forElement,'position')=='absolute')){pos[1]-=document.body.offsetTop;} +parent=forElement.offsetParent;while(parent&&parent!=document.body){pos[0]-=parent.scrollLeft;if(browser!="opera"||parent.tagName!='TR'){pos[1]-=parent.scrollTop;} +parent=parent.offsetParent;}} +return pos;};OpenLayers.Util.getViewportElement=function(){var viewportElement=arguments.callee.viewportElement;if(viewportElement==undefined){viewportElement=(OpenLayers.BROWSER_NAME=="msie"&&document.compatMode!='CSS1Compat')?document.body:document.documentElement;arguments.callee.viewportElement=viewportElement;} +return viewportElement;};OpenLayers.Util.isEquivalentUrl=function(url1,url2,options){options=options||{};OpenLayers.Util.applyDefaults(options,{ignoreCase:true,ignorePort80:true,ignoreHash:true});var urlObj1=OpenLayers.Util.createUrlObject(url1,options);var urlObj2=OpenLayers.Util.createUrlObject(url2,options);for(var key in urlObj1){if(key!=="args"){if(urlObj1[key]!=urlObj2[key]){return false;}}} +for(var key in urlObj1.args){if(urlObj1.args[key]!=urlObj2.args[key]){return false;} +delete urlObj2.args[key];} +for(var key in urlObj2.args){return false;} +return true;};OpenLayers.Util.createUrlObject=function(url,options){options=options||{};if(!(/^\w+:\/\//).test(url)){var loc=window.location;var port=loc.port?":"+loc.port:"";var fullUrl=loc.protocol+"//"+loc.host.split(":").shift()+port;if(url.indexOf("/")===0){url=fullUrl+url;}else{var parts=loc.pathname.split("/");parts.pop();url=fullUrl+parts.join("/")+"/"+url;}} +if(options.ignoreCase){url=url.toLowerCase();} +var a=document.createElement('a');a.href=url;var urlObject={};urlObject.host=a.host.split(":").shift();urlObject.protocol=a.protocol;if(options.ignorePort80){urlObject.port=(a.port=="80"||a.port=="0")?"":a.port;}else{urlObject.port=(a.port==""||a.port=="0")?"80":a.port;} +urlObject.hash=(options.ignoreHash||a.hash==="#")?"":a.hash;var queryString=a.search;if(!queryString){var qMark=url.indexOf("?");queryString=(qMark!=-1)?url.substr(qMark):"";} +urlObject.args=OpenLayers.Util.getParameters(queryString);urlObject.pathname=(a.pathname.charAt(0)=="/")?a.pathname:"/"+a.pathname;return urlObject;};OpenLayers.Util.removeTail=function(url){var head=null;var qMark=url.indexOf("?");var hashMark=url.indexOf("#");if(qMark==-1){head=(hashMark!=-1)?url.substr(0,hashMark):url;}else{head=(hashMark!=-1)?url.substr(0,Math.min(qMark,hashMark)):url.substr(0,qMark);} +return head;};OpenLayers.IS_GECKO=(function(){var ua=navigator.userAgent.toLowerCase();return ua.indexOf("webkit")==-1&&ua.indexOf("gecko")!=-1;})();OpenLayers.BROWSER_NAME=(function(){var name="";var ua=navigator.userAgent.toLowerCase();if(ua.indexOf("opera")!=-1){name="opera";}else if(ua.indexOf("msie")!=-1){name="msie";}else if(ua.indexOf("safari")!=-1){name="safari";}else if(ua.indexOf("mozilla")!=-1){if(ua.indexOf("firefox")!=-1){name="firefox";}else{name="mozilla";}} +return name;})();OpenLayers.Util.getBrowserName=function(){return OpenLayers.BROWSER_NAME;};OpenLayers.Util.getRenderedDimensions=function(contentHTML,size,options){var w,h;var container=document.createElement("div");container.style.visibility="hidden";var containerElement=(options&&options.containerElement)?options.containerElement:document.body;if(size){if(size.w){w=size.w;container.style.width=w+"px";}else if(size.h){h=size.h;container.style.height=h+"px";}} +if(options&&options.displayClass){container.className=options.displayClass;} +var content=document.createElement("div");content.innerHTML=contentHTML;content.style.overflow="visible";if(content.childNodes){for(var i=0,l=content.childNodes.length;i=60){coordinateseconds-=60;coordinateminutes+=1;if(coordinateminutes>=60){coordinateminutes-=60;coordinatedegrees+=1;}} +if(coordinatedegrees<10){coordinatedegrees="0"+coordinatedegrees;} +var str=coordinatedegrees+"\u00B0";if(dmsOption.indexOf('dm')>=0){if(coordinateminutes<10){coordinateminutes="0"+coordinateminutes;} +str+=coordinateminutes+"'";if(dmsOption.indexOf('dms')>=0){if(coordinateseconds<10){coordinateseconds="0"+coordinateseconds;} +str+=coordinateseconds+'"';}} +if(axis=="lon"){str+=coordinate<0?OpenLayers.i18n("W"):OpenLayers.i18n("E");}else{str+=coordinate<0?OpenLayers.i18n("S"):OpenLayers.i18n("N");} +return str;};OpenLayers.Format=OpenLayers.Class({options:null,externalProjection:null,internalProjection:null,data:null,keepData:false,initialize:function(options){OpenLayers.Util.extend(this,options);this.options=options;},destroy:function(){},read:function(data){OpenLayers.Console.userError(OpenLayers.i18n("readNotImplemented"));},write:function(object){OpenLayers.Console.userError(OpenLayers.i18n("writeNotImplemented"));},CLASS_NAME:"OpenLayers.Format"});OpenLayers.Format.JSON=OpenLayers.Class(OpenLayers.Format,{indent:" ",space:" ",newline:"\n",level:0,pretty:false,nativeJSON:(function(){return!!(window.JSON&&typeof JSON.parse=="function"&&typeof JSON.stringify=="function");})(),read:function(json,filter){var object;if(this.nativeJSON){object=JSON.parse(json,filter);}else try{if(/^[\],:{}\s]*$/.test(json.replace(/\\["\\\/bfnrtu]/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){object=eval('('+json+')');if(typeof filter==='function'){function walk(k,v){if(v&&typeof v==='object'){for(var i in v){if(v.hasOwnProperty(i)){v[i]=walk(i,v[i]);}}} +return filter(k,v);} +object=walk('',object);}}}catch(e){} +if(this.keepData){this.data=object;} +return object;},write:function(value,pretty){this.pretty=!!pretty;var json=null;var type=typeof value;if(this.serialize[type]){try{json=(!this.pretty&&this.nativeJSON)?JSON.stringify(value):this.serialize[type].apply(this,[value]);}catch(err){OpenLayers.Console.error("Trouble serializing: "+err);}} +return json;},writeIndent:function(){var pieces=[];if(this.pretty){for(var i=0;i0){pieces.push(',');} +pieces.push(this.writeNewline(),this.writeIndent(),json);}} +this.level-=1;pieces.push(this.writeNewline(),this.writeIndent(),']');return pieces.join('');},'string':function(string){var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};if(/["\\\x00-\x1f]/.test(string)){return'"'+string.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c;} +c=b.charCodeAt();return'\\u00'+ +Math.floor(c/16).toString(16)+ +(c%16).toString(16);})+'"';} +return'"'+string+'"';},'number':function(number){return isFinite(number)?String(number):"null";},'boolean':function(bool){return String(bool);},'date':function(date){function format(number){return(number<10)?'0'+number:number;} +return'"'+date.getFullYear()+'-'+ +format(date.getMonth()+1)+'-'+ +format(date.getDate())+'T'+ +format(date.getHours())+':'+ +format(date.getMinutes())+':'+ +format(date.getSeconds())+'"';}},CLASS_NAME:"OpenLayers.Format.JSON"});OpenLayers.Feature=OpenLayers.Class({layer:null,id:null,lonlat:null,data:null,marker:null,popupClass:null,popup:null,initialize:function(layer,lonlat,data){this.layer=layer;this.lonlat=lonlat;this.data=(data!=null)?data:{};this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){if((this.layer!=null)&&(this.layer.map!=null)){if(this.popup!=null){this.layer.map.removePopup(this.popup);}} +if(this.layer!=null&&this.marker!=null){this.layer.removeMarker(this.marker);} +this.layer=null;this.id=null;this.lonlat=null;this.data=null;if(this.marker!=null){this.destroyMarker(this.marker);this.marker=null;} +if(this.popup!=null){this.destroyPopup(this.popup);this.popup=null;}},onScreen:function(){var onScreen=false;if((this.layer!=null)&&(this.layer.map!=null)){var screenBounds=this.layer.map.getExtent();onScreen=screenBounds.containsLonLat(this.lonlat);} +return onScreen;},createMarker:function(){if(this.lonlat!=null){this.marker=new OpenLayers.Marker(this.lonlat,this.data.icon);} +return this.marker;},destroyMarker:function(){this.marker.destroy();},createPopup:function(closeBox){if(this.lonlat!=null){if(!this.popup){var anchor=(this.marker)?this.marker.icon:null;var popupClass=this.popupClass?this.popupClass:OpenLayers.Popup.AnchoredBubble;this.popup=new popupClass(this.id+"_popup",this.lonlat,this.data.popupSize,this.data.popupContentHTML,anchor,closeBox);} +if(this.data.overflow!=null){this.popup.contentDiv.style.overflow=this.data.overflow;} +this.popup.feature=this;} +return this.popup;},destroyPopup:function(){if(this.popup){this.popup.feature=null;this.popup.destroy();this.popup=null;}},CLASS_NAME:"OpenLayers.Feature"});OpenLayers.State={UNKNOWN:'Unknown',INSERT:'Insert',UPDATE:'Update',DELETE:'Delete'};OpenLayers.Feature.Vector=OpenLayers.Class(OpenLayers.Feature,{fid:null,geometry:null,attributes:null,bounds:null,state:null,style:null,url:null,renderIntent:"default",modified:null,initialize:function(geometry,attributes,style){OpenLayers.Feature.prototype.initialize.apply(this,[null,null,attributes]);this.lonlat=null;this.geometry=geometry?geometry:null;this.state=null;this.attributes={};if(attributes){this.attributes=OpenLayers.Util.extend(this.attributes,attributes);} +this.style=style?style:null;},destroy:function(){if(this.layer){this.layer.removeFeatures(this);this.layer=null;} +this.geometry=null;this.modified=null;OpenLayers.Feature.prototype.destroy.apply(this,arguments);},clone:function(){return new OpenLayers.Feature.Vector(this.geometry?this.geometry.clone():null,this.attributes,this.style);},onScreen:function(boundsOnly){var onScreen=false;if(this.layer&&this.layer.map){var screenBounds=this.layer.map.getExtent();if(boundsOnly){var featureBounds=this.geometry.getBounds();onScreen=screenBounds.intersectsBounds(featureBounds);}else{var screenPoly=screenBounds.toGeometry();onScreen=screenPoly.intersects(this.geometry);}} +return onScreen;},getVisibility:function(){return!(this.style&&this.style.display=='none'||!this.layer||this.layer&&this.layer.styleMap&&this.layer.styleMap.createSymbolizer(this,this.renderIntent).display=='none'||this.layer&&!this.layer.getVisibility());},createMarker:function(){return null;},destroyMarker:function(){},createPopup:function(){return null;},atPoint:function(lonlat,toleranceLon,toleranceLat){var atPoint=false;if(this.geometry){atPoint=this.geometry.atPoint(lonlat,toleranceLon,toleranceLat);} +return atPoint;},destroyPopup:function(){},move:function(location){if(!this.layer||!this.geometry.move){return undefined;} +var pixel;if(location.CLASS_NAME=="OpenLayers.LonLat"){pixel=this.layer.getViewPortPxFromLonLat(location);}else{pixel=location;} +var lastPixel=this.layer.getViewPortPxFromLonLat(this.geometry.getBounds().getCenterLonLat());var res=this.layer.map.getResolution();this.geometry.move(res*(pixel.x-lastPixel.x),res*(lastPixel.y-pixel.y));this.layer.drawFeature(this);return lastPixel;},toState:function(state){if(state==OpenLayers.State.UPDATE){switch(this.state){case OpenLayers.State.UNKNOWN:case OpenLayers.State.DELETE:this.state=state;break;case OpenLayers.State.UPDATE:case OpenLayers.State.INSERT:break;}}else if(state==OpenLayers.State.INSERT){switch(this.state){case OpenLayers.State.UNKNOWN:break;default:this.state=state;break;}}else if(state==OpenLayers.State.DELETE){switch(this.state){case OpenLayers.State.INSERT:break;case OpenLayers.State.DELETE:break;case OpenLayers.State.UNKNOWN:case OpenLayers.State.UPDATE:this.state=state;break;}}else if(state==OpenLayers.State.UNKNOWN){this.state=state;}},CLASS_NAME:"OpenLayers.Feature.Vector"});OpenLayers.Feature.Vector.style={'default':{fillColor:"#ee9900",fillOpacity:0.4,hoverFillColor:"white",hoverFillOpacity:0.8,strokeColor:"#ee9900",strokeOpacity:1,strokeWidth:1,strokeLinecap:"round",strokeDashstyle:"solid",hoverStrokeColor:"red",hoverStrokeOpacity:1,hoverStrokeWidth:0.2,pointRadius:6,hoverPointRadius:1,hoverPointUnit:"%",pointerEvents:"visiblePainted",cursor:"inherit"},'select':{fillColor:"blue",fillOpacity:0.4,hoverFillColor:"white",hoverFillOpacity:0.8,strokeColor:"blue",strokeOpacity:1,strokeWidth:2,strokeLinecap:"round",strokeDashstyle:"solid",hoverStrokeColor:"red",hoverStrokeOpacity:1,hoverStrokeWidth:0.2,pointRadius:6,hoverPointRadius:1,hoverPointUnit:"%",pointerEvents:"visiblePainted",cursor:"pointer"},'temporary':{fillColor:"#66cccc",fillOpacity:0.2,hoverFillColor:"white",hoverFillOpacity:0.8,strokeColor:"#66cccc",strokeOpacity:1,strokeLinecap:"round",strokeWidth:2,strokeDashstyle:"solid",hoverStrokeColor:"red",hoverStrokeOpacity:1,hoverStrokeWidth:0.2,pointRadius:6,hoverPointRadius:1,hoverPointUnit:"%",pointerEvents:"visiblePainted",cursor:"inherit"},'delete':{display:"none"}};OpenLayers.Format.WKT=OpenLayers.Class(OpenLayers.Format,{initialize:function(options){this.regExes={'typeStr':/^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/,'spaces':/\s+/,'parenComma':/\)\s*,\s*\(/,'doubleParenComma':/\)\s*\)\s*,\s*\(\s*\(/,'trimParens':/^\s*\(?(.*?)\)?\s*$/};OpenLayers.Format.prototype.initialize.apply(this,[options]);},read:function(wkt){var features,type,str;wkt=wkt.replace(/[\n\r]/g," ");var matches=this.regExes.typeStr.exec(wkt);if(matches){type=matches[1].toLowerCase();str=matches[2];if(this.parse[type]){features=this.parse[type].apply(this,[str]);} +if(this.internalProjection&&this.externalProjection){if(features&&features.CLASS_NAME=="OpenLayers.Feature.Vector"){features.geometry.transform(this.externalProjection,this.internalProjection);}else if(features&&type!="geometrycollection"&&typeof features=="object"){for(var i=0,len=features.length;i0){pieces.push(',');} +geometry=collection[i].geometry;pieces.push(this.extractGeometry(geometry));} +if(isCollection){pieces.push(')');} +return pieces.join('');},extractGeometry:function(geometry){var type=geometry.CLASS_NAME.split('.')[2].toLowerCase();if(!this.extract[type]){return null;} +if(this.internalProjection&&this.externalProjection){geometry=geometry.clone();geometry.transform(this.internalProjection,this.externalProjection);} +var wktType=type=='collection'?'GEOMETRYCOLLECTION':type.toUpperCase();var data=wktType+'('+this.extract[type].apply(this,[geometry])+')';return data;},extract:{'point':function(point){return point.x+' '+point.y;},'multipoint':function(multipoint){var array=[];for(var i=0,len=multipoint.components.length;i=0;i--){feature=features[i];switch(feature.state){case OpenLayers.State.INSERT:toCreate.push(feature);break;case OpenLayers.State.UPDATE:toUpdate.push(feature);break;case OpenLayers.State.DELETE:toDelete.push(feature);break;}} +if(toCreate.length>0){nRequests++;opt=OpenLayers.Util.applyDefaults({"callback":callback,"scope":this},options.create);resp.push(this.create(toCreate,opt));} +if(toUpdate.length>0){nRequests++;opt=OpenLayers.Util.applyDefaults({"callback":callback,"scope":this},options.update);resp.push(this.update(toUpdate,opt));} +if(toDelete.length>0){nRequests++;opt=OpenLayers.Util.applyDefaults({"callback":callback,"scope":this},options["delete"]);resp.push(this["delete"](toDelete,opt));} +return resp;},clear:function(){this.db.execute("DELETE FROM "+this.tableName);},callUserCallback:function(options,resp){var opt=options[resp.requestType];if(opt&&opt.callback){opt.callback.call(opt.scope,resp);} +if(resp.last&&options.callback){options.callback.call(options.scope);}},CLASS_NAME:"OpenLayers.Protocol.SQL.Gears"});OpenLayers.Event={observers:false,KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,element:function(event){return event.target||event.srcElement;},isSingleTouch:function(event){return event.touches&&event.touches.length==1;},isMultiTouch:function(event){return event.touches&&event.touches.length>1;},isLeftClick:function(event){return(((event.which)&&(event.which==1))||((event.button)&&(event.button==1)));},isRightClick:function(event){return(((event.which)&&(event.which==3))||((event.button)&&(event.button==2)));},stop:function(event,allowDefault){if(!allowDefault){if(event.preventDefault){event.preventDefault();}else{event.returnValue=false;}} +if(event.stopPropagation){event.stopPropagation();}else{event.cancelBubble=true;}},findElement:function(event,tagName){var element=OpenLayers.Event.element(event);while(element.parentNode&&(!element.tagName||(element.tagName.toUpperCase()!=tagName.toUpperCase()))){element=element.parentNode;} +return element;},observe:function(elementParam,name,observer,useCapture){var element=OpenLayers.Util.getElement(elementParam);useCapture=useCapture||false;if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.attachEvent)){name='keydown';} +if(!this.observers){this.observers={};} +if(!element._eventCacheID){var idPrefix="eventCacheID_";if(element.id){idPrefix=element.id+"_"+idPrefix;} +element._eventCacheID=OpenLayers.Util.createUniqueID(idPrefix);} +var cacheID=element._eventCacheID;if(!this.observers[cacheID]){this.observers[cacheID]=[];} +this.observers[cacheID].push({'element':element,'name':name,'observer':observer,'useCapture':useCapture});if(element.addEventListener){element.addEventListener(name,observer,useCapture);}else if(element.attachEvent){element.attachEvent('on'+name,observer);}},stopObservingElement:function(elementParam){var element=OpenLayers.Util.getElement(elementParam);var cacheID=element._eventCacheID;this._removeElementObservers(OpenLayers.Event.observers[cacheID]);},_removeElementObservers:function(elementObservers){if(elementObservers){for(var i=elementObservers.length-1;i>=0;i--){var entry=elementObservers[i];var args=new Array(entry.element,entry.name,entry.observer,entry.useCapture);var removed=OpenLayers.Event.stopObserving.apply(this,args);}}},stopObserving:function(elementParam,name,observer,useCapture){useCapture=useCapture||false;var element=OpenLayers.Util.getElement(elementParam);var cacheID=element._eventCacheID;if(name=='keypress'){if(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.detachEvent){name='keydown';}} +var foundEntry=false;var elementObservers=OpenLayers.Event.observers[cacheID];if(elementObservers){var i=0;while(!foundEntry&&ithis.duration){this.stop();}},CLASS_NAME:"OpenLayers.Tween"});OpenLayers.Easing={CLASS_NAME:"OpenLayers.Easing"};OpenLayers.Easing.Linear={easeIn:function(t,b,c,d){return c*t/d+b;},easeOut:function(t,b,c,d){return c*t/d+b;},easeInOut:function(t,b,c,d){return c*t/d+b;},CLASS_NAME:"OpenLayers.Easing.Linear"};OpenLayers.Easing.Expo={easeIn:function(t,b,c,d){return(t==0)?b:c*Math.pow(2,10*(t/d-1))+b;},easeOut:function(t,b,c,d){return(t==d)?b+c:c*(-Math.pow(2,-10*t/d)+1)+b;},easeInOut:function(t,b,c,d){if(t==0)return b;if(t==d)return b+c;if((t/=d/2)<1)return c/2*Math.pow(2,10*(t-1))+b;return c/2*(-Math.pow(2,-10*--t)+2)+b;},CLASS_NAME:"OpenLayers.Easing.Expo"};OpenLayers.Easing.Quad={easeIn:function(t,b,c,d){return c*(t/=d)*t+b;},easeOut:function(t,b,c,d){return-c*(t/=d)*(t-2)+b;},easeInOut:function(t,b,c,d){if((t/=d/2)<1)return c/2*t*t+b;return-c/2*((--t)*(t-2)-1)+b;},CLASS_NAME:"OpenLayers.Easing.Quad"};OpenLayers.Map=OpenLayers.Class({Z_INDEX_BASE:{BaseLayer:100,Overlay:325,Feature:725,Popup:750,Control:1000},EVENT_TYPES:["preaddlayer","addlayer","preremovelayer","removelayer","changelayer","movestart","move","moveend","zoomend","popupopen","popupclose","addmarker","removemarker","clearmarkers","mouseover","mouseout","mousemove","dragstart","drag","dragend","changebaselayer"],id:null,fractionalZoom:false,events:null,allOverlays:false,div:null,dragging:false,size:null,viewPortDiv:null,layerContainerOrigin:null,layerContainerDiv:null,layers:null,controls:null,popups:null,baseLayer:null,center:null,resolution:null,zoom:0,panRatio:1.5,viewRequestID:0,tileSize:null,projection:"EPSG:4326",units:'degrees',resolutions:null,maxResolution:1.40625,minResolution:null,maxScale:null,minScale:null,maxExtent:null,minExtent:null,restrictedExtent:null,numZoomLevels:16,theme:null,displayProjection:null,fallThrough:true,panTween:null,eventListeners:null,panMethod:OpenLayers.Easing.Expo.easeOut,panDuration:50,paddingForPopups:null,minPx:null,maxPx:null,initialize:function(div,options){if(arguments.length===1&&typeof div==="object"){options=div;div=options&&options.div;} +this.tileSize=new OpenLayers.Size(OpenLayers.Map.TILE_WIDTH,OpenLayers.Map.TILE_HEIGHT);this.maxExtent=new OpenLayers.Bounds(-180,-90,180,90);this.paddingForPopups=new OpenLayers.Bounds(15,15,15,15);this.theme=OpenLayers._getScriptLocation()+'theme/default/style.css';OpenLayers.Util.extend(this,options);this.layers=[];this.id=OpenLayers.Util.createUniqueID("OpenLayers.Map_");this.div=OpenLayers.Util.getElement(div);if(!this.div){this.div=document.createElement("div");this.div.style.height="1px";this.div.style.width="1px";} +OpenLayers.Element.addClass(this.div,'olMap');var id=this.id+"_OpenLayers_ViewPort";this.viewPortDiv=OpenLayers.Util.createDiv(id,null,null,null,"relative",null,"hidden");this.viewPortDiv.style.width="100%";this.viewPortDiv.style.height="100%";this.viewPortDiv.className="olMapViewport";this.div.appendChild(this.viewPortDiv);var eventsDiv=document.createElement("div");eventsDiv.id=this.id+"_events";eventsDiv.style.position="absolute";eventsDiv.style.width="100%";eventsDiv.style.height="100%";eventsDiv.style.zIndex=this.Z_INDEX_BASE.Control-1;this.viewPortDiv.appendChild(eventsDiv);this.eventsDiv=eventsDiv;this.events=new OpenLayers.Events(this,this.eventsDiv,this.EVENT_TYPES,this.fallThrough,{includeXY:true});id=this.id+"_OpenLayers_Container";this.layerContainerDiv=OpenLayers.Util.createDiv(id);this.layerContainerDiv.style.zIndex=this.Z_INDEX_BASE['Popup']-1;this.eventsDiv.appendChild(this.layerContainerDiv);this.updateSize();if(this.eventListeners instanceof Object){this.events.on(this.eventListeners);} +this.events.register("movestart",this,this.updateSize);if(OpenLayers.String.contains(navigator.appName,"Microsoft")){this.events.register("resize",this,this.updateSize);}else{this.updateSizeDestroy=OpenLayers.Function.bind(this.updateSize,this);OpenLayers.Event.observe(window,'resize',this.updateSizeDestroy);} +if(this.theme){var addNode=true;var nodes=document.getElementsByTagName('link');for(var i=0,len=nodes.length;i=0;--i){this.controls[i].destroy();} +this.controls=null;} +if(this.layers!=null){for(var i=this.layers.length-1;i>=0;--i){this.layers[i].destroy(false);} +this.layers=null;} +if(this.viewPortDiv){this.div.removeChild(this.viewPortDiv);} +this.viewPortDiv=null;if(this.eventListeners){this.events.un(this.eventListeners);this.eventListeners=null;} +this.events.destroy();this.events=null;},setOptions:function(options){var updatePxExtent=this.minPx&&options.restrictedExtent!=this.restrictedExtent;OpenLayers.Util.extend(this,options);updatePxExtent&&this.moveTo(this.getCachedCenter(),this.zoom,{forceZoomChange:true});},getTileSize:function(){return this.tileSize;},getBy:function(array,property,match){var test=(typeof match.test=="function");var found=OpenLayers.Array.filter(this[array],function(item){return item[property]==match||(test&&match.test(item[property]));});return found;},getLayersBy:function(property,match){return this.getBy("layers",property,match);},getLayersByName:function(match){return this.getLayersBy("name",match);},getLayersByClass:function(match){return this.getLayersBy("CLASS_NAME",match);},getControlsBy:function(property,match){return this.getBy("controls",property,match);},getControlsByClass:function(match){return this.getControlsBy("CLASS_NAME",match);},getLayer:function(id){var foundLayer=null;for(var i=0,len=this.layers.length;ithis.layers.length){idx=this.layers.length;} +if(base!=idx){this.layers.splice(base,1);this.layers.splice(idx,0,layer);for(var i=0,len=this.layers.length;i=0;--i){this.removePopup(this.popups[i]);}} +popup.map=this;this.popups.push(popup);var popupDiv=popup.draw();if(popupDiv){popupDiv.style.zIndex=this.Z_INDEX_BASE['Popup']+ +this.popups.length;this.layerContainerDiv.appendChild(popupDiv);}},removePopup:function(popup){OpenLayers.Util.removeItem(this.popups,popup);if(popup.div){try{this.layerContainerDiv.removeChild(popup.div);} +catch(e){}} +popup.map=null;},getSize:function(){var size=null;if(this.size!=null){size=this.size.clone();} +return size;},updateSize:function(){var newSize=this.getCurrentSize();if(newSize&&!isNaN(newSize.h)&&!isNaN(newSize.w)){this.events.clearMouseCache();var oldSize=this.getSize();if(oldSize==null){this.size=oldSize=newSize;} +if(!newSize.equals(oldSize)){this.size=newSize;for(var i=0,len=this.layers.length;i=this.minPx.x+xRestriction?Math.round(dx):0;dy=y<=this.maxPx.y-yRestriction&&y>=this.minPx.y+yRestriction?Math.round(dy):0;var minX=this.minPx.x,maxX=this.maxPx.x;if(dx||dy){if(!this.dragging){this.dragging=true;this.events.triggerEvent("movestart");} +this.center=null;if(dx){this.layerContainerDiv.style.left=parseInt(this.layerContainerDiv.style.left)-dx+"px";this.minPx.x-=dx;this.maxPx.x-=dx;if(wrapDateLine){if(this.maxPx.x>maxX){this.maxPx.x-=(maxX-minX);} +if(this.minPx.xthis.restrictedExtent.getWidth()){lonlat=new OpenLayers.LonLat(maxCenter.lon,lonlat.lat);}else if(extent.leftthis.restrictedExtent.right){lonlat=lonlat.add(this.restrictedExtent.right- +extent.right,0);} +if(extent.getHeight()>this.restrictedExtent.getHeight()){lonlat=new OpenLayers.LonLat(lonlat.lon,maxCenter.lat);}else if(extent.bottomthis.restrictedExtent.top){lonlat=lonlat.add(0,this.restrictedExtent.top- +extent.top);}}} +var zoomChanged=forceZoomChange||((this.isValidZoomLevel(zoom))&&(zoom!=this.getZoom()));var centerChanged=(this.isValidLonLat(lonlat))&&(!lonlat.equals(this.center));if(zoomChanged||centerChanged||dragging){dragging||this.events.triggerEvent("movestart");if(centerChanged){if(!zoomChanged&&this.center){this.centerLayerContainer(lonlat);} +this.center=lonlat.clone();} +var res=zoomChanged?this.getResolutionForZoom(zoom):this.getResolution();if(zoomChanged||this.layerContainerOrigin==null){this.layerContainerOrigin=this.getCachedCenter();this.layerContainerDiv.style.left="0px";this.layerContainerDiv.style.top="0px";var maxExtent=this.getMaxExtent({restricted:true});var maxExtentCenter=maxExtent.getCenterLonLat();var lonDelta=this.center.lon-maxExtentCenter.lon;var latDelta=maxExtentCenter.lat-this.center.lat;var extentWidth=Math.round(maxExtent.getWidth()/res);var extentHeight=Math.round(maxExtent.getHeight()/res);var left=(this.size.w-extentWidth)/2-lonDelta/res;var top=(this.size.h-extentHeight)/2-latDelta/res;this.minPx=new OpenLayers.Pixel(left,top);this.maxPx=new OpenLayers.Pixel(left+extentWidth,top+extentHeight);} +if(zoomChanged){this.zoom=zoom;this.resolution=res;this.viewRequestID++;} +var bounds=this.getExtent();if(this.baseLayer.visibility){this.baseLayer.moveTo(bounds,zoomChanged,options.dragging);options.dragging||this.baseLayer.events.triggerEvent("moveend",{zoomChanged:zoomChanged});} +bounds=this.baseLayer.getExtent();for(var i=this.layers.length-1;i>=0;--i){var layer=this.layers[i];if(layer!==this.baseLayer&&!layer.isBaseLayer){var inRange=layer.calculateInRange();if(layer.inRange!=inRange){layer.inRange=inRange;if(!inRange){layer.display(false);} +this.events.triggerEvent("changelayer",{layer:layer,property:"visibility"});} +if(inRange&&layer.visibility){layer.moveTo(bounds,zoomChanged,options.dragging);options.dragging||layer.events.triggerEvent("moveend",{zoomChanged:zoomChanged});}}} +this.events.triggerEvent("move");dragging||this.events.triggerEvent("moveend");if(zoomChanged){for(var i=0,len=this.popups.length;i=0)&&(zoomLevel0){resolution=this.layers[0].getResolution();} +return resolution;},getUnits:function(){var units=null;if(this.baseLayer!=null){units=this.baseLayer.units;} +return units;},getScale:function(){var scale=null;if(this.baseLayer!=null){var res=this.getResolution();var units=this.baseLayer.units;scale=OpenLayers.Util.getScaleFromResolution(res,units);} +return scale;},getZoomForExtent:function(bounds,closest){var zoom=null;if(this.baseLayer!=null){zoom=this.baseLayer.getZoomForExtent(bounds,closest);} +return zoom;},getResolutionForZoom:function(zoom){var resolution=null;if(this.baseLayer){resolution=this.baseLayer.getResolutionForZoom(zoom);} +return resolution;},getZoomForResolution:function(resolution,closest){var zoom=null;if(this.baseLayer!=null){zoom=this.baseLayer.getZoomForResolution(resolution,closest);} +return zoom;},zoomTo:function(zoom){if(this.isValidZoomLevel(zoom)){this.setCenter(null,zoom);}},zoomIn:function(){this.zoomTo(this.getZoom()+1);},zoomOut:function(){this.zoomTo(this.getZoom()-1);},zoomToExtent:function(bounds,closest){var center=bounds.getCenterLonLat();if(this.baseLayer.wrapDateLine){var maxExtent=this.getMaxExtent();bounds=bounds.clone();while(bounds.right=0){this.initResolutions();if(reinitialize&&this.map.baseLayer===this){this.map.setCenter(this.map.getCenter(),this.map.getZoomForResolution(resolution),false,true);this.map.events.triggerEvent("changebaselayer",{layer:this});} +break;}}}},onMapResize:function(){},redraw:function(){var redrawn=false;if(this.map){this.inRange=this.calculateInRange();var extent=this.getExtent();if(extent&&this.inRange&&this.visibility){var zoomChanged=true;this.moveTo(extent,zoomChanged,false);this.events.triggerEvent("moveend",{"zoomChanged":zoomChanged});redrawn=true;}} +return redrawn;},moveTo:function(bounds,zoomChanged,dragging){var display=this.visibility;if(!this.isBaseLayer){display=display&&this.inRange;} +this.display(display);},moveByPx:function(dx,dy){},setMap:function(map){if(this.map==null){this.map=map;this.maxExtent=this.maxExtent||this.map.maxExtent;this.minExtent=this.minExtent||this.map.minExtent;this.projection=this.projection||this.map.projection;if(typeof this.projection=="string"){this.projection=new OpenLayers.Projection(this.projection);} +this.units=this.projection.getUnits()||this.units||this.map.units;this.initResolutions();if(!this.isBaseLayer){this.inRange=this.calculateInRange();var show=((this.visibility)&&(this.inRange));this.div.style.display=show?"":"none";} +this.setTileSize();}},afterAdd:function(){},removeMap:function(map){},getImageSize:function(bounds){return(this.imageSize||this.tileSize);},setTileSize:function(size){var tileSize=(size)?size:((this.tileSize)?this.tileSize:this.map.getTileSize());this.tileSize=tileSize;if(this.gutter){this.imageOffset=new OpenLayers.Pixel(-this.gutter,-this.gutter);this.imageSize=new OpenLayers.Size(tileSize.w+(2*this.gutter),tileSize.h+(2*this.gutter));}},getVisibility:function(){return this.visibility;},setVisibility:function(visibility){if(visibility!=this.visibility){this.visibility=visibility;this.display(visibility);this.redraw();if(this.map!=null){this.map.events.triggerEvent("changelayer",{layer:this,property:"visibility"});} +this.events.triggerEvent("visibilitychanged");}},display:function(display){if(display!=(this.div.style.display!="none")){this.div.style.display=(display&&this.calculateInRange())?"block":"none";}},calculateInRange:function(){var inRange=false;if(this.alwaysInRange){inRange=true;}else{if(this.map){var resolution=this.map.getResolution();inRange=((resolution>=this.minResolution)&&(resolution<=this.maxResolution));}} +return inRange;},setIsBaseLayer:function(isBaseLayer){if(isBaseLayer!=this.isBaseLayer){this.isBaseLayer=isBaseLayer;if(this.map!=null){this.map.events.triggerEvent("changebaselayer",{layer:this});}}},initResolutions:function(){var i,len,p;var props={},alwaysInRange=true;for(i=0,len=this.RESOLUTION_PROPERTIES.length;i=resolution){highRes=res;lowZoom=i;} +if(res<=resolution){lowRes=res;highZoom=i;break;}} +var dRes=highRes-lowRes;if(dRes>0){zoom=lowZoom+((highRes-resolution)/dRes);}else{zoom=lowZoom;}}else{var diff;var minDiff=Number.POSITIVE_INFINITY;for(i=0,len=this.resolutions.length;iminDiff){break;} +minDiff=diff;}else{if(this.resolutions[i]0)){if(this.map.baseLayer){var layer=this.map.baseLayer.clone();this.layers=[layer];}else{this.map.events.register("changebaselayer",this,this.baseLayerDraw);return this.div;}} +this.element=document.createElement('div');this.element.className=this.displayClass+'Element';this.element.style.display='none';this.mapDiv=document.createElement('div');this.mapDiv.style.width=this.size.w+'px';this.mapDiv.style.height=this.size.h+'px';this.mapDiv.style.position='relative';this.mapDiv.style.overflow='hidden';this.mapDiv.id=OpenLayers.Util.createUniqueID('overviewMap');this.extentRectangle=document.createElement('div');this.extentRectangle.style.position='absolute';this.extentRectangle.style.zIndex=1000;this.extentRectangle.className=this.displayClass+'ExtentRectangle';this.element.appendChild(this.mapDiv);this.div.appendChild(this.element);if(!this.outsideViewport){this.div.className+=" "+this.displayClass+'Container';var imgLocation=OpenLayers.Util.getImagesLocation();var img=imgLocation+'layer-switcher-maximize.png';this.maximizeDiv=OpenLayers.Util.createAlphaImageDiv(this.displayClass+'MaximizeButton',null,new OpenLayers.Size(18,18),img,'absolute');this.maximizeDiv.style.display='none';this.maximizeDiv.className=this.displayClass+'MaximizeButton';OpenLayers.Event.observe(this.maximizeDiv,'click',OpenLayers.Function.bindAsEventListener(this.maximizeControl,this));this.div.appendChild(this.maximizeDiv);var img=imgLocation+'layer-switcher-minimize.png';this.minimizeDiv=OpenLayers.Util.createAlphaImageDiv('OpenLayers_Control_minimizeDiv',null,new OpenLayers.Size(18,18),img,'absolute');this.minimizeDiv.style.display='none';this.minimizeDiv.className=this.displayClass+'MinimizeButton';OpenLayers.Event.observe(this.minimizeDiv,'click',OpenLayers.Function.bindAsEventListener(this.minimizeControl,this));this.div.appendChild(this.minimizeDiv);var eventsToStop=['dblclick','mousedown'];for(var i=0,len=eventsToStop.length;ithis.minRatio)&&(resRatio<=this.maxRatio)&&(this.ovmap.getExtent().containsBounds(testExtent)));},updateOverview:function(){var mapRes=this.map.getResolution();var targetRes=this.ovmap.getResolution();var resRatio=targetRes/mapRes;if(resRatio>this.maxRatio){targetRes=this.minRatio*mapRes;}else if(resRatio<=this.minRatio){targetRes=this.maxRatio*mapRes;} +var center;if(this.ovmap.getProjection()!=this.map.getProjection()){center=this.map.center.clone();center.transform(this.map.getProjectionObject(),this.ovmap.getProjectionObject());}else{center=this.map.center;} +this.ovmap.setCenter(center,this.ovmap.getZoomForResolution(targetRes*this.resolutionFactor));this.updateRectToMap();},createMap:function(){var options=OpenLayers.Util.extend({controls:[],maxResolution:'auto',fallThrough:false},this.mapOptions);this.ovmap=new OpenLayers.Map(this.mapDiv,options);this.ovmap.eventsDiv.appendChild(this.extentRectangle);OpenLayers.Event.stopObserving(window,'unload',this.ovmap.unloadDestroy);this.ovmap.addLayers(this.layers);this.ovmap.zoomToMaxExtent();this.wComp=parseInt(OpenLayers.Element.getStyle(this.extentRectangle,'border-left-width'))+ +parseInt(OpenLayers.Element.getStyle(this.extentRectangle,'border-right-width'));this.wComp=(this.wComp)?this.wComp:2;this.hComp=parseInt(OpenLayers.Element.getStyle(this.extentRectangle,'border-top-width'))+ +parseInt(OpenLayers.Element.getStyle(this.extentRectangle,'border-bottom-width'));this.hComp=(this.hComp)?this.hComp:2;this.handlers.drag=new OpenLayers.Handler.Drag(this,{move:this.rectDrag,done:this.updateMapToRect},{map:this.ovmap});this.handlers.click=new OpenLayers.Handler.Click(this,{"click":this.mapDivClick},{"single":true,"double":false,"stopSingle":true,"stopDouble":true,"pixelTolerance":1,map:this.ovmap});this.handlers.click.activate();this.rectEvents=new OpenLayers.Events(this,this.extentRectangle,null,true);this.rectEvents.register("mouseover",this,function(e){if(!this.handlers.drag.active&&!this.map.dragging){this.handlers.drag.activate();}});this.rectEvents.register("mouseout",this,function(e){if(!this.handlers.drag.dragging){this.handlers.drag.deactivate();}});if(this.ovmap.getProjection()!=this.map.getProjection()){var sourceUnits=this.map.getProjectionObject().getUnits()||this.map.units||this.map.baseLayer.units;var targetUnits=this.ovmap.getProjectionObject().getUnits()||this.ovmap.units||this.ovmap.baseLayer.units;this.resolutionFactor=sourceUnits&&targetUnits?OpenLayers.INCHES_PER_UNIT[sourceUnits]/OpenLayers.INCHES_PER_UNIT[targetUnits]:1;}},updateRectToMap:function(){var bounds;if(this.ovmap.getProjection()!=this.map.getProjection()){bounds=this.map.getExtent().transform(this.map.getProjectionObject(),this.ovmap.getProjectionObject());}else{bounds=this.map.getExtent();} +var pxBounds=this.getRectBoundsFromMapBounds(bounds);if(pxBounds){this.setRectPxBounds(pxBounds);}},updateMapToRect:function(){var lonLatBounds=this.getMapBoundsFromRectBounds(this.rectPxBounds);if(this.ovmap.getProjection()!=this.map.getProjection()){lonLatBounds=lonLatBounds.transform(this.ovmap.getProjectionObject(),this.map.getProjectionObject());} +this.map.panTo(lonLatBounds.getCenterLonLat());},setRectPxBounds:function(pxBounds){var top=Math.max(pxBounds.top,0);var left=Math.max(pxBounds.left,0);var bottom=Math.min(pxBounds.top+Math.abs(pxBounds.getHeight()),this.ovmap.size.h-this.hComp);var right=Math.min(pxBounds.left+pxBounds.getWidth(),this.ovmap.size.w-this.wComp);var width=Math.max(right-left,0);var height=Math.max(bottom-top,0);if(width0){text=text.substring(index);} +var node=OpenLayers.Util.Try(OpenLayers.Function.bind((function(){var xmldom;if(window.ActiveXObject&&!this.xmldom){xmldom=new ActiveXObject("Microsoft.XMLDOM");}else{xmldom=this.xmldom;} +xmldom.loadXML(text);return xmldom;}),this),function(){return new DOMParser().parseFromString(text,'text/xml');},function(){var req=new XMLHttpRequest();req.open("GET","data:"+"text/xml"+";charset=utf-8,"+encodeURIComponent(text),false);if(req.overrideMimeType){req.overrideMimeType("text/xml");} +req.send(null);return req.responseXML;});if(this.keepData){this.data=node;} +return node;},write:function(node){var data;if(this.xmldom){data=node.xml;}else{var serializer=new XMLSerializer();if(node.nodeType==1){var doc=document.implementation.createDocument("","",null);if(doc.importNode){node=doc.importNode(node,true);} +doc.appendChild(node);data=serializer.serializeToString(doc);}else{data=serializer.serializeToString(node);}} +return data;},createElementNS:function(uri,name){var element;if(this.xmldom){if(typeof uri=="string"){element=this.xmldom.createNode(1,name,uri);}else{element=this.xmldom.createNode(1,name,"");}}else{element=document.createElementNS(uri,name);} +return element;},createTextNode:function(text){var node;if(typeof text!=="string"){text=String(text);} +if(this.xmldom){node=this.xmldom.createTextNode(text);}else{node=document.createTextNode(text);} +return node;},getElementsByTagNameNS:function(node,uri,name){var elements=[];if(node.getElementsByTagNameNS){elements=node.getElementsByTagNameNS(uri,name);}else{var allNodes=node.getElementsByTagName("*");var potentialNode,fullName;for(var i=0,len=allNodes.length;i0){prefix=name.substring(0,split);local=name.substring(split+1);}else{if(parent){prefix=this.namespaceAlias[parent.namespaceURI];}else{prefix=this.defaultPrefix;} +local=name;} +var child=this.writers[prefix][local].apply(this,[obj]);if(parent){parent.appendChild(child);} +return child;},getChildEl:function(node,name,uri){return node&&this.getThisOrNextEl(node.firstChild,name,uri);},getNextEl:function(node,name,uri){return node&&this.getThisOrNextEl(node.nextSibling,name,uri);},getThisOrNextEl:function(node,name,uri){outer:for(var sibling=node;sibling;sibling=sibling.nextSibling){switch(sibling.nodeType){case 1:if((!name||name===(sibling.localName||sibling.nodeName.split(":").pop()))&&(!uri||uri===sibling.namespaceURI)){break outer;} +sibling=null;break outer;case 3:if(/^\s*$/.test(sibling.nodeValue)){break;} +case 4:case 6:case 12:case 10:case 11:sibling=null;break outer;}} +return sibling||null;},lookupNamespaceURI:function(node,prefix){var uri=null;if(node){if(node.lookupNamespaceURI){uri=node.lookupNamespaceURI(prefix);}else{outer:switch(node.nodeType){case 1:if(node.namespaceURI!==null&&node.prefix===prefix){uri=node.namespaceURI;break outer;} +var len=node.attributes.length;if(len){var attr;for(var i=0;i0){appliedRules=true;for(var i=0,len=elseRules.length;i0&&appliedRules==false){style.display="none";} +if(style.label&&typeof style.label!=="string"){style.label=String(style.label);} +return style;},applySymbolizer:function(rule,style,feature){var symbolizerPrefix=feature.geometry?this.getSymbolizerPrefix(feature.geometry):OpenLayers.Style.SYMBOLIZER_PREFIXES[0];var symbolizer=rule.symbolizer[symbolizerPrefix]||rule.symbolizer;if(this.defaultsPerSymbolizer===true){var defaults=this.defaultStyle;OpenLayers.Util.applyDefaults(symbolizer,{pointRadius:defaults.pointRadius});if(symbolizer.stroke===true||symbolizer.graphic===true){OpenLayers.Util.applyDefaults(symbolizer,{strokeWidth:defaults.strokeWidth,strokeColor:defaults.strokeColor,strokeOpacity:defaults.strokeOpacity,strokeDashstyle:defaults.strokeDashstyle,strokeLinecap:defaults.strokeLinecap});} +if(symbolizer.fill===true||symbolizer.graphic===true){OpenLayers.Util.applyDefaults(symbolizer,{fillColor:defaults.fillColor,fillOpacity:defaults.fillOpacity});} +if(symbolizer.graphic===true){OpenLayers.Util.applyDefaults(symbolizer,{pointRadius:this.defaultStyle.pointRadius,externalGraphic:this.defaultStyle.externalGraphic,graphicName:this.defaultStyle.graphicName,graphicOpacity:this.defaultStyle.graphicOpacity,graphicWidth:this.defaultStyle.graphicWidth,graphicHeight:this.defaultStyle.graphicHeight,graphicXOffset:this.defaultStyle.graphicXOffset,graphicYOffset:this.defaultStyle.graphicYOffset});}} +return this.createLiterals(OpenLayers.Util.extend(style,symbolizer),feature);},createLiterals:function(style,feature){var context=OpenLayers.Util.extend({},feature.attributes||feature.data);OpenLayers.Util.extend(context,this.context);for(var i in this.propertyStyles){style[i]=OpenLayers.Style.createLiteral(style[i],context,feature,i);} +return style;},findPropertyStyles:function(){var propertyStyles={};var style=this.defaultStyle;this.addPropertyStyles(propertyStyles,style);var rules=this.rules;var symbolizer,value;for(var i=0,len=rules.length;ithis.value;break;case OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO:result=got<=this.value;break;case OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO:result=got>=this.value;break;case OpenLayers.Filter.Comparison.BETWEEN:result=(got>=this.lowerBoundary)&&(got<=this.upperBoundary);break;case OpenLayers.Filter.Comparison.LIKE:var regexp=new RegExp(this.value,"gi");result=regexp.test(got);break;} +return result;},value2regex:function(wildCard,singleChar,escapeChar){if(wildCard=="."){var msg="'.' is an unsupported wildCard character for "+"OpenLayers.Filter.Comparison";OpenLayers.Console.error(msg);return null;} +wildCard=wildCard?wildCard:"*";singleChar=singleChar?singleChar:".";escapeChar=escapeChar?escapeChar:"!";this.value=this.value.replace(new RegExp("\\"+escapeChar+"(.|$)","g"),"\\$1");this.value=this.value.replace(new RegExp("\\"+singleChar,"g"),".");this.value=this.value.replace(new RegExp("\\"+wildCard,"g"),".*");this.value=this.value.replace(new RegExp("\\\\.\\*","g"),"\\"+wildCard);this.value=this.value.replace(new RegExp("\\\\\\.","g"),"\\"+singleChar);return this.value;},regex2value:function(){var value=this.value;value=value.replace(/!/g,"!!");value=value.replace(/(\\)?\\\./g,function($0,$1){return $1?$0:"!.";});value=value.replace(/(\\)?\\\*/g,function($0,$1){return $1?$0:"!*";});value=value.replace(/\\\\/g,"\\");value=value.replace(/\.\*/g,"*");return value;},clone:function(){return OpenLayers.Util.extend(new OpenLayers.Filter.Comparison(),this);},CLASS_NAME:"OpenLayers.Filter.Comparison"});OpenLayers.Filter.Comparison.EQUAL_TO="==";OpenLayers.Filter.Comparison.NOT_EQUAL_TO="!=";OpenLayers.Filter.Comparison.LESS_THAN="<";OpenLayers.Filter.Comparison.GREATER_THAN=">";OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO="<=";OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO=">=";OpenLayers.Filter.Comparison.BETWEEN="..";OpenLayers.Filter.Comparison.LIKE="~";OpenLayers.Format.Filter=OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC,{defaultVersion:"1.0.0",CLASS_NAME:"OpenLayers.Format.Filter"});OpenLayers.Filter.Function=OpenLayers.Class(OpenLayers.Filter,{name:null,params:null,initialize:function(options){OpenLayers.Filter.prototype.initialize.apply(this,[options]);},CLASS_NAME:"OpenLayers.Filter.Function"});OpenLayers.Format.Filter.v1=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{ogc:"http://www.opengis.net/ogc",gml:"http://www.opengis.net/gml",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},defaultPrefix:"ogc",schemaLocation:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){var obj={};this.readers.ogc["Filter"].apply(this,[data,obj]);return obj.filter;},readers:{"ogc":{"Filter":function(node,parent){var obj={fids:[],filters:[]};this.readChildNodes(node,obj);if(obj.fids.length>0){parent.filter=new OpenLayers.Filter.FeatureId({fids:obj.fids});}else if(obj.filters.length>0){parent.filter=obj.filters[0];}},"FeatureId":function(node,obj){var fid=node.getAttribute("fid");if(fid){obj.fids.push(fid);}},"And":function(node,obj){var filter=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.AND});this.readChildNodes(node,filter);obj.filters.push(filter);},"Or":function(node,obj){var filter=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.OR});this.readChildNodes(node,filter);obj.filters.push(filter);},"Not":function(node,obj){var filter=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.NOT});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsLessThan":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.LESS_THAN});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsGreaterThan":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.GREATER_THAN});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsLessThanOrEqualTo":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsGreaterThanOrEqualTo":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsBetween":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.BETWEEN});this.readChildNodes(node,filter);obj.filters.push(filter);},"Literal":function(node,obj){obj.value=OpenLayers.String.numericIf(this.getChildValue(node));},"PropertyName":function(node,filter){filter.property=this.getChildValue(node);},"LowerBoundary":function(node,filter){filter.lowerBoundary=OpenLayers.String.numericIf(this.readOgcExpression(node));},"UpperBoundary":function(node,filter){filter.upperBoundary=OpenLayers.String.numericIf(this.readOgcExpression(node));},"Intersects":function(node,obj){this.readSpatial(node,obj,OpenLayers.Filter.Spatial.INTERSECTS);},"Within":function(node,obj){this.readSpatial(node,obj,OpenLayers.Filter.Spatial.WITHIN);},"Contains":function(node,obj){this.readSpatial(node,obj,OpenLayers.Filter.Spatial.CONTAINS);},"DWithin":function(node,obj){this.readSpatial(node,obj,OpenLayers.Filter.Spatial.DWITHIN);},"Distance":function(node,obj){obj.distance=parseInt(this.getChildValue(node));obj.distanceUnits=node.getAttribute("units");},"Function":function(node,obj){return;}}},readSpatial:function(node,obj,type){var filter=new OpenLayers.Filter.Spatial({type:type});this.readChildNodes(node,filter);filter.value=filter.components[0];delete filter.components;obj.filters.push(filter);},readOgcExpression:function(node){var obj={};this.readChildNodes(node,obj);var value=obj.value;if(value===undefined){value=this.getChildValue(node);} +return value;},writeOgcExpression:function(value,node){if(value instanceof OpenLayers.Filter.Function){var child=this.writeNode("Function",value,node);node.appendChild(child);}else{this.writeNode("Literal",value,node);} +return node;},write:function(filter){return this.writers.ogc["Filter"].apply(this,[filter]);},writeFeatureIdNodes:function(filter,node){for(var i=0,ii=filter.fids.length;i":"PropertyIsGreaterThan","<=":"PropertyIsLessThanOrEqualTo",">=":"PropertyIsGreaterThanOrEqualTo","..":"PropertyIsBetween","~":"PropertyIsLike","BBOX":"BBOX","DWITHIN":"DWITHIN","WITHIN":"WITHIN","CONTAINS":"CONTAINS","INTERSECTS":"INTERSECTS","FID":"FeatureId"},CLASS_NAME:"OpenLayers.Format.Filter.v1"});OpenLayers.Geometry=OpenLayers.Class({id:null,parent:null,bounds:null,initialize:function(){this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){this.id=null;this.bounds=null;},clone:function(){return new OpenLayers.Geometry();},setBounds:function(bounds){if(bounds){this.bounds=bounds.clone();}},clearBounds:function(){this.bounds=null;if(this.parent){this.parent.clearBounds();}},extendBounds:function(newBounds){var bounds=this.getBounds();if(!bounds){this.setBounds(newBounds);}else{this.bounds.extend(newBounds);}},getBounds:function(){if(this.bounds==null){this.calculateBounds();} +return this.bounds;},calculateBounds:function(){},distanceTo:function(geometry,options){},getVertices:function(nodes){},atPoint:function(lonlat,toleranceLon,toleranceLat){var atPoint=false;var bounds=this.getBounds();if((bounds!=null)&&(lonlat!=null)){var dX=(toleranceLon!=null)?toleranceLon:0;var dY=(toleranceLat!=null)?toleranceLat:0;var toleranceBounds=new OpenLayers.Bounds(this.bounds.left-dX,this.bounds.bottom-dY,this.bounds.right+dX,this.bounds.top+dY);atPoint=toleranceBounds.containsLonLat(lonlat);} +return atPoint;},getLength:function(){return 0.0;},getArea:function(){return 0.0;},getCentroid:function(){return null;},toString:function(){return OpenLayers.Format.WKT.prototype.write(new OpenLayers.Feature.Vector(this));},CLASS_NAME:"OpenLayers.Geometry"});OpenLayers.Geometry.fromWKT=function(wkt){var format=arguments.callee.format;if(!format){format=new OpenLayers.Format.WKT();arguments.callee.format=format;} +var geom;var result=format.read(wkt);if(result instanceof OpenLayers.Feature.Vector){geom=result.geometry;}else if(OpenLayers.Util.isArray(result)){var len=result.length;var components=new Array(len);for(var i=0;i=0&&along1<=1&&along2>=0&&along2<=1){if(!point){intersection=true;}else{var x=seg1.x1+(along1*x12_11);var y=seg1.y1+(along1*y12_11);intersection=new OpenLayers.Geometry.Point(x,y);}}} +if(tolerance){var dist;if(intersection){if(point){var segs=[seg1,seg2];var seg,x,y;outer:for(var i=0;i<2;++i){seg=segs[i];for(var j=1;j<3;++j){x=seg["x"+j];y=seg["y"+j];dist=Math.sqrt(Math.pow(x-intersection.x,2)+ +Math.pow(y-intersection.y,2));if(dist=1.0){x=x2;y=y2;}else{x=x1+along*dx;y=y1+along*dy;} +return{distance:Math.sqrt(Math.pow(x-x0,2)+Math.pow(y-y0,2)),x:x,y:y};};OpenLayers.Geometry.Point=OpenLayers.Class(OpenLayers.Geometry,{x:null,y:null,initialize:function(x,y){OpenLayers.Geometry.prototype.initialize.apply(this,arguments);this.x=parseFloat(x);this.y=parseFloat(y);},clone:function(obj){if(obj==null){obj=new OpenLayers.Geometry.Point(this.x,this.y);} +OpenLayers.Util.applyDefaults(obj,this);return obj;},calculateBounds:function(){this.bounds=new OpenLayers.Bounds(this.x,this.y,this.x,this.y);},distanceTo:function(geometry,options){var edge=!(options&&options.edge===false);var details=edge&&options&&options.details;var distance,x0,y0,x1,y1,result;if(geometry instanceof OpenLayers.Geometry.Point){x0=this.x;y0=this.y;x1=geometry.x;y1=geometry.y;distance=Math.sqrt(Math.pow(x0-x1,2)+Math.pow(y0-y1,2));result=!details?distance:{x0:x0,y0:y0,x1:x1,y1:y1,distance:distance};}else{result=geometry.distanceTo(this,options);if(details){result={x0:result.x1,y0:result.y1,x1:result.x0,y1:result.y0,distance:result.distance};}} +return result;},equals:function(geom){var equals=false;if(geom!=null){equals=((this.x==geom.x&&this.y==geom.y)||(isNaN(this.x)&&isNaN(this.y)&&isNaN(geom.x)&&isNaN(geom.y)));} +return equals;},toShortString:function(){return(this.x+", "+this.y);},move:function(x,y){this.x=this.x+x;this.y=this.y+y;this.clearBounds();},rotate:function(angle,origin){angle*=Math.PI/180;var radius=this.distanceTo(origin);var theta=angle+Math.atan2(this.y-origin.y,this.x-origin.x);this.x=origin.x+(radius*Math.cos(theta));this.y=origin.y+(radius*Math.sin(theta));this.clearBounds();},getCentroid:function(){return new OpenLayers.Geometry.Point(this.x,this.y);},resize:function(scale,origin,ratio){ratio=(ratio==undefined)?1:ratio;this.x=origin.x+(scale*ratio*(this.x-origin.x));this.y=origin.y+(scale*(this.y-origin.y));this.clearBounds();return this;},intersects:function(geometry){var intersect=false;if(geometry.CLASS_NAME=="OpenLayers.Geometry.Point"){intersect=this.equals(geometry);}else{intersect=geometry.intersects(this);} +return intersect;},transform:function(source,dest){if((source&&dest)){OpenLayers.Projection.transform(this,source,dest);this.bounds=null;} +return this;},getVertices:function(nodes){return[this];},CLASS_NAME:"OpenLayers.Geometry.Point"});OpenLayers.Geometry.Collection=OpenLayers.Class(OpenLayers.Geometry,{components:null,componentTypes:null,initialize:function(components){OpenLayers.Geometry.prototype.initialize.apply(this,arguments);this.components=[];if(components!=null){this.addComponents(components);}},destroy:function(){this.components.length=0;this.components=null;OpenLayers.Geometry.prototype.destroy.apply(this,arguments);},clone:function(){var geometry=eval("new "+this.CLASS_NAME+"()");for(var i=0,len=this.components.length;i-1)){if(index!=null&&(index=0;--i){removed=this.removeComponent(components[i])||removed;} +return removed;},removeComponent:function(component){OpenLayers.Util.removeItem(this.components,component);this.clearBounds();return true;},getLength:function(){var length=0.0;for(var i=0,len=this.components.length;i0)?area:minArea;centroids.push(centroid);} +len=areas.length;if(areaSum===0){for(var i=0;i1)){for(var i=1,len=this.components.length;i1)){var p1,p2;for(var i=1,len=geom.components.length;i2);if(removed){OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,arguments);} +return removed;},intersects:function(geometry){var intersect=false;var type=geometry.CLASS_NAME;if(type=="OpenLayers.Geometry.LineString"||type=="OpenLayers.Geometry.LinearRing"||type=="OpenLayers.Geometry.Point"){var segs1=this.getSortedSegments();var segs2;if(type=="OpenLayers.Geometry.Point"){segs2=[{x1:geometry.x,y1:geometry.y,x2:geometry.x,y2:geometry.y}];}else{segs2=geometry.getSortedSegments();} +var seg1,seg1x1,seg1x2,seg1y1,seg1y2,seg2,seg2y1,seg2y2;outer:for(var i=0,len=segs1.length;iseg1x2){break;} +if(seg2.x2Math.max(seg1y1,seg1y2)){continue;} +if(Math.max(seg2y1,seg2y2)0){var xDir=seg.x10){lines.unshift(j,1);Array.prototype.splice.apply(targetParts,lines);j+=lines.length-2;} +if(mutual){for(var k=0,len=splits.points.length;k0&&points.length>0){points.push(vert2.clone());sourceParts.push(new OpenLayers.Geometry.LineString(points));}}else{results=target.splitWith(this,options);} +if(targetParts&&targetParts.length>1){targetSplit=true;}else{targetParts=[];} +if(sourceParts&&sourceParts.length>1){sourceSplit=true;}else{sourceParts=[];} +if(targetSplit||sourceSplit){if(mutual){results=[sourceParts,targetParts];}else{results=targetParts;}} +return results;},splitWith:function(geometry,options){return geometry.split(this,options);},getVertices:function(nodes){var vertices;if(nodes===true){vertices=[this.components[0],this.components[this.components.length-1]];}else if(nodes===false){vertices=this.components.slice(1,this.components.length-1);}else{vertices=this.components.slice();} +return vertices;},distanceTo:function(geometry,options){var edge=!(options&&options.edge===false);var details=edge&&options&&options.details;var result,best={};var min=Number.POSITIVE_INFINITY;if(geometry instanceof OpenLayers.Geometry.Point){var segs=this.getSortedSegments();var x=geometry.x;var y=geometry.y;var seg;for(var i=0,len=segs.length;ix&&((y>seg.y1&&yseg.y2))){break;}}} +if(details){best={distance:best.distance,x0:best.x,y0:best.y,x1:x,y1:y};}else{best=best.distance;}}else if(geometry instanceof OpenLayers.Geometry.LineString){var segs0=this.getSortedSegments();var segs1=geometry.getSortedSegments();var seg0,seg1,intersection,x0,y0;var len1=segs1.length;var interOptions={point:true};outer:for(var i=0,len=segs0.length;imaxDistance){maxDistance=distance;indexFarthest=index;}} +if(maxDistance>tolerance&&indexFarthest!=firstPoint){pointIndexsToKeep.push(indexFarthest);douglasPeuckerReduction(points,firstPoint,indexFarthest,tolerance);douglasPeuckerReduction(points,indexFarthest,lastPoint,tolerance);}};var perpendicularDistance=function(point1,point2,point){var area=Math.abs(0.5*(point1.x*point2.y+point2.x*point.y+point.x*point1.y-point2.x*point1.y-point.x*point2.y-point1.x*point.y));var bottom=Math.sqrt(Math.pow(point1.x-point2.x,2)+Math.pow(point1.y-point2.y,2));var height=area/bottom*2;return height;};var firstPoint=0;var lastPoint=points.length-1;var pointIndexsToKeep=[];pointIndexsToKeep.push(firstPoint);pointIndexsToKeep.push(lastPoint);while(points[firstPoint].equals(points[lastPoint])){lastPoint--;pointIndexsToKeep.push(lastPoint);} +douglasPeuckerReduction(points,firstPoint,lastPoint,tolerance);var returnPoints=[];pointIndexsToKeep.sort(compareNumbers);for(var index=0;index1){sourceSplit=true;}else{sourceParts=[];} +if(targetParts&&targetParts.length>1){targetSplit=true;}else{targetParts=[];} +if(sourceSplit||targetSplit){if(mutual){results=[sourceParts,targetParts];}else{results=targetParts;}} +return results;},splitWith:function(geometry,options){var results=null;var mutual=options&&options.mutual;var splits,targetLine,sourceLines,sourceSplit,targetSplit,sourceParts,targetParts;if(geometry instanceof OpenLayers.Geometry.LineString){targetParts=[];sourceParts=[geometry];for(var i=0,len=this.components.length;i1){sourceSplit=true;}else{sourceParts=[];} +if(targetParts&&targetParts.length>1){targetSplit=true;}else{targetParts=[];} +if(sourceSplit||targetSplit){if(mutual){results=[sourceParts,targetParts];}else{results=targetParts;}} +return results;},CLASS_NAME:"OpenLayers.Geometry.MultiLineString"});OpenLayers.Geometry.LinearRing=OpenLayers.Class(OpenLayers.Geometry.LineString,{componentTypes:["OpenLayers.Geometry.Point"],initialize:function(points){OpenLayers.Geometry.LineString.prototype.initialize.apply(this,arguments);},addComponent:function(point,index){var added=false;var lastPoint=this.components.pop();if(index!=null||!point.equals(lastPoint)){added=OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,arguments);} +var firstPoint=this.components[0];OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,[firstPoint]);return added;},removeComponent:function(point){var removed=this.components&&(this.components.length>3);if(removed){this.components.pop();OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,arguments);var firstPoint=this.components[0];OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,[firstPoint]);} +return removed;},move:function(x,y){for(var i=0,len=this.components.length;i2)){var sumX=0.0;var sumY=0.0;for(var i=0;i2)){var sum=0.0;for(var i=0,len=this.components.length;i2){var p1,p2;for(var i=0;i=x1&&px<=x2)||x1>=x2&&(px<=x1&&px>=x2)){crosses=-1;break;}} +continue;} +cx=approx(getX(py,x1,y1,x2,y2),digs);if(cx==px){if(y1=y1&&py<=y2)||y1>y2&&(py<=y1&&py>=y2)){crosses=-1;break;}} +if(cx<=px){continue;} +if(x1!=x2&&(cxMath.max(x1,x2))){continue;} +if(y1=y1&&pyy2&&(py=y2)){++crosses;}} +var contained=(crosses==-1)?1:!!(crosses&1);return contained;},intersects:function(geometry){var intersect=false;if(geometry.CLASS_NAME=="OpenLayers.Geometry.Point"){intersect=this.containsPoint(geometry);}else if(geometry.CLASS_NAME=="OpenLayers.Geometry.LineString"){intersect=geometry.intersects(this);}else if(geometry.CLASS_NAME=="OpenLayers.Geometry.LinearRing"){intersect=OpenLayers.Geometry.LineString.prototype.intersects.apply(this,[geometry]);}else{for(var i=0,len=geometry.components.length;i0)){area+=Math.abs(this.components[0].getArea());for(var i=1,len=this.components.length;i0)){area+=Math.abs(this.components[0].getGeodesicArea(projection));for(var i=1,len=this.components.length;i0){contained=this.components[0].containsPoint(point);if(contained!==1){if(contained&&numRings>1){var hole;for(var i=1;i0){parser=this.parseGeometry[type.toLowerCase()];if(parser){geometry=parser.apply(this,[nodeList[0]]);if(this.internalProjection&&this.externalProjection){geometry.transform(this.externalProjection,this.internalProjection);}}else{OpenLayers.Console.error(OpenLayers.i18n("unsupportedGeometryType",{'geomType':type}));} +break;}} +var bounds;var boxNodes=this.getElementsByTagNameNS(node,this.gmlns,"Box");for(i=0;i0){coordString=nodeList[0].firstChild.nodeValue;coordString=coordString.replace(this.regExes.trimSpace,"");coords=coordString.split(this.regExes.splitSpace);} +if(coords.length==0){nodeList=this.getElementsByTagNameNS(node,this.gmlns,"coordinates");if(nodeList.length>0){coordString=nodeList[0].firstChild.nodeValue;coordString=coordString.replace(this.regExes.removeSpace,"");coords=coordString.split(",");}} +if(coords.length==0){nodeList=this.getElementsByTagNameNS(node,this.gmlns,"coord");if(nodeList.length>0){var xList=this.getElementsByTagNameNS(nodeList[0],this.gmlns,"X");var yList=this.getElementsByTagNameNS(nodeList[0],this.gmlns,"Y");if(xList.length>0&&yList.length>0){coords=[xList[0].firstChild.nodeValue,yList[0].firstChild.nodeValue];}}} +if(coords.length==2){coords[2]=null;} +if(this.xy){return new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);} +else{return new OpenLayers.Geometry.Point(coords[1],coords[0],coords[2]);}},multipoint:function(node){var nodeList=this.getElementsByTagNameNS(node,this.gmlns,"Point");var components=[];if(nodeList.length>0){var point;for(var i=0;i0){coordString=this.getChildValue(nodeList[0]);coordString=coordString.replace(this.regExes.trimSpace,"");coords=coordString.split(this.regExes.splitSpace);var dim=parseInt(nodeList[0].getAttribute("dimension"));var j,x,y,z;for(var i=0;i0){coordString=this.getChildValue(nodeList[0]);coordString=coordString.replace(this.regExes.trimSpace,"");coordString=coordString.replace(this.regExes.trimComma,",");var pointList=coordString.split(this.regExes.splitSpace);for(var i=0;i0){var line;for(var i=0;i0){var ring;for(var i=0;i0){var polygon;for(var i=0;i0){var coords=[];if(lpoint.length>0){coordString=lpoint[0].firstChild.nodeValue;coordString=coordString.replace(this.regExes.trimSpace,"");coords=coordString.split(this.regExes.splitSpace);} +if(coords.length==2){coords[2]=null;} +if(this.xy){var lowerPoint=new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}else{var lowerPoint=new OpenLayers.Geometry.Point(coords[1],coords[0],coords[2]);}} +var upoint=this.getElementsByTagNameNS(node,this.gmlns,"upperCorner");if(upoint.length>0){var coords=[];if(upoint.length>0){coordString=upoint[0].firstChild.nodeValue;coordString=coordString.replace(this.regExes.trimSpace,"");coords=coordString.split(this.regExes.splitSpace);} +if(coords.length==2){coords[2]=null;} +if(this.xy){var upperPoint=new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}else{var upperPoint=new OpenLayers.Geometry.Point(coords[1],coords[0],coords[2]);}} +if(lowerPoint&&upperPoint){components.push(new OpenLayers.Geometry.Point(lowerPoint.x,lowerPoint.y));components.push(new OpenLayers.Geometry.Point(upperPoint.x,lowerPoint.y));components.push(new OpenLayers.Geometry.Point(upperPoint.x,upperPoint.y));components.push(new OpenLayers.Geometry.Point(lowerPoint.x,upperPoint.y));components.push(new OpenLayers.Geometry.Point(lowerPoint.x,lowerPoint.y));var ring=new OpenLayers.Geometry.LinearRing(components);envelope=new OpenLayers.Geometry.Polygon([ring]);} +return envelope;},box:function(node){var nodeList=this.getElementsByTagNameNS(node,this.gmlns,"coordinates");var coordString;var coords,beginPoint=null,endPoint=null;if(nodeList.length>0){coordString=nodeList[0].firstChild.nodeValue;coords=coordString.split(" ");if(coords.length==2){beginPoint=coords[0].split(",");endPoint=coords[1].split(",");}} +if(beginPoint!==null&&endPoint!==null){return new OpenLayers.Bounds(parseFloat(beginPoint[0]),parseFloat(beginPoint[1]),parseFloat(endPoint[0]),parseFloat(endPoint[1]));}}},parseAttributes:function(node){var attributes={};var childNode=node.firstChild;var children,i,child,grandchildren,grandchild,name,value;while(childNode){if(childNode.nodeType==1){children=childNode.childNodes;for(i=0;i0){obj.bounds=container.components[0];}},"Point":function(node,container){var obj={points:[]};this.readChildNodes(node,obj);if(!container.components){container.components=[];} +container.components.push(obj.points[0]);},"coordinates":function(node,obj){var str=this.getChildValue(node).replace(this.regExes.trimSpace,"");str=str.replace(this.regExes.trimComma,",");var pointList=str.split(this.regExes.splitSpace);var coords;var numPoints=pointList.length;var points=new Array(numPoints);for(var i=0;i0){container.components=[new OpenLayers.Geometry.MultiLineString(obj.components)];}},"curveMember":function(node,obj){this.readChildNodes(node,obj);},"MultiSurface":function(node,container){var obj={components:[]};this.readChildNodes(node,obj);if(obj.components.length>0){container.components=[new OpenLayers.Geometry.MultiPolygon(obj.components)];}},"surfaceMember":function(node,obj){this.readChildNodes(node,obj);},"surfaceMembers":function(node,obj){this.readChildNodes(node,obj);},"pointMembers":function(node,obj){this.readChildNodes(node,obj);},"lineStringMembers":function(node,obj){this.readChildNodes(node,obj);},"polygonMembers":function(node,obj){this.readChildNodes(node,obj);},"geometryMembers":function(node,obj){this.readChildNodes(node,obj);},"Envelope":function(node,container){var obj={points:new Array(2)};this.readChildNodes(node,obj);if(!container.components){container.components=[];} +var min=obj.points[0];var max=obj.points[1];container.components.push(new OpenLayers.Bounds(min.x,min.y,max.x,max.y));},"lowerCorner":function(node,container){var obj={};this.readers.gml.pos.apply(this,[node,obj]);container.points[0]=obj.points[0];},"upperCorner":function(node,container){var obj={};this.readers.gml.pos.apply(this,[node,obj]);container.points[1]=obj.points[0];}},OpenLayers.Format.GML.Base.prototype.readers["gml"]),"feature":OpenLayers.Format.GML.Base.prototype.readers["feature"],"wfs":OpenLayers.Format.GML.Base.prototype.readers["wfs"]},write:function(features){var name;if(OpenLayers.Util.isArray(features)){name="featureMembers";}else{name="featureMember";} +var root=this.writeNode("gml:"+name,features);this.setAttributeNS(root,this.namespaces["xsi"],"xsi:schemaLocation",this.schemaLocation);return OpenLayers.Format.XML.prototype.write.apply(this,[root]);},writers:{"gml":OpenLayers.Util.applyDefaults({"featureMembers":function(features){var node=this.createElementNSPlus("gml:featureMembers");for(var i=0,len=features.length;i=0;i--){ctl=this.controls[i];if(ctl.events){ctl.events.un({activate:this.iconOn,deactivate:this.iconOff});} +OpenLayers.Event.stopObservingElement(ctl.panel_div);ctl.panel_div=null;} +this.activeState=null;},activate:function(){if(OpenLayers.Control.prototype.activate.apply(this,arguments)){var control;for(var i=0,len=this.controls.length;i=0;i--){this.div.removeChild(this.div.childNodes[i]);} +this.div.innerHTML="";if(this.active){for(var i=0,len=this.controls.length;i=bounds.bottom-tilelat*this.buffer)||rowidx=0)&&(testCell=0)){tile=this.grid[testRow][testCell];} +if((tile!=null)&&(!tile.queued)){tileQueue.unshift(tile);tile.queued=true;directionsTried=0;iRow=testRow;iCell=testCell;}else{direction=(direction+1)%4;directionsTried++;}} +for(var i=0,len=tileQueue.length;i-this.tileSize.w*(buffer-1)){this.shiftColumn(true);}else if(tlViewPort.x<-this.tileSize.w*buffer){this.shiftColumn(false);}else if(tlViewPort.y>-this.tileSize.h*(buffer-1)){this.shiftRow(true);}else if(tlViewPort.y<-this.tileSize.h*buffer){this.shiftRow(false);}else{shifted=false;} +if(shifted){this.timerId=window.setTimeout(this._moveGriddedTiles,0);}},shiftRow:function(prepend){var modelRowIndex=(prepend)?0:(this.grid.length-1);var grid=this.grid;var modelRow=grid[modelRowIndex];var resolution=this.map.getResolution();var deltaY=(prepend)?-this.tileSize.h:this.tileSize.h;var deltaLat=resolution*-deltaY;var row=(prepend)?grid.pop():grid.shift();for(var i=0,len=modelRow.length;irows){var row=this.grid.pop();for(var i=0,l=row.length;icolumns){for(var i=0,l=this.grid.length;ibottomRight.lon){if(topLeft.lon<0){topLeft.lon=-180-(topLeft.lon+180);}else{bottomRight.lon=180+bottomRight.lon+180;}} +var bounds=new OpenLayers.Bounds(topLeft.lon,bottomRight.lat,bottomRight.lon,topLeft.lat);return bounds;},showTile:function(){if(this.shouldDraw){this.show();}},show:function(){},hide:function(){},CLASS_NAME:"OpenLayers.Tile"});OpenLayers.Tile.Image=OpenLayers.Class(OpenLayers.Tile,{url:null,imgDiv:null,frame:null,layerAlphaHack:null,isBackBuffer:false,isFirstDraw:true,backBufferTile:null,maxGetUrlLength:null,initialize:function(layer,position,bounds,url,size,options){OpenLayers.Tile.prototype.initialize.apply(this,arguments);if(this.maxGetUrlLength!=null){OpenLayers.Util.extend(this,OpenLayers.Tile.Image.IFrame);} +this.url=url;this.frame=document.createElement('div');this.frame.style.overflow='hidden';this.frame.style.position='absolute';this.layerAlphaHack=this.layer.alpha&&OpenLayers.Util.alphaHack();},destroy:function(){if(this.imgDiv!=null){this.removeImgDiv();} +this.imgDiv=null;if((this.frame!=null)&&(this.frame.parentNode==this.layer.div)){this.layer.div.removeChild(this.frame);} +this.frame=null;if(this.backBufferTile){this.backBufferTile.destroy();this.backBufferTile=null;} +this.layer.events.unregister("loadend",this,this.resetBackBuffer);OpenLayers.Tile.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Tile.Image(this.layer,this.position,this.bounds,this.url,this.size);} +obj=OpenLayers.Tile.prototype.clone.apply(this,[obj]);obj.imgDiv=null;return obj;},draw:function(){if(this.layer!=this.layer.map.baseLayer&&this.layer.reproject){this.bounds=this.getBoundsFromBaseLayer(this.position);} +var drawTile=OpenLayers.Tile.prototype.draw.apply(this,arguments);if((OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS,this.layer.transitionEffect)!=-1)||this.layer.singleTile){if(drawTile){if(!this.backBufferTile){this.backBufferTile=this.clone();this.backBufferTile.hide();this.backBufferTile.isBackBuffer=true;this.events.register('loadend',this,this.resetBackBuffer);this.layer.events.register("loadend",this,this.resetBackBuffer);} +this.startTransition();}else{if(this.backBufferTile){this.backBufferTile.clear();}}}else{if(drawTile&&this.isFirstDraw){this.events.register('loadend',this,this.showTile);this.isFirstDraw=false;}} +if(!drawTile){return false;} +if(this.isLoading){this.events.triggerEvent("reload");}else{this.isLoading=true;this.events.triggerEvent("loadstart");} +return this.renderTile();},resetBackBuffer:function(){this.showTile();if(this.backBufferTile&&(this.isFirstDraw||!this.layer.numLoadingTiles)){this.isFirstDraw=false;var maxExtent=this.layer.maxExtent;var withinMaxExtent=(maxExtent&&this.bounds.intersectsBounds(maxExtent,false));if(withinMaxExtent){this.backBufferTile.position=this.position;this.backBufferTile.bounds=this.bounds;this.backBufferTile.size=this.size;this.backBufferTile.imageSize=this.layer.getImageSize(this.bounds)||this.size;this.backBufferTile.imageOffset=this.layer.imageOffset;this.backBufferTile.resolution=this.layer.getResolution();this.backBufferTile.renderTile();} +this.backBufferTile.hide();}},renderTile:function(){if(this.layer.async){this.initImgDiv();this.layer.getURLasync(this.bounds,this,"url",this.positionImage);}else{this.url=this.layer.getURL(this.bounds);this.initImgDiv();this.positionImage();} +return true;},positionImage:function(){if(this.layer===null){return;} +OpenLayers.Util.modifyDOMElement(this.frame,null,this.position,this.size);var imageSize=this.layer.getImageSize(this.bounds);if(this.layerAlphaHack){OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv,null,null,imageSize,this.url);}else{OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,imageSize);this.imgDiv.src=this.url;}},clear:function(){if(this.imgDiv){this.hide();if(OpenLayers.Tile.Image.useBlankTile){this.imgDiv.src=OpenLayers.Util.getImagesLocation()+"blank.gif";}}},initImgDiv:function(){if(this.imgDiv==null){var offset=this.layer.imageOffset;var size=this.layer.getImageSize(this.bounds);if(this.layerAlphaHack){this.imgDiv=OpenLayers.Util.createAlphaImageDiv(null,offset,size,null,"relative",null,null,null,true);}else{this.imgDiv=OpenLayers.Util.createImage(null,offset,size,null,"relative",null,null,true);} +if(OpenLayers.Util.isArray(this.layer.url)){this.imgDiv.urls=this.layer.url.slice();} +this.imgDiv.className='olTileImage';this.frame.style.zIndex=this.isBackBuffer?0:1;this.frame.appendChild(this.imgDiv);this.layer.div.appendChild(this.frame);if(this.layer.opacity!=null){OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,null,null,null,null,this.layer.opacity);} +this.imgDiv.map=this.layer.map;var onload=function(){if(this.isLoading){this.isLoading=false;this.events.triggerEvent("loadend");}};if(this.layerAlphaHack){OpenLayers.Event.observe(this.imgDiv.childNodes[0],'load',OpenLayers.Function.bind(onload,this));}else{OpenLayers.Event.observe(this.imgDiv,'load',OpenLayers.Function.bind(onload,this));} +var onerror=function(){if(this.imgDiv._attempts>OpenLayers.IMAGE_RELOAD_ATTEMPTS){onload.call(this);}};OpenLayers.Event.observe(this.imgDiv,"error",OpenLayers.Function.bind(onerror,this));} +this.imgDiv.viewRequestID=this.layer.map.viewRequestID;},removeImgDiv:function(){OpenLayers.Event.stopObservingElement(this.imgDiv);if(this.imgDiv.parentNode==this.frame){this.frame.removeChild(this.imgDiv);this.imgDiv.map=null;} +this.imgDiv.urls=null;var child=this.imgDiv.firstChild;if(child){OpenLayers.Event.stopObservingElement(child);this.imgDiv.removeChild(child);delete child;}else{this.imgDiv.src=OpenLayers.Util.getImagesLocation()+"blank.gif";}},checkImgURL:function(){if(this.layer){var loaded=this.layerAlphaHack?this.imgDiv.firstChild.src:this.imgDiv.src;if(!OpenLayers.Util.isEquivalentUrl(loaded,this.url)){this.hide();}}},startTransition:function(){if(!this.backBufferTile||!this.backBufferTile.imgDiv){return;} +var ratio=1;if(this.backBufferTile.resolution){ratio=this.backBufferTile.resolution/this.layer.getResolution();} +if(ratio!=1){if(this.layer.transitionEffect=='resize'){var upperLeft=new OpenLayers.LonLat(this.backBufferTile.bounds.left,this.backBufferTile.bounds.top);var size=new OpenLayers.Size(this.backBufferTile.size.w*ratio,this.backBufferTile.size.h*ratio);var px=this.layer.map.getLayerPxFromLonLat(upperLeft);OpenLayers.Util.modifyDOMElement(this.backBufferTile.frame,null,px,size);var imageSize=this.backBufferTile.imageSize;imageSize=new OpenLayers.Size(imageSize.w*ratio,imageSize.h*ratio);var imageOffset=this.backBufferTile.imageOffset;if(imageOffset){imageOffset=new OpenLayers.Pixel(imageOffset.x*ratio,imageOffset.y*ratio);} +OpenLayers.Util.modifyDOMElement(this.backBufferTile.imgDiv,null,imageOffset,imageSize);this.backBufferTile.show();}}else{if(this.layer.singleTile){this.backBufferTile.show();}else{this.backBufferTile.hide();}}},show:function(){this.frame.style.display='';if(OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS,this.layer.transitionEffect)!=-1){if(OpenLayers.IS_GECKO===true){this.frame.scrollLeft=this.frame.scrollLeft;}}},hide:function(){this.frame.style.display='none';},CLASS_NAME:"OpenLayers.Tile.Image"});OpenLayers.Tile.Image.useBlankTile=(OpenLayers.BROWSER_NAME=="safari"||OpenLayers.BROWSER_NAME=="opera");OpenLayers.Format.ArcXML=OpenLayers.Class(OpenLayers.Format.XML,{fontStyleKeys:['antialiasing','blockout','font','fontcolor','fontsize','fontstyle','glowing','interval','outline','printmode','shadow','transparency'],request:null,response:null,initialize:function(options){this.request=new OpenLayers.Format.ArcXML.Request();this.response=new OpenLayers.Format.ArcXML.Response();if(options){if(options.requesttype=="feature"){this.request.get_image=null;var qry=this.request.get_feature.query;this.addCoordSys(qry.featurecoordsys,options.featureCoordSys);this.addCoordSys(qry.filtercoordsys,options.filterCoordSys);if(options.polygon){qry.isspatial=true;qry.spatialfilter.polygon=options.polygon;}else if(options.envelope){qry.isspatial=true;qry.spatialfilter.envelope={minx:0,miny:0,maxx:0,maxy:0};this.parseEnvelope(qry.spatialfilter.envelope,options.envelope);}}else if(options.requesttype=="image"){this.request.get_feature=null;var props=this.request.get_image.properties;this.parseEnvelope(props.envelope,options.envelope);this.addLayers(props.layerlist,options.layers);this.addImageSize(props.imagesize,options.tileSize);this.addCoordSys(props.featurecoordsys,options.featureCoordSys);this.addCoordSys(props.filtercoordsys,options.filterCoordSys);}else{this.request=null;}} +OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},parseEnvelope:function(env,arr){if(arr&&arr.length==4){env.minx=arr[0];env.miny=arr[1];env.maxx=arr[2];env.maxy=arr[3];}},addLayers:function(ll,lyrs){for(var lind=0,len=lyrs.length;lind0);} +return ret;},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);} +var arcNode=null;if(data&&data.documentElement){if(data.documentElement.nodeName=="ARCXML"){arcNode=data.documentElement;}else{arcNode=data.documentElement.getElementsByTagName("ARCXML")[0];}} +if(!arcNode||arcNode.firstChild.nodeName==='parsererror'){var error,source;try{error=data.firstChild.nodeValue;source=data.firstChild.childNodes[1].firstChild.nodeValue;}catch(err){} +throw{message:"Error parsing the ArcXML request",error:error,source:source};} +var response=this.parseResponse(arcNode);return response;},write:function(request){if(!request){request=this.request;} +var root=this.createElementNS("","ARCXML");root.setAttribute("version","1.1");var reqElem=this.createElementNS("","REQUEST");if(request.get_image!=null){var getElem=this.createElementNS("","GET_IMAGE");reqElem.appendChild(getElem);var propElem=this.createElementNS("","PROPERTIES");getElem.appendChild(propElem);var props=request.get_image.properties;if(props.featurecoordsys!=null){var feat=this.createElementNS("","FEATURECOORDSYS");propElem.appendChild(feat);if(props.featurecoordsys.id===0){feat.setAttribute("string",props.featurecoordsys['string']);} +else{feat.setAttribute("id",props.featurecoordsys.id);}} +if(props.filtercoordsys!=null){var filt=this.createElementNS("","FILTERCOORDSYS");propElem.appendChild(filt);if(props.filtercoordsys.id===0){filt.setAttribute("string",props.filtercoordsys.string);} +else{filt.setAttribute("id",props.filtercoordsys.id);}} +if(props.envelope!=null){var env=this.createElementNS("","ENVELOPE");propElem.appendChild(env);env.setAttribute("minx",props.envelope.minx);env.setAttribute("miny",props.envelope.miny);env.setAttribute("maxx",props.envelope.maxx);env.setAttribute("maxy",props.envelope.maxy);} +var imagesz=this.createElementNS("","IMAGESIZE");propElem.appendChild(imagesz);imagesz.setAttribute("height",props.imagesize.height);imagesz.setAttribute("width",props.imagesize.width);if(props.imagesize.height!=props.imagesize.printheight||props.imagesize.width!=props.imagesize.printwidth){imagesz.setAttribute("printheight",props.imagesize.printheight);imagesz.setArrtibute("printwidth",props.imagesize.printwidth);} +if(props.background!=null){var backgrnd=this.createElementNS("","BACKGROUND");propElem.appendChild(backgrnd);backgrnd.setAttribute("color",props.background.color.r+","+ +props.background.color.g+","+ +props.background.color.b);if(props.background.transcolor!==null){backgrnd.setAttribute("transcolor",props.background.transcolor.r+","+ +props.background.transcolor.g+","+ +props.background.transcolor.b);}} +if(props.layerlist!=null&&props.layerlist.length>0){var layerlst=this.createElementNS("","LAYERLIST");propElem.appendChild(layerlst);for(var ld=0;ld0){queryElem.setAttribute("accuracy",query.accuracy);} +if(typeof query.featurelimit=="number"&&query.featurelimit<2000){queryElem.setAttribute("featurelimit",query.featurelimit);} +if(typeof query.subfields=="string"&&query.subfields!="#ALL#"){queryElem.setAttribute("subfields",query.subfields);} +if(typeof query.joinexpression=="string"&&query.joinexpression.length>0){queryElem.setAttribute("joinexpression",query.joinexpression);} +if(typeof query.jointables=="string"&&query.jointables.length>0){queryElem.setAttribute("jointables",query.jointables);} +ldef.appendChild(queryElem);} +if(typeof props.layerlist[ld].renderer=="object"){this.addRenderer(ldef,props.layerlist[ld].renderer);}}}}else if(request.get_feature!=null){var getElem=this.createElementNS("","GET_FEATURES");getElem.setAttribute("outputmode","newxml");getElem.setAttribute("checkesc","true");if(request.get_feature.geometry){getElem.setAttribute("geometry",request.get_feature.geometry);} +else{getElem.setAttribute("geometry","false");} +if(request.get_feature.compact){getElem.setAttribute("compact",request.get_feature.compact);} +if(request.get_feature.featurelimit=="number"){getElem.setAttribute("featurelimit",request.get_feature.featurelimit);} +getElem.setAttribute("globalenvelope","true");reqElem.appendChild(getElem);if(request.get_feature.layer!=null&&request.get_feature.layer.length>0){var lyrElem=this.createElementNS("","LAYER");lyrElem.setAttribute("id",request.get_feature.layer);getElem.appendChild(lyrElem);} +var fquery=request.get_feature.query;if(fquery!=null){var qElem=null;if(fquery.isspatial){qElem=this.createElementNS("","SPATIALQUERY");}else{qElem=this.createElementNS("","QUERY");} +getElem.appendChild(qElem);if(typeof fquery.accuracy=="number"){qElem.setAttribute("accuracy",fquery.accuracy);} +if(fquery.featurecoordsys!=null){var fcsElem1=this.createElementNS("","FEATURECOORDSYS");if(fquery.featurecoordsys.id==0){fcsElem1.setAttribute("string",fquery.featurecoordsys.string);}else{fcsElem1.setAttribute("id",fquery.featurecoordsys.id);} +qElem.appendChild(fcsElem1);} +if(fquery.filtercoordsys!=null){var fcsElem2=this.createElementNS("","FILTERCOORDSYS");if(fquery.filtercoordsys.id===0){fcsElem2.setAttribute("string",fquery.filtercoordsys.string);}else{fcsElem2.setAttribute("id",fquery.filtercoordsys.id);} +qElem.appendChild(fcsElem2);} +if(fquery.buffer>0){var bufElem=this.createElementNS("","BUFFER");bufElem.setAttribute("distance",fquery.buffer);qElem.appendChild(bufElem);} +if(fquery.isspatial){var spfElem=this.createElementNS("","SPATIALFILTER");spfElem.setAttribute("relation",fquery.spatialfilter.relation);qElem.appendChild(spfElem);if(fquery.spatialfilter.envelope){var envElem=this.createElementNS("","ENVELOPE");envElem.setAttribute("minx",fquery.spatialfilter.envelope.minx);envElem.setAttribute("miny",fquery.spatialfilter.envelope.miny);envElem.setAttribute("maxx",fquery.spatialfilter.envelope.maxx);envElem.setAttribute("maxy",fquery.spatialfilter.envelope.maxy);spfElem.appendChild(envElem);}else if(typeof fquery.spatialfilter.polygon=="object"){spfElem.appendChild(this.writePolygonGeometry(fquery.spatialfilter.polygon));}} +if(fquery.where!=null&&fquery.where.length>0){qElem.setAttribute("where",fquery.where);}}} +root.appendChild(reqElem);return OpenLayers.Format.XML.prototype.write.apply(this,[root]);},addGroupRenderer:function(ldef,toprenderer){var topRelem=this.createElementNS("","GROUPRENDERER");ldef.appendChild(topRelem);for(var rind=0;rind0){response.error=this.getChildValue(errorNode,"Unknown error.");}else{var responseNode=data.getElementsByTagName("RESPONSE");if(responseNode==null||responseNode.length==0){response.error="No RESPONSE tag found in ArcXML response.";return response;} +var rtype=responseNode[0].firstChild.nodeName;if(rtype=="#text"){rtype=responseNode[0].firstChild.nextSibling.nodeName;} +if(rtype=="IMAGE"){var envelopeNode=data.getElementsByTagName("ENVELOPE");var outputNode=data.getElementsByTagName("OUTPUT");if(envelopeNode==null||envelopeNode.length==0){response.error="No ENVELOPE tag found in ArcXML response.";}else if(outputNode==null||outputNode.length==0){response.error="No OUTPUT tag found in ArcXML response.";}else{var envAttr=this.parseAttributes(envelopeNode[0]);var outputAttr=this.parseAttributes(outputNode[0]);if(typeof outputAttr.type=="string"){response.image={envelope:envAttr,output:{type:outputAttr.type,data:this.getChildValue(outputNode[0])}};}else{response.image={envelope:envAttr,output:outputAttr};}}}else if(rtype=="FEATURES"){var features=responseNode[0].getElementsByTagName("FEATURES");var featureCount=features[0].getElementsByTagName("FEATURECOUNT");response.features.featurecount=featureCount[0].getAttribute("count");if(response.features.featurecount>0){var envelope=features[0].getElementsByTagName("ENVELOPE");response.features.envelope=this.parseAttributes(envelope[0],typeof(0));var featureList=features[0].getElementsByTagName("FEATURE");for(var fn=0;fn0){var ring=geom[0].getElementsByTagName("RING");var polys=[];for(var rn=0;rn0){var coordArr=this.getChildValue(coords[0]);coordArr=coordArr.split(/;/);for(var cn=0;cn0){for(var pn=0;pn=200&&request.status<300)){this.events.triggerEvent("success",options);if(success){success(request);}} +if(request.status&&(request.status<200||request.status>=300)){this.events.triggerEvent("failure",options);if(failure){failure(request);}}},GET:function(config){config=OpenLayers.Util.extend(config,{method:"GET"});return OpenLayers.Request.issue(config);},POST:function(config){config=OpenLayers.Util.extend(config,{method:"POST"});config.headers=config.headers?config.headers:{};if(!("CONTENT-TYPE"in OpenLayers.Util.upperCaseObject(config.headers))){config.headers["Content-Type"]="application/xml";} +return OpenLayers.Request.issue(config);},PUT:function(config){config=OpenLayers.Util.extend(config,{method:"PUT"});config.headers=config.headers?config.headers:{};if(!("CONTENT-TYPE"in OpenLayers.Util.upperCaseObject(config.headers))){config.headers["Content-Type"]="application/xml";} +return OpenLayers.Request.issue(config);},DELETE:function(config){config=OpenLayers.Util.extend(config,{method:"DELETE"});return OpenLayers.Request.issue(config);},HEAD:function(config){config=OpenLayers.Util.extend(config,{method:"HEAD"});return OpenLayers.Request.issue(config);},OPTIONS:function(config){config=OpenLayers.Util.extend(config,{method:"OPTIONS"});return OpenLayers.Request.issue(config);}};OpenLayers.Layer.ArcIMS=OpenLayers.Class(OpenLayers.Layer.Grid,{DEFAULT_PARAMS:{ClientVersion:"9.2",ServiceName:''},tileSize:null,featureCoordSys:"4326",filterCoordSys:"4326",layers:null,async:true,name:"ArcIMS",isBaseLayer:true,DEFAULT_OPTIONS:{tileSize:new OpenLayers.Size(512,512),featureCoordSys:"4326",filterCoordSys:"4326",layers:null,isBaseLayer:true,async:true,name:"ArcIMS"},initialize:function(name,url,options){this.tileSize=new OpenLayers.Size(512,512);this.params=OpenLayers.Util.applyDefaults({ServiceName:options.serviceName},this.DEFAULT_PARAMS);this.options=OpenLayers.Util.applyDefaults(options,this.DEFAULT_OPTIONS);OpenLayers.Layer.Grid.prototype.initialize.apply(this,[name,url,this.params,options]);if(this.transparent){if(!this.isBaseLayer){this.isBaseLayer=false;} +if(this.format=="image/jpeg"){this.format=OpenLayers.Util.alphaHack()?"image/gif":"image/png";}} +if(this.options.layers===null){this.options.layers=[];}},destroy:function(){OpenLayers.Layer.Grid.prototype.destroy.apply(this,arguments);},getURL:function(bounds){var url="";bounds=this.adjustBounds(bounds);var axlReq=new OpenLayers.Format.ArcXML(OpenLayers.Util.extend(this.options,{requesttype:"image",envelope:bounds.toArray(),tileSize:this.tileSize}));var req=new OpenLayers.Request.POST({url:this.getFullRequestString(),data:axlReq.write(),async:false});if(req!=null){var doc=req.responseXML;if(!doc||!doc.documentElement){doc=req.responseText;} +var axlResp=new OpenLayers.Format.ArcXML();var arcxml=axlResp.read(doc);url=this.getUrlOrImage(arcxml.image.output);} +return url;},getURLasync:function(bounds,scope,prop,callback){bounds=this.adjustBounds(bounds);var axlReq=new OpenLayers.Format.ArcXML(OpenLayers.Util.extend(this.options,{requesttype:"image",envelope:bounds.toArray(),tileSize:this.tileSize}));OpenLayers.Request.POST({url:this.getFullRequestString(),async:true,data:axlReq.write(),callback:function(req){var doc=req.responseXML;if(!doc||!doc.documentElement){doc=req.responseText;} +var axlResp=new OpenLayers.Format.ArcXML();var arcxml=axlResp.read(doc);scope[prop]=this.getUrlOrImage(arcxml.image.output);callback.apply(scope);},scope:this});},getUrlOrImage:function(output){var ret="";if(output.url){ret=output.url;}else if(output.data){ret="data:image/"+output.type+";base64,"+output.data;} +return ret;},setLayerQuery:function(id,querydef){for(var lyr=0;lyr=0;--i){this._removeButton(this.buttons[i]);}},doubleClick:function(evt){OpenLayers.Event.stop(evt);return false;},buttonDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;} +switch(this.action){case"panup":this.map.pan(0,-this.getSlideFactor("h"));break;case"pandown":this.map.pan(0,this.getSlideFactor("h"));break;case"panleft":this.map.pan(-this.getSlideFactor("w"),0);break;case"panright":this.map.pan(this.getSlideFactor("w"),0);break;case"zoomin":this.map.zoomIn();break;case"zoomout":this.map.zoomOut();break;case"zoomworld":this.map.zoomToMaxExtent();break;} +OpenLayers.Event.stop(evt);},CLASS_NAME:"OpenLayers.Control.PanZoom"});OpenLayers.Control.PanZoom.X=4;OpenLayers.Control.PanZoom.Y=4;OpenLayers.Control.PanZoomBar=OpenLayers.Class(OpenLayers.Control.PanZoom,{zoomStopWidth:18,zoomStopHeight:11,slider:null,sliderEvents:null,zoombarDiv:null,divEvents:null,zoomWorldIcon:false,panIcons:true,forceFixedZoomLevel:false,mouseDragStart:null,deltaY:null,zoomStart:null,destroy:function(){this._removeZoomBar();this.map.events.un({"changebaselayer":this.redraw,scope:this});OpenLayers.Control.PanZoom.prototype.destroy.apply(this,arguments);delete this.mouseDragStart;delete this.zoomStart;},setMap:function(map){OpenLayers.Control.PanZoom.prototype.setMap.apply(this,arguments);this.map.events.register("changebaselayer",this,this.redraw);},redraw:function(){if(this.div!=null){this.removeButtons();this._removeZoomBar();} +this.draw();},draw:function(px){OpenLayers.Control.prototype.draw.apply(this,arguments);px=this.position.clone();this.buttons=[];var sz=new OpenLayers.Size(18,18);if(this.panIcons){var centered=new OpenLayers.Pixel(px.x+sz.w/2,px.y);var wposition=sz.w;if(this.zoomWorldIcon){centered=new OpenLayers.Pixel(px.x+sz.w,px.y);} +this._addButton("panup","north-mini.png",centered,sz);px.y=centered.y+sz.h;this._addButton("panleft","west-mini.png",px,sz);if(this.zoomWorldIcon){this._addButton("zoomworld","zoom-world-mini.png",px.add(sz.w,0),sz);wposition*=2;} +this._addButton("panright","east-mini.png",px.add(wposition,0),sz);this._addButton("pandown","south-mini.png",centered.add(0,sz.h*2),sz);this._addButton("zoomin","zoom-plus-mini.png",centered.add(0,sz.h*3+5),sz);centered=this._addZoomBar(centered.add(0,sz.h*4+5));this._addButton("zoomout","zoom-minus-mini.png",centered,sz);} +else{this._addButton("zoomin","zoom-plus-mini.png",px,sz);centered=this._addZoomBar(px.add(0,sz.h));this._addButton("zoomout","zoom-minus-mini.png",centered,sz);if(this.zoomWorldIcon){centered=centered.add(0,sz.h+3);this._addButton("zoomworld","zoom-world-mini.png",centered,sz);}} +return this.div;},_addZoomBar:function(centered){var imgLocation=OpenLayers.Util.getImagesLocation();var id=this.id+"_"+this.map.id;var zoomsToEnd=this.map.getNumZoomLevels()-1-this.map.getZoom();var slider=OpenLayers.Util.createAlphaImageDiv(id,centered.add(-1,zoomsToEnd*this.zoomStopHeight),new OpenLayers.Size(20,9),imgLocation+"slider.png","absolute");slider.style.cursor="move";this.slider=slider;this.sliderEvents=new OpenLayers.Events(this,slider,null,true,{includeXY:true});this.sliderEvents.on({"touchstart":this.zoomBarDown,"touchmove":this.zoomBarDrag,"touchend":this.zoomBarUp,"mousedown":this.zoomBarDown,"mousemove":this.zoomBarDrag,"mouseup":this.zoomBarUp,"dblclick":this.doubleClick,"click":this.doubleClick});var sz=new OpenLayers.Size();sz.h=this.zoomStopHeight*this.map.getNumZoomLevels();sz.w=this.zoomStopWidth;var div=null;if(OpenLayers.Util.alphaHack()){var id=this.id+"_"+this.map.id;div=OpenLayers.Util.createAlphaImageDiv(id,centered,new OpenLayers.Size(sz.w,this.zoomStopHeight),imgLocation+"zoombar.png","absolute",null,"crop");div.style.height=sz.h+"px";}else{div=OpenLayers.Util.createDiv('OpenLayers_Control_PanZoomBar_Zoombar'+this.map.id,centered,sz,imgLocation+"zoombar.png");} +div.style.cursor="pointer";this.zoombarDiv=div;this.divEvents=new OpenLayers.Events(this,div,null,true,{includeXY:true});this.divEvents.on({"touchmove":this.passEventToSlider,"mousedown":this.divClick,"mousemove":this.passEventToSlider,"dblclick":this.doubleClick,"click":this.doubleClick});this.div.appendChild(div);this.startTop=parseInt(div.style.top);this.div.appendChild(slider);this.map.events.register("zoomend",this,this.moveZoomBar);centered=centered.add(0,this.zoomStopHeight*this.map.getNumZoomLevels());return centered;},_removeZoomBar:function(){this.sliderEvents.un({"touchmove":this.zoomBarDrag,"mousedown":this.zoomBarDown,"mousemove":this.zoomBarDrag,"mouseup":this.zoomBarUp,"dblclick":this.doubleClick,"click":this.doubleClick});this.sliderEvents.destroy();this.divEvents.un({"touchmove":this.passEventToSlider,"mousedown":this.divClick,"mousemove":this.passEventToSlider,"dblclick":this.doubleClick,"click":this.doubleClick});this.divEvents.destroy();this.div.removeChild(this.zoombarDiv);this.zoombarDiv=null;this.div.removeChild(this.slider);this.slider=null;this.map.events.unregister("zoomend",this,this.moveZoomBar);},passEventToSlider:function(evt){this.sliderEvents.handleBrowserEvent(evt);},divClick:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;} +var levels=evt.xy.y/this.zoomStopHeight;if(this.forceFixedZoomLevel||!this.map.fractionalZoom){levels=Math.floor(levels);} +var zoom=(this.map.getNumZoomLevels()-1)-levels;zoom=Math.min(Math.max(zoom,0),this.map.getNumZoomLevels()-1);this.map.zoomTo(zoom);OpenLayers.Event.stop(evt);},zoomBarDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)&&!OpenLayers.Event.isSingleTouch(evt)){return;} +this.map.events.on({"touchmove":this.passEventToSlider,"mousemove":this.passEventToSlider,"mouseup":this.passEventToSlider,scope:this});this.mouseDragStart=evt.xy.clone();this.zoomStart=evt.xy.clone();this.div.style.cursor="move";this.zoombarDiv.offsets=null;OpenLayers.Event.stop(evt);},zoomBarDrag:function(evt){if(this.mouseDragStart!=null){var deltaY=this.mouseDragStart.y-evt.xy.y;var offsets=OpenLayers.Util.pagePosition(this.zoombarDiv);if((evt.clientY-offsets[1])>0&&(evt.clientY-offsets[1])0){this.layer.destroyFeatures(destroys);} +this.events.triggerEvent("success",evt);}else{this.events.triggerEvent("fail",evt);}},CLASS_NAME:"OpenLayers.Strategy.Save"});OpenLayers.Format.GPX=OpenLayers.Class(OpenLayers.Format.XML,{extractWaypoints:true,extractTracks:true,extractRoutes:true,extractAttributes:true,initialize:function(options){this.externalProjection=new OpenLayers.Projection("EPSG:4326");OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(doc){if(typeof doc=="string"){doc=OpenLayers.Format.XML.prototype.read.apply(this,[doc]);} +var features=[];if(this.extractTracks){var tracks=doc.getElementsByTagName("trk");for(var i=0,len=tracks.length;i0){typeName=query[0].getAttribute('typeName');if(!typeName){typeName=query[0].getAttribute('typename');}} +describelayer.push({layerName:layerName,owsType:owsType,owsURL:owsURL,typeName:typeName});}} +return describelayer;},CLASS_NAME:"OpenLayers.Format.WMSDescribeLayer.v1_1"});OpenLayers.Format.XLS=OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC,{defaultVersion:"1.1.0",stringifyOutput:true,CLASS_NAME:"OpenLayers.Format.XLS"});OpenLayers.Format.XLS.v1=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{xls:"http://www.opengis.net/xls",gml:"http://www.opengis.net/gml",xsi:"http://www.w3.org/2001/XMLSchema-instance"},regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},xy:true,defaultPrefix:"xls",schemaLocation:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data,options){options=OpenLayers.Util.applyDefaults(options,this.options);var xls={};this.readChildNodes(data,xls);return xls;},readers:{"xls":{"XLS":function(node,xls){xls.version=node.getAttribute("version");this.readChildNodes(node,xls);},"Response":function(node,xls){this.readChildNodes(node,xls);},"GeocodeResponse":function(node,xls){xls.responseLists=[];this.readChildNodes(node,xls);},"GeocodeResponseList":function(node,xls){var responseList={features:[],numberOfGeocodedAddresses:parseInt(node.getAttribute("numberOfGeocodedAddresses"))};xls.responseLists.push(responseList);this.readChildNodes(node,responseList);},"GeocodedAddress":function(node,responseList){var feature=new OpenLayers.Feature.Vector();responseList.features.push(feature);this.readChildNodes(node,feature);feature.geometry=feature.components[0];},"GeocodeMatchCode":function(node,feature){feature.attributes.matchCode={accuracy:parseFloat(node.getAttribute("accuracy")),matchType:node.getAttribute("matchType")};},"Address":function(node,feature){var address={countryCode:node.getAttribute("countryCode"),addressee:node.getAttribute("addressee"),street:[],place:[]};feature.attributes.address=address;this.readChildNodes(node,address);},"freeFormAddress":function(node,address){address.freeFormAddress=this.getChildValue(node);},"StreetAddress":function(node,address){this.readChildNodes(node,address);},"Building":function(node,address){address.building={'number':node.getAttribute("number"),subdivision:node.getAttribute("subdivision"),buildingName:node.getAttribute("buildingName")};},"Street":function(node,address){address.street.push(this.getChildValue(node));},"Place":function(node,address){address.place[node.getAttribute("type")]=this.getChildValue(node);},"PostalCode":function(node,address){address.postalCode=this.getChildValue(node);}},"gml":OpenLayers.Format.GML.v3.prototype.readers.gml},write:function(request){return this.writers.xls.XLS.apply(this,[request]);},writers:{"xls":{"XLS":function(request){var root=this.createElementNSPlus("xls:XLS",{attributes:{"version":this.VERSION,"xsi:schemaLocation":this.schemaLocation}});this.writeNode("RequestHeader",request.header,root);this.writeNode("Request",request,root);return root;},"RequestHeader":function(header){return this.createElementNSPlus("xls:RequestHeader");},"Request":function(request){var node=this.createElementNSPlus("xls:Request",{attributes:{methodName:"GeocodeRequest",requestID:request.requestID||"",version:this.VERSION}});this.writeNode("GeocodeRequest",request.addresses,node);return node;},"GeocodeRequest":function(addresses){var node=this.createElementNSPlus("xls:GeocodeRequest");for(var i=0,len=addresses.length;i=16777216){this.hitOverflow=id-16777215;id=id%16777216+1;} +var hex="000000"+id.toString(16);var len=hex.length;hex="#"+hex.substring(len-6,len);return hex;},setHitContextStyle:function(type,featureId,symbolizer){var hex=this.featureIdToHex(featureId);if(type=="fill"){this.hitContext.globalAlpha=1.0;this.hitContext.fillStyle=hex;}else if(type=="stroke"){this.hitContext.globalAlpha=1.0;this.hitContext.strokeStyle=hex;this.hitContext.lineWidth=symbolizer.strokeWidth+2;}else{this.hitContext.globalAlpha=0;this.hitContext.lineWidth=1;}},drawPoint:function(geometry,style,featureId){if(style.graphic!==false){if(style.externalGraphic){this.drawExternalGraphic(geometry,style,featureId);}else{var pt=this.getLocalXY(geometry);var p0=pt[0];var p1=pt[1];if(!isNaN(p0)&&!isNaN(p1)){var twoPi=Math.PI*2;var radius=style.pointRadius;if(style.fill!==false){this.setCanvasStyle("fill",style);this.canvas.beginPath();this.canvas.arc(p0,p1,radius,0,twoPi,true);this.canvas.fill();if(this.hitDetection){this.setHitContextStyle("fill",featureId,style);this.hitContext.beginPath();this.hitContext.arc(p0,p1,radius,0,twoPi,true);this.hitContext.fill();}} +if(style.stroke!==false){this.setCanvasStyle("stroke",style);this.canvas.beginPath();this.canvas.arc(p0,p1,radius,0,twoPi,true);this.canvas.stroke();if(this.hitDetection){this.setHitContextStyle("stroke",featureId,style);this.hitContext.beginPath();this.hitContext.arc(p0,p1,radius,0,twoPi,true);this.hitContext.stroke();} +this.setCanvasStyle("reset");}}}}},drawLineString:function(geometry,style,featureId){style=OpenLayers.Util.applyDefaults({fill:false},style);this.drawLinearRing(geometry,style,featureId);},drawLinearRing:function(geometry,style,featureId){if(style.fill!==false){this.setCanvasStyle("fill",style);this.renderPath(this.canvas,geometry,style,featureId,"fill");if(this.hitDetection){this.setHitContextStyle("fill",featureId,style);this.renderPath(this.hitContext,geometry,style,featureId,"fill");}} +if(style.stroke!==false){this.setCanvasStyle("stroke",style);this.renderPath(this.canvas,geometry,style,featureId,"stroke");if(this.hitDetection){this.setHitContextStyle("stroke",featureId,style);this.renderPath(this.hitContext,geometry,style,featureId,"stroke");}} +this.setCanvasStyle("reset");},renderPath:function(context,geometry,style,featureId,type){var components=geometry.components;var len=components.length;context.beginPath();var start=this.getLocalXY(components[0]);var x=start[0];var y=start[1];if(!isNaN(x)&&!isNaN(y)){context.moveTo(start[0],start[1]);for(var i=1;i=0;i--){var nodes=this.createFeatureNodes(features[i]);for(var j=0;j0){this.timeoutId=setTimeout(OpenLayers.Function.bind(this.removeTimeout,this),this.interval);} +this.dragging=true;this.move(evt);this.callback("move",[evt.xy]);if(!this.oldOnselectstart){this.oldOnselectstart=document.onselectstart;document.onselectstart=OpenLayers.Function.False;} +this.last=evt.xy;} +return true;},dragend:function(evt){if(this.started){if(this.documentDrag===true&&this.documentEvents){this.adjustXY(evt);this.removeDocumentEvents();} +var dragged=(this.start!=this.last);this.started=false;this.dragging=false;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");this.up(evt);this.callback("up",[evt.xy]);if(dragged){this.callback("done",[evt.xy]);} +document.onselectstart=this.oldOnselectstart;} +return true;},down:function(evt){},move:function(evt){},up:function(evt){},out:function(evt){},mousedown:function(evt){return this.dragstart(evt);},touchstart:function(evt){if(!this.touch){this.touch=true;this.map.events.un({mousedown:this.mousedown,mouseup:this.mouseup,mousemove:this.mousemove,click:this.click,scope:this});} +return this.dragstart(evt);},mousemove:function(evt){return this.dragmove(evt);},touchmove:function(evt){return this.dragmove(evt);},removeTimeout:function(){this.timeoutId=null;if(this.dragging){this.mousemove(this.lastMoveEvt);}},mouseup:function(evt){return this.dragend(evt);},touchend:function(evt){evt.xy=this.last;return this.dragend(evt);},mouseout:function(evt){if(this.started&&OpenLayers.Util.mouseLeft(evt,this.map.eventsDiv)){if(this.documentDrag===true){this.addDocumentEvents();}else{var dragged=(this.start!=this.last);this.started=false;this.dragging=false;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");this.out(evt);this.callback("out",[]);if(dragged){this.callback("done",[evt.xy]);} +if(document.onselectstart){document.onselectstart=this.oldOnselectstart;}}} +return true;},click:function(evt){return(this.start==this.last);},activate:function(){var activated=false;if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.dragging=false;activated=true;} +return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.touch=false;this.started=false;this.dragging=false;this.start=null;this.last=null;deactivated=true;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");} +return deactivated;},adjustXY:function(evt){var pos=OpenLayers.Util.pagePosition(this.map.viewPortDiv);evt.xy.x-=pos[0];evt.xy.y-=pos[1];},addDocumentEvents:function(){OpenLayers.Element.addClass(document.body,"olDragDown");this.documentEvents=true;OpenLayers.Event.observe(document,"mousemove",this._docMove);OpenLayers.Event.observe(document,"mouseup",this._docUp);},removeDocumentEvents:function(){OpenLayers.Element.removeClass(document.body,"olDragDown");this.documentEvents=false;OpenLayers.Event.stopObserving(document,"mousemove",this._docMove);OpenLayers.Event.stopObserving(document,"mouseup",this._docUp);},CLASS_NAME:"OpenLayers.Handler.Drag"});OpenLayers.Handler.Feature=OpenLayers.Class(OpenLayers.Handler,{EVENTMAP:{'click':{'in':'click','out':'clickout'},'mousemove':{'in':'over','out':'out'},'dblclick':{'in':'dblclick','out':null},'mousedown':{'in':null,'out':null},'mouseup':{'in':null,'out':null},'touchstart':{'in':'click','out':'clickout'}},feature:null,lastFeature:null,down:null,up:null,touch:false,clickTolerance:4,geometryTypes:null,stopClick:true,stopDown:true,stopUp:false,initialize:function(control,layer,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,[control,callbacks,options]);this.layer=layer;},touchstart:function(evt){if(!this.touch){this.touch=true;this.map.events.un({mousedown:this.mousedown,mouseup:this.mouseup,mousemove:this.mousemove,click:this.click,dblclick:this.dblclick,scope:this});} +return OpenLayers.Event.isMultiTouch(evt)?true:this.mousedown(evt);},touchmove:function(evt){OpenLayers.Event.stop(evt);},mousedown:function(evt){this.down=evt.xy;return this.handle(evt)?!this.stopDown:true;},mouseup:function(evt){this.up=evt.xy;return this.handle(evt)?!this.stopUp:true;},click:function(evt){return this.handle(evt)?!this.stopClick:true;},mousemove:function(evt){if(!this.callbacks['over']&&!this.callbacks['out']){return true;} +this.handle(evt);return true;},dblclick:function(evt){return!this.handle(evt);},geometryTypeMatches:function(feature){return this.geometryTypes==null||OpenLayers.Util.indexOf(this.geometryTypes,feature.geometry.CLASS_NAME)>-1;},handle:function(evt){if(this.feature&&!this.feature.layer){this.feature=null;} +var type=evt.type;var handled=false;var previouslyIn=!!(this.feature);var click=(type=="click"||type=="dblclick"||type=="touchstart");this.feature=this.layer.getFeatureFromEvent(evt);if(this.feature&&!this.feature.layer){this.feature=null;} +if(this.lastFeature&&!this.lastFeature.layer){this.lastFeature=null;} +if(this.feature){if(type==="touchstart"){OpenLayers.Event.stop(evt);} +var inNew=(this.feature!=this.lastFeature);if(this.geometryTypeMatches(this.feature)){if(previouslyIn&&inNew){if(this.lastFeature){this.triggerCallback(type,'out',[this.lastFeature]);} +this.triggerCallback(type,'in',[this.feature]);}else if(!previouslyIn||click){this.triggerCallback(type,'in',[this.feature]);} +this.lastFeature=this.feature;handled=true;}else{if(this.lastFeature&&(previouslyIn&&inNew||click)){this.triggerCallback(type,'out',[this.lastFeature]);} +this.feature=null;}}else{if(this.lastFeature&&(previouslyIn||click)){this.triggerCallback(type,'out',[this.lastFeature]);}} +return handled;},triggerCallback:function(type,mode,args){var key=this.EVENTMAP[type][mode];if(key){if(type=='click'&&this.up&&this.down){var dpx=Math.sqrt(Math.pow(this.up.x-this.down.x,2)+ +Math.pow(this.up.y-this.down.y,2));if(dpx<=this.clickTolerance){this.callback(key,args);}}else{this.callback(key,args);}}},activate:function(){var activated=false;if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.moveLayerToTop();this.map.events.on({"removelayer":this.handleMapEvents,"changelayer":this.handleMapEvents,scope:this});activated=true;} +return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.moveLayerBack();this.feature=null;this.lastFeature=null;this.down=null;this.up=null;this.touch=false;this.map.events.un({"removelayer":this.handleMapEvents,"changelayer":this.handleMapEvents,scope:this});deactivated=true;} +return deactivated;},handleMapEvents:function(evt){if(evt.type=="removelayer"||evt.property=="order"){this.moveLayerToTop();}},moveLayerToTop:function(){var index=Math.max(this.map.Z_INDEX_BASE['Feature']-1,this.layer.getZIndex())+1;this.layer.setZIndex(index);},moveLayerBack:function(){var index=this.layer.getZIndex()-1;if(index>=this.map.Z_INDEX_BASE['Feature']){this.layer.setZIndex(index);}else{this.map.setLayerZIndex(this.layer,this.map.getLayerIndex(this.layer));}},CLASS_NAME:"OpenLayers.Handler.Feature"});OpenLayers.Control.DragFeature=OpenLayers.Class(OpenLayers.Control,{geometryTypes:null,onStart:function(feature,pixel){},onDrag:function(feature,pixel){},onComplete:function(feature,pixel){},onEnter:function(feature){},onLeave:function(feature){},documentDrag:false,layer:null,feature:null,dragCallbacks:{},featureCallbacks:{},lastPixel:null,initialize:function(layer,options){OpenLayers.Control.prototype.initialize.apply(this,[options]);this.layer=layer;this.handlers={drag:new OpenLayers.Handler.Drag(this,OpenLayers.Util.extend({down:this.downFeature,move:this.moveFeature,up:this.upFeature,out:this.cancel,done:this.doneDragging},this.dragCallbacks),{documentDrag:this.documentDrag}),feature:new OpenLayers.Handler.Feature(this,this.layer,OpenLayers.Util.extend({click:this.clickFeature,clickout:this.clickoutFeature,over:this.overFeature,out:this.outFeature},this.featureCallbacks),{geometryTypes:this.geometryTypes})};},clickFeature:function(feature){if(this.handlers.feature.touch&&!this.over&&this.overFeature(feature)){this.handlers.drag.dragstart(this.handlers.feature.evt);this.handlers.drag.stopDown=false;}},clickoutFeature:function(feature){if(this.handlers.feature.touch&&this.over){this.outFeature(feature);this.handlers.drag.stopDown=true;}},destroy:function(){this.layer=null;OpenLayers.Control.prototype.destroy.apply(this,[]);},activate:function(){return(this.handlers.feature.activate()&&OpenLayers.Control.prototype.activate.apply(this,arguments));},deactivate:function(){this.handlers.drag.deactivate();this.handlers.feature.deactivate();this.feature=null;this.dragging=false;this.lastPixel=null;OpenLayers.Element.removeClass(this.map.viewPortDiv,this.displayClass+"Over");return OpenLayers.Control.prototype.deactivate.apply(this,arguments);},overFeature:function(feature){var activated=false;if(!this.handlers.drag.dragging){this.feature=feature;this.handlers.drag.activate();activated=true;this.over=true;OpenLayers.Element.addClass(this.map.viewPortDiv,this.displayClass+"Over");this.onEnter(feature);}else{if(this.feature.id==feature.id){this.over=true;}else{this.over=false;}} +return activated;},downFeature:function(pixel){this.lastPixel=pixel;this.onStart(this.feature,pixel);},moveFeature:function(pixel){var res=this.map.getResolution();this.feature.geometry.move(res*(pixel.x-this.lastPixel.x),res*(this.lastPixel.y-pixel.y));this.layer.drawFeature(this.feature);this.lastPixel=pixel;this.onDrag(this.feature,pixel);},upFeature:function(pixel){if(!this.over){this.handlers.drag.deactivate();}},doneDragging:function(pixel){this.onComplete(this.feature,pixel);},outFeature:function(feature){if(!this.handlers.drag.dragging){this.over=false;this.handlers.drag.deactivate();OpenLayers.Element.removeClass(this.map.viewPortDiv,this.displayClass+"Over");this.onLeave(feature);this.feature=null;}else{if(this.feature.id==feature.id){this.over=false;}}},cancel:function(){this.handlers.drag.deactivate();this.over=false;},setMap:function(map){this.handlers.drag.setMap(map);this.handlers.feature.setMap(map);OpenLayers.Control.prototype.setMap.apply(this,arguments);},CLASS_NAME:"OpenLayers.Control.DragFeature"});OpenLayers.StyleMap=OpenLayers.Class({styles:null,extendDefault:true,initialize:function(style,options){this.styles={"default":new OpenLayers.Style(OpenLayers.Feature.Vector.style["default"]),"select":new OpenLayers.Style(OpenLayers.Feature.Vector.style["select"]),"temporary":new OpenLayers.Style(OpenLayers.Feature.Vector.style["temporary"]),"delete":new OpenLayers.Style(OpenLayers.Feature.Vector.style["delete"])};if(style instanceof OpenLayers.Style){this.styles["default"]=style;this.styles["select"]=style;this.styles["temporary"]=style;this.styles["delete"]=style;}else if(typeof style=="object"){for(var key in style){if(style[key]instanceof OpenLayers.Style){this.styles[key]=style[key];}else if(typeof style[key]=="object"){this.styles[key]=new OpenLayers.Style(style[key]);}else{this.styles["default"]=new OpenLayers.Style(style);this.styles["select"]=new OpenLayers.Style(style);this.styles["temporary"]=new OpenLayers.Style(style);this.styles["delete"]=new OpenLayers.Style(style);break;}}} +OpenLayers.Util.extend(this,options);},destroy:function(){for(var key in this.styles){this.styles[key].destroy();} +this.styles=null;},createSymbolizer:function(feature,intent){if(!feature){feature=new OpenLayers.Feature.Vector();} +if(!this.styles[intent]){intent="default";} +feature.renderIntent=intent;var defaultSymbolizer={};if(this.extendDefault&&intent!="default"){defaultSymbolizer=this.styles["default"].createSymbolizer(feature);} +return OpenLayers.Util.extend(defaultSymbolizer,this.styles[intent].createSymbolizer(feature));},addUniqueValueRules:function(renderIntent,property,symbolizers,context){var rules=[];for(var value in symbolizers){rules.push(new OpenLayers.Rule({symbolizer:symbolizers[value],context:context,filter:new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.EQUAL_TO,property:property,value:value})}));} +this.styles[renderIntent].addRules(rules);},CLASS_NAME:"OpenLayers.StyleMap"});OpenLayers.Layer.Vector=OpenLayers.Class(OpenLayers.Layer,{EVENT_TYPES:["beforefeatureadded","beforefeaturesadded","featureadded","featuresadded","beforefeatureremoved","beforefeaturesremoved","featureremoved","featuresremoved","beforefeatureselected","featureselected","featureunselected","beforefeaturemodified","featuremodified","afterfeaturemodified","vertexmodified","vertexremoved","sketchstarted","sketchmodified","sketchcomplete","refresh"],isBaseLayer:false,isFixed:false,features:null,filter:null,selectedFeatures:null,unrenderedFeatures:null,reportError:true,style:null,styleMap:null,strategies:null,protocol:null,renderers:['SVG','VML','Canvas'],renderer:null,rendererOptions:null,geometryType:null,drawn:false,initialize:function(name,options){this.EVENT_TYPES=OpenLayers.Layer.Vector.prototype.EVENT_TYPES.concat(OpenLayers.Layer.prototype.EVENT_TYPES);OpenLayers.Layer.prototype.initialize.apply(this,arguments);if(!this.renderer||!this.renderer.supported()){this.assignRenderer();} +if(!this.renderer||!this.renderer.supported()){this.renderer=null;this.displayError();} +if(!this.styleMap){this.styleMap=new OpenLayers.StyleMap();} +this.features=[];this.selectedFeatures=[];this.unrenderedFeatures={};if(this.strategies){for(var i=0,len=this.strategies.length;i=0;i--){if(i!=0&&features[i-1].geometry){this.renderer.locked=true;}else{this.renderer.locked=false;} +var feature=features[i];delete this.unrenderedFeatures[feature.id];if(notify){this.events.triggerEvent("beforefeatureremoved",{feature:feature});} +this.features=OpenLayers.Util.removeItem(this.features,feature);feature.layer=null;if(feature.geometry){this.renderer.eraseFeatures(feature);} +if(OpenLayers.Util.indexOf(this.selectedFeatures,feature)!=-1){OpenLayers.Util.removeItem(this.selectedFeatures,feature);} +if(notify){this.events.triggerEvent("featureremoved",{feature:feature});}} +if(notify){this.events.triggerEvent("featuresremoved",{features:features});}},removeAllFeatures:function(options){var notify=!options||!options.silent;var features=this.features;if(notify){this.events.triggerEvent("beforefeaturesremoved",{features:features});} +var feature;for(var i=features.length-1;i>=0;i--){feature=features[i];if(notify){this.events.triggerEvent("beforefeatureremoved",{feature:feature});} +feature.layer=null;if(notify){this.events.triggerEvent("featureremoved",{feature:feature});}} +this.renderer.clear();this.features=[];this.unrenderedFeatures={};this.selectedFeatures=[];if(notify){this.events.triggerEvent("featuresremoved",{features:features});}},destroyFeatures:function(features,options){var all=(features==undefined);if(all){features=this.features;} +if(features){this.removeFeatures(features,options);for(var i=features.length-1;i>=0;i--){features[i].destroy();}}},drawFeature:function(feature,style){if(!this.drawn){return;} +if(typeof style!="object"){if(!style&&feature.state===OpenLayers.State.DELETE){style="delete";} +var renderIntent=style||feature.renderIntent;style=feature.style||this.style;if(!style){style=this.styleMap.createSymbolizer(feature,renderIntent);}} +var drawn=this.renderer.drawFeature(feature,style);if(drawn===false||drawn===null){this.unrenderedFeatures[feature.id]=feature;}else{delete this.unrenderedFeatures[feature.id];}},eraseFeatures:function(features){this.renderer.eraseFeatures(features);},getFeatureFromEvent:function(evt){if(!this.renderer){OpenLayers.Console.error(OpenLayers.i18n("getFeatureError"));return null;} +var feature=null;var featureId=this.renderer.getFeatureIdFromEvent(evt);if(featureId){if(typeof featureId==="string"){feature=this.getFeatureById(featureId);}else{feature=featureId;}} +return feature;},getFeatureBy:function(property,value){var feature=null;for(var i=0,len=this.features.length;i0)){var geometry=null;for(var i=0,len=features.length;i=0;--i){feature=layer.selectedFeatures[i];if(!options||options.except!=feature){this.unselect(feature);}}}},clickFeature:function(feature){if(!this.hover){var selected=(OpenLayers.Util.indexOf(feature.layer.selectedFeatures,feature)>-1);if(selected){if(this.toggleSelect()){this.unselect(feature);}else if(!this.multipleSelect()){this.unselectAll({except:feature});}}else{if(!this.multipleSelect()){this.unselectAll({except:feature});} +this.select(feature);}}},multipleSelect:function(){return this.multiple||(this.handlers.feature.evt&&this.handlers.feature.evt[this.multipleKey]);},toggleSelect:function(){return this.toggle||(this.handlers.feature.evt&&this.handlers.feature.evt[this.toggleKey]);},clickoutFeature:function(feature){if(!this.hover&&this.clickout){this.unselectAll();}},overFeature:function(feature){var layer=feature.layer;if(this.hover){if(this.highlightOnly){this.highlight(feature);}else if(OpenLayers.Util.indexOf(layer.selectedFeatures,feature)==-1){this.select(feature);}}},outFeature:function(feature){if(this.hover){if(this.highlightOnly){if(feature._lastHighlighter==this.id){if(feature._prevHighlighter&&feature._prevHighlighter!=this.id){delete feature._lastHighlighter;var control=this.map.getControl(feature._prevHighlighter);if(control){control.highlight(feature);}}else{this.unhighlight(feature);}}}else{this.unselect(feature);}}},highlight:function(feature){var layer=feature.layer;var cont=this.events.triggerEvent("beforefeaturehighlighted",{feature:feature});if(cont!==false){feature._prevHighlighter=feature._lastHighlighter;feature._lastHighlighter=this.id;var style=this.selectStyle||this.renderIntent;layer.drawFeature(feature,style);this.events.triggerEvent("featurehighlighted",{feature:feature});}},unhighlight:function(feature){var layer=feature.layer;if(feature._prevHighlighter==undefined){delete feature._lastHighlighter;}else if(feature._prevHighlighter==this.id){delete feature._prevHighlighter;}else{feature._lastHighlighter=feature._prevHighlighter;delete feature._prevHighlighter;} +layer.drawFeature(feature,feature.style||feature.layer.style||"default");this.events.triggerEvent("featureunhighlighted",{feature:feature});},select:function(feature){var cont=this.onBeforeSelect.call(this.scope,feature);var layer=feature.layer;if(cont!==false){cont=layer.events.triggerEvent("beforefeatureselected",{feature:feature});if(cont!==false){layer.selectedFeatures.push(feature);this.highlight(feature);if(!this.handlers.feature.lastFeature){this.handlers.feature.lastFeature=layer.selectedFeatures[0];} +layer.events.triggerEvent("featureselected",{feature:feature});this.onSelect.call(this.scope,feature);}}},unselect:function(feature){var layer=feature.layer;this.unhighlight(feature);OpenLayers.Util.removeItem(layer.selectedFeatures,feature);layer.events.triggerEvent("featureunselected",{feature:feature});this.onUnselect.call(this.scope,feature);},selectBox:function(position){if(position instanceof OpenLayers.Bounds){var minXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.left,position.bottom));var maxXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.right,position.top));var bounds=new OpenLayers.Bounds(minXY.lon,minXY.lat,maxXY.lon,maxXY.lat);if(!this.multipleSelect()){this.unselectAll();} +var prevMultiple=this.multiple;this.multiple=true;var layers=this.layers||[this.layer];var layer;for(var l=0;l-1){if(bounds.toGeometry().intersects(feature.geometry)){if(OpenLayers.Util.indexOf(layer.selectedFeatures,feature)==-1){this.select(feature);}}}}} +this.multiple=prevMultiple;}},setMap:function(map){this.handlers.feature.setMap(map);if(this.box){this.handlers.box.setMap(map);} +OpenLayers.Control.prototype.setMap.apply(this,arguments);},setLayer:function(layers){var isActive=this.active;this.unselectAll();this.deactivate();if(this.layers){this.layer.destroy();this.layers=null;} +this.initLayer(layers);this.handlers.feature.layer=this.layer;if(isActive){this.activate();}},CLASS_NAME:"OpenLayers.Control.SelectFeature"});OpenLayers.Handler.Keyboard=OpenLayers.Class(OpenLayers.Handler,{KEY_EVENTS:["keydown","keyup"],eventListener:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);this.eventListener=OpenLayers.Function.bindAsEventListener(this.handleKeyEvent,this);},destroy:function(){this.deactivate();this.eventListener=null;OpenLayers.Handler.prototype.destroy.apply(this,arguments);},activate:function(){if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){for(var i=0,len=this.KEY_EVENTS.length;i0){this.layer.destroyFeatures(this.virtualVertices,{silent:true});this.virtualVertices=[];} +this.layer.drawFeature(this.feature,this.standalone?undefined:this.selectControl.renderIntent);} +this.layer.drawFeature(vertex);},dragComplete:function(vertex){this.resetVertices();this.setFeatureState();this.onModification(this.feature);this.layer.events.triggerEvent("featuremodified",{feature:this.feature});},setFeatureState:function(){if(this.feature.state!=OpenLayers.State.INSERT&&this.feature.state!=OpenLayers.State.DELETE){this.feature.state=OpenLayers.State.UPDATE;if(this.modified&&this._originalGeometry){var feature=this.feature;feature.modified=OpenLayers.Util.extend(feature.modified,{geometry:this._originalGeometry});delete this._originalGeometry;}}},resetVertices:function(){if(this.dragControl.feature){this.dragControl.outFeature(this.dragControl.feature);} +if(this.vertices.length>0){this.layer.removeFeatures(this.vertices,{silent:true});this.vertices=[];} +if(this.virtualVertices.length>0){this.layer.removeFeatures(this.virtualVertices,{silent:true});this.virtualVertices=[];} +if(this.dragHandle){this.layer.destroyFeatures([this.dragHandle],{silent:true});this.dragHandle=null;} +if(this.radiusHandle){this.layer.destroyFeatures([this.radiusHandle],{silent:true});this.radiusHandle=null;} +if(this.feature&&this.feature.geometry.CLASS_NAME!="OpenLayers.Geometry.Point"){if((this.mode&OpenLayers.Control.ModifyFeature.DRAG)){this.collectDragHandle();} +if((this.mode&(OpenLayers.Control.ModifyFeature.ROTATE|OpenLayers.Control.ModifyFeature.RESIZE))){this.collectRadiusHandle();} +if(this.mode&OpenLayers.Control.ModifyFeature.RESHAPE){if(!(this.mode&OpenLayers.Control.ModifyFeature.RESIZE)){this.collectVertices();}}}},handleKeypress:function(evt){var code=evt.keyCode;if(this.feature&&OpenLayers.Util.indexOf(this.deleteCodes,code)!=-1){var vertex=this.dragControl.feature;if(vertex&&OpenLayers.Util.indexOf(this.vertices,vertex)!=-1&&!this.dragControl.handlers.drag.dragging&&vertex.geometry.parent){vertex.geometry.parent.removeComponent(vertex.geometry);this.layer.events.triggerEvent("vertexremoved",{vertex:vertex.geometry,feature:this.feature,pixel:evt.xy});this.layer.drawFeature(this.feature,this.standalone?undefined:this.selectControl.renderIntent);this.modified=true;this.resetVertices();this.setFeatureState();this.onModification(this.feature);this.layer.events.triggerEvent("featuremodified",{feature:this.feature});}}},collectVertices:function(){this.vertices=[];this.virtualVertices=[];var control=this;function collectComponentVertices(geometry){var i,vertex,component,len;if(geometry.CLASS_NAME=="OpenLayers.Geometry.Point"){vertex=new OpenLayers.Feature.Vector(geometry);vertex._sketch=true;vertex.renderIntent=control.vertexRenderIntent;control.vertices.push(vertex);}else{var numVert=geometry.components.length;if(geometry.CLASS_NAME=="OpenLayers.Geometry.LinearRing"){numVert-=1;} +for(i=0;iOpenStreetMap",sphericalMercator:true,url:'http://tile.openstreetmap.org/${z}/${x}/${y}.png',clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.OSM(this.name,this.url,this.getOptions());} +obj=OpenLayers.Layer.XYZ.prototype.clone.apply(this,[obj]);return obj;},wrapDateLine:true,CLASS_NAME:"OpenLayers.Layer.OSM"});OpenLayers.Layer.Bing=OpenLayers.Class(OpenLayers.Layer.XYZ,{serverResolutions:[156543.03390625,78271.516953125,39135.7584765625,19567.87923828125,9783.939619140625,4891.9698095703125,2445.9849047851562,1222.9924523925781,611.4962261962891,305.74811309814453,152.87405654907226,76.43702827453613,38.218514137268066,19.109257068634033,9.554628534317017,4.777314267158508,2.388657133579254,1.194328566789627,0.5971642833948135,0.29858214169740677,0.14929107084870338,0.07464553542435169],attributionTemplate:''+'${copyrights}'+''+'Terms of Use',metadata:null,type:"Road",metadataParams:null,initialize:function(options){options=OpenLayers.Util.applyDefaults({sphericalMercator:true},options);var name=options.name||"Bing "+(options.type||this.type);var newArgs=[name,null,options];OpenLayers.Layer.XYZ.prototype.initialize.apply(this,newArgs);this.loadMetadata();},loadMetadata:function(){this._callbackId="_callback_"+this.id.replace(/\./g,"_");window[this._callbackId]=OpenLayers.Function.bind(OpenLayers.Layer.Bing.processMetadata,this);var params=OpenLayers.Util.applyDefaults({key:this.key,jsonp:this._callbackId,include:"ImageryProviders"},this.metadataParams);var url="http://dev.virtualearth.net/REST/v1/Imagery/Metadata/"+ +this.type+"?"+OpenLayers.Util.getParameterString(params);var script=document.createElement("script");script.type="text/javascript";script.src=url;script.id=this._callbackId;document.getElementsByTagName("head")[0].appendChild(script);},initLayer:function(){var res=this.metadata.resourceSets[0].resources[0];var url=res.imageUrl.replace("{quadkey}","${quadkey}");this.url=[];for(var i=0;i0;--i){var digit='0';var mask=1<<(i-1);if((x&mask)!=0){digit++;} +if((y&mask)!=0){digit++;digit++;} +quadDigits.push(digit);} +var quadKey=quadDigits.join("");var url=this.selectUrl(''+x+y+z,this.url);return OpenLayers.String.format(url,{'quadkey':quadKey});},updateAttribution:function(){var metadata=this.metadata;if(!metadata||!this.map||!this.map.center){return;} +var res=metadata.resourceSets[0].resources[0];var extent=this.map.getExtent().transform(this.map.getProjectionObject(),new OpenLayers.Projection("EPSG:4326"));var providers=res.imageryProviders,zoom=this.map.getZoom()+1,copyrights="",provider,i,ii,j,jj,bbox,coverage;for(i=0,ii=providers.length;i=coverage.zoomMin){copyrights+=provider.attribution+" ";}}} +this.attribution=OpenLayers.String.format(this.attributionTemplate,{type:this.type.toLowerCase(),logo:metadata.brandLogoUri,copyrights:copyrights});this.map&&this.map.events.triggerEvent("changelayer",{layer:this,property:"attribution"});},setMap:function(){OpenLayers.Layer.XYZ.prototype.setMap.apply(this,arguments);this.updateAttribution();this.map.events.register("moveend",this,this.updateAttribution);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.Bing(this.options);} +obj=OpenLayers.Layer.XYZ.prototype.clone.apply(this,[obj]);return obj;},destroy:function(){this.map&&this.map.events.unregister("moveend",this,this.updateAttribution);OpenLayers.Layer.XYZ.prototype.destroy.apply(this,arguments);},CLASS_NAME:"OpenLayers.Layer.Bing"});OpenLayers.Layer.Bing.processMetadata=function(metadata){this.metadata=metadata;this.initLayer();var script=document.getElementById(this._callbackId);script.parentNode.removeChild(script);window[this._callbackId]=undefined;delete this._callbackId;};OpenLayers.Layer.PointGrid=OpenLayers.Class(OpenLayers.Layer.Vector,{dx:null,dy:null,ratio:1.5,maxFeatures:250,rotation:0,origin:null,gridBounds:null,initialize:function(config){config=config||{};OpenLayers.Layer.Vector.prototype.initialize.apply(this,[config.name,config]);},setMap:function(map){OpenLayers.Layer.Vector.prototype.setMap.apply(this,arguments);map.events.register("moveend",this,this.onMoveEnd);},removeMap:function(map){map.events.unregister("moveend",this,this.onMoveEnd);OpenLayers.Layer.Vector.prototype.removeMap.apply(this,arguments);},setRatio:function(ratio){this.ratio=ratio;this.updateGrid(true);},setMaxFeatures:function(maxFeatures){this.maxFeatures=maxFeatures;this.updateGrid(true);},setSpacing:function(dx,dy){this.dx=dx;this.dy=dy||dx;this.updateGrid(true);},setOrigin:function(origin){this.origin=origin;this.updateGrid(true);},getOrigin:function(){if(!this.origin){this.origin=this.map.getExtent().getCenterLonLat();} +return this.origin;},setRotation:function(rotation){this.rotation=rotation;this.updateGrid(true);},onMoveEnd:function(){this.updateGrid();},getViewBounds:function(){var bounds=this.map.getExtent();if(this.rotation){var origin=this.getOrigin();var rotationOrigin=new OpenLayers.Geometry.Point(origin.lon,origin.lat);var rect=bounds.toGeometry();rect.rotate(-this.rotation,rotationOrigin);bounds=rect.getBounds();} +return bounds;},updateGrid:function(force){if(force||this.invalidBounds()){var viewBounds=this.getViewBounds();var origin=this.getOrigin();var rotationOrigin=new OpenLayers.Geometry.Point(origin.lon,origin.lat);var viewBoundsWidth=viewBounds.getWidth();var viewBoundsHeight=viewBounds.getHeight();var aspectRatio=viewBoundsWidth/viewBoundsHeight;var maxHeight=Math.sqrt(this.dx*this.dy*this.maxFeatures/aspectRatio);var maxWidth=maxHeight*aspectRatio;var gridWidth=Math.min(viewBoundsWidth*this.ratio,maxWidth);var gridHeight=Math.min(viewBoundsHeight*this.ratio,maxHeight);var center=viewBounds.getCenterLonLat();this.gridBounds=new OpenLayers.Bounds(center.lon-(gridWidth/2),center.lat-(gridHeight/2),center.lon+(gridWidth/2),center.lat+(gridHeight/2));var rows=Math.floor(gridHeight/this.dy);var cols=Math.floor(gridWidth/this.dx);var gridLeft=origin.lon+(this.dx*Math.ceil((this.gridBounds.left-origin.lon)/this.dx));var gridBottom=origin.lat+(this.dy*Math.ceil((this.gridBounds.bottom-origin.lat)/this.dy));var features=new Array(rows*cols);var x,y,point;for(var i=0;i=OpenLayers.Style.createLiteral(this.minScaleDenominator,context);} +if(applies&&this.maxScaleDenominator){applies=scale1){middle=parseInt((leftIndex+rightIndex)/2);var placement=this.compare(this,newNode,OpenLayers.Util.getElement(this.order[middle]));if(placement>0){leftIndex=middle;}else{rightIndex=middle;}} +this.order.splice(rightIndex,0,nodeId);this.indices[nodeId]=this.getZIndex(newNode);return this.getNextElement(rightIndex);},remove:function(node){var nodeId=node.id;var arrayIndex=OpenLayers.Util.indexOf(this.order,nodeId);if(arrayIndex>=0){this.order.splice(arrayIndex,1);delete this.indices[nodeId];if(this.order.length>0){var lastId=this.order[this.order.length-1];this.maxZIndex=this.indices[lastId];}else{this.maxZIndex=0;}}},clear:function(){this.order=[];this.indices={};this.maxZIndex=0;},exists:function(node){return(this.indices[node.id]!=null);},getZIndex:function(node){return node._style.graphicZIndex;},determineZIndex:function(node){var zIndex=node._style.graphicZIndex;if(zIndex==null){zIndex=this.maxZIndex;node._style.graphicZIndex=zIndex;}else if(zIndex>this.maxZIndex){this.maxZIndex=zIndex;}},getNextElement:function(index){var nextIndex=index+1;if(nextIndex0){url='?'+url.substring(index+1,url.length);OpenLayers.Util.extend(parameters,OpenLayers.Util.getParameters(url));} +return parameters;},setMap:function(map){OpenLayers.Control.prototype.setMap.apply(this,arguments);for(var i=0,len=this.map.controls.length;i0){if(!mapProjection.equals(layer.projection)){var geom;for(var i=0,len=features.length;i0){obj.featureNS=this.lookupNamespaceURI(node,parts[0]);}}},read_cap_Title:function(obj,node){var title=this.getChildValue(node);if(title){obj.title=title;}},read_cap_Abstract:function(obj,node){var abst=this.getChildValue(node);if(abst){obj["abstract"]=abst;}},CLASS_NAME:"OpenLayers.Format.WFSCapabilities.v1"});OpenLayers.Format.WFSCapabilities.v1_1_0=OpenLayers.Class(OpenLayers.Format.WFSCapabilities.v1,{initialize:function(options){OpenLayers.Format.WFSCapabilities.v1.prototype.initialize.apply(this,[options]);},read_cap_DefaultSRS:function(obj,node){var defaultSRS=this.getChildValue(node);if(defaultSRS){obj.srs=defaultSRS;}},CLASS_NAME:"OpenLayers.Format.WFSCapabilities.v1_1_0"});OpenLayers.Layer.PointTrack=OpenLayers.Class(OpenLayers.Layer.Vector,{dataFrom:null,styleFrom:null,initialize:function(name,options){OpenLayers.Layer.Vector.prototype.initialize.apply(this,arguments);},addNodes:function(pointFeatures,options){if(pointFeatures.length<2){OpenLayers.Console.error("At least two point features have to be added to create"+"a line from");return;} +var lines=new Array(pointFeatures.length-1);var pointFeature,startPoint,endPoint;for(var i=0,len=pointFeatures.length;i0){var attributes=(this.dataFrom!=null)?(pointFeatures[i+this.dataFrom].data||pointFeatures[i+this.dataFrom].attributes):null;var style=(this.styleFrom!=null)?(pointFeatures[i+this.styleFrom].style):null;var line=new OpenLayers.Geometry.LineString([startPoint,endPoint]);lines[i-1]=new OpenLayers.Feature.Vector(line,attributes,style);} +startPoint=endPoint;} +this.addFeatures(lines,options);},CLASS_NAME:"OpenLayers.Layer.PointTrack"});OpenLayers.Layer.PointTrack.SOURCE_NODE=-1;OpenLayers.Layer.PointTrack.TARGET_NODE=0;OpenLayers.Layer.PointTrack.dataFrom={'SOURCE_NODE':-1,'TARGET_NODE':0};OpenLayers.Protocol.WFS=function(options){options=OpenLayers.Util.applyDefaults(options,OpenLayers.Protocol.WFS.DEFAULTS);var cls=OpenLayers.Protocol.WFS["v"+options.version.replace(/\./g,"_")];if(!cls){throw"Unsupported WFS version: "+options.version;} +return new cls(options);};OpenLayers.Protocol.WFS.fromWMSLayer=function(layer,options){var typeName,featurePrefix;var param=layer.params["LAYERS"];var parts=(OpenLayers.Util.isArray(param)?param[0]:param).split(":");if(parts.length>1){featurePrefix=parts[0];} +typeName=parts.pop();var protocolOptions={url:layer.url,featureType:typeName,featurePrefix:featurePrefix,srsName:layer.projection&&layer.projection.getCode()||layer.map&&layer.map.getProjectionObject().getCode(),version:"1.1.0"};return new OpenLayers.Protocol.WFS(OpenLayers.Util.applyDefaults(options,protocolOptions));};OpenLayers.Protocol.WFS.DEFAULTS={"version":"1.0.0"};OpenLayers.Layer.Markers=OpenLayers.Class(OpenLayers.Layer,{isBaseLayer:false,markers:null,drawn:false,initialize:function(name,options){OpenLayers.Layer.prototype.initialize.apply(this,arguments);this.markers=[];},destroy:function(){this.clearMarkers();this.markers=null;OpenLayers.Layer.prototype.destroy.apply(this,arguments);},setOpacity:function(opacity){if(opacity!=this.opacity){this.opacity=opacity;for(var i=0,len=this.markers.length;i0){this.removeMarker(this.markers[0]);}}},drawMarker:function(marker){var px=this.map.getLayerPxFromLonLat(marker.lonlat);if(px==null){marker.display(false);}else{if(!marker.isDrawn()){var markerImg=marker.draw(px);this.div.appendChild(markerImg);}else if(marker.icon){marker.icon.moveTo(px);}}},getDataExtent:function(){var maxExtent=null;if(this.markers&&(this.markers.length>0)){var maxExtent=new OpenLayers.Bounds();for(var i=0,len=this.markers.length;i=1.3&&!params.EXCEPTIONS){params.EXCEPTIONS="INIMAGE";} +newArguments.push(name,url,params,options);OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);OpenLayers.Util.applyDefaults(this.params,OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS));if(!this.noMagic&&this.params.TRANSPARENT&&this.params.TRANSPARENT.toString().toLowerCase()=="true"){if((options==null)||(!options.isBaseLayer)){this.isBaseLayer=false;} +if(this.params.FORMAT=="image/jpeg"){this.params.FORMAT=OpenLayers.Util.alphaHack()?"image/gif":"image/png";}}},destroy:function(){OpenLayers.Layer.Grid.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.WMS(this.name,this.url,this.params,this.getOptions());} +obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},reverseAxisOrder:function(){return(parseFloat(this.params.VERSION)>=1.3&&!!this.yx[this.map.getProjectionObject().getCode()]);},getURL:function(bounds){bounds=this.adjustBounds(bounds);var imageSize=this.getImageSize();var newParams={};var reverseAxisOrder=this.reverseAxisOrder();newParams.BBOX=this.encodeBBOX?bounds.toBBOX(null,reverseAxisOrder):bounds.toArray(reverseAxisOrder);newParams.WIDTH=imageSize.w;newParams.HEIGHT=imageSize.h;var requestString=this.getFullRequestString(newParams);return requestString;},mergeNewParams:function(newParams){var upperParams=OpenLayers.Util.upperCaseObject(newParams);var newArguments=[upperParams];return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this,newArguments);},getFullRequestString:function(newParams,altUrl){var mapProjection=this.map.getProjectionObject();var projectionCode=this.projection&&this.projection.equals(mapProjection)?this.projection.getCode():mapProjection.getCode();var value=(projectionCode=="none")?null:projectionCode;if(parseFloat(this.params.VERSION)>=1.3){this.params.CRS=value;}else{this.params.SRS=value;} +if(typeof this.params.TRANSPARENT=="boolean"){newParams.TRANSPARENT=this.params.TRANSPARENT?"TRUE":"FALSE";} +return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(this,arguments);},CLASS_NAME:"OpenLayers.Layer.WMS"});OpenLayers.Layer.WMS.Untiled=OpenLayers.Class(OpenLayers.Layer.WMS,{singleTile:true,initialize:function(name,url,params,options){OpenLayers.Layer.WMS.prototype.initialize.apply(this,arguments);var msg="The OpenLayers.Layer.WMS.Untiled class is deprecated and "+"will be removed in 3.0. Instead, you should use the "+"normal OpenLayers.Layer.WMS class, passing it the option "+"'singleTile' as true.";OpenLayers.Console.warn(msg);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.WMS.Untiled(this.name,this.url,this.params,this.getOptions());} +obj=OpenLayers.Layer.WMS.prototype.clone.apply(this,[obj]);return obj;},CLASS_NAME:"OpenLayers.Layer.WMS.Untiled"});OpenLayers.Geometry.Surface=OpenLayers.Class(OpenLayers.Geometry,{initialize:function(){OpenLayers.Geometry.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Geometry.Surface"});OpenLayers.Format.ArcXML.Features=OpenLayers.Class(OpenLayers.Format.XML,{initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){var axl=new OpenLayers.Format.ArcXML();var parsed=axl.read(data);return parsed.features.feature;}});OpenLayers.Control.Snapping=OpenLayers.Class(OpenLayers.Control,{EVENT_TYPES:["beforesnap","snap","unsnap"],DEFAULTS:{tolerance:10,node:true,edge:true,vertex:true},greedy:true,precedence:["node","vertex","edge"],resolution:null,geoToleranceCache:null,layer:null,feature:null,point:null,initialize:function(options){Array.prototype.push.apply(this.EVENT_TYPES,OpenLayers.Control.prototype.EVENT_TYPES);OpenLayers.Control.prototype.initialize.apply(this,[options]);this.options=options||{};if(this.options.layer){this.setLayer(this.options.layer);} +var defaults=OpenLayers.Util.extend({},this.options.defaults);this.defaults=OpenLayers.Util.applyDefaults(defaults,this.DEFAULTS);this.setTargets(this.options.targets);if(this.targets.length===0&&this.layer){this.addTargetLayer(this.layer);} +this.geoToleranceCache={};},setLayer:function(layer){if(this.active){this.deactivate();this.layer=layer;this.activate();}else{this.layer=layer;}},setTargets:function(targets){this.targets=[];if(targets&&targets.length){var target;for(var i=0,len=targets.length;i=0;--i){target=this.targets[i];if(target.layer===layer){this.removeTarget(target);}}},removeTarget:function(target){return OpenLayers.Util.removeItem(this.targets,target);},activate:function(){var activated=OpenLayers.Control.prototype.activate.call(this);if(activated){if(this.layer&&this.layer.events){this.layer.events.on({sketchstarted:this.onSketchModified,sketchmodified:this.onSketchModified,vertexmodified:this.onVertexModified,scope:this});}} +return activated;},deactivate:function(){var deactivated=OpenLayers.Control.prototype.deactivate.call(this);if(deactivated){if(this.layer&&this.layer.events){this.layer.events.un({sketchstarted:this.onSketchModified,sketchmodified:this.onSketchModified,vertexmodified:this.onVertexModified,scope:this});}} +this.feature=null;this.point=null;return deactivated;},onSketchModified:function(event){this.feature=event.feature;this.considerSnapping(event.vertex,event.vertex);},onVertexModified:function(event){this.feature=event.feature;var loc=this.layer.map.getLonLatFromViewPortPx(event.pixel);this.considerSnapping(event.vertex,new OpenLayers.Geometry.Point(loc.lon,loc.lat));},considerSnapping:function(point,loc){var best={rank:Number.POSITIVE_INFINITY,dist:Number.POSITIVE_INFINITY,x:null,y:null};var snapped=false;var result,target;for(var i=0,len=this.targets.length;i=target.maxResolution){return null;}} +var tolerance={node:this.getGeoTolerance(target.nodeTolerance,resolution),vertex:this.getGeoTolerance(target.vertexTolerance,resolution),edge:this.getGeoTolerance(target.edgeTolerance,resolution)};var maxTolerance=Math.max(tolerance.node,tolerance.vertex,tolerance.edge);var result={rank:Number.POSITIVE_INFINITY,dist:Number.POSITIVE_INFINITY};var eligible=false;var features=target.layer.features;var feature,type,vertices,vertex,closest,dist,found;var numTypes=this.precedence.length;var ll=new OpenLayers.LonLat(loc.x,loc.y);for(var i=0,len=features.length;i4) +this._object.open(sMethod,sUrl,bAsync,sUser,sPassword);else +if(arguments.length>3) +this._object.open(sMethod,sUrl,bAsync,sUser);else +this._object.open(sMethod,sUrl,bAsync);this.readyState=cXMLHttpRequest.OPENED;fReadyStateChange(this);this._object.onreadystatechange=function(){if(bGecko&&!bAsync) +return;oRequest.readyState=oRequest._object.readyState;fSynchronizeValues(oRequest);if(oRequest._aborted){oRequest.readyState=cXMLHttpRequest.UNSENT;return;} +if(oRequest.readyState==cXMLHttpRequest.DONE){delete oRequest._data;fCleanTransport(oRequest);if(bIE&&bAsync) +window.detachEvent("onunload",fOnUnload);} +if(nState!=oRequest.readyState) +fReadyStateChange(oRequest);nState=oRequest.readyState;}};function fXMLHttpRequest_send(oRequest){oRequest._object.send(oRequest._data);if(bGecko&&!oRequest._async){oRequest.readyState=cXMLHttpRequest.OPENED;fSynchronizeValues(oRequest);while(oRequest.readyStatecXMLHttpRequest.UNSENT) +this._aborted=true;this._object.abort();fCleanTransport(this);this.readyState=cXMLHttpRequest.UNSENT;delete this._data;};cXMLHttpRequest.prototype.getAllResponseHeaders=function(){return this._object.getAllResponseHeaders();};cXMLHttpRequest.prototype.getResponseHeader=function(sName){return this._object.getResponseHeader(sName);};cXMLHttpRequest.prototype.setRequestHeader=function(sName,sValue){if(!this._headers) +this._headers={};this._headers[sName]=sValue;return this._object.setRequestHeader(sName,sValue);};cXMLHttpRequest.prototype.addEventListener=function(sName,fHandler,bUseCapture){for(var nIndex=0,oListener;oListener=this._listeners[nIndex];nIndex++) +if(oListener[0]==sName&&oListener[1]==fHandler&&oListener[2]==bUseCapture) +return;this._listeners.push([sName,fHandler,bUseCapture]);};cXMLHttpRequest.prototype.removeEventListener=function(sName,fHandler,bUseCapture){for(var nIndex=0,oListener;oListener=this._listeners[nIndex];nIndex++) +if(oListener[0]==sName&&oListener[1]==fHandler&&oListener[2]==bUseCapture) +break;if(oListener) +this._listeners.splice(nIndex,1);};cXMLHttpRequest.prototype.dispatchEvent=function(oEvent){var oEventPseudo={'type':oEvent.type,'target':this,'currentTarget':this,'eventPhase':2,'bubbles':oEvent.bubbles,'cancelable':oEvent.cancelable,'timeStamp':oEvent.timeStamp,'stopPropagation':function(){},'preventDefault':function(){},'initEvent':function(){}};if(oEventPseudo.type=="readystatechange"&&this.onreadystatechange) +(this.onreadystatechange.handleEvent||this.onreadystatechange).apply(this,[oEventPseudo]);for(var nIndex=0,oListener;oListener=this._listeners[nIndex];nIndex++) +if(oListener[0]==oEventPseudo.type&&!oListener[2]) +(oListener[1].handleEvent||oListener[1]).apply(this,[oEventPseudo]);};cXMLHttpRequest.prototype.toString=function(){return'['+"object"+' '+"XMLHttpRequest"+']';};cXMLHttpRequest.toString=function(){return'['+"XMLHttpRequest"+']';};function fReadyStateChange(oRequest){if(cXMLHttpRequest.onreadystatechange) +cXMLHttpRequest.onreadystatechange.apply(oRequest);oRequest.dispatchEvent({'type':"readystatechange",'bubbles':false,'cancelable':false,'timeStamp':new Date+0});};function fGetDocument(oRequest){var oDocument=oRequest.responseXML,sResponse=oRequest.responseText;if(bIE&&sResponse&&oDocument&&!oDocument.documentElement&&oRequest.getResponseHeader("Content-Type").match(/[^\/]+\/[^\+]+\+xml/)){oDocument=new window.ActiveXObject("Microsoft.XMLDOM");oDocument.async=false;oDocument.validateOnParse=false;oDocument.loadXML(sResponse);} +if(oDocument) +if((bIE&&oDocument.parseError!=0)||!oDocument.documentElement||(oDocument.documentElement&&oDocument.documentElement.tagName=="parsererror")) +return null;return oDocument;};function fSynchronizeValues(oRequest){try{oRequest.responseText=oRequest._object.responseText;}catch(e){} +try{oRequest.responseXML=fGetDocument(oRequest._object);}catch(e){} +try{oRequest.status=oRequest._object.status;}catch(e){} +try{oRequest.statusText=oRequest._object.statusText;}catch(e){}};function fCleanTransport(oRequest){oRequest._object.onreadystatechange=new window.Function;};if(!window.Function.prototype.apply){window.Function.prototype.apply=function(oRequest,oArguments){if(!oArguments) +oArguments=[];oRequest.__func=this;oRequest.__func(oArguments[0],oArguments[1],oArguments[2],oArguments[3],oArguments[4]);delete oRequest.__func;};};OpenLayers.Request.XMLHttpRequest=cXMLHttpRequest;})();OpenLayers.Format.KML=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{kml:"http://www.opengis.net/kml/2.2",gx:"http://www.google.com/kml/ext/2.2"},kmlns:"http://earth.google.com/kml/2.0",placemarksDesc:"No description available",foldersName:"OpenLayers export",foldersDesc:"Exported on "+new Date(),extractAttributes:true,extractStyles:false,extractTracks:false,trackAttributes:null,internalns:null,features:null,styles:null,styleBaseUrl:"",fetched:null,maxDepth:0,initialize:function(options){this.regExes={trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g),kmlColor:(/(\w{2})(\w{2})(\w{2})(\w{2})/),kmlIconPalette:(/root:\/\/icons\/palette-(\d+)(\.\w+)/),straightBracket:(/\$\[(.*?)\]/g)};this.externalProjection=new OpenLayers.Projection("EPSG:4326");OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){this.features=[];this.styles={};this.fetched={};var options={depth:0,styleBaseUrl:this.styleBaseUrl};return this.parseData(data,options);},parseData:function(data,options){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);} +var types=["Link","NetworkLink","Style","StyleMap","Placemark"];for(var i=0,len=types.length;i=this.maxDepth){return false;} +var newOptions=OpenLayers.Util.extend({},options);newOptions.depth++;for(var i=0,len=nodes.length;i0){var track=tracks[0];var container={features:[],feature:feature};this.readNode(track,container);if(container.features.length>0){features.push.apply(features,container.features);}}}else{features.push(feature);}}else{throw"Bad Placemark: "+i;}} +this.features=this.features.concat(features);},readers:{"kml":{"when":function(node,container){container.whens.push(OpenLayers.Date.parse(this.getChildValue(node)));},"_trackPointAttribute":function(node,container){var name=node.nodeName.split(":").pop();container.attributes[name].push(this.getChildValue(node));}},"gx":{"Track":function(node,container){var obj={whens:[],points:[],angles:[]};if(this.trackAttributes){var name;obj.attributes={};for(var i=0,ii=this.trackAttributes.length;i0;if(hasAngles&&obj.whens.length!==obj.angles.length){throw new Error("gx:Track with unequal number of when ("+obj.whens.length+") and gx:angles ("+obj.angles.length+") elements.");} +var feature,point,angles;for(var i=0,ii=obj.whens.length;i2){point.z=parseFloat(coords[2]);} +container.points.push(point);},"angles":function(node,container){var str=this.getChildValue(node);var parts=str.replace(this.regExes.trimSpace,"").split(/\s+/);container.angles.push(parts);}}},parseFeature:function(node){var order=["MultiGeometry","Polygon","LineString","Point"];var type,nodeList,geometry,parser;for(var i=0,len=order.length;i0){var parser=this.parseGeometry[type.toLowerCase()];if(parser){geometry=parser.apply(this,[nodeList[0]]);if(this.internalProjection&&this.externalProjection){geometry.transform(this.externalProjection,this.internalProjection);}}else{OpenLayers.Console.error(OpenLayers.i18n("unsupportedGeometryType",{'geomType':type}));} +break;}} +var attributes;if(this.extractAttributes){attributes=this.parseAttributes(node);} +var feature=new OpenLayers.Feature.Vector(geometry,attributes);var fid=node.getAttribute("id")||node.getAttribute("name");if(fid!=null){feature.fid=fid;} +return feature;},getStyle:function(styleUrl,options){var styleBaseUrl=OpenLayers.Util.removeTail(styleUrl);var newOptions=OpenLayers.Util.extend({},options);newOptions.depth++;newOptions.styleBaseUrl=styleBaseUrl;if(!this.styles[styleUrl]&&!OpenLayers.String.startsWith(styleUrl,"#")&&newOptions.depth<=this.maxDepth&&!this.fetched[styleBaseUrl]){var data=this.fetchLink(styleBaseUrl);if(data){this.parseData(data,newOptions);}} +var style=OpenLayers.Util.extend({},this.styles[styleUrl]);return style;},parseGeometry:{point:function(node){var nodeList=this.getElementsByTagNameNS(node,this.internalns,"coordinates");var coords=[];if(nodeList.length>0){var coordString=nodeList[0].firstChild.nodeValue;coordString=coordString.replace(this.regExes.removeSpace,"");coords=coordString.split(",");} +var point=null;if(coords.length>1){if(coords.length==2){coords[2]=null;} +point=new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}else{throw"Bad coordinate string: "+coordString;} +return point;},linestring:function(node,ring){var nodeList=this.getElementsByTagNameNS(node,this.internalns,"coordinates");var line=null;if(nodeList.length>0){var coordString=this.getChildValue(nodeList[0]);coordString=coordString.replace(this.regExes.trimSpace,"");coordString=coordString.replace(this.regExes.trimComma,",");var pointList=coordString.split(this.regExes.splitSpace);var numPoints=pointList.length;var points=new Array(numPoints);var coords,numCoords;for(var i=0;i1){if(coords.length==2){coords[2]=null;} +points[i]=new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}else{throw"Bad LineString point coordinates: "+ +pointList[i];}} +if(numPoints){if(ring){line=new OpenLayers.Geometry.LinearRing(points);}else{line=new OpenLayers.Geometry.LineString(points);}}else{throw"Bad LineString coordinates: "+coordString;}} +return line;},polygon:function(node){var nodeList=this.getElementsByTagNameNS(node,this.internalns,"LinearRing");var numRings=nodeList.length;var components=new Array(numRings);if(numRings>0){var ring;for(var i=0,len=nodeList.length;i=1&&grandchildren.length<=3){var grandchild;switch(grandchildren.length){case 1:grandchild=grandchildren[0];break;case 2:var c1=grandchildren[0];var c2=grandchildren[1];grandchild=(c1.nodeType==3||c1.nodeType==4)?c1:c2;break;case 3:default:grandchild=grandchildren[1];break;} +if(grandchild.nodeType==3||grandchild.nodeType==4){var name=(child.prefix)?child.nodeName.split(":")[1]:child.nodeName;var value=OpenLayers.Util.getXmlNodeValue(grandchild);if(value){value=value.replace(this.regExes.trimSpace,"");attributes[name]=value;}}}}} +return attributes;},parseExtendedData:function(node){var attributes={};var i,len,data,key;var dataNodes=node.getElementsByTagName("Data");for(i=0,len=dataNodes.length;i"+ +this.contentDiv.innerHTML+"
    ";var containerElement=(this.map)?this.map.layerContainerDiv:document.body;var realSize=OpenLayers.Util.getRenderedDimensions(preparedHTML,null,{displayClass:this.displayClass,containerElement:containerElement});var safeSize=this.getSafeContentSize(realSize);var newSize=null;if(safeSize.equals(realSize)){newSize=realSize;}else{var fixedSize=new OpenLayers.Size();fixedSize.w=(safeSize.w(mapSize.w-this.map.paddingForPopups.right)){newTL.x=mapSize.w-this.map.paddingForPopups.right-this.size.w;} +if(origTL.y(mapSize.h-this.map.paddingForPopups.bottom)){newTL.y=mapSize.h-this.map.paddingForPopups.bottom-this.size.h;} +var dx=origTL.x-newTL.x;var dy=origTL.y-newTL.y;this.map.pan(dx,dy);},registerEvents:function(){this.events=new OpenLayers.Events(this,this.div,null,true);function onTouchstart(evt){OpenLayers.Event.stop(evt,true);} +this.events.on({"mousedown":this.onmousedown,"mousemove":this.onmousemove,"mouseup":this.onmouseup,"click":this.onclick,"mouseout":this.onmouseout,"dblclick":this.ondblclick,"touchstart":onTouchstart,scope:this});},onmousedown:function(evt){this.mousedown=true;OpenLayers.Event.stop(evt,true);},onmousemove:function(evt){if(this.mousedown){OpenLayers.Event.stop(evt,true);}},onmouseup:function(evt){if(this.mousedown){this.mousedown=false;OpenLayers.Event.stop(evt,true);}},onclick:function(evt){OpenLayers.Event.stop(evt,true);},onmouseout:function(evt){this.mousedown=false;},ondblclick:function(evt){OpenLayers.Event.stop(evt,true);},CLASS_NAME:"OpenLayers.Popup"});OpenLayers.Popup.WIDTH=200;OpenLayers.Popup.HEIGHT=200;OpenLayers.Popup.COLOR="white";OpenLayers.Popup.OPACITY=1;OpenLayers.Popup.BORDER="0px";OpenLayers.Popup.Anchored=OpenLayers.Class(OpenLayers.Popup,{relativePosition:null,keepInMap:true,anchor:null,initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){var newArguments=[id,lonlat,contentSize,contentHTML,closeBox,closeBoxCallback];OpenLayers.Popup.prototype.initialize.apply(this,newArguments);this.anchor=(anchor!=null)?anchor:{size:new OpenLayers.Size(0,0),offset:new OpenLayers.Pixel(0,0)};},destroy:function(){this.anchor=null;this.relativePosition=null;OpenLayers.Popup.prototype.destroy.apply(this,arguments);},show:function(){this.updatePosition();OpenLayers.Popup.prototype.show.apply(this,arguments);},moveTo:function(px){var oldRelativePosition=this.relativePosition;this.relativePosition=this.calculateRelativePosition(px);var newPx=this.calculateNewPx(px);var newArguments=new Array(newPx);OpenLayers.Popup.prototype.moveTo.apply(this,newArguments);if(this.relativePosition!=oldRelativePosition){this.updateRelativePosition();}},setSize:function(contentSize){OpenLayers.Popup.prototype.setSize.apply(this,arguments);if((this.lonlat)&&(this.map)){var px=this.map.getLayerPxFromLonLat(this.lonlat);this.moveTo(px);}},calculateRelativePosition:function(px){var lonlat=this.map.getLonLatFromLayerPx(px);var extent=this.map.getExtent();var quadrant=extent.determineQuadrant(lonlat);return OpenLayers.Bounds.oppositeQuadrant(quadrant);},updateRelativePosition:function(){},calculateNewPx:function(px){var newPx=px.offset(this.anchor.offset);var size=this.size||this.contentSize;var top=(this.relativePosition.charAt(0)=='t');newPx.y+=(top)?-size.h:this.anchor.size.h;var left=(this.relativePosition.charAt(1)=='l');newPx.x+=(left)?-size.w:this.anchor.size.w;return newPx;},CLASS_NAME:"OpenLayers.Popup.Anchored"});OpenLayers.Rico=OpenLayers.Rico||{};OpenLayers.Rico.Color=OpenLayers.Class({initialize:function(red,green,blue){this.rgb={r:red,g:green,b:blue};},setRed:function(r){this.rgb.r=r;},setGreen:function(g){this.rgb.g=g;},setBlue:function(b){this.rgb.b=b;},setHue:function(h){var hsb=this.asHSB();hsb.h=h;this.rgb=OpenLayers.Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},setSaturation:function(s){var hsb=this.asHSB();hsb.s=s;this.rgb=OpenLayers.Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},setBrightness:function(b){var hsb=this.asHSB();hsb.b=b;this.rgb=OpenLayers.Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},darken:function(percent){var hsb=this.asHSB();this.rgb=OpenLayers.Rico.Color.HSBtoRGB(hsb.h,hsb.s,Math.max(hsb.b-percent,0));},brighten:function(percent){var hsb=this.asHSB();this.rgb=OpenLayers.Rico.Color.HSBtoRGB(hsb.h,hsb.s,Math.min(hsb.b+percent,1));},blend:function(other){this.rgb.r=Math.floor((this.rgb.r+other.rgb.r)/2);this.rgb.g=Math.floor((this.rgb.g+other.rgb.g)/2);this.rgb.b=Math.floor((this.rgb.b+other.rgb.b)/2);},isBright:function(){var hsb=this.asHSB();return this.asHSB().b>0.5;},isDark:function(){return!this.isBright();},asRGB:function(){return"rgb("+this.rgb.r+","+this.rgb.g+","+this.rgb.b+")";},asHex:function(){return"#"+this.rgb.r.toColorPart()+this.rgb.g.toColorPart()+this.rgb.b.toColorPart();},asHSB:function(){return OpenLayers.Rico.Color.RGBtoHSB(this.rgb.r,this.rgb.g,this.rgb.b);},toString:function(){return this.asHex();}});OpenLayers.Rico.Color.createFromHex=function(hexCode){if(hexCode.length==4){var shortHexCode=hexCode;var hexCode='#';for(var i=1;i<4;i++){hexCode+=(shortHexCode.charAt(i)+ +shortHexCode.charAt(i));}} +if(hexCode.indexOf('#')==0){hexCode=hexCode.substring(1);} +var red=hexCode.substring(0,2);var green=hexCode.substring(2,4);var blue=hexCode.substring(4,6);return new OpenLayers.Rico.Color(parseInt(red,16),parseInt(green,16),parseInt(blue,16));};OpenLayers.Rico.Color.createColorFromBackground=function(elem){var actualColor=OpenLayers.Element.getStyle(OpenLayers.Util.getElement(elem),"backgroundColor");if(actualColor=="transparent"&&elem.parentNode){return OpenLayers.Rico.Color.createColorFromBackground(elem.parentNode);} +if(actualColor==null){return new OpenLayers.Rico.Color(255,255,255);} +if(actualColor.indexOf("rgb(")==0){var colors=actualColor.substring(4,actualColor.length-1);var colorArray=colors.split(",");return new OpenLayers.Rico.Color(parseInt(colorArray[0]),parseInt(colorArray[1]),parseInt(colorArray[2]));} +else if(actualColor.indexOf("#")==0){return OpenLayers.Rico.Color.createFromHex(actualColor);} +else{return new OpenLayers.Rico.Color(255,255,255);}};OpenLayers.Rico.Color.HSBtoRGB=function(hue,saturation,brightness){var red=0;var green=0;var blue=0;if(saturation==0){red=parseInt(brightness*255.0+0.5);green=red;blue=red;} +else{var h=(hue-Math.floor(hue))*6.0;var f=h-Math.floor(h);var p=brightness*(1.0-saturation);var q=brightness*(1.0-saturation*f);var t=brightness*(1.0-(saturation*(1.0-f)));switch(parseInt(h)){case 0:red=(brightness*255.0+0.5);green=(t*255.0+0.5);blue=(p*255.0+0.5);break;case 1:red=(q*255.0+0.5);green=(brightness*255.0+0.5);blue=(p*255.0+0.5);break;case 2:red=(p*255.0+0.5);green=(brightness*255.0+0.5);blue=(t*255.0+0.5);break;case 3:red=(p*255.0+0.5);green=(q*255.0+0.5);blue=(brightness*255.0+0.5);break;case 4:red=(t*255.0+0.5);green=(p*255.0+0.5);blue=(brightness*255.0+0.5);break;case 5:red=(brightness*255.0+0.5);green=(p*255.0+0.5);blue=(q*255.0+0.5);break;}} +return{r:parseInt(red),g:parseInt(green),b:parseInt(blue)};};OpenLayers.Rico.Color.RGBtoHSB=function(r,g,b){var hue;var saturation;var brightness;var cmax=(r>g)?r:g;if(b>cmax){cmax=b;} +var cmin=(r"+el.innerHTML+"
    ";},_roundTopCorners:function(el,color,bgColor){var corner=this._createCorner(bgColor);for(var i=0;i=0;i--){corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom"));} +el.style.paddingBottom=0;el.appendChild(corner);},_createCorner:function(bgColor){var corner=document.createElement("div");corner.style.backgroundColor=(this._isTransparent()?"transparent":bgColor);return corner;},_createCornerSlice:function(color,bgColor,n,position){var slice=document.createElement("span");var inStyle=slice.style;inStyle.backgroundColor=color;inStyle.display="block";inStyle.height="1px";inStyle.overflow="hidden";inStyle.fontSize="1px";var borderColor=this._borderColor(color,bgColor);if(this.options.border&&n==0){inStyle.borderTopStyle="solid";inStyle.borderTopWidth="1px";inStyle.borderLeftWidth="0px";inStyle.borderRightWidth="0px";inStyle.borderBottomWidth="0px";inStyle.height="0px";inStyle.borderColor=borderColor;} +else if(borderColor){inStyle.borderColor=borderColor;inStyle.borderStyle="solid";inStyle.borderWidth="0px 1px";} +if(!this.options.compact&&(n==(this.options.numSlices-1))){inStyle.height="2px";} +this._setMargin(slice,n,position);this._setBorder(slice,n,position);return slice;},_setOptions:function(options){this.options={corners:"all",color:"fromElement",bgColor:"fromParent",blend:true,border:false,compact:false};OpenLayers.Util.extend(this.options,options||{});this.options.numSlices=this.options.compact?2:4;if(this._isTransparent()){this.options.blend=false;}},_whichSideTop:function(){if(this._hasString(this.options.corners,"all","top")){return"";} +if(this.options.corners.indexOf("tl")>=0&&this.options.corners.indexOf("tr")>=0){return"";} +if(this.options.corners.indexOf("tl")>=0){return"left";}else if(this.options.corners.indexOf("tr")>=0){return"right";} +return"";},_whichSideBottom:function(){if(this._hasString(this.options.corners,"all","bottom")){return"";} +if(this.options.corners.indexOf("bl")>=0&&this.options.corners.indexOf("br")>=0){return"";} +if(this.options.corners.indexOf("bl")>=0){return"left";}else if(this.options.corners.indexOf("br")>=0){return"right";} +return"";},_borderColor:function(color,bgColor){if(color=="transparent"){return bgColor;}else if(this.options.border){return this.options.border;}else if(this.options.blend){return this._blend(bgColor,color);}else{return"";}},_setMargin:function(el,n,corners){var marginSize=this._marginSize(n);var whichSide=corners=="top"?this._whichSideTop():this._whichSideBottom();if(whichSide=="left"){el.style.marginLeft=marginSize+"px";el.style.marginRight="0px";} +else if(whichSide=="right"){el.style.marginRight=marginSize+"px";el.style.marginLeft="0px";} +else{el.style.marginLeft=marginSize+"px";el.style.marginRight=marginSize+"px";}},_setBorder:function(el,n,corners){var borderSize=this._borderSize(n);var whichSide=corners=="top"?this._whichSideTop():this._whichSideBottom();if(whichSide=="left"){el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth="0px";} +else if(whichSide=="right"){el.style.borderRightWidth=borderSize+"px";el.style.borderLeftWidth="0px";} +else{el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth=borderSize+"px";} +if(this.options.border!=false){el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth=borderSize+"px";}},_marginSize:function(n){if(this._isTransparent()){return 0;} +var marginSizes=[5,3,2,1];var blendedMarginSizes=[3,2,1,0];var compactMarginSizes=[2,1];var smBlendedMarginSizes=[1,0];if(this.options.compact&&this.options.blend){return smBlendedMarginSizes[n];}else if(this.options.compact){return compactMarginSizes[n];}else if(this.options.blend){return blendedMarginSizes[n];}else{return marginSizes[n];}},_borderSize:function(n){var transparentBorderSizes=[5,3,2,1];var blendedBorderSizes=[2,1,1,1];var compactBorderSizes=[1,0];var actualBorderSizes=[0,2,0,0];if(this.options.compact&&(this.options.blend||this._isTransparent())){return 1;}else if(this.options.compact){return compactBorderSizes[n];}else if(this.options.blend){return blendedBorderSizes[n];}else if(this.options.border){return actualBorderSizes[n];}else if(this._isTransparent()){return transparentBorderSizes[n];} +return 0;},_hasString:function(str){for(var i=1;i=0){return true;}return false;},_blend:function(c1,c2){var cc1=OpenLayers.Rico.Color.createFromHex(c1);cc1.blend(OpenLayers.Rico.Color.createFromHex(c2));return cc1;},_background:function(el){try{return OpenLayers.Rico.Color.createColorFromBackground(el).asHex();}catch(err){return"#ffffff";}},_isTransparent:function(){return this.options.color=="transparent";},_isTopRounded:function(){return this._hasString(this.options.corners,"all","top","tl","tr");},_isBottomRounded:function(){return this._hasString(this.options.corners,"all","bottom","bl","br");},_hasSingleTextChild:function(el){return el.childNodes.length==1&&el.childNodes[0].nodeType==3;}};OpenLayers.Popup.AnchoredBubble=OpenLayers.Class(OpenLayers.Popup.Anchored,{rounded:false,initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){this.padding=new OpenLayers.Bounds(0,OpenLayers.Popup.AnchoredBubble.CORNER_SIZE,0,OpenLayers.Popup.AnchoredBubble.CORNER_SIZE);OpenLayers.Popup.Anchored.prototype.initialize.apply(this,arguments);},draw:function(px){OpenLayers.Popup.Anchored.prototype.draw.apply(this,arguments);this.setContentHTML();this.setBackgroundColor();this.setOpacity();return this.div;},updateRelativePosition:function(){this.setRicoCorners();},setSize:function(contentSize){OpenLayers.Popup.Anchored.prototype.setSize.apply(this,arguments);this.setRicoCorners();},setBackgroundColor:function(color){if(color!=undefined){this.backgroundColor=color;} +if(this.div!=null){if(this.contentDiv!=null){this.div.style.background="transparent";OpenLayers.Rico.Corner.changeColor(this.groupDiv,this.backgroundColor);}}},setOpacity:function(opacity){OpenLayers.Popup.Anchored.prototype.setOpacity.call(this,opacity);if(this.div!=null){if(this.groupDiv!=null){OpenLayers.Rico.Corner.changeOpacity(this.groupDiv,this.opacity);}}},setBorder:function(border){this.border=0;},setRicoCorners:function(){var corners=this.getCornersToRound(this.relativePosition);var options={corners:corners,color:this.backgroundColor,bgColor:"transparent",blend:false};if(!this.rounded){OpenLayers.Rico.Corner.round(this.div,options);this.rounded=true;}else{OpenLayers.Rico.Corner.reRound(this.groupDiv,options);this.setBackgroundColor();this.setOpacity();}},getCornersToRound:function(){var corners=['tl','tr','bl','br'];var corner=OpenLayers.Bounds.oppositeQuadrant(this.relativePosition);OpenLayers.Util.removeItem(corners,corner);return corners.join(" ");},CLASS_NAME:"OpenLayers.Popup.AnchoredBubble"});OpenLayers.Popup.AnchoredBubble.CORNER_SIZE=5;OpenLayers.Protocol.WFS.v1=OpenLayers.Class(OpenLayers.Protocol,{version:null,srsName:"EPSG:4326",featureType:null,featureNS:null,geometryName:"the_geom",schema:null,featurePrefix:"feature",formatOptions:null,readFormat:null,readOptions:null,initialize:function(options){OpenLayers.Protocol.prototype.initialize.apply(this,[options]);if(!options.format){this.format=OpenLayers.Format.WFST(OpenLayers.Util.extend({version:this.version,featureType:this.featureType,featureNS:this.featureNS,featurePrefix:this.featurePrefix,geometryName:this.geometryName,srsName:this.srsName,schema:this.schema},this.formatOptions));} +if(!options.geometryName&&parseFloat(this.format.version)>1.0){this.setGeometryName(null);}},destroy:function(){if(this.options&&!this.options.format){this.format.destroy();} +this.format=null;OpenLayers.Protocol.prototype.destroy.apply(this);},read:function(options){OpenLayers.Protocol.prototype.read.apply(this,arguments);options=OpenLayers.Util.extend({},options);OpenLayers.Util.applyDefaults(options,this.options||{});var response=new OpenLayers.Protocol.Response({requestType:"read"});var data=OpenLayers.Format.XML.prototype.write.apply(this.format,[this.format.writeNode("wfs:GetFeature",options)]);response.priv=OpenLayers.Request.POST({url:options.url,callback:this.createCallback(this.handleRead,response,options),params:options.params,headers:options.headers,data:data});return response;},setFeatureType:function(featureType){this.featureType=featureType;this.format.featureType=featureType;},setGeometryName:function(geometryName){this.geometryName=geometryName;this.format.geometryName=geometryName;},handleRead:function(response,options){options=OpenLayers.Util.extend({},options);OpenLayers.Util.applyDefaults(options,this.options);if(options.callback){var request=response.priv;if(request.status>=200&&request.status<300){var result=this.parseResponse(request,options.readOptions);if(result&&result.success!==false){if(options.readOptions&&options.readOptions.output=="object"){OpenLayers.Util.extend(response,result);}else{response.features=result;} +response.code=OpenLayers.Protocol.Response.SUCCESS;}else{response.code=OpenLayers.Protocol.Response.FAILURE;response.error=result;}}else{response.code=OpenLayers.Protocol.Response.FAILURE;} +options.callback.call(options.scope,response);}},parseResponse:function(request,options){var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;} +if(!doc||doc.length<=0){return null;} +var result=(this.readFormat!==null)?this.readFormat.read(doc):this.format.read(doc,options);if(!this.featureNS){var format=this.readFormat||this.format;this.featureNS=format.featureNS;format.autoConfig=false;if(!this.geometryName){this.setGeometryName(format.geometryName);}} +return result;},commit:function(features,options){options=OpenLayers.Util.extend({},options);OpenLayers.Util.applyDefaults(options,this.options);var response=new OpenLayers.Protocol.Response({requestType:"commit",reqFeatures:features});response.priv=OpenLayers.Request.POST({url:options.url,headers:options.headers,data:this.format.write(features,options),callback:this.createCallback(this.handleCommit,response,options)});return response;},handleCommit:function(response,options){if(options.callback){var request=response.priv;var data=request.responseXML;if(!data||!data.documentElement){data=request.responseText;} +var obj=this.format.read(data)||{};response.insertIds=obj.insertIds||[];if(obj.success){response.code=OpenLayers.Protocol.Response.SUCCESS;}else{response.code=OpenLayers.Protocol.Response.FAILURE;response.error=obj;} +options.callback.call(options.scope,response);}},filterDelete:function(filter,options){options=OpenLayers.Util.extend({},options);OpenLayers.Util.applyDefaults(options,this.options);var response=new OpenLayers.Protocol.Response({requestType:"commit"});var root=this.format.createElementNSPlus("wfs:Transaction",{attributes:{service:"WFS",version:this.version}});var deleteNode=this.format.createElementNSPlus("wfs:Delete",{attributes:{typeName:(options.featureNS?this.featurePrefix+":":"")+ +options.featureType}});if(options.featureNS){deleteNode.setAttribute("xmlns:"+this.featurePrefix,options.featureNS);} +var filterNode=this.format.writeNode("ogc:Filter",filter);deleteNode.appendChild(filterNode);root.appendChild(deleteNode);var data=OpenLayers.Format.XML.prototype.write.apply(this.format,[root]);return OpenLayers.Request.POST({url:this.url,callback:options.callback||function(){},data:data});},abort:function(response){if(response){response.priv.abort();}},CLASS_NAME:"OpenLayers.Protocol.WFS.v1"});OpenLayers.Handler.Point=OpenLayers.Class(OpenLayers.Handler,{point:null,layer:null,multi:false,mouseDown:false,stoppedDown:null,lastDown:null,lastUp:null,persist:false,stopDown:false,stopUp:false,layerOptions:null,pixelTolerance:5,touch:false,lastTouchPx:null,initialize:function(control,callbacks,options){if(!(options&&options.layerOptions&&options.layerOptions.styleMap)){this.style=OpenLayers.Util.extend(OpenLayers.Feature.Vector.style['default'],{});} +OpenLayers.Handler.prototype.initialize.apply(this,arguments);},activate:function(){if(!OpenLayers.Handler.prototype.activate.apply(this,arguments)){return false;} +var options=OpenLayers.Util.extend({displayInLayerSwitcher:false,calculateInRange:OpenLayers.Function.True},this.layerOptions);this.layer=new OpenLayers.Layer.Vector(this.CLASS_NAME,options);this.map.addLayer(this.layer);return true;},createFeature:function(pixel){var lonlat=this.map.getLonLatFromPixel(pixel);var geometry=new OpenLayers.Geometry.Point(lonlat.lon,lonlat.lat);this.point=new OpenLayers.Feature.Vector(geometry);this.callback("create",[this.point.geometry,this.point]);this.point.geometry.clearBounds();this.layer.addFeatures([this.point],{silent:true});},deactivate:function(){if(!OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){return false;} +this.cancel();if(this.layer.map!=null){this.destroyFeature(true);this.layer.destroy(false);} +this.layer=null;this.touch=false;return true;},destroyFeature:function(force){if(this.layer&&(force||!this.persist)){this.layer.destroyFeatures();} +this.point=null;},destroyPersistedFeature:function(){var layer=this.layer;if(layer&&layer.features.length>1){this.layer.features[0].destroy();}},finalize:function(cancel){var key=cancel?"cancel":"done";this.mouseDown=false;this.lastDown=null;this.lastUp=null;this.lastTouchPx=null;this.callback(key,[this.geometryClone()]);this.destroyFeature(cancel);},cancel:function(){this.finalize(true);},click:function(evt){OpenLayers.Event.stop(evt);return false;},dblclick:function(evt){OpenLayers.Event.stop(evt);return false;},modifyFeature:function(pixel){if(!this.point){this.createFeature(pixel);} +var lonlat=this.map.getLonLatFromPixel(pixel);this.point.geometry.x=lonlat.lon;this.point.geometry.y=lonlat.lat;this.callback("modify",[this.point.geometry,this.point,false]);this.point.geometry.clearBounds();this.drawFeature();},drawFeature:function(){this.layer.drawFeature(this.point,this.style);},getGeometry:function(){var geometry=this.point&&this.point.geometry;if(geometry&&this.multi){geometry=new OpenLayers.Geometry.MultiPoint([geometry]);} +return geometry;},geometryClone:function(){var geom=this.getGeometry();return geom&&geom.clone();},mousedown:function(evt){return this.down(evt);},touchstart:function(evt){if(!this.touch){this.touch=true;this.map.events.un({mousedown:this.mousedown,mouseup:this.mouseup,mousemove:this.mousemove,click:this.click,dblclick:this.dblclick,scope:this});} +this.lastTouchPx=evt.xy;return this.down(evt);},mousemove:function(evt){return this.move(evt);},touchmove:function(evt){this.lastTouchPx=evt.xy;return this.move(evt);},mouseup:function(evt){return this.up(evt);},touchend:function(evt){evt.xy=this.lastTouchPx;return this.up(evt);},down:function(evt){this.mouseDown=true;this.lastDown=evt.xy;if(!this.touch){this.modifyFeature(evt.xy);} +this.stoppedDown=this.stopDown;return!this.stopDown;},move:function(evt){if(!this.touch&&(!this.mouseDown||this.stoppedDown)){this.modifyFeature(evt.xy);} +return true;},up:function(evt){this.mouseDown=false;this.stoppedDown=this.stopDown;if(!this.checkModifiers(evt)){return true;} +if(this.lastUp&&this.lastUp.equals(evt.xy)){return true;} +if(this.lastDown&&this.passesTolerance(this.lastDown,evt.xy,this.pixelTolerance)){if(this.touch){this.modifyFeature(evt.xy);} +if(this.persist){this.destroyPersistedFeature();} +this.lastUp=evt.xy;this.finalize();return!this.stopUp;}else{return true;}},mouseout:function(evt){if(OpenLayers.Util.mouseLeft(evt,this.map.eventsDiv)){this.stoppedDown=this.stopDown;this.mouseDown=false;}},passesTolerance:function(pixel1,pixel2,tolerance){var passes=true;if(tolerance!=null&&pixel1&&pixel2){var dist=pixel1.distanceTo(pixel2);if(dist>tolerance){passes=false;}} +return passes;},CLASS_NAME:"OpenLayers.Handler.Point"});OpenLayers.Handler.Path=OpenLayers.Class(OpenLayers.Handler.Point,{line:null,maxVertices:null,doubleTouchTolerance:20,freehand:false,freehandToggle:'shiftKey',timerId:null,redoStack:null,initialize:function(control,callbacks,options){OpenLayers.Handler.Point.prototype.initialize.apply(this,arguments);},createFeature:function(pixel){var lonlat=this.map.getLonLatFromPixel(pixel);var geometry=new OpenLayers.Geometry.Point(lonlat.lon,lonlat.lat);this.point=new OpenLayers.Feature.Vector(geometry);this.line=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString([this.point.geometry]));this.callback("create",[this.point.geometry,this.getSketch()]);this.point.geometry.clearBounds();this.layer.addFeatures([this.line,this.point],{silent:true});},destroyFeature:function(force){OpenLayers.Handler.Point.prototype.destroyFeature.call(this,force);this.line=null;},destroyPersistedFeature:function(){var layer=this.layer;if(layer&&layer.features.length>2){this.layer.features[0].destroy();}},removePoint:function(){if(this.point){this.layer.removeFeatures([this.point]);}},addPoint:function(pixel){this.layer.removeFeatures([this.point]);var lonlat=this.control.map.getLonLatFromPixel(pixel);this.point=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(lonlat.lon,lonlat.lat));this.line.geometry.addComponent(this.point.geometry,this.line.geometry.components.length);this.layer.addFeatures([this.point]);this.callback("point",[this.point.geometry,this.getGeometry()]);this.callback("modify",[this.point.geometry,this.getSketch()]);this.drawFeature();delete this.redoStack;},insertXY:function(x,y){this.line.geometry.addComponent(new OpenLayers.Geometry.Point(x,y),this.getCurrentPointIndex());this.drawFeature();delete this.redoStack;},insertDeltaXY:function(dx,dy){var previousIndex=this.getCurrentPointIndex()-1;var p0=this.line.geometry.components[previousIndex];if(p0&&!isNaN(p0.x)&&!isNaN(p0.y)){this.insertXY(p0.x+dx,p0.y+dy);}},insertDirectionLength:function(direction,length){direction*=Math.PI/180;var dx=length*Math.cos(direction);var dy=length*Math.sin(direction);this.insertDeltaXY(dx,dy);},insertDeflectionLength:function(deflection,length){var previousIndex=this.getCurrentPointIndex()-1;if(previousIndex>0){var p1=this.line.geometry.components[previousIndex];var p0=this.line.geometry.components[previousIndex-1];var theta=Math.atan2(p1.y-p0.y,p1.x-p0.x);this.insertDirectionLength((theta*180/Math.PI)+deflection,length);}},getCurrentPointIndex:function(){return this.line.geometry.components.length-1;},undo:function(){var geometry=this.line.geometry;var components=geometry.components;var index=this.getCurrentPointIndex()-1;var target=components[index];var undone=geometry.removeComponent(target);if(undone){if(!this.redoStack){this.redoStack=[];} +this.redoStack.push(target);this.drawFeature();} +return undone;},redo:function(){var target=this.redoStack&&this.redoStack.pop();if(target){this.line.geometry.addComponent(target,this.getCurrentPointIndex());this.drawFeature();} +return!!target;},freehandMode:function(evt){return(this.freehandToggle&&evt[this.freehandToggle])?!this.freehand:this.freehand;},modifyFeature:function(pixel,drawing){if(!this.line){this.createFeature(pixel);} +var lonlat=this.control.map.getLonLatFromPixel(pixel);this.point.geometry.x=lonlat.lon;this.point.geometry.y=lonlat.lat;this.callback("modify",[this.point.geometry,this.getSketch(),drawing]);this.point.geometry.clearBounds();this.drawFeature();},drawFeature:function(){this.layer.drawFeature(this.line,this.style);this.layer.drawFeature(this.point,this.style);},getSketch:function(){return this.line;},getGeometry:function(){var geometry=this.line&&this.line.geometry;if(geometry&&this.multi){geometry=new OpenLayers.Geometry.MultiLineString([geometry]);} +return geometry;},touchstart:function(evt){if(this.timerId&&this.passesTolerance(this.lastTouchPx,evt.xy,this.doubleTouchTolerance)){this.finishGeometry();window.clearTimeout(this.timerId);this.timerId=null;return false;}else{if(this.timerId){window.clearTimeout(this.timerId);this.timerId=null;} +this.timerId=window.setTimeout(OpenLayers.Function.bind(function(){this.timerId=null;},this),300);return OpenLayers.Handler.Point.prototype.touchstart.call(this,evt);}},down:function(evt){var stopDown=this.stopDown;if(this.freehandMode(evt)){stopDown=true;} +if(!this.touch&&(!this.lastDown||!this.passesTolerance(this.lastDown,evt.xy,this.pixelTolerance))){this.modifyFeature(evt.xy,!!this.lastUp);} +this.mouseDown=true;this.lastDown=evt.xy;this.stoppedDown=stopDown;return!stopDown;},move:function(evt){if(this.stoppedDown&&this.freehandMode(evt)){if(this.persist){this.destroyPersistedFeature();} +this.addPoint(evt.xy);return false;} +if(!this.touch&&(!this.mouseDown||this.stoppedDown)){this.modifyFeature(evt.xy,!!this.lastUp);} +return true;},up:function(evt){if(this.mouseDown&&(!this.lastUp||!this.lastUp.equals(evt.xy))){if(this.stoppedDown&&this.freehandMode(evt)){if(this.persist){this.destroyPersistedFeature();} +this.removePoint();this.finalize();}else{if(this.passesTolerance(this.lastDown,evt.xy,this.pixelTolerance)){if(this.touch){this.modifyFeature(evt.xy);} +if(this.lastUp==null&&this.persist){this.destroyPersistedFeature();} +this.addPoint(evt.xy);this.lastUp=evt.xy;if(this.line.geometry.components.length===this.maxVertices+1){this.finishGeometry();}}}} +this.stoppedDown=this.stopDown;this.mouseDown=false;return!this.stopUp;},finishGeometry:function(){var index=this.line.geometry.components.length-1;this.line.geometry.removeComponent(this.line.geometry.components[index]);this.removePoint();this.finalize();},dblclick:function(evt){if(!this.freehandMode(evt)){this.finishGeometry();} +return false;},CLASS_NAME:"OpenLayers.Handler.Path"});OpenLayers.Layer.GML=OpenLayers.Class(OpenLayers.Layer.Vector,{loaded:false,format:null,formatOptions:null,initialize:function(name,url,options){var newArguments=[];newArguments.push(name,options);OpenLayers.Layer.Vector.prototype.initialize.apply(this,newArguments);this.url=url;},setVisibility:function(visibility,noEvent){OpenLayers.Layer.Vector.prototype.setVisibility.apply(this,arguments);if(this.visibility&&!this.loaded){this.loadGML();}},moveTo:function(bounds,zoomChanged,minor){OpenLayers.Layer.Vector.prototype.moveTo.apply(this,arguments);if(this.visibility&&!this.loaded){this.loadGML();}},loadGML:function(){if(!this.loaded){this.events.triggerEvent("loadstart");OpenLayers.Request.GET({url:this.url,success:this.requestSuccess,failure:this.requestFailure,scope:this});this.loaded=true;}},setUrl:function(url){this.url=url;this.destroyFeatures();this.loaded=false;this.loadGML();},requestSuccess:function(request){var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;} +var options={};OpenLayers.Util.extend(options,this.formatOptions);if(this.map&&!this.projection.equals(this.map.getProjectionObject())){options.externalProjection=this.projection;options.internalProjection=this.map.getProjectionObject();} +var gml=this.format?new this.format(options):new OpenLayers.Format.GML(options);this.addFeatures(gml.read(doc));this.events.triggerEvent("loadend");},requestFailure:function(request){OpenLayers.Console.userError(OpenLayers.i18n("errorLoadingGML",{'url':this.url}));this.events.triggerEvent("loadend");},CLASS_NAME:"OpenLayers.Layer.GML"});OpenLayers.Format.Context=OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC,{layerOptions:null,layerParams:null,read:function(data,options){var context=OpenLayers.Format.XML.VersionedOGC.prototype.read.apply(this,arguments);var map;if(options&&options.map){this.context=context;if(options.map instanceof OpenLayers.Map){map=this.mergeContextToMap(context,options.map);}else{var mapOptions=options.map;if(OpenLayers.Util.isElement(mapOptions)||typeof mapOptions=="string"){mapOptions={div:mapOptions};} +map=this.contextToMap(context,mapOptions);}}else{map=context;} +return map;},getLayerFromContext:function(layerContext){var i,len;var options={queryable:layerContext.queryable,visibility:layerContext.visibility,maxExtent:layerContext.maxExtent,metadata:OpenLayers.Util.applyDefaults(layerContext.metadata,{styles:layerContext.styles,formats:layerContext.formats,"abstract":layerContext["abstract"],dataURL:layerContext.dataURL}),numZoomLevels:layerContext.numZoomLevels,units:layerContext.units,isBaseLayer:layerContext.isBaseLayer,opacity:layerContext.opacity,displayInLayerSwitcher:layerContext.displayInLayerSwitcher,singleTile:layerContext.singleTile,tileSize:(layerContext.tileSize)?new OpenLayers.Size(layerContext.tileSize.width,layerContext.tileSize.height):undefined,minScale:layerContext.minScale||layerContext.maxScaleDenominator,maxScale:layerContext.maxScale||layerContext.minScaleDenominator,srs:layerContext.srs,dimensions:layerContext.dimensions,metadataURL:layerContext.metadataURL};if(this.layerOptions){OpenLayers.Util.applyDefaults(options,this.layerOptions);} +var params={layers:layerContext.name,transparent:layerContext.transparent,version:layerContext.version};if(layerContext.formats&&layerContext.formats.length>0){params.format=layerContext.formats[0].value;for(i=0,len=layerContext.formats.length;i0){for(i=0,len=layerContext.styles.length;i0){for(var i=0,len=layer.metadata.formats.length;i0){for(var i=0,len=layer.metadata.styles.length;i0){this.read_wmc_OnlineResource(object,links[0]);} +return object.href;},CLASS_NAME:"OpenLayers.Format.WMC.v1"});OpenLayers.Control.PanPanel=OpenLayers.Class(OpenLayers.Control.Panel,{slideFactor:50,slideRatio:null,initialize:function(options){OpenLayers.Control.Panel.prototype.initialize.apply(this,[options]);var options={slideFactor:this.slideFactor,slideRatio:this.slideRatio};this.addControls([new OpenLayers.Control.Pan(OpenLayers.Control.Pan.NORTH,options),new OpenLayers.Control.Pan(OpenLayers.Control.Pan.SOUTH,options),new OpenLayers.Control.Pan(OpenLayers.Control.Pan.EAST,options),new OpenLayers.Control.Pan(OpenLayers.Control.Pan.WEST,options)]);},CLASS_NAME:"OpenLayers.Control.PanPanel"});OpenLayers.Control.Attribution=OpenLayers.Class(OpenLayers.Control,{separator:", ",destroy:function(){this.map.events.un({"removelayer":this.updateAttribution,"addlayer":this.updateAttribution,"changelayer":this.updateAttribution,"changebaselayer":this.updateAttribution,scope:this});OpenLayers.Control.prototype.destroy.apply(this,arguments);},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);this.map.events.on({'changebaselayer':this.updateAttribution,'changelayer':this.updateAttribution,'addlayer':this.updateAttribution,'removelayer':this.updateAttribution,scope:this});this.updateAttribution();return this.div;},updateAttribution:function(){var attributions=[];if(this.map&&this.map.layers){for(var i=0,len=this.map.layers.length;inumRows){text.removeChild(text.lastChild);} +for(var i=0;ithis.nbPoints){this.points.pop();}},end:function(xy){var last,now=new Date().getTime();for(var i=0,l=this.points.length,point;ithis.delay){break;} +last=point;} +if(!last){return;} +var time=new Date().getTime()-last.tick;var dist=Math.sqrt(Math.pow(xy.x-last.xy.x,2)+ +Math.pow(xy.y-last.xy.y,2));var speed=dist/time;if(speed==0||speed0){text=text.substring(index);} +var ajaxResponse=OpenLayers.Util.Try(function(){var xmldom=new ActiveXObject('Microsoft.XMLDOM');xmldom.loadXML(text);return xmldom;},function(){return new DOMParser().parseFromString(text,'text/xml');},function(){var req=new XMLHttpRequest();req.open("GET","data:"+"text/xml"+";charset=utf-8,"+encodeURIComponent(text),false);if(req.overrideMimeType){req.overrideMimeType("text/xml");} +req.send(null);return req.responseXML;});return ajaxResponse;};OpenLayers.Ajax={emptyFunction:function(){},getTransport:function(){return OpenLayers.Util.Try(function(){return new XMLHttpRequest();},function(){return new ActiveXObject('Msxml2.XMLHTTP');},function(){return new ActiveXObject('Microsoft.XMLHTTP');})||false;},activeRequestCount:0};OpenLayers.Ajax.Responders={responders:[],register:function(responderToAdd){for(var i=0;i-1)?'&':'?')+params;}else if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){params+='&_=';}} +try{var response=new OpenLayers.Ajax.Response(this);if(this.options.onCreate){this.options.onCreate(response);} +OpenLayers.Ajax.Responders.dispatch('onCreate',this,response);this.transport.open(this.method.toUpperCase(),this.url,this.options.asynchronous);if(this.options.asynchronous){window.setTimeout(OpenLayers.Function.bind(this.respondToReadyState,this,1),10);} +this.transport.onreadystatechange=OpenLayers.Function.bind(this.onStateChange,this);this.setRequestHeaders();this.body=this.method=='post'?(this.options.postBody||params):null;this.transport.send(this.body);if(!this.options.asynchronous&&this.transport.overrideMimeType){this.onStateChange();}}catch(e){this.dispatchException(e);}},onStateChange:function(){var readyState=this.transport.readyState;if(readyState>1&&!((readyState==4)&&this._complete)){this.respondToReadyState(this.transport.readyState);}},setRequestHeaders:function(){var headers={'X-Requested-With':'XMLHttpRequest','Accept':'text/javascript, text/html, application/xml, text/xml, */*','OpenLayers':true};if(this.method=='post'){headers['Content-type']=this.options.contentType+ +(this.options.encoding?'; charset='+this.options.encoding:'');if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005){headers['Connection']='close';}} +if(typeof this.options.requestHeaders=='object'){var extras=this.options.requestHeaders;if(typeof extras.push=='function'){for(var i=0,length=extras.length;i=200&&status<300);},getStatus:function(){try{return this.transport.status||0;}catch(e){return 0;}},respondToReadyState:function(readyState){var state=OpenLayers.Ajax.Request.Events[readyState];var response=new OpenLayers.Ajax.Response(this);if(state=='Complete'){try{this._complete=true;(this.options['on'+response.status]||this.options['on'+(this.success()?'Success':'Failure')]||OpenLayers.Ajax.emptyFunction)(response);}catch(e){this.dispatchException(e);} +var contentType=response.getHeader('Content-type');} +try{(this.options['on'+state]||OpenLayers.Ajax.emptyFunction)(response);OpenLayers.Ajax.Responders.dispatch('on'+state,this,response);}catch(e){this.dispatchException(e);} +if(state=='Complete'){this.transport.onreadystatechange=OpenLayers.Ajax.emptyFunction;}},getHeader:function(name){try{return this.transport.getResponseHeader(name);}catch(e){return null;}},dispatchException:function(exception){var handler=this.options.onException;if(handler){handler(this,exception);OpenLayers.Ajax.Responders.dispatch('onException',this,exception);}else{var listener=false;var responders=OpenLayers.Ajax.Responders.responders;for(var i=0;i2&&!(!!(window.attachEvent&&!window.opera)))||readyState==4){this.status=this.getStatus();this.statusText=this.getStatusText();this.responseText=transport.responseText==null?'':String(transport.responseText);} +if(readyState==4){var xml=transport.responseXML;this.responseXML=xml===undefined?null:xml;}},getStatus:OpenLayers.Ajax.Request.prototype.getStatus,getStatusText:function(){try{return this.transport.statusText||'';}catch(e){return'';}},getHeader:OpenLayers.Ajax.Request.prototype.getHeader,getResponseHeader:function(name){return this.transport.getResponseHeader(name);}});OpenLayers.Ajax.getElementsByTagNameNS=function(parentnode,nsuri,nsprefix,tagname){var elem=null;if(parentnode.getElementsByTagNameNS){elem=parentnode.getElementsByTagNameNS(nsuri,tagname);}else{elem=parentnode.getElementsByTagName(nsprefix+':'+tagname);} +return elem;};OpenLayers.Ajax.serializeXMLToString=function(xmldom){var serializer=new XMLSerializer();var data=serializer.serializeToString(xmldom);return data;};OpenLayers.Layer.GeoRSS=OpenLayers.Class(OpenLayers.Layer.Markers,{location:null,features:null,formatOptions:null,selectedFeature:null,icon:null,popupSize:null,useFeedTitle:true,initialize:function(name,location,options){OpenLayers.Layer.Markers.prototype.initialize.apply(this,[name,options]);this.location=location;this.features=[];},destroy:function(){OpenLayers.Layer.Markers.prototype.destroy.apply(this,arguments);this.clearFeatures();this.features=null;},loadRSS:function(){if(!this.loaded){this.events.triggerEvent("loadstart");OpenLayers.Request.GET({url:this.location,success:this.parseData,scope:this});this.loaded=true;}},moveTo:function(bounds,zoomChanged,minor){OpenLayers.Layer.Markers.prototype.moveTo.apply(this,arguments);if(this.visibility&&!this.loaded){this.loadRSS();}},parseData:function(ajaxRequest){var doc=ajaxRequest.responseXML;if(!doc||!doc.documentElement){doc=OpenLayers.Format.XML.prototype.read(ajaxRequest.responseText);} +if(this.useFeedTitle){var name=null;try{name=doc.getElementsByTagNameNS('*','title')[0].firstChild.nodeValue;} +catch(e){name=doc.getElementsByTagName('title')[0].firstChild.nodeValue;} +if(name){this.setName(name);}} +var options={};OpenLayers.Util.extend(options,this.formatOptions);if(this.map&&!this.projection.equals(this.map.getProjectionObject())){options.externalProjection=this.projection;options.internalProjection=this.map.getProjectionObject();} +var format=new OpenLayers.Format.GeoRSS(options);var features=format.read(doc);for(var i=0,len=features.length;i';} +contentHTML+=title;if(link){contentHTML+='';} +contentHTML+='';contentHTML+='
    ';contentHTML+=description;contentHTML+='
    ';data['popupContentHTML']=contentHTML;} +var feature=new OpenLayers.Feature(this,location,data);this.features.push(feature);var marker=feature.createMarker();marker.events.register('click',feature,this.markerClick);this.addMarker(marker);} +this.events.triggerEvent("loadend");},markerClick:function(evt){var sameMarkerClicked=(this==this.layer.selectedFeature);this.layer.selectedFeature=(!sameMarkerClicked)?this:null;for(var i=0,len=this.layer.map.popups.length;i0){var feature=this.features[0];OpenLayers.Util.removeItem(this.features,feature);feature.destroy();}}},CLASS_NAME:"OpenLayers.Layer.GeoRSS"});OpenLayers.Format.SLD.v1=OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0,{namespaces:{sld:"http://www.opengis.net/sld",ogc:"http://www.opengis.net/ogc",gml:"http://www.opengis.net/gml",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},defaultPrefix:"sld",schemaLocation:null,multipleSymbolizers:false,featureTypeCounter:null,defaultSymbolizer:{fillColor:"#808080",fillOpacity:1,strokeColor:"#000000",strokeOpacity:1,strokeWidth:1,strokeDashstyle:"solid",pointRadius:3,graphicName:"square"},initialize:function(options){OpenLayers.Format.Filter.v1_0_0.prototype.initialize.apply(this,[options]);},read:function(data,options){options=OpenLayers.Util.applyDefaults(options,this.options);var sld={namedLayers:options.namedLayersAsArray===true?[]:{}};this.readChildNodes(data,sld);return sld;},readers:OpenLayers.Util.applyDefaults({"sld":{"StyledLayerDescriptor":function(node,sld){sld.version=node.getAttribute("version");this.readChildNodes(node,sld);},"Name":function(node,obj){obj.name=this.getChildValue(node);},"Title":function(node,obj){obj.title=this.getChildValue(node);},"Abstract":function(node,obj){obj.description=this.getChildValue(node);},"NamedLayer":function(node,sld){var layer={userStyles:[],namedStyles:[]};this.readChildNodes(node,layer);for(var i=0,len=layer.userStyles.length;i0){clone=style.clone();clone.rules=rulesByZ[zValues[i]];this.writeNode("FeatureTypeStyle",clone,node);}}}else{this.writeNode("FeatureTypeStyle",style,node);} +return node;},"IsDefault":function(bool){return this.createElementNSPlus("sld:IsDefault",{value:(bool)?"1":"0"});},"FeatureTypeStyle":function(style){var node=this.createElementNSPlus("sld:FeatureTypeStyle");for(var i=0,len=style.rules.length;i0){this.writeNode("ogc:PropertyName",{property:item.substring(0,last)},node);node.appendChild(this.createTextNode(item.substring(++last)));}else{node.appendChild(this.createTextNode("${"+item));}} +return node;},"Halo":function(symbolizer){var node=this.createElementNSPlus("sld:Halo");if(symbolizer.haloRadius){this.writeNode("Radius",symbolizer.haloRadius,node);} +if(symbolizer.haloColor||symbolizer.haloOpacity){this.writeNode("Fill",{fillColor:symbolizer.haloColor,fillOpacity:symbolizer.haloOpacity},node);} +return node;},"Radius":function(value){return this.createElementNSPlus("sld:Radius",{value:value});},"RasterSymbolizer":function(symbolizer){var node=this.createElementNSPlus("sld:RasterSymbolizer");if(symbolizer.geometry){this.writeNode("Geometry",symbolizer.geometry,node);} +if(symbolizer.opacity){this.writeNode("Opacity",symbolizer.opacity,node);} +if(symbolizer.colorMap){this.writeNode("ColorMap",symbolizer.colorMap,node);} +return node;},"Geometry":function(geometry){var node=this.createElementNSPlus("sld:Geometry");if(geometry.property){this.writeNode("ogc:PropertyName",geometry,node);} +return node;},"ColorMap":function(colorMap){var node=this.createElementNSPlus("sld:ColorMap");for(var i=0,len=colorMap.length;i0){layerContext.maxScale=minScaleDenominator;}},read_sld_MaxScaleDenominator:function(layerContext,node){layerContext.minScale=parseFloat(this.getChildValue(node));},read_wmc_SRS:function(layerContext,node){if(!("srs"in layerContext)){layerContext.srs={};} +layerContext.srs[this.getChildValue(node)]=true;},write_wmc_Layer:function(context){var node=OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply(this,[context]);if(context.maxScale){var minSD=this.createElementNS(this.namespaces.sld,"sld:MinScaleDenominator");minSD.appendChild(this.createTextNode(context.maxScale.toPrecision(16)));node.appendChild(minSD);} +if(context.minScale){var maxSD=this.createElementNS(this.namespaces.sld,"sld:MaxScaleDenominator");maxSD.appendChild(this.createTextNode(context.minScale.toPrecision(16)));node.appendChild(maxSD);} +if(context.srs){for(var name in context.srs){node.appendChild(this.createElementDefaultNS("SRS",name));}} +node.appendChild(this.write_wmc_FormatList(context));node.appendChild(this.write_wmc_StyleList(context));if(context.dimensions){node.appendChild(this.write_wmc_DimensionList(context));} +node.appendChild(this.write_wmc_LayerExtension(context));return node;},CLASS_NAME:"OpenLayers.Format.WMC.v1_1_0"});OpenLayers.Format.XLS.v1_1_0=OpenLayers.Class(OpenLayers.Format.XLS.v1,{VERSION:"1.1",schemaLocation:"http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd",initialize:function(options){OpenLayers.Format.XLS.v1.prototype.initialize.apply(this,[options]);},CLASS_NAME:"OpenLayers.Format.XLS.v1_1_0"});OpenLayers.Format.XLS.v1_1=OpenLayers.Format.XLS.v1_1_0;OpenLayers.Renderer.SVG=OpenLayers.Class(OpenLayers.Renderer.Elements,{xmlns:"http://www.w3.org/2000/svg",xlinkns:"http://www.w3.org/1999/xlink",MAX_PIXEL:15000,translationParameters:null,symbolMetrics:null,initialize:function(containerID){if(!this.supported()){return;} +OpenLayers.Renderer.Elements.prototype.initialize.apply(this,arguments);this.translationParameters={x:0,y:0};this.symbolMetrics={};},supported:function(){var svgFeature="http://www.w3.org/TR/SVG11/feature#";return(document.implementation&&(document.implementation.hasFeature("org.w3c.svg","1.0")||document.implementation.hasFeature(svgFeature+"SVG","1.1")||document.implementation.hasFeature(svgFeature+"BasicStructure","1.1")));},inValidRange:function(x,y,xyOnly){var left=x+(xyOnly?0:this.translationParameters.x);var top=y+(xyOnly?0:this.translationParameters.y);return(left>=-this.MAX_PIXEL&&left<=this.MAX_PIXEL&&top>=-this.MAX_PIXEL&&top<=this.MAX_PIXEL);},setExtent:function(extent,resolutionChanged){OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,arguments);var resolution=this.getResolution();var left=-extent.left/resolution;var top=extent.top/resolution;if(resolutionChanged){this.left=left;this.top=top;var extentString="0 0 "+this.size.w+" "+this.size.h;this.rendererRoot.setAttributeNS(null,"viewBox",extentString);this.translate(0,0);return true;}else{var inRange=this.translate(left-this.left,top-this.top);if(!inRange){this.setExtent(extent,true);} +return inRange;}},translate:function(x,y){if(!this.inValidRange(x,y,true)){return false;}else{var transformString="";if(x||y){transformString="translate("+x+","+y+")";} +this.root.setAttributeNS(null,"transform",transformString);this.translationParameters={x:x,y:y};return true;}},setSize:function(size){OpenLayers.Renderer.prototype.setSize.apply(this,arguments);this.rendererRoot.setAttributeNS(null,"width",this.size.w);this.rendererRoot.setAttributeNS(null,"height",this.size.h);},getNodeType:function(geometry,style){var nodeType=null;switch(geometry.CLASS_NAME){case"OpenLayers.Geometry.Point":if(style.externalGraphic){nodeType="image";}else if(this.isComplexSymbol(style.graphicName)){nodeType="svg";}else{nodeType="circle";} +break;case"OpenLayers.Geometry.Rectangle":nodeType="rect";break;case"OpenLayers.Geometry.LineString":nodeType="polyline";break;case"OpenLayers.Geometry.LinearRing":nodeType="polygon";break;case"OpenLayers.Geometry.Polygon":case"OpenLayers.Geometry.Curve":case"OpenLayers.Geometry.Surface":nodeType="path";break;default:break;} +return nodeType;},setStyle:function(node,style,options){style=style||node._style;options=options||node._options;var r=parseFloat(node.getAttributeNS(null,"r"));var widthFactor=1;var pos;if(node._geometryClass=="OpenLayers.Geometry.Point"&&r){node.style.visibility="";if(style.graphic===false){node.style.visibility="hidden";}else if(style.externalGraphic){pos=this.getPosition(node);if(style.graphicTitle){node.setAttributeNS(null,"title",style.graphicTitle);var label=this.nodeFactory(null,"title");label.textContent=style.graphicTitle;node.appendChild(label);} +if(style.graphicWidth&&style.graphicHeight){node.setAttributeNS(null,"preserveAspectRatio","none");} +var width=style.graphicWidth||style.graphicHeight;var height=style.graphicHeight||style.graphicWidth;width=width?width:style.pointRadius*2;height=height?height:style.pointRadius*2;var xOffset=(style.graphicXOffset!=undefined)?style.graphicXOffset:-(0.5*width);var yOffset=(style.graphicYOffset!=undefined)?style.graphicYOffset:-(0.5*height);var opacity=style.graphicOpacity||style.fillOpacity;node.setAttributeNS(null,"x",(pos.x+xOffset).toFixed());node.setAttributeNS(null,"y",(pos.y+yOffset).toFixed());node.setAttributeNS(null,"width",width);node.setAttributeNS(null,"height",height);node.setAttributeNS(this.xlinkns,"href",style.externalGraphic);node.setAttributeNS(null,"style","opacity: "+opacity);node.onclick=OpenLayers.Renderer.SVG.preventDefault;}else if(this.isComplexSymbol(style.graphicName)){var offset=style.pointRadius*3;var size=offset*2;var src=this.importSymbol(style.graphicName);pos=this.getPosition(node);widthFactor=this.symbolMetrics[src.id][0]*3/size;var parent=node.parentNode;var nextSibling=node.nextSibling;if(parent){parent.removeChild(node);} +node.firstChild&&node.removeChild(node.firstChild);node.appendChild(src.firstChild.cloneNode(true));node.setAttributeNS(null,"viewBox",src.getAttributeNS(null,"viewBox"));node.setAttributeNS(null,"width",size);node.setAttributeNS(null,"height",size);node.setAttributeNS(null,"x",pos.x-offset);node.setAttributeNS(null,"y",pos.y-offset);if(nextSibling){parent.insertBefore(node,nextSibling);}else if(parent){parent.appendChild(node);}}else{node.setAttributeNS(null,"r",style.pointRadius);} +var rotation=style.rotation;if((rotation!==undefined||node._rotation!==undefined)&&pos){node._rotation=rotation;rotation|=0;if(node.nodeName!=="svg"){node.setAttributeNS(null,"transform","rotate("+rotation+" "+pos.x+" "+ +pos.y+")");}else{var metrics=this.symbolMetrics[src.id];node.firstChild.setAttributeNS(null,"transform","rotate(" ++rotation+" " ++metrics[1]+" " ++metrics[2]+")");}}} +if(options.isFilled){node.setAttributeNS(null,"fill",style.fillColor);node.setAttributeNS(null,"fill-opacity",style.fillOpacity);}else{node.setAttributeNS(null,"fill","none");} +if(options.isStroked){node.setAttributeNS(null,"stroke",style.strokeColor);node.setAttributeNS(null,"stroke-opacity",style.strokeOpacity);node.setAttributeNS(null,"stroke-width",style.strokeWidth*widthFactor);node.setAttributeNS(null,"stroke-linecap",style.strokeLinecap||"round");node.setAttributeNS(null,"stroke-linejoin","round");style.strokeDashstyle&&node.setAttributeNS(null,"stroke-dasharray",this.dashStyle(style,widthFactor));}else{node.setAttributeNS(null,"stroke","none");} +if(style.pointerEvents){node.setAttributeNS(null,"pointer-events",style.pointerEvents);} +if(style.cursor!=null){node.setAttributeNS(null,"cursor",style.cursor);} +return node;},dashStyle:function(style,widthFactor){var w=style.strokeWidth*widthFactor;var str=style.strokeDashstyle;switch(str){case'solid':return'none';case'dot':return[1,4*w].join();case'dash':return[4*w,4*w].join();case'dashdot':return[4*w,4*w,1,4*w].join();case'longdash':return[8*w,4*w].join();case'longdashdot':return[8*w,4*w,1,4*w].join();default:return OpenLayers.String.trim(str).replace(/\s+/g,",");}},createNode:function(type,id){var node=document.createElementNS(this.xmlns,type);if(id){node.setAttributeNS(null,"id",id);} +return node;},nodeTypeCompare:function(node,type){return(type==node.nodeName);},createRenderRoot:function(){return this.nodeFactory(this.container.id+"_svgRoot","svg");},createRoot:function(suffix){return this.nodeFactory(this.container.id+suffix,"g");},createDefs:function(){var defs=this.nodeFactory(this.container.id+"_defs","defs");this.rendererRoot.appendChild(defs);return defs;},drawPoint:function(node,geometry){return this.drawCircle(node,geometry,1);},drawCircle:function(node,geometry,radius){var resolution=this.getResolution();var x=(geometry.x/resolution+this.left);var y=(this.top-geometry.y/resolution);if(this.inValidRange(x,y)){node.setAttributeNS(null,"cx",x);node.setAttributeNS(null,"cy",y);node.setAttributeNS(null,"r",radius);return node;}else{return false;}},drawLineString:function(node,geometry){var componentsResult=this.getComponentsString(geometry.components);if(componentsResult.path){node.setAttributeNS(null,"points",componentsResult.path);return(componentsResult.complete?node:null);}else{return false;}},drawLinearRing:function(node,geometry){var componentsResult=this.getComponentsString(geometry.components);if(componentsResult.path){node.setAttributeNS(null,"points",componentsResult.path);return(componentsResult.complete?node:null);}else{return false;}},drawPolygon:function(node,geometry){var d="";var draw=true;var complete=true;var linearRingResult,path;for(var j=0,len=geometry.components.length;jnumRows){label.removeChild(label.lastChild);} +for(var i=0;i0){if(this.getShortString(components[i-1])){strings.push(this.clipLine(components[i],components[i-1]));}} +if(imaxX){k=(y2-y1)/(x2-x1);x2=x2<0?-maxX:maxX;y2=y1+(x2-x1)*k;} +if(y2<-maxY||y2>maxY){k=(x2-x1)/(y2-y1);y2=y2<0?-maxY:maxY;x2=x1+(y2-y1)*k;} +return x2+","+y2;},getShortString:function(point){var resolution=this.getResolution();var x=(point.x/resolution+this.left);var y=(this.top-point.y/resolution);if(this.inValidRange(x,y)){return x+","+y;}else{return false;}},getPosition:function(node){return({x:parseFloat(node.getAttributeNS(null,"cx")),y:parseFloat(node.getAttributeNS(null,"cy"))});},importSymbol:function(graphicName){if(!this.defs){this.defs=this.createDefs();} +var id=this.container.id+"-"+graphicName;var existing=document.getElementById(id) +if(existing!=null){return existing;} +var symbol=OpenLayers.Renderer.symbol[graphicName];if(!symbol){throw new Error(graphicName+' is not a valid symbol name');} +var symbolNode=this.nodeFactory(id,"symbol");var node=this.nodeFactory(null,"polygon");symbolNode.appendChild(node);var symbolExtent=new OpenLayers.Bounds(Number.MAX_VALUE,Number.MAX_VALUE,0,0);var points=[];var x,y;for(var i=0;i0){a.push(path.slice());path.pop();} +a.reverse();} +return a;},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);} +if(data&&data.nodeType==9){data=data.documentElement;} +var context={};this.readNode(data,context);this.setNestingPath({layersContext:context.layersContext});var layers=[];this.processLayer(layers,context);delete context.layersContext;context.layersContext=layers;return context;},processLayer:function(layerArray,layer){if(layer.layersContext){for(var i=0,len=layer.layersContext.length;i=1){el=elements[0];} +if(el&&el.firstChild){var featurenode=(el.firstChild.nextSibling)?el.firstChild.nextSibling:el.firstChild;this.setNamespace("feature",featurenode.namespaceURI);this.featureType=featurenode.localName||featurenode.nodeName.split(":").pop();this.readChildNodes(node,obj);}},"Server":function(node,obj){if((!obj.service&&!obj.version)||(obj.service!=OpenLayers.Format.Context.serviceTypes.WMS)){obj.service=node.getAttribute("service");obj.version=node.getAttribute("version");this.readChildNodes(node,obj);}},"Name":function(node,obj){obj.name=this.getChildValue(node);this.readChildNodes(node,obj);},"Title":function(node,obj){obj.title=this.getChildValue(node);this.readChildNodes(node,obj);},"StyleList":function(node,obj){this.readChildNodes(node,obj.styles);},"Style":function(node,obj){var style={};obj.push(style);this.readChildNodes(node,style);},"LegendURL":function(node,obj){var legend={};obj.legend=legend;this.readChildNodes(node,legend);},"OnlineResource":function(node,obj){obj.url=this.getAttributeNS(node,this.namespaces.xlink,"href");this.readChildNodes(node,obj);}},"ows":OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers.ows,"gml":OpenLayers.Format.GML.v2.prototype.readers.gml,"sld":OpenLayers.Format.SLD.v1_0_0.prototype.readers.sld,"feature":OpenLayers.Format.GML.v2.prototype.readers.feature},writers:{"owc":{"OWSContext":function(options){var node=this.createElementNSPlus("OWSContext",{attributes:{version:this.VERSION,id:options.id||OpenLayers.Util.createUniqueID("OpenLayers_OWSContext_")}});this.writeNode("General",options,node);this.writeNode("ResourceList",options,node);return node;},"General":function(options){var node=this.createElementNSPlus("General");this.writeNode("ows:BoundingBox",options,node);this.writeNode("ows:Title",options.title||'OpenLayers OWSContext',node);return node;},"ResourceList":function(options){var node=this.createElementNSPlus("ResourceList");for(var i=0,len=options.layers.length;i0){this.writeNode("StyleList",layer.metadata.styles,node);} +return node;},"_Layer":function(options){var layer,subPaths,node,title;layer=options.layer;subPaths=options.subPaths;node=null;title=null;if(subPaths.length>0){var path=subPaths[0].join("/");var index=path.lastIndexOf("/");node=this.nestingLayerLookup[path];title=(index>0)?path.substring(index+1,path.length):path;if(!node){node=this.createElementNSPlus("Layer");this.writeNode("ows:Title",title,node);this.nestingLayerLookup[path]=node;} +options.subPaths.shift();this.writeNode("_Layer",options,node);return node;}else{if(layer instanceof OpenLayers.Layer.WMS){node=this.writeNode("_WMS",layer);}else if(layer instanceof OpenLayers.Layer.Vector){if(layer.protocol instanceof OpenLayers.Protocol.WFS.v1){node=this.writeNode("_WFS",layer);}else if(layer.protocol instanceof OpenLayers.Protocol.HTTP){if(layer.protocol.format instanceof OpenLayers.Format.GML){layer.protocol.format.version="2.1.2";node=this.writeNode("_GML",layer);}else if(layer.protocol.format instanceof OpenLayers.Format.KML){layer.protocol.format.version="2.2";node=this.writeNode("_KML",layer);}}else{this.setNamespace("feature",this.featureNS);node=this.writeNode("_InlineGeometry",layer);}} +if(layer.options.maxScale){this.writeNode("sld:MinScaleDenominator",layer.options.maxScale,node);} +if(layer.options.minScale){this.writeNode("sld:MaxScaleDenominator",layer.options.minScale,node);} +this.nestingLayerLookup[layer.name]=node;return node;}},"_WFS":function(layer){var node=this.createElementNSPlus("Layer",{attributes:{name:layer.protocol.featurePrefix+":"+layer.protocol.featureType,hidden:layer.visibility?"0":"1"}});this.writeNode("ows:Title",layer.name,node);this.writeNode("Server",{service:OpenLayers.Format.Context.serviceTypes.WFS,version:layer.protocol.version,url:layer.protocol.url},node);return node;},"_InlineGeometry":function(layer){var node=this.createElementNSPlus("Layer",{attributes:{name:this.featureType,hidden:layer.visibility?"0":"1"}});this.writeNode("ows:Title",layer.name,node);this.writeNode("InlineGeometry",layer,node);return node;},"_GML":function(layer){var node=this.createElementNSPlus("Layer");this.writeNode("ows:Title",layer.name,node);this.writeNode("Server",{service:OpenLayers.Format.Context.serviceTypes.GML,url:layer.protocol.url,version:layer.protocol.format.version},node);return node;},"_KML":function(layer){var node=this.createElementNSPlus("Layer");this.writeNode("ows:Title",layer.name,node);this.writeNode("Server",{service:OpenLayers.Format.Context.serviceTypes.KML,version:layer.protocol.format.version,url:layer.protocol.url},node);return node;}},"gml":OpenLayers.Util.applyDefaults({"boundedBy":function(bounds){var node=this.createElementNSPlus("gml:boundedBy");this.writeNode("gml:Box",bounds,node);return node;}},OpenLayers.Format.GML.v2.prototype.writers.gml),"ows":OpenLayers.Format.OWSCommon.v1_0_0.prototype.writers.ows,"sld":OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld,"feature":OpenLayers.Format.GML.v2.prototype.writers.feature},CLASS_NAME:"OpenLayers.Format.OWSContext.v0_3_1"});OpenLayers.Control.ScaleLine=OpenLayers.Class(OpenLayers.Control,{maxWidth:100,topOutUnits:"km",topInUnits:"m",bottomOutUnits:"mi",bottomInUnits:"ft",eTop:null,eBottom:null,geodesic:false,draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!this.eTop){this.eTop=document.createElement("div");this.eTop.className=this.displayClass+"Top";var theLen=this.topInUnits.length;this.div.appendChild(this.eTop);if((this.topOutUnits=="")||(this.topInUnits=="")){this.eTop.style.visibility="hidden";}else{this.eTop.style.visibility="visible";} +this.eBottom=document.createElement("div");this.eBottom.className=this.displayClass+"Bottom";this.div.appendChild(this.eBottom);if((this.bottomOutUnits=="")||(this.bottomInUnits=="")){this.eBottom.style.visibility="hidden";}else{this.eBottom.style.visibility="visible";}} +this.map.events.register('moveend',this,this.update);this.update();return this.div;},getBarLen:function(maxLen){var digits=parseInt(Math.log(maxLen)/Math.log(10));var pow10=Math.pow(10,digits);var firstChar=parseInt(maxLen/pow10);var barLen;if(firstChar>5){barLen=5;}else if(firstChar>2){barLen=2;}else{barLen=1;} +return barLen*pow10;},update:function(){var res=this.map.getResolution();if(!res){return;} +var curMapUnits=this.map.getUnits();var inches=OpenLayers.INCHES_PER_UNIT;var maxSizeData=this.maxWidth*res*inches[curMapUnits];var geodesicRatio=1;if(this.geodesic===true){var maxSizeGeodesic=(this.map.getGeodesicPixelSize().w||0.000001)*this.maxWidth;var maxSizeKilometers=maxSizeData/inches["km"];geodesicRatio=maxSizeGeodesic/maxSizeKilometers;maxSizeData*=geodesicRatio;} +var topUnits;var bottomUnits;if(maxSizeData>100000){topUnits=this.topOutUnits;bottomUnits=this.bottomOutUnits;}else{topUnits=this.topInUnits;bottomUnits=this.bottomInUnits;} +var topMax=maxSizeData/inches[topUnits];var bottomMax=maxSizeData/inches[bottomUnits];var topRounded=this.getBarLen(topMax);var bottomRounded=this.getBarLen(bottomMax);topMax=topRounded/inches[curMapUnits]*inches[topUnits];bottomMax=bottomRounded/inches[curMapUnits]*inches[bottomUnits];var topPx=topMax/res/geodesicRatio;var bottomPx=bottomMax/res/geodesicRatio;if(this.eBottom.style.visibility=="visible"){this.eBottom.style.width=Math.round(bottomPx)+"px";this.eBottom.innerHTML=bottomRounded+" "+bottomUnits;} +if(this.eTop.style.visibility=="visible"){this.eTop.style.width=Math.round(topPx)+"px";this.eTop.innerHTML=topRounded+" "+topUnits;}},CLASS_NAME:"OpenLayers.Control.ScaleLine"});OpenLayers.Icon=OpenLayers.Class({url:null,size:null,offset:null,calculateOffset:null,imageDiv:null,px:null,initialize:function(url,size,offset,calculateOffset){this.url=url;this.size=(size)?size:new OpenLayers.Size(20,20);this.offset=offset?offset:new OpenLayers.Pixel(-(this.size.w/2),-(this.size.h/2));this.calculateOffset=calculateOffset;var id=OpenLayers.Util.createUniqueID("OL_Icon_");this.imageDiv=OpenLayers.Util.createAlphaImageDiv(id);},destroy:function(){this.erase();OpenLayers.Event.stopObservingElement(this.imageDiv.firstChild);this.imageDiv.innerHTML="";this.imageDiv=null;},clone:function(){return new OpenLayers.Icon(this.url,this.size,this.offset,this.calculateOffset);},setSize:function(size){if(size!=null){this.size=size;} +this.draw();},setUrl:function(url){if(url!=null){this.url=url;} +this.draw();},draw:function(px){OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,null,this.size,this.url,"absolute");this.moveTo(px);return this.imageDiv;},erase:function(){if(this.imageDiv!=null&&this.imageDiv.parentNode!=null){OpenLayers.Element.remove(this.imageDiv);}},setOpacity:function(opacity){OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,null,null,null,null,null,null,opacity);},moveTo:function(px){if(px!=null){this.px=px;} +if(this.imageDiv!=null){if(this.px==null){this.display(false);}else{if(this.calculateOffset){this.offset=this.calculateOffset(this.size);} +var offsetPx=this.px.offset(this.offset);OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,offsetPx);}}},display:function(display){this.imageDiv.style.display=(display)?"":"none";},isDrawn:function(){var isDrawn=(this.imageDiv&&this.imageDiv.parentNode&&(this.imageDiv.parentNode.nodeType!=11));return isDrawn;},CLASS_NAME:"OpenLayers.Icon"});OpenLayers.Marker=OpenLayers.Class({icon:null,lonlat:null,events:null,map:null,initialize:function(lonlat,icon){this.lonlat=lonlat;var newIcon=(icon)?icon:OpenLayers.Marker.defaultIcon();if(this.icon==null){this.icon=newIcon;}else{this.icon.url=newIcon.url;this.icon.size=newIcon.size;this.icon.offset=newIcon.offset;this.icon.calculateOffset=newIcon.calculateOffset;} +this.events=new OpenLayers.Events(this,this.icon.imageDiv,null);},destroy:function(){this.erase();this.map=null;this.events.destroy();this.events=null;if(this.icon!=null){this.icon.destroy();this.icon=null;}},draw:function(px){return this.icon.draw(px);},erase:function(){if(this.icon!=null){this.icon.erase();}},moveTo:function(px){if((px!=null)&&(this.icon!=null)){this.icon.moveTo(px);} +this.lonlat=this.map.getLonLatFromLayerPx(px);},isDrawn:function(){var isDrawn=(this.icon&&this.icon.isDrawn());return isDrawn;},onScreen:function(){var onScreen=false;if(this.map){var screenBounds=this.map.getExtent();onScreen=screenBounds.containsLonLat(this.lonlat);} +return onScreen;},inflate:function(inflate){if(this.icon){var newSize=new OpenLayers.Size(this.icon.size.w*inflate,this.icon.size.h*inflate);this.icon.setSize(newSize);}},setOpacity:function(opacity){this.icon.setOpacity(opacity);},setUrl:function(url){this.icon.setUrl(url);},display:function(display){this.icon.display(display);},CLASS_NAME:"OpenLayers.Marker"});OpenLayers.Marker.defaultIcon=function(){var url=OpenLayers.Util.getImagesLocation()+"marker.png";var size=new OpenLayers.Size(21,25);var calculateOffset=function(size){return new OpenLayers.Pixel(-(size.w/2),-size.h);};return new OpenLayers.Icon(url,size,null,calculateOffset);};OpenLayers.Layer.TileCache=OpenLayers.Class(OpenLayers.Layer.Grid,{isBaseLayer:true,format:'image/png',serverResolutions:null,initialize:function(name,url,layername,options){this.layername=layername;OpenLayers.Layer.Grid.prototype.initialize.apply(this,[name,url,{},options]);this.extension=this.format.split('/')[1].toLowerCase();this.extension=(this.extension=='jpg')?'jpeg':this.extension;},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.TileCache(this.name,this.url,this.layername,this.getOptions());} +obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},getURL:function(bounds){var res=this.map.getResolution();var bbox=this.maxExtent;var size=this.tileSize;var tileX=Math.round((bounds.left-bbox.left)/(res*size.w));var tileY=Math.round((bounds.bottom-bbox.bottom)/(res*size.h));var tileZ=this.serverResolutions!=null?OpenLayers.Util.indexOf(this.serverResolutions,res):this.map.getZoom();function zeroPad(number,length){number=String(number);var zeros=[];for(var i=0;i0){this.length=newLength;} +return this.length;},pageNext:function(event){var changed=false;if(this.features){if(this.num===null){this.num=-1;} +var start=(this.num+1)*this.length;changed=this.page(start,event);} +return changed;},pagePrevious:function(){var changed=false;if(this.features){if(this.num===null){this.num=this.pageCount();} +var start=(this.num-1)*this.length;changed=this.page(start);} +return changed;},page:function(start,event){var changed=false;if(this.features){if(start>=0&&start=constrain||diff!==0){angle=Math.round(control._angle/constrain)*constrain- +diff;control._angle=0;control.box.geometry.rotate(angle,centerGeometry);control.transformFeature({rotation:angle});}};var handles=new Array(8);var rotationHandles=new Array(4);var geom,handle,rotationHandle;for(var i=0;i<8;++i){geom=box.geometry.components[i];handle=new OpenLayers.Feature.Vector(geom.clone(),null,typeof this.renderIntent=="string"?null:this.renderIntent);if(i%2==0){rotationHandle=new OpenLayers.Feature.Vector(geom.clone(),null,typeof this.rotationHandleSymbolizer=="string"?null:this.rotationHandleSymbolizer);rotationHandle.geometry.move=rotationHandleMoveFn;geom._rotationHandle=rotationHandle;rotationHandles[i/2]=rotationHandle;} +geom.move=vertexMoveFn;geom.resize=vertexResizeFn;geom.rotate=vertexRotateFn;handle.geometry.move=handleMoveFn;geom._handle=handle;handles[i]=handle;} +this.box=box;this.rotationHandles=rotationHandles;this.handles=handles;},createControl:function(){var control=this;this.dragControl=new OpenLayers.Control.DragFeature(this.layer,{documentDrag:true,moveFeature:function(pixel){if(this.feature===control.feature){this.feature=control.box;} +OpenLayers.Control.DragFeature.prototype.moveFeature.apply(this,arguments);},onDrag:function(feature,pixel){if(feature===control.box){control.transformFeature({center:control.center});control.drawHandles();}},onStart:function(feature,pixel){var eligible=!control.geometryTypes||OpenLayers.Util.indexOf(control.geometryTypes,feature.geometry.CLASS_NAME)!==-1;var i=OpenLayers.Util.indexOf(control.handles,feature);i+=OpenLayers.Util.indexOf(control.rotationHandles,feature);if(feature!==control.feature&&feature!==control.box&&i==-2&&eligible){control.setFeature(feature);}},onComplete:function(feature,pixel){control.events.triggerEvent("transformcomplete",{feature:control.feature});}});},drawHandles:function(){var layer=this.layer;for(var i=0;i<8;++i){if(this.rotate&&i%2===0){layer.drawFeature(this.rotationHandles[i/2],this.rotationHandleSymbolizer);} +layer.drawFeature(this.handles[i],this.renderIntent);}},transformFeature:function(mods){if(!this._setfeature){this.scale*=(mods.scale||1);this.ratio*=(mods.ratio||1);var oldRotation=this.rotation;this.rotation=(this.rotation+(mods.rotation||0))%360;if(this.events.triggerEvent("beforetransform",mods)!==false){var feature=this.feature;var geom=feature.geometry;var center=this.center;geom.rotate(-oldRotation,center);if(mods.scale||mods.ratio){geom.resize(mods.scale,center,mods.ratio);}else if(mods.center){feature.move(mods.center.getBounds().getCenterLonLat());} +geom.rotate(this.rotation,center);this.layer.drawFeature(feature);feature.toState(OpenLayers.State.UPDATE);this.events.triggerEvent("transform",mods);}} +this.layer.drawFeature(this.box,this.renderIntent);this.drawHandles();},destroy:function(){var geom;for(var i=0;i<8;++i){geom=this.box.geometry.components[i];geom._handle.destroy();geom._handle=null;geom._rotationHandle&&geom._rotationHandle.destroy();geom._rotationHandle=null;} +this.box.destroy();this.box=null;this.layer=null;this.dragControl.destroy();OpenLayers.Control.prototype.destroy.apply(this,arguments);},CLASS_NAME:"OpenLayers.Control.TransformFeature"});OpenLayers.Layer.XYZ=OpenLayers.Class(OpenLayers.Layer.Grid,{isBaseLayer:true,sphericalMercator:false,zoomOffset:0,serverResolutions:null,initialize:function(name,url,options){if(options&&options.sphericalMercator||this.sphericalMercator){options=OpenLayers.Util.extend({maxExtent:new OpenLayers.Bounds(-128*156543.03390625,-128*156543.03390625,128*156543.03390625,128*156543.03390625),maxResolution:156543.03390625,numZoomLevels:19,units:"m",projection:"EPSG:900913"},options);} +url=url||this.url;name=name||this.name;var newArguments=[name,url,{},options];OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.XYZ(this.name,this.url,this.getOptions());} +obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},getURL:function(bounds){var xyz=this.getXYZ(bounds);var url=this.url;if(OpenLayers.Util.isArray(url)){var s=''+xyz.x+xyz.y+xyz.z;url=this.selectUrl(s,url);} +return OpenLayers.String.format(url,xyz);},getXYZ:function(bounds){var res=this.map.getResolution();var x=Math.round((bounds.left-this.maxExtent.left)/(res*this.tileSize.w));var y=Math.round((this.maxExtent.top-bounds.top)/(res*this.tileSize.h));var z=this.serverResolutions!=null?OpenLayers.Util.indexOf(this.serverResolutions,res):this.map.getZoom()+this.zoomOffset;var limit=Math.pow(2,z);if(this.wrapDateLine) +{x=((x%limit)+limit)%limit;} +return{'x':x,'y':y,'z':z};},setMap:function(map){OpenLayers.Layer.Grid.prototype.setMap.apply(this,arguments);if(!this.tileOrigin){this.tileOrigin=new OpenLayers.LonLat(this.maxExtent.left,this.maxExtent.bottom);}},CLASS_NAME:"OpenLayers.Layer.XYZ"});OpenLayers.Layer.OSM=OpenLayers.Class(OpenLayers.Layer.XYZ,{name:"OpenStreetMap",attribution:"Data CC-By-SA by OpenStreetMap",sphericalMercator:true,url:'http://tile.openstreetmap.org/${z}/${x}/${y}.png',clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.OSM(this.name,this.url,this.getOptions());} +obj=OpenLayers.Layer.XYZ.prototype.clone.apply(this,[obj]);return obj;},wrapDateLine:true,CLASS_NAME:"OpenLayers.Layer.OSM"});OpenLayers.Handler.Box=OpenLayers.Class(OpenLayers.Handler,{dragHandler:null,boxDivClassName:'olHandlerBoxZoomBox',boxOffsets:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);this.dragHandler=new OpenLayers.Handler.Drag(this,{down:this.startBox,move:this.moveBox,out:this.removeBox,up:this.endBox},{keyMask:this.keyMask});},destroy:function(){OpenLayers.Handler.prototype.destroy.apply(this,arguments);if(this.dragHandler){this.dragHandler.destroy();this.dragHandler=null;}},setMap:function(map){OpenLayers.Handler.prototype.setMap.apply(this,arguments);if(this.dragHandler){this.dragHandler.setMap(map);}},startBox:function(xy){this.callback("start",[]);this.zoomBox=OpenLayers.Util.createDiv('zoomBox',new OpenLayers.Pixel(-9999,-9999));this.zoomBox.className=this.boxDivClassName;this.zoomBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.eventsDiv.appendChild(this.zoomBox);OpenLayers.Element.addClass(this.map.eventsDiv,"olDrawBox");},moveBox:function(xy){var startX=this.dragHandler.start.x;var startY=this.dragHandler.start.y;var deltaX=Math.abs(startX-xy.x);var deltaY=Math.abs(startY-xy.y);var offset=this.getBoxOffsets();this.zoomBox.style.width=(deltaX+offset.width+1)+"px";this.zoomBox.style.height=(deltaY+offset.height+1)+"px";this.zoomBox.style.left=(xy.x5||Math.abs(this.dragHandler.start.y-end.y)>5){var start=this.dragHandler.start;var top=Math.min(start.y,end.y);var bottom=Math.max(start.y,end.y);var left=Math.min(start.x,end.x);var right=Math.max(start.x,end.x);result=new OpenLayers.Bounds(left,bottom,right,top);}else{result=this.dragHandler.start.clone();} +this.removeBox();this.callback("done",[result]);},removeBox:function(){this.map.eventsDiv.removeChild(this.zoomBox);this.zoomBox=null;this.boxOffsets=null;OpenLayers.Element.removeClass(this.map.eventsDiv,"olDrawBox");},activate:function(){if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.dragHandler.activate();return true;}else{return false;}},deactivate:function(){if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){if(this.dragHandler.deactivate()){if(this.zoomBox){this.removeBox();}} +return true;}else{return false;}},getBoxOffsets:function(){if(!this.boxOffsets){var testDiv=document.createElement("div");testDiv.style.position="absolute";testDiv.style.border="1px solid black";testDiv.style.width="3px";document.body.appendChild(testDiv);var w3cBoxModel=testDiv.clientWidth==3;document.body.removeChild(testDiv);var left=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-left-width"));var right=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-right-width"));var top=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-top-width"));var bottom=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-bottom-width"));this.boxOffsets={left:left,right:right,top:top,bottom:bottom,width:w3cBoxModel===false?left+right:0,height:w3cBoxModel===false?top+bottom:0};} +return this.boxOffsets;},CLASS_NAME:"OpenLayers.Handler.Box"});OpenLayers.Control.ZoomBox=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_TOOL,out:false,alwaysZoom:false,draw:function(){this.handler=new OpenLayers.Handler.Box(this,{done:this.zoomBox},{keyMask:this.keyMask});},zoomBox:function(position){if(position instanceof OpenLayers.Bounds){var bounds;if(!this.out){var minXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.left,position.bottom));var maxXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.right,position.top));bounds=new OpenLayers.Bounds(minXY.lon,minXY.lat,maxXY.lon,maxXY.lat);}else{var pixWidth=Math.abs(position.right-position.left);var pixHeight=Math.abs(position.top-position.bottom);var zoomFactor=Math.min((this.map.size.h/pixHeight),(this.map.size.w/pixWidth));var extent=this.map.getExtent();var center=this.map.getLonLatFromPixel(position.getCenterPixel());var xmin=center.lon-(extent.getWidth()/2)*zoomFactor;var xmax=center.lon+(extent.getWidth()/2)*zoomFactor;var ymin=center.lat-(extent.getHeight()/2)*zoomFactor;var ymax=center.lat+(extent.getHeight()/2)*zoomFactor;bounds=new OpenLayers.Bounds(xmin,ymin,xmax,ymax);} +var lastZoom=this.map.getZoom();this.map.zoomToExtent(bounds);if(lastZoom==this.map.getZoom()&&this.alwaysZoom==true){this.map.zoomTo(lastZoom+(this.out?-1:1));}}else{if(!this.out){this.map.setCenter(this.map.getLonLatFromPixel(position),this.map.getZoom()+1);}else{this.map.setCenter(this.map.getLonLatFromPixel(position),this.map.getZoom()-1);}}},CLASS_NAME:"OpenLayers.Control.ZoomBox"});OpenLayers.Control.DragPan=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_TOOL,panned:false,interval:1,documentDrag:false,kinetic:null,enableKinetic:false,kineticInterval:10,draw:function(){if(this.enableKinetic){var config={interval:this.kineticInterval};if(typeof this.enableKinetic==="object"){config=OpenLayers.Util.extend(config,this.enableKinetic);} +this.kinetic=new OpenLayers.Kinetic(config);} +this.handler=new OpenLayers.Handler.Drag(this,{"move":this.panMap,"done":this.panMapDone,"down":this.panMapStart},{interval:this.interval,documentDrag:this.documentDrag});},panMapStart:function(){if(this.kinetic){this.kinetic.begin();}},panMap:function(xy){if(this.kinetic){this.kinetic.update(xy);} +this.panned=true;this.map.pan(this.handler.last.x-xy.x,this.handler.last.y-xy.y,{dragging:true,animate:false});},panMapDone:function(xy){if(this.panned){var res=null;if(this.kinetic){res=this.kinetic.end(xy);} +this.map.pan(this.handler.last.x-xy.x,this.handler.last.y-xy.y,{dragging:!!res,animate:false});if(res){var self=this;this.kinetic.move(res,function(x,y,end){self.map.pan(x,y,{dragging:!end,animate:false});});} +this.panned=false;}},CLASS_NAME:"OpenLayers.Control.DragPan"});OpenLayers.Handler.Click=OpenLayers.Class(OpenLayers.Handler,{delay:300,single:true,'double':false,pixelTolerance:0,dblclickTolerance:13,stopSingle:false,stopDouble:false,timerId:null,touch:false,down:null,last:null,first:null,rightclickTimerId:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);},touchstart:function(evt){if(!this.touch){this.unregisterMouseListeners();this.touch=true;} +this.down=this.getEventInfo(evt);this.last=this.getEventInfo(evt);return true;},touchmove:function(evt){this.last=this.getEventInfo(evt);return true;},touchend:function(evt){if(this.down){evt.xy=this.last.xy;evt.lastTouches=this.last.touches;this.handleSingle(evt);this.down=null;} +return true;},unregisterMouseListeners:function(){this.map.events.un({mousedown:this.mousedown,mouseup:this.mouseup,click:this.click,dblclick:this.dblclick,scope:this});},mousedown:function(evt){this.down=this.getEventInfo(evt);this.last=this.getEventInfo(evt);return true;},mouseup:function(evt){var propagate=true;if(this.checkModifiers(evt)&&this.control.handleRightClicks&&OpenLayers.Event.isRightClick(evt)){propagate=this.rightclick(evt);} +return propagate;},rightclick:function(evt){if(this.passesTolerance(evt)){if(this.rightclickTimerId!=null){this.clearTimer();this.callback('dblrightclick',[evt]);return!this.stopDouble;}else{var clickEvent=this['double']?OpenLayers.Util.extend({},evt):this.callback('rightclick',[evt]);var delayedRightCall=OpenLayers.Function.bind(this.delayedRightCall,this,clickEvent);this.rightclickTimerId=window.setTimeout(delayedRightCall,this.delay);}} +return!this.stopSingle;},delayedRightCall:function(evt){this.rightclickTimerId=null;if(evt){this.callback('rightclick',[evt]);}},click:function(evt){if(!this.last){this.last=this.getEventInfo(evt);} +this.handleSingle(evt);return!this.stopSingle;},dblclick:function(evt){this.handleDouble(evt);return!this.stopDouble;},handleDouble:function(evt){if(this["double"]&&this.passesDblclickTolerance(evt)){this.callback("dblclick",[evt]);}},handleSingle:function(evt){if(this.passesTolerance(evt)){if(this.timerId!=null){if(this.last.touches&&this.last.touches.length===1){if(this["double"]){OpenLayers.Event.stop(evt);} +this.handleDouble(evt);} +if(!this.last.touches||this.last.touches.length!==2){this.clearTimer();}}else{this.first=this.getEventInfo(evt);var clickEvent=this.single?OpenLayers.Util.extend({},evt):null;this.queuePotentialClick(clickEvent);}}},queuePotentialClick:function(evt){this.timerId=window.setTimeout(OpenLayers.Function.bind(this.delayedCall,this,evt),this.delay);},passesTolerance:function(evt){var passes=true;if(this.pixelTolerance!=null&&this.down&&this.down.xy){passes=this.pixelTolerance>=this.down.xy.distanceTo(evt.xy);if(passes&&this.touch&&this.down.touches.length===this.last.touches.length){for(var i=0,ii=this.down.touches.length;ithis.pixelTolerance){passes=false;break;}}}} +return passes;},getTouchDistance:function(from,to){return Math.sqrt(Math.pow(from.clientX-to.clientX,2)+ +Math.pow(from.clientY-to.clientY,2));},passesDblclickTolerance:function(evt){var passes=true;if(this.down&&this.first){passes=this.down.xy.distanceTo(this.first.xy)<=this.dblclickTolerance;} +return passes;},clearTimer:function(){if(this.timerId!=null){window.clearTimeout(this.timerId);this.timerId=null;} +if(this.rightclickTimerId!=null){window.clearTimeout(this.rightclickTimerId);this.rightclickTimerId=null;}},delayedCall:function(evt){this.timerId=null;if(evt){this.callback("click",[evt]);}},getEventInfo:function(evt){var touches;if(evt.touches){var len=evt.touches.length;touches=new Array(len);var touch;for(var i=0;i=0;--i){candidate=features[i].geometry;if((candidate instanceof OpenLayers.Geometry.Polygon||candidate instanceof OpenLayers.Geometry.MultiPolygon)&&candidate.intersects(geometry)){polygon=features[i];this.control.layer.removeFeatures([polygon],{silent:true});this.control.layer.events.registerPriority("sketchcomplete",this,this.finalizeInteriorRing);this.control.layer.events.registerPriority("sketchmodified",this,this.enforceTopology);polygon.geometry.addComponent(this.line.geometry);this.polygon=polygon;this.drawingHole=true;break;}}} +OpenLayers.Handler.Path.prototype.addPoint.apply(this,arguments);},getCurrentPointIndex:function(){return this.line.geometry.components.length-2;},enforceTopology:function(event){var point=event.vertex;var components=this.line.geometry.components;if(!this.polygon.geometry.intersects(point)){var last=components[components.length-3];point.x=last.x;point.y=last.y;}},finishGeometry:function(){var index=this.line.geometry.components.length-2;this.line.geometry.removeComponent(this.line.geometry.components[index]);this.removePoint();this.finalize();},finalizeInteriorRing:function(){var ring=this.line.geometry;var modified=(ring.getArea()!==0);if(modified){var rings=this.polygon.geometry.components;for(var i=rings.length-2;i>=0;--i){if(ring.intersects(rings[i])){modified=false;break;}} +if(modified){var target;outer:for(var i=rings.length-2;i>0;--i){var points=rings[i].components;for(var j=0,jj=points.length;j=this.resFactor||ratio<=(1/this.resFactor));} +return invalid;},calculateBounds:function(mapBounds){if(!mapBounds){mapBounds=this.getMapBounds();} +var center=mapBounds.getCenterLonLat();var dataWidth=mapBounds.getWidth()*this.ratio;var dataHeight=mapBounds.getHeight()*this.ratio;this.bounds=new OpenLayers.Bounds(center.lon-(dataWidth/2),center.lat-(dataHeight/2),center.lon+(dataWidth/2),center.lat+(dataHeight/2));},triggerRead:function(options){if(this.response){this.layer.protocol.abort(this.response);this.layer.events.triggerEvent("loadend");} +this.layer.events.triggerEvent("loadstart");this.response=this.layer.protocol.read(OpenLayers.Util.applyDefaults({filter:this.createFilter(),callback:this.merge,scope:this},options));},createFilter:function(){var filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.BBOX,value:this.bounds,projection:this.layer.projection});if(this.layer.filter){filter=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.AND,filters:[this.layer.filter,filter]});} +return filter;},merge:function(resp){this.layer.destroyFeatures();var features=resp.features;if(features&&features.length>0){var remote=this.layer.projection;var local=this.layer.map.getProjectionObject();if(!local.equals(remote)){var geom;for(var i=0,len=features.length;i=0;--i){layer=layers[i];if(layer instanceof OpenLayers.Layer.Google&&layer.visibility===true&&layer.inRange===true){type=layer.type;visible=true;break;}} +var container=this.mapObject.getDiv();if(visible===true){this.mapObject.setMapTypeId(type);container.style.left="";if(cache.termsOfUse&&cache.termsOfUse.style){cache.termsOfUse.style.left="";cache.termsOfUse.style.display="";cache.poweredBy.style.display="";} +cache.displayed=this.id;}else{delete cache.displayed;container.style.left="-9999px";if(cache.termsOfUse&&cache.termsOfUse.style){cache.termsOfUse.style.display="none";cache.termsOfUse.style.left="-9999px";cache.poweredBy.style.display="none";}}}},getMapContainer:function(){return this.mapObject.getDiv();},getMapObjectBoundsFromOLBounds:function(olBounds){var moBounds=null;if(olBounds!=null){var sw=this.sphericalMercator?this.inverseMercator(olBounds.bottom,olBounds.left):new OpenLayers.LonLat(olBounds.bottom,olBounds.left);var ne=this.sphericalMercator?this.inverseMercator(olBounds.top,olBounds.right):new OpenLayers.LonLat(olBounds.top,olBounds.right);moBounds=new google.maps.LatLngBounds(new google.maps.LatLng(sw.lat,sw.lon),new google.maps.LatLng(ne.lat,ne.lon));} +return moBounds;},getMapObjectLonLatFromMapObjectPixel:function(moPixel){var size=this.map.getSize();var lon=this.getLongitudeFromMapObjectLonLat(this.mapObject.center);var lat=this.getLatitudeFromMapObjectLonLat(this.mapObject.center);var res=this.map.getResolution();var delta_x=moPixel.x-(size.w/2);var delta_y=moPixel.y-(size.h/2);var lonlat=new OpenLayers.LonLat(lon+delta_x*res,lat-delta_y*res);if(this.wrapDateLine){lonlat=lonlat.wrapDateLine(this.maxExtent);} +return this.getMapObjectLonLatFromLonLat(lonlat.lon,lonlat.lat);},getMapObjectPixelFromMapObjectLonLat:function(moLonLat){var lon=this.getLongitudeFromMapObjectLonLat(moLonLat);var lat=this.getLatitudeFromMapObjectLonLat(moLonLat);var res=this.map.getResolution();var extent=this.map.getExtent();var px=new OpenLayers.Pixel((1/res*(lon-extent.left)),(1/res*(extent.top-lat)));return this.getMapObjectPixelFromXY(px.x,px.y);},setMapObjectCenter:function(center,zoom){if(this.animationEnabled===false&&zoom!=this.mapObject.zoom){var mapContainer=this.getMapContainer();google.maps.event.addListenerOnce(this.mapObject,"idle",function(){mapContainer.style.visibility="";});mapContainer.style.visibility="hidden";} +this.mapObject.setOptions({center:center,zoom:zoom});},getMapObjectZoomFromMapObjectBounds:function(moBounds){return this.mapObject.getBoundsZoomLevel(moBounds);},getMapObjectLonLatFromLonLat:function(lon,lat){var gLatLng;if(this.sphericalMercator){var lonlat=this.inverseMercator(lon,lat);gLatLng=new google.maps.LatLng(lonlat.lat,lonlat.lon);}else{gLatLng=new google.maps.LatLng(lat,lon);} +return gLatLng;},getMapObjectPixelFromXY:function(x,y){return new google.maps.Point(x,y);},destroy:function(){if(this.repositionListener){google.maps.event.removeListener(this.repositionListener);} +if(this.repositionTimer){window.clearTimeout(this.repositionTimer);} +OpenLayers.Layer.Google.prototype.destroy.apply(this,arguments);}};OpenLayers.Format.WPSDescribeProcess=OpenLayers.Class(OpenLayers.Format.XML,{VERSION:"1.0.0",namespaces:{wps:"http://www.opengis.net/wps/1.0.0",ows:"http://www.opengis.net/ows/1.1",xsi:"http://www.w3.org/2001/XMLSchema-instance"},schemaLocation:"http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd",defaultPrefix:"wps",regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);} +if(data&&data.nodeType==9){data=data.documentElement;} +var info={};this.readNode(data,info);return info;},readers:{"wps":{"ProcessDescriptions":function(node,obj){obj.processDescriptions={};this.readChildNodes(node,obj.processDescriptions);},"ProcessDescription":function(node,processDescriptions){var processVersion=this.getAttributeNS(node,this.namespaces.wps,"processVersion");var processDescription={processVersion:processVersion,statusSupported:(node.getAttribute("statusSupported")==="true"),storeSupported:(node.getAttribute("storeSupported")==="true")};this.readChildNodes(node,processDescription);processDescriptions[processDescription.identifier]=processDescription;},"DataInputs":function(node,processDescription){processDescription.dataInputs=[];this.readChildNodes(node,processDescription.dataInputs);},"ProcessOutputs":function(node,processDescription){processDescription.processOutputs=[];this.readChildNodes(node,processDescription.processOutputs);},"Output":function(node,processOutputs){var output={};this.readChildNodes(node,output);processOutputs.push(output);},"ComplexOutput":function(node,output){output.complexOutput={};this.readChildNodes(node,output.complexOutput);},"Input":function(node,dataInputs){var input={maxOccurs:parseInt(node.getAttribute("maxOccurs")),minOccurs:parseInt(node.getAttribute("minOccurs"))};this.readChildNodes(node,input);dataInputs.push(input);},"BoundingBoxData":function(node,input){input.boundingBoxData={};this.readChildNodes(node,input.boundingBoxData);},"CRS":function(node,obj){if(!obj.CRSs){obj.CRSs={};} +obj.CRSs[this.getChildValue(node)]=true;},"LiteralData":function(node,input){input.literalData={};this.readChildNodes(node,input.literalData);},"ComplexData":function(node,input){input.complexData={};this.readChildNodes(node,input.complexData);},"Default":function(node,complexData){complexData["default"]={};this.readChildNodes(node,complexData["default"]);},"Supported":function(node,complexData){complexData["supported"]={};this.readChildNodes(node,complexData["supported"]);},"Format":function(node,obj){var format={};this.readChildNodes(node,format);if(!obj.formats){obj.formats={};} +obj.formats[format.mimeType]=true;},"MimeType":function(node,format){format.mimeType=this.getChildValue(node);}},"ows":OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers["ows"]},CLASS_NAME:"OpenLayers.Format.WPSDescribeProcess"});OpenLayers.Control.NavToolbar=OpenLayers.Class(OpenLayers.Control.Panel,{initialize:function(options){OpenLayers.Control.Panel.prototype.initialize.apply(this,[options]);this.addControls([new OpenLayers.Control.Navigation(),new OpenLayers.Control.ZoomBox()]);},draw:function(){var div=OpenLayers.Control.Panel.prototype.draw.apply(this,arguments);if(this.defaultControl===null){this.defaultControl=this.controls[0];} +return div;},CLASS_NAME:"OpenLayers.Control.NavToolbar"});OpenLayers.Format.CSWGetRecords.v2_0_2=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{csw:"http://www.opengis.net/cat/csw/2.0.2",dc:"http://purl.org/dc/elements/1.1/",dct:"http://purl.org/dc/terms/",geonet:"http://www.fao.org/geonetwork",ogc:"http://www.opengis.net/ogc",ows:"http://www.opengis.net/ows",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},defaultPrefix:"csw",version:"2.0.2",schemaLocation:"http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd",requestId:null,resultType:null,outputFormat:null,outputSchema:null,startPosition:null,maxRecords:null,DistributedSearch:null,ResponseHandler:null,Query:null,regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);} +if(data&&data.nodeType==9){data=data.documentElement;} +var obj={};this.readNode(data,obj);return obj;},readers:{"csw":{"GetRecordsResponse":function(node,obj){obj.records=[];this.readChildNodes(node,obj);var version=this.getAttributeNS(node,"",'version');if(version!=""){obj.version=version;}},"RequestId":function(node,obj){obj.RequestId=this.getChildValue(node);},"SearchStatus":function(node,obj){obj.SearchStatus={};var timestamp=this.getAttributeNS(node,"",'timestamp');if(timestamp!=""){obj.SearchStatus.timestamp=timestamp;}},"SearchResults":function(node,obj){this.readChildNodes(node,obj);var attrs=node.attributes;var SearchResults={};for(var i=0,len=attrs.length;i0){for(var i=0,len=ResponseHandler.length;i0){for(var i=0,len=ElementName.length;i'+feature.attributes.title+''+'

    '+feature.attributes.description+'

    ';} +data['overflow']=feature.attributes.overflow||"auto";var markerFeature=new OpenLayers.Feature(this,location,data);this.features.push(markerFeature);var marker=markerFeature.createMarker();if((feature.attributes.title!=null)&&(feature.attributes.description!=null)){marker.events.register('click',markerFeature,this.markerClick);} +this.addMarker(marker);} +this.events.triggerEvent("loadend");},markerClick:function(evt){var sameMarkerClicked=(this==this.layer.selectedFeature);this.layer.selectedFeature=(!sameMarkerClicked)?this:null;for(var i=0,len=this.layer.map.popups.length;i0){var feature=this.features[0];OpenLayers.Util.removeItem(this.features,feature);feature.destroy();}}},CLASS_NAME:"OpenLayers.Layer.Text"});OpenLayers.Handler.RegularPolygon=OpenLayers.Class(OpenLayers.Handler.Drag,{sides:4,radius:null,snapAngle:null,snapToggle:'shiftKey',layerOptions:null,persist:false,irregular:false,angle:null,fixedRadius:false,feature:null,layer:null,origin:null,initialize:function(control,callbacks,options){if(!(options&&options.layerOptions&&options.layerOptions.styleMap)){this.style=OpenLayers.Util.extend(OpenLayers.Feature.Vector.style['default'],{});} +OpenLayers.Handler.Drag.prototype.initialize.apply(this,[control,callbacks,options]);this.options=(options)?options:{};},setOptions:function(newOptions){OpenLayers.Util.extend(this.options,newOptions);OpenLayers.Util.extend(this,newOptions);},activate:function(){var activated=false;if(OpenLayers.Handler.Drag.prototype.activate.apply(this,arguments)){var options=OpenLayers.Util.extend({displayInLayerSwitcher:false,calculateInRange:OpenLayers.Function.True},this.layerOptions);this.layer=new OpenLayers.Layer.Vector(this.CLASS_NAME,options);this.map.addLayer(this.layer);activated=true;} +return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.Drag.prototype.deactivate.apply(this,arguments)){if(this.dragging){this.cancel();} +if(this.layer.map!=null){this.layer.destroy(false);if(this.feature){this.feature.destroy();}} +this.layer=null;this.feature=null;deactivated=true;} +return deactivated;},down:function(evt){this.fixedRadius=!!(this.radius);var maploc=this.map.getLonLatFromPixel(evt.xy);this.origin=new OpenLayers.Geometry.Point(maploc.lon,maploc.lat);if(!this.fixedRadius||this.irregular){this.radius=this.map.getResolution();} +if(this.persist){this.clear();} +this.feature=new OpenLayers.Feature.Vector();this.createGeometry();this.callback("create",[this.origin,this.feature]);this.layer.addFeatures([this.feature],{silent:true});this.layer.drawFeature(this.feature,this.style);},move:function(evt){var maploc=this.map.getLonLatFromPixel(evt.xy);var point=new OpenLayers.Geometry.Point(maploc.lon,maploc.lat);if(this.irregular){var ry=Math.sqrt(2)*Math.abs(point.y-this.origin.y)/2;this.radius=Math.max(this.map.getResolution()/2,ry);}else if(this.fixedRadius){this.origin=point;}else{this.calculateAngle(point,evt);this.radius=Math.max(this.map.getResolution()/2,point.distanceTo(this.origin));} +this.modifyGeometry();if(this.irregular){var dx=point.x-this.origin.x;var dy=point.y-this.origin.y;var ratio;if(dy==0){ratio=dx/(this.radius*Math.sqrt(2));}else{ratio=dx/dy;} +this.feature.geometry.resize(1,this.origin,ratio);this.feature.geometry.move(dx/2,dy/2);} +this.layer.drawFeature(this.feature,this.style);},up:function(evt){this.finalize();if(this.start==this.last){this.callback("done",[evt.xy]);}},out:function(evt){this.finalize();},createGeometry:function(){this.angle=Math.PI*((1/this.sides)-(1/2));if(this.snapAngle){this.angle+=this.snapAngle*(Math.PI/180);} +this.feature.geometry=OpenLayers.Geometry.Polygon.createRegularPolygon(this.origin,this.radius,this.sides,this.snapAngle);},modifyGeometry:function(){var angle,point;var ring=this.feature.geometry.components[0];if(ring.components.length!=(this.sides+1)){this.createGeometry();ring=this.feature.geometry.components[0];} +for(var i=0;i=0){symbolizer={Polygon:this.selectionSymbolizer['Polygon']};}else if(geometryAttribute.type.indexOf('LineString')>=0){symbolizer={Line:this.selectionSymbolizer['Line']};}else if(geometryAttribute.type.indexOf('Point')>=0){symbolizer={Point:this.selectionSymbolizer['Point']};} +var filter=filters[i];sld.namedLayers[name].userStyles.push({name:'default',rules:[new OpenLayers.Rule({symbolizer:symbolizer,filter:filter,maxScaleDenominator:layer.options.minScale})]});} +return new OpenLayers.Format.SLD({srsName:this.map.getProjection()}).write(sld);},parseDescribeLayer:function(request){var format=new OpenLayers.Format.WMSDescribeLayer();var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;} +var describeLayer=format.read(doc);var typeNames=[];var url=null;for(var i=0,len=describeLayer.length;i=0)||(type.indexOf('GeometryAssociationType')>=0)||(type.indexOf('GeometryPropertyType')>=0)||(type.indexOf('Point')>=0)||(type.indexOf('Polygon')>=0)){result.push(property);}}} +return result;},activate:function(){var activated=OpenLayers.Control.prototype.activate.call(this);if(activated){for(var i=0,len=this.layers.length;i=0){filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.DWITHIN,property:geometryAttribute.name,distance:this.map.getExtent().getWidth()*0.01,distanceUnits:this.map.getUnits(),value:geometry});}else{filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.INTERSECTS,property:geometryAttribute.name,value:geometry});}}else if(this.handler instanceof OpenLayers.Handler.Click){if(geometryAttribute.type.indexOf('Polygon')>=0){filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.INTERSECTS,property:geometryAttribute.name,value:geometry});}else{filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.DWITHIN,property:geometryAttribute.name,distance:this.map.getExtent().getWidth()*0.01,distanceUnits:this.map.getUnits(),value:geometry});}} +return filter;},select:function(geometry){this._queue=function(){for(var i=0,len=this.layers.length;i=9500&&scale<=950000){scale=Math.round(scale/1000)+"K";}else if(scale>=950000){scale=Math.round(scale/1000000)+"M";}else{scale=Math.round(scale);} +this.element.innerHTML=OpenLayers.i18n("Scale = 1 : ${scaleDenom}",{'scaleDenom':scale});},CLASS_NAME:"OpenLayers.Control.Scale"});OpenLayers.Control.Button=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_BUTTON,trigger:function(){},CLASS_NAME:"OpenLayers.Control.Button"});OpenLayers.Layer.MapGuide=OpenLayers.Class(OpenLayers.Layer.Grid,{isBaseLayer:true,useHttpTile:false,singleTile:false,useOverlay:false,useAsyncOverlay:true,TILE_PARAMS:{operation:'GETTILEIMAGE',version:'1.2.0'},SINGLE_TILE_PARAMS:{operation:'GETMAPIMAGE',format:'PNG',locale:'en',clip:'1',version:'1.0.0'},OVERLAY_PARAMS:{operation:'GETDYNAMICMAPOVERLAYIMAGE',format:'PNG',locale:'en',clip:'1',version:'2.0.0'},FOLDER_PARAMS:{tileColumnsPerFolder:30,tileRowsPerFolder:30,format:'png',querystring:null},defaultSize:new OpenLayers.Size(300,300),tileOriginCorner:"tl",initialize:function(name,url,params,options){OpenLayers.Layer.Grid.prototype.initialize.apply(this,arguments);if(options==null||options.isBaseLayer==null){this.isBaseLayer=((this.transparent!="true")&&(this.transparent!=true));} +if(options&&options.useOverlay!=null){this.useOverlay=options.useOverlay;} +if(this.singleTile){if(this.useOverlay){OpenLayers.Util.applyDefaults(this.params,this.OVERLAY_PARAMS);if(!this.useAsyncOverlay){this.params.version="1.0.0";}}else{OpenLayers.Util.applyDefaults(this.params,this.SINGLE_TILE_PARAMS);}}else{if(this.useHttpTile){OpenLayers.Util.applyDefaults(this.params,this.FOLDER_PARAMS);}else{OpenLayers.Util.applyDefaults(this.params,this.TILE_PARAMS);} +this.setTileSize(this.defaultSize);}},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.MapGuide(this.name,this.url,this.params,this.getOptions());} +obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},getURL:function(bounds){var url;var center=bounds.getCenterLonLat();var mapSize=this.map.getSize();if(this.singleTile){var params={setdisplaydpi:OpenLayers.DOTS_PER_INCH,setdisplayheight:mapSize.h*this.ratio,setdisplaywidth:mapSize.w*this.ratio,setviewcenterx:center.lon,setviewcentery:center.lat,setviewscale:this.map.getScale()};if(this.useOverlay&&!this.useAsyncOverlay){var getVisParams={};getVisParams=OpenLayers.Util.extend(getVisParams,params);getVisParams.operation="GETVISIBLEMAPEXTENT";getVisParams.version="1.0.0";getVisParams.session=this.params.session;getVisParams.mapName=this.params.mapName;getVisParams.format='text/xml';url=this.getFullRequestString(getVisParams);OpenLayers.Request.GET({url:url,async:false});} +url=this.getFullRequestString(params);}else{var currentRes=this.map.getResolution();var colidx=Math.floor((bounds.left-this.maxExtent.left)/currentRes);colidx=Math.round(colidx/this.tileSize.w);var rowidx=Math.floor((this.maxExtent.top-bounds.top)/currentRes);rowidx=Math.round(rowidx/this.tileSize.h);if(this.useHttpTile){url=this.getImageFilePath({tilecol:colidx,tilerow:rowidx,scaleindex:this.resolutions.length-this.map.zoom-1});}else{url=this.getFullRequestString({tilecol:colidx,tilerow:rowidx,scaleindex:this.resolutions.length-this.map.zoom-1});}} +return url;},getFullRequestString:function(newParams,altUrl){var url=(altUrl==null)?this.url:altUrl;if(typeof url=="object"){url=url[Math.floor(Math.random()*url.length)];} +var requestString=url;var allParams=OpenLayers.Util.extend({},this.params);allParams=OpenLayers.Util.extend(allParams,newParams);var urlParams=OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(url));for(var key in allParams){if(key.toUpperCase()in urlParams){delete allParams[key];}} +var paramsString=OpenLayers.Util.getParameterString(allParams);paramsString=paramsString.replace(/,/g,"+");if(paramsString!=""){var lastServerChar=url.charAt(url.length-1);if((lastServerChar=="&")||(lastServerChar=="?")){requestString+=paramsString;}else{if(url.indexOf('?')==-1){requestString+='?'+paramsString;}else{requestString+='&'+paramsString;}}} +return requestString;},getImageFilePath:function(newParams,altUrl){var url=(altUrl==null)?this.url:altUrl;if(typeof url=="object"){url=url[Math.floor(Math.random()*url.length)];} +var requestString=url;var tileRowGroup="";var tileColGroup="";if(newParams.tilerow<0){tileRowGroup='-';} +if(newParams.tilerow==0){tileRowGroup+='0';}else{tileRowGroup+=Math.floor(Math.abs(newParams.tilerow/this.params.tileRowsPerFolder))*this.params.tileRowsPerFolder;} +if(newParams.tilecol<0){tileColGroup='-';} +if(newParams.tilecol==0){tileColGroup+='0';}else{tileColGroup+=Math.floor(Math.abs(newParams.tilecol/this.params.tileColumnsPerFolder))*this.params.tileColumnsPerFolder;} +var tilePath='/S'+Math.floor(newParams.scaleindex) ++'/'+this.params.basemaplayergroupname ++'/R'+tileRowGroup ++'/C'+tileColGroup ++'/'+(newParams.tilerow%this.params.tileRowsPerFolder) ++'_'+(newParams.tilecol%this.params.tileColumnsPerFolder) ++'.'+this.params.format;if(this.params.querystring){tilePath+="?"+this.params.querystring;} +requestString+=tilePath;return requestString;},calculateGridLayout:function(bounds,origin,resolution){var tilelon=resolution*this.tileSize.w;var tilelat=resolution*this.tileSize.h;var offsetlon=bounds.left-origin.lon;var tilecol=Math.floor(offsetlon/tilelon)-this.buffer;var tilecolremain=offsetlon/tilelon-tilecol;var tileoffsetx=-tilecolremain*this.tileSize.w;var tileoffsetlon=origin.lon+tilecol*tilelon;var offsetlat=origin.lat-bounds.top+tilelat;var tilerow=Math.floor(offsetlat/tilelat)-this.buffer;var tilerowremain=tilerow-offsetlat/tilelat;var tileoffsety=tilerowremain*this.tileSize.h;var tileoffsetlat=origin.lat-tilelat*tilerow;return{tilelon:tilelon,tilelat:tilelat,tileoffsetlon:tileoffsetlon,tileoffsetlat:tileoffsetlat,tileoffsetx:tileoffsetx,tileoffsety:tileoffsety};},CLASS_NAME:"OpenLayers.Layer.MapGuide"});OpenLayers.Control.Measure=OpenLayers.Class(OpenLayers.Control,{EVENT_TYPES:['measure','measurepartial'],handlerOptions:null,callbacks:null,displaySystem:'metric',geodesic:false,displaySystemUnits:{geographic:['dd'],english:['mi','ft','in'],metric:['km','m']},partialDelay:300,delayedTrigger:null,persist:false,immediate:false,initialize:function(handler,options){this.EVENT_TYPES=OpenLayers.Control.Measure.prototype.EVENT_TYPES.concat(OpenLayers.Control.prototype.EVENT_TYPES);OpenLayers.Control.prototype.initialize.apply(this,[options]);var callbacks={done:this.measureComplete,point:this.measurePartial};if(this.immediate){callbacks.modify=this.measureImmediate;} +this.callbacks=OpenLayers.Util.extend(callbacks,this.callbacks);this.handlerOptions=OpenLayers.Util.extend({persist:this.persist},this.handlerOptions);this.handler=new handler(this,this.callbacks,this.handlerOptions);},deactivate:function(){this.cancelDelay();return OpenLayers.Control.prototype.deactivate.apply(this,arguments);},cancel:function(){this.cancelDelay();this.handler.cancel();},setImmediate:function(immediate){this.immediate=immediate;if(this.immediate){this.callbacks.modify=this.measureImmediate;}else{delete this.callbacks.modify;}},updateHandler:function(handler,options){var active=this.active;if(active){this.deactivate();} +this.handler=new handler(this,this.callbacks,options);if(active){this.activate();}},measureComplete:function(geometry){this.cancelDelay();this.measure(geometry,"measure");},measurePartial:function(point,geometry){this.cancelDelay();geometry=geometry.clone();if(this.handler.freehandMode(this.handler.evt)){this.measure(geometry,"measurepartial");}else{this.delayedTrigger=window.setTimeout(OpenLayers.Function.bind(function(){this.delayedTrigger=null;this.measure(geometry,"measurepartial");},this),this.partialDelay);}},measureImmediate:function(point,feature,drawing){if(drawing&&this.delayedTrigger===null&&!this.handler.freehandMode(this.handler.evt)){this.measure(feature.geometry,"measurepartial");}},cancelDelay:function(){if(this.delayedTrigger!==null){window.clearTimeout(this.delayedTrigger);this.delayedTrigger=null;}},measure:function(geometry,eventType){var stat,order;if(geometry.CLASS_NAME.indexOf('LineString')>-1){stat=this.getBestLength(geometry);order=1;}else{stat=this.getBestArea(geometry);order=2;} +this.events.triggerEvent(eventType,{measure:stat[0],units:stat[1],order:order,geometry:geometry});},getBestArea:function(geometry){var units=this.displaySystemUnits[this.displaySystem];var unit,area;for(var i=0,len=units.length;i1){break;}} +return[area,unit];},getArea:function(geometry,units){var area,geomUnits;if(this.geodesic){area=geometry.getGeodesicArea(this.map.getProjectionObject());geomUnits="m";}else{area=geometry.getArea();geomUnits=this.map.getUnits();} +var inPerDisplayUnit=OpenLayers.INCHES_PER_UNIT[units];if(inPerDisplayUnit){var inPerMapUnit=OpenLayers.INCHES_PER_UNIT[geomUnits];area*=Math.pow((inPerMapUnit/inPerDisplayUnit),2);} +return area;},getBestLength:function(geometry){var units=this.displaySystemUnits[this.displaySystem];var unit,length;for(var i=0,len=units.length;i1){break;}} +return[length,unit];},getLength:function(geometry,units){var length,geomUnits;if(this.geodesic){length=geometry.getGeodesicLength(this.map.getProjectionObject());geomUnits="m";}else{length=geometry.getLength();geomUnits=this.map.getUnits();} +var inPerDisplayUnit=OpenLayers.INCHES_PER_UNIT[units];if(inPerDisplayUnit){var inPerMapUnit=OpenLayers.INCHES_PER_UNIT[geomUnits];length*=(inPerMapUnit/inPerDisplayUnit);} +return length;},CLASS_NAME:"OpenLayers.Control.Measure"});OpenLayers.Layer.KaMap=OpenLayers.Class(OpenLayers.Layer.Grid,{isBaseLayer:true,units:null,resolution:OpenLayers.DOTS_PER_INCH,DEFAULT_PARAMS:{i:'jpeg',map:''},initialize:function(name,url,params,options){var newArguments=[];newArguments.push(name,url,params,options);OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);this.params=OpenLayers.Util.applyDefaults(this.params,this.DEFAULT_PARAMS);},getURL:function(bounds){bounds=this.adjustBounds(bounds);var mapRes=this.map.getResolution();var scale=Math.round((this.map.getScale()*10000))/10000;var pX=Math.round(bounds.left/mapRes);var pY=-Math.round(bounds.top/mapRes);return this.getFullRequestString({t:pY,l:pX,s:scale});},calculateGridLayout:function(bounds,origin,resolution){var tilelon=resolution*this.tileSize.w;var tilelat=resolution*this.tileSize.h;var offsetlon=bounds.left;var tilecol=Math.floor(offsetlon/tilelon)-this.buffer;var tilecolremain=offsetlon/tilelon-tilecol;var tileoffsetx=-tilecolremain*this.tileSize.w;var tileoffsetlon=tilecol*tilelon;var offsetlat=bounds.top;var tilerow=Math.ceil(offsetlat/tilelat)+this.buffer;var tilerowremain=tilerow-offsetlat/tilelat;var tileoffsety=-(tilerowremain+1)*this.tileSize.h;var tileoffsetlat=tilerow*tilelat;return{tilelon:tilelon,tilelat:tilelat,tileoffsetlon:tileoffsetlon,tileoffsetlat:tileoffsetlat,tileoffsetx:tileoffsetx,tileoffsety:tileoffsety};},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.KaMap(this.name,this.url,this.params,this.getOptions());} +obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);if(this.tileSize!=null){obj.tileSize=this.tileSize.clone();} +obj.grid=[];return obj;},getTileBounds:function(viewPortPx){var resolution=this.getResolution();var tileMapWidth=resolution*this.tileSize.w;var tileMapHeight=resolution*this.tileSize.h;var mapPoint=this.getLonLatFromViewPortPx(viewPortPx);var tileLeft=tileMapWidth*Math.floor(mapPoint.lon/tileMapWidth);var tileBottom=tileMapHeight*Math.floor(mapPoint.lat/tileMapHeight);return new OpenLayers.Bounds(tileLeft,tileBottom,tileLeft+tileMapWidth,tileBottom+tileMapHeight);},CLASS_NAME:"OpenLayers.Layer.KaMap"});OpenLayers.Popup.Framed=OpenLayers.Class(OpenLayers.Popup.Anchored,{imageSrc:null,imageSize:null,isAlphaImage:false,positionBlocks:null,blocks:null,fixedRelativePosition:false,initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){OpenLayers.Popup.Anchored.prototype.initialize.apply(this,arguments);if(this.fixedRelativePosition){this.updateRelativePosition();this.calculateRelativePosition=function(px){return this.relativePosition;};} +this.contentDiv.style.position="absolute";this.contentDiv.style.zIndex=1;if(closeBox){this.closeDiv.style.zIndex=1;} +this.groupDiv.style.position="absolute";this.groupDiv.style.top="0px";this.groupDiv.style.left="0px";this.groupDiv.style.height="100%";this.groupDiv.style.width="100%";},destroy:function(){this.imageSrc=null;this.imageSize=null;this.isAlphaImage=null;this.fixedRelativePosition=false;this.positionBlocks=null;for(var i=0;ithis.maxGetUrlLength;if(this.imgDiv!=null){var nodeName=this.imgDiv.nodeName.toLowerCase();if((this.useIFrame&&nodeName=="img")||(!this.useIFrame&&nodeName=="div")){this.removeImgDiv();this.imgDiv=null;}} +if(this.useIFrame){if(this.imgDiv==null){var eventPane=document.createElement("div");if(OpenLayers.BROWSER_NAME=="msie"){eventPane.style.backgroundColor='#FFFFFF';eventPane.style.filter='chroma(color=#FFFFFF)';} +OpenLayers.Util.modifyDOMElement(eventPane,null,new OpenLayers.Pixel(0,0),this.layer.getImageSize(),"absolute");this.imgDiv=document.createElement("div");this.imgDiv.appendChild(eventPane);OpenLayers.Util.modifyDOMElement(this.imgDiv,this.id,null,this.layer.getImageSize(),"relative");this.imgDiv.className='olTileImage';this.frame.appendChild(this.imgDiv);this.layer.div.appendChild(this.frame);if(this.layer.opacity!=null){OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,null,null,null,null,this.layer.opacity);} +this.imgDiv.map=this.layer.map;} +this.imgDiv.viewRequestID=this.layer.map.viewRequestID;}else{OpenLayers.Tile.Image.prototype.initImgDiv.apply(this,arguments);}},createIFrame:function(){var id=this.id+'_iFrame';var iframe;if(OpenLayers.BROWSER_NAME=="msie"){iframe=document.createElement('', + closable : true, + icon : 'icon-set' + }); + +} +// 瀹氫綅椤圭洰 +function dingweiProject(v) { + findCircle.deactivate(); + findPoint.deactivate(); + findSquare.deactivate(); + findPolygon.deactivate(); + findLine.deactivate(); + drawPoint.deactivate(); + drawPolygon.deactivate(); + drawLine.deactivate(); + measureDistance.deactivate(); + measureArea.deactivate(); + $.messager.progress({ + text : '椤甸潰鍔犺浇涓....', + interval : 100 + }); + $.ajax({ + async : false, + cache : false, + type : 'POST', + url : "mapController.do?getProjectDetail&declareid=" + v,// 璇锋眰鐨刟ction璺緞 + error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟 + }, + success : function(data) { + var d = $.parseJSON(data); + projectDetail(d); + } + }); +} + +function projectDetail(d) { + // 娓呴櫎buffer灞備笂鐨勬诞浜 + clearAllFeaturPopups("bufferLayer"); + // 娓呴櫎鍥惧眰鐨勮绱 + clearFeatur("selectLayer,bufferLayer,hightLayer,drawLayer"); + // 娓呴櫎markers + clearAllMarks(); + // 璁剧疆娑堟伅鏍忎负绌 + document.getElementById('message').innerHTML = ""; + bufferLayer.removeAllFeatures(); + for ( var i = 0; i < d.length; i++) { + var detialid = d[i].detialid;// 鏄庣粏缂栧彿 + var declareid = d[i].declareid;// 鐢虫姤缂栧彿 + var constructionunit = d[i].constructionunit;// 寤鸿鍗曚綅 + var projectname = d[i].projectname;// 椤圭洰鍚嶇О + var statusid = d[i].statusid;// 鐘舵 + var buildingno = d[i].buildingno;// 鏍嬪彿 + var undergroundconstructionarea = d[i].undergroundconstructionarea;// 鍦颁笅寤虹瓚闈㈢Н + if (d[i].geom != null && d[i].geom != "") { + var temp = d[i].geom; + var geojson_format = new OpenLayers.Format.GeoJSON(); + var plg = geojson_format.read(temp, "Geometry"); + var feature = geojson_format.read(temp); + bufferLayer.addFeatures([ feature ]); + // 瀹氫綅涓績浣嶇疆缁忓害 + var lon = plg.getBounds().getCenterLonLat().lon; + // 瀹氫綅涓績浣嶇疆绾害 + var lat = plg.getBounds().getCenterLonLat().lat; + // 鑾峰緱褰撳墠缂╂斁绾у埆 + var level = 8;// map.getZoom(); + // 閲嶆柊瀹氫綅 + // map.setCenter(new OpenLayers.LonLat(lon, lat), level); + var lonlat = new OpenLayers.LonLat(lon, lat); + locateMap(lonlat, level); + // 寮瑰嚭淇℃伅 + var result = " " + + " "; + result += ""; + result += ""; + result += ""; + result += ""; + result += ""; + result += ""; + result += " "; + result += "
    椤圭洰鍚嶇О:" + projectname + "
    寤鸿鍗曚綅:" + constructionunit + "
    鏍嬪彿:" + buildingno + "
    鍦颁笅寤虹瓚闈㈢Н(銕):" + + undergroundconstructionarea + "
    鐘舵:" + statusid + "
    鏌ョ湅璇︾粏
    "; + var popup = new OpenLayers.Popup.FramedCloud("chicken", plg + .getBounds().getCenterLonLat(), null, result, null, true); + feature.popup = popup; + map.addPopup(popup); + } + } + $.messager.progress('close'); + // 鑻ュ湴鍥句笂杩樻病鏈夌敾璇ュ浘褰紝鍒欒鐢ㄦ埛鐢诲嚭 + drawProject(d); +} +// 缁樺埗鍦颁笅瀹 +function drawProject(d) { + for ( var i = 0; i < d.length; i++) { + if (d[i].geom == null || d[i].geom == "") { + // 寮濮嬬敾鍥 + jsondata = d; + drawPolygon.activate(); + return; + } + } +} + +// 鏇存柊椤圭洰璇︾粏淇℃伅 +function saveProject(value, geomstr) { + $.ajax({ + type : 'POST', + url : "mapController.do?saveProjectGeom&geomstr=" + geomstr + + "&detailid=" + value,// 璇锋眰鐨刟ction璺緞 + error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟 + alert("淇濆瓨澶辫触璇烽噸璇曪紒"); + }, + success : function(data) { + alert("淇濆瓨鎴愬姛锛"); + clearAllFeaturPopups("drawLayer"); + drawPolygon.deactivate();// 淇濆瓨鎴愬姛鍙栨秷缁樼敾 + } + }); +} + +// 寮瑰嚭淇濆瓨椤圭洰鏄庣粏 +function addFeaturePopup(feature) { + var format = new OpenLayers.Format.WKT(new OpenLayers.Projection( + "EPSG:2362")); + var str = format.write(feature, false); + if (jsondata != null) { + for ( var i = 0; i < jsondata.length; i++) { + var detialid = jsondata[i].detialid;// 鏄庣粏缂栧彿 + var declareid = jsondata[i].declareid;// 鐢虫姤缂栧彿 + var constructionunit = jsondata[i].constructionunit;// 寤鸿鍗曚綅 + var projectname = jsondata[i].projectname;// 椤圭洰鍚嶇О + var buildingno = jsondata[i].buildingno;// 鏍嬪彿 + var statusid = jsondata[i].statusid;// 鐘舵 + var undergroundconstructionarea = jsondata[i].undergroundconstructionarea;// 鍦颁笅寤虹瓚闈㈢Н + if (jsondata[i].geom == null || jsondata[i].geom == "") { + // 寮瑰嚭淇℃伅 + var result = " " + + " "; + result += ""; + result += ""; + result += ""; + result += ""; + result += ""; + result += ""; + result += " "; + result += "
    椤圭洰鍚嶇О:" + projectname + "
    寤鸿鍗曚綅:" + constructionunit + + "
    鏍嬪彿:" + buildingno + "
    鍦颁笅寤虹瓚闈㈢Н(銕):" + + undergroundconstructionarea + "
    鐘舵:" + statusid + "
    淇濆瓨
    "; + var popup = new OpenLayers.Popup.FramedCloud("chicken", + feature.geometry.getBounds().getCenterLonLat(), null, + result, null, true, onPopupClose); + feature.popup = popup; + map.addPopup(popup); + } + } + } + +} +// 鏆傛椂鏈敤鍑芥暟缁撴潫 + +//鍖哄煙缁熻涓撻鍥惧紑濮 +//鍙傛暟锛歞isplayType 鏄剧ず绫诲瀷锛屾樉绀洪珮浜姞鏁板瓧鎴栭珮浜姞楗煎浘锛岀嚎鍥剧瓑 + +function quyutjztt(displayType){ + // 娓呴櫎buffer灞備笂鐨勬诞浜 + clearAllFeaturPopups("bufferLayer"); + // 娓呴櫎鍥惧眰鐨勮绱 + clearFeatur("selectLayer,bufferLayer,hightLayer,drawLayer,lableLayer"); + // 娓呴櫎markers + clearAllMarks(); + $.messager.progress({ + text : '椤甸潰鍔犺浇涓....', + interval : 100 + }); + //鍙傛暟锛歵jtype缁熻绫诲瀷 'ztt' 涓撻鍥剧粺璁★紝'bt' 楗煎浘锛'zzt' 鏌辩姸鍥撅紝'zxt' 鎶樼嚎鍥撅紱 + //tjqy 缁熻鍖哄煙锛堟暟鎹簱琛級锛宼jdx缁熻瀵硅薄锛堟暟鎹簱琛級 + $.ajax({ + type : 'POST', + url : "mapController.do?getTjInfo&tjtype=bt&tjqy=m_xingzhengqujie&tjdx=m_gongjiaozhandian",// 璇锋眰鐨刟ction璺緞 + error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟 + }, + success : function(data) { + retstr = $.parseJSON(data); + + var tc = "zhengzhou:m_xingzhengqujie";//鍥惧眰 + var tjsj="";//鍖哄煙缁熻鏁版嵁 + var fids=""; + for ( var i = 0; i < retstr.length; i++) { + + if(i==0){ + tjsj+=retstr[i].tjinfo; + fids+="m_xingzhengqujie."+retstr[i].fid+""; + }else{ + tjsj+=","+retstr[i].tjinfo; + fids+=",m_xingzhengqujie."+retstr[i].fid+""; + } + } + tjsj=tjsj.split(","); + fids=fids.split(","); + // 鑾峰緱鍖哄煙淇℃伅 + var my_filter = new OpenLayers.Filter.FeatureId({ + fids : fids + }); + var xmlPara = getXmlPara(tc, my_filter); + var url = "http://" + mapServerIP + ":" + mapServerPort + "/geoserver/wfs?" + var request = OpenLayers.Request.POST({ + url : url, + data : xmlPara, + callback : function(req) { + var colors = ["#FAEBD7","#F0F8FF", "#F0FFFF", "#F8F8FF", "#FFFFF0", "#FDF5E6"]; + var gmlParse = new OpenLayers.Format.GML(); + var features = gmlParse.read(req.responseText); + var feature; + for ( var feat in features) { + feature = features[feat]; + var tjvalue=""; + for(var j=0;j= len(self.contents): + newChild.nextSibling = None + + parent = self + parentsNextSibling = None + while not parentsNextSibling: + parentsNextSibling = parent.nextSibling + parent = parent.parent + if not parent: # This is the last element in the document. + break + if parentsNextSibling: + newChildsLastElement.next = parentsNextSibling + else: + newChildsLastElement.next = None + else: + nextChild = self.contents[position] + newChild.nextSibling = nextChild + if newChild.nextSibling: + newChild.nextSibling.previousSibling = newChild + newChildsLastElement.next = nextChild + + if newChildsLastElement.next: + newChildsLastElement.next.previous = newChildsLastElement + self.contents.insert(position, newChild) + + def findNext(self, name=None, attrs={}, text=None, **kwargs): + """Returns the first item that matches the given criteria and + appears after this Tag in the document.""" + return self._findOne(self.findAllNext, name, attrs, text, **kwargs) + + def findAllNext(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns all items that match the given criteria and appear + before after Tag in the document.""" + return self._findAll(name, attrs, text, limit, self.nextGenerator) + + def findNextSibling(self, name=None, attrs={}, text=None, **kwargs): + """Returns the closest sibling to this Tag that matches the + given criteria and appears after this Tag in the document.""" + return self._findOne(self.findNextSiblings, name, attrs, text, + **kwargs) + + def findNextSiblings(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns the siblings of this Tag that match the given + criteria and appear after this Tag in the document.""" + return self._findAll(name, attrs, text, limit, + self.nextSiblingGenerator, **kwargs) + fetchNextSiblings = findNextSiblings # Compatibility with pre-3.x + + def findPrevious(self, name=None, attrs={}, text=None, **kwargs): + """Returns the first item that matches the given criteria and + appears before this Tag in the document.""" + return self._findOne(self.findAllPrevious, name, attrs, text, **kwargs) + + def findAllPrevious(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns all items that match the given criteria and appear + before this Tag in the document.""" + return self._findAll(name, attrs, text, limit, self.previousGenerator, + **kwargs) + fetchPrevious = findAllPrevious # Compatibility with pre-3.x + + def findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs): + """Returns the closest sibling to this Tag that matches the + given criteria and appears before this Tag in the document.""" + return self._findOne(self.findPreviousSiblings, name, attrs, text, + **kwargs) + + def findPreviousSiblings(self, name=None, attrs={}, text=None, + limit=None, **kwargs): + """Returns the siblings of this Tag that match the given + criteria and appear before this Tag in the document.""" + return self._findAll(name, attrs, text, limit, + self.previousSiblingGenerator, **kwargs) + fetchPreviousSiblings = findPreviousSiblings # Compatibility with pre-3.x + + def findParent(self, name=None, attrs={}, **kwargs): + """Returns the closest parent of this Tag that matches the given + criteria.""" + # NOTE: We can't use _findOne because findParents takes a different + # set of arguments. + r = None + l = self.findParents(name, attrs, 1) + if l: + r = l[0] + return r + + def findParents(self, name=None, attrs={}, limit=None, **kwargs): + """Returns the parents of this Tag that match the given + criteria.""" + + return self._findAll(name, attrs, None, limit, self.parentGenerator, + **kwargs) + fetchParents = findParents # Compatibility with pre-3.x + + #These methods do the real heavy lifting. + + def _findOne(self, method, name, attrs, text, **kwargs): + r = None + l = method(name, attrs, text, 1, **kwargs) + if l: + r = l[0] + return r + + def _findAll(self, name, attrs, text, limit, generator, **kwargs): + "Iterates over a generator looking for things that match." + + if isinstance(name, SoupStrainer): + strainer = name + else: + # Build a SoupStrainer + strainer = SoupStrainer(name, attrs, text, **kwargs) + results = ResultSet(strainer) + g = generator() + while True: + try: + i = g.next() + except StopIteration: + break + if i: + found = strainer.search(i) + if found: + results.append(found) + if limit and len(results) >= limit: + break + return results + + #These Generators can be used to navigate starting from both + #NavigableStrings and Tags. + def nextGenerator(self): + i = self + while i: + i = i.next + yield i + + def nextSiblingGenerator(self): + i = self + while i: + i = i.nextSibling + yield i + + def previousGenerator(self): + i = self + while i: + i = i.previous + yield i + + def previousSiblingGenerator(self): + i = self + while i: + i = i.previousSibling + yield i + + def parentGenerator(self): + i = self + while i: + i = i.parent + yield i + + # Utility methods + def substituteEncoding(self, str, encoding=None): + encoding = encoding or "utf-8" + return str.replace("%SOUP-ENCODING%", encoding) + + def toEncoding(self, s, encoding=None): + """Encodes an object to a string in some encoding, or to Unicode. + .""" + if isinstance(s, unicode): + if encoding: + s = s.encode(encoding) + elif isinstance(s, str): + if encoding: + s = s.encode(encoding) + else: + s = unicode(s) + else: + if encoding: + s = self.toEncoding(str(s), encoding) + else: + s = unicode(s) + return s + +class NavigableString(unicode, PageElement): + + def __getattr__(self, attr): + """text.string gives you text. This is for backwards + compatibility for Navigable*String, but for CData* it lets you + get the string without the CData wrapper.""" + if attr == 'string': + return self + else: + raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr) + + def __unicode__(self): + return self.__str__(None) + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + if encoding: + return self.encode(encoding) + else: + return self + +class CData(NavigableString): + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + +class ProcessingInstruction(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + output = self + if "%SOUP-ENCODING%" in output: + output = self.substituteEncoding(output, encoding) + return "" % self.toEncoding(output, encoding) + +class Comment(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + +class Declaration(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + +class Tag(PageElement): + + """Represents a found HTML tag with its attributes and contents.""" + + XML_SPECIAL_CHARS_TO_ENTITIES = { "'" : "squot", + '"' : "quote", + "&" : "amp", + "<" : "lt", + ">" : "gt" } + + def __init__(self, parser, name, attrs=None, parent=None, + previous=None): + "Basic constructor." + + # We don't actually store the parser object: that lets extracted + # chunks be garbage-collected + self.parserClass = parser.__class__ + self.isSelfClosing = parser.isSelfClosingTag(name) + self.name = name + if attrs == None: + attrs = [] + self.attrs = attrs + self.contents = [] + self.setup(parent, previous) + self.hidden = False + self.containsSubstitutions = False + + def get(self, key, default=None): + """Returns the value of the 'key' attribute for the tag, or + the value given for 'default' if it doesn't have that + attribute.""" + return self._getAttrMap().get(key, default) + + def has_key(self, key): + return self._getAttrMap().has_key(key) + + def __getitem__(self, key): + """tag[key] returns the value of the 'key' attribute for the tag, + and throws an exception if it's not there.""" + return self._getAttrMap()[key] + + def __iter__(self): + "Iterating over a tag iterates over its contents." + return iter(self.contents) + + def __len__(self): + "The length of a tag is the length of its list of contents." + return len(self.contents) + + def __contains__(self, x): + return x in self.contents + + def __nonzero__(self): + "A tag is non-None even if it has no contents." + return True + + def __setitem__(self, key, value): + """Setting tag[key] sets the value of the 'key' attribute for the + tag.""" + self._getAttrMap() + self.attrMap[key] = value + found = False + for i in range(0, len(self.attrs)): + if self.attrs[i][0] == key: + self.attrs[i] = (key, value) + found = True + if not found: + self.attrs.append((key, value)) + self._getAttrMap()[key] = value + + def __delitem__(self, key): + "Deleting tag[key] deletes all 'key' attributes for the tag." + for item in self.attrs: + if item[0] == key: + self.attrs.remove(item) + #We don't break because bad HTML can define the same + #attribute multiple times. + self._getAttrMap() + if self.attrMap.has_key(key): + del self.attrMap[key] + + def __call__(self, *args, **kwargs): + """Calling a tag like a function is the same as calling its + findAll() method. Eg. tag('a') returns a list of all the A tags + found within this tag.""" + return apply(self.findAll, args, kwargs) + + def __getattr__(self, tag): + #print "Getattr %s.%s" % (self.__class__, tag) + if len(tag) > 3 and tag.rfind('Tag') == len(tag)-3: + return self.find(tag[:-3]) + elif tag.find('__') != 0: + return self.find(tag) + + def __eq__(self, other): + """Returns true iff this tag has the same name, the same attributes, + and the same contents (recursively) as the given tag. + + NOTE: right now this will return false if two tags have the + same attributes in a different order. Should this be fixed?""" + if not hasattr(other, 'name') or not hasattr(other, 'attrs') or not hasattr(other, 'contents') or self.name != other.name or self.attrs != other.attrs or len(self) != len(other): + return False + for i in range(0, len(self.contents)): + if self.contents[i] != other.contents[i]: + return False + return True + + def __ne__(self, other): + """Returns true iff this tag is not identical to the other tag, + as defined in __eq__.""" + return not self == other + + def __repr__(self, encoding=DEFAULT_OUTPUT_ENCODING): + """Renders this tag as a string.""" + return self.__str__(encoding) + + def __unicode__(self): + return self.__str__(None) + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING, + prettyPrint=False, indentLevel=0): + """Returns a string or Unicode representation of this tag and + its contents. To get Unicode, pass None for encoding. + + NOTE: since Python's HTML parser consumes whitespace, this + method is not certain to reproduce the whitespace present in + the original string.""" + + encodedName = self.toEncoding(self.name, encoding) + + attrs = [] + if self.attrs: + for key, val in self.attrs: + fmt = '%s="%s"' + if isString(val): + if self.containsSubstitutions and '%SOUP-ENCODING%' in val: + val = self.substituteEncoding(val, encoding) + + # The attribute value either: + # + # * Contains no embedded double quotes or single quotes. + # No problem: we enclose it in double quotes. + # * Contains embedded single quotes. No problem: + # double quotes work here too. + # * Contains embedded double quotes. No problem: + # we enclose it in single quotes. + # * Embeds both single _and_ double quotes. This + # can't happen naturally, but it can happen if + # you modify an attribute value after parsing + # the document. Now we have a bit of a + # problem. We solve it by enclosing the + # attribute in single quotes, and escaping any + # embedded single quotes to XML entities. + if '"' in val: + fmt = "%s='%s'" + # This can't happen naturally, but it can happen + # if you modify an attribute value after parsing. + if "'" in val: + val = val.replace("'", "&squot;") + + # Now we're okay w/r/t quotes. But the attribute + # value might also contain angle brackets, or + # ampersands that aren't part of entities. We need + # to escape those to XML entities too. + val = re.sub("([<>]|&(?![^\s]+;))", + lambda x: "&" + self.XML_SPECIAL_CHARS_TO_ENTITIES[x.group(0)[0]] + ";", + val) + + attrs.append(fmt % (self.toEncoding(key, encoding), + self.toEncoding(val, encoding))) + close = '' + closeTag = '' + if self.isSelfClosing: + close = ' /' + else: + closeTag = '' % encodedName + + indentTag, indentContents = 0, 0 + if prettyPrint: + indentTag = indentLevel + space = (' ' * (indentTag-1)) + indentContents = indentTag + 1 + contents = self.renderContents(encoding, prettyPrint, indentContents) + if self.hidden: + s = contents + else: + s = [] + attributeString = '' + if attrs: + attributeString = ' ' + ' '.join(attrs) + if prettyPrint: + s.append(space) + s.append('<%s%s%s>' % (encodedName, attributeString, close)) + if prettyPrint: + s.append("\n") + s.append(contents) + if prettyPrint and contents and contents[-1] != "\n": + s.append("\n") + if prettyPrint and closeTag: + s.append(space) + s.append(closeTag) + if prettyPrint and closeTag and self.nextSibling: + s.append("\n") + s = ''.join(s) + return s + + def prettify(self, encoding=DEFAULT_OUTPUT_ENCODING): + return self.__str__(encoding, True) + + def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING, + prettyPrint=False, indentLevel=0): + """Renders the contents of this tag as a string in the given + encoding. If encoding is None, returns a Unicode string..""" + s=[] + for c in self: + text = None + if isinstance(c, NavigableString): + text = c.__str__(encoding) + elif isinstance(c, Tag): + s.append(c.__str__(encoding, prettyPrint, indentLevel)) + if text and prettyPrint: + text = text.strip() + if text: + if prettyPrint: + s.append(" " * (indentLevel-1)) + s.append(text) + if prettyPrint: + s.append("\n") + return ''.join(s) + + #Soup methods + + def find(self, name=None, attrs={}, recursive=True, text=None, + **kwargs): + """Return only the first child of this Tag matching the given + criteria.""" + r = None + l = self.findAll(name, attrs, recursive, text, 1, **kwargs) + if l: + r = l[0] + return r + findChild = find + + def findAll(self, name=None, attrs={}, recursive=True, text=None, + limit=None, **kwargs): + """Extracts a list of Tag objects that match the given + criteria. You can specify the name of the Tag and any + attributes you want the Tag to have. + + The value of a key-value pair in the 'attrs' map can be a + string, a list of strings, a regular expression object, or a + callable that takes a string and returns whether or not the + string matches for some custom definition of 'matches'. The + same is true of the tag name.""" + generator = self.recursiveChildGenerator + if not recursive: + generator = self.childGenerator + return self._findAll(name, attrs, text, limit, generator, **kwargs) + findChildren = findAll + + # Pre-3.x compatibility methods + first = find + fetch = findAll + + def fetchText(self, text=None, recursive=True, limit=None): + return self.findAll(text=text, recursive=recursive, limit=limit) + + def firstText(self, text=None, recursive=True): + return self.find(text=text, recursive=recursive) + + #Utility methods + + def append(self, tag): + """Appends the given tag to the contents of this tag.""" + self.contents.append(tag) + + #Private methods + + def _getAttrMap(self): + """Initializes a map representation of this tag's attributes, + if not already initialized.""" + if not getattr(self, 'attrMap'): + self.attrMap = {} + for (key, value) in self.attrs: + self.attrMap[key] = value + return self.attrMap + + #Generator methods + def childGenerator(self): + for i in range(0, len(self.contents)): + yield self.contents[i] + raise StopIteration + + def recursiveChildGenerator(self): + stack = [(self, 0)] + while stack: + tag, start = stack.pop() + if isinstance(tag, Tag): + for i in range(start, len(tag.contents)): + a = tag.contents[i] + yield a + if isinstance(a, Tag) and tag.contents: + if i < len(tag.contents) - 1: + stack.append((tag, i+1)) + stack.append((a, 0)) + break + raise StopIteration + +# Next, a couple classes to represent queries and their results. +class SoupStrainer: + """Encapsulates a number of ways of matching a markup element (tag or + text).""" + + def __init__(self, name=None, attrs={}, text=None, **kwargs): + self.name = name + if isString(attrs): + kwargs['class'] = attrs + attrs = None + if kwargs: + if attrs: + attrs = attrs.copy() + attrs.update(kwargs) + else: + attrs = kwargs + self.attrs = attrs + self.text = text + + def __str__(self): + if self.text: + return self.text + else: + return "%s|%s" % (self.name, self.attrs) + + def searchTag(self, markupName=None, markupAttrs={}): + found = None + markup = None + if isinstance(markupName, Tag): + markup = markupName + markupAttrs = markup + callFunctionWithTagData = callable(self.name) \ + and not isinstance(markupName, Tag) + + if (not self.name) \ + or callFunctionWithTagData \ + or (markup and self._matches(markup, self.name)) \ + or (not markup and self._matches(markupName, self.name)): + if callFunctionWithTagData: + match = self.name(markupName, markupAttrs) + else: + match = True + markupAttrMap = None + for attr, matchAgainst in self.attrs.items(): + if not markupAttrMap: + if hasattr(markupAttrs, 'get'): + markupAttrMap = markupAttrs + else: + markupAttrMap = {} + for k,v in markupAttrs: + markupAttrMap[k] = v + attrValue = markupAttrMap.get(attr) + if not self._matches(attrValue, matchAgainst): + match = False + break + if match: + if markup: + found = markup + else: + found = markupName + return found + + def search(self, markup): + #print 'looking for %s in %s' % (self, markup) + found = None + # If given a list of items, scan it for a text element that + # matches. + if isList(markup) and not isinstance(markup, Tag): + for element in markup: + if isinstance(element, NavigableString) \ + and self.search(element): + found = element + break + # If it's a Tag, make sure its name or attributes match. + # Don't bother with Tags if we're searching for text. + elif isinstance(markup, Tag): + if not self.text: + found = self.searchTag(markup) + # If it's text, make sure the text matches. + elif isinstance(markup, NavigableString) or \ + isString(markup): + if self._matches(markup, self.text): + found = markup + else: + raise Exception, "I don't know how to match against a %s" \ + % markup.__class__ + return found + + def _matches(self, markup, matchAgainst): + #print "Matching %s against %s" % (markup, matchAgainst) + result = False + if matchAgainst == True and type(matchAgainst) == types.BooleanType: + result = markup != None + elif callable(matchAgainst): + result = matchAgainst(markup) + else: + #Custom match methods take the tag as an argument, but all + #other ways of matching match the tag name as a string. + if isinstance(markup, Tag): + markup = markup.name + if markup and not isString(markup): + markup = unicode(markup) + #Now we know that chunk is either a string, or None. + if hasattr(matchAgainst, 'match'): + # It's a regexp object. + result = markup and matchAgainst.search(markup) + elif isList(matchAgainst): + result = markup in matchAgainst + elif hasattr(matchAgainst, 'items'): + result = markup.has_key(matchAgainst) + elif matchAgainst and isString(markup): + if isinstance(markup, unicode): + matchAgainst = unicode(matchAgainst) + else: + matchAgainst = str(matchAgainst) + + if not result: + result = matchAgainst == markup + return result + +class ResultSet(list): + """A ResultSet is just a list that keeps track of the SoupStrainer + that created it.""" + def __init__(self, source): + list.__init__([]) + self.source = source + +# Now, some helper functions. + +def isList(l): + """Convenience method that works with all 2.x versions of Python + to determine whether or not something is listlike.""" + return hasattr(l, '__iter__') \ + or (type(l) in (types.ListType, types.TupleType)) + +def isString(s): + """Convenience method that works with all 2.x versions of Python + to determine whether or not something is stringlike.""" + try: + return isinstance(s, unicode) or isintance(s, basestring) + except NameError: + return isinstance(s, str) + +def buildTagMap(default, *args): + """Turns a list of maps, lists, or scalars into a single map. + Used to build the SELF_CLOSING_TAGS, NESTABLE_TAGS, and + NESTING_RESET_TAGS maps out of lists and partial maps.""" + built = {} + for portion in args: + if hasattr(portion, 'items'): + #It's a map. Merge it. + for k,v in portion.items(): + built[k] = v + elif isList(portion): + #It's a list. Map each item to the default. + for k in portion: + built[k] = default + else: + #It's a scalar. Map it to the default. + built[portion] = default + return built + +# Now, the parser classes. + +class BeautifulStoneSoup(Tag, SGMLParser): + + """This class contains the basic parser and search code. It defines + a parser that knows nothing about tag behavior except for the + following: + + You can't close a tag without closing all the tags it encloses. + That is, "" actually means + "". + + [Another possible explanation is "", but since + this class defines no SELF_CLOSING_TAGS, it will never use that + explanation.] + + This class is useful for parsing XML or made-up markup languages, + or when BeautifulSoup makes an assumption counter to what you were + expecting.""" + + XML_ENTITY_LIST = {} + for i in Tag.XML_SPECIAL_CHARS_TO_ENTITIES.values(): + XML_ENTITY_LIST[i] = True + + SELF_CLOSING_TAGS = {} + NESTABLE_TAGS = {} + RESET_NESTING_TAGS = {} + QUOTE_TAGS = {} + + MARKUP_MASSAGE = [(re.compile('(<[^<>]*)/>'), + lambda x: x.group(1) + ' />'), + (re.compile(']*)>'), + lambda x: '') + ] + + ROOT_TAG_NAME = u'[document]' + + HTML_ENTITIES = "html" + XML_ENTITIES = "xml" + + def __init__(self, markup="", parseOnlyThese=None, fromEncoding=None, + markupMassage=True, smartQuotesTo=XML_ENTITIES, + convertEntities=None, selfClosingTags=None): + """The Soup object is initialized as the 'root tag', and the + provided markup (which can be a string or a file-like object) + is fed into the underlying parser. + + sgmllib will process most bad HTML, and the BeautifulSoup + class has some tricks for dealing with some HTML that kills + sgmllib, but Beautiful Soup can nonetheless choke or lose data + if your data uses self-closing tags or declarations + incorrectly. + + By default, Beautiful Soup uses regexes to sanitize input, + avoiding the vast majority of these problems. If the problems + don't apply to you, pass in False for markupMassage, and + you'll get better performance. + + The default parser massage techniques fix the two most common + instances of invalid HTML that choke sgmllib: + +
    (No space between name of closing tag and tag close) + (Extraneous whitespace in declaration) + + You can pass in a custom list of (RE object, replace method) + tuples to get Beautiful Soup to scrub your input the way you + want.""" + + self.parseOnlyThese = parseOnlyThese + self.fromEncoding = fromEncoding + self.smartQuotesTo = smartQuotesTo + self.convertEntities = convertEntities + if self.convertEntities: + # It doesn't make sense to convert encoded characters to + # entities even while you're converting entities to Unicode. + # Just convert it all to Unicode. + self.smartQuotesTo = None + self.instanceSelfClosingTags = buildTagMap(None, selfClosingTags) + SGMLParser.__init__(self) + + if hasattr(markup, 'read'): # It's a file-type object. + markup = markup.read() + self.markup = markup + self.markupMassage = markupMassage + try: + self._feed() + except StopParsing: + pass + self.markup = None # The markup can now be GCed + + def _feed(self, inDocumentEncoding=None): + # Convert the document to Unicode. + markup = self.markup + if isinstance(markup, unicode): + if not hasattr(self, 'originalEncoding'): + self.originalEncoding = None + else: + dammit = UnicodeDammit\ + (markup, [self.fromEncoding, inDocumentEncoding], + smartQuotesTo=self.smartQuotesTo) + markup = dammit.unicode + self.originalEncoding = dammit.originalEncoding + if markup: + if self.markupMassage: + if not isList(self.markupMassage): + self.markupMassage = self.MARKUP_MASSAGE + for fix, m in self.markupMassage: + markup = fix.sub(m, markup) + self.reset() + + SGMLParser.feed(self, markup) + # Close out any unfinished strings and close all the open tags. + self.endData() + while self.currentTag.name != self.ROOT_TAG_NAME: + self.popTag() + + def __getattr__(self, methodName): + """This method routes method call requests to either the SGMLParser + superclass or the Tag superclass, depending on the method name.""" + #print "__getattr__ called on %s.%s" % (self.__class__, methodName) + + if methodName.find('start_') == 0 or methodName.find('end_') == 0 \ + or methodName.find('do_') == 0: + return SGMLParser.__getattr__(self, methodName) + elif methodName.find('__') != 0: + return Tag.__getattr__(self, methodName) + else: + raise AttributeError + + def isSelfClosingTag(self, name): + """Returns true iff the given string is the name of a + self-closing tag according to this parser.""" + return self.SELF_CLOSING_TAGS.has_key(name) \ + or self.instanceSelfClosingTags.has_key(name) + + def reset(self): + Tag.__init__(self, self, self.ROOT_TAG_NAME) + self.hidden = 1 + SGMLParser.reset(self) + self.currentData = [] + self.currentTag = None + self.tagStack = [] + self.quoteStack = [] + self.pushTag(self) + + def popTag(self): + tag = self.tagStack.pop() + # Tags with just one string-owning child get the child as a + # 'string' property, so that soup.tag.string is shorthand for + # soup.tag.contents[0] + if len(self.currentTag.contents) == 1 and \ + isinstance(self.currentTag.contents[0], NavigableString): + self.currentTag.string = self.currentTag.contents[0] + + #print "Pop", tag.name + if self.tagStack: + self.currentTag = self.tagStack[-1] + return self.currentTag + + def pushTag(self, tag): + #print "Push", tag.name + if self.currentTag: + self.currentTag.append(tag) + self.tagStack.append(tag) + self.currentTag = self.tagStack[-1] + + def endData(self, containerClass=NavigableString): + if self.currentData: + currentData = ''.join(self.currentData) + if not currentData.strip(): + if '\n' in currentData: + currentData = '\n' + else: + currentData = ' ' + self.currentData = [] + if self.parseOnlyThese and len(self.tagStack) <= 1 and \ + (not self.parseOnlyThese.text or \ + not self.parseOnlyThese.search(currentData)): + return + o = containerClass(currentData) + o.setup(self.currentTag, self.previous) + if self.previous: + self.previous.next = o + self.previous = o + self.currentTag.contents.append(o) + + + def _popToTag(self, name, inclusivePop=True): + """Pops the tag stack up to and including the most recent + instance of the given tag. If inclusivePop is false, pops the tag + stack up to but *not* including the most recent instqance of + the given tag.""" + #print "Popping to %s" % name + if name == self.ROOT_TAG_NAME: + return + + numPops = 0 + mostRecentTag = None + for i in range(len(self.tagStack)-1, 0, -1): + if name == self.tagStack[i].name: + numPops = len(self.tagStack)-i + break + if not inclusivePop: + numPops = numPops - 1 + + for i in range(0, numPops): + mostRecentTag = self.popTag() + return mostRecentTag + + def _smartPop(self, name): + + """We need to pop up to the previous tag of this type, unless + one of this tag's nesting reset triggers comes between this + tag and the previous tag of this type, OR unless this tag is a + generic nesting trigger and another generic nesting trigger + comes between this tag and the previous tag of this type. + + Examples: +

    FooBar

    should pop to 'p', not 'b'. +

    FooBar

    should pop to 'table', not 'p'. +

    Foo

    Bar

    should pop to 'tr', not 'p'. +

    FooBar

    should pop to 'p', not 'b'. + +

    • *
    • * should pop to 'ul', not the first 'li'. +
  • ** should pop to 'table', not the first 'tr' + tag should + implicitly close the previous tag within the same
    ** should pop to 'tr', not the first 'td' + """ + + nestingResetTriggers = self.NESTABLE_TAGS.get(name) + isNestable = nestingResetTriggers != None + isResetNesting = self.RESET_NESTING_TAGS.has_key(name) + popTo = None + inclusive = True + for i in range(len(self.tagStack)-1, 0, -1): + p = self.tagStack[i] + if (not p or p.name == name) and not isNestable: + #Non-nestable tags get popped to the top or to their + #last occurance. + popTo = name + break + if (nestingResetTriggers != None + and p.name in nestingResetTriggers) \ + or (nestingResetTriggers == None and isResetNesting + and self.RESET_NESTING_TAGS.has_key(p.name)): + + #If we encounter one of the nesting reset triggers + #peculiar to this tag, or we encounter another tag + #that causes nesting to reset, pop up to but not + #including that tag. + popTo = p.name + inclusive = False + break + p = p.parent + if popTo: + self._popToTag(popTo, inclusive) + + def unknown_starttag(self, name, attrs, selfClosing=0): + #print "Start tag %s: %s" % (name, attrs) + if self.quoteStack: + #This is not a real tag. + #print "<%s> is not real!" % name + attrs = ''.join(map(lambda(x, y): ' %s="%s"' % (x, y), attrs)) + self.handle_data('<%s%s>' % (name, attrs)) + return + self.endData() + + if not self.isSelfClosingTag(name) and not selfClosing: + self._smartPop(name) + + if self.parseOnlyThese and len(self.tagStack) <= 1 \ + and (self.parseOnlyThese.text or not self.parseOnlyThese.searchTag(name, attrs)): + return + + tag = Tag(self, name, attrs, self.currentTag, self.previous) + if self.previous: + self.previous.next = tag + self.previous = tag + self.pushTag(tag) + if selfClosing or self.isSelfClosingTag(name): + self.popTag() + if name in self.QUOTE_TAGS: + #print "Beginning quote (%s)" % name + self.quoteStack.append(name) + self.literal = 1 + return tag + + def unknown_endtag(self, name): + #print "End tag %s" % name + if self.quoteStack and self.quoteStack[-1] != name: + #This is not a real end tag. + #print " is not real!" % name + self.handle_data('' % name) + return + self.endData() + self._popToTag(name) + if self.quoteStack and self.quoteStack[-1] == name: + self.quoteStack.pop() + self.literal = (len(self.quoteStack) > 0) + + def handle_data(self, data): + self.currentData.append(data) + + def _toStringSubclass(self, text, subclass): + """Adds a certain piece of text to the tree as a NavigableString + subclass.""" + self.endData() + self.handle_data(text) + self.endData(subclass) + + def handle_pi(self, text): + """Handle a processing instruction as a ProcessingInstruction + object, possibly one with a %SOUP-ENCODING% slot into which an + encoding will be plugged later.""" + if text[:3] == "xml": + text = "xml version='1.0' encoding='%SOUP-ENCODING%'" + self._toStringSubclass(text, ProcessingInstruction) + + def handle_comment(self, text): + "Handle comments as Comment objects." + self._toStringSubclass(text, Comment) + + def handle_charref(self, ref): + "Handle character references as data." + if self.convertEntities in [self.HTML_ENTITIES, + self.XML_ENTITIES]: + data = unichr(int(ref)) + else: + data = '&#%s;' % ref + self.handle_data(data) + + def handle_entityref(self, ref): + """Handle entity references as data, possibly converting known + HTML entity references to the corresponding Unicode + characters.""" + data = None + if self.convertEntities == self.HTML_ENTITIES or \ + (self.convertEntities == self.XML_ENTITIES and \ + self.XML_ENTITY_LIST.get(ref)): + try: + data = unichr(name2codepoint[ref]) + except KeyError: + pass + if not data: + data = '&%s;' % ref + self.handle_data(data) + + def handle_decl(self, data): + "Handle DOCTYPEs and the like as Declaration objects." + self._toStringSubclass(data, Declaration) + + def parse_declaration(self, i): + """Treat a bogus SGML declaration as raw data. Treat a CDATA + declaration as a CData object.""" + j = None + if self.rawdata[i:i+9] == '', i) + if k == -1: + k = len(self.rawdata) + data = self.rawdata[i+9:k] + j = k+3 + self._toStringSubclass(data, CData) + else: + try: + j = SGMLParser.parse_declaration(self, i) + except SGMLParseError: + toHandle = self.rawdata[i:] + self.handle_data(toHandle) + j = i + len(toHandle) + return j + +class BeautifulSoup(BeautifulStoneSoup): + + """This parser knows the following facts about HTML: + + * Some tags have no closing tag and should be interpreted as being + closed as soon as they are encountered. + + * The text inside some tags (ie. 'script') may contain tags which + are not really part of the document and which should be parsed + as text, not tags. If you want to parse the text as tags, you can + always fetch it and parse it explicitly. + + * Tag nesting rules: + + Most tags can't be nested at all. For instance, the occurance of + a

    tag should implicitly close the previous

    tag. + +

    Para1

    Para2 + should be transformed into: +

    Para1

    Para2 + + Some tags can be nested arbitrarily. For instance, the occurance + of a

    tag should _not_ implicitly close the previous +
    tag. + + Alice said:
    Bob said:
    Blah + should NOT be transformed into: + Alice said:
    Bob said:
    Blah + + Some tags can be nested, but the nesting is reset by the + interposition of other tags. For instance, a
    , + but not close a tag in another table. + +
    BlahBlah + should be transformed into: +
    BlahBlah + but, + Blah
    Blah + should NOT be transformed into + Blah
    Blah + + Differing assumptions about tag nesting rules are a major source + of problems with the BeautifulSoup class. If BeautifulSoup is not + treating as nestable a tag your page author treats as nestable, + try ICantBelieveItsBeautifulSoup, MinimalSoup, or + BeautifulStoneSoup before writing your own subclass.""" + + def __init__(self, *args, **kwargs): + if not kwargs.has_key('smartQuotesTo'): + kwargs['smartQuotesTo'] = self.HTML_ENTITIES + BeautifulStoneSoup.__init__(self, *args, **kwargs) + + SELF_CLOSING_TAGS = buildTagMap(None, + ['br' , 'hr', 'input', 'img', 'meta', + 'spacer', 'link', 'frame', 'base']) + + QUOTE_TAGS = {'script': None} + + #According to the HTML standard, each of these inline tags can + #contain another tag of the same type. Furthermore, it's common + #to actually use these tags this way. + NESTABLE_INLINE_TAGS = ['span', 'font', 'q', 'object', 'bdo', 'sub', 'sup', + 'center'] + + #According to the HTML standard, these block tags can contain + #another tag of the same type. Furthermore, it's common + #to actually use these tags this way. + NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del'] + + #Lists can contain other lists, but there are restrictions. + NESTABLE_LIST_TAGS = { 'ol' : [], + 'ul' : [], + 'li' : ['ul', 'ol'], + 'dl' : [], + 'dd' : ['dl'], + 'dt' : ['dl'] } + + #Tables can contain other tables, but there are restrictions. + NESTABLE_TABLE_TAGS = {'table' : [], + 'tr' : ['table', 'tbody', 'tfoot', 'thead'], + 'td' : ['tr'], + 'th' : ['tr'], + 'thead' : ['table'], + 'tbody' : ['table'], + 'tfoot' : ['table'], + } + + NON_NESTABLE_BLOCK_TAGS = ['address', 'form', 'p', 'pre'] + + #If one of these tags is encountered, all tags up to the next tag of + #this type are popped. + RESET_NESTING_TAGS = buildTagMap(None, NESTABLE_BLOCK_TAGS, 'noscript', + NON_NESTABLE_BLOCK_TAGS, + NESTABLE_LIST_TAGS, + NESTABLE_TABLE_TAGS) + + NESTABLE_TAGS = buildTagMap([], NESTABLE_INLINE_TAGS, NESTABLE_BLOCK_TAGS, + NESTABLE_LIST_TAGS, NESTABLE_TABLE_TAGS) + + # Used to detect the charset in a META tag; see start_meta + CHARSET_RE = re.compile("((^|;)\s*charset=)([^;]*)") + + def start_meta(self, attrs): + """Beautiful Soup can detect a charset included in a META tag, + try to convert the document to that charset, and re-parse the + document from the beginning.""" + httpEquiv = None + contentType = None + contentTypeIndex = None + tagNeedsEncodingSubstitution = False + + for i in range(0, len(attrs)): + key, value = attrs[i] + key = key.lower() + if key == 'http-equiv': + httpEquiv = value + elif key == 'content': + contentType = value + contentTypeIndex = i + + if httpEquiv and contentType: # It's an interesting meta tag. + match = self.CHARSET_RE.search(contentType) + if match: + if getattr(self, 'declaredHTMLEncoding') or \ + (self.originalEncoding == self.fromEncoding): + # This is our second pass through the document, or + # else an encoding was specified explicitly and it + # worked. Rewrite the meta tag. + newAttr = self.CHARSET_RE.sub\ + (lambda(match):match.group(1) + + "%SOUP-ENCODING%", value) + attrs[contentTypeIndex] = (attrs[contentTypeIndex][0], + newAttr) + tagNeedsEncodingSubstitution = True + else: + # This is our first pass through the document. + # Go through it again with the new information. + newCharset = match.group(3) + if newCharset and newCharset != self.originalEncoding: + self.declaredHTMLEncoding = newCharset + self._feed(self.declaredHTMLEncoding) + raise StopParsing + tag = self.unknown_starttag("meta", attrs) + if tag and tagNeedsEncodingSubstitution: + tag.containsSubstitutions = True + +class StopParsing(Exception): + pass + +class ICantBelieveItsBeautifulSoup(BeautifulSoup): + + """The BeautifulSoup class is oriented towards skipping over + common HTML errors like unclosed tags. However, sometimes it makes + errors of its own. For instance, consider this fragment: + + FooBar + + This is perfectly valid (if bizarre) HTML. However, the + BeautifulSoup class will implicitly close the first b tag when it + encounters the second 'b'. It will think the author wrote + "FooBar", and didn't close the first 'b' tag, because + there's no real-world reason to bold something that's already + bold. When it encounters '' it will close two more 'b' + tags, for a grand total of three tags closed instead of two. This + can throw off the rest of your document structure. The same is + true of a number of other tags, listed below. + + It's much more common for someone to forget to close a 'b' tag + than to actually use nested 'b' tags, and the BeautifulSoup class + handles the common case. This class handles the not-co-common + case: where you can't believe someone wrote what they did, but + it's valid HTML and BeautifulSoup screwed up by assuming it + wouldn't be.""" + + I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS = \ + ['em', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'strong', + 'cite', 'code', 'dfn', 'kbd', 'samp', 'strong', 'var', 'b', + 'big'] + + I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS = ['noscript'] + + NESTABLE_TAGS = buildTagMap([], BeautifulSoup.NESTABLE_TAGS, + I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS, + I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS) + +class MinimalSoup(BeautifulSoup): + """The MinimalSoup class is for parsing HTML that contains + pathologically bad markup. It makes no assumptions about tag + nesting, but it does know which tags are self-closing, that + tags. */ + scriptScriptTags : { left: /(<|<)\s*script.*?(>|>)/gi, right: /(<|<)\/\s*script\s*(>|>)/gi } + }, + + toolbar: { + /** + * Generates HTML markup for the toolbar. + * @param {Highlighter} highlighter Highlighter instance. + * @return {String} Returns HTML markup. + */ + getHtml: function(highlighter) + { + var html = '
    ', + items = sh.toolbar.items, + list = items.list + ; + + function defaultGetHtml(highlighter, name) + { + return sh.toolbar.getButtonHtml(highlighter, name, sh.config.strings[name]); + }; + + for (var i = 0; i < list.length; i++) + html += (items[list[i]].getHtml || defaultGetHtml)(highlighter, list[i]); + + html += '
    '; + + return html; + }, + + /** + * Generates HTML markup for a regular button in the toolbar. + * @param {Highlighter} highlighter Highlighter instance. + * @param {String} commandName Command name that would be executed. + * @param {String} label Label text to display. + * @return {String} Returns HTML markup. + */ + getButtonHtml: function(highlighter, commandName, label) + { + return '' + label + '' + ; + }, + + /** + * Event handler for a toolbar anchor. + */ + handler: function(e) + { + var target = e.target, + className = target.className || '' + ; + + function getValue(name) + { + var r = new RegExp(name + '_(\\w+)'), + match = r.exec(className) + ; + + return match ? match[1] : null; + }; + + var highlighter = getHighlighterById(findParentElement(target, '.syntaxhighlighter').id), + commandName = getValue('command') + ; + + // execute the toolbar command + if (highlighter && commandName) + sh.toolbar.items[commandName].execute(highlighter); + + // disable default A click behaviour + e.preventDefault(); + }, + + /** Collection of toolbar items. */ + items : { + // Ordered lis of items in the toolbar. Can't expect `for (var n in items)` to be consistent. + list: ['expandSource', 'help'], + + expandSource: { + getHtml: function(highlighter) + { + if (highlighter.getParam('collapse') != true) + return ''; + + var title = highlighter.getParam('title'); + return sh.toolbar.getButtonHtml(highlighter, 'expandSource', title ? title : sh.config.strings.expandSource); + }, + + execute: function(highlighter) + { + var div = getHighlighterDivById(highlighter.id); + removeClass(div, 'collapsed'); + } + }, + + /** Command to display the about dialog window. */ + help: { + execute: function(highlighter) + { + var wnd = popup('', '_blank', 500, 250, 'scrollbars=0'), + doc = wnd.document + ; + + doc.write(sh.config.strings.aboutDialog); + doc.close(); + wnd.focus(); + } + } + } + }, + + /** + * Finds all elements on the page which should be processes by SyntaxHighlighter. + * + * @param {Object} globalParams Optional parameters which override element's + * parameters. Only used if element is specified. + * + * @param {Object} element Optional element to highlight. If none is + * provided, all elements in the current document + * are returned which qualify. + * + * @return {Array} Returns list of { target: DOMElement, params: Object } objects. + */ + findElements: function(globalParams, element) + { + var elements = element ? [element] : toArray(document.getElementsByTagName(sh.config.tagName)), + conf = sh.config, + result = [] + ; + + // support for } + *
  • define style rules. See the example page for examples. + *
  • mark the {@code
    } and {@code } tags in your source with
    + *    {@code class=prettyprint.}
    + *    You can also use the (html deprecated) {@code } tag, but the pretty
    + *    printer needs to do more substantial DOM manipulations to support that, so
    + *    some css styles may not be preserved.
    + * </ol>
    + * That's it.  I wanted to keep the API as simple as possible, so there's no
    + * need to specify which language the code is in, but if you wish, you can add
    + * another class to the {@code <pre>} or {@code <code>} element to specify the
    + * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
    + * starts with "lang-" followed by a file extension, specifies the file type.
    + * See the "lang-*.js" files in this directory for code that implements
    + * per-language file handlers.
    + * <p>
    + * Change log:<br>
    + * cbeust, 2006/08/22
    + * <blockquote>
    + *   Java annotations (start with "@") are now captured as literals ("lit")
    + * </blockquote>
    + * @requires console
    + */
    +
    +// JSLint declarations
    +/*global console, document, navigator, setTimeout, window, define */
    +
    +/** @define {boolean} */
    +var IN_GLOBAL_SCOPE = true;
    +
    +/**
    + * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
    + * UI events.
    + * If set to {@code false}, {@code prettyPrint()} is synchronous.
    + */
    +window['PR_SHOULD_USE_CONTINUATION'] = true;
    +
    +/**
    + * Pretty print a chunk of code.
    + * @param {string} sourceCodeHtml The HTML to pretty print.
    + * @param {string} opt_langExtension The language name to use.
    + *     Typically, a filename extension like 'cpp' or 'java'.
    + * @param {number|boolean} opt_numberLines True to number lines,
    + *     or the 1-indexed number of the first line in sourceCodeHtml.
    + * @return {string} code as html, but prettier
    + */
    +var prettyPrintOne;
    +/**
    + * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
    + * {@code class=prettyprint} and prettify them.
    + *
    + * @param {Function} opt_whenDone called when prettifying is done.
    + * @param {HTMLElement|HTMLDocument} opt_root an element or document
    + *   containing all the elements to pretty print.
    + *   Defaults to {@code document.body}.
    + */
    +var prettyPrint;
    +
    +
    +(function () {
    +  var win = window;
    +  // Keyword lists for various languages.
    +  // We use things that coerce to strings to make them compact when minified
    +  // and to defeat aggressive optimizers that fold large string constants.
    +  var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
    +  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," + 
    +      "double,enum,extern,float,goto,inline,int,long,register,short,signed," +
    +      "sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];
    +  var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
    +      "new,operator,private,protected,public,this,throw,true,try,typeof"];
    +  var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignof,align_union,asm,axiom,bool," +
    +      "concept,concept_map,const_cast,constexpr,decltype,delegate," +
    +      "dynamic_cast,explicit,export,friend,generic,late_check," +
    +      "mutable,namespace,nullptr,property,reinterpret_cast,static_assert," +
    +      "static_cast,template,typeid,typename,using,virtual,where"];
    +  var JAVA_KEYWORDS = [COMMON_KEYWORDS,
    +      "abstract,assert,boolean,byte,extends,final,finally,implements,import," +
    +      "instanceof,interface,null,native,package,strictfp,super,synchronized," +
    +      "throws,transient"];
    +  var CSHARP_KEYWORDS = [JAVA_KEYWORDS,
    +      "as,base,by,checked,decimal,delegate,descending,dynamic,event," +
    +      "fixed,foreach,from,group,implicit,in,internal,into,is,let," +
    +      "lock,object,out,override,orderby,params,partial,readonly,ref,sbyte," +
    +      "sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort," +
    +      "var,virtual,where"];
    +  var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
    +      "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
    +      "throw,true,try,unless,until,when,while,yes";
    +  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
    +      "debugger,eval,export,function,get,null,set,undefined,var,with," +
    +      "Infinity,NaN"];
    +  var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
    +      "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
    +      "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
    +  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
    +      "elif,except,exec,finally,from,global,import,in,is,lambda," +
    +      "nonlocal,not,or,pass,print,raise,try,with,yield," +
    +      "False,True,None"];
    +  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
    +      "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
    +      "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
    +      "BEGIN,END"];
    +   var RUST_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "as,assert,const,copy,drop," +
    +      "enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv," +
    +      "pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"];
    +  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
    +      "function,in,local,set,then,until"];
    +  var ALL_KEYWORDS = [
    +      CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS,
    +      PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
    +  var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;
    +
    +  // token style names.  correspond to css classes
    +  /**
    +   * token style for a string literal
    +   * @const
    +   */
    +  var PR_STRING = 'str';
    +  /**
    +   * token style for a keyword
    +   * @const
    +   */
    +  var PR_KEYWORD = 'kwd';
    +  /**
    +   * token style for a comment
    +   * @const
    +   */
    +  var PR_COMMENT = 'com';
    +  /**
    +   * token style for a type
    +   * @const
    +   */
    +  var PR_TYPE = 'typ';
    +  /**
    +   * token style for a literal value.  e.g. 1, null, true.
    +   * @const
    +   */
    +  var PR_LITERAL = 'lit';
    +  /**
    +   * token style for a punctuation string.
    +   * @const
    +   */
    +  var PR_PUNCTUATION = 'pun';
    +  /**
    +   * token style for plain text.
    +   * @const
    +   */
    +  var PR_PLAIN = 'pln';
    +
    +  /**
    +   * token style for an sgml tag.
    +   * @const
    +   */
    +  var PR_TAG = 'tag';
    +  /**
    +   * token style for a markup declaration such as a DOCTYPE.
    +   * @const
    +   */
    +  var PR_DECLARATION = 'dec';
    +  /**
    +   * token style for embedded source.
    +   * @const
    +   */
    +  var PR_SOURCE = 'src';
    +  /**
    +   * token style for an sgml attribute name.
    +   * @const
    +   */
    +  var PR_ATTRIB_NAME = 'atn';
    +  /**
    +   * token style for an sgml attribute value.
    +   * @const
    +   */
    +  var PR_ATTRIB_VALUE = 'atv';
    +
    +  /**
    +   * A class that indicates a section of markup that is not code, e.g. to allow
    +   * embedding of line numbers within code listings.
    +   * @const
    +   */
    +  var PR_NOCODE = 'nocode';
    +
    +  
    +  
    +  /**
    +   * A set of tokens that can precede a regular expression literal in
    +   * javascript
    +   * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
    +   * has the full list, but I've removed ones that might be problematic when
    +   * seen in languages that don't support regular expression literals.
    +   *
    +   * <p>Specifically, I've removed any keywords that can't precede a regexp
    +   * literal in a syntactically legal javascript program, and I've removed the
    +   * "in" keyword since it's not a keyword in many languages, and might be used
    +   * as a count of inches.
    +   *
    +   * <p>The link above does not accurately describe EcmaScript rules since
    +   * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
    +   * very well in practice.
    +   *
    +   * @private
    +   * @const
    +   */
    +  var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
    +  
    +  // CAVEAT: this does not properly handle the case where a regular
    +  // expression immediately follows another since a regular expression may
    +  // have flags for case-sensitivity and the like.  Having regexp tokens
    +  // adjacent is not valid in any language I'm aware of, so I'm punting.
    +  // TODO: maybe style special characters inside a regexp as punctuation.
    +
    +  /**
    +   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
    +   * matches the union of the sets of strings matched by the input RegExp.
    +   * Since it matches globally, if the input strings have a start-of-input
    +   * anchor (/^.../), it is ignored for the purposes of unioning.
    +   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
    +   * @return {RegExp} a global regex.
    +   */
    +  function combinePrefixPatterns(regexs) {
    +    var capturedGroupIndex = 0;
    +  
    +    var needToFoldCase = false;
    +    var ignoreCase = false;
    +    for (var i = 0, n = regexs.length; i < n; ++i) {
    +      var regex = regexs[i];
    +      if (regex.ignoreCase) {
    +        ignoreCase = true;
    +      } else if (/[a-z]/i.test(regex.source.replace(
    +                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
    +        needToFoldCase = true;
    +        ignoreCase = false;
    +        break;
    +      }
    +    }
    +  
    +    var escapeCharToCodeUnit = {
    +      'b': 8,
    +      't': 9,
    +      'n': 0xa,
    +      'v': 0xb,
    +      'f': 0xc,
    +      'r': 0xd
    +    };
    +  
    +    function decodeEscape(charsetPart) {
    +      var cc0 = charsetPart.charCodeAt(0);
    +      if (cc0 !== 92 /* \\ */) {
    +        return cc0;
    +      }
    +      var c1 = charsetPart.charAt(1);
    +      cc0 = escapeCharToCodeUnit[c1];
    +      if (cc0) {
    +        return cc0;
    +      } else if ('0' <= c1 && c1 <= '7') {
    +        return parseInt(charsetPart.substring(1), 8);
    +      } else if (c1 === 'u' || c1 === 'x') {
    +        return parseInt(charsetPart.substring(2), 16);
    +      } else {
    +        return charsetPart.charCodeAt(1);
    +      }
    +    }
    +  
    +    function encodeEscape(charCode) {
    +      if (charCode < 0x20) {
    +        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
    +      }
    +      var ch = String.fromCharCode(charCode);
    +      return (ch === '\\' || ch === '-' || ch === ']' || ch === '^')
    +          ? "\\" + ch : ch;
    +    }
    +  
    +    function caseFoldCharset(charSet) {
    +      var charsetParts = charSet.substring(1, charSet.length - 1).match(
    +          new RegExp(
    +              '\\\\u[0-9A-Fa-f]{4}'
    +              + '|\\\\x[0-9A-Fa-f]{2}'
    +              + '|\\\\[0-3][0-7]{0,2}'
    +              + '|\\\\[0-7]{1,2}'
    +              + '|\\\\[\\s\\S]'
    +              + '|-'
    +              + '|[^-\\\\]',
    +              'g'));
    +      var ranges = [];
    +      var inverse = charsetParts[0] === '^';
    +  
    +      var out = ['['];
    +      if (inverse) { out.push('^'); }
    +  
    +      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
    +        var p = charsetParts[i];
    +        if (/\\[bdsw]/i.test(p)) {  // Don't muck with named groups.
    +          out.push(p);
    +        } else {
    +          var start = decodeEscape(p);
    +          var end;
    +          if (i + 2 < n && '-' === charsetParts[i + 1]) {
    +            end = decodeEscape(charsetParts[i + 2]);
    +            i += 2;
    +          } else {
    +            end = start;
    +          }
    +          ranges.push([start, end]);
    +          // If the range might intersect letters, then expand it.
    +          // This case handling is too simplistic.
    +          // It does not deal with non-latin case folding.
    +          // It works for latin source code identifiers though.
    +          if (!(end < 65 || start > 122)) {
    +            if (!(end < 65 || start > 90)) {
    +              ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
    +            }
    +            if (!(end < 97 || start > 122)) {
    +              ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
    +            }
    +          }
    +        }
    +      }
    +  
    +      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
    +      // -> [[1, 12], [14, 14], [16, 17]]
    +      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
    +      var consolidatedRanges = [];
    +      var lastRange = [];
    +      for (var i = 0; i < ranges.length; ++i) {
    +        var range = ranges[i];
    +        if (range[0] <= lastRange[1] + 1) {
    +          lastRange[1] = Math.max(lastRange[1], range[1]);
    +        } else {
    +          consolidatedRanges.push(lastRange = range);
    +        }
    +      }
    +  
    +      for (var i = 0; i < consolidatedRanges.length; ++i) {
    +        var range = consolidatedRanges[i];
    +        out.push(encodeEscape(range[0]));
    +        if (range[1] > range[0]) {
    +          if (range[1] + 1 > range[0]) { out.push('-'); }
    +          out.push(encodeEscape(range[1]));
    +        }
    +      }
    +      out.push(']');
    +      return out.join('');
    +    }
    +  
    +    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
    +      // Split into character sets, escape sequences, punctuation strings
    +      // like ('(', '(?:', ')', '^'), and runs of characters that do not
    +      // include any of the above.
    +      var parts = regex.source.match(
    +          new RegExp(
    +              '(?:'
    +              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
    +              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
    +              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
    +              + '|\\\\[0-9]+'  // a back-reference or octal escape
    +              + '|\\\\[^ux0-9]'  // other escape sequence
    +              + '|\\(\\?[:!=]'  // start of a non-capturing group
    +              + '|[\\(\\)\\^]'  // start/end of a group, or line start
    +              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
    +              + ')',
    +              'g'));
    +      var n = parts.length;
    +  
    +      // Maps captured group numbers to the number they will occupy in
    +      // the output or to -1 if that has not been determined, or to
    +      // undefined if they need not be capturing in the output.
    +      var capturedGroups = [];
    +  
    +      // Walk over and identify back references to build the capturedGroups
    +      // mapping.
    +      for (var i = 0, groupIndex = 0; i < n; ++i) {
    +        var p = parts[i];
    +        if (p === '(') {
    +          // groups are 1-indexed, so max group index is count of '('
    +          ++groupIndex;
    +        } else if ('\\' === p.charAt(0)) {
    +          var decimalValue = +p.substring(1);
    +          if (decimalValue) {
    +            if (decimalValue <= groupIndex) {
    +              capturedGroups[decimalValue] = -1;
    +            } else {
    +              // Replace with an unambiguous escape sequence so that
    +              // an octal escape sequence does not turn into a backreference
    +              // to a capturing group from an earlier regex.
    +              parts[i] = encodeEscape(decimalValue);
    +            }
    +          }
    +        }
    +      }
    +  
    +      // Renumber groups and reduce capturing groups to non-capturing groups
    +      // where possible.
    +      for (var i = 1; i < capturedGroups.length; ++i) {
    +        if (-1 === capturedGroups[i]) {
    +          capturedGroups[i] = ++capturedGroupIndex;
    +        }
    +      }
    +      for (var i = 0, groupIndex = 0; i < n; ++i) {
    +        var p = parts[i];
    +        if (p === '(') {
    +          ++groupIndex;
    +          if (!capturedGroups[groupIndex]) {
    +            parts[i] = '(?:';
    +          }
    +        } else if ('\\' === p.charAt(0)) {
    +          var decimalValue = +p.substring(1);
    +          if (decimalValue && decimalValue <= groupIndex) {
    +            parts[i] = '\\' + capturedGroups[decimalValue];
    +          }
    +        }
    +      }
    +  
    +      // Remove any prefix anchors so that the output will match anywhere.
    +      // ^^ really does mean an anchored match though.
    +      for (var i = 0; i < n; ++i) {
    +        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
    +      }
    +  
    +      // Expand letters to groups to handle mixing of case-sensitive and
    +      // case-insensitive patterns if necessary.
    +      if (regex.ignoreCase && needToFoldCase) {
    +        for (var i = 0; i < n; ++i) {
    +          var p = parts[i];
    +          var ch0 = p.charAt(0);
    +          if (p.length >= 2 && ch0 === '[') {
    +            parts[i] = caseFoldCharset(p);
    +          } else if (ch0 !== '\\') {
    +            // TODO: handle letters in numeric escapes.
    +            parts[i] = p.replace(
    +                /[a-zA-Z]/g,
    +                function (ch) {
    +                  var cc = ch.charCodeAt(0);
    +                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
    +                });
    +          }
    +        }
    +      }
    +  
    +      return parts.join('');
    +    }
    +  
    +    var rewritten = [];
    +    for (var i = 0, n = regexs.length; i < n; ++i) {
    +      var regex = regexs[i];
    +      if (regex.global || regex.multiline) { throw new Error('' + regex); }
    +      rewritten.push(
    +          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
    +    }
    +  
    +    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
    +  }
    +
    +  /**
    +   * Split markup into a string of source code and an array mapping ranges in
    +   * that string to the text nodes in which they appear.
    +   *
    +   * <p>
    +   * The HTML DOM structure:</p>
    +   * <pre>
    +   * (Element   "p"
    +   *   (Element "b"
    +   *     (Text  "print "))       ; #1
    +   *   (Text    "'Hello '")      ; #2
    +   *   (Element "br")            ; #3
    +   *   (Text    "  + 'World';")) ; #4
    +   * </pre>
    +   * <p>
    +   * corresponds to the HTML
    +   * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
    +   *
    +   * <p>
    +   * It will produce the output:</p>
    +   * <pre>
    +   * {
    +   *   sourceCode: "print 'Hello '\n  + 'World';",
    +   *   //                     1          2
    +   *   //           012345678901234 5678901234567
    +   *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
    +   * }
    +   * </pre>
    +   * <p>
    +   * where #1 is a reference to the {@code "print "} text node above, and so
    +   * on for the other text nodes.
    +   * </p>
    +   *
    +   * <p>
    +   * The {@code} spans array is an array of pairs.  Even elements are the start
    +   * indices of substrings, and odd elements are the text nodes (or BR elements)
    +   * that contain the text for those substrings.
    +   * Substrings continue until the next index or the end of the source.
    +   * </p>
    +   *
    +   * @param {Node} node an HTML DOM subtree containing source-code.
    +   * @param {boolean} isPreformatted true if white-space in text nodes should
    +   *    be considered significant.
    +   * @return {Object} source code and the text nodes in which they occur.
    +   */
    +  function extractSourceSpans(node, isPreformatted) {
    +    var nocode = /(?:^|\s)nocode(?:\s|$)/;
    +  
    +    var chunks = [];
    +    var length = 0;
    +    var spans = [];
    +    var k = 0;
    +  
    +    function walk(node) {
    +      var type = node.nodeType;
    +      if (type == 1) {  // Element
    +        if (nocode.test(node.className)) { return; }
    +        for (var child = node.firstChild; child; child = child.nextSibling) {
    +          walk(child);
    +        }
    +        var nodeName = node.nodeName.toLowerCase();
    +        if ('br' === nodeName || 'li' === nodeName) {
    +          chunks[k] = '\n';
    +          spans[k << 1] = length++;
    +          spans[(k++ << 1) | 1] = node;
    +        }
    +      } else if (type == 3 || type == 4) {  // Text
    +        var text = node.nodeValue;
    +        if (text.length) {
    +          if (!isPreformatted) {
    +            text = text.replace(/[ \t\r\n]+/g, ' ');
    +          } else {
    +            text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
    +          }
    +          // TODO: handle tabs here?
    +          chunks[k] = text;
    +          spans[k << 1] = length;
    +          length += text.length;
    +          spans[(k++ << 1) | 1] = node;
    +        }
    +      }
    +    }
    +  
    +    walk(node);
    +  
    +    return {
    +      sourceCode: chunks.join('').replace(/\n$/, ''),
    +      spans: spans
    +    };
    +  }
    +
    +  /**
    +   * Apply the given language handler to sourceCode and add the resulting
    +   * decorations to out.
    +   * @param {number} basePos the index of sourceCode within the chunk of source
    +   *    whose decorations are already present on out.
    +   */
    +  function appendDecorations(basePos, sourceCode, langHandler, out) {
    +    if (!sourceCode) { return; }
    +    var job = {
    +      sourceCode: sourceCode,
    +      basePos: basePos
    +    };
    +    langHandler(job);
    +    out.push.apply(out, job.decorations);
    +  }
    +
    +  var notWs = /\S/;
    +
    +  /**
    +   * Given an element, if it contains only one child element and any text nodes
    +   * it contains contain only space characters, return the sole child element.
    +   * Otherwise returns undefined.
    +   * <p>
    +   * This is meant to return the CODE element in {@code <pre><code ...>} when
    +   * there is a single child element that contains all the non-space textual
    +   * content, but not to return anything where there are multiple child elements
    +   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
    +   * is textual content.
    +   */
    +  function childContentWrapper(element) {
    +    var wrapper = undefined;
    +    for (var c = element.firstChild; c; c = c.nextSibling) {
    +      var type = c.nodeType;
    +      wrapper = (type === 1)  // Element Node
    +          ? (wrapper ? element : c)
    +          : (type === 3)  // Text Node
    +          ? (notWs.test(c.nodeValue) ? element : wrapper)
    +          : wrapper;
    +    }
    +    return wrapper === element ? undefined : wrapper;
    +  }
    +
    +  /** Given triples of [style, pattern, context] returns a lexing function,
    +    * The lexing function interprets the patterns to find token boundaries and
    +    * returns a decoration list of the form
    +    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
    +    * where index_n is an index into the sourceCode, and style_n is a style
    +    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
    +    * all characters in sourceCode[index_n-1:index_n].
    +    *
    +    * The stylePatterns is a list whose elements have the form
    +    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
    +    *
    +    * Style is a style constant like PR_PLAIN, or can be a string of the
    +    * form 'lang-FOO', where FOO is a language extension describing the
    +    * language of the portion of the token in $1 after pattern executes.
    +    * E.g., if style is 'lang-lisp', and group 1 contains the text
    +    * '(hello (world))', then that portion of the token will be passed to the
    +    * registered lisp handler for formatting.
    +    * The text before and after group 1 will be restyled using this decorator
    +    * so decorators should take care that this doesn't result in infinite
    +    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
    +    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
    +    * '<script>foo()<\/script>', which would cause the current decorator to
    +    * be called with '<script>' which would not match the same rule since
    +    * group 1 must not be empty, so it would be instead styled as PR_TAG by
    +    * the generic tag rule.  The handler registered for the 'js' extension would
    +    * then be called with 'foo()', and finally, the current decorator would
    +    * be called with '<\/script>' which would not match the original rule and
    +    * so the generic tag rule would identify it as a tag.
    +    *
    +    * Pattern must only match prefixes, and if it matches a prefix, then that
    +    * match is considered a token with the same style.
    +    *
    +    * Context is applied to the last non-whitespace, non-comment token
    +    * recognized.
    +    *
    +    * Shortcut is an optional string of characters, any of which, if the first
    +    * character, gurantee that this pattern and only this pattern matches.
    +    *
    +    * @param {Array} shortcutStylePatterns patterns that always start with
    +    *   a known character.  Must have a shortcut string.
    +    * @param {Array} fallthroughStylePatterns patterns that will be tried in
    +    *   order if the shortcut ones fail.  May have shortcuts.
    +    *
    +    * @return {function (Object)} a
    +    *   function that takes source code and returns a list of decorations.
    +    */
    +  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
    +    var shortcuts = {};
    +    var tokenizer;
    +    (function () {
    +      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
    +      var allRegexs = [];
    +      var regexKeys = {};
    +      for (var i = 0, n = allPatterns.length; i < n; ++i) {
    +        var patternParts = allPatterns[i];
    +        var shortcutChars = patternParts[3];
    +        if (shortcutChars) {
    +          for (var c = shortcutChars.length; --c >= 0;) {
    +            shortcuts[shortcutChars.charAt(c)] = patternParts;
    +          }
    +        }
    +        var regex = patternParts[1];
    +        var k = '' + regex;
    +        if (!regexKeys.hasOwnProperty(k)) {
    +          allRegexs.push(regex);
    +          regexKeys[k] = null;
    +        }
    +      }
    +      allRegexs.push(/[\0-\uffff]/);
    +      tokenizer = combinePrefixPatterns(allRegexs);
    +    })();
    +
    +    var nPatterns = fallthroughStylePatterns.length;
    +
    +    /**
    +     * Lexes job.sourceCode and produces an output array job.decorations of
    +     * style classes preceded by the position at which they start in
    +     * job.sourceCode in order.
    +     *
    +     * @param {Object} job an object like <pre>{
    +     *    sourceCode: {string} sourceText plain text,
    +     *    basePos: {int} position of job.sourceCode in the larger chunk of
    +     *        sourceCode.
    +     * }</pre>
    +     */
    +    var decorate = function (job) {
    +      var sourceCode = job.sourceCode, basePos = job.basePos;
    +      /** Even entries are positions in source in ascending order.  Odd enties
    +        * are style markers (e.g., PR_COMMENT) that run from that position until
    +        * the end.
    +        * @type {Array.<number|string>}
    +        */
    +      var decorations = [basePos, PR_PLAIN];
    +      var pos = 0;  // index into sourceCode
    +      var tokens = sourceCode.match(tokenizer) || [];
    +      var styleCache = {};
    +
    +      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
    +        var token = tokens[ti];
    +        var style = styleCache[token];
    +        var match = void 0;
    +
    +        var isEmbedded;
    +        if (typeof style === 'string') {
    +          isEmbedded = false;
    +        } else {
    +          var patternParts = shortcuts[token.charAt(0)];
    +          if (patternParts) {
    +            match = token.match(patternParts[1]);
    +            style = patternParts[0];
    +          } else {
    +            for (var i = 0; i < nPatterns; ++i) {
    +              patternParts = fallthroughStylePatterns[i];
    +              match = token.match(patternParts[1]);
    +              if (match) {
    +                style = patternParts[0];
    +                break;
    +              }
    +            }
    +
    +            if (!match) {  // make sure that we make progress
    +              style = PR_PLAIN;
    +            }
    +          }
    +
    +          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
    +          if (isEmbedded && !(match && typeof match[1] === 'string')) {
    +            isEmbedded = false;
    +            style = PR_SOURCE;
    +          }
    +
    +          if (!isEmbedded) { styleCache[token] = style; }
    +        }
    +
    +        var tokenStart = pos;
    +        pos += token.length;
    +
    +        if (!isEmbedded) {
    +          decorations.push(basePos + tokenStart, style);
    +        } else {  // Treat group 1 as an embedded block of source code.
    +          var embeddedSource = match[1];
    +          var embeddedSourceStart = token.indexOf(embeddedSource);
    +          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
    +          if (match[2]) {
    +            // If embeddedSource can be blank, then it would match at the
    +            // beginning which would cause us to infinitely recurse on the
    +            // entire token, so we catch the right context in match[2].
    +            embeddedSourceEnd = token.length - match[2].length;
    +            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
    +          }
    +          var lang = style.substring(5);
    +          // Decorate the left of the embedded source
    +          appendDecorations(
    +              basePos + tokenStart,
    +              token.substring(0, embeddedSourceStart),
    +              decorate, decorations);
    +          // Decorate the embedded source
    +          appendDecorations(
    +              basePos + tokenStart + embeddedSourceStart,
    +              embeddedSource,
    +              langHandlerForExtension(lang, embeddedSource),
    +              decorations);
    +          // Decorate the right of the embedded section
    +          appendDecorations(
    +              basePos + tokenStart + embeddedSourceEnd,
    +              token.substring(embeddedSourceEnd),
    +              decorate, decorations);
    +        }
    +      }
    +      job.decorations = decorations;
    +    };
    +    return decorate;
    +  }
    +
    +  /** returns a function that produces a list of decorations from source text.
    +    *
    +    * This code treats ", ', and ` as string delimiters, and \ as a string
    +    * escape.  It does not recognize perl's qq() style strings.
    +    * It has no special handling for double delimiter escapes as in basic, or
    +    * the tripled delimiters used in python, but should work on those regardless
    +    * although in those cases a single string literal may be broken up into
    +    * multiple adjacent string literals.
    +    *
    +    * It recognizes C, C++, and shell style comments.
    +    *
    +    * @param {Object} options a set of optional parameters.
    +    * @return {function (Object)} a function that examines the source code
    +    *     in the input job and builds the decoration list.
    +    */
    +  function sourceDecorator(options) {
    +    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
    +    if (options['tripleQuotedStrings']) {
    +      // '''multi-line-string''', 'single-line-string', and double-quoted
    +      shortcutStylePatterns.push(
    +          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
    +           null, '\'"']);
    +    } else if (options['multiLineStrings']) {
    +      // 'multi-line-string', "multi-line-string"
    +      shortcutStylePatterns.push(
    +          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
    +           null, '\'"`']);
    +    } else {
    +      // 'single-line-string', "single-line-string"
    +      shortcutStylePatterns.push(
    +          [PR_STRING,
    +           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
    +           null, '"\'']);
    +    }
    +    if (options['verbatimStrings']) {
    +      // verbatim-string-literal production from the C# grammar.  See issue 93.
    +      fallthroughStylePatterns.push(
    +          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
    +    }
    +    var hc = options['hashComments'];
    +    if (hc) {
    +      if (options['cStyleComments']) {
    +        if (hc > 1) {  // multiline hash comments
    +          shortcutStylePatterns.push(
    +              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
    +        } else {
    +          // Stop C preprocessor declarations at an unclosed open comment
    +          shortcutStylePatterns.push(
    +              [PR_COMMENT, /^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,
    +               null, '#']);
    +        }
    +        // #include <stdio.h>
    +        fallthroughStylePatterns.push(
    +            [PR_STRING,
    +             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,
    +             null]);
    +      } else {
    +        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
    +      }
    +    }
    +    if (options['cStyleComments']) {
    +      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
    +      fallthroughStylePatterns.push(
    +          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
    +    }
    +    var regexLiterals = options['regexLiterals'];
    +    if (regexLiterals) {
    +      /**
    +       * @const
    +       */
    +      var regexExcls = regexLiterals > 1
    +        ? ''  // Multiline regex literals
    +        : '\n\r';
    +      /**
    +       * @const
    +       */
    +      var regexAny = regexExcls ? '.' : '[\\S\\s]';
    +      /**
    +       * @const
    +       */
    +      var REGEX_LITERAL = (
    +          // A regular expression literal starts with a slash that is
    +          // not followed by * or / so that it is not confused with
    +          // comments.
    +          '/(?=[^/*' + regexExcls + '])'
    +          // and then contains any number of raw characters,
    +          + '(?:[^/\\x5B\\x5C' + regexExcls + ']'
    +          // escape sequences (\x5C),
    +          +    '|\\x5C' + regexAny
    +          // or non-nesting character sets (\x5B\x5D);
    +          +    '|\\x5B(?:[^\\x5C\\x5D' + regexExcls + ']'
    +          +             '|\\x5C' + regexAny + ')*(?:\\x5D|$))+'
    +          // finally closed by a /.
    +          + '/');
    +      fallthroughStylePatterns.push(
    +          ['lang-regex',
    +           RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
    +           ]);
    +    }
    +
    +    var types = options['types'];
    +    if (types) {
    +      fallthroughStylePatterns.push([PR_TYPE, types]);
    +    }
    +
    +    var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
    +    if (keywords.length) {
    +      fallthroughStylePatterns.push(
    +          [PR_KEYWORD,
    +           new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
    +           null]);
    +    }
    +
    +    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
    +
    +    var punctuation =
    +      // The Bash man page says
    +
    +      // A word is a sequence of characters considered as a single
    +      // unit by GRUB. Words are separated by metacharacters,
    +      // which are the following plus space, tab, and newline: { }
    +      // | & $ ; < >
    +      // ...
    +      
    +      // A word beginning with # causes that word and all remaining
    +      // characters on that line to be ignored.
    +
    +      // which means that only a '#' after /(?:^|[{}|&$;<>\s])/ starts a
    +      // comment but empirically
    +      // $ echo {#}
    +      // {#}
    +      // $ echo \$#
    +      // $#
    +      // $ echo }#
    +      // }#
    +
    +      // so /(?:^|[|&;<>\s])/ is more appropriate.
    +
    +      // http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC3
    +      // suggests that this definition is compatible with a
    +      // default mode that tries to use a single token definition
    +      // to recognize both bash/python style comments and C
    +      // preprocessor directives.
    +
    +      // This definition of punctuation does not include # in the list of
    +      // follow-on exclusions, so # will not be broken before if preceeded
    +      // by a punctuation character.  We could try to exclude # after
    +      // [|&;<>] but that doesn't seem to cause many major problems.
    +      // If that does turn out to be a problem, we should change the below
    +      // when hc is truthy to include # in the run of punctuation characters
    +      // only when not followint [|&;<>].
    +      '^.[^\\s\\w.$@\'"`/\\\\]*';
    +    if (options['regexLiterals']) {
    +      punctuation += '(?!\s*\/)';
    +    }
    +
    +    fallthroughStylePatterns.push(
    +        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
    +        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
    +        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null],
    +        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
    +        [PR_LITERAL,
    +         new RegExp(
    +             '^(?:'
    +             // A hex number
    +             + '0x[a-f0-9]+'
    +             // or an octal or decimal number,
    +             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
    +             // possibly in scientific notation
    +             + '(?:e[+\\-]?\\d+)?'
    +             + ')'
    +             // with an optional modifier like UL for unsigned long
    +             + '[a-z]*', 'i'),
    +         null, '0123456789'],
    +        // Don't treat escaped quotes in bash as starting strings.
    +        // See issue 144.
    +        [PR_PLAIN,       /^\\[\s\S]?/, null],
    +        [PR_PUNCTUATION, new RegExp(punctuation), null]);
    +
    +    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
    +  }
    +
    +  var decorateSource = sourceDecorator({
    +        'keywords': ALL_KEYWORDS,
    +        'hashComments': true,
    +        'cStyleComments': true,
    +        'multiLineStrings': true,
    +        'regexLiterals': true
    +      });
    +
    +  /**
    +   * Given a DOM subtree, wraps it in a list, and puts each line into its own
    +   * list item.
    +   *
    +   * @param {Node} node modified in place.  Its content is pulled into an
    +   *     HTMLOListElement, and each line is moved into a separate list item.
    +   *     This requires cloning elements, so the input might not have unique
    +   *     IDs after numbering.
    +   * @param {boolean} isPreformatted true iff white-space in text nodes should
    +   *     be treated as significant.
    +   */
    +  function numberLines(node, opt_startLineNum, isPreformatted) {
    +    var nocode = /(?:^|\s)nocode(?:\s|$)/;
    +    var lineBreak = /\r\n?|\n/;
    +  
    +    var document = node.ownerDocument;
    +  
    +    var li = document.createElement('li');
    +    while (node.firstChild) {
    +      li.appendChild(node.firstChild);
    +    }
    +    // An array of lines.  We split below, so this is initialized to one
    +    // un-split line.
    +    var listItems = [li];
    +  
    +    function walk(node) {
    +      var type = node.nodeType;
    +      if (type == 1 && !nocode.test(node.className)) {  // Element
    +        if ('br' === node.nodeName) {
    +          breakAfter(node);
    +          // Discard the <BR> since it is now flush against a </LI>.
    +          if (node.parentNode) {
    +            node.parentNode.removeChild(node);
    +          }
    +        } else {
    +          for (var child = node.firstChild; child; child = child.nextSibling) {
    +            walk(child);
    +          }
    +        }
    +      } else if ((type == 3 || type == 4) && isPreformatted) {  // Text
    +        var text = node.nodeValue;
    +        var match = text.match(lineBreak);
    +        if (match) {
    +          var firstLine = text.substring(0, match.index);
    +          node.nodeValue = firstLine;
    +          var tail = text.substring(match.index + match[0].length);
    +          if (tail) {
    +            var parent = node.parentNode;
    +            parent.insertBefore(
    +              document.createTextNode(tail), node.nextSibling);
    +          }
    +          breakAfter(node);
    +          if (!firstLine) {
    +            // Don't leave blank text nodes in the DOM.
    +            node.parentNode.removeChild(node);
    +          }
    +        }
    +      }
    +    }
    +  
    +    // Split a line after the given node.
    +    function breakAfter(lineEndNode) {
    +      // If there's nothing to the right, then we can skip ending the line
    +      // here, and move root-wards since splitting just before an end-tag
    +      // would require us to create a bunch of empty copies.
    +      while (!lineEndNode.nextSibling) {
    +        lineEndNode = lineEndNode.parentNode;
    +        if (!lineEndNode) { return; }
    +      }
    +  
    +      function breakLeftOf(limit, copy) {
    +        // Clone shallowly if this node needs to be on both sides of the break.
    +        var rightSide = copy ? limit.cloneNode(false) : limit;
    +        var parent = limit.parentNode;
    +        if (parent) {
    +          // We clone the parent chain.
    +          // This helps us resurrect important styling elements that cross lines.
    +          // E.g. in <i>Foo<br>Bar</i>
    +          // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
    +          var parentClone = breakLeftOf(parent, 1);
    +          // Move the clone and everything to the right of the original
    +          // onto the cloned parent.
    +          var next = limit.nextSibling;
    +          parentClone.appendChild(rightSide);
    +          for (var sibling = next; sibling; sibling = next) {
    +            next = sibling.nextSibling;
    +            parentClone.appendChild(sibling);
    +          }
    +        }
    +        return rightSide;
    +      }
    +  
    +      var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
    +  
    +      // Walk the parent chain until we reach an unattached LI.
    +      for (var parent;
    +           // Check nodeType since IE invents document fragments.
    +           (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
    +        copiedListItem = parent;
    +      }
    +      // Put it on the list of lines for later processing.
    +      listItems.push(copiedListItem);
    +    }
    +  
    +    // Split lines while there are lines left to split.
    +    for (var i = 0;  // Number of lines that have been split so far.
    +         i < listItems.length;  // length updated by breakAfter calls.
    +         ++i) {
    +      walk(listItems[i]);
    +    }
    +  
    +    // Make sure numeric indices show correctly.
    +    if (opt_startLineNum === (opt_startLineNum|0)) {
    +      listItems[0].setAttribute('value', opt_startLineNum);
    +    }
    +  
    +    var ol = document.createElement('ol');
    +    ol.className = 'linenums';
    +    var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;
    +    for (var i = 0, n = listItems.length; i < n; ++i) {
    +      li = listItems[i];
    +      // Stick a class on the LIs so that stylesheets can
    +      // color odd/even rows, or any other row pattern that
    +      // is co-prime with 10.
    +      li.className = 'L' + ((i + offset) % 10);
    +      if (!li.firstChild) {
    +        li.appendChild(document.createTextNode('\xA0'));
    +      }
    +      ol.appendChild(li);
    +    }
    +  
    +    node.appendChild(ol);
    +  }
    +  /**
    +   * Breaks {@code job.sourceCode} around style boundaries in
    +   * {@code job.decorations} and modifies {@code job.sourceNode} in place.
    +   * @param {Object} job like <pre>{
    +   *    sourceCode: {string} source as plain text,
    +   *    sourceNode: {HTMLElement} the element containing the source,
    +   *    spans: {Array.<number|Node>} alternating span start indices into source
    +   *       and the text node or element (e.g. {@code <BR>}) corresponding to that
    +   *       span.
    +   *    decorations: {Array.<number|string} an array of style classes preceded
    +   *       by the position at which they start in job.sourceCode in order
    +   * }</pre>
    +   * @private
    +   */
    +  function recombineTagsAndDecorations(job) {
    +    var isIE8OrEarlier = /\bMSIE\s(\d+)/.exec(navigator.userAgent);
    +    isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;
    +    var newlineRe = /\n/g;
    +  
    +    var source = job.sourceCode;
    +    var sourceLength = source.length;
    +    // Index into source after the last code-unit recombined.
    +    var sourceIndex = 0;
    +  
    +    var spans = job.spans;
    +    var nSpans = spans.length;
    +    // Index into spans after the last span which ends at or before sourceIndex.
    +    var spanIndex = 0;
    +  
    +    var decorations = job.decorations;
    +    var nDecorations = decorations.length;
    +    // Index into decorations after the last decoration which ends at or before
    +    // sourceIndex.
    +    var decorationIndex = 0;
    +  
    +    // Remove all zero-length decorations.
    +    decorations[nDecorations] = sourceLength;
    +    var decPos, i;
    +    for (i = decPos = 0; i < nDecorations;) {
    +      if (decorations[i] !== decorations[i + 2]) {
    +        decorations[decPos++] = decorations[i++];
    +        decorations[decPos++] = decorations[i++];
    +      } else {
    +        i += 2;
    +      }
    +    }
    +    nDecorations = decPos;
    +  
    +    // Simplify decorations.
    +    for (i = decPos = 0; i < nDecorations;) {
    +      var startPos = decorations[i];
    +      // Conflate all adjacent decorations that use the same style.
    +      var startDec = decorations[i + 1];
    +      var end = i + 2;
    +      while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
    +        end += 2;
    +      }
    +      decorations[decPos++] = startPos;
    +      decorations[decPos++] = startDec;
    +      i = end;
    +    }
    +  
    +    nDecorations = decorations.length = decPos;
    +  
    +    var sourceNode = job.sourceNode;
    +    var oldDisplay;
    +    if (sourceNode) {
    +      oldDisplay = sourceNode.style.display;
    +      sourceNode.style.display = 'none';
    +    }
    +    try {
    +      var decoration = null;
    +      while (spanIndex < nSpans) {
    +        var spanStart = spans[spanIndex];
    +        var spanEnd = spans[spanIndex + 2] || sourceLength;
    +  
    +        var decEnd = decorations[decorationIndex + 2] || sourceLength;
    +  
    +        var end = Math.min(spanEnd, decEnd);
    +  
    +        var textNode = spans[spanIndex + 1];
    +        var styledText;
    +        if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s
    +            // Don't introduce spans around empty text nodes.
    +            && (styledText = source.substring(sourceIndex, end))) {
    +          // This may seem bizarre, and it is.  Emitting LF on IE causes the
    +          // code to display with spaces instead of line breaks.
    +          // Emitting Windows standard issue linebreaks (CRLF) causes a blank
    +          // space to appear at the beginning of every line but the first.
    +          // Emitting an old Mac OS 9 line separator makes everything spiffy.
    +          if (isIE8OrEarlier) {
    +            styledText = styledText.replace(newlineRe, '\r');
    +          }
    +          textNode.nodeValue = styledText;
    +          var document = textNode.ownerDocument;
    +          var span = document.createElement('span');
    +          span.className = decorations[decorationIndex + 1];
    +          var parentNode = textNode.parentNode;
    +          parentNode.replaceChild(span, textNode);
    +          span.appendChild(textNode);
    +          if (sourceIndex < spanEnd) {  // Split off a text node.
    +            spans[spanIndex + 1] = textNode
    +                // TODO: Possibly optimize by using '' if there's no flicker.
    +                = document.createTextNode(source.substring(end, spanEnd));
    +            parentNode.insertBefore(textNode, span.nextSibling);
    +          }
    +        }
    +  
    +        sourceIndex = end;
    +  
    +        if (sourceIndex >= spanEnd) {
    +          spanIndex += 2;
    +        }
    +        if (sourceIndex >= decEnd) {
    +          decorationIndex += 2;
    +        }
    +      }
    +    } finally {
    +      if (sourceNode) {
    +        sourceNode.style.display = oldDisplay;
    +      }
    +    }
    +  }
    +
    +  /** Maps language-specific file extensions to handlers. */
    +  var langHandlerRegistry = {};
    +  /** Register a language handler for the given file extensions.
    +    * @param {function (Object)} handler a function from source code to a list
    +    *      of decorations.  Takes a single argument job which describes the
    +    *      state of the computation.   The single parameter has the form
    +    *      {@code {
    +    *        sourceCode: {string} as plain text.
    +    *        decorations: {Array.<number|string>} an array of style classes
    +    *                     preceded by the position at which they start in
    +    *                     job.sourceCode in order.
    +    *                     The language handler should assigned this field.
    +    *        basePos: {int} the position of source in the larger source chunk.
    +    *                 All positions in the output decorations array are relative
    +    *                 to the larger source chunk.
    +    *      } }
    +    * @param {Array.<string>} fileExtensions
    +    */
    +  function registerLangHandler(handler, fileExtensions) {
    +    for (var i = fileExtensions.length; --i >= 0;) {
    +      var ext = fileExtensions[i];
    +      if (!langHandlerRegistry.hasOwnProperty(ext)) {
    +        langHandlerRegistry[ext] = handler;
    +      } else if (win['console']) {
    +        console['warn']('cannot override language handler %s', ext);
    +      }
    +    }
    +  }
    +  function langHandlerForExtension(extension, source) {
    +    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
    +      // Treat it as markup if the first non whitespace character is a < and
    +      // the last non-whitespace character is a >.
    +      extension = /^\s*</.test(source)
    +          ? 'default-markup'
    +          : 'default-code';
    +    }
    +    return langHandlerRegistry[extension];
    +  }
    +  registerLangHandler(decorateSource, ['default-code']);
    +  registerLangHandler(
    +      createSimpleLexer(
    +          [],
    +          [
    +           [PR_PLAIN,       /^[^<?]+/],
    +           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
    +           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
    +           // Unescaped content in an unknown language
    +           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
    +           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
    +           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
    +           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
    +           // Unescaped content in javascript.  (Or possibly vbscript).
    +           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
    +           // Contains unescaped stylesheet content
    +           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
    +           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
    +          ]),
    +      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
    +  registerLangHandler(
    +      createSimpleLexer(
    +          [
    +           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
    +           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
    +           ],
    +          [
    +           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
    +           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
    +           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
    +           [PR_PUNCTUATION,  /^[=<>\/]+/],
    +           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
    +           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
    +           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
    +           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
    +           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
    +           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
    +           ]),
    +      ['in.tag']);
    +  registerLangHandler(
    +      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': CPP_KEYWORDS,
    +          'hashComments': true,
    +          'cStyleComments': true,
    +          'types': C_TYPES
    +        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': 'null,true,false'
    +        }), ['json']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': CSHARP_KEYWORDS,
    +          'hashComments': true,
    +          'cStyleComments': true,
    +          'verbatimStrings': true,
    +          'types': C_TYPES
    +        }), ['cs']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': JAVA_KEYWORDS,
    +          'cStyleComments': true
    +        }), ['java']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': SH_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true
    +        }), ['bash', 'bsh', 'csh', 'sh']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': PYTHON_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true,
    +          'tripleQuotedStrings': true
    +        }), ['cv', 'py', 'python']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': PERL_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true,
    +          'regexLiterals': 2  // multiline regex literals
    +        }), ['perl', 'pl', 'pm']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': RUBY_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true,
    +          'regexLiterals': true
    +        }), ['rb', 'ruby']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': JSCRIPT_KEYWORDS,
    +          'cStyleComments': true,
    +          'regexLiterals': true
    +        }), ['javascript', 'js']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': COFFEE_KEYWORDS,
    +          'hashComments': 3,  // ### style block comments
    +          'cStyleComments': true,
    +          'multilineStrings': true,
    +          'tripleQuotedStrings': true,
    +          'regexLiterals': true
    +        }), ['coffee']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': RUST_KEYWORDS,
    +          'cStyleComments': true,
    +          'multilineStrings': true
    +        }), ['rc', 'rs', 'rust']);
    +  registerLangHandler(
    +      createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
    +
    +  function applyDecorator(job) {
    +    var opt_langExtension = job.langExtension;
    +
    +    try {
    +      // Extract tags, and convert the source code to plain text.
    +      var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);
    +      /** Plain text. @type {string} */
    +      var source = sourceAndSpans.sourceCode;
    +      job.sourceCode = source;
    +      job.spans = sourceAndSpans.spans;
    +      job.basePos = 0;
    +
    +      // Apply the appropriate language handler
    +      langHandlerForExtension(opt_langExtension, source)(job);
    +
    +      // Integrate the decorations and tags back into the source code,
    +      // modifying the sourceNode in place.
    +      recombineTagsAndDecorations(job);
    +    } catch (e) {
    +      if (win['console']) {
    +        console['log'](e && e['stack'] || e);
    +      }
    +    }
    +  }
    +
    +  /**
    +   * Pretty print a chunk of code.
    +   * @param sourceCodeHtml {string} The HTML to pretty print.
    +   * @param opt_langExtension {string} The language name to use.
    +   *     Typically, a filename extension like 'cpp' or 'java'.
    +   * @param opt_numberLines {number|boolean} True to number lines,
    +   *     or the 1-indexed number of the first line in sourceCodeHtml.
    +   */
    +  function $prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
    +    var container = document.createElement('div');
    +    // This could cause images to load and onload listeners to fire.
    +    // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
    +    // We assume that the inner HTML is from a trusted source.
    +    // The pre-tag is required for IE8 which strips newlines from innerHTML
    +    // when it is injected into a <pre> tag.
    +    // http://stackoverflow.com/questions/451486/pre-tag-loses-line-breaks-when-setting-innerhtml-in-ie
    +    // http://stackoverflow.com/questions/195363/inserting-a-newline-into-a-pre-tag-ie-javascript
    +    container.innerHTML = '<pre>' + sourceCodeHtml + '</pre>';
    +    container = container.firstChild;
    +    if (opt_numberLines) {
    +      numberLines(container, opt_numberLines, true);
    +    }
    +
    +    var job = {
    +      langExtension: opt_langExtension,
    +      numberLines: opt_numberLines,
    +      sourceNode: container,
    +      pre: 1
    +    };
    +    applyDecorator(job);
    +    return container.innerHTML;
    +  }
    +
    +   /**
    +    * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
    +    * {@code class=prettyprint} and prettify them.
    +    *
    +    * @param {Function} opt_whenDone called when prettifying is done.
    +    * @param {HTMLElement|HTMLDocument} opt_root an element or document
    +    *   containing all the elements to pretty print.
    +    *   Defaults to {@code document.body}.
    +    */
    +  function $prettyPrint(opt_whenDone, opt_root) {
    +    var root = opt_root || document.body;
    +    var doc = root.ownerDocument || document;
    +    function byTagName(tn) { return root.getElementsByTagName(tn); }
    +    // fetch a list of nodes to rewrite
    +    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
    +    var elements = [];
    +    for (var i = 0; i < codeSegments.length; ++i) {
    +      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
    +        elements.push(codeSegments[i][j]);
    +      }
    +    }
    +    codeSegments = null;
    +
    +    var clock = Date;
    +    if (!clock['now']) {
    +      clock = { 'now': function () { return +(new Date); } };
    +    }
    +
    +    // The loop is broken into a series of continuations to make sure that we
    +    // don't make the browser unresponsive when rewriting a large page.
    +    var k = 0;
    +    var prettyPrintingJob;
    +
    +    var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
    +    var prettyPrintRe = /\bprettyprint\b/;
    +    var prettyPrintedRe = /\bprettyprinted\b/;
    +    var preformattedTagNameRe = /pre|xmp/i;
    +    var codeRe = /^code$/i;
    +    var preCodeXmpRe = /^(?:pre|code|xmp)$/i;
    +    var EMPTY = {};
    +
    +    function doWork() {
    +      var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?
    +                     clock['now']() + 250 /* ms */ :
    +                     Infinity);
    +      for (; k < elements.length && clock['now']() < endTime; k++) {
    +        var cs = elements[k];
    +
    +        // Look for a preceding comment like
    +        // <?prettify lang="..." linenums="..."?>
    +        var attrs = EMPTY;
    +        {
    +          for (var preceder = cs; (preceder = preceder.previousSibling);) {
    +            var nt = preceder.nodeType;
    +            // <?foo?> is parsed by HTML 5 to a comment node (8)
    +            // like <!--?foo?-->, but in XML is a processing instruction
    +            var value = (nt === 7 || nt === 8) && preceder.nodeValue;
    +            if (value
    +                ? !/^\??prettify\b/.test(value)
    +                : (nt !== 3 || /\S/.test(preceder.nodeValue))) {
    +              // Skip over white-space text nodes but not others.
    +              break;
    +            }
    +            if (value) {
    +              attrs = {};
    +              value.replace(
    +                  /\b(\w+)=([\w:.%+-]+)/g,
    +                function (_, name, value) { attrs[name] = value; });
    +              break;
    +            }
    +          }
    +        }
    +
    +        var className = cs.className;
    +        if ((attrs !== EMPTY || prettyPrintRe.test(className))
    +            // Don't redo this if we've already done it.
    +            // This allows recalling pretty print to just prettyprint elements
    +            // that have been added to the page since last call.
    +            && !prettyPrintedRe.test(className)) {
    +
    +          // make sure this is not nested in an already prettified element
    +          var nested = false;
    +          for (var p = cs.parentNode; p; p = p.parentNode) {
    +            var tn = p.tagName;
    +            if (preCodeXmpRe.test(tn)
    +                && p.className && prettyPrintRe.test(p.className)) {
    +              nested = true;
    +              break;
    +            }
    +          }
    +          if (!nested) {
    +            // Mark done.  If we fail to prettyprint for whatever reason,
    +            // we shouldn't try again.
    +            cs.className += ' prettyprinted';
    +
    +            // If the classes includes a language extensions, use it.
    +            // Language extensions can be specified like
    +            //     <pre class="prettyprint lang-cpp">
    +            // the language extension "cpp" is used to find a language handler
    +            // as passed to PR.registerLangHandler.
    +            // HTML5 recommends that a language be specified using "language-"
    +            // as the prefix instead.  Google Code Prettify supports both.
    +            // http://dev.w3.org/html5/spec-author-view/the-code-element.html
    +            var langExtension = attrs['lang'];
    +            if (!langExtension) {
    +              langExtension = className.match(langExtensionRe);
    +              // Support <pre class="prettyprint"><code class="language-c">
    +              var wrapper;
    +              if (!langExtension && (wrapper = childContentWrapper(cs))
    +                  && codeRe.test(wrapper.tagName)) {
    +                langExtension = wrapper.className.match(langExtensionRe);
    +              }
    +
    +              if (langExtension) { langExtension = langExtension[1]; }
    +            }
    +
    +            var preformatted;
    +            if (preformattedTagNameRe.test(cs.tagName)) {
    +              preformatted = 1;
    +            } else {
    +              var currentStyle = cs['currentStyle'];
    +              var defaultView = doc.defaultView;
    +              var whitespace = (
    +                  currentStyle
    +                  ? currentStyle['whiteSpace']
    +                  : (defaultView
    +                     && defaultView.getComputedStyle)
    +                  ? defaultView.getComputedStyle(cs, null)
    +                  .getPropertyValue('white-space')
    +                  : 0);
    +              preformatted = whitespace
    +                  && 'pre' === whitespace.substring(0, 3);
    +            }
    +
    +            // Look for a class like linenums or linenums:<n> where <n> is the
    +            // 1-indexed number of the first line.
    +            var lineNums = attrs['linenums'];
    +            if (!(lineNums = lineNums === 'true' || +lineNums)) {
    +              lineNums = className.match(/\blinenums\b(?::(\d+))?/);
    +              lineNums =
    +                lineNums
    +                ? lineNums[1] && lineNums[1].length
    +                  ? +lineNums[1] : true
    +                : false;
    +            }
    +            if (lineNums) { numberLines(cs, lineNums, preformatted); }
    +
    +            // do the pretty printing
    +            prettyPrintingJob = {
    +              langExtension: langExtension,
    +              sourceNode: cs,
    +              numberLines: lineNums,
    +              pre: preformatted
    +            };
    +            applyDecorator(prettyPrintingJob);
    +          }
    +        }
    +      }
    +      if (k < elements.length) {
    +        // finish up in a continuation
    +        setTimeout(doWork, 250);
    +      } else if ('function' === typeof opt_whenDone) {
    +        opt_whenDone();
    +      }
    +    }
    +
    +    doWork();
    +  }
    +
    +  /**
    +   * Contains functions for creating and registering new language handlers.
    +   * @type {Object}
    +   */
    +  var PR = win['PR'] = {
    +        'createSimpleLexer': createSimpleLexer,
    +        'registerLangHandler': registerLangHandler,
    +        'sourceDecorator': sourceDecorator,
    +        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
    +        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
    +        'PR_COMMENT': PR_COMMENT,
    +        'PR_DECLARATION': PR_DECLARATION,
    +        'PR_KEYWORD': PR_KEYWORD,
    +        'PR_LITERAL': PR_LITERAL,
    +        'PR_NOCODE': PR_NOCODE,
    +        'PR_PLAIN': PR_PLAIN,
    +        'PR_PUNCTUATION': PR_PUNCTUATION,
    +        'PR_SOURCE': PR_SOURCE,
    +        'PR_STRING': PR_STRING,
    +        'PR_TAG': PR_TAG,
    +        'PR_TYPE': PR_TYPE,
    +        'prettyPrintOne':
    +           IN_GLOBAL_SCOPE
    +             ? (win['prettyPrintOne'] = $prettyPrintOne)
    +             : (prettyPrintOne = $prettyPrintOne),
    +        'prettyPrint': prettyPrint =
    +           IN_GLOBAL_SCOPE
    +             ? (win['prettyPrint'] = $prettyPrint)
    +             : (prettyPrint = $prettyPrint)
    +      };
    +
    +  // Make PR available via the Asynchronous Module Definition (AMD) API.
    +  // Per https://github.com/amdjs/amdjs-api/wiki/AMD:
    +  // The Asynchronous Module Definition (AMD) API specifies a
    +  // mechanism for defining modules such that the module and its
    +  // dependencies can be asynchronously loaded.
    +  // ...
    +  // To allow a clear indicator that a global define function (as
    +  // needed for script src browser loading) conforms to the AMD API,
    +  // any global define function SHOULD have a property called "amd"
    +  // whose value is an object. This helps avoid conflict with any
    +  // other existing JavaScript code that could have defined a define()
    +  // function that does not conform to the AMD API.
    +  if (typeof define === "function" && define['amd']) {
    +    define("google-code-prettify", [], function () {
    +      return PR; 
    +    });
    +  }
    +})();
    diff --git a/src/main/webapp/plug-in/ace/js/respond.js b/src/main/webapp/plug-in/ace/js/respond.js
    new file mode 100644
    index 00000000..b1298d07
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ace/js/respond.js
    @@ -0,0 +1,224 @@
    +/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
    +/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
    +(function(w) {
    +  "use strict";
    +  w.matchMedia = w.matchMedia || function(doc, undefined) {
    +    var bool, docElem = doc.documentElement, refNode = docElem.firstElementChild || docElem.firstChild, fakeBody = doc.createElement("body"), div = doc.createElement("div");
    +    div.id = "mq-test-1";
    +    div.style.cssText = "position:absolute;top:-100em";
    +    fakeBody.style.background = "none";
    +    fakeBody.appendChild(div);
    +    return function(q) {
    +      div.innerHTML = '&shy;<style media="' + q + '"> #mq-test-1 { width: 42px; }</style>';
    +      docElem.insertBefore(fakeBody, refNode);
    +      bool = div.offsetWidth === 42;
    +      docElem.removeChild(fakeBody);
    +      return {
    +        matches: bool,
    +        media: q
    +      };
    +    };
    +  }(w.document);
    +})(this);
    +
    +/*! Respond.js v1.4.0: min/max-width media query polyfill. (c) Scott Jehl. MIT Lic. j.mp/respondjs  */
    +(function(w) {
    +  "use strict";
    +  var respond = {};
    +  w.respond = respond;
    +  respond.update = function() {};
    +  var requestQueue = [], xmlHttp = function() {
    +    var xmlhttpmethod = false;
    +    try {
    +      xmlhttpmethod = new w.XMLHttpRequest();
    +    } catch (e) {
    +      xmlhttpmethod = new w.ActiveXObject("Microsoft.XMLHTTP");
    +    }
    +    return function() {
    +      return xmlhttpmethod;
    +    };
    +  }(), ajax = function(url, callback) {
    +    var req = xmlHttp();
    +    if (!req) {
    +      return;
    +    }
    +    req.open("GET", url, true);
    +    req.onreadystatechange = function() {
    +      if (req.readyState !== 4 || req.status !== 200 && req.status !== 304) {
    +        return;
    +      }
    +      callback(req.responseText);
    +    };
    +    if (req.readyState === 4) {
    +      return;
    +    }
    +    req.send(null);
    +  };
    +  respond.ajax = ajax;
    +  respond.queue = requestQueue;
    +  respond.regex = {
    +    media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,
    +    keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,
    +    urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,
    +    findStyles: /@media *([^\{]+)\{([\S\s]+?)$/,
    +    only: /(only\s+)?([a-zA-Z]+)\s?/,
    +    minw: /\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,
    +    maxw: /\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/
    +  };
    +  respond.mediaQueriesSupported = w.matchMedia && w.matchMedia("only all") !== null && w.matchMedia("only all").matches;
    +  if (respond.mediaQueriesSupported) {
    +    return;
    +  }
    +  var doc = w.document, docElem = doc.documentElement, mediastyles = [], rules = [], appendedEls = [], parsedSheets = {}, resizeThrottle = 30, head = doc.getElementsByTagName("head")[0] || docElem, base = doc.getElementsByTagName("base")[0], links = head.getElementsByTagName("link"), lastCall, resizeDefer, eminpx, getEmValue = function() {
    +    var ret, div = doc.createElement("div"), body = doc.body, originalHTMLFontSize = docElem.style.fontSize, originalBodyFontSize = body && body.style.fontSize, fakeUsed = false;
    +    div.style.cssText = "position:absolute;font-size:1em;width:1em";
    +    if (!body) {
    +      body = fakeUsed = doc.createElement("body");
    +      body.style.background = "none";
    +    }
    +    docElem.style.fontSize = "100%";
    +    body.style.fontSize = "100%";
    +    body.appendChild(div);
    +    if (fakeUsed) {
    +      docElem.insertBefore(body, docElem.firstChild);
    +    }
    +    ret = div.offsetWidth;
    +    if (fakeUsed) {
    +      docElem.removeChild(body);
    +    } else {
    +      body.removeChild(div);
    +    }
    +    docElem.style.fontSize = originalHTMLFontSize;
    +    if (originalBodyFontSize) {
    +      body.style.fontSize = originalBodyFontSize;
    +    }
    +    ret = eminpx = parseFloat(ret);
    +    return ret;
    +  }, applyMedia = function(fromResize) {
    +    var name = "clientWidth", docElemProp = docElem[name], currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[name] || docElemProp, styleBlocks = {}, lastLink = links[links.length - 1], now = new Date().getTime();
    +    if (fromResize && lastCall && now - lastCall < resizeThrottle) {
    +      w.clearTimeout(resizeDefer);
    +      resizeDefer = w.setTimeout(applyMedia, resizeThrottle);
    +      return;
    +    } else {
    +      lastCall = now;
    +    }
    +    for (var i in mediastyles) {
    +      if (mediastyles.hasOwnProperty(i)) {
    +        var thisstyle = mediastyles[i], min = thisstyle.minw, max = thisstyle.maxw, minnull = min === null, maxnull = max === null, em = "em";
    +        if (!!min) {
    +          min = parseFloat(min) * (min.indexOf(em) > -1 ? eminpx || getEmValue() : 1);
    +        }
    +        if (!!max) {
    +          max = parseFloat(max) * (max.indexOf(em) > -1 ? eminpx || getEmValue() : 1);
    +        }
    +        if (!thisstyle.hasquery || (!minnull || !maxnull) && (minnull || currWidth >= min) && (maxnull || currWidth <= max)) {
    +          if (!styleBlocks[thisstyle.media]) {
    +            styleBlocks[thisstyle.media] = [];
    +          }
    +          styleBlocks[thisstyle.media].push(rules[thisstyle.rules]);
    +        }
    +      }
    +    }
    +    for (var j in appendedEls) {
    +      if (appendedEls.hasOwnProperty(j)) {
    +        if (appendedEls[j] && appendedEls[j].parentNode === head) {
    +          head.removeChild(appendedEls[j]);
    +        }
    +      }
    +    }
    +    appendedEls.length = 0;
    +    for (var k in styleBlocks) {
    +      if (styleBlocks.hasOwnProperty(k)) {
    +        var ss = doc.createElement("style"), css = styleBlocks[k].join("\n");
    +        ss.type = "text/css";
    +        ss.media = k;
    +        head.insertBefore(ss, lastLink.nextSibling);
    +        if (ss.styleSheet) {
    +          ss.styleSheet.cssText = css;
    +        } else {
    +          ss.appendChild(doc.createTextNode(css));
    +        }
    +        appendedEls.push(ss);
    +      }
    +    }
    +  }, translate = function(styles, href, media) {
    +    var qs = styles.replace(respond.regex.keyframes, "").match(respond.regex.media), ql = qs && qs.length || 0;
    +    href = href.substring(0, href.lastIndexOf("/"));
    +    var repUrls = function(css) {
    +      return css.replace(respond.regex.urls, "$1" + href + "$2$3");
    +    }, useMedia = !ql && media;
    +    if (href.length) {
    +      href += "/";
    +    }
    +    if (useMedia) {
    +      ql = 1;
    +    }
    +    for (var i = 0; i < ql; i++) {
    +      var fullq, thisq, eachq, eql;
    +      if (useMedia) {
    +        fullq = media;
    +        rules.push(repUrls(styles));
    +      } else {
    +        fullq = qs[i].match(respond.regex.findStyles) && RegExp.$1;
    +        rules.push(RegExp.$2 && repUrls(RegExp.$2));
    +      }
    +      eachq = fullq.split(",");
    +      eql = eachq.length;
    +      for (var j = 0; j < eql; j++) {
    +        thisq = eachq[j];
    +        mediastyles.push({
    +          media: thisq.split("(")[0].match(respond.regex.only) && RegExp.$2 || "all",
    +          rules: rules.length - 1,
    +          hasquery: thisq.indexOf("(") > -1,
    +          minw: thisq.match(respond.regex.minw) && parseFloat(RegExp.$1) + (RegExp.$2 || ""),
    +          maxw: thisq.match(respond.regex.maxw) && parseFloat(RegExp.$1) + (RegExp.$2 || "")
    +        });
    +      }
    +    }
    +    applyMedia();
    +  }, makeRequests = function() {
    +    if (requestQueue.length) {
    +      var thisRequest = requestQueue.shift();
    +      ajax(thisRequest.href, function(styles) {
    +        translate(styles, thisRequest.href, thisRequest.media);
    +        parsedSheets[thisRequest.href] = true;
    +        w.setTimeout(function() {
    +          makeRequests();
    +        }, 0);
    +      });
    +    }
    +  }, ripCSS = function() {
    +    for (var i = 0; i < links.length; i++) {
    +      var sheet = links[i], href = sheet.href, media = sheet.media, isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
    +      if (!!href && isCSS && !parsedSheets[href]) {
    +        if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
    +          translate(sheet.styleSheet.rawCssText, href, media);
    +          parsedSheets[href] = true;
    +        } else {
    +          if (!/^([a-zA-Z:]*\/\/)/.test(href) && !base || href.replace(RegExp.$1, "").split("/")[0] === w.location.host) {
    +            if (href.substring(0, 2) === "//") {
    +              href = w.location.protocol + href;
    +            }
    +            requestQueue.push({
    +              href: href,
    +              media: media
    +            });
    +          }
    +        }
    +      }
    +    }
    +    makeRequests();
    +  };
    +  ripCSS();
    +  respond.update = ripCSS;
    +  respond.getEmValue = getEmValue;
    +  function callMedia() {
    +    applyMedia(true);
    +  }
    +  if (w.addEventListener) {
    +    w.addEventListener("resize", callMedia, false);
    +  } else if (w.attachEvent) {
    +    w.attachEvent("onresize", callMedia);
    +  }
    +})(this);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ace/js/select2.js b/src/main/webapp/plug-in/ace/js/select2.js
    new file mode 100644
    index 00000000..7590b822
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ace/js/select2.js
    @@ -0,0 +1,3541 @@
    +/*
    +Copyright 2012 Igor Vaynberg
    +
    +Version: 3.5.2 Timestamp: Sat Nov  1 14:43:36 EDT 2014
    +
    +This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
    +General Public License version 2 (the "GPL License"). You may choose either license to govern your
    +use of this software only upon the condition that you accept all of the terms of either the Apache
    +License or the GPL License.
    +
    +You may obtain a copy of the Apache License and the GPL License at:
    +
    +    http://www.apache.org/licenses/LICENSE-2.0
    +    http://www.gnu.org/licenses/gpl-2.0.html
    +
    +Unless required by applicable law or agreed to in writing, software distributed under the
    +Apache License or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
    +CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
    +the specific language governing permissions and limitations under the Apache License and the GPL License.
    +*/
    +(function ($) {
    +    if(typeof $.fn.each2 == "undefined") {
    +        $.extend($.fn, {
    +            /*
    +            * 4-10 times faster .each replacement
    +            * use it carefully, as it overrides jQuery context of element on each iteration
    +            */
    +            each2 : function (c) {
    +                var j = $([0]), i = -1, l = this.length;
    +                while (
    +                    ++i < l
    +                    && (j.context = j[0] = this[i])
    +                    && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
    +                );
    +                return this;
    +            }
    +        });
    +    }
    +})(jQuery);
    +
    +(function ($, undefined) {
    +    "use strict";
    +    /*global document, window, jQuery, console */
    +
    +    if (window.Select2 !== undefined) {
    +        return;
    +    }
    +
    +    var AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
    +        lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,
    +
    +    KEY = {
    +        TAB: 9,
    +        ENTER: 13,
    +        ESC: 27,
    +        SPACE: 32,
    +        LEFT: 37,
    +        UP: 38,
    +        RIGHT: 39,
    +        DOWN: 40,
    +        SHIFT: 16,
    +        CTRL: 17,
    +        ALT: 18,
    +        PAGE_UP: 33,
    +        PAGE_DOWN: 34,
    +        HOME: 36,
    +        END: 35,
    +        BACKSPACE: 8,
    +        DELETE: 46,
    +        isArrow: function (k) {
    +            k = k.which ? k.which : k;
    +            switch (k) {
    +            case KEY.LEFT:
    +            case KEY.RIGHT:
    +            case KEY.UP:
    +            case KEY.DOWN:
    +                return true;
    +            }
    +            return false;
    +        },
    +        isControl: function (e) {
    +            var k = e.which;
    +            switch (k) {
    +            case KEY.SHIFT:
    +            case KEY.CTRL:
    +            case KEY.ALT:
    +                return true;
    +            }
    +
    +            if (e.metaKey) return true;
    +
    +            return false;
    +        },
    +        isFunctionKey: function (k) {
    +            k = k.which ? k.which : k;
    +            return k >= 112 && k <= 123;
    +        }
    +    },
    +    MEASURE_SCROLLBAR_TEMPLATE = "<div class='select2-measure-scrollbar'></div>",
    +
    +    DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038A":"\u0399","\u03AA":"\u0399","\u038C":"\u039F","\u038E":"\u03A5","\u03AB":"\u03A5","\u038F":"\u03A9","\u03AC":"\u03B1","\u03AD":"\u03B5","\u03AE":"\u03B7","\u03AF":"\u03B9","\u03CA":"\u03B9","\u0390":"\u03B9","\u03CC":"\u03BF","\u03CD":"\u03C5","\u03CB":"\u03C5","\u03B0":"\u03C5","\u03C9":"\u03C9","\u03C2":"\u03C3"};
    +
    +    $document = $(document);
    +
    +    nextUid=(function() { var counter=1; return function() { return counter++; }; }());
    +
    +
    +    function reinsertElement(element) {
    +        var placeholder = $(document.createTextNode(''));
    +
    +        element.before(placeholder);
    +        placeholder.before(element);
    +        placeholder.remove();
    +    }
    +
    +    function stripDiacritics(str) {
    +        // Used 'uni range + named function' from http://jsperf.com/diacritics/18
    +        function match(a) {
    +            return DIACRITICS[a] || a;
    +        }
    +
    +        return str.replace(/[^\u0000-\u007E]/g, match);
    +    }
    +
    +    function indexOf(value, array) {
    +        var i = 0, l = array.length;
    +        for (; i < l; i = i + 1) {
    +            if (equal(value, array[i])) return i;
    +        }
    +        return -1;
    +    }
    +
    +    function measureScrollbar () {
    +        var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
    +        $template.appendTo(document.body);
    +
    +        var dim = {
    +            width: $template.width() - $template[0].clientWidth,
    +            height: $template.height() - $template[0].clientHeight
    +        };
    +        $template.remove();
    +
    +        return dim;
    +    }
    +
    +    /**
    +     * Compares equality of a and b
    +     * @param a
    +     * @param b
    +     */
    +    function equal(a, b) {
    +        if (a === b) return true;
    +        if (a === undefined || b === undefined) return false;
    +        if (a === null || b === null) return false;
    +        // Check whether 'a' or 'b' is a string (primitive or object).
    +        // The concatenation of an empty string (+'') converts its argument to a string's primitive.
    +        if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object
    +        if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object
    +        return false;
    +    }
    +
    +    /**
    +     * Splits the string into an array of values, transforming each value. An empty array is returned for nulls or empty
    +     * strings
    +     * @param string
    +     * @param separator
    +     */
    +    function splitVal(string, separator, transform) {
    +        var val, i, l;
    +        if (string === null || string.length < 1) return [];
    +        val = string.split(separator);
    +        for (i = 0, l = val.length; i < l; i = i + 1) val[i] = transform(val[i]);
    +        return val;
    +    }
    +
    +    function getSideBorderPadding(element) {
    +        return element.outerWidth(false) - element.width();
    +    }
    +
    +    function installKeyUpChangeEvent(element) {
    +        var key="keyup-change-value";
    +        element.on("keydown", function () {
    +            if ($.data(element, key) === undefined) {
    +                $.data(element, key, element.val());
    +            }
    +        });
    +        element.on("keyup", function () {
    +            var val= $.data(element, key);
    +            if (val !== undefined && element.val() !== val) {
    +                $.removeData(element, key);
    +                element.trigger("keyup-change");
    +            }
    +        });
    +    }
    +
    +
    +    /**
    +     * filters mouse events so an event is fired only if the mouse moved.
    +     *
    +     * filters out mouse events that occur when mouse is stationary but
    +     * the elements under the pointer are scrolled.
    +     */
    +    function installFilteredMouseMove(element) {
    +        element.on("mousemove", function (e) {
    +            var lastpos = lastMousePosition;
    +            if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
    +                $(e.target).trigger("mousemove-filtered", e);
    +            }
    +        });
    +    }
    +
    +    /**
    +     * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
    +     * within the last quietMillis milliseconds.
    +     *
    +     * @param quietMillis number of milliseconds to wait before invoking fn
    +     * @param fn function to be debounced
    +     * @param ctx object to be used as this reference within fn
    +     * @return debounced version of fn
    +     */
    +    function debounce(quietMillis, fn, ctx) {
    +        ctx = ctx || undefined;
    +        var timeout;
    +        return function () {
    +            var args = arguments;
    +            window.clearTimeout(timeout);
    +            timeout = window.setTimeout(function() {
    +                fn.apply(ctx, args);
    +            }, quietMillis);
    +        };
    +    }
    +
    +    function installDebouncedScroll(threshold, element) {
    +        var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
    +        element.on("scroll", function (e) {
    +            if (indexOf(e.target, element.get()) >= 0) notify(e);
    +        });
    +    }
    +
    +    function focus($el) {
    +        if ($el[0] === document.activeElement) return;
    +
    +        /* set the focus in a 0 timeout - that way the focus is set after the processing
    +            of the current event has finished - which seems like the only reliable way
    +            to set focus */
    +        window.setTimeout(function() {
    +            var el=$el[0], pos=$el.val().length, range;
    +
    +            $el.focus();
    +
    +            /* make sure el received focus so we do not error out when trying to manipulate the caret.
    +                sometimes modals or others listeners may steal it after its set */
    +            var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0);
    +            if (isVisible && el === document.activeElement) {
    +
    +                /* after the focus is set move the caret to the end, necessary when we val()
    +                    just before setting focus */
    +                if(el.setSelectionRange)
    +                {
    +                    el.setSelectionRange(pos, pos);
    +                }
    +                else if (el.createTextRange) {
    +                    range = el.createTextRange();
    +                    range.collapse(false);
    +                    range.select();
    +                }
    +            }
    +        }, 0);
    +    }
    +
    +    function getCursorInfo(el) {
    +        el = $(el)[0];
    +        var offset = 0;
    +        var length = 0;
    +        if ('selectionStart' in el) {
    +            offset = el.selectionStart;
    +            length = el.selectionEnd - offset;
    +        } else if ('selection' in document) {
    +            el.focus();
    +            var sel = document.selection.createRange();
    +            length = document.selection.createRange().text.length;
    +            sel.moveStart('character', -el.value.length);
    +            offset = sel.text.length - length;
    +        }
    +        return { offset: offset, length: length };
    +    }
    +
    +    function killEvent(event) {
    +        event.preventDefault();
    +        event.stopPropagation();
    +    }
    +    function killEventImmediately(event) {
    +        event.preventDefault();
    +        event.stopImmediatePropagation();
    +    }
    +
    +    function measureTextWidth(e) {
    +        if (!sizer){
    +            var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
    +            sizer = $(document.createElement("div")).css({
    +                position: "absolute",
    +                left: "-10000px",
    +                top: "-10000px",
    +                display: "none",
    +                fontSize: style.fontSize,
    +                fontFamily: style.fontFamily,
    +                fontStyle: style.fontStyle,
    +                fontWeight: style.fontWeight,
    +                letterSpacing: style.letterSpacing,
    +                textTransform: style.textTransform,
    +                whiteSpace: "nowrap"
    +            });
    +            sizer.attr("class","select2-sizer");
    +            $(document.body).append(sizer);
    +        }
    +        sizer.text(e.val());
    +        return sizer.width();
    +    }
    +
    +    function syncCssClasses(dest, src, adapter) {
    +        var classes, replacements = [], adapted;
    +
    +        classes = $.trim(dest.attr("class"));
    +
    +        if (classes) {
    +            classes = '' + classes; // for IE which returns object
    +
    +            $(classes.split(/\s+/)).each2(function() {
    +                if (this.indexOf("select2-") === 0) {
    +                    replacements.push(this);
    +                }
    +            });
    +        }
    +
    +        classes = $.trim(src.attr("class"));
    +
    +        if (classes) {
    +            classes = '' + classes; // for IE which returns object
    +
    +            $(classes.split(/\s+/)).each2(function() {
    +                if (this.indexOf("select2-") !== 0) {
    +                    adapted = adapter(this);
    +
    +                    if (adapted) {
    +                        replacements.push(adapted);
    +                    }
    +                }
    +            });
    +        }
    +
    +        dest.attr("class", replacements.join(" "));
    +    }
    +
    +
    +    function markMatch(text, term, markup, escapeMarkup) {
    +        var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),
    +            tl=term.length;
    +
    +        if (match<0) {
    +            markup.push(escapeMarkup(text));
    +            return;
    +        }
    +
    +        markup.push(escapeMarkup(text.substring(0, match)));
    +        markup.push("<span class='select2-match'>");
    +        markup.push(escapeMarkup(text.substring(match, match + tl)));
    +        markup.push("</span>");
    +        markup.push(escapeMarkup(text.substring(match + tl, text.length)));
    +    }
    +
    +    function defaultEscapeMarkup(markup) {
    +        var replace_map = {
    +            '\\': '&#92;',
    +            '&': '&amp;',
    +            '<': '&lt;',
    +            '>': '&gt;',
    +            '"': '&quot;',
    +            "'": '&#39;',
    +            "/": '&#47;'
    +        };
    +
    +        return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
    +            return replace_map[match];
    +        });
    +    }
    +
    +    /**
    +     * Produces an ajax-based query function
    +     *
    +     * @param options object containing configuration parameters
    +     * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
    +     * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
    +     * @param options.url url for the data
    +     * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
    +     * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified
    +     * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
    +     * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2.
    +     *      The expected format is an object containing the following keys:
    +     *      results array of objects that will be used as choices
    +     *      more (optional) boolean indicating whether there are more results available
    +     *      Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
    +     */
    +    function ajax(options) {
    +        var timeout, // current scheduled but not yet executed request
    +            handler = null,
    +            quietMillis = options.quietMillis || 100,
    +            ajaxUrl = options.url,
    +            self = this;
    +
    +        return function (query) {
    +            window.clearTimeout(timeout);
    +            timeout = window.setTimeout(function () {
    +                var data = options.data, // ajax data function
    +                    url = ajaxUrl, // ajax url string or function
    +                    transport = options.transport || $.fn.select2.ajaxDefaults.transport,
    +                    // deprecated - to be removed in 4.0  - use params instead
    +                    deprecated = {
    +                        type: options.type || 'GET', // set type of request (GET or POST)
    +                        cache: options.cache || false,
    +                        jsonpCallback: options.jsonpCallback||undefined,
    +                        dataType: options.dataType||"json"
    +                    },
    +                    params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);
    +
    +                data = data ? data.call(self, query.term, query.page, query.context) : null;
    +                url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
    +
    +                if (handler && typeof handler.abort === "function") { handler.abort(); }
    +
    +                if (options.params) {
    +                    if ($.isFunction(options.params)) {
    +                        $.extend(params, options.params.call(self));
    +                    } else {
    +                        $.extend(params, options.params);
    +                    }
    +                }
    +
    +                $.extend(params, {
    +                    url: url,
    +                    dataType: options.dataType,
    +                    data: data,
    +                    success: function (data) {
    +                        // TODO - replace query.page with query so users have access to term, page, etc.
    +                        // added query as third paramter to keep backwards compatibility
    +                        var results = options.results(data, query.page, query);
    +                        query.callback(results);
    +                    },
    +                    error: function(jqXHR, textStatus, errorThrown){
    +                        var results = {
    +                            hasError: true,
    +                            jqXHR: jqXHR,
    +                            textStatus: textStatus,
    +                            errorThrown: errorThrown
    +                        };
    +
    +                        query.callback(results);
    +                    }
    +                });
    +                handler = transport.call(self, params);
    +            }, quietMillis);
    +        };
    +    }
    +
    +    /**
    +     * Produces a query function that works with a local array
    +     *
    +     * @param options object containing configuration parameters. The options parameter can either be an array or an
    +     * object.
    +     *
    +     * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
    +     *
    +     * If the object form is used it is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
    +     * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
    +     * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
    +     * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
    +     * the text.
    +     */
    +    function local(options) {
    +        var data = options, // data elements
    +            dataText,
    +            tmp,
    +            text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
    +
    +         if ($.isArray(data)) {
    +            tmp = data;
    +            data = { results: tmp };
    +        }
    +
    +         if ($.isFunction(data) === false) {
    +            tmp = data;
    +            data = function() { return tmp; };
    +        }
    +
    +        var dataItem = data();
    +        if (dataItem.text) {
    +            text = dataItem.text;
    +            // if text is not a function we assume it to be a key name
    +            if (!$.isFunction(text)) {
    +                dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
    +                text = function (item) { return item[dataText]; };
    +            }
    +        }
    +
    +        return function (query) {
    +            var t = query.term, filtered = { results: [] }, process;
    +            if (t === "") {
    +                query.callback(data());
    +                return;
    +            }
    +
    +            process = function(datum, collection) {
    +                var group, attr;
    +                datum = datum[0];
    +                if (datum.children) {
    +                    group = {};
    +                    for (attr in datum) {
    +                        if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
    +                    }
    +                    group.children=[];
    +                    $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
    +                    if (group.children.length || query.matcher(t, text(group), datum)) {
    +                        collection.push(group);
    +                    }
    +                } else {
    +                    if (query.matcher(t, text(datum), datum)) {
    +                        collection.push(datum);
    +                    }
    +                }
    +            };
    +
    +            $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
    +            query.callback(filtered);
    +        };
    +    }
    +
    +    // TODO javadoc
    +    function tags(data) {
    +        var isFunc = $.isFunction(data);
    +        return function (query) {
    +            var t = query.term, filtered = {results: []};
    +            var result = isFunc ? data(query) : data;
    +            if ($.isArray(result)) {
    +                $(result).each(function () {
    +                    var isObject = this.text !== undefined,
    +                        text = isObject ? this.text : this;
    +                    if (t === "" || query.matcher(t, text)) {
    +                        filtered.results.push(isObject ? this : {id: this, text: this});
    +                    }
    +                });
    +                query.callback(filtered);
    +            }
    +        };
    +    }
    +
    +    /**
    +     * Checks if the formatter function should be used.
    +     *
    +     * Throws an error if it is not a function. Returns true if it should be used,
    +     * false if no formatting should be performed.
    +     *
    +     * @param formatter
    +     */
    +    function checkFormatter(formatter, formatterName) {
    +        if ($.isFunction(formatter)) return true;
    +        if (!formatter) return false;
    +        if (typeof(formatter) === 'string') return true;
    +        throw new Error(formatterName +" must be a string, function, or falsy value");
    +    }
    +
    +  /**
    +   * Returns a given value
    +   * If given a function, returns its output
    +   *
    +   * @param val string|function
    +   * @param context value of "this" to be passed to function
    +   * @returns {*}
    +   */
    +    function evaluate(val, context) {
    +        if ($.isFunction(val)) {
    +            var args = Array.prototype.slice.call(arguments, 2);
    +            return val.apply(context, args);
    +        }
    +        return val;
    +    }
    +
    +    function countResults(results) {
    +        var count = 0;
    +        $.each(results, function(i, item) {
    +            if (item.children) {
    +                count += countResults(item.children);
    +            } else {
    +                count++;
    +            }
    +        });
    +        return count;
    +    }
    +
    +    /**
    +     * Default tokenizer. This function uses breaks the input on substring match of any string from the
    +     * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
    +     * two options have to be defined in order for the tokenizer to work.
    +     *
    +     * @param input text user has typed so far or pasted into the search field
    +     * @param selection currently selected choices
    +     * @param selectCallback function(choice) callback tho add the choice to selection
    +     * @param opts select2's opts
    +     * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
    +     */
    +    function defaultTokenizer(input, selection, selectCallback, opts) {
    +        var original = input, // store the original so we can compare and know if we need to tell the search to update its text
    +            dupe = false, // check for whether a token we extracted represents a duplicate selected choice
    +            token, // token
    +            index, // position at which the separator was found
    +            i, l, // looping variables
    +            separator; // the matched separator
    +
    +        if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;
    +
    +        while (true) {
    +            index = -1;
    +
    +            for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
    +                separator = opts.tokenSeparators[i];
    +                index = input.indexOf(separator);
    +                if (index >= 0) break;
    +            }
    +
    +            if (index < 0) break; // did not find any token separator in the input string, bail
    +
    +            token = input.substring(0, index);
    +            input = input.substring(index + separator.length);
    +
    +            if (token.length > 0) {
    +                token = opts.createSearchChoice.call(this, token, selection);
    +                if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
    +                    dupe = false;
    +                    for (i = 0, l = selection.length; i < l; i++) {
    +                        if (equal(opts.id(token), opts.id(selection[i]))) {
    +                            dupe = true; break;
    +                        }
    +                    }
    +
    +                    if (!dupe) selectCallback(token);
    +                }
    +            }
    +        }
    +
    +        if (original!==input) return input;
    +    }
    +
    +    function cleanupJQueryElements() {
    +        var self = this;
    +
    +        $.each(arguments, function (i, element) {
    +            self[element].remove();
    +            self[element] = null;
    +        });
    +    }
    +
    +    /**
    +     * Creates a new class
    +     *
    +     * @param superClass
    +     * @param methods
    +     */
    +    function clazz(SuperClass, methods) {
    +        var constructor = function () {};
    +        constructor.prototype = new SuperClass;
    +        constructor.prototype.constructor = constructor;
    +        constructor.prototype.parent = SuperClass.prototype;
    +        constructor.prototype = $.extend(constructor.prototype, methods);
    +        return constructor;
    +    }
    +
    +    AbstractSelect2 = clazz(Object, {
    +
    +        // abstract
    +        bind: function (func) {
    +            var self = this;
    +            return function () {
    +                func.apply(self, arguments);
    +            };
    +        },
    +
    +        // abstract
    +        init: function (opts) {
    +            var results, search, resultsSelector = ".select2-results";
    +
    +            // prepare options
    +            this.opts = opts = this.prepareOpts(opts);
    +
    +            this.id=opts.id;
    +
    +            // destroy if called on an existing component
    +            if (opts.element.data("select2") !== undefined &&
    +                opts.element.data("select2") !== null) {
    +                opts.element.data("select2").destroy();
    +            }
    +
    +            this.container = this.createContainer();
    +
    +            this.liveRegion = $('.select2-hidden-accessible');
    +            if (this.liveRegion.length == 0) {
    +                this.liveRegion = $("<span>", {
    +                        role: "status",
    +                        "aria-live": "polite"
    +                    })
    +                    .addClass("select2-hidden-accessible")
    +                    .appendTo(document.body);
    +            }
    +
    +            this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
    +            this.containerEventName= this.containerId
    +                .replace(/([.])/g, '_')
    +                .replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
    +            this.container.attr("id", this.containerId);
    +
    +            this.container.attr("title", opts.element.attr("title"));
    +
    +            this.body = $(document.body);
    +
    +            syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
    +
    +            this.container.attr("style", opts.element.attr("style"));
    +            this.container.css(evaluate(opts.containerCss, this.opts.element));
    +            this.container.addClass(evaluate(opts.containerCssClass, this.opts.element));
    +
    +            this.elementTabIndex = this.opts.element.attr("tabindex");
    +
    +            // swap container for the element
    +            this.opts.element
    +                .data("select2", this)
    +                .attr("tabindex", "-1")
    +                .before(this.container)
    +                .on("click.select2", killEvent); // do not leak click events
    +
    +            this.container.data("select2", this);
    +
    +            this.dropdown = this.container.find(".select2-drop");
    +
    +            syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
    +
    +            this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element));
    +            this.dropdown.data("select2", this);
    +            this.dropdown.on("click", killEvent);
    +
    +            this.results = results = this.container.find(resultsSelector);
    +            this.search = search = this.container.find("input.select2-input");
    +
    +            this.queryCount = 0;
    +            this.resultsPage = 0;
    +            this.context = null;
    +
    +            // initialize the container
    +            this.initContainer();
    +
    +            this.container.on("click", killEvent);
    +
    +            installFilteredMouseMove(this.results);
    +
    +            this.dropdown.on("mousemove-filtered", resultsSelector, this.bind(this.highlightUnderEvent));
    +            this.dropdown.on("touchstart touchmove touchend", resultsSelector, this.bind(function (event) {
    +                this._touchEvent = true;
    +                this.highlightUnderEvent(event);
    +            }));
    +            this.dropdown.on("touchmove", resultsSelector, this.bind(this.touchMoved));
    +            this.dropdown.on("touchstart touchend", resultsSelector, this.bind(this.clearTouchMoved));
    +
    +            // Waiting for a click event on touch devices to select option and hide dropdown
    +            // otherwise click will be triggered on an underlying element
    +            this.dropdown.on('click', this.bind(function (event) {
    +                if (this._touchEvent) {
    +                    this._touchEvent = false;
    +                    this.selectHighlighted();
    +                }
    +            }));
    +
    +            installDebouncedScroll(80, this.results);
    +            this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
    +
    +            // do not propagate change event from the search field out of the component
    +            $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
    +            $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});
    +
    +            // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
    +            if ($.fn.mousewheel) {
    +                results.mousewheel(function (e, delta, deltaX, deltaY) {
    +                    var top = results.scrollTop();
    +                    if (deltaY > 0 && top - deltaY <= 0) {
    +                        results.scrollTop(0);
    +                        killEvent(e);
    +                    } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
    +                        results.scrollTop(results.get(0).scrollHeight - results.height());
    +                        killEvent(e);
    +                    }
    +                });
    +            }
    +
    +            installKeyUpChangeEvent(search);
    +            search.on("keyup-change input paste", this.bind(this.updateResults));
    +            search.on("focus", function () { search.addClass("select2-focused"); });
    +            search.on("blur", function () { search.removeClass("select2-focused");});
    +
    +            this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
    +                if ($(e.target).closest(".select2-result-selectable").length > 0) {
    +                    this.highlightUnderEvent(e);
    +                    this.selectHighlighted(e);
    +                }
    +            }));
    +
    +            // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
    +            // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
    +            // dom it will trigger the popup close, which is not what we want
    +            // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal.
    +            this.dropdown.on("click mouseup mousedown touchstart touchend focusin", function (e) { e.stopPropagation(); });
    +
    +            this.nextSearchTerm = undefined;
    +
    +            if ($.isFunction(this.opts.initSelection)) {
    +                // initialize selection based on the current value of the source element
    +                this.initSelection();
    +
    +                // if the user has provided a function that can set selection based on the value of the source element
    +                // we monitor the change event on the element and trigger it, allowing for two way synchronization
    +                this.monitorSource();
    +            }
    +
    +            if (opts.maximumInputLength !== null) {
    +                this.search.attr("maxlength", opts.maximumInputLength);
    +            }
    +
    +            var disabled = opts.element.prop("disabled");
    +            if (disabled === undefined) disabled = false;
    +            this.enable(!disabled);
    +
    +            var readonly = opts.element.prop("readonly");
    +            if (readonly === undefined) readonly = false;
    +            this.readonly(readonly);
    +
    +            // Calculate size of scrollbar
    +            scrollBarDimensions = scrollBarDimensions || measureScrollbar();
    +
    +            this.autofocus = opts.element.prop("autofocus");
    +            opts.element.prop("autofocus", false);
    +            if (this.autofocus) this.focus();
    +
    +            this.search.attr("placeholder", opts.searchInputPlaceholder);
    +        },
    +
    +        // abstract
    +        destroy: function () {
    +            var element=this.opts.element, select2 = element.data("select2"), self = this;
    +
    +            this.close();
    +
    +            if (element.length && element[0].detachEvent && self._sync) {
    +                element.each(function () {
    +                    if (self._sync) {
    +                        this.detachEvent("onpropertychange", self._sync);
    +                    }
    +                });
    +            }
    +            if (this.propertyObserver) {
    +                this.propertyObserver.disconnect();
    +                this.propertyObserver = null;
    +            }
    +            this._sync = null;
    +
    +            if (select2 !== undefined) {
    +                select2.container.remove();
    +                select2.liveRegion.remove();
    +                select2.dropdown.remove();
    +                element
    +                    .show()
    +                    .removeData("select2")
    +                    .off(".select2")
    +                    .prop("autofocus", this.autofocus || false);
    +                if (this.elementTabIndex) {
    +                    element.attr({tabindex: this.elementTabIndex});
    +                } else {
    +                    element.removeAttr("tabindex");
    +                }
    +                element.show();
    +            }
    +
    +            cleanupJQueryElements.call(this,
    +                "container",
    +                "liveRegion",
    +                "dropdown",
    +                "results",
    +                "search"
    +            );
    +        },
    +
    +        // abstract
    +        optionToData: function(element) {
    +            if (element.is("option")) {
    +                return {
    +                    id:element.prop("value"),
    +                    text:element.text(),
    +                    element: element.get(),
    +                    css: element.attr("class"),
    +                    disabled: element.prop("disabled"),
    +                    locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
    +                };
    +            } else if (element.is("optgroup")) {
    +                return {
    +                    text:element.attr("label"),
    +                    children:[],
    +                    element: element.get(),
    +                    css: element.attr("class")
    +                };
    +            }
    +        },
    +
    +        // abstract
    +        prepareOpts: function (opts) {
    +            var element, select, idKey, ajaxUrl, self = this;
    +
    +            element = opts.element;
    +
    +            if (element.get(0).tagName.toLowerCase() === "select") {
    +                this.select = select = opts.element;
    +            }
    +
    +            if (select) {
    +                // these options are not allowed when attached to a select because they are picked up off the element itself
    +                $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
    +                    if (this in opts) {
    +                        throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
    +                    }
    +                });
    +            }
    +
    +            opts = $.extend({}, {
    +                populateResults: function(container, results, query) {
    +                    var populate, id=this.opts.id, liveRegion=this.liveRegion;
    +
    +                    populate=function(results, container, depth) {
    +
    +                        var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
    +
    +                        results = opts.sortResults(results, container, query);
    +
    +                        // collect the created nodes for bulk append
    +                        var nodes = [];
    +                        for (i = 0, l = results.length; i < l; i = i + 1) {
    +
    +                            result=results[i];
    +
    +                            disabled = (result.disabled === true);
    +                            selectable = (!disabled) && (id(result) !== undefined);
    +
    +                            compound=result.children && result.children.length > 0;
    +
    +                            node=$("<li></li>");
    +                            node.addClass("select2-results-dept-"+depth);
    +                            node.addClass("select2-result");
    +                            node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
    +                            if (disabled) { node.addClass("select2-disabled"); }
    +                            if (compound) { node.addClass("select2-result-with-children"); }
    +                            node.addClass(self.opts.formatResultCssClass(result));
    +                            node.attr("role", "presentation");
    +
    +                            label=$(document.createElement("div"));
    +                            label.addClass("select2-result-label");
    +                            label.attr("id", "select2-result-label-" + nextUid());
    +                            label.attr("role", "option");
    +
    +                            formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
    +                            if (formatted!==undefined) {
    +                                label.html(formatted);
    +                                node.append(label);
    +                            }
    +
    +
    +                            if (compound) {
    +
    +                                innerContainer=$("<ul></ul>");
    +                                innerContainer.addClass("select2-result-sub");
    +                                populate(result.children, innerContainer, depth+1);
    +                                node.append(innerContainer);
    +                            }
    +
    +                            node.data("select2-data", result);
    +                            nodes.push(node[0]);
    +                        }
    +
    +                        // bulk append the created nodes
    +                        container.append(nodes);
    +                        liveRegion.text(opts.formatMatches(results.length));
    +                    };
    +
    +                    populate(results, container, 0);
    +                }
    +            }, $.fn.select2.defaults, opts);
    +
    +            if (typeof(opts.id) !== "function") {
    +                idKey = opts.id;
    +                opts.id = function (e) { return e[idKey]; };
    +            }
    +
    +            if ($.isArray(opts.element.data("select2Tags"))) {
    +                if ("tags" in opts) {
    +                    throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
    +                }
    +                opts.tags=opts.element.data("select2Tags");
    +            }
    +
    +            if (select) {
    +                opts.query = this.bind(function (query) {
    +                    var data = { results: [], more: false },
    +                        term = query.term,
    +                        children, placeholderOption, process;
    +
    +                    process=function(element, collection) {
    +                        var group;
    +                        if (element.is("option")) {
    +                            if (query.matcher(term, element.text(), element)) {
    +                                collection.push(self.optionToData(element));
    +                            }
    +                        } else if (element.is("optgroup")) {
    +                            group=self.optionToData(element);
    +                            element.children().each2(function(i, elm) { process(elm, group.children); });
    +                            if (group.children.length>0) {
    +                                collection.push(group);
    +                            }
    +                        }
    +                    };
    +
    +                    children=element.children();
    +
    +                    // ignore the placeholder option if there is one
    +                    if (this.getPlaceholder() !== undefined && children.length > 0) {
    +                        placeholderOption = this.getPlaceholderOption();
    +                        if (placeholderOption) {
    +                            children=children.not(placeholderOption);
    +                        }
    +                    }
    +
    +                    children.each2(function(i, elm) { process(elm, data.results); });
    +
    +                    query.callback(data);
    +                });
    +                // this is needed because inside val() we construct choices from options and their id is hardcoded
    +                opts.id=function(e) { return e.id; };
    +            } else {
    +                if (!("query" in opts)) {
    +
    +                    if ("ajax" in opts) {
    +                        ajaxUrl = opts.element.data("ajax-url");
    +                        if (ajaxUrl && ajaxUrl.length > 0) {
    +                            opts.ajax.url = ajaxUrl;
    +                        }
    +                        opts.query = ajax.call(opts.element, opts.ajax);
    +                    } else if ("data" in opts) {
    +                        opts.query = local(opts.data);
    +                    } else if ("tags" in opts) {
    +                        opts.query = tags(opts.tags);
    +                        if (opts.createSearchChoice === undefined) {
    +                            opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
    +                        }
    +                        if (opts.initSelection === undefined) {
    +                            opts.initSelection = function (element, callback) {
    +                                var data = [];
    +                                $(splitVal(element.val(), opts.separator, opts.transformVal)).each(function () {
    +                                    var obj = { id: this, text: this },
    +                                        tags = opts.tags;
    +                                    if ($.isFunction(tags)) tags=tags();
    +                                    $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });
    +                                    data.push(obj);
    +                                });
    +
    +                                callback(data);
    +                            };
    +                        }
    +                    }
    +                }
    +            }
    +            if (typeof(opts.query) !== "function") {
    +                throw "query function not defined for Select2 " + opts.element.attr("id");
    +            }
    +
    +            if (opts.createSearchChoicePosition === 'top') {
    +                opts.createSearchChoicePosition = function(list, item) { list.unshift(item); };
    +            }
    +            else if (opts.createSearchChoicePosition === 'bottom') {
    +                opts.createSearchChoicePosition = function(list, item) { list.push(item); };
    +            }
    +            else if (typeof(opts.createSearchChoicePosition) !== "function")  {
    +                throw "invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";
    +            }
    +
    +            return opts;
    +        },
    +
    +        /**
    +         * Monitor the original element for changes and update select2 accordingly
    +         */
    +        // abstract
    +        monitorSource: function () {
    +            var el = this.opts.element, observer, self = this;
    +
    +            el.on("change.select2", this.bind(function (e) {
    +                if (this.opts.element.data("select2-change-triggered") !== true) {
    +                    this.initSelection();
    +                }
    +            }));
    +
    +            this._sync = this.bind(function () {
    +
    +                // sync enabled state
    +                var disabled = el.prop("disabled");
    +                if (disabled === undefined) disabled = false;
    +                this.enable(!disabled);
    +
    +                var readonly = el.prop("readonly");
    +                if (readonly === undefined) readonly = false;
    +                this.readonly(readonly);
    +
    +                if (this.container) {
    +                    syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
    +                    this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element));
    +                }
    +
    +                if (this.dropdown) {
    +                    syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
    +                    this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element));
    +                }
    +
    +            });
    +
    +            // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener)
    +            if (el.length && el[0].attachEvent) {
    +                el.each(function() {
    +                    this.attachEvent("onpropertychange", self._sync);
    +                });
    +            }
    +
    +            // safari, chrome, firefox, IE11
    +            observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;
    +            if (observer !== undefined) {
    +                if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
    +                this.propertyObserver = new observer(function (mutations) {
    +                    $.each(mutations, self._sync);
    +                });
    +                this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
    +            }
    +        },
    +
    +        // abstract
    +        triggerSelect: function(data) {
    +            var evt = $.Event("select2-selecting", { val: this.id(data), object: data, choice: data });
    +            this.opts.element.trigger(evt);
    +            return !evt.isDefaultPrevented();
    +        },
    +
    +        /**
    +         * Triggers the change event on the source element
    +         */
    +        // abstract
    +        triggerChange: function (details) {
    +
    +            details = details || {};
    +            details= $.extend({}, details, { type: "change", val: this.val() });
    +            // prevents recursive triggering
    +            this.opts.element.data("select2-change-triggered", true);
    +            this.opts.element.trigger(details);
    +            this.opts.element.data("select2-change-triggered", false);
    +
    +            // some validation frameworks ignore the change event and listen instead to keyup, click for selects
    +            // so here we trigger the click event manually
    +            this.opts.element.click();
    +
    +            // ValidationEngine ignores the change event and listens instead to blur
    +            // so here we trigger the blur event manually if so desired
    +            if (this.opts.blurOnChange)
    +                this.opts.element.blur();
    +        },
    +
    +        //abstract
    +        isInterfaceEnabled: function()
    +        {
    +            return this.enabledInterface === true;
    +        },
    +
    +        // abstract
    +        enableInterface: function() {
    +            var enabled = this._enabled && !this._readonly,
    +                disabled = !enabled;
    +
    +            if (enabled === this.enabledInterface) return false;
    +
    +            this.container.toggleClass("select2-container-disabled", disabled);
    +            this.close();
    +            this.enabledInterface = enabled;
    +
    +            return true;
    +        },
    +
    +        // abstract
    +        enable: function(enabled) {
    +            if (enabled === undefined) enabled = true;
    +            if (this._enabled === enabled) return;
    +            this._enabled = enabled;
    +
    +            this.opts.element.prop("disabled", !enabled);
    +            this.enableInterface();
    +        },
    +
    +        // abstract
    +        disable: function() {
    +            this.enable(false);
    +        },
    +
    +        // abstract
    +        readonly: function(enabled) {
    +            if (enabled === undefined) enabled = false;
    +            if (this._readonly === enabled) return;
    +            this._readonly = enabled;
    +
    +            this.opts.element.prop("readonly", enabled);
    +            this.enableInterface();
    +        },
    +
    +        // abstract
    +        opened: function () {
    +            return (this.container) ? this.container.hasClass("select2-dropdown-open") : false;
    +        },
    +
    +        // abstract
    +        positionDropdown: function() {
    +            var $dropdown = this.dropdown,
    +                container = this.container,
    +                offset = container.offset(),
    +                height = container.outerHeight(false),
    +                width = container.outerWidth(false),
    +                dropHeight = $dropdown.outerHeight(false),
    +                $window = $(window),
    +                windowWidth = $window.width(),
    +                windowHeight = $window.height(),
    +                viewPortRight = $window.scrollLeft() + windowWidth,
    +                viewportBottom = $window.scrollTop() + windowHeight,
    +                dropTop = offset.top + height,
    +                dropLeft = offset.left,
    +                enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
    +                enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(),
    +                dropWidth = $dropdown.outerWidth(false),
    +                enoughRoomOnRight = function() {
    +                    return dropLeft + dropWidth <= viewPortRight;
    +                },
    +                enoughRoomOnLeft = function() {
    +                    return offset.left + viewPortRight + container.outerWidth(false)  > dropWidth;
    +                },
    +                aboveNow = $dropdown.hasClass("select2-drop-above"),
    +                bodyOffset,
    +                above,
    +                changeDirection,
    +                css,
    +                resultsListNode;
    +
    +            // always prefer the current above/below alignment, unless there is not enough room
    +            if (aboveNow) {
    +                above = true;
    +                if (!enoughRoomAbove && enoughRoomBelow) {
    +                    changeDirection = true;
    +                    above = false;
    +                }
    +            } else {
    +                above = false;
    +                if (!enoughRoomBelow && enoughRoomAbove) {
    +                    changeDirection = true;
    +                    above = true;
    +                }
    +            }
    +
    +            //if we are changing direction we need to get positions when dropdown is hidden;
    +            if (changeDirection) {
    +                $dropdown.hide();
    +                offset = this.container.offset();
    +                height = this.container.outerHeight(false);
    +                width = this.container.outerWidth(false);
    +                dropHeight = $dropdown.outerHeight(false);
    +                viewPortRight = $window.scrollLeft() + windowWidth;
    +                viewportBottom = $window.scrollTop() + windowHeight;
    +                dropTop = offset.top + height;
    +                dropLeft = offset.left;
    +                dropWidth = $dropdown.outerWidth(false);
    +                $dropdown.show();
    +
    +                // fix so the cursor does not move to the left within the search-textbox in IE
    +                this.focusSearch();
    +            }
    +
    +            if (this.opts.dropdownAutoWidth) {
    +                resultsListNode = $('.select2-results', $dropdown)[0];
    +                $dropdown.addClass('select2-drop-auto-width');
    +                $dropdown.css('width', '');
    +                // Add scrollbar width to dropdown if vertical scrollbar is present
    +                dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
    +                dropWidth > width ? width = dropWidth : dropWidth = width;
    +                dropHeight = $dropdown.outerHeight(false);
    +            }
    +            else {
    +                this.container.removeClass('select2-drop-auto-width');
    +            }
    +
    +            //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
    +            //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body.scrollTop(), "enough?", enoughRoomAbove);
    +
    +            // fix positioning when body has an offset and is not position: static
    +            if (this.body.css('position') !== 'static') {
    +                bodyOffset = this.body.offset();
    +                dropTop -= bodyOffset.top;
    +                dropLeft -= bodyOffset.left;
    +            }
    +
    +            if (!enoughRoomOnRight() && enoughRoomOnLeft()) {
    +                dropLeft = offset.left + this.container.outerWidth(false) - dropWidth;
    +            }
    +
    +            css =  {
    +                left: dropLeft,
    +                width: width
    +            };
    +
    +            if (above) {
    +                css.top = offset.top - dropHeight;
    +                css.bottom = 'auto';
    +                this.container.addClass("select2-drop-above");
    +                $dropdown.addClass("select2-drop-above");
    +            }
    +            else {
    +                css.top = dropTop;
    +                css.bottom = 'auto';
    +                this.container.removeClass("select2-drop-above");
    +                $dropdown.removeClass("select2-drop-above");
    +            }
    +            css = $.extend(css, evaluate(this.opts.dropdownCss, this.opts.element));
    +
    +            $dropdown.css(css);
    +        },
    +
    +        // abstract
    +        shouldOpen: function() {
    +            var event;
    +
    +            if (this.opened()) return false;
    +
    +            if (this._enabled === false || this._readonly === true) return false;
    +
    +            event = $.Event("select2-opening");
    +            this.opts.element.trigger(event);
    +            return !event.isDefaultPrevented();
    +        },
    +
    +        // abstract
    +        clearDropdownAlignmentPreference: function() {
    +            // clear the classes used to figure out the preference of where the dropdown should be opened
    +            this.container.removeClass("select2-drop-above");
    +            this.dropdown.removeClass("select2-drop-above");
    +        },
    +
    +        /**
    +         * Opens the dropdown
    +         *
    +         * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
    +         * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
    +         */
    +        // abstract
    +        open: function () {
    +
    +            if (!this.shouldOpen()) return false;
    +
    +            this.opening();
    +
    +            // Only bind the document mousemove when the dropdown is visible
    +            $document.on("mousemove.select2Event", function (e) {
    +                lastMousePosition.x = e.pageX;
    +                lastMousePosition.y = e.pageY;
    +            });
    +
    +            return true;
    +        },
    +
    +        /**
    +         * Performs the opening of the dropdown
    +         */
    +        // abstract
    +        opening: function() {
    +            var cid = this.containerEventName,
    +                scroll = "scroll." + cid,
    +                resize = "resize."+cid,
    +                orient = "orientationchange."+cid,
    +                mask;
    +
    +            this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
    +
    +            this.clearDropdownAlignmentPreference();
    +
    +            if(this.dropdown[0] !== this.body.children().last()[0]) {
    +                this.dropdown.detach().appendTo(this.body);
    +            }
    +
    +            // create the dropdown mask if doesn't already exist
    +            mask = $("#select2-drop-mask");
    +            if (mask.length === 0) {
    +                mask = $(document.createElement("div"));
    +                mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
    +                mask.hide();
    +                mask.appendTo(this.body);
    +                mask.on("mousedown touchstart click", function (e) {
    +                    // Prevent IE from generating a click event on the body
    +                    reinsertElement(mask);
    +
    +                    var dropdown = $("#select2-drop"), self;
    +                    if (dropdown.length > 0) {
    +                        self=dropdown.data("select2");
    +                        if (self.opts.selectOnBlur) {
    +                            self.selectHighlighted({noFocus: true});
    +                        }
    +                        self.close();
    +                        e.preventDefault();
    +                        e.stopPropagation();
    +                    }
    +                });
    +            }
    +
    +            // ensure the mask is always right before the dropdown
    +            if (this.dropdown.prev()[0] !== mask[0]) {
    +                this.dropdown.before(mask);
    +            }
    +
    +            // move the global id to the correct dropdown
    +            $("#select2-drop").removeAttr("id");
    +            this.dropdown.attr("id", "select2-drop");
    +
    +            // show the elements
    +            mask.show();
    +
    +            this.positionDropdown();
    +            this.dropdown.show();
    +            this.positionDropdown();
    +
    +            this.dropdown.addClass("select2-drop-active");
    +
    +            // attach listeners to events that can change the position of the container and thus require
    +            // the position of the dropdown to be updated as well so it does not come unglued from the container
    +            var that = this;
    +            this.container.parents().add(window).each(function () {
    +                $(this).on(resize+" "+scroll+" "+orient, function (e) {
    +                    if (that.opened()) that.positionDropdown();
    +                });
    +            });
    +
    +
    +        },
    +
    +        // abstract
    +        close: function () {
    +            if (!this.opened()) return;
    +
    +            var cid = this.containerEventName,
    +                scroll = "scroll." + cid,
    +                resize = "resize."+cid,
    +                orient = "orientationchange."+cid;
    +
    +            // unbind event listeners
    +            this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });
    +
    +            this.clearDropdownAlignmentPreference();
    +
    +            $("#select2-drop-mask").hide();
    +            this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
    +            this.dropdown.hide();
    +            this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active");
    +            this.results.empty();
    +
    +            // Now that the dropdown is closed, unbind the global document mousemove event
    +            $document.off("mousemove.select2Event");
    +
    +            this.clearSearch();
    +            this.search.removeClass("select2-active");
    +            this.opts.element.trigger($.Event("select2-close"));
    +        },
    +
    +        /**
    +         * Opens control, sets input value, and updates results.
    +         */
    +        // abstract
    +        externalSearch: function (term) {
    +            this.open();
    +            this.search.val(term);
    +            this.updateResults(false);
    +        },
    +
    +        // abstract
    +        clearSearch: function () {
    +
    +        },
    +
    +        //abstract
    +        getMaximumSelectionSize: function() {
    +            return evaluate(this.opts.maximumSelectionSize, this.opts.element);
    +        },
    +
    +        // abstract
    +        ensureHighlightVisible: function () {
    +            var results = this.results, children, index, child, hb, rb, y, more, topOffset;
    +
    +            index = this.highlight();
    +
    +            if (index < 0) return;
    +
    +            if (index == 0) {
    +
    +                // if the first element is highlighted scroll all the way to the top,
    +                // that way any unselectable headers above it will also be scrolled
    +                // into view
    +
    +                results.scrollTop(0);
    +                return;
    +            }
    +
    +            children = this.findHighlightableChoices().find('.select2-result-label');
    +
    +            child = $(children[index]);
    +
    +            topOffset = (child.offset() || {}).top || 0;
    +
    +            hb = topOffset + child.outerHeight(true);
    +
    +            // if this is the last child lets also make sure select2-more-results is visible
    +            if (index === children.length - 1) {
    +                more = results.find("li.select2-more-results");
    +                if (more.length > 0) {
    +                    hb = more.offset().top + more.outerHeight(true);
    +                }
    +            }
    +
    +            rb = results.offset().top + results.outerHeight(false);
    +            if (hb > rb) {
    +                results.scrollTop(results.scrollTop() + (hb - rb));
    +            }
    +            y = topOffset - results.offset().top;
    +
    +            // make sure the top of the element is visible
    +            if (y < 0 && child.css('display') != 'none' ) {
    +                results.scrollTop(results.scrollTop() + y); // y is negative
    +            }
    +        },
    +
    +        // abstract
    +        findHighlightableChoices: function() {
    +            return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)");
    +        },
    +
    +        // abstract
    +        moveHighlight: function (delta) {
    +            var choices = this.findHighlightableChoices(),
    +                index = this.highlight();
    +
    +            while (index > -1 && index < choices.length) {
    +                index += delta;
    +                var choice = $(choices[index]);
    +                if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
    +                    this.highlight(index);
    +                    break;
    +                }
    +            }
    +        },
    +
    +        // abstract
    +        highlight: function (index) {
    +            var choices = this.findHighlightableChoices(),
    +                choice,
    +                data;
    +
    +            if (arguments.length === 0) {
    +                return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
    +            }
    +
    +            if (index >= choices.length) index = choices.length - 1;
    +            if (index < 0) index = 0;
    +
    +            this.removeHighlight();
    +
    +            choice = $(choices[index]);
    +            choice.addClass("select2-highlighted");
    +
    +            // ensure assistive technology can determine the active choice
    +            this.search.attr("aria-activedescendant", choice.find(".select2-result-label").attr("id"));
    +
    +            this.ensureHighlightVisible();
    +
    +            this.liveRegion.text(choice.text());
    +
    +            data = choice.data("select2-data");
    +            if (data) {
    +                this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
    +            }
    +        },
    +
    +        removeHighlight: function() {
    +            this.results.find(".select2-highlighted").removeClass("select2-highlighted");
    +        },
    +
    +        touchMoved: function() {
    +            this._touchMoved = true;
    +        },
    +
    +        clearTouchMoved: function() {
    +          this._touchMoved = false;
    +        },
    +
    +        // abstract
    +        countSelectableResults: function() {
    +            return this.findHighlightableChoices().length;
    +        },
    +
    +        // abstract
    +        highlightUnderEvent: function (event) {
    +            var el = $(event.target).closest(".select2-result-selectable");
    +            if (el.length > 0 && !el.is(".select2-highlighted")) {
    +                var choices = this.findHighlightableChoices();
    +                this.highlight(choices.index(el));
    +            } else if (el.length == 0) {
    +                // if we are over an unselectable item remove all highlights
    +                this.removeHighlight();
    +            }
    +        },
    +
    +        // abstract
    +        loadMoreIfNeeded: function () {
    +            var results = this.results,
    +                more = results.find("li.select2-more-results"),
    +                below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
    +                page = this.resultsPage + 1,
    +                self=this,
    +                term=this.search.val(),
    +                context=this.context;
    +
    +            if (more.length === 0) return;
    +            below = more.offset().top - results.offset().top - results.height();
    +
    +            if (below <= this.opts.loadMorePadding) {
    +                more.addClass("select2-active");
    +                this.opts.query({
    +                        element: this.opts.element,
    +                        term: term,
    +                        page: page,
    +                        context: context,
    +                        matcher: this.opts.matcher,
    +                        callback: this.bind(function (data) {
    +
    +                    // ignore a response if the select2 has been closed before it was received
    +                    if (!self.opened()) return;
    +
    +
    +                    self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
    +                    self.postprocessResults(data, false, false);
    +
    +                    if (data.more===true) {
    +                        more.detach().appendTo(results).html(self.opts.escapeMarkup(evaluate(self.opts.formatLoadMore, self.opts.element, page+1)));
    +                        window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
    +                    } else {
    +                        more.remove();
    +                    }
    +                    self.positionDropdown();
    +                    self.resultsPage = page;
    +                    self.context = data.context;
    +                    this.opts.element.trigger({ type: "select2-loaded", items: data });
    +                })});
    +            }
    +        },
    +
    +        /**
    +         * Default tokenizer function which does nothing
    +         */
    +        tokenize: function() {
    +
    +        },
    +
    +        /**
    +         * @param initial whether or not this is the call to this method right after the dropdown has been opened
    +         */
    +        // abstract
    +        updateResults: function (initial) {
    +            var search = this.search,
    +                results = this.results,
    +                opts = this.opts,
    +                data,
    +                self = this,
    +                input,
    +                term = search.val(),
    +                lastTerm = $.data(this.container, "select2-last-term"),
    +                // sequence number used to drop out-of-order responses
    +                queryNumber;
    +
    +            // prevent duplicate queries against the same term
    +            if (initial !== true && lastTerm && equal(term, lastTerm)) return;
    +
    +            $.data(this.container, "select2-last-term", term);
    +
    +            // if the search is currently hidden we do not alter the results
    +            if (initial !== true && (this.showSearchInput === false || !this.opened())) {
    +                return;
    +            }
    +
    +            function postRender() {
    +                search.removeClass("select2-active");
    +                self.positionDropdown();
    +                if (results.find('.select2-no-results,.select2-selection-limit,.select2-searching').length) {
    +                    self.liveRegion.text(results.text());
    +                }
    +                else {
    +                    self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable:not(".select2-selected")').length));
    +                }
    +            }
    +
    +            function render(html) {
    +                results.html(html);
    +                postRender();
    +            }
    +
    +            queryNumber = ++this.queryCount;
    +
    +            var maxSelSize = this.getMaximumSelectionSize();
    +            if (maxSelSize >=1) {
    +                data = this.data();
    +                if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
    +                    render("<li class='select2-selection-limit'>" + evaluate(opts.formatSelectionTooBig, opts.element, maxSelSize) + "</li>");
    +                    return;
    +                }
    +            }
    +
    +            if (search.val().length < opts.minimumInputLength) {
    +                if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
    +                    render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooShort, opts.element, search.val(), opts.minimumInputLength) + "</li>");
    +                } else {
    +                    render("");
    +                }
    +                if (initial && this.showSearch) this.showSearch(true);
    +                return;
    +            }
    +
    +            if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
    +                if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
    +                    render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooLong, opts.element, search.val(), opts.maximumInputLength) + "</li>");
    +                } else {
    +                    render("");
    +                }
    +                return;
    +            }
    +
    +            if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
    +                render("<li class='select2-searching'>" + evaluate(opts.formatSearching, opts.element) + "</li>");
    +            }
    +
    +            search.addClass("select2-active");
    +
    +            this.removeHighlight();
    +
    +            // give the tokenizer a chance to pre-process the input
    +            input = this.tokenize();
    +            if (input != undefined && input != null) {
    +                search.val(input);
    +            }
    +
    +            this.resultsPage = 1;
    +
    +            opts.query({
    +                element: opts.element,
    +                    term: search.val(),
    +                    page: this.resultsPage,
    +                    context: null,
    +                    matcher: opts.matcher,
    +                    callback: this.bind(function (data) {
    +                var def; // default choice
    +
    +                // ignore old responses
    +                if (queryNumber != this.queryCount) {
    +                  return;
    +                }
    +
    +                // ignore a response if the select2 has been closed before it was received
    +                if (!this.opened()) {
    +                    this.search.removeClass("select2-active");
    +                    return;
    +                }
    +
    +                // handle ajax error
    +                if(data.hasError !== undefined && checkFormatter(opts.formatAjaxError, "formatAjaxError")) {
    +                    render("<li class='select2-ajax-error'>" + evaluate(opts.formatAjaxError, opts.element, data.jqXHR, data.textStatus, data.errorThrown) + "</li>");
    +                    return;
    +                }
    +
    +                // save context, if any
    +                this.context = (data.context===undefined) ? null : data.context;
    +                // create a default choice and prepend it to the list
    +                if (this.opts.createSearchChoice && search.val() !== "") {
    +                    def = this.opts.createSearchChoice.call(self, search.val(), data.results);
    +                    if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
    +                        if ($(data.results).filter(
    +                            function () {
    +                                return equal(self.id(this), self.id(def));
    +                            }).length === 0) {
    +                            this.opts.createSearchChoicePosition(data.results, def);
    +                        }
    +                    }
    +                }
    +
    +                if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
    +                    render("<li class='select2-no-results'>" + evaluate(opts.formatNoMatches, opts.element, search.val()) + "</li>");
    +                    return;
    +                }
    +
    +                results.empty();
    +                self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});
    +
    +                if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
    +                    results.append("<li class='select2-more-results'>" + opts.escapeMarkup(evaluate(opts.formatLoadMore, opts.element, this.resultsPage)) + "</li>");
    +                    window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
    +                }
    +
    +                this.postprocessResults(data, initial);
    +
    +                postRender();
    +
    +                this.opts.element.trigger({ type: "select2-loaded", items: data });
    +            })});
    +        },
    +
    +        // abstract
    +        cancel: function () {
    +            this.close();
    +        },
    +
    +        // abstract
    +        blur: function () {
    +            // if selectOnBlur == true, select the currently highlighted option
    +            if (this.opts.selectOnBlur)
    +                this.selectHighlighted({noFocus: true});
    +
    +            this.close();
    +            this.container.removeClass("select2-container-active");
    +            // synonymous to .is(':focus'), which is available in jquery >= 1.6
    +            if (this.search[0] === document.activeElement) { this.search.blur(); }
    +            this.clearSearch();
    +            this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
    +        },
    +
    +        // abstract
    +        focusSearch: function () {
    +            focus(this.search);
    +        },
    +
    +        // abstract
    +        selectHighlighted: function (options) {
    +            if (this._touchMoved) {
    +              this.clearTouchMoved();
    +              return;
    +            }
    +            var index=this.highlight(),
    +                highlighted=this.results.find(".select2-highlighted"),
    +                data = highlighted.closest('.select2-result').data("select2-data");
    +
    +            if (data) {
    +                this.highlight(index);
    +                this.onSelect(data, options);
    +            } else if (options && options.noFocus) {
    +                this.close();
    +            }
    +        },
    +
    +        // abstract
    +        getPlaceholder: function () {
    +            var placeholderOption;
    +            return this.opts.element.attr("placeholder") ||
    +                this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
    +                this.opts.element.data("placeholder") ||
    +                this.opts.placeholder ||
    +                ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
    +        },
    +
    +        // abstract
    +        getPlaceholderOption: function() {
    +            if (this.select) {
    +                var firstOption = this.select.children('option').first();
    +                if (this.opts.placeholderOption !== undefined ) {
    +                    //Determine the placeholder option based on the specified placeholderOption setting
    +                    return (this.opts.placeholderOption === "first" && firstOption) ||
    +                           (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
    +                } else if ($.trim(firstOption.text()) === "" && firstOption.val() === "") {
    +                    //No explicit placeholder option specified, use the first if it's blank
    +                    return firstOption;
    +                }
    +            }
    +        },
    +
    +        /**
    +         * Get the desired width for the container element.  This is
    +         * derived first from option `width` passed to select2, then
    +         * the inline 'style' on the original element, and finally
    +         * falls back to the jQuery calculated element width.
    +         */
    +        // abstract
    +        initContainerWidth: function () {
    +            function resolveContainerWidth() {
    +                var style, attrs, matches, i, l, attr;
    +
    +                if (this.opts.width === "off") {
    +                    return null;
    +                } else if (this.opts.width === "element"){
    +                    return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
    +                } else if (this.opts.width === "copy" || this.opts.width === "resolve") {
    +                    // check if there is inline style on the element that contains width
    +                    style = this.opts.element.attr('style');
    +                    if (style !== undefined) {
    +                        attrs = style.split(';');
    +                        for (i = 0, l = attrs.length; i < l; i = i + 1) {
    +                            attr = attrs[i].replace(/\s/g, '');
    +                            matches = attr.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
    +                            if (matches !== null && matches.length >= 1)
    +                                return matches[1];
    +                        }
    +                    }
    +
    +                    if (this.opts.width === "resolve") {
    +                        // next check if css('width') can resolve a width that is percent based, this is sometimes possible
    +                        // when attached to input type=hidden or elements hidden via css
    +                        style = this.opts.element.css('width');
    +                        if (style.indexOf("%") > 0) return style;
    +
    +                        // finally, fallback on the calculated width of the element
    +                        return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
    +                    }
    +
    +                    return null;
    +                } else if ($.isFunction(this.opts.width)) {
    +                    return this.opts.width();
    +                } else {
    +                    return this.opts.width;
    +               }
    +            };
    +
    +            var width = resolveContainerWidth.call(this);
    +            if (width !== null) {
    +                this.container.css("width", width);
    +            }
    +        }
    +    });
    +
    +    SingleSelect2 = clazz(AbstractSelect2, {
    +
    +        // single
    +
    +        createContainer: function () {
    +            var container = $(document.createElement("div")).attr({
    +                "class": "select2-container"
    +            }).html([
    +                "<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>",
    +                "   <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>",
    +                "   <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>",
    +                "</a>",
    +                "<label for='' class='select2-offscreen'></label>",
    +                "<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />",
    +                "<div class='select2-drop select2-display-none'>",
    +                "   <div class='select2-search'>",
    +                "       <label for='' class='select2-offscreen'></label>",
    +                "       <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'",
    +                "       aria-autocomplete='list' />",
    +                "   </div>",
    +                "   <ul class='select2-results' role='listbox'>",
    +                "   </ul>",
    +                "</div>"].join(""));
    +            return container;
    +        },
    +
    +        // single
    +        enableInterface: function() {
    +            if (this.parent.enableInterface.apply(this, arguments)) {
    +                this.focusser.prop("disabled", !this.isInterfaceEnabled());
    +            }
    +        },
    +
    +        // single
    +        opening: function () {
    +            var el, range, len;
    +
    +            if (this.opts.minimumResultsForSearch >= 0) {
    +                this.showSearch(true);
    +            }
    +
    +            this.parent.opening.apply(this, arguments);
    +
    +            if (this.showSearchInput !== false) {
    +                // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
    +                // all other browsers handle this just fine
    +
    +                this.search.val(this.focusser.val());
    +            }
    +            if (this.opts.shouldFocusInput(this)) {
    +                this.search.focus();
    +                // move the cursor to the end after focussing, otherwise it will be at the beginning and
    +                // new text will appear *before* focusser.val()
    +                el = this.search.get(0);
    +                if (el.createTextRange) {
    +                    range = el.createTextRange();
    +                    range.collapse(false);
    +                    range.select();
    +                } else if (el.setSelectionRange) {
    +                    len = this.search.val().length;
    +                    el.setSelectionRange(len, len);
    +                }
    +            }
    +
    +            // initializes search's value with nextSearchTerm (if defined by user)
    +            // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
    +            if(this.search.val() === "") {
    +                if(this.nextSearchTerm != undefined){
    +                    this.search.val(this.nextSearchTerm);
    +                    this.search.select();
    +                }
    +            }
    +
    +            this.focusser.prop("disabled", true).val("");
    +            this.updateResults(true);
    +            this.opts.element.trigger($.Event("select2-open"));
    +        },
    +
    +        // single
    +        close: function () {
    +            if (!this.opened()) return;
    +            this.parent.close.apply(this, arguments);
    +
    +            this.focusser.prop("disabled", false);
    +
    +            if (this.opts.shouldFocusInput(this)) {
    +                this.focusser.focus();
    +            }
    +        },
    +
    +        // single
    +        focus: function () {
    +            if (this.opened()) {
    +                this.close();
    +            } else {
    +                this.focusser.prop("disabled", false);
    +                if (this.opts.shouldFocusInput(this)) {
    +                    this.focusser.focus();
    +                }
    +            }
    +        },
    +
    +        // single
    +        isFocused: function () {
    +            return this.container.hasClass("select2-container-active");
    +        },
    +
    +        // single
    +        cancel: function () {
    +            this.parent.cancel.apply(this, arguments);
    +            this.focusser.prop("disabled", false);
    +
    +            if (this.opts.shouldFocusInput(this)) {
    +                this.focusser.focus();
    +            }
    +        },
    +
    +        // single
    +        destroy: function() {
    +            $("label[for='" + this.focusser.attr('id') + "']")
    +                .attr('for', this.opts.element.attr("id"));
    +            this.parent.destroy.apply(this, arguments);
    +
    +            cleanupJQueryElements.call(this,
    +                "selection",
    +                "focusser"
    +            );
    +        },
    +
    +        // single
    +        initContainer: function () {
    +
    +            var selection,
    +                container = this.container,
    +                dropdown = this.dropdown,
    +                idSuffix = nextUid(),
    +                elementLabel;
    +
    +            if (this.opts.minimumResultsForSearch < 0) {
    +                this.showSearch(false);
    +            } else {
    +                this.showSearch(true);
    +            }
    +
    +            this.selection = selection = container.find(".select2-choice");
    +
    +            this.focusser = container.find(".select2-focusser");
    +
    +            // add aria associations
    +            selection.find(".select2-chosen").attr("id", "select2-chosen-"+idSuffix);
    +            this.focusser.attr("aria-labelledby", "select2-chosen-"+idSuffix);
    +            this.results.attr("id", "select2-results-"+idSuffix);
    +            this.search.attr("aria-owns", "select2-results-"+idSuffix);
    +
    +            // rewrite labels from original element to focusser
    +            this.focusser.attr("id", "s2id_autogen"+idSuffix);
    +
    +            elementLabel = $("label[for='" + this.opts.element.attr("id") + "']");
    +            this.opts.element.focus(this.bind(function () { this.focus(); }));
    +
    +            this.focusser.prev()
    +                .text(elementLabel.text())
    +                .attr('for', this.focusser.attr('id'));
    +
    +            // Ensure the original element retains an accessible name
    +            var originalTitle = this.opts.element.attr("title");
    +            this.opts.element.attr("title", (originalTitle || elementLabel.text()));
    +
    +            this.focusser.attr("tabindex", this.elementTabIndex);
    +
    +            // write label for search field using the label from the focusser element
    +            this.search.attr("id", this.focusser.attr('id') + '_search');
    +
    +            this.search.prev()
    +                .text($("label[for='" + this.focusser.attr('id') + "']").text())
    +                .attr('for', this.search.attr('id'));
    +
    +            this.search.on("keydown", this.bind(function (e) {
    +                if (!this.isInterfaceEnabled()) return;
    +
    +                // filter 229 keyCodes (input method editor is processing key input)
    +                if (229 == e.keyCode) return;
    +
    +                if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
    +                    // prevent the page from scrolling
    +                    killEvent(e);
    +                    return;
    +                }
    +
    +                switch (e.which) {
    +                    case KEY.UP:
    +                    case KEY.DOWN:
    +                        this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
    +                        killEvent(e);
    +                        return;
    +                    case KEY.ENTER:
    +                        this.selectHighlighted();
    +                        killEvent(e);
    +                        return;
    +                    case KEY.TAB:
    +                        this.selectHighlighted({noFocus: true});
    +                        return;
    +                    case KEY.ESC:
    +                        this.cancel(e);
    +                        killEvent(e);
    +                        return;
    +                }
    +            }));
    +
    +            this.search.on("blur", this.bind(function(e) {
    +                // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
    +                // without this the search field loses focus which is annoying
    +                if (document.activeElement === this.body.get(0)) {
    +                    window.setTimeout(this.bind(function() {
    +                        if (this.opened()) {
    +                            this.search.focus();
    +                        }
    +                    }), 0);
    +                }
    +            }));
    +
    +            this.focusser.on("keydown", this.bind(function (e) {
    +                if (!this.isInterfaceEnabled()) return;
    +
    +                if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
    +                    return;
    +                }
    +
    +                if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
    +                    killEvent(e);
    +                    return;
    +                }
    +
    +                if (e.which == KEY.DOWN || e.which == KEY.UP
    +                    || (e.which == KEY.ENTER && this.opts.openOnEnter)) {
    +
    +                    if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;
    +
    +                    this.open();
    +                    killEvent(e);
    +                    return;
    +                }
    +
    +                if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
    +                    if (this.opts.allowClear) {
    +                        this.clear();
    +                    }
    +                    killEvent(e);
    +                    return;
    +                }
    +            }));
    +
    +
    +            installKeyUpChangeEvent(this.focusser);
    +            this.focusser.on("keyup-change input", this.bind(function(e) {
    +                if (this.opts.minimumResultsForSearch >= 0) {
    +                    e.stopPropagation();
    +                    if (this.opened()) return;
    +                    this.open();
    +                }
    +            }));
    +
    +            selection.on("mousedown touchstart", "abbr", this.bind(function (e) {
    +                if (!this.isInterfaceEnabled()) {
    +                    return;
    +                }
    +
    +                this.clear();
    +                killEventImmediately(e);
    +                this.close();
    +
    +                if (this.selection) {
    +                    this.selection.focus();
    +                }
    +            }));
    +
    +            selection.on("mousedown touchstart", this.bind(function (e) {
    +                // Prevent IE from generating a click event on the body
    +                reinsertElement(selection);
    +
    +                if (!this.container.hasClass("select2-container-active")) {
    +                    this.opts.element.trigger($.Event("select2-focus"));
    +                }
    +
    +                if (this.opened()) {
    +                    this.close();
    +                } else if (this.isInterfaceEnabled()) {
    +                    this.open();
    +                }
    +
    +                killEvent(e);
    +            }));
    +
    +            dropdown.on("mousedown touchstart", this.bind(function() {
    +                if (this.opts.shouldFocusInput(this)) {
    +                    this.search.focus();
    +                }
    +            }));
    +
    +            selection.on("focus", this.bind(function(e) {
    +                killEvent(e);
    +            }));
    +
    +            this.focusser.on("focus", this.bind(function(){
    +                if (!this.container.hasClass("select2-container-active")) {
    +                    this.opts.element.trigger($.Event("select2-focus"));
    +                }
    +                this.container.addClass("select2-container-active");
    +            })).on("blur", this.bind(function() {
    +                if (!this.opened()) {
    +                    this.container.removeClass("select2-container-active");
    +                    this.opts.element.trigger($.Event("select2-blur"));
    +                }
    +            }));
    +            this.search.on("focus", this.bind(function(){
    +                if (!this.container.hasClass("select2-container-active")) {
    +                    this.opts.element.trigger($.Event("select2-focus"));
    +                }
    +                this.container.addClass("select2-container-active");
    +            }));
    +
    +            this.initContainerWidth();
    +            this.opts.element.hide();
    +            this.setPlaceholder();
    +
    +        },
    +
    +        // single
    +        clear: function(triggerChange) {
    +            var data=this.selection.data("select2-data");
    +            if (data) { // guard against queued quick consecutive clicks
    +                var evt = $.Event("select2-clearing");
    +                this.opts.element.trigger(evt);
    +                if (evt.isDefaultPrevented()) {
    +                    return;
    +                }
    +                var placeholderOption = this.getPlaceholderOption();
    +                this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
    +                this.selection.find(".select2-chosen").empty();
    +                this.selection.removeData("select2-data");
    +                this.setPlaceholder();
    +
    +                if (triggerChange !== false){
    +                    this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
    +                    this.triggerChange({removed:data});
    +                }
    +            }
    +        },
    +
    +        /**
    +         * Sets selection based on source element's value
    +         */
    +        // single
    +        initSelection: function () {
    +            var selected;
    +            if (this.isPlaceholderOptionSelected()) {
    +                this.updateSelection(null);
    +                this.close();
    +                this.setPlaceholder();
    +            } else {
    +                var self = this;
    +                this.opts.initSelection.call(null, this.opts.element, function(selected){
    +                    if (selected !== undefined && selected !== null) {
    +                        self.updateSelection(selected);
    +                        self.close();
    +                        self.setPlaceholder();
    +                        self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val());
    +                    }
    +                });
    +            }
    +        },
    +
    +        isPlaceholderOptionSelected: function() {
    +            var placeholderOption;
    +            if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered
    +            return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop("selected"))
    +                || (this.opts.element.val() === "")
    +                || (this.opts.element.val() === undefined)
    +                || (this.opts.element.val() === null);
    +        },
    +
    +        // single
    +        prepareOpts: function () {
    +            var opts = this.parent.prepareOpts.apply(this, arguments),
    +                self=this;
    +
    +            if (opts.element.get(0).tagName.toLowerCase() === "select") {
    +                // install the selection initializer
    +                opts.initSelection = function (element, callback) {
    +                    var selected = element.find("option").filter(function() { return this.selected && !this.disabled });
    +                    // a single select box always has a value, no need to null check 'selected'
    +                    callback(self.optionToData(selected));
    +                };
    +            } else if ("data" in opts) {
    +                // install default initSelection when applied to hidden input and data is local
    +                opts.initSelection = opts.initSelection || function (element, callback) {
    +                    var id = element.val();
    +                    //search in data by id, storing the actual matching item
    +                    var match = null;
    +                    opts.query({
    +                        matcher: function(term, text, el){
    +                            var is_match = equal(id, opts.id(el));
    +                            if (is_match) {
    +                                match = el;
    +                            }
    +                            return is_match;
    +                        },
    +                        callback: !$.isFunction(callback) ? $.noop : function() {
    +                            callback(match);
    +                        }
    +                    });
    +                };
    +            }
    +
    +            return opts;
    +        },
    +
    +        // single
    +        getPlaceholder: function() {
    +            // if a placeholder is specified on a single select without a valid placeholder option ignore it
    +            if (this.select) {
    +                if (this.getPlaceholderOption() === undefined) {
    +                    return undefined;
    +                }
    +            }
    +
    +            return this.parent.getPlaceholder.apply(this, arguments);
    +        },
    +
    +        // single
    +        setPlaceholder: function () {
    +            var placeholder = this.getPlaceholder();
    +
    +            if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {
    +
    +                // check for a placeholder option if attached to a select
    +                if (this.select && this.getPlaceholderOption() === undefined) return;
    +
    +                this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));
    +
    +                this.selection.addClass("select2-default");
    +
    +                this.container.removeClass("select2-allowclear");
    +            }
    +        },
    +
    +        // single
    +        postprocessResults: function (data, initial, noHighlightUpdate) {
    +            var selected = 0, self = this, showSearchInput = true;
    +
    +            // find the selected element in the result list
    +
    +            this.findHighlightableChoices().each2(function (i, elm) {
    +                if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
    +                    selected = i;
    +                    return false;
    +                }
    +            });
    +
    +            // and highlight it
    +            if (noHighlightUpdate !== false) {
    +                if (initial === true && selected >= 0) {
    +                    this.highlight(selected);
    +                } else {
    +                    this.highlight(0);
    +                }
    +            }
    +
    +            // hide the search box if this is the first we got the results and there are enough of them for search
    +
    +            if (initial === true) {
    +                var min = this.opts.minimumResultsForSearch;
    +                if (min >= 0) {
    +                    this.showSearch(countResults(data.results) >= min);
    +                }
    +            }
    +        },
    +
    +        // single
    +        showSearch: function(showSearchInput) {
    +            if (this.showSearchInput === showSearchInput) return;
    +
    +            this.showSearchInput = showSearchInput;
    +
    +            this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
    +            this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
    +            //add "select2-with-searchbox" to the container if search box is shown
    +            $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
    +        },
    +
    +        // single
    +        onSelect: function (data, options) {
    +
    +            if (!this.triggerSelect(data)) { return; }
    +
    +            var old = this.opts.element.val(),
    +                oldData = this.data();
    +
    +            this.opts.element.val(this.id(data));
    +            this.updateSelection(data);
    +
    +            this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });
    +
    +            this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
    +            this.close();
    +
    +            if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {
    +                this.focusser.focus();
    +            }
    +
    +            if (!equal(old, this.id(data))) {
    +                this.triggerChange({ added: data, removed: oldData });
    +            }
    +        },
    +
    +        // single
    +        updateSelection: function (data) {
    +
    +            var container=this.selection.find(".select2-chosen"), formatted, cssClass;
    +
    +            this.selection.data("select2-data", data);
    +
    +            container.empty();
    +            if (data !== null) {
    +                formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
    +            }
    +            if (formatted !== undefined) {
    +                container.append(formatted);
    +            }
    +            cssClass=this.opts.formatSelectionCssClass(data, container);
    +            if (cssClass !== undefined) {
    +                container.addClass(cssClass);
    +            }
    +
    +            this.selection.removeClass("select2-default");
    +
    +            if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
    +                this.container.addClass("select2-allowclear");
    +            }
    +        },
    +
    +        // single
    +        val: function () {
    +            var val,
    +                triggerChange = false,
    +                data = null,
    +                self = this,
    +                oldData = this.data();
    +
    +            if (arguments.length === 0) {
    +                return this.opts.element.val();
    +            }
    +
    +            val = arguments[0];
    +
    +            if (arguments.length > 1) {
    +                triggerChange = arguments[1];
    +            }
    +
    +            if (this.select) {
    +                this.select
    +                    .val(val)
    +                    .find("option").filter(function() { return this.selected }).each2(function (i, elm) {
    +                        data = self.optionToData(elm);
    +                        return false;
    +                    });
    +                this.updateSelection(data);
    +                this.setPlaceholder();
    +                if (triggerChange) {
    +                    this.triggerChange({added: data, removed:oldData});
    +                }
    +            } else {
    +                // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
    +                if (!val && val !== 0) {
    +                    this.clear(triggerChange);
    +                    return;
    +                }
    +                if (this.opts.initSelection === undefined) {
    +                    throw new Error("cannot call val() if initSelection() is not defined");
    +                }
    +                this.opts.element.val(val);
    +                this.opts.initSelection(this.opts.element, function(data){
    +                    self.opts.element.val(!data ? "" : self.id(data));
    +                    self.updateSelection(data);
    +                    self.setPlaceholder();
    +                    if (triggerChange) {
    +                        self.triggerChange({added: data, removed:oldData});
    +                    }
    +                });
    +            }
    +        },
    +
    +        // single
    +        clearSearch: function () {
    +            this.search.val("");
    +            this.focusser.val("");
    +        },
    +
    +        // single
    +        data: function(value) {
    +            var data,
    +                triggerChange = false;
    +
    +            if (arguments.length === 0) {
    +                data = this.selection.data("select2-data");
    +                if (data == undefined) data = null;
    +                return data;
    +            } else {
    +                if (arguments.length > 1) {
    +                    triggerChange = arguments[1];
    +                }
    +                if (!value) {
    +                    this.clear(triggerChange);
    +                } else {
    +                    data = this.data();
    +                    this.opts.element.val(!value ? "" : this.id(value));
    +                    this.updateSelection(value);
    +                    if (triggerChange) {
    +                        this.triggerChange({added: value, removed:data});
    +                    }
    +                }
    +            }
    +        }
    +    });
    +
    +    MultiSelect2 = clazz(AbstractSelect2, {
    +
    +        // multi
    +        createContainer: function () {
    +            var container = $(document.createElement("div")).attr({
    +                "class": "select2-container select2-container-multi"
    +            }).html([
    +                "<ul class='select2-choices'>",
    +                "  <li class='select2-search-field'>",
    +                "    <label for='' class='select2-offscreen'></label>",
    +                "    <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>",
    +                "  </li>",
    +                "</ul>",
    +                "<div class='select2-drop select2-drop-multi select2-display-none'>",
    +                "   <ul class='select2-results'>",
    +                "   </ul>",
    +                "</div>"].join(""));
    +            return container;
    +        },
    +
    +        // multi
    +        prepareOpts: function () {
    +            var opts = this.parent.prepareOpts.apply(this, arguments),
    +                self=this;
    +
    +            // TODO validate placeholder is a string if specified
    +            if (opts.element.get(0).tagName.toLowerCase() === "select") {
    +                // install the selection initializer
    +                opts.initSelection = function (element, callback) {
    +
    +                    var data = [];
    +
    +                    element.find("option").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {
    +                        data.push(self.optionToData(elm));
    +                    });
    +                    callback(data);
    +                };
    +            } else if ("data" in opts) {
    +                // install default initSelection when applied to hidden input and data is local
    +                opts.initSelection = opts.initSelection || function (element, callback) {
    +                    var ids = splitVal(element.val(), opts.separator, opts.transformVal);
    +                    //search in data by array of ids, storing matching items in a list
    +                    var matches = [];
    +                    opts.query({
    +                        matcher: function(term, text, el){
    +                            var is_match = $.grep(ids, function(id) {
    +                                return equal(id, opts.id(el));
    +                            }).length;
    +                            if (is_match) {
    +                                matches.push(el);
    +                            }
    +                            return is_match;
    +                        },
    +                        callback: !$.isFunction(callback) ? $.noop : function() {
    +                            // reorder matches based on the order they appear in the ids array because right now
    +                            // they are in the order in which they appear in data array
    +                            var ordered = [];
    +                            for (var i = 0; i < ids.length; i++) {
    +                                var id = ids[i];
    +                                for (var j = 0; j < matches.length; j++) {
    +                                    var match = matches[j];
    +                                    if (equal(id, opts.id(match))) {
    +                                        ordered.push(match);
    +                                        matches.splice(j, 1);
    +                                        break;
    +                                    }
    +                                }
    +                            }
    +                            callback(ordered);
    +                        }
    +                    });
    +                };
    +            }
    +
    +            return opts;
    +        },
    +
    +        // multi
    +        selectChoice: function (choice) {
    +
    +            var selected = this.container.find(".select2-search-choice-focus");
    +            if (selected.length && choice && choice[0] == selected[0]) {
    +
    +            } else {
    +                if (selected.length) {
    +                    this.opts.element.trigger("choice-deselected", selected);
    +                }
    +                selected.removeClass("select2-search-choice-focus");
    +                if (choice && choice.length) {
    +                    this.close();
    +                    choice.addClass("select2-search-choice-focus");
    +                    this.opts.element.trigger("choice-selected", choice);
    +                }
    +            }
    +        },
    +
    +        // multi
    +        destroy: function() {
    +            $("label[for='" + this.search.attr('id') + "']")
    +                .attr('for', this.opts.element.attr("id"));
    +            this.parent.destroy.apply(this, arguments);
    +
    +            cleanupJQueryElements.call(this,
    +                "searchContainer",
    +                "selection"
    +            );
    +        },
    +
    +        // multi
    +        initContainer: function () {
    +
    +            var selector = ".select2-choices", selection;
    +
    +            this.searchContainer = this.container.find(".select2-search-field");
    +            this.selection = selection = this.container.find(selector);
    +
    +            var _this = this;
    +            this.selection.on("click", ".select2-container:not(.select2-container-disabled) .select2-search-choice:not(.select2-locked)", function (e) {
    +                _this.search[0].focus();
    +                _this.selectChoice($(this));
    +            });
    +
    +            // rewrite labels from original element to focusser
    +            this.search.attr("id", "s2id_autogen"+nextUid());
    +
    +            this.search.prev()
    +                .text($("label[for='" + this.opts.element.attr("id") + "']").text())
    +                .attr('for', this.search.attr('id'));
    +            this.opts.element.focus(this.bind(function () { this.focus(); }));
    +
    +            this.search.on("input paste", this.bind(function() {
    +                if (this.search.attr('placeholder') && this.search.val().length == 0) return;
    +                if (!this.isInterfaceEnabled()) return;
    +                if (!this.opened()) {
    +                    this.open();
    +                }
    +            }));
    +
    +            this.search.attr("tabindex", this.elementTabIndex);
    +
    +            this.keydowns = 0;
    +            this.search.on("keydown", this.bind(function (e) {
    +                if (!this.isInterfaceEnabled()) return;
    +
    +                ++this.keydowns;
    +                var selected = selection.find(".select2-search-choice-focus");
    +                var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
    +                var next = selected.next(".select2-search-choice:not(.select2-locked)");
    +                var pos = getCursorInfo(this.search);
    +
    +                if (selected.length &&
    +                    (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
    +                    var selectedChoice = selected;
    +                    if (e.which == KEY.LEFT && prev.length) {
    +                        selectedChoice = prev;
    +                    }
    +                    else if (e.which == KEY.RIGHT) {
    +                        selectedChoice = next.length ? next : null;
    +                    }
    +                    else if (e.which === KEY.BACKSPACE) {
    +                        if (this.unselect(selected.first())) {
    +                            this.search.width(10);
    +                            selectedChoice = prev.length ? prev : next;
    +                        }
    +                    } else if (e.which == KEY.DELETE) {
    +                        if (this.unselect(selected.first())) {
    +                            this.search.width(10);
    +                            selectedChoice = next.length ? next : null;
    +                        }
    +                    } else if (e.which == KEY.ENTER) {
    +                        selectedChoice = null;
    +                    }
    +
    +                    this.selectChoice(selectedChoice);
    +                    killEvent(e);
    +                    if (!selectedChoice || !selectedChoice.length) {
    +                        this.open();
    +                    }
    +                    return;
    +                } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
    +                    || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {
    +
    +                    this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
    +                    killEvent(e);
    +                    return;
    +                } else {
    +                    this.selectChoice(null);
    +                }
    +
    +                if (this.opened()) {
    +                    switch (e.which) {
    +                    case KEY.UP:
    +                    case KEY.DOWN:
    +                        this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
    +                        killEvent(e);
    +                        return;
    +                    case KEY.ENTER:
    +                        this.selectHighlighted();
    +                        killEvent(e);
    +                        return;
    +                    case KEY.TAB:
    +                        this.selectHighlighted({noFocus:true});
    +                        this.close();
    +                        return;
    +                    case KEY.ESC:
    +                        this.cancel(e);
    +                        killEvent(e);
    +                        return;
    +                    }
    +                }
    +
    +                if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
    +                 || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
    +                    return;
    +                }
    +
    +                if (e.which === KEY.ENTER) {
    +                    if (this.opts.openOnEnter === false) {
    +                        return;
    +                    } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
    +                        return;
    +                    }
    +                }
    +
    +                this.open();
    +
    +                if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
    +                    // prevent the page from scrolling
    +                    killEvent(e);
    +                }
    +
    +                if (e.which === KEY.ENTER) {
    +                    // prevent form from being submitted
    +                    killEvent(e);
    +                }
    +
    +            }));
    +
    +            this.search.on("keyup", this.bind(function (e) {
    +                this.keydowns = 0;
    +                this.resizeSearch();
    +            })
    +            );
    +
    +            this.search.on("blur", this.bind(function(e) {
    +                this.container.removeClass("select2-container-active");
    +                this.search.removeClass("select2-focused");
    +                this.selectChoice(null);
    +                if (!this.opened()) this.clearSearch();
    +                e.stopImmediatePropagation();
    +                this.opts.element.trigger($.Event("select2-blur"));
    +            }));
    +
    +            this.container.on("click", selector, this.bind(function (e) {
    +                if (!this.isInterfaceEnabled()) return;
    +                if ($(e.target).closest(".select2-search-choice").length > 0) {
    +                    // clicked inside a select2 search choice, do not open
    +                    return;
    +                }
    +                this.selectChoice(null);
    +                this.clearPlaceholder();
    +                if (!this.container.hasClass("select2-container-active")) {
    +                    this.opts.element.trigger($.Event("select2-focus"));
    +                }
    +                this.open();
    +                this.focusSearch();
    +                e.preventDefault();
    +            }));
    +
    +            this.container.on("focus", selector, this.bind(function () {
    +                if (!this.isInterfaceEnabled()) return;
    +                if (!this.container.hasClass("select2-container-active")) {
    +                    this.opts.element.trigger($.Event("select2-focus"));
    +                }
    +                this.container.addClass("select2-container-active");
    +                this.dropdown.addClass("select2-drop-active");
    +                this.clearPlaceholder();
    +            }));
    +
    +            this.initContainerWidth();
    +            this.opts.element.hide();
    +
    +            // set the placeholder if necessary
    +            this.clearSearch();
    +        },
    +
    +        // multi
    +        enableInterface: function() {
    +            if (this.parent.enableInterface.apply(this, arguments)) {
    +                this.search.prop("disabled", !this.isInterfaceEnabled());
    +            }
    +        },
    +
    +        // multi
    +        initSelection: function () {
    +            var data;
    +            if (this.opts.element.val() === "" && this.opts.element.text() === "") {
    +                this.updateSelection([]);
    +                this.close();
    +                // set the placeholder if necessary
    +                this.clearSearch();
    +            }
    +            if (this.select || this.opts.element.val() !== "") {
    +                var self = this;
    +                this.opts.initSelection.call(null, this.opts.element, function(data){
    +                    if (data !== undefined && data !== null) {
    +                        self.updateSelection(data);
    +                        self.close();
    +                        // set the placeholder if necessary
    +                        self.clearSearch();
    +                    }
    +                });
    +            }
    +        },
    +
    +        // multi
    +        clearSearch: function () {
    +            var placeholder = this.getPlaceholder(),
    +                maxWidth = this.getMaxSearchWidth();
    +
    +            if (placeholder !== undefined  && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
    +                this.search.val(placeholder).addClass("select2-default");
    +                // stretch the search box to full width of the container so as much of the placeholder is visible as possible
    +                // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
    +                this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
    +            } else {
    +                this.search.val("").width(10);
    +            }
    +        },
    +
    +        // multi
    +        clearPlaceholder: function () {
    +            if (this.search.hasClass("select2-default")) {
    +                this.search.val("").removeClass("select2-default");
    +            }
    +        },
    +
    +        // multi
    +        opening: function () {
    +            this.clearPlaceholder(); // should be done before super so placeholder is not used to search
    +            this.resizeSearch();
    +
    +            this.parent.opening.apply(this, arguments);
    +
    +            this.focusSearch();
    +
    +            // initializes search's value with nextSearchTerm (if defined by user)
    +            // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
    +            if(this.search.val() === "") {
    +                if(this.nextSearchTerm != undefined){
    +                    this.search.val(this.nextSearchTerm);
    +                    this.search.select();
    +                }
    +            }
    +
    +            this.updateResults(true);
    +            if (this.opts.shouldFocusInput(this)) {
    +                this.search.focus();
    +            }
    +            this.opts.element.trigger($.Event("select2-open"));
    +        },
    +
    +        // multi
    +        close: function () {
    +            if (!this.opened()) return;
    +            this.parent.close.apply(this, arguments);
    +        },
    +
    +        // multi
    +        focus: function () {
    +            this.close();
    +            this.search.focus();
    +        },
    +
    +        // multi
    +        isFocused: function () {
    +            return this.search.hasClass("select2-focused");
    +        },
    +
    +        // multi
    +        updateSelection: function (data) {
    +            var ids = [], filtered = [], self = this;
    +
    +            // filter out duplicates
    +            $(data).each(function () {
    +                if (indexOf(self.id(this), ids) < 0) {
    +                    ids.push(self.id(this));
    +                    filtered.push(this);
    +                }
    +            });
    +            data = filtered;
    +
    +            this.selection.find(".select2-search-choice").remove();
    +            $(data).each(function () {
    +                self.addSelectedChoice(this);
    +            });
    +            self.postprocessResults();
    +        },
    +
    +        // multi
    +        tokenize: function() {
    +            var input = this.search.val();
    +            input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
    +            if (input != null && input != undefined) {
    +                this.search.val(input);
    +                if (input.length > 0) {
    +                    this.open();
    +                }
    +            }
    +
    +        },
    +
    +        // multi
    +        onSelect: function (data, options) {
    +
    +            if (!this.triggerSelect(data) || data.text === "") { return; }
    +
    +            this.addSelectedChoice(data);
    +
    +            this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });
    +
    +            // keep track of the search's value before it gets cleared
    +            this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
    +
    +            this.clearSearch();
    +            this.updateResults();
    +
    +            if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);
    +
    +            if (this.opts.closeOnSelect) {
    +                this.close();
    +                this.search.width(10);
    +            } else {
    +                if (this.countSelectableResults()>0) {
    +                    this.search.width(10);
    +                    this.resizeSearch();
    +                    if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
    +                        // if we reached max selection size repaint the results so choices
    +                        // are replaced with the max selection reached message
    +                        this.updateResults(true);
    +                    } else {
    +                        // initializes search's value with nextSearchTerm and update search result
    +                        if(this.nextSearchTerm != undefined){
    +                            this.search.val(this.nextSearchTerm);
    +                            this.updateResults();
    +                            this.search.select();
    +                        }
    +                    }
    +                    this.positionDropdown();
    +                } else {
    +                    // if nothing left to select close
    +                    this.close();
    +                    this.search.width(10);
    +                }
    +            }
    +
    +            // since its not possible to select an element that has already been
    +            // added we do not need to check if this is a new element before firing change
    +            this.triggerChange({ added: data });
    +
    +            if (!options || !options.noFocus)
    +                this.focusSearch();
    +        },
    +
    +        // multi
    +        cancel: function () {
    +            this.close();
    +            this.focusSearch();
    +        },
    +
    +        addSelectedChoice: function (data) {
    +            var enableChoice = !data.locked,
    +                enabledItem = $(
    +                    "<li class='select2-search-choice'>" +
    +                    "    <div></div>" +
    +                    "    <a href='#' class='select2-search-choice-close' tabindex='-1'></a>" +
    +                    "</li>"),
    +                disabledItem = $(
    +                    "<li class='select2-search-choice select2-locked'>" +
    +                    "<div></div>" +
    +                    "</li>");
    +            var choice = enableChoice ? enabledItem : disabledItem,
    +                id = this.id(data),
    +                val = this.getVal(),
    +                formatted,
    +                cssClass;
    +
    +            formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
    +            if (formatted != undefined) {
    +                choice.find("div").replaceWith($("<div></div>").html(formatted));
    +            }
    +            cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
    +            if (cssClass != undefined) {
    +                choice.addClass(cssClass);
    +            }
    +
    +            if(enableChoice){
    +              choice.find(".select2-search-choice-close")
    +                  .on("mousedown", killEvent)
    +                  .on("click dblclick", this.bind(function (e) {
    +                  if (!this.isInterfaceEnabled()) return;
    +
    +                  this.unselect($(e.target));
    +                  this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
    +                  killEvent(e);
    +                  this.close();
    +                  this.focusSearch();
    +              })).on("focus", this.bind(function () {
    +                  if (!this.isInterfaceEnabled()) return;
    +                  this.container.addClass("select2-container-active");
    +                  this.dropdown.addClass("select2-drop-active");
    +              }));
    +            }
    +
    +            choice.data("select2-data", data);
    +            choice.insertBefore(this.searchContainer);
    +
    +            val.push(id);
    +            this.setVal(val);
    +        },
    +
    +        // multi
    +        unselect: function (selected) {
    +            var val = this.getVal(),
    +                data,
    +                index;
    +            selected = selected.closest(".select2-search-choice");
    +
    +            if (selected.length === 0) {
    +                throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
    +            }
    +
    +            data = selected.data("select2-data");
    +
    +            if (!data) {
    +                // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
    +                // and invoked on an element already removed
    +                return;
    +            }
    +
    +            var evt = $.Event("select2-removing");
    +            evt.val = this.id(data);
    +            evt.choice = data;
    +            this.opts.element.trigger(evt);
    +
    +            if (evt.isDefaultPrevented()) {
    +                return false;
    +            }
    +
    +            while((index = indexOf(this.id(data), val)) >= 0) {
    +                val.splice(index, 1);
    +                this.setVal(val);
    +                if (this.select) this.postprocessResults();
    +            }
    +
    +            selected.remove();
    +
    +            this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
    +            this.triggerChange({ removed: data });
    +
    +            return true;
    +        },
    +
    +        // multi
    +        postprocessResults: function (data, initial, noHighlightUpdate) {
    +            var val = this.getVal(),
    +                choices = this.results.find(".select2-result"),
    +                compound = this.results.find(".select2-result-with-children"),
    +                self = this;
    +
    +            choices.each2(function (i, choice) {
    +                var id = self.id(choice.data("select2-data"));
    +                if (indexOf(id, val) >= 0) {
    +                    choice.addClass("select2-selected");
    +                    // mark all children of the selected parent as selected
    +                    choice.find(".select2-result-selectable").addClass("select2-selected");
    +                }
    +            });
    +
    +            compound.each2(function(i, choice) {
    +                // hide an optgroup if it doesn't have any selectable children
    +                if (!choice.is('.select2-result-selectable')
    +                    && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
    +                    choice.addClass("select2-selected");
    +                }
    +            });
    +
    +            if (this.highlight() == -1 && noHighlightUpdate !== false && this.opts.closeOnSelect === true){
    +                self.highlight(0);
    +            }
    +
    +            //If all results are chosen render formatNoMatches
    +            if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
    +                if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
    +                    if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
    +                        this.results.append("<li class='select2-no-results'>" + evaluate(self.opts.formatNoMatches, self.opts.element, self.search.val()) + "</li>");
    +                    }
    +                }
    +            }
    +
    +        },
    +
    +        // multi
    +        getMaxSearchWidth: function() {
    +            return this.selection.width() - getSideBorderPadding(this.search);
    +        },
    +
    +        // multi
    +        resizeSearch: function () {
    +            var minimumWidth, left, maxWidth, containerLeft, searchWidth,
    +                sideBorderPadding = getSideBorderPadding(this.search);
    +
    +            minimumWidth = measureTextWidth(this.search) + 10;
    +
    +            left = this.search.offset().left;
    +
    +            maxWidth = this.selection.width();
    +            containerLeft = this.selection.offset().left;
    +
    +            searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;
    +
    +            if (searchWidth < minimumWidth) {
    +                searchWidth = maxWidth - sideBorderPadding;
    +            }
    +
    +            if (searchWidth < 40) {
    +                searchWidth = maxWidth - sideBorderPadding;
    +            }
    +
    +            if (searchWidth <= 0) {
    +              searchWidth = minimumWidth;
    +            }
    +
    +            this.search.width(Math.floor(searchWidth));
    +        },
    +
    +        // multi
    +        getVal: function () {
    +            var val;
    +            if (this.select) {
    +                val = this.select.val();
    +                return val === null ? [] : val;
    +            } else {
    +                val = this.opts.element.val();
    +                return splitVal(val, this.opts.separator, this.opts.transformVal);
    +            }
    +        },
    +
    +        // multi
    +        setVal: function (val) {
    +            var unique;
    +            if (this.select) {
    +                this.select.val(val);
    +            } else {
    +                unique = [];
    +                // filter out duplicates
    +                $(val).each(function () {
    +                    if (indexOf(this, unique) < 0) unique.push(this);
    +                });
    +                this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
    +            }
    +        },
    +
    +        // multi
    +        buildChangeDetails: function (old, current) {
    +            var current = current.slice(0),
    +                old = old.slice(0);
    +
    +            // remove intersection from each array
    +            for (var i = 0; i < current.length; i++) {
    +                for (var j = 0; j < old.length; j++) {
    +                    if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
    +                        current.splice(i, 1);
    +                        if(i>0){
    +                            i--;
    +                        }
    +                        old.splice(j, 1);
    +                        j--;
    +                    }
    +                }
    +            }
    +
    +            return {added: current, removed: old};
    +        },
    +
    +
    +        // multi
    +        val: function (val, triggerChange) {
    +            var oldData, self=this;
    +
    +            if (arguments.length === 0) {
    +                return this.getVal();
    +            }
    +
    +            oldData=this.data();
    +            if (!oldData.length) oldData=[];
    +
    +            // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
    +            if (!val && val !== 0) {
    +                this.opts.element.val("");
    +                this.updateSelection([]);
    +                this.clearSearch();
    +                if (triggerChange) {
    +                    this.triggerChange({added: this.data(), removed: oldData});
    +                }
    +                return;
    +            }
    +
    +            // val is a list of ids
    +            this.setVal(val);
    +
    +            if (this.select) {
    +                this.opts.initSelection(this.select, this.bind(this.updateSelection));
    +                if (triggerChange) {
    +                    this.triggerChange(this.buildChangeDetails(oldData, this.data()));
    +                }
    +            } else {
    +                if (this.opts.initSelection === undefined) {
    +                    throw new Error("val() cannot be called if initSelection() is not defined");
    +                }
    +
    +                this.opts.initSelection(this.opts.element, function(data){
    +                    var ids=$.map(data, self.id);
    +                    self.setVal(ids);
    +                    self.updateSelection(data);
    +                    self.clearSearch();
    +                    if (triggerChange) {
    +                        self.triggerChange(self.buildChangeDetails(oldData, self.data()));
    +                    }
    +                });
    +            }
    +            this.clearSearch();
    +        },
    +
    +        // multi
    +        onSortStart: function() {
    +            if (this.select) {
    +                throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
    +            }
    +
    +            // collapse search field into 0 width so its container can be collapsed as well
    +            this.search.width(0);
    +            // hide the container
    +            this.searchContainer.hide();
    +        },
    +
    +        // multi
    +        onSortEnd:function() {
    +
    +            var val=[], self=this;
    +
    +            // show search and move it to the end of the list
    +            this.searchContainer.show();
    +            // make sure the search container is the last item in the list
    +            this.searchContainer.appendTo(this.searchContainer.parent());
    +            // since we collapsed the width in dragStarted, we resize it here
    +            this.resizeSearch();
    +
    +            // update selection
    +            this.selection.find(".select2-search-choice").each(function() {
    +                val.push(self.opts.id($(this).data("select2-data")));
    +            });
    +            this.setVal(val);
    +            this.triggerChange();
    +        },
    +
    +        // multi
    +        data: function(values, triggerChange) {
    +            var self=this, ids, old;
    +            if (arguments.length === 0) {
    +                 return this.selection
    +                     .children(".select2-search-choice")
    +                     .map(function() { return $(this).data("select2-data"); })
    +                     .get();
    +            } else {
    +                old = this.data();
    +                if (!values) { values = []; }
    +                ids = $.map(values, function(e) { return self.opts.id(e); });
    +                this.setVal(ids);
    +                this.updateSelection(values);
    +                this.clearSearch();
    +                if (triggerChange) {
    +                    this.triggerChange(this.buildChangeDetails(old, this.data()));
    +                }
    +            }
    +        }
    +    });
    +
    +    $.fn.select2 = function () {
    +
    +        var args = Array.prototype.slice.call(arguments, 0),
    +            opts,
    +            select2,
    +            method, value, multiple,
    +            allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
    +            valueMethods = ["opened", "isFocused", "container", "dropdown"],
    +            propertyMethods = ["val", "data"],
    +            methodsMap = { search: "externalSearch" };
    +
    +        this.each(function () {
    +            if (args.length === 0 || typeof(args[0]) === "object") {
    +                opts = args.length === 0 ? {} : $.extend({}, args[0]);
    +                opts.element = $(this);
    +
    +                if (opts.element.get(0).tagName.toLowerCase() === "select") {
    +                    multiple = opts.element.prop("multiple");
    +                } else {
    +                    multiple = opts.multiple || false;
    +                    if ("tags" in opts) {opts.multiple = multiple = true;}
    +                }
    +
    +                select2 = multiple ? new window.Select2["class"].multi() : new window.Select2["class"].single();
    +                select2.init(opts);
    +            } else if (typeof(args[0]) === "string") {
    +
    +                if (indexOf(args[0], allowedMethods) < 0) {
    +                    throw "Unknown method: " + args[0];
    +                }
    +
    +                value = undefined;
    +                select2 = $(this).data("select2");
    +                if (select2 === undefined) return;
    +
    +                method=args[0];
    +
    +                if (method === "container") {
    +                    value = select2.container;
    +                } else if (method === "dropdown") {
    +                    value = select2.dropdown;
    +                } else {
    +                    if (methodsMap[method]) method = methodsMap[method];
    +
    +                    value = select2[method].apply(select2, args.slice(1));
    +                }
    +                if (indexOf(args[0], valueMethods) >= 0
    +                    || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) {
    +                    return false; // abort the iteration, ready to return first matched value
    +                }
    +            } else {
    +                throw "Invalid arguments to select2 plugin: " + args;
    +            }
    +        });
    +        return (value === undefined) ? this : value;
    +    };
    +
    +    // plugin defaults, accessible to users
    +    $.fn.select2.defaults = {
    +        width: "copy",
    +        loadMorePadding: 0,
    +        closeOnSelect: true,
    +        openOnEnter: true,
    +        containerCss: {},
    +        dropdownCss: {},
    +        containerCssClass: "",
    +        dropdownCssClass: "",
    +        formatResult: function(result, container, query, escapeMarkup) {
    +            var markup=[];
    +            markMatch(this.text(result), query.term, markup, escapeMarkup);
    +            return markup.join("");
    +        },
    +        transformVal: function(val) {
    +            return $.trim(val);
    +        },
    +        formatSelection: function (data, container, escapeMarkup) {
    +            return data ? escapeMarkup(this.text(data)) : undefined;
    +        },
    +        sortResults: function (results, container, query) {
    +            return results;
    +        },
    +        formatResultCssClass: function(data) {return data.css;},
    +        formatSelectionCssClass: function(data, container) {return undefined;},
    +        minimumResultsForSearch: 0,
    +        minimumInputLength: 0,
    +        maximumInputLength: null,
    +        maximumSelectionSize: 0,
    +        id: function (e) { return e == undefined ? null : e.id; },
    +        text: function (e) {
    +          if (e && this.data && this.data.text) {
    +            if ($.isFunction(this.data.text)) {
    +              return this.data.text(e);
    +            } else {
    +              return e[this.data.text];
    +            }
    +          } else {
    +            return e.text;
    +          }
    +        },
    +        matcher: function(term, text) {
    +            return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
    +        },
    +        separator: ",",
    +        tokenSeparators: [],
    +        tokenizer: defaultTokenizer,
    +        escapeMarkup: defaultEscapeMarkup,
    +        blurOnChange: false,
    +        selectOnBlur: false,
    +        adaptContainerCssClass: function(c) { return c; },
    +        adaptDropdownCssClass: function(c) { return null; },
    +        nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },
    +        searchInputPlaceholder: '',
    +        createSearchChoicePosition: 'top',
    +        shouldFocusInput: function (instance) {
    +            // Attempt to detect touch devices
    +            var supportsTouchEvents = (('ontouchstart' in window) ||
    +                                       (navigator.msMaxTouchPoints > 0));
    +
    +            // Only devices which support touch events should be special cased
    +            if (!supportsTouchEvents) {
    +                return true;
    +            }
    +
    +            // Never focus the input if search is disabled
    +            if (instance.opts.minimumResultsForSearch < 0) {
    +                return false;
    +            }
    +
    +            return true;
    +        }
    +    };
    +
    +    $.fn.select2.locales = [];
    +
    +    $.fn.select2.locales['en'] = {
    +         formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; },
    +         formatNoMatches: function () { return "No matches found"; },
    +         formatAjaxError: function (jqXHR, textStatus, errorThrown) { return "Loading failed"; },
    +         formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); },
    +         formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
    +         formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
    +         formatLoadMore: function (pageNumber) { return "Loading more results鈥"; },
    +         formatSearching: function () { return "Searching鈥"; }
    +    };
    +
    +    $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);
    +
    +    $.fn.select2.ajaxDefaults = {
    +        transport: $.ajax,
    +        params: {
    +            type: "GET",
    +            cache: false,
    +            dataType: "json"
    +        }
    +    };
    +
    +    // exports
    +    window.Select2 = {
    +        query: {
    +            ajax: ajax,
    +            local: local,
    +            tags: tags
    +        }, util: {
    +            debounce: debounce,
    +            markMatch: markMatch,
    +            escapeMarkup: defaultEscapeMarkup,
    +            stripDiacritics: stripDiacritics
    +        }, "class": {
    +            "abstract": AbstractSelect2,
    +            "single": SingleSelect2,
    +            "multi": MultiSelect2
    +        }
    +    };
    +
    +}(jQuery));
    diff --git a/src/main/webapp/plug-in/ace/js/spin.js b/src/main/webapp/plug-in/ace/js/spin.js
    new file mode 100644
    index 00000000..a3812e23
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ace/js/spin.js
    @@ -0,0 +1,349 @@
    +/**
    + * Copyright (c) 2011-2014 Felix Gnass
    + * Licensed under the MIT license
    + */
    +(function(root, factory) {
    +
    +  /* CommonJS */
    +  if (typeof exports == 'object')  module.exports = factory()
    +
    +  /* AMD module */
    +  else if (typeof define == 'function' && define.amd) define(factory)
    +
    +  /* Browser global */
    +  else root.Spinner = factory()
    +}
    +(this, function() {
    +  "use strict";
    +
    +  var prefixes = ['webkit', 'Moz', 'ms', 'O'] /* Vendor prefixes */
    +    , animations = {} /* Animation rules keyed by their name */
    +    , useCssAnimations /* Whether to use CSS animations or setTimeout */
    +
    +  /**
    +   * Utility function to create elements. If no tag name is given,
    +   * a DIV is created. Optionally properties can be passed.
    +   */
    +  function createEl(tag, prop) {
    +    var el = document.createElement(tag || 'div')
    +      , n
    +
    +    for(n in prop) el[n] = prop[n]
    +    return el
    +  }
    +
    +  /**
    +   * Appends children and returns the parent.
    +   */
    +  function ins(parent /* child1, child2, ...*/) {
    +    for (var i=1, n=arguments.length; i<n; i++)
    +      parent.appendChild(arguments[i])
    +
    +    return parent
    +  }
    +
    +  /**
    +   * Insert a new stylesheet to hold the @keyframe or VML rules.
    +   */
    +  var sheet = (function() {
    +    var el = createEl('style', {type : 'text/css'})
    +    ins(document.getElementsByTagName('head')[0], el)
    +    return el.sheet || el.styleSheet
    +  }())
    +
    +  /**
    +   * Creates an opacity keyframe animation rule and returns its name.
    +   * Since most mobile Webkits have timing issues with animation-delay,
    +   * we create separate rules for each line/segment.
    +   */
    +  function addAnimation(alpha, trail, i, lines) {
    +    var name = ['opacity', trail, ~~(alpha*100), i, lines].join('-')
    +      , start = 0.01 + i/lines * 100
    +      , z = Math.max(1 - (1-alpha) / trail * (100-start), alpha)
    +      , prefix = useCssAnimations.substring(0, useCssAnimations.indexOf('Animation')).toLowerCase()
    +      , pre = prefix && '-' + prefix + '-' || ''
    +
    +    if (!animations[name]) {
    +      sheet.insertRule(
    +        '@' + pre + 'keyframes ' + name + '{' +
    +        '0%{opacity:' + z + '}' +
    +        start + '%{opacity:' + alpha + '}' +
    +        (start+0.01) + '%{opacity:1}' +
    +        (start+trail) % 100 + '%{opacity:' + alpha + '}' +
    +        '100%{opacity:' + z + '}' +
    +        '}', sheet.cssRules.length)
    +
    +      animations[name] = 1
    +    }
    +
    +    return name
    +  }
    +
    +  /**
    +   * Tries various vendor prefixes and returns the first supported property.
    +   */
    +  function vendor(el, prop) {
    +    var s = el.style
    +      , pp
    +      , i
    +
    +    prop = prop.charAt(0).toUpperCase() + prop.slice(1)
    +    for(i=0; i<prefixes.length; i++) {
    +      pp = prefixes[i]+prop
    +      if(s[pp] !== undefined) return pp
    +    }
    +    if(s[prop] !== undefined) return prop
    +  }
    +
    +  /**
    +   * Sets multiple style properties at once.
    +   */
    +  function css(el, prop) {
    +    for (var n in prop)
    +      el.style[vendor(el, n)||n] = prop[n]
    +
    +    return el
    +  }
    +
    +  /**
    +   * Fills in default values.
    +   */
    +  function merge(obj) {
    +    for (var i=1; i < arguments.length; i++) {
    +      var def = arguments[i]
    +      for (var n in def)
    +        if (obj[n] === undefined) obj[n] = def[n]
    +    }
    +    return obj
    +  }
    +
    +  /**
    +   * Returns the absolute page-offset of the given element.
    +   */
    +  function pos(el) {
    +    var o = { x:el.offsetLeft, y:el.offsetTop }
    +    while((el = el.offsetParent))
    +      o.x+=el.offsetLeft, o.y+=el.offsetTop
    +
    +    return o
    +  }
    +
    +  /**
    +   * Returns the line color from the given string or array.
    +   */
    +  function getColor(color, idx) {
    +    return typeof color == 'string' ? color : color[idx % color.length]
    +  }
    +
    +  // Built-in defaults
    +
    +  var defaults = {
    +    lines: 12,            // The number of lines to draw
    +    length: 7,            // The length of each line
    +    width: 5,             // The line thickness
    +    radius: 10,           // The radius of the inner circle
    +    rotate: 0,            // Rotation offset
    +    corners: 1,           // Roundness (0..1)
    +    color: '#000',        // #rgb or #rrggbb
    +    direction: 1,         // 1: clockwise, -1: counterclockwise
    +    speed: 1,             // Rounds per second
    +    trail: 100,           // Afterglow percentage
    +    opacity: 1/4,         // Opacity of the lines
    +    fps: 20,              // Frames per second when using setTimeout()
    +    zIndex: 2e9,          // Use a high z-index by default
    +    className: 'spinner', // CSS class to assign to the element
    +    top: '50%',           // center vertically
    +    left: '50%',          // center horizontally
    +    position: 'absolute'  // element position
    +  }
    +
    +  /** The constructor */
    +  function Spinner(o) {
    +    this.opts = merge(o || {}, Spinner.defaults, defaults)
    +  }
    +
    +  // Global defaults that override the built-ins:
    +  Spinner.defaults = {}
    +
    +  merge(Spinner.prototype, {
    +
    +    /**
    +     * Adds the spinner to the given target element. If this instance is already
    +     * spinning, it is automatically removed from its previous target b calling
    +     * stop() internally.
    +     */
    +    spin: function(target) {
    +      this.stop()
    +
    +      var self = this
    +        , o = self.opts
    +        , el = self.el = css(createEl(0, {className: o.className}), {position: o.position, width: 0, zIndex: o.zIndex})
    +        , mid = o.radius+o.length+o.width
    +
    +      css(el, {
    +        left: o.left,
    +        top: o.top
    +      })
    +        
    +      if (target) {
    +        target.insertBefore(el, target.firstChild||null)
    +      }
    +
    +      el.setAttribute('role', 'progressbar')
    +      self.lines(el, self.opts)
    +
    +      if (!useCssAnimations) {
    +        // No CSS animation support, use setTimeout() instead
    +        var i = 0
    +          , start = (o.lines - 1) * (1 - o.direction) / 2
    +          , alpha
    +          , fps = o.fps
    +          , f = fps/o.speed
    +          , ostep = (1-o.opacity) / (f*o.trail / 100)
    +          , astep = f/o.lines
    +
    +        ;(function anim() {
    +          i++;
    +          for (var j = 0; j < o.lines; j++) {
    +            alpha = Math.max(1 - (i + (o.lines - j) * astep) % f * ostep, o.opacity)
    +
    +            self.opacity(el, j * o.direction + start, alpha, o)
    +          }
    +          self.timeout = self.el && setTimeout(anim, ~~(1000/fps))
    +        })()
    +      }
    +      return self
    +    },
    +
    +    /**
    +     * Stops and removes the Spinner.
    +     */
    +    stop: function() {
    +      var el = this.el
    +      if (el) {
    +        clearTimeout(this.timeout)
    +        if (el.parentNode) el.parentNode.removeChild(el)
    +        this.el = undefined
    +      }
    +      return this
    +    },
    +
    +    /**
    +     * Internal method that draws the individual lines. Will be overwritten
    +     * in VML fallback mode below.
    +     */
    +    lines: function(el, o) {
    +      var i = 0
    +        , start = (o.lines - 1) * (1 - o.direction) / 2
    +        , seg
    +
    +      function fill(color, shadow) {
    +        return css(createEl(), {
    +          position: 'absolute',
    +          width: (o.length+o.width) + 'px',
    +          height: o.width + 'px',
    +          background: color,
    +          boxShadow: shadow,
    +          transformOrigin: 'left',
    +          transform: 'rotate(' + ~~(360/o.lines*i+o.rotate) + 'deg) translate(' + o.radius+'px' +',0)',
    +          borderRadius: (o.corners * o.width>>1) + 'px'
    +        })
    +      }
    +
    +      for (; i < o.lines; i++) {
    +        seg = css(createEl(), {
    +          position: 'absolute',
    +          top: 1+~(o.width/2) + 'px',
    +          transform: o.hwaccel ? 'translate3d(0,0,0)' : '',
    +          opacity: o.opacity,
    +          animation: useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + ' ' + 1/o.speed + 's linear infinite'
    +        })
    +
    +        if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'}))
    +        ins(el, ins(seg, fill(getColor(o.color, i), '0 0 1px rgba(0,0,0,.1)')))
    +      }
    +      return el
    +    },
    +
    +    /**
    +     * Internal method that adjusts the opacity of a single line.
    +     * Will be overwritten in VML fallback mode below.
    +     */
    +    opacity: function(el, i, val) {
    +      if (i < el.childNodes.length) el.childNodes[i].style.opacity = val
    +    }
    +
    +  })
    +
    +
    +  function initVML() {
    +
    +    /* Utility function to create a VML tag */
    +    function vml(tag, attr) {
    +      return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr)
    +    }
    +
    +    // No CSS transforms but VML support, add a CSS rule for VML elements:
    +    sheet.addRule('.spin-vml', 'behavior:url(#default#VML)')
    +
    +    Spinner.prototype.lines = function(el, o) {
    +      var r = o.length+o.width
    +        , s = 2*r
    +
    +      function grp() {
    +        return css(
    +          vml('group', {
    +            coordsize: s + ' ' + s,
    +            coordorigin: -r + ' ' + -r
    +          }),
    +          { width: s, height: s }
    +        )
    +      }
    +
    +      var margin = -(o.width+o.length)*2 + 'px'
    +        , g = css(grp(), {position: 'absolute', top: margin, left: margin})
    +        , i
    +
    +      function seg(i, dx, filter) {
    +        ins(g,
    +          ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}),
    +            ins(css(vml('roundrect', {arcsize: o.corners}), {
    +                width: r,
    +                height: o.width,
    +                left: o.radius,
    +                top: -o.width>>1,
    +                filter: filter
    +              }),
    +              vml('fill', {color: getColor(o.color, i), opacity: o.opacity}),
    +              vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change
    +            )
    +          )
    +        )
    +      }
    +
    +      if (o.shadow)
    +        for (i = 1; i <= o.lines; i++)
    +          seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)')
    +
    +      for (i = 1; i <= o.lines; i++) seg(i)
    +      return ins(el, g)
    +    }
    +
    +    Spinner.prototype.opacity = function(el, i, val, o) {
    +      var c = el.firstChild
    +      o = o.shadow && o.lines || 0
    +      if (c && i+o < c.childNodes.length) {
    +        c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild
    +        if (c) c.opacity = val
    +      }
    +    }
    +  }
    +
    +  var probe = css(createEl('group'), {behavior: 'url(#default#VML)'})
    +
    +  if (!vendor(probe, 'transform') && probe.adj) initVML()
    +  else useCssAnimations = vendor(probe, 'animation')
    +
    +  return Spinner
    +
    +}));
    diff --git a/src/main/webapp/plug-in/ace/js/typeahead.jquery.js b/src/main/webapp/plug-in/ace/js/typeahead.jquery.js
    new file mode 100644
    index 00000000..2e4977d4
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ace/js/typeahead.jquery.js
    @@ -0,0 +1,1184 @@
    +/*!
    + * typeahead.js 0.10.5
    + * https://github.com/twitter/typeahead.js
    + * Copyright 2013-2014 Twitter, Inc. and other contributors; Licensed MIT
    + */
    +
    +(function($) {
    +    var _ = function() {
    +        "use strict";
    +        return {
    +            isMsie: function() {
    +                return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
    +            },
    +            isBlankString: function(str) {
    +                return !str || /^\s*$/.test(str);
    +            },
    +            escapeRegExChars: function(str) {
    +                return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
    +            },
    +            isString: function(obj) {
    +                return typeof obj === "string";
    +            },
    +            isNumber: function(obj) {
    +                return typeof obj === "number";
    +            },
    +            isArray: $.isArray,
    +            isFunction: $.isFunction,
    +            isObject: $.isPlainObject,
    +            isUndefined: function(obj) {
    +                return typeof obj === "undefined";
    +            },
    +            toStr: function toStr(s) {
    +                return _.isUndefined(s) || s === null ? "" : s + "";
    +            },
    +            bind: $.proxy,
    +            each: function(collection, cb) {
    +                $.each(collection, reverseArgs);
    +                function reverseArgs(index, value) {
    +                    return cb(value, index);
    +                }
    +            },
    +            map: $.map,
    +            filter: $.grep,
    +            every: function(obj, test) {
    +                var result = true;
    +                if (!obj) {
    +                    return result;
    +                }
    +                $.each(obj, function(key, val) {
    +                    if (!(result = test.call(null, val, key, obj))) {
    +                        return false;
    +                    }
    +                });
    +                return !!result;
    +            },
    +            some: function(obj, test) {
    +                var result = false;
    +                if (!obj) {
    +                    return result;
    +                }
    +                $.each(obj, function(key, val) {
    +                    if (result = test.call(null, val, key, obj)) {
    +                        return false;
    +                    }
    +                });
    +                return !!result;
    +            },
    +            mixin: $.extend,
    +            getUniqueId: function() {
    +                var counter = 0;
    +                return function() {
    +                    return counter++;
    +                };
    +            }(),
    +            templatify: function templatify(obj) {
    +                return $.isFunction(obj) ? obj : template;
    +                function template() {
    +                    return String(obj);
    +                }
    +            },
    +            defer: function(fn) {
    +                setTimeout(fn, 0);
    +            },
    +            debounce: function(func, wait, immediate) {
    +                var timeout, result;
    +                return function() {
    +                    var context = this, args = arguments, later, callNow;
    +                    later = function() {
    +                        timeout = null;
    +                        if (!immediate) {
    +                            result = func.apply(context, args);
    +                        }
    +                    };
    +                    callNow = immediate && !timeout;
    +                    clearTimeout(timeout);
    +                    timeout = setTimeout(later, wait);
    +                    if (callNow) {
    +                        result = func.apply(context, args);
    +                    }
    +                    return result;
    +                };
    +            },
    +            throttle: function(func, wait) {
    +                var context, args, timeout, result, previous, later;
    +                previous = 0;
    +                later = function() {
    +                    previous = new Date();
    +                    timeout = null;
    +                    result = func.apply(context, args);
    +                };
    +                return function() {
    +                    var now = new Date(), remaining = wait - (now - previous);
    +                    context = this;
    +                    args = arguments;
    +                    if (remaining <= 0) {
    +                        clearTimeout(timeout);
    +                        timeout = null;
    +                        previous = now;
    +                        result = func.apply(context, args);
    +                    } else if (!timeout) {
    +                        timeout = setTimeout(later, remaining);
    +                    }
    +                    return result;
    +                };
    +            },
    +            noop: function() {}
    +        };
    +    }();
    +    var html = function() {
    +        return {
    +            wrapper: '<span class="twitter-typeahead"></span>',
    +            dropdown: '<span class="tt-dropdown-menu"></span>',
    +            dataset: '<div class="tt-dataset-%CLASS%"></div>',
    +            suggestions: '<span class="tt-suggestions"></span>',
    +            suggestion: '<div class="tt-suggestion"></div>'
    +        };
    +    }();
    +    var css = function() {
    +        "use strict";
    +        var css = {
    +            wrapper: {
    +                position: "relative",
    +                display: "inline-block"
    +            },
    +            hint: {
    +                position: "absolute",
    +                top: "0",
    +                left: "0",
    +                borderColor: "transparent",
    +                boxShadow: "none",
    +                opacity: "1"
    +            },
    +            input: {
    +                position: "relative",
    +                verticalAlign: "top",
    +                backgroundColor: "transparent"
    +            },
    +            inputWithNoHint: {
    +                position: "relative",
    +                verticalAlign: "top"
    +            },
    +            dropdown: {
    +                position: "absolute",
    +                top: "100%",
    +                left: "0",
    +                zIndex: "100",
    +                display: "none"
    +            },
    +            suggestions: {
    +                display: "block"
    +            },
    +            suggestion: {
    +                whiteSpace: "nowrap",
    +                cursor: "pointer"
    +            },
    +            suggestionChild: {
    +                whiteSpace: "normal"
    +            },
    +            ltr: {
    +                left: "0",
    +                right: "auto"
    +            },
    +            rtl: {
    +                left: "auto",
    +                right: " 0"
    +            }
    +        };
    +        if (_.isMsie()) {
    +            _.mixin(css.input, {
    +                backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"
    +            });
    +        }
    +        if (_.isMsie() && _.isMsie() <= 7) {
    +            _.mixin(css.input, {
    +                marginTop: "-1px"
    +            });
    +        }
    +        return css;
    +    }();
    +    var EventBus = function() {
    +        "use strict";
    +        var namespace = "typeahead:";
    +        function EventBus(o) {
    +            if (!o || !o.el) {
    +                $.error("EventBus initialized without el");
    +            }
    +            this.$el = $(o.el);
    +        }
    +        _.mixin(EventBus.prototype, {
    +            trigger: function(type) {
    +                var args = [].slice.call(arguments, 1);
    +                this.$el.trigger(namespace + type, args);
    +            }
    +        });
    +        return EventBus;
    +    }();
    +    var EventEmitter = function() {
    +        "use strict";
    +        var splitter = /\s+/, nextTick = getNextTick();
    +        return {
    +            onSync: onSync,
    +            onAsync: onAsync,
    +            off: off,
    +            trigger: trigger
    +        };
    +        function on(method, types, cb, context) {
    +            var type;
    +            if (!cb) {
    +                return this;
    +            }
    +            types = types.split(splitter);
    +            cb = context ? bindContext(cb, context) : cb;
    +            this._callbacks = this._callbacks || {};
    +            while (type = types.shift()) {
    +                this._callbacks[type] = this._callbacks[type] || {
    +                    sync: [],
    +                    async: []
    +                };
    +                this._callbacks[type][method].push(cb);
    +            }
    +            return this;
    +        }
    +        function onAsync(types, cb, context) {
    +            return on.call(this, "async", types, cb, context);
    +        }
    +        function onSync(types, cb, context) {
    +            return on.call(this, "sync", types, cb, context);
    +        }
    +        function off(types) {
    +            var type;
    +            if (!this._callbacks) {
    +                return this;
    +            }
    +            types = types.split(splitter);
    +            while (type = types.shift()) {
    +                delete this._callbacks[type];
    +            }
    +            return this;
    +        }
    +        function trigger(types) {
    +            var type, callbacks, args, syncFlush, asyncFlush;
    +            if (!this._callbacks) {
    +                return this;
    +            }
    +            types = types.split(splitter);
    +            args = [].slice.call(arguments, 1);
    +            while ((type = types.shift()) && (callbacks = this._callbacks[type])) {
    +                syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));
    +                asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));
    +                syncFlush() && nextTick(asyncFlush);
    +            }
    +            return this;
    +        }
    +        function getFlush(callbacks, context, args) {
    +            return flush;
    +            function flush() {
    +                var cancelled;
    +                for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {
    +                    cancelled = callbacks[i].apply(context, args) === false;
    +                }
    +                return !cancelled;
    +            }
    +        }
    +        function getNextTick() {
    +            var nextTickFn;
    +            if (window.setImmediate) {
    +                nextTickFn = function nextTickSetImmediate(fn) {
    +                    setImmediate(function() {
    +                        fn();
    +                    });
    +                };
    +            } else {
    +                nextTickFn = function nextTickSetTimeout(fn) {
    +                    setTimeout(function() {
    +                        fn();
    +                    }, 0);
    +                };
    +            }
    +            return nextTickFn;
    +        }
    +        function bindContext(fn, context) {
    +            return fn.bind ? fn.bind(context) : function() {
    +                fn.apply(context, [].slice.call(arguments, 0));
    +            };
    +        }
    +    }();
    +    var highlight = function(doc) {
    +        "use strict";
    +        var defaults = {
    +            node: null,
    +            pattern: null,
    +            tagName: "strong",
    +            className: null,
    +            wordsOnly: false,
    +            caseSensitive: false
    +        };
    +        return function hightlight(o) {
    +            var regex;
    +            o = _.mixin({}, defaults, o);
    +            if (!o.node || !o.pattern) {
    +                return;
    +            }
    +            o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];
    +            regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);
    +            traverse(o.node, hightlightTextNode);
    +            function hightlightTextNode(textNode) {
    +                var match, patternNode, wrapperNode;
    +                if (match = regex.exec(textNode.data)) {
    +                    wrapperNode = doc.createElement(o.tagName);
    +                    o.className && (wrapperNode.className = o.className);
    +                    patternNode = textNode.splitText(match.index);
    +                    patternNode.splitText(match[0].length);
    +                    wrapperNode.appendChild(patternNode.cloneNode(true));
    +                    textNode.parentNode.replaceChild(wrapperNode, patternNode);
    +                }
    +                return !!match;
    +            }
    +            function traverse(el, hightlightTextNode) {
    +                var childNode, TEXT_NODE_TYPE = 3;
    +                for (var i = 0; i < el.childNodes.length; i++) {
    +                    childNode = el.childNodes[i];
    +                    if (childNode.nodeType === TEXT_NODE_TYPE) {
    +                        i += hightlightTextNode(childNode) ? 1 : 0;
    +                    } else {
    +                        traverse(childNode, hightlightTextNode);
    +                    }
    +                }
    +            }
    +        };
    +        function getRegex(patterns, caseSensitive, wordsOnly) {
    +            var escapedPatterns = [], regexStr;
    +            for (var i = 0, len = patterns.length; i < len; i++) {
    +                escapedPatterns.push(_.escapeRegExChars(patterns[i]));
    +            }
    +            regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")";
    +            return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i");
    +        }
    +    }(window.document);
    +    var Input = function() {
    +        "use strict";
    +        var specialKeyCodeMap;
    +        specialKeyCodeMap = {
    +            9: "tab",
    +            27: "esc",
    +            37: "left",
    +            39: "right",
    +            13: "enter",
    +            38: "up",
    +            40: "down"
    +        };
    +        function Input(o) {
    +            var that = this, onBlur, onFocus, onKeydown, onInput;
    +            o = o || {};
    +            if (!o.input) {
    +                $.error("input is missing");
    +            }
    +            onBlur = _.bind(this._onBlur, this);
    +            onFocus = _.bind(this._onFocus, this);
    +            onKeydown = _.bind(this._onKeydown, this);
    +            onInput = _.bind(this._onInput, this);
    +            this.$hint = $(o.hint);
    +            this.$input = $(o.input).on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown);
    +            if (this.$hint.length === 0) {
    +                this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;
    +            }
    +            if (!_.isMsie()) {
    +                this.$input.on("input.tt", onInput);
    +            } else {
    +                this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) {
    +                    if (specialKeyCodeMap[$e.which || $e.keyCode]) {
    +                        return;
    +                    }
    +                    _.defer(_.bind(that._onInput, that, $e));
    +                });
    +            }
    +            this.query = this.$input.val();
    +            this.$overflowHelper = buildOverflowHelper(this.$input);
    +        }
    +        Input.normalizeQuery = function(str) {
    +            return (str || "").replace(/^\s*/g, "").replace(/\s{2,}/g, " ");
    +        };
    +        _.mixin(Input.prototype, EventEmitter, {
    +            _onBlur: function onBlur() {
    +                this.resetInputValue();
    +                this.trigger("blurred");
    +            },
    +            _onFocus: function onFocus() {
    +                this.trigger("focused");
    +            },
    +            _onKeydown: function onKeydown($e) {
    +                var keyName = specialKeyCodeMap[$e.which || $e.keyCode];
    +                this._managePreventDefault(keyName, $e);
    +                if (keyName && this._shouldTrigger(keyName, $e)) {
    +                    this.trigger(keyName + "Keyed", $e);
    +                }
    +            },
    +            _onInput: function onInput() {
    +                this._checkInputValue();
    +            },
    +            _managePreventDefault: function managePreventDefault(keyName, $e) {
    +                var preventDefault, hintValue, inputValue;
    +                switch (keyName) {
    +                  case "tab":
    +                    hintValue = this.getHint();
    +                    inputValue = this.getInputValue();
    +                    preventDefault = hintValue && hintValue !== inputValue && !withModifier($e);
    +                    break;
    +
    +                  case "up":
    +                  case "down":
    +                    preventDefault = !withModifier($e);
    +                    break;
    +
    +                  default:
    +                    preventDefault = false;
    +                }
    +                preventDefault && $e.preventDefault();
    +            },
    +            _shouldTrigger: function shouldTrigger(keyName, $e) {
    +                var trigger;
    +                switch (keyName) {
    +                  case "tab":
    +                    trigger = !withModifier($e);
    +                    break;
    +
    +                  default:
    +                    trigger = true;
    +                }
    +                return trigger;
    +            },
    +            _checkInputValue: function checkInputValue() {
    +                var inputValue, areEquivalent, hasDifferentWhitespace;
    +                inputValue = this.getInputValue();
    +                areEquivalent = areQueriesEquivalent(inputValue, this.query);
    +                hasDifferentWhitespace = areEquivalent ? this.query.length !== inputValue.length : false;
    +                this.query = inputValue;
    +                if (!areEquivalent) {
    +                    this.trigger("queryChanged", this.query);
    +                } else if (hasDifferentWhitespace) {
    +                    this.trigger("whitespaceChanged", this.query);
    +                }
    +            },
    +            focus: function focus() {
    +                this.$input.focus();
    +            },
    +            blur: function blur() {
    +                this.$input.blur();
    +            },
    +            getQuery: function getQuery() {
    +                return this.query;
    +            },
    +            setQuery: function setQuery(query) {
    +                this.query = query;
    +            },
    +            getInputValue: function getInputValue() {
    +                return this.$input.val();
    +            },
    +            setInputValue: function setInputValue(value, silent) {
    +                this.$input.val(value);
    +                silent ? this.clearHint() : this._checkInputValue();
    +            },
    +            resetInputValue: function resetInputValue() {
    +                this.setInputValue(this.query, true);
    +            },
    +            getHint: function getHint() {
    +                return this.$hint.val();
    +            },
    +            setHint: function setHint(value) {
    +                this.$hint.val(value);
    +            },
    +            clearHint: function clearHint() {
    +                this.setHint("");
    +            },
    +            clearHintIfInvalid: function clearHintIfInvalid() {
    +                var val, hint, valIsPrefixOfHint, isValid;
    +                val = this.getInputValue();
    +                hint = this.getHint();
    +                valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;
    +                isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow();
    +                !isValid && this.clearHint();
    +            },
    +            getLanguageDirection: function getLanguageDirection() {
    +                return (this.$input.css("direction") || "ltr").toLowerCase();
    +            },
    +            hasOverflow: function hasOverflow() {
    +                var constraint = this.$input.width() - 2;
    +                this.$overflowHelper.text(this.getInputValue());
    +                return this.$overflowHelper.width() >= constraint;
    +            },
    +            isCursorAtEnd: function() {
    +                var valueLength, selectionStart, range;
    +                valueLength = this.$input.val().length;
    +                selectionStart = this.$input[0].selectionStart;
    +                if (_.isNumber(selectionStart)) {
    +                    return selectionStart === valueLength;
    +                } else if (document.selection) {
    +                    range = document.selection.createRange();
    +                    range.moveStart("character", -valueLength);
    +                    return valueLength === range.text.length;
    +                }
    +                return true;
    +            },
    +            destroy: function destroy() {
    +                this.$hint.off(".tt");
    +                this.$input.off(".tt");
    +                this.$hint = this.$input = this.$overflowHelper = null;
    +            }
    +        });
    +        return Input;
    +        function buildOverflowHelper($input) {
    +            return $('<pre aria-hidden="true"></pre>').css({
    +                position: "absolute",
    +                visibility: "hidden",
    +                whiteSpace: "pre",
    +                fontFamily: $input.css("font-family"),
    +                fontSize: $input.css("font-size"),
    +                fontStyle: $input.css("font-style"),
    +                fontVariant: $input.css("font-variant"),
    +                fontWeight: $input.css("font-weight"),
    +                wordSpacing: $input.css("word-spacing"),
    +                letterSpacing: $input.css("letter-spacing"),
    +                textIndent: $input.css("text-indent"),
    +                textRendering: $input.css("text-rendering"),
    +                textTransform: $input.css("text-transform")
    +            }).insertAfter($input);
    +        }
    +        function areQueriesEquivalent(a, b) {
    +            return Input.normalizeQuery(a) === Input.normalizeQuery(b);
    +        }
    +        function withModifier($e) {
    +            return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;
    +        }
    +    }();
    +    var Dataset = function() {
    +        "use strict";
    +        var datasetKey = "ttDataset", valueKey = "ttValue", datumKey = "ttDatum";
    +        function Dataset(o) {
    +            o = o || {};
    +            o.templates = o.templates || {};
    +            if (!o.source) {
    +                $.error("missing source");
    +            }
    +            if (o.name && !isValidName(o.name)) {
    +                $.error("invalid dataset name: " + o.name);
    +            }
    +            this.query = null;
    +            this.highlight = !!o.highlight;
    +            this.name = o.name || _.getUniqueId();
    +            this.source = o.source;
    +            this.displayFn = getDisplayFn(o.display || o.displayKey);
    +            this.templates = getTemplates(o.templates, this.displayFn);
    +            this.$el = $(html.dataset.replace("%CLASS%", this.name));
    +        }
    +        Dataset.extractDatasetName = function extractDatasetName(el) {
    +            return $(el).data(datasetKey);
    +        };
    +        Dataset.extractValue = function extractDatum(el) {
    +            return $(el).data(valueKey);
    +        };
    +        Dataset.extractDatum = function extractDatum(el) {
    +            return $(el).data(datumKey);
    +        };
    +        _.mixin(Dataset.prototype, EventEmitter, {
    +            _render: function render(query, suggestions) {
    +                if (!this.$el) {
    +                    return;
    +                }
    +                var that = this, hasSuggestions;
    +                this.$el.empty();
    +                hasSuggestions = suggestions && suggestions.length;
    +                if (!hasSuggestions && this.templates.empty) {
    +                    this.$el.html(getEmptyHtml()).prepend(that.templates.header ? getHeaderHtml() : null).append(that.templates.footer ? getFooterHtml() : null);
    +                } else if (hasSuggestions) {
    +                    this.$el.html(getSuggestionsHtml()).prepend(that.templates.header ? getHeaderHtml() : null).append(that.templates.footer ? getFooterHtml() : null);
    +                }
    +                this.trigger("rendered");
    +                function getEmptyHtml() {
    +                    return that.templates.empty({
    +                        query: query,
    +                        isEmpty: true
    +                    });
    +                }
    +                function getSuggestionsHtml() {
    +                    var $suggestions, nodes;
    +                    $suggestions = $(html.suggestions).css(css.suggestions);
    +                    nodes = _.map(suggestions, getSuggestionNode);
    +                    $suggestions.append.apply($suggestions, nodes);
    +                    that.highlight && highlight({
    +                        className: "tt-highlight",
    +                        node: $suggestions[0],
    +                        pattern: query
    +                    });
    +                    return $suggestions;
    +                    function getSuggestionNode(suggestion) {
    +                        var $el;
    +                        $el = $(html.suggestion).append(that.templates.suggestion(suggestion)).data(datasetKey, that.name).data(valueKey, that.displayFn(suggestion)).data(datumKey, suggestion);
    +                        $el.children().each(function() {
    +                            $(this).css(css.suggestionChild);
    +                        });
    +                        return $el;
    +                    }
    +                }
    +                function getHeaderHtml() {
    +                    return that.templates.header({
    +                        query: query,
    +                        isEmpty: !hasSuggestions
    +                    });
    +                }
    +                function getFooterHtml() {
    +                    return that.templates.footer({
    +                        query: query,
    +                        isEmpty: !hasSuggestions
    +                    });
    +                }
    +            },
    +            getRoot: function getRoot() {
    +                return this.$el;
    +            },
    +            update: function update(query) {
    +                var that = this;
    +                this.query = query;
    +                this.canceled = false;
    +                this.source(query, render);
    +                function render(suggestions) {
    +                    if (!that.canceled && query === that.query) {
    +                        that._render(query, suggestions);
    +                    }
    +                }
    +            },
    +            cancel: function cancel() {
    +                this.canceled = true;
    +            },
    +            clear: function clear() {
    +                this.cancel();
    +                this.$el.empty();
    +                this.trigger("rendered");
    +            },
    +            isEmpty: function isEmpty() {
    +                return this.$el.is(":empty");
    +            },
    +            destroy: function destroy() {
    +                this.$el = null;
    +            }
    +        });
    +        return Dataset;
    +        function getDisplayFn(display) {
    +            display = display || "value";
    +            return _.isFunction(display) ? display : displayFn;
    +            function displayFn(obj) {
    +                return obj[display];
    +            }
    +        }
    +        function getTemplates(templates, displayFn) {
    +            return {
    +                empty: templates.empty && _.templatify(templates.empty),
    +                header: templates.header && _.templatify(templates.header),
    +                footer: templates.footer && _.templatify(templates.footer),
    +                suggestion: templates.suggestion || suggestionTemplate
    +            };
    +            function suggestionTemplate(context) {
    +                return "<p>" + displayFn(context) + "</p>";
    +            }
    +        }
    +        function isValidName(str) {
    +            return /^[_a-zA-Z0-9-]+$/.test(str);
    +        }
    +    }();
    +    var Dropdown = function() {
    +        "use strict";
    +        function Dropdown(o) {
    +            var that = this, onSuggestionClick, onSuggestionMouseEnter, onSuggestionMouseLeave;
    +            o = o || {};
    +            if (!o.menu) {
    +                $.error("menu is required");
    +            }
    +            this.isOpen = false;
    +            this.isEmpty = true;
    +            this.datasets = _.map(o.datasets, initializeDataset);
    +            onSuggestionClick = _.bind(this._onSuggestionClick, this);
    +            onSuggestionMouseEnter = _.bind(this._onSuggestionMouseEnter, this);
    +            onSuggestionMouseLeave = _.bind(this._onSuggestionMouseLeave, this);
    +            this.$menu = $(o.menu).on("click.tt", ".tt-suggestion", onSuggestionClick).on("mouseenter.tt", ".tt-suggestion", onSuggestionMouseEnter).on("mouseleave.tt", ".tt-suggestion", onSuggestionMouseLeave);
    +            _.each(this.datasets, function(dataset) {
    +                that.$menu.append(dataset.getRoot());
    +                dataset.onSync("rendered", that._onRendered, that);
    +            });
    +        }
    +        _.mixin(Dropdown.prototype, EventEmitter, {
    +            _onSuggestionClick: function onSuggestionClick($e) {
    +                this.trigger("suggestionClicked", $($e.currentTarget));
    +            },
    +            _onSuggestionMouseEnter: function onSuggestionMouseEnter($e) {
    +                this._removeCursor();
    +                this._setCursor($($e.currentTarget), true);
    +            },
    +            _onSuggestionMouseLeave: function onSuggestionMouseLeave() {
    +                this._removeCursor();
    +            },
    +            _onRendered: function onRendered() {
    +                this.isEmpty = _.every(this.datasets, isDatasetEmpty);
    +                this.isEmpty ? this._hide() : this.isOpen && this._show();
    +                this.trigger("datasetRendered");
    +                function isDatasetEmpty(dataset) {
    +                    return dataset.isEmpty();
    +                }
    +            },
    +            _hide: function() {
    +                this.$menu.hide();
    +            },
    +            _show: function() {
    +                this.$menu.css("display", "block");
    +            },
    +            _getSuggestions: function getSuggestions() {
    +                return this.$menu.find(".tt-suggestion");
    +            },
    +            _getCursor: function getCursor() {
    +                return this.$menu.find(".tt-cursor").first();
    +            },
    +            _setCursor: function setCursor($el, silent) {
    +                $el.first().addClass("tt-cursor");
    +                !silent && this.trigger("cursorMoved");
    +            },
    +            _removeCursor: function removeCursor() {
    +                this._getCursor().removeClass("tt-cursor");
    +            },
    +            _moveCursor: function moveCursor(increment) {
    +                var $suggestions, $oldCursor, newCursorIndex, $newCursor;
    +                if (!this.isOpen) {
    +                    return;
    +                }
    +                $oldCursor = this._getCursor();
    +                $suggestions = this._getSuggestions();
    +                this._removeCursor();
    +                newCursorIndex = $suggestions.index($oldCursor) + increment;
    +                newCursorIndex = (newCursorIndex + 1) % ($suggestions.length + 1) - 1;
    +                if (newCursorIndex === -1) {
    +                    this.trigger("cursorRemoved");
    +                    return;
    +                } else if (newCursorIndex < -1) {
    +                    newCursorIndex = $suggestions.length - 1;
    +                }
    +                this._setCursor($newCursor = $suggestions.eq(newCursorIndex));
    +                this._ensureVisible($newCursor);
    +            },
    +            _ensureVisible: function ensureVisible($el) {
    +                var elTop, elBottom, menuScrollTop, menuHeight;
    +                elTop = $el.position().top;
    +                elBottom = elTop + $el.outerHeight(true);
    +                menuScrollTop = this.$menu.scrollTop();
    +                menuHeight = this.$menu.height() + parseInt(this.$menu.css("paddingTop"), 10) + parseInt(this.$menu.css("paddingBottom"), 10);
    +                if (elTop < 0) {
    +                    this.$menu.scrollTop(menuScrollTop + elTop);
    +                } else if (menuHeight < elBottom) {
    +                    this.$menu.scrollTop(menuScrollTop + (elBottom - menuHeight));
    +                }
    +            },
    +            close: function close() {
    +                if (this.isOpen) {
    +                    this.isOpen = false;
    +                    this._removeCursor();
    +                    this._hide();
    +                    this.trigger("closed");
    +                }
    +            },
    +            open: function open() {
    +                if (!this.isOpen) {
    +                    this.isOpen = true;
    +                    !this.isEmpty && this._show();
    +                    this.trigger("opened");
    +                }
    +            },
    +            setLanguageDirection: function setLanguageDirection(dir) {
    +                this.$menu.css(dir === "ltr" ? css.ltr : css.rtl);
    +            },
    +            moveCursorUp: function moveCursorUp() {
    +                this._moveCursor(-1);
    +            },
    +            moveCursorDown: function moveCursorDown() {
    +                this._moveCursor(+1);
    +            },
    +            getDatumForSuggestion: function getDatumForSuggestion($el) {
    +                var datum = null;
    +                if ($el.length) {
    +                    datum = {
    +                        raw: Dataset.extractDatum($el),
    +                        value: Dataset.extractValue($el),
    +                        datasetName: Dataset.extractDatasetName($el)
    +                    };
    +                }
    +                return datum;
    +            },
    +            getDatumForCursor: function getDatumForCursor() {
    +                return this.getDatumForSuggestion(this._getCursor().first());
    +            },
    +            getDatumForTopSuggestion: function getDatumForTopSuggestion() {
    +                return this.getDatumForSuggestion(this._getSuggestions().first());
    +            },
    +            update: function update(query) {
    +                _.each(this.datasets, updateDataset);
    +                function updateDataset(dataset) {
    +                    dataset.update(query);
    +                }
    +            },
    +            empty: function empty() {
    +                _.each(this.datasets, clearDataset);
    +                this.isEmpty = true;
    +                function clearDataset(dataset) {
    +                    dataset.clear();
    +                }
    +            },
    +            isVisible: function isVisible() {
    +                return this.isOpen && !this.isEmpty;
    +            },
    +            destroy: function destroy() {
    +                this.$menu.off(".tt");
    +                this.$menu = null;
    +                _.each(this.datasets, destroyDataset);
    +                function destroyDataset(dataset) {
    +                    dataset.destroy();
    +                }
    +            }
    +        });
    +        return Dropdown;
    +        function initializeDataset(oDataset) {
    +            return new Dataset(oDataset);
    +        }
    +    }();
    +    var Typeahead = function() {
    +        "use strict";
    +        var attrsKey = "ttAttrs";
    +        function Typeahead(o) {
    +            var $menu, $input, $hint;
    +            o = o || {};
    +            if (!o.input) {
    +                $.error("missing input");
    +            }
    +            this.isActivated = false;
    +            this.autoselect = !!o.autoselect;
    +            this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;
    +            this.$node = buildDom(o.input, o.withHint);
    +            $menu = this.$node.find(".tt-dropdown-menu");
    +            $input = this.$node.find(".tt-input");
    +            $hint = this.$node.find(".tt-hint");
    +            $input.on("blur.tt", function($e) {
    +                var active, isActive, hasActive;
    +                active = document.activeElement;
    +                isActive = $menu.is(active);
    +                hasActive = $menu.has(active).length > 0;
    +                if (_.isMsie() && (isActive || hasActive)) {
    +                    $e.preventDefault();
    +                    $e.stopImmediatePropagation();
    +                    _.defer(function() {
    +                        $input.focus();
    +                    });
    +                }
    +            });
    +            $menu.on("mousedown.tt", function($e) {
    +                $e.preventDefault();
    +            });
    +            this.eventBus = o.eventBus || new EventBus({
    +                el: $input
    +            });
    +            this.dropdown = new Dropdown({
    +                menu: $menu,
    +                datasets: o.datasets
    +            }).onSync("suggestionClicked", this._onSuggestionClicked, this).onSync("cursorMoved", this._onCursorMoved, this).onSync("cursorRemoved", this._onCursorRemoved, this).onSync("opened", this._onOpened, this).onSync("closed", this._onClosed, this).onAsync("datasetRendered", this._onDatasetRendered, this);
    +            this.input = new Input({
    +                input: $input,
    +                hint: $hint
    +            }).onSync("focused", this._onFocused, this).onSync("blurred", this._onBlurred, this).onSync("enterKeyed", this._onEnterKeyed, this).onSync("tabKeyed", this._onTabKeyed, this).onSync("escKeyed", this._onEscKeyed, this).onSync("upKeyed", this._onUpKeyed, this).onSync("downKeyed", this._onDownKeyed, this).onSync("leftKeyed", this._onLeftKeyed, this).onSync("rightKeyed", this._onRightKeyed, this).onSync("queryChanged", this._onQueryChanged, this).onSync("whitespaceChanged", this._onWhitespaceChanged, this);
    +            this._setLanguageDirection();
    +        }
    +        _.mixin(Typeahead.prototype, {
    +            _onSuggestionClicked: function onSuggestionClicked(type, $el) {
    +                var datum;
    +                if (datum = this.dropdown.getDatumForSuggestion($el)) {
    +                    this._select(datum);
    +                }
    +            },
    +            _onCursorMoved: function onCursorMoved() {
    +                var datum = this.dropdown.getDatumForCursor();
    +                this.input.setInputValue(datum.value, true);
    +                this.eventBus.trigger("cursorchanged", datum.raw, datum.datasetName);
    +            },
    +            _onCursorRemoved: function onCursorRemoved() {
    +                this.input.resetInputValue();
    +                this._updateHint();
    +            },
    +            _onDatasetRendered: function onDatasetRendered() {
    +                this._updateHint();
    +            },
    +            _onOpened: function onOpened() {
    +                this._updateHint();
    +                this.eventBus.trigger("opened");
    +            },
    +            _onClosed: function onClosed() {
    +                this.input.clearHint();
    +                this.eventBus.trigger("closed");
    +            },
    +            _onFocused: function onFocused() {
    +                this.isActivated = true;
    +                this.dropdown.open();
    +            },
    +            _onBlurred: function onBlurred() {
    +                this.isActivated = false;
    +                this.dropdown.empty();
    +                this.dropdown.close();
    +            },
    +            _onEnterKeyed: function onEnterKeyed(type, $e) {
    +                var cursorDatum, topSuggestionDatum;
    +                cursorDatum = this.dropdown.getDatumForCursor();
    +                topSuggestionDatum = this.dropdown.getDatumForTopSuggestion();
    +                if (cursorDatum) {
    +                    this._select(cursorDatum);
    +                    $e.preventDefault();
    +                } else if (this.autoselect && topSuggestionDatum) {
    +                    this._select(topSuggestionDatum);
    +                    $e.preventDefault();
    +                }
    +            },
    +            _onTabKeyed: function onTabKeyed(type, $e) {
    +                var datum;
    +                if (datum = this.dropdown.getDatumForCursor()) {
    +                    this._select(datum);
    +                    $e.preventDefault();
    +                } else {
    +                    this._autocomplete(true);
    +                }
    +            },
    +            _onEscKeyed: function onEscKeyed() {
    +                this.dropdown.close();
    +                this.input.resetInputValue();
    +            },
    +            _onUpKeyed: function onUpKeyed() {
    +                var query = this.input.getQuery();
    +                this.dropdown.isEmpty && query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.moveCursorUp();
    +                this.dropdown.open();
    +            },
    +            _onDownKeyed: function onDownKeyed() {
    +                var query = this.input.getQuery();
    +                this.dropdown.isEmpty && query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.moveCursorDown();
    +                this.dropdown.open();
    +            },
    +            _onLeftKeyed: function onLeftKeyed() {
    +                this.dir === "rtl" && this._autocomplete();
    +            },
    +            _onRightKeyed: function onRightKeyed() {
    +                this.dir === "ltr" && this._autocomplete();
    +            },
    +            _onQueryChanged: function onQueryChanged(e, query) {
    +                this.input.clearHintIfInvalid();
    +                query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.empty();
    +                this.dropdown.open();
    +                this._setLanguageDirection();
    +            },
    +            _onWhitespaceChanged: function onWhitespaceChanged() {
    +                this._updateHint();
    +                this.dropdown.open();
    +            },
    +            _setLanguageDirection: function setLanguageDirection() {
    +                var dir;
    +                if (this.dir !== (dir = this.input.getLanguageDirection())) {
    +                    this.dir = dir;
    +                    this.$node.css("direction", dir);
    +                    this.dropdown.setLanguageDirection(dir);
    +                }
    +            },
    +            _updateHint: function updateHint() {
    +                var datum, val, query, escapedQuery, frontMatchRegEx, match;
    +                datum = this.dropdown.getDatumForTopSuggestion();
    +                if (datum && this.dropdown.isVisible() && !this.input.hasOverflow()) {
    +                    val = this.input.getInputValue();
    +                    query = Input.normalizeQuery(val);
    +                    escapedQuery = _.escapeRegExChars(query);
    +                    frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i");
    +                    match = frontMatchRegEx.exec(datum.value);
    +                    match ? this.input.setHint(val + match[1]) : this.input.clearHint();
    +                } else {
    +                    this.input.clearHint();
    +                }
    +            },
    +            _autocomplete: function autocomplete(laxCursor) {
    +                var hint, query, isCursorAtEnd, datum;
    +                hint = this.input.getHint();
    +                query = this.input.getQuery();
    +                isCursorAtEnd = laxCursor || this.input.isCursorAtEnd();
    +                if (hint && query !== hint && isCursorAtEnd) {
    +                    datum = this.dropdown.getDatumForTopSuggestion();
    +                    datum && this.input.setInputValue(datum.value);
    +                    this.eventBus.trigger("autocompleted", datum.raw, datum.datasetName);
    +                }
    +            },
    +            _select: function select(datum) {
    +                this.input.setQuery(datum.value);
    +                this.input.setInputValue(datum.value, true);
    +                this._setLanguageDirection();
    +                this.eventBus.trigger("selected", datum.raw, datum.datasetName);
    +                this.dropdown.close();
    +                _.defer(_.bind(this.dropdown.empty, this.dropdown));
    +            },
    +            open: function open() {
    +                this.dropdown.open();
    +            },
    +            close: function close() {
    +                this.dropdown.close();
    +            },
    +            setVal: function setVal(val) {
    +                val = _.toStr(val);
    +                if (this.isActivated) {
    +                    this.input.setInputValue(val);
    +                } else {
    +                    this.input.setQuery(val);
    +                    this.input.setInputValue(val, true);
    +                }
    +                this._setLanguageDirection();
    +            },
    +            getVal: function getVal() {
    +                return this.input.getQuery();
    +            },
    +            destroy: function destroy() {
    +                this.input.destroy();
    +                this.dropdown.destroy();
    +                destroyDomStructure(this.$node);
    +                this.$node = null;
    +            }
    +        });
    +        return Typeahead;
    +        function buildDom(input, withHint) {
    +            var $input, $wrapper, $dropdown, $hint;
    +            $input = $(input);
    +            $wrapper = $(html.wrapper).css(css.wrapper);
    +            $dropdown = $(html.dropdown).css(css.dropdown);
    +            $hint = $input.clone().css(css.hint).css(getBackgroundStyles($input));
    +            $hint.val("").removeData().addClass("tt-hint").removeAttr("id name placeholder required").prop("readonly", true).attr({
    +                autocomplete: "off",
    +                spellcheck: "false",
    +                tabindex: -1
    +            });
    +            $input.data(attrsKey, {
    +                dir: $input.attr("dir"),
    +                autocomplete: $input.attr("autocomplete"),
    +                spellcheck: $input.attr("spellcheck"),
    +                style: $input.attr("style")
    +            });
    +            $input.addClass("tt-input").attr({
    +                autocomplete: "off",
    +                spellcheck: false
    +            }).css(withHint ? css.input : css.inputWithNoHint);
    +            try {
    +                !$input.attr("dir") && $input.attr("dir", "auto");
    +            } catch (e) {}
    +            return $input.wrap($wrapper).parent().prepend(withHint ? $hint : null).append($dropdown);
    +        }
    +        function getBackgroundStyles($el) {
    +            return {
    +                backgroundAttachment: $el.css("background-attachment"),
    +                backgroundClip: $el.css("background-clip"),
    +                backgroundColor: $el.css("background-color"),
    +                backgroundImage: $el.css("background-image"),
    +                backgroundOrigin: $el.css("background-origin"),
    +                backgroundPosition: $el.css("background-position"),
    +                backgroundRepeat: $el.css("background-repeat"),
    +                backgroundSize: $el.css("background-size")
    +            };
    +        }
    +        function destroyDomStructure($node) {
    +            var $input = $node.find(".tt-input");
    +            _.each($input.data(attrsKey), function(val, key) {
    +                _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);
    +            });
    +            $input.detach().removeData(attrsKey).removeClass("tt-input").insertAfter($node);
    +            $node.remove();
    +        }
    +    }();
    +    (function() {
    +        "use strict";
    +        var old, typeaheadKey, methods;
    +        old = $.fn.typeahead;
    +        typeaheadKey = "ttTypeahead";
    +        methods = {
    +            initialize: function initialize(o, datasets) {
    +                datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);
    +                o = o || {};
    +                return this.each(attach);
    +                function attach() {
    +                    var $input = $(this), eventBus, typeahead;
    +                    _.each(datasets, function(d) {
    +                        d.highlight = !!o.highlight;
    +                    });
    +                    typeahead = new Typeahead({
    +                        input: $input,
    +                        eventBus: eventBus = new EventBus({
    +                            el: $input
    +                        }),
    +                        withHint: _.isUndefined(o.hint) ? true : !!o.hint,
    +                        minLength: o.minLength,
    +                        autoselect: o.autoselect,
    +                        datasets: datasets
    +                    });
    +                    $input.data(typeaheadKey, typeahead);
    +                }
    +            },
    +            open: function open() {
    +                return this.each(openTypeahead);
    +                function openTypeahead() {
    +                    var $input = $(this), typeahead;
    +                    if (typeahead = $input.data(typeaheadKey)) {
    +                        typeahead.open();
    +                    }
    +                }
    +            },
    +            close: function close() {
    +                return this.each(closeTypeahead);
    +                function closeTypeahead() {
    +                    var $input = $(this), typeahead;
    +                    if (typeahead = $input.data(typeaheadKey)) {
    +                        typeahead.close();
    +                    }
    +                }
    +            },
    +            val: function val(newVal) {
    +                return !arguments.length ? getVal(this.first()) : this.each(setVal);
    +                function setVal() {
    +                    var $input = $(this), typeahead;
    +                    if (typeahead = $input.data(typeaheadKey)) {
    +                        typeahead.setVal(newVal);
    +                    }
    +                }
    +                function getVal($input) {
    +                    var typeahead, query;
    +                    if (typeahead = $input.data(typeaheadKey)) {
    +                        query = typeahead.getVal();
    +                    }
    +                    return query;
    +                }
    +            },
    +            destroy: function destroy() {
    +                return this.each(unattach);
    +                function unattach() {
    +                    var $input = $(this), typeahead;
    +                    if (typeahead = $input.data(typeaheadKey)) {
    +                        typeahead.destroy();
    +                        $input.removeData(typeaheadKey);
    +                    }
    +                }
    +            }
    +        };
    +        $.fn.typeahead = function(method) {
    +            var tts;
    +            if (methods[method] && method !== "initialize") {
    +                tts = this.filter(function() {
    +                    return !!$(this).data(typeaheadKey);
    +                });
    +                return methods[method].apply(tts, [].slice.call(arguments, 1));
    +            } else {
    +                return methods.initialize.apply(this, arguments);
    +            }
    +        };
    +        $.fn.typeahead.noConflict = function noConflict() {
    +            $.fn.typeahead = old;
    +            return this;
    +        };
    +    })();
    +})(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ace/js/x-editable/ace-editable.js b/src/main/webapp/plug-in/ace/js/x-editable/ace-editable.js
    new file mode 100644
    index 00000000..fcba1cf0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ace/js/x-editable/ace-editable.js
    @@ -0,0 +1,496 @@
    +/**
    +Image editable input.
    +**/
    +(function ($) {
    +    "use strict";
    +    
    +    var Image = function (options) {
    +        this.init('image', options, Image.defaults);
    +
    +		if('on_error' in options.image) {
    +			this.on_error = options.image['on_error'];
    +			delete options.image['on_error']
    +		}
    +		if('on_success' in options.image) {
    +			this.on_success = options.image['on_success'];
    +			delete options.image['on_success']
    +		}
    +		if('max_size' in options.image) {
    +			this.max_size = options.image['max_size'];
    +			delete options.image['max_size']
    +		}
    +
    +		this.initImage(options, Image.defaults);
    +    };
    +
    +    //inherit from Abstract input
    +    $.fn.editableutils.inherit(Image, $.fn.editabletypes.abstractinput);
    +
    +    $.extend(Image.prototype, {
    +		initImage: function(options, defaults) {
    +          this.options.image = $.extend({}, defaults.image, options.image);
    +		  this.name = this.options.image.name || 'editable-image-input';
    +        },
    +
    +        /**
    +        Renders input from tpl
    +
    +        @method render() 
    +        **/        
    +        render: function() {
    +			var self = this;
    +			this.$input = this.$tpl.find('input[type=hidden]:eq(0)');
    +			this.$file = this.$tpl.find('input[type=file]:eq(0)');
    +
    +			this.$file.attr({'name':this.name});
    +			this.$input.attr({'name':this.name+'-hidden'});
    +			
    +			
    +			this.options.image.allowExt = this.options.image.allowExt || ['jpg', 'jpeg', 'png', 'gif'];
    +			this.options.image.allowMime = this.options.image.allowMime || ['image/jpg', 'image/jpeg', 'image/png', 'image/gif'];
    +			this.options.image.maxSize = self.max_size || this.options.image.maxSize || false;
    +			
    +			this.options.image.before_remove = this.options.image.before_remove || function() {
    +				self.$input.val(null);
    +				return true;
    +			}
    +
    +			this.$file.ace_file_input(this.options.image).on('change', function(){
    +				var $rand = (self.$file.val() || self.$file.data('ace_input_files')) ? Math.random() + "" + (new Date()).getTime() : null;
    +				self.$input.val($rand)//set a random value, so that selected file is uploaded each time, even if it's the same file, because inline editable plugin does not update if the value is not changed!
    +			}).closest('.ace-file-input').css({'width':'150px'}).closest('.editable-input').addClass('editable-image');
    +			
    +			this.$file
    +			.off('file.error.ace')
    +			.on('file.error.ace', function(e, info) {
    +				if( !self.on_error ) return;
    +				if( info.error_count['ext'] > 0 || info.error_count['mime'] > 0 ) {
    +					//wrong ext or mime?
    +					self.on_error(1);
    +				}
    +				else if( info.error_count['size'] > 0 ) {
    +					//wrong size
    +					self.on_error(2);
    +				}
    +			});
    +		}
    +
    +    });
    +
    +	
    +    Image.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
    +        tpl: '<span><input type="hidden" /></span><span><input type="file" /></span>',
    +        inputclass: '',
    +		image:
    +		{
    +			style: 'well',
    +			btn_choose: 'Change Image',
    +			btn_change: null,
    +			no_icon: 'fa fa-picture-o',
    +			thumbnail: 'large'
    +		}
    +    });
    +
    +    $.fn.editabletypes.image = Image;
    +
    +}(window.jQuery));
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +//Wysiwyg
    +(function ($) {
    +    "use strict";
    +    
    +    var Wysiwyg = function (options) {
    +        this.init('wysiwyg', options, Wysiwyg.defaults);
    +        
    +        //extend wysiwyg manually as $.extend not recursive 
    +        this.options.wysiwyg = $.extend({}, Wysiwyg.defaults.wysiwyg, options.wysiwyg);
    +    };
    +
    +    $.fn.editableutils.inherit(Wysiwyg, $.fn.editabletypes.abstractinput);
    +
    +    $.extend(Wysiwyg.prototype, {
    +        render: function () {
    +			this.$editor = this.$input.nextAll('.wysiwyg-editor:eq(0)');
    +			
    +			this.$tpl.parent().find('.wysiwyg-editor').show().ace_wysiwyg(
    +			 {
    +				toolbar:
    +				[
    +				'bold',
    +				'italic',
    +				'strikethrough',
    +				'underline',
    +				null,
    +				'foreColor',
    +				null,
    +				'insertImage'
    +				]
    +			  }
    +			)
    +			.prev().addClass('wysiwyg-style2')
    +			.closest('.editable-input').addClass('editable-wysiwyg')
    +			.closest('.editable-container').css({'display':'block'});//if display is inline-block, putting large images inside the editor will expand it out of bounding box!
    +
    +			if(this.options.wysiwyg && this.options.wysiwyg.css) 
    +				this.$tpl.closest('.editable-wysiwyg').css(this.options.wysiwyg.css);
    +        },
    +
    +
    +        value2html: function(value, element) {
    +            $(element).html(value);
    +			return false;
    +        },
    +
    +        html2value: function(html) {
    +			return html;
    +        },
    +
    +        value2input: function(value) {
    +			this.$editor.html(value);
    +        },
    +		input2value: function() { 
    +			return this.$editor.html();
    +        },
    +
    +        activate: function() {
    +           //this.$editor.focus().get(0).setSelectionRange(200,200);
    +        }
    +    });
    +	
    +
    +
    +    Wysiwyg.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
    +		tpl: '<input type="hidden" /><div class="wysiwyg-editor"></div>',
    +        inputclass: 'editable-wysiwyg',
    +        wysiwyg: {
    +            
    +        }
    +    });
    +
    +    $.fn.editabletypes.wysiwyg = Wysiwyg;
    +
    +}(window.jQuery));
    +
    +
    +
    +
    +
    +
    +
    +
    +/**
    +Spinner editable input.
    +**/
    +(function ($) {
    +    "use strict";
    +    
    +    var Spinner = function (options) {
    +        this.init('spinner', options, Spinner.defaults);
    +		this.initSpinner(options, Spinner.defaults);
    +		
    +		this.nativeUI = false;
    +		try {
    +			var tmp_inp = document.createElement('INPUT');
    +			tmp_inp.type = 'number';
    +			this.nativeUI = tmp_inp.type === 'number' && this.options.spinner.nativeUI === true
    +		} catch(e) {}
    +    };
    +
    +    //inherit from Abstract input
    +    $.fn.editableutils.inherit(Spinner, $.fn.editabletypes.abstractinput);
    +
    +    $.extend(Spinner.prototype, {
    +		initSpinner: function(options, defaults) {
    +            this.options.spinner = $.extend({}, defaults.spinner, options.spinner);
    +        },
    +
    +        /**
    +        Renders input from tpl
    +
    +        @method render() 
    +        **/        
    +        render: function() {
    +		},
    +       
    +        /**
    +        Activates input: sets focus on the first field.
    +        
    +        @method activate() 
    +       **/        
    +       activate: function() {
    +            if(this.$input.is(':visible')) {
    +				this.$input.focus();
    +				$.fn.editableutils.setCursorPosition(this.$input.get(0), this.$input.val().length);
    +				
    +				if(!this.nativeUI) {
    +					var val = parseInt(this.$input.val());
    +					var options = $.extend({value:val}, this.options.spinner);
    +					this.$input.ace_spinner(options);
    +				}
    +				else {
    +					this.$input.get(0).type = 'number';
    +					var options = ['min', 'max', 'step']
    +					for(var o = 0 ; o < options.length; o++) {
    +						if(options[o] in this.options.spinner)
    +							this.$input.attr(options[o] , this.options.spinner[options[o]])
    +					}
    +				}
    +            }
    +       },
    +       
    +       /**
    +        Attaches handler to submit form in case of 'showbuttons=false' mode
    +        
    +        @method autosubmit() 
    +       **/       
    +       autosubmit: function() {
    +           this.$input.keydown(function (e) {
    +                if (e.which === 13) {
    +                    $(this).closest('form').submit();
    +                }
    +           });
    +       }       
    +    });
    +
    +    Spinner.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
    +        tpl: '<input type="text" />',
    +        inputclass: '',
    +		spinner:{
    +			min:0,
    +			max:100,
    +			step:1,
    +			icon_up:'fa fa-plus',
    +			icon_down:'fa fa-minus',
    +			btn_up_class:'btn-success',
    +			btn_down_class:'btn-danger'
    +        }
    +    });
    +
    +    $.fn.editabletypes.spinner = Spinner;
    +
    +}(window.jQuery));
    +
    +
    +
    +
    +
    +
    +
    +
    +/**
    +Slider editable input.
    +**/
    +(function ($) {
    +    "use strict";
    +    
    +    var Slider = function (options) {
    +        this.init('slider', options, Slider.defaults);
    +		this.initSlider(options, Slider.defaults);
    +		
    +		this.nativeUI = false;
    +		try {
    +			var tmp_inp = document.createElement('INPUT');
    +			tmp_inp.type = 'range';
    +			this.nativeUI = tmp_inp.type === 'range' && this.options.slider.nativeUI === true
    +		} catch(e) {}
    +    };
    +
    +    //inherit from Abstract input
    +    $.fn.editableutils.inherit(Slider, $.fn.editabletypes.abstractinput);
    +
    +    $.extend(Slider.prototype, {
    +		initSlider: function(options, defaults) {
    +            this.options.slider = $.extend({}, defaults.slider, options.slider);
    +        },
    +
    +        /**
    +        Renders input from tpl
    +
    +        @method render() 
    +        **/        
    +        render: function() {
    +		},
    +        /**
    +        Activates input: sets focus on the first field.
    +        
    +        @method activate() 
    +       **/
    +       activate: function() {
    +            if(this.$input.is(':visible')) {
    +				this.$input.focus();
    +				$.fn.editableutils.setCursorPosition(this.$input.get(0), this.$input.val().length);
    +
    +				if(!this.nativeUI) {
    +					var self = this;
    +					var val = parseInt(this.$input.val());
    +					var width = this.options.slider.width || 200;
    +					var options = $.extend(this.options.slider , {
    +						value:val,
    +						slide: function( event, ui ) {
    +							var val = parseInt(ui.value);
    +							self.$input.val(val);
    +							
    +							if(ui.handle.firstChild == null) {//no tooltips attached to it
    +								$(ui.handle).prepend("<div class='tooltip top in' style='display:none; top:-38px; left:-5px;'><div class='tooltip-arrow'></div><div class='tooltip-inner'></div></div>");
    +							}
    +							$(ui.handle.firstChild).show().children().eq(1).text(val);
    +						}
    +					});
    +					this.$input.parent().addClass('editable-slider').css('width', width+'px').slider(options);
    +				}
    +				else {
    +					this.$input.get(0).type = 'range';
    +					var options = ['min', 'max', 'step']
    +					for(var o = 0 ; o < options.length; o++) {
    +						if(options[o] in this.options.slider) {							
    +							this.$input[0][options[o]] = this.options.slider[options[o]]
    +						}
    +					}
    +					var width = this.options.slider.width || 200;
    +					this.$input.parent().addClass('editable-slider').css('width', width+'px');
    +				}
    +				
    +            }
    +       },
    +	   
    +	   value2html: function(value, element) {
    +       },
    +
    +       /**
    +        Attaches handler to submit form in case of 'showbuttons=false' mode
    +        
    +        @method autosubmit() 
    +       **/       
    +       autosubmit: function() {
    +           this.$input.keydown(function (e) {
    +                if (e.which === 13) {
    +                    $(this).closest('form').submit();
    +                }
    +           });
    +       }       
    +    });
    +
    +    Slider.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
    +        tpl: '<input type="text" /><span class="inline ui-slider-green"><span class="slider-display"></span></span>',
    +        inputclass: '',
    +		slider:{
    +			min:1,
    +			max:100,
    +			step:1,
    +			range: "min"
    +        }
    +    });
    +
    +    $.fn.editabletypes.slider = Slider;
    +
    +}(window.jQuery));
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +/**
    +ADate editable input.
    +**/
    +(function ($) {
    +    "use strict";
    +	
    +	
    +
    +    
    +    var ADate = function (options) {
    +        this.init('adate', options, ADate.defaults);
    +		this.initDate(options, ADate.defaults);
    +
    +		this.nativeUI = false;
    +		try {
    +			var tmp_inp = document.createElement('INPUT');
    +			tmp_inp.type = 'date';
    +			this.nativeUI = tmp_inp.type === 'date' && this.options.date.nativeUI === true
    +		} catch(e) {}
    +    };
    +
    +    //inherit from Abstract input
    +    $.fn.editableutils.inherit(ADate, $.fn.editabletypes.abstractinput);
    +
    +    $.extend(ADate.prototype, {
    +		initDate: function(options, defaults) {
    +            this.options.date = $.extend({}, defaults.date, options.date);
    +        },
    +
    +        /**
    +        Renders input from tpl
    +
    +        @method render() 
    +        **/        
    +        render: function() {
    +			this.$input = this.$tpl.find('input.date');
    +		},
    +        /**
    +        Activates input: sets focus on the first field.
    +        
    +        @method activate() 
    +       **/
    +       activate: function() {
    +            if(this.$input.is(':visible')) {
    +				this.$input.focus();
    +            }
    +
    +			if(!this.nativeUI) {
    +				var inp = this.$input;
    +				this.$input.datepicker(this.options.date)
    +				var picker = inp.data('datepicker');
    +				if(picker) {
    +					inp.on('click', function() {
    +						picker.show();
    +					})
    +					.siblings('.input-group-addon').on('click', function(){
    +						picker.show();
    +					})
    +				}
    +			}
    +			else {
    +				this.$input.get(0).type = 'date';
    +			}
    +
    +       },
    +
    +       /**
    +        Attaches handler to submit form in case of 'showbuttons=false' mode
    +        
    +        @method autosubmit() 
    +       **/       
    +       autosubmit: function() {
    +           this.$input.keydown(function (e) {
    +                if (e.which === 13) {
    +                    $(this).closest('form').submit();
    +                }
    +           });
    +       }
    +    });
    +
    +    ADate.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
    +        tpl:'<div class="input-group input-group-compact"><input type="text" class="input-medium date" /><span class="input-group-addon"><i class="fa fa-calendar"></i></span></div>',
    +		date: {
    +			weekStart: 0,
    +            startView: 0,
    +            minViewMode: 0
    +        }
    +    });
    +
    +    $.fn.editabletypes.adate = ADate;
    +
    +}(window.jQuery));
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ace/js/x-editable/bootstrap-editable.js b/src/main/webapp/plug-in/ace/js/x-editable/bootstrap-editable.js
    new file mode 100644
    index 00000000..99ce306f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ace/js/x-editable/bootstrap-editable.js
    @@ -0,0 +1,5249 @@
    +/*! X-editable - v1.5.1 
    +* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
    +* http://github.com/vitalets/x-editable
    +* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */
    +/**
    +Form with single input element, two buttons and two states: normal/loading.
    +Applied as jQuery method to DIV tag (not to form tag!). This is because form can be in loading state when spinner shown.
    +Editableform is linked with one of input types, e.g. 'text', 'select' etc.
    +
    +@class editableform
    +@uses text
    +@uses textarea
    +**/
    +(function ($) {
    +    "use strict";
    +    
    +    var EditableForm = function (div, options) {
    +        this.options = $.extend({}, $.fn.editableform.defaults, options);
    +        this.$div = $(div); //div, containing form. Not form tag. Not editable-element.
    +        if(!this.options.scope) {
    +            this.options.scope = this;
    +        }
    +        //nothing shown after init
    +    };
    +
    +    EditableForm.prototype = {
    +        constructor: EditableForm,
    +        initInput: function() {  //called once
    +            //take input from options (as it is created in editable-element)
    +            this.input = this.options.input;
    +            
    +            //set initial value
    +            //todo: may be add check: typeof str === 'string' ? 
    +            this.value = this.input.str2value(this.options.value); 
    +            
    +            //prerender: get input.$input
    +            this.input.prerender();
    +        },
    +        initTemplate: function() {
    +            this.$form = $($.fn.editableform.template); 
    +        },
    +        initButtons: function() {
    +            var $btn = this.$form.find('.editable-buttons');
    +            $btn.append($.fn.editableform.buttons);
    +            if(this.options.showbuttons === 'bottom') {
    +                $btn.addClass('editable-buttons-bottom');
    +            }
    +        },
    +        /**
    +        Renders editableform
    +
    +        @method render
    +        **/        
    +        render: function() {
    +            //init loader
    +            this.$loading = $($.fn.editableform.loading);        
    +            this.$div.empty().append(this.$loading);
    +            
    +            //init form template and buttons
    +            this.initTemplate();
    +            if(this.options.showbuttons) {
    +                this.initButtons();
    +            } else {
    +                this.$form.find('.editable-buttons').remove();
    +            }
    +
    +            //show loading state
    +            this.showLoading();            
    +            
    +            //flag showing is form now saving value to server. 
    +            //It is needed to wait when closing form.
    +            this.isSaving = false;
    +            
    +            /**        
    +            Fired when rendering starts
    +            @event rendering 
    +            @param {Object} event event object
    +            **/            
    +            this.$div.triggerHandler('rendering');
    +            
    +            //init input
    +            this.initInput();
    +            
    +            //append input to form
    +            this.$form.find('div.editable-input').append(this.input.$tpl);            
    +            
    +            //append form to container
    +            this.$div.append(this.$form);
    +            
    +            //render input
    +            $.when(this.input.render())
    +            .then($.proxy(function () {
    +                //setup input to submit automatically when no buttons shown
    +                if(!this.options.showbuttons) {
    +                    this.input.autosubmit(); 
    +                }
    +                 
    +                //attach 'cancel' handler
    +                this.$form.find('.editable-cancel').click($.proxy(this.cancel, this));
    +                
    +                if(this.input.error) {
    +                    this.error(this.input.error);
    +                    this.$form.find('.editable-submit').attr('disabled', true);
    +                    this.input.$input.attr('disabled', true);
    +                    //prevent form from submitting
    +                    this.$form.submit(function(e){ e.preventDefault(); });
    +                } else {
    +                    this.error(false);
    +                    this.input.$input.removeAttr('disabled');
    +                    this.$form.find('.editable-submit').removeAttr('disabled');
    +                    var value = (this.value === null || this.value === undefined || this.value === '') ? this.options.defaultValue : this.value;
    +                    this.input.value2input(value);
    +                    //attach submit handler
    +                    this.$form.submit($.proxy(this.submit, this));
    +                }
    +
    +                /**        
    +                Fired when form is rendered
    +                @event rendered
    +                @param {Object} event event object
    +                **/            
    +                this.$div.triggerHandler('rendered');                
    +
    +                this.showForm();
    +                
    +                //call postrender method to perform actions required visibility of form
    +                if(this.input.postrender) {
    +                    this.input.postrender();
    +                }                
    +            }, this));
    +        },
    +        cancel: function() {   
    +            /**        
    +            Fired when form was cancelled by user
    +            @event cancel 
    +            @param {Object} event event object
    +            **/              
    +            this.$div.triggerHandler('cancel');
    +        },
    +        showLoading: function() {
    +            var w, h;
    +            if(this.$form) {
    +                //set loading size equal to form
    +                w = this.$form.outerWidth();
    +                h = this.$form.outerHeight(); 
    +                if(w) {
    +                    this.$loading.width(w);
    +                }
    +                if(h) {
    +                    this.$loading.height(h);
    +                }
    +                this.$form.hide();
    +            } else {
    +                //stretch loading to fill container width
    +                w = this.$loading.parent().width();
    +                if(w) {
    +                    this.$loading.width(w);
    +                }
    +            }
    +            this.$loading.show(); 
    +        },
    +
    +        showForm: function(activate) {
    +            this.$loading.hide();
    +            this.$form.show();
    +            if(activate !== false) {
    +                this.input.activate(); 
    +            }
    +            /**        
    +            Fired when form is shown
    +            @event show 
    +            @param {Object} event event object
    +            **/                    
    +            this.$div.triggerHandler('show');
    +        },
    +
    +        error: function(msg) {
    +            var $group = this.$form.find('.control-group'),
    +                $block = this.$form.find('.editable-error-block'),
    +                lines;
    +
    +            if(msg === false) {
    +                $group.removeClass($.fn.editableform.errorGroupClass);
    +                $block.removeClass($.fn.editableform.errorBlockClass).empty().hide(); 
    +            } else {
    +                //convert newline to <br> for more pretty error display
    +                if(msg) {
    +                    lines = (''+msg).split('\n');
    +                    for (var i = 0; i < lines.length; i++) {
    +                        lines[i] = $('<div>').text(lines[i]).html();
    +                    }
    +                    msg = lines.join('<br>');
    +                }
    +                $group.addClass($.fn.editableform.errorGroupClass);
    +                $block.addClass($.fn.editableform.errorBlockClass).html(msg).show();
    +            }
    +        },
    +
    +        submit: function(e) {
    +            e.stopPropagation();
    +            e.preventDefault();
    +            
    +            //get new value from input
    +            var newValue = this.input.input2value(); 
    +
    +            //validation: if validate returns string or truthy value - means error
    +            //if returns object like {newValue: '...'} => submitted value is reassigned to it
    +            var error = this.validate(newValue);
    +            if ($.type(error) === 'object' && error.newValue !== undefined) {
    +                newValue = error.newValue;
    +                this.input.value2input(newValue);
    +                if(typeof error.msg === 'string') {
    +                    this.error(error.msg);
    +                    this.showForm();
    +                    return;
    +                }
    +            } else if (error) {
    +                this.error(error);
    +                this.showForm();
    +                return;
    +            } 
    +            
    +            //if value not changed --> trigger 'nochange' event and return
    +            /*jslint eqeq: true*/
    +            if (!this.options.savenochange && this.input.value2str(newValue) == this.input.value2str(this.value)) {
    +            /*jslint eqeq: false*/                
    +                /**        
    +                Fired when value not changed but form is submitted. Requires savenochange = false.
    +                @event nochange 
    +                @param {Object} event event object
    +                **/                    
    +                this.$div.triggerHandler('nochange');            
    +                return;
    +            } 
    +
    +            //convert value for submitting to server
    +            var submitValue = this.input.value2submit(newValue);
    +            
    +            this.isSaving = true;
    +            
    +            //sending data to server
    +            $.when(this.save(submitValue))
    +            .done($.proxy(function(response) {
    +                this.isSaving = false;
    +
    +                //run success callback
    +                var res = typeof this.options.success === 'function' ? this.options.success.call(this.options.scope, response, newValue) : null;
    +
    +                //if success callback returns false --> keep form open and do not activate input
    +                if(res === false) {
    +                    this.error(false);
    +                    this.showForm(false);
    +                    return;
    +                }
    +
    +                //if success callback returns string -->  keep form open, show error and activate input               
    +                if(typeof res === 'string') {
    +                    this.error(res);
    +                    this.showForm();
    +                    return;
    +                }
    +
    +                //if success callback returns object like {newValue: <something>} --> use that value instead of submitted
    +                //it is usefull if you want to chnage value in url-function
    +                if(res && typeof res === 'object' && res.hasOwnProperty('newValue')) {
    +                    newValue = res.newValue;
    +                }
    +
    +                //clear error message
    +                this.error(false);   
    +                this.value = newValue;
    +                /**        
    +                Fired when form is submitted
    +                @event save 
    +                @param {Object} event event object
    +                @param {Object} params additional params
    +                @param {mixed} params.newValue raw new value
    +                @param {mixed} params.submitValue submitted value as string
    +                @param {Object} params.response ajax response
    +
    +                @example
    +                $('#form-div').on('save'), function(e, params){
    +                    if(params.newValue === 'username') {...}
    +                });
    +                **/
    +                this.$div.triggerHandler('save', {newValue: newValue, submitValue: submitValue, response: response});
    +            }, this))
    +            .fail($.proxy(function(xhr) {
    +                this.isSaving = false;
    +
    +                var msg;
    +                if(typeof this.options.error === 'function') {
    +                    msg = this.options.error.call(this.options.scope, xhr, newValue);
    +                } else {
    +                    msg = typeof xhr === 'string' ? xhr : xhr.responseText || xhr.statusText || 'Unknown error!';
    +                }
    +
    +                this.error(msg);
    +                this.showForm();
    +            }, this));
    +        },
    +
    +        save: function(submitValue) {
    +            //try parse composite pk defined as json string in data-pk 
    +            this.options.pk = $.fn.editableutils.tryParseJson(this.options.pk, true); 
    +            
    +            var pk = (typeof this.options.pk === 'function') ? this.options.pk.call(this.options.scope) : this.options.pk,
    +            /*
    +              send on server in following cases:
    +              1. url is function
    +              2. url is string AND (pk defined OR send option = always) 
    +            */
    +            send = !!(typeof this.options.url === 'function' || (this.options.url && ((this.options.send === 'always') || (this.options.send === 'auto' && pk !== null && pk !== undefined)))),
    +            params;
    +
    +            if (send) { //send to server
    +                this.showLoading();
    +
    +                //standard params
    +                params = {
    +                    name: this.options.name || '',
    +                    value: submitValue,
    +                    pk: pk 
    +                };
    +
    +                //additional params
    +                if(typeof this.options.params === 'function') {
    +                    params = this.options.params.call(this.options.scope, params);  
    +                } else {
    +                    //try parse json in single quotes (from data-params attribute)
    +                    this.options.params = $.fn.editableutils.tryParseJson(this.options.params, true);   
    +                    $.extend(params, this.options.params);
    +                }
    +
    +                if(typeof this.options.url === 'function') { //user's function
    +                    return this.options.url.call(this.options.scope, params);
    +                } else {  
    +                    //send ajax to server and return deferred object
    +                    return $.ajax($.extend({
    +                        url     : this.options.url,
    +                        data    : params,
    +                        type    : 'POST'
    +                    }, this.options.ajaxOptions));
    +                }
    +            }
    +        }, 
    +
    +        validate: function (value) {
    +            if (value === undefined) {
    +                value = this.value;
    +            }
    +            if (typeof this.options.validate === 'function') {
    +                return this.options.validate.call(this.options.scope, value);
    +            }
    +        },
    +
    +        option: function(key, value) {
    +            if(key in this.options) {
    +                this.options[key] = value;
    +            }
    +            
    +            if(key === 'value') {
    +                this.setValue(value);
    +            }
    +            
    +            //do not pass option to input as it is passed in editable-element
    +        },
    +
    +        setValue: function(value, convertStr) {
    +            if(convertStr) {
    +                this.value = this.input.str2value(value);
    +            } else {
    +                this.value = value;
    +            }
    +            
    +            //if form is visible, update input
    +            if(this.$form && this.$form.is(':visible')) {
    +                this.input.value2input(this.value);
    +            }            
    +        }               
    +    };
    +
    +    /*
    +    Initialize editableform. Applied to jQuery object.
    +
    +    @method $().editableform(options)
    +    @params {Object} options
    +    @example
    +    var $form = $('&lt;div&gt;').editableform({
    +        type: 'text',
    +        name: 'username',
    +        url: '/post',
    +        value: 'vitaliy'
    +    });
    +
    +    //to display form you should call 'render' method
    +    $form.editableform('render');     
    +    */
    +    $.fn.editableform = function (option) {
    +        var args = arguments;
    +        return this.each(function () {
    +            var $this = $(this), 
    +            data = $this.data('editableform'), 
    +            options = typeof option === 'object' && option; 
    +            if (!data) {
    +                $this.data('editableform', (data = new EditableForm(this, options)));
    +            }
    +
    +            if (typeof option === 'string') { //call method 
    +                data[option].apply(data, Array.prototype.slice.call(args, 1));
    +            } 
    +        });
    +    };
    +
    +    //keep link to constructor to allow inheritance
    +    $.fn.editableform.Constructor = EditableForm;    
    +
    +    //defaults
    +    $.fn.editableform.defaults = {
    +        /* see also defaults for input */
    +
    +        /**
    +        Type of input. Can be <code>text|textarea|select|date|checklist</code>
    +
    +        @property type 
    +        @type string
    +        @default 'text'
    +        **/
    +        type: 'text',
    +        /**
    +        Url for submit, e.g. <code>'/post'</code>  
    +        If function - it will be called instead of ajax. Function should return deferred object to run fail/done callbacks.
    +
    +        @property url 
    +        @type string|function
    +        @default null
    +        @example
    +        url: function(params) {
    +            var d = new $.Deferred;
    +            if(params.value === 'abc') {
    +                return d.reject('error message'); //returning error via deferred object
    +            } else {
    +                //async saving data in js model
    +                someModel.asyncSaveMethod({
    +                   ..., 
    +                   success: function(){
    +                      d.resolve();
    +                   }
    +                }); 
    +                return d.promise();
    +            }
    +        } 
    +        **/        
    +        url:null,
    +        /**
    +        Additional params for submit. If defined as <code>object</code> - it is **appended** to original ajax data (pk, name and value).  
    +        If defined as <code>function</code> - returned object **overwrites** original ajax data.
    +        @example
    +        params: function(params) {
    +            //originally params contain pk, name and value
    +            params.a = 1;
    +            return params;
    +        }
    +
    +        @property params 
    +        @type object|function
    +        @default null
    +        **/          
    +        params:null,
    +        /**
    +        Name of field. Will be submitted on server. Can be taken from <code>id</code> attribute
    +
    +        @property name 
    +        @type string
    +        @default null
    +        **/         
    +        name: null,
    +        /**
    +        Primary key of editable object (e.g. record id in database). For composite keys use object, e.g. <code>{id: 1, lang: 'en'}</code>.
    +        Can be calculated dynamically via function.
    +
    +        @property pk 
    +        @type string|object|function
    +        @default null
    +        **/         
    +        pk: null,
    +        /**
    +        Initial value. If not defined - will be taken from element's content.
    +        For __select__ type should be defined (as it is ID of shown text).
    +
    +        @property value 
    +        @type string|object
    +        @default null
    +        **/        
    +        value: null,
    +        /**
    +        Value that will be displayed in input if original field value is empty (`null|undefined|''`).
    +
    +        @property defaultValue 
    +        @type string|object
    +        @default null
    +        @since 1.4.6
    +        **/        
    +        defaultValue: null,
    +        /**
    +        Strategy for sending data on server. Can be `auto|always|never`.
    +        When 'auto' data will be sent on server **only if pk and url defined**, otherwise new value will be stored locally.
    +
    +        @property send 
    +        @type string
    +        @default 'auto'
    +        **/          
    +        send: 'auto', 
    +        /**
    +        Function for client-side validation. If returns string - means validation not passed and string showed as error.
    +        Since 1.5.1 you can modify submitted value by returning object from `validate`: 
    +        `{newValue: '...'}` or `{newValue: '...', msg: '...'}`
    +
    +        @property validate 
    +        @type function
    +        @default null
    +        @example
    +        validate: function(value) {
    +            if($.trim(value) == '') {
    +                return 'This field is required';
    +            }
    +        }
    +        **/         
    +        validate: null,
    +        /**
    +        Success callback. Called when value successfully sent on server and **response status = 200**.  
    +        Usefull to work with json response. For example, if your backend response can be <code>{success: true}</code>
    +        or <code>{success: false, msg: "server error"}</code> you can check it inside this callback.  
    +        If it returns **string** - means error occured and string is shown as error message.  
    +        If it returns **object like** <code>{newValue: &lt;something&gt;}</code> - it overwrites value, submitted by user.  
    +        Otherwise newValue simply rendered into element.
    +        
    +        @property success 
    +        @type function
    +        @default null
    +        @example
    +        success: function(response, newValue) {
    +            if(!response.success) return response.msg;
    +        }
    +        **/          
    +        success: null,
    +        /**
    +        Error callback. Called when request failed (response status != 200).  
    +        Usefull when you want to parse error response and display a custom message.
    +        Must return **string** - the message to be displayed in the error block.
    +                
    +        @property error 
    +        @type function
    +        @default null
    +        @since 1.4.4
    +        @example
    +        error: function(response, newValue) {
    +            if(response.status === 500) {
    +                return 'Service unavailable. Please try later.';
    +            } else {
    +                return response.responseText;
    +            }
    +        }
    +        **/          
    +        error: null,
    +        /**
    +        Additional options for submit ajax request.
    +        List of values: http://api.jquery.com/jQuery.ajax
    +        
    +        @property ajaxOptions 
    +        @type object
    +        @default null
    +        @since 1.1.1        
    +        @example 
    +        ajaxOptions: {
    +            type: 'put',
    +            dataType: 'json'
    +        }        
    +        **/        
    +        ajaxOptions: null,
    +        /**
    +        Where to show buttons: left(true)|bottom|false  
    +        Form without buttons is auto-submitted.
    +
    +        @property showbuttons 
    +        @type boolean|string
    +        @default true
    +        @since 1.1.1
    +        **/         
    +        showbuttons: true,
    +        /**
    +        Scope for callback methods (success, validate).  
    +        If <code>null</code> means editableform instance itself. 
    +
    +        @property scope 
    +        @type DOMElement|object
    +        @default null
    +        @since 1.2.0
    +        @private
    +        **/            
    +        scope: null,
    +        /**
    +        Whether to save or cancel value when it was not changed but form was submitted
    +
    +        @property savenochange 
    +        @type boolean
    +        @default false
    +        @since 1.2.0
    +        **/
    +        savenochange: false
    +    };   
    +
    +    /*
    +    Note: following params could redefined in engine: bootstrap or jqueryui:
    +    Classes 'control-group' and 'editable-error-block' must always present!
    +    */      
    +    $.fn.editableform.template = '<form class="form-inline editableform">'+
    +    '<div class="control-group">' + 
    +    '<div><div class="editable-input"></div><div class="editable-buttons"></div></div>'+
    +    '<div class="editable-error-block"></div>' + 
    +    '</div>' + 
    +    '</form>';
    +
    +    //loading div
    +    $.fn.editableform.loading = '<div class="editableform-loading"></div>';
    +
    +    //buttons
    +    $.fn.editableform.buttons = '<button type="submit" class="editable-submit">ok</button>'+
    +    '<button type="button" class="editable-cancel">cancel</button>';      
    +
    +    //error class attached to control-group
    +    $.fn.editableform.errorGroupClass = null;  
    +
    +    //error class attached to editable-error-block
    +    $.fn.editableform.errorBlockClass = 'editable-error';
    +    
    +    //engine
    +    $.fn.editableform.engine = 'jquery';
    +}(window.jQuery));
    +
    +/**
    +* EditableForm utilites
    +*/
    +(function ($) {
    +    "use strict";
    +    
    +    //utils
    +    $.fn.editableutils = {
    +        /**
    +        * classic JS inheritance function
    +        */  
    +        inherit: function (Child, Parent) {
    +            var F = function() { };
    +            F.prototype = Parent.prototype;
    +            Child.prototype = new F();
    +            Child.prototype.constructor = Child;
    +            Child.superclass = Parent.prototype;
    +        },
    +
    +        /**
    +        * set caret position in input
    +        * see http://stackoverflow.com/questions/499126/jquery-set-cursor-position-in-text-area
    +        */        
    +        setCursorPosition: function(elem, pos) {
    +            if (elem.setSelectionRange) {
    +                elem.setSelectionRange(pos, pos);
    +            } else if (elem.createTextRange) {
    +                var range = elem.createTextRange();
    +                range.collapse(true);
    +                range.moveEnd('character', pos);
    +                range.moveStart('character', pos);
    +                range.select();
    +            }
    +        },
    +
    +        /**
    +        * function to parse JSON in *single* quotes. (jquery automatically parse only double quotes)
    +        * That allows such code as: <a data-source="{'a': 'b', 'c': 'd'}">
    +        * safe = true --> means no exception will be thrown
    +        * for details see http://stackoverflow.com/questions/7410348/how-to-set-json-format-to-html5-data-attributes-in-the-jquery
    +        */
    +        tryParseJson: function(s, safe) {
    +            if (typeof s === 'string' && s.length && s.match(/^[\{\[].*[\}\]]$/)) {
    +                if (safe) {
    +                    try {
    +                        /*jslint evil: true*/
    +                        s = (new Function('return ' + s))();
    +                        /*jslint evil: false*/
    +                    } catch (e) {} finally {
    +                        return s;
    +                    }
    +                } else {
    +                    /*jslint evil: true*/
    +                    s = (new Function('return ' + s))();
    +                    /*jslint evil: false*/
    +                }
    +            }
    +            return s;
    +        },
    +
    +        /**
    +        * slice object by specified keys
    +        */
    +        sliceObj: function(obj, keys, caseSensitive /* default: false */) {
    +            var key, keyLower, newObj = {};
    +
    +            if (!$.isArray(keys) || !keys.length) {
    +                return newObj;
    +            }
    +
    +            for (var i = 0; i < keys.length; i++) {
    +                key = keys[i];
    +                if (obj.hasOwnProperty(key)) {
    +                    newObj[key] = obj[key];
    +                }
    +
    +                if(caseSensitive === true) {
    +                    continue;
    +                }
    +
    +                //when getting data-* attributes via $.data() it's converted to lowercase.
    +                //details: http://stackoverflow.com/questions/7602565/using-data-attributes-with-jquery
    +                //workaround is code below.
    +                keyLower = key.toLowerCase();
    +                if (obj.hasOwnProperty(keyLower)) {
    +                    newObj[key] = obj[keyLower];
    +                }
    +            }
    +
    +            return newObj;
    +        },
    +
    +        /*
    +        exclude complex objects from $.data() before pass to config
    +        */
    +        getConfigData: function($element) {
    +            var data = {};
    +            $.each($element.data(), function(k, v) {
    +                if(typeof v !== 'object' || (v && typeof v === 'object' && (v.constructor === Object || v.constructor === Array))) {
    +                    data[k] = v;
    +                }
    +            });
    +            return data;
    +        },
    +
    +        /*
    +         returns keys of object
    +        */
    +        objectKeys: function(o) {
    +            if (Object.keys) {
    +                return Object.keys(o);  
    +            } else {
    +                if (o !== Object(o)) {
    +                    throw new TypeError('Object.keys called on a non-object');
    +                }
    +                var k=[], p;
    +                for (p in o) {
    +                    if (Object.prototype.hasOwnProperty.call(o,p)) {
    +                        k.push(p);
    +                    }
    +                }
    +                return k;
    +            }
    +
    +        },
    +        
    +       /**
    +        method to escape html.
    +       **/
    +       escape: function(str) {
    +           return $('<div>').text(str).html();
    +       },
    +       
    +       /*
    +        returns array items from sourceData having value property equal or inArray of 'value'
    +       */
    +       itemsByValue: function(value, sourceData, valueProp) {
    +           if(!sourceData || value === null) {
    +               return [];
    +           }
    +           
    +           if (typeof(valueProp) !== "function") {
    +               var idKey = valueProp || 'value';
    +               valueProp = function (e) { return e[idKey]; };
    +           }
    +                      
    +           var isValArray = $.isArray(value),
    +           result = [], 
    +           that = this;
    +
    +           $.each(sourceData, function(i, o) {
    +               if(o.children) {
    +                   result = result.concat(that.itemsByValue(value, o.children, valueProp));
    +               } else {
    +                   /*jslint eqeq: true*/
    +                   if(isValArray) {
    +                       if($.grep(value, function(v){  return v == (o && typeof o === 'object' ? valueProp(o) : o); }).length) {
    +                           result.push(o); 
    +                       }
    +                   } else {
    +                       var itemValue = (o && (typeof o === 'object')) ? valueProp(o) : o;
    +                       if(value == itemValue) {
    +                           result.push(o); 
    +                       }
    +                   }
    +                   /*jslint eqeq: false*/
    +               }
    +           });
    +           
    +           return result;
    +       },
    +       
    +       /*
    +       Returns input by options: type, mode. 
    +       */
    +       createInput: function(options) {
    +           var TypeConstructor, typeOptions, input,
    +           type = options.type;
    +
    +           //`date` is some kind of virtual type that is transformed to one of exact types
    +           //depending on mode and core lib
    +           if(type === 'date') {
    +               //inline
    +               if(options.mode === 'inline') {
    +                   if($.fn.editabletypes.datefield) {
    +                       type = 'datefield';
    +                   } else if($.fn.editabletypes.dateuifield) {
    +                       type = 'dateuifield';
    +                   }
    +               //popup
    +               } else {
    +                   if($.fn.editabletypes.date) {
    +                       type = 'date';
    +                   } else if($.fn.editabletypes.dateui) {
    +                       type = 'dateui';
    +                   }
    +               }
    +               
    +               //if type still `date` and not exist in types, replace with `combodate` that is base input
    +               if(type === 'date' && !$.fn.editabletypes.date) {
    +                   type = 'combodate';
    +               } 
    +           }
    +           
    +           //`datetime` should be datetimefield in 'inline' mode
    +           if(type === 'datetime' && options.mode === 'inline') {
    +             type = 'datetimefield';  
    +           }           
    +
    +           //change wysihtml5 to textarea for jquery UI and plain versions
    +           if(type === 'wysihtml5' && !$.fn.editabletypes[type]) {
    +               type = 'textarea';
    +           }
    +
    +           //create input of specified type. Input will be used for converting value, not in form
    +           if(typeof $.fn.editabletypes[type] === 'function') {
    +               TypeConstructor = $.fn.editabletypes[type];
    +               typeOptions = this.sliceObj(options, this.objectKeys(TypeConstructor.defaults));
    +               input = new TypeConstructor(typeOptions);
    +               return input;
    +           } else {
    +               $.error('Unknown type: '+ type);
    +               return false; 
    +           }  
    +       },
    +       
    +       //see http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr
    +       supportsTransitions: function () {
    +           var b = document.body || document.documentElement,
    +               s = b.style,
    +               p = 'transition',
    +               v = ['Moz', 'Webkit', 'Khtml', 'O', 'ms'];
    +               
    +           if(typeof s[p] === 'string') {
    +               return true; 
    +           }
    +
    +           // Tests for vendor specific prop
    +           p = p.charAt(0).toUpperCase() + p.substr(1);
    +           for(var i=0; i<v.length; i++) {
    +               if(typeof s[v[i] + p] === 'string') { 
    +                   return true; 
    +               }
    +           }
    +           return false;
    +       }            
    +       
    +    };      
    +}(window.jQuery));
    +
    +/**
    +Attaches stand-alone container with editable-form to HTML element. Element is used only for positioning, value is not stored anywhere.<br>
    +This method applied internally in <code>$().editable()</code>. You should subscribe on it's events (save / cancel) to get profit of it.<br>
    +Final realization can be different: bootstrap-popover, jqueryui-tooltip, poshytip, inline-div. It depends on which js file you include.<br>
    +Applied as jQuery method.
    +
    +@class editableContainer
    +@uses editableform
    +**/
    +(function ($) {
    +    "use strict";
    +
    +    var Popup = function (element, options) {
    +        this.init(element, options);
    +    };
    +    
    +    var Inline = function (element, options) {
    +        this.init(element, options);
    +    };    
    +
    +    //methods
    +    Popup.prototype = {
    +        containerName: null, //method to call container on element
    +        containerDataName: null, //object name in element's .data()
    +        innerCss: null, //tbd in child class
    +        containerClass: 'editable-container editable-popup', //css class applied to container element
    +        defaults: {}, //container itself defaults
    +        
    +        init: function(element, options) {
    +            this.$element = $(element);
    +            //since 1.4.1 container do not use data-* directly as they already merged into options.
    +            this.options = $.extend({}, $.fn.editableContainer.defaults, options);         
    +            this.splitOptions();
    +            
    +            //set scope of form callbacks to element
    +            this.formOptions.scope = this.$element[0]; 
    +            
    +            this.initContainer();
    +            
    +            //flag to hide container, when saving value will finish
    +            this.delayedHide = false;
    +
    +            //bind 'destroyed' listener to destroy container when element is removed from dom
    +            this.$element.on('destroyed', $.proxy(function(){
    +                this.destroy();
    +            }, this)); 
    +            
    +            //attach document handler to close containers on click / escape
    +            if(!$(document).data('editable-handlers-attached')) {
    +                //close all on escape
    +                $(document).on('keyup.editable', function (e) {
    +                    if (e.which === 27) {
    +                        $('.editable-open').editableContainer('hide');
    +                        //todo: return focus on element 
    +                    }
    +                });
    +
    +                //close containers when click outside 
    +                //(mousedown could be better than click, it closes everything also on drag drop)
    +                $(document).on('click.editable', function(e) {
    +                    var $target = $(e.target), i,
    +                        exclude_classes = ['.editable-container', 
    +                                           '.ui-datepicker-header', 
    +                                           '.datepicker', //in inline mode datepicker is rendered into body
    +                                           '.modal-backdrop', 
    +                                           '.bootstrap-wysihtml5-insert-image-modal', 
    +                                           '.bootstrap-wysihtml5-insert-link-modal'
    +                                           ];
    +										   
    +										   
    +					//select2 has extra body click in IE
    +                    //see: https://github.com/ivaynberg/select2/issues/1058
    +                    if ($('.select2-drop-mask').is(':visible')) {
    +                        return;//ACE
    +                    }
    +                    
    +                    //check if element is detached. It occurs when clicking in bootstrap datepicker
    +                    if (!$.contains(document.documentElement, e.target)) {
    +                      return;
    +                    }
    +
    +                    //for some reason FF 20 generates extra event (click) in select2 widget with e.target = document
    +                    //we need to filter it via construction below. See https://github.com/vitalets/x-editable/issues/199
    +                    //Possibly related to http://stackoverflow.com/questions/10119793/why-does-firefox-react-differently-from-webkit-and-ie-to-click-event-on-selec
    +                    if($target.is(document)) {
    +                       return; 
    +                    }
    +                    
    +                    //if click inside one of exclude classes --> no nothing
    +                    for(i=0; i<exclude_classes.length; i++) {
    +                         if($target.is(exclude_classes[i]) || $target.parents(exclude_classes[i]).length) {
    +                             return;
    +                         }
    +                    }
    +                      
    +                    //close all open containers (except one - target)
    +                    Popup.prototype.closeOthers(e.target);
    +                });
    +                
    +                $(document).data('editable-handlers-attached', true);
    +            }                        
    +        },
    +
    +        //split options on containerOptions and formOptions
    +        splitOptions: function() {
    +            this.containerOptions = {};
    +            this.formOptions = {};
    +            
    +            if(!$.fn[this.containerName]) {
    +                throw new Error(this.containerName + ' not found. Have you included corresponding js file?');   
    +            }
    +            
    +            //keys defined in container defaults go to container, others go to form
    +            for(var k in this.options) {
    +              if(k in this.defaults) {
    +                 this.containerOptions[k] = this.options[k];
    +              } else {
    +                 this.formOptions[k] = this.options[k];
    +              } 
    +            }
    +        },
    +        
    +        /*
    +        Returns jquery object of container
    +        @method tip()
    +        */         
    +        tip: function() {
    +            return this.container() ? this.container().$tip : null;
    +        },
    +
    +        /* returns container object */
    +        container: function() {
    +            var container;
    +            //first, try get it by `containerDataName`
    +            if(this.containerDataName) {
    +                if(container = this.$element.data(this.containerDataName)) {
    +                    return container;
    +                }
    +            }
    +            //second, try `containerName`
    +            container = this.$element.data(this.containerName);
    +            return container;
    +        },
    +
    +        /* call native method of underlying container, e.g. this.$element.popover('method') */ 
    +        call: function() {
    +            this.$element[this.containerName].apply(this.$element, arguments); 
    +        },        
    +        
    +        initContainer: function(){
    +            this.call(this.containerOptions);
    +        },
    +
    +        renderForm: function() {
    +            this.$form
    +            .editableform(this.formOptions)
    +            .on({
    +                save: $.proxy(this.save, this), //click on submit button (value changed)
    +                nochange: $.proxy(function(){ this.hide('nochange'); }, this), //click on submit button (value NOT changed)                
    +                cancel: $.proxy(function(){ this.hide('cancel'); }, this), //click on calcel button
    +                show: $.proxy(function() {
    +                    if(this.delayedHide) {
    +                        this.hide(this.delayedHide.reason);
    +                        this.delayedHide = false;
    +                    } else {
    +                        this.setPosition();
    +                    }
    +                }, this), //re-position container every time form is shown (occurs each time after loading state)
    +                rendering: $.proxy(this.setPosition, this), //this allows to place container correctly when loading shown
    +                resize: $.proxy(this.setPosition, this), //this allows to re-position container when form size is changed 
    +                rendered: $.proxy(function(){
    +                    /**        
    +                    Fired when container is shown and form is rendered (for select will wait for loading dropdown options).  
    +                    **Note:** Bootstrap popover has own `shown` event that now cannot be separated from x-editable's one.
    +                    The workaround is to check `arguments.length` that is always `2` for x-editable.                     
    +                    
    +                    @event shown 
    +                    @param {Object} event event object
    +                    @example
    +                    $('#username').on('shown', function(e, editable) {
    +                        editable.input.$input.val('overwriting value of input..');
    +                    });                     
    +                    **/                      
    +                    /*
    +                     TODO: added second param mainly to distinguish from bootstrap's shown event. It's a hotfix that will be solved in future versions via namespaced events.  
    +                    */
    +                    this.$element.triggerHandler('shown', $(this.options.scope).data('editable')); 
    +                }, this) 
    +            })
    +            .editableform('render');
    +        },        
    +
    +        /**
    +        Shows container with form
    +        @method show()
    +        @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true.
    +        **/
    +        /* Note: poshytip owerwrites this method totally! */          
    +        show: function (closeAll) {
    +            this.$element.addClass('editable-open');
    +            if(closeAll !== false) {
    +                //close all open containers (except this)
    +                this.closeOthers(this.$element[0]);  
    +            }
    +            
    +            //show container itself
    +            this.innerShow();
    +            this.tip().addClass(this.containerClass);
    +
    +            /*
    +            Currently, form is re-rendered on every show. 
    +            The main reason is that we dont know, what will container do with content when closed:
    +            remove(), detach() or just hide() - it depends on container.
    +            
    +            Detaching form itself before hide and re-insert before show is good solution, 
    +            but visually it looks ugly --> container changes size before hide.  
    +            */             
    +            
    +            //if form already exist - delete previous data 
    +            if(this.$form) {
    +                //todo: destroy prev data!
    +                //this.$form.destroy();
    +            }
    +
    +            this.$form = $('<div>');
    +            
    +            //insert form into container body
    +            if(this.tip().is(this.innerCss)) {
    +                //for inline container
    +                this.tip().append(this.$form); 
    +            } else {
    +                this.tip().find(this.innerCss).append(this.$form);
    +            } 
    +            
    +            //render form
    +            this.renderForm();
    +        },
    +
    +        /**
    +        Hides container with form
    +        @method hide()
    +        @param {string} reason Reason caused hiding. Can be <code>save|cancel|onblur|nochange|undefined (=manual)</code>
    +        **/         
    +        hide: function(reason) {  
    +            if(!this.tip() || !this.tip().is(':visible') || !this.$element.hasClass('editable-open')) {
    +                return;
    +            }
    +            
    +            //if form is saving value, schedule hide
    +            if(this.$form.data('editableform').isSaving) {
    +                this.delayedHide = {reason: reason};
    +                return;    
    +            } else {
    +                this.delayedHide = false;
    +            }
    +
    +            this.$element.removeClass('editable-open');   
    +            this.innerHide();
    +
    +            /**
    +            Fired when container was hidden. It occurs on both save or cancel.  
    +            **Note:** Bootstrap popover has own `hidden` event that now cannot be separated from x-editable's one.
    +            The workaround is to check `arguments.length` that is always `2` for x-editable. 
    +
    +            @event hidden 
    +            @param {object} event event object
    +            @param {string} reason Reason caused hiding. Can be <code>save|cancel|onblur|nochange|manual</code>
    +            @example
    +            $('#username').on('hidden', function(e, reason) {
    +                if(reason === 'save' || reason === 'cancel') {
    +                    //auto-open next editable
    +                    $(this).closest('tr').next().find('.editable').editable('show');
    +                } 
    +            });
    +            **/
    +            this.$element.triggerHandler('hidden', reason || 'manual');   
    +        },
    +
    +        /* internal show method. To be overwritten in child classes */
    +        innerShow: function () {
    +             
    +        },        
    +
    +        /* internal hide method. To be overwritten in child classes */
    +        innerHide: function () {
    +
    +        },
    +        
    +        /**
    +        Toggles container visibility (show / hide)
    +        @method toggle()
    +        @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true.
    +        **/          
    +        toggle: function(closeAll) {
    +            if(this.container() && this.tip() && this.tip().is(':visible')) {
    +                this.hide();
    +            } else {
    +                this.show(closeAll);
    +            } 
    +        },
    +
    +        /*
    +        Updates the position of container when content changed.
    +        @method setPosition()
    +        */       
    +        setPosition: function() {
    +            //tbd in child class
    +        },
    +
    +        save: function(e, params) {
    +            /**        
    +            Fired when new value was submitted. You can use <code>$(this).data('editableContainer')</code> inside handler to access to editableContainer instance
    +            
    +            @event save 
    +            @param {Object} event event object
    +            @param {Object} params additional params
    +            @param {mixed} params.newValue submitted value
    +            @param {Object} params.response ajax response
    +            @example
    +            $('#username').on('save', function(e, params) {
    +                //assuming server response: '{success: true}'
    +                var pk = $(this).data('editableContainer').options.pk;
    +                if(params.response && params.response.success) {
    +                    alert('value: ' + params.newValue + ' with pk: ' + pk + ' saved!');
    +                } else {
    +                    alert('error!'); 
    +                } 
    +            });
    +            **/             
    +            this.$element.triggerHandler('save', params);
    +            
    +            //hide must be after trigger, as saving value may require methods of plugin, applied to input
    +            this.hide('save');
    +        },
    +
    +        /**
    +        Sets new option
    +        
    +        @method option(key, value)
    +        @param {string} key 
    +        @param {mixed} value 
    +        **/         
    +        option: function(key, value) {
    +            this.options[key] = value;
    +            if(key in this.containerOptions) {
    +                this.containerOptions[key] = value;
    +                this.setContainerOption(key, value); 
    +            } else {
    +                this.formOptions[key] = value;
    +                if(this.$form) {
    +                    this.$form.editableform('option', key, value);  
    +                }
    +            }
    +        },
    +        
    +        setContainerOption: function(key, value) {
    +            this.call('option', key, value);
    +        },
    +
    +        /**
    +        Destroys the container instance
    +        @method destroy()
    +        **/        
    +        destroy: function() {
    +            this.hide();
    +            this.innerDestroy();
    +            this.$element.off('destroyed');
    +            this.$element.removeData('editableContainer');
    +        },
    +        
    +        /* to be overwritten in child classes */
    +        innerDestroy: function() {
    +            
    +        }, 
    +        
    +        /*
    +        Closes other containers except one related to passed element. 
    +        Other containers can be cancelled or submitted (depends on onblur option)
    +        */
    +        closeOthers: function(element) {
    +            $('.editable-open').each(function(i, el){
    +                //do nothing with passed element and it's children
    +                if(el === element || $(el).find(element).length) {
    +                    return;
    +                }
    +
    +                //otherwise cancel or submit all open containers 
    +                var $el = $(el),
    +                ec = $el.data('editableContainer');
    +
    +                if(!ec) {
    +                    return;  
    +                }
    +                
    +                if(ec.options.onblur === 'cancel') {
    +                    $el.data('editableContainer').hide('onblur');
    +                } else if(ec.options.onblur === 'submit') {
    +                    $el.data('editableContainer').tip().find('form').submit();
    +                }
    +            });
    +
    +        },
    +        
    +        /**
    +        Activates input of visible container (e.g. set focus)
    +        @method activate()
    +        **/         
    +        activate: function() {
    +            if(this.tip && this.tip().is(':visible') && this.$form) {
    +               this.$form.data('editableform').input.activate(); 
    +            }
    +        } 
    +
    +    };
    +
    +    /**
    +    jQuery method to initialize editableContainer.
    +    
    +    @method $().editableContainer(options)
    +    @params {Object} options
    +    @example
    +    $('#edit').editableContainer({
    +        type: 'text',
    +        url: '/post',
    +        pk: 1,
    +        value: 'hello'
    +    });
    +    **/  
    +    $.fn.editableContainer = function (option) {
    +        var args = arguments;
    +        return this.each(function () {
    +            var $this = $(this),
    +            dataKey = 'editableContainer', 
    +            data = $this.data(dataKey),
    +            options = typeof option === 'object' && option,
    +            Constructor = (options.mode === 'inline') ? Inline : Popup;             
    +
    +            if (!data) {
    +                $this.data(dataKey, (data = new Constructor(this, options)));
    +            }
    +
    +            if (typeof option === 'string') { //call method 
    +                data[option].apply(data, Array.prototype.slice.call(args, 1));
    +            }            
    +        });
    +    };     
    +
    +    //store constructors
    +    $.fn.editableContainer.Popup = Popup;
    +    $.fn.editableContainer.Inline = Inline;
    +
    +    //defaults
    +    $.fn.editableContainer.defaults = {
    +        /**
    +        Initial value of form input
    +
    +        @property value 
    +        @type mixed
    +        @default null
    +        @private
    +        **/        
    +        value: null,
    +        /**
    +        Placement of container relative to element. Can be <code>top|right|bottom|left</code>. Not used for inline container.
    +
    +        @property placement 
    +        @type string
    +        @default 'top'
    +        **/        
    +        placement: 'top',
    +        /**
    +        Whether to hide container on save/cancel.
    +
    +        @property autohide 
    +        @type boolean
    +        @default true
    +        @private 
    +        **/        
    +        autohide: true,
    +        /**
    +        Action when user clicks outside the container. Can be <code>cancel|submit|ignore</code>.  
    +        Setting <code>ignore</code> allows to have several containers open. 
    +
    +        @property onblur 
    +        @type string
    +        @default 'cancel'
    +        @since 1.1.1
    +        **/        
    +        onblur: 'cancel',
    +        
    +        /**
    +        Animation speed (inline mode only)
    +        @property anim 
    +        @type string
    +        @default false
    +        **/        
    +        anim: false,
    +        
    +        /**
    +        Mode of editable, can be `popup` or `inline` 
    +        
    +        @property mode 
    +        @type string         
    +        @default 'popup'
    +        @since 1.4.0        
    +        **/        
    +        mode: 'popup'        
    +    };
    +
    +    /* 
    +    * workaround to have 'destroyed' event to destroy popover when element is destroyed
    +    * see http://stackoverflow.com/questions/2200494/jquery-trigger-event-when-an-element-is-removed-from-the-dom
    +    */
    +    jQuery.event.special.destroyed = {
    +        remove: function(o) {
    +            if (o.handler) {
    +                o.handler();
    +            }
    +        }
    +    };    
    +
    +}(window.jQuery));
    +
    +/**
    +* Editable Inline 
    +* ---------------------
    +*/
    +(function ($) {
    +    "use strict";
    +    
    +    //copy prototype from EditableContainer
    +    //extend methods
    +    $.extend($.fn.editableContainer.Inline.prototype, $.fn.editableContainer.Popup.prototype, {
    +        containerName: 'editableform',
    +        innerCss: '.editable-inline',
    +        containerClass: 'editable-container editable-inline', //css class applied to container element
    +                 
    +        initContainer: function(){
    +            //container is <span> element
    +            this.$tip = $('<span></span>');
    +            
    +            //convert anim to miliseconds (int)
    +            if(!this.options.anim) {
    +                this.options.anim = 0;
    +            }         
    +        },
    +        
    +        splitOptions: function() {
    +            //all options are passed to form
    +            this.containerOptions = {};
    +            this.formOptions = this.options;
    +        },
    +        
    +        tip: function() {
    +           return this.$tip; 
    +        },
    +        
    +        innerShow: function () {
    +            this.$element.hide();
    +            this.tip().insertAfter(this.$element).show();
    +        }, 
    +        
    +        innerHide: function () {
    +            this.$tip.hide(this.options.anim, $.proxy(function() {
    +                this.$element.show();
    +                this.innerDestroy();
    +            }, this)); 
    +        },
    +        
    +        innerDestroy: function() {
    +            if(this.tip()) {
    +                this.tip().empty().remove();
    +            }
    +        } 
    +    });
    +
    +}(window.jQuery));
    +/**
    +Makes editable any HTML element on the page. Applied as jQuery method.
    +
    +@class editable
    +@uses editableContainer
    +**/
    +(function ($) {
    +    "use strict";
    +
    +    var Editable = function (element, options) {
    +        this.$element = $(element);
    +        //data-* has more priority over js options: because dynamically created elements may change data-* 
    +        this.options = $.extend({}, $.fn.editable.defaults, options, $.fn.editableutils.getConfigData(this.$element));  
    +        if(this.options.selector) {
    +            this.initLive();
    +        } else {
    +            this.init();
    +        }
    +        
    +        //check for transition support
    +        if(this.options.highlight && !$.fn.editableutils.supportsTransitions()) {
    +            this.options.highlight = false;
    +        }
    +    };
    +
    +    Editable.prototype = {
    +        constructor: Editable, 
    +        init: function () {
    +            var isValueByText = false, 
    +                doAutotext, finalize;
    +
    +            //name
    +            this.options.name = this.options.name || this.$element.attr('id');
    +             
    +            //create input of specified type. Input needed already here to convert value for initial display (e.g. show text by id for select)
    +            //also we set scope option to have access to element inside input specific callbacks (e. g. source as function)
    +            this.options.scope = this.$element[0]; 
    +            this.input = $.fn.editableutils.createInput(this.options);
    +            if(!this.input) {
    +                return; 
    +            }            
    +
    +            //set value from settings or by element's text
    +            if (this.options.value === undefined || this.options.value === null) {
    +                this.value = this.input.html2value($.trim(this.$element.html()));
    +                isValueByText = true;
    +            } else {
    +                /*
    +                  value can be string when received from 'data-value' attribute
    +                  for complext objects value can be set as json string in data-value attribute, 
    +                  e.g. data-value="{city: 'Moscow', street: 'Lenina'}"
    +                */
    +                this.options.value = $.fn.editableutils.tryParseJson(this.options.value, true); 
    +                if(typeof this.options.value === 'string') {
    +                    this.value = this.input.str2value(this.options.value);
    +                } else {
    +                    this.value = this.options.value;
    +                }
    +            }
    +            
    +            //add 'editable' class to every editable element
    +            this.$element.addClass('editable');
    +            
    +            //specifically for "textarea" add class .editable-pre-wrapped to keep linebreaks
    +            if(this.input.type === 'textarea') {
    +                this.$element.addClass('editable-pre-wrapped');
    +            }
    +            
    +            //attach handler activating editable. In disabled mode it just prevent default action (useful for links)
    +            if(this.options.toggle !== 'manual') {
    +                this.$element.addClass('editable-click');
    +                this.$element.on(this.options.toggle + '.editable', $.proxy(function(e){
    +                    //prevent following link if editable enabled
    +                    if(!this.options.disabled) {
    +                        e.preventDefault();
    +                    }
    +                    
    +                    //stop propagation not required because in document click handler it checks event target
    +                    //e.stopPropagation();
    +                    
    +                    if(this.options.toggle === 'mouseenter') {
    +                        //for hover only show container
    +                        this.show();
    +                    } else {
    +                        //when toggle='click' we should not close all other containers as they will be closed automatically in document click listener
    +                        var closeAll = (this.options.toggle !== 'click');
    +                        this.toggle(closeAll);
    +                    }
    +                }, this));
    +            } else {
    +                this.$element.attr('tabindex', -1); //do not stop focus on element when toggled manually
    +            }
    +            
    +            //if display is function it's far more convinient to have autotext = always to render correctly on init
    +            //see https://github.com/vitalets/x-editable-yii/issues/34
    +            if(typeof this.options.display === 'function') {
    +                this.options.autotext = 'always';
    +            }
    +            
    +            //check conditions for autotext:
    +            switch(this.options.autotext) {
    +              case 'always':
    +               doAutotext = true;
    +              break;
    +              case 'auto':
    +                //if element text is empty and value is defined and value not generated by text --> run autotext
    +                doAutotext = !$.trim(this.$element.text()).length && this.value !== null && this.value !== undefined && !isValueByText;
    +              break;
    +              default:
    +               doAutotext = false;
    +            }
    +
    +            //depending on autotext run render() or just finilize init
    +            $.when(doAutotext ? this.render() : true).then($.proxy(function() {
    +                if(this.options.disabled) {
    +                    this.disable();
    +                } else {
    +                    this.enable(); 
    +                }
    +               /**        
    +               Fired when element was initialized by `$().editable()` method. 
    +               Please note that you should setup `init` handler **before** applying `editable`. 
    +                              
    +               @event init 
    +               @param {Object} event event object
    +               @param {Object} editable editable instance (as here it cannot accessed via data('editable'))
    +               @since 1.2.0
    +               @example
    +               $('#username').on('init', function(e, editable) {
    +                   alert('initialized ' + editable.options.name);
    +               });
    +               $('#username').editable();
    +               **/                  
    +                this.$element.triggerHandler('init', this);
    +            }, this));
    +        },
    +
    +        /*
    +         Initializes parent element for live editables 
    +        */
    +        initLive: function() {
    +           //store selector 
    +           var selector = this.options.selector;
    +           //modify options for child elements
    +           this.options.selector = false; 
    +           this.options.autotext = 'never';
    +           //listen toggle events
    +           this.$element.on(this.options.toggle + '.editable', selector, $.proxy(function(e){
    +               var $target = $(e.target);
    +               if(!$target.data('editable')) {
    +                   //if delegated element initially empty, we need to clear it's text (that was manually set to `empty` by user)
    +                   //see https://github.com/vitalets/x-editable/issues/137 
    +                   if($target.hasClass(this.options.emptyclass)) {
    +                      $target.empty();
    +                   }
    +                   $target.editable(this.options).trigger(e);
    +               }
    +           }, this)); 
    +        },
    +        
    +        /*
    +        Renders value into element's text.
    +        Can call custom display method from options.
    +        Can return deferred object.
    +        @method render()
    +        @param {mixed} response server response (if exist) to pass into display function
    +        */          
    +        render: function(response) {
    +            //do not display anything
    +            if(this.options.display === false) {
    +                return;
    +            }
    +            
    +            //if input has `value2htmlFinal` method, we pass callback in third param to be called when source is loaded
    +            if(this.input.value2htmlFinal) {
    +                return this.input.value2html(this.value, this.$element[0], this.options.display, response); 
    +            //if display method defined --> use it    
    +            } else if(typeof this.options.display === 'function') {
    +                return this.options.display.call(this.$element[0], this.value, response);
    +            //else use input's original value2html() method    
    +            } else {
    +                return this.input.value2html(this.value, this.$element[0]); 
    +            }
    +        },
    +        
    +        /**
    +        Enables editable
    +        @method enable()
    +        **/          
    +        enable: function() {
    +            this.options.disabled = false;
    +            this.$element.removeClass('editable-disabled');
    +            this.handleEmpty(this.isEmpty);
    +            if(this.options.toggle !== 'manual') {
    +                if(this.$element.attr('tabindex') === '-1') {    
    +                    this.$element.removeAttr('tabindex');                                
    +                }
    +            }
    +        },
    +        
    +        /**
    +        Disables editable
    +        @method disable()
    +        **/         
    +        disable: function() {
    +            this.options.disabled = true; 
    +            this.hide();           
    +            this.$element.addClass('editable-disabled');
    +            this.handleEmpty(this.isEmpty);
    +            //do not stop focus on this element
    +            this.$element.attr('tabindex', -1);                
    +        },
    +        
    +        /**
    +        Toggles enabled / disabled state of editable element
    +        @method toggleDisabled()
    +        **/         
    +        toggleDisabled: function() {
    +            if(this.options.disabled) {
    +                this.enable();
    +            } else { 
    +                this.disable(); 
    +            }
    +        },  
    +        
    +        /**
    +        Sets new option
    +        
    +        @method option(key, value)
    +        @param {string|object} key option name or object with several options
    +        @param {mixed} value option new value
    +        @example
    +        $('.editable').editable('option', 'pk', 2);
    +        **/          
    +        option: function(key, value) {
    +            //set option(s) by object
    +            if(key && typeof key === 'object') {
    +               $.each(key, $.proxy(function(k, v){
    +                  this.option($.trim(k), v); 
    +               }, this)); 
    +               return;
    +            }
    +
    +            //set option by string             
    +            this.options[key] = value;                          
    +            
    +            //disabled
    +            if(key === 'disabled') {
    +               return value ? this.disable() : this.enable();
    +            } 
    +            
    +            //value
    +            if(key === 'value') {
    +                this.setValue(value);
    +            }
    +            
    +            //transfer new option to container! 
    +            if(this.container) {
    +                this.container.option(key, value);  
    +            }
    +             
    +            //pass option to input directly (as it points to the same in form)
    +            if(this.input.option) {
    +                this.input.option(key, value);
    +            }
    +            
    +        },              
    +        
    +        /*
    +        * set emptytext if element is empty
    +        */
    +        handleEmpty: function (isEmpty) {
    +            //do not handle empty if we do not display anything
    +            if(this.options.display === false) {
    +                return;
    +            }
    +
    +            /* 
    +            isEmpty may be set directly as param of method.
    +            It is required when we enable/disable field and can't rely on content 
    +            as node content is text: "Empty" that is not empty %)
    +            */
    +            if(isEmpty !== undefined) { 
    +                this.isEmpty = isEmpty;
    +            } else {
    +                //detect empty
    +                //for some inputs we need more smart check
    +                //e.g. wysihtml5 may have <br>, <p></p>, <img>
    +                if(typeof(this.input.isEmpty) === 'function') {
    +                    this.isEmpty = this.input.isEmpty(this.$element);                    
    +                } else {
    +                    this.isEmpty = $.trim(this.$element.html()) === '';
    +                }
    +            }           
    +            
    +            //emptytext shown only for enabled
    +            if(!this.options.disabled) {
    +                if (this.isEmpty) {
    +                    this.$element.html(this.options.emptytext);
    +                    if(this.options.emptyclass) {
    +                        this.$element.addClass(this.options.emptyclass);
    +                    }
    +                } else if(this.options.emptyclass) {
    +                    this.$element.removeClass(this.options.emptyclass);
    +                }
    +            } else {
    +                //below required if element disable property was changed
    +                if(this.isEmpty) {
    +                    this.$element.empty();
    +                    if(this.options.emptyclass) {
    +                        this.$element.removeClass(this.options.emptyclass);
    +                    }
    +                }
    +            }
    +        },        
    +        
    +        /**
    +        Shows container with form
    +        @method show()
    +        @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true.
    +        **/  
    +        show: function (closeAll) {
    +            if(this.options.disabled) {
    +                return;
    +            }
    +            
    +            //init editableContainer: popover, tooltip, inline, etc..
    +            if(!this.container) {
    +                var containerOptions = $.extend({}, this.options, {
    +                    value: this.value,
    +                    input: this.input //pass input to form (as it is already created)
    +                });
    +                this.$element.editableContainer(containerOptions);
    +                //listen `save` event 
    +                this.$element.on("save.internal", $.proxy(this.save, this));
    +                this.container = this.$element.data('editableContainer'); 
    +            } else if(this.container.tip().is(':visible')) {
    +                return;
    +            }      
    +            
    +            //show container
    +            this.container.show(closeAll);
    +        },
    +        
    +        /**
    +        Hides container with form
    +        @method hide()
    +        **/       
    +        hide: function () {   
    +            if(this.container) {  
    +                this.container.hide();
    +            }
    +        },
    +        
    +        /**
    +        Toggles container visibility (show / hide)
    +        @method toggle()
    +        @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true.
    +        **/  
    +        toggle: function(closeAll) {
    +            if(this.container && this.container.tip().is(':visible')) {
    +                this.hide();
    +            } else {
    +                this.show(closeAll);
    +            }
    +        },
    +        
    +        /*
    +        * called when form was submitted
    +        */          
    +        save: function(e, params) {
    +            //mark element with unsaved class if needed
    +            if(this.options.unsavedclass) {
    +                /*
    +                 Add unsaved css to element if:
    +                  - url is not user's function 
    +                  - value was not sent to server
    +                  - params.response === undefined, that means data was not sent
    +                  - value changed 
    +                */
    +                var sent = false;
    +                sent = sent || typeof this.options.url === 'function';
    +                sent = sent || this.options.display === false; 
    +                sent = sent || params.response !== undefined; 
    +                sent = sent || (this.options.savenochange && this.input.value2str(this.value) !== this.input.value2str(params.newValue)); 
    +                
    +                if(sent) {
    +                    this.$element.removeClass(this.options.unsavedclass); 
    +                } else {
    +                    this.$element.addClass(this.options.unsavedclass);                    
    +                }
    +            }
    +            
    +            //highlight when saving
    +            if(this.options.highlight) {
    +                var $e = this.$element,
    +                    bgColor = $e.css('background-color');
    +                    
    +                $e.css('background-color', this.options.highlight);
    +                setTimeout(function(){
    +                    if(bgColor === 'transparent') {
    +                        bgColor = ''; 
    +                    }
    +                    $e.css('background-color', bgColor);
    +                    $e.addClass('editable-bg-transition');
    +                    setTimeout(function(){
    +                       $e.removeClass('editable-bg-transition');  
    +                    }, 1700);
    +                }, 10);
    +            }
    +            
    +            //set new value
    +            this.setValue(params.newValue, false, params.response);
    +            
    +            /**        
    +            Fired when new value was submitted. You can use <code>$(this).data('editable')</code> to access to editable instance
    +            
    +            @event save 
    +            @param {Object} event event object
    +            @param {Object} params additional params
    +            @param {mixed} params.newValue submitted value
    +            @param {Object} params.response ajax response
    +            @example
    +            $('#username').on('save', function(e, params) {
    +                alert('Saved value: ' + params.newValue);
    +            });
    +            **/
    +            //event itself is triggered by editableContainer. Description here is only for documentation              
    +        },
    +
    +        validate: function () {
    +            if (typeof this.options.validate === 'function') {
    +                return this.options.validate.call(this, this.value);
    +            }
    +        },
    +        
    +        /**
    +        Sets new value of editable
    +        @method setValue(value, convertStr)
    +        @param {mixed} value new value 
    +        @param {boolean} convertStr whether to convert value from string to internal format
    +        **/         
    +        setValue: function(value, convertStr, response) {
    +            if(convertStr) {
    +                this.value = this.input.str2value(value);
    +            } else {
    +                this.value = value;
    +            }
    +            if(this.container) {
    +                this.container.option('value', this.value);
    +            }
    +            $.when(this.render(response))
    +            .then($.proxy(function() {
    +                this.handleEmpty();
    +            }, this));
    +        },
    +        
    +        /**
    +        Activates input of visible container (e.g. set focus)
    +        @method activate()
    +        **/         
    +        activate: function() {
    +            if(this.container) {
    +               this.container.activate(); 
    +            }
    +        },
    +        
    +        /**
    +        Removes editable feature from element
    +        @method destroy()
    +        **/        
    +        destroy: function() {
    +            this.disable();
    +            
    +            if(this.container) {
    +               this.container.destroy(); 
    +            }
    +            
    +            this.input.destroy();
    +
    +            if(this.options.toggle !== 'manual') {
    +                this.$element.removeClass('editable-click');
    +                this.$element.off(this.options.toggle + '.editable');
    +            } 
    +            
    +            this.$element.off("save.internal");
    +            
    +            this.$element.removeClass('editable editable-open editable-disabled');
    +            this.$element.removeData('editable');
    +        }        
    +    };
    +
    +    /* EDITABLE PLUGIN DEFINITION
    +    * ======================= */
    +
    +    /**
    +    jQuery method to initialize editable element.
    +    
    +    @method $().editable(options)
    +    @params {Object} options
    +    @example
    +    $('#username').editable({
    +        type: 'text',
    +        url: '/post',
    +        pk: 1
    +    });
    +    **/
    +    $.fn.editable = function (option) {
    +        //special API methods returning non-jquery object
    +        var result = {}, args = arguments, datakey = 'editable';
    +        switch (option) {
    +            /**
    +            Runs client-side validation for all matched editables
    +            
    +            @method validate()
    +            @returns {Object} validation errors map
    +            @example
    +            $('#username, #fullname').editable('validate');
    +            // possible result:
    +            {
    +              username: "username is required",
    +              fullname: "fullname should be minimum 3 letters length"
    +            }
    +            **/
    +            case 'validate':
    +                this.each(function () {
    +                    var $this = $(this), data = $this.data(datakey), error;
    +                    if (data && (error = data.validate())) {
    +                        result[data.options.name] = error;
    +                    }
    +                });
    +            return result;
    +
    +            /**
    +            Returns current values of editable elements.   
    +            Note that it returns an **object** with name-value pairs, not a value itself. It allows to get data from several elements.    
    +            If value of some editable is `null` or `undefined` it is excluded from result object.
    +            When param `isSingle` is set to **true** - it is supposed you have single element and will return value of editable instead of object.   
    +             
    +            @method getValue()
    +            @param {bool} isSingle whether to return just value of single element
    +            @returns {Object} object of element names and values
    +            @example
    +            $('#username, #fullname').editable('getValue');
    +            //result:
    +            {
    +            username: "superuser",
    +            fullname: "John"
    +            }
    +            //isSingle = true
    +            $('#username').editable('getValue', true);
    +            //result "superuser" 
    +            **/
    +            case 'getValue':
    +                if(arguments.length === 2 && arguments[1] === true) { //isSingle = true
    +                    result = this.eq(0).data(datakey).value;
    +                } else {
    +                    this.each(function () {
    +                        var $this = $(this), data = $this.data(datakey);
    +                        if (data && data.value !== undefined && data.value !== null) {
    +                            result[data.options.name] = data.input.value2submit(data.value);
    +                        }
    +                    });
    +                }
    +            return result;
    +
    +            /**
    +            This method collects values from several editable elements and submit them all to server.   
    +            Internally it runs client-side validation for all fields and submits only in case of success.  
    +            See <a href="#newrecord">creating new records</a> for details.  
    +            Since 1.5.1 `submit` can be applied to single element to send data programmatically. In that case
    +            `url`, `success` and `error` is taken from initial options and you can just call `$('#username').editable('submit')`. 
    +            
    +            @method submit(options)
    +            @param {object} options 
    +            @param {object} options.url url to submit data 
    +            @param {object} options.data additional data to submit
    +            @param {object} options.ajaxOptions additional ajax options
    +            @param {function} options.error(obj) error handler 
    +            @param {function} options.success(obj,config) success handler
    +            @returns {Object} jQuery object
    +            **/
    +            case 'submit':  //collects value, validate and submit to server for creating new record
    +                var config = arguments[1] || {},
    +                $elems = this,
    +                errors = this.editable('validate');
    +
    +                // validation ok
    +                if($.isEmptyObject(errors)) {
    +                    var ajaxOptions = {};
    +                                                      
    +                    // for single element use url, success etc from options
    +                    if($elems.length === 1) {
    +                        var editable = $elems.data('editable');
    +                        //standard params
    +                        var params = {
    +                            name: editable.options.name || '',
    +                            value: editable.input.value2submit(editable.value),
    +                            pk: (typeof editable.options.pk === 'function') ? 
    +                                editable.options.pk.call(editable.options.scope) : 
    +                                editable.options.pk 
    +                        };
    +
    +                        //additional params
    +                        if(typeof editable.options.params === 'function') {
    +                            params = editable.options.params.call(editable.options.scope, params);  
    +                        } else {
    +                            //try parse json in single quotes (from data-params attribute)
    +                            editable.options.params = $.fn.editableutils.tryParseJson(editable.options.params, true);   
    +                            $.extend(params, editable.options.params);
    +                        }
    +
    +                        ajaxOptions = {
    +                            url: editable.options.url,
    +                            data: params,
    +                            type: 'POST'  
    +                        };
    +                        
    +                        // use success / error from options 
    +                        config.success = config.success || editable.options.success;
    +                        config.error = config.error || editable.options.error;
    +                        
    +                    // multiple elements
    +                    } else {
    +                        var values = this.editable('getValue'); 
    +                        
    +                        ajaxOptions = {
    +                            url: config.url,
    +                            data: values, 
    +                            type: 'POST'
    +                        };                        
    +                    }                    
    +
    +                    // ajax success callabck (response 200 OK)
    +                    ajaxOptions.success = typeof config.success === 'function' ? function(response) {
    +                            config.success.call($elems, response, config);
    +                        } : $.noop;
    +                                  
    +                    // ajax error callabck
    +                    ajaxOptions.error = typeof config.error === 'function' ? function() {
    +                             config.error.apply($elems, arguments);
    +                        } : $.noop;
    +                       
    +                    // extend ajaxOptions    
    +                    if(config.ajaxOptions) { 
    +                        $.extend(ajaxOptions, config.ajaxOptions);
    +                    }
    +                    
    +                    // extra data 
    +                    if(config.data) {
    +                        $.extend(ajaxOptions.data, config.data);
    +                    }                     
    +                    
    +                    // perform ajax request
    +                    $.ajax(ajaxOptions);
    +                } else { //client-side validation error
    +                    if(typeof config.error === 'function') {
    +                        config.error.call($elems, errors);
    +                    }
    +                }
    +            return this;
    +        }
    +
    +        //return jquery object
    +        return this.each(function () {
    +            var $this = $(this), 
    +                data = $this.data(datakey), 
    +                options = typeof option === 'object' && option;
    +
    +            //for delegated targets do not store `editable` object for element
    +            //it's allows several different selectors.
    +            //see: https://github.com/vitalets/x-editable/issues/312    
    +            if(options && options.selector) {
    +                data = new Editable(this, options);
    +                return; 
    +            }    
    +            
    +            if (!data) {
    +                $this.data(datakey, (data = new Editable(this, options)));
    +            }
    +
    +            if (typeof option === 'string') { //call method 
    +                data[option].apply(data, Array.prototype.slice.call(args, 1));
    +            } 
    +        });
    +    };    
    +            
    +
    +    $.fn.editable.defaults = {
    +        /**
    +        Type of input. Can be <code>text|textarea|select|date|checklist</code> and more
    +
    +        @property type 
    +        @type string
    +        @default 'text'
    +        **/
    +        type: 'text',        
    +        /**
    +        Sets disabled state of editable
    +
    +        @property disabled 
    +        @type boolean
    +        @default false
    +        **/         
    +        disabled: false,
    +        /**
    +        How to toggle editable. Can be <code>click|dblclick|mouseenter|manual</code>.   
    +        When set to <code>manual</code> you should manually call <code>show/hide</code> methods of editable.    
    +        **Note**: if you call <code>show</code> or <code>toggle</code> inside **click** handler of some DOM element, 
    +        you need to apply <code>e.stopPropagation()</code> because containers are being closed on any click on document.
    +        
    +        @example
    +        $('#edit-button').click(function(e) {
    +            e.stopPropagation();
    +            $('#username').editable('toggle');
    +        });
    +
    +        @property toggle 
    +        @type string
    +        @default 'click'
    +        **/          
    +        toggle: 'click',
    +        /**
    +        Text shown when element is empty.
    +
    +        @property emptytext 
    +        @type string
    +        @default 'Empty'
    +        **/         
    +        emptytext: 'Empty',
    +        /**
    +        Allows to automatically set element's text based on it's value. Can be <code>auto|always|never</code>. Useful for select and date.
    +        For example, if dropdown list is <code>{1: 'a', 2: 'b'}</code> and element's value set to <code>1</code>, it's html will be automatically set to <code>'a'</code>.  
    +        <code>auto</code> - text will be automatically set only if element is empty.  
    +        <code>always|never</code> - always(never) try to set element's text.
    +
    +        @property autotext 
    +        @type string
    +        @default 'auto'
    +        **/          
    +        autotext: 'auto', 
    +        /**
    +        Initial value of input. If not set, taken from element's text.  
    +        Note, that if element's text is empty - text is automatically generated from value and can be customized (see `autotext` option).  
    +        For example, to display currency sign:
    +        @example
    +        <a id="price" data-type="text" data-value="100"></a>
    +        <script>
    +        $('#price').editable({
    +            ...
    +            display: function(value) {
    +              $(this).text(value + '$');
    +            } 
    +        }) 
    +        </script>
    +                
    +        @property value 
    +        @type mixed
    +        @default element's text
    +        **/
    +        value: null,
    +        /**
    +        Callback to perform custom displaying of value in element's text.  
    +        If `null`, default input's display used.  
    +        If `false`, no displaying methods will be called, element's text will never change.  
    +        Runs under element's scope.  
    +        _**Parameters:**_  
    +        
    +        * `value` current value to be displayed
    +        * `response` server response (if display called after ajax submit), since 1.4.0
    +         
    +        For _inputs with source_ (select, checklist) parameters are different:  
    +          
    +        * `value` current value to be displayed
    +        * `sourceData` array of items for current input (e.g. dropdown items) 
    +        * `response` server response (if display called after ajax submit), since 1.4.0
    +                  
    +        To get currently selected items use `$.fn.editableutils.itemsByValue(value, sourceData)`.
    +        
    +        @property display 
    +        @type function|boolean
    +        @default null
    +        @since 1.2.0
    +        @example
    +        display: function(value, sourceData) {
    +           //display checklist as comma-separated values
    +           var html = [],
    +               checked = $.fn.editableutils.itemsByValue(value, sourceData);
    +               
    +           if(checked.length) {
    +               $.each(checked, function(i, v) { html.push($.fn.editableutils.escape(v.text)); });
    +               $(this).html(html.join(', '));
    +           } else {
    +               $(this).empty(); 
    +           }
    +        }
    +        **/          
    +        display: null,
    +        /**
    +        Css class applied when editable text is empty.
    +
    +        @property emptyclass 
    +        @type string
    +        @since 1.4.1        
    +        @default editable-empty
    +        **/        
    +        emptyclass: 'editable-empty',
    +        /**
    +        Css class applied when value was stored but not sent to server (`pk` is empty or `send = 'never'`).  
    +        You may set it to `null` if you work with editables locally and submit them together.  
    +
    +        @property unsavedclass 
    +        @type string
    +        @since 1.4.1        
    +        @default editable-unsaved
    +        **/        
    +        unsavedclass: 'editable-unsaved',
    +        /**
    +        If selector is provided, editable will be delegated to the specified targets.  
    +        Usefull for dynamically generated DOM elements.  
    +        **Please note**, that delegated targets can't be initialized with `emptytext` and `autotext` options, 
    +        as they actually become editable only after first click.  
    +        You should manually set class `editable-click` to these elements.  
    +        Also, if element originally empty you should add class `editable-empty`, set `data-value=""` and write emptytext into element:
    +
    +        @property selector 
    +        @type string
    +        @since 1.4.1        
    +        @default null
    +        @example
    +        <div id="user">
    +          <!-- empty -->
    +          <a href="#" data-name="username" data-type="text" class="editable-click editable-empty" data-value="" title="Username">Empty</a>
    +          <!-- non-empty -->
    +          <a href="#" data-name="group" data-type="select" data-source="/groups" data-value="1" class="editable-click" title="Group">Operator</a>
    +        </div>     
    +        
    +        <script>
    +        $('#user').editable({
    +            selector: 'a',
    +            url: '/post',
    +            pk: 1
    +        });
    +        </script>
    +        **/         
    +        selector: null,
    +        /**
    +        Color used to highlight element after update. Implemented via CSS3 transition, works in modern browsers.
    +        
    +        @property highlight 
    +        @type string|boolean
    +        @since 1.4.5        
    +        @default #FFFF80 
    +        **/
    +        highlight: '#FFFF80'
    +    };
    +    
    +}(window.jQuery));
    +
    +/**
    +AbstractInput - base class for all editable inputs.
    +It defines interface to be implemented by any input type.
    +To create your own input you can inherit from this class.
    +
    +@class abstractinput
    +**/
    +(function ($) {
    +    "use strict";
    +
    +    //types
    +    $.fn.editabletypes = {};
    +
    +    var AbstractInput = function () { };
    +
    +    AbstractInput.prototype = {
    +       /**
    +        Initializes input
    +
    +        @method init() 
    +        **/
    +       init: function(type, options, defaults) {
    +           this.type = type;
    +           this.options = $.extend({}, defaults, options);
    +       },
    +
    +       /*
    +       this method called before render to init $tpl that is inserted in DOM
    +       */
    +       prerender: function() {
    +           this.$tpl = $(this.options.tpl); //whole tpl as jquery object    
    +           this.$input = this.$tpl;         //control itself, can be changed in render method
    +           this.$clear = null;              //clear button
    +           this.error = null;               //error message, if input cannot be rendered           
    +       },
    +       
    +       /**
    +        Renders input from tpl. Can return jQuery deferred object.
    +        Can be overwritten in child objects
    +
    +        @method render()
    +       **/
    +       render: function() {
    +
    +       }, 
    +
    +       /**
    +        Sets element's html by value. 
    +
    +        @method value2html(value, element)
    +        @param {mixed} value
    +        @param {DOMElement} element
    +       **/
    +       value2html: function(value, element) {
    +           $(element)[this.options.escape ? 'text' : 'html']($.trim(value));
    +       },
    +
    +       /**
    +        Converts element's html to value
    +
    +        @method html2value(html)
    +        @param {string} html
    +        @returns {mixed}
    +       **/
    +       html2value: function(html) {
    +           return $('<div>').html(html).text();
    +       },
    +
    +       /**
    +        Converts value to string (for internal compare). For submitting to server used value2submit().
    +
    +        @method value2str(value) 
    +        @param {mixed} value
    +        @returns {string}
    +       **/
    +       value2str: function(value) {
    +           return value;
    +       }, 
    +
    +       /**
    +        Converts string received from server into value. Usually from `data-value` attribute.
    +
    +        @method str2value(str)
    +        @param {string} str
    +        @returns {mixed}
    +       **/
    +       str2value: function(str) {
    +           return str;
    +       }, 
    +       
    +       /**
    +        Converts value for submitting to server. Result can be string or object.
    +
    +        @method value2submit(value) 
    +        @param {mixed} value
    +        @returns {mixed}
    +       **/
    +       value2submit: function(value) {
    +           return value;
    +       },
    +
    +       /**
    +        Sets value of input.
    +
    +        @method value2input(value) 
    +        @param {mixed} value
    +       **/
    +       value2input: function(value) {
    +           this.$input.val(value);
    +       },
    +
    +       /**
    +        Returns value of input. Value can be object (e.g. datepicker)
    +
    +        @method input2value() 
    +       **/
    +       input2value: function() { 
    +           return this.$input.val();
    +       }, 
    +
    +       /**
    +        Activates input. For text it sets focus.
    +
    +        @method activate() 
    +       **/
    +       activate: function() {
    +           if(this.$input.is(':visible')) {
    +               this.$input.focus();
    +           }
    +       },
    +
    +       /**
    +        Creates input.
    +
    +        @method clear() 
    +       **/        
    +       clear: function() {
    +           this.$input.val(null);
    +       },
    +
    +       /**
    +        method to escape html.
    +       **/
    +       escape: function(str) {
    +           return $('<div>').text(str).html();
    +       },
    +       
    +       /**
    +        attach handler to automatically submit form when value changed (useful when buttons not shown)
    +       **/
    +       autosubmit: function() {
    +        
    +       },
    +       
    +       /**
    +       Additional actions when destroying element 
    +       **/
    +       destroy: function() {
    +       },
    +
    +       // -------- helper functions --------
    +       setClass: function() {          
    +           if(this.options.inputclass) {
    +               this.$input.addClass(this.options.inputclass); 
    +           } 
    +       },
    +
    +       setAttr: function(attr) {
    +           if (this.options[attr] !== undefined && this.options[attr] !== null) {
    +               this.$input.attr(attr, this.options[attr]);
    +           } 
    +       },
    +       
    +       option: function(key, value) {
    +            this.options[key] = value;
    +       }
    +       
    +    };
    +        
    +    AbstractInput.defaults = {  
    +        /**
    +        HTML template of input. Normally you should not change it.
    +
    +        @property tpl 
    +        @type string
    +        @default ''
    +        **/   
    +        tpl: '',
    +        /**
    +        CSS class automatically applied to input
    +        
    +        @property inputclass 
    +        @type string
    +        @default null
    +        **/         
    +        inputclass: null,
    +        
    +        /**
    +        If `true` - html will be escaped in content of element via $.text() method.  
    +        If `false` - html will not be escaped, $.html() used.  
    +        When you use own `display` function, this option obviosly has no effect.
    +        
    +        @property escape 
    +        @type boolean
    +        @since 1.5.0
    +        @default true
    +        **/         
    +        escape: true,
    +                
    +        //scope for external methods (e.g. source defined as function)
    +        //for internal use only
    +        scope: null,
    +        
    +        //need to re-declare showbuttons here to get it's value from common config (passed only options existing in defaults)
    +        showbuttons: true 
    +    };
    +    
    +    $.extend($.fn.editabletypes, {abstractinput: AbstractInput});
    +        
    +}(window.jQuery));
    +
    +/**
    +List - abstract class for inputs that have source option loaded from js array or via ajax
    +
    +@class list
    +@extends abstractinput
    +**/
    +(function ($) {
    +    "use strict";
    +    
    +    var List = function (options) {
    +       
    +    };
    +
    +    $.fn.editableutils.inherit(List, $.fn.editabletypes.abstractinput);
    +
    +    $.extend(List.prototype, {
    +        render: function () {
    +            var deferred = $.Deferred();
    +
    +            this.error = null;
    +            this.onSourceReady(function () {
    +                this.renderList();
    +                deferred.resolve();
    +            }, function () {
    +                this.error = this.options.sourceError;
    +                deferred.resolve();
    +            });
    +
    +            return deferred.promise();
    +        },
    +
    +        html2value: function (html) {
    +            return null; //can't set value by text
    +        },
    +        
    +        value2html: function (value, element, display, response) {
    +            var deferred = $.Deferred(),
    +                success = function () {
    +                    if(typeof display === 'function') {
    +                        //custom display method
    +                        display.call(element, value, this.sourceData, response); 
    +                    } else {
    +                        this.value2htmlFinal(value, element);
    +                    }
    +                    deferred.resolve();
    +               };
    +            
    +            //for null value just call success without loading source
    +            if(value === null) {
    +               success.call(this);   
    +            } else {
    +               this.onSourceReady(success, function () { deferred.resolve(); });
    +            }
    +
    +            return deferred.promise();
    +        },  
    +
    +        // ------------- additional functions ------------
    +
    +        onSourceReady: function (success, error) {
    +            //run source if it function
    +            var source;
    +            if ($.isFunction(this.options.source)) {
    +                source = this.options.source.call(this.options.scope);
    +                this.sourceData = null;
    +                //note: if function returns the same source as URL - sourceData will be taken from cahce and no extra request performed
    +            } else {
    +                source = this.options.source;
    +            }            
    +            
    +            //if allready loaded just call success
    +            if(this.options.sourceCache && $.isArray(this.sourceData)) {
    +                success.call(this);
    +                return; 
    +            }
    +
    +            //try parse json in single quotes (for double quotes jquery does automatically)
    +            try {
    +                source = $.fn.editableutils.tryParseJson(source, false);
    +            } catch (e) {
    +                error.call(this);
    +                return;
    +            }
    +
    +            //loading from url
    +            if (typeof source === 'string') {
    +                //try to get sourceData from cache
    +                if(this.options.sourceCache) {
    +                    var cacheID = source,
    +                    cache;
    +
    +                    if (!$(document).data(cacheID)) {
    +                        $(document).data(cacheID, {});
    +                    }
    +                    cache = $(document).data(cacheID);
    +
    +                    //check for cached data
    +                    if (cache.loading === false && cache.sourceData) { //take source from cache
    +                        this.sourceData = cache.sourceData;
    +                        this.doPrepend();
    +                        success.call(this);
    +                        return;
    +                    } else if (cache.loading === true) { //cache is loading, put callback in stack to be called later
    +                        cache.callbacks.push($.proxy(function () {
    +                            this.sourceData = cache.sourceData;
    +                            this.doPrepend();
    +                            success.call(this);
    +                        }, this));
    +
    +                        //also collecting error callbacks
    +                        cache.err_callbacks.push($.proxy(error, this));
    +                        return;
    +                    } else { //no cache yet, activate it
    +                        cache.loading = true;
    +                        cache.callbacks = [];
    +                        cache.err_callbacks = [];
    +                    }
    +                }
    +                
    +                //ajaxOptions for source. Can be overwritten bt options.sourceOptions
    +                var ajaxOptions = $.extend({
    +                    url: source,
    +                    type: 'get',
    +                    cache: false,
    +                    dataType: 'json',
    +                    success: $.proxy(function (data) {
    +                        if(cache) {
    +                            cache.loading = false;
    +                        }
    +                        this.sourceData = this.makeArray(data);
    +                        if($.isArray(this.sourceData)) {
    +                            if(cache) {
    +                                //store result in cache
    +                                cache.sourceData = this.sourceData;
    +                                //run success callbacks for other fields waiting for this source
    +                                $.each(cache.callbacks, function () { this.call(); }); 
    +                            }
    +                            this.doPrepend();
    +                            success.call(this);
    +                        } else {
    +                            error.call(this);
    +                            if(cache) {
    +                                //run error callbacks for other fields waiting for this source
    +                                $.each(cache.err_callbacks, function () { this.call(); }); 
    +                            }
    +                        }
    +                    }, this),
    +                    error: $.proxy(function () {
    +                        error.call(this);
    +                        if(cache) {
    +                             cache.loading = false;
    +                             //run error callbacks for other fields
    +                             $.each(cache.err_callbacks, function () { this.call(); }); 
    +                        }
    +                    }, this)
    +                }, this.options.sourceOptions);
    +                
    +                //loading sourceData from server
    +                $.ajax(ajaxOptions);
    +                
    +            } else { //options as json/array
    +                this.sourceData = this.makeArray(source);
    +                    
    +                if($.isArray(this.sourceData)) {
    +                    this.doPrepend();
    +                    success.call(this);   
    +                } else {
    +                    error.call(this);
    +                }
    +            }
    +        },
    +
    +        doPrepend: function () {
    +            if(this.options.prepend === null || this.options.prepend === undefined) {
    +                return;  
    +            }
    +            
    +            if(!$.isArray(this.prependData)) {
    +                //run prepend if it is function (once)
    +                if ($.isFunction(this.options.prepend)) {
    +                    this.options.prepend = this.options.prepend.call(this.options.scope);
    +                }
    +              
    +                //try parse json in single quotes
    +                this.options.prepend = $.fn.editableutils.tryParseJson(this.options.prepend, true);
    +                
    +                //convert prepend from string to object
    +                if (typeof this.options.prepend === 'string') {
    +                    this.options.prepend = {'': this.options.prepend};
    +                }
    +                
    +                this.prependData = this.makeArray(this.options.prepend);
    +            }
    +
    +            if($.isArray(this.prependData) && $.isArray(this.sourceData)) {
    +                this.sourceData = this.prependData.concat(this.sourceData);
    +            }
    +        },
    +
    +        /*
    +         renders input list
    +        */
    +        renderList: function() {
    +            // this method should be overwritten in child class
    +        },
    +       
    +         /*
    +         set element's html by value
    +        */
    +        value2htmlFinal: function(value, element) {
    +            // this method should be overwritten in child class
    +        },        
    +
    +        /**
    +        * convert data to array suitable for sourceData, e.g. [{value: 1, text: 'abc'}, {...}]
    +        */
    +        makeArray: function(data) {
    +            var count, obj, result = [], item, iterateItem;
    +            if(!data || typeof data === 'string') {
    +                return null; 
    +            }
    +
    +            if($.isArray(data)) { //array
    +                /* 
    +                   function to iterate inside item of array if item is object.
    +                   Caclulates count of keys in item and store in obj. 
    +                */
    +                iterateItem = function (k, v) {
    +                    obj = {value: k, text: v};
    +                    if(count++ >= 2) {
    +                        return false;// exit from `each` if item has more than one key.
    +                    }
    +                };
    +            
    +                for(var i = 0; i < data.length; i++) {
    +                    item = data[i]; 
    +                    if(typeof item === 'object') {
    +                        count = 0; //count of keys inside item
    +                        $.each(item, iterateItem);
    +                        //case: [{val1: 'text1'}, {val2: 'text2} ...]
    +                        if(count === 1) { 
    +                            result.push(obj); 
    +                            //case: [{value: 1, text: 'text1'}, {value: 2, text: 'text2'}, ...]
    +                        } else if(count > 1) {
    +                            //removed check of existance: item.hasOwnProperty('value') && item.hasOwnProperty('text')
    +                            if(item.children) {
    +                                item.children = this.makeArray(item.children);   
    +                            }
    +                            result.push(item);
    +                        }
    +                    } else {
    +                        //case: ['text1', 'text2' ...]
    +                        result.push({value: item, text: item}); 
    +                    }
    +                }
    +            } else {  //case: {val1: 'text1', val2: 'text2, ...}
    +                $.each(data, function (k, v) {
    +                    result.push({value: k, text: v});
    +                });  
    +            }
    +            return result;
    +        },
    +        
    +        option: function(key, value) {
    +            this.options[key] = value;
    +            if(key === 'source') {
    +                this.sourceData = null;
    +            }
    +            if(key === 'prepend') {
    +                this.prependData = null;
    +            }            
    +        }        
    +
    +    });      
    +
    +    List.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
    +        /**
    +        Source data for list.  
    +        If **array** - it should be in format: `[{value: 1, text: "text1"}, {value: 2, text: "text2"}, ...]`  
    +        For compability, object format is also supported: `{"1": "text1", "2": "text2" ...}` but it does not guarantee elements order.
    +        
    +        If **string** - considered ajax url to load items. In that case results will be cached for fields with the same source and name. See also `sourceCache` option.
    +          
    +        If **function**, it should return data in format above (since 1.4.0).
    +        
    +        Since 1.4.1 key `children` supported to render OPTGROUP (for **select** input only).  
    +        `[{text: "group1", children: [{value: 1, text: "text1"}, {value: 2, text: "text2"}]}, ...]` 
    +
    +		
    +        @property source 
    +        @type string | array | object | function
    +        @default null
    +        **/         
    +        source: null, 
    +        /**
    +        Data automatically prepended to the beginning of dropdown list.
    +        
    +        @property prepend 
    +        @type string | array | object | function
    +        @default false
    +        **/         
    +        prepend: false,
    +        /**
    +        Error message when list cannot be loaded (e.g. ajax error)
    +        
    +        @property sourceError 
    +        @type string
    +        @default Error when loading list
    +        **/          
    +        sourceError: 'Error when loading list',
    +        /**
    +        if <code>true</code> and source is **string url** - results will be cached for fields with the same source.    
    +        Usefull for editable column in grid to prevent extra requests.
    +        
    +        @property sourceCache 
    +        @type boolean
    +        @default true
    +        @since 1.2.0
    +        **/        
    +        sourceCache: true,
    +        /**
    +        Additional ajax options to be used in $.ajax() when loading list from server.
    +        Useful to send extra parameters (`data` key) or change request method (`type` key).
    +        
    +        @property sourceOptions 
    +        @type object|function
    +        @default null
    +        @since 1.5.0
    +        **/        
    +        sourceOptions: null
    +    });
    +
    +    $.fn.editabletypes.list = List;      
    +
    +}(window.jQuery));
    +
    +/**
    +Text input
    +
    +@class text
    +@extends abstractinput
    +@final
    +@example
    +<a href="#" id="username" data-type="text" data-pk="1">awesome</a>
    +<script>
    +$(function(){
    +    $('#username').editable({
    +        url: '/post',
    +        title: 'Enter username'
    +    });
    +});
    +</script>
    +**/
    +(function ($) {
    +    "use strict";
    +    
    +    var Text = function (options) {
    +        this.init('text', options, Text.defaults);
    +    };
    +
    +    $.fn.editableutils.inherit(Text, $.fn.editabletypes.abstractinput);
    +
    +    $.extend(Text.prototype, {
    +        render: function() {
    +           this.renderClear();
    +           this.setClass();
    +           this.setAttr('placeholder');
    +        },
    +        
    +        activate: function() {
    +            if(this.$input.is(':visible')) {
    +                this.$input.focus();
    +                $.fn.editableutils.setCursorPosition(this.$input.get(0), this.$input.val().length);
    +                if(this.toggleClear) {
    +                    this.toggleClear();
    +                }
    +            }
    +        },
    +        
    +        //render clear button
    +        renderClear:  function() {
    +           if (this.options.clear) {
    +               this.$clear = $('<span class="editable-clear-x"></span>');
    +               this.$input.after(this.$clear)
    +                          .css('padding-right', 24)
    +                          .keyup($.proxy(function(e) {
    +                              //arrows, enter, tab, etc
    +                              if(~$.inArray(e.keyCode, [40,38,9,13,27])) {
    +                                return;
    +                              }                            
    +
    +                              clearTimeout(this.t);
    +                              var that = this;
    +                              this.t = setTimeout(function() {
    +                                that.toggleClear(e);
    +                              }, 100);
    +                              
    +                          }, this))
    +                          .parent().css('position', 'relative');
    +                          
    +               this.$clear.click($.proxy(this.clear, this));                       
    +           }            
    +        },
    +        
    +        postrender: function() {
    +            /*
    +            //now `clear` is positioned via css
    +            if(this.$clear) {
    +                //can position clear button only here, when form is shown and height can be calculated
    +//                var h = this.$input.outerHeight(true) || 20,
    +                var h = this.$clear.parent().height(),
    +                    delta = (h - this.$clear.height()) / 2;
    +                    
    +                //this.$clear.css({bottom: delta, right: delta});
    +            }
    +            */ 
    +        },
    +        
    +        //show / hide clear button
    +        toggleClear: function(e) {
    +            if(!this.$clear) {
    +                return;
    +            }
    +            
    +            var len = this.$input.val().length,
    +                visible = this.$clear.is(':visible');
    +                 
    +            if(len && !visible) {
    +                this.$clear.show();
    +            } 
    +            
    +            if(!len && visible) {
    +                this.$clear.hide();
    +            } 
    +        },
    +        
    +        clear: function() {
    +           this.$clear.hide();
    +           this.$input.val('').focus();
    +        }          
    +    });
    +
    +    Text.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
    +        /**
    +        @property tpl 
    +        @default <input type="text">
    +        **/         
    +        tpl: '<input type="text">',
    +        /**
    +        Placeholder attribute of input. Shown when input is empty.
    +
    +        @property placeholder 
    +        @type string
    +        @default null
    +        **/             
    +        placeholder: null,
    +        
    +        /**
    +        Whether to show `clear` button 
    +        
    +        @property clear 
    +        @type boolean
    +        @default true        
    +        **/
    +        clear: true
    +    });
    +
    +    $.fn.editabletypes.text = Text;
    +
    +}(window.jQuery));
    +
    +/**
    +Textarea input
    +
    +@class textarea
    +@extends abstractinput
    +@final
    +@example
    +<a href="#" id="comments" data-type="textarea" data-pk="1">awesome comment!</a>
    +<script>
    +$(function(){
    +    $('#comments').editable({
    +        url: '/post',
    +        title: 'Enter comments',
    +        rows: 10
    +    });
    +});
    +</script>
    +**/
    +(function ($) {
    +    "use strict";
    +    
    +    var Textarea = function (options) {
    +        this.init('textarea', options, Textarea.defaults);
    +    };
    +
    +    $.fn.editableutils.inherit(Textarea, $.fn.editabletypes.abstractinput);
    +
    +    $.extend(Textarea.prototype, {
    +        render: function () {
    +            this.setClass();
    +            this.setAttr('placeholder');
    +            this.setAttr('rows');                        
    +            
    +            //ctrl + enter
    +            this.$input.keydown(function (e) {
    +                if (e.ctrlKey && e.which === 13) {
    +                    $(this).closest('form').submit();
    +                }
    +            });
    +        },
    +        
    +       //using `white-space: pre-wrap` solves \n  <--> BR conversion very elegant!
    +       /* 
    +       value2html: function(value, element) {
    +            var html = '', lines;
    +            if(value) {
    +                lines = value.split("\n");
    +                for (var i = 0; i < lines.length; i++) {
    +                    lines[i] = $('<div>').text(lines[i]).html();
    +                }
    +                html = lines.join('<br>');
    +            }
    +            $(element).html(html);
    +        },
    +       
    +        html2value: function(html) {
    +            if(!html) {
    +                return '';
    +            }
    +
    +            var regex = new RegExp(String.fromCharCode(10), 'g');
    +            var lines = html.split(/<br\s*\/?>/i);
    +            for (var i = 0; i < lines.length; i++) {
    +                var text = $('<div>').html(lines[i]).text();
    +
    +                // Remove newline characters (\n) to avoid them being converted by value2html() method
    +                // thus adding extra <br> tags
    +                text = text.replace(regex, '');
    +
    +                lines[i] = text;
    +            }
    +            return lines.join("\n");
    +        },
    +         */
    +        activate: function() {
    +            $.fn.editabletypes.text.prototype.activate.call(this);
    +        }
    +    });
    +
    +    Textarea.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
    +        /**
    +        @property tpl
    +        @default <textarea></textarea>
    +        **/
    +        tpl:'<textarea></textarea>',
    +        /**
    +        @property inputclass
    +        @default input-large
    +        **/
    +        inputclass: 'input-large',
    +        /**
    +        Placeholder attribute of input. Shown when input is empty.
    +
    +        @property placeholder
    +        @type string
    +        @default null
    +        **/
    +        placeholder: null,
    +        /**
    +        Number of rows in textarea
    +
    +        @property rows
    +        @type integer
    +        @default 7
    +        **/        
    +        rows: 7        
    +    });
    +
    +    $.fn.editabletypes.textarea = Textarea;
    +
    +}(window.jQuery));
    +
    +/**
    +Select (dropdown)
    +
    +@class select
    +@extends list
    +@final
    +@example
    +<a href="#" id="status" data-type="select" data-pk="1" data-url="/post" data-title="Select status"></a>
    +<script>
    +$(function(){
    +    $('#status').editable({
    +        value: 2,    
    +        source: [
    +              {value: 1, text: 'Active'},
    +              {value: 2, text: 'Blocked'},
    +              {value: 3, text: 'Deleted'}
    +           ]
    +    });
    +});
    +</script>
    +**/
    +(function ($) {
    +    "use strict";
    +    
    +    var Select = function (options) {
    +        this.init('select', options, Select.defaults);
    +    };
    +
    +    $.fn.editableutils.inherit(Select, $.fn.editabletypes.list);
    +
    +    $.extend(Select.prototype, {
    +        renderList: function() {
    +            this.$input.empty();
    +
    +            var fillItems = function($el, data) {
    +                var attr;
    +                if($.isArray(data)) {
    +                    for(var i=0; i<data.length; i++) {
    +                        attr = {};
    +                        if(data[i].children) {
    +                            attr.label = data[i].text;
    +                            $el.append(fillItems($('<optgroup>', attr), data[i].children)); 
    +                        } else {
    +                            attr.value = data[i].value;
    +                            if(data[i].disabled) {
    +                                attr.disabled = true;
    +                            }
    +                            $el.append($('<option>', attr).text(data[i].text)); 
    +                        }
    +                    }
    +                }
    +                return $el;
    +            };        
    +
    +            fillItems(this.$input, this.sourceData);
    +            
    +            this.setClass();
    +            
    +            //enter submit
    +            this.$input.on('keydown.editable', function (e) {
    +                if (e.which === 13) {
    +                    $(this).closest('form').submit();
    +                }
    +            });            
    +        },
    +       
    +        value2htmlFinal: function(value, element) {
    +            var text = '', 
    +                items = $.fn.editableutils.itemsByValue(value, this.sourceData);
    +                
    +            if(items.length) {
    +                text = items[0].text;
    +            }
    +            
    +            //$(element).text(text);
    +            $.fn.editabletypes.abstractinput.prototype.value2html.call(this, text, element);
    +        },
    +        
    +        autosubmit: function() {
    +            this.$input.off('keydown.editable').on('change.editable', function(){
    +                $(this).closest('form').submit();
    +            });
    +        }
    +    });      
    +
    +    Select.defaults = $.extend({}, $.fn.editabletypes.list.defaults, {
    +        /**
    +        @property tpl 
    +        @default <select></select>
    +        **/         
    +        tpl:'<select></select>'
    +    });
    +
    +    $.fn.editabletypes.select = Select;      
    +
    +}(window.jQuery));
    +
    +/**
    +List of checkboxes. 
    +Internally value stored as javascript array of values.
    +
    +@class checklist
    +@extends list
    +@final
    +@example
    +<a href="#" id="options" data-type="checklist" data-pk="1" data-url="/post" data-title="Select options"></a>
    +<script>
    +$(function(){
    +    $('#options').editable({
    +        value: [2, 3],    
    +        source: [
    +              {value: 1, text: 'option1'},
    +              {value: 2, text: 'option2'},
    +              {value: 3, text: 'option3'}
    +           ]
    +    });
    +});
    +</script>
    +**/
    +(function ($) {
    +    "use strict";
    +    
    +    var Checklist = function (options) {
    +        this.init('checklist', options, Checklist.defaults);
    +    };
    +
    +    $.fn.editableutils.inherit(Checklist, $.fn.editabletypes.list);
    +
    +    $.extend(Checklist.prototype, {
    +        renderList: function() {
    +            var $label, $div;
    +            
    +            this.$tpl.empty();
    +            
    +            if(!$.isArray(this.sourceData)) {
    +                return;
    +            }
    +
    +            for(var i=0; i<this.sourceData.length; i++) {
    +                $label = $('<label>').append($('<input>', {
    +                                           type: 'checkbox',
    +                                           value: this.sourceData[i].value 
    +                                     }))
    +                                     .append($('<span>').text(' '+this.sourceData[i].text));
    +                
    +                $('<div>').append($label).appendTo(this.$tpl);
    +            }
    +            
    +            this.$input = this.$tpl.find('input[type="checkbox"]');
    +            this.setClass();
    +        },
    +       
    +       value2str: function(value) {
    +           return $.isArray(value) ? value.sort().join($.trim(this.options.separator)) : '';
    +       },  
    +       
    +       //parse separated string
    +        str2value: function(str) {
    +           var reg, value = null;
    +           if(typeof str === 'string' && str.length) {
    +               reg = new RegExp('\\s*'+$.trim(this.options.separator)+'\\s*');
    +               value = str.split(reg);
    +           } else if($.isArray(str)) {
    +               value = str; 
    +           } else {
    +               value = [str];
    +           }
    +           return value;
    +        },       
    +       
    +       //set checked on required checkboxes
    +       value2input: function(value) {
    +            this.$input.prop('checked', false);
    +            if($.isArray(value) && value.length) {
    +               this.$input.each(function(i, el) {
    +                   var $el = $(el);
    +                   // cannot use $.inArray as it performs strict comparison
    +                   $.each(value, function(j, val){
    +                       /*jslint eqeq: true*/
    +                       if($el.val() == val) {
    +                       /*jslint eqeq: false*/                           
    +                           $el.prop('checked', true);
    +                       }
    +                   });
    +               }); 
    +            }  
    +        },  
    +        
    +       input2value: function() { 
    +           var checked = [];
    +           this.$input.filter(':checked').each(function(i, el) {
    +               checked.push($(el).val());
    +           });
    +           return checked;
    +       },            
    +          
    +       //collect text of checked boxes
    +        value2htmlFinal: function(value, element) {
    +           var html = [],
    +               checked = $.fn.editableutils.itemsByValue(value, this.sourceData),
    +               escape = this.options.escape;
    +               
    +           if(checked.length) {
    +               $.each(checked, function(i, v) {
    +                   var text = escape ? $.fn.editableutils.escape(v.text) : v.text; 
    +                   html.push(text); 
    +               });
    +               $(element).html(html.join('<br>'));
    +           } else {
    +               $(element).empty(); 
    +           }
    +        },
    +        
    +       activate: function() {
    +           this.$input.first().focus();
    +       },
    +       
    +       autosubmit: function() {
    +           this.$input.on('keydown', function(e){
    +               if (e.which === 13) {
    +                   $(this).closest('form').submit();
    +               }
    +           });
    +       }
    +    });      
    +
    +    Checklist.defaults = $.extend({}, $.fn.editabletypes.list.defaults, {
    +        /**
    +        @property tpl 
    +        @default <div></div>
    +        **/         
    +        tpl:'<div class="editable-checklist"></div>',
    +        
    +        /**
    +        @property inputclass 
    +        @type string
    +        @default null
    +        **/         
    +        inputclass: null,        
    +        
    +        /**
    +        Separator of values when reading from `data-value` attribute
    +
    +        @property separator 
    +        @type string
    +        @default ','
    +        **/         
    +        separator: ','
    +    });
    +
    +    $.fn.editabletypes.checklist = Checklist;      
    +
    +}(window.jQuery));
    +
    +/**
    +HTML5 input types.
    +Following types are supported:
    +
    +* password
    +* email
    +* url
    +* tel
    +* number
    +* range
    +* time
    +
    +Learn more about html5 inputs:  
    +http://www.w3.org/wiki/HTML5_form_additions  
    +To check browser compatibility please see:  
    +https://developer.mozilla.org/en-US/docs/HTML/Element/Input
    +            
    +@class html5types 
    +@extends text
    +@final
    +@since 1.3.0
    +@example
    +<a href="#" id="email" data-type="email" data-pk="1">admin@example.com</a>
    +<script>
    +$(function(){
    +    $('#email').editable({
    +        url: '/post',
    +        title: 'Enter email'
    +    });
    +});
    +</script>
    +**/
    +
    +/**
    +@property tpl 
    +@default depends on type
    +**/ 
    +
    +/*
    +Password
    +*/
    +(function ($) {
    +    "use strict";
    +    
    +    var Password = function (options) {
    +        this.init('password', options, Password.defaults);
    +    };
    +    $.fn.editableutils.inherit(Password, $.fn.editabletypes.text);
    +    $.extend(Password.prototype, {
    +       //do not display password, show '[hidden]' instead
    +       value2html: function(value, element) {
    +           if(value) {
    +               $(element).text('[hidden]');
    +           } else {
    +               $(element).empty(); 
    +           }
    +       },
    +       //as password not displayed, should not set value by html
    +       html2value: function(html) {
    +           return null;
    +       }       
    +    });    
    +    Password.defaults = $.extend({}, $.fn.editabletypes.text.defaults, {
    +        tpl: '<input type="password">'
    +    });
    +    $.fn.editabletypes.password = Password;
    +}(window.jQuery));
    +
    +
    +/*
    +Email
    +*/
    +(function ($) {
    +    "use strict";
    +    
    +    var Email = function (options) {
    +        this.init('email', options, Email.defaults);
    +    };
    +    $.fn.editableutils.inherit(Email, $.fn.editabletypes.text);
    +    Email.defaults = $.extend({}, $.fn.editabletypes.text.defaults, {
    +        tpl: '<input type="email">'
    +    });
    +    $.fn.editabletypes.email = Email;
    +}(window.jQuery));
    +
    +
    +/*
    +Url
    +*/
    +(function ($) {
    +    "use strict";
    +    
    +    var Url = function (options) {
    +        this.init('url', options, Url.defaults);
    +    };
    +    $.fn.editableutils.inherit(Url, $.fn.editabletypes.text);
    +    Url.defaults = $.extend({}, $.fn.editabletypes.text.defaults, {
    +        tpl: '<input type="url">'
    +    });
    +    $.fn.editabletypes.url = Url;
    +}(window.jQuery));
    +
    +
    +/*
    +Tel
    +*/
    +(function ($) {
    +    "use strict";
    +    
    +    var Tel = function (options) {
    +        this.init('tel', options, Tel.defaults);
    +    };
    +    $.fn.editableutils.inherit(Tel, $.fn.editabletypes.text);
    +    Tel.defaults = $.extend({}, $.fn.editabletypes.text.defaults, {
    +        tpl: '<input type="tel">'
    +    });
    +    $.fn.editabletypes.tel = Tel;
    +}(window.jQuery));
    +
    +
    +/*
    +Number
    +*/
    +(function ($) {
    +    "use strict";
    +    
    +    var NumberInput = function (options) {
    +        this.init('number', options, NumberInput.defaults);
    +    };
    +    $.fn.editableutils.inherit(NumberInput, $.fn.editabletypes.text);
    +    $.extend(NumberInput.prototype, {
    +         render: function () {
    +            NumberInput.superclass.render.call(this);
    +            this.setAttr('min');
    +            this.setAttr('max');
    +            this.setAttr('step');
    +        },
    +        postrender: function() {
    +            if(this.$clear) {
    +                //increase right ffset  for up/down arrows
    +                this.$clear.css({right: 24});
    +                /*
    +                //can position clear button only here, when form is shown and height can be calculated
    +                var h = this.$input.outerHeight(true) || 20,
    +                    delta = (h - this.$clear.height()) / 2;
    +                
    +                //add 12px to offset right for up/down arrows    
    +                this.$clear.css({top: delta, right: delta + 16});
    +                */
    +            } 
    +        }        
    +    });     
    +    NumberInput.defaults = $.extend({}, $.fn.editabletypes.text.defaults, {
    +        tpl: '<input type="number">',
    +        inputclass: 'input-mini',
    +        min: null,
    +        max: null,
    +        step: null
    +    });
    +    $.fn.editabletypes.number = NumberInput;
    +}(window.jQuery));
    +
    +
    +/*
    +Range (inherit from number)
    +*/
    +(function ($) {
    +    "use strict";
    +    
    +    var Range = function (options) {
    +        this.init('range', options, Range.defaults);
    +    };
    +    $.fn.editableutils.inherit(Range, $.fn.editabletypes.number);
    +    $.extend(Range.prototype, {
    +        render: function () {
    +            this.$input = this.$tpl.filter('input');
    +            
    +            this.setClass();
    +            this.setAttr('min');
    +            this.setAttr('max');
    +            this.setAttr('step');           
    +            
    +            this.$input.on('input', function(){
    +                $(this).siblings('output').text($(this).val()); 
    +            });  
    +        },
    +        activate: function() {
    +            this.$input.focus();
    +        }         
    +    });
    +    Range.defaults = $.extend({}, $.fn.editabletypes.number.defaults, {
    +        tpl: '<input type="range"><output style="width: 30px; display: inline-block"></output>',
    +        inputclass: 'input-medium'
    +    });
    +    $.fn.editabletypes.range = Range;
    +}(window.jQuery));
    +
    +/*
    +Time
    +*/
    +(function ($) {
    +    "use strict";
    +
    +    var Time = function (options) {
    +        this.init('time', options, Time.defaults);
    +    };
    +    //inherit from abstract, as inheritance from text gives selection error.
    +    $.fn.editableutils.inherit(Time, $.fn.editabletypes.abstractinput);
    +    $.extend(Time.prototype, {
    +        render: function() {
    +           this.setClass();
    +        }        
    +    });
    +    Time.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
    +        tpl: '<input type="time">'
    +    });
    +    $.fn.editabletypes.time = Time;
    +}(window.jQuery));
    +
    +/**
    +Select2 input. Based on amazing work of Igor Vaynberg https://github.com/ivaynberg/select2.  
    +Please see [original select2 docs](http://ivaynberg.github.com/select2) for detailed description and options.  
    + 
    +You should manually download and include select2 distributive:  
    +
    +    <link href="select2/select2.css" rel="stylesheet" type="text/css"></link>  
    +    <script src="select2/select2.js"></script>  
    +    
    +To make it **bootstrap-styled** you can use css from [here](https://github.com/t0m/select2-bootstrap-css): 
    +
    +    <link href="select2-bootstrap.css" rel="stylesheet" type="text/css"></link>    
    +    
    +**Note:** currently `autotext` feature does not work for select2 with `ajax` remote source.    
    +You need initially put both `data-value` and element's text youself:    
    +
    +    <a href="#" data-type="select2" data-value="1">Text1</a>
    +    
    +    
    +@class select2
    +@extends abstractinput
    +@since 1.4.1
    +@final
    +@example
    +<a href="#" id="country" data-type="select2" data-pk="1" data-value="ru" data-url="/post" data-title="Select country"></a>
    +<script>
    +$(function(){
    +    //local source
    +    $('#country').editable({
    +        source: [
    +              {id: 'gb', text: 'Great Britain'},
    +              {id: 'us', text: 'United States'},
    +              {id: 'ru', text: 'Russia'}
    +           ],
    +        select2: {
    +           multiple: true
    +        }
    +    });
    +    //remote source (simple)
    +    $('#country').editable({
    +        source: '/getCountries',
    +        select2: {
    +            placeholder: 'Select Country',
    +            minimumInputLength: 1
    +        }
    +    });
    +    //remote source (advanced)
    +    $('#country').editable({
    +        select2: {
    +            placeholder: 'Select Country',
    +            allowClear: true,
    +            minimumInputLength: 3,
    +            id: function (item) {
    +                return item.CountryId;
    +            },
    +            ajax: {
    +                url: '/getCountries',
    +                dataType: 'json',
    +                data: function (term, page) {
    +                    return { query: term };
    +                },
    +                results: function (data, page) {
    +                    return { results: data };
    +                }
    +            },
    +            formatResult: function (item) {
    +                return item.CountryName;
    +            },
    +            formatSelection: function (item) {
    +                return item.CountryName;
    +            },
    +            initSelection: function (element, callback) {
    +                return $.get('/getCountryById', { query: element.val() }, function (data) {
    +                    callback(data);
    +                });
    +            } 
    +        }  
    +    });
    +});
    +</script>
    +**/
    +(function ($) {
    +    "use strict";
    +    
    +    var Constructor = function (options) {
    +        this.init('select2', options, Constructor.defaults);
    +
    +        options.select2 = options.select2 || {};
    +
    +        this.sourceData = null;
    +        
    +        //placeholder
    +        if(options.placeholder) {
    +            options.select2.placeholder = options.placeholder;
    +        }
    +       
    +        //if not `tags` mode, use source
    +        if(!options.select2.tags && options.source) {
    +            var source = options.source;
    +            //if source is function, call it (once!)
    +            if ($.isFunction(options.source)) {
    +                source = options.source.call(options.scope);
    +            }               
    +
    +            if (typeof source === 'string') {
    +                options.select2.ajax = options.select2.ajax || {};
    +                //some default ajax params
    +                if(!options.select2.ajax.data) {
    +                    options.select2.ajax.data = function(term) {return { query:term };};
    +                }
    +                if(!options.select2.ajax.results) {
    +                    options.select2.ajax.results = function(data) { return {results:data };};
    +                }
    +                options.select2.ajax.url = source;
    +            } else {
    +                //check format and convert x-editable format to select2 format (if needed)
    +                this.sourceData = this.convertSource(source);
    +                options.select2.data = this.sourceData;
    +            }
    +        } 
    +
    +        //overriding objects in config (as by default jQuery extend() is not recursive)
    +        this.options.select2 = $.extend({}, Constructor.defaults.select2, options.select2);
    +
    +        //detect whether it is multi-valued
    +        this.isMultiple = this.options.select2.tags || this.options.select2.multiple;
    +        this.isRemote = ('ajax' in this.options.select2);
    +
    +        //store function returning ID of item
    +        //should be here as used inautotext for local source
    +        this.idFunc = this.options.select2.id;
    +        if (typeof(this.idFunc) !== "function") {
    +            var idKey = this.idFunc || 'id';
    +            this.idFunc = function (e) { return e[idKey]; };
    +        }
    +
    +        //store function that renders text in select2
    +        this.formatSelection = this.options.select2.formatSelection;
    +        if (typeof(this.formatSelection) !== "function") {
    +            this.formatSelection = function (e) { return e.text; };
    +        }
    +    };
    +
    +    $.fn.editableutils.inherit(Constructor, $.fn.editabletypes.abstractinput);
    +
    +    $.extend(Constructor.prototype, {
    +        render: function() {
    +            this.setClass();
    +
    +            //can not apply select2 here as it calls initSelection 
    +            //over input that does not have correct value yet.
    +            //apply select2 only in value2input
    +            //this.$input.select2(this.options.select2);
    +
    +            //when data is loaded via ajax, we need to know when it's done to populate listData
    +            if(this.isRemote) {
    +                //listen to loaded event to populate data
    +                this.$input.on('select2-loaded', $.proxy(function(e) {
    +                    this.sourceData = e.items.results;
    +                }, this));
    +            }
    +
    +            //trigger resize of editableform to re-position container in multi-valued mode
    +            if(this.isMultiple) {
    +               this.$input.on('change', function() {
    +                   $(this).closest('form').parent().triggerHandler('resize');
    +               });
    +            }
    +       },
    +
    +       value2html: function(value, element) {
    +           var text = '', data,
    +               that = this;
    +
    +           if(this.options.select2.tags) { //in tags mode just assign value
    +              data = value; 
    +              //data = $.fn.editableutils.itemsByValue(value, this.options.select2.tags, this.idFunc);
    +           } else if(this.sourceData) {
    +              data = $.fn.editableutils.itemsByValue(value, this.sourceData, this.idFunc); 
    +           } else {
    +              //can not get list of possible values 
    +              //(e.g. autotext for select2 with ajax source)
    +           }
    +
    +           //data may be array (when multiple values allowed)
    +           if($.isArray(data)) {
    +               //collect selected data and show with separator
    +               text = [];
    +               $.each(data, function(k, v){
    +                   text.push(v && typeof v === 'object' ? that.formatSelection(v) : v);
    +               });
    +           } else if(data) {
    +               text = that.formatSelection(data);
    +           }
    +
    +           text = $.isArray(text) ? text.join(this.options.viewseparator) : text;
    +
    +           //$(element).text(text);
    +           Constructor.superclass.value2html.call(this, text, element); 
    +       },
    +
    +       html2value: function(html) {
    +           return this.options.select2.tags ? this.str2value(html, this.options.viewseparator) : null;
    +       },
    +
    +       value2input: function(value) {
    +           // if value array => join it anyway
    +           if($.isArray(value)) {
    +              value = value.join(this.getSeparator());
    +           }
    +
    +           //for remote source just set value, text is updated by initSelection
    +           if(!this.$input.data('select2')) {
    +               this.$input.val(value);
    +               this.$input.select2(this.options.select2);
    +           } else {
    +               //second argument needed to separate initial change from user's click (for autosubmit)   
    +               this.$input.val(value).trigger('change', true); 
    +
    +               //Uncaught Error: cannot call val() if initSelection() is not defined
    +               //this.$input.select2('val', value);
    +           }
    +
    +           // if defined remote source AND no multiple mode AND no user's initSelection provided --> 
    +           // we should somehow get text for provided id.
    +           // The solution is to use element's text as text for that id (exclude empty)
    +           if(this.isRemote && !this.isMultiple && !this.options.select2.initSelection) {
    +               // customId and customText are methods to extract `id` and `text` from data object
    +               // we can use this workaround only if user did not define these methods
    +               // otherwise we cant construct data object
    +               var customId = this.options.select2.id,
    +                   customText = this.options.select2.formatSelection;
    +
    +               if(!customId && !customText) {
    +                   var $el = $(this.options.scope);
    +                   if (!$el.data('editable').isEmpty) {
    +                       var data = {id: value, text: $el.text()};
    +                       this.$input.select2('data', data); 
    +                   }
    +               }
    +           }
    +       },
    +       
    +       input2value: function() { 
    +           return this.$input.select2('val');
    +       },
    +
    +       str2value: function(str, separator) {
    +            if(typeof str !== 'string' || !this.isMultiple) {
    +                return str;
    +            }
    +
    +            separator = separator || this.getSeparator();
    +
    +            var val, i, l;
    +
    +            if (str === null || str.length < 1) {
    +                return null;
    +            }
    +            val = str.split(separator);
    +            for (i = 0, l = val.length; i < l; i = i + 1) {
    +                val[i] = $.trim(val[i]);
    +            }
    +
    +            return val;
    +       },
    +
    +        autosubmit: function() {
    +            this.$input.on('change', function(e, isInitial){
    +                if(!isInitial) {
    +                  $(this).closest('form').submit();
    +                }
    +            });
    +        },
    +
    +        getSeparator: function() {
    +            return this.options.select2.separator || $.fn.select2.defaults.separator;
    +        },
    +
    +        /*
    +        Converts source from x-editable format: {value: 1, text: "1"} to
    +        select2 format: {id: 1, text: "1"}
    +        */
    +        convertSource: function(source) {
    +            if($.isArray(source) && source.length && source[0].value !== undefined) {
    +                for(var i = 0; i<source.length; i++) {
    +                    if(source[i].value !== undefined) {
    +                        source[i].id = source[i].value;
    +                        delete source[i].value;
    +                    }
    +                }
    +            }
    +            return source;
    +        },
    +        
    +        destroy: function() {
    +            if(this.$input.data('select2')) {
    +                this.$input.select2('destroy');
    +            }
    +        }
    +        
    +    });
    +
    +    Constructor.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
    +        /**
    +        @property tpl 
    +        @default <input type="hidden">
    +        **/
    +        tpl:'<input type="hidden">',
    +        /**
    +        Configuration of select2. [Full list of options](http://ivaynberg.github.com/select2).
    +
    +        @property select2 
    +        @type object
    +        @default null
    +        **/
    +        select2: null,
    +        /**
    +        Placeholder attribute of select
    +
    +        @property placeholder 
    +        @type string
    +        @default null
    +        **/
    +        placeholder: null,
    +        /**
    +        Source data for select. It will be assigned to select2 `data` property and kept here just for convenience.
    +        Please note, that format is different from simple `select` input: use 'id' instead of 'value'.
    +        E.g. `[{id: 1, text: "text1"}, {id: 2, text: "text2"}, ...]`.
    +
    +        @property source 
    +        @type array|string|function
    +        @default null        
    +        **/
    +        source: null,
    +        /**
    +        Separator used to display tags.
    +
    +        @property viewseparator 
    +        @type string
    +        @default ', '        
    +        **/
    +        viewseparator: ', '
    +    });
    +
    +    $.fn.editabletypes.select2 = Constructor;
    +
    +}(window.jQuery));
    +
    +/**
    +* Combodate - 1.0.5
    +* Dropdown date and time picker.
    +* Converts text input into dropdowns to pick day, month, year, hour, minute and second.
    +* Uses momentjs as datetime library http://momentjs.com.
    +* For i18n include corresponding file from https://github.com/timrwood/moment/tree/master/lang 
    +*
    +* Confusion at noon and midnight - see http://en.wikipedia.org/wiki/12-hour_clock#Confusion_at_noon_and_midnight
    +* In combodate: 
    +* 12:00 pm --> 12:00 (24-h format, midday)
    +* 12:00 am --> 00:00 (24-h format, midnight, start of day)
    +* 
    +* Differs from momentjs parse rules:
    +* 00:00 pm, 12:00 pm --> 12:00 (24-h format, day not change)
    +* 00:00 am, 12:00 am --> 00:00 (24-h format, day not change)
    +* 
    +* 
    +* Author: Vitaliy Potapov
    +* Project page: http://github.com/vitalets/combodate
    +* Copyright (c) 2012 Vitaliy Potapov. Released under MIT License.
    +**/
    +(function ($) {
    +
    +    var Combodate = function (element, options) {
    +        this.$element = $(element);
    +        if(!this.$element.is('input')) {
    +            $.error('Combodate should be applied to INPUT element');
    +            return;
    +        }
    +        this.options = $.extend({}, $.fn.combodate.defaults, options, this.$element.data());
    +        this.init();  
    +     };
    +
    +    Combodate.prototype = {
    +        constructor: Combodate, 
    +        init: function () {
    +            this.map = {
    +                //key   regexp    moment.method
    +                day:    ['D',    'date'], 
    +                month:  ['M',    'month'], 
    +                year:   ['Y',    'year'], 
    +                hour:   ['[Hh]', 'hours'],
    +                minute: ['m',    'minutes'], 
    +                second: ['s',    'seconds'],
    +                ampm:   ['[Aa]', ''] 
    +            };
    +            
    +            this.$widget = $('<span class="combodate"></span>').html(this.getTemplate());
    +                      
    +            this.initCombos();
    +            
    +            //update original input on change 
    +            this.$widget.on('change', 'select', $.proxy(function(e) {
    +                this.$element.val(this.getValue()).change();
    +                // update days count if month or year changes
    +                if (this.options.smartDays) {
    +                    if ($(e.target).is('.month') || $(e.target).is('.year')) {
    +                        this.fillCombo('day');
    +                    }
    +                }
    +            }, this));
    +            
    +            this.$widget.find('select').css('width', 'auto');
    +                                       
    +            // hide original input and insert widget                                       
    +            this.$element.hide().after(this.$widget);
    +            
    +            // set initial value
    +            this.setValue(this.$element.val() || this.options.value);
    +        },
    +        
    +        /*
    +         Replace tokens in template with <select> elements 
    +        */         
    +        getTemplate: function() {
    +            var tpl = this.options.template;
    +
    +            //first pass
    +            $.each(this.map, function(k, v) {
    +                v = v[0]; 
    +                var r = new RegExp(v+'+'),
    +                    token = v.length > 1 ? v.substring(1, 2) : v;
    +                    
    +                tpl = tpl.replace(r, '{'+token+'}');
    +            });
    +
    +            //replace spaces with &nbsp;
    +            tpl = tpl.replace(/ /g, '&nbsp;');
    +
    +            //second pass
    +            $.each(this.map, function(k, v) {
    +                v = v[0];
    +                var token = v.length > 1 ? v.substring(1, 2) : v;
    +                    
    +                tpl = tpl.replace('{'+token+'}', '<select class="'+k+'"></select>');
    +            });   
    +
    +            return tpl;
    +        },
    +        
    +        /*
    +         Initialize combos that presents in template 
    +        */        
    +        initCombos: function() {
    +            for (var k in this.map) {
    +                var $c = this.$widget.find('.'+k);
    +                // set properties like this.$day, this.$month etc.
    +                this['$'+k] = $c.length ? $c : null;
    +                // fill with items
    +                this.fillCombo(k);
    +            }
    +        },
    +
    +        /*
    +         Fill combo with items 
    +        */        
    +        fillCombo: function(k) {
    +            var $combo = this['$'+k];
    +            if (!$combo) {
    +                return;
    +            }
    +
    +            // define method name to fill items, e.g `fillDays`
    +            var f = 'fill' + k.charAt(0).toUpperCase() + k.slice(1); 
    +            var items = this[f]();
    +            var value = $combo.val();
    +
    +            $combo.empty();
    +            for(var i=0; i<items.length; i++) {
    +                $combo.append('<option value="'+items[i][0]+'">'+items[i][1]+'</option>');
    +            }
    +
    +            $combo.val(value);
    +        },
    +
    +        /*
    +         Initialize items of combos. Handles `firstItem` option 
    +        */
    +        fillCommon: function(key) {
    +            var values = [],
    +                relTime;
    +                
    +            if(this.options.firstItem === 'name') {
    +                //need both to support moment ver < 2 and  >= 2
    +                relTime = moment.relativeTime || moment.langData()._relativeTime; 
    +                var header = typeof relTime[key] === 'function' ? relTime[key](1, true, key, false) : relTime[key];
    +                //take last entry (see momentjs lang files structure) 
    +                header = header.split(' ').reverse()[0];                
    +                values.push(['', header]);
    +            } else if(this.options.firstItem === 'empty') {
    +                values.push(['', '']);
    +            }
    +            return values;
    +        },  
    +
    +
    +        /*
    +        fill day
    +        */
    +        fillDay: function() {
    +            var items = this.fillCommon('d'), name, i,
    +                twoDigit = this.options.template.indexOf('DD') !== -1,
    +                daysCount = 31;
    +
    +            // detect days count (depends on month and year)
    +            // originally https://github.com/vitalets/combodate/pull/7
    +            if (this.options.smartDays && this.$month && this.$year) {
    +                var month = parseInt(this.$month.val(), 10);
    +                var year = parseInt(this.$year.val(), 10);
    +
    +                if (!isNaN(month) && !isNaN(year)) {
    +                    daysCount = moment([year, month]).daysInMonth();
    +                }
    +            }
    +
    +            for (i = 1; i <= daysCount; i++) {
    +                name = twoDigit ? this.leadZero(i) : i;
    +                items.push([i, name]);
    +            }
    +            return items;        
    +        },
    +        
    +        /*
    +        fill month
    +        */
    +        fillMonth: function() {
    +            var items = this.fillCommon('M'), name, i, 
    +                longNames = this.options.template.indexOf('MMMM') !== -1,
    +                shortNames = this.options.template.indexOf('MMM') !== -1,
    +                twoDigit = this.options.template.indexOf('MM') !== -1;
    +                
    +            for(i=0; i<=11; i++) {
    +                if(longNames) {
    +                    //see https://github.com/timrwood/momentjs.com/pull/36
    +                    name = moment().date(1).month(i).format('MMMM');
    +                } else if(shortNames) {
    +                    name = moment().date(1).month(i).format('MMM');
    +                } else if(twoDigit) {
    +                    name = this.leadZero(i+1);
    +                } else {
    +                    name = i+1;
    +                }
    +                items.push([i, name]);
    +            } 
    +            return items;
    +        },  
    +        
    +        /*
    +        fill year
    +        */
    +        fillYear: function() {
    +            var items = [], name, i, 
    +                longNames = this.options.template.indexOf('YYYY') !== -1;
    +           
    +            for(i=this.options.maxYear; i>=this.options.minYear; i--) {
    +                name = longNames ? i : (i+'').substring(2);
    +                items[this.options.yearDescending ? 'push' : 'unshift']([i, name]);
    +            }
    +            
    +            items = this.fillCommon('y').concat(items);
    +            
    +            return items;              
    +        },    
    +        
    +        /*
    +        fill hour
    +        */
    +        fillHour: function() {
    +            var items = this.fillCommon('h'), name, i,
    +                h12 = this.options.template.indexOf('h') !== -1,
    +                h24 = this.options.template.indexOf('H') !== -1,
    +                twoDigit = this.options.template.toLowerCase().indexOf('hh') !== -1,
    +                min = h12 ? 1 : 0, 
    +                max = h12 ? 12 : 23;
    +                
    +            for(i=min; i<=max; i++) {
    +                name = twoDigit ? this.leadZero(i) : i;
    +                items.push([i, name]);
    +            } 
    +            return items;                 
    +        },    
    +        
    +        /*
    +        fill minute
    +        */
    +        fillMinute: function() {
    +            var items = this.fillCommon('m'), name, i,
    +                twoDigit = this.options.template.indexOf('mm') !== -1;
    +
    +            for(i=0; i<=59; i+= this.options.minuteStep) {
    +                name = twoDigit ? this.leadZero(i) : i;
    +                items.push([i, name]);
    +            }    
    +            return items;              
    +        },  
    +        
    +        /*
    +        fill second
    +        */
    +        fillSecond: function() {
    +            var items = this.fillCommon('s'), name, i,
    +                twoDigit = this.options.template.indexOf('ss') !== -1;
    +
    +            for(i=0; i<=59; i+= this.options.secondStep) {
    +                name = twoDigit ? this.leadZero(i) : i;
    +                items.push([i, name]);
    +            }    
    +            return items;              
    +        },  
    +        
    +        /*
    +        fill ampm
    +        */
    +        fillAmpm: function() {
    +            var ampmL = this.options.template.indexOf('a') !== -1,
    +                ampmU = this.options.template.indexOf('A') !== -1,            
    +                items = [
    +                    ['am', ampmL ? 'am' : 'AM'],
    +                    ['pm', ampmL ? 'pm' : 'PM']
    +                ];
    +            return items;                              
    +        },                                       
    +
    +        /*
    +         Returns current date value from combos. 
    +         If format not specified - `options.format` used.
    +         If format = `null` - Moment object returned.
    +        */
    +        getValue: function(format) {
    +            var dt, values = {}, 
    +                that = this,
    +                notSelected = false;
    +                
    +            //getting selected values    
    +            $.each(this.map, function(k, v) {
    +                if(k === 'ampm') {
    +                    return;
    +                }
    +                var def = k === 'day' ? 1 : 0;
    +                  
    +                values[k] = that['$'+k] ? parseInt(that['$'+k].val(), 10) : def; 
    +                
    +                if(isNaN(values[k])) {
    +                   notSelected = true;
    +                   return false; 
    +                }
    +            });
    +            
    +            //if at least one visible combo not selected - return empty string
    +            if(notSelected) {
    +               return '';
    +            }
    +            
    +            //convert hours 12h --> 24h 
    +            if(this.$ampm) {
    +                //12:00 pm --> 12:00 (24-h format, midday), 12:00 am --> 00:00 (24-h format, midnight, start of day)
    +                if(values.hour === 12) {
    +                    values.hour = this.$ampm.val() === 'am' ? 0 : 12;                    
    +                } else {
    +                    values.hour = this.$ampm.val() === 'am' ? values.hour : values.hour+12;
    +                }
    +            }    
    +            
    +            dt = moment([values.year, values.month, values.day, values.hour, values.minute, values.second]);
    +            
    +            //highlight invalid date
    +            this.highlight(dt);
    +                              
    +            format = format === undefined ? this.options.format : format;
    +            if(format === null) {
    +               return dt.isValid() ? dt : null; 
    +            } else {
    +               return dt.isValid() ? dt.format(format) : ''; 
    +            }           
    +        },
    +        
    +        setValue: function(value) {
    +            if(!value) {
    +                return;
    +            }
    +            
    +            var dt = typeof value === 'string' ? moment(value, this.options.format) : moment(value),
    +                that = this,
    +                values = {};
    +            
    +            //function to find nearest value in select options
    +            function getNearest($select, value) {
    +                var delta = {};
    +                $select.children('option').each(function(i, opt){
    +                    var optValue = $(opt).attr('value'),
    +                    distance;
    +
    +                    if(optValue === '') return;
    +                    distance = Math.abs(optValue - value); 
    +                    if(typeof delta.distance === 'undefined' || distance < delta.distance) {
    +                        delta = {value: optValue, distance: distance};
    +                    } 
    +                }); 
    +                return delta.value;
    +            }             
    +            
    +            if(dt.isValid()) {
    +                //read values from date object
    +                $.each(this.map, function(k, v) {
    +                    if(k === 'ampm') {
    +                       return; 
    +                    }
    +                    values[k] = dt[v[1]]();
    +                });
    +               
    +                if(this.$ampm) {
    +                    //12:00 pm --> 12:00 (24-h format, midday), 12:00 am --> 00:00 (24-h format, midnight, start of day)
    +                    if(values.hour >= 12) {
    +                        values.ampm = 'pm';
    +                        if(values.hour > 12) {
    +                            values.hour -= 12;
    +                        }
    +                    } else {
    +                        values.ampm = 'am';
    +                        if(values.hour === 0) {
    +                            values.hour = 12;
    +                        }
    +                    } 
    +                }
    +               
    +                $.each(values, function(k, v) {
    +                    //call val() for each existing combo, e.g. this.$hour.val()
    +                    if(that['$'+k]) {
    +                       
    +                        if(k === 'minute' && that.options.minuteStep > 1 && that.options.roundTime) {
    +                           v = getNearest(that['$'+k], v);
    +                        }
    +                       
    +                        if(k === 'second' && that.options.secondStep > 1 && that.options.roundTime) {
    +                           v = getNearest(that['$'+k], v);
    +                        }                       
    +                       
    +                        that['$'+k].val(v);
    +                    }
    +                });
    +
    +                // update days count
    +                if (this.options.smartDays) {
    +                    this.fillCombo('day');
    +                }
    +               
    +               this.$element.val(dt.format(this.options.format)).change();
    +            }
    +        },
    +        
    +        /*
    +         highlight combos if date is invalid
    +        */
    +        highlight: function(dt) {
    +            if(!dt.isValid()) {
    +                if(this.options.errorClass) {
    +                    this.$widget.addClass(this.options.errorClass);
    +                } else {
    +                    //store original border color
    +                    if(!this.borderColor) {
    +                        this.borderColor = this.$widget.find('select').css('border-color'); 
    +                    }
    +                    this.$widget.find('select').css('border-color', 'red');
    +                } 
    +            } else {
    +                if(this.options.errorClass) {
    +                    this.$widget.removeClass(this.options.errorClass);
    +                } else {
    +                    this.$widget.find('select').css('border-color', this.borderColor);
    +                }  
    +            }
    +        },
    +        
    +        leadZero: function(v) {
    +            return v <= 9 ? '0' + v : v; 
    +        },
    +        
    +        destroy: function() {
    +            this.$widget.remove();
    +            this.$element.removeData('combodate').show();
    +        }
    +        
    +        //todo: clear method        
    +    };
    +
    +    $.fn.combodate = function ( option ) {
    +        var d, args = Array.apply(null, arguments);
    +        args.shift();
    +
    +        //getValue returns date as string / object (not jQuery object)
    +        if(option === 'getValue' && this.length && (d = this.eq(0).data('combodate'))) {
    +          return d.getValue.apply(d, args);
    +        }        
    +        
    +        return this.each(function () {
    +            var $this = $(this),
    +            data = $this.data('combodate'),
    +            options = typeof option == 'object' && option;
    +            if (!data) {
    +                $this.data('combodate', (data = new Combodate(this, options)));
    +            }
    +            if (typeof option == 'string' && typeof data[option] == 'function') {
    +                data[option].apply(data, args);
    +            }
    +        });
    +    };  
    +    
    +    $.fn.combodate.defaults = {
    +         //in this format value stored in original input
    +        format: 'DD-MM-YYYY HH:mm',      
    +        //in this format items in dropdowns are displayed
    +        template: 'D / MMM / YYYY   H : mm',
    +        //initial value, can be `new Date()`    
    +        value: null,                       
    +        minYear: 1970,
    +        maxYear: 2015,
    +        yearDescending: true,
    +        minuteStep: 5,
    +        secondStep: 1,
    +        firstItem: 'empty', //'name', 'empty', 'none'
    +        errorClass: null,
    +        roundTime: true, // whether to round minutes and seconds if step > 1
    +        smartDays: false // whether days in combo depend on selected month: 31, 30, 28
    +    };
    +
    +}(window.jQuery));
    +/**
    +Combodate input - dropdown date and time picker.    
    +Based on [combodate](http://vitalets.github.com/combodate) plugin (included). To use it you should manually include [momentjs](http://momentjs.com).
    +
    +    <script src="js/moment.min.js"></script>
    +   
    +Allows to input:
    +
    +* only date
    +* only time 
    +* both date and time  
    +
    +Please note, that format is taken from momentjs and **not compatible** with bootstrap-datepicker / jquery UI datepicker.  
    +Internally value stored as `momentjs` object. 
    +
    +@class combodate
    +@extends abstractinput
    +@final
    +@since 1.4.0
    +@example
    +<a href="#" id="dob" data-type="combodate" data-pk="1" data-url="/post" data-value="1984-05-15" data-title="Select date"></a>
    +<script>
    +$(function(){
    +    $('#dob').editable({
    +        format: 'YYYY-MM-DD',    
    +        viewformat: 'DD.MM.YYYY',    
    +        template: 'D / MMMM / YYYY',    
    +        combodate: {
    +                minYear: 2000,
    +                maxYear: 2015,
    +                minuteStep: 1
    +           }
    +        }
    +    });
    +});
    +</script>
    +**/
    +
    +/*global moment*/
    +
    +(function ($) {
    +    "use strict";
    +    
    +    var Constructor = function (options) {
    +        this.init('combodate', options, Constructor.defaults);
    +        
    +        //by default viewformat equals to format
    +        if(!this.options.viewformat) {
    +            this.options.viewformat = this.options.format;
    +        }        
    +        
    +        //try parse combodate config defined as json string in data-combodate
    +        options.combodate = $.fn.editableutils.tryParseJson(options.combodate, true);
    +
    +        //overriding combodate config (as by default jQuery extend() is not recursive)
    +        this.options.combodate = $.extend({}, Constructor.defaults.combodate, options.combodate, {
    +            format: this.options.format,
    +            template: this.options.template
    +        });
    +    };
    +
    +    $.fn.editableutils.inherit(Constructor, $.fn.editabletypes.abstractinput);    
    +    
    +    $.extend(Constructor.prototype, {
    +        render: function () {
    +            this.$input.combodate(this.options.combodate);
    +                    
    +            if($.fn.editableform.engine === 'bs3') {
    +                this.$input.siblings().find('select').addClass('form-control');
    +            }
    +            
    +            if(this.options.inputclass) {
    +                this.$input.siblings().find('select').addClass(this.options.inputclass);
    +            }            
    +            //"clear" link
    +            /*
    +            if(this.options.clear) {
    +                this.$clear = $('<a href="#"></a>').html(this.options.clear).click($.proxy(function(e){
    +                    e.preventDefault();
    +                    e.stopPropagation();
    +                    this.clear();
    +                }, this));
    +                
    +                this.$tpl.parent().append($('<div class="editable-clear">').append(this.$clear));  
    +            } 
    +            */               
    +        },
    +        
    +        value2html: function(value, element) {
    +            var text = value ? value.format(this.options.viewformat) : '';
    +            //$(element).text(text);
    +            Constructor.superclass.value2html.call(this, text, element);  
    +        },
    +
    +        html2value: function(html) {
    +            return html ? moment(html, this.options.viewformat) : null;
    +        },   
    +        
    +        value2str: function(value) {
    +            return value ? value.format(this.options.format) : '';
    +       }, 
    +       
    +       str2value: function(str) {
    +           return str ? moment(str, this.options.format) : null;
    +       }, 
    +       
    +       value2submit: function(value) {
    +           return this.value2str(value);
    +       },                    
    +
    +       value2input: function(value) {
    +           this.$input.combodate('setValue', value);
    +       },
    +        
    +       input2value: function() { 
    +           return this.$input.combodate('getValue', null);
    +       },       
    +       
    +       activate: function() {
    +           this.$input.siblings('.combodate').find('select').eq(0).focus();
    +       },
    +       
    +       /*
    +       clear:  function() {
    +          this.$input.data('datepicker').date = null;
    +          this.$input.find('.active').removeClass('active');
    +       },
    +       */
    +       
    +       autosubmit: function() {
    +           
    +       }
    +
    +    });
    +    
    +    Constructor.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
    +        /**
    +        @property tpl 
    +        @default <input type="text">
    +        **/         
    +        tpl:'<input type="text">',
    +        /**
    +        @property inputclass 
    +        @default null
    +        **/         
    +        inputclass: null,
    +        /**
    +        Format used for sending value to server. Also applied when converting date from <code>data-value</code> attribute.<br>
    +        See list of tokens in [momentjs docs](http://momentjs.com/docs/#/parsing/string-format)  
    +        
    +        @property format 
    +        @type string
    +        @default YYYY-MM-DD
    +        **/         
    +        format:'YYYY-MM-DD',
    +        /**
    +        Format used for displaying date. Also applied when converting date from element's text on init.   
    +        If not specified equals to `format`.
    +        
    +        @property viewformat 
    +        @type string
    +        @default null
    +        **/          
    +        viewformat: null,        
    +        /**
    +        Template used for displaying dropdowns.
    +        
    +        @property template 
    +        @type string
    +        @default D / MMM / YYYY
    +        **/          
    +        template: 'D / MMM / YYYY',  
    +        /**
    +        Configuration of combodate.
    +        Full list of options: http://vitalets.github.com/combodate/#docs
    +        
    +        @property combodate 
    +        @type object
    +        @default null
    +        **/
    +        combodate: null
    +        
    +        /*
    +        (not implemented yet)
    +        Text shown as clear date button. 
    +        If <code>false</code> clear button will not be rendered.
    +        
    +        @property clear 
    +        @type boolean|string
    +        @default 'x clear'         
    +        */
    +        //clear: '&times; clear'
    +    });   
    +
    +    $.fn.editabletypes.combodate = Constructor;
    +
    +}(window.jQuery));
    +
    +/*
    +Editableform based on Twitter Bootstrap 3
    +*/
    +(function ($) {
    +    "use strict";
    +    
    +    //store parent methods
    +    var pInitInput = $.fn.editableform.Constructor.prototype.initInput;
    +    
    +    $.extend($.fn.editableform.Constructor.prototype, {
    +        initTemplate: function() {
    +            this.$form = $($.fn.editableform.template); 
    +            this.$form.find('.control-group').addClass('form-group');
    +            this.$form.find('.editable-error-block').addClass('help-block');
    +        },
    +        initInput: function() {  
    +            pInitInput.apply(this);
    +
    +            //for bs3 set default class `input-sm` to standard inputs
    +            var emptyInputClass = this.input.options.inputclass === null || this.input.options.inputclass === false;
    +            var defaultClass = 'input-sm';
    +            
    +            //bs3 add `form-control` class to standard inputs
    +            var stdtypes = 'text,select,textarea,password,email,url,tel,number,range,time,typeaheadjs'.split(','); 
    +            if(~$.inArray(this.input.type, stdtypes)) {
    +                this.input.$input.addClass('form-control');
    +                if(emptyInputClass) {
    +                    this.input.options.inputclass = defaultClass;
    +                    this.input.$input.addClass(defaultClass);
    +                }
    +            }             
    +        
    +            //apply bs3 size class also to buttons (to fit size of control)
    +            var $btn = this.$form.find('.editable-buttons');
    +            var classes = emptyInputClass ? [defaultClass] : this.input.options.inputclass.split(' ');
    +            for(var i=0; i<classes.length; i++) {
    +                // `btn-sm` is default now
    +                /*
    +                if(classes[i].toLowerCase() === 'input-sm') { 
    +                    $btn.find('button').addClass('btn-sm');  
    +                }
    +                */
    +                if(classes[i].toLowerCase() === 'input-lg') {
    +                    $btn.find('button').removeClass('btn-sm').addClass('btn-lg'); 
    +                }
    +            }
    +        }
    +    });    
    +    
    +    //buttons
    +    $.fn.editableform.buttons = 
    +      '<button type="submit" class="btn btn-primary btn-sm editable-submit">'+
    +        '<i class="glyphicon glyphicon-ok"></i>'+
    +      '</button>'+
    +      '<button type="button" class="btn btn-default btn-sm editable-cancel">'+
    +        '<i class="glyphicon glyphicon-remove"></i>'+
    +      '</button>';         
    +    
    +    //error classes
    +    $.fn.editableform.errorGroupClass = 'has-error';
    +    $.fn.editableform.errorBlockClass = null;  
    +    //engine
    +    $.fn.editableform.engine = 'bs3';  
    +}(window.jQuery));
    +/**
    +* Editable Popover3 (for Bootstrap 3) 
    +* ---------------------
    +* requires bootstrap-popover.js
    +*/
    +(function ($) {
    +    "use strict";
    +
    +    //extend methods
    +    $.extend($.fn.editableContainer.Popup.prototype, {
    +        containerName: 'popover',
    +        containerDataName: 'bs.popover',
    +        innerCss: '.popover-content',
    +        defaults: $.fn.popover.Constructor.DEFAULTS,
    +
    +        initContainer: function(){
    +            $.extend(this.containerOptions, {
    +                trigger: 'manual',
    +                selector: false,
    +                content: ' ',
    +                template: this.defaults.template
    +            });
    +            
    +            //as template property is used in inputs, hide it from popover
    +            var t;
    +            if(this.$element.data('template')) {
    +               t = this.$element.data('template');
    +               this.$element.removeData('template');  
    +            } 
    +            
    +            this.call(this.containerOptions);
    +            
    +            if(t) {
    +               //restore data('template')
    +               this.$element.data('template', t); 
    +            }
    +        }, 
    +        
    +        /* show */
    +        innerShow: function () {
    +            this.call('show');                
    +        },  
    +        
    +        /* hide */
    +        innerHide: function () {
    +            this.call('hide');       
    +        }, 
    +        
    +        /* destroy */
    +        innerDestroy: function() {
    +            this.call('destroy');
    +        },                               
    +        
    +        setContainerOption: function(key, value) {
    +            this.container().options[key] = value; 
    +        },               
    +
    +        /**
    +        * move popover to new position. This function mainly copied from bootstrap-popover.
    +        */
    +        /*jshint laxcomma: true, eqeqeq: false*/
    +        setPosition: function () { 
    +
    +            (function() {
    +            /*    
    +                var $tip = this.tip()
    +                , inside
    +                , pos
    +                , actualWidth
    +                , actualHeight
    +                , placement
    +                , tp
    +                , tpt
    +                , tpb
    +                , tpl
    +                , tpr;
    +
    +                placement = typeof this.options.placement === 'function' ?
    +                this.options.placement.call(this, $tip[0], this.$element[0]) :
    +                this.options.placement;
    +
    +                inside = /in/.test(placement);
    +               
    +                $tip
    +              //  .detach()
    +              //vitalets: remove any placement class because otherwise they dont influence on re-positioning of visible popover
    +                .removeClass('top right bottom left')
    +                .css({ top: 0, left: 0, display: 'block' });
    +              //  .insertAfter(this.$element);
    +               
    +                pos = this.getPosition(inside);
    +
    +                actualWidth = $tip[0].offsetWidth;
    +                actualHeight = $tip[0].offsetHeight;
    +
    +                placement = inside ? placement.split(' ')[1] : placement;
    +
    +                tpb = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2};
    +                tpt = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2};
    +                tpl = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth};
    +                tpr = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width};
    +
    +                switch (placement) {
    +                    case 'bottom':
    +                        if ((tpb.top + actualHeight) > ($(window).scrollTop() + $(window).height())) {
    +                            if (tpt.top > $(window).scrollTop()) {
    +                                placement = 'top';
    +                            } else if ((tpr.left + actualWidth) < ($(window).scrollLeft() + $(window).width())) {
    +                                placement = 'right';
    +                            } else if (tpl.left > $(window).scrollLeft()) {
    +                                placement = 'left';
    +                            } else {
    +                                placement = 'right';
    +                            }
    +                        }
    +                        break;
    +                    case 'top':
    +                        if (tpt.top < $(window).scrollTop()) {
    +                            if ((tpb.top + actualHeight) < ($(window).scrollTop() + $(window).height())) {
    +                                placement = 'bottom';
    +                            } else if ((tpr.left + actualWidth) < ($(window).scrollLeft() + $(window).width())) {
    +                                placement = 'right';
    +                            } else if (tpl.left > $(window).scrollLeft()) {
    +                                placement = 'left';
    +                            } else {
    +                                placement = 'right';
    +                            }
    +                        }
    +                        break;
    +                    case 'left':
    +                        if (tpl.left < $(window).scrollLeft()) {
    +                            if ((tpr.left + actualWidth) < ($(window).scrollLeft() + $(window).width())) {
    +                                placement = 'right';
    +                            } else if (tpt.top > $(window).scrollTop()) {
    +                                placement = 'top';
    +                            } else if (tpt.top > $(window).scrollTop()) {
    +                                placement = 'bottom';
    +                            } else {
    +                                placement = 'right';
    +                            }
    +                        }
    +                        break;
    +                    case 'right':
    +                        if ((tpr.left + actualWidth) > ($(window).scrollLeft() + $(window).width())) {
    +                            if (tpl.left > $(window).scrollLeft()) {
    +                                placement = 'left';
    +                            } else if (tpt.top > $(window).scrollTop()) {
    +                                placement = 'top';
    +                            } else if (tpt.top > $(window).scrollTop()) {
    +                                placement = 'bottom';
    +                            }
    +                        }
    +                        break;
    +                }
    +
    +                switch (placement) {
    +                    case 'bottom':
    +                        tp = tpb;
    +                        break;
    +                    case 'top':
    +                        tp = tpt;
    +                        break;
    +                    case 'left':
    +                        tp = tpl;
    +                        break;
    +                    case 'right':
    +                        tp = tpr;
    +                        break;
    +                }
    +
    +                $tip
    +                .offset(tp)
    +                .addClass(placement)
    +                .addClass('in');
    +           */
    +                     
    +           
    +            var $tip = this.tip();
    +            
    +            var placement = typeof this.options.placement == 'function' ?
    +                this.options.placement.call(this, $tip[0], this.$element[0]) :
    +                this.options.placement;            
    +
    +            var autoToken = /\s?auto?\s?/i;
    +            var autoPlace = autoToken.test(placement);
    +            if (autoPlace) {
    +                placement = placement.replace(autoToken, '') || 'top';
    +            }
    +            
    +            
    +            var pos = this.getPosition();
    +            var actualWidth = $tip[0].offsetWidth;
    +            var actualHeight = $tip[0].offsetHeight;
    +
    +            if (autoPlace) {
    +                var $parent = this.$element.parent();
    +
    +                var orgPlacement = placement;
    +                var docScroll    = document.documentElement.scrollTop || document.body.scrollTop;
    +                var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth();
    +                var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight();
    +                var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left;
    +
    +                placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :
    +                            placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :
    +                            placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :
    +                            placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :
    +                            placement;
    +
    +                $tip
    +                  .removeClass(orgPlacement)
    +                  .addClass(placement);
    +            }
    +
    +
    +            var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight);
    +
    +            this.applyPlacement(calculatedOffset, placement);            
    +                     
    +                
    +            }).call(this.container());
    +          /*jshint laxcomma: false, eqeqeq: true*/  
    +        }            
    +    });
    +
    +}(window.jQuery));
    +
    +
    +/**
    +Bootstrap-datetimepicker.  
    +Based on [smalot bootstrap-datetimepicker plugin](https://github.com/smalot/bootstrap-datetimepicker). 
    +Before usage you should manually include dependent js and css:
    +
    +    <link href="css/datetimepicker.css" rel="stylesheet" type="text/css"></link> 
    +    <script src="js/bootstrap-datetimepicker.js"></script>
    +
    +For **i18n** you should include js file from here: https://github.com/smalot/bootstrap-datetimepicker/tree/master/js/locales
    +and set `language` option.  
    +
    +@class datetime
    +@extends abstractinput
    +@final
    +@since 1.4.4
    +@example
    +<a href="#" id="last_seen" data-type="datetime" data-pk="1" data-url="/post" title="Select date & time">15/03/2013 12:45</a>
    +<script>
    +$(function(){
    +    $('#last_seen').editable({
    +        format: 'yyyy-mm-dd hh:ii',    
    +        viewformat: 'dd/mm/yyyy hh:ii',    
    +        datetimepicker: {
    +                weekStart: 1
    +           }
    +        }
    +    });
    +});
    +</script>
    +**/
    +(function ($) {
    +    "use strict";
    +
    +    var DateTime = function (options) {
    +        this.init('datetime', options, DateTime.defaults);
    +        this.initPicker(options, DateTime.defaults);
    +    };
    +
    +    $.fn.editableutils.inherit(DateTime, $.fn.editabletypes.abstractinput);
    +
    +    $.extend(DateTime.prototype, {
    +        initPicker: function(options, defaults) {
    +            //'format' is set directly from settings or data-* attributes
    +
    +            //by default viewformat equals to format
    +            if(!this.options.viewformat) {
    +                this.options.viewformat = this.options.format;
    +            }
    +            
    +            //try parse datetimepicker config defined as json string in data-datetimepicker
    +            options.datetimepicker = $.fn.editableutils.tryParseJson(options.datetimepicker, true);
    +
    +            //overriding datetimepicker config (as by default jQuery extend() is not recursive)
    +            //since 1.4 datetimepicker internally uses viewformat instead of format. Format is for submit only
    +            this.options.datetimepicker = $.extend({}, defaults.datetimepicker, options.datetimepicker, {
    +                format: this.options.viewformat
    +            });
    +
    +            //language
    +            this.options.datetimepicker.language = this.options.datetimepicker.language || 'en'; 
    +
    +            //store DPglobal
    +            this.dpg = $.fn.datetimepicker.DPGlobal; 
    +
    +            //store parsed formats
    +            this.parsedFormat = this.dpg.parseFormat(this.options.format, this.options.formatType);
    +            this.parsedViewFormat = this.dpg.parseFormat(this.options.viewformat, this.options.formatType);
    +        },
    +
    +        render: function () {
    +            this.$input.datetimepicker(this.options.datetimepicker);
    +
    +            //adjust container position when viewMode changes
    +            //see https://github.com/smalot/bootstrap-datetimepicker/pull/80
    +            this.$input.on('changeMode', function(e) {
    +                var f = $(this).closest('form').parent();
    +                //timeout here, otherwise container changes position before form has new size
    +                setTimeout(function(){
    +                    f.triggerHandler('resize');
    +                }, 0);
    +            });
    +
    +            //"clear" link
    +            if(this.options.clear) {
    +                this.$clear = $('<a href="#"></a>').html(this.options.clear).click($.proxy(function(e){
    +                    e.preventDefault();
    +                    e.stopPropagation();
    +                    this.clear();
    +                }, this));
    +
    +                this.$tpl.parent().append($('<div class="editable-clear">').append(this.$clear));  
    +            }
    +        },
    +
    +        value2html: function(value, element) {
    +            //formatDate works with UTCDate!
    +            var text = value ? this.dpg.formatDate(this.toUTC(value), this.parsedViewFormat, this.options.datetimepicker.language, this.options.formatType) : '';
    +            if(element) {
    +                DateTime.superclass.value2html.call(this, text, element);
    +            } else {
    +                return text;
    +            }
    +        },
    +
    +        html2value: function(html) {
    +            //parseDate return utc date!
    +            var value = this.parseDate(html, this.parsedViewFormat); 
    +            return value ? this.fromUTC(value) : null;
    +        },
    +
    +        value2str: function(value) {
    +            //formatDate works with UTCDate!
    +            return value ? this.dpg.formatDate(this.toUTC(value), this.parsedFormat, this.options.datetimepicker.language, this.options.formatType) : '';
    +       },
    +
    +       str2value: function(str) {
    +           //parseDate return utc date!
    +           var value = this.parseDate(str, this.parsedFormat);
    +           return value ? this.fromUTC(value) : null;
    +       },
    +
    +       value2submit: function(value) {
    +           return this.value2str(value);
    +       },
    +
    +       value2input: function(value) {
    +           if(value) {
    +             this.$input.data('datetimepicker').setDate(value);
    +           }
    +       },
    +
    +       input2value: function() { 
    +           //date may be cleared, in that case getDate() triggers error
    +           var dt = this.$input.data('datetimepicker');
    +           return dt.date ? dt.getDate() : null;
    +       },
    +
    +       activate: function() {
    +       },
    +
    +       clear: function() {
    +          this.$input.data('datetimepicker').date = null;
    +          this.$input.find('.active').removeClass('active');
    +          if(!this.options.showbuttons) {
    +             this.$input.closest('form').submit(); 
    +          }          
    +       },
    +
    +       autosubmit: function() {
    +           this.$input.on('mouseup', '.minute', function(e){
    +               var $form = $(this).closest('form');
    +               setTimeout(function() {
    +                   $form.submit();
    +               }, 200);
    +           });
    +       },
    +
    +       //convert date from local to utc
    +       toUTC: function(value) {
    +         return value ? new Date(value.valueOf() - value.getTimezoneOffset() * 60000) : value;  
    +       },
    +
    +       //convert date from utc to local
    +       fromUTC: function(value) {
    +         return value ? new Date(value.valueOf() + value.getTimezoneOffset() * 60000) : value;  
    +       },
    +
    +       /*
    +        For incorrect date bootstrap-datetimepicker returns current date that is not suitable
    +        for datetimefield.
    +        This function returns null for incorrect date.  
    +       */
    +       parseDate: function(str, format) {
    +           var date = null, formattedBack;
    +           if(str) {
    +               date = this.dpg.parseDate(str, format, this.options.datetimepicker.language, this.options.formatType);
    +               if(typeof str === 'string') {
    +                   formattedBack = this.dpg.formatDate(date, format, this.options.datetimepicker.language, this.options.formatType);
    +                   if(str !== formattedBack) {
    +                       date = null;
    +                   } 
    +               }
    +           }
    +           return date;
    +       }
    +
    +    });
    +
    +    DateTime.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {
    +        /**
    +        @property tpl 
    +        @default <div></div>
    +        **/         
    +        tpl:'<div class="editable-date well"></div>',
    +        /**
    +        @property inputclass 
    +        @default null
    +        **/
    +        inputclass: null,
    +        /**
    +        Format used for sending value to server. Also applied when converting date from <code>data-value</code> attribute.<br>
    +        Possible tokens are: <code>d, dd, m, mm, yy, yyyy, h, i</code>  
    +        
    +        @property format 
    +        @type string
    +        @default yyyy-mm-dd hh:ii
    +        **/         
    +        format:'yyyy-mm-dd hh:ii',
    +        formatType:'standard',
    +        /**
    +        Format used for displaying date. Also applied when converting date from element's text on init.   
    +        If not specified equals to <code>format</code>
    +        
    +        @property viewformat 
    +        @type string
    +        @default null
    +        **/
    +        viewformat: null,
    +        /**
    +        Configuration of datetimepicker.
    +        Full list of options: https://github.com/smalot/bootstrap-datetimepicker
    +
    +        @property datetimepicker 
    +        @type object
    +        @default { }
    +        **/
    +        datetimepicker:{
    +            todayHighlight: false,
    +            autoclose: false
    +        },
    +        /**
    +        Text shown as clear date button. 
    +        If <code>false</code> clear button will not be rendered.
    +
    +        @property clear 
    +        @type boolean|string
    +        @default 'x clear'
    +        **/
    +        clear: '&times; clear'
    +    });
    +
    +    $.fn.editabletypes.datetime = DateTime;
    +
    +}(window.jQuery));
    +/**
    +Bootstrap datetimefield input - datetime input for inline mode.
    +Shows normal <input type="text"> and binds popup datetimepicker.  
    +Automatically shown in inline mode.
    +
    +@class datetimefield
    +@extends datetime
    +
    +**/
    +(function ($) {
    +    "use strict";
    +    
    +    var DateTimeField = function (options) {
    +        this.init('datetimefield', options, DateTimeField.defaults);
    +        this.initPicker(options, DateTimeField.defaults);
    +    };
    +
    +    $.fn.editableutils.inherit(DateTimeField, $.fn.editabletypes.datetime);
    +    
    +    $.extend(DateTimeField.prototype, {
    +        render: function () {
    +            this.$input = this.$tpl.find('input');
    +            this.setClass();
    +            this.setAttr('placeholder');
    +            
    +            this.$tpl.datetimepicker(this.options.datetimepicker);
    +            
    +            //need to disable original event handlers
    +            this.$input.off('focus keydown');
    +            
    +            //update value of datepicker
    +            this.$input.keyup($.proxy(function(){
    +               this.$tpl.removeData('date');
    +               this.$tpl.datetimepicker('update');
    +            }, this));
    +            
    +        },   
    +      
    +       value2input: function(value) {
    +           this.$input.val(this.value2html(value));
    +           this.$tpl.datetimepicker('update');
    +       },
    +        
    +       input2value: function() { 
    +           return this.html2value(this.$input.val());
    +       },              
    +        
    +       activate: function() {
    +           $.fn.editabletypes.text.prototype.activate.call(this);
    +       },
    +       
    +       autosubmit: function() {
    +         //reset autosubmit to empty  
    +       }
    +    });
    +    
    +    DateTimeField.defaults = $.extend({}, $.fn.editabletypes.datetime.defaults, {
    +        /**
    +        @property tpl 
    +        **/         
    +        tpl:'<div class="input-group date"><input type="text"/><span class="input-group-addon"><i class="fa fa-th"></i></span></div>',
    +        /**
    +        @property inputclass 
    +        @default 'input-medium'
    +        **/         
    +        inputclass: 'input-medium',
    +        
    +        /* datetimepicker config */
    +        datetimepicker:{
    +            todayHighlight: false,
    +            autoclose: true
    +        }
    +    });
    +    
    +    $.fn.editabletypes.datetimefield = DateTimeField;
    +
    +}(window.jQuery));
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/artDiglog/jquery.artDialog.js b/src/main/webapp/plug-in/artDiglog/jquery.artDialog.js
    new file mode 100644
    index 00000000..384934d6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/jquery.artDialog.js
    @@ -0,0 +1,9 @@
    +/*!
    + * artDialog 4.1.6
    + * Date: 2012-07-16 22:57
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2012 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */(function(h,e,l){h.noop=h.noop||function(){};var o,p,s,v,z=0,q=h(e),j=h(document),m=h("html");s=document.documentElement;var r=e.VBArray&&!e.XMLHttpRequest,t="createTouch"in document&&!("onmousemove"in s)||/(iPhone|iPad|iPod)/i.test(navigator.userAgent),w="artDialog"+ +new Date,g=function(a,b,c){a=a||{};if("string"===typeof a||1===a.nodeType)a={content:a,fixed:!t};var d;d=g.defaults;var f=a.follow=1===this.nodeType&&this||a.follow,i;for(i in d)a[i]===l&&(a[i]=d[i]);h.each({ok:"yesFn",cancel:"noFn",close:"closeFn",init:"initFn",okVal:"yesText",cancelVal:"noText"},function(b,d){a[b]=a[b]!==l?a[b]:a[d]});"string"===typeof f&&(f=h(f)[0]);a.id=f&&f[w+"follow"]||a.id||w+z;d=g.list[a.id];if(f&&d)return d.follow(f).zIndex().focus();if(d)return d.zIndex().focus();if(t)a.fixed=!1;if(!h.isArray(a.button))a.button=a.button?[a.button]:[];if(b!==l)a.ok=b;if(c!==l)a.cancel=c;a.ok&&a.button.push({name:a.okVal,callback:a.ok,focus:!0});a.cancel&&a.button.push({name:a.cancelVal,callback:a.cancel});g.defaults.zIndex=a.zIndex;z++;return g.list[a.id]=o?o._init(a):new g.fn._init(a)};g.fn=g.prototype={version:"4.1.6",closed:!0,_init:function(a){var b,c=a.icon,d=c&&(r?{png:"icons/"+c+".png"}:{backgroundImage:"url('"+a.path+"/skins/icons/"+c+".png')"});this.closed=!1;this.config=a;this.DOM=b=this.DOM||this._getDOM();b.wrap.addClass(a.skin);b.close[!1===a.cancel?"hide":"show"]();b.icon[0].style.display=c?"":"none";b.iconBg.css(d||{background:"none"});b.se.css("cursor",a.resize?"se-resize":"auto");b.title.css("cursor",a.drag?"move":"auto");b.content.css("padding",a.padding);this[a.show?"show":"hide"](!0);this.button(a.button).title(a.title).content(a.content,!0).size(a.width,a.height).time(a.time);a.follow?this.follow(a.follow):this.position(a.left,a.top);this.zIndex().focus();a.lock&&this.lock();this._addEvent();this._ie6PngFix();o=null;a.init&&a.init.call(this,e);return this},content:function(a,b){var c,d,f,i,k=this,u=k.DOM,n=u.wrap[0],g=n.offsetWidth,j=n.offsetHeight,h=parseInt(n.style.left),e=parseInt(n.style.top),r=n.style.width,u=u.content,m=u[0];k._elemBack&&k._elemBack();n.style.width="auto";if(a===l)return m;if("string"===typeof a)u.html(a);else if(a&&1===a.nodeType)i=a.style.display,c=a.previousSibling,d=a.nextSibling,f=a.parentNode,k._elemBack=function(){c&&c.parentNode?c.parentNode.insertBefore(a,c.nextSibling):d&&d.parentNode?d.parentNode.insertBefore(a,d):f&&f.appendChild(a);a.style.display=i;k._elemBack=null},u.html(""),m.appendChild(a),a.style.display="block";if(!b){k.config.follow?k.follow(k.config.follow):(g=n.offsetWidth-g,j=n.offsetHeight-j,e-=j/2,n.style.left=Math.max(h-g/2,0)+"px",n.style.top=Math.max(e,0)+"px");if(r&&"auto"!==r)n.style.width=n.offsetWidth+"px";k._autoPositionType()}k._ie6SelectFix();k._runScript(m);return k},title:function(a){var b=this.DOM,c=b.wrap,b=b.title;if(a===l)return b[0];!1===a?(b.hide().html(""),c.addClass("aui_state_noTitle")):(b.show().html(a||""),c.removeClass("aui_state_noTitle"));return this},position:function(a,b){var c=this.config,d=this.DOM.wrap[0],f=r?!1:c.fixed,c=r&&this.config.fixed,i=j.scrollLeft(),k=j.scrollTop(),u=f?0:i,f=f?0:k,n=q.width(),g=q.height(),h=d.offsetWidth,e=d.offsetHeight,d=d.style;if(a||0===a)if(this._left=-1!==a.toString().indexOf("%")?a:null,a=this._toNumber(a,n-h),"number"===typeof a)a=c?a+=i:a+u,d.left=Math.max(a,u)+"px";else if("string"===typeof a)d.left=a;if(b||0===b)if(this._top=-1!==b.toString().indexOf("%")?b:null,b=this._toNumber(b,g-e),"number"===typeof b)b=c?b+=k:b+f,d.top=Math.max(b,f)+"px";else if("string"===typeof b)d.top=b;if(a!==l&&b!==l)this._follow=null,this._autoPositionType();return this},size:function(a,b){var c,d,f=this.DOM;d=f.wrap;var i=f.main,k=d[0].style,f=i[0].style;if(a)if(this._width=-1!==a.toString().indexOf("%")?a:null,c=q.width()-d[0].offsetWidth+i[0].offsetWidth,a=c=this._toNumber(a,c),"number"===typeof a)k.width="auto",f.width=Math.max(this.config.minWidth,a)+"px",k.width=d[0].offsetWidth+"px";else if("string"===typeof a)f.width=a,"auto"===a&&d.css("width","auto");if(b)if(this._height=-1!==b.toString().indexOf("%")?b:null,d=q.height()-d[0].offsetHeight+i[0].offsetHeight,b=d=this._toNumber(b,d),"number"===typeof b)f.height=Math.max(this.config.minHeight,b)+"px";else if("string"===typeof b)f.height=b;this._ie6SelectFix();return this},follow:function(a){var b,c=this.config;if("string"===typeof a||a&&1===a.nodeType)b=h(a),a=b[0];if(!a||!a.offsetWidth&&!a.offsetHeight)return this.position(this._left,this._top);var d=w+"follow",f=q.width(),i=q.height(),k=j.scrollLeft(),g=j.scrollTop(),n=b.offset();b=a.offsetWidth;var e=r?!1:c.fixed,m=e?n.left-k:n.left,n=e?n.top-g:n.top,l=this.DOM.wrap[0],p=l.style,o=l.offsetWidth,l=l.offsetHeight,t=m-(o-b)/2,s=n+a.offsetHeight,k=e?0:k,g=e?0:g;p.left=(t<k?m:t+o>f&&m-o>k?m-o+b:t)+"px";p.top=(s+l>i+g&&n-l>g?n-l:s)+"px";this._follow&&this._follow.removeAttribute(d);this._follow=a;a[d]=c.id;this._autoPositionType();return this},button:function(){var a=this,b=arguments,c=a.DOM.buttons,d=c[0],f=a._listeners=a._listeners||{},i=h.isArray(b[0])?b[0]:[].slice.call(b);if(b[0]===l)return d;h.each(i,function(b,c){var i=c.name,g=!f[i],j=!g?f[i].elem:document.createElement("button");f[i]||(f[i]={});if(c.callback)f[i].callback=c.callback;if(c.className)j.className=c.className;if(c.focus)a._focus&&a._focus.removeClass("aui_state_highlight"),a._focus=h(j).addClass("aui_state_highlight"),a.focus();j.setAttribute("type","button");j[w+"callback"]=i;j.disabled=!!c.disabled;if(g)j.innerHTML=i,f[i].elem=j,d.appendChild(j)});c[0].style.display=i.length?"":"none";a._ie6SelectFix();return a},show:function(a){this.DOM.wrap.show();!a&&this._lockMaskWrap&&this._lockMaskWrap.show();return this},hide:function(a){this.DOM.wrap.hide();!a&&this._lockMaskWrap&&this._lockMaskWrap.hide();return this},close:function(){if(this.closed)return this;var a=this.DOM,b=a.wrap,c=g.list,d=this.config.close,f=this.config.follow;this.time();if("function"===typeof d&&!1===d.call(this,e))return this;this.unlock();this._elemBack&&this._elemBack();b[0].className=b[0].style.cssText="";a.title.html("");a.content.html("");a.buttons.html("");if(g.focus===this)g.focus=null;f&&f.removeAttribute(w+"follow");delete c[this.config.id];this._removeEvent();this.hide(!0)._setAbsolute();for(var i in this)this.hasOwnProperty(i)&&"DOM"!==i&&delete this[i];o?b.remove():o=this;return this},time:function(a){var b=this,c=b.config.cancelVal,d=b._timer;d&&clearTimeout(d);if(a)b._timer=setTimeout(function(){b._click(c)},1E3*a);return b},focus:function(){try{var a=this._focus&&this._focus[0]||this.DOM.close[0];a&&a.focus()}catch(b){}return this},zIndex:function(){var a=this.DOM.wrap,b=g.focus,c=g.defaults.zIndex++;a.css("zIndex",c);this._lockMask&&this._lockMask.css("zIndex",c-1);b&&b.DOM.wrap.removeClass("aui_state_focus");g.focus=this;a.addClass("aui_state_focus");return this},lock:function(){if(this._lock)return this;var a=this,b=g.defaults.zIndex-1,c=a.DOM.wrap,d=a.config,f=j.width(),i=j.height(),k=a._lockMaskWrap||h(document.body.appendChild(document.createElement("div"))),e=a._lockMask||h(k[0].appendChild(document.createElement("div"))),f=t?"width:"+f+"px;height:"+i+"px":"width:100%;height:100%",i=r?"position:absolute;left:expression((document).documentElement.scrollLeft);top:expression((document).documentElement.scrollTop);width:expression((document).documentElement.clientWidth);height:expression((document).documentElement.clientHeight)":"";a.zIndex();c.addClass("aui_state_lock");k[0].style.cssText=f+";position:fixed;z-index:"+b+";top:0;left:0;overflow:hidden;"+i;e[0].style.cssText="height:100%;background:"+d.background+";filter:alpha(opacity=0);opacity:0";r&&e.html('<iframe src="about:blank" style="width:100%;height:100%;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0)"></iframe>');e.stop();e.bind("click",function(){a._reset()}).bind("dblclick",function(){a._click(a.config.cancelVal)});0===d.duration?e.css({opacity:d.opacity}):e.animate({opacity:d.opacity},d.duration);a._lockMaskWrap=k;a._lockMask=e;a._lock=!0;return a},unlock:function(){var a=this._lockMaskWrap,b=this._lockMask;if(!this._lock)return this;var c=a[0].style,d=function(){r&&(c.removeExpression("width"),c.removeExpression("height"),c.removeExpression("left"),c.removeExpression("top"));c.cssText="display:none";o&&a.remove()};b.stop().unbind();this.DOM.wrap.removeClass("aui_state_lock");this.config.duration?b.animate({opacity:0},this.config.duration,d):d();this._lock=!1;return this},_getDOM:function(){var a=document.createElement("div"),b=document.body;a.style.cssText="position:absolute;left:0;top:0";a.innerHTML=g._templates;b.insertBefore(a,b.firstChild);for(var b=0,c={wrap:h(a)},d=a.getElementsByTagName("*"),f=d.length;b<f;b++)(a=d[b].className.split("aui_")[1])&&(c[a]=h(d[b]));return c},_toNumber:function(a,b){if(!a&&0!==a||"number"===typeof a)return a;var c=a.length-1;a.lastIndexOf("px")===c?a=parseInt(a):a.lastIndexOf("%")===c&&(a=parseInt(b*a.split("%")[0]/100));return a},_ie6PngFix:r?function(){for(var a=0,b,c,d=g.defaults.path+"/skins/",f=this.DOM.wrap[0].getElementsByTagName("*");a<f.length;a++)if(b=f[a],c=b.currentStyle.png)c=d+c,b=b.runtimeStyle,b.backgroundImage="none",b.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+c+"',sizingMethod='crop')"}:h.noop,_ie6SelectFix:r?function(){var a=this.DOM.wrap,b=a[0],c=w+"iframeMask",d=a[c],f=b.offsetWidth,i=b.offsetHeight,f=f+"px",i=i+"px";d?(d.style.width=f,d.style.height=i):(d=b.appendChild(document.createElement("iframe")),a[c]=d,d.src="about:blank",d.style.cssText="position:absolute;z-index:-1;left:0;top:0;filter:alpha(opacity=0);width:"+f+";height:"+i)}:h.noop,_runScript:function(a){for(var b,c=b=0,a=a.getElementsByTagName("script"),d=a.length,f=[];b<d;b++)if("text/dialog"===a[b].type)f[c]=a[b].innerHTML,c++;f.length&&(f=f.join(""),b=new Function(f),b.call(this))},_autoPositionType:function(){this[this.config.fixed?"_setFixed":"_setAbsolute"]()},_setFixed:function(){r&&h(function(){"fixed"!==m.css("backgroundAttachment")&&"fixed"!==h("body").css("backgroundAttachment")&&m.css({zoom:1,backgroundImage:"url(about:blank)",backgroundAttachment:"fixed"})});return function(){var a=this.DOM.wrap,b=a[0].style;if(r){var c=parseInt(a.css("left")),a=parseInt(a.css("top")),d=j.scrollLeft(),f=j.scrollTop();this._setAbsolute();b.setExpression("left","eval((document.documentElement).scrollLeft + "+(c-d)+') + "px"');b.setExpression("top","eval((document.documentElement).scrollTop + "+(a-f)+') + "px"')}else b.position="fixed"}}(),_setAbsolute:function(){var a=this.DOM.wrap[0].style;r&&(a.removeExpression("left"),a.removeExpression("top"));a.position="absolute"},_click:function(a){a=this._listeners[a]&&this._listeners[a].callback;return"function"!==typeof a||!1!==a.call(this,e)?this.close():this},_reset:function(a){var b=this._winSize||q.width()*q.height(),c=this._follow,d=this._width,f=this._height,i=this._left,g=this._top;if(a&&(a=this._winSize=q.width()*q.height(),b===a))return;(d||f)&&this.size(d,f);c?this.follow(c):(i||g)&&this.position(i,g)},_addEvent:function(){var a,b=this,c=b.config,d="CollectGarbage"in e,f=b.DOM;b._winResize=function(){a&&clearTimeout(a);a=setTimeout(function(){b._reset(d)},40)};q.bind("resize",b._winResize);f.wrap.bind("click",function(a){a=a.target;if(a.disabled)return!1;if(a===f.close[0])return b._click(c.cancelVal),!1;(a=a[w+"callback"])&&b._click(a);b._ie6SelectFix()}).bind("mousedown",function(){b.zIndex()})},_removeEvent:function(){this.DOM.wrap.unbind();q.unbind("resize",this._winResize)}};g.fn._init.prototype=g.fn;h.fn.dialog=h.fn.artDialog=function(){var a=arguments;this[this.live?"live":"bind"]("click",function(){g.apply(this,a);return!1});return this};g.focus=null;g.get=function(a){return a===l?g.list:g.list[a]};g.list={};j.bind("keydown",function(a){var b=a.target.nodeName,c=/^INPUT|TEXTAREA$/,d=g.focus,a=a.keyCode;d&&d.config.esc&&!c.test(b)&&27===a&&d._click(d.config.cancelVal)});v=e._artDialog_path||function(a,b,c){for(b in a)a[b].src&&-1!==a[b].src.indexOf("artDialog")&&(c=a[b]);p=c||a[a.length-1];c=p.src.replace(/\\/g,"/");return 0>c.lastIndexOf("/")?".":c.substring(0,c.lastIndexOf("/"))}(document.getElementsByTagName("script"));if(s=p.src.split("skin=")[1]){var x=document.createElement("link");x.rel="stylesheet";x.href=v+"/skins/"+s+".css?"+g.fn.version;p.parentNode.insertBefore(x,p)}q.bind("load",function(){setTimeout(function(){z||g({left:"-9999em",time:9,fixed:!1,lock:!1,focus:!1})},150)});try{document.execCommand("BackgroundImageCache",!1,!0)}catch(y){}g._templates='<div class="aui_outer"><table class="aui_border"><tbody><tr><td class="aui_nw"></td><td class="aui_n"></td><td class="aui_ne"></td></tr><tr><td class="aui_w"></td><td class="aui_c"><div class="aui_inner"><table class="aui_dialog"><tbody><tr><td colspan="2" class="aui_header"><div class="aui_titleBar"><div class="aui_title"></div><a class="aui_close" href="javascript:/*artDialog*/;">\u00d7</a></div></td></tr><tr><td class="aui_icon"><div class="aui_iconBg"></div></td><td class="aui_main"><div class="aui_content"></div></td></tr><tr><td colspan="2" class="aui_footer"><div class="aui_buttons"></div></td></tr></tbody></table></div></td><td class="aui_e"></td></tr><tr><td class="aui_sw"></td><td class="aui_s"></td><td class="aui_se"></td></tr></tbody></table></div>';g.defaults={content:'<div class="aui_loading"><span>鍔犺浇涓...</span></div>',title:"\u6d88\u606f",button:null,ok:null,cancel:null,init:null,close:null,okVal:"\u786e\u5b9a",cancelVal:"\u53d6\u6d88",width:"auto",height:"auto",minWidth:96,minHeight:32,padding:"20px 25px",skin:"",icon:null,time:null,esc:!0,focus:!0,show:!0,follow:null,path:v,lock:!1,background:"#000",opacity:0.7,duration:300,fixed:!1,left:"50%",top:"38.2%",zIndex:1987,resize:!0,drag:!0};e.artDialog=h.dialog=h.artDialog=g})(this.art||this.jQuery&&(this.art=jQuery),this);(function(h){var e,l,o=h(window),p=h(document),s=document.documentElement,v=!("minWidth"in s.style),z="onlosecapture"in s,q="setCapture"in s;artDialog.dragEvent=function(){var j=this,e=function(e){var h=j[e];j[e]=function(){return h.apply(j,arguments)}};e("start");e("move");e("end")};artDialog.dragEvent.prototype={onstart:h.noop,start:function(e){p.bind("mousemove",this.move).bind("mouseup",this.end);this._sClientX=e.clientX;this._sClientY=e.clientY;this.onstart(e.clientX,e.clientY);return!1},onmove:h.noop,move:function(e){this._mClientX=e.clientX;this._mClientY=e.clientY;this.onmove(e.clientX-this._sClientX,e.clientY-this._sClientY);return!1},onend:h.noop,end:function(e){p.unbind("mousemove",this.move).unbind("mouseup",this.end);this.onend(e.clientX,e.clientY);return!1}};l=function(h){var m,l,t,s,g,x,y=artDialog.focus,a=y.DOM,b=a.wrap,c=a.title,d=a.main,f="getSelection"in window?function(){window.getSelection().removeAllRanges()}:function(){try{document.selection.empty()}catch(a){}};e.onstart=function(){x?(l=d[0].offsetWidth,t=d[0].offsetHeight):(s=b[0].offsetLeft,g=b[0].offsetTop);p.bind("dblclick",e.end);!v&&z?c.bind("losecapture",e.end):o.bind("blur",e.end);q&&c[0].setCapture();b.addClass("aui_state_drag");y.focus()};e.onmove=function(a,c){if(x){var e=b[0].style,h=d[0].style,j=a+l,o=c+t;e.width="auto";h.width=Math.max(0,j)+"px";e.width=b[0].offsetWidth+"px";h.height=Math.max(0,o)+"px"}else h=b[0].style,e=Math.max(m.minX,Math.min(m.maxX,a+s)),j=Math.max(m.minY,Math.min(m.maxY,c+g)),h.left=e+"px",h.top=j+"px";f();y._ie6SelectFix()};e.onend=function(){p.unbind("dblclick",e.end);!v&&z?c.unbind("losecapture",e.end):o.unbind("blur",e.end);q&&c[0].releaseCapture();v&&!y.closed&&y._autoPositionType();b.removeClass("aui_state_drag")};x=h.target===a.se[0]?!0:!1;m=function(){var a=y.DOM.wrap[0],b="fixed"===a.style.position,c=a.offsetWidth,a=a.offsetHeight,d=o.width(),f=o.height(),e=b?0:p.scrollLeft(),b=b?0:p.scrollTop();return{minX:e,minY:b,maxX:d-c+e,maxY:f-a+b}}();e.start(h)};p.bind("mousedown",function(h){var m=artDialog.focus;if(m){var o=h.target,p=m.config,m=m.DOM;if(!1!==p.drag&&o===m.title[0]||!1!==p.resize&&o===m.se[0])return e=e||new artDialog.dragEvent,l(h),!1}})})(this.art||this.jQuery&&(this.art=jQuery));
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/artDiglog/plugins/iframeTools.js b/src/main/webapp/plug-in/artDiglog/plugins/iframeTools.js
    new file mode 100644
    index 00000000..54d4d007
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/plugins/iframeTools.js
    @@ -0,0 +1,10 @@
    +/*!
    + * artDialog iframeTools
    + * Date: 2011-12-08 1:32
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +eval(function(B,D,A,G,E,F){function C(A){return A<62?String.fromCharCode(A+=A<26?65:A<52?71:-4):A<63?'_':A<64?'$':C(A>>6)+C(A&63)}while(A>0)E[C(G--)]=D[--A];return B.replace(/[\w\$]+/g,function(A){return E[A]==F[A]?A:E[A]})}('(6(E,C,D,A){c B,X,W,J="@_.DATA",K="@_.OPEN",H="@_.OPENER",I=C.k=C.k||"@_.WINNAME"+(Bd Bo).Be(),F=C.VBArray&&!C.XMLHttpRequest;E(6(){!C.Bu&&7.BY==="B0"&&Br("9 Error: 7.BY === \\"B0\\"")});c G=D.d=6(){c W=C,X=6(A){f{c W=C[A].7;W.BE}u(X){v!V}v C[A].9&&W.BE("frameset").length===U};v X("d")?W=C.d:X("BB")&&(W=C.BB),W}();D.BB=G,B=G.9,W=6(){v B.BW.w},D.m=6(C,B){c W=D.d,X=W[J]||{};W[J]=X;b(B!==A)X[C]=B;else v X[C];v X},D.BQ=6(W){c X=D.d[J];X&&X[W]&&1 X[W]},D.through=X=6(){c X=B.BR(i,BJ);v G!==C&&(D.B4[X.0.Z]=X),X},G!==C&&E(C).BN("unload",6(){c A=D.B4,W;BO(c X BS A)A[X]&&(W=A[X].0,W&&(W.duration=U),A[X].s(),1 A[X])}),D.p=6(B,O,BZ){O=O||{};c N,L,M,Bc,T,S,R,Q,BF,P=D.d,Ba="8:BD;n:-Bb;d:-Bb;Bp:o U;Bf:transparent",BI="r:g%;x:g%;Bp:o U";b(BZ===!V){c BH=(Bd Bo).Be(),BG=B.replace(/([?&])W=[^&]*/,"$1_="+BH);B=BG+(BG===B?(/\\?/.test(B)?"&":"?")+"W="+BH:"")}c G=6(){c B,C,W=L.2.B2(".aui_loading"),A=N.0;M.addClass("Bi"),W&&W.hide();f{Q=T.$,R=E(Q.7),BF=Q.7.Bg}u(X){T.q.5=BI,A.z?N.z(A.z):N.8(A.n,A.d),O.j&&O.j.l(N,Q,P),O.j=By;v}B=A.r==="Bt"?R.r()+(F?U:parseInt(E(BF).Bv("marginLeft"))):A.r,C=A.x==="Bt"?R.x():A.x,setTimeout(6(){T.q.5=BI},U),N.Bk(B,C),A.z?N.z(A.z):N.8(A.n,A.d),O.j&&O.j.l(N,Q,P),O.j=By},I={w:W(),j:6(){N=i,L=N.h,Bc=L.BM,M=L.2,T=N.BK=P.7.Bn("BK"),T.Bx=B,T.k="Open"+N.0.Z,T.q.5=Ba,T.BX("frameborder",U,U),T.BX("allowTransparency",!U),S=E(T),N.2().B3(T),Q=T.$;f{Q.k=T.k,D.m(T.k+K,N),D.m(T.k+H,C)}u(X){}S.BN("BC",G)},s:6(){S.Bv("4","o").unbind("BC",G);b(O.s&&O.s.l(i,T.$,P)===!V)v!V;M.removeClass("Bi"),S[U].Bx="about:blank",S.remove();f{D.BQ(T.k+K),D.BQ(T.k+H)}u(X){}}};Bq O.Y=="6"&&(I.Y=6(){v O.Y.l(N,T.$,P)}),Bq O.y=="6"&&(I.y=6(){v O.y.l(N,T.$,P)}),1 O.2;BO(c J BS O)I[J]===A&&(I[J]=O[J]);v X(I)},D.p.Bw=D.m(I+K),D.BT=D.m(I+H)||C,D.p.origin=D.BT,D.s=6(){c X=D.m(I+K);v X&&X.s(),!V},G!=C&&E(7).BN("mousedown",6(){c X=D.p.Bw;X&&X.w()}),D.BC=6(C,D,B){B=B||!V;c G=D||{},H={w:W(),j:6(A){c W=i,X=W.0;E.ajax({url:C,success:6(X){W.2(X),G.j&&G.j.l(W,A)},cache:B})}};1 D.2;BO(c F BS G)H[F]===A&&(H[F]=G[F]);v X(H)},D.Br=6(B,A){v X({Z:"Alert",w:W(),BL:"warning",t:!U,BA:!U,2:B,Y:!U,s:A})},D.confirm=6(C,A,B){v X({Z:"Confirm",w:W(),BL:"Bm",t:!U,BA:!U,3:U.V,2:C,Y:6(X){v A.l(i,X)},y:6(X){v B&&B.l(i,X)}})},D.prompt=6(D,B,C){C=C||"";c A;v X({Z:"Prompt",w:W(),BL:"Bm",t:!U,BA:!U,3:U.V,2:["<e q=\\"margin-bottom:5px;font-Bk:12px\\">",D,"</e>","<e>","<Bl B1=\\"",C,"\\" q=\\"r:18em;Bh:6px 4px\\" />","</e>"].join(""),j:6(){A=i.h.2.B2("Bl")[U],A.select(),A.BP()},Y:6(X){v B&&B.l(i,A.B1,X)},y:!U})},D.tips=6(B,A){v X({Z:"Tips",w:W(),title:!V,y:!V,t:!U,BA:!V}).2("<e q=\\"Bh: U 1em;\\">"+B+"</e>").time(A||V.B6)},E(6(){c A=D.dragEvent;b(!A)v;c B=E(C),X=E(7),W=F?"BD":"t",H=A.prototype,I=7.Bn("e"),G=I.q;G.5="4:o;8:"+W+";n:U;d:U;r:g%;x:g%;"+"cursor:move;filter:alpha(3=U);3:U;Bf:#FFF",7.Bg.B3(I),H.Bj=H.Bs,H.BV=H.Bz,H.Bs=6(){c E=D.BP.h,C=E.BM[U],A=E.2[U].BE("BK")[U];H.Bj.BR(i,BJ),G.4="block",G.w=D.BW.w+B5,W==="BD"&&(G.r=B.r()+"a",G.x=B.x()+"a",G.n=X.scrollLeft()+"a",G.d=X.scrollTop()+"a"),A&&C.offsetWidth*C.offsetHeight>307200&&(C.q.BU="hidden")},H.Bz=6(){c X=D.BP;H.BV.BR(i,BJ),G.4="o",X&&(X.h.BM[U].q.BU="visible")}})})(i.art||i.Bu,i,i.9)','P|R|T|U|V|W|0|1|_|$|ok|id|px|if|var|top|div|try|100|DOM|this|init|name|call|data|left|none|open|style|width|close|fixed|catch|return|zIndex|height|cancel|follow|config|delete|content|opacity|display|cssText|function|document|position|artDialog|ARTDIALOG|contentWindow|lock|parent|load|absolute|getElementsByTagName|S|Y|Z|a|arguments|iframe|icon|main|bind|for|focus|removeData|apply|in|opener|visibility|_end|defaults|setAttribute|compatMode|O|Q|9999em|X|new|getTime|background|body|padding|aui_state_full|_start|size|input|question|createElement|Date|border|typeof|alert|start|auto|jQuery|css|api|src|null|end|BackCompat|value|find|appendChild|list|3|5'.split('|'),109,122,{},{}))
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/artDiglog/plugins/iframeTools.source.js b/src/main/webapp/plug-in/artDiglog/plugins/iframeTools.source.js
    new file mode 100644
    index 00000000..8be76f12
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/plugins/iframeTools.source.js
    @@ -0,0 +1,468 @@
    +/*!
    + * artDialog iframeTools
    + * Date: 2011-11-25 13:54
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +;(function ($, window, artDialog, undefined) {
    +
    +var _topDialog, _proxyDialog, _zIndex,
    +	_data = '@ARTDIALOG.DATA',
    +	_open = '@ARTDIALOG.OPEN',
    +	_opener = '@ARTDIALOG.OPENER',
    +	_winName = window.name = window.name
    +	|| '@ARTDIALOG.WINNAME' + + new Date,
    +	_isIE6 = window.VBArray && !window.XMLHttpRequest;
    +
    +$(function () {
    +	!window.jQuery && document.compatMode === 'BackCompat'
    +	// 涓嶆敮鎸佹紓妯″紡锛岃鐢ㄤ富娴佺殑XHTML1.0鎴栬匟TML5鐨凞OCTYPE鐢虫槑
    +	&& alert('artDialog Error: document.compatMode === "BackCompat"');
    +});
    +	
    +	
    +/** 鑾峰彇 artDialog 鍙法绾ц皟鐢ㄧ殑鏈楂樺眰鐨 window 瀵硅薄 */
    +var _top = artDialog.top = function () {
    +	var top = window,
    +	test = function (name) {
    +		try {
    +			var doc = window[name].document;	// 璺ㄥ煙|鏃犳潈闄
    +			doc.getElementsByTagName; 			// chrome 鏈湴瀹夊叏闄愬埗
    +		} catch (e) {
    +			return false;
    +		};
    +		
    +		return window[name].artDialog
    +		// 妗嗘灦闆嗘棤娉曟樉绀虹涓夋柟鍏冪礌
    +		&& doc.getElementsByTagName('frameset').length === 0;
    +	};
    +	
    +	if (test('top')) {
    +		top = window.top;
    +	} else if (test('parent')) {
    +		top = window.parent;
    +	};
    +	
    +	return top;
    +}();
    +artDialog.parent = _top; // 鍏煎v4.1涔嬪墠鐗堟湰锛屾湭鏉ョ増鏈皢鍒犻櫎姝
    +
    +
    +_topDialog = _top.artDialog;
    +
    +
    +// 鑾峰彇椤跺眰椤甸潰瀵硅瘽妗嗗彔鍔犲
    +_zIndex = function () {
    +	return _topDialog.defaults.zIndex;
    +};
    +
    +
    +
    +/**
    + * 璺ㄦ鏋舵暟鎹叡浜帴鍙
    + * @see		http://www.planeart.cn/?p=1554
    + * @param	{String}	瀛樺偍鐨勬暟鎹悕
    + * @param	{Any}		灏嗚瀛樺偍鐨勪换鎰忔暟鎹(鏃犳椤瑰垯杩斿洖琚煡璇㈢殑鏁版嵁)
    + */
    +artDialog.data = function (name, value) {
    +	var top = artDialog.top,
    +		cache = top[_data] || {};
    +	top[_data] = cache;
    +	
    +	if (value !== undefined) {
    +		cache[name] = value;
    +	} else {
    +		return cache[name];
    +	};
    +	return cache;
    +};
    +
    +
    +/**
    + * 鏁版嵁鍏变韩鍒犻櫎鎺ュ彛
    + * @param	{String}	鍒犻櫎鐨勬暟鎹悕
    + */
    +artDialog.removeData = function (name) {
    +	var cache = artDialog.top[_data];
    +	if (cache && cache[name]) delete cache[name];
    +};
    +
    +
    +/** 璺ㄦ鏋舵櫘閫氬璇濇 */
    +artDialog.through = _proxyDialog = function () {
    +	var api = _topDialog.apply(this, arguments);
    +		
    +	// 缂撳瓨浠庡綋鍓 window锛堝彲鑳戒负iframe锛夎皟鍑烘墍鏈夎法妗嗘灦瀵硅瘽妗嗭紝
    +	// 浠ヤ究璁╁綋鍓 window 鍗歌浇鍓嶅幓鍏抽棴杩欎簺瀵硅瘽妗嗐
    +	// 鍥犱负iframe娉ㄩ攢鍚庝篃浼氫粠鍐呭瓨涓垹闄ゅ叾鍒涘缓鐨勫璞★紝杩欐牱鍙互闃叉鍥炶皟鍑芥暟鎶ラ敊
    +	if (_top !== window) artDialog.list[api.config.id] = api;
    +	return api;
    +};
    +
    +// 妗嗘灦椤甸潰鍗歌浇鍓嶅叧闂墍鏈夌┛瓒婄殑瀵硅瘽妗
    +_top !== window && $(window).bind('unload', function () {
    +	var list = artDialog.list, config;
    +	for (var i in list) {
    +		if (list[i]) {
    +			config = list[i].config;
    +			if (config) config.duration = 0; // 鍙栨秷鍔ㄧ敾
    +			list[i].close();
    +			//delete list[i];
    +		};
    +	};
    +});
    +
    +
    +/**
    + * 寮圭獥 (iframe)
    + * @param	{String}	鍦板潃
    + * @param	{Object}	閰嶇疆鍙傛暟. 杩欓噷浼犲叆鐨勫洖璋冨嚱鏁版帴鏀剁殑绗1涓弬鏁颁负iframe鍐呴儴window瀵硅薄
    + * @param	{Boolean}	鏄惁鍏佽缂撳瓨. 榛樿true
    + */
    +artDialog.open = function (url, options, cache) {
    +	options = options || {};
    +	
    +	var api, DOM,
    +		$content, $main, iframe, $iframe, $idoc, iwin, ibody,
    +		top = artDialog.top,
    +		initCss = 'position:absolute;left:-9999em;top:-9999em;border:none 0;background:transparent',
    +		loadCss = 'width:100%;height:100%;border:none 0';
    +		
    +	if (cache === false) {
    +		var ts = + new Date,
    +			ret = url.replace(/([?&])_=[^&]*/, "$1_=" + ts );
    +		url = ret + ((ret === url) ? (/\?/.test(url) ? "&" : "?") + "_=" + ts : "");
    +	};
    +		
    +	var load = function () {
    +		var iWidth, iHeight,
    +			loading = DOM.content.find('.aui_loading'),
    +			aConfig = api.config;
    +			
    +		$content.addClass('aui_state_full');
    +		
    +		loading && loading.hide();
    +		
    +		try {
    +			iwin = iframe.contentWindow;
    +			$idoc = $(iwin.document);
    +			ibody = iwin.document.body;
    +		} catch (e) {// 璺ㄥ煙
    +			iframe.style.cssText = loadCss;
    +			
    +			aConfig.follow
    +			? api.follow(aConfig.follow)
    +			: api.position(aConfig.left, aConfig.top);
    +			
    +			options.init && options.init.call(api, iwin, top);
    +			options.init = null;
    +			return;
    +		};
    +		
    +		// 鑾峰彇iframe鍐呴儴灏哄
    +		iWidth = aConfig.width === 'auto'
    +		? $idoc.width() + (_isIE6 ? 0 : parseInt($(ibody).css('marginLeft')))
    +		: aConfig.width;
    +		
    +		iHeight = aConfig.height === 'auto'
    +		? $idoc.height()
    +		: aConfig.height;
    +		
    +		// 閫傚簲iframe灏哄
    +		setTimeout(function () {
    +			iframe.style.cssText = loadCss;
    +		}, 0);// setTimeout: 闃叉IE6~7瀵硅瘽妗嗘牱寮忔覆鏌撳紓甯
    +		api.size(iWidth, iHeight);
    +		
    +		// 璋冩暣瀵硅瘽妗嗕綅缃
    +		aConfig.follow
    +		? api.follow(aConfig.follow)
    +		: api.position(aConfig.left, aConfig.top);
    +		
    +		options.init && options.init.call(api, iwin, top);
    +		options.init = null;
    +	};
    +		
    +	var config = {
    +		zIndex: _zIndex(),
    +		init: function () {
    +			api = this;
    +			DOM = api.DOM;
    +			$main = DOM.main;
    +			$content = DOM.content;
    +			
    +			iframe = api.iframe = top.document.createElement('iframe');
    +			iframe.src = url;
    +			iframe.name = 'Open' + api.config.id;
    +			iframe.style.cssText = initCss;
    +			iframe.setAttribute('frameborder', 0, 0);
    +			iframe.setAttribute('allowTransparency', true);
    +			
    +			$iframe = $(iframe);
    +			api.content().appendChild(iframe);
    +			iwin = iframe.contentWindow;
    +			
    +			try {
    +				iwin.name = iframe.name;
    +				artDialog.data(iframe.name + _open, api);
    +				artDialog.data(iframe.name + _opener, window);
    +			} catch (e) {};
    +			
    +			$iframe.bind('load', load);
    +		},
    +		close: function () {
    +			$iframe.css('display', 'none').unbind('load', load);
    +			
    +			if (options.close && options.close.call(this, iframe.contentWindow, top) === false) {
    +				return false;
    +			};
    +			$content.removeClass('aui_state_full');
    +			
    +			// 閲嶈锛侀渶瑕侀噸缃甶frame鍦板潃锛屽惁鍒欎笅娆″嚭鐜扮殑瀵硅瘽妗嗗湪IE6銆7鏃犳硶鑱氱劍input
    +			// IE鍒犻櫎iframe鍚庯紝iframe浠嶇劧浼氱暀鍦ㄥ唴瀛樹腑鍑虹幇涓婅堪闂锛岀疆鎹rc鏄渶瀹规槗瑙e喅鐨勬柟娉
    +			$iframe[0].src = 'about:blank';
    +			$iframe.remove();
    +			
    +			try {
    +				artDialog.removeData(iframe.name + _open);
    +				artDialog.removeData(iframe.name + _opener);
    +			} catch (e) {};
    +		}
    +	};
    +	
    +	// 鍥炶皟鍑芥暟绗竴涓弬鏁版寚鍚慽frame鍐呴儴window瀵硅薄
    +	if (typeof options.ok === 'function') config.ok = function () {
    +		return options.ok.call(api, iframe.contentWindow, top);
    +	};
    +	if (typeof options.cancel === 'function') config.cancel = function () {
    +		return options.cancel.call(api, iframe.contentWindow, top);
    +	};
    +	
    +	delete options.content;
    +
    +	for (var i in options) {
    +		if (config[i] === undefined) config[i] = options[i];
    +	};
    +	
    +	return _proxyDialog(config);
    +};
    +
    +
    +/** 寮曠敤open鏂规硶鎵╁睍鏂规硶(鍦╫pen鎵撳紑鐨刬frame鍐呴儴绉佹湁鏂规硶) */
    +artDialog.open.api = artDialog.data(_winName + _open);
    +
    +
    +/** 寮曠敤open鏂规硶瑙﹀彂鏉ユ簮椤甸潰window(鍦╫pen鎵撳紑鐨刬frame鍐呴儴绉佹湁鏂规硶) */
    +artDialog.opener = artDialog.data(_winName + _opener) || window;
    +artDialog.open.origin = artDialog.opener; // 鍏煎v4.1涔嬪墠鐗堟湰锛屾湭鏉ョ増鏈皢鍒犻櫎姝
    +
    +/** artDialog.open 鎵撳紑鐨刬frame椤甸潰閲屽叧闂璇濇蹇嵎鏂规硶 */
    +artDialog.close = function () {
    +	var api = artDialog.data(_winName + _open);
    +	api && api.close();
    +	return false;
    +};
    +
    +// 鐐瑰嚮iframe鍐呭鍒囨崲鍙犲姞楂樺害
    +_top != window && $(document).bind('mousedown', function () {
    +	var api = artDialog.open.api;
    +	api && api.zIndex();
    +});
    +
    +
    +/**
    + * Ajax濉厖鍐呭
    + * @param	{String}			鍦板潃
    + * @param	{Object}			閰嶇疆鍙傛暟
    + * @param	{Boolean}			鏄惁鍏佽缂撳瓨. 榛樿true
    + */
    +artDialog.load = function(url, options, cache){
    +	cache = cache || false;
    +	var opt = options || {};
    +		
    +	var config = {
    +		zIndex: _zIndex(),
    +		init: function(here){
    +			var api = this,
    +				aConfig = api.config;
    +			
    +			$.ajax({
    +				url: url,
    +				success: function (content) {
    +					api.content(content);
    +					opt.init && opt.init.call(api, here);		
    +				},
    +				cache: cache
    +			});
    +			
    +		}
    +	};
    +	
    +	delete options.content;
    +	
    +	for (var i in opt) {
    +		if (config[i] === undefined) config[i] = opt[i];
    +	};
    +	
    +	return _proxyDialog(config);
    +};
    +
    +
    +/**
    + * 璀﹀憡
    + * @param	{String}	娑堟伅鍐呭
    + */
    +artDialog.alert = function (content, callback) {
    +	return _proxyDialog({
    +		id: 'Alert',
    +		zIndex: _zIndex(),
    +		icon: 'warning',
    +		fixed: true,
    +		lock: true,
    +		content: content,
    +		ok: true,
    +		close: callback
    +	});
    +};
    +
    +
    +/**
    + * 纭
    + * @param	{String}	娑堟伅鍐呭
    + * @param	{Function}	纭畾鎸夐挳鍥炶皟鍑芥暟
    + * @param	{Function}	鍙栨秷鎸夐挳鍥炶皟鍑芥暟
    + */
    +artDialog.confirm = function (content, yes, no) {
    +	return _proxyDialog({
    +		id: 'Confirm',
    +		zIndex: _zIndex(),
    +		icon: 'question',
    +		fixed: true,
    +		lock: true,
    +		opacity: .1,
    +		content: content,
    +		ok: function (here) {
    +			return yes.call(this, here);
    +		},
    +		cancel: function (here) {
    +			return no && no.call(this, here);
    +		}
    +	});
    +};
    +
    +
    +/**
    + * 鎻愰棶
    + * @param	{String}	鎻愰棶鍐呭
    + * @param	{Function}	鍥炶皟鍑芥暟. 鎺ユ敹鍙傛暟锛氳緭鍏ュ
    + * @param	{String}	榛樿鍊
    + */
    +artDialog.prompt = function (content, yes, value) {
    +	value = value || '';
    +	var input;
    +	
    +	return _proxyDialog({
    +		id: 'Prompt',
    +		zIndex: _zIndex(),
    +		icon: 'question',
    +		fixed: true,
    +		lock: true,
    +		opacity: .1,
    +		content: [
    +			'<div style="margin-bottom:5px;font-size:12px">',
    +				content,
    +			'</div>',
    +			'<div>',
    +				'<input value="',
    +					value,
    +				'" style="width:18em;padding:6px 4px" />',
    +			'</div>'
    +			].join(''),
    +		init: function () {
    +			input = this.DOM.content.find('input')[0];
    +			input.select();
    +			input.focus();
    +		},
    +		ok: function (here) {
    +			return yes && yes.call(this, input.value, here);
    +		},
    +		cancel: true
    +	});
    +};
    +
    +
    +/**
    + * 鐭殏鎻愮ず
    + * @param	{String}	鎻愮ず鍐呭
    + * @param	{Number}	鏄剧ず鏃堕棿 (榛樿1.5绉)
    + */
    +artDialog.tips = function (content, time) {
    +	return _proxyDialog({
    +		id: 'Tips',
    +		zIndex: _zIndex(),
    +		title: false,
    +		cancel: false,
    +		fixed: true,
    +		lock: false
    +	})
    +	.content('<div style="padding: 0 1em;">' + content + '</div>')
    +	.time(time || 1.5);
    +};
    +
    +
    +// 澧炲己artDialog鎷栨嫿浣撻獙
    +// - 闃叉榧犳爣钀藉叆iframe瀵艰嚧涓嶆祦鐣
    +// - 瀵硅秴澶у璇濇鎷栧姩浼樺寲
    +$(function () {
    +	var event = artDialog.dragEvent;
    +	if (!event) return;
    +
    +	var $window = $(window),
    +		$document = $(document),
    +		positionType = _isIE6 ? 'absolute' : 'fixed',
    +		dragEvent = event.prototype,
    +		mask = document.createElement('div'),
    +		style = mask.style;
    +		
    +	style.cssText = 'display:none;position:' + positionType + ';left:0;top:0;width:100%;height:100%;'
    +	+ 'cursor:move;filter:alpha(opacity=0);opacity:0;background:#FFF';
    +		
    +	document.body.appendChild(mask);
    +	dragEvent._start = dragEvent.start;
    +	dragEvent._end = dragEvent.end;
    +	
    +	dragEvent.start = function () {
    +		var DOM = artDialog.focus.DOM,
    +			main = DOM.main[0],
    +			iframe = DOM.content[0].getElementsByTagName('iframe')[0];
    +		
    +		dragEvent._start.apply(this, arguments);
    +		style.display = 'block';
    +		style.zIndex = artDialog.defaults.zIndex + 3;
    +		
    +		if (positionType === 'absolute') {
    +			style.width = $window.width() + 'px';
    +			style.height = $window.height() + 'px';
    +			style.left = $document.scrollLeft() + 'px';
    +			style.top = $document.scrollTop() + 'px';
    +		};
    +		
    +		if (iframe && main.offsetWidth * main.offsetHeight > 307200) {
    +			main.style.visibility = 'hidden';
    +		};
    +	};
    +	
    +	dragEvent.end = function () {
    +		var dialog = artDialog.focus;
    +		dragEvent._end.apply(this, arguments);
    +		style.display = 'none';
    +		if (dialog) dialog.DOM.main[0].style.visibility = 'visible';
    +	};
    +});
    +
    +})(this.art || this.jQuery, this, this.artDialog);
    +
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero.css b/src/main/webapp/plug-in/artDiglog/skins/aero.css
    new file mode 100644
    index 00000000..3b11a2ac
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/skins/aero.css
    @@ -0,0 +1,61 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#FFF; }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:30px; _bottom:0; _margin-top:-30px; }
    +.aui_title { height:29px; line-height:29px; padding:0 16px 0 0; _padding:0; color:#FFF; font-weight:700; text-shadow:1px 1px 0 rgba(0, 0, 0, .9); }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(aero/aero_s.png); background-repeat:no-repeat; }
    +.aui_nw { width:14px; height:34px; background-position: 0 0; _png:aero/ie6/aui_nw.png; }
    +.aui_ne { width:14px; height:34px; background-position: -14px 0; _png:aero/ie6/aui_ne.png; }
    +.aui_sw { width:14px; height:14px; background-position: 0 -34px; _png:aero/ie6/aui_sw.png; }
    +.aui_se { width:14px; height:14px; background-position: -14px -34px; _png:aero/ie6/aui_se.png; }
    +.aui_close { top:7px; right:0; _z-index:1; width:13px; height:13px; _font-size:0; _line-height:0; text-indent:-9999em; background-position:left -96px; _background:url(aero/ie6/aui_close.png); }
    +.aui_close:hover { background-position:right -96px; _background:url(aero/ie6/aui_close.hover.png); }
    +.aui_n, .aui_s { background-repeat:repeat-x; }
    +.aui_n { background-position: 0 -48px; _png:aero/ie6/aui_n.png; }
    +.aui_s { background-position: 0 -82px; _png:aero/ie6/aui_s.png; }
    +.aui_w, .aui_e { background-image:url(aero/aero_s2.png); background-repeat:repeat-y; }
    +.aui_w { background-position:left top; _png:aero/ie6/aui_w.png; }
    +.aui_e { background-position: right bottom; _png:aero/ie6/aui_e.png; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/aero_s.png b/src/main/webapp/plug-in/artDiglog/skins/aero/aero_s.png
    new file mode 100644
    index 00000000..ff3a379c
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/aero_s.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/aero_s2.png b/src/main/webapp/plug-in/artDiglog/skins/aero/aero_s2.png
    new file mode 100644
    index 00000000..6fda697d
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/aero_s2.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_close.hover.png b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_close.hover.png
    new file mode 100644
    index 00000000..d4248387
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_close.hover.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_close.png b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_close.png
    new file mode 100644
    index 00000000..6aef1a80
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_close.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_e.png b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_e.png
    new file mode 100644
    index 00000000..413cd232
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_e.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_n.png b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_n.png
    new file mode 100644
    index 00000000..5b0b0cd7
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_n.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_ne.png b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_ne.png
    new file mode 100644
    index 00000000..23e82f60
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_ne.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_nw.png b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_nw.png
    new file mode 100644
    index 00000000..8212d5a9
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_nw.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_s.png b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_s.png
    new file mode 100644
    index 00000000..4e24a737
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_s.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_se.png b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_se.png
    new file mode 100644
    index 00000000..668bd831
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_se.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_sw.png b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_sw.png
    new file mode 100644
    index 00000000..539584ee
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_sw.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_title_icon.png b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_title_icon.png
    new file mode 100644
    index 00000000..149aba4c
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_title_icon.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_w.png b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_w.png
    new file mode 100644
    index 00000000..a00691ba
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/aero/ie6/aui_w.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black.css b/src/main/webapp/plug-in/artDiglog/skins/black.css
    new file mode 100644
    index 00000000..94ec9431
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/skins/black.css
    @@ -0,0 +1,79 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0 \9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #3399dd; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#1c6a9e; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#f7f7f7; }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:30px; _bottom:0; _margin-top:-30px; }
    +.aui_title { height:29px; line-height:29px; padding:0 25px 0 0; _padding:0; text-indent:5px; color:#FFF; font-weight:700; text-shadow:-1px -1px 0 rgba(0, 0, 0, .7); }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(black/bg.png); background-repeat:no-repeat; }
    +.aui_nw { width:15px; height:38px; background-position: 0 0; _png:black/ie6/nw.png; }
    +.aui_ne { width:15px; height:38px; background-position: -15px 0; _png:black/ie6/ne.png; }
    +.aui_sw { width:15px; height:18px; background-position: 0 -38px; _png:black/ie6/sw.png; }
    +.aui_se { width:15px; height:18px; background-position: -15px -38px; _png:black/ie6/se.png; }
    +.aui_close { top:4px; right:4px; _z-index:1; width:20px; height:20px; _font-size:0; _line-height:0; text-indent:-9999em; background-position:0 -112px; _png:black/ie6/close.png; }
    +.aui_close:hover { background-position:0 -132px; }
    +.aui_n, .aui_s { background-repeat:repeat-x; }
    +.aui_n { background-position: 0 -56px; _png:black/ie6/n.png; }
    +.aui_s { background-position: 0 -94px; _png:black/ie6/s.png; }
    +.aui_w, .aui_e { background-image:url(black/bg2.png); background-repeat:repeat-y; }
    +.aui_w { background-position:left top; _png:black/ie6/w.png; }
    +.aui_e { background-position: right bottom; _png:black/ie6/e.png; }
    +aui_icon, .aui_main { padding-top:3px; }
    +@media screen and (min-width:0) {
    +	.aui_outer { border-radius:8px; box-shadow:0 5px 15px rgba(0, 0, 0, .4); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +	.aui_state_drag .aui_outer { box-shadow:none; }
    +	.aui_state_lock .aui_outer { box-shadow:0 3px 26px rgba(0, 0, 0, .9); }
    +	.aui_outer:active { box-shadow:0 0 5px rgba(0, 0, 0, .1)!important; }
    +	.aui_state_drag .aui_outer { box-shadow:none!important; }
    +	.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(black/bg_css3.png); }
    +	.aui_nw { width:5px; height:31px; }
    +	.aui_ne { width:5px; height:31px; background-position: -5px 0; _png:black/ie6/ne.png; }
    +	.aui_sw { width:5px; height:5px;background-position: 0 -31px; }
    +	.aui_se { width:5px; height:5px; background-position: -5px -31px; }
    +	.aui_close { background-position:0 -72px; }
    +	.aui_close:hover { background-position:0 -92px; }
    +	.aui_n { background-position: 0 -36px; }
    +	.aui_s { background-position: 0 -67px; }
    +	.aui_w, .aui_e { background-image:url(black/bg_css3_2.png); }
    +}
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/bg.png b/src/main/webapp/plug-in/artDiglog/skins/black/bg.png
    new file mode 100644
    index 00000000..6d42b890
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/bg.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/bg2.png b/src/main/webapp/plug-in/artDiglog/skins/black/bg2.png
    new file mode 100644
    index 00000000..8f5568df
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/bg2.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/bg_css3.png b/src/main/webapp/plug-in/artDiglog/skins/black/bg_css3.png
    new file mode 100644
    index 00000000..32cc89d5
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/bg_css3.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/bg_css3_2.png b/src/main/webapp/plug-in/artDiglog/skins/black/bg_css3_2.png
    new file mode 100644
    index 00000000..4e5801b7
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/bg_css3_2.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/ie6/close.hover.png b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/close.hover.png
    new file mode 100644
    index 00000000..73b02c43
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/close.hover.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/ie6/close.png b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/close.png
    new file mode 100644
    index 00000000..d18600b0
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/close.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/ie6/e.png b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/e.png
    new file mode 100644
    index 00000000..0dbe7694
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/e.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/ie6/n.png b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/n.png
    new file mode 100644
    index 00000000..67ba731a
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/n.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/ie6/ne.png b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/ne.png
    new file mode 100644
    index 00000000..7f34d69d
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/ne.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/ie6/nw.png b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/nw.png
    new file mode 100644
    index 00000000..74b52859
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/nw.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/ie6/s.png b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/s.png
    new file mode 100644
    index 00000000..aadc5bc5
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/s.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/ie6/se.png b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/se.png
    new file mode 100644
    index 00000000..6a4ac965
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/se.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/ie6/sw.png b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/sw.png
    new file mode 100644
    index 00000000..5637896f
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/sw.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/black/ie6/w.png b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/w.png
    new file mode 100644
    index 00000000..910b3a16
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/black/ie6/w.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue.css b/src/main/webapp/plug-in/artDiglog/skins/blue.css
    new file mode 100644
    index 00000000..35f8042c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/skins/blue.css
    @@ -0,0 +1,79 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0 \9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #3399dd; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#1c6a9e; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#f7f7f7; }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:30px; _bottom:0; _margin-top:-30px; }
    +.aui_title { height:29px; line-height:29px; padding:0 25px 0 0; _padding:0; text-indent:5px; color:#FFF; font-weight:700; text-shadow:-1px -1px 0 rgba(33, 79, 183, .7); }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(blue/bg.png); background-repeat:no-repeat; }
    +.aui_nw { width:15px; height:38px; background-position: 0 0; _png:blue/ie6/nw.png; }
    +.aui_ne { width:15px; height:38px; background-position: -15px 0; _png:blue/ie6/ne.png; }
    +.aui_sw { width:15px; height:18px; background-position: 0 -38px; _png:blue/ie6/sw.png; }
    +.aui_se { width:15px; height:18px; background-position: -15px -38px; _png:blue/ie6/se.png; }
    +.aui_close { top:4px; right:4px; _z-index:1; width:20px; height:20px; _font-size:0; _line-height:0; text-indent:-9999em; background-position:0 -112px; _png:blue/ie6/close.png; }
    +.aui_close:hover { background-position:0 -132px; }
    +.aui_n, .aui_s { background-repeat:repeat-x; }
    +.aui_n { background-position: 0 -56px; _png:blue/ie6/n.png; }
    +.aui_s { background-position: 0 -94px; _png:blue/ie6/s.png; }
    +.aui_w, .aui_e { background-image:url(blue/bg2.png); background-repeat:repeat-y; }
    +.aui_w { background-position:left top; _png:blue/ie6/w.png; }
    +.aui_e { background-position: right bottom; _png:blue/ie6/e.png; }
    +aui_icon, .aui_main { padding-top:3px; }
    +@media screen and (min-width:0) {
    +	.aui_outer { border-radius:8px; box-shadow:0 5px 15px rgba(2, 37, 69, .4); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +	.aui_state_drag .aui_outer { box-shadow:none; }
    +	.aui_state_lock .aui_outer { box-shadow:0 3px 26px rgba(0, 0, 0, .9); }
    +	.aui_outer:active { box-shadow:0 0 5px rgba(2, 37, 69, .1)!important; }
    +	.aui_state_drag .aui_outer { box-shadow:none!important; }
    +	.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(blue/bg_css3.png); }
    +	.aui_nw { width:5px; height:31px; }
    +	.aui_ne { width:5px; height:31px; background-position: -5px 0; _png:blue/ie6/ne.png; }
    +	.aui_sw { width:5px; height:5px;background-position: 0 -31px; }
    +	.aui_se { width:5px; height:5px; background-position: -5px -31px; }
    +	.aui_close { background-position:0 -72px; }
    +	.aui_close:hover { background-position:0 -92px; }
    +	.aui_n { background-position: 0 -36px; }
    +	.aui_s { background-position: 0 -67px; }
    +	.aui_w, .aui_e { background-image:url(blue/bg_css3_2.png); }
    +}
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/bg.png b/src/main/webapp/plug-in/artDiglog/skins/blue/bg.png
    new file mode 100644
    index 00000000..52c1c019
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/bg.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/bg2.png b/src/main/webapp/plug-in/artDiglog/skins/blue/bg2.png
    new file mode 100644
    index 00000000..834c17a8
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/bg2.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/bg_css3.png b/src/main/webapp/plug-in/artDiglog/skins/blue/bg_css3.png
    new file mode 100644
    index 00000000..8f55b85b
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/bg_css3.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/bg_css3_2.png b/src/main/webapp/plug-in/artDiglog/skins/blue/bg_css3_2.png
    new file mode 100644
    index 00000000..b8f66eb8
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/bg_css3_2.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/close.hover.png b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/close.hover.png
    new file mode 100644
    index 00000000..40de7076
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/close.hover.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/close.png b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/close.png
    new file mode 100644
    index 00000000..72c7157e
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/close.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/e.png b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/e.png
    new file mode 100644
    index 00000000..d892f027
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/e.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/n.png b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/n.png
    new file mode 100644
    index 00000000..28c2ff53
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/n.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/ne.png b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/ne.png
    new file mode 100644
    index 00000000..eaa3cb4f
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/ne.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/nw.png b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/nw.png
    new file mode 100644
    index 00000000..45bb0379
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/nw.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/s.png b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/s.png
    new file mode 100644
    index 00000000..ee9ab028
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/s.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/se.png b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/se.png
    new file mode 100644
    index 00000000..1e181ab4
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/se.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/sw.png b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/sw.png
    new file mode 100644
    index 00000000..b2193e3f
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/sw.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/w.png b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/w.png
    new file mode 100644
    index 00000000..6c4472db
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/blue/ie6/w.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/chrome.css b/src/main/webapp/plug-in/artDiglog/skins/chrome.css
    new file mode 100644
    index 00000000..78e4c34f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/skins/chrome.css
    @@ -0,0 +1,61 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#FFF; }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:26px; _bottom:0; _margin-top:-26px;}
    +.aui_title { height:26px; line-height:23px; padding:0 60px 0 5px; color:#FFF; font-weight:700; text-shadow:0 1px 0 #000; }
    +.aui_nw, .aui_ne, .aui_w, .aui_e, .aui_sw, .aui_se, .aui_close { background-image:url(chrome/chrome_s.png); background-repeat:no-repeat; }
    +.aui_nw { width:5px; height:26px; background-position: -46px -8px; }
    +.aui_ne { width:5px; height:26px; background-position: -53px -8px; }
    +.aui_w { background-position:-60px 0; background-repeat:repeat-y; }
    +.aui_e { background-position:-65px 0; background-repeat:repeat-y; }
    +.aui_sw { width:5px; height:5px; background-position: -46px -2px;}
    +.aui_se { width:5px; height:5px; background-position: -53px -2px;}
    +.aui_close { top:1px; right:0; width:44px; height:17px; background-position:0 0; _font-size:0; _line-height:0; text-indent:-9999em; }
    +.aui_close:hover { background-position:0 -18px; }
    +.aui_n, .aui_s { background-image:url(chrome/border.png); background-repeat:repeat-x; }
    +.aui_n { background-position:0 top; }
    +.aui_s { background-position: 0 bottom; }
    +.aui_buttons { background-color:#F6F6F6; border-top:solid 1px #DADEE5; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/chrome/border.png b/src/main/webapp/plug-in/artDiglog/skins/chrome/border.png
    new file mode 100644
    index 00000000..db3bdcd9
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/chrome/border.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/chrome/chrome_s.png b/src/main/webapp/plug-in/artDiglog/skins/chrome/chrome_s.png
    new file mode 100644
    index 00000000..3f62b86f
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/chrome/chrome_s.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/default.css b/src/main/webapp/plug-in/artDiglog/skins/default.css
    new file mode 100644
    index 00000000..d0d8df20
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/skins/default.css
    @@ -0,0 +1,67 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#FFF; }
    +.aui_outer, .aui_inner { border:1px solid rgba(0, 0, 0, .7); border:1px solid #333\9; }
    +.aui_border { box-shadow: inset 0 0 1px rgba(255, 255, 255, .9); }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se { width:8px; height:8px; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_e, .aui_sw, .aui_s, .aui_se { background:rgba(0, 0, 0, .4); background:#000\9!important; filter:alpha(opacity=40); }
    +.aui_state_lock .aui_nw, .aui_state_lock .aui_n, .aui_state_lock .aui_ne, .aui_state_lock .aui_w, .aui_state_lock .aui_e, .aui_state_lock .aui_sw, .aui_state_lock .aui_s, .aui_state_lock .aui_se { background:rgba(0, 0, 0, .5); background:#000\9!important; filter:alpha(opacity=50); }
    +.aui_state_focus .aui_dialog { box-shadow: 0 0 3px rgba(0, 0, 0, 0.4); }
    +.aui_state_focus .aui_outer { box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1); }
    +.aui_state_lock .aui_border { box-shadow:0 3px 26px rgba(0, 0, 0, .9); }
    +.aui_state_drag .aui_outer, .aui_outer:active { box-shadow:none; }
    +.aui_titleBar { position:relative; height:100%; }
    +.aui_title { height:28px; line-height:27px; padding:0 28px 0 10px; text-shadow:0 1px 0 rgba(255, 255, 255, .7); background-color:#edf5f8; font-weight:bold; color:#95a7ae; font-family: Tahoma, Arial/9!important; background-color:#bdc6cd; background: linear-gradient(top, #edf5f8, #bdc6cd); background: -moz-linear-gradient(top, #edf5f8, #bdc6cd); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#edf5f8), to(#bdc6cd)); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#edf5f8', endColorstr='#bdc6cd'); border-top:1px solid #edf5f8; border-bottom:1px solid #b6bec5; }
    +.aui_state_focus .aui_title { color:#4c5a5f; }
    +.aui_state_drag .aui_title { background: linear-gradient(top, #bdc6cd, #edf5f8); background: -moz-linear-gradient(top, #bdc6cd, #edf5f8); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bdc6cd), to(#edf5f8)); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdc6cd', endColorstr='#edf5f8'); box-shadow:none; }
    +.aui_state_drag .aui_titleBar { box-shadow:none; }
    +.aui_close { padding:0; top:4px; right:4px; width:21px; height:21px; line-height:21px; font-size:18px; color:#68767b; text-align:center; font-family: Helvetica, STHeiti; _font-family: Tahoma, '\u9ed1\u4f53', 'Book Antiqua', Palatino; text-shadow:0 1px 0 rgba(255, 255, 255, .9); }
    +.aui_close:hover { background:#C72015; color:#FFF; }
    +.aui_close:active { box-shadow: none; }
    +.aui_content { color:#666; }
    +.aui_state_focus .aui_content { color:#000; }
    +.aui_buttons { background-color:#F6F6F6; border-top:solid 1px #DADEE5; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { border:none 0; box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    +.aui_state_noTitle .aui_dialog { box-shadow: none; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green.css b/src/main/webapp/plug-in/artDiglog/skins/green.css
    new file mode 100644
    index 00000000..48ea4917
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/skins/green.css
    @@ -0,0 +1,79 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0 \9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(0, 50, 0, .7); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(0, 50, 0, .7), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #679a10; background: #7cb61b; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#98d237', endColorstr='#7cb61b'); background: linear-gradient(top, #98d237, #7cb61b); background: -moz-linear-gradient(top, #98d237, #7cb61b); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#98d237), to(#7cb61b)); text-shadow: -1px -1px 1px #679a10; }
    +button.aui_state_highlight:focus { border-color:#679a10; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#3c5412; }
    +button.aui_state_highlight:active { border-color:#3c5412; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#98d237', endColorstr='#7cb61b'); background: linear-gradient(top, #98d237, #7cb61b); background: -moz-linear-gradient(top, #98d237, #7cb61b); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#98d237), to(#7cb61b)); }
    +/* common end */
    +
    +.aui_inner { background:#f7f7f7; }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:30px; _bottom:0; _margin-top:-30px; }
    +.aui_title { height:29px; line-height:29px; padding:0 25px 0 0; _padding:0; text-indent:5px; color:#FFF; font-weight:700; text-shadow:-1px -1px 0 rgba(0, 50, 0, .7); }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(green/bg.png); background-repeat:no-repeat; }
    +.aui_nw { width:15px; height:38px; background-position: 0 0; _png:green/ie6/nw.png; }
    +.aui_ne { width:15px; height:38px; background-position: -15px 0; _png:green/ie6/ne.png; }
    +.aui_sw { width:15px; height:18px; background-position: 0 -38px; _png:green/ie6/sw.png; }
    +.aui_se { width:15px; height:18px; background-position: -15px -38px; _png:green/ie6/se.png; }
    +.aui_close { top:4px; right:4px; _z-index:1; width:20px; height:20px; _font-size:0; _line-height:0; text-indent:-9999em; background-position:0 -112px; _png:green/ie6/close.png; }
    +.aui_close:hover { background-position:0 -132px; }
    +.aui_n, .aui_s { background-repeat:repeat-x; }
    +.aui_n { background-position: 0 -56px; _png:green/ie6/n.png; }
    +.aui_s { background-position: 0 -94px; _png:green/ie6/s.png; }
    +.aui_w, .aui_e { background-image:url(green/bg2.png); background-repeat:repeat-y; }
    +.aui_w { background-position:left top; _png:green/ie6/w.png; }
    +.aui_e { background-position: right bottom; _png:green/ie6/e.png; }
    +aui_icon, .aui_main { padding-top:3px; }
    +@media screen and (min-width:0) {
    +	.aui_outer { border-radius:8px; box-shadow:0 5px 15px rgba(0, 50, 0, .4); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +	.aui_state_lock .aui_outer { box-shadow:0 3px 26px rgba(0, 0, 0, .9); }
    +	.aui_outer:active { box-shadow:0 0 5px rgba(0, 50, 0, .1)!important; }
    +	.aui_state_drag .aui_outer { box-shadow:none!important; }
    +	.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(green/bg_css3.png); }
    +	.aui_nw { width:5px; height:31px; }
    +	.aui_ne { width:5px; height:31px; background-position: -5px 0; _png:green/ie6/ne.png; }
    +	.aui_sw { width:5px; height:5px;background-position: 0 -31px; }
    +	.aui_se { width:5px; height:5px; background-position: -5px -31px; }
    +	.aui_close { background-position:0 -72px; }
    +	.aui_close:hover { background-position:0 -92px; }
    +	.aui_n { background-position: 0 -36px; }
    +	.aui_s { background-position: 0 -67px; }
    +	.aui_w, .aui_e { background-image:url(green/bg_css3_2.png); }
    +}
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/bg.png b/src/main/webapp/plug-in/artDiglog/skins/green/bg.png
    new file mode 100644
    index 00000000..7919c88e
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/bg.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/bg2.png b/src/main/webapp/plug-in/artDiglog/skins/green/bg2.png
    new file mode 100644
    index 00000000..3faa0c8a
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/bg2.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/bg_css3.png b/src/main/webapp/plug-in/artDiglog/skins/green/bg_css3.png
    new file mode 100644
    index 00000000..aa255e43
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/bg_css3.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/bg_css3_2.png b/src/main/webapp/plug-in/artDiglog/skins/green/bg_css3_2.png
    new file mode 100644
    index 00000000..4e5801b7
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/bg_css3_2.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/color_bg.png b/src/main/webapp/plug-in/artDiglog/skins/green/color_bg.png
    new file mode 100644
    index 00000000..7919c88e
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/color_bg.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/ie6/close.hover.png b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/close.hover.png
    new file mode 100644
    index 00000000..46fc9d72
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/close.hover.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/ie6/close.png b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/close.png
    new file mode 100644
    index 00000000..932e5970
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/close.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/ie6/e.png b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/e.png
    new file mode 100644
    index 00000000..c3fc738e
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/e.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/ie6/n.png b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/n.png
    new file mode 100644
    index 00000000..8742f202
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/n.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/ie6/ne.png b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/ne.png
    new file mode 100644
    index 00000000..57e8e620
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/ne.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/ie6/nw.png b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/nw.png
    new file mode 100644
    index 00000000..a210191c
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/nw.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/ie6/s.png b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/s.png
    new file mode 100644
    index 00000000..67fcd94e
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/s.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/ie6/se.png b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/se.png
    new file mode 100644
    index 00000000..c6d97441
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/se.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/ie6/sw.png b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/sw.png
    new file mode 100644
    index 00000000..d135dcd1
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/sw.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/green/ie6/w.png b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/w.png
    new file mode 100644
    index 00000000..43378267
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/green/ie6/w.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/icons/error.png b/src/main/webapp/plug-in/artDiglog/skins/icons/error.png
    new file mode 100644
    index 00000000..4929a2e2
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/icons/error.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/icons/face-sad.png b/src/main/webapp/plug-in/artDiglog/skins/icons/face-sad.png
    new file mode 100644
    index 00000000..5d819d81
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/icons/face-sad.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/icons/face-smile.png b/src/main/webapp/plug-in/artDiglog/skins/icons/face-smile.png
    new file mode 100644
    index 00000000..f952c13c
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/icons/face-smile.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/icons/loading.gif b/src/main/webapp/plug-in/artDiglog/skins/icons/loading.gif
    new file mode 100644
    index 00000000..229b7c0a
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/icons/loading.gif differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/icons/question.png b/src/main/webapp/plug-in/artDiglog/skins/icons/question.png
    new file mode 100644
    index 00000000..941a4c98
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/icons/question.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/icons/succeed.png b/src/main/webapp/plug-in/artDiglog/skins/icons/succeed.png
    new file mode 100644
    index 00000000..c78d40bf
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/icons/succeed.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/icons/warning.png b/src/main/webapp/plug-in/artDiglog/skins/icons/warning.png
    new file mode 100644
    index 00000000..bcaab1e5
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/icons/warning.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog.css b/src/main/webapp/plug-in/artDiglog/skins/idialog.css
    new file mode 100644
    index 00000000..23c6d878
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/skins/idialog.css
    @@ -0,0 +1,71 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#FFF; }
    +.aui_titleBar { width:100%; }
    +.aui_title { position:absolute; left:0; top:0; width:100%; height:22px; text-align:left; text-indent:-999em; font-size:0; }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(idialog/idialog_s.png); background-repeat:no-repeat; }
    +.aui_nw { width:15px; height:15px; background-position: 0 0; _png:idialog/ie6/aui_nw.png; }
    +.aui_ne { width:15px; height:15px; background-position: -15px 0; _png:idialog/ie6/aui_ne.png; }
    +.aui_sw { width:15px; height:15px; background-position: 0 -15px; _png:idialog/ie6/aui_sw.png; }
    +.aui_se { width:15px; height:15px; background-position: -15px -15px; _png:idialog/ie6/aui_se.png; }
    +.aui_close { position:absolute; right:-8px; top:-8px; _z-index:1; width:34px; height:34px; _font-size:0; _line-height:0; text-indent:-9999em; background-position:0 -60px; _png:idialog/ie6/aui_close.png; }
    +.aui_close:hover { background-position:0 -94px; _png:idialog/ie6/aui_close.hover.png; }
    +.aui_n, .aui_s { background-repeat:repeat-x; }
    +.aui_n { background-position: 0 -30px; _png:idialog/ie6/aui_n.png; }
    +.aui_s { background-position: 0 -45px; _png:idialog/ie6/aui_s.png; }
    +.aui_w, .aui_e { background-image:url(idialog/idialog_s2.png); background-repeat:repeat-y; }
    +.aui_w { background-position:left top; _png:idialog/ie6/aui_w.png; }
    +.aui_e { background-position: right bottom; _png:idialog/ie6/aui_e.png; }
    +@media screen and (min-width:0) {/* css3 */
    +	.aui_nw, .aui_ne, .aui_sw, .aui_se{ width:5px; height:5px; }
    +	.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_e, .aui_sw, .aui_s, .aui_se { background:none; }
    +	.aui_sw, .aui_s, .aui_se { background:url(idialog/idialog_s.png) repeat-x 0 -45px; }
    +	.aui_sw { border-radius:0 0 0 5px; }
    +	.aui_se { border-radius:0 0 5px 0; }
    +	.aui_outer { border:1px solid #929292; border-radius:5px; box-shadow:0 3px 8px rgba(0, 0, 0, .2); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +	.aui_border { border-radius:5px; background:#FFF; }
    +	.aui_state_drag .aui_outer { box-shadow:none; }
    +	.aui_state_lock .aui_outer { box-shadow:0 3px 26px rgba(0, 0, 0, .9); }
    +	.aui_outer:active { box-shadow:0 0 5px rgba(0, 0, 0, .1)!important; }
    +	.aui_state_drag .aui_outer { box-shadow:none!important; }
    +	.aui_close { right:-16px; top:-16px; }
    +}
    +@media screen and (-webkit-min-device-pixel-ratio:0) {/* apple | webkit */
    +	.aui_close { right:auto; left:-16px; top:-16px; }
    +}
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog/idialog_s.png b/src/main/webapp/plug-in/artDiglog/skins/idialog/idialog_s.png
    new file mode 100644
    index 00000000..d86d0544
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/idialog/idialog_s.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog/idialog_s2.png b/src/main/webapp/plug-in/artDiglog/skins/idialog/idialog_s2.png
    new file mode 100644
    index 00000000..7be06ad2
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/idialog/idialog_s2.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_close.hover.png b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_close.hover.png
    new file mode 100644
    index 00000000..dd00dde3
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_close.hover.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_close.png b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_close.png
    new file mode 100644
    index 00000000..04ed8bea
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_close.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_e.png b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_e.png
    new file mode 100644
    index 00000000..b96ff2f3
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_e.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_n.png b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_n.png
    new file mode 100644
    index 00000000..34871bee
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_n.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_ne.png b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_ne.png
    new file mode 100644
    index 00000000..36449443
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_ne.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_nw.png b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_nw.png
    new file mode 100644
    index 00000000..dea0b9a5
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_nw.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_s.png b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_s.png
    new file mode 100644
    index 00000000..62746ee4
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_s.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_se.png b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_se.png
    new file mode 100644
    index 00000000..32247e84
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_se.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_sw.png b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_sw.png
    new file mode 100644
    index 00000000..478f609f
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_sw.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_w.png b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_w.png
    new file mode 100644
    index 00000000..c4df489d
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/idialog/ie6/aui_w.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera.css b/src/main/webapp/plug-in/artDiglog/skins/opera.css
    new file mode 100644
    index 00000000..06b6c8f7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/skins/opera.css
    @@ -0,0 +1,62 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#f0f1f9; }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:27px; _bottom:0; _margin-top:-27px; }
    +.aui_title { height:27px; line-height:27px; padding:0 37px 0 0; _padding:0; color:#333; text-shadow:1px 1px 0 rgba(255, 255, 255, .7); }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(opera/s1.png); background-repeat:no-repeat; }
    +.aui_nw { width:15px; height:32px; background-position: 0 0; _png:opera/ie6/aui_nw.png; }
    +.aui_ne { width:15px; height:32px; background-position: -15px 0; _png:opera/ie6/aui_ne.png; }
    +.aui_sw { width:15px; height:15px; background-position: 0 -33px; _png:opera/ie6/aui_sw.png; }
    +.aui_se { width:15px; height:15px; background-position: -15px -33px; _png:opera/ie6/aui_se.png; }
    +.aui_close { top:0; right:0; _z-index:1; width:27px; height:27px; _font-size:0; _line-height:0; *zoom:1; text-indent:-9999em; background-position:0 -96px; _png:opera/ie6/aui_close.png; }
    +.aui_close:hover { background-position:0 -123px; _png:opera/ie6/aui_close.hover.png; }
    +.aui_n, .aui_s { background-repeat:repeat-x; }
    +.aui_n { background-position: 0 -48px; _png:opera/ie6/aui_n.png; }
    +.aui_s { background-position: 0 -81px; _png:opera/ie6/aui_s.png; }
    +.aui_w, .aui_e { background-image:url(opera/s2.png); background-repeat:repeat-y; }
    +.aui_w { background-position:left top; _png:opera/ie6/aui_w.png; }
    +.aui_e { background-position: right bottom; _png:opera/ie6/aui_e.png; }
    +.aui_icon, .aui_main { padding-top:10px; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_close.hover.png b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_close.hover.png
    new file mode 100644
    index 00000000..8e942f07
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_close.hover.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_close.png b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_close.png
    new file mode 100644
    index 00000000..9442e413
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_close.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_e.png b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_e.png
    new file mode 100644
    index 00000000..de6faba4
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_e.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_n.png b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_n.png
    new file mode 100644
    index 00000000..840358d9
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_n.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_ne.png b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_ne.png
    new file mode 100644
    index 00000000..fa30a505
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_ne.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_nw.png b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_nw.png
    new file mode 100644
    index 00000000..6d09929e
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_nw.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_s.png b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_s.png
    new file mode 100644
    index 00000000..c0318414
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_s.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_se.png b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_se.png
    new file mode 100644
    index 00000000..8679228f
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_se.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_sw.png b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_sw.png
    new file mode 100644
    index 00000000..9866db35
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_sw.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_w.png b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_w.png
    new file mode 100644
    index 00000000..519cf11e
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/opera/ie6/aui_w.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera/s1.png b/src/main/webapp/plug-in/artDiglog/skins/opera/s1.png
    new file mode 100644
    index 00000000..e6941c1f
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/opera/s1.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/opera/s2.png b/src/main/webapp/plug-in/artDiglog/skins/opera/s2.png
    new file mode 100644
    index 00000000..0debda05
    Binary files /dev/null and b/src/main/webapp/plug-in/artDiglog/skins/opera/s2.png differ
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/simple.css b/src/main/webapp/plug-in/artDiglog/skins/simple.css
    new file mode 100644
    index 00000000..690b16c8
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/skins/simple.css
    @@ -0,0 +1,55 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#FFF; border:1px solid #666; }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se { width:3px; height:3px; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_e, .aui_sw, .aui_s, .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5); }
    +.aui_titleBar { position:relative; height:100%;  }
    +.aui_title { position:absolute; top:0; left:0; width:100%; height:24px; text-indent:-9999em; overflow:hidden; font-size:0; }
    +.aui_state_drag .aui_title { color:#666; }
    +.aui_close { padding:0; top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; }
    +.aui_close:hover, .aui_close:active { text-decoration:none; color:#900; }
    +.aui_content { color:#666; }
    +.aui_state_focus .aui_content { color:#000; }
    +@media screen and (min-width:0) {
    +	.aui_close { width:20px; height:20px; line-height:20px; right:-10px; top:-10px; border-radius:20px; background:#999; color:#FFF; box-shadow:0 1px 3px rgba(0, 0, 0, .3); -moz-transition: linear .06s; -webkit-transition: linear .06s; transition: linear .06s; }
    +	.aui_close:hover { width:24px; height:24px; line-height:24px; right:-12px; top:-12px; color:#FFF; box-shadow:0 1px 3px rgba(209, 40, 42, .5); background:#d1282a; border-radius:24px; }
    +	.aui_state_lock .aui_dialog { box-shadow:0 3px 26px rgba(0, 0, 0, .9); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +	.aui_dialog:active { box-shadow:0 0 5px rgba(0, 0, 0, .1)!important; }
    +	.aui_state_drag .aui_outer { box-shadow:none!important; }
    +}
    diff --git a/src/main/webapp/plug-in/artDiglog/skins/twitter.css b/src/main/webapp/plug-in/artDiglog/skins/twitter.css
    new file mode 100644
    index 00000000..aeeaf8e5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/artDiglog/skins/twitter.css
    @@ -0,0 +1,59 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:rgba(0, 0, 0, .7); }
    +.aui_dialog { background:#FFF; border-radius:3px; }
    +.aui_outer { border:1px solid #000; border-radius:5px; box-shadow: 0 3px 0 rgba(0,0,0,0.1); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +.aui_state_lock .aui_outer { box-shadow:0 3px 26px rgba(0, 0, 0, .9); }
    +.aui_outer:active { box-shadow:none!important; }
    +.aui_state_drag .aui_outer { box-shadow:none!important; }
    +.aui_border { border-radius:3px; }
    +.aui_nw, .aui_ne { width:5px; height:37px; }
    +.aui_sw, .aui_se { width:5px; height:5px; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_e, .aui_sw, .aui_s, .aui_se { background:rgba(0, 0, 0, .7); background:#000\9!important; filter:alpha(opacity=70); }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:33px; _bottom:0; _margin-top:-33px; }
    +.aui_title { height:27px; line-height:27px; padding:0 16px 0 5px; color:#FFF; font-weight:700; text-shadow:0 1px 0 #000; }
    +.aui_close { padding:0; top:2px; right:5px; width:21px; height:21px; line-height:21px; font-size:18px; text-align:center; color:#EBEBEB; font-family: Helvetica, STHeiti; _font-family: Tahoma, '\u9ed1\u4f53', 'Book Antiqua', Palatino; border:1px solid transparent; _border:0 none; background:#000; border-radius:15px;  }
    +.aui_state_drag .aui_close { color:#FFF; }
    +.aui_close:hover { background:#C72015; border:1px solid #000; _border:0 none; box-shadow: 0 1px 0 rgba(255, 255, 255, .3), inset 0 1px 0 rgba(255, 255, 255, .3); }
    +.aui_close:active { box-shadow: none; }
    +.aui_state_noTitle { }
    +.aui_content { color:#666; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne { height:5px; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:5px; }
    diff --git a/src/main/webapp/plug-in/bootstrap/css/bootstrap-responsive.css b/src/main/webapp/plug-in/bootstrap/css/bootstrap-responsive.css
    new file mode 100644
    index 00000000..9259d26d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/css/bootstrap-responsive.css
    @@ -0,0 +1,1058 @@
    +/*!
    + * Bootstrap Responsive v2.1.1
    + *
    + * Copyright 2012 Twitter, Inc
    + * Licensed under the Apache License v2.0
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Designed and built with all the love in the world @twitter by @mdo and @fat.
    + */
    +
    +.clearfix {
    +  *zoom: 1;
    +}
    +
    +.clearfix:before,
    +.clearfix:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.clearfix:after {
    +  clear: both;
    +}
    +
    +.hide-text {
    +  font: 0/0 a;
    +  color: transparent;
    +  text-shadow: none;
    +  background-color: transparent;
    +  border: 0;
    +}
    +
    +.input-block-level {
    +  display: block;
    +  width: 100%;
    +  min-height: 30px;
    +  -webkit-box-sizing: border-box;
    +     -moz-box-sizing: border-box;
    +          box-sizing: border-box;
    +}
    +
    +.hidden {
    +  display: none;
    +  visibility: hidden;
    +}
    +
    +.visible-phone {
    +  display: none !important;
    +}
    +
    +.visible-tablet {
    +  display: none !important;
    +}
    +
    +.hidden-desktop {
    +  display: none !important;
    +}
    +
    +.visible-desktop {
    +  display: inherit !important;
    +}
    +
    +@media (min-width: 768px) and (max-width: 979px) {
    +  .hidden-desktop {
    +    display: inherit !important;
    +  }
    +  .visible-desktop {
    +    display: none !important ;
    +  }
    +  .visible-tablet {
    +    display: inherit !important;
    +  }
    +  .hidden-tablet {
    +    display: none !important;
    +  }
    +}
    +
    +@media (max-width: 767px) {
    +  .hidden-desktop {
    +    display: inherit !important;
    +  }
    +  .visible-desktop {
    +    display: none !important;
    +  }
    +  .visible-phone {
    +    display: inherit !important;
    +  }
    +  .hidden-phone {
    +    display: none !important;
    +  }
    +}
    +
    +@media (min-width: 1200px) {
    +  .row {
    +    margin-left: -30px;
    +    *zoom: 1;
    +  }
    +  .row:before,
    +  .row:after {
    +    display: table;
    +    line-height: 0;
    +    content: "";
    +  }
    +  .row:after {
    +    clear: both;
    +  }
    +  [class*="span"] {
    +    float: left;
    +    min-height: 1px;
    +    margin-left: 30px;
    +  }
    +  .container,
    +  .navbar-static-top .container,
    +  .navbar-fixed-top .container,
    +  .navbar-fixed-bottom .container {
    +    width: 1170px;
    +  }
    +  .span12 {
    +    width: 1170px;
    +  }
    +  .span11 {
    +    width: 1070px;
    +  }
    +  .span10 {
    +    width: 970px;
    +  }
    +  .span9 {
    +    width: 870px;
    +  }
    +  .span8 {
    +    width: 770px;
    +  }
    +  .span7 {
    +    width: 670px;
    +  }
    +  .span6 {
    +    width: 570px;
    +  }
    +  .span5 {
    +    width: 470px;
    +  }
    +  .span4 {
    +    width: 370px;
    +  }
    +  .span3 {
    +    width: 270px;
    +  }
    +  .span2 {
    +    width: 170px;
    +  }
    +  .span1 {
    +    width: 70px;
    +  }
    +  .offset12 {
    +    margin-left: 1230px;
    +  }
    +  .offset11 {
    +    margin-left: 1130px;
    +  }
    +  .offset10 {
    +    margin-left: 1030px;
    +  }
    +  .offset9 {
    +    margin-left: 930px;
    +  }
    +  .offset8 {
    +    margin-left: 830px;
    +  }
    +  .offset7 {
    +    margin-left: 730px;
    +  }
    +  .offset6 {
    +    margin-left: 630px;
    +  }
    +  .offset5 {
    +    margin-left: 530px;
    +  }
    +  .offset4 {
    +    margin-left: 430px;
    +  }
    +  .offset3 {
    +    margin-left: 330px;
    +  }
    +  .offset2 {
    +    margin-left: 230px;
    +  }
    +  .offset1 {
    +    margin-left: 130px;
    +  }
    +  .row-fluid {
    +    width: 100%;
    +    *zoom: 1;
    +  }
    +  .row-fluid:before,
    +  .row-fluid:after {
    +    display: table;
    +    line-height: 0;
    +    content: "";
    +  }
    +  .row-fluid:after {
    +    clear: both;
    +  }
    +  .row-fluid [class*="span"] {
    +    display: block;
    +    float: left;
    +    width: 100%;
    +    min-height: 30px;
    +    margin-left: 2.564102564102564%;
    +    *margin-left: 2.5109110747408616%;
    +    -webkit-box-sizing: border-box;
    +       -moz-box-sizing: border-box;
    +            box-sizing: border-box;
    +  }
    +  .row-fluid [class*="span"]:first-child {
    +    margin-left: 0;
    +  }
    +  .row-fluid .span12 {
    +    width: 100%;
    +    *width: 99.94680851063829%;
    +  }
    +  .row-fluid .span11 {
    +    width: 91.45299145299145%;
    +    *width: 91.39979996362975%;
    +  }
    +  .row-fluid .span10 {
    +    width: 82.90598290598291%;
    +    *width: 82.8527914166212%;
    +  }
    +  .row-fluid .span9 {
    +    width: 74.35897435897436%;
    +    *width: 74.30578286961266%;
    +  }
    +  .row-fluid .span8 {
    +    width: 65.81196581196582%;
    +    *width: 65.75877432260411%;
    +  }
    +  .row-fluid .span7 {
    +    width: 57.26495726495726%;
    +    *width: 57.21176577559556%;
    +  }
    +  .row-fluid .span6 {
    +    width: 48.717948717948715%;
    +    *width: 48.664757228587014%;
    +  }
    +  .row-fluid .span5 {
    +    width: 40.17094017094017%;
    +    *width: 40.11774868157847%;
    +  }
    +  .row-fluid .span4 {
    +    width: 31.623931623931625%;
    +    *width: 31.570740134569924%;
    +  }
    +  .row-fluid .span3 {
    +    width: 23.076923076923077%;
    +    *width: 23.023731587561375%;
    +  }
    +  .row-fluid .span2 {
    +    width: 14.52991452991453%;
    +    *width: 14.476723040552828%;
    +  }
    +  .row-fluid .span1 {
    +    width: 5.982905982905983%;
    +    *width: 5.929714493544281%;
    +  }
    +  .row-fluid .offset12 {
    +    margin-left: 105.12820512820512%;
    +    *margin-left: 105.02182214948171%;
    +  }
    +  .row-fluid .offset12:first-child {
    +    margin-left: 102.56410256410257%;
    +    *margin-left: 102.45771958537915%;
    +  }
    +  .row-fluid .offset11 {
    +    margin-left: 96.58119658119658%;
    +    *margin-left: 96.47481360247316%;
    +  }
    +  .row-fluid .offset11:first-child {
    +    margin-left: 94.01709401709402%;
    +    *margin-left: 93.91071103837061%;
    +  }
    +  .row-fluid .offset10 {
    +    margin-left: 88.03418803418803%;
    +    *margin-left: 87.92780505546462%;
    +  }
    +  .row-fluid .offset10:first-child {
    +    margin-left: 85.47008547008548%;
    +    *margin-left: 85.36370249136206%;
    +  }
    +  .row-fluid .offset9 {
    +    margin-left: 79.48717948717949%;
    +    *margin-left: 79.38079650845607%;
    +  }
    +  .row-fluid .offset9:first-child {
    +    margin-left: 76.92307692307693%;
    +    *margin-left: 76.81669394435352%;
    +  }
    +  .row-fluid .offset8 {
    +    margin-left: 70.94017094017094%;
    +    *margin-left: 70.83378796144753%;
    +  }
    +  .row-fluid .offset8:first-child {
    +    margin-left: 68.37606837606839%;
    +    *margin-left: 68.26968539734497%;
    +  }
    +  .row-fluid .offset7 {
    +    margin-left: 62.393162393162385%;
    +    *margin-left: 62.28677941443899%;
    +  }
    +  .row-fluid .offset7:first-child {
    +    margin-left: 59.82905982905982%;
    +    *margin-left: 59.72267685033642%;
    +  }
    +  .row-fluid .offset6 {
    +    margin-left: 53.84615384615384%;
    +    *margin-left: 53.739770867430444%;
    +  }
    +  .row-fluid .offset6:first-child {
    +    margin-left: 51.28205128205128%;
    +    *margin-left: 51.175668303327875%;
    +  }
    +  .row-fluid .offset5 {
    +    margin-left: 45.299145299145295%;
    +    *margin-left: 45.1927623204219%;
    +  }
    +  .row-fluid .offset5:first-child {
    +    margin-left: 42.73504273504273%;
    +    *margin-left: 42.62865975631933%;
    +  }
    +  .row-fluid .offset4 {
    +    margin-left: 36.75213675213675%;
    +    *margin-left: 36.645753773413354%;
    +  }
    +  .row-fluid .offset4:first-child {
    +    margin-left: 34.18803418803419%;
    +    *margin-left: 34.081651209310785%;
    +  }
    +  .row-fluid .offset3 {
    +    margin-left: 28.205128205128204%;
    +    *margin-left: 28.0987452264048%;
    +  }
    +  .row-fluid .offset3:first-child {
    +    margin-left: 25.641025641025642%;
    +    *margin-left: 25.53464266230224%;
    +  }
    +  .row-fluid .offset2 {
    +    margin-left: 19.65811965811966%;
    +    *margin-left: 19.551736679396257%;
    +  }
    +  .row-fluid .offset2:first-child {
    +    margin-left: 17.094017094017094%;
    +    *margin-left: 16.98763411529369%;
    +  }
    +  .row-fluid .offset1 {
    +    margin-left: 11.11111111111111%;
    +    *margin-left: 11.004728132387708%;
    +  }
    +  .row-fluid .offset1:first-child {
    +    margin-left: 8.547008547008547%;
    +    *margin-left: 8.440625568285142%;
    +  }
    +  input,
    +  textarea,
    +  .uneditable-input {
    +    margin-left: 0;
    +  }
    +  .controls-row [class*="span"] + [class*="span"] {
    +    margin-left: 30px;
    +  }
    +  input.span12,
    +  textarea.span12,
    +  .uneditable-input.span12 {
    +    width: 1156px;
    +  }
    +  input.span11,
    +  textarea.span11,
    +  .uneditable-input.span11 {
    +    width: 1056px;
    +  }
    +  input.span10,
    +  textarea.span10,
    +  .uneditable-input.span10 {
    +    width: 956px;
    +  }
    +  input.span9,
    +  textarea.span9,
    +  .uneditable-input.span9 {
    +    width: 856px;
    +  }
    +  input.span8,
    +  textarea.span8,
    +  .uneditable-input.span8 {
    +    width: 756px;
    +  }
    +  input.span7,
    +  textarea.span7,
    +  .uneditable-input.span7 {
    +    width: 656px;
    +  }
    +  input.span6,
    +  textarea.span6,
    +  .uneditable-input.span6 {
    +    width: 556px;
    +  }
    +  input.span5,
    +  textarea.span5,
    +  .uneditable-input.span5 {
    +    width: 456px;
    +  }
    +  input.span4,
    +  textarea.span4,
    +  .uneditable-input.span4 {
    +    width: 356px;
    +  }
    +  input.span3,
    +  textarea.span3,
    +  .uneditable-input.span3 {
    +    width: 256px;
    +  }
    +  input.span2,
    +  textarea.span2,
    +  .uneditable-input.span2 {
    +    width: 156px;
    +  }
    +  input.span1,
    +  textarea.span1,
    +  .uneditable-input.span1 {
    +    width: 56px;
    +  }
    +  .thumbnails {
    +    margin-left: -30px;
    +  }
    +  .thumbnails > li {
    +    margin-left: 30px;
    +  }
    +  .row-fluid .thumbnails {
    +    margin-left: 0;
    +  }
    +}
    +
    +@media (min-width: 768px) and (max-width: 979px) {
    +  .row {
    +    margin-left: -20px;
    +    *zoom: 1;
    +  }
    +  .row:before,
    +  .row:after {
    +    display: table;
    +    line-height: 0;
    +    content: "";
    +  }
    +  .row:after {
    +    clear: both;
    +  }
    +  [class*="span"] {
    +    float: left;
    +    min-height: 1px;
    +    margin-left: 20px;
    +  }
    +  .container,
    +  .navbar-static-top .container,
    +  .navbar-fixed-top .container,
    +  .navbar-fixed-bottom .container {
    +    width: 724px;
    +  }
    +  .span12 {
    +    width: 724px;
    +  }
    +  .span11 {
    +    width: 662px;
    +  }
    +  .span10 {
    +    width: 600px;
    +  }
    +  .span9 {
    +    width: 538px;
    +  }
    +  .span8 {
    +    width: 476px;
    +  }
    +  .span7 {
    +    width: 414px;
    +  }
    +  .span6 {
    +    width: 352px;
    +  }
    +  .span5 {
    +    width: 290px;
    +  }
    +  .span4 {
    +    width: 228px;
    +  }
    +  .span3 {
    +    width: 166px;
    +  }
    +  .span2 {
    +    width: 104px;
    +  }
    +  .span1 {
    +    width: 42px;
    +  }
    +  .offset12 {
    +    margin-left: 764px;
    +  }
    +  .offset11 {
    +    margin-left: 702px;
    +  }
    +  .offset10 {
    +    margin-left: 640px;
    +  }
    +  .offset9 {
    +    margin-left: 578px;
    +  }
    +  .offset8 {
    +    margin-left: 516px;
    +  }
    +  .offset7 {
    +    margin-left: 454px;
    +  }
    +  .offset6 {
    +    margin-left: 392px;
    +  }
    +  .offset5 {
    +    margin-left: 330px;
    +  }
    +  .offset4 {
    +    margin-left: 268px;
    +  }
    +  .offset3 {
    +    margin-left: 206px;
    +  }
    +  .offset2 {
    +    margin-left: 144px;
    +  }
    +  .offset1 {
    +    margin-left: 82px;
    +  }
    +  .row-fluid {
    +    width: 100%;
    +    *zoom: 1;
    +  }
    +  .row-fluid:before,
    +  .row-fluid:after {
    +    display: table;
    +    line-height: 0;
    +    content: "";
    +  }
    +  .row-fluid:after {
    +    clear: both;
    +  }
    +  .row-fluid [class*="span"] {
    +    display: block;
    +    float: left;
    +    width: 100%;
    +    min-height: 30px;
    +    margin-left: 2.7624309392265194%;
    +    *margin-left: 2.709239449864817%;
    +    -webkit-box-sizing: border-box;
    +       -moz-box-sizing: border-box;
    +            box-sizing: border-box;
    +  }
    +  .row-fluid [class*="span"]:first-child {
    +    margin-left: 0;
    +  }
    +  .row-fluid .span12 {
    +    width: 100%;
    +    *width: 99.94680851063829%;
    +  }
    +  .row-fluid .span11 {
    +    width: 91.43646408839778%;
    +    *width: 91.38327259903608%;
    +  }
    +  .row-fluid .span10 {
    +    width: 82.87292817679558%;
    +    *width: 82.81973668743387%;
    +  }
    +  .row-fluid .span9 {
    +    width: 74.30939226519337%;
    +    *width: 74.25620077583166%;
    +  }
    +  .row-fluid .span8 {
    +    width: 65.74585635359117%;
    +    *width: 65.69266486422946%;
    +  }
    +  .row-fluid .span7 {
    +    width: 57.18232044198895%;
    +    *width: 57.12912895262725%;
    +  }
    +  .row-fluid .span6 {
    +    width: 48.61878453038674%;
    +    *width: 48.56559304102504%;
    +  }
    +  .row-fluid .span5 {
    +    width: 40.05524861878453%;
    +    *width: 40.00205712942283%;
    +  }
    +  .row-fluid .span4 {
    +    width: 31.491712707182323%;
    +    *width: 31.43852121782062%;
    +  }
    +  .row-fluid .span3 {
    +    width: 22.92817679558011%;
    +    *width: 22.87498530621841%;
    +  }
    +  .row-fluid .span2 {
    +    width: 14.3646408839779%;
    +    *width: 14.311449394616199%;
    +  }
    +  .row-fluid .span1 {
    +    width: 5.801104972375691%;
    +    *width: 5.747913483013988%;
    +  }
    +  .row-fluid .offset12 {
    +    margin-left: 105.52486187845304%;
    +    *margin-left: 105.41847889972962%;
    +  }
    +  .row-fluid .offset12:first-child {
    +    margin-left: 102.76243093922652%;
    +    *margin-left: 102.6560479605031%;
    +  }
    +  .row-fluid .offset11 {
    +    margin-left: 96.96132596685082%;
    +    *margin-left: 96.8549429881274%;
    +  }
    +  .row-fluid .offset11:first-child {
    +    margin-left: 94.1988950276243%;
    +    *margin-left: 94.09251204890089%;
    +  }
    +  .row-fluid .offset10 {
    +    margin-left: 88.39779005524862%;
    +    *margin-left: 88.2914070765252%;
    +  }
    +  .row-fluid .offset10:first-child {
    +    margin-left: 85.6353591160221%;
    +    *margin-left: 85.52897613729868%;
    +  }
    +  .row-fluid .offset9 {
    +    margin-left: 79.8342541436464%;
    +    *margin-left: 79.72787116492299%;
    +  }
    +  .row-fluid .offset9:first-child {
    +    margin-left: 77.07182320441989%;
    +    *margin-left: 76.96544022569647%;
    +  }
    +  .row-fluid .offset8 {
    +    margin-left: 71.2707182320442%;
    +    *margin-left: 71.16433525332079%;
    +  }
    +  .row-fluid .offset8:first-child {
    +    margin-left: 68.50828729281768%;
    +    *margin-left: 68.40190431409427%;
    +  }
    +  .row-fluid .offset7 {
    +    margin-left: 62.70718232044199%;
    +    *margin-left: 62.600799341718584%;
    +  }
    +  .row-fluid .offset7:first-child {
    +    margin-left: 59.94475138121547%;
    +    *margin-left: 59.838368402492065%;
    +  }
    +  .row-fluid .offset6 {
    +    margin-left: 54.14364640883978%;
    +    *margin-left: 54.037263430116376%;
    +  }
    +  .row-fluid .offset6:first-child {
    +    margin-left: 51.38121546961326%;
    +    *margin-left: 51.27483249088986%;
    +  }
    +  .row-fluid .offset5 {
    +    margin-left: 45.58011049723757%;
    +    *margin-left: 45.47372751851417%;
    +  }
    +  .row-fluid .offset5:first-child {
    +    margin-left: 42.81767955801105%;
    +    *margin-left: 42.71129657928765%;
    +  }
    +  .row-fluid .offset4 {
    +    margin-left: 37.01657458563536%;
    +    *margin-left: 36.91019160691196%;
    +  }
    +  .row-fluid .offset4:first-child {
    +    margin-left: 34.25414364640884%;
    +    *margin-left: 34.14776066768544%;
    +  }
    +  .row-fluid .offset3 {
    +    margin-left: 28.45303867403315%;
    +    *margin-left: 28.346655695309746%;
    +  }
    +  .row-fluid .offset3:first-child {
    +    margin-left: 25.69060773480663%;
    +    *margin-left: 25.584224756083227%;
    +  }
    +  .row-fluid .offset2 {
    +    margin-left: 19.88950276243094%;
    +    *margin-left: 19.783119783707537%;
    +  }
    +  .row-fluid .offset2:first-child {
    +    margin-left: 17.12707182320442%;
    +    *margin-left: 17.02068884448102%;
    +  }
    +  .row-fluid .offset1 {
    +    margin-left: 11.32596685082873%;
    +    *margin-left: 11.219583872105325%;
    +  }
    +  .row-fluid .offset1:first-child {
    +    margin-left: 8.56353591160221%;
    +    *margin-left: 8.457152932878806%;
    +  }
    +  input,
    +  textarea,
    +  .uneditable-input {
    +    margin-left: 0;
    +  }
    +  .controls-row [class*="span"] + [class*="span"] {
    +    margin-left: 20px;
    +  }
    +  input.span12,
    +  textarea.span12,
    +  .uneditable-input.span12 {
    +    width: 710px;
    +  }
    +  input.span11,
    +  textarea.span11,
    +  .uneditable-input.span11 {
    +    width: 648px;
    +  }
    +  input.span10,
    +  textarea.span10,
    +  .uneditable-input.span10 {
    +    width: 586px;
    +  }
    +  input.span9,
    +  textarea.span9,
    +  .uneditable-input.span9 {
    +    width: 524px;
    +  }
    +  input.span8,
    +  textarea.span8,
    +  .uneditable-input.span8 {
    +    width: 462px;
    +  }
    +  input.span7,
    +  textarea.span7,
    +  .uneditable-input.span7 {
    +    width: 400px;
    +  }
    +  input.span6,
    +  textarea.span6,
    +  .uneditable-input.span6 {
    +    width: 338px;
    +  }
    +  input.span5,
    +  textarea.span5,
    +  .uneditable-input.span5 {
    +    width: 276px;
    +  }
    +  input.span4,
    +  textarea.span4,
    +  .uneditable-input.span4 {
    +    width: 214px;
    +  }
    +  input.span3,
    +  textarea.span3,
    +  .uneditable-input.span3 {
    +    width: 152px;
    +  }
    +  input.span2,
    +  textarea.span2,
    +  .uneditable-input.span2 {
    +    width: 90px;
    +  }
    +  input.span1,
    +  textarea.span1,
    +  .uneditable-input.span1 {
    +    width: 28px;
    +  }
    +}
    +
    +@media (max-width: 767px) {
    +  body {
    +    padding-right: 20px;
    +    padding-left: 20px;
    +  }
    +  .navbar-fixed-top,
    +  .navbar-fixed-bottom,
    +  .navbar-static-top {
    +    margin-right: -20px;
    +    margin-left: -20px;
    +  }
    +  .container-fluid {
    +    padding: 0;
    +  }
    +  .dl-horizontal dt {
    +    float: none;
    +    width: auto;
    +    clear: none;
    +    text-align: left;
    +  }
    +  .dl-horizontal dd {
    +    margin-left: 0;
    +  }
    +  .container {
    +    width: auto;
    +  }
    +  .row-fluid {
    +    width: 100%;
    +  }
    +  .row,
    +  .thumbnails {
    +    margin-left: 0;
    +  }
    +  .thumbnails > li {
    +    float: none;
    +    margin-left: 0;
    +  }
    +  [class*="span"],
    +  .row-fluid [class*="span"] {
    +    display: block;
    +    float: none;
    +    width: 100%;
    +    margin-left: 0;
    +    -webkit-box-sizing: border-box;
    +       -moz-box-sizing: border-box;
    +            box-sizing: border-box;
    +  }
    +  .span12,
    +  .row-fluid .span12 {
    +    width: 100%;
    +    -webkit-box-sizing: border-box;
    +       -moz-box-sizing: border-box;
    +            box-sizing: border-box;
    +  }
    +  .input-large,
    +  .input-xlarge,
    +  .input-xxlarge,
    +  input[class*="span"],
    +  select[class*="span"],
    +  textarea[class*="span"],
    +  .uneditable-input {
    +    display: block;
    +    width: 100%;
    +    min-height: 30px;
    +    -webkit-box-sizing: border-box;
    +       -moz-box-sizing: border-box;
    +            box-sizing: border-box;
    +  }
    +  .input-prepend input,
    +  .input-append input,
    +  .input-prepend input[class*="span"],
    +  .input-append input[class*="span"] {
    +    display: inline-block;
    +    width: auto;
    +  }
    +  .controls-row [class*="span"] + [class*="span"] {
    +    margin-left: 0;
    +  }
    +  .modal {
    +    position: fixed;
    +    top: 20px;
    +    right: 20px;
    +    left: 20px;
    +    width: auto;
    +    margin: 0;
    +  }
    +  .modal.fade.in {
    +    top: auto;
    +  }
    +}
    +
    +@media (max-width: 480px) {
    +  .nav-collapse {
    +    -webkit-transform: translate3d(0, 0, 0);
    +  }
    +  .page-header h1 small {
    +    display: block;
    +    line-height: 20px;
    +  }
    +  input[type="checkbox"],
    +  input[type="radio"] {
    +    border: 1px solid #ccc;
    +  }
    +  .form-horizontal .control-label {
    +    float: none;
    +    width: auto;
    +    padding-top: 0;
    +    text-align: left;
    +  }
    +  .form-horizontal .controls {
    +    margin-left: 0;
    +  }
    +  .form-horizontal .control-list {
    +    padding-top: 0;
    +  }
    +  .form-horizontal .form-actions {
    +    padding-right: 10px;
    +    padding-left: 10px;
    +  }
    +  .modal {
    +    top: 10px;
    +    right: 10px;
    +    left: 10px;
    +  }
    +  .modal-header .close {
    +    padding: 10px;
    +    margin: -10px;
    +  }
    +  .carousel-caption {
    +    position: static;
    +  }
    +}
    +
    +@media (max-width: 979px) {
    +  body {
    +    padding-top: 0;
    +  }
    +  .navbar-fixed-top,
    +  .navbar-fixed-bottom {
    +    position: static;
    +  }
    +  .navbar-fixed-top {
    +    margin-bottom: 20px;
    +  }
    +  .navbar-fixed-bottom {
    +    margin-top: 20px;
    +  }
    +  .navbar-fixed-top .navbar-inner,
    +  .navbar-fixed-bottom .navbar-inner {
    +    padding: 5px;
    +  }
    +  .navbar .container {
    +    width: auto;
    +    padding: 0;
    +  }
    +  .navbar .brand {
    +    padding-right: 10px;
    +    padding-left: 10px;
    +    margin: 0 0 0 -5px;
    +  }
    +  .nav-collapse {
    +    clear: both;
    +  }
    +  .nav-collapse .nav {
    +    float: none;
    +    margin: 0 0 10px;
    +  }
    +  .nav-collapse .nav > li {
    +    float: none;
    +  }
    +  .nav-collapse .nav > li > a {
    +    margin-bottom: 2px;
    +  }
    +  .nav-collapse .nav > .divider-vertical {
    +    display: none;
    +  }
    +  .nav-collapse .nav .nav-header {
    +    color: #777777;
    +    text-shadow: none;
    +  }
    +  .nav-collapse .nav > li > a,
    +  .nav-collapse .dropdown-menu a {
    +    padding: 9px 15px;
    +    font-weight: bold;
    +    color: #777777;
    +    -webkit-border-radius: 3px;
    +       -moz-border-radius: 3px;
    +            border-radius: 3px;
    +  }
    +  .nav-collapse .btn {
    +    padding: 4px 10px 4px;
    +    font-weight: normal;
    +    -webkit-border-radius: 4px;
    +       -moz-border-radius: 4px;
    +            border-radius: 4px;
    +  }
    +  .nav-collapse .dropdown-menu li + li a {
    +    margin-bottom: 2px;
    +  }
    +  .nav-collapse .nav > li > a:hover,
    +  .nav-collapse .dropdown-menu a:hover {
    +    background-color: #f2f2f2;
    +  }
    +  .navbar-inverse .nav-collapse .nav > li > a:hover,
    +  .navbar-inverse .nav-collapse .dropdown-menu a:hover {
    +    background-color: #111111;
    +  }
    +  .nav-collapse.in .btn-group {
    +    padding: 0;
    +    margin-top: 5px;
    +  }
    +  .nav-collapse .dropdown-menu {
    +    position: static;
    +    top: auto;
    +    left: auto;
    +    display: block;
    +    float: none;
    +    max-width: none;
    +    padding: 0;
    +    margin: 0 15px;
    +    background-color: transparent;
    +    border: none;
    +    -webkit-border-radius: 0;
    +       -moz-border-radius: 0;
    +            border-radius: 0;
    +    -webkit-box-shadow: none;
    +       -moz-box-shadow: none;
    +            box-shadow: none;
    +  }
    +  .nav-collapse .dropdown-menu:before,
    +  .nav-collapse .dropdown-menu:after {
    +    display: none;
    +  }
    +  .nav-collapse .dropdown-menu .divider {
    +    display: none;
    +  }
    +  .nav-collapse .nav > li > .dropdown-menu:before,
    +  .nav-collapse .nav > li > .dropdown-menu:after {
    +    display: none;
    +  }
    +  .nav-collapse .navbar-form,
    +  .nav-collapse .navbar-search {
    +    float: none;
    +    padding: 10px 15px;
    +    margin: 10px 0;
    +    border-top: 1px solid #f2f2f2;
    +    border-bottom: 1px solid #f2f2f2;
    +    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
    +       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
    +            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
    +  }
    +  .navbar-inverse .nav-collapse .navbar-form,
    +  .navbar-inverse .nav-collapse .navbar-search {
    +    border-top-color: #111111;
    +    border-bottom-color: #111111;
    +  }
    +  .navbar .nav-collapse .nav.pull-right {
    +    float: none;
    +    margin-left: 0;
    +  }
    +  .nav-collapse,
    +  .nav-collapse.collapse {
    +    height: 0;
    +    overflow: hidden;
    +  }
    +  .navbar .btn-navbar {
    +    display: block;
    +  }
    +  .navbar-static .navbar-inner {
    +    padding-right: 10px;
    +    padding-left: 10px;
    +  }
    +}
    +
    +@media (min-width: 980px) {
    +  .nav-collapse.collapse {
    +    height: auto !important;
    +    overflow: visible !important;
    +  }
    +}
    diff --git a/src/main/webapp/plug-in/bootstrap/css/bootstrap-responsive.min.css b/src/main/webapp/plug-in/bootstrap/css/bootstrap-responsive.min.css
    new file mode 100644
    index 00000000..7b0158da
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/css/bootstrap-responsive.min.css
    @@ -0,0 +1,9 @@
    +/*!
    + * Bootstrap Responsive v2.1.1
    + *
    + * Copyright 2012 Twitter, Inc
    + * Licensed under the Apache License v2.0
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Designed and built with all the love in the world @twitter by @mdo and @fat.
    + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade.in{top:auto}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:block;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
    diff --git a/src/main/webapp/plug-in/bootstrap/css/bootstrap.css b/src/main/webapp/plug-in/bootstrap/css/bootstrap.css
    new file mode 100644
    index 00000000..8b4910d8
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/css/bootstrap.css
    @@ -0,0 +1,5774 @@
    +/*!
    + * Bootstrap v2.1.1
    + *
    + * Copyright 2012 Twitter, Inc
    + * Licensed under the Apache License v2.0
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Designed and built with all the love in the world @twitter by @mdo and @fat.
    + */
    +
    +article,
    +aside,
    +details,
    +figcaption,
    +figure,
    +footer,
    +header,
    +hgroup,
    +nav,
    +section {
    +  display: block;
    +}
    +
    +audio,
    +canvas,
    +video {
    +  display: inline-block;
    +  *display: inline;
    +  *zoom: 1;
    +}
    +
    +audio:not([controls]) {
    +  display: none;
    +}
    +
    +html {
    +  font-size: 100%;
    +  -webkit-text-size-adjust: 100%;
    +      -ms-text-size-adjust: 100%;
    +}
    +
    +a:focus {
    +  outline: thin dotted #333;
    +  outline: 5px auto -webkit-focus-ring-color;
    +  outline-offset: -2px;
    +}
    +
    +a:hover,
    +a:active {
    +  outline: 0;
    +}
    +
    +sub,
    +sup {
    +  position: relative;
    +  font-size: 75%;
    +  line-height: 0;
    +  vertical-align: baseline;
    +}
    +
    +sup {
    +  top: -0.5em;
    +}
    +
    +sub {
    +  bottom: -0.25em;
    +}
    +
    +img {
    +  width: auto\9;
    +  height: auto;
    +  max-width: 100%;
    +  vertical-align: middle;
    +  border: 0;
    +  -ms-interpolation-mode: bicubic;
    +}
    +
    +#map_canvas img {
    +  max-width: none;
    +}
    +
    +button,
    +input,
    +select,
    +textarea {
    +  margin: 0;
    +  font-size: 100%;
    +  vertical-align: middle;
    +}
    +
    +button,
    +input {
    +  *overflow: visible;
    +  line-height: normal;
    +}
    +
    +button::-moz-focus-inner,
    +input::-moz-focus-inner {
    +  padding: 0;
    +  border: 0;
    +}
    +
    +button,
    +input[type="button"],
    +input[type="reset"],
    +input[type="submit"] {
    +  cursor: pointer;
    +  -webkit-appearance: button;
    +}
    +
    +input[type="search"] {
    +  -webkit-box-sizing: content-box;
    +     -moz-box-sizing: content-box;
    +          box-sizing: content-box;
    +  -webkit-appearance: textfield;
    +}
    +
    +input[type="search"]::-webkit-search-decoration,
    +input[type="search"]::-webkit-search-cancel-button {
    +  -webkit-appearance: none;
    +}
    +
    +textarea {
    +  overflow: auto;
    +  vertical-align: top;
    +}
    +
    +.clearfix {
    +  *zoom: 1;
    +}
    +
    +.clearfix:before,
    +.clearfix:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.clearfix:after {
    +  clear: both;
    +}
    +
    +.hide-text {
    +  font: 0/0 a;
    +  color: transparent;
    +  text-shadow: none;
    +  background-color: transparent;
    +  border: 0;
    +}
    +
    +.input-block-level {
    +  display: block;
    +  width: 100%;
    +  min-height: 30px;
    +  -webkit-box-sizing: border-box;
    +     -moz-box-sizing: border-box;
    +          box-sizing: border-box;
    +}
    +
    +body {
    +  margin: 0;
    +  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    +  font-size: 14px;
    +  line-height: 20px;
    +  color: #333333;
    +  background-color: #ffffff;
    +}
    +
    +a {
    +  color: #0088cc;
    +  text-decoration: none;
    +}
    +
    +a:hover {
    +  color: #005580;
    +  text-decoration: underline;
    +}
    +
    +.img-rounded {
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +}
    +
    +.img-polaroid {
    +  padding: 4px;
    +  background-color: #fff;
    +  border: 1px solid #ccc;
    +  border: 1px solid rgba(0, 0, 0, 0.2);
    +  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
    +     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
    +          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
    +}
    +
    +.img-circle {
    +  -webkit-border-radius: 500px;
    +     -moz-border-radius: 500px;
    +          border-radius: 500px;
    +}
    +
    +.row {
    +  margin-left: -20px;
    +  *zoom: 1;
    +}
    +
    +.row:before,
    +.row:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.row:after {
    +  clear: both;
    +}
    +
    +[class*="span"] {
    +  float: left;
    +  min-height: 1px;
    +  margin-left: 20px;
    +}
    +
    +.container,
    +.navbar-static-top .container,
    +.navbar-fixed-top .container,
    +.navbar-fixed-bottom .container {
    +  width: 940px;
    +}
    +
    +.span12 {
    +  width: 940px;
    +}
    +
    +.span11 {
    +  width: 860px;
    +}
    +
    +.span10 {
    +  width: 780px;
    +}
    +
    +.span9 {
    +  width: 700px;
    +}
    +
    +.span8 {
    +  width: 620px;
    +}
    +
    +.span7 {
    +  width: 540px;
    +}
    +
    +.span6 {
    +  width: 460px;
    +}
    +
    +.span5 {
    +  width: 380px;
    +}
    +
    +.span4 {
    +  width: 300px;
    +}
    +
    +.span3 {
    +  width: 220px;
    +}
    +
    +.span2 {
    +  width: 140px;
    +}
    +
    +.span1 {
    +  width: 60px;
    +}
    +
    +.offset12 {
    +  margin-left: 980px;
    +}
    +
    +.offset11 {
    +  margin-left: 900px;
    +}
    +
    +.offset10 {
    +  margin-left: 820px;
    +}
    +
    +.offset9 {
    +  margin-left: 740px;
    +}
    +
    +.offset8 {
    +  margin-left: 660px;
    +}
    +
    +.offset7 {
    +  margin-left: 580px;
    +}
    +
    +.offset6 {
    +  margin-left: 500px;
    +}
    +
    +.offset5 {
    +  margin-left: 420px;
    +}
    +
    +.offset4 {
    +  margin-left: 340px;
    +}
    +
    +.offset3 {
    +  margin-left: 260px;
    +}
    +
    +.offset2 {
    +  margin-left: 180px;
    +}
    +
    +.offset1 {
    +  margin-left: 100px;
    +}
    +
    +.row-fluid {
    +  width: 100%;
    +  *zoom: 1;
    +}
    +
    +.row-fluid:before,
    +.row-fluid:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.row-fluid:after {
    +  clear: both;
    +}
    +
    +.row-fluid [class*="span"] {
    +  display: block;
    +  float: left;
    +  width: 100%;
    +  min-height: 30px;
    +  margin-left: 2.127659574468085%;
    +  *margin-left: 2.074468085106383%;
    +  -webkit-box-sizing: border-box;
    +     -moz-box-sizing: border-box;
    +          box-sizing: border-box;
    +}
    +
    +.row-fluid [class*="span"]:first-child {
    +  margin-left: 0;
    +}
    +
    +.row-fluid .span12 {
    +  width: 100%;
    +  *width: 99.94680851063829%;
    +}
    +
    +.row-fluid .span11 {
    +  width: 91.48936170212765%;
    +  *width: 91.43617021276594%;
    +}
    +
    +.row-fluid .span10 {
    +  width: 82.97872340425532%;
    +  *width: 82.92553191489361%;
    +}
    +
    +.row-fluid .span9 {
    +  width: 74.46808510638297%;
    +  *width: 74.41489361702126%;
    +}
    +
    +.row-fluid .span8 {
    +  width: 65.95744680851064%;
    +  *width: 65.90425531914893%;
    +}
    +
    +.row-fluid .span7 {
    +  width: 57.44680851063829%;
    +  *width: 57.39361702127659%;
    +}
    +
    +.row-fluid .span6 {
    +  width: 48.93617021276595%;
    +  *width: 48.88297872340425%;
    +}
    +
    +.row-fluid .span5 {
    +  width: 40.42553191489362%;
    +  *width: 40.37234042553192%;
    +}
    +
    +.row-fluid .span4 {
    +  width: 31.914893617021278%;
    +  *width: 31.861702127659576%;
    +}
    +
    +.row-fluid .span3 {
    +  width: 23.404255319148934%;
    +  *width: 23.351063829787233%;
    +}
    +
    +.row-fluid .span2 {
    +  width: 14.893617021276595%;
    +  *width: 14.840425531914894%;
    +}
    +
    +.row-fluid .span1 {
    +  width: 6.382978723404255%;
    +  *width: 6.329787234042553%;
    +}
    +
    +.row-fluid .offset12 {
    +  margin-left: 104.25531914893617%;
    +  *margin-left: 104.14893617021275%;
    +}
    +
    +.row-fluid .offset12:first-child {
    +  margin-left: 102.12765957446808%;
    +  *margin-left: 102.02127659574467%;
    +}
    +
    +.row-fluid .offset11 {
    +  margin-left: 95.74468085106382%;
    +  *margin-left: 95.6382978723404%;
    +}
    +
    +.row-fluid .offset11:first-child {
    +  margin-left: 93.61702127659574%;
    +  *margin-left: 93.51063829787232%;
    +}
    +
    +.row-fluid .offset10 {
    +  margin-left: 87.23404255319149%;
    +  *margin-left: 87.12765957446807%;
    +}
    +
    +.row-fluid .offset10:first-child {
    +  margin-left: 85.1063829787234%;
    +  *margin-left: 84.99999999999999%;
    +}
    +
    +.row-fluid .offset9 {
    +  margin-left: 78.72340425531914%;
    +  *margin-left: 78.61702127659572%;
    +}
    +
    +.row-fluid .offset9:first-child {
    +  margin-left: 76.59574468085106%;
    +  *margin-left: 76.48936170212764%;
    +}
    +
    +.row-fluid .offset8 {
    +  margin-left: 70.2127659574468%;
    +  *margin-left: 70.10638297872339%;
    +}
    +
    +.row-fluid .offset8:first-child {
    +  margin-left: 68.08510638297872%;
    +  *margin-left: 67.9787234042553%;
    +}
    +
    +.row-fluid .offset7 {
    +  margin-left: 61.70212765957446%;
    +  *margin-left: 61.59574468085106%;
    +}
    +
    +.row-fluid .offset7:first-child {
    +  margin-left: 59.574468085106375%;
    +  *margin-left: 59.46808510638297%;
    +}
    +
    +.row-fluid .offset6 {
    +  margin-left: 53.191489361702125%;
    +  *margin-left: 53.085106382978715%;
    +}
    +
    +.row-fluid .offset6:first-child {
    +  margin-left: 51.063829787234035%;
    +  *margin-left: 50.95744680851063%;
    +}
    +
    +.row-fluid .offset5 {
    +  margin-left: 44.68085106382979%;
    +  *margin-left: 44.57446808510638%;
    +}
    +
    +.row-fluid .offset5:first-child {
    +  margin-left: 42.5531914893617%;
    +  *margin-left: 42.4468085106383%;
    +}
    +
    +.row-fluid .offset4 {
    +  margin-left: 36.170212765957444%;
    +  *margin-left: 36.06382978723405%;
    +}
    +
    +.row-fluid .offset4:first-child {
    +  margin-left: 34.04255319148936%;
    +  *margin-left: 33.93617021276596%;
    +}
    +
    +.row-fluid .offset3 {
    +  margin-left: 27.659574468085104%;
    +  *margin-left: 27.5531914893617%;
    +}
    +
    +.row-fluid .offset3:first-child {
    +  margin-left: 25.53191489361702%;
    +  *margin-left: 25.425531914893618%;
    +}
    +
    +.row-fluid .offset2 {
    +  margin-left: 19.148936170212764%;
    +  *margin-left: 19.04255319148936%;
    +}
    +
    +.row-fluid .offset2:first-child {
    +  margin-left: 17.02127659574468%;
    +  *margin-left: 16.914893617021278%;
    +}
    +
    +.row-fluid .offset1 {
    +  margin-left: 10.638297872340425%;
    +  *margin-left: 10.53191489361702%;
    +}
    +
    +.row-fluid .offset1:first-child {
    +  margin-left: 8.51063829787234%;
    +  *margin-left: 8.404255319148938%;
    +}
    +
    +[class*="span"].hide,
    +.row-fluid [class*="span"].hide {
    +  display: none;
    +}
    +
    +[class*="span"].pull-right,
    +.row-fluid [class*="span"].pull-right {
    +  float: right;
    +}
    +
    +.container {
    +  margin-right: auto;
    +  margin-left: auto;
    +  *zoom: 1;
    +}
    +
    +.container:before,
    +.container:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.container:after {
    +  clear: both;
    +}
    +
    +.container-fluid {
    +  padding-right: 20px;
    +  padding-left: 20px;
    +  *zoom: 1;
    +}
    +
    +.container-fluid:before,
    +.container-fluid:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.container-fluid:after {
    +  clear: both;
    +}
    +
    +p {
    +  margin: 0 0 10px;
    +}
    +
    +.lead {
    +  margin-bottom: 20px;
    +  font-size: 21px;
    +  font-weight: 200;
    +  line-height: 30px;
    +}
    +
    +small {
    +  font-size: 85%;
    +}
    +
    +strong {
    +  font-weight: bold;
    +}
    +
    +em {
    +  font-style: italic;
    +}
    +
    +cite {
    +  font-style: normal;
    +}
    +
    +.muted {
    +  color: #999999;
    +}
    +
    +.text-warning {
    +  color: #c09853;
    +}
    +
    +.text-error {
    +  color: #b94a48;
    +}
    +
    +.text-info {
    +  color: #3a87ad;
    +}
    +
    +.text-success {
    +  color: #468847;
    +}
    +
    +h1,
    +h2,
    +h3,
    +h4,
    +h5,
    +h6 {
    +  margin: 10px 0;
    +  font-family: inherit;
    +  font-weight: bold;
    +  line-height: 1;
    +  color: inherit;
    +  text-rendering: optimizelegibility;
    +}
    +
    +h1 small,
    +h2 small,
    +h3 small,
    +h4 small,
    +h5 small,
    +h6 small {
    +  font-weight: normal;
    +  line-height: 1;
    +  color: #999999;
    +}
    +
    +h1 {
    +  font-size: 36px;
    +  line-height: 40px;
    +}
    +
    +h2 {
    +  font-size: 30px;
    +  line-height: 40px;
    +}
    +
    +h3 {
    +  font-size: 24px;
    +  line-height: 40px;
    +}
    +
    +h4 {
    +  font-size: 18px;
    +  line-height: 20px;
    +}
    +
    +h5 {
    +  font-size: 14px;
    +  line-height: 20px;
    +}
    +
    +h6 {
    +  font-size: 12px;
    +  line-height: 20px;
    +}
    +
    +h1 small {
    +  font-size: 24px;
    +}
    +
    +h2 small {
    +  font-size: 18px;
    +}
    +
    +h3 small {
    +  font-size: 14px;
    +}
    +
    +h4 small {
    +  font-size: 14px;
    +}
    +
    +.page-header {
    +  padding-bottom: 9px;
    +  margin: 20px 0 30px;
    +  border-bottom: 1px solid #eeeeee;
    +}
    +
    +ul,
    +ol {
    +  padding: 0;
    +  margin: 0 0 10px 25px;
    +}
    +
    +ul ul,
    +ul ol,
    +ol ol,
    +ol ul {
    +  margin-bottom: 0;
    +}
    +
    +li {
    +  line-height: 20px;
    +}
    +
    +ul.unstyled,
    +ol.unstyled {
    +  margin-left: 0;
    +  list-style: none;
    +}
    +
    +dl {
    +  margin-bottom: 20px;
    +}
    +
    +dt,
    +dd {
    +  line-height: 20px;
    +}
    +
    +dt {
    +  font-weight: bold;
    +}
    +
    +dd {
    +  margin-left: 10px;
    +}
    +
    +.dl-horizontal {
    +  *zoom: 1;
    +}
    +
    +.dl-horizontal:before,
    +.dl-horizontal:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.dl-horizontal:after {
    +  clear: both;
    +}
    +
    +.dl-horizontal dt {
    +  float: left;
    +  width: 160px;
    +  overflow: hidden;
    +  clear: left;
    +  text-align: right;
    +  text-overflow: ellipsis;
    +  white-space: nowrap;
    +}
    +
    +.dl-horizontal dd {
    +  margin-left: 180px;
    +}
    +
    +hr {
    +  margin: 20px 0;
    +  border: 0;
    +  border-top: 1px solid #eeeeee;
    +  border-bottom: 1px solid #ffffff;
    +}
    +
    +abbr[title] {
    +  cursor: help;
    +  border-bottom: 1px dotted #999999;
    +}
    +
    +abbr.initialism {
    +  font-size: 90%;
    +  text-transform: uppercase;
    +}
    +
    +blockquote {
    +  padding: 0 0 0 15px;
    +  margin: 0 0 20px;
    +  border-left: 5px solid #eeeeee;
    +}
    +
    +blockquote p {
    +  margin-bottom: 0;
    +  font-size: 16px;
    +  font-weight: 300;
    +  line-height: 25px;
    +}
    +
    +blockquote small {
    +  display: block;
    +  line-height: 20px;
    +  color: #999999;
    +}
    +
    +blockquote small:before {
    +  content: '\2014 \00A0';
    +}
    +
    +blockquote.pull-right {
    +  float: right;
    +  padding-right: 15px;
    +  padding-left: 0;
    +  border-right: 5px solid #eeeeee;
    +  border-left: 0;
    +}
    +
    +blockquote.pull-right p,
    +blockquote.pull-right small {
    +  text-align: right;
    +}
    +
    +blockquote.pull-right small:before {
    +  content: '';
    +}
    +
    +blockquote.pull-right small:after {
    +  content: '\00A0 \2014';
    +}
    +
    +q:before,
    +q:after,
    +blockquote:before,
    +blockquote:after {
    +  content: "";
    +}
    +
    +address {
    +  display: block;
    +  margin-bottom: 20px;
    +  font-style: normal;
    +  line-height: 20px;
    +}
    +
    +code,
    +pre {
    +  padding: 0 3px 2px;
    +  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
    +  font-size: 12px;
    +  color: #333333;
    +  -webkit-border-radius: 3px;
    +     -moz-border-radius: 3px;
    +          border-radius: 3px;
    +}
    +
    +code {
    +  padding: 2px 4px;
    +  color: #d14;
    +  background-color: #f7f7f9;
    +  border: 1px solid #e1e1e8;
    +}
    +
    +pre {
    +  display: block;
    +  padding: 9.5px;
    +  margin: 0 0 10px;
    +  font-size: 13px;
    +  line-height: 20px;
    +  word-break: break-all;
    +  word-wrap: break-word;
    +  white-space: pre;
    +  white-space: pre-wrap;
    +  background-color: #f5f5f5;
    +  border: 1px solid #ccc;
    +  border: 1px solid rgba(0, 0, 0, 0.15);
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +pre.prettyprint {
    +  margin-bottom: 20px;
    +}
    +
    +pre code {
    +  padding: 0;
    +  color: inherit;
    +  background-color: transparent;
    +  border: 0;
    +}
    +
    +.pre-scrollable {
    +  max-height: 340px;
    +  overflow-y: scroll;
    +}
    +
    +form {
    +  margin: 0 0 20px;
    +}
    +
    +fieldset {
    +  padding: 0;
    +  margin: 0;
    +  border: 0;
    +}
    +
    +legend {
    +  display: block;
    +  width: 100%;
    +  padding: 0;
    +  margin-bottom: 20px;
    +  font-size: 21px;
    +  line-height: 40px;
    +  color: #333333;
    +  border: 0;
    +  border-bottom: 1px solid #e5e5e5;
    +}
    +
    +legend small {
    +  font-size: 15px;
    +  color: #999999;
    +}
    +
    +label,
    +input,
    +button,
    +select,
    +textarea {
    +  font-size: 14px;
    +  font-weight: normal;
    +  line-height: 20px;
    +}
    +
    +input,
    +button,
    +select,
    +textarea {
    +  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    +}
    +
    +label {
    +  display: block;
    +  margin-bottom: 5px;
    +}
    +
    +select,
    +textarea,
    +input[type="text"],
    +input[type="password"],
    +input[type="datetime"],
    +input[type="datetime-local"],
    +input[type="date"],
    +input[type="month"],
    +input[type="time"],
    +input[type="week"],
    +input[type="number"],
    +input[type="email"],
    +input[type="url"],
    +input[type="search"],
    +input[type="tel"],
    +input[type="color"],
    +.uneditable-input {
    +  display: inline-block;
    +  height: 20px;
    +  padding: 4px 6px;
    +  margin-bottom: 9px;
    +  font-size: 14px;
    +  line-height: 20px;
    +  color: #555555;
    +  -webkit-border-radius: 3px;
    +     -moz-border-radius: 3px;
    +          border-radius: 3px;
    +}
    +
    +input,
    +textarea,
    +.uneditable-input {
    +  width: 206px;
    +}
    +
    +textarea {
    +  height: auto;
    +}
    +
    +textarea,
    +input[type="text"],
    +input[type="password"],
    +input[type="datetime"],
    +input[type="datetime-local"],
    +input[type="date"],
    +input[type="month"],
    +input[type="time"],
    +input[type="week"],
    +input[type="number"],
    +input[type="email"],
    +input[type="url"],
    +input[type="search"],
    +input[type="tel"],
    +input[type="color"],
    +.uneditable-input {
    +  background-color: #ffffff;
    +  border: 1px solid #cccccc;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
    +     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
    +       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
    +          transition: border linear 0.2s, box-shadow linear 0.2s;
    +}
    +
    +textarea:focus,
    +input[type="text"]:focus,
    +input[type="password"]:focus,
    +input[type="datetime"]:focus,
    +input[type="datetime-local"]:focus,
    +input[type="date"]:focus,
    +input[type="month"]:focus,
    +input[type="time"]:focus,
    +input[type="week"]:focus,
    +input[type="number"]:focus,
    +input[type="email"]:focus,
    +input[type="url"]:focus,
    +input[type="search"]:focus,
    +input[type="tel"]:focus,
    +input[type="color"]:focus,
    +.uneditable-input:focus {
    +  border-color: rgba(82, 168, 236, 0.8);
    +  outline: 0;
    +  outline: thin dotted \9;
    +  /* IE6-9 锟斤拷锟斤拷锟斤拷锟斤拷式 */
    +
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +}
    +
    +input[type="radio"],
    +input[type="checkbox"] {
    +  margin: 4px 0 0;
    +  margin-top: 1px \9;
    +  *margin-top: 0;
    +  line-height: normal;
    +  cursor: pointer;
    +}
    +
    +input[type="file"],
    +input[type="image"],
    +input[type="submit"],
    +input[type="reset"],
    +input[type="button"],
    +input[type="radio"],
    +input[type="checkbox"] {
    +  width: auto;
    +}
    +
    +select,
    +input[type="file"] {
    +  height: 30px;
    +  /* In IE7, the height of the select element cannot be changed by height, only font-size */
    +
    +  *margin-top: 4px;
    +  /* For IE7, add top margin to align select with labels */
    +
    +  line-height: 30px;
    +}
    +
    +select {
    +  width: 220px;
    +  background-color: #ffffff;
    +  border: 1px solid #cccccc;
    +}
    +
    +select[multiple],
    +select[size] {
    +  height: auto;
    +}
    +
    +select:focus,
    +input[type="file"]:focus,
    +input[type="radio"]:focus,
    +input[type="checkbox"]:focus {
    +  outline: thin dotted #333;
    +  outline: 5px auto -webkit-focus-ring-color;
    +  outline-offset: -2px;
    +}
    +
    +.uneditable-input,
    +.uneditable-textarea {
    +  color: #999999;
    +  cursor: not-allowed;
    +  background-color: #fcfcfc;
    +  border-color: #cccccc;
    +  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
    +     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
    +          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
    +}
    +
    +.uneditable-input {
    +  overflow: hidden;
    +  white-space: nowrap;
    +}
    +
    +.uneditable-textarea {
    +  width: auto;
    +  height: auto;
    +}
    +
    +input:-moz-placeholder,
    +textarea:-moz-placeholder {
    +  color: #999999;
    +}
    +
    +input:-ms-input-placeholder,
    +textarea:-ms-input-placeholder {
    +  color: #999999;
    +}
    +
    +input::-webkit-input-placeholder,
    +textarea::-webkit-input-placeholder {
    +  color: #999999;
    +}
    +
    +.radio,
    +.checkbox {
    +  min-height: 18px;
    +  padding-left: 18px;
    +}
    +
    +.radio input[type="radio"],
    +.checkbox input[type="checkbox"] {
    +  float: left;
    +  margin-left: -18px;
    +}
    +
    +.controls > .radio:first-child,
    +.controls > .checkbox:first-child {
    +  padding-top: 5px;
    +}
    +
    +.radio.inline,
    +.checkbox.inline {
    +  display: inline-block;
    +  padding-top: 5px;
    +  margin-bottom: 0;
    +  vertical-align: middle;
    +}
    +
    +.radio.inline + .radio.inline,
    +.checkbox.inline + .checkbox.inline {
    +  margin-left: 10px;
    +}
    +
    +.input-mini {
    +  width: 60px;
    +}
    +
    +.input-small {
    +  width: 90px;
    +}
    +
    +.input-medium {
    +  width: 150px;
    +}
    +
    +.input-large {
    +  width: 210px;
    +}
    +
    +.input-xlarge {
    +  width: 270px;
    +}
    +
    +.input-xxlarge {
    +  width: 530px;
    +}
    +
    +input[class*="span"],
    +select[class*="span"],
    +textarea[class*="span"],
    +.uneditable-input[class*="span"],
    +.row-fluid input[class*="span"],
    +.row-fluid select[class*="span"],
    +.row-fluid textarea[class*="span"],
    +.row-fluid .uneditable-input[class*="span"] {
    +  float: none;
    +  margin-left: 0;
    +}
    +
    +.input-append input[class*="span"],
    +.input-append .uneditable-input[class*="span"],
    +.input-prepend input[class*="span"],
    +.input-prepend .uneditable-input[class*="span"],
    +.row-fluid input[class*="span"],
    +.row-fluid select[class*="span"],
    +.row-fluid textarea[class*="span"],
    +.row-fluid .uneditable-input[class*="span"],
    +.row-fluid .input-prepend [class*="span"],
    +.row-fluid .input-append [class*="span"] {
    +  display: inline-block;
    +}
    +
    +input,
    +textarea,
    +.uneditable-input {
    +  margin-left: 0;
    +}
    +
    +.controls-row [class*="span"] + [class*="span"] {
    +  margin-left: 20px;
    +}
    +
    +input.span12,
    +textarea.span12,
    +.uneditable-input.span12 {
    +  width: 926px;
    +}
    +
    +input.span11,
    +textarea.span11,
    +.uneditable-input.span11 {
    +  width: 846px;
    +}
    +
    +input.span10,
    +textarea.span10,
    +.uneditable-input.span10 {
    +  width: 766px;
    +}
    +
    +input.span9,
    +textarea.span9,
    +.uneditable-input.span9 {
    +  width: 686px;
    +}
    +
    +input.span8,
    +textarea.span8,
    +.uneditable-input.span8 {
    +  width: 606px;
    +}
    +
    +input.span7,
    +textarea.span7,
    +.uneditable-input.span7 {
    +  width: 526px;
    +}
    +
    +input.span6,
    +textarea.span6,
    +.uneditable-input.span6 {
    +  width: 446px;
    +}
    +
    +input.span5,
    +textarea.span5,
    +.uneditable-input.span5 {
    +  width: 366px;
    +}
    +
    +input.span4,
    +textarea.span4,
    +.uneditable-input.span4 {
    +  width: 286px;
    +}
    +
    +input.span3,
    +textarea.span3,
    +.uneditable-input.span3 {
    +  width: 206px;
    +}
    +
    +input.span2,
    +textarea.span2,
    +.uneditable-input.span2 {
    +  width: 126px;
    +}
    +
    +input.span1,
    +textarea.span1,
    +.uneditable-input.span1 {
    +  width: 46px;
    +}
    +
    +.controls-row {
    +  *zoom: 1;
    +}
    +
    +.controls-row:before,
    +.controls-row:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.controls-row:after {
    +  clear: both;
    +}
    +
    +.controls-row [class*="span"] {
    +  float: left;
    +}
    +
    +input[disabled],
    +select[disabled],
    +textarea[disabled],
    +input[readonly],
    +select[readonly],
    +textarea[readonly] {
    +  cursor: not-allowed;
    +  background-color: #eeeeee;
    +}
    +
    +input[type="radio"][disabled],
    +input[type="checkbox"][disabled],
    +input[type="radio"][readonly],
    +input[type="checkbox"][readonly] {
    +  background-color: transparent;
    +}
    +
    +.control-group.warning > label,
    +.control-group.warning .help-block,
    +.control-group.warning .help-inline {
    +  color: #c09853;
    +}
    +
    +.control-group.warning .checkbox,
    +.control-group.warning .radio,
    +.control-group.warning input,
    +.control-group.warning select,
    +.control-group.warning textarea {
    +  color: #c09853;
    +}
    +
    +.control-group.warning input,
    +.control-group.warning select,
    +.control-group.warning textarea {
    +  border-color: #c09853;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +}
    +
    +.control-group.warning input:focus,
    +.control-group.warning select:focus,
    +.control-group.warning textarea:focus {
    +  border-color: #a47e3c;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
    +}
    +
    +.control-group.warning .input-prepend .add-on,
    +.control-group.warning .input-append .add-on {
    +  color: #c09853;
    +  background-color: #fcf8e3;
    +  border-color: #c09853;
    +}
    +
    +.control-group.error > label,
    +.control-group.error .help-block,
    +.control-group.error .help-inline {
    +  color: #b94a48;
    +}
    +
    +.control-group.error .checkbox,
    +.control-group.error .radio,
    +.control-group.error input,
    +.control-group.error select,
    +.control-group.error textarea {
    +  color: #b94a48;
    +}
    +
    +.control-group.error input,
    +.control-group.error select,
    +.control-group.error textarea {
    +  border-color: #b94a48;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +}
    +
    +.control-group.error input:focus,
    +.control-group.error select:focus,
    +.control-group.error textarea:focus {
    +  border-color: #953b39;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
    +}
    +
    +.control-group.error .input-prepend .add-on,
    +.control-group.error .input-append .add-on {
    +  color: #b94a48;
    +  background-color: #f2dede;
    +  border-color: #b94a48;
    +}
    +
    +.control-group.success > label,
    +.control-group.success .help-block,
    +.control-group.success .help-inline {
    +  color: #468847;
    +}
    +
    +.control-group.success .checkbox,
    +.control-group.success .radio,
    +.control-group.success input,
    +.control-group.success select,
    +.control-group.success textarea {
    +  color: #468847;
    +}
    +
    +.control-group.success input,
    +.control-group.success select,
    +.control-group.success textarea {
    +  border-color: #468847;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +}
    +
    +.control-group.success input:focus,
    +.control-group.success select:focus,
    +.control-group.success textarea:focus {
    +  border-color: #356635;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
    +}
    +
    +.control-group.success .input-prepend .add-on,
    +.control-group.success .input-append .add-on {
    +  color: #468847;
    +  background-color: #dff0d8;
    +  border-color: #468847;
    +}
    +
    +.control-group.info > label,
    +.control-group.info .help-block,
    +.control-group.info .help-inline {
    +  color: #3a87ad;
    +}
    +
    +.control-group.info .checkbox,
    +.control-group.info .radio,
    +.control-group.info input,
    +.control-group.info select,
    +.control-group.info textarea {
    +  color: #3a87ad;
    +}
    +
    +.control-group.info input,
    +.control-group.info select,
    +.control-group.info textarea {
    +  border-color: #3a87ad;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +}
    +
    +.control-group.info input:focus,
    +.control-group.info select:focus,
    +.control-group.info textarea:focus {
    +  border-color: #2d6987;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
    +}
    +
    +.control-group.info .input-prepend .add-on,
    +.control-group.info .input-append .add-on {
    +  color: #3a87ad;
    +  background-color: #d9edf7;
    +  border-color: #3a87ad;
    +}
    +
    +input:focus:required:invalid,
    +textarea:focus:required:invalid,
    +select:focus:required:invalid {
    +  color: #b94a48;
    +  border-color: #ee5f5b;
    +}
    +
    +input:focus:required:invalid:focus,
    +textarea:focus:required:invalid:focus,
    +select:focus:required:invalid:focus {
    +  border-color: #e9322d;
    +  -webkit-box-shadow: 0 0 6px #f8b9b7;
    +     -moz-box-shadow: 0 0 6px #f8b9b7;
    +          box-shadow: 0 0 6px #f8b9b7;
    +}
    +
    +.form-actions {
    +  padding: 19px 20px 20px;
    +  margin-top: 20px;
    +  margin-bottom: 20px;
    +  background-color: #f5f5f5;
    +  border-top: 1px solid #e5e5e5;
    +  *zoom: 1;
    +}
    +
    +.form-actions:before,
    +.form-actions:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.form-actions:after {
    +  clear: both;
    +}
    +
    +.help-block,
    +.help-inline {
    +  color: #595959;
    +}
    +
    +.help-block {
    +  display: block;
    +  margin-bottom: 10px;
    +}
    +
    +.help-inline {
    +  display: inline-block;
    +  *display: inline;
    +  padding-left: 5px;
    +  vertical-align: middle;
    +  *zoom: 1;
    +}
    +
    +.input-append,
    +.input-prepend {
    +  margin-bottom: 5px;
    +  font-size: 0;
    +  white-space: nowrap;
    +}
    +
    +.input-append input,
    +.input-prepend input,
    +.input-append select,
    +.input-prepend select,
    +.input-append .uneditable-input,
    +.input-prepend .uneditable-input {
    +  position: relative;
    +  margin-bottom: 0;
    +  *margin-left: 0;
    +  font-size: 14px;
    +  vertical-align: top;
    +  -webkit-border-radius: 0 3px 3px 0;
    +     -moz-border-radius: 0 3px 3px 0;
    +          border-radius: 0 3px 3px 0;
    +}
    +
    +.input-append input:focus,
    +.input-prepend input:focus,
    +.input-append select:focus,
    +.input-prepend select:focus,
    +.input-append .uneditable-input:focus,
    +.input-prepend .uneditable-input:focus {
    +  z-index: 2;
    +}
    +
    +.input-append .add-on,
    +.input-prepend .add-on {
    +  display: inline-block;
    +  width: auto;
    +  height: 20px;
    +  min-width: 16px;
    +  padding: 4px 5px;
    +  font-size: 14px;
    +  font-weight: normal;
    +  line-height: 20px;
    +  text-align: center;
    +  text-shadow: 0 1px 0 #ffffff;
    +  background-color: #eeeeee;
    +  border: 1px solid #ccc;
    +}
    +
    +.input-append .add-on,
    +.input-prepend .add-on,
    +.input-append .btn,
    +.input-prepend .btn {
    +  vertical-align: top;
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.input-append .active,
    +.input-prepend .active {
    +  background-color: #a9dba9;
    +  border-color: #46a546;
    +}
    +
    +.input-prepend .add-on,
    +.input-prepend .btn {
    +  margin-right: -1px;
    +}
    +
    +.input-prepend .add-on:first-child,
    +.input-prepend .btn:first-child {
    +  -webkit-border-radius: 3px 0 0 3px;
    +     -moz-border-radius: 3px 0 0 3px;
    +          border-radius: 3px 0 0 3px;
    +}
    +
    +.input-append input,
    +.input-append select,
    +.input-append .uneditable-input {
    +  -webkit-border-radius: 3px 0 0 3px;
    +     -moz-border-radius: 3px 0 0 3px;
    +          border-radius: 3px 0 0 3px;
    +}
    +
    +.input-append .add-on,
    +.input-append .btn {
    +  margin-left: -1px;
    +}
    +
    +.input-append .add-on:last-child,
    +.input-append .btn:last-child {
    +  -webkit-border-radius: 0 3px 3px 0;
    +     -moz-border-radius: 0 3px 3px 0;
    +          border-radius: 0 3px 3px 0;
    +}
    +
    +.input-prepend.input-append input,
    +.input-prepend.input-append select,
    +.input-prepend.input-append .uneditable-input {
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.input-prepend.input-append .add-on:first-child,
    +.input-prepend.input-append .btn:first-child {
    +  margin-right: -1px;
    +  -webkit-border-radius: 3px 0 0 3px;
    +     -moz-border-radius: 3px 0 0 3px;
    +          border-radius: 3px 0 0 3px;
    +}
    +
    +.input-prepend.input-append .add-on:last-child,
    +.input-prepend.input-append .btn:last-child {
    +  margin-left: -1px;
    +  -webkit-border-radius: 0 3px 3px 0;
    +     -moz-border-radius: 0 3px 3px 0;
    +          border-radius: 0 3px 3px 0;
    +}
    +
    +input.search-query {
    +  padding-right: 14px;
    +  padding-right: 4px \9;
    +  padding-left: 14px;
    +  padding-left: 4px \9;
    +  /* IE7-8 doesn't have border-radius, so don't indent the padding */
    +
    +  margin-bottom: 0;
    +  -webkit-border-radius: 15px;
    +     -moz-border-radius: 15px;
    +          border-radius: 15px;
    +}
    +
    +/* Allow for input prepend/append in search forms */
    +
    +.form-search .input-append .search-query,
    +.form-search .input-prepend .search-query {
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.form-search .input-append .search-query {
    +  -webkit-border-radius: 14px 0 0 14px;
    +     -moz-border-radius: 14px 0 0 14px;
    +          border-radius: 14px 0 0 14px;
    +}
    +
    +.form-search .input-append .btn {
    +  -webkit-border-radius: 0 14px 14px 0;
    +     -moz-border-radius: 0 14px 14px 0;
    +          border-radius: 0 14px 14px 0;
    +}
    +
    +.form-search .input-prepend .search-query {
    +  -webkit-border-radius: 0 14px 14px 0;
    +     -moz-border-radius: 0 14px 14px 0;
    +          border-radius: 0 14px 14px 0;
    +}
    +
    +.form-search .input-prepend .btn {
    +  -webkit-border-radius: 14px 0 0 14px;
    +     -moz-border-radius: 14px 0 0 14px;
    +          border-radius: 14px 0 0 14px;
    +}
    +
    +.form-search input,
    +.form-inline input,
    +.form-horizontal input,
    +.form-search textarea,
    +.form-inline textarea,
    +.form-horizontal textarea,
    +.form-search select,
    +.form-inline select,
    +.form-horizontal select,
    +.form-search .help-inline,
    +.form-inline .help-inline,
    +.form-horizontal .help-inline,
    +.form-search .uneditable-input,
    +.form-inline .uneditable-input,
    +.form-horizontal .uneditable-input,
    +.form-search .input-prepend,
    +.form-inline .input-prepend,
    +.form-horizontal .input-prepend,
    +.form-search .input-append,
    +.form-inline .input-append,
    +.form-horizontal .input-append {
    +  display: inline-block;
    +  *display: inline;
    +  margin-bottom: 0;
    +  vertical-align: middle;
    +  *zoom: 1;
    +}
    +
    +.form-search .hide,
    +.form-inline .hide,
    +.form-horizontal .hide {
    +  display: none;
    +}
    +
    +.form-search label,
    +.form-inline label,
    +.form-search .btn-group,
    +.form-inline .btn-group {
    +  display: inline-block;
    +}
    +
    +.form-search .input-append,
    +.form-inline .input-append,
    +.form-search .input-prepend,
    +.form-inline .input-prepend {
    +  margin-bottom: 0;
    +}
    +
    +.form-search .radio,
    +.form-search .checkbox,
    +.form-inline .radio,
    +.form-inline .checkbox {
    +  padding-left: 0;
    +  margin-bottom: 0;
    +  vertical-align: middle;
    +}
    +
    +.form-search .radio input[type="radio"],
    +.form-search .checkbox input[type="checkbox"],
    +.form-inline .radio input[type="radio"],
    +.form-inline .checkbox input[type="checkbox"] {
    +  float: left;
    +  margin-right: 3px;
    +  margin-left: 0;
    +}
    +
    +.control-group {
    +  margin-bottom: 10px;
    +}
    +
    +legend + .control-group {
    +  margin-top: 20px;
    +  -webkit-margin-top-collapse: separate;
    +}
    +
    +.form-horizontal .control-group {
    +  margin-bottom: 20px;
    +  *zoom: 1;
    +}
    +
    +.form-horizontal .control-group:before,
    +.form-horizontal .control-group:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.form-horizontal .control-group:after {
    +  clear: both;
    +}
    +
    +.form-horizontal .control-label {
    +  float: left;
    +  width: 160px;
    +  padding-top: 5px;
    +  text-align: right;
    +}
    +
    +.form-horizontal .controls {
    +  *display: inline-block;
    +  *padding-left: 20px;
    +  margin-left: 180px;
    +  *margin-left: 0;
    +}
    +
    +.form-horizontal .controls:first-child {
    +  *padding-left: 180px;
    +}
    +
    +.form-horizontal .help-block {
    +  margin-bottom: 0;
    +}
    +
    +.form-horizontal input + .help-block,
    +.form-horizontal select + .help-block,
    +.form-horizontal textarea + .help-block {
    +  margin-top: 10px;
    +}
    +
    +.form-horizontal .form-actions {
    +  padding-left: 180px;
    +}
    +
    +table {
    +  max-width: 100%;
    +  background-color: transparent;
    +  border-collapse: collapse;
    +  border-spacing: 0;
    +}
    +
    +.table {
    +  width: 100%;
    +  margin-bottom: 20px;
    +}
    +
    +.table th,
    +.table td {
    +  padding: 8px;
    +  line-height: 20px;
    +  text-align: left;
    +  vertical-align: top;
    +  border-top: 1px solid #dddddd;
    +}
    +
    +.table th {
    +  font-weight: bold;
    +}
    +
    +.table thead th {
    +  vertical-align: bottom;
    +}
    +
    +.table caption + thead tr:first-child th,
    +.table caption + thead tr:first-child td,
    +.table colgroup + thead tr:first-child th,
    +.table colgroup + thead tr:first-child td,
    +.table thead:first-child tr:first-child th,
    +.table thead:first-child tr:first-child td {
    +  border-top: 0;
    +}
    +
    +.table tbody + tbody {
    +  border-top: 2px solid #dddddd;
    +}
    +
    +.table-condensed th,
    +.table-condensed td {
    +  padding: 4px 5px;
    +}
    +
    +.table-bordered {
    +  border: 1px solid #dddddd;
    +  border-collapse: separate;
    +  *border-collapse: collapse;
    +  border-left: 0;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +.table-bordered th,
    +.table-bordered td {
    +  border-left: 1px solid #dddddd;
    +}
    +
    +.table-bordered caption + thead tr:first-child th,
    +.table-bordered caption + tbody tr:first-child th,
    +.table-bordered caption + tbody tr:first-child td,
    +.table-bordered colgroup + thead tr:first-child th,
    +.table-bordered colgroup + tbody tr:first-child th,
    +.table-bordered colgroup + tbody tr:first-child td,
    +.table-bordered thead:first-child tr:first-child th,
    +.table-bordered tbody:first-child tr:first-child th,
    +.table-bordered tbody:first-child tr:first-child td {
    +  border-top: 0;
    +}
    +
    +.table-bordered thead:first-child tr:first-child th:first-child,
    +.table-bordered tbody:first-child tr:first-child td:first-child {
    +  -webkit-border-top-left-radius: 4px;
    +          border-top-left-radius: 4px;
    +  -moz-border-radius-topleft: 4px;
    +}
    +
    +.table-bordered thead:first-child tr:first-child th:last-child,
    +.table-bordered tbody:first-child tr:first-child td:last-child {
    +  -webkit-border-top-right-radius: 4px;
    +          border-top-right-radius: 4px;
    +  -moz-border-radius-topright: 4px;
    +}
    +
    +.table-bordered thead:last-child tr:last-child th:first-child,
    +.table-bordered tbody:last-child tr:last-child td:first-child,
    +.table-bordered tfoot:last-child tr:last-child td:first-child {
    +  -webkit-border-radius: 0 0 0 4px;
    +     -moz-border-radius: 0 0 0 4px;
    +          border-radius: 0 0 0 4px;
    +  -webkit-border-bottom-left-radius: 4px;
    +          border-bottom-left-radius: 4px;
    +  -moz-border-radius-bottomleft: 4px;
    +}
    +
    +.table-bordered thead:last-child tr:last-child th:last-child,
    +.table-bordered tbody:last-child tr:last-child td:last-child,
    +.table-bordered tfoot:last-child tr:last-child td:last-child {
    +  -webkit-border-bottom-right-radius: 4px;
    +          border-bottom-right-radius: 4px;
    +  -moz-border-radius-bottomright: 4px;
    +}
    +
    +.table-bordered caption + thead tr:first-child th:first-child,
    +.table-bordered caption + tbody tr:first-child td:first-child,
    +.table-bordered colgroup + thead tr:first-child th:first-child,
    +.table-bordered colgroup + tbody tr:first-child td:first-child {
    +  -webkit-border-top-left-radius: 4px;
    +          border-top-left-radius: 4px;
    +  -moz-border-radius-topleft: 4px;
    +}
    +
    +.table-bordered caption + thead tr:first-child th:last-child,
    +.table-bordered caption + tbody tr:first-child td:last-child,
    +.table-bordered colgroup + thead tr:first-child th:last-child,
    +.table-bordered colgroup + tbody tr:first-child td:last-child {
    +  -webkit-border-top-right-radius: 4px;
    +          border-top-right-radius: 4px;
    +  -moz-border-radius-topleft: 4px;
    +}
    +
    +.table-striped tbody tr:nth-child(odd) td,
    +.table-striped tbody tr:nth-child(odd) th {
    +  background-color: #f9f9f9;
    +}
    +
    +.table-hover tbody tr:hover td,
    +.table-hover tbody tr:hover th {
    +  background-color: #f5f5f5;
    +}
    +
    +table [class*=span],
    +.row-fluid table [class*=span] {
    +  display: table-cell;
    +  float: none;
    +  margin-left: 0;
    +}
    +
    +.table .span1 {
    +  float: none;
    +  width: 44px;
    +  margin-left: 0;
    +}
    +
    +.table .span2 {
    +  float: none;
    +  width: 124px;
    +  margin-left: 0;
    +}
    +
    +.table .span3 {
    +  float: none;
    +  width: 204px;
    +  margin-left: 0;
    +}
    +
    +.table .span4 {
    +  float: none;
    +  width: 284px;
    +  margin-left: 0;
    +}
    +
    +.table .span5 {
    +  float: none;
    +  width: 364px;
    +  margin-left: 0;
    +}
    +
    +.table .span6 {
    +  float: none;
    +  width: 444px;
    +  margin-left: 0;
    +}
    +
    +.table .span7 {
    +  float: none;
    +  width: 524px;
    +  margin-left: 0;
    +}
    +
    +.table .span8 {
    +  float: none;
    +  width: 604px;
    +  margin-left: 0;
    +}
    +
    +.table .span9 {
    +  float: none;
    +  width: 684px;
    +  margin-left: 0;
    +}
    +
    +.table .span10 {
    +  float: none;
    +  width: 764px;
    +  margin-left: 0;
    +}
    +
    +.table .span11 {
    +  float: none;
    +  width: 844px;
    +  margin-left: 0;
    +}
    +
    +.table .span12 {
    +  float: none;
    +  width: 924px;
    +  margin-left: 0;
    +}
    +
    +.table .span13 {
    +  float: none;
    +  width: 1004px;
    +  margin-left: 0;
    +}
    +
    +.table .span14 {
    +  float: none;
    +  width: 1084px;
    +  margin-left: 0;
    +}
    +
    +.table .span15 {
    +  float: none;
    +  width: 1164px;
    +  margin-left: 0;
    +}
    +
    +.table .span16 {
    +  float: none;
    +  width: 1244px;
    +  margin-left: 0;
    +}
    +
    +.table .span17 {
    +  float: none;
    +  width: 1324px;
    +  margin-left: 0;
    +}
    +
    +.table .span18 {
    +  float: none;
    +  width: 1404px;
    +  margin-left: 0;
    +}
    +
    +.table .span19 {
    +  float: none;
    +  width: 1484px;
    +  margin-left: 0;
    +}
    +
    +.table .span20 {
    +  float: none;
    +  width: 1564px;
    +  margin-left: 0;
    +}
    +
    +.table .span21 {
    +  float: none;
    +  width: 1644px;
    +  margin-left: 0;
    +}
    +
    +.table .span22 {
    +  float: none;
    +  width: 1724px;
    +  margin-left: 0;
    +}
    +
    +.table .span23 {
    +  float: none;
    +  width: 1804px;
    +  margin-left: 0;
    +}
    +
    +.table .span24 {
    +  float: none;
    +  width: 1884px;
    +  margin-left: 0;
    +}
    +
    +.table tbody tr.success td {
    +  background-color: #dff0d8;
    +}
    +
    +.table tbody tr.error td {
    +  background-color: #f2dede;
    +}
    +
    +.table tbody tr.warning td {
    +  background-color: #fcf8e3;
    +}
    +
    +.table tbody tr.info td {
    +  background-color: #d9edf7;
    +}
    +
    +.table-hover tbody tr.success:hover td {
    +  background-color: #d0e9c6;
    +}
    +
    +.table-hover tbody tr.error:hover td {
    +  background-color: #ebcccc;
    +}
    +
    +.table-hover tbody tr.warning:hover td {
    +  background-color: #faf2cc;
    +}
    +
    +.table-hover tbody tr.info:hover td {
    +  background-color: #c4e3f3;
    +}
    +/**
    +[class^="icon-"],
    +[class*=" icon-"] {
    +  display: inline-block;
    +  width: 14px;
    +  height: 14px;
    +  margin-top: 1px;
    +  *margin-right: .3em;
    +  line-height: 14px;
    +  vertical-align: text-top;
    +  background-image: url("../img/glyphicons-halflings.png");
    +  background-position: 14px 14px;
    +  background-repeat: no-repeat;
    +}
    +*/
    +/* White icons with optional class, or on hover/active states of certain elements */
    +
    +.icon-white,
    +.nav-tabs > .active > a > [class^="icon-"],
    +.nav-tabs > .active > a > [class*=" icon-"],
    +.nav-pills > .active > a > [class^="icon-"],
    +.nav-pills > .active > a > [class*=" icon-"],
    +.nav-list > .active > a > [class^="icon-"],
    +.nav-list > .active > a > [class*=" icon-"],
    +.navbar-inverse .nav > .active > a > [class^="icon-"],
    +.navbar-inverse .nav > .active > a > [class*=" icon-"],
    +.dropdown-menu > li > a:hover > [class^="icon-"],
    +.dropdown-menu > li > a:hover > [class*=" icon-"],
    +.dropdown-menu > .active > a > [class^="icon-"],
    +.dropdown-menu > .active > a > [class*=" icon-"] {
    +  background-image: url("../img/glyphicons-halflings-white.png");
    +}
    +
    +.icon-glass {
    +  background-position: 0      0;
    +}
    +
    +.icon-music {
    +  background-position: -24px 0;
    +}
    +
    +.icon-search {
    +  background-position: -48px 0;
    +}
    +
    +.icon-envelope {
    +  background-position: -72px 0;
    +}
    +
    +.icon-heart {
    +  background-position: -96px 0;
    +}
    +
    +.icon-star {
    +  background-position: -120px 0;
    +}
    +
    +.icon-star-empty {
    +  background-position: -144px 0;
    +}
    +
    +.icon-user {
    +  background-position: -168px 0;
    +}
    +
    +.icon-film {
    +  background-position: -192px 0;
    +}
    +
    +.icon-th-large {
    +  background-position: -216px 0;
    +}
    +
    +.icon-th {
    +  background-position: -240px 0;
    +}
    +
    +.icon-th-list {
    +  background-position: -264px 0;
    +}
    +
    +.icon-ok {
    +  background-position: -288px 0;
    +}
    +
    +.icon-remove {
    +  background-position: -312px 0;
    +}
    +
    +.icon-zoom-in {
    +  background-position: -336px 0;
    +}
    +
    +.icon-zoom-out {
    +  background-position: -360px 0;
    +}
    +
    +.icon-off {
    +  background-position: -384px 0;
    +}
    +
    +.icon-signal {
    +  background-position: -408px 0;
    +}
    +
    +.icon-cog {
    +  background-position: -432px 0;
    +}
    +
    +.icon-trash {
    +  background-position: -456px 0;
    +}
    +
    +.icon-home {
    +  background-position: 0 -24px;
    +}
    +
    +.icon-file {
    +  background-position: -24px -24px;
    +}
    +
    +.icon-time {
    +  background-position: -48px -24px;
    +}
    +
    +.icon-road {
    +  background-position: -72px -24px;
    +}
    +
    +.icon-download-alt {
    +  background-position: -96px -24px;
    +}
    +
    +.icon-download {
    +  background-position: -120px -24px;
    +}
    +
    +.icon-upload {
    +  background-position: -144px -24px;
    +}
    +
    +.icon-inbox {
    +  background-position: -168px -24px;
    +}
    +
    +.icon-play-circle {
    +  background-position: -192px -24px;
    +}
    +
    +.icon-repeat {
    +  background-position: -216px -24px;
    +}
    +
    +.icon-refresh {
    +  background-position: -240px -24px;
    +}
    +
    +.icon-list-alt {
    +  background-position: -264px -24px;
    +}
    +
    +.icon-lock {
    +  background-position: -287px -24px;
    +}
    +
    +.icon-flag {
    +  background-position: -312px -24px;
    +}
    +
    +.icon-headphones {
    +  background-position: -336px -24px;
    +}
    +
    +.icon-volume-off {
    +  background-position: -360px -24px;
    +}
    +
    +.icon-volume-down {
    +  background-position: -384px -24px;
    +}
    +
    +.icon-volume-up {
    +  background-position: -408px -24px;
    +}
    +
    +.icon-qrcode {
    +  background-position: -432px -24px;
    +}
    +
    +.icon-barcode {
    +  background-position: -456px -24px;
    +}
    +
    +.icon-tag {
    +  background-position: 0 -48px;
    +}
    +
    +.icon-tags {
    +  background-position: -25px -48px;
    +}
    +
    +.icon-book {
    +  background-position: -48px -48px;
    +}
    +
    +.icon-bookmark {
    +  background-position: -72px -48px;
    +}
    +
    +.icon-print {
    +  background-position: -96px -48px;
    +}
    +
    +.icon-camera {
    +  background-position: -120px -48px;
    +}
    +
    +.icon-font {
    +  background-position: -144px -48px;
    +}
    +
    +.icon-bold {
    +  background-position: -167px -48px;
    +}
    +
    +.icon-italic {
    +  background-position: -192px -48px;
    +}
    +
    +.icon-text-height {
    +  background-position: -216px -48px;
    +}
    +
    +.icon-text-width {
    +  background-position: -240px -48px;
    +}
    +
    +.icon-align-left {
    +  background-position: -264px -48px;
    +}
    +
    +.icon-align-center {
    +  background-position: -288px -48px;
    +}
    +
    +.icon-align-right {
    +  background-position: -312px -48px;
    +}
    +
    +.icon-align-justify {
    +  background-position: -336px -48px;
    +}
    +
    +.icon-list {
    +  background-position: -360px -48px;
    +}
    +
    +.icon-indent-left {
    +  background-position: -384px -48px;
    +}
    +
    +.icon-indent-right {
    +  background-position: -408px -48px;
    +}
    +
    +.icon-facetime-video {
    +  background-position: -432px -48px;
    +}
    +
    +.icon-picture {
    +  background-position: -456px -48px;
    +}
    +
    +.icon-pencil {
    +  background-position: 0 -72px;
    +}
    +
    +.icon-map-marker {
    +  background-position: -24px -72px;
    +}
    +
    +.icon-adjust {
    +  background-position: -48px -72px;
    +}
    +
    +.icon-tint {
    +  background-position: -72px -72px;
    +}
    +
    +.icon-edit {
    +  background-position: -96px -72px;
    +}
    +
    +.icon-share {
    +  background-position: -120px -72px;
    +}
    +
    +.icon-check {
    +  background-position: -144px -72px;
    +}
    +
    +.icon-move {
    +  background-position: -168px -72px;
    +}
    +
    +.icon-step-backward {
    +  background-position: -192px -72px;
    +}
    +
    +.icon-fast-backward {
    +  background-position: -216px -72px;
    +}
    +
    +.icon-backward {
    +  background-position: -240px -72px;
    +}
    +
    +.icon-play {
    +  background-position: -264px -72px;
    +}
    +
    +.icon-pause {
    +  background-position: -288px -72px;
    +}
    +
    +.icon-stop {
    +  background-position: -312px -72px;
    +}
    +
    +.icon-forward {
    +  background-position: -336px -72px;
    +}
    +
    +.icon-fast-forward {
    +  background-position: -360px -72px;
    +}
    +
    +.icon-step-forward {
    +  background-position: -384px -72px;
    +}
    +
    +.icon-eject {
    +  background-position: -408px -72px;
    +}
    +
    +.icon-chevron-left {
    +  background-position: -432px -72px;
    +}
    +
    +.icon-chevron-right {
    +  background-position: -456px -72px;
    +}
    +
    +.icon-plus-sign {
    +  background-position: 0 -96px;
    +}
    +
    +.icon-minus-sign {
    +  background-position: -24px -96px;
    +}
    +
    +.icon-remove-sign {
    +  background-position: -48px -96px;
    +}
    +
    +.icon-ok-sign {
    +  background-position: -72px -96px;
    +}
    +
    +.icon-question-sign {
    +  background-position: -96px -96px;
    +}
    +
    +.icon-info-sign {
    +  background-position: -120px -96px;
    +}
    +
    +.icon-screenshot {
    +  background-position: -144px -96px;
    +}
    +
    +.icon-remove-circle {
    +  background-position: -168px -96px;
    +}
    +
    +.icon-ok-circle {
    +  background-position: -192px -96px;
    +}
    +
    +.icon-ban-circle {
    +  background-position: -216px -96px;
    +}
    +
    +.icon-arrow-left {
    +  background-position: -240px -96px;
    +}
    +
    +.icon-arrow-right {
    +  background-position: -264px -96px;
    +}
    +
    +.icon-arrow-up {
    +  background-position: -289px -96px;
    +}
    +
    +.icon-arrow-down {
    +  background-position: -312px -96px;
    +}
    +
    +.icon-share-alt {
    +  background-position: -336px -96px;
    +}
    +
    +.icon-resize-full {
    +  background-position: -360px -96px;
    +}
    +
    +.icon-resize-small {
    +  background-position: -384px -96px;
    +}
    +
    +.icon-plus {
    +  background-position: -408px -96px;
    +}
    +
    +.icon-minus {
    +  background-position: -433px -96px;
    +}
    +
    +.icon-asterisk {
    +  background-position: -456px -96px;
    +}
    +
    +.icon-exclamation-sign {
    +  background-position: 0 -120px;
    +}
    +
    +.icon-gift {
    +  background-position: -24px -120px;
    +}
    +
    +.icon-leaf {
    +  background-position: -48px -120px;
    +}
    +
    +.icon-fire {
    +  background-position: -72px -120px;
    +}
    +
    +.icon-eye-open {
    +  background-position: -96px -120px;
    +}
    +
    +.icon-eye-close {
    +  background-position: -120px -120px;
    +}
    +
    +.icon-warning-sign {
    +  background-position: -144px -120px;
    +}
    +
    +.icon-plane {
    +  background-position: -168px -120px;
    +}
    +
    +.icon-calendar {
    +  background-position: -192px -120px;
    +}
    +
    +.icon-random {
    +  width: 16px;
    +  background-position: -216px -120px;
    +}
    +
    +.icon-comment {
    +  background-position: -240px -120px;
    +}
    +
    +.icon-magnet {
    +  background-position: -264px -120px;
    +}
    +
    +.icon-chevron-up {
    +  background-position: -288px -120px;
    +}
    +
    +.icon-chevron-down {
    +  background-position: -313px -119px;
    +}
    +
    +.icon-retweet {
    +  background-position: -336px -120px;
    +}
    +
    +.icon-shopping-cart {
    +  background-position: -360px -120px;
    +}
    +
    +.icon-folder-close {
    +  background-position: -384px -120px;
    +}
    +
    +.icon-folder-open {
    +  width: 16px;
    +  background-position: -408px -120px;
    +}
    +
    +.icon-resize-vertical {
    +  background-position: -432px -119px;
    +}
    +
    +.icon-resize-horizontal {
    +  background-position: -456px -118px;
    +}
    +
    +.icon-hdd {
    +  background-position: 0 -144px;
    +}
    +
    +.icon-bullhorn {
    +  background-position: -24px -144px;
    +}
    +
    +.icon-bell {
    +  background-position: -48px -144px;
    +}
    +
    +.icon-certificate {
    +  background-position: -72px -144px;
    +}
    +
    +.icon-thumbs-up {
    +  background-position: -96px -144px;
    +}
    +
    +.icon-thumbs-down {
    +  background-position: -120px -144px;
    +}
    +
    +.icon-hand-right {
    +  background-position: -144px -144px;
    +}
    +
    +.icon-hand-left {
    +  background-position: -168px -144px;
    +}
    +
    +.icon-hand-up {
    +  background-position: -192px -144px;
    +}
    +
    +.icon-hand-down {
    +  background-position: -216px -144px;
    +}
    +
    +.icon-circle-arrow-right {
    +  background-position: -240px -144px;
    +}
    +
    +.icon-circle-arrow-left {
    +  background-position: -264px -144px;
    +}
    +
    +.icon-circle-arrow-up {
    +  background-position: -288px -144px;
    +}
    +
    +.icon-circle-arrow-down {
    +  background-position: -312px -144px;
    +}
    +
    +.icon-globe {
    +  background-position: -336px -144px;
    +}
    +
    +.icon-wrench {
    +  background-position: -360px -144px;
    +}
    +
    +.icon-tasks {
    +  background-position: -384px -144px;
    +}
    +
    +.icon-filter {
    +  background-position: -408px -144px;
    +}
    +
    +.icon-briefcase {
    +  background-position: -432px -144px;
    +}
    +
    +.icon-fullscreen {
    +  background-position: -456px -144px;
    +}
    +
    +.dropup,
    +.dropdown {
    +  position: relative;
    +}
    +
    +.dropdown-toggle {
    +  *margin-bottom: -3px;
    +}
    +
    +.dropdown-toggle:active,
    +.open .dropdown-toggle {
    +  outline: 0;
    +}
    +
    +.caret {
    +  display: inline-block;
    +  width: 0;
    +  height: 0;
    +  vertical-align: top;
    +  border-top: 4px solid #000000;
    +  border-right: 4px solid transparent;
    +  border-left: 4px solid transparent;
    +  content: "";
    +}
    +
    +.dropdown .caret {
    +  margin-top: 8px;
    +  margin-left: 2px;
    +}
    +
    +.dropdown-menu {
    +  position: absolute;
    +  top: 100%;
    +  left: 0;
    +  z-index: 1000;
    +  display: none;
    +  float: left;
    +  min-width: 160px;
    +  padding: 5px 0;
    +  margin: 2px 0 0;
    +  list-style: none;
    +  background-color: #ffffff;
    +  border: 1px solid #ccc;
    +  border: 1px solid rgba(0, 0, 0, 0.2);
    +  *border-right-width: 2px;
    +  *border-bottom-width: 2px;
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    +     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    +          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    +  -webkit-background-clip: padding-box;
    +     -moz-background-clip: padding;
    +          background-clip: padding-box;
    +}
    +
    +.dropdown-menu.pull-right {
    +  right: 0;
    +  left: auto;
    +}
    +
    +.dropdown-menu .divider {
    +  *width: 100%;
    +  height: 1px;
    +  margin: 9px 1px;
    +  *margin: -5px 0 5px;
    +  overflow: hidden;
    +  background-color: #e5e5e5;
    +  border-bottom: 1px solid #ffffff;
    +}
    +
    +.dropdown-menu a {
    +  display: block;
    +  padding: 3px 20px;
    +  clear: both;
    +  font-weight: normal;
    +  line-height: 20px;
    +  color: #333333;
    +  white-space: nowrap;
    +}
    +
    +.dropdown-menu li > a:hover,
    +.dropdown-menu li > a:focus,
    +.dropdown-submenu:hover > a {
    +  color: #ffffff;
    +  text-decoration: none;
    +  background-color: #0088cc;
    +  background-color: #0081c2;
    +  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
    +  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
    +  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
    +  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
    +  background-repeat: repeat-x;
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
    +}
    +
    +.dropdown-menu .active > a,
    +.dropdown-menu .active > a:hover {
    +  color: #ffffff;
    +  text-decoration: none;
    +  background-color: #0088cc;
    +  background-color: #0081c2;
    +  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
    +  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
    +  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
    +  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
    +  background-repeat: repeat-x;
    +  outline: 0;
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
    +}
    +
    +.dropdown-menu .disabled > a,
    +.dropdown-menu .disabled > a:hover {
    +  color: #999999;
    +}
    +
    +.dropdown-menu .disabled > a:hover {
    +  text-decoration: none;
    +  cursor: default;
    +  background-color: transparent;
    +}
    +
    +.open {
    +  *z-index: 1000;
    +}
    +
    +.open > .dropdown-menu {
    +  display: block;
    +}
    +
    +.pull-right > .dropdown-menu {
    +  right: 0;
    +  left: auto;
    +}
    +
    +.dropup .caret,
    +.navbar-fixed-bottom .dropdown .caret {
    +  border-top: 0;
    +  border-bottom: 4px solid #000000;
    +  content: "";
    +}
    +
    +.dropup .dropdown-menu,
    +.navbar-fixed-bottom .dropdown .dropdown-menu {
    +  top: auto;
    +  bottom: 100%;
    +  margin-bottom: 1px;
    +}
    +
    +.dropdown-submenu {
    +  position: relative;
    +}
    +
    +.dropdown-submenu > .dropdown-menu {
    +  top: 0;
    +  left: 100%;
    +  margin-top: -6px;
    +  margin-left: -1px;
    +  -webkit-border-radius: 0 6px 6px 6px;
    +     -moz-border-radius: 0 6px 6px 6px;
    +          border-radius: 0 6px 6px 6px;
    +}
    +
    +.dropdown-submenu:hover > .dropdown-menu {
    +  display: block;
    +}
    +
    +.dropdown-submenu > a:after {
    +  display: block;
    +  float: right;
    +  width: 0;
    +  height: 0;
    +  margin-top: 5px;
    +  margin-right: -10px;
    +  border-color: transparent;
    +  border-left-color: #cccccc;
    +  border-style: solid;
    +  border-width: 5px 0 5px 5px;
    +  content: " ";
    +}
    +
    +.dropdown-submenu:hover > a:after {
    +  border-left-color: #ffffff;
    +}
    +
    +.dropdown .dropdown-menu .nav-header {
    +  padding-right: 20px;
    +  padding-left: 20px;
    +}
    +
    +.typeahead {
    +  margin-top: 2px;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +.well {
    +  min-height: 20px;
    +  padding: 19px;
    +  margin-bottom: 20px;
    +  background-color: #f5f5f5;
    +  border: 1px solid #e3e3e3;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
    +}
    +
    +.well blockquote {
    +  border-color: #ddd;
    +  border-color: rgba(0, 0, 0, 0.15);
    +}
    +
    +.well-large {
    +  padding: 24px;
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +}
    +
    +.well-small {
    +  padding: 9px;
    +  -webkit-border-radius: 3px;
    +     -moz-border-radius: 3px;
    +          border-radius: 3px;
    +}
    +
    +.fade {
    +  opacity: 0;
    +  -webkit-transition: opacity 0.15s linear;
    +     -moz-transition: opacity 0.15s linear;
    +       -o-transition: opacity 0.15s linear;
    +          transition: opacity 0.15s linear;
    +}
    +
    +.fade.in {
    +  opacity: 1;
    +}
    +
    +.collapse {
    +  position: relative;
    +  height: 0;
    +  overflow: hidden;
    +  -webkit-transition: height 0.35s ease;
    +     -moz-transition: height 0.35s ease;
    +       -o-transition: height 0.35s ease;
    +          transition: height 0.35s ease;
    +}
    +
    +.collapse.in {
    +  height: auto;
    +}
    +
    +.close {
    +  float: right;
    +  font-size: 20px;
    +  font-weight: bold;
    +  line-height: 20px;
    +  color: #000000;
    +  text-shadow: 0 1px 0 #ffffff;
    +  opacity: 0.2;
    +  filter: alpha(opacity=20);
    +}
    +
    +.close:hover {
    +  color: #000000;
    +  text-decoration: none;
    +  cursor: pointer;
    +  opacity: 0.4;
    +  filter: alpha(opacity=40);
    +}
    +
    +button.close {
    +  padding: 0;
    +  cursor: pointer;
    +  background: transparent;
    +  border: 0;
    +  -webkit-appearance: none;
    +}
    +
    +.btn {
    +  display: inline-block;
    +  *display: inline;
    +  padding: 4px 14px;
    +  margin-bottom: 0;
    +  *margin-left: .3em;
    +  font-size: 14px;
    +  line-height: 20px;
    +  *line-height: 20px;
    +  color: #333333;
    +  text-align: center;
    +  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
    +  vertical-align: middle;
    +  cursor: pointer;
    +  background-color: #f5f5f5;
    +  *background-color: #e6e6e6;
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
    +  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
    +  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
    +  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
    +  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
    +  background-repeat: repeat-x;
    +  border: 1px solid #bbbbbb;
    +  *border: 0;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
    +  border-bottom-color: #a2a2a2;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
    +  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
    +  *zoom: 1;
    +  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    +     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    +          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    +}
    +
    +.btn:hover,
    +.btn:active,
    +.btn.active,
    +.btn.disabled,
    +.btn[disabled] {
    +  color: #333333;
    +  background-color: #e6e6e6;
    +  *background-color: #d9d9d9;
    +}
    +
    +.btn:active,
    +.btn.active {
    +  background-color: #cccccc \9;
    +}
    +
    +.btn:first-child {
    +  *margin-left: 0;
    +}
    +
    +.btn:hover {
    +  color: #333333;
    +  text-decoration: none;
    +  background-color: #e6e6e6;
    +  *background-color: #d9d9d9;
    +  /* Buttons in IE7 don't get borders, so darken on hover */
    +
    +  background-position: 0 -15px;
    +  -webkit-transition: background-position 0.1s linear;
    +     -moz-transition: background-position 0.1s linear;
    +       -o-transition: background-position 0.1s linear;
    +          transition: background-position 0.1s linear;
    +}
    +
    +.btn:focus {
    +  outline: thin dotted #333;
    +  outline: 5px auto -webkit-focus-ring-color;
    +  outline-offset: -2px;
    +}
    +
    +.btn.active,
    +.btn:active {
    +  background-color: #e6e6e6;
    +  background-color: #d9d9d9 \9;
    +  background-image: none;
    +  outline: 0;
    +  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    +     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    +          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    +}
    +
    +.btn.disabled,
    +.btn[disabled] {
    +  cursor: default;
    +  background-color: #e6e6e6;
    +  background-image: none;
    +  opacity: 0.65;
    +  filter: alpha(opacity=65);
    +  -webkit-box-shadow: none;
    +     -moz-box-shadow: none;
    +          box-shadow: none;
    +}
    +
    +.btn-large {
    +  padding: 9px 14px;
    +  font-size: 16px;
    +  line-height: normal;
    +  -webkit-border-radius: 5px;
    +     -moz-border-radius: 5px;
    +          border-radius: 5px;
    +}
    +
    +.btn-large [class^="icon-"] {
    +  margin-top: 2px;
    +}
    +
    +.btn-small {
    +  padding: 3px 9px;
    +  font-size: 12px;
    +  line-height: 18px;
    +}
    +
    +.btn-small [class^="icon-"] {
    +  margin-top: 0;
    +}
    +
    +.btn-mini {
    +  padding: 2px 6px;
    +  font-size: 11px;
    +  line-height: 17px;
    +}
    +
    +.btn-block {
    +  display: block;
    +  width: 100%;
    +  padding-right: 0;
    +  padding-left: 0;
    +  -webkit-box-sizing: border-box;
    +     -moz-box-sizing: border-box;
    +          box-sizing: border-box;
    +}
    +
    +.btn-block + .btn-block {
    +  margin-top: 5px;
    +}
    +
    +input[type="submit"].btn-block,
    +input[type="reset"].btn-block,
    +input[type="button"].btn-block {
    +  width: 100%;
    +}
    +
    +.btn-primary.active,
    +.btn-warning.active,
    +.btn-danger.active,
    +.btn-success.active,
    +.btn-info.active,
    +.btn-inverse.active {
    +  color: rgba(255, 255, 255, 0.75);
    +}
    +
    +.btn {
    +  border-color: #c5c5c5;
    +  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
    +}
    +
    +.btn-primary {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #006dcc;
    +  *background-color: #0044cc;
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
    +  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
    +  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
    +  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
    +  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
    +  background-repeat: repeat-x;
    +  border-color: #0044cc #0044cc #002a80;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
    +  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
    +}
    +
    +.btn-primary:hover,
    +.btn-primary:active,
    +.btn-primary.active,
    +.btn-primary.disabled,
    +.btn-primary[disabled] {
    +  color: #ffffff;
    +  background-color: #0044cc;
    +  *background-color: #003bb3;
    +}
    +
    +.btn-primary:active,
    +.btn-primary.active {
    +  background-color: #003399 \9;
    +}
    +
    +.btn-warning {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #faa732;
    +  *background-color: #f89406;
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
    +  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
    +  background-image: -o-linear-gradient(top, #fbb450, #f89406);
    +  background-image: linear-gradient(to bottom, #fbb450, #f89406);
    +  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
    +  background-repeat: repeat-x;
    +  border-color: #f89406 #f89406 #ad6704;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
    +  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
    +}
    +
    +.btn-warning:hover,
    +.btn-warning:active,
    +.btn-warning.active,
    +.btn-warning.disabled,
    +.btn-warning[disabled] {
    +  color: #ffffff;
    +  background-color: #f89406;
    +  *background-color: #df8505;
    +}
    +
    +.btn-warning:active,
    +.btn-warning.active {
    +  background-color: #c67605 \9;
    +}
    +
    +.btn-danger {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #da4f49;
    +  *background-color: #bd362f;
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
    +  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
    +  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
    +  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
    +  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
    +  background-repeat: repeat-x;
    +  border-color: #bd362f #bd362f #802420;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
    +  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
    +}
    +
    +.btn-danger:hover,
    +.btn-danger:active,
    +.btn-danger.active,
    +.btn-danger.disabled,
    +.btn-danger[disabled] {
    +  color: #ffffff;
    +  background-color: #bd362f;
    +  *background-color: #a9302a;
    +}
    +
    +.btn-danger:active,
    +.btn-danger.active {
    +  background-color: #942a25 \9;
    +}
    +
    +.btn-success {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #5bb75b;
    +  *background-color: #51a351;
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
    +  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
    +  background-image: -o-linear-gradient(top, #62c462, #51a351);
    +  background-image: linear-gradient(to bottom, #62c462, #51a351);
    +  background-image: -moz-linear-gradient(top, #62c462, #51a351);
    +  background-repeat: repeat-x;
    +  border-color: #51a351 #51a351 #387038;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
    +  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
    +}
    +
    +.btn-success:hover,
    +.btn-success:active,
    +.btn-success.active,
    +.btn-success.disabled,
    +.btn-success[disabled] {
    +  color: #ffffff;
    +  background-color: #51a351;
    +  *background-color: #499249;
    +}
    +
    +.btn-success:active,
    +.btn-success.active {
    +  background-color: #408140 \9;
    +}
    +
    +.btn-info {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #49afcd;
    +  *background-color: #2f96b4;
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
    +  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
    +  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
    +  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
    +  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
    +  background-repeat: repeat-x;
    +  border-color: #2f96b4 #2f96b4 #1f6377;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
    +  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
    +}
    +
    +.btn-info:hover,
    +.btn-info:active,
    +.btn-info.active,
    +.btn-info.disabled,
    +.btn-info[disabled] {
    +  color: #ffffff;
    +  background-color: #2f96b4;
    +  *background-color: #2a85a0;
    +}
    +
    +.btn-info:active,
    +.btn-info.active {
    +  background-color: #24748c \9;
    +}
    +
    +.btn-inverse {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #363636;
    +  *background-color: #222222;
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
    +  background-image: -webkit-linear-gradient(top, #444444, #222222);
    +  background-image: -o-linear-gradient(top, #444444, #222222);
    +  background-image: linear-gradient(to bottom, #444444, #222222);
    +  background-image: -moz-linear-gradient(top, #444444, #222222);
    +  background-repeat: repeat-x;
    +  border-color: #222222 #222222 #000000;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
    +  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
    +}
    +
    +.btn-inverse:hover,
    +.btn-inverse:active,
    +.btn-inverse.active,
    +.btn-inverse.disabled,
    +.btn-inverse[disabled] {
    +  color: #ffffff;
    +  background-color: #222222;
    +  *background-color: #151515;
    +}
    +
    +.btn-inverse:active,
    +.btn-inverse.active {
    +  background-color: #080808 \9;
    +}
    +
    +button.btn,
    +input[type="submit"].btn {
    +  *padding-top: 3px;
    +  *padding-bottom: 3px;
    +}
    +
    +button.btn::-moz-focus-inner,
    +input[type="submit"].btn::-moz-focus-inner {
    +  padding: 0;
    +  border: 0;
    +}
    +
    +button.btn.btn-large,
    +input[type="submit"].btn.btn-large {
    +  *padding-top: 7px;
    +  *padding-bottom: 7px;
    +}
    +
    +button.btn.btn-small,
    +input[type="submit"].btn.btn-small {
    +  *padding-top: 3px;
    +  *padding-bottom: 3px;
    +}
    +
    +button.btn.btn-mini,
    +input[type="submit"].btn.btn-mini {
    +  *padding-top: 1px;
    +  *padding-bottom: 1px;
    +}
    +
    +.btn-link,
    +.btn-link:active,
    +.btn-link[disabled] {
    +  background-color: transparent;
    +  background-image: none;
    +  -webkit-box-shadow: none;
    +     -moz-box-shadow: none;
    +          box-shadow: none;
    +}
    +
    +.btn-link {
    +  color: #0088cc;
    +  cursor: pointer;
    +  border-color: transparent;
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.btn-link:hover {
    +  color: #005580;
    +  text-decoration: underline;
    +  background-color: transparent;
    +}
    +
    +.btn-link[disabled]:hover {
    +  color: #333333;
    +  text-decoration: none;
    +}
    +
    +.btn-group {
    +  position: relative;
    +  *margin-left: .3em;
    +  font-size: 0;
    +  white-space: nowrap;
    +  vertical-align: middle;
    +}
    +
    +.btn-group:first-child {
    +  *margin-left: 0;
    +}
    +
    +.btn-group + .btn-group {
    +  margin-left: 5px;
    +}
    +
    +.btn-toolbar {
    +  margin-top: 10px;
    +  margin-bottom: 10px;
    +  font-size: 0;
    +}
    +
    +.btn-toolbar .btn-group {
    +  display: inline-block;
    +  *display: inline;
    +  /* IE7 inline-block hack */
    +
    +  *zoom: 1;
    +}
    +
    +.btn-toolbar .btn + .btn,
    +.btn-toolbar .btn-group + .btn,
    +.btn-toolbar .btn + .btn-group {
    +  margin-left: 5px;
    +}
    +
    +.btn-group > .btn {
    +  position: relative;
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.btn-group > .btn + .btn {
    +  margin-left: -1px;
    +}
    +
    +.btn-group > .btn,
    +.btn-group > .dropdown-menu {
    +  font-size: 14px;
    +}
    +
    +.btn-group > .btn-mini {
    +  font-size: 11px;
    +}
    +
    +.btn-group > .btn-small {
    +  font-size: 12px;
    +}
    +
    +.btn-group > .btn-large {
    +  font-size: 16px;
    +}
    +
    +.btn-group > .btn:first-child {
    +  margin-left: 0;
    +  -webkit-border-bottom-left-radius: 4px;
    +          border-bottom-left-radius: 4px;
    +  -webkit-border-top-left-radius: 4px;
    +          border-top-left-radius: 4px;
    +  -moz-border-radius-bottomleft: 4px;
    +  -moz-border-radius-topleft: 4px;
    +}
    +
    +.btn-group > .btn:last-child,
    +.btn-group > .dropdown-toggle {
    +  -webkit-border-top-right-radius: 4px;
    +          border-top-right-radius: 4px;
    +  -webkit-border-bottom-right-radius: 4px;
    +          border-bottom-right-radius: 4px;
    +  -moz-border-radius-topright: 4px;
    +  -moz-border-radius-bottomright: 4px;
    +}
    +
    +.btn-group > .btn.large:first-child {
    +  margin-left: 0;
    +  -webkit-border-bottom-left-radius: 6px;
    +          border-bottom-left-radius: 6px;
    +  -webkit-border-top-left-radius: 6px;
    +          border-top-left-radius: 6px;
    +  -moz-border-radius-bottomleft: 6px;
    +  -moz-border-radius-topleft: 6px;
    +}
    +
    +.btn-group > .btn.large:last-child,
    +.btn-group > .large.dropdown-toggle {
    +  -webkit-border-top-right-radius: 6px;
    +          border-top-right-radius: 6px;
    +  -webkit-border-bottom-right-radius: 6px;
    +          border-bottom-right-radius: 6px;
    +  -moz-border-radius-topright: 6px;
    +  -moz-border-radius-bottomright: 6px;
    +}
    +
    +.btn-group > .btn:hover,
    +.btn-group > .btn:focus,
    +.btn-group > .btn:active,
    +.btn-group > .btn.active {
    +  z-index: 2;
    +}
    +
    +.btn-group .dropdown-toggle:active,
    +.btn-group.open .dropdown-toggle {
    +  outline: 0;
    +}
    +
    +.btn-group > .btn + .dropdown-toggle {
    +  *padding-top: 5px;
    +  padding-right: 8px;
    +  *padding-bottom: 5px;
    +  padding-left: 8px;
    +  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    +     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    +          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    +}
    +
    +.btn-group > .btn-mini + .dropdown-toggle {
    +  *padding-top: 2px;
    +  padding-right: 5px;
    +  *padding-bottom: 2px;
    +  padding-left: 5px;
    +}
    +
    +.btn-group > .btn-small + .dropdown-toggle {
    +  *padding-top: 5px;
    +  *padding-bottom: 4px;
    +}
    +
    +.btn-group > .btn-large + .dropdown-toggle {
    +  *padding-top: 7px;
    +  padding-right: 12px;
    +  *padding-bottom: 7px;
    +  padding-left: 12px;
    +}
    +
    +.btn-group.open .dropdown-toggle {
    +  background-image: none;
    +  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    +     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    +          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    +}
    +
    +.btn-group.open .btn.dropdown-toggle {
    +  background-color: #e6e6e6;
    +}
    +
    +.btn-group.open .btn-primary.dropdown-toggle {
    +  background-color: #0044cc;
    +}
    +
    +.btn-group.open .btn-warning.dropdown-toggle {
    +  background-color: #f89406;
    +}
    +
    +.btn-group.open .btn-danger.dropdown-toggle {
    +  background-color: #bd362f;
    +}
    +
    +.btn-group.open .btn-success.dropdown-toggle {
    +  background-color: #51a351;
    +}
    +
    +.btn-group.open .btn-info.dropdown-toggle {
    +  background-color: #2f96b4;
    +}
    +
    +.btn-group.open .btn-inverse.dropdown-toggle {
    +  background-color: #222222;
    +}
    +
    +.btn .caret {
    +  margin-top: 8px;
    +  margin-left: 0;
    +}
    +
    +.btn-mini .caret,
    +.btn-small .caret,
    +.btn-large .caret {
    +  margin-top: 6px;
    +}
    +
    +.btn-large .caret {
    +  border-top-width: 5px;
    +  border-right-width: 5px;
    +  border-left-width: 5px;
    +}
    +
    +.dropup .btn-large .caret {
    +  border-top: 0;
    +  border-bottom: 5px solid #000000;
    +}
    +
    +.btn-primary .caret,
    +.btn-warning .caret,
    +.btn-danger .caret,
    +.btn-info .caret,
    +.btn-success .caret,
    +.btn-inverse .caret {
    +  border-top-color: #ffffff;
    +  border-bottom-color: #ffffff;
    +}
    +
    +.btn-group-vertical {
    +  display: inline-block;
    +  *display: inline;
    +  /* IE7 inline-block hack */
    +
    +  *zoom: 1;
    +}
    +
    +.btn-group-vertical .btn {
    +  display: block;
    +  float: none;
    +  width: 100%;
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.btn-group-vertical .btn + .btn {
    +  margin-top: -1px;
    +  margin-left: 0;
    +}
    +
    +.btn-group-vertical .btn:first-child {
    +  -webkit-border-radius: 4px 4px 0 0;
    +     -moz-border-radius: 4px 4px 0 0;
    +          border-radius: 4px 4px 0 0;
    +}
    +
    +.btn-group-vertical .btn:last-child {
    +  -webkit-border-radius: 0 0 4px 4px;
    +     -moz-border-radius: 0 0 4px 4px;
    +          border-radius: 0 0 4px 4px;
    +}
    +
    +.btn-group-vertical .btn-large:first-child {
    +  -webkit-border-radius: 6px 6px 0 0;
    +     -moz-border-radius: 6px 6px 0 0;
    +          border-radius: 6px 6px 0 0;
    +}
    +
    +.btn-group-vertical .btn-large:last-child {
    +  -webkit-border-radius: 0 0 6px 6px;
    +     -moz-border-radius: 0 0 6px 6px;
    +          border-radius: 0 0 6px 6px;
    +}
    +
    +.alert {
    +  padding: 8px 35px 8px 14px;
    +  margin-bottom: 20px;
    +  color: #c09853;
    +  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
    +  background-color: #fcf8e3;
    +  border: 1px solid #fbeed5;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +.alert h4 {
    +  margin: 0;
    +}
    +
    +.alert .close {
    +  position: relative;
    +  top: -2px;
    +  right: -21px;
    +  line-height: 20px;
    +}
    +
    +.alert-success {
    +  color: #468847;
    +  background-color: #dff0d8;
    +  border-color: #d6e9c6;
    +}
    +
    +.alert-danger,
    +.alert-error {
    +  color: #b94a48;
    +  background-color: #f2dede;
    +  border-color: #eed3d7;
    +}
    +
    +.alert-info {
    +  color: #3a87ad;
    +  background-color: #d9edf7;
    +  border-color: #bce8f1;
    +}
    +
    +.alert-block {
    +  padding-top: 14px;
    +  padding-bottom: 14px;
    +}
    +
    +.alert-block > p,
    +.alert-block > ul {
    +  margin-bottom: 0;
    +}
    +
    +.alert-block p + p {
    +  margin-top: 5px;
    +}
    +
    +.nav {
    +  margin-bottom: 20px;
    +  margin-left: 0;
    +  list-style: none;
    +}
    +
    +.nav > li > a {
    +  display: block;
    +}
    +
    +.nav > li > a:hover {
    +  text-decoration: none;
    +  background-color: #eeeeee;
    +}
    +
    +.nav > .pull-right {
    +  float: right;
    +}
    +
    +.nav-header {
    +  display: block;
    +  padding: 3px 15px;
    +  font-size: 11px;
    +  font-weight: bold;
    +  line-height: 20px;
    +  color: #999999;
    +  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
    +  text-transform: uppercase;
    +}
    +
    +.nav li + .nav-header {
    +  margin-top: 9px;
    +}
    +
    +.nav-list {
    +  padding-right: 15px;
    +  padding-left: 15px;
    +  margin-bottom: 0;
    +}
    +
    +.nav-list > li > a,
    +.nav-list .nav-header {
    +  margin-right: -15px;
    +  margin-left: -15px;
    +  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
    +}
    +
    +.nav-list > li > a {
    +  padding: 3px 15px;
    +}
    +
    +.nav-list > .active > a,
    +.nav-list > .active > a:hover {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
    +  background-color: #0088cc;
    +}
    +
    +.nav-list [class^="icon-"] {
    +  margin-right: 2px;
    +}
    +
    +.nav-list .divider {
    +  *width: 100%;
    +  height: 1px;
    +  margin: 9px 1px;
    +  *margin: -5px 0 5px;
    +  overflow: hidden;
    +  background-color: #e5e5e5;
    +  border-bottom: 1px solid #ffffff;
    +}
    +
    +.nav-tabs,
    +.nav-pills {
    +  *zoom: 1;
    +}
    +
    +.nav-tabs:before,
    +.nav-pills:before,
    +.nav-tabs:after,
    +.nav-pills:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.nav-tabs:after,
    +.nav-pills:after {
    +  clear: both;
    +}
    +
    +.nav-tabs > li,
    +.nav-pills > li {
    +  float: left;
    +}
    +
    +.nav-tabs > li > a,
    +.nav-pills > li > a {
    +  padding-right: 12px;
    +  padding-left: 12px;
    +  margin-right: 2px;
    +  line-height: 14px;
    +}
    +
    +.nav-tabs {
    +  border-bottom: 1px solid #ddd;
    +}
    +
    +.nav-tabs > li {
    +  margin-bottom: -1px;
    +}
    +
    +.nav-tabs > li > a {
    +  padding-top: 8px;
    +  padding-bottom: 8px;
    +  line-height: 20px;
    +  border: 1px solid transparent;
    +  -webkit-border-radius: 4px 4px 0 0;
    +     -moz-border-radius: 4px 4px 0 0;
    +          border-radius: 4px 4px 0 0;
    +}
    +
    +.nav-tabs > li > a:hover {
    +  border-color: #eeeeee #eeeeee #dddddd;
    +}
    +
    +.nav-tabs > .active > a,
    +.nav-tabs > .active > a:hover {
    +  color: #555555;
    +  cursor: default;
    +  background-color: #ffffff;
    +  border: 1px solid #ddd;
    +  border-bottom-color: transparent;
    +}
    +
    +.nav-pills > li > a {
    +  padding-top: 8px;
    +  padding-bottom: 8px;
    +  margin-top: 2px;
    +  margin-bottom: 2px;
    +  -webkit-border-radius: 5px;
    +     -moz-border-radius: 5px;
    +          border-radius: 5px;
    +}
    +
    +.nav-pills > .active > a,
    +.nav-pills > .active > a:hover {
    +  color: #ffffff;
    +  background-color: #0088cc;
    +}
    +
    +.nav-stacked > li {
    +  float: none;
    +}
    +
    +.nav-stacked > li > a {
    +  margin-right: 0;
    +}
    +
    +.nav-tabs.nav-stacked {
    +  border-bottom: 0;
    +}
    +
    +.nav-tabs.nav-stacked > li > a {
    +  border: 1px solid #ddd;
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.nav-tabs.nav-stacked > li:first-child > a {
    +  -webkit-border-top-right-radius: 4px;
    +          border-top-right-radius: 4px;
    +  -webkit-border-top-left-radius: 4px;
    +          border-top-left-radius: 4px;
    +  -moz-border-radius-topright: 4px;
    +  -moz-border-radius-topleft: 4px;
    +}
    +
    +.nav-tabs.nav-stacked > li:last-child > a {
    +  -webkit-border-bottom-right-radius: 4px;
    +          border-bottom-right-radius: 4px;
    +  -webkit-border-bottom-left-radius: 4px;
    +          border-bottom-left-radius: 4px;
    +  -moz-border-radius-bottomright: 4px;
    +  -moz-border-radius-bottomleft: 4px;
    +}
    +
    +.nav-tabs.nav-stacked > li > a:hover {
    +  z-index: 2;
    +  border-color: #ddd;
    +}
    +
    +.nav-pills.nav-stacked > li > a {
    +  margin-bottom: 3px;
    +}
    +
    +.nav-pills.nav-stacked > li:last-child > a {
    +  margin-bottom: 1px;
    +}
    +
    +.nav-tabs .dropdown-menu {
    +  -webkit-border-radius: 0 0 6px 6px;
    +     -moz-border-radius: 0 0 6px 6px;
    +          border-radius: 0 0 6px 6px;
    +}
    +
    +.nav-pills .dropdown-menu {
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +}
    +
    +.nav .dropdown-toggle .caret {
    +  margin-top: 6px;
    +  border-top-color: #0088cc;
    +  border-bottom-color: #0088cc;
    +}
    +
    +.nav .dropdown-toggle:hover .caret {
    +  border-top-color: #005580;
    +  border-bottom-color: #005580;
    +}
    +
    +/* move down carets for tabs */
    +
    +.nav-tabs .dropdown-toggle .caret {
    +  margin-top: 8px;
    +}
    +
    +.nav .active .dropdown-toggle .caret {
    +  border-top-color: #fff;
    +  border-bottom-color: #fff;
    +}
    +
    +.nav-tabs .active .dropdown-toggle .caret {
    +  border-top-color: #555555;
    +  border-bottom-color: #555555;
    +}
    +
    +.nav > .dropdown.active > a:hover {
    +  cursor: pointer;
    +}
    +
    +.nav-tabs .open .dropdown-toggle,
    +.nav-pills .open .dropdown-toggle,
    +.nav > li.dropdown.open.active > a:hover {
    +  color: #ffffff;
    +  background-color: #999999;
    +  border-color: #999999;
    +}
    +
    +.nav li.dropdown.open .caret,
    +.nav li.dropdown.open.active .caret,
    +.nav li.dropdown.open a:hover .caret {
    +  border-top-color: #ffffff;
    +  border-bottom-color: #ffffff;
    +  opacity: 1;
    +  filter: alpha(opacity=100);
    +}
    +
    +.tabs-stacked .open > a:hover {
    +  border-color: #999999;
    +}
    +
    +.tabbable {
    +  *zoom: 1;
    +}
    +
    +.tabbable:before,
    +.tabbable:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.tabbable:after {
    +  clear: both;
    +}
    +
    +.tab-content {
    +  overflow: auto;
    +}
    +
    +.tabs-below > .nav-tabs,
    +.tabs-right > .nav-tabs,
    +.tabs-left > .nav-tabs {
    +  border-bottom: 0;
    +}
    +
    +.tab-content > .tab-pane,
    +.pill-content > .pill-pane {
    +  display: none;
    +}
    +
    +.tab-content > .active,
    +.pill-content > .active {
    +  display: block;
    +}
    +
    +.tabs-below > .nav-tabs {
    +  border-top: 1px solid #ddd;
    +}
    +
    +.tabs-below > .nav-tabs > li {
    +  margin-top: -1px;
    +  margin-bottom: 0;
    +}
    +
    +.tabs-below > .nav-tabs > li > a {
    +  -webkit-border-radius: 0 0 4px 4px;
    +     -moz-border-radius: 0 0 4px 4px;
    +          border-radius: 0 0 4px 4px;
    +}
    +
    +.tabs-below > .nav-tabs > li > a:hover {
    +  border-top-color: #ddd;
    +  border-bottom-color: transparent;
    +}
    +
    +.tabs-below > .nav-tabs > .active > a,
    +.tabs-below > .nav-tabs > .active > a:hover {
    +  border-color: transparent #ddd #ddd #ddd;
    +}
    +
    +.tabs-left > .nav-tabs > li,
    +.tabs-right > .nav-tabs > li {
    +  float: none;
    +}
    +
    +.tabs-left > .nav-tabs > li > a,
    +.tabs-right > .nav-tabs > li > a {
    +  min-width: 74px;
    +  margin-right: 0;
    +  margin-bottom: 3px;
    +}
    +
    +.tabs-left > .nav-tabs {
    +  float: left;
    +  margin-right: 19px;
    +  border-right: 1px solid #ddd;
    +}
    +
    +.tabs-left > .nav-tabs > li > a {
    +  margin-right: -1px;
    +  -webkit-border-radius: 4px 0 0 4px;
    +     -moz-border-radius: 4px 0 0 4px;
    +          border-radius: 4px 0 0 4px;
    +}
    +
    +.tabs-left > .nav-tabs > li > a:hover {
    +  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
    +}
    +
    +.tabs-left > .nav-tabs .active > a,
    +.tabs-left > .nav-tabs .active > a:hover {
    +  border-color: #ddd transparent #ddd #ddd;
    +  *border-right-color: #ffffff;
    +}
    +
    +.tabs-right > .nav-tabs {
    +  float: right;
    +  margin-left: 19px;
    +  border-left: 1px solid #ddd;
    +}
    +
    +.tabs-right > .nav-tabs > li > a {
    +  margin-left: -1px;
    +  -webkit-border-radius: 0 4px 4px 0;
    +     -moz-border-radius: 0 4px 4px 0;
    +          border-radius: 0 4px 4px 0;
    +}
    +
    +.tabs-right > .nav-tabs > li > a:hover {
    +  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
    +}
    +
    +.tabs-right > .nav-tabs .active > a,
    +.tabs-right > .nav-tabs .active > a:hover {
    +  border-color: #ddd #ddd #ddd transparent;
    +  *border-left-color: #ffffff;
    +}
    +
    +.nav > .disabled > a {
    +  color: #999999;
    +}
    +
    +.nav > .disabled > a:hover {
    +  text-decoration: none;
    +  cursor: default;
    +  background-color: transparent;
    +}
    +
    +.navbar {
    +  *position: relative;
    +  *z-index: 2;
    +  margin-bottom: 20px;
    +  overflow: visible;
    +  color: #777777;
    +}
    +
    +.navbar-inner {
    +  min-height: 40px;
    +  padding-right: 20px;
    +  padding-left: 20px;
    +  background-color: #fafafa;
    +  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
    +  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
    +  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
    +  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
    +  background-repeat: repeat-x;
    +  border: 1px solid #d4d4d4;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
    +  *zoom: 1;
    +  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
    +     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
    +          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
    +}
    +
    +.navbar-inner:before,
    +.navbar-inner:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.navbar-inner:after {
    +  clear: both;
    +}
    +
    +.navbar .container {
    +  width: auto;
    +}
    +
    +.nav-collapse.collapse {
    +  height: auto;
    +}
    +
    +.navbar .brand {
    +  display: block;
    +  float: left;
    +  padding: 10px 20px 10px;
    +  margin-left: -20px;
    +  font-size: 20px;
    +  font-weight: 200;
    +  color: #777777;
    +  text-shadow: 0 1px 0 #ffffff;
    +}
    +
    +.navbar .brand:hover {
    +  text-decoration: none;
    +}
    +
    +.navbar-text {
    +  margin-bottom: 0;
    +  line-height: 40px;
    +}
    +
    +.navbar-link {
    +  color: #777777;
    +}
    +
    +.navbar-link:hover {
    +  color: #333333;
    +}
    +
    +.navbar .divider-vertical {
    +  height: 40px;
    +  margin: 0 9px;
    +  border-right: 1px solid #ffffff;
    +  border-left: 1px solid #f2f2f2;
    +}
    +
    +.navbar .btn,
    +.navbar .btn-group {
    +  margin-top: 5px;
    +}
    +
    +.navbar .btn-group .btn,
    +.navbar .input-prepend .btn,
    +.navbar .input-append .btn {
    +  margin-top: 0;
    +}
    +
    +.navbar-form {
    +  margin-bottom: 0;
    +  *zoom: 1;
    +}
    +
    +.navbar-form:before,
    +.navbar-form:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.navbar-form:after {
    +  clear: both;
    +}
    +
    +.navbar-form input,
    +.navbar-form select,
    +.navbar-form .radio,
    +.navbar-form .checkbox {
    +  margin-top: 5px;
    +}
    +
    +.navbar-form input,
    +.navbar-form select,
    +.navbar-form .btn {
    +  display: inline-block;
    +  margin-bottom: 0;
    +}
    +
    +.navbar-form input[type="image"],
    +.navbar-form input[type="checkbox"],
    +.navbar-form input[type="radio"] {
    +  margin-top: 3px;
    +}
    +
    +.navbar-form .input-append,
    +.navbar-form .input-prepend {
    +  margin-top: 6px;
    +  white-space: nowrap;
    +}
    +
    +.navbar-form .input-append input,
    +.navbar-form .input-prepend input {
    +  margin-top: 0;
    +}
    +
    +.navbar-search {
    +  position: relative;
    +  float: left;
    +  margin-top: 5px;
    +  margin-bottom: 0;
    +}
    +
    +.navbar-search .search-query {
    +  padding: 4px 14px;
    +  margin-bottom: 0;
    +  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    +  font-size: 13px;
    +  font-weight: normal;
    +  line-height: 1;
    +  -webkit-border-radius: 15px;
    +     -moz-border-radius: 15px;
    +          border-radius: 15px;
    +}
    +
    +.navbar-static-top {
    +  position: static;
    +  width: 100%;
    +  margin-bottom: 0;
    +}
    +
    +.navbar-static-top .navbar-inner {
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.navbar-fixed-top,
    +.navbar-fixed-bottom {
    +  position: fixed;
    +  right: 0;
    +  left: 0;
    +  z-index: 1030;
    +  margin-bottom: 0;
    +}
    +
    +.navbar-fixed-top .navbar-inner,
    +.navbar-static-top .navbar-inner {
    +  border-width: 0 0 1px;
    +}
    +
    +.navbar-fixed-bottom .navbar-inner {
    +  border-width: 1px 0 0;
    +}
    +
    +.navbar-fixed-top .navbar-inner,
    +.navbar-fixed-bottom .navbar-inner {
    +  padding-right: 0;
    +  padding-left: 0;
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.navbar-static-top .container,
    +.navbar-fixed-top .container,
    +.navbar-fixed-bottom .container {
    +  width: 940px;
    +}
    +
    +.navbar-fixed-top {
    +  top: 0;
    +}
    +
    +.navbar-fixed-top .navbar-inner,
    +.navbar-static-top .navbar-inner {
    +  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
    +     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
    +          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
    +}
    +
    +.navbar-fixed-bottom {
    +  bottom: 0;
    +}
    +
    +.navbar-fixed-bottom .navbar-inner {
    +  -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
    +     -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
    +          box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
    +}
    +
    +.navbar .nav {
    +  position: relative;
    +  left: 0;
    +  display: block;
    +  float: left;
    +  margin: 0 10px 0 0;
    +}
    +
    +.navbar .nav.pull-right {
    +  float: right;
    +  margin-right: 0;
    +}
    +
    +.navbar .nav > li {
    +  float: left;
    +}
    +
    +.navbar .nav > li > a {
    +  float: none;
    +  padding: 10px 15px 10px;
    +  color: #777777;
    +  text-decoration: none;
    +  text-shadow: 0 1px 0 #ffffff;
    +}
    +
    +.navbar .nav .dropdown-toggle .caret {
    +  margin-top: 8px;
    +}
    +
    +.navbar .nav > li > a:focus,
    +.navbar .nav > li > a:hover {
    +  color: #333333;
    +  text-decoration: none;
    +  background-color: transparent;
    +}
    +
    +.navbar .nav > .active > a,
    +.navbar .nav > .active > a:hover,
    +.navbar .nav > .active > a:focus {
    +  color: #555555;
    +  text-decoration: none;
    +  background-color: #e5e5e5;
    +  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
    +     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
    +          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
    +}
    +
    +.navbar .btn-navbar {
    +  display: none;
    +  float: right;
    +  padding: 7px 10px;
    +  margin-right: 5px;
    +  margin-left: 5px;
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #ededed;
    +  *background-color: #e5e5e5;
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
    +  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
    +  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
    +  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
    +  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
    +  background-repeat: repeat-x;
    +  border-color: #e5e5e5 #e5e5e5 #bfbfbf;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
    +  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
    +  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
    +     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
    +          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
    +}
    +
    +.navbar .btn-navbar:hover,
    +.navbar .btn-navbar:active,
    +.navbar .btn-navbar.active,
    +.navbar .btn-navbar.disabled,
    +.navbar .btn-navbar[disabled] {
    +  color: #ffffff;
    +  background-color: #e5e5e5;
    +  *background-color: #d9d9d9;
    +}
    +
    +.navbar .btn-navbar:active,
    +.navbar .btn-navbar.active {
    +  background-color: #cccccc \9;
    +}
    +
    +.navbar .btn-navbar .icon-bar {
    +  display: block;
    +  width: 18px;
    +  height: 2px;
    +  background-color: #f5f5f5;
    +  -webkit-border-radius: 1px;
    +     -moz-border-radius: 1px;
    +          border-radius: 1px;
    +  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
    +     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
    +          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
    +}
    +
    +.btn-navbar .icon-bar + .icon-bar {
    +  margin-top: 3px;
    +}
    +
    +.navbar .nav > li > .dropdown-menu:before {
    +  position: absolute;
    +  top: -7px;
    +  left: 9px;
    +  display: inline-block;
    +  border-right: 7px solid transparent;
    +  border-bottom: 7px solid #ccc;
    +  border-left: 7px solid transparent;
    +  border-bottom-color: rgba(0, 0, 0, 0.2);
    +  content: '';
    +}
    +
    +.navbar .nav > li > .dropdown-menu:after {
    +  position: absolute;
    +  top: -6px;
    +  left: 10px;
    +  display: inline-block;
    +  border-right: 6px solid transparent;
    +  border-bottom: 6px solid #ffffff;
    +  border-left: 6px solid transparent;
    +  content: '';
    +}
    +
    +.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
    +  top: auto;
    +  bottom: -7px;
    +  border-top: 7px solid #ccc;
    +  border-bottom: 0;
    +  border-top-color: rgba(0, 0, 0, 0.2);
    +}
    +
    +.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
    +  top: auto;
    +  bottom: -6px;
    +  border-top: 6px solid #ffffff;
    +  border-bottom: 0;
    +}
    +
    +.navbar .nav li.dropdown.open > .dropdown-toggle,
    +.navbar .nav li.dropdown.active > .dropdown-toggle,
    +.navbar .nav li.dropdown.open.active > .dropdown-toggle {
    +  color: #555555;
    +  background-color: #e5e5e5;
    +}
    +
    +.navbar .nav li.dropdown > .dropdown-toggle .caret {
    +  border-top-color: #777777;
    +  border-bottom-color: #777777;
    +}
    +
    +.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
    +.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
    +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
    +  border-top-color: #555555;
    +  border-bottom-color: #555555;
    +}
    +
    +.navbar .pull-right > li > .dropdown-menu,
    +.navbar .nav > li > .dropdown-menu.pull-right {
    +  right: 0;
    +  left: auto;
    +}
    +
    +.navbar .pull-right > li > .dropdown-menu:before,
    +.navbar .nav > li > .dropdown-menu.pull-right:before {
    +  right: 12px;
    +  left: auto;
    +}
    +
    +.navbar .pull-right > li > .dropdown-menu:after,
    +.navbar .nav > li > .dropdown-menu.pull-right:after {
    +  right: 13px;
    +  left: auto;
    +}
    +
    +.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
    +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
    +  right: 100%;
    +  left: auto;
    +  margin-right: -1px;
    +  margin-left: 0;
    +  -webkit-border-radius: 6px 0 6px 6px;
    +     -moz-border-radius: 6px 0 6px 6px;
    +          border-radius: 6px 0 6px 6px;
    +}
    +
    +.navbar-inverse {
    +  color: #999999;
    +}
    +
    +.navbar-inverse .navbar-inner {
    +  background-color: #1b1b1b;
    +  background-image: -moz-linear-gradient(top, #222222, #111111);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
    +  background-image: -webkit-linear-gradient(top, #222222, #111111);
    +  background-image: -o-linear-gradient(top, #222222, #111111);
    +  background-image: linear-gradient(to bottom, #222222, #111111);
    +  background-repeat: repeat-x;
    +  border-color: #252525;
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
    +}
    +
    +.navbar-inverse .brand,
    +.navbar-inverse .nav > li > a {
    +  color: #999999;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +}
    +
    +.navbar-inverse .brand:hover,
    +.navbar-inverse .nav > li > a:hover {
    +  color: #ffffff;
    +}
    +
    +.navbar-inverse .nav > li > a:focus,
    +.navbar-inverse .nav > li > a:hover {
    +  color: #ffffff;
    +  background-color: transparent;
    +}
    +
    +.navbar-inverse .nav .active > a,
    +.navbar-inverse .nav .active > a:hover,
    +.navbar-inverse .nav .active > a:focus {
    +  color: #ffffff;
    +  background-color: #111111;
    +}
    +
    +.navbar-inverse .navbar-link {
    +  color: #999999;
    +}
    +
    +.navbar-inverse .navbar-link:hover {
    +  color: #ffffff;
    +}
    +
    +.navbar-inverse .divider-vertical {
    +  border-right-color: #222222;
    +  border-left-color: #111111;
    +}
    +
    +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
    +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
    +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
    +  color: #ffffff;
    +  background-color: #111111;
    +}
    +
    +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
    +  border-top-color: #999999;
    +  border-bottom-color: #999999;
    +}
    +
    +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
    +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
    +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
    +  border-top-color: #ffffff;
    +  border-bottom-color: #ffffff;
    +}
    +
    +.navbar-inverse .navbar-search .search-query {
    +  color: #ffffff;
    +  background-color: #515151;
    +  border-color: #111111;
    +  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
    +     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
    +          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
    +  -webkit-transition: none;
    +     -moz-transition: none;
    +       -o-transition: none;
    +          transition: none;
    +}
    +
    +.navbar-inverse .navbar-search .search-query:-moz-placeholder {
    +  color: #cccccc;
    +}
    +
    +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
    +  color: #cccccc;
    +}
    +
    +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
    +  color: #cccccc;
    +}
    +
    +.navbar-inverse .navbar-search .search-query:focus,
    +.navbar-inverse .navbar-search .search-query.focused {
    +  padding: 5px 15px;
    +  color: #333333;
    +  text-shadow: 0 1px 0 #ffffff;
    +  background-color: #ffffff;
    +  border: 0;
    +  outline: 0;
    +  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
    +     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
    +          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
    +}
    +
    +.navbar-inverse .btn-navbar {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #0e0e0e;
    +  *background-color: #040404;
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
    +  background-image: -webkit-linear-gradient(top, #151515, #040404);
    +  background-image: -o-linear-gradient(top, #151515, #040404);
    +  background-image: linear-gradient(to bottom, #151515, #040404);
    +  background-image: -moz-linear-gradient(top, #151515, #040404);
    +  background-repeat: repeat-x;
    +  border-color: #040404 #040404 #000000;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
    +  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
    +}
    +
    +.navbar-inverse .btn-navbar:hover,
    +.navbar-inverse .btn-navbar:active,
    +.navbar-inverse .btn-navbar.active,
    +.navbar-inverse .btn-navbar.disabled,
    +.navbar-inverse .btn-navbar[disabled] {
    +  color: #ffffff;
    +  background-color: #040404;
    +  *background-color: #000000;
    +}
    +
    +.navbar-inverse .btn-navbar:active,
    +.navbar-inverse .btn-navbar.active {
    +  background-color: #000000 \9;
    +}
    +
    +.breadcrumb {
    +  padding: 8px 15px;
    +  margin: 0 0 20px;
    +  list-style: none;
    +  background-color: #f5f5f5;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +.breadcrumb li {
    +  display: inline-block;
    +  *display: inline;
    +  text-shadow: 0 1px 0 #ffffff;
    +  *zoom: 1;
    +}
    +
    +.breadcrumb .divider {
    +  padding: 0 5px;
    +  color: #ccc;
    +}
    +
    +.breadcrumb .active {
    +  color: #999999;
    +}
    +
    +.pagination {
    +  height: 40px;
    +  margin: 20px 0;
    +}
    +
    +.pagination ul {
    +  display: inline-block;
    +  *display: inline;
    +  margin-bottom: 0;
    +  margin-left: 0;
    +  -webkit-border-radius: 3px;
    +     -moz-border-radius: 3px;
    +          border-radius: 3px;
    +  *zoom: 1;
    +  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
    +     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
    +          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
    +}
    +
    +.pagination ul > li {
    +  display: inline;
    +}
    +
    +.pagination ul > li > a,
    +.pagination ul > li > span {
    +  float: left;
    +  padding: 0 14px;
    +  line-height: 38px;
    +  text-decoration: none;
    +  background-color: #ffffff;
    +  border: 1px solid #dddddd;
    +  border-left-width: 0;
    +}
    +
    +.pagination ul > li > a:hover,
    +.pagination ul > .active > a,
    +.pagination ul > .active > span {
    +  background-color: #f5f5f5;
    +}
    +
    +.pagination ul > .active > a,
    +.pagination ul > .active > span {
    +  color: #999999;
    +  cursor: default;
    +}
    +
    +.pagination ul > .disabled > span,
    +.pagination ul > .disabled > a,
    +.pagination ul > .disabled > a:hover {
    +  color: #999999;
    +  cursor: default;
    +  background-color: transparent;
    +}
    +
    +.pagination ul > li:first-child > a,
    +.pagination ul > li:first-child > span {
    +  border-left-width: 1px;
    +  -webkit-border-radius: 3px 0 0 3px;
    +     -moz-border-radius: 3px 0 0 3px;
    +          border-radius: 3px 0 0 3px;
    +}
    +
    +.pagination ul > li:last-child > a,
    +.pagination ul > li:last-child > span {
    +  -webkit-border-radius: 0 3px 3px 0;
    +     -moz-border-radius: 0 3px 3px 0;
    +          border-radius: 0 3px 3px 0;
    +}
    +
    +.pagination-centered {
    +  text-align: center;
    +}
    +
    +.pagination-right {
    +  text-align: right;
    +}
    +
    +.pager {
    +  margin: 20px 0;
    +  text-align: center;
    +  list-style: none;
    +  *zoom: 1;
    +}
    +
    +.pager:before,
    +.pager:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.pager:after {
    +  clear: both;
    +}
    +
    +.pager li {
    +  display: inline;
    +}
    +
    +.pager a,
    +.pager span {
    +  display: inline-block;
    +  padding: 5px 14px;
    +  background-color: #fff;
    +  border: 1px solid #ddd;
    +  -webkit-border-radius: 15px;
    +     -moz-border-radius: 15px;
    +          border-radius: 15px;
    +}
    +
    +.pager a:hover {
    +  text-decoration: none;
    +  background-color: #f5f5f5;
    +}
    +
    +.pager .next a,
    +.pager .next span {
    +  float: right;
    +}
    +
    +.pager .previous a {
    +  float: left;
    +}
    +
    +.pager .disabled a,
    +.pager .disabled a:hover,
    +.pager .disabled span {
    +  color: #999999;
    +  cursor: default;
    +  background-color: #fff;
    +}
    +
    +.modal-open .modal .dropdown-menu {
    +  z-index: 2050;
    +}
    +
    +.modal-open .modal .dropdown.open {
    +  *z-index: 2050;
    +}
    +
    +.modal-open .modal .popover {
    +  z-index: 2060;
    +}
    +
    +.modal-open .modal .tooltip {
    +  z-index: 2080;
    +}
    +
    +.modal-backdrop {
    +  position: fixed;
    +  top: 0;
    +  right: 0;
    +  bottom: 0;
    +  left: 0;
    +  z-index: 1040;
    +  background-color: #000000;
    +}
    +
    +.modal-backdrop.fade {
    +  opacity: 0;
    +}
    +
    +.modal-backdrop,
    +.modal-backdrop.fade.in {
    +  opacity: 0.8;
    +  filter: alpha(opacity=80);
    +}
    +
    +.modal {
    +  position: fixed;
    +  top: 50%;
    +  left: 50%;
    +  z-index: 1050;
    +  width: 560px;
    +  margin: -250px 0 0 -280px;
    +  overflow: auto;
    +  background-color: #ffffff;
    +  border: 1px solid #999;
    +  border: 1px solid rgba(0, 0, 0, 0.3);
    +  *border: 1px solid #999;
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
    +     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
    +          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
    +  -webkit-background-clip: padding-box;
    +     -moz-background-clip: padding-box;
    +          background-clip: padding-box;
    +}
    +
    +.modal.fade {
    +  top: -25%;
    +  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
    +     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
    +       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
    +          transition: opacity 0.3s linear, top 0.3s ease-out;
    +}
    +
    +.modal.fade.in {
    +  top: 50%;
    +}
    +
    +.modal-header {
    +  padding: 9px 15px;
    +  border-bottom: 1px solid #eee;
    +}
    +
    +.modal-header .close {
    +  margin-top: 2px;
    +}
    +
    +.modal-header h3 {
    +  margin: 0;
    +  line-height: 30px;
    +}
    +
    +.modal-body {
    +  max-height: 400px;
    +  padding: 15px;
    +  overflow-y: auto;
    +}
    +
    +.modal-form {
    +  margin-bottom: 0;
    +}
    +
    +.modal-footer {
    +  padding: 14px 15px 15px;
    +  margin-bottom: 0;
    +  text-align: right;
    +  background-color: #f5f5f5;
    +  border-top: 1px solid #ddd;
    +  -webkit-border-radius: 0 0 6px 6px;
    +     -moz-border-radius: 0 0 6px 6px;
    +          border-radius: 0 0 6px 6px;
    +  *zoom: 1;
    +  -webkit-box-shadow: inset 0 1px 0 #ffffff;
    +     -moz-box-shadow: inset 0 1px 0 #ffffff;
    +          box-shadow: inset 0 1px 0 #ffffff;
    +}
    +
    +.modal-footer:before,
    +.modal-footer:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.modal-footer:after {
    +  clear: both;
    +}
    +
    +.modal-footer .btn + .btn {
    +  margin-bottom: 0;
    +  margin-left: 5px;
    +}
    +
    +.modal-footer .btn-group .btn + .btn {
    +  margin-left: -1px;
    +}
    +
    +.tooltip {
    +  position: absolute;
    +  z-index: 1030;
    +  display: block;
    +  padding: 5px;
    +  font-size: 11px;
    +  opacity: 0;
    +  filter: alpha(opacity=0);
    +  visibility: visible;
    +}
    +
    +.tooltip.in {
    +  opacity: 0.8;
    +  filter: alpha(opacity=80);
    +}
    +
    +.tooltip.top {
    +  margin-top: -3px;
    +}
    +
    +.tooltip.right {
    +  margin-left: 3px;
    +}
    +
    +.tooltip.bottom {
    +  margin-top: 3px;
    +}
    +
    +.tooltip.left {
    +  margin-left: -3px;
    +}
    +
    +.tooltip-inner {
    +  max-width: 200px;
    +  padding: 3px 8px;
    +  color: #ffffff;
    +  text-align: center;
    +  text-decoration: none;
    +  background-color: #000000;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +.tooltip-arrow {
    +  position: absolute;
    +  width: 0;
    +  height: 0;
    +  border-color: transparent;
    +  border-style: solid;
    +}
    +
    +.tooltip.top .tooltip-arrow {
    +  bottom: 0;
    +  left: 50%;
    +  margin-left: -5px;
    +  border-top-color: #000000;
    +  border-width: 5px 5px 0;
    +}
    +
    +.tooltip.right .tooltip-arrow {
    +  top: 50%;
    +  left: 0;
    +  margin-top: -5px;
    +  border-right-color: #000000;
    +  border-width: 5px 5px 5px 0;
    +}
    +
    +.tooltip.left .tooltip-arrow {
    +  top: 50%;
    +  right: 0;
    +  margin-top: -5px;
    +  border-left-color: #000000;
    +  border-width: 5px 0 5px 5px;
    +}
    +
    +.tooltip.bottom .tooltip-arrow {
    +  top: 0;
    +  left: 50%;
    +  margin-left: -5px;
    +  border-bottom-color: #000000;
    +  border-width: 0 5px 5px;
    +}
    +
    +.popover {
    +  position: absolute;
    +  top: 0;
    +  left: 0;
    +  z-index: 1010;
    +  display: none;
    +  width: 236px;
    +  padding: 1px;
    +  background-color: #ffffff;
    +  border: 1px solid #ccc;
    +  border: 1px solid rgba(0, 0, 0, 0.2);
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    +     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    +          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    +  -webkit-background-clip: padding-box;
    +     -moz-background-clip: padding;
    +          background-clip: padding-box;
    +}
    +
    +.popover.top {
    +  margin-bottom: 10px;
    +}
    +
    +.popover.right {
    +  margin-left: 10px;
    +}
    +
    +.popover.bottom {
    +  margin-top: 10px;
    +}
    +
    +.popover.left {
    +  margin-right: 10px;
    +}
    +
    +.popover-title {
    +  padding: 8px 14px;
    +  margin: 0;
    +  font-size: 14px;
    +  font-weight: normal;
    +  line-height: 18px;
    +  background-color: #f7f7f7;
    +  border-bottom: 1px solid #ebebeb;
    +  -webkit-border-radius: 5px 5px 0 0;
    +     -moz-border-radius: 5px 5px 0 0;
    +          border-radius: 5px 5px 0 0;
    +}
    +
    +.popover-content {
    +  padding: 9px 14px;
    +}
    +
    +.popover-content p,
    +.popover-content ul,
    +.popover-content ol {
    +  margin-bottom: 0;
    +}
    +
    +.popover .arrow,
    +.popover .arrow:after {
    +  position: absolute;
    +  display: inline-block;
    +  width: 0;
    +  height: 0;
    +  border-color: transparent;
    +  border-style: solid;
    +}
    +
    +.popover .arrow:after {
    +  z-index: -1;
    +  content: "";
    +}
    +
    +.popover.top .arrow {
    +  bottom: -10px;
    +  left: 50%;
    +  margin-left: -10px;
    +  border-top-color: #ffffff;
    +  border-width: 10px 10px 0;
    +}
    +
    +.popover.top .arrow:after {
    +  bottom: -1px;
    +  left: -11px;
    +  border-top-color: rgba(0, 0, 0, 0.25);
    +  border-width: 11px 11px 0;
    +}
    +
    +.popover.right .arrow {
    +  top: 50%;
    +  left: -10px;
    +  margin-top: -10px;
    +  border-right-color: #ffffff;
    +  border-width: 10px 10px 10px 0;
    +}
    +
    +.popover.right .arrow:after {
    +  bottom: -11px;
    +  left: -1px;
    +  border-right-color: rgba(0, 0, 0, 0.25);
    +  border-width: 11px 11px 11px 0;
    +}
    +
    +.popover.bottom .arrow {
    +  top: -10px;
    +  left: 50%;
    +  margin-left: -10px;
    +  border-bottom-color: #ffffff;
    +  border-width: 0 10px 10px;
    +}
    +
    +.popover.bottom .arrow:after {
    +  top: -1px;
    +  left: -11px;
    +  border-bottom-color: rgba(0, 0, 0, 0.25);
    +  border-width: 0 11px 11px;
    +}
    +
    +.popover.left .arrow {
    +  top: 50%;
    +  right: -10px;
    +  margin-top: -10px;
    +  border-left-color: #ffffff;
    +  border-width: 10px 0 10px 10px;
    +}
    +
    +.popover.left .arrow:after {
    +  right: -1px;
    +  bottom: -11px;
    +  border-left-color: rgba(0, 0, 0, 0.25);
    +  border-width: 11px 0 11px 11px;
    +}
    +
    +.thumbnails {
    +  margin-left: -20px;
    +  list-style: none;
    +  *zoom: 1;
    +}
    +
    +.thumbnails:before,
    +.thumbnails:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.thumbnails:after {
    +  clear: both;
    +}
    +
    +.row-fluid .thumbnails {
    +  margin-left: 0;
    +}
    +
    +.thumbnails > li {
    +  float: left;
    +  margin-bottom: 20px;
    +  margin-left: 20px;
    +}
    +
    +.thumbnail {
    +  display: block;
    +  padding: 4px;
    +  line-height: 20px;
    +  border: 1px solid #ddd;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
    +     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
    +          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
    +  -webkit-transition: all 0.2s ease-in-out;
    +     -moz-transition: all 0.2s ease-in-out;
    +       -o-transition: all 0.2s ease-in-out;
    +          transition: all 0.2s ease-in-out;
    +}
    +
    +a.thumbnail:hover {
    +  border-color: #0088cc;
    +  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
    +     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
    +          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
    +}
    +
    +.thumbnail > img {
    +  display: block;
    +  max-width: 100%;
    +  margin-right: auto;
    +  margin-left: auto;
    +}
    +
    +.thumbnail .caption {
    +  padding: 9px;
    +  color: #555555;
    +}
    +
    +.label,
    +.badge {
    +  font-size: 11.844px;
    +  font-weight: bold;
    +  line-height: 14px;
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  white-space: nowrap;
    +  vertical-align: baseline;
    +  background-color: #999999;
    +}
    +
    +.label {
    +  padding: 1px 4px 2px;
    +  -webkit-border-radius: 3px;
    +     -moz-border-radius: 3px;
    +          border-radius: 3px;
    +}
    +
    +.badge {
    +  padding: 1px 9px 2px;
    +  -webkit-border-radius: 9px;
    +     -moz-border-radius: 9px;
    +          border-radius: 9px;
    +}
    +
    +a.label:hover,
    +a.badge:hover {
    +  color: #ffffff;
    +  text-decoration: none;
    +  cursor: pointer;
    +}
    +
    +.label-important,
    +.badge-important {
    +  background-color: #b94a48;
    +}
    +
    +.label-important[href],
    +.badge-important[href] {
    +  background-color: #953b39;
    +}
    +
    +.label-warning,
    +.badge-warning {
    +  background-color: #f89406;
    +}
    +
    +.label-warning[href],
    +.badge-warning[href] {
    +  background-color: #c67605;
    +}
    +
    +.label-success,
    +.badge-success {
    +  background-color: #468847;
    +}
    +
    +.label-success[href],
    +.badge-success[href] {
    +  background-color: #356635;
    +}
    +
    +.label-info,
    +.badge-info {
    +  background-color: #3a87ad;
    +}
    +
    +.label-info[href],
    +.badge-info[href] {
    +  background-color: #2d6987;
    +}
    +
    +.label-inverse,
    +.badge-inverse {
    +  background-color: #333333;
    +}
    +
    +.label-inverse[href],
    +.badge-inverse[href] {
    +  background-color: #1a1a1a;
    +}
    +
    +.btn .label,
    +.btn .badge {
    +  position: relative;
    +  top: -1px;
    +}
    +
    +.btn-mini .label,
    +.btn-mini .badge {
    +  top: 0;
    +}
    +
    +@-webkit-keyframes progress-bar-stripes {
    +  from {
    +    background-position: 40px 0;
    +  }
    +  to {
    +    background-position: 0 0;
    +  }
    +}
    +
    +@-moz-keyframes progress-bar-stripes {
    +  from {
    +    background-position: 40px 0;
    +  }
    +  to {
    +    background-position: 0 0;
    +  }
    +}
    +
    +@-ms-keyframes progress-bar-stripes {
    +  from {
    +    background-position: 40px 0;
    +  }
    +  to {
    +    background-position: 0 0;
    +  }
    +}
    +
    +@-o-keyframes progress-bar-stripes {
    +  from {
    +    background-position: 0 0;
    +  }
    +  to {
    +    background-position: 40px 0;
    +  }
    +}
    +
    +@keyframes progress-bar-stripes {
    +  from {
    +    background-position: 40px 0;
    +  }
    +  to {
    +    background-position: 0 0;
    +  }
    +}
    +
    +.progress {
    +  height: 20px;
    +  margin-bottom: 20px;
    +  overflow: hidden;
    +  background-color: #f7f7f7;
    +  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
    +  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
    +  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
    +  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
    +  background-repeat: repeat-x;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
    +  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
    +     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
    +          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
    +}
    +
    +.progress .bar {
    +  float: left;
    +  width: 0;
    +  height: 100%;
    +  font-size: 12px;
    +  color: #ffffff;
    +  text-align: center;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #0e90d2;
    +  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
    +  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
    +  background-image: -o-linear-gradient(top, #149bdf, #0480be);
    +  background-image: linear-gradient(to bottom, #149bdf, #0480be);
    +  background-repeat: repeat-x;
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
    +  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
    +     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
    +          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
    +  -webkit-box-sizing: border-box;
    +     -moz-box-sizing: border-box;
    +          box-sizing: border-box;
    +  -webkit-transition: width 0.6s ease;
    +     -moz-transition: width 0.6s ease;
    +       -o-transition: width 0.6s ease;
    +          transition: width 0.6s ease;
    +}
    +
    +.progress .bar + .bar {
    +  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
    +     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
    +          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
    +}
    +
    +.progress-striped .bar {
    +  background-color: #149bdf;
    +  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
    +  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  -webkit-background-size: 40px 40px;
    +     -moz-background-size: 40px 40px;
    +       -o-background-size: 40px 40px;
    +          background-size: 40px 40px;
    +}
    +
    +.progress.active .bar {
    +  -webkit-animation: progress-bar-stripes 2s linear infinite;
    +     -moz-animation: progress-bar-stripes 2s linear infinite;
    +      -ms-animation: progress-bar-stripes 2s linear infinite;
    +       -o-animation: progress-bar-stripes 2s linear infinite;
    +          animation: progress-bar-stripes 2s linear infinite;
    +}
    +
    +.progress-danger .bar,
    +.progress .bar-danger {
    +  background-color: #dd514c;
    +  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
    +  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
    +  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
    +  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
    +  background-repeat: repeat-x;
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
    +}
    +
    +.progress-danger.progress-striped .bar,
    +.progress-striped .bar-danger {
    +  background-color: #ee5f5b;
    +  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
    +  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +}
    +
    +.progress-success .bar,
    +.progress .bar-success {
    +  background-color: #5eb95e;
    +  background-image: -moz-linear-gradient(top, #62c462, #57a957);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
    +  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
    +  background-image: -o-linear-gradient(top, #62c462, #57a957);
    +  background-image: linear-gradient(to bottom, #62c462, #57a957);
    +  background-repeat: repeat-x;
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
    +}
    +
    +.progress-success.progress-striped .bar,
    +.progress-striped .bar-success {
    +  background-color: #62c462;
    +  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
    +  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +}
    +
    +.progress-info .bar,
    +.progress .bar-info {
    +  background-color: #4bb1cf;
    +  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
    +  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
    +  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
    +  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
    +  background-repeat: repeat-x;
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
    +}
    +
    +.progress-info.progress-striped .bar,
    +.progress-striped .bar-info {
    +  background-color: #5bc0de;
    +  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
    +  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +}
    +
    +.progress-warning .bar,
    +.progress .bar-warning {
    +  background-color: #faa732;
    +  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
    +  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
    +  background-image: -o-linear-gradient(top, #fbb450, #f89406);
    +  background-image: linear-gradient(to bottom, #fbb450, #f89406);
    +  background-repeat: repeat-x;
    +  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
    +}
    +
    +.progress-warning.progress-striped .bar,
    +.progress-striped .bar-warning {
    +  background-color: #fbb450;
    +  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
    +  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +}
    +
    +.accordion {
    +  margin-bottom: 20px;
    +}
    +
    +.accordion-group {
    +  margin-bottom: 2px;
    +  border: 1px solid #e5e5e5;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +.accordion-heading {
    +  border-bottom: 0;
    +}
    +
    +.accordion-heading .accordion-toggle {
    +  display: block;
    +  padding: 8px 15px;
    +}
    +
    +.accordion-toggle {
    +  cursor: pointer;
    +}
    +
    +.accordion-inner {
    +  padding: 9px 15px;
    +  border-top: 1px solid #e5e5e5;
    +}
    +
    +.carousel {
    +  position: relative;
    +  margin-bottom: 20px;
    +  line-height: 1;
    +}
    +
    +.carousel-inner {
    +  position: relative;
    +  width: 100%;
    +  overflow: hidden;
    +}
    +
    +.carousel .item {
    +  position: relative;
    +  display: none;
    +  -webkit-transition: 0.6s ease-in-out left;
    +     -moz-transition: 0.6s ease-in-out left;
    +       -o-transition: 0.6s ease-in-out left;
    +          transition: 0.6s ease-in-out left;
    +}
    +
    +.carousel .item > img {
    +  display: block;
    +  line-height: 1;
    +}
    +
    +.carousel .active,
    +.carousel .next,
    +.carousel .prev {
    +  display: block;
    +}
    +
    +.carousel .active {
    +  left: 0;
    +}
    +
    +.carousel .next,
    +.carousel .prev {
    +  position: absolute;
    +  top: 0;
    +  width: 100%;
    +}
    +
    +.carousel .next {
    +  left: 100%;
    +}
    +
    +.carousel .prev {
    +  left: -100%;
    +}
    +
    +.carousel .next.left,
    +.carousel .prev.right {
    +  left: 0;
    +}
    +
    +.carousel .active.left {
    +  left: -100%;
    +}
    +
    +.carousel .active.right {
    +  left: 100%;
    +}
    +
    +.carousel-control {
    +  position: absolute;
    +  top: 40%;
    +  left: 15px;
    +  width: 40px;
    +  height: 40px;
    +  margin-top: -20px;
    +  font-size: 60px;
    +  font-weight: 100;
    +  line-height: 30px;
    +  color: #ffffff;
    +  text-align: center;
    +  background: #222222;
    +  border: 3px solid #ffffff;
    +  -webkit-border-radius: 23px;
    +     -moz-border-radius: 23px;
    +          border-radius: 23px;
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +}
    +
    +.carousel-control.right {
    +  right: 15px;
    +  left: auto;
    +}
    +
    +.carousel-control:hover {
    +  color: #ffffff;
    +  text-decoration: none;
    +  opacity: 0.9;
    +  filter: alpha(opacity=90);
    +}
    +
    +.carousel-caption {
    +  position: absolute;
    +  right: 0;
    +  bottom: 0;
    +  left: 0;
    +  padding: 15px;
    +  background: #333333;
    +  background: rgba(0, 0, 0, 0.75);
    +}
    +
    +.carousel-caption h4,
    +.carousel-caption p {
    +  line-height: 20px;
    +  color: #ffffff;
    +}
    +
    +.carousel-caption h4 {
    +  margin: 0 0 5px;
    +}
    +
    +.carousel-caption p {
    +  margin-bottom: 0;
    +}
    +
    +.hero-unit {
    +  padding: 60px;
    +  margin-bottom: 30px;
    +  background-color: #eeeeee;
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +}
    +
    +.hero-unit h1 {
    +  margin-bottom: 0;
    +  font-size: 60px;
    +  line-height: 1;
    +  letter-spacing: -1px;
    +  color: inherit;
    +}
    +
    +.hero-unit p {
    +  font-size: 18px;
    +  font-weight: 200;
    +  line-height: 30px;
    +  color: inherit;
    +}
    +
    +.pull-right {
    +  float: right;
    +}
    +
    +.pull-left {
    +  float: left;
    +}
    +
    +.hide {
    +  display: none;
    +}
    +
    +.show {
    +  display: block;
    +}
    +
    +.invisible {
    +  visibility: hidden;
    +}
    +
    +.affix {
    +  position: fixed;
    +}
    diff --git a/src/main/webapp/plug-in/bootstrap/css/bootstrap.min.css b/src/main/webapp/plug-in/bootstrap/css/bootstrap.min.css
    new file mode 100644
    index 00000000..5e9328d3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/css/bootstrap.min.css
    @@ -0,0 +1,9 @@
    +/*!
    + * Bootstrap v2.1.1
    + *
    + * Copyright 2012 Twitter, Inc
    + * Licensed under the Apache License v2.0
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Designed and built with all the love in the world @twitter by @mdo and @fat.
    + */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}.text-warning{color:#c09853}.text-error{color:#b94a48}.text-info{color:#3a87ad}.text-success{color:#468847}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal;cursor:pointer}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"]{float:left}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info>label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .add-on,.input-append .btn{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0}.table .span1{float:none;width:44px;margin-left:0}.table .span2{float:none;width:124px;margin-left:0}.table .span3{float:none;width:204px;margin-left:0}.table .span4{float:none;width:284px;margin-left:0}.table .span5{float:none;width:364px;margin-left:0}.table .span6{float:none;width:444px;margin-left:0}.table .span7{float:none;width:524px;margin-left:0}.table .span8{float:none;width:604px;margin-left:0}.table .span9{float:none;width:684px;margin-left:0}.table .span10{float:none;width:764px;margin-left:0}.table .span11{float:none;width:844px;margin-left:0}.table .span12{float:none;width:924px;margin-left:0}.table .span13{float:none;width:1004px;margin-left:0}.table .span14{float:none;width:1084px;margin-left:0}.table .span15{float:none;width:1164px;margin-left:0}.table .span16{float:none;width:1244px;margin-left:0}.table .span17{float:none;width:1324px;margin-left:0}.table .span18{float:none;width:1404px;margin-left:0}.table .span19{float:none;width:1484px;margin-left:0}.table .span20{float:none;width:1564px;margin-left:0}.table .span21{float:none;width:1644px;margin-left:0}.table .span22{float:none;width:1724px;margin-left:0}.table .span23{float:none;width:1804px;margin-left:0}.table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.warning td{background-color:#fcf8e3}.table tbody tr.info td{background-color:#d9edf7}.table-hover tbody tr.success:hover td{background-color:#d0e9c6}.table-hover tbody tr.error:hover td{background-color:#ebcccc}.table-hover tbody tr.warning:hover td{background-color:#faf2cc}.table-hover tbody tr.info:hover td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image: url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-tabs>.active>a>[class^="icon-"],.nav-tabs>.active>a>[class*=" icon-"],.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#08c;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#08c;background-color:#0081c2;background-image:linear-gradient(to bottom,#08c,#0077b3);background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 14px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^="icon-"]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^="icon-"]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:17px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-image:-moz-linear-gradient(top,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-image:-moz-linear-gradient(top,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-image:-moz-linear-gradient(top,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover{color:#333;text-decoration:none}.btn-group{position:relative;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-top:0;border-bottom:5px solid #000}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible;color:#777}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px}.navbar-link{color:#777}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;width:100%;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-image:-moz-linear-gradient(top,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.pagination{height:40px;margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager a,.pager span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a,.pager .next span{float:right}.pager .previous a{float:left}.pager .disabled a,.pager .disabled a:hover,.pager .disabled span{color:#999;cursor:default;background-color:#fff}.modal-open .modal .dropdown-menu{z-index:2050}.modal-open .modal .dropdown.open{*z-index:2050}.modal-open .modal .popover{z-index:2060}.modal-open .modal .tooltip{z-index:2080}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;overflow:auto;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{z-index:-1;content:""}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-top-color:#fff;border-width:10px 10px 0}.popover.top .arrow:after{bottom:-1px;left:-11px;border-top-color:rgba(0,0,0,0.25);border-width:11px 11px 0}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-right-color:#fff;border-width:10px 10px 10px 0}.popover.right .arrow:after{bottom:-11px;left:-1px;border-right-color:rgba(0,0,0,0.25);border-width:11px 11px 11px 0}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-bottom-color:#fff;border-width:0 10px 10px}.popover.bottom .arrow:after{top:-1px;left:-11px;border-bottom-color:rgba(0,0,0,0.25);border-width:0 11px 11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-left-color:#fff;border-width:10px 0 10px 10px}.popover.left .arrow:after{right:-1px;bottom:-11px;border-left-color:rgba(0,0,0,0.25);border-width:11px 0 11px 11px}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
    diff --git a/src/main/webapp/plug-in/bootstrap/img/glyphicons-halflings-white.png b/src/main/webapp/plug-in/bootstrap/img/glyphicons-halflings-white.png
    new file mode 100644
    index 00000000..3bf6484a
    Binary files /dev/null and b/src/main/webapp/plug-in/bootstrap/img/glyphicons-halflings-white.png differ
    diff --git a/src/main/webapp/plug-in/bootstrap/img/glyphicons-halflings.png b/src/main/webapp/plug-in/bootstrap/img/glyphicons-halflings.png
    new file mode 100644
    index 00000000..a9969993
    Binary files /dev/null and b/src/main/webapp/plug-in/bootstrap/img/glyphicons-halflings.png differ
    diff --git a/src/main/webapp/plug-in/bootstrap/js/application.js b/src/main/webapp/plug-in/bootstrap/js/application.js
    new file mode 100644
    index 00000000..732bed45
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/application.js
    @@ -0,0 +1,180 @@
    +// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT
    +// IT'S ALL JUST JUNK FOR OUR DOCS!
    +// ++++++++++++++++++++++++++++++++++++++++++
    +
    +!function ($) {
    +
    +  $(function(){
    +
    +    // Disable certain links in docs
    +    $('section [href^=#]').click(function (e) {
    +      e.preventDefault()
    +    })
    +
    +    // make code pretty
    +    window.prettyPrint && prettyPrint()
    +
    +    // add-ons
    +    $('.add-on :checkbox').on('click', function () {
    +      var $this = $(this)
    +        , method = $this.attr('checked') ? 'addClass' : 'removeClass'
    +      $(this).parents('.add-on')[method]('active')
    +    })
    +
    +    // position static twipsies for components page
    +    if ($(".twipsies a").length) {
    +      $(window).on('load resize', function () {
    +        $(".twipsies a").each(function () {
    +          $(this)
    +            .tooltip({
    +              placement: $(this).attr('title')
    +            , trigger: 'manual'
    +            })
    +            .tooltip('show')
    +          })
    +      })
    +    }
    +
    +    // add tipsies to grid for scaffolding
    +    if ($('#grid-system').length) {
    +      $('#grid-system').tooltip({
    +          selector: '.show-grid > div'
    +        , title: function () { return $(this).width() + 'px' }
    +      })
    +    }
    +
    +    // fix sub nav on scroll
    +    var $win = $(window)
    +      , $nav = $('.subnav')
    +      , navTop = $('.subnav').length && $('.subnav').offset().top - 40
    +      , isFixed = 0
    +
    +    processScroll()
    +
    +    $win.on('scroll', processScroll)
    +
    +    function processScroll() {
    +      var i, scrollTop = $win.scrollTop()
    +      if (scrollTop >= navTop && !isFixed) {
    +        isFixed = 1
    +        $nav.addClass('subnav-fixed')
    +      } else if (scrollTop <= navTop && isFixed) {
    +        isFixed = 0
    +        $nav.removeClass('subnav-fixed')
    +      }
    +    }
    +
    +    // tooltip demo
    +    $('.tooltip-demo.well').tooltip({
    +      selector: "a[rel=tooltip]"
    +    })
    +
    +    $('.tooltip-test').tooltip()
    +    $('.popover-test').popover()
    +
    +    // popover demo
    +    $("a[rel=popover]")
    +      .popover()
    +      .click(function(e) {
    +        e.preventDefault()
    +      })
    +
    +    // button state demo
    +    $('#fat-btn')
    +      .click(function () {
    +        var btn = $(this)
    +        btn.button('loading')
    +        setTimeout(function () {
    +          btn.button('reset')
    +        }, 3000)
    +      })
    +
    +    // carousel demo
    +    $('#myCarousel').carousel()
    +
    +    // javascript build logic
    +    var inputsComponent = $("#components.download input")
    +      , inputsPlugin = $("#plugins.download input")
    +      , inputsVariables = $("#variables.download input")
    +
    +    // toggle all plugin checkboxes
    +    $('#components.download .toggle-all').on('click', function (e) {
    +      e.preventDefault()
    +      inputsComponent.attr('checked', !inputsComponent.is(':checked'))
    +    })
    +
    +    $('#plugins.download .toggle-all').on('click', function (e) {
    +      e.preventDefault()
    +      inputsPlugin.attr('checked', !inputsPlugin.is(':checked'))
    +    })
    +
    +    $('#variables.download .toggle-all').on('click', function (e) {
    +      e.preventDefault()
    +      inputsVariables.val('')
    +    })
    +
    +    // request built javascript
    +    $('.download-btn').on('click', function () {
    +
    +      var css = $("#components.download input:checked")
    +            .map(function () { return this.value })
    +            .toArray()
    +        , js = $("#plugins.download input:checked")
    +            .map(function () { return this.value })
    +            .toArray()
    +        , vars = {}
    +        , img = ['glyphicons-halflings.png', 'glyphicons-halflings-white.png']
    +
    +    $("#variables.download input")
    +      .each(function () {
    +        $(this).val() && (vars[ $(this).prev().text() ] = $(this).val())
    +      })
    +
    +      $.ajax({
    +        type: 'POST'
    +      , url: 'http://bootstrap.herokuapp.com'
    +      , dataType: 'jsonpi'
    +      , params: {
    +          js: js
    +        , css: css
    +        , vars: vars
    +        , img: img
    +      }
    +      })
    +    })
    +
    +  })
    +
    +// Modified from the original jsonpi https://github.com/benvinegar/jquery-jsonpi
    +$.ajaxTransport('jsonpi', function(opts, originalOptions, jqXHR) {
    +  var url = opts.url;
    +
    +  return {
    +    send: function(_, completeCallback) {
    +      var name = 'jQuery_iframe_' + jQuery.now()
    +        , iframe, form
    +
    +      iframe = $('<iframe>')
    +        .attr('name', name)
    +        .appendTo('head')
    +
    +      form = $('<form>')
    +        .attr('method', opts.type) // GET or POST
    +        .attr('action', url)
    +        .attr('target', name)
    +
    +      $.each(opts.params, function(k, v) {
    +
    +        $('<input>')
    +          .attr('type', 'hidden')
    +          .attr('name', k)
    +          .attr('value', typeof v == 'string' ? v : JSON.stringify(v))
    +          .appendTo(form)
    +      })
    +
    +      form.appendTo('body').submit()
    +    }
    +  }
    +})
    +
    +}(window.jQuery)
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-affix.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-affix.js
    new file mode 100644
    index 00000000..c49d6e9d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-affix.js
    @@ -0,0 +1,104 @@
    +/* ==========================================================
    + * bootstrap-affix.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#affix
    + * ==========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ========================================================== */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* AFFIX CLASS DEFINITION
    +  * ====================== */
    +
    +  var Affix = function (element, options) {
    +    this.options = $.extend({}, $.fn.affix.defaults, options)
    +    this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
    +    this.$element = $(element)
    +    this.checkPosition()
    +  }
    +
    +  Affix.prototype.checkPosition = function () {
    +    if (!this.$element.is(':visible')) return
    +
    +    var scrollHeight = $(document).height()
    +      , scrollTop = this.$window.scrollTop()
    +      , position = this.$element.offset()
    +      , offset = this.options.offset
    +      , offsetBottom = offset.bottom
    +      , offsetTop = offset.top
    +      , reset = 'affix affix-top affix-bottom'
    +      , affix
    +
    +    if (typeof offset != 'object') offsetBottom = offsetTop = offset
    +    if (typeof offsetTop == 'function') offsetTop = offset.top()
    +    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
    +
    +    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
    +      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
    +      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
    +      'top'    : false
    +
    +    if (this.affixed === affix) return
    +
    +    this.affixed = affix
    +    this.unpin = affix == 'bottom' ? position.top - scrollTop : null
    +
    +    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
    +  }
    +
    +
    + /* AFFIX PLUGIN DEFINITION
    +  * ======================= */
    +
    +  $.fn.affix = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('affix')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('affix', (data = new Affix(this, options)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.affix.Constructor = Affix
    +
    +  $.fn.affix.defaults = {
    +    offset: 0
    +  }
    +
    +
    + /* AFFIX DATA-API
    +  * ============== */
    +
    +  $(window).on('load', function () {
    +    $('[data-spy="affix"]').each(function () {
    +      var $spy = $(this)
    +        , data = $spy.data()
    +
    +      data.offset = data.offset || {}
    +
    +      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
    +      data.offsetTop && (data.offset.top = data.offsetTop)
    +
    +      $spy.affix(data)
    +    })
    +  })
    +
    +
    +}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-alert.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-alert.js
    new file mode 100644
    index 00000000..51273ab9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-alert.js
    @@ -0,0 +1,90 @@
    +/* ==========================================================
    + * bootstrap-alert.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#alerts
    + * ==========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ========================================================== */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* ALERT CLASS DEFINITION
    +  * ====================== */
    +
    +  var dismiss = '[data-dismiss="alert"]'
    +    , Alert = function (el) {
    +        $(el).on('click', dismiss, this.close)
    +      }
    +
    +  Alert.prototype.close = function (e) {
    +    var $this = $(this)
    +      , selector = $this.attr('data-target')
    +      , $parent
    +
    +    if (!selector) {
    +      selector = $this.attr('href')
    +      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    +    }
    +
    +    $parent = $(selector)
    +
    +    e && e.preventDefault()
    +
    +    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
    +
    +    $parent.trigger(e = $.Event('close'))
    +
    +    if (e.isDefaultPrevented()) return
    +
    +    $parent.removeClass('in')
    +
    +    function removeElement() {
    +      $parent
    +        .trigger('closed')
    +        .remove()
    +    }
    +
    +    $.support.transition && $parent.hasClass('fade') ?
    +      $parent.on($.support.transition.end, removeElement) :
    +      removeElement()
    +  }
    +
    +
    + /* ALERT PLUGIN DEFINITION
    +  * ======================= */
    +
    +  $.fn.alert = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('alert')
    +      if (!data) $this.data('alert', (data = new Alert(this)))
    +      if (typeof option == 'string') data[option].call($this)
    +    })
    +  }
    +
    +  $.fn.alert.Constructor = Alert
    +
    +
    + /* ALERT DATA-API
    +  * ============== */
    +
    +  $(function () {
    +    $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
    +  })
    +
    +}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-button.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-button.js
    new file mode 100644
    index 00000000..a0ab0bfa
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-button.js
    @@ -0,0 +1,96 @@
    +/* ============================================================
    + * bootstrap-button.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#buttons
    + * ============================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ============================================================ */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* BUTTON PUBLIC CLASS DEFINITION
    +  * ============================== */
    +
    +  var Button = function (element, options) {
    +    this.$element = $(element)
    +    this.options = $.extend({}, $.fn.button.defaults, options)
    +  }
    +
    +  Button.prototype.setState = function (state) {
    +    var d = 'disabled'
    +      , $el = this.$element
    +      , data = $el.data()
    +      , val = $el.is('input') ? 'val' : 'html'
    +
    +    state = state + 'Text'
    +    data.resetText || $el.data('resetText', $el[val]())
    +
    +    $el[val](data[state] || this.options[state])
    +
    +    // push to event loop to allow forms to submit
    +    setTimeout(function () {
    +      state == 'loadingText' ?
    +        $el.addClass(d).attr(d, d) :
    +        $el.removeClass(d).removeAttr(d)
    +    }, 0)
    +  }
    +
    +  Button.prototype.toggle = function () {
    +    var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
    +
    +    $parent && $parent
    +      .find('.active')
    +      .removeClass('active')
    +
    +    this.$element.toggleClass('active')
    +  }
    +
    +
    + /* BUTTON PLUGIN DEFINITION
    +  * ======================== */
    +
    +  $.fn.button = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('button')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('button', (data = new Button(this, options)))
    +      if (option == 'toggle') data.toggle()
    +      else if (option) data.setState(option)
    +    })
    +  }
    +
    +  $.fn.button.defaults = {
    +    loadingText: 'loading...'
    +  }
    +
    +  $.fn.button.Constructor = Button
    +
    +
    + /* BUTTON DATA-API
    +  * =============== */
    +
    +  $(function () {
    +    $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
    +      var $btn = $(e.target)
    +      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
    +      $btn.button('toggle')
    +    })
    +  })
    +
    +}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-carousel.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-carousel.js
    new file mode 100644
    index 00000000..5c194b42
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-carousel.js
    @@ -0,0 +1,176 @@
    +/* ==========================================================
    + * bootstrap-carousel.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#carousel
    + * ==========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ========================================================== */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* CAROUSEL CLASS DEFINITION
    +  * ========================= */
    +
    +  var Carousel = function (element, options) {
    +    this.$element = $(element)
    +    this.options = options
    +    this.options.slide && this.slide(this.options.slide)
    +    this.options.pause == 'hover' && this.$element
    +      .on('mouseenter', $.proxy(this.pause, this))
    +      .on('mouseleave', $.proxy(this.cycle, this))
    +  }
    +
    +  Carousel.prototype = {
    +
    +    cycle: function (e) {
    +      if (!e) this.paused = false
    +      this.options.interval
    +        && !this.paused
    +        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
    +      return this
    +    }
    +
    +  , to: function (pos) {
    +      var $active = this.$element.find('.item.active')
    +        , children = $active.parent().children()
    +        , activePos = children.index($active)
    +        , that = this
    +
    +      if (pos > (children.length - 1) || pos < 0) return
    +
    +      if (this.sliding) {
    +        return this.$element.one('slid', function () {
    +          that.to(pos)
    +        })
    +      }
    +
    +      if (activePos == pos) {
    +        return this.pause().cycle()
    +      }
    +
    +      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
    +    }
    +
    +  , pause: function (e) {
    +      if (!e) this.paused = true
    +      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
    +        this.$element.trigger($.support.transition.end)
    +        this.cycle()
    +      }
    +      clearInterval(this.interval)
    +      this.interval = null
    +      return this
    +    }
    +
    +  , next: function () {
    +      if (this.sliding) return
    +      return this.slide('next')
    +    }
    +
    +  , prev: function () {
    +      if (this.sliding) return
    +      return this.slide('prev')
    +    }
    +
    +  , slide: function (type, next) {
    +      var $active = this.$element.find('.item.active')
    +        , $next = next || $active[type]()
    +        , isCycling = this.interval
    +        , direction = type == 'next' ? 'left' : 'right'
    +        , fallback  = type == 'next' ? 'first' : 'last'
    +        , that = this
    +        , e = $.Event('slide', {
    +            relatedTarget: $next[0]
    +          })
    +
    +      this.sliding = true
    +
    +      isCycling && this.pause()
    +
    +      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
    +
    +      if ($next.hasClass('active')) return
    +
    +      if ($.support.transition && this.$element.hasClass('slide')) {
    +        this.$element.trigger(e)
    +        if (e.isDefaultPrevented()) return
    +        $next.addClass(type)
    +        $next[0].offsetWidth // force reflow
    +        $active.addClass(direction)
    +        $next.addClass(direction)
    +        this.$element.one($.support.transition.end, function () {
    +          $next.removeClass([type, direction].join(' ')).addClass('active')
    +          $active.removeClass(['active', direction].join(' '))
    +          that.sliding = false
    +          setTimeout(function () { that.$element.trigger('slid') }, 0)
    +        })
    +      } else {
    +        this.$element.trigger(e)
    +        if (e.isDefaultPrevented()) return
    +        $active.removeClass('active')
    +        $next.addClass('active')
    +        this.sliding = false
    +        this.$element.trigger('slid')
    +      }
    +
    +      isCycling && this.cycle()
    +
    +      return this
    +    }
    +
    +  }
    +
    +
    + /* CAROUSEL PLUGIN DEFINITION
    +  * ========================== */
    +
    +  $.fn.carousel = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('carousel')
    +        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
    +        , action = typeof option == 'string' ? option : options.slide
    +      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
    +      if (typeof option == 'number') data.to(option)
    +      else if (action) data[action]()
    +      else if (options.interval) data.cycle()
    +    })
    +  }
    +
    +  $.fn.carousel.defaults = {
    +    interval: 5000
    +  , pause: 'hover'
    +  }
    +
    +  $.fn.carousel.Constructor = Carousel
    +
    +
    + /* CAROUSEL DATA-API
    +  * ================= */
    +
    +  $(function () {
    +    $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
    +      var $this = $(this), href
    +        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
    +        , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
    +      $target.carousel(options)
    +      e.preventDefault()
    +    })
    +  })
    +
    +}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-collapse.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-collapse.js
    new file mode 100644
    index 00000000..8116f225
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-collapse.js
    @@ -0,0 +1,158 @@
    +/* =============================================================
    + * bootstrap-collapse.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#collapse
    + * =============================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ============================================================ */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* COLLAPSE PUBLIC CLASS DEFINITION
    +  * ================================ */
    +
    +  var Collapse = function (element, options) {
    +    this.$element = $(element)
    +    this.options = $.extend({}, $.fn.collapse.defaults, options)
    +
    +    if (this.options.parent) {
    +      this.$parent = $(this.options.parent)
    +    }
    +
    +    this.options.toggle && this.toggle()
    +  }
    +
    +  Collapse.prototype = {
    +
    +    constructor: Collapse
    +
    +  , dimension: function () {
    +      var hasWidth = this.$element.hasClass('width')
    +      return hasWidth ? 'width' : 'height'
    +    }
    +
    +  , show: function () {
    +      var dimension
    +        , scroll
    +        , actives
    +        , hasData
    +
    +      if (this.transitioning) return
    +
    +      dimension = this.dimension()
    +      scroll = $.camelCase(['scroll', dimension].join('-'))
    +      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
    +
    +      if (actives && actives.length) {
    +        hasData = actives.data('collapse')
    +        if (hasData && hasData.transitioning) return
    +        actives.collapse('hide')
    +        hasData || actives.data('collapse', null)
    +      }
    +
    +      this.$element[dimension](0)
    +      this.transition('addClass', $.Event('show'), 'shown')
    +      $.support.transition && this.$element[dimension](this.$element[0][scroll])
    +    }
    +
    +  , hide: function () {
    +      var dimension
    +      if (this.transitioning) return
    +      dimension = this.dimension()
    +      this.reset(this.$element[dimension]())
    +      this.transition('removeClass', $.Event('hide'), 'hidden')
    +      this.$element[dimension](0)
    +    }
    +
    +  , reset: function (size) {
    +      var dimension = this.dimension()
    +
    +      this.$element
    +        .removeClass('collapse')
    +        [dimension](size || 'auto')
    +        [0].offsetWidth
    +
    +      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
    +
    +      return this
    +    }
    +
    +  , transition: function (method, startEvent, completeEvent) {
    +      var that = this
    +        , complete = function () {
    +            if (startEvent.type == 'show') that.reset()
    +            that.transitioning = 0
    +            that.$element.trigger(completeEvent)
    +          }
    +
    +      this.$element.trigger(startEvent)
    +
    +      if (startEvent.isDefaultPrevented()) return
    +
    +      this.transitioning = 1
    +
    +      this.$element[method]('in')
    +
    +      $.support.transition && this.$element.hasClass('collapse') ?
    +        this.$element.one($.support.transition.end, complete) :
    +        complete()
    +    }
    +
    +  , toggle: function () {
    +      this[this.$element.hasClass('in') ? 'hide' : 'show']()
    +    }
    +
    +  }
    +
    +
    + /* COLLAPSIBLE PLUGIN DEFINITION
    +  * ============================== */
    +
    +  $.fn.collapse = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('collapse')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.collapse.defaults = {
    +    toggle: true
    +  }
    +
    +  $.fn.collapse.Constructor = Collapse
    +
    +
    + /* COLLAPSIBLE DATA-API
    +  * ==================== */
    +
    +  $(function () {
    +    $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
    +      var $this = $(this), href
    +        , target = $this.attr('data-target')
    +          || e.preventDefault()
    +          || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
    +        , option = $(target).data('collapse') ? 'toggle' : $this.data()
    +      $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
    +      $(target).collapse(option)
    +    })
    +  })
    +
    +}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-dropdown.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-dropdown.js
    new file mode 100644
    index 00000000..ca90bd01
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-dropdown.js
    @@ -0,0 +1,151 @@
    +/* ============================================================
    + * bootstrap-dropdown.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#dropdowns
    + * ============================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ============================================================ */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* DROPDOWN CLASS DEFINITION
    +  * ========================= */
    +
    +  var toggle = '[data-toggle=dropdown]'
    +    , Dropdown = function (element) {
    +        var $el = $(element).on('click.dropdown.data-api', this.toggle)
    +        $('html').on('click.dropdown.data-api', function () {
    +          $el.parent().removeClass('open')
    +        })
    +      }
    +
    +  Dropdown.prototype = {
    +
    +    constructor: Dropdown
    +
    +  , toggle: function (e) {
    +      var $this = $(this)
    +        , $parent
    +        , isActive
    +
    +      if ($this.is('.disabled, :disabled')) return
    +
    +      $parent = getParent($this)
    +
    +      isActive = $parent.hasClass('open')
    +
    +      clearMenus()
    +
    +      if (!isActive) {
    +        $parent.toggleClass('open')
    +        $this.focus()
    +      }
    +
    +      return false
    +    }
    +
    +  , keydown: function (e) {
    +      var $this
    +        , $items
    +        , $active
    +        , $parent
    +        , isActive
    +        , index
    +
    +      if (!/(38|40|27)/.test(e.keyCode)) return
    +
    +      $this = $(this)
    +
    +      e.preventDefault()
    +      e.stopPropagation()
    +
    +      if ($this.is('.disabled, :disabled')) return
    +
    +      $parent = getParent($this)
    +
    +      isActive = $parent.hasClass('open')
    +
    +      if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
    +
    +      $items = $('[role=menu] li:not(.divider) a', $parent)
    +
    +      if (!$items.length) return
    +
    +      index = $items.index($items.filter(':focus'))
    +
    +      if (e.keyCode == 38 && index > 0) index--                                        // up
    +      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
    +      if (!~index) index = 0
    +
    +      $items
    +        .eq(index)
    +        .focus()
    +    }
    +
    +  }
    +
    +  function clearMenus() {
    +    $(toggle).each(function () {
    +      getParent($(this)).removeClass('open')
    +    })
    +  }
    +
    +  function getParent($this) {
    +    var selector = $this.attr('data-target')
    +      , $parent
    +
    +    if (!selector) {
    +      selector = $this.attr('href')
    +      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    +    }
    +
    +    $parent = $(selector)
    +    $parent.length || ($parent = $this.parent())
    +
    +    return $parent
    +  }
    +
    +
    +  /* DROPDOWN PLUGIN DEFINITION
    +   * ========================== */
    +
    +  $.fn.dropdown = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('dropdown')
    +      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
    +      if (typeof option == 'string') data[option].call($this)
    +    })
    +  }
    +
    +  $.fn.dropdown.Constructor = Dropdown
    +
    +
    +  /* APPLY TO STANDARD DROPDOWN ELEMENTS
    +   * =================================== */
    +
    +  $(function () {
    +    $('html')
    +      .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
    +    $('body')
    +      .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
    +      .on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
    +      .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
    +  })
    +
    +}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-modal.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-modal.js
    new file mode 100644
    index 00000000..f1622b1c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-modal.js
    @@ -0,0 +1,239 @@
    +/* =========================================================
    + * bootstrap-modal.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#modals
    + * =========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ========================================================= */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* MODAL CLASS DEFINITION
    +  * ====================== */
    +
    +  var Modal = function (element, options) {
    +    this.options = options
    +    this.$element = $(element)
    +      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
    +    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
    +  }
    +
    +  Modal.prototype = {
    +
    +      constructor: Modal
    +
    +    , toggle: function () {
    +        return this[!this.isShown ? 'show' : 'hide']()
    +      }
    +
    +    , show: function () {
    +        var that = this
    +          , e = $.Event('show')
    +
    +        this.$element.trigger(e)
    +
    +        if (this.isShown || e.isDefaultPrevented()) return
    +
    +        $('body').addClass('modal-open')
    +
    +        this.isShown = true
    +
    +        this.escape()
    +
    +        this.backdrop(function () {
    +          var transition = $.support.transition && that.$element.hasClass('fade')
    +
    +          if (!that.$element.parent().length) {
    +            that.$element.appendTo(document.body) //don't move modals dom position
    +          }
    +
    +          that.$element
    +            .show()
    +
    +          if (transition) {
    +            that.$element[0].offsetWidth // force reflow
    +          }
    +
    +          that.$element
    +            .addClass('in')
    +            .attr('aria-hidden', false)
    +            .focus()
    +
    +          that.enforceFocus()
    +
    +          transition ?
    +            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
    +            that.$element.trigger('shown')
    +
    +        })
    +      }
    +
    +    , hide: function (e) {
    +        e && e.preventDefault()
    +
    +        var that = this
    +
    +        e = $.Event('hide')
    +
    +        this.$element.trigger(e)
    +
    +        if (!this.isShown || e.isDefaultPrevented()) return
    +
    +        this.isShown = false
    +
    +        $('body').removeClass('modal-open')
    +
    +        this.escape()
    +
    +        $(document).off('focusin.modal')
    +
    +        this.$element
    +          .removeClass('in')
    +          .attr('aria-hidden', true)
    +
    +        $.support.transition && this.$element.hasClass('fade') ?
    +          this.hideWithTransition() :
    +          this.hideModal()
    +      }
    +
    +    , enforceFocus: function () {
    +        var that = this
    +        $(document).on('focusin.modal', function (e) {
    +          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
    +            that.$element.focus()
    +          }
    +        })
    +      }
    +
    +    , escape: function () {
    +        var that = this
    +        if (this.isShown && this.options.keyboard) {
    +          this.$element.on('keyup.dismiss.modal', function ( e ) {
    +            e.which == 27 && that.hide()
    +          })
    +        } else if (!this.isShown) {
    +          this.$element.off('keyup.dismiss.modal')
    +        }
    +      }
    +
    +    , hideWithTransition: function () {
    +        var that = this
    +          , timeout = setTimeout(function () {
    +              that.$element.off($.support.transition.end)
    +              that.hideModal()
    +            }, 500)
    +
    +        this.$element.one($.support.transition.end, function () {
    +          clearTimeout(timeout)
    +          that.hideModal()
    +        })
    +      }
    +
    +    , hideModal: function (that) {
    +        this.$element
    +          .hide()
    +          .trigger('hidden')
    +
    +        this.backdrop()
    +      }
    +
    +    , removeBackdrop: function () {
    +        this.$backdrop.remove()
    +        this.$backdrop = null
    +      }
    +
    +    , backdrop: function (callback) {
    +        var that = this
    +          , animate = this.$element.hasClass('fade') ? 'fade' : ''
    +
    +        if (this.isShown && this.options.backdrop) {
    +          var doAnimate = $.support.transition && animate
    +
    +          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
    +            .appendTo(document.body)
    +
    +          if (this.options.backdrop != 'static') {
    +            this.$backdrop.click($.proxy(this.hide, this))
    +          }
    +
    +          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
    +
    +          this.$backdrop.addClass('in')
    +
    +          doAnimate ?
    +            this.$backdrop.one($.support.transition.end, callback) :
    +            callback()
    +
    +        } else if (!this.isShown && this.$backdrop) {
    +          this.$backdrop.removeClass('in')
    +
    +          $.support.transition && this.$element.hasClass('fade')?
    +            this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
    +            this.removeBackdrop()
    +
    +        } else if (callback) {
    +          callback()
    +        }
    +      }
    +  }
    +
    +
    + /* MODAL PLUGIN DEFINITION
    +  * ======================= */
    +
    +  $.fn.modal = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('modal')
    +        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
    +      if (!data) $this.data('modal', (data = new Modal(this, options)))
    +      if (typeof option == 'string') data[option]()
    +      else if (options.show) data.show()
    +    })
    +  }
    +
    +  $.fn.modal.defaults = {
    +      backdrop: true
    +    , keyboard: true
    +    , show: true
    +  }
    +
    +  $.fn.modal.Constructor = Modal
    +
    +
    + /* MODAL DATA-API
    +  * ============== */
    +
    +  $(function () {
    +    $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
    +      var $this = $(this)
    +        , href = $this.attr('href')
    +        , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
    +        , option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
    +
    +      e.preventDefault()
    +
    +      $target
    +        .modal(option)
    +        .one('hide', function () {
    +          $this.focus()
    +        })
    +    })
    +  })
    +
    +}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-popover.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-popover.js
    new file mode 100644
    index 00000000..e1aa5ac3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-popover.js
    @@ -0,0 +1,95 @@
    +/* ===========================================================
    + * bootstrap-popover.js v2.0.2
    + * http://twitter.github.com/bootstrap/javascript.html#popovers
    + * ===========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * =========================================================== */
    +
    +
    +!function( $ ) {
    +
    + "use strict"
    +
    +  var Popover = function ( element, options ) {
    +    this.init('popover', element, options)
    +  }
    +
    +  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
    +     ========================================== */
    +
    +  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
    +
    +    constructor: Popover
    +
    +  , setContent: function () {
    +      var $tip = this.tip()
    +        , title = this.getTitle()
    +        , content = this.getContent()
    +
    +      $tip.find('.popover-title')[ $.type(title) == 'object' ? 'append' : 'html' ](title)
    +      $tip.find('.popover-content > *')[ $.type(content) == 'object' ? 'append' : 'html' ](content)
    +
    +      $tip.removeClass('fade top bottom left right in')
    +    }
    +
    +  , hasContent: function () {
    +      return this.getTitle() || this.getContent()
    +    }
    +
    +  , getContent: function () {
    +      var content
    +        , $e = this.$element
    +        , o = this.options
    +
    +      content = $e.attr('data-content')
    +        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
    +
    +      content = content.toString().replace(/(^\s*|\s*$)/, "")
    +
    +      return content
    +    }
    +
    +  , tip: function() {
    +      if (!this.$tip) {
    +        this.$tip = $(this.options.template)
    +      }
    +      return this.$tip
    +    }
    +
    +  })
    +
    +
    + /* POPOVER PLUGIN DEFINITION
    +  * ======================= */
    +
    +  $.fn.popover = function ( option ) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('popover')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('popover', (data = new Popover(this, options)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.popover.Constructor = Popover
    +
    +  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
    +    placement: 'right'
    +  , content: ''
    +  , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
    +  })
    +
    +}( window.jQuery );
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-scrollspy.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-scrollspy.js
    new file mode 100644
    index 00000000..e740ac01
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-scrollspy.js
    @@ -0,0 +1,151 @@
    +/* =============================================================
    + * bootstrap-scrollspy.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#scrollspy
    + * =============================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ============================================================== */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* SCROLLSPY CLASS DEFINITION
    +  * ========================== */
    +
    +  function ScrollSpy(element, options) {
    +    var process = $.proxy(this.process, this)
    +      , $element = $(element).is('body') ? $(window) : $(element)
    +      , href
    +    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
    +    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
    +    this.selector = (this.options.target
    +      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
    +      || '') + ' .nav li > a'
    +    this.$body = $('body')
    +    this.refresh()
    +    this.process()
    +  }
    +
    +  ScrollSpy.prototype = {
    +
    +      constructor: ScrollSpy
    +
    +    , refresh: function () {
    +        var self = this
    +          , $targets
    +
    +        this.offsets = $([])
    +        this.targets = $([])
    +
    +        $targets = this.$body
    +          .find(this.selector)
    +          .map(function () {
    +            var $el = $(this)
    +              , href = $el.data('target') || $el.attr('href')
    +              , $href = /^#\w/.test(href) && $(href)
    +            return ( $href
    +              && $href.length
    +              && [[ $href.position().top, href ]] ) || null
    +          })
    +          .sort(function (a, b) { return a[0] - b[0] })
    +          .each(function () {
    +            self.offsets.push(this[0])
    +            self.targets.push(this[1])
    +          })
    +      }
    +
    +    , process: function () {
    +        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
    +          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
    +          , maxScroll = scrollHeight - this.$scrollElement.height()
    +          , offsets = this.offsets
    +          , targets = this.targets
    +          , activeTarget = this.activeTarget
    +          , i
    +
    +        if (scrollTop >= maxScroll) {
    +          return activeTarget != (i = targets.last()[0])
    +            && this.activate ( i )
    +        }
    +
    +        for (i = offsets.length; i--;) {
    +          activeTarget != targets[i]
    +            && scrollTop >= offsets[i]
    +            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
    +            && this.activate( targets[i] )
    +        }
    +      }
    +
    +    , activate: function (target) {
    +        var active
    +          , selector
    +
    +        this.activeTarget = target
    +
    +        $(this.selector)
    +          .parent('.active')
    +          .removeClass('active')
    +
    +        selector = this.selector
    +          + '[data-target="' + target + '"],'
    +          + this.selector + '[href="' + target + '"]'
    +
    +        active = $(selector)
    +          .parent('li')
    +          .addClass('active')
    +
    +        if (active.parent('.dropdown-menu').length)  {
    +          active = active.closest('li.dropdown').addClass('active')
    +        }
    +
    +        active.trigger('activate')
    +      }
    +
    +  }
    +
    +
    + /* SCROLLSPY PLUGIN DEFINITION
    +  * =========================== */
    +
    +  $.fn.scrollspy = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('scrollspy')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.scrollspy.Constructor = ScrollSpy
    +
    +  $.fn.scrollspy.defaults = {
    +    offset: 10
    +  }
    +
    +
    + /* SCROLLSPY DATA-API
    +  * ================== */
    +
    +  $(window).on('load', function () {
    +    $('[data-spy="scroll"]').each(function () {
    +      var $spy = $(this)
    +      $spy.scrollspy($spy.data())
    +    })
    +  })
    +
    +}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-tab.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-tab.js
    new file mode 100644
    index 00000000..070deb8f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-tab.js
    @@ -0,0 +1,135 @@
    +/* ========================================================
    + * bootstrap-tab.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#tabs
    + * ========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ======================================================== */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* TAB CLASS DEFINITION
    +  * ==================== */
    +
    +  var Tab = function (element) {
    +    this.element = $(element)
    +  }
    +
    +  Tab.prototype = {
    +
    +    constructor: Tab
    +
    +  , show: function () {
    +      var $this = this.element
    +        , $ul = $this.closest('ul:not(.dropdown-menu)')
    +        , selector = $this.attr('data-target')
    +        , previous
    +        , $target
    +        , e
    +
    +      if (!selector) {
    +        selector = $this.attr('href')
    +        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    +      }
    +
    +      if ( $this.parent('li').hasClass('active') ) return
    +
    +      previous = $ul.find('.active a').last()[0]
    +
    +      e = $.Event('show', {
    +        relatedTarget: previous
    +      })
    +
    +      $this.trigger(e)
    +
    +      if (e.isDefaultPrevented()) return
    +
    +      $target = $(selector)
    +
    +      this.activate($this.parent('li'), $ul)
    +      this.activate($target, $target.parent(), function () {
    +        $this.trigger({
    +          type: 'shown'
    +        , relatedTarget: previous
    +        })
    +      })
    +    }
    +
    +  , activate: function ( element, container, callback) {
    +      var $active = container.find('> .active')
    +        , transition = callback
    +            && $.support.transition
    +            && $active.hasClass('fade')
    +
    +      function next() {
    +        $active
    +          .removeClass('active')
    +          .find('> .dropdown-menu > .active')
    +          .removeClass('active')
    +
    +        element.addClass('active')
    +
    +        if (transition) {
    +          element[0].offsetWidth // reflow for transition
    +          element.addClass('in')
    +        } else {
    +          element.removeClass('fade')
    +        }
    +
    +        if ( element.parent('.dropdown-menu') ) {
    +          element.closest('li.dropdown').addClass('active')
    +        }
    +
    +        callback && callback()
    +      }
    +
    +      transition ?
    +        $active.one($.support.transition.end, next) :
    +        next()
    +
    +      $active.removeClass('in')
    +    }
    +  }
    +
    +
    + /* TAB PLUGIN DEFINITION
    +  * ===================== */
    +
    +  $.fn.tab = function ( option ) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('tab')
    +      if (!data) $this.data('tab', (data = new Tab(this)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.tab.Constructor = Tab
    +
    +
    + /* TAB DATA-API
    +  * ============ */
    +
    +  $(function () {
    +    $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
    +      e.preventDefault()
    +      $(this).tab('show')
    +    })
    +  })
    +
    +}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-tooltip.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-tooltip.js
    new file mode 100644
    index 00000000..49b5f728
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-tooltip.js
    @@ -0,0 +1,270 @@
    +/* ===========================================================
    + * bootstrap-tooltip.js v2.0.2
    + * http://twitter.github.com/bootstrap/javascript.html#tooltips
    + * Inspired by the original jQuery.tipsy by Jason Frame
    + * ===========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ========================================================== */
    +
    +!function( $ ) {
    +
    +  "use strict"
    +
    + /* TOOLTIP PUBLIC CLASS DEFINITION
    +  * =============================== */
    +
    +  var Tooltip = function ( element, options ) {
    +    this.init('tooltip', element, options)
    +  }
    +
    +  Tooltip.prototype = {
    +
    +    constructor: Tooltip
    +
    +  , init: function ( type, element, options ) {
    +      var eventIn
    +        , eventOut
    +
    +      this.type = type
    +      this.$element = $(element)
    +      this.options = this.getOptions(options)
    +      this.enabled = true
    +
    +      if (this.options.trigger != 'manual') {
    +        eventIn  = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
    +        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
    +        this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))
    +        this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))
    +      }
    +
    +      this.options.selector ?
    +        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
    +        this.fixTitle()
    +    }
    +
    +  , getOptions: function ( options ) {
    +      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
    +
    +      if (options.delay && typeof options.delay == 'number') {
    +        options.delay = {
    +          show: options.delay
    +        , hide: options.delay
    +        }
    +      }
    +
    +      return options
    +    }
    +
    +  , enter: function ( e ) {
    +      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
    +
    +      if (!self.options.delay || !self.options.delay.show) {
    +        self.show()
    +      } else {
    +        self.hoverState = 'in'
    +        setTimeout(function() {
    +          if (self.hoverState == 'in') {
    +            self.show()
    +          }
    +        }, self.options.delay.show)
    +      }
    +    }
    +
    +  , leave: function ( e ) {
    +      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
    +
    +      if (!self.options.delay || !self.options.delay.hide) {
    +        self.hide()
    +      } else {
    +        self.hoverState = 'out'
    +        setTimeout(function() {
    +          if (self.hoverState == 'out') {
    +            self.hide()
    +          }
    +        }, self.options.delay.hide)
    +      }
    +    }
    +
    +  , show: function () {
    +      var $tip
    +        , inside
    +        , pos
    +        , actualWidth
    +        , actualHeight
    +        , placement
    +        , tp
    +
    +      if (this.hasContent() && this.enabled) {
    +        $tip = this.tip()
    +        this.setContent()
    +
    +        if (this.options.animation) {
    +          $tip.addClass('fade')
    +        }
    +
    +        placement = typeof this.options.placement == 'function' ?
    +          this.options.placement.call(this, $tip[0], this.$element[0]) :
    +          this.options.placement
    +
    +        inside = /in/.test(placement)
    +
    +        $tip
    +          .remove()
    +          .css({ top: 0, left: 0, display: 'block' })
    +          .appendTo(inside ? this.$element : document.body)
    +
    +        pos = this.getPosition(inside)
    +
    +        actualWidth = $tip[0].offsetWidth
    +        actualHeight = $tip[0].offsetHeight
    +
    +        switch (inside ? placement.split(' ')[1] : placement) {
    +          case 'bottom':
    +            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
    +            break
    +          case 'top':
    +            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
    +            break
    +          case 'left':
    +            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
    +            break
    +          case 'right':
    +            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
    +            break
    +        }
    +
    +        $tip
    +          .css(tp)
    +          .addClass(placement)
    +          .addClass('in')
    +      }
    +    }
    +
    +  , setContent: function () {
    +      var $tip = this.tip()
    +      $tip.find('.tooltip-inner').html(this.getTitle())
    +      $tip.removeClass('fade in top bottom left right')
    +    }
    +
    +  , hide: function () {
    +      var that = this
    +        , $tip = this.tip()
    +
    +      $tip.removeClass('in')
    +
    +      function removeWithAnimation() {
    +        var timeout = setTimeout(function () {
    +          $tip.off($.support.transition.end).remove()
    +        }, 500)
    +
    +        $tip.one($.support.transition.end, function () {
    +          clearTimeout(timeout)
    +          $tip.remove()
    +        })
    +      }
    +
    +      $.support.transition && this.$tip.hasClass('fade') ?
    +        removeWithAnimation() :
    +        $tip.remove()
    +    }
    +
    +  , fixTitle: function () {
    +      var $e = this.$element
    +      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
    +        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
    +      }
    +    }
    +
    +  , hasContent: function () {
    +      return this.getTitle()
    +    }
    +
    +  , getPosition: function (inside) {
    +      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
    +        width: this.$element[0].offsetWidth
    +      , height: this.$element[0].offsetHeight
    +      })
    +    }
    +
    +  , getTitle: function () {
    +      var title
    +        , $e = this.$element
    +        , o = this.options
    +
    +      title = $e.attr('data-original-title')
    +        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
    +
    +      title = (title || '').toString().replace(/(^\s*|\s*$)/, "")
    +
    +      return title
    +    }
    +
    +  , tip: function () {
    +      return this.$tip = this.$tip || $(this.options.template)
    +    }
    +
    +  , validate: function () {
    +      if (!this.$element[0].parentNode) {
    +        this.hide()
    +        this.$element = null
    +        this.options = null
    +      }
    +    }
    +
    +  , enable: function () {
    +      this.enabled = true
    +    }
    +
    +  , disable: function () {
    +      this.enabled = false
    +    }
    +
    +  , toggleEnabled: function () {
    +      this.enabled = !this.enabled
    +    }
    +
    +  , toggle: function () {
    +      this[this.tip().hasClass('in') ? 'hide' : 'show']()
    +    }
    +
    +  }
    +
    +
    + /* TOOLTIP PLUGIN DEFINITION
    +  * ========================= */
    +
    +  $.fn.tooltip = function ( option ) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('tooltip')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.tooltip.Constructor = Tooltip
    +
    +  $.fn.tooltip.defaults = {
    +    animation: true
    +  , delay: 0
    +  , selector: false
    +  , placement: 'top'
    +  , trigger: 'hover'
    +  , title: ''
    +  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
    +  }
    +
    +}( window.jQuery );
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-transition.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-transition.js
    new file mode 100644
    index 00000000..fedc90a8
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-transition.js
    @@ -0,0 +1,60 @@
    +/* ===================================================
    + * bootstrap-transition.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#transitions
    + * ===================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ========================================================== */
    +
    +
    +!function ($) {
    +
    +  $(function () {
    +
    +    "use strict"; // jshint ;_;
    +
    +
    +    /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
    +     * ======================================================= */
    +
    +    $.support.transition = (function () {
    +
    +      var transitionEnd = (function () {
    +
    +        var el = document.createElement('bootstrap')
    +          , transEndEventNames = {
    +               'WebkitTransition' : 'webkitTransitionEnd'
    +            ,  'MozTransition'    : 'transitionend'
    +            ,  'OTransition'      : 'oTransitionEnd otransitionend'
    +            ,  'transition'       : 'transitionend'
    +            }
    +          , name
    +
    +        for (name in transEndEventNames){
    +          if (el.style[name] !== undefined) {
    +            return transEndEventNames[name]
    +          }
    +        }
    +
    +      }())
    +
    +      return transitionEnd && {
    +        end: transitionEnd
    +      }
    +
    +    })()
    +
    +  })
    +
    +}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap-typeahead.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap-typeahead.js
    new file mode 100644
    index 00000000..c2ccdea2
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap-typeahead.js
    @@ -0,0 +1,300 @@
    +/* =============================================================
    + * bootstrap-typeahead.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#typeahead
    + * =============================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ============================================================ */
    +
    +
    +!function($){
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* TYPEAHEAD PUBLIC CLASS DEFINITION
    +  * ================================= */
    +
    +  var Typeahead = function (element, options) {
    +    this.$element = $(element)
    +    this.options = $.extend({}, $.fn.typeahead.defaults, options)
    +    this.matcher = this.options.matcher || this.matcher
    +    this.sorter = this.options.sorter || this.sorter
    +    this.highlighter = this.options.highlighter || this.highlighter
    +    this.updater = this.options.updater || this.updater
    +    this.$menu = $(this.options.menu).appendTo('body')
    +    this.source = this.options.source
    +    this.shown = false
    +    this.listen()
    +  }
    +
    +  Typeahead.prototype = {
    +
    +    constructor: Typeahead
    +
    +  , select: function () {
    +      var val = this.$menu.find('.active').attr('data-value')
    +      this.$element
    +        .val(this.updater(val))
    +        .change()
    +      return this.hide()
    +    }
    +
    +  , updater: function (item) {
    +      return item
    +    }
    +
    +  , show: function () {
    +      var pos = $.extend({}, this.$element.offset(), {
    +        height: this.$element[0].offsetHeight
    +      })
    +
    +      this.$menu.css({
    +        top: pos.top + pos.height
    +      , left: pos.left
    +      })
    +
    +      this.$menu.show()
    +      this.shown = true
    +      return this
    +    }
    +
    +  , hide: function () {
    +      this.$menu.hide()
    +      this.shown = false
    +      return this
    +    }
    +
    +  , lookup: function (event) {
    +      var items
    +
    +      this.query = this.$element.val()
    +
    +      if (!this.query || this.query.length < this.options.minLength) {
    +        return this.shown ? this.hide() : this
    +      }
    +
    +      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
    +
    +      return items ? this.process(items) : this
    +    }
    +
    +  , process: function (items) {
    +      var that = this
    +
    +      items = $.grep(items, function (item) {
    +        return that.matcher(item)
    +      })
    +
    +      items = this.sorter(items)
    +
    +      if (!items.length) {
    +        return this.shown ? this.hide() : this
    +      }
    +
    +      return this.render(items.slice(0, this.options.items)).show()
    +    }
    +
    +  , matcher: function (item) {
    +      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
    +    }
    +
    +  , sorter: function (items) {
    +      var beginswith = []
    +        , caseSensitive = []
    +        , caseInsensitive = []
    +        , item
    +
    +      while (item = items.shift()) {
    +        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
    +        else if (~item.indexOf(this.query)) caseSensitive.push(item)
    +        else caseInsensitive.push(item)
    +      }
    +
    +      return beginswith.concat(caseSensitive, caseInsensitive)
    +    }
    +
    +  , highlighter: function (item) {
    +      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
    +      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
    +        return '<strong>' + match + '</strong>'
    +      })
    +    }
    +
    +  , render: function (items) {
    +      var that = this
    +
    +      items = $(items).map(function (i, item) {
    +        i = $(that.options.item).attr('data-value', item)
    +        i.find('a').html(that.highlighter(item))
    +        return i[0]
    +      })
    +
    +      items.first().addClass('active')
    +      this.$menu.html(items)
    +      return this
    +    }
    +
    +  , next: function (event) {
    +      var active = this.$menu.find('.active').removeClass('active')
    +        , next = active.next()
    +
    +      if (!next.length) {
    +        next = $(this.$menu.find('li')[0])
    +      }
    +
    +      next.addClass('active')
    +    }
    +
    +  , prev: function (event) {
    +      var active = this.$menu.find('.active').removeClass('active')
    +        , prev = active.prev()
    +
    +      if (!prev.length) {
    +        prev = this.$menu.find('li').last()
    +      }
    +
    +      prev.addClass('active')
    +    }
    +
    +  , listen: function () {
    +      this.$element
    +        .on('blur',     $.proxy(this.blur, this))
    +        .on('keypress', $.proxy(this.keypress, this))
    +        .on('keyup',    $.proxy(this.keyup, this))
    +
    +      if ($.browser.chrome || $.browser.webkit || $.browser.msie) {
    +        this.$element.on('keydown', $.proxy(this.keydown, this))
    +      }
    +
    +      this.$menu
    +        .on('click', $.proxy(this.click, this))
    +        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
    +    }
    +
    +  , move: function (e) {
    +      if (!this.shown) return
    +
    +      switch(e.keyCode) {
    +        case 9: // tab
    +        case 13: // enter
    +        case 27: // escape
    +          e.preventDefault()
    +          break
    +
    +        case 38: // up arrow
    +          e.preventDefault()
    +          this.prev()
    +          break
    +
    +        case 40: // down arrow
    +          e.preventDefault()
    +          this.next()
    +          break
    +      }
    +
    +      e.stopPropagation()
    +    }
    +
    +  , keydown: function (e) {
    +      this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40,38,9,13,27])
    +      this.move(e)
    +    }
    +
    +  , keypress: function (e) {
    +      if (this.suppressKeyPressRepeat) return
    +      this.move(e)
    +    }
    +
    +  , keyup: function (e) {
    +      switch(e.keyCode) {
    +        case 40: // down arrow
    +        case 38: // up arrow
    +          break
    +
    +        case 9: // tab
    +        case 13: // enter
    +          if (!this.shown) return
    +          this.select()
    +          break
    +
    +        case 27: // escape
    +          if (!this.shown) return
    +          this.hide()
    +          break
    +
    +        default:
    +          this.lookup()
    +      }
    +
    +      e.stopPropagation()
    +      e.preventDefault()
    +  }
    +
    +  , blur: function (e) {
    +      var that = this
    +      setTimeout(function () { that.hide() }, 150)
    +    }
    +
    +  , click: function (e) {
    +      e.stopPropagation()
    +      e.preventDefault()
    +      this.select()
    +    }
    +
    +  , mouseenter: function (e) {
    +      this.$menu.find('.active').removeClass('active')
    +      $(e.currentTarget).addClass('active')
    +    }
    +
    +  }
    +
    +
    +  /* TYPEAHEAD PLUGIN DEFINITION
    +   * =========================== */
    +
    +  $.fn.typeahead = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('typeahead')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.typeahead.defaults = {
    +    source: []
    +  , items: 8
    +  , menu: '<ul class="typeahead dropdown-menu"></ul>'
    +  , item: '<li><a href="#"></a></li>'
    +  , minLength: 1
    +  }
    +
    +  $.fn.typeahead.Constructor = Typeahead
    +
    +
    + /*   TYPEAHEAD DATA-API
    +  * ================== */
    +
    +  $(function () {
    +    $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
    +      var $this = $(this)
    +      if ($this.data('typeahead')) return
    +      e.preventDefault()
    +      $this.typeahead($this.data())
    +    })
    +  })
    +
    +}(window.jQuery);
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap.js
    new file mode 100644
    index 00000000..f73fcb8e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap.js
    @@ -0,0 +1,2027 @@
    +/* ===================================================
    + * bootstrap-transition.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#transitions
    + * ===================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ========================================================== */
    +
    +
    +!function ($) {
    +
    +  $(function () {
    +
    +    "use strict"; // jshint ;_;
    +
    +
    +    /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
    +     * ======================================================= */
    +
    +    $.support.transition = (function () {
    +
    +      var transitionEnd = (function () {
    +
    +        var el = document.createElement('bootstrap')
    +          , transEndEventNames = {
    +               'WebkitTransition' : 'webkitTransitionEnd'
    +            ,  'MozTransition'    : 'transitionend'
    +            ,  'OTransition'      : 'oTransitionEnd otransitionend'
    +            ,  'transition'       : 'transitionend'
    +            }
    +          , name
    +
    +        for (name in transEndEventNames){
    +          if (el.style[name] !== undefined) {
    +            return transEndEventNames[name]
    +          }
    +        }
    +
    +      }())
    +
    +      return transitionEnd && {
    +        end: transitionEnd
    +      }
    +
    +    })()
    +
    +  })
    +
    +}(window.jQuery);/* ==========================================================
    + * bootstrap-alert.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#alerts
    + * ==========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ========================================================== */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* ALERT CLASS DEFINITION
    +  * ====================== */
    +
    +  var dismiss = '[data-dismiss="alert"]'
    +    , Alert = function (el) {
    +        $(el).on('click', dismiss, this.close)
    +      }
    +
    +  Alert.prototype.close = function (e) {
    +    var $this = $(this)
    +      , selector = $this.attr('data-target')
    +      , $parent
    +
    +    if (!selector) {
    +      selector = $this.attr('href')
    +      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    +    }
    +
    +    $parent = $(selector)
    +
    +    e && e.preventDefault()
    +
    +    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
    +
    +    $parent.trigger(e = $.Event('close'))
    +
    +    if (e.isDefaultPrevented()) return
    +
    +    $parent.removeClass('in')
    +
    +    function removeElement() {
    +      $parent
    +        .trigger('closed')
    +        .remove()
    +    }
    +
    +    $.support.transition && $parent.hasClass('fade') ?
    +      $parent.on($.support.transition.end, removeElement) :
    +      removeElement()
    +  }
    +
    +
    + /* ALERT PLUGIN DEFINITION
    +  * ======================= */
    +
    +  $.fn.alert = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('alert')
    +      if (!data) $this.data('alert', (data = new Alert(this)))
    +      if (typeof option == 'string') data[option].call($this)
    +    })
    +  }
    +
    +  $.fn.alert.Constructor = Alert
    +
    +
    + /* ALERT DATA-API
    +  * ============== */
    +
    +  $(function () {
    +    $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
    +  })
    +
    +}(window.jQuery);/* ============================================================
    + * bootstrap-button.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#buttons
    + * ============================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ============================================================ */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* BUTTON PUBLIC CLASS DEFINITION
    +  * ============================== */
    +
    +  var Button = function (element, options) {
    +    this.$element = $(element)
    +    this.options = $.extend({}, $.fn.button.defaults, options)
    +  }
    +
    +  Button.prototype.setState = function (state) {
    +    var d = 'disabled'
    +      , $el = this.$element
    +      , data = $el.data()
    +      , val = $el.is('input') ? 'val' : 'html'
    +
    +    state = state + 'Text'
    +    data.resetText || $el.data('resetText', $el[val]())
    +
    +    $el[val](data[state] || this.options[state])
    +
    +    // push to event loop to allow forms to submit
    +    setTimeout(function () {
    +      state == 'loadingText' ?
    +        $el.addClass(d).attr(d, d) :
    +        $el.removeClass(d).removeAttr(d)
    +    }, 0)
    +  }
    +
    +  Button.prototype.toggle = function () {
    +    var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
    +
    +    $parent && $parent
    +      .find('.active')
    +      .removeClass('active')
    +
    +    this.$element.toggleClass('active')
    +  }
    +
    +
    + /* BUTTON PLUGIN DEFINITION
    +  * ======================== */
    +
    +  $.fn.button = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('button')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('button', (data = new Button(this, options)))
    +      if (option == 'toggle') data.toggle()
    +      else if (option) data.setState(option)
    +    })
    +  }
    +
    +  $.fn.button.defaults = {
    +    loadingText: 'loading...'
    +  }
    +
    +  $.fn.button.Constructor = Button
    +
    +
    + /* BUTTON DATA-API
    +  * =============== */
    +
    +  $(function () {
    +    $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
    +      var $btn = $(e.target)
    +      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
    +      $btn.button('toggle')
    +    })
    +  })
    +
    +}(window.jQuery);/* ==========================================================
    + * bootstrap-carousel.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#carousel
    + * ==========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ========================================================== */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* CAROUSEL CLASS DEFINITION
    +  * ========================= */
    +
    +  var Carousel = function (element, options) {
    +    this.$element = $(element)
    +    this.options = options
    +    this.options.slide && this.slide(this.options.slide)
    +    this.options.pause == 'hover' && this.$element
    +      .on('mouseenter', $.proxy(this.pause, this))
    +      .on('mouseleave', $.proxy(this.cycle, this))
    +  }
    +
    +  Carousel.prototype = {
    +
    +    cycle: function (e) {
    +      if (!e) this.paused = false
    +      this.options.interval
    +        && !this.paused
    +        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
    +      return this
    +    }
    +
    +  , to: function (pos) {
    +      var $active = this.$element.find('.item.active')
    +        , children = $active.parent().children()
    +        , activePos = children.index($active)
    +        , that = this
    +
    +      if (pos > (children.length - 1) || pos < 0) return
    +
    +      if (this.sliding) {
    +        return this.$element.one('slid', function () {
    +          that.to(pos)
    +        })
    +      }
    +
    +      if (activePos == pos) {
    +        return this.pause().cycle()
    +      }
    +
    +      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
    +    }
    +
    +  , pause: function (e) {
    +      if (!e) this.paused = true
    +      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
    +        this.$element.trigger($.support.transition.end)
    +        this.cycle()
    +      }
    +      clearInterval(this.interval)
    +      this.interval = null
    +      return this
    +    }
    +
    +  , next: function () {
    +      if (this.sliding) return
    +      return this.slide('next')
    +    }
    +
    +  , prev: function () {
    +      if (this.sliding) return
    +      return this.slide('prev')
    +    }
    +
    +  , slide: function (type, next) {
    +      var $active = this.$element.find('.item.active')
    +        , $next = next || $active[type]()
    +        , isCycling = this.interval
    +        , direction = type == 'next' ? 'left' : 'right'
    +        , fallback  = type == 'next' ? 'first' : 'last'
    +        , that = this
    +        , e = $.Event('slide', {
    +            relatedTarget: $next[0]
    +          })
    +
    +      this.sliding = true
    +
    +      isCycling && this.pause()
    +
    +      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
    +
    +      if ($next.hasClass('active')) return
    +
    +      if ($.support.transition && this.$element.hasClass('slide')) {
    +        this.$element.trigger(e)
    +        if (e.isDefaultPrevented()) return
    +        $next.addClass(type)
    +        $next[0].offsetWidth // force reflow
    +        $active.addClass(direction)
    +        $next.addClass(direction)
    +        this.$element.one($.support.transition.end, function () {
    +          $next.removeClass([type, direction].join(' ')).addClass('active')
    +          $active.removeClass(['active', direction].join(' '))
    +          that.sliding = false
    +          setTimeout(function () { that.$element.trigger('slid') }, 0)
    +        })
    +      } else {
    +        this.$element.trigger(e)
    +        if (e.isDefaultPrevented()) return
    +        $active.removeClass('active')
    +        $next.addClass('active')
    +        this.sliding = false
    +        this.$element.trigger('slid')
    +      }
    +
    +      isCycling && this.cycle()
    +
    +      return this
    +    }
    +
    +  }
    +
    +
    + /* CAROUSEL PLUGIN DEFINITION
    +  * ========================== */
    +
    +  $.fn.carousel = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('carousel')
    +        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
    +        , action = typeof option == 'string' ? option : options.slide
    +      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
    +      if (typeof option == 'number') data.to(option)
    +      else if (action) data[action]()
    +      else if (options.interval) data.cycle()
    +    })
    +  }
    +
    +  $.fn.carousel.defaults = {
    +    interval: 5000
    +  , pause: 'hover'
    +  }
    +
    +  $.fn.carousel.Constructor = Carousel
    +
    +
    + /* CAROUSEL DATA-API
    +  * ================= */
    +
    +  $(function () {
    +    $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
    +      var $this = $(this), href
    +        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
    +        , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
    +      $target.carousel(options)
    +      e.preventDefault()
    +    })
    +  })
    +
    +}(window.jQuery);/* =============================================================
    + * bootstrap-collapse.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#collapse
    + * =============================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ============================================================ */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* COLLAPSE PUBLIC CLASS DEFINITION
    +  * ================================ */
    +
    +  var Collapse = function (element, options) {
    +    this.$element = $(element)
    +    this.options = $.extend({}, $.fn.collapse.defaults, options)
    +
    +    if (this.options.parent) {
    +      this.$parent = $(this.options.parent)
    +    }
    +
    +    this.options.toggle && this.toggle()
    +  }
    +
    +  Collapse.prototype = {
    +
    +    constructor: Collapse
    +
    +  , dimension: function () {
    +      var hasWidth = this.$element.hasClass('width')
    +      return hasWidth ? 'width' : 'height'
    +    }
    +
    +  , show: function () {
    +      var dimension
    +        , scroll
    +        , actives
    +        , hasData
    +
    +      if (this.transitioning) return
    +
    +      dimension = this.dimension()
    +      scroll = $.camelCase(['scroll', dimension].join('-'))
    +      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
    +
    +      if (actives && actives.length) {
    +        hasData = actives.data('collapse')
    +        if (hasData && hasData.transitioning) return
    +        actives.collapse('hide')
    +        hasData || actives.data('collapse', null)
    +      }
    +
    +      this.$element[dimension](0)
    +      this.transition('addClass', $.Event('show'), 'shown')
    +      $.support.transition && this.$element[dimension](this.$element[0][scroll])
    +    }
    +
    +  , hide: function () {
    +      var dimension
    +      if (this.transitioning) return
    +      dimension = this.dimension()
    +      this.reset(this.$element[dimension]())
    +      this.transition('removeClass', $.Event('hide'), 'hidden')
    +      this.$element[dimension](0)
    +    }
    +
    +  , reset: function (size) {
    +      var dimension = this.dimension()
    +
    +      this.$element
    +        .removeClass('collapse')
    +        [dimension](size || 'auto')
    +        [0].offsetWidth
    +
    +      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
    +
    +      return this
    +    }
    +
    +  , transition: function (method, startEvent, completeEvent) {
    +      var that = this
    +        , complete = function () {
    +            if (startEvent.type == 'show') that.reset()
    +            that.transitioning = 0
    +            that.$element.trigger(completeEvent)
    +          }
    +
    +      this.$element.trigger(startEvent)
    +
    +      if (startEvent.isDefaultPrevented()) return
    +
    +      this.transitioning = 1
    +
    +      this.$element[method]('in')
    +
    +      $.support.transition && this.$element.hasClass('collapse') ?
    +        this.$element.one($.support.transition.end, complete) :
    +        complete()
    +    }
    +
    +  , toggle: function () {
    +      this[this.$element.hasClass('in') ? 'hide' : 'show']()
    +    }
    +
    +  }
    +
    +
    + /* COLLAPSIBLE PLUGIN DEFINITION
    +  * ============================== */
    +
    +  $.fn.collapse = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('collapse')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.collapse.defaults = {
    +    toggle: true
    +  }
    +
    +  $.fn.collapse.Constructor = Collapse
    +
    +
    + /* COLLAPSIBLE DATA-API
    +  * ==================== */
    +
    +  $(function () {
    +    $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
    +      var $this = $(this), href
    +        , target = $this.attr('data-target')
    +          || e.preventDefault()
    +          || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
    +        , option = $(target).data('collapse') ? 'toggle' : $this.data()
    +      $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
    +      $(target).collapse(option)
    +    })
    +  })
    +
    +}(window.jQuery);/* ============================================================
    + * bootstrap-dropdown.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#dropdowns
    + * ============================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ============================================================ */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* DROPDOWN CLASS DEFINITION
    +  * ========================= */
    +
    +  var toggle = '[data-toggle=dropdown]'
    +    , Dropdown = function (element) {
    +        var $el = $(element).on('click.dropdown.data-api', this.toggle)
    +        $('html').on('click.dropdown.data-api', function () {
    +          $el.parent().removeClass('open')
    +        })
    +      }
    +
    +  Dropdown.prototype = {
    +
    +    constructor: Dropdown
    +
    +  , toggle: function (e) {
    +      var $this = $(this)
    +        , $parent
    +        , isActive
    +
    +      if ($this.is('.disabled, :disabled')) return
    +
    +      $parent = getParent($this)
    +
    +      isActive = $parent.hasClass('open')
    +
    +      clearMenus()
    +
    +      if (!isActive) {
    +        $parent.toggleClass('open')
    +        $this.focus()
    +      }
    +
    +      return false
    +    }
    +
    +  , keydown: function (e) {
    +      var $this
    +        , $items
    +        , $active
    +        , $parent
    +        , isActive
    +        , index
    +
    +      if (!/(38|40|27)/.test(e.keyCode)) return
    +
    +      $this = $(this)
    +
    +      e.preventDefault()
    +      e.stopPropagation()
    +
    +      if ($this.is('.disabled, :disabled')) return
    +
    +      $parent = getParent($this)
    +
    +      isActive = $parent.hasClass('open')
    +
    +      if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
    +
    +      $items = $('[role=menu] li:not(.divider) a', $parent)
    +
    +      if (!$items.length) return
    +
    +      index = $items.index($items.filter(':focus'))
    +
    +      if (e.keyCode == 38 && index > 0) index--                                        // up
    +      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
    +      if (!~index) index = 0
    +
    +      $items
    +        .eq(index)
    +        .focus()
    +    }
    +
    +  }
    +
    +  function clearMenus() {
    +    getParent($(toggle))
    +      .removeClass('open')
    +  }
    +
    +  function getParent($this) {
    +    var selector = $this.attr('data-target')
    +      , $parent
    +
    +    if (!selector) {
    +      selector = $this.attr('href')
    +      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    +    }
    +
    +    $parent = $(selector)
    +    $parent.length || ($parent = $this.parent())
    +
    +    return $parent
    +  }
    +
    +
    +  /* DROPDOWN PLUGIN DEFINITION
    +   * ========================== */
    +
    +  $.fn.dropdown = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('dropdown')
    +      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
    +      if (typeof option == 'string') data[option].call($this)
    +    })
    +  }
    +
    +  $.fn.dropdown.Constructor = Dropdown
    +
    +
    +  /* APPLY TO STANDARD DROPDOWN ELEMENTS
    +   * =================================== */
    +
    +  $(function () {
    +    $('html')
    +      .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
    +    $('body')
    +      .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
    +      .on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
    +      .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
    +  })
    +
    +}(window.jQuery);/* =========================================================
    + * bootstrap-modal.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#modals
    + * =========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ========================================================= */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* MODAL CLASS DEFINITION
    +  * ====================== */
    +
    +  var Modal = function (element, options) {
    +    this.options = options
    +    this.$element = $(element)
    +      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
    +    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
    +  }
    +
    +  Modal.prototype = {
    +
    +      constructor: Modal
    +
    +    , toggle: function () {
    +        return this[!this.isShown ? 'show' : 'hide']()
    +      }
    +
    +    , show: function () {
    +        var that = this
    +          , e = $.Event('show')
    +
    +        this.$element.trigger(e)
    +
    +        if (this.isShown || e.isDefaultPrevented()) return
    +
    +        $('body').addClass('modal-open')
    +
    +        this.isShown = true
    +
    +        this.escape()
    +
    +        this.backdrop(function () {
    +          var transition = $.support.transition && that.$element.hasClass('fade')
    +
    +          if (!that.$element.parent().length) {
    +            that.$element.appendTo(document.body) //don't move modals dom position
    +          }
    +
    +          that.$element
    +            .show()
    +
    +          if (transition) {
    +            that.$element[0].offsetWidth // force reflow
    +          }
    +
    +          that.$element
    +            .addClass('in')
    +            .attr('aria-hidden', false)
    +            .focus()
    +
    +          that.enforceFocus()
    +
    +          transition ?
    +            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
    +            that.$element.trigger('shown')
    +
    +        })
    +      }
    +
    +    , hide: function (e) {
    +        e && e.preventDefault()
    +
    +        var that = this
    +
    +        e = $.Event('hide')
    +
    +        this.$element.trigger(e)
    +
    +        if (!this.isShown || e.isDefaultPrevented()) return
    +
    +        this.isShown = false
    +
    +        $('body').removeClass('modal-open')
    +
    +        this.escape()
    +
    +        $(document).off('focusin.modal')
    +
    +        this.$element
    +          .removeClass('in')
    +          .attr('aria-hidden', true)
    +
    +        $.support.transition && this.$element.hasClass('fade') ?
    +          this.hideWithTransition() :
    +          this.hideModal()
    +      }
    +
    +    , enforceFocus: function () {
    +        var that = this
    +        $(document).on('focusin.modal', function (e) {
    +          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
    +            that.$element.focus()
    +          }
    +        })
    +      }
    +
    +    , escape: function () {
    +        var that = this
    +        if (this.isShown && this.options.keyboard) {
    +          this.$element.on('keyup.dismiss.modal', function ( e ) {
    +            e.which == 27 && that.hide()
    +          })
    +        } else if (!this.isShown) {
    +          this.$element.off('keyup.dismiss.modal')
    +        }
    +      }
    +
    +    , hideWithTransition: function () {
    +        var that = this
    +          , timeout = setTimeout(function () {
    +              that.$element.off($.support.transition.end)
    +              that.hideModal()
    +            }, 500)
    +
    +        this.$element.one($.support.transition.end, function () {
    +          clearTimeout(timeout)
    +          that.hideModal()
    +        })
    +      }
    +
    +    , hideModal: function (that) {
    +        this.$element
    +          .hide()
    +          .trigger('hidden')
    +
    +        this.backdrop()
    +      }
    +
    +    , removeBackdrop: function () {
    +        this.$backdrop.remove()
    +        this.$backdrop = null
    +      }
    +
    +    , backdrop: function (callback) {
    +        var that = this
    +          , animate = this.$element.hasClass('fade') ? 'fade' : ''
    +
    +        if (this.isShown && this.options.backdrop) {
    +          var doAnimate = $.support.transition && animate
    +
    +          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
    +            .appendTo(document.body)
    +
    +          if (this.options.backdrop != 'static') {
    +            this.$backdrop.click($.proxy(this.hide, this))
    +          }
    +
    +          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
    +
    +          this.$backdrop.addClass('in')
    +
    +          doAnimate ?
    +            this.$backdrop.one($.support.transition.end, callback) :
    +            callback()
    +
    +        } else if (!this.isShown && this.$backdrop) {
    +          this.$backdrop.removeClass('in')
    +
    +          $.support.transition && this.$element.hasClass('fade')?
    +            this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
    +            this.removeBackdrop()
    +
    +        } else if (callback) {
    +          callback()
    +        }
    +      }
    +  }
    +
    +
    + /* MODAL PLUGIN DEFINITION
    +  * ======================= */
    +
    +  $.fn.modal = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('modal')
    +        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
    +      if (!data) $this.data('modal', (data = new Modal(this, options)))
    +      if (typeof option == 'string') data[option]()
    +      else if (options.show) data.show()
    +    })
    +  }
    +
    +  $.fn.modal.defaults = {
    +      backdrop: true
    +    , keyboard: true
    +    , show: true
    +  }
    +
    +  $.fn.modal.Constructor = Modal
    +
    +
    + /* MODAL DATA-API
    +  * ============== */
    +
    +  $(function () {
    +    $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
    +      var $this = $(this)
    +        , href = $this.attr('href')
    +        , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
    +        , option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
    +
    +      e.preventDefault()
    +
    +      $target
    +        .modal(option)
    +        .one('hide', function () {
    +          $this.focus()
    +        })
    +    })
    +  })
    +
    +}(window.jQuery);/* ===========================================================
    + * bootstrap-tooltip.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#tooltips
    + * Inspired by the original jQuery.tipsy by Jason Frame
    + * ===========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ========================================================== */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* TOOLTIP PUBLIC CLASS DEFINITION
    +  * =============================== */
    +
    +  var Tooltip = function (element, options) {
    +    this.init('tooltip', element, options)
    +  }
    +
    +  Tooltip.prototype = {
    +
    +    constructor: Tooltip
    +
    +  , init: function (type, element, options) {
    +      var eventIn
    +        , eventOut
    +
    +      this.type = type
    +      this.$element = $(element)
    +      this.options = this.getOptions(options)
    +      this.enabled = true
    +
    +      if (this.options.trigger == 'click') {
    +        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
    +      } else if (this.options.trigger != 'manual') {
    +        eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
    +        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
    +        this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
    +        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
    +      }
    +
    +      this.options.selector ?
    +        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
    +        this.fixTitle()
    +    }
    +
    +  , getOptions: function (options) {
    +      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
    +
    +      if (options.delay && typeof options.delay == 'number') {
    +        options.delay = {
    +          show: options.delay
    +        , hide: options.delay
    +        }
    +      }
    +
    +      return options
    +    }
    +
    +  , enter: function (e) {
    +      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
    +
    +      if (!self.options.delay || !self.options.delay.show) return self.show()
    +
    +      clearTimeout(this.timeout)
    +      self.hoverState = 'in'
    +      this.timeout = setTimeout(function() {
    +        if (self.hoverState == 'in') self.show()
    +      }, self.options.delay.show)
    +    }
    +
    +  , leave: function (e) {
    +      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
    +
    +      if (this.timeout) clearTimeout(this.timeout)
    +      if (!self.options.delay || !self.options.delay.hide) return self.hide()
    +
    +      self.hoverState = 'out'
    +      this.timeout = setTimeout(function() {
    +        if (self.hoverState == 'out') self.hide()
    +      }, self.options.delay.hide)
    +    }
    +
    +  , show: function () {
    +      var $tip
    +        , inside
    +        , pos
    +        , actualWidth
    +        , actualHeight
    +        , placement
    +        , tp
    +
    +      if (this.hasContent() && this.enabled) {
    +        $tip = this.tip()
    +        this.setContent()
    +
    +        if (this.options.animation) {
    +          $tip.addClass('fade')
    +        }
    +
    +        placement = typeof this.options.placement == 'function' ?
    +          this.options.placement.call(this, $tip[0], this.$element[0]) :
    +          this.options.placement
    +
    +        inside = /in/.test(placement)
    +
    +        $tip
    +          .remove()
    +          .css({ top: 0, left: 0, display: 'block' })
    +          .appendTo(inside ? this.$element : document.body)
    +
    +        pos = this.getPosition(inside)
    +
    +        actualWidth = $tip[0].offsetWidth
    +        actualHeight = $tip[0].offsetHeight
    +
    +        switch (inside ? placement.split(' ')[1] : placement) {
    +          case 'bottom':
    +            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
    +            break
    +          case 'top':
    +            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
    +            break
    +          case 'left':
    +            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
    +            break
    +          case 'right':
    +            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
    +            break
    +        }
    +
    +        $tip
    +          .css(tp)
    +          .addClass(placement)
    +          .addClass('in')
    +      }
    +    }
    +
    +  , setContent: function () {
    +      var $tip = this.tip()
    +        , title = this.getTitle()
    +
    +      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    +      $tip.removeClass('fade in top bottom left right')
    +    }
    +
    +  , hide: function () {
    +      var that = this
    +        , $tip = this.tip()
    +
    +      $tip.removeClass('in')
    +
    +      function removeWithAnimation() {
    +        var timeout = setTimeout(function () {
    +          $tip.off($.support.transition.end).remove()
    +        }, 500)
    +
    +        $tip.one($.support.transition.end, function () {
    +          clearTimeout(timeout)
    +          $tip.remove()
    +        })
    +      }
    +
    +      $.support.transition && this.$tip.hasClass('fade') ?
    +        removeWithAnimation() :
    +        $tip.remove()
    +
    +      return this
    +    }
    +
    +  , fixTitle: function () {
    +      var $e = this.$element
    +      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
    +        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
    +      }
    +    }
    +
    +  , hasContent: function () {
    +      return this.getTitle()
    +    }
    +
    +  , getPosition: function (inside) {
    +      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
    +        width: this.$element[0].offsetWidth
    +      , height: this.$element[0].offsetHeight
    +      })
    +    }
    +
    +  , getTitle: function () {
    +      var title
    +        , $e = this.$element
    +        , o = this.options
    +
    +      title = $e.attr('data-original-title')
    +        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
    +
    +      return title
    +    }
    +
    +  , tip: function () {
    +      return this.$tip = this.$tip || $(this.options.template)
    +    }
    +
    +  , validate: function () {
    +      if (!this.$element[0].parentNode) {
    +        this.hide()
    +        this.$element = null
    +        this.options = null
    +      }
    +    }
    +
    +  , enable: function () {
    +      this.enabled = true
    +    }
    +
    +  , disable: function () {
    +      this.enabled = false
    +    }
    +
    +  , toggleEnabled: function () {
    +      this.enabled = !this.enabled
    +    }
    +
    +  , toggle: function () {
    +      this[this.tip().hasClass('in') ? 'hide' : 'show']()
    +    }
    +
    +  , destroy: function () {
    +      this.hide().$element.off('.' + this.type).removeData(this.type)
    +    }
    +
    +  }
    +
    +
    + /* TOOLTIP PLUGIN DEFINITION
    +  * ========================= */
    +
    +  $.fn.tooltip = function ( option ) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('tooltip')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.tooltip.Constructor = Tooltip
    +
    +  $.fn.tooltip.defaults = {
    +    animation: true
    +  , placement: 'top'
    +  , selector: false
    +  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
    +  , trigger: 'hover'
    +  , title: ''
    +  , delay: 0
    +  , html: true
    +  }
    +
    +}(window.jQuery);
    +/* ===========================================================
    + * bootstrap-popover.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#popovers
    + * ===========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * =========================================================== */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* POPOVER PUBLIC CLASS DEFINITION
    +  * =============================== */
    +
    +  var Popover = function (element, options) {
    +    this.init('popover', element, options)
    +  }
    +
    +
    +  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
    +     ========================================== */
    +
    +  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
    +
    +    constructor: Popover
    +
    +  , setContent: function () {
    +      var $tip = this.tip()
    +        , title = this.getTitle()
    +        , content = this.getContent()
    +
    +      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
    +      $tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content)
    +
    +      $tip.removeClass('fade top bottom left right in')
    +    }
    +
    +  , hasContent: function () {
    +      return this.getTitle() || this.getContent()
    +    }
    +
    +  , getContent: function () {
    +      var content
    +        , $e = this.$element
    +        , o = this.options
    +
    +      content = $e.attr('data-content')
    +        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
    +
    +      return content
    +    }
    +
    +  , tip: function () {
    +      if (!this.$tip) {
    +        this.$tip = $(this.options.template)
    +      }
    +      return this.$tip
    +    }
    +
    +  , destroy: function () {
    +      this.hide().$element.off('.' + this.type).removeData(this.type)
    +    }
    +
    +  })
    +
    +
    + /* POPOVER PLUGIN DEFINITION
    +  * ======================= */
    +
    +  $.fn.popover = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('popover')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('popover', (data = new Popover(this, options)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.popover.Constructor = Popover
    +
    +  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
    +    placement: 'right'
    +  , trigger: 'click'
    +  , content: ''
    +  , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
    +  })
    +
    +}(window.jQuery);/* =============================================================
    + * bootstrap-scrollspy.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#scrollspy
    + * =============================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ============================================================== */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* SCROLLSPY CLASS DEFINITION
    +  * ========================== */
    +
    +  function ScrollSpy(element, options) {
    +    var process = $.proxy(this.process, this)
    +      , $element = $(element).is('body') ? $(window) : $(element)
    +      , href
    +    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
    +    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
    +    this.selector = (this.options.target
    +      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
    +      || '') + ' .nav li > a'
    +    this.$body = $('body')
    +    this.refresh()
    +    this.process()
    +  }
    +
    +  ScrollSpy.prototype = {
    +
    +      constructor: ScrollSpy
    +
    +    , refresh: function () {
    +        var self = this
    +          , $targets
    +
    +        this.offsets = $([])
    +        this.targets = $([])
    +
    +        $targets = this.$body
    +          .find(this.selector)
    +          .map(function () {
    +            var $el = $(this)
    +              , href = $el.data('target') || $el.attr('href')
    +              , $href = /^#\w/.test(href) && $(href)
    +            return ( $href
    +              && $href.length
    +              && [[ $href.position().top, href ]] ) || null
    +          })
    +          .sort(function (a, b) { return a[0] - b[0] })
    +          .each(function () {
    +            self.offsets.push(this[0])
    +            self.targets.push(this[1])
    +          })
    +      }
    +
    +    , process: function () {
    +        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
    +          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
    +          , maxScroll = scrollHeight - this.$scrollElement.height()
    +          , offsets = this.offsets
    +          , targets = this.targets
    +          , activeTarget = this.activeTarget
    +          , i
    +
    +        if (scrollTop >= maxScroll) {
    +          return activeTarget != (i = targets.last()[0])
    +            && this.activate ( i )
    +        }
    +
    +        for (i = offsets.length; i--;) {
    +          activeTarget != targets[i]
    +            && scrollTop >= offsets[i]
    +            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
    +            && this.activate( targets[i] )
    +        }
    +      }
    +
    +    , activate: function (target) {
    +        var active
    +          , selector
    +
    +        this.activeTarget = target
    +
    +        $(this.selector)
    +          .parent('.active')
    +          .removeClass('active')
    +
    +        selector = this.selector
    +          + '[data-target="' + target + '"],'
    +          + this.selector + '[href="' + target + '"]'
    +
    +        active = $(selector)
    +          .parent('li')
    +          .addClass('active')
    +
    +        if (active.parent('.dropdown-menu').length)  {
    +          active = active.closest('li.dropdown').addClass('active')
    +        }
    +
    +        active.trigger('activate')
    +      }
    +
    +  }
    +
    +
    + /* SCROLLSPY PLUGIN DEFINITION
    +  * =========================== */
    +
    +  $.fn.scrollspy = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('scrollspy')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.scrollspy.Constructor = ScrollSpy
    +
    +  $.fn.scrollspy.defaults = {
    +    offset: 10
    +  }
    +
    +
    + /* SCROLLSPY DATA-API
    +  * ================== */
    +
    +  $(window).on('load', function () {
    +    $('[data-spy="scroll"]').each(function () {
    +      var $spy = $(this)
    +      $spy.scrollspy($spy.data())
    +    })
    +  })
    +
    +}(window.jQuery);/* ========================================================
    + * bootstrap-tab.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#tabs
    + * ========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ======================================================== */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* TAB CLASS DEFINITION
    +  * ==================== */
    +
    +  var Tab = function (element) {
    +    this.element = $(element)
    +  }
    +
    +  Tab.prototype = {
    +
    +    constructor: Tab
    +
    +  , show: function () {
    +      var $this = this.element
    +        , $ul = $this.closest('ul:not(.dropdown-menu)')
    +        , selector = $this.attr('data-target')
    +        , previous
    +        , $target
    +        , e
    +
    +      if (!selector) {
    +        selector = $this.attr('href')
    +        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    +      }
    +
    +      if ( $this.parent('li').hasClass('active') ) return
    +
    +      previous = $ul.find('.active a').last()[0]
    +
    +      e = $.Event('show', {
    +        relatedTarget: previous
    +      })
    +
    +      $this.trigger(e)
    +
    +      if (e.isDefaultPrevented()) return
    +
    +      $target = $(selector)
    +
    +      this.activate($this.parent('li'), $ul)
    +      this.activate($target, $target.parent(), function () {
    +        $this.trigger({
    +          type: 'shown'
    +        , relatedTarget: previous
    +        })
    +      })
    +    }
    +
    +  , activate: function ( element, container, callback) {
    +      var $active = container.find('> .active')
    +        , transition = callback
    +            && $.support.transition
    +            && $active.hasClass('fade')
    +
    +      function next() {
    +        $active
    +          .removeClass('active')
    +          .find('> .dropdown-menu > .active')
    +          .removeClass('active')
    +
    +        element.addClass('active')
    +
    +        if (transition) {
    +          element[0].offsetWidth // reflow for transition
    +          element.addClass('in')
    +        } else {
    +          element.removeClass('fade')
    +        }
    +
    +        if ( element.parent('.dropdown-menu') ) {
    +          element.closest('li.dropdown').addClass('active')
    +        }
    +
    +        callback && callback()
    +      }
    +
    +      transition ?
    +        $active.one($.support.transition.end, next) :
    +        next()
    +
    +      $active.removeClass('in')
    +    }
    +  }
    +
    +
    + /* TAB PLUGIN DEFINITION
    +  * ===================== */
    +
    +  $.fn.tab = function ( option ) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('tab')
    +      if (!data) $this.data('tab', (data = new Tab(this)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.tab.Constructor = Tab
    +
    +
    + /* TAB DATA-API
    +  * ============ */
    +
    +  $(function () {
    +    $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
    +      e.preventDefault()
    +      $(this).tab('show')
    +    })
    +  })
    +
    +}(window.jQuery);/* =============================================================
    + * bootstrap-typeahead.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#typeahead
    + * =============================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ============================================================ */
    +
    +
    +!function($){
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* TYPEAHEAD PUBLIC CLASS DEFINITION
    +  * ================================= */
    +
    +  var Typeahead = function (element, options) {
    +    this.$element = $(element)
    +    this.options = $.extend({}, $.fn.typeahead.defaults, options)
    +    this.matcher = this.options.matcher || this.matcher
    +    this.sorter = this.options.sorter || this.sorter
    +    this.highlighter = this.options.highlighter || this.highlighter
    +    this.updater = this.options.updater || this.updater
    +    this.$menu = $(this.options.menu).appendTo('body')
    +    this.source = this.options.source
    +    this.shown = false
    +    this.listen()
    +  }
    +
    +  Typeahead.prototype = {
    +
    +    constructor: Typeahead
    +
    +  , select: function () {
    +      var val = this.$menu.find('.active').attr('data-value')
    +      this.$element
    +        .val(this.updater(val))
    +        .change()
    +      return this.hide()
    +    }
    +
    +  , updater: function (item) {
    +      return item
    +    }
    +
    +  , show: function () {
    +      var pos = $.extend({}, this.$element.offset(), {
    +        height: this.$element[0].offsetHeight
    +      })
    +
    +      this.$menu.css({
    +        top: pos.top + pos.height
    +      , left: pos.left
    +      })
    +
    +      this.$menu.show()
    +      this.shown = true
    +      return this
    +    }
    +
    +  , hide: function () {
    +      this.$menu.hide()
    +      this.shown = false
    +      return this
    +    }
    +
    +  , lookup: function (event) {
    +      var items
    +
    +      this.query = this.$element.val()
    +
    +      if (!this.query || this.query.length < this.options.minLength) {
    +        return this.shown ? this.hide() : this
    +      }
    +
    +      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
    +
    +      return items ? this.process(items) : this
    +    }
    +
    +  , process: function (items) {
    +      var that = this
    +
    +      items = $.grep(items, function (item) {
    +        return that.matcher(item)
    +      })
    +
    +      items = this.sorter(items)
    +
    +      if (!items.length) {
    +        return this.shown ? this.hide() : this
    +      }
    +
    +      return this.render(items.slice(0, this.options.items)).show()
    +    }
    +
    +  , matcher: function (item) {
    +      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
    +    }
    +
    +  , sorter: function (items) {
    +      var beginswith = []
    +        , caseSensitive = []
    +        , caseInsensitive = []
    +        , item
    +
    +      while (item = items.shift()) {
    +        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
    +        else if (~item.indexOf(this.query)) caseSensitive.push(item)
    +        else caseInsensitive.push(item)
    +      }
    +
    +      return beginswith.concat(caseSensitive, caseInsensitive)
    +    }
    +
    +  , highlighter: function (item) {
    +      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
    +      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
    +        return '<strong>' + match + '</strong>'
    +      })
    +    }
    +
    +  , render: function (items) {
    +      var that = this
    +
    +      items = $(items).map(function (i, item) {
    +        i = $(that.options.item).attr('data-value', item)
    +        i.find('a').html(that.highlighter(item))
    +        return i[0]
    +      })
    +
    +      items.first().addClass('active')
    +      this.$menu.html(items)
    +      return this
    +    }
    +
    +  , next: function (event) {
    +      var active = this.$menu.find('.active').removeClass('active')
    +        , next = active.next()
    +
    +      if (!next.length) {
    +        next = $(this.$menu.find('li')[0])
    +      }
    +
    +      next.addClass('active')
    +    }
    +
    +  , prev: function (event) {
    +      var active = this.$menu.find('.active').removeClass('active')
    +        , prev = active.prev()
    +
    +      if (!prev.length) {
    +        prev = this.$menu.find('li').last()
    +      }
    +
    +      prev.addClass('active')
    +    }
    +
    +  , listen: function () {
    +      this.$element
    +        .on('blur',     $.proxy(this.blur, this))
    +        .on('keypress', $.proxy(this.keypress, this))
    +        .on('keyup',    $.proxy(this.keyup, this))
    +
    +      if ($.browser.chrome || $.browser.webkit || $.browser.msie) {
    +        this.$element.on('keydown', $.proxy(this.keydown, this))
    +      }
    +
    +      this.$menu
    +        .on('click', $.proxy(this.click, this))
    +        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
    +    }
    +
    +  , move: function (e) {
    +      if (!this.shown) return
    +
    +      switch(e.keyCode) {
    +        case 9: // tab
    +        case 13: // enter
    +        case 27: // escape
    +          e.preventDefault()
    +          break
    +
    +        case 38: // up arrow
    +          e.preventDefault()
    +          this.prev()
    +          break
    +
    +        case 40: // down arrow
    +          e.preventDefault()
    +          this.next()
    +          break
    +      }
    +
    +      e.stopPropagation()
    +    }
    +
    +  , keydown: function (e) {
    +      this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40,38,9,13,27])
    +      this.move(e)
    +    }
    +
    +  , keypress: function (e) {
    +      if (this.suppressKeyPressRepeat) return
    +      this.move(e)
    +    }
    +
    +  , keyup: function (e) {
    +      switch(e.keyCode) {
    +        case 40: // down arrow
    +        case 38: // up arrow
    +          break
    +
    +        case 9: // tab
    +        case 13: // enter
    +          if (!this.shown) return
    +          this.select()
    +          break
    +
    +        case 27: // escape
    +          if (!this.shown) return
    +          this.hide()
    +          break
    +
    +        default:
    +          this.lookup()
    +      }
    +
    +      e.stopPropagation()
    +      e.preventDefault()
    +  }
    +
    +  , blur: function (e) {
    +      var that = this
    +      setTimeout(function () { that.hide() }, 150)
    +    }
    +
    +  , click: function (e) {
    +      e.stopPropagation()
    +      e.preventDefault()
    +      this.select()
    +    }
    +
    +  , mouseenter: function (e) {
    +      this.$menu.find('.active').removeClass('active')
    +      $(e.currentTarget).addClass('active')
    +    }
    +
    +  }
    +
    +
    +  /* TYPEAHEAD PLUGIN DEFINITION
    +   * =========================== */
    +
    +  $.fn.typeahead = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('typeahead')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.typeahead.defaults = {
    +    source: []
    +  , items: 8
    +  , menu: '<ul class="typeahead dropdown-menu"></ul>'
    +  , item: '<li><a href="#"></a></li>'
    +  , minLength: 1
    +  }
    +
    +  $.fn.typeahead.Constructor = Typeahead
    +
    +
    + /*   TYPEAHEAD DATA-API
    +  * ================== */
    +
    +  $(function () {
    +    $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
    +      var $this = $(this)
    +      if ($this.data('typeahead')) return
    +      e.preventDefault()
    +      $this.typeahead($this.data())
    +    })
    +  })
    +
    +}(window.jQuery);
    +/* ==========================================================
    + * bootstrap-affix.js v2.1.1
    + * http://twitter.github.com/bootstrap/javascript.html#affix
    + * ==========================================================
    + * Copyright 2012 Twitter, Inc.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + * ========================================================== */
    +
    +
    +!function ($) {
    +
    +  "use strict"; // jshint ;_;
    +
    +
    + /* AFFIX CLASS DEFINITION
    +  * ====================== */
    +
    +  var Affix = function (element, options) {
    +    this.options = $.extend({}, $.fn.affix.defaults, options)
    +    this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
    +    this.$element = $(element)
    +    this.checkPosition()
    +  }
    +
    +  Affix.prototype.checkPosition = function () {
    +    if (!this.$element.is(':visible')) return
    +
    +    var scrollHeight = $(document).height()
    +      , scrollTop = this.$window.scrollTop()
    +      , position = this.$element.offset()
    +      , offset = this.options.offset
    +      , offsetBottom = offset.bottom
    +      , offsetTop = offset.top
    +      , reset = 'affix affix-top affix-bottom'
    +      , affix
    +
    +    if (typeof offset != 'object') offsetBottom = offsetTop = offset
    +    if (typeof offsetTop == 'function') offsetTop = offset.top()
    +    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
    +
    +    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
    +      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
    +      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
    +      'top'    : false
    +
    +    if (this.affixed === affix) return
    +
    +    this.affixed = affix
    +    this.unpin = affix == 'bottom' ? position.top - scrollTop : null
    +
    +    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
    +  }
    +
    +
    + /* AFFIX PLUGIN DEFINITION
    +  * ======================= */
    +
    +  $.fn.affix = function (option) {
    +    return this.each(function () {
    +      var $this = $(this)
    +        , data = $this.data('affix')
    +        , options = typeof option == 'object' && option
    +      if (!data) $this.data('affix', (data = new Affix(this, options)))
    +      if (typeof option == 'string') data[option]()
    +    })
    +  }
    +
    +  $.fn.affix.Constructor = Affix
    +
    +  $.fn.affix.defaults = {
    +    offset: 0
    +  }
    +
    +
    + /* AFFIX DATA-API
    +  * ============== */
    +
    +  $(window).on('load', function () {
    +    $('[data-spy="affix"]').each(function () {
    +      var $spy = $(this)
    +        , data = $spy.data()
    +
    +      data.offset = data.offset || {}
    +
    +      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
    +      data.offsetTop && (data.offset.top = data.offsetTop)
    +
    +      $spy.affix(data)
    +    })
    +  })
    +
    +
    +}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/bootstrap.min.js b/src/main/webapp/plug-in/bootstrap/js/bootstrap.min.js
    new file mode 100644
    index 00000000..760afbdf
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/bootstrap.min.js
    @@ -0,0 +1,6 @@
    +/**
    +* Bootstrap.js v2.1.1 by @fat & @mdo
    +* Copyright 2012 Twitter, Inc.
    +* http://www.apache.org/licenses/LICENSE-2.0.txt
    +*/
    +!function(e){e(function(){"use strict";e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()},e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e(function(){e("body").on("click.alert.data-api",t,n.prototype.close)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")},e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e(function(){e("body").on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=n,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},to:function(t){var n=this.$element.find(".item.active"),r=n.parent().children(),i=r.index(n),s=this;if(t>r.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){s.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",e(r[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f=e.Event("slide",{relatedTarget:i[0]});this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u]();if(i.hasClass("active"))return;if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}},e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e(function(){e("body").on("click.carousel.data-api","[data-slide]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=!i.data("modal")&&e.extend({},i.data(),n.data());i.carousel(s),t.preventDefault()})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning)return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning)return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=typeof n=="object"&&n;i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e(function(){e("body").on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})})}(window.jQuery),!function(e){"use strict";function r(){i(e(t)).removeClass("open")}function i(t){var n=t.attr("data-target"),r;return n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=e(n),r.length||(r=t.parent()),r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||(s.toggleClass("open"),n.focus()),!1},keydown:function(t){var n,r,s,o,u,a;if(!/(38|40|27)/.test(t.keyCode))return;n=e(this),t.preventDefault(),t.stopPropagation();if(n.is(".disabled, :disabled"))return;o=i(n),u=o.hasClass("open");if(!u||u&&t.keyCode==27)return n.click();r=e("[role=menu] li:not(.divider) a",o);if(!r.length)return;a=r.index(r.filter(":focus")),t.keyCode==38&&a>0&&a--,t.keyCode==40&&a<r.length-1&&a++,~a||(a=0),r.eq(a).focus()}},e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e(function(){e("html").on("click.dropdown.data-api touchstart.dropdown.data-api",r),e("body").on("click.dropdown touchstart.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;e("body").addClass("modal-open"),this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1).focus(),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.trigger("shown")}):t.$element.trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,e("body").removeClass("modal-open"),this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(e){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,e.proxy(this.removeBackdrop,this)):this.removeBackdrop()):t&&t()}},e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e(function(){e("body").on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):this.options.trigger!="manual"&&(i=this.options.trigger=="hover"?"mouseenter":"focus",s=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this))),this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,t,this.$element.data()),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);if(!n.options.delay||!n.options.delay.show)return n.show();clearTimeout(this.timeout),n.hoverState="in",this.timeout=setTimeout(function(){n.hoverState=="in"&&n.show()},n.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var e,t,n,r,i,s,o;if(this.hasContent()&&this.enabled){e=this.tip(),this.setContent(),this.options.animation&&e.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,t=/in/.test(s),e.remove().css({top:0,left:0,display:"block"}).appendTo(t?this.$element:document.body),n=this.getPosition(t),r=e[0].offsetWidth,i=e[0].offsetHeight;switch(t?s.split(" ")[1]:s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}e.css(o).addClass(s).addClass("in")}},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function r(){var t=setTimeout(function(){n.off(e.support.transition.end).remove()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.remove()})}var t=this,n=this.tip();return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?r():n.remove(),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(t){return e.extend({},t?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0,html:!0}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content > *")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-content")||(typeof n.content=="function"?n.content.call(t[0]):n.content),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var t=e(this),n=t.data("target")||t.attr("href"),r=/^#\w/.test(n)&&e(n);return r&&r.length&&[[r.position().top,n]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}},e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active a").last()[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}},e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e(function(){e("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=e(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:t.top+t.height,left:t.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),(e.browser.chrome||e.browser.webkit||e.browser.msie)&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this))},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=!~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(e){var t=this;setTimeout(function(){t.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(t){this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")}},e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e(function(){e("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;t.preventDefault(),n.typeahead(n.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))},e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/customize.js b/src/main/webapp/plug-in/bootstrap/js/customize.js
    new file mode 100644
    index 00000000..9fbf13ae
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/customize.js
    @@ -0,0 +1,30 @@
    +$(function(){
    +  $('#backdroptrue').on('click',function(evt){
    +    $('#modalbackdroptrue').modal({
    +      backdrop:true
    +    });
    +  });
    +
    +  $('#backdropfalse').on('click',function(evt){
    +    $('#modalbackdropfalse').modal({
    +      backdrop:false
    +    });
    +  });
    +
    +  $('#keyboardtrue').on('click',function(evt){
    +    $('#modalkeyboardtrue').modal({
    +      keyboard:true
    +    });
    +  });
    +
    +  $('#keyboardfalse').on('click',function(evt){
    +    $('#modalkeyboardfalse').modal({
    +      keyboard:false
    +    });
    +  });
    +
    +  $('#amodaltoggle').on('click',function(evt){
    +    $('#modaltoggle').modal('toggle');
    +  });
    +
    +});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/html5.js b/src/main/webapp/plug-in/bootstrap/js/html5.js
    new file mode 100644
    index 00000000..560aa942
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/html5.js
    @@ -0,0 +1,3 @@
    +/*! HTML5 Shiv vpre3.6 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
    +  Uncompressed source: https://github.com/aFarkas/html5shiv  */
    +(function(a,b){function h(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function i(){var a=l.elements;return typeof a=="string"?a.split(" "):a}function j(a){var b={},c=a.createElement,f=a.createDocumentFragment,g=f();a.createElement=function(a){if(!l.shivMethods)return c(a);var f;return b[a]?f=b[a].cloneNode():e.test(a)?f=(b[a]=c(a)).cloneNode():f=c(a),f.canHaveChildren&&!d.test(a)?g.appendChild(f):f},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+i().join().replace(/\w+/g,function(a){return c(a),g.createElement(a),'c("'+a+'")'})+");return n}")(l,g)}function k(a){var b;return a.documentShived?a:(l.shivCSS&&!f&&(b=!!h(a,"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}")),g||(b=!j(a)),b&&(a.documentShived=b),a)}var c=a.html5||{},d=/^<|^(?:button|form|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i,f,g;(function(){var c=b.createElement("a");c.innerHTML="<xyz></xyz>",f="hidden"in c,f&&typeof injectElementWithStyles=="function"&&injectElementWithStyles("#modernizr{}",function(b){b.hidden=!0,f=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle).display=="none"}),g=c.childNodes.length==1||function(){try{b.createElement("a")}catch(a){return!0}var c=b.createDocumentFragment();return typeof c.cloneNode=="undefined"||typeof c.createDocumentFragment=="undefined"||typeof c.createElement=="undefined"}()})();var l={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:k};a.html5=l,k(b)})(this,document)
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/bootstrap/js/prettify.js b/src/main/webapp/plug-in/bootstrap/js/prettify.js
    new file mode 100644
    index 00000000..eef5ad7e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/bootstrap/js/prettify.js
    @@ -0,0 +1,28 @@
    +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
    +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
    +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
    +f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
    +(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
    +{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
    +t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
    +"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
    +l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
    +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
    +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
    +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
    +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
    +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
    +m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
    +a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
    +j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
    +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
    +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
    +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
    +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
    +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
    +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
    +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
    +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
    +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
    +250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
    +PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
    diff --git a/src/main/webapp/plug-in/cgform/fields/cgformOfCheck.html b/src/main/webapp/plug-in/cgform/fields/cgformOfCheck.html
    new file mode 100644
    index 00000000..1d232c27
    --- /dev/null
    +++ b/src/main/webapp/plug-in/cgform/fields/cgformOfCheck.html
    @@ -0,0 +1,61 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    +<script type="text/javascript" src="../../jquery/jquery-1.8.3.js"></script>
    +
    +<script>
    +	var parentObj =window.parent;
    +	//var langurl = parentObj.langurl.value;
    +	var langurl = parentObj.document.getElementById("langurl").value;
    +	var mutiLangScript = "<script type='text/javascript' src='" + langurl + "'><\/script>";
    +	document.write(mutiLangScript);
    +</script>
    +
    +</head>
    +<body>
    +	<div>
    +	<table>
    +		<tbody id="template_header_check">
    +			<tr bgcolor="#E6E6E6" >
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="fieldname">瀛楁鍚嶇О</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="fieldremark">瀛楁澶囨敞</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="fieldhref">瀛楁Href</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="validaterule">鏍¢獙瑙勫垯</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="dicttable">瀛楀吀Table</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="dictcode">瀛楀吀Code</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="dicttext">瀛楀吀Text</th>
    +			</tr>
    +		</tbody>
    +		<tbody id="add_column_table_template_check">
    +			<tr>
    +				<td align="left"><input style="width: 120px;" type="text"
    +					name="columnsfieldName_index"
    +					readonly="readonly" /></td>
    +				<td align="left"><input style="width: 120px;" type="text"
    +					name="columnscontent_index"
    +					readonly="readonly" /></td>
    +				<td align="left"><input name="columns[#index#].fieldHref"
    +					type="text" style="width: 120px;"></td>
    +				<td align="left"><input name="columns[#index#].fieldValidType"
    +					type="text" style="width: 120px;"></td>
    +				<td align="left"><input name="columns[#index#].dictTable"
    +					maxlength="160" type="text" style="width: 120px;"></td>
    +				<td align="left"><input name="columns[#index#].dictField"
    +					maxlength="160" type="text" style="width: 120px;"></td>
    +				<td align="left"><input name="columns[#index#].dictText"
    +					maxlength="160" type="text" style="width: 120px;"></td>
    +			</tr>
    +		</tbody>
    +	</table>
    +</div>
    +</body>
    +</html>
    +
    +<script>
    +$(document).ready(function(){
    +	$("[mutiLang_id]").each(function() {
    +		this.innerText = eval(this.attributes["mutiLang_id"].value);
    +	});
    +})
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/cgform/fields/cgformOfDatabase.html b/src/main/webapp/plug-in/cgform/fields/cgformOfDatabase.html
    new file mode 100644
    index 00000000..e5ecc5a3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/cgform/fields/cgformOfDatabase.html
    @@ -0,0 +1,125 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    +
    +<script type="text/javascript" src="../../jquery/jquery-1.8.3.js"></script>
    +<script>
    +	var parentObj =window.parent;
    +	//var langurl = parentObj.langurl.value;
    +	var langurl = parentObj.document.getElementById("langurl").value;
    +	var mutiLangScript = "<script type='text/javascript' src='" + langurl + "'><\/script>";
    +	document.write(mutiLangScript);
    +</script>
    +
    +</head>
    +<body>
    +	<div>
    +	<table>
    +		<tbody id="template_header_database">
    +			<tr bgcolor="#E6E6E6">
    +				<!-- 澧炲姞搴忓彿琛ㄥご -->
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="sequence">搴忓彿</th>
    +				<th style="display: none;"><input style="display: none;"></th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="operation">鎿嶄綔</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="fieldname">瀛楁鍚嶇О</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="fieldremark">瀛楁澶囨敞</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="fieldlength">瀛楁闀垮害</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="decimal">灏忔暟鐐</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="defaultvalue">榛樿鍊</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="fieldtype">瀛楁绫诲瀷</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="pk">涓婚敭</th>
    +				<th style="display: none;"><input style="display: none;"></th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="allowempty">鍏佽绌哄</th>
    +			</tr>
    +		</tbody>
    +		<tbody id="add_column_table_template_database">
    +			<tr>
    +				<!-- 澧炲姞琛屽簭鍙<a>鏍囩 -->
    +				<td><a name="rownumber[#rindex#]"></a></td>
    +				<td style="display: none;"><input style="display: none;" name="columns[#index#].id"
    +					value=""></td>
    +				<td align="left"><input style="width: 20px;" type="checkbox"
    +					name="ck" /></td>
    +				<td align="left">
    +					<input style="width: 120px;" type="text" name="columns[#index#].fieldName" nullmsg="pleaseinputfilename"
    +					datatype="s1-30,/^[a-z\d_]+$/" errormsg="filenamecannotuppercase" class="fieldNameInput" />
    +					
    +					<input style="width: 120px;" type="hidden" name="columns[#index#].oldFieldName"  />
    +				</td>
    +				<td align="left">
    +					
    +					<input style="width: 120px;" type="text" name="columns[#index#].content" nullmsg="pleaseinputfilecomment" 
    +					datatype="s2-14" errormsg="fieldcommentfromtwotofourteen" class="contentInput" />
    +				</td>
    +				
    +				<td align="left">
    +					<input name="columns[#index#].length" nullmsg="pleaseinputfilelength" datatype="n1-4" errormsg="fieldlengthfromonetofour"
    +					maxlength="4" type="text" value="32" style="width: 60px;">
    +				</td>
    +				
    +				<td align="left">
    +					<input name="columns[#index#].pointLength" nullmsg="pleaseinputdicemallength" datatype="n1-2" errormsg="dicemallengthfromonetotwo"
    +					type="text" value="0" style="width: 60px;">
    +				</td>
    +				
    +				<td align="left">
    +					<input name="columns[#index#].fieldDefault" datatype="*1-20" errormsg="defaultvaluelessthantwenty" ignore="ignore"
    +					type="text" value="" style="width: 60px;">
    +				</td>
    +				
    +				<td align="left">
    +					<select name="columns[#index#].type">
    +						<option value="string">String</option>
    +						<option value="int">Integer</option>
    +						<option value="double">Double</option>
    +						<option value="Date">Date</option>
    +						<option value="BigDecimal">BigDecimal</option>
    +						<option value="Text">Text</option>
    +						<option value="Blob">Blob</option>
    +					</select>
    +				</td>
    +				
    +				<td align="left">
    +					<input type="checkbox" style="width: 20px;" name="columns[#index#].isKey">
    +				</td>
    +				
    +				<td align="left" style="display: none;">
    +					<input name="columns[#index#].orderNum" maxlength="2" nullmsg="pleaseinputfieldsquence" datatype="n1-2"
    +					errormsg="fieldsquencefromonetotwo" type="hidden" value="0"
    +					style="display: none;">
    +				</td>
    +				
    +				<td align="left">
    +					<input type="checkbox" style="width: 50px;" name="columns[#index#].isNull" checked="checked">
    +				</td>
    +			</tr>
    +		</tbody>
    +	</table>
    +</div>
    +</body>
    +</html>
    +
    +<script>
    +$(document).ready(function(){
    +	$("[mutiLang_id]").each(function() {
    +		this.innerText = eval(this.attributes["mutiLang_id"].value);
    +	});
    +	
    +	
    +	$("input:text").each(function(){
    +		var nullmsg = $(this).attr("nullmsg");
    +		var errormsg = $(this).attr("errormsg");
    +		
    +		if (typeof(nullmsg) != "undefined")
    +		{
    +			this.attributes["nullmsg"].value = eval(nullmsg); 
    +		}
    +		
    +		if (typeof(errormsg) != "undefined")
    +		{
    +			this.attributes["errormsg"].value = eval(errormsg); 
    +		}
    +	});
    +})
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/cgform/fields/cgformOfForeignKey.html b/src/main/webapp/plug-in/cgform/fields/cgformOfForeignKey.html
    new file mode 100644
    index 00000000..3372534c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/cgform/fields/cgformOfForeignKey.html
    @@ -0,0 +1,54 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    +
    +<script type="text/javascript" src="../../jquery/jquery-1.8.3.js"></script>
    +
    +<script>
    +	var parentObj =window.parent;
    +	//var langurl = parentObj.langurl.value;
    +	var langurl = parentObj.document.getElementById("langurl").value;
    +	var mutiLangScript = "<script type='text/javascript' src='" + langurl + "'><\/script>";
    +	document.write(mutiLangScript);
    +</script>
    +
    +</head>
    +<body>
    +	<div>
    +	<table>
    +		<tbody id="template_header_key">
    +			<tr bgcolor="#E6E6E6">
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="fieldname">瀛楁鍚嶇О</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="fieldremark">瀛楁澶囨敞</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="mastertablename">涓昏〃鍚</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="mastertablefield">涓昏〃瀛楁</th>
    +			</tr>
    +		</tbody>
    +		<tbody id="add_column_table_template_key">
    +			<tr>
    +				<td align="left"><input style="width: 120px;" type="text"
    +					name="columnsfieldName_index"
    +					readonly="readonly" /></td>
    +				<td align="left"><input style="width: 120px;" type="text"
    +					name="columnscontent_index"
    +					readonly="readonly" /></td>
    +				<td align="left"><input name="columns[#index#].mainTable"
    +					maxlength="150" type="text" style="width: 120px;"></td>
    +				<td align="left"><input name="columns[#index#].mainField"
    +					maxlength="150" type="text" style="width: 120px;"></td>
    +
    +			</tr>
    +		</tbody>
    +	</table>
    +</div>
    +</body>
    +</html>
    +
    +<script>
    +$(document).ready(function(){
    +	$("[mutiLang_id]").each(function() {
    +		this.innerText = eval(this.attributes["mutiLang_id"].value);
    +	});
    +})
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/cgform/fields/cgformOfPage.html b/src/main/webapp/plug-in/cgform/fields/cgformOfPage.html
    new file mode 100644
    index 00000000..b3f30a51
    --- /dev/null
    +++ b/src/main/webapp/plug-in/cgform/fields/cgformOfPage.html
    @@ -0,0 +1,77 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    +
    +<script type="text/javascript" src="../../jquery/jquery-1.8.3.js"></script>
    +
    +<script>
    +	var parentObj =window.parent;
    +	//var langurl = parentObj.langurl.value;
    +	var langurl = parentObj.document.getElementById("langurl").value;
    +	var mutiLangScript = "<script type='text/javascript' src='" + langurl + "'><\/script>";
    +	document.write(mutiLangScript);
    +</script>
    +
    +</head>
    +<body>
    +	<div>
    +	<table>
    +		<tbody id="template_header_page">
    +			<tr bgcolor="#E6E6E6">
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="fieldname">瀛楁鍚嶇О</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="fieldremark">瀛楁澶囨敞</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="formdisplay">琛ㄥ崟鏄剧ず</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="griddisplay">鍒楄〃鏄剧ず</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="controltype">鎺т欢绫诲瀷</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="controllength">鎺т欢闀垮害</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="isquery">鏄惁鏌ヨ</th>
    +				<th align="center" bgcolor="#EEEEEE" mutiLang_id="querytype">鏌ヨ绫诲瀷</th>
    +			</tr>
    +		</tbody>
    +		<tbody id="add_column_table_template_page">
    +			<tr>
    +				<td align="left"><input style="width: 120px;" type="text"
    +					name="columnsfieldName_index"
    +					readonly="readonly" /></td>
    +				<td align="left"><input style="width: 120px;" type="text"
    +					name="columnscontent_index"
    +					readonly="readonly" /></td>
    +				<td align="left"><input type="checkbox" checked="checked"
    +					name="columns[#index#].isShow" style="width: 50px;"></td>
    +				<td align="left"><input type="checkbox" checked="checked"
    +					name="columns[#index#].isShowList" style="width: 50px;"></td>
    +				<td align="left"><select name="columns[#index#].showType">
    +						<option value="text">text</option>
    +						<option value="password">password</option>
    +						<option value="radio">radio</option>
    +						<option value="checkbox">checkbox</option>
    +						<option value="date">date</option>
    +						<option value="datetime">datetime</option>
    +						<option value="file">file</option>
    +						<option value="textarea">textarea</option>
    +						<option value="list">select</option>
    +						<option value="popup">popup</option>
    +				</select></td>
    +				<td align="left"><input name="columns[#index#].fieldLength"
    +					value="120" type="text" style="width: 60px;"></td>
    +				<td align="left"><input type="checkbox"
    +					name="columns[#index#].isQuery" style="width: 50px;"></td>
    +				<td align="left"><select name="columns[#index#].queryMode">
    +						<option value="single">single</option>
    +						<option value="group">group</option>
    +				</select></td>
    +			</tr>
    +		</tbody>
    +	</table>
    +</div>
    +</body>
    +</html>
    +
    +<script>
    +$(document).ready(function(){
    +	$("[mutiLang_id]").each(function() {
    +		this.innerText = eval(this.attributes["mutiLang_id"].value);
    +	});
    +})
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/cgform/js/cgformField.js b/src/main/webapp/plug-in/cgform/js/cgformField.js
    new file mode 100644
    index 00000000..e66005f0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/cgform/js/cgformField.js
    @@ -0,0 +1,394 @@
    +var filedTypes = ['check', 'database', 'key', 'page'];
    +var headerTr = "template_header_";
    +var bodytr = "add_column_table_template_";
    +var iframeId = "iframe_";
    +var fieldData = [];// 瀛楁鐨勬暟鎹
    +var iframeLoadNumber = 0; // 褰撳墠鍔犺浇鐨処frame鐨勬暟閲
    +var rownumber = 0 ;//鏍囪瘑褰撳墠搴忓彿
    +var toDelete = [];  //淇濆瓨琛ㄥ崟寰呭垹闄ゅ睘鎬у瓧娈礽d
    +$(document).ready(iframeLoaded());
    +$("#iframe_check").load(iframeLoaded());
    +$("#iframe_database").load(iframeLoaded());
    +$("#iframe_key").load(iframeLoaded());
    +$("#iframe_page").load(iframeLoaded());
    +
    +function iframeLoaded() {
    +	iframeLoadNumber++;
    +	if (iframeLoadNumber == 5) {
    +		$(".datagrid-toolbar").parent().css("width", "auto");
    +		setTimeout(initData, 500);
    +	}
    +}
    +var fixHelper = function(e, ui) {
    +    ui.children().each(function() {
    +        $(this).width($(this).width());
    +    });
    +    return ui;
    +};
    +setTimeout(function(){
    +	$("#tab_div_database tbody").sortable({
    +	    helper: fixHelper,
    +	    items: '> tr',
    +	    forcePlaceholderSize: true,
    +	    stop: function (event, ui) {
    +	    	var textContent = ui.item.context.innerText?
    +	    			ui.item.context.innerText.toString():
    +	    				ui.item.context.textContent.toString();
    +	    	var endString = textContent.indexOf("S")!=-1?textContent.indexOf("S"):textContent.length;
    +	    	var startRownum = textContent.substring(0,endString).replace(/(^\s*)|(\s*$)/g,'');
    +	    	var targetIndex = ui.item.context.rowIndex;
    +	    	for (var i = 0; i < filedTypes.length; i++) {
    +	    		if(filedTypes[i] == "database" && startRownum != (targetIndex + 1)) continue;
    +	    		if(startRownum == (targetIndex + 1)){  //澶勭悊褰撳墠琛屽拰涓嬩竴琛屼氦鎹綅缃
    +	    			$("#tab_div_" + filedTypes[i]).find("tr").eq(startRownum).insertBefore($("#tab_div_" + filedTypes[i]).find("tr").eq(targetIndex));
    +	    		}else if(startRownum > targetIndex){
    +	    			$("#tab_div_" + filedTypes[i]).find("tr").eq(startRownum-1).insertBefore($("#tab_div_" + filedTypes[i]).find("tr").eq(targetIndex));
    +	    		} else {
    +	    			$("#tab_div_" + filedTypes[i]).find("tr").eq(startRownum-1).insertAfter($("#tab_div_" + filedTypes[i]).find("tr").eq(targetIndex));
    +	    		}
    +	    	}
    +	    	for (var i = 0; i < filedTypes.length; i++) {
    +	    		resetTrNum("#tab_div_" + filedTypes[i]);
    +	    	}
    +	    }
    +	});
    +	// .disableSelection()鐮旂┒涓嬭繖涓殑鎰忎箟濂藉儚杩欓噷娌″暐浣滅敤,褰卞搷浜嗙伀鐙
    +}, 2000);
    +function initData() {
    +	addTableHead();
    +	$.get("cgFormHeadController.do?getColumnList&id=" + $("#id").val(),
    +			getDataHanlder);
    +	$('.t_table').height($(window).height()-300);
    +	$(window).resize(function(){
    +		$('.t_table').height($(window).height()-300);
    +	});
    +	
    +}
    +
    +/**
    + * 娣诲姞琛ㄥご
    + */
    +function addTableHead() {
    +	for (var i = 0; i < filedTypes.length; i++) {
    +		var tr = $(getIframeDocument(filedTypes[i])).find("#"
    +				+ headerTr + filedTypes[i] + " tr").clone();
    +		$("#tab_div_" + filedTypes[i]+"_title").append(tr);
    +	}
    +}
    +// 鍏煎涓嶅悓娴忚鍣ㄨ幏鍙杋frame 鍐呭
    +//涓昏鎯呭喌鏄痠e11涓嬬殑鐗堟湰鏄伀鐙愮殑鏍囪瘑鍊掓槸鍑哄樊閿
    +function getIframeDocument(id){
    +	try {
    +		if (window.frames["iframe_" + id].contentDocument) {
    +			return window.frames["iframe_" + id].contentDocument;
    +		}
    +		return window.frames["iframe_" + id].document;
    +	} catch (e) {
    +	}
    +	return document.getElementById("iframe_" + id).contentDocument;
    +}
    +
    +/**
    + * 鑾峰彇鏁版嵁鐨勫洖璋
    + * 
    + * @param {}
    + *            data
    + */
    +function getDataHanlder(data) {
    +	data = eval("(" + data + ")");
    +	// 鍏煎涔嬪墠order鏈灏忎负0鐨勯棶棰
    +	var orderMin = data[0].orderNum == 0;
    +	$.each(data, function(idx, item) {
    +		rownumber = idx;//瀛樺偍褰撳墠搴忓彿
    +				for (var i = 0; i < filedTypes.length; i++) {
    +					initTrData(item, filedTypes[i], orderMin);
    +				}
    +			});
    +	jformTypeChange();
    +	fixTab();
    +	
    +}
    +/**
    + * 娣诲姞琛屾暟鎹
    + * 
    + * @param {}
    + *            item 杩欎釜鏁版嵁
    + * @param {}
    + *            filedType 杩欎竴琛岀殑绫诲瀷
    + */
    +function initTrData(item, filedType, orderMin) {
    +	var tr = $(getIframeDocument(filedType)).find("#" + bodytr
    +			+ filedType + " tr").clone();
    + 	var isId = item.fieldName == "id";
    +	$(':input, select,a', $(tr)).each(function() {
    +		var $this = $(this), name = $this.attr('name'), val = $this.val();
    +		if(isId){setAttrForThis($this);}
    +		//鑷畾涔変竴涓簭鍙<a> 鎸夊悕瀛楄繘琛岃幏鍙栧璞★紝骞惰繘琛屽簭鍙锋寚瀹
    +		if(name.indexOf("#rindex#") > 0){
    +			$this.attr("name", name.replace('#rindex#',rownumber));
    +			$this.html(rownumber+1);
    +		}
    +		if (name.indexOf("#index#") > 0) {
    +			var fieldName = name.replace("columns[#index#].", "");
    +			$this.attr("name", name.replace('#index#',rownumber));
    +			
    +			if (item[fieldName] != "Y" && item[fieldName] != "N") {
    +				$this.val(item[fieldName]);
    +			} else {
    +				item[fieldName] == "Y" ? $this.attr("checked", true) : $this
    +						.attr("checked", false);
    +			}
    +		} else if (name != "ck") {
    +			$this.attr("name", name.replace('_index',rownumber));
    +			$this.val(name.indexOf("columnsfieldName") != -1
    +					? item.fieldName
    +					: item.content);
    +		}
    +		else{
    +			$this.val(item.id);
    +		}
    +	});
    +	$("#tab_div_" + filedType).append(tr);
    +}
    +
    +function setAttrForThis($this){
    +	if($this.is('select')){
    +		$this.attr("onfocus","this.defOpt=this.selectedIndex");
    +		$this.attr("onchange","this.selectedIndex=this.defOpt;");
    +	}else if($this.is('input')&&$this.attr('type')=='text'){
    +		$this.attr("readonly","readonly");
    +	}else if($this.is('input')&&$this.attr('type')=='checkbox'){
    +		$this.attr("onclick","return false;");
    +	}
    +}
    +
    +/**
    + * 娣诲姞琛
    + */
    +function addColumnBtnClick() {
    +	for (var i = 0; i < filedTypes.length; i++) {
    +		addTrToTable(filedTypes[i]);
    +	}
    +}
    +function addTrToTable(filedType) {
    +	var tr = $(getIframeDocument(filedType)).find("#" + bodytr
    +			+ filedType + " tr").clone();
    +	$("#tab_div_" + filedType).append(tr);
    +	resetTrNum('#tab_div_' + filedType);
    +}
    +function deleteUnUsedFiled(){
    +	if(toDelete && toDelete.length>0){
    +		for(index in toDelete){
    +			if(toDelete[index] == "on") continue;
    +			$.post("cgFormHeadController.do?delField&id="+ toDelete[index]);
    +		}
    +	}
    +	return true;
    +}
    +/**
    + * 鍒犻櫎琛
    + */
    +function delColumnBtnClick() {
    +	// 鑾峰彇褰撳墠鐨刢heck鐨勮骞惰繘琛岄亶鍘
    +	$("#tab_div_database").find("input[name='ck']:checked").parent().parent("tr").each(function(index, ele){
    +		//$.post("cgFormHeadController.do?delField&id="+ $("#tab_div_database").find("input[name='ck']:checked").val());
    +		toDelete.push($(this).find("input[name='ck']:checked").val());
    +		var selectIndex = ele.rowIndex;
    +		for (var i = 0; i < filedTypes.length; i++) {
    +			$("#tab_div_" + filedTypes[i]).find("tr").eq(selectIndex).remove();
    +		}
    +	})
    +	for (var i = 0; i < filedTypes.length; i++) {
    +		resetTrNum("#tab_div_" + filedTypes[i]);
    +	}
    +}
    +/**
    + * 閲嶈table鐨刼rder
    + * 
    + * @param {}
    + *            tableId
    + */
    +function resetTrNum(tableId) {
    +	$(tableId + " tbody tr").each(function(i) {
    +		$(':input, select,a', this).each(function() {
    +					var $this = $(this), name = $this.attr('name'), val = $this
    +							.val();
    +					if (name != null && name.indexOf("#index#") >= 0) {
    +						$this.attr("name", name.replace('#index#', i));
    +						/*if (name.indexOf('orderNum') >= 0) {  Date20131212 liuht鍙栨秷閲嶇疆orderNumber
    +							$this.val(getMaxNum());
    +						}*/
    +					} else if (name != null && name.indexOf("_index") >= 0) {
    +						$this.attr("name", name.replace('_index', i));
    +					} else if (name != null && name != "ck") {
    +						$this.attr("name", name.replace(getNowIndex(name), i));
    +					}
    +					//浠g爜绉诲姩浣嶇疆锛屼紭鍖栬皟鏁     Date20131212
    +					if (name != null && name.indexOf("rownumber") >= 0) {
    +						$this.html(i+1);   // 绉诲姩tr|鏂板姞琛寍鍒犻櫎琛 ---閲嶇疆 rownumber鍊
    +					}
    +					if (name != null && name.indexOf("orderNum") >= 0) {
    +						$this.val(i+1);   // 绉诲姩tr|鏂板姞琛寍鍒犻櫎琛 ---閲嶇疆 orderNumber鍊
    +					}
    +					
    +				});
    +	});
    +	jformTypeChange();
    +}
    +/**
    + * 鑾峰彇鏈澶х殑 orderNum
    + */
    +function getMaxNum() {
    +	var maxNum = 0;
    +	$("input[name*='orderNum']").each(function() {
    +				maxNum = parseInt($(this).val()) > maxNum
    +						? $(this).val()
    +						: maxNum;
    +			});
    +	return parseInt(maxNum) + 1;
    +}
    +
    +/**
    + * 鍚屾fieldName
    + */
    +$(document).on('change', '.fieldNameInput','columnsfieldName',valueChange);
    +
    +/**
    + * 鍚屾content
    + */
    +$(document).on('change', '.contentInput','columnscontent',valueChange);
    +
    +
    +function valueChange(e){
    +	var val = $(this).val();
    +	var index = getNowIndex($(this).attr('name'));
    +	for (var i = 0; i < filedTypes.length; i++) {
    +		$("#tab_div_" + filedTypes[i]).find("input[name='"+e.data+ index + "']").val(val);
    +	}
    +}
    +
    +/**
    + * 鑾峰彇褰撳墠鐨勭储寮曞
    + * 
    + * @param {}
    + *            name 杩欎釜鍏冪礌鐨凬ame
    + * @return {}
    + */
    +function getNowIndex(name) {
    +	var s = name.indexOf("[");
    +	var e = name.indexOf("]");
    +	if(s>=0 && e>=0){
    +		return name.substring(s + 1, e);
    +	} else if(name.indexOf("columnsfieldName")>=0){
    +		return name.substring(16);
    +	}else if(name.indexOf("columnscontent")>=0){
    +		return name.substring(14);   //淇敼瀛楁澶囨敞鏃犳硶鍚屾闂
    +	}
    +}
    +
    +/**
    + * 涓婚敭绛栫暐鐨勬敼鍙,鎺у埗搴忓垪鐨勮緭鍏
    + */
    +function jformPkTypeChange(){
    +	var pkType = $("#jformPkType").val();
    +	var $idInput=null;
    +	$("[name$='fieldName']").each(function(){
    +		var fieldv = $(this).val();
    +		if(fieldv && fieldv=="id"){
    +			$idInput=$(this);
    +		}
    +	});
    +	var $idInput_type=$idInput.parent().parent().find("select[name$='type']");
    +	var $idInput_length=$idInput.parent().parent().find("input[name$='length']");
    +	$("#jformPkSequence").val("");
    +	if(pkType && pkType=="SEQUENCE"){
    +		$("#jformPkTypeTd").attr("colspan","1");
    +		$("#jformPkSequenceV").attr("style","");
    +		$("#jformPkSequenceN").attr("style","");
    +		$("#jformPkSequence").attr("datatype","*");
    +		$idInput_type.val("int");
    +		$idInput_length.val("20");
    +	}else{
    +		$("#jformPkSequenceV").attr("style","display: none;");
    +		$("#jformPkSequenceN").attr("style","display: none;");
    +		$("#jformPkTypeTd").attr("colspan","3");
    +		$("#jformPkSequence").removeAttr("datatype");
    +		if(pkType=="NATIVE"){
    +			$idInput_type.val("int");
    +			$idInput_length.val("20");
    +		}else if(pkType=="UUID"){
    +			$idInput_type.val("string");
    +			$idInput_length.val("36");
    +		}
    +	}
    +}
    +/**
    + * 琛ㄧ被鍨嬬殑鏀瑰彉,闄勮〃鎵嶅彲浠ヨ缃富琛
    + */
    +function jformTypeChange(){
    +	openOrCloseSetKeyOp($("#jformType").val() == 3);
    +	openOrCloseRelationTypeDisplay($("#jformType").val() == 3);
    +}
    +//鎺у埗锛氬彧鏈夐檮琛ㄦ墠鍙互閫夋嫨闄勮〃鍏宠仈绫诲瀷
    +function openOrCloseRelationTypeDisplay(boo){
    +	if(boo){
    +		$("#relation_type_div").attr("style","display: block;");
    +	}else{
    +		$("#relation_type_div").attr("style","display: none;");
    +	}
    +}
    +
    +function openOrCloseSetKeyOp(boo){
    +	$("#tab_div_key tbody tr").each(function(i) {
    +		$(':input', this).each(function() {
    +					var $this = $(this), name = $this.attr('name');
    +					if (name != null && (name.indexOf("mainTable") >= 0
    +					||name.indexOf("mainField") >= 0)&&
    +					name!="columns[0].mainTable"&&name!="columns[0].mainField") {
    +						boo?$this.removeAttr("readonly"):
    +							$this.attr("readonly","readonly");
    +					}
    +				});
    +	});
    +}
    +
    +
    +/**
    + * fix淇
    + */
    +function fixTab(){
    +	$('#tabs').tabs({
    +	    onSelect:function(title){
    +	        if(title=="鏁版嵁搴撳睘鎬"){fix("database");}
    +	        else if(title=="椤甸潰灞炴"){fix("page");}
    +	        else if(title=="鏍¢獙瀛楀吀"){fix("check");}
    +	        else if(title=="澶栭敭"){fix("key");}
    +	        $('#tabs .panel-body').css('width','auto');
    +	    }
    +	});
    +	$('#t_table_database').scroll(function(){
    + 		 $('#tab_div_database_title').css('margin-left',-($('#t_table_database').scrollLeft()));
    +	});
    +	$('#t_table_page').scroll(function(){
    + 		 $('#tab_div_page_title').css('margin-left',-($('#t_table_page').scrollLeft()));
    +	});
    +	$('#t_table_check').scroll(function(){
    + 		 $('#tab_div_check_title').css('margin-left',-($('#t_table_check').scrollLeft()));
    +	});
    +	$('#t_table_key').scroll(function(){
    + 		 $('#tab_div_key_title').css('margin-left',-($('#t_table_key').scrollLeft()));
    +	});
    +}
    +
    +//鍒╃敤js璁╁ご閮ㄤ笌鍐呭瀵瑰簲鍒楀搴︿竴鑷淬
    +function fix(type){
    +	for(var i=0;i<=$('#tab_div_'+type+' tr:last').find('td:last').index();i++){
    +  			$('#tab_div_'+type+'_title th').eq(i).css('width',
    +  				$('#tab_div_'+type+' tr:last').find('td').eq(i).width());
    + 	}
    + 	$('#tab_div_'+type+'_title').css('width',
    + 	 		$('#tab_div_'+type+' tr:last').width());
    +}
    +
    +
    +
    diff --git a/src/main/webapp/plug-in/cgform/js/fileTree.js b/src/main/webapp/plug-in/cgform/js/fileTree.js
    new file mode 100644
    index 00000000..334ccfcb
    --- /dev/null
    +++ b/src/main/webapp/plug-in/cgform/js/fileTree.js
    @@ -0,0 +1,28 @@
    + /**
    + ** 鎵撳紑鏂囦欢澶归夋嫨鍣
    + 	@param id 閫夋嫨鏂囦欢澶瑰悗鍥炲~鐨勬帶浠秈d
    + */
    + function openFolder(id){
    + 	$.dialog({
    +		content: 'url:generateController.do?goFileTree',
    +		lock : true,
    +		width:500,
    +		zIndex:2100,
    +		parent:frameElement.api,
    +		height:300,
    +		title:'鏂囦欢澶归夋嫨',
    +		opacity : 0.3,
    +		cache:false,
    +	    ok: function(){
    +	    	iframe = this.iframe.contentWindow;
    +			iframe.fillPath(id);
    +			return true;
    +	    },
    +	    cancelVal: '鍏抽棴',
    +	    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +	});
    + }
    + 
    + function selectCallback(id,path){
    + 	$("#"+id).val(path);
    + }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/build-config.js b/src/main/webapp/plug-in/ckeditor/build-config.js
    new file mode 100644
    index 00000000..f04b4587
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/build-config.js
    @@ -0,0 +1,101 @@
    +锘
    +/**
    + * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + * For licensing, see LICENSE.html or http://ckeditor.com/license
    + */
    +
    +/**
    + * This file was added automatically by CKEditor builder.
    + * You may re-use it at any time at http://ckeditor.com/builder to build CKEditor again.
    + * 
    + * NOTE: 
    + *    This file is not used by CKEditor, you may remove it.
    + *    Changing this file will not change your CKEditor configuration.
    + */
    +
    +var CKBUILDER_CONFIG = {
    +	skin: 'moonocolor',
    +	preset: 'full',
    +	ignore: [
    +		'dev',
    +		'.gitignore',
    +		'.gitattributes',
    +		'README.md',
    +		'.mailmap'
    +	],
    +	plugins : {
    +		'about' : 1,
    +		'a11yhelp' : 1,
    +		'dialogadvtab' : 1,
    +		'basicstyles' : 1,
    +		'bidi' : 1,
    +		'blockquote' : 1,
    +		'clipboard' : 1,
    +		'colorbutton' : 1,
    +		'colordialog' : 1,
    +		'templates' : 1,
    +		'contextmenu' : 1,
    +		'div' : 1,
    +		'resize' : 1,
    +		'toolbar' : 1,
    +		'elementspath' : 1,
    +		'enterkey' : 1,
    +		'entities' : 1,
    +		'filebrowser' : 1,
    +		'find' : 1,
    +		'flash' : 1,
    +		'floatingspace' : 1,
    +		'font' : 1,
    +		'forms' : 1,
    +		'format' : 1,
    +		'htmlwriter' : 1,
    +		'horizontalrule' : 1,
    +		'iframe' : 1,
    +		'wysiwygarea' : 1,
    +		'image' : 1,
    +		'indent' : 1,
    +		'smiley' : 1,
    +		'justify' : 1,
    +		'link' : 1,
    +		'list' : 1,
    +		'liststyle' : 1,
    +		'magicline' : 1,
    +		'maximize' : 1,
    +		'newpage' : 1,
    +		'pagebreak' : 1,
    +		'pastetext' : 1,
    +		'pastefromword' : 1,
    +		'preview' : 1,
    +		'print' : 1,
    +		'removeformat' : 1,
    +		'save' : 1,
    +		'selectall' : 1,
    +		'showblocks' : 1,
    +		'showborders' : 1,
    +		'sourcearea' : 1,
    +		'specialchar' : 1,
    +		'scayt' : 1,
    +		'stylescombo' : 1,
    +		'tab' : 1,
    +		'table' : 1,
    +		'tabletools' : 1,
    +		'undo' : 1,
    +		'wsc' : 1,
    +		'dialog' : 1,
    +		'dialogui' : 1,
    +		'panelbutton' : 1,
    +		'button' : 1,
    +		'floatpanel' : 1,
    +		'panel' : 1,
    +		'menu' : 1,
    +		'popup' : 1,
    +		'fakeobjects' : 1,
    +		'richcombo' : 1,
    +		'listblock' : 1,
    +		'menubutton' : 1
    +	},
    +	languages : {
    +		'zh-cn' : 1,
    +		'en' : 1,
    +	}
    +};
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/ckeditor.js b/src/main/webapp/plug-in/ckeditor/ckeditor.js
    new file mode 100644
    index 00000000..a49da73f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/ckeditor.js
    @@ -0,0 +1,921 @@
    +锘/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var b={timestamp:"D6IC",version:"4.1.3",revision:"1baa4c5",rnd:Math.floor(900*Math.random())+100,_:{pending:[]},status:"unloaded",basePath:function(){var a=window.CKEDITOR_BASEPATH||"";if(!a)for(var b=document.getElementsByTagName("script"),d=0;d<b.length;d++){var c=b[d].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(c){a=c[1];break}}-1==a.indexOf(":/")&&(a=0===a.indexOf("/")?location.href.match(/^.*?:\/\/[^\/]*/)[0]+a:location.href.match(/^[^\?]*\/(?:)/)[0]+
    +a);if(!a)throw'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.';return a}(),getUrl:function(a){-1==a.indexOf(":/")&&0!==a.indexOf("/")&&(a=this.basePath+a);this.timestamp&&("/"!=a.charAt(a.length-1)&&!/[&?]t=/.test(a))&&(a+=(0<=a.indexOf("?")?"&":"?")+"t="+this.timestamp);return a},domReady:function(){function a(){try{document.addEventListener?(document.removeEventListener("DOMContentLoaded",a,
    +!1),b()):document.attachEvent&&"complete"===document.readyState&&(document.detachEvent("onreadystatechange",a),b())}catch(d){}}function b(){for(var a;a=d.shift();)a()}var d=[];return function(b){d.push(b);"complete"===document.readyState&&setTimeout(a,1);if(1==d.length)if(document.addEventListener)document.addEventListener("DOMContentLoaded",a,!1),window.addEventListener("load",a,!1);else if(document.attachEvent){document.attachEvent("onreadystatechange",a);window.attachEvent("onload",a);b=!1;try{b=
    +!window.frameElement}catch(f){}if(document.documentElement.doScroll&&b){var c=function(){try{document.documentElement.doScroll("left")}catch(b){setTimeout(c,1);return}a()};c()}}}}()},c=window.CKEDITOR_GETURL;if(c){var a=b.getUrl;b.getUrl=function(e){return c.call(b,e)||a.call(b,e)}}return b}());
    +CKEDITOR.event||(CKEDITOR.event=function(){},CKEDITOR.event.implementOn=function(b){var c=CKEDITOR.event.prototype,a;for(a in c)b[a]==void 0&&(b[a]=c[a])},CKEDITOR.event.prototype=function(){function b(e){var b=c(this);return b[e]||(b[e]=new a(e))}var c=function(a){a=a.getPrivate&&a.getPrivate()||a._||(a._={});return a.events||(a.events={})},a=function(a){this.name=a;this.listeners=[]};a.prototype={getListenerIndex:function(a){for(var b=0,d=this.listeners;b<d.length;b++)if(d[b].fn==a)return b;return-1}};
    +return{define:function(a,f){var d=b.call(this,a);CKEDITOR.tools.extend(d,f,true)},on:function(a,f,d,c,l){function j(b,g,n,p){b={name:a,sender:this,editor:b,data:g,listenerData:c,stop:n,cancel:p,removeListener:m};return f.call(d,b)===false?false:b.data}function m(){q.removeListener(a,f)}var n=b.call(this,a);if(n.getListenerIndex(f)<0){n=n.listeners;d||(d=this);isNaN(l)&&(l=10);var q=this;j.fn=f;j.priority=l;for(var p=n.length-1;p>=0;p--)if(n[p].priority<=l){n.splice(p+1,0,j);return{removeListener:m}}n.unshift(j)}return{removeListener:m}},
    +once:function(){var a=arguments[1];arguments[1]=function(b){b.removeListener();return a.apply(this,arguments)};return this.on.apply(this,arguments)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,b=function(){a=1},d=0,i=function(){d=1};return function(l,j,m){var n=c(this)[l],l=a,q=d;a=d=0;if(n){var p=n.listeners;if(p.length)for(var p=p.slice(0),h,g=0;g<p.length;g++){if(n.errorProof)try{h=p[g].call(this,
    +m,j,b,i)}catch(u){}else h=p[g].call(this,m,j,b,i);h===false?d=1:typeof h!="undefined"&&(j=h);if(a||d)break}}j=d?false:typeof j=="undefined"?true:j;a=l;d=q;return j}}(),fireOnce:function(a,b,d){b=this.fire(a,b,d);delete c(this)[a];return b},removeListener:function(a,b){var d=c(this)[a];if(d){var i=d.getListenerIndex(b);i>=0&&d.listeners.splice(i,1)}},removeAllListeners:function(){var a=c(this),b;for(b in a)delete a[b]},hasListeners:function(a){return(a=c(this)[a])&&a.listeners.length>0}}}());
    +CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(b,c){b in{instanceReady:1,loaded:1}&&(this[b]=true);return CKEDITOR.event.prototype.fire.call(this,b,c,this)},CKEDITOR.editor.prototype.fireOnce=function(b,c){b in{instanceReady:1,loaded:1}&&(this[b]=true);return CKEDITOR.event.prototype.fireOnce.call(this,b,c,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype));
    +CKEDITOR.env||(CKEDITOR.env=function(){var b=navigator.userAgent.toLowerCase(),c=window.opera,a={ie:eval("/*@cc_on!@*/false"),opera:!!c&&c.version,webkit:b.indexOf(" applewebkit/")>-1,air:b.indexOf(" adobeair/")>-1,mac:b.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat",mobile:b.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(b),isCustomDomain:function(){if(!this.ie)return false;var a=document.domain,e=window.location.hostname;return a!=e&&a!="["+e+"]"},secure:location.protocol==
    +"https:"};a.gecko=navigator.product=="Gecko"&&!a.webkit&&!a.opera;if(a.webkit)b.indexOf("chrome")>-1?a.chrome=true:a.safari=true;var e=0;if(a.ie){e=a.quirks||!document.documentMode?parseFloat(b.match(/msie (\d+)/)[1]):document.documentMode;a.ie9Compat=e==9;a.ie8Compat=e==8;a.ie7Compat=e==7;a.ie6Compat=e<7||a.quirks}if(a.gecko){var f=b.match(/rv:([\d\.]+)/);if(f){f=f[1].split(".");e=f[0]*1E4+(f[1]||0)*100+(f[2]||0)*1}}a.opera&&(e=parseFloat(c.version()));a.air&&(e=parseFloat(b.match(/ adobeair\/(\d+)/)[1]));
    +a.webkit&&(e=parseFloat(b.match(/ applewebkit\/(\d+)/)[1]));a.version=e;a.isCompatible=a.iOS&&e>=534||!a.mobile&&(a.ie&&e>6||a.gecko&&e>=10801||a.opera&&e>=9.5||a.air&&e>=1||a.webkit&&e>=522||false);a.cssClass="cke_browser_"+(a.ie?"ie":a.gecko?"gecko":a.opera?"opera":a.webkit?"webkit":"unknown");if(a.quirks)a.cssClass=a.cssClass+" cke_browser_quirks";if(a.ie){a.cssClass=a.cssClass+(" cke_browser_ie"+(a.quirks||a.version<7?"6":a.version));if(a.quirks)a.cssClass=a.cssClass+" cke_browser_iequirks"}if(a.gecko)if(e<
    +10900)a.cssClass=a.cssClass+" cke_browser_gecko18";else if(e<=11E3)a.cssClass=a.cssClass+" cke_browser_gecko19";if(a.air)a.cssClass=a.cssClass+" cke_browser_air";if(a.iOS)a.cssClass=a.cssClass+" cke_browser_ios";return a}());
    +"unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if(CKEDITOR.status!="basic_ready")CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var b=document.createElement("script");b.type="text/javascript";b.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(b)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(b){(this._.pending||(this._.pending=[])).push(b)};(function(){CKEDITOR.domReady(function(){var b=
    +CKEDITOR.loadFullCore,c=CKEDITOR.loadFullCoreTimeout;if(b){CKEDITOR.status="basic_ready";b&&b._load?b():c&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},c*1E3)}})})();CKEDITOR.status="basic_loaded"}();CKEDITOR.dom={};
    +(function(){var b=[],c=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.opera?"-o-":CKEDITOR.env.ie?"-ms-":"";CKEDITOR.on("reset",function(){b=[]});CKEDITOR.tools={arrayCompare:function(a,e){if(!a&&!e)return true;if(!a||!e||a.length!=e.length)return false;for(var b=0;b<a.length;b++)if(a[b]!=e[b])return false;return true},clone:function(a){var e;if(a&&a instanceof Array){e=[];for(var b=0;b<a.length;b++)e[b]=CKEDITOR.tools.clone(a[b]);return e}if(a===null||typeof a!="object"||
    +a instanceof String||a instanceof Number||a instanceof Boolean||a instanceof Date||a instanceof RegExp)return a;e=new a.constructor;for(b in a)e[b]=CKEDITOR.tools.clone(a[b]);return e},capitalize:function(a){return a.charAt(0).toUpperCase()+a.substring(1).toLowerCase()},extend:function(a){var b=arguments.length,f,d;if(typeof(f=arguments[b-1])=="boolean")b--;else if(typeof(f=arguments[b-2])=="boolean"){d=arguments[b-1];b=b-2}for(var c=1;c<b;c++){var l=arguments[c],j;for(j in l)if(f===true||a[j]==void 0)if(!d||
    +j in d)a[j]=l[j]}return a},prototypedCopy:function(a){var b=function(){};b.prototype=a;return new b},copy:function(a){var b={},f;for(f in a)b[f]=a[f];return b},isArray:function(a){return!!a&&a instanceof Array},isEmpty:function(a){for(var b in a)if(a.hasOwnProperty(b))return false;return true},cssVendorPrefix:function(a,b,f){if(f)return c+a+":"+b+";"+a+":"+b;f={};f[a]=b;f[c+a]=b;return f},cssStyleToDomStyle:function(){var a=document.createElement("div").style,b=typeof a.cssFloat!="undefined"?"cssFloat":
    +typeof a.styleFloat!="undefined"?"styleFloat":"float";return function(a){return a=="float"?b:a.replace(/-./g,function(a){return a.substr(1).toUpperCase()})}}(),buildStyleHtml:function(a){for(var a=[].concat(a),b,f=[],d=0;d<a.length;d++)if(b=a[d])/@import|[{}]/.test(b)?f.push("<style>"+b+"</style>"):f.push('<link type="text/css" rel=stylesheet href="'+b+'">');return f.join("")},htmlEncode:function(a){return(""+a).replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;")},htmlEncodeAttr:function(a){return a.replace(/"/g,
    +"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(a,b){var f=b(a);f.prototype=a.prototype;return f},setTimeout:function(a,b,f,d,c){c||(c=window);f||(f=c);return c.setTimeout(function(){d?a.apply(f,[].concat(d)):a.apply(f)},b||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(b){return b.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;
    +return function(b){return b.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(b){return b.replace(a,"")}}(),indexOf:function(a,b){if(typeof b=="function")for(var f=0,d=a.length;f<d;f++){if(b(a[f]))return f}else{if(a.indexOf)return a.indexOf(b);f=0;for(d=a.length;f<d;f++)if(a[f]===b)return f}return-1},search:function(a,b){var f=CKEDITOR.tools.indexOf(a,b);return f>=0?a[f]:null},bind:function(a,b){return function(){return a.apply(b,arguments)}},createClass:function(a){var b=a.$,
    +f=a.base,d=a.privates||a._,c=a.proto,a=a.statics;!b&&(b=function(){f&&this.base.apply(this,arguments)});if(d)var l=b,b=function(){var a=this._||(this._={}),b;for(b in d){var e=d[b];a[b]=typeof e=="function"?CKEDITOR.tools.bind(e,this):e}l.apply(this,arguments)};if(f){b.prototype=this.prototypedCopy(f.prototype);b.prototype.constructor=b;b.base=f;b.baseProto=f.prototype;b.prototype.base=function(){this.base=f.prototype.base;f.apply(this,arguments);this.base=arguments.callee}}c&&this.extend(b.prototype,
    +c,true);a&&this.extend(b,a,true);return b},addFunction:function(a,e){return b.push(function(){return a.apply(e||this,arguments)})-1},removeFunction:function(a){b[a]=null},callFunction:function(a){var e=b[a];return e&&e.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a=/^-?\d+\.?\d*px$/,b;return function(f){b=CKEDITOR.tools.trim(f+"")+"px";return a.test(b)?b:f||""}}(),convertToPx:function(){var a;return function(b){if(!a){a=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;margin:0px;padding:0px;border:0px;"></div>',
    +CKEDITOR.document);CKEDITOR.document.getBody().append(a)}if(!/%$/.test(b)){a.setStyle("width",b);return a.$.clientWidth}return b}}(),repeat:function(a,b){return Array(b+1).join(a)},tryThese:function(){for(var a,b=0,f=arguments.length;b<f;b++){var d=arguments[b];try{a=d();break}catch(c){}}return a},genKey:function(){return Array.prototype.slice.call(arguments).join("-")},defer:function(a){return function(){var b=arguments,f=this;window.setTimeout(function(){a.apply(f,b)},0)}},normalizeCssText:function(a,
    +b){var f=[],d,c=CKEDITOR.tools.parseCssText(a,true,b);for(d in c)f.push(d+":"+c[d]);f.sort();return f.length?f.join(";")+";":""},convertRgbToHex:function(a){return a.replace(/(?:rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\))/gi,function(a,b,d,c){a=[b,d,c];for(b=0;b<3;b++)a[b]=("0"+parseInt(a[b],10).toString(16)).slice(-2);return"#"+a.join("")})},parseCssText:function(a,b,c){var d={};if(c){c=new CKEDITOR.dom.element("span");c.setAttribute("style",a);a=CKEDITOR.tools.convertRgbToHex(c.getAttribute("style")||
    +"")}if(!a||a==";")return d;a.replace(/&quot;/g,'"').replace(/\s*([^:;\s]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,c,f){if(b){c=c.toLowerCase();c=="font-family"&&(f=f.toLowerCase().replace(/["']/g,"").replace(/\s*,\s*/g,","));f=CKEDITOR.tools.trim(f)}d[c]=f});return d},writeCssText:function(a,b){var c,d=[];for(c in a)d.push(c+":"+a[c]);b&&d.sort();return d.join("; ")},objectCompare:function(a,b,c){var d;if(!a&&!b)return true;if(!a||!b)return false;for(d in a)if(a[d]!=b[d])return false;if(!c)for(d in b)if(a[d]!=
    +b[d])return false;return true},objectKeys:function(a){var b=[],c;for(c in a)b.push(c);return b},convertArrayToObject:function(a,b){var c={};arguments.length==1&&(b=true);for(var d=0,i=a.length;d<i;++d)c[a[d]]=b;return c},fixDomain:function(){for(var a;;)try{a=window.parent.document.domain;break}catch(b){a=a?a.replace(/.+?(?:\.|$)/,""):document.domain;if(!a)break;document.domain=a}return!!a}}})();
    +CKEDITOR.dtd=function(){var b=CKEDITOR.tools.extend,c=function(a,b){for(var e=CKEDITOR.tools.clone(a),c=1;c<arguments.length;c++){var b=arguments[c],h;for(h in b)delete e[h]}return e},a={},e={},f={address:1,article:1,aside:1,blockquote:1,details:1,div:1,dl:1,fieldset:1,figure:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,hr:1,menu:1,nav:1,ol:1,p:1,pre:1,section:1,table:1,ul:1},d={command:1,link:1,meta:1,noscript:1,script:1,style:1},i={},l={"#":1},j={center:1,dir:1,noframes:1};
    +b(a,{a:1,abbr:1,area:1,audio:1,b:1,bdi:1,bdo:1,br:1,button:1,canvas:1,cite:1,code:1,command:1,datalist:1,del:1,dfn:1,em:1,embed:1,i:1,iframe:1,img:1,input:1,ins:1,kbd:1,keygen:1,label:1,map:1,mark:1,meter:1,noscript:1,object:1,output:1,progress:1,q:1,ruby:1,s:1,samp:1,script:1,select:1,small:1,span:1,strong:1,sub:1,sup:1,textarea:1,time:1,u:1,"var":1,video:1,wbr:1},l,{acronym:1,applet:1,basefont:1,big:1,font:1,isindex:1,strike:1,style:1,tt:1});b(e,f,a,j);c={a:c(a,{a:1,button:1}),abbr:a,address:e,
    +area:i,article:b({style:1},e),aside:b({style:1},e),audio:b({source:1,track:1},e),b:a,base:i,bdi:a,bdo:a,blockquote:e,body:e,br:i,button:c(a,{a:1,button:1}),canvas:a,caption:e,cite:a,code:a,col:i,colgroup:{col:1},command:i,datalist:b({option:1},a),dd:e,del:a,details:b({summary:1},e),dfn:a,div:b({style:1},e),dl:{dt:1,dd:1},dt:e,em:a,embed:i,fieldset:b({legend:1},e),figcaption:e,figure:b({figcaption:1},e),footer:e,form:e,h1:a,h2:a,h3:a,h4:a,h5:a,h6:a,head:b({title:1,base:1},d),header:e,hgroup:{h1:1,
    +h2:1,h3:1,h4:1,h5:1,h6:1},hr:i,html:b({head:1,body:1},e,d),i:a,iframe:l,img:i,input:i,ins:a,kbd:a,keygen:i,label:a,legend:a,li:e,link:i,map:e,mark:a,menu:b({li:1},e),meta:i,meter:c(a,{meter:1}),nav:e,noscript:b({link:1,meta:1,style:1},a),object:b({param:1},a),ol:{li:1},optgroup:{option:1},option:l,output:a,p:a,param:i,pre:a,progress:c(a,{progress:1}),q:a,rp:a,rt:a,ruby:b({rp:1,rt:1},a),s:a,samp:a,script:l,section:b({style:1},e),select:{optgroup:1,option:1},small:a,source:i,span:a,strong:a,style:l,
    +sub:a,summary:a,sup:a,table:{caption:1,colgroup:1,thead:1,tfoot:1,tbody:1,tr:1},tbody:{tr:1},td:e,textarea:l,tfoot:{tr:1},th:e,thead:{tr:1},time:c(a,{time:1}),title:l,tr:{th:1,td:1},track:i,u:a,ul:{li:1},"var":a,video:b({source:1,track:1},e),wbr:i,acronym:a,applet:b({param:1},e),basefont:i,big:a,center:e,dialog:i,dir:{li:1},font:a,isindex:i,noframes:e,strike:a,tt:a};b(c,{$block:b({audio:1,dd:1,dt:1,li:1,video:1},f,j),$blockLimit:{article:1,aside:1,audio:1,body:1,caption:1,details:1,dir:1,div:1,dl:1,
    +fieldset:1,figure:1,footer:1,form:1,header:1,hgroup:1,menu:1,nav:1,ol:1,section:1,table:1,td:1,th:1,tr:1,ul:1,video:1},$cdata:{script:1,style:1},$editable:{address:1,article:1,aside:1,blockquote:1,body:1,details:1,div:1,fieldset:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,nav:1,p:1,pre:1,section:1},$empty:{area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1},$inline:a,$list:{dl:1,ol:1,
    +ul:1},$listItem:{dd:1,dt:1,li:1},$nonBodyContent:b({body:1,head:1,html:1},c.head),$nonEditable:{applet:1,audio:1,button:1,embed:1,iframe:1,map:1,object:1,option:1,param:1,script:1,textarea:1,video:1},$object:{applet:1,audio:1,button:1,hr:1,iframe:1,img:1,input:1,object:1,select:1,table:1,textarea:1,video:1},$removeEmpty:{abbr:1,acronym:1,b:1,bdi:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,mark:1,meter:1,output:1,q:1,ruby:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,
    +sub:1,sup:1,time:1,tt:1,u:1,"var":1},$tabIndex:{a:1,area:1,button:1,input:1,object:1,select:1,textarea:1},$tableContent:{caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1},$transparent:{a:1,audio:1,canvas:1,del:1,ins:1,map:1,noscript:1,object:1,video:1},$intermediate:{caption:1,colgroup:1,dd:1,dt:1,figcaption:1,legend:1,li:1,optgroup:1,option:1,rp:1,rt:1,summary:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1}});return c}();CKEDITOR.dom.event=function(b){this.$=b};
    +CKEDITOR.dom.event.prototype={getKey:function(){return this.$.keyCode||this.$.which},getKeystroke:function(){var b=this.getKey();if(this.$.ctrlKey||this.$.metaKey)b=b+CKEDITOR.CTRL;this.$.shiftKey&&(b=b+CKEDITOR.SHIFT);this.$.altKey&&(b=b+CKEDITOR.ALT);return b},preventDefault:function(b){var c=this.$;c.preventDefault?c.preventDefault():c.returnValue=false;b&&this.stopPropagation()},stopPropagation:function(){var b=this.$;b.stopPropagation?b.stopPropagation():b.cancelBubble=true},getTarget:function(){var b=
    +this.$.target||this.$.srcElement;return b?new CKEDITOR.dom.node(b):null},getPhase:function(){return this.$.eventPhase||2},getPageOffset:function(){var b=this.getTarget().getDocument().$;return{x:this.$.pageX||this.$.clientX+(b.documentElement.scrollLeft||b.body.scrollLeft),y:this.$.pageY||this.$.clientY+(b.documentElement.scrollTop||b.body.scrollTop)}}};CKEDITOR.CTRL=1114112;CKEDITOR.SHIFT=2228224;CKEDITOR.ALT=4456448;CKEDITOR.EVENT_PHASE_CAPTURING=1;CKEDITOR.EVENT_PHASE_AT_TARGET=2;
    +CKEDITOR.EVENT_PHASE_BUBBLING=3;CKEDITOR.dom.domObject=function(b){if(b)this.$=b};
    +CKEDITOR.dom.domObject.prototype=function(){var b=function(b,a){return function(e){typeof CKEDITOR!="undefined"&&b.fire(a,new CKEDITOR.dom.event(e))}};return{getPrivate:function(){var b;if(!(b=this.getCustomData("_")))this.setCustomData("_",b={});return b},on:function(c){var a=this.getCustomData("_cke_nativeListeners");if(!a){a={};this.setCustomData("_cke_nativeListeners",a)}if(!a[c]){a=a[c]=b(this,c);this.$.addEventListener?this.$.addEventListener(c,a,!!CKEDITOR.event.useCapture):this.$.attachEvent&&
    +this.$.attachEvent("on"+c,a)}return CKEDITOR.event.prototype.on.apply(this,arguments)},removeListener:function(b){CKEDITOR.event.prototype.removeListener.apply(this,arguments);if(!this.hasListeners(b)){var a=this.getCustomData("_cke_nativeListeners"),e=a&&a[b];if(e){this.$.removeEventListener?this.$.removeEventListener(b,e,false):this.$.detachEvent&&this.$.detachEvent("on"+b,e);delete a[b]}}},removeAllListeners:function(){var b=this.getCustomData("_cke_nativeListeners"),a;for(a in b){var e=b[a];this.$.detachEvent?
    +this.$.detachEvent("on"+a,e):this.$.removeEventListener&&this.$.removeEventListener(a,e,false);delete b[a]}}}}();
    +(function(b){var c={};CKEDITOR.on("reset",function(){c={}});b.equals=function(a){try{return a&&a.$===this.$}catch(b){return false}};b.setCustomData=function(a,b){var f=this.getUniqueId();(c[f]||(c[f]={}))[a]=b;return this};b.getCustomData=function(a){var b=this.$["data-cke-expando"];return(b=b&&c[b])&&a in b?b[a]:null};b.removeCustomData=function(a){var b=this.$["data-cke-expando"],b=b&&c[b],f,d;if(b){f=b[a];d=a in b;delete b[a]}return d?f:null};b.clearCustomData=function(){this.removeAllListeners();
    +var a=this.$["data-cke-expando"];a&&delete c[a]};b.getUniqueId=function(){return this.$["data-cke-expando"]||(this.$["data-cke-expando"]=CKEDITOR.tools.getNextNumber())};CKEDITOR.event.implementOn(b)})(CKEDITOR.dom.domObject.prototype);
    +CKEDITOR.dom.node=function(b){return b?new CKEDITOR.dom[b.nodeType==CKEDITOR.NODE_DOCUMENT?"document":b.nodeType==CKEDITOR.NODE_ELEMENT?"element":b.nodeType==CKEDITOR.NODE_TEXT?"text":b.nodeType==CKEDITOR.NODE_COMMENT?"comment":b.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT?"documentFragment":"domObject"](b):this};CKEDITOR.dom.node.prototype=new CKEDITOR.dom.domObject;CKEDITOR.NODE_ELEMENT=1;CKEDITOR.NODE_DOCUMENT=9;CKEDITOR.NODE_TEXT=3;CKEDITOR.NODE_COMMENT=8;CKEDITOR.NODE_DOCUMENT_FRAGMENT=11;
    +CKEDITOR.POSITION_IDENTICAL=0;CKEDITOR.POSITION_DISCONNECTED=1;CKEDITOR.POSITION_FOLLOWING=2;CKEDITOR.POSITION_PRECEDING=4;CKEDITOR.POSITION_IS_CONTAINED=8;CKEDITOR.POSITION_CONTAINS=16;
    +CKEDITOR.tools.extend(CKEDITOR.dom.node.prototype,{appendTo:function(b,c){b.append(this,c);return b},clone:function(b,c){var a=this.$.cloneNode(b),e=function(a){a["data-cke-expando"]&&(a["data-cke-expando"]=false);if(a.nodeType==CKEDITOR.NODE_ELEMENT){c||a.removeAttribute("id",false);if(b)for(var a=a.childNodes,d=0;d<a.length;d++)e(a[d])}};e(a);return new CKEDITOR.dom.node(a)},hasPrevious:function(){return!!this.$.previousSibling},hasNext:function(){return!!this.$.nextSibling},insertAfter:function(b){b.$.parentNode.insertBefore(this.$,
    +b.$.nextSibling);return b},insertBefore:function(b){b.$.parentNode.insertBefore(this.$,b.$);return b},insertBeforeMe:function(b){this.$.parentNode.insertBefore(b.$,this.$);return b},getAddress:function(b){for(var c=[],a=this.getDocument().$.documentElement,e=this.$;e&&e!=a;){var f=e.parentNode;f&&c.unshift(this.getIndex.call({$:e},b));e=f}return c},getDocument:function(){return new CKEDITOR.dom.document(this.$.ownerDocument||this.$.parentNode.ownerDocument)},getIndex:function(b){var c=this.$,a=-1,
    +e;if(!this.$.parentNode)return a;do if(!b||!(c!=this.$&&c.nodeType==CKEDITOR.NODE_TEXT&&(e||!c.nodeValue))){a++;e=c.nodeType==CKEDITOR.NODE_TEXT}while(c=c.previousSibling);return a},getNextSourceNode:function(b,c,a){if(a&&!a.call)var e=a,a=function(a){return!a.equals(e)};var b=!b&&this.getFirst&&this.getFirst(),f;if(!b){if(this.type==CKEDITOR.NODE_ELEMENT&&a&&a(this,true)===false)return null;b=this.getNext()}for(;!b&&(f=(f||this).getParent());){if(a&&a(f,true)===false)return null;b=f.getNext()}return!b||
    +a&&a(b)===false?null:c&&c!=b.type?b.getNextSourceNode(false,c,a):b},getPreviousSourceNode:function(b,c,a){if(a&&!a.call)var e=a,a=function(a){return!a.equals(e)};var b=!b&&this.getLast&&this.getLast(),f;if(!b){if(this.type==CKEDITOR.NODE_ELEMENT&&a&&a(this,true)===false)return null;b=this.getPrevious()}for(;!b&&(f=(f||this).getParent());){if(a&&a(f,true)===false)return null;b=f.getPrevious()}return!b||a&&a(b)===false?null:c&&b.type!=c?b.getPreviousSourceNode(false,c,a):b},getPrevious:function(b){var c=
    +this.$,a;do a=(c=c.previousSibling)&&c.nodeType!=10&&new CKEDITOR.dom.node(c);while(a&&b&&!b(a));return a},getNext:function(b){var c=this.$,a;do a=(c=c.nextSibling)&&new CKEDITOR.dom.node(c);while(a&&b&&!b(a));return a},getParent:function(b){var c=this.$.parentNode;return c&&(c.nodeType==CKEDITOR.NODE_ELEMENT||b&&c.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT)?new CKEDITOR.dom.node(c):null},getParents:function(b){var c=this,a=[];do a[b?"push":"unshift"](c);while(c=c.getParent());return a},getCommonAncestor:function(b){if(b.equals(this))return this;
    +if(b.contains&&b.contains(this))return b;var c=this.contains?this:this.getParent();do if(c.contains(b))return c;while(c=c.getParent());return null},getPosition:function(b){var c=this.$,a=b.$;if(c.compareDocumentPosition)return c.compareDocumentPosition(a);if(c==a)return CKEDITOR.POSITION_IDENTICAL;if(this.type==CKEDITOR.NODE_ELEMENT&&b.type==CKEDITOR.NODE_ELEMENT){if(c.contains){if(c.contains(a))return CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING;if(a.contains(c))return CKEDITOR.POSITION_IS_CONTAINED+
    +CKEDITOR.POSITION_FOLLOWING}if("sourceIndex"in c)return c.sourceIndex<0||a.sourceIndex<0?CKEDITOR.POSITION_DISCONNECTED:c.sourceIndex<a.sourceIndex?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING}for(var c=this.getAddress(),b=b.getAddress(),a=Math.min(c.length,b.length),e=0;e<=a-1;e++)if(c[e]!=b[e]){if(e<a)return c[e]<b[e]?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING;break}return c.length<b.length?CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_IS_CONTAINED+
    +CKEDITOR.POSITION_FOLLOWING},getAscendant:function(b,c){var a=this.$,e;if(!c)a=a.parentNode;for(;a;){if(a.nodeName&&(e=a.nodeName.toLowerCase(),typeof b=="string"?e==b:e in b))return new CKEDITOR.dom.node(a);try{a=a.parentNode}catch(f){a=null}}return null},hasAscendant:function(b,c){var a=this.$;if(!c)a=a.parentNode;for(;a;){if(a.nodeName&&a.nodeName.toLowerCase()==b)return true;a=a.parentNode}return false},move:function(b,c){b.append(this.remove(),c)},remove:function(b){var c=this.$,a=c.parentNode;
    +if(a){if(b)for(;b=c.firstChild;)a.insertBefore(c.removeChild(b),c);a.removeChild(c)}return this},replace:function(b){this.insertBefore(b);b.remove()},trim:function(){this.ltrim();this.rtrim()},ltrim:function(){for(var b;this.getFirst&&(b=this.getFirst());){if(b.type==CKEDITOR.NODE_TEXT){var c=CKEDITOR.tools.ltrim(b.getText()),a=b.getLength();if(c){if(c.length<a){b.split(a-c.length);this.$.removeChild(this.$.firstChild)}}else{b.remove();continue}}break}},rtrim:function(){for(var b;this.getLast&&(b=
    +this.getLast());){if(b.type==CKEDITOR.NODE_TEXT){var c=CKEDITOR.tools.rtrim(b.getText()),a=b.getLength();if(c){if(c.length<a){b.split(c.length);this.$.lastChild.parentNode.removeChild(this.$.lastChild)}}else{b.remove();continue}}break}if(!CKEDITOR.env.ie&&!CKEDITOR.env.opera)(b=this.$.lastChild)&&(b.type==1&&b.nodeName.toLowerCase()=="br")&&b.parentNode.removeChild(b)},isReadOnly:function(){var b=this;this.type!=CKEDITOR.NODE_ELEMENT&&(b=this.getParent());if(b&&typeof b.$.isContentEditable!="undefined")return!(b.$.isContentEditable||
    +b.data("cke-editable"));for(;b;){if(b.data("cke-editable"))break;if(b.getAttribute("contentEditable")=="false")return true;if(b.getAttribute("contentEditable")=="true")break;b=b.getParent()}return!b}});CKEDITOR.dom.window=function(b){CKEDITOR.dom.domObject.call(this,b)};CKEDITOR.dom.window.prototype=new CKEDITOR.dom.domObject;
    +CKEDITOR.tools.extend(CKEDITOR.dom.window.prototype,{focus:function(){this.$.focus()},getViewPaneSize:function(){var b=this.$.document,c=b.compatMode=="CSS1Compat";return{width:(c?b.documentElement.clientWidth:b.body.clientWidth)||0,height:(c?b.documentElement.clientHeight:b.body.clientHeight)||0}},getScrollPosition:function(){var b=this.$;if("pageXOffset"in b)return{x:b.pageXOffset||0,y:b.pageYOffset||0};b=b.document;return{x:b.documentElement.scrollLeft||b.body.scrollLeft||0,y:b.documentElement.scrollTop||
    +b.body.scrollTop||0}},getFrame:function(){var b=this.$.frameElement;return b?new CKEDITOR.dom.element.get(b):null}});CKEDITOR.dom.document=function(b){CKEDITOR.dom.domObject.call(this,b)};CKEDITOR.dom.document.prototype=new CKEDITOR.dom.domObject;
    +CKEDITOR.tools.extend(CKEDITOR.dom.document.prototype,{type:CKEDITOR.NODE_DOCUMENT,appendStyleSheet:function(b){if(this.$.createStyleSheet)this.$.createStyleSheet(b);else{var c=new CKEDITOR.dom.element("link");c.setAttributes({rel:"stylesheet",type:"text/css",href:b});this.getHead().append(c)}},appendStyleText:function(b){if(this.$.createStyleSheet){var c=this.$.createStyleSheet("");c.cssText=b}else{var a=new CKEDITOR.dom.element("style",this);a.append(new CKEDITOR.dom.text(b,this));this.getHead().append(a)}return c||
    +a.$.sheet},createElement:function(b,c){var a=new CKEDITOR.dom.element(b,this);if(c){c.attributes&&a.setAttributes(c.attributes);c.styles&&a.setStyles(c.styles)}return a},createText:function(b){return new CKEDITOR.dom.text(b,this)},focus:function(){this.getWindow().focus()},getActive:function(){return new CKEDITOR.dom.element(this.$.activeElement)},getById:function(b){return(b=this.$.getElementById(b))?new CKEDITOR.dom.element(b):null},getByAddress:function(b,c){for(var a=this.$.documentElement,e=
    +0;a&&e<b.length;e++){var f=b[e];if(c)for(var d=-1,i=0;i<a.childNodes.length;i++){var l=a.childNodes[i];if(!(c===true&&l.nodeType==3&&l.previousSibling&&l.previousSibling.nodeType==3)){d++;if(d==f){a=l;break}}}else a=a.childNodes[f]}return a?new CKEDITOR.dom.node(a):null},getElementsByTag:function(b,c){if((!CKEDITOR.env.ie||document.documentMode>8)&&c)b=c+":"+b;return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(b))},getHead:function(){var b=this.$.getElementsByTagName("head")[0];return b=
    +b?new CKEDITOR.dom.element(b):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),true)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){return new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView)},write:function(b){this.$.open("text/html","replace");CKEDITOR.env.ie&&(b=b.replace(/(?:^\s*<!DOCTYPE[^>]*?>)|^/i,'$&\n<script data-cke-temp="1">('+CKEDITOR.tools.fixDomain+
    +")();<\/script>"));this.$.write(b);this.$.close()}});CKEDITOR.dom.nodeList=function(b){this.$=b};CKEDITOR.dom.nodeList.prototype={count:function(){return this.$.length},getItem:function(b){if(b<0||b>=this.$.length)return null;return(b=this.$[b])?new CKEDITOR.dom.node(b):null}};CKEDITOR.dom.element=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createElement(b));CKEDITOR.dom.domObject.call(this,b)};
    +CKEDITOR.dom.element.get=function(b){return(b=typeof b=="string"?document.getElementById(b)||document.getElementsByName(b)[0]:b)&&(b.$?b:new CKEDITOR.dom.element(b))};CKEDITOR.dom.element.prototype=new CKEDITOR.dom.node;CKEDITOR.dom.element.createFromHtml=function(b,c){var a=new CKEDITOR.dom.element("div",c);a.setHtml(b);return a.getFirst().remove()};
    +CKEDITOR.dom.element.setMarker=function(b,c,a,e){var f=c.getCustomData("list_marker_id")||c.setCustomData("list_marker_id",CKEDITOR.tools.getNextNumber()).getCustomData("list_marker_id"),d=c.getCustomData("list_marker_names")||c.setCustomData("list_marker_names",{}).getCustomData("list_marker_names");b[f]=c;d[a]=1;return c.setCustomData(a,e)};CKEDITOR.dom.element.clearAllMarkers=function(b){for(var c in b)CKEDITOR.dom.element.clearMarkers(b,b[c],1)};
    +CKEDITOR.dom.element.clearMarkers=function(b,c,a){var e=c.getCustomData("list_marker_names"),f=c.getCustomData("list_marker_id"),d;for(d in e)c.removeCustomData(d);c.removeCustomData("list_marker_names");if(a){c.removeCustomData("list_marker_id");delete b[f]}};
    +(function(){function b(a){for(var b=0,f=0,d=c[a].length;f<d;f++)b=b+(parseInt(this.getComputedStyle(c[a][f])||0,10)||0);return b}CKEDITOR.tools.extend(CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_ELEMENT,addClass:function(a){var b=this.$.className;b&&(RegExp("(?:^|\\s)"+a+"(?:\\s|$)","").test(b)||(b=b+(" "+a)));this.$.className=b||a},removeClass:function(a){var b=this.getAttribute("class");if(b){a=RegExp("(?:^|\\s+)"+a+"(?=\\s|$)","i");if(a.test(b))(b=b.replace(a,"").replace(/^\s+/,""))?this.setAttribute("class",
    +b):this.removeAttribute("class")}return this},hasClass:function(a){return RegExp("(?:^|\\s+)"+a+"(?=\\s|$)","").test(this.getAttribute("class"))},append:function(a,b){typeof a=="string"&&(a=this.getDocument().createElement(a));b?this.$.insertBefore(a.$,this.$.firstChild):this.$.appendChild(a.$);return a},appendHtml:function(a){if(this.$.childNodes.length){var b=new CKEDITOR.dom.element("div",this.getDocument());b.setHtml(a);b.moveChildren(this)}else this.setHtml(a)},appendText:function(a){this.$.text!=
    +void 0?this.$.text=this.$.text+a:this.append(new CKEDITOR.dom.text(a))},appendBogus:function(){for(var a=this.getLast();a&&a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.rtrim(a.getText());)a=a.getPrevious();if(!a||!a.is||!a.is("br")){a=CKEDITOR.env.opera?this.getDocument().createText(""):this.getDocument().createElement("br");CKEDITOR.env.gecko&&a.setAttribute("type","_moz");this.append(a)}},breakParent:function(a){var b=new CKEDITOR.dom.range(this.getDocument());b.setStartAfter(this);b.setEndAfter(a);
    +a=b.extractContents();b.insertNode(this.remove());a.insertAfterNode(this)},contains:CKEDITOR.env.ie||CKEDITOR.env.webkit?function(a){var b=this.$;return a.type!=CKEDITOR.NODE_ELEMENT?b.contains(a.getParent().$):b!=a.$&&b.contains(a.$)}:function(a){return!!(this.$.compareDocumentPosition(a.$)&16)},focus:function(){function a(){try{this.$.focus()}catch(a){}}return function(b){b?CKEDITOR.tools.setTimeout(a,100,this):a.call(this)}}(),getHtml:function(){var a=this.$.innerHTML;return CKEDITOR.env.ie?a.replace(/<\?[^>]*>/g,
    +""):a},getOuterHtml:function(){if(this.$.outerHTML)return this.$.outerHTML.replace(/<\?[^>]*>/,"");var a=this.$.ownerDocument.createElement("div");a.appendChild(this.$.cloneNode(true));return a.innerHTML},getClientRect:function(){var a=CKEDITOR.tools.extend({},this.$.getBoundingClientRect());!a.width&&(a.width=a.right-a.left);!a.height&&(a.height=a.bottom-a.top);return a},setHtml:function(){var a=function(a){return this.$.innerHTML=a};return CKEDITOR.env.ie&&CKEDITOR.env.version<9?function(a){try{return this.$.innerHTML=
    +a}catch(b){this.$.innerHTML="";var c=new CKEDITOR.dom.element("body",this.getDocument());c.$.innerHTML=a;for(c=c.getChildren();c.count();)this.append(c.getItem(0));return a}}:a}(),setText:function(a){CKEDITOR.dom.element.prototype.setText=this.$.innerText!=void 0?function(a){return this.$.innerText=a}:function(a){return this.$.textContent=a};return this.setText(a)},getAttribute:function(){var a=function(a){return this.$.getAttribute(a,2)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?
    +function(a){switch(a){case "class":a="className";break;case "http-equiv":a="httpEquiv";break;case "name":return this.$.name;case "tabindex":a=this.$.getAttribute(a,2);a!==0&&this.$.tabIndex===0&&(a=null);return a;case "checked":a=this.$.attributes.getNamedItem(a);return(a.specified?a.nodeValue:this.$.checked)?"checked":null;case "hspace":case "value":return this.$[a];case "style":return this.$.style.cssText;case "contenteditable":case "contentEditable":return this.$.attributes.getNamedItem("contentEditable").specified?
    +this.$.getAttribute("contentEditable"):null}return this.$.getAttribute(a,2)}:a}(),getChildren:function(){return new CKEDITOR.dom.nodeList(this.$.childNodes)},getComputedStyle:CKEDITOR.env.ie?function(a){return this.$.currentStyle[CKEDITOR.tools.cssStyleToDomStyle(a)]}:function(a){var b=this.getWindow().$.getComputedStyle(this.$,null);return b?b.getPropertyValue(a):""},getDtd:function(){var a=CKEDITOR.dtd[this.getName()];this.getDtd=function(){return a};return a},getElementsByTag:CKEDITOR.dom.document.prototype.getElementsByTag,
    +getTabIndex:CKEDITOR.env.ie?function(){var a=this.$.tabIndex;a===0&&(!CKEDITOR.dtd.$tabIndex[this.getName()]&&parseInt(this.getAttribute("tabindex"),10)!==0)&&(a=-1);return a}:CKEDITOR.env.webkit?function(){var a=this.$.tabIndex;if(a==void 0){a=parseInt(this.getAttribute("tabindex"),10);isNaN(a)&&(a=-1)}return a}:function(){return this.$.tabIndex},getText:function(){return this.$.textContent||this.$.innerText||""},getWindow:function(){return this.getDocument().getWindow()},getId:function(){return this.$.id||
    +null},getNameAtt:function(){return this.$.name||null},getName:function(){var a=this.$.nodeName.toLowerCase();if(CKEDITOR.env.ie&&!(document.documentMode>8)){var b=this.$.scopeName;b!="HTML"&&(a=b.toLowerCase()+":"+a)}return(this.getName=function(){return a})()},getValue:function(){return this.$.value},getFirst:function(a){var b=this.$.firstChild;(b=b&&new CKEDITOR.dom.node(b))&&(a&&!a(b))&&(b=b.getNext(a));return b},getLast:function(a){var b=this.$.lastChild;(b=b&&new CKEDITOR.dom.node(b))&&(a&&!a(b))&&
    +(b=b.getPrevious(a));return b},getStyle:function(a){return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]},is:function(){var a=this.getName();if(typeof arguments[0]=="object")return!!arguments[0][a];for(var b=0;b<arguments.length;b++)if(arguments[b]==a)return true;return false},isEditable:function(a){var b=this.getName();if(this.isReadOnly()||this.getComputedStyle("display")=="none"||this.getComputedStyle("visibility")=="hidden"||CKEDITOR.dtd.$nonEditable[b]||CKEDITOR.dtd.$empty[b]||this.is("a")&&
    +(this.data("cke-saved-name")||this.hasAttribute("name"))&&!this.getChildCount())return false;if(a!==false){a=CKEDITOR.dtd[b]||CKEDITOR.dtd.span;return!(!a||!a["#"])}return true},isIdentical:function(a){var b=this.clone(0,1),a=a.clone(0,1);b.removeAttributes(["_moz_dirty","data-cke-expando","data-cke-saved-href","data-cke-saved-name"]);a.removeAttributes(["_moz_dirty","data-cke-expando","data-cke-saved-href","data-cke-saved-name"]);if(b.$.isEqualNode){b.$.style.cssText=CKEDITOR.tools.normalizeCssText(b.$.style.cssText);
    +a.$.style.cssText=CKEDITOR.tools.normalizeCssText(a.$.style.cssText);return b.$.isEqualNode(a.$)}b=b.getOuterHtml();a=a.getOuterHtml();if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&this.is("a")){var c=this.getParent();if(c.type==CKEDITOR.NODE_ELEMENT){c=c.clone();c.setHtml(b);b=c.getHtml();c.setHtml(a);a=c.getHtml()}}return b==a},isVisible:function(){var a=(this.$.offsetHeight||this.$.offsetWidth)&&this.getComputedStyle("visibility")!="hidden",b,c;if(a&&(CKEDITOR.env.webkit||CKEDITOR.env.opera)){b=
    +this.getWindow();if(!b.equals(CKEDITOR.document.getWindow())&&(c=b.$.frameElement))a=(new CKEDITOR.dom.element(c)).isVisible()}return!!a},isEmptyInlineRemoveable:function(){if(!CKEDITOR.dtd.$removeEmpty[this.getName()])return false;for(var a=this.getChildren(),b=0,c=a.count();b<c;b++){var d=a.getItem(b);if(!(d.type==CKEDITOR.NODE_ELEMENT&&d.data("cke-bookmark"))&&(d.type==CKEDITOR.NODE_ELEMENT&&!d.isEmptyInlineRemoveable()||d.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(d.getText())))return false}return true},
    +hasAttributes:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(){for(var a=this.$.attributes,b=0;b<a.length;b++){var c=a[b];switch(c.nodeName){case "class":if(this.getAttribute("class"))return true;case "data-cke-expando":continue;default:if(c.specified)return true}}return false}:function(){var a=this.$.attributes,b=a.length,c={"data-cke-expando":1,_moz_dirty:1};return b>0&&(b>2||!c[a[0].nodeName]||b==2&&!c[a[1].nodeName])},hasAttribute:function(){function a(a){a=this.$.attributes.getNamedItem(a);
    +return!(!a||!a.specified)}return CKEDITOR.env.ie&&CKEDITOR.env.version<8?function(b){return b=="name"?!!this.$.name:a.call(this,b)}:a}(),hide:function(){this.setStyle("display","none")},moveChildren:function(a,b){var c=this.$,a=a.$;if(c!=a){var d;if(b)for(;d=c.lastChild;)a.insertBefore(c.removeChild(d),a.firstChild);else for(;d=c.firstChild;)a.appendChild(c.removeChild(d))}},mergeSiblings:function(){function a(a,b,c){if(b&&b.type==CKEDITOR.NODE_ELEMENT){for(var i=[];b.data("cke-bookmark")||b.isEmptyInlineRemoveable();){i.push(b);
    +b=c?b.getNext():b.getPrevious();if(!b||b.type!=CKEDITOR.NODE_ELEMENT)return}if(a.isIdentical(b)){for(var l=c?a.getLast():a.getFirst();i.length;)i.shift().move(a,!c);b.moveChildren(a,!c);b.remove();l&&l.type==CKEDITOR.NODE_ELEMENT&&l.mergeSiblings()}}}return function(b){if(b===false||CKEDITOR.dtd.$removeEmpty[this.getName()]||this.is("a")){a(this,this.getNext(),true);a(this,this.getPrevious())}}}(),show:function(){this.setStyles({display:"",visibility:""})},setAttribute:function(){var a=function(a,
    +b){this.$.setAttribute(a,b);return this};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(b,c){b=="class"?this.$.className=c:b=="style"?this.$.style.cssText=c:b=="tabindex"?this.$.tabIndex=c:b=="checked"?this.$.checked=c:b=="contenteditable"?a.call(this,"contentEditable",c):a.apply(this,arguments);return this}:CKEDITOR.env.ie8Compat&&CKEDITOR.env.secure?function(b,c){if(b=="src"&&c.match(/^http:\/\//))try{a.apply(this,arguments)}catch(d){}else a.apply(this,arguments);
    +return this}:a}(),setAttributes:function(a){for(var b in a)this.setAttribute(b,a[b]);return this},setValue:function(a){this.$.value=a;return this},removeAttribute:function(){var a=function(a){this.$.removeAttribute(a)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(a){a=="class"?a="className":a=="tabindex"?a="tabIndex":a=="contenteditable"&&(a="contentEditable");this.$.removeAttribute(a)}:a}(),removeAttributes:function(a){if(CKEDITOR.tools.isArray(a))for(var b=0;b<
    +a.length;b++)this.removeAttribute(a[b]);else for(b in a)a.hasOwnProperty(b)&&this.removeAttribute(b)},removeStyle:function(a){var b=this.$.style;if(!b.removeProperty&&(a=="border"||a=="margin"||a=="padding")){var c=["top","left","right","bottom"],d;a=="border"&&(d=["color","style","width"]);for(var b=[],i=0;i<c.length;i++)if(d)for(var l=0;l<d.length;l++)b.push([a,c[i],d[l]].join("-"));else b.push([a,c[i]].join("-"));for(a=0;a<b.length;a++)this.removeStyle(b[a])}else{b.removeProperty?b.removeProperty(a):
    +b.removeAttribute(CKEDITOR.tools.cssStyleToDomStyle(a));this.$.style.cssText||this.removeAttribute("style")}},setStyle:function(a,b){this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]=b;return this},setStyles:function(a){for(var b in a)this.setStyle(b,a[b]);return this},setOpacity:function(a){if(CKEDITOR.env.ie&&CKEDITOR.env.version<9){a=Math.round(a*100);this.setStyle("filter",a>=100?"":"progid:DXImageTransform.Microsoft.Alpha(opacity="+a+")")}else this.setStyle("opacity",a)},unselectable:function(){this.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select",
    +"none"));if(CKEDITOR.env.ie||CKEDITOR.env.opera){this.setAttribute("unselectable","on");for(var a,b=this.getElementsByTag("*"),c=0,d=b.count();c<d;c++){a=b.getItem(c);a.setAttribute("unselectable","on")}}},getPositionedAncestor:function(){for(var a=this;a.getName()!="html";){if(a.getComputedStyle("position")!="static")return a;a=a.getParent()}return null},getDocumentPosition:function(a){var b=0,c=0,d=this.getDocument(),i=d.getBody(),l=d.$.compatMode=="BackCompat";if(document.documentElement.getBoundingClientRect){var j=
    +this.$.getBoundingClientRect(),m=d.$.documentElement,n=m.clientTop||i.$.clientTop||0,q=m.clientLeft||i.$.clientLeft||0,p=true;if(CKEDITOR.env.ie){p=d.getDocumentElement().contains(this);d=d.getBody().contains(this);p=l&&d||!l&&p}if(p){b=j.left+(!l&&m.scrollLeft||i.$.scrollLeft);b=b-q;c=j.top+(!l&&m.scrollTop||i.$.scrollTop);c=c-n}}else{i=this;for(d=null;i&&!(i.getName()=="body"||i.getName()=="html");){b=b+(i.$.offsetLeft-i.$.scrollLeft);c=c+(i.$.offsetTop-i.$.scrollTop);if(!i.equals(this)){b=b+(i.$.clientLeft||
    +0);c=c+(i.$.clientTop||0)}for(;d&&!d.equals(i);){b=b-d.$.scrollLeft;c=c-d.$.scrollTop;d=d.getParent()}d=i;i=(j=i.$.offsetParent)?new CKEDITOR.dom.element(j):null}}if(a){i=this.getWindow();d=a.getWindow();if(!i.equals(d)&&i.$.frameElement){a=(new CKEDITOR.dom.element(i.$.frameElement)).getDocumentPosition(a);b=b+a.x;c=c+a.y}}if(!document.documentElement.getBoundingClientRect&&CKEDITOR.env.gecko&&!l){b=b+(this.$.clientLeft?1:0);c=c+(this.$.clientTop?1:0)}return{x:b,y:c}},scrollIntoView:function(a){var b=
    +this.getParent();if(b){do{(b.$.clientWidth&&b.$.clientWidth<b.$.scrollWidth||b.$.clientHeight&&b.$.clientHeight<b.$.scrollHeight)&&!b.is("body")&&this.scrollIntoParent(b,a,1);if(b.is("html")){var c=b.getWindow();try{var d=c.$.frameElement;d&&(b=new CKEDITOR.dom.element(d))}catch(i){}}}while(b=b.getParent())}},scrollIntoParent:function(a,b,c){var d,i,l,j;function m(b,c){if(/body|html/.test(a.getName()))a.getWindow().$.scrollBy(b,c);else{a.$.scrollLeft=a.$.scrollLeft+b;a.$.scrollTop=a.$.scrollTop+c}}
    +function n(a,b){var c={x:0,y:0};if(!a.is(p?"body":"html")){var g=a.$.getBoundingClientRect();c.x=g.left;c.y=g.top}g=a.getWindow();if(!g.equals(b)){g=n(CKEDITOR.dom.element.get(g.$.frameElement),b);c.x=c.x+g.x;c.y=c.y+g.y}return c}function q(a,b){return parseInt(a.getComputedStyle("margin-"+b)||0,10)||0}!a&&(a=this.getWindow());l=a.getDocument();var p=l.$.compatMode=="BackCompat";a instanceof CKEDITOR.dom.window&&(a=p?l.getBody():l.getDocumentElement());l=a.getWindow();i=n(this,l);var h=n(a,l),g=this.$.offsetHeight;
    +d=this.$.offsetWidth;var u=a.$.clientHeight,w=a.$.clientWidth;l=i.x-q(this,"left")-h.x||0;j=i.y-q(this,"top")-h.y||0;d=i.x+d+q(this,"right")-(h.x+w)||0;i=i.y+g+q(this,"bottom")-(h.y+u)||0;if(j<0||i>0)m(0,b===true?j:b===false?i:j<0?j:i);if(c&&(l<0||d>0))m(l<0?l:d,0)},setState:function(a,b,c){b=b||"cke";switch(a){case CKEDITOR.TRISTATE_ON:this.addClass(b+"_on");this.removeClass(b+"_off");this.removeClass(b+"_disabled");c&&this.setAttribute("aria-pressed",true);c&&this.removeAttribute("aria-disabled");
    +break;case CKEDITOR.TRISTATE_DISABLED:this.addClass(b+"_disabled");this.removeClass(b+"_off");this.removeClass(b+"_on");c&&this.setAttribute("aria-disabled",true);c&&this.removeAttribute("aria-pressed");break;default:this.addClass(b+"_off");this.removeClass(b+"_on");this.removeClass(b+"_disabled");c&&this.removeAttribute("aria-pressed");c&&this.removeAttribute("aria-disabled")}},getFrameDocument:function(){var a=this.$;try{a.contentWindow.document}catch(b){a.src=a.src}return a&&new CKEDITOR.dom.document(a.contentWindow.document)},
    +copyAttributes:function(a,b){for(var c=this.$.attributes,b=b||{},d=0;d<c.length;d++){var i=c[d],l=i.nodeName.toLowerCase(),j;if(!(l in b))if(l=="checked"&&(j=this.getAttribute(l)))a.setAttribute(l,j);else if(i.specified||CKEDITOR.env.ie&&i.nodeValue&&l=="value"){j=this.getAttribute(l);if(j===null)j=i.nodeValue;a.setAttribute(l,j)}}if(this.$.style.cssText!=="")a.$.style.cssText=this.$.style.cssText},renameNode:function(a){if(this.getName()!=a){var b=this.getDocument(),a=new CKEDITOR.dom.element(a,
    +b);this.copyAttributes(a);this.moveChildren(a);this.getParent()&&this.$.parentNode.replaceChild(a.$,this.$);a.$["data-cke-expando"]=this.$["data-cke-expando"];this.$=a.$}},getChild:function(){function a(a,b){var c=a.childNodes;if(b>=0&&b<c.length)return c[b]}return function(b){var c=this.$;if(b.slice)for(;b.length>0&&c;)c=a(c,b.shift());else c=a(c,b);return c?new CKEDITOR.dom.node(c):null}}(),getChildCount:function(){return this.$.childNodes.length},disableContextMenu:function(){this.on("contextmenu",
    +function(a){a.data.getTarget().hasClass("cke_enable_context_menu")||a.data.preventDefault()})},getDirection:function(a){return a?this.getComputedStyle("direction")||this.getDirection()||this.getParent()&&this.getParent().getDirection(1)||this.getDocument().$.dir||"ltr":this.getStyle("direction")||this.getAttribute("dir")},data:function(a,b){a="data-"+a;if(b===void 0)return this.getAttribute(a);b===false?this.removeAttribute(a):this.setAttribute(a,b);return null},getEditor:function(){var a=CKEDITOR.instances,
    +b,c;for(b in a){c=a[b];if(c.element.equals(this)&&c.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO)return c}return null}});var c={width:["border-left-width","border-right-width","padding-left","padding-right"],height:["border-top-width","border-bottom-width","padding-top","padding-bottom"]};CKEDITOR.dom.element.prototype.setSize=function(a,c,f){if(typeof c=="number"){if(f&&(!CKEDITOR.env.ie||!CKEDITOR.env.quirks))c=c-b.call(this,a);this.setStyle(a,c+"px")}};CKEDITOR.dom.element.prototype.getSize=function(a,
    +c){var f=Math.max(this.$["offset"+CKEDITOR.tools.capitalize(a)],this.$["client"+CKEDITOR.tools.capitalize(a)])||0;c&&(f=f-b.call(this,a));return f}})();CKEDITOR.dom.documentFragment=function(b){b=b||CKEDITOR.document;this.$=b.type==CKEDITOR.NODE_DOCUMENT?b.$.createDocumentFragment():b};
    +CKEDITOR.tools.extend(CKEDITOR.dom.documentFragment.prototype,CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,insertAfterNode:function(b){b=b.$;b.parentNode.insertBefore(this.$,b.nextSibling)}},!0,{append:1,appendBogus:1,getFirst:1,getLast:1,getParent:1,getNext:1,getPrevious:1,appendTo:1,moveChildren:1,insertBefore:1,insertAfterNode:1,replace:1,trim:1,type:1,ltrim:1,rtrim:1,getDocument:1,getChildCount:1,getChild:1,getChildren:1});
    +(function(){function b(a,b){var c=this.range;if(this._.end)return null;if(!this._.start){this._.start=1;if(c.collapsed){this.end();return null}c.optimize()}var d,n=c.startContainer;d=c.endContainer;var q=c.startOffset,p=c.endOffset,h,g=this.guard,u=this.type,e=a?"getPreviousSourceNode":"getNextSourceNode";if(!a&&!this._.guardLTR){var k=d.type==CKEDITOR.NODE_ELEMENT?d:d.getParent(),f=d.type==CKEDITOR.NODE_ELEMENT?d.getChild(p):d.getNext();this._.guardLTR=function(a,b){return(!b||!k.equals(a))&&(!f||
    +!a.equals(f))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}if(a&&!this._.guardRTL){var B=n.type==CKEDITOR.NODE_ELEMENT?n:n.getParent(),z=n.type==CKEDITOR.NODE_ELEMENT?q?n.getChild(q-1):null:n.getPrevious();this._.guardRTL=function(a,b){return(!b||!B.equals(a))&&(!z||!a.equals(z))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}var F=a?this._.guardRTL:this._.guardLTR;h=g?function(a,b){return F(a,b)===false?false:g(a,b)}:F;if(this.current)d=this.current[e](false,u,h);else{if(a)d.type==
    +CKEDITOR.NODE_ELEMENT&&(d=p>0?d.getChild(p-1):h(d,true)===false?null:d.getPreviousSourceNode(true,u,h));else{d=n;if(d.type==CKEDITOR.NODE_ELEMENT&&!(d=d.getChild(q)))d=h(n,true)===false?null:n.getNextSourceNode(true,u,h)}d&&h(d)===false&&(d=null)}for(;d&&!this._.end;){this.current=d;if(!this.evaluator||this.evaluator(d)!==false){if(!b)return d}else if(b&&this.evaluator)return false;d=d[e](false,u,h)}this.end();return this.current=null}function c(a){for(var c,d=null;c=b.call(this,a);)d=c;return d}
    +CKEDITOR.dom.walker=CKEDITOR.tools.createClass({$:function(a){this.range=a;this._={}},proto:{end:function(){this._.end=1},next:function(){return b.call(this)},previous:function(){return b.call(this,1)},checkForward:function(){return b.call(this,0,1)!==false},checkBackward:function(){return b.call(this,1,1)!==false},lastForward:function(){return c.call(this)},lastBackward:function(){return c.call(this,1)},reset:function(){delete this.current;this._={}}}});var a={block:1,"list-item":1,table:1,"table-row-group":1,
    +"table-header-group":1,"table-footer-group":1,"table-row":1,"table-column-group":1,"table-column":1,"table-cell":1,"table-caption":1};CKEDITOR.dom.element.prototype.isBlockBoundary=function(b){b=b?CKEDITOR.tools.extend({},CKEDITOR.dtd.$block,b||{}):CKEDITOR.dtd.$block;return this.getComputedStyle("float")=="none"&&a[this.getComputedStyle("display")]||b[this.getName()]};CKEDITOR.dom.walker.blockBoundary=function(a){return function(b){return!(b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary(a))}};CKEDITOR.dom.walker.listItemBoundary=
    +function(){return this.blockBoundary({br:1})};CKEDITOR.dom.walker.bookmark=function(a,b){function c(a){return a&&a.getName&&a.getName()=="span"&&a.data("cke-bookmark")}return function(d){var n,q;n=d&&d.type!=CKEDITOR.NODE_ELEMENT&&(q=d.getParent())&&c(q);n=a?n:n||c(d);return!!(b^n)}};CKEDITOR.dom.walker.whitespaces=function(a){return function(b){var c;b&&b.type==CKEDITOR.NODE_TEXT&&(c=!CKEDITOR.tools.trim(b.getText())||CKEDITOR.env.webkit&&b.getText()=="鈥");return!!(a^c)}};CKEDITOR.dom.walker.invisible=
    +function(a){var b=CKEDITOR.dom.walker.whitespaces();return function(c){if(b(c))c=1;else{c.type==CKEDITOR.NODE_TEXT&&(c=c.getParent());c=!c.$.offsetHeight}return!!(a^c)}};CKEDITOR.dom.walker.nodeType=function(a,b){return function(c){return!!(b^c.type==a)}};CKEDITOR.dom.walker.bogus=function(a){function b(a){return!f(a)&&!d(a)}return function(c){var d=!CKEDITOR.env.ie?c.is&&c.is("br"):c.getText&&e.test(c.getText());if(d){d=c.getParent();c=c.getNext(b);d=d.isBlockBoundary()&&(!c||c.type==CKEDITOR.NODE_ELEMENT&&
    +c.isBlockBoundary())}return!!(a^d)}};var e=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/,f=CKEDITOR.dom.walker.whitespaces(),d=CKEDITOR.dom.walker.bookmark();CKEDITOR.dom.element.prototype.getBogus=function(){var a=this;do a=a.getPreviousSourceNode();while(d(a)||f(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in CKEDITOR.dtd.$inline&&!(a.getName()in CKEDITOR.dtd.$empty));return a&&(!CKEDITOR.env.ie?a.is&&a.is("br"):a.getText&&e.test(a.getText()))?a:false}})();
    +CKEDITOR.dom.range=function(b){this.endOffset=this.endContainer=this.startOffset=this.startContainer=null;this.collapsed=true;var c=b instanceof CKEDITOR.dom.document;this.document=c?b:b.getDocument();this.root=c?b.getBody():b};
    +(function(){function b(){var a=false,b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(true),h=CKEDITOR.dom.walker.bogus();return function(g){if(c(g)||b(g))return true;if(h(g)&&!a)return a=true;return g.type==CKEDITOR.NODE_TEXT&&(g.hasAscendant("pre")||CKEDITOR.tools.trim(g.getText()).length)||g.type==CKEDITOR.NODE_ELEMENT&&!g.is(d)?false:true}}function c(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(1);return function(h){return c(h)||b(h)?true:!a&&i(h)||
    +h.type==CKEDITOR.NODE_ELEMENT&&h.is(CKEDITOR.dtd.$removeEmpty)}}function a(a){return!l(a)&&!j(a)}var e=function(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer.equals(a.endContainer)&&a.startOffset==a.endOffset},f=function(a,b,c,h){a.optimizeBookmark();var g=a.startContainer,d=a.endContainer,e=a.startOffset,k=a.endOffset,i,f;if(d.type==CKEDITOR.NODE_TEXT)d=d.split(k);else if(d.getChildCount()>0)if(k>=d.getChildCount()){d=d.append(a.document.createText(""));f=true}else d=d.getChild(k);
    +if(g.type==CKEDITOR.NODE_TEXT){g.split(e);g.equals(d)&&(d=g.getNext())}else if(e)if(e>=g.getChildCount()){g=g.append(a.document.createText(""));i=true}else g=g.getChild(e).getPrevious();else{g=g.append(a.document.createText(""),1);i=true}var e=g.getParents(),k=d.getParents(),l,j,s;for(l=0;l<e.length;l++){j=e[l];s=k[l];if(!j.equals(s))break}for(var m=c,r,A,v,o=l;o<e.length;o++){r=e[o];m&&!r.equals(g)&&(A=m.append(r.clone()));for(r=r.getNext();r;){if(r.equals(k[o])||r.equals(d))break;v=r.getNext();
    +if(b==2)m.append(r.clone(true));else{r.remove();b==1&&m.append(r)}r=v}m&&(m=A)}m=c;for(c=l;c<k.length;c++){r=k[c];b>0&&!r.equals(d)&&(A=m.append(r.clone()));if(!e[c]||r.$.parentNode!=e[c].$.parentNode)for(r=r.getPrevious();r;){if(r.equals(e[c])||r.equals(g))break;v=r.getPrevious();if(b==2)m.$.insertBefore(r.$.cloneNode(true),m.$.firstChild);else{r.remove();b==1&&m.$.insertBefore(r.$,m.$.firstChild)}r=v}m&&(m=A)}if(b==2){j=a.startContainer;if(j.type==CKEDITOR.NODE_TEXT){j.$.data=j.$.data+j.$.nextSibling.data;
    +j.$.parentNode.removeChild(j.$.nextSibling)}a=a.endContainer;if(a.type==CKEDITOR.NODE_TEXT&&a.$.nextSibling){a.$.data=a.$.data+a.$.nextSibling.data;a.$.parentNode.removeChild(a.$.nextSibling)}}else{if(j&&s&&(g.$.parentNode!=j.$.parentNode||d.$.parentNode!=s.$.parentNode)){b=s.getIndex();i&&s.$.parentNode==g.$.parentNode&&b--;if(h&&j.type==CKEDITOR.NODE_ELEMENT){h=CKEDITOR.dom.element.createFromHtml('<span data-cke-bookmark="1" style="display:none">&nbsp;</span>',a.document);h.insertAfter(j);j.mergeSiblings(false);
    +a.moveToBookmark({startNode:h})}else a.setStart(s.getParent(),b)}a.collapse(true)}i&&g.remove();f&&d.$.parentNode&&d.remove()},d={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1},i=CKEDITOR.dom.walker.bogus(),l=new CKEDITOR.dom.walker.whitespaces,j=new CKEDITOR.dom.walker.bookmark,m=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/;CKEDITOR.dom.range.prototype={clone:function(){var a=new CKEDITOR.dom.range(this.root);
    +a.startContainer=this.startContainer;a.startOffset=this.startOffset;a.endContainer=this.endContainer;a.endOffset=this.endOffset;a.collapsed=this.collapsed;return a},collapse:function(a){if(a){this.endContainer=this.startContainer;this.endOffset=this.startOffset}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset}this.collapsed=true},cloneContents:function(){var a=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||f(this,2,a);return a},deleteContents:function(a){this.collapsed||
    +f(this,0,null,a)},extractContents:function(a){var b=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||f(this,1,b,a);return b},createBookmark:function(a){var b,c,h,g,d=this.collapsed;b=this.document.createElement("span");b.data("cke-bookmark",1);b.setStyle("display","none");b.setHtml("&nbsp;");if(a){h="cke_bm_"+CKEDITOR.tools.getNextNumber();b.setAttribute("id",h+(d?"C":"S"))}if(!d){c=b.clone();c.setHtml("&nbsp;");a&&c.setAttribute("id",h+"E");g=this.clone();g.collapse();g.insertNode(c)}g=
    +this.clone();g.collapse(true);g.insertNode(b);if(c){this.setStartAfter(b);this.setEndBefore(c)}else this.moveToPosition(b,CKEDITOR.POSITION_AFTER_END);return{startNode:a?h+(d?"C":"S"):b,endNode:a?h+"E":c,serializable:a,collapsed:d}},createBookmark2:function(a){var b=this.startContainer,c=this.endContainer,h=this.startOffset,g=this.endOffset,d=this.collapsed,e,k;if(!b||!c)return{start:0,end:0};if(a){if(b.type==CKEDITOR.NODE_ELEMENT){if((e=b.getChild(h))&&e.type==CKEDITOR.NODE_TEXT&&h>0&&e.getPrevious().type==
    +CKEDITOR.NODE_TEXT){b=e;h=0}e&&e.type==CKEDITOR.NODE_ELEMENT&&(h=e.getIndex(1))}for(;b.type==CKEDITOR.NODE_TEXT&&(k=b.getPrevious())&&k.type==CKEDITOR.NODE_TEXT;){b=k;h=h+k.getLength()}if(!d){if(c.type==CKEDITOR.NODE_ELEMENT){if((e=c.getChild(g))&&e.type==CKEDITOR.NODE_TEXT&&g>0&&e.getPrevious().type==CKEDITOR.NODE_TEXT){c=e;g=0}e&&e.type==CKEDITOR.NODE_ELEMENT&&(g=e.getIndex(1))}for(;c.type==CKEDITOR.NODE_TEXT&&(k=c.getPrevious())&&k.type==CKEDITOR.NODE_TEXT;){c=k;g=g+k.getLength()}}}return{start:b.getAddress(a),
    +end:d?null:c.getAddress(a),startOffset:h,endOffset:g,normalized:a,collapsed:d,is2:true}},moveToBookmark:function(a){if(a.is2){var b=this.document.getByAddress(a.start,a.normalized),c=a.startOffset,h=a.end&&this.document.getByAddress(a.end,a.normalized),a=a.endOffset;this.setStart(b,c);h?this.setEnd(h,a):this.collapse(true)}else{b=(c=a.serializable)?this.document.getById(a.startNode):a.startNode;a=c?this.document.getById(a.endNode):a.endNode;this.setStartBefore(b);b.remove();if(a){this.setEndBefore(a);
    +a.remove()}else this.collapse(true)}},getBoundaryNodes:function(){var a=this.startContainer,b=this.endContainer,c=this.startOffset,h=this.endOffset,g;if(a.type==CKEDITOR.NODE_ELEMENT){g=a.getChildCount();if(g>c)a=a.getChild(c);else if(g<1)a=a.getPreviousSourceNode();else{for(a=a.$;a.lastChild;)a=a.lastChild;a=new CKEDITOR.dom.node(a);a=a.getNextSourceNode()||a}}if(b.type==CKEDITOR.NODE_ELEMENT){g=b.getChildCount();if(g>h)b=b.getChild(h).getPreviousSourceNode(true);else if(g<1)b=b.getPreviousSourceNode();
    +else{for(b=b.$;b.lastChild;)b=b.lastChild;b=new CKEDITOR.dom.node(b)}}a.getPosition(b)&CKEDITOR.POSITION_FOLLOWING&&(a=b);return{startNode:a,endNode:b}},getCommonAncestor:function(a,b){var c=this.startContainer,h=this.endContainer,c=c.equals(h)?a&&c.type==CKEDITOR.NODE_ELEMENT&&this.startOffset==this.endOffset-1?c.getChild(this.startOffset):c:c.getCommonAncestor(h);return b&&!c.is?c.getParent():c},optimize:function(){var a=this.startContainer,b=this.startOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=
    +a.getLength()&&this.setStartAfter(a):this.setStartBefore(a));a=this.endContainer;b=this.endOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setEndAfter(a):this.setEndBefore(a))},optimizeBookmark:function(){var a=this.startContainer,b=this.endContainer;a.is&&(a.is("span")&&a.data("cke-bookmark"))&&this.setStartAt(a,CKEDITOR.POSITION_BEFORE_START);b&&(b.is&&b.is("span")&&b.data("cke-bookmark"))&&this.setEndAt(b,CKEDITOR.POSITION_AFTER_END)},trim:function(a,b){var c=this.startContainer,
    +h=this.startOffset,g=this.collapsed;if((!a||g)&&c&&c.type==CKEDITOR.NODE_TEXT){if(h)if(h>=c.getLength()){h=c.getIndex()+1;c=c.getParent()}else{var d=c.split(h),h=c.getIndex()+1,c=c.getParent();if(this.startContainer.equals(this.endContainer))this.setEnd(d,this.endOffset-this.startOffset);else if(c.equals(this.endContainer))this.endOffset=this.endOffset+1}else{h=c.getIndex();c=c.getParent()}this.setStart(c,h);if(g){this.collapse(true);return}}c=this.endContainer;h=this.endOffset;if(!b&&!g&&c&&c.type==
    +CKEDITOR.NODE_TEXT){if(h){h>=c.getLength()||c.split(h);h=c.getIndex()+1}else h=c.getIndex();c=c.getParent();this.setEnd(c,h)}},enlarge:function(a,b){switch(a){case CKEDITOR.ENLARGE_INLINE:var c=1;case CKEDITOR.ENLARGE_ELEMENT:if(this.collapsed)break;var h=this.getCommonAncestor(),g=this.root,d,e,k,i,f,l=false,j,s;j=this.startContainer;s=this.startOffset;if(j.type==CKEDITOR.NODE_TEXT){if(s){j=!CKEDITOR.tools.trim(j.substring(0,s)).length&&j;l=!!j}if(j&&!(i=j.getPrevious()))k=j.getParent()}else{s&&
    +(i=j.getChild(s-1)||j.getLast());i||(k=j)}for(;k||i;){if(k&&!i){!f&&k.equals(h)&&(f=true);if(c?k.isBlockBoundary():!g.contains(k))break;if(!l||k.getComputedStyle("display")!="inline"){l=false;f?d=k:this.setStartBefore(k)}i=k.getPrevious()}for(;i;){j=false;if(i.type==CKEDITOR.NODE_COMMENT)i=i.getPrevious();else{if(i.type==CKEDITOR.NODE_TEXT){s=i.getText();/[^\s\ufeff]/.test(s)&&(i=null);j=/[\s\ufeff]$/.test(s)}else if((i.$.offsetWidth>0||b&&i.is("br"))&&!i.data("cke-bookmark"))if(l&&CKEDITOR.dtd.$removeEmpty[i.getName()]){s=
    +i.getText();if(/[^\s\ufeff]/.test(s))i=null;else for(var m=i.$.getElementsByTagName("*"),r=0,A;A=m[r++];)if(!CKEDITOR.dtd.$removeEmpty[A.nodeName.toLowerCase()]){i=null;break}i&&(j=!!s.length)}else i=null;j&&(l?f?d=k:k&&this.setStartBefore(k):l=true);if(i){j=i.getPrevious();if(!k&&!j){k=i;i=null;break}i=j}else k=null}}k&&(k=k.getParent())}j=this.endContainer;s=this.endOffset;k=i=null;f=l=false;if(j.type==CKEDITOR.NODE_TEXT){j=!CKEDITOR.tools.trim(j.substring(s)).length&&j;l=!(j&&j.getLength());if(j&&
    +!(i=j.getNext()))k=j.getParent()}else(i=j.getChild(s))||(k=j);for(;k||i;){if(k&&!i){!f&&k.equals(h)&&(f=true);if(c?k.isBlockBoundary():!g.contains(k))break;if(!l||k.getComputedStyle("display")!="inline"){l=false;f?e=k:k&&this.setEndAfter(k)}i=k.getNext()}for(;i;){j=false;if(i.type==CKEDITOR.NODE_TEXT){s=i.getText();/[^\s\ufeff]/.test(s)&&(i=null);j=/^[\s\ufeff]/.test(s)}else if(i.type==CKEDITOR.NODE_ELEMENT){if((i.$.offsetWidth>0||b&&i.is("br"))&&!i.data("cke-bookmark"))if(l&&CKEDITOR.dtd.$removeEmpty[i.getName()]){s=
    +i.getText();if(/[^\s\ufeff]/.test(s))i=null;else{m=i.$.getElementsByTagName("*");for(r=0;A=m[r++];)if(!CKEDITOR.dtd.$removeEmpty[A.nodeName.toLowerCase()]){i=null;break}}i&&(j=!!s.length)}else i=null}else j=1;j&&l&&(f?e=k:this.setEndAfter(k));if(i){j=i.getNext();if(!k&&!j){k=i;i=null;break}i=j}else k=null}k&&(k=k.getParent())}if(d&&e){h=d.contains(e)?e:d;this.setStartBefore(h);this.setEndAfter(h)}break;case CKEDITOR.ENLARGE_BLOCK_CONTENTS:case CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:k=new CKEDITOR.dom.range(this.root);
    +g=this.root;k.setStartAt(g,CKEDITOR.POSITION_AFTER_START);k.setEnd(this.startContainer,this.startOffset);k=new CKEDITOR.dom.walker(k);var v,o,x=CKEDITOR.dom.walker.blockBoundary(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?{br:1}:null),I=function(a){var b=x(a);b||(v=a);return b},c=function(a){var b=I(a);!b&&(a.is&&a.is("br"))&&(o=a);return b};k.guard=I;k=k.lastBackward();v=v||g;this.setStartAt(v,!v.is("br")&&(!k&&this.checkStartOfBlock()||k&&v.contains(k))?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_AFTER_END);
    +if(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS){k=this.clone();k=new CKEDITOR.dom.walker(k);var G=CKEDITOR.dom.walker.whitespaces(),D=CKEDITOR.dom.walker.bookmark();k.evaluator=function(a){return!G(a)&&!D(a)};if((k=k.previous())&&k.type==CKEDITOR.NODE_ELEMENT&&k.is("br"))break}k=this.clone();k.collapse();k.setEndAt(g,CKEDITOR.POSITION_BEFORE_END);k=new CKEDITOR.dom.walker(k);k.guard=a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?c:I;v=null;k=k.lastForward();v=v||g;this.setEndAt(v,!k&&this.checkEndOfBlock()||k&&
    +v.contains(k)?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_BEFORE_START);o&&this.setEndAfter(o)}},shrink:function(a,b,c){if(!this.collapsed){var a=a||CKEDITOR.SHRINK_TEXT,d=this.clone(),g=this.startContainer,e=this.endContainer,i=this.startOffset,k=this.endOffset,f=1,j=1;if(g&&g.type==CKEDITOR.NODE_TEXT)if(i)if(i>=g.getLength())d.setStartAfter(g);else{d.setStartBefore(g);f=0}else d.setStartBefore(g);if(e&&e.type==CKEDITOR.NODE_TEXT)if(k)if(k>=e.getLength())d.setEndAfter(e);else{d.setEndAfter(e);
    +j=0}else d.setEndBefore(e);var d=new CKEDITOR.dom.walker(d),l=CKEDITOR.dom.walker.bookmark();d.evaluator=function(b){return b.type==(a==CKEDITOR.SHRINK_ELEMENT?CKEDITOR.NODE_ELEMENT:CKEDITOR.NODE_TEXT)};var m;d.guard=function(b,d){if(l(b))return true;if(a==CKEDITOR.SHRINK_ELEMENT&&b.type==CKEDITOR.NODE_TEXT||d&&b.equals(m)||c===false&&b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary())return false;!d&&b.type==CKEDITOR.NODE_ELEMENT&&(m=b);return true};if(f)(g=d[a==CKEDITOR.SHRINK_ELEMENT?"lastForward":
    +"next"]())&&this.setStartAt(g,b?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_START);if(j){d.reset();(d=d[a==CKEDITOR.SHRINK_ELEMENT?"lastBackward":"previous"]())&&this.setEndAt(d,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_END)}return!(!f&&!j)}},insertNode:function(a){this.optimizeBookmark();this.trim(false,true);var b=this.startContainer,c=b.getChild(this.startOffset);c?a.insertBefore(c):b.append(a);a.getParent()&&a.getParent().equals(this.endContainer)&&this.endOffset++;this.setStartBefore(a)},
    +moveToPosition:function(a,b){this.setStartAt(a,b);this.collapse(true)},moveToRange:function(a){this.setStart(a.startContainer,a.startOffset);this.setEnd(a.endContainer,a.endOffset)},selectNodeContents:function(a){this.setStart(a,0);this.setEnd(a,a.type==CKEDITOR.NODE_TEXT?a.getLength():a.getChildCount())},setStart:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex();a=a.getParent()}this.startContainer=a;this.startOffset=b;if(!this.endContainer){this.endContainer=
    +a;this.endOffset=b}e(this)},setEnd:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex()+1;a=a.getParent()}this.endContainer=a;this.endOffset=b;if(!this.startContainer){this.startContainer=a;this.startOffset=b}e(this)},setStartAfter:function(a){this.setStart(a.getParent(),a.getIndex()+1)},setStartBefore:function(a){this.setStart(a.getParent(),a.getIndex())},setEndAfter:function(a){this.setEnd(a.getParent(),a.getIndex()+1)},setEndBefore:function(a){this.setEnd(a.getParent(),
    +a.getIndex())},setStartAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setStart(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==CKEDITOR.NODE_TEXT?this.setStart(a,a.getLength()):this.setStart(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setStartBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setStartAfter(a)}e(this)},setEndAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setEnd(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==
    +CKEDITOR.NODE_TEXT?this.setEnd(a,a.getLength()):this.setEnd(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setEndBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setEndAfter(a)}e(this)},fixBlock:function(a,b){var c=this.createBookmark(),d=this.document.createElement(b);this.collapse(a);this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);this.extractContents().appendTo(d);d.trim();CKEDITOR.env.ie||d.appendBogus();this.insertNode(d);this.moveToBookmark(c);return d},splitBlock:function(a){var b=
    +new CKEDITOR.dom.elementPath(this.startContainer,this.root),c=new CKEDITOR.dom.elementPath(this.endContainer,this.root),d=b.block,g=c.block,e=null;if(!b.blockLimit.equals(c.blockLimit))return null;if(a!="br"){if(!d){d=this.fixBlock(true,a);g=(new CKEDITOR.dom.elementPath(this.endContainer,this.root)).block}g||(g=this.fixBlock(false,a))}a=d&&this.checkStartOfBlock();b=g&&this.checkEndOfBlock();this.deleteContents();if(d&&d.equals(g))if(b){e=new CKEDITOR.dom.elementPath(this.startContainer,this.root);
    +this.moveToPosition(g,CKEDITOR.POSITION_AFTER_END);g=null}else if(a){e=new CKEDITOR.dom.elementPath(this.startContainer,this.root);this.moveToPosition(d,CKEDITOR.POSITION_BEFORE_START);d=null}else{g=this.splitElement(d);!CKEDITOR.env.ie&&!d.is("ul","ol")&&d.appendBogus()}return{previousBlock:d,nextBlock:g,wasStartOfBlock:a,wasEndOfBlock:b,elementPath:e}},splitElement:function(a){if(!this.collapsed)return null;this.setEndAt(a,CKEDITOR.POSITION_BEFORE_END);var b=this.extractContents(),c=a.clone(false);
    +b.appendTo(c);c.insertAfter(a);this.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);return c},removeEmptyBlocksAtEnd:function(){function a(d){return function(a){return b(a)||(c(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.isEmptyInlineRemoveable())||d.is("table")&&a.is("caption")?false:true}}var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(false);return function(b){for(var c=this.createBookmark(),d=this[b?"endPath":"startPath"](),e=d.block||d.blockLimit,i;e&&!e.equals(d.root)&&!e.getFirst(a(e));){i=
    +e.getParent();this[b?"setEndAt":"setStartAt"](e,CKEDITOR.POSITION_AFTER_END);e.remove(1);e=i}this.moveToBookmark(c)}}(),startPath:function(){return new CKEDITOR.dom.elementPath(this.startContainer,this.root)},endPath:function(){return new CKEDITOR.dom.elementPath(this.endContainer,this.root)},checkBoundaryOfElement:function(a,b){var d=b==CKEDITOR.START,h=this.clone();h.collapse(d);h[d?"setStartAt":"setEndAt"](a,d?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END);h=new CKEDITOR.dom.walker(h);
    +h.evaluator=c(d);return h[d?"checkBackward":"checkForward"]()},checkStartOfBlock:function(){var a=this.startContainer,c=this.startOffset;if(CKEDITOR.env.ie&&c&&a.type==CKEDITOR.NODE_TEXT){a=CKEDITOR.tools.ltrim(a.substring(0,c));m.test(a)&&this.trim(0,1)}this.trim();a=new CKEDITOR.dom.elementPath(this.startContainer,this.root);c=this.clone();c.collapse(true);c.setStartAt(a.block||a.blockLimit,CKEDITOR.POSITION_AFTER_START);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkBackward()},checkEndOfBlock:function(){var a=
    +this.endContainer,c=this.endOffset;if(CKEDITOR.env.ie&&a.type==CKEDITOR.NODE_TEXT){a=CKEDITOR.tools.rtrim(a.substring(c));m.test(a)&&this.trim(1,0)}this.trim();a=new CKEDITOR.dom.elementPath(this.endContainer,this.root);c=this.clone();c.collapse(false);c.setEndAt(a.block||a.blockLimit,CKEDITOR.POSITION_BEFORE_END);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkForward()},getPreviousNode:function(a,b,c){var d=this.clone();d.collapse(1);d.setStartAt(c||this.root,CKEDITOR.POSITION_AFTER_START);
    +c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.previous()},getNextNode:function(a,b,c){var d=this.clone();d.collapse();d.setEndAt(c||this.root,CKEDITOR.POSITION_BEFORE_END);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.next()},checkReadOnly:function(){function a(b,c){for(;b;){if(b.type==CKEDITOR.NODE_ELEMENT){if(b.getAttribute("contentEditable")=="false"&&!b.data("cke-editable"))return 0;if(b.is("html")||b.getAttribute("contentEditable")=="true"&&(b.contains(c)||b.equals(c)))break}b=
    +b.getParent()}return 1}return function(){var b=this.startContainer,c=this.endContainer;return!(a(b,c)&&a(c,b))}}(),moveToElementEditablePosition:function(b,c){if(b.type==CKEDITOR.NODE_ELEMENT&&!b.isEditable(false)){this.moveToPosition(b,c?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);return true}for(var d=0;b;){if(b.type==CKEDITOR.NODE_TEXT){c&&this.checkEndOfBlock()&&m.test(b.getText())?this.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START):this.moveToPosition(b,c?CKEDITOR.POSITION_AFTER_END:
    +CKEDITOR.POSITION_BEFORE_START);d=1;break}if(b.type==CKEDITOR.NODE_ELEMENT)if(b.isEditable()){this.moveToPosition(b,c?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_START);d=1}else c&&(b.is("br")&&this.checkEndOfBlock())&&this.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START);var h=b,g=d,e=void 0;h.type==CKEDITOR.NODE_ELEMENT&&h.isEditable(false)&&(e=h[c?"getLast":"getFirst"](a));!g&&!e&&(e=h[c?"getPrevious":"getNext"](a));b=e}return!!d},moveToElementEditStart:function(a){return this.moveToElementEditablePosition(a)},
    +moveToElementEditEnd:function(a){return this.moveToElementEditablePosition(a,true)},getEnclosedNode:function(){var a=this.clone();a.optimize();if(a.startContainer.type!=CKEDITOR.NODE_ELEMENT||a.endContainer.type!=CKEDITOR.NODE_ELEMENT)return null;var a=new CKEDITOR.dom.walker(a),b=CKEDITOR.dom.walker.bookmark(false,true),c=CKEDITOR.dom.walker.whitespaces(true);a.evaluator=function(a){return c(a)&&b(a)};var d=a.next();a.reset();return d&&d.equals(a.previous())?d:null},getTouchedStartNode:function(){var a=
    +this.startContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.startOffset)||a},getTouchedEndNode:function(){var a=this.endContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.endOffset-1)||a},scrollIntoView:function(){var a=new CKEDITOR.dom.element.createFromHtml("<span>&nbsp;</span>",this.document),b,c,d,g=this.clone();g.optimize();if(d=g.startContainer.type==CKEDITOR.NODE_TEXT){c=g.startContainer.getText();b=g.startContainer.split(g.startOffset);
    +a.insertAfter(g.startContainer)}else g.insertNode(a);a.scrollIntoView();if(d){g.startContainer.setText(c);b.remove()}a.remove()}}})();CKEDITOR.POSITION_AFTER_START=1;CKEDITOR.POSITION_BEFORE_END=2;CKEDITOR.POSITION_BEFORE_START=3;CKEDITOR.POSITION_AFTER_END=4;CKEDITOR.ENLARGE_ELEMENT=1;CKEDITOR.ENLARGE_BLOCK_CONTENTS=2;CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS=3;CKEDITOR.ENLARGE_INLINE=4;CKEDITOR.START=1;CKEDITOR.END=2;CKEDITOR.SHRINK_ELEMENT=1;CKEDITOR.SHRINK_TEXT=2;
    +(function(){function b(a){if(!(arguments.length<1)){this.range=a;this.forceBrBreak=0;this.enlargeBr=1;this.enforceRealBlocks=0;this._||(this._={})}}function c(a,b,c){for(a=a.getNextSourceNode(b,null,c);!e(a);)a=a.getNextSourceNode(b,null,c);return a}var a=/^[\r\n\t ]+$/,e=CKEDITOR.dom.walker.bookmark(false,true),f=CKEDITOR.dom.walker.whitespaces(true),d=function(a){return e(a)&&f(a)};b.prototype={getNextParagraph:function(b){b=b||"p";if(!CKEDITOR.dtd[this.range.root.getName()][b])return null;var f,
    +j,m,n,q,p;if(!this._.started){j=this.range.clone();j.shrink(CKEDITOR.NODE_ELEMENT,true);n=j.endContainer.hasAscendant("pre",true)||j.startContainer.hasAscendant("pre",true);j.enlarge(this.forceBrBreak&&!n||!this.enlargeBr?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS);if(!j.collapsed){n=new CKEDITOR.dom.walker(j.clone());var h=CKEDITOR.dom.walker.bookmark(true,true);n.evaluator=h;this._.nextNode=n.next();n=new CKEDITOR.dom.walker(j.clone());n.evaluator=h;n=n.previous();this._.lastNode=
    +n.getNextSourceNode(true);if(this._.lastNode&&this._.lastNode.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(this._.lastNode.getText())&&this._.lastNode.getParent().isBlockBoundary()){h=this.range.clone();h.moveToPosition(this._.lastNode,CKEDITOR.POSITION_AFTER_END);if(h.checkEndOfBlock()){h=new CKEDITOR.dom.elementPath(h.endContainer,h.root);this._.lastNode=(h.block||h.blockLimit).getNextSourceNode(true)}}if(!this._.lastNode){this._.lastNode=this._.docEndMarker=j.document.createText("");this._.lastNode.insertAfter(n)}j=
    +null}this._.started=1}h=this._.nextNode;n=this._.lastNode;for(this._.nextNode=null;h;){var g=0,u=h.hasAscendant("pre"),w=h.type!=CKEDITOR.NODE_ELEMENT,k=0;if(w)h.type==CKEDITOR.NODE_TEXT&&a.test(h.getText())&&(w=0);else{var t=h.getName();if(h.isBlockBoundary(this.forceBrBreak&&!u&&{br:1})){if(t=="br")w=1;else if(!j&&!h.getChildCount()&&t!="hr"){f=h;m=h.equals(n);break}if(j){j.setEndAt(h,CKEDITOR.POSITION_BEFORE_START);if(t!="br")this._.nextNode=h}g=1}else{if(h.getFirst()){if(!j){j=this.range.clone();
    +j.setStartAt(h,CKEDITOR.POSITION_BEFORE_START)}h=h.getFirst();continue}w=1}}if(w&&!j){j=this.range.clone();j.setStartAt(h,CKEDITOR.POSITION_BEFORE_START)}m=(!g||w)&&h.equals(n);if(j&&!g)for(;!h.getNext(d)&&!m;){t=h.getParent();if(t.isBlockBoundary(this.forceBrBreak&&!u&&{br:1})){g=1;w=0;m||t.equals(n);j.setEndAt(t,CKEDITOR.POSITION_BEFORE_END);break}h=t;w=1;m=h.equals(n);k=1}w&&j.setEndAt(h,CKEDITOR.POSITION_AFTER_END);h=c(h,k,n);if((m=!h)||g&&j)break}if(!f){if(!j){this._.docEndMarker&&this._.docEndMarker.remove();
    +return this._.nextNode=null}f=new CKEDITOR.dom.elementPath(j.startContainer,j.root);h=f.blockLimit;g={div:1,th:1,td:1};f=f.block;if(!f&&h&&!this.enforceRealBlocks&&g[h.getName()]&&j.checkStartOfBlock()&&j.checkEndOfBlock()&&!h.equals(j.root))f=h;else if(!f||this.enforceRealBlocks&&f.getName()=="li"){f=this.range.document.createElement(b);j.extractContents().appendTo(f);f.trim();j.insertNode(f);q=p=true}else if(f.getName()!="li"){if(!j.checkStartOfBlock()||!j.checkEndOfBlock()){f=f.clone(false);j.extractContents().appendTo(f);
    +f.trim();p=j.splitBlock();q=!p.wasStartOfBlock;p=!p.wasEndOfBlock;j.insertNode(f)}}else if(!m)this._.nextNode=f.equals(n)?null:c(j.getBoundaryNodes().endNode,1,n)}if(q)(j=f.getPrevious())&&j.type==CKEDITOR.NODE_ELEMENT&&(j.getName()=="br"?j.remove():j.getLast()&&j.getLast().$.nodeName.toLowerCase()=="br"&&j.getLast().remove());if(p)(j=f.getLast())&&j.type==CKEDITOR.NODE_ELEMENT&&j.getName()=="br"&&(CKEDITOR.env.ie||j.getPrevious(e)||j.getNext(e))&&j.remove();if(!this._.nextNode)this._.nextNode=m||
    +f.equals(n)||!n?null:c(f,1,n);return f}};CKEDITOR.dom.range.prototype.createIterator=function(){return new b(this)}})();
    +CKEDITOR.command=function(b,c){this.uiItems=[];this.exec=function(a){if(this.state==CKEDITOR.TRISTATE_DISABLED||!this.checkAllowed())return false;this.editorFocus&&b.focus();return this.fire("exec")===false?true:c.exec.call(this,b,a)!==false};this.refresh=function(a,b){if(!this.readOnly&&a.readOnly)return true;if(this.context&&!b.isContextFor(this.context)){this.disable();return true}this.enable();return this.fire("refresh",{editor:a,path:b})===false?true:c.refresh&&c.refresh.apply(this,arguments)!==
    +false};var a;this.checkAllowed=function(){return typeof a=="boolean"?a:a=b.filter.checkFeature(this)};CKEDITOR.tools.extend(this,c,{modes:{wysiwyg:1},editorFocus:1,contextSensitive:!!c.context,state:CKEDITOR.TRISTATE_DISABLED});CKEDITOR.event.call(this)};
    +CKEDITOR.command.prototype={enable:function(){this.state==CKEDITOR.TRISTATE_DISABLED&&this.checkAllowed()&&this.setState(!this.preserveState||typeof this.previousState=="undefined"?CKEDITOR.TRISTATE_OFF:this.previousState)},disable:function(){this.setState(CKEDITOR.TRISTATE_DISABLED)},setState:function(b){if(this.state==b||!this.checkAllowed())return false;this.previousState=this.state;this.state=b;this.fire("state");return true},toggleState:function(){this.state==CKEDITOR.TRISTATE_OFF?this.setState(CKEDITOR.TRISTATE_ON):
    +this.state==CKEDITOR.TRISTATE_ON&&this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.event.implementOn(CKEDITOR.command.prototype);CKEDITOR.ENTER_P=1;CKEDITOR.ENTER_BR=2;CKEDITOR.ENTER_DIV=3;
    +CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:"<!DOCTYPE html>",bodyId:"",bodyClass:"",fullPage:!1,height:200,extraPlugins:"",removePlugins:"",protectedSource:[],tabIndex:0,width:"",baseFloatZIndex:1E4,blockedKeystrokes:[CKEDITOR.CTRL+66,CKEDITOR.CTRL+73,CKEDITOR.CTRL+85]};
    +(function(){function b(a,b,d,g,h){var e=b.name;if((g||typeof a.elements!="function"||a.elements(e))&&(!a.match||a.match(b))){if(g=!h){a:if(a.nothingRequired)g=true;else{if(h=a.requiredClasses){e=b.classes;for(g=0;g<h.length;++g)if(CKEDITOR.tools.indexOf(e,h[g])==-1){g=false;break a}}g=f(b.styles,a.requiredStyles)&&f(b.attributes,a.requiredAttributes)}g=!g}if(!g){if(!a.propertiesOnly)d.valid=true;if(!d.allAttributes)d.allAttributes=c(a.attributes,b.attributes,d.validAttributes);if(!d.allStyles)d.allStyles=
    +c(a.styles,b.styles,d.validStyles);if(!d.allClasses){a=a.classes;b=b.classes;g=d.validClasses;if(a)if(a===true)b=true;else{for(var h=0,e=b.length,k;h<e;++h){k=b[h];g[k]||(g[k]=a(k))}b=false}else b=false;d.allClasses=b}}}}function c(a,b,c){if(!a)return false;if(a===true)return true;for(var d in b)c[d]||(c[d]=a(d,b[d]));return false}function a(a,b){if(!a)return false;if(a===true)return a;if(typeof a=="string"){a=s(a);return a=="*"?true:CKEDITOR.tools.convertArrayToObject(a.split(b))}if(CKEDITOR.tools.isArray(a))return a.length?
    +CKEDITOR.tools.convertArrayToObject(a):false;var c={},d=0,g;for(g in a){c[g]=a[g];d++}return d?c:false}function e(a){if(a._.filterFunction)return a._.filterFunction;var c=/^cke:(object|embed|param)$/,d=/^(object|embed|param)$/;return a._.filterFunction=function(g,h,e,k,i,f,p){var o=g.name,q,l=false;if(i)g.name=o=o.replace(c,"$1");if(e=e&&e[o]){j(g);for(o=0;o<e.length;++o)u(a,g,e[o]);m(g)}if(h){var o=g.name,e=h.elements[o],w=h.generic,h={valid:false,validAttributes:{},validClasses:{},validStyles:{},
    +allAttributes:false,allClasses:false,allStyles:false};if(!e&&!w){k.push(g);return true}j(g);if(e){o=0;for(q=e.length;o<q;++o)b(e[o],g,h,true,f)}if(w){o=0;for(q=w.length;o<q;++o)b(w[o],g,h,false,f)}if(!h.valid){k.push(g);return true}f=h.validAttributes;o=h.validStyles;e=h.validClasses;q=g.attributes;var w=g.styles,s=q["class"],x=q.style,t,F,z=[],r=[],C=/^data-cke-/,B=false;delete q.style;delete q["class"];if(!h.allAttributes)for(t in q)if(!f[t])if(C.test(t)){if(t!=(F=t.replace(/^data-cke-saved-/,""))&&
    +!f[F]){delete q[t];B=true}}else{delete q[t];B=true}if(h.allStyles){if(x)q.style=x}else{for(t in w)o[t]?z.push(t+":"+w[t]):B=true;if(z.length)q.style=z.sort().join("; ")}if(h.allClasses)s&&(q["class"]=s);else{for(t in e)e[t]&&r.push(t);r.length&&(q["class"]=r.sort().join(" "));s&&r.length<s.split(/\s+/).length&&(B=true)}B&&(l=true);if(!p&&!n(g)){k.push(g);return true}}if(i)g.name=g.name.replace(d,"cke:$1");return l}}function f(a,b){if(!b)return true;for(var c=0;c<b.length;++c)if(!(b[c]in a))return false;
    +return true}function d(a){if(!a)return{};for(var a=a.split(/\s*,\s*/).sort(),b={};a.length;)b[a.shift()]=C;return b}function i(a){for(var b,c,d,g,h={},e=1,a=s(a);b=a.match(v);){if(c=b[2]){d=l(c,"styles");g=l(c,"attrs");c=l(c,"classes")}else d=g=c=null;h["$"+e++]={elements:b[1],classes:c,styles:d,attributes:g};a=a.slice(b[0].length)}return h}function l(a,b){var c=a.match(o[b]);return c?s(c[1]):null}function j(a){if(!a.styles)a.styles=CKEDITOR.tools.parseCssText(a.attributes.style||"",1);if(!a.classes)a.classes=
    +a.attributes["class"]?a.attributes["class"].split(/\s+/):[]}function m(a){var b=a.attributes,c;delete b.style;delete b["class"];if(c=CKEDITOR.tools.writeCssText(a.styles,true))b.style=c;a.classes.length&&(b["class"]=a.classes.sort().join(" "))}function n(a){switch(a.name){case "a":if(!a.children.length&&!a.attributes.name)return false;break;case "img":if(!a.attributes.src)return false}return true}function q(a){return!a?false:a===true?true:function(b){return b in a}}function p(){return new CKEDITOR.htmlParser.element("br")}
    +function h(a){return a.type==CKEDITOR.NODE_ELEMENT&&(a.name=="br"||z.$block[a.name])}function g(a,b,c){var d=a.name;if(z.$empty[d]||!a.children.length)if(d=="hr"&&b=="br")a.replaceWith(p());else{a.parent&&c.push({check:"it",el:a.parent});a.remove()}else if(z.$block[d]||d=="tr")if(b=="br"){if(a.previous&&!h(a.previous)){b=p();b.insertBefore(a)}if(a.next&&!h(a.next)){b=p();b.insertAfter(a)}a.replaceWithChildren()}else{var d=a.children,g;b:{g=z[b];for(var e=0,k=d.length,i;e<k;++e){i=d[e];if(i.type==
    +CKEDITOR.NODE_ELEMENT&&!g[i.name]){g=false;break b}}g=true}if(g){a.name=b;a.attributes={};c.push({check:"parent-down",el:a})}else{g=a.parent;for(var e=g.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT||g.name=="body",f,k=d.length;k>0;){i=d[--k];if(e&&(i.type==CKEDITOR.NODE_TEXT||i.type==CKEDITOR.NODE_ELEMENT&&z.$inline[i.name])){if(!f){f=new CKEDITOR.htmlParser.element(b);f.insertAfter(a);c.push({check:"parent-down",el:f})}f.add(i,0)}else{f=null;i.insertAfter(a);g.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(i.type==
    +CKEDITOR.NODE_ELEMENT&&!z[g.name][i.name])&&c.push({check:"el-up",el:i})}}a.remove()}}else if(d=="style")a.remove();else{a.parent&&c.push({check:"it",el:a.parent});a.replaceWithChildren()}}function u(a,b,c){var d,g;for(d=0;d<c.length;++d){g=c[d];if((!g.check||a.check(g.check,false))&&(!g.left||g.left(b))){g.right(b,x);break}}}function w(a,b){var c=b.getDefinition(),d=c.attributes,g=c.styles,h,e,k,i;if(a.name!=c.element)return false;for(h in d)if(h=="class"){c=d[h].split(/\s+/);for(k=a.classes.join("|");i=
    +c.pop();)if(k.indexOf(i)==-1)return false}else if(a.attributes[h]!=d[h])return false;for(e in g)if(a.styles[e]!=g[e])return false;return true}function k(a,b){var c,d;if(typeof a=="string")c=a;else if(a instanceof CKEDITOR.style)d=a;else{c=a[0];d=a[1]}return[{element:c,left:d,right:function(a,c){c.transform(a,b)}}]}function t(a){return function(b){return w(b,a)}}function B(a){return function(b,c){c[a](b)}}var z=CKEDITOR.dtd,F=CKEDITOR.tools.copy,s=CKEDITOR.tools.trim,C="cke-test";CKEDITOR.filter=function(a){this.allowedContent=
    +[];this.disabled=false;this.editor=null;this.enterMode=CKEDITOR.ENTER_P;this._={rules:{},transformations:{},cachedTests:{}};if(a instanceof CKEDITOR.editor){var b=this.editor=a;this.customConfig=true;var a=b.config.allowedContent,c;if(a===true)this.disabled=true;else{if(!a)this.customConfig=false;this.enterMode=c=b.blockless?CKEDITOR.ENTER_BR:b.config.enterMode;var d=["br"],g=b.blockless?CKEDITOR.ENTER_BR:b.config.shiftEnterMode;(c==CKEDITOR.ENTER_P||g==CKEDITOR.ENTER_P)&&d.push("p");(c==CKEDITOR.ENTER_DIV||
    +g==CKEDITOR.ENTER_DIV)&&d.push("div");this.allow(d.join(" "),"default",1);this.allow(a,"config",1);this.allow(b.config.extraAllowedContent,"extra",1);this._.toHtmlListener=b.on("toHtml",function(a){this.applyTo(a.data.dataValue,true,a.data.dontFilter)&&b.fire("dataFiltered")},this,null,6);this._.toDataFormatListener=b.on("toDataFormat",function(a){this.applyTo(a.data.dataValue,false,true)},this,null,11)}}else{this.customConfig=false;this.allow(a,"default",1)}};CKEDITOR.filter.prototype={allow:function(b,
    +c,d){if(this.disabled||this.customConfig&&!d||!b)return false;this._.cachedChecks={};var g,h;if(typeof b=="string")b=i(b);else if(b instanceof CKEDITOR.style){h=b.getDefinition();d={};b=h.attributes;d[h.element]=h={styles:h.styles,requiredStyles:h.styles&&CKEDITOR.tools.objectKeys(h.styles)};if(b){b=F(b);h.classes=b["class"]?b["class"].split(/\s+/):null;h.requiredClasses=h.classes;delete b["class"];h.attributes=b;h.requiredAttributes=b&&CKEDITOR.tools.objectKeys(b)}b=d}else if(CKEDITOR.tools.isArray(b)){for(g=
    +0;g<b.length;++g)h=this.allow(b[g],c,d);return h}var e,d=[];for(e in b){h=b[e];h=typeof h=="boolean"?{}:typeof h=="function"?{match:h}:F(h);if(e.charAt(0)!="$")h.elements=e;if(c)h.featureName=c.toLowerCase();var k=h;k.elements=a(k.elements,/\s+/)||null;k.propertiesOnly=k.propertiesOnly||k.elements===true;var f=/\s*,\s*/,u=void 0;for(u in r){k[u]=a(k[u],f)||null;var o=k,p=A[u],j=a(k[A[u]],f),l=k[u],w=[],m=true,s=void 0;j?m=false:j={};for(s in l)if(s.charAt(0)=="!"){s=s.slice(1);w.push(s);j[s]=true;
    +m=false}for(;s=w.pop();){l[s]=l["!"+s];delete l["!"+s]}o[p]=(m?false:j)||null}k.match=k.match||null;this.allowedContent.push(h);d.push(h)}c=this._.rules;e=c.elements||{};b=c.generic||[];h=0;for(k=d.length;h<k;++h){f=F(d[h]);u=f.classes===true||f.styles===true||f.attributes===true;o=f;p=void 0;for(p in r)o[p]=q(o[p]);j=true;for(p in A){p=A[p];o[p]=CKEDITOR.tools.objectKeys(o[p]);o[p]&&(j=false)}o.nothingRequired=j;if(f.elements===true||f.elements===null){f.elements=q(f.elements);b[u?"unshift":"push"](f)}else{o=
    +f.elements;delete f.elements;for(g in o)if(e[g])e[g][u?"unshift":"push"](f);else e[g]=[f]}}c.elements=e;c.generic=b.length?b:null;return true},applyTo:function(a,b,c){var d=[],h=!c&&this._.rules,k=this._.transformations,f=e(this),i=this.editor&&this.editor.config.protectedSource,u=false;a.forEach(function(a){if(a.type==CKEDITOR.NODE_ELEMENT){if(!b||!(a.name=="span"&&~CKEDITOR.tools.objectKeys(a.attributes).join("|").indexOf("data-cke-")))f(a,h,k,d,b)&&(u=true)}else if(a.type==CKEDITOR.NODE_COMMENT&&
    +a.value.match(/^\{cke_protected\}(?!\{C\})/)){var c;a:{var g=decodeURIComponent(a.value.replace(/^\{cke_protected\}/,""));c=[];var e,o,p;if(i)for(o=0;o<i.length;++o)if((p=g.match(i[o]))&&p[0].length==g.length){c=true;break a}g=CKEDITOR.htmlParser.fragment.fromHtml(g);g.children.length==1&&(e=g.children[0]).type==CKEDITOR.NODE_ELEMENT&&f(e,h,k,c,b);c=!c.length}c||d.push(a)}},null,true);d.length&&(u=true);for(var o,p,a=[],c=["p","br","div"][this.enterMode-1];o=d.pop();)o.type==CKEDITOR.NODE_ELEMENT?
    +g(o,c,a):o.remove();for(;p=a.pop();){o=p.el;if(o.parent)switch(p.check){case "it":z.$removeEmpty[o.name]&&!o.children.length?g(o,c,a):n(o)||g(o,c,a);break;case "el-up":o.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&!z[o.parent.name][o.name]&&g(o,c,a);break;case "parent-down":o.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&!z[o.parent.name][o.name]&&g(o.parent,c,a)}}return u},checkFeature:function(a){if(this.disabled||!a)return true;a.toFeature&&(a=a.toFeature(this.editor));return!a.requiredContent||
    +this.check(a.requiredContent)},disable:function(){this.disabled=true;this._.toHtmlListener&&this._.toHtmlListener.removeListener();this._.toDataFormatListener&&this._.toDataFormatListener.removeListener()},addContentForms:function(a){if(!this.disabled&&a){var b,c,d=[],g;for(b=0;b<a.length&&!g;++b){c=a[b];if((typeof c=="string"||c instanceof CKEDITOR.style)&&this.check(c))g=c}if(g){for(b=0;b<a.length;++b)d.push(k(a[b],g));this.addTransformations(d)}}},addFeature:function(a){if(this.disabled||!a)return true;
    +a.toFeature&&(a=a.toFeature(this.editor));this.allow(a.allowedContent,a.name);this.addTransformations(a.contentTransformations);this.addContentForms(a.contentForms);return this.customConfig&&a.requiredContent?this.check(a.requiredContent):true},addTransformations:function(a){var b,c;if(!this.disabled&&a){var d=this._.transformations,g;for(g=0;g<a.length;++g){b=a[g];var h=void 0,e=void 0,k=void 0,f=void 0,i=void 0,o=void 0;c=[];for(e=0;e<b.length;++e){k=b[e];if(typeof k=="string"){k=k.split(/\s*:\s*/);
    +f=k[0];i=null;o=k[1]}else{f=k.check;i=k.left;o=k.right}if(!h){h=k;h=h.element?h.element:f?f.match(/^([a-z0-9]+)/i)[0]:h.left.getDefinition().element}i instanceof CKEDITOR.style&&(i=t(i));c.push({check:f==h?null:f,left:i,right:typeof o=="string"?B(o):o})}b=h;d[b]||(d[b]=[]);d[b].push(c)}}},check:function(a,b,c){if(this.disabled)return true;if(CKEDITOR.tools.isArray(a)){for(var g=a.length;g--;)if(this.check(a[g],b,c))return true;return false}var h,k;if(typeof a=="string"){k=a+"<"+(b===false?"0":"1")+
    +(c?"1":"0")+">";if(k in this._.cachedChecks)return this._.cachedChecks[k];g=i(a).$1;h=g.styles;var f=g.classes;g.name=g.elements;g.classes=f=f?f.split(/\s*,\s*/):[];g.styles=d(h);g.attributes=d(g.attributes);g.children=[];f.length&&(g.attributes["class"]=f.join(" "));if(h)g.attributes.style=CKEDITOR.tools.writeCssText(g.styles);h=g}else{g=a.getDefinition();h=g.styles;f=g.attributes||{};if(h){h=F(h);f.style=CKEDITOR.tools.writeCssText(h,true)}else h={};h={name:g.element,attributes:f,classes:f["class"]?
    +f["class"].split(/\s+/):[],styles:h,children:[]}}var f=CKEDITOR.tools.clone(h),o=[],p;if(b!==false&&(p=this._.transformations[h.name])){for(g=0;g<p.length;++g)u(this,h,p[g]);m(h)}e(this)(f,this._.rules,b===false?false:this._.transformations,o,false,!c,!c);b=o.length>0?false:CKEDITOR.tools.objectCompare(h.attributes,f.attributes,true)?true:false;typeof a=="string"&&(this._.cachedChecks[k]=b);return b}};var r={styles:1,attributes:1,classes:1},A={styles:"requiredStyles",attributes:"requiredAttributes",
    +classes:"requiredClasses"},v=/^([a-z0-9*\s]+)((?:\s*\{[!\w\-,\s\*]+\}\s*|\s*\[[!\w\-,\s\*]+\]\s*|\s*\([!\w\-,\s\*]+\)\s*){0,3})(?:;\s*|$)/i,o={styles:/{([^}]+)}/,attrs:/\[([^\]]+)\]/,classes:/\(([^\)]+)\)/},x=CKEDITOR.filter.transformationsTools={sizeToStyle:function(a){this.lengthToStyle(a,"width");this.lengthToStyle(a,"height")},sizeToAttribute:function(a){this.lengthToAttribute(a,"width");this.lengthToAttribute(a,"height")},lengthToStyle:function(a,b,c){c=c||b;if(!(c in a.styles)){var d=a.attributes[b];
    +if(d){/^\d+$/.test(d)&&(d=d+"px");a.styles[c]=d}}delete a.attributes[b]},lengthToAttribute:function(a,b,c){c=c||b;if(!(c in a.attributes)){var d=a.styles[b],g=d&&d.match(/^(\d+)(?:\.\d*)?px$/);g?a.attributes[c]=g[1]:d==C&&(a.attributes[c]=C)}delete a.styles[b]},alignmentToStyle:function(a){if(!("float"in a.styles)){var b=a.attributes.align;if(b=="left"||b=="right")a.styles["float"]=b}delete a.attributes.align},alignmentToAttribute:function(a){if(!("align"in a.attributes)){var b=a.styles["float"];
    +if(b=="left"||b=="right")a.attributes.align=b}delete a.styles["float"]},matchesStyle:w,transform:function(a,b){if(typeof b=="string")a.name=b;else{var c=b.getDefinition(),d=c.styles,g=c.attributes,h,e,k,f;a.name=c.element;for(h in g)if(h=="class"){c=a.classes.join("|");for(k=g[h].split(/\s+/);f=k.pop();)c.indexOf(f)==-1&&a.classes.push(f)}else a.attributes[h]=g[h];for(e in d)a.styles[e]=d[e]}}}})();
    +(function(){CKEDITOR.focusManager=function(b){if(b.focusManager)return b.focusManager;this.hasFocus=false;this.currentActive=null;this._={editor:b};return this};CKEDITOR.focusManager._={blurDelay:200};CKEDITOR.focusManager.prototype={focus:function(){this._.timer&&clearTimeout(this._.timer);if(!this.hasFocus&&!this._.locked){var b=CKEDITOR.currentInstance;b&&b.focusManager.blur(1);this.hasFocus=true;(b=this._.editor.container)&&b.addClass("cke_focus");this._.editor.fire("focus")}},lock:function(){this._.locked=
    +1},unlock:function(){delete this._.locked},blur:function(b){function c(){if(this.hasFocus){this.hasFocus=false;var a=this._.editor.container;a&&a.removeClass("cke_focus");this._.editor.fire("blur")}}if(!this._.locked){this._.timer&&clearTimeout(this._.timer);var a=CKEDITOR.focusManager._.blurDelay;b||!a?c.call(this):this._.timer=CKEDITOR.tools.setTimeout(function(){delete this._.timer;c.call(this)},a,this)}},add:function(b,c){var a=b.getCustomData("focusmanager");if(!a||a!=this){a&&a.remove(b);var a=
    +"focus",e="blur";if(c)if(CKEDITOR.env.ie){a="focusin";e="focusout"}else CKEDITOR.event.useCapture=1;var f={blur:function(){b.equals(this.currentActive)&&this.blur()},focus:function(){this.currentActive=b;this.focus()}};b.on(a,f.focus,this);b.on(e,f.blur,this);if(c)CKEDITOR.event.useCapture=0;b.setCustomData("focusmanager",this);b.setCustomData("focusmanager_handlers",f)}},remove:function(b){b.removeCustomData("focusmanager");var c=b.removeCustomData("focusmanager_handlers");b.removeListener("blur",
    +c.blur);b.removeListener("focus",c.focus)}}})();CKEDITOR.keystrokeHandler=function(b){if(b.keystrokeHandler)return b.keystrokeHandler;this.keystrokes={};this.blockedKeystrokes={};this._={editor:b};return this};
    +(function(){var b,c=function(a){var a=a.data,c=a.getKeystroke(),d=this.keystrokes[c],i=this._.editor;b=i.fire("key",{keyCode:c})===false;if(!b){d&&(b=i.execCommand(d,{from:"keystrokeHandler"})!==false);b||(b=!!this.blockedKeystrokes[c])}b&&a.preventDefault(true);return!b},a=function(a){if(b){b=false;a.data.preventDefault(true)}};CKEDITOR.keystrokeHandler.prototype={attach:function(b){b.on("keydown",c,this);if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)b.on("keypress",a,this)}}})();
    +(function(){CKEDITOR.lang={languages:{af:1,ar:1,bg:1,bn:1,bs:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,"en-au":1,"en-ca":1,"en-gb":1,en:1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,"fr-ca":1,fr:1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,id:1,is:1,it:1,ja:1,ka:1,km:1,ko:1,ku:1,lt:1,lv:1,mk:1,mn:1,ms:1,nb:1,nl:1,no:1,pl:1,"pt-br":1,pt:1,ro:1,ru:1,si:1,sk:1,sl:1,sq:1,"sr-latn":1,sr:1,sv:1,th:1,tr:1,ug:1,uk:1,vi:1,"zh-cn":1,zh:1},load:function(b,c,a){if(!b||!CKEDITOR.lang.languages[b])b=this.detect(c,b);this[b]?a(b,this[b]):CKEDITOR.scriptLoader.load(CKEDITOR.getUrl("lang/"+
    +b+".js"),function(){a(b,this[b])},this)},detect:function(b,c){var a=this.languages,c=c||navigator.userLanguage||navigator.language||b,e=c.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),f=e[1],e=e[2];a[f+"-"+e]?f=f+"-"+e:a[f]||(f=null);CKEDITOR.lang.detect=f?function(){return f}:function(a){return a};return f||b}}})();
    +CKEDITOR.scriptLoader=function(){var b={},c={};return{load:function(a,e,f,d){var i=typeof a=="string";i&&(a=[a]);f||(f=CKEDITOR);var l=a.length,j=[],m=[],n=function(a){e&&(i?e.call(f,a):e.call(f,j,m))};if(l===0)n(true);else{var q=function(a,b){(b?j:m).push(a);if(--l<=0){d&&CKEDITOR.document.getDocumentElement().removeStyle("cursor");n(b)}},p=function(a,d){b[a]=1;var g=c[a];delete c[a];for(var h=0;h<g.length;h++)g[h](a,d)},h=function(a){if(b[a])q(a,true);else{var d=c[a]||(c[a]=[]);d.push(q);if(!(d.length>
    +1)){var g=new CKEDITOR.dom.element("script");g.setAttributes({type:"text/javascript",src:a});if(e)if(CKEDITOR.env.ie)g.$.onreadystatechange=function(){if(g.$.readyState=="loaded"||g.$.readyState=="complete"){g.$.onreadystatechange=null;p(a,true)}};else{g.$.onload=function(){setTimeout(function(){p(a,true)},0)};g.$.onerror=function(){p(a,false)}}g.appendTo(CKEDITOR.document.getHead())}}};d&&CKEDITOR.document.getDocumentElement().setStyle("cursor","wait");for(var g=0;g<l;g++)h(a[g])}},queue:function(){function a(){var a;
    +(a=b[0])&&this.load(a.scriptUrl,a.callback,CKEDITOR,0)}var b=[];return function(c,d){var i=this;b.push({scriptUrl:c,callback:function(){d&&d.apply(this,arguments);b.shift();a.call(i)}});b.length==1&&a.call(this)}}()}}();CKEDITOR.resourceManager=function(b,c){this.basePath=b;this.fileName=c;this.registered={};this.loaded={};this.externals={};this._={waitingList:{}}};
    +CKEDITOR.resourceManager.prototype={add:function(b,c){if(this.registered[b])throw'[CKEDITOR.resourceManager.add] The resource name "'+b+'" is already registered.';var a=this.registered[b]=c||{};a.name=b;a.path=this.getPath(b);CKEDITOR.fire(b+CKEDITOR.tools.capitalize(this.fileName)+"Ready",a);return this.get(b)},get:function(b){return this.registered[b]||null},getPath:function(b){var c=this.externals[b];return CKEDITOR.getUrl(c&&c.dir||this.basePath+b+"/")},getFilePath:function(b){var c=this.externals[b];
    +return CKEDITOR.getUrl(this.getPath(b)+(c&&typeof c.file=="string"?c.file:this.fileName+".js"))},addExternal:function(b,c,a){for(var b=b.split(","),e=0;e<b.length;e++)this.externals[b[e]]={dir:c,file:a}},load:function(b,c,a){CKEDITOR.tools.isArray(b)||(b=b?[b]:[]);for(var e=this.loaded,f=this.registered,d=[],i={},l={},j=0;j<b.length;j++){var m=b[j];if(m)if(!e[m]&&!f[m]){var n=this.getFilePath(m);d.push(n);n in i||(i[n]=[]);i[n].push(m)}else l[m]=this.get(m)}CKEDITOR.scriptLoader.load(d,function(b,
    +d){if(d.length)throw'[CKEDITOR.resourceManager.load] Resource name "'+i[d[0]].join(",")+'" was not found at "'+d[0]+'".';for(var h=0;h<b.length;h++)for(var g=i[b[h]],f=0;f<g.length;f++){var j=g[f];l[j]=this.get(j);e[j]=1}c.call(a,l)},this)}};CKEDITOR.plugins=new CKEDITOR.resourceManager("plugins/","plugin");
    +CKEDITOR.plugins.load=CKEDITOR.tools.override(CKEDITOR.plugins.load,function(b){var c={};return function(a,e,f){var d={},i=function(a){b.call(this,a,function(a){CKEDITOR.tools.extend(d,a);var b=[],l;for(l in a){var q=a[l],p=q&&q.requires;if(!c[l]){if(q.icons)for(var h=q.icons.split(","),g=0;g<h.length;g++)CKEDITOR.skin.addIcon(h[g],q.path+"icons/"+h[g]+".png");c[l]=1}if(p){p.split&&(p=p.split(","));for(q=0;q<p.length;q++)d[p[q]]||b.push(p[q])}}if(b.length)i.call(this,b);else{for(l in d){q=d[l];if(q.onLoad&&
    +!q.onLoad._called){q.onLoad()===false&&delete d[l];q.onLoad._called=1}}e&&e.call(f||window,d)}},this)};i.call(this,a)}});CKEDITOR.plugins.setLang=function(b,c,a){var e=this.get(b),b=e.langEntries||(e.langEntries={}),e=e.lang||(e.lang=[]);e.split&&(e=e.split(","));CKEDITOR.tools.indexOf(e,c)==-1&&e.push(c);b[c]=a};CKEDITOR.ui=function(b){if(b.ui)return b.ui;this.items={};this.instances={};this.editor=b;this._={handlers:{}};return this};
    +CKEDITOR.ui.prototype={add:function(b,c,a){a.name=b.toLowerCase();var e=this.items[b]={type:c,command:a.command||null,args:Array.prototype.slice.call(arguments,2)};CKEDITOR.tools.extend(e,a)},get:function(b){return this.instances[b]},create:function(b){var c=this.items[b],a=c&&this._.handlers[c.type],e=c&&c.command&&this.editor.getCommand(c.command),a=a&&a.create.apply(this,c.args);this.instances[b]=a;e&&e.uiItems.push(a);if(a&&!a.type)a.type=c.type;return a},addHandler:function(b,c){this._.handlers[b]=
    +c},space:function(b){return CKEDITOR.document.getById(this.spaceId(b))},spaceId:function(b){return this.editor.id+"_"+b}};CKEDITOR.event.implementOn(CKEDITOR.ui);
    +(function(){function b(b,d,h){CKEDITOR.event.call(this);b=b&&CKEDITOR.tools.clone(b);if(d!==void 0){if(d instanceof CKEDITOR.dom.element){if(!h)throw Error("One of the element modes must be specified.");}else throw Error("Expect element of type CKEDITOR.dom.element.");if(CKEDITOR.env.ie&&CKEDITOR.env.quirks&&h==CKEDITOR.ELEMENT_MODE_INLINE)throw Error("Inline element mode is not supported on IE quirks.");if(h==CKEDITOR.ELEMENT_MODE_INLINE&&!d.is(CKEDITOR.dtd.$editable)||h==CKEDITOR.ELEMENT_MODE_REPLACE&&
    +d.is(CKEDITOR.dtd.$nonBodyContent))throw Error('The specified element mode is not supported on element: "'+d.getName()+'".');this.element=d;this.elementMode=h;this.name=this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO&&(d.getId()||d.getNameAtt())}else this.elementMode=CKEDITOR.ELEMENT_MODE_NONE;this._={};this.commands={};this.templates={};this.name=this.name||c();this.id=CKEDITOR.tools.getNextId();this.status="unloaded";this.config=CKEDITOR.tools.prototypedCopy(CKEDITOR.config);this.ui=new CKEDITOR.ui(this);
    +this.focusManager=new CKEDITOR.focusManager(this);this.keystrokeHandler=new CKEDITOR.keystrokeHandler(this);this.on("readOnly",a);this.on("selectionChange",f);this.on("mode",a);this.on("instanceReady",function(){this.config.startupFocus&&this.focus()});CKEDITOR.fire("instanceCreated",null,this);CKEDITOR.add(this);CKEDITOR.tools.setTimeout(function(){i(this,b)},0,this)}function c(){do var a="editor"+ ++p;while(CKEDITOR.instances[a]);return a}function a(){var a=this.commands,b;for(b in a)e(this,a[b])}
    +function e(a,b){b[b.startDisabled?"disable":a.readOnly&&!b.readOnly?"disable":b.modes[a.mode]?"enable":"disable"]()}function f(a){var b=this.commands,c=a.editor,d=a.data.path,h;for(h in b){a=b[h];a.contextSensitive&&a.refresh(c,d)}}function d(a){var b=a.config.customConfig;if(!b)return false;var b=CKEDITOR.getUrl(b),c=h[b]||(h[b]={});if(c.fn){c.fn.call(a,a.config);(CKEDITOR.getUrl(a.config.customConfig)==b||!d(a))&&a.fireOnce("customConfigLoaded")}else CKEDITOR.scriptLoader.queue(b,function(){c.fn=
    +CKEDITOR.editorConfig?CKEDITOR.editorConfig:function(){};d(a)});return true}function i(a,b){a.on("customConfigLoaded",function(){if(b){if(b.on)for(var c in b.on)a.on(c,b.on[c]);CKEDITOR.tools.extend(a.config,b,true);delete a.config.on}a.readOnly=!(!a.config.readOnly&&!(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.isReadOnly():a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&a.element.getAttribute("disabled")));a.blockless=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&&!CKEDITOR.dtd[a.element.getName()].p;
    +a.tabIndex=a.config.tabIndex||a.element&&a.element.getAttribute("tabindex")||0;if(a.config.skin)CKEDITOR.skinName=a.config.skin;a.fireOnce("configLoaded");a.dataProcessor=new CKEDITOR.htmlDataProcessor(a);a.filter=new CKEDITOR.filter(a);l(a)});if(b&&b.customConfig!=void 0)a.config.customConfig=b.customConfig;d(a)||a.fireOnce("customConfigLoaded")}function l(a){CKEDITOR.skin.loadPart("editor",function(){j(a)})}function j(a){CKEDITOR.lang.load(a.config.language,a.config.defaultLanguage,function(b,c){a.langCode=
    +b;a.lang=CKEDITOR.tools.prototypedCopy(c);if(CKEDITOR.env.gecko&&CKEDITOR.env.version<10900&&a.lang.dir=="rtl")a.lang.dir="ltr";if(!a.config.contentsLangDirection)a.config.contentsLangDirection=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.getDirection(1):a.lang.dir;a.fire("langLoaded");m(a)})}function m(a){a.getStylesSet(function(b){a.once("loaded",function(){a.fire("stylesSet",{styles:b})},null,null,1);n(a)})}function n(a){var b=a.config,c=b.plugins,d=b.extraPlugins,h=b.removePlugins;if(d)var e=
    +RegExp("(?:^|,)(?:"+d.replace(/\s*,\s*/g,"|")+")(?=,|$)","g"),c=c.replace(e,""),c=c+(","+d);if(h)var f=RegExp("(?:^|,)(?:"+h.replace(/\s*,\s*/g,"|")+")(?=,|$)","g"),c=c.replace(f,"");CKEDITOR.env.air&&(c=c+",adobeair");CKEDITOR.plugins.load(c.split(","),function(c){var d=[],h=[],e=[];a.plugins=c;for(var k in c){var i=c[k],o=i.lang,p=null,j=i.requires,q;CKEDITOR.tools.isArray(j)&&(j=j.join(","));if(j&&(q=j.match(f)))for(;j=q.pop();)CKEDITOR.tools.setTimeout(function(a,b){throw Error('Plugin "'+a.replace(",",
    +"")+'" cannot be removed from the plugins list, because it\'s required by "'+b+'" plugin.');},0,null,[j,k]);if(o&&!a.lang[k]){o.split&&(o=o.split(","));if(CKEDITOR.tools.indexOf(o,a.langCode)>=0)p=a.langCode;else{p=a.langCode.replace(/-.*/,"");p=p!=a.langCode&&CKEDITOR.tools.indexOf(o,p)>=0?p:CKEDITOR.tools.indexOf(o,"en")>=0?"en":o[0]}if(!i.langEntries||!i.langEntries[p])e.push(CKEDITOR.getUrl(i.path+"lang/"+p+".js"));else{a.lang[k]=i.langEntries[p];p=null}}h.push(p);d.push(i)}CKEDITOR.scriptLoader.load(e,
    +function(){for(var c=["beforeInit","init","afterInit"],e=0;e<c.length;e++)for(var f=0;f<d.length;f++){var k=d[f];e===0&&(h[f]&&k.lang&&k.langEntries)&&(a.lang[k.name]=k.langEntries[h[f]]);if(k[c[e]])k[c[e]](a)}a.fireOnce("pluginsLoaded");b.keystrokes&&a.setKeystroke(a.config.keystrokes);for(f=0;f<a.config.blockedKeystrokes.length;f++)a.keystrokeHandler.blockedKeystrokes[a.config.blockedKeystrokes[f]]=1;a.status="loaded";a.fireOnce("loaded");CKEDITOR.fire("instanceLoaded",null,a)})})}function q(){var a=
    +this.element;if(a&&this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO){var b=this.getData();this.config.htmlEncodeOutput&&(b=CKEDITOR.tools.htmlEncode(b));a.is("textarea")?a.setValue(b):a.setHtml(b);return true}return false}b.prototype=CKEDITOR.editor.prototype;CKEDITOR.editor=b;var p=0,h={};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{addCommand:function(a,b){b.name=a.toLowerCase();var c=new CKEDITOR.command(this,b);this.mode&&e(this,c);return this.commands[a]=c},destroy:function(a){this.fire("beforeDestroy");
    +!a&&q.call(this);this.editable(null);this.status="destroyed";this.fire("destroy");this.removeAllListeners();CKEDITOR.remove(this);CKEDITOR.fire("instanceDestroyed",null,this)},elementPath:function(a){return(a=a||this.getSelection().getStartElement())?new CKEDITOR.dom.elementPath(a,this.editable()):null},createRange:function(){var a=this.editable();return a?new CKEDITOR.dom.range(a):null},execCommand:function(a,b){var c=this.getCommand(a),d={name:a,commandData:b,command:c};if(c&&c.state!=CKEDITOR.TRISTATE_DISABLED&&
    +this.fire("beforeCommandExec",d)!==true){d.returnValue=c.exec(d.commandData);if(!c.async&&this.fire("afterCommandExec",d)!==true)return d.returnValue}return false},getCommand:function(a){return this.commands[a]},getData:function(a){!a&&this.fire("beforeGetData");var b=this._.data;if(typeof b!="string")b=(b=this.element)&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE?b.is("textarea")?b.getValue():b.getHtml():"";b={dataValue:b};!a&&this.fire("getData",b);return b.dataValue},getSnapshot:function(){var a=
    +this.fire("getSnapshot");if(typeof a!="string"){var b=this.element;b&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&(a=b.is("textarea")?b.getValue():b.getHtml())}return a},loadSnapshot:function(a){this.fire("loadSnapshot",a)},setData:function(a,b,c){if(b)this.on("dataReady",function(a){a.removeListener();b.call(a.editor)});a={dataValue:a};!c&&this.fire("setData",a);this._.data=a.dataValue;!c&&this.fire("afterSetData",a)},setReadOnly:function(a){a=a==void 0||a;if(this.readOnly!=a){this.readOnly=
    +a;this.keystrokeHandler.blockedKeystrokes[8]=+a;this.editable().setReadOnly(a);this.fire("readOnly")}},insertHtml:function(a,b){this.fire("insertHtml",{dataValue:a,mode:b})},insertText:function(a){this.fire("insertText",a)},insertElement:function(a){this.fire("insertElement",a)},focus:function(){this.fire("beforeFocus")},checkDirty:function(){return this.status=="ready"&&this._.previousValue!==this.getSnapshot()},resetDirty:function(){this._.previousValue=this.getSnapshot()},updateElement:function(){return q.call(this)},
    +setKeystroke:function(){for(var a=this.keystrokeHandler.keystrokes,b=CKEDITOR.tools.isArray(arguments[0])?arguments[0]:[[].slice.call(arguments,0)],c,d,h=b.length;h--;){c=b[h];d=0;if(CKEDITOR.tools.isArray(c)){d=c[1];c=c[0]}d?a[c]=d:delete a[c]}},addFeature:function(a){return this.filter.addFeature(a)}})})();CKEDITOR.ELEMENT_MODE_NONE=0;CKEDITOR.ELEMENT_MODE_REPLACE=1;CKEDITOR.ELEMENT_MODE_APPENDTO=2;CKEDITOR.ELEMENT_MODE_INLINE=3;
    +CKEDITOR.htmlParser=function(){this._={htmlPartsRegex:RegExp("<(?:(?:\\/([^>]+)>)|(?:!--([\\S|\\s]*?)--\>)|(?:([^\\s>]+)\\s*((?:(?:\"[^\"]*\")|(?:'[^']*')|[^\"'>])*)\\/?>))","g")}};
    +(function(){var b=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,c={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};CKEDITOR.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(a){for(var e,f,d=0,i;e=this._.htmlPartsRegex.exec(a);){f=e.index;if(f>d){d=a.substring(d,f);if(i)i.push(d);else this.onText(d)}d=
    +this._.htmlPartsRegex.lastIndex;if(f=e[1]){f=f.toLowerCase();if(i&&CKEDITOR.dtd.$cdata[f]){this.onCDATA(i.join(""));i=null}if(!i){this.onTagClose(f);continue}}if(i)i.push(e[0]);else if(f=e[3]){f=f.toLowerCase();if(!/="/.test(f)){var l={},j;e=e[4];var m=!!(e&&e.charAt(e.length-1)=="/");if(e)for(;j=b.exec(e);){var n=j[1].toLowerCase();j=j[2]||j[3]||j[4]||"";l[n]=!j&&c[n]?n:j}this.onTagOpen(f,l,m);!i&&CKEDITOR.dtd.$cdata[f]&&(i=[])}}else if(f=e[2])this.onComment(f)}if(a.length>d)this.onText(a.substring(d,
    +a.length))}}})();
    +CKEDITOR.htmlParser.basicWriter=CKEDITOR.tools.createClass({$:function(){this._={output:[]}},proto:{openTag:function(b){this._.output.push("<",b)},openTagClose:function(b,c){c?this._.output.push(" />"):this._.output.push(">")},attribute:function(b,c){typeof c=="string"&&(c=CKEDITOR.tools.htmlEncodeAttr(c));this._.output.push(" ",b,'="',c,'"')},closeTag:function(b){this._.output.push("</",b,">")},text:function(b){this._.output.push(b)},comment:function(b){this._.output.push("<\!--",b,"--\>")},write:function(b){this._.output.push(b)},
    +reset:function(){this._.output=[];this._.indent=false},getHtml:function(b){var c=this._.output.join("");b&&this.reset();return c}}});"use strict";
    +(function(){CKEDITOR.htmlParser.node=function(){};CKEDITOR.htmlParser.node.prototype={remove:function(){var b=this.parent.children,c=CKEDITOR.tools.indexOf(b,this),a=this.previous,e=this.next;a&&(a.next=e);e&&(e.previous=a);b.splice(c,1);this.parent=null},replaceWith:function(b){var c=this.parent.children,a=CKEDITOR.tools.indexOf(c,this),e=b.previous=this.previous,f=b.next=this.next;e&&(e.next=b);f&&(f.previous=b);c[a]=b;b.parent=this.parent;this.parent=null},insertAfter:function(b){var c=b.parent.children,
    +a=CKEDITOR.tools.indexOf(c,b),e=b.next;c.splice(a+1,0,this);this.next=b.next;this.previous=b;b.next=this;e&&(e.previous=this);this.parent=b.parent},insertBefore:function(b){var c=b.parent.children,a=CKEDITOR.tools.indexOf(c,b);c.splice(a,0,this);this.next=b;(this.previous=b.previous)&&(b.previous.next=this);b.previous=this;this.parent=b.parent}}})();"use strict";CKEDITOR.htmlParser.comment=function(b){this.value=b;this._={isBlockLike:false}};
    +CKEDITOR.htmlParser.comment.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_COMMENT,filter:function(b){var c=this.value;if(!(c=b.onComment(c,this))){this.remove();return false}if(typeof c!="string"){this.replaceWith(c);return false}this.value=c;return true},writeHtml:function(b,c){c&&this.filter(c);b.comment(this.value)}});"use strict";
    +(function(){CKEDITOR.htmlParser.text=function(b){this.value=b;this._={isBlockLike:false}};CKEDITOR.htmlParser.text.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(b){if(!(this.value=b.onText(this.value,this))){this.remove();return false}},writeHtml:function(b,c){c&&this.filter(c);b.text(this.value)}})})();"use strict";
    +(function(){CKEDITOR.htmlParser.cdata=function(b){this.value=b};CKEDITOR.htmlParser.cdata.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(){},writeHtml:function(b){b.write(this.value)}})})();"use strict";CKEDITOR.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:true,hasInlineStarted:false}};
    +(function(){function b(a){return a.name=="a"&&a.attributes.href||CKEDITOR.dtd.$removeEmpty[a.name]}var c=CKEDITOR.tools.extend({table:1,ul:1,ol:1,dl:1},CKEDITOR.dtd.table,CKEDITOR.dtd.ul,CKEDITOR.dtd.ol,CKEDITOR.dtd.dl),a={ol:1,ul:1},e=CKEDITOR.tools.extend({},{html:1},CKEDITOR.dtd.html,CKEDITOR.dtd.body,CKEDITOR.dtd.head,{style:1,script:1});CKEDITOR.htmlParser.fragment.fromHtml=function(f,d,i){function l(a){var b;if(u.length>0)for(var c=0;c<u.length;c++){var d=u[c],h=d.name,g=CKEDITOR.dtd[h],e=k.name&&
    +CKEDITOR.dtd[k.name];if((!e||e[h])&&(!a||!g||g[a]||!CKEDITOR.dtd[a])){if(!b){j();b=1}d=d.clone();d.parent=k;k=d;u.splice(c,1);c--}else if(h==k.name){n(k,k.parent,1);c--}}}function j(){for(;w.length;)n(w.shift(),k)}function m(a){if(a._.isBlockLike&&a.name!="pre"&&a.name!="textarea"){var b=a.children.length,c=a.children[b-1],d;if(c&&c.type==CKEDITOR.NODE_TEXT)(d=CKEDITOR.tools.rtrim(c.value))?c.value=d:a.children.length=b-1}}function n(a,c,d){var c=c||k||g,e=k;if(a.previous===void 0){if(q(c,a)){k=c;
    +h.onTagOpen(i,{});a.returnPoint=c=k}m(a);(!b(a)||a.children.length)&&c.add(a);a.name=="pre"&&(B=false);a.name=="textarea"&&(t=false)}if(a.returnPoint){k=a.returnPoint;delete a.returnPoint}else k=d?c:e}function q(a,b){if((a==g||a.name=="body")&&i&&(!a.name||CKEDITOR.dtd[a.name][i])){var c,d;return(c=b.attributes&&(d=b.attributes["data-cke-real-element-type"])?d:b.name)&&c in CKEDITOR.dtd.$inline&&!(c in CKEDITOR.dtd.head)&&!b.isOrphan||b.type==CKEDITOR.NODE_TEXT}}function p(a,b){return a in CKEDITOR.dtd.$listItem||
    +a in CKEDITOR.dtd.$tableContent?a==b||a=="dt"&&b=="dd"||a=="dd"&&b=="dt":false}var h=new CKEDITOR.htmlParser,g=d instanceof CKEDITOR.htmlParser.element?d:typeof d=="string"?new CKEDITOR.htmlParser.element(d):new CKEDITOR.htmlParser.fragment,u=[],w=[],k=g,t=g.name=="textarea",B=g.name=="pre";h.onTagOpen=function(d,g,f,i){g=new CKEDITOR.htmlParser.element(d,g);if(g.isUnknown&&f)g.isEmpty=true;g.isOptionalClose=i;if(b(g))u.push(g);else{if(d=="pre")B=true;else{if(d=="br"&&B){k.add(new CKEDITOR.htmlParser.text("\n"));
    +return}d=="textarea"&&(t=true)}if(d=="br")w.push(g);else{for(;;){i=(f=k.name)?CKEDITOR.dtd[f]||(k._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):e;if(!g.isUnknown&&!k.isUnknown&&!i[d])if(k.isOptionalClose)h.onTagClose(f);else if(d in a&&f in a){f=k.children;(f=f[f.length-1])&&f.name=="li"||n(f=new CKEDITOR.htmlParser.element("li"),k);!g.returnPoint&&(g.returnPoint=k);k=f}else if(d in CKEDITOR.dtd.$listItem&&!p(d,f))h.onTagOpen(d=="li"?"ul":"dl",{},0,1);else if(f in c&&!p(d,f)){!g.returnPoint&&
    +(g.returnPoint=k);k=k.parent}else{f in CKEDITOR.dtd.$inline&&u.unshift(k);if(k.parent)n(k,k.parent,1);else{g.isOrphan=1;break}}else break}l(d);j();g.parent=k;g.isEmpty?n(g):k=g}}};h.onTagClose=function(a){for(var b=u.length-1;b>=0;b--)if(a==u[b].name){u.splice(b,1);return}for(var c=[],d=[],h=k;h!=g&&h.name!=a;){h._.isBlockLike||d.unshift(h);c.push(h);h=h.returnPoint||h.parent}if(h!=g){for(b=0;b<c.length;b++){var e=c[b];n(e,e.parent)}k=h;h._.isBlockLike&&j();n(h,h.parent);if(h==k)k=k.parent;u=u.concat(d)}a==
    +"body"&&(i=false)};h.onText=function(b){if((!k._.hasInlineStarted||w.length)&&!B&&!t){b=CKEDITOR.tools.ltrim(b);if(b.length===0)return}var d=k.name,g=d?CKEDITOR.dtd[d]||(k._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):e;if(!t&&!g["#"]&&d in c){h.onTagOpen(d in a?"li":d=="dl"?"dd":d=="table"?"tr":d=="tr"?"td":"");h.onText(b)}else{j();l();!B&&!t&&(b=b.replace(/[\t\r\n ]{2,}|[\t\r\n]/g," "));b=new CKEDITOR.htmlParser.text(b);if(q(k,b))this.onTagOpen(i,{},0,1);k.add(b)}};h.onCDATA=function(a){k.add(new CKEDITOR.htmlParser.cdata(a))};
    +h.onComment=function(a){j();l();k.add(new CKEDITOR.htmlParser.comment(a))};h.parse(f);for(j(!CKEDITOR.env.ie&&1);k!=g;)n(k,k.parent,1);m(g);return g};CKEDITOR.htmlParser.fragment.prototype={type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,add:function(a,b){isNaN(b)&&(b=this.children.length);var c=b>0?this.children[b-1]:null;if(c){if(a._.isBlockLike&&c.type==CKEDITOR.NODE_TEXT){c.value=CKEDITOR.tools.rtrim(c.value);if(c.value.length===0){this.children.pop();this.add(a);return}}c.next=a}a.previous=c;a.parent=this;
    +this.children.splice(b,0,a);if(!this._.hasInlineStarted)this._.hasInlineStarted=a.type==CKEDITOR.NODE_TEXT||a.type==CKEDITOR.NODE_ELEMENT&&!a._.isBlockLike},filter:function(a){a.onRoot(this);this.filterChildren(a)},filterChildren:function(a,b){if(this.childrenFilteredBy!=a.id){if(b&&!this.parent)a.onRoot(this);this.childrenFilteredBy=a.id;for(var c=0;c<this.children.length;c++)this.children[c].filter(a)===false&&c--}},writeHtml:function(a,b){b&&this.filter(b);this.writeChildrenHtml(a)},writeChildrenHtml:function(a,
    +b,c){if(c&&!this.parent&&b)b.onRoot(this);b&&this.filterChildren(b);for(var b=0,c=this.children,e=c.length;b<e;b++)c[b].writeHtml(a)},forEach:function(a,b,c){!c&&(!b||this.type==b)&&a(this);for(var c=this.children,e,j=0,m=c.length;j<m;j++){e=c[j];e.type==CKEDITOR.NODE_ELEMENT?e.forEach(a,b):(!b||e.type==b)&&a(e)}}}})();
    +(function(){function b(a,b){for(var c=0;a&&c<b.length;c++)var e=b[c],a=a.replace(e[0],e[1]);return a}function c(a,b,c){typeof b=="function"&&(b=[b]);var e,f;f=a.length;var n=b&&b.length;if(n){for(e=0;e<f&&a[e].pri<=c;e++);for(f=n-1;f>=0;f--)if(n=b[f]){n.pri=c;a.splice(e,0,n)}}}function a(a,b,c){if(b)for(var f in b){var m=a[f];a[f]=e(m,b[f],c);m||a.$length++}}function e(a,b,e){if(b){b.pri=e;if(a){if(a.splice)c(a,b,e);else{a=a.pri>e?[b,a]:[a,b];a.filter=f}return a}return b.filter=b}}function f(a){for(var b=
    +a.type||a instanceof CKEDITOR.htmlParser.fragment,c=0;c<this.length;c++){if(b)var e=a.type,f=a.name;var n=this[c].apply(window,arguments);if(n===false)return n;if(b){if(n&&(n.name!=f||n.type!=e))return n}else if(typeof n!="string")return n;n!=void 0&&(a=n)}return a}CKEDITOR.htmlParser.filter=CKEDITOR.tools.createClass({$:function(a){this.id=CKEDITOR.tools.getNextNumber();this._={elementNames:[],attributeNames:[],elements:{$length:0},attributes:{$length:0}};a&&this.addRules(a,10)},proto:{addRules:function(b,
    +f){typeof f!="number"&&(f=10);c(this._.elementNames,b.elementNames,f);c(this._.attributeNames,b.attributeNames,f);a(this._.elements,b.elements,f);a(this._.attributes,b.attributes,f);this._.text=e(this._.text,b.text,f)||this._.text;this._.comment=e(this._.comment,b.comment,f)||this._.comment;this._.root=e(this._.root,b.root,f)||this._.root},applyTo:function(a){a.filter(this)},onElementName:function(a){return b(a,this._.elementNames)},onAttributeName:function(a){return b(a,this._.attributeNames)},onText:function(a){var b=
    +this._.text;return b?b.filter(a):a},onComment:function(a,b){var c=this._.comment;return c?c.filter(a,b):a},onRoot:function(a){var b=this._.root;return b?b.filter(a):a},onElement:function(a){for(var b=[this._.elements["^"],this._.elements[a.name],this._.elements.$],c,e=0;e<3;e++)if(c=b[e]){c=c.filter(a,this);if(c===false)return null;if(c&&c!=a)return this.onNode(c);if(a.parent&&!a.name)break}return a},onNode:function(a){var b=a.type;return b==CKEDITOR.NODE_ELEMENT?this.onElement(a):b==CKEDITOR.NODE_TEXT?
    +new CKEDITOR.htmlParser.text(this.onText(a.value)):b==CKEDITOR.NODE_COMMENT?new CKEDITOR.htmlParser.comment(this.onComment(a.value)):null},onAttribute:function(a,b,c){if(b=this._.attributes[b]){a=b.filter(c,a,this);if(a===false)return false;if(typeof a!="undefined")return a}return c}}})})();
    +(function(){function b(b,c){function h(a){return a||CKEDITOR.env.ie?new CKEDITOR.htmlParser.text("聽"):new CKEDITOR.htmlParser.element("br",{"data-cke-bogus":1})}function g(b,c){return function(g){if(g.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT){var f=[],o=a(g),i,q;if(o)for(k(o,1)&&f.push(o);o;){if(d(o)&&(i=e(o))&&k(i))if((q=e(i))&&!d(q))f.push(i);else{var u=i,l=h(p),y=u.parent.children,m=CKEDITOR.tools.indexOf(y,u);y.splice(m+1,0,l);y=u.next;u.next=l;l.previous=u;l.parent=u.parent;l.next=y;j(i)}o=o.previous}for(o=
    +0;o<f.length;o++)j(f[o]);if(f=CKEDITOR.env.opera&&!b||(typeof c=="function"?c(g)!==false:c))if(!p&&CKEDITOR.env.ie&&g.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)f=false;else if(!p&&CKEDITOR.env.ie&&(document.documentMode>7||g.name in CKEDITOR.dtd.tr||g.name in CKEDITOR.dtd.$listItem))f=false;else{f=a(g);f=!f||g.name=="form"&&f.name=="input"}f&&g.add(h(b))}}}function k(a,b){if((!p||!CKEDITOR.env.ie)&&a.type==CKEDITOR.NODE_ELEMENT&&a.name=="br"&&!a.attributes["data-cke-eol"])return true;var c;if(a.type==
    +CKEDITOR.NODE_TEXT&&(c=a.value.match(B))){if(c.index){i(a,new CKEDITOR.htmlParser.text(a.value.substring(0,c.index)));a.value=c[0]}if(CKEDITOR.env.ie&&p&&(!b||a.parent.name in q))return true;if(!p)if((c=a.previous)&&c.name=="br"||!c||d(c))return true}return false}var o={elements:{}},p=c=="html",q=CKEDITOR.tools.extend({},C),u;for(u in q)"#"in F[u]||delete q[u];for(u in q)o.elements[u]=g(p,b.config.fillEmptyBlocks!==false);o.root=g(p);o.elements.br=function(a){return function(b){if(b.parent.type!=
    +CKEDITOR.NODE_DOCUMENT_FRAGMENT){var c=b.attributes;if("data-cke-bogus"in c||"data-cke-eol"in c)delete c["data-cke-bogus"];else{for(c=b.next;c&&f(c);)c=c.next;var g=e(b);!c&&d(b.parent)?l(b.parent,h(a)):d(c)&&(g&&!d(g))&&i(c,h(a))}}}}(p);return o}function c(a){return a.enterMode!=CKEDITOR.ENTER_BR&&a.autoParagraph!==false?a.enterMode==CKEDITOR.ENTER_DIV?"div":"p":false}function a(a){for(a=a.children[a.children.length-1];a&&f(a);)a=a.previous;return a}function e(a){for(a=a.previous;a&&f(a);)a=a.previous;
    +return a}function f(a){return a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(a.value)||a.type==CKEDITOR.NODE_ELEMENT&&a.attributes["data-cke-bookmark"]}function d(a){return a&&(a.type==CKEDITOR.NODE_ELEMENT&&a.name in C||a.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)}function i(a,b){var c=a.parent.children,d=CKEDITOR.tools.indexOf(c,a);c.splice(d,0,b);c=a.previous;a.previous=b;b.next=a;b.parent=a.parent;if(c){b.previous=c;c.next=b}}function l(a,b){var c=a.children[a.children.length-1];a.children.push(b);
    +b.parent=a;if(c){c.next=b;b.previous=c}}function j(a){var b=a.parent.children,c=CKEDITOR.tools.indexOf(b,a),d=a.previous,a=a.next;d&&(d.next=a);a&&(a.previous=d);b.splice(c,1)}function m(a){var b=a.parent;return b?CKEDITOR.tools.indexOf(b.children,a):-1}function n(a){a=a.attributes;a.contenteditable!="false"&&(a["data-cke-editable"]=a.contenteditable?"true":1);a.contenteditable="false"}function q(a){a=a.attributes;switch(a["data-cke-editable"]){case "true":a.contenteditable="true";break;case "1":delete a.contenteditable}}
    +function p(a){return a.replace(o,function(a,b,c){return"<"+b+c.replace(x,function(a,b){if(!/^on/.test(b)&&c.indexOf("data-cke-saved-"+b)==-1){a=a.slice(1);return" data-cke-saved-"+a+" data-cke-"+CKEDITOR.rnd+"-"+a}return a})+">"})}function h(a,b){return a.replace(b,function(a,b,c){a.indexOf("<textarea")===0&&(a=b+w(c).replace(/</g,"&lt;").replace(/>/g,"&gt;")+"</textarea>");return"<cke:encoded>"+encodeURIComponent(a)+"</cke:encoded>"})}function g(a){return a.replace(D,function(a,b){return decodeURIComponent(b)})}
    +function u(a){return a.replace(/<\!--(?!{cke_protected})[\s\S]+?--\>/g,function(a){return"<\!--"+z+"{C}"+encodeURIComponent(a).replace(/--/g,"%2D%2D")+"--\>"})}function w(a){return a.replace(/<\!--\{cke_protected\}\{C\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)})}function k(a,b){var c=b._.dataStore;return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)}).replace(/\{cke_protected_(\d+)\}/g,function(a,b){return c&&c[b]||""})}function t(a,
    +b){for(var c=[],d=b.config.protectedSource,h=b._.dataStore||(b._.dataStore={id:1}),g=/<\!--\{cke_temp(comment)?\}(\d*?)--\>/g,d=[/<script[\s\S]*?<\/script>/gi,/<noscript[\s\S]*?<\/noscript>/gi].concat(d),a=a.replace(/<\!--[\s\S]*?--\>/g,function(a){return"<\!--{cke_tempcomment}"+(c.push(a)-1)+"--\>"}),e=0;e<d.length;e++)a=a.replace(d[e],function(a){a=a.replace(g,function(a,b,d){return c[d]});return/cke_temp(comment)?/.test(a)?a:"<\!--{cke_temp}"+(c.push(a)-1)+"--\>"});a=a.replace(g,function(a,b,d){return"<\!--"+
    +z+(b?"{C}":"")+encodeURIComponent(c[d]).replace(/--/g,"%2D%2D")+"--\>"});return a.replace(/(['"]).*?\1/g,function(a){return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g,function(a,b){h[h.id]=decodeURIComponent(b);return"{cke_protected_"+h.id++ +"}"})})}CKEDITOR.htmlDataProcessor=function(a){var d,e,f=this;this.editor=a;this.dataFilter=d=new CKEDITOR.htmlParser.filter;this.htmlFilter=e=new CKEDITOR.htmlParser.filter;this.writer=new CKEDITOR.htmlParser.basicWriter;d.addRules(r);d.addRules(b(a,
    +"data"));e.addRules(A);e.addRules(b(a,"html"));a.on("toHtml",function(b){var b=b.data,d=b.dataValue,d=t(d,a),d=h(d,G),d=p(d),d=h(d,I),d=d.replace(Q,"$1cke:$2"),d=d.replace(E,"<cke:$1$2></cke:$1>"),d=CKEDITOR.env.opera?d:d.replace(/(<pre\b[^>]*>)(\r\n|\n)/g,"$1$2$2"),e=b.context||a.editable().getName(),f;if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&e=="pre"){e="div";d="<pre>"+d+"</pre>";f=1}e=a.document.createElement(e);e.setHtml("a"+d);d=e.getHtml().substr(1);d=d.replace(RegExp(" data-cke-"+CKEDITOR.rnd+
    +"-","ig")," ");f&&(d=d.replace(/^<pre>|<\/pre>$/gi,""));d=d.replace(L,"$1$2");d=g(d);d=w(d);b.dataValue=CKEDITOR.htmlParser.fragment.fromHtml(d,b.context,b.fixForBody===false?false:c(a.config))},null,null,5);a.on("toHtml",function(a){a.data.dataValue.filterChildren(f.dataFilter,true)},null,null,10);a.on("toHtml",function(a){var a=a.data,b=a.dataValue,c=new CKEDITOR.htmlParser.basicWriter;b.writeChildrenHtml(c);b=c.getHtml(true);a.dataValue=u(b)},null,null,15);a.on("toDataFormat",function(b){b.data.dataValue=
    +CKEDITOR.htmlParser.fragment.fromHtml(b.data.dataValue,a.editable().getName(),c(a.config))},null,null,5);a.on("toDataFormat",function(a){a.data.dataValue.filterChildren(f.htmlFilter,true)},null,null,10);a.on("toDataFormat",function(b){var c=b.data.dataValue,d=f.writer;d.reset();c.writeChildrenHtml(d);c=d.getHtml(true);c=w(c);c=k(c,a);b.data.dataValue=c},null,null,15)};CKEDITOR.htmlDataProcessor.prototype={toHtml:function(a,b,c,d){var h=this.editor;!b&&b!==null&&(b=h.editable().getName());return h.fire("toHtml",
    +{dataValue:a,context:b,fixForBody:c,dontFilter:!!d}).dataValue},toDataFormat:function(a){return this.editor.fire("toDataFormat",{dataValue:a}).dataValue}};var B=/(?:&nbsp;|\xa0)$/,z="{cke_protected}",F=CKEDITOR.dtd,s=["caption","colgroup","col","thead","tfoot","tbody"],C=CKEDITOR.tools.extend({},F.$blockLimit,F.$block),r={elements:{},attributeNames:[[/^on/,"data-cke-pa-on"]]},A={elementNames:[[/^cke:/,""],[/^\?xml:namespace$/,""]],attributeNames:[[/^data-cke-(saved|pa)-/,""],[/^data-cke-.*/,""],["hidefocus",
    +""]],elements:{$:function(a){var b=a.attributes;if(b){if(b["data-cke-temp"])return false;for(var c=["name","href","src"],d,h=0;h<c.length;h++){d="data-cke-saved-"+c[h];d in b&&delete b[c[h]]}}return a},table:function(a){a.children.slice(0).sort(function(a,b){var c,d;if(a.type==CKEDITOR.NODE_ELEMENT&&b.type==a.type){c=CKEDITOR.tools.indexOf(s,a.name);d=CKEDITOR.tools.indexOf(s,b.name)}if(!(c>-1&&d>-1&&c!=d)){c=m(a);d=m(b)}return c>d?1:-1})},embed:function(a){var b=a.parent;if(b&&b.name=="object"){var c=
    +b.attributes.width,b=b.attributes.height;c&&(a.attributes.width=c);b&&(a.attributes.height=b)}},param:function(a){a.children=[];a.isEmpty=true;return a},a:function(a){if(!a.children.length&&!a.attributes.name&&!a.attributes["data-cke-saved-name"])return false},span:function(a){a.attributes["class"]=="Apple-style-span"&&delete a.name},html:function(a){delete a.attributes.contenteditable;delete a.attributes["class"]},body:function(a){delete a.attributes.spellcheck;delete a.attributes.contenteditable},
    +style:function(a){var b=a.children[0];b&&b.value&&(b.value=CKEDITOR.tools.trim(b.value));if(!a.attributes.type)a.attributes.type="text/css"},title:function(a){var b=a.children[0];!b&&l(a,b=new CKEDITOR.htmlParser.text);b.value=a.attributes["data-cke-title"]||""}},attributes:{"class":function(a){return CKEDITOR.tools.ltrim(a.replace(/(?:^|\s+)cke_[^\s]*/g,""))||false}}};if(CKEDITOR.env.ie)A.attributes.style=function(a){return a.replace(/(^|;)([^\:]+)/g,function(a){return a.toLowerCase()})};for(var v in{input:1,
    +textarea:1}){r.elements[v]=n;A.elements[v]=q}var o=/<(a|area|img|input|source)\b([^>]*)>/gi,x=/\s(on\w+|href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,I=/(?:<style(?=[ >])[^>]*>[\s\S]*?<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,G=/(<textarea(?=[ >])[^>]*>)([\s\S]*?)(?:<\/textarea>)/gi,D=/<cke:encoded>([^<]*)<\/cke:encoded>/gi,Q=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,L=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,E=/<cke:(param|embed)([^>]*?)\/?>(?!\s*<\/cke:\1)/gi})();
    +"use strict";CKEDITOR.htmlParser.element=function(b,c){this.name=b;this.attributes=c||{};this.children=[];var a=b||"",e=a.match(/^cke:(.*)/);e&&(a=e[1]);a=!(!CKEDITOR.dtd.$nonBodyContent[a]&&!CKEDITOR.dtd.$block[a]&&!CKEDITOR.dtd.$listItem[a]&&!CKEDITOR.dtd.$tableContent[a]&&!(CKEDITOR.dtd.$nonEditable[a]||a=="br"));this.isEmpty=!!CKEDITOR.dtd.$empty[b];this.isUnknown=!CKEDITOR.dtd[b];this._={isBlockLike:a,hasInlineStarted:this.isEmpty||!a}};
    +CKEDITOR.htmlParser.cssStyle=function(b){var c={};((b instanceof CKEDITOR.htmlParser.element?b.attributes.style:b)||"").replace(/&quot;/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,b,f){b=="font-family"&&(f=f.replace(/["']/g,""));c[b.toLowerCase()]=f});return{rules:c,populate:function(a){var b=this.toString();if(b)a instanceof CKEDITOR.dom.element?a.setAttribute("style",b):a instanceof CKEDITOR.htmlParser.element?a.attributes.style=b:a.style=b},toString:function(){var a=[],b;
    +for(b in c)c[b]&&a.push(b,":",c[b],";");return a.join("")}}};
    +(function(){var b=function(a,b){a=a[0];b=b[0];return a<b?-1:a>b?1:0},c=CKEDITOR.htmlParser.fragment.prototype;CKEDITOR.htmlParser.element.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_ELEMENT,add:c.add,clone:function(){return new CKEDITOR.htmlParser.element(this.name,this.attributes)},filter:function(a){var b=this,c,d;if(!b.parent)a.onRoot(b);for(;;){c=b.name;if(!(d=a.onElementName(c))){this.remove();return false}b.name=d;if(!(b=a.onElement(b))){this.remove();return false}if(b!==
    +this){this.replaceWith(b);return false}if(b.name==c)break;if(b.type!=CKEDITOR.NODE_ELEMENT){this.replaceWith(b);return false}if(!b.name){this.replaceWithChildren();return false}}c=b.attributes;var i,l;for(i in c){l=i;for(d=c[i];;)if(l=a.onAttributeName(i))if(l!=i){delete c[i];i=l}else break;else{delete c[i];break}l&&((d=a.onAttribute(b,l,d))===false?delete c[l]:c[l]=d)}b.isEmpty||this.filterChildren(a);return true},filterChildren:c.filterChildren,writeHtml:function(a,c){c&&this.filter(c);var f=this.name,
    +d=[],i=this.attributes,l,j;a.openTag(f,i);for(l in i)d.push([l,i[l]]);a.sortAttributes&&d.sort(b);l=0;for(j=d.length;l<j;l++){i=d[l];a.attribute(i[0],i[1])}a.openTagClose(f,this.isEmpty);this.writeChildrenHtml(a);this.isEmpty||a.closeTag(f)},writeChildrenHtml:c.writeChildrenHtml,replaceWithChildren:function(){for(var a=this.children,b=a.length;b;)a[--b].insertAfter(this);this.remove()},forEach:c.forEach})})();
    +(function(){var b={};CKEDITOR.template=function(c){if(b[c])this.output=b[c];else{var a=c.replace(/'/g,"\\'").replace(/{([^}]+)}/g,function(a,b){return"',data['"+b+"']==undefined?'{"+b+"}':data['"+b+"'],'"});this.output=b[c]=Function("data","buffer","return buffer?buffer.push('"+a+"'):['"+a+"'].join('');")}}})();delete CKEDITOR.loadFullCore;CKEDITOR.instances={};CKEDITOR.document=new CKEDITOR.dom.document(document);
    +CKEDITOR.add=function(b){CKEDITOR.instances[b.name]=b;b.on("focus",function(){if(CKEDITOR.currentInstance!=b){CKEDITOR.currentInstance=b;CKEDITOR.fire("currentInstance")}});b.on("blur",function(){if(CKEDITOR.currentInstance==b){CKEDITOR.currentInstance=null;CKEDITOR.fire("currentInstance")}});CKEDITOR.fire("instance",null,b)};CKEDITOR.remove=function(b){delete CKEDITOR.instances[b.name]};
    +(function(){var b={};CKEDITOR.addTemplate=function(c,a){var e=b[c];if(e)return e;e={name:c,source:a};CKEDITOR.fire("template",e);return b[c]=new CKEDITOR.template(e.source)};CKEDITOR.getTemplate=function(c){return b[c]}})();(function(){var b=[];CKEDITOR.addCss=function(c){b.push(c)};CKEDITOR.getCss=function(){return b.join("\n")}})();CKEDITOR.on("instanceDestroyed",function(){CKEDITOR.tools.isEmpty(this.instances)&&CKEDITOR.fire("reset")});CKEDITOR.TRISTATE_ON=1;CKEDITOR.TRISTATE_OFF=2;
    +CKEDITOR.TRISTATE_DISABLED=0;
    +(function(){CKEDITOR.inline=function(b,c){if(!CKEDITOR.env.isCompatible)return null;b=CKEDITOR.dom.element.get(b);if(b.getEditor())throw'The editor instance "'+b.getEditor().name+'" is already attached to the provided element.';var a=new CKEDITOR.editor(c,b,CKEDITOR.ELEMENT_MODE_INLINE);a.setData(b.getHtml(),null,true);a.on("loaded",function(){a.fire("uiReady");a.editable(b);a.container=b;a.setData(a.getData(1));a.resetDirty();a.fire("contentDom");a.mode="wysiwyg";a.fire("mode");a.status="ready";
    +a.fireOnce("instanceReady");CKEDITOR.fire("instanceReady",null,a)},null,null,1E4);a.on("destroy",function(){a.element.clearCustomData();delete a.element});return a};CKEDITOR.inlineAll=function(){var b,c,a;for(a in CKEDITOR.dtd.$editable)for(var e=CKEDITOR.document.getElementsByTag(a),f=0,d=e.count();f<d;f++){b=e.getItem(f);if(b.getAttribute("contenteditable")=="true"){c={element:b,config:{}};CKEDITOR.fire("inline",c)!==false&&CKEDITOR.inline(b,c.config)}}};CKEDITOR.domReady(function(){!CKEDITOR.disableAutoInline&&
    +CKEDITOR.inlineAll()})})();CKEDITOR.replaceClass="ckeditor";
    +(function(){function b(b,f,l,j){if(!CKEDITOR.env.isCompatible)return null;b=CKEDITOR.dom.element.get(b);if(b.getEditor())throw'The editor instance "'+b.getEditor().name+'" is already attached to the provided element.';var m=new CKEDITOR.editor(f,b,j);j==CKEDITOR.ELEMENT_MODE_REPLACE&&b.setStyle("visibility","hidden");l&&m.setData(l,null,true);m.on("loaded",function(){a(m);j==CKEDITOR.ELEMENT_MODE_REPLACE&&m.config.autoUpdateElement&&e(m);m.setMode(m.config.startupMode,function(){m.resetDirty();m.status=
    +"ready";m.fireOnce("instanceReady");CKEDITOR.fire("instanceReady",null,m)})});m.on("destroy",c);return m}function c(){var a=this.container,b=this.element;if(a){a.clearCustomData();a.remove()}if(b){b.clearCustomData();this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&b.show();delete this.element}}function a(a){var b=a.name,c=a.element,e=a.elementMode,m=a.fire("uiSpace",{space:"top",html:""}).html,n=a.fire("uiSpace",{space:"bottom",html:""}).html;f||(f=CKEDITOR.addTemplate("maincontainer",'<{outerEl} id="cke_{name}" class="{id} cke cke_reset cke_chrome cke_editor_{name} cke_{langDir} '+
    +CKEDITOR.env.cssClass+'"  dir="{langDir}" lang="{langCode}" role="application" aria-labelledby="cke_{name}_arialbl"><span id="cke_{name}_arialbl" class="cke_voice_label">{voiceLabel}</span><{outerEl} class="cke_inner cke_reset" role="presentation">{topHtml}<{outerEl} id="{contentId}" class="cke_contents cke_reset" role="presentation"></{outerEl}>{bottomHtml}</{outerEl}></{outerEl}>'));b=CKEDITOR.dom.element.createFromHtml(f.output({id:a.id,name:b,langDir:a.lang.dir,langCode:a.langCode,voiceLabel:[a.lang.editor,
    +a.name].join(", "),topHtml:m?'<span id="'+a.ui.spaceId("top")+'" class="cke_top cke_reset_all" role="presentation" style="height:auto">'+m+"</span>":"",contentId:a.ui.spaceId("contents"),bottomHtml:n?'<span id="'+a.ui.spaceId("bottom")+'" class="cke_bottom cke_reset_all" role="presentation">'+n+"</span>":"",outerEl:CKEDITOR.env.ie?"span":"div"}));if(e==CKEDITOR.ELEMENT_MODE_REPLACE){c.hide();b.insertAfter(c)}else c.append(b);a.container=b;m&&a.ui.space("top").unselectable();n&&a.ui.space("bottom").unselectable();
    +c=a.config.width;e=a.config.height;c&&b.setStyle("width",CKEDITOR.tools.cssLength(c));e&&a.ui.space("contents").setStyle("height",CKEDITOR.tools.cssLength(e));b.disableContextMenu();CKEDITOR.env.webkit&&b.on("focus",function(){a.focus()});a.fireOnce("uiReady")}function e(a){var b=a.element;if(a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&b.is("textarea")){var c=b.$.form&&new CKEDITOR.dom.element(b.$.form);if(c){var e=function(){a.updateElement()};c.on("submit",e);if(!c.$.submit.nodeName&&!c.$.submit.length)c.$.submit=
    +CKEDITOR.tools.override(c.$.submit,function(b){return function(){a.updateElement();b.apply?b.apply(this,arguments):b()}});a.on("destroy",function(){c.removeListener("submit",e)})}}}CKEDITOR.replace=function(a,c){return b(a,c,null,CKEDITOR.ELEMENT_MODE_REPLACE)};CKEDITOR.appendTo=function(a,c,e){return b(a,c,e,CKEDITOR.ELEMENT_MODE_APPENDTO)};CKEDITOR.replaceAll=function(){for(var a=document.getElementsByTagName("textarea"),b=0;b<a.length;b++){var c=null,e=a[b];if(e.name||e.id){if(typeof arguments[0]==
    +"string"){if(!RegExp("(?:^|\\s)"+arguments[0]+"(?:$|\\s)").test(e.className))continue}else if(typeof arguments[0]=="function"){c={};if(arguments[0](e,c)===false)continue}this.replace(e,c)}}};CKEDITOR.editor.prototype.addMode=function(a,b){(this._.modes||(this._.modes={}))[a]=b};CKEDITOR.editor.prototype.setMode=function(a,b){var c=this,e=this._.modes;if(!(a==c.mode||!e||!e[a])){c.fire("beforeSetMode",a);if(c.mode){var f=c.checkDirty();c._.previousMode=c.mode;c.fire("beforeModeUnload");c.editable(0);
    +c.ui.space("contents").setHtml("");c.mode=""}this._.modes[a](function(){c.mode=a;f!==void 0&&!f&&c.resetDirty();setTimeout(function(){c.fire("mode");b&&b.call(c)},0)})}};CKEDITOR.editor.prototype.resize=function(a,b,c,e){var f=this.container,n=this.ui.space("contents"),q=CKEDITOR.env.webkit&&this.document&&this.document.getWindow().$.frameElement,e=e?f.getChild(1):f;e.setSize("width",a,true);q&&(q.style.width="1%");n.setStyle("height",Math.max(b-(c?0:(e.$.offsetHeight||0)-(n.$.clientHeight||0)),0)+
    +"px");q&&(q.style.width="100%");this.fire("resize")};CKEDITOR.editor.prototype.getResizable=function(a){return a?this.ui.space("contents"):this.container};var f;CKEDITOR.domReady(function(){CKEDITOR.replaceClass&&CKEDITOR.replaceAll(CKEDITOR.replaceClass)})})();CKEDITOR.config.startupMode="wysiwyg";
    +(function(){function b(b){var c=b.editor,d=c.editable(),g=b.data.path,e=g.blockLimit,f=b.data.selection.getRanges()[0],k=c.config.enterMode;if(CKEDITOR.env.gecko){var i=g.block||g.blockLimit||g.root,j=i&&i.getLast(a);i&&(i.isBlockBoundary()&&(!j||!(j.type==CKEDITOR.NODE_ELEMENT&&j.isBlockBoundary()))&&!i.is("pre")&&!i.getBogus())&&i.appendBogus()}if(c.config.autoParagraph!==false&&k!=CKEDITOR.ENTER_BR&&f.collapsed&&d.equals(e)&&!g.block){d=f.clone();d.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);g=new CKEDITOR.dom.walker(d);
    +g.guard=function(b){return!a(b)||b.type==CKEDITOR.NODE_COMMENT||b.isReadOnly()};if(!g.checkForward()||d.checkStartOfBlock()&&d.checkEndOfBlock()){c=f.fixBlock(true,c.config.enterMode==CKEDITOR.ENTER_DIV?"div":"p");if(CKEDITOR.env.ie)(c=c.getFirst(a))&&(c.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(c.getText()).match(/^(?:&nbsp;|\xa0)$/))&&c.remove();f.select();b.cancel()}}}function c(a){var b=a.data.getTarget();if(b.is("input")){b=b.getAttribute("type");(b=="submit"||b=="reset")&&a.data.preventDefault()}}
    +function a(a){return j(a)&&m(a)}function e(a,b){return function(c){var d=CKEDITOR.dom.element.get(c.data.$.toElement||c.data.$.fromElement||c.data.$.relatedTarget);(!d||!b.equals(d)&&!b.contains(d))&&a.call(this,c)}}function f(b){var c,d=b.getRanges()[0],b=b.root,g=d.startPath(),e={table:1,ul:1,ol:1,dl:1},f=CKEDITOR.dom.walker.bogus();if(g.contains(e)){var k=d.clone();k.collapse(1);k.setStartAt(b,CKEDITOR.POSITION_AFTER_START);k=new CKEDITOR.dom.walker(k);g=function(b,d){return function(b,h){h&&(b.type==
    +CKEDITOR.NODE_ELEMENT&&b.is(e))&&(c=b);if(a(b)&&!h&&(!d||!f(b)))return false}};k.guard=g(k);k.checkBackward();if(c){k=d.clone();k.collapse();k.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);k=new CKEDITOR.dom.walker(k);k.guard=g(k,1);c=0;k.checkForward();return c}}return null}function d(a){a.editor.focus();a.editor.fire("saveSnapshot")}function i(a,b){var c=a.editor;!b&&c.getSelection().scrollIntoView();setTimeout(function(){c.fire("saveSnapshot")},0)}CKEDITOR.editable=CKEDITOR.tools.createClass({base:CKEDITOR.dom.element,
    +$:function(a,b){this.base(b.$||b);this.editor=a;this.hasFocus=false;this.setup()},proto:{focus:function(){this.$[CKEDITOR.env.ie&&this.getDocument().equals(CKEDITOR.document)?"setActive":"focus"]();CKEDITOR.env.safari&&!this.isInline()&&(CKEDITOR.document.getActive().equals(this.getWindow().getFrame())||this.getWindow().focus())},on:function(a,b){var c=Array.prototype.slice.call(arguments,0);if(CKEDITOR.env.ie&&/^focus|blur$/.exec(a)){a=a=="focus"?"focusin":"focusout";b=e(b,this);c[0]=a;c[1]=b}return CKEDITOR.dom.element.prototype.on.apply(this,
    +c)},attachListener:function(a,b,c,d,e,f){!this._.listeners&&(this._.listeners=[]);var k=Array.prototype.slice.call(arguments,1);this._.listeners.push(a.on.apply(a,k))},clearListeners:function(){var a=this._.listeners;try{for(;a.length;)a.pop().removeListener()}catch(b){}},restoreAttrs:function(){var a=this._.attrChanges,b,c;for(c in a)if(a.hasOwnProperty(c)){b=a[c];b!==null?this.setAttribute(c,b):this.removeAttribute(c)}},attachClass:function(a){var b=this.getCustomData("classes");if(!this.hasClass(a)){!b&&
    +(b=[]);b.push(a);this.setCustomData("classes",b);this.addClass(a)}},changeAttr:function(a,b){var c=this.getAttribute(a);if(b!==c){!this._.attrChanges&&(this._.attrChanges={});a in this._.attrChanges||(this._.attrChanges[a]=c);this.setAttribute(a,b)}},insertHtml:function(a,b){d(this);n(this,b||"html",a)},insertText:function(a){d(this);var b=this.editor,c=b.getSelection().getStartElement().hasAscendant("pre",true)?CKEDITOR.ENTER_BR:b.config.enterMode,b=c==CKEDITOR.ENTER_BR,g=CKEDITOR.tools,a=g.htmlEncode(a.replace(/\r\n/g,
    +"\n")),a=a.replace(/\t/g,"&nbsp;&nbsp; &nbsp;"),c=c==CKEDITOR.ENTER_P?"p":"div";if(!b){var e=/\n{2}/g;if(e.test(a))var f="<"+c+">",k="</"+c+">",a=f+a.replace(e,function(){return k+f})+k}a=a.replace(/\n/g,"<br>");b||(a=a.replace(RegExp("<br>(?=</"+c+">)"),function(a){return g.repeat(a,2)}));a=a.replace(/^ | $/g,"&nbsp;");a=a.replace(/(>|\s) /g,function(a,b){return b+"&nbsp;"}).replace(/ (?=<)/g,"&nbsp;");n(this,"text",a)},insertElement:function(b){d(this);for(var c=this.editor,h=c.config.enterMode,
    +g=c.getSelection(),e=g.getRanges(),f=b.getName(),k=CKEDITOR.dtd.$block[f],j,m,n,l=e.length-1;l>=0;l--){j=e[l];if(!j.checkReadOnly()){j.deleteContents(1);m=!l&&b||b.clone(1);var s,C;if(k)for(;(s=j.getCommonAncestor(0,1))&&(C=CKEDITOR.dtd[s.getName()])&&(!C||!C[f]);)if(s.getName()in CKEDITOR.dtd.span)j.splitElement(s);else if(j.checkStartOfBlock()&&j.checkEndOfBlock()){j.setStartBefore(s);j.collapse(true);s.remove()}else j.splitBlock(h==CKEDITOR.ENTER_DIV?"div":"p",c.editable());j.insertNode(m);n||
    +(n=m)}}if(n){j.moveToPosition(n,CKEDITOR.POSITION_AFTER_END);if(k)if((b=n.getNext(a))&&b.type==CKEDITOR.NODE_ELEMENT&&b.is(CKEDITOR.dtd.$block))b.getDtd()["#"]?j.moveToElementEditStart(b):j.moveToElementEditEnd(n);else if(!b&&h!=CKEDITOR.ENTER_BR){b=j.fixBlock(true,h==CKEDITOR.ENTER_DIV?"div":"p");j.moveToElementEditStart(b)}}g.selectRanges([j]);i(this,CKEDITOR.env.opera)},setData:function(a,b){!b&&this.editor.dataProcessor&&(a=this.editor.dataProcessor.toHtml(a));this.setHtml(a);this.editor.fire("dataReady")},
    +getData:function(a){var b=this.getHtml();!a&&this.editor.dataProcessor&&(b=this.editor.dataProcessor.toDataFormat(b));return b},setReadOnly:function(a){this.setAttribute("contenteditable",!a)},detach:function(){this.removeClass("cke_editable");var a=this.editor;this._.detach();delete a.document;delete a.window},isInline:function(){return this.getDocument().equals(CKEDITOR.document)},setup:function(){var a=this.editor;this.attachListener(a,"beforeGetData",function(){var b=this.getData();this.is("textarea")||
    +a.config.ignoreEmptyParagraph!==false&&(b=b.replace(l,function(a,b){return b}));a.setData(b,null,1)},this);this.attachListener(a,"getSnapshot",function(a){a.data=this.getData(1)},this);this.attachListener(a,"afterSetData",function(){this.setData(a.getData(1))},this);this.attachListener(a,"loadSnapshot",function(a){this.setData(a.data,1)},this);this.attachListener(a,"beforeFocus",function(){var b=a.getSelection();(b=b&&b.getNative())&&b.type=="Control"||this.focus()},this);this.attachListener(a,"insertHtml",
    +function(a){this.insertHtml(a.data.dataValue,a.data.mode)},this);this.attachListener(a,"insertElement",function(a){this.insertElement(a.data)},this);this.attachListener(a,"insertText",function(a){this.insertText(a.data)},this);this.setReadOnly(a.readOnly);this.attachClass("cke_editable");this.attachClass(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"cke_editable_inline":a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE||a.elementMode==CKEDITOR.ELEMENT_MODE_APPENDTO?"cke_editable_themed":"");this.attachClass("cke_contents_"+
    +a.config.contentsLangDirection);a.keystrokeHandler.blockedKeystrokes[8]=+a.readOnly;a.keystrokeHandler.attach(this);this.on("blur",function(a){CKEDITOR.env.opera&&CKEDITOR.document.getActive().equals(this.isInline()?this:this.getWindow().getFrame())?a.cancel():this.hasFocus=false},null,null,-1);this.on("focus",function(){this.hasFocus=true},null,null,-1);a.focusManager.add(this);if(this.equals(CKEDITOR.document.getActive())){this.hasFocus=true;a.once("contentDom",function(){a.focusManager.focus()})}this.isInline()&&
    +this.changeAttr("tabindex",a.tabIndex);if(!this.is("textarea")){a.document=this.getDocument();a.window=this.getWindow();var b=a.document;this.changeAttr("spellcheck",!a.config.disableNativeSpellChecker);var d=a.config.contentsLangDirection;this.getDirection(1)!=d&&this.changeAttr("dir",d);var g=CKEDITOR.getCss();if(g){d=b.getHead();if(!d.getCustomData("stylesheet")){g=b.appendStyleText(g);g=new CKEDITOR.dom.element(g.ownerNode||g.owningElement);d.setCustomData("stylesheet",g);g.data("cke-temp",1)}}d=
    +b.getCustomData("stylesheet_ref")||0;b.setCustomData("stylesheet_ref",d+1);this.setCustomData("cke_includeReadonly",!a.config.disableReadonlyStyling);this.attachListener(this,"click",function(a){var a=a.data,b=a.getTarget();b.is("a")&&(a.$.button!=2&&b.isReadOnly())&&a.preventDefault()});this.attachListener(a,"key",function(b){if(a.readOnly)return true;var c=b.data.keyCode,d;if(c in{8:1,46:1}){var h=a.getSelection(),b=h.getRanges()[0],g=b.startPath(),e,i,p,c=c==8;if(h=f(h)){a.fire("saveSnapshot");
    +b.moveToPosition(h,CKEDITOR.POSITION_BEFORE_START);h.remove();b.select();a.fire("saveSnapshot");d=1}else if(b.collapsed)if((e=g.block)&&b[c?"checkStartOfBlock":"checkEndOfBlock"]()&&(p=e[c?"getPrevious":"getNext"](j))&&p.is("table")){a.fire("saveSnapshot");b[c?"checkEndOfBlock":"checkStartOfBlock"]()&&e.remove();b["moveToElementEdit"+(c?"End":"Start")](p);b.select();a.fire("saveSnapshot");d=1}else if(g.blockLimit&&g.blockLimit.is("td")&&(i=g.blockLimit.getAscendant("table"))&&b.checkBoundaryOfElement(i,
    +c?CKEDITOR.START:CKEDITOR.END)&&(p=i[c?"getPrevious":"getNext"](j))){a.fire("saveSnapshot");b["moveToElementEdit"+(c?"End":"Start")](p);b.checkStartOfBlock()&&b.checkEndOfBlock()?p.remove():b.select();a.fire("saveSnapshot");d=1}else if((i=g.contains(["td","th","caption"]))&&b.checkBoundaryOfElement(i,c?CKEDITOR.START:CKEDITOR.END))d=1}return!d});CKEDITOR.env.ie&&this.attachListener(this,"click",c);!CKEDITOR.env.ie&&!CKEDITOR.env.opera&&this.attachListener(this,"mousedown",function(b){var c=b.data.getTarget();
    +if(c.is("img","hr","input","textarea","select")){a.getSelection().selectElement(c);c.is("input","textarea","select")&&b.data.preventDefault()}});CKEDITOR.env.gecko&&this.attachListener(this,"mouseup",function(b){if(b.data.$.button==2){b=b.data.getTarget();if(!b.getOuterHtml().replace(l,"")){var c=a.createRange();c.moveToElementEditStart(b);c.select(true)}}});if(CKEDITOR.env.webkit){this.attachListener(this,"click",function(a){a.data.getTarget().is("input","select")&&a.data.preventDefault()});this.attachListener(this,
    +"mouseup",function(a){a.data.getTarget().is("input","textarea")&&a.data.preventDefault()})}}}},_:{detach:function(){this.editor.setData(this.editor.getData(),0,1);this.clearListeners();this.restoreAttrs();var a;if(a=this.removeCustomData("classes"))for(;a.length;)this.removeClass(a.pop());a=this.getDocument();var b=a.getHead();if(b.getCustomData("stylesheet")){var c=a.getCustomData("stylesheet_ref");if(--c)a.setCustomData("stylesheet_ref",c);else{a.removeCustomData("stylesheet_ref");b.removeCustomData("stylesheet").remove()}}delete this.editor}}});
    +CKEDITOR.editor.prototype.editable=function(a){var b=this._.editable;if(b&&a)return 0;if(arguments.length)b=this._.editable=a?a instanceof CKEDITOR.editable?a:new CKEDITOR.editable(this,a):(b&&b.detach(),null);return b};var l=/(^|<body\b[^>]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:<br[^>]*>|&nbsp;|\u00A0|&#160;)?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi,j=CKEDITOR.dom.walker.whitespaces(true),m=CKEDITOR.dom.walker.bookmark(false,true);CKEDITOR.on("instanceLoaded",function(a){var c=a.editor;c.on("insertElement",
    +function(a){a=a.data;if(a.type==CKEDITOR.NODE_ELEMENT&&(a.is("input")||a.is("textarea"))){a.getAttribute("contentEditable")!="false"&&a.data("cke-editable",a.hasAttribute("contenteditable")?"true":"1");a.setAttribute("contentEditable",false)}});c.on("selectionChange",function(a){if(!c.readOnly){var d=c.getSelection();if(d&&!d.isLocked){d=c.checkDirty();c.fire("lockSnapshot");b(a);c.fire("unlockSnapshot");!d&&c.resetDirty()}}})});CKEDITOR.on("instanceCreated",function(a){var b=a.editor;b.on("mode",
    +function(){var a=b.editable();if(a&&a.isInline()){var c=this.lang.editor+", "+this.name;a.changeAttr("role","textbox");a.changeAttr("aria-label",c);a.changeAttr("title",c);if(c=this.ui.space(this.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"top":"contents")){var d=CKEDITOR.tools.getNextId(),e=CKEDITOR.dom.element.createFromHtml('<span id="'+d+'" class="cke_voice_label">'+this.lang.common.editorHelp+"</span>");c.append(e);a.changeAttr("aria-describedby",d)}}})});CKEDITOR.addCss(".cke_editable{cursor:text}.cke_editable img,.cke_editable input,.cke_editable textarea{cursor:default}");
    +var n=function(){function b(a){return a.type==CKEDITOR.NODE_ELEMENT}function c(a,d){var h,g,e,f,o=[],i=d.range.startContainer;h=d.range.startPath();for(var i=k[i.getName()],j=0,n=a.getChildren(),m=n.count(),l=-1,u=-1,t=0,w=h.contains(k.$list);j<m;++j){h=n.getItem(j);if(b(h)){e=h.getName();if(w&&e in CKEDITOR.dtd.$list)o=o.concat(c(h,d));else{f=!!i[e];if(e=="br"&&h.data("cke-eol")&&(!j||j==m-1)){t=(g=j?o[j-1].node:n.getItem(j+1))&&(!b(g)||!g.is("br"));g=g&&b(g)&&k.$block[g.getName()]}l==-1&&!f&&(l=
    +j);f||(u=j);o.push({isElement:1,isLineBreak:t,isBlock:h.isBlockBoundary(),hasBlockSibling:g,node:h,name:e,allowed:f});g=t=0}}else o.push({isElement:0,node:h,allowed:1})}if(l>-1)o[l].firstNotAllowed=1;if(u>-1)o[u].lastNotAllowed=1;return o}function d(a,c){var g=[],e=a.getChildren(),f=e.count(),i,o=0,j=k[c],p=!a.is(k.$inline)||a.is("br");for(p&&g.push(" ");o<f;o++){i=e.getItem(o);b(i)&&!i.is(j)?g=g.concat(d(i,c)):g.push(i)}p&&g.push(" ");return g}function g(a){return a&&b(a)&&(a.is(k.$removeEmpty)||
    +a.is("a")&&!a.isBlockBoundary())}function e(a,c,d,h){var g=a.clone(),f,k;g.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);if((f=(new CKEDITOR.dom.walker(g)).next())&&b(f)&&j[f.getName()]&&(k=f.getPrevious())&&b(k)&&!k.getParent().equals(a.startContainer)&&d.contains(k)&&h.contains(f)&&f.isIdentical(k)){f.moveChildren(k);f.remove();e(a,c,d,h)}}function f(a,c){function d(a,c){if(c.isBlock&&c.isElement&&!c.node.is("br")&&b(a)&&a.is("br")){a.remove();return 1}}var h=c.endContainer.getChild(c.endOffset),g=c.endContainer.getChild(c.endOffset-
    +1);h&&d(h,a[a.length-1]);if(g&&d(g,a[0])){c.setEnd(c.endContainer,c.endOffset-1);c.collapse()}}var k=CKEDITOR.dtd,j={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ul:1,ol:1,li:1,pre:1,dl:1,blockquote:1},n={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1},m=CKEDITOR.tools.extend({},k.$inline);delete m.br;return function(j,l,t){var r=j.editor;j.getDocument();var A=r.getSelection().getRanges()[0],v=false;if(l=="unfiltered_html"){l="html";v=true}if(!A.checkReadOnly()){var o=(new CKEDITOR.dom.elementPath(A.startContainer,
    +A.root)).blockLimit||A.root,l={type:l,dontFilter:v,editable:j,editor:r,range:A,blockLimit:o,mergeCandidates:[],zombies:[]},r=l.range,v=l.mergeCandidates,x,I,G,D;if(l.type=="text"&&r.shrink(CKEDITOR.SHRINK_ELEMENT,true,false)){x=CKEDITOR.dom.element.createFromHtml("<span>&nbsp;</span>",r.document);r.insertNode(x);r.setStartAfter(x)}I=new CKEDITOR.dom.elementPath(r.startContainer);l.endPath=G=new CKEDITOR.dom.elementPath(r.endContainer);if(!r.collapsed){var o=G.block||G.blockLimit,Q=r.getCommonAncestor();
    +o&&(!o.equals(Q)&&!o.contains(Q)&&r.checkEndOfBlock())&&l.zombies.push(o);r.deleteContents()}for(;(D=b(r.startContainer)&&r.startContainer.getChild(r.startOffset-1))&&b(D)&&D.isBlockBoundary()&&I.contains(D);)r.moveToPosition(D,CKEDITOR.POSITION_BEFORE_END);e(r,l.blockLimit,I,G);if(x){r.setEndBefore(x);r.collapse();x.remove()}x=r.startPath();if(o=x.contains(g,false,1)){r.splitElement(o);l.inlineStylesRoot=o;l.inlineStylesPeak=x.lastElement}x=r.createBookmark();(o=x.startNode.getPrevious(a))&&b(o)&&
    +g(o)&&v.push(o);(o=x.startNode.getNext(a))&&b(o)&&g(o)&&v.push(o);for(o=x.startNode;(o=o.getParent())&&g(o);)v.push(o);r.moveToBookmark(x);if(x=t){x=l.range;if(l.type=="text"&&l.inlineStylesRoot){D=l.inlineStylesPeak;r=D.getDocument().createText("{cke-peak}");for(v=l.inlineStylesRoot.getParent();!D.equals(v);){r=r.appendTo(D.clone());D=D.getParent()}t=r.getOuterHtml().split("{cke-peak}").join(t)}D=l.blockLimit.getName();if(/^\s+|\s+$/.test(t)&&"span"in CKEDITOR.dtd[D])var L='<span data-cke-marker="1">&nbsp;</span>',
    +t=L+t+L;t=l.editor.dataProcessor.toHtml(t,null,false,l.dontFilter);D=x.document.createElement("body");D.setHtml(t);if(L){D.getFirst().remove();D.getLast().remove()}if((L=x.startPath().block)&&!(L.getChildCount()==1&&L.getBogus()))a:{var E;if(D.getChildCount()==1&&b(E=D.getFirst())&&E.is(n)){L=E.getElementsByTag("*");x=0;for(v=L.count();x<v;x++){r=L.getItem(x);if(!r.is(m))break a}E.moveChildren(E.getParent(1));E.remove()}}l.dataWrapper=D;x=t}if(x){E=l.range;var L=E.document,y,t=l.blockLimit;x=0;var J;
    +D=[];var H,N,v=r=0,K,O;I=E.startContainer;var o=l.endPath.elements[0],P;G=o.getPosition(I);Q=!!o.getCommonAncestor(I)&&G!=CKEDITOR.POSITION_IDENTICAL&&!(G&CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_IS_CONTAINED);I=c(l.dataWrapper,l);for(f(I,E);x<I.length;x++){G=I[x];if(y=G.isLineBreak){y=E;K=t;var M=void 0,R=void 0;if(G.hasBlockSibling)y=1;else{M=y.startContainer.getAscendant(k.$block,1);if(!M||!M.is({div:1,p:1}))y=0;else{R=M.getPosition(K);if(R==CKEDITOR.POSITION_IDENTICAL||R==CKEDITOR.POSITION_CONTAINS)y=
    +0;else{K=y.splitElement(M);y.moveToPosition(K,CKEDITOR.POSITION_AFTER_START);y=1}}}}if(y)v=x>0;else{y=E.startPath();if(!G.isBlock&&(N=l.editor.config.enterMode!=CKEDITOR.ENTER_BR&&l.editor.config.autoParagraph!==false?l.editor.config.enterMode==CKEDITOR.ENTER_DIV?"div":"p":false)&&!y.block&&y.blockLimit&&y.blockLimit.equals(E.root)){N=L.createElement(N);!CKEDITOR.env.ie&&N.appendBogus();E.insertNode(N);!CKEDITOR.env.ie&&(J=N.getBogus())&&J.remove();E.moveToPosition(N,CKEDITOR.POSITION_BEFORE_END)}if((y=
    +E.startPath().block)&&!y.equals(H)){if(J=y.getBogus()){J.remove();D.push(y)}H=y}G.firstNotAllowed&&(r=1);if(r&&G.isElement){y=E.startContainer;for(K=null;y&&!k[y.getName()][G.name];){if(y.equals(t)){y=null;break}K=y;y=y.getParent()}if(y){if(K){O=E.splitElement(K);l.zombies.push(O);l.zombies.push(K)}}else{K=t.getName();P=!x;y=x==I.length-1;K=d(G.node,K);for(var M=[],R=K.length,T=0,U=void 0,V=0,W=-1;T<R;T++){U=K[T];if(U==" "){if(!V&&(!P||T)){M.push(new CKEDITOR.dom.text(" "));W=M.length}V=1}else{M.push(U);
    +V=0}}y&&W==M.length&&M.pop();P=M}}if(P){for(;y=P.pop();)E.insertNode(y);P=0}else E.insertNode(G.node);if(G.lastNotAllowed&&x<I.length-1){(O=Q?o:O)&&E.setEndAt(O,CKEDITOR.POSITION_AFTER_START);r=0}E.collapse()}}l.dontMoveCaret=v;l.bogusNeededBlocks=D}J=l.range;var S;O=l.bogusNeededBlocks;for(P=J.createBookmark();H=l.zombies.pop();)if(H.getParent()){N=J.clone();N.moveToElementEditStart(H);N.removeEmptyBlocksAtEnd()}if(O)for(;H=O.pop();)H.append(CKEDITOR.env.ie?J.document.createText("聽"):J.document.createElement("br"));
    +for(;H=l.mergeCandidates.pop();)H.mergeSiblings();J.moveToBookmark(P);if(!l.dontMoveCaret){for(H=b(J.startContainer)&&J.startContainer.getChild(J.startOffset-1);H&&b(H)&&!H.is(k.$empty);){if(H.isBlockBoundary())J.moveToPosition(H,CKEDITOR.POSITION_BEFORE_END);else{if(g(H)&&H.getHtml().match(/(\s|&nbsp;)$/g)){S=null;break}S=J.clone();S.moveToPosition(H,CKEDITOR.POSITION_BEFORE_END)}H=H.getLast(a)}S&&J.moveToRange(S)}A.select();i(j)}}}()})();
    +(function(){function b(){var a=this.getSelection(1);if(a.getType()!=CKEDITOR.SELECTION_NONE){this.fire("selectionCheck",a);var b=this.elementPath();if(!b.compare(this._.selectionPreviousPath)){this._.selectionPreviousPath=b;this.fire("selectionChange",{selection:a,path:b})}}}function c(){j=true;if(!l){a.call(this);l=CKEDITOR.tools.setTimeout(a,200,this)}}function a(){l=null;if(j){CKEDITOR.tools.setTimeout(b,0,this);j=false}}function e(a){function b(c,d){return!c||c.type==CKEDITOR.NODE_TEXT?false:
    +a.clone()["moveToElementEdit"+(d?"End":"Start")](c)}if(!(a.root instanceof CKEDITOR.editable))return false;var c=a.startContainer,d=a.getPreviousNode(m,null,c),e=a.getNextNode(m,null,c);return b(d)||b(e,1)||!d&&!e&&!(c.type==CKEDITOR.NODE_ELEMENT&&c.isBlockBoundary()&&c.getBogus())?true:false}function f(a){return a.getCustomData("cke-fillingChar")}function d(a,b){var c=a&&a.removeCustomData("cke-fillingChar");if(c){if(b!==false){var d,e=a.getDocument().getSelection().getNative(),f=e&&e.type!="None"&&
    +e.getRangeAt(0);if(c.getLength()>1&&f&&f.intersectsNode(c.$)){d=[e.anchorOffset,e.focusOffset];f=e.focusNode==c.$&&e.focusOffset>0;e.anchorNode==c.$&&e.anchorOffset>0&&d[0]--;f&&d[1]--;var j;f=e;if(!f.isCollapsed){j=f.getRangeAt(0);j.setStart(f.anchorNode,f.anchorOffset);j.setEnd(f.focusNode,f.focusOffset);j=j.collapsed}j&&d.unshift(d.pop())}}c.setText(i(c.getText()));if(d){c=e.getRangeAt(0);c.setStart(c.startContainer,d[0]);c.setEnd(c.startContainer,d[1]);e.removeAllRanges();e.addRange(c)}}}function i(a){return a.replace(/\u200B( )?/g,
    +function(a){return a[1]?"聽":""})}var l,j,m=CKEDITOR.dom.walker.invisible(1);CKEDITOR.on("instanceCreated",function(a){function h(){var a=e.getSelection();a&&a.removeAllRanges()}var e=a.editor;e.define("selectionChange",{errorProof:1});e.on("contentDom",function(){var a=e.document,h=CKEDITOR.document,f=e.editable(),i=a.getBody(),j=a.getDocumentElement(),p=f.isInline(),l;CKEDITOR.env.gecko&&f.attachListener(f,"focus",function(a){a.removeListener();if(l!==0){a=e.getSelection().getNative();if(a.isCollapsed&&
    +a.anchorNode==f.$){a=e.createRange();a.moveToElementEditStart(f);a.select()}}},null,null,-2);f.attachListener(f,"focus",function(){e.unlockSelection(l);l=0},null,null,-1);f.attachListener(f,"mousedown",function(){l=0});if(CKEDITOR.env.ie||CKEDITOR.env.opera||p){var m,q=function(){m=e.getSelection(1);m.lock()};n?f.attachListener(f,"beforedeactivate",q,null,null,-1):f.attachListener(e,"selectionCheck",q,null,null,-1);f.attachListener(f,"blur",function(){e.lockSelection(m);l=1},null,null,-1)}if(CKEDITOR.env.ie&&
    +!p){var r;f.attachListener(f,"mousedown",function(a){a.data.$.button==2&&e.document.$.selection.type=="None"&&(r=e.window.getScrollPosition())});f.attachListener(f,"mouseup",function(a){if(a.data.$.button==2&&r){e.document.$.documentElement.scrollLeft=r.x;e.document.$.documentElement.scrollTop=r.y}r=null});if(a.$.compatMode!="BackCompat"){if(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)j.on("mousedown",function(a){function b(a){a=a.data.$;if(d){var c=i.$.createTextRange();try{c.moveToPoint(a.x,
    +a.y)}catch(e){}d.setEndPoint(f.compareEndPoints("StartToStart",c)<0?"EndToEnd":"StartToStart",c);d.select()}}function c(){j.removeListener("mousemove",b);h.removeListener("mouseup",c);j.removeListener("mouseup",c);d.select()}a=a.data;if(a.getTarget().is("html")&&a.$.y<j.$.clientHeight&&a.$.x<j.$.clientWidth){var d=i.$.createTextRange();try{d.moveToPoint(a.$.x,a.$.y)}catch(e){}var f=d.duplicate();j.on("mousemove",b);h.on("mouseup",c);j.on("mouseup",c)}});if(CKEDITOR.env.version>7){j.on("mousedown",
    +function(a){if(a.data.getTarget().is("html")){h.on("mouseup",A);j.on("mouseup",A)}});var A=function(){h.removeListener("mouseup",A);j.removeListener("mouseup",A);var b=CKEDITOR.document.$.selection,c=b.createRange();b.type!="None"&&c.parentElement().ownerDocument==a.$&&c.select()}}}}f.attachListener(f,"selectionchange",b,e);f.attachListener(f,"keyup",c,e);f.attachListener(f,"focus",function(){e.forceNextSelectionCheck();e.selectionChange(1)});if(p?CKEDITOR.env.webkit||CKEDITOR.env.gecko:CKEDITOR.env.opera){var v;
    +f.attachListener(f,"mousedown",function(){v=1});f.attachListener(a.getDocumentElement(),"mouseup",function(){v&&c.call(e);v=0})}else f.attachListener(CKEDITOR.env.ie?f:a.getDocumentElement(),"mouseup",c,e);CKEDITOR.env.webkit&&f.attachListener(a,"keydown",function(a){switch(a.data.getKey()){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:d(f)}},null,null,-1)});e.on("contentDomUnload",e.forceNextSelectionCheck,e);e.on("dataReady",function(){e.selectionChange(1)});CKEDITOR.env.ie9Compat&&
    +e.on("beforeDestroy",h,null,null,9);CKEDITOR.env.webkit&&e.on("setData",h);e.on("contentDomUnload",function(){e.unlockSelection()})});CKEDITOR.on("instanceReady",function(a){var b=a.editor;if(CKEDITOR.env.webkit){b.on("selectionChange",function(){var a=b.editable(),c=f(a);c&&(c.getCustomData("ready")?d(a):c.setCustomData("ready",1))},null,null,-1);b.on("beforeSetMode",function(){d(b.editable())},null,null,-1);var c,e,a=function(){var a=b.editable();if(a)if(a=f(a)){var d=b.document.$.defaultView.getSelection();
    +d.type=="Caret"&&d.anchorNode==a.$&&(e=1);c=a.getText();a.setText(i(c))}},j=function(){var a=b.editable();if(a)if(a=f(a)){a.setText(c);if(e){b.document.$.defaultView.getSelection().setPosition(a.$,a.getLength());e=0}}};b.on("beforeUndoImage",a);b.on("afterUndoImage",j);b.on("beforeGetData",a,null,null,0);b.on("getData",j)}});CKEDITOR.editor.prototype.selectionChange=function(a){(a?b:c).call(this)};CKEDITOR.editor.prototype.getSelection=function(a){if(this._.savedSelection&&!a)return this._.savedSelection;
    +return(a=this.editable())?new CKEDITOR.dom.selection(a):null};CKEDITOR.editor.prototype.lockSelection=function(a){a=a||this.getSelection(1);if(a.getType()!=CKEDITOR.SELECTION_NONE){!a.isLocked&&a.lock();this._.savedSelection=a;return true}return false};CKEDITOR.editor.prototype.unlockSelection=function(a){var b=this._.savedSelection;if(b){b.unlock(a);delete this._.savedSelection;return true}return false};CKEDITOR.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath};
    +CKEDITOR.dom.document.prototype.getSelection=function(){return new CKEDITOR.dom.selection(this)};CKEDITOR.dom.range.prototype.select=function(){var a=this.root instanceof CKEDITOR.editable?this.root.editor.getSelection():new CKEDITOR.dom.selection(this.root);a.selectRanges([this]);return a};CKEDITOR.SELECTION_NONE=1;CKEDITOR.SELECTION_TEXT=2;CKEDITOR.SELECTION_ELEMENT=3;var n=typeof window.getSelection!="function";CKEDITOR.dom.selection=function(a){var b=a instanceof CKEDITOR.dom.element;this.document=
    +a instanceof CKEDITOR.dom.document?a:a.getDocument();this.root=b?a:this.document.getBody();this.isLocked=0;this._={cache:{}};if(CKEDITOR.env.webkit){a=this.document.getWindow().$.getSelection();if(a.type=="None"&&this.document.getActive().equals(this.root)||a.type=="Caret"&&a.anchorNode.nodeType==CKEDITOR.NODE_DOCUMENT){var c=new CKEDITOR.dom.range(this.root);c.moveToPosition(this.root,CKEDITOR.POSITION_AFTER_START);b=this.document.$.createRange();b.setStart(c.startContainer.$,c.startOffset);b.collapse(1);
    +var d=this.root.on("focus",function(a){a.cancel()},null,null,-100);a.addRange(b);d.removeListener()}}var a=this.getNative(),e;if(a)if(a.getRangeAt)e=(c=a.rangeCount&&a.getRangeAt(0))&&new CKEDITOR.dom.node(c.commonAncestorContainer);else{try{c=a.createRange()}catch(f){}e=c&&CKEDITOR.dom.element.get(c.item&&c.item(0)||c.parentElement())}if(!e||!this.root.equals(e)&&!this.root.contains(e)){this._.cache.type=CKEDITOR.SELECTION_NONE;this._.cache.startElement=null;this._.cache.selectedElement=null;this._.cache.selectedText=
    +"";this._.cache.ranges=new CKEDITOR.dom.rangeList}return this};var q={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};CKEDITOR.dom.selection.prototype={getNative:function(){return this._.cache.nativeSel!==void 0?this._.cache.nativeSel:this._.cache.nativeSel=n?this.document.$.selection:this.document.getWindow().$.getSelection()},getType:n?function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_NONE;
    +try{var c=this.getNative(),d=c.type;if(d=="Text")b=CKEDITOR.SELECTION_TEXT;if(d=="Control")b=CKEDITOR.SELECTION_ELEMENT;if(c.createRange().parentElement())b=CKEDITOR.SELECTION_TEXT}catch(e){}return a.type=b}:function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_TEXT,c=this.getNative();if(!c||!c.rangeCount)b=CKEDITOR.SELECTION_NONE;else if(c.rangeCount==1){var c=c.getRangeAt(0),d=c.startContainer;if(d==c.endContainer&&d.nodeType==1&&c.endOffset-c.startOffset==1&&q[d.childNodes[c.startOffset].nodeName.toLowerCase()])b=
    +CKEDITOR.SELECTION_ELEMENT}return a.type=b},getRanges:function(){var a=n?function(){function a(b){return(new CKEDITOR.dom.node(b)).getIndex()}var b=function(b,c){b=b.duplicate();b.collapse(c);var d=b.parentElement(),e=d.ownerDocument;if(!d.hasChildNodes())return{container:d,offset:0};for(var f=d.children,g,i,j=b.duplicate(),l=0,p=f.length-1,m=-1,n,o;l<=p;){m=Math.floor((l+p)/2);g=f[m];j.moveToElementText(g);n=j.compareEndPoints("StartToStart",b);if(n>0)p=m-1;else if(n<0)l=m+1;else{if(CKEDITOR.env.ie9Compat&&
    +g.tagName=="BR"){f=e.defaultView.getSelection();return{container:f[c?"anchorNode":"focusNode"],offset:f[c?"anchorOffset":"focusOffset"]}}return{container:d,offset:a(g)}}}if(m==-1||m==f.length-1&&n<0){j.moveToElementText(d);j.setEndPoint("StartToStart",b);e=j.text.replace(/(\r\n|\r)/g,"\n").length;f=d.childNodes;if(!e){g=f[f.length-1];return g.nodeType!=CKEDITOR.NODE_TEXT?{container:d,offset:f.length}:{container:g,offset:g.nodeValue.length}}for(d=f.length;e>0&&d>0;){i=f[--d];if(i.nodeType==CKEDITOR.NODE_TEXT){o=
    +i;e=e-i.nodeValue.length}}return{container:o,offset:-e}}j.collapse(n>0?true:false);j.setEndPoint(n>0?"StartToStart":"EndToStart",b);e=j.text.replace(/(\r\n|\r)/g,"\n").length;if(!e)return{container:d,offset:a(g)+(n>0?0:1)};for(;e>0;)try{i=g[n>0?"previousSibling":"nextSibling"];if(i.nodeType==CKEDITOR.NODE_TEXT){e=e-i.nodeValue.length;o=i}g=i}catch(x){return{container:d,offset:a(g)}}return{container:o,offset:n>0?-e:o.nodeValue.length+e}};return function(){var a=this.getNative(),c=a&&a.createRange(),
    +d=this.getType();if(!a)return[];if(d==CKEDITOR.SELECTION_TEXT){a=new CKEDITOR.dom.range(this.root);d=b(c,true);a.setStart(new CKEDITOR.dom.node(d.container),d.offset);d=b(c);a.setEnd(new CKEDITOR.dom.node(d.container),d.offset);a.endContainer.getPosition(a.startContainer)&CKEDITOR.POSITION_PRECEDING&&a.endOffset<=a.startContainer.getIndex()&&a.collapse();return[a]}if(d==CKEDITOR.SELECTION_ELEMENT){for(var d=[],e=0;e<c.length;e++){for(var f=c.item(e),h=f.parentNode,i=0,a=new CKEDITOR.dom.range(this.root);i<
    +h.childNodes.length&&h.childNodes[i]!=f;i++);a.setStart(new CKEDITOR.dom.node(h),i);a.setEnd(new CKEDITOR.dom.node(h),i+1);d.push(a)}return d}return[]}}():function(){var a=[],b,c=this.getNative();if(!c)return a;for(var d=0;d<c.rangeCount;d++){var e=c.getRangeAt(d);b=new CKEDITOR.dom.range(this.root);b.setStart(new CKEDITOR.dom.node(e.startContainer),e.startOffset);b.setEnd(new CKEDITOR.dom.node(e.endContainer),e.endOffset);a.push(b)}return a};return function(b){var c=this._.cache;if(c.ranges&&!b)return c.ranges;
    +if(!c.ranges)c.ranges=new CKEDITOR.dom.rangeList(a.call(this));if(b)for(var d=c.ranges,e=0;e<d.length;e++){var f=d[e];f.getCommonAncestor().isReadOnly()&&d.splice(e,1);if(!f.collapsed){if(f.startContainer.isReadOnly())for(var b=f.startContainer,i;b;){if((i=b.type==CKEDITOR.NODE_ELEMENT)&&b.is("body")||!b.isReadOnly())break;i&&b.getAttribute("contentEditable")=="false"&&f.setStartAfter(b);b=b.getParent()}b=f.startContainer;i=f.endContainer;var j=f.startOffset,l=f.endOffset,n=f.clone();b&&b.type==CKEDITOR.NODE_TEXT&&
    +(j>=b.getLength()?n.setStartAfter(b):n.setStartBefore(b));i&&i.type==CKEDITOR.NODE_TEXT&&(l?n.setEndAfter(i):n.setEndBefore(i));b=new CKEDITOR.dom.walker(n);b.evaluator=function(a){if(a.type==CKEDITOR.NODE_ELEMENT&&a.isReadOnly()){var b=f.clone();f.setEndBefore(a);f.collapsed&&d.splice(e--,1);if(!(a.getPosition(n.endContainer)&CKEDITOR.POSITION_CONTAINS)){b.setStartAfter(a);b.collapsed||d.splice(e+1,0,b)}return true}return false};b.next()}}return c.ranges}}(),getStartElement:function(){var a=this._.cache;
    +if(a.startElement!==void 0)return a.startElement;var b;switch(this.getType()){case CKEDITOR.SELECTION_ELEMENT:return this.getSelectedElement();case CKEDITOR.SELECTION_TEXT:var c=this.getRanges()[0];if(c){if(c.collapsed){b=c.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent())}else{for(c.optimize();;){b=c.startContainer;if(c.startOffset==(b.getChildCount?b.getChildCount():b.getLength())&&!b.isBlockBoundary())c.setStartAfter(b);else break}b=c.startContainer;if(b.type!=CKEDITOR.NODE_ELEMENT)return b.getParent();
    +b=b.getChild(c.startOffset);if(!b||b.type!=CKEDITOR.NODE_ELEMENT)b=c.startContainer;else for(c=b.getFirst();c&&c.type==CKEDITOR.NODE_ELEMENT;){b=c;c=c.getFirst()}}b=b.$}}return a.startElement=b?new CKEDITOR.dom.element(b):null},getSelectedElement:function(){var a=this._.cache;if(a.selectedElement!==void 0)return a.selectedElement;var b=this,c=CKEDITOR.tools.tryThese(function(){return b.getNative().createRange().item(0)},function(){for(var a=b.getRanges()[0],c,d,e=2;e&&(!(c=a.getEnclosedNode())||!(c.type==
    +CKEDITOR.NODE_ELEMENT&&q[c.getName()]&&(d=c)));e--)a.shrink(CKEDITOR.SHRINK_ELEMENT);return d.$});return a.selectedElement=c?new CKEDITOR.dom.element(c):null},getSelectedText:function(){var a=this._.cache;if(a.selectedText!==void 0)return a.selectedText;var b=this.getNative(),b=n?b.type=="Control"?"":b.createRange().text:b.toString();return a.selectedText=b},lock:function(){this.getRanges();this.getStartElement();this.getSelectedElement();this.getSelectedText();this._.cache.nativeSel=null;this.isLocked=
    +1},unlock:function(a){if(this.isLocked){if(a)var b=this.getSelectedElement(),c=!b&&this.getRanges();this.isLocked=0;this.reset();if(a)(a=b||c[0]&&c[0].getCommonAncestor())&&a.getAscendant("body",1)&&(b?this.selectElement(b):this.selectRanges(c))}},reset:function(){this._.cache={}},selectElement:function(a){var b=new CKEDITOR.dom.range(this.root);b.setStartBefore(a);b.setEndAfter(a);this.selectRanges([b])},selectRanges:function(a){if(a.length)if(this.isLocked){var b=CKEDITOR.document.getActive();this.unlock();
    +this.selectRanges(a);this.lock();!b.equals(this.root)&&b.focus()}else{if(n){var c=CKEDITOR.dom.walker.whitespaces(true),f=/\ufeff|\u00a0/,i={table:1,tbody:1,tr:1};if(a.length>1){b=a[a.length-1];a[0].setEnd(b.endContainer,b.endOffset)}var b=a[0],a=b.collapsed,j,l,m,z=b.getEnclosedNode();if(z&&z.type==CKEDITOR.NODE_ELEMENT&&z.getName()in q&&(!z.is("a")||!z.getText()))try{m=z.$.createControlRange();m.addElement(z.$);m.select();return}catch(F){}(b.startContainer.type==CKEDITOR.NODE_ELEMENT&&b.startContainer.getName()in
    +i||b.endContainer.type==CKEDITOR.NODE_ELEMENT&&b.endContainer.getName()in i)&&b.shrink(CKEDITOR.NODE_ELEMENT,true);m=b.createBookmark();var i=m.startNode,s;if(!a)s=m.endNode;m=b.document.$.body.createTextRange();m.moveToElementText(i.$);m.moveStart("character",1);if(s){f=b.document.$.body.createTextRange();f.moveToElementText(s.$);m.setEndPoint("EndToEnd",f);m.moveEnd("character",-1)}else{j=i.getNext(c);l=i.hasAscendant("pre");j=!(j&&j.getText&&j.getText().match(f))&&(l||!i.hasPrevious()||i.getPrevious().is&&
    +i.getPrevious().is("br"));l=b.document.createElement("span");l.setHtml("&#65279;");l.insertBefore(i);j&&b.document.createText("锘").insertBefore(i)}b.setStartBefore(i);i.remove();if(a){if(j){m.moveStart("character",-1);m.select();b.document.$.selection.clear()}else m.select();b.moveToPosition(l,CKEDITOR.POSITION_BEFORE_START);l.remove()}else{b.setEndBefore(s);s.remove();m.select()}}else{s=this.getNative();if(!s)return;if(CKEDITOR.env.opera){b=this.document.$.createRange();b.selectNodeContents(this.root.$);
    +s.addRange(b)}this.removeAllRanges();for(f=0;f<a.length;f++){if(f<a.length-1){b=a[f];m=a[f+1];l=b.clone();l.setStart(b.endContainer,b.endOffset);l.setEnd(m.startContainer,m.startOffset);if(!l.collapsed){l.shrink(CKEDITOR.NODE_ELEMENT,true);j=l.getCommonAncestor();l=l.getEnclosedNode();if(j.isReadOnly()||l&&l.isReadOnly()){m.setStart(b.startContainer,b.startOffset);a.splice(f--,1);continue}}}b=a[f];m=this.document.$.createRange();j=b.startContainer;if(CKEDITOR.env.opera&&b.collapsed&&j.type==CKEDITOR.NODE_ELEMENT){l=
    +j.getChild(b.startOffset-1);c=j.getChild(b.startOffset);if(!l&&!c&&j.is(CKEDITOR.dtd.$removeEmpty)||l&&l.type==CKEDITOR.NODE_ELEMENT||c&&c.type==CKEDITOR.NODE_ELEMENT){b.insertNode(this.document.createText(""));b.collapse(1)}}if(b.collapsed&&CKEDITOR.env.webkit&&e(b)){j=this.root;d(j,false);l=j.getDocument().createText("鈥");j.setCustomData("cke-fillingChar",l);b.insertNode(l);if((j=l.getNext())&&!l.getPrevious()&&j.type==CKEDITOR.NODE_ELEMENT&&j.getName()=="br"){d(this.root);b.moveToPosition(j,CKEDITOR.POSITION_BEFORE_START)}else b.moveToPosition(l,
    +CKEDITOR.POSITION_AFTER_END)}m.setStart(b.startContainer.$,b.startOffset);try{m.setEnd(b.endContainer.$,b.endOffset)}catch(C){if(C.toString().indexOf("NS_ERROR_ILLEGAL_VALUE")>=0){b.collapse(1);m.setEnd(b.endContainer.$,b.endOffset)}else throw C;}s.addRange(m)}}this.reset();this.root.fire("selectionchange")}},createBookmarks:function(a){return this.getRanges().createBookmarks(a)},createBookmarks2:function(a){return this.getRanges().createBookmarks2(a)},selectBookmarks:function(a){for(var b=[],c=0;c<
    +a.length;c++){var d=new CKEDITOR.dom.range(this.root);d.moveToBookmark(a[c]);b.push(d)}this.selectRanges(b);return this},getCommonAncestor:function(){var a=this.getRanges();return a[0].startContainer.getCommonAncestor(a[a.length-1].endContainer)},scrollIntoView:function(){this.type!=CKEDITOR.SELECTION_NONE&&this.getRanges()[0].scrollIntoView()},removeAllRanges:function(){var a=this.getNative();try{a&&a[n?"empty":"removeAllRanges"]()}catch(b){}this.reset()}}})();
    +CKEDITOR.editor.prototype.attachStyleStateChange=function(b,c){var a=this._.styleStateChangeCallbacks;if(!a){a=this._.styleStateChangeCallbacks=[];this.on("selectionChange",function(b){for(var c=0;c<a.length;c++){var d=a[c],i=d.style.checkActive(b.data.path)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF;d.fn.call(this,i)}})}a.push({style:b,fn:c})};CKEDITOR.STYLE_BLOCK=1;CKEDITOR.STYLE_INLINE=2;CKEDITOR.STYLE_OBJECT=3;
    +(function(){function b(a,b){for(var c,d;a=a.getParent();){if(a.equals(b))break;if(a.getAttribute("data-nostyle"))c=a;else if(!d){var e=a.getAttribute("contentEditable");e=="false"?c=a:e=="true"&&(d=1)}}return c}function c(a){var c=a.document;if(a.collapsed){c=u(this,c);a.insertNode(c);a.moveToPosition(c,CKEDITOR.POSITION_BEFORE_END)}else{var d=this.element,e=this._.definition,f,g=e.ignoreReadonly,h=g||e.includeReadonly;h==void 0&&(h=a.root.getCustomData("cke_includeReadonly"));var i=CKEDITOR.dtd[d]||
    +(f=true,CKEDITOR.dtd.span);a.enlarge(CKEDITOR.ENLARGE_INLINE,1);a.trim();var j=a.createBookmark(),l=j.startNode,k=j.endNode,m=l,n;if(!g){var q=a.getCommonAncestor(),g=b(l,q),q=b(k,q);g&&(m=g.getNextSourceNode(true));q&&(k=q)}for(m.getPosition(k)==CKEDITOR.POSITION_FOLLOWING&&(m=0);m;){g=false;if(m.equals(k)){m=null;g=true}else{var r=m.type,s=r==CKEDITOR.NODE_ELEMENT?m.getName():null,q=s&&m.getAttribute("contentEditable")=="false",t=s&&m.getAttribute("data-nostyle");if(s&&m.data("cke-bookmark")){m=
    +m.getNextSourceNode(true);continue}if(!s||i[s]&&!t&&(!q||h)&&(m.getPosition(k)|CKEDITOR.POSITION_PRECEDING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED)==CKEDITOR.POSITION_PRECEDING+CKEDITOR.POSITION_IDENTICAL+CKEDITOR.POSITION_IS_CONTAINED&&(!e.childRule||e.childRule(m))){var v=m.getParent();if(v&&((v.getDtd()||CKEDITOR.dtd.span)[d]||f)&&(!e.parentRule||e.parentRule(v))){if(!n&&(!s||!CKEDITOR.dtd.$removeEmpty[s]||(m.getPosition(k)|CKEDITOR.POSITION_PRECEDING|CKEDITOR.POSITION_IDENTICAL|
    +CKEDITOR.POSITION_IS_CONTAINED)==CKEDITOR.POSITION_PRECEDING+CKEDITOR.POSITION_IDENTICAL+CKEDITOR.POSITION_IS_CONTAINED)){n=a.clone();n.setStartBefore(m)}if(r==CKEDITOR.NODE_TEXT||q||r==CKEDITOR.NODE_ELEMENT&&!m.getChildCount()){for(var r=m,w;(g=!r.getNext(A))&&(w=r.getParent(),i[w.getName()])&&(w.getPosition(l)|CKEDITOR.POSITION_FOLLOWING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED)==CKEDITOR.POSITION_FOLLOWING+CKEDITOR.POSITION_IDENTICAL+CKEDITOR.POSITION_IS_CONTAINED&&(!e.childRule||
    +e.childRule(w));)r=w;n.setEndAfter(r)}}else g=true}else g=true;m=m.getNextSourceNode(t||q&&!h)}if(g&&n&&!n.collapsed){for(var g=u(this,c),q=g.hasAttributes(),t=n.getCommonAncestor(),r={},s={},v={},z={},B,C,F;g&&t;){if(t.getName()==d){for(B in e.attributes)if(!z[B]&&(F=t.getAttribute(C)))g.getAttribute(B)==F?s[B]=1:z[B]=1;for(C in e.styles)if(!v[C]&&(F=t.getStyle(C)))g.getStyle(C)==F?r[C]=1:v[C]=1}t=t.getParent()}for(B in s)g.removeAttribute(B);for(C in r)g.removeStyle(C);q&&!g.hasAttributes()&&(g=
    +null);if(g){n.extractContents().appendTo(g);p.call(this,g);n.insertNode(g);g.mergeSiblings();CKEDITOR.env.ie||g.$.normalize()}else{g=new CKEDITOR.dom.element("span");n.extractContents().appendTo(g);n.insertNode(g);p.call(this,g);g.remove(true)}n=null}}a.moveToBookmark(j);a.shrink(CKEDITOR.SHRINK_TEXT)}}function a(a){a.enlarge(CKEDITOR.ENLARGE_INLINE,1);var b=a.createBookmark(),c=b.startNode;if(a.collapsed){for(var d=new CKEDITOR.dom.elementPath(c.getParent(),a.root),e,f=0,g;f<d.elements.length&&(g=
    +d.elements[f]);f++){if(g==d.block||g==d.blockLimit)break;if(this.checkElementRemovable(g)){var i;if(a.collapsed&&(a.checkBoundaryOfElement(g,CKEDITOR.END)||(i=a.checkBoundaryOfElement(g,CKEDITOR.START)))){e=g;e.match=i?"start":"end"}else{g.mergeSiblings();g.getName()==this.element?q.call(this,g):h(g,t(this)[g.getName()])}}}if(e){g=c;for(f=0;;f++){i=d.elements[f];if(i.equals(e))break;else if(i.match)continue;else i=i.clone();i.append(g);g=i}g[e.match=="start"?"insertBefore":"insertAfter"](e)}}else{var j=
    +b.endNode,k=this,d=function(){for(var a=new CKEDITOR.dom.elementPath(c.getParent()),b=new CKEDITOR.dom.elementPath(j.getParent()),d=null,e=null,f=0;f<a.elements.length;f++){var g=a.elements[f];if(g==a.block||g==a.blockLimit)break;k.checkElementRemovable(g)&&(d=g)}for(f=0;f<b.elements.length;f++){g=b.elements[f];if(g==b.block||g==b.blockLimit)break;k.checkElementRemovable(g)&&(e=g)}e&&j.breakParent(e);d&&c.breakParent(d)};d();for(e=c;!e.equals(j);){f=e.getNextSourceNode();if(e.type==CKEDITOR.NODE_ELEMENT&&
    +this.checkElementRemovable(e)){e.getName()==this.element?q.call(this,e):h(e,t(this)[e.getName()]);if(f.type==CKEDITOR.NODE_ELEMENT&&f.contains(c)){d();f=c.getNext()}}e=f}}a.moveToBookmark(b)}function e(a){var b=a.getEnclosedNode()||a.getCommonAncestor(false,true);(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1))&&!a.isReadOnly()&&w(a,this)}function f(a){var b=a.getCommonAncestor(true,true);if(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1)){var b=this._.definition,
    +c=b.attributes;if(c)for(var d in c)a.removeAttribute(d,c[d]);if(b.styles)for(var e in b.styles)b.styles.hasOwnProperty(e)&&a.removeStyle(e)}}function d(a){var b=a.createBookmark(true),c=a.createIterator();c.enforceRealBlocks=true;if(this._.enterMode)c.enlargeBr=this._.enterMode!=CKEDITOR.ENTER_BR;for(var d,e=a.document;d=c.getNextParagraph();)if(!d.isReadOnly()){var f=u(this,e,d);l(d,f)}a.moveToBookmark(b)}function i(a){var b=a.createBookmark(1),c=a.createIterator();c.enforceRealBlocks=true;c.enlargeBr=
    +this._.enterMode!=CKEDITOR.ENTER_BR;for(var d;d=c.getNextParagraph();)if(this.checkElementRemovable(d))if(d.is("pre")){var e=this._.enterMode==CKEDITOR.ENTER_BR?null:a.document.createElement(this._.enterMode==CKEDITOR.ENTER_P?"p":"div");e&&d.copyAttributes(e);l(d,e)}else q.call(this,d);a.moveToBookmark(b)}function l(a,b){var c=!b;if(c){b=a.getDocument().createElement("div");a.copyAttributes(b)}var d=b&&b.is("pre"),e=a.is("pre"),f=!d&&e;if(d&&!e){e=b;(f=a.getBogus())&&f.remove();f=a.getHtml();f=m(f,
    +/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,"");f=f.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi,"$1");f=f.replace(/([ \t\n\r]+|&nbsp;)/g," ");f=f.replace(/<br\b[^>]*>/gi,"\n");if(CKEDITOR.env.ie){var h=a.getDocument().createElement("div");h.append(e);e.$.outerHTML="<pre>"+f+"</pre>";e.copyAttributes(h.getFirst());e=h.getFirst().remove()}else e.setHtml(f);b=e}else f?b=n(c?[a.getHtml()]:j(a),b):a.moveChildren(b);b.replace(a);if(d){var c=b,i;if((i=c.getPrevious(v))&&i.is&&i.is("pre")){d=m(i.getHtml(),/\n$/,"")+
    +"\n\n"+m(c.getHtml(),/^\n/,"");CKEDITOR.env.ie?c.$.outerHTML="<pre>"+d+"</pre>":c.setHtml(d);i.remove()}}else c&&g(b)}function j(a){a.getName();var b=[];m(a.getOuterHtml(),/(\S\s*)\n(?:\s|(<span[^>]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,function(a,b,c){return b+"</pre>"+c+"<pre>"}).replace(/<pre\b.*?>([\s\S]*?)<\/pre>/gi,function(a,c){b.push(c)});return b}function m(a,b,c){var d="",e="",a=a.replace(/(^<span[^>]+data-cke-bookmark.*?\/span>)|(<span[^>]+data-cke-bookmark.*?\/span>$)/gi,function(a,
    +b,c){b&&(d=b);c&&(e=c);return""});return d+a.replace(b,c)+e}function n(a,b){var c;a.length>1&&(c=new CKEDITOR.dom.documentFragment(b.getDocument()));for(var d=0;d<a.length;d++){var e=a[d],e=e.replace(/(\r\n|\r)/g,"\n"),e=m(e,/^[ \t]*\n/,""),e=m(e,/\n$/,""),e=m(e,/^[ \t]+|[ \t]+$/g,function(a,b){return a.length==1?"&nbsp;":b?" "+CKEDITOR.tools.repeat("&nbsp;",a.length-1):CKEDITOR.tools.repeat("&nbsp;",a.length-1)+" "}),e=e.replace(/\n/g,"<br>"),e=e.replace(/[ \t]{2,}/g,function(a){return CKEDITOR.tools.repeat("&nbsp;",
    +a.length-1)+" "});if(c){var f=b.clone();f.setHtml(e);c.append(f)}else b.setHtml(e)}return c||b}function q(a){var b=this._.definition,c=b.attributes,b=b.styles,d=t(this)[a.getName()],e=CKEDITOR.tools.isEmpty(c)&&CKEDITOR.tools.isEmpty(b),f;for(f in c)if(!((f=="class"||this._.definition.fullMatch)&&a.getAttribute(f)!=B(f,c[f]))){e=a.hasAttribute(f);a.removeAttribute(f)}for(var i in b)if(!(this._.definition.fullMatch&&a.getStyle(i)!=B(i,b[i],true))){e=e||!!a.getStyle(i);a.removeStyle(i)}h(a,d,F[a.getName()]);
    +e&&(this._.definition.alwaysRemoveElement?g(a,1):!CKEDITOR.dtd.$block[a.getName()]||this._.enterMode==CKEDITOR.ENTER_BR&&!a.hasAttributes()?g(a):a.renameNode(this._.enterMode==CKEDITOR.ENTER_P?"p":"div"))}function p(a){for(var b=t(this),c=a.getElementsByTag(this.element),d=c.count();--d>=0;)q.call(this,c.getItem(d));for(var e in b)if(e!=this.element){c=a.getElementsByTag(e);for(d=c.count()-1;d>=0;d--){var f=c.getItem(d);h(f,b[e])}}}function h(a,b,c){if(b=b&&b.attributes)for(var d=0;d<b.length;d++){var e=
    +b[d][0],f;if(f=a.getAttribute(e)){var h=b[d][1];(h===null||h.test&&h.test(f)||typeof h=="string"&&f==h)&&a.removeAttribute(e)}}c||g(a)}function g(a,b){if(!a.hasAttributes()||b)if(CKEDITOR.dtd.$block[a.getName()]){var c=a.getPrevious(v),d=a.getNext(v);c&&(c.type==CKEDITOR.NODE_TEXT||!c.isBlockBoundary({br:1}))&&a.append("br",1);d&&(d.type==CKEDITOR.NODE_TEXT||!d.isBlockBoundary({br:1}))&&a.append("br");a.remove(true)}else{c=a.getFirst();d=a.getLast();a.remove(true);if(c){c.type==CKEDITOR.NODE_ELEMENT&&
    +c.mergeSiblings();d&&(!c.equals(d)&&d.type==CKEDITOR.NODE_ELEMENT)&&d.mergeSiblings()}}}function u(a,b,c){var d;d=a.element;d=="*"&&(d="span");d=new CKEDITOR.dom.element(d,b);c&&c.copyAttributes(d);d=w(d,a);b.getCustomData("doc_processing_style")&&d.hasAttribute("id")?d.removeAttribute("id"):b.setCustomData("doc_processing_style",1);return d}function w(a,b){var c=b._.definition,d=c.attributes,c=CKEDITOR.style.getStyleText(c);if(d)for(var e in d)a.setAttribute(e,d[e]);c&&a.setAttribute("style",c);
    +return a}function k(a,b){for(var c in a)a[c]=a[c].replace(r,function(a,c){return b[c]})}function t(a){if(a._.overrides)return a._.overrides;var b=a._.overrides={},c=a._.definition.overrides;if(c){CKEDITOR.tools.isArray(c)||(c=[c]);for(var d=0;d<c.length;d++){var e=c[d],f,g;if(typeof e=="string")f=e.toLowerCase();else{f=e.element?e.element.toLowerCase():a.element;g=e.attributes}e=b[f]||(b[f]={});if(g){var e=e.attributes=e.attributes||[],h;for(h in g)e.push([h.toLowerCase(),g[h]])}}}return b}function B(a,
    +b,c){var d=new CKEDITOR.dom.element("span");d[c?"setStyle":"setAttribute"](a,b);return d[c?"getStyle":"getAttribute"](a)}function z(a,b){for(var c=a.document,d=a.getRanges(),e=b?this.removeFromRange:this.applyToRange,f,g=d.createIterator();f=g.getNextRange();)e.call(this,f);a.selectRanges(d);c.removeCustomData("doc_processing_style")}var F={address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,
    +keygen:1,output:1,progress:1,details:1,datagrid:1,datalist:1},s={a:1,embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,th:1,ul:1,dl:1,dt:1,dd:1,form:1,audio:1,video:1},C=/\s*(?:;\s*|$)/,r=/#\((.+?)\)/g,A=CKEDITOR.dom.walker.bookmark(0,1),v=CKEDITOR.dom.walker.whitespaces(1);CKEDITOR.style=function(a,b){var c=a.attributes;if(c&&c.style){a.styles=CKEDITOR.tools.extend({},a.styles,CKEDITOR.tools.parseCssText(c.style));delete c.style}if(b){a=CKEDITOR.tools.clone(a);k(a.attributes,b);k(a.styles,
    +b)}c=this.element=a.element?typeof a.element=="string"?a.element.toLowerCase():a.element:"*";this.type=a.type||(F[c]?CKEDITOR.STYLE_BLOCK:s[c]?CKEDITOR.STYLE_OBJECT:CKEDITOR.STYLE_INLINE);if(typeof this.element=="object")this.type=CKEDITOR.STYLE_OBJECT;this._={definition:a}};CKEDITOR.editor.prototype.applyStyle=function(a){z.call(a,this.getSelection())};CKEDITOR.editor.prototype.removeStyle=function(a){z.call(a,this.getSelection(),1)};CKEDITOR.style.prototype={apply:function(a){z.call(this,a.getSelection())},
    +remove:function(a){z.call(this,a.getSelection(),1)},applyToRange:function(a){return(this.applyToRange=this.type==CKEDITOR.STYLE_INLINE?c:this.type==CKEDITOR.STYLE_BLOCK?d:this.type==CKEDITOR.STYLE_OBJECT?e:null).call(this,a)},removeFromRange:function(b){return(this.removeFromRange=this.type==CKEDITOR.STYLE_INLINE?a:this.type==CKEDITOR.STYLE_BLOCK?i:this.type==CKEDITOR.STYLE_OBJECT?f:null).call(this,b)},applyToObject:function(a){w(a,this)},checkActive:function(a){switch(this.type){case CKEDITOR.STYLE_BLOCK:return this.checkElementRemovable(a.block||
    +a.blockLimit,true);case CKEDITOR.STYLE_OBJECT:case CKEDITOR.STYLE_INLINE:for(var b=a.elements,c=0,d;c<b.length;c++){d=b[c];if(!(this.type==CKEDITOR.STYLE_INLINE&&(d==a.block||d==a.blockLimit))){if(this.type==CKEDITOR.STYLE_OBJECT){var e=d.getName();if(!(typeof this.element=="string"?e==this.element:e in this.element))continue}if(this.checkElementRemovable(d,true))return true}}}return false},checkApplicable:function(a){switch(this.type){case CKEDITOR.STYLE_OBJECT:return a.contains(this.element)}return true},
    +checkElementMatch:function(a,b){var c=this._.definition;if(!a||!c.ignoreReadonly&&a.isReadOnly())return false;var d=a.getName();if(typeof this.element=="string"?d==this.element:d in this.element){if(!b&&!a.hasAttributes())return true;if(d=c._AC)c=d;else{var d={},e=0,f=c.attributes;if(f)for(var g in f){e++;d[g]=f[g]}if(g=CKEDITOR.style.getStyleText(c)){d.style||e++;d.style=g}d._length=e;c=c._AC=d}if(c._length){for(var h in c)if(h!="_length"){e=a.getAttribute(h)||"";if(h=="style")a:{d=c[h];typeof d==
    +"string"&&(d=CKEDITOR.tools.parseCssText(d));typeof e=="string"&&(e=CKEDITOR.tools.parseCssText(e,true));g=void 0;for(g in d)if(!(g in e&&(e[g]==d[g]||d[g]=="inherit"||e[g]=="inherit"))){d=false;break a}d=true}else d=c[h]==e;if(d){if(!b)return true}else if(b)return false}if(b)return true}else return true}return false},checkElementRemovable:function(a,b){if(this.checkElementMatch(a,b))return true;var c=t(this)[a.getName()];if(c){var d;if(!(c=c.attributes))return true;for(var e=0;e<c.length;e++){d=
    +c[e][0];if(d=a.getAttribute(d)){var f=c[e][1];if(f===null||typeof f=="string"&&d==f||f.test(d))return true}}}return false},buildPreview:function(a){var b=this._.definition,c=[],d=b.element;d=="bdo"&&(d="span");var c=["<",d],e=b.attributes;if(e)for(var f in e)c.push(" ",f,'="',e[f],'"');(e=CKEDITOR.style.getStyleText(b))&&c.push(' style="',e,'"');c.push(">",a||b.name,"</",d,">");return c.join("")},getDefinition:function(){return this._.definition}};CKEDITOR.style.getStyleText=function(a){var b=a._ST;
    +if(b)return b;var b=a.styles,c=a.attributes&&a.attributes.style||"",d="";c.length&&(c=c.replace(C,";"));for(var e in b){var f=b[e],g=(e+":"+f).replace(C,";");f=="inherit"?d=d+g:c=c+g}c.length&&(c=CKEDITOR.tools.normalizeCssText(c,true));return a._ST=c+d}})();CKEDITOR.styleCommand=function(b,c){this.requiredContent=this.allowedContent=this.style=b;CKEDITOR.tools.extend(this,c,true)};
    +CKEDITOR.styleCommand.prototype.exec=function(b){b.focus();this.state==CKEDITOR.TRISTATE_OFF?b.applyStyle(this.style):this.state==CKEDITOR.TRISTATE_ON&&b.removeStyle(this.style)};CKEDITOR.stylesSet=new CKEDITOR.resourceManager("","stylesSet");CKEDITOR.addStylesSet=CKEDITOR.tools.bind(CKEDITOR.stylesSet.add,CKEDITOR.stylesSet);CKEDITOR.loadStylesSet=function(b,c,a){CKEDITOR.stylesSet.addExternal(b,c,"");CKEDITOR.stylesSet.load(b,a)};
    +CKEDITOR.editor.prototype.getStylesSet=function(b){if(this._.stylesDefinitions)b(this._.stylesDefinitions);else{var c=this,a=c.config.stylesCombo_stylesSet||c.config.stylesSet;if(a===false)b(null);else if(a instanceof Array){c._.stylesDefinitions=a;b(a)}else{a||(a="default");var a=a.split(":"),e=a[0];CKEDITOR.stylesSet.addExternal(e,a[1]?a.slice(1).join(":"):CKEDITOR.getUrl("styles.js"),"");CKEDITOR.stylesSet.load(e,function(a){c._.stylesDefinitions=a[e];b(c._.stylesDefinitions)})}}};
    +CKEDITOR.dom.comment=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createComment(b));CKEDITOR.dom.domObject.call(this,b)};CKEDITOR.dom.comment.prototype=new CKEDITOR.dom.node;CKEDITOR.tools.extend(CKEDITOR.dom.comment.prototype,{type:CKEDITOR.NODE_COMMENT,getOuterHtml:function(){return"<\!--"+this.$.nodeValue+"--\>"}});
    +(function(){var b={},c;for(c in CKEDITOR.dtd.$blockLimit)c in CKEDITOR.dtd.$list||(b[c]=1);var a={};for(c in CKEDITOR.dtd.$block)c in CKEDITOR.dtd.$blockLimit||c in CKEDITOR.dtd.$empty||(a[c]=1);CKEDITOR.dom.elementPath=function(c,f){var d=null,i=null,l=[],f=f||c.getDocument().getBody(),j=c;do if(j.type==CKEDITOR.NODE_ELEMENT){l.push(j);if(!this.lastElement){this.lastElement=j;if(j.is(CKEDITOR.dtd.$object))continue}var m=j.getName();if(!i){!d&&a[m]&&(d=j);if(b[m]){var n;if(n=!d){if(m=m=="div"){a:{m=
    +j.getChildren();n=0;for(var q=m.count();n<q;n++){var p=m.getItem(n);if(p.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$block[p.getName()]){m=true;break a}}m=false}m=!m&&!j.equals(f)}n=m}n?d=j:i=j}}if(j.equals(f))break}while(j=j.getParent());this.block=d;this.blockLimit=i;this.root=f;this.elements=l}})();
    +CKEDITOR.dom.elementPath.prototype={compare:function(b){var c=this.elements,b=b&&b.elements;if(!b||c.length!=b.length)return false;for(var a=0;a<c.length;a++)if(!c[a].equals(b[a]))return false;return true},contains:function(b,c,a){var e;typeof b=="string"&&(e=function(a){return a.getName()==b});b instanceof CKEDITOR.dom.element?e=function(a){return a.equals(b)}:CKEDITOR.tools.isArray(b)?e=function(a){return CKEDITOR.tools.indexOf(b,a.getName())>-1}:typeof b=="function"?e=b:typeof b=="object"&&(e=
    +function(a){return a.getName()in b});var f=this.elements,d=f.length;c&&d--;if(a){f=Array.prototype.slice.call(f,0);f.reverse()}for(c=0;c<d;c++)if(e(f[c]))return f[c];return null},isContextFor:function(b){var c;if(b in CKEDITOR.dtd.$block){c=this.contains(CKEDITOR.dtd.$intermediate)||this.root.equals(this.block)&&this.block||this.blockLimit;return!!c.getDtd()[b]}return true},direction:function(){return(this.block||this.blockLimit||this.root).getDirection(1)}};
    +CKEDITOR.dom.text=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createTextNode(b));this.$=b};CKEDITOR.dom.text.prototype=new CKEDITOR.dom.node;
    +CKEDITOR.tools.extend(CKEDITOR.dom.text.prototype,{type:CKEDITOR.NODE_TEXT,getLength:function(){return this.$.nodeValue.length},getText:function(){return this.$.nodeValue},setText:function(b){this.$.nodeValue=b},split:function(b){var c=this.$.parentNode,a=c.childNodes.length,e=this.getLength(),f=this.getDocument(),d=new CKEDITOR.dom.text(this.$.splitText(b),f);if(c.childNodes.length==a)if(b>=e){d=f.createText("");d.insertAfter(this)}else{b=f.createText("");b.insertAfter(d);b.remove()}return d},substring:function(b,
    +c){return typeof c!="number"?this.$.nodeValue.substr(b):this.$.nodeValue.substring(b,c)}});
    +(function(){function b(a,b,c){var d=a.serializable,i=b[c?"endContainer":"startContainer"],l=c?"endOffset":"startOffset",j=d?b.document.getById(a.startNode):a.startNode,a=d?b.document.getById(a.endNode):a.endNode;if(i.equals(j.getPrevious())){b.startOffset=b.startOffset-i.getLength()-a.getPrevious().getLength();i=a.getNext()}else if(i.equals(a.getPrevious())){b.startOffset=b.startOffset-i.getLength();i=a.getNext()}i.equals(j.getParent())&&b[l]++;i.equals(a.getParent())&&b[l]++;b[c?"endContainer":"startContainer"]=
    +i;return b}CKEDITOR.dom.rangeList=function(a){if(a instanceof CKEDITOR.dom.rangeList)return a;a?a instanceof CKEDITOR.dom.range&&(a=[a]):a=[];return CKEDITOR.tools.extend(a,c)};var c={createIterator:function(){var a=this,b=CKEDITOR.dom.walker.bookmark(),c=[],d;return{getNextRange:function(i){d=d==void 0?0:d+1;var l=a[d];if(l&&a.length>1){if(!d)for(var j=a.length-1;j>=0;j--)c.unshift(a[j].createBookmark(true));if(i)for(var m=0;a[d+m+1];){for(var n=l.document,i=0,j=n.getById(c[m].endNode),n=n.getById(c[m+
    +1].startNode);;){j=j.getNextSourceNode(false);if(n.equals(j))i=1;else if(b(j)||j.type==CKEDITOR.NODE_ELEMENT&&j.isBlockBoundary())continue;break}if(!i)break;m++}for(l.moveToBookmark(c.shift());m--;){j=a[++d];j.moveToBookmark(c.shift());l.setEnd(j.endContainer,j.endOffset)}}return l}}},createBookmarks:function(a){for(var c=[],f,d=0;d<this.length;d++){c.push(f=this[d].createBookmark(a,true));for(var i=d+1;i<this.length;i++){this[i]=b(f,this[i]);this[i]=b(f,this[i],true)}}return c},createBookmarks2:function(a){for(var b=
    +[],c=0;c<this.length;c++)b.push(this[c].createBookmark2(a));return b},moveToBookmarks:function(a){for(var b=0;b<this.length;b++)this[b].moveToBookmark(a[b])}}})();
    +(function(){function b(){return CKEDITOR.getUrl(CKEDITOR.skinName.split(",")[1]||"skins/"+CKEDITOR.skinName.split(",")[0]+"/")}function c(a){var c=CKEDITOR.skin["ua_"+a],d=CKEDITOR.env;if(c)for(var c=c.split(",").sort(function(a,b){return a>b?-1:1}),e=0,f;e<c.length;e++){f=c[e];if(d.ie&&(f.replace(/^ie/,"")==d.version||d.quirks&&f=="iequirks"))f="ie";if(d[f]){a=a+("_"+c[e]);break}}return CKEDITOR.getUrl(b()+a+".css")}function a(a,b){if(!d[a]){CKEDITOR.document.appendStyleSheet(c(a));d[a]=1}b&&b()}
    +function e(a){var b=a.getById(i);if(!b){b=a.getHead().append("style");b.setAttribute("id",i);b.setAttribute("type","text/css")}return b}function f(a,b,c){var d,e,f;if(CKEDITOR.env.webkit){b=b.split("}").slice(0,-1);for(e=0;e<b.length;e++)b[e]=b[e].split("{")}for(var i=0;i<a.length;i++)if(CKEDITOR.env.webkit)for(e=0;e<b.length;e++){f=b[e][1];for(d=0;d<c.length;d++)f=f.replace(c[d][0],c[d][1]);a[i].$.sheet.addRule(b[e][0],f)}else{f=b;for(d=0;d<c.length;d++)f=f.replace(c[d][0],c[d][1]);CKEDITOR.env.ie?
    +a[i].$.styleSheet.cssText=a[i].$.styleSheet.cssText+f:a[i].$.innerHTML=a[i].$.innerHTML+f}}var d={};CKEDITOR.skin={path:b,loadPart:function(c,d){CKEDITOR.skin.name!=CKEDITOR.skinName.split(",")[0]?CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(b()+"skin.js"),function(){a(c,d)}):a(c,d)},getPath:function(a){return CKEDITOR.getUrl(c(a))},icons:{},addIcon:function(a,b,c){a=a.toLowerCase();this.icons[a]||(this.icons[a]={path:b,offset:c||0})},getIconStyle:function(a,b,c,d){var e;if(a){a=a.toLowerCase();b&&
    +(e=this.icons[a+"-rtl"]);e||(e=this.icons[a])}a=c||e&&e.path||"";d=d||e&&e.offset;return a&&"background-image:url("+CKEDITOR.getUrl(a)+");background-position:0 "+d+"px;"}};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{getUiColor:function(){return this.uiColor},setUiColor:function(a){var b=e(CKEDITOR.document);return(this.setUiColor=function(a){var c=CKEDITOR.skin.chameleon,d=[[j,a]];this.uiColor=a;f([b],c(this,"editor"),d);f(l,c(this,"panel"),d)}).call(this,a)}});var i="cke_ui_color",l=[],j=/\$color/g;
    +CKEDITOR.on("instanceLoaded",function(a){if(!CKEDITOR.env.ie||!CKEDITOR.env.quirks){var b=a.editor,a=function(a){a=(a.data[0]||a.data).element.getElementsByTag("iframe").getItem(0).getFrameDocument();if(!a.getById("cke_ui_color")){a=e(a);l.push(a);var c=b.getUiColor();c&&f([a],CKEDITOR.skin.chameleon(b,"panel"),[[j,c]])}};b.on("panelShow",a);b.on("menuShow",a);b.config.uiColor&&b.setUiColor(b.config.uiColor)}})})();
    +(function(){if(CKEDITOR.env.webkit)CKEDITOR.env.hc=false;else{var b=CKEDITOR.dom.element.createFromHtml('<div style="width:0px;height:0px;position:absolute;left:-10000px;border: 1px solid;border-color: red blue;"></div>',CKEDITOR.document);b.appendTo(CKEDITOR.document.getHead());try{CKEDITOR.env.hc=b.getComputedStyle("border-top-color")==b.getComputedStyle("border-right-color")}catch(c){CKEDITOR.env.hc=false}b.remove()}if(CKEDITOR.env.hc)CKEDITOR.env.cssClass=CKEDITOR.env.cssClass+" cke_hc";CKEDITOR.document.appendStyleText(".cke{visibility:hidden;}");
    +CKEDITOR.status="loaded";CKEDITOR.fireOnce("loaded");if(b=CKEDITOR._.pending){delete CKEDITOR._.pending;for(var a=0;a<b.length;a++){CKEDITOR.editor.prototype.constructor.apply(b[a][0],b[a][1]);CKEDITOR.add(b[a][0])}}})();/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.skin.name="moono";CKEDITOR.skin.ua_editor="ie,iequirks,ie7,ie8,gecko";CKEDITOR.skin.ua_dialog="ie,iequirks,ie7,ie8,opera";
    +CKEDITOR.skin.chameleon=function(){var b=function(){return function(b,e){for(var a=b.match(/[^#]./g),c=0;3>c;c++){var f=a,h=c,d;d=parseInt(a[c],16);d=("0"+(0>e?0|d*(1+e):0|d+(255-d)*e).toString(16)).slice(-2);f[h]=d}return"#"+a.join("")}}(),c=function(){var b=new CKEDITOR.template("background:#{to};background-image:-webkit-gradient(linear,lefttop,leftbottom,from({from}),to({to}));background-image:-moz-linear-gradient(top,{from},{to});background-image:-webkit-linear-gradient(top,{from},{to});background-image:-o-linear-gradient(top,{from},{to});background-image:-ms-linear-gradient(top,{from},{to});background-image:linear-gradient(top,{from},{to});filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='{from}',endColorstr='{to}');");return function(c,
    +a){return b.output({from:c,to:a})}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ {defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_bottom [{defaultGradient}border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [{defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [{defaultGradient}outline-color:{defaultBorder};border-top-color:{defaultBorder};] {id} .cke_dialog_tab [{lightGradient}border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [{mediumGradient}] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} .cke_toolgroup [{lightGradient}border-color:{defaultBorder};] {id} a.cke_button_off:hover, {id} a.cke_button_off:focus, {id} a.cke_button_off:active [{mediumGradient}] {id} .cke_button_on [{ckeButtonOn}] {id} .cke_toolbar_separator [background-color: {ckeToolbarSeparator};] {id} .cke_combo_button [border-color:{defaultBorder};{lightGradient}] {id} a.cke_combo_button:hover, {id} a.cke_combo_button:focus, {id} .cke_combo_on a.cke_combo_button [border-color:{defaultBorder};{mediumGradient}] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover, {id} a.cke_path_item:focus, {id} a.cke_path_item:active [background-color:{elementsPathBg};] {id}.cke_panel [border-color:{defaultBorder};] "),
    +panel:new CKEDITOR.template(".cke_panel_grouptitle [{lightGradient}border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:focus.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:focus.cke_colorauto, a:focus.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")};
    +return function(g,e){var a=g.uiColor,a={id:"."+g.id,defaultBorder:b(a,-0.1),defaultGradient:c(b(a,0.9),a),lightGradient:c(b(a,1),b(a,0.7)),mediumGradient:c(b(a,0.8),b(a,0.5)),ckeButtonOn:c(b(a,0.6),b(a,0.7)),ckeResizer:b(a,-0.4),ckeToolbarSeparator:b(a,0.5),ckeColorauto:b(a,0.8),dialogBody:b(a,0.7),dialogTabSelected:c("#FFFFFF","#FFFFFF"),dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-0.6),elementsPathBg:a,menubuttonIcon:b(a,0.5),menubuttonIconHover:b(a,0.3)};return f[e].output(a).replace(/\[/g,
    +"{").replace(/\]/g,"}")}}();CKEDITOR.plugins.add("dialogui",{onLoad:function(){var i=function(b){this._||(this._={});this._["default"]=this._.initValue=b["default"]||"";this._.required=b.required||!1;for(var a=[this._],d=1;d<arguments.length;d++)a.push(arguments[d]);a.push(!0);CKEDITOR.tools.extend.apply(CKEDITOR.tools,a);return this._},r={build:function(b,a,d){return new CKEDITOR.ui.dialog.textInput(b,a,d)}},l={build:function(b,a,d){return new CKEDITOR.ui.dialog[a.type](b,a,d)}},n={isChanged:function(){return this.getValue()!=
    +this.getInitValue()},reset:function(b){this.setValue(this.getInitValue(),b)},setInitValue:function(){this._.initValue=this.getValue()},resetInitValue:function(){this._.initValue=this._["default"]},getInitValue:function(){return this._.initValue}},o=CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onChange:function(b,a){this._.domOnChangeRegistered||(b.on("load",function(){this.getInputElement().on("change",function(){b.parts.dialog.isVisible()&&this.fire("change",{value:this.getValue()})},
    +this)},this),this._.domOnChangeRegistered=!0);this.on("change",a)}},!0),s=/^on([A-Z]\w+)/,p=function(b){for(var a in b)(s.test(a)||"title"==a||"type"==a)&&delete b[a];return b};CKEDITOR.tools.extend(CKEDITOR.ui.dialog,{labeledElement:function(b,a,d,e){if(!(4>arguments.length)){var c=i.call(this,a);c.labelId=CKEDITOR.tools.getNextId()+"_label";this._.children=[];CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"div",null,{role:"presentation"},function(){var f=[],d=a.required?" cke_required":"";"horizontal"!=
    +a.labelLayout?f.push('<label class="cke_dialog_ui_labeled_label'+d+'" ',' id="'+c.labelId+'"',c.inputId?' for="'+c.inputId+'"':"",(a.labelStyle?' style="'+a.labelStyle+'"':"")+">",a.label,"</label>",'<div class="cke_dialog_ui_labeled_content"'+(a.controlStyle?' style="'+a.controlStyle+'"':"")+' role="presentation">',e.call(this,b,a),"</div>"):(d={type:"hbox",widths:a.widths,padding:0,children:[{type:"html",html:'<label class="cke_dialog_ui_labeled_label'+d+'" id="'+c.labelId+'" for="'+c.inputId+'"'+
    +(a.labelStyle?' style="'+a.labelStyle+'"':"")+">"+CKEDITOR.tools.htmlEncode(a.label)+"</span>"},{type:"html",html:'<span class="cke_dialog_ui_labeled_content"'+(a.controlStyle?' style="'+a.controlStyle+'"':"")+">"+e.call(this,b,a)+"</span>"}]},CKEDITOR.dialog._.uiElementBuilders.hbox.build(b,d,f));return f.join("")})}},textInput:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);var e=this._.inputId=CKEDITOR.tools.getNextId()+"_textInput",c={"class":"cke_dialog_ui_input_"+a.type,id:e,type:a.type};
    +a.validate&&(this.validate=a.validate);a.maxLength&&(c.maxlength=a.maxLength);a.size&&(c.size=a.size);a.inputStyle&&(c.style=a.inputStyle);var f=this,h=!1;b.on("load",function(){f.getInputElement().on("keydown",function(a){a.data.getKeystroke()==13&&(h=true)});f.getInputElement().on("keyup",function(a){if(a.data.getKeystroke()==13&&h){b.getButton("ok")&&setTimeout(function(){b.getButton("ok").click()},0);h=false}},null,null,1E3)});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var b=
    +['<div class="cke_dialog_ui_input_',a.type,'" role="presentation"'];a.width&&b.push('style="width:'+a.width+'" ');b.push("><input ");c["aria-labelledby"]=this._.labelId;this._.required&&(c["aria-required"]=this._.required);for(var d in c)b.push(d+'="'+c[d]+'" ');b.push(" /></div>");return b.join("")})}},textarea:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);var e=this,c=this._.inputId=CKEDITOR.tools.getNextId()+"_textarea",f={};a.validate&&(this.validate=a.validate);f.rows=a.rows||5;f.cols=
    +a.cols||20;f["class"]="cke_dialog_ui_input_textarea "+(a["class"]||"");"undefined"!=typeof a.inputStyle&&(f.style=a.inputStyle);a.dir&&(f.dir=a.dir);CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){f["aria-labelledby"]=this._.labelId;this._.required&&(f["aria-required"]=this._.required);var a=['<div class="cke_dialog_ui_input_textarea" role="presentation"><textarea id="',c,'" '],b;for(b in f)a.push(b+'="'+CKEDITOR.tools.htmlEncode(f[b])+'" ');a.push(">",CKEDITOR.tools.htmlEncode(e._["default"]),
    +"</textarea></div>");return a.join("")})}},checkbox:function(b,a,d){if(!(3>arguments.length)){var e=i.call(this,a,{"default":!!a["default"]});a.validate&&(this.validate=a.validate);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"span",null,null,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_checkbox":CKEDITOR.tools.getNextId()+"_checkbox"},true),d=[],h=CKEDITOR.tools.getNextId()+"_label",g={"class":"cke_dialog_ui_checkbox_input",type:"checkbox","aria-labelledby":h};p(c);if(a["default"])g.checked=
    +"checked";if(typeof c.inputStyle!="undefined")c.style=c.inputStyle;e.checkbox=new CKEDITOR.ui.dialog.uiElement(b,c,d,"input",null,g);d.push(' <label id="',h,'" for="',g.id,'"'+(a.labelStyle?' style="'+a.labelStyle+'"':"")+">",CKEDITOR.tools.htmlEncode(a.label),"</label>");return d.join("")})}},radio:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);this._["default"]||(this._["default"]=this._.initValue=a.items[0][1]);a.validate&&(this.validate=a.valdiate);var e=[],c=this;CKEDITOR.ui.dialog.labeledElement.call(this,
    +b,a,d,function(){for(var d=[],h=[],g=a.id?a.id+"_radio":CKEDITOR.tools.getNextId()+"_radio",k=0;k<a.items.length;k++){var j=a.items[k],i=j[2]!==void 0?j[2]:j[0],l=j[1]!==void 0?j[1]:j[0],m=CKEDITOR.tools.getNextId()+"_radio_input",n=m+"_label",m=CKEDITOR.tools.extend({},a,{id:m,title:null,type:null},true),i=CKEDITOR.tools.extend({},m,{title:i},true),o={type:"radio","class":"cke_dialog_ui_radio_input",name:g,value:l,"aria-labelledby":n},q=[];if(c._["default"]==l)o.checked="checked";p(m);p(i);if(typeof m.inputStyle!=
    +"undefined")m.style=m.inputStyle;e.push(new CKEDITOR.ui.dialog.uiElement(b,m,q,"input",null,o));q.push(" ");new CKEDITOR.ui.dialog.uiElement(b,i,q,"label",null,{id:n,"for":o.id},j[0]);d.push(q.join(""))}new CKEDITOR.ui.dialog.hbox(b,e,d,h);return h.join("")});this._.children=e}},button:function(b,a,d){if(arguments.length){"function"==typeof a&&(a=a(b.getParentEditor()));i.call(this,a,{disabled:a.disabled||!1});CKEDITOR.event.implementOn(this);var e=this;b.on("load",function(){var a=this.getElement();
    +(function(){a.on("click",e.click,e);a.on("keydown",function(a){a.data.getKeystroke()in{32:1}&&(e.click(),a.data.preventDefault())})})();a.unselectable()},this);var c=CKEDITOR.tools.extend({},a);delete c.style;var f=CKEDITOR.tools.getNextId()+"_label";CKEDITOR.ui.dialog.uiElement.call(this,b,c,d,"a",null,{style:a.style,href:"javascript:void(0)",title:a.label,hidefocus:"true","class":a["class"],role:"button","aria-labelledby":f},'<span id="'+f+'" class="cke_dialog_ui_button">'+CKEDITOR.tools.htmlEncode(a.label)+
    +"</span>")}},select:function(b,a,d){if(!(3>arguments.length)){var e=i.call(this,a);a.validate&&(this.validate=a.validate);e.inputId=CKEDITOR.tools.getNextId()+"_select";CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_select":CKEDITOR.tools.getNextId()+"_select"},true),d=[],h=[],g={id:e.inputId,"class":"cke_dialog_ui_input_select","aria-labelledby":this._.labelId};d.push('<div class="cke_dialog_ui_input_',a.type,'" role="presentation"');
    +a.width&&d.push('style="width:'+a.width+'" ');d.push(">");if(a.size!=void 0)g.size=a.size;if(a.multiple!=void 0)g.multiple=a.multiple;p(c);for(var k=0,j;k<a.items.length&&(j=a.items[k]);k++)h.push('<option value="',CKEDITOR.tools.htmlEncode(j[1]!==void 0?j[1]:j[0]).replace(/"/g,"&quot;"),'" /> ',CKEDITOR.tools.htmlEncode(j[0]));if(typeof c.inputStyle!="undefined")c.style=c.inputStyle;e.select=new CKEDITOR.ui.dialog.uiElement(b,c,d,"select",null,g,h.join(""));d.push("</div>");return d.join("")})}},
    +file:function(b,a,d){if(!(3>arguments.length)){void 0===a["default"]&&(a["default"]="");var e=CKEDITOR.tools.extend(i.call(this,a),{definition:a,buttons:[]});a.validate&&(this.validate=a.validate);b.on("load",function(){CKEDITOR.document.getById(e.frameId).getParent().addClass("cke_dialog_ui_input_file")});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){e.frameId=CKEDITOR.tools.getNextId()+"_fileInput";var b=['<iframe frameborder="0" allowtransparency="0" class="cke_dialog_ui_input_file" role="presentation" id="',
    +e.frameId,'" title="',a.label,'" src="javascript:void('];b.push(CKEDITOR.env.ie?"(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"})()":"0");b.push(')"></iframe>');return b.join("")})}},fileButton:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);var e=this;a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),f=c.onClick;c.className=(c.className?c.className+" ":"")+"cke_dialog_ui_button";c.onClick=function(c){var d=
    +a["for"];if(!f||f.call(this,c)!==false){b.getContentElement(d[0],d[1]).submit();this.disable()}};b.on("load",function(){b.getContentElement(a["for"][0],a["for"][1])._.buttons.push(e)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\s*<[\w:]+\s+([^>]*)?>/,a=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,d=/\/$/;return function(e,c,f){if(!(3>arguments.length)){var h=[],g=c.html;"<"!=g.charAt(0)&&(g="<span>"+g+"</span>");var k=c.focus;if(k){var j=this.focus;this.focus=function(){("function"==
    +typeof k?k:j).call(this);this.fire("focus")};c.isFocusable&&(this.isFocusable=this.isFocusable);this.keyboardFocusable=!0}CKEDITOR.ui.dialog.uiElement.call(this,e,c,h,"span",null,null,"");h=h.join("").match(b);g=g.match(a)||["","",""];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]="/"+g[2]);f.push([g[1]," ",h[1]||"",g[2]].join(""))}}}(),fieldset:function(b,a,d,e,c){var f=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,e,"fieldset",null,null,function(){var a=[];f&&a.push("<legend"+
    +(c.labelStyle?' style="'+c.labelStyle+'"':"")+">"+f+"</legend>");for(var b=0;b<d.length;b++)a.push(d[b]);return a.join("")})}},!0);CKEDITOR.ui.dialog.html.prototype=new CKEDITOR.ui.dialog.uiElement;CKEDITOR.ui.dialog.labeledElement.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setLabel:function(b){var a=CKEDITOR.document.getById(this._.labelId);1>a.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue=b;return this},getLabel:function(){var b=
    +CKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()?"":b.getChild(0).getText()},eventProcessors:o},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return!this._.disabled?this.fire("click",{dialog:this._.dialog}):!1},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass("cke_disabled")},disable:function(){this._.disabled=!0;this.getElement().addClass("cke_disabled")},isVisible:function(){return this.getElement().getFirst().isVisible()},
    +isEnabled:function(){return!this._.disabled},eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on("click",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)},
    +focus:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){!b&&(b="");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.textarea.prototype=new CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype=
    +CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var e=new CKEDITOR.dom.element("option",this.getDialog().getParentEditor().document),c=this.getInputElement().$;e.$.text=b;e.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(e.$):c.add(e.$,null):c.add(e.$,d);return this},remove:function(b){this.getInputElement().$.remove(b);return this},clear:function(){for(var b=this.getInputElement().$;0<
    +b.length;)b.remove(0);return this},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.checkbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getInputElement:function(){return this._.checkbox.getElement()},setValue:function(b,a){this.getInputElement().$.checked=b;!a&&this.fire("change",{value:b})},getValue:function(){return this.getInputElement().$.checked},accessKeyUp:function(){this.setValue(!this.getValue())},eventProcessors:{onChange:function(b,a){if(!CKEDITOR.env.ie||8<CKEDITOR.env.version)return o.onChange.apply(this,
    +arguments);b.on("load",function(){var a=this._.checkbox.getElement();a.on("propertychange",function(b){b=b.data.$;"checked"==b.propertyName&&this.fire("change",{value:a.$.checked})},this)},this);this.on("change",a);return null}},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.radio.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setValue:function(b,a){for(var d=this._.children,e,c=0;c<d.length&&(e=d[c]);c++)e.getElement().$.checked=e.getValue()==b;!a&&this.fire("change",{value:b})},
    +getValue:function(){for(var b=this._.children,a=0;a<b.length;a++)if(b[a].getElement().$.checked)return b[a].getValue();return null},accessKeyUp:function(){var b=this._.children,a;for(a=0;a<b.length;a++)if(b[a].getElement().$.checked){b[a].getElement().focus();return}b[0].getElement().focus()},eventProcessors:{onChange:function(b,a){if(CKEDITOR.env.ie)b.on("load",function(){for(var a=this._.children,b=this,c=0;c<a.length;c++)a[c].getElement().on("propertychange",function(a){a=a.data.$;"checked"==a.propertyName&&
    +this.$.checked&&b.fire("change",{value:this.getAttribute("value")})})},this),this.on("change",a);else return o.onChange.apply(this,arguments);return null}},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.file.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,n,{getInputElement:function(){var b=CKEDITOR.document.getById(this._.frameId).getFrameDocument();return 0<b.$.forms.length?new CKEDITOR.dom.element(b.$.forms[0].elements[0]):this.getElement()},submit:function(){this.getInputElement().getParent().$.submit();
    +return this},getAction:function(){return this.getInputElement().getParent().$.action},registerEvents:function(b){var a=/^on([A-Z]\w+)/,d,e=function(a,b,c,d){a.on("formLoaded",function(){a.getInputElement().on(c,d,a)})},c;for(c in b)if(d=c.match(a))this.eventProcessors[c]?this.eventProcessors[c].call(this,this._.dialog,b[c]):e(this,this._.dialog,d[1].toLowerCase(),b[c]);return this},reset:function(){function b(){d.$.open();var b="";e.size&&(b=e.size-(CKEDITOR.env.ie?7:0));var i=a.frameId+"_input";
    +d.$.write(['<html dir="'+g+'" lang="'+k+'"><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">','<form enctype="multipart/form-data" method="POST" dir="'+g+'" lang="'+k+'" action="',CKEDITOR.tools.htmlEncode(e.action),'"><label id="',a.labelId,'" for="',i,'" style="display:none">',CKEDITOR.tools.htmlEncode(e.label),'</label><input id="',i,'" aria-labelledby="',a.labelId,'" type="file" name="',CKEDITOR.tools.htmlEncode(e.id||"cke_upload"),'" size="',CKEDITOR.tools.htmlEncode(0<
    +b?b:""),'" /></form></body></html><script>',CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"","window.parent.CKEDITOR.tools.callFunction("+f+");","window.onbeforeunload = function() {window.parent.CKEDITOR.tools.callFunction("+h+")}","<\/script>"].join(""));d.$.close();for(b=0;b<c.length;b++)c[b].enable()}var a=this._,d=CKEDITOR.document.getById(a.frameId).getFrameDocument(),e=a.definition,c=a.buttons,f=this.formLoadedNumber,h=this.formUnloadNumber,g=a.dialog._.editor.lang.dir,k=a.dialog._.editor.langCode;
    +f||(f=this.formLoadedNumber=CKEDITOR.tools.addFunction(function(){this.fire("formLoaded")},this),h=this.formUnloadNumber=CKEDITOR.tools.addFunction(function(){this.getInputElement().clearCustomData()},this),this.getDialog()._.editor.on("destroy",function(){CKEDITOR.tools.removeFunction(f);CKEDITOR.tools.removeFunction(h)}));CKEDITOR.env.gecko?setTimeout(b,500):b()},getValue:function(){return this.getInputElement().$.value||""},setInitValue:function(){this._.initValue=""},eventProcessors:{onChange:function(b,
    +a){this._.domOnChangeRegistered||(this.on("formLoaded",function(){this.getInputElement().on("change",function(){this.fire("change",{value:this.getValue()})},this)},this),this._.domOnChangeRegistered=!0);this.on("change",a)}},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.fileButton.prototype=new CKEDITOR.ui.dialog.button;CKEDITOR.ui.dialog.fieldset.prototype=CKEDITOR.tools.clone(CKEDITOR.ui.dialog.hbox.prototype);CKEDITOR.dialog.addUIElement("text",r);CKEDITOR.dialog.addUIElement("password",r);CKEDITOR.dialog.addUIElement("textarea",
    +l);CKEDITOR.dialog.addUIElement("checkbox",l);CKEDITOR.dialog.addUIElement("radio",l);CKEDITOR.dialog.addUIElement("button",l);CKEDITOR.dialog.addUIElement("select",l);CKEDITOR.dialog.addUIElement("file",l);CKEDITOR.dialog.addUIElement("fileButton",l);CKEDITOR.dialog.addUIElement("html",l);CKEDITOR.dialog.addUIElement("fieldset",{build:function(b,a,d){for(var e=a.children,c,f=[],h=[],g=0;g<e.length&&(c=e[g]);g++){var i=[];f.push(i);h.push(CKEDITOR.dialog._.uiElementBuilders[c.type].build(b,c,i))}return new CKEDITOR.ui.dialog[a.type](b,
    +h,f,d,a)}})}});CKEDITOR.DIALOG_RESIZE_NONE=0;CKEDITOR.DIALOG_RESIZE_WIDTH=1;CKEDITOR.DIALOG_RESIZE_HEIGHT=2;CKEDITOR.DIALOG_RESIZE_BOTH=3;
    +(function(){function p(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId)+a,c=b-1;c>b-a;c--)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function u(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId),c=b+1;c<b+a;c++)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function q(a,b){for(var c=a.$.getElementsByTagName("input"),
    +d=0,e=c.length;d<e;d++){var g=new CKEDITOR.dom.element(c[d]);"text"==g.getAttribute("type").toLowerCase()&&(b?(g.setAttribute("value",g.getCustomData("fake_value")||""),g.removeCustomData("fake_value")):(g.setCustomData("fake_value",g.getAttribute("value")),g.setAttribute("value","")))}}function P(a,b){var c=this.getInputElement();c&&(a?c.removeAttribute("aria-invalid"):c.setAttribute("aria-invalid",!0));a||(this.select?this.select():this.focus());b&&alert(b);this.fire("validated",{valid:a,msg:b})}
    +function Q(){var a=this.getInputElement();a&&a.removeAttribute("aria-invalid")}function R(a){var a=CKEDITOR.dom.element.createFromHtml(CKEDITOR.addTemplate("dialog",S).output({id:CKEDITOR.tools.getNextNumber(),editorId:a.id,langDir:a.lang.dir,langCode:a.langCode,editorDialogClass:"cke_editor_"+a.name.replace(/\./g,"\\.")+"_dialog",closeTitle:a.lang.common.close})),b=a.getChild([0,0,0,0,0]),c=b.getChild(0),d=b.getChild(1);if(CKEDITOR.env.ie&&!CKEDITOR.env.ie6Compat){var e="javascript:void(function(){"+
    +encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"}())";CKEDITOR.dom.element.createFromHtml('<iframe frameBorder="0" class="cke_iframe_shim" src="'+e+'" tabIndex="-1"></iframe>').appendTo(b.getParent())}c.unselectable();d.unselectable();return{element:a,parts:{dialog:a.getChild(0),title:c,close:d,tabs:b.getChild(2),contents:b.getChild([3,0,0,0]),footer:b.getChild([3,0,1,0])}}}function H(a,b,c){this.element=b;this.focusIndex=c;this.tabIndex=0;this.isFocusable=
    +function(){return!b.getAttribute("disabled")&&b.isVisible()};this.focus=function(){a._.currentFocusIndex=this.focusIndex;this.element.focus()};b.on("keydown",function(a){a.data.getKeystroke()in{32:1,13:1}&&this.fire("click")});b.on("focus",function(){this.fire("mouseover")});b.on("blur",function(){this.fire("mouseout")})}function T(a){function b(){a.layout()}var c=CKEDITOR.document.getWindow();c.on("resize",b);a.on("hide",function(){c.removeListener("resize",b)})}function I(a,b){this._={dialog:a};
    +CKEDITOR.tools.extend(this,b)}function U(a){function b(b){var c=a.getSize(),h=CKEDITOR.document.getWindow().getViewPaneSize(),o=b.data.$.screenX,i=b.data.$.screenY,n=o-d.x,l=i-d.y;d={x:o,y:i};e.x+=n;e.y+=l;a.move(e.x+k[3]<f?-k[3]:e.x-k[1]>h.width-c.width-f?h.width-c.width+("rtl"==g.lang.dir?0:k[1]):e.x,e.y+k[0]<f?-k[0]:e.y-k[2]>h.height-c.height-f?h.height-c.height+k[2]:e.y,1);b.data.preventDefault()}function c(){CKEDITOR.document.removeListener("mousemove",b);CKEDITOR.document.removeListener("mouseup",
    +c);if(CKEDITOR.env.ie6Compat){var a=r.getChild(0).getFrameDocument();a.removeListener("mousemove",b);a.removeListener("mouseup",c)}}var d=null,e=null;a.getElement().getFirst();var g=a.getParentEditor(),f=g.config.dialog_magnetDistance,k=CKEDITOR.skin.margins||[0,0,0,0];"undefined"==typeof f&&(f=20);a.parts.title.on("mousedown",function(f){d={x:f.data.$.screenX,y:f.data.$.screenY};CKEDITOR.document.on("mousemove",b);CKEDITOR.document.on("mouseup",c);e=a.getPosition();if(CKEDITOR.env.ie6Compat){var j=
    +r.getChild(0).getFrameDocument();j.on("mousemove",b);j.on("mouseup",c)}f.data.preventDefault()},a)}function V(a){var b,c;function d(e){var d="rtl"==k.lang.dir,i=o.width,D=o.height,E=i+(e.data.$.screenX-b)*(d?-1:1)*(a._.moved?1:2),n=D+(e.data.$.screenY-c)*(a._.moved?1:2),x=a._.element.getFirst(),x=d&&x.getComputedStyle("right"),y=a.getPosition();y.y+n>h.height&&(n=h.height-y.y);if((d?x:y.x)+E>h.width)E=h.width-(d?x:y.x);if(f==CKEDITOR.DIALOG_RESIZE_WIDTH||f==CKEDITOR.DIALOG_RESIZE_BOTH)i=Math.max(g.minWidth||
    +0,E-m);if(f==CKEDITOR.DIALOG_RESIZE_HEIGHT||f==CKEDITOR.DIALOG_RESIZE_BOTH)D=Math.max(g.minHeight||0,n-j);a.resize(i,D);a._.moved||a.layout();e.data.preventDefault()}function e(){CKEDITOR.document.removeListener("mouseup",e);CKEDITOR.document.removeListener("mousemove",d);i&&(i.remove(),i=null);if(CKEDITOR.env.ie6Compat){var a=r.getChild(0).getFrameDocument();a.removeListener("mouseup",e);a.removeListener("mousemove",d)}}var g=a.definition,f=g.resizable;if(f!=CKEDITOR.DIALOG_RESIZE_NONE){var k=a.getParentEditor(),
    +m,j,h,o,i,n=CKEDITOR.tools.addFunction(function(f){o=a.getSize();var g=a.parts.contents;g.$.getElementsByTagName("iframe").length&&(i=CKEDITOR.dom.element.createFromHtml('<div class="cke_dialog_resize_cover" style="height: 100%; position: absolute; width: 100%;"></div>'),g.append(i));j=o.height-a.parts.contents.getSize("height",!(CKEDITOR.env.gecko||CKEDITOR.env.opera||CKEDITOR.env.ie&&CKEDITOR.env.quirks));m=o.width-a.parts.contents.getSize("width",1);b=f.screenX;c=f.screenY;h=CKEDITOR.document.getWindow().getViewPaneSize();
    +CKEDITOR.document.on("mousemove",d);CKEDITOR.document.on("mouseup",e);CKEDITOR.env.ie6Compat&&(g=r.getChild(0).getFrameDocument(),g.on("mousemove",d),g.on("mouseup",e));f.preventDefault&&f.preventDefault()});a.on("load",function(){var b="";f==CKEDITOR.DIALOG_RESIZE_WIDTH?b=" cke_resizer_horizontal":f==CKEDITOR.DIALOG_RESIZE_HEIGHT&&(b=" cke_resizer_vertical");b=CKEDITOR.dom.element.createFromHtml('<div class="cke_resizer'+b+" cke_resizer_"+k.lang.dir+'" title="'+CKEDITOR.tools.htmlEncode(k.lang.common.resize)+
    +'" onmousedown="CKEDITOR.tools.callFunction('+n+', event )">'+("ltr"==k.lang.dir?"鈼":"鈼")+"</div>");a.parts.footer.append(b,1)});k.on("destroy",function(){CKEDITOR.tools.removeFunction(n)})}}function F(a){a.data.preventDefault(1)}function J(a){var b=CKEDITOR.document.getWindow(),c=a.config,d=c.dialog_backgroundCoverColor||"white",e=c.dialog_backgroundCoverOpacity,g=c.baseFloatZIndex,c=CKEDITOR.tools.genKey(d,e,g),f=w[c];f?f.show():(g=['<div tabIndex="-1" style="position: ',CKEDITOR.env.ie6Compat?
    +"absolute":"fixed","; z-index: ",g,"; top: 0px; left: 0px; ",!CKEDITOR.env.ie6Compat?"background-color: "+d:"",'" class="cke_dialog_background_cover">'],CKEDITOR.env.ie6Compat&&(d="<html><body style=\\'background-color:"+d+";\\'></body></html>",g.push('<iframe hidefocus="true" frameborder="0" id="cke_dialog_background_iframe" src="javascript:'),g.push("void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.write( '"+d+"' );document.close();")+"})())"),g.push('" style="position:absolute;left:0;top:0;width:100%;height: 100%;filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0)"></iframe>')),
    +g.push("</div>"),f=CKEDITOR.dom.element.createFromHtml(g.join("")),f.setOpacity(void 0!=e?e:0.5),f.on("keydown",F),f.on("keypress",F),f.on("keyup",F),f.appendTo(CKEDITOR.document.getBody()),w[c]=f);a.focusManager.add(f);r=f;var a=function(){var a=b.getViewPaneSize();f.setStyles({width:a.width+"px",height:a.height+"px"})},k=function(){var a=b.getScrollPosition(),c=CKEDITOR.dialog._.currentTop;f.setStyles({left:a.x+"px",top:a.y+"px"});if(c){do{a=c.getPosition();c.move(a.x,a.y)}while(c=c._.parentDialog)
    +}};G=a;b.on("resize",a);a();(!CKEDITOR.env.mac||!CKEDITOR.env.webkit)&&f.focus();if(CKEDITOR.env.ie6Compat){var m=function(){k();arguments.callee.prevScrollHandler.apply(this,arguments)};b.$.setTimeout(function(){m.prevScrollHandler=window.onscroll||function(){};window.onscroll=m},0);k()}}function K(a){r&&(a.focusManager.remove(r),a=CKEDITOR.document.getWindow(),r.hide(),a.removeListener("resize",G),CKEDITOR.env.ie6Compat&&a.$.setTimeout(function(){window.onscroll=window.onscroll&&window.onscroll.prevScrollHandler||
    +null},0),G=null)}var s=CKEDITOR.tools.cssLength,S='<div class="cke_reset_all {editorId} {editorDialogClass}" dir="{langDir}" lang="{langCode}" role="dialog" aria-labelledby="cke_dialog_title_{id}"><table class="cke_dialog '+CKEDITOR.env.cssClass+' cke_{langDir}" style="position:absolute" role="presentation"><tr><td role="presentation"><div class="cke_dialog_body" role="presentation"><div id="cke_dialog_title_{id}" class="cke_dialog_title" role="presentation"></div><a id="cke_dialog_close_button_{id}" class="cke_dialog_close_button" href="javascript:void(0)" title="{closeTitle}" role="button"><span class="cke_label">X</span></a><div id="cke_dialog_tabs_{id}" class="cke_dialog_tabs" role="tablist"></div><table class="cke_dialog_contents" role="presentation"><tr><td id="cke_dialog_contents_{id}" class="cke_dialog_contents_body" role="presentation"></td></tr><tr><td id="cke_dialog_footer_{id}" class="cke_dialog_footer" role="presentation"></td></tr></table></div></td></tr></table></div>';
    +CKEDITOR.dialog=function(a,b){function c(){var a=l._.focusList;a.sort(function(a,b){return a.tabIndex!=b.tabIndex?b.tabIndex-a.tabIndex:a.focusIndex-b.focusIndex});for(var b=a.length,c=0;c<b;c++)a[c].focusIndex=c}function d(a){var b=l._.focusList,a=a||0;if(!(1>b.length)){var c=l._.currentFocusIndex;try{b[c].getInputElement().$.blur()}catch(f){}for(var d=c=(c+a+b.length)%b.length;a&&!b[d].isFocusable()&&!(d=(d+a+b.length)%b.length,d==c););b[d].focus();"text"==b[d].type&&b[d].select()}}function e(b){if(l==
    +CKEDITOR.dialog._.currentTop){var c=b.data.getKeystroke(),f="rtl"==a.lang.dir;o=i=0;if(9==c||c==CKEDITOR.SHIFT+9)c=c==CKEDITOR.SHIFT+9,l._.tabBarMode?(c=c?p.call(l):u.call(l),l.selectPage(c),l._.tabs[c][0].focus()):d(c?-1:1),o=1;else if(c==CKEDITOR.ALT+121&&!l._.tabBarMode&&1<l.getPageCount())l._.tabBarMode=!0,l._.tabs[l._.currentTabId][0].focus(),o=1;else if((37==c||39==c)&&l._.tabBarMode)c=c==(f?39:37)?p.call(l):u.call(l),l.selectPage(c),l._.tabs[c][0].focus(),o=1;else if((13==c||32==c)&&l._.tabBarMode)this.selectPage(this._.currentTabId),
    +this._.tabBarMode=!1,this._.currentFocusIndex=-1,d(1),o=1;else if(13==c){c=b.data.getTarget();if(!c.is("a","button","select","textarea")&&(!c.is("input")||"button"!=c.$.type))(c=this.getButton("ok"))&&CKEDITOR.tools.setTimeout(c.click,0,c),o=1;i=1}else if(27==c)(c=this.getButton("cancel"))?CKEDITOR.tools.setTimeout(c.click,0,c):!1!==this.fire("cancel",{hide:!0}).hide&&this.hide(),i=1;else return;g(b)}}function g(a){o?a.data.preventDefault(1):i&&a.data.stopPropagation()}var f=CKEDITOR.dialog._.dialogDefinitions[b],
    +k=CKEDITOR.tools.clone(W),m=a.config.dialog_buttonsOrder||"OS",j=a.lang.dir,h={},o,i;("OS"==m&&CKEDITOR.env.mac||"rtl"==m&&"ltr"==j||"ltr"==m&&"rtl"==j)&&k.buttons.reverse();f=CKEDITOR.tools.extend(f(a),k);f=CKEDITOR.tools.clone(f);f=new L(this,f);k=R(a);this._={editor:a,element:k.element,name:b,contentSize:{width:0,height:0},size:{width:0,height:0},contents:{},buttons:{},accessKeyMap:{},tabs:{},tabIdList:[],currentTabId:null,currentTabIndex:null,pageCount:0,lastTab:null,tabBarMode:!1,focusList:[],
    +currentFocusIndex:0,hasFocus:!1};this.parts=k.parts;CKEDITOR.tools.setTimeout(function(){a.fire("ariaWidget",this.parts.contents)},0,this);k={position:CKEDITOR.env.ie6Compat?"absolute":"fixed",top:0,visibility:"hidden"};k["rtl"==j?"right":"left"]=0;this.parts.dialog.setStyles(k);CKEDITOR.event.call(this);this.definition=f=CKEDITOR.fire("dialogDefinition",{name:b,definition:f},a).definition;if(!("removeDialogTabs"in a._)&&a.config.removeDialogTabs){k=a.config.removeDialogTabs.split(";");for(j=0;j<
    +k.length;j++)if(m=k[j].split(":"),2==m.length){var n=m[0];h[n]||(h[n]=[]);h[n].push(m[1])}a._.removeDialogTabs=h}if(a._.removeDialogTabs&&(h=a._.removeDialogTabs[b]))for(j=0;j<h.length;j++)f.removeContents(h[j]);if(f.onLoad)this.on("load",f.onLoad);if(f.onShow)this.on("show",f.onShow);if(f.onHide)this.on("hide",f.onHide);if(f.onOk)this.on("ok",function(b){a.fire("saveSnapshot");setTimeout(function(){a.fire("saveSnapshot")},0);!1===f.onOk.call(this,b)&&(b.data.hide=!1)});if(f.onCancel)this.on("cancel",
    +function(a){!1===f.onCancel.call(this,a)&&(a.data.hide=!1)});var l=this,C=function(a){var b=l._.contents,c=!1,d;for(d in b)for(var f in b[d])if(c=a.call(this,b[d][f]))return};this.on("ok",function(a){C(function(b){if(b.validate){var c=b.validate(this),d="string"==typeof c||!1===c;d&&(a.data.hide=!1,a.stop());P.call(b,!d,"string"==typeof c?c:void 0);return d}})},this,null,0);this.on("cancel",function(b){C(function(c){if(c.isChanged())return confirm(a.lang.common.confirmCancel)||(b.data.hide=!1),!0})},
    +this,null,0);this.parts.close.on("click",function(a){!1!==this.fire("cancel",{hide:!0}).hide&&this.hide();a.data.preventDefault()},this);this.changeFocus=d;var v=this._.element;a.focusManager.add(v,1);this.on("show",function(){v.on("keydown",e,this);if(CKEDITOR.env.opera||CKEDITOR.env.gecko)v.on("keypress",g,this)});this.on("hide",function(){v.removeListener("keydown",e);(CKEDITOR.env.opera||CKEDITOR.env.gecko)&&v.removeListener("keypress",g);C(function(a){Q.apply(a)})});this.on("iframeAdded",function(a){(new CKEDITOR.dom.document(a.data.iframe.$.contentWindow.document)).on("keydown",
    +e,this,null,0)});this.on("show",function(){c();if(a.config.dialog_startupFocusTab&&1<l._.pageCount)l._.tabBarMode=!0,l._.tabs[l._.currentTabId][0].focus();else if(!this._.hasFocus)if(this._.currentFocusIndex=-1,f.onFocus){var b=f.onFocus.call(this);b&&b.focus()}else d(1)},this,null,4294967295);if(CKEDITOR.env.ie6Compat)this.on("load",function(){var a=this.getElement(),b=a.getFirst();b.remove();b.appendTo(a)},this);U(this);V(this);(new CKEDITOR.dom.text(f.title,CKEDITOR.document)).appendTo(this.parts.title);
    +for(j=0;j<f.contents.length;j++)(h=f.contents[j])&&this.addPage(h);this.parts.tabs.on("click",function(a){var b=a.data.getTarget();b.hasClass("cke_dialog_tab")&&(b=b.$.id,this.selectPage(b.substring(4,b.lastIndexOf("_"))),this._.tabBarMode&&(this._.tabBarMode=!1,this._.currentFocusIndex=-1,d(1)),a.data.preventDefault())},this);j=[];h=CKEDITOR.dialog._.uiElementBuilders.hbox.build(this,{type:"hbox",className:"cke_dialog_footer_buttons",widths:[],children:f.buttons},j).getChild();this.parts.footer.setHtml(j.join(""));
    +for(j=0;j<h.length;j++)this._.buttons[h[j].id]=h[j]};CKEDITOR.dialog.prototype={destroy:function(){this.hide();this._.element.remove()},resize:function(){return function(a,b){if(!this._.contentSize||!(this._.contentSize.width==a&&this._.contentSize.height==b))CKEDITOR.dialog.fire("resize",{dialog:this,width:a,height:b},this._.editor),this.fire("resize",{width:a,height:b},this._.editor),this.parts.contents.setStyles({width:a+"px",height:b+"px"}),"rtl"==this._.editor.lang.dir&&this._.position&&(this._.position.x=
    +CKEDITOR.document.getWindow().getViewPaneSize().width-this._.contentSize.width-parseInt(this._.element.getFirst().getStyle("right"),10)),this._.contentSize={width:a,height:b}}}(),getSize:function(){var a=this._.element.getFirst();return{width:a.$.offsetWidth||0,height:a.$.offsetHeight||0}},move:function(a,b,c){var d=this._.element.getFirst(),e="rtl"==this._.editor.lang.dir,g="fixed"==d.getComputedStyle("position");CKEDITOR.env.ie&&d.setStyle("zoom","100%");if(!g||!this._.position||!(this._.position.x==
    +a&&this._.position.y==b))this._.position={x:a,y:b},g||(g=CKEDITOR.document.getWindow().getScrollPosition(),a+=g.x,b+=g.y),e&&(g=this.getSize(),a=CKEDITOR.document.getWindow().getViewPaneSize().width-g.width-a),b={top:(0<b?b:0)+"px"},b[e?"right":"left"]=(0<a?a:0)+"px",d.setStyles(b),c&&(this._.moved=1)},getPosition:function(){return CKEDITOR.tools.extend({},this._.position)},show:function(){var a=this._.element,b=this.definition;!a.getParent()||!a.getParent().equals(CKEDITOR.document.getBody())?a.appendTo(CKEDITOR.document.getBody()):
    +a.setStyle("display","block");if(CKEDITOR.env.gecko&&10900>CKEDITOR.env.version){var c=this.parts.dialog;c.setStyle("position","absolute");setTimeout(function(){c.setStyle("position","fixed")},0)}this.resize(this._.contentSize&&this._.contentSize.width||b.width||b.minWidth,this._.contentSize&&this._.contentSize.height||b.height||b.minHeight);this.reset();this.selectPage(this.definition.contents[0].id);null===CKEDITOR.dialog._.currentZIndex&&(CKEDITOR.dialog._.currentZIndex=this._.editor.config.baseFloatZIndex);
    +this._.element.getFirst().setStyle("z-index",CKEDITOR.dialog._.currentZIndex+=10);null===CKEDITOR.dialog._.currentTop?(CKEDITOR.dialog._.currentTop=this,this._.parentDialog=null,J(this._.editor)):(this._.parentDialog=CKEDITOR.dialog._.currentTop,this._.parentDialog.getElement().getFirst().$.style.zIndex-=Math.floor(this._.editor.config.baseFloatZIndex/2),CKEDITOR.dialog._.currentTop=this);a.on("keydown",M);a.on(CKEDITOR.env.opera?"keypress":"keyup",N);this._.hasFocus=!1;CKEDITOR.tools.setTimeout(function(){this.layout();
    +T(this);this.parts.dialog.setStyle("visibility","");this.fireOnce("load",{});CKEDITOR.ui.fire("ready",this);this.fire("show",{});this._.editor.fire("dialogShow",this);this._.parentDialog||this._.editor.focusManager.lock();this.foreach(function(a){a.setInitValue&&a.setInitValue()})},100,this)},layout:function(){var a=this.parts.dialog,b=this.getSize(),c=CKEDITOR.document.getWindow().getViewPaneSize(),d=(c.width-b.width)/2,e=(c.height-b.height)/2;CKEDITOR.env.ie6Compat||(b.height+(0<e?e:0)>c.height||
    +b.width+(0<d?d:0)>c.width?a.setStyle("position","absolute"):a.setStyle("position","fixed"));this.move(this._.moved?this._.position.x:d,this._.moved?this._.position.y:e)},foreach:function(a){for(var b in this._.contents)for(var c in this._.contents[b])a.call(this,this._.contents[b][c]);return this},reset:function(){var a=function(a){a.reset&&a.reset(1)};return function(){this.foreach(a);return this}}(),setupContent:function(){var a=arguments;this.foreach(function(b){b.setup&&b.setup.apply(b,a)})},
    +commitContent:function(){var a=arguments;this.foreach(function(b){CKEDITOR.env.ie&&this._.currentFocusIndex==b.focusIndex&&b.getInputElement().$.blur();b.commit&&b.commit.apply(b,a)})},hide:function(){if(this.parts.dialog.isVisible()){this.fire("hide",{});this._.editor.fire("dialogHide",this);this.selectPage(this._.tabIdList[0]);var a=this._.element;a.setStyle("display","none");this.parts.dialog.setStyle("visibility","hidden");for(X(this);CKEDITOR.dialog._.currentTop!=this;)CKEDITOR.dialog._.currentTop.hide();
    +if(this._.parentDialog){var b=this._.parentDialog.getElement().getFirst();b.setStyle("z-index",parseInt(b.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2))}else K(this._.editor);if(CKEDITOR.dialog._.currentTop=this._.parentDialog)CKEDITOR.dialog._.currentZIndex-=10;else{CKEDITOR.dialog._.currentZIndex=null;a.removeListener("keydown",M);a.removeListener(CKEDITOR.env.opera?"keypress":"keyup",N);var c=this._.editor;c.focus();setTimeout(function(){c.focusManager.unlock()},0)}delete this._.parentDialog;
    +this.foreach(function(a){a.resetInitValue&&a.resetInitValue()})}},addPage:function(a){if(!a.requiredContent||this._.editor.filter.check(a.requiredContent)){for(var b=[],c=a.label?' title="'+CKEDITOR.tools.htmlEncode(a.label)+'"':"",d=CKEDITOR.dialog._.uiElementBuilders.vbox.build(this,{type:"vbox",className:"cke_dialog_page_contents",children:a.elements,expand:!!a.expand,padding:a.padding,style:a.style||"width: 100%;"},b),e=this._.contents[a.id]={},g=d.getChild(),f=0;d=g.shift();)!d.notAllowed&&("hbox"!=
    +d.type&&"vbox"!=d.type)&&f++,e[d.id]=d,"function"==typeof d.getChild&&g.push.apply(g,d.getChild());f||(a.hidden=!0);b=CKEDITOR.dom.element.createFromHtml(b.join(""));b.setAttribute("role","tabpanel");d=CKEDITOR.env;e="cke_"+a.id+"_"+CKEDITOR.tools.getNextNumber();c=CKEDITOR.dom.element.createFromHtml(['<a class="cke_dialog_tab"',0<this._.pageCount?" cke_last":"cke_first",c,a.hidden?' style="display:none"':"",' id="',e,'"',d.gecko&&10900<=d.version&&!d.hc?"":' href="javascript:void(0)"',' tabIndex="-1" hidefocus="true" role="tab">',
    +a.label,"</a>"].join(""));b.setAttribute("aria-labelledby",e);this._.tabs[a.id]=[c,b];this._.tabIdList.push(a.id);!a.hidden&&this._.pageCount++;this._.lastTab=c;this.updateStyle();b.setAttribute("name",a.id);b.appendTo(this.parts.contents);c.unselectable();this.parts.tabs.append(c);a.accessKey&&(O(this,this,"CTRL+"+a.accessKey,Y,Z),this._.accessKeyMap["CTRL+"+a.accessKey]=a.id)}},selectPage:function(a){if(this._.currentTabId!=a&&!0!==this.fire("selectPage",{page:a,currentPage:this._.currentTabId})){for(var b in this._.tabs){var c=
    +this._.tabs[b][0],d=this._.tabs[b][1];b!=a&&(c.removeClass("cke_dialog_tab_selected"),d.hide());d.setAttribute("aria-hidden",b!=a)}var e=this._.tabs[a];e[0].addClass("cke_dialog_tab_selected");CKEDITOR.env.ie6Compat||CKEDITOR.env.ie7Compat?(q(e[1]),e[1].show(),setTimeout(function(){q(e[1],1)},0)):e[1].show();this._.currentTabId=a;this._.currentTabIndex=CKEDITOR.tools.indexOf(this._.tabIdList,a)}},updateStyle:function(){this.parts.dialog[(1===this._.pageCount?"add":"remove")+"Class"]("cke_single_page")},
    +hidePage:function(a){var b=this._.tabs[a]&&this._.tabs[a][0];b&&(1!=this._.pageCount&&b.isVisible())&&(a==this._.currentTabId&&this.selectPage(p.call(this)),b.hide(),this._.pageCount--,this.updateStyle())},showPage:function(a){if(a=this._.tabs[a]&&this._.tabs[a][0])a.show(),this._.pageCount++,this.updateStyle()},getElement:function(){return this._.element},getName:function(){return this._.name},getContentElement:function(a,b){var c=this._.contents[a];return c&&c[b]},getValueOf:function(a,b){return this.getContentElement(a,
    +b).getValue()},setValueOf:function(a,b,c){return this.getContentElement(a,b).setValue(c)},getButton:function(a){return this._.buttons[a]},click:function(a){return this._.buttons[a].click()},disableButton:function(a){return this._.buttons[a].disable()},enableButton:function(a){return this._.buttons[a].enable()},getPageCount:function(){return this._.pageCount},getParentEditor:function(){return this._.editor},getSelectedElement:function(){return this.getParentEditor().getSelection().getSelectedElement()},
    +addFocusable:function(a,b){if("undefined"==typeof b)b=this._.focusList.length,this._.focusList.push(new H(this,a,b));else{this._.focusList.splice(b,0,new H(this,a,b));for(var c=b+1;c<this._.focusList.length;c++)this._.focusList[c].focusIndex++}}};CKEDITOR.tools.extend(CKEDITOR.dialog,{add:function(a,b){if(!this._.dialogDefinitions[a]||"function"==typeof b)this._.dialogDefinitions[a]=b},exists:function(a){return!!this._.dialogDefinitions[a]},getCurrent:function(){return CKEDITOR.dialog._.currentTop},
    +isTabEnabled:function(a,b,c){a=a.config.removeDialogTabs;return!(a&&a.match(RegExp("(?:^|;)"+b+":"+c+"(?:$|;)","i")))},okButton:function(){var a=function(a,c){c=c||{};return CKEDITOR.tools.extend({id:"ok",type:"button",label:a.lang.common.ok,"class":"cke_dialog_ui_button_ok",onClick:function(a){a=a.data.dialog;!1!==a.fire("ok",{hide:!0}).hide&&a.hide()}},c,!0)};a.type="button";a.override=function(b){return CKEDITOR.tools.extend(function(c){return a(c,b)},{type:"button"},!0)};return a}(),cancelButton:function(){var a=
    +function(a,c){c=c||{};return CKEDITOR.tools.extend({id:"cancel",type:"button",label:a.lang.common.cancel,"class":"cke_dialog_ui_button_cancel",onClick:function(a){a=a.data.dialog;!1!==a.fire("cancel",{hide:!0}).hide&&a.hide()}},c,!0)};a.type="button";a.override=function(b){return CKEDITOR.tools.extend(function(c){return a(c,b)},{type:"button"},!0)};return a}(),addUIElement:function(a,b){this._.uiElementBuilders[a]=b}});CKEDITOR.dialog._={uiElementBuilders:{},dialogDefinitions:{},currentTop:null,currentZIndex:null};
    +CKEDITOR.event.implementOn(CKEDITOR.dialog);CKEDITOR.event.implementOn(CKEDITOR.dialog.prototype);var W={resizable:CKEDITOR.DIALOG_RESIZE_BOTH,minWidth:600,minHeight:400,buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton]},z=function(a,b,c){for(var d=0,e;e=a[d];d++)if(e.id==b||c&&e[c]&&(e=z(e[c],b,c)))return e;return null},A=function(a,b,c,d,e){if(c){for(var g=0,f;f=a[g];g++){if(f.id==c)return a.splice(g,0,b),b;if(d&&f[d]&&(f=A(f[d],b,c,d,!0)))return f}if(e)return null}a.push(b);return b},
    +B=function(a,b,c){for(var d=0,e;e=a[d];d++){if(e.id==b)return a.splice(d,1);if(c&&e[c]&&(e=B(e[c],b,c)))return e}return null},L=function(a,b){this.dialog=a;for(var c=b.contents,d=0,e;e=c[d];d++)c[d]=e&&new I(a,e);CKEDITOR.tools.extend(this,b)};L.prototype={getContents:function(a){return z(this.contents,a)},getButton:function(a){return z(this.buttons,a)},addContents:function(a,b){return A(this.contents,a,b)},addButton:function(a,b){return A(this.buttons,a,b)},removeContents:function(a){B(this.contents,
    +a)},removeButton:function(a){B(this.buttons,a)}};I.prototype={get:function(a){return z(this.elements,a,"children")},add:function(a,b){return A(this.elements,a,b,"children")},remove:function(a){B(this.elements,a,"children")}};var G,w={},r,t={},M=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=a.data.$.altKey,d=a.data.$.shiftKey,e=String.fromCharCode(a.data.$.keyCode);if((b=t[(b?"CTRL+":"")+(c?"ALT+":"")+(d?"SHIFT+":"")+e])&&b.length)b=b[b.length-1],b.keydown&&b.keydown.call(b.uiElement,b.dialog,
    +b.key),a.data.preventDefault()},N=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=a.data.$.altKey,d=a.data.$.shiftKey,e=String.fromCharCode(a.data.$.keyCode);if((b=t[(b?"CTRL+":"")+(c?"ALT+":"")+(d?"SHIFT+":"")+e])&&b.length)b=b[b.length-1],b.keyup&&(b.keyup.call(b.uiElement,b.dialog,b.key),a.data.preventDefault())},O=function(a,b,c,d,e){(t[c]||(t[c]=[])).push({uiElement:a,dialog:b,key:c,keyup:e||a.accessKeyUp,keydown:d||a.accessKeyDown})},X=function(a){for(var b in t){for(var c=t[b],d=c.length-
    +1;0<=d;d--)(c[d].dialog==a||c[d].uiElement==a)&&c.splice(d,1);0===c.length&&delete t[b]}},Z=function(a,b){a._.accessKeyMap[b]&&a.selectPage(a._.accessKeyMap[b])},Y=function(){};(function(){CKEDITOR.ui.dialog={uiElement:function(a,b,c,d,e,g,f){if(!(4>arguments.length)){var k=(d.call?d(b):d)||"div",m=["<",k," "],j=(e&&e.call?e(b):e)||{},h=(g&&g.call?g(b):g)||{},o=(f&&f.call?f.call(this,a,b):f)||"",i=this.domId=h.id||CKEDITOR.tools.getNextId()+"_uiElement";this.id=b.id;b.requiredContent&&!a.getParentEditor().filter.check(b.requiredContent)&&
    +(j.display="none",this.notAllowed=!0);h.id=i;var n={};b.type&&(n["cke_dialog_ui_"+b.type]=1);b.className&&(n[b.className]=1);b.disabled&&(n.cke_disabled=1);for(var l=h["class"]&&h["class"].split?h["class"].split(" "):[],i=0;i<l.length;i++)l[i]&&(n[l[i]]=1);l=[];for(i in n)l.push(i);h["class"]=l.join(" ");b.title&&(h.title=b.title);n=(b.style||"").split(";");b.align&&(l=b.align,j["margin-left"]="left"==l?0:"auto",j["margin-right"]="right"==l?0:"auto");for(i in j)n.push(i+":"+j[i]);b.hidden&&n.push("display:none");
    +for(i=n.length-1;0<=i;i--)""===n[i]&&n.splice(i,1);0<n.length&&(h.style=(h.style?h.style+"; ":"")+n.join("; "));for(i in h)m.push(i+'="'+CKEDITOR.tools.htmlEncode(h[i])+'" ');m.push(">",o,"</",k,">");c.push(m.join(""));(this._||(this._={})).dialog=a;"boolean"==typeof b.isChanged&&(this.isChanged=function(){return b.isChanged});"function"==typeof b.isChanged&&(this.isChanged=b.isChanged);"function"==typeof b.setValue&&(this.setValue=CKEDITOR.tools.override(this.setValue,function(a){return function(c){a.call(this,
    +b.setValue.call(this,c))}}));"function"==typeof b.getValue&&(this.getValue=CKEDITOR.tools.override(this.getValue,function(a){return function(){return b.getValue.call(this,a.call(this))}}));CKEDITOR.event.implementOn(this);this.registerEvents(b);this.accessKeyUp&&(this.accessKeyDown&&b.accessKey)&&O(this,a,"CTRL+"+b.accessKey);var p=this;a.on("load",function(){var b=p.getInputElement();if(b){var c=p.type in{checkbox:1,ratio:1}&&CKEDITOR.env.ie&&CKEDITOR.env.version<8?"cke_dialog_ui_focused":"";b.on("focus",
    +function(){a._.tabBarMode=false;a._.hasFocus=true;p.fire("focus");c&&this.addClass(c)});b.on("blur",function(){p.fire("blur");c&&this.removeClass(c)})}});this.keyboardFocusable&&(this.tabIndex=b.tabIndex||0,this.focusIndex=a._.focusList.push(this)-1,this.on("focus",function(){a._.currentFocusIndex=p.focusIndex}));CKEDITOR.tools.extend(this,b)}},hbox:function(a,b,c,d,e){if(!(4>arguments.length)){this._||(this._={});var g=this._.children=b,f=e&&e.widths||null,k=e&&e.height||null,m,j={role:"presentation"};
    +e&&e.align&&(j.align=e.align);CKEDITOR.ui.dialog.uiElement.call(this,a,e||{type:"hbox"},d,"table",{},j,function(){var a=['<tbody><tr class="cke_dialog_ui_hbox">'];for(m=0;m<c.length;m++){var b="cke_dialog_ui_hbox_child",d=[];0===m&&(b="cke_dialog_ui_hbox_first");m==c.length-1&&(b="cke_dialog_ui_hbox_last");a.push('<td class="',b,'" role="presentation" ');f?f[m]&&d.push("width:"+s(f[m])):d.push("width:"+Math.floor(100/c.length)+"%");k&&d.push("height:"+s(k));e&&void 0!=e.padding&&d.push("padding:"+
    +s(e.padding));CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&g[m].align)&&d.push("text-align:"+g[m].align);0<d.length&&a.push('style="'+d.join("; ")+'" ');a.push(">",c[m],"</td>")}a.push("</tr></tbody>");return a.join("")})}},vbox:function(a,b,c,d,e){if(!(3>arguments.length)){this._||(this._={});var g=this._.children=b,f=e&&e.width||null,k=e&&e.heights||null;CKEDITOR.ui.dialog.uiElement.call(this,a,e||{type:"vbox"},d,"div",null,{role:"presentation"},function(){var b=['<table role="presentation" cellspacing="0" border="0" '];
    +b.push('style="');e&&e.expand&&b.push("height:100%;");b.push("width:"+s(f||"100%"),";");CKEDITOR.env.webkit&&b.push("float:none;");b.push('"');b.push('align="',CKEDITOR.tools.htmlEncode(e&&e.align||("ltr"==a.getParentEditor().lang.dir?"left":"right")),'" ');b.push("><tbody>");for(var d=0;d<c.length;d++){var h=[];b.push('<tr><td role="presentation" ');f&&h.push("width:"+s(f||"100%"));k?h.push("height:"+s(k[d])):e&&e.expand&&h.push("height:"+Math.floor(100/c.length)+"%");e&&void 0!=e.padding&&h.push("padding:"+
    +s(e.padding));CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&g[d].align)&&h.push("text-align:"+g[d].align);0<h.length&&b.push('style="',h.join("; "),'" ');b.push(' class="cke_dialog_ui_vbox_child">',c[d],"</td></tr>")}b.push("</tbody></table>");return b.join("")})}}}})();CKEDITOR.ui.dialog.uiElement.prototype={getElement:function(){return CKEDITOR.document.getById(this.domId)},getInputElement:function(){return this.getElement()},getDialog:function(){return this._.dialog},setValue:function(a,b){this.getInputElement().setValue(a);
    +!b&&this.fire("change",{value:a});return this},getValue:function(){return this.getInputElement().getValue()},isChanged:function(){return!1},selectParentTab:function(){for(var a=this.getInputElement();(a=a.getParent())&&-1==a.$.className.search("cke_dialog_page_contents"););if(!a)return this;a=a.getAttribute("name");this._.dialog._.currentTabId!=a&&this._.dialog.selectPage(a);return this},focus:function(){this.selectParentTab().getInputElement().focus();return this},registerEvents:function(a){var b=
    +/^on([A-Z]\w+)/,c,d=function(a,b,c,d){b.on("load",function(){a.getInputElement().on(c,d,a)})},e;for(e in a)if(c=e.match(b))this.eventProcessors[e]?this.eventProcessors[e].call(this,this._.dialog,a[e]):d(this,this._.dialog,c[1].toLowerCase(),a[e]);return this},eventProcessors:{onLoad:function(a,b){a.on("load",b,this)},onShow:function(a,b){a.on("show",b,this)},onHide:function(a,b){a.on("hide",b,this)}},accessKeyDown:function(){this.focus()},accessKeyUp:function(){},disable:function(){var a=this.getElement();
    +this.getInputElement().setAttribute("disabled","true");a.addClass("cke_disabled")},enable:function(){var a=this.getElement();this.getInputElement().removeAttribute("disabled");a.removeClass("cke_disabled")},isEnabled:function(){return!this.getElement().hasClass("cke_disabled")},isVisible:function(){return this.getInputElement().isVisible()},isFocusable:function(){return!this.isEnabled()||!this.isVisible()?!1:!0}};CKEDITOR.ui.dialog.hbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,
    +{getChild:function(a){if(1>arguments.length)return this._.children.concat();a.splice||(a=[a]);return 2>a.length?this._.children[a[0]]:this._.children[a[0]]&&this._.children[a[0]].getChild?this._.children[a[0]].getChild(a.slice(1,a.length)):null}},!0);CKEDITOR.ui.dialog.vbox.prototype=new CKEDITOR.ui.dialog.hbox;(function(){var a={build:function(a,c,d){for(var e=c.children,g,f=[],k=[],m=0;m<e.length&&(g=e[m]);m++){var j=[];f.push(j);k.push(CKEDITOR.dialog._.uiElementBuilders[g.type].build(a,g,j))}return new CKEDITOR.ui.dialog[c.type](a,
    +k,f,d,c)}};CKEDITOR.dialog.addUIElement("hbox",a);CKEDITOR.dialog.addUIElement("vbox",a)})();CKEDITOR.dialogCommand=function(a,b){this.dialogName=a;CKEDITOR.tools.extend(this,b,!0)};CKEDITOR.dialogCommand.prototype={exec:function(a){CKEDITOR.env.opera?CKEDITOR.tools.setTimeout(function(){a.openDialog(this.dialogName)},0,this):a.openDialog(this.dialogName)},canUndo:!1,editorFocus:1};(function(){var a=/^([a]|[^a])+$/,b=/^\d*$/,c=/^\d*(?:\.\d+)?$/,d=/^(((\d*(\.\d+))|(\d*))(px|\%)?)?$/,e=/^(((\d*(\.\d+))|(\d*))(px|em|ex|in|cm|mm|pt|pc|\%)?)?$/i,
    +g=/^(\s*[\w-]+\s*:\s*[^:;]+(?:;|$))*$/;CKEDITOR.VALIDATE_OR=1;CKEDITOR.VALIDATE_AND=2;CKEDITOR.dialog.validate={functions:function(){var a=arguments;return function(){var b=this&&this.getValue?this.getValue():a[0],c=void 0,d=CKEDITOR.VALIDATE_AND,e=[],g;for(g=0;g<a.length;g++)if("function"==typeof a[g])e.push(a[g]);else break;g<a.length&&"string"==typeof a[g]&&(c=a[g],g++);g<a.length&&"number"==typeof a[g]&&(d=a[g]);var i=d==CKEDITOR.VALIDATE_AND?!0:!1;for(g=0;g<e.length;g++)i=d==CKEDITOR.VALIDATE_AND?
    +i&&e[g](b):i||e[g](b);return!i?c:!0}},regex:function(a,b){return function(c){c=this&&this.getValue?this.getValue():c;return!a.test(c)?b:!0}},notEmpty:function(b){return this.regex(a,b)},integer:function(a){return this.regex(b,a)},number:function(a){return this.regex(c,a)},cssLength:function(a){return this.functions(function(a){return e.test(CKEDITOR.tools.trim(a))},a)},htmlLength:function(a){return this.functions(function(a){return d.test(CKEDITOR.tools.trim(a))},a)},inlineStyle:function(a){return this.functions(function(a){return g.test(CKEDITOR.tools.trim(a))},
    +a)},equals:function(a,b){return this.functions(function(b){return b==a},b)},notEqual:function(a,b){return this.functions(function(b){return b!=a},b)}};CKEDITOR.on("instanceDestroyed",function(a){if(CKEDITOR.tools.isEmpty(CKEDITOR.instances)){for(var b;b=CKEDITOR.dialog._.currentTop;)b.hide();for(var c in w)w[c].remove();w={}}var a=a.editor._.storedDialogs,d;for(d in a)a[d].destroy()})})();CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{openDialog:function(a,b){var c=null,d=CKEDITOR.dialog._.dialogDefinitions[a];
    +null===CKEDITOR.dialog._.currentTop&&J(this);if("function"==typeof d)c=this._.storedDialogs||(this._.storedDialogs={}),c=c[a]||(c[a]=new CKEDITOR.dialog(this,a)),b&&b.call(c,c),c.show();else{if("failed"==d)throw K(this),Error('[CKEDITOR.dialog.openDialog] Dialog "'+a+'" failed when loading definition.');"string"==typeof d&&CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(d),function(){"function"!=typeof CKEDITOR.dialog._.dialogDefinitions[a]&&(CKEDITOR.dialog._.dialogDefinitions[a]="failed");this.openDialog(a,
    +b)},this,0,1)}CKEDITOR.skin.loadPart("dialog");return c}})})();CKEDITOR.plugins.add("dialog",{requires:"dialogui",init:function(p){p.on("contentDom",function(){var u=p.editable();u.attachListener(u,"dblclick",function(q){if(p.readOnly)return!1;q={element:q.data.getTarget()};p.fire("doubleclick",q);q.dialog&&p.openDialog(q.dialog);return 1})})}});CKEDITOR.plugins.add("about",{requires:"dialog",init:function(a){var b=a.addCommand("about",new CKEDITOR.dialogCommand("about"));b.modes={wysiwyg:1,source:1};b.canUndo=!1;b.readOnly=1;a.ui.addButton&&a.ui.addButton("About",{label:a.lang.about.title,command:"about",toolbar:"about"});CKEDITOR.dialog.add("about",this.path+"dialogs/about.js")}});(function(){CKEDITOR.plugins.add("a11yhelp",{requires:"dialog",availableLangs:{ar:1,bg:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,en:1,eo:1,es:1,et:1,fa:1,fi:1,fr:1,"fr-ca":1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,id:1,it:1,ja:1,km:1,ku:1,lt:1,lv:1,mk:1,mn:1,nb:1,nl:1,no:1,pl:1,pt:1,"pt-br":1,ro:1,ru:1,si:1,sk:1,sl:1,sq:1,sr:1,"sr-latn":1,sv:1,th:1,tr:1,ug:1,uk:1,vi:1,"zh-cn":1},init:function(b){var c=this;b.addCommand("a11yHelp",{exec:function(){var a=b.langCode,a=c.availableLangs[a]?a:c.availableLangs[a.replace(/-.*/,
    +"")]?a.replace(/-.*/,""):"en";CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(c.path+"dialogs/lang/"+a+".js"),function(){b.lang.a11yhelp=c.langEntries[a];b.openDialog("a11yHelp")})},modes:{wysiwyg:1,source:1},readOnly:1,canUndo:!1});b.setKeystroke(CKEDITOR.ALT+48,"a11yHelp");CKEDITOR.dialog.add("a11yHelp",this.path+"dialogs/a11yhelp.js")}})})();(function(){function f(c){var a=this.att,c=c&&c.hasAttribute(a)&&c.getAttribute(a)||"";void 0!==c&&this.setValue(c)}function g(){for(var c,a=0;a<arguments.length;a++)if(arguments[a]instanceof CKEDITOR.dom.element){c=arguments[a];break}if(c){var a=this.att,b=this.getValue();b?c.setAttribute(a,b):c.removeAttribute(a,b)}}var i={id:1,dir:1,classes:1,styles:1};CKEDITOR.plugins.add("dialogadvtab",{requires:"dialog",allowedContent:function(c){c||(c=i);var a=[];c.id&&a.push("id");c.dir&&a.push("dir");var b=
    +"";a.length&&(b+="["+a.join(",")+"]");c.classes&&(b+="(*)");c.styles&&(b+="{*}");return b},createAdvancedTab:function(c,a,b){a||(a=i);var d=c.lang.common,h={id:"advanced",label:d.advancedTab,title:d.advancedTab,elements:[{type:"vbox",padding:1,children:[]}]},e=[];if(a.id||a.dir)a.id&&e.push({id:"advId",att:"id",type:"text",requiredContent:b?b+"[id]":null,label:d.id,setup:f,commit:g}),a.dir&&e.push({id:"advLangDir",att:"dir",type:"select",requiredContent:b?b+"[dir]":null,label:d.langDir,"default":"",
    +style:"width:100%",items:[[d.notSet,""],[d.langDirLTR,"ltr"],[d.langDirRTL,"rtl"]],setup:f,commit:g}),h.elements[0].children.push({type:"hbox",widths:["50%","50%"],children:[].concat(e)});if(a.styles||a.classes)e=[],a.styles&&e.push({id:"advStyles",att:"style",type:"text",requiredContent:b?b+"{cke-xyz}":null,label:d.styles,"default":"",validate:CKEDITOR.dialog.validate.inlineStyle(d.invalidInlineStyle),onChange:function(){},getStyle:function(a,c){var b=this.getValue().match(RegExp("(?:^|;)\\s*"+a+
    +"\\s*:\\s*([^;]*)","i"));return b?b[1]:c},updateStyle:function(a,b){var d=this.getValue(),e=c.document.createElement("span");e.setAttribute("style",d);e.setStyle(a,b);d=CKEDITOR.tools.normalizeCssText(e.getAttribute("style"));this.setValue(d,1)},setup:f,commit:g}),a.classes&&e.push({type:"hbox",widths:["45%","55%"],children:[{id:"advCSSClasses",att:"class",type:"text",requiredContent:b?b+"(cke-xyz)":null,label:d.cssClasses,"default":"",setup:f,commit:g}]}),h.elements[0].children.push({type:"hbox",
    +widths:["50%","50%"],children:[].concat(e)});return h}})})();CKEDITOR.plugins.add("basicstyles",{init:function(c){var e=0,d=function(g,d,b,a){if(a){var a=new CKEDITOR.style(a),f=h[b];f.unshift(a);c.attachStyleStateChange(a,function(a){!c.readOnly&&c.getCommand(b).setState(a)});c.addCommand(b,new CKEDITOR.styleCommand(a,{contentForms:f}));c.ui.addButton&&c.ui.addButton(g,{label:d,command:b,toolbar:"basicstyles,"+(e+=10)})}},h={bold:["strong","b",["span",function(a){a=a.styles["font-weight"];return"bold"==a||700<=+a}]],italic:["em","i",["span",function(a){return"italic"==
    +a.styles["font-style"]}]],underline:["u",["span",function(a){return"underline"==a.styles["text-decoration"]}]],strike:["s","strike",["span",function(a){return"line-through"==a.styles["text-decoration"]}]],subscript:["sub"],superscript:["sup"]},b=c.config,a=c.lang.basicstyles;d("Bold",a.bold,"bold",b.coreStyles_bold);d("Italic",a.italic,"italic",b.coreStyles_italic);d("Underline",a.underline,"underline",b.coreStyles_underline);d("Strike",a.strike,"strike",b.coreStyles_strike);d("Subscript",a.subscript,
    +"subscript",b.coreStyles_subscript);d("Superscript",a.superscript,"superscript",b.coreStyles_superscript);c.setKeystroke([[CKEDITOR.CTRL+66,"bold"],[CKEDITOR.CTRL+73,"italic"],[CKEDITOR.CTRL+85,"underline"]])}});CKEDITOR.config.coreStyles_bold={element:"strong",overrides:"b"};CKEDITOR.config.coreStyles_italic={element:"em",overrides:"i"};CKEDITOR.config.coreStyles_underline={element:"u"};CKEDITOR.config.coreStyles_strike={element:"s",overrides:"strike"};CKEDITOR.config.coreStyles_subscript={element:"sub"};
    +CKEDITOR.config.coreStyles_superscript={element:"sup"};(function(){function n(a,f,d,b){if(!a.isReadOnly()&&!a.equals(d.editable())){CKEDITOR.dom.element.setMarker(b,a,"bidi_processed",1);for(var b=a,c=d.editable();(b=b.getParent())&&!b.equals(c);)if(b.getCustomData("bidi_processed")){a.removeStyle("direction");a.removeAttribute("dir");return}b="useComputedState"in d.config?d.config.useComputedState:1;if((b?a.getComputedStyle("direction"):a.getStyle("direction")||a.hasAttribute("dir"))!=f)a.removeStyle("direction"),b?(a.removeAttribute("dir"),f!=a.getComputedStyle("direction")&&
    +a.setAttribute("dir",f)):a.setAttribute("dir",f),d.forceNextSelectionCheck()}}function r(a,f,d){var b=a.getCommonAncestor(!1,!0),a=a.clone();a.enlarge(d==CKEDITOR.ENTER_BR?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS);if(a.checkBoundaryOfElement(b,CKEDITOR.START)&&a.checkBoundaryOfElement(b,CKEDITOR.END)){for(var c;b&&b.type==CKEDITOR.NODE_ELEMENT&&(c=b.getParent())&&1==c.getChildCount()&&!(b.getName()in f);)b=c;return b.type==CKEDITOR.NODE_ELEMENT&&b.getName()in f&&b}}function m(a){return{context:"p",
    +allowedContent:{"h1 h2 h3 h4 h5 h6 table ul ol blockquote div tr p div li td":{propertiesOnly:!0,attributes:"dir"}},requiredContent:"p[dir]",refresh:function(a,d){var b=a.config.useComputedState,c,b=void 0===b||b;if(!b){c=d.lastElement;for(var h=a.editable();c&&!(c.getName()in q||c.equals(h));){var e=c.getParent();if(!e)break;c=e}}c=c||d.block||d.blockLimit;c.equals(a.editable())&&(h=a.getSelection().getRanges()[0].getEnclosedNode())&&h.type==CKEDITOR.NODE_ELEMENT&&(c=h);c&&(b=b?c.getComputedStyle("direction"):
    +c.getStyle("direction")||c.getAttribute("dir"),a.getCommand("bidirtl").setState("rtl"==b?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF),a.getCommand("bidiltr").setState("ltr"==b?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF));b=(d.block||d.blockLimit||a.editable()).getDirection(1);if(b!=(a._.selDir||a.lang.dir))a._.selDir=b,a.fire("contentDirChanged",b)},exec:function(f){var d=f.getSelection(),b=f.config.enterMode,c=d.getRanges();if(c&&c.length){for(var h={},e=d.createBookmarks(),c=c.createIterator(),g,
    +j=0;g=c.getNextRange(1);){var i=g.getEnclosedNode();if(!i||i&&!(i.type==CKEDITOR.NODE_ELEMENT&&i.getName()in o))i=r(g,p,b);i&&n(i,a,f,h);var k=new CKEDITOR.dom.walker(g),l=e[j].startNode,m=e[j++].endNode;k.evaluator=function(a){return!!(a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in p&&!(a.getName()==(b==CKEDITOR.ENTER_P?"p":"div")&&a.getParent().type==CKEDITOR.NODE_ELEMENT&&"blockquote"==a.getParent().getName())&&a.getPosition(l)&CKEDITOR.POSITION_FOLLOWING&&(a.getPosition(m)&CKEDITOR.POSITION_PRECEDING+
    +CKEDITOR.POSITION_CONTAINS)==CKEDITOR.POSITION_PRECEDING)};for(;i=k.next();)n(i,a,f,h);g=g.createIterator();for(g.enlargeBr=b!=CKEDITOR.ENTER_BR;i=g.getNextParagraph(b==CKEDITOR.ENTER_P?"p":"div");)n(i,a,f,h)}CKEDITOR.dom.element.clearAllMarkers(h);f.forceNextSelectionCheck();d.selectBookmarks(e);f.focus()}}}}function s(a){var f=a==j.setAttribute,d=a==j.removeAttribute,b=/\bdirection\s*:\s*(.*?)\s*(:?$|;)/;return function(c,h){if(!this.isReadOnly()){var e;if(e=c==(f||d?"dir":"direction")||"style"==
    +c&&(d||b.test(h))){a:{e=this;for(var g=e.getDocument().getBody().getParent();e;){if(e.equals(g)){e=!1;break a}e=e.getParent()}e=!0}e=!e}if(e&&(e=this.getDirection(1),g=a.apply(this,arguments),e!=this.getDirection(1)))return this.getDocument().fire("dirChanged",this),g}return a.apply(this,arguments)}}var p={table:1,ul:1,ol:1,blockquote:1,div:1},o={},q={};CKEDITOR.tools.extend(o,p,{tr:1,p:1,div:1,li:1});CKEDITOR.tools.extend(q,o,{td:1});CKEDITOR.plugins.add("bidi",{init:function(a){function f(b,c,d,
    +e,f){a.addCommand(d,new CKEDITOR.command(a,e));a.ui.addButton&&a.ui.addButton(b,{label:c,command:d,toolbar:"bidi,"+f})}if(!a.blockless){var d=a.lang.bidi;a.ui.addToolbarGroup&&a.ui.addToolbarGroup("bidi","align","paragraph");f("BidiLtr",d.ltr,"bidiltr",m("ltr"),10);f("BidiRtl",d.rtl,"bidirtl",m("rtl"),20);a.on("contentDom",function(){a.document.on("dirChanged",function(b){a.fire("dirChanged",{node:b.data,dir:b.data.getDirection(1)})})});a.on("contentDirChanged",function(b){var b=(a.lang.dir!=b.data?
    +"add":"remove")+"Class",c=a.ui.space(a.config.toolbarLocation);if(c)c[b]("cke_mixed_dir_content")})}}});for(var j=CKEDITOR.dom.element.prototype,l=["setStyle","removeStyle","setAttribute","removeAttribute"],k=0;k<l.length;k++)j[l[k]]=CKEDITOR.tools.override(j[l[k]],s)})();(function(){var k={exec:function(g){var a=g.getCommand("blockquote").state,i=g.getSelection(),c=i&&i.getRanges(!0)[0];if(c){var h=i.createBookmarks();if(CKEDITOR.env.ie){var e=h[0].startNode,b=h[0].endNode,d;if(e&&"blockquote"==e.getParent().getName())for(d=e;d=d.getNext();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){e.move(d,!0);break}if(b&&"blockquote"==b.getParent().getName())for(d=b;d=d.getPrevious();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){b.move(d);break}}var f=c.createIterator();
    +f.enlargeBr=g.config.enterMode!=CKEDITOR.ENTER_BR;if(a==CKEDITOR.TRISTATE_OFF){for(e=[];a=f.getNextParagraph();)e.push(a);1>e.length&&(a=g.document.createElement(g.config.enterMode==CKEDITOR.ENTER_P?"p":"div"),b=h.shift(),c.insertNode(a),a.append(new CKEDITOR.dom.text("锘",g.document)),c.moveToBookmark(b),c.selectNodeContents(a),c.collapse(!0),b=c.createBookmark(),e.push(a),h.unshift(b));d=e[0].getParent();c=[];for(b=0;b<e.length;b++)a=e[b],d=d.getCommonAncestor(a.getParent());for(a={table:1,tbody:1,
    +tr:1,ol:1,ul:1};a[d.getName()];)d=d.getParent();for(b=null;0<e.length;){for(a=e.shift();!a.getParent().equals(d);)a=a.getParent();a.equals(b)||c.push(a);b=a}for(;0<c.length;)if(a=c.shift(),"blockquote"==a.getName()){for(b=new CKEDITOR.dom.documentFragment(g.document);a.getFirst();)b.append(a.getFirst().remove()),e.push(b.getLast());b.replace(a)}else e.push(a);c=g.document.createElement("blockquote");for(c.insertBefore(e[0]);0<e.length;)a=e.shift(),c.append(a)}else if(a==CKEDITOR.TRISTATE_ON){b=[];
    +for(d={};a=f.getNextParagraph();){for(e=c=null;a.getParent();){if("blockquote"==a.getParent().getName()){c=a.getParent();e=a;break}a=a.getParent()}c&&(e&&!e.getCustomData("blockquote_moveout"))&&(b.push(e),CKEDITOR.dom.element.setMarker(d,e,"blockquote_moveout",!0))}CKEDITOR.dom.element.clearAllMarkers(d);a=[];e=[];for(d={};0<b.length;)f=b.shift(),c=f.getParent(),f.getPrevious()?f.getNext()?(f.breakParent(f.getParent()),e.push(f.getNext())):f.remove().insertAfter(c):f.remove().insertBefore(c),c.getCustomData("blockquote_processed")||
    +(e.push(c),CKEDITOR.dom.element.setMarker(d,c,"blockquote_processed",!0)),a.push(f);CKEDITOR.dom.element.clearAllMarkers(d);for(b=e.length-1;0<=b;b--){c=e[b];a:{d=c;for(var f=0,k=d.getChildCount(),j=void 0;f<k&&(j=d.getChild(f));f++)if(j.type==CKEDITOR.NODE_ELEMENT&&j.isBlockBoundary()){d=!1;break a}d=!0}d&&c.remove()}if(g.config.enterMode==CKEDITOR.ENTER_BR)for(c=!0;a.length;)if(f=a.shift(),"div"==f.getName()){b=new CKEDITOR.dom.documentFragment(g.document);c&&(f.getPrevious()&&!(f.getPrevious().type==
    +CKEDITOR.NODE_ELEMENT&&f.getPrevious().isBlockBoundary()))&&b.append(g.document.createElement("br"));for(c=f.getNext()&&!(f.getNext().type==CKEDITOR.NODE_ELEMENT&&f.getNext().isBlockBoundary());f.getFirst();)f.getFirst().remove().appendTo(b);c&&b.append(g.document.createElement("br"));b.replace(f);c=!1}}i.selectBookmarks(h);g.focus()}},refresh:function(g,a){this.setState(g.elementPath(a.block||a.blockLimit).contains("blockquote",1)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)},context:"blockquote",
    +allowedContent:"blockquote",requiredContent:"blockquote"};CKEDITOR.plugins.add("blockquote",{init:function(g){g.blockless||(g.addCommand("blockquote",k),g.ui.addButton&&g.ui.addButton("Blockquote",{label:g.lang.blockquote.toolbar,command:"blockquote",toolbar:"blocks,10"}))}})})();(function(){function w(a){function b(){var d=a.editable();d.on(q,function(a){(!CKEDITOR.env.ie||!m)&&u(a)});CKEDITOR.env.ie&&d.on("paste",function(d){r||(f(),d.data.preventDefault(),u(d),k("paste")||a.openDialog("paste"))});CKEDITOR.env.ie&&(d.on("contextmenu",h,null,null,0),d.on("beforepaste",function(a){a.data&&!a.data.$.ctrlKey&&h()},null,null,0));d.on("beforecut",function(){!m&&l(a)});var v;d.attachListener(CKEDITOR.env.ie?d:a.document.getDocumentElement(),"mouseup",function(){v=setTimeout(function(){s()},
    +0)});a.on("destroy",function(){clearTimeout(v)});d.on("keyup",s)}function e(d){return{type:d,canUndo:"cut"==d,startDisabled:!0,exec:function(){"cut"==this.type&&l();var d;var b=this.type;if(CKEDITOR.env.ie)d=k(b);else try{d=a.document.$.execCommand(b,!1,null)}catch(c){d=!1}d||alert(a.lang.clipboard[this.type+"Error"]);return d}}}function c(){return{canUndo:!1,async:!0,exec:function(a,b){var c=function(b,c){b&&g(b.type,b.dataValue,!!c);a.fire("afterCommandExec",{name:"paste",command:e,returnValue:!!b})},
    +e=this;"string"==typeof b?c({type:"auto",dataValue:b},1):a.getClipboardData(c)}}}function f(){r=1;setTimeout(function(){r=0},100)}function h(){m=1;setTimeout(function(){m=0},10)}function k(d){var b=a.document,c=b.getBody(),e=!1,l=function(){e=!0};c.on(d,l);(7<CKEDITOR.env.version?b.$:b.$.selection.createRange()).execCommand(d);c.removeListener(d,l);return e}function g(d,b,c){d={type:d};if(c&&!a.fire("beforePaste",d)||!b)return!1;d.dataValue=b;return a.fire("paste",d)}function l(){if(CKEDITOR.env.ie&&
    +!CKEDITOR.env.quirks){var d=a.getSelection(),b,c,e;if(d.getType()==CKEDITOR.SELECTION_ELEMENT&&(b=d.getSelectedElement()))c=d.getRanges()[0],e=a.document.createText(""),e.insertBefore(b),c.setStartBefore(e),c.setEndAfter(b),d.selectRanges([c]),setTimeout(function(){b.getParent()&&(e.remove(),d.selectElement(b))},0)}}function i(d,b){var c=a.document,e=a.editable(),l=function(a){a.cancel()},i=CKEDITOR.env.gecko&&10902>=CKEDITOR.env.version,f;if(!c.getById("cke_pastebin")){var h=a.getSelection(),o=h.createBookmarks(),
    +j=new CKEDITOR.dom.element((CKEDITOR.env.webkit||e.is("body"))&&!CKEDITOR.env.ie&&!CKEDITOR.env.opera?"body":"div",c);j.setAttribute("id","cke_pastebin");CKEDITOR.env.opera&&j.appendBogus();var g=0,c=c.getWindow();i?(j.insertAfter(o[0].startNode),j.setStyle("display","inline")):(CKEDITOR.env.webkit?(e.append(j),j.addClass("cke_editable"),e.is("body")||(i="static"!=e.getComputedStyle("position")?e:CKEDITOR.dom.element.get(e.$.offsetParent),g=i.getDocumentPosition().y)):e.getAscendant(CKEDITOR.env.ie||
    +CKEDITOR.env.opera?"body":"html",1).append(j),j.setStyles({position:"absolute",top:c.getScrollPosition().y-g+10+"px",width:"1px",height:Math.max(1,c.getViewPaneSize().height-20)+"px",overflow:"hidden",margin:0,padding:0}));(i=j.getParent().isReadOnly())?(j.setOpacity(0),j.setAttribute("contenteditable",!0)):j.setStyle("ltr"==a.config.contentsLangDirection?"left":"right","-1000px");a.on("selectionChange",l,null,null,0);CKEDITOR.env.webkit&&(f=e.once("blur",l,null,null,-100));i&&j.focus();i=new CKEDITOR.dom.range(j);
    +i.selectNodeContents(j);var k=i.select();CKEDITOR.env.ie&&(f=e.once("blur",function(){a.lockSelection(k)}));var m=CKEDITOR.document.getWindow().getScrollPosition().y;setTimeout(function(){if(CKEDITOR.env.webkit||CKEDITOR.env.opera)CKEDITOR.document[CKEDITOR.env.webkit?"getBody":"getDocumentElement"]().$.scrollTop=m;f&&f.removeListener();CKEDITOR.env.ie&&e.focus();h.selectBookmarks(o);j.remove();var d;if(CKEDITOR.env.webkit&&(d=j.getFirst())&&d.is&&d.hasClass("Apple-style-span"))j=d;a.removeListener("selectionChange",
    +l);b(j.getHtml())},0)}}function o(){if(CKEDITOR.env.ie){a.focus();f();var d=a.focusManager;d.lock();if(a.editable().fire(q)&&!k("paste"))return d.unlock(),!1;d.unlock()}else try{if(a.editable().fire(q)&&!a.document.$.execCommand("Paste",!1,null))throw 0;}catch(b){return!1}return!0}function p(d){if("wysiwyg"==a.mode)switch(d.data.keyCode){case CKEDITOR.CTRL+86:case CKEDITOR.SHIFT+45:d=a.editable();f();!CKEDITOR.env.ie&&d.fire("beforepaste");(CKEDITOR.env.opera||CKEDITOR.env.gecko&&10900>CKEDITOR.env.version)&&
    +d.fire("paste");break;case CKEDITOR.CTRL+88:case CKEDITOR.SHIFT+46:a.fire("saveSnapshot"),setTimeout(function(){a.fire("saveSnapshot")},0)}}function u(d){var b={type:"auto"},c=a.fire("beforePaste",b);i(d,function(a){a=a.replace(/<span[^>]+data-cke-bookmark[^<]*?<\/span>/ig,"");c&&g(b.type,a,0,1)})}function s(){if("wysiwyg"==a.mode){var b=n("Paste");a.getCommand("cut").setState(n("Cut"));a.getCommand("copy").setState(n("Copy"));a.getCommand("paste").setState(b);a.fire("pasteState",b)}}function n(b){var c;
    +if(t&&b in{Paste:1,Cut:1})return CKEDITOR.TRISTATE_DISABLED;if("Paste"==b){CKEDITOR.env.ie&&(m=1);try{c=a.document.$.queryCommandEnabled(b)||CKEDITOR.env.webkit}catch(e){}m=0}else b=a.getSelection(),c=b.getRanges(),c=b.getType()!=CKEDITOR.SELECTION_NONE&&!(1==c.length&&c[0].collapsed);return c?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}var m=0,r=0,t=0,q=CKEDITOR.env.ie?"beforepaste":"paste";(function(){a.on("key",p);a.on("contentDom",b);a.on("selectionChange",function(a){t=a.data.selection.getRanges()[0].checkReadOnly();
    +s()});a.contextMenu&&a.contextMenu.addListener(function(a,b){t=b.getRanges()[0].checkReadOnly();return{cut:n("Cut"),copy:n("Copy"),paste:n("Paste")}})})();(function(){function b(c,e,d,l,i){var f=a.lang.clipboard[e];a.addCommand(e,d);a.ui.addButton&&a.ui.addButton(c,{label:f,command:e,toolbar:"clipboard,"+l});a.addMenuItems&&a.addMenuItem(e,{label:f,command:e,group:"clipboard",order:i})}b("Cut","cut",e("cut"),10,1);b("Copy","copy",e("copy"),20,4);b("Paste","paste",c(),30,8)})();a.getClipboardData=
    +function(b,c){function e(a){a.removeListener();a.cancel();c(a.data)}function l(a){a.removeListener();a.cancel();g=!0;c({type:h,dataValue:a.data})}function i(){this.customTitle=b&&b.title}var f=!1,h="auto",g=!1;c||(c=b,b=null);a.on("paste",e,null,null,0);a.on("beforePaste",function(a){a.removeListener();f=true;h=a.data.type},null,null,1E3);!1===o()&&(a.removeListener("paste",e),f&&a.fire("pasteDialog",i)?(a.on("pasteDialogCommit",l),a.on("dialogHide",function(a){a.removeListener();a.data.removeListener("pasteDialogCommit",
    +l);setTimeout(function(){g||c(null)},10)})):c(null))}}function x(a){if(CKEDITOR.env.webkit){if(!a.match(/^[^<]*$/g)&&!a.match(/^(<div><br( ?\/)?><\/div>|<div>[^<]*<\/div>)*$/gi))return"html"}else if(CKEDITOR.env.ie){if(!a.match(/^([^<]|<br( ?\/)?>)*$/gi)&&!a.match(/^(<p>([^<]|<br( ?\/)?>)*<\/p>|(\r\n))*$/gi))return"html"}else if(CKEDITOR.env.gecko||CKEDITOR.env.opera){if(!a.match(/^([^<]|<br( ?\/)?>)*$/gi))return"html"}else return"html";return"htmlifiedtext"}function y(a,b){function e(a){return CKEDITOR.tools.repeat("</p><p>",
    +~~(a/2))+(1==a%2?"<br>":"")}b=b.replace(/\s+/g," ").replace(/> +</g,"><").replace(/<br ?\/>/gi,"<br>");b=b.replace(/<\/?[A-Z]+>/g,function(a){return a.toLowerCase()});if(b.match(/^[^<]$/))return b;CKEDITOR.env.webkit&&-1<b.indexOf("<div>")&&(b=b.replace(/^(<div>(<br>|)<\/div>)(?!$|(<div>(<br>|)<\/div>))/g,"<br>").replace(/^(<div>(<br>|)<\/div>){2}(?!$)/g,"<div></div>"),b.match(/<div>(<br>|)<\/div>/)&&(b="<p>"+b.replace(/(<div>(<br>|)<\/div>)+/g,function(a){return e(a.split("</div><div>").length+1)})+
    +"</p>"),b=b.replace(/<\/div><div>/g,"<br>"),b=b.replace(/<\/?div>/g,""));if((CKEDITOR.env.gecko||CKEDITOR.env.opera)&&a.enterMode!=CKEDITOR.ENTER_BR)CKEDITOR.env.gecko&&(b=b.replace(/^<br><br>$/,"<br>")),-1<b.indexOf("<br><br>")&&(b="<p>"+b.replace(/(<br>){2,}/g,function(a){return e(a.length/4)})+"</p>");return p(a,b)}function z(){var a=new CKEDITOR.htmlParser.filter,b={blockquote:1,dl:1,fieldset:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ol:1,p:1,table:1,ul:1},e=CKEDITOR.tools.extend({br:0},CKEDITOR.dtd.$inline),
    +c={p:1,br:1,"cke:br":1},f=CKEDITOR.dtd,h=CKEDITOR.tools.extend({area:1,basefont:1,embed:1,iframe:1,map:1,object:1,param:1},CKEDITOR.dtd.$nonBodyContent,CKEDITOR.dtd.$cdata),k=function(a){delete a.name;a.add(new CKEDITOR.htmlParser.text(" "))},g=function(a){for(var b=a,c;(b=b.next)&&b.name&&b.name.match(/^h\d$/);){c=new CKEDITOR.htmlParser.element("cke:br");c.isEmpty=!0;for(a.add(c);c=b.children.shift();)a.add(c)}};a.addRules({elements:{h1:g,h2:g,h3:g,h4:g,h5:g,h6:g,img:function(a){var a=CKEDITOR.tools.trim(a.attributes.alt||
    +""),b=" ";a&&!a.match(/(^http|\.(jpe?g|gif|png))/i)&&(b=" ["+a+"] ");return new CKEDITOR.htmlParser.text(b)},td:k,th:k,$:function(a){var i=a.name,g;if(h[i])return!1;delete a.attributes;if("br"==i)return a;if(b[i])a.name="p";else if(e[i])delete a.name;else if(f[i]){g=new CKEDITOR.htmlParser.element("cke:br");g.isEmpty=!0;if(CKEDITOR.dtd.$empty[i])return g;a.add(g,0);g=g.clone();g.isEmpty=!0;a.add(g);delete a.name}c[a.name]||delete a.name;return a}}});return a}function A(a,b,e){var b=new CKEDITOR.htmlParser.fragment.fromHtml(b),
    +c=new CKEDITOR.htmlParser.basicWriter;b.writeHtml(c,e);var b=c.getHtml(),b=b.replace(/\s*(<\/?[a-z:]+ ?\/?>)\s*/g,"$1").replace(/(<cke:br \/>){2,}/g,"<cke:br />").replace(/(<cke:br \/>)(<\/?p>|<br \/>)/g,"$2").replace(/(<\/?p>|<br \/>)(<cke:br \/>)/g,"$1").replace(/<(cke:)?br( \/)?>/g,"<br>").replace(/<p><\/p>/g,""),f=0,b=b.replace(/<\/?p>/g,function(a){if("<p>"==a){if(1<++f)return"</p><p>"}else if(0<--f)return"</p><p>";return a}).replace(/<p><\/p>/g,"");return p(a,b)}function p(a,b){a.enterMode==
    +CKEDITOR.ENTER_BR?b=b.replace(/(<\/p><p>)+/g,function(a){return CKEDITOR.tools.repeat("<br>",2*(a.length/7))}).replace(/<\/?p>/g,""):a.enterMode==CKEDITOR.ENTER_DIV&&(b=b.replace(/<(\/)?p>/g,"<$1div>"));return b}CKEDITOR.plugins.add("clipboard",{requires:"dialog",init:function(a){var b;w(a);CKEDITOR.dialog.add("paste",CKEDITOR.getUrl(this.path+"dialogs/paste.js"));a.on("paste",function(a){var b=a.data.dataValue,f=CKEDITOR.dtd.$block;-1<b.indexOf("Apple-")&&(b=b.replace(/<span class="Apple-converted-space">&nbsp;<\/span>/gi,
    +" "),"html"!=a.data.type&&(b=b.replace(/<span class="Apple-tab-span"[^>]*>([^<]*)<\/span>/gi,function(a,b){return b.replace(/\t/g,"&nbsp;&nbsp; &nbsp;")})),-1<b.indexOf('<br class="Apple-interchange-newline">')&&(a.data.startsWithEOL=1,a.data.preSniffing="html",b=b.replace(/<br class="Apple-interchange-newline">/,"")),b=b.replace(/(<[^>]+) class="Apple-[^"]*"/gi,"$1"));if(b.match(/^<[^<]+cke_(editable|contents)/i)){var h,k,g=new CKEDITOR.dom.element("div");for(g.setHtml(b);1==g.getChildCount()&&(h=
    +g.getFirst())&&h.type==CKEDITOR.NODE_ELEMENT&&(h.hasClass("cke_editable")||h.hasClass("cke_contents"));)g=k=h;k&&(b=k.getHtml().replace(/<br>$/i,""))}CKEDITOR.env.ie?b=b.replace(/^&nbsp;(?: |\r\n)?<(\w+)/g,function(b,c){if(c.toLowerCase()in f){a.data.preSniffing="html";return"<"+c}return b}):CKEDITOR.env.webkit?b=b.replace(/<\/(\w+)><div><br><\/div>$/,function(b,c){if(c in f){a.data.endsWithEOL=1;return"</"+c+">"}return b}):CKEDITOR.env.gecko&&(b=b.replace(/(\s)<br>$/,"$1"));a.data.dataValue=b},null,
    +null,3);a.on("paste",function(e){var e=e.data,c=e.type,f=e.dataValue,h,k=a.config.clipboard_defaultContentType||"html";h="html"==c||"html"==e.preSniffing?"html":x(f);"htmlifiedtext"==h?f=y(a.config,f):"text"==c&&"html"==h&&(f=A(a.config,f,b||(b=z(a))));e.startsWithEOL&&(f='<br data-cke-eol="1">'+f);e.endsWithEOL&&(f+='<br data-cke-eol="1">');"auto"==c&&(c="html"==h||"html"==k?"html":"text");e.type=c;e.dataValue=f;delete e.preSniffing;delete e.startsWithEOL;delete e.endsWithEOL},null,null,6);a.on("paste",
    +function(b){b=b.data;a.insertHtml(b.dataValue,b.type);setTimeout(function(){a.fire("afterPaste")},0)},null,null,1E3);a.on("pasteDialog",function(b){setTimeout(function(){a.openDialog("paste",b.data)},0)})}})})();(function(){var c='<a id="{id}" class="cke_button cke_button__{name} cke_button_{state} {cls}"'+(CKEDITOR.env.gecko&&10900<=CKEDITOR.env.version&&!CKEDITOR.env.hc?"":'" href="javascript:void(\'{titleJs}\')"')+' title="{title}" tabindex="-1" hidefocus="true" role="button" aria-labelledby="{id}_label" aria-haspopup="{hasArrow}"';if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)c+=' onkeypress="return false;"';CKEDITOR.env.gecko&&(c+=' onblur="this.style.cssText = this.style.cssText;"');var c=
    +c+(' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event);" onfocus="return CKEDITOR.tools.callFunction({focusFn},event);"  onmousedown="return CKEDITOR.tools.callFunction({mousedownFn},event);" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},this);return false;"><span class="cke_button_icon cke_button__{iconName}_icon" style="{style}"'),c=c+'>&nbsp;</span><span id="{id}_label" class="cke_button_label cke_button__{name}_label">{label}</span>{arrowHtml}</a>',
    +m=CKEDITOR.addTemplate("buttonArrow",'<span class="cke_button_arrow">'+(CKEDITOR.env.hc?"&#9660;":"")+"</span>"),n=CKEDITOR.addTemplate("button",c);CKEDITOR.plugins.add("button",{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_BUTTON,CKEDITOR.ui.button.handler)}});CKEDITOR.UI_BUTTON="button";CKEDITOR.ui.button=function(a){CKEDITOR.tools.extend(this,a,{title:a.label,click:a.click||function(b){b.execCommand(a.command)}});this._={}};CKEDITOR.ui.button.handler={create:function(a){return new CKEDITOR.ui.button(a)}};
    +CKEDITOR.ui.button.prototype={render:function(a,b){var c=CKEDITOR.env,i=this._.id=CKEDITOR.tools.getNextId(),f="",e=this.command,l;this._.editor=a;var d={id:i,button:this,editor:a,focus:function(){CKEDITOR.document.getById(i).focus()},execute:function(){this.button.click(a)},attach:function(a){this.button.attach(a)}},o=CKEDITOR.tools.addFunction(function(a){if(d.onkey)return a=new CKEDITOR.dom.event(a),!1!==d.onkey(d,a.getKeystroke())}),p=CKEDITOR.tools.addFunction(function(a){var b;d.onfocus&&(b=
    +!1!==d.onfocus(d,new CKEDITOR.dom.event(a)));CKEDITOR.env.gecko&&10900>CKEDITOR.env.version&&a.preventBubble();return b}),j=0,q=CKEDITOR.tools.addFunction(function(){if(CKEDITOR.env.opera){var b=a.editable();b.isInline()&&b.hasFocus&&(a.lockSelection(),j=1)}});d.clickFn=l=CKEDITOR.tools.addFunction(function(){j&&(a.unlockSelection(1),j=0);d.execute()});if(this.modes){var k={},g=function(){var b=a.mode;b&&(b=this.modes[b]?void 0!=k[b]?k[b]:CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,this.setState(a.readOnly&&
    +!this.readOnly?CKEDITOR.TRISTATE_DISABLED:b))};a.on("beforeModeUnload",function(){a.mode&&this._.state!=CKEDITOR.TRISTATE_DISABLED&&(k[a.mode]=this._.state)},this);a.on("mode",g,this);!this.readOnly&&a.on("readOnly",g,this)}else if(e&&(e=a.getCommand(e)))e.on("state",function(){this.setState(e.state)},this),f+=e.state==CKEDITOR.TRISTATE_ON?"on":e.state==CKEDITOR.TRISTATE_DISABLED?"disabled":"off";if(this.directional)a.on("contentDirChanged",function(b){var c=CKEDITOR.document.getById(this._.id),d=
    +c.getFirst(),b=b.data;b!=a.lang.dir?c.addClass("cke_"+b):c.removeClass("cke_ltr").removeClass("cke_rtl");d.setAttribute("style",CKEDITOR.skin.getIconStyle(h,"rtl"==b,this.icon,this.iconOffset))},this);e||(f+="off");var h=g=this.name||this.command;this.icon&&!/\./.test(this.icon)&&(h=this.icon,this.icon=null);c={id:i,name:g,iconName:h,label:this.label,cls:this.className||"",state:f,title:this.title,titleJs:c.gecko&&10900<=c.version&&!c.hc?"":(this.title||"").replace("'",""),hasArrow:this.hasArrow?
    +"true":"false",keydownFn:o,mousedownFn:q,focusFn:p,clickFn:l,style:CKEDITOR.skin.getIconStyle(h,"rtl"==a.lang.dir,this.icon,this.iconOffset),arrowHtml:this.hasArrow?m.output():""};n.output(c,b);if(this.onRender)this.onRender();return d},setState:function(a){if(this._.state==a)return!1;this._.state=a;var b=CKEDITOR.document.getById(this._.id);return b?(b.setState(a,"cke_button"),a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled"),a==CKEDITOR.TRISTATE_ON?
    +b.setAttribute("aria-pressed",!0):b.removeAttribute("aria-pressed"),!0):!1},toFeature:function(a){if(this._.feature)return this._.feature;var b=this;!this.allowedContent&&(!this.requiredContent&&this.command)&&(b=a.getCommand(this.command)||b);return this._.feature=b}};CKEDITOR.ui.prototype.addButton=function(a,b){this.add(a,CKEDITOR.UI_BUTTON,b)}})();CKEDITOR.plugins.add("panelbutton",{requires:"button",onLoad:function(){function e(c){var a=this._;a.state!=CKEDITOR.TRISTATE_DISABLED&&(this.createPanel(c),a.on?a.panel.hide():a.panel.showBlock(this._.id,this.document.getById(this._.id),4))}CKEDITOR.ui.panelButton=CKEDITOR.tools.createClass({base:CKEDITOR.ui.button,$:function(c){var a=c.panel||{};delete c.panel;this.base(c);this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.block={attributes:a.attributes};this.hasArrow=a.toolbarRelated=
    +!0;this.click=e;this._={panelDefinition:a}},statics:{handler:{create:function(c){return new CKEDITOR.ui.panelButton(c)}}},proto:{createPanel:function(c){var a=this._;if(!a.panel){var f=this._.panelDefinition,e=this._.panelDefinition.block,g=f.parent||CKEDITOR.document.getBody(),d=this._.panel=new CKEDITOR.ui.floatPanel(c,g,f),f=d.addBlock(a.id,e),b=this;d.onShow=function(){b.className&&this.element.addClass(b.className+"_panel");b.setState(CKEDITOR.TRISTATE_ON);a.on=1;b.editorFocus&&c.focus();if(b.onOpen)b.onOpen()};
    +d.onHide=function(d){b.className&&this.element.getFirst().removeClass(b.className+"_panel");b.setState(b.modes&&b.modes[c.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);a.on=0;if(!d&&b.onClose)b.onClose()};d.onEscape=function(){d.hide(1);b.document.getById(a.id).focus()};if(this.onBlock)this.onBlock(d,f);f.onHide=function(){a.on=0;b.setState(CKEDITOR.TRISTATE_OFF)}}}}})},beforeInit:function(e){e.ui.addHandler(CKEDITOR.UI_PANELBUTTON,CKEDITOR.ui.panelButton.handler)}});
    +CKEDITOR.UI_PANELBUTTON="panelbutton";(function(){CKEDITOR.plugins.add("panel",{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_PANEL,CKEDITOR.ui.panel.handler)}});CKEDITOR.UI_PANEL="panel";CKEDITOR.ui.panel=function(a,b){b&&CKEDITOR.tools.extend(this,b);CKEDITOR.tools.extend(this,{className:"",css:[]});this.id=CKEDITOR.tools.getNextId();this.document=a;this.isFramed=this.forceIFrame||this.css.length;this._={blocks:{}}};CKEDITOR.ui.panel.handler={create:function(a){return new CKEDITOR.ui.panel(a)}};var e=CKEDITOR.addTemplate("panel",
    +'<div lang="{langCode}" id="{id}" dir={dir} class="cke cke_reset_all {editorId} cke_panel cke_panel {cls} cke_{dir}" style="z-index:{z-index}" role="presentation">{frame}</div>'),f=CKEDITOR.addTemplate("panel-frame",'<iframe id="{id}" class="cke_panel_frame" role="presentation" frameborder="0" src="{src}"></iframe>'),g=CKEDITOR.addTemplate("panel-frame-inner",'<!DOCTYPE html><html class="cke_panel_container {env}" dir="{dir}" lang="{langCode}"><head>{css}</head><body class="cke_{dir}" style="margin:0;padding:0" onload="{onload}"></body></html>');
    +CKEDITOR.ui.panel.prototype={render:function(a,b){this.getHolderElement=function(){var a=this._.holder;if(!a){if(this.isFramed){var a=this.document.getById(this.id+"_frame"),b=a.getParent(),a=a.getFrameDocument();CKEDITOR.env.iOS&&b.setStyles({overflow:"scroll","-webkit-overflow-scrolling":"touch"});b=CKEDITOR.tools.addFunction(CKEDITOR.tools.bind(function(){this.isLoaded=!0;if(this.onLoad)this.onLoad()},this));a.write(g.output(CKEDITOR.tools.extend({css:CKEDITOR.tools.buildStyleHtml(this.css),onload:"window.parent.CKEDITOR.tools.callFunction("+
    +b+");"},c)));a.getWindow().$.CKEDITOR=CKEDITOR;a.on("key"+(CKEDITOR.env.opera?"press":"down"),function(a){var b=a.data.getKeystroke(),c=this.document.getById(this.id).getAttribute("dir");this._.onKeyDown&&!1===this._.onKeyDown(b)?a.data.preventDefault():(27==b||b==("rtl"==c?39:37))&&this.onEscape&&!1===this.onEscape(b)&&a.data.preventDefault()},this);a=a.getBody();a.unselectable();CKEDITOR.env.air&&CKEDITOR.tools.callFunction(b)}else a=this.document.getById(this.id);this._.holder=a}return a};var c=
    +{editorId:a.id,id:this.id,langCode:a.langCode,dir:a.lang.dir,cls:this.className,frame:"",env:CKEDITOR.env.cssClass,"z-index":a.config.baseFloatZIndex+1};if(this.isFramed){var d=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?"javascript:void(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"}())":"";c.frame=f.output({id:this.id+"_frame",src:d})}d=e.output(c);b&&b.push(d);return d},addBlock:function(a,b){b=this._.blocks[a]=b instanceof CKEDITOR.ui.panel.block?
    +b:new CKEDITOR.ui.panel.block(this.getHolderElement(),b);this._.currentBlock||this.showBlock(a);return b},getBlock:function(a){return this._.blocks[a]},showBlock:function(a){var a=this._.blocks[a],b=this._.currentBlock,c=!this.forceIFrame||CKEDITOR.env.ie?this._.holder:this.document.getById(this.id+"_frame");b&&(c.removeAttributes(b.attributes),b.hide());this._.currentBlock=a;c.setAttributes(a.attributes);CKEDITOR.fire("ariaWidget",c);a._.focusIndex=-1;this._.onKeyDown=a.onKeyDown&&CKEDITOR.tools.bind(a.onKeyDown,
    +a);a.show();return a},destroy:function(){this.element&&this.element.remove()}};CKEDITOR.ui.panel.block=CKEDITOR.tools.createClass({$:function(a,b){this.element=a.append(a.getDocument().createElement("div",{attributes:{tabIndex:-1,"class":"cke_panel_block",role:"presentation",tabindex:0},styles:{display:"none"}}));b&&CKEDITOR.tools.extend(this,b);this.element.setAttributes({"aria-label":this.attributes["aria-label"],title:this.attributes.title||this.attributes["aria-label"]});delete this.attributes["aria-label"];
    +delete this.attributes.title;this.keys={};this._.focusIndex=-1;this.element.disableContextMenu()},_:{markItem:function(a){-1!=a&&(a=this.element.getElementsByTag("a").getItem(this._.focusIndex=a),(CKEDITOR.env.webkit||CKEDITOR.env.opera)&&a.getDocument().getWindow().focus(),a.focus(),this.onMark&&this.onMark(a))}},proto:{show:function(){this.element.setStyle("display","")},hide:function(){(!this.onHide||!0!==this.onHide.call(this))&&this.element.setStyle("display","none")},onKeyDown:function(a){var b=
    +this.keys[a];switch(b){case "next":for(var a=this._.focusIndex,b=this.element.getElementsByTag("a"),c;c=b.getItem(++a);)if(c.getAttribute("_cke_focus")&&c.$.offsetWidth){this._.focusIndex=a;c.focus();break}return!1;case "prev":a=this._.focusIndex;for(b=this.element.getElementsByTag("a");0<a&&(c=b.getItem(--a));)if(c.getAttribute("_cke_focus")&&c.$.offsetWidth){this._.focusIndex=a;c.focus();break}return!1;case "click":case "mouseup":return a=this._.focusIndex,(c=0<=a&&this.element.getElementsByTag("a").getItem(a))&&
    +(c.$[b]?c.$[b]():c.$["on"+b]()),!1}return!0}}})})();CKEDITOR.plugins.add("floatpanel",{requires:"panel"});
    +(function(){function o(a,b,c,h,g){var g=CKEDITOR.tools.genKey(b.getUniqueId(),c.getUniqueId(),a.lang.dir,a.uiColor||"",h.css||"",g||""),e=i[g];e||(e=i[g]=new CKEDITOR.ui.panel(b,h),e.element=c.append(CKEDITOR.dom.element.createFromHtml(e.render(a),b)),e.element.setStyles({display:"none",position:"absolute"}));return e}var i={};CKEDITOR.ui.floatPanel=CKEDITOR.tools.createClass({$:function(a,b,c,h){function g(){j.hide()}c.forceIFrame=1;c.toolbarRelated&&a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&&
    +(b=CKEDITOR.document.getById("cke_"+a.name));var e=b.getDocument(),h=o(a,e,b,c,h||0),k=h.element,d=k.getFirst(),j=this;k.disableContextMenu();this.element=k;this._={editor:a,panel:h,parentElement:b,definition:c,document:e,iframe:d,children:[],dir:a.lang.dir};a.on("mode",g);a.on("resize",g);e.getWindow().on("resize",g)},proto:{addBlock:function(a,b){return this._.panel.addBlock(a,b)},addListBlock:function(a,b){return this._.panel.addListBlock(a,b)},getBlock:function(a){return this._.panel.getBlock(a)},
    +showBlock:function(a,b,c,h,g){var e=this._.panel,k=e.showBlock(a);this.allowBlur(!1);a=this._.editor.editable();this._.returnFocus=a.hasFocus?a:new CKEDITOR.dom.element(CKEDITOR.document.$.activeElement);var d=this.element,a=this._.iframe,a=CKEDITOR.env.ie?a:new CKEDITOR.dom.window(a.$.contentWindow),j=d.getDocument(),i=this._.parentElement.getPositionedAncestor(),n=b.getDocumentPosition(j),j=i?i.getDocumentPosition(j):{x:0,y:0},m="rtl"==this._.dir,f=n.x+(h||0)-j.x,l=n.y+(g||0)-j.y;if(m&&(1==c||4==
    +c))f+=b.$.offsetWidth;else if(!m&&(2==c||3==c))f+=b.$.offsetWidth-1;if(3==c||4==c)l+=b.$.offsetHeight-1;this._.panel._.offsetParentId=b.getId();d.setStyles({top:l+"px",left:0,display:""});d.setOpacity(0);d.getFirst().removeStyle("width");this._.editor.focusManager.add(a);this._.blurSet||(CKEDITOR.event.useCapture=!0,a.on("blur",function(a){this.allowBlur()&&a.data.getPhase()==CKEDITOR.EVENT_PHASE_AT_TARGET&&(this.visible&&!this._.activeChild)&&(delete this._.returnFocus,this.hide())},this),a.on("focus",
    +function(){this._.focused=!0;this.hideChild();this.allowBlur(!0)},this),CKEDITOR.event.useCapture=!1,this._.blurSet=1);e.onEscape=CKEDITOR.tools.bind(function(a){if(this.onEscape&&this.onEscape(a)===false)return false},this);CKEDITOR.tools.setTimeout(function(){var a=CKEDITOR.tools.bind(function(){d.removeStyle("width");if(k.autoSize){var a=k.element.getDocument(),a=(CKEDITOR.env.webkit?k.element:a.getBody()).$.scrollWidth;CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&a>0)&&(a=a+((d.$.offsetWidth||0)-(d.$.clientWidth||
    +0)+3));d.setStyle("width",a+10+"px");a=k.element.$.scrollHeight;CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&a>0)&&(a=a+((d.$.offsetHeight||0)-(d.$.clientHeight||0)+3));d.setStyle("height",a+"px");e._.currentBlock.element.setStyle("display","none").removeStyle("display")}else d.removeStyle("height");m&&(f=f-d.$.offsetWidth);d.setStyle("left",f+"px");var b=e.element.getWindow(),a=d.$.getBoundingClientRect(),b=b.getViewPaneSize(),c=a.width||a.right-a.left,g=a.height||a.bottom-a.top,h=m?a.right:b.width-a.left,
    +i=m?b.width-a.right:a.left;m?h<c&&(f=i>c?f+c:b.width>c?f-a.left:f-a.right+b.width):h<c&&(f=i>c?f-c:b.width>c?f-a.right+b.width:f-a.left);c=a.top;b.height-a.top<g&&(l=c>g?l-g:b.height>g?l-a.bottom+b.height:l-a.top);if(CKEDITOR.env.ie){b=a=new CKEDITOR.dom.element(d.$.offsetParent);b.getName()=="html"&&(b=b.getDocument().getBody());b.getComputedStyle("direction")=="rtl"&&(f=CKEDITOR.env.ie8Compat?f-d.getDocument().getDocumentElement().$.scrollLeft*2:f-(a.$.scrollWidth-a.$.clientWidth))}var a=d.getFirst(),
    +j;(j=a.getCustomData("activePanel"))&&j.onHide&&j.onHide.call(this,1);a.setCustomData("activePanel",this);d.setStyles({top:l+"px",left:f+"px"});d.setOpacity(1)},this);e.isLoaded?a():e.onLoad=a;CKEDITOR.tools.setTimeout(function(){this.focus();this.allowBlur(true);this._.editor.fire("panelShow",this)},0,this)},CKEDITOR.env.air?200:0,this);this.visible=1;this.onShow&&this.onShow.call(this)},focus:function(){if(CKEDITOR.env.webkit){var a=CKEDITOR.document.getActive();!a.equals(this._.iframe)&&a.$.blur()}(this._.lastFocused||
    +this._.iframe.getFrameDocument().getWindow()).focus()},blur:function(){var a=this._.iframe.getFrameDocument().getActive();a.is("a")&&(this._.lastFocused=a)},hide:function(a){if(this.visible&&(!this.onHide||!0!==this.onHide.call(this))){this.hideChild();CKEDITOR.env.gecko&&this._.iframe.getFrameDocument().$.activeElement.blur();this.element.setStyle("display","none");this.visible=0;this.element.getFirst().removeCustomData("activePanel");if(a=a&&this._.returnFocus)CKEDITOR.env.webkit&&a.type&&a.getWindow().$.focus(),
    +a.focus();delete this._.lastFocused;this._.editor.fire("panelHide",this)}},allowBlur:function(a){var b=this._.panel;void 0!=a&&(b.allowBlur=a);return b.allowBlur},showAsChild:function(a,b,c,h,g,e){this._.activeChild==a&&a._.panel._.offsetParentId==c.getId()||(this.hideChild(),a.onHide=CKEDITOR.tools.bind(function(){CKEDITOR.tools.setTimeout(function(){this._.focused||this.hide()},0,this)},this),this._.activeChild=a,this._.focused=!1,a.showBlock(b,c,h,g,e),this.blur(),(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&
    +setTimeout(function(){a.element.getChild(0).$.style.cssText+=""},100))},hideChild:function(a){var b=this._.activeChild;b&&(delete b.onHide,delete this._.activeChild,b.hide(),a&&this.focus())}}});CKEDITOR.on("instanceDestroyed",function(){var a=CKEDITOR.tools.isEmpty(CKEDITOR.instances),b;for(b in i){var c=i[b];a?c.destroy():c.element.hide()}a&&(i={})})})();CKEDITOR.plugins.add("colorbutton",{requires:"panelbutton,floatpanel",init:function(c){function m(l,g,e,h){var k=new CKEDITOR.style(i["colorButton_"+g+"Style"]),j=CKEDITOR.tools.getNextId()+"_colorBox";c.ui.add(l,CKEDITOR.UI_PANELBUTTON,{label:e,title:e,modes:{wysiwyg:1},editorFocus:1,toolbar:"colors,"+h,allowedContent:k,requiredContent:k,panel:{css:CKEDITOR.skin.getPath("editor"),attributes:{role:"listbox","aria-label":f.panelTitle}},onBlock:function(a,b){b.autoSize=!0;b.element.addClass("cke_colorblock");
    +b.element.setHtml(o(a,g,j));b.element.getDocument().getBody().setStyle("overflow","hidden");CKEDITOR.ui.fire("ready",this);var d=b.keys,e="rtl"==c.lang.dir;d[e?37:39]="next";d[40]="next";d[9]="next";d[e?39:37]="prev";d[38]="prev";d[CKEDITOR.SHIFT+9]="prev";d[32]="click"},onOpen:function(){var a=c.getSelection(),a=a&&a.getStartElement(),a=c.elementPath(a),b,a=a.block||a.blockLimit||c.document.getBody();do b=a&&a.getComputedStyle("back"==g?"background-color":"color")||"transparent";while("back"==g&&
    +"transparent"==b&&a&&(a=a.getParent()));if(!b||"transparent"==b)b="#ffffff";this._.panel._.iframe.getFrameDocument().getById(j).setStyle("background-color",b);return b}})}function o(l,g,e){var h=[],k=i.colorButton_colors.split(","),j=CKEDITOR.tools.addFunction(function(a,b){if("?"==a){var e=arguments.callee,d=function(a){this.removeListener("ok",d);this.removeListener("cancel",d);"ok"==a.name&&e(this.getContentElement("picker","selectedColor").getValue(),b)};c.openDialog("colordialog",function(){this.on("ok",
    +d);this.on("cancel",d)})}else{c.focus();l.hide();c.fire("saveSnapshot");c.removeStyle(new CKEDITOR.style(i["colorButton_"+b+"Style"],{color:"inherit"}));if(a){var f=i["colorButton_"+b+"Style"];f.childRule="back"==b?function(a){return n(a)}:function(a){return!(a.is("a")||a.getElementsByTag("a").count())||n(a)};c.applyStyle(new CKEDITOR.style(f,{color:a}))}c.fire("saveSnapshot")}});h.push('<a class="cke_colorauto" _cke_focus=1 hidefocus=true title="',f.auto,'" onclick="CKEDITOR.tools.callFunction(',
    +j,",null,'",g,"');return false;\" href=\"javascript:void('",f.auto,'\')" role="option"><table role="presentation" cellspacing=0 cellpadding=0 width="100%"><tr><td><span class="cke_colorbox" id="',e,'"></span></td><td colspan=7 align=center>',f.auto,'</td></tr></table></a><table role="presentation" cellspacing=0 cellpadding=0 width="100%">');for(e=0;e<k.length;e++){0===e%8&&h.push("</tr><tr>");var a=k[e].split("/"),b=a[0],d=a[1]||b;a[1]||(b="#"+b.replace(/^(.)(.)(.)$/,"$1$1$2$2$3$3"));a=c.lang.colorbutton.colors[d]||
    +d;h.push('<td><a class="cke_colorbox" _cke_focus=1 hidefocus=true title="',a,'" onclick="CKEDITOR.tools.callFunction(',j,",'",b,"','",g,"'); return false;\" href=\"javascript:void('",a,'\')" role="option"><span class="cke_colorbox" style="background-color:#',d,'"></span></a></td>')}(c.plugins.colordialog&&void 0===i.colorButton_enableMore||i.colorButton_enableMore)&&h.push('</tr><tr><td colspan=8 align=center><a class="cke_colormore" _cke_focus=1 hidefocus=true title="',f.more,'" onclick="CKEDITOR.tools.callFunction(',
    +j,",'?','",g,"');return false;\" href=\"javascript:void('",f.more,"')\"",' role="option">',f.more,"</a></td>");h.push("</tr></table>");return h.join("")}function n(c){return"false"==c.getAttribute("contentEditable")||c.getAttribute("data-nostyle")}var i=c.config,f=c.lang.colorbutton;CKEDITOR.env.hc||(m("TextColor","fore",f.textColorTitle,10),m("BGColor","back",f.bgColorTitle,20))}});CKEDITOR.config.colorButton_colors="000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF";
    +CKEDITOR.config.colorButton_foreStyle={element:"span",styles:{color:"#(color)"},overrides:[{element:"font",attributes:{color:null}}]};CKEDITOR.config.colorButton_backStyle={element:"span",styles:{"background-color":"#(color)"}};CKEDITOR.plugins.colordialog={requires:"dialog",init:function(b){b.addCommand("colordialog",new CKEDITOR.dialogCommand("colordialog"));CKEDITOR.dialog.add("colordialog",this.path+"dialogs/colordialog.js");b.getColorFromDialog=function(e,f){var c=function(a){this.removeListener("ok",c);this.removeListener("cancel",c);a="ok"==a.name?this.getValueOf("picker","selectedColor"):null;e.call(f,a)},d=function(a){a.on("ok",c);a.on("cancel",c)};b.execCommand("colordialog");if(b._.storedDialogs&&b._.storedDialogs.colordialog)d(b._.storedDialogs.colordialog);
    +else CKEDITOR.on("dialogDefinition",function(a){if("colordialog"==a.data.name){var b=a.data.definition;a.removeListener();b.onLoad=CKEDITOR.tools.override(b.onLoad,function(a){return function(){d(this);b.onLoad=a;"function"==typeof a&&a.call(this)}})}})}}};CKEDITOR.plugins.add("colordialog",CKEDITOR.plugins.colordialog);(function(){CKEDITOR.plugins.add("templates",{requires:"dialog",init:function(a){CKEDITOR.dialog.add("templates",CKEDITOR.getUrl(this.path+"dialogs/templates.js"));a.addCommand("templates",new CKEDITOR.dialogCommand("templates"));a.ui.addButton&&a.ui.addButton("Templates",{label:a.lang.templates.button,command:"templates",toolbar:"doctools,10"})}});var c={},f={};CKEDITOR.addTemplates=function(a,d){c[a]=d};CKEDITOR.getTemplates=function(a){return c[a]};CKEDITOR.loadTemplates=function(a,d){for(var e=
    +[],b=0,c=a.length;b<c;b++)f[a[b]]||(e.push(a[b]),f[a[b]]=1);e.length?CKEDITOR.scriptLoader.load(e,d):setTimeout(d,0)}})();CKEDITOR.config.templates_files=[CKEDITOR.getUrl("plugins/templates/templates/default.js")];CKEDITOR.config.templates_replaceContent=!0;CKEDITOR.plugins.add("menu",{requires:"floatpanel",beforeInit:function(k){for(var g=k.config.menu_groups.split(","),m=k._.menuGroups={},l=k._.menuItems={},a=0;a<g.length;a++)m[g[a]]=a+1;k.addMenuGroup=function(b,a){m[b]=a||100};k.addMenuItem=function(a,c){m[c.group]&&(l[a]=new CKEDITOR.menuItem(this,a,c))};k.addMenuItems=function(a){for(var c in a)this.addMenuItem(c,a[c])};k.getMenuItem=function(a){return l[a]};k.removeMenuItem=function(a){delete l[a]}}});
    +(function(){function k(a){a.sort(function(a,c){return a.group<c.group?-1:a.group>c.group?1:a.order<c.order?-1:a.order>c.order?1:0})}var g='<span class="cke_menuitem"><a id="{id}" class="cke_menubutton cke_menubutton__{name} cke_menubutton_{state} {cls}" href="{href}" title="{title}" tabindex="-1"_cke_focus=1 hidefocus="true" role="menuitem" aria-haspopup="{hasPopup}" aria-disabled="{disabled}"';if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)g+=' onkeypress="return false;"';CKEDITOR.env.gecko&&
    +(g+=' onblur="this.style.cssText = this.style.cssText;"');var g=g+(' onmouseover="CKEDITOR.tools.callFunction({hoverFn},{index});" onmouseout="CKEDITOR.tools.callFunction({moveOutFn},{index});" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},{index}); return false;">'),m=CKEDITOR.addTemplate("menuItem",g+'<span class="cke_menubutton_inner"><span class="cke_menubutton_icon"><span class="cke_button_icon cke_button__{iconName}_icon" style="{iconStyle}"></span></span><span class="cke_menubutton_label">{label}</span>{arrowHtml}</span></a></span>'),
    +l=CKEDITOR.addTemplate("menuArrow",'<span class="cke_menuarrow"><span>{label}</span></span>');CKEDITOR.menu=CKEDITOR.tools.createClass({$:function(a,b){b=this._.definition=b||{};this.id=CKEDITOR.tools.getNextId();this.editor=a;this.items=[];this._.listeners=[];this._.level=b.level||1;var c=CKEDITOR.tools.extend({},b.panel,{css:[CKEDITOR.skin.getPath("editor")],level:this._.level-1,block:{}}),j=c.block.attributes=c.attributes||{};!j.role&&(j.role="menu");this._.panelDefinition=c},_:{onShow:function(){var a=
    +this.editor.getSelection(),b=a&&a.getStartElement(),c=this.editor.elementPath(),j=this._.listeners;this.removeAll();for(var e=0;e<j.length;e++){var i=j[e](b,a,c);if(i)for(var f in i){var h=this.editor.getMenuItem(f);if(h&&(!h.command||this.editor.getCommand(h.command).state))h.state=i[f],this.add(h)}}},onClick:function(a){this.hide();if(a.onClick)a.onClick();else a.command&&this.editor.execCommand(a.command)},onEscape:function(a){var b=this.parent;b?b._.panel.hideChild(1):27==a&&this.hide(1);return!1},
    +onHide:function(){this.onHide&&this.onHide()},showSubMenu:function(a){var b=this._.subMenu,c=this.items[a];if(c=c.getItems&&c.getItems()){b?b.removeAll():(b=this._.subMenu=new CKEDITOR.menu(this.editor,CKEDITOR.tools.extend({},this._.definition,{level:this._.level+1},!0)),b.parent=this,b._.onClick=CKEDITOR.tools.bind(this._.onClick,this));for(var j in c){var e=this.editor.getMenuItem(j);e&&(e.state=c[j],b.add(e))}var i=this._.panel.getBlock(this.id).element.getDocument().getById(this.id+(""+a));setTimeout(function(){b.show(i,
    +2)},0)}else this._.panel.hideChild(1)}},proto:{add:function(a){a.order||(a.order=this.items.length);this.items.push(a)},removeAll:function(){this.items=[]},show:function(a,b,c,j){if(!this.parent&&(this._.onShow(),!this.items.length))return;var b=b||("rtl"==this.editor.lang.dir?2:1),e=this.items,i=this.editor,f=this._.panel,h=this._.element;if(!f){f=this._.panel=new CKEDITOR.ui.floatPanel(this.editor,CKEDITOR.document.getBody(),this._.panelDefinition,this._.level);f.onEscape=CKEDITOR.tools.bind(function(a){if(!1===
    +this._.onEscape(a))return!1},this);f.onShow=function(){f._.panel.getHolderElement().getParent().addClass("cke cke_reset_all")};f.onHide=CKEDITOR.tools.bind(function(){this._.onHide&&this._.onHide()},this);h=f.addBlock(this.id,this._.panelDefinition.block);h.autoSize=!0;var d=h.keys;d[40]="next";d[9]="next";d[38]="prev";d[CKEDITOR.SHIFT+9]="prev";d["rtl"==i.lang.dir?37:39]=CKEDITOR.env.ie?"mouseup":"click";d[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(d[13]="mouseup");h=this._.element=
    +h.element;d=h.getDocument();d.getBody().setStyle("overflow","hidden");d.getElementsByTag("html").getItem(0).setStyle("overflow","hidden");this._.itemOverFn=CKEDITOR.tools.addFunction(function(a){clearTimeout(this._.showSubTimeout);this._.showSubTimeout=CKEDITOR.tools.setTimeout(this._.showSubMenu,i.config.menu_subMenuDelay||400,this,[a])},this);this._.itemOutFn=CKEDITOR.tools.addFunction(function(){clearTimeout(this._.showSubTimeout)},this);this._.itemClickFn=CKEDITOR.tools.addFunction(function(a){var b=
    +this.items[a];if(b.state==CKEDITOR.TRISTATE_DISABLED)this.hide(1);else if(b.getItems)this._.showSubMenu(a);else this._.onClick(b)},this)}k(e);for(var d=i.elementPath(),d=['<div class="cke_menu'+(d&&d.direction()!=i.lang.dir?" cke_mixed_dir_content":"")+'" role="presentation">'],g=e.length,m=g&&e[0].group,l=0;l<g;l++){var n=e[l];m!=n.group&&(d.push('<div class="cke_menuseparator" role="separator"></div>'),m=n.group);n.render(this,l,d)}d.push("</div>");h.setHtml(d.join(""));CKEDITOR.ui.fire("ready",
    +this);this.parent?this.parent._.panel.showAsChild(f,this.id,a,b,c,j):f.showBlock(this.id,a,b,c,j);i.fire("menuShow",[f])},addListener:function(a){this._.listeners.push(a)},hide:function(a){this._.onHide&&this._.onHide();this._.panel&&this._.panel.hide(a)}}});CKEDITOR.menuItem=CKEDITOR.tools.createClass({$:function(a,b,c){CKEDITOR.tools.extend(this,c,{order:0,className:"cke_menubutton__"+b});this.group=a._.menuGroups[this.group];this.editor=a;this.name=b},proto:{render:function(a,b,c){var g=a.id+(""+
    +b),e="undefined"==typeof this.state?CKEDITOR.TRISTATE_OFF:this.state,i=e==CKEDITOR.TRISTATE_ON?"on":e==CKEDITOR.TRISTATE_DISABLED?"disabled":"off",f=this.getItems,h="&#"+("rtl"==this.editor.lang.dir?"9668":"9658")+";",d=this.name;this.icon&&!/\./.test(this.icon)&&(d=this.icon);a={id:g,name:this.name,iconName:d,label:this.label,cls:this.className||"",state:i,hasPopup:f?"true":"false",disabled:e==CKEDITOR.TRISTATE_DISABLED,title:this.label,href:"javascript:void('"+(this.label||"").replace("'")+"')",
    +hoverFn:a._.itemOverFn,moveOutFn:a._.itemOutFn,clickFn:a._.itemClickFn,index:b,iconStyle:CKEDITOR.skin.getIconStyle(d,"rtl"==this.editor.lang.dir,d==this.icon?null:this.icon,this.iconOffset),arrowHtml:f?l.output({label:h}):""};m.output(a,c)}}})})();CKEDITOR.config.menu_groups="clipboard,form,tablecell,tablecellproperties,tablerow,tablecolumn,table,anchor,link,image,flash,checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea,div";CKEDITOR.plugins.add("contextmenu",{requires:"menu",onLoad:function(){CKEDITOR.plugins.contextMenu=CKEDITOR.tools.createClass({base:CKEDITOR.menu,$:function(b){this.base.call(this,b,{panel:{className:"cke_menu_panel",attributes:{"aria-label":b.lang.contextmenu.options}}})},proto:{addTarget:function(b,d){if(CKEDITOR.env.opera&&!("oncontextmenu"in document.body)){var c;b.on("mousedown",function(a){a=a.data;if(2!=a.$.button)a.getKeystroke()==CKEDITOR.CTRL+1&&b.fire("contextmenu",a);else if(!d||!(CKEDITOR.env.mac?
    +a.$.metaKey:a.$.ctrlKey)){var g=a.getTarget();c||(g=g.getDocument(),c=g.createElement("input"),c.$.type="button",g.getBody().append(c));c.setAttribute("style","position:absolute;top:"+(a.$.clientY-2)+"px;left:"+(a.$.clientX-2)+"px;width:5px;height:5px;opacity:0.01")}});b.on("mouseup",function(a){c&&(c.remove(),c=void 0,b.fire("contextmenu",a.data))})}b.on("contextmenu",function(a){a=a.data;if(!d||!(CKEDITOR.env.webkit?e:CKEDITOR.env.mac?a.$.metaKey:a.$.ctrlKey)){a.preventDefault();var b=a.getTarget().getDocument(),
    +c=a.getTarget().getDocument().getDocumentElement(),f=!b.equals(CKEDITOR.document),b=b.getWindow().getScrollPosition(),h=f?a.$.clientX:a.$.pageX||b.x+a.$.clientX,i=f?a.$.clientY:a.$.pageY||b.y+a.$.clientY;CKEDITOR.tools.setTimeout(function(){this.open(c,null,h,i)},CKEDITOR.env.ie?200:0,this)}},this);if(CKEDITOR.env.opera)b.on("keypress",function(a){a=a.data;0===a.$.keyCode&&a.preventDefault()});if(CKEDITOR.env.webkit){var e,f=function(){e=0};b.on("keydown",function(a){e=CKEDITOR.env.mac?a.data.$.metaKey:
    +a.data.$.ctrlKey});b.on("keyup",f);b.on("contextmenu",f)}},open:function(b,d,c,e){this.editor.focus();b=b||CKEDITOR.document.getDocumentElement();this.editor.selectionChange(1);this.show(b,d,c,e)}}})},beforeInit:function(b){var d=b.contextMenu=new CKEDITOR.plugins.contextMenu(b);b.on("contentDom",function(){d.addTarget(b.editable(),!1!==b.config.browserContextMenuOnCtrl)});b.addCommand("contextMenu",{exec:function(){b.contextMenu.open(b.document.getBody())}});b.setKeystroke(CKEDITOR.SHIFT+121,"contextMenu");
    +b.setKeystroke(CKEDITOR.CTRL+CKEDITOR.SHIFT+121,"contextMenu")}});(function(){CKEDITOR.plugins.add("div",{requires:"dialog",init:function(a){if(!a.blockless){var c=a.lang.div,b="div(*)";CKEDITOR.dialog.isTabEnabled(a,"editdiv","advanced")&&(b+=";div[dir,id,lang,title]{*}");a.addCommand("creatediv",new CKEDITOR.dialogCommand("creatediv",{allowedContent:b,requiredContent:"div",contextSensitive:!0,refresh:function(a,c){this.setState("div"in(a.config.div_wrapTable?c.root:c.blockLimit).getDtd()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}}));a.addCommand("editdiv",
    +new CKEDITOR.dialogCommand("editdiv",{requiredContent:"div"}));a.addCommand("removediv",{requiredContent:"div",exec:function(a){function c(b){if((b=CKEDITOR.plugins.div.getSurroundDiv(a,b))&&!b.data("cke-div-added"))f.push(b),b.data("cke-div-added")}for(var b=a.getSelection(),g=b&&b.getRanges(),e,h=b.createBookmarks(),f=[],d=0;d<g.length;d++)e=g[d],e.collapsed?c(b.getStartElement()):(e=new CKEDITOR.dom.walker(e),e.evaluator=c,e.lastForward());for(d=0;d<f.length;d++)f[d].remove(!0);b.selectBookmarks(h)}});
    +a.ui.addButton&&a.ui.addButton("CreateDiv",{label:c.toolbar,command:"creatediv",toolbar:"blocks,50"});a.addMenuItems&&(a.addMenuItems({editdiv:{label:c.edit,command:"editdiv",group:"div",order:1},removediv:{label:c.remove,command:"removediv",group:"div",order:5}}),a.contextMenu&&a.contextMenu.addListener(function(b){return!b||b.isReadOnly()?null:CKEDITOR.plugins.div.getSurroundDiv(a)?{editdiv:CKEDITOR.TRISTATE_OFF,removediv:CKEDITOR.TRISTATE_OFF}:null}));CKEDITOR.dialog.add("creatediv",this.path+
    +"dialogs/div.js");CKEDITOR.dialog.add("editdiv",this.path+"dialogs/div.js")}}});CKEDITOR.plugins.div={getSurroundDiv:function(a,c){var b=a.elementPath(c);return a.elementPath(b.blockLimit).contains("div",1)}}})();CKEDITOR.plugins.add("resize",{init:function(b){var f,g,n,o,a=b.config,q=b.ui.spaceId("resizer"),h=b.element?b.element.getDirection(1):"ltr";!a.resize_dir&&(a.resize_dir="vertical");void 0==a.resize_maxWidth&&(a.resize_maxWidth=3E3);void 0==a.resize_maxHeight&&(a.resize_maxHeight=3E3);void 0==a.resize_minWidth&&(a.resize_minWidth=750);void 0==a.resize_minHeight&&(a.resize_minHeight=250);if(!1!==a.resize_enabled){var c=null,i=("both"==a.resize_dir||"horizontal"==a.resize_dir)&&a.resize_minWidth!=a.resize_maxWidth,
    +l=("both"==a.resize_dir||"vertical"==a.resize_dir)&&a.resize_minHeight!=a.resize_maxHeight,j=function(d){var e=f,m=g,c=e+(d.data.$.screenX-n)*("rtl"==h?-1:1),d=m+(d.data.$.screenY-o);i&&(e=Math.max(a.resize_minWidth,Math.min(c,a.resize_maxWidth)));l&&(m=Math.max(a.resize_minHeight,Math.min(d,a.resize_maxHeight)));b.resize(i?e:null,m)},k=function(){CKEDITOR.document.removeListener("mousemove",j);CKEDITOR.document.removeListener("mouseup",k);b.document&&(b.document.removeListener("mousemove",j),b.document.removeListener("mouseup",
    +k))},p=CKEDITOR.tools.addFunction(function(d){c||(c=b.getResizable());f=c.$.offsetWidth||0;g=c.$.offsetHeight||0;n=d.screenX;o=d.screenY;a.resize_minWidth>f&&(a.resize_minWidth=f);a.resize_minHeight>g&&(a.resize_minHeight=g);CKEDITOR.document.on("mousemove",j);CKEDITOR.document.on("mouseup",k);b.document&&(b.document.on("mousemove",j),b.document.on("mouseup",k));d.preventDefault&&d.preventDefault()});b.on("destroy",function(){CKEDITOR.tools.removeFunction(p)});b.on("uiSpace",function(a){if("bottom"==
    +a.data.space){var e="";i&&!l&&(e=" cke_resizer_horizontal");!i&&l&&(e=" cke_resizer_vertical");var c='<span id="'+q+'" class="cke_resizer'+e+" cke_resizer_"+h+'" title="'+CKEDITOR.tools.htmlEncode(b.lang.common.resize)+'" onmousedown="CKEDITOR.tools.callFunction('+p+', event)">'+("ltr"==h?"鈼":"鈼")+"</span>";"ltr"==h&&"ltr"==e?a.data.html+=c:a.data.html=c+a.data.html}},b,null,100);b.on("maximize",function(a){b.ui.space("resizer")[a.data==CKEDITOR.TRISTATE_ON?"hide":"show"]()})}}});(function(){function w(a){function d(){for(var b=i(),e=CKEDITOR.tools.clone(a.config.toolbarGroups)||n(a),f=0;f<e.length;f++){var k=e[f];if("/"!=k){"string"==typeof k&&(k=e[f]={name:k});var j,d=k.groups;if(d)for(var h=0;h<d.length;h++)j=d[h],(j=b[j])&&c(k,j);(j=b[k.name])&&c(k,j)}}return e}function i(){var b={},c,f,e;for(c in a.ui.items)f=a.ui.items[c],e=f.toolbar||"others",e=e.split(","),f=e[0],e=parseInt(e[1]||-1,10),b[f]||(b[f]=[]),b[f].push({name:c,order:e});for(f in b)b[f]=b[f].sort(function(b,
    +a){return b.order==a.order?0:0>a.order?-1:0>b.order?1:b.order<a.order?-1:1});return b}function c(c,e){if(e.length){c.items?c.items.push(a.ui.create("-")):c.items=[];for(var f;f=e.shift();)if(f="string"==typeof f?f:f.name,!b||-1==CKEDITOR.tools.indexOf(b,f))(f=a.ui.create(f))&&a.addFeature(f)&&c.items.push(f)}}function h(b){var a=[],e,d,h;for(e=0;e<b.length;++e)d=b[e],h={},"/"==d?a.push(d):CKEDITOR.tools.isArray(d)?(c(h,CKEDITOR.tools.clone(d)),a.push(h)):d.items&&(c(h,CKEDITOR.tools.clone(d.items)),
    +h.name=d.name,a.push(h));return a}var b=a.config.removeButtons,b=b&&b.split(","),e=a.config.toolbar;"string"==typeof e&&(e=a.config["toolbar_"+e]);return a.toolbar=e?h(e):d()}function n(a){return a._.toolbarGroups||(a._.toolbarGroups=[{name:"document",groups:["mode","document","doctools"]},{name:"clipboard",groups:["clipboard","undo"]},{name:"editing",groups:["find","selection","spellchecker"]},{name:"forms"},"/",{name:"basicstyles",groups:["basicstyles","cleanup"]},{name:"paragraph",groups:["list",
    +"indent","blocks","align"]},{name:"links"},{name:"insert"},"/",{name:"styles"},{name:"colors"},{name:"tools"},{name:"others"},{name:"about"}])}var t=function(){this.toolbars=[];this.focusCommandExecuted=!1};t.prototype.focus=function(){for(var a=0,d;d=this.toolbars[a++];)for(var i=0,c;c=d.items[i++];)if(c.focus){c.focus();return}};var x={modes:{wysiwyg:1,source:1},readOnly:1,exec:function(a){a.toolbox&&(a.toolbox.focusCommandExecuted=!0,CKEDITOR.env.ie||CKEDITOR.env.air?setTimeout(function(){a.toolbox.focus()},
    +100):a.toolbox.focus())}};CKEDITOR.plugins.add("toolbar",{requires:"button",init:function(a){var d,i=function(c,h){var b,e="rtl"==a.lang.dir,g=a.config.toolbarGroupCycling,g=void 0===g||g;switch(h){case 9:case CKEDITOR.SHIFT+9:for(;!b||!b.items.length;)if(b=9==h?(b?b.next:c.toolbar.next)||a.toolbox.toolbars[0]:(b?b.previous:c.toolbar.previous)||a.toolbox.toolbars[a.toolbox.toolbars.length-1],b.items.length)for(c=b.items[d?b.items.length-1:0];c&&!c.focus;)(c=d?c.previous:c.next)||(b=0);c&&c.focus();
    +return!1;case e?37:39:case 40:b=c;do b=b.next,!b&&g&&(b=c.toolbar.items[0]);while(b&&!b.focus);b?b.focus():i(c,9);return!1;case e?39:37:case 38:b=c;do b=b.previous,!b&&g&&(b=c.toolbar.items[c.toolbar.items.length-1]);while(b&&!b.focus);b?b.focus():(d=1,i(c,CKEDITOR.SHIFT+9),d=0);return!1;case 27:return a.focus(),!1;case 13:case 32:return c.execute(),!1}return!0};a.on("uiSpace",function(c){if(c.data.space==a.config.toolbarLocation){c.removeListener();a.toolbox=new t;var d=CKEDITOR.tools.getNextId(),
    +b=['<span id="',d,'" class="cke_voice_label">',a.lang.toolbar.toolbars,"</span>",'<span id="'+a.ui.spaceId("toolbox")+'" class="cke_toolbox" role="group" aria-labelledby="',d,'" onmousedown="return false;">'],d=!1!==a.config.toolbarStartupExpanded,e,g;a.config.toolbarCanCollapse&&a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&b.push('<span class="cke_toolbox_main"'+(d?">":' style="display:none">'));for(var n=a.toolbox.toolbars,f=w(a),k=0;k<f.length;k++){var j,l=0,q,m=f[k],r;if(m)if(e&&(b.push("</span>"),
    +g=e=0),"/"===m)b.push('<span class="cke_toolbar_break"></span>');else{r=m.items||m;for(var s=0;s<r.length;s++){var o=r[s],u;if(o)if(o.type==CKEDITOR.UI_SEPARATOR)g=e&&o;else{u=!1!==o.canGroup;if(!l){j=CKEDITOR.tools.getNextId();l={id:j,items:[]};q=m.name&&(a.lang.toolbar.toolbarGroups[m.name]||m.name);b.push('<span id="',j,'" class="cke_toolbar"',q?' aria-labelledby="'+j+'_label"':"",' role="toolbar">');q&&b.push('<span id="',j,'_label" class="cke_voice_label">',q,"</span>");b.push('<span class="cke_toolbar_start"></span>');
    +var p=n.push(l)-1;0<p&&(l.previous=n[p-1],l.previous.next=l)}u?e||(b.push('<span class="cke_toolgroup" role="presentation">'),e=1):e&&(b.push("</span>"),e=0);j=function(c){c=c.render(a,b);p=l.items.push(c)-1;if(p>0){c.previous=l.items[p-1];c.previous.next=c}c.toolbar=l;c.onkey=i;c.onfocus=function(){a.toolbox.focusCommandExecuted||a.focus()}};g&&(j(g),g=0);j(o)}}e&&(b.push("</span>"),g=e=0);l&&b.push('<span class="cke_toolbar_end"></span></span>')}}a.config.toolbarCanCollapse&&b.push("</span>");if(a.config.toolbarCanCollapse&&
    +a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var v=CKEDITOR.tools.addFunction(function(){a.execCommand("toolbarCollapse")});a.on("destroy",function(){CKEDITOR.tools.removeFunction(v)});a.addCommand("toolbarCollapse",{readOnly:1,exec:function(b){var a=b.ui.space("toolbar_collapser"),c=a.getPrevious(),e=b.ui.space("contents"),d=c.getParent(),f=parseInt(e.$.style.height,10),h=d.$.offsetHeight,g=a.hasClass("cke_toolbox_collapser_min");g?(c.show(),a.removeClass("cke_toolbox_collapser_min"),a.setAttribute("title",
    +b.lang.toolbar.toolbarCollapse)):(c.hide(),a.addClass("cke_toolbox_collapser_min"),a.setAttribute("title",b.lang.toolbar.toolbarExpand));a.getFirst().setText(g?"鈻":"鈼");e.setStyle("height",f-(d.$.offsetHeight-h)+"px");b.fire("resize")},modes:{wysiwyg:1,source:1}});a.setKeystroke(CKEDITOR.ALT+(CKEDITOR.env.ie||CKEDITOR.env.webkit?189:109),"toolbarCollapse");b.push('<a title="'+(d?a.lang.toolbar.toolbarCollapse:a.lang.toolbar.toolbarExpand)+'" id="'+a.ui.spaceId("toolbar_collapser")+'" tabIndex="-1" class="cke_toolbox_collapser');
    +d||b.push(" cke_toolbox_collapser_min");b.push('" onclick="CKEDITOR.tools.callFunction('+v+')">','<span class="cke_arrow">&#9650;</span>',"</a>")}b.push("</span>");c.data.html+=b.join("")}});a.on("destroy",function(){if(this.toolbox){var a,d=0,b,e,g;for(a=this.toolbox.toolbars;d<a.length;d++){e=a[d].items;for(b=0;b<e.length;b++)g=e[b],g.clickFn&&CKEDITOR.tools.removeFunction(g.clickFn),g.keyDownFn&&CKEDITOR.tools.removeFunction(g.keyDownFn)}}});a.on("uiReady",function(){var c=a.ui.space("toolbox");
    +c&&a.focusManager.add(c,1)});a.addCommand("toolbarFocus",x);a.setKeystroke(CKEDITOR.ALT+121,"toolbarFocus");a.ui.add("-",CKEDITOR.UI_SEPARATOR,{});a.ui.addHandler(CKEDITOR.UI_SEPARATOR,{create:function(){return{render:function(a,d){d.push('<span class="cke_toolbar_separator" role="separator"></span>');return{}}}}})}});CKEDITOR.ui.prototype.addToolbarGroup=function(a,d,i){var c=n(this.editor),h=0===d,b={name:a};if(i){if(i=CKEDITOR.tools.search(c,function(a){return a.name==i})){!i.groups&&(i.groups=
    +[]);if(d&&(d=CKEDITOR.tools.indexOf(i.groups,d),0<=d)){i.groups.splice(d+1,0,a);return}h?i.groups.splice(0,0,a):i.groups.push(a);return}d=null}d&&(d=CKEDITOR.tools.indexOf(c,function(a){return a.name==d}));h?c.splice(0,0,a):"number"==typeof d?c.splice(d+1,0,b):c.push(a)}})();CKEDITOR.UI_SEPARATOR="separator";CKEDITOR.config.toolbarLocation="top";(function(){var h;function m(a,d){function o(b){b=a._.elementsPath.list[b];if(b.equals(a.editable())){var e=a.createRange();e.selectNodeContents(b);e.select()}else a.getSelection().selectElement(b);a.focus()}function p(){i&&i.setHtml(n);delete a._.elementsPath.list}var l=a.ui.spaceId("path"),i,q="cke_elementspath_"+CKEDITOR.tools.getNextNumber()+"_";a._.elementsPath={idBase:q,filters:[]};d.html+='<span id="'+l+'_label" class="cke_voice_label">'+a.lang.elementspath.eleLabel+'</span><span id="'+l+'" class="cke_path" role="group" aria-labelledby="'+
    +l+'_label">'+n+"</span>";a.on("uiReady",function(){var b=a.ui.space("path");b&&a.focusManager.add(b,1)});var m=CKEDITOR.tools.addFunction(o),r=CKEDITOR.tools.addFunction(function(b,e){var c=a._.elementsPath.idBase,f,e=new CKEDITOR.dom.event(e);f="rtl"==a.lang.dir;switch(e.getKeystroke()){case f?39:37:case 9:return(f=CKEDITOR.document.getById(c+(b+1)))||(f=CKEDITOR.document.getById(c+"0")),f.focus(),!1;case f?37:39:case CKEDITOR.SHIFT+9:return(f=CKEDITOR.document.getById(c+(b-1)))||(f=CKEDITOR.document.getById(c+
    +(a._.elementsPath.list.length-1))),f.focus(),!1;case 27:return a.focus(),!1;case 13:case 32:return o(b),!1}return!0});a.on("selectionChange",function(b){for(var e=a.editable(),c=b.data.selection.getStartElement(),b=[],f=a._.elementsPath.list=[],d=a._.elementsPath.filters;c;){var j=0,g;g=c.data("cke-display-name")?c.data("cke-display-name"):c.data("cke-real-element-type")?c.data("cke-real-element-type"):c.getName();for(var k=0;k<d.length;k++){var h=d[k](c,g);if(!1===h){j=1;break}g=h||g}j||(j=f.push(c)-
    +1,k=a.lang.elementspath.eleTitle.replace(/%1/,g),g=s.output({id:q+j,label:k,text:g,jsTitle:"javascript:void('"+g+"')",index:j,keyDownFn:r,clickFn:m}),b.unshift(g));if(c.equals(e))break;c=c.getParent()}i||(i=CKEDITOR.document.getById(l));e=i;e.setHtml(b.join("")+n);a.fire("elementsPathUpdate",{space:e})});a.on("readOnly",p);a.on("contentDomUnload",p);a.addCommand("elementsPathFocus",h);a.setKeystroke(CKEDITOR.ALT+122,"elementsPathFocus")}h={editorFocus:!1,readOnly:1,exec:function(a){(a=CKEDITOR.document.getById(a._.elementsPath.idBase+
    +"0"))&&a.focus(CKEDITOR.env.ie||CKEDITOR.env.air)}};var n='<span class="cke_path_empty">&nbsp;</span>',d="";if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)d+=' onkeypress="return false;"';CKEDITOR.env.gecko&&(d+=' onblur="this.style.cssText = this.style.cssText;"');var s=CKEDITOR.addTemplate("pathItem",'<a id="{id}" href="{jsTitle}" tabindex="-1" class="cke_path_item" title="{label}"'+(CKEDITOR.env.gecko&&10900>CKEDITOR.env.version?' onfocus="event.preventBubble();"':"")+d+' hidefocus="true"  onkeydown="return CKEDITOR.tools.callFunction({keyDownFn},{index}, event );" onclick="CKEDITOR.tools.callFunction({clickFn},{index}); return false;" role="button" aria-label="{label}">{text}</a>');
    +CKEDITOR.plugins.add("elementspath",{init:function(a){a.on("uiSpace",function(d){"bottom"==d.data.space&&m(a,d.data)})}})})();(function(){function C(c,j,f){function b(b){if((d=a[b?"getFirst":"getLast"]())&&(!d.is||!d.isBlockBoundary())&&(m=j.root[b?"getPrevious":"getNext"](CKEDITOR.dom.walker.invisible(!0)))&&(!m.is||!m.isBlockBoundary({br:1})))c.document.createElement("br")[b?"insertBefore":"insertAfter"](d)}for(var i=CKEDITOR.plugins.list.listToArray(j.root,f),e=[],h=0;h<j.contents.length;h++){var g=j.contents[h];if((g=g.getAscendant("li",!0))&&!g.getCustomData("list_item_processed"))e.push(g),CKEDITOR.dom.element.setMarker(f,
    +g,"list_item_processed",!0)}g=null;for(h=0;h<e.length;h++)g=e[h].getCustomData("listarray_index"),i[g].indent=-1;for(h=g+1;h<i.length;h++)if(i[h].indent>i[h-1].indent+1){e=i[h-1].indent+1-i[h].indent;for(g=i[h].indent;i[h]&&i[h].indent>=g;)i[h].indent+=e,h++;h--}var a=CKEDITOR.plugins.list.arrayToList(i,f,null,c.config.enterMode,j.root.getAttribute("dir")).listNode,d,m;b(!0);b();a.replace(j.root)}function x(c,j){this.name=c;this.context=this.type=j;this.allowedContent=j+" li";this.requiredContent=
    +j}function y(c,j,f,b){for(var i,e;i=c[b?"getLast":"getFirst"](D);)(e=i.getDirection(1))!==j.getDirection(1)&&i.setAttribute("dir",e),i.remove(),f?i[b?"insertBefore":"insertAfter"](f):j.append(i,b)}function A(c){var j;(j=function(f){var b=c[f?"getPrevious":"getNext"](q);b&&(b.type==CKEDITOR.NODE_ELEMENT&&b.is(c.getName()))&&(y(c,b,null,!f),c.remove(),c=b)})();j(1)}function B(c){return c.type==CKEDITOR.NODE_ELEMENT&&(c.getName()in CKEDITOR.dtd.$block||c.getName()in CKEDITOR.dtd.$listItem)&&CKEDITOR.dtd[c.getName()]["#"]}
    +function v(c,j,f){c.fire("saveSnapshot");f.enlarge(CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS);var b=f.extractContents();j.trim(!1,!0);var i=j.createBookmark(),e=new CKEDITOR.dom.elementPath(j.startContainer),h=e.block,e=e.lastElement.getAscendant("li",1)||h,g=new CKEDITOR.dom.elementPath(f.startContainer),a=g.contains(CKEDITOR.dtd.$listItem),g=g.contains(CKEDITOR.dtd.$list);h?(h=h.getBogus())&&h.remove():g&&(h=g.getPrevious(q))&&u(h)&&h.remove();(h=b.getLast())&&(h.type==CKEDITOR.NODE_ELEMENT&&h.is("br"))&&
    +h.remove();(h=j.startContainer.getChild(j.startOffset))?b.insertBefore(h):j.startContainer.append(b);if(a&&(b=w(a)))e.contains(a)?(y(b,a.getParent(),a),b.remove()):e.append(b);for(;f.checkStartOfBlock()&&f.checkEndOfBlock();)g=f.startPath(),b=g.block,b.is("li")&&(e=b.getParent(),b.equals(e.getLast(q))&&b.equals(e.getFirst(q))&&(b=e)),f.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START),b.remove();f=f.clone();b=c.editable();f.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);f=new CKEDITOR.dom.walker(f);f.evaluator=
    +function(a){return q(a)&&!u(a)};(f=f.next())&&(f.type==CKEDITOR.NODE_ELEMENT&&f.getName()in CKEDITOR.dtd.$list)&&A(f);j.moveToBookmark(i);j.select();c.fire("saveSnapshot")}function w(c){return(c=c.getLast(q))&&c.type==CKEDITOR.NODE_ELEMENT&&c.getName()in r?c:null}var r={ol:1,ul:1},E=CKEDITOR.dom.walker.whitespaces(),F=CKEDITOR.dom.walker.bookmark(),q=function(c){return!(E(c)||F(c))},u=CKEDITOR.dom.walker.bogus();CKEDITOR.plugins.list={listToArray:function(c,j,f,b,i){if(!r[c.getName()])return[];b||
    +(b=0);f||(f=[]);for(var e=0,h=c.getChildCount();e<h;e++){var g=c.getChild(e);g.type==CKEDITOR.NODE_ELEMENT&&g.getName()in CKEDITOR.dtd.$list&&CKEDITOR.plugins.list.listToArray(g,j,f,b+1);if("li"==g.$.nodeName.toLowerCase()){var a={parent:c,indent:b,element:g,contents:[]};i?a.grandparent=i:(a.grandparent=c.getParent(),a.grandparent&&"li"==a.grandparent.$.nodeName.toLowerCase()&&(a.grandparent=a.grandparent.getParent()));j&&CKEDITOR.dom.element.setMarker(j,g,"listarray_index",f.length);f.push(a);for(var d=
    +0,m=g.getChildCount(),k;d<m;d++)k=g.getChild(d),k.type==CKEDITOR.NODE_ELEMENT&&r[k.getName()]?CKEDITOR.plugins.list.listToArray(k,j,f,b+1,a.grandparent):a.contents.push(k)}}return f},arrayToList:function(c,j,f,b,i){f||(f=0);if(!c||c.length<f+1)return null;for(var e,h=c[f].parent.getDocument(),g=new CKEDITOR.dom.documentFragment(h),a=null,d=f,m=Math.max(c[f].indent,0),k=null,n,l,p=b==CKEDITOR.ENTER_P?"p":"div";;){var o=c[d];e=o.grandparent;n=o.element.getDirection(1);if(o.indent==m){if(!a||c[d].parent.getName()!=
    +a.getName())a=c[d].parent.clone(!1,1),i&&a.setAttribute("dir",i),g.append(a);k=a.append(o.element.clone(0,1));n!=a.getDirection(1)&&k.setAttribute("dir",n);for(e=0;e<o.contents.length;e++)k.append(o.contents[e].clone(1,1));d++}else if(o.indent==Math.max(m,0)+1)l=c[d-1].element.getDirection(1),d=CKEDITOR.plugins.list.arrayToList(c,null,d,b,l!=n?n:null),!k.getChildCount()&&(CKEDITOR.env.ie&&!(7<h.$.documentMode))&&k.append(h.createText("聽")),k.append(d.listNode),d=d.nextIndex;else if(-1==o.indent&&
    +!f&&e){r[e.getName()]?(k=o.element.clone(!1,!0),n!=e.getDirection(1)&&k.setAttribute("dir",n)):k=new CKEDITOR.dom.documentFragment(h);var a=e.getDirection(1)!=n,s=o.element,z=s.getAttribute("class"),u=s.getAttribute("style"),w=k.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(b!=CKEDITOR.ENTER_BR||a||u||z),t,x=o.contents.length;for(e=0;e<x;e++){t=o.contents[e];if(t.type==CKEDITOR.NODE_ELEMENT&&t.isBlockBoundary()){a&&!t.getDirection()&&t.setAttribute("dir",n);var v=t,y=s.getAttribute("style");y&&v.setAttribute("style",
    +y.replace(/([^;])$/,"$1;")+(v.getAttribute("style")||""));z&&t.addClass(z)}else w&&(l||(l=h.createElement(p),a&&l.setAttribute("dir",n)),u&&l.setAttribute("style",u),z&&l.setAttribute("class",z),l.append(t.clone(1,1)));k.append(l||t.clone(1,1))}k.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&d!=c.length-1&&((n=k.getLast())&&(n.type==CKEDITOR.NODE_ELEMENT&&"_moz"==n.getAttribute("type"))&&n.remove(),(!k.getLast(q)||!(n.type==CKEDITOR.NODE_ELEMENT&&n.getName()in CKEDITOR.dtd.$block))&&k.append(h.createElement("br")));
    +n=k.$.nodeName.toLowerCase();!CKEDITOR.env.ie&&("div"==n||"p"==n)&&k.appendBogus();g.append(k);a=null;d++}else return null;l=null;if(c.length<=d||Math.max(c[d].indent,0)<m)break}if(j)for(c=g.getFirst();c;){if(c.type==CKEDITOR.NODE_ELEMENT&&(CKEDITOR.dom.element.clearMarkers(j,c),c.getName()in CKEDITOR.dtd.$listItem&&(f=c,h=i=b=void 0,b=f.getDirection()))){for(i=f.getParent();i&&!(h=i.getDirection());)i=i.getParent();b==h&&f.removeAttribute("dir")}c=c.getNextSourceNode()}return{listNode:g,nextIndex:d}}};
    +var G=/^h[1-6]$/,D=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT);x.prototype={exec:function(c){this.refresh(c,c.elementPath());var j=c.config,f=c.getSelection(),b=f&&f.getRanges(!0);if(this.state==CKEDITOR.TRISTATE_OFF){var i=c.editable();if(i.getFirst(q)){var e=1==b.length&&b[0];(j=e&&e.getEnclosedNode())&&(j.is&&this.type==j.getName())&&this.setState(CKEDITOR.TRISTATE_ON)}else j.enterMode==CKEDITOR.ENTER_BR?i.appendBogus():b[0].fixBlock(1,j.enterMode==CKEDITOR.ENTER_P?"p":"div"),f.selectRanges(b)}for(var j=
    +f.createBookmarks(!0),i=[],h={},b=b.createIterator(),g=0;(e=b.getNextRange())&&++g;){var a=e.getBoundaryNodes(),d=a.startNode,m=a.endNode;d.type==CKEDITOR.NODE_ELEMENT&&"td"==d.getName()&&e.setStartAt(a.startNode,CKEDITOR.POSITION_AFTER_START);m.type==CKEDITOR.NODE_ELEMENT&&"td"==m.getName()&&e.setEndAt(a.endNode,CKEDITOR.POSITION_BEFORE_END);e=e.createIterator();for(e.forceBrBreak=this.state==CKEDITOR.TRISTATE_OFF;a=e.getNextParagraph();)if(!a.getCustomData("list_block")){CKEDITOR.dom.element.setMarker(h,
    +a,"list_block",1);for(var k=c.elementPath(a),d=k.elements,m=0,k=k.blockLimit,n,l=d.length-1;0<=l&&(n=d[l]);l--)if(r[n.getName()]&&k.contains(n)){k.removeCustomData("list_group_object_"+g);(d=n.getCustomData("list_group_object"))?d.contents.push(a):(d={root:n,contents:[a]},i.push(d),CKEDITOR.dom.element.setMarker(h,n,"list_group_object",d));m=1;break}m||(m=k,m.getCustomData("list_group_object_"+g)?m.getCustomData("list_group_object_"+g).contents.push(a):(d={root:m,contents:[a]},CKEDITOR.dom.element.setMarker(h,
    +m,"list_group_object_"+g,d),i.push(d)))}}for(n=[];0<i.length;)if(d=i.shift(),this.state==CKEDITOR.TRISTATE_OFF)if(r[d.root.getName()]){a=c;b=d;d=h;g=n;m=CKEDITOR.plugins.list.listToArray(b.root,d);k=[];for(e=0;e<b.contents.length;e++)if(l=b.contents[e],(l=l.getAscendant("li",!0))&&!l.getCustomData("list_item_processed"))k.push(l),CKEDITOR.dom.element.setMarker(d,l,"list_item_processed",!0);for(var l=b.root.getDocument(),p=void 0,o=void 0,e=0;e<k.length;e++){var s=k[e].getCustomData("listarray_index"),
    +p=m[s].parent;p.is(this.type)||(o=l.createElement(this.type),p.copyAttributes(o,{start:1,type:1}),o.removeStyle("list-style-type"),m[s].parent=o)}a=CKEDITOR.plugins.list.arrayToList(m,d,null,a.config.enterMode);d=void 0;m=a.listNode.getChildCount();for(e=0;e<m&&(d=a.listNode.getChild(e));e++)d.getName()==this.type&&g.push(d);a.listNode.replace(b.root)}else{m=c;a=d;e=n;k=a.contents;b=a.root.getDocument();g=[];1==k.length&&k[0].equals(a.root)&&(d=b.createElement("div"),k[0].moveChildren&&k[0].moveChildren(d),
    +k[0].append(d),k[0]=d);a=a.contents[0].getParent();for(l=0;l<k.length;l++)a=a.getCommonAncestor(k[l].getParent());p=m.config.useComputedState;m=d=void 0;p=void 0===p||p;for(l=0;l<k.length;l++)for(o=k[l];s=o.getParent();){if(s.equals(a)){g.push(o);!m&&o.getDirection()&&(m=1);o=o.getDirection(p);null!==d&&(d=d&&d!=o?null:o);break}o=s}if(!(1>g.length)){k=g[g.length-1].getNext();l=b.createElement(this.type);e.push(l);for(p=e=void 0;g.length;)e=g.shift(),p=b.createElement("li"),e.is("pre")||G.test(e.getName())?
    +e.appendTo(p):(e.copyAttributes(p),d&&e.getDirection()&&(p.removeStyle("direction"),p.removeAttribute("dir")),e.moveChildren(p),e.remove()),p.appendTo(l);d&&m&&l.setAttribute("dir",d);k?l.insertBefore(k):l.appendTo(a)}}else this.state==CKEDITOR.TRISTATE_ON&&r[d.root.getName()]&&C.call(this,c,d,h);for(l=0;l<n.length;l++)A(n[l]);CKEDITOR.dom.element.clearAllMarkers(h);f.selectBookmarks(j);c.focus()},refresh:function(c,j){var f=j.contains(r,1),b=j.blockLimit||j.root;f&&b.contains(f)?this.setState(f.is(this.type)?
    +CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.plugins.add("list",{requires:"indent",init:function(c){c.blockless||(c.addCommand("numberedlist",new x("numberedlist","ol")),c.addCommand("bulletedlist",new x("bulletedlist","ul")),c.ui.addButton&&(c.ui.addButton("NumberedList",{label:c.lang.list.numberedlist,command:"numberedlist",directional:!0,toolbar:"list,10"}),c.ui.addButton("BulletedList",{label:c.lang.list.bulletedlist,command:"bulletedlist",directional:!0,
    +toolbar:"list,20"})),c.on("key",function(j){var f=j.data.keyCode;if(c.mode=="wysiwyg"&&f in{8:1,46:1}){var b=c.getSelection().getRanges()[0],i=b.startPath();if(b.collapsed){var i=new CKEDITOR.dom.elementPath(b.startContainer),e=f==8,h=c.editable(),g=new CKEDITOR.dom.walker(b.clone());g.evaluator=function(a){return q(a)&&!u(a)};g.guard=function(a,b){return!(b&&a.type==CKEDITOR.NODE_ELEMENT&&a.is("table"))};f=b.clone();if(e){var a,d;if((a=i.contains(r))&&b.checkBoundaryOfElement(a,CKEDITOR.START)&&
    +(a=a.getParent())&&a.is("li")&&(a=w(a))){d=a;a=a.getPrevious(q);f.moveToPosition(a&&u(a)?a:d,CKEDITOR.POSITION_BEFORE_START)}else{g.range.setStartAt(h,CKEDITOR.POSITION_AFTER_START);g.range.setEnd(b.startContainer,b.startOffset);if((a=g.previous())&&a.type==CKEDITOR.NODE_ELEMENT&&(a.getName()in r||a.is("li"))){if(!a.is("li")){g.range.selectNodeContents(a);g.reset();g.evaluator=B;a=g.previous()}d=a;f.moveToElementEditEnd(d)}}if(d){v(c,f,b);j.cancel()}else if((f=i.contains(r))&&b.checkBoundaryOfElement(f,
    +CKEDITOR.START)){d=f.getFirst(q);if(b.checkBoundaryOfElement(d,CKEDITOR.START)){a=f.getPrevious(q);if(w(d)){if(a){b.moveToElementEditEnd(a);b.select()}}else c.execCommand("outdent");j.cancel()}}}else if(d=i.contains("li")){g.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);h=(i=d.getLast(q))&&B(i)?i:d;d=0;if((a=g.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in r&&a.equals(i)){d=1;a=g.next()}else b.checkBoundaryOfElement(h,CKEDITOR.END)&&(d=1);if(d&&a){b=b.clone();b.moveToElementEditStart(a);v(c,
    +f,b);j.cancel()}}else{g.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);if((a=g.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.is(r)){a=a.getFirst(q);if(i.block&&b.checkStartOfBlock()&&b.checkEndOfBlock()){i.block.remove();b.moveToElementEditStart(a);b.select()}else if(w(a)){b.moveToElementEditStart(a);b.select()}else{b=b.clone();b.moveToElementEditStart(a);v(c,f,b)}j.cancel()}}setTimeout(function(){c.selectionChange(1)})}}}))}})})();(function(){function p(d,i){this.name=i;var a=this.useIndentClasses=d.config.indentClasses&&0<d.config.indentClasses.length;if(a){this.classNameRegex=RegExp("(?:^|\\s+)("+d.config.indentClasses.join("|")+")(?=$|\\s)");this.indentClassMap={};for(var f=0;f<d.config.indentClasses.length;f++)this.indentClassMap[d.config.indentClasses[f]]=f+1}this.startDisabled="outdent"==i;this.allowedContent={"div h1 h2 h3 h4 h5 h6 ol p pre ul":{propertiesOnly:!0,styles:!a?"margin-left,margin-right":null,classes:a?d.config.indentClasses:
    +null}};this.requiredContent=["p"+(a?"("+d.config.indentClasses[0]+")":"{margin-left}"),"li"]}function r(d,i){return"ltr"==(i||d.getComputedStyle("direction"))?"margin-left":"margin-right"}function q(d){return d.type==CKEDITOR.NODE_ELEMENT&&d.is("li")}var m={ol:1,ul:1},t=CKEDITOR.dom.walker.whitespaces(!0),u=CKEDITOR.dom.walker.bookmark(!1,!0);p.prototype={context:"p",refresh:function(d,i){var a=i&&i.contains(m),f=i.block||i.blockLimit;a?this.setState(CKEDITOR.TRISTATE_OFF):!this.useIndentClasses&&
    +"indent"==this.name?this.setState(CKEDITOR.TRISTATE_OFF):f?this.useIndentClasses?(a=f.$.className.match(this.classNameRegex),f=0,a&&(a=a[1],f=this.indentClassMap[a]),"outdent"==this.name&&!f||"indent"==this.name&&f==d.config.indentClasses.length?this.setState(CKEDITOR.TRISTATE_DISABLED):this.setState(CKEDITOR.TRISTATE_OFF)):(a=parseInt(f.getStyle(r(f)),10),isNaN(a)&&(a=0),0>=a?this.setState(CKEDITOR.TRISTATE_DISABLED):this.setState(CKEDITOR.TRISTATE_OFF)):this.setState(CKEDITOR.TRISTATE_DISABLED)},
    +exec:function(d){function i(n){for(var j=l.startContainer,b=l.endContainer;j&&!j.getParent().equals(n);)j=j.getParent();for(;b&&!b.getParent().equals(n);)b=b.getParent();if(j&&b){for(var c=j,j=[],a=!1;!a;)c.equals(b)&&(a=!0),j.push(c),c=c.getNext();if(!(1>j.length)){c=n.getParents(!0);for(b=0;b<c.length;b++)if(c[b].getName&&m[c[b].getName()]){n=c[b];break}for(var c="indent"==e.name?1:-1,b=j[0],j=j[j.length-1],a=CKEDITOR.plugins.list.listToArray(n,o),f=a[j.getCustomData("listarray_index")].indent,
    +b=b.getCustomData("listarray_index");b<=j.getCustomData("listarray_index");b++)if(a[b].indent+=c,0<c){var k=a[b].parent;a[b].parent=new CKEDITOR.dom.element(k.getName(),k.getDocument())}for(b=j.getCustomData("listarray_index")+1;b<a.length&&a[b].indent>f;b++)a[b].indent+=c;j=CKEDITOR.plugins.list.arrayToList(a,o,null,d.config.enterMode,n.getDirection());if("outdent"==e.name){var i;if((i=n.getParent())&&i.is("li"))for(var c=j.listNode.getChildren(),h=[],g,b=c.count()-1;0<=b;b--)(g=c.getItem(b))&&(g.is&&
    +g.is("li"))&&h.push(g)}j&&j.listNode.replace(n);if(h&&h.length)for(b=0;b<h.length;b++){for(g=n=h[b];(g=g.getNext())&&g.is&&g.getName()in m;)CKEDITOR.env.ie&&!n.getFirst(function(b){return t(b)&&u(b)})&&n.append(l.document.createText("聽")),n.append(g);n.insertAfter(i)}}}}function a(){var a=l.createIterator(),e=d.config.enterMode;a.enforceRealBlocks=!0;a.enlargeBr=e!=CKEDITOR.ENTER_BR;for(var b;b=a.getNextParagraph(e==CKEDITOR.ENTER_P?"p":"div");)f(b)}function f(a,g){if(a.getCustomData("indent_processed"))return!1;
    +if(e.useIndentClasses){var b=a.$.className.match(e.classNameRegex),c=0;b&&(b=b[1],c=e.indentClassMap[b]);"outdent"==e.name?c--:c++;if(0>c)return!1;c=Math.min(c,d.config.indentClasses.length);c=Math.max(c,0);a.$.className=CKEDITOR.tools.ltrim(a.$.className.replace(e.classNameRegex,""));0<c&&a.addClass(d.config.indentClasses[c-1])}else{b=r(a,g);c=parseInt(a.getStyle(b),10);isNaN(c)&&(c=0);var f=d.config.indentOffset||40,c=c+("indent"==e.name?1:-1)*f;if(0>c)return!1;c=Math.max(c,0);c=Math.ceil(c/f)*
    +f;a.setStyle(b,c?c+(d.config.indentUnit||"px"):"");""===a.getAttribute("style")&&a.removeAttribute("style")}CKEDITOR.dom.element.setMarker(o,a,"indent_processed",1);return!0}for(var e=this,o={},g=d.getSelection(),v=g.createBookmarks(1),l,p=(g&&g.getRanges(1)).createIterator();l=p.getNextRange();){for(var h=l.getCommonAncestor();h&&!(h.type==CKEDITOR.NODE_ELEMENT&&m[h.getName()]);)h=h.getParent();if(!h){var k=l.getEnclosedNode();k&&(k.type==CKEDITOR.NODE_ELEMENT&&k.getName()in m)&&(l.setStartAt(k,
    +CKEDITOR.POSITION_AFTER_START),l.setEndAt(k,CKEDITOR.POSITION_BEFORE_END),h=k)}h&&(l.startContainer.type==CKEDITOR.NODE_ELEMENT&&l.startContainer.getName()in m)&&(k=new CKEDITOR.dom.walker(l),k.evaluator=q,l.startContainer=k.next());h&&(l.endContainer.type==CKEDITOR.NODE_ELEMENT&&l.endContainer.getName()in m)&&(k=new CKEDITOR.dom.walker(l),k.evaluator=q,l.endContainer=k.previous());if(h){var k=h.getFirst(q),w=!!k.getNext(q),s=l.startContainer;(!k.equals(s)&&!k.contains(s)||!("indent"==e.name||e.useIndentClasses||
    +parseInt(h.getStyle(r(h)),10))||!f(h,!w&&k.getDirection()))&&i(h)}else a()}CKEDITOR.dom.element.clearAllMarkers(o);d.forceNextSelectionCheck();g.selectBookmarks(v)}};CKEDITOR.plugins.add("indent",{requires:"list",onLoad:function(){(CKEDITOR.env.ie6Compat||CKEDITOR.env.ie7Compat)&&CKEDITOR.addCss(".cke_editable ul,.cke_editable ol{\tmargin-left: 0px;\tpadding-left: 40px;}")},init:function(d){d.blockless||(d.addCommand("indent",new p(d,"indent")),d.addCommand("outdent",new p(d,"outdent")),d.ui.addButton&&
    +(d.ui.addButton("Indent",{label:d.lang.indent.indent,command:"indent",directional:!0,toolbar:"indent,20"}),d.ui.addButton("Outdent",{label:d.lang.indent.outdent,command:"outdent",directional:!0,toolbar:"indent,10"})),d.on("dirChanged",function(i){var a=d.createRange();a.setStartBefore(i.data.node);a.setEndAfter(i.data.node);for(var f=new CKEDITOR.dom.walker(a),e;e=f.next();)if(e.type==CKEDITOR.NODE_ELEMENT)if(!e.equals(i.data.node)&&e.getDirection()){a.setStartAfter(e);f=new CKEDITOR.dom.walker(a)}else{var o=
    +d.config.indentClasses;if(o)for(var g=i.data.dir=="ltr"?["_rtl",""]:["","_rtl"],m=0;m<o.length;m++)if(e.hasClass(o[m]+g[0])){e.removeClass(o[m]+g[0]);e.addClass(o[m]+g[1])}o=e.getStyle("margin-right");g=e.getStyle("margin-left");o?e.setStyle("margin-left",o):e.removeStyle("margin-left");g?e.setStyle("margin-right",g):e.removeStyle("margin-right")}}))}})})();(function(){function m(a,d,b){b=a.config.forceEnterMode||b;if("wysiwyg"!=a.mode)return!1;d||(d=a.config.enterMode);a.elementPath().isContextFor("p")||(d=CKEDITOR.ENTER_BR,b=1);a.fire("saveSnapshot");d==CKEDITOR.ENTER_BR?n(a,d,null,b):o(a,d,null,b);a.fire("saveSnapshot");return!0}function p(a){for(var a=a.getSelection().getRanges(!0),d=a.length-1;0<d;d--)a[d].deleteContents();return a[0]}CKEDITOR.plugins.add("enterkey",{requires:"indent",init:function(a){a.addCommand("enter",{modes:{wysiwyg:1},editorFocus:!1,
    +exec:function(a){m(a)}});a.addCommand("shiftEnter",{modes:{wysiwyg:1},editorFocus:!1,exec:function(a){"wysiwyg"==a.mode&&m(a,a.config.shiftEnterMode,1)}});a.setKeystroke([[13,"enter"],[CKEDITOR.SHIFT+13,"shiftEnter"]])}});var s=CKEDITOR.dom.walker.whitespaces(),t=CKEDITOR.dom.walker.bookmark();CKEDITOR.plugins.enterkey={enterBlock:function(a,d,b,i){if(b=b||p(a)){var f=b.document,j=b.checkStartOfBlock(),h=b.checkEndOfBlock(),c=a.elementPath(b.startContainer).block;if(j&&h){if(c&&(c.is("li")||c.getParent().is("li"))){a.execCommand("outdent");
    +return}if(c&&c.getParent().is("blockquote")){c.breakParent(c.getParent());c.getPrevious().getFirst(CKEDITOR.dom.walker.invisible(1))||c.getPrevious().remove();c.getNext().getFirst(CKEDITOR.dom.walker.invisible(1))||c.getNext().remove();b.moveToElementEditStart(c);b.select();return}}else if(c&&c.is("pre")&&!h){n(a,d,b,i);return}var c=d==CKEDITOR.ENTER_DIV?"div":"p",l=b.splitBlock(c);if(l){var d=l.previousBlock,a=l.nextBlock,j=l.wasStartOfBlock,h=l.wasEndOfBlock,g;if(a)g=a.getParent(),g.is("li")&&(a.breakParent(g),
    +a.move(a.getNext(),1));else if(d&&(g=d.getParent())&&g.is("li"))d.breakParent(g),g=d.getNext(),b.moveToElementEditStart(g),d.move(d.getPrevious());if(!j&&!h){if(a.is("li")){var e=b.clone();e.selectNodeContents(a);e=new CKEDITOR.dom.walker(e);e.evaluator=function(a){return!(t(a)||s(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in CKEDITOR.dtd.$inline&&!(a.getName()in CKEDITOR.dtd.$empty))};(g=e.next())&&(g.type==CKEDITOR.NODE_ELEMENT&&g.is("ul","ol"))&&(CKEDITOR.env.ie?f.createText("聽"):f.createElement("br")).insertBefore(g)}a&&
    +b.moveToElementEditStart(a)}else{var k;if(d){if(d.is("li")||!q.test(d.getName())&&!d.is("pre"))e=d.clone()}else a&&(e=a.clone());e?i&&!e.is("li")&&e.renameNode(c):g&&g.is("li")?e=g:(e=f.createElement(c),d&&(k=d.getDirection())&&e.setAttribute("dir",k));if(f=l.elementPath){i=0;for(g=f.elements.length;i<g;i++){k=f.elements[i];if(k.equals(f.block)||k.equals(f.blockLimit))break;CKEDITOR.dtd.$removeEmpty[k.getName()]&&(k=k.clone(),e.moveChildren(k),e.append(k))}}CKEDITOR.env.ie||e.appendBogus();e.getParent()||
    +b.insertNode(e);e.is("li")&&e.removeAttribute("value");if(CKEDITOR.env.ie&&j&&(!h||!d.getChildCount()))b.moveToElementEditStart(h?d:e),b.select();b.moveToElementEditStart(j&&!h?a:e)}b.select();b.scrollIntoView()}}},enterBr:function(a,d,b,i){if(b=b||p(a)){var f=b.document,j=b.checkEndOfBlock(),h=new CKEDITOR.dom.elementPath(a.getSelection().getStartElement()),c=h.block,h=c&&h.block.getName();!i&&"li"==h?o(a,d,b,i):(!i&&j&&q.test(h)?(j=c.getDirection())?(f=f.createElement("div"),f.setAttribute("dir",
    +j),f.insertAfter(c),b.setStart(f,0)):(f.createElement("br").insertAfter(c),CKEDITOR.env.gecko&&f.createText("").insertAfter(c),b.setStartAt(c.getNext(),CKEDITOR.env.ie?CKEDITOR.POSITION_BEFORE_START:CKEDITOR.POSITION_AFTER_START)):(c="pre"==h&&CKEDITOR.env.ie&&8>CKEDITOR.env.version?f.createText("\r"):f.createElement("br"),b.deleteContents(),b.insertNode(c),CKEDITOR.env.ie?b.setStartAt(c,CKEDITOR.POSITION_AFTER_END):(f.createText("锘").insertAfter(c),j&&c.getParent().appendBogus(),c.getNext().$.nodeValue=
    +"",b.setStartAt(c.getNext(),CKEDITOR.POSITION_AFTER_START))),b.collapse(!0),b.select(),b.scrollIntoView())}}};var r=CKEDITOR.plugins.enterkey,n=r.enterBr,o=r.enterBlock,q=/^h[1-6]$/})();(function(){function j(a,b){var d={},e=[],f={nbsp:"聽",shy:"颅",gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},a=a.replace(/\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g,function(a,h){var c=b?"&"+h+";":f[h];d[c]=b?f[h]:"&"+h+";";e.push(c);return""});if(!b&&a){var a=a.split(","),c=document.createElement("div"),g;c.innerHTML="&"+a.join(";&")+";";g=c.innerHTML;c=null;for(c=0;c<g.length;c++){var i=g.charAt(c);d[i]="&"+a[c]+";";e.push(i)}}d.regex=e.join(b?"|":"");return d}CKEDITOR.plugins.add("entities",{afterInit:function(a){var b=
    +a.config;if(a=(a=a.dataProcessor)&&a.htmlFilter){var d=[];!1!==b.basicEntities&&d.push("nbsp,gt,lt,amp");b.entities&&(d.length&&d.push("quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,euro"),
    +b.entities_latin&&d.push("Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,OElig,oelig,Scaron,scaron,Yuml"),b.entities_greek&&d.push("Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,upsih,piv"),
    +b.entities_additional&&d.push(b.entities_additional));var e=j(d.join(",")),f=e.regex?"["+e.regex+"]":"a^";delete e.regex;b.entities&&b.entities_processNumerical&&(f="[^ -~]|"+f);var f=RegExp(f,"g"),c=function(a){return b.entities_processNumerical=="force"||!e[a]?"&#"+a.charCodeAt(0)+";":e[a]},g=j("nbsp,gt,lt,amp,shy",!0),i=RegExp(g.regex,"g"),k=function(a){return g[a]};a.addRules({text:function(a){return a.replace(i,k).replace(f,c)}})}}})})();CKEDITOR.config.basicEntities=!0;
    +CKEDITOR.config.entities=!0;CKEDITOR.config.entities_latin=!0;CKEDITOR.config.entities_greek=!0;CKEDITOR.config.entities_additional="#39";CKEDITOR.plugins.add("popup");
    +CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{popup:function(e,a,b,d){a=a||"80%";b=b||"70%";"string"==typeof a&&(1<a.length&&"%"==a.substr(a.length-1,1))&&(a=parseInt(window.screen.width*parseInt(a,10)/100,10));"string"==typeof b&&(1<b.length&&"%"==b.substr(b.length-1,1))&&(b=parseInt(window.screen.height*parseInt(b,10)/100,10));640>a&&(a=640);420>b&&(b=420);var f=parseInt((window.screen.height-b)/2,10),g=parseInt((window.screen.width-a)/2,10),d=(d||"location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes")+",width="+
    +a+",height="+b+",top="+f+",left="+g,c=window.open("",null,d,!0);if(!c)return!1;try{-1==navigator.userAgent.toLowerCase().indexOf(" chrome/")&&(c.moveTo(g,f),c.resizeTo(a,b)),c.focus(),c.location.href=e}catch(h){window.open(e,null,d,!0)}return!0}});(function(){function g(a,c){var d=[];if(c)for(var b in c)d.push(b+"="+encodeURIComponent(c[b]));else return a;return a+(-1!=a.indexOf("?")?"&":"?")+d.join("&")}function i(a){a+="";return a.charAt(0).toUpperCase()+a.substr(1)}function k(){var a=this.getDialog(),c=a.getParentEditor();c._.filebrowserSe=this;var d=c.config["filebrowser"+i(a.getName())+"WindowWidth"]||c.config.filebrowserWindowWidth||"80%",a=c.config["filebrowser"+i(a.getName())+"WindowHeight"]||c.config.filebrowserWindowHeight||"70%",
    +b=this.filebrowser.params||{};b.CKEditor=c.name;b.CKEditorFuncNum=c._.filebrowserFn;b.langCode||(b.langCode=c.langCode);b=g(this.filebrowser.url,b);c.popup(b,d,a,c.config.filebrowserWindowFeatures||c.config.fileBrowserWindowFeatures)}function l(){var a=this.getDialog();a.getParentEditor()._.filebrowserSe=this;return!a.getContentElement(this["for"][0],this["for"][1]).getInputElement().$.value||!a.getContentElement(this["for"][0],this["for"][1]).getAction()?!1:!0}function m(a,c,d){var b=d.params||{};
    +b.CKEditor=a.name;b.CKEditorFuncNum=a._.filebrowserFn;b.langCode||(b.langCode=a.langCode);c.action=g(d.url,b);c.filebrowser=d}function j(a,c,d,b){if(b&&b.length)for(var e,g=b.length;g--;)if(e=b[g],("hbox"==e.type||"vbox"==e.type||"fieldset"==e.type)&&j(a,c,d,e.children),e.filebrowser)if("string"==typeof e.filebrowser&&(e.filebrowser={action:"fileButton"==e.type?"QuickUpload":"Browse",target:e.filebrowser}),"Browse"==e.filebrowser.action){var f=e.filebrowser.url;void 0===f&&(f=a.config["filebrowser"+
    +i(c)+"BrowseUrl"],void 0===f&&(f=a.config.filebrowserBrowseUrl));f&&(e.onClick=k,e.filebrowser.url=f,e.hidden=!1)}else if("QuickUpload"==e.filebrowser.action&&e["for"]&&(f=e.filebrowser.url,void 0===f&&(f=a.config["filebrowser"+i(c)+"UploadUrl"],void 0===f&&(f=a.config.filebrowserUploadUrl)),f)){var h=e.onClick;e.onClick=function(a){var b=a.sender;return h&&h.call(b,a)===false?false:l.call(b,a)};e.filebrowser.url=f;e.hidden=!1;m(a,d.getContents(e["for"][0]).get(e["for"][1]),e.filebrowser)}}function h(a,
    +c,d){if(-1!==d.indexOf(";")){for(var d=d.split(";"),b=0;b<d.length;b++)if(h(a,c,d[b]))return!0;return!1}return(a=a.getContents(c).get(d).filebrowser)&&a.url}function n(a,c){var d=this._.filebrowserSe.getDialog(),b=this._.filebrowserSe["for"],e=this._.filebrowserSe.filebrowser.onSelect;b&&d.getContentElement(b[0],b[1]).reset();if(!("function"==typeof c&&!1===c.call(this._.filebrowserSe))&&!(e&&!1===e.call(this._.filebrowserSe,a,c))&&("string"==typeof c&&c&&alert(c),a&&(b=this._.filebrowserSe,d=b.getDialog(),
    +b=b.filebrowser.target||null)))if(b=b.split(":"),e=d.getContentElement(b[0],b[1]))e.setValue(a),d.selectPage(b[0])}CKEDITOR.plugins.add("filebrowser",{requires:"popup",init:function(a){a._.filebrowserFn=CKEDITOR.tools.addFunction(n,a);a.on("destroy",function(){CKEDITOR.tools.removeFunction(this._.filebrowserFn)})}});CKEDITOR.on("dialogDefinition",function(a){for(var c=a.data.definition,d,b=0;b<c.contents.length;++b)if(d=c.contents[b])j(a.editor,a.data.name,c,d.elements),d.hidden&&d.filebrowser&&(d.hidden=
    +!h(c,d.id,d.filebrowser))})})();CKEDITOR.plugins.add("find",{requires:"dialog",init:function(a){var b=a.addCommand("find",new CKEDITOR.dialogCommand("find"));b.canUndo=!1;b.readOnly=1;a.addCommand("replace",new CKEDITOR.dialogCommand("replace")).canUndo=!1;a.ui.addButton&&(a.ui.addButton("Find",{label:a.lang.find.find,command:"find",toolbar:"find,10"}),a.ui.addButton("Replace",{label:a.lang.find.replace,command:"replace",toolbar:"find,20"}));CKEDITOR.dialog.add("find",this.path+"dialogs/find.js");CKEDITOR.dialog.add("replace",this.path+
    +"dialogs/find.js")}});CKEDITOR.config.find_highlight={element:"span",styles:{"background-color":"#004",color:"#fff"}};(function(){function g(a,b){var c=j.exec(a),d=j.exec(b);if(c){if(!c[2]&&"px"==d[2])return d[1];if("px"==c[2]&&!d[2])return d[1]+"px"}return b}var i=CKEDITOR.htmlParser.cssStyle,h=CKEDITOR.tools.cssLength,j=/^((?:\d*(?:\.\d+))|(?:\d+))(.*)?$/i,l={elements:{$:function(a){var b=a.attributes;if((b=(b=(b=b&&b["data-cke-realelement"])&&new CKEDITOR.htmlParser.fragment.fromHtml(decodeURIComponent(b)))&&b.children[0])&&a.attributes["data-cke-resizable"]){var c=(new i(a)).rules,a=b.attributes,d=c.width,c=
    +c.height;d&&(a.width=g(a.width,d));c&&(a.height=g(a.height,c))}return b}}},k=CKEDITOR.plugins.add("fakeobjects",{afterInit:function(a){(a=(a=a.dataProcessor)&&a.htmlFilter)&&a.addRules(l)}});CKEDITOR.editor.prototype.createFakeElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,b={"class":b,"data-cke-realelement":encodeURIComponent(a.getOuterHtml()),"data-cke-real-node-type":a.type,alt:e,title:e,align:a.getAttribute("align")||""};CKEDITOR.env.hc||(b.src=CKEDITOR.getUrl(k.path+
    +"images/spacer.gif"));c&&(b["data-cke-real-element-type"]=c);d&&(b["data-cke-resizable"]=d,c=new i,d=a.getAttribute("width"),a=a.getAttribute("height"),d&&(c.rules.width=h(d)),a&&(c.rules.height=h(a)),c.populate(b));return this.document.createElement("img",{attributes:b})};CKEDITOR.editor.prototype.createFakeParserElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,f;f=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(f);f=f.getHtml();b={"class":b,"data-cke-realelement":encodeURIComponent(f),
    +"data-cke-real-node-type":a.type,alt:e,title:e,align:a.attributes.align||""};CKEDITOR.env.hc||(b.src=CKEDITOR.getUrl(k.path+"images/spacer.gif"));c&&(b["data-cke-real-element-type"]=c);d&&(b["data-cke-resizable"]=d,d=a.attributes,a=new i,c=d.width,d=d.height,void 0!=c&&(a.rules.width=h(c)),void 0!=d&&(a.rules.height=h(d)),a.populate(b));return new CKEDITOR.htmlParser.element("img",b)};CKEDITOR.editor.prototype.restoreRealElement=function(a){if(a.data("cke-real-node-type")!=CKEDITOR.NODE_ELEMENT)return null;
    +var b=CKEDITOR.dom.element.createFromHtml(decodeURIComponent(a.data("cke-realelement")),this.document);if(a.data("cke-resizable")){var c=a.getStyle("width"),a=a.getStyle("height");c&&b.setAttribute("width",g(b.getAttribute("width"),c));a&&b.setAttribute("height",g(b.getAttribute("height"),a))}return b}})();(function(){function d(a){a=a.attributes;return"application/x-shockwave-flash"==a.type||f.test(a.src||"")}function e(a,b){return a.createFakeParserElement(b,"cke_flash","flash",!0)}var f=/\.swf(?:$|\?)/i;CKEDITOR.plugins.add("flash",{requires:"dialog,fakeobjects",onLoad:function(){CKEDITOR.addCss("img.cke_flash{background-image: url("+CKEDITOR.getUrl(this.path+"images/placeholder.png")+");background-position: center center;background-repeat: no-repeat;border: 1px solid #a9a9a9;width: 80px;height: 80px;}")},
    +init:function(a){var b="object[classid,codebase,height,hspace,vspace,width];param[name,value];embed[height,hspace,pluginspage,src,type,vspace,width]";CKEDITOR.dialog.isTabEnabled(a,"flash","properties")&&(b+=";object[align]; embed[allowscriptaccess,quality,scale,wmode]");CKEDITOR.dialog.isTabEnabled(a,"flash","advanced")&&(b+=";object[id]{*}; embed[bgcolor]{*}(*)");a.addCommand("flash",new CKEDITOR.dialogCommand("flash",{allowedContent:b,requiredContent:"embed"}));a.ui.addButton&&a.ui.addButton("Flash",
    +{label:a.lang.common.flash,command:"flash",toolbar:"insert,20"});CKEDITOR.dialog.add("flash",this.path+"dialogs/flash.js");a.addMenuItems&&a.addMenuItems({flash:{label:a.lang.flash.properties,command:"flash",group:"flash"}});a.on("doubleclick",function(a){var b=a.data.element;b.is("img")&&"flash"==b.data("cke-real-element-type")&&(a.data.dialog="flash")});a.contextMenu&&a.contextMenu.addListener(function(a){if(a&&a.is("img")&&!a.isReadOnly()&&"flash"==a.data("cke-real-element-type"))return{flash:CKEDITOR.TRISTATE_OFF}})},
    +afterInit:function(a){var b=a.dataProcessor;(b=b&&b.dataFilter)&&b.addRules({elements:{"cke:object":function(b){var c=b.attributes;if((!c.classid||!(""+c.classid).toLowerCase())&&!d(b)){for(c=0;c<b.children.length;c++)if("cke:embed"==b.children[c].name){if(!d(b.children[c]))break;return e(a,b)}return null}return e(a,b)},"cke:embed":function(b){return!d(b)?null:e(a,b)}}},5)}})})();CKEDITOR.tools.extend(CKEDITOR.config,{flashEmbedTagOnly:!1,flashAddEmbedTag:!0,flashConvertOnEdit:!1});(function(){function t(a){var e="left"==a?"pageXOffset":"pageYOffset";return e in g.$?g.$[e]:CKEDITOR.document.$.documentElement["left"==a?"scrollLeft":"scrollTop"]}function p(a){var e,f=a.config,p=f.floatSpaceDockedOffsetX||0,o=f.floatSpaceDockedOffsetY||0,u=f.floatSpacePinnedOffsetX||0,q=f.floatSpacePinnedOffsetY||0,i=function(c){function f(a,c,b){d.setStyle(c,s(b));d.setStyle("position",a)}function j(a){var c=r.getDocumentPosition();switch(a){case "top":f("absolute","top",c.y-l-o);break;case "pin":f("fixed",
    +"top",q);break;case "bottom":f("absolute","top",c.y+(b.height||b.bottom-b.top)+o)}e=a}var r=a.editable();if(r){"focus"==c.name&&d.show();d.removeStyle("left");d.removeStyle("right");var k=d.getClientRect(),b=r.getClientRect(),l=k.height,n=t("left");if(e){"top"==e&&k.top<q?j("pin"):"pin"==e?b.top>o+l?j("top"):b.bottom-k.bottom<l&&j("bottom"):"bottom"==e&&(b.top>o+l?j("top"):b.bottom>2*l+q&&j("pin"));var c=g.getViewPaneSize(),h=c.width/2,h=0<b.left&&b.right<c.width&&b.width>k.width?"rtl"==a.config.contentsLangDirection?
    +"right":"left":h-b.left>b.right-h?"left":"right",m;k.width>c.width?(h="left",m=0):(m="left"==h?0<b.left?b.left:0:b.right<c.width?c.width-b.right:0,m+k.width>c.width&&(h="left"==h?"right":"left",m=0));d.setStyle(h,s(("pin"==e?u:p)+m+("pin"==e?0:"left"==h?n:-n)))}else e="pin",j("pin"),i(c)}},f=CKEDITOR.document.getBody(),v={id:a.id,name:a.name,langDir:a.lang.dir,langCode:a.langCode},n=a.fire("uiSpace",{space:"top",html:""}).html;if(n){var d=f.append(CKEDITOR.dom.element.createFromHtml(w.output(CKEDITOR.tools.extend({topId:a.ui.spaceId("top"),
    +content:n,style:"display:none;z-index:"+(a.config.baseFloatZIndex-1)},v))));d.unselectable();d.on("mousedown",function(a){a=a.data;a.getTarget().hasAscendant("a",1)||a.preventDefault()});a.on("focus",function(a){i(a);g.on("scroll",i);g.on("resize",i)});a.on("blur",function(){d.hide();g.removeListener("scroll",i);g.removeListener("resize",i)});a.on("destroy",function(){g.removeListener("scroll",i);g.removeListener("resize",i);d.clearCustomData();d.remove()});a.focusManager.hasFocus&&d.show();a.focusManager.add(d,
    +1)}}var w=CKEDITOR.addTemplate("floatcontainer",'<div id="cke_{name}" class="cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_float cke_{langDir} '+CKEDITOR.env.cssClass+'" dir="{langDir}" title="'+(CKEDITOR.env.gecko?" ":"")+'" lang="{langCode}" role="application" style="{style}"><div class="cke_inner"><div id="{topId}" class="cke_top" role="presentation">{content}</div></div></div>');CKEDITOR.plugins.add("floatingspace",{init:function(a){a.on("loaded",function(){p(a)},null,null,20)}});var g=
    +CKEDITOR.document.getWindow(),s=CKEDITOR.tools.cssLength})();CKEDITOR.plugins.add("listblock",{requires:"panel",onLoad:function(){var e=CKEDITOR.addTemplate("panel-list",'<ul role="presentation" class="cke_panel_list">{items}</ul>'),f=CKEDITOR.addTemplate("panel-list-item",'<li id="{id}" class="cke_panel_listItem" role=presentation><a id="{id}_option" _cke_focus=1 hidefocus=true title="{title}" href="javascript:void(\'{val}\')"  {onclick}="CKEDITOR.tools.callFunction({clickFn},\'{val}\'); return false;" role="option">{text}</a></li>'),g=CKEDITOR.addTemplate("panel-list-group",
    +'<h1 id="{id}" class="cke_panel_grouptitle" role="presentation" >{label}</h1>');CKEDITOR.ui.panel.prototype.addListBlock=function(a,b){return this.addBlock(a,new CKEDITOR.ui.listBlock(this.getHolderElement(),b))};CKEDITOR.ui.listBlock=CKEDITOR.tools.createClass({base:CKEDITOR.ui.panel.block,$:function(a,b){var b=b||{},c=b.attributes||(b.attributes={});(this.multiSelect=!!b.multiSelect)&&(c["aria-multiselectable"]=!0);!c.role&&(c.role="listbox");this.base.apply(this,arguments);this.element.setAttribute("role",
    +c.role);c=this.keys;c[40]="next";c[9]="next";c[38]="prev";c[CKEDITOR.SHIFT+9]="prev";c[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(c[13]="mouseup");this._.pendingHtml=[];this._.pendingList=[];this._.items={};this._.groups={}},_:{close:function(){if(this._.started){var a=e.output({items:this._.pendingList.join("")});this._.pendingList=[];this._.pendingHtml.push(a);delete this._.started}},getClick:function(){this._.click||(this._.click=CKEDITOR.tools.addFunction(function(a){var b=this.toggle(a);
    +if(this.onClick)this.onClick(a,b)},this));return this._.click}},proto:{add:function(a,b,c){var d=CKEDITOR.tools.getNextId();this._.started||(this._.started=1,this._.size=this._.size||0);this._.items[a]=d;a={id:d,val:a,onclick:CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick",clickFn:this._.getClick(),title:c||a,text:b||a};this._.pendingList.push(f.output(a))},startGroup:function(a){this._.close();var b=CKEDITOR.tools.getNextId();this._.groups[a]=b;this._.pendingHtml.push(g.output({id:b,
    +label:a}))},commit:function(){this._.close();this.element.appendHtml(this._.pendingHtml.join(""));delete this._.size;this._.pendingHtml=[]},toggle:function(a){var b=this.isMarked(a);b?this.unmark(a):this.mark(a);return!b},hideGroup:function(a){var b=(a=this.element.getDocument().getById(this._.groups[a]))&&a.getNext();a&&(a.setStyle("display","none"),b&&"ul"==b.getName()&&b.setStyle("display","none"))},hideItem:function(a){this.element.getDocument().getById(this._.items[a]).setStyle("display","none")},
    +showAll:function(){var a=this._.items,b=this._.groups,c=this.element.getDocument(),d;for(d in a)c.getById(a[d]).setStyle("display","");for(var e in b)a=c.getById(b[e]),d=a.getNext(),a.setStyle("display",""),d&&"ul"==d.getName()&&d.setStyle("display","")},mark:function(a){this.multiSelect||this.unmarkAll();var a=this._.items[a],b=this.element.getDocument().getById(a);b.addClass("cke_selected");this.element.getDocument().getById(a+"_option").setAttribute("aria-selected",!0);this.onMark&&this.onMark(b)},
    +unmark:function(a){var b=this.element.getDocument(),a=this._.items[a],c=b.getById(a);c.removeClass("cke_selected");b.getById(a+"_option").removeAttribute("aria-selected");this.onUnmark&&this.onUnmark(c)},unmarkAll:function(){var a=this._.items,b=this.element.getDocument(),c;for(c in a){var d=a[c];b.getById(d).removeClass("cke_selected");b.getById(d+"_option").removeAttribute("aria-selected")}this.onUnmark&&this.onUnmark()},isMarked:function(a){return this.element.getDocument().getById(this._.items[a]).hasClass("cke_selected")},
    +focus:function(a){this._.focusIndex=-1;var b=this.element.getElementsByTag("a"),c,d=-1;if(a)for(c=this.element.getDocument().getById(this._.items[a]).getFirst();a=b.getItem(++d);){if(a.equals(c)){this._.focusIndex=d;break}}else this.element.focus();c&&setTimeout(function(){c.focus()},0)}}})}});CKEDITOR.plugins.add("richcombo",{requires:"floatpanel,listblock,button",beforeInit:function(c){c.ui.addHandler(CKEDITOR.UI_RICHCOMBO,CKEDITOR.ui.richCombo.handler)}});
    +(function(){var c='<span id="{id}" class="cke_combo cke_combo__{name} {cls}" role="presentation"><span id="{id}_label" class="cke_combo_label">{label}</span><a class="cke_combo_button" hidefocus=true title="{title}" tabindex="-1"'+(CKEDITOR.env.gecko&&10900<=CKEDITOR.env.version&&!CKEDITOR.env.hc?"":'" href="javascript:void(\'{titleJs}\')"')+' hidefocus="true" role="button" aria-labelledby="{id}_label" aria-haspopup="true"';if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)c+=' onkeypress="return false;"';
    +CKEDITOR.env.gecko&&(c+=' onblur="this.style.cssText = this.style.cssText;"');var c=c+(' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event,this);" onmousedown="return CKEDITOR.tools.callFunction({mousedownFn},event);"  onfocus="return CKEDITOR.tools.callFunction({focusFn},event);" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},this);return false;"><span id="{id}_text" class="cke_combo_text cke_combo_inlinelabel">{label}</span><span class="cke_combo_open"><span class="cke_combo_arrow">'+
    +(CKEDITOR.env.hc?"&#9660;":CKEDITOR.env.air?"&nbsp;":"")+"</span></span></a></span>"),h=CKEDITOR.addTemplate("combo",c);CKEDITOR.UI_RICHCOMBO="richcombo";CKEDITOR.ui.richCombo=CKEDITOR.tools.createClass({$:function(a){CKEDITOR.tools.extend(this,a,{canGroup:!1,title:a.label,modes:{wysiwyg:1},editorFocus:1});a=this.panel||{};delete this.panel;this.id=CKEDITOR.tools.getNextNumber();this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.className="cke_combopanel";a.block={multiSelect:a.multiSelect,
    +attributes:a.attributes};a.toolbarRelated=!0;this._={panelDefinition:a,items:{}}},proto:{renderHtml:function(a){var b=[];this.render(a,b);return b.join("")},render:function(a,b){function j(){var d=this.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED;this.setState(a.readOnly&&!this.readOnly?CKEDITOR.TRISTATE_DISABLED:d);this.setValue("")}var c=CKEDITOR.env,g="cke_"+this.id,e=CKEDITOR.tools.addFunction(function(b){i&&(a.unlockSelection(1),i=0);d.execute(b)},this),f=this,d={id:g,combo:this,
    +focus:function(){CKEDITOR.document.getById(g).getChild(1).focus()},execute:function(d){var b=f._;if(b.state!=CKEDITOR.TRISTATE_DISABLED)if(f.createPanel(a),b.on)b.panel.hide();else{f.commit();var c=f.getValue();c?b.list.mark(c):b.list.unmarkAll();b.panel.showBlock(f.id,new CKEDITOR.dom.element(d),4)}},clickFn:e};a.on("mode",j,this);!this.readOnly&&a.on("readOnly",j,this);var k=CKEDITOR.tools.addFunction(function(a,b){var a=new CKEDITOR.dom.event(a),c=a.getKeystroke();switch(c){case 13:case 32:case 40:CKEDITOR.tools.callFunction(e,
    +b);break;default:d.onkey(d,c)}a.preventDefault()}),l=CKEDITOR.tools.addFunction(function(){d.onfocus&&d.onfocus()}),i=0,m=CKEDITOR.tools.addFunction(function(){if(CKEDITOR.env.opera){var b=a.editable();b.isInline()&&b.hasFocus&&(a.lockSelection(),i=1)}});d.keyDownFn=k;c={id:g,name:this.name||this.command,label:this.label,title:this.title,cls:this.className||"",titleJs:c.gecko&&10900<=c.version&&!c.hc?"":(this.title||"").replace("'",""),keydownFn:k,mousedownFn:m,focusFn:l,clickFn:e};h.output(c,b);
    +if(this.onRender)this.onRender();return d},createPanel:function(a){if(!this._.panel){var b=this._.panelDefinition,c=this._.panelDefinition.block,h=b.parent||CKEDITOR.document.getBody(),g="cke_combopanel__"+this.name,e=new CKEDITOR.ui.floatPanel(a,h,b),f=e.addListBlock(this.id,c),d=this;e.onShow=function(){this.element.addClass(g);d.setState(CKEDITOR.TRISTATE_ON);d._.on=1;d.editorFocus&&a.focus();if(d.onOpen)d.onOpen();f.focus(!f.multiSelect&&d.getValue())};e.onHide=function(b){this.element.removeClass(g);
    +d.setState(d.modes&&d.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);d._.on=0;if(!b&&d.onClose)d.onClose()};e.onEscape=function(){e.hide(1)};f.onClick=function(a,b){d.onClick&&d.onClick.call(d,a,b);e.hide()};this._.panel=e;this._.list=f;e.getBlock(this.id).onHide=function(){d._.on=0;d.setState(CKEDITOR.TRISTATE_OFF)};this.init&&this.init()}},setValue:function(a,b){this._.value=a;var c=this.document.getById("cke_"+this.id+"_text");c&&(!a&&!b?(b=this.label,c.addClass("cke_combo_inlinelabel")):
    +c.removeClass("cke_combo_inlinelabel"),c.setText("undefined"!=typeof b?b:a))},getValue:function(){return this._.value||""},unmarkAll:function(){this._.list.unmarkAll()},mark:function(a){this._.list.mark(a)},hideItem:function(a){this._.list.hideItem(a)},hideGroup:function(a){this._.list.hideGroup(a)},showAll:function(){this._.list.showAll()},add:function(a,b,c){this._.items[a]=c||a;this._.list.add(a,b,c)},startGroup:function(a){this._.list.startGroup(a)},commit:function(){this._.committed||(this._.list.commit(),
    +this._.committed=1,CKEDITOR.ui.fire("ready",this));this._.committed=1},setState:function(a){if(this._.state!=a){var b=this.document.getById("cke_"+this.id);b.setState(a,"cke_combo");a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled");this._.state=a}},enable:function(){this._.state==CKEDITOR.TRISTATE_DISABLED&&this.setState(this._.lastState)},disable:function(){this._.state!=CKEDITOR.TRISTATE_DISABLED&&(this._.lastState=this._.state,this.setState(CKEDITOR.TRISTATE_DISABLED))}},
    +statics:{handler:{create:function(a){return new CKEDITOR.ui.richCombo(a)}}}});CKEDITOR.ui.prototype.addRichCombo=function(a,b){this.add(a,CKEDITOR.UI_RICHCOMBO,b)}})();(function(){function g(a,b,g,h,j,n,k,o){for(var p=a.config,l=new CKEDITOR.style(k),c=j.split(";"),j=[],f={},d=0;d<c.length;d++){var e=c[d];if(e){var e=e.split("/"),m={},i=c[d]=e[0];m[g]=j[d]=e[1]||i;f[i]=new CKEDITOR.style(k,m);f[i]._.definition.name=i}else c.splice(d--,1)}a.ui.addRichCombo(b,{label:h.label,title:h.panelTitle,toolbar:"styles,"+o,allowedContent:l,requiredContent:l,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(p.contentsCss),multiSelect:!1,attributes:{"aria-label":h.panelTitle}},
    +init:function(){this.startGroup(h.panelTitle);for(var a=0;a<c.length;a++){var b=c[a];this.add(b,f[b].buildPreview(),b)}},onClick:function(b){a.focus();a.fire("saveSnapshot");var c=f[b];a[this.getValue()==b?"removeStyle":"applyStyle"](c);a.fire("saveSnapshot")},onRender:function(){a.on("selectionChange",function(a){for(var b=this.getValue(),a=a.data.path.elements,c=0,d;c<a.length;c++){d=a[c];for(var e in f)if(f[e].checkElementMatch(d,!0)){e!=b&&this.setValue(e);return}}this.setValue("",n)},this)}})}
    +CKEDITOR.plugins.add("font",{requires:"richcombo",init:function(a){var b=a.config;g(a,"Font","family",a.lang.font,b.font_names,b.font_defaultLabel,b.font_style,30);g(a,"FontSize","size",a.lang.font.fontSize,b.fontSize_sizes,b.fontSize_defaultLabel,b.fontSize_style,40)}})})();CKEDITOR.config.font_names="Arial/Arial, Helvetica, sans-serif;Comic Sans MS/Comic Sans MS, cursive;Courier New/Courier New, Courier, monospace;Georgia/Georgia, serif;Lucida Sans Unicode/Lucida Sans Unicode, Lucida Grande, sans-serif;Tahoma/Tahoma, Geneva, sans-serif;Times New Roman/Times New Roman, Times, serif;Trebuchet MS/Trebuchet MS, Helvetica, sans-serif;Verdana/Verdana, Geneva, sans-serif";
    +CKEDITOR.config.font_defaultLabel="";CKEDITOR.config.font_style={element:"span",styles:{"font-family":"#(family)"},overrides:[{element:"font",attributes:{face:null}}]};CKEDITOR.config.fontSize_sizes="8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px";CKEDITOR.config.fontSize_defaultLabel="";CKEDITOR.config.fontSize_style={element:"span",styles:{"font-size":"#(size)"},overrides:[{element:"font",attributes:{size:null}}]};CKEDITOR.plugins.add("forms",{requires:"dialog,fakeobjects",onLoad:function(){CKEDITOR.addCss(".cke_editable form{border: 1px dotted #FF0000;padding: 2px;}\n");CKEDITOR.addCss("img.cke_hidden{background-image: url("+CKEDITOR.getUrl(this.path+"images/hiddenfield.gif")+");background-position: center center;background-repeat: no-repeat;border: 1px solid #a9a9a9;width: 16px !important;height: 16px !important;}")},init:function(b){var a=b.lang,e=0,h={email:1,password:1,search:1,tel:1,text:1,url:1},j={checkbox:"input[type,name,checked]",
    +radio:"input[type,name,checked]",textfield:"input[type,name,value,size,maxlength]",textarea:"textarea[cols,rows,name]",select:"select[name,size,multiple]; option[value,selected]",button:"input[type,name,value]",form:"form[action,name,id,enctype,target,method]",hiddenfield:"input[type,name,value]",imagebutton:"input[type,alt,src]{width,height,border,border-width,border-style,margin,float}"},k={checkbox:"input",radio:"input",textfield:"input",textarea:"textarea",select:"select",button:"input",form:"form",
    +hiddenfield:"input",imagebutton:"input"},d=function(g,c,h){var d={allowedContent:j[c],requiredContent:k[c]};"form"==c&&(d.context="form");b.addCommand(c,new CKEDITOR.dialogCommand(c,d));b.ui.addButton&&b.ui.addButton(g,{label:a.common[g.charAt(0).toLowerCase()+g.slice(1)],command:c,toolbar:"forms,"+(e+=10)});CKEDITOR.dialog.add(c,h)},f=this.path+"dialogs/";!b.blockless&&d("Form","form",f+"form.js");d("Checkbox","checkbox",f+"checkbox.js");d("Radio","radio",f+"radio.js");d("TextField","textfield",
    +f+"textfield.js");d("Textarea","textarea",f+"textarea.js");d("Select","select",f+"select.js");d("Button","button",f+"button.js");var i=CKEDITOR.plugins.get("image");i&&d("ImageButton","imagebutton",CKEDITOR.plugins.getPath("image")+"dialogs/image.js");d("HiddenField","hiddenfield",f+"hiddenfield.js");b.addMenuItems&&(d={checkbox:{label:a.forms.checkboxAndRadio.checkboxTitle,command:"checkbox",group:"checkbox"},radio:{label:a.forms.checkboxAndRadio.radioTitle,command:"radio",group:"radio"},textfield:{label:a.forms.textfield.title,
    +command:"textfield",group:"textfield"},hiddenfield:{label:a.forms.hidden.title,command:"hiddenfield",group:"hiddenfield"},imagebutton:{label:a.image.titleButton,command:"imagebutton",group:"imagebutton"},button:{label:a.forms.button.title,command:"button",group:"button"},select:{label:a.forms.select.title,command:"select",group:"select"},textarea:{label:a.forms.textarea.title,command:"textarea",group:"textarea"}},!b.blockless&&(d.form={label:a.forms.form.menu,command:"form",group:"form"}),b.addMenuItems(d));
    +b.contextMenu&&(!b.blockless&&b.contextMenu.addListener(function(g,c,a){if((g=a.contains("form",1))&&!g.isReadOnly())return{form:CKEDITOR.TRISTATE_OFF}}),b.contextMenu.addListener(function(a){if(a&&!a.isReadOnly()){var c=a.getName();if(c=="select")return{select:CKEDITOR.TRISTATE_OFF};if(c=="textarea")return{textarea:CKEDITOR.TRISTATE_OFF};if(c=="input"){var b=a.getAttribute("type")||"text";switch(b){case "button":case "submit":case "reset":return{button:CKEDITOR.TRISTATE_OFF};case "checkbox":return{checkbox:CKEDITOR.TRISTATE_OFF};
    +case "radio":return{radio:CKEDITOR.TRISTATE_OFF};case "image":return i?{imagebutton:CKEDITOR.TRISTATE_OFF}:null}if(h[b])return{textfield:CKEDITOR.TRISTATE_OFF}}if(c=="img"&&a.data("cke-real-element-type")=="hiddenfield")return{hiddenfield:CKEDITOR.TRISTATE_OFF}}}));b.on("doubleclick",function(a){var c=a.data.element;if(!b.blockless&&c.is("form"))a.data.dialog="form";else if(c.is("select"))a.data.dialog="select";else if(c.is("textarea"))a.data.dialog="textarea";else if(c.is("img")&&c.data("cke-real-element-type")==
    +"hiddenfield")a.data.dialog="hiddenfield";else if(c.is("input")){c=c.getAttribute("type")||"text";switch(c){case "button":case "submit":case "reset":a.data.dialog="button";break;case "checkbox":a.data.dialog="checkbox";break;case "radio":a.data.dialog="radio";break;case "image":a.data.dialog="imagebutton"}if(h[c])a.data.dialog="textfield"}})},afterInit:function(b){var a=b.dataProcessor,e=a&&a.htmlFilter,a=a&&a.dataFilter;CKEDITOR.env.ie&&e&&e.addRules({elements:{input:function(a){var a=a.attributes,
    +b=a.type;b||(a.type="text");("checkbox"==b||"radio"==b)&&"on"==a.value&&delete a.value}}});a&&a.addRules({elements:{input:function(a){if("hidden"==a.attributes.type)return b.createFakeParserElement(a,"cke_hidden","hiddenfield")}}})}});
    +CKEDITOR.env.ie&&(CKEDITOR.dom.element.prototype.hasAttribute=CKEDITOR.tools.override(CKEDITOR.dom.element.prototype.hasAttribute,function(b){return function(a){this.$.attributes.getNamedItem(a);if("input"==this.getName())switch(a){case "class":return 0<this.$.className.length;case "checked":return!!this.$.checked;case "value":var e=this.getAttribute("type");return"checkbox"==e||"radio"==e?"on"!=this.$.value:this.$.value}return b.apply(this,arguments)}}));CKEDITOR.plugins.add("format",{requires:"richcombo",init:function(a){if(!a.blockless){for(var g=a.config,c=a.lang.format,k=g.format_tags.split(";"),d={},l=0,m=[],h=0;h<k.length;h++){var i=k[h],j=new CKEDITOR.style(g["format_"+i]);if(!a.filter.customConfig||a.filter.check(j))l++,d[i]=j,d[i]._.enterMode=a.config.enterMode,m.push(j)}0!==l&&a.ui.addRichCombo("Format",{label:c.label,title:c.panelTitle,toolbar:"styles,20",allowedContent:m,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(g.contentsCss),
    +multiSelect:!1,attributes:{"aria-label":c.panelTitle}},init:function(){this.startGroup(c.panelTitle);for(var a in d){var e=c["tag_"+a];this.add(a,d[a].buildPreview(e),e)}},onClick:function(b){a.focus();a.fire("saveSnapshot");var b=d[b],e=a.elementPath();a[b.checkActive(e)?"removeStyle":"applyStyle"](b);setTimeout(function(){a.fire("saveSnapshot")},0)},onRender:function(){a.on("selectionChange",function(b){var e=this.getValue(),b=b.data.path,c=!a.readOnly&&b.isContextFor("p");this[c?"enable":"disable"]();
    +if(c){for(var f in d)if(d[f].checkActive(b)){f!=e&&this.setValue(f,a.lang.format["tag_"+f]);return}this.setValue("")}},this)}})}}});CKEDITOR.config.format_tags="p;h1;h2;h3;h4;h5;h6;pre;address;div";CKEDITOR.config.format_p={element:"p"};CKEDITOR.config.format_div={element:"div"};CKEDITOR.config.format_pre={element:"pre"};CKEDITOR.config.format_address={element:"address"};CKEDITOR.config.format_h1={element:"h1"};CKEDITOR.config.format_h2={element:"h2"};CKEDITOR.config.format_h3={element:"h3"};
    +CKEDITOR.config.format_h4={element:"h4"};CKEDITOR.config.format_h5={element:"h5"};CKEDITOR.config.format_h6={element:"h6"};CKEDITOR.plugins.add("htmlwriter",{init:function(b){var a=new CKEDITOR.htmlWriter;a.forceSimpleAmpersand=b.config.forceSimpleAmpersand;a.indentationChars=b.config.dataIndentationChars||"\t";b.dataProcessor.writer=a}});
    +CKEDITOR.htmlWriter=CKEDITOR.tools.createClass({base:CKEDITOR.htmlParser.basicWriter,$:function(){this.base();this.indentationChars="\t";this.selfClosingEnd=" />";this.lineBreakChars="\n";this.sortAttributes=1;this._.indent=0;this._.indentation="";this._.inPre=0;this._.rules={};var b=CKEDITOR.dtd,a;for(a in CKEDITOR.tools.extend({},b.$nonBodyContent,b.$block,b.$listItem,b.$tableContent))this.setRules(a,{indent:!b[a]["#"],breakBeforeOpen:1,breakBeforeClose:!b[a]["#"],breakAfterClose:1,needsSpace:a in
    +b.$block&&!(a in{li:1,dt:1,dd:1})});this.setRules("br",{breakAfterOpen:1});this.setRules("title",{indent:0,breakAfterOpen:0});this.setRules("style",{indent:0,breakBeforeClose:1});this.setRules("pre",{breakAfterOpen:1,indent:0})},proto:{openTag:function(b){var a=this._.rules[b];this._.afterCloser&&(a&&a.needsSpace&&this._.needsSpace)&&this._.output.push("\n");this._.indent?this.indentation():a&&a.breakBeforeOpen&&(this.lineBreak(),this.indentation());this._.output.push("<",b);this._.afterCloser=0},
    +openTagClose:function(b,a){var c=this._.rules[b];a?(this._.output.push(this.selfClosingEnd),c&&c.breakAfterClose&&(this._.needsSpace=c.needsSpace)):(this._.output.push(">"),c&&c.indent&&(this._.indentation+=this.indentationChars));c&&c.breakAfterOpen&&this.lineBreak();"pre"==b&&(this._.inPre=1)},attribute:function(b,a){"string"==typeof a&&(this.forceSimpleAmpersand&&(a=a.replace(/&amp;/g,"&")),a=CKEDITOR.tools.htmlEncodeAttr(a));this._.output.push(" ",b,'="',a,'"')},closeTag:function(b){var a=this._.rules[b];
    +a&&a.indent&&(this._.indentation=this._.indentation.substr(this.indentationChars.length));this._.indent?this.indentation():a&&a.breakBeforeClose&&(this.lineBreak(),this.indentation());this._.output.push("</",b,">");"pre"==b&&(this._.inPre=0);a&&a.breakAfterClose&&(this.lineBreak(),this._.needsSpace=a.needsSpace);this._.afterCloser=1},text:function(b){this._.indent&&(this.indentation(),!this._.inPre&&(b=CKEDITOR.tools.ltrim(b)));this._.output.push(b)},comment:function(b){this._.indent&&this.indentation();
    +this._.output.push("<\!--",b,"--\>")},lineBreak:function(){!this._.inPre&&0<this._.output.length&&this._.output.push(this.lineBreakChars);this._.indent=1},indentation:function(){!this._.inPre&&this._.indentation&&this._.output.push(this._.indentation);this._.indent=0},reset:function(){this._.output=[];this._.indent=0;this._.indentation="";this._.afterCloser=0;this._.inPre=0},setRules:function(b,a){var c=this._.rules[b];c?CKEDITOR.tools.extend(c,a,!0):this._.rules[b]=a}}});(function(){var b={canUndo:!1,exec:function(a){var b=a.document.createElement("hr");a.insertElement(b)},allowedContent:"hr",requiredContent:"hr"};CKEDITOR.plugins.add("horizontalrule",{init:function(a){a.blockless||(a.addCommand("horizontalrule",b),a.ui.addButton&&a.ui.addButton("HorizontalRule",{label:a.lang.horizontalrule.toolbar,command:"horizontalrule",toolbar:"insert,40"}))}})})();(function(){CKEDITOR.plugins.add("iframe",{requires:"dialog,fakeobjects",onLoad:function(){CKEDITOR.addCss("img.cke_iframe{background-image: url("+CKEDITOR.getUrl(this.path+"images/placeholder.png")+");background-position: center center;background-repeat: no-repeat;border: 1px solid #a9a9a9;width: 80px;height: 80px;}")},init:function(a){var b=a.lang.iframe,c="iframe[align,longdesc,frameborder,height,name,scrolling,src,title,width]";a.plugins.dialogadvtab&&(c+=";iframe"+a.plugins.dialogadvtab.allowedContent({id:1,
    +classes:1,styles:1}));CKEDITOR.dialog.add("iframe",this.path+"dialogs/iframe.js");a.addCommand("iframe",new CKEDITOR.dialogCommand("iframe",{allowedContent:c,requiredContent:"iframe"}));a.ui.addButton&&a.ui.addButton("Iframe",{label:b.toolbar,command:"iframe",toolbar:"insert,80"});a.on("doubleclick",function(a){var b=a.data.element;b.is("img")&&"iframe"==b.data("cke-real-element-type")&&(a.data.dialog="iframe")});a.addMenuItems&&a.addMenuItems({iframe:{label:b.title,command:"iframe",group:"image"}});
    +a.contextMenu&&a.contextMenu.addListener(function(a){if(a&&a.is("img")&&"iframe"==a.data("cke-real-element-type"))return{iframe:CKEDITOR.TRISTATE_OFF}})},afterInit:function(a){var b=a.dataProcessor;(b=b&&b.dataFilter)&&b.addRules({elements:{iframe:function(b){return a.createFakeParserElement(b,"cke_iframe","iframe",!0)}}})}})})();(function(){function l(a){var d=this.editor,b=a.document,c=b.body;(a=b.getElementById("cke_actscrpt"))&&a.parentNode.removeChild(a);(a=b.getElementById("cke_shimscrpt"))&&a.parentNode.removeChild(a);CKEDITOR.env.gecko&&(c.contentEditable=!1,2E4>CKEDITOR.env.version&&(c.innerHTML=c.innerHTML.replace(/^.*<\!-- cke-content-start --\>/,""),setTimeout(function(){var a=new CKEDITOR.dom.range(new CKEDITOR.dom.document(b));a.setStart(new CKEDITOR.dom.node(c),0);d.getSelection().selectRanges([a])},0)));c.contentEditable=
    +!0;CKEDITOR.env.ie&&(c.hideFocus=!0,c.disabled=!0,c.removeAttribute("disabled"));delete this._.isLoadingData;this.$=c;b=new CKEDITOR.dom.document(b);this.setup();CKEDITOR.env.ie&&(b.getDocumentElement().addClass(b.$.compatMode),d.config.enterMode!=CKEDITOR.ENTER_P&&b.on("selectionchange",function(){var a=b.getBody(),c=d.getSelection(),e=c&&c.getRanges()[0];e&&(a.getHtml().match(/^<p>&nbsp;<\/p>$/i)&&e.startContainer.equals(a))&&setTimeout(function(){e=d.getSelection().getRanges()[0];if(!e.startContainer.equals("body")){a.getFirst().remove(1);
    +e.moveToElementEditEnd(a);e.select()}},0)}));CKEDITOR.env.gecko&&CKEDITOR.tools.setTimeout(m,0,this,d);try{d.document.$.execCommand("2D-position",!1,!0)}catch(e){}try{d.document.$.execCommand("enableInlineTableEditing",!1,!d.config.disableNativeTableHandles)}catch(f){}if(d.config.disableObjectResizing)try{this.getDocument().$.execCommand("enableObjectResizing",!1,!1)}catch(g){this.attachListener(this,CKEDITOR.env.ie?"resizestart":"resize",function(a){a.data.preventDefault()})}(CKEDITOR.env.gecko||
    +CKEDITOR.env.ie&&"CSS1Compat"==d.document.$.compatMode)&&this.attachListener(this,"keydown",function(a){var b=a.data.getKeystroke();if(b==33||b==34)if(CKEDITOR.env.ie)setTimeout(function(){d.getSelection().scrollIntoView()},0);else if(d.window.$.innerHeight>this.$.offsetHeight){var c=d.createRange();c[b==33?"moveToElementEditStart":"moveToElementEditEnd"](this);c.select();a.data.preventDefault()}});CKEDITOR.env.ie&&this.attachListener(b,"blur",function(){try{b.$.selection.empty()}catch(a){}});d.document.getElementsByTag("title").getItem(0).data("cke-title",
    +d.document.$.title);CKEDITOR.env.ie&&(d.document.$.title=this._.docTitle);CKEDITOR.tools.setTimeout(function(){d.fire("contentDom");if(this._.isPendingFocus){d.focus();this._.isPendingFocus=false}setTimeout(function(){d.fire("dataReady")},0);CKEDITOR.env.ie&&setTimeout(function(){if(d.document){var a=d.document.$.body;a.runtimeStyle.marginBottom="0px";a.runtimeStyle.marginBottom=""}},1E3)},0,this)}function n(a){a.checkDirty()||setTimeout(function(){a.resetDirty()},0)}function m(a){if(!a.readOnly){var d=
    +a.window,b=a.document,c=b.getBody(),e=c.getFirst(),f=c.getChildren().count();if(!f||1==f&&e.type==CKEDITOR.NODE_ELEMENT&&e.hasAttribute("_moz_editor_bogus_node")){n(a);var e=CKEDITOR.document,g=e.getDocumentElement(),h=g.$.scrollTop,i=g.$.scrollLeft,j=b.$.createEvent("KeyEvents");j.initKeyEvent("keypress",!0,!0,d.$,!1,!1,!1,!1,0,32);b.$.dispatchEvent(j);(h!=g.$.scrollTop||i!=g.$.scrollLeft)&&e.getWindow().$.scrollTo(i,h);f&&c.getFirst().remove();b.getBody().appendBogus();a=a.createRange();a.setStartAt(c,
    +CKEDITOR.POSITION_AFTER_START);a.select()}}}function o(){var a=[];if(8<=CKEDITOR.document.$.documentMode){a.push("html.CSS1Compat [contenteditable=false]{min-height:0 !important}");var d=[],b;for(b in CKEDITOR.dtd.$removeEmpty)d.push("html.CSS1Compat "+b+"[contenteditable=false]");a.push(d.join(",")+"{display:inline-block}")}else CKEDITOR.env.gecko&&(a.push("html{height:100% !important}"),a.push("img:-moz-broken{-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}"));a.push("html{cursor:text;*cursor:auto}");
    +a.push("img,input,textarea{cursor:default}");return a.join("\n")}CKEDITOR.plugins.add("wysiwygarea",{init:function(a){a.config.fullPage&&a.addFeature({allowedContent:"html head title; style [media,type]; body (*)[id]; meta link [*]",requiredContent:"body"});a.addMode("wysiwyg",function(d){function b(b){b&&b.removeListener();a.editable(new k(a,e.$.contentWindow.document.body));a.setData(a.getData(1),d)}var c="document.open();"+(CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"")+"document.close();",
    +c=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?"javascript:void(function(){"+encodeURIComponent(c)+"}())":"",e=CKEDITOR.dom.element.createFromHtml('<iframe src="'+c+'" frameBorder="0"></iframe>');e.setStyles({width:"100%",height:"100%"});e.addClass("cke_wysiwyg_frame cke_reset");var f=a.ui.space("contents");f.append(e);if(c=CKEDITOR.env.ie||CKEDITOR.env.gecko)e.on("load",b);var g=[a.lang.editor,a.name].join(),h=a.lang.common.editorHelp;CKEDITOR.env.ie&&(g+=", "+h);var i=CKEDITOR.tools.getNextId(),
    +j=CKEDITOR.dom.element.createFromHtml('<span id="'+i+'" class="cke_voice_label">'+h+"</span>");f.append(j,1);a.on("beforeModeUnload",function(a){a.removeListener();j.remove()});e.setAttributes({"aria-describedby":i,title:g,tabIndex:a.tabIndex,allowTransparency:"true"});!c&&b();CKEDITOR.env.webkit&&(c=function(){f.setStyle("width","100%");e.hide();e.setSize("width",f.getSize("width"));f.removeStyle("width");e.show()},e.setCustomData("onResize",c),CKEDITOR.document.getWindow().on("resize",c));a.fire("ariaWidget",
    +e)})}});var k=CKEDITOR.tools.createClass({$:function(a){this.base.apply(this,arguments);this._.frameLoadedHandler=CKEDITOR.tools.addFunction(function(a){CKEDITOR.tools.setTimeout(l,0,this,a)},this);this._.docTitle=this.getWindow().getFrame().getAttribute("title")},base:CKEDITOR.editable,proto:{setData:function(a,d){var b=this.editor;if(d)this.setHtml(a);else{this._.isLoadingData=!0;b._.dataStore={id:1};var c=b.config,e=c.fullPage,f=c.docType,g=CKEDITOR.tools.buildStyleHtml(o()).replace(/<style>/,
    +'<style data-cke-temp="1">');e||(g+=CKEDITOR.tools.buildStyleHtml(b.config.contentsCss));var h=c.baseHref?'<base href="'+c.baseHref+'" data-cke-temp="1" />':"";e&&(a=a.replace(/<!DOCTYPE[^>]*>/i,function(a){b.docType=f=a;return""}).replace(/<\?xml\s[^\?]*\?>/i,function(a){b.xmlDeclaration=a;return""}));b.dataProcessor&&(a=b.dataProcessor.toHtml(a));e?(/<body[\s|>]/.test(a)||(a="<body>"+a),/<html[\s|>]/.test(a)||(a="<html>"+a+"</html>"),/<head[\s|>]/.test(a)?/<title[\s|>]/.test(a)||(a=a.replace(/<head[^>]*>/,
    +"$&<title></title>")):a=a.replace(/<html[^>]*>/,"$&<head><title></title></head>"),h&&(a=a.replace(/<head>/,"$&"+h)),a=a.replace(/<\/head\s*>/,g+"$&"),a=f+a):a=c.docType+'<html dir="'+c.contentsLangDirection+'" lang="'+(c.contentsLanguage||b.langCode)+'"><head><title>'+this._.docTitle+"</title>"+h+g+"</head><body"+(c.bodyId?' id="'+c.bodyId+'"':"")+(c.bodyClass?' class="'+c.bodyClass+'"':"")+">"+a+"</body></html>";CKEDITOR.env.gecko&&(a=a.replace(/<body/,'<body contenteditable="true" '),2E4>CKEDITOR.env.version&&
    +(a=a.replace(/<body[^>]*>/,"$&<\!-- cke-content-start --\>")));c='<script id="cke_actscrpt" type="text/javascript"'+(CKEDITOR.env.ie?' defer="defer" ':"")+">var wasLoaded=0;function onload(){if(!wasLoaded)window.parent.CKEDITOR.tools.callFunction("+this._.frameLoadedHandler+",window);wasLoaded=1;}"+(CKEDITOR.env.ie?"onload();":'document.addEventListener("DOMContentLoaded", onload, false );')+"<\/script>";CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(c+='<script id="cke_shimscrpt">(function(){var e="abbr,article,aside,audio,bdi,canvas,data,datalist,details,figcaption,figure,footer,header,hgroup,mark,meter,nav,output,progress,section,summary,time,video".split(","),i=e.length;while(i--){document.createElement(e[i])}})()<\/script>');
    +a=a.replace(/(?=\s*<\/(:?head)>)/,c);this.clearCustomData();this.clearListeners();b.fire("contentDomUnload");var i=this.getDocument();try{i.write(a)}catch(j){setTimeout(function(){i.write(a)},0)}}},getData:function(a){if(a)return this.getHtml();var a=this.editor,d=a.config,b=d.fullPage,c=b&&a.docType,e=b&&a.xmlDeclaration,f=this.getDocument(),b=b?f.getDocumentElement().getOuterHtml():f.getBody().getHtml();CKEDITOR.env.gecko&&d.enterMode!=CKEDITOR.ENTER_BR&&(b=b.replace(/<br>(?=\s*(:?$|<\/body>))/,
    +""));a.dataProcessor&&(b=a.dataProcessor.toDataFormat(b));e&&(b=e+"\n"+b);c&&(b=c+"\n"+b);return b},focus:function(){this._.isLoadingData?this._.isPendingFocus=!0:k.baseProto.focus.call(this)},detach:function(){var a=this.editor,d=a.document,b=a.window.getFrame();k.baseProto.detach.call(this);this.clearCustomData();d.getDocumentElement().clearCustomData();b.clearCustomData();CKEDITOR.tools.removeFunction(this._.frameLoadedHandler);(d=b.removeCustomData("onResize"))&&d.removeListener();a.fire("contentDomUnload");
    +b.remove()}}})})();CKEDITOR.config.disableObjectResizing=!1;CKEDITOR.config.disableNativeTableHandles=!0;CKEDITOR.config.disableNativeSpellChecker=!0;CKEDITOR.config.contentsCss=CKEDITOR.basePath+"contents.css";(function(){function e(b,a){a||(a=b.getSelection().getSelectedElement());if(a&&a.is("img")&&!a.data("cke-realelement")&&!a.isReadOnly())return a}function f(b){var a=b.getStyle("float");if("inherit"==a||"none"==a)a=0;a||(a=b.getAttribute("align"));return a}CKEDITOR.plugins.add("image",{requires:"dialog",init:function(b){CKEDITOR.dialog.add("image",this.path+"dialogs/image.js");var a="img[alt,!src]{border-style,border-width,float,height,margin,margin-bottom,margin-left,margin-right,margin-top,width}";
    +CKEDITOR.dialog.isTabEnabled(b,"image","advanced")&&(a="img[alt,dir,id,lang,longdesc,!src,title]{*}(*)");b.addCommand("image",new CKEDITOR.dialogCommand("image",{allowedContent:a,requiredContent:"img[alt,src]",contentTransformations:[["img{width}: sizeToStyle","img[width]: sizeToAttribute"],["img{float}: alignmentToStyle","img[align]: alignmentToAttribute"]]}));b.ui.addButton&&b.ui.addButton("Image",{label:b.lang.common.image,command:"image",toolbar:"insert,10"});b.on("doubleclick",function(a){var b=
    +a.data.element;b.is("img")&&(!b.data("cke-realelement")&&!b.isReadOnly())&&(a.data.dialog="image")});b.addMenuItems&&b.addMenuItems({image:{label:b.lang.image.menu,command:"image",group:"image"}});b.contextMenu&&b.contextMenu.addListener(function(a){if(e(b,a))return{image:CKEDITOR.TRISTATE_OFF}})},afterInit:function(b){function a(a){var d=b.getCommand("justify"+a);if(d){if("left"==a||"right"==a)d.on("exec",function(d){var c=e(b),g;c&&(g=f(c),g==a?(c.removeStyle("float"),a==f(c)&&c.removeAttribute("align")):
    +c.setStyle("float",a),d.cancel())});d.on("refresh",function(d){var c=e(b);c&&(c=f(c),this.setState(c==a?CKEDITOR.TRISTATE_ON:"right"==a||"left"==a?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED),d.cancel())})}}a("left");a("right");a("center");a("block")}})})();CKEDITOR.config.image_removeLinkByEmptyURL=!0;CKEDITOR.plugins.add("smiley",{requires:"dialog",init:function(a){a.config.smiley_path=a.config.smiley_path||this.path+"images/";a.addCommand("smiley",new CKEDITOR.dialogCommand("smiley",{allowedContent:"img[alt,height,!src,title,width]",requiredContent:"img"}));a.ui.addButton&&a.ui.addButton("Smiley",{label:a.lang.smiley.toolbar,command:"smiley",toolbar:"insert,50"});CKEDITOR.dialog.add("smiley",this.path+"dialogs/smiley.js")}});CKEDITOR.config.smiley_images="regular_smile.gif sad_smile.gif wink_smile.gif teeth_smile.gif confused_smile.gif tongue_smile.gif embarrassed_smile.gif omg_smile.gif whatchutalkingabout_smile.gif angry_smile.gif angel_smile.gif shades_smile.gif devil_smile.gif cry_smile.gif lightbulb.gif thumbs_down.gif thumbs_up.gif heart.gif broken_heart.gif kiss.gif envelope.gif".split(" ");
    +CKEDITOR.config.smiley_descriptions="smiley;sad;wink;laugh;frown;cheeky;blush;surprise;indecision;angry;angel;cool;devil;crying;enlightened;no;yes;heart;broken heart;kiss;mail".split(";");(function(){function l(a,c){var c=void 0===c||c,b;if(c)b=a.getComputedStyle("text-align");else{for(;!a.hasAttribute||!a.hasAttribute("align")&&!a.getStyle("text-align");){b=a.getParent();if(!b)break;a=b}b=a.getStyle("text-align")||a.getAttribute("align")||""}b&&(b=b.replace(/(?:-(?:moz|webkit)-)?(?:start|auto)/i,""));!b&&c&&(b="rtl"==a.getComputedStyle("direction")?"right":"left");return b}function f(a,c,b){this.editor=a;this.name=c;this.value=b;this.context="p";var c=a.config.justifyClasses,g=a.config.enterMode==
    +CKEDITOR.ENTER_P?"p":"div";if(c){switch(b){case "left":this.cssClassName=c[0];break;case "center":this.cssClassName=c[1];break;case "right":this.cssClassName=c[2];break;case "justify":this.cssClassName=c[3]}this.cssClassRegex=RegExp("(?:^|\\s+)(?:"+c.join("|")+")(?=$|\\s)");this.requiredContent=g+"("+this.cssClassName+")"}else this.requiredContent=g+"{text-align}";this.allowedContent={"caption div h1 h2 h3 h4 h5 h6 p pre td th li":{propertiesOnly:!0,styles:this.cssClassName?null:"text-align",classes:this.cssClassName||
    +null}};a.config.enterMode==CKEDITOR.ENTER_BR&&(this.allowedContent.div=!0)}function j(a){var c=a.editor,b=c.createRange();b.setStartBefore(a.data.node);b.setEndAfter(a.data.node);for(var g=new CKEDITOR.dom.walker(b),d;d=g.next();)if(d.type==CKEDITOR.NODE_ELEMENT)if(!d.equals(a.data.node)&&d.getDirection())b.setStartAfter(d),g=new CKEDITOR.dom.walker(b);else{var e=c.config.justifyClasses;e&&(d.hasClass(e[0])?(d.removeClass(e[0]),d.addClass(e[2])):d.hasClass(e[2])&&(d.removeClass(e[2]),d.addClass(e[0])));
    +e=d.getStyle("text-align");"left"==e?d.setStyle("text-align","right"):"right"==e&&d.setStyle("text-align","left")}}f.prototype={exec:function(a){var c=a.getSelection(),b=a.config.enterMode;if(c){for(var g=c.createBookmarks(),d=c.getRanges(!0),e=this.cssClassName,f,h,i=a.config.useComputedState,i=void 0===i||i,k=d.length-1;0<=k;k--){f=d[k].createIterator();for(f.enlargeBr=b!=CKEDITOR.ENTER_BR;h=f.getNextParagraph(b==CKEDITOR.ENTER_P?"p":"div");){h.removeAttribute("align");h.removeStyle("text-align");
    +var j=e&&(h.$.className=CKEDITOR.tools.ltrim(h.$.className.replace(this.cssClassRegex,""))),m=this.state==CKEDITOR.TRISTATE_OFF&&(!i||l(h,!0)!=this.value);e?m?h.addClass(e):j||h.removeAttribute("class"):m&&h.setStyle("text-align",this.value)}}a.focus();a.forceNextSelectionCheck();c.selectBookmarks(g)}},refresh:function(a,c){var b=c.block||c.blockLimit;this.setState("body"!=b.getName()&&l(b,this.editor.config.useComputedState)==this.value?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)}};CKEDITOR.plugins.add("justify",
    +{init:function(a){if(!a.blockless){var c=new f(a,"justifyleft","left"),b=new f(a,"justifycenter","center"),g=new f(a,"justifyright","right"),d=new f(a,"justifyblock","justify");a.addCommand("justifyleft",c);a.addCommand("justifycenter",b);a.addCommand("justifyright",g);a.addCommand("justifyblock",d);a.ui.addButton&&(a.ui.addButton("JustifyLeft",{label:a.lang.justify.left,command:"justifyleft",toolbar:"align,10"}),a.ui.addButton("JustifyCenter",{label:a.lang.justify.center,command:"justifycenter",
    +toolbar:"align,20"}),a.ui.addButton("JustifyRight",{label:a.lang.justify.right,command:"justifyright",toolbar:"align,30"}),a.ui.addButton("JustifyBlock",{label:a.lang.justify.block,command:"justifyblock",toolbar:"align,40"}));a.on("dirChanged",j)}}})})();CKEDITOR.plugins.add("link",{requires:"dialog,fakeobjects",onLoad:function(){function b(b){return d.replace(/%1/g,"rtl"==b?"right":"left").replace(/%2/g,"cke_contents_"+b)}var a="background:url("+CKEDITOR.getUrl(this.path+"images/anchor.png")+") no-repeat %1 center;border:1px dotted #00f;",d=".%2 a.cke_anchor,.%2 a.cke_anchor_empty,.cke_editable.%2 a[name],.cke_editable.%2 a[data-cke-saved-name]{"+a+"padding-%1:18px;cursor:auto;}"+(CKEDITOR.env.ie?"a.cke_anchor_empty{display:inline-block;}":"")+".%2 img.cke_anchor{"+
    +a+"width:16px;min-height:15px;height:1.15em;vertical-align:"+(CKEDITOR.env.opera?"middle":"text-bottom")+";}";CKEDITOR.addCss(b("ltr")+b("rtl"))},init:function(b){var a="a[!href]";CKEDITOR.dialog.isTabEnabled(b,"link","advanced")&&(a=a.replace("]",",accesskey,charset,dir,id,lang,name,rel,tabindex,title,type]{*}(*)"));CKEDITOR.dialog.isTabEnabled(b,"link","target")&&(a=a.replace("]",",target,onclick]"));b.addCommand("link",new CKEDITOR.dialogCommand("link",{allowedContent:a,requiredContent:"a[href]"}));
    +b.addCommand("anchor",new CKEDITOR.dialogCommand("anchor",{allowedContent:"a[!name,id]",requiredContent:"a[name]"}));b.addCommand("unlink",new CKEDITOR.unlinkCommand);b.addCommand("removeAnchor",new CKEDITOR.removeAnchorCommand);b.setKeystroke(CKEDITOR.CTRL+76,"link");b.ui.addButton&&(b.ui.addButton("Link",{label:b.lang.link.toolbar,command:"link",toolbar:"links,10"}),b.ui.addButton("Unlink",{label:b.lang.link.unlink,command:"unlink",toolbar:"links,20"}),b.ui.addButton("Anchor",{label:b.lang.link.anchor.toolbar,
    +command:"anchor",toolbar:"links,30"}));CKEDITOR.dialog.add("link",this.path+"dialogs/link.js");CKEDITOR.dialog.add("anchor",this.path+"dialogs/anchor.js");b.on("doubleclick",function(a){var c=CKEDITOR.plugins.link.getSelectedLink(b)||a.data.element;if(!c.isReadOnly())if(c.is("a")){a.data.dialog=c.getAttribute("name")&&(!c.getAttribute("href")||!c.getChildCount())?"anchor":"link";b.getSelection().selectElement(c)}else if(CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,c))a.data.dialog="anchor"});b.addMenuItems&&
    +b.addMenuItems({anchor:{label:b.lang.link.anchor.menu,command:"anchor",group:"anchor",order:1},removeAnchor:{label:b.lang.link.anchor.remove,command:"removeAnchor",group:"anchor",order:5},link:{label:b.lang.link.menu,command:"link",group:"link",order:1},unlink:{label:b.lang.link.unlink,command:"unlink",group:"link",order:5}});b.contextMenu&&b.contextMenu.addListener(function(a){if(!a||a.isReadOnly())return null;a=CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,a);if(!a&&!(a=CKEDITOR.plugins.link.getSelectedLink(b)))return null;
    +var c={};a.getAttribute("href")&&a.getChildCount()&&(c={link:CKEDITOR.TRISTATE_OFF,unlink:CKEDITOR.TRISTATE_OFF});if(a&&a.hasAttribute("name"))c.anchor=c.removeAnchor=CKEDITOR.TRISTATE_OFF;return c})},afterInit:function(b){var a=b.dataProcessor,d=a&&a.dataFilter,a=a&&a.htmlFilter,c=b._.elementsPath&&b._.elementsPath.filters;d&&d.addRules({elements:{a:function(a){var c=a.attributes;if(!c.name)return null;var d=!a.children.length;if(CKEDITOR.plugins.link.synAnchorSelector){var a=d?"cke_anchor_empty":
    +"cke_anchor",e=c["class"];if(c.name&&(!e||0>e.indexOf(a)))c["class"]=(e||"")+" "+a;d&&CKEDITOR.plugins.link.emptyAnchorFix&&(c.contenteditable="false",c["data-cke-editable"]=1)}else if(CKEDITOR.plugins.link.fakeAnchor&&d)return b.createFakeParserElement(a,"cke_anchor","anchor");return null}}});CKEDITOR.plugins.link.emptyAnchorFix&&a&&a.addRules({elements:{a:function(a){delete a.attributes.contenteditable}}});c&&c.push(function(a,c){if("a"==c&&(CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,a)||a.getAttribute("name")&&
    +(!a.getAttribute("href")||!a.getChildCount())))return"anchor"})}});
    +CKEDITOR.plugins.link={getSelectedLink:function(b){var a=b.getSelection(),d=a.getSelectedElement();return d&&d.is("a")?d:(a=a.getRanges(!0)[0])?(a.shrink(CKEDITOR.SHRINK_TEXT),b.elementPath(a.getCommonAncestor()).contains("a",1)):null},fakeAnchor:CKEDITOR.env.opera||CKEDITOR.env.webkit,synAnchorSelector:CKEDITOR.env.ie,emptyAnchorFix:CKEDITOR.env.ie&&8>CKEDITOR.env.version,tryRestoreFakeAnchor:function(b,a){if(a&&a.data("cke-real-element-type")&&"anchor"==a.data("cke-real-element-type")){var d=b.restoreRealElement(a);
    +if(d.data("cke-saved-name"))return d}}};CKEDITOR.unlinkCommand=function(){};CKEDITOR.unlinkCommand.prototype={exec:function(b){var a=new CKEDITOR.style({element:"a",type:CKEDITOR.STYLE_INLINE,alwaysRemoveElement:1});b.removeStyle(a)},refresh:function(b,a){var d=a.lastElement&&a.lastElement.getAscendant("a",!0);d&&"a"==d.getName()&&d.getAttribute("href")&&d.getChildCount()?this.setState(CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_DISABLED)},contextSensitive:1,startDisabled:1,requiredContent:"a[href]"};
    +CKEDITOR.removeAnchorCommand=function(){};CKEDITOR.removeAnchorCommand.prototype={exec:function(b){var a=b.getSelection(),d=a.createBookmarks(),c;if(a&&(c=a.getSelectedElement())&&(CKEDITOR.plugins.link.fakeAnchor&&!c.getChildCount()?CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,c):c.is("a")))c.remove(1);else if(c=CKEDITOR.plugins.link.getSelectedLink(b))c.hasAttribute("href")?(c.removeAttributes({name:1,"data-cke-saved-name":1}),c.removeClass("cke_anchor")):c.remove(1);a.selectBookmarks(d)},requiredContent:"a[name]"};
    +CKEDITOR.tools.extend(CKEDITOR.config,{linkShowAdvancedTab:!0,linkShowTargetTab:!0});(function(){CKEDITOR.plugins.liststyle={requires:"dialog,contextmenu",init:function(a){if(!a.blockless){var b;b=new CKEDITOR.dialogCommand("numberedListStyle",{requiredContent:"ol",allowedContent:"ol{list-style-type}[start]"});b=a.addCommand("numberedListStyle",b);a.addFeature(b);CKEDITOR.dialog.add("numberedListStyle",this.path+"dialogs/liststyle.js");b=new CKEDITOR.dialogCommand("bulletedListStyle",{requiredContent:"ul",allowedContent:"ul{list-style-type}"});b=a.addCommand("bulletedListStyle",b);
    +a.addFeature(b);CKEDITOR.dialog.add("bulletedListStyle",this.path+"dialogs/liststyle.js");a.addMenuGroup("list",108);a.addMenuItems({numberedlist:{label:a.lang.liststyle.numberedTitle,group:"list",command:"numberedListStyle"},bulletedlist:{label:a.lang.liststyle.bulletedTitle,group:"list",command:"bulletedListStyle"}});a.contextMenu.addListener(function(a){if(!a||a.isReadOnly())return null;for(;a;){var b=a.getName();if("ol"==b)return{numberedlist:CKEDITOR.TRISTATE_OFF};if("ul"==b)return{bulletedlist:CKEDITOR.TRISTATE_OFF};
    +a=a.getParent()}return null})}}};CKEDITOR.plugins.add("liststyle",CKEDITOR.plugins.liststyle)})();(function(){function N(a,b,d){return l(b)&&l(d)&&d.equals(b.getNext(function(a){return!(y(a)||z(a)||o(a))}))}function t(a){this.upper=a[0];this.lower=a[1];this.set.apply(this,a.slice(2))}function H(a){var b=a.element,d;return b&&l(b)?(d=b.getAscendant(a.triggers,!0))&&!d.contains(a.editable)&&!d.equals(a.editable)?d:null:null}function ba(a,b,d){m(a,b);m(a,d);a=b.size.bottom;d=d.size.top;return a&&d?0|(a+d)/2:a||d}function q(a,b,d){return b=b[d?"getPrevious":"getNext"](function(e){return e&&e.type==
    +CKEDITOR.NODE_TEXT&&!y(e)||l(e)&&!o(e)&&!u(a,e)})}function ca(a){var b=a.doc,d=A('<span contenteditable="false" style="'+I+"position:absolute;border-top:1px dashed "+a.boxColor+'"></span>',b);p(d,{attach:function(){this.wrap.getParent()||this.wrap.appendTo(a.editable,!0);return this},lineChildren:[p(A('<span title="'+a.editor.lang.magicline.title+'" contenteditable="false">&#8629;</span>',b),{base:I+"height:17px;width:17px;"+(a.rtl?"left":"right")+":17px;background:url("+this.path+"images/icon.png) center no-repeat "+
    +a.boxColor+";cursor:pointer;"+(n.hc?"font-size: 15px;line-height:14px;border:1px solid #fff;text-align:center;":""),looks:["top:-8px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","2px",1),"top:-17px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","2px 2px 0px 0px",1),"top:-1px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","0px 0px 2px 2px",1)]}),p(A(O,b),{base:P+"left:0px;border-left-color:"+a.boxColor+";",looks:["border-width:8px 0 8px 8px;top:-8px","border-width:8px 0 0 8px;top:-8px","border-width:0 0 8px 8px;top:0px"]}),
    +p(A(O,b),{base:P+"right:0px;border-right-color:"+a.boxColor+";",looks:["border-width:8px 8px 8px 0;top:-8px","border-width:8px 8px 0 0;top:-8px","border-width:0 8px 8px 0;top:0px"]})],detach:function(){this.wrap.getParent()&&this.wrap.remove();return this},mouseNear:function(){m(a,this);var e=a.holdDistance,b=this.size;return b&&a.mouse.y>b.top-e&&a.mouse.y<b.bottom+e&&a.mouse.x>b.left-e&&a.mouse.x<b.right+e?!0:!1},place:function(){var e=a.view,b=a.editable,c=a.trigger,d=c.upper,i=c.lower,h=d||i,
    +k=h.getParent(),g={};this.trigger=c;d&&m(a,d,!0);i&&m(a,i,!0);m(a,k,!0);a.inInlineMode&&B(a,!0);k.equals(b)?(g.left=e.scroll.x,g.right=-e.scroll.x,g.width=""):(g.left=h.size.left-h.size.margin.left+e.scroll.x-(a.inInlineMode?e.editable.left+e.editable.border.left:0),g.width=h.size.outerWidth+h.size.margin.left+h.size.margin.right+e.scroll.x,g.right="");d&&i?g.top=d.size.margin.bottom===i.size.margin.top?0|d.size.bottom+d.size.margin.bottom/2:d.size.margin.bottom<i.size.margin.top?d.size.bottom+d.size.margin.bottom:
    +d.size.bottom+d.size.margin.bottom-i.size.margin.top:d?i||(g.top=d.size.bottom+d.size.margin.bottom):g.top=i.size.top-i.size.margin.top;c.is(w)||g.top>e.scroll.y-15&&g.top<e.scroll.y+5?(g.top=a.inInlineMode?0:e.scroll.y,this.look(w)):c.is(x)||g.top>e.pane.bottom-5&&g.top<e.pane.bottom+15?(g.top=a.inInlineMode?e.editable.height+e.editable.padding.top+e.editable.padding.bottom:e.pane.bottom-1,this.look(x)):(a.inInlineMode&&(g.top-=e.editable.top+e.editable.border.top),this.look(r));a.inInlineMode&&
    +(g.top--,g.top+=e.editable.scroll.top,g.left+=e.editable.scroll.left);for(var Q in g)g[Q]=CKEDITOR.tools.cssLength(g[Q]);this.setStyles(g)},look:function(a){if(this.oldLook!=a){for(var d=this.lineChildren.length,c;d--;)(c=this.lineChildren[d]).setAttribute("style",c.base+c.looks[0|a/2]);this.oldLook=a}},wrap:new J("span",a.doc)});for(b=d.lineChildren.length;b--;)d.lineChildren[b].appendTo(d);d.look(r);d.appendTo(d.wrap);d.unselectable();d.lineChildren[0].on("mouseup",function(b){d.detach();K(a,function(d){var c=
    +a.line.trigger;d[c.is(C)?"insertBefore":"insertAfter"](c.is(C)?c.lower:c.upper)},!0);a.editor.focus();!n.ie&&a.enterMode!=CKEDITOR.ENTER_BR&&a.hotNode.scrollIntoView();b.data.preventDefault(!0)});d.on("mousedown",function(a){a.data.preventDefault(!0)});a.line=d}function K(a,b,d){var e=new CKEDITOR.dom.range(a.doc),f=a.editor,c;n.ie&&a.enterMode==CKEDITOR.ENTER_BR?c=a.doc.createText(D):(c=new J(a.enterBehavior,a.doc),a.enterMode!=CKEDITOR.ENTER_BR&&a.doc.createText(D).appendTo(c));d&&f.fire("saveSnapshot");
    +b(c);e.moveToPosition(c,CKEDITOR.POSITION_AFTER_START);f.getSelection().selectRanges([e]);a.hotNode=c;d&&f.fire("saveSnapshot")}function R(a,b){return{canUndo:!0,modes:{wysiwyg:1},exec:function(){function d(d){var f=n.ie&&9>n.version?" ":D,c=a.hotNode&&a.hotNode.getText()==f&&a.element.equals(a.hotNode)&&a.lastCmdDirection===!!b;K(a,function(f){c&&a.hotNode&&a.hotNode.remove();f[b?"insertAfter":"insertBefore"](d);f.setAttributes({"data-cke-magicline-hot":1,"data-cke-magicline-dir":!!b});a.lastCmdDirection=
    +!!b});!n.ie&&a.enterMode!=CKEDITOR.ENTER_BR&&a.hotNode.scrollIntoView();a.line.detach()}return function(e){e=e.getSelection().getStartElement();if((e=e.getAscendant(S,1))&&!e.equals(a.editable)&&!e.contains(a.editable)){a.element=e;var f=q(a,e,!b),c;l(f)&&f.is(a.triggers)&&f.is(da)&&(!q(a,f,!b)||(c=q(a,f,!b))&&l(c)&&c.is(a.triggers))?d(f):(c=H(a,e),l(c)&&(q(a,c,!b)?(e=q(a,c,!b))&&(l(e)&&e.is(a.triggers))&&d(c):d(c)))}}}()}}function u(a,b){if(!b||!(b.type==CKEDITOR.NODE_ELEMENT&&b.$))return!1;var d=
    +a.line;return d.wrap.equals(b)||d.wrap.contains(b)}function l(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.$}function o(a){if(!l(a))return!1;var b;if(!(b=T(a)))l(a)?(b={left:1,right:1,center:1},b=!(!b[a.getComputedStyle("float")]&&!b[a.getAttribute("align")])):b=!1;return b}function T(a){return!!{absolute:1,fixed:1,relative:1}[a.getComputedStyle("position")]}function E(a,b){return l(b)?b.is(a.triggers):null}function ea(a,b,d){b=b[d?"getLast":"getFirst"](function(d){return a.isRelevant(d)&&!d.is(fa)});
    +if(!b)return!1;m(a,b);return d?b.size.top>a.mouse.y:b.size.bottom<a.mouse.y}function U(a){var b=a.editable,d=a.mouse,e=a.view,f=a.triggerOffset;B(a);var c=d.y>(a.inInlineMode?e.editable.top+e.editable.height/2:Math.min(e.editable.height,e.pane.height)/2),b=b[c?"getLast":"getFirst"](function(a){return!(y(a)||z(a))});if(!b)return null;u(a,b)&&(b=a.line.wrap[c?"getPrevious":"getNext"](function(a){return!(y(a)||z(a))}));if(!l(b)||o(b)||!E(a,b))return null;m(a,b);return!c&&0<=b.size.top&&0<d.y&&d.y<b.size.top+
    +f?(a=a.inInlineMode||0===e.scroll.y?w:r,new t([null,b,C,F,a])):c&&b.size.bottom<=e.pane.height&&d.y>b.size.bottom-f&&d.y<e.pane.height?(a=a.inInlineMode||b.size.bottom>e.pane.height-f&&b.size.bottom<e.pane.height?x:r,new t([b,null,V,F,a])):null}function W(a){var b=a.mouse,d=a.view,e=a.triggerOffset,f=H(a);if(!f)return null;m(a,f);var e=Math.min(e,0|f.size.outerHeight/2),c=[],j,i;if(b.y>f.size.top-1&&b.y<f.size.top+e)i=!1;else if(b.y>f.size.bottom-e&&b.y<f.size.bottom+1)i=!0;else return null;if(o(f)||
    +ea(a,f,i)||f.getParent().is(X))return null;var h=q(a,f,!i);if(h){if(h&&h.type==CKEDITOR.NODE_TEXT)return null;if(l(h)){if(o(h)||!E(a,h)||h.getParent().is(X))return null;c=[h,f][i?"reverse":"concat"]().concat([L,F])}}else f.equals(a.editable[i?"getLast":"getFirst"](a.isRelevant))?(B(a),i&&b.y>f.size.bottom-e&&b.y<d.pane.height&&f.size.bottom>d.pane.height-e&&f.size.bottom<d.pane.height?j=x:0<b.y&&b.y<f.size.top+e&&(j=w)):j=r,c=[null,f][i?"reverse":"concat"]().concat([i?V:C,F,j,f.equals(a.editable[i?
    +"getLast":"getFirst"](a.isRelevant))?i?x:w:r]);return 0 in c?new t(c):null}function M(a,b,d,e){for(var f=function(){var d=n.ie?b.$.currentStyle:a.win.$.getComputedStyle(b.$,"");return n.ie?function(a){return d[CKEDITOR.tools.cssStyleToDomStyle(a)]}:function(a){return d.getPropertyValue(a)}}(),c=b.getDocumentPosition(),j={},i={},h={},k={},g=s.length;g--;)j[s[g]]=parseInt(f("border-"+s[g]+"-width"),10)||0,h[s[g]]=parseInt(f("padding-"+s[g]),10)||0,i[s[g]]=parseInt(f("margin-"+s[g]),10)||0;(!d||e)&&
    +G(a,e);k.top=c.y-(d?0:a.view.scroll.y);k.left=c.x-(d?0:a.view.scroll.x);k.outerWidth=b.$.offsetWidth;k.outerHeight=b.$.offsetHeight;k.height=k.outerHeight-(h.top+h.bottom+j.top+j.bottom);k.width=k.outerWidth-(h.left+h.right+j.left+j.right);k.bottom=k.top+k.outerHeight;k.right=k.left+k.outerWidth;a.inInlineMode&&(k.scroll={top:b.$.scrollTop,left:b.$.scrollLeft});return p({border:j,padding:h,margin:i,ignoreScroll:d},k,!0)}function m(a,b,d){if(!l(b))return b.size=null;if(b.size){if(b.size.ignoreScroll==
    +d&&b.size.date>new Date-Y)return null}else b.size={};return p(b.size,M(a,b,d),{date:+new Date},!0)}function B(a,b){a.view.editable=M(a,a.editable,b,!0)}function G(a,b){a.view||(a.view={});var d=a.view;if(b||!(d&&d.date>new Date-Y)){var e=a.win,d=e.getScrollPosition(),e=e.getViewPaneSize();p(a.view,{scroll:{x:d.x,y:d.y,width:a.doc.$.documentElement.scrollWidth-e.width,height:a.doc.$.documentElement.scrollHeight-e.height},pane:{width:e.width,height:e.height,bottom:e.height+d.y},date:+new Date},!0)}}
    +function ga(a,b,d,e){for(var f=e,c=e,j=0,i=!1,h=!1,k=a.view.pane.height,g=a.mouse;g.y+j<k&&0<g.y-j;){i||(i=b(f,e));h||(h=b(c,e));!i&&0<g.y-j&&(f=d(a,{x:g.x,y:g.y-j}));!h&&g.y+j<k&&(c=d(a,{x:g.x,y:g.y+j}));if(i&&h)break;j+=2}return new t([f,c,null,null])}CKEDITOR.plugins.add("magicline",{init:function(a){var b={};b[CKEDITOR.ENTER_BR]="br";b[CKEDITOR.ENTER_P]="p";b[CKEDITOR.ENTER_DIV]="div";var d=a.config,e=d.magicline_triggerOffset||30,f=d.enterMode,c={editor:a,enterBehavior:b[f],enterMode:f,triggerOffset:e,
    +holdDistance:0|e*(d.magicline_holdDistance||0.5),boxColor:d.magicline_color||"#ff0000",rtl:"rtl"==d.contentsLangDirection,triggers:d.magicline_everywhere?S:{table:1,hr:1,div:1,ul:1,ol:1,dl:1,form:1,blockquote:1}},j,i,h;c.isRelevant=function(a){return l(a)&&!u(c,a)&&!o(a)};a.on("contentDom",function(){var b=a.editable(),e=a.document,f=a.window;p(c,{editable:b,inInlineMode:b.isInline(),doc:e,win:f},!0);c.boundary=c.inInlineMode?c.editable:c.doc.getDocumentElement();b.is(v.$inline)||(c.inInlineMode&&
    +!T(b)&&b.setStyles({position:"relative",top:null,left:null}),ca.call(this,c),G(c),b.attachListener(a,"beforeUndoImage",function(){c.line.detach()}),b.attachListener(a,"beforeGetData",function(){c.line.wrap.getParent()&&(c.line.detach(),a.once("getData",function(){c.line.attach()},null,null,1E3))},null,null,0),b.attachListener(c.inInlineMode?e:e.getWindow().getFrame(),"mouseout",function(b){if("wysiwyg"==a.mode)if(c.inInlineMode){var d=b.data.$.clientX,b=b.data.$.clientY;G(c);B(c,!0);var e=c.view.editable,
    +f=c.view.scroll;if(!(d>e.left-f.x&&d<e.right-f.x)||!(b>e.top-f.y&&b<e.bottom-f.y))clearTimeout(h),h=null,c.line.detach()}else clearTimeout(h),h=null,c.line.detach()}),b.attachListener(b,"keyup",function(){c.hiddenMode=0}),b.attachListener(b,"keydown",function(b){if("wysiwyg"==a.mode)switch(b=b.data.getKeystroke(),a.getSelection().getStartElement(),b){case 2228240:case 16:c.hiddenMode=1,c.line.detach()}}),b.attachListener(c.inInlineMode?b:e,"mousemove",function(b){i=!0;if(!("wysiwyg"!=a.mode||a.readOnly||
    +h)){var d={x:b.data.$.clientX,y:b.data.$.clientY};h=setTimeout(function(){c.mouse=d;h=c.trigger=null;G(c);if(i&&!c.hiddenMode&&a.focusManager.hasFocus&&!c.line.mouseNear()&&(c.element=Z(c,!0)))(c.trigger=U(c)||W(c)||$(c))?c.line.attach().place():(c.trigger=null,c.line.detach()),i=!1},30)}}),b.attachListener(f,"scroll",function(){"wysiwyg"==a.mode&&(c.line.detach(),n.webkit&&(c.hiddenMode=1,clearTimeout(j),j=setTimeout(function(){c.hiddenMode=0},50)))}),b.attachListener(f,"mousedown",function(){"wysiwyg"==
    +a.mode&&(c.line.detach(),c.hiddenMode=1)}),b.attachListener(f,"mouseup",function(){c.hiddenMode=0}),a.addCommand("accessPreviousSpace",R(c)),a.addCommand("accessNextSpace",R(c,!0)),a.setKeystroke([[d.magicline_keystrokePrevious,"accessPreviousSpace"],[d.magicline_keystrokeNext,"accessNextSpace"]]),a.on("loadSnapshot",function(){for(var b=a.document.getElementsByTag(c.enterBehavior),d,e=b.count();e--;)if((d=b.getItem(e)).hasAttribute("data-cke-magicline-hot")){c.hotNode=d;c.lastCmdDirection="true"===
    +d.getAttribute("data-cke-magicline-dir")?!0:!1;break}}),this.backdoor={accessFocusSpace:K,boxTrigger:t,isLine:u,getAscendantTrigger:H,getNonEmptyNeighbour:q,getSize:M,that:c,triggerEdge:W,triggerEditable:U,triggerExpand:$})},this)}});var p=CKEDITOR.tools.extend,J=CKEDITOR.dom.element,A=J.createFromHtml,n=CKEDITOR.env,v=CKEDITOR.dtd,C=128,V=64,L=32,F=16,aa=8,w=4,x=2,r=1,D="聽",X=v.$listItem,fa=v.$tableContent,da=p({},v.$nonEditable,v.$empty),S=v.$block,Y=100,I="width:0px;height:0px;padding:0px;margin:0px;display:block;z-index:9999;color:#fff;position:absolute;font-size: 0px;line-height:0px;",
    +P=I+"border-color:transparent;display:block;border-style:solid;",O="<span>"+D+"</span>";t.prototype={set:function(a,b,d){this.properties=a+b+(d||r);return this},is:function(a){return(this.properties&a)==a}};var Z=function(){return function(a,b,d){if(!a.mouse)return null;var e=a.doc,f=a.line.wrap,d=d||a.mouse,c=new CKEDITOR.dom.element(e.$.elementFromPoint(d.x,d.y));b&&u(a,c)&&(f.hide(),c=new CKEDITOR.dom.element(e.$.elementFromPoint(d.x,d.y)),f.show());return!c||!(c.type==CKEDITOR.NODE_ELEMENT&&c.$)||
    +n.ie&&9>n.version&&!a.boundary.equals(c)&&!a.boundary.contains(c)?null:c}}(),y=CKEDITOR.dom.walker.whitespaces(),z=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_COMMENT),$=function(){function a(a){var e=a.element,f,c,j;if(!l(e)||e.contains(a.editable))return null;j=ga(a,function(a,b){return!b.equals(a)},function(a,b){return Z(a,!0,b)},e);f=j.upper;c=j.lower;if(N(a,f,c))return j.set(L,aa);if(f&&e.contains(f))for(;!f.getParent().equals(e);)f=f.getParent();else f=e.getFirst(function(c){return b(a,c)});
    +if(c&&e.contains(c))for(;!c.getParent().equals(e);)c=c.getParent();else c=e.getLast(function(c){return b(a,c)});if(!f||!c)return null;m(a,f);m(a,c);if(!(a.mouse.y>f.size.top&&a.mouse.y<c.size.bottom))return null;for(var e=Number.MAX_VALUE,i,h,k,g;c&&!c.equals(f)&&(h=f.getNext(a.isRelevant));)i=Math.abs(ba(a,f,h)-a.mouse.y),i<e&&(e=i,k=f,g=h),f=h,m(a,f);if(!k||!g||!(a.mouse.y>k.size.top&&a.mouse.y<g.size.bottom))return null;j.upper=k;j.lower=g;return j.set(L,aa)}function b(a,b){return!(b&&b.type==
    +CKEDITOR.NODE_TEXT||z(b)||o(b)||u(a,b)||b.type==CKEDITOR.NODE_ELEMENT&&b.$&&b.is("br"))}return function(b){var e=a(b),f;if(f=e){f=e.upper;var c=e.lower;f=!f||!c||o(c)||o(f)||c.equals(f)||f.equals(c)||c.contains(f)||f.contains(c)?!1:E(b,f)&&E(b,c)&&N(b,f,c)?!0:!1}return f?e:null}}(),s=["top","left","right","bottom"]})();CKEDITOR.config.magicline_keystrokePrevious=CKEDITOR.CTRL+CKEDITOR.SHIFT+219;CKEDITOR.config.magicline_keystrokeNext=CKEDITOR.CTRL+CKEDITOR.SHIFT+221;(function(){function l(a){if(!a||a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())return[];for(var e=[],f=["style","className"],b=0;b<f.length;b++){var d=a.$.elements.namedItem(f[b]);d&&(d=new CKEDITOR.dom.element(d),e.push([d,d.nextSibling]),d.remove())}return e}function o(a,e){if(a&&!(a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())&&0<e.length)for(var f=e.length-1;0<=f;f--){var b=e[f][0],d=e[f][1];d?b.insertBefore(d):b.appendTo(a)}}function n(a,e){var f=l(a),b={},d=a.$;e||(b["class"]=d.className||
    +"",d.className="");b.inline=d.style.cssText||"";e||(d.style.cssText="position: static; overflow: visible");o(f);return b}function p(a,e){var f=l(a),b=a.$;"class"in e&&(b.className=e["class"]);"inline"in e&&(b.style.cssText=e.inline);o(f)}function q(a){if(!a.editable().isInline()){var e=CKEDITOR.instances,f;for(f in e){var b=e[f];"wysiwyg"==b.mode&&!b.readOnly&&(b=b.document.getBody(),b.setAttribute("contentEditable",!1),b.setAttribute("contentEditable",!0))}a.editable().hasFocus&&(a.toolbox.focus(),
    +a.focus())}}CKEDITOR.plugins.add("maximize",{init:function(a){function e(){var b=d.getViewPaneSize();a.resize(b.width,b.height,null,!0)}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var f=a.lang,b=CKEDITOR.document,d=b.getWindow(),j,k,m,l=CKEDITOR.TRISTATE_OFF;a.addCommand("maximize",{modes:{wysiwyg:!CKEDITOR.env.iOS,source:!CKEDITOR.env.iOS},readOnly:1,editorFocus:!1,exec:function(){var h=a.container.getChild(1),g=a.ui.space("contents");if("wysiwyg"==a.mode){var c=a.getSelection();j=c&&c.getRanges();
    +k=d.getScrollPosition()}else{var i=a.editable().$;j=!CKEDITOR.env.ie&&[i.selectionStart,i.selectionEnd];k=[i.scrollLeft,i.scrollTop]}if(this.state==CKEDITOR.TRISTATE_OFF){d.on("resize",e);m=d.getScrollPosition();for(c=a.container;c=c.getParent();)c.setCustomData("maximize_saved_styles",n(c)),c.setStyle("z-index",a.config.baseFloatZIndex-5);g.setCustomData("maximize_saved_styles",n(g,!0));h.setCustomData("maximize_saved_styles",n(h,!0));g={overflow:CKEDITOR.env.webkit?"":"hidden",width:0,height:0};
    +b.getDocumentElement().setStyles(g);!CKEDITOR.env.gecko&&b.getDocumentElement().setStyle("position","fixed");(!CKEDITOR.env.gecko||!CKEDITOR.env.quirks)&&b.getBody().setStyles(g);CKEDITOR.env.ie?setTimeout(function(){d.$.scrollTo(0,0)},0):d.$.scrollTo(0,0);h.setStyle("position",CKEDITOR.env.gecko&&CKEDITOR.env.quirks?"fixed":"absolute");h.$.offsetLeft;h.setStyles({"z-index":a.config.baseFloatZIndex-5,left:"0px",top:"0px"});h.addClass("cke_maximized");e();g=h.getDocumentPosition();h.setStyles({left:-1*
    +g.x+"px",top:-1*g.y+"px"});CKEDITOR.env.gecko&&q(a)}else if(this.state==CKEDITOR.TRISTATE_ON){d.removeListener("resize",e);g=[g,h];for(c=0;c<g.length;c++)p(g[c],g[c].getCustomData("maximize_saved_styles")),g[c].removeCustomData("maximize_saved_styles");for(c=a.container;c=c.getParent();)p(c,c.getCustomData("maximize_saved_styles")),c.removeCustomData("maximize_saved_styles");CKEDITOR.env.ie?setTimeout(function(){d.$.scrollTo(m.x,m.y)},0):d.$.scrollTo(m.x,m.y);h.removeClass("cke_maximized");CKEDITOR.env.webkit&&
    +(h.setStyle("display","inline"),setTimeout(function(){h.setStyle("display","block")},0));a.fire("resize")}this.toggleState();if(c=this.uiItems[0])g=this.state==CKEDITOR.TRISTATE_OFF?f.maximize.maximize:f.maximize.minimize,c=CKEDITOR.document.getById(c._.id),c.getChild(1).setHtml(g),c.setAttribute("title",g),c.setAttribute("href",'javascript:void("'+g+'");');"wysiwyg"==a.mode?j?(CKEDITOR.env.gecko&&q(a),a.getSelection().selectRanges(j),(i=a.getSelection().getStartElement())&&i.scrollIntoView(!0)):
    +d.$.scrollTo(k.x,k.y):(j&&(i.selectionStart=j[0],i.selectionEnd=j[1]),i.scrollLeft=k[0],i.scrollTop=k[1]);j=k=null;l=this.state;a.fire("maximize",this.state)},canUndo:!1});a.ui.addButton&&a.ui.addButton("Maximize",{label:f.maximize.maximize,command:"maximize",toolbar:"tools,10"});a.on("mode",function(){var b=a.getCommand("maximize");b.setState(b.state==CKEDITOR.TRISTATE_DISABLED?CKEDITOR.TRISTATE_DISABLED:l)},null,null,100)}}})})();CKEDITOR.plugins.add("newpage",{init:function(a){a.addCommand("newpage",{modes:{wysiwyg:1,source:1},exec:function(b){var a=this;b.setData(b.config.newpage_html||"",function(){b.focus();setTimeout(function(){b.fire("afterCommandExec",{name:"newpage",command:a});b.selectionChange()},200)})},async:!0});a.ui.addButton&&a.ui.addButton("NewPage",{label:a.lang.newpage.toolbar,command:"newpage",toolbar:"document,20"})}});CKEDITOR.plugins.add("pagebreak",{requires:"fakeobjects",onLoad:function(){var a=["{","background: url("+CKEDITOR.getUrl(this.path+"images/pagebreak.gif")+") no-repeat center center;","clear: both;width:100%; _width:99.9%;border-top: #999999 1px dotted;border-bottom: #999999 1px dotted;padding:0;height: 5px;cursor: default;}"].join("").replace(/;/g," !important;");CKEDITOR.addCss("div.cke_pagebreak"+a)},init:function(a){a.blockless||(a.addCommand("pagebreak",CKEDITOR.plugins.pagebreakCmd),a.ui.addButton&&
    +a.ui.addButton("PageBreak",{label:a.lang.pagebreak.toolbar,command:"pagebreak",toolbar:"insert,70"}),CKEDITOR.env.opera&&a.on("contentDom",function(){a.document.on("click",function(b){b=b.data.getTarget();b.is("div")&&b.hasClass("cke_pagebreak")&&a.getSelection().selectElement(b)})}))},afterInit:function(a){var b=a.lang.pagebreak.alt,c=a.dataProcessor,a=c&&c.dataFilter;(c=c&&c.htmlFilter)&&c.addRules({attributes:{"class":function(a,b){var c=a.replace("cke_pagebreak","");if(c!=a){var d=CKEDITOR.htmlParser.fragment.fromHtml('<span style="display: none;">&nbsp;</span>').children[0];
    +b.children.length=0;b.add(d);d=b.attributes;delete d["aria-label"];delete d.contenteditable;delete d.title}return c}}},5);a&&a.addRules({elements:{div:function(a){var c=a.attributes,e=c&&c.style,d=e&&1==a.children.length&&a.children[0];if((d=d&&"span"==d.name&&d.attributes.style)&&/page-break-after\s*:\s*always/i.test(e)&&/display\s*:\s*none/i.test(d))c.contenteditable="false",c["class"]="cke_pagebreak",c["data-cke-display-name"]="pagebreak",c["aria-label"]=b,c.title=b,a.children.length=0}}})}});
    +CKEDITOR.plugins.pagebreakCmd={exec:function(a){var b=a.lang.pagebreak.alt,b=CKEDITOR.dom.element.createFromHtml('<div style="page-break-after: always;"contenteditable="false" title="'+b+'" aria-label="'+b+'" data-cke-display-name="pagebreak" class="cke_pagebreak"></div>',a.document);a.insertElement(b)},context:"div",allowedContent:{div:{styles:"!page-break-after"},span:{match:function(a){return(a=a.parent)&&"div"==a.name&&a.styles["page-break-after"]},styles:"display"}},requiredContent:"div{page-break-after}"};(function(){var c={canUndo:!1,async:!0,exec:function(a){a.getClipboardData({title:a.lang.pastetext.title},function(b){b&&a.fire("paste",{type:"text",dataValue:b.dataValue});a.fire("afterCommandExec",{name:"pastetext",command:c,returnValue:!!b})})}};CKEDITOR.plugins.add("pastetext",{requires:"clipboard",init:function(a){a.addCommand("pastetext",c);a.ui.addButton&&a.ui.addButton("PasteText",{label:a.lang.pastetext.button,command:"pastetext",toolbar:"clipboard,40"});if(a.config.forcePasteAsPlainText)a.on("beforePaste",
    +function(a){"html"!=a.data.type&&(a.data.type="text")});a.on("pasteState",function(b){a.getCommand("pastetext").setState(b.data)})}})})();(function(){function h(a,d,f){var b=CKEDITOR.cleanWord;b?f():(a=CKEDITOR.getUrl(a.config.pasteFromWordCleanupFile||d+"filter/default.js"),CKEDITOR.scriptLoader.load(a,f,null,!0));return!b}function i(a){a.data.type="html"}CKEDITOR.plugins.add("pastefromword",{requires:"clipboard",init:function(a){var d=0,f=this.path;a.addCommand("pastefromword",{canUndo:!1,async:!0,exec:function(a){var e=this;d=1;a.once("beforePaste",i);a.getClipboardData({title:a.lang.pastefromword.title},function(c){c&&a.fire("paste",
    +{type:"html",dataValue:c.dataValue});a.fire("afterCommandExec",{name:"pastefromword",command:e,returnValue:!!c})})}});a.ui.addButton&&a.ui.addButton("PasteFromWord",{label:a.lang.pastefromword.toolbar,command:"pastefromword",toolbar:"clipboard,50"});a.on("pasteState",function(b){a.getCommand("pastefromword").setState(b.data)});a.on("paste",function(b){var e=b.data,c=e.dataValue;if(c&&(d||/(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test(c))){var g=h(a,f,function(){if(g)a.fire("paste",e);
    +else if(!a.config.pasteFromWordPromptCleanup||d||confirm(a.lang.pastefromword.confirmCleanup))e.dataValue=CKEDITOR.cleanWord(c,a)});g&&b.cancel()}},null,null,3)}})})();(function(){var h,i={modes:{wysiwyg:1,source:1},canUndo:!1,readOnly:1,exec:function(a){var g,b=a.config,e=b.baseHref?'<base href="'+b.baseHref+'"/>':"";if(b.fullPage)g=a.getData().replace(/<head>/,"$&"+e).replace(/[^>]*(?=<\/title>)/,"$& &mdash; "+a.lang.preview.preview);else{var b="<body ",d=a.document&&a.document.getBody();d&&(d.getAttribute("id")&&(b+='id="'+d.getAttribute("id")+'" '),d.getAttribute("class")&&(b+='class="'+d.getAttribute("class")+'" '));g=a.config.docType+'<html dir="'+a.config.contentsLangDirection+
    +'"><head>'+e+"<title>"+a.lang.preview.preview+"</title>"+CKEDITOR.tools.buildStyleHtml(a.config.contentsCss)+"</head>"+(b+">")+a.getData()+"</body></html>"}e=640;b=420;d=80;try{var c=window.screen,e=Math.round(0.8*c.width),b=Math.round(0.7*c.height),d=Math.round(0.1*c.width)}catch(i){}if(!a.fire("contentPreview",a={dataValue:g}))return!1;c="";CKEDITOR.env.ie&&(window._cke_htmlToLoad=a.dataValue,c="javascript:void( (function(){document.open();"+("("+CKEDITOR.tools.fixDomain+")();").replace(/\/\/.*?\n/g,
    +"").replace(/parent\./g,"window.opener.")+"document.write( window.opener._cke_htmlToLoad );document.close();window.opener._cke_htmlToLoad = null;})() )");CKEDITOR.env.gecko&&(window._cke_htmlToLoad=a.dataValue,c=h+"preview.html");c=window.open(c,null,"toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width="+e+",height="+b+",left="+d);if(!CKEDITOR.env.ie&&!CKEDITOR.env.gecko){var f=c.document;f.open();f.write(a.dataValue);f.close();CKEDITOR.env.webkit&&setTimeout(function(){f.body.innerHTML=
    +f.body.innerHTML+""},0)}return!0}};CKEDITOR.plugins.add("preview",{init:function(a){a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&(h=this.path,a.addCommand("preview",i),a.ui.addButton&&a.ui.addButton("Preview",{label:a.lang.preview.preview,command:"preview",toolbar:"document,40"}))}})})();CKEDITOR.plugins.add("print",{init:function(a){a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&(a.addCommand("print",CKEDITOR.plugins.print),a.ui.addButton&&a.ui.addButton("Print",{label:a.lang.print.toolbar,command:"print",toolbar:"document,50"}))}});CKEDITOR.plugins.print={exec:function(a){CKEDITOR.env.opera||(CKEDITOR.env.gecko?a.window.$.print():a.document.$.execCommand("Print"))},canUndo:!1,readOnly:1,modes:{wysiwyg:!CKEDITOR.env.opera}};CKEDITOR.plugins.add("removeformat",{init:function(a){a.addCommand("removeFormat",CKEDITOR.plugins.removeformat.commands.removeformat);a.ui.addButton&&a.ui.addButton("RemoveFormat",{label:a.lang.removeformat.toolbar,command:"removeFormat",toolbar:"cleanup,10"})}});
    +CKEDITOR.plugins.removeformat={commands:{removeformat:{exec:function(a){for(var h=a._.removeFormatRegex||(a._.removeFormatRegex=RegExp("^(?:"+a.config.removeFormatTags.replace(/,/g,"|")+")$","i")),e=a._.removeAttributes||(a._.removeAttributes=a.config.removeFormatAttributes.split(",")),f=CKEDITOR.plugins.removeformat.filter,k=a.getSelection().getRanges(1),l=k.createIterator(),c;c=l.getNextRange();){c.collapsed||c.enlarge(CKEDITOR.ENLARGE_ELEMENT);var i=c.createBookmark(),b=i.startNode,j=i.endNode,
    +d=function(b){for(var c=a.elementPath(b),e=c.elements,d=1,g;(g=e[d])&&!g.equals(c.block)&&!g.equals(c.blockLimit);d++)h.test(g.getName())&&f(a,g)&&b.breakParent(g)};d(b);if(j){d(j);for(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT);b&&!b.equals(j);)d=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT),!("img"==b.getName()&&b.data("cke-realelement"))&&f(a,b)&&(h.test(b.getName())?b.remove(1):(b.removeAttributes(e),a.fire("removeFormatCleanup",b))),b=d}c.moveToBookmark(i)}a.forceNextSelectionCheck();a.getSelection().selectRanges(k)}}},
    +filter:function(a,h){for(var e=a._.removeFormatFilters||[],f=0;f<e.length;f++)if(!1===e[f](h))return!1;return!0}};CKEDITOR.editor.prototype.addRemoveFormatFilter=function(a){this._.removeFormatFilters||(this._.removeFormatFilters=[]);this._.removeFormatFilters.push(a)};CKEDITOR.config.removeFormatTags="b,big,code,del,dfn,em,font,i,ins,kbd,q,s,samp,small,span,strike,strong,sub,sup,tt,u,var";CKEDITOR.config.removeFormatAttributes="class,style,lang,width,height,align,hspace,valign";(function(){var b={modes:{wysiwyg:1,source:1},readOnly:1,exec:function(a){if(a=a.element.$.form)try{a.submit()}catch(b){a.submit.click&&a.submit.click()}}};CKEDITOR.plugins.add("save",{init:function(a){a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&(a.addCommand("save",b).modes={wysiwyg:!!a.element.$.form},a.ui.addButton&&a.ui.addButton("Save",{label:a.lang.save.toolbar,command:"save",toolbar:"document,10"}))}})})();(function(){CKEDITOR.plugins.add("selectall",{init:function(b){b.addCommand("selectAll",{modes:{wysiwyg:1,source:1},exec:function(a){var b=a.editable();if(b.is("textarea"))a=b.$,CKEDITOR.env.ie?a.createTextRange().execCommand("SelectAll"):(a.selectionStart=0,a.selectionEnd=a.value.length),a.focus();else{if(b.is("body"))a.document.$.execCommand("SelectAll",!1,null);else{var c=a.createRange();c.selectNodeContents(b);c.select()}a.forceNextSelectionCheck();a.selectionChange()}},canUndo:!1});b.ui.addButton&&
    +b.ui.addButton("SelectAll",{label:b.lang.selectall.toolbar,command:"selectAll",toolbar:"selection,10"})}})})();(function(){var d={readOnly:1,preserveState:!0,editorFocus:!1,exec:function(a){this.toggleState();this.refresh(a)},refresh:function(a){if(a.document){var b=this.state==CKEDITOR.TRISTATE_ON&&(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE||a.focusManager.hasFocus)?"attachClass":"removeClass";a.editable()[b]("cke_show_blocks")}}};CKEDITOR.plugins.add("showblocks",{onLoad:function(){function a(a){return".%1.%2 p,.%1.%2 div,.%1.%2 pre,.%1.%2 address,.%1.%2 blockquote,.%1.%2 h1,.%1.%2 h2,.%1.%2 h3,.%1.%2 h4,.%1.%2 h5,.%1.%2 h6{background-position: top %3;padding-%3: 8px;}".replace(/%1/g,
    +"cke_show_blocks").replace(/%2/g,"cke_contents_"+a).replace(/%3/g,"rtl"==a?"right":"left")}CKEDITOR.addCss(".%2 p,.%2 div,.%2 pre,.%2 address,.%2 blockquote,.%2 h1,.%2 h2,.%2 h3,.%2 h4,.%2 h5,.%2 h6{background-repeat: no-repeat;border: 1px dotted gray;padding-top: 8px;}.%2 p{%1p.png);}.%2 div{%1div.png);}.%2 pre{%1pre.png);}.%2 address{%1address.png);}.%2 blockquote{%1blockquote.png);}.%2 h1{%1h1.png);}.%2 h2{%1h2.png);}.%2 h3{%1h3.png);}.%2 h4{%1h4.png);}.%2 h5{%1h5.png);}.%2 h6{%1h6.png);}".replace(/%1/g,
    +"background-image: url("+CKEDITOR.getUrl(this.path)+"images/block_").replace(/%2/g,"cke_show_blocks ")+a("ltr")+a("rtl"))},init:function(a){if(!a.blockless){var b=a.addCommand("showblocks",d);b.canUndo=!1;a.config.startupOutlineBlocks&&b.setState(CKEDITOR.TRISTATE_ON);a.ui.addButton&&a.ui.addButton("ShowBlocks",{label:a.lang.showblocks.toolbar,command:"showblocks",toolbar:"tools,20"});a.on("mode",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)});if(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE){var c=
    +function(){b.refresh(a)};a.on("focus",c);a.on("blur",c)}a.on("contentDom",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)})}}})})();(function(){var f={preserveState:!0,editorFocus:!1,readOnly:1,exec:function(a){this.toggleState();this.refresh(a)},refresh:function(a){if(a.document){var b=this.state==CKEDITOR.TRISTATE_ON?"attachClass":"removeClass";a.editable()[b]("cke_show_borders")}}};CKEDITOR.plugins.add("showborders",{modes:{wysiwyg:1},onLoad:function(){var a;a=(CKEDITOR.env.ie6Compat?[".%1 table.%2,",".%1 table.%2 td, .%1 table.%2 th","{","border : #d3d3d3 1px dotted","}"]:".%1 table.%2,;.%1 table.%2 > tr > td, .%1 table.%2 > tr > th,;.%1 table.%2 > tbody > tr > td, .%1 table.%2 > tbody > tr > th,;.%1 table.%2 > thead > tr > td, .%1 table.%2 > thead > tr > th,;.%1 table.%2 > tfoot > tr > td, .%1 table.%2 > tfoot > tr > th;{;border : #d3d3d3 1px dotted;}".split(";")).join("").replace(/%2/g,
    +"cke_show_border").replace(/%1/g,"cke_show_borders ");CKEDITOR.addCss(a)},init:function(a){var b=a.addCommand("showborders",f);b.canUndo=!1;!1!==a.config.startupShowBorders&&b.setState(CKEDITOR.TRISTATE_ON);a.on("mode",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)},null,null,100);a.on("contentDom",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)});a.on("removeFormatCleanup",function(d){d=d.data;a.getCommand("showborders").state==CKEDITOR.TRISTATE_ON&&(d.is("table")&&(!d.hasAttribute("border")||
    +0>=parseInt(d.getAttribute("border"),10)))&&d.addClass("cke_show_border")})},afterInit:function(a){var b=a.dataProcessor,a=b&&b.dataFilter,b=b&&b.htmlFilter;a&&a.addRules({elements:{table:function(a){var a=a.attributes,b=a["class"],c=parseInt(a.border,10);if((!c||0>=c)&&(!b||-1==b.indexOf("cke_show_border")))a["class"]=(b||"")+" cke_show_border"}}});b&&b.addRules({elements:{table:function(a){var a=a.attributes,b=a["class"];b&&(a["class"]=b.replace("cke_show_border","").replace(/\s{2}/," ").replace(/^\s+|\s+$/,
    +""))}}})}});CKEDITOR.on("dialogDefinition",function(a){var b=a.data.name;if("table"==b||"tableProperties"==b)if(a=a.data.definition,b=a.getContents("info").get("txtBorder"),b.commit=CKEDITOR.tools.override(b.commit,function(a){return function(b,c){a.apply(this,arguments);var e=parseInt(this.getValue(),10);c[!e||0>=e?"addClass":"removeClass"]("cke_show_border")}}),a=(a=a.getContents("advanced"))&&a.get("advCSSClasses"))a.setup=CKEDITOR.tools.override(a.setup,function(a){return function(){a.apply(this,
    +arguments);this.setValue(this.getValue().replace(/cke_show_border/,""))}}),a.commit=CKEDITOR.tools.override(a.commit,function(a){return function(b,c){a.apply(this,arguments);parseInt(c.getAttribute("border"),10)||c.addClass("cke_show_border")}})})})();(function(){CKEDITOR.plugins.add("sourcearea",{init:function(a){function d(){this.hide();this.setStyle("height",this.getParent().$.clientHeight+"px");this.setStyle("width",this.getParent().$.clientWidth+"px");this.show()}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var e=CKEDITOR.plugins.sourcearea;a.addMode("source",function(e){var b=a.ui.space("contents").getDocument().createElement("textarea");b.setStyles(CKEDITOR.tools.extend({width:CKEDITOR.env.ie7Compat?"99%":"100%",height:"100%",resize:"none",
    +outline:"none","text-align":"left"},CKEDITOR.tools.cssVendorPrefix("tab-size",a.config.sourceAreaTabSize||4)));b.setAttribute("dir","ltr");b.addClass("cke_source cke_reset cke_enable_context_menu");a.ui.space("contents").append(b);b=a.editable(new c(a,b));b.setData(a.getData(1));CKEDITOR.env.ie&&(b.attachListener(a,"resize",d,b),b.attachListener(CKEDITOR.document.getWindow(),"resize",d,b),CKEDITOR.tools.setTimeout(d,0,b));a.fire("ariaWidget",this);e()});a.addCommand("source",e.commands.source);a.ui.addButton&&
    +a.ui.addButton("Source",{label:a.lang.sourcearea.toolbar,command:"source",toolbar:"mode,10"});a.on("mode",function(){a.getCommand("source").setState("source"==a.mode?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)})}}});var c=CKEDITOR.tools.createClass({base:CKEDITOR.editable,proto:{setData:function(a){this.setValue(a);this.editor.fire("dataReady")},getData:function(){return this.getValue()},insertHtml:function(){},insertElement:function(){},insertText:function(){},setReadOnly:function(a){this[(a?"set":
    +"remove")+"Attribute"]("readOnly","readonly")},detach:function(){c.baseProto.detach.call(this);this.clearCustomData();this.remove()}}})})();CKEDITOR.plugins.sourcearea={commands:{source:{modes:{wysiwyg:1,source:1},editorFocus:!1,readOnly:1,exec:function(c){"wysiwyg"==c.mode&&c.fire("saveSnapshot");c.getCommand("source").setState(CKEDITOR.TRISTATE_DISABLED);c.setMode("source"==c.mode?"wysiwyg":"source")},canUndo:!1}}};CKEDITOR.plugins.add("specialchar",{availableLangs:{ar:1,bg:1,ca:1,cs:1,cy:1,de:1,el:1,en:1,eo:1,es:1,et:1,fa:1,fi:1,fr:1,"fr-ca":1,gl:1,he:1,hr:1,hu:1,id:1,it:1,ja:1,ku:1,lv:1,nb:1,nl:1,no:1,pl:1,pt:1,"pt-br":1,ru:1,si:1,sk:1,sl:1,sq:1,sv:1,th:1,tr:1,ug:1,uk:1,vi:1,"zh-cn":1},requires:"dialog",init:function(a){var c=this;CKEDITOR.dialog.add("specialchar",this.path+"dialogs/specialchar.js");a.addCommand("specialchar",{exec:function(){var b=a.langCode,b=c.availableLangs[b]?b:c.availableLangs[b.replace(/-.*/,
    +"")]?b.replace(/-.*/,""):"en";CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(c.path+"dialogs/lang/"+b+".js"),function(){CKEDITOR.tools.extend(a.lang.specialchar,c.langEntries[b]);a.openDialog("specialchar")})},modes:{wysiwyg:1},canUndo:!1});a.ui.addButton&&a.ui.addButton("SpecialChar",{label:a.lang.specialchar.toolbar,command:"specialchar",toolbar:"insert,50"})}});CKEDITOR.config.specialChars="! &quot; # $ % &amp; ' ( ) * + - . / 0 1 2 3 4 5 6 7 8 9 : ; &lt; = &gt; ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ &euro; &lsquo; &rsquo; &ldquo; &rdquo; &ndash; &mdash; &iexcl; &cent; &pound; &curren; &yen; &brvbar; &sect; &uml; &copy; &ordf; &laquo; &not; &reg; &macr; &deg; &sup2; &sup3; &acute; &micro; &para; &middot; &cedil; &sup1; &ordm; &raquo; &frac14; &frac12; &frac34; &iquest; &Agrave; &Aacute; &Acirc; &Atilde; &Auml; &Aring; &AElig; &Ccedil; &Egrave; &Eacute; &Ecirc; &Euml; &Igrave; &Iacute; &Icirc; &Iuml; &ETH; &Ntilde; &Ograve; &Oacute; &Ocirc; &Otilde; &Ouml; &times; &Oslash; &Ugrave; &Uacute; &Ucirc; &Uuml; &Yacute; &THORN; &szlig; &agrave; &aacute; &acirc; &atilde; &auml; &aring; &aelig; &ccedil; &egrave; &eacute; &ecirc; &euml; &igrave; &iacute; &icirc; &iuml; &eth; &ntilde; &ograve; &oacute; &ocirc; &otilde; &ouml; &divide; &oslash; &ugrave; &uacute; &ucirc; &uuml; &yacute; &thorn; &yuml; &OElig; &oelig; &#372; &#374 &#373 &#375; &sbquo; &#8219; &bdquo; &hellip; &trade; &#9658; &bull; &rarr; &rArr; &hArr; &diams; &asymp;".split(" ");CKEDITOR.plugins.add("menubutton",{requires:"button,menu",onLoad:function(){var d=function(a){var b=this._;if(b.state!==CKEDITOR.TRISTATE_DISABLED){b.previousState=b.state;var c=b.menu;c||(c=b.menu=new CKEDITOR.menu(a,{panel:{className:"cke_menu_panel",attributes:{"aria-label":a.lang.common.options}}}),c.onHide=CKEDITOR.tools.bind(function(){this.setState(this.modes&&this.modes[a.mode]?b.previousState:CKEDITOR.TRISTATE_DISABLED)},this),this.onMenu&&c.addListener(this.onMenu));b.on?c.hide():(this.setState(CKEDITOR.TRISTATE_ON),
    +setTimeout(function(){c.show(CKEDITOR.document.getById(b.id),4)},0))}};CKEDITOR.ui.menuButton=CKEDITOR.tools.createClass({base:CKEDITOR.ui.button,$:function(a){delete a.panel;this.base(a);this.hasArrow=!0;this.click=d},statics:{handler:{create:function(a){return new CKEDITOR.ui.menuButton(a)}}}})},beforeInit:function(d){d.ui.addHandler(CKEDITOR.UI_MENUBUTTON,CKEDITOR.ui.menuButton.handler)}});CKEDITOR.UI_MENUBUTTON="menubutton";(function(){function k(a,c){var b=0,d;for(d in c)if(c[d]==a){b=1;break}return b}var i="",r=function(){function a(){b.once("focus",f);b.once("blur",c)}function c(b){var b=b.editor,c=d.getScayt(b),f=b.elementMode==CKEDITOR.ELEMENT_MODE_INLINE;c&&(d.setPaused(b,!c.disabled),d.setControlId(b,c.id),c.destroy(!0),delete d.instances[b.name],f&&a())}var b=this,f=function(){if(!("undefined"!=typeof d.instances[b.name]||null!=d.instances[b.name])){var a=b.config,c={};c.srcNodeRef="BODY"==b.editable().$.nodeName?
    +b.document.getWindow().$.frameElement:b.editable().$;c.assocApp="CKEDITOR."+CKEDITOR.version+"@"+CKEDITOR.revision;c.customerid=a.scayt_customerid||"1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2";c.customDictionaryIds=a.scayt_customDictionaryIds||"";c.userDictionaryName=a.scayt_userDictionaryName||"";c.sLang=a.scayt_sLang||"en_US";c.onLoad=function(){CKEDITOR.env.ie&&8>CKEDITOR.env.version||this.addStyle(this.selectorCss(),"padding-bottom: 2px !important;");b.editable().hasFocus&&
    +!d.isControlRestored(b)&&this.focus()};c.onBeforeChange=function(){d.getScayt(b)&&!b.checkDirty()&&setTimeout(function(){b.resetDirty()},0)};a=window.scayt_custom_params;if("object"==typeof a)for(var f in a)c[f]=a[f];d.getControlId(b)&&(c.id=d.getControlId(b));var o=new window.scayt(c);o.afterMarkupRemove.push(function(a){(new CKEDITOR.dom.element(a,o.document)).mergeSiblings()});if(c=d.instances[b.name])o.sLang=c.sLang,o.option(c.option()),o.paused=c.paused;d.instances[b.name]=o;try{o.setDisabled(!1===
    +d.isPaused(b))}catch(e){}b.fire("showScaytState")}};b.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a():b.on("contentDom",f);b.on("contentDomUnload",function(){for(var a=CKEDITOR.document.getElementsByTag("script"),b=/^dojoIoScript(\d+)$/i,c=/^https?:\/\/svc\.webspellchecker\.net\/spellcheck\/script\/ssrv\.cgi/i,d=0;d<a.count();d++){var f=a.getItem(d),e=f.getId(),h=f.getAttribute("src");e&&(h&&e.match(b)&&h.match(c))&&f.remove()}});b.on("beforeCommandExec",function(a){"source"==a.data.name&&"source"==
    +b.mode&&d.markControlRestore(b)});b.on("afterCommandExec",function(a){d.isScaytEnabled(b)&&"wysiwyg"==b.mode&&("undo"==a.data.name||"redo"==a.data.name)&&window.setTimeout(function(){d.getScayt(b).refresh()},10)});b.on("destroy",c);b.on("setData",c);b.on("insertElement",function(){var a=d.getScayt(b);d.isScaytEnabled(b)&&(CKEDITOR.env.ie&&b.getSelection().unlock(!0),window.setTimeout(function(){a.focus();a.refresh()},10))},this,null,50);b.on("insertHtml",function(){var a=d.getScayt(b);d.isScaytEnabled(b)&&
    +(CKEDITOR.env.ie&&b.getSelection().unlock(!0),window.setTimeout(function(){a.focus();a.refresh()},10))},this,null,50);b.on("scaytDialog",function(a){a.data.djConfig=window.djConfig;a.data.scayt_control=d.getScayt(b);a.data.tab=i;a.data.scayt=window.scayt});var e=b.dataProcessor;(e=e&&e.htmlFilter)&&e.addRules({elements:{span:function(a){if(a.attributes["data-scayt_word"]&&a.attributes["data-scaytid"])return delete a.name,a}}});e=CKEDITOR.plugins.undo.Image.prototype;e.equals=CKEDITOR.tools.override(e.equals,
    +function(a){return function(b){var c=this.contents,f=b.contents,e=d.getScayt(this.editor);e&&d.isScaytReady(this.editor)&&(this.contents=e.reset(c)||"",b.contents=e.reset(f)||"");e=a.apply(this,arguments);this.contents=c;b.contents=f;return e}});b.document&&(b.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE||b.focusManager.hasFocus)&&f()};CKEDITOR.plugins.scayt={engineLoaded:!1,instances:{},controlInfo:{},setControlInfo:function(a,c){a&&(a.name&&"object"!=typeof this.controlInfo[a.name])&&(this.controlInfo[a.name]=
    +{});for(var b in c)this.controlInfo[a.name][b]=c[b]},isControlRestored:function(a){return a&&a.name&&this.controlInfo[a.name]?this.controlInfo[a.name].restored:!1},markControlRestore:function(a){this.setControlInfo(a,{restored:!0})},setControlId:function(a,c){this.setControlInfo(a,{id:c})},getControlId:function(a){return a&&a.name&&this.controlInfo[a.name]&&this.controlInfo[a.name].id?this.controlInfo[a.name].id:null},setPaused:function(a,c){this.setControlInfo(a,{paused:c})},isPaused:function(a){if(a&&
    +a.name&&this.controlInfo[a.name])return this.controlInfo[a.name].paused},getScayt:function(a){return this.instances[a.name]},isScaytReady:function(a){return!0===this.engineLoaded&&"undefined"!==typeof window.scayt&&this.getScayt(a)},isScaytEnabled:function(a){return(a=this.getScayt(a))?!1===a.disabled:!1},getUiTabs:function(a){var c=[],b=a.config.scayt_uiTabs||"1,1,1",b=b.split(",");b[3]="1";for(var d=0;4>d;d++)c[d]="undefined"!=typeof window.scayt&&"undefined"!=typeof window.scayt.uiTags?parseInt(b[d],
    +10)&&window.scayt.uiTags[d]:parseInt(b[d],10);"object"==typeof a.plugins.wsc?c.push(1):c.push(0);return c},loadEngine:function(a){if(CKEDITOR.env.gecko&&10900>CKEDITOR.env.version||CKEDITOR.env.opera||CKEDITOR.env.air)return a.fire("showScaytState");if(!0===this.engineLoaded)return r.apply(a);if(-1==this.engineLoaded)return CKEDITOR.on("scaytReady",function(){r.apply(a)});CKEDITOR.on("scaytReady",r,a);CKEDITOR.on("scaytReady",function(){this.engineLoaded=!0},this,null,0);this.engineLoaded=-1;var c=
    +document.location.protocol,c=-1!=c.search(/https?:/)?c:"http:",c=a.config.scayt_srcUrl||c+"//svc.webspellchecker.net/scayt26/loader__base.js",b=d.parseUrl(c).path+"/";void 0==window.scayt?(CKEDITOR._djScaytConfig={baseUrl:b,addOnLoad:[function(){CKEDITOR.fireOnce("scaytReady")}],isDebug:!1},CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script",{attributes:{type:"text/javascript",async:"true",src:c}}))):CKEDITOR.fireOnce("scaytReady");return null},parseUrl:function(a){var c;return a.match&&
    +(c=a.match(/(.*)[\/\\](.*?\.\w+)$/))?{path:c[1],file:c[2]}:a}};var d=CKEDITOR.plugins.scayt,s=function(a,c,b,d,e,k,g){a.addCommand(d,e);a.addMenuItem(d,{label:b,command:d,group:k,order:g})},v={preserveState:!0,editorFocus:!1,canUndo:!1,exec:function(a){if(d.isScaytReady(a)){var c=d.isScaytEnabled(a);this.setState(c?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_ON);a=d.getScayt(a);a.focus();a.setDisabled(c)}else!a.config.scayt_autoStartup&&0<=d.engineLoaded&&(a.focus(),this.setState(CKEDITOR.TRISTATE_DISABLED),
    +d.loadEngine(a))}};CKEDITOR.plugins.add("scayt",{requires:"menubutton,dialog",beforeInit:function(a){var c=a.config.scayt_contextMenuItemsOrder||"suggest|moresuggest|control",b="";if((c=c.split("|"))&&c.length)for(var d=0;d<c.length;d++)b+="scayt_"+c[d]+(c.length!=parseInt(d,10)+1?",":"");a.config.menu_groups=b+","+a.config.menu_groups},checkEnvironment:function(){return CKEDITOR.env.opera||CKEDITOR.env.air?0:1},init:function(a){var c=a.dataProcessor&&a.dataProcessor.dataFilter,b={elements:{span:function(a){var b=
    +a.attributes;b&&b["data-scaytid"]&&delete a.name}}};c&&c.addRules(b);var f={},e={},p=a.addCommand("scaytcheck",v);CKEDITOR.dialog.add("scaytcheck",CKEDITOR.getUrl(this.path+"dialogs/options.js"));c=d.getUiTabs(a);a.addMenuGroup("scaytButton");a.addMenuGroup("scayt_suggest",-10);a.addMenuGroup("scayt_moresuggest",-9);a.addMenuGroup("scayt_control",-8);var b={},g=a.lang.scayt;b.scaytToggle={label:g.enable,command:"scaytcheck",group:"scaytButton"};1==c[0]&&(b.scaytOptions={label:g.options,group:"scaytButton",
    +onClick:function(){i="options";a.openDialog("scaytcheck")}});1==c[1]&&(b.scaytLangs={label:g.langs,group:"scaytButton",onClick:function(){i="langs";a.openDialog("scaytcheck")}});1==c[2]&&(b.scaytDict={label:g.dictionariesTab,group:"scaytButton",onClick:function(){i="dictionaries";a.openDialog("scaytcheck")}});b.scaytAbout={label:a.lang.scayt.about,group:"scaytButton",onClick:function(){i="about";a.openDialog("scaytcheck")}};1==c[4]&&(b.scaytWSC={label:a.lang.wsc.toolbar,group:"scaytButton",command:"checkspell"});
    +a.addMenuItems(b);a.ui.add("Scayt",CKEDITOR.UI_MENUBUTTON,{label:g.title,title:CKEDITOR.env.opera?g.opera_title:g.title,modes:{wysiwyg:this.checkEnvironment()},toolbar:"spellchecker,20",onRender:function(){p.on("state",function(){this.setState(p.state)},this)},onMenu:function(){var b=d.isScaytEnabled(a);a.getMenuItem("scaytToggle").label=g[b?"disable":"enable"];var c=d.getUiTabs(a);return{scaytToggle:CKEDITOR.TRISTATE_OFF,scaytOptions:b&&c[0]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytLangs:b&&
    +c[1]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytDict:b&&c[2]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytAbout:b&&c[3]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytWSC:c[4]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}}});a.contextMenu&&a.addMenuItems&&a.contextMenu.addListener(function(b,c){if(!d.isScaytEnabled(a)||c.getRanges()[0].checkReadOnly())return null;var l=d.getScayt(a),q=l.getScaytNode();if(!q)return null;var h=l.getWord(q);if(!h)return null;var i=l.getLang(),
    +m=a.config.scayt_contextCommands||"all",h=window.scayt.getSuggestion(h,i),m=m.split("|"),n;for(n in f){delete a._.menuItems[n];delete a.commands[n]}for(n in e){delete a._.menuItems[n];delete a.commands[n]}if(!h||!h.length){s(a,"no_sugg",g.noSuggestions,"scayt_no_sugg",{exec:function(){}},"scayt_control",1,true);e.scayt_no_sugg=CKEDITOR.TRISTATE_OFF}else{f={};e={};n=a.config.scayt_moreSuggestions||"on";var i=false,u=a.config.scayt_maxSuggestions;typeof u!="number"&&(u=5);!u&&(u=h.length);for(var j=
    +0,p=h.length;j<p;j=j+1){var t="scayt_suggestion_"+h[j].replace(" ","_"),r=function(a,b){return{exec:function(){l.replace(a,b)}}}(q,h[j]);if(j<u){s(a,"button_"+t,h[j],t,r,"scayt_suggest",j+1);e[t]=CKEDITOR.TRISTATE_OFF}else if(n=="on"){s(a,"button_"+t,h[j],t,r,"scayt_moresuggest",j+1);f[t]=CKEDITOR.TRISTATE_OFF;i=true}}if(i){a.addMenuItem("scayt_moresuggest",{label:g.moreSuggestions,group:"scayt_moresuggest",order:10,getItems:function(){return f}});e.scayt_moresuggest=CKEDITOR.TRISTATE_OFF}}if(k("all",
    +m)||k("ignore",m)){s(a,"ignore",g.ignore,"scayt_ignore",{exec:function(){l.ignore(q)}},"scayt_control",2);e.scayt_ignore=CKEDITOR.TRISTATE_OFF}if(k("all",m)||k("ignoreall",m)){s(a,"ignore_all",g.ignoreAll,"scayt_ignore_all",{exec:function(){l.ignoreAll(q)}},"scayt_control",3);e.scayt_ignore_all=CKEDITOR.TRISTATE_OFF}if(k("all",m)||k("add",m)){s(a,"add_word",g.addWord,"scayt_add_word",{exec:function(){window.scayt.addWordToUserDictionary(q)}},"scayt_control",4);e.scayt_add_word=CKEDITOR.TRISTATE_OFF}l.fireOnContextMenu&&
    +l.fireOnContextMenu(a);return e});c=function(b){b.removeListener();CKEDITOR.env.opera||CKEDITOR.env.air?p.setState(CKEDITOR.TRISTATE_DISABLED):p.setState(d.isScaytEnabled(a)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)};a.on("showScaytState",c);a.on("instanceReady",c);if(a.config.scayt_autoStartup)a.on("instanceReady",function(){d.loadEngine(a)})},afterInit:function(a){var c,b=function(a){if(a.hasAttribute("data-scaytid"))return!1};a._.elementsPath&&(c=a._.elementsPath.filters)&&c.push(b);a.addRemoveFormatFilter&&
    +a.addRemoveFormatFilter(b)}})})();(function(){CKEDITOR.plugins.add("stylescombo",{requires:"richcombo",init:function(c){var j=c.config,f=c.lang.stylescombo,g={},i=[],k=[];c.on("stylesSet",function(b){if(b=b.data.styles){for(var a,h,d=0,e=b.length;d<e;d++)if(a=b[d],!(c.blockless&&a.element in CKEDITOR.dtd.$block)&&(h=a.name,a=new CKEDITOR.style(a),!c.filter.customConfig||c.filter.check(a)))a._name=h,a._.enterMode=j.enterMode,a._.weight=d+1E3*(a.type==CKEDITOR.STYLE_OBJECT?1:a.type==CKEDITOR.STYLE_BLOCK?2:3),g[h]=a,i.push(a),k.push(a);
    +i.sort(function(a,b){return a._.weight-b._.weight})}});c.ui.addRichCombo("Styles",{label:f.label,title:f.panelTitle,toolbar:"styles,10",allowedContent:k,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(j.contentsCss),multiSelect:!0,attributes:{"aria-label":f.panelTitle}},init:function(){var b,a,c,d,e,g;e=0;for(g=i.length;e<g;e++)b=i[e],a=b._name,d=b.type,d!=c&&(this.startGroup(f["panelTitle"+d]),c=d),this.add(a,b.type==CKEDITOR.STYLE_OBJECT?a:b.buildPreview(),a);this.commit()},onClick:function(b){c.focus();
    +c.fire("saveSnapshot");var b=g[b],a=c.elementPath();c[b.checkActive(a)?"removeStyle":"applyStyle"](b);c.fire("saveSnapshot")},onRender:function(){c.on("selectionChange",function(b){for(var a=this.getValue(),b=b.data.path.elements,c=0,d=b.length,e;c<d;c++){e=b[c];for(var f in g)if(g[f].checkElementRemovable(e,!0)){f!=a&&this.setValue(f);return}}this.setValue("")},this)},onOpen:function(){var b=c.getSelection().getSelectedElement(),b=c.elementPath(b),a=[0,0,0,0];this.showAll();this.unmarkAll();for(var h in g){var d=
    +g[h],e=d.type;e==CKEDITOR.STYLE_BLOCK&&!b.isContextFor(d.element)?this.hideItem(h):(d.checkActive(b)?this.mark(h):e==CKEDITOR.STYLE_OBJECT&&!d.checkApplicable(b)&&(this.hideItem(h),a[e]--),a[e]++)}a[CKEDITOR.STYLE_BLOCK]||this.hideGroup(f["panelTitle"+CKEDITOR.STYLE_BLOCK]);a[CKEDITOR.STYLE_INLINE]||this.hideGroup(f["panelTitle"+CKEDITOR.STYLE_INLINE]);a[CKEDITOR.STYLE_OBJECT]||this.hideGroup(f["panelTitle"+CKEDITOR.STYLE_OBJECT])},reset:function(){g={};i=[]}})}})})();(function(){function i(c){return{editorFocus:!1,canUndo:!1,modes:{wysiwyg:1},exec:function(d){if(d.editable().hasFocus){var e=d.getSelection(),b;if(b=(new CKEDITOR.dom.elementPath(e.getCommonAncestor(),e.root)).contains({td:1,th:1},1)){var e=d.createRange(),a=CKEDITOR.tools.tryThese(function(){var a=b.getParent().$.cells[b.$.cellIndex+(c?-1:1)];a.parentNode.parentNode;return a},function(){var a=b.getParent(),a=a.getAscendant("table").$.rows[a.$.rowIndex+(c?-1:1)];return a.cells[c?a.cells.length-1:
    +0]});if(!a&&!c){for(var f=b.getAscendant("table").$,a=b.getParent().$.cells,f=new CKEDITOR.dom.element(f.insertRow(-1),d.document),g=0,h=a.length;g<h;g++){var i=f.append((new CKEDITOR.dom.element(a[g],d.document)).clone(!1,!1));!CKEDITOR.env.ie&&i.appendBogus()}e.moveToElementEditStart(f)}else if(a)a=new CKEDITOR.dom.element(a),e.moveToElementEditStart(a),(!e.checkStartOfBlock()||!e.checkEndOfBlock())&&e.selectNodeContents(a);else return!0;e.select(!0);return!0}}return!1}}}var h={editorFocus:!1,modes:{wysiwyg:1,
    +source:1}},g={exec:function(c){c.container.focusNext(!0,c.tabIndex)}},f={exec:function(c){c.container.focusPrevious(!0,c.tabIndex)}};CKEDITOR.plugins.add("tab",{init:function(c){for(var d=!1!==c.config.enableTabKeyTools,e=c.config.tabSpaces||0,b="";e--;)b+="聽";if(b)c.on("key",function(a){9==a.data.keyCode&&(c.insertHtml(b),a.cancel())});if(d)c.on("key",function(a){(9==a.data.keyCode&&c.execCommand("selectNextCell")||a.data.keyCode==CKEDITOR.SHIFT+9&&c.execCommand("selectPreviousCell"))&&a.cancel()});
    +c.addCommand("blur",CKEDITOR.tools.extend(g,h));c.addCommand("blurBack",CKEDITOR.tools.extend(f,h));c.addCommand("selectNextCell",i());c.addCommand("selectPreviousCell",i(!0))}})})();
    +CKEDITOR.dom.element.prototype.focusNext=function(i,h){var g=void 0===h?this.getTabIndex():h,f,c,d,e,b,a;if(0>=g)for(b=this.getNextSourceNode(i,CKEDITOR.NODE_ELEMENT);b;){if(b.isVisible()&&0===b.getTabIndex()){d=b;break}b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT)}else for(b=this.getDocument().getBody().getFirst();b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&b.equals(this)){if(c=!0,i){if(!(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(b)&&
    +(f=1);if(b.isVisible()&&!(0>(a=b.getTabIndex()))){if(f&&a==g){d=b;break}a>g&&(!d||!e||a<e)?(d=b,e=a):!d&&0===a&&(d=b,e=a)}}d&&d.focus()};
    +CKEDITOR.dom.element.prototype.focusPrevious=function(i,h){for(var g=void 0===h?this.getTabIndex():h,f,c,d,e=0,b,a=this.getDocument().getBody().getLast();a=a.getPreviousSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&a.equals(this)){if(c=!0,i){if(!(a=a.getPreviousSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(a)&&(f=1);if(a.isVisible()&&!(0>(b=a.getTabIndex())))if(0>=g){if(f&&0===b){d=a;break}b>e&&(d=a,e=b)}else{if(f&&b==g){d=a;break}if(b<g&&(!d||b>e))d=a,e=b}}d&&d.focus()};CKEDITOR.plugins.add("table",{requires:"dialog",init:function(a){function d(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,e){this.setState(e.contains("table",1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}if(!a.blockless){var b=a.lang.table;a.addCommand("table",new CKEDITOR.dialogCommand("table",{context:"table",allowedContent:"table{width,height}[align,border,cellpadding,cellspacing,summary];caption tbody thead tfoot;th td tr[scope];"+(a.plugins.dialogadvtab?
    +"table"+a.plugins.dialogadvtab.allowedContent():""),requiredContent:"table",contentTransformations:[["table{width}: sizeToStyle","table[width]: sizeToAttribute"]]}));a.addCommand("tableProperties",new CKEDITOR.dialogCommand("tableProperties",d()));a.addCommand("tableDelete",d({exec:function(a){var c=a.elementPath().contains("table",1);if(c){var b=c.getParent();1==b.getChildCount()&&!b.is("body","td","th")&&(c=b);a=a.createRange();a.moveToPosition(c,CKEDITOR.POSITION_BEFORE_START);c.remove();a.select()}}}));
    +a.ui.addButton&&a.ui.addButton("Table",{label:b.toolbar,command:"table",toolbar:"insert,30"});CKEDITOR.dialog.add("table",this.path+"dialogs/table.js");CKEDITOR.dialog.add("tableProperties",this.path+"dialogs/table.js");a.addMenuItems&&a.addMenuItems({table:{label:b.menu,command:"tableProperties",group:"table",order:5},tabledelete:{label:b.deleteTable,command:"tableDelete",group:"table",order:1}});a.on("doubleclick",function(a){a.data.element.is("table")&&(a.data.dialog="tableProperties")});a.contextMenu&&
    +a.contextMenu.addListener(function(){return{tabledelete:CKEDITOR.TRISTATE_OFF,table:CKEDITOR.TRISTATE_OFF}})}}});(function(){function p(e){function d(a){!(0<b.length)&&(a.type==CKEDITOR.NODE_ELEMENT&&y.test(a.getName())&&!a.getCustomData("selected_cell"))&&(CKEDITOR.dom.element.setMarker(c,a,"selected_cell",!0),b.push(a))}for(var e=e.getRanges(),b=[],c={},a=0;a<e.length;a++){var f=e[a];if(f.collapsed)f=f.getCommonAncestor(),(f=f.getAscendant("td",!0)||f.getAscendant("th",!0))&&b.push(f);else{var f=new CKEDITOR.dom.walker(f),g;for(f.guard=d;g=f.next();)if(g.type!=CKEDITOR.NODE_ELEMENT||!g.is(CKEDITOR.dtd.table))if((g=
    +g.getAscendant("td",!0)||g.getAscendant("th",!0))&&!g.getCustomData("selected_cell"))CKEDITOR.dom.element.setMarker(c,g,"selected_cell",!0),b.push(g)}}CKEDITOR.dom.element.clearAllMarkers(c);return b}function o(e,d){for(var b=p(e),c=b[0],a=c.getAscendant("table"),c=c.getDocument(),f=b[0].getParent(),g=f.$.rowIndex,b=b[b.length-1],h=b.getParent().$.rowIndex+b.$.rowSpan-1,b=new CKEDITOR.dom.element(a.$.rows[h]),g=d?g:h,f=d?f:b,b=CKEDITOR.tools.buildTableMap(a),a=b[g],g=d?b[g-1]:b[g+1],b=b[0].length,
    +c=c.createElement("tr"),h=0;a[h]&&h<b;h++){var i;1<a[h].rowSpan&&g&&a[h]==g[h]?(i=a[h],i.rowSpan+=1):(i=(new CKEDITOR.dom.element(a[h])).clone(),i.removeAttribute("rowSpan"),!CKEDITOR.env.ie&&i.appendBogus(),c.append(i),i=i.$);h+=i.colSpan-1}d?c.insertBefore(f):c.insertAfter(f)}function q(e){if(e instanceof CKEDITOR.dom.selection){for(var d=p(e),b=d[0].getAscendant("table"),c=CKEDITOR.tools.buildTableMap(b),e=d[0].getParent().$.rowIndex,d=d[d.length-1],a=d.getParent().$.rowIndex+d.$.rowSpan-1,d=[],
    +f=e;f<=a;f++){for(var g=c[f],h=new CKEDITOR.dom.element(b.$.rows[f]),i=0;i<g.length;i++){var j=new CKEDITOR.dom.element(g[i]),l=j.getParent().$.rowIndex;1==j.$.rowSpan?j.remove():(j.$.rowSpan-=1,l==f&&(l=c[f+1],l[i-1]?j.insertAfter(new CKEDITOR.dom.element(l[i-1])):(new CKEDITOR.dom.element(b.$.rows[f+1])).append(j,1)));i+=j.$.colSpan-1}d.push(h)}c=b.$.rows;b=new CKEDITOR.dom.element(c[a+1]||(0<e?c[e-1]:null)||b.$.parentNode);for(f=d.length;0<=f;f--)q(d[f]);return b}e instanceof CKEDITOR.dom.element&&
    +(b=e.getAscendant("table"),1==b.$.rows.length?b.remove():e.remove());return null}function r(e,d){for(var b=d?Infinity:0,c=0;c<e.length;c++){var a;a=e[c];for(var f=d,g=a.getParent().$.cells,h=0,i=0;i<g.length;i++){var j=g[i],h=h+(f?1:j.colSpan);if(j==a.$)break}a=h-1;if(d?a<b:a>b)b=a}return b}function k(e,d){for(var b=p(e),c=b[0].getAscendant("table"),a=r(b,1),b=r(b),a=d?a:b,f=CKEDITOR.tools.buildTableMap(c),c=[],b=[],g=f.length,h=0;h<g;h++)c.push(f[h][a]),b.push(d?f[h][a-1]:f[h][a+1]);for(h=0;h<g;h++)c[h]&&
    +(1<c[h].colSpan&&b[h]==c[h]?(a=c[h],a.colSpan+=1):(a=(new CKEDITOR.dom.element(c[h])).clone(),a.removeAttribute("colSpan"),!CKEDITOR.env.ie&&a.appendBogus(),a[d?"insertBefore":"insertAfter"].call(a,new CKEDITOR.dom.element(c[h])),a=a.$),h+=a.rowSpan-1)}function u(e,d){var b=e.getStartElement();if(b=b.getAscendant("td",1)||b.getAscendant("th",1)){var c=b.clone();CKEDITOR.env.ie||c.appendBogus();d?c.insertBefore(b):c.insertAfter(b)}}function t(e){if(e instanceof CKEDITOR.dom.selection){var e=p(e),d=
    +e[0]&&e[0].getAscendant("table"),b;a:{var c=0;b=e.length-1;for(var a={},f,g;f=e[c++];)CKEDITOR.dom.element.setMarker(a,f,"delete_cell",!0);for(c=0;f=e[c++];)if((g=f.getPrevious())&&!g.getCustomData("delete_cell")||(g=f.getNext())&&!g.getCustomData("delete_cell")){CKEDITOR.dom.element.clearAllMarkers(a);b=g;break a}CKEDITOR.dom.element.clearAllMarkers(a);g=e[0].getParent();(g=g.getPrevious())?b=g.getLast():(g=e[b].getParent(),b=(g=g.getNext())?g.getChild(0):null)}for(g=e.length-1;0<=g;g--)t(e[g]);
    +b?m(b,!0):d&&d.remove()}else e instanceof CKEDITOR.dom.element&&(d=e.getParent(),1==d.getChildCount()?d.remove():e.remove())}function m(e,d){var b=new CKEDITOR.dom.range(e.getDocument());if(!b["moveToElementEdit"+(d?"End":"Start")](e))b.selectNodeContents(e),b.collapse(d?!1:!0);b.select(!0)}function v(e,d,b){e=e[d];if("undefined"==typeof b)return e;for(d=0;e&&d<e.length;d++){if(b.is&&e[d]==b.$)return d;if(d==b)return new CKEDITOR.dom.element(e[d])}return b.is?-1:null}function s(e,d,b){var c=p(e),
    +a;if((d?1!=c.length:2>c.length)||(a=e.getCommonAncestor())&&a.type==CKEDITOR.NODE_ELEMENT&&a.is("table"))return!1;var f,e=c[0];a=e.getAscendant("table");var g=CKEDITOR.tools.buildTableMap(a),h=g.length,i=g[0].length,j=e.getParent().$.rowIndex,l=v(g,j,e);if(d){var n;try{var m=parseInt(e.getAttribute("rowspan"),10)||1;f=parseInt(e.getAttribute("colspan"),10)||1;n=g["up"==d?j-m:"down"==d?j+m:j]["left"==d?l-f:"right"==d?l+f:l]}catch(z){return!1}if(!n||e.$==n)return!1;c["up"==d||"left"==d?"unshift":"push"](new CKEDITOR.dom.element(n))}for(var d=
    +e.getDocument(),o=j,m=n=0,q=!b&&new CKEDITOR.dom.documentFragment(d),s=0,d=0;d<c.length;d++){f=c[d];var k=f.getParent(),t=f.getFirst(),r=f.$.colSpan,u=f.$.rowSpan,k=k.$.rowIndex,w=v(g,k,f),s=s+r*u,m=Math.max(m,w-l+r);n=Math.max(n,k-j+u);if(!b){r=f;(u=r.getBogus())&&u.remove();r.trim();if(f.getChildren().count()){if(k!=o&&t&&(!t.isBlockBoundary||!t.isBlockBoundary({br:1})))(o=q.getLast(CKEDITOR.dom.walker.whitespaces(!0)))&&(!o.is||!o.is("br"))&&q.append("br");f.moveChildren(q)}d?f.remove():f.setHtml("")}o=
    +k}if(b)return n*m==s;q.moveChildren(e);CKEDITOR.env.ie||e.appendBogus();m>=i?e.removeAttribute("rowSpan"):e.$.rowSpan=n;n>=h?e.removeAttribute("colSpan"):e.$.colSpan=m;b=new CKEDITOR.dom.nodeList(a.$.rows);c=b.count();for(d=c-1;0<=d;d--)a=b.getItem(d),a.$.cells.length||(a.remove(),c++);return e}function w(e,d){var b=p(e);if(1<b.length)return!1;if(d)return!0;var b=b[0],c=b.getParent(),a=c.getAscendant("table"),f=CKEDITOR.tools.buildTableMap(a),g=c.$.rowIndex,h=v(f,g,b),i=b.$.rowSpan,j;if(1<i){j=Math.ceil(i/
    +2);for(var i=Math.floor(i/2),c=g+j,a=new CKEDITOR.dom.element(a.$.rows[c]),f=v(f,c),l,c=b.clone(),g=0;g<f.length;g++)if(l=f[g],l.parentNode==a.$&&g>h){c.insertBefore(new CKEDITOR.dom.element(l));break}else l=null;l||a.append(c,!0)}else{i=j=1;a=c.clone();a.insertAfter(c);a.append(c=b.clone());l=v(f,g);for(h=0;h<l.length;h++)l[h].rowSpan++}CKEDITOR.env.ie||c.appendBogus();b.$.rowSpan=j;c.$.rowSpan=i;1==j&&b.removeAttribute("rowSpan");1==i&&c.removeAttribute("rowSpan");return c}function x(e,d){var b=
    +p(e);if(1<b.length)return!1;if(d)return!0;var b=b[0],c=b.getParent(),a=c.getAscendant("table"),a=CKEDITOR.tools.buildTableMap(a),f=v(a,c.$.rowIndex,b),g=b.$.colSpan;if(1<g)c=Math.ceil(g/2),g=Math.floor(g/2);else{for(var g=c=1,h=[],i=0;i<a.length;i++){var j=a[i];h.push(j[f]);1<j[f].rowSpan&&(i+=j[f].rowSpan-1)}for(a=0;a<h.length;a++)h[a].colSpan++}a=b.clone();a.insertAfter(b);CKEDITOR.env.ie||a.appendBogus();b.$.colSpan=c;a.$.colSpan=g;1==c&&b.removeAttribute("colSpan");1==g&&a.removeAttribute("colSpan");
    +return a}var y=/^(?:td|th)$/;CKEDITOR.plugins.tabletools={requires:"table,dialog,contextmenu",init:function(e){function d(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,b){this.setState(b.contains({td:1,th:1},1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}function b(a,b){var c=e.addCommand(a,b);e.addFeature(c)}var c=e.lang.table;b("cellProperties",new CKEDITOR.dialogCommand("cellProperties",d({allowedContent:"td th{width,height,border-color,background-color,white-space,vertical-align,text-align}[colspan,rowspan]",
    +requiredContent:"table"})));CKEDITOR.dialog.add("cellProperties",this.path+"dialogs/tableCell.js");b("rowDelete",d({requiredContent:"table",exec:function(a){a=a.getSelection();m(q(a))}}));b("rowInsertBefore",d({requiredContent:"table",exec:function(a){a=a.getSelection();o(a,!0)}}));b("rowInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();o(a)}}));b("columnDelete",d({requiredContent:"table",exec:function(a){for(var a=a.getSelection(),a=p(a),b=a[0],c=a[a.length-1],a=b.getAscendant("table"),
    +d=CKEDITOR.tools.buildTableMap(a),e,j,l=[],n=0,o=d.length;n<o;n++)for(var k=0,q=d[n].length;k<q;k++)d[n][k]==b.$&&(e=k),d[n][k]==c.$&&(j=k);for(n=e;n<=j;n++)for(k=0;k<d.length;k++)c=d[k],b=new CKEDITOR.dom.element(a.$.rows[k]),c=new CKEDITOR.dom.element(c[n]),c.$&&(1==c.$.colSpan?c.remove():c.$.colSpan-=1,k+=c.$.rowSpan-1,b.$.cells.length||l.push(b));j=a.$.rows[0]&&a.$.rows[0].cells;e=new CKEDITOR.dom.element(j[e]||(e?j[e-1]:a.$.parentNode));l.length==o&&a.remove();e&&m(e,!0)}}));b("columnInsertBefore",
    +d({requiredContent:"table",exec:function(a){a=a.getSelection();k(a,!0)}}));b("columnInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();k(a)}}));b("cellDelete",d({requiredContent:"table",exec:function(a){a=a.getSelection();t(a)}}));b("cellMerge",d({allowedContent:"td[colspan,rowspan]",requiredContent:"td[colspan,rowspan]",exec:function(a){m(s(a.getSelection()),!0)}}));b("cellMergeRight",d({allowedContent:"td[colspan]",requiredContent:"td[colspan]",exec:function(a){m(s(a.getSelection(),
    +"right"),!0)}}));b("cellMergeDown",d({allowedContent:"td[rowspan]",requiredContent:"td[rowspan]",exec:function(a){m(s(a.getSelection(),"down"),!0)}}));b("cellVerticalSplit",d({allowedContent:"td[rowspan]",requiredContent:"td[rowspan]",exec:function(a){m(w(a.getSelection()))}}));b("cellHorizontalSplit",d({allowedContent:"td[colspan]",requiredContent:"td[colspan]",exec:function(a){m(x(a.getSelection()))}}));b("cellInsertBefore",d({requiredContent:"table",exec:function(a){a=a.getSelection();u(a,!0)}}));
    +b("cellInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();u(a)}}));e.addMenuItems&&e.addMenuItems({tablecell:{label:c.cell.menu,group:"tablecell",order:1,getItems:function(){var a=e.getSelection(),b=p(a);return{tablecell_insertBefore:CKEDITOR.TRISTATE_OFF,tablecell_insertAfter:CKEDITOR.TRISTATE_OFF,tablecell_delete:CKEDITOR.TRISTATE_OFF,tablecell_merge:s(a,null,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_merge_right:s(a,"right",!0)?CKEDITOR.TRISTATE_OFF:
    +CKEDITOR.TRISTATE_DISABLED,tablecell_merge_down:s(a,"down",!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_vertical:w(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_horizontal:x(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_properties:0<b.length?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}}},tablecell_insertBefore:{label:c.cell.insertBefore,group:"tablecell",command:"cellInsertBefore",order:5},tablecell_insertAfter:{label:c.cell.insertAfter,
    +group:"tablecell",command:"cellInsertAfter",order:10},tablecell_delete:{label:c.cell.deleteCell,group:"tablecell",command:"cellDelete",order:15},tablecell_merge:{label:c.cell.merge,group:"tablecell",command:"cellMerge",order:16},tablecell_merge_right:{label:c.cell.mergeRight,group:"tablecell",command:"cellMergeRight",order:17},tablecell_merge_down:{label:c.cell.mergeDown,group:"tablecell",command:"cellMergeDown",order:18},tablecell_split_horizontal:{label:c.cell.splitHorizontal,group:"tablecell",
    +command:"cellHorizontalSplit",order:19},tablecell_split_vertical:{label:c.cell.splitVertical,group:"tablecell",command:"cellVerticalSplit",order:20},tablecell_properties:{label:c.cell.title,group:"tablecellproperties",command:"cellProperties",order:21},tablerow:{label:c.row.menu,group:"tablerow",order:1,getItems:function(){return{tablerow_insertBefore:CKEDITOR.TRISTATE_OFF,tablerow_insertAfter:CKEDITOR.TRISTATE_OFF,tablerow_delete:CKEDITOR.TRISTATE_OFF}}},tablerow_insertBefore:{label:c.row.insertBefore,
    +group:"tablerow",command:"rowInsertBefore",order:5},tablerow_insertAfter:{label:c.row.insertAfter,group:"tablerow",command:"rowInsertAfter",order:10},tablerow_delete:{label:c.row.deleteRow,group:"tablerow",command:"rowDelete",order:15},tablecolumn:{label:c.column.menu,group:"tablecolumn",order:1,getItems:function(){return{tablecolumn_insertBefore:CKEDITOR.TRISTATE_OFF,tablecolumn_insertAfter:CKEDITOR.TRISTATE_OFF,tablecolumn_delete:CKEDITOR.TRISTATE_OFF}}},tablecolumn_insertBefore:{label:c.column.insertBefore,
    +group:"tablecolumn",command:"columnInsertBefore",order:5},tablecolumn_insertAfter:{label:c.column.insertAfter,group:"tablecolumn",command:"columnInsertAfter",order:10},tablecolumn_delete:{label:c.column.deleteColumn,group:"tablecolumn",command:"columnDelete",order:15}});e.contextMenu&&e.contextMenu.addListener(function(a,b,c){return(a=c.contains({td:1,th:1},1))&&!a.isReadOnly()?{tablecell:CKEDITOR.TRISTATE_OFF,tablerow:CKEDITOR.TRISTATE_OFF,tablecolumn:CKEDITOR.TRISTATE_OFF}:null})},getSelectedCells:p};
    +CKEDITOR.plugins.add("tabletools",CKEDITOR.plugins.tabletools)})();CKEDITOR.tools.buildTableMap=function(p){for(var p=p.$.rows,o=-1,q=[],r=0;r<p.length;r++){o++;!q[o]&&(q[o]=[]);for(var k=-1,u=0;u<p[r].cells.length;u++){var t=p[r].cells[u];for(k++;q[o][k];)k++;for(var m=isNaN(t.colSpan)?1:t.colSpan,t=isNaN(t.rowSpan)?1:t.rowSpan,v=0;v<t;v++){q[o+v]||(q[o+v]=[]);for(var s=0;s<m;s++)q[o+v][k+s]=p[r].cells[u]}k+=m-1}}return q};(function(){function i(a){this.editor=a;this.reset()}CKEDITOR.plugins.add("undo",{init:function(a){function c(a){b.enabled&&!1!==a.data.command.canUndo&&b.save()}function d(){b.enabled=a.readOnly?!1:"wysiwyg"==a.mode;b.onChange()}var b=new i(a),e=a.addCommand("undo",{exec:function(){b.undo()&&(a.selectionChange(),this.fire("afterUndo"))},state:CKEDITOR.TRISTATE_DISABLED,canUndo:!1}),f=a.addCommand("redo",{exec:function(){b.redo()&&(a.selectionChange(),this.fire("afterRedo"))},state:CKEDITOR.TRISTATE_DISABLED,
    +canUndo:!1});a.setKeystroke([[CKEDITOR.CTRL+90,"undo"],[CKEDITOR.CTRL+89,"redo"],[CKEDITOR.CTRL+CKEDITOR.SHIFT+90,"redo"]]);b.onChange=function(){e.setState(b.undoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);f.setState(b.redoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)};a.on("beforeCommandExec",c);a.on("afterCommandExec",c);a.on("saveSnapshot",function(a){b.save(a.data&&a.data.contentOnly)});a.on("contentDom",function(){a.editable().on("keydown",function(a){!a.data.$.ctrlKey&&
    +!a.data.$.metaKey&&b.type(a)})});a.on("beforeModeUnload",function(){"wysiwyg"==a.mode&&b.save(!0)});a.on("mode",d);a.on("readOnly",d);a.ui.addButton&&(a.ui.addButton("Undo",{label:a.lang.undo.undo,command:"undo",toolbar:"undo,10"}),a.ui.addButton("Redo",{label:a.lang.undo.redo,command:"redo",toolbar:"undo,20"}));a.resetUndo=function(){b.reset();a.fire("saveSnapshot")};a.on("updateSnapshot",function(){b.currentImage&&b.update()});a.on("lockSnapshot",b.lock,b);a.on("unlockSnapshot",b.unlock,b)}});CKEDITOR.plugins.undo=
    +{};var h=CKEDITOR.plugins.undo.Image=function(a){this.editor=a;a.fire("beforeUndoImage");var c=a.getSnapshot(),d=c&&a.getSelection();CKEDITOR.env.ie&&c&&(c=c.replace(/\s+data-cke-expando=".*?"/g,""));this.contents=c;this.bookmarks=d&&d.createBookmarks2(!0);a.fire("afterUndoImage")},j=/\b(?:href|src|name)="[^"]*?"/gi;h.prototype={equals:function(a,c){var d=this.contents,b=a.contents;if(CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat))d=d.replace(j,""),b=b.replace(j,"");if(d!=b)return!1;
    +if(c)return!0;d=this.bookmarks;b=a.bookmarks;if(d||b){if(!d||!b||d.length!=b.length)return!1;for(var e=0;e<d.length;e++){var f=d[e],g=b[e];if(f.startOffset!=g.startOffset||f.endOffset!=g.endOffset||!CKEDITOR.tools.arrayCompare(f.start,g.start)||!CKEDITOR.tools.arrayCompare(f.end,g.end))return!1}}return!0}};var k={8:1,46:1},m={16:1,17:1,18:1},l={37:1,38:1,39:1,40:1};i.prototype={type:function(a){var a=a&&a.data.getKey(),c=a in k,d=this.lastKeystroke in k,b=c&&a==this.lastKeystroke,e=a in l,f=this.lastKeystroke in
    +l;if(!(a in m||this.typing)||!c&&!e&&(d||f)||c&&!b){var g=new h(this.editor),i=this.snapshots.length;CKEDITOR.tools.setTimeout(function(){var a=this.editor.getSnapshot();CKEDITOR.env.ie&&(a=a.replace(/\s+data-cke-expando=".*?"/g,""));g.contents!=a&&i==this.snapshots.length&&(this.typing=!0,this.save(!1,g,!1)||this.snapshots.splice(this.index+1,this.snapshots.length-this.index-1),this.hasUndo=!0,this.hasRedo=!1,this.modifiersCount=this.typesCount=1,this.onChange())},0,this)}this.lastKeystroke=a;c?
    +(this.typesCount=0,this.modifiersCount++,25<this.modifiersCount&&(this.save(!1,null,!1),this.modifiersCount=1)):e||(this.modifiersCount=0,this.typesCount++,25<this.typesCount&&(this.save(!1,null,!1),this.typesCount=1))},reset:function(){this.lastKeystroke=0;this.snapshots=[];this.index=-1;this.limit=this.editor.config.undoStackSize||20;this.currentImage=null;this.hasRedo=this.hasUndo=!1;this.locked=null;this.resetType()},resetType:function(){this.typing=!1;delete this.lastKeystroke;this.modifiersCount=
    +this.typesCount=0},fireChange:function(){this.hasUndo=!!this.getNextImage(!0);this.hasRedo=!!this.getNextImage(!1);this.resetType();this.onChange()},save:function(a,c,d){if(this.locked)return!1;var b=this.snapshots;c||(c=new h(this.editor));if(!1===c.contents||this.currentImage&&c.equals(this.currentImage,a))return!1;b.splice(this.index+1,b.length-this.index-1);b.length==this.limit&&b.shift();this.index=b.push(c)-1;this.currentImage=c;!1!==d&&this.fireChange();return!0},restoreImage:function(a){var c=
    +this.editor,d;a.bookmarks&&(c.focus(),d=c.getSelection());this.locked=1;this.editor.loadSnapshot(a.contents);a.bookmarks?d.selectBookmarks(a.bookmarks):CKEDITOR.env.ie&&(c=this.editor.document.getBody().$.createTextRange(),c.collapse(!0),c.select());this.locked=0;this.index=a.index;this.update();this.fireChange()},getNextImage:function(a){var c=this.snapshots,d=this.currentImage,b;if(d)if(a)for(b=this.index-1;0<=b;b--){if(a=c[b],!d.equals(a,!0))return a.index=b,a}else for(b=this.index+1;b<c.length;b++)if(a=
    +c[b],!d.equals(a,!0))return a.index=b,a;return null},redoable:function(){return this.enabled&&this.hasRedo},undoable:function(){return this.enabled&&this.hasUndo},undo:function(){if(this.undoable()){this.save(!0);var a=this.getNextImage(!0);if(a)return this.restoreImage(a),!0}return!1},redo:function(){if(this.redoable()&&(this.save(!0),this.redoable())){var a=this.getNextImage(!1);if(a)return this.restoreImage(a),!0}return!1},update:function(){this.locked||this.snapshots.splice(this.index,1,this.currentImage=
    +new h(this.editor))},lock:function(){if(this.locked)this.locked.level++;else{var a=new h(this.editor);this.locked={update:this.currentImage&&this.currentImage.equals(a,!0)?a:null,level:1}}},unlock:function(){if(this.locked&&!--this.locked.level){var a=this.locked.update;this.locked=null;a&&!a.equals(new h(this.editor),!0)&&this.update()}}}})();CKEDITOR.plugins.add("wsc",{requires:"dialog",parseConfig:function(a){a.config.wsc_onFinish="function"===typeof a.config.wsc_onFinish?a.config.wsc_onFinish:function(){};a.config.wsc_onClose="function"===typeof a.config.wsc_onClose?a.config.wsc_onClose:function(){};CKEDITOR.config.wsc_stack.push(a)},init:function(a){a.addCommand("checkspell",new CKEDITOR.dialogCommand("checkspell")).modes={wysiwyg:!CKEDITOR.env.opera&&!CKEDITOR.env.air&&document.domain==window.location.hostname};"undefined"==typeof a.plugins.scayt&&
    +a.ui.addButton&&a.ui.addButton("SpellChecker",{label:a.lang.wsc.toolbar,command:"checkspell",toolbar:"spellchecker,10"});CKEDITOR.dialog.add("checkspell",this.path+(CKEDITOR.env.ie&&8>=CKEDITOR.env.version?"dialogs/wsc_ie.js":window.postMessage?"dialogs/wsc.js":"dialogs/wsc_ie.js"))},beforeInit:function(a){this.parseConfig(a)}});CKEDITOR.config.wsc_stack=[];CKEDITOR.config.wsc_customerId=CKEDITOR.config.wsc_customerId||"1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk";
    +CKEDITOR.config.wsc_customDictionaryIds=CKEDITOR.config.wsc_customDictionaryIds||"";CKEDITOR.config.wsc_userDictionaryName=CKEDITOR.config.wsc_userDictionaryName||"";CKEDITOR.config.wsc_cmd=CKEDITOR.config.wsc_cmd||"spell";CKEDITOR.config.plugins='dialogui,dialog,about,a11yhelp,dialogadvtab,basicstyles,bidi,blockquote,clipboard,button,panelbutton,panel,floatpanel,colorbutton,colordialog,templates,menu,contextmenu,div,resize,toolbar,elementspath,list,indent,enterkey,entities,popup,filebrowser,find,fakeobjects,flash,floatingspace,listblock,richcombo,font,forms,format,htmlwriter,horizontalrule,iframe,wysiwygarea,image,smiley,justify,link,liststyle,magicline,maximize,newpage,pagebreak,pastetext,pastefromword,preview,print,removeformat,save,selectall,showblocks,showborders,sourcearea,specialchar,menubutton,scayt,stylescombo,tab,table,tabletools,undo,wsc';CKEDITOR.config.skin='moono';(function() {var icons = ( 'about,0,auto,bold,24,auto,italic,48,auto,strike,72,auto,subscript,96,auto,superscript,120,auto,underline,144,auto,bidiltr,168,auto,bidirtl,192,auto,blockquote,216,auto,copy-rtl,240,auto,copy,264,auto,cut-rtl,288,auto,cut,312,auto,paste-rtl,336,auto,paste,360,auto,bgcolor,384,auto,textcolor,408,auto,templates-rtl,432,auto,templates,456,auto,creatediv,480,auto,bulletedlist-rtl,504,auto,bulletedlist,528,auto,numberedlist-rtl,552,auto,numberedlist,576,auto,indent-rtl,600,auto,indent,624,auto,outdent-rtl,648,auto,outdent,672,auto,find-rtl,696,auto,find,720,auto,replace,744,auto,flash,768,auto,button,792,auto,checkbox,816,auto,form,840,auto,hiddenfield,864,auto,imagebutton,888,auto,radio,912,auto,select-rtl,936,auto,select,960,auto,textarea-rtl,984,auto,textarea,1008,auto,textfield-rtl,1032,auto,textfield,1056,auto,horizontalrule,1080,auto,iframe,1104,auto,image,1128,auto,smiley,1152,auto,justifyblock,1176,auto,justifycenter,1200,auto,justifyleft,1224,auto,justifyright,1248,auto,anchor-rtl,1272,auto,anchor,1296,auto,link,1320,auto,unlink,1344,auto,maximize,1368,auto,newpage-rtl,1392,auto,newpage,1416,auto,pagebreak-rtl,1440,auto,pagebreak,1464,auto,pastetext-rtl,1488,auto,pastetext,1512,auto,pastefromword-rtl,1536,auto,pastefromword,1560,auto,preview-rtl,1584,auto,preview,1608,auto,print,1632,auto,removeformat,1656,auto,save,1680,auto,selectall,1704,auto,showblocks-rtl,1728,auto,showblocks,1752,auto,source-rtl,1776,auto,source,1800,auto,specialchar,1824,auto,scayt,1848,auto,table,1872,auto,redo-rtl,1896,auto,redo,1920,auto,undo-rtl,1944,auto,undo,1968,auto,spellchecker,1992,auto' ),path = CKEDITOR.getUrl( 'plugins/icons.png' ),icons = icons.split( ',' );for ( var i = 0; i < icons.length; i++ )CKEDITOR.skin.icons[ icons[ i ] ] = { path: path, offset: -icons[ ++i ] };})();CKEDITOR.lang.languages={"af":1,"sq":1,"ar":1,"eu":1,"bn":1,"bs":1,"bg":1,"ca":1,"zh-cn":1,"zh":1,"hr":1,"cs":1,"da":1,"nl":1,"en":1,"en-au":1,"en-ca":1,"en-gb":1,"eo":1,"et":1,"fo":1,"fi":1,"fr":1,"fr-ca":1,"gl":1,"ka":1,"de":1,"el":1,"gu":1,"he":1,"hi":1,"hu":1,"is":1,"id":1,"it":1,"ja":1,"km":1,"ko":1,"ku":1,"lv":1,"lt":1,"mk":1,"ms":1,"mn":1,"no":1,"nb":1,"fa":1,"pl":1,"pt-br":1,"pt":1,"ro":1,"ru":1,"sr":1,"sr-latn":1,"si":1,"sk":1,"sl":1,"es":1,"sv":1,"th":1,"tr":1,"ug":1,"uk":1,"vi":1,"cy":1};}());
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/config.js b/src/main/webapp/plug-in/ckeditor/config.js
    new file mode 100644
    index 00000000..7dc67270
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/config.js
    @@ -0,0 +1,27 @@
    +/**
    + * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + * For licensing, see LICENSE.html or http://ckeditor.com/license
    + */
    +CKEDITOR.editorConfig = function( config ) {
    +
    +	config.enterMode = CKEDITOR.ENTER_BR;// CKEDITOR.ENTER_P;CKEDITOR.ENTER_DIV
    +	config.fullPage= true;
    +	config.allowedContent= true;
    +	config.font_defaultLabel = '瀹嬩綋';
    +	config.fontSize_defaultLabel = '12px';
    +	config.tabSpaces = 2;
    +
    +	config.language = "zh-cn";
    +	config.image_previewText = ' '; // 棰勮鍖哄煙鏄剧ず鍐呭
    +	config.font_names = '瀹嬩綋/瀹嬩綋;榛戜綋/榛戜綋;浠垮畫/浠垮畫_GB2312;妤蜂綋/妤蜂綋_GB2312;闅朵功/闅朵功;骞煎渾/骞煎渾;寰蒋闆呴粦/寰蒋闆呴粦;'
    +			+ config.font_names;
    +	config.skin = 'moonocolor';
    +	config.toolbarGroups = [
    +	        { name: 'document',    groups: [ 'mode', 'document', 'doctools' ] },
    +	        { name: 'clipboard',   groups: [ 'clipboard', 'undo' ] },
    +            { name: 'insert' },{name:'font'},{ name: 'tools' },
    +            { name: 'others' },{ name: 'editing',     groups: [ 'find', 'selection' ] },
    +            { name: 'links' },{ name: 'basicstyles', groups: [ 'basicstyles', 'cleanup', 'font'] },
    +            { name: 'paragraph',   groups: [ 'list', 'indent', 'blocks', 'align' ] },
    +            { name: 'forms' },{ name: 'styles' },{ name: 'colors' }];
    +};
    diff --git a/src/main/webapp/plug-in/ckeditor/contents.css b/src/main/webapp/plug-in/ckeditor/contents.css
    new file mode 100644
    index 00000000..6a5da546
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/contents.css
    @@ -0,0 +1,103 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +
    +body
    +{
    +	/* Font */
    +	font-family: sans-serif, Arial, Verdana, "Trebuchet MS";
    +	font-size: 12px;
    +
    +	/* Text color */
    +	color: #333;
    +
    +	/* Remove the background color to make it transparent */
    +	background-color: #fff;
    +
    +	margin: 20px;
    +}
    +
    +.cke_editable
    +{
    +	font-size: 13px;
    +	line-height: 1.6em;
    +}
    +
    +blockquote
    +{
    +	font-style: italic;
    +	font-family: Georgia, Times, "Times New Roman", serif;
    +	padding: 2px 0;
    +	border-style: solid;
    +	border-color: #ccc;
    +	border-width: 0;
    +}
    +
    +.cke_contents_ltr blockquote
    +{
    +	padding-left: 20px;
    +	padding-right: 8px;
    +	border-left-width: 5px;
    +}
    +
    +.cke_contents_rtl blockquote
    +{
    +	padding-left: 8px;
    +	padding-right: 20px;
    +	border-right-width: 5px;
    +}
    +
    +a
    +{
    +	color: #0782C1;
    +}
    +
    +ol,ul,dl
    +{
    +	/* IE7: reset rtl list margin. (#7334) */
    +	*margin-right: 0px;
    +	/* preserved spaces for list items with text direction other than the list. (#6249,#8049)*/
    +	padding: 0 40px;
    +}
    +
    +h1,h2,h3,h4,h5,h6
    +{
    +	font-weight: normal;
    +	line-height: 1.2em;
    +}
    +
    +hr
    +{
    +	border: 0px;
    +	border-top: 1px solid #ccc;
    +}
    +
    +img.right {
    +    border: 1px solid #ccc;
    +    float: right;
    +    margin-left: 15px;
    +    padding: 5px;
    +}
    +
    +img.left {
    +    border: 1px solid #ccc;
    +    float: left;
    +    margin-right: 15px;
    +    padding: 5px;
    +}
    +
    +img:hover {
    +	opacity: .9;
    +	filter: alpha(opacity = 90);
    +}
    +
    +pre
    +{
    +	white-space: pre-wrap; /* CSS 2.1 */
    +	word-wrap: break-word; /* IE7 */
    +}
    +
    +.marker {
    +    background-color: Yellow;
    +}
    diff --git a/src/main/webapp/plug-in/ckeditor/ftlConfig.js b/src/main/webapp/plug-in/ckeditor/ftlConfig.js
    new file mode 100644
    index 00000000..7a4dba74
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/ftlConfig.js
    @@ -0,0 +1,18 @@
    +CKEDITOR.editorConfig = function( config ) {
    +
    +	config.language = 'zh-cn';
    +	config.fullPage= true;
    +	config.allowedContent= true;
    +	config.skin = 'moonocolor';
    +	config.font_names = '瀹嬩綋/瀹嬩綋;榛戜綋/榛戜綋;浠垮畫/浠垮畫_GB2312;妤蜂綋/妤蜂綋_GB2312;闅朵功/闅朵功;骞煎渾/骞煎渾;寰蒋闆呴粦/寰蒋闆呴粦;'
    +		+ config.font_names;
    +	
    +	config.toolbarGroups = [
    +        { name: 'document',    groups: [ 'mode', 'document', 'doctools' ] },
    +        { name: 'clipboard',   groups: [ 'clipboard', 'undo' ] },
    +        { name: 'insert' },{name:'font'},{ name: 'tools' },
    +        { name: 'others' },{ name: 'editing',     groups: [ 'find', 'selection' ] },
    +        { name: 'links' },{ name: 'basicstyles', groups: [ 'basicstyles', 'cleanup', 'font'] },
    +        { name: 'paragraph',   groups: [ 'list', 'indent', 'blocks', 'align' ] },
    +        { name: 'forms' },{ name: 'styles' },{ name: 'colors' }];
    +};
    diff --git a/src/main/webapp/plug-in/ckeditor/lang/en.js b/src/main/webapp/plug-in/ckeditor/lang/en.js
    new file mode 100644
    index 00000000..11db7880
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/lang/en.js
    @@ -0,0 +1,5 @@
    +锘/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.lang['en']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Alignment","alignLeft":"Left","alignRight":"Right","alignCenter":"Center","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"colorbutton":{"auto":"Automatic","bgColorTitle":"Background Color","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"More Colors...","panelTitle":"Colors","textColorTitle":"Text Color"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Templates","emptyListMsg":"(No templates defined)","insertOption":"Replace actual contents","options":"Template Options","selectPromptMsg":"Please select the template to open in the editor","title":"Content Templates"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"find":{"find":"Find","findOptions":"Find Options","findWhat":"Find what:","matchCase":"Match case","matchCyclic":"Match cyclic","matchWord":"Match whole word","notFoundMsg":"The specified text was not found.","replace":"Replace","replaceAll":"Replace All","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Replace with:","title":"Find and Replace"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs Bottom","alignAbsMiddle":"Abs Middle","alignBaseline":"Baseline","alignTextTop":"Text Top","bgcolor":"Background color","chkFull":"Allow Fullscreen","chkLoop":"Loop","chkMenu":"Enable Flash Menu","chkPlay":"Auto Play","flashvars":"Variables for Flash","hSpace":"HSpace","properties":"Flash Properties","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Scale","scaleAll":"Show all","scaleFit":"Exact Fit","scaleNoBorder":"No Border","title":"Flash Properties","vSpace":"VSpace","validateHSpace":"HSpace must be a number.","validateSrc":"URL must not be empty.","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Size","voiceLabel":"Font Size","panelTitle":"Font Size"},"label":"Font","panelTitle":"Font Name","voiceLabel":"Font"},"forms":{"button":{"title":"Button Properties","text":"Text (Value)","type":"Type","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Checkbox Properties","radioTitle":"Radio Button Properties","value":"Value","selected":"Selected"},"form":{"title":"Form Properties","menu":"Form Properties","action":"Action","method":"Method","encoding":"Encoding"},"hidden":{"title":"Hidden Field Properties","name":"Name","value":"Value"},"select":{"title":"Selection Field Properties","selectInfo":"Select Info","opAvail":"Available Options","value":"Value","size":"Size","lines":"lines","chkMulti":"Allow multiple selections","opText":"Text","opValue":"Value","btnAdd":"Add","btnModify":"Modify","btnUp":"Up","btnDown":"Down","btnSetValue":"Set as selected value","btnDelete":"Delete"},"textarea":{"title":"Textarea Properties","cols":"Columns","rows":"Rows"},"textfield":{"title":"Text Field Properties","name":"Name","value":"Value","charWidth":"Character Width","maxChars":"Maximum Characters","type":"Type","typeText":"Text","typePass":"Password","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"smiley":{"options":"Smiley Options","title":"Insert a Smiley","toolbar":"Smiley"},"justify":{"block":"Justify","center":"Center","left":"Align Left","right":"Align Right"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"newpage":{"toolbar":"New Page"},"pagebreak":{"alt":"Page Break","toolbar":"Insert Page Break for Printing"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"preview":{"preview":"Preview"},"print":{"toolbar":"Print"},"removeformat":{"toolbar":"Remove Format"},"save":{"toolbar":"Save"},"selectall":{"toolbar":"Select All"},"showblocks":{"toolbar":"Show Blocks"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}};
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/lang/zh-cn.js b/src/main/webapp/plug-in/ckeditor/lang/zh-cn.js
    new file mode 100644
    index 00000000..9331e68d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/lang/zh-cn.js
    @@ -0,0 +1,5 @@
    +锘/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.lang['zh-cn']={"dir":"ltr","editor":"鎵瑙佸嵆鎵寰楃紪杈戝櫒","common":{"editorHelp":"鎸 ALT+0 鑾峰緱甯姪","browseServer":"娴忚鏈嶅姟鍣","url":"URL","protocol":"鍗忚","upload":"涓婁紶","uploadSubmit":"涓婁紶鍒版湇鍔″櫒","image":"鍥捐薄","flash":"Flash","form":"琛ㄥ崟","checkbox":"澶嶉夋","radio":"鍗曢夋寜閽","textField":"鍗曡鏂囨湰","textarea":"澶氳鏂囨湰","hiddenField":"闅愯棌鍩","button":"鎸夐挳","select":"鍒楄〃/鑿滃崟","imageButton":"鍥惧儚鎸夐挳","notSet":"<娌℃湁璁剧疆>","id":"ID","name":"鍚嶇О","langDir":"璇█鏂瑰悜","langDirLtr":"浠庡乏鍒板彸 (LTR)","langDirRtl":"浠庡彸鍒板乏 (RTL)","langCode":"璇█浠g爜","longDescr":"璇︾粏璇存槑 URL","cssClass":"鏍峰紡绫诲悕绉","advisoryTitle":"鏍囬","cssStyle":"琛屽唴鏍峰紡","ok":"纭畾","cancel":"鍙栨秷","close":"鍏抽棴","preview":"棰勮","resize":"鎷栨嫿浠ユ敼鍙樺ぇ灏","generalTab":"甯歌","advancedTab":"楂樼骇","validateNumberFailed":"闇瑕佽緭鍏ユ暟瀛楁牸寮","confirmNewPage":"褰撳墠鏂囨。鍐呭鏈繚瀛橈紝鏄惁纭鏂板缓鏂囨。锛","confirmCancel":"閮ㄥ垎淇敼灏氭湭淇濆瓨锛屾槸鍚︾‘璁ゅ叧闂璇濇锛","options":"閫夐」","target":"鐩爣绐楀彛","targetNew":"鏂扮獥鍙 (_blank)","targetTop":"鏁撮〉 (_top)","targetSelf":"鏈獥鍙 (_self)","targetParent":"鐖剁獥鍙 (_parent)","langDirLTR":"浠庡乏鍒板彸 (LTR)","langDirRTL":"浠庡彸鍒板乏 (RTL)","styles":"鏍峰紡","cssClasses":"鏍峰紡绫","width":"瀹藉害","height":"楂樺害","align":"瀵归綈鏂瑰紡","alignLeft":"宸﹀榻","alignRight":"鍙冲榻","alignCenter":"灞呬腑","alignTop":"椤剁","alignMiddle":"灞呬腑","alignBottom":"搴曢儴","invalidValue":"鏃犳晥鐨勫笺","invalidHeight":"楂樺害蹇呴』涓烘暟瀛楁牸寮","invalidWidth":"瀹藉害蹇呴』涓烘暟瀛楁牸寮","invalidCssLength":"姝も%1鈥濆瓧娈电殑鍊煎繀椤讳负姝f暟锛屽彲浠ュ寘鍚垨涓嶅寘鍚竴涓湁鏁堢殑 CSS 闀垮害鍗曚綅(px, %, in, cm, mm, em, ex, pt 鎴 pc)","invalidHtmlLength":"姝も%1鈥濆瓧娈电殑鍊煎繀椤讳负姝f暟锛屽彲浠ュ寘鍚垨涓嶅寘鍚竴涓湁鏁堢殑 HTML 闀垮害鍗曚綅(px 鎴 %)","invalidInlineStyle":"鍐呰仈鏍峰紡蹇呴』涓烘牸寮忔槸浠ュ垎鍙峰垎闅旂殑涓涓垨澶氫釜鈥滃睘鎬у悕 : 灞炴у尖濄","cssLengthTooltip":"杈撳叆涓涓〃绀哄儚绱犲肩殑鏁板瓧锛屾垨鍔犱笂涓涓湁鏁堢殑 CSS 闀垮害鍗曚綅(px, %, in, cm, mm, em, ex, pt 鎴 pc)銆","unavailable":"%1<span class=\"cke_accessibility\">锛屼笉鍙敤</span>"},"about":{"copy":"鐗堟潈鎵鏈 &copy; $1銆<br />淇濈暀鎵鏈夋潈鍒┿","dlgTitle":"鍏充簬 CKEditor","help":"璁块棶 $1 浠ヨ幏鍙栧府鍔┿","moreInfo":"鐩稿叧鎺堟潈璁稿彲淇℃伅璇疯闂垜浠殑缃戠珯锛","title":"鍏充簬 CKEditor","userGuide":"CKEditor 鐢ㄦ埛鍚戝"},"basicstyles":{"bold":"鍔犵矖","italic":"鍊炬枩","strike":"鍒犻櫎绾","subscript":"涓嬫爣","superscript":"涓婃爣","underline":"涓嬪垝绾"},"bidi":{"ltr":"鏂囧瓧鏂瑰悜涓轰粠宸﹁嚦鍙","rtl":"鏂囧瓧鏂瑰悜涓轰粠鍙宠嚦宸"},"blockquote":{"toolbar":"鍧楀紩鐢"},"clipboard":{"copy":"澶嶅埗","copyError":"鎮ㄧ殑娴忚鍣ㄥ畨鍏ㄨ缃笉鍏佽缂栬緫鍣ㄨ嚜鍔ㄦ墽琛屽鍒舵搷浣滐紝璇蜂娇鐢ㄩ敭鐩樺揩鎹烽敭(Ctrl/Cmd+C)鏉ュ畬鎴愩","cut":"鍓垏","cutError":"鎮ㄧ殑娴忚鍣ㄥ畨鍏ㄨ缃笉鍏佽缂栬緫鍣ㄨ嚜鍔ㄦ墽琛屽壀鍒囨搷浣滐紝璇蜂娇鐢ㄩ敭鐩樺揩鎹烽敭(Ctrl/Cmd+X)鏉ュ畬鎴愩","paste":"绮樿创","pasteArea":"绮樿创鍖哄煙","pasteMsg":"璇蜂娇鐢ㄩ敭鐩樺揩鎹烽敭(<STRONG>Ctrl/Cmd+V</STRONG>)鎶婂唴瀹圭矘璐村埌涓嬮潰鐨勬柟妗嗛噷锛屽啀鎸 <STRONG>纭畾</STRONG>","securityMsg":"鍥犱负鎮ㄧ殑娴忚鍣ㄧ殑瀹夊叏璁剧疆鍘熷洜锛屾湰缂栬緫鍣ㄤ笉鑳界洿鎺ヨ闂偍鐨勫壀璐存澘鍐呭锛屼綘闇瑕佸湪鏈獥鍙i噸鏂扮矘璐翠竴娆°","title":"绮樿创"},"colorbutton":{"auto":"鑷姩","bgColorTitle":"鑳屾櫙棰滆壊","colors":{"000":"榛","800000":"瑜愮孩","8B4513":"娣辫","2F4F4F":"澧ㄧ豢","008080":"缁挎澗鐭","000080":"娴峰啗钃","4B0082":"闈涜摑","696969":"鏆楃伆","B22222":"鐮栫孩","A52A2A":"瑜","DAA520":"閲戦粍","006400":"娣辩豢","40E0D0":"钃濈豢","0000CD":"涓摑","800080":"绱","808080":"鐏","F00":"绾","FF8C00":"娣辨","FFD700":"閲","008000":"缁","0FF":"闈","00F":"钃","EE82EE":"绱綏鍏","A9A9A9":"娣辩伆","FFA07A":"浜","FFA500":"姗","FFFF00":"榛","00FF00":"姘寸豢","AFEEEE":"绮夎摑","ADD8E6":"浜摑","DDA0DD":"姊呯孩","D3D3D3":"娣$伆","FFF0F5":"娣$传绾","FAEBD7":"鍙よ懀鐧","FFFFE0":"娣¢粍","F0FFF0":"铚滅櫧","F0FFFF":"澶╄摑","F0F8FF":"娣¤摑","E6E6FA":"娣$传","FFF":"鐧"},"more":"鍏跺畠棰滆壊...","panelTitle":"棰滆壊","textColorTitle":"鏂囨湰棰滆壊"},"colordialog":{"clear":"娓呴櫎","highlight":"楂樹寒","options":"棰滆壊閫夐」","selected":"閫夋嫨棰滆壊","title":"閫夋嫨棰滆壊"},"templates":{"button":"妯℃澘","emptyListMsg":"(娌℃湁妯℃澘)","insertOption":"鏇挎崲褰撳墠鍐呭","options":"妯℃澘閫夐」","selectPromptMsg":"璇烽夋嫨瑕佸湪缂栬緫鍣ㄤ腑浣跨敤鐨勬ā鏉匡細","title":"鍐呭妯℃澘"},"contextmenu":{"options":"蹇嵎鑿滃崟閫夐」"},"div":{"IdInputLabel":"ID","advisoryTitleInputLabel":"鏍囬","cssClassInputLabel":"鏍峰紡绫诲悕绉","edit":"缂栬緫 DIV","inlineStyleInputLabel":"琛屽唴鏍峰紡","langDirLTRLabel":"浠庡乏鍒板彸 (LTR)","langDirLabel":"璇█鏂瑰悜","langDirRTLLabel":"浠庡彸鍒板乏 (RTL)","languageCodeInputLabel":"璇█浠g爜","remove":"绉婚櫎 DIV","styleSelectLabel":"鏍峰紡","title":"鍒涘缓 DIV 瀹瑰櫒","toolbar":"鍒涘缓 DIV 瀹瑰櫒"},"toolbar":{"toolbarCollapse":"鎶樺彔宸ュ叿鏍","toolbarExpand":"灞曞紑宸ュ叿鏍","toolbarGroups":{"document":"鏂囨。","clipboard":"鍓创鏉/鎾ら攢","editing":"缂栬緫","forms":"琛ㄥ崟","basicstyles":"鍩烘湰鏍煎紡","paragraph":"娈佃惤","links":"閾炬帴","insert":"鎻掑叆","styles":"鏍峰紡","colors":"棰滆壊","tools":"宸ュ叿"},"toolbars":"宸ュ叿鏍"},"elementspath":{"eleLabel":"鍏冪礌璺緞","eleTitle":"%1 鍏冪礌"},"list":{"bulletedlist":"椤圭洰鍒楄〃","numberedlist":"缂栧彿鍒楄〃"},"indent":{"indent":"澧炲姞缂╄繘閲","outdent":"鍑忓皯缂╄繘閲"},"find":{"find":"鏌ユ壘","findOptions":"鏌ユ壘閫夐」","findWhat":"鏌ユ壘:","matchCase":"鍖哄垎澶у皬鍐","matchCyclic":"寰幆鍖归厤","matchWord":"鍏ㄥ瓧鍖归厤","notFoundMsg":"鎸囧畾鐨勬枃鏈病鏈夋壘鍒般","replace":"鏇挎崲","replaceAll":"鍏ㄩ儴鏇挎崲","replaceSuccessMsg":"鍏卞畬鎴 %1 澶勬浛鎹€","replaceWith":"鏇挎崲:","title":"鏌ユ壘鍜屾浛鎹"},"fakeobjects":{"anchor":"閿氱偣","flash":"Flash 鍔ㄧ敾","hiddenfield":"闅愯棌鍩","iframe":"IFrame","unknown":"鏈煡瀵硅薄"},"flash":{"access":"鍏佽鑴氭湰璁块棶","accessAlways":"鎬绘槸","accessNever":"浠庝笉","accessSameDomain":"鍚屽煙","alignAbsBottom":"缁濆搴曢儴","alignAbsMiddle":"缁濆灞呬腑","alignBaseline":"鍩虹嚎","alignTextTop":"鏂囨湰涓婃柟","bgcolor":"鑳屾櫙棰滆壊","chkFull":"鍚敤鍏ㄥ睆","chkLoop":"寰幆","chkMenu":"鍚敤 Flash 鑿滃崟","chkPlay":"鑷姩鎾斁","flashvars":"Flash 鍙橀噺","hSpace":"姘村钩闂磋窛","properties":"Flash 灞炴","propertiesTab":"灞炴","quality":"璐ㄩ噺","qualityAutoHigh":"楂(鑷姩)","qualityAutoLow":"浣(鑷姩)","qualityBest":"鏈濂","qualityHigh":"楂","qualityLow":"浣","qualityMedium":"涓(鑷姩)","scale":"缂╂斁","scaleAll":"鍏ㄩ儴鏄剧ず","scaleFit":"涓ユ牸鍖归厤","scaleNoBorder":"鏃犺竟妗","title":"鏍囬","vSpace":"鍨傜洿闂磋窛","validateHSpace":"姘村钩闂磋窛蹇呴』涓烘暟瀛楁牸寮","validateSrc":"璇疯緭鍏ユ簮鏂囦欢鍦板潃","validateVSpace":"鍨傜洿闂磋窛蹇呴』涓烘暟瀛楁牸寮","windowMode":"绐椾綋妯″紡","windowModeOpaque":"涓嶉忔槑","windowModeTransparent":"閫忔槑","windowModeWindow":"绐椾綋"},"font":{"fontSize":{"label":"澶у皬","voiceLabel":"鏂囧瓧澶у皬","panelTitle":"澶у皬"},"label":"瀛椾綋","panelTitle":"瀛椾綋","voiceLabel":"瀛椾綋"},"forms":{"button":{"title":"鎸夐挳灞炴","text":"鏍囩(鍊)","type":"绫诲瀷","typeBtn":"鎸夐挳","typeSbm":"鎻愪氦","typeRst":"閲嶈"},"checkboxAndRadio":{"checkboxTitle":"澶嶉夋灞炴","radioTitle":"鍗曢夋寜閽睘鎬","value":"閫夊畾鍊","selected":"宸插嬀閫"},"form":{"title":"琛ㄥ崟灞炴","menu":"琛ㄥ崟灞炴","action":"鍔ㄤ綔","method":"鏂规硶","encoding":"琛ㄥ崟缂栫爜"},"hidden":{"title":"闅愯棌鍩熷睘鎬","name":"鍚嶇О","value":"鍒濆鍊"},"select":{"title":"鑿滃崟/鍒楄〃灞炴","selectInfo":"閫夋嫨淇℃伅","opAvail":"鍙夐」","value":"鍊","size":"楂樺害","lines":"琛","chkMulti":"鍏佽澶氶","opText":"閫夐」鏂囨湰","opValue":"閫夐」鍊","btnAdd":"娣诲姞","btnModify":"淇敼","btnUp":"涓婄Щ","btnDown":"涓嬬Щ","btnSetValue":"璁句负鍒濆閫夊畾","btnDelete":"鍒犻櫎"},"textarea":{"title":"澶氳鏂囨湰灞炴","cols":"瀛楃瀹藉害","rows":"琛屾暟"},"textfield":{"title":"鍗曡鏂囨湰灞炴","name":"鍚嶇О","value":"鍒濆鍊","charWidth":"瀛楃瀹藉害","maxChars":"鏈澶氬瓧绗︽暟","type":"绫诲瀷","typeText":"鏂囨湰","typePass":"瀵嗙爜","typeEmail":"Email","typeSearch":"鎼滅储","typeTel":"鐢佃瘽鍙风爜","typeUrl":"鍦板潃"}},"format":{"label":"鏍煎紡","panelTitle":"鏍煎紡","tag_address":"鍦板潃","tag_div":"娈佃惤(DIV)","tag_h1":"鏍囬 1","tag_h2":"鏍囬 2","tag_h3":"鏍囬 3","tag_h4":"鏍囬 4","tag_h5":"鏍囬 5","tag_h6":"鏍囬 6","tag_p":"鏅","tag_pre":"宸茬紪鎺掓牸寮"},"horizontalrule":{"toolbar":"鎻掑叆姘村钩绾"},"iframe":{"border":"鏄剧ず妗嗘灦杈规","noUrl":"璇疯緭鍏ユ鏋剁殑 URL","scrolling":"鍏佽婊氬姩鏉","title":"IFrame 灞炴","toolbar":"IFrame"},"image":{"alertUrl":"璇疯緭鍏ュ浘璞″湴鍧","alt":"鏇挎崲鏂囨湰","border":"杈规澶у皬","btnUpload":"涓婁紶鍒版湇鍔″櫒","button2Img":"纭畾瑕佹妸褰撳墠鍥惧儚鎸夐挳杞崲涓烘櫘閫氬浘鍍忓悧锛","hSpace":"姘村钩闂磋窛","img2Button":"纭畾瑕佹妸褰撳墠鍥惧儚鏀瑰彉涓哄浘鍍忔寜閽悧锛","infoTab":"鍥捐薄","linkTab":"閾炬帴","lockRatio":"閿佸畾姣斾緥","menu":"鍥捐薄灞炴","resetSize":"鍘熷灏哄","title":"鍥捐薄灞炴","titleButton":"鍥惧儚鍩熷睘鎬","upload":"涓婁紶","urlMissing":"缂哄皯鍥惧儚婧愭枃浠跺湴鍧","vSpace":"鍨傜洿闂磋窛","validateBorder":"杈规澶у皬蹇呴』涓烘暣鏁版牸寮","validateHSpace":"姘村钩闂磋窛蹇呴』涓烘暣鏁版牸寮","validateVSpace":"鍨傜洿闂磋窛蹇呴』涓烘暣鏁版牸寮"},"smiley":{"options":"琛ㄦ儏鍥炬爣閫夐」","title":"鎻掑叆琛ㄦ儏鍥炬爣","toolbar":"琛ㄦ儏绗"},"justify":{"block":"涓ょ瀵归綈","center":"灞呬腑","left":"宸﹀榻","right":"鍙冲榻"},"link":{"acccessKey":"璁块棶閿","advanced":"楂樼骇","advisoryContentType":"鍐呭绫诲瀷","advisoryTitle":"鏍囬","anchor":{"toolbar":"鎻掑叆/缂栬緫閿氱偣閾炬帴","menu":"閿氱偣閾炬帴灞炴","title":"閿氱偣閾炬帴灞炴","name":"閿氱偣鍚嶇О","errorName":"璇疯緭鍏ラ敋鐐瑰悕绉","remove":"鍒犻櫎閿氱偣"},"anchorId":"鎸夐敋鐐 ID","anchorName":"鎸夐敋鐐瑰悕绉","charset":"瀛楃缂栫爜","cssClasses":"鏍峰紡绫诲悕绉","emailAddress":"鍦板潃","emailBody":"鍐呭","emailSubject":"涓婚","id":"ID","info":"瓒呴摼鎺ヤ俊鎭","langCode":"璇█浠g爜","langDir":"璇█鏂瑰悜","langDirLTR":"浠庡乏鍒板彸 (LTR)","langDirRTL":"浠庡彸鍒板乏 (RTL)","menu":"缂栬緫瓒呴摼鎺","name":"鍚嶇О","noAnchors":"(姝ゆ枃妗f病鏈夊彲鐢ㄧ殑閿氱偣)","noEmail":"璇疯緭鍏ョ數瀛愰偖浠跺湴鍧","noUrl":"璇疯緭鍏ヨ秴閾炬帴鍦板潃","other":"<鍏朵粬>","popupDependent":"渚濋檮 (NS)","popupFeatures":"寮瑰嚭绐楀彛灞炴","popupFullScreen":"鍏ㄥ睆 (IE)","popupLeft":"宸","popupLocationBar":"鍦板潃鏍","popupMenuBar":"鑿滃崟鏍","popupResizable":"鍙缉鏀","popupScrollBars":"婊氬姩鏉","popupStatusBar":"鐘舵佹爮","popupToolbar":"宸ュ叿鏍","popupTop":"鍙","rel":"鍏宠仈","selectAnchor":"閫夋嫨涓涓敋鐐","styles":"琛屽唴鏍峰紡","tabIndex":"Tab 閿搴","target":"鐩爣","targetFrame":"<妗嗘灦>","targetFrameName":"鐩爣妗嗘灦鍚嶇О","targetPopup":"<寮瑰嚭绐楀彛>","targetPopupName":"寮瑰嚭绐楀彛鍚嶇О","title":"瓒呴摼鎺","toAnchor":"椤靛唴閿氱偣閾炬帴","toEmail":"鐢靛瓙閭欢","toUrl":"鍦板潃","toolbar":"鎻掑叆/缂栬緫瓒呴摼鎺","type":"瓒呴摼鎺ョ被鍨","unlink":"鍙栨秷瓒呴摼鎺","upload":"涓婁紶"},"liststyle":{"armenian":"浼犵粺鐨勪簹缇庡凹浜氱紪鍙锋柟寮","bulletedTitle":"椤圭洰鍒楄〃灞炴","circle":"绌哄績鍦","decimal":"鏁板瓧 (1, 2, 3, 绛)","decimalLeadingZero":"0寮澶寸殑鏁板瓧鏍囪(01, 02, 03, 绛)","disc":"瀹炲績鍦","georgian":"浼犵粺鐨勪箶娌讳簹缂栧彿鏂瑰紡(an, ban, gan, 绛)","lowerAlpha":"灏忓啓鑻辨枃瀛楁瘝(a, b, c, d, e, 绛)","lowerGreek":"灏忓啓甯岃厞瀛楁瘝(alpha, beta, gamma, 绛)","lowerRoman":"灏忓啓缃楅┈鏁板瓧(i, ii, iii, iv, v, 绛)","none":"鏃犳爣璁","notset":"<娌℃湁璁剧疆>","numberedTitle":"缂栧彿鍒楄〃灞炴","square":"瀹炲績鏂瑰潡","start":"寮濮嬪簭鍙","type":"鏍囪绫诲瀷","upperAlpha":"澶у啓鑻辨枃瀛楁瘝(A, B, C, D, E, 绛)","upperRoman":"澶у啓缃楅┈鏁板瓧(I, II, III, IV, V, 绛)","validateStartNumber":"鍒楄〃寮濮嬪簭鍙峰繀椤讳负鏁存暟鏍煎紡"},"magicline":{"title":"鍦ㄨ繖鎻掑叆娈佃惤"},"maximize":{"maximize":"鍏ㄥ睆","minimize":"鏈灏忓寲"},"newpage":{"toolbar":"鏂板缓"},"pagebreak":{"alt":"鍒嗛〉绗","toolbar":"鎻掑叆鎵撳嵃鍒嗛〉绗"},"pastetext":{"button":"绮樿创涓烘棤鏍煎紡鏂囨湰","title":"绮樿创涓烘棤鏍煎紡鏂囨湰"},"pastefromword":{"confirmCleanup":"鎮ㄨ绮樿创鐨勫唴瀹瑰ソ鍍忔槸鏉ヨ嚜 MS Word锛屾槸鍚﹁娓呴櫎 MS Word 鏍煎紡鍚庡啀绮樿创锛","error":"鐢变簬鍐呴儴閿欒鏃犳硶娓呯悊瑕佺矘璐寸殑鏁版嵁","title":"浠 MS Word 绮樿创","toolbar":"浠 MS Word 绮樿创"},"preview":{"preview":"棰勮"},"print":{"toolbar":"鎵撳嵃"},"removeformat":{"toolbar":"娓呴櫎鏍煎紡"},"save":{"toolbar":"淇濆瓨"},"selectall":{"toolbar":"鍏ㄩ"},"showblocks":{"toolbar":"鏄剧ず鍖哄潡"},"sourcearea":{"toolbar":"婧愮爜"},"specialchar":{"options":"鐗规畩绗﹀彿閫夐」","title":"閫夋嫨鐗规畩绗﹀彿","toolbar":"鎻掑叆鐗规畩绗﹀彿"},"scayt":{"about":"鍏充簬鍗虫椂鎷煎啓妫鏌","aboutTab":"鍏充簬","addWord":"娣诲姞鍗曡瘝","allCaps":"蹇界暐鎵鏈夊ぇ鍐欏崟璇","dic_create":"鍒涘缓","dic_delete":"鍒犻櫎","dic_field_name":"瀛楀吀鍚嶇О","dic_info":"涓寮濮嬬敤鎴疯瘝鍏稿偍瀛樺湪 Cookie 涓, 浣嗘槸 Cookies 鐨勫閲忔槸鏈夐檺鐨, 褰撶敤鎴疯瘝鍏稿闀垮埌瓒呭嚭 Cookie 闄愬埗鏃跺氨鏃犳硶鍐嶅偍瀛樹簡, 杩欐椂鎮ㄥ彲浠ュ皢璇嶅吀鍌ㄥ瓨鍒版垜浠殑鏈嶅姟鍣ㄤ笂. 瑕佹妸鎮ㄧ殑涓汉璇嶅吀鍒板偍瀛樺埌鎴戜滑鐨勬湇鍔″櫒涓婄殑璇, 闇瑕佷负鎮ㄧ殑璇嶅吀鎸囧畾涓涓悕绉, 濡傛灉鎮ㄥ湪鎴戜滑鐨勬湇鍔″櫒涓婂凡缁忔湁鍌ㄥ瓨鏈変竴涓瘝鍏, 璇疯緭鍏ヨ瘝鍏稿悕绉板苟鎸夎繕鍘熸寜閽.","dic_rename":"閲嶅懡鍚","dic_restore":"杩樺師","dictionariesTab":"瀛楀吀","disable":"绂佺敤鍗虫椂鎷煎啓妫鏌","emptyDic":"瀛楀吀鍚嶄笉搴斾负绌.","enable":"鍚敤鍗虫椂鎷煎啓妫鏌","ignore":"蹇界暐","ignoreAll":"鍏ㄩ儴蹇界暐","ignoreDomainNames":"蹇界暐鍩熷悕","langs":"璇█","languagesTab":"璇█","mixedCase":"蹇界暐澶у皬鍐欐贩鍚堢殑鍗曡瘝","mixedWithDigits":"蹇界暐甯︽暟瀛楃殑鍗曡瘝","moreSuggestions":"鏇村鎷煎啓寤鸿","opera_title":"涓嶆敮鎸 Opera 娴忚鍣","options":"閫夐」","optionsTab":"閫夐」","title":"鍗虫椂鎷煎啓妫鏌","toggle":"鏆傚仠/鍚敤鍗虫椂鎷煎啓妫鏌","noSuggestions":"No suggestion"},"stylescombo":{"label":"鏍峰紡","panelTitle":"鏍峰紡","panelTitle1":"鍧楃骇鍏冪礌鏍峰紡","panelTitle2":"鍐呰仈鍏冪礌鏍峰紡","panelTitle3":"瀵硅薄鍏冪礌鏍峰紡"},"table":{"border":"杈规","caption":"鏍囬","cell":{"menu":"鍗曞厓鏍","insertBefore":"鍦ㄥ乏渚ф彃鍏ュ崟鍏冩牸","insertAfter":"鍦ㄥ彸渚ф彃鍏ュ崟鍏冩牸","deleteCell":"鍒犻櫎鍗曞厓鏍","merge":"鍚堝苟鍗曞厓鏍","mergeRight":"鍚戝彸鍚堝苟鍗曞厓鏍","mergeDown":"鍚戜笅鍚堝苟鍗曞厓鏍","splitHorizontal":"姘村钩鎷嗗垎鍗曞厓鏍","splitVertical":"鍨傜洿鎷嗗垎鍗曞厓鏍","title":"鍗曞厓鏍煎睘鎬","cellType":"鍗曞厓鏍肩被鍨","rowSpan":"绾佃法琛屾暟","colSpan":"妯法鍒楁暟","wordWrap":"鑷姩鎹㈣","hAlign":"姘村钩瀵归綈","vAlign":"鍨傜洿瀵归綈","alignBaseline":"鍩虹嚎","bgColor":"鑳屾櫙棰滆壊","borderColor":"杈规棰滆壊","data":"鏁版嵁","header":"琛ㄥご","yes":"鏄","no":"鍚","invalidWidth":"鍗曞厓鏍煎搴﹀繀椤讳负鏁板瓧鏍煎紡","invalidHeight":"鍗曞厓鏍奸珮搴﹀繀椤讳负鏁板瓧鏍煎紡","invalidRowSpan":"琛岃法搴﹀繀椤讳负鏁存暟鏍煎紡","invalidColSpan":"鍒楄法搴﹀繀椤讳负鏁存暟鏍煎紡","chooseColor":"閫夋嫨"},"cellPad":"杈硅窛","cellSpace":"闂磋窛","column":{"menu":"鍒","insertBefore":"鍦ㄥ乏渚ф彃鍏ュ垪","insertAfter":"鍦ㄥ彸渚ф彃鍏ュ垪","deleteColumn":"鍒犻櫎鍒"},"columns":"鍒楁暟","deleteTable":"鍒犻櫎琛ㄦ牸","headers":"鏍囬鍗曞厓鏍","headersBoth":"绗竴鍒楀拰绗竴琛","headersColumn":"绗竴鍒","headersNone":"鏃","headersRow":"绗竴琛","invalidBorder":"杈规绮楃粏蹇呴』涓烘暟瀛楁牸寮","invalidCellPadding":"鍗曞厓鏍煎~鍏呭繀椤讳负鏁板瓧鏍煎紡","invalidCellSpacing":"鍗曞厓鏍奸棿璺濆繀椤讳负鏁板瓧鏍煎紡","invalidCols":"鎸囧畾鐨勮鏁板繀椤诲ぇ浜庨浂","invalidHeight":"琛ㄦ牸楂樺害蹇呴』涓烘暟瀛楁牸寮","invalidRows":"鎸囧畾鐨勫垪鏁板繀椤诲ぇ浜庨浂","invalidWidth":"琛ㄦ牸瀹藉害蹇呴』涓烘暟瀛楁牸寮","menu":"琛ㄦ牸灞炴","row":{"menu":"琛","insertBefore":"鍦ㄤ笂鏂规彃鍏ヨ","insertAfter":"鍦ㄤ笅鏂规彃鍏ヨ","deleteRow":"鍒犻櫎琛"},"rows":"琛屾暟","summary":"鎽樿","title":"琛ㄦ牸灞炴","toolbar":"琛ㄦ牸","widthPc":"鐧惧垎姣","widthPx":"鍍忕礌","widthUnit":"瀹藉害鍗曚綅"},"undo":{"redo":"閲嶅仛","undo":"鎾ゆ秷"},"wsc":{"btnIgnore":"蹇界暐","btnIgnoreAll":"鍏ㄩ儴蹇界暐","btnReplace":"鏇挎崲","btnReplaceAll":"鍏ㄩ儴鏇挎崲","btnUndo":"鎾ゆ秷","changeTo":"鏇存敼涓","errorLoading":"鍔犺浇搴旇鏈嶅姟涓绘満鏃跺嚭閿: %s.","ieSpellDownload":"鎷煎啓妫鏌ユ彃浠惰繕娌″畨瑁, 鎮ㄦ槸鍚︽兂鐜板湪灏变笅杞?","manyChanges":"鎷煎啓妫鏌ュ畬鎴: 鏇存敼浜 %1 涓崟璇","noChanges":"鎷煎啓妫鏌ュ畬鎴: 娌℃湁鏇存敼浠讳綍鍗曡瘝","noMispell":"鎷煎啓妫鏌ュ畬鎴: 娌℃湁鍙戠幇鎷煎啓閿欒","noSuggestions":"- 娌℃湁寤鸿 -","notAvailable":"鎶辨瓑, 鏈嶅姟鐩墠鏆備笉鍙敤","notInDic":"娌℃湁鍦ㄥ瓧鍏搁噷","oneChange":"鎷煎啓妫鏌ュ畬鎴: 鏇存敼浜嗕竴涓崟璇","progress":"姝e湪杩涜鎷煎啓妫鏌...","title":"鎷煎啓妫鏌","toolbar":"鎷煎啓妫鏌"}};
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js b/src/main/webapp/plug-in/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js
    new file mode 100644
    index 00000000..4bf2d3c9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js
    @@ -0,0 +1,10 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("a11yHelp",function(j){var l=j.lang.a11yhelp,m=CKEDITOR.tools.getNextId(),d={8:"BACKSPACE",9:"TAB",13:"ENTER",16:"SHIFT",17:"CTRL",18:"ALT",19:"PAUSE",20:"CAPSLOCK",27:"ESCAPE",33:"PAGE UP",34:"PAGE DOWN",35:"END",36:"HOME",37:"LEFT ARROW",38:"UP ARROW",39:"RIGHT ARROW",40:"DOWN ARROW",45:"INSERT",46:"DELETE",91:"LEFT WINDOW KEY",92:"RIGHT WINDOW KEY",93:"SELECT KEY",96:"NUMPAD  0",97:"NUMPAD  1",98:"NUMPAD  2",99:"NUMPAD  3",100:"NUMPAD  4",101:"NUMPAD  5",102:"NUMPAD  6",103:"NUMPAD  7",
    +104:"NUMPAD  8",105:"NUMPAD  9",106:"MULTIPLY",107:"ADD",109:"SUBTRACT",110:"DECIMAL POINT",111:"DIVIDE",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NUM LOCK",145:"SCROLL LOCK",186:"SEMI-COLON",187:"EQUAL SIGN",188:"COMMA",189:"DASH",190:"PERIOD",191:"FORWARD SLASH",192:"GRAVE ACCENT",219:"OPEN BRACKET",220:"BACK SLASH",221:"CLOSE BRAKET",222:"SINGLE QUOTE"};d[CKEDITOR.ALT]="ALT";d[CKEDITOR.SHIFT]="SHIFT";d[CKEDITOR.CTRL]="CTRL";
    +var e=[CKEDITOR.ALT,CKEDITOR.SHIFT,CKEDITOR.CTRL],n=/\$\{(.*?)\}/g,q=function(){var o=j.keystrokeHandler.keystrokes,f={},b;for(b in o)f[o[b]]=b;return function(b,g){var a;if(f[g]){a=f[g];for(var h,i,k=[],c=0;c<e.length;c++)i=e[c],h=a/e[c],1<h&&2>=h&&(a-=i,k.push(d[i]));k.push(d[a]||String.fromCharCode(a));a=k.join("+")}else a=b;return a}}();return{title:l.title,minWidth:600,minHeight:400,contents:[{id:"info",label:j.lang.common.generalTab,expand:!0,elements:[{type:"html",id:"legends",style:"white-space:normal;",
    +focus:function(){this.getElement().focus()},html:function(){for(var d='<div class="cke_accessibility_legend" role="document" aria-labelledby="'+m+'_arialbl" tabIndex="-1">%1</div><span id="'+m+'_arialbl" class="cke_voice_label">'+l.contents+" </span>",f=[],b=l.legend,j=b.length,g=0;g<j;g++){for(var a=b[g],h=[],i=a.items,k=i.length,c=0;c<k;c++){var e=i[c],p=e.legend.replace(n,q);p.match(n)||h.push("<dt>%1</dt><dd>%2</dd>".replace("%1",e.name).replace("%2",p))}f.push("<h1>%1</h1><dl>%2</dl>".replace("%1",
    +a.name).replace("%2",h.join("")))}return d.replace("%1",f.join(""))}()+'<style type="text/css">.cke_accessibility_legend{width:600px;height:400px;padding-right:5px;overflow-y:auto;overflow-x:hidden;}.cke_browser_quirks .cke_accessibility_legend,.cke_browser_ie6 .cke_accessibility_legend{height:390px}.cke_accessibility_legend *{white-space:normal;}.cke_accessibility_legend h1{font-size: 20px;border-bottom: 1px solid #AAA;margin: 5px 0px 15px;}.cke_accessibility_legend dl{margin-left: 5px;}.cke_accessibility_legend dt{font-size: 13px;font-weight: bold;}.cke_accessibility_legend dd{margin:10px}</style>'}]}],
    +buttons:[CKEDITOR.dialog.cancelButton]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/a11yhelp/dialogs/lang/en.js b/src/main/webapp/plug-in/ckeditor/plugins/a11yhelp/dialogs/lang/en.js
    new file mode 100644
    index 00000000..0124a3cf
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/a11yhelp/dialogs/lang/en.js
    @@ -0,0 +1,9 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("a11yhelp","en",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"General",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
    +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
    +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
    +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
    +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js b/src/main/webapp/plug-in/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js
    new file mode 100644
    index 00000000..7e2097c3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js
    @@ -0,0 +1,7 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("a11yhelp","zh-cn",{title:"杈呭姪鍔熻兘璇存槑",contents:"甯姪鍐呭銆傝鍏抽棴姝ゅ璇濇璇锋寜 ESC 閿",legend:[{name:"甯歌",items:[{name:"缂栬緫鍣ㄥ伐鍏锋爮",legend:"鎸 ${toolbarFocus} 瀵艰埅鍒板伐鍏锋爮锛屼娇鐢 TAB 閿拰 SHIFT+TAB 缁勫悎閿Щ鍔ㄥ埌涓婁竴涓拰涓嬩竴涓伐鍏锋爮缁勩備娇鐢ㄥ乏鍙崇澶撮敭绉诲姩鍒颁笂涓涓拰涓嬩竴涓伐鍏锋爮鎸夐挳銆傛寜绌烘牸閿垨鍥炶溅閿互閫変腑宸ュ叿鏍忔寜閽"},{name:"缂栬緫鍣ㄥ璇濇",legend:"鍦ㄥ璇濇鍐咃紝TAB 閿Щ鍔ㄥ埌涓嬩竴涓瓧娈碉紝SHIFT + TAB 缁勫悎閿Щ鍔ㄥ埌涓婁竴涓瓧娈碉紝ENTER 閿彁浜ゅ璇濇锛孍SC 閿彇娑堝璇濇銆傚浜庢湁澶氶夐」鍗$殑瀵硅瘽妗嗭紝鐢ˋLT + F10鏉ョЩ鍒伴夐」鍗″垪琛ㄣ傜劧鍚庣敤 TAB 閿垨鑰呭悜鍙崇澶存潵绉诲姩鍒颁笅涓涓夐」鍗★紱SHIFT + TAB 缁勫悎閿垨鑰呭悜宸︾澶寸Щ鍔ㄥ埌涓婁竴涓夐」鍗°傜敤 SPACE 閿垨鑰 ENTER 閿夋嫨閫夐」鍗°"},{name:"缂栬緫鍣ㄤ笂涓嬫枃鑿滃崟",legend:"鐢 ${contextMenu} 鎴栬呪滃簲鐢ㄧ▼搴忛敭鈥濇墦寮涓婁笅鏂囪彍鍗曘傜劧鍚庣敤 TAB 閿垨鑰呬笅绠ご閿潵绉诲姩鍒颁笅涓涓彍鍗曢」锛汼HIFT + TAB 缁勫悎閿垨鑰呬笂绠ご閿Щ鍔ㄥ埌涓婁竴涓彍鍗曢」銆傜敤 SPACE 閿垨鑰 ENTER 閿夋嫨鑿滃崟椤广傜敤 SPACE 閿紝ENTER 閿垨鑰呭彸绠ご閿墦寮瀛愯彍鍗曘傝繑鍥炶彍鍗曠敤 ESC 閿垨鑰呭乏绠ご閿傜敤 ESC 閿叧闂笂涓嬫枃鑿滃崟銆"},
    +{name:"缂栬緫鍣ㄥ垪琛ㄦ",legend:"鍦ㄥ垪琛ㄦ涓紝绉诲埌涓嬩竴鍒楄〃椤圭敤 TAB 閿垨鑰呬笅绠ご閿傜Щ鍒颁笂涓鍒楄〃椤圭敤SHIFT + TAB 缁勫悎閿垨鑰呬笂绠ご閿紝鐢 SPACE 閿垨鑰 ENTER 閿夋嫨鍒楄〃椤广傜敤 ESC 閿敹璧峰垪琛ㄦ銆"},{name:"缂栬緫鍣ㄥ厓绱犺矾寰勬爮",legend:"鎸 ${elementsPathFocus} 浠ュ鑸埌鍏冪礌璺緞鏍忥紝浣跨敤 TAB 閿垨鍙崇澶撮敭閫夋嫨涓嬩竴涓厓绱狅紝浣跨敤 SHIFT+TAB 缁勫悎閿垨宸︾澶撮敭閫夋嫨涓婁竴涓厓绱狅紝鎸夌┖鏍奸敭鎴栧洖杞﹂敭浠ラ夊畾缂栬緫鍣ㄩ噷鐨勫厓绱犮"}]},{name:"鍛戒护",items:[{name:" 鎾ゆ秷鍛戒护",legend:"鎸 ${undo}"},{name:" 閲嶅仛鍛戒护",legend:"鎸 ${redo}"},{name:" 鍔犵矖鍛戒护",legend:"鎸 ${bold}"},{name:" 鍊炬枩鍛戒护",legend:"鎸 ${italic}"},{name:" 涓嬪垝绾垮懡浠",legend:"鎸 ${underline}"},{name:" 閾炬帴鍛戒护",legend:"鎸 ${link}"},{name:" 宸ュ叿鏍忔姌鍙犲懡浠",legend:"鎸 ${toolbarCollapse}"},
    +{name:"璁块棶鍓嶄竴涓劍鐐瑰尯鍩熺殑鍛戒护",legend:"鎸 ${accessPreviousSpace} 璁块棶^绗﹀彿鍓嶆渶杩戠殑涓嶅彲璁块棶鐨勭劍鐐瑰尯鍩燂紝渚嬪锛氫袱涓浉閭荤殑 HR鍏冪礌銆傞噸澶嶆缁勫悎鎸夐敭鍙互鍒拌揪杩滃鐨勭劍鐐瑰尯鍩熴"},{name:"璁块棶涓嬩竴涓劍鐐瑰尯鍩熷懡浠",legend:"鎸 ${accessNextSpace} 浠ヨ闂甞绗﹀彿鍚庢渶杩戠殑涓嶅彲璁块棶鐨勭劍鐐瑰尯鍩熴備緥濡傦細涓や釜鐩搁偦鐨 HR 鍏冪礌銆傞噸澶嶆缁勫悎鎸夐敭鍙互鍒拌揪杩滃鐨勭劍鐐瑰尯鍩熴"},{name:"杈呭姪鍔熻兘甯姪",legend:"鎸 ${a11yHelp}"}]}]});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/about/dialogs/about.js b/src/main/webapp/plug-in/ckeditor/plugins/about/dialogs/about.js
    new file mode 100644
    index 00000000..3d9156bf
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/about/dialogs/about.js
    @@ -0,0 +1,6 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("about",function(a){a=a.lang.about;return{title:CKEDITOR.env.ie?a.dlgTitle:a.title,minWidth:390,minHeight:230,contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[{type:"html",html:'<style type="text/css">.cke_about_container{color:#000 !important;padding:10px 10px 0;margin-top:5px}.cke_about_container p{margin: 0 0 10px;}.cke_about_container .cke_about_logo{height:81px;background-color:#fff;background-image:url('+CKEDITOR.plugins.get("about").path+'dialogs/logo_ckeditor.png);background-position:center; background-repeat:no-repeat;margin-bottom:10px;}.cke_about_container a{cursor:pointer !important;color:#00B2CE !important;text-decoration:underline !important;}</style><div class="cke_about_container"><div class="cke_about_logo"></div><p>CKEditor '+
    +CKEDITOR.version+" (revision "+CKEDITOR.revision+')<br><a href="http://ckeditor.com/">http://ckeditor.com</a></p><p>'+a.help.replace("$1",'<a href="http://docs.ckeditor.com/user">'+a.userGuide+"</a>")+"</p><p>"+a.moreInfo+'<br><a href="http://ckeditor.com/about/license">http://ckeditor.com/about/license</a></p><p>'+a.copy.replace("$1",'<a href="http://cksource.com/">CKSource</a> - Frederico Knabben')+"</p></div>"}]}],buttons:[CKEDITOR.dialog.cancelButton]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/about/dialogs/logo_ckeditor.png b/src/main/webapp/plug-in/ckeditor/plugins/about/dialogs/logo_ckeditor.png
    new file mode 100644
    index 00000000..ad019021
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/about/dialogs/logo_ckeditor.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/clipboard/dialogs/paste.js b/src/main/webapp/plug-in/ckeditor/plugins/clipboard/dialogs/paste.js
    new file mode 100644
    index 00000000..1fd4f80e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/clipboard/dialogs/paste.js
    @@ -0,0 +1,11 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("paste",function(c){function h(a){var b=new CKEDITOR.dom.document(a.document),f=b.getBody(),d=b.getById("cke_actscrpt");d&&d.remove();f.setAttribute("contenteditable",!0);if(CKEDITOR.env.ie&&8>CKEDITOR.env.version)b.getWindow().on("blur",function(){b.$.selection.empty()});b.on("keydown",function(a){var a=a.data,b;switch(a.getKeystroke()){case 27:this.hide();b=1;break;case 9:case CKEDITOR.SHIFT+9:this.changeFocus(1),b=1}b&&a.preventDefault()},this);c.fire("ariaWidget",new CKEDITOR.dom.element(a.frameElement));
    +b.getWindow().getFrame().removeCustomData("pendingFocus")&&f.focus()}var e=c.lang.clipboard;c.on("pasteDialogCommit",function(a){a.data&&c.fire("paste",{type:"auto",dataValue:a.data})},null,null,1E3);return{title:e.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?370:350,minHeight:CKEDITOR.env.quirks?250:245,onShow:function(){this.parts.dialog.$.offsetHeight;this.setupContent();this.parts.title.setHtml(this.customTitle||e.title);this.customTitle=null},onLoad:function(){(CKEDITOR.env.ie7Compat||
    +CKEDITOR.env.ie6Compat)&&"rtl"==c.lang.dir&&this.parts.contents.setStyle("overflow","hidden")},onOk:function(){this.commitContent()},contents:[{id:"general",label:c.lang.common.generalTab,elements:[{type:"html",id:"securityMsg",html:'<div style="white-space:normal;width:340px">'+e.securityMsg+"</div>"},{type:"html",id:"pasteMsg",html:'<div style="white-space:normal;width:340px">'+e.pasteMsg+"</div>"},{type:"html",id:"editing_area",style:"width:100%;height:100%",html:"",focus:function(){var a=this.getInputElement(),
    +b=a.getFrameDocument().getBody();!b||b.isReadOnly()?a.setCustomData("pendingFocus",1):b.focus()},setup:function(){var a=this.getDialog(),b='<html dir="'+c.config.contentsLangDirection+'" lang="'+(c.config.contentsLanguage||c.langCode)+'"><head><style>body{margin:3px;height:95%}</style></head><body><script id="cke_actscrpt" type="text/javascript">window.parent.CKEDITOR.tools.callFunction('+CKEDITOR.tools.addFunction(h,a)+",this);<\/script></body></html>",f=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?
    +"javascript:void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+'})())"':"",d=CKEDITOR.dom.element.createFromHtml('<iframe class="cke_pasteframe" frameborder="0"  allowTransparency="true" src="'+f+'" role="region" aria-label="'+e.pasteArea+'" aria-describedby="'+a.getContentElement("general","pasteMsg").domId+'" aria-multiple="true"></iframe>');d.on("load",function(a){a.removeListener();a=d.getFrameDocument();a.write(b);c.focusManager.add(a.getBody());
    +CKEDITOR.env.air&&h.call(this,a.getWindow().$)},a);d.setCustomData("dialog",a);a=this.getElement();a.setHtml("");a.append(d);if(CKEDITOR.env.ie){var g=CKEDITOR.dom.element.createFromHtml('<span tabindex="-1" style="position:absolute" role="presentation"></span>');g.on("focus",function(){setTimeout(function(){d.$.contentWindow.focus()})});a.append(g);this.focus=function(){g.focus();this.fire("focus")}}this.getInputElement=function(){return d};CKEDITOR.env.ie&&(a.setStyle("display","block"),a.setStyle("height",
    +d.$.offsetHeight+2+"px"))},commit:function(){var a=this.getDialog().getParentEditor(),b=this.getInputElement().getFrameDocument().getBody(),c=b.getBogus(),d;c&&c.remove();d=b.getHtml();setTimeout(function(){a.fire("pasteDialogCommit",d)},0)}}]}]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/colordialog/dialogs/colordialog.js b/src/main/webapp/plug-in/ckeditor/plugins/colordialog/dialogs/colordialog.js
    new file mode 100644
    index 00000000..840cd4bb
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/colordialog/dialogs/colordialog.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("colordialog",function(t){function n(){f.getById(o).removeStyle("background-color");p.getContentElement("picker","selectedColor").setValue("");j&&j.removeAttribute("aria-selected");j=null}function u(a){var a=a.data.getTarget(),b;if("td"==a.getName()&&(b=a.getChild(0).getHtml()))j=a,j.setAttribute("aria-selected",!0),p.getContentElement("picker","selectedColor").setValue(b)}function y(a){for(var a=a.replace(/^#/,""),b=0,c=[];2>=b;b++)c[b]=parseInt(a.substr(2*b,2),16);return"#"+
    +(165<=0.2126*c[0]+0.7152*c[1]+0.0722*c[2]?"000":"fff")}function v(a){!a.name&&(a=new CKEDITOR.event(a));var b=!/mouse/.test(a.name),c=a.data.getTarget(),e;if("td"==c.getName()&&(e=c.getChild(0).getHtml()))q(a),b?g=c:w=c,b&&(c.setStyle("border-color",y(e)),c.setStyle("border-style","dotted")),f.getById(k).setStyle("background-color",e),f.getById(l).setHtml(e)}function q(a){if(a=!/mouse/.test(a.name)&&g){var b=a.getChild(0).getHtml();a.setStyle("border-color",b);a.setStyle("border-style","solid")}!g&&
    +!w&&(f.getById(k).removeStyle("background-color"),f.getById(l).setHtml("&nbsp;"))}function z(a){var b=a.data,c=b.getTarget(),e=b.getKeystroke(),d="rtl"==t.lang.dir;switch(e){case 38:if(a=c.getParent().getPrevious())a=a.getChild([c.getIndex()]),a.focus();b.preventDefault();break;case 40:if(a=c.getParent().getNext())(a=a.getChild([c.getIndex()]))&&1==a.type&&a.focus();b.preventDefault();break;case 32:case 13:u(a);b.preventDefault();break;case d?37:39:if(a=c.getNext())1==a.type&&(a.focus(),b.preventDefault(!0));
    +else if(a=c.getParent().getNext())if((a=a.getChild([0]))&&1==a.type)a.focus(),b.preventDefault(!0);break;case d?39:37:if(a=c.getPrevious())a.focus(),b.preventDefault(!0);else if(a=c.getParent().getPrevious())a=a.getLast(),a.focus(),b.preventDefault(!0)}}var r=CKEDITOR.dom.element,f=CKEDITOR.document,h=t.lang.colordialog,p,x={type:"html",html:"&nbsp;"},j,g,w,m=function(a){return CKEDITOR.tools.getNextId()+"_"+a},k=m("hicolor"),l=m("hicolortext"),o=m("selhicolor"),i;(function(){function a(a,d){for(var s=
    +a;s<a+3;s++){var e=new r(i.$.insertRow(-1));e.setAttribute("role","row");for(var f=d;f<d+3;f++)for(var g=0;6>g;g++)b(e.$,"#"+c[f]+c[g]+c[s])}}function b(a,c){var b=new r(a.insertCell(-1));b.setAttribute("class","ColorCell");b.setAttribute("tabIndex",-1);b.setAttribute("role","gridcell");b.on("keydown",z);b.on("click",u);b.on("focus",v);b.on("blur",q);b.setStyle("background-color",c);b.setStyle("border","1px solid "+c);b.setStyle("width","14px");b.setStyle("height","14px");var d=m("color_table_cell");
    +b.setAttribute("aria-labelledby",d);b.append(CKEDITOR.dom.element.createFromHtml('<span id="'+d+'" class="cke_voice_label">'+c+"</span>",CKEDITOR.document))}i=CKEDITOR.dom.element.createFromHtml('<table tabIndex="-1" aria-label="'+h.options+'" role="grid" style="border-collapse:separate;" cellspacing="0"><caption class="cke_voice_label">'+h.options+'</caption><tbody role="presentation"></tbody></table>');i.on("mouseover",v);i.on("mouseout",q);var c="00 33 66 99 cc ff".split(" ");a(0,0);a(3,0);a(0,
    +3);a(3,3);var e=new r(i.$.insertRow(-1));e.setAttribute("role","row");for(var d=0;6>d;d++)b(e.$,"#"+c[d]+c[d]+c[d]);for(d=0;12>d;d++)b(e.$,"#000000")})();return{title:h.title,minWidth:360,minHeight:220,onLoad:function(){p=this},onHide:function(){n();var a=g.getChild(0).getHtml();g.setStyle("border-color",a);g.setStyle("border-style","solid");f.getById(k).removeStyle("background-color");f.getById(l).setHtml("&nbsp;");g=null},contents:[{id:"picker",label:h.title,accessKey:"I",elements:[{type:"hbox",
    +padding:0,widths:["70%","10%","30%"],children:[{type:"html",html:"<div></div>",onLoad:function(){CKEDITOR.document.getById(this.domId).append(i)},focus:function(){(g||this.getElement().getElementsByTag("td").getItem(0)).focus()}},x,{type:"vbox",padding:0,widths:["70%","5%","25%"],children:[{type:"html",html:"<span>"+h.highlight+'</span>\t\t\t\t\t\t\t\t\t\t\t\t<div id="'+k+'" style="border: 1px solid; height: 74px; width: 74px;"></div>\t\t\t\t\t\t\t\t\t\t\t\t<div id="'+l+'">&nbsp;</div><span>'+h.selected+
    +'</span>\t\t\t\t\t\t\t\t\t\t\t\t<div id="'+o+'" style="border: 1px solid; height: 20px; width: 74px;"></div>'},{type:"text",label:h.selected,labelStyle:"display:none",id:"selectedColor",style:"width: 74px",onChange:function(){try{f.getById(o).setStyle("background-color",this.getValue())}catch(a){n()}}},x,{type:"button",id:"clear",style:"margin-top: 5px",label:h.clear,onClick:n}]}]}]}]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/dialog/dialogDefinition.js b/src/main/webapp/plug-in/ckeditor/plugins/dialog/dialogDefinition.js
    new file mode 100644
    index 00000000..2cb5d24b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/dialog/dialogDefinition.js
    @@ -0,0 +1,4 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/div/dialogs/div.js b/src/main/webapp/plug-in/ckeditor/plugins/div/dialogs/div.js
    new file mode 100644
    index 00000000..963e5d86
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/div/dialogs/div.js
    @@ -0,0 +1,9 @@
    +锘(function(){function p(a,k,o){if(!k.is||!k.getCustomData("block_processed"))k.is&&CKEDITOR.dom.element.setMarker(o,k,"block_processed",!0),a.push(k)}function n(a,k){function o(){this.foreach(function(d){if(/^(?!vbox|hbox)/.test(d.type)&&(d.setup||(d.setup=function(c){d.setValue(c.getAttribute(d.id)||"",1)}),!d.commit))d.commit=function(c){var a=this.getValue();"dir"==d.id&&c.getComputedStyle("direction")==a||(a?c.setAttribute(d.id,a):c.removeAttribute(d.id))}})}var n=function(){var d=CKEDITOR.tools.extend({},
    +CKEDITOR.dtd.$blockLimit);a.config.div_wrapTable&&(delete d.td,delete d.th);return d}(),q=CKEDITOR.dtd.div,l={},m=[];return{title:a.lang.div.title,minWidth:400,minHeight:165,contents:[{id:"info",label:a.lang.common.generalTab,title:a.lang.common.generalTab,elements:[{type:"hbox",widths:["50%","50%"],children:[{id:"elementStyle",type:"select",style:"width: 100%;",label:a.lang.div.styleSelectLabel,"default":"",items:[[a.lang.common.notSet,""]],onChange:function(){var d=["info:elementStyle","info:class",
    +"advanced:dir","advanced:style"],c=this.getDialog(),h=c._element&&c._element.clone()||new CKEDITOR.dom.element("div",a.document);this.commit(h,!0);for(var d=[].concat(d),b=d.length,i,e=0;e<b;e++)(i=c.getContentElement.apply(c,d[e].split(":")))&&i.setup&&i.setup(h,!0)},setup:function(a){for(var c in l)l[c].checkElementRemovable(a,!0)&&this.setValue(c,1)},commit:function(a){var c;(c=this.getValue())?l[c].applyToObject(a):a.removeAttribute("style")}},{id:"class",type:"text",requiredContent:"div(cke-xyz)",
    +label:a.lang.common.cssClass,"default":""}]}]},{id:"advanced",label:a.lang.common.advancedTab,title:a.lang.common.advancedTab,elements:[{type:"vbox",padding:1,children:[{type:"hbox",widths:["50%","50%"],children:[{type:"text",id:"id",requiredContent:"div[id]",label:a.lang.common.id,"default":""},{type:"text",id:"lang",requiredContent:"div[lang]",label:a.lang.common.langCode,"default":""}]},{type:"hbox",children:[{type:"text",id:"style",requiredContent:"div{cke-xyz}",style:"width: 100%;",label:a.lang.common.cssStyle,
    +"default":"",commit:function(a){a.setAttribute("style",this.getValue())}}]},{type:"hbox",children:[{type:"text",id:"title",requiredContent:"div[title]",style:"width: 100%;",label:a.lang.common.advisoryTitle,"default":""}]},{type:"select",id:"dir",requiredContent:"div[dir]",style:"width: 100%;",label:a.lang.common.langDir,"default":"",items:[[a.lang.common.notSet,""],[a.lang.common.langDirLtr,"ltr"],[a.lang.common.langDirRtl,"rtl"]]}]}]}],onLoad:function(){o.call(this);var d=this,c=this.getContentElement("info",
    +"elementStyle");a.getStylesSet(function(h){var b,i;if(h)for(var e=0;e<h.length;e++)i=h[e],i.element&&"div"==i.element&&(b=i.name,l[b]=i=new CKEDITOR.style(i),a.filter.check(i)&&(c.items.push([b,b]),c.add(b,b)));c[1<c.items.length?"enable":"disable"]();setTimeout(function(){d._element&&c.setup(d._element)},0)})},onShow:function(){"editdiv"==k&&this.setupContent(this._element=CKEDITOR.plugins.div.getSurroundDiv(a))},onOk:function(){if("editdiv"==k)m=[this._element];else{var d=[],c={},h=[],b,i=a.getSelection(),
    +e=i.getRanges(),l=i.createBookmarks(),g,j;for(g=0;g<e.length;g++)for(j=e[g].createIterator();b=j.getNextParagraph();)if(b.getName()in n){var f=b.getChildren();for(b=0;b<f.count();b++)p(h,f.getItem(b),c)}else{for(;!q[b.getName()]&&!b.equals(e[g].root);)b=b.getParent();p(h,b,c)}CKEDITOR.dom.element.clearAllMarkers(c);e=[];g=null;for(j=0;j<h.length;j++)b=h[j],f=a.elementPath(b).blockLimit,a.config.div_wrapTable&&f.is(["td","th"])&&(f=a.elementPath(f.getParent()).blockLimit),f.equals(g)||(g=f,e.push([])),
    +e[e.length-1].push(b);for(g=0;g<e.length;g++){f=e[g][0];h=f.getParent();for(b=1;b<e[g].length;b++)h=h.getCommonAncestor(e[g][b]);j=new CKEDITOR.dom.element("div",a.document);for(b=0;b<e[g].length;b++){for(f=e[g][b];!f.getParent().equals(h);)f=f.getParent();e[g][b]=f}for(b=0;b<e[g].length;b++)if(f=e[g][b],!f.getCustomData||!f.getCustomData("block_processed"))f.is&&CKEDITOR.dom.element.setMarker(c,f,"block_processed",!0),b||j.insertBefore(f),j.append(f);CKEDITOR.dom.element.clearAllMarkers(c);d.push(j)}i.selectBookmarks(l);
    +m=d}d=m.length;for(c=0;c<d;c++)this.commitContent(m[c]),!m[c].getAttribute("style")&&m[c].removeAttribute("style");this.hide()},onHide:function(){"editdiv"==k&&this._element.removeCustomData("elementStyle");delete this._element}}}CKEDITOR.dialog.add("creatediv",function(a){return n(a,"creatediv")});CKEDITOR.dialog.add("editdiv",function(a){return n(a,"editdiv")})})();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/fakeobjects/images/spacer.gif b/src/main/webapp/plug-in/ckeditor/plugins/fakeobjects/images/spacer.gif
    new file mode 100644
    index 00000000..5bfd67a2
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/fakeobjects/images/spacer.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/find/dialogs/find.js b/src/main/webapp/plug-in/ckeditor/plugins/find/dialogs/find.js
    new file mode 100644
    index 00000000..31a8ab04
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/find/dialogs/find.js
    @@ -0,0 +1,24 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +(function(){function y(c){return c.type==CKEDITOR.NODE_TEXT&&0<c.getLength()&&(!o||!c.isReadOnly())}function s(c){return!(c.type==CKEDITOR.NODE_ELEMENT&&c.isBlockBoundary(CKEDITOR.tools.extend({},CKEDITOR.dtd.$empty,CKEDITOR.dtd.$nonEditable)))}var o,t=function(){return{textNode:this.textNode,offset:this.offset,character:this.textNode?this.textNode.getText().charAt(this.offset):null,hitMatchBoundary:this._.matchBoundary}},u=["find","replace"],p=[["txtFindFind","txtFindReplace"],["txtFindCaseChk",
    +"txtReplaceCaseChk"],["txtFindWordChk","txtReplaceWordChk"],["txtFindCyclic","txtReplaceCyclic"]],n=function(c,g){function n(a,b){var d=c.createRange();d.setStart(a.textNode,b?a.offset:a.offset+1);d.setEndAt(c.editable(),CKEDITOR.POSITION_BEFORE_END);return d}function q(a){var b=c.getSelection(),d=c.editable();b&&!a?(a=b.getRanges()[0].clone(),a.collapse(!0)):(a=c.createRange(),a.setStartAt(d,CKEDITOR.POSITION_AFTER_START));a.setEndAt(d,CKEDITOR.POSITION_BEFORE_END);return a}var v=new CKEDITOR.style(CKEDITOR.tools.extend({attributes:{"data-cke-highlight":1},
    +fullMatch:1,ignoreReadonly:1,childRule:function(){return 0}},c.config.find_highlight,!0)),l=function(a,b){var d=this,c=new CKEDITOR.dom.walker(a);c.guard=b?s:function(a){!s(a)&&(d._.matchBoundary=!0)};c.evaluator=y;c.breakOnFalse=1;a.startContainer.type==CKEDITOR.NODE_TEXT&&(this.textNode=a.startContainer,this.offset=a.startOffset-1);this._={matchWord:b,walker:c,matchBoundary:!1}};l.prototype={next:function(){return this.move()},back:function(){return this.move(!0)},move:function(a){var b=this.textNode;
    +if(null===b)return t.call(this);this._.matchBoundary=!1;if(b&&a&&0<this.offset)this.offset--;else if(b&&this.offset<b.getLength()-1)this.offset++;else{for(b=null;!b&&!(b=this._.walker[a?"previous":"next"].call(this._.walker),this._.matchWord&&!b||this._.walker._.end););this.offset=(this.textNode=b)?a?b.getLength()-1:0:0}return t.call(this)}};var r=function(a,b){this._={walker:a,cursors:[],rangeLength:b,highlightRange:null,isMatched:0}};r.prototype={toDomRange:function(){var a=c.createRange(),b=this._.cursors;
    +if(1>b.length){var d=this._.walker.textNode;if(d)a.setStartAfter(d);else return null}else d=b[0],b=b[b.length-1],a.setStart(d.textNode,d.offset),a.setEnd(b.textNode,b.offset+1);return a},updateFromDomRange:function(a){var b=new l(a);this._.cursors=[];do a=b.next(),a.character&&this._.cursors.push(a);while(a.character);this._.rangeLength=this._.cursors.length},setMatched:function(){this._.isMatched=!0},clearMatched:function(){this._.isMatched=!1},isMatched:function(){return this._.isMatched},highlight:function(){if(!(1>
    +this._.cursors.length)){this._.highlightRange&&this.removeHighlight();var a=this.toDomRange(),b=a.createBookmark();v.applyToRange(a);a.moveToBookmark(b);this._.highlightRange=a;b=a.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent());b.scrollIntoView();this.updateFromDomRange(a)}},removeHighlight:function(){if(this._.highlightRange){var a=this._.highlightRange.createBookmark();v.removeFromRange(this._.highlightRange);this._.highlightRange.moveToBookmark(a);this.updateFromDomRange(this._.highlightRange);
    +this._.highlightRange=null}},isReadOnly:function(){return!this._.highlightRange?0:this._.highlightRange.startContainer.isReadOnly()},moveBack:function(){var a=this._.walker.back(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.unshift(a);b.length>this._.rangeLength&&b.pop();return a},moveNext:function(){var a=this._.walker.next(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.push(a);b.length>this._.rangeLength&&b.shift();return a},getEndCharacter:function(){var a=this._.cursors;
    +return 1>a.length?null:a[a.length-1].character},getNextCharacterRange:function(a){var b,d;d=this._.cursors;d=(b=d[d.length-1])&&b.textNode?new l(n(b)):this._.walker;return new r(d,a)},getCursors:function(){return this._.cursors}};var w=function(a,b){var d=[-1];b&&(a=a.toLowerCase());for(var c=0;c<a.length;c++)for(d.push(d[c]+1);0<d[c+1]&&a.charAt(c)!=a.charAt(d[c+1]-1);)d[c+1]=d[d[c+1]-1]+1;this._={overlap:d,state:0,ignoreCase:!!b,pattern:a}};w.prototype={feedCharacter:function(a){for(this._.ignoreCase&&
    +(a=a.toLowerCase());;){if(a==this._.pattern.charAt(this._.state))return this._.state++,this._.state==this._.pattern.length?(this._.state=0,2):1;if(this._.state)this._.state=this._.overlap[this._.state];else return 0}return null},reset:function(){this._.state=0}};var z=/[.,"'?!;: \u0085\u00a0\u1680\u280e\u2028\u2029\u202f\u205f\u3000]/,x=function(a){if(!a)return!0;var b=a.charCodeAt(0);return 9<=b&&13>=b||8192<=b&&8202>=b||z.test(a)},e={searchRange:null,matchRange:null,find:function(a,b,d,f,e,A){this.matchRange?
    +(this.matchRange.removeHighlight(),this.matchRange=this.matchRange.getNextCharacterRange(a.length)):this.matchRange=new r(new l(this.searchRange),a.length);for(var i=new w(a,!b),j=0,k="%";null!==k;){for(this.matchRange.moveNext();k=this.matchRange.getEndCharacter();){j=i.feedCharacter(k);if(2==j)break;this.matchRange.moveNext().hitMatchBoundary&&i.reset()}if(2==j){if(d){var h=this.matchRange.getCursors(),m=h[h.length-1],h=h[0],g=c.createRange();g.setStartAt(c.editable(),CKEDITOR.POSITION_AFTER_START);
    +g.setEnd(h.textNode,h.offset);h=g;m=n(m);h.trim();m.trim();h=new l(h,!0);m=new l(m,!0);if(!x(h.back().character)||!x(m.next().character))continue}this.matchRange.setMatched();!1!==e&&this.matchRange.highlight();return!0}}this.matchRange.clearMatched();this.matchRange.removeHighlight();return f&&!A?(this.searchRange=q(1),this.matchRange=null,arguments.callee.apply(this,Array.prototype.slice.call(arguments).concat([!0]))):!1},replaceCounter:0,replace:function(a,b,d,f,e,g,i){o=1;a=0;if(this.matchRange&&
    +this.matchRange.isMatched()&&!this.matchRange._.isReplaced&&!this.matchRange.isReadOnly()){this.matchRange.removeHighlight();b=this.matchRange.toDomRange();d=c.document.createText(d);if(!i){var j=c.getSelection();j.selectRanges([b]);c.fire("saveSnapshot")}b.deleteContents();b.insertNode(d);i||(j.selectRanges([b]),c.fire("saveSnapshot"));this.matchRange.updateFromDomRange(b);i||this.matchRange.highlight();this.matchRange._.isReplaced=!0;this.replaceCounter++;a=1}else a=this.find(b,f,e,g,!i);o=0;return a}},
    +f=c.lang.find;return{title:f.title,resizable:CKEDITOR.DIALOG_RESIZE_NONE,minWidth:350,minHeight:170,buttons:[CKEDITOR.dialog.cancelButton(c,{label:c.lang.common.close})],contents:[{id:"find",label:f.find,title:f.find,accessKey:"",elements:[{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtFindFind",label:f.findWhat,isChanged:!1,labelLayout:"horizontal",accessKey:"F"},{type:"button",id:"btnFind",align:"left",style:"width:100%",label:f.find,onClick:function(){var a=this.getDialog();
    +e.find(a.getValueOf("find","txtFindFind"),a.getValueOf("find","txtFindCaseChk"),a.getValueOf("find","txtFindWordChk"),a.getValueOf("find","txtFindCyclic"))||alert(f.notFoundMsg)}}]},{type:"fieldset",label:CKEDITOR.tools.htmlEncode(f.findOptions),style:"margin-top:29px",children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"txtFindCaseChk",isChanged:!1,label:f.matchCase},{type:"checkbox",id:"txtFindWordChk",isChanged:!1,label:f.matchWord},{type:"checkbox",id:"txtFindCyclic",isChanged:!1,"default":!0,
    +label:f.matchCyclic}]}]}]},{id:"replace",label:f.replace,accessKey:"M",elements:[{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtFindReplace",label:f.findWhat,isChanged:!1,labelLayout:"horizontal",accessKey:"F"},{type:"button",id:"btnFindReplace",align:"left",style:"width:100%",label:f.replace,onClick:function(){var a=this.getDialog();e.replace(a,a.getValueOf("replace","txtFindReplace"),a.getValueOf("replace","txtReplace"),a.getValueOf("replace","txtReplaceCaseChk"),a.getValueOf("replace",
    +"txtReplaceWordChk"),a.getValueOf("replace","txtReplaceCyclic"))||alert(f.notFoundMsg)}}]},{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtReplace",label:f.replaceWith,isChanged:!1,labelLayout:"horizontal",accessKey:"R"},{type:"button",id:"btnReplaceAll",align:"left",style:"width:100%",label:f.replaceAll,isChanged:!1,onClick:function(){var a=this.getDialog();e.replaceCounter=0;e.searchRange=q(1);e.matchRange&&(e.matchRange.removeHighlight(),e.matchRange=null);for(c.fire("saveSnapshot");e.replace(a,
    +a.getValueOf("replace","txtFindReplace"),a.getValueOf("replace","txtReplace"),a.getValueOf("replace","txtReplaceCaseChk"),a.getValueOf("replace","txtReplaceWordChk"),!1,!0););e.replaceCounter?(alert(f.replaceSuccessMsg.replace(/%1/,e.replaceCounter)),c.fire("saveSnapshot")):alert(f.notFoundMsg)}}]},{type:"fieldset",label:CKEDITOR.tools.htmlEncode(f.findOptions),children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"txtReplaceCaseChk",isChanged:!1,label:f.matchCase},{type:"checkbox",id:"txtReplaceWordChk",
    +isChanged:!1,label:f.matchWord},{type:"checkbox",id:"txtReplaceCyclic",isChanged:!1,"default":!0,label:f.matchCyclic}]}]}]}],onLoad:function(){var a=this,b,c=0;this.on("hide",function(){c=0});this.on("show",function(){c=1});this.selectPage=CKEDITOR.tools.override(this.selectPage,function(f){return function(e){f.call(a,e);var g=a._.tabs[e],i;i="find"===e?"txtFindWordChk":"txtReplaceWordChk";b=a.getContentElement(e,"find"===e?"txtFindFind":"txtFindReplace");a.getContentElement(e,i);g.initialized||(CKEDITOR.document.getById(b._.inputId),
    +g.initialized=!0);if(c){var j,e="find"===e?1:0,g=1-e,k,h=p.length;for(k=0;k<h;k++)i=this.getContentElement(u[e],p[k][e]),j=this.getContentElement(u[g],p[k][g]),j.setValue(i.getValue())}}})},onShow:function(){e.searchRange=q();var a=this.getParentEditor().getSelection().getSelectedText(),b=this.getContentElement(g,"find"==g?"txtFindFind":"txtFindReplace");b.setValue(a);b.select();this.selectPage(g);this[("find"==g&&this._.editor.readOnly?"hide":"show")+"Page"]("replace")},onHide:function(){var a;e.matchRange&&
    +e.matchRange.isMatched()&&(e.matchRange.removeHighlight(),c.focus(),(a=e.matchRange.toDomRange())&&c.getSelection().selectRanges([a]));delete e.matchRange},onFocus:function(){return"replace"==g?this.getContentElement("replace","txtFindReplace"):this.getContentElement("find","txtFindFind")}}};CKEDITOR.dialog.add("find",function(c){return n(c,"find")});CKEDITOR.dialog.add("replace",function(c){return n(c,"replace")})})();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/flash/dialogs/flash.js b/src/main/webapp/plug-in/ckeditor/plugins/flash/dialogs/flash.js
    new file mode 100644
    index 00000000..01dac250
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/flash/dialogs/flash.js
    @@ -0,0 +1,24 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +(function(){function b(a,b,c){var k=n[this.id];if(k)for(var f=this instanceof CKEDITOR.ui.dialog.checkbox,e=0;e<k.length;e++){var d=k[e];switch(d.type){case g:if(!a)continue;if(null!==a.getAttribute(d.name)){a=a.getAttribute(d.name);f?this.setValue("true"==a.toLowerCase()):this.setValue(a);return}f&&this.setValue(!!d["default"]);break;case o:if(!a)continue;if(d.name in c){a=c[d.name];f?this.setValue("true"==a.toLowerCase()):this.setValue(a);return}f&&this.setValue(!!d["default"]);break;case i:if(!b)continue;
    +if(b.getAttribute(d.name)){a=b.getAttribute(d.name);f?this.setValue("true"==a.toLowerCase()):this.setValue(a);return}f&&this.setValue(!!d["default"])}}}function c(a,b,c){var k=n[this.id];if(k)for(var f=""===this.getValue(),e=this instanceof CKEDITOR.ui.dialog.checkbox,d=0;d<k.length;d++){var h=k[d];switch(h.type){case g:if(!a||"data"==h.name&&b&&!a.hasAttribute("data"))continue;var l=this.getValue();f||e&&l===h["default"]?a.removeAttribute(h.name):a.setAttribute(h.name,l);break;case o:if(!a)continue;
    +l=this.getValue();if(f||e&&l===h["default"])h.name in c&&c[h.name].remove();else if(h.name in c)c[h.name].setAttribute("value",l);else{var p=CKEDITOR.dom.element.createFromHtml("<cke:param></cke:param>",a.getDocument());p.setAttributes({name:h.name,value:l});1>a.getChildCount()?p.appendTo(a):p.insertBefore(a.getFirst())}break;case i:if(!b)continue;l=this.getValue();f||e&&l===h["default"]?b.removeAttribute(h.name):b.setAttribute(h.name,l)}}}for(var g=1,o=2,i=4,n={id:[{type:g,name:"id"}],classid:[{type:g,
    +name:"classid"}],codebase:[{type:g,name:"codebase"}],pluginspage:[{type:i,name:"pluginspage"}],src:[{type:o,name:"movie"},{type:i,name:"src"},{type:g,name:"data"}],name:[{type:i,name:"name"}],align:[{type:g,name:"align"}],"class":[{type:g,name:"class"},{type:i,name:"class"}],width:[{type:g,name:"width"},{type:i,name:"width"}],height:[{type:g,name:"height"},{type:i,name:"height"}],hSpace:[{type:g,name:"hSpace"},{type:i,name:"hSpace"}],vSpace:[{type:g,name:"vSpace"},{type:i,name:"vSpace"}],style:[{type:g,
    +name:"style"},{type:i,name:"style"}],type:[{type:i,name:"type"}]},m="play loop menu quality scale salign wmode bgcolor base flashvars allowScriptAccess allowFullScreen".split(" "),j=0;j<m.length;j++)n[m[j]]=[{type:i,name:m[j]},{type:o,name:m[j]}];m=["allowFullScreen","play","loop","menu"];for(j=0;j<m.length;j++)n[m[j]][0]["default"]=n[m[j]][1]["default"]=!0;CKEDITOR.dialog.add("flash",function(a){var g=!a.config.flashEmbedTagOnly,i=a.config.flashAddEmbedTag||a.config.flashEmbedTagOnly,k,f="<div>"+
    +CKEDITOR.tools.htmlEncode(a.lang.common.preview)+'<br><div id="cke_FlashPreviewLoader'+CKEDITOR.tools.getNextNumber()+'" style="display:none"><div class="loading">&nbsp;</div></div><div id="cke_FlashPreviewBox'+CKEDITOR.tools.getNextNumber()+'" class="FlashPreviewBox"></div></div>';return{title:a.lang.flash.title,minWidth:420,minHeight:310,onShow:function(){this.fakeImage=this.objectNode=this.embedNode=null;k=new CKEDITOR.dom.element("embed",a.document);var e=this.getSelectedElement();if(e&&e.data("cke-real-element-type")&&
    +"flash"==e.data("cke-real-element-type")){this.fakeImage=e;var d=a.restoreRealElement(e),h=null,b=null,c={};if("cke:object"==d.getName()){h=d;d=h.getElementsByTag("embed","cke");0<d.count()&&(b=d.getItem(0));for(var d=h.getElementsByTag("param","cke"),g=0,i=d.count();g<i;g++){var f=d.getItem(g),j=f.getAttribute("name"),f=f.getAttribute("value");c[j]=f}}else"cke:embed"==d.getName()&&(b=d);this.objectNode=h;this.embedNode=b;this.setupContent(h,b,c,e)}},onOk:function(){var e=null,d=null,b=null;if(this.fakeImage)e=
    +this.objectNode,d=this.embedNode;else if(g&&(e=CKEDITOR.dom.element.createFromHtml("<cke:object></cke:object>",a.document),e.setAttributes({classid:"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000",codebase:"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"})),i)d=CKEDITOR.dom.element.createFromHtml("<cke:embed></cke:embed>",a.document),d.setAttributes({type:"application/x-shockwave-flash",pluginspage:"http://www.macromedia.com/go/getflashplayer"}),e&&d.appendTo(e);
    +if(e)for(var b={},c=e.getElementsByTag("param","cke"),f=0,j=c.count();f<j;f++)b[c.getItem(f).getAttribute("name")]=c.getItem(f);c={};f={};this.commitContent(e,d,b,c,f);e=a.createFakeElement(e||d,"cke_flash","flash",!0);e.setAttributes(f);e.setStyles(c);this.fakeImage?(e.replace(this.fakeImage),a.getSelection().selectElement(e)):a.insertElement(e)},onHide:function(){this.preview&&this.preview.setHtml("")},contents:[{id:"info",label:a.lang.common.generalTab,accessKey:"I",elements:[{type:"vbox",padding:0,
    +children:[{type:"hbox",widths:["280px","110px"],align:"right",children:[{id:"src",type:"text",label:a.lang.common.url,required:!0,validate:CKEDITOR.dialog.validate.notEmpty(a.lang.flash.validateSrc),setup:b,commit:c,onLoad:function(){var a=this.getDialog(),b=function(b){k.setAttribute("src",b);a.preview.setHtml('<embed height="100%" width="100%" src="'+CKEDITOR.tools.htmlEncode(k.getAttribute("src"))+'" type="application/x-shockwave-flash"></embed>')};a.preview=a.getContentElement("info","preview").getElement().getChild(3);
    +this.on("change",function(a){a.data&&a.data.value&&b(a.data.value)});this.getInputElement().on("change",function(){b(this.getValue())},this)}},{type:"button",id:"browse",filebrowser:"info:src",hidden:!0,style:"display:inline-block;margin-top:10px;",label:a.lang.common.browseServer}]}]},{type:"hbox",widths:["25%","25%","25%","25%","25%"],children:[{type:"text",id:"width",requiredContent:"embed[width]",style:"width:95px",label:a.lang.common.width,validate:CKEDITOR.dialog.validate.htmlLength(a.lang.common.invalidHtmlLength.replace("%1",
    +a.lang.common.width)),setup:b,commit:c},{type:"text",id:"height",requiredContent:"embed[height]",style:"width:95px",label:a.lang.common.height,validate:CKEDITOR.dialog.validate.htmlLength(a.lang.common.invalidHtmlLength.replace("%1",a.lang.common.height)),setup:b,commit:c},{type:"text",id:"hSpace",requiredContent:"embed[hspace]",style:"width:95px",label:a.lang.flash.hSpace,validate:CKEDITOR.dialog.validate.integer(a.lang.flash.validateHSpace),setup:b,commit:c},{type:"text",id:"vSpace",requiredContent:"embed[vspace]",
    +style:"width:95px",label:a.lang.flash.vSpace,validate:CKEDITOR.dialog.validate.integer(a.lang.flash.validateVSpace),setup:b,commit:c}]},{type:"vbox",children:[{type:"html",id:"preview",style:"width:95%;",html:f}]}]},{id:"Upload",hidden:!0,filebrowser:"uploadButton",label:a.lang.common.upload,elements:[{type:"file",id:"upload",label:a.lang.common.upload,size:38},{type:"fileButton",id:"uploadButton",label:a.lang.common.uploadSubmit,filebrowser:"info:src","for":["Upload","upload"]}]},{id:"properties",
    +label:a.lang.flash.propertiesTab,elements:[{type:"hbox",widths:["50%","50%"],children:[{id:"scale",type:"select",requiredContent:"embed[scale]",label:a.lang.flash.scale,"default":"",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.flash.scaleAll,"showall"],[a.lang.flash.scaleNoBorder,"noborder"],[a.lang.flash.scaleFit,"exactfit"]],setup:b,commit:c},{id:"allowScriptAccess",type:"select",requiredContent:"embed[allowscriptaccess]",label:a.lang.flash.access,"default":"",style:"width : 100%;",
    +items:[[a.lang.common.notSet,""],[a.lang.flash.accessAlways,"always"],[a.lang.flash.accessSameDomain,"samedomain"],[a.lang.flash.accessNever,"never"]],setup:b,commit:c}]},{type:"hbox",widths:["50%","50%"],children:[{id:"wmode",type:"select",requiredContent:"embed[wmode]",label:a.lang.flash.windowMode,"default":"",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.flash.windowModeWindow,"window"],[a.lang.flash.windowModeOpaque,"opaque"],[a.lang.flash.windowModeTransparent,"transparent"]],
    +setup:b,commit:c},{id:"quality",type:"select",requiredContent:"embed[quality]",label:a.lang.flash.quality,"default":"high",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.flash.qualityBest,"best"],[a.lang.flash.qualityHigh,"high"],[a.lang.flash.qualityAutoHigh,"autohigh"],[a.lang.flash.qualityMedium,"medium"],[a.lang.flash.qualityAutoLow,"autolow"],[a.lang.flash.qualityLow,"low"]],setup:b,commit:c}]},{type:"hbox",widths:["50%","50%"],children:[{id:"align",type:"select",requiredContent:"object[align]",
    +label:a.lang.common.align,"default":"",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.common.alignLeft,"left"],[a.lang.flash.alignAbsBottom,"absBottom"],[a.lang.flash.alignAbsMiddle,"absMiddle"],[a.lang.flash.alignBaseline,"baseline"],[a.lang.common.alignBottom,"bottom"],[a.lang.common.alignMiddle,"middle"],[a.lang.common.alignRight,"right"],[a.lang.flash.alignTextTop,"textTop"],[a.lang.common.alignTop,"top"]],setup:b,commit:function(a,b,f,g,i){var j=this.getValue();c.apply(this,arguments);
    +j&&(i.align=j)}},{type:"html",html:"<div></div>"}]},{type:"fieldset",label:CKEDITOR.tools.htmlEncode(a.lang.flash.flashvars),children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"menu",label:a.lang.flash.chkMenu,"default":!0,setup:b,commit:c},{type:"checkbox",id:"play",label:a.lang.flash.chkPlay,"default":!0,setup:b,commit:c},{type:"checkbox",id:"loop",label:a.lang.flash.chkLoop,"default":!0,setup:b,commit:c},{type:"checkbox",id:"allowFullScreen",label:a.lang.flash.chkFull,"default":!0,
    +setup:b,commit:c}]}]}]},{id:"advanced",label:a.lang.common.advancedTab,elements:[{type:"hbox",children:[{type:"text",id:"id",requiredContent:"object[id]",label:a.lang.common.id,setup:b,commit:c}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",id:"bgcolor",requiredContent:"embed[bgcolor]",label:a.lang.flash.bgcolor,setup:b,commit:c},{type:"text",id:"class",requiredContent:"embed(cke-xyz)",label:a.lang.common.cssClass,setup:b,commit:c}]},{type:"text",id:"style",requiredContent:"embed{cke-xyz}",
    +validate:CKEDITOR.dialog.validate.inlineStyle(a.lang.common.invalidInlineStyle),label:a.lang.common.cssStyle,setup:b,commit:c}]}]}})})();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/flash/images/placeholder.png b/src/main/webapp/plug-in/ckeditor/plugins/flash/images/placeholder.png
    new file mode 100644
    index 00000000..0bc6caa7
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/flash/images/placeholder.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/button.js b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/button.js
    new file mode 100644
    index 00000000..f4c64656
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/button.js
    @@ -0,0 +1,8 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("button",function(b){function d(a){var b=this.getValue();b?(a.attributes[this.id]=b,"name"==this.id&&(a.attributes["data-cke-saved-name"]=b)):(delete a.attributes[this.id],"name"==this.id&&delete a.attributes["data-cke-saved-name"])}return{title:b.lang.forms.button.title,minWidth:350,minHeight:150,onShow:function(){delete this.button;var a=this.getParentEditor().getSelection().getSelectedElement();a&&a.is("input")&&a.getAttribute("type")in{button:1,reset:1,submit:1}&&(this.button=
    +a,this.setupContent(a))},onOk:function(){var a=this.getParentEditor(),b=this.button,d=!b,c=b?CKEDITOR.htmlParser.fragment.fromHtml(b.getOuterHtml()).children[0]:new CKEDITOR.htmlParser.element("input");this.commitContent(c);var e=new CKEDITOR.htmlParser.basicWriter;c.writeHtml(e);c=CKEDITOR.dom.element.createFromHtml(e.getHtml(),a.document);d?a.insertElement(c):(c.replace(b),a.getSelection().selectElement(c))},contents:[{id:"info",label:b.lang.forms.button.title,title:b.lang.forms.button.title,elements:[{id:"name",
    +type:"text",label:b.lang.common.name,"default":"",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:d},{id:"value",type:"text",label:b.lang.forms.button.text,accessKey:"V","default":"",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:d},{id:"type",type:"select",label:b.lang.forms.button.type,"default":"button",accessKey:"T",items:[[b.lang.forms.button.typeBtn,"button"],[b.lang.forms.button.typeSbm,"submit"],[b.lang.forms.button.typeRst,
    +"reset"]],setup:function(a){this.setValue(a.getAttribute("type")||"")},commit:d}]}]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/checkbox.js b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/checkbox.js
    new file mode 100644
    index 00000000..40ea00aa
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/checkbox.js
    @@ -0,0 +1,8 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("checkbox",function(d){return{title:d.lang.forms.checkboxAndRadio.checkboxTitle,minWidth:350,minHeight:140,onShow:function(){delete this.checkbox;var a=this.getParentEditor().getSelection().getSelectedElement();a&&"checkbox"==a.getAttribute("type")&&(this.checkbox=a,this.setupContent(a))},onOk:function(){var a,b=this.checkbox;b||(a=this.getParentEditor(),b=a.document.createElement("input"),b.setAttribute("type","checkbox"),a.insertElement(b));this.commitContent({element:b})},contents:[{id:"info",
    +label:d.lang.forms.checkboxAndRadio.checkboxTitle,title:d.lang.forms.checkboxAndRadio.checkboxTitle,startupFocus:"txtName",elements:[{id:"txtName",type:"text",label:d.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){a=a.element;this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"txtValue",type:"text",label:d.lang.forms.checkboxAndRadio.value,
    +"default":"",accessKey:"V",setup:function(a){a=a.getAttribute("value");this.setValue(CKEDITOR.env.ie&&"on"==a?"":a)},commit:function(a){var b=a.element,c=this.getValue();c&&!(CKEDITOR.env.ie&&"on"==c)?b.setAttribute("value",c):CKEDITOR.env.ie?(c=new CKEDITOR.dom.element("input",b.getDocument()),b.copyAttributes(c,{value:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c):b.removeAttribute("value")}},{id:"cmbSelected",type:"checkbox",label:d.lang.forms.checkboxAndRadio.selected,"default":"",
    +accessKey:"S",value:"checked",setup:function(a){this.setValue(a.getAttribute("checked"))},commit:function(a){var b=a.element;if(CKEDITOR.env.ie){var c=!!b.getAttribute("checked"),e=!!this.getValue();c!=e&&(c=CKEDITOR.dom.element.createFromHtml('<input type="checkbox"'+(e?' checked="checked"':"")+"/>",d.document),b.copyAttributes(c,{type:1,checked:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c)}else this.getValue()?b.setAttribute("checked","checked"):b.removeAttribute("checked")}}]}]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/form.js b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/form.js
    new file mode 100644
    index 00000000..4a8e710e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/form.js
    @@ -0,0 +1,8 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("form",function(a){var d={action:1,id:1,method:1,enctype:1,target:1};return{title:a.lang.forms.form.title,minWidth:350,minHeight:200,onShow:function(){delete this.form;var b=this.getParentEditor().elementPath().contains("form",1);b&&(this.form=b,this.setupContent(b))},onOk:function(){var b,a=this.form,c=!a;c&&(b=this.getParentEditor(),a=b.document.createElement("form"),!CKEDITOR.env.ie&&a.append(b.document.createElement("br")));c&&b.insertElement(a);this.commitContent(a)},onLoad:function(){function a(b){this.setValue(b.getAttribute(this.id)||
    +"")}function e(a){this.getValue()?a.setAttribute(this.id,this.getValue()):a.removeAttribute(this.id)}this.foreach(function(c){d[c.id]&&(c.setup=a,c.commit=e)})},contents:[{id:"info",label:a.lang.forms.form.title,title:a.lang.forms.form.title,elements:[{id:"txtName",type:"text",label:a.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",
    +!1),a.removeAttribute("name"))}},{id:"action",type:"text",label:a.lang.forms.form.action,"default":"",accessKey:"T"},{type:"hbox",widths:["45%","55%"],children:[{id:"id",type:"text",label:a.lang.common.id,"default":"",accessKey:"I"},{id:"enctype",type:"select",label:a.lang.forms.form.encoding,style:"width:100%",accessKey:"E","default":"",items:[[""],["text/plain"],["multipart/form-data"],["application/x-www-form-urlencoded"]]}]},{type:"hbox",widths:["45%","55%"],children:[{id:"target",type:"select",
    +label:a.lang.common.target,style:"width:100%",accessKey:"M","default":"",items:[[a.lang.common.notSet,""],[a.lang.common.targetNew,"_blank"],[a.lang.common.targetTop,"_top"],[a.lang.common.targetSelf,"_self"],[a.lang.common.targetParent,"_parent"]]},{id:"method",type:"select",label:a.lang.forms.form.method,accessKey:"M","default":"GET",items:[["GET","get"],["POST","post"]]}]}]}]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/hiddenfield.js b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/hiddenfield.js
    new file mode 100644
    index 00000000..52485a64
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/hiddenfield.js
    @@ -0,0 +1,8 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("hiddenfield",function(d){return{title:d.lang.forms.hidden.title,hiddenField:null,minWidth:350,minHeight:110,onShow:function(){delete this.hiddenField;var a=this.getParentEditor(),b=a.getSelection(),c=b.getSelectedElement();c&&(c.data("cke-real-element-type")&&"hiddenfield"==c.data("cke-real-element-type"))&&(this.hiddenField=c,c=a.restoreRealElement(this.hiddenField),this.setupContent(c),b.selectElement(this.hiddenField))},onOk:function(){var a=this.getValueOf("info","_cke_saved_name");
    +this.getValueOf("info","value");var b=this.getParentEditor(),a=CKEDITOR.env.ie&&!(8<=CKEDITOR.document.$.documentMode)?b.document.createElement('<input name="'+CKEDITOR.tools.htmlEncode(a)+'">'):b.document.createElement("input");a.setAttribute("type","hidden");this.commitContent(a);a=b.createFakeElement(a,"cke_hidden","hiddenfield");this.hiddenField?(a.replace(this.hiddenField),b.getSelection().selectElement(a)):b.insertElement(a);return!0},contents:[{id:"info",label:d.lang.forms.hidden.title,title:d.lang.forms.hidden.title,
    +elements:[{id:"_cke_saved_name",type:"text",label:d.lang.forms.hidden.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.setAttribute("name",this.getValue()):a.removeAttribute("name")}},{id:"value",type:"text",label:d.lang.forms.hidden.value,"default":"",accessKey:"V",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:function(a){this.getValue()?a.setAttribute("value",this.getValue()):
    +a.removeAttribute("value")}}]}]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/radio.js b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/radio.js
    new file mode 100644
    index 00000000..947da835
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/radio.js
    @@ -0,0 +1,8 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("radio",function(d){return{title:d.lang.forms.checkboxAndRadio.radioTitle,minWidth:350,minHeight:140,onShow:function(){delete this.radioButton;var a=this.getParentEditor().getSelection().getSelectedElement();a&&("input"==a.getName()&&"radio"==a.getAttribute("type"))&&(this.radioButton=a,this.setupContent(a))},onOk:function(){var a,b=this.radioButton,c=!b;c&&(a=this.getParentEditor(),b=a.document.createElement("input"),b.setAttribute("type","radio"));c&&a.insertElement(b);this.commitContent({element:b})},
    +contents:[{id:"info",label:d.lang.forms.checkboxAndRadio.radioTitle,title:d.lang.forms.checkboxAndRadio.radioTitle,elements:[{id:"name",type:"text",label:d.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){a=a.element;this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"value",type:"text",label:d.lang.forms.checkboxAndRadio.value,"default":"",
    +accessKey:"V",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:function(a){a=a.element;this.getValue()?a.setAttribute("value",this.getValue()):a.removeAttribute("value")}},{id:"checked",type:"checkbox",label:d.lang.forms.checkboxAndRadio.selected,"default":"",accessKey:"S",value:"checked",setup:function(a){this.setValue(a.getAttribute("checked"))},commit:function(a){var b=a.element;if(!CKEDITOR.env.ie&&!CKEDITOR.env.opera)this.getValue()?b.setAttribute("checked","checked"):b.removeAttribute("checked");
    +else{var c=b.getAttribute("checked"),e=!!this.getValue();c!=e&&(c=CKEDITOR.dom.element.createFromHtml('<input type="radio"'+(e?' checked="checked"':"")+"></input>",d.document),b.copyAttributes(c,{type:1,checked:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c)}}}]}]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/select.js b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/select.js
    new file mode 100644
    index 00000000..e5e2a388
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/select.js
    @@ -0,0 +1,20 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("select",function(c){function h(a,b,e,d,c){a=f(a);d=d?d.createElement("OPTION"):document.createElement("OPTION");if(a&&d&&"option"==d.getName())CKEDITOR.env.ie?(isNaN(parseInt(c,10))?a.$.options.add(d.$):a.$.options.add(d.$,c),d.$.innerHTML=0<b.length?b:"",d.$.value=e):(null!==c&&c<a.getChildCount()?a.getChild(0>c?0:c).insertBeforeMe(d):a.append(d),d.setText(0<b.length?b:""),d.setValue(e));else return!1;return d}function m(a){for(var a=f(a),b=g(a),e=a.getChildren().count()-1;0<=
    +e;e--)a.getChild(e).$.selected&&a.getChild(e).remove();i(a,b)}function n(a,b,e,d){a=f(a);if(0>b)return!1;a=a.getChild(b);a.setText(e);a.setValue(d);return a}function k(a){for(a=f(a);a.getChild(0)&&a.getChild(0).remove(););}function j(a,b,e){var a=f(a),d=g(a);if(0>d)return!1;b=d+b;b=0>b?0:b;b=b>=a.getChildCount()?a.getChildCount()-1:b;if(d==b)return!1;var d=a.getChild(d),c=d.getText(),o=d.getValue();d.remove();d=h(a,c,o,!e?null:e,b);i(a,b);return d}function g(a){return(a=f(a))?a.$.selectedIndex:-1}
    +function i(a,b){a=f(a);if(0>b)return null;var e=a.getChildren().count();a.$.selectedIndex=b>=e?e-1:b;return a}function l(a){return(a=f(a))?a.getChildren():!1}function f(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}return{title:c.lang.forms.select.title,minWidth:CKEDITOR.env.ie?460:395,minHeight:CKEDITOR.env.ie?320:300,onShow:function(){delete this.selectBox;this.setupContent("clear");var a=this.getParentEditor().getSelection().getSelectedElement();if(a&&"select"==a.getName()){this.selectBox=
    +a;this.setupContent(a.getName(),a);for(var a=l(a),b=0;b<a.count();b++)this.setupContent("option",a.getItem(b))}},onOk:function(){var a=this.getParentEditor(),b=this.selectBox,e=!b;e&&(b=a.document.createElement("select"));this.commitContent(b);if(e&&(a.insertElement(b),CKEDITOR.env.ie)){var d=a.getSelection(),c=d.createBookmarks();setTimeout(function(){d.selectBookmarks(c)},0)}},contents:[{id:"info",label:c.lang.forms.select.selectInfo,title:c.lang.forms.select.selectInfo,accessKey:"",elements:[{id:"txtName",
    +type:"text",widths:["25%","75%"],labelLayout:"horizontal",label:c.lang.common.name,"default":"",accessKey:"N",style:"width:350px",setup:function(a,b){"clear"==a?this.setValue(this["default"]||""):"select"==a&&this.setValue(b.data("cke-saved-name")||b.getAttribute("name")||"")},commit:function(a){this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"txtValue",type:"text",widths:["25%","75%"],labelLayout:"horizontal",label:c.lang.forms.select.value,
    +style:"width:350px","default":"",className:"cke_disabled",onLoad:function(){this.getInputElement().setAttribute("readOnly",!0)},setup:function(a,b){"clear"==a?this.setValue(""):"option"==a&&b.getAttribute("selected")&&this.setValue(b.$.value)}},{type:"hbox",widths:["175px","170px"],children:[{id:"txtSize",type:"text",labelLayout:"horizontal",label:c.lang.forms.select.size,"default":"",accessKey:"S",style:"width:175px",validate:function(){var a=CKEDITOR.dialog.validate.integer(c.lang.common.validateNumberFailed);
    +return""===this.getValue()||a.apply(this)},setup:function(a,b){"select"==a&&this.setValue(b.getAttribute("size")||"");CKEDITOR.env.webkit&&this.getInputElement().setStyle("width","86px")},commit:function(a){this.getValue()?a.setAttribute("size",this.getValue()):a.removeAttribute("size")}},{type:"html",html:"<span>"+CKEDITOR.tools.htmlEncode(c.lang.forms.select.lines)+"</span>"}]},{type:"html",html:"<span>"+CKEDITOR.tools.htmlEncode(c.lang.forms.select.opAvail)+"</span>"},{type:"hbox",widths:["115px",
    +"115px","100px"],children:[{type:"vbox",children:[{id:"txtOptName",type:"text",label:c.lang.forms.select.opText,style:"width:115px",setup:function(a){"clear"==a&&this.setValue("")}},{type:"select",id:"cmbName",label:"",title:"",size:5,style:"width:115px;height:75px",items:[],onChange:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbValue"),e=a.getContentElement("info","txtOptName"),a=a.getContentElement("info","txtOptValue"),d=g(this);i(b,d);e.setValue(this.getValue());a.setValue(b.getValue())},
    +setup:function(a,b){"clear"==a?k(this):"option"==a&&h(this,b.getText(),b.getText(),this.getDialog().getParentEditor().document)},commit:function(a){var b=this.getDialog(),e=l(this),d=l(b.getContentElement("info","cmbValue")),c=b.getContentElement("info","txtValue").getValue();k(a);for(var f=0;f<e.count();f++){var g=h(a,e.getItem(f).getValue(),d.getItem(f).getValue(),b.getParentEditor().document);d.getItem(f).getValue()==c&&(g.setAttribute("selected","selected"),g.selected=!0)}}}]},{type:"vbox",children:[{id:"txtOptValue",
    +type:"text",label:c.lang.forms.select.opValue,style:"width:115px",setup:function(a){"clear"==a&&this.setValue("")}},{type:"select",id:"cmbValue",label:"",size:5,style:"width:115px;height:75px",items:[],onChange:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbName"),e=a.getContentElement("info","txtOptName"),a=a.getContentElement("info","txtOptValue"),d=g(this);i(b,d);e.setValue(b.getValue());a.setValue(this.getValue())},setup:function(a,b){if("clear"==a)k(this);else if("option"==
    +a){var e=b.getValue();h(this,e,e,this.getDialog().getParentEditor().document);"selected"==b.getAttribute("selected")&&this.getDialog().getContentElement("info","txtValue").setValue(e)}}}]},{type:"vbox",padding:5,children:[{type:"button",id:"btnAdd",style:"",label:c.lang.forms.select.btnAdd,title:c.lang.forms.select.btnAdd,style:"width:100%;",onClick:function(){var a=this.getDialog();a.getParentEditor();var b=a.getContentElement("info","txtOptName"),e=a.getContentElement("info","txtOptValue"),d=a.getContentElement("info",
    +"cmbName"),c=a.getContentElement("info","cmbValue");h(d,b.getValue(),b.getValue(),a.getParentEditor().document);h(c,e.getValue(),e.getValue(),a.getParentEditor().document);b.setValue("");e.setValue("")}},{type:"button",id:"btnModify",label:c.lang.forms.select.btnModify,title:c.lang.forms.select.btnModify,style:"width:100%;",onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","txtOptName"),e=a.getContentElement("info","txtOptValue"),d=a.getContentElement("info","cmbName"),a=a.getContentElement("info",
    +"cmbValue"),c=g(d);0<=c&&(n(d,c,b.getValue(),b.getValue()),n(a,c,e.getValue(),e.getValue()))}},{type:"button",id:"btnUp",style:"width:100%;",label:c.lang.forms.select.btnUp,title:c.lang.forms.select.btnUp,onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbName"),c=a.getContentElement("info","cmbValue");j(b,-1,a.getParentEditor().document);j(c,-1,a.getParentEditor().document)}},{type:"button",id:"btnDown",style:"width:100%;",label:c.lang.forms.select.btnDown,title:c.lang.forms.select.btnDown,
    +onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbName"),c=a.getContentElement("info","cmbValue");j(b,1,a.getParentEditor().document);j(c,1,a.getParentEditor().document)}}]}]},{type:"hbox",widths:["40%","20%","40%"],children:[{type:"button",id:"btnSetValue",label:c.lang.forms.select.btnSetValue,title:c.lang.forms.select.btnSetValue,onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbValue");a.getContentElement("info","txtValue").setValue(b.getValue())}},
    +{type:"button",id:"btnDelete",label:c.lang.forms.select.btnDelete,title:c.lang.forms.select.btnDelete,onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbName"),c=a.getContentElement("info","cmbValue"),d=a.getContentElement("info","txtOptName"),a=a.getContentElement("info","txtOptValue");m(b);m(c);d.setValue("");a.setValue("")}},{id:"chkMulti",type:"checkbox",label:c.lang.forms.select.chkMulti,"default":"",accessKey:"M",value:"checked",setup:function(a,b){"select"==a&&this.setValue(b.getAttribute("multiple"));
    +CKEDITOR.env.webkit&&this.getElement().getParent().setStyle("vertical-align","middle")},commit:function(a){this.getValue()?a.setAttribute("multiple",this.getValue()):a.removeAttribute("multiple")}}]}]}]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/textarea.js b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/textarea.js
    new file mode 100644
    index 00000000..a7b50d70
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/textarea.js
    @@ -0,0 +1,8 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("textarea",function(b){return{title:b.lang.forms.textarea.title,minWidth:350,minHeight:220,onShow:function(){delete this.textarea;var a=this.getParentEditor().getSelection().getSelectedElement();a&&"textarea"==a.getName()&&(this.textarea=a,this.setupContent(a))},onOk:function(){var a,b=this.textarea,c=!b;c&&(a=this.getParentEditor(),b=a.document.createElement("textarea"));this.commitContent(b);c&&a.insertElement(b)},contents:[{id:"info",label:b.lang.forms.textarea.title,title:b.lang.forms.textarea.title,
    +elements:[{id:"_cke_saved_name",type:"text",label:b.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{type:"hbox",widths:["50%","50%"],children:[{id:"cols",type:"text",label:b.lang.forms.textarea.cols,"default":"",accessKey:"C",style:"width:50px",validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed),
    +setup:function(a){this.setValue(a.hasAttribute("cols")&&a.getAttribute("cols")||"")},commit:function(a){this.getValue()?a.setAttribute("cols",this.getValue()):a.removeAttribute("cols")}},{id:"rows",type:"text",label:b.lang.forms.textarea.rows,"default":"",accessKey:"R",style:"width:50px",validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed),setup:function(a){this.setValue(a.hasAttribute("rows")&&a.getAttribute("rows")||"")},commit:function(a){this.getValue()?a.setAttribute("rows",
    +this.getValue()):a.removeAttribute("rows")}}]},{id:"value",type:"textarea",label:b.lang.forms.textfield.value,"default":"",setup:function(a){this.setValue(a.$.defaultValue)},commit:function(a){a.$.value=a.$.defaultValue=this.getValue()}}]}]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/textfield.js b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/textfield.js
    new file mode 100644
    index 00000000..263bc19e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/forms/dialogs/textfield.js
    @@ -0,0 +1,10 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("textfield",function(b){function e(a){var a=a.element,c=this.getValue();c?a.setAttribute(this.id,c):a.removeAttribute(this.id)}function f(a){this.setValue(a.hasAttribute(this.id)&&a.getAttribute(this.id)||"")}var g={email:1,password:1,search:1,tel:1,text:1,url:1};return{title:b.lang.forms.textfield.title,minWidth:350,minHeight:150,onShow:function(){delete this.textField;var a=this.getParentEditor().getSelection().getSelectedElement();if(a&&"input"==a.getName()&&(g[a.getAttribute("type")]||
    +!a.getAttribute("type")))this.textField=a,this.setupContent(a)},onOk:function(){var a=this.getParentEditor(),c=this.textField,b=!c;b&&(c=a.document.createElement("input"),c.setAttribute("type","text"));c={element:c};b&&a.insertElement(c.element);this.commitContent(c);b||a.getSelection().selectElement(c.element)},onLoad:function(){this.foreach(function(a){if(a.getValue&&(a.setup||(a.setup=f),!a.commit))a.commit=e})},contents:[{id:"info",label:b.lang.forms.textfield.title,title:b.lang.forms.textfield.title,
    +elements:[{type:"hbox",widths:["50%","50%"],children:[{id:"_cke_saved_name",type:"text",label:b.lang.forms.textfield.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){a=a.element;this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"value",type:"text",label:b.lang.forms.textfield.value,"default":"",accessKey:"V",commit:function(a){if(CKEDITOR.env.ie&&
    +!this.getValue()){var c=a.element,d=new CKEDITOR.dom.element("input",b.document);c.copyAttributes(d,{value:1});d.replace(c);a.element=d}else e.call(this,a)}}]},{type:"hbox",widths:["50%","50%"],children:[{id:"size",type:"text",label:b.lang.forms.textfield.charWidth,"default":"",accessKey:"C",style:"width:50px",validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed)},{id:"maxLength",type:"text",label:b.lang.forms.textfield.maxChars,"default":"",accessKey:"M",style:"width:50px",
    +validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed)}],onLoad:function(){CKEDITOR.env.ie7Compat&&this.getElement().setStyle("zoom","100%")}},{id:"type",type:"select",label:b.lang.forms.textfield.type,"default":"text",accessKey:"M",items:[[b.lang.forms.textfield.typeEmail,"email"],[b.lang.forms.textfield.typePass,"password"],[b.lang.forms.textfield.typeSearch,"search"],[b.lang.forms.textfield.typeTel,"tel"],[b.lang.forms.textfield.typeText,"text"],[b.lang.forms.textfield.typeUrl,
    +"url"]],setup:function(a){this.setValue(a.getAttribute("type"))},commit:function(a){var c=a.element;if(CKEDITOR.env.ie){var d=c.getAttribute("type"),e=this.getValue();d!=e&&(d=CKEDITOR.dom.element.createFromHtml('<input type="'+e+'"></input>',b.document),c.copyAttributes(d,{type:1}),d.replace(c),a.element=d)}else c.setAttribute("type",this.getValue())}}]}]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/forms/images/hiddenfield.gif b/src/main/webapp/plug-in/ckeditor/plugins/forms/images/hiddenfield.gif
    new file mode 100644
    index 00000000..953f643b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/forms/images/hiddenfield.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/icons.png b/src/main/webapp/plug-in/ckeditor/plugins/icons.png
    new file mode 100644
    index 00000000..a7b73858
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/icons.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/iframe/dialogs/iframe.js b/src/main/webapp/plug-in/ckeditor/plugins/iframe/dialogs/iframe.js
    new file mode 100644
    index 00000000..7569a13a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/iframe/dialogs/iframe.js
    @@ -0,0 +1,10 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +(function(){function c(b){var c=this instanceof CKEDITOR.ui.dialog.checkbox;b.hasAttribute(this.id)&&(b=b.getAttribute(this.id),c?this.setValue(e[this.id]["true"]==b.toLowerCase()):this.setValue(b))}function d(b){var c=""===this.getValue(),a=this instanceof CKEDITOR.ui.dialog.checkbox,d=this.getValue();c?b.removeAttribute(this.att||this.id):a?b.setAttribute(this.id,e[this.id][d]):b.setAttribute(this.att||this.id,d)}var e={scrolling:{"true":"yes","false":"no"},frameborder:{"true":"1","false":"0"}};
    +CKEDITOR.dialog.add("iframe",function(b){var f=b.lang.iframe,a=b.lang.common,e=b.plugins.dialogadvtab;return{title:f.title,minWidth:350,minHeight:260,onShow:function(){this.fakeImage=this.iframeNode=null;var a=this.getSelectedElement();a&&(a.data("cke-real-element-type")&&"iframe"==a.data("cke-real-element-type"))&&(this.fakeImage=a,this.iframeNode=a=b.restoreRealElement(a),this.setupContent(a))},onOk:function(){var a;a=this.fakeImage?this.iframeNode:new CKEDITOR.dom.element("iframe");var c={},d=
    +{};this.commitContent(a,c,d);a=b.createFakeElement(a,"cke_iframe","iframe",!0);a.setAttributes(d);a.setStyles(c);this.fakeImage?(a.replace(this.fakeImage),b.getSelection().selectElement(a)):b.insertElement(a)},contents:[{id:"info",label:a.generalTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{id:"src",type:"text",label:a.url,required:!0,validate:CKEDITOR.dialog.validate.notEmpty(f.noUrl),setup:c,commit:d}]},{type:"hbox",children:[{id:"width",type:"text",requiredContent:"iframe[width]",
    +style:"width:100%",labelLayout:"vertical",label:a.width,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1",a.width)),setup:c,commit:d},{id:"height",type:"text",requiredContent:"iframe[height]",style:"width:100%",labelLayout:"vertical",label:a.height,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1",a.height)),setup:c,commit:d},{id:"align",type:"select",requiredContent:"iframe[align]","default":"",items:[[a.notSet,""],[a.alignLeft,"left"],[a.alignRight,
    +"right"],[a.alignTop,"top"],[a.alignMiddle,"middle"],[a.alignBottom,"bottom"]],style:"width:100%",labelLayout:"vertical",label:a.align,setup:function(a,b){c.apply(this,arguments);if(b){var d=b.getAttribute("align");this.setValue(d&&d.toLowerCase()||"")}},commit:function(a,b,c){d.apply(this,arguments);this.getValue()&&(c.align=this.getValue())}}]},{type:"hbox",widths:["50%","50%"],children:[{id:"scrolling",type:"checkbox",requiredContent:"iframe[scrolling]",label:f.scrolling,setup:c,commit:d},{id:"frameborder",
    +type:"checkbox",requiredContent:"iframe[frameborder]",label:f.border,setup:c,commit:d}]},{type:"hbox",widths:["50%","50%"],children:[{id:"name",type:"text",requiredContent:"iframe[name]",label:a.name,setup:c,commit:d},{id:"title",type:"text",requiredContent:"iframe[title]",label:a.advisoryTitle,setup:c,commit:d}]},{id:"longdesc",type:"text",requiredContent:"iframe[longdesc]",label:a.longDescr,setup:c,commit:d}]},e&&e.createAdvancedTab(b,{id:1,classes:1,styles:1},"iframe")]}})})();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/iframe/images/placeholder.png b/src/main/webapp/plug-in/ckeditor/plugins/iframe/images/placeholder.png
    new file mode 100644
    index 00000000..b40c7b20
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/iframe/images/placeholder.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/image/dialogs/image.js b/src/main/webapp/plug-in/ckeditor/plugins/image/dialogs/image.js
    new file mode 100644
    index 00000000..beae7864
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/image/dialogs/image.js
    @@ -0,0 +1,43 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +(function(){var r=function(c,j){function r(){var a=arguments,b=this.getContentElement("advanced","txtdlgGenStyle");b&&b.commit.apply(b,a);this.foreach(function(b){b.commit&&"txtdlgGenStyle"!=b.id&&b.commit.apply(b,a)})}function i(a){if(!s){s=1;var b=this.getDialog(),d=b.imageElement;if(d){this.commit(f,d);for(var a=[].concat(a),e=a.length,c,g=0;g<e;g++)(c=b.getContentElement.apply(b,a[g].split(":")))&&c.setup(f,d)}s=0}}var f=1,k=/^\s*(\d+)((px)|\%)?\s*$/i,v=/(^\s*(\d+)((px)|\%)?\s*$)|^$/i,o=/^\d+px$/,
    +w=function(){var a=this.getValue(),b=this.getDialog(),d=a.match(k);d&&("%"==d[2]&&l(b,!1),a=d[1]);b.lockRatio&&(d=b.originalElement,"true"==d.getCustomData("isReady")&&("txtHeight"==this.id?(a&&"0"!=a&&(a=Math.round(d.$.width*(a/d.$.height))),isNaN(a)||b.setValueOf("info","txtWidth",a)):(a&&"0"!=a&&(a=Math.round(d.$.height*(a/d.$.width))),isNaN(a)||b.setValueOf("info","txtHeight",a))));g(b)},g=function(a){if(!a.originalElement||!a.preview)return 1;a.commitContent(4,a.preview);return 0},s,l=function(a,
    +b){if(!a.getContentElement("info","ratioLock"))return null;var d=a.originalElement;if(!d)return null;if("check"==b){if(!a.userlockRatio&&"true"==d.getCustomData("isReady")){var e=a.getValueOf("info","txtWidth"),c=a.getValueOf("info","txtHeight"),d=1E3*d.$.width/d.$.height,f=1E3*e/c;a.lockRatio=!1;!e&&!c?a.lockRatio=!0:!isNaN(d)&&!isNaN(f)&&Math.round(d)==Math.round(f)&&(a.lockRatio=!0)}}else void 0!=b?a.lockRatio=b:(a.userlockRatio=1,a.lockRatio=!a.lockRatio);e=CKEDITOR.document.getById(p);a.lockRatio?
    +e.removeClass("cke_btn_unlocked"):e.addClass("cke_btn_unlocked");e.setAttribute("aria-checked",a.lockRatio);CKEDITOR.env.hc&&e.getChild(0).setHtml(a.lockRatio?CKEDITOR.env.ie?"鈻":"鈻":CKEDITOR.env.ie?"鈻":"鈻");return a.lockRatio},x=function(a){var b=a.originalElement;if("true"==b.getCustomData("isReady")){var d=a.getContentElement("info","txtWidth"),e=a.getContentElement("info","txtHeight");d&&d.setValue(b.$.width);e&&e.setValue(b.$.height)}g(a)},y=function(a,b){function d(a,b){var d=a.match(k);return d?
    +("%"==d[2]&&(d[1]+="%",l(e,!1)),d[1]):b}if(a==f){var e=this.getDialog(),c="",g="txtWidth"==this.id?"width":"height",h=b.getAttribute(g);h&&(c=d(h,c));c=d(b.getStyle(g),c);this.setValue(c)}},t,q=function(){var a=this.originalElement;a.setCustomData("isReady","true");a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);CKEDITOR.document.getById(m).setStyle("display","none");this.dontResetSize||x(this);this.firstLoad&&CKEDITOR.tools.setTimeout(function(){l(this,"check")},
    +0,this);this.dontResetSize=this.firstLoad=!1},h=function(){var a=this.originalElement;a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);a=CKEDITOR.getUrl(CKEDITOR.plugins.get("image").path+"images/noimage.png");this.preview&&this.preview.setAttribute("src",a);CKEDITOR.document.getById(m).setStyle("display","none");l(this,!1)},n=function(a){return CKEDITOR.tools.getNextId()+"_"+a},p=n("btnLockSizes"),u=n("btnResetSize"),m=n("ImagePreviewLoader"),A=n("previewLink"),
    +z=n("previewImage");return{title:c.lang.image["image"==j?"title":"titleButton"],minWidth:420,minHeight:360,onShow:function(){this.linkEditMode=this.imageEditMode=this.linkElement=this.imageElement=!1;this.lockRatio=!0;this.userlockRatio=0;this.dontResetSize=!1;this.firstLoad=!0;this.addLink=!1;var a=this.getParentEditor(),b=a.getSelection(),d=(b=b&&b.getSelectedElement())&&a.elementPath(b).contains("a",1);CKEDITOR.document.getById(m).setStyle("display","none");t=new CKEDITOR.dom.element("img",a.document);
    +this.preview=CKEDITOR.document.getById(z);this.originalElement=a.document.createElement("img");this.originalElement.setAttribute("alt","");this.originalElement.setCustomData("isReady","false");if(d){this.linkElement=d;this.linkEditMode=!0;var c=d.getChildren();if(1==c.count()){var g=c.getItem(0).getName();if("img"==g||"input"==g)this.imageElement=c.getItem(0),"img"==this.imageElement.getName()?this.imageEditMode="img":"input"==this.imageElement.getName()&&(this.imageEditMode="input")}"image"==j&&
    +this.setupContent(2,d)}if(b&&"img"==b.getName()&&!b.data("cke-realelement")||b&&"input"==b.getName()&&"image"==b.getAttribute("type"))this.imageEditMode=b.getName(),this.imageElement=b;this.imageEditMode?(this.cleanImageElement=this.imageElement,this.imageElement=this.cleanImageElement.clone(!0,!0),this.setupContent(f,this.imageElement)):this.imageElement=a.document.createElement("img");l(this,!0);CKEDITOR.tools.trim(this.getValueOf("info","txtUrl"))||(this.preview.removeAttribute("src"),this.preview.setStyle("display",
    +"none"))},onOk:function(){if(this.imageEditMode){var a=this.imageEditMode;"image"==j&&"input"==a&&confirm(c.lang.image.button2Img)?(this.imageElement=c.document.createElement("img"),this.imageElement.setAttribute("alt",""),c.insertElement(this.imageElement)):"image"!=j&&"img"==a&&confirm(c.lang.image.img2Button)?(this.imageElement=c.document.createElement("input"),this.imageElement.setAttributes({type:"image",alt:""}),c.insertElement(this.imageElement)):(this.imageElement=this.cleanImageElement,delete this.cleanImageElement)}else"image"==
    +j?this.imageElement=c.document.createElement("img"):(this.imageElement=c.document.createElement("input"),this.imageElement.setAttribute("type","image")),this.imageElement.setAttribute("alt","");this.linkEditMode||(this.linkElement=c.document.createElement("a"));this.commitContent(f,this.imageElement);this.commitContent(2,this.linkElement);this.imageElement.getAttribute("style")||this.imageElement.removeAttribute("style");this.imageEditMode?!this.linkEditMode&&this.addLink?(c.insertElement(this.linkElement),
    +this.imageElement.appendTo(this.linkElement)):this.linkEditMode&&!this.addLink&&(c.getSelection().selectElement(this.linkElement),c.insertElement(this.imageElement)):this.addLink?this.linkEditMode?c.insertElement(this.imageElement):(c.insertElement(this.linkElement),this.linkElement.append(this.imageElement,!1)):c.insertElement(this.imageElement)},onLoad:function(){"image"!=j&&this.hidePage("Link");var a=this._.element.getDocument();this.getContentElement("info","ratioLock")&&(this.addFocusable(a.getById(u),
    +5),this.addFocusable(a.getById(p),5));this.commitContent=r},onHide:function(){this.preview&&this.commitContent(8,this.preview);this.originalElement&&(this.originalElement.removeListener("load",q),this.originalElement.removeListener("error",h),this.originalElement.removeListener("abort",h),this.originalElement.remove(),this.originalElement=!1);delete this.imageElement},contents:[{id:"info",label:c.lang.image.infoTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{type:"hbox",widths:["280px",
    +"110px"],align:"right",children:[{id:"txtUrl",type:"text",label:c.lang.common.url,required:!0,onChange:function(){var a=this.getDialog(),b=this.getValue();if(0<b.length){var a=this.getDialog(),d=a.originalElement;a.preview.removeStyle("display");d.setCustomData("isReady","false");var c=CKEDITOR.document.getById(m);c&&c.setStyle("display","");d.on("load",q,a);d.on("error",h,a);d.on("abort",h,a);d.setAttribute("src",b);t.setAttribute("src",b);a.preview.setAttribute("src",t.$.src);g(a)}else a.preview&&
    +(a.preview.removeAttribute("src"),a.preview.setStyle("display","none"))},setup:function(a,b){if(a==f){var d=b.data("cke-saved-src")||b.getAttribute("src");this.getDialog().dontResetSize=!0;this.setValue(d);this.setInitValue()}},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())?(b.data("cke-saved-src",this.getValue()),b.setAttribute("src",this.getValue())):8==a&&(b.setAttribute("src",""),b.removeAttribute("src"))},validate:CKEDITOR.dialog.validate.notEmpty(c.lang.image.urlMissing)},{type:"button",
    +id:"browse",style:"display:inline-block;margin-top:10px;",align:"center",label:c.lang.common.browseServer,hidden:!0,filebrowser:"info:txtUrl"}]}]},{id:"txtAlt",type:"text",label:c.lang.image.alt,accessKey:"T","default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("alt"))},commit:function(a,b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("alt",this.getValue()):4==a?b.setAttribute("alt",this.getValue()):8==a&&b.removeAttribute("alt")}},
    +{type:"hbox",children:[{id:"basic",type:"vbox",children:[{type:"hbox",requiredContent:"img{width,height}",widths:["50%","50%"],children:[{type:"vbox",padding:1,children:[{type:"text",width:"45px",id:"txtWidth",label:c.lang.common.width,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=this.getValue().match(v);(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidWidth);return a},setup:y,commit:function(a,b,d){var c=this.getValue();a==f?(c?b.setStyle("width",
    +CKEDITOR.tools.cssLength(c)):b.removeStyle("width"),!d&&b.removeAttribute("width")):4==a?c.match(k)?b.setStyle("width",CKEDITOR.tools.cssLength(c)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("width",a.$.width+"px")):8==a&&(b.removeAttribute("width"),b.removeStyle("width"))}},{type:"text",id:"txtHeight",width:"45px",label:c.lang.common.height,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=this.getValue().match(v);
    +(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidHeight);return a},setup:y,commit:function(a,b,d){var c=this.getValue();a==f?(c?b.setStyle("height",CKEDITOR.tools.cssLength(c)):b.removeStyle("height"),!d&&b.removeAttribute("height")):4==a?c.match(k)?b.setStyle("height",CKEDITOR.tools.cssLength(c)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("height",a.$.height+"px")):8==a&&(b.removeAttribute("height"),b.removeStyle("height"))}}]},{id:"ratioLock",
    +type:"html",style:"margin-top:30px;width:40px;height:40px;",onLoad:function(){var a=CKEDITOR.document.getById(u),b=CKEDITOR.document.getById(p);a&&(a.on("click",function(a){x(this);a.data&&a.data.preventDefault()},this.getDialog()),a.on("mouseover",function(){this.addClass("cke_btn_over")},a),a.on("mouseout",function(){this.removeClass("cke_btn_over")},a));b&&(b.on("click",function(a){l(this);var b=this.originalElement,c=this.getValueOf("info","txtWidth");if(b.getCustomData("isReady")=="true"&&c){b=
    +b.$.height/b.$.width*c;if(!isNaN(b)){this.setValueOf("info","txtHeight",Math.round(b));g(this)}}a.data&&a.data.preventDefault()},this.getDialog()),b.on("mouseover",function(){this.addClass("cke_btn_over")},b),b.on("mouseout",function(){this.removeClass("cke_btn_over")},b))},html:'<div><a href="javascript:void(0)" tabindex="-1" title="'+c.lang.image.lockRatio+'" class="cke_btn_locked" id="'+p+'" role="checkbox"><span class="cke_icon"></span><span class="cke_label">'+c.lang.image.lockRatio+'</span></a><a href="javascript:void(0)" tabindex="-1" title="'+
    +c.lang.image.resetSize+'" class="cke_btn_reset" id="'+u+'" role="button"><span class="cke_label">'+c.lang.image.resetSize+"</span></a></div>"}]},{type:"vbox",padding:1,children:[{type:"text",id:"txtBorder",requiredContent:"img{border-width}",width:"60px",label:c.lang.image.border,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateBorder),setup:function(a,b){if(a==f){var d;d=
    +(d=(d=b.getStyle("border-width"))&&d.match(/^(\d+px)(?: \1 \1 \1)?$/))&&parseInt(d[1],10);isNaN(parseInt(d,10))&&(d=b.getAttribute("border"));this.setValue(d)}},commit:function(a,b,d){var c=parseInt(this.getValue(),10);a==f||4==a?(isNaN(c)?!c&&this.isChanged()&&b.removeStyle("border"):(b.setStyle("border-width",CKEDITOR.tools.cssLength(c)),b.setStyle("border-style","solid")),!d&&a==f&&b.removeAttribute("border")):8==a&&(b.removeAttribute("border"),b.removeStyle("border-width"),b.removeStyle("border-style"),
    +b.removeStyle("border-color"))}},{type:"text",id:"txtHSpace",requiredContent:"img{margin-left,margin-right}",width:"60px",label:c.lang.image.hSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateHSpace),setup:function(a,b){if(a==f){var d,c;d=b.getStyle("margin-left");c=b.getStyle("margin-right");d=d&&d.match(o);c=c&&c.match(o);d=parseInt(d,10);c=parseInt(c,10);d=d==c&&d;
    +isNaN(parseInt(d,10))&&(d=b.getAttribute("hspace"));this.setValue(d)}},commit:function(a,b,c){var e=parseInt(this.getValue(),10);a==f||4==a?(isNaN(e)?!e&&this.isChanged()&&(b.removeStyle("margin-left"),b.removeStyle("margin-right")):(b.setStyle("margin-left",CKEDITOR.tools.cssLength(e)),b.setStyle("margin-right",CKEDITOR.tools.cssLength(e))),!c&&a==f&&b.removeAttribute("hspace")):8==a&&(b.removeAttribute("hspace"),b.removeStyle("margin-left"),b.removeStyle("margin-right"))}},{type:"text",id:"txtVSpace",
    +requiredContent:"img{margin-top,margin-bottom}",width:"60px",label:c.lang.image.vSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateVSpace),setup:function(a,b){if(a==f){var c,e;c=b.getStyle("margin-top");e=b.getStyle("margin-bottom");c=c&&c.match(o);e=e&&e.match(o);c=parseInt(c,10);e=parseInt(e,10);c=c==e&&c;isNaN(parseInt(c,10))&&(c=b.getAttribute("vspace"));this.setValue(c)}},
    +commit:function(a,b,c){var e=parseInt(this.getValue(),10);a==f||4==a?(isNaN(e)?!e&&this.isChanged()&&(b.removeStyle("margin-top"),b.removeStyle("margin-bottom")):(b.setStyle("margin-top",CKEDITOR.tools.cssLength(e)),b.setStyle("margin-bottom",CKEDITOR.tools.cssLength(e))),!c&&a==f&&b.removeAttribute("vspace")):8==a&&(b.removeAttribute("vspace"),b.removeStyle("margin-top"),b.removeStyle("margin-bottom"))}},{id:"cmbAlign",requiredContent:"img{float}",type:"select",widths:["35%","65%"],style:"width:90px",
    +label:c.lang.common.align,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.alignLeft,"left"],[c.lang.common.alignRight,"right"]],onChange:function(){g(this.getDialog());i.call(this,"advanced:txtdlgGenStyle")},setup:function(a,b){if(a==f){var c=b.getStyle("float");switch(c){case "inherit":case "none":c=""}!c&&(c=(b.getAttribute("align")||"").toLowerCase());this.setValue(c)}},commit:function(a,b,c){var e=this.getValue();if(a==f||4==a){if(e?b.setStyle("float",e):b.removeStyle("float"),!c&&
    +a==f)switch(e=(b.getAttribute("align")||"").toLowerCase(),e){case "left":case "right":b.removeAttribute("align")}}else 8==a&&b.removeStyle("float")}}]}]},{type:"vbox",height:"250px",children:[{type:"html",id:"htmlPreview",style:"width:95%;",html:"<div>"+CKEDITOR.tools.htmlEncode(c.lang.common.preview)+'<br><div id="'+m+'" class="ImagePreviewLoader" style="display:none"><div class="loading">&nbsp;</div></div><div class="ImagePreviewBox"><table><tr><td><a href="javascript:void(0)" target="_blank" onclick="return false;" id="'+
    +A+'"><img id="'+z+'" alt="" /></a>'+(c.config.image_previewText||"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.")+
    +"</td></tr></table></div></div>"}]}]}]},{id:"Link",requiredContent:"a[href]",label:c.lang.image.linkTab,padding:0,elements:[{id:"txtUrl",type:"text",label:c.lang.common.url,style:"width: 100%","default":"",setup:function(a,b){if(2==a){var c=b.data("cke-saved-href");c||(c=b.getAttribute("href"));this.setValue(c)}},commit:function(a,b){if(2==a&&(this.getValue()||this.isChanged())){var d=decodeURI(this.getValue());b.data("cke-saved-href",d);b.setAttribute("href",d);if(this.getValue()||!c.config.image_removeLinkByEmptyURL)this.getDialog().addLink=
    +!0}}},{type:"button",id:"browse",filebrowser:{action:"Browse",target:"Link:txtUrl",url:c.config.filebrowserImageBrowseLinkUrl},style:"float:right",hidden:!0,label:c.lang.common.browseServer},{id:"cmbTarget",type:"select",requiredContent:"a[target]",label:c.lang.common.target,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.targetNew,"_blank"],[c.lang.common.targetTop,"_top"],[c.lang.common.targetSelf,"_self"],[c.lang.common.targetParent,"_parent"]],setup:function(a,b){2==a&&this.setValue(b.getAttribute("target")||
    +"")},commit:function(a,b){2==a&&(this.getValue()||this.isChanged())&&b.setAttribute("target",this.getValue())}}]},{id:"Upload",hidden:!0,filebrowser:"uploadButton",label:c.lang.image.upload,elements:[{type:"file",id:"upload",label:c.lang.image.btnUpload,style:"height:40px",size:38},{type:"fileButton",id:"uploadButton",filebrowser:"info:txtUrl",label:c.lang.image.btnUpload,"for":["Upload","upload"]}]},{id:"advanced",label:c.lang.common.advancedTab,elements:[{type:"hbox",widths:["50%","25%","25%"],
    +children:[{type:"text",id:"linkId",requiredContent:"img[id]",label:c.lang.common.id,setup:function(a,b){a==f&&this.setValue(b.getAttribute("id"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("id",this.getValue())}},{id:"cmbLangDir",type:"select",requiredContent:"img[dir]",style:"width : 100px;",label:c.lang.common.langDir,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.langDirLtr,"ltr"],[c.lang.common.langDirRtl,"rtl"]],setup:function(a,b){a==f&&this.setValue(b.getAttribute("dir"))},
    +commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("dir",this.getValue())}},{type:"text",id:"txtLangCode",requiredContent:"img[lang]",label:c.lang.common.langCode,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("lang"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("lang",this.getValue())}}]},{type:"text",id:"txtGenLongDescr",requiredContent:"img[longdesc]",label:c.lang.common.longDescr,setup:function(a,b){a==f&&this.setValue(b.getAttribute("longDesc"))},
    +commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("longDesc",this.getValue())}},{type:"hbox",widths:["50%","50%"],children:[{type:"text",id:"txtGenClass",requiredContent:"img(cke-xyz)",label:c.lang.common.cssClass,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("class"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("class",this.getValue())}},{type:"text",id:"txtGenTitle",requiredContent:"img[title]",label:c.lang.common.advisoryTitle,
    +"default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("title"))},commit:function(a,b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("title",this.getValue()):4==a?b.setAttribute("title",this.getValue()):8==a&&b.removeAttribute("title")}}]},{type:"text",id:"txtdlgGenStyle",requiredContent:"img{cke-xyz}",label:c.lang.common.cssStyle,validate:CKEDITOR.dialog.validate.inlineStyle(c.lang.common.invalidInlineStyle),"default":"",setup:function(a,
    +b){if(a==f){var c=b.getAttribute("style");!c&&b.$.style.cssText&&(c=b.$.style.cssText);this.setValue(c);var e=b.$.style.height,c=b.$.style.width,e=(e?e:"").match(k),c=(c?c:"").match(k);this.attributesInStyle={height:!!e,width:!!c}}},onChange:function(){i.call(this,"info:cmbFloat info:cmbAlign info:txtVSpace info:txtHSpace info:txtBorder info:txtWidth info:txtHeight".split(" "));g(this)},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("style",this.getValue())}}]}]}};
    +CKEDITOR.dialog.add("image",function(c){return r(c,"image")});CKEDITOR.dialog.add("imagebutton",function(c){return r(c,"imagebutton")})})();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/image/images/noimage.png b/src/main/webapp/plug-in/ckeditor/plugins/image/images/noimage.png
    new file mode 100644
    index 00000000..15981130
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/image/images/noimage.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/link/dialogs/anchor.js b/src/main/webapp/plug-in/ckeditor/plugins/link/dialogs/anchor.js
    new file mode 100644
    index 00000000..4c5153ce
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/link/dialogs/anchor.js
    @@ -0,0 +1,8 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("anchor",function(c){var d=function(a){this._.selectedElement=a;this.setValueOf("info","txtName",a.data("cke-saved-name")||"")};return{title:c.lang.link.anchor.title,minWidth:300,minHeight:60,onOk:function(){var a=CKEDITOR.tools.trim(this.getValueOf("info","txtName")),a={id:a,name:a,"data-cke-saved-name":a};if(this._.selectedElement)this._.selectedElement.data("cke-realelement")?(a=c.document.createElement("a",{attributes:a}),c.createFakeElement(a,"cke_anchor","anchor").replace(this._.selectedElement)):
    +this._.selectedElement.setAttributes(a);else{var b=c.getSelection(),b=b&&b.getRanges()[0];b.collapsed?(CKEDITOR.plugins.link.synAnchorSelector&&(a["class"]="cke_anchor_empty"),CKEDITOR.plugins.link.emptyAnchorFix&&(a.contenteditable="false",a["data-cke-editable"]=1),a=c.document.createElement("a",{attributes:a}),CKEDITOR.plugins.link.fakeAnchor&&(a=c.createFakeElement(a,"cke_anchor","anchor")),b.insertNode(a)):(CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(a["class"]="cke_anchor"),a=new CKEDITOR.style({element:"a",
    +attributes:a}),a.type=CKEDITOR.STYLE_INLINE,c.applyStyle(a))}},onHide:function(){delete this._.selectedElement},onShow:function(){var a=c.getSelection(),b=a.getSelectedElement();if(b)CKEDITOR.plugins.link.fakeAnchor?((a=CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b))&&d.call(this,a),this._.selectedElement=b):b.is("a")&&b.hasAttribute("name")&&d.call(this,b);else if(b=CKEDITOR.plugins.link.getSelectedLink(c))d.call(this,b),a.selectElement(b);this.getContentElement("info","txtName").focus()},contents:[{id:"info",
    +label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){return!this.getValue()?(alert(c.lang.link.anchor.errorName),!1):!0}}]}]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/link/dialogs/link.js b/src/main/webapp/plug-in/ckeditor/plugins/link/dialogs/link.js
    new file mode 100644
    index 00000000..bb08a04e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/link/dialogs/link.js
    @@ -0,0 +1,36 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("link",function(n){var p,q;function r(a){return a.replace(/'/g,"\\$&")}function t(a){var g,c=p,d,e;g=[q,"("];for(var b=0;b<c.length;b++)d=c[b].toLowerCase(),e=a[d],0<b&&g.push(","),g.push("'",e?r(encodeURIComponent(a[d])):"","'");g.push(")");return g.join("")}function u(a){for(var g,c=a.length,d=[],e=0;e<c;e++)g=a.charCodeAt(e),d.push(g);return"String.fromCharCode("+d.join(",")+")"}function v(a){return(a=a.getAttribute("class"))?a.replace(/\s*(?:cke_anchor_empty|cke_anchor)(?:\s*$)?/g,
    +""):""}var w=CKEDITOR.plugins.link,s=function(){var a=this.getDialog(),g=a.getContentElement("target","popupFeatures"),a=a.getContentElement("target","linkTargetName"),c=this.getValue();if(g&&a)switch(g=g.getElement(),g.hide(),a.setValue(""),c){case "frame":a.setLabel(n.lang.link.targetFrameName);a.getElement().show();break;case "popup":g.show();a.setLabel(n.lang.link.targetPopupName);a.getElement().show();break;default:a.setValue(c),a.getElement().hide()}},x=/^javascript:/,y=/^mailto:([^?]+)(?:\?(.+))?$/,
    +z=/subject=([^;?:@&=$,\/]*)/,A=/body=([^;?:@&=$,\/]*)/,B=/^#(.*)$/,C=/^((?:http|https|ftp|news):\/\/)?(.*)$/,D=/^(_(?:self|top|parent|blank))$/,E=/^javascript:void\(location\.href='mailto:'\+String\.fromCharCode\(([^)]+)\)(?:\+'(.*)')?\)$/,F=/^javascript:([^(]+)\(([^)]+)\)$/,G=/\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*/,H=/(?:^|,)([^=]+)=(\d+|yes|no)/gi,I=function(a,g){var c=g&&(g.data("cke-saved-href")||g.getAttribute("href"))||"",d,e,b=
    +{};c.match(x)&&("encode"==o?c=c.replace(E,function(a,c,b){return"mailto:"+String.fromCharCode.apply(String,c.split(","))+(b&&b.replace(/\\'/g,"'"))}):o&&c.replace(F,function(a,c,d){if(c==q){b.type="email";for(var a=b.email={},c=/(^')|('$)/g,d=d.match(/[^,\s]+/g),e=d.length,g,f,h=0;h<e;h++)g=decodeURIComponent,f=d[h].replace(c,"").replace(/\\'/g,"'"),f=g(f),g=p[h].toLowerCase(),a[g]=f;a.address=[a.name,a.domain].join("@")}}));if(!b.type)if(d=c.match(B))b.type="anchor",b.anchor={},b.anchor.name=b.anchor.id=
    +d[1];else if(d=c.match(y)){e=c.match(z);c=c.match(A);b.type="email";var f=b.email={};f.address=d[1];e&&(f.subject=decodeURIComponent(e[1]));c&&(f.body=decodeURIComponent(c[1]))}else c&&(e=c.match(C))?(b.type="url",b.url={},b.url.protocol=e[1],b.url.url=e[2]):b.type="url";if(g){d=g.getAttribute("target");b.target={};b.adv={};if(d)d.match(D)?b.target.type=b.target.name=d:(b.target.type="frame",b.target.name=d);else if(d=(d=g.data("cke-pa-onclick")||g.getAttribute("onclick"))&&d.match(G)){b.target.type=
    +"popup";for(b.target.name=d[1];c=H.exec(d[2]);)("yes"==c[2]||"1"==c[2])&&!(c[1]in{height:1,width:1,top:1,left:1})?b.target[c[1]]=!0:isFinite(c[2])&&(b.target[c[1]]=c[2])}d=function(a,c){var d=g.getAttribute(c);null!==d&&(b.adv[a]=d||"")};d("advId","id");d("advLangDir","dir");d("advAccessKey","accessKey");b.adv.advName=g.data("cke-saved-name")||g.getAttribute("name")||"";d("advLangCode","lang");d("advTabIndex","tabindex");d("advTitle","title");d("advContentType","type");CKEDITOR.plugins.link.synAnchorSelector?
    +b.adv.advCSSClasses=v(g):d("advCSSClasses","class");d("advCharset","charset");d("advStyles","style");d("advRel","rel")}d=b.anchors=[];var h;if(CKEDITOR.plugins.link.emptyAnchorFix){f=a.document.getElementsByTag("a");c=0;for(e=f.count();c<e;c++)if(h=f.getItem(c),h.data("cke-saved-name")||h.hasAttribute("name"))d.push({name:h.data("cke-saved-name")||h.getAttribute("name"),id:h.getAttribute("id")})}else{f=new CKEDITOR.dom.nodeList(a.document.$.anchors);c=0;for(e=f.count();c<e;c++)h=f.getItem(c),d[c]=
    +{name:h.getAttribute("name"),id:h.getAttribute("id")}}if(CKEDITOR.plugins.link.fakeAnchor){f=a.document.getElementsByTag("img");c=0;for(e=f.count();c<e;c++)(h=CKEDITOR.plugins.link.tryRestoreFakeAnchor(a,f.getItem(c)))&&d.push({name:h.getAttribute("name"),id:h.getAttribute("id")})}this._.selectedElement=g;return b},j=function(a){a.target&&this.setValue(a.target[this.id]||"")},k=function(a){a.adv&&this.setValue(a.adv[this.id]||"")},l=function(a){a.target||(a.target={});a.target[this.id]=this.getValue()||
    +""},m=function(a){a.adv||(a.adv={});a.adv[this.id]=this.getValue()||""},o=n.config.emailProtection||"";o&&"encode"!=o&&(q=p=void 0,o.replace(/^([^(]+)\(([^)]+)\)$/,function(a,b,c){q=b;p=[];c.replace(/[^,\s]+/g,function(a){p.push(a)})}));var i=n.lang.common,b=n.lang.link;return{title:b.title,minWidth:350,minHeight:230,contents:[{id:"info",label:b.info,title:b.info,elements:[{id:"linkType",type:"select",label:b.type,"default":"url",items:[[b.toUrl,"url"],[b.toAnchor,"anchor"],[b.toEmail,"email"]],onChange:function(){var a=
    +this.getDialog(),b=["urlOptions","anchorOptions","emailOptions"],c=this.getValue(),d=a.definition.getContents("upload"),d=d&&d.hidden;if(c=="url"){n.config.linkShowTargetTab&&a.showPage("target");d||a.showPage("upload")}else{a.hidePage("target");d||a.hidePage("upload")}for(d=0;d<b.length;d++){var e=a.getContentElement("info",b[d]);if(e){e=e.getElement().getParent().getParent();b[d]==c+"Options"?e.show():e.hide()}}a.layout()},setup:function(a){a.type&&this.setValue(a.type)},commit:function(a){a.type=
    +this.getValue()}},{type:"vbox",id:"urlOptions",children:[{type:"hbox",widths:["25%","75%"],children:[{id:"protocol",type:"select",label:i.protocol,"default":"http://",items:[["http://鈥","http://"],["https://鈥","https://"],["ftp://鈥","ftp://"],["news://鈥","news://"],[b.other,""]],setup:function(a){a.url&&this.setValue(a.url.protocol||"")},commit:function(a){if(!a.url)a.url={};a.url.protocol=this.getValue()}},{type:"text",id:"url",label:i.url,required:!0,onLoad:function(){this.allowOnChange=true},onKeyUp:function(){this.allowOnChange=
    +false;var a=this.getDialog().getContentElement("info","protocol"),b=this.getValue(),c=/^((javascript:)|[#\/\.\?])/i,d=/^(http|https|ftp|news):\/\/(?=.)/i.exec(b);if(d){this.setValue(b.substr(d[0].length));a.setValue(d[0].toLowerCase())}else c.test(b)&&a.setValue("");this.allowOnChange=true},onChange:function(){if(this.allowOnChange)this.onKeyUp()},validate:function(){var a=this.getDialog();if(a.getContentElement("info","linkType")&&a.getValueOf("info","linkType")!="url")return true;if(/javascript\:/.test(this.getValue())){alert(i.invalidValue);
    +return false}return this.getDialog().fakeObj?true:CKEDITOR.dialog.validate.notEmpty(b.noUrl).apply(this)},setup:function(a){this.allowOnChange=false;a.url&&this.setValue(a.url.url);this.allowOnChange=true},commit:function(a){this.onChange();if(!a.url)a.url={};a.url.url=this.getValue();this.allowOnChange=false}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().show()}},{type:"button",id:"browse",hidden:"true",filebrowser:"info:url",label:i.browseServer}]},
    +{type:"vbox",id:"anchorOptions",width:260,align:"center",padding:0,children:[{type:"fieldset",id:"selectAnchorText",label:b.selectAnchor,setup:function(a){a.anchors.length>0?this.getElement().show():this.getElement().hide()},children:[{type:"hbox",id:"selectAnchor",children:[{type:"select",id:"anchorName","default":"",label:b.anchorName,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");for(var b=0;b<a.anchors.length;b++)a.anchors[b].name&&this.add(a.anchors[b].name);a.anchor&&
    +this.setValue(a.anchor.name);(a=this.getDialog().getContentElement("info","linkType"))&&a.getValue()=="email"&&this.focus()},commit:function(a){if(!a.anchor)a.anchor={};a.anchor.name=this.getValue()}},{type:"select",id:"anchorId","default":"",label:b.anchorId,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");for(var b=0;b<a.anchors.length;b++)a.anchors[b].id&&this.add(a.anchors[b].id);a.anchor&&this.setValue(a.anchor.id)},commit:function(a){if(!a.anchor)a.anchor={};a.anchor.id=
    +this.getValue()}}],setup:function(a){a.anchors.length>0?this.getElement().show():this.getElement().hide()}}]},{type:"html",id:"noAnchors",style:"text-align: center;",html:'<div role="note" tabIndex="-1">'+CKEDITOR.tools.htmlEncode(b.noAnchors)+"</div>",focus:!0,setup:function(a){a.anchors.length<1?this.getElement().show():this.getElement().hide()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}},{type:"vbox",id:"emailOptions",padding:1,children:[{type:"text",
    +id:"emailAddress",label:b.emailAddress,required:!0,validate:function(){var a=this.getDialog();return!a.getContentElement("info","linkType")||a.getValueOf("info","linkType")!="email"?true:CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this)},setup:function(a){a.email&&this.setValue(a.email.address);(a=this.getDialog().getContentElement("info","linkType"))&&a.getValue()=="email"&&this.select()},commit:function(a){if(!a.email)a.email={};a.email.address=this.getValue()}},{type:"text",id:"emailSubject",
    +label:b.emailSubject,setup:function(a){a.email&&this.setValue(a.email.subject)},commit:function(a){if(!a.email)a.email={};a.email.subject=this.getValue()}},{type:"textarea",id:"emailBody",label:b.emailBody,rows:3,"default":"",setup:function(a){a.email&&this.setValue(a.email.body)},commit:function(a){if(!a.email)a.email={};a.email.body=this.getValue()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}}]},{id:"target",requiredContent:"a[target]",label:b.target,
    +title:b.target,elements:[{type:"hbox",widths:["50%","50%"],children:[{type:"select",id:"linkTargetType",label:i.target,"default":"notSet",style:"width : 100%;",items:[[i.notSet,"notSet"],[b.targetFrame,"frame"],[b.targetPopup,"popup"],[i.targetNew,"_blank"],[i.targetTop,"_top"],[i.targetSelf,"_self"],[i.targetParent,"_parent"]],onChange:s,setup:function(a){a.target&&this.setValue(a.target.type||"notSet");s.call(this)},commit:function(a){if(!a.target)a.target={};a.target.type=this.getValue()}},{type:"text",
    +id:"linkTargetName",label:b.targetFrameName,"default":"",setup:function(a){a.target&&this.setValue(a.target.name)},commit:function(a){if(!a.target)a.target={};a.target.name=this.getValue().replace(/\W/gi,"")}}]},{type:"vbox",width:"100%",align:"center",padding:2,id:"popupFeatures",children:[{type:"fieldset",label:b.popupFeatures,children:[{type:"hbox",children:[{type:"checkbox",id:"resizable",label:b.popupResizable,setup:j,commit:l},{type:"checkbox",id:"status",label:b.popupStatusBar,setup:j,commit:l}]},
    +{type:"hbox",children:[{type:"checkbox",id:"location",label:b.popupLocationBar,setup:j,commit:l},{type:"checkbox",id:"toolbar",label:b.popupToolbar,setup:j,commit:l}]},{type:"hbox",children:[{type:"checkbox",id:"menubar",label:b.popupMenuBar,setup:j,commit:l},{type:"checkbox",id:"fullscreen",label:b.popupFullScreen,setup:j,commit:l}]},{type:"hbox",children:[{type:"checkbox",id:"scrollbars",label:b.popupScrollBars,setup:j,commit:l},{type:"checkbox",id:"dependent",label:b.popupDependent,setup:j,commit:l}]},
    +{type:"hbox",children:[{type:"text",widths:["50%","50%"],labelLayout:"horizontal",label:i.width,id:"width",setup:j,commit:l},{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:b.popupLeft,id:"left",setup:j,commit:l}]},{type:"hbox",children:[{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:i.height,id:"height",setup:j,commit:l},{type:"text",labelLayout:"horizontal",label:b.popupTop,widths:["50%","50%"],id:"top",setup:j,commit:l}]}]}]}]},{id:"upload",label:b.upload,title:b.upload,
    +hidden:!0,filebrowser:"uploadButton",elements:[{type:"file",id:"upload",label:i.upload,style:"height:40px",size:29},{type:"fileButton",id:"uploadButton",label:i.uploadSubmit,filebrowser:"info:url","for":["upload","upload"]}]},{id:"advanced",label:b.advanced,title:b.advanced,elements:[{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",id:"advId",requiredContent:"a[id]",label:b.id,setup:k,commit:m},{type:"select",id:"advLangDir",requiredContent:"a[dir]",
    +label:b.langDir,"default":"",style:"width:110px",items:[[i.notSet,""],[b.langDirLTR,"ltr"],[b.langDirRTL,"rtl"]],setup:k,commit:m},{type:"text",id:"advAccessKey",requiredContent:"a[accesskey]",width:"80px",label:b.acccessKey,maxLength:1,setup:k,commit:m}]},{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",label:b.name,id:"advName",requiredContent:"a[name]",setup:k,commit:m},{type:"text",label:b.langCode,id:"advLangCode",requiredContent:"a[lang]",width:"110px","default":"",setup:k,commit:m},
    +{type:"text",label:b.tabIndex,id:"advTabIndex",requiredContent:"a[tabindex]",width:"80px",maxLength:5,setup:k,commit:m}]}]},{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.advisoryTitle,requiredContent:"a[title]","default":"",id:"advTitle",setup:k,commit:m},{type:"text",label:b.advisoryContentType,requiredContent:"a[type]","default":"",id:"advContentType",setup:k,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.cssClasses,
    +requiredContent:"a(cke-xyz)","default":"",id:"advCSSClasses",setup:k,commit:m},{type:"text",label:b.charset,requiredContent:"a[charset]","default":"",id:"advCharset",setup:k,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.rel,requiredContent:"a[rel]","default":"",id:"advRel",setup:k,commit:m},{type:"text",label:b.styles,requiredContent:"a{cke-xyz}","default":"",id:"advStyles",validate:CKEDITOR.dialog.validate.inlineStyle(n.lang.common.invalidInlineStyle),setup:k,commit:m}]}]}]}],
    +onShow:function(){var a=this.getParentEditor(),b=a.getSelection(),c=null;(c=w.getSelectedLink(a))&&c.hasAttribute("href")?b.selectElement(c):c=null;this.setupContent(I.apply(this,[a,c]))},onOk:function(){var a={},b=[],c={},d=this.getParentEditor();this.commitContent(c);switch(c.type||"url"){case "url":var e=c.url&&c.url.protocol!=void 0?c.url.protocol:"http://",i=c.url&&CKEDITOR.tools.trim(c.url.url)||"";a["data-cke-saved-href"]=i.indexOf("/")===0?i:e+i;break;case "anchor":e=c.anchor&&c.anchor.id;
    +a["data-cke-saved-href"]="#"+(c.anchor&&c.anchor.name||e||"");break;case "email":var f=c.email,e=f.address;switch(o){case "":case "encode":var i=encodeURIComponent(f.subject||""),h=encodeURIComponent(f.body||""),f=[];i&&f.push("subject="+i);h&&f.push("body="+h);f=f.length?"?"+f.join("&"):"";if(o=="encode"){e=["javascript:void(location.href='mailto:'+",u(e)];f&&e.push("+'",r(f),"'");e.push(")")}else e=["mailto:",e,f];break;default:e=e.split("@",2);f.name=e[0];f.domain=e[1];e=["javascript:",t(f)]}a["data-cke-saved-href"]=
    +e.join("")}if(c.target)if(c.target.type=="popup"){for(var e=["window.open(this.href, '",c.target.name||"","', '"],j=["resizable","status","location","toolbar","menubar","fullscreen","scrollbars","dependent"],i=j.length,f=function(a){c.target[a]&&j.push(a+"="+c.target[a])},h=0;h<i;h++)j[h]=j[h]+(c.target[j[h]]?"=yes":"=no");f("width");f("left");f("height");f("top");e.push(j.join(","),"'); return false;");a["data-cke-pa-onclick"]=e.join("");b.push("target")}else{c.target.type!="notSet"&&c.target.name?
    +a.target=c.target.name:b.push("target");b.push("data-cke-pa-onclick","onclick")}if(c.adv){e=function(d,e){var f=c.adv[d];f?a[e]=f:b.push(e)};e("advId","id");e("advLangDir","dir");e("advAccessKey","accessKey");c.adv.advName?a.name=a["data-cke-saved-name"]=c.adv.advName:b=b.concat(["data-cke-saved-name","name"]);e("advLangCode","lang");e("advTabIndex","tabindex");e("advTitle","title");e("advContentType","type");e("advCSSClasses","class");e("advCharset","charset");e("advStyles","style");e("advRel","rel")}e=
    +d.getSelection();a.href=a["data-cke-saved-href"];if(this._.selectedElement){d=this._.selectedElement;i=d.data("cke-saved-href");f=d.getHtml();d.setAttributes(a);d.removeAttributes(b);c.adv&&(c.adv.advName&&CKEDITOR.plugins.link.synAnchorSelector)&&d.addClass(d.getChildCount()?"cke_anchor":"cke_anchor_empty");if(i==f||c.type=="email"&&f.indexOf("@")!=-1)d.setHtml(c.type=="email"?c.email.address:a["data-cke-saved-href"]);e.selectElement(d);delete this._.selectedElement}else{e=e.getRanges(1)[0];if(e.collapsed){d=
    +new CKEDITOR.dom.text(c.type=="email"?c.email.address:a["data-cke-saved-href"],d.document);e.insertNode(d);e.selectNodeContents(d)}d=new CKEDITOR.style({element:"a",attributes:a});d.type=CKEDITOR.STYLE_INLINE;d.applyToRange(e);e.select()}},onLoad:function(){n.config.linkShowAdvancedTab||this.hidePage("advanced");n.config.linkShowTargetTab||this.hidePage("target")},onFocus:function(){var a=this.getContentElement("info","linkType");if(a&&a.getValue()=="url"){a=this.getContentElement("info","url");a.select()}}}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/link/images/anchor.png b/src/main/webapp/plug-in/ckeditor/plugins/link/images/anchor.png
    new file mode 100644
    index 00000000..5025df58
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/link/images/anchor.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/liststyle/dialogs/liststyle.js b/src/main/webapp/plug-in/ckeditor/plugins/liststyle/dialogs/liststyle.js
    new file mode 100644
    index 00000000..40becff3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/liststyle/dialogs/liststyle.js
    @@ -0,0 +1,10 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +(function(){function d(c,d){var b;try{b=c.getSelection().getRanges()[0]}catch(f){return null}b.shrink(CKEDITOR.SHRINK_TEXT);return c.elementPath(b.getCommonAncestor()).contains(d,1)}function e(c,e){var b=c.lang.liststyle;if("bulletedListStyle"==e)return{title:b.bulletedTitle,minWidth:300,minHeight:50,contents:[{id:"info",accessKey:"I",elements:[{type:"select",label:b.type,id:"type",align:"center",style:"width:150px",items:[[b.notset,""],[b.circle,"circle"],[b.disc,"disc"],[b.square,"square"]],setup:function(a){this.setValue(a.getStyle("list-style-type")||
    +h[a.getAttribute("type")]||a.getAttribute("type")||"")},commit:function(a){var b=this.getValue();b?a.setStyle("list-style-type",b):a.removeStyle("list-style-type")}}]}],onShow:function(){var a=this.getParentEditor();(a=d(a,"ul"))&&this.setupContent(a)},onOk:function(){var a=this.getParentEditor();(a=d(a,"ul"))&&this.commitContent(a)}};if("numberedListStyle"==e){var g=[[b.notset,""],[b.lowerRoman,"lower-roman"],[b.upperRoman,"upper-roman"],[b.lowerAlpha,"lower-alpha"],[b.upperAlpha,"upper-alpha"],
    +[b.decimal,"decimal"]];(!CKEDITOR.env.ie||7<CKEDITOR.env.version)&&g.concat([[b.armenian,"armenian"],[b.decimalLeadingZero,"decimal-leading-zero"],[b.georgian,"georgian"],[b.lowerGreek,"lower-greek"]]);return{title:b.numberedTitle,minWidth:300,minHeight:50,contents:[{id:"info",accessKey:"I",elements:[{type:"hbox",widths:["25%","75%"],children:[{label:b.start,type:"text",id:"start",validate:CKEDITOR.dialog.validate.integer(b.validateStartNumber),setup:function(a){this.setValue(a.getFirst(f).getAttribute("value")||
    +a.getAttribute("start")||1)},commit:function(a){var b=a.getFirst(f),c=b.getAttribute("value")||a.getAttribute("start")||1;a.getFirst(f).removeAttribute("value");var d=parseInt(this.getValue(),10);isNaN(d)?a.removeAttribute("start"):a.setAttribute("start",d);a=b;b=c;for(d=isNaN(d)?1:d;(a=a.getNext(f))&&b++;)a.getAttribute("value")==b&&a.setAttribute("value",d+b-c)}},{type:"select",label:b.type,id:"type",style:"width: 100%;",items:g,setup:function(a){this.setValue(a.getStyle("list-style-type")||h[a.getAttribute("type")]||
    +a.getAttribute("type")||"")},commit:function(a){var b=this.getValue();b?a.setStyle("list-style-type",b):a.removeStyle("list-style-type")}}]}]}],onShow:function(){var a=this.getParentEditor();(a=d(a,"ol"))&&this.setupContent(a)},onOk:function(){var a=this.getParentEditor();(a=d(a,"ol"))&&this.commitContent(a)}}}}var f=function(c){return c.type==CKEDITOR.NODE_ELEMENT&&c.is("li")},h={a:"lower-alpha",A:"upper-alpha",i:"lower-roman",I:"upper-roman",1:"decimal",disc:"disc",circle:"circle",square:"square"};
    +CKEDITOR.dialog.add("numberedListStyle",function(c){return e(c,"numberedListStyle")});CKEDITOR.dialog.add("bulletedListStyle",function(c){return e(c,"bulletedListStyle")})})();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/magicline/images/icon.png b/src/main/webapp/plug-in/ckeditor/plugins/magicline/images/icon.png
    new file mode 100644
    index 00000000..b5de5ba9
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/magicline/images/icon.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/pagebreak/images/pagebreak.gif b/src/main/webapp/plug-in/ckeditor/plugins/pagebreak/images/pagebreak.gif
    new file mode 100644
    index 00000000..8d1cffd6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/pagebreak/images/pagebreak.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/pastefromword/filter/default.js b/src/main/webapp/plug-in/ckeditor/plugins/pastefromword/filter/default.js
    new file mode 100644
    index 00000000..8a9c6171
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/pastefromword/filter/default.js
    @@ -0,0 +1,1439 @@
    +锘/**
    + * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights
    + *          reserved. For licensing, see LICENSE.html or
    + *          http://ckeditor.com/license
    + */
    +
    +(function() {
    +	var fragmentPrototype = CKEDITOR.htmlParser.fragment.prototype, elementPrototype = CKEDITOR.htmlParser.element.prototype;
    +
    +	fragmentPrototype.onlyChild = elementPrototype.onlyChild = function() {
    +		var children = this.children, count = children.length, firstChild = (count == 1)
    +				&& children[0];
    +		return firstChild || null;
    +	};
    +
    +	elementPrototype.removeAnyChildWithName = function(tagName) {
    +		var children = this.children, childs = [], child;
    +
    +		for ( var i = 0; i < children.length; i++) {
    +			child = children[i];
    +			if (!child.name)
    +				continue;
    +
    +			if (child.name == tagName) {
    +				childs.push(child);
    +				children.splice(i--, 1);
    +			}
    +			childs = childs.concat(child.removeAnyChildWithName(tagName));
    +		}
    +		return childs;
    +	};
    +
    +	elementPrototype.getAncestor = function(tagNameRegex) {
    +		var parent = this.parent;
    +		while (parent && !(parent.name && parent.name.match(tagNameRegex)))
    +			parent = parent.parent;
    +		return parent;
    +	};
    +
    +	fragmentPrototype.firstChild = elementPrototype.firstChild = function(
    +			evaluator) {
    +		var child;
    +
    +		for ( var i = 0; i < this.children.length; i++) {
    +			child = this.children[i];
    +			if (evaluator(child))
    +				return child;
    +			else if (child.name) {
    +				child = child.firstChild(evaluator);
    +				if (child)
    +					return child;
    +			}
    +		}
    +
    +		return null;
    +	};
    +
    +	// Adding a (set) of styles to the element's 'style' attributes.
    +	elementPrototype.addStyle = function(name, value, isPrepend) {
    +		var styleText, addingStyleText = '';
    +		// name/value pair.
    +		if (typeof value == 'string')
    +			addingStyleText += name + ':' + value + ';';
    +		else {
    +			// style literal.
    +			if (typeof name == 'object') {
    +				for ( var style in name) {
    +					if (name.hasOwnProperty(style))
    +						addingStyleText += style + ':' + name[style] + ';';
    +				}
    +			}
    +			// raw style text form.
    +			else
    +				addingStyleText += name;
    +
    +			isPrepend = value;
    +		}
    +
    +		if (!this.attributes)
    +			this.attributes = {};
    +
    +		styleText = this.attributes.style || '';
    +
    +		styleText = (isPrepend ? [ addingStyleText, styleText ] : [ styleText,
    +				addingStyleText ]).join(';');
    +
    +		this.attributes.style = styleText.replace(/^;|;(?=;)/, '');
    +	};
    +
    +	// Retrieve a style property value of the element.
    +	elementPrototype.getStyle = function(name) {
    +		var styles = this.attributes.style;
    +		if (styles) {
    +			styles = CKEDITOR.tools.parseCssText(styles, 1);
    +			return styles[name];
    +		}
    +	};
    +
    +	/**
    +	 * Return the DTD-valid parent tag names of the specified one.
    +	 * 
    +	 * @member CKEDITOR.dtd
    +	 * @param {String}
    +	 *            tagName
    +	 * @returns {Object}
    +	 */
    +	CKEDITOR.dtd.parentOf = function(tagName) {
    +		var result = {};
    +		for ( var tag in this) {
    +			if (tag.indexOf('$') == -1 && this[tag][tagName])
    +				result[tag] = 1;
    +		}
    +		return result;
    +	};
    +
    +	// 1. move consistent list item styles up to list root.
    +	// 2. clear out unnecessary list item numbering.
    +	function postProcessList(list) {
    +		var children = list.children, child, attrs, count = list.children.length, match, mergeStyle, styleTypeRegexp = /list-style-type:(.*?)(?:;|$)/, stylesFilter = CKEDITOR.plugins.pastefromword.filters.stylesFilter;
    +
    +		attrs = list.attributes;
    +		if (styleTypeRegexp.exec(attrs.style))
    +			return;
    +
    +		for ( var i = 0; i < count; i++) {
    +			child = children[i];
    +
    +			if (child.attributes.value
    +					&& Number(child.attributes.value) == i + 1)
    +				delete child.attributes.value;
    +
    +			match = styleTypeRegexp.exec(child.attributes.style);
    +
    +			if (match) {
    +				if (match[1] == mergeStyle || !mergeStyle)
    +					mergeStyle = match[1];
    +				else {
    +					mergeStyle = null;
    +					break;
    +				}
    +			}
    +		}
    +
    +		if (mergeStyle) {
    +			for (i = 0; i < count; i++) {
    +				attrs = children[i].attributes;
    +				attrs.style
    +						&& (attrs.style = stylesFilter(
    +								[ [ 'list-style-type' ] ])(attrs.style)
    +								|| '');
    +			}
    +
    +			list.addStyle('list-style-type', mergeStyle);
    +		}
    +	}
    +
    +	var cssLengthRelativeUnit = /^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i;
    +	var emptyMarginRegex = /^(?:\b0[^\s]*\s*){1,4}$/; // e.g. 0px 0pt 0px
    +	var romanLiternalPattern = '^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$', lowerRomanLiteralRegex = new RegExp(
    +			romanLiternalPattern), upperRomanLiteralRegex = new RegExp(
    +			romanLiternalPattern.toUpperCase());
    +
    +	var orderedPatterns = {
    +		'decimal' : /\d+/,
    +		'lower-roman' : lowerRomanLiteralRegex,
    +		'upper-roman' : upperRomanLiteralRegex,
    +		'lower-alpha' : /^[a-z]+$/,
    +		'upper-alpha' : /^[A-Z]+$/
    +	}, unorderedPatterns = {
    +		'disc' : /[l\u00B7\u2002]/,
    +		'circle' : /[\u006F\u00D8]/,
    +		'square' : /[\u006E\u25C6]/
    +	}, listMarkerPatterns = {
    +		'ol' : orderedPatterns,
    +		'ul' : unorderedPatterns
    +	}, romans = [ [ 1000, 'M' ], [ 900, 'CM' ], [ 500, 'D' ], [ 400, 'CD' ],
    +			[ 100, 'C' ], [ 90, 'XC' ], [ 50, 'L' ], [ 40, 'XL' ], [ 10, 'X' ],
    +			[ 9, 'IX' ], [ 5, 'V' ], [ 4, 'IV' ], [ 1, 'I' ] ], alpahbets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    +
    +	// Convert roman numbering back to decimal.
    +	function fromRoman(str) {
    +		str = str.toUpperCase();
    +		var l = romans.length, retVal = 0;
    +		for ( var i = 0; i < l; ++i) {
    +			for ( var j = romans[i], k = j[1].length; str.substr(0, k) == j[1]; str = str
    +					.substr(k))
    +				retVal += j[0];
    +		}
    +		return retVal;
    +	}
    +
    +	// Convert alphabet numbering back to decimal.
    +	function fromAlphabet(str) {
    +		str = str.toUpperCase();
    +		var l = alpahbets.length, retVal = 1;
    +		for ( var x = 1; str.length > 0; x *= l) {
    +			retVal += alpahbets.indexOf(str.charAt(str.length - 1)) * x;
    +			str = str.substr(0, str.length - 1);
    +		}
    +		return retVal;
    +	}
    +
    +	var listBaseIndent = 0, previousListItemMargin = null, previousListId;
    +
    +	var plugin = (CKEDITOR.plugins.pastefromword = {
    +		utils : {
    +			// Create a <cke:listbullet> which indicate an list item type.
    +			createListBulletMarker : function(bullet, bulletText) {
    +				var marker = new CKEDITOR.htmlParser.element('cke:listbullet');
    +				marker.attributes = {
    +					'cke:listsymbol' : bullet[0]
    +				};
    +				marker.add(new CKEDITOR.htmlParser.text(bulletText));
    +				return marker;
    +			},
    +
    +			isListBulletIndicator : function(element) {
    +				var styleText = element.attributes && element.attributes.style;
    +				if (/mso-list\s*:\s*Ignore/i.test(styleText))
    +					return true;
    +			},
    +
    +			isContainingOnlySpaces : function(element) {
    +				var text;
    +				return ((text = element.onlyChild()) && (/^(:?\s|&nbsp;)+$/)
    +						.test(text.value));
    +			},
    +
    +			resolveList : function(element) {
    +				// <cke:listbullet> indicate a list item.
    +				var attrs = element.attributes, listMarker;
    +
    +				if ((listMarker = element
    +						.removeAnyChildWithName('cke:listbullet'))
    +						&& listMarker.length && (listMarker = listMarker[0])) {
    +					element.name = 'cke:li';
    +
    +					if (attrs.style) {
    +						attrs.style = plugin.filters
    +								.stylesFilter(
    +										[
    +												// Text-indent is not
    +												// representing list item level
    +												// any more.
    +												[ 'text-indent' ],
    +												[ 'line-height' ],
    +												// First attempt is to resolve
    +												// indent level from on a
    +												// constant margin increment.
    +												[
    +														(/^margin(:?-left)?$/),
    +														null,
    +														function(margin) {
    +															// Deal with
    +															// component/short-hand
    +															// form.
    +															var values = margin
    +																	.split(' ');
    +															margin = CKEDITOR.tools
    +																	.convertToPx(values[3]
    +																			|| values[1]
    +																			|| values[0]);
    +
    +															// Figure out the
    +															// indent unit by
    +															// checking the
    +															// first time of
    +															// incrementation.
    +															if (!listBaseIndent
    +																	&& previousListItemMargin !== null
    +																	&& margin > previousListItemMargin)
    +																listBaseIndent = margin
    +																		- previousListItemMargin;
    +
    +															previousListItemMargin = margin;
    +
    +															attrs['cke:indent'] = listBaseIndent
    +																	&& (Math
    +																			.ceil(margin
    +																					/ listBaseIndent) + 1)
    +																	|| 1;
    +														} ],
    +												// The best situation:
    +												// "mso-list:l0 level1 lfo2"
    +												// tells the belonged list root,
    +												// list item indentation, etc.
    +												[
    +														(/^mso-list$/),
    +														null,
    +														function(val) {
    +															val = val
    +																	.split(' ');
    +															var listId = Number(val[0]
    +																	.match(/\d+/)), indent = Number(val[1]
    +																	.match(/\d+/));
    +
    +															if (indent == 1) {
    +																listId !== previousListId
    +																		&& (attrs['cke:reset'] = 1);
    +																previousListId = listId;
    +															}
    +															attrs['cke:indent'] = indent;
    +														} ] ])(attrs.style,
    +										element)
    +								|| '';
    +					}
    +
    +					// First level list item might be presented without a
    +					// margin.
    +
    +					// In case all above doesn't apply.
    +					if (!attrs['cke:indent']) {
    +						previousListItemMargin = 0;
    +						attrs['cke:indent'] = 1;
    +					}
    +
    +					// Inherit attributes from bullet.
    +					CKEDITOR.tools.extend(attrs, listMarker.attributes);
    +					return true;
    +				}
    +				// Current list disconnected.
    +				else
    +					previousListId = previousListItemMargin = listBaseIndent = null;
    +
    +				return false;
    +			},
    +
    +			// Providing a shorthand style then retrieve one or more style
    +			// component values.
    +			getStyleComponents : (function() {
    +				var calculator = CKEDITOR.dom.element
    +						.createFromHtml(
    +								'<div style="position:absolute;left:-9999px;top:-9999px;"></div>',
    +								CKEDITOR.document);
    +				CKEDITOR.document.getBody().append(calculator);
    +
    +				return function(name, styleValue, fetchList) {
    +					calculator.setStyle(name, styleValue);
    +					var styles = {}, count = fetchList.length;
    +					for ( var i = 0; i < count; i++)
    +						styles[fetchList[i]] = calculator
    +								.getStyle(fetchList[i]);
    +
    +					return styles;
    +				};
    +			})(),
    +
    +			listDtdParents : CKEDITOR.dtd.parentOf('ol')
    +		},
    +
    +		filters : {
    +			// Transform a normal list into flat list items only presentation.
    +			// E.g. <ul><li>level1<ol><li>level2</li></ol></li> =>
    +			// <cke:li cke:listtype="ul" cke:indent="1">level1</cke:li>
    +			// <cke:li cke:listtype="ol" cke:indent="2">level2</cke:li>
    +			flattenList : function(element, level) {
    +				level = typeof level == 'number' ? level : 1;
    +
    +				var attrs = element.attributes, listStyleType;
    +
    +				// All list items are of the same type.
    +				switch (attrs.type) {
    +				case 'a':
    +					listStyleType = 'lower-alpha';
    +					break;
    +				case '1':
    +					listStyleType = 'decimal';
    +					break;
    +				// TODO: Support more list style type from MS-Word.
    +				}
    +
    +				var children = element.children, child;
    +
    +				for ( var i = 0; i < children.length; i++) {
    +					child = children[i];
    +
    +					if (child.name in CKEDITOR.dtd.$listItem) {
    +						var attributes = child.attributes, listItemChildren = child.children, count = listItemChildren.length, last = listItemChildren[count - 1];
    +
    +						// Move out nested list.
    +						if (last.name in CKEDITOR.dtd.$list) {
    +							element.add(last, i + 1);
    +
    +							// Remove the parent list item if it's just a
    +							// holder.
    +							if (!--listItemChildren.length)
    +								children.splice(i--, 1);
    +						}
    +
    +						child.name = 'cke:li';
    +
    +						// Inherit numbering from list root on the first list
    +						// item.
    +						attrs.start && !i && (attributes.value = attrs.start);
    +
    +						plugin.filters
    +								.stylesFilter(
    +										[
    +												[
    +														'tab-stops',
    +														null,
    +														function(val) {
    +															var margin = val
    +																	.split(' ')[1]
    +																	.match(cssLengthRelativeUnit);
    +															margin
    +																	&& (previousListItemMargin = CKEDITOR.tools
    +																			.convertToPx(margin[0]));
    +														} ],
    +												(level == 1 ? [
    +														'mso-list',
    +														null,
    +														function(val) {
    +															val = val
    +																	.split(' ');
    +															var listId = Number(val[0]
    +																	.match(/\d+/));
    +															listId !== previousListId
    +																	&& (attributes['cke:reset'] = 1);
    +															previousListId = listId;
    +														} ]
    +														: null) ])(
    +										attributes.style);
    +
    +						attributes['cke:indent'] = level;
    +						attributes['cke:listtype'] = element.name;
    +						attributes['cke:list-style-type'] = listStyleType;
    +					}
    +					// Flatten sub list.
    +					else if (child.name in CKEDITOR.dtd.$list) {
    +						// Absorb sub list children.
    +						arguments.callee.apply(this, [ child, level + 1 ]);
    +						children = children.slice(0, i).concat(child.children)
    +								.concat(children.slice(i + 1));
    +						element.children = [];
    +						for ( var j = 0, num = children.length; j < num; j++)
    +							element.add(children[j]);
    +					}
    +				}
    +
    +				delete element.name;
    +
    +				// We're loosing tag name here, signalize this element as a
    +				// list.
    +				attrs['cke:list'] = 1;
    +			},
    +
    +			// Try to collect all list items among the children and establish
    +			// one
    +			// or more HTML list structures for them.
    +			// @param element
    +			assembleList : function(element) {
    +				var children = element.children, child, listItem, // The
    +				// current
    +				// processing
    +				// cke:li
    +				// element.
    +				listItemAttrs, listItemIndent, // Indent level of current list
    +				// item.
    +				lastIndent, lastListItem, // The previous one just been added
    +				// to the list.
    +				list, // Current staging list and it's parent list if any.
    +				openedLists = [], previousListStyleType, previousListType;
    +
    +				// Properties of the list item are to be resolved from the list
    +				// bullet.
    +				var bullet, listType, listStyleType, itemNumeric;
    +
    +				for ( var i = 0; i < children.length; i++) {
    +					child = children[i];
    +
    +					if ('cke:li' == child.name) {
    +						child.name = 'li';
    +						listItem = child;
    +						listItemAttrs = listItem.attributes;
    +						bullet = listItemAttrs['cke:listsymbol'];
    +						bullet = bullet
    +								&& bullet.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);
    +						listType = listStyleType = itemNumeric = null;
    +
    +						if (listItemAttrs['cke:ignored']) {
    +							children.splice(i--, 1);
    +							continue;
    +						}
    +
    +						// This's from a new list root.
    +						listItemAttrs['cke:reset']
    +								&& (list = lastIndent = lastListItem = null);
    +
    +						// List item indent level might come from a real list
    +						// indentation or
    +						// been resolved from a pseudo list item's margin value,
    +						// even get
    +						// no indentation at all.
    +						listItemIndent = Number(listItemAttrs['cke:indent']);
    +
    +						// We're moving out of the current list, cleaning up.
    +						if (listItemIndent != lastIndent)
    +							previousListType = previousListStyleType = null;
    +
    +						// List type and item style are already resolved.
    +						if (!bullet) {
    +							listType = listItemAttrs['cke:listtype'] || 'ol';
    +							listStyleType = listItemAttrs['cke:list-style-type'];
    +						} else {
    +							// Probably share the same list style type with
    +							// previous list item,
    +							// give it priority to avoid ambiguous between
    +							// C(Alpha) and C.(Roman).
    +							if (previousListType
    +									&& listMarkerPatterns[previousListType][previousListStyleType]
    +											.test(bullet[1])) {
    +								listType = previousListType;
    +								listStyleType = previousListStyleType;
    +							} else {
    +								for ( var type in listMarkerPatterns) {
    +									for ( var style in listMarkerPatterns[type]) {
    +										if (listMarkerPatterns[type][style]
    +												.test(bullet[1])) {
    +											// Small numbering has higher
    +											// priority, when dealing with
    +											// ambiguous
    +											// between C(Alpha) and C.(Roman).
    +											if (type == 'ol'
    +													&& (/alpha|roman/)
    +															.test(style)) {
    +												var num = /roman/.test(style) ? fromRoman(bullet[1])
    +														: fromAlphabet(bullet[1]);
    +												if (!itemNumeric
    +														|| num < itemNumeric) {
    +													itemNumeric = num;
    +													listType = type;
    +													listStyleType = style;
    +												}
    +											} else {
    +												listType = type;
    +												listStyleType = style;
    +												break;
    +											}
    +										}
    +									}
    +								}
    +							}
    +
    +							// Simply use decimal/disc for the rest forms of
    +							// unrepresentable
    +							// numerals, e.g. Chinese..., but as long as there a
    +							// second part
    +							// included, it has a bigger chance of being a order
    +							// list ;)
    +							!listType && (listType = bullet[2] ? 'ol' : 'ul');
    +						}
    +
    +						previousListType = listType;
    +						previousListStyleType = listStyleType
    +								|| (listType == 'ol' ? 'decimal' : 'disc');
    +						if (listStyleType
    +								&& listStyleType != (listType == 'ol' ? 'decimal'
    +										: 'disc'))
    +							listItem.addStyle('list-style-type', listStyleType);
    +
    +						// Figure out start numbering.
    +						if (listType == 'ol' && bullet) {
    +							switch (listStyleType) {
    +							case 'decimal':
    +								itemNumeric = Number(bullet[1]);
    +								break;
    +							case 'lower-roman':
    +							case 'upper-roman':
    +								itemNumeric = fromRoman(bullet[1]);
    +								break;
    +							case 'lower-alpha':
    +							case 'upper-alpha':
    +								itemNumeric = fromAlphabet(bullet[1]);
    +								break;
    +							}
    +
    +							// Always create the numbering, swipe out
    +							// unnecessary ones later.
    +							listItem.attributes.value = itemNumeric;
    +						}
    +
    +						// Start the list construction.
    +						if (!list) {
    +							openedLists
    +									.push(list = new CKEDITOR.htmlParser.element(
    +											listType));
    +							list.add(listItem);
    +							children[i] = list;
    +						} else {
    +							if (listItemIndent > lastIndent) {
    +								openedLists
    +										.push(list = new CKEDITOR.htmlParser.element(
    +												listType));
    +								list.add(listItem);
    +								lastListItem.add(list);
    +							} else if (listItemIndent < lastIndent) {
    +								// There might be a negative gap between two
    +								// list levels. (#4944)
    +								var diff = lastIndent - listItemIndent, parent;
    +								while (diff-- && (parent = list.parent))
    +									list = parent.parent;
    +
    +								list.add(listItem);
    +							} else
    +								list.add(listItem);
    +
    +							children.splice(i--, 1);
    +						}
    +
    +						lastListItem = listItem;
    +						lastIndent = listItemIndent;
    +					} else if (list)
    +						list = lastIndent = lastListItem = null;
    +				}
    +
    +				for (i = 0; i < openedLists.length; i++)
    +					postProcessList(openedLists[i]);
    +
    +				list = lastIndent = lastListItem = previousListId = previousListItemMargin = listBaseIndent = null;
    +			},
    +
    +			// A simple filter which always rejecting.
    +			falsyFilter : function(value) {
    +				return false;
    +			},
    +
    +			// A filter dedicated on the 'style' attribute filtering, e.g.
    +			// dropping/replacing style properties.
    +			// @param styles {Array} in form of [ styleNameRegexp,
    +			// styleValueRegexp,
    +			// newStyleValue/newStyleGenerator, newStyleName ] where only the
    +			// first
    +			// parameter is mandatory.
    +			// @param whitelist {Boolean} Whether the {@param styles} will be
    +			// considered as a white-list.
    +			stylesFilter : function(styles, whitelist) {
    +				return function(styleText, element) {
    +					var rules = [];
    +					// html-encoded quote might be introduced by 'font-family'
    +					// from MS-Word which confused the following regexp. e.g.
    +					// 'font-family: &quot;Lucida, Console&quot;'
    +					(styleText || '')
    +							.replace(/&quot;/g, '"')
    +							.replace(
    +									/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,
    +									function(match, name, value) {
    +										name = name.toLowerCase();
    +										name == 'font-family'
    +												&& (value = value.replace(
    +														/["']/g, ''));
    +
    +										var namePattern, valuePattern, newValue, newName;
    +										for ( var i = 0; i < styles.length; i++) {
    +											if (styles[i]) {
    +												namePattern = styles[i][0];
    +												valuePattern = styles[i][1];
    +												newValue = styles[i][2];
    +												newName = styles[i][3];
    +
    +												if (name.match(namePattern)
    +														&& (!valuePattern || value
    +																.match(valuePattern))) {
    +													name = newName || name;
    +													whitelist
    +															&& (newValue = newValue
    +																	|| value);
    +
    +													if (typeof newValue == 'function')
    +														newValue = newValue(
    +																value, element,
    +																name);
    +
    +													// Return an couple indicate
    +													// both name and value
    +													// changed.
    +													if (newValue
    +															&& newValue.push)
    +																name = newValue[0],
    +																newValue = newValue[1];
    +
    +													if (typeof newValue == 'string')
    +														rules.push([ name,
    +																newValue ]);
    +													return;
    +												}
    +											}
    +										}
    +
    +										!whitelist
    +												&& rules.push([ name, value ]);
    +
    +									});
    +
    +					for ( var i = 0; i < rules.length; i++)
    +						rules[i] = rules[i].join(':');
    +					return rules.length ? (rules.join(';') + ';') : false;
    +				};
    +			},
    +
    +			// Migrate the element by decorate styles on it.
    +			// @param styleDefinition
    +			// @param variables
    +			elementMigrateFilter : function(styleDefinition, variables) {
    +				return styleDefinition ? function(element) {
    +					var styleDef = variables ? new CKEDITOR.style(
    +							styleDefinition, variables)._.definition
    +							: styleDefinition;
    +					element.name = styleDef.element;
    +					CKEDITOR.tools.extend(element.attributes, CKEDITOR.tools
    +							.clone(styleDef.attributes));
    +					element.addStyle(CKEDITOR.style.getStyleText(styleDef));
    +				} : function() {
    +				};
    +			},
    +
    +			// Migrate styles by creating a new nested stylish element.
    +			// @param styleDefinition
    +			styleMigrateFilter : function(styleDefinition, variableName) {
    +
    +				var elementMigrateFilter = this.elementMigrateFilter;
    +				return styleDefinition ? function(value, element) {
    +					// Build an stylish element first.
    +					var styleElement = new CKEDITOR.htmlParser.element(null), variables = {};
    +
    +					variables[variableName] = value;
    +					elementMigrateFilter(styleDefinition, variables)(
    +							styleElement);
    +					// Place the new element inside the existing span.
    +					styleElement.children = element.children;
    +					element.children = [ styleElement ];
    +
    +					// #10285 - later on styleElement will replace element if
    +					// element won't have any attributes.
    +					// However, in some cases styleElement is identical to
    +					// element and therefore should not be filtered
    +					// to avoid inf loop. Unfortunately calling
    +					// element.filterChildren() does not prevent from that
    +					// (#10327).
    +					// However, we can assume that we don't need to filter
    +					// styleElement at all, so it is safe to replace
    +					// its filter method.
    +					styleElement.filter = function() {
    +					};
    +					styleElement.parent = element;
    +				}
    +						: function() {
    +						};
    +			},
    +
    +			// A filter which remove cke-namespaced-attribute on
    +			// all none-cke-namespaced elements.
    +			// @param value
    +			// @param element
    +			bogusAttrFilter : function(value, element) {
    +				if (element.name.indexOf('cke:') == -1)
    +					return false;
    +			},
    +
    +			// A filter which will be used to apply inline css style according
    +			// the stylesheet
    +			// definition rules, is generated lazily when filtering.
    +			applyStyleFilter : null
    +
    +		},
    +
    +		getRules : function(editor, filter) {
    +			var dtd = CKEDITOR.dtd, blockLike = CKEDITOR.tools.extend({},
    +					dtd.$block, dtd.$listItem, dtd.$tableContent), config = editor.config, filters = this.filters, falsyFilter = filters.falsyFilter, stylesFilter = filters.stylesFilter, elementMigrateFilter = filters.elementMigrateFilter, styleMigrateFilter = CKEDITOR.tools
    +					.bind(this.filters.styleMigrateFilter, this.filters), createListBulletMarker = this.utils.createListBulletMarker, flattenList = filters.flattenList, assembleList = filters.assembleList, isListBulletIndicator = this.utils.isListBulletIndicator, containsNothingButSpaces = this.utils.isContainingOnlySpaces, resolveListItem = this.utils.resolveList, convertToPx = function(
    +					value) {
    +				value = CKEDITOR.tools.convertToPx(value);
    +				return isNaN(value) ? value : value + 'px';
    +			}, getStyleComponents = this.utils.getStyleComponents, listDtdParents = this.utils.listDtdParents, removeFontStyles = config.pasteFromWordRemoveFontStyles !== false, removeStyles = config.pasteFromWordRemoveStyles !== false;
    +
    +			return {
    +
    +				elementNames : [
    +				// Remove script, meta and link elements.
    +				[ (/meta|link|script/), '' ] ],
    +
    +				root : function(element) {
    +					element.filterChildren(filter);
    +					assembleList(element);
    +				},
    +
    +				elements : {
    +					'^' : function(element) {
    +						// Transform CSS style declaration to inline style.
    +						var applyStyleFilter;
    +						if (CKEDITOR.env.gecko
    +								&& (applyStyleFilter = filters.applyStyleFilter))
    +							applyStyleFilter(element);
    +					},
    +
    +					$ : function(element) {
    +						var tagName = element.name || '', attrs = element.attributes;
    +
    +						// Convert length unit of width/height on blocks to
    +						// a more editor-friendly way (px).
    +						if (tagName in blockLike && attrs.style) {
    +							attrs.style = stylesFilter(
    +									[ [ (/^(:?width|height)$/), null,
    +											convertToPx ] ])(attrs.style)
    +									|| '';
    +						}
    +
    +						// Processing headings.
    +						if (tagName.match(/h\d/)) {
    +							element.filterChildren(filter);
    +							// Is the heading actually a list item?
    +							if (resolveListItem(element))
    +								return;
    +
    +							// Adapt heading styles to editor's convention.
    +							elementMigrateFilter(config['format_' + tagName])(
    +									element);
    +						}
    +						// Remove inline elements which contain only empty
    +						// spaces.
    +						else if (tagName in dtd.$inline) {
    +							element.filterChildren(filter);
    +							if (containsNothingButSpaces(element))
    +								delete element.name;
    +						}
    +						// Remove element with ms-office namespace,
    +						// with it's content preserved, e.g. 'o:p'.
    +						else if (tagName.indexOf(':') != -1
    +								&& tagName.indexOf('cke') == -1) {
    +							element.filterChildren(filter);
    +
    +							// Restore image real link from vml.
    +							if (tagName == 'v:imagedata') {
    +								var href = element.attributes['o:href'];
    +								if (href)
    +									element.attributes.src = href;
    +								element.name = 'img';
    +								return;
    +							}
    +							delete element.name;
    +						}
    +
    +						// Assembling list items into a whole list.
    +						if (tagName in listDtdParents) {
    +							element.filterChildren(filter);
    +							assembleList(element);
    +						}
    +					},
    +
    +					// We'll drop any style sheet, but Firefox conclude
    +					// certain styles in a single style element, which are
    +					// required to be changed into inline ones.
    +					'style' : function(element) {
    +						if (CKEDITOR.env.gecko) {
    +							// Grab only the style definition section.
    +							var styleDefSection = element.onlyChild().value
    +									.match(/\/\* Style Definitions \*\/([\s\S]*?)\/\*/), styleDefText = styleDefSection
    +									&& styleDefSection[1], rules = {}; // Storing
    +							// the
    +							// parsed
    +							// result.
    +
    +							if (styleDefText) {
    +								styleDefText
    +										// Remove line-breaks.
    +										.replace(/[\n\r]/g, '')
    +										// Extract selectors and style
    +										// properties.
    +										.replace(
    +												/(.+?)\{(.+?)\}/g,
    +												function(rule, selectors,
    +														styleBlock) {
    +													selectors = selectors
    +															.split(',');
    +													var length = selectors.length, selector;
    +													for ( var i = 0; i < length; i++) {
    +														// Assume MS-Word mostly
    +														// generate only simple
    +														// selector( [Type
    +														// selector][Class
    +														// selector]).
    +														CKEDITOR.tools
    +																.trim(
    +																		selectors[i])
    +																.replace(
    +																		/^(\w+)(\.[\w-]+)?$/g,
    +																		function(
    +																				match,
    +																				tagName,
    +																				className) {
    +																			tagName = tagName
    +																					|| '*';
    +																			className = className
    +																					.substring(
    +																							1,
    +																							className.length);
    +
    +																			// Reject
    +																			// MS-Word
    +																			// Normal
    +																			// styles.
    +																			if (className
    +																					.match(/MsoNormal/))
    +																				return;
    +
    +																			if (!rules[tagName])
    +																				rules[tagName] = {};
    +																			if (className)
    +																				rules[tagName][className] = styleBlock;
    +																			else
    +																				rules[tagName] = styleBlock;
    +																		});
    +													}
    +												});
    +
    +								filters.applyStyleFilter = function(element) {
    +									var name = rules['*'] ? '*' : element.name, className = element.attributes
    +											&& element.attributes['class'], style;
    +									if (name in rules) {
    +										style = rules[name];
    +										if (typeof style == 'object')
    +											style = style[className];
    +										// Maintain style rules priorities.
    +										style && element.addStyle(style, true);
    +									}
    +								};
    +							}
    +						}
    +						return false;
    +					},
    +
    +					'p' : function(element) {
    +						// A a fall-back approach to resolve list item in
    +						// browsers
    +						// that doesn't include "mso-list:Ignore" on list
    +						// bullets,
    +						// note it's not perfect as not all list style (e.g.
    +						// "heading list") is shipped
    +						// with this pattern. (#6662)
    +						if ((/MsoListParagraph/i)
    +								.exec(element.attributes['class'])
    +								|| element.getStyle('mso-list')) {
    +							var bulletText = element
    +									.firstChild(function(node) {
    +										return node.type == CKEDITOR.NODE_TEXT
    +												&& !containsNothingButSpaces(node.parent);
    +									});
    +
    +							var bullet = bulletText && bulletText.parent;
    +							if (bullet) {
    +								bullet.addStyle('mso-list', 'Ignore');
    +							}
    +						}
    +
    +						element.filterChildren(filter);
    +
    +						// Is the paragraph actually a list item?
    +						if (resolveListItem(element))
    +							return;
    +
    +						// Adapt paragraph formatting to editor's convention
    +						// according to enter-mode.
    +						if (config.enterMode == CKEDITOR.ENTER_BR) {
    +							// We suffer from attribute/style lost in this
    +							// situation.
    +							delete element.name;
    +							element.add(new CKEDITOR.htmlParser.element('br'));
    +						} else
    +							elementMigrateFilter(
    +									config['format_'
    +											+ (config.enterMode == CKEDITOR.ENTER_P ? 'p'
    +													: 'div')])(element);
    +					},
    +
    +					'div' : function(element) {
    +						// Aligned table with no text surrounded is represented
    +						// by a wrapper div, from which
    +						// table cells inherit as text-align styles, which is
    +						// wrong.
    +						// Instead we use a clear-float div after the table to
    +						// properly achieve the same layout.
    +						var singleChild = element.onlyChild();
    +						if (singleChild && singleChild.name == 'table') {
    +							var attrs = element.attributes;
    +							singleChild.attributes = CKEDITOR.tools.extend(
    +									singleChild.attributes, attrs);
    +							attrs.style && singleChild.addStyle(attrs.style);
    +
    +							var clearFloatDiv = new CKEDITOR.htmlParser.element(
    +									'div');
    +							clearFloatDiv.addStyle('clear', 'both');
    +							element.add(clearFloatDiv);
    +							delete element.name;
    +						}
    +					},
    +
    +					'td' : function(element) {
    +						// 'td' in 'thead' is actually <th>.
    +						if (element.getAncestor('thead'))
    +							element.name = 'th';
    +					},
    +
    +					// MS-Word sometimes present list as a mixing of normal list
    +					// and pseudo-list, normalize the previous ones into pseudo
    +					// form.
    +					'ol' : flattenList,
    +					'ul' : flattenList,
    +					'dl' : flattenList,
    +
    +					'font' : function(element) {
    +						// Drop the font tag if it comes from list bullet text.
    +						if (isListBulletIndicator(element.parent)) {
    +							delete element.name;
    +							return;
    +						}
    +
    +						element.filterChildren(filter);
    +
    +						var attrs = element.attributes, styleText = attrs.style, parent = element.parent;
    +
    +						if ('font' == parent.name) // Merge nested <font> tags.
    +						{
    +							CKEDITOR.tools.extend(parent.attributes,
    +									element.attributes);
    +							styleText && parent.addStyle(styleText);
    +							delete element.name;
    +						}
    +						// Convert the merged into a span with all attributes
    +						// preserved.
    +						else {
    +							styleText = styleText || '';
    +							// IE's having those deprecated attributes,
    +							// normalize them.
    +							if (attrs.color) {
    +								attrs.color != '#000000'
    +										&& (styleText += 'color:' + attrs.color
    +												+ ';');
    +								delete attrs.color;
    +							}
    +							if (attrs.face) {
    +								styleText += 'font-family:' + attrs.face + ';';
    +								delete attrs.face;
    +							}
    +							// TODO: Mapping size in ranges of xx-small,
    +							// x-small, small, medium, large, x-large, xx-large.
    +							if (attrs.size) {
    +								styleText += 'font-size:'
    +										+ (attrs.size > 3 ? 'large'
    +												: (attrs.size < 3 ? 'small'
    +														: 'medium')) + ';';
    +								delete attrs.size;
    +							}
    +
    +							element.name = 'span';
    +							element.addStyle(styleText);
    +						}
    +					},
    +
    +					'span' : function(element) {
    +						// Remove the span if it comes from list bullet text.
    +						if (isListBulletIndicator(element.parent))
    +							return false;
    +
    +						element.filterChildren(filter);
    +						if (containsNothingButSpaces(element)) {
    +							delete element.name;
    +							return null;
    +						}
    +
    +						// List item bullet type is supposed to be indicated by
    +						// the text of a span with style 'mso-list : Ignore' or
    +						// an image.
    +						if (isListBulletIndicator(element)) {
    +							var listSymbolNode = element.firstChild(function(
    +									node) {
    +								return node.value || node.name == 'img';
    +							});
    +
    +							var listSymbol = listSymbolNode
    +									&& (listSymbolNode.value || 'l.'), listType = listSymbol
    +									&& listSymbol
    +											.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);
    +
    +							if (listType) {
    +								var marker = createListBulletMarker(listType,
    +										listSymbol);
    +								// Some non-existed list items might be carried
    +								// by an inconsequential list, indicate by
    +								// "mso-hide:all/display:none",
    +								// those are to be removed later, now mark it
    +								// with "cke:ignored".
    +								var ancestor = element.getAncestor('span');
    +								if (ancestor
    +										&& (/ mso-hide:\s*all|display:\s*none /)
    +												.test(ancestor.attributes.style))
    +									marker.attributes['cke:ignored'] = 1;
    +								return marker;
    +							}
    +						}
    +
    +						// Update the src attribute of image element with href.
    +						var children = element.children, attrs = element.attributes, styleText = attrs
    +								&& attrs.style, firstChild = children
    +								&& children[0];
    +
    +						// Assume MS-Word mostly carry font related styles on
    +						// <span>,
    +						// adapting them to editor's convention.
    +						if (styleText) {
    +							attrs.style = stylesFilter(
    +									[
    +											// Drop 'inline-height' style which
    +											// make lines overlapping.
    +											[ 'line-height' ],
    +											[
    +													(/^font-family$/),
    +													null,
    +													!removeFontStyles ? styleMigrateFilter(
    +															config['font_style'],
    +															'family')
    +															: null ],
    +											[
    +													(/^font-size$/),
    +													null,
    +													!removeFontStyles ? styleMigrateFilter(
    +															config['fontSize_style'],
    +															'size')
    +															: null ],
    +											[
    +													(/^color$/),
    +													null,
    +													!removeFontStyles ? styleMigrateFilter(
    +															config['colorButton_foreStyle'],
    +															'color')
    +															: null ],
    +											[
    +													(/^background-color$/),
    +													null,
    +													!removeFontStyles ? styleMigrateFilter(
    +															config['colorButton_backStyle'],
    +															'color')
    +															: null ] ])(
    +									styleText, element)
    +									|| '';
    +						}
    +
    +						if (!attrs.style)
    +							delete attrs.style;
    +
    +						if (CKEDITOR.tools.isEmpty(attrs))
    +							delete element.name;
    +
    +						return null;
    +					},
    +
    +					// Migrate basic style formats to editor configured ones.
    +					'b' : elementMigrateFilter(config['coreStyles_bold']),
    +					'i' : elementMigrateFilter(config['coreStyles_italic']),
    +					'u' : elementMigrateFilter(config['coreStyles_underline']),
    +					's' : elementMigrateFilter(config['coreStyles_strike']),
    +					'sup' : elementMigrateFilter(config['coreStyles_superscript']),
    +					'sub' : elementMigrateFilter(config['coreStyles_subscript']),
    +					// Editor doesn't support anchor with content currently
    +					// (#3582),
    +					// drop such anchors with content preserved.
    +					'a' : function(element) {
    +						var attrs = element.attributes;
    +						if (attrs && !attrs.href && attrs.name)
    +							delete element.name;
    +						else if (CKEDITOR.env.webkit && attrs.href
    +								&& attrs.href.match(/file:\/\/\/[\S]+#/i))
    +							attrs.href = attrs.href.replace(
    +									/file:\/\/\/[^#]+/i, '');
    +					},
    +					'cke:listbullet' : function(element) {
    +						if (element.getAncestor(/h\d/)
    +								&& !config.pasteFromWordNumberedHeadingToList)
    +							delete element.name;
    +					}
    +				},
    +
    +				attributeNames : [
    +				// Remove onmouseover and onmouseout events (from MS Word
    +				// comments effect)
    +				[ (/^onmouse(:?out|over)/), '' ],
    +				// Onload on image element.
    +				[ (/^onload$/), '' ],
    +				// Remove office and vml attribute from elements.
    +				[ (/(?:v|o):\w+/), '' ],
    +				// Remove lang/language attributes.
    +				[ (/^lang/), '' ] ],
    +
    +				attributes : {
    +					'style' : stylesFilter(
    +							removeStyles ?
    +							// Provide a white-list of styles that we preserve,
    +							// those should
    +							// be the ones that could later be altered with
    +							// editor tools.
    +							[
    +									// Leave list-style-type
    +									[ (/^list-style-type$/), null ],
    +
    +									// Preserve margin-left/right which used as
    +									// default indent style in the editor.
    +									[
    +											(/^margin$|^margin-(?!bottom|top)/),
    +											null,
    +											function(value, element, name) {
    +												if (element.name in {
    +													p : 1,
    +													div : 1
    +												}) {
    +													var indentStyleName = config.contentsLangDirection == 'ltr' ? 'margin-left'
    +															: 'margin-right';
    +
    +													// Extract component value
    +													// from 'margin' shorthand.
    +													if (name == 'margin') {
    +														value = getStyleComponents(
    +																name,
    +																value,
    +																[ indentStyleName ])[indentStyleName];
    +													} else if (name != indentStyleName)
    +														return null;
    +
    +													if (value
    +															&& !emptyMarginRegex
    +																	.test(value))
    +														return [
    +																indentStyleName,
    +																value ];
    +												}
    +
    +												return null;
    +											} ],
    +
    +									// Preserve clear float style.
    +									[ (/^clear$/) ],
    +
    +									[
    +											(/^border.*|margin.*|vertical-align|float$/),
    +											null, function(value, element) {
    +												if (element.name == 'img')
    +													return value;
    +											} ],
    +
    +									[ (/^width|height$/), null,
    +											function(value, element) {
    +												if (element.name in {
    +													table : 1,
    +													td : 1,
    +													th : 1,
    +													img : 1
    +												})
    +													return value;
    +											} ] ]
    +									:
    +									// Otherwise provide a black-list of styles
    +									// that we remove.
    +									[
    +											[ (/^mso-/) ],
    +											// Fixing color values.
    +											[
    +													(/-color$/),
    +													null,
    +													function(value) {
    +														if (value == 'transparent')
    +															return false;
    +														if (CKEDITOR.env.gecko)
    +															return value
    +																	.replace(
    +																			/-moz-use-text-color/g,
    +																			'transparent');
    +													} ],
    +											// Remove empty margin values, e.g.
    +											// 0.00001pt 0em 0pt
    +											[ (/^margin$/), emptyMarginRegex ],
    +											[ 'text-indent', '0cm' ],
    +											[ 'page-break-before' ],
    +											[ 'tab-stops' ],
    +											[ 'display', 'none' ],
    +											removeFontStyles ? [ (/font-?/) ]
    +													: null ], removeStyles),
    +
    +					// Prefer width styles over 'width' attributes.
    +					'width' : function(value, element) {
    +						if (element.name in dtd.$tableContent)
    +							return false;
    +					},
    +					// Prefer border styles over table 'border' attributes.
    +					'border' : function(value, element) {
    +						if (element.name in dtd.$tableContent)
    +							return false;
    +					},
    +
    +					// Only Firefox carry style sheet from MS-Word, which
    +					// will be applied by us manually. For other browsers
    +					// the css className is useless.
    +					'class' : falsyFilter,
    +
    +					// MS-Word always generate 'background-color' along with
    +					// 'bgcolor',
    +					// simply drop the deprecated attributes.
    +					'bgcolor' : falsyFilter,
    +
    +					// Deprecate 'valign' attribute in favor of
    +					// 'vertical-align'.
    +					'valign' : removeStyles ? falsyFilter : function(value,
    +							element) {
    +						element.addStyle('vertical-align', value);
    +						return false;
    +					}
    +				},
    +
    +				// Fore none-IE, some useful data might be buried under these
    +				// IE-conditional
    +				// comments where RegExp were the right approach to dig them out
    +				// where usual approach
    +				// is transform it into a fake element node which hold the
    +				// desired data.
    +				comment : !CKEDITOR.env.ie ? function(value, node) {
    +					var imageInfo = value.match(/<img.*?>/), listInfo = value
    +							.match(/^\[if !supportLists\]([\s\S]*?)\[endif\]$/);
    +
    +					// Seek for list bullet indicator.
    +					if (listInfo) {
    +						// Bullet symbol could be either text or an image.
    +						var listSymbol = listInfo[1] || (imageInfo && 'l.'), listType = listSymbol
    +								&& listSymbol
    +										.match(/>(?:[(]?)([^\s]+?)([.)]?)</);
    +						return createListBulletMarker(listType, listSymbol);
    +					}
    +
    +					// Reveal the <img> element in conditional comments for
    +					// Firefox.
    +					if (CKEDITOR.env.gecko && imageInfo) {
    +						var img = CKEDITOR.htmlParser.fragment
    +								.fromHtml(imageInfo[0]).children[0], previousComment = node.previous,
    +						// Try to dig the real image link from vml markup from
    +						// previous comment text.
    +						imgSrcInfo = previousComment
    +								&& previousComment.value
    +										.match(/<v:imagedata[^>]*o:href=['"](.*?)['"]/), imgSrc = imgSrcInfo
    +								&& imgSrcInfo[1];
    +
    +						// Is there a real 'src' url to be used?
    +						imgSrc && (img.attributes.src = imgSrc);
    +						return img;
    +					}
    +
    +					return false;
    +				}
    +						: falsyFilter
    +			};
    +		}
    +	});
    +
    +	// The paste processor here is just a reduced copy of html data processor.
    +	var pasteProcessor = function() {
    +		this.dataFilter = new CKEDITOR.htmlParser.filter();
    +	};
    +
    +	pasteProcessor.prototype = {
    +		toHtml : function(data) {
    +			var fragment = CKEDITOR.htmlParser.fragment.fromHtml(data), writer = new CKEDITOR.htmlParser.basicWriter();
    +
    +			fragment.writeHtml(writer, this.dataFilter);
    +			return writer.getHtml(true);
    +		}
    +	};
    +
    +	CKEDITOR.cleanWord = function(data, editor) {
    +		// Firefox will be confused by those downlevel-revealed IE conditional
    +		// comments, fixing them first( convert it to upperlevel-revealed one ).
    +		// e.g. <![if !vml]>...<![endif]>
    +		if (CKEDITOR.env.gecko)
    +			data = data.replace(
    +					/(<!--\[if[^<]*?\])-->([\S\s]*?)<!--(\[endif\]-->)/gi,
    +					'$1$2$3');
    +
    +		// #9456 - Webkit doesn't wrap list number with span, which is crucial
    +		// for filter to recognize list.
    +		//
    +		// <p class="MsoListParagraphCxSpLast"
    +		// style="text-indent:-18.0pt;mso-list:l0 level1 lfo2">
    +		// <!--[if !supportLists]-->
    +		// 3.<span style="font-size: 7pt; line-height: normal; font-family:
    +		// 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
    +		// <!--[endif]-->Test3<o:p></o:p>
    +		// </p>
    +		//
    +		// Transform to:
    +		//
    +		// <p class="MsoListParagraphCxSpLast"
    +		// style="text-indent:-18.0pt;mso-list:l0 level1 lfo2">
    +		// <!--[if !supportLists]-->
    +		// <span>
    +		// 3.<span style="font-size: 7pt; line-height: normal; font-family:
    +		// 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
    +		// </span>
    +		// <!--[endif]-->Test3<o:p></o:p>
    +		// </p>
    +		if (CKEDITOR.env.webkit) {
    +			data = data
    +					.replace(
    +							/(class="MsoListParagraph[^>]+><!--\[if !supportLists\]-->)([^<]+<span[^<]+<\/span>)(<!--\[endif\]-->)/gi,
    +							'$1<span>$2</span>$3');
    +		}
    +
    +		var dataProcessor = new pasteProcessor(), dataFilter = dataProcessor.dataFilter;
    +
    +		// These rules will have higher priorities than default ones.
    +		dataFilter.addRules(CKEDITOR.plugins.pastefromword.getRules(editor,
    +				dataFilter));
    +
    +		// Allow extending data filter rules.
    +		editor.fire('beforeCleanWord', {
    +			filter : dataFilter
    +		});
    +		
    +//		try {
    +//			data = dataProcessor.toHtml(data);
    +//		} catch (e) {
    +//			alert(editor.lang.pastefromword.error);
    +//		}
    +		
    +		
    +		// Below post processing those things that are unable to delivered by
    +		// filter rules.
    +		// Remove 'cke' namespaced attribute used in filter rules as marker.
    +		data = data.replace(/cke:.*?".*?"/g, '');
    +		// Remove empty style attribute.
    +		data = data.replace(/style=""/g, '');
    +		// Remove the dummy spans ( having no inline style ).
    +		data = data.replace(/<span>/g, '');
    +		return data;
    +	};
    +})();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/preview/preview.html b/src/main/webapp/plug-in/ckeditor/plugins/preview/preview.html
    new file mode 100644
    index 00000000..5745b7ab
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/preview/preview.html
    @@ -0,0 +1,10 @@
    +<script>
    +
    +var doc = document;
    +doc.open();
    +doc.write( window.opener._cke_htmlToLoad );
    +doc.close();
    +
    +delete window.opener._cke_htmlToLoad;
    +
    +</script>
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/scayt/LICENSE.md b/src/main/webapp/plug-in/ckeditor/plugins/scayt/LICENSE.md
    new file mode 100644
    index 00000000..610c8078
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/scayt/LICENSE.md
    @@ -0,0 +1,28 @@
    +Software License Agreement
    +==========================
    +
    +**CKEditor SCAYT Plugin**
    +Copyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved.
    +
    +Licensed under the terms of any of the following licenses at your choice:
    +
    +*   GNU General Public License Version 2 or later (the "GPL"):
    +    http://www.gnu.org/licenses/gpl.html
    +
    +*   GNU Lesser General Public License Version 2.1 or later (the "LGPL"):
    +    http://www.gnu.org/licenses/lgpl.html
    +
    +*   Mozilla Public License Version 1.1 or later (the "MPL"):
    +    http://www.mozilla.org/MPL/MPL-1.1.html
    +
    +You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice.
    +
    +Sources of Intellectual Property Included in this plugin
    +--------------------------------------------------------
    +
    +Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission.
    +
    +Trademarks
    +----------
    +
    +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/scayt/README.md b/src/main/webapp/plug-in/ckeditor/plugins/scayt/README.md
    new file mode 100644
    index 00000000..3b1ad94c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/scayt/README.md
    @@ -0,0 +1,25 @@
    +CKEditor SCAYT Plugin
    +=====================
    +
    +This plugin brings Spell Check As You Type (SCAYT) into CKEditor.
    +
    +SCAYT is a "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.
    +
    +Installation
    +------------
    +
    +1. Clone/copy this repository contents in a new "plugins/scayt" folder in your CKEditor installation.
    +2. Enable the "scayt" plugin in the CKEditor configuration file (config.js):
    +
    +        config.extraPlugins = 'scayt';
    +
    +That's all. SCAYT will appear on the editor toolbar and will be ready to use.
    +
    +License
    +-------
    +
    +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
    +
    +See LICENSE.md for more information.
    +
    +Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/scayt/dialogs/options.js b/src/main/webapp/plug-in/ckeditor/plugins/scayt/dialogs/options.js
    new file mode 100644
    index 00000000..82bf80b0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/scayt/dialogs/options.js
    @@ -0,0 +1,20 @@
    +锘/*
    + Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("scaytcheck",function(j){function w(){return"undefined"!=typeof document.forms["optionsbar_"+a]?document.forms["optionsbar_"+a].options:[]}function x(b,a){if(b){var e=b.length;if(void 0==e)b.checked=b.value==a.toString();else for(var d=0;d<e;d++)b[d].checked=!1,b[d].value==a.toString()&&(b[d].checked=!0)}}function n(b){f.getById("dic_message_"+a).setHtml('<span style="color:red;">'+b+"</span>")}function o(b){f.getById("dic_message_"+a).setHtml('<span style="color:blue;">'+b+"</span>")}
    +function p(b){for(var b=(""+b).split(","),a=0,e=b.length;a<e;a+=1)f.getById(b[a]).$.style.display="inline"}function q(b){for(var b=(""+b).split(","),a=0,e=b.length;a<e;a+=1)f.getById(b[a]).$.style.display="none"}function r(b){f.getById("dic_name_"+a).$.value=b}var s=!0,h,f=CKEDITOR.document,a=j.name,l=CKEDITOR.plugins.scayt.getUiTabs(j),g,t=[],u=0,m=["dic_create_"+a+",dic_restore_"+a,"dic_rename_"+a+",dic_delete_"+a],v=["mixedCase","mixedWithDigits","allCaps","ignoreDomainNames"];g=j.lang.scayt;var z=
    +[{id:"options",label:g.optionsTab,elements:[{type:"html",id:"options",html:'<form name="optionsbar_'+a+'"><div class="inner_options">\t<div class="messagebox"></div>\t<div style="display:none;">\t\t<input type="checkbox" name="options"  id="allCaps_'+a+'" />\t\t<label style = "display: inline" for="allCaps" id="label_allCaps_'+a+'"></label>\t</div>\t<div style="display:none;">\t\t<input name="options" type="checkbox"  id="ignoreDomainNames_'+a+'" />\t\t<label style = "display: inline" for="ignoreDomainNames" id="label_ignoreDomainNames_'+
    +a+'"></label>\t</div>\t<div style="display:none;">\t<input name="options" type="checkbox"  id="mixedCase_'+a+'" />\t\t<label style = "display: inline" for="mixedCase" id="label_mixedCase_'+a+'"></label>\t</div>\t<div style="display:none;">\t\t<input name="options" type="checkbox"  id="mixedWithDigits_'+a+'" />\t\t<label style = "display: inline" for="mixedWithDigits" id="label_mixedWithDigits_'+a+'"></label>\t</div></div></form>'}]},{id:"langs",label:g.languagesTab,elements:[{type:"html",id:"langs",
    +html:'<form name="languagesbar_'+a+'"><div class="inner_langs">\t<div class="messagebox"></div>\t   <div style="float:left;width:45%;margin-left:5px;" id="scayt_lcol_'+a+'" ></div>   <div style="float:left;width:45%;margin-left:15px;" id="scayt_rcol_'+a+'"></div></div></form>'}]},{id:"dictionaries",label:g.dictionariesTab,elements:[{type:"html",style:"",id:"dictionaries",html:'<form name="dictionarybar_'+a+'"><div class="inner_dictionary" style="text-align:left; white-space:normal; width:320px; overflow: hidden;">\t<div style="margin:5px auto; width:95%;white-space:normal; overflow:hidden;" id="dic_message_'+
    +a+'"> </div>\t<div style="margin:5px auto; width:95%;white-space:normal;">        <span class="cke_dialog_ui_labeled_label" >Dictionary name</span><br>\t\t<span class="cke_dialog_ui_labeled_content" >\t\t\t<div class="cke_dialog_ui_input_text">\t\t\t\t<input id="dic_name_'+a+'" type="text" class="cke_dialog_ui_input_text" style = "height: 25px; background: none; padding: 0;"/>\t\t</div></span></div>\t\t<div style="margin:5px auto; width:95%;white-space:normal;">\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_create_'+
    +a+'">\t\t\t\t</a>\t\t\t<a  style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_delete_'+a+'">\t\t\t\t</a>\t\t\t<a  style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_rename_'+a+'">\t\t\t\t</a>\t\t\t<a  style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_restore_'+a+'">\t\t\t\t</a>\t\t</div>\t<div style="margin:5px auto; width:95%;white-space:normal;" id="dic_info_'+a+'"></div></div></form>'}]},{id:"about",
    +label:g.aboutTab,elements:[{type:"html",id:"about",style:"margin: 5px 5px;",html:'<div id="scayt_about_'+a+'"></div>'}]}],B={title:g.title,minWidth:360,minHeight:220,onShow:function(){var b=this;b.data=j.fire("scaytDialog",{});b.options=b.data.scayt_control.option();b.chosed_lang=b.sLang=b.data.scayt_control.sLang;if(!b.data||!b.data.scayt||!b.data.scayt_control)alert("Error loading application service"),b.hide();else{var a=0;s?b.data.scayt.getCaption(j.langCode||"en",function(e){0<a++||(h=e,A.apply(b),
    +y.apply(b),s=!1)}):y.apply(b);b.selectPage(b.data.tab)}},onOk:function(){var a=this.data.scayt_control;a.option(this.options);a.setLang(this.chosed_lang);a.refresh()},onCancel:function(){var b=w(),f;for(f in b)b[f].checked=!1;b="undefined"!=typeof document.forms["languagesbar_"+a]?document.forms["languagesbar_"+a].scayt_lang:[];x(b,"")},contents:t};CKEDITOR.plugins.scayt.getScayt(j);for(g=0;g<l.length;g++)1==l[g]&&(t[t.length]=z[g]);1==l[2]&&(u=1);var A=function(){function b(b){var c=f.getById("dic_name_"+
    +a).getValue();if(!c)return n(" Dictionary name should not be empty. "),!1;try{var d=b.data.getTarget().getParent(),e=/(dic_\w+)_[\w\d]+/.exec(d.getId())[1];j[e].apply(null,[d,c,m])}catch(C){n(" Dictionary error. ")}return!0}var k=this,e=k.data.scayt.getLangList(),d=["dic_create","dic_delete","dic_rename","dic_restore"],g=[],i=[],c;if(u){for(c=0;c<d.length;c++)g[c]=d[c]+"_"+a,f.getById(g[c]).setHtml('<span class="cke_dialog_ui_button">'+h["button_"+d[c]]+"</span>");f.getById("dic_info_"+a).setHtml(h.dic_info)}if(1==
    +l[0])for(c in v)d="label_"+v[c],g=f.getById(d+"_"+a),"undefined"!=typeof g&&("undefined"!=typeof h[d]&&"undefined"!=typeof k.options[v[c]])&&(g.setHtml(h[d]),g.getParent().$.style.display="block");d='<p><img src="'+window.scayt.getAboutInfo().logoURL+'" /></p><p>'+h.version+window.scayt.getAboutInfo().version.toString()+"</p><p>"+h.about_throwt_copy+"</p>";f.getById("scayt_about_"+a).setHtml(d);d=function(a,b){var c=f.createElement("label");c.setAttribute("for","cke_option"+a);c.setStyle("display",
    +"inline");c.setHtml(b[a]);k.sLang==a&&(k.chosed_lang=a);var d=f.createElement("div"),e=CKEDITOR.dom.element.createFromHtml('<input class = "cke_dialog_ui_radio_input" id="cke_option'+a+'" type="radio" '+(k.sLang==a?'checked="checked"':"")+' value="'+a+'" name="scayt_lang" />');e.on("click",function(){this.$.checked=true;k.chosed_lang=a});d.append(e);d.append(c);return{lang:b[a],code:a,radio:d}};if(1==l[1]){for(c in e.rtl)i[i.length]=d(c,e.ltr);for(c in e.ltr)i[i.length]=d(c,e.ltr);i.sort(function(a,
    +b){return b.lang>a.lang?-1:1});e=f.getById("scayt_lcol_"+a);d=f.getById("scayt_rcol_"+a);for(c=0;c<i.length;c++)(c<i.length/2?e:d).append(i[c].radio)}var j={dic_create:function(a,b,c){var d=c[0]+","+c[1],e=h.err_dic_create,f=h.succ_dic_create;window.scayt.createUserDictionary(b,function(a){q(d);p(c[1]);f=f.replace("%s",a.dname);o(f)},function(a){e=e.replace("%s",a.dname);n(e+"( "+(a.message||"")+")")})},dic_rename:function(a,b){var c=h.err_dic_rename||"",d=h.succ_dic_rename||"";window.scayt.renameUserDictionary(b,
    +function(a){d=d.replace("%s",a.dname);r(b);o(d)},function(a){c=c.replace("%s",a.dname);r(b);n(c+"( "+(a.message||"")+" )")})},dic_delete:function(a,b,c){var d=c[0]+","+c[1],e=h.err_dic_delete,f=h.succ_dic_delete;window.scayt.deleteUserDictionary(function(a){f=f.replace("%s",a.dname);q(d);p(c[0]);r("");o(f)},function(a){e=e.replace("%s",a.dname);n(e)})}};j.dic_restore=k.dic_restore||function(a,b,c){var d=c[0]+","+c[1],e=h.err_dic_restore,f=h.succ_dic_restore;window.scayt.restoreUserDictionary(b,function(a){f=
    +f.replace("%s",a.dname);q(d);p(c[1]);o(f)},function(a){e=e.replace("%s",a.dname);n(e)})};i=(m[0]+","+m[1]).split(",");c=0;for(e=i.length;c<e;c+=1)if(d=f.getById(i[c]))d.on("click",b,this)},y=function(){var b=this;if(1==l[0])for(var g=w(),e=0,d=g.length;e<d;e++){var h=g[e].id,i=f.getById(h);if(i&&(g[e].checked=!1,1==b.options[h.split("_")[0]]&&(g[e].checked=!0),s))i.on("click",function(){b.options[this.getId().split("_")[0]]=this.$.checked?1:0})}1==l[1]&&(g=f.getById("cke_option"+b.sLang),x(g.$,b.sLang));
    +u&&(window.scayt.getNameUserDictionary(function(b){b=b.dname;q(m[0]+","+m[1]);if(b){f.getById("dic_name_"+a).setValue(b);p(m[1])}else p(m[0])},function(){f.getById("dic_name_"+a).setValue("")}),o(""))};return B});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/scayt/dialogs/toolbar.css b/src/main/webapp/plug-in/ckeditor/plugins/scayt/dialogs/toolbar.css
    new file mode 100644
    index 00000000..861f43e3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/scayt/dialogs/toolbar.css
    @@ -0,0 +1,71 @@
    +a
    +{
    +	text-decoration:none;
    +	padding: 2px 4px 4px 6px;
    +	display : block;
    +	border-width: 1px;
    +	border-style: solid;
    +	margin : 0px;
    +}
    +
    +a.cke_scayt_toogle:hover,
    +a.cke_scayt_toogle:focus,
    +a.cke_scayt_toogle:active
    +{
    +	border-color: #316ac5;
    +	background-color: #dff1ff;
    +	color : #000;
    +	cursor: pointer;
    +	margin : 0px;
    +}
    +a.cke_scayt_toogle {
    +	color : #316ac5;
    +	border-color: #fff;
    +}
    +.scayt_enabled a.cke_scayt_item {
    +	color : #316ac5;
    +	border-color: #fff;
    +	margin : 0px;
    +}
    +.scayt_disabled a.cke_scayt_item {
    +	color : gray;
    +	border-color : #fff;
    +}
    +.scayt_enabled a.cke_scayt_item:hover,
    +.scayt_enabled a.cke_scayt_item:focus,
    +.scayt_enabled a.cke_scayt_item:active
    +{
    +	border-color: #316ac5;
    +	background-color: #dff1ff;
    +	color : #000;
    +	cursor: pointer;
    +}
    +.scayt_disabled a.cke_scayt_item:hover,
    +.scayt_disabled a.cke_scayt_item:focus,
    +.scayt_disabled a.cke_scayt_item:active
    +{
    +	border-color: gray;
    +	background-color: #dff1ff;
    +	color : gray;
    +	cursor: no-drop;
    +}
    +.cke_scayt_set_on, .cke_scayt_set_off
    +{
    +	display: none;
    +}
    +.scayt_enabled .cke_scayt_set_on
    +{
    +	display: none;
    +}
    +.scayt_disabled .cke_scayt_set_on
    +{
    +	display: inline;
    +}
    +.scayt_disabled .cke_scayt_set_off
    +{
    +	display: none;
    +}
    +.scayt_enabled  .cke_scayt_set_off
    +{
    +	display: inline;
    +}
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_address.png b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_address.png
    new file mode 100644
    index 00000000..1ee67aa2
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_address.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_blockquote.png b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_blockquote.png
    new file mode 100644
    index 00000000..cae3aec6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_blockquote.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_div.png b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_div.png
    new file mode 100644
    index 00000000..c71f3978
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_div.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h1.png b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h1.png
    new file mode 100644
    index 00000000..3a643473
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h1.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h2.png b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h2.png
    new file mode 100644
    index 00000000..8062ebe8
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h2.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h3.png b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h3.png
    new file mode 100644
    index 00000000..5b6a4030
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h3.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h4.png b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h4.png
    new file mode 100644
    index 00000000..6c7f7951
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h4.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h5.png b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h5.png
    new file mode 100644
    index 00000000..e153de09
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h5.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h6.png b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h6.png
    new file mode 100644
    index 00000000..c8d993a9
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_h6.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_p.png b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_p.png
    new file mode 100644
    index 00000000..4e6035d2
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_p.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_pre.png b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_pre.png
    new file mode 100644
    index 00000000..d11a0fff
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/showblocks/images/block_pre.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/dialogs/smiley.js b/src/main/webapp/plug-in/ckeditor/plugins/smiley/dialogs/smiley.js
    new file mode 100644
    index 00000000..21ab252d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/smiley/dialogs/smiley.js
    @@ -0,0 +1,10 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("smiley",function(f){for(var e=f.config,a=f.lang.smiley,h=e.smiley_images,g=e.smiley_columns||8,i,k=function(j){var c=j.data.getTarget(),b=c.getName();if("a"==b)c=c.getChild(0);else if("img"!=b)return;var b=c.getAttribute("cke_src"),a=c.getAttribute("title"),c=f.document.createElement("img",{attributes:{src:b,"data-cke-saved-src":b,title:a,alt:a,width:c.$.width,height:c.$.height}});f.insertElement(c);i.hide();j.data.preventDefault()},n=CKEDITOR.tools.addFunction(function(a,c){var a=
    +new CKEDITOR.dom.event(a),c=new CKEDITOR.dom.element(c),b;b=a.getKeystroke();var d="rtl"==f.lang.dir;switch(b){case 38:if(b=c.getParent().getParent().getPrevious())b=b.getChild([c.getParent().getIndex(),0]),b.focus();a.preventDefault();break;case 40:if(b=c.getParent().getParent().getNext())(b=b.getChild([c.getParent().getIndex(),0]))&&b.focus();a.preventDefault();break;case 32:k({data:a});a.preventDefault();break;case d?37:39:if(b=c.getParent().getNext())b=b.getChild(0),b.focus(),a.preventDefault(!0);
    +else if(b=c.getParent().getParent().getNext())(b=b.getChild([0,0]))&&b.focus(),a.preventDefault(!0);break;case d?39:37:if(b=c.getParent().getPrevious())b=b.getChild(0),b.focus(),a.preventDefault(!0);else if(b=c.getParent().getParent().getPrevious())b=b.getLast().getChild(0),b.focus(),a.preventDefault(!0)}}),d=CKEDITOR.tools.getNextId()+"_smiley_emtions_label",d=['<div><span id="'+d+'" class="cke_voice_label">'+a.options+"</span>",'<table role="listbox" aria-labelledby="'+d+'" style="width:100%;height:100%;border-collapse:separate;" cellspacing="2" cellpadding="2"',
    +CKEDITOR.env.ie&&CKEDITOR.env.quirks?' style="position:absolute;"':"","><tbody>"],l=h.length,a=0;a<l;a++){0===a%g&&d.push('<tr role="presentation">');var m="cke_smile_label_"+a+"_"+CKEDITOR.tools.getNextNumber();d.push('<td class="cke_dark_background cke_centered" style="vertical-align: middle;" role="presentation"><a href="javascript:void(0)" role="option"',' aria-posinset="'+(a+1)+'"',' aria-setsize="'+l+'"',' aria-labelledby="'+m+'"',' class="cke_smile cke_hand" tabindex="-1" onkeydown="CKEDITOR.tools.callFunction( ',
    +n,', event, this );">','<img class="cke_hand" title="',e.smiley_descriptions[a],'" cke_src="',CKEDITOR.tools.htmlEncode(e.smiley_path+h[a]),'" alt="',e.smiley_descriptions[a],'"',' src="',CKEDITOR.tools.htmlEncode(e.smiley_path+h[a]),'"',CKEDITOR.env.ie?" onload=\"this.setAttribute('width', 2); this.removeAttribute('width');\" ":"",'><span id="'+m+'" class="cke_voice_label">'+e.smiley_descriptions[a]+"</span></a>","</td>");a%g==g-1&&d.push("</tr>")}if(a<g-1){for(;a<g-1;a++)d.push("<td></td>");d.push("</tr>")}d.push("</tbody></table></div>");
    +e={type:"html",id:"smileySelector",html:d.join(""),onLoad:function(a){i=a.sender},focus:function(){var a=this;setTimeout(function(){a.getElement().getElementsByTag("a").getItem(0).focus()},0)},onClick:k,style:"width: 100%; border-collapse: separate;"};return{title:f.lang.smiley.title,minWidth:270,minHeight:120,contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[e]}],buttons:[CKEDITOR.dialog.cancelButton]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/angel_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/angel_smile.gif
    new file mode 100644
    index 00000000..2cf48947
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/angel_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/angry_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/angry_smile.gif
    new file mode 100644
    index 00000000..40b52d3a
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/angry_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/broken_heart.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/broken_heart.gif
    new file mode 100644
    index 00000000..b6d0166a
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/broken_heart.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/confused_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/confused_smile.gif
    new file mode 100644
    index 00000000..a52db7a4
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/confused_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/cry_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/cry_smile.gif
    new file mode 100644
    index 00000000..1ef6ba4f
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/cry_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/devil_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/devil_smile.gif
    new file mode 100644
    index 00000000..bfb25077
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/devil_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/embaressed_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/embaressed_smile.gif
    new file mode 100644
    index 00000000..d9cedc56
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/embaressed_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/embarrassed_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/embarrassed_smile.gif
    new file mode 100644
    index 00000000..d9cedc56
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/embarrassed_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/envelope.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/envelope.gif
    new file mode 100644
    index 00000000..94e0b1fa
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/envelope.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/heart.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/heart.gif
    new file mode 100644
    index 00000000..680ae2fc
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/heart.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/kiss.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/kiss.gif
    new file mode 100644
    index 00000000..70e52551
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/kiss.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/lightbulb.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/lightbulb.gif
    new file mode 100644
    index 00000000..d44c2ffe
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/lightbulb.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/omg_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/omg_smile.gif
    new file mode 100644
    index 00000000..ab7ea699
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/omg_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/regular_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/regular_smile.gif
    new file mode 100644
    index 00000000..e5bc34be
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/regular_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/sad_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/sad_smile.gif
    new file mode 100644
    index 00000000..ae4cf1e3
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/sad_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/shades_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/shades_smile.gif
    new file mode 100644
    index 00000000..b4540175
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/shades_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/teeth_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/teeth_smile.gif
    new file mode 100644
    index 00000000..7d734d15
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/teeth_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/thumbs_down.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/thumbs_down.gif
    new file mode 100644
    index 00000000..90b9978c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/thumbs_down.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/thumbs_up.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/thumbs_up.gif
    new file mode 100644
    index 00000000..b6332848
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/thumbs_up.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/tongue_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/tongue_smile.gif
    new file mode 100644
    index 00000000..b2e657fa
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/tongue_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/tounge_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/tounge_smile.gif
    new file mode 100644
    index 00000000..b2e657fa
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/tounge_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif
    new file mode 100644
    index 00000000..77098821
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/wink_smile.gif b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/wink_smile.gif
    new file mode 100644
    index 00000000..b2102954
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/smiley/images/wink_smile.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt
    new file mode 100644
    index 00000000..dc3c1fb6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt
    @@ -0,0 +1,20 @@
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +
    +cs.js      Found: 118 Missing: 0
    +cy.js      Found: 118 Missing: 0
    +de.js      Found: 118 Missing: 0
    +el.js      Found: 16 Missing: 102
    +eo.js      Found: 118 Missing: 0
    +et.js      Found: 31 Missing: 87
    +fa.js      Found: 24 Missing: 94
    +fi.js      Found: 23 Missing: 95
    +fr.js      Found: 118 Missing: 0
    +hr.js      Found: 23 Missing: 95
    +it.js      Found: 118 Missing: 0
    +nb.js      Found: 118 Missing: 0
    +nl.js      Found: 118 Missing: 0
    +no.js      Found: 118 Missing: 0
    +tr.js      Found: 118 Missing: 0
    +ug.js      Found: 39 Missing: 79
    +zh-cn.js   Found: 118 Missing: 0
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ar.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ar.js
    new file mode 100644
    index 00000000..15fbd38a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ar.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","ar",{euro:"乇賲夭 丕賱賷賵乇賵",lsquo:"毓賱丕賲丞 鬲賳氐賷氐 毓賱賷 丕賱賷爻丕乇",rsquo:"毓賱丕賲丞 鬲賳氐賷氐 毓賱賷 丕賱賷賲賷賳",ldquo:"毓賱丕賲丞 鬲賳氐賷氐 賲夭丿賵噩丞 毓賱賷 丕賱賷爻丕乇",rdquo:"毓賱丕賲丞 鬲賳氐賷氐 賲夭丿賵噩丞 毓賱賷 丕賱賷賲賷賳",ndash:"En dash 鈥",mdash:"Em dash 鈥",iexcl:"毓賱丕賲丞 鬲毓噩亘 賲賯賱賵亘丞",cent:"乇賲夭 爻賳鬲賷賲",pound:"乇賲夭 丕賱丕爻鬲乇賱賷賳賷",curren:"乇賲夭 丕賱毓賲賱丞",yen:"乇賲夭 丕賱賷賳 丕賱賷丕亘丕賳賷",brvbar:"禺胤 毓賲賵丿賷 賲賰爻賵乇",sect:"乇賲夭 丕賱賮氐賷賱丞",uml:"Diaeresis",copy:"毓賱丕賲丞 丨賯賵賯 丕賱胤亘毓",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
    +not:"賱賷爻鬲 毓賱丕賲丞",reg:"毓賱丕賲丞 賲爻噩賾賱丞",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"毓賱丕賲丞 丕賱廿爻鬲賮賴丕賲 睾賷乇 氐丨賷丨丞",Agrave:"Latin capital letter A with grave accent",
    +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter 脝",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
    +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
    +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
    +aring:"Latin small letter a with ring above",aelig:"Latin small letter 忙",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
    +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
    +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
    +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/bg.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/bg.js
    new file mode 100644
    index 00000000..27dbefe1
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/bg.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","bg",{euro:"袝胁褉芯 蟹薪邪泻",lsquo:"袥褟胁邪 屑邪褉泻懈褉芯胁泻邪 蟹邪 褑懈褌邪褌",rsquo:"袛褟褋薪邪 屑邪褉泻懈褉芯胁泻邪 蟹邪 褑懈褌邪褌",ldquo:"袥褟胁邪 写胁芯泄薪邪 泻邪胁懈褔泻邪 蟹邪 褑懈褌邪褌",rdquo:"袛褟褋薪邪 写胁芯泄薪邪 泻邪胁懈褔泻邪 蟹邪 褑懈褌邪褌",ndash:"\\\\",mdash:"/",iexcl:"袨斜褗褉薪邪褌邪 锌懈褌邪薪泻邪",cent:"袟薪邪泻 蟹邪 褑械薪褌",pound:"袟薪邪泻 蟹邪 锌邪褍薪写",curren:"袙邪谢褍褌械薪 蟹薪邪泻",yen:"袟薪邪泻 蟹邪 泄械薪邪",brvbar:"袩褉械泻褗褋薪邪褌邪 谢懈薪懈褟",sect:"袟薪邪泻 蟹邪 褋械泻褑懈褟",uml:"Diaeresis",copy:"袟薪邪泻 蟹邪 Copyright",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
    +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
    +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter 脝",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
    +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
    +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
    +aring:"Latin small letter a with ring above",aelig:"Latin small letter 忙",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
    +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
    +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
    +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ca.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ca.js
    new file mode 100644
    index 00000000..8e92d954
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ca.js
    @@ -0,0 +1,14 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","ca",{euro:"S铆mbol d'euro",lsquo:"Signe de cometa simple esquerra",rsquo:"Signe de cometa simple dreta",ldquo:"Signe de cometa doble esquerra",rdquo:"Signe de cometa doble dreta",ndash:"Gui贸",mdash:"Gui贸 baix",iexcl:"Signe d'exclamaci贸 inversa",cent:"S铆mbol de percentatge",pound:"S铆mbol de lliura",curren:"S铆mbol de moneda",yen:"S铆mbol de Yen",brvbar:"Barra trencada",sect:"S铆mbol de secci贸",uml:"Di猫resi",copy:"S铆mbol de Copyright",ordf:"Indicador ordinal femen铆",
    +laquo:"Signe de cometes angulars esquerra",not:"S铆mbol de negaci贸",reg:"S铆mbol registrat",macr:"Macron",deg:"S铆mbol de grau",sup2:"Super铆ndex dos",sup3:"Super铆ndex tres",acute:"Accent agut",micro:"S铆mbol de micro",para:"S铆mbol de calder贸",middot:"Punt volat",cedil:"Ce trencada",sup1:"Super铆ndex u",ordm:"Indicador ordinal mascul铆",raquo:"Signe de cometes angulars dreta",frac14:"Fracci贸 vulgar un quart",frac12:"Fracci贸 vulgar una meitat",frac34:"Fracci贸 vulgar tres quarts",iquest:"S铆mbol d'interrogaci贸 invertit",
    +Agrave:"Lletra maj煤scula llatina A amb accent greu",Aacute:"Lletra maj煤scula llatina A amb accent agut",Acirc:"Lletra maj煤scula llatina A amb circumflex",Atilde:"Lletra maj煤scula llatina A amb titlla",Auml:"Lletra maj煤scula llatina A amb di猫resi",Aring:"Lletra maj煤scula llatina A amb anell superior",AElig:"Lletra maj煤scula llatina 脝",Ccedil:"Lletra maj煤scula llatina C amb ce trencada",Egrave:"Lletra maj煤scula llatina E amb accent greu",Eacute:"Lletra maj煤scula llatina E amb accent agut",Ecirc:"Lletra maj煤scula llatina E amb circumflex",
    +Euml:"Lletra maj煤scula llatina E amb di猫resi",Igrave:"Lletra maj煤scula llatina I amb accent greu",Iacute:"Lletra maj煤scula llatina I amb accent agut",Icirc:"Lletra maj煤scula llatina I amb circumflex",Iuml:"Lletra maj煤scula llatina I amb di猫resi",ETH:"Lletra maj煤scula llatina Eth",Ntilde:"Lletra maj煤scula llatina N amb titlla",Ograve:"Lletra maj煤scula llatina O amb accent greu",Oacute:"Lletra maj煤scula llatina O amb accent agut",Ocirc:"Lletra maj煤scula llatina O amb circumflex",Otilde:"Lletra maj煤scula llatina O amb titlla",
    +Ouml:"Lletra maj煤scula llatina O amb di猫resi",times:"S铆mbol de multiplicaci贸",Oslash:"Lletra maj煤scula llatina O amb barra",Ugrave:"Lletra maj煤scula llatina U amb accent greu",Uacute:"Lletra maj煤scula llatina U amb accent agut",Ucirc:"Lletra maj煤scula llatina U amb circumflex",Uuml:"Lletra maj煤scula llatina U amb di猫resi",Yacute:"Lletra maj煤scula llatina Y amb accent agut",THORN:"Lletra maj煤scula llatina Thorn",szlig:"Lletra min煤scula llatina sharp s",agrave:"Lletra min煤scula llatina a amb accent greu",
    +aacute:"Lletra min煤scula llatina a amb accent agut",acirc:"Lletra min煤scula llatina a amb circumflex",atilde:"Lletra min煤scula llatina a amb titlla",auml:"Lletra min煤scula llatina a amb di猫resi",aring:"Lletra min煤scula llatina a amb anell superior",aelig:"Lletra min煤scula llatina 忙",ccedil:"Lletra min煤scula llatina c amb ce trencada",egrave:"Lletra min煤scula llatina e amb accent greu",eacute:"Lletra min煤scula llatina e amb accent agut",ecirc:"Lletra min煤scula llatina e amb circumflex",euml:"Lletra min煤scula llatina e amb di猫resi",
    +igrave:"Lletra min煤scula llatina i amb accent greu",iacute:"Lletra min煤scula llatina i amb accent agut",icirc:"Lletra min煤scula llatina i amb circumflex",iuml:"Lletra min煤scula llatina i amb di猫resi",eth:"Lletra min煤scula llatina eth",ntilde:"Lletra min煤scula llatina n amb titlla",ograve:"Lletra min煤scula llatina o amb accent greu",oacute:"Lletra min煤scula llatina o amb accent agut",ocirc:"Lletra min煤scula llatina o amb circumflex",otilde:"Lletra min煤scula llatina o amb titlla",ouml:"Lletra min煤scula llatina o amb di猫resi",
    +divide:"S铆mbol de divisi贸",oslash:"Lletra min煤scula llatina o amb barra",ugrave:"Lletra min煤scula llatina u amb accent greu",uacute:"Lletra min煤scula llatina u amb accent agut",ucirc:"Lletra min煤scula llatina u amb circumflex",uuml:"Lletra min煤scula llatina u amb di猫resi",yacute:"Lletra min煤scula llatina y amb accent agut",thorn:"Lletra min煤scula llatina thorn",yuml:"Lletra min煤scula llatina y amb di猫resi",OElig:"Lligadura maj煤scula llatina OE",oelig:"Lligadura min煤scula llatina oe",372:"Lletra maj煤scula llatina W amb circumflex",
    +374:"Lletra maj煤scula llatina Y amb circumflex",373:"Lletra min煤scula llatina w amb circumflex",375:"Lletra min煤scula llatina y amb circumflex",sbquo:"Signe de cita simple baixa-9",8219:"Signe de cita simple alta-invertida-9",bdquo:"Signe de cita doble baixa-9",hellip:"Punts suspensius",trade:"S铆mbol de marca registrada",9658:"Punter negre apuntant cap a la dreta",bull:"Vinyeta",rarr:"Fletxa cap a la dreta",rArr:"Doble fletxa cap a la dreta",hArr:"Doble fletxa esquerra dreta",diams:"Vestit negre diamant",
    +asymp:"Gaireb茅 igual a"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/cs.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/cs.js
    new file mode 100644
    index 00000000..78856a27
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/cs.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","cs",{euro:"Znak eura",lsquo:"Po膷谩te膷n铆 uvozovka jednoduch谩",rsquo:"Koncov谩 uvozovka jednoduch谩",ldquo:"Po膷谩te膷n铆 uvozovka dvojit谩",rdquo:"Koncov谩 uvozovka dvojit谩",ndash:"En poml膷ka",mdash:"Em poml膷ka",iexcl:"Obr谩cen媒 vyk艡i膷n铆k",cent:"Znak centu",pound:"Znak libry",curren:"Znak m臎ny",yen:"Znak jenu",brvbar:"P艡eru拧en谩 svisl谩 膷谩ra",sect:"Znak odd铆lu",uml:"P艡ehl谩ska",copy:"Znak copyrightu",ordf:"沤ensk媒 indik谩tor rodu",laquo:"Znak dvojit媒ch lomen媒ch uvozovek vlevo",
    +not:"Logistick媒 z谩por",reg:"Znak registrace",macr:"Poml膷ka nad",deg:"Znak stupn臎",sup2:"Dvojka jako horn铆 index",sup3:"Trojka jako horn铆 index",acute:"膶谩rka nad vpravo",micro:"Znak mikro",para:"Znak odstavce",middot:"Te膷ka uprost艡ed",cedil:"Oc谩sek vlevo",sup1:"Jedni膷ka jako horn铆 index",ordm:"Mu啪sk媒 indik谩tor rodu",raquo:"Znak dvojit媒ch lomen媒ch uvozovek vpravo",frac14:"Oby膷ejn媒 zlomek jedna 膷tvrtina",frac12:"Oby膷ejn媒 zlomek jedna polovina",frac34:"Oby膷ejn媒 zlomek t艡i 膷tvrtiny",iquest:"Znak obr谩cen茅ho otazn铆ku",
    +Agrave:"Velk茅 p铆smeno latinky A s 膷谩rkou nad vlevo",Aacute:"Velk茅 p铆smeno latinky A s 膷谩rkou nad vpravo",Acirc:"Velk茅 p铆smeno latinky A s vok谩n臎m",Atilde:"Velk茅 p铆smeno latinky A s tildou",Auml:"Velk茅 p铆smeno latinky A s dv臎ma te膷kami",Aring:"Velk茅 p铆smeno latinky A s krou啪kem nad",AElig:"Velk茅 p铆smeno latinky Ae",Ccedil:"Velk茅 p铆smeno latinky C s oc谩skem vlevo",Egrave:"Velk茅 p铆smeno latinky E s 膷谩rkou nad vlevo",Eacute:"Velk茅 p铆smeno latinky E s 膷谩rkou nad vpravo",Ecirc:"Velk茅 p铆smeno latinky E s vok谩n臎m",
    +Euml:"Velk茅 p铆smeno latinky E s dv臎ma te膷kami",Igrave:"Velk茅 p铆smeno latinky I s 膷谩rkou nad vlevo",Iacute:"Velk茅 p铆smeno latinky I s 膷谩rkou nad vpravo",Icirc:"Velk茅 p铆smeno latinky I s vok谩n臎m",Iuml:"Velk茅 p铆smeno latinky I s dv臎ma te膷kami",ETH:"Velk茅 p铆smeno latinky Eth",Ntilde:"Velk茅 p铆smeno latinky N s tildou",Ograve:"Velk茅 p铆smeno latinky O s 膷谩rkou nad vlevo",Oacute:"Velk茅 p铆smeno latinky O s 膷谩rkou nad vpravo",Ocirc:"Velk茅 p铆smeno latinky O s vok谩n臎m",Otilde:"Velk茅 p铆smeno latinky O s tildou",
    +Ouml:"Velk茅 p铆smeno latinky O s dv臎ma te膷kami",times:"Znak n谩soben铆",Oslash:"Velk茅 p铆smeno latinky O p艡e拧krtnut茅",Ugrave:"Velk茅 p铆smeno latinky U s 膷谩rkou nad vlevo",Uacute:"Velk茅 p铆smeno latinky U s 膷谩rkou nad vpravo",Ucirc:"Velk茅 p铆smeno latinky U s vok谩n臎m",Uuml:"Velk茅 p铆smeno latinky U s dv臎ma te膷kami",Yacute:"Velk茅 p铆smeno latinky Y s 膷谩rkou nad vpravo",THORN:"Velk茅 p铆smeno latinky Thorn",szlig:"Mal茅 p铆smeno latinky ostr茅 s",agrave:"Mal茅 p铆smeno latinky a s 膷谩rkou nad vlevo",aacute:"Mal茅 p铆smeno latinky a s 膷谩rkou nad vpravo",
    +acirc:"Mal茅 p铆smeno latinky a s vok谩n臎m",atilde:"Mal茅 p铆smeno latinky a s tildou",auml:"Mal茅 p铆smeno latinky a s dv臎ma te膷kami",aring:"Mal茅 p铆smeno latinky a s krou啪kem nad",aelig:"Mal茅 p铆smeno latinky ae",ccedil:"Mal茅 p铆smeno latinky c s oc谩skem vlevo",egrave:"Mal茅 p铆smeno latinky e s 膷谩rkou nad vlevo",eacute:"Mal茅 p铆smeno latinky e s 膷谩rkou nad vpravo",ecirc:"Mal茅 p铆smeno latinky e s vok谩n臎m",euml:"Mal茅 p铆smeno latinky e s dv臎ma te膷kami",igrave:"Mal茅 p铆smeno latinky i s 膷谩rkou nad vlevo",iacute:"Mal茅 p铆smeno latinky i s 膷谩rkou nad vpravo",
    +icirc:"Mal茅 p铆smeno latinky i s vok谩n臎m",iuml:"Mal茅 p铆smeno latinky i s dv臎ma te膷kami",eth:"Mal茅 p铆smeno latinky eth",ntilde:"Mal茅 p铆smeno latinky n s tildou",ograve:"Mal茅 p铆smeno latinky o s 膷谩rkou nad vlevo",oacute:"Mal茅 p铆smeno latinky o s 膷谩rkou nad vpravo",ocirc:"Mal茅 p铆smeno latinky o s vok谩n臎m",otilde:"Mal茅 p铆smeno latinky o s tildou",ouml:"Mal茅 p铆smeno latinky o s dv臎ma te膷kami",divide:"Znak d臎len铆",oslash:"Mal茅 p铆smeno latinky o p艡e拧krtnut茅",ugrave:"Mal茅 p铆smeno latinky u s 膷谩rkou nad vlevo",
    +uacute:"Mal茅 p铆smeno latinky u s 膷谩rkou nad vpravo",ucirc:"Mal茅 p铆smeno latinky u s vok谩n臎m",uuml:"Mal茅 p铆smeno latinky u s dv臎ma te膷kami",yacute:"Mal茅 p铆smeno latinky y s 膷谩rkou nad vpravo",thorn:"Mal茅 p铆smeno latinky thorn",yuml:"Mal茅 p铆smeno latinky y s dv臎ma te膷kami",OElig:"Velk谩 ligatura latinky OE",oelig:"Mal谩 ligatura latinky OE",372:"Velk茅 p铆smeno latinky W s vok谩n臎m",374:"Velk茅 p铆smeno latinky Y s vok谩n臎m",373:"Mal茅 p铆smeno latinky w s vok谩n臎m",375:"Mal茅 p铆smeno latinky y s vok谩n臎m",sbquo:"Doln铆 9 uvozovka jednoduch谩",
    +8219:"Horn铆 obr谩cen谩 9 uvozovka jednoduch谩",bdquo:"Doln铆 9 uvozovka dvojit谩",hellip:"Trojte膷kov媒 煤vod",trade:"Obchodn铆 zna膷ka",9658:"膶ern媒 ukazatel sm臎艡uj铆c铆 vpravo",bull:"Kole膷ko",rarr:"艩ipka vpravo",rArr:"Dvojit谩 拧ipka vpravo",hArr:"Dvojit谩 拧ipka vlevo a vpravo",diams:"膶ern茅 piky",asymp:"T茅m臎艡 se rovn谩"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/cy.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/cy.js
    new file mode 100644
    index 00000000..455def51
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/cy.js
    @@ -0,0 +1,14 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","cy",{euro:"Arwydd yr Ewro",lsquo:"Dyfynnod chwith unigol",rsquo:"Dyfynnod dde unigol",ldquo:"Dyfynnod chwith dwbl",rdquo:"Dyfynnod dde dwbl",ndash:"Cysylltnod en",mdash:"Cysylltnod em",iexcl:"Ebychnod gwrthdro",cent:"Arwydd sent",pound:"Arwydd punt",curren:"Arwydd arian cyfred",yen:"Arwydd yen",brvbar:"Bar toriedig",sect:"Arwydd adran",uml:"Didolnod",copy:"Arwydd hawlfraint",ordf:"Dangosydd benywaidd",laquo:"Dyfynnod dwbl ar ongl i'r chwith",not:"Arwydd Nid",
    +reg:"Arwydd cofrestredig",macr:"Macron",deg:"Arwydd gradd",sup2:"Dau uwchsgript",sup3:"Tri uwchsgript",acute:"Acen ddyrchafedig",micro:"Arwydd micro",para:"Arwydd pilcrow",middot:"Dot canol",cedil:"Sedila",sup1:"Un uwchsgript",ordm:"Dangosydd gwrywaidd",raquo:"Dyfynnod dwbl ar ongl i'r dde",frac14:"Ffracsiwn cyffredin un cwarter",frac12:"Ffracsiwn cyffredin un hanner",frac34:"Ffracsiwn cyffredin tri chwarter",iquest:"Marc cwestiwn gwrthdro毛dig",Agrave:"Priflythyren A Lladinaidd gydag acen ddisgynedig",
    +Aacute:"Priflythyren A Lladinaidd gydag acen ddyrchafedig",Acirc:"Priflythyren A Lladinaidd gydag acen grom",Atilde:"Priflythyren A Lladinaidd gyda thild",Auml:"Priflythyren A Lladinaidd gyda didolnod",Aring:"Priflythyren A Lladinaidd gyda chylch uwchben",AElig:"Priflythyren 脝 Lladinaidd",Ccedil:"Priflythyren C Lladinaidd gyda sedila",Egrave:"Priflythyren E Lladinaidd gydag acen ddisgynedig",Eacute:"Priflythyren E Lladinaidd gydag acen ddyrchafedig",Ecirc:"Priflythyren E Lladinaidd gydag acen grom",
    +Euml:"Priflythyren E Lladinaidd gyda didolnod",Igrave:"Priflythyren I Lladinaidd gydag acen ddisgynedig",Iacute:"Priflythyren I Lladinaidd gydag acen ddyrchafedig",Icirc:"Priflythyren I Lladinaidd gydag acen grom",Iuml:"Priflythyren I Lladinaidd gyda didolnod",ETH:"Priflythyren Eth",Ntilde:"Priflythyren N Lladinaidd gyda thild",Ograve:"Priflythyren O Lladinaidd gydag acen ddisgynedig",Oacute:"Priflythyren O Lladinaidd gydag acen ddyrchafedig",Ocirc:"Priflythyren O Lladinaidd gydag acen grom",Otilde:"Priflythyren O Lladinaidd gyda thild",
    +Ouml:"Priflythyren O Lladinaidd gyda didolnod",times:"Arwydd lluosi",Oslash:"Priflythyren O Lladinaidd gyda str么c",Ugrave:"Priflythyren U Lladinaidd gydag acen ddisgynedig",Uacute:"Priflythyren U Lladinaidd gydag acen ddyrchafedig",Ucirc:"Priflythyren U Lladinaidd gydag acen grom",Uuml:"Priflythyren U Lladinaidd gyda didolnod",Yacute:"Priflythyren Y Lladinaidd gydag acen ddyrchafedig",THORN:"Priflythyren Thorn",szlig:"Llythyren s fach Lladinaidd siarp ",agrave:"Llythyren a fach Lladinaidd gydag acen ddisgynedig",
    +aacute:"Llythyren a fach Lladinaidd gydag acen ddyrchafedig",acirc:"Llythyren a fach Lladinaidd gydag acen grom",atilde:"Llythyren a fach Lladinaidd gyda thild",auml:"Llythyren a fach Lladinaidd gyda didolnod",aring:"Llythyren a fach Lladinaidd gyda chylch uwchben",aelig:"Llythyren 忙 fach Lladinaidd",ccedil:"Llythyren c fach Lladinaidd gyda sedila",egrave:"Llythyren e fach Lladinaidd gydag acen ddisgynedig",eacute:"Llythyren e fach Lladinaidd gydag acen ddyrchafedig",ecirc:"Llythyren e fach Lladinaidd gydag acen grom",
    +euml:"Llythyren e fach Lladinaidd gyda didolnod",igrave:"Llythyren i fach Lladinaidd gydag acen ddisgynedig",iacute:"Llythyren i fach Lladinaidd gydag acen ddyrchafedig",icirc:"Llythyren i fach Lladinaidd gydag acen grom",iuml:"Llythyren i fach Lladinaidd gyda didolnod",eth:"Llythyren eth fach",ntilde:"Llythyren n fach Lladinaidd gyda thild",ograve:"Llythyren o fach Lladinaidd gydag acen ddisgynedig",oacute:"Llythyren o fach Lladinaidd gydag acen ddyrchafedig",ocirc:"Llythyren o fach Lladinaidd gydag acen grom",
    +otilde:"Llythyren o fach Lladinaidd gyda thild",ouml:"Llythyren o fach Lladinaidd gyda didolnod",divide:"Arwydd rhannu",oslash:"Llythyren o fach Lladinaidd gyda str么c",ugrave:"Llythyren u fach Lladinaidd gydag acen ddisgynedig",uacute:"Llythyren u fach Lladinaidd gydag acen ddyrchafedig",ucirc:"Llythyren u fach Lladinaidd gydag acen grom",uuml:"Llythyren u fach Lladinaidd gyda didolnod",yacute:"Llythyren y fach Lladinaidd gydag acen ddisgynedig",thorn:"Llythyren o fach Lladinaidd gyda str么c",yuml:"Llythyren y fach Lladinaidd gyda didolnod",
    +OElig:"Priflythyren cwlwm OE Lladinaidd ",oelig:"Priflythyren cwlwm oe Lladinaidd ",372:"Priflythyren W gydag acen grom",374:"Priflythyren Y gydag acen grom",373:"Llythyren w fach gydag acen grom",375:"Llythyren y fach gydag acen grom",sbquo:"Dyfynnod sengl 9-isel",8219:"Dyfynnod sengl 9-uchel cildro",bdquo:"Dyfynnod dwbl 9-isel",hellip:"Coll geiriau llorweddol",trade:"Arwydd marc masnachol",9658:"Pwyntydd du i'r dde",bull:"Bwled",rarr:"Saeth i'r dde",rArr:"Saeth ddwbl i'r dde",hArr:"Saeth ddwbl i'r chwith",
    +diams:"Siwt diemwnt du",asymp:"Bron yn hafal iddo"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/de.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/de.js
    new file mode 100644
    index 00000000..6def78bb
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/de.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","de",{euro:"Euro Zeichen",lsquo:"Hochkomma links",rsquo:"Hochkomma rechts",ldquo:"Anf眉hrungszeichen links",rdquo:"Anf眉hrungszeichen rechts",ndash:"kleiner Strich",mdash:"mittlerer Strich",iexcl:"invertiertes Ausrufezeichen",cent:"Cent",pound:"Pfund",curren:"W盲hrung",yen:"Yen",brvbar:"gestrichelte Linie",sect:"搂 Zeichen",uml:"Di盲resis",copy:"Copyright",ordf:"Feminine ordinal Anzeige",laquo:"Nach links zeigenden Doppel-Winkel Anf眉hrungszeichen",not:"Not-Zeichen",
    +reg:"Registriert",macr:"L盲ngezeichen",deg:"Grad",sup2:"Hoch 2",sup3:"Hoch 3",acute:"Akzentzeichen ",micro:"Micro",para:"Pilcrow-Zeichen",middot:"Mittelpunkt",cedil:"Cedilla",sup1:"Hoch 1",ordm:"M盲nnliche Ordnungszahl Anzeige",raquo:"Nach rechts zeigenden Doppel-Winkel Anf眉hrungszeichen",frac14:"ein Viertel",frac12:"H盲lfte",frac34:"Dreiviertel",iquest:"Umgekehrtes Fragezeichen",Agrave:"Lateinischer Buchstabe A mit AkzentGrave",Aacute:"Lateinischer Buchstabe A mit Akutakzent",Acirc:"Lateinischer Buchstabe A mit Zirkumflex",
    +Atilde:"Lateinischer Buchstabe A mit Tilde",Auml:"Lateinischer Buchstabe A mit Trema",Aring:"Lateinischer Buchstabe A mit Ring oben",AElig:"Lateinischer Buchstabe 脝",Ccedil:"Lateinischer Buchstabe C mit Cedille",Egrave:"Lateinischer Buchstabe E mit AkzentGrave",Eacute:"Lateinischer Buchstabe E mit Akutakzent",Ecirc:"Lateinischer Buchstabe E mit Zirkumflex",Euml:"Lateinischer Buchstabe E Trema",Igrave:"Lateinischer Buchstabe I mit AkzentGrave",Iacute:"Lateinischer Buchstabe I mit Akutakzent",Icirc:"Lateinischer Buchstabe I mit Zirkumflex",
    +Iuml:"Lateinischer Buchstabe I mit Trema",ETH:"Lateinischer Buchstabe Eth",Ntilde:"Lateinischer Buchstabe N mit Tilde",Ograve:"Lateinischer Buchstabe O mit AkzentGrave",Oacute:"Lateinischer Buchstabe O mit Akutakzent",Ocirc:"Lateinischer Buchstabe O mit Zirkumflex",Otilde:"Lateinischer Buchstabe O mit Tilde",Ouml:"Lateinischer Buchstabe O mit Trema",times:"Multiplikation",Oslash:"Lateinischer Buchstabe O durchgestrichen",Ugrave:"Lateinischer Buchstabe U mit Akzentgrave",Uacute:"Lateinischer Buchstabe U mit Akutakzent",
    +Ucirc:"Lateinischer Buchstabe U mit Zirkumflex",Uuml:"Lateinischer Buchstabe a mit Trema",Yacute:"Lateinischer Buchstabe a mit Akzent",THORN:"Lateinischer Buchstabe mit Dorn",szlig:"Kleiner lateinischer Buchstabe scharfe s",agrave:"Kleiner lateinischer Buchstabe a mit Accent grave",aacute:"Kleiner lateinischer Buchstabe a mit Akut",acirc:"Lateinischer Buchstabe a mit Zirkumflex",atilde:"Lateinischer Buchstabe a mit Tilde",auml:"Kleiner lateinischer Buchstabe a mit Trema",aring:"Kleiner lateinischer Buchstabe a mit Ring oben",
    +aelig:"Lateinischer Buchstabe 忙",ccedil:"Kleiner lateinischer Buchstabe c mit Cedille",egrave:"Kleiner lateinischer Buchstabe e mit Accent grave",eacute:"Kleiner lateinischer Buchstabe e mit Akut",ecirc:"Kleiner lateinischer Buchstabe e mit Zirkumflex",euml:"Kleiner lateinischer Buchstabe e mit Trema",igrave:"Kleiner lateinischer Buchstabe i mit AkzentGrave",iacute:"Kleiner lateinischer Buchstabe i mit Akzent",icirc:"Kleiner lateinischer Buchstabe i mit Zirkumflex",iuml:"Kleiner lateinischer Buchstabe i mit Trema",
    +eth:"Kleiner lateinischer Buchstabe eth",ntilde:"Kleiner lateinischer Buchstabe n mit Tilde",ograve:"Kleiner lateinischer Buchstabe o mit Accent grave",oacute:"Kleiner lateinischer Buchstabe o mit Akzent",ocirc:"Kleiner lateinischer Buchstabe o mit Zirkumflex",otilde:"Lateinischer Buchstabe i mit Tilde",ouml:"Kleiner lateinischer Buchstabe o mit Trema",divide:"Divisionszeichen",oslash:"Kleiner lateinischer Buchstabe o durchgestrichen",ugrave:"Kleiner lateinischer Buchstabe u mit Accent grave",uacute:"Kleiner lateinischer Buchstabe u mit Akut",
    +ucirc:"Kleiner lateinischer Buchstabe u mit Zirkumflex",uuml:"Kleiner lateinischer Buchstabe u mit Trema",yacute:"Kleiner lateinischer Buchstabe y mit Akut",thorn:"Kleiner lateinischer Buchstabe Dorn",yuml:"Kleiner lateinischer Buchstabe y mit Trema",OElig:"Lateinischer Buchstabe Ligatur OE",oelig:"Kleiner lateinischer Buchstabe Ligatur OE",372:"Lateinischer Buchstabe W mit Zirkumflex",374:"Lateinischer Buchstabe Y mit Zirkumflex",373:"Kleiner lateinischer Buchstabe w mit Zirkumflex",375:"Kleiner lateinischer Buchstabe y mit Zirkumflex",
    +sbquo:"Tiefergestelltes Komma",8219:"Rumgedrehtes Komma",bdquo:"Doppeltes Anf眉hrungszeichen unten",hellip:"horizontale Auslassungspunkte",trade:"Handelszeichen",9658:"Dreickspfeil rechts",bull:"Bullet",rarr:"Pfeil rechts",rArr:"Doppelpfeil rechts",hArr:"Doppelpfeil links",diams:"Karo",asymp:"Ungef盲hr"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/el.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/el.js
    new file mode 100644
    index 00000000..9ce678d2
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/el.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","el",{euro:"危蠉渭尾慰位慰 螘蠀蟻蠋",lsquo:"螒蟻喂蟽蟿蔚蟻蠈蟼 蠂伪蟻伪魏蟿萎蟻伪蟼 渭慰谓慰蠉 蔚喂蟽伪纬蠅纬喂魏慰蠉",rsquo:"螖蔚尉喂蠈蟼 蠂伪蟻伪魏蟿萎蟻伪蟼 渭慰谓慰蠉 蔚喂蟽伪纬蠅纬喂魏慰蠉",ldquo:"螒蟻喂蟽蟿蔚蟻蠈蟼 蠂伪蟻伪魏蟿萎蟻伪蟼 未喂蟺位慰蠉 蔚喂蟽伪纬蠅纬喂魏慰蠉",rdquo:"螖蔚尉喂蠈蟼 蠂伪蟻伪魏蟿萎蟻伪蟼 未喂蟺位慰蠉 蔚喂蟽伪纬蠅纬喂魏慰蠉",ndash:"螤伪蠉位伪 en",mdash:"螤伪蠉位伪 em",iexcl:"螒谓维蟺慰未慰 胃伪蠀渭伪蟽蟿喂魏蠈",cent:"危蠉渭尾慰位慰 危蔚谓蟿",pound:"危蠉渭尾慰位慰 位委蟻伪蟼",curren:"危蠉渭尾慰位慰 蟽蠀谓伪位位伪纬渭伪蟿喂魏萎蟼 渭慰谓维未伪蟼",yen:"危蠉渭尾慰位慰 螕喂苇谓",brvbar:"危蟺伪蟽渭苇谓畏 渭蟺维蟻伪",sect:"危蠉渭尾慰位慰 蟿渭萎渭伪蟿慰蟼",uml:"螖喂伪委蟻蔚蟽畏",copy:"危蠉渭尾慰位慰 蟺谓蔚蠀渭伪蟿喂魏蠋谓 未喂魏伪喂蠅渭维蟿蠅谓",
    +ordf:"Feminine ordinal indicator",laquo:"螒蟻喂蟽蟿蔚蟻蠈蟼 蠂伪蟻伪魏蟿萎蟻伪蟼 未喂蟺位慰蠉 蔚喂蟽伪纬蠅纬喂魏慰蠉",not:"螖蔚谓 苇蠂蔚喂 蠀蟺慰纬蟻维蠄蔚喂 ",reg:"螘纬纬蔚纬蟻伪渭渭苇谓慰 蟽畏渭维未喂 ",macr:"Macron",deg:"螘纬纬蔚纬蟻伪渭渭苇谓慰 蟽畏渭维未喂 ",sup2:"Superscript two",sup3:"Superscript three",acute:"螣尉蔚委伪 蟺蟻慰蠁慰蟻维 ",micro:"Micro 蟽畏渭维未喂 ",para:"Micro 蟽畏渭维未喂 ",middot:"螠苇蟽畏 蟿蔚位蔚喂伪",cedil:"违蟺慰蟽蟿喂纬渭萎 ",sup1:"Superscript one",ordm:"螒蟻蟽蔚谓喂魏慰蟼 蟿伪魏蟿喂魏蠈蟼 未蔚委魏蟿畏蟼 ",raquo:"螖蔚尉喂慰蟼 蠂伪蟻伪魏蟿萎蟻伪蟼 未喂蟺位慰蠉 蔚喂蟽伪纬蠅纬喂魏慰蠉",frac14:"围蠀未伪委慰 魏位维蟽渭伪 蟿慰蠀 蔚谓蠈蟼 蟿蔚蟿维蟻蟿慰蠀 ",frac12:"围蠀未伪委慰 魏位维蟽渭伪 蟿慰 萎渭喂蟽蠀 ",
    +frac34:"围蠀未伪委慰 魏位维蟽渭伪 蟿蟻委伪 蟿苇蟿伪蟻蟿伪 ",iquest:"螒谓维蟺慰未慰 胃伪蠀渭伪蟽蟿喂魏蠈",Agrave:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 螒 渭蔚 尾伪蟻蔚委伪 ",Aacute:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 螒 渭蔚 慰尉蔚委伪 ",Acirc:"螞伪蟿喂谓喂魏慰 螒 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",Atilde:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 螒 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",Auml:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 螒 渭蔚 未喂伪位蠀蟿喂魏维 ",Aring:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 螒 渭蔚 未伪魏蟿蠉位喂慰 蔚蟺维谓蠅 ",AElig:"螞伪蟿喂谓喂魏蠈 纬蟻维渭渭伪 CAPITAL 脝",Ccedil:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 C 渭蔚 蠀蟺慰纬蔚纬蟻伪渭渭苇谓畏",Egrave:"螞伪蟿喂谓喂魏慰 螘 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 渭蔚 尾伪蟻蔚委伪 ",Eacute:"螞伪蟿喂谓喂魏萎 螘 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 渭蔚 慰尉蔚委伪 ",
    +Ecirc:"螞伪蟿喂谓喂魏慰 螘 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",Euml:"螞伪蟿喂谓喂魏慰 螘 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 渭蔚 未喂伪位蠀蟿喂魏维 ",Igrave:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 I 渭蔚 尾伪蟻蔚委伪 ",Iacute:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 I 渭蔚 慰尉蔚委伪 ",Icirc:"螞伪蟿喂谓喂魏慰 I 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",Iuml:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 I 渭蔚 未喂伪位蠀蟿喂魏维 ",ETH:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 Eth",Ntilde:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 螡 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",Ograve:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 螣 渭蔚 尾伪蟻蔚委伪 ",Oacute:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 螣 渭蔚 慰尉蔚委伪 ",Ocirc:"螞伪蟿喂谓喂魏慰 螣 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",
    +Otilde:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 螣 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",Ouml:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 螣 渭蔚 未喂伪位蠀蟿喂魏维 ",times:"危蠉渭尾慰位慰 蟺慰位位伪蟺位伪蟽喂伪蟽渭慰蠉 ",Oslash:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 O 渭蔚 未喂伪未蟻慰渭畏",Ugrave:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 U 渭蔚 尾伪蟻蔚委伪 ",Uacute:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 U 渭蔚 慰尉蔚委伪 ",Ucirc:"螞伪蟿喂谓喂魏慰 U 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",Uuml:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 U 渭蔚 未喂伪位蠀蟿喂魏维 ",Yacute:"螞伪蟿喂谓喂魏慰 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 Y 渭蔚 慰尉蔚委伪 ",THORN:"螞伪蟿喂谓喂魏慰 Thorn 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 ",szlig:"螞伪蟿喂谓喂魏萎 渭喂魏蟻蠈 纬蟻维渭渭伪 伪蟺蠈蟿慰渭慰 s ",agrave:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 螒 渭蔚 尾伪蟻蔚委伪 ",
    +aacute:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 伪 渭蔚 慰尉蔚委伪 ",acirc:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 伪 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",atilde:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 伪 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",auml:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 伪 渭蔚 未喂伪位蠀蟿喂魏维 ",aring:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 伪 渭蔚 未伪魏蟿蠉位喂慰 蟺维谓蠅 ",aelig:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 忙",ccedil:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 c 渭蔚 蠀蟺慰纬蔚纬蟻伪渭渭苇谓畏 ",egrave:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 蔚 渭蔚 尾伪蟻蔚委伪 ",eacute:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 蔚 渭蔚 慰尉蔚委伪 ",ecirc:"螞伪蟿喂谓喂魏萎 渭喂魏蟻蠈 纬蟻维渭渭伪 蔚 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",euml:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 蔚 渭蔚 未喂伪位蠀蟿喂魏维 ",igrave:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 i 渭蔚 尾伪蟻蔚委伪 ",
    +iacute:"螞伪蟿喂谓喂魏萎 渭喂魏蟻蠈 纬蟻维渭渭伪 i 渭蔚 慰尉蔚委伪 ",icirc:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 i 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏",iuml:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 i 渭蔚 未喂伪位蠀蟿喂魏维 ",eth:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 eth ",ntilde:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 n 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",ograve:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 慰 渭蔚 尾伪蟻蔚委伪 ",oacute:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 慰 渭蔚 慰尉蔚委伪 ",ocirc:"螞伪蟿喂谓喂魏蠈 蟺蔚味蠈 纬蟻维渭渭伪 o 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",otilde:"螞伪蟿喂谓喂魏萎 渭喂魏蟻蠈 纬蟻维渭渭伪 慰 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",ouml:"螞伪蟿喂谓喂魏萎 渭喂魏蟻蠈 纬蟻维渭渭伪 慰 渭蔚 未喂伪位蠀蟿喂魏维 ",divide:"危蠉渭尾慰位慰 未喂伪委蟻蔚蟽畏蟼",oslash:"螞伪蟿喂谓喂魏萎 渭喂魏蟻蠈 纬蟻维渭渭伪 慰 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",
    +ugrave:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 u  渭蔚 尾伪蟻蔚委伪 ",uacute:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 u  渭蔚 慰尉蔚委伪 ",ucirc:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 u  渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",uuml:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 u  渭蔚 未喂伪位蠀蟿喂魏维 ",yacute:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 y 渭蔚 慰尉蔚委伪 ",thorn:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 thorn",yuml:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 y 渭蔚 未喂伪位蠀蟿喂魏维 ",OElig:"螞伪蟿喂谓喂魏萎 魏蔚蠁伪位伪委慰 位慰纬蠈纬蟻伪渭渭伪 螣螘 ",oelig:"螞伪蟿喂谓喂魏萎 渭喂魏蟻蠈 位慰纬蠈纬蟻伪渭渭伪 oe ",372:"螞伪蟿喂谓喂魏慰 W 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",374:"螞伪蟿喂谓喂魏慰 Y 魏蔚蠁伪位伪委慰 纬蟻维渭渭伪 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",373:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 w 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",
    +375:"螞伪蟿喂谓喂魏慰 渭喂魏蟻蠈 纬蟻维渭渭伪 y 渭蔚 蟺蔚蟻喂蟽蟺蠅渭苇谓畏 ",sbquo:"螘谓喂伪委慰 蠂伪渭畏位慰 -9 蔚喂蟽伪纬蠅纬喂魏蠈 ",8219:"螘谓喂伪委慰 蠀蠄畏位慰 伪谓蔚蟽蟿蟻伪渭渭苇谓畏慰 -9 蔚喂蟽伪纬蠅纬喂魏蠈 ",bdquo:"螖喂蟺位蠈 蠂伪渭畏位蠈 -9 蔚喂蟽伪纬蠅纬喂魏蠈 ",hellip:"螣蟻喂味蠈谓蟿喂伪 伪蟺慰蟽喂蠅蟺畏蟿喂魏维 ",trade:"危蠉渭尾慰位慰 螘渭蟺慰蟻喂魏蠈蠀 螝伪蟿伪蟿蔚胃苇谓",9658:"螠伪蠉蟻慰 未蔚委蠂谓蔚喂 蟺蟻慰蟼 蟿伪 未蔚尉喂维 ",bull:"螝慰蠀魏魏委未伪 ",rarr:"螤蟻慰蟼 蟿伪 未蔚尉喂维 ",rArr:"螤蟻慰蟼 蟿伪 未蔚尉喂维 ",hArr:"螒蟻喂蟽蟿蔚蟻维 螖蔚尉喂维 未喂蟺位蠈 尾苇位慰蟼 ",diams:"螠伪蠉蟻慰 未喂伪渭维谓蟿喂",asymp:"危蠂蔚未蠈谓 委蟽畏 渭蔚 "});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/en.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/en.js
    new file mode 100644
    index 00000000..fdecfd2e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/en.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","en",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
    +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
    +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter 脝",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
    +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
    +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
    +aring:"Latin small letter a with ring above",aelig:"Latin small letter 忙",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
    +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
    +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
    +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/eo.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/eo.js
    new file mode 100644
    index 00000000..1a56c0b9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/eo.js
    @@ -0,0 +1,12 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","eo",{euro:"E怒rosigno",lsquo:"Supra 6-citilo",rsquo:"Supra 9-citilo",ldquo:"Supra 66-citilo",rdquo:"Supra 99-citilo",ndash:"Streketo",mdash:"Substreko",iexcl:"Renversita krisigno",cent:"Cendosigno",pound:"Pundosigno",curren:"Monersigno",yen:"Enosigno",brvbar:"Rompita vertikala streko",sect:"Kurba paragrafo",uml:"Tremao",copy:"Kopirajtosigno",ordf:"Adjektiva numerfina牡o",laquo:"Duobla malplio-citilo",not:"Negohoko",reg:"Registrita marko",macr:"Superstreko",deg:"Gradosigno",
    +sup2:"Supra indico 2",sup3:"Supra indico 3",acute:"Dekstra korno",micro:"Mikrosigno",para:"Rekta paragrafo",middot:"Meza punkto",cedil:"Zoeto",sup1:"Supra indico 1",ordm:"Substantiva numerfina牡o",raquo:"Duobla plio-citilo",frac14:"Kvaronosigno",frac12:"Duonosigno",frac34:"Trikvaronosigno",iquest:"renversita demandosigno",Agrave:"Latina 膲eflitero A kun liva korno",Aacute:"Latina 膲eflitero A kun dekstra korno",Acirc:"Latina 膲eflitero A kun 膲apelo",Atilde:"Latina 膲eflitero A kun tildo",Auml:"Latina 膲eflitero A kun tremao",
    +Aring:"Latina 膲eflitero A kun superringo",AElig:"Latina 膲eflitera ligaturo 脝",Ccedil:"Latina 膲eflitero C kun zoeto",Egrave:"Latina 膲eflitero E kun liva korno",Eacute:"Latina 膲eflitero E kun dekstra korno",Ecirc:"Latina 膲eflitero E kun 膲apelo",Euml:"Latina 膲eflitero E kun tremao",Igrave:"Latina 膲eflitero I kun liva korno",Iacute:"Latina 膲eflitero I kun dekstra korno",Icirc:"Latina 膲eflitero I kun 膲apelo",Iuml:"Latina 膲eflitero I kun tremao",ETH:"Latina 膲eflitero islanda edo",Ntilde:"Latina 膲eflitero N kun tildo",
    +Ograve:"Latina 膲eflitero O kun liva korno",Oacute:"Latina 膲eflitero O kun dekstra korno",Ocirc:"Latina 膲eflitero O kun 膲apelo",Otilde:"Latina 膲eflitero O kun tildo",Ouml:"Latina 膲eflitero O kun tremao",times:"Multipliko",Oslash:"Latina 膲eflitero O trastrekita",Ugrave:"Latina 膲eflitero U kun liva korno",Uacute:"Latina 膲eflitero U kun dekstra korno",Ucirc:"Latina 膲eflitero U kun 膲apelo",Uuml:"Latina 膲eflitero U kun tremao",Yacute:"Latina 膲eflitero Y kun dekstra korno",THORN:"Latina 膲eflitero islanda dorno",
    +szlig:"Latina etlitero germana sozo (akra s)",agrave:"Latina etlitero a kun liva korno",aacute:"Latina etlitero a kun dekstra korno",acirc:"Latina etlitero a kun 膲apelo",atilde:"Latina etlitero a kun tildo",auml:"Latina etlitero a kun tremao",aring:"Latina etlitero a kun superringo",aelig:"Latina etlitera ligaturo 忙",ccedil:"Latina etlitero c kun zoeto",egrave:"Latina etlitero e kun liva korno",eacute:"Latina etlitero e kun dekstra korno",ecirc:"Latina etlitero e kun 膲apelo",euml:"Latina etlitero e kun tremao",
    +igrave:"Latina etlitero i kun liva korno",iacute:"Latina etlitero i kun dekstra korno",icirc:"Latina etlitero i kun 膲apelo",iuml:"Latina etlitero i kun tremao",eth:"Latina etlitero islanda edo",ntilde:"Latina etlitero n kun tildo",ograve:"Latina etlitero o kun liva korno",oacute:"Latina etlitero o kun dekstra korno",ocirc:"Latina etlitero o kun 膲apelo",otilde:"Latina etlitero o kun tildo",ouml:"Latina etlitero o kun tremao",divide:"Dividosigno",oslash:"Latina etlitero o trastrekita",ugrave:"Latina etlitero u kun liva korno",
    +uacute:"Latina etlitero u kun dekstra korno",ucirc:"Latina etlitero u kun 膲apelo",uuml:"Latina etlitero u kun tremao",yacute:"Latina etlitero y kun dekstra korno",thorn:"Latina etlitero islanda dorno",yuml:"Latina etlitero y kun tremao",OElig:"Latina 膲eflitera ligaturo 艗",oelig:"Latina etlitera ligaturo 艙",372:"Latina 膲eflitero W kun 膲apelo",374:"Latina 膲eflitero Y kun 膲apelo",373:"Latina etlitero w kun 膲apelo",375:"Latina etlitero y kun 膲apelo",sbquo:"Suba 9-citilo",8219:"Supra renversita 9-citilo",
    +bdquo:"Suba 99-citilo",hellip:"Tripunkto",trade:"Varmarka signo",9658:"Nigra sago dekstren",bull:"Bulmarko",rarr:"Sago dekstren",rArr:"Duobla sago dekstren",hArr:"Duobla sago maldekstren",diams:"Nigra kvadrato",asymp:"Preska怒 egala"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/es.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/es.js
    new file mode 100644
    index 00000000..4f666489
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/es.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","es",{euro:"S铆mbolo de euro",lsquo:"Comilla simple izquierda",rsquo:"Comilla simple derecha",ldquo:"Comilla doble izquierda",rdquo:"Comilla doble derecha",ndash:"Gui贸n corto",mdash:"Gui贸n medio largo",iexcl:"Signo de admiraci贸n invertido",cent:"S铆mbolo centavo",pound:"S铆mbolo libra",curren:"S铆mbolo moneda",yen:"S铆mbolo yen",brvbar:"Barra vertical rota",sect:"S铆mbolo secci贸n",uml:"Di茅resis",copy:"Signo de derechos de autor",ordf:"Indicador ordinal femenino",laquo:"Abre comillas angulares",
    +not:"Signo negaci贸n",reg:"Signo de marca registrada",macr:"Gui贸n alto",deg:"Signo de grado",sup2:"Super铆ndice dos",sup3:"Super铆ndice tres",acute:"Acento agudo",micro:"Signo micro",para:"Signo de pi",middot:"Punto medio",cedil:"Cedilla",sup1:"Super铆ndice uno",ordm:"Indicador orginal masculino",raquo:"Cierra comillas angulares",frac14:"Fracci贸n ordinaria de un quarto",frac12:"Fracci贸n ordinaria de una mitad",frac34:"Fracci贸n ordinaria de tres cuartos",iquest:"Signo de interrogaci贸n invertido",Agrave:"Letra A latina may煤scula con acento grave",
    +Aacute:"Letra A latina  may煤scula con acento agudo",Acirc:"Letra A latina may煤scula con acento circunflejo",Atilde:"Letra A latina may煤scula con tilde",Auml:"Letra A latina may煤scula con di茅resis",Aring:"Letra A latina may煤scula con aro arriba",AElig:"Letra 脝 latina may煤scula",Ccedil:"Letra C latina may煤scula con cedilla",Egrave:"Letra E latina may煤scula con acento grave",Eacute:"Letra E latina may煤scula con acento agudo",Ecirc:"Letra E latina may煤scula con acento circunflejo",Euml:"Letra E latina may煤scula con di茅resis",
    +Igrave:"Letra I latina may煤scula con acento grave",Iacute:"Letra I latina may煤scula con acento agudo",Icirc:"Letra I latina may煤scula con acento circunflejo",Iuml:"Letra I latina may煤scula con di茅resis",ETH:"Letra Eth latina may煤scula",Ntilde:"Letra N latina may煤scula con tilde",Ograve:"Letra O latina may煤scula con acento grave",Oacute:"Letra O latina may煤scula con acento agudo",Ocirc:"Letra O latina may煤scula con acento circunflejo",Otilde:"Letra O latina may煤scula con tilde",Ouml:"Letra O latina may煤scula con di茅resis",
    +times:"Signo de multiplicaci贸n",Oslash:"Letra O latina may煤scula con barra inclinada",Ugrave:"Letra U latina may煤scula con acento grave",Uacute:"Letra U latina may煤scula con acento agudo",Ucirc:"Letra U latina may煤scula con acento circunflejo",Uuml:"Letra U latina may煤scula con di茅resis",Yacute:"Letra Y latina may煤scula con acento agudo",THORN:"Letra Thorn latina may煤scula",szlig:"Letra s latina fuerte peque帽a",agrave:"Letra a latina peque帽a con acento grave",aacute:"Letra a latina peque帽a con acento agudo",
    +acirc:"Letra a latina peque帽a con acento circunflejo",atilde:"Letra a latina peque帽a con tilde",auml:"Letra a latina peque帽a con di茅resis",aring:"Letra a latina peque帽a con aro arriba",aelig:"Letra 忙 latina peque帽a",ccedil:"Letra c latina peque帽a con cedilla",egrave:"Letra e latina peque帽a con acento grave",eacute:"Letra e latina peque帽a con acento agudo",ecirc:"Letra e latina peque帽a con acento circunflejo",euml:"Letra e latina peque帽a con di茅resis",igrave:"Letra i latina peque帽a con acento grave",
    +iacute:"Letra i latina peque帽a con acento agudo",icirc:"Letra i latina peque帽a con acento circunflejo",iuml:"Letra i latina peque帽a con di茅resis",eth:"Letra eth latina peque帽a",ntilde:"Letra n latina peque帽a con tilde",ograve:"Letra o latina peque帽a con acento grave",oacute:"Letra o latina peque帽a con acento agudo",ocirc:"Letra o latina peque帽a con acento circunflejo",otilde:"Letra o latina peque帽a con tilde",ouml:"Letra o latina peque帽a con di茅resis",divide:"Signo de divisi贸n",oslash:"Letra o latina min煤scula con barra inclinada",
    +ugrave:"Letra u latina peque帽a con acento grave",uacute:"Letra u latina peque帽a con acento agudo",ucirc:"Letra u latina peque帽a con acento circunflejo",uuml:"Letra u latina peque帽a con di茅resis",yacute:"Letra u latina peque帽a con acento agudo",thorn:"Letra thorn latina min煤scula",yuml:"Letra y latina peque帽a con di茅resis",OElig:"Diptongo OE latino en may煤scula",oelig:"Diptongo oe latino en min煤scula",372:"Letra W latina may煤scula con acento circunflejo",374:"Letra Y latina may煤scula con acento circunflejo",
    +373:"Letra w latina peque帽a con acento circunflejo",375:"Letra y latina peque帽a con acento circunflejo",sbquo:"Comilla simple baja-9",8219:"Comilla simple alta invertida-9",bdquo:"Comillas dobles bajas-9",hellip:"Puntos suspensivos horizontales",trade:"Signo de marca registrada",9658:"Apuntador negro apuntando a la derecha",bull:"Vi帽eta",rarr:"Flecha a la derecha",rArr:"Flecha doble a la derecha",hArr:"Flecha izquierda derecha doble",diams:"Diamante negro",asymp:"Casi igual a"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/et.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/et.js
    new file mode 100644
    index 00000000..3a619ccb
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/et.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","et",{euro:"Eurom盲rk",lsquo:"Alustav 眉hekordne jutum盲rk",rsquo:"L玫petav 眉hekordne jutum盲rk",ldquo:"Alustav kahekordne jutum盲rk",rdquo:"L玫petav kahekordne jutum盲rk",ndash:"Enn-kriips",mdash:"Emm-kriips",iexcl:"P枚枚ratud h眉眉um盲rk",cent:"Sendim盲rk",pound:"Naela m盲rk",curren:"Valuutam盲rk",yen:"Jeeni m盲rk",brvbar:"Katkestatud kriips",sect:"L玫igu m盲rk",uml:"T盲pid",copy:"Autori玫iguse m盲rk",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
    +not:"Ei-m盲rk",reg:"Registered sign",macr:"Macron",deg:"Kraadim盲rk",sup2:"脺laindeks kaks",sup3:"脺laindeks kolm",acute:"Acute accent",micro:"Mikro-m盲rk",para:"Pilcrow sign",middot:"Keskpunkt",cedil:"Cedilla",sup1:"脺laindeks 眉ks",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
    +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Ladina suur A tildega",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter 脝",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
    +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"T盲ppidega ladina suur O",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
    +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Kandilise katusega suur ladina U",Uuml:"T盲ppidega ladina suur U",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Ladina v盲ike terav s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Kandilise katusega ladina v盲ike a",atilde:"Tildega ladina v盲ike a",auml:"T盲ppidega ladina v盲ike a",aring:"Latin small letter a with ring above",
    +aelig:"Latin small letter 忙",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",
    +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",
    +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",
    +bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/fa.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/fa.js
    new file mode 100644
    index 00000000..547f20b9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/fa.js
    @@ -0,0 +1,12 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","fa",{euro:"賳卮丕賳 蹖賵乇賵",lsquo:"毓賱丕賲鬲 賳賯賱 賯賵賱 鬲讴蹖 趩倬",rsquo:"毓賱丕賲鬲 賳賯賱 賯賵賱 鬲讴蹖 乇丕爻鬲",ldquo:"毓賱丕賲鬲 賳賯賱 賯賵賱 丿賵鬲丕蹖蹖 趩倬",rdquo:"毓賱丕賲鬲 賳賯賱 賯賵賱 丿賵鬲丕蹖蹖 乇丕爻鬲",ndash:"禺胤 鬲蹖乇賴 En",mdash:"禺胤 鬲蹖乇賴 Em",iexcl:"毓賱丕賲鬲 鬲毓噩亘 賵丕乇賵賳賴",cent:"賳卮丕賳 爻賳鬲",pound:"賳卮丕賳 倬賵賳丿",curren:"賳卮丕賳 丕乇夭",yen:"賳卮丕賳 蹖賳",brvbar:"賳賵丕乇 卮讴爻鬲賴",sect:"賳卮丕賳 亘禺卮",uml:"賳卮丕賳 爻賵丕诏蹖乇蹖",copy:"賳卮丕賳 讴倬蹖 乇丕蹖鬲",ordf:"卮丕禺氐 鬲乇鬲蹖亘蹖 賲賵賳孬",laquo:"丕卮丕乇賴 趩倬 賲讴乇乇 亘乇丕蹖 夭丕賵蹖賴 毓賱丕賲鬲 賳賯賱 賯賵賱",not:"賳卮丕賳 孬亘鬲 賳卮丿賴",reg:"賳卮丕賳 孬亘鬲 卮丿賴",
    +macr:"賳卮丕賳 禺胤 亘丕賱丕蹖 丨乇賮",deg:"賳卮丕賳 丿乇噩賴",sup2:"亘丕賱丕賳賵蹖爻 丿賵",sup3:"亘丕賱丕賳賵蹖爻 爻賴",acute:"賱賴噩賴 睾賱蹖馗",micro:"賳卮丕賳 賲丕蹖讴乇賵",para:"賳卮丕賳 賲丨賱 亘賳丿",middot:"賳賯胤賴 賲蹖丕賳蹖",cedil:"爻丿蹖賱",sup1:"亘丕賱丕賳賵蹖爻 1",ordm:"卮丕禺氐 鬲乇鬲蹖亘蹖 賲匕讴乇",raquo:"賳卮丕賳 夭丕賵蹖賴鈥屫ж 丿賵鬲丕蹖蹖 賳賯賱 賯賵賱 乇丕爻鬲 趩蹖賳",frac14:"賵丕丨丿 毓丕賲蹖丕賳賴 1/4",frac12:"賵丕丨丿 毓丕賲蹖賳賴 賳氐賮",frac34:"賵丕丨丿 毓丕賲蹖丕賳賴 3/4",iquest:"毓賱丕賲鬲 爻賵丕賱 賲毓讴賵爻",Agrave:"丨乇賮 A 亘夭乇诏 賱丕鬲蹖賳 亘丕 鬲賱賮馗 睾賱蹖馗",Aacute:"丨乇賮 A 亘夭乇诏 賱丕鬲蹖賳 亘丕 鬲賱賮馗 卮丿蹖丿",Acirc:"丨乇賮 A 亘夭乇诏 賱丕鬲蹖賳 亘丕 丿賵乇",Atilde:"丨乇賮 A 亘夭乇诏 賱丕鬲蹖賳 亘丕 氐丿丕蹖 讴丕賲蹖",
    +Auml:"丨乇賮 A 亘夭乇诏 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻賵丕诏蹖乇蹖",Aring:"丨乇賮 A 亘夭乇诏 賱丕鬲蹖賳 亘丕 丨賱賯賴 亘丕賱丕",AElig:"丨乇賮 脝 亘夭乇诏 賱丕鬲蹖賳",Ccedil:"丨乇賮 C 亘夭乇诏 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻賵丕诏蹖乇蹖",Egrave:"丨乇賮 E 亘夭乇诏 賱丕鬲蹖賳 亘丕 鬲賱賮馗 丿乇卮鬲",Eacute:"丨乇賮 E 亘夭乇诏 賱丕鬲蹖賳 亘丕 鬲賱賮馗 夭蹖乇",Ecirc:"丨乇賮 E 亘夭乇诏 賱丕鬲蹖賳 亘丕 禺賲丕賳",Euml:"丨乇賮 E 亘夭乇诏 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻賵丕诏蹖乇蹖",Igrave:"丨乇賮 I 亘夭乇诏 賱丕鬲蹖賳 亘丕 鬲賱賮馗 丿乇卮鬲",Iacute:"丨乇賮 I 亘夭乇诏 賱丕鬲蹖賳 亘丕 鬲賱賮馗 乇蹖夭",Icirc:"丨乇賮 I 亘夭乇诏 賱丕鬲蹖賳 亘丕 禺賲丕賳",Iuml:"丨乇賮 I 亘夭乇诏 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻賵丕诏蹖乇蹖",ETH:"丨乇賮 賱丕鬲蹖賳 亘夭乇诏 賵丕讴賴 鬲乇鬲蹖亘蹖",Ntilde:"丨乇賮 N 亘夭乇诏 賱丕鬲蹖賳 亘丕 賲丿",
    +Ograve:"丨乇賮 O 亘夭乇诏 賱丕鬲蹖賳 亘丕 鬲賱賮馗 丿乇卮鬲",Oacute:"丨乇賮 O 亘夭乇诏 賱丕鬲蹖賳 亘丕 鬲賱賮馗 乇蹖夭",Ocirc:"丨乇賮 O 亘夭乇诏 賱丕鬲蹖賳 亘丕 禺賲丕賳",Otilde:"丨乇賮 O 亘夭乇诏 賱丕鬲蹖賳 亘丕 賲丿",Ouml:"丨乇賮 O 亘夭乇诏 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻賵丕诏蹖乇蹖",times:"賳卮丕賳 囟乇亘丿乇",Oslash:"丨乇賮 O 亘夭乇诏 賱丕鬲蹖賳 亘丕 賲蹖丕賳 禺胤",Ugrave:"丨乇賮 U 亘夭乇诏 賱丕鬲蹖賳 亘丕 鬲賱賮馗 丿乇卮鬲",Uacute:"丨乇賮 U 亘夭乇诏 賱丕鬲蹖賳 亘丕 鬲賱賮馗 乇蹖夭",Ucirc:"丨乇賮 U 亘夭乇诏 賱丕鬲蹖賳 亘丕 禺賲丕賳",Uuml:"丨乇賮 U 亘夭乇诏 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻賵丕诏蹖乇蹖",Yacute:"丨乇賮 Y 亘夭乇诏 賱丕鬲蹖賳 亘丕 鬲賱賮馗 乇蹖夭",THORN:"丨乇賮 亘夭乇诏 賱丕鬲蹖賳 禺丕乇丿丕乇",szlig:"丨乇賮 讴賵趩讴 賱丕鬲蹖賳 卮丕乇倬 s",agrave:"丨乇賮 a 讴賵趩讴 賱丕鬲蹖賳 亘丕 鬲賱賮馗 丿乇卮鬲",
    +aacute:"丨乇賮 a 讴賵趩讴 賱丕鬲蹖賳 亘丕 鬲賱賮馗 乇蹖夭",acirc:"丨乇賮 a 讴賵趩讴 賱丕鬲蹖賳 亘丕 禺賲丕賳",atilde:"丨乇賮 a 讴賵趩讴 賱丕鬲蹖賳 亘丕 氐丿丕蹖 讴丕賲蹖",auml:"丨乇賮 a 讴賵趩讴 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻賵丕诏蹖乇蹖",aring:"丨乇賮 a 讴賵趩讴 賱丕鬲蹖賳 诏賵卮賵丕乇賴 丿丕乇",aelig:"丨乇賮 讴賵趩讴 賱丕鬲蹖賳 忙",ccedil:"丨乇賮 c 讴賵趩讴 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻丿蹖賱",egrave:"丨乇賮 e 讴賵趩讴 賱丕鬲蹖賳 亘丕 鬲賱賮馗 丿乇卮鬲",eacute:"丨乇賮 e 讴賵趩讴 賱丕鬲蹖賳 亘丕 鬲賱賮馗 乇蹖夭",ecirc:"丨乇賮 e 讴賵趩讴 賱丕鬲蹖賳 亘丕 禺賲丕賳",euml:"丨乇賮 e 讴賵趩讴 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻賵丕诏蹖乇蹖",igrave:"丨乇賮 i 讴賵趩讴 賱丕鬲蹖賳 亘丕 鬲賱賮馗 丿乇卮鬲",iacute:"丨乇賮 i 讴賵趩讴 賱丕鬲蹖賳 亘丕 鬲賱賮馗 乇蹖夭",icirc:"丨乇賮 i 讴賵趩讴 賱丕鬲蹖賳 亘丕 禺賲丕賳",
    +iuml:"丨乇賮 i 讴賵趩讴 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻賵丕诏蹖乇蹖",eth:"丨乇賮 讴賵趩讴 賱丕鬲蹖賳 eth",ntilde:"丨乇賮 n 讴賵趩讴 賱丕鬲蹖賳 亘丕 氐丿丕蹖 讴丕賲蹖",ograve:"丨乇賮 o 讴賵趩讴 賱丕鬲蹖賳 亘丕 鬲賱賮馗 丿乇卮鬲",oacute:"丨乇賮 o 讴賵趩讴 賱丕鬲蹖賳 亘丕 鬲賱賮馗 夭蹖乇",ocirc:"丨乇賮 o 讴賵趩讴 賱丕鬲蹖賳 亘丕 禺賲丕賳",otilde:"丨乇賮 o 讴賵趩讴 賱丕鬲蹖賳 亘丕 氐丿丕蹖 讴丕賲蹖",ouml:"丨乇賮 o 讴賵趩讴 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻賵丕诏蹖乇蹖",divide:"賳卮丕賳 亘禺卮",oslash:"丨乇賮 o 讴賵趩讴 賱丕鬲蹖賳 亘丕 賲蹖丕賳 禺胤",ugrave:"丨乇賮 u 讴賵趩讴 賱丕鬲蹖賳 亘丕 鬲賱賮馗 丿乇卮鬲",uacute:"丨乇賮 u 讴賵趩讴 賱丕鬲蹖賳 亘丕 鬲賱賮馗 乇蹖夭",ucirc:"丨乇賮 u 讴賵趩讴 賱丕鬲蹖賳 亘丕 禺賲丕賳",uuml:"丨乇賮 u 讴賵趩讴 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻賵丕诏蹖乇蹖",yacute:"丨乇賮 y 讴賵趩讴 賱丕鬲蹖賳 亘丕 鬲賱賮馗 乇蹖夭",
    +thorn:"丨乇賮 讴賵趩讴 賱丕鬲蹖賳 禺丕乇丿丕乇",yuml:"丨乇賮 y 讴賵趩讴 賱丕鬲蹖賳 亘丕 賳卮丕賳 爻賵丕诏蹖乇蹖",OElig:"亘賳丿 亘夭乇诏 賱丕鬲蹖賳 OE",oelig:"亘賳丿 讴賵趩讴 賱丕鬲蹖賳 oe",372:"丨乇賮 W 亘夭乇诏 賱丕鬲蹖賳 亘丕 禺賲丕賳",374:"丨乇賮 Y 亘夭乇诏 賱丕鬲蹖賳 亘丕 禺賲丕賳",373:"丨乇賮 w 讴賵趩讴 賱丕鬲蹖賳 亘丕 禺賲丕賳",375:"丨乇賮 y 讴賵趩讴 賱丕鬲蹖賳 亘丕 禺賲丕賳",sbquo:"賳卮丕賳 賳賯賱 賯賵賱 鬲讴蹖 夭蹖乇-9",8219:"賳卮丕賳 賳賯賱 賯賵賱 鬲讴蹖 high-reversed-9",bdquo:"賳賯賱 賯賵賱 丿賵鬲丕蹖蹖 倬丕蹖蹖賳-9",hellip:"丨匕賮 丕賮賯蹖",trade:"賳卮丕賳 鬲噩丕乇蹖",9658:"賳卮丕賳诏乇 爻蹖丕賴 噩賴鬲 乇丕爻鬲",bull:"诏賱賵賱賴",rarr:"賮賱卮 乇丕爻鬲",rArr:"賮賱卮 丿賵鬲丕蹖蹖 乇丕爻鬲",hArr:"賮賱卮 丿賵鬲丕蹖蹖 趩倬 乇丕爻鬲",diams:"賳卮丕賳 丕賱賲丕爻 爻蹖丕賴",
    +asymp:"鬲賯乇蹖亘丕 亘乇丕亘乇 亘丕"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/fi.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/fi.js
    new file mode 100644
    index 00000000..cee518ab
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/fi.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","fi",{euro:"Euron merkki",lsquo:"Vasen yksitt盲inen lainausmerkki",rsquo:"Oikea yksitt盲inen lainausmerkki",ldquo:"Vasen kaksoislainausmerkki",rdquo:"Oikea kaksoislainausmerkki",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Sentin merkki",pound:"Punnan merkki",curren:"Valuuttamerkki",yen:"Yenin merkki",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
    +not:"Not sign",reg:"Rekister枚ity merkki",macr:"Macron",deg:"Asteen merkki",sup2:"Yl盲indeksi kaksi",sup3:"Yl盲indeksi kolme",acute:"Acute accent",micro:"Mikron merkki",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Yl盲indeksi yksi",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Yl枚salaisin oleva kysymysmerkki",Agrave:"Latin capital letter A with grave accent",
    +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter 脝",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
    +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Kertomerkki",Oslash:"Latin capital letter O with stroke",
    +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
    +aring:"Latin small letter a with ring above",aelig:"Latin small letter 忙",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
    +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Jakomerkki",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
    +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
    +trade:"Tavaramerkki merkki",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Nuoli oikealle",rArr:"Kaksoisnuoli oikealle",hArr:"Kaksoisnuoli oikealle ja vasemmalle",diams:"Black diamond suit",asymp:"Noin"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js
    new file mode 100644
    index 00000000..fcbaa59a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js
    @@ -0,0 +1,10 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","fr-ca",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret",iexcl:"Point d'exclamation invers茅",cent:"Symbole de cent",pound:"Symbole de Livre Sterling",curren:"Symbole mon茅taire",yen:"Symbole du Yen",brvbar:"Barre scind茅e",sect:"Symbole de section",uml:"Tr茅ma",copy:"Symbole de copyright",ordf:"Indicateur ordinal f茅minin",laquo:"Guillemet fran莽ais ouvrant",
    +not:"Indicateur de n茅gation",reg:"Symbole de marque d茅pos茅e",macr:"Macron",deg:"Degr茅",sup2:"Exposant 2",sup3:"Exposant 3",acute:"Accent aig眉e",micro:"Symbole micro",para:"Paragraphe",middot:"Point m茅dian",cedil:"C茅dille",sup1:"Exposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet fran莽ais fermant",frac14:"Un quart",frac12:"Une demi",frac34:"Trois quart",iquest:"Point d'interrogation invers茅",Agrave:"A accent grave",Aacute:"A accent aig眉e",Acirc:"A circonflexe",Atilde:"A tilde",Auml:"A tr茅ma",
    +Aring:"A avec un rond au dessus",AElig:"脝 majuscule",Ccedil:"C c茅dille",Egrave:"E accent grave",Eacute:"E accent aig眉e",Ecirc:"E accent circonflexe",Euml:"E tr茅ma",Igrave:"I accent grave",Iacute:"I accent aig眉e",Icirc:"I accent circonflexe",Iuml:"I tr茅ma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N tilde",Ograve:"O accent grave",Oacute:"O accent aig眉e",Ocirc:"O accent circonflexe",Otilde:"O tilde",Ouml:"O tr茅ma",times:"Symbole de multiplication",Oslash:"O barr茅",Ugrave:"U accent grave",Uacute:"U accent aig眉e",
    +Ucirc:"U accent circonflexe",Uuml:"U tr茅ma",Yacute:"Y accent aig眉e",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a accent grave",aacute:"a accent aig眉e",acirc:"a accent circonflexe",atilde:"a tilde",auml:"a tr茅ma",aring:"a avec un cercle au dessus",aelig:"忙",ccedil:"c c茅dille",egrave:"e accent grave",eacute:"e accent aig眉e",ecirc:"e accent circonflexe",euml:"e tr茅ma",igrave:"i accent grave",iacute:"i accent aig眉e",icirc:"i accent circonflexe",iuml:"i tr茅ma",
    +eth:"Lettre minuscule islandaise ED",ntilde:"n tilde",ograve:"o accent grave",oacute:"o accent aig眉e",ocirc:"O accent circonflexe",otilde:"O tilde",ouml:"O tr茅ma",divide:"Symbole de division",oslash:"o barr茅",ugrave:"u accent grave",uacute:"u accent aig眉e",ucirc:"u accent circonflexe",uuml:"u tr茅ma",yacute:"y accent aig眉e",thorn:"Lettre islandaise thorn minuscule",yuml:"y tr茅ma",OElig:"ligature majuscule latine 艗",oelig:"ligature minuscule latine 艙",372:"W accent circonflexe",374:"Y accent circonflexe",
    +373:"w accent circonflexe",375:"y accent circonflexe",sbquo:"Guillemet simple fermant",8219:"Guillemet-virgule sup茅rieur culbut茅",bdquo:"Guillemet-virgule double inf茅rieur",hellip:"Points de suspension",trade:"Symbole de marque d茅pos茅e",9658:"Fl猫che noire pointant vers la droite",bull:"Puce",rarr:"Fl猫che vers la droite",rArr:"Fl猫che double vers la droite",hArr:"Fl猫che double vers la gauche",diams:"Carreau",asymp:"Presque 茅gal"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/fr.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/fr.js
    new file mode 100644
    index 00000000..b236b395
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/fr.js
    @@ -0,0 +1,11 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","fr",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret cadratin",iexcl:"Point d'exclamation invers茅",cent:"Symbole Cent",pound:"Symbole Livre Sterling",curren:"Symbole mon茅taire",yen:"Symbole Yen",brvbar:"Barre verticale scind茅e",sect:"Section",uml:"Tr茅ma",copy:"Symbole Copyright",ordf:"Indicateur ordinal f茅minin",laquo:"Guillemet fran莽ais ouvrant",
    +not:"Crochet de n茅gation",reg:"Marque d茅pos茅e",macr:"Macron",deg:"Degr茅",sup2:"Exposant 2",sup3:"\\tExposant 3",acute:"Accent aigu",micro:"Omicron",para:"Paragraphe",middot:"Point m茅dian",cedil:"C茅dille",sup1:"\\tExposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet fran莽ais fermant",frac14:"Un quart",frac12:"Un demi",frac34:"Trois quarts",iquest:"Point d'interrogation invers茅",Agrave:"A majuscule accent grave",Aacute:"A majuscule accent aigu",Acirc:"A majuscule accent circonflexe",Atilde:"A majuscule avec caron",
    +Auml:"A majuscule tr茅ma",Aring:"A majuscule avec un rond au-dessus",AElig:"脝 majuscule ligatur茅s",Ccedil:"C majuscule c茅dille",Egrave:"E majuscule accent grave",Eacute:"E majuscule accent aigu",Ecirc:"E majuscule accent circonflexe",Euml:"E majuscule tr茅ma",Igrave:"I majuscule accent grave",Iacute:"I majuscule accent aigu",Icirc:"I majuscule accent circonflexe",Iuml:"I majuscule tr茅ma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N majuscule avec caron",Ograve:"O majuscule accent grave",Oacute:"O majuscule accent aigu",
    +Ocirc:"O majuscule accent circonflexe",Otilde:"O majuscule avec caron",Ouml:"O majuscule tr茅ma",times:"Multiplication",Oslash:"O majuscule barr茅",Ugrave:"U majuscule accent grave",Uacute:"U majuscule accent aigu",Ucirc:"U majuscule accent circonflexe",Uuml:"U majuscule tr茅ma",Yacute:"Y majuscule accent aigu",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a minuscule accent grave",aacute:"a minuscule accent aigu",acirc:"a minuscule accent circonflexe",atilde:"a minuscule avec caron",
    +auml:"a minuscule tr茅ma",aring:"a minuscule avec un rond au-dessus",aelig:"忙 minuscule ligatur茅s",ccedil:"c minuscule c茅dille",egrave:"e minuscule accent grave",eacute:"e minuscule accent aigu",ecirc:"e minuscule accent circonflexe",euml:"e minuscule tr茅ma",igrave:"i minuscule accent grave",iacute:"i minuscule accent aigu",icirc:"i minuscule accent circonflexe",iuml:"i minuscule tr茅ma",eth:"Lettre minuscule islandaise ED",ntilde:"n minuscule avec caron",ograve:"o minuscule accent grave",oacute:"o minuscule accent aigu",
    +ocirc:"o minuscule accent circonflexe",otilde:"o minuscule avec caron",ouml:"o minuscule tr茅ma",divide:"Division",oslash:"o minuscule barr茅",ugrave:"u minuscule accent grave",uacute:"u minuscule accent aigu",ucirc:"u minuscule accent circonflexe",uuml:"u minuscule tr茅ma",yacute:"y minuscule accent aigu",thorn:"Lettre islandaise thorn minuscule",yuml:"y minuscule tr茅ma",OElig:"ligature majuscule latine 艗",oelig:"ligature minuscule latine 艙",372:"W majuscule accent circonflexe",374:"Y majuscule accent circonflexe",
    +373:"w minuscule accent circonflexe",375:"y minuscule accent circonflexe",sbquo:"Guillemet simple fermant (anglais)",8219:"Guillemet-virgule sup茅rieur culbut茅",bdquo:"Guillemet-virgule double inf茅rieur",hellip:"Points de suspension",trade:"Marque commerciale (trade mark)",9658:"Fl猫che noire pointant vers la droite",bull:"Gros point m茅dian",rarr:"Fl猫che vers la droite",rArr:"Double fl猫che vers la droite",hArr:"Double fl猫che vers la gauche",diams:"Carreau noir",asymp:"Presque 茅gal"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/gl.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/gl.js
    new file mode 100644
    index 00000000..0725350c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/gl.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","gl",{euro:"S铆mbolo do euro",lsquo:"Comi帽a simple esquerda",rsquo:"Comi帽a simple dereita",ldquo:"Comi帽as dobres esquerda",rdquo:"Comi帽as dobres dereita",ndash:"Gui贸n",mdash:"Raia",iexcl:"Signo de admiraci贸n invertido",cent:"S铆mbolo do centavo",pound:"S铆mbolo da libra",curren:"S铆mbolo de moeda",yen:"S铆mbolo do yen",brvbar:"Barra vertical rota",sect:"S铆mbolo de secci贸n",uml:"Di茅rese",copy:"S铆mbolo de dereitos de autor铆a",ordf:"Indicador ordinal feminino",laquo:"Comi帽as latinas, apertura",
    +not:"Signo negaci贸n",reg:"S铆mbolo de marca rexistrada",macr:"Gui贸n alto",deg:"Signo de grao",sup2:"Super铆ndice dous",sup3:"Super铆ndice tres",acute:"Acento agudo",micro:"Signo de micro",para:"Signo de pi",middot:"Punto medio",cedil:"Cedilla",sup1:"Super铆ndice un",ordm:"Indicador ordinal masculino",raquo:"Comi帽as latinas, peche",frac14:"Fracci贸n ordinaria de un cuarto",frac12:"Fracci贸n ordinaria de un medio",frac34:"Fracci贸n ordinaria de tres cuartos",iquest:"Signo de interrogaci贸n invertido",Agrave:"Letra A latina mai煤scula con acento grave",
    +Aacute:"Letra A latina mai煤scula con acento agudo",Acirc:"Letra A latina mai煤scula con acento circunflexo",Atilde:"Letra A latina mai煤scula con til",Auml:"Letra A latina mai煤scula con di茅rese",Aring:"Letra A latina mai煤scula con aro enriba",AElig:"Letra 脝 latina mai煤scula",Ccedil:"Letra C latina mai煤scula con cedilla",Egrave:"Letra E latina mai煤scula con acento grave",Eacute:"Letra E latina mai煤scula con acento agudo",Ecirc:"Letra E latina mai煤scula con acento circunflexo",Euml:"Letra E latina mai煤scula con di茅rese",
    +Igrave:"Letra I latina mai煤scula con acento grave",Iacute:"Letra I latina mai煤scula con acento agudo",Icirc:"Letra I latina mai煤scula con acento circunflexo",Iuml:"Letra I latina mai煤scula con di茅rese",ETH:"Letra Ed latina mai煤scula",Ntilde:"Letra N latina mai煤scula con til",Ograve:"Letra O latina mai煤scula con acento grave",Oacute:"Letra O latina mai煤scula con acento agudo",Ocirc:"Letra O latina mai煤scula con acento circunflexo",Otilde:"Letra O latina mai煤scula con til",Ouml:"Letra O latina mai煤scula con di茅rese",
    +times:"Signo de multiplicaci贸n",Oslash:"Letra O latina mai煤scula con barra transversal",Ugrave:"Letra U latina mai煤scula con acento grave",Uacute:"Letra U latina mai煤scula con acento agudo",Ucirc:"Letra U latina mai煤scula con acento circunflexo",Uuml:"Letra U latina mai煤scula con di茅rese",Yacute:"Letra Y latina mai煤scula con acento agudo",THORN:"Letra Thorn latina mai煤scula",szlig:"Letra s latina forte min煤scula",agrave:"Letra a latina min煤scula con acento grave",aacute:"Letra a latina min煤scula con acento agudo",
    +acirc:"Letra a latina min煤scula con acento circunflexo",atilde:"Letra a latina min煤scula con til",auml:"Letra a latina min煤scula con di茅rese",aring:"Letra a latina min煤scula con aro enriba",aelig:"Letra 忙 latina min煤scula",ccedil:"Letra c latina min煤scula con cedilla",egrave:"Letra e latina min煤scula con acento grave",eacute:"Letra e latina min煤scula con acento agudo",ecirc:"Letra e latina min煤scula con acento circunflexo",euml:"Letra e latina min煤scula con di茅rese",igrave:"Letra i latina min煤scula con acento grave",
    +iacute:"Letra i latina min煤scula con acento agudo",icirc:"Letra i latina min煤scula con acento circunflexo",iuml:"Letra i latina min煤scula con di茅rese",eth:"Letra ed latina min煤scula",ntilde:"Letra n latina min煤scula con til",ograve:"Letra o latina min煤scula con acento grave",oacute:"Letra o latina min煤scula con acento agudo",ocirc:"Letra o latina min煤scula con acento circunflexo",otilde:"Letra o latina min煤scula con til",ouml:"Letra o latina min煤scula con di茅rese",divide:"Signo de divisi贸n",oslash:"Letra o latina min煤scula con barra transversal",
    +ugrave:"Letra u latina min煤scula con acento grave",uacute:"Letra u latina min煤scula con acento agudo",ucirc:"Letra u latina min煤scula con acento circunflexo",uuml:"Letra u latina min煤scula con di茅rese",yacute:"Letra y latina min煤scula con acento agudo",thorn:"Letra Thorn latina min煤scula",yuml:"Letra y latina min煤scula con di茅rese",OElig:"Ligadura OE latina mai煤scula",oelig:"Ligadura oe latina min煤scula",372:"Letra W latina mai煤scula con acento circunflexo",374:"Letra Y latina mai煤scula con acento circunflexo",
    +373:"Letra w latina min煤scula con acento circunflexo",375:"Letra y latina min煤scula con acento circunflexo",sbquo:"Comi帽a simple baixa, de apertura",8219:"Comi帽a simple alta, de peche",bdquo:"Comi帽as dobres baixas, de apertura",hellip:"Elipse, puntos suspensivos",trade:"Signo de marca rexistrada",9658:"Apuntador negro apuntando 谩 dereita",bull:"Vi帽eta",rarr:"Frecha 谩 dereita",rArr:"Frecha dobre 谩 dereita",hArr:"Frecha dobre da esquerda 谩 dereita",diams:"Diamante negro",asymp:"Case igual a"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/he.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/he.js
    new file mode 100644
    index 00000000..17ee34f7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/he.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","he",{euro:"讬讜专讜",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
    +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
    +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter 脝",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
    +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
    +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
    +aring:"Latin small letter a with ring above",aelig:"Latin small letter 忙",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
    +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
    +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
    +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/hr.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/hr.js
    new file mode 100644
    index 00000000..5ccc3998
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/hr.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","hr",{euro:"Euro znak",lsquo:"Lijevi jednostruki navodnik",rsquo:"Desni jednostruki navodnik",ldquo:"Lijevi dvostruki navodnik",rdquo:"Desni dvostruki navodnik",ndash:"En crtica",mdash:"Em crtica",iexcl:"Naopaki uskli膷nik",cent:"Cent znak",pound:"Funta znak",curren:"Znak valute",yen:"Yen znak",brvbar:"Potrgana pre膷ka",sect:"Znak odjeljka",uml:"Prijeglasi",copy:"Copyright znak",ordf:"Feminine ordinal indicator",laquo:"Lijevi dvostruki uglati navodnik",not:"Not znak",
    +reg:"Registered znak",macr:"Macron",deg:"Stupanj znak",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Mikro znak",para:"Pilcrow sign",middot:"Srednja to膷ka",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Desni dvostruku uglati navodnik",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Naopaki upitnik",Agrave:"Veliko latinsko slovo A s akcentom",Aacute:"Latin capital letter A with acute accent",
    +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter 脝",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",
    +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",
    +Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",
    +aelig:"Latin small letter 忙",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",
    +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",
    +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",
    +bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/hu.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/hu.js
    new file mode 100644
    index 00000000..781611ed
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/hu.js
    @@ -0,0 +1,12 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","hu",{euro:"Eur贸 jel",lsquo:"Bal szimpla id茅z艖jel",rsquo:"Jobb szimpla id茅z艖jel",ldquo:"Bal dupla id茅z艖jel",rdquo:"Jobb dupla id茅z艖jel",ndash:"R枚vid gondolatjel",mdash:"Hossz煤 gondolatjel",iexcl:"Ford铆tott felki谩lt贸jel",cent:"Cent jel",pound:"Font jel",curren:"Valuta jel",yen:"Yen jel",brvbar:"Hossz煤 kett艖spont",sect:"Paragrafus jel",uml:"Kett艖s hangz贸 jel",copy:"Szerz艖i jog jel",ordf:"N艖i sorrend mutat贸ja",laquo:"Balra mutat贸 duplany铆l",not:"Felt茅teles k枚t艖jel",
    +reg:"Bejegyzett v茅djegy jele",macr:"Hossz煤s谩gi jel",deg:"Fok jel",sup2:"N茅gyzeten jel",sup3:"K枚b枚n jel",acute:"脡les 茅kezet",micro:"Mikro-jel",para:"Bekezd茅s jel",middot:"K枚z茅p pont",cedil:"C茅dille",sup1:"Els艖n jel",ordm:"F茅rfi sorrend mutat贸ja",raquo:"Jobbra mutat贸 duplany铆l",frac14:"Egy negyed jel",frac12:"Egy ketted jel",frac34:"H谩rom negyed jel",iquest:"Ford铆tott k茅rd艖jel",Agrave:"Latin nagy A ford铆tott 茅kezettel",Aacute:"Latin nagy A norm谩l 茅kezettel",Acirc:"Latin nagy A hajtott 茅kezettel",Atilde:"Latin nagy A hull谩mjellel",
    +Auml:"Latin nagy A kett艖spont 茅kezettel",Aring:"Latin nagy A gy疟r疟 茅kezettel",AElig:"Latin nagy 脝 bet疟",Ccedil:"Latin nagy C cedill谩val",Egrave:"Latin nagy E ford铆tott 茅kezettel",Eacute:"Latin nagy E norm谩l 茅kezettel",Ecirc:"Latin nagy E hajtott 茅kezettel",Euml:"Latin nagy E dupla kett艖spont 茅kezettel",Igrave:"Latin nagy I ford铆tott 茅kezettel",Iacute:"Latin nagy I norm谩l 茅kezettel",Icirc:"Latin nagy I hajtott 茅kezettel",Iuml:"Latin nagy I kett艖spont 茅kezettel",ETH:"Latin nagy Eth bet疟",Ntilde:"Latin nagy N hull谩mjellel",
    +Ograve:"Latin nagy O ford铆tott 茅kezettel",Oacute:"Latin nagy O norm谩l 茅kezettel",Ocirc:"Latin nagy O hajtott 茅kezettel",Otilde:"Latin nagy O hull谩mjellel",Ouml:"Latin nagy O kett艖spont 茅kezettel",times:"Szorz谩s jel",Oslash:"Latin O bet疟 谩th煤z谩ssal",Ugrave:"Latin nagy U ford铆tott 茅kezettel",Uacute:"Latin nagy U norm谩l 茅kezettel",Ucirc:"Latin nagy U hajtott 茅kezettel",Uuml:"Latin nagy U kett艖spont 茅kezettel",Yacute:"Latin nagy Y norm谩l 茅kezettel",THORN:"Latin nagy Thorn bet疟",szlig:"Latin kis s bet疟",
    +agrave:"Latin kis a ford铆tott 茅kezettel",aacute:"Latin kis a norm谩l 茅kezettel",acirc:"Latin kis a hajtott 茅kezettel",atilde:"Latin kis a hull谩mjellel",auml:"Latin kis a kett艖spont 茅kezettel",aring:"Latin kis a gy疟r疟 茅kezettel",aelig:"Latin kis 忙 bet疟",ccedil:"Latin kis c cedill谩val",egrave:"Latin kis e ford铆tott 茅kezettel",eacute:"Latin kis e norm谩l 茅kezettel",ecirc:"Latin kis e hajtott 茅kezettel",euml:"Latin kis e dupla kett艖spont 茅kezettel",igrave:"Latin kis i ford铆tott 茅kezettel",iacute:"Latin kis i norm谩l 茅kezettel",
    +icirc:"Latin kis i hajtott 茅kezettel",iuml:"Latin kis i kett艖spont 茅kezettel",eth:"Latin kis eth bet疟",ntilde:"Latin kis n hull谩mjellel",ograve:"Latin kis o ford铆tott 茅kezettel",oacute:"Latin kis o norm谩l 茅kezettel",ocirc:"Latin kis o hajtott 茅kezettel",otilde:"Latin kis o hull谩mjellel",ouml:"Latin kis o kett艖spont 茅kezettel",divide:"Oszt谩sjel",oslash:"Latin kis o bet疟 谩th煤z谩ssal",ugrave:"Latin kis u ford铆tott 茅kezettel",uacute:"Latin kis u norm谩l 茅kezettel",ucirc:"Latin kis u hajtott 茅kezettel",
    +uuml:"Latin kis u kett艖spont 茅kezettel",yacute:"Latin kis y norm谩l 茅kezettel",thorn:"Latin kis thorn jel",yuml:"Latin kis y kett艖spont 茅kezettel",OElig:"Latin nagy OE-jel",oelig:"Latin kis oe-jel",372:"Latin nagy W hajtott 茅kezettel",374:"Latin nagy Y hajtott 茅kezettel",373:"Latin kis w hajtott 茅kezettel",375:"Latin kis y hajtott 茅kezettel",sbquo:"Nyit贸 nyomdai szimpla id茅z艖jel",8219:"Z谩r贸 nyomdai z谩r贸 id茅z艖jel",bdquo:"Nyit贸 nyomdai dupla id茅z艖jel",hellip:"H谩rom pont",trade:"Kereskedelmi v茅djegy jele",
    +9658:"Jobbra mutat贸 fekete mutat贸",bull:"Goly贸",rarr:"Jobbra mutat贸 ny铆l",rArr:"Jobbra mutat贸 duplany铆l",hArr:"Bal-jobb duplany铆l",diams:"Fekete gy茅m谩nt jel",asymp:"Majdnem egyenl艖 jel"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/id.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/id.js
    new file mode 100644
    index 00000000..36bd6c43
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/id.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","id",{euro:"Tanda Euro",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Tanda Yen",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Tanda Hak Cipta",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
    +not:"Not sign",reg:"Tanda Telah Terdaftar",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
    +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter 脝",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
    +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
    +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
    +aring:"Latin small letter a with ring above",aelig:"Latin small letter 忙",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
    +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
    +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
    +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/it.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/it.js
    new file mode 100644
    index 00000000..b08b24df
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/it.js
    @@ -0,0 +1,14 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","it",{euro:"Simbolo Euro",lsquo:"Virgoletta singola sinistra",rsquo:"Virgoletta singola destra",ldquo:"Virgolette aperte",rdquo:"Virgolette chiuse",ndash:"Trattino",mdash:"Trattino lungo",iexcl:"Punto esclavamativo invertito",cent:"Simbolo Cent",pound:"Simbolo Sterlina",curren:"Simbolo Moneta",yen:"Simbolo Yen",brvbar:"Barra interrotta",sect:"Simbolo di sezione",uml:"Dieresi",copy:"Simbolo Copyright",ordf:"Indicatore ordinale femminile",laquo:"Virgolette basse aperte",
    +not:"Nessun segno",reg:"Simbolo Registrato",macr:"Macron",deg:"Simbolo Grado",sup2:"Apice Due",sup3:"Apice Tre",acute:"Accento acuto",micro:"Simbolo Micro",para:"Simbolo Paragrafo",middot:"Punto centrale",cedil:"Cediglia",sup1:"Apice Uno",ordm:"Indicatore ordinale maschile",raquo:"Virgolette basse chiuse",frac14:"Frazione volgare un quarto",frac12:"Frazione volgare un mezzo",frac34:"Frazione volgare tre quarti",iquest:"Punto interrogativo invertito",Agrave:"Lettera maiuscola latina A con accento grave",
    +Aacute:"Lettera maiuscola latina A con accento acuto",Acirc:"Lettera maiuscola latina A con accento circonflesso",Atilde:"Lettera maiuscola latina A con tilde",Auml:"Lettera maiuscola latina A con dieresi",Aring:"Lettera maiuscola latina A con anello sopra",AElig:"Lettera maiuscola latina AE",Ccedil:"Lettera maiuscola latina C con cediglia",Egrave:"Lettera maiuscola latina E con accento grave",Eacute:"Lettera maiuscola latina E con accento acuto",Ecirc:"Lettera maiuscola latina E con accento circonflesso",
    +Euml:"Lettera maiuscola latina E con dieresi",Igrave:"Lettera maiuscola latina I con accento grave",Iacute:"Lettera maiuscola latina I con accento acuto",Icirc:"Lettera maiuscola latina I con accento circonflesso",Iuml:"Lettera maiuscola latina I con dieresi",ETH:"Lettera maiuscola latina Eth",Ntilde:"Lettera maiuscola latina N con tilde",Ograve:"Lettera maiuscola latina O con accento grave",Oacute:"Lettera maiuscola latina O con accento acuto",Ocirc:"Lettera maiuscola latina O con accento circonflesso",
    +Otilde:"Lettera maiuscola latina O con tilde",Ouml:"Lettera maiuscola latina O con dieresi",times:"Simbolo di moltiplicazione",Oslash:"Lettera maiuscola latina O barrata",Ugrave:"Lettera maiuscola latina U con accento grave",Uacute:"Lettera maiuscola latina U con accento acuto",Ucirc:"Lettera maiuscola latina U con accento circonflesso",Uuml:"Lettera maiuscola latina U con accento circonflesso",Yacute:"Lettera maiuscola latina Y con accento acuto",THORN:"Lettera maiuscola latina Thorn",szlig:"Lettera latina minuscola doppia S",
    +agrave:"Lettera minuscola latina a con accento grave",aacute:"Lettera minuscola latina a con accento acuto",acirc:"Lettera minuscola latina a con accento circonflesso",atilde:"Lettera minuscola latina a con tilde",auml:"Lettera minuscola latina a con dieresi",aring:"Lettera minuscola latina a con anello superiore",aelig:"Lettera minuscola latina ae",ccedil:"Lettera minuscola latina c con cediglia",egrave:"Lettera minuscola latina e con accento grave",eacute:"Lettera minuscola latina e con accento acuto",
    +ecirc:"Lettera minuscola latina e con accento circonflesso",euml:"Lettera minuscola latina e con dieresi",igrave:"Lettera minuscola latina i con accento grave",iacute:"Lettera minuscola latina i con accento acuto",icirc:"Lettera minuscola latina i con accento circonflesso",iuml:"Lettera minuscola latina i con dieresi",eth:"Lettera minuscola latina eth",ntilde:"Lettera minuscola latina n con tilde",ograve:"Lettera minuscola latina o con accento grave",oacute:"Lettera minuscola latina o con accento acuto",
    +ocirc:"Lettera minuscola latina o con accento circonflesso",otilde:"Lettera minuscola latina o con tilde",ouml:"Lettera minuscola latina o con dieresi",divide:"Simbolo di divisione",oslash:"Lettera minuscola latina o barrata",ugrave:"Lettera minuscola latina u con accento grave",uacute:"Lettera minuscola latina u con accento acuto",ucirc:"Lettera minuscola latina u con accento circonflesso",uuml:"Lettera minuscola latina u con dieresi",yacute:"Lettera minuscola latina y con accento acuto",thorn:"Lettera minuscola latina thorn",
    +yuml:"Lettera minuscola latina y con dieresi",OElig:"Legatura maiuscola latina OE",oelig:"Legatura minuscola latina oe",372:"Lettera maiuscola latina W con accento circonflesso",374:"Lettera maiuscola latina Y con accento circonflesso",373:"Lettera minuscola latina w con accento circonflesso",375:"Lettera minuscola latina y con accento circonflesso",sbquo:"Singola virgoletta bassa low-9",8219:"Singola virgoletta bassa low-9 inversa",bdquo:"Doppia virgoletta bassa low-9",hellip:"Ellissi orizzontale",
    +trade:"Simbolo TM",9658:"Puntatore nero rivolto verso destra",bull:"Punto",rarr:"Freccia verso destra",rArr:"Doppia freccia verso destra",hArr:"Doppia freccia sinistra destra",diams:"Simbolo nero diamante",asymp:"Quasi uguale a"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ja.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ja.js
    new file mode 100644
    index 00000000..e63e3333
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ja.js
    @@ -0,0 +1,9 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","ja",{euro:"銉︺兗銉鍙",lsquo:"宸︺偡銉炽偘銉紩鐢ㄧ",rsquo:"鍙炽偡銉炽偘銉紩鐢ㄧ",ldquo:"宸︺儉銉栥儷寮曠敤绗",rdquo:"鍙炽儉銉栥儷寮曠敤绗",ndash:"鍗婅銉銉冦偡銉",mdash:"鍏ㄨ銉銉冦偡銉",iexcl:"閫嗐仌鎰熷槅绗",cent:"銈汇兂銉堣鍙",pound:"銉濄兂銉夎鍙",curren:"閫氳波瑷樺彿",yen:"鍐嗚鍙",brvbar:"涓婁笅銇垎銇嬨倢銇熺甫妫",sect:"绡瑷樺彿",uml:"鍒嗛煶瑷樺彿(銈︺儬銉┿偊銉)",copy:"钁椾綔妯╄〃绀鸿鍙",ordf:"濂虫у簭鏁版璀",laquo:" 濮嬨倎浜岄噸灞辨嫭寮у紩鐢ㄨ鍙",not:"璜栫悊鍚﹀畾瑷樺彿",reg:"鐧婚尣鍟嗘瑷樺彿",macr:"闀烽煶绗",deg:"搴﹁鍙",sup2:"涓娿仱銇2, 2涔",sup3:"涓娿仱銇3, 3涔",acute:"鎻氶煶绗",micro:"銉熴偗銉兂瑷樺彿",para:"娈佃惤瑷樺彿",middot:"涓粧",cedil:"銈汇儑銈c儵",sup1:"涓娿仱銇1",ordm:"鐢锋у簭鏁版璀",raquo:"绲傘倧銈婁簩閲嶅北鎷姬寮曠敤瑷樺彿",
    +frac14:"鍥涘垎銇竴",frac12:"浜屽垎銇竴",frac34:"鍥涘垎銇笁",iquest:"閫嗙枒鍟忕",Agrave:"鎶戦煶绗︺仱銇嶅ぇ鏂囧瓧A",Aacute:"鎻氶煶绗︺仱銇嶅ぇ鏂囧瓧A",Acirc:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅ぇ鏂囧瓧A",Atilde:"銉併儷銉銇ゃ亶澶ф枃瀛桝",Auml:"鍒嗛煶瑷樺彿銇ゃ亶澶ф枃瀛桝",Aring:"銉兂銈般仱銇嶅ぇ鏂囧瓧A",AElig:"A銇‥銇悎瀛",Ccedil:"銈汇儑銈c儵銇ゃ亶澶ф枃瀛桟",Egrave:"鎶戦煶绗︺仱銇嶅ぇ鏂囧瓧E",Eacute:"鎻氶煶绗︺仱銇嶅ぇ鏂囧瓧E",Ecirc:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅ぇ鏂囧瓧E",Euml:"鍒嗛煶瑷樺彿銇ゃ亶澶ф枃瀛桬",Igrave:"鎶戦煶绗︺仱銇嶅ぇ鏂囧瓧I",Iacute:"鎻氶煶绗︺仱銇嶅ぇ鏂囧瓧I",Icirc:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅ぇ鏂囧瓧I",Iuml:"鍒嗛煶瑷樺彿銇ゃ亶澶ф枃瀛桰",ETH:"[銈€偆銈广儵銉炽儔瑾瀅澶ф枃瀛桬TH",Ntilde:"銉併儷銉銇ゃ亶澶ф枃瀛桸",Ograve:"鎶戦煶绗︺仱銇嶅ぇ鏂囧瓧O",Oacute:"鎻氶煶绗︺仱銇嶅ぇ鏂囧瓧O",Ocirc:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅ぇ鏂囧瓧O",Otilde:"銉併儷銉銇ゃ亶澶ф枃瀛桹",Ouml:" 鍒嗛煶瑷樺彿銇ゃ亶澶ф枃瀛桹",
    +times:"涔楃畻瑷樺彿",Oslash:"鎵撱仭娑堛仐绶氥仱銇嶅ぇ鏂囧瓧O",Ugrave:"鎶戦煶绗︺仱銇嶅ぇ鏂囧瓧U",Uacute:"鎻氶煶绗︺仱銇嶅ぇ鏂囧瓧U",Ucirc:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅ぇ鏂囧瓧U",Uuml:"鍒嗛煶瑷樺彿銇ゃ亶澶ф枃瀛桿",Yacute:"鎻氶煶绗︺仱銇嶅ぇ鏂囧瓧Y",THORN:"[銈€偆銈广儵銉炽儔瑾瀅澶ф枃瀛桾HORN",szlig:"銉夈偆銉勮獮銈ㄣ偣銉勩偋銉冦儓",agrave:"鎶戦煶绗︺仱銇嶅皬鏂囧瓧a",aacute:"鎻氶煶绗︺仱銇嶅皬鏂囧瓧a",acirc:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅皬鏂囧瓧a",atilde:"銉併儷銉銇ゃ亶灏忔枃瀛梐",auml:"鍒嗛煶瑷樺彿銇ゃ亶灏忔枃瀛梐",aring:"銉兂銈般仱銇嶅皬鏂囧瓧a",aelig:"a銇╡銇悎瀛",ccedil:"銈汇儑銈c儵銇ゃ亶灏忔枃瀛梒",egrave:"鎶戦煶绗︺仱銇嶅皬鏂囧瓧e",eacute:"鎻氶煶绗︺仱銇嶅皬鏂囧瓧e",ecirc:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅皬鏂囧瓧e",euml:"鍒嗛煶瑷樺彿銇ゃ亶灏忔枃瀛梕",igrave:"鎶戦煶绗︺仱銇嶅皬鏂囧瓧i",iacute:"鎻氶煶绗︺仱銇嶅皬鏂囧瓧i",icirc:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅皬鏂囧瓧i",iuml:"鍒嗛煶瑷樺彿銇ゃ亶灏忔枃瀛梚",eth:"銈€偆銈广儵銉炽儔瑾炲皬鏂囧瓧eth",
    +ntilde:"銉併儷銉銇ゃ亶灏忔枃瀛梟",ograve:"鎶戦煶绗︺仱銇嶅皬鏂囧瓧o",oacute:"鎻氶煶绗︺仱銇嶅皬鏂囧瓧o",ocirc:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅皬鏂囧瓧o",otilde:"銉併儷銉銇ゃ亶灏忔枃瀛梠",ouml:"鍒嗛煶瑷樺彿銇ゃ亶灏忔枃瀛梠",divide:"闄ょ畻瑷樺彿",oslash:"鎵撱仭娑堛仐绶氥仱銇嶅皬鏂囧瓧o",ugrave:"鎶戦煶绗︺仱銇嶅皬鏂囧瓧u",uacute:"鎻氶煶绗︺仱銇嶅皬鏂囧瓧u",ucirc:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅皬鏂囧瓧u",uuml:"鍒嗛煶瑷樺彿銇ゃ亶灏忔枃瀛梪",yacute:"鎻氶煶绗︺仱銇嶅皬鏂囧瓧y",thorn:"銈€偆銈广儵銉炽儔瑾炲皬鏂囧瓧thorn",yuml:"鍒嗛煶瑷樺彿銇ゃ亶灏忔枃瀛梱",OElig:"O銇‥銇悎瀛",oelig:"o銇╡銇悎瀛",372:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅ぇ鏂囧瓧W",374:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅ぇ鏂囧瓧Y",373:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅皬鏂囧瓧w",375:"鏇叉姌銈€偗銈汇兂銉堛仱銇嶅皬鏂囧瓧y",sbquo:"銈枫兂銈般儷涓嬪紩鐢ㄧ",8219:"宸﹀彸閫嗐伄宸﹀紩鐢ㄧ",bdquo:"銉銉栥儷涓嬪紩鐢ㄧ",hellip:"涓夌偣銉兗銉",trade:"鍟嗘瑷樺彿",9658:"鍙抽粧涓夎銉濄偆銉炽偪",bull:"榛掍父",
    +rarr:"鍙崇煝鍗",rArr:"鍙充簩閲嶇煝鍗",hArr:"宸﹀彸浜岄噸鐭㈠嵃",diams:"銉銈ゃ儰",asymp:"婕歌繎"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ku.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ku.js
    new file mode 100644
    index 00000000..5fa65b85
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ku.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","ku",{euro:"賳蹖卮丕賳蹠蹖 蹖蹎乇蹎",lsquo:"賳蹖卮丕賳蹠蹖 賮丕乇蹖夭蹠蹖 爻蹠乇賵賵跇蹘乇蹖 鬲丕讴蹖 趩蹠倬",rsquo:"賳蹖卮丕賳蹠蹖 賮丕乇蹖夭蹠蹖 爻蹠乇賵賵跇蹘乇蹖 鬲丕讴蹖 跁丕爻鬲",ldquo:"賳蹖卮丕賳蹠蹖 賮丕乇蹖夭蹠蹖 爻蹠乇賵賵跇蹘乇蹖 丿賵賵賴蹘賳丿蹠蹖 趩賴鈥屬",rdquo:"賳蹖卮丕賳蹠蹖 賮丕乇蹖夭蹠蹖 爻蹠乇賵賵跇蹘乇蹖 丿賵賵賴蹘賳丿蹠蹖 跁丕爻鬲",ndash:"鬲蹠賯蹠诘蹖 讴賵乇鬲",mdash:"鬲蹠賯蹠诘蹖 丿乇蹘跇",iexcl:"賳蹖卮丕賳蹠蹖 賴蹠诘蹠賵诏蹘跁蹖 爻蹠乇爻賵跁賴蹘賳蹠乇",cent:"賳蹖卮丕賳蹠蹖 爻蹠賳鬲",pound:"賳蹖卮丕賳蹠蹖 倬丕賵蹠賳丿",curren:"賳蹖卮丕賳蹠蹖 丿乇丕賵",yen:"賳蹖卮丕賳蹠蹖 蹖蹠賳蹖 跇丕倬蹎賳蹖",brvbar:"卮乇蹖鬲蹖 卅蹠爻鬲賵賵賳蹖 倬趩跁丕賵",sect:"賳蹖卮丕賳蹠蹖 丿賵賵 s 賱蹠爻蹠乇蹖蹠讴",uml:"禺丕诘",copy:"賳蹖卮丕賳蹠蹖 賲丕賮蹖 趩丕倬",
    +ordf:"賴蹘诘 賱蹠爻蹠乇 倬蹖鬲蹖 a",laquo:"丿賵賵 鬲蹖乇蹖 亘蹠丿賵賵丕蹖蹠讴蹖 趩蹠倬",not:"賳蹖卮丕賳蹠蹖 賳蹠禺蹘乇",reg:"賳蹖卮丕賳蹠蹖 R 賱蹠賳丕賵 亘丕夭賳蹠丿丕",macr:"賲丕讴跁蹎賳",deg:"賳蹖卮丕賳蹠蹖 倬賱蹠",sup2:"爻蹠乇賳賵賵爻蹖 丿賵賵",sup3:"爻蹠乇賳賵賵爻蹖 爻蹘",acute:"賱丕乇蹖 鬲蹖跇",micro:"賳蹖卮丕賳蹠蹖 u 賱賯 丿乇蹘跇蹖 趩蹠倬蹖 禺賵丕乇賵賵",para:"賳蹖卮丕賳蹠蹖 倬蹠跁蹠诏乇丕賮",middot:"賳丕賵蹠跁丕爻鬲蹖 禺丕诘",cedil:"賳蹖卮丕賳蹠蹖 c 跇蹘乇 趩賵賵讴乇蹠",sup1:"爻蹠乇賳賵賵爻蹖 蹖蹠讴",ordm:"賴蹘诘 賱蹠跇蹘乇 倬蹖鬲蹖 o",raquo:"丿賵賵 鬲蹖乇蹖 亘蹠丿賵賵丕蹖蹠讴蹖 跁丕爻鬲",frac14:"蹖蹠讴 賱蹠爻蹠乇 趩賵賵丕乇",frac12:"蹖蹠讴 賱蹠爻蹠乇 丿賵賵",frac34:"爻蹘 賱蹠爻蹠乇 趩賵賵丕乇",iquest:"賴蹘賲丕蹖 賴蹠诘蹠賵诏蹘乇蹖 倬乇爻蹖丕乇",Agrave:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 A-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 賱丕乇",
    +Aacute:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 A-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 鬲蹖跇",Acirc:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 A-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",Atilde:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 A-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 夭蹠跁蹠",Auml:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 A-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",Aring:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 诏蹠賵乇蹠蹖 脜",AElig:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 诏蹠賵乇蹠蹖 脝",Ccedil:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 C-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 跇蹘乇 趩賵賵讴乇蹠",Egrave:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 E-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 賱丕乇",Eacute:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 E-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 鬲蹖跇",Ecirc:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 E-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",Euml:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 E-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",
    +Igrave:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 I-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 賱丕乇",Iacute:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 I-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 鬲蹖跇",Icirc:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 I-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",Iuml:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 I-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",ETH:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 E-蹖 诏蹠賵乇蹠蹖",Ntilde:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 N-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 夭蹠跁蹠",Ograve:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 O-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 賱丕乇",Oacute:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 O-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 鬲蹖跇",Ocirc:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 O-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",Otilde:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 O-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 夭蹠跁蹠",Ouml:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 O-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",
    +times:"賳蹖卮丕賳蹠蹖 賱蹘讴丿丕賳",Oslash:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 诏蹠賵乇蹠蹖 脴 賱蹠诏蹠诘 賴蹘賲丕蹖 丿诘 賵蹠爻鬲丕賳",Ugrave:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 U-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 賱丕乇",Uacute:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 U-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 鬲蹖跇",Ucirc:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 U-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",Uuml:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 U-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",Yacute:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 Y-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 鬲蹖跇",THORN:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 丿跁讴蹖 诏蹠賵乇蹠",szlig:"倬蹖鬲蹖 賱丕鬲賳蹖 賳賵賵讴 鬲蹖跇蹖 s",agrave:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 a-蹖 亘趩賵賵讴 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 賱丕乇",aacute:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 a-蹖 亘趩賵賵賰 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 鬲蹖跇",acirc:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 a-蹖 亘趩賵賵賰 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",
    +atilde:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 a-蹖 亘趩賵賵賰 賱蹠诏蹠诘 夭蹠跁蹠",auml:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 a-蹖 亘趩賵賵賰 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",aring:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 氓-蹖 亘趩賵賵賰",aelig:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 忙-蹖 亘趩賵賵賰",ccedil:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 c-蹖 亘趩賵賵賰 賱蹠诏蹠诘 跇蹘乇 趩賵賵讴乇蹠",egrave:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 e-蹖 亘趩賵賵賰 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 賱丕乇",eacute:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 e-蹖 亘趩賵賵賰 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 鬲蹖跇",ecirc:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 e-蹖 亘趩賵賵賰 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",euml:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 e-蹖 亘趩賵賵賰 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",igrave:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 i-蹖 亘趩賵賵賰 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 賱丕乇",iacute:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 i-蹖 亘趩賵賵賰 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 鬲蹖跇",
    +icirc:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 i-蹖 亘趩賵賵賰 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",iuml:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 i-蹖 亘趩賵賵賰 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",eth:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 e-蹖 亘趩賵賵賰",ntilde:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 n-蹖 亘趩賵賵賰 賱蹠诏蹠诘 夭蹠跁蹠",ograve:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 o-蹖 亘趩賵賵賰 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 賱丕乇",oacute:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 o-蹖 亘趩賵賵賰 賱賴鈥屭曏 跁賵賵賲蹠鬲丿丕乇蹖 鬲蹖跇",ocirc:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 o-蹖 亘趩賵賵賰 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",otilde:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 o-蹖 亘趩賵賵賰 賱蹠诏蹠诘 夭蹠跁蹠",ouml:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 o-蹖 亘趩賵賵賰 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",divide:"賳蹖卮丕賳蹠蹖 丿丕亘蹠卮",oslash:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 诏蹠賵乇蹠蹖 酶 賱蹠诏蹠诘 賴蹘賲丕蹖 丿诘 賵蹠爻鬲丕賳",ugrave:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 u-蹖 亘趩賵賵賰 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 賱丕乇",
    +uacute:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 u-蹖 亘趩賵賵賰 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 鬲蹖跇",ucirc:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 u-蹖 亘趩賵賵賰 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",uuml:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 u-蹖 亘趩賵賵賰 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",yacute:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 y-蹖 亘趩賵賵賰 賱蹠诏蹠诘 跁賵賵賲蹠鬲丿丕乇蹖 鬲蹖跇",thorn:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 丿跁讴蹖 亘趩賵賵賰",yuml:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 y-蹖 亘趩賵賵賰 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",OElig:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 诏蹠賵乇蹠蹖 倬蹘讴蹠賵蹠賳賵賵爻乇丕賵蹖 OE",oelig:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 亘趩賵賵讴蹖 倬蹘讴蹠賵蹠賳賵賵爻乇丕賵蹖 oe",372:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 W-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",374:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 Y-蹖 诏蹠賵乇蹠 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",373:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 w-蹖 亘趩賵賵讴蹖 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",
    +375:"倬蹖鬲蹖 賱丕鬲蹖賳蹖 y-蹖 亘趩賵賵讴蹖 賱蹠诏蹠诘 賳蹖卮丕賳蹠 賱蹠爻蹠乇蹖",sbquo:"賳蹖卮丕賳蹠蹖 賮丕乇蹖夭蹠蹖 賳夭賲",8219:"賳蹖卮丕賳蹠蹖 賮丕乇蹖夭蹠蹖 亘蹠乇夭蹖 倬蹘趩蹠賵丕賳蹠",bdquo:"丿賵賵 賮丕乇蹖夭蹠蹖 鬲蹠賳蹖卮 蹖蹠賰",hellip:"卅丕爻蹎蹖蹖 亘丕夭賳蹠",trade:"賳蹖卮丕賳蹠蹖 亘丕夭乇诏丕賳蹖",9658:"卅丕乇丕爻鬲蹠蹖 跁蹠卮蹖 丿蹠爻鬲蹖 跁丕爻鬲",bull:"賮蹖卮蹠賰",rarr:"鬲蹖乇蹖 丿蹠爻鬲蹖 跁丕爻鬲",rArr:"丿賵賵鬲蹖乇蹖 丿蹠爻鬲蹖 跁丕爻鬲",hArr:"丿賵賵 鬲蹖乇蹖 跁丕爻鬲 賵 趩蹠倬",diams:"跁蹠卮蹖 倬丕賯诘丕賵蹠蹖蹖",asymp:"賳蹖卮丕賳蹠蹖 蹖蹠讴爻丕賳蹠"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/lv.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/lv.js
    new file mode 100644
    index 00000000..f7a82508
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/lv.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","lv",{euro:"Euro z墨me",lsquo:"Kreis膩  vienk膩rt墨ga p膿di艈a",rsquo:"Lab膩  vienk膩rt墨ga p膿di艈a",ldquo:"Kreis膩  dubult p膿di艈a",rdquo:"Lab膩 dubult p膿di艈a",ndash:"En sv墨tra",mdash:"Em sv墨tra",iexcl:"Apgriezta izsaukuma z墨me",cent:"Centu naudas z墨me",pound:"Sterli艈u m膩rci艈u naudas z墨me",curren:"Val奴tas z墨me",yen:"Jenu naudas z墨me",brvbar:"Vertik膩la p膩rrauta l墨nija",sect:"Paragr膩fa z墨me",uml:"Diakritiska z墨me",copy:"Autorties墨bu z墨me",ordf:"Sievi拧姆as k膩rtas r膩d墨t膩js",
    +laquo:"Kreis膩 dubult st奴ra p膿di艈u z墨me",not:"Neparakst墨ts",reg:"Re模istr膿ta z墨me",macr:"Garumz墨me",deg:"Gr膩du z墨me",sup2:"Aug拧raksts divi",sup3:"Aug拧raksts tr墨s",acute:"Ak奴ta uzsvara z墨me",micro:"Mikro z墨me",para:"Rindkopas z墨me ",middot:"Vid膿js punkts",cedil:"膧姆墨tis zem burta",sup1:"Aug拧raksts viens",ordm:"V墨ri拧姆墨gas k膩rtas r膩d墨t膩js",raquo:"Lab膩 dubult st奴ra p膿di艈u z墨me",frac14:"Vulg膩ra frakcija 1/4",frac12:"Vulg膩ra frakcija 1/2",frac34:"Vulg膩ra frakcija 3/4",iquest:"Apgriezta jaut膩juma z墨me",Agrave:"Lielais lat墨艈u burts A ar uzsvara z墨mi",
    +Aacute:"Lielais  lat墨艈u burts A ar ak奴tu uzsvara z墨mi",Acirc:"Lielais lat墨艈u burts A ar diakritisku z墨mi",Atilde:"Lielais lat墨艈u burts A ar tildi ",Auml:"Lielais lat墨艈u burts A ar diakritisko z墨mi",Aring:"Lielais lat墨艈u burts A ar apl墨ti aug拧膩",AElig:"Lielais lat墨艈u burts 脝",Ccedil:"Lielais lat墨艈u burts C ar 膩姆墨ti zem burta",Egrave:"Lielais lat墨艈u burts E ar apostrofu",Eacute:"Lielais lat墨艈u burts E ar ak奴tu uzsvara z墨mi",Ecirc:"Lielais lat墨艈u burts E ar diakritisko z墨mi",Euml:"Lielais lat墨艈u burts E ar diakritisko z墨mi",
    +Igrave:"Lielais lat墨艈u burts I ar uzsvaras  z墨mi",Iacute:"Lielais lat墨艈u burts I ar ak奴tu uzsvara z墨mi",Icirc:"Lielais lat墨艈u burts I ar diakritisko z墨mi",Iuml:"Lielais lat墨艈u burts I ar diakritisko z墨mi",ETH:"Lielais lat墨艈u burts Eth",Ntilde:"Lielais lat墨艈u burts N ar tildi",Ograve:"Lielais lat墨艈u burts O ar uzsvara z墨mi",Oacute:"Lielais lat墨艈u burts O ar ak奴to uzsvara z墨mi",Ocirc:"Lielais lat墨艈u burts O ar diakritisko z墨mi",Otilde:"Lielais lat墨艈u burts O ar tildi",Ouml:"Lielais lat墨艈u burts O ar diakritisko z墨mi",
    +times:"Reizin膩拧anas z墨me ",Oslash:"Lielais lat墨艈u burts O ar iesv墨trojumu",Ugrave:"Lielais lat墨艈u burts U ar uzsvaras z墨mi",Uacute:"Lielais lat墨艈u burts U ar ak奴to uzsvars z墨mi",Ucirc:"Lielais lat墨艈u burts U ar diakritisko z墨mi",Uuml:"Lielais lat墨艈u burts U ar diakritisko z墨mi",Yacute:"Lielais lat墨艈u burts Y ar ak奴to uzsvaras z墨mi",THORN:"Lielais lat墨艈u burts torn",szlig:"Mazs lat墨艈u burts ar ligat奴ru",agrave:"Mazs lat墨艈u burts a ar uzsvara z墨mi",aacute:"Mazs lat墨艈u burts a ar ak奴to uzsvara z墨mi",
    +acirc:"Mazs lat墨艈u burts a ar diakritisko z墨mi",atilde:"Mazs lat墨艈u burts a ar tildi",auml:"Mazs lat墨艈u burts a ar diakritisko z墨mi",aring:"Mazs lat墨艈u burts a ar apl墨ti aug拧膩",aelig:"Mazs lat墨艈u burts 忙",ccedil:"Mazs lat墨艈u burts c ar 膩姆墨ti zem burta",egrave:"Mazs lat墨艈u burts e ar uzsvara z墨mi ",eacute:"Mazs lat墨艈u burts e ar ak奴tu uzsvara z墨mi",ecirc:"Mazs lat墨艈u burts e ar diakritisko z墨mi",euml:"Mazs lat墨艈u burts e ar diakritisko z墨mi",igrave:"Mazs lat墨艈u burts i ar uzsvara z墨mi ",iacute:"Mazs lat墨艈u burts i ar ak奴tu uzsvara z墨mi",
    +icirc:"Mazs lat墨艈u burts i ar diakritisko z墨mi",iuml:"Mazs lat墨艈u burts i ar diakritisko z墨mi",eth:"Mazs lat墨艈u burts eth",ntilde:"Mazs lat墨艈u burts n ar tildi",ograve:"Mazs lat墨艈u burts o ar uzsvara z墨mi ",oacute:"Mazs lat墨艈u burts o ar ak奴tu uzsvara z墨mi",ocirc:"Mazs lat墨艈u burts o ar diakritisko z墨mi",otilde:"Mazs lat墨艈u burts o ar tildi",ouml:"Mazs lat墨艈u burts o ar diakritisko z墨mi",divide:"Dal墨拧anas z墨me",oslash:"Mazs lat墨艈u burts o ar iesv墨trojumu",ugrave:"Mazs lat墨艈u burts u ar uzsvara z墨mi ",
    +uacute:"Mazs lat墨艈u burts u ar  ak奴tu uzsvara z墨mi",ucirc:"Mazs lat墨艈u burts u ar diakritisko z墨mi",uuml:"Mazs lat墨艈u burts u ar diakritisko z墨mi",yacute:"Mazs lat墨艈u burts y ar  ak奴tu uzsvaras z墨mi",thorn:"Mazs lat墨艈u burts torns",yuml:"Mazs lat墨艈u burts y ar diakritisko z墨mi",OElig:"Liela lat墨艈u ligat奴ra OE",oelig:"Maza lat墨艈u ligat奴ra oe",372:"Liels lat墨艈u burts W ar diakritisko z墨mi ",374:"Liels lat墨艈u burts Y ar diakritisko z墨mi ",373:"Mazs lat墨艈u burts w ar diakritisko z墨mi ",375:"Mazs lat墨艈u burts y ar diakritisko z墨mi ",
    +sbquo:"Mazas-9 vienk膩rt墨gas p膿di艈as",8219:"Lielas-9 vienk膩rt墨gas apgrieztas p膿di艈as",bdquo:"Mazas-9 dubultas p膿di艈as",hellip:"Horizont膩li daudzpunkti",trade:"Pre膷u z墨mes z墨me",9658:"Melns pa labi pagriezts rad墨t膩js",bull:"Lode",rarr:"Bulta pa labi",rArr:"Dubulta Bulta pa labi",hArr:"Bulta pa kreisi",diams:"Dubulta Bulta pa kreisi",asymp:"Gandr墨z vien膩ds ar"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/nb.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/nb.js
    new file mode 100644
    index 00000000..2758992a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/nb.js
    @@ -0,0 +1,11 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","nb",{euro:"Eurosymbol",lsquo:"Venstre enkelt anf酶rselstegn",rsquo:"H酶yre enkelt anf酶rselstegn",ldquo:"Venstre dobbelt anf酶rselstegn",rdquo:"H酶yre anf酶rsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"T酶ddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anf酶rselstegn",not:"Negasjonstegn",
    +reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"H酶yre anf酶rselstegn",frac14:"Fjerdedelsbr酶k",frac12:"Halvbr酶k",frac34:"Tre fjerdedelers br酶k",iquest:"Omvendt sp酶rsm氓lstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde",
    +Auml:"Stor A med t酶ddel",Aring:"Stor 脜",AElig:"Stor 脝",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med t酶ddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med t酶ddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med t酶ddel",
    +times:"Multiplikasjonstegn",Oslash:"Stor 脴",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med t酶ddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med t酶ddel",aring:"Liten 氓",aelig:"Liten 忙",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent",
    +ecirc:"Liten e med cirkumfleks",euml:"Liten e med t酶ddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med t酶ddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med t酶ddel",divide:"Divisjonstegn",oslash:"Liten 酶",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks",
    +uuml:"Liten u med t酶ddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med t酶ddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anf酶rselstegn",8219:"Enkelt h酶yt reversert 9-anf酶rselstegn",bdquo:"Dobbelt lavt 9-anf酶rselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart h酶yrevendt peker",bull:"Tykk interpunkt",rarr:"H酶yrevendt pil",
    +rArr:"Dobbel h酶yrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/nl.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/nl.js
    new file mode 100644
    index 00000000..5838991f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/nl.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","nl",{euro:"Euro-teken",lsquo:"Linker enkel aanhalingsteken",rsquo:"Rechter enkel aanhalingsteken",ldquo:"Linker dubbel aanhalingsteken",rdquo:"Rechter dubbel aanhalingsteken",ndash:"En dash",mdash:"Em dash",iexcl:"Omgekeerd uitroepteken",cent:"Cent-teken",pound:"Pond-teken",curren:"Valuta-teken",yen:"Yen-teken",brvbar:"Gebroken streep",sect:"Paragraaf-teken",uml:"Trema",copy:"Copyright-teken",ordf:"Vrouwelijk ordinaal",laquo:"Linker guillemet",not:"Ongelijk-teken",
    +reg:"Geregistreerd handelsmerk-teken",macr:"Macron",deg:"Graden-teken",sup2:"Superscript twee",sup3:"Superscript drie",acute:"Accent aigu",micro:"Mico-teken",para:"Alinea-teken",middot:"Halfhoge punt",cedil:"Cedille",sup1:"Superscript een",ordm:"Mannelijk ordinaal",raquo:"Rechter guillemet",frac14:"Breuk kwart",frac12:"Breuk half",frac34:"Breuk driekwart",iquest:"Omgekeerd vraagteken",Agrave:"Latijnse hoofdletter A met een accent grave",Aacute:"Latijnse hoofdletter A met een accent aigu",Acirc:"Latijnse hoofdletter A met een circonflexe",
    +Atilde:"Latijnse hoofdletter A met een tilde",Auml:"Latijnse hoofdletter A met een trema",Aring:"Latijnse hoofdletter A met een corona",AElig:"Latijnse hoofdletter 脝",Ccedil:"Latijnse hoofdletter C met een cedille",Egrave:"Latijnse hoofdletter E met een accent grave",Eacute:"Latijnse hoofdletter E met een accent aigu",Ecirc:"Latijnse hoofdletter E met een circonflexe",Euml:"Latijnse hoofdletter E met een trema",Igrave:"Latijnse hoofdletter I met een accent grave",Iacute:"Latijnse hoofdletter I met een accent aigu",
    +Icirc:"Latijnse hoofdletter I met een circonflexe",Iuml:"Latijnse hoofdletter I met een trema",ETH:"Latijnse hoofdletter Eth",Ntilde:"Latijnse hoofdletter N met een tilde",Ograve:"Latijnse hoofdletter O met een accent grave",Oacute:"Latijnse hoofdletter O met een accent aigu",Ocirc:"Latijnse hoofdletter O met een circonflexe",Otilde:"Latijnse hoofdletter O met een tilde",Ouml:"Latijnse hoofdletter O met een trema",times:"Maal-teken",Oslash:"Latijnse hoofdletter O met een schuine streep",Ugrave:"Latijnse hoofdletter U met een accent grave",
    +Uacute:"Latijnse hoofdletter U met een accent aigu",Ucirc:"Latijnse hoofdletter U met een circonflexe",Uuml:"Latijnse hoofdletter U met een trema",Yacute:"Latijnse hoofdletter Y met een accent aigu",THORN:"Latijnse hoofdletter Thorn",szlig:"Latijnse kleine ringel-s",agrave:"Latijnse kleine letter a met een accent grave",aacute:"Latijnse kleine letter a met een accent aigu",acirc:"Latijnse kleine letter a met een circonflexe",atilde:"Latijnse kleine letter a met een tilde",auml:"Latijnse kleine letter a met een trema",
    +aring:"Latijnse kleine letter a met een corona",aelig:"Latijnse kleine letter 忙",ccedil:"Latijnse kleine letter c met een cedille",egrave:"Latijnse kleine letter e met een accent grave",eacute:"Latijnse kleine letter e met een accent aigu",ecirc:"Latijnse kleine letter e met een circonflexe",euml:"Latijnse kleine letter e met een trema",igrave:"Latijnse kleine letter i met een accent grave",iacute:"Latijnse kleine letter i met een accent aigu",icirc:"Latijnse kleine letter i met een circonflexe",
    +iuml:"Latijnse kleine letter i met een trema",eth:"Latijnse kleine letter eth",ntilde:"Latijnse kleine letter n met een tilde",ograve:"Latijnse kleine letter o met een accent grave",oacute:"Latijnse kleine letter o met een accent aigu",ocirc:"Latijnse kleine letter o met een circonflexe",otilde:"Latijnse kleine letter o met een tilde",ouml:"Latijnse kleine letter o met een trema",divide:"Deel-teken",oslash:"Latijnse kleine letter o met een schuine streep",ugrave:"Latijnse kleine letter u met een accent grave",
    +uacute:"Latijnse kleine letter u met een accent aigu",ucirc:"Latijnse kleine letter u met een circonflexe",uuml:"Latijnse kleine letter u met een trema",yacute:"Latijnse kleine letter y met een accent aigu",thorn:"Latijnse kleine letter thorn",yuml:"Latijnse kleine letter y met een trema",OElig:"Latijnse hoofdletter 艗",oelig:"Latijnse kleine letter 艙",372:"Latijnse hoofdletter W met een circonflexe",374:"Latijnse hoofdletter Y met een circonflexe",373:"Latijnse kleine letter w met een circonflexe",
    +375:"Latijnse kleine letter y met een circonflexe",sbquo:"Lage enkele aanhalingsteken",8219:"Hoge omgekeerde enkele aanhalingsteken",bdquo:"Lage dubbele aanhalingsteken",hellip:"Beletselteken",trade:"Trademark-teken",9658:"Zwarte driehoek naar rechts",bull:"Bullet",rarr:"Pijl naar rechts",rArr:"Dubbele pijl naar rechts",hArr:"Dubbele pijl naar links",diams:"Zwart ruitje",asymp:"Benaderingsteken"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/no.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/no.js
    new file mode 100644
    index 00000000..dadc22e3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/no.js
    @@ -0,0 +1,11 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","no",{euro:"Eurosymbol",lsquo:"Venstre enkelt anf酶rselstegn",rsquo:"H酶yre enkelt anf酶rselstegn",ldquo:"Venstre dobbelt anf酶rselstegn",rdquo:"H酶yre anf酶rsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"T酶ddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anf酶rselstegn",not:"Negasjonstegn",
    +reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"H酶yre anf酶rselstegn",frac14:"Fjerdedelsbr酶k",frac12:"Halvbr酶k",frac34:"Tre fjerdedelers br酶k",iquest:"Omvendt sp酶rsm氓lstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde",
    +Auml:"Stor A med t酶ddel",Aring:"Stor 脜",AElig:"Stor 脝",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med t酶ddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med t酶ddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med t酶ddel",
    +times:"Multiplikasjonstegn",Oslash:"Stor 脴",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med t酶ddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med t酶ddel",aring:"Liten 氓",aelig:"Liten 忙",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent",
    +ecirc:"Liten e med cirkumfleks",euml:"Liten e med t酶ddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med t酶ddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med t酶ddel",divide:"Divisjonstegn",oslash:"Liten 酶",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks",
    +uuml:"Liten u med t酶ddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med t酶ddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anf酶rselstegn",8219:"Enkelt h酶yt reversert 9-anf酶rselstegn",bdquo:"Dobbelt lavt 9-anf酶rselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart h酶yrevendt peker",bull:"Tykk interpunkt",rarr:"H酶yrevendt pil",
    +rArr:"Dobbel h酶yrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/pl.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/pl.js
    new file mode 100644
    index 00000000..b0460ceb
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/pl.js
    @@ -0,0 +1,12 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","pl",{euro:"Znak euro",lsquo:"Cudzys艂贸w pojedynczy otwieraj膮cy",rsquo:"Cudzys艂贸w pojedynczy zamykaj膮cy",ldquo:"Cudzys艂贸w apostrofowy otwieraj膮cy",rdquo:"Cudzys艂贸w apostrofowy zamykaj膮cy",ndash:"P贸艂pauza",mdash:"Pauza",iexcl:"Odwr贸cony wykrzyknik",cent:"Znak centa",pound:"Znak funta",curren:"Znak waluty",yen:"Znak jena",brvbar:"Przerwana pionowa kreska",sect:"Paragraf",uml:"Diereza",copy:"Znak praw autorskich",ordf:"Wska藕nik rodzaju 偶e艅skiego liczebnika porz膮dkowego",
    +laquo:"Lewy cudzys艂贸w ostrok膮tny",not:"Znak negacji",reg:"Zastrze偶ony znak towarowy",macr:"Makron",deg:"Znak stopnia",sup2:"Druga pot臋ga",sup3:"Trzecia pot臋ga",acute:"Akcent ostry",micro:"Znak mikro",para:"Znak akapitu",middot:"Kropka 艣rodkowa",cedil:"Cedylla",sup1:"Pierwsza pot臋ga",ordm:"Wska藕nik rodzaju m臋skiego liczebnika porz膮dkowego",raquo:"Prawy cudzys艂贸w ostrok膮tny",frac14:"U艂amek zwyk艂y jedna czwarta",frac12:"U艂amek zwyk艂y jedna druga",frac34:"U艂amek zwyk艂y trzy czwarte",iquest:"Odwr贸cony znak zapytania",
    +Agrave:"Wielka litera A z akcentem ci臋偶kim",Aacute:"Wielka litera A z akcentem ostrym",Acirc:"Wielka litera A z akcentem przeci膮g艂ym",Atilde:"Wielka litera A z tyld膮",Auml:"Wielka litera A z dierez膮",Aring:"Wielka litera A z k贸艂kiem",AElig:"Wielka ligatura 脝",Ccedil:"Wielka litera C z cedyll膮",Egrave:"Wielka litera E z akcentem ci臋偶kim",Eacute:"Wielka litera E z akcentem ostrym",Ecirc:"Wielka litera E z akcentem przeci膮g艂ym",Euml:"Wielka litera E z dierez膮",Igrave:"Wielka litera I z akcentem ci臋偶kim",
    +Iacute:"Wielka litera I z akcentem ostrym",Icirc:"Wielka litera I z akcentem przeci膮g艂ym",Iuml:"Wielka litera I z dierez膮",ETH:"Wielka litera Eth",Ntilde:"Wielka litera N z tyld膮",Ograve:"Wielka litera O z akcentem ci臋偶kim",Oacute:"Wielka litera O z akcentem ostrym",Ocirc:"Wielka litera O z akcentem przeci膮g艂ym",Otilde:"Wielka litera O z tyld膮",Ouml:"Wielka litera O z dierez膮",times:"Znak mno偶enia wektorowego",Oslash:"Wielka litera O z przekre艣leniem",Ugrave:"Wielka litera U z akcentem ci臋偶kim",Uacute:"Wielka litera U z akcentem ostrym",
    +Ucirc:"Wielka litera U z akcentem przeci膮g艂ym",Uuml:"Wielka litera U z dierez膮",Yacute:"Wielka litera Y z akcentem ostrym",THORN:"Wielka litera Thorn",szlig:"Ma艂a litera ostre s (eszet)",agrave:"Ma艂a litera a z akcentem ci臋偶kim",aacute:"Ma艂a litera a z akcentem ostrym",acirc:"Ma艂a litera a z akcentem przeci膮g艂ym",atilde:"Ma艂a litera a z tyld膮",auml:"Ma艂a litera a z dierez膮",aring:"Ma艂a litera a z k贸艂kiem",aelig:"Ma艂a ligatura 忙",ccedil:"Ma艂a litera c z cedyll膮",egrave:"Ma艂a litera e z akcentem ci臋偶kim",
    +eacute:"Ma艂a litera e z akcentem ostrym",ecirc:"Ma艂a litera e z akcentem przeci膮g艂ym",euml:"Ma艂a litera e z dierez膮",igrave:"Ma艂a litera i z akcentem ci臋偶kim",iacute:"Ma艂a litera i z akcentem ostrym",icirc:"Ma艂a litera i z akcentem przeci膮g艂ym",iuml:"Ma艂a litera i z dierez膮",eth:"Ma艂a litera eth",ntilde:"Ma艂a litera n z tyld膮",ograve:"Ma艂a litera o z akcentem ci臋偶kim",oacute:"Ma艂a litera o z akcentem ostrym",ocirc:"Ma艂a litera o z akcentem przeci膮g艂ym",otilde:"Ma艂a litera o z tyld膮",ouml:"Ma艂a litera o z dierez膮",
    +divide:"Anglosaski znak dzielenia",oslash:"Ma艂a litera o z przekre艣leniem",ugrave:"Ma艂a litera u z akcentem ci臋偶kim",uacute:"Ma艂a litera u z akcentem ostrym",ucirc:"Ma艂a litera u z akcentem przeci膮g艂ym",uuml:"Ma艂a litera u z dierez膮",yacute:"Ma艂a litera y z akcentem ostrym",thorn:"Ma艂a litera thorn",yuml:"Ma艂a litera y z dierez膮",OElig:"Wielka ligatura OE",oelig:"Ma艂a ligatura oe",372:"Wielka litera W z akcentem przeci膮g艂ym",374:"Wielka litera Y z akcentem przeci膮g艂ym",373:"Ma艂a litera w z akcentem przeci膮g艂ym",
    +375:"Ma艂a litera y z akcentem przeci膮g艂ym",sbquo:"Pojedynczy apostrof dolny",8219:"Pojedynczy apostrof g贸rny",bdquo:"Podw贸jny apostrof dolny",hellip:"Wielokropek",trade:"Znak towarowy",9658:"Czarny wska藕nik wskazuj膮cy w prawo",bull:"Punktor",rarr:"Strza艂ka w prawo",rArr:"Podw贸jna strza艂ka w prawo",hArr:"Podw贸jna strza艂ka w lewo",diams:"Czarny znak karo",asymp:"Znak prawie r贸wne"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js
    new file mode 100644
    index 00000000..98b84092
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js
    @@ -0,0 +1,11 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","pt-br",{euro:"Euro",lsquo:"Aspas simples esquerda",rsquo:"Aspas simples direita",ldquo:"Aspas duplas esquerda",rdquo:"Aspas duplas direita",ndash:"Tra莽o",mdash:"Travess茫o",iexcl:"Ponto de exclama莽茫o invertido",cent:"Cent",pound:"Cerquilha",curren:"Dinheiro",yen:"Yen",brvbar:"Bara interrompida",sect:"S铆mbolo de Par谩grafo",uml:"Trema",copy:"Direito de C贸pia",ordf:"Indicador ordinal feminino",laquo:"Aspas duplas angulares esquerda",not:"Nega莽茫o",reg:"Marca Registrada",
    +macr:"M谩cron",deg:"Grau",sup2:"2 Superscrito",sup3:"3 Superscrito",acute:"Acento agudo",micro:"Micro",para:"P茅 de mosca",middot:"Ponto mediano",cedil:"Cedilha",sup1:"1 Superscrito",ordm:"Indicador ordinal masculino",raquo:"Aspas duplas angulares direita",frac14:"Um quarto",frac12:"Um meio",frac34:"Tr锚s quartos",iquest:"Interroga莽茫o invertida",Agrave:"A mai煤sculo com acento grave",Aacute:"A mai煤sculo com acento agudo",Acirc:"A mai煤sculo com acento circunflexo",Atilde:"A mai煤sculo com til",Auml:"A mai煤sculo com trema",
    +Aring:"A mai煤sculo com anel acima",AElig:"脝 mai煤sculo",Ccedil:"脟 mai煤lculo",Egrave:"E mai煤sculo com acento grave",Eacute:"E mai煤sculo com acento agudo",Ecirc:"E mai煤sculo com acento circumflexo",Euml:"E mai煤sculo com trema",Igrave:"I mai煤sculo com acento grave",Iacute:"I mai煤sculo com acento agudo",Icirc:"I mai煤sculo com acento circunflexo",Iuml:"I mai煤sculo com crase",ETH:"Eth mai煤sculo",Ntilde:"N mai煤sculo com til",Ograve:"O mai煤sculo com acento grave",Oacute:"O mai煤sculo com acento agudo",Ocirc:"O mai煤sculo com acento circunflexo",
    +Otilde:"O mai煤sculo com til",Ouml:"O mai煤sculo com trema",times:"Multiplica莽茫o",Oslash:"Di芒metro",Ugrave:"U mai煤sculo com acento grave",Uacute:"U mai煤sculo com acento agudo",Ucirc:"U mai煤sculo com acento circunflexo",Uuml:"U mai煤sculo com trema",Yacute:"Y mai煤sculo com acento agudo",THORN:"Thorn mai煤sculo",szlig:"Eszett min煤sculo",agrave:"a min煤sculo com acento grave",aacute:"a min煤sculo com acento agudo",acirc:"a min煤sculo com acento circunflexo",atilde:"a min煤sculo com til",auml:"a min煤sculo com trema",
    +aring:"a min煤sculo com anel acima",aelig:"忙 min煤sculo",ccedil:"莽 min煤sculo",egrave:"e min煤sculo com acento grave",eacute:"e min煤sculo com acento agudo",ecirc:"e min煤sculo com acento circunflexo",euml:"e min煤sculo com trema",igrave:"i min煤sculo com acento grave",iacute:"i min煤sculo com acento agudo",icirc:"i min煤sculo com acento circunflexo",iuml:"i min煤sculo com trema",eth:"eth min煤sculo",ntilde:"n min煤sculo com til",ograve:"o min煤sculo com acento grave",oacute:"o min煤sculo com acento agudo",ocirc:"o min煤sculo com acento circunflexo",
    +otilde:"o min煤sculo com til",ouml:"o min煤sculo com trema",divide:"Divis茫o",oslash:"o min煤sculo com cortado ou di芒metro",ugrave:"u min煤sculo com acento grave",uacute:"u min煤sculo com acento agudo",ucirc:"u min煤sculo com acento circunflexo",uuml:"u min煤sculo com trema",yacute:"y min煤sculo com acento agudo",thorn:"thorn min煤sculo",yuml:"y min煤sculo com trema",OElig:"Liga莽茫o tipogr谩fica OE mai煤scula",oelig:"Liga莽茫o tipogr谩fica oe min煤scula",372:"W mai煤sculo com acento circunflexo",374:"Y mai煤sculo com acento circunflexo",
    +373:"w min煤sculo com acento circunflexo",375:"y min煤sculo com acento circunflexo",sbquo:"Aspas simples inferior direita",8219:"Aspas simples superior esquerda",bdquo:"Aspas duplas inferior direita",hellip:"Retic锚ncias",trade:"Trade mark",9658:"Ponta de seta preta para direita",bull:"Ponto lista",rarr:"Seta para direita",rArr:"Seta dupla para direita",hArr:"Seta dupla direita e esquerda",diams:"Ouros",asymp:"Aproximadamente"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/pt.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/pt.js
    new file mode 100644
    index 00000000..abf4bc8a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/pt.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","pt",{euro:"S铆mbolo do Euro",lsquo:"Aspas simples pra Esquerda",rsquo:"Aspas simples pra Direita",ldquo:"Aspas duplas pra Esquerda",rdquo:"Aspas duplas pra Direita",ndash:"Travess茫o Simples",mdash:"Travess茫o Longo",iexcl:"Ponto de exclama莽茫o invertido",cent:"S铆mbolo do C锚ntimo",pound:"S铆mbolo da Libra",curren:"S铆mbolo da Moeda",yen:"S铆mbolo do Iene",brvbar:"Barra quebrada",sect:"S铆mbolo de Sec莽茫o",uml:"Trema",copy:"S铆mbolo dos Direitos de Autor",ordf:"Indicador ordinal feminino",
    +laquo:"Aspas 芒ngulo duplo pra Esquerda",not:"N茫o S铆mbolo",reg:"S铆mbolo de Registado",macr:"M谩cron",deg:"S铆mbolo de Grau",sup2:"Expoente 2",sup3:"Expoente 3",acute:"Acento Agudo",micro:"S铆mbolo de Micro",para:"S铆mbolo de Par谩grafo",middot:"Ponto do Meio",cedil:"Cedilha",sup1:"Expoente 1",ordm:"Indicador ordinal masculino",raquo:"Aspas 芒ngulo duplo pra Direita",frac14:"Fra莽茫o vulgar 1/4",frac12:"Fra莽茫o vulgar 1/2",frac34:"Fra莽茫o vulgar 3/4",iquest:"Ponto de interruga莽茫o invertido",Agrave:"Letra mai煤scula latina A com acento grave",
    +Aacute:"Letra mai煤scula latina A com acento agudo",Acirc:"Letra mai煤scula latina A com circunflexo",Atilde:"Letra mai煤scula latina A com til",Auml:"Letra mai煤scula latina A com trema",Aring:"Letra mai煤scula latina A com sinal diacr铆tico",AElig:"Letra Mai煤scula Latina 脝",Ccedil:"Letra mai煤scula latina C com cedilha",Egrave:"Letra mai煤scula latina E com acento grave",Eacute:"Letra mai煤scula latina E com acento agudo",Ecirc:"Letra mai煤scula latina E com circunflexo",Euml:"Letra mai煤scula latina E com trema",
    +Igrave:"Letra mai煤scula latina I com acento grave",Iacute:"Letra mai煤scula latina I com acento agudo",Icirc:"Letra mai煤scula latina I com cincunflexo",Iuml:"Letra mai煤scula latina I com trema",ETH:"Letra mai煤scula latina Eth (脨冒)",Ntilde:"Letra mai煤scula latina N com til",Ograve:"Letra mai煤scula latina O com acento grave",Oacute:"Letra mai煤scula latina O com acento agudo",Ocirc:"Letra mai煤scula latina I com circunflexo",Otilde:"Letra mai煤scula latina O com til",Ouml:"Letra mai煤scula latina O com trema",
    +times:"S铆mbolo de Multiplica莽茫o",Oslash:"Letra mai煤scula O com barra",Ugrave:"Letra mai煤scula latina U com acento grave",Uacute:"Letra mai煤scula latina U com acento agudo",Ucirc:"Letra mai煤scula latina U com circunflexo",Uuml:"Letra mai煤scula latina E com trema",Yacute:"Letra mai煤scula latina Y com acento agudo",THORN:"Letra mai煤scula latina R煤nico",szlig:"Letra min煤scula latina s forte",agrave:"Letra min煤scula latina a com acento grave",aacute:"Letra min煤scula latina a com acento agudo",acirc:"Letra min煤scula latina a com circunflexo",
    +atilde:"Letra min煤scula latina a com til",auml:"Letra min煤scula latina a com trema",aring:"Letra min煤scula latina a com sinal diacr铆tico",aelig:"Letra min煤scula latina 忙",ccedil:"Letra min煤scula latina c com cedilha",egrave:"Letra min煤scula latina e com acento grave",eacute:"Letra min煤scula latina e com acento agudo",ecirc:"Letra min煤scula latina e com circunflexo",euml:"Letra min煤scula latina e com trema",igrave:"Letra min煤scula latina i com acento grave",iacute:"Letra min煤scula latina i com acento agudo",
    +icirc:"Letra min煤scula latina i com circunflexo",iuml:"Letra pequena latina i com trema",eth:"Letra min煤scula latina eth",ntilde:"Letra min煤scula latina n com til",ograve:"Letra min煤scula latina o com acento grave",oacute:"Letra min煤scula latina o com acento agudo",ocirc:"Letra min煤scula latina o com circunflexo",otilde:"Letra min煤scula latina o com til",ouml:"Letra min煤scula latina o com trema",divide:"S铆mbolo de Divis茫o",oslash:"Letra min煤scula latina o com barra",ugrave:"Letra min煤scula latina u com acento grave",
    +uacute:"Letra min煤scula latina u com acento agudo",ucirc:"Letra min煤scula latina u com circunflexo",uuml:"Letra min煤scula latina u com trema",yacute:"Letra min煤scula latina y com acento agudo",thorn:"Letra min煤scula latina R煤nico",yuml:"Letra min煤scula latina y com trema",OElig:"Ligadura mai煤scula latina OE",oelig:"Ligadura min煤scula latina oe",372:"Letra mai煤scula latina W com circunflexo",374:"Letra mai煤scula latina Y com circunflexo",373:"Letra min煤scula latina w com circunflexo",375:"Letra min煤scula latina y com circunflexo",
    +sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Elipse Horizontal ",trade:"S铆mbolo de Marca Registada",9658:"Black right-pointing pointer",bull:"Marca",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Quase igual a "});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ru.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ru.js
    new file mode 100644
    index 00000000..d83394a0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ru.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","ru",{euro:"袟薪邪泻 械胁褉芯",lsquo:"袥械胁邪褟 芯写懈薪邪褉薪邪褟 泻邪胁褘褔泻邪",rsquo:"袩褉邪胁邪褟 芯写懈薪邪褉薪邪褟 泻邪胁褘褔泻邪",ldquo:"袥械胁邪褟 写胁芯泄薪邪褟 泻邪胁褘褔泻邪",rdquo:"袥械胁邪褟 写胁芯泄薪邪褟 泻邪胁褘褔泻邪",ndash:"小褉械写薪械械 褌懈褉械",mdash:"袛谢懈薪薪芯械 褌懈褉械",iexcl:"锌械褉械胁褢褉薪褍褌褘泄 胁芯褋泻谢懈褑邪褌械谢褜薪褘泄 蟹薪邪泻",cent:"笑械薪褌",pound:"肖褍薪褌",curren:"袟薪邪泻 胁邪谢褞褌褘",yen:"袡械薪邪",brvbar:"袙械褉褌懈泻邪谢褜薪邪褟 褔械褉褌邪 褋 褉邪蟹褉褘胁芯屑",sect:"袟薪邪泻 锌邪褉邪谐褉邪褎邪",uml:"校屑谢邪褍褌",copy:"袟薪邪泻 芯褏褉邪薪褘 邪胁褌芯褉褋泻芯谐芯 锌褉邪胁邪",ordf:"校泻邪蟹邪褌械谢褜 芯泻芯薪褔邪薪懈褟 卸械薪褋泻芯谐芯 褉芯写邪 ...邪褟",laquo:"袥械胁邪褟 泻邪胁褘褔泻邪-芦褢谢芯褔泻邪禄",
    +not:"袨褌褉懈褑邪薪懈械",reg:"袟薪邪泻 芯褏褉邪薪褘 褋屑械卸薪褘褏 锌褉邪胁\\t",macr:"袦邪泻褉芯薪",deg:"袚褉邪写褍褋",sup2:"袧邪写褋褌褉芯褔薪芯械 写胁邪",sup3:"袧邪写褋褌褉芯褔薪芯械 褌褉懈",acute:"袗泻褍褌",micro:"袦懈泻褉芯",para:"袗斜蟹邪褑",middot:"袠薪褌械褉锌褍薪泻褌",cedil:"小械写懈谢褜",sup1:"袧邪写褋褌褉芯褔薪邪褟 械写懈薪懈褑邪",ordm:"袩芯褉褟写泻芯胁芯械 褔懈褋谢懈褌械谢褜薪芯械",raquo:"袩褉邪胁邪褟 泻邪胁褘褔泻邪-芦褢谢芯褔泻邪禄",frac14:"袨写薪邪 褔械褌胁械褉褌邪褟",frac12:"袨写薪邪 胁褌芯褉邪褟",frac34:"孝褉懈 褔械褌胁褢褉褌褘褏",iquest:"袩械褉械胁褢褉薪褍褌褘泄 胁芯锌褉芯褋懈褌械谢褜薪褘泄 蟹薪邪泻",Agrave:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 袗 褋 邪锌芯褋褌褉芯褎芯屑",Aacute:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 A 褋 褍写邪褉械薪懈械屑",Acirc:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 袗 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",
    +Atilde:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 袗 褋 褌懈谢褜写芯泄",Auml:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 袗 褋 褌褉械屑芯泄",Aring:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 袗 褋 泻芯谢褜褑芯屑 薪邪写 薪械泄",AElig:"袥邪褌懈薪褋泻邪褟 斜芯谢褜褕邪褟 斜褍泻胁邪 脝",Ccedil:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 C 褋 褋械写懈谢褜褞",Egrave:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 袝 褋 邪锌芯褋褌褉芯褎芯屑",Eacute:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 袝 褋 褍写邪褉械薪懈械屑",Ecirc:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 袝 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",Euml:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 袝 褋 褌褉械屑芯泄",Igrave:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 I 褋 邪锌芯褋褌褉芯褎芯屑",Iacute:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 I 褋 褍写邪褉械薪懈械屑",
    +Icirc:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 I 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",Iuml:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 I 褋 褌褉械屑芯泄",ETH:"袥邪褌懈薪褋泻邪褟 斜芯谢褜褕邪褟 斜褍泻胁邪 Eth",Ntilde:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 N 褋 褌懈谢褜写芯泄",Ograve:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 O 褋 邪锌芯褋褌褉芯褎芯屑",Oacute:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 O 褋 褍写邪褉械薪懈械屑",Ocirc:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 O 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",Otilde:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 O 褋 褌懈谢褜写芯泄",Ouml:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 O 褋 褌褉械屑芯泄",times:"袟薪邪泻 褍屑薪芯卸械薪懈褟",Oslash:"袥邪褌懈薪褋泻邪褟 斜芯谢褜褕邪褟 锌械褉械褔械褉泻薪褍褌邪褟 O",Ugrave:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 U 褋 邪锌芯褋褌褉芯褎芯屑",
    +Uacute:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 U 褋 褍写邪褉械薪懈械屑",Ucirc:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 U 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",Uuml:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 U 褋 褌褉械屑芯泄",Yacute:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 Y 褋 褍写邪褉械薪懈械屑",THORN:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 Thorn",szlig:"袟薪邪泻 写懈械蟹邪",agrave:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 a 褋 邪锌芯褋褌褉芯褎芯屑",aacute:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 a 褋 褍写邪褉械薪懈械屑",acirc:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 a 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",atilde:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 a 褋 褌懈谢褜写芯泄",auml:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 a 褋 褌褉械屑芯泄",aring:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 a 褋 泻芯谢褜褑芯屑",
    +aelig:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 忙",ccedil:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 褋 褋 褋械写懈谢褜褞",egrave:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 械 褋 邪锌芯褋褌褉芯褎芯屑",eacute:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 械 褋 褍写邪褉械薪懈械屑",ecirc:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 械 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",euml:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 械 褋 褌褉械屑芯泄",igrave:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 i 褋 邪锌芯褋褌褉芯褎芯屑",iacute:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 i 褋 褍写邪褉械薪懈械屑",icirc:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 i 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",iuml:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 i 褋 褌褉械屑芯泄",eth:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 eth",
    +ntilde:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 n 褋 褌懈谢褜写芯泄",ograve:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 o 褋 邪锌芯褋褌褉芯褎芯屑",oacute:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 o 褋 褍写邪褉械薪懈械屑",ocirc:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 o 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",otilde:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 o 褋 褌懈谢褜写芯泄",ouml:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 o 褋 褌褉械屑芯泄",divide:"袟薪邪泻 写械谢械薪懈褟",oslash:"袥邪褌懈薪褋泻邪褟 褋褌褉芯褔薪邪褟 锌械褉械褔械褉泻薪褍褌邪褟 o",ugrave:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 u 褋 邪锌芯褋褌褉芯褎芯屑",uacute:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 u 褋 褍写邪褉械薪懈械屑",ucirc:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 u 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",
    +uuml:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 u 褋 褌褉械屑芯泄",yacute:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 y 褋 褍写邪褉械薪懈械屑",thorn:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 thorn",yuml:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 y 褋 褌褉械屑芯泄",OElig:"袥邪褌懈薪褋泻邪褟 锌褉芯锌懈褋薪邪褟 谢懈谐邪褌褍褉邪 OE",oelig:"袥邪褌懈薪褋泻邪褟 褋褌褉芯褔薪邪褟 谢懈谐邪褌褍褉邪 oe",372:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 W 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",374:"袥邪褌懈薪褋泻邪褟 蟹邪谐谢邪胁薪邪褟 斜褍泻胁邪 Y 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",373:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 w 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",375:"袥邪褌懈薪褋泻邪褟 屑邪谢械薪褜泻邪褟 斜褍泻胁邪 y 褋 褑懈褉泻褍屑褎谢械泻褋芯屑",sbquo:"袧懈卸薪褟褟 芯写懈薪邪褉薪邪褟 泻邪胁褘褔泻邪",8219:"袩褉邪胁邪褟 芯写懈薪邪褉薪邪褟 泻邪胁褘褔泻邪",
    +bdquo:"袥械胁邪褟 写胁芯泄薪邪褟 泻邪胁褘褔泻邪",hellip:"袚芯褉懈蟹芯薪褌邪谢褜薪芯械 屑薪芯谐芯褌芯褔懈械",trade:"孝芯胁邪褉薪褘泄 蟹薪邪泻",9658:"效械褉薪褘泄 褍泻邪蟹邪褌械谢褜 胁锌褉邪胁芯",bull:"袦邪褉泻械褉 褋锌懈褋泻邪",rarr:"小褌褉械谢泻邪 胁锌褉邪胁芯",rArr:"袛胁芯泄薪邪褟 褋褌褉械谢泻邪 胁锌褉邪胁芯",hArr:"袛胁芯泄薪邪褟 褋褌褉械谢泻邪 胁谢械胁芯-胁锌褉邪胁芯",diams:"效械褉薪褘泄 褉芯屑斜",asymp:"袩褉懈屑械褉薪芯 褉邪胁薪芯"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/si.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/si.js
    new file mode 100644
    index 00000000..8471754e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/si.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","si",{euro:"喽亨窋喽秽窛 喾冟督喽氞窋喽",lsquo:"喾喽膏窔 喽侗喾 喽嬥洞喾斷锭喾 喽稓喾娻穩喾撪陡 ",rsquo:"喽稓喾斷东喾 喽侗喾 喽嬥洞喾斷锭喾 喽稓喾娻穩喾撪陡 ",ldquo:"喾喽膏窔 喽窉喽穵喾  喽嬥洞喾斷锭喾 喽稓喾娻穩喾撪陡 ",rdquo:"喽稓喾斷东喾 喽窉喽穵喾  喽嬥洞喾斷锭喾 喽稓喾娻穩喾撪陡 ",ndash:"En dash",mdash:"Em dash",iexcl:"喽亨锭喾掄稓喾斷痘喾 喾勦痘喾娻穫喽窊 ",cent:"Cent sign",pound:"Pound sign",curren:"喽膏窋喽洁穵鈥嵿逗喽膏逗 ",yen:"喽亨窓喽编穵 ",brvbar:"Broken bar",sect:"喽窓喽秽窔喽膏穵 ",uml:"Diaeresis",copy:"喽脆窉喽о洞喽穵 喽呧逗喾掄董喾掄逗 ",ordf:"喽痘喾娻穪喽氞逗",laquo:"Left-pointing double angle quotation mark",not:"喾冟督喽氞窋喽稓喾 喽编窚喾喾",reg:"喾冟督喽氞窋喽稓喾 喽洁窉喽亨窂喽脆动喾掄秱喽犩窉 喽氞窉喽秽窊喽",
    +macr:"喽膏窋喽穵鈥嵿痘喾掄董 ",deg:"喾冟督喽氞窋喽窔 ",sup2:"喽嬥订喾 喽洁稓喾斷东喾 喽窓喽",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent",
    +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter 脝",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",
    +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",
    +Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",
    +aelig:"Latin small letter 忙",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",
    +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",
    +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",
    +bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/sk.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/sk.js
    new file mode 100644
    index 00000000..8e3898ab
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/sk.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","sk",{euro:"Znak eura",lsquo:"慕av谩 jednoduch谩 煤vodzovka",rsquo:"Prav谩 jednoduch谩 煤vodzovka",ldquo:"Prav谩 dvojit谩 煤vodzovka",rdquo:"Prav谩 dvojit谩 煤vodzovka",ndash:"En poml膷ka",mdash:"Em poml膷ka",iexcl:"Obr谩ten媒 v媒kri膷n铆k",cent:"Znak centu",pound:"Znak libry",curren:"Znak meny",yen:"Znak jenu",brvbar:"Preru拧en谩 zvisl谩 膷iara",sect:"Znak odseku",uml:"Prehl谩ska",copy:"Znak copyrightu",ordf:"沤ensk媒 indik谩tor rodu",laquo:"Znak dvojit媒ch lomen媒ch 煤vodzoviek v木avo",not:"Logistick媒 z谩por",
    +reg:"Znak registr谩cie",macr:"Poml膷ka nad",deg:"Znak stup艌a",sup2:"Dvojka ako horn媒 index",sup3:"Trojka ako horn媒 index",acute:"D暮啪e艌",micro:"Znak mikro",para:"Znak odstavca",middot:"Bodka uprostred",cedil:"Chvost v木avo",sup1:"Jednotka ako horn媒 index",ordm:"Mu啪sk媒 indik谩tor rodu",raquo:"Znak dvojit媒ch lomen媒ch 煤vodzoviek vpravo",frac14:"Oby膷ajn媒 zlomok jedna 拧tvrtina",frac12:"Oby膷ajn媒 zlomok jedna polovica",frac34:"Oby膷ajn媒 zlomok tri 拧tvrtiny",iquest:"Oto膷en媒 ot谩znik",Agrave:"Ve木k茅 p铆smeno latinky A s accentom",
    +Aacute:"Ve木k茅 p铆smeno latinky A s d暮啪艌om",Acirc:"Ve木k茅 p铆smeno latinky A s m盲k膷e艌om",Atilde:"Ve木k茅 p铆smeno latinky A s tildou",Auml:"Ve木k茅 p铆smeno latinky A s dvoma bodkami",Aring:"Ve木k茅 p铆smeno latinky A s kr煤啪kom nad",AElig:"Ve木k茅 p铆smeno latinky 脝",Ccedil:"Ve木k茅 p铆smeno latinky C s chvostom v木avo",Egrave:"Ve木k茅 p铆smeno latinky E s accentom",Eacute:"Ve木k茅 p铆smeno latinky E s d暮啪艌om",Ecirc:"Ve木k茅 p铆smeno latinky E s m盲k膷e艌om",Euml:"Ve木k茅 p铆smeno latinky E s dvoma bodkami",Igrave:"Ve木k茅 p铆smeno latinky I s accentom",
    +Iacute:"Ve木k茅 p铆smeno latinky I s d暮啪艌om",Icirc:"Ve木k茅 p铆smeno latinky I s m盲k膷e艌om",Iuml:"Ve木k茅 p铆smeno latinky I s dvoma bodkami",ETH:"Ve木k茅 p铆smeno latinky Eth",Ntilde:"Ve木k茅 p铆smeno latinky N s tildou",Ograve:"Ve木k茅 p铆smeno latinky O s accentom",Oacute:"Ve木k茅 p铆smeno latinky O s d暮啪艌om",Ocirc:"Ve木k茅 p铆smeno latinky O s m盲k膷e艌om",Otilde:"Ve木k茅 p铆smeno latinky O s tildou",Ouml:"Ve木k茅 p铆smeno latinky O s dvoma bodkami",times:"Znak n谩sobenia",Oslash:"Ve木k茅 p铆smeno latinky O pre拧krtnut茅",Ugrave:"Ve木k茅 p铆smeno latinky U s accentom",
    +Uacute:"Ve木k茅 p铆smeno latinky U s d暮啪艌om",Ucirc:"Ve木k茅 p铆smeno latinky U s m盲k膷e艌om",Uuml:"Ve木k茅 p铆smeno latinky U s dvoma bodkami",Yacute:"Ve木k茅 p铆smeno latinky Y s d暮啪艌om",THORN:"Ve木k茅 p铆smeno latinky Thorn",szlig:"Mal茅 p铆smeno latinky ostr茅 s",agrave:"Mal茅 p铆smeno latinky a s accentom",aacute:"Mal茅 p铆smeno latinky a s d暮啪艌om",acirc:"Mal茅 p铆smeno latinky a s m盲k膷e艌om",atilde:"Mal茅 p铆smeno latinky a s tildou",auml:"Mal茅 p铆smeno latinky a s dvoma bodkami",aring:"Mal茅 p铆smeno latinky a s kr煤啪kom nad",
    +aelig:"Mal茅 p铆smeno latinky 忙",ccedil:"Mal茅 p铆smeno latinky c s chvostom v木avo",egrave:"Mal茅 p铆smeno latinky e s accentom",eacute:"Mal茅 p铆smeno latinky e s d暮啪艌om",ecirc:"Mal茅 p铆smeno latinky e s m盲k膷e艌om",euml:"Mal茅 p铆smeno latinky e s dvoma bodkami",igrave:"Mal茅 p铆smeno latinky i s accentom",iacute:"Mal茅 p铆smeno latinky i s d暮啪艌om",icirc:"Mal茅 p铆smeno latinky i s m盲k膷e艌om",iuml:"Mal茅 p铆smeno latinky i s dvoma bodkami",eth:"Mal茅 p铆smeno latinky eth",ntilde:"Mal茅 p铆smeno latinky n s tildou",ograve:"Mal茅 p铆smeno latinky o s accentom",
    +oacute:"Mal茅 p铆smeno latinky o s d暮啪艌om",ocirc:"Mal茅 p铆smeno latinky o s m盲k膷e艌om",otilde:"Mal茅 p铆smeno latinky o s tildou",ouml:"Mal茅 p铆smeno latinky o s dvoma bodkami",divide:"Znak delenia",oslash:"Mal茅 p铆smeno latinky o pre拧krtnut茅",ugrave:"Mal茅 p铆smeno latinky u s accentom",uacute:"Mal茅 p铆smeno latinky u s d暮啪艌om",ucirc:"Mal茅 p铆smeno latinky u s m盲k膷e艌om",uuml:"Mal茅 p铆smeno latinky u s dvoma bodkami",yacute:"Mal茅 p铆smeno latinky y s d暮啪艌om",thorn:"Mal茅 p铆smeno latinky thorn",yuml:"Mal茅 p铆smeno latinky y s dvoma bodkami",
    +OElig:"Ve木k谩 ligat煤ra latinky OE",oelig:"Mal谩 ligat煤ra latinky OE",372:"Ve木k茅 p铆smeno latinky W s m盲k膷e艌om",374:"Ve木k茅 p铆smeno latinky Y s m盲k膷e艌om",373:"Mal茅 p铆smeno latinky w s m盲k膷e艌om",375:"Mal茅 p铆smeno latinky y s m盲k膷e艌om",sbquo:"Doln谩 jednoduch谩 9-煤vodzovka",8219:"Horn谩 jednoduch谩 oto膷en谩 9-煤vodzovka",bdquo:"Doln谩 dvojit谩 9-煤vodzovka",hellip:"Trojbodkov媒 煤vod",trade:"Znak ibchodnej zna膷ky",9658:"膶ierny ukazovate木 smeruj煤ci vpravo",bull:"Kruh",rarr:"艩铆pka vpravo",rArr:"Dvojit谩 拧ipka vpravo",
    +hArr:"Dvojit谩 拧ipka v木avo a vpravo",diams:"膶ierne piky",asymp:"Skoro sa rovn谩"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/sl.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/sl.js
    new file mode 100644
    index 00000000..dcf3517b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/sl.js
    @@ -0,0 +1,12 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","sl",{euro:"Evro znak",lsquo:"Levi enojni narekovaj",rsquo:"Desni enojni narekovaj",ldquo:"Levi dvojni narekovaj",rdquo:"Desni dvojni narekovaj",ndash:"En pomi拧ljaj",mdash:"Em pomi拧ljaj",iexcl:"Obrnjen klicaj",cent:"Cent znak",pound:"Funt znak",curren:"Znak valute",yen:"Jen znak",brvbar:"Zlomljena 膷rta",sect:"Znak oddelka",uml:"Diaeresis",copy:"Znak avtorskih pravic",ordf:"沤enski zaporedni kazalnik",laquo:"Levi obrnjen dvojni kotni narekovaj",not:"Ne znak",reg:"Registrirani znak",
    +macr:"Macron",deg:"Znak stopinj",sup2:"Nadpisano dva",sup3:"Nadpisano tri",acute:"Ostrivec",micro:"Mikro znak",para:"Pilcrow znak",middot:"Sredinska pika",cedil:"Cedilla",sup1:"Nadpisano ena",ordm:"Mo拧ki zaporedni kazalnik",raquo:"Desno obrnjen dvojni kotni narekovaj",frac14:"Ena 膷etrtina",frac12:"Ena polovica",frac34:"Tri 膷etrtine",iquest:"Obrnjen vpra拧aj",Agrave:"Velika latinska 膷rka A s krativcem",Aacute:"Velika latinska 膷rka A z ostrivcem",Acirc:"Velika latinska 膷rka A s stre拧ico",Atilde:"Velika latinska 膷rka A z tildo",
    +Auml:"Velika latinska 膷rka A z diaeresis-om",Aring:"Velika latinska 膷rka A z obro膷em",AElig:"Velika latinska 膷rka 脝",Ccedil:"Velika latinska 膷rka C s cedillo",Egrave:"Velika latinska 膷rka E s krativcem",Eacute:"Velika latinska 膷rka E z ostrivcem",Ecirc:"Velika latinska 膷rka E s stre拧ico",Euml:"Velika latinska 膷rka E z diaeresis-om",Igrave:"Velika latinska 膷rka I s krativcem",Iacute:"Velika latinska 膷rka I z ostrivcem",Icirc:"Velika latinska 膷rka I s stre拧ico",Iuml:"Velika latinska 膷rka I z diaeresis-om",
    +ETH:"Velika latinska 膷rka Eth",Ntilde:"Velika latinska 膷rka N s tildo",Ograve:"Velika latinska 膷rka O s krativcem",Oacute:"Velika latinska 膷rka O z ostrivcem",Ocirc:"Velika latinska 膷rka O s stre拧ico",Otilde:"Velika latinska 膷rka O s tildo",Ouml:"Velika latinska 膷rka O z diaeresis-om",times:"Znak za mno啪enje",Oslash:"Velika pre膷rtana latinska 膷rka O",Ugrave:"Velika latinska 膷rka U s krativcem",Uacute:"Velika latinska 膷rka U z ostrivcem",Ucirc:"Velika latinska 膷rka U s stre拧ico",Uuml:"Velika latinska 膷rka U z diaeresis-om",
    +Yacute:"Velika latinska 膷rka Y z ostrivcem",THORN:"Velika latinska 膷rka Thorn",szlig:"Mala ostra latinska 膷rka s",agrave:"Mala latinska 膷rka a s krativcem",aacute:"Mala latinska 膷rka a z ostrivcem",acirc:"Mala latinska 膷rka a s stre拧ico",atilde:"Mala latinska 膷rka a s tildo",auml:"Mala latinska 膷rka a z diaeresis-om",aring:"Mala latinska 膷rka a z obro膷em",aelig:"Mala latinska 膷rka 忙",ccedil:"Mala latinska 膷rka c s cedillo",egrave:"Mala latinska 膷rka e s krativcem",eacute:"Mala latinska 膷rka e z ostrivcem",
    +ecirc:"Mala latinska 膷rka e s stre拧ico",euml:"Mala latinska 膷rka e z diaeresis-om",igrave:"Mala latinska 膷rka i s krativcem",iacute:"Mala latinska 膷rka i z ostrivcem",icirc:"Mala latinska 膷rka i s stre拧ico",iuml:"Mala latinska 膷rka i z diaeresis-om",eth:"Mala latinska 膷rka eth",ntilde:"Mala latinska 膷rka n s tildo",ograve:"Mala latinska 膷rka o s krativcem",oacute:"Mala latinska 膷rka o z ostrivcem",ocirc:"Mala latinska 膷rka o s stre拧ico",otilde:"Mala latinska 膷rka o s tildo",ouml:"Mala latinska 膷rka o z diaeresis-om",
    +divide:"Znak za deljenje",oslash:"Mala pre膷rtana latinska 膷rka o",ugrave:"Mala latinska 膷rka u s krativcem",uacute:"Mala latinska 膷rka u z ostrivcem",ucirc:"Mala latinska 膷rka u s stre拧ico",uuml:"Mala latinska 膷rka u z diaeresis-om",yacute:"Mala latinska 膷rka y z ostrivcem",thorn:"Mala latinska 膷rka thorn",yuml:"Mala latinska 膷rka y z diaeresis-om",OElig:"Velika latinska ligatura OE",oelig:"Mala latinska ligatura oe",372:"Velika latinska 膷rka W s stre拧ico",374:"Velika latinska 膷rka Y s stre拧ico",
    +373:"Mala latinska 膷rka w s stre拧ico",375:"Mala latinska 膷rka y s stre拧ico",sbquo:"Enojni nizki-9 narekovaj",8219:"Enojni visoki-obrnjen-9 narekovaj",bdquo:"Dvojni nizki-9 narekovaj",hellip:"Horizontalni izpust",trade:"Znak blagovne znamke",9658:"膶rni desno-usmerjen kazalec",bull:"Krogla",rarr:"Desno-usmerjena pu拧膷ica",rArr:"Desno-usmerjena dvojna pu拧膷ica",hArr:"Leva in desna dvojna pu拧膷ica",diams:"膶rna kara",asymp:"Skoraj enako"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/sq.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/sq.js
    new file mode 100644
    index 00000000..3620b532
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/sq.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","sq",{euro:"Shenja e Euros",lsquo:"Thonj毛za majtas me nj毛 vi",rsquo:"Thonj毛za djathtas me nj毛 vi",ldquo:"Thonj毛za majtas",rdquo:"Thonj毛za djathtas",ndash:"En viza lidh毛se",mdash:"Em viza lidh毛se",iexcl:"Pik毛莽udit毛se e p毛rmbysur",cent:"Shenja e Centit",pound:"Shejna e Funtit",curren:"Shenja e valut毛s",yen:"Shenja e Jenit",brvbar:"Viza e k毛putur",sect:"Shenja e pjes毛s",uml:"Diaeresis",copy:"Shenja e t毛 drejtave t毛 kopjimit",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
    +not:"Nuk ka shenj毛",reg:"Registered sign",macr:"Macron",deg:"Shenja e shkall毛s",sup2:"Super-skripta dy",sup3:"Super-skripta tre",acute:"Theks i mpreht毛",micro:"Shjenja e Mikros",para:"Pilcrow sign",middot:"Pika e Mesme",cedil:"Hark n毛n shkronja",sup1:"Super-skripta nj毛",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Thyesa nj毛 t毛 katrat",frac12:"Thyesa nj毛 t毛 dytat",frac34:"Thyesa tre t毛 katrat",iquest:"Pik毛pyetje e p毛rmbysur",Agrave:"Shkronja e madhe latine A me theks t毛 r毛nd毛",
    +Aacute:"Shkronja e madhe latine A me theks akute",Acirc:"Shkronja e madhe latine A me theks lakor",Atilde:"Shkronja e madhe latine A me tild毛",Auml:"Shkronja e madhe latine A me dy pika",Aring:"Shkronja e madhe latine A me unaz毛 mbi",AElig:"Shkronja e madhe latine 脝",Ccedil:"Shkronja e madhe latine C me hark posht毛",Egrave:"Shkronja e madhe latine E me theks t毛 r毛nd毛",Eacute:"Shkronja e madhe latine E me theks akute",Ecirc:"Shkronja e madhe latine E me theks lakor",Euml:"Shkronja e madhe latine E me dy pika",
    +Igrave:"Shkronja e madhe latine I me theks t毛 r毛nd毛",Iacute:"Shkronja e madhe latine I me theks akute",Icirc:"Shkronja e madhe latine I me theks lakor",Iuml:"Shkronja e madhe latine I me dy pika",ETH:"Shkronja e madhe latine Eth",Ntilde:"Shkronja e madhe latine N me tild毛",Ograve:"Shkronja e madhe latine O me theks t毛 r毛nd毛",Oacute:"Shkronja e madhe latine O me theks akute",Ocirc:"Shkronja e madhe latine O me theks lakor",Otilde:"Shkronja e madhe latine O me tild毛",Ouml:"Shkronja e madhe latine O me dy pika",
    +times:"Shenja e shum毛zimit",Oslash:"Shkronja e madhe latine O me viz毛 n毛 mes",Ugrave:"Shkronja e madhe latine U me theks t毛 r毛nd毛",Uacute:"Shkronja e madhe latine U me theks akute",Ucirc:"Shkronja e madhe latine U me theks lakor",Uuml:"Shkronja e madhe latine U me dy pika",Yacute:"Shkronja e madhe latine Y me theks akute",THORN:"Shkronja e madhe latine Thorn",szlig:"Shkronja e vog毛 latine s e mpreht毛",agrave:"Shkronja e vog毛 latine a me theks t毛 r毛nd毛",aacute:"Shkronja e vog毛 latine a me theks t毛 mpreht毛",
    +acirc:"Shkronja e vog毛l latine a me theks lakor",atilde:"Shkronja e vog毛l latine a me tild毛",auml:"Shkronja e vog毛l latine a me dy pika",aring:"Shkronja e vog毛 latine a me unaz毛 mbi",aelig:"Shkronja e vog毛 latine 忙",ccedil:"Shkronja e vog毛l latine c me hark posht毛",egrave:"Shkronja e vog毛 latine e me theks t毛 r毛nd毛",eacute:"Shkronja e vog毛 latine e me theks t毛 mpreht毛",ecirc:"Shkronja e vog毛l latine e me theks lakor",euml:"Shkronja e vog毛l latine e me dy pika",igrave:"Shkronja e vog毛 latine i me theks t毛 r毛nd毛",
    +iacute:"Shkronja e vog毛 latine i me theks t毛 mpreht毛",icirc:"Shkronja e vog毛l latine i me theks lakor",iuml:"Shkronja e vog毛l latine i me dy pika",eth:"Shkronja e vog毛 latine eth",ntilde:"Shkronja e vog毛l latine n me tild毛",ograve:"Shkronja e vog毛 latine o me theks t毛 r毛nd毛",oacute:"Shkronja e vog毛 latine o me theks t毛 mpreht毛",ocirc:"Shkronja e vog毛l latine o me theks lakor",otilde:"Shkronja e vog毛l latine o me tild毛",ouml:"Shkronja e vog毛l latine o me dy pika",divide:"Shenja ndar毛se",oslash:"Shkronja e vog毛l latine o me viz毛 n毛 mes",
    +ugrave:"Shkronja e vog毛 latine u me theks t毛 r毛nd毛",uacute:"Shkronja e vog毛 latine u me theks t毛 mpreht毛",ucirc:"Shkronja e vog毛l latine u me theks lakor",uuml:"Shkronja e vog毛l latine u me dy pika",yacute:"Shkronja e vog毛 latine y me theks t毛 mpreht毛",thorn:"Shkronja e vog毛l latine thorn",yuml:"Shkronja e vog毛l latine y me dy pika",OElig:"Shkronja e madhe e bashkuar latine OE",oelig:"Shkronja e vog毛l e bashkuar latine oe",372:"Shkronja e madhe latine W me theks lakor",374:"Shkronja e madhe latine Y me theks lakor",
    +373:"Shkronja e vog毛l latine w me theks lakor",375:"Shkronja e vog毛l latine y me theks lakor",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Shenja e Simbolit Tregtar毛",9658:"Black right-pointing pointer",bull:"Pulla",rarr:"Shigjeta djathtas",rArr:"Rightwards double arrow",hArr:"Shigjeta e dyfish毛 majtas-djathtas",diams:"Black diamond suit",asymp:"Gati e barabar me"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/sv.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/sv.js
    new file mode 100644
    index 00000000..773c31b1
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/sv.js
    @@ -0,0 +1,11 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","sv",{euro:"Eurotecken",lsquo:"Enkelt v盲nster citattecken",rsquo:"Enkelt h枚ger citattecken",ldquo:"Dubbelt v盲nster citattecken",rdquo:"Dubbelt h枚ger citattecken",ndash:"Snedstreck",mdash:"L氓ngt tankstreck",iexcl:"Inverterad utropstecken",cent:"Centtecken",pound:"Pundtecken",curren:"Valutatecken",yen:"Yentecken",brvbar:"Brutet lodr盲tt streck",sect:"Paragraftecken",uml:"Diaeresis",copy:"Upphovsr盲ttstecken",ordf:"Feminit ordningstalsindikator",laquo:"V盲nsterst盲llt dubbelt vinkelcitationstecken",
    +not:"Icke-tecken",reg:"Registrerad",macr:"Macron",deg:"Grader",sup2:"Upph枚jt tv氓",sup3:"Upph枚jt tre",acute:"Akut accent",micro:"Mikrotecken",para:"Alinea",middot:"Centrerad prick",cedil:"Cedilj",sup1:"Upph枚jt en",ordm:"Maskulina ordnings盲ndelsen",raquo:"H枚gerst盲llt dubbelt vinkelcitationstecken",frac14:"Br氓ktal - en kvart",frac12:"Br氓ktal - en halv",frac34:"Br氓ktal - tre fj盲rdedelar",iquest:"Inverterat fr氓getecken",Agrave:"Stort A med grav accent",Aacute:"Stort A med akutaccent",Acirc:"Stort A med circumflex",
    +Atilde:"Stort A med tilde",Auml:"Stort A med diaresis",Aring:"Stort A med ring ovan",AElig:"Stort 脝",Ccedil:"Stort C med cedilj",Egrave:"Stort E med grav accent",Eacute:"Stort E med aktuaccent",Ecirc:"Stort E med circumflex",Euml:"Stort E med diaeresis",Igrave:"Stort I med grav accent",Iacute:"Stort I med akutaccent",Icirc:"Stort I med circumflex",Iuml:"Stort I med diaeresis",ETH:"Stort Eth",Ntilde:"Stort N med tilde",Ograve:"Stort O med grav accent",Oacute:"Stort O med aktuaccent",Ocirc:"Stort O med circumflex",
    +Otilde:"Stort O med tilde",Ouml:"Stort O med diaeresis",times:"Multiplicera",Oslash:"Stor 脴",Ugrave:"Stort U med grav accent",Uacute:"Stort U med akutaccent",Ucirc:"Stort U med circumflex",Uuml:"Stort U med diaeresis",Yacute:"Stort Y med akutaccent",THORN:"Stort Thorn",szlig:"Litet dubbel-s/Eszett",agrave:"Litet a med grav accent",aacute:"Litet a med akutaccent",acirc:"Litet a med circumflex",atilde:"Litet a med tilde",auml:"Litet a med diaeresis",aring:"Litet a med ring ovan",aelig:"Bokstaven 忙",
    +ccedil:"Litet c med cedilj",egrave:"Litet e med grav accent",eacute:"Litet e med akutaccent",ecirc:"Litet e med circumflex",euml:"Litet e med diaeresis",igrave:"Litet i med grav accent",iacute:"Litet i med akutaccent",icirc:"LItet i med circumflex",iuml:"Litet i med didaeresis",eth:"Litet eth",ntilde:"Litet n med tilde",ograve:"LItet o med grav accent",oacute:"LItet o med akutaccent",ocirc:"Litet o med circumflex",otilde:"LItet o med tilde",ouml:"Litet o med diaeresis",divide:"Division",oslash:"酶",
    +ugrave:"Litet u med grav accent",uacute:"Litet u med akutaccent",ucirc:"LItet u med circumflex",uuml:"Litet u med diaeresis",yacute:"Litet y med akutaccent",thorn:"Litet thorn",yuml:"Litet y med diaeresis",OElig:"Stor ligatur av OE",oelig:"Liten ligatur av oe",372:"Stort W med circumflex",374:"Stort Y med circumflex",373:"Litet w med circumflex",375:"Litet y med circumflex",sbquo:"Enkelt l氓gt 9-citationstecken",8219:"Enkelt h枚gt bakv盲nt 9-citationstecken",bdquo:"Dubbelt l氓gt 9-citationstecken",hellip:"Horisontellt uteslutningstecken",
    +trade:"Varum盲rke",9658:"Svart h枚gerv盲nd pekare",bull:"Listpunkt",rarr:"H枚gerpil",rArr:"Dubbel h枚gerpil",hArr:"Dubbel v盲nsterpil",diams:"Svart ruter",asymp:"Ungef盲r lika med"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/th.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/th.js
    new file mode 100644
    index 00000000..3754ee92
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/th.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","th",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"喔副喔嵿弗喔编竵喔┼笓喙屶釜喔佮父喔ム箑喔囙复喔",yen:"喔副喔嵿弗喔编竵喔┼笓喙屶箑喔囙复喔權箑喔⑧笝",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
    +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
    +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter 脝",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
    +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
    +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
    +aring:"Latin small letter a with ring above",aelig:"Latin small letter 忙",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
    +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
    +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
    +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"喔副喔嵿弗喔编竵喔┼笓喙屶斧喔编抚喔傕箟喔涪喙堗腑喔",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/tr.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/tr.js
    new file mode 100644
    index 00000000..5c795173
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/tr.js
    @@ -0,0 +1,12 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","tr",{euro:"Euro i艧areti",lsquo:"Sol tek t谋rnak i艧areti",rsquo:"Sa臒 tek t谋rnak i艧areti",ldquo:"Sol 莽ift t谋rnak i艧areti",rdquo:"Sa臒 莽ift t谋rnak i艧areti",ndash:"En tire",mdash:"Em tire",iexcl:"Ters 眉nlem i艧areti",cent:"Cent i艧areti",pound:"Pound i艧areti",curren:"Para birimi i艧areti",yen:"Yen i艧areti",brvbar:"K谋r谋k bar",sect:"B枚l眉m i艧areti",uml:"陌ki sesli harfin ayr谋lmas谋",copy:"Telif hakk谋 i艧areti",ordf:"Di艧il s谋ral谋 g枚sterge",laquo:"Sol-i艧aret 莽ift a莽谋 t谋rnak i艧areti",
    +not:"Not i艧areti",reg:"Kay谋tl谋 i艧areti",macr:"Makron",deg:"Derece i艧areti",sup2:"陌kili 眉stsimge",sup3:"脺莽l眉 眉stsimge",acute:"Aksan i艧areti",micro:"Mikro i艧areti",para:"Pilcrow i艧areti",middot:"Orta nokta",cedil:"Kedilla",sup1:"脺stsimge",ordm:"Eril s谋ral谋 g枚sterge",raquo:"Sa臒 i艧aret 莽ift a莽谋 t谋rnak i艧areti",frac14:"Baya臒谋 kesrin d枚rtte biri",frac12:"Baya臒谋 kesrin bir yar谋m",frac34:"Baya臒谋 kesrin d枚rtte 眉莽",iquest:"Ters soru i艧areti",Agrave:"Aksanl谋 latin harfi",Aacute:"A艧谋r谋 aksan谋yla Latin harfi",
    +Acirc:"脟arp谋k Latin harfi",Atilde:"Tilde latin harfi",Auml:"Sesli harf ayr谋l谋ml谋谋 latin harfi",Aring:"Halkal谋 latin b眉y眉k A harfi",AElig:"Latin b眉y眉k 脝 harfi",Ccedil:"Latin b眉y眉k C harfi ile kedilla",Egrave:"Aksanl谋 latin b眉y眉k E harfi",Eacute:"A艧谋r谋 vurgulu latin b眉y眉k E harfi",Ecirc:"脟arp谋k latin b眉y眉k E harfi",Euml:"Sesli harf ayr谋l谋ml谋谋 latin b眉y眉k E harfi",Igrave:"Aksanl谋 latin b眉y眉k I harfi",Iacute:"A艧谋r谋 aksanl谋 latin b眉y眉k I harfi",Icirc:"脟arp谋k latin b眉y眉k I harfi",Iuml:"Sesli harf ayr谋l谋ml谋谋 latin b眉y眉k I harfi",
    +ETH:"Latin b眉y眉k Eth harfi",Ntilde:"Tildeli latin b眉y眉k N harfi",Ograve:"Aksanl谋 latin b眉y眉k O harfi",Oacute:"A艧谋r谋 aksanl谋 latin b眉y眉k O harfi",Ocirc:"脟arp谋k latin b眉y眉k O harfi",Otilde:"Tildeli latin b眉y眉k O harfi",Ouml:"Sesli harf ayr谋l谋ml谋 latin b眉y眉k O harfi",times:"脟arpma i艧areti",Oslash:"Vurgulu latin b眉y眉k O harfi",Ugrave:"Aksanl谋 latin b眉y眉k U harfi",Uacute:"A艧谋r谋 aksanl谋 latin b眉y眉k U harfi",Ucirc:"脟arp谋k latin b眉y眉k U harfi",Uuml:"Sesli harf ayr谋l谋ml谋 latin b眉y眉k U harfi",Yacute:"A艧谋r谋 aksanl谋 latin b眉y眉k Y harfi",
    +THORN:"Latin b眉y眉k Thorn harfi",szlig:"Latin k眉莽眉k keskin s harfi",agrave:"Aksanl谋 latin k眉莽眉k a harfi",aacute:"A艧谋r谋 aksanl谋 latin k眉莽眉k a harfi",acirc:"脟arp谋k latin k眉莽眉k a harfi",atilde:"Tildeli latin k眉莽眉k a harfi",auml:"Sesli harf ayr谋l谋ml谋 latin k眉莽眉k a harfi",aring:"Halkal谋 latin k眉莽眉k a harfi",aelig:"Latin b眉y眉k 忙 harfi",ccedil:"Kedillal谋 latin k眉莽眉k c harfi",egrave:"Aksanl谋 latin k眉莽眉k e harfi",eacute:"A艧谋r谋 aksanl谋 latin k眉莽眉k e harfi",ecirc:"脟arp谋k latin k眉莽眉k e harfi",euml:"Sesli harf ayr谋l谋ml谋 latin k眉莽眉k e harfi",
    +igrave:"Aksanl谋 latin k眉莽眉k i harfi",iacute:"A艧谋r谋 aksanl谋 latin k眉莽眉k i harfi",icirc:"脟arp谋k latin k眉莽眉k i harfi",iuml:"Sesli harf ayr谋l谋ml谋 latin k眉莽眉k i harfi",eth:"Latin k眉莽眉k eth harfi",ntilde:"Tildeli latin k眉莽眉k n harfi",ograve:"Aksanl谋 latin k眉莽眉k o harfi",oacute:"A艧谋r谋 aksanl谋 latin k眉莽眉k o harfi",ocirc:"脟arp谋k latin k眉莽眉k o harfi",otilde:"Tildeli latin k眉莽眉k o harfi",ouml:"Sesli harf ayr谋l谋ml谋 latin k眉莽眉k o harfi",divide:"B枚lme i艧areti",oslash:"Vurgulu latin k眉莽眉k o harfi",ugrave:"Aksanl谋 latin k眉莽眉k u harfi",
    +uacute:"A艧谋r谋 aksanl谋 latin k眉莽眉k u harfi",ucirc:"脟arp谋k latin k眉莽眉k u harfi",uuml:"Sesli harf ayr谋l谋ml谋 latin k眉莽眉k u harfi",yacute:"A艧谋r谋 aksanl谋 latin k眉莽眉k y harfi",thorn:"Latin k眉莽眉k thorn harfi",yuml:"Sesli harf ayr谋l谋ml谋 latin k眉莽眉k y harfi",OElig:"Latin b眉y眉k ba臒l谋 OE harfi",oelig:"Latin k眉莽眉k ba臒l谋 oe harfi",372:"脟arp谋k latin b眉y眉k W harfi",374:"脟arp谋k latin b眉y眉k Y harfi",373:"脟arp谋k latin k眉莽眉k w harfi",375:"脟arp谋k latin k眉莽眉k y harfi",sbquo:"Tek d眉艧眉k-9 t谋rnak i艧areti",8219:"Tek y眉ksek-ters-9 t谋rnak i艧areti",
    +bdquo:"脟ift d眉艧眉k-9 t谋rnak i艧areti",hellip:"Yatay elips",trade:"Marka tescili i艧areti",9658:"Siyah sa臒 i艧aret i艧aret莽isi",bull:"Koyu nokta",rarr:"Sa臒a do臒ru ok",rArr:"Sa臒a do臒ru 莽ift ok",hArr:"Sol, sa臒 莽ift ok",diams:"Siyah elmas tak谋m谋",asymp:"Hemen hemen e艧it"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ug.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ug.js
    new file mode 100644
    index 00000000..5330acca
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/ug.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","ug",{euro:"賷丕蹕乇賵 亘蹠賱诏賶爻賶",lsquo:"賷丕賱丕诃 倬蹠卮 爻賵賱",rsquo:"賷丕賱丕诃 倬蹠卮 卅賵诃",ldquo:"賯賵卮 倬蹠卮 爻賵賱",rdquo:"賯賵卮 倬蹠卮 卅賵诃",ndash:"爻賶夭賶賯趩蹠",mdash:"爻賶夭賶賯",iexcl:"卅蹐賳丿蹠卮",cent:"鬲賶賷賶賳 亘蹠賱诏賶爻賶",pound:"賮賵賳丿 爻鬲蹛乇賱賶诃",curren:"倬蹏賱 亘蹠賱诏賶爻賶",yen:"賷丕倬賵賳賶賷蹠 賷賶賳賶",brvbar:"卅蹐夭蹐賰 亘丕賱丿丕賯",sect:"倬丕乇丕诏乇丕賮 亘蹠賱诏賶爻賶",uml:"鬲丕蹕蹏卮 卅丕賷乇賶卮 亘蹠賱诏賶爻賶",copy:"賳蹠卮乇 诰賵賯蹏賯賶 亘蹠賱诏賶爻賶",ordf:"Feminine ordinal indicator",laquo:"賯賵卮 鬲賶乇賳丕賯 爻賵賱",not:"睾蹠賷乇賶 亘蹠賱诏蹠",reg:"禺蹠鬲賱蹠鬲賰蹠賳 鬲丕蹕丕乇 賲丕乇賰賶爻賶",macr:"爻賵夭蹏卮 亘蹠賱诏賶爻賶",
    +deg:"诏賶乇丕丿蹏爻 亘蹠賱诏賶爻賶",sup2:"賷蹏賯賶乇賶 卅賶賳丿蹛賰賶爻 2",sup3:"賷蹏賯賶乇賶 卅賶賳丿蹛賰賶爻 3",acute:"卅蹏乇睾蹏 亘蹠賱诏賶爻賶",micro:"Micro sign",para:"卅丕亘夭丕爻 亘蹠賱诏賶爻賶",middot:"卅賵鬲鬲蹏乇丕 趩蹛賰賶鬲",cedil:"卅丕爻鬲賶睾丕 賯賵卮蹏賱賶丿賶睾丕賳 亘蹠賱诏蹠",sup1:"賷蹏賯賶乇賶 卅賶賳丿蹛賰賶爻 1",ordm:"Masculine ordinal indicator",raquo:"賯賵卮 鬲賶乇賳丕賯 卅賵诃",frac14:"卅丕丿丿賶賷 賰蹠爻賶乇 鬲蹎鬲鬲賶賳 亘賶乇",frac12:"卅丕丿丿賶賷 賰蹠爻賶乇 卅賶賰賰賶丿賶賳 亘賶乇",frac34:"卅丕丿丿賶賷 賰蹠爻賶乇 卅蹐趩鬲賶賳 鬲蹎乇鬲",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent",
    +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter 脝",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",
    +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"賯賵卮 倬蹠卮 卅賵诃",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",
    +Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"Latin small letter 忙",
    +ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"鬲賶賰 賲賵賱賱丕賯 爻賵卅丕賱 亘蹠賱诏賶爻賶",ograve:"Latin small letter o with grave accent",
    +oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",
    +yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",
    +rarr:"卅賵诃 賷丕 卅賵賯",rArr:"卅賵诃 賯賵卮 爻賶夭賶賯 賷丕 卅賵賯",hArr:"卅賵诃 爻賵賱 賯賵卮 爻賶夭賶賯 賷丕 卅賵賯",diams:"卅蹏賷蹏賱 睾賶趩",asymp:"鬲蹠禺賲賶賳蹠賳 鬲蹠诃"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/uk.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/uk.js
    new file mode 100644
    index 00000000..1850f0e5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/uk.js
    @@ -0,0 +1,12 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","uk",{euro:"袟薪邪泻 褦胁褉芯",lsquo:"袥褨胁褨 芯写懈薪邪褉薪褨 谢邪锌泻懈",rsquo:"袩褉邪胁褨 芯写懈薪邪褉薪褨 谢邪锌泻懈",ldquo:"袥褨胁褨 锌芯写胁褨泄薪褨 谢邪锌泻懈",rdquo:"袩褉邪胁褨 锌芯写胁褨泄薪褨 谢邪锌泻懈",ndash:"小械褉械写薪褦 褌懈褉械",mdash:"袛芯胁谐械 褌懈褉械",iexcl:"袩械褉械胁械褉薪褍褌懈泄 蟹薪邪泻 芯泻谢懈泻褍",cent:"袟薪邪泻 褑械薪褌邪",pound:"袟薪邪泻 褎褍薪褌邪",curren:"袟薪邪泻 胁邪谢褞褌懈",yen:"袟薪邪泻 褦薪懈",brvbar:"袩械褉械褉懈胁褔邪褋褌邪 胁械褉褌懈泻邪谢褜薪邪 谢褨薪褨褟",sect:"袟薪邪泻 锌邪褉邪谐褉邪褎褍",uml:"校屑谢邪褍褌",copy:"袟薪邪泻 邪胁褌芯褉褋褜泻懈褏 锌褉邪胁",ordf:"袞褨薪芯褔懈泄 锌芯褉褟写泻芯胁懈泄 胁泻邪蟹褨胁薪懈泻",laquo:"谢褨胁褨 胁泻邪蟹褨胁薪褨 锌芯写胁褨泄薪褨 泻褍褌芯胁褨 写褍卸泻懈",
    +not:"袟邪锌械褉械褔械薪薪褟",reg:"袟薪邪泻 芯褏芯褉芯薪懈 褋褍屑褨卸薪懈褏 锌褉邪胁",macr:"袦邪泻褉芯薪",deg:"袟薪邪泻 谐褉邪写褍褋邪",sup2:"写胁邪 褍 胁械褉褏薪褜芯屑褍 褨薪写械泻褋褨",sup3:"褌褉懈 褍 胁械褉褏薪褜芯屑褍 褨薪写械泻褋褨",acute:"袟薪邪泻 邪泻褍褌邪",micro:"袟薪邪泻 屑褨泻褉芯",para:"袟薪邪泻 邪斜蟹邪褑褍",middot:"袉薪褌械褉锌褍薪泻褌",cedil:"小械写懈谢褜",sup1:"袨写懈薪 褍 胁械褉褏薪褜芯屑褍 褨薪写械泻褋褨",ordm:"效芯谢芯胁褨褔懈泄 锌芯褉褟写泻芯胁懈泄 胁泻邪蟹褨胁薪懈泻",raquo:"锌褉邪胁褨 胁泻邪蟹褨胁薪褨 锌芯写胁褨泄薪褨 泻褍褌芯胁褨 写褍卸泻懈",frac14:"袨写薪邪 褔械褌胁械褉褌懈薪邪",frac12:"袨写薪邪 写褉褍谐邪",frac34:"褌褉懈 褔械褌胁械褉褌懈褏",iquest:"袩械褉械胁械褉薪褍褌懈泄 蟹薪邪泻 锌懈褌邪薪薪褟",Agrave:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 A 蟹 谐褉邪胁褨褋芯屑",Aacute:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 袗 蟹 邪泻褍褌芯屑",
    +Acirc:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 袗 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",Atilde:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 袗 蟹 褌懈谢褜写芯褞",Auml:"袙械谢懈泻械 谢邪褌懈薪褋褜泻械 袗 蟹 褍屑谢邪褍褌芯屑",Aring:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 A 蟹 泻褨谢褜褑械屑 蟹谐芯褉懈",AElig:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 脝",Ccedil:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 C 蟹 褋械写懈谢谢褞",Egrave:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 E 蟹 谐褉邪胁褨褋芯屑",Eacute:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 E 蟹 邪泻褍褌芯屑",Ecirc:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 E 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",Euml:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 袗 蟹 褍屑谢邪褍褌芯屑",Igrave:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 I 蟹 谐褉邪胁褨褋芯屑",Iacute:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 I 蟹 邪泻褍褌芯屑",Icirc:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 I 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",
    +Iuml:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 袉 蟹 褍屑谢邪褍褌芯屑",ETH:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 Eth",Ntilde:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 N 蟹 褌懈谢褜写芯褞",Ograve:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 O 蟹 谐褉邪胁褨褋芯屑",Oacute:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 O 蟹 邪泻褍褌芯屑",Ocirc:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 O 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",Otilde:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 O 蟹 褌懈谢褜写芯褞",Ouml:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 袨 蟹 褍屑谢邪褍褌芯屑",times:"袟薪邪泻 屑薪芯卸械薪薪褟",Oslash:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 锌械褉械泻褉械褋谢械薪邪 O ",Ugrave:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 U 蟹 谐褉邪胁褨褋芯屑",Uacute:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 U 蟹 邪泻褍褌芯屑",Ucirc:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 U 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",Uuml:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 U 蟹 褍屑谢邪褍褌芯屑",
    +Yacute:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 Y 蟹 邪泻褍褌芯屑",THORN:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 孝芯褉薪",szlig:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 械褋褑械褌",agrave:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 a 蟹 谐褉邪胁褨褋芯屑",aacute:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 a 蟹 邪泻褍褌芯屑",acirc:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 a 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",atilde:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 a 蟹 褌懈谢褜写芯褞",auml:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 a 蟹 褍屑谢邪褍褌芯屑",aring:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 a 蟹 泻褨谢褜褑械屑 蟹谐芯褉懈",aelig:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 忙",ccedil:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 C 蟹 褋械写懈谢谢褞",egrave:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 e 蟹 谐褉邪胁褨褋芯屑",eacute:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 e 蟹 邪泻褍褌芯屑",ecirc:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 e 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",euml:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 e 蟹 褍屑谢邪褍褌芯屑",
    +igrave:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 i 蟹 谐褉邪胁褨褋芯屑",iacute:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 i 蟹 邪泻褍褌芯屑",icirc:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 i 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",iuml:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 i 蟹 褍屑谢邪褍褌芯屑",eth:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 Eth",ntilde:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 n 蟹 褌懈谢褜写芯褞",ograve:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 o 蟹 谐褉邪胁褨褋芯屑",oacute:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 o 蟹 邪泻褍褌芯屑",ocirc:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 o 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",otilde:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 o 蟹 褌懈谢褜写芯褞",ouml:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 o 蟹 褍屑谢邪褍褌芯屑",divide:"袟薪邪泻 写褨谢械薪薪褟",oslash:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 锌械褉械泻褉械褋谢械薪邪 o",ugrave:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 u 蟹 谐褉邪胁褨褋芯屑",uacute:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 u 蟹 邪泻褍褌芯屑",
    +ucirc:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 u 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",uuml:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 u 蟹 褍屑谢邪褍褌芯屑",yacute:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 y 蟹 邪泻褍褌芯屑",thorn:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 褌芯褉薪",yuml:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 y 蟹 褍屑谢邪褍褌芯屑",OElig:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 谢褨谐邪褌褍褉邪 OE",oelig:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 谢褨谐邪褌褍褉邪 oe",372:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 W 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",374:"袙械谢懈泻邪 谢邪褌懈薪褋褜泻邪 Y 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",373:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 w 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",375:"袦邪谢邪 谢邪褌懈薪褋褜泻邪 y 蟹 褑懈褉泻褍屑褎谢械泻褋芯屑",sbquo:"袨写懈薪懈褔薪褨 薪懈卸薪褨 谢邪斜泻懈",8219:"袙械褉褏薪褨 芯写懈薪懈褔薪褨 芯斜械褉薪械薪褨 谢邪斜泻懈",bdquo:"袩芯写胁褨泄薪褨 薪懈卸薪褨 谢邪斜泻懈",
    +hellip:"孝褉懈 泻褉邪锌泻懈",trade:"袟薪邪泻 褌芯褉谐芯胁芯褩 屑邪褉泻懈",9658:"效芯褉薪懈泄 锌褉邪胁懈泄 胁泻邪蟹褨胁薪懈泻",bull:"袦邪褉泻械褉 褋锌懈褋泻褍",rarr:"小褌褉褨谢泻邪 胁锌褉邪胁芯",rArr:"袩芯写胁褨泄薪邪 褋褌褉褨谢泻邪 胁锌褉邪胁芯",hArr:"袩芯写胁褨泄薪邪 褋褌褉褨谢泻邪 胁谢褨胁芯-胁锌褉邪胁芯",diams:"效芯褉薪懈泄 写褨邪屑芯薪褌",asymp:"袧邪斜谢懈卸械薪芯 写芯褉褨胁薪褞褦"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/vi.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/vi.js
    new file mode 100644
    index 00000000..38c4dd41
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/vi.js
    @@ -0,0 +1,13 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","vi",{euro:"K媒 hi峄噓 Euro",lsquo:"D岷 ngo岷穋 膽啤n tr谩i",rsquo:"D岷 ngo岷穋 膽啤n ph岷",ldquo:"D岷 ngo岷穋 膽么i tr谩i",rdquo:"D岷 ngo岷穋 膽么i ph岷",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",not:"Not sign",reg:"Registered sign",
    +macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent",
    +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter 脝",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",
    +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",
    +Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",
    +aelig:"Latin small letter 忙",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",
    +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",
    +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",
    +bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js
    new file mode 100644
    index 00000000..f5e68f0d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js
    @@ -0,0 +1,9 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.plugins.setLang("specialchar","zh-cn",{euro:"娆у厓绗﹀彿",lsquo:"宸﹀崟寮曞彿",rsquo:"鍙冲崟寮曞彿",ldquo:"宸﹀弻寮曞彿",rdquo:"鍙冲弻寮曞彿",ndash:"鐭垝绾",mdash:"闀垮垝绾",iexcl:"绔栫炕鍙瑰彿",cent:"鍒嗗竵绗﹀彿",pound:"鑻遍晳绗﹀彿",curren:"璐у竵绗﹀彿",yen:"鏃ュ厓绗﹀彿",brvbar:"闂存柇鏉",sect:"鑺傛爣璁",uml:"鍒嗛煶绗",copy:"鐗堟潈鎵鏈夋爣璁",ordf:"闃存ч『搴忔寚绀虹",laquo:"宸︽寚鍙屽皷寮曞彿",not:"闈炴爣璁",reg:"娉ㄥ唽鏍囪",macr:"闀块煶绗",deg:"搴︽爣璁",sup2:"涓婃爣浜",sup3:"涓婃爣涓",acute:"閿愰煶绗",micro:"寰",para:"娈佃惤鏍囪",middot:"涓棿鐐",cedil:"涓嬪姞绗",sup1:"涓婃爣涓",ordm:"闃虫ч『搴忔寚绀虹",raquo:"鍙虫寚鍙屽皷寮曞彿",frac14:"鏅氬垎鏁板洓鍒嗕箣涓",frac12:"鏅氬垎鏁颁簩鍒嗕箣涓",frac34:"鏅氬垎鏁板洓鍒嗕箣涓",iquest:"绔栫炕闂彿",
    +Agrave:"甯︽姂闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 A",Aacute:"甯﹂攼闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 A",Acirc:"甯︽壃鎶戠鐨勬媺涓佹枃澶у啓瀛楁瘝 A",Atilde:"甯﹂鍖栫鐨勬媺涓佹枃澶у啓瀛楁瘝 A",Auml:"甯﹀垎闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 A",Aring:"甯︿笂鍦嗗湀鐨勬媺涓佹枃澶у啓瀛楁瘝 A",AElig:"鎷変竵鏂囧ぇ鍐欏瓧姣 Ae",Ccedil:"甯︿笅鍔犵鐨勬媺涓佹枃澶у啓瀛楁瘝 C",Egrave:"甯︽姂闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 E",Eacute:"甯﹂攼闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 E",Ecirc:"甯︽壃鎶戠鐨勬媺涓佹枃澶у啓瀛楁瘝 E",Euml:"甯﹀垎闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 E",Igrave:"甯︽姂闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 I",Iacute:"甯﹂攼闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 I",Icirc:"甯︽壃鎶戠鐨勬媺涓佹枃澶у啓瀛楁瘝 I",Iuml:"甯﹀垎闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 I",ETH:"鎷変竵鏂囧ぇ鍐欏瓧姣 Eth",Ntilde:"甯﹂鍖栫鐨勬媺涓佹枃澶у啓瀛楁瘝 N",Ograve:"甯︽姂闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 O",Oacute:"甯﹂攼闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 O",Ocirc:"甯︽壃鎶戠鐨勬媺涓佹枃澶у啓瀛楁瘝 O",Otilde:"甯﹂鍖栫鐨勬媺涓佹枃澶у啓瀛楁瘝 O",
    +Ouml:"甯﹀垎闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 O",times:"涔樺彿",Oslash:"甯︾矖绾跨殑鎷変竵鏂囧ぇ鍐欏瓧姣 O",Ugrave:"甯︽姂闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 U",Uacute:"甯﹂攼闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 U",Ucirc:"甯︽壃鎶戠鐨勬媺涓佹枃澶у啓瀛楁瘝 U",Uuml:"甯﹀垎闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 U",Yacute:"甯︽姂闊崇鐨勬媺涓佹枃澶у啓瀛楁瘝 Y",THORN:"鎷変竵鏂囧ぇ鍐欏瓧姣 Thorn",szlig:"鎷変竵鏂囧皬鍐欏瓧姣嶆竻闊 S",agrave:"甯︽姂闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 A",aacute:"甯﹂攼闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 A",acirc:"甯︽壃鎶戠鐨勬媺涓佹枃灏忓啓瀛楁瘝 A",atilde:"甯﹂鍖栫鐨勬媺涓佹枃灏忓啓瀛楁瘝 A",auml:"甯﹀垎闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 A",aring:"甯︿笂鍦嗗湀鐨勬媺涓佹枃灏忓啓瀛楁瘝 A",aelig:"鎷変竵鏂囧皬鍐欏瓧姣 Ae",ccedil:"甯︿笅鍔犵鐨勬媺涓佹枃灏忓啓瀛楁瘝 C",egrave:"甯︽姂闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 E",eacute:"甯﹂攼闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 E",ecirc:"甯︽壃鎶戠鐨勬媺涓佹枃灏忓啓瀛楁瘝 E",euml:"甯﹀垎闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 E",igrave:"甯︽姂闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 I",
    +iacute:"甯﹂攼闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 I",icirc:"甯︽壃鎶戠鐨勬媺涓佹枃灏忓啓瀛楁瘝 I",iuml:"甯﹀垎闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 I",eth:"鎷変竵鏂囧皬鍐欏瓧姣 Eth",ntilde:"甯﹂鍖栫鐨勬媺涓佹枃灏忓啓瀛楁瘝 N",ograve:"甯︽姂闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 O",oacute:"甯﹂攼闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 O",ocirc:"甯︽壃鎶戠鐨勬媺涓佹枃灏忓啓瀛楁瘝 O",otilde:"甯﹂鍖栫鐨勬媺涓佹枃灏忓啓瀛楁瘝 O",ouml:"甯﹀垎闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 O",divide:"闄ゅ彿",oslash:"甯︾矖绾跨殑鎷変竵鏂囧皬鍐欏瓧姣 O",ugrave:"甯︽姂闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 U",uacute:"甯﹂攼闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 U",ucirc:"甯︽壃鎶戠鐨勬媺涓佹枃灏忓啓瀛楁瘝 U",uuml:"甯﹀垎闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 U",yacute:"甯︽姂闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 Y",thorn:"鎷変竵鏂囧皬鍐欏瓧姣 Thorn",yuml:"甯﹀垎闊崇鐨勬媺涓佹枃灏忓啓瀛楁瘝 Y",OElig:"鎷変竵鏂囧ぇ鍐欒繛瀛 Oe",oelig:"鎷変竵鏂囧皬鍐欒繛瀛 Oe",372:"甯︽壃鎶戠鐨勬媺涓佹枃澶у啓瀛楁瘝 W",374:"甯︽壃鎶戠鐨勬媺涓佹枃澶у啓瀛楁瘝 Y",
    +373:"甯︽壃鎶戠鐨勬媺涓佹枃灏忓啓瀛楁瘝 W",375:"甯︽壃鎶戠鐨勬媺涓佹枃灏忓啓瀛楁瘝 Y",sbquo:"鍗曚笅 9 褰㈠紩鍙",8219:"鍗曢珮妯炕 9 褰㈠紩鍙",bdquo:"鍙屼笅 9 褰㈠紩鍙",hellip:"姘村钩鐪佺暐鍙",trade:"鍟嗘爣鏍囧織",9658:"瀹炲績鍙虫寚鎸囬拡",bull:"鍔犻噸鍙",rarr:"鍚戝彸绠ご",rArr:"鍚戝彸鍙岀嚎绠ご",hArr:"宸﹀彸鍙岀嚎绠ご",diams:"瀹炲績鏂瑰潡绾哥墝",asymp:"绾︾瓑浜"});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/specialchar.js b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/specialchar.js
    new file mode 100644
    index 00000000..acaea0c8
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/specialchar/dialogs/specialchar.js
    @@ -0,0 +1,14 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("specialchar",function(i){var e,l=i.lang.specialchar,k=function(c){var b,c=c.data?c.data.getTarget():new CKEDITOR.dom.element(c);if("a"==c.getName()&&(b=c.getChild(0).getHtml()))c.removeClass("cke_light_background"),e.hide(),c=i.document.createElement("span"),c.setHtml(b),i.insertText(c.getText())},m=CKEDITOR.tools.addFunction(k),j,g=function(c,b){var a,b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());if("a"==b.getName()&&(a=b.getChild(0).getHtml())){j&&d(null,j);
    +var f=e.getContentElement("info","htmlPreview").getElement();e.getContentElement("info","charPreview").getElement().setHtml(a);f.setHtml(CKEDITOR.tools.htmlEncode(a));b.getParent().addClass("cke_light_background");j=b}},d=function(c,b){b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());"a"==b.getName()&&(e.getContentElement("info","charPreview").getElement().setHtml("&nbsp;"),e.getContentElement("info","htmlPreview").getElement().setHtml("&nbsp;"),b.getParent().removeClass("cke_light_background"),
    +j=void 0)},n=CKEDITOR.tools.addFunction(function(c){var c=new CKEDITOR.dom.event(c),b=c.getTarget(),a;a=c.getKeystroke();var f="rtl"==i.lang.dir;switch(a){case 38:if(a=b.getParent().getParent().getPrevious())a=a.getChild([b.getParent().getIndex(),0]),a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 40:if(a=b.getParent().getParent().getNext())if((a=a.getChild([b.getParent().getIndex(),0]))&&1==a.type)a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 32:k({data:c});c.preventDefault();
    +break;case f?37:39:if(a=b.getParent().getNext())a=a.getChild(0),1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);else if(a=b.getParent().getParent().getNext())(a=a.getChild([0,0]))&&1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);break;case f?39:37:(a=b.getParent().getPrevious())?(a=a.getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):(a=b.getParent().getParent().getPrevious())?(a=a.getLast().getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):
    +d(null,b)}});return{title:l.title,minWidth:430,minHeight:280,buttons:[CKEDITOR.dialog.cancelButton],charColumns:17,onLoad:function(){for(var c=this.definition.charColumns,b=i.config.specialChars,a=CKEDITOR.tools.getNextId()+"_specialchar_table_label",f=['<table role="listbox" aria-labelledby="'+a+'" style="width: 320px; height: 100%; border-collapse: separate;" align="center" cellspacing="2" cellpadding="2" border="0">'],d=0,g=b.length,h,e;d<g;){f.push('<tr role="presentation">');for(var j=0;j<c;j++,
    +d++){if(h=b[d]){h instanceof Array?(e=h[1],h=h[0]):(e=h.replace("&","").replace(";","").replace("#",""),e=l[e]||h);var k="cke_specialchar_label_"+d+"_"+CKEDITOR.tools.getNextNumber();f.push('<td class="cke_dark_background" style="cursor: default" role="presentation"><a href="javascript: void(0);" role="option" aria-posinset="'+(d+1)+'"',' aria-setsize="'+g+'"',' aria-labelledby="'+k+'"',' class="cke_specialchar" title="',CKEDITOR.tools.htmlEncode(e),'" onkeydown="CKEDITOR.tools.callFunction( '+n+
    +', event, this )" onclick="CKEDITOR.tools.callFunction('+m+', this); return false;" tabindex="-1"><span style="margin: 0 auto;cursor: inherit">'+h+'</span><span class="cke_voice_label" id="'+k+'">'+e+"</span></a>")}else f.push('<td class="cke_dark_background">&nbsp;');f.push("</td>")}f.push("</tr>")}f.push("</tbody></table>",'<span id="'+a+'" class="cke_voice_label">'+l.options+"</span>");this.getContentElement("info","charContainer").getElement().setHtml(f.join(""))},contents:[{id:"info",label:i.lang.common.generalTab,
    +title:i.lang.common.generalTab,padding:0,align:"top",elements:[{type:"hbox",align:"top",widths:["320px","90px"],children:[{type:"html",id:"charContainer",html:"",onMouseover:g,onMouseout:d,focus:function(){var c=this.getElement().getElementsByTag("a").getItem(0);setTimeout(function(){c.focus();g(null,c)},0)},onShow:function(){var c=this.getElement().getChild([0,0,0,0,0]);setTimeout(function(){c.focus();g(null,c)},0)},onLoad:function(c){e=c.sender}},{type:"hbox",align:"top",widths:["100%"],children:[{type:"vbox",
    +align:"top",children:[{type:"html",html:"<div></div>"},{type:"html",id:"charPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",html:"<div>&nbsp;</div>"},{type:"html",id:"htmlPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",
    +html:"<div>&nbsp;</div>"}]}]}]}]}]}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/table/dialogs/table.js b/src/main/webapp/plug-in/ckeditor/plugins/table/dialogs/table.js
    new file mode 100644
    index 00000000..bc0f8832
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/table/dialogs/table.js
    @@ -0,0 +1,21 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +(function(){function r(a){for(var e=0,l=0,k=0,m,g=a.$.rows.length;k<g;k++){m=a.$.rows[k];for(var d=e=0,c,b=m.cells.length;d<b;d++)c=m.cells[d],e+=c.colSpan;e>l&&(l=e)}return l}function o(a){return function(){var e=this.getValue(),e=!!(CKEDITOR.dialog.validate.integer()(e)&&0<e);e||(alert(a),this.select());return e}}function n(a,e){var l=function(g){return new CKEDITOR.dom.element(g,a.document)},n=a.editable(),m=a.plugins.dialogadvtab;return{title:a.lang.table.title,minWidth:310,minHeight:CKEDITOR.env.ie?
    +310:280,onLoad:function(){var g=this,a=g.getContentElement("advanced","advStyles");if(a)a.on("change",function(){var a=this.getStyle("width",""),b=g.getContentElement("info","txtWidth");b&&b.setValue(a,!0);a=this.getStyle("height","");(b=g.getContentElement("info","txtHeight"))&&b.setValue(a,!0)})},onShow:function(){var g=a.getSelection(),d=g.getRanges(),c,b=this.getContentElement("info","txtRows"),h=this.getContentElement("info","txtCols"),p=this.getContentElement("info","txtWidth"),f=this.getContentElement("info",
    +"txtHeight");"tableProperties"==e&&((g=g.getSelectedElement())&&g.is("table")?c=g:0<d.length&&(CKEDITOR.env.webkit&&d[0].shrink(CKEDITOR.NODE_ELEMENT),c=a.elementPath(d[0].getCommonAncestor(!0)).contains("table",1)),this._.selectedElement=c);c?(this.setupContent(c),b&&b.disable(),h&&h.disable()):(b&&b.enable(),h&&h.enable());p&&p.onChange();f&&f.onChange()},onOk:function(){var g=a.getSelection(),d=this._.selectedElement&&g.createBookmarks(),c=this._.selectedElement||l("table"),b={};this.commitContent(b,
    +c);if(b.info){b=b.info;if(!this._.selectedElement)for(var h=c.append(l("tbody")),e=parseInt(b.txtRows,10)||0,f=parseInt(b.txtCols,10)||0,i=0;i<e;i++)for(var j=h.append(l("tr")),k=0;k<f;k++){var m=j.append(l("td"));CKEDITOR.env.ie||m.append(l("br"))}e=b.selHeaders;if(!c.$.tHead&&("row"==e||"both"==e)){j=new CKEDITOR.dom.element(c.$.createTHead());h=c.getElementsByTag("tbody").getItem(0);h=h.getElementsByTag("tr").getItem(0);for(i=0;i<h.getChildCount();i++)f=h.getChild(i),f.type==CKEDITOR.NODE_ELEMENT&&
    +!f.data("cke-bookmark")&&(f.renameNode("th"),f.setAttribute("scope","col"));j.append(h.remove())}if(null!==c.$.tHead&&!("row"==e||"both"==e)){j=new CKEDITOR.dom.element(c.$.tHead);h=c.getElementsByTag("tbody").getItem(0);for(k=h.getFirst();0<j.getChildCount();){h=j.getFirst();for(i=0;i<h.getChildCount();i++)f=h.getChild(i),f.type==CKEDITOR.NODE_ELEMENT&&(f.renameNode("td"),f.removeAttribute("scope"));h.insertBefore(k)}j.remove()}if(!this.hasColumnHeaders&&("col"==e||"both"==e))for(j=0;j<c.$.rows.length;j++)f=
    +new CKEDITOR.dom.element(c.$.rows[j].cells[0]),f.renameNode("th"),f.setAttribute("scope","row");if(this.hasColumnHeaders&&!("col"==e||"both"==e))for(i=0;i<c.$.rows.length;i++)j=new CKEDITOR.dom.element(c.$.rows[i]),"tbody"==j.getParent().getName()&&(f=new CKEDITOR.dom.element(j.$.cells[0]),f.renameNode("td"),f.removeAttribute("scope"));b.txtHeight?c.setStyle("height",b.txtHeight):c.removeStyle("height");b.txtWidth?c.setStyle("width",b.txtWidth):c.removeStyle("width");c.getAttribute("style")||c.removeAttribute("style")}if(this._.selectedElement)try{g.selectBookmarks(d)}catch(n){}else a.insertElement(c),
    +setTimeout(function(){var g=new CKEDITOR.dom.element(c.$.rows[0].cells[0]),b=a.createRange();b.moveToPosition(g,CKEDITOR.POSITION_AFTER_START);b.select()},0)},contents:[{id:"info",label:a.lang.table.title,elements:[{type:"hbox",widths:[null,null],styles:["vertical-align:top"],children:[{type:"vbox",padding:0,children:[{type:"text",id:"txtRows","default":3,label:a.lang.table.rows,required:!0,controlStyle:"width:5em",validate:o(a.lang.table.invalidRows),setup:function(a){this.setValue(a.$.rows.length)},
    +commit:k},{type:"text",id:"txtCols","default":2,label:a.lang.table.columns,required:!0,controlStyle:"width:5em",validate:o(a.lang.table.invalidCols),setup:function(a){this.setValue(r(a))},commit:k},{type:"html",html:"&nbsp;"},{type:"select",id:"selHeaders",requiredContent:"th","default":"",label:a.lang.table.headers,items:[[a.lang.table.headersNone,""],[a.lang.table.headersRow,"row"],[a.lang.table.headersColumn,"col"],[a.lang.table.headersBoth,"both"]],setup:function(a){var d=this.getDialog();d.hasColumnHeaders=
    +!0;for(var c=0;c<a.$.rows.length;c++){var b=a.$.rows[c].cells[0];if(b&&"th"!=b.nodeName.toLowerCase()){d.hasColumnHeaders=!1;break}}null!==a.$.tHead?this.setValue(d.hasColumnHeaders?"both":"row"):this.setValue(d.hasColumnHeaders?"col":"")},commit:k},{type:"text",id:"txtBorder",requiredContent:"table[border]","default":a.filter.check("table[border]")?1:0,label:a.lang.table.border,controlStyle:"width:3em",validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidBorder),setup:function(a){this.setValue(a.getAttribute("border")||
    +"")},commit:function(a,d){this.getValue()?d.setAttribute("border",this.getValue()):d.removeAttribute("border")}},{id:"cmbAlign",type:"select",requiredContent:"table[align]","default":"",label:a.lang.common.align,items:[[a.lang.common.notSet,""],[a.lang.common.alignLeft,"left"],[a.lang.common.alignCenter,"center"],[a.lang.common.alignRight,"right"]],setup:function(a){this.setValue(a.getAttribute("align")||"")},commit:function(a,d){this.getValue()?d.setAttribute("align",this.getValue()):d.removeAttribute("align")}}]},
    +{type:"vbox",padding:0,children:[{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtWidth",requiredContent:"table{width}",controlStyle:"width:5em",label:a.lang.common.width,title:a.lang.common.cssLengthTooltip,"default":a.filter.check("table{width}")?500>n.getSize("width")?"100%":500:0,getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&
    +a.updateStyle("width",this.getValue())},setup:function(a){this.setValue(a.getStyle("width"))},commit:k}]},{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtHeight",requiredContent:"table{height}",controlStyle:"width:5em",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");
    +a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:k}]},{type:"html",html:"&nbsp;"},{type:"text",id:"txtCellSpace",requiredContent:"table[cellspacing]",controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":a.filter.check("table[cellspacing]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing),setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellSpacing",
    +this.getValue()):d.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",requiredContent:"table[cellpadding]",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":a.filter.check("table[cellpadding]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellPadding",this.getValue()):d.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right",
    +html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",requiredContent:"caption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0<a.count()){var a=a.getItem(0),d=a.getFirst(CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT));d&&!d.equals(a.getBogus())?(this.disable(),this.setValue(a.getText())):(a=CKEDITOR.tools.trim(a.getText()),this.setValue(a))}},commit:function(e,d){if(this.isEnabled()){var c=this.getValue(),b=d.getElementsByTag("caption");
    +if(c)0<b.count()?(b=b.getItem(0),b.setHtml("")):(b=new CKEDITOR.dom.element("caption",a.document),d.getChildCount()?b.insertBefore(d.getFirst()):b.appendTo(d)),b.append(new CKEDITOR.dom.text(c,a.document));else if(0<b.count())for(c=b.count()-1;0<=c;c--)b.getItem(c).remove()}}},{type:"text",id:"txtSummary",requiredContent:"table[summary]",label:a.lang.table.summary,setup:function(a){this.setValue(a.getAttribute("summary")||"")},commit:function(a,d){this.getValue()?d.setAttribute("summary",this.getValue()):
    +d.removeAttribute("summary")}}]}]},m&&m.createAdvancedTab(a,null,"table")]}}var q=CKEDITOR.tools.cssLength,k=function(a){var e=this.id;a.info||(a.info={});a.info[e]=this.getValue()};CKEDITOR.dialog.add("table",function(a){return n(a,"table")});CKEDITOR.dialog.add("tableProperties",function(a){return n(a,"tableProperties")})})();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/tabletools/dialogs/tableCell.js b/src/main/webapp/plug-in/ckeditor/plugins/tabletools/dialogs/tableCell.js
    new file mode 100644
    index 00000000..2c4e865b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/tabletools/dialogs/tableCell.js
    @@ -0,0 +1,16 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("cellProperties",function(f){var g=f.lang.table,c=g.cell,d=f.lang.common,h=CKEDITOR.dialog.validate,j=/^(\d+(?:\.\d+)?)(px|%)$/,e={type:"html",html:"&nbsp;"},k="rtl"==f.lang.dir,i=f.plugins.colordialog;return{title:c.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?450:410,minHeight:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?230:220,contents:[{id:"info",label:c.title,accessKey:"I",elements:[{type:"hbox",widths:["40%","5%","40%"],children:[{type:"vbox",padding:0,
    +children:[{type:"hbox",widths:["70%","30%"],children:[{type:"text",id:"width",width:"100px",label:d.width,validate:h.number(c.invalidWidth),onLoad:function(){var a=this.getDialog().getContentElement("info","widthType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:function(a){var b=parseInt(a.getAttribute("width"),10),a=parseInt(a.getStyle("width"),10);!isNaN(b)&&this.setValue(b);!isNaN(a)&&this.setValue(a)},
    +commit:function(a){var b=parseInt(this.getValue(),10),c=this.getDialog().getValueOf("info","widthType");isNaN(b)?a.removeStyle("width"):a.setStyle("width",b+c);a.removeAttribute("width")},"default":""},{type:"select",id:"widthType",label:f.lang.table.widthUnit,labelStyle:"visibility:hidden","default":"px",items:[[g.widthPx,"px"],[g.widthPc,"%"]],setup:function(a){(a=j.exec(a.getStyle("width")||a.getAttribute("width")))&&this.setValue(a[2])}}]},{type:"hbox",widths:["70%","30%"],children:[{type:"text",
    +id:"height",label:d.height,width:"100px","default":"",validate:h.number(c.invalidHeight),onLoad:function(){var a=this.getDialog().getContentElement("info","htmlHeightType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:function(a){var b=parseInt(a.getAttribute("height"),10),a=parseInt(a.getStyle("height"),10);!isNaN(b)&&this.setValue(b);!isNaN(a)&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),
    +10);isNaN(b)?a.removeStyle("height"):a.setStyle("height",CKEDITOR.tools.cssLength(b));a.removeAttribute("height")}},{id:"htmlHeightType",type:"html",html:"<br />"+g.widthPx}]},e,{type:"select",id:"wordWrap",label:c.wordWrap,"default":"yes",items:[[c.yes,"yes"],[c.no,"no"]],setup:function(a){var b=a.getAttribute("noWrap");("nowrap"==a.getStyle("white-space")||b)&&this.setValue("no")},commit:function(a){"no"==this.getValue()?a.setStyle("white-space","nowrap"):a.removeStyle("white-space");a.removeAttribute("noWrap")}},
    +e,{type:"select",id:"hAlign",label:c.hAlign,"default":"",items:[[d.notSet,""],[d.alignLeft,"left"],[d.alignCenter,"center"],[d.alignRight,"right"]],setup:function(a){var b=a.getAttribute("align");this.setValue(a.getStyle("text-align")||b||"")},commit:function(a){var b=this.getValue();b?a.setStyle("text-align",b):a.removeStyle("text-align");a.removeAttribute("align")}},{type:"select",id:"vAlign",label:c.vAlign,"default":"",items:[[d.notSet,""],[d.alignTop,"top"],[d.alignMiddle,"middle"],[d.alignBottom,
    +"bottom"],[c.alignBaseline,"baseline"]],setup:function(a){var b=a.getAttribute("vAlign"),a=a.getStyle("vertical-align");switch(a){case "top":case "middle":case "bottom":case "baseline":break;default:a=""}this.setValue(a||b||"")},commit:function(a){var b=this.getValue();b?a.setStyle("vertical-align",b):a.removeStyle("vertical-align");a.removeAttribute("vAlign")}}]},e,{type:"vbox",padding:0,children:[{type:"select",id:"cellType",label:c.cellType,"default":"td",items:[[c.data,"td"],[c.header,"th"]],
    +setup:function(a){this.setValue(a.getName())},commit:function(a){a.renameNode(this.getValue())}},e,{type:"text",id:"rowSpan",label:c.rowSpan,"default":"",validate:h.integer(c.invalidRowSpan),setup:function(a){(a=parseInt(a.getAttribute("rowSpan"),10))&&1!=a&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("rowSpan",this.getValue()):a.removeAttribute("rowSpan")}},{type:"text",id:"colSpan",label:c.colSpan,"default":"",validate:h.integer(c.invalidColSpan),
    +setup:function(a){(a=parseInt(a.getAttribute("colSpan"),10))&&1!=a&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("colSpan",this.getValue()):a.removeAttribute("colSpan")}},e,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"bgColor",label:c.bgColor,"default":"",setup:function(a){var b=a.getAttribute("bgColor");this.setValue(a.getStyle("background-color")||b)},commit:function(a){this.getValue()?a.setStyle("background-color",this.getValue()):
    +a.removeStyle("background-color");a.removeAttribute("bgColor")}},i?{type:"button",id:"bgColorChoose","class":"colorChooser",label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){f.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","bgColor").setValue(a);this.focus()},this)}}:e]},e,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"borderColor",label:c.borderColor,"default":"",setup:function(a){var b=
    +a.getAttribute("borderColor");this.setValue(a.getStyle("border-color")||b)},commit:function(a){this.getValue()?a.setStyle("border-color",this.getValue()):a.removeStyle("border-color");a.removeAttribute("borderColor")}},i?{type:"button",id:"borderColorChoose","class":"colorChooser",label:c.chooseColor,style:(k?"margin-right":"margin-left")+": 10px",onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){f.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info",
    +"borderColor").setValue(a);this.focus()},this)}}:e]}]}]}]}],onShow:function(){this.cells=CKEDITOR.plugins.tabletools.getSelectedCells(this._.editor.getSelection());this.setupContent(this.cells[0])},onOk:function(){for(var a=this._.editor.getSelection(),b=a.createBookmarks(),c=this.cells,d=0;d<c.length;d++)this.commitContent(c[d]);this._.editor.forceNextSelectionCheck();a.selectBookmarks(b);this._.editor.selectionChange()}}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/templates/dialogs/templates.css b/src/main/webapp/plug-in/ckeditor/plugins/templates/dialogs/templates.css
    new file mode 100644
    index 00000000..da216324
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/templates/dialogs/templates.css
    @@ -0,0 +1,84 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +
    +.cke_tpl_list
    +{
    +	border: #dcdcdc 2px solid;
    +	background-color: #ffffff;
    +	overflow-y: auto;
    +	overflow-x: hidden;
    +	width: 100%;
    +	height: 220px;
    +}
    +
    +.cke_tpl_item
    +{
    +	margin: 5px;
    +	padding: 7px;
    +	border: #eeeeee 1px solid;
    +	*width: 88%;
    +}
    +
    +.cke_tpl_preview
    +{
    +	border-collapse: separate;
    +	text-indent:0;
    +	width: 100%;
    +}
    +.cke_tpl_preview td
    +{
    +	padding: 2px;
    +	vertical-align: middle;
    +}
    +.cke_tpl_preview .cke_tpl_preview_img
    +{
    +	width: 100px;
    +}
    +.cke_tpl_preview span
    +{
    +	white-space: normal;
    +}
    +
    +.cke_tpl_title
    +{
    +	font-weight: bold;
    +}
    +
    +.cke_tpl_list a:hover .cke_tpl_item,
    +.cke_tpl_list a:focus .cke_tpl_item,
    +.cke_tpl_list a:active .cke_tpl_item
    +{
    +	border: #ff9933 1px solid;
    +	background-color: #fffacd;
    +}
    +
    +.cke_tpl_list a:hover *,
    +.cke_tpl_list a:focus *,
    +.cke_tpl_list a:active *
    +{
    +	cursor: pointer;
    +}
    +
    +/* IE6 contextual selectors childs won't get :hover transition until,
    +	the hover style of the link itself contains certain CSS declarations.*/
    +.cke_browser_ie6 .cke_tpl_list a:active,
    +.cke_browser_ie6 .cke_tpl_list a:hover,
    +.cke_browser_ie6 .cke_tpl_list a:focus
    +{
    +	background-position: 0 0;
    +}
    +
    +.cke_hc .cke_tpl_list a:hover .cke_tpl_item,
    +.cke_hc .cke_tpl_list a:focus .cke_tpl_item,
    +.cke_hc .cke_tpl_list a:active .cke_tpl_item
    +{
    +	border-width: 3px;
    +}
    +
    +.cke_tpl_empty, .cke_tpl_loading
    +{
    +	text-align: center;
    +	padding: 5px;
    +}
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/templates/dialogs/templates.js b/src/main/webapp/plug-in/ckeditor/plugins/templates/dialogs/templates.js
    new file mode 100644
    index 00000000..390fdb61
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/templates/dialogs/templates.js
    @@ -0,0 +1,10 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +(function(){CKEDITOR.dialog.add("templates",function(c){function o(a,b){var k=CKEDITOR.dom.element.createFromHtml('<a href="javascript:void(0)" tabIndex="-1" role="option" ><div class="cke_tpl_item"></div></a>'),d='<table style="width:350px;" class="cke_tpl_preview" role="presentation"><tr>';a.image&&b&&(d+='<td class="cke_tpl_preview_img"><img src="'+CKEDITOR.getUrl(b+a.image)+'"'+(CKEDITOR.env.ie6Compat?' onload="this.width=this.width"':"")+' alt="" title=""></td>');d+='<td style="white-space:normal;"><span class="cke_tpl_title">'+
    +a.title+"</span><br/>";a.description&&(d+="<span>"+a.description+"</span>");k.getFirst().setHtml(d+"</td></tr></table>");k.on("click",function(){p(a.html)});return k}function p(a){var b=CKEDITOR.dialog.getCurrent();b.getValueOf("selectTpl","chkInsertOpt")?(c.fire("saveSnapshot"),c.setData(a,function(){b.hide();var a=c.createRange();a.moveToElementEditStart(c.editable());a.select();setTimeout(function(){c.fire("saveSnapshot")},0)})):(c.insertHtml(a),b.hide())}function i(a){var b=a.data.getTarget(),
    +c=g.equals(b);if(c||g.contains(b)){var d=a.data.getKeystroke(),f=g.getElementsByTag("a"),e;if(f){if(c)e=f.getItem(0);else switch(d){case 40:e=b.getNext();break;case 38:e=b.getPrevious();break;case 13:case 32:b.fire("click")}e&&(e.focus(),a.data.preventDefault())}}}var h=CKEDITOR.plugins.get("templates");CKEDITOR.document.appendStyleSheet(CKEDITOR.getUrl(h.path+"dialogs/templates.css"));var g,h="cke_tpl_list_label_"+CKEDITOR.tools.getNextNumber(),f=c.lang.templates,l=c.config;return{title:c.lang.templates.title,
    +minWidth:CKEDITOR.env.ie?440:400,minHeight:340,contents:[{id:"selectTpl",label:f.title,elements:[{type:"vbox",padding:5,children:[{id:"selectTplText",type:"html",html:"<span>"+f.selectPromptMsg+"</span>"},{id:"templatesList",type:"html",focus:!0,html:'<div class="cke_tpl_list" tabIndex="-1" role="listbox" aria-labelledby="'+h+'"><div class="cke_tpl_loading"><span></span></div></div><span class="cke_voice_label" id="'+h+'">'+f.options+"</span>"},{id:"chkInsertOpt",type:"checkbox",label:f.insertOption,
    +"default":l.templates_replaceContent}]}]}],buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var a=this.getContentElement("selectTpl","templatesList");g=a.getElement();CKEDITOR.loadTemplates(l.templates_files,function(){var b=(l.templates||"default").split(",");if(b.length){var c=g;c.setHtml("");for(var d=0,h=b.length;d<h;d++)for(var e=CKEDITOR.getTemplates(b[d]),i=e.imagesPath,e=e.templates,n=e.length,j=0;j<n;j++){var m=o(e[j],i);m.setAttribute("aria-posinset",j+1);m.setAttribute("aria-setsize",
    +n);c.append(m)}a.focus()}else g.setHtml('<div class="cke_tpl_empty"><span>'+f.emptyListMsg+"</span></div>")});this._.element.on("keydown",i)},onHide:function(){this._.element.removeListener("keydown",i)}}})})();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/templates/templates/default.js b/src/main/webapp/plug-in/ckeditor/plugins/templates/templates/default.js
    new file mode 100644
    index 00000000..2fca577b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/templates/templates/default.js
    @@ -0,0 +1,6 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.addTemplates("default",{imagesPath:CKEDITOR.getUrl(CKEDITOR.plugins.getPath("templates")+"templates/images/"),templates:[{title:"Image and Title",image:"template1.gif",description:"One main image with a title and text that surround the image.",html:'<h3><img style="margin-right: 10px" height="100" width="100" align="left"/>Type the title here</h3><p>Type the text here</p>'},{title:"Strange Template",image:"template2.gif",description:"A template that defines two colums, each one with a title, and some text.",
    +html:'<table cellspacing="0" cellpadding="0" style="width:100%" border="0"><tr><td style="width:50%"><h3>Title 1</h3></td><td></td><td style="width:50%"><h3>Title 2</h3></td></tr><tr><td>Text 1</td><td></td><td>Text 2</td></tr></table><p>More text goes here.</p>'},{title:"Text and Table",image:"template3.gif",description:"A title with some text and a table.",html:'<div style="width: 80%"><h3>Title goes here</h3><table style="width:150px;float: right" cellspacing="0" cellpadding="0" border="1"><caption style="border:solid 1px black"><strong>Table title</strong></caption><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr></table><p>Type the text here</p></div>'}]});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/templates/templates/images/template1.gif b/src/main/webapp/plug-in/ckeditor/plugins/templates/templates/images/template1.gif
    new file mode 100644
    index 00000000..efdabbeb
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/templates/templates/images/template1.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/templates/templates/images/template2.gif b/src/main/webapp/plug-in/ckeditor/plugins/templates/templates/images/template2.gif
    new file mode 100644
    index 00000000..d1cebb3a
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/templates/templates/images/template2.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/templates/templates/images/template3.gif b/src/main/webapp/plug-in/ckeditor/plugins/templates/templates/images/template3.gif
    new file mode 100644
    index 00000000..db41cb4f
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/plugins/templates/templates/images/template3.gif differ
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/wsc/LICENSE.md b/src/main/webapp/plug-in/ckeditor/plugins/wsc/LICENSE.md
    new file mode 100644
    index 00000000..c7d374ad
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/wsc/LICENSE.md
    @@ -0,0 +1,28 @@
    +Software License Agreement
    +==========================
    +
    +**CKEditor WSC Plugin**
    +Copyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved.
    +
    +Licensed under the terms of any of the following licenses at your choice:
    +
    +*   GNU General Public License Version 2 or later (the "GPL"):
    +    http://www.gnu.org/licenses/gpl.html
    +
    +*   GNU Lesser General Public License Version 2.1 or later (the "LGPL"):
    +    http://www.gnu.org/licenses/lgpl.html
    +
    +*   Mozilla Public License Version 1.1 or later (the "MPL"):
    +    http://www.mozilla.org/MPL/MPL-1.1.html
    +
    +You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice.
    +
    +Sources of Intellectual Property Included in this plugin
    +--------------------------------------------------------
    +
    +Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission.
    +
    +Trademarks
    +----------
    +
    +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/wsc/README.md b/src/main/webapp/plug-in/ckeditor/plugins/wsc/README.md
    new file mode 100644
    index 00000000..46eeafb0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/wsc/README.md
    @@ -0,0 +1,25 @@
    +CKEditor WebSpellChecker Plugin
    +===============================
    +
    +This plugin brings Web Spell Checker (WSC) into CKEditor.
    +
    +WSC is "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.
    +
    +Installation
    +------------
    +
    +1. Clone/copy this repository contents in a new "plugins/wsc" folder in your CKEditor installation.
    +2. Enable the "wsc" plugin in the CKEditor configuration file (config.js):
    +
    +        config.extraPlugins = 'wsc';
    +
    +That's all. WSC will appear on the editor toolbar and will be ready to use.
    +
    +License
    +-------
    +
    +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
    +
    +See LICENSE.md for more information.
    +
    +Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/ciframe.html b/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/ciframe.html
    new file mode 100644
    index 00000000..25db3c73
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/ciframe.html
    @@ -0,0 +1,66 @@
    +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    +<!--
    +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +-->
    +<html>
    +<head>
    +	<title></title>
    +	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    +	<script type="text/javascript">
    +
    +function gup( name )
    +{
    +	name = name.replace( /[\[]/, '\\\[' ).replace( /[\]]/, '\\\]' ) ;
    +	var regexS = '[\\?&]' + name + '=([^&#]*)' ;
    +	var regex = new RegExp( regexS ) ;
    +	var results = regex.exec( window.location.href ) ;
    +
    +	if ( results )
    +		return results[ 1 ] ;
    +	else
    +		return '' ;
    +}
    +
    +var interval;
    +
    +function sendData2Master()
    +{
    +	var destination = window.parent.parent ;
    +	try
    +	{
    +		if ( destination.XDTMaster )
    +		{
    +			var t = destination.XDTMaster.read( [ gup( 'cmd' ), gup( 'data' ) ] ) ;
    +			window.clearInterval( interval ) ;
    +		}
    +	}
    +	catch (e) {}
    +}
    +
    +function OnMessage (event) {
    +	        var message = event.data;
    +	        var destination = window.parent.parent;
    +	        destination.XDTMaster.read( [ 'end', message, 'fpm' ] ) ;
    +}
    +
    +function listenPostMessage() {
    +    if (window.addEventListener) { // all browsers except IE before version 9
    +            window.addEventListener ("message", OnMessage, false);
    +    }else {
    +            if (window.attachEvent) { // IE before version 9
    +                        window.attachEvent("onmessage", OnMessage);
    +                }
    +        }
    +}
    +
    +function onLoad()
    +{
    +	interval = window.setInterval( sendData2Master, 100 );
    +	listenPostMessage();
    +}
    +
    +</script>
    +</head>
    +<body onload="onLoad()"><p></p></body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/tmp.html b/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/tmp.html
    new file mode 100644
    index 00000000..46568594
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/tmp.html
    @@ -0,0 +1,131 @@
    +<!DOCTYPE html>
    +<html>
    +	<head>
    +		<meta charset="UTF-8">
    +		<title>iframe</title>
    +
    +		<style>
    +			html,body{
    +				margin: 0;
    +				height: 100%;
    +				font: 13px/1.555 "Trebuchet MS", sans-serif;
    +			}
    +			a{
    +			    color: #888;
    +			    font-weight: bold;
    +			    text-decoration: none;
    +			    border-bottom: 1px solid #888;
    +			}
    +			.main-box {
    +				color:#252525;
    +				padding: 3px 5px;
    +				text-align: justify;
    +			}
    +			.main-box p{margin: 0 0 14px;}
    +			.main-box .cerr{
    +			    color: #f00000;
    +			    border-bottom-color: #f00000;
    +			}
    +		</style>
    +	</head>
    +	<body>
    +		<div id="content" class="main-box"></div>
    +		<iframe src="" frameborder="0" id="spelltext" name="spelltext" style="display:none; width: 100%" ></iframe>
    +		<iframe src="" frameborder="0" id="loadsuggestfirst" name="loadsuggestfirst" style="display:none; width: 100%" ></iframe>
    +		<iframe src="" frameborder="0" id="loadspellsuggestall" name="loadspellsuggestall" style="display:none; width: 100%" ></iframe>
    +		<iframe src="" frameborder="0" id="loadOptionsForm" name="loadOptionsForm" style="display:none; width: 100%" ></iframe>
    +		<script>
    +		(function(window) {
    +			// Constructor Manager PostMessage
    +
    +			var ManagerPostMessage = function() {
    +				var _init = function(handler) {
    +					if (document.addEventListener) {
    +						window.addEventListener('message', handler, false);
    +					} else {
    +						window.attachEvent("onmessage", handler);
    +					};
    +				};
    +				var _sendCmd = function(o) {
    +					var str,
    +						type = Object.prototype.toString,
    +						fn = o.fn || null,
    +						id = o.id || '',
    +						target = o.target || window,
    +						message = o.message || { 'id': id };
    +
    +					if (type.call(o.message) == "[object Object]") {
    +						(o.message['id']) ? o.message['id'] : o.message['id'] = id;
    +						message = o.message;
    +					};
    +
    +					str = JSON.stringify(message, fn);
    +					target.postMessage(str, '*');
    +				};
    +
    +				return {
    +					init: _init,
    +					send: _sendCmd
    +				};
    +			};
    +
    +			var manageMessageTmp = new ManagerPostMessage;
    +
    +
    +				var appString = 'lf/23/unpacked_js/spell.js';
    +				var toolsString = 'lf/23/js/tools.js';
    +
    +				var parseUrl = function(){
    +					var serverUrl = window.location.hash.replace( /^#server=/, '' );
    +					return serverUrl;
    +				};
    +
    +				var url_version = function() {
    +					var frameNumber = window.location.hash.match( /\?.*$/ )[0].replace( /^\?/, '' );
    +					return frameNumber;
    +				};
    +
    +				function loadScript(src, callback) {
    +				    var scriptTag = document.createElement("script");
    +				   		scriptTag.type = "text/javascript";
    +				   	callback ? callback : callback = function() {};
    +				    if(scriptTag.readyState) {
    +				        //IE
    +				        scriptTag.onreadystatechange = function() {
    +				            if (scriptTag.readyState == "loaded" ||
    +				            scriptTag.readyState == "complete") {
    +				                scriptTag.onreadystatechange = null;
    +				                setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1)
    +				                callback();
    +				            }
    +				        };
    +				    }else{
    +				        //Others
    +				        scriptTag.onload = function() {
    +				           setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1);
    +				           callback();
    +				        };
    +				    };
    +				    scriptTag.src = src;
    +				    document.getElementsByTagName("head")[0].appendChild(scriptTag);
    +				};
    +
    +
    +				window.onload = function(){
    +
    +					toolsString = parseUrl() + toolsString;
    +
    +					appString = parseUrl() + appString;
    +
    +					 loadScript(appString, function(){
    +						manageMessageTmp.send({
    +							'id': 'iframeOnload',
    +							'target': window.parent
    +						});
    +					});
    +				}
    +
    +			})(this);
    +		</script>
    +	</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/tmpFrameset.html b/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/tmpFrameset.html
    new file mode 100644
    index 00000000..0d675f4d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/tmpFrameset.html
    @@ -0,0 +1,52 @@
    +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
    +<!--
    +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +-->
    +<html>
    +<head>
    +	<title></title>
    +	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    +	<script type="text/javascript">
    +
    +function doLoadScript( url )
    +{
    +	if ( !url )
    +		return false ;
    +
    +	var s = document.createElement( "script" ) ;
    +	s.type = "text/javascript" ;
    +	s.src = url ;
    +	document.getElementsByTagName( "head" )[ 0 ].appendChild( s ) ;
    +
    +	return true ;
    +}
    +
    +var opener;
    +function tryLoad()
    +{
    +	opener = window.parent;
    +
    +	// get access to global parameters
    +	var oParams = window.opener.oldFramesetPageParams;
    +
    +	// make frameset rows string prepare
    +	var sFramesetRows = ( parseInt( oParams.firstframeh, 10 ) || '30') + ",*," + ( parseInt( oParams.thirdframeh, 10 ) || '150' ) + ',0' ;
    +	document.getElementById( 'itFrameset' ).rows = sFramesetRows ;
    +
    +	// dynamic including init frames and crossdomain transport code
    +	// from config sproxy_js_frameset url
    +	var addScriptUrl = oParams.sproxy_js_frameset ;
    +	doLoadScript( addScriptUrl ) ;
    +}
    +
    +	</script>
    +</head>
    +
    +<frameset id="itFrameset" onload="tryLoad();" border="0" rows="30,*,*,0">
    +    <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="2" src="" name="navbar"></frame>
    +    <frame scrolling="auto" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="0" src="" name="mid"></frame>
    +    <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="bot"></frame>
    +    <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="spellsuggestall"></frame>
    +</frameset>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/wsc.css b/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/wsc.css
    new file mode 100644
    index 00000000..9e834f1d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/wsc.css
    @@ -0,0 +1,82 @@
    +/*
    +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +
    +html, body
    +{
    +	background-color: transparent;
    +	margin: 0px;
    +	padding: 0px;
    +}
    +
    +body
    +{
    +	padding: 10px;
    +}
    +
    +body, td, input, select, textarea
    +{
    +	font-size: 11px;
    +	font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana;
    +}
    +
    +.midtext
    +{
    +	padding:0px;
    +	margin:10px;
    +}
    +
    +.midtext p
    +{
    +	padding:0px;
    +	margin:10px;
    +}
    +
    +.Button
    +{
    +	border: #737357 1px solid;
    +	color: #3b3b1f;
    +	background-color: #c7c78f;
    +}
    +
    +.PopupTabArea
    +{
    +	color: #737357;
    +	background-color: #e3e3c7;
    +}
    +
    +.PopupTitleBorder
    +{
    +	border-bottom: #d5d59d 1px solid;
    +}
    +.PopupTabEmptyArea
    +{
    +	padding-left: 10px;
    +	border-bottom: #d5d59d 1px solid;
    +}
    +
    +.PopupTab, .PopupTabSelected
    +{
    +	border-right: #d5d59d 1px solid;
    +	border-top: #d5d59d 1px solid;
    +	border-left: #d5d59d 1px solid;
    +	padding: 3px 5px 3px 5px;
    +	color: #737357;
    +}
    +
    +.PopupTab
    +{
    +	margin-top: 1px;
    +	border-bottom: #d5d59d 1px solid;
    +	cursor: pointer;
    +}
    +
    +.PopupTabSelected
    +{
    +	font-weight: bold;
    +	cursor: default;
    +	padding-top: 4px;
    +	border-bottom: #f1f1e3 1px solid;
    +	background-color: #f1f1e3;
    +}
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/wsc.js b/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/wsc.js
    new file mode 100644
    index 00000000..ef43ec2b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/wsc.js
    @@ -0,0 +1,67 @@
    +锘/*
    + Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +(function(){function r(a){if(!a)throw"Languages-by-groups list are required for construct selectbox";var c=[],d="",e;for(e in a)for(var g in a[e]){var h=a[e][g];"en_US"==h?d=h:c.push(h)}c.sort();d&&c.unshift(d);return{getCurrentLangGroup:function(c){a:{for(var d in a)for(var g in a[d])if(g.toUpperCase()===c.toUpperCase()){c=d;break a}c=""}return c},setLangList:function(){var c={},d;for(d in a)for(var g in a[d])c[a[d][g]]=g;return c}()}}var f=function(){var a=function(a,b,e){var e=e||{},g=e.expires;
    +if("number"==typeof g&&g){var h=new Date;h.setTime(h.getTime()+1E3*g);g=e.expires=h}g&&g.toUTCString&&(e.expires=g.toUTCString());var b=encodeURIComponent(b),a=a+"="+b,f;for(f in e)b=e[f],a+="; "+f,!0!==b&&(a+="="+b);document.cookie=a};return{postMessage:{init:function(a){document.addEventListener?window.addEventListener("message",a,!1):window.attachEvent("onmessage",a)},send:function(a){var b=a.fn||null,e=a.id||"",g=a.target||window,h=a.message||{id:e};"[object Object]"==Object.prototype.toString.call(a.message)&&
    +(a.message.id||(a.message.id=e),h=a.message);a=window.JSON.stringify(h,b);g.postMessage(a,"*")}},hash:{create:function(){},parse:function(){}},cookie:{set:a,get:function(a){return(a=document.cookie.match(RegExp("(?:^|; )"+a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)")))?decodeURIComponent(a[1]):void 0},remove:function(c){a(c,"",{expires:-1})}}}}(),a=a||{};a.TextAreaNumber=null;a.load=!0;a.cmd={SpellTab:"spell",Thesaurus:"thes",GrammTab:"grammar"};a.dialog=null;a.optionNode=null;a.selectNode=
    +null;a.grammerSuggest=null;a.textNode={};a.iframeMain=null;a.dataTemp="";a.div_overlay=null;a.textNodeInfo={};a.selectNode={};a.selectNodeResponce={};a.selectingLang=a.currentLang;a.langList=null;a.langSelectbox=null;a.banner="";a.show_grammar=null;a.div_overlay_no_check=null;a.wsc_customerId=CKEDITOR.config.wsc_customerId;a.cust_dic_ids=CKEDITOR.config.wsc_customDictionaryIds;a.userDictionaryName=CKEDITOR.config.wsc_userDictionaryName;a.defaultLanguage=CKEDITOR.config.defaultLanguage;a.targetFromFrame=
    +{};a.onLoadOverlay=null;a.LocalizationComing={};a.OverlayPlace=null;a.LocalizationButton={ChangeTo:{instance:null,text:"Change to"},ChangeAll:{instance:null,text:"Change All"},IgnoreWord:{instance:null,text:"Ignore word"},IgnoreAllWords:{instance:null,text:"Ignore all words"},Options:{instance:null,text:"Options",optionsDialog:{instance:null}},AddWord:{instance:null,text:"Add word"},FinishChecking:{instance:null,text:"Finish Checking"}};a.LocalizationLabel={ChangeTo:{instance:null,text:"Change to"},
    +Suggestions:{instance:null,text:"Suggestions"}};var s=function(b){for(var c in b)b[c].instance.getElement().setText(a.LocalizationComing[c])},t=function(b){for(var c in b){if(!b[c].instance.setLabel)break;b[c].instance.setLabel(a.LocalizationComing[c])}},j,k;a.framesetHtml=function(b){return'<iframe src="'+a.templatePath+a.serverLocation+'" id='+a.iframeNumber+"_"+b+' frameborder="0" allowtransparency="1" style="width:100%;border: 1px solid #AEB3B9;overflow: auto;background:#fff; border-radius: 3px;"></iframe>'};
    +a.setIframe=function(b,c){var d=a.framesetHtml(c);return b.getElement().setHtml(d)};a.setCurrentIframe=function(b){a.setIframe(a.dialog._.contents[b].Content,b)};a.setHeightBannerFrame=function(){var b=a.dialog.getContentElement("SpellTab","banner").getElement(),c=a.dialog.getContentElement("GrammTab","banner").getElement(),d=a.dialog.getContentElement("Thesaurus","banner").getElement();b.setStyle("height","90px");c.setStyle("height","90px");d.setStyle("height","90px")};a.setHeightFrame=function(){document.getElementById(a.iframeNumber+
    +"_"+a.dialog._.currentTabId).style.height="240px"};a.sendData=function(b){var c=b._.currentTabId,d=b._.contents[c].Content,e,g;a.setIframe(d,c);b.parts.tabs.removeAllListeners();b.parts.tabs.on("click",function(h){h=h||window.event;h.data.getTarget().is("a")&&c!=b._.currentTabId&&(c=b._.currentTabId,d=b._.contents[c].Content,e=a.iframeNumber+"_"+c,a.div_overlay.setEnable(),d.getElement().getChildCount()?o(a.targetFromFrame[e],a.cmd[c]):(a.setIframe(d,c),g=document.getElementById(e),a.targetFromFrame[e]=
    +g.contentWindow))})};a.buildSelectLang=function(){var b=new CKEDITOR.dom.element("div"),c=new CKEDITOR.dom.element("select"),d="wscLang"+a.CKNumber;b.addClass("cke_dialog_ui_input_select");b.setAttribute("role","presentation");b.setStyles({height:"auto",position:"absolute",right:"0",top:"-1px",width:"160px","white-space":"normal"});c.setAttribute("id",d);c.addClass("cke_dialog_ui_input_select");c.setStyles({width:"160px"});b.append(c);return b};a.buildOptionLang=function(b){var c=document.getElementById("wscLang"+
    +a.CKNumber),d=document.createDocumentFragment(),e,g=[];if(0===c.options.length){for(e in b)g.push([e,b[e]]);g.sort();for(var h=0;h<g.length;h++)b=document.createElement("option"),b.setAttribute("value",g[h][1]),e=document.createTextNode(g[h][0]),b.appendChild(e),g[h][1]==a.selectingLang&&b.setAttribute("selected","selected"),d.appendChild(b);c.appendChild(d)}};a.buildOptionSynonyms=function(b){b=a.selectNodeResponce[b];a.selectNode.synonyms.clear();for(var c=0;c<b.length;c++)a.selectNode.synonyms.add(b[c],
    +b[c]);a.selectNode.synonyms.getInputElement().$.firstChild.selected=!0;a.textNode.Thesaurus.setValue(a.selectNode.synonyms.getInputElement().getValue())};var l=function(a){var c=document,d=a.target||c.body,e=a.id||"overlayBlock",g=a.opacity||"0.9",a=a.background||"#f1f1f1",h=c.getElementById(e),f=h||c.createElement("div");f.style.cssText="position: absolute;top:30px;bottom:40px;left:1px;right:1px;z-index: 10020;padding:0;margin:0;background:"+a+";opacity: "+g+";filter: alpha(opacity="+100*g+");display: none;";
    +f.id=e;h||d.appendChild(f);return{setDisable:function(){f.style.display="none"},setEnable:function(){f.style.display="block"}}},u=function(b,c,d){var e=new CKEDITOR.dom.element("div"),g=new CKEDITOR.dom.element("input"),h=new CKEDITOR.dom.element("label"),f="wscGrammerSuggest"+b+"_"+c;e.addClass("cke_dialog_ui_input_radio");e.setAttribute("role","presentation");e.setStyles({width:"97%",padding:"5px","white-space":"normal"});g.setAttributes({type:"radio",value:c,name:"wscGrammerSuggest",id:f});g.setStyles({"float":"left"});
    +g.on("click",function(b){a.textNode.GrammTab.setValue(b.sender.getValue())});d&&g.setAttribute("checked",!0);g.addClass("cke_dialog_ui_radio_input");h.appendText(b);h.setAttribute("for",f);h.setStyles({display:"block","line-height":"16px","margin-left":"18px","white-space":"normal"});e.append(g);e.append(h);return e},q=function(b){var c=new r(b),b=document.getElementById("wscLang"+a.CKNumber),d=a.iframeNumber+"_"+a.dialog._.currentTabId;a.buildOptionLang(c.setLangList);p[c.getCurrentLangGroup(a.selectingLang)]();
    +b.onchange=function(){p[c.getCurrentLangGroup(this.value)]();a.div_overlay.setEnable();a.selectingLang=this.value;f.postMessage.send({message:{changeLang:a.selectingLang,text:a.dataTemp},target:a.targetFromFrame[d],id:"selectionLang_outer__page"})}},v=function(b){if("no_any_suggestions"==b){b="No suggestions";a.LocalizationButton.ChangeTo.instance.disable();a.LocalizationButton.ChangeAll.instance.disable();var c=function(b){b=a.LocalizationButton[b].instance;b.getElement().hasClass("cke_disabled")?
    +b.getElement().setStyle("color","#a0a0a0"):b.disable()};c("ChangeTo");c("ChangeAll")}else a.LocalizationButton.ChangeTo.instance.enable(),a.LocalizationButton.ChangeAll.instance.enable(),a.LocalizationButton.ChangeTo.instance.getElement().setStyle("color","#333"),a.LocalizationButton.ChangeAll.instance.getElement().setStyle("color","#333");return b},w={iframeOnload:function(){a.div_overlay.setEnable();var b=a.dialog._.currentTabId;o(a.targetFromFrame[a.iframeNumber+"_"+b],a.cmd[b])},suggestlist:function(b){delete b.id;
    +a.div_overlay_no_check.setDisable();m();q(a.langList);"false"==a.show_grammar&&n();var c=v(b.word),d="";c instanceof Array&&(c=b.word[0]);d=c=c.split(",");k.clear();a.textNode.SpellTab.setValue(d[0]);for(b=0;b<d.length;b++)k.add(d[b],d[b]);i();a.div_overlay.setDisable()},grammerSuggest:function(b){delete b.id;delete b.mocklangs;m();var c=b.grammSuggest[0];a.grammerSuggest.getElement().setHtml("");a.textNode.GrammTab.reset();a.textNode.GrammTab.setValue(c);a.textNodeInfo.GrammTab.getElement().setHtml("");
    +a.textNodeInfo.GrammTab.getElement().setText(b.info);for(var b=b.grammSuggest,c=b.length,d=!0,e=0;e<c;e++)a.grammerSuggest.getElement().append(u(b[e],b[e],d)),d=!1;i();a.div_overlay.setDisable()},thesaurusSuggest:function(b){delete b.id;delete b.mocklangs;m();a.selectNodeResponce=b;a.textNode.Thesaurus.reset();a.selectNode.categories.clear();for(var c in b)a.selectNode.categories.add(c,c);b=a.selectNode.categories.getInputElement().getChildren().$[0].value;a.selectNode.categories.getInputElement().getChildren().$[0].selected=
    +!0;a.buildOptionSynonyms(b);i();a.div_overlay.setDisable()},finish:function(b){delete b.id;a.dialog.getContentElement(a.dialog._.currentTabId,"bottomGroup").getElement().hide();a.dialog.getContentElement(a.dialog._.currentTabId,"BlockFinishChecking").getElement().show();a.div_overlay.setDisable()},settext:function(b){delete b.id;a.dialog.getParentEditor().focus();a.dialog.getParentEditor().setData(b.text,a.dataTemp="");a.dialog.hide()},ReplaceText:function(b){delete b.id;a.div_overlay.setEnable();
    +a.dataTemp=b.text;a.selectingLang=b.currentLang;window.setTimeout(function(){a.div_overlay.setDisable()},500);s(a.LocalizationButton);t(a.LocalizationLabel)},options_checkbox_send:function(b){delete b.id;b={osp:f.cookie.get("osp"),udn:f.cookie.get("udn"),cust_dic_ids:a.cust_dic_ids};f.postMessage.send({message:b,target:a.targetFromFrame[a.iframeNumber+"_"+a.dialog._.currentTabId],id:"options_outer__page"})},getOptions:function(b){var c=b.DefOptions.udn;a.LocalizationComing=b.DefOptions.localizationButtonsAndText;
    +a.show_grammar=b.show_grammar;a.langList=b.lang;if(a.bnr=b.bannerId){a.setHeightBannerFrame();var d=b.banner;a.dialog.getContentElement(a.dialog._.currentTabId,"banner").getElement().setHtml(d)}else a.setHeightFrame();"false"==a.show_grammar&&n();"undefined"==c&&(a.userDictionaryName?(c=a.userDictionaryName,d={osp:f.cookie.get("osp"),udn:a.userDictionaryName,cust_dic_ids:a.cust_dic_ids,id:"options_dic_send",udnCmd:"create"},f.postMessage.send({message:d,target:a.targetFromFrame[void 0]})):c="");f.cookie.set("osp",
    +b.DefOptions.osp);f.cookie.set("udn",c);f.cookie.set("cust_dic_ids",b.DefOptions.cust_dic_ids);f.postMessage.send({id:"giveOptions"})},options_dic_send:function(){var b={osp:f.cookie.get("osp"),udn:f.cookie.get("udn"),cust_dic_ids:a.cust_dic_ids,id:"options_dic_send",udnCmd:f.cookie.get("udnCmd")};f.postMessage.send({message:b,target:a.targetFromFrame[a.iframeNumber+"_"+a.dialog._.currentTabId]})},data:function(a){delete a.id},giveOptions:function(){},setOptionsConfirmF:function(){},setOptionsConfirmT:function(){j.setValue("")},
    +clickBusy:function(){a.div_overlay.setEnable()},suggestAllCame:function(){a.div_overlay.setDisable();a.div_overlay_no_check.setDisable()},TextCorrect:function(){q(a.langList)}},x=function(a){a=a||window.event;a=window.JSON.parse(a.data);w[a.id](a)},o=function(b,c,d,e){c=c||CKEDITOR.config.wsc_cmd||"spell";d=d||a.dataTemp;f.postMessage.send({message:{customerId:a.wsc_customerId,text:d,txt_ctrl:a.TextAreaNumber,cmd:c,cust_dic_ids:a.cust_dic_ids,udn:a.userDictionaryName,slang:a.selectingLang,reset_suggest:e||
    +!1},target:b,id:"data_outer__page"});a.div_overlay.setEnable()},p={superset:function(){a.dialog.showPage("Thesaurus");a.dialog.showPage("GrammTab");a.dialog.showPage("SpellTab")},usual:function(){a.dialog.hidePage("Thesaurus");n();a.dialog.showPage("SpellTab")}},y=function(b){var c=new function(a){var b={};return{getCmdByTab:function(c){for(var h in a)b[a[h]]=h;return b[c]}}}(a.cmd);b.selectPage(c.getCmdByTab(CKEDITOR.config.wsc_cmd));a.sendData(b)},n=function(){a.dialog.hidePage("GrammTab")},i=function(){a.dialog.getContentElement(a.dialog._.currentTabId,
    +"bottomGroup").getElement().show()},m=function(){a.dialog.getContentElement(a.dialog._.currentTabId,"BlockFinishChecking").getElement().hide()};a.CKNumber=CKEDITOR.tools.getNextNumber();CKEDITOR.dialog.add("checkspell",function(b){var c=function(){a.div_overlay.setEnable();var c=a.dialog._.currentTabId,d=a.iframeNumber+"_"+c,e=a.textNode[c].getValue();f.postMessage.send({message:{cmd:this.getElement().getAttribute("title-cmd"),tabId:c,new_word:e},target:a.targetFromFrame[d],id:"cmd_outer__page"});
    +"FinishChecking"==this.getElement().getAttribute("title-cmd")&&b.config.wsc_onFinish.call(CKEDITOR.document.getWindow().getFrame())},d="file:"==document.location.protocol?"http:":document.location.protocol,e=CKEDITOR.config.wsc_customLoaderScript||d+"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid="+CKEDITOR.config.wsc_customerId+"&cmd=script&doc=wsc&schema=22";return{title:b.config.wsc_dialogTitle||b.lang.wsc.title,minWidth:560,minHeight:444,buttons:[CKEDITOR.dialog.cancelButton],
    +onShow:function(){a.dialog=this;a.TextAreaNumber="cke_textarea_"+CKEDITOR.currentInstance.name;f.postMessage.init(x);a.dataTemp=CKEDITOR.currentInstance.getData();a.OverlayPlace=a.dialog.parts.tabs.getParent().$;CKEDITOR.scriptLoader.load(e,function(c){CKEDITOR.config&&CKEDITOR.config.wsc&&CKEDITOR.config.wsc.DefaultParams?(a.serverLocationHash=CKEDITOR.config.wsc.DefaultParams.serviceHost,a.logotype=CKEDITOR.config.wsc.DefaultParams.logoPath,a.loadIcon=CKEDITOR.config.wsc.DefaultParams.iconPath,
    +a.loadIconEmptyEditor=CKEDITOR.config.wsc.DefaultParams.iconPathEmptyEditor,a.LangComparer=new CKEDITOR.config.wsc.DefaultParams._SP_FCK_LangCompare):(a.serverLocationHash=DefaultParams.serviceHost,a.logotype=DefaultParams.logoPath,a.loadIcon=DefaultParams.iconPath,a.loadIconEmptyEditor=DefaultParams.iconPathEmptyEditor,a.LangComparer=new _SP_FCK_LangCompare);a.pluginPath=CKEDITOR.getUrl(b.plugins.wsc.path);a.iframeNumber=a.TextAreaNumber;a.serverLocation="#server="+a.serverLocationHash;a.templatePath=
    +a.pluginPath+"dialogs/tmp.html";a.LangComparer.setDefaulLangCode(a.defaultLanguage);a.currentLang=b.config.wsc_lang||a.LangComparer.getSPLangCode(b.langCode);a.div_overlay=new l({opacity:"1",background:"#fff url("+a.loadIcon+") no-repeat 50% 50%",target:a.OverlayPlace});var d=CKEDITOR.document.getById("cke_dialog_tabs_"+(a.CKNumber+1));d.setStyle("width","97%");d.getElementsByTag("DIV").count()||d.append(a.buildSelectLang());a.div_overlay_no_check=new l({opacity:"1",id:"no_check_over",background:"#fff url("+
    +a.loadIconEmptyEditor+") no-repeat 50% 50%",target:a.OverlayPlace});c&&(y(a.dialog),a.dialog.setupContent(a.dialog))})},onHide:function(){a.dataTemp=""},contents:[{id:"SpellTab",label:"SpellChecker",accessKey:"S",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"<div></div>"},{type:"html",id:"Content",label:"spellContent",html:"",setup:function(b){var b=a.iframeNumber+"_"+b._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"hbox",id:"bottomGroup",
    +style:"width:560px; margin: 0 auto;",widths:["50%","50%"],children:[{type:"hbox",id:"leftCol",align:"left",width:"50%",children:[{type:"vbox",id:"rightCol1",widths:["50%","50%"],children:[{type:"text",id:"text",label:a.LocalizationLabel.ChangeTo.text+":",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",width:"140px","default":"",onShow:function(){a.textNode.SpellTab=this;a.LocalizationLabel.ChangeTo.instance=this},onHide:function(){this.reset()}},{type:"hbox",id:"rightCol",
    +align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"text",id:"labelSuggestions",label:a.LocalizationLabel.Suggestions.text+":",onShow:function(){a.LocalizationLabel.Suggestions.instance=this;this.getInputElement().hide()}},{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"left"})}}]},
    +{type:"select",id:"list_of_suggestions",labelStyle:"font: 12px/25px arial, sans-serif;",size:"6",inputStyle:"width: 140px; height: auto;",items:[["loading..."]],onShow:function(){k=this},onHide:function(){this.clear()},onChange:function(){a.textNode.SpellTab.setValue(this.getValue())}}]}]}]},{type:"hbox",id:"rightCol",align:"right",width:"50%",children:[{type:"vbox",id:"rightCol_col__left",widths:["50%","50%","50%","50%"],children:[{type:"button",id:"ChangeTo",label:a.LocalizationButton.ChangeTo.text,
    +title:"Change to",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeTo.instance=this},onClick:c},{type:"button",id:"ChangeAll",label:a.LocalizationButton.ChangeAll.text,title:"Change All",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeAll.instance=this},onClick:c},{type:"button",id:"AddWord",label:a.LocalizationButton.AddWord.text,title:"Add word",style:"width: 100%;",
    +onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.AddWord.instance=this},onClick:c},{type:"button",id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text,title:"Finish Checking",style:"width: 100%;margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.FinishChecking.instance=this},onClick:c}]},{type:"vbox",id:"rightCol_col__right",widths:["50%","50%","50%"],children:[{type:"button",id:"IgnoreWord",
    +label:a.LocalizationButton.IgnoreWord.text,title:"Ignore word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.IgnoreWord.instance=this},onClick:c},{type:"button",id:"IgnoreAllWords",label:a.LocalizationButton.IgnoreAllWords.text,title:"Ignore all words",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.IgnoreAllWords.instance=this},onClick:c},{type:"button",id:"option",label:a.LocalizationButton.Options.text,
    +title:"Option",style:"width: 100%;",onLoad:function(){a.LocalizationButton.Options.instance=this;"file:"==document.location.protocol&&this.disable()},onClick:function(){"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):b.openDialog("options")}}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().hide()},onHide:i,children:[{type:"hbox",id:"leftCol",align:"left",
    +width:"70%",children:[{type:"vbox",id:"rightCol1",setup:function(){this.getChild()[0].getElement().$.src=a.logotype;this.getChild()[0].getElement().getParent().setStyles({"text-align":"center"})},children:[{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">'}]}]},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"Option_button",
    +label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);"file:"==document.location.protocol&&this.disable()},onClick:function(){"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):b.openDialog("options")}},{type:"button",id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text,title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",
    +this.id)},onClick:c}]}]}]}]},{id:"GrammTab",label:"Grammar",accessKey:"G",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"<div></div>"},{type:"html",id:"Content",label:"GrammarContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"vbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;",children:[{type:"hbox",id:"leftCol",widths:["66%","34%"],children:[{type:"vbox",children:[{type:"text",
    +id:"text",label:"Change to:",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",inputStyle:"float: right; width: 200px;","default":"",onShow:function(){a.textNode.GrammTab=this},onHide:function(){this.reset()}},{type:"html",id:"html_text",html:"<div style='min-height: 17px; line-height: 17px; padding: 5px; text-align: left;background: #F1F1F1;color: #595959; white-space: normal!important;'></div>",onShow:function(){a.textNodeInfo.GrammTab=this}},{type:"html",id:"radio",html:"",
    +onShow:function(){a.grammerSuggest=this}}]},{type:"vbox",children:[{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"IgnoreWord",label:"Ignore word",title:"Ignore word",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"IgnoreAllWords",label:"Ignore Problem",title:"Ignore Problem",
    +style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 133px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().hide()},onHide:i,children:[{type:"hbox",
    +id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking",
    +label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"Thesaurus",label:"Thesaurus",accessKey:"T",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"<div></div>"},{type:"html",id:"Content",label:"spellContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"vbox",id:"bottomGroup",
    +style:"width:560px; margin: 0 auto;",children:[{type:"hbox",widths:["75%","25%"],children:[{type:"vbox",children:[{type:"hbox",widths:["65%","35%"],children:[{type:"text",id:"ChangeTo",label:"Change to:",labelLayout:"horizontal",inputStyle:"width: 160px;",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onShow:function(){a.textNode.Thesaurus=this},onHide:function(){this.reset()}},{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 121px; margin-top: 1px;",onLoad:function(){this.getElement().setAttribute("title-cmd",
    +this.id)},onClick:c}]},{type:"hbox",children:[{type:"select",id:"categories",label:"Categories:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.categories=this},onHide:function(){this.clear()},onChange:function(){a.buildOptionSynonyms(this.getValue())}},{type:"select",id:"synonyms",label:"Synonyms:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.synonyms=
    +this;a.textNode.Thesaurus.setValue(this.getValue())},onHide:function(){this.clear()},onChange:function(){a.textNode.Thesaurus.setValue(this.getValue())}}]}]},{type:"vbox",width:"120px",style:"margin-top:46px;",children:[{type:"html",id:"logotype",label:"WebSpellChecker.net",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}},
    +{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 121px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().hide()},children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',
    +setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]}]}});CKEDITOR.dialog.add("options",function(){var b=null,c={},d={},e=null,g=
    +null;f.cookie.get("udn");f.cookie.get("osp");var h=function(){g=this.getElement().getAttribute("title-cmd");var a=[];a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");f.cookie.set("osp",a);f.cookie.set("udnCmd",g?g:"ignore");"delete"!=g&&(a="",""!==j.getValue()&&(a=j.getValue()),f.cookie.set("udn",a));f.postMessage.send({id:"options_dic_send"})},i=function(){e.getElement().setHtml(a.LocalizationComing.error);e.getElement().show()};
    +return{title:a.LocalizationComing.Options,minWidth:430,minHeight:130,resizable:CKEDITOR.DIALOG_RESIZE_NONE,contents:[{id:"OptionsTab",label:"Options",accessKey:"O",elements:[{type:"hbox",id:"options_error",children:[{type:"html",style:"display: block;text-align: center;white-space: normal!important; font-size: 12px;color:red",html:"<div></div>",onShow:function(){e=this}}]},{type:"vbox",id:"Options_content",children:[{type:"hbox",id:"Options_manager",widths:["52%","48%"],children:[{type:"fieldset",
    +label:"Spell Checking Options",style:"border: none;margin-top: 13px;padding: 10px 0 10px 10px",onShow:function(){this.getInputElement().$.children[0].innerHTML=a.LocalizationComing.SpellCheckingOptions},children:[{type:"vbox",id:"Options_checkbox",children:[{type:"checkbox",id:"IgnoreAllCapsWords",label:"Ignore All-Caps Words",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=
    +!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreWordsNumbers",label:"Ignore Words with Numbers",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreMixedCaseWords",label:"Ignore Mixed-Case Words",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;",
    +"default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreDomainNames",label:"Ignore Domain Names",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}}]}]},{type:"vbox",id:"Options_DictionaryName",children:[{type:"text",id:"DictionaryName",style:"margin-bottom: 10px",label:"Dictionary Name:",labelLayout:"vertical",
    +labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onLoad:function(){j=this;this.setValue(a.userDictionaryName?a.userDictionaryName:(f.cookie.get("udn"),this.getValue()))},onShow:function(){j=this;this.setValue(!f.cookie.get("udn")?this.getValue():f.cookie.get("udn"));this.setLabel(a.LocalizationComing.DictionaryName)},onHide:function(){this.reset()}},{type:"hbox",id:"Options_buttons",children:[{type:"vbox",id:"Options_leftCol_col",widths:["50%","50%"],children:[{type:"button",id:"create",
    +label:"Create",title:"Create",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Create)},onClick:h},{type:"button",id:"restore",label:"Restore",title:"Restore",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Restore)},onClick:h}]},{type:"vbox",id:"Options_rightCol_col",widths:["50%","50%"],
    +children:[{type:"button",id:"rename",label:"Rename",title:"Rename",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Rename)},onClick:h},{type:"button",id:"delete",label:"Remove",title:"Remove",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Remove)},onClick:h}]}]}]}]},{type:"hbox",id:"Options_text",
    +children:[{type:"html",style:"text-align: justify;margin-top: 15px;white-space: normal!important; font-size: 12px;color:#777;",html:"<div>"+a.LocalizationComing.OptionsTextIntro+"</div>",onShow:function(){this.getElement().setText(a.LocalizationComing.OptionsTextIntro)}}]}]}]}],buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton],onOk:function(){var a=[];a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,
    +"");f.cookie.set("osp",a);f.cookie.set("udn",j.getValue());f.postMessage.send({id:"options_checkbox_send"});e.getElement().hide();e.getElement().setHtml(" ")},onLoad:function(){b=this;f.postMessage.init(i);c.IgnoreAllCapsWords=b.getContentElement("OptionsTab","IgnoreAllCapsWords");c.IgnoreWordsNumbers=b.getContentElement("OptionsTab","IgnoreWordsNumbers");c.IgnoreMixedCaseWords=b.getContentElement("OptionsTab","IgnoreMixedCaseWords");c.IgnoreDomainNames=b.getContentElement("OptionsTab","IgnoreDomainNames")},
    +onShow:function(){var b=f.cookie.get("osp").split("");d.IgnoreAllCapsWords=b[0];d.IgnoreWordsNumbers=b[1];d.IgnoreMixedCaseWords=b[2];d.IgnoreDomainNames=b[3];!parseInt(d.IgnoreAllCapsWords,10)?c.IgnoreAllCapsWords.setValue("",!1):c.IgnoreAllCapsWords.setValue("checked",!1);!parseInt(d.IgnoreWordsNumbers,10)?c.IgnoreWordsNumbers.setValue("",!1):c.IgnoreWordsNumbers.setValue("checked",!1);!parseInt(d.IgnoreMixedCaseWords,10)?c.IgnoreMixedCaseWords.setValue("",!1):c.IgnoreMixedCaseWords.setValue("checked",
    +!1);!parseInt(d.IgnoreDomainNames,10)?c.IgnoreDomainNames.setValue("",!1):c.IgnoreDomainNames.setValue("checked",!1);d.IgnoreAllCapsWords=!c.IgnoreAllCapsWords.getValue()?0:1;d.IgnoreWordsNumbers=!c.IgnoreWordsNumbers.getValue()?0:1;d.IgnoreMixedCaseWords=!c.IgnoreMixedCaseWords.getValue()?0:1;d.IgnoreDomainNames=!c.IgnoreDomainNames.getValue()?0:1;c.IgnoreAllCapsWords.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreAllCapsWords;c.IgnoreWordsNumbers.getElement().$.lastChild.innerHTML=
    +a.LocalizationComing.IgnoreWordsWithNumbers;c.IgnoreMixedCaseWords.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreMixedCaseWords;c.IgnoreDomainNames.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreDomainNames}}});CKEDITOR.dialog.on("resize",function(b){var b=b.data,c=b.dialog,d=CKEDITOR.document.getById(a.iframeNumber+"_"+c._.currentTabId);"checkspell"==c._.name&&(a.bnr?d&&d.setSize("height",b.height-310):d&&d.setSize("height",b.height-220))});CKEDITOR.on("dialogDefinition",
    +function(b){var c=b.data.definition;a.onLoadOverlay=new l({opacity:"1",background:"#fff",target:c.dialog.parts.tabs.getParent().$});a.onLoadOverlay.setEnable();c.dialog.on("show",function(){});c.dialog.on("cancel",function(){c.dialog.getParentEditor().config.wsc_onClose.call(this.document.getWindow().getFrame());a.div_overlay.setDisable();return!1},this,null,-1)})})();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/wsc_ie.js b/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/wsc_ie.js
    new file mode 100644
    index 00000000..6b39b006
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/plugins/wsc/dialogs/wsc_ie.js
    @@ -0,0 +1,11 @@
    +锘/*
    + Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.dialog.add("checkspell",function(a){function c(a,c){var d=0;return function(){"function"==typeof window.doSpell?("undefined"!=typeof e&&window.clearInterval(e),j(a)):180==d++&&window._cancelOnError(c)}}function j(c){var f=new window._SP_FCK_LangCompare,b=CKEDITOR.getUrl(a.plugins.wsc.path+"dialogs/"),e=b+"tmpFrameset.html";window.gFCKPluginName="wsc";f.setDefaulLangCode(a.config.defaultLanguage);window.doSpell({ctrl:g,lang:a.config.wsc_lang||f.getSPLangCode(a.langCode),intLang:a.config.wsc_uiLang||
    +f.getSPLangCode(a.langCode),winType:d,onCancel:function(){c.hide()},onFinish:function(b){a.focus();c.getParentEditor().setData(b.value);c.hide()},staticFrame:e,framesetPath:e,iframePath:b+"ciframe.html",schemaURI:b+"wsc.css",userDictionaryName:a.config.wsc_userDictionaryName,customDictionaryName:a.config.wsc_customDictionaryIds&&a.config.wsc_customDictionaryIds.split(","),domainName:a.config.wsc_domainName});CKEDITOR.document.getById(h).setStyle("display","none");CKEDITOR.document.getById(d).setStyle("display",
    +"block")}var b=CKEDITOR.tools.getNextNumber(),d="cke_frame_"+b,g="cke_data_"+b,h="cke_error_"+b,e,b=document.location.protocol||"http:",i=a.lang.wsc.notAvailable,k='<textarea style="display: none" id="'+g+'" rows="10" cols="40"> </textarea><div id="'+h+'" style="display:none;color:red;font-size:16px;font-weight:bold;padding-top:160px;text-align:center;z-index:11;"></div><iframe src="" style="width:100%;background-color:#f1f1e3;" frameborder="0" name="'+d+'" id="'+d+'" allowtransparency="1"></iframe>',
    +l=a.config.wsc_customLoaderScript||b+"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid="+a.config.wsc_customerId+"&cmd=script&doc=wsc&schema=22";a.config.wsc_customLoaderScript&&(i+='<p style="color:#000;font-size:11px;font-weight: normal;text-align:center;padding-top:10px">'+a.lang.wsc.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+"</p>");window._cancelOnError=function(c){if("undefined"==typeof window.WSC_Error){CKEDITOR.document.getById(d).setStyle("display",
    +"none");var b=CKEDITOR.document.getById(h);b.setStyle("display","block");b.setHtml(c||a.lang.wsc.notAvailable)}};return{title:a.config.wsc_dialogTitle||a.lang.wsc.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var b=this.getContentElement("general","content").getElement();b.setHtml(k);b.getChild(2).setStyle("height",this._.contentSize.height+"px");"function"!=typeof window.doSpell&&CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script",
    +{attributes:{type:"text/javascript",src:l}}));b=a.getData();CKEDITOR.document.getById(g).setValue(b);e=window.setInterval(c(this,i),250)},onHide:function(){window.ooo=void 0;window.int_framsetLoaded=void 0;window.framesetLoaded=void 0;window.is_window_opened=!1},contents:[{id:"general",label:a.config.wsc_dialogTitle||a.lang.wsc.title,padding:0,elements:[{type:"html",id:"content",html:""}]}]}});
    +CKEDITOR.dialog.on("resize",function(a){var a=a.data,c=a.dialog;"checkspell"==c._.name&&((c=(c=c.getContentElement("general","content").getElement())&&c.getChild(2))&&c.setSize("height",a.height),c&&c.setSize("width",a.width))});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/dialog.css b/src/main/webapp/plug-in/ckeditor/skins/moono/dialog.css
    new file mode 100644
    index 00000000..46162af1
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/dialog.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_ie.css b/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_ie.css
    new file mode 100644
    index 00000000..858bb7ec
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_ie.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_ie7.css b/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_ie7.css
    new file mode 100644
    index 00000000..a53e4b0f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_ie7.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_ie8.css b/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_ie8.css
    new file mode 100644
    index 00000000..5f2b5b81
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_ie8.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_iequirks.css b/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_iequirks.css
    new file mode 100644
    index 00000000..faab95b5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_iequirks.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_opera.css b/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_opera.css
    new file mode 100644
    index 00000000..13f93c6c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/dialog_opera.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_footer{display:block;height:38px}.cke_ltr .cke_dialog_footer>*{float:right}.cke_rtl .cke_dialog_footer>*{float:left}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/editor.css b/src/main/webapp/plug-in/ckeditor/skins/moono/editor.css
    new file mode 100644
    index 00000000..b78f3e48
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/editor.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/editor_gecko.css b/src/main/webapp/plug-in/ckeditor/skins/moono/editor_gecko.css
    new file mode 100644
    index 00000000..a737b2a0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/editor_gecko.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/editor_ie.css b/src/main/webapp/plug-in/ckeditor/skins/moono/editor_ie.css
    new file mode 100644
    index 00000000..548e7b76
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/editor_ie.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/editor_ie7.css b/src/main/webapp/plug-in/ckeditor/skins/moono/editor_ie7.css
    new file mode 100644
    index 00000000..09633d4a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/editor_ie7.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/editor_ie8.css b/src/main/webapp/plug-in/ckeditor/skins/moono/editor_ie8.css
    new file mode 100644
    index 00000000..58c3f04e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/editor_ie8.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/editor_iequirks.css b/src/main/webapp/plug-in/ckeditor/skins/moono/editor_iequirks.css
    new file mode 100644
    index 00000000..4be31d1b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/editor_iequirks.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/icons.png b/src/main/webapp/plug-in/ckeditor/skins/moono/icons.png
    new file mode 100644
    index 00000000..a7b73858
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono/icons.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/images/arrow.png b/src/main/webapp/plug-in/ckeditor/skins/moono/images/arrow.png
    new file mode 100644
    index 00000000..0d1eb39c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono/images/arrow.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/images/close.png b/src/main/webapp/plug-in/ckeditor/skins/moono/images/close.png
    new file mode 100644
    index 00000000..a795fd52
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono/images/close.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/images/mini.png b/src/main/webapp/plug-in/ckeditor/skins/moono/images/mini.png
    new file mode 100644
    index 00000000..3e65bd5b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono/images/mini.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono/readme.md b/src/main/webapp/plug-in/ckeditor/skins/moono/readme.md
    new file mode 100644
    index 00000000..f24ec4f5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono/readme.md
    @@ -0,0 +1,51 @@
    +"Moono" Skin
    +====================
    +
    +This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor
    +[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by
    +the CKEditor team. "Moono" is maintained by the core developers.
    +
    +For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK)
    +documentation.
    +
    +Features
    +-------------------
    +"Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency.
    +It comes with the following features:
    +
    +- Chameleon feature with brightness,
    +- high-contrast compatibility,
    +- graphics source provided in SVG.
    +
    +Directory Structure
    +-------------------
    +
    +CSS parts:
    +- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance,
    +- **mainui.css**: the file contains styles of entire editor outline structures,
    +- **toolbar.css**: the file contains styles of the editor toolbar space (top),
    +- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar,
    +- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded
    +until the first panel open up,
    +- **elementspath.css**: the file contains styles of the editor elements path bar (bottom),
    +- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down,
    +it's not loaded until the first menu open up,
    +- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open,
    +- **reset.css**: the file defines the basis of style resets among all editor UI spaces,
    +- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference,
    +- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks.
    +
    +Other parts:
    +- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature,
    +- **icons/**: contains all skin defined icons,
    +- **images/**: contains a fill general used images,
    +- **dev/**: contains SVG source of the skin icons.
    +
    +License
    +-------
    +
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +
    +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
    +
    +See LICENSE.md for more information.
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog.css b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog.css
    new file mode 100644
    index 00000000..0273da44
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#EFEFFF;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#CFCFFF));background-image:-moz-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-webkit-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-o-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-ms-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:linear-gradient(top,#f5f5f5,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#CFCFFF')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#EFEFFF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-webkit-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-o-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-ms-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:linear-gradient(top,#EFEFFF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#EFEFFF',endColorstr='#CFCFFF')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#EFEFFF;background:-moz-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#EFEFFF),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-o-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:linear-gradient(to bottom,#EFEFFF 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#EFEFFF',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#EFEFFF}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_ie.css b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_ie.css
    new file mode 100644
    index 00000000..0273da44
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_ie.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#EFEFFF;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#CFCFFF));background-image:-moz-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-webkit-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-o-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-ms-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:linear-gradient(top,#f5f5f5,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#CFCFFF')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#EFEFFF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-webkit-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-o-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-ms-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:linear-gradient(top,#EFEFFF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#EFEFFF',endColorstr='#CFCFFF')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#EFEFFF;background:-moz-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#EFEFFF),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-o-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:linear-gradient(to bottom,#EFEFFF 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#EFEFFF',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#EFEFFF}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_ie7.css b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_ie7.css
    new file mode 100644
    index 00000000..0273da44
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_ie7.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#EFEFFF;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#CFCFFF));background-image:-moz-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-webkit-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-o-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-ms-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:linear-gradient(top,#f5f5f5,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#CFCFFF')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#EFEFFF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-webkit-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-o-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-ms-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:linear-gradient(top,#EFEFFF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#EFEFFF',endColorstr='#CFCFFF')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#EFEFFF;background:-moz-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#EFEFFF),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-o-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:linear-gradient(to bottom,#EFEFFF 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#EFEFFF',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#EFEFFF}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_ie8.css b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_ie8.css
    new file mode 100644
    index 00000000..0273da44
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_ie8.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#EFEFFF;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#CFCFFF));background-image:-moz-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-webkit-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-o-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-ms-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:linear-gradient(top,#f5f5f5,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#CFCFFF')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#EFEFFF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-webkit-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-o-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-ms-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:linear-gradient(top,#EFEFFF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#EFEFFF',endColorstr='#CFCFFF')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#EFEFFF;background:-moz-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#EFEFFF),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-o-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:linear-gradient(to bottom,#EFEFFF 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#EFEFFF',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#EFEFFF}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_iequirks.css b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_iequirks.css
    new file mode 100644
    index 00000000..0273da44
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_iequirks.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#EFEFFF;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#CFCFFF));background-image:-moz-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-webkit-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-o-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-ms-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:linear-gradient(top,#f5f5f5,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#CFCFFF')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#EFEFFF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-webkit-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-o-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-ms-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:linear-gradient(top,#EFEFFF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#EFEFFF',endColorstr='#CFCFFF')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#EFEFFF;background:-moz-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#EFEFFF),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-o-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:linear-gradient(to bottom,#EFEFFF 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#EFEFFF',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#EFEFFF}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_opera.css b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_opera.css
    new file mode 100644
    index 00000000..0273da44
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/dialog_opera.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#EFEFFF;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#CFCFFF));background-image:-moz-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-webkit-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-o-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:-ms-linear-gradient(top,#f5f5f5,#CFCFFF);background-image:linear-gradient(top,#f5f5f5,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#CFCFFF')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#EFEFFF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-webkit-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-o-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:-ms-linear-gradient(top,#EFEFFF,#CFCFFF);background-image:linear-gradient(top,#EFEFFF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#EFEFFF',endColorstr='#CFCFFF')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#EFEFFF;background:-moz-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#EFEFFF),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-o-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#EFEFFF 0,#dfdfdf 100%);background:linear-gradient(to bottom,#EFEFFF 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#EFEFFF',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#EFEFFF}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor.css b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor.css
    new file mode 100644
    index 00000000..4be840d6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#F0F0FF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-webkit-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-o-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-ms-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:linear-gradient(top,#F0F0FF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#F0F0FF',endColorstr='#CFCFFF')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#CFCFFF));background-image:-moz-linear-gradient(top,#ebebeb,#CFCFFF);background-image:-webkit-linear-gradient(top,#ebebeb,#CFCFFF);background-image:-o-linear-gradient(top,#ebebeb,#CFCFFF);background-image:-ms-linear-gradient(top,#ebebeb,#CFCFFF);background-image:linear-gradient(top,#ebebeb,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#CFCFFF')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#F0F0FF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-webkit-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-o-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-ms-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:linear-gradient(top,#F0F0FF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#F0F0FF',endColorstr='#CFCFFF')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -32px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -64px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -128px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -160px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -224px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -256px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -320px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -352px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -416px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -448px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -512px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -544px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -608px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -640px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -704px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -736px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__icons_icon{background:url(icons.png) no-repeat 0 -800px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -2095px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -2127px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -2159px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -2191px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -2223px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -2255px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -2287px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -2319px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -2351px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -2383px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -2415px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -2447px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -2479px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -2511px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -2543px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -2575px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -2607px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -2639px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -2671px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -2703px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -2735px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -2767px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -2799px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -2831px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -2863px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -2895px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -2927px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -2959px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -2991px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -3023px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -3055px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -3087px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -3119px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -3151px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -3183px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -3215px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -3247px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -3279px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -3311px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -3343px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -3375px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -3407px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -3439px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -3471px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -3503px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -3535px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -3567px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -3599px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -3631px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -3663px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -3695px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -3727px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -3759px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -3791px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -3823px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -3855px!important}.cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -3887px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -3919px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -3951px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -3983px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -4015px!important}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_gecko.css b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_gecko.css
    new file mode 100644
    index 00000000..a8487b77
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_gecko.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#F0F0FF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-webkit-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-o-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-ms-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:linear-gradient(top,#F0F0FF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#F0F0FF',endColorstr='#CFCFFF')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#efefff),to(#CFCFFF));background-image:-moz-linear-gradient(top,#efefff,#CFCFFF);background-image:-webkit-linear-gradient(top,#efefff,#CFCFFF);background-image:-o-linear-gradient(top,#efefff,#CFCFFF);background-image:-ms-linear-gradient(top,#efefff,#CFCFFF);background-image:linear-gradient(top,#efefff,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#efefff',endColorstr='#CFCFFF')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#F0F0FF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-webkit-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-o-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-ms-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:linear-gradient(top,#F0F0FF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#F0F0FF',endColorstr='#CFCFFF')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -32px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -64px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -128px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -160px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -224px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -256px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -320px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -352px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -416px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -448px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -512px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -544px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -608px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -640px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -704px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -736px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__icons_icon{background:url(icons.png) no-repeat 0 -800px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -2095px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -2127px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -2159px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -2191px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -2223px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -2255px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -2287px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -2319px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -2351px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -2383px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -2415px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -2447px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -2479px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -2511px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -2543px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -2575px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -2607px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -2639px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -2671px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -2703px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -2735px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -2767px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -2799px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -2831px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -2863px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -2895px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -2927px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -2959px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -2991px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -3023px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -3055px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -3087px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -3119px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -3151px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -3183px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -3215px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -3247px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -3279px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -3311px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -3343px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -3375px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -3407px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -3439px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -3471px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -3503px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -3535px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -3567px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -3599px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -3631px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -3663px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -3695px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -3727px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -3759px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -3791px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -3823px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -3855px!important}.cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -3887px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -3919px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -3951px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -3983px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -4015px!important}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_ie.css b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_ie.css
    new file mode 100644
    index 00000000..a8487b77
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_ie.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#F0F0FF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-webkit-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-o-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-ms-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:linear-gradient(top,#F0F0FF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#F0F0FF',endColorstr='#CFCFFF')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#efefff),to(#CFCFFF));background-image:-moz-linear-gradient(top,#efefff,#CFCFFF);background-image:-webkit-linear-gradient(top,#efefff,#CFCFFF);background-image:-o-linear-gradient(top,#efefff,#CFCFFF);background-image:-ms-linear-gradient(top,#efefff,#CFCFFF);background-image:linear-gradient(top,#efefff,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#efefff',endColorstr='#CFCFFF')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#F0F0FF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-webkit-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-o-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-ms-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:linear-gradient(top,#F0F0FF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#F0F0FF',endColorstr='#CFCFFF')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -32px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -64px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -128px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -160px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -224px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -256px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -320px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -352px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -416px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -448px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -512px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -544px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -608px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -640px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -704px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -736px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__icons_icon{background:url(icons.png) no-repeat 0 -800px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -2095px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -2127px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -2159px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -2191px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -2223px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -2255px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -2287px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -2319px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -2351px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -2383px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -2415px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -2447px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -2479px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -2511px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -2543px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -2575px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -2607px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -2639px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -2671px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -2703px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -2735px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -2767px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -2799px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -2831px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -2863px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -2895px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -2927px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -2959px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -2991px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -3023px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -3055px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -3087px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -3119px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -3151px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -3183px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -3215px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -3247px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -3279px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -3311px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -3343px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -3375px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -3407px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -3439px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -3471px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -3503px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -3535px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -3567px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -3599px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -3631px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -3663px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -3695px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -3727px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -3759px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -3791px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -3823px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -3855px!important}.cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -3887px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -3919px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -3951px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -3983px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -4015px!important}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_ie7.css b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_ie7.css
    new file mode 100644
    index 00000000..a8487b77
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_ie7.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#F0F0FF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-webkit-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-o-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-ms-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:linear-gradient(top,#F0F0FF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#F0F0FF',endColorstr='#CFCFFF')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#efefff),to(#CFCFFF));background-image:-moz-linear-gradient(top,#efefff,#CFCFFF);background-image:-webkit-linear-gradient(top,#efefff,#CFCFFF);background-image:-o-linear-gradient(top,#efefff,#CFCFFF);background-image:-ms-linear-gradient(top,#efefff,#CFCFFF);background-image:linear-gradient(top,#efefff,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#efefff',endColorstr='#CFCFFF')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#F0F0FF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-webkit-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-o-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-ms-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:linear-gradient(top,#F0F0FF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#F0F0FF',endColorstr='#CFCFFF')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -32px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -64px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -128px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -160px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -224px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -256px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -320px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -352px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -416px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -448px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -512px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -544px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -608px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -640px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -704px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -736px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__icons_icon{background:url(icons.png) no-repeat 0 -800px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -2095px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -2127px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -2159px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -2191px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -2223px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -2255px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -2287px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -2319px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -2351px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -2383px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -2415px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -2447px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -2479px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -2511px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -2543px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -2575px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -2607px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -2639px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -2671px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -2703px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -2735px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -2767px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -2799px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -2831px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -2863px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -2895px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -2927px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -2959px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -2991px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -3023px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -3055px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -3087px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -3119px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -3151px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -3183px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -3215px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -3247px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -3279px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -3311px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -3343px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -3375px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -3407px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -3439px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -3471px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -3503px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -3535px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -3567px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -3599px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -3631px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -3663px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -3695px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -3727px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -3759px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -3791px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -3823px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -3855px!important}.cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -3887px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -3919px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -3951px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -3983px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -4015px!important}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_ie8.css b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_ie8.css
    new file mode 100644
    index 00000000..a8487b77
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_ie8.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#F0F0FF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-webkit-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-o-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-ms-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:linear-gradient(top,#F0F0FF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#F0F0FF',endColorstr='#CFCFFF')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#efefff),to(#CFCFFF));background-image:-moz-linear-gradient(top,#efefff,#CFCFFF);background-image:-webkit-linear-gradient(top,#efefff,#CFCFFF);background-image:-o-linear-gradient(top,#efefff,#CFCFFF);background-image:-ms-linear-gradient(top,#efefff,#CFCFFF);background-image:linear-gradient(top,#efefff,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#efefff',endColorstr='#CFCFFF')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#F0F0FF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-webkit-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-o-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-ms-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:linear-gradient(top,#F0F0FF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#F0F0FF',endColorstr='#CFCFFF')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -32px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -64px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -128px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -160px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -224px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -256px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -320px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -352px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -416px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -448px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -512px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -544px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -608px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -640px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -704px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -736px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__icons_icon{background:url(icons.png) no-repeat 0 -800px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -2095px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -2127px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -2159px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -2191px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -2223px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -2255px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -2287px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -2319px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -2351px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -2383px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -2415px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -2447px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -2479px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -2511px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -2543px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -2575px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -2607px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -2639px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -2671px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -2703px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -2735px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -2767px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -2799px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -2831px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -2863px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -2895px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -2927px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -2959px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -2991px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -3023px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -3055px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -3087px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -3119px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -3151px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -3183px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -3215px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -3247px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -3279px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -3311px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -3343px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -3375px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -3407px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -3439px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -3471px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -3503px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -3535px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -3567px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -3599px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -3631px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -3663px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -3695px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -3727px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -3759px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -3791px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -3823px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -3855px!important}.cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -3887px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -3919px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -3951px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -3983px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -4015px!important}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_iequirks.css b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_iequirks.css
    new file mode 100644
    index 00000000..a8487b77
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/editor_iequirks.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#F0F0FF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-webkit-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-o-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-ms-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:linear-gradient(top,#F0F0FF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#F0F0FF',endColorstr='#CFCFFF')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#efefff),to(#CFCFFF));background-image:-moz-linear-gradient(top,#efefff,#CFCFFF);background-image:-webkit-linear-gradient(top,#efefff,#CFCFFF);background-image:-o-linear-gradient(top,#efefff,#CFCFFF);background-image:-ms-linear-gradient(top,#efefff,#CFCFFF);background-image:linear-gradient(top,#efefff,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#efefff',endColorstr='#CFCFFF')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#CFCFFF;background-image:-webkit-gradient(linear,left top,left bottom,from(#F0F0FF),to(#CFCFFF));background-image:-moz-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-webkit-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-o-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:-ms-linear-gradient(top,#F0F0FF,#CFCFFF);background-image:linear-gradient(top,#F0F0FF,#CFCFFF);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#F0F0FF',endColorstr='#CFCFFF')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -32px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -64px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -128px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -160px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -224px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -256px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -320px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -352px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -416px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -448px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -512px!important}.cke_rtl .cke_button__docprops_icon,.cke_mixed_dir_content .cke_rtl .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -544px!important}.cke_ltr .cke_button__docprops_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -608px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -640px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -704px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -736px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__icons_icon{background:url(icons.png) no-repeat 0 -800px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -2095px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -2127px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -2159px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -2191px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -2223px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -2255px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -2287px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -2319px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -2351px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -2383px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -2415px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -2447px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -2479px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -2511px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -2543px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -2575px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -2607px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -2639px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -2671px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -2703px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -2735px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -2767px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -2799px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -2831px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -2863px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -2895px!important}.cke_button__placeholder_icon{background:url(icons.png) no-repeat 0 -2927px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -2959px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -2991px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -3023px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -3055px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -3087px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -3119px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -3151px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -3183px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -3215px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -3247px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -3279px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -3311px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -3343px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -3375px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -3407px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -3439px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -3471px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -3503px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -3535px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -3567px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -3599px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -3631px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -3663px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -3695px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -3727px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -3759px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -3791px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -3823px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -3855px!important}.cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -3887px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -3919px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -3951px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -3983px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -4015px!important}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons.png
    new file mode 100644
    index 00000000..534ee59f
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/about.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/about.png
    new file mode 100644
    index 00000000..f22c6c79
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/about.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/anchor-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/anchor-rtl.png
    new file mode 100644
    index 00000000..1a7faf18
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/anchor-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/anchor.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/anchor.png
    new file mode 100644
    index 00000000..973a518d
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/anchor.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bgcolor.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bgcolor.png
    new file mode 100644
    index 00000000..07074b72
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bgcolor.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bidiltr.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bidiltr.png
    new file mode 100644
    index 00000000..7f82bc65
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bidiltr.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bidirtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bidirtl.png
    new file mode 100644
    index 00000000..ca55b067
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bidirtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/blockquote.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/blockquote.png
    new file mode 100644
    index 00000000..0ab06d53
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/blockquote.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bold.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bold.png
    new file mode 100644
    index 00000000..583a622c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bold.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bulletedlist-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bulletedlist-rtl.png
    new file mode 100644
    index 00000000..ba0246e4
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bulletedlist-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bulletedlist.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bulletedlist.png
    new file mode 100644
    index 00000000..03b447e6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/bulletedlist.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/button.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/button.png
    new file mode 100644
    index 00000000..b3f337b4
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/button.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/checkbox.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/checkbox.png
    new file mode 100644
    index 00000000..688673a7
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/checkbox.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/copy-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/copy-rtl.png
    new file mode 100644
    index 00000000..ae2424ce
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/copy-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/copy.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/copy.png
    new file mode 100644
    index 00000000..44767028
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/copy.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/creatediv.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/creatediv.png
    new file mode 100644
    index 00000000..6d12d330
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/creatediv.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/cut-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/cut-rtl.png
    new file mode 100644
    index 00000000..1505e60d
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/cut-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/cut.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/cut.png
    new file mode 100644
    index 00000000..084196e5
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/cut.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/find-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/find-rtl.png
    new file mode 100644
    index 00000000..915ed67d
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/find-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/find.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/find.png
    new file mode 100644
    index 00000000..297c393c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/find.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/flash.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/flash.png
    new file mode 100644
    index 00000000..9332fb9e
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/flash.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/form.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/form.png
    new file mode 100644
    index 00000000..03ee6079
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/form.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/hiddenfield.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/hiddenfield.png
    new file mode 100644
    index 00000000..0b78e4ac
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/hiddenfield.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/horizontalrule.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/horizontalrule.png
    new file mode 100644
    index 00000000..eed81b38
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/horizontalrule.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/iframe.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/iframe.png
    new file mode 100644
    index 00000000..5a83d905
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/iframe.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/image.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/image.png
    new file mode 100644
    index 00000000..f1c3395e
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/image.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/imagebutton.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/imagebutton.png
    new file mode 100644
    index 00000000..b91f61ac
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/imagebutton.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/indent-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/indent-rtl.png
    new file mode 100644
    index 00000000..5935830c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/indent-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/indent.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/indent.png
    new file mode 100644
    index 00000000..f19d7783
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/indent.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/italic.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/italic.png
    new file mode 100644
    index 00000000..246f32a3
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/italic.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/justifyblock.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/justifyblock.png
    new file mode 100644
    index 00000000..70d09af3
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/justifyblock.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/justifycenter.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/justifycenter.png
    new file mode 100644
    index 00000000..2bf0477d
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/justifycenter.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/justifyleft.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/justifyleft.png
    new file mode 100644
    index 00000000..a2648bb8
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/justifyleft.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/justifyright.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/justifyright.png
    new file mode 100644
    index 00000000..20878b9f
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/justifyright.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/link.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/link.png
    new file mode 100644
    index 00000000..c72e039f
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/link.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/maximize.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/maximize.png
    new file mode 100644
    index 00000000..4bcbc495
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/maximize.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/newpage-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/newpage-rtl.png
    new file mode 100644
    index 00000000..8ad1f0f2
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/newpage-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/newpage.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/newpage.png
    new file mode 100644
    index 00000000..9735c675
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/newpage.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/numberedlist-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/numberedlist-rtl.png
    new file mode 100644
    index 00000000..0a146881
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/numberedlist-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/numberedlist.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/numberedlist.png
    new file mode 100644
    index 00000000..e2279cf8
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/numberedlist.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/outdent-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/outdent-rtl.png
    new file mode 100644
    index 00000000..c007a749
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/outdent-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/outdent.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/outdent.png
    new file mode 100644
    index 00000000..97add27b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/outdent.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pagebreak-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pagebreak-rtl.png
    new file mode 100644
    index 00000000..f3aa92e1
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pagebreak-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pagebreak.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pagebreak.png
    new file mode 100644
    index 00000000..f7bac7d5
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pagebreak.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/paste-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/paste-rtl.png
    new file mode 100644
    index 00000000..1957cfc7
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/paste-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/paste.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/paste.png
    new file mode 100644
    index 00000000..1f0a37cb
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/paste.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pastefromword-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pastefromword-rtl.png
    new file mode 100644
    index 00000000..5b618744
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pastefromword-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pastefromword.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pastefromword.png
    new file mode 100644
    index 00000000..94aa56e3
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pastefromword.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pastetext-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pastetext-rtl.png
    new file mode 100644
    index 00000000..18b14248
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pastetext-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pastetext.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pastetext.png
    new file mode 100644
    index 00000000..7b85e08f
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/pastetext.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/preview-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/preview-rtl.png
    new file mode 100644
    index 00000000..bc5861e9
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/preview-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/preview.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/preview.png
    new file mode 100644
    index 00000000..345131c7
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/preview.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/print.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/print.png
    new file mode 100644
    index 00000000..11ed56a1
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/print.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/radio.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/radio.png
    new file mode 100644
    index 00000000..64e1fc9b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/radio.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/redo-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/redo-rtl.png
    new file mode 100644
    index 00000000..0f8bf18a
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/redo-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/redo.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/redo.png
    new file mode 100644
    index 00000000..53db6fbc
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/redo.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/removeformat.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/removeformat.png
    new file mode 100644
    index 00000000..3473eb33
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/removeformat.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/replace.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/replace.png
    new file mode 100644
    index 00000000..d47bf3b8
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/replace.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/save.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/save.png
    new file mode 100644
    index 00000000..95130648
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/save.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/scayt.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/scayt.png
    new file mode 100644
    index 00000000..f207caae
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/scayt.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/select-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/select-rtl.png
    new file mode 100644
    index 00000000..bdeeaf3a
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/select-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/select.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/select.png
    new file mode 100644
    index 00000000..275d0171
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/select.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/selectall.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/selectall.png
    new file mode 100644
    index 00000000..ae65b5ef
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/selectall.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/showblocks-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/showblocks-rtl.png
    new file mode 100644
    index 00000000..154c99b5
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/showblocks-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/showblocks.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/showblocks.png
    new file mode 100644
    index 00000000..eff2affd
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/showblocks.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/smiley.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/smiley.png
    new file mode 100644
    index 00000000..fc76fca8
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/smiley.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/source-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/source-rtl.png
    new file mode 100644
    index 00000000..faaaba1e
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/source-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/source.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/source.png
    new file mode 100644
    index 00000000..98c7bab1
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/source.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/specialchar.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/specialchar.png
    new file mode 100644
    index 00000000..26e958b3
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/specialchar.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/spellchecker.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/spellchecker.png
    new file mode 100644
    index 00000000..f207caae
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/spellchecker.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/strike.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/strike.png
    new file mode 100644
    index 00000000..853240bc
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/strike.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/subscript.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/subscript.png
    new file mode 100644
    index 00000000..c614fef8
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/subscript.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/superscript.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/superscript.png
    new file mode 100644
    index 00000000..ecb97466
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/superscript.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/table.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/table.png
    new file mode 100644
    index 00000000..58904280
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/table.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/templates-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/templates-rtl.png
    new file mode 100644
    index 00000000..fdfa5d0c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/templates-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/templates.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/templates.png
    new file mode 100644
    index 00000000..3781b869
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/templates.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textarea-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textarea-rtl.png
    new file mode 100644
    index 00000000..135aa421
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textarea-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textarea.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textarea.png
    new file mode 100644
    index 00000000..aac1630b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textarea.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textcolor.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textcolor.png
    new file mode 100644
    index 00000000..64534089
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textcolor.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textfield-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textfield-rtl.png
    new file mode 100644
    index 00000000..bab07f3f
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textfield-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textfield.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textfield.png
    new file mode 100644
    index 00000000..d366d274
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/textfield.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/underline.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/underline.png
    new file mode 100644
    index 00000000..f3824536
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/underline.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/undo-rtl.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/undo-rtl.png
    new file mode 100644
    index 00000000..53db6fbc
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/undo-rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/undo.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/undo.png
    new file mode 100644
    index 00000000..0f8bf18a
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/undo.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/unlink.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/unlink.png
    new file mode 100644
    index 00000000..bb6b043c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/icons/unlink.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/arrow.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/arrow.png
    new file mode 100644
    index 00000000..7b3abfc9
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/arrow.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/close.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/close.png
    new file mode 100644
    index 00000000..704a6c21
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/close.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/hidpi/close.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/hidpi/close.png
    new file mode 100644
    index 00000000..4f6bf715
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/hidpi/close.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/hidpi/lock-open.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/hidpi/lock-open.png
    new file mode 100644
    index 00000000..a41677f9
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/hidpi/lock-open.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/hidpi/lock.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/hidpi/lock.png
    new file mode 100644
    index 00000000..9827c624
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/hidpi/lock.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/hidpi/refresh.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/hidpi/refresh.png
    new file mode 100644
    index 00000000..210f3063
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/hidpi/refresh.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/lock-open.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/lock-open.png
    new file mode 100644
    index 00000000..a5485278
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/lock-open.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/lock.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/lock.png
    new file mode 100644
    index 00000000..6a0e60d7
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/lock.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/refresh.png b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/refresh.png
    new file mode 100644
    index 00000000..627c0270
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/images/refresh.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/readme.md b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/readme.md
    new file mode 100644
    index 00000000..05c7eaaf
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/readme.md
    @@ -0,0 +1,49 @@
    +"Moono_blue" Skin
    +====================
    +
    +This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor
    +[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by
    +the CKEditor team. "Moono" is maintained by the core developers.
    +
    +For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK)
    +documentation.
    +
    +Features
    +-------------------
    +"Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency.
    +It comes with the following features:
    +
    +- Chameleon feature with brightness,
    +- high-contrast compatibility,
    +- graphics source provided in SVG.
    +
    +Directory Structure
    +-------------------
    +
    +CSS parts:
    +- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance,
    +- **mainui.css**: the file contains styles of entire editor outline structures,
    +- **toolbar.css**: the file contains styles of the editor toolbar space (top),
    +- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar,
    +- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded
    +until the first panel open up,
    +- **elementspath.css**: the file contains styles of the editor elements path bar (bottom),
    +- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down,
    +it's not loaded until the first menu open up,
    +- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open,
    +- **reset.css**: the file defines the basis of style resets among all editor UI spaces,
    +- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference,
    +- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks.
    +
    +Other parts:
    +- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature,
    +- **images/**: contains a fill general used images,
    +
    +License
    +-------
    +
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +
    +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
    +
    +See LICENSE.md for more information.
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moono_blue/skin.js b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/skin.js
    new file mode 100644
    index 00000000..64bcb03d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moono_blue/skin.js
    @@ -0,0 +1,10 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.md or http://ckeditor.com/license
    +*/
    +CKEDITOR.skin.name="Moono_blue";CKEDITOR.skin.ua_editor="ie,iequirks,ie7,ie8,gecko";CKEDITOR.skin.ua_dialog="ie,iequirks,ie7,ie8,opera";
    +CKEDITOR.skin.chameleon=function(){var b=function(){return function(b,e){for(var a=b.match(/[^#]./g),c=0;3>c;c++){var f=a,h=c,d;d=parseInt(a[c],16);d=("0"+(0>e?0|d*(1+e):0|d+(255-d)*e).toString(16)).slice(-2);f[h]=d}return"#"+a.join("")}}(),c=function(){var b=new CKEDITOR.template("background:#{to};background-image:-webkit-gradient(linear,lefttop,leftbottom,from({from}),to({to}));background-image:-moz-linear-gradient(top,{from},{to});background-image:-webkit-linear-gradient(top,{from},{to});background-image:-o-linear-gradient(top,{from},{to});background-image:-ms-linear-gradient(top,{from},{to});background-image:linear-gradient(top,{from},{to});filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='{from}',endColorstr='{to}');");return function(c,
    +a){return b.output({from:c,to:a})}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ {defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_bottom [{defaultGradient}border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [{defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [{defaultGradient}outline-color:{defaultBorder};border-top-color:{defaultBorder};] {id} .cke_dialog_tab [{lightGradient}border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [{mediumGradient}] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} .cke_toolgroup [{lightGradient}border-color:{defaultBorder};] {id} a.cke_button_off:hover, {id} a.cke_button_off:focus, {id} a.cke_button_off:active [{mediumGradient}] {id} .cke_button_on [{ckeButtonOn}] {id} .cke_toolbar_separator [background-color: {ckeToolbarSeparator};] {id} .cke_combo_button [border-color:{defaultBorder};{lightGradient}] {id} a.cke_combo_button:hover, {id} a.cke_combo_button:focus, {id} .cke_combo_on a.cke_combo_button [border-color:{defaultBorder};{mediumGradient}] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover, {id} a.cke_path_item:focus, {id} a.cke_path_item:active [background-color:{elementsPathBg};] {id}.cke_panel [border-color:{defaultBorder};] "),
    +panel:new CKEDITOR.template(".cke_panel_grouptitle [{lightGradient}border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:focus.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:focus.cke_colorauto, a:focus.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")};
    +return function(g,e){var a=g.uiColor,a={id:"."+g.id,defaultBorder:b(a,-0.1),defaultGradient:c(b(a,0.9),a),lightGradient:c(b(a,1),b(a,0.7)),mediumGradient:c(b(a,0.8),b(a,0.5)),ckeButtonOn:c(b(a,0.6),b(a,0.7)),ckeResizer:b(a,-0.4),ckeToolbarSeparator:b(a,0.5),ckeColorauto:b(a,0.8),dialogBody:b(a,0.7),dialogTabSelected:c("#FFFFFF","#FFFFFF"),dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-0.6),elementsPathBg:a,menubuttonIcon:b(a,0.5),menubuttonIconHover:b(a,0.3)};return f[e].output(a).replace(/\[/g,
    +"{").replace(/\]/g,"}")}}();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog.css b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog.css
    new file mode 100644
    index 00000000..8e295fa7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_ie.css b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_ie.css
    new file mode 100644
    index 00000000..18987e94
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_ie.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_ie7.css b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_ie7.css
    new file mode 100644
    index 00000000..05c17e2f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_ie7.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_ie8.css b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_ie8.css
    new file mode 100644
    index 00000000..cc1abfcb
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_ie8.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_iequirks.css b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_iequirks.css
    new file mode 100644
    index 00000000..25ebae64
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_iequirks.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_opera.css b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_opera.css
    new file mode 100644
    index 00000000..7c94f929
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/dialog_opera.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_footer{display:block;height:38px}.cke_ltr .cke_dialog_footer>*{float:right}.cke_rtl .cke_dialog_footer>*{float:left}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor.css b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor.css
    new file mode 100644
    index 00000000..b6c61a5b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -32px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -64px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -128px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -160px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -224px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -256px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -320px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -352px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -416px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -448px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -512px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -544px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -608px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -640px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -704px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -736px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -800px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -832px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -896px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -928px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -992px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -1024px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -1088px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1120px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1184px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1216px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1280px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1312px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1376px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1408px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1472px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1504px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1568px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1600px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -1664px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1696px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1760px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -1792px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1856px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1888px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1952px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1984px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -2048px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -2080px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -2144px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -2176px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -2240px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -2272px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -2304px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2336px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2368px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -2400px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -2432px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -2464px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2496px!important}.cke_ltr .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2528px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -2560px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2592px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2624px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -2656px!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -32px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -64px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -128px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -160px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -224px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -256px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -320px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -352px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -416px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -448px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -512px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -544px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -608px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -640px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -704px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -736px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -800px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -832px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -896px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -928px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -992px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1024px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1088px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1120px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -1184px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -1216px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1280px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1312px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1376px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1408px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1472px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1504px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1568px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1600px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1664px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1696px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1760px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1792px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1856px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1888px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1952px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1984px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -2048px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -2080px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -2112px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -2144px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -2176px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -2208px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -2240px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -2272px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -2304px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -2336px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -2368px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -2400px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -2432px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -2464px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -2496px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -2528px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -2560px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -2592px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -2624px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2656px !important;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_gecko.css b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_gecko.css
    new file mode 100644
    index 00000000..d435c7fc
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_gecko.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -32px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -64px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -128px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -160px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -224px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -256px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -320px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -352px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -416px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -448px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -512px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -544px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -608px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -640px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -704px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -736px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -800px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -832px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -896px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -928px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -992px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -1024px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -1088px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1120px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1184px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1216px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1280px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1312px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1376px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1408px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1472px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1504px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1568px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1600px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -1664px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1696px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1760px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -1792px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1856px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1888px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1952px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1984px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -2048px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -2080px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -2144px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -2176px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -2240px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -2272px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -2304px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2336px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2368px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -2400px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -2432px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -2464px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2496px!important}.cke_ltr .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2528px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -2560px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2592px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2624px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -2656px!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -32px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -64px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -128px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -160px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -224px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -256px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -320px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -352px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -416px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -448px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -512px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -544px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -608px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -640px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -704px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -736px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -800px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -832px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -896px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -928px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -992px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1024px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1088px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1120px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -1184px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -1216px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1280px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1312px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1376px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1408px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1472px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1504px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1568px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1600px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1664px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1696px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1760px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1792px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1856px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1888px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1952px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1984px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -2048px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -2080px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -2112px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -2144px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -2176px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -2208px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -2240px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -2272px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -2304px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -2336px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -2368px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -2400px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -2432px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -2464px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -2496px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -2528px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -2560px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -2592px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -2624px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2656px !important;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_ie.css b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_ie.css
    new file mode 100644
    index 00000000..155e5a04
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_ie.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -32px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -64px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -128px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -160px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -224px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -256px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -320px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -352px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -416px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -448px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -512px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -544px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -608px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -640px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -704px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -736px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -800px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -832px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -896px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -928px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -992px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -1024px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -1088px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1120px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1184px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1216px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1280px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1312px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1376px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1408px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1472px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1504px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1568px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1600px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -1664px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1696px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1760px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -1792px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1856px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1888px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1952px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1984px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -2048px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -2080px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -2144px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -2176px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -2240px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -2272px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -2304px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2336px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2368px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -2400px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -2432px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -2464px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2496px!important}.cke_ltr .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2528px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -2560px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2592px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2624px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -2656px!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -32px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -64px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -128px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -160px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -224px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -256px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -320px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -352px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -416px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -448px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -512px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -544px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -608px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -640px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -704px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -736px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -800px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -832px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -896px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -928px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -992px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1024px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1088px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1120px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -1184px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -1216px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1280px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1312px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1376px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1408px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1472px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1504px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1568px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1600px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1664px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1696px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1760px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1792px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1856px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1888px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1952px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1984px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -2048px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -2080px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -2112px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -2144px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -2176px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -2208px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -2240px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -2272px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -2304px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -2336px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -2368px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -2400px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -2432px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -2464px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -2496px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -2528px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -2560px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -2592px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -2624px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2656px !important;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_ie7.css b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_ie7.css
    new file mode 100644
    index 00000000..e953b950
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_ie7.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -32px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -64px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -128px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -160px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -224px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -256px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -320px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -352px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -416px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -448px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -512px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -544px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -608px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -640px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -704px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -736px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -800px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -832px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -896px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -928px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -992px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -1024px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -1088px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1120px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1184px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1216px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1280px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1312px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1376px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1408px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1472px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1504px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1568px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1600px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -1664px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1696px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1760px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -1792px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1856px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1888px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1952px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1984px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -2048px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -2080px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -2144px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -2176px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -2240px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -2272px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -2304px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2336px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2368px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -2400px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -2432px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -2464px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2496px!important}.cke_ltr .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2528px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -2560px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2592px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2624px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -2656px!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -32px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -64px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -128px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -160px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -224px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -256px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -320px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -352px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -416px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -448px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -512px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -544px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -608px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -640px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -704px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -736px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -800px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -832px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -896px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -928px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -992px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1024px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1088px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1120px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -1184px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -1216px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1280px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1312px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1376px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1408px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1472px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1504px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1568px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1600px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1664px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1696px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1760px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1792px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1856px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1888px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1952px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1984px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -2048px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -2080px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -2112px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -2144px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -2176px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -2208px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -2240px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -2272px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -2304px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -2336px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -2368px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -2400px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -2432px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -2464px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -2496px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -2528px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -2560px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -2592px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -2624px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2656px !important;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_ie8.css b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_ie8.css
    new file mode 100644
    index 00000000..407d4ced
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_ie8.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -32px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -64px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -128px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -160px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -224px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -256px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -320px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -352px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -416px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -448px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -512px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -544px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -608px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -640px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -704px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -736px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -800px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -832px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -896px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -928px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -992px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -1024px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -1088px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1120px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1184px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1216px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1280px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1312px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1376px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1408px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1472px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1504px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1568px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1600px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -1664px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1696px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1760px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -1792px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1856px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1888px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1952px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1984px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -2048px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -2080px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -2144px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -2176px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -2240px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -2272px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -2304px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2336px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2368px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -2400px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -2432px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -2464px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2496px!important}.cke_ltr .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2528px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -2560px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2592px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2624px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -2656px!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -32px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -64px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -128px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -160px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -224px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -256px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -320px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -352px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -416px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -448px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -512px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -544px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -608px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -640px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -704px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -736px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -800px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -832px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -896px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -928px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -992px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1024px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1088px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1120px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -1184px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -1216px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1280px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1312px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1376px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1408px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1472px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1504px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1568px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1600px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1664px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1696px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1760px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1792px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1856px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1888px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1952px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1984px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -2048px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -2080px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -2112px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -2144px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -2176px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -2208px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -2240px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -2272px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -2304px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -2336px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -2368px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -2400px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -2432px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -2464px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -2496px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -2528px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -2560px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -2592px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -2624px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2656px !important;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_iequirks.css b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_iequirks.css
    new file mode 100644
    index 00000000..f8c6d97c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/editor_iequirks.css
    @@ -0,0 +1,5 @@
    +/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon{background:url(icons.png) no-repeat 0 -0px!important}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -32px!important}.cke_ltr .cke_button__anchor_icon{background:url(icons.png) no-repeat 0 -64px!important}.cke_button__bgcolor_icon{background:url(icons.png) no-repeat 0 -96px!important}.cke_button__bidiltr_icon{background:url(icons.png) no-repeat 0 -128px!important}.cke_button__bidirtl_icon{background:url(icons.png) no-repeat 0 -160px!important}.cke_button__blockquote_icon{background:url(icons.png) no-repeat 0 -192px!important}.cke_button__bold_icon{background:url(icons.png) no-repeat 0 -224px!important}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -256px!important}.cke_ltr .cke_button__bulletedlist_icon{background:url(icons.png) no-repeat 0 -288px!important}.cke_button__button_icon{background:url(icons.png) no-repeat 0 -320px!important}.cke_button__checkbox_icon{background:url(icons.png) no-repeat 0 -352px!important}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -384px!important}.cke_ltr .cke_button__copy_icon{background:url(icons.png) no-repeat 0 -416px!important}.cke_button__creatediv_icon{background:url(icons.png) no-repeat 0 -448px!important}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -480px!important}.cke_ltr .cke_button__cut_icon{background:url(icons.png) no-repeat 0 -512px!important}.cke_rtl .cke_button__find_icon,.cke_mixed_dir_content .cke_rtl .cke_button__find_icon{background:url(icons.png) no-repeat 0 -544px!important}.cke_ltr .cke_button__find_icon{background:url(icons.png) no-repeat 0 -576px!important}.cke_button__flash_icon{background:url(icons.png) no-repeat 0 -608px!important}.cke_button__form_icon{background:url(icons.png) no-repeat 0 -640px!important}.cke_button__hiddenfield_icon{background:url(icons.png) no-repeat 0 -672px!important}.cke_button__horizontalrule_icon{background:url(icons.png) no-repeat 0 -704px!important}.cke_button__iframe_icon{background:url(icons.png) no-repeat 0 -736px!important}.cke_button__image_icon{background:url(icons.png) no-repeat 0 -768px!important}.cke_button__imagebutton_icon{background:url(icons.png) no-repeat 0 -800px!important}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -832px!important}.cke_ltr .cke_button__indent_icon{background:url(icons.png) no-repeat 0 -864px!important}.cke_button__italic_icon{background:url(icons.png) no-repeat 0 -896px!important}.cke_button__justifyblock_icon{background:url(icons.png) no-repeat 0 -928px!important}.cke_button__justifycenter_icon{background:url(icons.png) no-repeat 0 -960px!important}.cke_button__justifyleft_icon{background:url(icons.png) no-repeat 0 -992px!important}.cke_button__justifyright_icon{background:url(icons.png) no-repeat 0 -1024px!important}.cke_button__link_icon{background:url(icons.png) no-repeat 0 -1056px!important}.cke_button__maximize_icon{background:url(icons.png) no-repeat 0 -1088px!important}.cke_rtl .cke_button__newpage_icon,.cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1120px!important}.cke_ltr .cke_button__newpage_icon{background:url(icons.png) no-repeat 0 -1152px!important}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1184px!important}.cke_ltr .cke_button__numberedlist_icon{background:url(icons.png) no-repeat 0 -1216px!important}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1248px!important}.cke_ltr .cke_button__outdent_icon{background:url(icons.png) no-repeat 0 -1280px!important}.cke_rtl .cke_button__pagebreak_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1312px!important}.cke_ltr .cke_button__pagebreak_icon{background:url(icons.png) no-repeat 0 -1344px!important}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1376px!important}.cke_ltr .cke_button__paste_icon{background:url(icons.png) no-repeat 0 -1408px!important}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1440px!important}.cke_ltr .cke_button__pastefromword_icon{background:url(icons.png) no-repeat 0 -1472px!important}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1504px!important}.cke_ltr .cke_button__pastetext_icon{background:url(icons.png) no-repeat 0 -1536px!important}.cke_rtl .cke_button__preview_icon,.cke_mixed_dir_content .cke_rtl .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1568px!important}.cke_ltr .cke_button__preview_icon{background:url(icons.png) no-repeat 0 -1600px!important}.cke_button__print_icon{background:url(icons.png) no-repeat 0 -1632px!important}.cke_button__radio_icon{background:url(icons.png) no-repeat 0 -1664px!important}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1696px!important}.cke_ltr .cke_button__redo_icon{background:url(icons.png) no-repeat 0 -1728px!important}.cke_button__removeformat_icon{background:url(icons.png) no-repeat 0 -1760px!important}.cke_button__replace_icon{background:url(icons.png) no-repeat 0 -1792px!important}.cke_button__save_icon{background:url(icons.png) no-repeat 0 -1824px!important}.cke_button__scayt_icon{background:url(icons.png) no-repeat 0 -1856px!important}.cke_rtl .cke_button__select_icon,.cke_mixed_dir_content .cke_rtl .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1888px!important}.cke_ltr .cke_button__select_icon{background:url(icons.png) no-repeat 0 -1920px!important}.cke_button__selectall_icon{background:url(icons.png) no-repeat 0 -1952px!important}.cke_rtl .cke_button__showblocks_icon,.cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -1984px!important}.cke_ltr .cke_button__showblocks_icon{background:url(icons.png) no-repeat 0 -2016px!important}.cke_button__smiley_icon{background:url(icons.png) no-repeat 0 -2048px!important}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background:url(icons.png) no-repeat 0 -2080px!important}.cke_ltr .cke_button__source_icon{background:url(icons.png) no-repeat 0 -2112px!important}.cke_button__specialchar_icon{background:url(icons.png) no-repeat 0 -2144px!important}.cke_button__spellchecker_icon{background:url(icons.png) no-repeat 0 -2176px!important}.cke_button__strike_icon{background:url(icons.png) no-repeat 0 -2208px!important}.cke_button__subscript_icon{background:url(icons.png) no-repeat 0 -2240px!important}.cke_button__superscript_icon{background:url(icons.png) no-repeat 0 -2272px!important}.cke_button__table_icon{background:url(icons.png) no-repeat 0 -2304px!important}.cke_rtl .cke_button__templates_icon,.cke_mixed_dir_content .cke_rtl .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2336px!important}.cke_ltr .cke_button__templates_icon{background:url(icons.png) no-repeat 0 -2368px!important}.cke_rtl .cke_button__textarea_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -2400px!important}.cke_ltr .cke_button__textarea_icon{background:url(icons.png) no-repeat 0 -2432px!important}.cke_button__textcolor_icon{background:url(icons.png) no-repeat 0 -2464px!important}.cke_rtl .cke_button__textfield_icon,.cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2496px!important}.cke_ltr .cke_button__textfield_icon{background:url(icons.png) no-repeat 0 -2528px!important}.cke_button__underline_icon{background:url(icons.png) no-repeat 0 -2560px!important}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2592px!important}.cke_ltr .cke_button__undo_icon{background:url(icons.png) no-repeat 0 -2624px!important}.cke_button__unlink_icon{background:url(icons.png) no-repeat 0 -2656px!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -32px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -64px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -128px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -160px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -224px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -256px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -320px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -352px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -416px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -448px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -512px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -544px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -608px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -640px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -704px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -736px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -800px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -832px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -896px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -928px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -992px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -1024px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -1088px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1120px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -1184px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -1216px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1280px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -1312px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1376px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1408px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1472px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1504px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1568px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1600px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1664px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1696px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1760px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1792px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1856px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1888px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1952px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1984px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -2048px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -2080px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -2112px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -2144px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -2176px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -2208px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -2240px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -2272px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -2304px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -2336px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -2368px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -2400px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -2432px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -2464px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -2496px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -2528px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -2560px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -2592px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -2624px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2656px !important;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/icons.png b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/icons.png
    new file mode 100644
    index 00000000..308a5bb9
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/icons.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/icons_hidpi.png b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/icons_hidpi.png
    new file mode 100644
    index 00000000..ee310708
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/icons_hidpi.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/images/arrow.png b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/images/arrow.png
    new file mode 100644
    index 00000000..47b009a2
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/images/arrow.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/images/close.png b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/images/close.png
    new file mode 100644
    index 00000000..bff3b0c6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/images/close.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/images/mini.png b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/images/mini.png
    new file mode 100644
    index 00000000..f448a028
    Binary files /dev/null and b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/images/mini.png differ
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/readme.md b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/readme.md
    new file mode 100644
    index 00000000..f24ec4f5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/readme.md
    @@ -0,0 +1,51 @@
    +"Moono" Skin
    +====================
    +
    +This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor
    +[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by
    +the CKEditor team. "Moono" is maintained by the core developers.
    +
    +For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK)
    +documentation.
    +
    +Features
    +-------------------
    +"Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency.
    +It comes with the following features:
    +
    +- Chameleon feature with brightness,
    +- high-contrast compatibility,
    +- graphics source provided in SVG.
    +
    +Directory Structure
    +-------------------
    +
    +CSS parts:
    +- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance,
    +- **mainui.css**: the file contains styles of entire editor outline structures,
    +- **toolbar.css**: the file contains styles of the editor toolbar space (top),
    +- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar,
    +- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded
    +until the first panel open up,
    +- **elementspath.css**: the file contains styles of the editor elements path bar (bottom),
    +- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down,
    +it's not loaded until the first menu open up,
    +- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open,
    +- **reset.css**: the file defines the basis of style resets among all editor UI spaces,
    +- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference,
    +- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks.
    +
    +Other parts:
    +- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature,
    +- **icons/**: contains all skin defined icons,
    +- **images/**: contains a fill general used images,
    +- **dev/**: contains SVG source of the skin icons.
    +
    +License
    +-------
    +
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +
    +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
    +
    +See LICENSE.md for more information.
    diff --git a/src/main/webapp/plug-in/ckeditor/skins/moonocolor/skin.js b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/skin.js
    new file mode 100644
    index 00000000..ce765544
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/skins/moonocolor/skin.js
    @@ -0,0 +1,10 @@
    +锘/*
    + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +CKEDITOR.skin.name="moonocolor";CKEDITOR.skin.ua_editor="ie,iequirks,ie7,ie8,gecko";CKEDITOR.skin.ua_dialog="ie,iequirks,ie7,ie8,opera";
    +CKEDITOR.skin.chameleon=function(){var b=function(){return function(b,e){for(var a=b.match(/[^#]./g),c=0;3>c;c++){var f=a,h=c,d;d=parseInt(a[c],16);d=("0"+(0>e?0|d*(1+e):0|d+(255-d)*e).toString(16)).slice(-2);f[h]=d}return"#"+a.join("")}}(),c=function(){var b=new CKEDITOR.template("background:#{to};background-image:-webkit-gradient(linear,lefttop,leftbottom,from({from}),to({to}));background-image:-moz-linear-gradient(top,{from},{to});background-image:-webkit-linear-gradient(top,{from},{to});background-image:-o-linear-gradient(top,{from},{to});background-image:-ms-linear-gradient(top,{from},{to});background-image:linear-gradient(top,{from},{to});filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='{from}',endColorstr='{to}');");return function(c,
    +a){return b.output({from:c,to:a})}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ {defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_bottom [{defaultGradient}border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [{defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [{defaultGradient}outline-color:{defaultBorder};border-top-color:{defaultBorder};] {id} .cke_dialog_tab [{lightGradient}border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [{mediumGradient}] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} .cke_toolgroup [{lightGradient}border-color:{defaultBorder};] {id} a.cke_button_off:hover, {id} a.cke_button_off:focus, {id} a.cke_button_off:active [{mediumGradient}] {id} .cke_button_on [{ckeButtonOn}] {id} .cke_toolbar_separator [background-color: {ckeToolbarSeparator};] {id} .cke_combo_button [border-color:{defaultBorder};{lightGradient}] {id} a.cke_combo_button:hover, {id} a.cke_combo_button:focus, {id} .cke_combo_on a.cke_combo_button [border-color:{defaultBorder};{mediumGradient}] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover, {id} a.cke_path_item:focus, {id} a.cke_path_item:active [background-color:{elementsPathBg};] {id}.cke_panel [border-color:{defaultBorder};] "),
    +panel:new CKEDITOR.template(".cke_panel_grouptitle [{lightGradient}border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:focus.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:focus.cke_colorauto, a:focus.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")};
    +return function(g,e){var a=g.uiColor,a={id:"."+g.id,defaultBorder:b(a,-0.1),defaultGradient:c(b(a,0.9),a),lightGradient:c(b(a,1),b(a,0.7)),mediumGradient:c(b(a,0.8),b(a,0.5)),ckeButtonOn:c(b(a,0.6),b(a,0.7)),ckeResizer:b(a,-0.4),ckeToolbarSeparator:b(a,0.5),ckeColorauto:b(a,0.8),dialogBody:b(a,0.7),dialogTabSelected:c("#FFFFFF","#FFFFFF"),dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-0.6),elementsPathBg:a,menubuttonIcon:b(a,0.5),menubuttonIconHover:b(a,0.3)};return f[e].output(a).replace(/\[/g,
    +"{").replace(/\]/g,"}")}}();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckeditor/styles.js b/src/main/webapp/plug-in/ckeditor/styles.js
    new file mode 100644
    index 00000000..5eb7f1c3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckeditor/styles.js
    @@ -0,0 +1,111 @@
    +锘/**
    + * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + * For licensing, see LICENSE.html or http://ckeditor.com/license
    + */
    +
    +// This file contains style definitions that can be used by CKEditor plugins.
    +//
    +// The most common use for it is the "stylescombo" plugin, which shows a combo
    +// in the editor toolbar, containing all styles. Other plugins instead, like
    +// the div plugin, use a subset of the styles on their feature.
    +//
    +// If you don't have plugins that depend on this file, you can simply ignore it.
    +// Otherwise it is strongly recommended to customize this file to match your
    +// website requirements and design properly.
    +
    +CKEDITOR.stylesSet.add( 'default', [
    +	/* Block Styles */
    +
    +	// These styles are already available in the "Format" combo ("format" plugin),
    +	// so they are not needed here by default. You may enable them to avoid
    +	// placing the "Format" combo in the toolbar, maintaining the same features.
    +	/*
    +	{ name: 'Paragraph',		element: 'p' },
    +	{ name: 'Heading 1',		element: 'h1' },
    +	{ name: 'Heading 2',		element: 'h2' },
    +	{ name: 'Heading 3',		element: 'h3' },
    +	{ name: 'Heading 4',		element: 'h4' },
    +	{ name: 'Heading 5',		element: 'h5' },
    +	{ name: 'Heading 6',		element: 'h6' },
    +	{ name: 'Preformatted Text',element: 'pre' },
    +	{ name: 'Address',			element: 'address' },
    +	*/
    +
    +	{ name: 'Italic Title',		element: 'h2', styles: { 'font-style': 'italic' } },
    +	{ name: 'Subtitle',			element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } },
    +	{
    +		name: 'Special Container',
    +		element: 'div',
    +		styles: {
    +			padding: '5px 10px',
    +			background: '#eee',
    +			border: '1px solid #ccc'
    +		}
    +	},
    +
    +	/* Inline Styles */
    +
    +	// These are core styles available as toolbar buttons. You may opt enabling
    +	// some of them in the Styles combo, removing them from the toolbar.
    +	// (This requires the "stylescombo" plugin)
    +	/*
    +	{ name: 'Strong',			element: 'strong', overrides: 'b' },
    +	{ name: 'Emphasis',			element: 'em'	, overrides: 'i' },
    +	{ name: 'Underline',		element: 'u' },
    +	{ name: 'Strikethrough',	element: 'strike' },
    +	{ name: 'Subscript',		element: 'sub' },
    +	{ name: 'Superscript',		element: 'sup' },
    +	*/
    +
    +	{ name: 'Marker',			element: 'span', attributes: { 'class': 'marker' } },
    +
    +	{ name: 'Big',				element: 'big' },
    +	{ name: 'Small',			element: 'small' },
    +	{ name: 'Typewriter',		element: 'tt' },
    +
    +	{ name: 'Computer Code',	element: 'code' },
    +	{ name: 'Keyboard Phrase',	element: 'kbd' },
    +	{ name: 'Sample Text',		element: 'samp' },
    +	{ name: 'Variable',			element: 'var' },
    +
    +	{ name: 'Deleted Text',		element: 'del' },
    +	{ name: 'Inserted Text',	element: 'ins' },
    +
    +	{ name: 'Cited Work',		element: 'cite' },
    +	{ name: 'Inline Quotation',	element: 'q' },
    +
    +	{ name: 'Language: RTL',	element: 'span', attributes: { 'dir': 'rtl' } },
    +	{ name: 'Language: LTR',	element: 'span', attributes: { 'dir': 'ltr' } },
    +
    +	/* Object Styles */
    +
    +	{
    +		name: 'Styled image (left)',
    +		element: 'img',
    +		attributes: { 'class': 'left' }
    +	},
    +
    +	{
    +		name: 'Styled image (right)',
    +		element: 'img',
    +		attributes: { 'class': 'right' }
    +	},
    +
    +	{
    +		name: 'Compact table',
    +		element: 'table',
    +		attributes: {
    +			cellpadding: '5',
    +			cellspacing: '0',
    +			border: '1',
    +			bordercolor: '#ccc'
    +		},
    +		styles: {
    +			'border-collapse': 'collapse'
    +		}
    +	},
    +
    +	{ name: 'Borderless Table',		element: 'table',	styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } },
    +	{ name: 'Square Bulleted List',	element: 'ul',		styles: { 'list-style-type': 'square' } }
    +]);
    +
    diff --git a/src/main/webapp/plug-in/ckfinder/ckfinder.html b/src/main/webapp/plug-in/ckfinder/ckfinder.html
    new file mode 100644
    index 00000000..ef5d8a54
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/ckfinder.html
    @@ -0,0 +1,116 @@
    +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    +<html>
    +<head>
    +<title>CKFinder</title>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    +<meta name="robots" content="noindex, nofollow" />
    +<script type="text/javascript" src="ckfinder.js"></script>
    +<style type="text/css">
    +body,html,iframe,#ckfinder {
    +	margin: 0;
    +	padding: 0;
    +	border: 0;
    +	width: 100%;
    +	height: 100%;
    +	overflow: hidden;
    +}
    +</style>
    +</head>
    +<body class="CKFinderFrameWindow">
    +	<div id="ckfinder"></div>
    +	<script type="text/javascript">
    +		//<![CDATA[
    +		(function() {
    +			var config = {};
    +			var get = CKFinder.tools.getUrlParam;
    +			var getBool = function(v) {
    +				var t = get(v);
    +				if (t === null)
    +					return null;
    +				return t == '0' ? false : true;
    +			};
    +			var tmp;
    +			if (tmp = get('configId')) {
    +				var win = window.opener || window;
    +				try {
    +					while ((!win.CKFinder || !win.CKFinder._.instanceConfig[tmp])
    +							&& win != window.top)
    +						win = win.parent;
    +					if (win.CKFinder._.instanceConfig[tmp])
    +						config = CKFINDER.tools.extend({},
    +								win.CKFinder._.instanceConfig[tmp]);
    +				} catch (e) {
    +				}
    +			}
    +
    +			if (tmp = get('basePath'))
    +				CKFINDER.basePath = tmp;
    +			if (tmp = get('startupPath') || get('start'))
    +				config.startupPath = decodeURIComponent(tmp);
    +			config.id = get('id') || '';
    +			if ((tmp = getBool('rlf')) !== null)
    +				config.rememberLastFolder = tmp;
    +			if ((tmp = getBool('dts')) !== null)
    +				config.disableThumbnailSelection = tmp;
    +			if (tmp = get('data'))
    +				config.selectActionData = tmp;
    +			if (tmp = get('tdata'))
    +				config.selectThumbnailActionData = tmp;
    +			if (tmp = get('type'))
    +				config.resourceType = tmp;
    +			if (tmp = get('skin'))
    +				config.skin = tmp;
    +			if (tmp = get('langCode'))
    +				config.language = tmp;
    +			if (typeof (config.selectActionFunction) == 'undefined') {
    +				// Try to get desired "File Select" action from the URL.
    +				var action = '';
    +				if (tmp = get('CKEditor')) {
    +					if (tmp.length)
    +						action = 'ckeditor';
    +				}
    +				if (action == '')
    +					action = get('action');
    +				var parentWindow = (window.parent == window) ? window.opener
    +						: window.parent;
    +				switch (action) {
    +				case 'js':
    +					var actionFunction = get('func');
    +					if (actionFunction && actionFunction.length > 0)
    +						config.selectActionFunction = parentWindow[actionFunction];
    +
    +					actionFunction = get('thumbFunc');
    +					if (actionFunction && actionFunction.length > 0)
    +						config.selectThumbnailActionFunction = parentWindow[actionFunction];
    +					break;
    +				case 'ckeditor':
    +					var funcNum = get('CKEditorFuncNum');
    +					if (parentWindow['CKEDITOR']) {
    +						config.selectActionFunction = function(fileUrl, data) {
    +							parentWindow['CKEDITOR'].tools.callFunction(
    +									funcNum, fileUrl, data);
    +						};
    +						config.selectThumbnailActionFunction = config.selectActionFunction;
    +					}
    +					break;
    +				default:
    +					if (parentWindow && parentWindow['FCK']
    +							&& parentWindow['SetUrl']) {
    +						action = 'fckeditor';
    +						config.selectActionFunction = parentWindow['SetUrl'];
    +						if (!config.disableThumbnailSelection)
    +							config.selectThumbnailActionFunction = parentWindow['SetUrl'];
    +					} else
    +						action = null;
    +				}
    +				config.action = action;
    +			}
    +			// Always use 100% width and height when nested using this middle page.
    +			config.width = config.height = '100%';
    +			var ckfinder = new CKFinder(config);
    +			ckfinder.replace('ckfinder', config);
    +		})();
    +		//]]>
    +	</script>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/ckfinder.js b/src/main/webapp/plug-in/ckfinder/ckfinder.js
    new file mode 100644
    index 00000000..dfe46a52
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/ckfinder.js
    @@ -0,0 +1,7 @@
    +锘/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +
    +(function(){var a=(function(){var h={jY:'D7EB21H',_:{},status:'unloaded',basePath:(function(){var k=window.CKFINDER_BASEPATH||'';if(!k){var l=document.getElementsByTagName('script');for(var m=0;m<l.length;m++){var n=l[m].src.match(/(^|.*[\\\/])CKFINDER(?:_basic)?(?:_v2)?(?:_source)?.js(?:\?.*)?$/i);if(n){k=n[1];break;}}}if(k.indexOf('://')== -1)if(k.indexOf('/')===0)k=location.href.match(/^.*?:\/\/[^\/]*/)[0]+k;else k=location.href.match(/^[^\?]*\/(?:)/)[0]+k;return k;})(),getUrl:function(k){if(k.indexOf('://')== -1&&k.indexOf('/')!==0)k=this.basePath+k;if(this.jY&&k.charAt(k.length-1)!='/')k+=(k.indexOf('?')>=0?'&':'?')+'t='+this.jY;return k;}},i=window.CKFINDER_GETURL;if(i){var j=h.getUrl;h.getUrl=function(k){return i.call(h,k)||j.call(h,k);};}return h;})();function b(h){return a.instances[h];};var c={callback:1,selectThumbnailActionFunction:1,selectActionFunction:1};a.jd=function(){var j=this;var h={};for(var i in j){if(!j.hasOwnProperty(i))continue;if(typeof j[i]=='function'&& !c[i]||typeof j[i]=='undefined')continue;h[i]=j[i];}if(j.callback)h.callback=j.callback;return h;};a.lj=function(h){var k=this;h=h||k.basePath;var i='';if(!h||h.length===0)h=CKFinder.DEFAULT_basePath;if(h.substr(h.length-1,1)!='/')h+='/';h+='ckfinder.html';var j;if(k.hh){j=k.hh;if(typeof j=='function')j=j.toString().match(/function ([^(]+)/)[1];i+='?action=js&amp;func='+j;}if(k.jx){i+=i?'&amp;':'?';i+='data='+encodeURIComponent(k.jx);}if(k.disableThumbnailSelection){i+=i?'&amp;':'?';i+='dts=1';}else if(k.lH||k.hh){j=k.lH||k.hh;if(typeof j=='function')j=j.toString().match(/function ([^(]+)/)[1];i+=i?'&amp;':'?';i+='thumbFunc='+j;if(k.nm)i+='&amp;tdata='+encodeURIComponent(k.nm);else if(!k.lH&&k.jx)i+='&amp;tdata='+encodeURIComponent(k.jx);}if(k.startupPath){i+=i?'&amp;':'?';i+='start='+encodeURIComponent(k.startupPath+(k.startupFolderExpanded?':1':':0'));}if(k.rememberLastFolder!==undefined&& !k.rememberLastFolder){i+=i?'&amp;':'?';i+='rlf=0';}if(k.id){i+=i?'&amp;':'?';i+='id='+encodeURIComponent(k.id);}if(k.skin){i+=i?'&amp;':'?';i+='skin='+encodeURIComponent(k.skin);}return h+i;};function d(h){var k=this;k.id=h.name;var i=h.element.getDocument().getWindow().$,j=a.oC.getWindow().$;k.inPopup= ! !(i&&i.opener);k.inIframe= !k.inPopup&&i!=j.top&&i.frameElement.nodeName.toLowerCase()=='iframe';k.inFrame= !k.inPopup&&i!=j.top&&i.frameElement.nodeName.toLowerCase()=='frame';k.inUrlPopup= ! !(k.inPopup&&j.opener);};function e(h,i,j){i.on('appReady',function(k){k.removeListener();h.document=i.document.$;h.folders=i.folders;h.files=i.ld['filesview.filesview'].data().files;h.basketFiles=i.basketFiles;h.resourceTypes=i.resourceTypes;h.connector=i.connector;h.lang=i.lang;h.langCode=i.langCode;h.config=i.config;i.ld['foldertree.foldertree'].on('afterAddFolder',function(l){l.removeListener();if(j)j(h);},h);},h,null,999);};d.prototype={_:{},addFileContextMenuOption:function(h,i,j){var k=b(this.id),l='FileContextMenu_'+h.command;k.bD(l,{exec:function(m){var n=m.ld['filesview.filesview'].tools.dH();i(m.cg,n);}});h.command=l;if(!h.group)h.group='file1';k.gp(l,h);k.ld['filesview.filesview'].on('beforeContextMenu',function o(m){if(j){var n=j(this.tools.dH());if(n)m.data.bj[l]=n== -1?a.aY:a.aS;}else m.data.bj[l]=a.aS;});},disableFileContextMenuOption:function(h,i){var j=b(this.id),k=i?'FileContextMenu_'+h:h,l=function n(m){delete m.data.bj[k];};j.ld['filesview.filesview'].on('beforeContextMenu',l);return function(){j.ld['filesview.filesview'].removeListener('beforeContextMenu',l);};},addFolderContextMenuOption:function(h,i,j){var k=b(this.id),l='FolderContextMenu_'+h.command;k.bD(l,{exec:function(m){i(m.cg,m.aV);}});h.command=l;if(!h.group)h.group='folder1';k.gp(l,h);k.ld['foldertree.foldertree'].on('beforeContextMenu',function o(m){if(j){var n=j(this.app.aV);if(n)m.data.bj[l]=n== -1?a.aY:a.aS;}else m.data.bj[l]=a.aS;});},disableFolderContextMenuOption:function(h,i){var j=b(this.id),k=i?'FolderContextMenu_'+h:h,l=function n(m){delete m.data.bj[k];};j.ld['foldertree.foldertree'].on('beforeContextMenu',l);return function(){j.ld['foldertree.foldertree'].removeListener('beforeContextMenu',l);};},addFolderDropMenuOption:function(h,i,j){var k=b(this.id),l='FolderDropMenu_'+h.command;k.bD(l,{exec:function(n){i(n.cg,n.cK.oa());}});h.command=l;var m=new a.iD(k,l,h);k.ld['foldertree.foldertree'].on('beforeDropMenu',function o(n){if(j?j.call(k.cg,n.data.folder):1)n.data.iG[l]=m;});},disableFolderDropMenuOption:function(h,i){var j=b(this.id),k=i?'FolderDropMenu_'+h:h,l=function n(m){delete m.data.iG[k];};j.ld['foldertree.foldertree'].on('beforeDropMenu',l);return function(){j.ld['foldertree.foldertree'].removeListener('beforeDropMenu',l);};},getSelectedFile:function(){return b(this.id).ld['filesview.filesview'].tools.dH();},getSelectedFiles:function(){return b(this.id).ld['filesview.filesview'].tools.oO();},getSelectedFolder:function(){return b(this.id).aV;},filterFiles:function(h){b(this.id).ld['filesview.filesview'].oW('requestRenderFiles',{lookup:h});},setUiColor:function(h){return b(this.id).setUiColor(h);},destroy:function(h){b(this.id).destroy();h&&h();},openDialog:function(h,i){var l=this;var j=new a.dom.document(window.document).getHead(),k=b(l.id).document.getWindow();if(l.inFrame||l.inPopup||l.inIframe)a.document=b(l.id).document;return b(l.id).openDialog(h,i,j);},openMsgDialog:function(h,i){b(this.id).msgDialog(h,i);},openConfirmDialog:function(h,i,j){b(this.id).fe(h,i,j);},openInputDialog:function(h,i,j,k){b(this.id).hs(h,i,j,k);},openSkippedFilesDialog:function(h,i,j,k){b(this.id).skippedFilesDialog(h,i,j,k);},addTool:function(h){return b(this.id).plugins.tools.addTool(h);},addToolPanel:function(h){return b(this.id).plugins.tools.addToolPanel(h);},removeTool:function(h){b(this.id).plugins.tools.removeTool(h);},showTool:function(h){b(this.id).plugins.tools.showTool(h);},hideTool:function(h){b(this.id).plugins.tools.hideTool(h);},getResourceType:function(h){return b(this.id).getResourceType(h);},log:function(h){a.log.apply(a.log,arguments);},getLog:function(){return a.mZ();},emptyBasket:function(){b(this.id).execCommand('TruncateBasket');},replaceUploadForm:function(h,i,j,k){var l=b(this.id);if(!k)k=10;if(k>=(l.dC||20))return;l.dC=k;l.ld['formpanel.formpanel'].on('beforeUploadFileForm',function(m){if(m.data.step!=2)return;if(k>l.dC)return;m.cancel(true);var n=this.data(),o=m.data.folder;try{if(n.dc=='upload')this.oW('requestUnloadForm',function(){this.app.cS('upload').bR(a.aS);});else{if(this.data().dc)this.oW('requestUnloadForm');if(!j)this.eh.removeClass('show_border');this.oW('requestLoadForm',{html:h,command:'upload'});i&&i();}}catch(p){this.oW('failedUploadFileForm',m.data);this.oW('afterUploadFileForm',m.data);throw a.ba(p);}});return{hide:function(){l.oW('requestUnloadForm',function(){l.cS('upload').bR(a.aS);});}};},resizeFormPanel:function(h){var i=b(this.id);if(typeof h=='undefined'){i.document.getById('panel_view').setStyle('height','');i.document.getById('panel_widget').setStyle('height','');}else{var j=Math.min(h,Math.max(90,i.document.getById('main_container').$.offsetHeight-300));i.document.getById('panel_view').setStyle('height',j+'px');i.document.getById('panel_widget').setStyle('height',j-3+'px');}i.layout.ea(true);},refreshOpenedFolder:function(){var h=b(this.id),i=h.ld['filesview.filesview'].tools.currentFolder();h.oW('requestSelectFolder',{folder:i});},selectFile:function(h){var i=b(this.id);i.oW('requestSelectFile',{file:h,scrollTo:1});},closePopup:function(){if(!this.inPopup)return;b(this.id).element.getDocument().getWindow().$.close();},openFolder:function(h,i){var j=b(this.id);i=i.replace(/\/$/,'');h=h.toLowerCase();for(var k=0;k<j.folders.length;k++){var l=j.folders[k];if(l.getPath().replace(/\/$/,'')==i&&h==l.type.toLowerCase()){j.oW('requestSelectFolder',{folder:l});j.oW('requestShowFolderFiles',{folder:l});return;}}},setUiColor:function(h){b(this.id).setUiColor(h);},execCommand:function(h){b(this.id).execCommand(h);}};(function(){window.CKFinder=function(i,j){if(i)for(var k in i){if(!i.hasOwnProperty(k))continue;if(typeof i[k]=='function'&&k!='callback')continue;this[k]=i[k];}this.callback=j;};function h(i){var j=1;while(CKFinder._.instanceConfig[j])j++;CKFinder._.instanceConfig[j]=i;return j;};CKFinder.prototype={create:function(i){var j='ckf'+Math.random().toString().substr(2,9);document.write('<span id="'+j+'"></span>');i=a.tools.extend(a.jd.call(this),i,true);var k=a.replace(j,i,CKFinder);this.api=k.cg;return k.cg;},appendTo:function(i,j){j=a.tools.extend(a.jd.call(this),j,true);var k=a.appendTo(i,j,CKFinder);this.api=k.cg;return k.cg;},replace:function(i,j){j=a.tools.extend(a.jd.call(this),j,true);var k=a.replace(i,j,CKFinder);this.api=k.cg;return k.cg;},popup:function(i,j){var s=this;i=i||'80%';j=j||'70%';if(typeof i=='string'&&i.length>1&&i.substr(i.length-1,1)=='%')i=parseInt(window.screen.width*parseInt(i,10)/100,10);if(typeof j=='string'&&j.length>1&&j.substr(j.length-1,1)=='%')j=parseInt(window.screen.height*parseInt(j,10)/100,10);if(i<200)i=200;if(j<200)j=200;var k=parseInt((window.screen.height-j)/2,10),l=parseInt((window.screen.width-i)/2,10),m='location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,width='+i+',height='+j+',top='+k+',left='+l,n=a.env.webkit?'about:blank':'',o=window.open(n,'CKFinderpopup',m,true);if(!o)return false;s.width=s.height='100%';var p='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><title>CKFinder 2</title><style type="text/css">body, html, iframe, #ckfinder { margin: 0; padding: 0; border: 0; width: 100%; height: 100%; overflow: hidden; }</style></head><body></body></html>',q=new a.dom.document(o.document);q.$.open();if(a.env.isCustomDomain())q.$.domain=window.document.domain;q.$.write(p);q.$.close();try{var r=navigator.userAgent.toLowerCase();if(r.indexOf(' chrome/')== -1){o.moveTo(l,k);o.resizeTo(i,j);}o.focus();return s.appendTo(q.bH());}catch(t){return s.appendTo(q.bH());}return false;}};CKFinder._={};CKFinder._.instanceConfig=[];CKFinder.lang={};CKFinder.version='2.4';CKFinder.revision='2645';CKFinder.addPlugin=function(i,j,k){var l={bM:k||[]};if(typeof j=='function')j={appReady:j};for(var m in j){if(!j.hasOwnProperty(m))continue;if(m!='connectorInitialized'&&m!='uiReady')l[m]=j[m];}l.bz=function(n){if(n.config.readOnly&&l.readOnly===false)return null;if(j.connectorInitialized)n.on('connectorInitialized',function(o){var p=j.connectorInitialized;if(p)p.call(p,n.cg,o.data.xml);},null,null,1000);if(j.connectorResponse)n.on('connectorResponse',function(o){var p=j.connectorResponse;if(p)p.call(p,n.cg,o.data.xml);});if(j.galleryCallback)n.on('launchGallery',function(o){var p=j.galleryCallback;if(p)o.data.bx=p.call(p,n.cg,o.data.selected,o.data.files);});if(j.uiReady)n.on('uiReady',function(){var o=j.uiReady;o.call(o,n.cg);},null,null,1000);if(j.appReady)n.on('appReady',function(){var o=j.appReady;o.call(o,n.cg);},null,null,1000);};a.plugins.add(i,l);};CKFinder.getPluginPath=function(i){return a.plugins.getPath(i);};CKFinder.addExternalPlugin=function(i,j,k){a.plugins.tR(i,j,k);};CKFinder.setPluginLang=function(i,j,k){a.plugins.rX(i,j,k);};CKFinder.dialog={add:function(i,j){if(typeof j=='function')j=a.tools.override(j,function(k){return function(l){return k(l.cg);};});a.dialog.add(i,j);}};CKFinder.tools={};CKFinder.env={};CKFinder.dom={};CKFinder.create=function(i,j,k,l,m){var n;if(i!==null&&typeof i==='object'){n=new CKFinder();for(var o in i)n[o]=i[o];}else{n=new CKFinder();n.basePath=i;if(j)n.width=j;if(k)n.height=j;if(l)n.selectActionFunction=l;if(m)n.callback=m;}return n.create();};CKFinder.popup=function(i,j,k,l,m){var n;if(i!==null&&typeof i==='object'){n=new CKFinder();for(var o in i)n[o]=i[o];}else{n=new CKFinder();n.basePath=i;if(l)n.selectActionFunction=l;if(m)n.callback=m;}return n.popup(j,k);};CKFinder.setupFCKeditor=function(i,j,k,l){var m,n;if(j!==null&&typeof j==='object'){n=h(j);m=new CKFinder();for(var o in j){m[o]=j[o];if(o=='width'){var p=m[o]||800;if(typeof p=='string'&&p.length>1&&p.substr(p.length-1,1)=='%')p=parseInt(window.screen.width*parseInt(p,10)/100,10);i.Config.LinkBrowserWindowWidth=p;i.Config.ImageBrowserWindowWidth=p;i.Config.FlashBrowserWindowWidth=p;}else if(o=='height'){var q=m[o]||600;if(typeof q=='string'&&q.length>1&&q.substr(q.length-1,1)=='%')q=parseInt(window.screen.height*parseInt(q,10)/100,10);i.Config.LinkBrowserWindowHeight=q;i.Config.ImageBrowserWindowHeight=q;i.Config.FlashBrowserWindowHeight=q;}}}else{m=new CKFinder();m.basePath=j;}var r=m.basePath;if(r.substr(0,1)!='/'&&r.indexOf('://')== -1)r=document.location.pathname.substring(0,document.location.pathname.lastIndexOf('/')+1)+r;r=a.lj.call(m,r);var s=r.indexOf('?')!== -1?'&':'?';if(n){r+=s+'configId='+n;s='&';}i.Config.LinkBrowserURL=r;i.Config.ImageBrowserURL=r+s+'type='+(k||'Images');i.Config.FlashBrowserURL=r+s+'type='+(l||'Flash');var t=r.substring(0,1+r.lastIndexOf('/'));i.Config.LinkUploadURL=t+'core/connector/'+CKFinder.config.connectorLanguage+'/connector.'+CKFinder.config.connectorLanguage+'?command=QuickUpload&type=Files';i.Config.ImageUploadURL=t+'core/connector/'+CKFinder.config.connectorLanguage+'/connector.'+CKFinder.config.connectorLanguage+'?command=QuickUpload&type='+(k||'Images');i.Config.FlashUploadURL=t+'core/connector/'+CKFinder.config.connectorLanguage+'/connector.'+CKFinder.config.connectorLanguage+'?command=QuickUpload&type='+(l||'Flash');};CKFinder.setupCKEditor=function(i,j,k,l){if(i===null){for(var m in CKEDITOR.instances)CKFinder.setupCKEditor(CKEDITOR.instances[m],j,k,l);CKEDITOR.on('instanceCreated',function(v){CKFinder.setupCKEditor(v.editor,j,k,l);});return;}var n,o;if(j!==null&&typeof j==='object'){o=h(j);n=new CKFinder();for(var p in j){n[p]=j[p];if(p=='width'){var q=n[p]||800;if(typeof q=='string'&&q.length>1&&q.substr(q.length-1,1)=='%')q=parseInt(window.screen.width*parseInt(q,10)/100,10);i.config.filebrowserWindowWidth=q;}else if(p=='height'){var r=n[p]||600;if(typeof r=='string'&&r.length>1&&r.substr(r.length-1,1)=='%')r=parseInt(window.screen.height*parseInt(r,10)/100,10);i.config.filebrowserWindowHeight=r;}}}else{n=new CKFinder();n.basePath=j;}var s=n.basePath;if(s.substr(0,1)!='/'&&s.indexOf('://')== -1)s=document.location.pathname.substring(0,document.location.pathname.lastIndexOf('/')+1)+s;s=a.lj.call(n,s);var t=s.indexOf('?')!== -1?'&':'?';if(o){s+=t+'configId='+o;t='&';}i.config.filebrowserBrowseUrl=s;i.config.filebrowserImageBrowseUrl=s+t+'type='+(k||'Images');i.config.filebrowserFlashBrowseUrl=s+t+'type='+(l||'Flash');var u=s.substring(0,1+s.lastIndexOf('/'));i.config.filebrowserUploadUrl=u+'core/connector/'+CKFinder.config.connectorLanguage+'/connector.'+CKFinder.config.connectorLanguage+'?command=QuickUpload&type=Files';i.config.filebrowserImageUploadUrl=u+'core/connector/'+CKFinder.config.connectorLanguage+'/connector.'+CKFinder.config.connectorLanguage+'?command=QuickUpload&type='+(k||'Images');i.config.filebrowserFlashUploadUrl=u+'core/connector/'+CKFinder.config.connectorLanguage+'/connector.'+CKFinder.config.connectorLanguage+'?command=QuickUpload&type='+(l||'Flash');};})();if(!a.event){a.event=function(){};a.event.du=function(h,i){var j=a.event.prototype;for(var k in j){if(h[k]==undefined)h[k]=j[k];}};a.event.prototype=(function(){var h=function(j){var k=j.kk&&j.kk()||j._||(j._={});return k.cC||(k.cC={});},i=function(j){this.name=j;this.dF=[];};i.prototype={mi:function(j){for(var k=0,l=this.dF;k<l.length;k++){if(l[k].fn==j)return k;}return-1;}};return{on:function(j,k,l,m,n){var o=h(this),p=o[j]||(o[j]=new i(j));if(p.mi(k)<0){var q=p.dF;if(!l)l=this;if(isNaN(n))n=10;var r=this,s=function(u,v,w,x){var y={name:j,jN:this,application:u,data:v,jO:m,stop:w,cancel:x,removeListener:function(){r.removeListener(j,k);}};k.call(l,y);return y.data;};s.fn=k;s.nT=n;for(var t=q.length-1;t>=0;t--){if(q[t].nT<=n){q.splice(t+1,0,s);return;}}q.unshift(s);}},oW:(function(){var j=false,k=function(){j=true;},l=false,m=function(n){l=n?2:true;};return function y(n,o,p,q){if(typeof o=='function'){q=o;o=null;}else if(typeof p=='function'){q=p;p=null;}if(n!='mousemove')a.log('[EVENT] '+n,o,q);var r=h(this)[n],s=j,t=l;j=l=false;if(r){var u=r.dF;if(u.length){u=u.slice(0);for(var v=0;v<u.length;v++){var w=u[v].call(this,p,o,k,m);if(typeof w!='undefined')o=w;if(j||l&&l!=2)break;}}}var x=l||(typeof o=='undefined'?false: !o||typeof o.result=='undefined'?o:o.result);if(typeof q==='function'&&l!=2)x=q.call(this,l,o)||x;j=s;l=t;return x;};})(),cr:function(j,k,l){var m=this.oW(j,k,l);delete h(this)[j];return m;},removeListener:function(j,k){var l=h(this)[j];if(l){var m=l.mi(k);if(m>=0)l.dF.splice(m,1);}},mF:function(){var j=h(this);for(var k=0;k<j.length;k++)j[k].dF=[];},rC:function(j){var k=h(this)[j];return k&&k.dF.length>0;}};})();}if(!a.application){a.kZ=0;a.fc=1;a.qE=2;a.application=function(h,i,j,k){var l=this;l._={instanceConfig:h,element:i};l.ff=j||a.kZ;a.event.call(l);l.iI(k);};a.application.replace=function(h,i,j){var k=h;if(typeof k!='object'){k=document.getElementById(h);if(!k){var l=0,m=document.getElementsByName(h);while((k=m[l++])&&k.tagName.toLowerCase()!='textarea'){}}if(!k)throw '[CKFINDER.application.replace] The element with id or name "'+h+'" was not found.';}return new a.application(i,k,a.fc,j);};a.application.appendTo=function(h,i,j){if(typeof h!='object'){h=document.getElementById(h);if(!h)throw '[CKFINDER.application.appendTo] The element with id "'+h+'" was not found.';}return new a.application(i,h,a.qE,j);};a.application.prototype={iI:function(){var h=a.application.eb||(a.application.eb=[]);h.push(this);},oW:function(h,i,j){return a.event.prototype.oW.call(this,h,i,this,j);},cr:function(h,i,j){return a.event.prototype.cr.call(this,h,i,this,j);}};a.event.du(a.application.prototype,true);}if(!a.env){var f=/rv:([\d\.]+)/,g=/trident\/([\d]+)/;a.env=(function(){var h=navigator.userAgent.toLowerCase(),i=window.opera,j={ie:
    +/*@cc_on!@*/false,iemodern:false,opera: ! !i&&i.version,webkit:h.indexOf(' applewebkit/')> -1,air:h.indexOf(' adobeair/')> -1,mac:h.indexOf('macintosh')> -1,quirks:document.compatMode=='BackCompat',isCustomDomain:function(){return this.ie&&document.domain!=window.location.hostname;}};j.gecko=navigator.product=='Gecko'&& !j.webkit&& !j.opera;j.chrome=false;j.safari=false;if(j.webkit)if(h.indexOf(' chrome/')> -1)j.chrome=true;else j.safari=true;var k=0;if(j.ie){k=parseFloat(h.match(/msie (\d+)/)[1]);j.ie8= ! !document.documentMode;j.ie8Compat=document.documentMode==8;j.ie7Compat=k==7&& !document.documentMode||document.documentMode==7;j.ie6Compat=k<7||j.quirks;}if(j.gecko){var l=h.match(f);if(l){l=l[1].split('.');k=l[0]*10000+(l[1]||0)*100+ +(l[2]||0);}if(g.test(h)){j.gecko=false;j.iemodern=true;}else j.isMobile=h.indexOf('fennec')> -1;}if(j.opera){k=parseFloat(i.version());j.isMobile=h.indexOf('opera mobi')> -1;}if(j.air)k=parseFloat(h.match(/ adobeair\/(\d+)/)[1]);if(j.webkit){k=parseFloat(h.match(/ applewebkit\/(\d+)/)[1]);j.isMobile=h.indexOf('mobile')> -1;}j.version=k;j.isCompatible=j.ie&&k>=6||j.iemodern&&k>=11||j.gecko&&k>=10801||j.opera&&k>=9.5||j.air&&k>=1||j.webkit&&k>=522||false;j.cssClass='browser_'+(j.ie?'ie':j.iemodern?'iemodern':j.gecko?'gecko':j.opera?'opera':j.air?'air':j.webkit?'webkit':'unknown');if(j.quirks)j.cssClass+=' browser_quirks';if(j.ie){j.cssClass+=' browser_ie'+(j.version<7?'6':j.version>=8?'8':'7');if(j.quirks)j.cssClass+=' browser_iequirks';if(j.ie7Compat)j.cssClass+=' browser_ie7Compat';}if(j.gecko&&k<10900)j.cssClass+=' browser_gecko18';return j;})();CKFinder.env=a.env;}var h=a.env;var i=h.ie;if(a.status=='unloaded')(function(){a.event.du(a);a.dO=function(){if(a.status!='basic_ready'){a.dO.qr=true;return;}delete a.dO;var k=document.createElement('script');k.type='text/javascript';k.src=a.basePath+'ckfinder.js';document.getElementsByTagName('head')[0].appendChild(k);};a.mS=0;a.uQ='ckfinder';a.uM=true;var j=function(k,l,m,n){if(h.isCompatible){if(a.dO)a.dO();var o=m(k,l,n);a.add(o);return o;}return null;};a.replace=function(k,l,m){return j(k,l,a.application.replace,m);};a.appendTo=function(k,l,m){return j(k,l,a.application.appendTo,m);};a.add=function(k){var l=this._.io||(this._.io=[]);l.push(k);};a.uL=function(){var k=document.getElementsByTagName('textarea');for(var l=0;l<k.length;l++){var m=null,n=k[l],o=n.name;if(!n.name&& !n.id)continue;if(typeof arguments[0]=='string'){var p=new RegExp('(?:^| )'+arguments[0]+'(?:$| )');if(!p.test(n.className))continue;}else if(typeof arguments[0]=='function'){m={};if(arguments[0](n,m)===false)continue;}this.replace(n,m);}};(function(){var k=function(){var l=a.dO,m=a.mS;a.status='basic_ready';if(l&&l.qr)l();else if(m)setTimeout(function(){if(a.dO)a.dO();},m*1000);};if(window.addEventListener)window.addEventListener('load',k,false);else if(window.attachEvent)window.attachEvent('onload',k);})();a.status='basic_loaded';})();a.dom={};CKFinder.dom=a.dom;var j=a.dom;a.ajax=(function(){var k=function(){if(!i||location.protocol!='file:')try{return new XMLHttpRequest();}catch(p){}try{return new ActiveXObject('Msxml2.XMLHTTP');}catch(q){}try{return new ActiveXObject('Microsoft.XMLHTTP');}catch(r){}return null;},l=function(p){return p.readyState==4&&(p.status>=200&&p.status<300||p.status==304||p.status===0||p.status==1223);},m=function(p){if(l(p))return p.responseText;return null;},n=function(p){if(l(p)){var q=p.responseXML,r=new a.xml(q&&q.firstChild&&q.documentElement&&q.documentElement.nodeName!='parsererror'?q:p.responseText.replace(/^[^<]+/,'').replace(/[^>]+$/,''));if(r&&r.mq&&r.mq.documentElement&&r.mq.documentElement.nodeName!='parsererror'&&r.mq.documentElement.nodeName!='html'&&r.mq.documentElement.nodeName!='br')return r;}var s=a.nG||a.jt,t=p.responseText,u=s.lang.ErrorMsg[!t?'XmlEmpty':'XmlError']+'<br>';if(r&&r.mq)if(r.mq.parseError&&r.mq.parseError.reason)u+=r.mq.parseError.reason;else if(r.mq.documentElement&&r.mq.documentElement.nodeName=='parsererror')u+=r.mq.documentElement.textContent;if(!t)s.msgDialog(s.lang.SysErrorDlgTitle,u);else{if(/text\/plain/.test(p.getResponseHeader('Content-Type'))||/<Connector\s*/.test(t)){t=a.tools.htmlEncode(t);t=t.replace(/\n/g,'<br>');t='<div style="width:600px; overflow:scroll"><font>'+t+'</font></div>';}s.msgDialog(s.lang.SysErrorDlgTitle,u+'<br>'+s.lang.ErrorMsg.XmlRawResponse.replace('%s','<br><br>'+t));}return{};},o=function(p,q,r,s){var t= ! !q;a.log('[AJAX] '+(s?'POST':'GET')+' '+p);var u=k();if(!u)return null;if(!s)u.open('GET',p,t);else u.open('POST',p,t);if(t)u.onreadystatechange=function(){if(u.readyState==4){q(r(u));u=null;}};if(s){u.setRequestHeader('Content-type','application/x-www-form-urlencoded; charset=utf-8');u.send(s);}else u.send(null);return t?'':r(u);};return{load:function(p,q,r){return o(p,q,m,r);},loadXml:function(p,q,r){return o(p,q,n,r);}};})();CKFinder.ajax=a.ajax;(function(){var k=[];a.tools={arrayCompare:function(l,m){if(!l&& !m)return true;if(!l|| !m||l.length!=m.length)return false;for(var n=0;n<l.length;n++){if(l[n]!=m[n])return false;}return true;},clone:function(l){var m;if(l&&l instanceof Array){m=[];for(var n=0;n<l.length;n++)m[n]=this.clone(l[n]);return m;}if(l===null||typeof l!='object'||l instanceof String||l instanceof Number||l instanceof Boolean||l instanceof Date)return l;m=new l.constructor();for(var o in l){var p=l[o];m[o]=this.clone(p);}return m;},capitalize:function(l){return l.charAt(0).toUpperCase()+l.substring(1).toLowerCase();},extend:function(l){var m=arguments.length,n,o;if(typeof(n=arguments[m-1])=='boolean')m--;else if(typeof(n=arguments[m-2])=='boolean'){o=arguments[m-1];m-=2;}for(var p=1;p<m;p++){var q=arguments[p];for(var r in q){if(n===true||l[r]==undefined)if(!o||r in o)l[r]=q[r];}}return l;},prototypedCopy:function(l){var m=function(){};m.prototype=l;return new m();},isArray:function(l){return! !l&&l instanceof Array;},cssStyleToDomStyle:(function(){var l=document.createElement('div').style,m=typeof l.cssFloat!='undefined'?'cssFloat':typeof l.styleFloat!='undefined'?'styleFloat':'float';return function(n){if(n=='float')return m;else return n.replace(/-./g,function(o){return o.substr(1).toUpperCase();});};})(),htmlEncode:function(l){var m=function(q){var r=new j.element('span');r.setText(q);return r.getHtml();},n=m('\n').toLowerCase()=='<br>'?function(q){return m(q).replace(/<br>/gi,'\n');}:m,o=m('>')=='>'?function(q){return n(q).replace(/>/g,'&gt;');}:n,p=m('  ')=='&nbsp; '?function(q){return o(q).replace(/&nbsp;/g,' ');}:o;this.htmlEncode=p;return this.htmlEncode(l);},getNextNumber:(function(){var l=0;return function(){return++l;};})(),override:function(l,m){return m(l);},setTimeout:function(l,m,n,o,p){if(!p)p=window;if(!n)n=p;return p.setTimeout(function(){if(o)l.apply(n,[].concat(o));else l.apply(n);},m||0);},trim:(function(){var l=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(m){return m?m.replace(l,''):null;};})(),ltrim:(function(){var l=/^[ \t\n\r]+/g;return function(m){return m?m.replace(l,''):null;};})(),rtrim:(function(){var l=/[ \t\n\r]+$/g;return function(m){return m?m.replace(l,''):null;};})(),indexOf:Array.prototype.indexOf?function(l,m){return l.indexOf(m);}:function(l,m){for(var n=0,o=l.length;n<o;n++){if(l[n]===m)return n;}return-1;},bind:function(l,m){return function(){return l.apply(m,arguments);};},createClass:function(l){var m=l.$,n=l.base,o=l.vd||l._,p=l.ej,q=l.statics;if(o){var r=m;m=function(){var v=this;var s=v._||(v._={});for(var t in o){var u=o[t];s[t]=typeof u=='function'?a.tools.bind(u,v):u;}r.apply(v,arguments);};}if(n){m.prototype=this.prototypedCopy(n.prototype);m.prototype['constructor']=m;m.prototype.base=function(){this.base=n.prototype.base;n.apply(this,arguments);this.base=arguments.callee;};}if(p)this.extend(m.prototype,p,true);if(q)this.extend(m,q,true);return m;},addFunction:function(l,m){return k.push(function(){l.apply(m||this,arguments);})-1;},removeFunction:function(l){k[l]=null;},callFunction:function(l){var m=k[l];return m.apply(window,Array.prototype.slice.call(arguments,1));},cssLength:(function(){var l=/^\d+(?:\.\d+)?$/;return function(m){return m+(l.test(m)?'px':'');};})(),repeat:function(l,m){return new Array(m+1).join(l);},deepCopy:function(l){var m={};if(typeof l=='object'){if(typeof l.length!='undefined')m=[];for(var n in l){if(l[n]===null)m[n]=null;else if(typeof l[n]=='object')m[n]=a.tools.deepCopy(l[n]);else m[n]=l[n];}}return m;},getUrlParam:function(l,m){var n=new RegExp('(?:[?&]|&amp;)'+l+'=([^&]+)','i'),o=(m||window).location.search.match(n);return o&&o.length>1?o[1]:null;},htmlEncode:function(l){if(!l)return '';l=typeof l!='string'?l.toString():l;l=l.replace(/&/g,'&amp;');l=l.replace(/</g,'&lt;');l=l.replace(/>/g,'&gt;');return l;},setCookie:function(l,m,n){document.cookie=l+'='+m+(!n?'; expires=Thu, 6 Oct 2016 01:00:00 UTC; path=/':'');},getCookie:function(l){var m=document.cookie.match(new RegExp('(^|\\s|;)'+l+'=([^;]*)'));return m&&m.length>0?m[2]:'';},mH:function(l){if(i){l.$.onfocusin=function(){l.addClass('focus_inside');};l.$.onfocusout=function(){l.removeClass('focus_inside');};}else{l.$.addEventListener('focus',function(){l.addClass('focus_inside');},true);l.$.addEventListener('blur',function(){l.removeClass('focus_inside');},true);}},formatSize:function(l,m,n){if(l==0)return '0';if(l<1)return m.Kb.replace('%1',1);if(l<1024){if(!n)l=l.toFixed(2);return m.Kb.replace('%1',l);}if(l<1048576)return m.Mb.replace('%1',(l/1024).toFixed(2));return m.Gb.replace('%1',(l/1048576).toFixed(2));},formatSpeed:function(l,m){return m.SizePerSecond.replace('%1',this.formatSize(l,m));}};CKFinder._.callFunction=a.tools.callFunction;CKFinder.tools=a.tools;})();var k=a.tools;j.event=function(l){this.$=l;};j.event.prototype={oV:function(){return this.$.keyCode||this.$.which||0;},db:function(){var m=this;var l=m.oV();if(m.$.ctrlKey||m.$.metaKey)l+=a.bP;if(m.$.shiftKey)l+=a.dy;if(m.$.altKey)l+=a.eJ;return l;},preventDefault:function(l){var m=this.$;if(m.preventDefault)m.preventDefault();else m.returnValue=false;if(l)this.stopPropagation();},stopPropagation:function(){var l=this.$;if(l.stopPropagation)l.stopPropagation();else l.cancelBubble=true;},bK:function(){var l=this.$.target||this.$.srcElement;return l?new j.bi(l):null;},getButton:function(){if(this.$.which)return this.$.which;switch(this.$.button){case 1:return 1;case 4:return 2;case 2:return 3;}},ov:function(){return 1==this.getButton();}};a.bP=1000;a.dy=2000;a.eJ=4000;j.dE=function(l){if(l)this.$=l;};j.dE.prototype=(function(){var l=function(m,n){return function(o){if(typeof a!='undefined')m.oW(n,new j.event(o));};};return{kk:function(){var m;if(!(m=this.dw('_')))this.fL('_',m={});return m;},on:function(m){var p=this;var n=p.dw('_cke_nativeListeners');if(!n){n={};p.fL('_cke_nativeListeners',n);}if(!n[m]){var o=n[m]=l(p,m);if(p.$.addEventListener)p.$.addEventListener(m,o,! !a.event.jP);else if(p.$.attachEvent)p.$.attachEvent('on'+m,o);}return a.event.prototype.on.apply(p,arguments);},removeListener:function(m){var p=this;a.event.prototype.removeListener.apply(p,arguments);if(!p.rC(m)){var n=p.dw('_cke_nativeListeners'),o=n&&n[m];if(o){if(p.$.removeEventListener)p.$.removeEventListener(m,o,false);else if(p.$.detachEvent)p.$.detachEvent('on'+m,o);delete n[m];}}}};})();(function(l){var m={};l.equals=function(n){return n&&n.$===this.$;};l.fL=function(n,o){var p=this.iY(),q=m[p]||(m[p]={});q[n]=o;return this;};l.dw=function(n){var o=this.$._ckf_expando,p=o&&m[o];return p&&p[n];};l.jF=function(n){var o=this.$._ckf_expando,p=o&&m[o],q=p&&p[n];if(typeof q!='undefined')delete p[n];return q||null;};l.iY=function(){return this.$._ckf_expando||(this.$._ckf_expando=k.getNextNumber());};a.event.du(l);})(j.dE.prototype);j.window=function(l){j.dE.call(this,l);};j.window.prototype=new j.dE();k.extend(j.window.prototype,{focus:function(){if(h.webkit&&this.$.parent)this.$.parent.focus();this.$.focus();},eR:function(){var l=this.$.document,m=l.compatMode=='CSS1Compat';return{width:(m?l.documentElement.clientWidth:l.body.clientWidth)||0,height:(m?l.documentElement.clientHeight:l.body.clientHeight)||0};},hV:function(){var l=this.$;if('pageXOffset'in l)return{x:l.pageXOffset||0,y:l.pageYOffset||0};else{var m=l.document;return{x:m.documentElement.scrollLeft||m.body.scrollLeft||0,y:m.documentElement.scrollTop||m.body.scrollTop||0};}}});j.document=function(l){j.dE.call(this,l);};var l=j.document;l.prototype=new j.dE();k.extend(l.prototype,{appendStyleSheet:function(m){if(this.$.createStyleSheet)this.$.createStyleSheet(m);else{var n=new j.element('link');n.setAttributes({rel:'stylesheet',type:'text/css',href:m});this.getHead().append(n);}},createElement:function(m,n){var o=new j.element(m,this);if(n){if(n.attributes)o.setAttributes(n.attributes);if(n.gS)o.setStyles(n.gS);}return o;},jT:function(m){return new j.text(m,this);},focus:function(){this.getWindow().focus();},getById:function(m){var n=this.$.getElementById(m);return n?new j.element(n):null;},vu:function(m,n){var o=this.$.documentElement;for(var p=0;o&&p<m.length;p++){var q=m[p];if(!n){o=o.childNodes[q];continue;}var r= -1;for(var s=0;s<o.childNodes.length;s++){var t=o.childNodes[s];if(n===true&&t.nodeType==3&&t.previousSibling&&t.previousSibling.nodeType==3)continue;r++;if(r==q){o=t;break;}}}return o?new j.bi(o):null;},eG:function(m,n){if(!i&&n)m=n+':'+m;return new j.iT(this.$.getElementsByTagName(m));},getHead:function(){var m=this.$.getElementsByTagName('head')[0];m=new j.element(m);return(this.getHead=function(){return m;})();},bH:function(){var m=new j.element(this.$.body);return(this.bH=function(){return m;})();},gT:function(){var m=new j.element(this.$.documentElement);return(this.gT=function(){return m;})();},getWindow:function(){var m=new j.window(this.$.parentWindow||this.$.defaultView);return(this.getWindow=function(){return m;})();}});j.bi=function(m){if(m){switch(m.nodeType){case a.cv:return new j.element(m);case a.fl:return new j.text(m);}j.dE.call(this,m);}return this;};j.bi.prototype=new j.dE();a.cv=1;a.fl=3;a.va=8;a.om=11;a.oh=0;a.op=1;a.gW=2;a.gX=4;a.mo=8;a.lF=16;k.extend(j.bi.prototype,{appendTo:function(m,n){m.append(this,n);return m;},clone:function(m,n){var o=this.$.cloneNode(m);if(!n){var p=function(q){if(q.nodeType!=a.cv)return;q.removeAttribute('id',false);q.removeAttribute('_ckf_expando',false);var r=q.childNodes;for(var s=0;s<r.length;s++)p(r[s]);};p(o);}return new j.bi(o);},gE:function(){return! !this.$.previousSibling;},ge:function(){return! !this.$.nextSibling;},kB:function(m){m.$.parentNode.insertBefore(this.$,m.$.nextSibling);return m;},insertBefore:function(m){m.$.parentNode.insertBefore(this.$,m.$);return m;},vP:function(m){this.$.parentNode.insertBefore(m.$,this.$);return m;},lU:function(m){var n=[],o=this.getDocument().$.documentElement,p=this.$;while(p&&p!=o){var q=p.parentNode,r= -1;for(var s=0;s<q.childNodes.length;s++){var t=q.childNodes[s];if(m&&t.nodeType==3&&t.previousSibling&&t.previousSibling.nodeType==3)continue;r++;if(t==p)break;}n.unshift(r);p=p.parentNode;}return n;},getDocument:function(){var m=new l(this.$.ownerDocument||this.$.parentNode.ownerDocument);return(this.getDocument=function(){return m;})();},vA:function(){var m=this.$,n=m.parentNode&&m.parentNode.firstChild,o= -1;while(n){o++;if(n==m)return o;n=n.nextSibling;}return-1;},hL:function(m,n,o){if(o&& !o.call){var p=o;o=function(s){return!s.equals(p);};}var q= !m&&this.getFirst&&this.getFirst(),r;if(!q){if(this.type==a.cv&&o&&o(this,true)===false)return null;q=this.dG();}while(!q&&(r=(r||this).getParent())){if(o&&o(r,true)===false)return null;q=r.dG();}if(!q)return null;if(o&&o(q)===false)return null;if(n&&n!=q.type)return q.hL(false,n,o);return q;},hZ:function(m,n,o){if(o&& !o.call){var p=o;o=function(s){return!s.equals(p);};}var q= !m&&this.dB&&this.dB(),r;if(!q){if(this.type==a.cv&&o&&o(this,true)===false)return null;q=this.cf();}while(!q&&(r=(r||this).getParent())){if(o&&o(r,true)===false)return null;q=r.cf();}if(!q)return null;if(o&&o(q)===false)return null;if(n&&q.type!=n)return q.hZ(false,n,o);return q;},cf:function(m){var n=this.$,o;do{n=n.previousSibling;o=n&&new j.bi(n);}while(o&&m&& !m(o));return o;},vs:function(){return this.cf(function(m){return m.$.nodeType==1;});},dG:function(m){var n=this.$,o;do{n=n.nextSibling;o=n&&new j.bi(n);}while(o&&m&& !m(o));return o;},vk:function(){return this.dG(function(m){return m.$.nodeType==1;});},getParent:function(){var m=this.$.parentNode;return m&&m.nodeType==1?new j.bi(m):null;},vn:function(m){var n=this,o=[];do o[m?'push':'unshift'](n);while(n=n.getParent());return o;},vv:function(m){var o=this;if(m.equals(o))return o;if(m.contains&&m.contains(o))return m;var n=o.contains?o:o.getParent();do{if(n.contains(m))return n;}while(n=n.getParent());return null;},gz:function(m){var n=this.$,o=m.$;if(n.compareDocumentPosition)return n.compareDocumentPosition(o);if(n==o)return a.oh;if(this.type==a.cv&&m.type==a.cv){if(n.contains){if(n.contains(o))return a.lF+a.gX;if(o.contains(n))return a.mo+a.gW;}if('sourceIndex'in n)return n.sourceIndex<0||o.sourceIndex<0?a.op:n.sourceIndex<o.sourceIndex?a.gX:a.gW;}var p=this.lU(),q=m.lU(),r=Math.min(p.length,q.length);for(var s=0;s<=r-1;s++){if(p[s]!=q[s]){if(s<r)return p[s]<q[s]?a.gX:a.gW;break;}}return p.length<q.length?a.lF+a.gX:a.mo+a.gW;},vw:function(m,n){var o=this.$;if(!n)o=o.parentNode;while(o){if(o.nodeName&&o.nodeName.toLowerCase()==m)return new j.bi(o);o=o.parentNode;}return null;},vX:function(m,n){var o=this.$;if(!n)o=o.parentNode;while(o){if(o.nodeName&&o.nodeName.toLowerCase()==m)return true;o=o.parentNode;}return false;},move:function(m,n){m.append(this.remove(),n);},remove:function(m){var n=this.$,o=n.parentNode;if(o){if(m)for(var p;p=n.firstChild;)o.insertBefore(n.removeChild(p),n);o.removeChild(n);}return this;},replace:function(m){this.insertBefore(m);m.remove();},trim:function(){this.ltrim();this.rtrim();},ltrim:function(){var p=this;var m;while(p.getFirst&&(m=p.getFirst())){if(m.type==a.fl){var n=k.ltrim(m.getText()),o=m.hJ();if(!n){m.remove();continue;}else if(n.length<o){m.split(o-n.length);p.$.removeChild(p.$.firstChild);}}break;}},rtrim:function(){var p=this;var m;while(p.dB&&(m=p.dB())){if(m.type==a.fl){var n=k.rtrim(m.getText()),o=m.hJ();if(!n){m.remove();continue;}else if(n.length<o){m.split(n.length);p.$.lastChild.parentNode.removeChild(p.$.lastChild);}}break;}if(!i&& !h.opera){m=p.$.lastChild;if(m&&m.type==1&&m.nodeName.toLowerCase()=='br')m.parentNode.removeChild(m);}}});j.iT=function(m){this.$=m;};j.iT.prototype={count:function(){return this.$.length;},getItem:function(m){var n=this.$[m];return n?new j.bi(n):null;}};j.element=function(m,n){if(typeof m=='string')m=(n?n.$:document).createElement(m);j.dE.call(this,m);};var m=j.element;m.eB=function(n){return n&&(n.$?n:new m(n));};m.prototype=new j.bi();m.kE=function(n,o){var p=new m('div',o);p.setHtml(n);return p.getFirst().remove();};m.rS=function(n,o,p,q){var r=o.dw('list_marker_id')||o.fL('list_marker_id',k.getNextNumber()).dw('list_marker_id'),s=o.dw('list_marker_names')||o.fL('list_marker_names',{}).dw('list_marker_names');n[r]=o;s[p]=1;return o.fL(p,q);};m.sM=function(n){for(var o in n)m.qZ(n,n[o],true);};m.qZ=function(n,o,p){var q=o.dw('list_marker_names'),r=o.dw('list_marker_id');for(var s in q)o.jF(s);o.jF('list_marker_names');if(p){o.jF('list_marker_id');delete n[r];}};k.extend(m.prototype,{type:a.cv,addClass:function(n){var o=this.$.className;if(o){var p=new RegExp('(?:^|\\s)'+n+'(?:\\s|$)','');if(!p.test(o))o+=' '+n;}this.$.className=o||n;},removeClass:function(n){var o=this.getAttribute('class');if(o){var p=new RegExp('(?:^|\\s+)'+n+'(?=\\s|$)','i');if(p.test(o)){o=o.replace(p,'').replace(/^\s+/,'');if(o)this.setAttribute('class',o);else this.removeAttribute('class');}}},hasClass:function(n){var o=new RegExp('(?:^|\\s+)'+n+'(?=\\s|$)','');return o.test(this.getAttribute('class'));},append:function(n,o){var p=this;if(typeof n=='string')n=p.getDocument().createElement(n);if(o)p.$.insertBefore(n.$,p.$.firstChild);else p.$.appendChild(n.$);a.log('[DOM] DOM flush into '+p.getName());return n;},appendHtml:function(n){var p=this;if(!p.$.childNodes.length)p.setHtml(n);else{var o=new m('div',p.getDocument());o.setHtml(n);o.jg(p);}},appendText:function(n){if(this.$.text!=undefined)this.$.text+=n;else this.append(new j.text(n));},pd:function(){var o=this;var n=o.dB();while(n&&n.type==a.fl&& !k.rtrim(n.getText()))n=n.cf();if(!n|| !n.is|| !n.is('br'))o.append(h.opera?o.getDocument().jT(''):o.getDocument().createElement('br'));},tV:function(n){var q=this;var o=new j.mk(q.getDocument());o.setStartAfter(q);o.setEndAfter(n);var p=o.extractContents();o.insertNode(q.remove());p.kA(q);},contains:i||h.webkit?function(n){var o=this.$;return n.type!=a.cv?o.contains(n.getParent().$):o!=n.$&&o.contains(n.$);}:function(n){return! !(this.$.compareDocumentPosition(n.$)&16);},focus:function(){try{this.$.focus();}catch(n){}},getHtml:function(){return this.$.innerHTML;},fH:function(){var o=this;if(o.$.outerHTML)return o.$.outerHTML.replace(/<\?[^>]*>/,'');var n=o.$.ownerDocument.createElement('div');n.appendChild(o.$.cloneNode(true));return n.innerHTML;},setHtml:function(n){a.log('[DOM] DOM flush into '+this.getName());return this.$.innerHTML=n;},setText:function(n){m.prototype.setText=this.$.innerText!=undefined?function(o){a.log('[DOM] Text flush');return this.$.innerText=o;}:function(o){a.log('[DOM] Text flush');return this.$.textContent=o;};return this.setText(n);},getAttribute:(function(){var n=function(o){return this.$.getAttribute(o,2);};if(i&&(h.ie7Compat||h.ie6Compat))return function(o){var q=this;switch(o){case 'class':o='className';break;case 'tabindex':var p=n.call(q,o);if(p!==0&&q.$.tabIndex===0)p=null;return p;break;case 'checked':return q.$.checked;break;case 'style':return q.$.style.cssText;}return n.call(q,o);};else return n;})(),getChildren:function(){return new j.iT(this.$.childNodes);},getComputedStyle:i?function(n){return this.$.currentStyle[k.cssStyleToDomStyle(n)];}:function(n){return this.getWindow().$.getComputedStyle(this.$,'').getPropertyValue(n);},pf:function(){var n=a.ga[this.getName()];this.pf=function(){return n;};return n;},eG:l.prototype.eG,vp:i?function(){var n=this.$.tabIndex;if(n===0&& !a.ga.ug[this.getName()]&&parseInt(this.getAttribute('tabindex'),10)!==0)n= -1;return n;}:h.webkit?function(){var n=this.$.tabIndex;if(n==undefined){n=parseInt(this.getAttribute('tabindex'),10);if(isNaN(n))n= -1;}return n;}:function(){return this.$.tabIndex;},getText:function(){return this.$.textContent||this.$.innerText||'';},getWindow:function(){return this.getDocument().getWindow();},dS:function(){return this.$.id||null;},data:function(n,o){n='data-'+n;if(o===undefined)return this.getAttribute(n);else if(o===false)this.removeAttribute(n);else this.setAttribute(n,o);return null;},vm:function(){return this.$.name||null;},getName:function(){var n=this.$.nodeName.toLowerCase();if(i&& !(document.documentMode>8)){var o=this.$.scopeName;if(o!='HTML')n=o.toLowerCase()+':'+n;}return(this.getName=function(){return n;})();},getValue:function(){return this.$.value;},getFirst:function(){var n=this.$.firstChild;return n?new j.bi(n):null;},dB:function(n){var o=this.$.lastChild,p=o&&new j.bi(o);if(p&&n&& !n(p))p=p.cf(n);return p;},rd:function(n){return this.$.style[k.cssStyleToDomStyle(n)];},is:function(){var n=this.getName();for(var o=0;o<arguments.length;o++){if(arguments[o]==n)return true;}return false;},vL:function(){var n=this.getName(),o= !a.ga.uj[n]&&(a.ga[n]||a.ga.span);return o&&o['#'];},isIdentical:function(n){if(this.getName()!=n.getName())return false;var o=this.$.attributes,p=n.$.attributes,q=o.length,r=p.length;if(!i&&q!=r)return false;for(var s=0;s<q;s++){var t=o[s];if((!i||t.specified&&t.nodeName!='_ckf_expando')&&t.nodeValue!=n.getAttribute(t.nodeName))return false;}if(i)for(s=0;s<r;s++){t=p[s];if((!i||t.specified&&t.nodeName!='_ckf_expando')&&t.nodeValue!=o.getAttribute(t.nodeName))return false;}return true;},isVisible:function(){return this.$.offsetWidth&&this.$.style.visibility!='hidden';},hasAttributes:i&&(h.ie7Compat||h.ie6Compat)?function(){var n=this.$.attributes;for(var o=0;o<n.length;o++){var p=n[o];switch(p.nodeName){case 'class':if(this.getAttribute('class'))return true;case '_ckf_expando':continue;default:if(p.specified)return true;}}return false;}:function(){var n=this.$.attributes;return n.length>1||n.length==1&&n[0].nodeName!='_ckf_expando';},hasAttribute:function(n){var o=this.$.attributes.getNamedItem(n);return! !(o&&o.specified);},hide:function(){this.setStyle('display','none');},jg:function(n,o){var p=this.$;n=n.$;if(p==n)return;var q;if(o)while(q=p.lastChild)n.insertBefore(p.removeChild(q),n.firstChild);else while(q=p.firstChild)n.appendChild(p.removeChild(q));},show:function(){this.setStyles({display:'',visibility:''});},setAttribute:(function(){var n=function(o,p){this.$.setAttribute(o,p);return this;};if(i&&(h.ie7Compat||h.ie6Compat))return function(o,p){var q=this;if(o=='class')q.$.className=p;else if(o=='style')q.$.style.cssText=p;else if(o=='tabindex')q.$.tabIndex=p;else if(o=='checked')q.$.checked=p;else n.apply(q,arguments);return q;};else return n;})(),setAttributes:function(n){for(var o in n)this.setAttribute(o,n[o]);return this;},setValue:function(n){this.$.value=n;return this;},removeAttribute:(function(){var n=function(o){this.$.removeAttribute(o);};if(i&&(h.ie7Compat||h.ie6Compat))return function(o){if(o=='class')o='className';else if(o=='tabindex')o='tabIndex';n.call(this,o);};else return n;})(),uW:function(n){for(var o=0;o<n.length;o++)this.removeAttribute(n[o]);},removeStyle:function(n){var o=this;if(o.$.style.removeAttribute)o.$.style.removeAttribute(k.cssStyleToDomStyle(n));else o.setStyle(n,'');if(!o.$.style.cssText)o.removeAttribute('style');},setStyle:function(n,o){this.$.style[k.cssStyleToDomStyle(n)]=o;return this;},setStyles:function(n){for(var o in n)this.setStyle(o,n[o]);return this;},setOpacity:function(n){if(i&&h.version<9){n=Math.round(n*100);this.setStyle('filter',n>=100?'':'progid:DXImageTransform.Microsoft.Alpha(opacity='+n+')');}else this.setStyle('opacity',n);},unselectable:h.gecko?function(){this.$.style.MozUserSelect='none';}:h.webkit?function(){this.$.style.uE='none';}:function(){if(i||h.opera){var n=this.$,o,p=0;n.unselectable='on';while(o=n.all[p++])switch(o.tagName.toLowerCase()){case 'iframe':case 'textarea':case 'input':case 'select':break;default:o.unselectable='on';}}},vr:function(){var n=this;while(n.getName()!='html'){if(n.getComputedStyle('position')!='static')return n;n=n.getParent();}return null;},ir:function(n){var I=this;var o=0,p=0,q=I.getDocument().bH(),r=I.getDocument().$.compatMode=='BackCompat',s=I.getDocument();if(document.documentElement.getBoundingClientRect){var t=I.$.getBoundingClientRect(),u=s.$,v=u.documentElement,w=v.clientTop||q.$.clientTop||0,x=v.clientLeft||q.$.clientLeft||0,y=true;if(i){var z=s.gT().contains(I),A=s.bH().contains(I);y=r&&A|| !r&&z;}if(y){o=t.left+(!r&&v.scrollLeft||q.$.scrollLeft);o-=x;p=t.top+(!r&&v.scrollTop||q.$.scrollTop);p-=w;}}else{var B=I,C=null,D;while(B&& !(B.getName()=='body'||B.getName()=='html')){o+=B.$.offsetLeft-B.$.scrollLeft;p+=B.$.offsetTop-B.$.scrollTop;if(!B.equals(I)){o+=B.$.clientLeft||0;p+=B.$.clientTop||0;}var E=C;while(E&& !E.equals(B)){o-=E.$.scrollLeft;p-=E.$.scrollTop;E=E.getParent();}C=B;B=(D=B.$.offsetParent)?new m(D):null;}}if(n){var F=I.getWindow(),G=n.getWindow();if(!F.equals(G)&&F.$.frameElement){var H=new m(F.$.frameElement).ir(n);o+=H.x;p+=H.y;}}if(!document.documentElement.getBoundingClientRect)if(h.gecko&& !r){o+=I.$.clientLeft?1:0;p+=I.$.clientTop?1:0;}return{x:o,y:p};},scrollIntoView:function(n){var t=this;var o=t.getWindow(),p=o.eR().height,q=p* -1;if(n)q+=p;else{q+=t.$.offsetHeight||0;q+=parseInt(t.getComputedStyle('marginBottom')||0,10)||0;}var r=t.ir();q+=r.y;q=q<0?0:q;var s=o.hV().y;if(q>s||q<s-p)o.$.scrollTo(0,q);},bR:function(n){var o=this;switch(n){case a.eV:o.addClass('cke_on');o.removeClass('cke_off');o.removeClass('cke_disabled');break;case a.aY:o.addClass('cke_disabled');o.removeClass('cke_off');o.removeClass('cke_on');break;default:o.addClass('cke_off');o.removeClass('cke_on');o.removeClass('cke_disabled');break;}},getFrameDocument:function(){var n=this.$;try{n.contentWindow.document;}catch(o){n.src=n.src;if(i&&h.version<7)window.showModalDialog('javascript:document.write("<script>window.setTimeout(function(){window.close();},50);</script>")');}return n&&new l(n.contentWindow.document);},qw:function(n,o){var u=this;var p=u.$.attributes;o=o||{};for(var q=0;q<p.length;q++){var r=p[q];if(r.specified||i&&r.nodeValue&&r.nodeName.toLowerCase()=='value'){var s=r.nodeName;if(s in o)continue;var t=u.getAttribute(s);if(t===null)t=r.nodeValue;n.setAttribute(s,t);}}if(u.$.style.cssText!=='')n.$.style.cssText=u.$.style.cssText;},renameNode:function(n){var q=this;if(q.getName()==n)return;var o=q.getDocument(),p=new m(n,o);q.qw(p);q.jg(p);q.$.parentNode.replaceChild(p.$,q.$);p.$._ckf_expando=q.$._ckf_expando;q.$=p.$;},getChild:function(n){var o=this.$;if(!n.slice)o=o.childNodes[n];else while(n.length>0&&o)o=o.childNodes[n.shift()];return o?new j.bi(o):null;},iu:function(){return this.$.childNodes.length;},hX:function(){this.on('contextmenu',function(n){if(!n.data.bK().hasClass('cke_enable_context_menu'))n.data.preventDefault();});},'toString':function(){return this.getName()+'#'+this.dS()+'.'+this.getAttribute('class');}});(function(){var n={width:['border-left-width','border-right-width','padding-left','padding-right'],height:['border-top-width','border-bottom-width','padding-top','padding-bottom']};function o(p){var q=0;for(var r=0,s=n[p].length;r<s;r++)q+=parseInt(this.getComputedStyle(n[p][r])||0,10)||0;return q;};m.prototype.setSize=function(p,q,r){if(typeof q=='number'){if(r&& !(i&&h.quirks))q-=o.call(this,p);this.setStyle(p,q+'px');}};m.prototype.hR=function(p,q){var r=Math.max(this.$['offset'+k.capitalize(p)],this.$['client'+k.capitalize(p)])||0;if(q)r-=o.call(this,p);return r;};})();a.command=function(n,o){this.pW=[];this.exec=function(p){if(this.bu==a.aY||this.readOnly===false&&n.config.readOnly)return false;if(o.oD)n.focus();return o.exec.call(this,n,p)!==false;};k.extend(this,o,{iH:{qt:1},oD:true,bu:a.aS});a.event.call(this);};a.command.prototype={enable:function(){var n=this;if(n.bu==a.aY)n.bR(!n.vf||typeof n.lJ=='undefined'?a.aS:n.lJ);},disable:function(){this.bR(a.aY);},bR:function(n){var o=this;if(o.bu==n)return false;o.lJ=o.bu;o.bu=n;o.oW('bu');return true;},rJ:function(){var n=this;if(n.bu==a.aS)n.bR(a.eV);else if(n.bu==a.eV)n.bR(a.aS);}};a.event.du(a.command.prototype,true);a.config={customConfig:a.getUrl('config.js'),connectorLanguage:'java',language:'',defaultLanguage:'en',defaultViewType:'thumbnails',defaultSortBy:'filename',defaultDisplayFilename:true,defaultDisplayDate:true,defaultDisplayFilesize:true,pO:'',height:400,plugins:'foldertree,folder,filebrowser,container,connector,resource,search,toolbar,formpanel,filesview,status,contextmenu,uploadform,keystrokes,dragdrop,basket,dialog,tools,resize,maximize,help,flashupload,mobile,html5upload,gallery',extraPlugins:'',fileIcons:'ai|avi|bmp|cs|dll|doc|docx|exe|fla|gif|jpg|js|mdb|mp3|ogg|pdf|ppt|pptx|rdp|swf|swt|txt|vsd|xls|xlsx|xml|zip',removePlugins:'',tabIndex:0,thumbnailDelay:50,theme:'default',skin:'kama',width:'100%',baseFloatZIndex:10000,directDownload:false,log:false,logStackTrace:false,rememberLastFolder:true,id:null,startupPath:'',startupFolderExpanded:true,selectActionFunction:null,selectActionData:null,selectThumbnailActionFunction:null,selectThumbnailActionData:null,disableThumbnailSelection:false,thumbsUrl:null,thumbsDirectAccess:false,imagesMaxWidth:0,imagesMaxHeight:0,selectActionType:'js',resourceType:null,disableHelpButton:false,connectorPath:'',connectorInfo:'',uiColor:null,showContextMenuArrow:false,useNativeIcons:false,maxSimultaneousUploads:1,readOnly:false,selectMultiple:true};CKFinder.config=a.config;var n=a.config;a.dU=function(o,p){this.rG=o;this.message=p;};a.fs=function(o){if(o.fs)return o.fs;this.hasFocus=false;this._={application:o};return this;};a.fs.prototype={focus:function(){var p=this;if(p._.fW)clearTimeout(p._.fW);if(!p.hasFocus){if(a.nG)a.nG.fs.ly();var o=p._.application;o.container.getFirst().addClass('cke_focus');p.hasFocus=true;o.oW('focus');}},blur:function(){var o=this;if(o._.fW)clearTimeout(o._.fW);o._.fW=setTimeout(function(){delete o._.fW;o.ly();},100);},ly:function(){if(this.hasFocus){var o=this._.application;o.container.getFirst().removeClass('cke_focus');this.hasFocus=false;o.oW('blur');}}};(function(){var o={};a.lang={ko:{bg:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,en:1,eo:1,es:1,'es-mx':1,et:1,fa:1,fi:1,fr:1,gu:1,he:1,hi:1,hr:1,hu:1,it:1,ja:1,lv:1,lt:1,nb:1,nl:1,no:1,nn:1,pl:1,'pt-br':1,ro:1,ru:1,sk:1,sl:1,sr:1,sv:1,tr:1,vi:1,'zh-cn':1,'zh-tw':1},load:function(p,q,r){if(!p|| !a.lang.ko[p])p=this.jV(q,p);if(!this[p])a.scriptLoader.load(a.getUrl('lang/'+p+'.js'),function(){r(p,CKFinder.lang[p]);},this);else r(p,this[p]);},jV:function(p,q){var r=this.ko;q=q||navigator.userLanguage||navigator.language;var s=q.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),t=s[1],u=s[2];if(r[t+'-'+u])t=t+'-'+u;else if(!r[t])t=null;a.lang.jV=t?function(){return t;}:function(v){return v;};return t||p;}};})();(function(){a.log=function(){if(!n.log&& !window.CKFINDER_LOG)return;var o='';for(var p=0;p<arguments.length;p++){var q=arguments[p];if(!q)continue;if(o)o+='; ';switch(typeof q){case 'function':var r=/function (\w+?)\(/.exec(q.toString());r=r?r[1]:'anonymous func';o+=r;break;default:o+=q?q.toString():'';}}a._.log.push(o);if(typeof window.console=='object')if(!console.log.apply)console.log(o);else console.log.apply(console,arguments);};a.ba=function(o){if(n.logStackTrace)a.log('[EXCEPTION] '+o.toString());return o;};a.mZ=function(o){var p='';for(var q=0;q<a._.log.length;q++)p+=q+1+'. '+a._.log[q]+'\n';return p;};a._.log=[];})();a.scriptLoader=(function(){var o={},p={};return{load:function(q,r,s,t,u){var v=typeof q=='string';if(v)q=[q];if(!s)s=a;var w=q.length,x=[],y=[],z=function(F){if(r)if(v)r.call(s,F);else r.call(s,x,y);};if(w===0){z(true);return;}var A=function(F,G){(G?x:y).push(F);if(--w<=0)z(G);},B=function(F,G){o[F]=1;var H=p[F];delete p[F];for(var I=0;I<H.length;I++)H[I](F,G);},C=function(F){if(t!==true&&o[F]){A(F,true);return;}var G=p[F]||(p[F]=[]);G.push(A);if(G.length>1)return;var H=new m('script');H.setAttributes({type:'text/javascript',src:F});if(r)if(i)H.$.onreadystatechange=function(){if(H.$.readyState=='loaded'||H.$.readyState=='complete'){H.$.onreadystatechange=null;a.log('[LOADED] '+F);B(F,true);}};else{H.$.onload=function(){setTimeout(function(){a.log('[LOADED] '+F);B(F,true);},0);};H.$.onerror=function(){B(F,false);};}H.appendTo(u?u:a.document.getHead());};for(var D=0,E=w;D<E;D++)C(q[D]);},uq:function(q){var r=new m('script');r.setAttribute('type','text/javascript');r.appendText(q);r.appendTo(a.document.getHead());}};})();CKFinder.scriptLoader=a.scriptLoader;a.fQ=function(o,p){var q=this;q.basePath=o;q.fileName=p;q.bX={};q.loaded={};q.jn={};q._={rZ:{}};};a.fQ.prototype={add:function(o,p){if(this.bX[o])throw '[CKFINDER.fQ.add] The resource name "'+o+'" is already bX.';this.bX[o]=p||{};},eB:function(o){return this.bX[o]||null;},getPath:function(o){var p=this.jn[o];return a.getUrl(p&&p.dir||this.basePath+o+'/');},pi:function(o){var p=this.jn[o];return a.getUrl(this.getPath(o)+(p&&p.file||this.fileName+'.js'));},tR:function(o,p,q){o=o.split(',');for(var r=0;r<o.length;r++){var s=o[r];this.jn[s]={dir:p,file:q};}},load:function(o,p,q){if(!k.isArray(o))o=o?[o]:[];var r=this.loaded,s=this.bX,t=[],u={},v={};for(var w=0;w<o.length;w++){var x=o[w];if(!x)continue;if(!r[x]&& !s[x]){var y=this.pi(x);t.push(y);if(!(y in u))u[y]=[];u[y].push(x);}else v[x]=this.eB(x);}a.scriptLoader.load(t,function(z,A){if(A.length)throw '[CKFINDER.fQ.load] Resource name "'+u[A[0]].join(',')+'" was not found at "'+A[0]+'".';for(var B=0;B<z.length;B++){var C=u[z[B]];for(var D=0;D<C.length;D++){var E=C[D];v[E]=this.eB(E);r[E]=1;}}p.call(q,v);},this);}};a.plugins=new a.fQ('plugins/','plugin');var o=a.plugins;o.load=k.override(o.load,function(p){return function(q,r,s){var t={},u=function(v){p.call(this,v,function(w){k.extend(t,w);var x=[];for(var y in w){var z=w[y],A=z&&z.bM;if(A)for(var B=0;B<A.length;B++){if(!t[A[B]])x.push(A[B]);}}if(x.length)u.call(this,x);else{for(y in t){z=t[y];if(z.onLoad&& !z.onLoad.qK){z.onLoad();z.onLoad.qK=1;}}if(r)r.call(s||window,t);}},this);};u.call(this,q);};});o.rX=function(p,q,r){var s=this.eB(p);s.lang[q]=r;};(function(){var p={},q=function(r,s){var t=function(){p[r]=1;s();},u=new m('img');u.on('load',t);u.on('error',t);u.setAttribute('src',r);};a.rw={load:function(r,s){var t=r.length,u=function(){if(--t===0)s();};for(var v=0;v<r.length;v++){var w=r[v];if(p[w])u();else q(w,u);}}};})();a.skins=(function(){var p={},q={},r={},s=function(t,u,v,w){var x=p[u];if(!t.skin){t.skin=x;if(x.bz)x.bz(t);}var y=function(G){for(var H=0;H<G.length;H++)G[H]=a.getUrl(r[u]+G[H]);};if(!q[u]){var z=x.ls;if(z&&z.length>0){y(z);a.rw.load(z,function(){q[u]=1;s(t,u,v,w);});return;}q[u]=1;}v=x[v];var A=0;if(v){if(!v.iB)v.iB=[];else if(v.iB[t.name])A=1;}else A=1;if(A)w&&w();else{if(v.eb===undefined)v.eb=[];if(v.eb[t.name]===undefined)v.eb[t.name]=[];var B=v.eb[t.name];B.push(w);if(B.length>1)return;var C= !v.css|| !v.css.length,D= !v.js|| !v.js.length,E=function(){if(C&&D){v.iB[t.name]=1;for(var G=0;G<B.length;G++){if(B[G])B[G]();}}};if(!C){if(!v.rr){y(v.css);v.rr=1;}if(v.qx)for(var F=0;F<v.css.length;F++)a.oC.appendStyleSheet(v.css[F]);else t.on('themeSpace',function(G){if(G.data.space=='head')for(var H=0;H<v.css.length;H++)G.data.html+="<link rel='stylesheet' href='"+v.css[H]+"'>\n";G.removeListener();});C=1;}if(!D){y(v.js);t.scriptLoader.load(v.js,function(){D=1;E();});}E();}};return{add:function(t,u){p[t]=u;u.fh=r[t]||(r[t]=a.getUrl('skins/'+t+'/'));},loaded:p,load:function(t,u,v){var w=t.gd,x=t.fh;if(p[w]){s(t,w,u,v);var y=p[w];}else{r[w]=x;a.scriptLoader.load(x+'skin.js',function(){s(t,w,u,v);});}}};})();a.gc=new a.fQ('gc/','theme');a.bY=function(p){if(p.bY)return p.bY;this._={jZ:{},items:{},application:p};return this;};var p=a.bY;p.prototype={add:function(q,r,s){this._.items[q]={type:r,command:s.command||null,mp:Array.prototype.slice.call(arguments,2)};},create:function(q){var v=this;var r=v._.items[q],s=r&&v._.jZ[r.type],t=r&&r.command&&v._.application.cS(r.command),u=s&&s.create.apply(v,r.mp);if(t)t.pW.push(u);return u;},kd:function(q,r){this._.jZ[q]=r;}};(function(){var q=0,r=function(){var D='ckfinder'+ ++q;return a.instances&&a.instances[D]?r():D;},s={},t=function(D){var E=D.config.customConfig;if(!E)return false;var F=s[E]||(s[E]={});if(F.fn){F.fn.call(D,D.config);if(D.config.customConfig==E|| !t(D))D.cr('customConfigLoaded');}else a.scriptLoader.load(E,function(){if(CKFinder.customConfig)F.fn=CKFinder.customConfig;else F.fn=function(){};t(D);});return true;},u=function(D,E){D.on('customConfigLoaded',function(){if(E){if(E.on)for(var F in E.on)D.on(F,E.on[F]);k.extend(D.config,E,true);delete D.config.on;}v(D);});if(E&&E.id)D.config.id=E.id;if(E&&E.customConfig!=undefined)D.config.customConfig=E.customConfig;if(!t(D))D.cr('customConfigLoaded');},v=function(D){var E=D.config.skin.split(','),F=E[0],G=a.getUrl(E[1]||'skins/'+F+'/');D.gd=F;D.fh=G;D.iy='cke_skin_'+F+' skin_'+F;D.qn=D.ox();D.on('uiReady',function(){D.document.getWindow().on('lW',function(){k.setCookie('CKFinder_UTime',Math.round(new Date().getTime()/1000),true);k.setCookie('CKFinder_UId',encodeURIComponent(D.id?D.id:location.href),true);});});D.cr('configLoaded');z(D);},w=function(D,E){a.event.jP=true;D.document.on('keydown',function(F){var G=F.data,H=G.oV(),I=G.db();if(H==116||I==a.bP+82||I==a.bP+a.dy+82){D.execCommand('refresh');E.$.event&&E.$.event.keyCode&&(E.$.event.keyCode=5055);try{F.data.preventDefault();}catch(F){}}});a.event.jP=false;},x=function(D,E,F){var G=[],H,I;for(I=0;I<F.length;I++){H=F[I];G.push({evt:'onbeforeunload',bi:H.bH().$,fO:H.bH().$.onbeforeunload},{evt:'onunload',bi:H.getWindow().$,fO:H.getWindow().$.onunload},{evt:'onbeforeunload',bi:H.getWindow().$,fO:H.getWindow().$.onbeforeunload});}E.$.onunload=E.$.onbeforeunload=function(){var J;for(J=0;J<G.length;J+=1)G[J].bi[G[J].evt]=G[J].fO;};},y=function(D,E){var F=[a.oC],G,H=E.$.top.location.href.match(/ckfinder.html/)||E.$.top.name=='CKFinderpopup';if(!H)return;D.document.focus();D.focus();if(D.cg.inUrlPopup)try{F.push(new l(a.oC.getWindow().$.opener.document));}catch(I){}w(D,E);x(D,E,F);for(G=0;G<F.length;G+=1)F[G].bH().$.onbeforeunload=F[G].getWindow().$.onunload=F[G].getWindow().$.onbeforeunload=function(){var J=D.element&&D.element.getDocument().getWindow().$;if(!J.closed)J.close();};},z=function(D){a.lang.load(D.config.language,D.config.defaultLanguage,function(E,F){D.langCode=E;D.lang=k.prototypedCopy(F);D.lB=(function(){var G="['"+D.lang.DateAmPm.join("','")+"']",H=D.lang.DateTime.replace(/dd|mm|yyyy|hh|HH|MM|aa|d|m|yy|h|H|M|a/g,function(I){var J;switch(I){case 'd':J="day.replace(/^0/,'')";break;case 'dd':J='day';break;case 'm':J="month.replace(/^0/,'')";break;case 'mm':J='month';break;case 'yy':J='year.substr(2)';break;case 'yyyy':J='year';break;case 'H':J="hour.replace(/^0/,'')";break;case 'HH':J='hour';break;case 'h':J="( hour < 12 ? hour : ( ( hour - 12 ) + 100 ).toString().substr( 1 ) ).replace(/^0/,'')";break;case 'hh':J='( hour < 12 ? hour : ( ( hour - 12 ) + 100 ).toString().substr( 1 ) )';break;case 'M':J="minute.replace(/^0/,'')";break;case 'MM':J='minute';break;case 'a':J=G+'[ hour < 12 ? 0 : 1 ].charAt(0)';break;case 'aa':J=G+'[ hour < 12 ? 0 : 1 ]';break;default:J="'"+I+"'";}return "',"+J+",'";});H="'"+H+"'";H=H.replace(/('',)|,''$/g,'');return new Function('day','month','year','hour','minute','return ['+H+"].join('');");})();if(h.gecko&&h.version<10900&&D.lang.dir=='rtl')D.lang.dir='ltr';A(D);});},A=function(D){var E=D.config,F=E.plugins,G=E.extraPlugins,H=E.removePlugins;if(G){var I=new RegExp('(?:^|,)(?:'+G.replace(/\s*,\s*/g,'|')+')(?=,|$)','g');F=F.replace(I,'');F+=','+G;}if(H){I=new RegExp('(?:^|,)(?:'+H.replace(/\s*,\s*/g,'|')+')(?=,|$)','g');F=F.replace(I,'');}o.load(F.split(','),function(J){var K=[],L=[],M=[],N;if(D.config.readOnly)for(var N in J){if(J[N].readOnly===false)delete J[N];}D.plugins=J;for(N in J){var O=J[N],P=O.lang,Q=o.getPath(N),R=null;J[N].name=N;O.pathName=Q;if(P){R=k.indexOf(P,D.langCode)>=0?D.langCode:P[0];if(!O.lang[R])M.push(a.getUrl(Q+'lang/'+R+'.js'));else{k.extend(D.lang,O.lang[R]);R=null;}}L.push(R);K.push(O);}a.scriptLoader.load(M,function(){var S=['eK','bz','gr'];for(var T=0;T<S.length;T++)for(var U=0;U<K.length;U++){var V=K[U];if(T===0&&L[U]&&V.lang)k.extend(D.lang,V.lang[L[U]]);if(V[S[T]]){a.log('[PLUGIN] '+V.name+'.'+S[T]);V[S[T]](D);}}D.oW('pluginsLoaded');B(D);});});},B=function(D){a.skins.load(D,'application',function(){a.skins.load(D,'host',function(){C(D);});});},C=function(D){var E=D.config.theme;a.gc.load(E,function(){var F=D.theme=a.gc.eB(E);F.pathName=a.gc.getPath(E);D.oW('themeAvailable');});};a.application.prototype.iI=function(D){var E=m.eB(this._.element),F=this._.instanceConfig;delete this._.element;delete this._.instanceConfig;this._.ky={};this._.gS=[];E.getDocument().getWindow().$.CKFinder=D;this.element=E;this.document=null;this.rQ={};this.name=r();if(this.name in a.instances)throw '[CKFINDER.application] The instance "'+this.name+'" already exists.';this.config=k.prototypedCopy(n);this.bY=new p(this);this.fs=new a.fs(this);this.aL={};this.ld={};this.on('uiReady',function(G){var I=this;var H=I.document.getWindow();H.on('lW',I.destroy,I);if(I.cg.inPopup)y(I,H);},this);this.cg=new d(this);this.on('configLoaded',function(G){var H=this;e(H.cg,H,H.config.callback);H.id=H.config.id;},this);u(this,F);a.oW('instanceCreated',null,this);};})();k.extend(a.application.prototype,{bD:function(q,r){return this._.ky[q]=new a.command(this,r);},destroy:function(){var q=this;q.theme.destroy(q);q.oW('destroy');a.remove(q);},execCommand:function(q,r){a.log('[COMMAND] '+q);var s=this.cS(q),t={name:q,rm:r,command:s};if(s&&s.bu!=a.aY)if(this.oW('beforeCommandExec',t)!==true){t.returnValue=s.exec(t.rm);if(!s.async&&this.oW('afterCommandExec',t)!==true)return t.returnValue;}return false;},cS:function(q){return this._.ky[q];},ox:function(){var q=Math.round(new Date().getTime()/1000),r=k.getCookie('CKFinder_UTime'),s=decodeURIComponent(k.getCookie('CKFinder_UId'));if(s&&r&&s==(this.id?this.id:location.href)&&Math.abs(q-r)<5)return 1;return 0;},bs:''});(function(){var q='';for(var r=49;r<58;r++)q+=String.fromCharCode(r);for(r=65;r<91;r++){if(r==73||r==79)continue;q+=String.fromCharCode(r);}a.bs=q;a.nd="\154\x6f";a.jG="\x68\157";a.hf=new window["\x52\145\147\x45\170\160"]("\x5e\x77\167\x77\134\056");a.hg=new window["\x52\145\147\105\x78\160"]("\072\134\x64\053\x24");a.lS=function(s){return s.toLowerCase().replace(a.hf,'').replace(a.hg,'');};})();a.on('loaded',function(){var q=a.application.eb;if(q){delete a.application.eb;for(var r=0;r<q.length;r++)q[r].iI();}});delete a.dO;a.instances={};a.document=new l(document);a.oC=a.document.getWindow().$!=a.document.getWindow().$.top?new l(a.document.getWindow().$.top.document):a.document;a.add=function(q){a.instances[q.name]=q;a.jt=q;q.on('focus',function(){if(a.nG!=q){a.nG=q;a.oW('nG');}});q.on('blur',function(){if(a.nG==q){a.nG=null;a.oW('nG');}});};a.remove=function(q){delete a.instances[q.name];};a.aL={};a.eV=1;a.aS=2;a.aY=0;a.bF='';(function(){function q(t,u){return t+'.'+(u.name||u||t);};a.ld={bX:{},hS:function(t,u,v){var w=q(t,u);if(this.bX[w]!==undefined)throw '[CKFINDER] Widget '+w+' already bX!';a.log('[WIDGET] bX '+w);this.bX[w]=new s(w,v);return this.bX[w];},bz:function(t,u,v,w,x){var y=q(u,v),z=this.bX[y],A=k.deepCopy(z.hF),B=function(E,F,G){this.app=E;this.eh=F instanceof m?F:new m(F);this.hF=A?k.extend(A,G):G||{};this._={};var H=function(K){this.ib=K;};H.prototype=this.tools;this.tools=new H(this);var I=z.dT;if(I.length)for(var J=0;J<I.length;J++)I[J].call(this,E,this);};B.prototype=z;var C=new B(t,w,x);for(var D in C.fw){if(C.fw[D].readOnly&&t.config.readOnly)C.ke(D);else C.gA(D);}if(t.ld[y])throw '[CKFINDER Widget '+y+' already inited.';t.ld[y]=C;a.log('[WIDGET] instanced '+y);return C;}};var r={click:1,mouseover:1,mouseout:1,focus:1,blur:1,submit:1,dblclick:1,mousedown:1,mouseup:1,mousemove:1,keypress:1,keydown:1,keyup:1,load:1,lW:1,abort:1,error:1,resize:1,scroll:1,select:1,change:1,reset:1},s=function(t,u){var v=this;v.id=t;v.readOnly=true;v.fw={};v.hF=u||{};v.dT=[];v.tools=new v.tools(v);};s.prototype={gA:function(t){var y=this;a.log('[WIDGET] Enabling behavior '+t);var u=y.fw[t];if(!u)return;var v=y;for(var w=0;w<u.cC.length;w++){var x=u.cC[w];if(r[x])y.eh.on(x,u.fO,v);else{y.on(x,u.fO,v);y.app.on(x,u.fO,v);}}},ke:function(t){a.log('[WIDGET] Disabling behavior '+t);var u=this.fw[t];if(!u)return;for(var v=0;v<u.cC.length;v++){var w=u.cC[v];if(r[w])this.eh.removeListener(w,u.fO);else this.removeListener(w,u.fO);}},bh:function(t,u,v,w){if(!k.isArray(u))u=[u];this.fw[t]={cC:u,fO:v,readOnly:w===false};if(this.eh)this.gA(t);},removeBehavior:function(t){delete this.fw[t];},ur:function(){return this.fw;},bn:function(){return this.eh;},oE:function(){return this.hF;},data:function(){return this.hF;},tools:function(){}};s.prototype.tools.prototype={kg:function(t){if(t.target==this.ib.eh)return 1;}};a.event.du(s.prototype);})();a.xml=function(q){var r=null;if(typeof q=='object')r=q;else{var s=(q||'').replace(/&nbsp;/g,'\xa0');if(window.DOMParser)r=new DOMParser().parseFromString(s,'text/xml');else if(window.ActiveXObject){try{r=new ActiveXObject('MSXML2.DOMDocument');}catch(t){try{r=new ActiveXObject('Microsoft.XmlDom');}catch(t){}}if(r){r.async=false;r.resolveExternals=false;r.validateOnParse=false;r.loadXML(s);}}}this.mq=r;};a.xml.prototype={selectSingleNode:function(q,r){var s=this.mq;if(r||(r=s))if('selectSingleNode'in r)return r.selectSingleNode(q);else if(s.evaluate){var t=s.evaluate(q,r,null,9,null);return t&&t.singleNodeValue||null;}else if(r.querySelectorAll){var u=this.selectNodes(q,r);if(u.length==1){var t=q.match(/\/@(.*$)/);if(t)return u[0].getAttributeNode(t[1]);else return u[0];}}else alert('XPath is not supported in your browser');return null;},selectNodes:function(q,r){var s=this.mq,t=[];if(r||(r=s))if('selectNodes'in r)return r.selectNodes(q);else if(s.evaluate){var u=s.evaluate(q,r,null,5,null);if(u){var v;while(v=u.iterateNext())t.push(v);}}else if(r.querySelectorAll){var w=q.replace(/\/@(.*$)/,'[$1]').replace(/\//gi,'>');return r.querySelectorAll(w);}else alert('XPath is not supported in your browser');return t;},vB:function(q,r){var s=this.selectSingleNode(q,r),t=[];if(s){s=s.firstChild;while(s){if(s.xml)t.push(s.xml);else if(window.XMLSerializer)t.push(new XMLSerializer().serializeToString(s));s=s.nextSibling;}}return t.length?t.join(''):null;}};(function(){var q={address:1,tY:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,de:1},r={body:1,div:1,table:1,tbody:1,tr:1,td:1,th:1,caption:1,form:1},s=function(t){var u=t.getChildren();for(var v=0,w=u.count();v<w;v++){var x=u.getItem(v);if(x.type==a.cv&&a.ga.um[x.getName()])return true;}return false;};j.qS=function(t){var z=this;var u=null,v=null,w=[],x=t;while(x){if(x.type==a.cv){if(!z.qH)z.qH=x;var y=x.getName();if(i&&x.$.scopeName!='HTML')y=x.$.scopeName.toLowerCase()+':'+y;if(!v){if(!u&&q[y])u=x;if(r[y])if(!u&&y=='div'&& !s(x))u=x;else v=x;}w.push(x);if(y=='body')break;}x=x.getParent();}z.block=u;z.tX=v;z.elements=w;};})();j.qS.prototype={sJ:function(q){var r=this.elements,s=q&&q.elements;if(!s||r.length!=s.length)return false;for(var t=0;t<r.length;t++){if(!r[t].equals(s[t]))return false;}return true;}};j.text=function(q,r){if(typeof q=='string')q=(r?r.$:document).createTextNode(q);this.$=q;};j.text.prototype=new j.bi();k.extend(j.text.prototype,{type:a.fl,hJ:function(){return this.$.nodeValue.length;},getText:function(){return this.$.nodeValue;},split:function(q){var v=this;if(i&&q==v.hJ()){var r=v.getDocument().jT('');r.kB(v);return r;}var s=v.getDocument(),t=new j.text(v.$.splitText(q),s);if(h.ie8){var u=new j.text('',s);u.kB(t);u.remove();}return t;},substring:function(q,r){if(typeof r!='number')return this.$.nodeValue.substr(q);else return this.$.nodeValue.substring(q,r);}});j.pa=function(q){q=q||a.document;this.$=q.$.createDocumentFragment();};k.extend(j.pa.prototype,m.prototype,{type:a.om,kA:function(q){q=q.$;q.parentNode.insertBefore(this.$,q.nextSibling);}},true,{append:1,pd:1,getFirst:1,dB:1,appendTo:1,jg:1,insertBefore:1,kA:1,replace:1,trim:1,type:1,ltrim:1,rtrim:1,getDocument:1,iu:1,getChild:1,getChildren:1});(function(){function q(u,v){if(this._.end)return null;var w,x=this.mk,y,z=this.vR,A=this.type,B=u?'getPreviousSourceNode':'getNextSourceNode';if(!this._.start){this._.start=1;x.trim();if(x.collapsed){this.end();return null;}}if(!u&& !this._.kp){var C=x.endContainer,D=C.getChild(x.endOffset);this._.kp=function(H,I){return(!I|| !C.equals(H))&&(!D|| !H.equals(D))&&(H.type!=a.cv||H.getName()!='body');};}if(u&& !this._.ka){var E=x.startContainer,F=x.startOffset>0&&E.getChild(x.startOffset-1);this._.ka=function(H,I){return(!I|| !E.equals(H))&&(!F|| !H.equals(F))&&(H.type!=a.cv||H.getName()!='body');};}var G=u?this._.ka:this._.kp;if(z)y=function(H,I){if(G(H,I)===false)return false;return z(H);};else y=G;if(this.current)w=this.current[B](false,A,y);else if(u){w=x.endContainer;if(x.endOffset>0){w=w.getChild(x.endOffset-1);if(y(w)===false)w=null;}else w=y(w)===false?null:w.hZ(true,A,y);}else{w=x.startContainer;w=w.getChild(x.startOffset);if(w){if(y(w)===false)w=null;}else w=y(x.startContainer)===false?null:x.startContainer.hL(true,A,y);}while(w&& !this._.end){this.current=w;if(!this.lf||this.lf(w)!==false){if(!v)return w;}else if(v&&this.lf)return false;w=w[B](false,A,y);}this.end();return this.current=null;};function r(u){var v,w=null;while(v=q.call(this,u))w=v;return w;};j.gm=k.createClass({$:function(u){this.mk=u;this._={};},ej:{end:function(){this._.end=1;},next:function(){return q.call(this);},previous:function(){return q.call(this,true);},sC:function(){return q.call(this,false,true)!==false;},sD:function(){return q.call(this,true,true)!==false;},uF:function(){return r.call(this);},uB:function(){return r.call(this,true);},reset:function(){delete this.current;this._={};}}});var s={block:1,'list-item':1,table:1,'table-row-group':1,'table-header-group':1,'table-footer-group':1,'table-row':1,'table-column-group':1,'table-column':1,'table-cell':1,'table-caption':1},t={hr:1};m.prototype.qy=function(u){var v=k.extend({},t,u||{});return s[this.getComputedStyle('display')]||v[this.getName()];};j.gm.pQ=function(u){return function(v,w){return!(v.type==a.cv&&v.qy(u));};};j.gm.us=function(){return this.pQ({br:1});};j.gm.tU=function(u){},j.gm.tW=function(u,v){function w(x){return x&&x.getName&&x.getName()=='span'&&x.hasAttribute('_fck_bookmark');};return function(x){var y,z;y=x&& !x.getName&&(z=x.getParent())&&w(z);y=u?y:y||w(x);return v^y;};};j.gm.sf=function(u){return function(v){var w=v&&v.type==a.fl&& !k.trim(v.getText());return u^w;};};})();(function(){if(h.webkit){h.hc=false;return;}var q=m.kE('<div style="width:0px;height:0px;position:absolute;left:-10000px;border:1px solid;border-color:red blue;"></div>',a.document);q.appendTo(a.document.getHead());try{h.hc=q.getComputedStyle('border-top-color')==q.getComputedStyle('border-right-color');}catch(r){h.hc=false;}if(h.hc)h.cssClass+=' cke_hc';q.remove();})();o.load(n.pO.split(','),function(){a.status='loaded';a.oW('loaded');var q=a._.io;if(q){delete a._.io;for(var r=0;r<q.length;r++)a.add(q[r]);}});if(i)try{document.execCommand('BackgroundImageCache',false,true);}catch(q){}CKFinder.lang.en={appTitle:'CKFinder',common:{unavailable:'%1<span class="cke_accessibility">, unavailable</span>',confirmCancel:'Some of the options were changed. Are you sure you want to close the dialog window?',ok:'OK',cancel:'Cancel',confirmationTitle:'Confirmation',messageTitle:'Information',inputTitle:'Question',undo:'Undo',redo:'Redo',skip:'Skip',skipAll:'Skip all',makeDecision:'What action should be taken?',rememberDecision:'Remember my decision'},dir:'ltr',HelpLang:'en',LangCode:'en',DateTime:'m/d/yyyy h:MM aa',DateAmPm:['AM','PM'],FoldersTitle:'Folders',FolderLoading:'Loading...',FolderNew:'Please type the new folder name: ',FolderRename:'Please type the new folder name: ',FolderDelete:'Are you sure you want to delete the "%1" folder?',FolderRenaming:' (Renaming...)',FolderDeleting:' (Deleting...)',DestinationFolder:'Destination Folder',FileRename:'Please type the new file name: ',FileRenameExt:'Are you sure you want to change the file extension? The file may become unusable.',FileRenaming:'Renaming...',FileDelete:'Are you sure you want to delete the file "%1"?',FilesDelete:'Are you sure you want to delete %1 files?',FilesLoading:'Loading...',FilesEmpty:'The folder is empty.',DestinationFile:'Destination File',SkippedFiles:'List of skipped files:',BasketFolder:'Basket',BasketClear:'Clear Basket',BasketRemove:'Remove from Basket',BasketOpenFolder:'Open Parent Folder',BasketTruncateConfirm:'Do you really want to remove all files from the basket?',BasketRemoveConfirm:'Do you really want to remove the file "%1" from the basket?',BasketRemoveConfirmMultiple:'Do you really want to remove %1 files from the basket?',BasketEmpty:'No files in the basket, drag and drop some.',BasketCopyFilesHere:'Copy Files from Basket',BasketMoveFilesHere:'Move Files from Basket',OperationCompletedSuccess:'Operation completed successfully.',OperationCompletedErrors:'Operation completed with errors.',FileError:'%s: %e',MovedFilesNumber:'Number of files moved: %s.',CopiedFilesNumber:'Number of files copied: %s.',MoveFailedList:'The following files could not be moved:<br />%s',CopyFailedList:'The following files could not be copied:<br />%s',Upload:'Upload',UploadTip:'Upload New File',Refresh:'Refresh',Settings:'Settings',Help:'Help',HelpTip:'Help',Select:'Select',SelectThumbnail:'Select Thumbnail',View:'View',Download:'Download',NewSubFolder:'New Subfolder',Rename:'Rename',Delete:'Delete',DeleteFiles:'Delete Files',CopyDragDrop:'Copy Here',MoveDragDrop:'Move Here',RenameDlgTitle:'Rename',NewNameDlgTitle:'New Name',FileExistsDlgTitle:'File Already Exists',SysErrorDlgTitle:'System Error',FileOverwrite:'Overwrite',FileAutorename:'Auto-rename',ManuallyRename:'Manually rename',OkBtn:'OK',CancelBtn:'Cancel',CloseBtn:'Close',UploadTitle:'Upload New File',UploadSelectLbl:'Select a file to upload',UploadProgressLbl:'(Upload in progress, please wait...)',UploadBtn:'Upload Selected File',UploadBtnCancel:'Cancel',UploadNoFileMsg:'Please select a file from your computer.',UploadNoFolder:'Please select a folder before uploading.',UploadNoPerms:'File upload not allowed.',UploadUnknError:'Error sending the file.',UploadExtIncorrect:'File extension not allowed in this folder.',UploadLabel:'Files to Upload',UploadTotalFiles:'Total Files:',UploadTotalSize:'Total Size:',UploadSend:'Upload',UploadAddFiles:'Add Files',UploadClearFiles:'Clear Files',UploadCancel:'Cancel Upload',UploadRemove:'Remove',UploadRemoveTip:'Remove !f',UploadUploaded:'Uploaded !n%',UploadProcessing:'Processing...',SetTitle:'Settings',SetView:'View:',SetViewThumb:'Thumbnails',SetViewList:'List',SetDisplay:'Display:',SetDisplayName:'File Name',SetDisplayDate:'Date',SetDisplaySize:'File Size',SetSort:'Sorting:',SetSortName:'by File Name',SetSortDate:'by Date',SetSortSize:'by Size',SetSortExtension:'by Extension',FilesCountEmpty:'<Empty Folder>',FilesCountOne:'1 file',FilesCountMany:'%1 files',Kb:'%1 KB',Mb:'%1 MB',Gb:'%1 GB',SizePerSecond:'%1/s',ErrorUnknown:'It was not possible to complete the request. (Error %1)',Errors:{10:'Invalid command.',11:'The resource type was not specified in the request.',12:'The requested resource type is not valid.',102:'Invalid file or folder name.',103:'It was not possible to complete the request due to authorization restrictions.',104:'It was not possible to complete the request due to file system permission restrictions.',105:'Invalid file extension.',109:'Invalid request.',110:'Unknown error.',111:'It was not possible to complete the request due to resulting file size.',115:'A file or folder with the same name already exists.',116:'Folder not found. Please refresh and try again.',117:'File not found. Please refresh the files list and try again.',118:'Source and target paths are equal.',201:'A file with the same name is already available. The uploaded file was renamed to "%1".',202:'Invalid file.',203:'Invalid file. The file size is too big.',204:'The uploaded file is corrupt.',205:'No temporary folder is available for upload in the server.',206:'Upload cancelled due to security reasons. The file contains HTML-like data.',207:'The uploaded file was renamed to "%1".',300:'Moving file(s) failed.',301:'Copying file(s) failed.',500:'The file browser is disabled for security reasons. Please contact your system administrator and check the CKFinder configuration file.',501:'The thumbnails support is disabled.'},ErrorMsg:{FileEmpty:'The file name cannot be empty.',FileExists:'File %s already exists.',FolderEmpty:'The folder name cannot be empty.',FolderExists:'Folder %s already exists.',FolderNameExists:'Folder already exists.',FileInvChar:'The file name cannot contain any of the following characters: \n\\ / : * ? " < > |',FolderInvChar:'The folder name cannot contain any of the following characters: \n\\ / : * ? " < > |',PopupBlockView:'It was not possible to open the file in a new window. Please configure your browser and disable all popup blockers for this site.',XmlError:'It was not possible to properly load the XML response from the web server.',XmlEmpty:'It was not possible to load the XML response from the web server. The server returned an empty response.',XmlRawResponse:'Raw response from the server: %s'},Imageresize:{dialogTitle:'Resize %s',sizeTooBig:'Cannot set image height or width to a value bigger than the original size (%size).',resizeSuccess:'Image resized successfully.',thumbnailNew:'Create a new thumbnail',thumbnailSmall:'Small (%s)',thumbnailMedium:'Medium (%s)',thumbnailLarge:'Large (%s)',newSize:'Set a new size',width:'Width',height:'Height',invalidHeight:'Invalid height.',invalidWidth:'Invalid width.',invalidName:'Invalid file name.',newImage:'Create a new image',noExtensionChange:'File extension cannot be changed.',imageSmall:'Source image is too small.',contextMenuName:'Resize',lockRatio:'Lock ratio',resetSize:'Reset size'},Fileeditor:{save:'Save',fileOpenError:'Unable to open file.',fileSaveSuccess:'File saved successfully.',contextMenuName:'Edit',loadingFile:'Loading file, please wait...'},Maximize:{maximize:'Maximize',minimize:'Minimize'},Gallery:{current:'Image {current} of {total}'},Zip:{extractHereLabel:'Extract here',extractToLabel:'Extract to...',downloadZipLabel:'Download as zip',compressZipLabel:'Compress to zip',removeAndExtract:'Remove existing and extract',extractAndOverwrite:'Extract overwriting existing files',extractSuccess:'File extracted successfully.'},Search:{searchPlaceholder:'Search'}};(function(){var r=1,s=2,t=4,u=8,v=16,w=32,x=64,y=128;a.aL.Acl=function(z){var A=this;if(!z)z=0;A.folderView=(z&r)==r;A.folderCreate=(z&s)==s;A.folderRename=(z&t)==t;A.folderDelete=(z&u)==u;A.fileView=(z&v)==v;A.fileUpload=(z&w)==w;A.fileRename=(z&x)==x;A.fileDelete=(z&y)==y;};o.add('acl');})();(function(){o.add('connector',{bM:[],bz:function(s){s.on('appReady',function(){s.connector=new a.aL.Connector(s);var t=s.config.resourceType,u=t?{type:t}:null;s.connector.sendCommand('Init',u,function(v){var w;if(v.checkError())return;var x="\103\157\156\x6e\x65\x63\164\x6f\x72\057\x43\x6f\x6e\156\x65\143\x74\x6f\x72\x49\156\x66\157\057";a.ed=v.selectSingleNode(x+"\100\x73").value;a.bF=v.selectSingleNode(x+"\100\x63").value+'----';s.config.thumbsEnabled=v.selectSingleNode(x+"\x40\x74\x68\x75\155\x62\163\105\x6e\x61\x62\x6c\145\144").value=='true';s.config.thumbsDirectAccess=false;if(s.config.thumbsEnabled){w=v.selectSingleNode(x+"\x40\x74\x68\x75\155\142\x73\x55\162\x6c");if(w)s.config.thumbsUrl=w.value;w=v.selectSingleNode(x+"\x40\164\150\x75\x6d\x62\x73\104\x69\162\145\x63\164\101\143\143\145\163\163");if(w)s.config.thumbsDirectAccess=w.value=='true';w=v.selectSingleNode(x+"\x40\164\x68\165\x6d\142\x73\127\x69\144\x74\x68");s.config.thumbsWidth=(w?parseInt(w.value,10):100)||100;w=v.selectSingleNode(x+"\x40\164\150\165\155\142\163\110\x65\151\x67\150\164");s.config.thumbsHeight=(w?parseInt(w.value,10):100)||100;}s.config.imagesMaxWidth=parseInt(v.selectSingleNode(x+"\100\151\x6d\147\x57\151\x64\x74\150").value,10);s.config.imagesMaxHeight=parseInt(v.selectSingleNode(x+"\x40\151\x6d\147\110\x65\151\x67\150\x74").value,10);w=v.selectSingleNode(x+"\x40\165\x70\154\157\x61\144\115\x61\170\123\151\172\145");s.config.uploadMaxSize=w?parseInt(w.value,10):0;w=v.selectSingleNode(x+"\100\x75\x70\x6c\x6f\x61\x64\103\x68\x65\143\153\111\155\141\x67\145\x73");s.config.uploadCheckImages=w?w.value=='true':false;var y=v.selectSingleNode(x+"\x40\x70\154\165\x67\x69\156\163"),z=y&&y.value;if(z&&z.length)o.load(z.split(','),function(A){var B=[],C=[],D=[];for(var E in A){var F=A[E],G=F.lang,H=o.getPath(E),I=null;if(!s.plugins[E])s.plugins[E]=A[E];else continue;A[E].name=E;F.pathName=H;if(G){I=k.indexOf(G,s.langCode)>=0?s.langCode:G[0];if(!F.lang[I])D.push(a.getUrl(H+'lang/'+I+'.js'));else{k.extend(s.lang,F.lang[I]);I=null;}}C.push(I);B.push(F);}a.scriptLoader.load(D,function(){var J=['eK','bz','gr'];for(var K=0;K<J.length;K++)for(var L=0;L<B.length;L++){var M=B[L];if(K===0&&C[L]&&M.lang)k.extend(s.lang,M.lang[C[L]]);if(M[J[K]]){a.log('[PLUGIN] '+M.name+'.'+J[K]);M[J[K]](s);}}s.cr('uiReady');s.cr('appReady');s.oW('pluginsLoaded',{step:2,jN:s.connector});s.cr('connectorInitialized',{xml:v});});});else{s.oW('pluginsLoaded',{step:2,jN:s.connector});s.cr('connectorInitialized',{xml:v});}});});}});a.aL.Connector=function(s){this.app=s;var t=s.config.connectorLanguage||'java';if(s.config.connectorPath)this.oN=s.config.connectorPath;else this.oN=a.basePath+'core/connector/'+t+'/connector.'+t;};a.aL.Connector.prototype={ERROR_NONE:0,ERROR_CUSTOMERROR:1,ERROR_INVALIDCOMMAND:10,ERROR_TYPENOTSPECIFIED:11,ERROR_INVALIDTYPE:12,ERROR_INVALIDNAME:102,ERROR_UNAUTHORIZED:103,ERROR_ACCESSDENIED:104,ERROR_INVALIDEXTENSION:105,ERROR_INVALIDREQUEST:109,ERROR_UNKNOWN:110,ERROR_ALREADYEXIST:115,ERROR_FOLDERNOTFOUND:116,ERROR_FILENOTFOUND:117,ERROR_SOURCE_AND_TARGET_PATH_EQUAL:118,ERROR_UPLOADEDFILERENAMED:201,ERROR_UPLOADEDINVALID:202,ERROR_UPLOADEDTOOBIG:203,ERROR_UPLOADEDCORRUPT:204,ERROR_UPLOADEDNOTMPDIR:205,ERROR_UPLOADEDWRONGHTMLFILE:206,ERROR_UPLOADEDINVALIDNAMERENAMED:207,ERROR_MOVE_FAILED:300,ERROR_COPY_FAILED:301,ERROR_CONNECTORDISABLED:500,ERROR_THUMBNAILSDISABLED:501,currentFolderUrl:function(){if(this.app.aV)return this.app.aV.getUrl();},currentType:function(){if(this.app.aV)return this.app.aV.type;},currentTypeHash:function(){if(this.app.aV)return a.getResourceType(this.app.aV.type).hash;},currentResourceType:function(){return a.getResourceType(this.currentType());},sendCommand:function(s,t,u,v,w){var x=this.composeUrl(s,t,v,w),y=this;if(u)return a.ajax.loadXml(x,function(z){z.hy=y.app;y.app.oW('connectorResponse',{xml:z});u(k.extend(z,r));});else return a.ajax.loadXml(x,function(z){y.app.oW('connectorResponse',{xml:z});});},sendCommandPost:function(s,t,u,v,w,x){var y=this.composeUrl(s,t,w,x),z=this;if(!u)u={};u.CKFinderCommand=true;if(v)return a.ajax.loadXml(y,function(A){A.hy=z.app;z.app.oW('connectorResponse',{xml:A});v(k.extend(A,r));},this.composeUrlParams(u));else return a.ajax.loadXml(y,function(A){z.app.oW('connectorResponse',{xml:A});},this.composeUrlParams(u));},composeUrl:function(s,t,u,v){var z=this;var w=z.oN+'?command='+encodeURIComponent(s);if(s!='Init'){var x='';if(!v)v=z.app.aV;if(u)x=z.app.getResourceType(u).hash;else x=z.app.getResourceType(v.type).hash;w+='&type='+encodeURIComponent(u||z.app.aV.type)+'&currentFolder='+encodeURIComponent(v.getPath()||'')+'&langCode='+z.app.langCode+'&hash='+x;}if(t){var y=z.composeUrlParams(t);if(y)w+='&'+y;}if(z.app.id)w+='&id='+encodeURIComponent(z.app.id);if(z.app.config.connectorInfo)w+=(z.app.config.connectorInfo.charAt(0)!='&'?'&':'')+z.app.config.connectorInfo;return w;},composeUrlParams:function(s){if(!s)return '';var t='';for(var u in s){if(t.length)t+='&';t+=encodeURIComponent(u)+'='+encodeURIComponent(s[u]);}return t;}};var r={checkError:function(){var y=this;var s=y.getErrorNumber(),t=y.hy.connector;if(s==t.ERROR_NONE)return false;if(s=== -1)return true;var u=y.getErrorMessage();a.log('[ERROR] '+s);var v;if(s==t.ERROR_CUSTOMERROR)v=u;else{v=y.hy.lang.Errors[s];if(v)for(var w=0;w<=arguments.length;w++){var x=w===0?u:arguments[w-1];v=v.replace(/%(\d+)/,x);}else v=y.hy.lang.ErrorUnknown.replace(/%1/,s);}y.hy.msgDialog('',v);return s!=t.ERROR_UPLOADEDFILERENAMED;},getErrorNumber:function(){var s=this.selectSingleNode&&this.selectSingleNode('Connector/Error/@number');if(!s)return-1;return parseInt(s.value,10);},getErrorMessage:function(){var s=this.selectSingleNode&&this.selectSingleNode('Connector/Error/@text');if(!s)return '';return s.value;}};})();o.add('resource',{bM:['connector'],bz:function(r){r.resourceTypes=[];r.on('connectorInitialized',function(s){var t=s.data.xml.selectNodes('Connector/ResourceTypes/ResourceType');for(var u=0;u<t.length;u++){var v=t[u].attributes;r.resourceTypes.push(new a.aL.ResourceType(r,{name:v.getNamedItem('name').value,url:v.getNamedItem('url').value,hasChildren:v.getNamedItem('hasChildren').value,allowedExtensions:v.getNamedItem('allowedExtensions').value,deniedExtensions:v.getNamedItem('deniedExtensions').value,acl:v.getNamedItem('acl').value,hash:v.getNamedItem('hash').value,maxSize:v.getNamedItem('maxSize').value}));}r.cr('resourcesReceived',{hK:r.resourceTypes});});r.getResourceType=function(s){for(var t=0;t<this.resourceTypes.length;t++){var u=this.resourceTypes[t];if(u.name==s)return u;}return null;};}});(function(){a.aL.ResourceType=function(s,t){var u=this;u.app=s;u.name=t.name;u.url=t.url;u.hasChildren=t.hasChildren==='true';u.defaultView='Thumbnails';u.allowedExtensions=t.allowedExtensions;u.deniedExtensions=t.deniedExtensions;u.oT=r(t.allowedExtensions);u.ms=r(t.deniedExtensions);u.nS=t.acl;u.hash=t.hash;u.maxSize=t.maxSize;};a.aL.ResourceType.prototype={isExtensionAllowed:function(s){var t=this;s=s.toLowerCase();return(t.deniedExtensions.length===0|| !t.ms[s])&&(t.allowedExtensions.length===0|| ! !t.oT[s]);},allowedExtensions:function(){return this.allowedExtensions;},getRootFolder:function(){for(var s=0;s<this.app.folders.length;s++){var t=this.app.folders[s];if(t.isRoot&&t.type==this.name)return t;}return undefined;}};function r(s){var t={};if(s.length>0){var u=s.toLowerCase().split(',');for(var v=0;v<u.length;v++)t[u[v]]=true;}return t;};})();(function(){var r=function(s){this.app=s;};r.prototype.er=function(s,t){var x=this;if(x.id)return;x.toolbarId='cke_'+k.getNextNumber();x.id='cke_'+k.getNextNumber();x.placeholderId='cke_'+k.getNextNumber();var u={id:x.id,placeholderId:x.placeholderId,lastTimeout: -1,app:s},v=k.addFunction(s.search.doSearch,u),w=k.addFunction(s.search.onFocus,u);t.push('<span class="cke_search_box" id="',x.toolbarId,'" class="cke_toolbar" role="presentation"><span class="cke_toolbar_start"></span>');t.push('<input id="'+x.id+'" ');t.push(' onkeyup="window.parent.CKFinder._.callFunction(',v,', this);"');t.push(' oninput="window.parent.CKFinder._.callFunction(',v,', this);"');t.push(' onfocus="window.parent.CKFinder._.callFunction(',w,', this);"');t.push('>');t.push('<span id="'+x.placeholderId+'" class="cke_search_placeholder" onclick="window.parent.CKFinder._.callFunction(',w,', this);">'+s.lang.Search.searchPlaceholder+'</span>');t.push('<span class="cke_toolbar_end"></span></span>');};r.prototype.doSearch=function(){var s=this.app.ld['filesview.filesview'].oE().shownFiles.length,t=this.app.document.getById(this.id).getValue(),u=this.app;if(this.lastTimeout){clearTimeout(this.lastTimeout);this.lastTimeout=null;}if(s<200)u.ld['filesview.filesview'].oW('requestRenderFiles',{lookup:t});else this.lastTimeout=setTimeout(function(){u.ld['filesview.filesview'].oW('requestRenderFiles',{lookup:t});},1000);};r.prototype.onFocus=function(){var s=this;s.app.document.getById(s.placeholderId).setStyle('display','none');s.app.document.getById(s.id).$.focus();};r.prototype.reset=function(){var s=this;s.app.document.getById(s.id).setValue('');s.app.document.getById(s.placeholderId).setStyle('display','inline');};o.add('search',{bM:['foldertree'],eK:function(s){s.search=new r(s);},bz:function(s){s.on('appReady',function(){s.ld['foldertree.foldertree'].on('beforeSelectFolder',function(){s.search.reset();});s.ld['formpanel.formpanel'].on('afterUploadFile',function(){s.search.reset();});});}});})();(function(){var r={iz:/[\\\/:\*\?"<>\|]/};o.add('folder',{bM:['resource','connector','acl'],bz:function(v){v.folders=t(v);v.aV=null;v.on('resourcesReceived',function B(w){var x=[],y=w.data.hK;for(var z=0;z<y.length;z++){var A=y[z];x.push(new a.aL.Folder(v,A.name,A.name,A.hasChildren,A.nS));x[x.length-1].isRoot=true;}v.oW('requestAddFolder',{folders:x},function K(){var C=v.config.startupPath||'',D=0,E='',F='';if(v.config.rememberLastFolder){var G=v.id?'CKFinder_Path_'+v.id:'CKFinder_Path';E=decodeURIComponent(k.getCookie(G))||'';}if(C&& !v.qn){F=C;D=1;}else if(E)F=E;else if(C)F=C;else if(v.resourceTypes.length)F=v.resourceTypes[0].name+'/';if(F){a.log('[FOLDER] Opening startup path: '+F);var H=F.split(':');if(!v.getResourceType(H[0])||H.length<2)H=[v.resourceTypes[0].name,'/'];var I=v.ld['foldertree.foldertree'],J=/(.*\/)(.*)$/.exec(H[1]);I.tools.jL(H[0],J[1],function N(L){if(!L)return;a.log('[FOLDER] Opening startup folder: ',L);var M= !D&&(H[2]=='1'||H[2]===undefined);if(M&&v.config.startupFolderExpanded===false)M=0;I.oW('requestSelectFolder',{folder:L,expand:M,file:J[2]&&L.type==H[0]&&L.getPath()==J[1]?J[2]:''});});}});});v.bD('RemoveFolder',{readOnly:false,exec:function(w){var x=w.aV;if(x){if(x.isRoot|| !x.acl.folderDelete)return;w.fe('',w.lang.FolderDelete.replace('%1',x.name),function(){w.oW('requestProcessingFolder',{folder:x});x.remove();});}}});v.bD('CreateSubFolder',{readOnly:false,exec:function(w){var x=w.aV;if(x)w.hs(w.lang.NewNameDlgTitle,w.lang.FolderRename,'',function(y){y=k.trim(y);if(y)try{w.oW('requestProcessingFolder',{folder:x});x.createNewFolder(y);}catch(z){if(z instanceof a.dU){w.oW('requestRepaintFolder',{folder:x});w.msgDialog('',z.message);}else throw z;}});}});v.bD('RenameFolder',{readOnly:false,exec:function(w){var x=w.aV;if(x){if(x.isRoot|| !x.acl.folderRename)return;w.hs(w.lang.RenameDlgTitle,w.lang.FolderRename,w.aV.name,function(y){y=k.trim(y);if(y)try{x.rename(y);}catch(z){if(z instanceof a.dU){w.oW('requestRepaintFolder',{folder:x});w.msgDialog('',z.message);}else throw z;}});}}});if(v.eU){v.dZ('folder0',99);v.dZ('folder1',100);v.dZ('folder2',101);v.dZ('folder3',102);v.eU({createSubFolder:{label:v.lang.NewSubFolder,command:'CreateSubFolder',group:'folder1'},renameFolder:{label:v.lang.Rename,command:'RenameFolder',group:'folder1'},removeFolder:{label:v.lang.Delete,command:'RemoveFolder',group:'folder2'}});}}});a.aL.Folder=function(v,w,x,y,z){var A=this;A.app=v;A.type=w||'';A.name=x||'';A.hasChildren=y==undefined||y===null?true: ! !y;A.isRoot=false;A.isOpened=false;A.parent=null;A.isDirty=false;A.acl=new a.aL.Acl(z);A.index=t(v).push(A)-1;A.childFolders=null;};function s(v,w,x,y,z){if(v.childFolders===null)v.childFolders=[];var A=new a.aL.Folder(v.app,w,x,y,z);A.parent=v;A.nh=v.isRoot?0:v.nh+1;v.childFolders.push(A);return A;};function t(v){v.folders||(v.folders=[]);return v.folders;};a.aL.Folder.prototype={getPath:function(){var v=this,w=v.isRoot?'/':v.name;while(v.parent){v=v.parent;w=v.isRoot?'/'+w:v.name+'/'+w;}return v!=this?w+'/':w;},getUrl:function(){var v=this,w='';while(v){w=v.isRoot?this.app.getResourceType(v.type).url+w:encodeURIComponent(v.name)+'/'+w;v=v.parent;}return w;},getUploadUrl:function(){return this.app.connector.composeUrl('FileUpload',{},this.type,this);},getResourceType:function(){return this.app.getResourceType(this.type);},updateReference:function(){var w=this;if(w.app.folders[w.index]==w)return w;for(var v=0;v<w.parent.childFolders.length;v++){if(w.parent.childFolders[v].name==w.name)return w.parent.childFolders[v];}return undefined;},getChildren:function(v,w){var x=this,y=x.childFolders;if(x.hl&& !w){a.log('[FOLDER] getChildrenLock active, defering callback...');x.app.oW('requestLoadingFolder',{folder:x});var z=100;setTimeout(function(){if(!x.hl)v(y);else if(z<=3000)setTimeout(arguments.callee,z*=2);else{a.log('[FOLDER] TIMEOUT for getChildrenLock defered callback!');x.hl=false;x.getChildren(v);}});return undefined;}if(y&& !x.isDirty&& !w){v(y);return y;}x.hl=true;if(x.isDirty&&y){a.log('[FOLDER] Clearing folder children cache.');for(var A=0;A<y.length;A++)delete x.app.folders[y[A].index];}x.app.oW('requestLoadingFolder',{folder:x});this.app.connector.sendCommand('GetFolders',null,function(B){if(B.checkError()){x.app.oW('requestRepaintFolder',{folder:x});return;}var C=B.selectSingleNode('Connector/@resourceType').value;x.hm=true;var D=B.selectNodes('Connector/Folders/Folder'),E=[];x.childFolders=null;for(var F=0;F<D.length;F++){var G=D[F].attributes.getNamedItem('name').value,H=D[F].attributes.getNamedItem('hasChildren').value=='true',I=parseInt(D[F].attributes.getNamedItem('acl').value,10);E.push(s(x,C,G,H,I));}x.hasChildren= ! !D.length;x.isDirty=false;x.hl=null;x.app.oW('requestRepaintFolder',{folder:x});v(E);},x.type,x);return null;},mapLoadedDescendants:function(v){if(!this.childFolders)return;for(var w=0;w<this.childFolders.length;w++){var x=this.childFolders[w];x.mapLoadedDescendants(v);v(x);}},select:function(){this.app.oW('requestSelectFolder',{folder:this});},isSelected:function(){return this.app.aV&&this==this.app.aV;},deselect:function(){this.app.oW('requestSelectFolder');},open:function(v){if(v&& !this.hm)return;this.app.oW('requestExpandFolder',{folder:this});},close:function(){this.app.oW('requestExpandFolder',{folder:this,collapse:1});},hU:function(){var v=1,w=this;while(w){v++;w=w.parent;}return v;},toggle:function(){var v=this;if(!v.hasChildren)return;if(v.isOpened)v.close();else v.open();},createNewFolder:function(v){u(v,this.app);var w=this;w.isDirty=true;w.app.connector.sendCommandPost('CreateFolder',{NewFolderName:v},null,function(x){if(x.checkError()){w.app.oW('requestRepaintFolder',{folder:w});return;}w.hasChildren=true;w.app.oW('afterCommandExecDefered',{name:'CreateFolder',ip:w,uv:v});},this.type,this);},rename:function(v){u(v,this.app);var w=this;this.app.oW('requestProcessingFolder',{folder:w});w.parent.isDirty=true;if(w.name==v){w.app.oW('requestRepaintFolder',{folder:w});return;}w.app.connector.sendCommandPost('RenameFolder',{NewFolderName:v},null,function(x){if(x.checkError()){w.app.oW('requestRepaintFolder',{folder:w});return;}w.parent.isDirty=false;w.name=x.selectSingleNode('Connector/RenamedFolder/@newName').value;w.app.oW('requestRepaintFolder',{folder:w});},this.type,this);},remove:function(){var v=this;v.deselect();v.parent.isDirty=true;this.app.oW('requestProcessingFolder',{folder:v});v.app.connector.sendCommandPost('DeleteFolder',null,null,function(w){if(w.checkError()){v.app.oW('requestRepaintFolder',{folder:v});return;}v.app.oW('requestRemoveFolder',{folder:v},function(){var x=k.indexOf(v.parent.childFolders,v),y=v.index,z=v.parent,A=v.app;z.childFolders[x].mapLoadedDescendants(function(B){A.folders[B.index].isDeleted=true;delete A.folders[B.index];});z.childFolders.splice(x,1);A.folders[y].isDeleted=true;delete A.folders[y];if(z.childFolders.length===0){z.childFolders=null;z.hasChildren=false;}if(v.releaseDomNodes)v.releaseDomNodes();A.oW('afterCommandExecDefered',{name:'RemoveFolder',ip:z,uN:y,folder:v});});},this.type,this);},'toString':function(){return this.getPath();}};function u(v,w){if(!v||v.length===0)throw new a.dU('name_empty',w.lang.ErrorMsg.FolderEmpty);if(r.iz.test(v))throw new a.dU('name_invalid_chars',w.lang.ErrorMsg.FolderInvChar);return true;};})();(function(){var r='<a href="javascript:void(0)" class="dropdown">鈻</a>';o.add('foldertree',{bM:['folder'],onLoad:function z(){s();t();},bz:function B(z){var A=this;z.on('themeSpace',function D(C){if(C.data.space=='sidebar')C.data.html+="<div id='folders_view' class='view widget' tabindex='0'><h2 id='folders_view_label'>"+z.lang.FoldersTitle+'</h2>'+"<div class='folder_tree_wrapper wrapper'>"+"<div class='selection'></div>"+"<ul class='folder_tree no_list' role='tree navigation' aria-labelledby='folders_view_label'>"+'</ul>'+'</div>'+'</div>';});z.on('uiReady',function F(C){if(!z.config.showContextMenuArrow)r='';var D=z.document.getById('folders_view');D.hX();h.opera&&D.on('dblclick',function(G){G.data.preventDefault();});var E=a.ld.bz(z,'foldertree',A,D);if(z.bj){z.bj.lX(D);z.bj.kh(function O(G,H){if(G.dS()=='folders_view')return undefined;var I=true;if(z.aV){var J=z.aV.liNode().dS();if(G.dS()===J||G.getParent().dS()===J)I=false;}if(I){z.oW('requestSelectFolder',{folder:null});z.oW('requestSelectFolder',{folder:G});}var K=z.aV;if(K&& !z.config.readOnly){var L=K.acl,M=K.isRoot,N={createSubFolder:L.folderCreate?a.aS:a.aY,renameFolder: !M&&L.folderRename?a.aS:a.aY,removeFolder: !M&&L.folderDelete?a.aS:a.aY};E.oW('beforeContextMenu',{bj:N,folder:K});return N;}},D);}});z.bD('foldertreeFocus',{exec:function(C){var D=C.layout.pS(),E=C.ld['foldertree.foldertree'],F=E.tools.ew;D.focus();F&&F.focus();}});}});function s(){var z=a.ld.hS('foldertree','foldertree');z.dT.push(function(){var B=this.bn();if(!B.hasClass('view'))B=B.getParent();k.mH(B);});z.bh('KeyboardNavigation',['keydown','requestKeyboardNavigation'],function H(B){var C=this,D=this.tools.cq(B),E=0;if(B.data&&B.data.bK){var F=B.data.bK();E=F.$==C.bn().$;}if(!D&& !E)return;var G=k.extend({},B.data,{folder:D},true);this.oW('beforeKeyboardNavigation',G,function O(I,J){if(I)return;try{var K=B.data.db();if(E&&K>=37&&K<=40){var L=C.app.folders[0];if(L)this.tools.cT(L);}else{var M;if(K==38){B.data.preventDefault();M=D.liNode();if(M.gE()){var N=this.tools.cq(M.cf());while(N.isOpened&&N.hasChildren){if(N.childFolders.length)N=N.childFolders[N.childFolders.length-1];else break;}this.tools.cT(N);}else if(!D.isRoot)this.tools.cT(D.parent);}else if(K==39&&D.hasChildren){if(D.isOpened)D.getChildren(function(P){C.tools.cT(P[0]);});else this.oW('requestExpandFolder',{folder:D});}else if(K==40){B.data.preventDefault();M=D.liNode();if(D.isOpened&&D.hasChildren)D.getChildren(function(P){C.tools.cT(P[0]);});else if(M.ge())this.tools.cT(this.tools.cq(M.dG()));else if(!D.isRoot&&D.parent)(function(P){var Q=P.liNode();if(Q.ge())C.tools.cT(C.tools.cq(Q.dG()));else if(P.parent)arguments.callee(P.parent);})(D.parent);}else if(K==37){if(D.isOpened)this.oW('requestExpandFolder',{folder:D,collapse:1});else if(!D.isRoot&&D.parent)this.tools.cT(D.parent);}else if(K==46){C.app.oW('requestSelectFolder',{folder:D});C.app.execCommand('RemoveFolder');}else if(K==113){C.app.oW('requestSelectFolder',{folder:D});C.app.execCommand('RenameFolder');}}this.oW('successKeyboardNavigation',J);this.oW('afterKeyboardNavigation',J);}catch(P){P=a.ba(P);this.oW('failedKeyboardNavigation',J);this.oW('afterKeyboardNavigation',J);throw P;}});});z.dT.push(function(B,C){B.on('afterCommandExecDefered',function(D){if(!D.data)return;var E=D.data.folder;if(D.data.name=='RemoveFolder'){if(E==C.tools.ew){C.tools.cT();C.bn().focus();}var F=B.ld['filesview.filesview'].tools.folder,G=E==F;E.mapLoadedDescendants(function(H){if(F==E)G=true;});C.oW('requestSelectFolder',{folder:E.parent,expand:G});}else if(D.data.name=='RenameFolder')if(E==C.tools.ew)E.focus();});});z.bh('RemoveFolder','requestRemoveFolder',function F(B){var C=this,D=this.tools.cq(B),E=k.extend({},B.data,{folder:D},true);this.oW('beforeRemoveFolder',E,function I(G,H){var J=this;if(G)return;try{D.liNode().remove();J.oW('successRemoveFolder',H);J.oW('afterRemoveFolder',H);}catch(K){J.oW('failedRemoveFolder',H);J.oW('afterRemoveFolder',H);throw a.ba(K);}});},false);z.bh('LoadingFolder','requestLoadingFolder',function F(B){var C=this,D=this.tools.cq(B);if(!D)return undefined;var E=k.extend({},B.data,{folder:D},true);this.oW('beforeLoadingFolder',E,function J(G,H){if(G)return;var I=H.folder;try{this.on('afterExpandFolder',function(K){if(K.data&&K.data.folder==I){K.removeListener();var L=I.childrenRootNode().getChild(0);if(L&&L.hasClass('loading')){L.remove();this.oW('requestRepaintFolder',{folder:I});H.step=2;C.oW('successLoadingFolder',H);C.oW('afterLoadingFolder',H);}}},null,null,1);if(I.childrenRootNode())I.childrenRootNode().setHtml('<li class="loading">'+C.app.lang.FolderLoading+'</li>');this.oW('requestProcessingFolder',{folder:I});H.step=1;this.oW('successLoadingFolder',H);}catch(K){this.oW('failedLoadingFolder',H);this.oW('afterLoadingFolder',H);throw a.ba(K);}});return undefined;});z.bh('ProcessingFolder',['requestProcessingFolder'],function C(B){B.result=this.oW('beforeProcessingFolder',B.data,function H(D,E){var I=this;if(D)return;try{var F=I.tools.cq(E.folder),G=F.aNode();G.addClass('processing');I.oW('successProcessingFolder',E);I.oW('afterProcessingFolder',E);}catch(J){J=a.ba(J);I.oW('failedProcessingFolder',E);I.oW('afterProcessingFolder',E);throw J;}});});z.bh('RepaintFolder',['requestRepaintFolder'],function C(B){this.oW('beforeRepaintFolder',B.data,function L(D,E){var M=this;if(D)return undefined;try{var F=M.tools.cq(E.folder),G=F.liNode(),H=F.expanderNode(),I=F.aNode(),J=F.childrenRootNode(),K=F.name;if(I.getHtml()!=K)I.setHtml(k.htmlEncode(F.name));I.removeClass('processing');if(!F.hasChildren){G.removeClass('openable');G.removeClass('closable');G.addClass('nochildren');H.removeAttribute('aria-expanded');if(J.$.hasChildNodes())J.setHtml('');}else if(F.hasChildren)if(J.$.hasChildNodes()){G.addClass('closable');G.removeClass('openable');H.setAttribute('aria-expanded','true');}else{G.addClass('openable');G.removeClass('closable');H.removeAttribute('aria-expanded');}M.oW('successRepaintFolder');M.oW('afterRepaintFolder');}catch(N){M.oW('failedRepaintFolder');M.oW('afterRepaintFolder');throw a.ba(N);}return undefined;});});z.dT.push(function(B,C){B.on('afterCommandExecDefered',function(D){if(D.data&&D.data.name=='RemoveFolder')C.oW('requestRepaintFolder',{folder:D.data.ip});});});z.bh('AddFolder','requestAddFolder',function E(B){var C=this,D={folders:B.data.folder?[B.data.folder]:B.data.folders,root:B.data.root};this.oW('beforeAddFolder',D,function O(F,G){if(F)return;var H=G.folders,I=G.root?this.tools.cq(G.root):null,J,K;try{if(I){if(I.hasChildren===false)I.liNode().addClass('nochildren');else{I.liNode().removeClass('nochildren');J=v(H,u);I.childrenRootNode().appendHtml(J);}}else{var L={};for(var M=0;M<H.length;M++){K=H[M].parent?H[M].parent.index: -1;if(!L[K])L[K]=[];L[K].push(H[M]);}for(var N in L){J=v(L[N],u);if(N== -1)this.tools.kI().appendHtml(J);else{K=this.tools.cq(N);K.liNode().removeClass('nochildren');K.childrenRootNode().appendHtml(J);}}if(1==a.bs.indexOf(a.bF.substr(1,1))%5&&a.lS(window.top[a.nd+"\x63\x61\164\151\x6f\x6e"][a.jG+"\163\x74"])!=a.lS(a.ed)||a.bF.substr(3,1)!=a.bs.substr((a.bs.indexOf(a.bF.substr(0,1))+a.bs.indexOf(a.bF.substr(2,1)))*9%(a.bs.length-1),1))setTimeout(function(){C.app.layout.ea();},100);}this.oW('successAddFolder');this.oW('afterAddFolder');}catch(P){this.oW('failedAddFolder');this.oW('afterAddFolder');throw a.ba(P);}});});z.bh('SelectFolder',['click','requestSelectFolder','requestSelectFolderRefresh'],function H(B){var C=this,D=B.name=='click',E=D&&B.data.bK();if(this.tools.kg(B))return;var F=this.tools.cq(B);if(D)if(E.hasClass('dropdown')){B.jN.oW('contextmenu',B.data);B.cancel();return;}if(D||B.name=='requestSelectFolder'){if(D&& !F)return;if(D&&F.aNode()&&F.aNode().$!=E.$)return;var G=k.extend({jR:1,expand:0},B.data,{folder:F},true);this.oW('beforeSelectFolder',G,function M(I,J){if(I)return undefined;var K=J.folder;try{if(this.app.aV&&(!K||K!=this.app.aV)){var L=this.app.aV.liNode();if(L)L.removeClass('selected');C.tools.hk().mc();this.app.aV=null;}if(K){if(D)this.tools.cT(K);if(J.expand)C.oW('requestExpandFolder',{folder:K});K.liNode().addClass('selected');this.app.aV=K;C.tools.hk().select(K.aNode());if(J.jR){C.oW('requestProcessingFolder',{folder:K});C.tools.mV(K,1);C.app.oW('requestShowFolderFiles',{folder:K,mw:J.file},function(N,O){if(O.ib)O.ib.on('afterShowFolderFiles',function(P){if(P.data.folder==K){P.removeListener();C.oW('requestRepaintFolder',{folder:K});}});});}this.oW('successSelectFolder');this.oW('afterSelectFolder');return K;}this.oW('successSelectFolder');this.oW('afterSelectFolder');return undefined;}catch(N){this.oW('failedSelectFolder');this.oW('afterSelectFolder');throw a.ba(N);}});}else if(B.name=='requestSelectFolderRefresh')this.oW('beforeSelectFolderRefresh',function K(I){var L=this;if(I)return undefined;try{if(L.app.aV){var J=L.app.aV.aNode();if(J)L.tools.hk().select(J);else{L.tools.hk().mc();L.oW('failedSelectFolderRefresh');}}else L.oW('successSelectFolderRefresh');L.oW('afterSelectFolderRefresh');return F;}catch(M){L.oW('failedSelectFolderRefresh');L.oW('afterSelectFolderRefresh');throw a.ba(M);}});});z.dT.push(function(B,C){C.on('afterExpandFolder',function(){C.oW('requestSelectFolderRefresh');},null,null,999);C.on('successRemoveFolder',function(){C.oW('requestSelectFolderRefresh');});C.on('successLoadingFolder',function(D){if(D.data.step==1)C.oW('requestSelectFolderRefresh');});});z.bh('ExpandFolder',['click','requestExpandFolder'],function H(B){var C=this,D=B.name=='click',E=D&&B.data.bK();if(this.tools.kg(B))return;if(D&& !E.hasClass('expander'))return;var F=this.tools.cq(B),G=k.extend({collapse:0},B.data,{folder:F,hE:D},true);this.oW('beforeExpandFolder',G,function R(I,J){if(I)return undefined;try{var K=J.folder,L=K.liNode(),M=K.expanderNode();if(!K.acl.folderView){C.app.msgDialog('',C.app.lang.Errors['104']);throw '[CKFINDER] No permissions to view folder.';}if(K.hasChildren){var N=J.hE&&L.hasClass('openable'),O= !J.hE&& !J.collapse&& !L.hasClass('closable'),P= !J.hE&& !J.collapse&&L.hasClass('closable'),Q= !J.collapse&&J.force;if(N||O||Q){L.removeClass('openable');L.addClass('closable');M.setAttribute('aria-expanded','true');K.getChildren(function(S){if(S){C.oW('requestAddFolder',{folders:S,root:K});K.isOpened=true;}else{C.oW('requestRepaintFolder',{folder:K});K.isOpened=false;}J.step=2;C.oW('successExpandFolder',J);C.oW('afterExpandFolder',J);});J.step=1;C.oW('successExpandFolder',J);}else if(J.hE|| !J.hE&&J.collapse){L.removeClass('closable');L.addClass('openable');M.setAttribute('aria-expanded','false');K.childrenRootNode().setHtml('');K.isOpened=false;if(K.hm)K.getChildren(function(S){K.mapLoadedDescendants(function(T){T.releaseDomNodes();});C.oW('successExpandFolder',J);C.oW('afterExpandFolder',J);});else{this.oW('requestRepaintFolder',{folder:K});this.oW('failedExpandFolder');this.oW('afterExpandFolder');}}else if(P){C.oW('successExpandFolder',J);C.oW('afterExpandFolder',J);}}else{this.oW('failedExpandFolder');this.oW('afterExpandFolder');}return K;}catch(S){this.oW('failedExpandFolder');this.oW('afterExpandFolder');throw a.ba(S);}});});z.dT.push(function(B,C){B.on('afterCommandExecDefered',function(D){if(D.data&&D.data.name=='CreateFolder')C.oW('requestExpandFolder',{folder:D.data.ip,force:1});});});z.tools.jL=function I(B,C,D){var E=this.ib,F=this.ib.app.getResourceType(B).getRootFolder(),G=F,H=C=='/'?[]:C.split('/').slice(1);if(H[H.length-1]==='')H=H.slice(0,-1);if(H.length===0){D(F);return;}E.on('successExpandFolder',function(J){if(J.data.step!=2)return;var K=J.data.folder;if(K!=G)return;var L=H.shift();for(var M=0;M<K.childFolders.length;M++){var N=K.childFolders[M];if(N.name==L)if(H.length===0){J.removeListener();D(N);return;}else{G=N;E.oW('requestExpandFolder',{folder:N});}}});E.oW('requestExpandFolder',{folder:F});};z.tools.cq=function(B){var G=this;var C,D=0;if(B.data&&B.data.folder instanceof m){B=B.data.folder;D=1;}else if(B.data&&B.data.bK){B=B.data.bK();D=1;}else if(B instanceof j.bi)D=1;if(D){var E=B;while(E&& !E.is('li')){if(E==G.ib.eh)break;E=E.getParent();}if(E&&E.is('li')){var F=E.dS();if(F)C=G.ib.app.folders[F.slice(1)];}}else if(typeof B=='number')C=G.ib.app.folders[B];else if(typeof B=='string')C=G.ib.app.folders[E.dS().slice(1)];else if(B.data&&B.data.folder instanceof a.aL.Folder)C=B.data.folder;else if(B.data&&B.data.folders&&B.data.folders.length&&B.data.folders[0]instanceof a.aL.Folder)C=B.data.folders[0];else if(B instanceof a.aL.Folder)C=B;return C;};z.tools.mV=function(B,C){var D=B.type,E=B.getPath(),F=this.ib.app.id;C=C===undefined?B.isOpened: ! !C+1-1;k.setCookie(F?'CKFinder_Path_'+F:'CKFinder_Path',encodeURIComponent(D+':'+E+':'+C));};function A(B){this.ib=B;this.bi=B.tools.kI().cf();};A.prototype={select:function(B){this.bi.setStyles({height:B.$.offsetHeight+'px',top:B.$.offsetTop+'px',display:'block'});},mc:function(B){this.bi.setStyles({display:'none'});},ie6FixParentNode:function(){var B=this;if(!B.kv)B.kv=B.ib.app.document.getById('folders_view').getChild(1);return B.kv;}};z.tools.hk=function(){var B=this.ib.oE();if(!B.la)B.la=new A(this.ib);return B.la;};z.tools.kI=function(){var B=this;if(!B.kW)B.kW=y(x(B.ib.bn().getChild(1).$.childNodes,'ul'));return B.kW;};z.tools.cT=function(B){var C=this;if(B){if(C.ew)C.ew.blur();else C.ib.bn().setAttribute('tabindex',-1);C.ew=B;B.focus();}else{delete C.ew;C.ib.bn().setAttribute('tabindex',0);}};};function t(){k.extend(a.aL.Folder.prototype,{liNode:function(){var A=this;if(A.iC===undefined){var z=A.app.document.getById('f'+A.index);if(z)A.iC=z;}return A.iC;},aNode:function(){var A=this;if(A.dM===undefined){var z=A.liNode();if(z)A.dM=y(x(z.$.childNodes,'a'));}return A.dM;},expanderNode:function(){var A=this;if(A.iR===undefined){var z=A.liNode();if(z)A.iR=y(x(z.$.childNodes,'span'));}return A.iR;},childrenRootNode:function(){var A=this;if(A.iM===undefined){var z=A.liNode();if(z)A.iM=y(x(z.$.childNodes,'ul'));}return A.iM;},releaseDomNodes:function(){var z=this;delete z.iC;delete z.dM;delete z.iR;delete z.iM;},focus:function(){var z=this.aNode();if(z){z.setAttribute('tabindex',0);z.focus();}},blur:function(){var z=this.aNode();if(z)this.aNode().setAttribute('tabindex',-1);}});};function u(z){var A=z.hasChildren?'':' nochildren',B='f'+z.index,C=z.hasChildren?' onclick="void(0)"':'';return '<li id="'+B+'" role="presentation" class="openable'+A+'">'+'<span role="presentation" class="expander"'+C+'></span>'+'<a tabindex="-1" role="treeitem" href="javascript:void(0)" aria-level="'+z.hU()+'">'+k.htmlEncode(z.name)+'</a>'+(z.isBasket?'':r)+'<ul></ul>'+'</li>';};function v(z,A){var B='';for(var C=0;C<z.length;C++)B+=A(z[C]);return B;};function w(z,A){for(var B in z){if(A(z[B])!==undefined)return z[B];}return undefined;};function x(z,A,B){return w(z,function(C){if(C.tagName&&C.tagName.toLowerCase()==A&& !B--)return C;});};function y(z){return new m(z);};})();(function(){var r,s={fX:/[^\.]+$/,iz:/[\\\/:\*\?"<>\|]/},t='<span class="dropdown">鈻</span>',u='<a href="javascript:void(0)" class="dropdown">鈻</a>';function v(M){return a.bs.substr(M*9%(2<<4),1);};var w=["<table class='files_details' role='region' aria-controls='status_view'>",'<tbody>','</tbody>','</table>'],x=['Node',"\x6d\x65\163\163\x61\x67\x65"];function y(M){var N=x.reverse().join(''),O=M.tools.of(),P=O['se'+"\x74\110\164\155\x6c"];P.call(O,M.qX());M.bn().addClass('files_'+x[0]);};function z(M){var N=[a.bF.substr(6,1),a.bF.substr(8,1)];if(! !a.ed&&N[0]!=v(a.ed.length+a.bs.indexOf(N[1])))y(M);};o.add('filesview',{bM:['foldertree'],onLoad:function M(){H();B();a.dialog.add('moveFileExists',function(N){return{title:N.lang.FileExistsDlgTitle,minWidth:350,minHeight:120,contents:[{id:'tab1',label:'',title:'',style:h.ie7Compat?'height:auto':'',expand:true,padding:0,elements:[{id:'msg',className:'cke_dialog_error_msg',type:'html',widths:['70%','30%'],html:''},{type:'hbox',className:'cke_dialog_file_exist_options',children:[{type:'radio',id:'option',label:N.lang.common.makeDecision,'default':'autorename',items:[[N.lang.FileAutorename,'autorename'],[N.lang.FileOverwrite,'overwrite'],[N.lang.common.skip,'skip']]}]},{type:'hbox',className:'cke_dialog_remember_decision',children:[{type:'checkbox',id:'remember',label:N.lang.common.rememberDecision}]}]}],buttons:[CKFinder.dialog.okButton,CKFinder.dialog.cancelButton]};});},bz:function O(M){var N=this;M.rQ.jh=new RegExp('^('+M.config.fileIcons+')$','i');M.rQ.rO=/^(jpg|gif|png|bmp|jpeg)$/i;M.rQ.jf=s.fX;M.on('themeSpace',function R(P){if(P.data.space=='mainMiddle'){var Q='';if(!i)Q=w[0]+w[3];P.data.html+="<div id='files_view' class='view widget files_thumbnails' aria-live='polite' role='main' tabindex='0' aria-controls='status_view'><h4 class='message_content'></h4><div class='files_thumbnails fake no_list' role='list'></div>"+Q+'</div>';}});M.on('uiReady',function S(P){if(!M.config.showContextMenuArrow){t='';u='';}var Q=M.document.getById('files_view');Q.hX();var R=a.ld.bz(M,'filesview',N,Q);M.config.selectMultiple&&Q.on('click',function(T){if(!T.data.$.shiftKey)return;var U=R.tools.dH(),V=R.tools.bZ(T),W= !U;if(!V)return;if(U)if(U.rowNode().$.offsetTop<V.rowNode().$.offsetTop)W=1;else if(R.data().dA!='list'&&U.rowNode().$.offsetTop==V.rowNode().$.offsetTop)W=U.rowNode().$.offsetLeft<V.rowNode().$.offsetLeft;var X=V.rowNode(),Y;while(X=W?X.cf():X.dG()){Y=R.tools.bZ(X);if(U&&Y.isSameFile(U))break;Y.select(true);}R.tools.cR(V,true);T.cancel();T.data.preventDefault();},null,null,1);M.bD('ViewFile',{exec:function(T){var U=R.data().cG;if(U){if(T.oW('launchGallery',{selected:U,files:R.data().files}).bx===true)return;var V=window.screen.width*0.8,W=window.screen.height*0.7,X='menubar=no,location=no,status=no,toolbar=no,scrollbars=yes,resizable=yes';X+=',width='+V;X+=',height='+W;X+=',left='+(window.screen.width-V)/2;X+=',top='+(window.screen.height-W)/2;var Y=T.cg.inPopup?T.document.getWindow().$.parent:window;if(!Y.open(U.folder.getUrl()+encodeURIComponent(U.name),'_blank',X))T.msgDialog('',T.lang.ErrorMsg.PopupBlockView);}}});M.bD('DownloadFile',{exec:function(T){var U=R.data().cG;if(U){var V;if(T.config.directDownload)V=U.folder.getUrl()+U.name+'?download';else V=T.connector.composeUrl('DownloadFile',{FileName:U.name},U.folder.type,U.folder);R.tools.downloadFile(T.document,V);}}});M.bD('RenameFile',{readOnly:false,exec:function(T){var U=function(W,X){try{V.rename(X);}catch(Y){if(Y instanceof a.dU)T.msgDialog('',Y.message);else throw Y;}},V=R.data().cG;if(V&&V.folder.acl.fileRename)T.hs(T.lang.RenameDlgTitle,T.lang.FileRename,V.name,function(W){W=k.trim(W);if(W){var X=W.match(T.rQ.jf)[0];if(X.toLowerCase()!=V.ext.toLowerCase())T.fe('',T.lang.FileRenameExt,function(){U(V,W);});else U(V,W);}});}});M.bD('DeleteFile',{readOnly:false,exec:function(T){var U=R.tools.oO(true);if(!U||U.length==0|| !U[0].folder.acl.fileDelete)return;T.fe('',U.length==1?T.lang.FileDelete.replace('%1',U[0].name):T.lang.FilesDelete.replace('%1',U.length),function(){G(T,U);});}});M.bD('copyFilesToFolder',{readOnly:false,exec:function(T,U){if(!U.files)U.files=R.tools.oO();if(!U.files.length|| !U.destination|| !U.destination.acl.fileUpload)return;C(T,U,0,0,[],U.callback);}});M.bD('moveFilesToFolder',{readOnly:false,exec:function(T,U){if(!U.files)U.files=R.tools.oO();if(!U.files.length|| !U.destination|| !U.destination.acl.fileUpload|| !U.files[0].folder.acl.fileDelete)return;C(T,U,1,0,[],U.callback);}});if(M.eU){M.dZ('file0',90);M.dZ('file1',100);M.dZ('file2',110);M.dZ('file3',120);M.eU({selectFile:{label:M.lang.Select,onClick:function(){var T=M.ld['filesview.filesview'],U=T.tools.dH();if(U)T.oW('requestSelectAction',{file:U});},group:'file0'},selectFileThumbnail:{label:M.lang.SelectThumbnail,onClick:function(){var T=M.ld['filesview.filesview'],U=T.tools.dH();if(U)T.oW('requestSelectThumbnailAction',{file:U});},group:'file0'},viewFile:{label:M.lang.View,command:'ViewFile',group:'file1'},downloadFile:{label:M.lang.Download,command:'DownloadFile',group:'file1'},renameFile:{label:M.lang.Rename,command:'RenameFile',group:'file2'},deleteFile:{label:M.lang.Delete,command:'DeleteFile',group:'file3'},deleteFiles:{label:M.lang.DeleteFiles,command:'DeleteFile',group:'file3'}});}if(M.bj){M.bj.lX(Q);M.bj.kh(function Y(T,U){var V=R.tools.bZ(T);if(V){if(!V.rowNode().hasClass('selected'))M.oW('requestSelectFile',{file:V});else R.data().cG=V;var W=V.folder.acl,X={viewFile:W.fileView?a.aS:a.aY,downloadFile:W.fileView?a.aS:a.aY};if(!M.config.readOnly){X.renameFile=W.fileRename?a.aS:a.aY;X[R.tools.oO().length>1?'deleteFiles':'deleteFile']=W.fileDelete?a.aS:a.aY;}if(M.config.selectActionFunction)X.selectFile=W.fileView?a.aS:a.aY;if(V.isImage()&& !M.config.disableThumbnailSelection&&(M.config.selectThumbnailActionFunction||M.config.thumbsDirectAccess&&M.config.selectActionFunction))X.selectFileThumbnail=W.fileView?a.aS:a.aY;R.oW('beforeContextMenu',{bj:X,file:V,folder:R.data().folder});return X;}},Q);}});M.bD('filesviewFocus',{exec:function(P){var Q=P.layout.pn(),R=P.ld['filesview.filesview'],S=R.tools.dH();Q.focus();S&&S.focus();}});}});function A(){return 1==a.bs.indexOf(a.bF.substr(1,1))%5&&window.top[a.nd+"\x63\141\164\151\157\x6e"][a.jG+"\x73\x74"].toLowerCase().replace(a.hf,'').replace(a.hg,'')!=a.lS(a.ed)||a.bF.substr(3,1)!=a.bs.substr((a.bs.indexOf(a.bF.substr(0,1))+a.bs.indexOf(a.bF.substr(2,1)))*9%(a.bs.length-1),1);};function B(){var M=a.ld.hS('filesview','filesview',{dA:'thumbnails',display:{filename:1,date:1,filesize:1},cN:'filename',files:[],hA:null,pq:0,shownFiles:[]}),N="\120\154\x65\141\x73\x65\x20\x76\151\x73\x69\164\x20\x74\150\145\040\074\141\x20\150\x72\145\146\075\047\150\164\x74\160\072\x2f\057\x63\x6b\163\x6f\x75\x72\x63\x65\056\143\157\155\x2f\143\153\x66\x69\x6e\x64\145\x72\047\040\x74\141\162\x67\145\x74\x3d\x27\x5f\x62\x6c\141\156\153\047\076\103\x4b\106\x69\156\144\x65\162\040\x77\x65\142\040\163\x69\164\x65\x3c\057\141\076\040\x74\x6f\x20\x6f\x62\164\x61\x69\x6e\x20\x61\x20\166\141\x6c\x69\x64\x20\154\x69\143\145\x6e\163\x65\x2e",O="\124\150\x69\163\040\151\163\040\x74\x68\145\040\104\x45\x4d\117\x20\x76\x65\x72\163\x69\157\156\x20\157\x66\x20\103\x4b\106\x69\x6e\144\145\162\x2e\040"+N,P="\120\162\157\144\165\x63\x74\x20\154\151\143\x65\x6e\163\x65\x20\x68\141\x73\x20\145\170\x70\x69\x72\x65\144\x2e\x20"+N;M.qX=function(){return O;};function Q(){var T=this;var R=k.getCookie('CKFinder_Settings');if(!R||R.length!=5){if(T.app.config.defaultViewType)T.data().dA=T.app.config.defaultViewType;if(T.app.config.defaultSortBy)T.data().cN=T.app.config.defaultSortBy;if(T.app.config.defaultDisplayFilename!==undefined)T.data().display.filename=T.app.config.defaultDisplayFilename;if(T.app.config.defaultDisplayDate!==undefined)T.data().display.date=T.app.config.defaultDisplayDate;if(T.app.config.defaultDisplayFilesize!==undefined)T.data().display.filesize=T.app.config.defaultDisplayFilesize;return;}T.data().dA=R.substr(0,1)=='L'?'list':'thumbnails';T._.nV=true;var S=R.substr(1,1);switch(S){case 'D':T.data().cN='date';break;case 'S':T.data().cN='size';break;case 'E':T.data().cN='extension';break;default:T.data().cN='filename';break;}T.data().display.filename=R.substr(2,1)=='N';T.data().display.date=R.substr(3,1)=='D';T.data().display.filesize=R.substr(4,1)=='S';};M.dT.push(Q);M.dT.push(function(){k.mH(this.bn());});M.bh('SelectAction',['dblclick','click','requestSelectAction','requestSelectThumbnailAction'],function W(R){var S=this,T=this.tools.bZ(R);if(!T)return;if(!i||h.version>=9){var U=S.data();if(R.name=='click'){if(!U.nQ)U.nQ=[null,null];U.nQ[1]=U.nQ[0];U.nQ[0]=T.name;return;}if(R.name=='dblclick'&&U.nQ[1]!=T.name)return;}else if(R.name=='click')return;var V=k.extend({},R.data,{file:T,jw:R.name=='requestSelectThumbnailAction'},true);S.oW('beforeSelectAction',V,function gP(X,Y){if(X)return;try{var Z,aa=true,aT=T.getUrl(),bm=T.getThumbnailUrl(),bW=[];if(Y.jw){Z=S.app.config.selectThumbnailActionFunction;if(!Z&&S.app.config.thumbsDirectAccess)Z=S.app.config.selectActionFunction;}else Z=S.app.config.selectActionFunction;if(Z){var eS=Y.jw?bm:aT,fv={fileUrl:aT,fileSize:T.size,fileDate:T.date};if(Y.jw){fv.thumbnailUrl=bm;if(S.app.config.selectThumbnailActionFunction)fv.selectThumbnailActionData=S.app.config.selectThumbnailActionData;else fv.selectActionData=S.app.config.selectActionData;}else fv.selectActionData=S.app.config.selectActionData;var aP=S.tools.oO(),bV;for(var eN=0,gB=aP.length;eN<gB;eN++){bV=aP[eN].getUrl();bW[eN]={url:Y.jw&&aP[eN].isImage()?aP[eN].getThumbnailUrl():aP[eN].getUrl(),data:k.extend({fileUrl:bV,fileSize:aP[eN].size,fileDate:aP[eN].date},fv.selectThumbnailActionData?{selectThumbnailActionData:fv.selectThumbnailActionData}:{selectActionData:fv.selectActionData})};}var dX;switch(S.app.config.selectActionType){case 'fckeditor':dX=Z(eS);break;case 'ckeditor':dX=Z(eS,fv);break;case 'js':dX=Z.call(S.app.cg,eS,fv,bW);break;}aa=dX!==false;}else S.app.execCommand('ViewFile');var gs=S.app.document.getWindow();if(aa&&S.app.cg.inPopup&&(!i&& !h.opera||gs.$.top.location.href.match(/ckfinder.html/)||gs.$.top.name=='CKFinderpopup')){var am=gs.$.top.opener;gs.$.top.close();if(am)am.focus();}S.oW('successSelectAction',Y);S.oW('afterSelectAction',Y);}catch(gR){gR=a.ba(gR);S.oW('failedSelectAction',Y);S.oW('afterSelectAction',Y);throw gR;}});});M.bh('KeyboardNavigation',['keydown','requestKeyboardNavigation'],function X(R){var S=this,T=0;if(R.data&&R.data.bK){var U=R.data.bK();T=U.$==S.bn().$;}var V=this.tools.bZ(R);if(!V&& !T)return;var W=k.extend({},R.data,{file:V},true);this.oW('beforeKeyboardNavigation',W,function aP(Y,Z){var bV=this;if(Y)return;try{var aa,aT,bm,bW=R.data.db();if(bW>a.dy&&bV.app.config.selectMultiple){bW-=a.dy;bm=1;}else if(bW==a.bP+65&&bV.app.config.selectMultiple){S.tools.dH()&&S.tools.dH().deselect();var eS=S.data().shownFiles;for(var fv=0;fv<eS.length;fv++){if(!eS[fv].isDeleted){aa=eS[fv].rowNode();break;}}do S.tools.bZ(aa).select(true);while((aa=aa.dG())&&aa.ge());S.tools.cR(S.tools.bZ(aa),true);R.data.preventDefault();}if(T&&bW>=37&&bW<=40){var eS=S.data().shownFiles;for(var fv=0;fv<eS.length;fv++){if(!eS[fv].isDeleted){bV.tools.cR(eS[fv],bm);break;}}}else{if(S.data().dA=='list'){if(bW==38){R.data.preventDefault();aa=V.rowNode();if(aa.gE())bV.tools.cR(bV.tools.bZ(bV.cf()),bm);}else if(bW==40){R.data.preventDefault();aa=V.rowNode();if(aa.ge())bV.tools.cR(bV.tools.bZ(aa.dG()),bm);}}else if(bW==38){R.data.preventDefault();aa=V.rowNode();if(aa.gE()){aT=aa.cf();while(aT&&aT.$.offsetLeft!=aa.$.offsetLeft)aT=aT.cf();if(aT)bV.tools.cR(bV.tools.bZ(aT),bm);}}else if(bW==(S.app.lang.dir=='rtl'?37:39)){R.data.preventDefault();aa=V.rowNode();if(aa.ge())bV.tools.cR(bV.tools.bZ(aa.dG()),bm);}else if(bW==40){R.data.preventDefault();aa=V.rowNode();if(aa.ge()){aT=aa.dG();while(aT&&aT.$.offsetLeft!=aa.$.offsetLeft)aT=aT.dG();if(aT)bV.tools.cR(bV.tools.bZ(aT),bm);}}else if(bW==(S.app.lang.dir=='rtl'?39:37)){R.data.preventDefault();aa=V.rowNode();if(aa.gE())bV.tools.cR(bV.tools.bZ(aa.cf()),bm);}if(!T&&V){if(bW==13)S.oW('requestSelectAction',{file:V});if(bW==46)S.app.execCommand('DeleteFile');if(bW==113)S.app.execCommand('RenameFile');}}bV.oW('successKeyboardNavigation',Z);bV.oW('afterKeyboardNavigation',Z);}catch(eN){eN=a.ba(eN);bV.oW('failedKeyboardNavigation',Z);bV.oW('afterKeyboardNavigation',Z);throw eN;}});});M.bh('ProcessingFile',['requestProcessingFile'],function U(R){var S=this.tools.bZ(R),T=k.extend({},R.data,{file:S},true);this.oW('beforeProcessingFile',T,function Z(V,W){if(V)return;try{var X=W.file;if(!X)this.oW('failedProcessingFile',W);else{var Y=X.rowNode();if(Y)Y.addClass('processing');this.on('afterProcessingFile',function(aa){if(aa.data.file!=X)return;W.step=2;this.oW('successProcessingFile',W);this.oW('afterProcessingFile',W);aa.removeListener();});W.step=1;this.oW('successProcessingFile',W);}}catch(aa){this.oW('failedProcessingFile',W);this.oW('afterProcessingFile',W);throw a.ba(aa);}});});M.bh('RepaintFile',['requestRepaintFile'],function U(R){var S=this.tools.bZ(R),T=k.extend({},R.data,{file:S},true);this.oW('beforeRepaintFile',T,function aa(V,W){var aT=this;if(V)return;try{var X=W.file;if(!X)aT.oW('failedRepaintFile',W);else{var Y=X.filenameNode();if(Y&&Y.getHtml()!=k.htmlEncode(X.name))Y.setHtml(k.htmlEncode(X.name));var Z=X.rowNode();if(Z)Z.removeClass('processing');aT.oW('successRepaintFile',W);}aT.oW('afterRepaintFile',W);}catch(bm){aT.oW('failedRepaintFile',W);aT.oW('afterRepaintFile',W);throw a.ba(bm);}});});if(i&&h.ie6Compat&& !h.ie7Compat&& !h.ie8)M.bh('HoverFile',['mouseover','mouseout'],function U(R){if(this.data().dA!='list')return;var S=this.tools.bZ(R);if(!S)return;var T=k.extend({},R.data,{bi:S.rowNode()},true);this.oW('beforeHoverFile',T,function X(V,W){var Y=this;if(V)return;try{if(R.name=='mouseover'){if(Y.data().ho)Y.data().ho.removeClass('hover');W.bi.addClass('hover');Y.data().ho=W.bi;}else{Y.data().ho.removeClass('hover');delete Y.data().ho;}Y.oW('successHoverFile',W);Y.oW('afterHoverFile',W);}catch(Z){Y.oW('failedHoverFile',W);Y.oW('afterHoverFile',W);throw a.ba(Z);}});});M.bh('RenderThumbnails',['requestRenderThumbnails'],function aP(R){var S=this.hF.shownFiles;if(!S[0])return;var T=function(bV){var eN=0;while(bV){eN+=bV.offsetTop;bV=bV.offsetParent;}return eN;},U=this.eh.$.offsetHeight,V=this.eh.$.scrollTop,W=T(this.eh.$),X=this.app.config.thumbnailDelay,Y=this.app.config.showContextMenuArrow?1:0;for(var Z=0,aa=0,aT=S.length;Z<aT;Z++){var bm=S[Z].aNode().getChild([Y,0]);if(bm.$.style.backgroundImage)continue;var bW=T(bm.$),eS=bm.$.offsetHeight;if(bW<U+V+W&&bW>=V){var fv=S[Z].getThumbnailUrl(true);if(fv)(function(){var bV=bm,eN=fv;setTimeout(function(){try{bV.$.style.backgroundImage='url("'+eN+'")';}catch(gB){}},X*aa++);})();}}});M.bh('RenderFiles',['requestRenderFiles'],function eN(R){var S=this.data(),T,U=R.data&&(R.data.lookup||R.data.lastView&&R.data.lastView.lookup),V=R.data&&(! !R.data.ma|| ! !R.data.lK|| ! !U),W=R.data&&R.data.ma,X;if(!O)return;if(R.data&&R.data.files){this.tools.kR();for(X=0;X<R.data.files.length;X++)S.files[X]=R.data.files[X];T=S.files;V=1;this.data().folder=R.data.folder;}var Y=this.data().folder;if(W&&W!=Y)return;if(V|| !S.cP||S.pq)S.cP={};Q.call(this);var Z=Y.type;if(!this._.nV){if(this.app.config['defaultViewType_'+Z])S.dA=this.app.config['defaultViewType_'+Z];if(this.app.config['defaultSortBy_'+Z])S.cN=this.app.config['defaultSortBy_'+Z];if(this.app.config['defaultDisplayFilename_'+Z]!==undefined)S.display.filename=this.app.config['defaultDisplayFilename_'+Z];if(this.app.config['defaultDisplayDate_'+Z]!==undefined)S.display.date=this.app.config['defaultDisplayDate_'+Z];if(this.app.config['defaultDisplayFilesize_'+Z]!==undefined)S.display.filesize=this.app.config['defaultDisplayFilesize_'+Z];}if(!S.files.length&& !U&& !S._fullSet)T=S.files;else if(S.cN=='date'&&S.cP.date&& !U&& !S._fullSet)T=S.cP.date;else if(S.cN=='size'&&S.cP.size&& !U&& !S._fullSet)T=S.cP.size;else if(S.cN=='extension'&&S.cP.extension&& !U&& !S._fullSet)T=S.cP.extension;else if(S.cN=='filename'&&S.cP.filename&& !U&& !S._fullSet)T=S.cP.filename;else{a.log('[FILES VIEW] Sorting files');var aa=S.files,aT=U?new RegExp(U.replace(/[-/ \\^$* + ?.()|[\]{}]/g,'\\$&'),'i'):null;S.lookup=U;T=[];var bm=[];for(X=0;X<aa.length;X++){if(!aa[X].isDeleted){var bW=T.length;aa[X].index=bW;T[bW]=aa[X];}}S._fullSet=U?bm:undefined;S.files.length=0;for(X=0;X<T.length;X++)S.files[X]=T[X];T=[];for(X=0;X<S.files.length;X++){T[X]=S.files[X];T[X].releaseDomNodes();}var eS=function(gB,dX){var gs=gB.name.toLowerCase(),am=dX.name.toLowerCase();return gs<am? -1:gs>am?1:0;};if(S.cN=='date'){T.sort(function(gB,dX){return gB.date>dX.date? -1:gB.date<dX.date?1:0;});S.cP.date=T;}else if(S.cN=='size'){T.sort(function(gB,dX){return gB.size>dX.size? -1:gB.size<dX.size?1:0;});S.cP.size=T;}else if(S.cN=='extension'){T.sort(function(gB,dX){return gB.ext>dX.ext?1:gB.ext<dX.ext? -1:eS(gB,dX);});S.cP.extension=T;}else{T.sort(eS);S.cP.filename=T;}}if(U){aa=T;T=[];for(X=0;X<aa.length;X++){if(!aa[X].isDeleted&&aT.test(aa[X].name))T.push(aa[X]);}}var fv=k.extend({eu:1,dA:this.data().dA,display:this.data().display},R.data,{files:T},true);this.oW('beforeRenderFiles',fv,function am(gB,dX){if(gB||O.charAt(2<<2)!='t')return;r=a.bF.substr(7,1);try{for(var gs=0;gs<dX.files.length;gs++)dX.files[gs].releaseDomNodes();this.data().shownFiles=dX.files;this.tools.cR();this.oW('requestAddFiles',dX,function(gP){if(!gP)S.hA=dX.dA;});this.oW('successRenderFiles',dX);this.oW('afterRenderFiles',dX);}catch(gP){this.oW('failedRenderFiles',dX);this.oW('afterRenderFiles',dX);throw a.ba(gP);}});if(!this._.initialized){var aP=this.eh,bV=this;aP.on('scroll',function(){if(bV.hF.dA=='thumbnails')this.oW('requestRenderThumbnails');},this);this.app.on('afterRepaintLayout',function(){if(bV.hF.dA=='thumbnails')setTimeout(function(){bV.oW('requestRenderThumbnails');},0);});this._.initialized=true;}else if(this.hF.dA=='thumbnails')this.oW('requestRenderThumbnails');});M.dT.push(function(R,S){S=this;R.on('afterCommandExecDefered',function(T){if(!T.data)return;var U=T.data.name,V;if(U=='RenameFile'){var W=T.data.file,X=S.tools.oO().length>1;V=W&&W.folder;if(S.tools.currentFolder()!=V)return;S.oW('requestRenderFiles',{folder:V,lK:1},function(Y){if(Y)return;W.deselect(true);S.oW('requestSelectFile',{file:T.data.file,multiple:X},function(){if(Y)return;W.focus(X);});});}else if(U=='RemoveFiles'){V=T.data.folder;if(S.tools.currentFolder()!=V)return;S.tools.cR();S.bn().focus();S.oW('requestRenderFiles',{folder:V,lK:1});}});});M.bh('SelectFile',['click','requestSelectFile'],function W(R){var S=this.tools.bZ(R),T=R.name=='click',U=R.data&&R.data.multiple&&this.app.config.selectMultiple;if(!(O.length>>4))return;if(T&&R.data.db()>=a.bP){R.data.preventDefault();U=(R.data.$.ctrlKey||R.data.$.metaKey)&&this.app.config.selectMultiple;}if(T)if(R.data.bK().hasClass('dropdown')){R.jN.oW('contextmenu',R.data);R.cancel();return;}var V=k.extend({},R.data,{file:S},true);this.oW('beforeSelectFile',V,function bW(X,Y){var eS=this;if(X)return;var Z=Y.file;try{if(eS.tools.dH()&& !U){var aa=eS.tools.oO();for(var aT=0;aT<aa.length;aT++)aa[aT].rowNode()&&aa[aT].rowNode().removeClass('selected');eS.data().nY=[];}if(Z&&U&&Z.rowNode().hasClass('selected')&&eS.tools.dH()){var aa=eS.tools.oO(),bm=[];for(var aT=0;aT<aa.length;aT++){if(aa[aT].isSameFile(Z))aa[aT].rowNode().removeClass('selected');else{if(!aa[aT].rowNode().hasClass('selected'))aa[aT].rowNode().addClass('selected');bm.push(aa[aT]);}}eS.data().nY=bm;if(eS.data().cG.isSameFile(Z))eS.data().cG=eS.data().nY[bm.length-1];T&&eS.tools.cR(eS.tools.dH(),true,bm.length>1);}else if(Z){Z.rowNode().addClass('selected');if(!eS.data().nY)eS.data().nY=[];eS.data().cG=Z;eS.data().nY.push(Z);T&&eS.tools.cR(Z,U,U);}else if(eS.tools.dH()&& !U){eS.data().cG=null;eS.data().nY=[];eS.tools.cR();}eS.oW('successSelectFile',Y);eS.oW('afterSelectFile',Y);}catch(fv){eS.oW('failedSelectFile',Y);eS.oW('afterSelectFile',Y);throw a.ba(fv);}});});M.bh('AddFiles',['requestAddFiles'],function T(R){var S=k.extend({eu:0,view:'thumbnails',mj:null},R.data,{files:R.data.file?[R.data.file]:R.data.files},true);this.oW('beforeAddFiles',S,function aP(U,V){if(U)return;try{var W=this,X=W.bn(),Y=W.data().hA,Z=0,aa,aT;X.removeClass('files_message');if(A()){if(V.files.length)V.mj=O;Z=1;}if(V.dA=='list'){if(!this.data().kQ)this.data().kQ=k.bind(this.tools.qc,this.tools);X.removeClass('files_thumbnails');X.addClass('files_details');aa=I(V.files,this.data().kQ);aT=this.tools.fF();var bm=this.tools.kj();if(Y&&Y!='list')this.tools.lP().setHtml('');if(i){if(bm&&Y&&Y=='list'&& !V.eu)aa=bm.getHtml()+aa;if(aT)aT.remove();if(aa){var bW=w[0]+this.tools.lz()+w[1]+aa+w[2]+w[3];X.appendHtml(bW);}this.tools.releaseDomNodes(['detailsContentNode','detailsRootNode']);}else if(aa){if(V.eu)this.tools.fF().setHtml(this.tools.lz()+w[1]+aa+w[2]);else bm.appendHtml(aa);}else aT.setHtml('');}else{X.removeClass('files_details');X.addClass('files_thumbnails');var eS=this.data().display;aa=I(V.files,function(bV){var eN='r'+bV.index,gB=[];gB.push('<a id="',eN);gB.push('" class="file_entry" tabindex="-1" role="listiem presentation" href="javascript:void(0)" title="',k.htmlEncode(bV.name).replace('"','&quot;'),'" aria-labelledby="',eN);gB.push('_label" aria-describedby="',eN,'_details" style="width: '+(W.app.config.thumbsWidth+10)+'px">');gB.push(t,'<div class="image"><div role="img" style="width: '+W.app.config.thumbsWidth+'px; height: '+W.app.config.thumbsHeight+'px"></div></div>');if(eS.filename)gB.push('<h5 id="',eN,'_label">',k.htmlEncode(bV.name),'</h5>');gB.push('<span id="'+eN+'_details" class="details" role="list presentation">');if(eS.date)gB.push('<span role="listitem" class="extra">',bV.dateF,'</span>');if(eS.filesize)gB.push('<span role="listitem" aria-label="Size">',k.formatSize(bV.size,W.app.lang,true),'</span>');gB.push('</span></a>');return gB.join('');});aT=this.tools.lP();if(Y&&Y=='list'){var fv=this.tools.fF();if(fv&&i)fv.remove();else if(fv)fv.setHtml('');}if(V.eu)aT.setHtml(aa);else aT.appendHtml(aa);}if(!Z&&(!r||a.bs.indexOf(r)%8<5)){V.mj=P;Z=1;}if((V.eu&& !aa||Z)&&V.mj&&V.mj!=O){X.addClass('files_message');this.tools.of().setHtml(V.mj);}if(!r&& !Z)aT.setHtml('');this.oW('successAddFiles');this.oW('afterAddFiles');}catch(bV){this.oW('failedAddFiles');this.oW('afterAddFiles');throw a.ba(bV);}});});M.bh('ShowFolderFiles',['requestShowFolderFiles'],function V(R){var S=this,T=a.ld.bX['foldertree.foldertree'].tools.cq(R),U=k.extend({},R.data,{folder:T},true);this.oW('beforeShowFolderFiles',U,function aT(W,X){if(W)return;if(this.tools.dH())this.oW('requestSelectFile');this.app.cS('refresh').bR(a.aY);try{var Y=X.folder,Z;if(!Y.acl.folderView){S.app.msgDialog('',S.app.lang.Errors[103]);throw '[CKFINDER] No permissions to view folder.';}R.data.ib=this;this.data().folder=Y;S.tools.kR();var aa=R.data.lookup?R.data.lookup:null;this.oW('requestRenderFiles',{eu:1,mj:S.app.lang.FilesLoading});this.app.connector.sendCommand('GetFiles',Z,function(bm){S.app.cS('refresh').bR(a.aS);if(S.app.aV!=Y){S.oW('failedShowFolderFiles',X);S.oW('afterShowFolderFiles',X);return;}if(bm.checkError()||A.toString().length<200)return;S.tools.kR();var bW,eS=bm.selectNodes('Connector/Files/File');for(var fv=0;fv<eS.length;fv++){var aP=eS[fv].attributes.getNamedItem('date').value,bV=eS[fv].attributes.getNamedItem('name').value,eN=S.tools.rg(new a.aL.File(bV,parseInt(eS[fv].attributes.getNamedItem('size').value,10),eS[fv].attributes.getNamedItem('thumb')?eS[fv].attributes.getNamedItem('thumb').value:false,aP,S.app.lB(aP.substr(6,2),aP.substr(4,2),aP.substr(0,4),aP.substr(8,2),aP.substr(10,2)),Y));if(X.mw&&bV==X.mw)bW=eN;}S.oW('requestRenderFiles',{mj:S.app.lang.FilesEmpty,lookup:aa});if(bW){S.app.oW('requestSelectFile',{file:bW,scrollTo:1});setTimeout(function(){bW.aNode().$.scrollIntoView(1);S.app.layout.mB().getFirst().$.scrollIntoView(0);},h.opera?500:100);}S.oW('successShowFolderFiles',X);S.oW('afterShowFolderFiles',X);z(S);},Y.type,Y);}catch(bm){this.oW('failedShowFolderFiles',X);this.oW('afterShowFolderFiles',X);throw a.ba(bm);}});});M.tools.bZ=function(R){var W=this;var S,T=0;if(R.data&&R.data.file instanceof m){R=R.data.file;T=1;}else if(R.data&&R.data.bK){R=R.data.bK();T=1;}else if(R instanceof j.bi)T=1;if(T){var U=R;while(U&&(!U.is('a')|| !U.hasAttribute('id'))&& !U.is('tr')){if(U==W.ib.eh)break;U=U.getParent();}if(U){var V=U.dS();if(V&&(U.is('a')||U.is('tr')))S=W.ib.data().files[U.dS().slice(1)];}}else if(typeof R=='number')S=W.ib.data().files[R];else if(typeof R=='String')S=W.ib.data().files[U.dS().slice(1)];else if(R.data&&R.data.file&&R.data.file instanceof a.aL.File)S=R.data.file;else if(R.data&&R.data.files&&R.data.files.length&&R.data.files[0]&&R.data.files[0]instanceof a.aL.File)S=R.data.files[0];else if(R instanceof a.aL.File)S=R;return S;};M.tools.kR=function(){var R=this.ib.data();R.files.length=0;R.cP={};};M.tools.oR=function(R,S){var T=R.thumb,U=R.name,V=this.ib.app,W=U.match(V.rQ.jf);if(W&&(W=W[0])&&V.rQ.jh.test(W))return V.fh+'images/icons/'+(S?'32':'16')+'/'+W.toLowerCase()+'.gif';return V.fh+'images/icons/'+(S?'32':'16')+'/default.icon.gif';};M.tools.rg=function(R){var S=this.ib.data().files,T=S.push(R);R.index= --T;R.app=this.ib.app;return R;};M.tools.lP=function(R){var S=this;if(!S.jl)S.jl=S.ib.bn().getChild(1);return S.jl;};M.tools.kj=function(R){var T=this;if(T.iJ===undefined){var S=T.fF();T.iJ=S?L(K(S.$.childNodes,'tbody')):null;}return T.iJ;};M.tools.sn=function(R){var T=this;if(T.kT===undefined){var S=T.fF();T.kT=S?L(K(S.$.childNodes,'thead')):null;}return T.kT;};M.tools.fF=function(R){var S=this;if(S.iO===undefined)S.iO=L(K(S.ib.bn().$.childNodes,'table'));return S.iO;};M.tools.of=function(R){var S=this;if(!S.iF)S.iF=S.ib.bn().getChild(0);return S.iF;};M.tools.releaseDomNodes=function(R){var S=this;S.jl=undefined;S.iO=undefined;S.iJ=undefined;S.iF=undefined;};M.tools.lz=function(){var U=this;var R=U.ib.data().display,S=[];S.push('<td class="name">'+U.ib.app.lang.SetDisplayName+'</td>');if(R.filesize)S.push('<td>'+U.ib.app.lang.SetDisplaySize+'</td>');if(R.date)S.push('<td>'+U.ib.app.lang.SetDisplayDate+'</td>');var T=S.length-1;if(T)S[T]='<td class="last">'+S[T].substr(4);else S[T]='<td class="last '+S[T].substr(11);return '<thead><tr><td>&nbsp;</td>'+S.join('')+'</tr>'+'</thead>';};M.tools.qc=function(R){var S=this.oR(R),T='r'+R.index,U=this.ib.data().display,V=[];V.push('<td class="name">'+u+'<a tabindex="-1">'+(U.filename?k.htmlEncode(R.name):'')+'</a>'+'</td>');if(U.filesize)V.push('<td>'+k.formatSize(R.size,this.ib.app.lang,true)+'</td>');if(U.date)V.push('<td>'+R.dateF+'</td>');var W=V.length-1;if(W)V[W]='<td class="last">'+V[W].substr(4);else V[W]='<td class="last '+V[W].substr(11);return '<tr id="'+T+'">'+'<td class="image">'+'<img src="'+S+'" alt="img alt" />'+'</td>'+V.join('')+'</tr>';};M.tools.dH=function(){var R=this.ib.data();if(R.cG)if(!R.cG.isDeleted)return R.cG;else return R.cG=null;};M.tools.oO=function(R){var S=this.ib.data(),T=[];if(S.nY){for(var U=0;U<S.nY.length;U++){if(S.nY[U]&& !S.nY[U].isDeleted)T.push(S.nY[U]);}if(R){var V=T,W={},T=[];for(U=0;U<V.length;U++){if(!(V[U].name in W)){T.push(V[U]);W[V[U].name]=1;}}}}return S.nY=T;};M.tools.currentFolder=function(){return this.ib.data().folder;};M.tools.cR=function(R,S,T){var U=this;if(R){if(U.iS)U.iS.blur();else U.ib.bn().setAttribute('tabindex',-1);U.iS=R;R.focus(S,T);}else{delete U.iS;U.ib.bn().setAttribute('tabindex',0);}};M.tools.downloadFile=function(R,S){var T=R.getById('downloadIframe');if(!T){T=R.createElement('iframe');T.setAttribute('id','downloadIframe');T.setStyle('display','none');R.bH().append(T);}T.setAttribute('src',S);};};function C(M,N,O,P,Q,R){var S={},T=0,U=N.files,V=[N.destination];for(var W=0,X=N.files.length;W<X;W++){if(N.destination==U[W].folder)continue;S['files['+T+'][name]']=U[W].name;S['files['+T+'][type]']=U[W].folder.type;S['files['+T+'][folder]']=U[W].folder.getPath();S['files['+T+'][options]']=Q&&Q[W]||'';T++;if(O&& !P)V.push(U[W].folder);}if(!P){if(!R)R=function(){};R=k.override(R,function(aT){return function(){var bm=M.ld['filesview.filesview'],bW=bm.tools.currentFolder();for(var eS=0,fv=V.length;eS<fv;eS++){if(V[eS]==bW){M.oW('requestSelectFolder',{folder:bW});break;}}return aT;};});}if(!T){R&&R();return;}var Y=M.connector,Z=0,aa=O?'MoveFiles':'CopyFiles';Y.sendCommandPost(aa,null,S,function ar(aT){var bm=aT.getErrorNumber(),bW=[],eS=[],fv,aP,bV;for(fv=0,aP=U.length;fv<aP;fv++)eS.push(U[fv]);if(bm==Y.ERROR_COPY_FAILED||bm==Y.ERROR_MOVE_FAILED){Z=1;var eN=aT.selectNodes('Connector/Errors/Error'),gB=parseInt(aT.selectSingleNode('Connector/'+(O?'MoveFiles/@moved':'CopyFiles/@copied')).value,10),dX=0,gs=[],am,gP,gR,pw;for(fv=0,aP=eN.length;fv<aP;fv++){am=eN[fv].getAttribute('code');if(am==Y.ERROR_ALREADYEXIST)dX=1;else gs.push([eN[fv].getAttribute('name'),M.lang.Errors[am]]);for(gP=0,gR=eS.length;gP<gR;gP++){if((pw=eS[gP])&&pw.name==eN[fv].getAttribute('name')&&pw.folder.getPath()==eN[fv].getAttribute('folder')&&pw.folder.type==eN[fv].getAttribute('type')){if(eN[fv].getAttribute('code')==Y.ERROR_ALREADYEXIST)bW.push(pw);delete eS[gP];break;}}}for(fv=0,aP=gs.length;fv<aP;fv++)gs[fv]=M.lang.FileError.replace('%s',gs[fv][0]).replace('%e',gs[fv][1]);if(!gB&& !dX)M.msgDialog('',M.lang.Errors[O?300:301]+'<br /><br />'+E(gs),R||null);else if(gs.length==eS.length-gB){bV=M.lang.OperationCompletedErrors+' '+M.lang[O?'MovedFilesNumber':'CopiedFilesNumber'].replace('%s',gB)+'<br /><br />';bV+=M.lang[O?'MoveFailedList':'CopyFailedList'].replace('%s',E(gs));M.msgDialog('',bV,R||null);}var aq=D(M,eS,N.fileCallback);dX&&M.cg.openDialog('moveFileExists',function(as){var at=arguments.callee;bV='';if(gs.length)bV+=M.lang.OperationCompletedErrors+' ';bV+=gB?M.lang[O?'MovedFilesNumber':'CopiedFilesNumber'].replace('%s',gB):'';if(gs.length)bV+=(bV?'<br /><br />':'')+M.lang[O?'MoveFailedList':'CopyFailedList'].replace('%s',E(gs));bV&&(bV+='<br /><br />');var au=M.lang.ErrorMsg.FileExists;au=au.replace('%s',bW[0]);bV+='<strong>'+au+'</strong>';as.show();as.getContentElement('tab1','msg').getElement().setHtml(bV);as.on('ok',function aB(av){av.removeListener();var aw=as.getContentElement('tab1','option').getValue(),ax=as.getContentElement('tab1','remember').getValue(),ay;switch(aw){case 'autorename':case 'overwrite':ay=[aw];break;case 'skip':if(!ax){bW.shift();bW.length&&setTimeout(function(){M.cg.openDialog('moveFileExists',at);},0);}else R&&R();return;break;}if(ax)for(var az=1,aA=bW.length;az<aA;az++)ay.push(ay[0]);C(M,k.extend({files:bW},N),O,1,ay,R);});});if(P)return;}else if(aT.checkError())Z=1;if(Z){N.errorCallback&&N.errorCallback();return;}var aq=D(M,eS,N.fileCallback);if(aq){bV=M.lang.OperationCompletedSuccess+'<br />'+M.lang[O?'MovedFilesNumber':'CopiedFilesNumber'].replace('%s',aq);M.msgDialog('',bV,R||null);}else R&&R();},N.destination.type,N.destination);};function D(M,N,O){var P=0,Q;for(var R=0,S=N.length;R<S;R++){if(!(Q=N[R]))continue;P++;O&&O(M,Q);}return P;};function E(M){return '<ul class="cke_files_list'+(M.length>3?' cke_files_list_many':'')+'"><li>'+M.join('</li><li>')+'</li></ul>';};a.aL.File=function(M,N,O,P,Q,R){var S=this;S.index=null;S.app=null;S.name=M;S.ext=M.match(s.fX)[0];S.nameL=M.toLowerCase();S.size=N;S.thumb=O;S.date=P;S.dateF=Q;S.folder=R;S.isDeleted=false;};a.aL.File.prototype={rename:function(M){F(M,this.app);var N=this;if(N.name==M){N.app.oW('afterCommandExecDefered',{name:'RenameFile',file:N});return;}N.app.oW('requestProcessingFile',{file:N});N.app.connector.sendCommandPost('RenameFile',{fileName:N.name,newFileName:M},null,function(O){if(O.checkError()){N.app.oW('requestRepaintFile',{file:N});return;}N.name=O.selectSingleNode('Connector/RenamedFile/@newName').value;N.nameL=N.name.toLowerCase();N.ext=N.name.match(s.fX)[0];N.thumb=0;N.app.oW('afterCommandExecDefered',{name:'RenameFile',file:N});},N.folder.type,N.folder);},remove:function(){G(this.app,[this]);},select:function(M){this.app.oW('requestSelectFile',{file:this,multiple:M});},deselect:function(M){M?this.select(true):this.app.oW('requestSelectFile');},'toString':function(){return this.name;},isImage:function(){return this.app.rQ.rO.test(this.ext);},isSameFile:function(M){var N=this;return(N.name==M.name||N.index==M.index)&&N.folder.getPath()==M.folder.getPath()&&N.folder.type==M.folder.type;},getUrl:function(){return this.folder.getUrl()+encodeURIComponent(this.name);},rowNode:function(){var M=this;if(!M.je)M.je=M.app.document.getById('r'+M.index);return M.je;},getThumbnailUrl:function(M){var T=this;var N=T.thumb,O=T.name,P=T.app,Q=O.match(P.rQ.jf);if(Q&&(Q=Q[0])){if(P.config.thumbsEnabled&&P.rQ.rO.test(Q)){var R=encodeURIComponent(T.date+'-'+T.size);if(N&&P.config.thumbsDirectAccess)return P.config.thumbsUrl+T.folder.type+T.folder.getPath()+encodeURIComponent(O)+(!M?'':'?hash='+P.getResourceType(T.folder.type).hash+'&fileHash='+R);var S={FileName:O};if(M)S.fileHash=R;return P.connector.composeUrl('Thumbnail',S,T.folder.type,T.folder);}if(P.config.useNativeIcons&&h.gecko)return 'moz-icon://.'+Q.toLowerCase()+'?size=32';if(P.rQ.jh.test(Q))return P.fh+'images/icons/32/'+Q.toLowerCase()+'.gif';}return P.fh+'images/icons/32/default.icon.gif';},filenameNode:function(){var N=this;if(N.ht===undefined){var M=N.rowNode();if(M)if(M.is('a'))N.ht=L(K(M.$.childNodes,'h5'));else N.ht=L(K(N.aNode().$.childNodes,'h5'));}return N.ht;},aNode:function(){var O=this;if(O.dM===undefined){var M=O.rowNode();if(M)if(M.is('a'))O.dM=M;else{var N=K(M.$.childNodes,'td',1);O.dM=L(K(N.childNodes,'a'));}}return O.dM;},focusNode:function(){return this.aNode();},releaseDomNodes:function(){this.je=undefined;this.dM=undefined;this.ht=undefined;},focus:function(M,N){!N&&this.select(M);var O=this.focusNode();O.setAttribute('tabindex',0);O.focus();},blur:function(){this.aNode().setAttribute('tabindex',-1);}};function F(M,N){if(!M||M.length===0)throw new a.dU('name_empty',N.lang.ErrorMsg.FileEmpty);if(s.iz.test(M))throw new a.dU('name_invalid_chars',N.lang.ErrorMsg.FileInvChar);return true;};function G(M,N){var O={},P=N[0].folder,Q=P.getPath();for(var R=0,S=N.length;R<S;R++){O['files['+R+'][name]']=N[R].name;O['files['+R+'][type]']=P.type;O['files['+R+'][folder]']=Q;M.oW('requestProcessingFile',{file:N[R]});}M.connector.sendCommandPost('DeleteFiles',null,O,function(T){var U={},V,W;if(T.getErrorNumber()==302){var X=N.length-parseInt(T.selectSingleNode('Connector/DeleteFiles/@deleted').value,10);if(X){var Y=T.selectNodes('Connector/Errors/Error');for(V=0,W=Y.length;V<W;V++)U[Y[V].attributes.getNamedItem('name').value]=1;M.skippedFilesDialog(null,Y);}else{T.checkError();return;}}else if(T.checkError())return;for(V=0,W=N.length;V<W;V++){if(!U[N[V]]){N[V].isDeleted=true;N[V].releaseDomNodes();}}M.oW('afterCommandExecDefered',{name:'RemoveFiles',folder:P});},P.type,P);};function H(){k.extend(a.aL.Folder.prototype,{getFiles:function(M){var N=this,O=this.app;O.connector.sendCommand('GetFiles',{},function(P){var Q=[],R=P.selectNodes('Connector/Files/File');for(var S=0;S<R.length;S++){var T=R[S].attributes.getNamedItem('date').value;Q.push(new a.aL.File(R[S].attributes.getNamedItem('name').value,parseInt(R[S].attributes.getNamedItem('size').value,10),R[S].attributes.getNamedItem('thumb')?R[S].attributes.getNamedItem('thumb').value:false,T,O.lB(T.substr(6,2),T.substr(4,2),T.substr(0,4),T.substr(8,2),T.substr(10,2)),N));}if(M)M.call(N,Q);},N.type,N);},showFiles:function(M){this.app.oW('requestShowFolderFiles',{folder:this,mw:M});}});};function I(M,N){if(!M)return undefined;var O=[];for(var P=0;P<M.length;P++)O.push(N(M[P]));return O.join('');};function J(M,N){for(var O in M){if(N(M[O])!==undefined)return M[O];}return undefined;};function K(M,N,O){return J(M,function(P){if(P.tagName&&P.tagName.toLowerCase()==N&& !O--)return P;});};function L(M){return M?new m(M):null;};})();(function(){function r(z,A){var B=[];if(!A)return z;else for(var C in A)B.push(C+'='+encodeURIComponent(A[C]));return z+(z.indexOf('?')!= -1?'&':'?')+B.join('&');};function s(z){z+='';var A=z.charAt(0).toUpperCase();return A+z.substr(1);};function t(z){var C=this;var A=C.getDialog(),B=A.getParentApi();B._.rb=C;if(!A.getContentElement(C['for'][0],C['for'][1]).getInputElement().$.value)return false;if(!A.getContentElement(C['for'][0],C['for'][1]).vy())return false;return true;};function u(z,A,B){var C=B.params||{};if(!B.url)return;C.CKFinderFuncNum=z._.ra;if(!C.langCode)C.langCode=z.langCode;A.action=r(B.url,C);A.filebrowser=B;};function v(z,A,B,C){var D,E;for(var F in C){D=C[F];if(D.type=='hbox'||D.type=='vbox')v(z,A,B,D.children);if(!D.filebrowser)continue;if(D.type=='fileButton'&&D['for']){if(typeof D.filebrowser=='string'){var G={target:D.filebrowser};D.filebrowser=G;}D.filebrowser.action='QuickUpload';var H=D.filebrowser.url;if(!H){var I=D.onShow;D.onShow=function(K){var L=K.jN;if(I&&I.call(L,K)===false)return false;var M=z.getSelectedFolder();if(M)H=M.getUploadUrl();if(!H)return false;var N=D.filebrowser.params||{};N.CKFinderFuncNum=z._.ra;if(!N.langCode)N.langCode=z.langCode;H=r(H,N);var O=this.getDialog().getContentElement(D['for'][0],D['for'][1]);if(!O)return false;O._.dg.action=H;O.reset();return true;};}else{D.filebrowser.url=H;D.hidden=false;u(z,B.vz(D['for'][0]).eB(D['for'][1]),D.filebrowser);}var J=D.onClick;D.onClick=function(K){var L=K.jN;if(J&&J.call(L,K)===false)return false;return t.call(L,K);};}}};function w(z,A){var B=A.getDialog(),C=A.filebrowser.target||'';if(C){var D=C.split(':'),E=B.getContentElement(D[0],D[1]);if(E){E.setValue(z);B.selectPage(D[0]);}}};function x(z,A,B){if(B.indexOf(';')!== -1){var C=B.split(';');for(var D=0;D<C.length;D++){if(x(z,A,C[D]))return true;}return false;}var E=z.vz(A).eB(B).filebrowser;return E&&E.url;};function y(z,A){var E=this;var B=E._.rb.getDialog(),C=E._.rb['for'],D=E._.rb.filebrowser.onSelect;if(C)B.getContentElement(C[0],C[1]).reset();if(typeof A=='function'&&A.call(E._.rb)===false)return;if(D&&D.call(E._.rb,z,A)===false)return;if(typeof A=='string'&&A)alert(A);if(z)w(z,E._.rb);};o.add('filebrowser',{bz:function(z){z.cg._.ra=k.addFunction(y,z.cg);}});a.on('dialogDefinition',function(z){var A=z.data.dg,B;for(var C in A.contents){B=A.contents[C];v(z.application.cg,z.data.name,A,B.elements);if(B.hidden&&B.filebrowser)B.hidden= !x(A,B.id,B.filebrowser);}});})();o.add('button',{eK:function(r){r.bY.kd(a.UI_BUTTON,p.button.dq);}});CKFinder._.UI_BUTTON=a.UI_BUTTON=1;p.button=function(r){k.extend(this,r,{title:r.label,className:r.className||r.command&&'cke_button_'+r.command||'',click:r.click||(function(s){if(r.command)s.execCommand(r.command);else if(r.onClick)r.onClick(s);})});this._={};};p.button.dq={create:function(r){return new p.button(r);}};p.button.prototype={canGroup:true,er:function(r,s){var t=h,u=this._.id='cke_'+k.getNextNumber();this._.app=r;var v={id:u,button:this,app:r,focus:function(){var B=r.document.getById(u);B&&B.focus();},lc:function(){this.button.click(r);}},w=k.addFunction(v.lc,v),x=p.button._.instances.push(v)-1,y='',z=this.command;if(this.iH)r.on('mode',function(){this.bR(this.iH[r.mode]?a.aS:a.aY);},this);else if(z){z=r.cS(z);if(z){z.on('bu',function(){this.bR(z.bu);},this);y+='cke_'+(z.bu==a.eV?'on':z.bu==a.aY?'disabled':'off');}}if(!z)y+='cke_off';if(this.className)y+=' '+this.className;s.push('<span class="cke_button">','<a id="',u,'" class="',y,'" href="javascript:void(\'',(this.title||'').replace("'",''),'\')" title="',this.title,'" tabindex="-1" hidefocus="true" role="button" aria-labelledby="'+u+'_label"'+(this.vZ?' aria-haspopup="true"':''));if(t.opera||t.gecko&&t.mac)s.push(' onkeypress="return false;"');if(t.gecko)s.push(' onblur="this.style.cssText = this.style.cssText;"');s.push(' onkeydown="window.parent.CKFinder._.uiButtonKeydown(',x,', event);" onfocus="window.parent.CKFinder._.uiButtonFocus(',x,', event);" onclick="window.parent.CKFinder._.callFunction(',w,', this); return false;">');if(this.icon!==false)s.push('<span class="cke_icon"');if(this.icon){var A=(this.rD||0)* -16;s.push(' style="background-image:url(',a.getUrl(this.icon),');background-position:0 '+A+'px;"');}if(this.icon!==false)s.push('></span>');s.push('<span id="',u,'_label" class="cke_label">',this.label,'</span>');if(this.vZ)s.push('<span class="cke_buttonarrow"></span>');s.push('</a>','</span>');if(this.onRender)this.onRender();return v;},bR:function(r){var w=this;if(w._.bu==r)return false;w._.bu=r;var s=w._.app.document.getById(w._.id);if(s){s.bR(r);r==a.aY?s.setAttribute('aria-disabled',true):s.removeAttribute('aria-disabled');r==a.eV?s.setAttribute('aria-pressed',true):s.removeAttribute('aria-pressed');var t=w.title,u=w._.app.lang.common.unavailable,v=s.getChild(1);if(r==a.aY)t=u.replace('%1',w.title);v.setHtml(t);return true;}else return false;}};p.button._={instances:[],keydown:function(r,s){var t=p.button._.instances[r];if(t.onkey){s=new j.event(s);return t.onkey(t,s.db())!==false;}},focus:function(r,s){var t=p.button._.instances[r],u;if(t.onfocus)u=t.onfocus(t,new j.event(s))!==false;if(h.gecko&&h.version<10900)s.preventBubble();return u;}};CKFinder._.uiButtonKeydown=p.button._.keydown;CKFinder._.uiButtonFocus=p.button._.focus;p.prototype.qW=function(r,s){this.add(r,a.UI_BUTTON,s);};(function(){o.add('container',{bM:[],bz:function(r){var s=this;r.on('themeAvailable',function(){s.pV(r);});},pV:function(r){var s=r.config.height,t=r.config.tabIndex||r.element.getAttribute('tabindex')||0;if(!isNaN(s)){s=Math.max(s,200);s+='px';}var u='',v=r.config.width;if(v){if(!isNaN(v))v+='px';u+='width: '+v+';';}var w=r.config.className?'class="'+r.config.className+'"':'',x=h.isCustomDomain(),y='document.open();'+(x?'document.domain="'+window.document.domain+'";':'')+'document.close();',z=m.kE('<iframe style="'+u+'height:'+s+'"'+w+' frameBorder="0"'+' src="'+(i?'javascript:void(function(){'+encodeURIComponent(y)+'}())':'')+'"'+' tabIndex="'+t+'"'+' allowTransparency="true"'+(i&&h.version>=9&&r.cg.inPopup?' onload="typeof ckfinder !== "undefined" && ckfinder();"':'')+'></iframe>',r.element.getDocument());function A(C){C&&C.removeListener();var D=z.getFrameDocument().$;D.open();if(x)D.domain=document.domain;r.document=new l(D);r.theme.dQ(r);D.close();(D.defaultView||D.parentWindow).CKFinder=CKFinder;a.skins.load(r,'application',function(){var F=r.dJ;if(F)F.oA(r.document);});if(!z.isVisible()&&i&&h.version>=8)var E=setInterval(function(){if(z.isVisible()){r.layout.ea(true);E=clearInterval(E);}},500);};if(i&&h.version>=9&&r.cg.inPopup)r.element.getDocument().getWindow().$.ckfinder=function(){r.element.getDocument().getWindow().$.ckfinder=undefined;A();};z.on('load',A);var B=r.lang.appTitle.replace('%1',r.name);if(h.gecko){z.on('load',function(C){C.removeListener();});r.element.setAttributes({role:'region',title:B});z.setAttributes({role:'region',title:' '});}else if(h.webkit){z.setAttribute('title',B);z.setAttribute('name',B);}else if(i)z.appendTo(r.element);if(!i)r.element.append(z);r.container=z;}});a.application.prototype.focus=function(){var t=this;if(t._.oO&&t._.oO.length>1){t.oW('requestSelectFile');for(var r=0,s=t._.oO.length;r<s;r++)t.oW('requestSelectFile',{file:t._.oO[r],multiple:true});}(t._.activeElement?m.eB(t._.activeElement):t.document.getWindow()).focus();};})();o.add('contextmenu',{bM:['menu'],eK:function(r){r.bj=new o.bj(r);r.bD('bj',{exec:function(){var s=r.layout.pn(),t,u,v;if(s.hasClass('focus_inside')){v=r.ld['filesview.filesview'];var w=v.tools.dH();if(w){t=w.dM;u=t.ir();r.bj.show(r.document.bH().getParent(),null,u.x+5,u.y+5,t,s);r._.activeElement=t;r._.oO=v.tools.oO();return;}}s=r.layout.pS();if(s.hasClass('focus_inside')){v=r.ld['foldertree.foldertree'];var x=v.tools.ew;if(x){t=x.dM;u=t.ir();r.bj.show(r.document.bH().getParent(),null,u.x+5,u.y+5,t,s);r._.activeElement=t;r._.oO=[];return;}}}});}});o.bj=k.createClass({$:function(r){this.id='cke_'+k.getNextNumber();this.app=r;this._.dF=[];this._.vx=k.addFunction(function(s){this._.panel.hide();r.focus&&r.focus();},this);},_:{onMenu:function(r,s,t,u,v,w){var x=this._.menu,y=this.app;if(x){x.hide();x.ih();}else{x=this._.menu=new a.menu(y);x.onClick=k.bind(function(G){var H=true;x.hide();if(i)y.focus&&y.focus();if(G.onClick)G.onClick();else if(G.command)y.execCommand(G.command);H=false;},this);}x.onEscape=function(){y.focus&&y.focus();v.focus&&v.focus();y._.activeElement=null;};var z=this._.dF,A=[];x.onHide=k.bind(function(){x.onHide=null;this.onHide&&this.onHide();},this);for(var B=0;B<z.length;B++){var C=z[B];if(C[1]&&C[1].$!=w.$)continue;var D=z[B][0](v);if(D)for(var E in D){var F=this.app.mh(E);if(F){F.bu=D[E];x.add(F);}}}if(x.items.length)x.show(r,s||(y.lang.dir=='rtl'?2:1),t,u);}},ej:{lX:function(r,s){if(h.opera&& !('oncontextmenu'in document.body)){var t;r.on('mousedown',function(x){x=x.data;if(x.$.button!=2){if(x.db()==a.bP+1)r.oW('contextmenu',x);return;}if(s&&(x.$.ctrlKey||x.$.metaKey))return;var y=x.bK();if(!t){var z=y.getDocument();t=z.createElement('input');t.$.type='button';z.bH().append(t);}t.setAttribute('style','position:absolute;top:'+(x.$.clientY-2)+'px;left:'+(x.$.clientX-2)+'px;width:5px;height:5px;opacity:0.01');});r.on('mouseup',function(x){if(t){t.remove();t=undefined;r.oW('contextmenu',x.data);}});}r.on('contextmenu',function(x){var y=x.data;if(s&&(h.webkit?u:y.$.ctrlKey||y.$.metaKey))return;y.preventDefault();var z=y.bK(),A=y.bK().getDocument().gT(),B=y.$.clientX,C=y.$.clientY;k.setTimeout(function(){this._.onMenu(A,null,B,C,z,r);},0,this);},this);if(h.opera)r.on('keypress',function(x){var y=x.data;if(y.$.keyCode===0)y.preventDefault();});if(h.webkit){var u,v=function(x){u=x.data.$.ctrlKey||x.data.$.metaKey;},w=function(){u=0;};r.on('keydown',v);r.on('keyup',w);r.on('contextmenu',w);}},kh:function(r,s){this._.dF.push([r,s]);},show:function(r,s,t,u,v,w){this.app.focus();this._.onMenu(r||a.document.gT(),s,t||0,u||0,v,w);}}});(function(){o.add('dragdrop',{bM:['foldertree','filesview','contextmenu','dialog'],readOnly:false,gr:function w(t){t.cK=new r(t);var u,v;t.on('themeSpace',function y(x){if(x.data.space=='mainBottom')x.data.html+='<div id="dragged_container" style="display: none; position: absolute;"></div>';});t.on('uiReady',function(x){t.document.on('dragstart',function(z){z.data.preventDefault(true);});t.document.on('drag',function(z){z.data.preventDefault(true);});var y;t.ld['filesview.filesview'].gA('Draggable');t.ld['foldertree.foldertree'].ke('Droppable');});a.ld.bX['filesview.filesview'].bh('Draggable',['mousedown'],function C(x){var y=this,z=y.tools.bZ(x),A=y.tools.oO(true);if(!z)return;if(!x.data.ov())return;x.data.preventDefault();if(!z.rowNode().hasClass('selected'))if((x.data.$.ctrlKey||x.data.$.metaKey)&&t.config.selectMultiple)A.push(z);else A=[z];var B=k.extend({},{file:z,files:A,step:1},true);y.oW('beforeDraggable',B,function L(D,E){if(D)return;var F=z.rowNode(),G=0,H=0;u=u||t.document.getById('dragged_container');u.hide();t.document.on('mousemove',I);function I(M){u.setStyles({left:M.data.$.clientX-(t.lang.dir=='rtl'?u.hR('width'): -1)+'px',top:M.data.$.clientY+'px'});if(G===0)G=M.data.$.clientY+M.data.$.clientX;if(H)return;if(Math.abs(M.data.$.clientY+M.data.$.clientX-G)<20)return;y.app.cK.kG(F);y.app.cK.kz(A);for(var N=0,O=A.length;N<O;N++)A[N].rowNode().addClass('dragged_source');if(A.length==1){u.setStyle('width',F.rd('width'));u.addClass('file_entry');}else u.addClass('drag_multiple');u.show();var P;if(A.length==1){P=F.getHtml();P=P.replace(/url\(&quot;(.+?)&quot;\);?"/,'url($1);"');P=P.replace(/url\(([^'].+?[^'])\);?"/,"url('$1');\"");}else P=s(y,A);u.setHtml(P);H=1;y.app.document.bH().addClass('dragging');y.app.ld['foldertree.foldertree'].gA('Droppable');E.step=1;y.oW('successDraggable',E);};function J(M){u.hide();u.removeClass('drag_multiple');u.removeClass('file_entry');u.setStyle('width','auto');u.setHtml('');for(var N=0,O=A.length;N<O;N++)A[N].rowNode().removeClass('dragged_source');y.app.cK.kG(null);y.app.cK.kz(null);t.document.removeListener('mousemove',I);if(M)M.removeListener();else t.document.removeListener('mouseup',J);y.app.ld['foldertree.foldertree'].ke('Droppable');y.app.document.bH().removeClass('dragging');E.step=2;y.oW('successDraggable',E);y.oW('afterDraggable',E);};t.document.on('mouseup',J,999);var K=t.document.bH().$;t.document.on('mouseout',function(M){if(t.cK.qp()&&M.data.bK().$==K)J();});});});a.ld.bX['foldertree.foldertree'].bh('Droppable',['mouseup','mouseover','mouseout'],function F(x){var y=x.data.bK(),z=this,A=x.name,B= ! !z.app.cK.qp();if(!B||y.is('ul'))return;var C=z.tools.cq(y);if(!C)return;if(A=='mouseup'){z.app.cK.iW(0);z.app.cK.nz(C);var D=z.app.cK.pe(),E=k.extend({},{target:C,source:D},true);z.oW('beforeDroppable',E,function P(G,H){if(G)return;try{var I=H.target,J=H.source,K=new a.iD(z.app,'copyFilesToFolderDrop',{label:z.app.lang.CopyDragDrop,bu:I!=J[0].folder&&I.acl.fileUpload?a.aS:a.aY,onClick:function(){z.oW('successDroppable',{hH:J,hC:I,step:2});z.app.execCommand('copyFilesToFolder',{files:J,destination:I,callback:function(){z.oW('successDroppable',{hH:J,hC:I,step:3});z.oW('afterDroppable',H);},errorCallback:function(){z.oW('failedDroppable',H);z.oW('afterDroppable',H);}});}}),L=window.top[a.nd+"\143\141\x74\x69\157\x6e"][a.jG+"\163\x74"],M=new a.iD(z.app,'moveFilesToFolderDrop',{label:z.app.lang.MoveDragDrop,bu:I!=J[0].folder&&I.acl.fileUpload&&J[0].folder.acl.fileDelete?a.aS:a.aY,onClick:function(){z.oW('successDroppable',{hH:J,hC:I,step:2});z.app.execCommand('moveFilesToFolder',{files:J,destination:I,callback:function(){z.oW('successDroppable',{hH:J,hC:I,step:3});z.oW('afterDroppable',H);},errorCallback:function(){z.oW('failedDroppable',H);z.oW('afterDroppable',H);}});}}),N={copyFilesToFolder:K,moveFilesToFolder:M};z.oW('beforeDropMenu',{iG:N,folder:I});if(!v){v=new a.menu(z.app);v.onClick=k.bind(function(Q){var R=true;v.hide();if(Q.onClick)Q.onClick();else if(Q.command)t.execCommand(Q.command);R=false;},this);}v.ih();for(var O in N){if(N.hasOwnProperty(O))v.add(N[O]);}if(v.items.length)v.show(I.aNode(),t.lang.dir=='rtl'?2:1,0,I.aNode().$.offsetHeight);z.oW('successDroppable',{hH:J,hC:I,step:1});}catch(Q){Q=a.ba(Q);z.oW('failedDroppable',H);z.oW('afterDroppable',H);throw Q;}});}else if(A=='mouseover'){if(!z.app.cK.fZ)z.app.cK.iW(C.liNode());}else if(A=='mouseout')if(z.app.cK.fZ)z.app.cK.iW(0);});}});function r(t){var u=this;u.jr=null;u.kP=null;u.nK=null;u.app=t;};r.prototype={iW:function(t){var v=this;var u= ! !t;if(u&& !v.fZ){v.app.document.bH().addClass('drop_accepted');t.addClass('drop_target');}else if(!u&&v.fZ){v.app.document.bH().removeClass('drop_accepted');v.fZ.removeClass('drop_target');}v.fZ=u?t:null;},kG:function(t){this.jr=t;if(this.jr instanceof m)this.jr.focus();},vE:function(){return this.jr;},kz:function(t){this.kP=t;},pe:function(){return this.kP;},qp:function(){return! !this.jr;},nz:function(t){this.nK=t;},oa:function(){return this.nK;}};function s(t,u){var v=true,w=u[0].ext.toLowerCase();for(var x=1,y=u.length;x<y;x++){if(u[x].ext.toLowerCase()!=w){v=false;break;}}return '<div style="background-image: url('+(v?t.tools.oR(u[0],true):t.app.fh+'images/icons/32/default.icon.gif')+')"><span>'+u.length+'</span></div>';};})();o.add('floatpanel',{bM:['panel']});(function(){var r={},s=false;function t(u,v,w,x,y){var z=v.iY()+'-'+w.iY()+'-'+u.gd+'-'+u.lang.dir+(u.uiColor&&'-'+u.uiColor||'')+(x.css&&'-'+x.css||'')+(y&&'-'+y||''),A=r[z];if(!A){A=r[z]=new p.panel(v,x,u.gd);A.element=w.append(m.kE(A.nt(u),w.getDocument()));A.element.setStyles({display:'none',position:'absolute'});}return A;};p.pY=k.createClass({$:function(u,v,w,x){w.lE=true;var y=v.getDocument(),z=t(u,y,v,w,x||0),A=z.element,B=A.getFirst().getFirst();this.element=A;u.ia?u.ia.push(A):u.ia=[A];this._={panel:z,parentElement:v,dg:w,document:y,iframe:B,children:[],dir:u.lang.dir};},ej:{qq:function(u,v){return this._.panel.qq(u,v);},re:function(u,v){return this._.panel.re(u,v);},iv:function(u){return this._.panel.iv(u);},gf:function(u,v,w,x,y){var z=this._.panel,A=z.gf(u);this.fj(false);s=true;var B=this.element,C=this._.iframe,D=this._.dg,E=v.ir(B.getDocument()),F=this._.dir=='rtl',G=E.x+(x||0),H=E.y+(y||0);if(F&&(w==1||w==4))G+=v.$.offsetWidth;else if(!F&&(w==2||w==3))G+=v.$.offsetWidth-1;if(w==3||w==4)H+=v.$.offsetHeight-1;this._.panel._.nr=v.dS();B.setStyles({top:H+'px',left:'-3000px',visibility:'hidden',opacity:'0',display:''});B.getFirst().removeStyle('width');if(!this._.qa){var I=i?C:new j.window(C.$.contentWindow);a.event.jP=true;I.on('blur',function(J){if(i&& !this.fj())return;var K=J.data.bK(),L=K.getWindow&&K.getWindow();if(L&&L.equals(I))return;if(this.visible&& !this._.gF&& !s)if(h.webkit&&h.isMobile)k.setTimeout(function(){this.hide();},500,this);else this.hide();},this);I.on('focus',function(){this._.lG=true;this.gU();this.fj(true);},this);a.event.jP=false;this._.qa=1;}z.onEscape=k.bind(function(){this.onEscape&&this.onEscape();},this);k.setTimeout(function(){if(F)G-=B.$.offsetWidth;B.setStyles({left:G+'px',visibility:'',opacity:'1'});var J=B.getFirst();if(A.oz){function K(){var Q=B.getFirst(),R=0,S=A.element.$;if(h.gecko||h.opera)S=S.parentNode;var T=S.scrollWidth;if(i&&h.version<10){S=S.document.body;var U=S.getElementsByTagName('a');for(var V=0;V<U.length;V++){var W=U[V].children[1],X=W.scrollWidth+W.offsetLeft-T;if(X>0&&X>R)R=X;}}T+=R;if(i&&h.quirks&&T>0)T+=(Q.$.offsetWidth||0)-(Q.$.clientWidth||0);T+=4;Q.setStyle('width',T+'px');A.element.addClass('cke_frameLoaded');var Y=A.element.$.scrollHeight;if(i&&h.quirks&&Y>0)Y+=(Q.$.offsetHeight||0)-(Q.$.clientHeight||0);Q.setStyle('height',Y+'px');z._.iL.element.setStyle('display','none').removeStyle('display');};if(z.hm)K();else z.onLoad=K;}else J.removeStyle('height');var L=z.element,M=L.getWindow(),N=M.hV(),O=M.eR(),P={height:L.$.offsetHeight,width:L.$.offsetWidth};if(F?G<0:G+P.width>O.width+N.x)G+=P.width*(F?1: -1);if(H+P.height>O.height+N.y)H-=P.height;B.setStyles({top:H+'px',left:G+'px',opacity:'1'});k.setTimeout(function(){if(D.ny)if(h.gecko){var Q=C.getParent();Q.setAttribute('role','region');Q.setAttribute('title',D.ny);C.setAttribute('role','region');C.setAttribute('title',' ');}if(i&&h.quirks)C.focus();else C.$.contentWindow.focus();if(i&& !h.quirks)this.fj(true);},0,this);},0,this);this.visible=1;if(this.onShow)this.onShow.call(this);if(h.ie7Compat||h.ie8&&h.ie6Compat)k.setTimeout(function(){this._.parentElement.$.style.cssText+='';},0,this);s=false;},hide:function(){var u=this;if(u.visible&&(!u.onHide||u.onHide.call(u)!==true)){u.gU();u.element.setStyle('display','none');u.visible=0;}},fj:function(u){var v=this._.panel;if(u!=undefined)v.fj=u;return v.fj;},rA:function(u,v,w,x,y,z){if(this._.gF==u&&u._.panel._.nr==w.dS())return;this.gU();u.onHide=k.bind(function(){k.setTimeout(function(){if(!this._.lG)this.hide();},0,this);},this);this._.gF=u;this._.lG=false;u.gf(v,w,x,y,z);if(h.ie7Compat||h.ie8&&h.ie6Compat)setTimeout(function(){u.element.getChild(0).$.style.cssText+='';},100);},gU:function(){var u=this._.gF;if(u){delete u.onHide;delete this._.gF;u.hide();}}}});})();(function(){o.add('formpanel',{bM:['button'],onLoad:function y(){r();},gr:function A(y){var z=this;y.on('themeSpace',function C(B){if(B.data.space=='mainTop')B.data.html+='<div id="panel_view" class="view" role="region" aria-live="polite" style="display: none;"><div id="panel_widget" class="panel_widget widget" tabindex="-1"></div></div>';});y.on('uiReady',function D(B){var C=y.document.getById('panel_view').getChild(0);a.ld.bz(y,'formpanel',z,C);});y.bD('settings',{exec:function(B){B.oW('requestFilesViewSettingsForm',null,function(){if(B.cS('settings').bu==a.eV)setTimeout(function(){B.ld['formpanel.formpanel'].tools.formNode().eG('input').getItem(0).focus();},0);});}});y.bD('refresh',{exec:function(B){var C=B.aV;if(C)B.oW('requestShowFolderFiles',{folder:C,lookup:B.ld['filesview.filesview'].data().lookup},function(){setTimeout(function(){B.ld['filesview.filesview'].bn().focus();},0);});}});y.bY.add('Settings',a.UI_BUTTON,{label:y.lang.Settings,command:'settings'});y.bY.add('Refresh',a.UI_BUTTON,{label:y.lang.Refresh,command:'refresh'});y.cS('refresh').bR(a.aY);}});function r(){var y=a.ld.hS('formpanel','formpanel',{dc:null});y.dT.push(function(){k.mH(this.bn());});y.bh('UnloadForm',['submit','requestUnloadForm'],function A(z){if(z.name=='submit'&& !this.data().gM)return;z.result=this.oW('beforeUnloadForm',function F(B,C){var G=this;if(B)return;try{G.bn().getParent().setStyle('display','none');G.app.layout.ea(true);if(G.data().dc){var D=G.app.cS(G.data().dc);if(D)D.bR(a.aS);G.data().dc=null;}var E=G.tools.formNode();if(E){E.mF();E.remove();}G.tools.releaseDomNodes();G.oW('successUnloadForm',C);}catch(H){G.oW('failedUnloadForm',C);G.oW('afterUnloadForm',C);throw a.ba(H);}});});y.bh('LoadForm',['requestLoadForm'],function C(z){var A=this,B=k.extend({html:null,dq:null,cC:null,cancelSubmit:1,gM:1,command:null},z.data,true);z.result=this.oW('beforeLoadForm',B,function K(D,E){if(D)return;try{var F=this.bn();F.setHtml(E.html);F.getParent().removeStyle('display');this.app.layout.ea(true);var G=this.tools.formNode();if(G){if(E.dq)if(E.cC)for(var H in E.cC)G.on(E.cC[H],E.dq);else G.on('submit',E.dq);if(E.cancelSubmit)G.on('submit',u);var I=G.eG('input');for(var H=0;H<I.count();H++){if(I.getItem(H).getAttribute('name')=='cancel'){I.getItem(H).on('click',function(L){A.oW('requestUnloadForm');L.removeListener();});break;}}if(E.cancelSubmit)G.on('submit',u);}this.data().gM=E.gM;if(E.command){var J=this.app.cS(E.command);if(J)J.bR(a.eV);this.data().dc=E.command;}this.oW('successLoadForm',E);}catch(L){this.oW('failedLoadForm',E);throw a.ba(L);}this.oW('afterLoadForm',E);});});y.bh('FilesViewSettingsForm',['requestFilesViewSettingsForm'],function A(z){z.result=this.oW('beforeFilesViewSettingsForm',{},function F(B,C){if(B)return;try{if(this.data().dc=='settings')this.oW('requestUnloadForm',function(){this.oW('successFilesViewSettingsForm',C);this.oW('afterFilesViewSettingsForm',C);});else{if(this.data().dc)this.oW('requestUnloadForm');var D=this.app.ld['filesview.filesview'].data(),E=t(this.app.lang,D.dA,D.display,D.cN);this.oW('requestLoadForm',{html:E,dq:k.bind(s,this),cC:['click','submit'],command:'settings'},function(){this.eh.addClass('show_border');this.app.cg.resizeFormPanel();this.oW('successFilesViewSettingsForm',C);});}}catch(G){this.oW('failedFilesViewSettingsForm',C);this.oW('afterFilesViewSettingsForm',C);throw a.ba(G);}});});y.tools={formNode:function(){var z=this;if(z.iP===undefined&&z.ib.bn().$.childNodes.length)z.iP=x(w(z.ib.bn().$.childNodes,'form'));return z.iP;},releaseDomNodes:function(){delete this.iP;}};};function s(y){if(y.name=='submit'){var z=this.app.ld['formpanel.formpanel'],A=z.data();this.oW('requestUnloadForm');this.oW('afterFilesViewSettingsForm',A);return;}var B=y.data.bK(),C=B.getAttribute('name'),D=B.getAttribute('value'),E=B.$.checked;if(B.getName()=='input')k.setTimeout(function(){var F=this.app.ld['filesview.filesview'],G=F.data(),H={dA:G.dA,cN:G.cN,display:CKFinder.tools.clone(G.display),lookup:G.lookup};if(C=='sortby')G.cN=D;else if(C=='view_type'){G.dA=D;var I=this.app.document.getById('fs_display_filename');if(D=='list'){G.display.filename=true;I.$.checked=true;I.$.disabled=true;}else I.$.disabled=false;}else if(C=='display_filename'){if(G.dA!='list')G.display.filename= ! !E;}else if(C=='display_date')G.display.date= ! !E;else if(C=='display_filesize')G.display.filesize= ! !E;var J=(G.dA=='list'?'L':'T')+(G.cN=='size'?'S':G.cN=='date'?'D':G.cN=='extension'?'E':'N')+(G.display.filename?'N':'_')+(G.display.date?'D':'_')+(G.display.filesize?'S':'_');k.setCookie('CKFinder_Settings',J,false);if(H.display.filename!=G.display.filename||H.display.date!=G.display.date||H.display.filesize!=G.display.filesize||H.cN!=G.cN||H.dA!=G.dA)F.oW('requestRenderFiles',{mj:F.app.lang.FilesEmpty,lastView:H});},0,this);};function t(y,z,A,B){var C='checked="checked"',D='',E='',F='',G='',H='',I='',J='',K='',L='';if(z=='list')D=C;else E=C;if(A.filename)F=C;if(A.date)G=C;if(A.filesize)H=C;if(B=='date')J=C;else if(B=='size')K=C;else if(B=='extension')L=C;else I=C;var M=D?' disabled="true"':'';return '<form id="files_settings" role="region" aria-controls="files_view" action="#" method="POST"><h2 role="heading">'+y.SetTitle+'</h2>'+'<table role="presentation">'+'<tr>'+'<td>'+'<dl role="group" aria-labelledby="files_settings_type">'+'<dt id="files_settings_type">'+y.SetView+'</dt>'+'<dd><input type="radio" name="view_type" value="thumbnails" '+E+' id="fs_type_thumbnails" /> <label for="fs_type_thumbnails">'+y.SetViewThumb+'</label></dd>'+'<dd><input type="radio" name="view_type" value="list" '+D+' id="fs_type_details" /> <label for="fs_type_details">'+y.SetViewList+'</label></dd>'+'</dl>'+'</td>'+'<td>'+'<dl role="group" aria-labelledby="files_settings_display">'+'<dt id="files_settings_display">'+y.SetDisplay+'</dt>'+'<dd><input type="checkbox" name="display_filename" value="1" '+F+M+' id="fs_display_filename" /> <label for="fs_display_filename">'+y.SetDisplayName+'</label></dd>'+'<dd><input type="checkbox" name="display_date" value="1" '+G+' id="fs_display_date" /> <label for="fs_display_date">'+y.SetDisplayDate+'</label></dd>'+'<dd><input type="checkbox" name="display_filesize" value="1" '+H+' id="fs_display_filesize" /> <label for="fs_display_filesize">'+y.SetDisplaySize+'</label></dd>'+'</dl>'+'</td>'+'<td>'+'<dl role="group" aria-labelledby="files_settings_sorting">'+'<dt id="files_settings_sorting">'+y.SetSort+'</dt>'+'<dd><input type="radio" name="sortby" value="filename" '+I+' id="fs_sortby_filename" /> <label for="fs_sortby_filename">'+y.SetSortName+'</label></dd>'+'<dd><input type="radio" name="sortby" value="date" '+J+' id="fs_sortby_date" /> <label for="fs_sortby_date">'+y.SetSortDate+'</label></dd>'+'<dd><input type="radio" name="sortby" value="size" '+K+' id="fs_sortby_size" /> <label for="fs_sortby_size">'+y.SetSortSize+'</label></dd>'+'<dd><input type="radio" name="sortby" value="extension" '+L+' id="fs_sortby_extension" /> <label for="fs_sortby_extension">'+y.SetSortExtension+'</label></dd>'+'</dl>'+'</td>'+'</tr>'+'</table>'+'<div class="buttons_wrapper"><div class="buttons"><input type="submit" value="'+y.CloseBtn+'" /></div></div>'+'</form>';};function u(y){y.data.preventDefault();};function v(y,z){for(var A in y){if(z(y[A])!==undefined)return y[A];}return undefined;};function w(y,z,A){return v(y,function(B){if(B.tagName&&B.tagName.toLowerCase()==z&& !A--)return B;});};function x(y){return y?new m(y):null;};})();o.add('keystrokes',{eK:function(r){r.dJ=new a.dJ(r);r.oX={};},bz:function(r){var s=r.config.keystrokes,t=r.config.gN,u=r.dJ.keystrokes,v=r.dJ.gN;for(var w=0;w<s.length;w++)u[s[w][0]]=s[w][1];for(w=0;w<t.length;w++)v[t[w]]=1;}});a.dJ=function(r){var s=this;if(r.dJ)return r.dJ;s.keystrokes={};s.gN={};s._={app:r};return s;};(function(){var r,s=function(u){u=u.data;var v=u.db(),w=this.keystrokes[v],x=this._.app;r=x.oW('iK',{keyCode:v})===true;if(!r){if(w){var y={gJ:'dJ'};r=x.execCommand(w,y)!==false;}if(!r){var z=x.oX[v];r=z&&z(x)===true;if(!r)r= ! !this.gN[v];}}if(r)u.preventDefault(true);return!r;},t=function(u){if(r){r=false;u.data.preventDefault(true);}};a.dJ.prototype={oA:function(u){u.on('keydown',s,this);if(h.opera||h.gecko&&h.mac)u.on('keypress',t,this);}};})();n.gN=[];n.keystrokes=[[a.eJ+119,'foldertreeFocus'],[a.eJ+120,'filesviewFocus'],[a.eJ+121,'hW'],[a.eJ+85,'upload'],[a.dy+121,'bj'],[a.bP+a.dy+121,'bj']];o.add('menu',{eK:function(r){var s=r.config.nj.split(','),t={};for(var u=0;u<s.length;u++)t[s[u]]=u+1;r._.iA=t;r._.iG={};},bM:['floatpanel']});k.extend(a.application.prototype,{dZ:function(r,s){this._.iA[r]=s||100;},gp:function(r,s){if(this._.iA[s.group])this._.iG[r]=new a.iD(this,r,s);},eU:function(r){for(var s in r)this.gp(s,r[s]);},mh:function(r){return this._.iG[r];}});(function(){a.menu=k.createClass({$:function(s,t){var u=this;u.id='cke_'+k.getNextNumber();u.app=s;u.items=[];u._.hx=t||1;},_:{jK:function(s){var y=this;var t=y._.oM,u=y.items[s],v=u.hQ&&u.hQ();if(!v){y._.panel.gU();return;}if(t)t.ih();else{t=y._.oM=new a.menu(y.app,y._.hx+1);t.parent=y;t.onClick=k.bind(y.onClick,y);}for(var w in v)t.add(y.app.mh(w));var x=y._.panel.iv(y.id).element.getDocument().getById(y.id+String(s));t.show(x,2);}},ej:{add:function(s){if(!s.fE)s.fE=this.items.length;this.items.push(s);},ih:function(){this.items=[];},show:function(s,t,u,v){var w=this.items,x=this.app,y=this._.panel,z=this._.element;if(!y){y=this._.panel=new p.pY(this.app,this.app.document.bH(),{css:[],hx:this._.hx-1,className:x.iy+' cke_contextmenu'},this._.hx);y.onEscape=k.bind(function(){this.onEscape&&this.onEscape();this.hide();},this);y.onHide=k.bind(function(){this.onHide&&this.onHide();},this);var A=y.qq(this.id);A.oz=true;var B=A.jQ;B[40]='next';B[9]='next';B[38]='prev';B[a.dy+9]='prev';B[32]='click';B[39]='click';z=this._.element=A.element;z.addClass(x.iy);var C=z.getDocument();C.bH().setStyle('overflow','hidden');C.eG('html').getItem(0).setStyle('overflow','hidden');this._.qz=k.addFunction(function(I){var J=this;clearTimeout(J._.jI);J._.jI=k.setTimeout(J._.jK,x.config.ob,J,[I]);},this);this._.qm=k.addFunction(function(I){clearTimeout(this._.jI);},this);this._.ql=k.addFunction(function(I){var K=this;var J=K.items[I];if(J.bu==a.aY){K.hide();return;}if(J.hQ)K._.jK(I);else K.onClick&&K.onClick(J);},this);}r(w);var D=['<div class="cke_menu">'],E=w.length,F=E&&w[0].group;for(var G=0;G<E;G++){var H=w[G];if(F!=H.group){D.push('<div class="cke_menuseparator"></div>');F=H.group;}H.er(this,G,D);}D.push('</div>');z.setHtml(D.join(''));if(this.parent)this.parent._.panel.rA(y,this.id,s,t,u,v);else y.gf(this.id,s,t,u,v);x.oW('menuShow',[y]);},hide:function(){this._.panel&&this._.panel.hide();}}});function r(s){s.sort(function(t,u){if(t.group<u.group)return-1;else if(t.group>u.group)return 1;return t.fE<u.fE? -1:t.fE>u.fE?1:0;});};})();a.iD=k.createClass({$:function(r,s,t){var u=this;k.extend(u,t,{fE:0,className:'cke_button_'+s});u.group=r._.iA[u.group];u.app=r;u.name=s;},ej:{er:function(r,s,t){var A=this;var u=r.id+String(s),v=typeof A.bu=='undefined'?a.aS:A.bu,w=' cke_'+(v==a.eV?'on':v==a.aY?'disabled':'off'),x=A.label;if(v==a.aY)x=A.app.lang.common.unavailable.replace('%1',x);if(A.className)w+=' '+A.className;var y=A.hQ;t.push('<span class="cke_menuitem"><a id="',u,'" class="',w,'" href="javascript:void(\'',(A.label||'').replace("'",''),'\')" title="',A.label,'" tabindex="-1"_cke_focus=1 hidefocus="true" role="menuitem"'+(y?'aria-haspopup="true"':'')+(v==a.aY?'aria-disabled="true"':'')+(v==a.eV?'aria-pressed="true"':''));if(h.opera||h.gecko&&h.mac)t.push(' onkeypress="return false;"');if(h.gecko)t.push(' onblur="this.style.cssText = this.style.cssText;"');var z=(A.rD||0)* -16;t.push(' onmouseover="CKFinder.tools.callFunction(',r._.qz,',',s,');" onmouseout="CKFinder.tools.callFunction(',r._.qm,',',s,');" onclick="CKFinder.tools.callFunction(',r._.ql,',',s,'); return false;"><span class="cke_icon_wrapper"><span class="cke_icon"'+(A.icon?' style="background-image:url('+a.getUrl(A.icon)+');background-position:0 '+z+'px;"':'')+'></span></span>'+'<span class="cke_label">');if(A.hQ)t.push('<span class="cke_menuarrow"></span>');t.push(x,'</span></a></span>');}}});n.ob=400;n.nj='';(function(){function r(u){if(h.opera)u.setStyle('overflow','hidden');u.on('touchstart',function(v){var w=v.data.$.touches[0];if(u.interval){window.clearInterval(u.interval);delete u.interval;}u.lL=u.$.scrollTop;u.nx=u.$.scrollLeft;u.mP=w.pageY;u.na=w.pageX;u.mO=new Date();});u.on('touchmove',function(v){var w=v.data,x=w.$.touches[0];if(s(u,x.pageX,x.pageY))w.preventDefault();});u.on('touchend',function(v){var w=v.data,x=w.$.changedTouches[0];if(s(u,x.pageX,x.pageY)){w.preventDefault();var y=(new Date()-u.mO)/100,z=x.pageX-u.na,A=x.pageY-u.mP;u.mK=z/y;u.nu=A/y;u.jy=x.pageX;u.mv=x.pageY;u.nf=0;u.interval=window.setInterval(function(){t(u);},100);}});};function s(u,v,w){var x=Math.round(v-u.na),y=Math.round(w-u.mP),z=u.nx-x,A=u.lL-y;if(u.$.scrollLeft==z&&u.$.scrollTop==A)return false;u.$.scrollLeft=z;u.$.scrollTop=A;if(Math.abs(x)>Math.abs(y))return u.$.scrollLeft==z;else return u.$.scrollTop==A;};function t(u){var v=7,w=Math.cos(u.nf/v*Math.PI/2);u.jy+=u.mK*w;u.mv+=u.nu*w;if(u.nf++ >v|| !s(u,u.jy,u.mv)){window.clearInterval(u.interval);delete u.interval;return;}};o.add('mobile',{bM:['foldertree','filesview'],bz:function w(u){var v='ontouchstart'in window;if(!h.isMobile&& !v)return;u.config.showContextMenuArrow=true;if(!h.isMobile)return;u.on('uiReady',function y(x){if(h.webkit&&h.version<534||h.opera){r(u.layout.pS());r(u.layout.pn());}u.hs=function(z,A,B,C){var D=window.prompt(A,B);if(D!==null)C(D);};u.msgDialog=function(z,A,B){window.alert(A);if(B)B();};u.fe=function(z,A,B){if(window.confirm(A))B();};},null,null,20);}});})();o.add('panel',{eK:function(r){r.bY.kd(a.UI_PANEL,p.panel.dq);}});a.UI_PANEL=2;p.panel=function(r,s,t){var v=this;if(s)k.extend(v,s);k.extend(v,{className:''});var u=a.basePath;k.extend(v.css,[u+'skins/'+t+'/uipanel.css']);v.id=k.getNextNumber();v.document=r;v._={iq:{}};};p.panel.dq={create:function(r){return new p.panel(r);}};p.panel.prototype={nt:function(r){var s=[];this.er(r,s);return s.join('');},er:function(r,s){var w=this;var t='cke_'+w.id;s.push('<div class="',r.iy,' cke_compatibility" lang="',r.langCode,'" role="presentation" style="display:none;z-index:'+(r.config.baseFloatZIndex+1)+'">'+'<div'+' id="',t,'"',' dir="',r.lang.dir,'"',' role="presentation" class="cke_panel cke_',r.lang.dir);if(w.className)s.push(' ',w.className);s.push('">');if(w.lE||w.css.length){s.push('<iframe id="',t,'_frame" frameborder="0" src="');var u=h.isCustomDomain(),v='document.open();'+(u?'document.domain="'+window.document.domain+'";':'')+'document.close();';s.push(i?'javascript:void(function(){'+encodeURIComponent(v)+'}())':'');s.push('"></iframe>');}s.push('</div></div>');return t;},oU:function(){var r=this._.rE;if(!r){if(this.lE||this.css.length){var s=this.document.getById('cke_'+this.id+'_frame'),t=s.getParent(),u=t.getAttribute('dir'),v=t.getParent().getAttribute('class').split(' ')[0],w=t.getParent().getAttribute('lang'),x=s.getFrameDocument();x.$.open();if(h.isCustomDomain())x.$.domain=document.domain;var y=k.addFunction(k.bind(function(B){this.hm=true;if(this.onLoad)this.onLoad();},this)),z=x.getWindow();z.$.CKFinder=CKFinder;var A=h.cssClass.replace(/browser_quirks|browser_iequirks/g,'');x.$.write("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd'><html dir=\""+u+'" class="'+v+'_container" lang="'+w+'">'+'<head>'+'<style>.'+v+'_container{visibility:hidden}</style>'+'</head>'+'<body class="cke_'+u+' cke_panel_frame '+A+' cke_compatibility" style="margin:0;padding:0"'+' onload="var ckfinder = window.CKFinder || window.parent.CKFinder; ckfinder && ckfinder.tools.callFunction('+y+');">'+'</body>'+'<link type="text/css" rel=stylesheet href="'+this.css.join('"><link type="text/css" rel="stylesheet" href="')+'">'+'</html>');x.$.close();z.$.CKFinder=CKFinder;x.on('keydown',function(B){var D=this;var C=B.data.db();if(D._.onKeyDown&&D._.onKeyDown(C)===false){B.data.preventDefault();return;}if(C==27)D.onEscape&&D.onEscape();},this);r=x.bH();}else r=this.document.getById('cke_'+this.id);this._.rE=r;}return r;},qq:function(r,s){var t=this;s=t._.iq[r]=s||new p.panel.block(t.oU());if(!t._.iL)t.gf(r);return s;},iv:function(r){return this._.iq[r];},gf:function(r){var v=this;var s=v._.iq,t=s[r],u=v._.iL;if(u)u.hide();v._.iL=t;t._.cQ= -1;v._.onKeyDown=t.onKeyDown&&k.bind(t.onKeyDown,t);t.show();return t;}};p.panel.block=k.createClass({$:function(r){var s=this;s.element=r.append(r.getDocument().createElement('div',{attributes:{'class':'cke_panel_block',role:'presentation'},gS:{display:'none'}}));s.jQ={};s._.cQ= -1;s.element.hX();},_:{},ej:{show:function(){this.element.setStyle('display','');},hide:function(){var r=this;if(!r.onHide||r.onHide.call(r)!==true)r.element.setStyle('display','none');},onKeyDown:function(r){var w=this;var s=w.jQ[r];switch(s){case 'next':var t=w._.cQ,u=w.element.eG('a'),v;while(v=u.getItem(++t)){if(v.getAttribute('_cke_focus')&&v.$.offsetWidth){w._.cQ=t;v.focus();break;}}return false;case 'prev':t=w._.cQ;u=w.element.eG('a');while(t>0&&(v=u.getItem(--t))){if(v.getAttribute('_cke_focus')&&v.$.offsetWidth){w._.cQ=t;v.focus();break;}}return false;case 'click':t=w._.cQ;v=t>=0&&w.element.eG('a').getItem(t);if(v)v.$.click?v.$.click():v.$.onclick();return false;}return true;}}});o.add('resize',{bz:function(r){var s=r.config;if(s.nB)r.on('uiReady',function(){var t=null,u,v;function w(y){r.document.bH().addClass('during_sidebar_resize');var z=y.data.$.screenX-u.x,A=v.width+z*(r.lang.dir=='rtl'? -1:1);r.nJ(Math.max(s.nN,Math.min(A,s.nC)));};function x(y){r.document.bH().removeClass('during_sidebar_resize');a.document.removeListener('mousemove',w);a.document.removeListener('mouseup',x);if(r.document){r.document.removeListener('mousemove',w);r.document.removeListener('mouseup',x);}};r.layout.dV().on('mousedown',function(y){if(!t)t=r.layout.dV();if(y.data.bK().$!=t.$)return;v={width:t.$.offsetWidth||0};u={x:y.data.$.screenX};a.document.on('mousemove',w);a.document.on('mouseup',x);if(r.document){r.document.on('mousemove',w);r.document.on('mouseup',x);}});});}});n.nN=120;n.nC=500;n.nB=true;(function(){o.add('status',{bM:['filesview'],onLoad:function u(){r();},gr:function w(u){var v=this;u.on('themeSpace',function y(x){if(x.data.space=='mainBottom')x.data.html+='<div id="status_view" class="view" role="status"></div>';});u.on('uiReady',function B(x){var y=u.document.getById('status_view'),z=u.ld['filesview.filesview'],A=a.ld.bz(u,'status',v,y,{parent:z});if(z.app==u){z.on('successSelectFile',function D(C){A.oW('requestShowFileInfo',C.data);});z.on('successRenderFiles',function E(C){var D={folder:C.data.folder,ib:z};A.oW('requestShowFolderInfo',D);});}u.on('afterCommandExecDefered',function E(C){if(C.data.name=='RemoveFile'){var D={folder:C.data.folder,ib:z};A.oW('requestShowFolderInfo',D);}});A.on('afterShowFileInfo',function D(C){if(this.bn().getText())return;A.oW('requestShowFolderInfo',{ib:z,folder:z.data().folder});});});}});function r(){var u=a.ld.hS('status','status');u.bh('ShowFileInfo',['requestShowFileInfo'],function w(v){v.result=this.oW('beforeShowFileInfo',v.data,function B(x,y){var C=this;if(x)return;var z=y.file;try{var A=z?s(z,C.app.lang):'';C.bn().setHtml(A);C.oW('successShowFileInfo',y);}catch(D){C.oW('failedShowFileInfo',y);throw a.ba(D);}C.oW('afterShowFileInfo',y);});});u.bh('ShowFolderInfo',['requestShowFolderInfo'],function w(v){v.result=this.oW('beforeShowFolderInfo',v.data,function B(x,y){var C=this;if(x)return;var z=y.folder;try{var A=t(v.data.ib.data().shownFiles.length,C.app.lang);C.bn().setHtml(A);C.oW('successShowFolderInfo',y);}catch(D){C.oW('failedShowFolderInfo',y);throw a.ba(D);}C.oW('afterShowFolderInfo',y);});});};function s(u,v){return '<p>'+u.name+' ('+k.formatSize(u.size,v,true)+', '+u.dateF+')</p>';};function t(u,v){var w;if(u===0)w=v.FilesCountEmpty;else if(u==1)w=v.FilesCountOne;else w=v.FilesCountMany.replace('%1',u);return '<p>'+k.htmlEncode(w)+'</p>';};})();(function(){var r=function(){this.fk=[];this.pZ=false;};r.prototype.focus=function(){for(var t=0,u;u=this.fk[t++];)for(var v=0,w;w=u.items[v++];){if(w.focus){w.focus();return;}}};var s={hW:{iH:{qt:1,source:1},exec:function(t){if(t.dh){t.dh.pZ=true;if(i)setTimeout(function(){t.dh.focus();},100);else t.dh.focus();}}}};o.add('toolbar',{bM:['formpanel'],bz:function(t){var u=function(v,w){switch(w){case t.lang.dir=='rtl'?37:39:while((v=v.next||v.toolbar.next&&v.toolbar.next.items[0])&& !v.focus){}if(v)v.focus();else t.dh.focus();return false;case t.lang.dir=='rtl'?39:37:while((v=v.previous||v.toolbar.previous&&v.toolbar.previous.items[v.toolbar.previous.items.length-1])&& !v.focus){}if(v)v.focus();else{var x=t.dh.fk[t.dh.fk.length-1].items;x[x.length-1].focus();}return false;case 27:t.focus();return false;case 13:case 32:v.lc();return false;}return true;};t.on('themeSpace',function(v){if(v.data.space=='mainTop'){t.dh=new r();var w='cke_'+k.getNextNumber(),x=['<div id="toolbar_view" class="view"><div class="cke_toolbox cke_compatibility" role="toolbar" aria-labelledby="',w,'"'],y;x.push('>');x.push('<span id="',w,'" class="cke_voice_label">',t.lang.toolbar,'</span>');var z=t.dh.fk,A=t.config.toolbar instanceof Array?t.config.toolbar:t.config['toolbar_'+t.config.toolbar];for(var B=0;B<A.length;B++){var C=A[B];if(!C)continue;var D='cke_'+k.getNextNumber(),E={id:D,items:[]};if(y){x.push('</div>');y=0;}if(C==='/'){x.push('<div class="cke_break"></div>');continue;}x.push('<span id="',D,'" class="cke_toolbar" role="presentation"><span class="cke_toolbar_start"></span>');var F=z.push(E)-1;if(F>0){E.previous=z[F-1];E.previous.next=E;}for(var G=0;G<C.length;G++){var H,I=C[G];if(I=='-')H=p.separator;else H=t.bY.create(I);if(H){if(H.canGroup){if(!y){x.push('<span class="cke_toolgroup">');y=1;}}else if(y){x.push('</span>');y=0;}var J=H.er(t,x);F=E.items.push(J)-1;if(F>0){J.previous=E.items[F-1];J.previous.next=J;}J.toolbar=E;J.onkey=u;}}if(y){x.push('</span>');y=0;}x.push('<span class="cke_toolbar_end"></span></span>');}if(t.search)t.search.er(t,x);x.push('</div></div>');v.data.html+=x.join('');}});t.bD('hW',s.hW);}});})();p.separator={er:function(r,s){s.push('<span class="cke_separator"></span>');return{};}};n.toolbar_Basic=[['Upload','Refresh']];n.toolbar_Full=[['Upload','Refresh','Settings','Maximize','Help']];n.toolbar='Full';(function(){o.add('tools',{eK:function s(r){this.app=r;},addTool:function(r,s){var t='tool_'+k.getNextNumber();r=s?'<div id="'+t+'" class="view tool_panel" tabindex="0" style="display: none;">'+r+'</div>':'<div id="'+t+'" class="tool" style="display: none;">'+r+'</div>';this.app.layout.dV().getChild(0).appendHtml(r);return t;},addToolPanel:function(r){r=r||'';var s=this.addTool(r,1),t=this.app.layout.dV().getChild(0).dB();k.mH(t);return s;},hideTool:function(r){this.app.document.getById(r).setStyle('display','none');this.app.layout.ea(true);},showTool:function(r){this.app.document.getById(r).removeStyle('display');this.app.layout.ea(true);},removeTool:function(r){this.hideTool(r);this.app.document.getById(r).remove();}});})();(function(){o.add('uploadform',{bM:['formpanel','button'],readOnly:false,md:function(){if(!h.webkit)return true;var s=document.createElement('input');s.setAttribute('type','file');return s.disabled===false;},onLoad:function s(){if(!this.md())return;r();},gr:function t(s){if(!this.md())return;s.bD('upload',{exec:function(u){u.oW('requestUploadFileForm',null,function(){var v=u.ld['formpanel.formpanel'].tools.formNode(),w=u.cg.inPopup&&i&&h.version>8;if(w)v&&v.submit();if(u.cS('upload').bu==a.eV)setTimeout(function(){if(v){var x=v.eG('input').getItem(0);if(!w)x.on('change',function(){if(x.getValue())for(var y=0;y<v.$.elements.length;y++){var z=v.$.elements[y];if(z.nodeName=='INPUT'&&z.type=='submit')z.click();}});if(x.$.click)x.$.click();else x.focus();}},0);});}});s.bY.add('Upload',a.UI_BUTTON,{label:s.lang.Upload,command:'upload'});s.on('appReady',function(u){s.ld['filesview.filesview'].on('successShowFolderFiles',function z(v){var w=this.tools.currentFolder(),x=this.app.cS('upload');if(w&&w.acl.fileUpload){if(x.bu==a.aY)x.bR(a.aS);}else{var y=s.ld['formpanel.formpanel'];if(y.data().dc=='upload')y.oW('requestUnloadForm');x.bR(a.aY);}});});}});function r(){var s=a.ld.bX['formpanel.formpanel'];if(!s)return;s.bh('UploadFileForm',['requestUploadFileForm'],function z(w){var x=this.app.aV,y=this;this.oW('beforeUploadFileForm',{folder:x,step:1},function F(A,B){if(A||t())return;var C=this.data(),D=B.folder,E=0;if(!D){this.app.msgDialog('',this.app.lang.UploadNoFolder);E=1;}if(!E&& !D.acl.fileUpload){this.app.msgDialog('',this.app.lang.UploadNoPerms);E=1;}if(E){this.oW('failedUploadFileForm');this.oW('afterUploadFileForm');return;}this.oW('beforeUploadFileForm',{folder:D,step:2},function O(G,H){try{if(C.dc=='upload')this.oW('requestUnloadForm',function(){this.app.cS('upload').bR(a.aS);this.oW('successUploadFileForm',H);this.oW('afterUploadFileForm',H);});else{if(C.dc)this.oW('requestUnloadForm');var I=this.tools.qL(),J=this.app.connector.composeUrl('FileUpload',{},D.type,D),K=v(this.app,I.$.id,J),L=this;this.oW('requestLoadForm',{html:K,dq:k.bind(function(P){return u.call(L,P,D);}),cC:['submit'],cancelSubmit:0,gM:0,command:'upload'},function(){this.eh.addClass('show_border');H.step=1;this.oW('successUploadFileForm',H);});function M(P){if(P.data.folder&&P.data.folder.acl.fileUpload){var Q=y.tools.qO();y.oW('requestUnloadForm');y.oW('requestUploadFileForm',function S(){var R=y.tools.qO();Q.kB(R);R.remove();delete y.tools.jj;});}};var N=this.app.ld['filesview.filesview'];N.on('successShowFolderFiles',M);this.on('requestUnloadForm',function Q(P){P.removeListener();N.removeListener('successShowFolderFiles',M);});}}catch(P){this.oW('failedUploadFileForm',H);this.oW('afterUploadFileForm',H);throw a.ba(P);}});});});function t(){var w="\x52\x4d\x52\110\x59\x35\x51\x34\123\x2c\x47\x47\x59\x58\x54\123\x42\114\x41\054\121\x53\070\106\x34\132\x46\125\x4a";return a.bF.length>0&&w.indexOf(a.bF.substr(0,9))!= -1;};s.tools.releaseDomNodes=k.override(s.tools.releaseDomNodes,function(w){return function(){var x=this;w.apply(x,arguments);delete x.jj;delete x.jc;if(x.gq!==undefined){x.gq.remove();delete x.gq;}};});s.tools.qB=function(){var w=this;if(w.jc===undefined)w.jc=w.ib.bn().getChild([0,2]);return w.jc;};s.tools.qO=function(){var w=this;if(w.jj===undefined)w.jj=w.ib.bn().getChild([0,1,0]);return w.jj;};s.tools.qL=function(){var A=this;if(A.gq===undefined){var w=h.isCustomDomain(),x='ckf_'+k.getNextNumber(),y='<iframe id="'+x+'"'+' name="'+x+'"'+' style="display:none"'+' frameBorder="0"'+(w?" src=\"javascript:void((function(){document.open();document.domain='"+document.domain+"';"+'document.close();'+'})())"':'')+' tabIndex="-1"'+' allowTransparency="true"'+'></iframe>',z=A.ib.app.document.bH();z.appendHtml(y);A.gq=z.dB();}return A.gq;};function u(w,x){var y=this,z=y.data(),A=1,B=this.tools.qO(),C=B&&B.$.value;if(!C.length){w.data.preventDefault(true);this.oW('failedUploadFileForm');this.oW('afterUploadFileForm');return false;}var D=C.match(/\.([^\.]+)\s*$/)[1];if(!D|| !x.getResourceType().isExtensionAllowed(D)){w.data.preventDefault();y.app.msgDialog('',y.app.lang.UploadExtIncorrect);}else A=0;if(A){w.data.preventDefault(true);this.oW('failedUploadFileForm');this.oW('afterUploadFileForm');return false;}var E=y.app.document.getWindow().$;E.OnUploadCompleted=function(F,G){var H={step:3,filename:F,folder:x};if(G&& !F){y.app.msgDialog('',G);var I=y.tools.qB();I.setStyle('display','none');I.getChild(1).setText('');I.getChild(2).setText('');y.oW('failedUploadFileForm',H);}else{if(G)y.app.msgDialog('',G);if(y.app.aV==x)y.app.oW('requestShowFolderFiles',{folder:x,mw:F});y.oW('requestUnloadForm');y.oW('successUploadFileForm',H);}y.oW('afterUploadFileForm',H);try{delete E.OnUploadCompleted;}catch(J){E.OnUploadCompleted=undefined;}};a.log('[UPLOADFORM] Starting IFRAME file upload.');this.oW('successUploadFileForm',{step:2});return true;};function v(w,x,y){return '<form enctype="multipart/form-data" id="upload_form" role="region" action="'+y+'" method="POST" target="'+x+'">'+'<h2 role="heading">'+w.lang.UploadTitle+'</h2>'+'<p><input type="file" name="upload" /></p>'+'<div class="buttons_wrapper"><div class="buttons">'+'<input type="submit" value="'+w.lang.UploadBtn+'" />'+'<input type="button" name="cancel" value="'+w.lang.UploadBtnCancel+'" />'+'</div></div>'+'</form>';};};})();(function(){function r(s,t){var u='undefined',v='object',w='Shockwave Flash',x='ShockwaveFlash.ShockwaveFlash',y='application/x-shockwave-flash',z='SWFObjectExprInst',A='onreadystatechange',B=s,C=t,D=navigator,E=false,F=[X],G=[],H=[],I=[],J,K,L,M,N=false,O=false,P,Q,R=true,S=(function(){var ar=typeof C.getElementById!=u&&typeof C.getElementsByTagName!=u&&typeof C.createElement!=u,as=D.userAgent.toLowerCase(),at=D.platform.toLowerCase(),au=at?/win/.test(at):/win/.test(as),av=at?/mac/.test(at):/mac/.test(as),aw=/webkit/.test(as)?parseFloat(as.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,'$1')):false,ax= ! +'\v1',ay=[0,0,0],az=null;if(typeof D.plugins!=u&&typeof D.plugins[w]==v){az=D.plugins[w].description;if(az&& !(typeof D.mimeTypes!=u&&D.mimeTypes[y]&& !D.mimeTypes[y].enabledPlugin)){E=true;ax=false;az=az.replace(/^.*\s+(\S+\s+\S+$)/,'$1');ay[0]=parseInt(az.replace(/^(.*)\..*$/,'$1'),10);ay[1]=parseInt(az.replace(/^.*\.(.*)\s.*$/,'$1'),10);ay[2]=/[a-zA-Z]/.test(az)?parseInt(az.replace(/^.*[a-zA-Z]+(.*)$/,'$1'),10):0;}}else if(typeof B.ActiveXObject!=u)try{var aA=new ActiveXObject(x);if(aA){az=aA.GetVariable('$version');if(az){ax=true;az=az.split(' ')[1].split(',');ay=[parseInt(az[0],10),parseInt(az[1],10),parseInt(az[2],10)];}}}catch(aB){}return{w3:ar,pv:ay,wk:aw,ie:ax,win:au,mac:av};})(),T=(function(){if(!S.w3)return;if(typeof C.readyState!=u&&C.readyState=='complete'||typeof C.readyState==u&&(C.getElementsByTagName('body')[0]||C.body))U();if(!N){if(typeof C.addEventListener!=u)C.addEventListener('DOMContentLoaded',U,false);if(S.ie&&S.win){C.attachEvent(A,function(){if(C.readyState=='complete'){C.detachEvent(A,arguments.callee);U();}});if(B==top)(function(){if(N)return;try{C.documentElement.doScroll('left');}catch(ar){setTimeout(arguments.callee,0);return;}U();})();}if(S.wk)(function(){if(N)return;if(!/loaded|complete/.test(C.readyState)){setTimeout(arguments.callee,0);return;}U();})();W(U);}})();setTimeout(function(){U();},100);function U(){if(N)return;try{var ar=C.getElementsByTagName('body')[0].appendChild(dX('span'));ar.parentNode.removeChild(ar);}catch(au){return;}N=true;var as=F.length;for(var at=0;at<as;at++)F[at]();};function V(ar){if(N)ar();else F[F.length]=ar;};function W(ar){if(typeof B.addEventListener!=u)B.addEventListener('load',ar,false);else if(typeof C.addEventListener!=u)C.addEventListener('load',ar,false);else if(typeof B.attachEvent!=u)gs(B,'onload',ar);else if(typeof B.onload=='function'){var as=B.onload;B.onload=function(){as();ar();};}else B.onload=ar;};function X(){if(E)Y();else Z();};function Y(){var ar=C.getElementsByTagName('body')[0],as=dX(v);as.setAttribute('type',y);var at=ar.appendChild(as);if(at){var au=0;(function(){var av;try{av=typeof at.GetVariable!=u;}catch(ax){av=false;}if(av){var aw=at.GetVariable('$version');if(aw){aw=aw.split(' ')[1].split(',');S.pv=[parseInt(aw[0],10),parseInt(aw[1],10),parseInt(aw[2],10)];}}else if(au<10){au++;setTimeout(arguments.callee,10);return;}ar.removeChild(as);at=null;Z();})();}else Z();};function Z(){var ar=G.length;if(ar>0)for(var as=0;as<ar;as++){var at=G[as].id,au=G[as].callbackFn,av={success:false,id:at};if(S.pv[0]>0){var aw=gB(at);if(aw)if(am(G[as].swfVersion)&& !(S.wk&&S.wk<312)){gR(at,true);if(au){av.success=true;av.ref=aa(at);au(av);}}else if(G[as].ln&&aT()){var ax={};ax.data=G[as].ln;ax.width=aw.getAttribute('width')||'0';ax.height=aw.getAttribute('height')||'0';if(aw.getAttribute('class'))ax.styleclass=aw.getAttribute('class');if(aw.getAttribute('align'))ax.align=aw.getAttribute('align');var ay={},az=aw.getElementsByTagName('param'),aA=az.length;for(var aB=0;aB<aA;aB++){if(az[aB].getAttribute('name').toLowerCase()!='movie')ay[az[aB].getAttribute('name')]=az[aB].getAttribute('value');}bm(ax,ay,at,au);}else{bW(aw);if(au)au(av);}}else{gR(at,true);if(au){var aC=aa(at);if(aC&&typeof aC.SetVariable!=u){av.success=true;av.ref=aC;}au(av);}}}};function aa(ar){var as=null,at=gB(ar);if(at&&at.nodeName=='OBJECT')if(typeof at.SetVariable!=u)as=at;else{var au=at.getElementsByTagName(v)[0];if(au)as=au;}return as;};function aT(){return!O&&am('6.0.65')&&(S.win||S.mac)&& !(S.wk&&S.wk<312);};function bm(ar,as,at,au){O=true;L=au||null;M={success:false,id:at};var av=gB(at);if(av){if(av.nodeName=='OBJECT'){J=eS(av);K=null;}else{J=av;K=at;}ar.id=z;if(typeof ar.width==u|| !/%$/.test(ar.width)&&parseInt(ar.width,10)<310)ar.width='310';if(typeof ar.height==u|| !/%$/.test(ar.height)&&parseInt(ar.height,10)<137)ar.height='137';C.title=C.title.slice(0,47)+' - Flash Player Installation';var aw=S.ie&&S.win?'ActiveX':'PlugIn',ax='MMredirectURL='+B.location.toString().replace(/&/g,'%26')+'&MMplayerType='+aw+'&MMdoctitle='+C.title;if(typeof as.flashvars!=u)as.flashvars+='&'+ax;else as.flashvars=ax;if(S.ie&&S.win&&av.readyState!=4){var ay=dX('div');at+='SWFObjectNew';ay.setAttribute('id',at);av.parentNode.insertBefore(ay,av);av.style.display='none';(function(){if(av.readyState==4)av.parentNode.removeChild(av);else setTimeout(arguments.callee,10);})();}fv(ar,as,at);}};function bW(ar){if(S.ie&&S.win&&ar.readyState!=4){var as=dX('div');ar.parentNode.insertBefore(as,ar);as.parentNode.replaceChild(eS(ar),as);ar.style.display='none';(function(){if(ar.readyState==4)ar.parentNode.removeChild(ar);else setTimeout(arguments.callee,10);})();}else ar.parentNode.replaceChild(eS(ar),ar);};function eS(ar){var as=dX('div');if(S.win&&S.ie)as.innerHTML=ar.innerHTML;else{var at=ar.getElementsByTagName(v)[0];if(at){var au=at.childNodes;if(au){var av=au.length;for(var aw=0;aw<av;aw++){if(!(au[aw].nodeType==1&&au[aw].nodeName=='PARAM')&& !(au[aw].nodeType==8))as.appendChild(au[aw].cloneNode(true));}}}}return as;};function fv(ar,as,at){var au,av=gB(at);if(S.wk&&S.wk<312)return au;if(av){if(typeof ar.id==u)ar.id=at;if(S.ie&&S.win){var aw='';for(var ax in ar){if(ar[ax]!=Object.prototype[ax])if(ax.toLowerCase()=='data')as.movie=ar[ax];else if(ax.toLowerCase()=='styleclass')aw+=' class="'+ar[ax]+'"';else if(ax.toLowerCase()!='classid')aw+=' '+ax+'="'+ar[ax]+'"';}var ay='';for(var az in as){if(as[az]!=Object.prototype[az])ay+='<param name="'+az+'" value="'+as[az]+'" />';}av.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+aw+'>'+ay+'</object>';H[H.length]=ar.id;au=gB(ar.id);}else{var aA=dX(v);aA.setAttribute('type',y);for(var aB in ar){if(ar[aB]!=Object.prototype[aB])if(aB.toLowerCase()=='styleclass')aA.setAttribute('class',ar[aB]);else if(aB.toLowerCase()!='classid')aA.setAttribute(aB,ar[aB]);}for(var aC in as){if(as[aC]!=Object.prototype[aC]&&aC.toLowerCase()!='movie')aP(aA,aC,as[aC]);}av.parentNode.replaceChild(aA,av);au=aA;}}return au;};function aP(ar,as,at){var au=dX('param');au.setAttribute('name',as);au.setAttribute('value',at);ar.appendChild(au);};function bV(ar){var as=gB(ar);if(as&&as.nodeName=='OBJECT')if(S.ie&&S.win){as.style.display='none';(function(){if(as.readyState==4)eN(ar);else setTimeout(arguments.callee,10);})();}else as.parentNode.removeChild(as);};function eN(ar){var as=gB(ar);if(as){for(var at in as){if(typeof as[at]=='function')as[at]=null;}as.parentNode.removeChild(as);}};function gB(ar){var as=null;try{as=C.getElementById(ar);}catch(at){}return as;};function dX(ar){return C.createElement(ar);};function gs(ar,as,at){ar.attachEvent(as,at);I[I.length]=[ar,as,at];};function am(ar){var as=S.pv,at=ar.split('.');at[0]=parseInt(at[0],10);at[1]=parseInt(at[1],10)||0;at[2]=parseInt(at[2],10)||0;return as[0]>at[0]||as[0]==at[0]&&as[1]>at[1]||as[0]==at[0]&&as[1]==at[1]&&as[2]>=at[2]?true:false;};function gP(ar,as,at,au){if(S.ie&&S.mac)return;var av=C.getElementsByTagName('head')[0];if(!av)return;var aw=at&&typeof at=='string'?at:'screen';if(au){P=null;Q=null;}if(!P||Q!=aw){var ax=dX('style');ax.setAttribute('type','text/css');ax.setAttribute('media',aw);P=av.appendChild(ax);if(S.ie&&S.win&&typeof C.styleSheets!=u&&C.styleSheets.length>0)P=C.styleSheets[C.styleSheets.length-1];Q=aw;}if(S.ie&&S.win){if(P&&typeof P.addRule==v)P.addRule(ar,as);}else if(P&&typeof C.createTextNode!=u)P.appendChild(C.createTextNode(ar+' {'+as+'}'));};function gR(ar,as){if(!R)return;var at=as?'visible':'hidden';if(N&&gB(ar))gB(ar).style.visibility=at;else gP('#'+ar,'visibility:'+at);};function pw(ar){var as=/[\\\"<>\.;]/,at=as.exec(ar)!=null;return at&&typeof encodeURIComponent!=u?encodeURIComponent(ar):ar;};var aq=(function(){if(S.ie&&S.win)s.attachEvent('onunload',function(){var ar=I.length;for(var as=0;as<ar;as++)I[as][0].detachEvent(I[as][1],I[as][2]);var at=H.length;for(var au=0;au<at;au++)bV(H[au]);for(var av in S)S[av]=null;S=null;if(typeof swfobject!='undefined'){for(var aw in swfobject)swfobject[aw]=null;swfobject=null;}});})();return{gH:function(ar,as,at,au){if(S.w3&&ar&&as){var av={};av.id=ar;av.swfVersion=as;av.ln=at;av.callbackFn=au;G[G.length]=av;gR(ar,false);}else if(au)au({success:false,id:ar});},lp:function(ar){if(S.w3)return aa(ar);},embedSWF:function(ar,as,at,au,av,aw,ax,ay,az,aA){var aB={success:false,id:as};if(S.w3&& !(S.wk&&S.wk<312)&&ar&&as&&at&&au&&av){gR(as,false);V(function(){at+='';au+='';var aC={};if(az&&typeof az===v)for(var aD in az)aC[aD]=az[aD];aC.data=ar;aC.width=at;aC.height=au;var aE={};if(ay&&typeof ay===v)for(var aF in ay)aE[aF]=ay[aF];if(ax&&typeof ax===v)for(var aG in ax){if(typeof aE.flashvars!=u)aE.flashvars+='&'+aG+'='+ax[aG];else aE.flashvars=aG+'='+ax[aG];}if(am(av)){var aH=fv(aC,aE,as);if(aC.id==as)gR(as,true);aB.success=true;aB.ref=aH;}else if(aw&&aT()){aC.data=aw;bm(aC,aE,as,aA);return;}else gR(as,true);if(aA)aA(aB);});}else if(aA)aA(aB);},switchOffAutoHideShow:function(){R=false;},ua:S,kL:function(){return{major:S.pv[0],minor:S.pv[1],release:S.pv[2]};},kf:am,iV:function(ar,as,at){if(S.w3)return fv(ar,as,at);else return undefined;},jS:function(ar,as,at,au){if(S.w3&&aT())bm(ar,as,at,au);},jv:function(ar){if(S.w3)bV(ar);},ik:function(ar,as,at,au){if(S.w3)gP(ar,as,at,au);},cz:V,jC:W,kY:function(ar){var as=C.location.search||C.location.hash;if(as){if(/\?/.test(as))as=as.split('?')[1];if(ar==null)return pw(as);var at=as.split('&');for(var au=0;au<at.length;au++){if(at[au].substring(0,at[au].indexOf('='))==ar)return pw(at[au].substring(at[au].indexOf('=')+1));}}return '';},lq:function(){if(O){var ar=gB(z);if(ar&&J){ar.parentNode.replaceChild(J,ar);if(K){gR(K,true);if(S.ie&&S.win)J.style.display='block';}if(L)L(M);}O=false;}}};};CKFinder.addPlugin('flashupload',{readOnly:false,appReady:function(s){if(s.config.connectorLanguage=='asp'&& !CKFinder.env.ie)return;var t=s.document,u=t.defaultView||t.parentWindow,v=r(u,t);if(!v.kf('10.2.0'))return;setTimeout(function(){s.replaceUploadForm('<iframe src="'+CKFinder.getPluginPath('flashupload')+'Uploader.html'+'" style="width: 100%; height: 98%;" frameBorder="0"></iframe>',function(){s.resizeFormPanel(100);u.api=s;u.create_swfobject=r;u.sessionIdentifiers={CFID:'CFID',CFTOKEN:'CFTOKEN',JSESSIONID:'jsessionid'};if(!CKFinder.env.ie&& !u.flash_cookies)s.connector.sendCommandPost('LoadCookies',null,null,function(w){if(w.checkError())return false;var x=w.selectSingleNode('Connector/Cookies');if(x){var y=x.attributes.getNamedItem('sessionCookieName'),z=x.attributes.getNamedItem('sessionParameterName');if(y&&y.value&&z&&z.value)u.sessionIdentifiers[y.value]=z.value;}var A=w.selectNodes('Connector/Cookies/Cookie');if(A&&A.length){u.flash_cookies={};for(var B=0;B<A.length;B++){var C=A[B].attributes.getNamedItem('value').value,D=A[B].attributes.getNamedItem('name').value;u.flash_cookies[D]=C;}}});},false,12);},100);}});})();(function(r,s,t){'use strict';var u=/\.([^\.]+)\s*$/,v=/^(jpg|jpeg|gif|png|bmp)$/i,w=/\|/,x=/(\{\{([a-z_]+)\}\})/g,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T=function(){return new Date().getTime();},U,V,W,X,Y,Z,aa,aT,bm,bW,eS,fv,aP=500,bV=false,eN='ckf_plugin_html5upload_'+T(),gB=eN+'_fallbackAsyncArrayTraverse',dX=eN+'_fallbackShouldFallback',gs=eN+'_fallbackOnFileBlobReady',am=eN+'_fallbackOnXMLHttpRequestReady',gP="CKFinder._['"+eN+"']['{{application_name}}']",gR="var _files = ((('undefined' === typeof files) ? (this.files || (event.dataTransfer && event.dataTransfer.files)) : files) || []);setTimeout(function () {"+gP+"['"+gB+"'](_files, function (file, index, files) {"+'var formData = new FormData(),'+'uploadBlob,'+'xhr = new XMLHttpRequest();'+'if (file && '+gP+"['"+dX+"'](file)) {"+"formData.append('upload', file);"+'uploadBlob = '+gP+"['"+gs+"'](file, formData);"+gP+"['"+am+"'](file, uploadBlob, xhr, xhr.send.bind(xhr, formData), xhr.abort.bind(xhr));"+'} else {'+'return false;'+'}'+'});'+'}, '+aP+');',pw='<div id="ckf_upload_form" ondrop="'+gR+'">'+'<div class="ckf_upload_info" id="ckf_globalUploads">'+'<div class="ckf_progress_wrapper"><div class="ckf_progress_info">'+'<span></span>'+'<span></span>'+'<div class="ckf_progress_bar_container"><div></div></div>'+'<span class="ckf_status"></span><span class="ckf_speed"></span>'+'</div></div>'+'<div class="ckf_uploadButtons">'+'<input type="file" {{input_multiple}} id="ckf_fileInput" onchange="'+gR+'">'+'<a class="cke_dialog_ui_button" href="javascript:void(0);"><span class="cke_dialog_ui_button" id="ckf_addFiles">{{lang_upload_add_files}}</span></a><br>'+'<a class="cke_dialog_ui_button cke_dialog_ui_button_ok" href="javascript:void(0);" id="ckf_cancelUpload"><span class="cke_dialog_ui_button">{{lang_close_button}}</span></a>'+'</div>'+'</div>'+'</div>',aq='<div class="ckf_progress_wrapper"><div class="ckf_progress_info"><span>{{file_name}}</span><span></span><div class="ckf_progress_bar_container"><div></div></div><span class="ckf_status"></span><span class="ckf_speed"></span><div class="ckf_outcome"></div></div></div><div class="ckf_uploadButtons"><a class="cke_dialog_ui_button cke_dialog_ui_button_cancel" name="cancel"><span class="cke_dialog_ui_button">{{lang_cancel_button}}</span></a></div>';if(Object.hasOwnProperty('create'))S=Object.create;else S=function(ar){bV=true;return ar;};R=function(ar,as,at){var au=10,av=10,aw=0,ax;at||(at=null);as=as.bind(at);(ax=function(){var ay,az=0,aA=T();for(;;){ay=ar.item?ar.item(aw):ar[aw];if(!ay||false===as(ay,aw,ar))return;aw+=1;az+=1;if(az>=av&&T()-aA>au)return setTimeout(ax,au);}})();};U=function(ar){return function(as){var at;for(at in ar){if(ar.hasOwnProperty(at))as[at]=ar[at];}return as;};};B=function(){this.uU=[];};B.prototype.mD=function(ar){var as=this;if(!(ar instanceof B))throw new Error('Invalid argument: expected xc.');ar.sy().forEach(function(at){as.ns(at);});};B.mixin=U(B.prototype);B.prototype.ns=function(ar){if(!(ar instanceof C))throw new Error('Invalid argument: expected tq.');if(this.sL(ar))throw new Error('Logic error: same tq is added twice to the xc');this.uU.push(ar);};B.prototype.dispatch=function(ar,as){this.uU.forEach(function(at){var au=at.tc();if(au.hasOwnProperty(ar))at[au[ar]].apply(at,as);});};B.prototype.sy=function(ar){if(!ar)return this.uU.slice(0);return this.uU.filter(function(as){return as.sV(ar);});};B.prototype.sL=function(ar){return-1!==this.uU.indexOf(ar);};B.prototype.removeSubscriber=function(ar){var as=this.uU.indexOf(ar);if(!(ar instanceof C))throw new Error('Invalid argument: expected tq.');if(-1===as)throw new Error('Logic error: this tq is not registered');this.uU.splice(as,1);};C=function(){};C.prototype.sV=function(ar){return this.tc().hasOwnProperty(ar);};C.prototype.tc=function(){throw new Error('This method needs to be overriden in child class.');};y=function(){C.call(this);};y.prototype=S(C.prototype);y.prototype.tc=function(){var ar={};ar[O.qM]='tF';return ar;};y.prototype.tF=function(ar,as){var at=as.targetFolder,au=ar.connector.composeUrl('FileUpload',{response_type:'txt'},at.type,at);as.bT.open('POST',au);};F=function(ar,as,at,au){var av=this;C.call(av);av.ckFinder=ar;av.application=as;av.ty=at;av.ub=au;};F.prototype=S(C.prototype);I=function(ar){this.tw(ar);};I.mixin=U(I.prototype);I.prototype.tj=function(){if(!this.so)throw new Error('Form panel widget is not set.');return this.so;};I.prototype.sX=function(){return! !this.so;};I.prototype.uV=function(ar){};I.prototype.tC=function(ar){};I.prototype.tw=function(ar){var as=this;if(!as.so&&ar)as.uV(ar);else if(as.so&&ar){as.tC(as.so);as.uV(ar);}else if(as.so&& !ar)as.tC(as.so);as.so=ar;};A=function(ar,as,at,au){F.call(this,ar,as,at,au);I.call(this);};A.prototype=S(F.prototype);A.prototype=I.mixin(A.prototype);A.prototype.mE=function(ar){var ax=this;var as=ar.layout.pn(),at=as.getDocument(),au=ax.sS.bind(ax),av=ax.ss.bind(ax),aw=ax.rs.bind(ax);at.on('drop',aw);at.on('dragover',av);as.on('dragover',au);if(!ax.domElementListeners)ax.domElementListeners=[];ax.domElementListeners.push({evt:'drop',fO:aw,bi:at},{evt:'dragover',fO:av,bi:at},{evt:'dragover',fO:au,bi:as});};A.prototype.ss=function(ar){var as=ar.data,at=as.$.dataTransfer;if(!at)return;at.dropEffect='none';try{at.effectAllowed='none';}catch(au){}if(this.ckFinder.env.webkit)as.preventDefault();};A.prototype.rs=function(ar){var as=ar.data.$.dataTransfer;if(as&&as.files&&as.files.length>0){this.ub.uG(as.files);ar.data.preventDefault();}};A.prototype.uV=function(ar){var av=this;var as=ar.bn().getDocument(),at=av.sS.bind(av),au=as.getById('ckf_upload_form');if(!av.domElementListeners)av.domElementListeners=[];if(av.domElementListeners.length>0)av.tC(av.so);av.mE(av.application);au.on('dragover',at);av.domElementListeners.push({evt:'dragover',fO:at,bi:au});};A.prototype.sS=function(ar){var as=ar.data,at=as.$.dataTransfer;if(!at)return;if(at.files&&at.files.length||at.types&&(at.types.contains&&at.types.contains('Files')||at.types.indexOf&& -1!==at.types.indexOf('Files'))){at.dropEffect='copy';as.stopPropagation();}else at.dropEffect='none';as.preventDefault();};A.prototype.tC=function(ar){var as,at;for(as=0;as<this.domElementListeners.length;as+=1){at=this.domElementListeners[as];at.bi.removeListener(at.evt,at.fO);}delete this.domElementListeners;};D=function(ar,as,at,au,av){F.call(this,ar,as,at,au);this.pJ=av;};D.shouldFallback=true;D.prototype=S(F.prototype);D.prototype.lT=function(ar){var au=this;var as,at;for(as in au.pJ){if(au.pJ.hasOwnProperty(as))for(at=0;at<ar.length;at+=1){if(ar[at]===au.pJ[as])delete au.pJ[as];}}};D.prototype.ti=function(ar,as){if(!D.shouldFallback)return;return new K(ar,new H(as));};D.prototype.uK=function(ar,as,at,au,av){var ay=this;if(!D.shouldFallback)return;var aw,ax;if(ay.ub.sX())aw=ay.ub.tj();else{av();return;}ax=new z(ay.application,ay.application.aV,as,au,av);ax.ns(ay.ty);ax.nv(at);as.ns(ax);ay.ub.expectedFiles-=1;ay.ub.tL(ay.application,ax);};D.prototype.tS=function(ar,as,at,au,av,aw){var ay=this;var ax={};ax[at]=R;ax[au]=ay.shouldFallback.bind(ay);ax[av]=ay.ti.bind(ay);ax[aw]=ay.uK.bind(ay);if(!ar.CKFinder.hasOwnProperty('_'))ar.CKFinder._={};ar.CKFinder._[as]={};ar.CKFinder._[as][ay.application.name]=ax;};D.prototype.shouldFallback=function(ar,as){return!this.ub.shouldStopProcessing&&D.shouldFallback;};E=function(){B.call(this);};E.prototype=S(B.prototype);E.qQ='xhr.header';E.prototype.tn=function(ar,as){throw new Error('This method needs to be overriden in child class.');};G=function(ar){E.call(this);this.file=ar;};G.prototype=S(E.prototype);G.prototype.tn=function(ar,as){var at=new FormData();at.append('upload',this.file);as(at);};H=function(ar){E.call(this);this.formData=ar;};H.prototype=S(E.prototype);H.prototype.tn=function(ar,as){as(this.formData);};J=function(ar,as,at,au,av){F.call(this,ar,as,at,au);this.qJ=av;};J.prototype=S(F.prototype);J.prototype.tc=function(){var ar={};ar[L.qN]='onFileInputChange';return ar;};J.prototype.onFileInputChange=function(ar,as){if(this.ub.uG(as))this.qJ.lT(as);};K=function(ar,as){this.sz=as;this.file=ar;};K.prototype=S(B.prototype);K.prototype.mD=function(ar){return this.sz.mD(ar);};K.prototype.ns=function(ar){return this.sz.ns(ar);};K.prototype.dispatch=function(ar,as){return this.sz.dispatch(ar,as);};K.prototype.bZ=function(){return this.file;};K.prototype.wv=function(){var ar='',as=this.getFileName();if(!u.test(as))return ar;ar=as.match(u);return ar[1].toLowerCase();};K.prototype.getFileName=function(){return this.file.name;};K.prototype.getFileSize=function(){return this.file.size;};K.prototype.sy=function(ar){return this.sz.sy(ar);};K.prototype.tn=function(ar){this.sz.tn(this.file,ar);};M=function(){};M.prototype=S(C.prototype);M.pH='abort';M.rj='error';M.qk='load';M.rc='progress';M.prototype.tc=function(){var ar={};ar[M.pH]='onAbort';ar[M.rj]='onError';ar[M.qk]='onLoad';ar[M.rc]='onProgress';return ar;};M.prototype.onAbort=function(ar){};M.prototype.onError=function(ar,as){};M.prototype.onLoad=function(ar){};M.prototype.onProgress=function(ar,as,at,au){};N=function(ar){var as=this;B.call(as);M.call(as);as.application=ar;as.tM=[];};N.prototype=S(M.prototype);N.prototype=B.mixin(N.prototype);N.prototype.mC=function(){var ar=this.tM.concat();this.tM=[];R(ar,function(as,at,au){if(as&&as.sY())as.lN();});};N.prototype.mU=function(ar){this.tM.push(ar);};N.prototype.nU=function(ar){var as=this.tM.indexOf(ar);if(-1===as)throw new Error('Given upload supervisor is not attached.');this.tM.splice(as,1);};N.prototype.tc=function(){var ar=M.prototype.tc.call(this);ar[P.pN]='uc';ar[O.qM]='tF';return ar;};N.prototype.sj=function(ar){var as;for(as=0;as<this.tM.length;as+=1){if(ar===this.tM[as].uploadBlob.bZ())return true;}return false;};N.prototype.sB=function(ar){return~this.tM.indexOf(ar);};N.prototype.tF=function(ar,as){this.mU(as);};N.prototype.uc=function(ar){if(this.sB(ar))this.nU(ar);};L=function(ar,as,at){var au=this;B.call(au);I.call(au);M.call(au);au.application=ar;au.attachedUploadViewsNumber=0;au.wU=[];au.lastRefresh=0;au.sa=0;au.sO=0;au.tI=0;au.totalFiles=0;au.ty=as;au.ub=at;au.tM=[];};L.prototype=S(M.prototype);L.prototype=B.mixin(L.prototype);L.prototype=I.mixin(L.prototype);L.prototype.mU=N.prototype.mU;L.prototype.nU=N.prototype.nU;L.prototype.sB=N.prototype.sB;L.prototype.tC=A.prototype.tC;L.qN='event.file.input.change';L.ue=300;L.prototype.mC=function(){var as=this;var ar;for(ar=0;ar<as.tM.length;ar+=1)as.tM[ar].removeSubscriber(as);as.ty.mC();as.ub.or();as.attachedUploadViewsNumber=0;as.tM=[];as.ud(as.application);as.ma();as.remove();};L.prototype.tc=function(){var ar={};ar[O.qM]='tF';ar[P.pN]='uc';ar[Q.EVENT_DOM_ATTACHED]='onUploadViewDomAttached';ar[Q.EVENT_DOM_REMOVED]='onUploadViewDomRemoved';ar[Q.pM]='onFolderRefreshRequest';return ar;};L.prototype.onFileInputChange=function(ar){var as=ar.jN.$,at=as.files;if(at.length<1)return;this.dispatch(L.qN,[as,at]);};L.prototype.onFolderRefreshRequest=function(ar,as){this.wU.push({folder:ar,mw:as});};L.prototype.uV=function(ar){var aA=this;var as=ar.bn().getDocument(),at=as.getById('ckf_addFiles'),au=as.getById('ckf_cancelUpload'),av=as.getById('ckf_fileInput'),aw=as.getById('ckf_globalUploads'),ax,ay=aA.mC.bind(aA),az=aA.onFileInputChange.bind(aA);aw=aw.getChild([0,0]);aA.domElement={addFilesButton:at,cancelButton:au,countSpan:aw.getChild(0),fileInput:av,ni:aw.getChild([2,0]),np:aw.getChild(4),mz:aw.getChild(3),totalSizeSpan:aw.getChild(1)};ax=aA.onDomElementAddFilesClickListener.bind(aA);at.on('click',ax);au.on('click',ay);av.on('change',az);if(!aA.domElementListeners)aA.domElementListeners=[];aA.domElementListeners.push({evt:'click',fO:ax,bi:at},{evt:'click',fO:ay,bi:au},{evt:'change',fO:az,bi:av});if(aA.shouldBeClickedAutomatically){aA.shouldBeClickedAutomatically=false;ax();}};L.prototype.onDomElementAddFilesClickListener=function(ar){this.domElement.fileInput.$.click();};L.prototype.onUploadPanelUploadStartClick=function(ar,as,at){this.shouldBeClickedAutomatically=true;at(ar);};L.prototype.uH=function(ar){this.domElement.cancelButton.getFirst().setHtml(ar.lang.UploadBtnCancel);};L.prototype.ud=function(ar){var as=this;as.domElement.cancelButton.getFirst().setHtml(ar.lang.CloseBtn);as.sa=0;as.sO=0;as.tI=0;as.totalFiles=0;};L.prototype.onUploadViewDomAttached=function(ar){this.attachedUploadViewsNumber+=1;};L.prototype.onUploadViewDomRemoved=function(ar){var as=this;as.attachedUploadViewsNumber-=1;if(as.ub.expectedFiles<1&&as.attachedUploadViewsNumber<1){as.attachedUploadViewsNumber=0;as.ub.expectedFiles=0;as.remove();}};L.prototype.tF=function(ar,as){var aw=this;var at=as.uploadBlob.bZ(),au=aw.tj(),av=new Q(ar,as,at);as.ns(aw);as.ns(av);av.ns(aw);av.tw(au);aw.mU(as);aw.tI+=at.size;aw.to(aw.tI);aw.totalFiles+=1;aw.tm(aw.totalFiles);if(1===aw.totalFiles)aw.uH(ar);};L.prototype.uc=function(ar){var au=this;var as=au.ub.expectedFiles,at=ar.uploadBlob.bZ();if(au.sB(ar))au.nU(ar);if(as<1&&au.tM.length<1){au.ma();au.ud(au.application);}else{au.sa+=at.size;au.sO+=1;}au.updateUploadProgress(au.sa,au.tI,au.sO,au.totalFiles,as);au.to(au.tI);au.tm(au.totalFiles);};L.prototype.ma=function(){var au=this;var ar,as,at=au.application.aV;for(ar=0;ar<au.wU.length;ar+=1){if(au.wU[ar].folder===at){as=au.wU[ar];break;}}au.wU=[];if(as)au.application.oW('requestShowFolderFiles',as);};L.prototype.remove=function(){this.tj().oW('requestUnloadForm');};L.prototype.setUploadCommand=function(ar,as){var at,au,av,aw;if(!as.pW||as.pW.length<1)return;if(!this.domElementListeners)this.domElementListeners=[];av=function(ax,ay){this.onUploadPanelUploadStartClick(ay,as,ax);};aw=as.pW;for(au=0;au<aw.length;au+=1){if(aw[au].click){at=aw[au].click;aw[au].click=av.bind(this,at);}}};L.prototype.tD=function(ar,as){this.updateLoadedPercentage(ar,as);};L.prototype.updateLoadedPercentage=function(ar,as,at){var au;if(as>0)au=Math.round(ar/as*100);else au=0;if(au<0)au=0;if(au>100||isNaN(au))au=100;this.domElement.ni.setStyle('width',au+'%');at=at?' - '+at.trim():'';this.updateStatusText(this.application.lang.UploadUploaded.replace('!n',au)+at);};L.prototype.nR=function(ar,as){var at;if(as<1)return;at=ar/1024/as;this.domElement.np.setText(k.formatSpeed(at,this.application.lang));};L.prototype.updateStatusText=function(ar){this.domElement.mz.setText(ar);};L.prototype.to=function(ar){this.domElement.totalSizeSpan.setText(this.application.lang.UploadTotalSize+' '+k.formatSize(ar/1024,this.application.lang));};L.prototype.tm=function(ar){this.domElement.countSpan.setText(this.application.lang.UploadTotalFiles+' '+ar+' ');};L.prototype.updateUploadProgress=function(ar,as,at,au,av){var aw=ar/as,ax=1,ay=at/(au+av),az=3,aA;aA=CKFinder.tools.formatSize(ar/1024,this.application.lang);this.updateLoadedPercentage(aw*ax+ay*az,ax+az,aA);};O=function(ar,as){var at=this;B.call(at);I.call(at);M.call(at);at.application=ar;at.lQ=10;at.expectedFiles=0;at.shouldStopProcessing=false;at.tM=[];at.ty=as;};O.prototype=S(M.prototype);O.prototype=B.mixin(O.prototype);O.prototype=I.mixin(O.prototype);O.qM='upload.supervisor.ready';O.prototype.or=function(){this.expectedFiles=0;this.shouldStopProcessing=true;this.tM=[];};O.prototype.nZ=function(){return this.tM.shift();};O.prototype.qg=function(ar){if(!this.sj(ar.file))this.tM.push(ar);};O.prototype.tc=function(){var ar={};ar[P.pU]='tH';ar[P.pN]='uc';return ar;};O.prototype.getUploadCommand=function(){if(!this.uploadCommand)throw new Error('Upload command is not set.');return this.uploadCommand;};O.prototype.sj=function(ar){var as;for(as=0;as<this.tM.length;as+=1){if(ar===this.tM[as].uploadBlob.bZ())return true;}return false;};O.prototype.isEmpty=function(){return this.tM.length<1;};O.prototype.tH=function(){this.tx();};O.prototype.uc=function(){this.lQ+=1;this.tx();};O.prototype.uG=function(ar){var as=100,at,au,av=this.sX(),aw,ax=this,ay=this.getUploadCommand(),az=this.application.aV;if(!az)return false;this.expectedFiles+=ar.length;this.shouldStopProcessing=false;if(ay.bu===r.aY)return;if(ar.length<1)return false;try{au=ar[0];D.shouldFallback=false;}catch(aA){return false;}finally{if(ay.bu!==r.eV){av=false;ay.exec(this.application);}}aw=R.bind(null,ar,function(aB,aC,aD){if(ax.shouldStopProcessing){ax.expectedFiles=0;ax.shouldStopProcessing=false;return false;}ax.expectedFiles-=1;ax.tA(new K(aB,new G(aB)));});if(av){aw();return true;}at=setInterval(function(){if(!ax.sX())return;clearInterval(at);aw();},as);return true;};O.prototype.tA=function(ar){var au=this;var as,at;if(ar.getFileName().length<1){au.tj().oW('failedUploadFile');return;}at=new P(au.application,au.application.aV,ar);at.ns(au.ty);ar.ns(at);as=new XMLHttpRequest();at.nv(as);au.tL(au.application,at);};O.prototype.tL=function(ar,as){var at=this;at.dispatch(O.qM,[at.application,as]);as.ns(at);if(at.lQ<1){at.qg(as);return;}at.tv(ar,as);};O.prototype.tx=function(){var ar=this;while(ar.tM.length>0&&ar.lQ>0)ar.tv(ar.application,ar.nZ());};O.prototype.tJ=function(ar){this.lQ=ar;};O.prototype.setUploadCommand=function(ar,as){this.uploadCommand=as;};O.prototype.tv=function(ar,as){this.lQ-=1;as.mW();};P=function(ar,as,at){var au=this;B.call(au);M.call(au);au.application=ar;au.isAborted=false;au.sa=0;au.oS=0;au.targetFolder=as;au.uploadBlob=at;};P.prototype=S(M.prototype);P.prototype=B.mixin(P.prototype);P.pU='start';P.pN='stop';P.prototype.lN=function(){if(!this.sY())throw new Error('Upload is not in progress.');this.isAborted=true;this.bT.abort();};P.prototype.ns=function(ar){if(!(ar instanceof M))throw new Error('Invalid argument: expected ux.');B.prototype.ns.call(this,ar);};P.prototype.ta=function(ar){var as=this.wv(),at=ar.aV,au=at.getResourceType();if(as&& !au.isExtensionAllowed(as)){this.onError(ar.lang.UploadExtIncorrect);return false;}return true;};P.prototype.wN=function(ar){var ay=this;var as=ay.wv(),at=ay.getFileSize(),au=parseInt(ar.config.uploadMaxSize,10),av,aw=ar.aV,ax=aw.getResourceType();av=parseInt(ax.maxSize,10);if(at===0){ay.onError(ar.lang.Errors[202]);return false;}if(au&&at>au||av&&at>av&&(ar.config.uploadCheckImages|| !v.test(as))){ay.onError(ar.lang.Errors[203]);return false;}return true;};P.prototype.tl=function(ar){if(!this.ta(ar))return false;if(!this.wN(ar))return false;return true;};P.prototype.nv=function(ar){var at=this;var as;if(at.sY())throw new Error('Upload is already started.');ar.addEventListener(M.pH,at.onAbort.bind(at));ar.addEventListener(M.rj,at.onError.bind(at));ar.addEventListener(M.qk,at.onLoad.bind(at));as=ar.upload;if(as)as.addEventListener(M.rc,at.onProgress.bind(at));at.bT=ar;at.isAborted=false;};P.prototype.tK=function(){return this.oS;};P.prototype.bZ=function(){return this.uploadBlob.bZ();};P.prototype.wv=function(){return this.uploadBlob.wv();};P.prototype.getFileName=function(){return this.uploadBlob.getFileName();};P.prototype.getFileSize=function(){return this.uploadBlob.getFileSize();};P.prototype.tc=function(){var ar=M.prototype.tc.call(this);ar['xhr.header']='tO';return ar;};P.prototype.sY=function(){if(this.isAborted)return false;return! !this.bT;};P.prototype.onAbort=function(ar){this.dispatch(M.pH,[this.uploadBlob]);this.onStop();};P.prototype.onError=function(ar){var as=this;if(!ar)ar=as.application.lang.UploadUnknError;as.dispatch(M.rj,[as.uploadBlob,ar]);as.onStop();};P.prototype.tO=function(ar,as){if(!this.bT)throw new Error('Request is not initialized');this.bT.setRequestHeader(ar,as);};P.prototype.onLoad=function(ar){var ax=this;var as,at,au,av=2,aw;if(200!==ax.bT.status)return ax.onError();au=ar.target.responseText,aw=au.split(w,av);as=aw[0];at=aw[1];if(!as.length&&at)ax.dispatch(M.rj,[ax.uploadBlob,at]);else ax.dispatch(M.qk,[ax.uploadBlob,as,at]);ax.onStop();};P.prototype.onProgress=function(ar){var as=this;if(!ar.lengthComputable)return;as.sa=ar.target.kC=ar.loaded;as.dispatch(M.rc,[as,as.uploadBlob,as.sa,as.tK()]);};P.prototype.onStop=function(){var ar=this;delete ar.bT;ar.isAborted=true;ar.oS=0;ar.dispatch(P.pN,[ar,ar.uploadBlob]);};P.prototype.mW=function(){var ar=this,as=this.bT;if(!this.tl(this.application))return false;this.uploadBlob.tn(function(at){ar.dispatch(P.pU,[ar.uploadBlob]);if(as){ar.oS=T();try{ar.bT.send(at);}catch(au){ar.onStop();}}else ar.onStop();});};z=function(ar,as,at,au,av){var aw=this;P.call(aw,ar,as,at);aw.isAborted=false;aw.tG=au;aw.uz=av;};z.prototype=S(P.prototype);z.prototype.lN=function(){if(!this.sY())throw new Error('Upload is not in progress.');this.isAborted=true;this.uz();};z.prototype.mW=function(){var ar=this;if(!ar.tl(ar.application))return false;ar.isAborted=false;ar.oS=T();ar.dispatch(P.pU,[ar.uploadBlob]);try{ar.tG();}catch(as){try{ar.uz();}catch(as){throw as;}finally{ar.onStop();}}};Q=function(ar,as,at){var au=this;B.call(au);I.call(au);M.call(au);au.application=ar;au.file=at;au.isDomAttached=false;au.isDomRemoved=false;au.shouldBeRemovedOnStop=true;au.targetFolder=as.targetFolder;au.ts=as;};Q.prototype=S(M.prototype);Q.prototype=B.mixin(Q.prototype);Q.prototype=I.mixin(Q.prototype);Q.prototype.tD=L.prototype.updateLoadedPercentage;Q.prototype.nR=L.prototype.nR;Q.prototype.updateStatusText=L.prototype.updateStatusText;Q.EVENT_DOM_ATTACHED='event.dom.attached';Q.EVENT_DOM_REMOVED='event.dom.removed';Q.pM='event.folder.refresh.request';Q.prototype.tc=function(){var ar=M.prototype.tc.call(this);ar[P.pN]='onStop';return ar;};Q.prototype.onAbort=function(ar){var as=this;if(!as.ts)return;if(as.ts.sY()){as.ts.lN();as.ts.onStop();}as.onStop();};Q.prototype.onError=function(ar,as){this.tE(as);};Q.prototype.uV=function(ar){var av=this;if(av.isDomAttached)return;var as=ar.bn(),at,au=new m('div',as.getDocument());au.setAttribute('class','ckf_upload_info');au.setHtml(fv(av.application,ar,av.file,aq));as.dB().append(au);av.application.cg.resizeFormPanel();at=au.getChild([0,0]);av.domElement={button:au.getChild([1,0]),container:au,mI:at.getChild(5),ni:at.getChild([2,0]),mx:at.getChild(1),np:at.getChild(4),mz:at.getChild(3)};av.domElement.button.on('click',av.uk.bind(av,av.ts));av.isDomAttached=true;av.dispatch(Q.EVENT_DOM_ATTACHED,[av]);};Q.prototype.onLoad=function(ar,as,at){this.tN(at,as);this.dispatch(Q.pM,[this.targetFolder,as]);};Q.prototype.onProgress=function(ar,as,at,au){this.tD(at,this.file.size);this.nR(at,au);};Q.prototype.onStop=function(){if(this.shouldBeRemovedOnStop)this.remove();};Q.prototype.uk=function(ar,as){this.shouldBeRemovedOnStop=true;if(ar.sY())ar.lN();else this.onAbort(ar.uploadBlob);};Q.prototype.remove=function(){var ar=this;if(ar.isDomRemoved)return;ar.domElement.container.remove();ar.application.cg.resizeFormPanel();ar.isDomRemoved=true;ar.dispatch(Q.EVENT_DOM_REMOVED,[ar]);};Q.prototype.tE=function(ar){var at=this;var as=at.tj();at.tp(ar);at.domElement.container.addClass('ckf_FileError');at.application.cg.resizeFormPanel();as.oW('failedUploadFile',ar);};Q.prototype.tp=function(ar){var as=this;if(ar)as.shouldBeRemovedOnStop=false;as.domElement.ni.getParent().hide();as.domElement.mz.hide();as.domElement.np.hide();as.domElement.mI.setText(ar);as.domElement.button.getFirst().setHtml(as.application.lang.CloseBtn);as.domElement.button.addClass('cke_dialog_ui_button_ok');as.domElement.button.removeClass('cke_dialog_ui_button_cancel');};Q.prototype.tN=function(ar,as){var au=this;var at=au.tj();if(ar){au.tp(ar);au.application.cg.resizeFormPanel();}else au.remove();at.oW('successUploadFile',ar);};V=function(ar,as){if(!W(as))return;var at=1000,au={},av=new y(as),aw=new N(as),ax=new O(as,aw),ay=new D(ar,as,aw,ax,au),az=new A(ar,as,aw,ax,ay),aA=new J(ar,as,aw,ax,ay),aB=new L(as,aw,ax);ay.tS(window,eN,gB,dX,gs,am);ax.tJ(as.config.maxSimultaneousUploads);aB.ns(aA);aw.ns(aB);ax.ns(av);ax.ns(aB);ax.ns(aw);Y(ar,as,'filesview.filesview',function(aC,aD,aE){Z(ar,aC,az,ay,aw,ax,aB,aE);});Y(ar,as,'formpanel.formpanel',function(aC,aD,aE){aa(ar,aC,az,ay,aw,ax,aB,aE);});setInterval(function(){if(ax.sX())ax.tx();},at);};W=function(ar){return!bV&&typeof FormData!=='undefined';};X=function(ar){var as;as=ar.env?ar:r;return!(!as.env.mac&&as.env.safari);};Y=function(ar,as,at,au){var av,aw=10;av=setInterval(function(){if(as.ld.hasOwnProperty(at)){clearInterval(av);au(as,at,as.ld[at]);}},aw);};Z=function(ar,as,at,au,av,aw,ax,ay){var az=ay.bn();if(!at.sX())at.mE(as);if(!az.hasAttribute('ondrop'))az.setAttribute('ondrop',eS(as,gR));};aa=function(ar,as,at,au,av,aw,ax,ay){var az=11,aA=eS(as,pw),aB=true,aC=as.cS('upload');aw.setUploadCommand(as,aC);ax.setUploadCommand(as,aC);as.cg.replaceUploadForm(aA,function(){aT(ar,as,at,au,av,aw,ax,ay);},aB,az);};aT=function(ar,as,at,au,av,aw,ax,ay){at.tw(ay);ax.tw(ay);aw.tw(ay);};bW=function(ar,as){return ar.replace(x,function(at,au,av){return as[av];});};eS=function(ar,as){var at={application_name:ar.name,input_multiple:X(ar)?'multiple="multiple"':'',lang_upload_add_files:ar.lang.UploadAddFiles,lang_close_button:ar.lang.CloseBtn};return bW(as,at);};fv=function(ar,as,at,au){var av={file_name:at.name,lang_cancel_button:ar.lang.UploadBtnCancel};return bW(au,av);};bm=function(ar){var as;if(V.bind)as=V.bind(this,ar);else{bV=true;as=V;}ar.plugins.add('html5upload',{bM:['uploadform'],bz:as});};if(!r.mock)bm(r);s.xc=B;s.tq=C;s.ux=M;s.uf=P;s.tZ=bm;if(t){s.inlineFileUploadHandle=gR;s.tu=eS;s.uI=fv;}})('undefined'!==typeof a?a:{mock:true},'undefined'!==typeof exports?exports:{},'undefined'!==typeof process?'dev'===process.env.NODE_ENV:false);(function(){function r(s,t,u,v){s.execCommand(v?'moveFilesToFolder':'copyFilesToFolder',{files:u,destination:t,fileCallback:function(w,x){var y=k.indexOf(w.basketFiles,x),z=1,A=w.basketFiles.length-1;for(var B=y;B<A;B++){if(!w.basketFiles[B]){z++;continue;}w.basketFiles[B]=w.basketFiles[B+z];}w.basketFiles.length=Math.max(A,0);}});};o.add('basket',{bM:['foldertree','filesview','contextmenu'],readOnly:false,basketToolbar:[['clearBasket',{label:'BasketClear',command:'TruncateBasket',disableEmpty:true}]],basketFileContextMenu:[['mu',{label:'BasketRemove',command:'RemoveFileFromBasket',group:'file3'}],['hN',{label:'BasketOpenFolder',command:'OpenFileFolder',group:'file1'}]],bz:function x(s){var t=window.top[a.nd+"\143\141\x74\151\157\x6e"][a.jG+"\163\164"],u=[],v=function(){var y=s.basketFiles.length?a.aS:a.aY;for(var z=0,A=u.length;z<A;z++)s.cS(u[z]).bR(y);};s.bD('FolderPasteCopyBasket',{exec:function(y){var z=y.aV;if(!z)return;r(y,z,y.basketFiles);}});s.bD('FolderPasteMoveBasket',{exec:function(y){if(a.bF&&1==a.bs.indexOf(a.bF.substr(1,1))%5&&a.lS(t)!=a.lS(a.ed)||a.bF&&a.bF.substr(3,1)!=a.bs.substr((a.bs.indexOf(a.bF.substr(0,1))+a.bs.indexOf(a.bF.substr(2,1)))*9%(a.bs.length-1),1))y.msgDialog('',"\124\150\151\x73\x20\146\165\x6e\143\164\x69\157\156\040\x69\x73\040\x64\151\x73\x61\142\154\145\144\x20\151\156\x20\164\x68\145\x20\x64\145\155\x6f\040\x76\x65\x72\x73\151\x6f\156\x20\157\x66\x20\103\x4b\x46\x69\156\144\x65\162\x2e\074\x62\162\040\057\076\120\x6c\145\141\x73\x65\040\166\151\163\x69\x74\040\x74\x68\x65\x20\x3c\141\x20\x68\162\145\146\x3d\047\150\x74\164\x70\x3a\x2f\057\143\153\163\x6f\165\x72\143\x65\056\x63\157\155\057\143\153\x66\x69\x6e\144\145\162\x27\x3e\103\113\x46\151\x6e\144\x65\x72\040\x77\x65\142\040\163\x69\x74\x65\074\x2f\x61\x3e\x20\x74\157\040\157\142\x74\x61\151\156\x20\141\040\166\141\x6c\x69\144\040\x6c\151\143\x65\156\x73\x65\056");else{var z=y.aV;if(!z)return;r(y,z,y.basketFiles,true);v();}}});s.eU({folderPasteMoveBasket:{label:s.lang.BasketMoveFilesHere,command:'FolderPasteMoveBasket',group:'folder1'},folderPasteCopyBasket:{label:s.lang.BasketCopyFilesHere,command:'FolderPasteCopyBasket',group:'folder1'}});var w=s.basket=new a.aL.BasketFolder(s);s.basketFiles=[];s.on('uiReady',function F(y){var z=s.ld['foldertree.foldertree'];z.on('beforeAddFolder',function H(G){G.removeListener();G.data.folders.push(w);});z.on('beforeDroppable',function N(G){if(!(G.data.target instanceof a.aL.BasketFolder))return;if(G.data.source instanceof a.aL.File)G.data.source=[G.data.source];if(!k.isArray(G.data.source)|| !G.data.source.length|| !(G.data.source[0]instanceof a.aL.File))return;var H=G.data.source,I=0;for(var J=0,K=H.length,L,M;J<K;J++){for(L=0,M=s.basketFiles.length;L<M;L++){if(H[J].isSameFile(s.basketFiles[L])){I=1;break;}}if(!I)s.basketFiles.push(H[J]);}G.cancel(1);});z.on('beforeContextMenu',function I(G){var H;if(!(G.data.folder instanceof a.aL.BasketFolder)){H=G.data.bj;H.folderPasteCopyBasket=s.basketFiles.length?a.aS:a.aY;H.folderPasteMoveBasket=s.basketFiles.length?a.aS:a.aY;}else{H=G.data.bj;delete H.renameFolder;delete H.removeFolder;delete H.createSubFolder;H.qT=s.basketFiles.length?a.aS:a.aY;}});z.on('beforeKeyboardNavigation',function I(G){if(G.data.folder instanceof a.aL.BasketFolder){var H=G.data.db();if(H==46||H==113)G.cancel();}});s.bD('TruncateBasket',{exec:function(G){if(G.basketFiles.length)G.fe('',G.lang.BasketTruncateConfirm,function(){G.basketFiles.length=0;G.oW('requestSelectFolder',{folder:G.basket});});}});s.bD('RemoveFileFromBasket',{exec:function(G){var H=G.ld['filesview.filesview'].tools.oO();if(H&&H.length)G.fe('',H.length==1?G.lang.BasketRemoveConfirm.replace('%1',H[0].name):G.lang.BasketRemoveConfirmMultiple.replace('%1',H.length),function(){for(var I=0,J=H.length,K;I<J;I++)for(K=0;K<G.basketFiles.length;K++){if(H[I].isSameFile(G.basketFiles[K])){G.basketFiles.splice(K,1);break;}}G.oW('requestSelectFolder',{folder:G.basket});v();});}});s.bD('OpenFileFolder',{exec:function(G){var H=G.ld['filesview.filesview'].data().cG;if(H)G.oW('requestSelectFolder',{folder:H.folder});}});if(s.eU)s.gp('truncateBasket',{label:s.lang.BasketClear,command:'TruncateBasket',group:'folder'});var A=[],B=s.ld['filesview.filesview'],C=[];B.on('beforeContextMenu',function(G){if(!(G.data.folder instanceof a.aL.BasketFolder))return;var H=G.data.bj;delete H.renameFile;delete H.deleteFile;delete H.deleteFiles;H.mu=a.aS;H.hN=a.aS;for(var I=0;I<C.length;I++)H[C[I]]=a.aS;});B.on('beforeShowFolderFiles',function P(G){if(!(G.data.folder instanceof a.aL.BasketFolder))return;G.cancel(1);this.app.oW('requestRenderFiles',{files:s.basketFiles,mj:s.lang.BasketEmpty,eu:1,folder:G.data.folder});this.app.oW('requestRepaintFolder',G.data);D(this.app);E(this.app);v();var H=this.app.dh.fk;for(var I=0;I<H.length;I++){var J=this.app.document.getById(H[I].id),K=['<span class="cke_toolgroup" id="basket">'];for(var L in this.app.bY._.items){if(!this.app.bY._.items.hasOwnProperty(L))continue;var M=s.bY._.items[L];if(!M.mp[0].basketToolbar)continue;M=s.bY.create(L);var N=M.er(s,K),O=H[I].items.push(N)-1;if(O>0){N.previous=H[I].items[O-1];N.previous.next=N;}if(!A[I])A[I]=[];A[I].push(O);}K.push('</span>');J.appendHtml(K.join(''));}this.on('beforeShowFolderFiles',function(Q){this.app.document.getById('basket').remove();var R=this.app.dh.fk;for(var S=0;S<R.length;S++)for(var T=0;T<R[S].items.length;T++){if(A[S][T])delete R[S].items[T];}Q.removeListener();},null,null,1);this.oW('successShowFolderFiles',G.data);this.oW('afterShowFolderFiles',G.data);});B.on('beforeKeyboardNavigation',function J(G){var H=s.aV;if(H&&H instanceof a.aL.BasketFolder){var I=G.data.db();if(I==46){G.cancel();s.execCommand('RemoveFileFromBasket');}if(I==113)G.cancel();}});function D(G){for(var H in G.plugins){if(!G.plugins.hasOwnProperty(H))continue;H=G.plugins[H];if(!H.basketToolbar)continue;for(var I=0;I<H.basketToolbar.length;I++){var J=H.basketToolbar[I];if(G.bY._.items[J[0]])continue;var K=k.deepCopy(J[1]),L=K.command;if(!K.command){var M=J[1].onClick;L='BasketToolbar_'+J[0];G.bD(L,{exec:function(O){M(O.cg);}});K.command=L;}var N=k.capitalize(H.name);if(typeof K.label=='function')K.label=K.label.call(H,G.cg);else if(G.lang[H.name]&&G.lang[H.name][K.label])K.label=G.lang[H.name][K.label];else if(G.lang[N]&&G.lang[N][K.label])K.label=G.lang[N][K.label];else if(G.lang[K.label])K.label=G.lang[K.label];K.basketToolbar=1;if(K.disableEmpty)u.push(L);G.bY.add(J[0],CKFinder._.UI_BUTTON,K);}}};function E(G){if(!G.eU)return;for(var H in G.plugins){if(!G.plugins.hasOwnProperty(H))continue;H=G.plugins[H];if(!H.basketFileContextMenu)continue;for(var I=0;I<H.basketFileContextMenu.length;I++){var J=H.basketFileContextMenu[I];if(G._.iG[J[0]])continue;var K=k.deepCopy(J[1]);if(!K.command){var L='BasketContextMenu_'+J[0],M=J[1].onClick;G.bD('BasketContextMenu_'+J[0],{exec:function(O){M(O.cg);}});K.command=L;}var N=k.capitalize(H.name);if(typeof K.label=='function')K.label=K.label.call(H,G.cg);else if(G.lang[H.name]&&G.lang[H.name][K.label])K.label=G.lang[H.name][K.label];else if(G.lang[N]&&G.lang[N][K.label])K.label=G.lang[N][K.label];else if(G.lang[K.label])K.label=G.lang[K.label];if(K.disableEmpty)u.push(L);G.gp(J[0],K);C.push(J[0]);}}};},null,null,20);}});a.aL.BasketFolder=k.createClass({$:function(s){var t=this;a.aL.Folder.call(t,s,null,s.lang.BasketFolder);t.hasChildren=0;t.acl=new a.aL.Acl('1111111');t.isBasket=true;},base:a.aL.Folder,ej:{createNewFolder:function(){},getChildren:function(s){s.apply(this,null);},rename:function(){},remove:function(){},getUrl:function(){return 'ckfinder://basketFolder';},getUploadUrl:function(){return null;},getPath:function(){return '/';},copyFiles:function(s){},moveFiles:function(s){}}});})();a.DIALOG_RESIZE_NONE=0;a.DIALOG_RESIZE_WIDTH=1;a.DIALOG_RESIZE_HEIGHT=2;a.DIALOG_RESIZE_BOTH=3;(function(){function r(S){return! !this._.tabs[S][0].$.offsetHeight;};function s(){var W=this;var S=W._.gx,T=W._.cU.length,U=k.indexOf(W._.cU,S)+T;for(var V=U-1;V>U-T;V--){if(r.call(W,W._.cU[V%T]))return W._.cU[V%T];}return null;};function t(){var W=this;var S=W._.gx,T=W._.cU.length,U=k.indexOf(W._.cU,S);for(var V=U+1;V<U+T;V++){if(r.call(W,W._.cU[V%T]))return W._.cU[V%T];}return null;};a.dialog=function(S,T){var U=a.dialog._.ev[T];U=k.extend(U(S),v);U=k.clone(U);U=new z(this,U);var V=a.document,W=S.theme.pu(S);this._={app:S,element:W.element,name:T,hB:{width:0,height:0},size:{width:0,height:0},contents:{},buttons:{},iX:{},tabs:{},cU:[],gx:null,nM:null,gV:0,qF:null,eC:false,eO:[],aW:0,hasFocus:false};this.bO=W.bO;this.bO.dialog.setStyles({position:h.ie6Compat?'absolute':'fixed',top:0,left:0,visibility:'hidden'});a.event.call(this);this.dg=U=a.oW('dialogDefinition',{name:T,dg:U},S).dg;if(U.onLoad)this.on('load',U.onLoad);if(U.onShow)this.on('show',U.onShow);if(U.onHide)this.on('hide',U.onHide);if(U.onOk)this.on('ok',function(eN){if(U.onOk.call(this,eN)===false)eN.data.hide=false;});if(U.onCancel)this.on('cancel',function(eN){if(U.onCancel.call(this,eN)===false)eN.data.hide=false;});var X=this,Y=function(eN){var gB=X._.contents,dX=false;for(var gs in gB)for(var am in gB[gs]){dX=eN.call(this,gB[gs][am]);if(dX)return;}};this.on('ok',function(eN){Y(function(gB){if(gB.validate){var dX=gB.validate(this);if(typeof dX=='string'){S.document.getWindow().$.alert(dX);dX=false;}if(dX===false){if(gB.select)gB.select();else gB.focus();eN.data.hide=false;eN.stop();return true;}}});},this,null,0);this.on('cancel',function(eN){Y(function(gB){if(gB.isChanged()){if(!S.document.getWindow().$.confirm(S.lang.common.confirmCancel))eN.data.hide=false;return true;}});},this,null,0);this.bO.close.on('click',function(eN){if(this.oW('cancel',{hide:true}).hide!==false)this.hide();},this);function Z(eN){var gB=X._.eO,dX=eN?1: -1;if(gB.length<1)return;var gs=(X._.aW+dX+gB.length)%gB.length,am=gs;while(!gB[am].fM()){am=(am+dX+gB.length)%gB.length;if(am==gs)break;}gB[am].focus();if(gB[am].type=='text')gB[am].select();};var aa;function aT(eN){if(X!=a.dialog._.dL)return;var gB=eN.data.db();aa=0;if(gB==9||gB==a.dy+9){var dX=gB==a.dy+9;if(X._.eC){var gs=dX?s.call(X):t.call(X);X.selectPage(gs);X._.tabs[gs][0].focus();}else Z(!dX);aa=1;}else if(gB==a.eJ+121&& !X._.eC){X._.eC=true;X._.tabs[X._.gx][0].focus();aa=1;}else if((gB==37||gB==39)&&X._.eC){gs=gB==37?s.call(X):t.call(X);X.selectPage(gs);X._.tabs[gs][0].focus();aa=1;}if(aa){eN.stop();eN.data.preventDefault();}};function bm(eN){aa&&eN.data.preventDefault();};this.on('show',function(){a.document.on('keydown',aT,this,null,0);if(h.opera||h.gecko&&h.mac)a.document.on('keypress',bm,this);if(h.ie6Compat){var eN=E.getChild(0).getFrameDocument();eN.on('keydown',aT,this,null,0);}});this.on('hide',function(){a.document.removeListener('keydown',aT);if(h.opera||h.gecko&&h.mac)a.document.removeListener('keypress',bm);});this.on('iframeAdded',function(eN){var gB=new l(eN.data.iframe.$.contentWindow.document);gB.on('keydown',aT,this,null,0);});this.on('show',function(){if(!this._.hasFocus){this._.aW= -1;Z(true);}},this,null,4294967295);if(h.ie6Compat)this.on('load',function(eN){var gB=this.getElement(),dX=gB.getFirst();dX.remove();dX.appendTo(gB);},this);B(this);C(this);this.bO.title.setText(U.title);for(var bW=0;bW<U.contents.length;bW++)this.addPage(U.contents[bW]);var eS=/cke_dialog_tab(\s|$|_)/,fv=/cke_dialog_tab(\s|$)/;this.bO.tabs.on('click',function(eN){var gP=this;var gB=eN.data.bK(),dX=gB,gs,am;if(!(eS.test(gB.$.className)||gB.getName()=='a'))return;gs=gB.$.id.substr(0,gB.$.id.lastIndexOf('_'));gP.selectPage(gs);if(gP._.eC){gP._.eC=false;gP._.aW= -1;Z(true);}eN.data.preventDefault();},this);var aP=[],bV=a.dialog._.gv.hbox.dQ(this,{type:'hbox',className:'cke_dialog_footer_buttons',widths:[],children:U.buttons},aP).getChild();this.bO.footer.setHtml(aP.join(''));for(bW=0;bW<bV.length;bW++)this._.buttons[bV[bW].id]=bV[bW];a.skins.load(S,'dialog');};function u(S,T,U){this.element=T;this.cQ=U;this.fM=function(){return!T.getAttribute('disabled')&&T.isVisible();};this.focus=function(){S._.aW=this.cQ;this.element.focus();};T.on('keydown',function(V){if(V.data.db()in{32:1,13:1})this.oW('click');});T.on('focus',function(){this.oW('mouseover');});T.on('blur',function(){this.oW('mouseout');});};a.dialog.prototype={resize:(function(){return function(S,T){var U=this;if(U._.hB&&U._.hB.width==S&&U._.hB.height==T)return;a.dialog.oW('resize',{dialog:U,skin:U._.app.gd,width:S,height:T},U._.app);U._.hB={width:S,height:T};};})(),hR:function(){var S=this._.element.getFirst();return{width:S.$.offsetWidth||0,height:S.$.offsetHeight||0};},mn:function(){var S=this.hR();S.height=S.height-(this.bO.title.$.offsetHeight||0)-(this.bO.footer.$.offsetHeight||0);return S;},move:(function(){var S;return function(T,U,V){var Y=this;var W=Y._.element.getFirst();if(S===undefined)S=W.getComputedStyle('position')=='fixed';if(S&&Y._.position&&Y._.position.x==T&&Y._.position.y==U)return;Y._.position={x:T,y:U};if(!S){var X=a.document.getWindow().hV();T+=X.x;U+=X.y;}W.setStyles({left:(T>0?T:0)+'px',top:(U>0?U:0)+'px'});V&&(Y._.moved=1);};})(),gz:function(){return k.extend({},this._.position);},show:function(){var S=this._.app;if(S.mode=='qt'&&i){var T=S.getSelection();T&&T.up();}var U=this._.element,V=this.dg;if(!(U.getParent()&&U.getParent().equals(a.document.bH())))U.appendTo(a.document.bH());else return;if(h.gecko&&h.version<10900){var W=this.bO.dialog;W.setStyle('position','absolute');setTimeout(function(){W.setStyle('position','fixed');},0);}this.resize(this._.hB&&this._.hB.width||V.minWidth,this._.hB&&this._.hB.height||V.minHeight);this.selectPage(this.dg.contents[0].id);this.reset();if(a.dialog._.gw===null)a.dialog._.gw=this._.app.config.baseFloatZIndex;this._.element.getFirst().setStyle('z-index',a.dialog._.gw+=10);if(a.dialog._.dL===null){a.dialog._.dL=this;this._.ep=null;try{G(this._.app);}catch(Z){E=void(0);G(S);D=false;}U.on('keydown',J);U.on(h.opera?'keypress':'keyup',K);for(var X in{keyup:1,keydown:1,keypress:1})U.on(X,Q);}else{this._.ep=a.dialog._.dL;var Y=this._.ep.getElement().getFirst();Y.$.style.zIndex-=Math.floor(this._.app.config.baseFloatZIndex/2);a.dialog._.dL=this;}L(this,this,'\x1b',null,function(){var aa=this.getButton('cancel');if(aa)aa.click();else if(this.oW('cancel',{hide:true}).hide!==false)this.hide();});this._.hasFocus=false;k.setTimeout(function(){this.layout();this.bO.dialog.setStyle('visibility','');this.cr('load',{});this.oW('show',{});this._.app.oW('dialogShow',this);this.gh(function(aa){aa.jW&&aa.jW();});},100,this);},layout:function(){var U=this;var S=a.document.getWindow().eR(),T=U.hR();U.move(U._.moved?U._.position.x:(S.width-T.width)/2,U._.moved?U._.position.y:(S.height-T.height)/2);},gh:function(S){var V=this;for(var T in V._.contents)for(var U in V._.contents[T])S(V._.contents[T][U]);return V;},reset:(function(){var S=function(T){if(T.reset)T.reset();};return function(){this.gh(S);return this;};})(),rN:function(){var S=arguments;this.gh(function(T){if(T.qi)T.qi.apply(T,S);});},sI:function(){var S=arguments;this.gh(function(T){if(T.rx)T.rx.apply(T,S);});},hide:function(){this.oW('hide',{});this._.app.oW('dialogHide',this);var S=this._.element;if(!S.getParent())return;S.remove();this.bO.dialog.setStyle('visibility','hidden');M(this);if(!this._.ep)H();else{var T=this._.ep.getElement().getFirst();T.setStyle('z-index',parseInt(T.$.style.zIndex,10)+Math.floor(this._.app.config.baseFloatZIndex/2));}a.dialog._.dL=this._.ep;if(!this._.ep){a.dialog._.gw=null;S.removeListener('keydown',J);S.removeListener(h.opera?'keypress':'keyup',K);for(var U in{keyup:1,keydown:1,keypress:1})S.removeListener(U,Q);var V=this._.app;V.focus();V._.activeElement=null;V._.oO=[];if(V.mode=='qt'&&i){var W=V.getSelection();W&&W.sd(true);}}else a.dialog._.gw-=10;this.gh(function(X){X.ki&&X.ki();});},addPage:function(S){var bm=this;var T=[],U=S.label?' title="'+k.htmlEncode(S.label)+'"':'',V=S.elements,W=a.dialog._.gv.vbox.dQ(bm,{type:'vbox',className:'cke_dialog_page_contents',children:S.elements,expand: ! !S.expand,padding:S.padding,style:S.style||'width: 100%; height: 100%;'},T),X=m.kE(T.join(''),a.document),Y=m.kE(['<a class="cke_dialog_tab"',bm._.gV>0?' cke_last':'cke_first',U,! !S.hidden?' style="display:none"':'',' id="',S.id+'_',k.getNextNumber(),'" href="javascript:void(0)"',' hp="true">',S.label,'</a>'].join(''),a.document);if(bm._.gV===0)bm.bO.dialog.addClass('cke_single_page');else bm.bO.dialog.removeClass('cke_single_page');bm._.tabs[S.id]=[Y,X];bm._.cU.push(S.id);bm._.gV++;bm._.qF=Y;var Z=bm._.contents[S.id]={},aa,aT=W.getChild();while(aa=aT.shift()){Z[aa.id]=aa;if(typeof aa.getChild=='function')aT.push.apply(aT,aa.getChild());}X.setAttribute('name',S.id);X.appendTo(bm.bO.contents);Y.unselectable();bm.bO.tabs.append(Y);if(S.accessKey){L(bm,bm,'bP+'+S.accessKey,O,N);bm._.iX['bP+'+S.accessKey]=S.id;}},selectPage:function(S){var X=this;for(var T in X._.tabs){var U=X._.tabs[T][0],V=X._.tabs[T][1];if(T!=S){U.removeClass('cke_dialog_tab_selected');V.hide();}}var W=X._.tabs[S];W[0].addClass('cke_dialog_tab_selected');W[1].show();X._.gx=S;X._.nM=k.indexOf(X._.cU,S);},vJ:function(S){var T=this._.tabs[S]&&this._.tabs[S][0];if(!T)return;T.hide();},showPage:function(S){var T=this._.tabs[S]&&this._.tabs[S][0];if(!T)return;T.show();},getElement:function(){return this._.element;},getName:function(){return this._.name;},getContentElement:function(S,T){return this._.contents[S][T];},getValueOf:function(S,T){return this.getContentElement(S,T).getValue();},setValueOf:function(S,T,U){return this.getContentElement(S,T).setValue(U);},getButton:function(S){return this._.buttons[S];},click:function(S){return this._.buttons[S].click();},disableButton:function(S){return this._.buttons[S].disable();},enableButton:function(S){return this._.buttons[S].enable();},vj:function(){return this._.gV;},getParentApi:function(){return this._.app.cg;},eY:function(){return this._.app;},rf:function(){return this.eY().getSelection().rf();},tQ:function(S,T){var V=this;if(typeof T=='undefined'){T=V._.eO.length;V._.eO.push(new u(V,S,T));}else{V._.eO.splice(T,0,new u(V,S,T));for(var U=T+1;U<V._.eO.length;U++)V._.eO[U].cQ++;}},setTitle:function(S){this.bO.title.setText(S);}};k.extend(a.dialog,{add:function(S,T){if(!this._.ev[S]||typeof T=='function')this._.ev[S]=T;},exists:function(S){return! !this._.ev[S];},getCurrent:function(){return a.dialog._.dL;},okButton:(function(){var S=function(T,U){U=U||{};return k.extend({id:'ok',type:'button',label:T.lang.common.ok,'class':'cke_dialog_ui_button_ok',onClick:function(V){var W=V.data.dialog;if(W.oW('ok',{hide:true}).hide!==false)W.hide();}},U,true);};S.type='button';S.override=function(T){return k.extend(function(U){return S(U,T);},{type:'button'},true);};return S;})(),cancelButton:(function(){var S=function(T,U){U=U||{};return k.extend({id:'cancel',type:'button',label:T.lang.common.cancel,'class':'cke_dialog_ui_button_cancel',onClick:function(V){var W=V.data.dialog;if(W.oW('cancel',{hide:true}).hide!==false)W.hide();}},U,true);};S.type='button';S.override=function(T){return k.extend(function(U){return S(U,T);},{type:'button'},true);};return S;})(),addUIElement:function(S,T){this._.gv[S]=T;}});a.dialog._={gv:{},ev:{},dL:null,gw:null};a.event.du(a.dialog);a.event.du(a.dialog.prototype,true);var v={resizable:a.DIALOG_RESIZE_NONE,minWidth:600,minHeight:400,buttons:[a.dialog.okButton,a.dialog.cancelButton]},w=function(S,T,U){for(var V=0,W;W=S[V];V++){if(W.id==T)return W;if(U&&W[U]){var X=w(W[U],T,U);if(X)return X;}}return null;},x=function(S,T,U,V,W){if(U){for(var X=0,Y;Y=S[X];X++){if(Y.id==U){S.splice(X,0,T);return T;}if(V&&Y[V]){var Z=x(Y[V],T,U,V,true);if(Z)return Z;}}if(W)return null;}S.push(T);return T;},y=function(S,T,U){for(var V=0,W;W=S[V];V++){if(W.id==T)return S.splice(V,1);if(U&&W[U]){var X=y(W[U],T,U);if(X)return X;}}return null;},z=function(S,T){this.dialog=S;var U=T.contents;for(var V=0,W;W=U[V];V++)U[V]=new A(S,W);k.extend(this,T);};z.prototype={vz:function(S){return w(this.contents,S);},getButton:function(S){return w(this.buttons,S);},uh:function(S,T){return x(this.contents,S,T);},qW:function(S,T){return x(this.buttons,S,T);},uP:function(S){y(this.contents,S);},uO:function(S){y(this.buttons,S);}};function A(S,T){this._={dialog:S};k.extend(this,T);};A.prototype={eB:function(S){return w(this.elements,S,'children');},add:function(S,T){return x(this.elements,S,T,'children');},remove:function(S){y(this.elements,S,'children');}};function B(S){var T=null,U=null,V=S.getElement().getFirst(),W=S.eY(),X=W.config.dialog_magnetDistance,Y=W.skin.margins||[0,0,0,0];if(typeof X=='undefined')X=20;function Z(aT){var bm=S.hR(),bW=a.document.getWindow().eR(),eS=aT.data.$.screenX,fv=aT.data.$.screenY,aP=eS-T.x,bV=fv-T.y,eN,gB;T={x:eS,y:fv};U.x+=aP;U.y+=bV;if(U.x+Y[3]<X)eN= -Y[3];else if(U.x-Y[1]>bW.width-bm.width-X)eN=bW.width-bm.width+Y[1];else eN=U.x;if(U.y+Y[0]<X)gB= -Y[0];else if(U.y-Y[2]>bW.height-bm.height-X)gB=bW.height-bm.height+Y[2];else gB=U.y;S.move(eN,gB,1);aT.data.preventDefault();};function aa(aT){a.document.removeListener('mousemove',Z);a.document.removeListener('mouseup',aa);if(h.ie6Compat){var bm=E.getChild(0).getFrameDocument();bm.removeListener('mousemove',Z);bm.removeListener('mouseup',aa);}};S.bO.title.on('mousedown',function(aT){T={x:aT.data.$.screenX,y:aT.data.$.screenY};a.document.on('mousemove',Z);a.document.on('mouseup',aa);U=S.gz();if(h.ie6Compat){var bm=E.getChild(0).getFrameDocument();bm.on('mousemove',Z);bm.on('mouseup',aa);}aT.data.preventDefault();},S);};function C(S){var T=S.dg,U=T.resizable;if(U==a.DIALOG_RESIZE_NONE)return;var V=S.eY(),W,X,Y,Z,aa,aT;function bm(aP){if(S._.moved&&V.lang.dir=='rtl'){var bV=S._.element.getFirst();bV.setStyle('right',aP+'px');bV.removeStyle('left');}else if(!S._.moved)S.layout();};function bW(aP){aa=S.hR();aP=aP.data.$;var bV=S.bO.contents,eN=bV.$.getElementsByTagName('iframe').length;if(eN){aT=m.kE('<div class="cke_dialog_resize_cover" style="height: 100%; position: absolute; width: 100%;"></div>');bV.append(aT);}X=aa.height-S.bO.contents.hR('height',!(h.gecko||h.opera||i&&h.quirks));W=aa.width-S.bO.contents.hR('width',1);Z={x:aP.screenX,y:aP.screenY};Y=a.document.getWindow().eR();a.document.on('mousemove',eS);a.document.on('mouseup',fv);if(h.ie6Compat){var gB=E.getChild(0).getFrameDocument();gB.on('mousemove',eS);gB.on('mouseup',fv);}aP.preventDefault&&aP.preventDefault();};S.on('load',function(){var aP='';if(U==a.DIALOG_RESIZE_WIDTH)aP=' cke_resizer_horizontal';else if(U==a.DIALOG_RESIZE_HEIGHT)aP=' cke_resizer_vertical';var bV=m.kE('<div class="cke_resizer'+aP+'"'+' title="'+k.htmlEncode(V.lang.resize)+'"></div>');bV.on('mousedown',bW);S.bO.footer.append(bV,1);});V.on('destroy',function(){k.removeFunction(bW);});function eS(aP){var bV=V.lang.dir=='rtl',eN=(aP.data.$.screenX-Z.x)*(bV? -1:1),gB=aP.data.$.screenY-Z.y,dX=aa.width,gs=aa.height,am=dX+eN*(S._.moved?1:2),gP=gs+gB*(S._.moved?1:2),gR=S._.element.getFirst(),pw=bV&&gR.getComputedStyle('right'),aq=S.gz();if(pw)pw=pw=='auto'?Y.width-(aq.x||0)-gR.hR('width'):parseInt(pw,10);if(aq.y+gP>Y.height)gP=Y.height-aq.y;if((bV?pw:aq.x)+am>Y.width)am=Y.width-(bV?pw:aq.x);if((U==a.DIALOG_RESIZE_WIDTH||U==a.DIALOG_RESIZE_BOTH)&& !(bV&&eN>0&& !aq.x))dX=Math.max(T.minWidth||0,am-W);if(U==a.DIALOG_RESIZE_HEIGHT||U==a.DIALOG_RESIZE_BOTH)gs=Math.max(T.minHeight||0,gP-X);S.resize(dX,gs);bm(pw);aP.data.preventDefault();};function fv(){a.document.removeListener('mouseup',fv);a.document.removeListener('mousemove',eS);if(aT){aT.remove();aT=null;}if(h.ie6Compat){var aP=E.getChild(0).getFrameDocument();aP.removeListener('mouseup',fv);aP.removeListener('mousemove',eS);}if(V.lang.dir=='rtl'){var bV=S._.element.getFirst(),eN=bV.getComputedStyle('left');if(eN=='auto')eN=Y.width-parseInt(bV.rd('right'),10)-S.hR().width;else eN=parseInt(eN,10);bV.removeStyle('right');S._.position.x+=1;S.move(eN,S._.position.y);}};};var D=true,E,F,G=function(S){var T=a.document.getWindow();if(!D|| !E){var U=S.config.dialog_backgroundCoverColor||'white',V=['<div style="position: ',h.ie6Compat?'absolute':'fixed','; z-index: ',S.config.baseFloatZIndex,'; top: 0px; left: 0px; ',!h.ie6Compat?'background-color: '+U:'','" id="cke_dialog_background_cover">'];if(h.ie6Compat){var W=h.isCustomDomain(),X="<html><body style=\\'background-color:"+U+";\\'></body></html>";V.push('<iframe hp="true" frameborder="0" id="cke_dialog_background_iframe" src="javascript:');V.push('void((function(){document.open();'+(W?"document.domain='"+document.domain+"';":'')+"document.write( '"+X+"' );"+'document.close();'+'})())');V.push('" style="position:absolute;left:0;top:0;width:100%;height: 100%;progid:DXImageTransform.Microsoft.Alpha(opacity=0)"></iframe>');}V.push('</div>');E=m.kE(V.join(''),a.document);}var Y=E,Z=function(){var bW=T.eR();Y.setStyles({width:bW.width+'px',height:bW.height+'px'});},aa=function(){var bW=T.hV(),eS=a.dialog._.dL;Y.setStyles({left:bW.x+'px',top:bW.y+'px'});do{var fv=eS.gz();eS.move(fv.x,fv.y);}while(eS=eS._.ep);};F=Z;T.on('resize',Z);Z();if(h.ie6Compat){var aT=function(){aa();arguments.callee.lw.apply(this,arguments);};T.$.setTimeout(function(){aT.lw=window.onscroll||(function(){});window.onscroll=aT;},0);aa();}var bm=S.config.dialog_backgroundCoverOpacity;Y.setOpacity(typeof bm!='undefined'?bm:0.5);Y.appendTo(a.document.bH());},H=function(){if(!E)return;var S=a.document.getWindow();E.remove();S.removeListener('resize',F);if(h.ie6Compat)S.$.setTimeout(function(){var T=window.onscroll&&window.onscroll.lw;window.onscroll=T||null;},0);F=null;},I={},J=function(S){var T=S.data.$.ctrlKey||S.data.$.metaKey,U=S.data.$.altKey,V=S.data.$.shiftKey,W=String.fromCharCode(S.data.$.keyCode),X=I[(T?'bP+':'')+(U?'eJ+':'')+(V?'dy+':'')+W];if(!X|| !X.length)return;X=X[X.length-1];X.keydown&&X.keydown.call(X.bf,X.dialog,X.iK);S.data.preventDefault();},K=function(S){var T=S.data.$.ctrlKey||S.data.$.metaKey,U=S.data.$.altKey,V=S.data.$.shiftKey,W=String.fromCharCode(S.data.$.keyCode),X=I[(T?'bP+':'')+(U?'eJ+':'')+(V?'dy+':'')+W];if(!X|| !X.length)return;X=X[X.length-1];if(X.keyup){X.keyup.call(X.bf,X.dialog,X.iK);S.data.preventDefault();}},L=function(S,T,U,V,W){var X=I[U]||(I[U]=[]);X.push({bf:S,dialog:T,iK:U,keyup:W||S.eZ,keydown:V||S.iU});},M=function(S){for(var T in I){var U=I[T];for(var V=U.length-1;V>=0;V--){if(U[V].dialog==S||U[V].bf==S)U.splice(V,1);}if(U.length===0)delete I[T];}},N=function(S,T){if(S._.iX[T])S.selectPage(S._.iX[T]);},O=function(S,T){},P={27:1,13:1},Q=function(S){if(S.data.db()in P)S.data.stopPropagation();};(function(){p.dialog={bf:function(S,T,U,V,W,X,Y){if(arguments.length<4)return;var Z=(V.call?V(T):V)||'div',aa=['<',Z,' '],aT=(W&&W.call?W(T):W)||{},bm=(X&&X.call?X(T):X)||{},bW=(Y&&Y.call?Y(S,T):Y)||'',eS=this.oJ=bm.id||k.getNextNumber()+'_uiElement',fv=this.id=T.id,aP;bm.id=eS;var bV={};if(T.type)bV['cke_dialog_ui_'+T.type]=1;if(T.className)bV[T.className]=1;var eN=bm['class']&&bm['class'].split?bm['class'].split(' '):[];for(aP=0;aP<eN.length;aP++){if(eN[aP])bV[eN[aP]]=1;}var gB=[];for(aP in bV)gB.push(aP);bm['class']=gB.join(' ');if(T.title)bm.title=T.title;var dX=(T.style||'').split(';');for(aP in aT)dX.push(aP+':'+aT[aP]);if(T.hidden)dX.push('display:none');for(aP=dX.length-1;aP>=0;aP--){if(dX[aP]==='')dX.splice(aP,1);}if(dX.length>0)bm.style=(bm.style?bm.style+'; ':'')+dX.join('; ');for(aP in bm)aa.push(aP+'="'+k.htmlEncode(bm[aP])+'" ');aa.push('>',bW,'</',Z,'>');U.push(aa.join(''));(this._||(this._={})).dialog=S;if(typeof T.isChanged=='boolean')this.isChanged=function(){return T.isChanged;};if(typeof T.isChanged=='function')this.isChanged=T.isChanged;a.event.du(this);this.nc(T);if(this.eZ&&this.iU&&T.accessKey)L(this,S,'bP+'+T.accessKey);var gs=this;S.on('load',function(){if(gs.getInputElement())gs.getInputElement().on('focus',function(){S._.eC=false;S._.hasFocus=true;gs.oW('focus');},gs);});if(this.eA){this.cQ=S._.eO.push(this)-1;this.on('focus',function(){S._.aW=gs.cQ;});}k.extend(this,T);},hbox:function(S,T,U,V,W){if(arguments.length<4)return;this._||(this._={});var X=this._.children=T,Y=W&&W.widths||null,Z=W&&W.height||null,aa={},aT,bm=function(){var bW=['<tbody><tr class="cke_dialog_ui_hbox">'];for(aT=0;aT<U.length;aT++){var eS='cke_dialog_ui_hbox_child',fv=[];if(aT===0)eS='cke_dialog_ui_hbox_first';if(aT==U.length-1)eS='cke_dialog_ui_hbox_last';bW.push('<td class="',eS,'" ');if(Y){if(Y[aT])fv.push('width:'+k.cssLength(Y[aT]));}else fv.push('width:'+Math.floor(100/U.length)+'%');if(Z)fv.push('height:'+k.cssLength(Z));if(W&&W.padding!=undefined)fv.push('padding:'+k.cssLength(W.padding));if(fv.length>0)bW.push('style="'+fv.join('; ')+'" ');bW.push('>',U[aT],'</td>');}bW.push('</tr></tbody>');return bW.join('');};p.dialog.bf.call(this,S,W||{type:'hbox'},V,'table',aa,W&&W.align&&{align:W.align}||null,bm);},vbox:function(S,T,U,V,W){if(arguments.length<3)return;this._||(this._={});var X=this._.children=T,Y=W&&W.width||null,Z=W&&W.vY||null,aa=function(){var aT=['<table cellspacing="0" border="0" '];aT.push('style="');if(W&&W.expand)aT.push('height:100%;');aT.push('width:'+k.cssLength(Y||'100%'),';');aT.push('"');aT.push('align="',k.htmlEncode(W&&W.align||(S.eY().lang.dir=='ltr'?'left':'right')),'" ');aT.push('><tbody>');for(var bm=0;bm<U.length;bm++){var bW=[];aT.push('<tr><td ');if(Y)bW.push('width:'+k.cssLength(Y||'100%'));if(Z)bW.push('height:'+k.cssLength(Z[bm]));else if(W&&W.expand)bW.push('height:'+Math.floor(100/U.length)+'%');if(W&&W.padding!=undefined)bW.push('padding:'+k.cssLength(W.padding));if(bW.length>0)aT.push('style="',bW.join('; '),'" ');aT.push(' class="cke_dialog_ui_vbox_child">',U[bm],'</td></tr>');}aT.push('</tbody></table>');return aT.join('');};p.dialog.bf.call(this,S,W||{type:'vbox'},V,'div',null,null,aa);}};})();p.dialog.bf.prototype={getElement:function(){return a.document.getById(this.oJ);},getInputElement:function(){return this.getElement();},getDialog:function(){return this._.dialog;},setValue:function(S){this.getInputElement().setValue(S);this.oW('change',{value:S});return this;},getValue:function(){return this.getInputElement().getValue();},isChanged:function(){return false;},selectParentTab:function(){var V=this;var S=V.getInputElement(),T=S,U;while((T=T.getParent())&&T.$.className.search('cke_dialog_page_contents')== -1){}if(!T)return V;U=T.getAttribute('name');if(V._.dialog._.gx!=U)V._.dialog.selectPage(U);return V;},focus:function(){this.selectParentTab().getInputElement().focus();return this;},nc:function(S){var T=/^on([A-Z]\w+)/,U,V=function(X,Y,Z,aa){Y.on('load',function(){X.getInputElement().on(Z,aa,X);});};for(var W in S){if(!(U=W.match(T)))continue;if(this.dm[W])this.dm[W].call(this,this._.dialog,S[W]);else V(this,this._.dialog,U[1].toLowerCase(),S[W]);}return this;},dm:{onLoad:function(S,T){S.on('load',T,this);},onShow:function(S,T){S.on('show',T,this);},onHide:function(S,T){S.on('hide',T,this);}},iU:function(S,T){this.focus();},eZ:function(S,T){},disable:function(){var S=this.getInputElement();S.setAttribute('disabled','true');S.addClass('cke_disabled');},enable:function(){var S=this.getInputElement();S.removeAttribute('disabled');S.removeClass('cke_disabled');},isEnabled:function(){return!this.getInputElement().getAttribute('disabled');},isVisible:function(){return this.getInputElement().isVisible();},fM:function(){if(!this.isEnabled()|| !this.isVisible())return false;return true;}};p.dialog.hbox.prototype=k.extend(new p.dialog.bf(),{getChild:function(S){var T=this;if(arguments.length<1)return T._.children.concat();if(!S.splice)S=[S];if(S.length<2)return T._.children[S[0]];else return T._.children[S[0]]&&T._.children[S[0]].getChild?T._.children[S[0]].getChild(S.slice(1,S.length)):null;}},true);p.dialog.vbox.prototype=new p.dialog.hbox();(function(){var S={dQ:function(T,U,V){var W=U.children,X,Y=[],Z=[];for(var aa=0;aa<W.length&&(X=W[aa]);aa++){var aT=[];Y.push(aT);Z.push(a.dialog._.gv[X.type].dQ(T,X,aT));}return new p.dialog[U.type](T,Z,Y,V,U);}};a.dialog.addUIElement('hbox',S);a.dialog.addUIElement('vbox',S);})();a.rB=function(S){this.ry=S;};a.rB.prototype={exec:function(S){S.openDialog(this.ry);},sG:false};(function(){var S=/^([a]|[^a])+$/,T=/^\d*$/,U=/^\d*(?:\.\d+)?$/;a.sg=1;a.jb=2;a.dialog.validate={functions:function(){return function(){var aT=this;var V=aT&&aT.getValue?aT.getValue():arguments[0],W=undefined,X=a.jb,Y=[],Z;for(Z=0;Z<arguments.length;Z++){if(typeof arguments[Z]=='function')Y.push(arguments[Z]);else break;}if(Z<arguments.length&&typeof arguments[Z]=='string'){W=arguments[Z];Z++;}if(Z<arguments.length&&typeof arguments[Z]=='number')X=arguments[Z];var aa=X==a.jb?true:false;for(Z=0;Z<Y.length;Z++){if(X==a.jb)aa=aa&&Y[Z](V);else aa=aa||Y[Z](V);}if(!aa){if(W!==undefined)alert(W);if(aT&&(aT.select||aT.focus))aT.select||aT.focus();return false;}return true;};},regex:function(V,W){return function(){var Y=this;var X=Y&&Y.getValue?Y.getValue():arguments[0];if(!V.test(X)){if(W!==undefined)alert(W);if(Y&&(Y.select||Y.focus))if(Y.select)Y.select();else Y.focus();return false;}return true;};},notEmpty:function(V){return this.regex(S,V);},integer:function(V){return this.regex(T,V);},number:function(V){return this.regex(U,V);},equals:function(V,W){return this.functions(function(X){return X==V;},W);},notEqual:function(V,W){return this.functions(function(X){return X!=V;},W);}};})();function R(S,T){var U=function(){W(this);T(this);},V=function(){W(this);},W=function(X){X.removeListener('ok',U);X.removeListener('cancel',V);};S.on('ok',U);S.on('cancel',V);};k.extend(a.application.prototype,{openDialog:function(S,T,U){var V=a.dialog._.ev[S];if(typeof V=='function'){var W=this._.oB||(this._.oB={}),X=W[S]||(W[S]=new a.dialog(this,S));T&&T.call(X,X);!this._.activeElement&&(this._.activeElement=this.document.$.activeElement);!this._.oO&&(this._.oO=this.ld['filesview.filesview'].tools.oO());X.show();return X;}else if(V=='failed')throw new Error('[CKFINDER.dialog.openDialog] Dialog "'+S+'" failed when loading dg.');var Y=a.document.bH(),Z=Y.$.style.cursor,aa=this;Y.setStyle('cursor','wait');a.scriptLoader.load(a.getUrl(V),function(){if(typeof a.dialog._.ev[S]!='function')a.dialog._.ev[S]='failed';aa.openDialog(S,T);Y.setStyle('cursor',Z);},null,null,U);return null;},hs:function(S,T,U,V){var W=this;setTimeout(function(){W.cg.openDialog('Input',function(X){X.show();X.setTitle(S||W.lang.common.inputTitle);X.getContentElement('tab1','msg').getElement().setHtml(T);X.getContentElement('tab1','input').setValue(U);R(X,function(Y){var Z=Y.getContentElement('tab1','input').getValue();V(Z);});});},0);},msgDialog:function(S,T,U){var V=this;setTimeout(function(){V.cg.openDialog('Msg',function(W){W.show();W.setTitle(S||V.lang.common.messageTitle);W.getContentElement('tab1','msg').getElement().setHtml(T);U&&R(W,function(X){U();});});},0);},fe:function(S,T,U){var V=this;setTimeout(function(){V.cg.openDialog('Confirm',function(W){W.show();W.setTitle(S||V.lang.common.confirmationTitle);W.getContentElement('tab1','msg').getElement().setHtml(T);R(W,function(X){U();});});},0);},skippedFilesDialog:function(S,T,U,V){var W=this;setTimeout(function(){W.cg.openDialog('SkippedFiles',function(X){X.show();X.setTitle(S||W.lang.common.messageTitle);if(U){X.getContentElement('tab1','msg').getElement().show();X.getContentElement('tab1','msg').getElement().setHtml(U);}else X.getContentElement('tab1','msg').getElement().hide();var Y='',Z='cke_files_list',aa='',aT=T.length;if(aT>3){Z+=' cke_files_list_many';aa=' style="height: '+Math.min(aT+0.1,20)+'em"';}for(var bm=0;bm<aT;bm++)Y+='<li>'+(typeof T[bm]=='string'?T[bm]:T[bm].getAttribute('name'))+'</li>';X.getContentElement('tab1','skippedList').getElement().setHtml('<ul class="'+Z+'"'+aa+'>'+Y+'</ul>');V&&R(X,function(){V();});});},0);}});o.add('dialog',{bM:['dialogui'],onLoad:function(){a.dialog.add('Confirm',function(S){return{title:S.lang.common.confirmationTitle,minWidth:270,minHeight:60,contents:[{id:'tab1',elements:[{type:'html',html:'',id:'msg'}]}],buttons:[CKFinder.dialog.okButton,CKFinder.dialog.cancelButton]};});a.dialog.add('Msg',function(S){return{title:S.lang.common.messageTitle,minWidth:270,minHeight:60,contents:[{id:'tab1',elements:[{type:'html',html:'',id:'msg'}]}],buttons:[CKFinder.dialog.okButton]};});a.dialog.add('Input',function(S){return{title:S.lang.common.inputTitle,minWidth:270,minHeight:60,contents:[{id:'tab1',elements:[{type:'html',html:'',id:'msg'},{type:'text',id:'input'}]}],buttons:[CKFinder.dialog.okButton,CKFinder.dialog.cancelButton]};});a.dialog.add('SkippedFiles',function(S){return{title:S.lang.common.messageTitle,minWidth:400,minHeight:100,contents:[{id:'tab1',style:h.ie7Compat?'height: auto':'',expand:true,padding:0,elements:[{type:'vbox',expand:true,children:[{type:'html',className:'cke_dialog_msg',html:'',id:'msg'},{type:'html',id:'skippedDescription',className:'cke_dialog_msg',html:S.lang.SkippedFiles},{type:'html',id:'skippedList',className:'cke_dialog_msg',html:''}]}]}],buttons:[CKFinder.dialog.okButton]};});}});})();o.add('dialogui');(function(){var r=function(y){var B=this;B._||(B._={});B._['default']=B._.hq=y['default']||'';var z=[B._];for(var A=1;A<arguments.length;A++)z.push(arguments[A]);z.push(true);k.extend.apply(k,z);return B._;},s={dQ:function(y,z,A){return new p.dialog.ju(y,z,A);}},t={dQ:function(y,z,A){return new p.dialog[z.type](y,z,A);}},u={isChanged:function(){return this.getValue()!=this.lu();},reset:function(){this.setValue(this.lu());},jW:function(){this._.hq=this.getValue();},ki:function(){this._.hq=this._['default'];},lu:function(){return this._.hq;}},v=k.extend({},p.dialog.bf.prototype.dm,{onChange:function(y,z){if(!this._.pL){y.on('load',function(){this.getInputElement().on('change',function(){this.oW('change',{value:this.getValue()});},this);},this);this._.pL=true;}this.on('change',z);}},true),w=/^on([A-Z]\w+)/,x=function(y){for(var z in y){if(w.test(z)||z=='title'||z=='type')delete y[z];}return y;};k.extend(p.dialog,{dD:function(y,z,A,B){if(arguments.length<4)return;var C=r.call(this,z);C.hz=k.getNextNumber()+'_label';var D=this._.children=[],E=function(){var F=[];if(z.uC!='horizontal')F.push('<div class="cke_dialog_ui_labeled_label" id="',C.hz,'" >',z.label,'</div>','<div class="cke_dialog_ui_labeled_content">',B(y,z),'</div>');else{var G={type:'hbox',widths:z.widths,padding:0,children:[{type:'html',html:'<span class="cke_dialog_ui_labeled_label" id="'+C.hz+'">'+k.htmlEncode(z.label)+'</span>'},{type:'html',html:'<span class="cke_dialog_ui_labeled_content">'+B(y,z)+'</span>'}]};a.dialog._.gv.hbox.dQ(y,G,F);}return F.join('');};p.dialog.bf.call(this,y,z,A,'div',null,null,E);},ju:function(y,z,A){if(arguments.length<3)return;r.call(this,z);var B=this._.le=k.getNextNumber()+'_textInput',C={'class':'cke_dialog_ui_input_'+z.type,id:B,type:'text'},D;if(z.validate)this.validate=z.validate;if(z.maxLength)C.uy=z.maxLength;if(z.size)C.size=z.size;var E=this,F=false;y.on('load',function(){E.getInputElement().on('keydown',function(H){if(H.data.db()==13)F=true;});E.getInputElement().on('keyup',function(H){if(H.data.db()==13&&F){y.getButton('ok')&&setTimeout(function(){y.getButton('ok').click();},0);F=false;}},null,null,1000);});var G=function(){var H=['<div class="cke_dialog_ui_input_',z.type,'"'];if(z.width)H.push('style="width:'+z.width+'" ');H.push('><input ');for(var I in C)H.push(I+'="'+C[I]+'" ');H.push(' /></div>');return H.join('');};p.dialog.dD.call(this,y,z,A,G);},textarea:function(y,z,A){if(arguments.length<3)return;r.call(this,z);var B=this,C=this._.le=k.getNextNumber()+'_textarea',D={};if(z.validate)this.validate=z.validate;D.rows=z.rows||5;D.cols=z.cols||20;var E=function(){var F=['<div class="cke_dialog_ui_input_textarea"><textarea class="cke_dialog_ui_input_textarea" id="',C,'" '];for(var G in D)F.push(G+'="'+k.htmlEncode(D[G])+'" ');F.push('>',k.htmlEncode(B._['default']),'</textarea></div>');return F.join('');};p.dialog.dD.call(this,y,z,A,E);},checkbox:function(y,z,A){if(arguments.length<3)return;var B=r.call(this,z,{'default': ! !z['default']});if(z.validate)this.validate=z.validate;var C=function(){var D=k.extend({},z,{id:z.id?z.id+'_checkbox':k.getNextNumber()+'_checkbox'},true),E=[],F={'class':'cke_dialog_ui_checkbox_input',type:'checkbox'};x(D);if(z['default'])F.checked='checked';B.checkbox=new p.dialog.bf(y,D,E,'input',null,F);E.push(' <label for="',F.id,'">',k.htmlEncode(z.label),'</label>');return E.join('');};p.dialog.bf.call(this,y,z,A,'span',null,null,C);},radio:function(y,z,A){if(arguments.length<3)return;r.call(this,z);if(!this._['default'])this._['default']=this._.hq=z.items[0][1];if(z.validate)this.validate=z.sh;var B=[],C=this,D=function(){var E=[],F=[],G={'class':'cke_dialog_ui_radio_item'},H=z.id?z.id+'_radio':k.getNextNumber()+'_radio';for(var I=0;I<z.items.length;I++){var J=z.items[I],K=J[2]!==undefined?J[2]:J[0],L=J[1]!==undefined?J[1]:J[0],M=k.extend({},z,{id:k.getNextNumber()+'_radio_input',title:null,type:null},true),N=k.extend({},M,{id:null,title:K},true),O={type:'radio','class':'cke_dialog_ui_radio_input',name:H,value:L},P=[];if(C._['default']==L)O.checked='checked';x(M);x(N);B.push(new p.dialog.bf(y,M,P,'input',null,O));P.push(' ');new p.dialog.bf(y,N,P,'label',null,{'for':O.id},J[0]);E.push(P.join(''));}new p.dialog.hbox(y,[],E,F);return F.join('');};p.dialog.dD.call(this,y,z,A,D);this._.children=B;},button:function(y,z,A){if(!arguments.length)return;if(typeof z=='function')z=z(y.eY());r.call(this,z,{disabled:z.disabled||false});a.event.du(this);var B=this;y.on('load',function(D){var E=this.getElement();(function(){E.on('click',function(F){B.oW('click',{dialog:B.getDialog()});F.data.preventDefault();});})();E.unselectable();},this);var C=k.extend({},z);delete C.style;p.dialog.bf.call(this,y,C,A,'a',null,{style:z.style,href:'javascript:void(0)',title:z.label,hp:'true','class':z['class']},'<span class="cke_dialog_ui_button">'+k.htmlEncode(z.label)+'</span>');},select:function(y,z,A){if(arguments.length<3)return;var B=r.call(this,z);if(z.validate)this.validate=z.validate;var C=function(){var D=k.extend({},z,{id:z.id?z.id+'_select':k.getNextNumber()+'_select'},true),E=[],F=[],G={'class':'cke_dialog_ui_input_select'};if(z.size!=undefined)G.size=z.size;if(z.multiple!=undefined)G.multiple=z.multiple;x(D);for(var H=0,I;H<z.items.length&&(I=z.items[H]);H++)F.push('<option value="',k.htmlEncode(I[1]!==undefined?I[1]:I[0]),'" /> ',k.htmlEncode(I[0]));B.select=new p.dialog.bf(y,D,E,'select',null,G,F.join(''));return E.join('');};p.dialog.dD.call(this,y,z,A,C);},file:function(y,z,A){if(arguments.length<3)return;if(z['default']===undefined)z['default']='';var B=k.extend(r.call(this,z),{dg:z,buttons:[]});if(z.validate)this.validate=z.validate;var C=function(){B.gL=k.getNextNumber()+'_fileInput';var D=h.isCustomDomain(),E=['<iframe frameborder="0" allowtransparency="0" class="cke_dialog_ui_input_file" id="',B.gL,'" title="',z.label,'" src="javascript:void('];E.push(D?"(function(){document.open();document.domain='"+document.domain+"';"+'document.close();'+'})()':'0');E.push(')"></iframe>');return E.join('');};y.on('load',function(){var D=a.document.getById(B.gL),E=D.getParent();E.addClass('cke_dialog_ui_input_file');});p.dialog.dD.call(this,y,z,A,C);},fileButton:function(y,z,A){if(arguments.length<3)return;var B=r.call(this,z),C=this;if(z.validate)this.validate=z.validate;var D=k.extend({},z),E=D.onClick;D.className=(D.className?D.className+' ':'')+'cke_dialog_ui_button';D.onClick=function(F){var G=z['for'];if(!E||E.call(this,F)!==false){y.getContentElement(G[0],G[1]).submit();this.disable();}};y.on('load',function(){y.getContentElement(z['for'][0],z['for'][1])._.buttons.push(C);});p.dialog.button.call(this,y,D,A);},html:(function(){var y=/^\s*<[\w:]+\s+([^>]*)?>/,z=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,A=/\/$/;return function(B,C,D){if(arguments.length<3)return;var E=[],F,G=C.html,H,I;if(G.charAt(0)!='<')G='<span>'+G+'</span>';if(C.focus){var J=this.focus;this.focus=function(){J.call(this);C.focus.call(this);this.oW('focus');};if(C.fM){var K=this.fM;this.fM=K;}this.eA=true;}p.dialog.bf.call(this,B,C,E,'span',null,null,'');F=E.join('');H=F.match(y);I=G.match(z)||['','',''];if(A.test(I[1])){I[1]=I[1].slice(0,-1);I[2]='/'+I[2];}D.push([I[1],' ',H[1]||'',I[2]].join(''));};})()},true);p.dialog.html.prototype=new p.dialog.bf();p.dialog.dD.prototype=k.extend(new p.dialog.bf(),{rW:function(y){var z=a.document.getById(this._.hz);if(z.iu()<1)new j.text(y,a.document).appendTo(z);else z.getChild(0).$.nodeValue=y;return this;},vt:function(){var y=a.document.getById(this._.hz);if(!y||y.iu()<1)return '';else return y.getChild(0).getText();},dm:v},true);p.dialog.button.prototype=k.extend(new p.dialog.bf(),{click:function(){var y=this;if(!y._.disabled)return y.oW('click',{dialog:y._.dialog});y.getElement().$.blur();return false;},enable:function(){this._.disabled=false;var y=this.getElement();y&&y.removeClass('disabled');},disable:function(){this._.disabled=true;this.getElement().addClass('disabled');},isVisible:function(){return this.getElement().getFirst().isVisible();},isEnabled:function(){return!this._.disabled;},dm:k.extend({},p.dialog.bf.prototype.dm,{onClick:function(y,z){this.on('click',z);}},true),eZ:function(){this.click();},iU:function(){this.focus();},eA:true},true);p.dialog.ju.prototype=k.extend(new p.dialog.dD(),{getInputElement:function(){return a.document.getById(this._.le);},focus:function(){var y=this.selectParentTab();setTimeout(function(){var z=y.getInputElement();z&&z.$.focus();},0);},select:function(){var y=this.selectParentTab();setTimeout(function(){var z=y.getInputElement();if(z){z.$.focus();z.$.select();}},0);},eZ:function(){this.select();},setValue:function(y){y=y!==null?y:'';return p.dialog.bf.prototype.setValue.call(this,y);},eA:true},u,true);p.dialog.textarea.prototype=new p.dialog.ju();p.dialog.select.prototype=k.extend(new p.dialog.dD(),{getInputElement:function(){return this._.select.getElement();},add:function(y,z,A){var B=new m('option',this.getDialog().eY().document),C=this.getInputElement().$;B.$.text=y;B.$.value=z===undefined||z===null?y:z;if(A===undefined||A===null){if(i)C.add(B.$);else C.add(B.$,null);}else C.add(B.$,A);return this;},remove:function(y){var z=this.getInputElement().$;z.remove(y);return this;},clear:function(){var y=this.getInputElement().$;while(y.length>0)y.remove(0);return this;},eA:true},u,true);p.dialog.checkbox.prototype=k.extend(new p.dialog.bf(),{getInputElement:function(){return this._.checkbox.getElement();},setValue:function(y){this.getInputElement().$.checked=y;this.oW('change',{value:y});},getValue:function(){return this.getInputElement().$.checked;},eZ:function(){this.setValue(!this.getValue());},dm:{onChange:function(y,z){if(!i)return v.onChange.apply(this,arguments);else{y.on('load',function(){var A=this._.checkbox.getElement();A.on('propertychange',function(B){B=B.data.$;if(B.propertyName=='checked')this.oW('change',{value:A.$.checked});},this);},this);this.on('change',z);}return null;}},eA:true},u,true);p.dialog.radio.prototype=k.extend(new p.dialog.bf(),{setValue:function(y){var z=this._.children,A;for(var B=0;B<z.length&&(A=z[B]);B++)A.getElement().$.checked=A.getValue()==y;this.oW('change',{value:y});},getValue:function(){var y=this._.children;for(var z=0;z<y.length;z++){if(y[z].getElement().$.checked)return y[z].getValue();}return null;},eZ:function(){var y=this._.children,z;for(z=0;z<y.length;z++){if(y[z].getElement().$.checked){y[z].getElement().focus();return;}}y[0].getElement().focus();},dm:{onChange:function(y,z){if(!i)return v.onChange.apply(this,arguments);else{y.on('load',function(){var A=this._.children,B=this;for(var C=0;C<A.length;C++){var D=A[C].getElement();D.on('propertychange',function(E){E=E.data.$;if(E.propertyName=='checked'&&this.$.checked)B.oW('change',{value:this.getAttribute('value')});});}},this);this.on('change',z);}return null;}},eA:true},u,true);p.dialog.file.prototype=k.extend(new p.dialog.dD(),u,{getInputElement:function(){var y=a.document.getById(this._.gL).getFrameDocument();return y.$.forms.length>0?new m(y.$.forms[0].elements[0]):this.getElement();},submit:function(){this.getInputElement().getParent().$.submit();return this;},vy:function(y){return this.getInputElement().getParent().$.action;},reset:function(){var y=a.document.getById(this._.gL),z=y.getFrameDocument(),A=this._.dg,B=this._.buttons;function C(){z.$.open();if(h.isCustomDomain())z.$.domain=document.domain;var D='';if(A.size)D=A.size-(i?7:0);z.$.write(['<html><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">','<form enctype="multipart/form-data" method="POST" action="',k.htmlEncode(A.action),'">','<input type="file" name="',k.htmlEncode(A.id||'cke_upload'),'" size="',k.htmlEncode(D>0?D:''),'" />','</form>','</body></html>'].join(''));z.$.close();for(var E=0;E<B.length;E++)B[E].enable();};if(h.gecko)setTimeout(C,500);else C();},getValue:function(){return '';},dm:v,eA:true},true);p.dialog.fileButton.prototype=new p.dialog.button();a.dialog.addUIElement('text',s);a.dialog.addUIElement('password',s);a.dialog.addUIElement('textarea',t);a.dialog.addUIElement('checkbox',t);a.dialog.addUIElement('radio',t);a.dialog.addUIElement('button',t);a.dialog.addUIElement('select',t);a.dialog.addUIElement('file',t);a.dialog.addUIElement('fileButton',t);a.dialog.addUIElement('html',t);k.extend(CKFinder.dialog,a.dialog);})();(function(){o.add('help',{bM:['toolbar','button'],bz:function s(r){if(!r.config.disableHelpButton){r.bD('help',{exec:function(t){t.ld['filesview.filesview'].bn().focus();window.open(a.basePath+'help/'+(t.lang.HelpLang||'en')+'/index.html');}});r.bY.add('Help',a.UI_BUTTON,{label:r.lang.Help,command:'help'});}}});})();(function(){var r=1,s=2,t=3,u=4,v=5,w=0,x=0,y=[],z,A;function B(J,K,L,M,N){var O=0,P=0,Q=[];for(var R=0;R<J.length;R++){if(!M||M(J[R])){Q.push('<a href="',K.folder.getUrl(),encodeURIComponent(J[R].name),'" title="',J[R].name,'" rel="',L,'">a</a>');if(J[R].isSameFile(K))O=P;P++;}}E();A=new m('div',N);A.setAttribute('id','ckf_gallery');A.setHtml(Q.join(''));A.appendTo(N.bH());A.hide();return O;};function C(J){if(J&&J.inPopup){var K=new l(J.document),L=K.getWindow();if(!i&& !h.opera||L.$.top.location.href.match(/ckfinder.html/)||L.$.top.name=='CKFinderpopup')return K;}return a.oC;};function D(J){return function(){J.$.activeElement&&J.$.activeElement.blur();J.$.activeElement&&J.$.activeElement.blur();if(!h.gecko){J.getWindow().focus();J.bH().focus();}};};function E(){A&&A.remove();};function F(J){return function(){E();J&&J.focus(true,true);};};function G(J){if(J.click)J.click();else if(a.document.$.createEvent){var K=a.document.$.createEvent('MouseEvents');K.initEvent('click',true,true);J.dispatchEvent(K);}};function H(J,K,L){if(i&&h.version<9)J.$.onreadystatechange=function(){if(this.readyState=='loaded'||this.readyState=='complete')setTimeout(function(){K.callee.apply(L,K);},0);};else J.on('load',function(){setTimeout(function(){K.callee.apply(L,K);},0);});};CKFinder.addPlugin('gallery',{bM:['filesview'],galleryCallback:function(J,K,L){if(!x)I(null,J);var M=C(J),N=M.getWindow().$,O=function(aT){return aT.isImage();};if(!w&&J.config.gallery_autoLoad){if(!O(K))return false;var P=M.getHead(),Q=CKFinder.getPluginPath('gallery')+'colorbox/',R=arguments,S,T=typeof N.jQuery=='undefined';if(!T){var U=N.jQuery.fn.jquery.split('.'),V=parseInt(U[0],10),W=parseInt(U[1],10),X=parseInt(U[2]||0,10);if(V<1||V==1&&W<4||V==1&&W==4&&X<3)T=true;}if(T){if(N.jQuery)y=[N.jQuery,N.$];S=new m('script',M);S.setAttribute('type','text/javascript');S.setAttribute('src',Q+'jquery.min.js');H(S,R,N);S.appendTo(P);return true;}M.appendStyleSheet(Q+'colorbox.css');S=new m('script',M);S.setAttribute('type','text/javascript');S.setAttribute('src',Q+'jquery.colorbox-min.js');H(S,R,N);S.appendTo(P);return true;}if(y.length){z=N.jQuery.noConflict(true);N.jQuery=y[0];N.$=y[1];y=[];}if(!z)z=N.jQuery;if(w){var Y=k.getNextNumber(),Z,aa='ckf_gallery_'+Y;switch(w){case r:if(!O(K))return false;Z=B(L,K,aa,O,M);z('#ckf_gallery a').colorbox(k.extend({minWidth:'300',minHeight:'200',maxWidth:'95%',maxHeight:'95%',scalePhotos:true,current:J.lang.Gallery.current},J.config.gallery_config,{rel:aa,group:aa,onClosed:F(K),onOpen:D(M)},true)).eq(Z).click();break;case s:O=function(aT){return aT.isImage()||aT.ext=='swf';};if(!O(K))return false;Z=B(L,K,aa,O,M);N.jQuery('#ckf_gallery a').fancybox(k.extend({},J.config.gallery_config,{onClosed:E,onComplete:D(M),afterClose:F(K),afterShow:D(M)},true)).eq(Z).click();break;case t:O=function(aT){return aT.isImage()||aT.ext=='swf'||aT.ext=='mov';};if(!O(K))return false;Z=B(L,K,'prettyPhoto[ckf_gallery_'+Y+']',O,M);N.jQuery('#ckf_gallery a').prettyPhoto(k.extend({},J.config.gallery_config,{callback:F(K),changepicturecallback:D(M)},true)).eq(Z).click();break;case u:O=function(aT){return aT.isImage()||aT.ext=='swf'||aT.ext=='mov';};if(!O(K))return false;Z=B(L,K,aa,O,M);N.Shadowbox.qi('#ckf_gallery a',k.extend({},J.config.gallery_config,{gallery:aa,onClose:F(K),onFinish:D(M)},true));G(A.eG('a').getItem(Z).$);break;case v:if(!O(K))return false;Z=B(L,K,'lightbox[ckf_gallery_'+Y+']',O,M);G(A.eG('a').getItem(Z).$);break;default:return false;}return true;}return false;},bz:I});function I(J,K){if(J&&J.inPopup)return;J&&J.ld['filesview.filesview'].on('afterRenderFiles',E);var L=C(K).getWindow().$;if(typeof L.jQuery!='undefined'&&L.jQuery.fn.colorbox)w=r;else if(typeof L.jQuery!='undefined'&&L.jQuery.fn.fancybox)w=s;else if(typeof L.jQuery!='undefined'&&L.jQuery.fn.prettyPhoto)w=t;else if(typeof L.Shadowbox!='undefined')w=u;else if(typeof L.Prototype!='undefined'&&typeof L.Lightbox!='undefined')w=v;w&&(x=1);};})();n.gallery_autoLoad=true;(function(){function r(x){if(!x||x.type!=a.cv||x.getName()!='form')return[];var y=[],z=['style','className'];for(var A=0;A<z.length;A++){var B=z[A],C=x.$.elements.namedItem(B);if(C){var D=new m(C);y.push([D,D.nextSibling]);D.remove();}}return y;};function s(x,y){if(!x||x.type!=a.cv||x.getName()!='form')return;if(y.length>0)for(var z=y.length-1;z>=0;z--){var A=y[z][0],B=y[z][1];if(B)A.insertBefore(B);else A.appendTo(x);}};function t(x,y){var z=r(x),A={},B=x.$;if(!y){A['class']=B.className||'';B.className='';}A.inline=B.style.cssText||'';if(!y)B.style.cssText='position: static; overflow: visible';s(z);return A;};function u(x,y){var z=r(x),A=x.$;if('class'in y)A.className=y['class'];if('inline'in y)A.style.cssText=y.inline;s(z);};var v=null,w=null;o.add('maximize',{bz:function(x){var y=x.lang.Maximize,z=a.oC,A=z.getWindow(),B,C=[0,0,0,0],D={},E,F;B=a.document.getWindow().$;try{B=B.frameElement;}catch(H){B=null;}B=B&&new m(B);if(B&& !B.getFrameDocument().bH().hasClass('CKFinderFrameWindow'))B=null;function G(I){var J=A.eR();if(!I&&B)I=[B];if(I){for(var K=0,L=I.length;K<L;K++)I[K].setStyles({width:J.width+'px',height:J.height+'px'});x.oW('resize');}else x.resize(J.width,J.height);};x.bD('maximize',{oD:false,exec:function(){var I=x.document.getWindow().$;if(x.cg.inPopup&&(!i&& !h.opera||I.top.location.href.match(/ckfinder.html/)||I.top.name=='CKFinderpopup')){var I=x.document.getWindow().$.parent;if(this.bu==a.aS){C[2]=I.screenLeft||I.screenX;C[3]=I.screenTop||I.screenY;I.moveTo(0,0);if(!w)w=[I.screenLeft||I.screenX,I.screenTop||I.screenY];C[2]-=w[0];C[3]-=w[1];if(!I.outerHeight){C[0]=I.document.body.scrollWidth;C[1]=I.document.body.scrollHeight;if(!v){I.resizeTo(I.screen.availWidth,I.screen.availHeight);v=[I.screen.availWidth-I.document.body.scrollWidth,I.screen.availHeight-I.document.body.scrollHeight];}C[0]+=v[0];C[1]+=v[1];}else{C[0]=I.outerWidth;C[1]=I.outerHeight;}if(I.resizeTo)I.resizeTo(I.screen.availWidth,I.screen.availHeight);else{I.outerHeight=I.screen.availHeight;I.outerWidth=I.screen.availWidth;}}else{if(I.resizeTo)I.resizeTo(C[0],C[1]);else{I.outerWidth=C[0];I.outerHeight=C[1];}I.moveTo(C[2],C[3]);}}else{var J=B||x.container;if(this.bu==a.aS){E=A.hV();var K=J,L;while(K=K.getParent()){L=k.getNextNumber();D[L]=t(K);K.$.og=L;K.is('html','body')&&K.setStyle('overflow','hidden');K.setStyle('z-index',x.config.baseFloatZIndex-1);}L=k.getNextNumber();D[L]=t(J,true);J.$.og=L;var M=[J],I=J.getDocument().getWindow().$;while(I.frameElement){M.push(m.eB(I.frameElement));I=I.parent;}F=function(){G(M);};A.on('resize',F);var N=new l(I.document),O={overflow:h.webkit?'':'hidden',width:0,height:0};N.gT().setStyles(O);!h.gecko&&N.gT().setStyle('position','fixed');N.bH().setStyles(O);i?setTimeout(function(){A.$.scrollTo(0,0);},0):A.$.scrollTo(0,0);var P;for(var Q=0,R=M.length;Q<R;Q++){P=M[Q];P.setStyle('position','absolute');P.$.offsetLeft;P.setStyles({'z-index':x.config.baseFloatZIndex-1,left:'0px',top:'0px'});}M[0].addClass('cke_maximized');G(M);var S=M[0].ir();M[0].setStyles({left: -1*S.x+'px',top: -1*S.y+'px'});}else{A.removeListener('resize',F);var K=J;while(K){u(K,D[K.$.og]);K.$.og=null;K=K.getParent();}D={};i?setTimeout(function(){A.$.scrollTo(E.x,E.y);},0):A.$.scrollTo(E.x,E.y);J.removeClass('cke_maximized');if(h.webkit){J.setStyle('display','inline');setTimeout(function(){J.setStyle('display','block');},0);}x.oW('resize');}}this.rJ();var T=this.pW[0];if(T){var U=this.bu==a.aS?y.maximize:y.minimize,V=x.document.getById(T._.id);V.getChild(1).setHtml(U);V.setAttribute('title',U);V.setAttribute('href','javascript:void("'+U+'");');}}});x.bY.qW('Maximize',{label:y.maximize,command:'maximize'});}});})();(function(){var r={};CKFinder.addPlugin('zip',{uiReady:function(t){var u=t.lang.Zip;CKFinder.dialog.add('compressToFileName',function(v){var w=v.getSelectedFolder();return{title:v.lang.DestinationFile,minWidth:270,minHeight:60,contents:[{id:'tab1',label:'',title:'',expand:true,style:CKFinder.env.ie7Compat?'height:auto':'',padding:0,elements:[{id:'msg',className:'cke_dialog_error_msg',type:'html',html:v.lang.FileRename},{type:'hbox',widths:['90%','10%'],padding:0,children:[{type:'text',label:'',id:'fileName','default':w.name,validate:function(){if(!this.getValue()){v.openMsgDialog('',v.lang.ErrorMsg.FileEmpty);return false;}}},{type:'html',html:'.zip',id:'fileNameExt',onLoad:function(){this.getElement().getParent().setStyles({'vertical-align':'bottom','padding-bottom':'2px'});}}]}]}],buttons:[CKFinder.dialog.okButton,CKFinder.dialog.cancelButton]};});CKFinder.dialog.add('unzipDirExists',function(v){var w=v.getSelectedFolder(),x=[[v.lang.ManuallyRename,'manuallyrename']];if(w.acl.fileDelete&&w.acl.fileRename&&w.acl.folderRename&&w.acl.folderDelete)x.push([u.removeAndExtract,'overwrite'],[u.extractAndOverwrite,'merge']);return{title:v.lang.ErrorMsg.FolderNameExists,minWidth:270,minHeight:60,contents:[{id:'tab1',label:'',title:'',expand:true,style:CKFinder.env.ie7Compat?'height:auto':'',padding:0,elements:[{id:'msg',className:'cke_dialog_error_msg',type:'html',html:''},{type:'hbox',className:'cke_dialog_file_exist_options',children:[{label:v.lang.common.makeDecision,type:'radio',id:'option','default':'manuallyrename',items:x}]}]}],onOk:function(){var y=this,z=y.getValueOf('tab1','option');if(z=='manuallyrename')z=null;r.extractTo(v.getSelectedFile(),z);return true;},onCancel:function(){r.ma(w);return true;},buttons:[CKFinder.dialog.okButton,CKFinder.dialog.cancelButton]};});CKFinder.dialog.add('unzipFileExists',function(v){var w=v.getSelectedFolder();return{title:v.lang.FileExistsDlgTitle,minWidth:350,minHeight:120,contents:[{id:'tab1',label:'',title:'',style:CKFinder.env.ie7Compat?'height:auto':'',expand:true,padding:0,elements:[{id:'msg',className:'cke_dialog_error_msg',type:'html',widths:['70%','30%'],html:''},{type:'hbox',className:'cke_dialog_file_exist_options',children:[{type:'radio',id:'option',label:v.lang.common.makeDecision,'default':'autorename',items:[[v.lang.FileAutorename,'autorename'],[v.lang.FileOverwrite,'overwrite'],[v.lang.common.skip,'skip']]}]},{type:'hbox',className:'cke_dialog_remember_decision',children:[{type:'checkbox',id:'remember',label:v.lang.common.rememberDecision}]}]}],onCancel:function(){r.ma(w);return true;},buttons:[CKFinder.dialog.okButton,CKFinder.dialog.cancelButton]};});CKFinder.dialog.add('compressFileExists',function(v){var w=v.getSelectedFolder(),x=[[v.lang.ManuallyRename,'manuallyrename']];if(w.acl.fileDelete&&w.acl.fileRename)x.push([v.lang.FileAutorename,'autorename'],[v.lang.FileOverwrite,'overwrite']);return{title:v.lang.FileExistsDlgTitle,minWidth:270,minHeight:60,contents:[{id:'tab1',label:'',title:'',expand:true,style:CKFinder.env.ie7Compat?'height:auto':'',padding:0,elements:[{id:'msg',className:'cke_dialog_error_msg',type:'html',html:''},{type:'hbox',className:'cke_dialog_file_exist_options',children:[{label:v.lang.common.makeDecision,type:'radio',id:'option','default':'manuallyrename',items:x}]}]}],onOk:function(){var y=this,z=y.getValueOf('tab1','option');if(z=='manuallyrename')z=null;r.nX(v.getSelectedFolder(),r.pp.download,z);return true;},onCancel:function(){r.ma(w);return true;},buttons:[CKFinder.dialog.okButton,CKFinder.dialog.cancelButton]};});t.connector.app.dZ('zip',112);r={rQ:{iz:/[\\\/:\*\?"<>\|]/},iG:{extractHere:{label:u.extractHereLabel,command:'ExtractHere',group:'zip',icon:CKFinder.getPluginPath('zip')+'images/zip.gif'},extractTo:{label:u.extractToLabel,command:'ExtractTo',group:'zip',icon:CKFinder.getPluginPath('zip')+'images/zip.gif'},downloadZip:{label:u.downloadZipLabel,command:'DownloadZip',group:'zip',icon:CKFinder.getPluginPath('zip')+'images/zip.gif'},compressZip:{label:u.compressZipLabel,command:'CompressZip',group:'zip',icon:CKFinder.getPluginPath('zip')+'images/zip.gif'}},ma:function(v){v.getChildren(function(w){v.close();v.showFiles();v.open();},true);},oc:function(v){if(!v|| !v.length)return t.lang.ErrorMsg.FolderEmpty;if(r.rQ.iz.test(v))return t.lang.ErrorMsg.FolderInvChar;return false;},nI:function(v){if(!r.filesList[r.currentItem]){r.extractHere(t.getSelectedFile(),true);return;}var w=[{name:'skip'},{name:'ok'}];if(r.filesList[r.currentItem].options&&s(r.filesList[r.currentItem].options,w)){r.currentItem++;t.openDialog('unzipFileExists',r.nI);return;}v.show();var x=t.lang.ErrorMsg[r.filesList[r.currentItem].type=='Folder'?'FolderExists':'FileExists'];x='<strong>'+x.replace('%s',r.filesList[r.currentItem].name)+'</strong>';v.getContentElement('tab1','msg').getElement().setHtml(x);v.on('ok',function(y){y.removeListener();var z=v.getValueOf('tab1','remember'),A=v.getValueOf('tab1','option');if(z){for(var B=0,C=r.filesList.length;B<C;B++){if(!r.filesList[B].options)r.filesList[B].options=A;}r.extractHere(t.getSelectedFile(),true);return;}else{r.filesList[r.currentItem].options=A;r.currentItem++;while(r.currentItem<r.filesList.length){if(!r.filesList[r.currentItem].options||r.filesList[r.currentItem].options&&r.filesList[r.currentItem].options!='skip')break;r.currentItem++;}if(r.currentItem<r.filesList.length){setTimeout(function(){t.openDialog('unzipFileExists',r.nI);},0);return;}else{r.extractHere(t.getSelectedFile(),true);return;}}});},extract:function(v){var w={},x=v.file;if(v.extra)w=v.extra;w.fileName=v.file.name;t.connector.sendCommandPost(v.action,null,w,function(y){r.filesList=[];if(y.getErrorNumber()==303){r.currentItem=0;var z=y.selectNodes('Connector/Errors/Error'),A=y.selectNodes('Connector/UnzippedFiles/File'),B=0,C;for(var D=0,E=z.length;D<E;D++){C='skip';if(z[D].getAttribute('code')==115){B=1;C=null;}r.filesList[D]={name:z[D].getAttribute('name'),options:C,type:z[D].getAttribute('type'),code:z[D].getAttribute('code')};}for(var F=0,E=A.length;F<E;F++,D++)r.filesList[D]={name:A[F].getAttribute('name'),options:A[F].getAttribute('action'),type:'File',code:0};if(B){t.openDialog('unzipFileExists',r.nI);return;}}else if(y.checkError())return;var G=y.selectNodes('Connector/FolderExists/Folder');if(G&&G.length){t.openDialog('unzipDirExists',function(J){J.show();var K=t.lang.FolderNameExists;K='<strong>'+K.replace('%s',G[0].getAttribute('name'))+'</strong>';J.getContentElement('tab1','msg').getElement().setHtml(K);});return;}var A=y.selectNodes('Connector/UnzippedFiles/File');if(A&&A.length){var H=[];for(var D=0,I=A.length;D<I;D++){if(A[D].getAttribute('action')=='skip')H.push(A[D].getAttribute('name'));}if(r.filesList)for(var D=0,I=r.filesList.length;D<I;D++)H.push(r.filesList[D].name);if(H.length){t.openSkippedFilesDialog(null,H,u.extractSuccess);r.ma(t.getSelectedFolder());return true;}}t.openMsgDialog('OK',u.extractSuccess);r.ma(t.getSelectedFolder());return true;},x.folder.type,x.folder);},extractHere:function(v,w){if(w){var x=false;for(var y=0,z=r.filesList.length;y<z;y++){if(r.filesList[y].code==115&&r.filesList[y].options!='skip'){x=true;w={};for(var y=0,z=r.filesList.length;y<z;y++){w['files['+y+'][name]']=r.filesList[y].name;w['files['+y+'][options]']=r.filesList[y].options;}break;}}if(!x){var A=[];for(var y=0,z=r.filesList.length;y<z;y++)A.push(r.filesList[y].name);t.openSkippedFilesDialog(null,A,u.extractSuccess,function(){r.ma(t.getSelectedFolder());return true;});return;}}w=w||{};r.extract({action:'ExtractHere',file:v,extra:w});},extractTo:function(v,w){if(w){r.extract({action:'ExtractTo',file:v,extra:{extractDir:r.extractDir||'/',force:w}});return;}t.openInputDialog(t.lang.DestinationFolder,t.lang.FolderRename,'',function(x){var y=t.getSelectedFolder(),x=CKFinder.tools.trim(x),z=r.oc(x);if(z){t.openConfirmDialog('',z,function(A){r.extractTo(v,w);});return false;}r.extractDir=x;if(!y.hasChildren){y.createNewFolder(x);r.extract({action:'ExtractTo',file:v,extra:{extractDir:x}});}else y.getChildren(function(A){if(!s(x,A))r.extract({action:'ExtractTo',file:v,extra:{extractDir:x}});else{t.openDialog('unzipDirExists',function(B){B.show();var C=t.lang.ErrorMsg.FolderExists;C='<strong>'+C.replace('%s',x)+'</strong>';B.getContentElement('tab1','msg').getElement().setHtml(C);});return;}},true);});},downloadZip:function(v,w,x){var y=t.connector.composeUrl('DownloadZip',{FileName:v,ZipName:w},x.type,x);t.connector.app.ld['filesview.filesview'].tools.downloadFile(new CKFinder.dom.document(t.document),y);},oH:function(v,w){t.connector.sendCommandPost('CreateZip',null,w,function(x){if(x.checkError())return;if(w.download){var y=x.selectSingleNode('Connector/ZipFile');if(y){var y=y.getAttribute('name');return r.downloadZip(y,w.zipName,v);}}r.ma(v);},v.type,v);},nX:function(v,w,x,y){var z={zipName:v.name+'.zip',download:w};if(y)for(var A=0,B=y.length;A<B;A++){z['files['+A+'][name]']=y[A].name;z['files['+A+'][type]']=y[A].folder.type;z['files['+A+'][folder]']=y[A].folder.getPath();}if(x){z=r.pp;z.fileExistsAction=x;return r.oH(v,z);}if(v.isBasket||w){if(v.isBasket&&typeof y==='undefined'){z.zipName='basket.zip';for(var A=0,B=t.basketFiles.length;A<B;A++){z['files['+A+'][name]']=t.basketFiles[A].name;z['files['+A+'][type]']=t.basketFiles[A].folder.type;z['files['+A+'][folder]']=t.basketFiles[A].folder.getPath();}}if(v.isBasket){v=t.folders[1];z.basket=true;}return r.oH(v,z);}else t.openDialog('compressToFileName',function(C){C.show();C.getContentElement('tab1','fileName').getElement().setValue(v.name);C.on('ok',function(D){D.removeListener();var E=C.getValueOf('tab1','fileName');E=CKFinder.tools.trim(E)+'.zip';var F=r.oc(E);if(F){t.openConfirmDialog('',F,function(G){r.nX(v,w);});return false;}else{z.zipName=E;v.getFiles(function(G){if(s(E,G)){r.pp=z;t.openDialog('compressFileExists',function(H){H.show();var I=t.lang.ErrorMsg.FileExists;I='<strong>'+I.replace('%s',E)+'</strong>';H.getContentElement('tab1','msg').getElement().setHtml(I);});return false;}else r.oH(v,z);},true);}});});}};t.addFileContextMenuOption(r.iG.extractHere,function(v,w){r.extractHere(w);},function(v){var w=t.getSelectedFolder();if(w.isBasket)return false;var x=t.getSelectedFiles();if(v.ext.toLowerCase()!=='zip'||t.config.selectMultiple&&x.length>1)return false;return v.folder.acl.fileUpload&&v.folder.acl.folderCreate?true: -1;});t.addFileContextMenuOption(r.iG.extractTo,function(v,w){r.extractTo(w);},function(v){var w=t.getSelectedFolder();if(w.isBasket)return false;var x=t.getSelectedFiles();if(v.ext.toLowerCase()!=='zip'||t.config.selectMultiple&&x.length>1)return false;return v.folder.acl.fileUpload&&v.folder.acl.folderCreate?true: -1;});t.addFileContextMenuOption(r.iG.compressZip,function(v,w){var x=v.getSelectedFiles(),y=v.getSelectedFolder();r.nX(y,false,false,x);},function(v){var w=t.getSelectedFolder();if(w.isBasket)return false;var x=t.getSelectedFiles();if(!t.config.selectMultiple||x.length<2)return false;return v.folder.acl.fileUpload&&v.folder.acl.folderCreate&&w.getResourceType().isExtensionAllowed('zip')?true: -1;});t.addFileContextMenuOption(r.iG.downloadZip,function(v,w){var x=v.getSelectedFiles(),y=v.getSelectedFolder();r.nX(y,true,false,x);},function(v){var w=t.getSelectedFiles();if(!t.config.selectMultiple||w.length<2)return false;return v.folder.acl.fileUpload?true: -1;});t.addFolderContextMenuOption(r.iG.compressZip,function(v,w){r.nX(w,false);},function(v){if(v.isBasket)return false;return v.acl.fileUpload&&v.getResourceType().isExtensionAllowed('zip')&&(t.files.length||v.hasChildren)?true: -1;});t.addFolderContextMenuOption(r.iG.downloadZip,function(v,w){r.nX(w,true);},function(v){if(v.isBasket)return v.app.basketFiles.length?true: -1;return v.acl.fileUpload&&(t.files.length||v.hasChildren)?true: -1;});t.connector.app.ld['filesview.filesview'].on('beforeContextMenu',function(v){if(t.getSelectedFiles().length>1)delete v.data.bj.downloadFile;});},basketToolbar:[['DownloadZip',{label:'downloadZipLabel',icon:CKFinder.getPluginPath('zip')+'images/zip.gif',onClick:function(t){var u=t.getSelectedFolder();u.app.basketFiles.length&&r.nX(u,true);},disableEmpty:true}]]});function s(t,u){for(var v=0,w=u.length;v<w;v++){if(u[v].name&&u[v].name===t)return true;}return false;};})();a.skins.add('kama',(function(){var r=['images/loaders/16x16.gif','images/loaders/32x32.gif','images/ckffolder.gif','images/ckffolderopened.gif'];if(i&&h.version<7)r.push('images/sprites_ie6.png');return{ls:r,application:{css:['app.css']},host:{qx:1,css:['host.css']},mA:7,kN:7,ps:1,bz:function(s){if(s.config.width&& !isNaN(s.config.width))s.config.width-=12;var t=[],u='/* UI Color Support */.cke_skin_kama .cke_menuitem .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{\tbackground-color: transparent !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuseparator{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{\tbackground-color: $color !important;}';if(h.webkit){u=u.split('}').slice(0,-1);for(var v=0;v<u.length;v++)u[v]=u[v].split('{');}function w(z){var A=z.getHead().append('style');A.setAttribute('id','cke_ui_color');A.setAttribute('type','text/css');return A;};function x(z,A,B){var C,D,E;for(var F=0;F<z.length;F++){if(h.webkit){for(D=0;D<z[F].$.sheet.rules.length;D++)z[F].$.sheet.removeRule(D);for(D=0;D<A.length;D++){E=A[D][1];for(C=0;C<B.length;C++)E=E.replace(B[C][0],B[C][1]);z[F].$.sheet.addRule(A[D][0],E);}}else{E=A;for(C=0;C<B.length;C++)E=E.replace(B[C][0],B[C][1]);if(i)z[F].$.styleSheet.cssText=E;else z[F].setHtml(E);}}};var y=/\$color/g;k.extend(s,{uiColor:null,rk:function(){return this.uiColor;},setUiColor:function(z){var A,B,C=w(a.oC),D=w(this.document),E='.cke_'+s.name.replace('.','\\.'),F=[E+' .cke_wrapper',E+'_dialog .cke_dialog_contents',E+'_dialog a.cke_dialog_tab',E+'_dialog .cke_dialog_footer'].join(','),G='background-color: $color !important;';if(h.webkit){A=[[F,G]];B=[['body,'+F,G]];}else{A=F+'{'+G+'}';B='body,'+F+'{'+G+'}';}return(this.setUiColor=function(H){var I=[[y,H]];s.uiColor=H;x([C],A,I);x([D],B,I);x(t,u,I);})(z);}});s.on('menuShow',function(z){var A=z.data[0],B=A.element.eG('iframe').getItem(0).getFrameDocument();if(!B.getById('cke_ui_color')){var C=w(B);t.push(C);var D=s.rk();if(D)x([C],u,[[y,D]]);}});if(s.config.uiColor)s.on('uiReady',function(){s.setUiColor(s.config.uiColor);});}};})());(function(){a.dialog?r():a.on('dialogPluginReady',r);function r(){a.dialog.on('resize',function(s){var t=s.data,u=t.width,v=t.height,w=t.dialog,x=w.bO.contents;if(t.skin!='kama')return;x.setStyles({width:u+'px',height:v+'px'});setTimeout(function(){var y=w.bO.dialog.getChild([0,0,0]),z=y.getChild(0),A=y.getChild(2);A.setStyle('width',z.$.offsetWidth+'px');A=y.getChild(7);A.setStyle('width',z.$.offsetWidth-28+'px');A=y.getChild(4);A.setStyle('height',z.$.offsetHeight-31-14+'px');A=y.getChild(5);A.setStyle('height',z.$.offsetHeight-31-14+'px');},100);});};})();a.skins.add('v1',(function(){var r=['images/loaders/16x16.gif','images/loaders/32x32.gif','images/ckffolder.gif','images/ckffolderopened.gif'];if(i&&h.version<7)r.push('images/sprites_ie6.png');return{ls:r,application:{css:['app.css']},ps:1,rv: -8,kN:0,host:{qx:1,css:['host.css']}};})());(function(){a.dialog?r():a.on('dialogPluginReady',r);function r(){a.dialog.on('resize',function(s){var t=s.data,u=t.width,v=t.height,w=t.dialog,x=w.bO.contents;if(t.skin!='v1')return;x.setStyles({width:u+'px',height:v+'px'});setTimeout(function(){var y=w.bO.dialog.getChild([0,0,0]),z=y.getChild(0),A=y.getChild(2);A.setStyle('width',z.$.offsetWidth+'px');A=y.getChild(7);A.setStyle('width',z.$.offsetWidth-28+'px');A=y.getChild(4);A.setStyle('height',z.$.offsetHeight-31-14+'px');A=y.getChild(5);A.setStyle('height',z.$.offsetHeight-31-14+'px');},100);});};})();a.gc.add('default',(function(){return{dQ:function(r){var s=r.name,t=r.element,u=r.ff;if(!t||u==a.kZ)return;r.layout=new a.application.layout(r);var v=r.oW('themeSpace',{space:'head',html:''}),w=r.oW('themeSpace',{space:'sidebar',html:''}),x=r.oW('themeSpace',{space:'mainTop',html:''}),y=r.oW('themeSpace',{space:'mainMiddle',html:''}),z=r.oW('themeSpace',{space:'mainBottom',html:''}),A=r.config.skin.indexOf(','),B=(A== -1?r.config.skin:r.config.skin.substr(0,A))||'kama',C='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html lang="'+r.lang.LangCode+'" dir="'+r.lang.dir+'">'+'<head>'+'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'+v.html+'</head>'+'<body>'+(h.ie6Compat?'<div id="ckfinder" role="application">':'<div id="ckfinder" role="application" style="visibility: hidden">')+'<!-- 1. CKE Skin class. -->'+'<div class="fake_wrapper cke_skin_'+B+'">'+'<!-- 2. High contrast class. -->'+'<div class="fake_wrapper"><!-- Applicable: hc cke_hc -->'+'<!-- 3. Browser class. -->'+'<div class="fake_wrapper '+h.cssClass+'">'+'<!-- 4. RTL class. -->'+'<div class="fake_wrapper cke_'+(r.lang.dir=='ltr'||i&&h.version<8?'ltr':'rtl')+'"><!-- Applicable: rtl cke_rtl -->'+'<!-- 5. Layout class. -->'+'<div class="fake_wrapper">'+'<div id="ckfinder_view" class="columns_2"><!-- Applicable: columns_1 columns_2 -->'+'<div id="sidebar_container" class="container" role="region"'+(r.config.sidebarWidth?' style="width: '+k.cssLength(r.config.sidebarWidth)+'"':'')+'>'+'<div id="sidebar_wrapper" class="wrapper">'+w.html+'</div>'+'</div>'+'<div id="main_container" class="container" role="region">'+x.html+y.html+z.html+'</div>'+'</div>'+'</div>'+'</div>'+'</div>'+'</div>'+'</div>'+'</div>'+'</body>'+'</html>';a.log('[THEME] DOM flush using document.write');r.document.$.write(C);function D(){if(h.ie6Compat)r.layout.oG=r.document.getWindow().eR();};r.cr('themeLoaded');r.cr('uiReady',function(){D();r.cr('appReady',function(){D();if(h.ie8){var E=r.document.$,F;if(E.documentMode)F=E.documentMode;else{F=5;if(E.compatMode)if(E.compatMode=='CSS1Compat')F=7;}if(F<8){var G='<strong style="color: red;">Forced IE compatibility mode! CKFinder may not look as intended.</strong>',H=r.plugins.tools;H.showTool(H.addTool(G));}}if(h.ie6Compat)r.document.getWindow().on('resize',D);r.document.getWindow().on('resize',function(){r.layout.ea.call(r.layout);});var I;function J(){I=I||r.document.getHead().eG('link').getItem(0);var K=0;if(I)try{if(I.$.sheet&&I.$.sheet.cssRules.length>0)K=1;else if(I.$.styleSheet&&I.$.styleSheet.cssText.length>0)K=1;else if(I.$.innerHTML&&I.$.innerHTML.length>0)K=1;}catch(L){}if(!K){window.setTimeout(J,250);return;}if(h.ie6Compat){D();r.layout.ea();setTimeout(function(){r.layout.ea();},500);}else{r.layout.ea(true);setTimeout(function(){r.document.getById('ckfinder').removeStyle('visibility');});}return undefined;};J();});});},pu:function(r){var s=k.getNextNumber(),t=m.kE(['<div class="cke_compatibility cke_'+r.name.replace('.','\\.')+'_dialog cke_skin_',r.gd,'" dir="',r.lang.dir,'" lang="',r.langCode,'"><table class="cke_dialog',' '+h.cssClass.replace(/browser/g,'cke_browser'),' cke_',r.lang.dir,'" style="position:absolute"><tr><td><div class="%body"><div id="%title#" class="%title"></div><div id="%close_button#" class="%close_button"><span>X</span></div><div id="%tabs#" class="%tabs"></div><table class="%contents"><tr><td id="%contents#" class="%contents"></td></tr></table><div id="%footer#" class="%footer"></div></div><div id="%tl#" class="%tl"></div><div id="%tc#" class="%tc"></div><div id="%tr#" class="%tr"></div><div id="%ml#" class="%ml"></div><div id="%mr#" class="%mr"></div><div id="%bl#" class="%bl"></div><div id="%bc#" class="%bc"></div><div id="%br#" class="%br"></div></td></tr></table>',i?'':'<style>.cke_dialog{visibility:hidden;}</style>','</div>'].join('').replace(/#/g,'_'+s).replace(/%/g,'cke_dialog_'),a.document),u=t.getChild([0,0,0,0,0]),v=u.getChild(0),w=u.getChild(1);v.unselectable();w.unselectable();return{element:t,bO:{dialog:t.getChild(0),title:v,close:w,tabs:u.getChild(2),contents:u.getChild([3,0,0,0]),footer:u.getChild(4)}};},destroy:function(r){var s=r.container,t=r.ia;s&&s.remove();for(var u=0;t&&u<t.length;u++)t[u].remove();if(r.element){r.ff==a.fc&&r.element.remove();delete r.element;}}};})());a.application.prototype.vU=function(r){var s=''+r,t=this._[s]||(this._[s]=a.document.getById(s+'_'+this.name));return t;};a.application.prototype.nJ=function(r){var s=/^\d+$/;if(s.test(r))r+='px';var t=this.layout.dV();t.setStyle('width',r);this.oW('resize');this.layout.ea();};a.application.prototype.resize=function(r,s){this.element.getChild(0).setStyle('height',s+'px');this.element.getChild(0).setStyle('width',r+'px');};(function(){var r="\x20",s="\x20",t="\x20",u="\x20";function v(x,y){var z=0,A=0;for(var B=0;B<x.$.parentNode.childNodes.length;B++){var C=x.$.parentNode.childNodes[B];if(C.nodeType==1){var D=C==x.$;if(!C.offsetHeight&& !D)continue;A++;if(!D)z+=C.offsetHeight;}}var E=x.$.offsetHeight-x.$.clientHeight,F=(A-1)*y;if(h.ie6Compat&& !h.ie8&& !h.ie7Compat)F+=y*2;var G=i?x.$.parentNode.parentNode.parentNode.offsetHeight:x.$.parentNode.offsetHeight,H=G-E-z-(F||0);try{x.setStyle('height',H+'px');}catch(I){}};function w(x){return a.bs.substr(x*9%(2<<4),1);};a.application.layout=function(x){this.app=t.length?x:null;this.jB=null;};a.application.layout.prototype={ea:function(x){if(this.jB)return;this.jB=k.setTimeout(function(){a.log('[THEME] Repainting layout');var y=a.bs.indexOf(a.bF.substr(1,1))%5,z=[a.bF.substr(8,1),a.bF.substr(6,1)],A=a.bF&&a.bF.substr(3,1)!=a.bs.substr((a.bs.indexOf(a.bF.substr(0,1))+a.bs.indexOf(a.bF.substr(2,1)))*9%(a.bs.length-1),1),B= ! !a.ed&&z[1]!=w(a.ed.length+a.bs.indexOf(z[0]));if(a.bF&&1==y&&a.lS(window.top[a.nd+"\143\141\x74\151\x6f\156"][a.jG+"\x73\x74"])!=a.lS(a.ed)||y==4||A){var C=this.dV().getChild(0).getChildren(),D=0;for(var E=0;E<C.count();E++){if(C.getItem(E).rd("\x70\157\163\151\x74\151\157\156")=="\163\x74\141\x74\x69\x63")D=1;}if(!D)this.dV().getChild(0).appendHtml(A||B||y!=4?t:u+"\x3c\x62\x3e"+k.htmlEncode(a.ed)+"\x3c\x2f\142\x3e\074\057\x64\151\x76\076");}var F=this.pn(),G=this.pS(),H=a.skins.loaded[this.app.gd];if(H.ps&&i&&h.ie6Compat&& !h.ie8){var I=this.mB(),J=this.dV(),K=3*H.kN,L=H.rv?H.rv:0,M=this.oG.width-J.$.offsetWidth-K+L;I.setStyle('width',M+'px');}if(F)v(F,H.mA);if(G)v(G,H.kN);this.jB=null;x=false;this.app.oW('afterRepaintLayout');if(h.ie6Compat)k.setTimeout(function(){this.app.element.$.style.cssText+='';},0,this);},x===true?0:500,this);},dV:function(){var x=this;if(!x.kS)x.kS=x.app.document.getById('sidebar_container');return x.kS;},mB:function(){var x=this;if(!x.lb)x.lb=x.app.document.getById('main_container');return x.lb;},pS:function(){var x=this;if(typeof x.kK==='undefined')x.kK=x.app.document.getById('folders_view');return x.kK;},pn:function(){var x=this;if(typeof x.kD==='undefined')x.kD=x.app.document.getById('files_view');return x.kD;}};})();})(); 
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckfinder/ckfinder_v1.js b/src/main/webapp/plug-in/ckfinder/ckfinder_v1.js
    new file mode 100644
    index 00000000..5944bbfa
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/ckfinder_v1.js
    @@ -0,0 +1,8 @@
    +锘/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +
    +(function(){window.CKFinder=function(a,b,c,d){var e=this;e.BasePath=a||CKFinder.DEFAULT_BASEPATH;e.Width=b||'100%';e.Height=c||400;e.SelectFunction=d||null;e.SelectFunctionData=null;e.SelectThumbnailFunction=d||null;e.SelectThumbnailFunctionData=null;e.DisableThumbnailSelection=false;e.ClassName='CKFinderFrame';e.StartupPath=null;e.StartupFolderExpanded=false;e.RememberLastFolder=true;e.ResourceType=null;e.Id=null;e.Skin=null;};CKFinder.DEFAULT_BASEPATH='/ckfinder/';CKFinder.ConnectorLanguage='java';CKFinder._={instanceConfig:[]};(function(){function a(b){var c=1;while(CKFinder._.instanceConfig[c])c++;CKFinder._.instanceConfig[c]=b;return c;};CKFinder.prototype={Create:function(){document.write(this.CreateHtml());},CreateHtml:function(){var d=this;var b=d.ClassName;if(b&&b.length>0)b=' class="'+b+'"';var c=d.Id;if(c&&c.length>0)c=' id="'+c+'"';return '<iframe src="'+d._BuildUrl()+'" width="'+d.Width+'" '+'height="'+d.Height+'"'+b+c+' frameborder="0" scrolling="no"></iframe>';},Popup:function(b,c){b=b||'80%';c=c||'70%';if(typeof b=='string'&&b.length>1&&b.substr(b.length-1,1)=='%')b=parseInt(window.screen.width*parseInt(b,10)/100,10);if(typeof c=='string'&&c.length>1&&c.substr(c.length-1,1)=='%')c=parseInt(window.screen.height*parseInt(c,10)/100,10);if(b<200)b=200;if(c<200)c=200;var d=parseInt((window.screen.height-c)/2,10),e=parseInt((window.screen.width-b)/2,10),f='location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,width='+b+',height='+c+',top='+d+',left='+e,g=window.open('','CKFinderPopup',f,true);if(!g)return false;var h=this._BuildUrl().replace(/&amp;/g,'&');try{g.moveTo(e,d);g.resizeTo(b,c);g.focus();g.location.href=h;}catch(i){g=window.open(h,'CKFinderPopup',f,true);}return true;},_BuildUrl:function(b){var e=this;b=b||e.BasePath;var c='';if(!b||b.length===0)b=CKFinder.DEFAULT_BASEPATH;if(b.substr(b.length-1,1)!='/')b+='/';b+='ckfinder.html';var d;if(e.SelectFunction){d=e.SelectFunction;if(typeof d=='function')d=d.toString().match(/function ([^(]+)/)[1];c+='?action=js&amp;func='+d;}if(e.Skin){c+=c?'&amp;':'?';c+='skin='+encodeURIComponent(e.Skin);}if(e.SelectFunctionData){c+=c?'&amp;':'?';c+='data='+encodeURIComponent(e.SelectFunctionData);}if(e.ResourceType){c+=c?'&amp;':'?';c+='type='+encodeURIComponent(e.ResourceType);}if(e.DisableThumbnailSelection){c+=c?'&amp;':'?';c+='dts=1';}else if(e.SelectThumbnailFunction||e.SelectFunction){d=e.SelectThumbnailFunction||e.SelectFunction;if(typeof d=='function')d=d.toString().match(/function ([^(]+)/)[1];
    +c+=c?'&amp;':'?';c+='thumbFunc='+d;if(e.SelectThumbnailFunctionData)c+='&amp;tdata='+encodeURIComponent(e.SelectThumbnailFunctionData);else if(!e.SelectThumbnailFunction&&e.SelectFunctionData)c+='&amp;tdata='+encodeURIComponent(e.SelectFunctionData);}if(e.StartupPath){c+=c?'&amp;':'?';c+='start='+encodeURIComponent(e.StartupPath+(e.StartupFolderExpanded?':1':':0'));}if(e.RememberLastFolder!==undefined&&!e.RememberLastFolder){c+=c?'&amp;':'?';c+='rlf=0';}if(e.Id){c+=c?'&amp;':'?';c+='id='+encodeURIComponent(e.Id);}return b+c;}};CKFinder.Create=function(b,c,d,e){var f;if(b!==null&&typeof b=='object'){f=new CKFinder();for(var g in b)f[g]=b[g];}else f=new CKFinder(b,c,d,e);f.Create();};CKFinder.Popup=function(b,c,d,e){var f,g;if(b!==null&&typeof b=='object'){g=a(b);f=new CKFinder();for(var h in b)f[h]=b[h];}else f=new CKFinder(b,c,d,e);f.Popup(c,d);};CKFinder.SetupFCKeditor=function(b,c,d,e){var f,g;if(c!==null&&typeof c=='object'){g=a(c);f=new CKFinder();for(var h in c){f[h]=c[h];if(h=='Width'){var i=f[h]||800;if(typeof i=='string'&&i.length>1&&i.substr(i.length-1,1)=='%')i=parseInt(window.screen.width*parseInt(i,10)/100,10);b.Config.LinkBrowserWindowWidth=i;b.Config.ImageBrowserWindowWidth=i;b.Config.FlashBrowserWindowWidth=i;}else if(h=='Height'){var j=f[h]||600;if(typeof j=='string'&&j.length>1&&j.substr(j.length-1,1)=='%')j=parseInt(window.screen.height*parseInt(j,10)/100,10);b.Config.LinkBrowserWindowHeight=j;b.Config.ImageBrowserWindowHeight=j;b.Config.FlashBrowserWindowHeight=j;}}}else f=new CKFinder(c);var k=f.BasePath;if(k.substr(0,1)!='/'&&k.indexOf('://')==-1)k=document.location.pathname.substring(0,document.location.pathname.lastIndexOf('/')+1)+k;k=f._BuildUrl(k);var l=k.indexOf('?')!==-1?'&':'?';if(g){k+=l+'configId='+g;l='&';}b.Config.LinkBrowserURL=k;b.Config.ImageBrowserURL=k+l+'type='+(d||'Images');b.Config.FlashBrowserURL=k+l+'type='+(e||'Flash');var m=k.substring(0,1+k.lastIndexOf('/'));b.Config.LinkUploadURL=m+'core/connector/'+CKFinder.ConnectorLanguage+'/connector.'+CKFinder.ConnectorLanguage+'?command=QuickUpload&type=Files';b.Config.ImageUploadURL=m+'core/connector/'+CKFinder.ConnectorLanguage+'/connector.'+CKFinder.ConnectorLanguage+'?command=QuickUpload&type='+(d||'Images');b.Config.FlashUploadURL=m+'core/connector/'+CKFinder.ConnectorLanguage+'/connector.'+CKFinder.ConnectorLanguage+'?command=QuickUpload&type='+(e||'Flash');};CKFinder.SetupCKEditor=function(b,c,d,e){if(b===null){for(var f in CKEDITOR.instances)CKFinder.SetupCKEditor(CKEDITOR.instances[f],c,d,e);
    +CKEDITOR.on('instanceCreated',function(o){CKFinder.SetupCKEditor(o.editor,c,d,e);});return;}var g,h;if(c!==null&&typeof c=='object'){h=a(c);g=new CKFinder();for(var i in c){g[i]=c[i];if(i=='Width'){var j=g[i]||800;if(typeof j=='string'&&j.length>1&&j.substr(j.length-1,1)=='%')j=parseInt(window.screen.width*parseInt(j,10)/100,10);b.config.filebrowserWindowWidth=j;}else if(i=='Height'){var k=g[i]||600;if(typeof k=='string'&&k.length>1&&k.substr(k.length-1,1)=='%')k=parseInt(window.screen.height*parseInt(k,10)/100,10);b.config.filebrowserWindowHeight=k;}}}else g=new CKFinder(c);var l=g.BasePath;if(l.substr(0,1)!='/'&&l.indexOf('://')==-1)l=document.location.pathname.substring(0,document.location.pathname.lastIndexOf('/')+1)+l;l=g._BuildUrl(l);var m=l.indexOf('?')!==-1?'&':'?';if(h){l+=m+'configId='+h;m='&';}b.config.filebrowserBrowseUrl=l;b.config.filebrowserImageBrowseUrl=l+m+'type='+(d||'Images');b.config.filebrowserFlashBrowseUrl=l+m+'type='+(e||'Flash');var n=l.substring(0,1+l.lastIndexOf('/'));b.config.filebrowserUploadUrl=n+'core/connector/'+CKFinder.ConnectorLanguage+'/connector.'+CKFinder.ConnectorLanguage+'?command=QuickUpload&type=Files';b.config.filebrowserImageUploadUrl=n+'core/connector/'+CKFinder.ConnectorLanguage+'/connector.'+CKFinder.ConnectorLanguage+'?command=QuickUpload&type='+(d||'Images');b.config.filebrowserFlashUploadUrl=n+'core/connector/'+CKFinder.ConnectorLanguage+'/connector.'+CKFinder.ConnectorLanguage+'?command=QuickUpload&type='+(e||'Flash');};})();})();
    diff --git a/src/main/webapp/plug-in/ckfinder/config.js b/src/main/webapp/plug-in/ckfinder/config.js
    new file mode 100644
    index 00000000..75a86230
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/config.js
    @@ -0,0 +1,18 @@
    +锘/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    +*/
    +
    +CKFinder.customConfig = function( config )
    +{
    +	// Define changes to default configuration here.
    +	// For the list of available options, check:
    +	// http://docs.cksource.com/ckfinder_2.x_api/symbols/CKFinder.config.html
    +
    +	// Sample configuration options:
    +	// config.uiColor = '#BDE31E';
    +	// config.language = 'fr';
    +	// config.removePlugins = 'basket';
    +	config.skin = 'kama';
    +
    +};
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/001.html b/src/main/webapp/plug-in/ckfinder/help/en/files/001.html
    new file mode 100644
    index 00000000..9f8960f5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/001.html
    @@ -0,0 +1,30 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Welcome to CKFinder</h1>
    +	<p>
    +		<strong>CKFinder is a file manager</strong> that can help you browse,
    +		upload, and manage files located on a web server &mdash; directly from your
    +		Internet browser and without the need to install anything on your computer.</p>
    +	<p>
    +		Due to its application in a distributed environment, CKFinder can be described
    +		as <em>collaborative software</em> that makes it easy to maintain and share files
    +		located on a central computer (the <em>server</em>).</p>
    +	<p>
    +		Whether you are new to CKFinder or an experienced user, it is well worth spending
    +		some time browsing through the CKFinder documentation in order to gain full
    +		understanding of the ins and outs of this simple yet powerful tool.</p>
    +	<h2>
    +		Legal Notices</h2>
    +	<p>
    +		Please see the <a href="011.html" title="Link to Legal Notices">"Legal Notices"</a>
    +		for some important copyright information.</p>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/002.html b/src/main/webapp/plug-in/ckfinder/help/en/files/002.html
    new file mode 100644
    index 00000000..d87bf2d6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/002.html
    @@ -0,0 +1,41 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		CKFinder Interface Overview</h1>
    +	<p>
    +		The CKFinder interface is designed to be clean, familiar to end users, and easy to
    +		learn and use. Most features can be handled with a mouse click as well as by using
    +		the context menus.</p>
    +	<p>
    +		If you are familiar with desktop file browsers built in most operating systems
    +		available for your PC or laptop, you will quickly see that using an online file
    +		manager is just as easy and intuitive.</p>
    +	<p>
    +		The following is a screenshot of the CKFinder interface:</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_interface.png" alt="CKFinder interface" width="620" height="456" />&nbsp;</p>
    +	<ol>
    +		<li><strong><a href="003.html">Folders Pane</a></strong> &ndash; contains the "tree view"
    +			of the folders that you can navigate. Folders are used to organize and categorize your
    +			files.</li>
    +		<li><strong><a href="004.html">Files Pane</a></strong> &ndash; lists the files available
    +			in the selected folder.</li>
    +		<li><strong><a href="005.html">Toolbar</a></strong> &ndash; a series of buttons that can
    +			be clicked in order to quickly execute specific file browser functions.</li>
    +		<li><strong><a href="010.html">Status Bar</a></strong> &ndash; the section at the bottom
    +			of the interface that displays some information about the selected file, the total
    +			number of files in the folder, etc.</li>
    +		<li><strong><a href="012.html">Context Menu</a></strong> &ndash; a popup menu with file
    +			browser commands that execute specific tasks for the object that was selected. Options
    +			available in the context menu change dynamically depending on the object that is
    +			clicked. </li>
    +	</ol>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/003.html b/src/main/webapp/plug-in/ckfinder/help/en/files/003.html
    new file mode 100644
    index 00000000..0f5893da
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/003.html
    @@ -0,0 +1,145 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Folders Pane</h1>
    +	<p>
    +		The <strong>Folders Pane</strong> contains the "tree view" of the folders that you can navigate.
    +		Folders are used to organize and categorize your files.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_folder_pane.png" width="176" height="140" alt="CKFinder Folders Pane" />&nbsp;</p>
    +	<p>
    +		Folders display is called "tree view" because the folders hierarchy is represented like
    +		tree branches, with subfolders placed below and indented with regard to their parent items.
    +		The <strong>Folders Pane</strong> uses the same graphic representation that can be found
    +		in many modern operating systems.</p>
    +	<h2>
    +		Basic Operations</h2>
    +	<h3>
    +		Opening (Expanding) a Folder</h3>
    +	<p>
    +		In order to open a folder and expand its subfolders, click the plus icon
    +		(<img src="../../files/images/002.gif" height="9" width="9" alt="" />) in front of the folder name. If the plus
    +		icon is not present, the folder does not contain any subfolders.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_folder_expand.png" width="110" height="19" alt="Collapsed CKFinder folder" />&nbsp;</p>
    +	<p>
    +		See the "On Request Loading" section below if you require more information about the loading
    +		process in CKFinder.</p>
    +	<h3>
    +		Closing (Collapsing) a Folder</h3>
    +	<p>
    +		In order to close a folder and hide (collapse) its subfolders, click the minus icon
    +		(<img src="../../files/images/003.gif" height="9" width="9" alt="" />) in front of the folder name.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_folder_collapse.png" width="110" height="50" alt="Expanded CKFinder folder with its subfolders" />&nbsp;</p>
    +	<h3>
    +		Selecting a Folder</h3>
    +	<p>
    +		In order to select a folder and make it the "current folder" in CKFinder, click the folder
    +		name or its icon. The selected folder will be highlighted with a different background
    +		color.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_folder_select.png" width="162" height="99" alt="Selected CKFinder folder" />&nbsp;</p>
    +	<h2>
    +		Advanced Operations</h2>
    +	<p>
    +		Advanced operations can be performed on a folder by using its <strong><a href="012.html">Context
    +		Menu</a></strong>. Depending on the circumstances, the following options may be available:</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_folder_menu.png" width="148" height="128" alt="Folder context menu" />&nbsp;</p>
    +	<ul>
    +		<li><strong>New Subfolder</strong> &ndash; creates a new subfolder in this parent folder.</li>
    +		<li><strong>Rename</strong> &ndash; changes the name of the folder.</li>
    +		<li><strong>Copy Files from Basket</strong> &ndash; copies the files that were placed in the
    +			<strong>Basket</strong> to the selected folder.</li>
    +		<li><strong>Move Files from Basket</strong> &ndash; moves the files that were placed in the
    +			<strong>Basket</strong> to the selected folder.</li>
    +		<li><strong>Delete</strong> &ndash; permanently removes the folder.</li>
    +	</ul>
    +	<p>
    +		<span class="info">Note:</span> Some context menu options may be disabled (and thus
    +		grayed out), depending on CKFinder settings enforced by your system administrator.</p>
    +	<h3>
    +		Creating Folders</h3>
    +	<p>
    +		In order to create a child folder inside an existing folder, choose the
    +		<strong>New Subfolder</strong> option from the context menu of the parent folder.
    +		Type the name of the new folder in the dialog window that will be displayed. Once
    +		you give the new folder a name and close the dialog window, the folder will
    +		be created.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_folder_new.png" width="304" height="149" alt="Creating a new folder in CKFinder" />&nbsp;</p>
    +	<p>
    +		Not all characters can be used in folder and file names due to limitations of the
    +		systems where CKFinder runs. Among the characters that cannot be used in folders and
    +		files names are: <code>\</code> <code>/</code> <code>:</code>
    +		<code>*</code> <code>?</code> <code>&quot;</code> <code>&lt;</code>
    +		<code>&gt;</code> and <code>|</code>.</p>
    +	<h3>
    +		Renaming Folders</h3>
    +	<p>
    +		In order to rename a folder, choose the <strong>Rename</strong> option from its context menu
    +		or use the <em>F2</em> keyboard shortcut. Type the new folder name in the dialog window that
    +		will be displayed, overwriting the existing name. Once you enter the new folder name and
    +		close the dialog window, the folder will be renamed.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_folder_rename.png" width="304" height="149" alt="Renaming a folder in CKFinder" />&nbsp;</p>
    +	<p>
    +		As stated above, not all characters can be used in folder and file names due to limitations of the
    +		systems where CKFinder runs. Among the characters that cannot be used in folders and
    +		files names are: <code>\</code> <code>/</code> <code>:</code>
    +		<code>*</code> <code>?</code> <code>&quot;</code> <code>&lt;</code>
    +		<code>&gt;</code> and <code>|</code>.</p>
    +	<p>
    +		<span class="warning">Attention:</span> When you rename a folder, links or media insertions
    +		available on other pages and pointing to files or folders inside the renamed folder
    +		will be broken, and thus not available anymore. Because of that be careful when using this
    +		feature.</p>
    +	<h3>
    +		Copying and Moving Files from Basket</h3>
    +	<p>
    +		The <strong>Basket</strong> is a virtual placeholder that can be
    +		helpful if you want to perform batch operations on files. The copying and moving
    +		operations are described in the <strong><a href="014.html">"Basket"</a></strong> section
    +		of the User's Guide.</p>
    +	<h3>
    +		Deleting Folders</h3>
    +	<p>
    +		In order to delete a folder, including all its contents, choose the <strong>Delete</strong>
    +		option from its context menu or use the <em>Del</em> key. A confirmation message will appear
    +		to ensure that this operation is what you really intend to do. Once you confirm the deletion,
    +		the folder will be removed.</p>
    +	<p>
    +		<span class="warning">Attention:</span> This operation cannot be undone. Once you delete the
    +		folder and its contents, you will not be able to restore the removed files.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_folder_delete.png" width="304" height="149" alt="Deleting a folder in CKFinder" />&nbsp;</p>
    +	<p>
    +		<span class="warning">Attention:</span> When you delete a folder, links or media insertions
    +		available on other pages and pointing to files or folders inside the deleted folder
    +		will be broken, and thus not available anymore. Because of that be careful when using this
    +		feature.</p>
    +	<h2>
    +		"On Request" Loading</h2>
    +	<p>
    +		The most important difference between CKFinder and the folders tree structures found in
    +		desktop operating systems is that in CKFinder the folders are loaded "on request". It means
    +		that the application does not load the entire folders tree structure at startup, but instead
    +		loads its small subset when the folder is being expanded. This feature is present in
    +		most advanced web applications like CKFinder and allows to save on bandwidth and loading time.</p>
    +	<p>
    +		To indicate that folders are being loaded, the <strong>Loading...</strong> label may appear when
    +		you expand a folder:</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_folder_loading.png" width="143" height="113" alt="Folder loading in CKFinder" />&nbsp;</p>
    +	<p>
    +		The label will automatically disappear once all requested folders are loaded.</p>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/004.html b/src/main/webapp/plug-in/ckfinder/help/en/files/004.html
    new file mode 100644
    index 00000000..33661e1f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/004.html
    @@ -0,0 +1,242 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Files Pane</h1>
    +	<p>
    +		The <strong>Files Pane</strong> lists all files available in the selected folder.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_pane.png" width="451" height="429" alt="CKFinder Files Pane" />&nbsp;</p>
    +	<h2>
    +		Different Views</h2>
    +	<p>
    +		The <strong>Files Pane</strong> may present the files with two different display formats,
    +		depending on CKFinder settings (see "<strong><a href="008.html">Settings</a></strong>").
    +		The following is a comparison of the <strong>Thumbnails</strong> and the <strong>List</strong>
    +		views for the same folder.</p>
    +	<p>
    +		When you configure CKFinder to use the <strong>Thumbnails</strong> view, the files will
    +		be presented as thumbnails (miniature previews or icons), with or without additional
    +		information like file name, size, or date (depending on your settings).</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_view_thumbnails.png" width="531" height="178" alt="CKFinder Files Pane with Thumbnails view" />&nbsp;</p>
    +	<p>
    +		When you configure CKFinder to use the <strong>List</strong> view, the files will
    +		be presented in a list, with or without additional information like file name, size,
    +		or date (depending on your settings).</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_view_list.png" width="564" height="136" alt="CKFinder Files Pane with List view" />&nbsp;</p>
    +	<h2>
    +		Basic Operations</h2>
    +	<h3>
    +		Activating (Selecting) a File with a Mouse</h3>
    +	<p>
    +		In order to activate a file and make it the "current file" in CKFinder, click the file
    +		name or its thumbnail. To make it easier to choose the file, when you hover your mouse
    +		over a file, its background will become highlighted. Once a file is activated, it will be
    +		permanently highlighted with a different background color.</p>
    +	<p>
    +		The figure below presents various states of a file as viewed in a folder: unselected, hovered
    +		with a mouse, and activated (selected).</p>
    +	<table align="center" cellpadding="0" cellspacing="0">
    +		<tr>
    +			<td valign="top" style="padding-right: 10px">
    +				<img src="../../files/images/CKFinder_file_select_unselected.png" width="130" height="166" alt="Unselected file in CKFinder" /></td>
    +			<td valign="top" style="padding-right: 10px; padding-left: 10px">
    +				<img src="../../files/images/CKFinder_file_select_hovered.png" width="130" height="166" alt="Hovered file in CKFinder" /></td>
    +			<td valign="top" style="padding-right: 10px; padding-left: 10px">
    +				<img src="../../files/images/CKFinder_file_select_selected.png" width="130" height="166" alt="Selected file in CKFinder" /></td>
    +		</tr>
    +	</table>
    +	<p>&nbsp;</p>
    +	<p>
    +		In order to deactivate a file, click another one (activating it) or click any empty space inside
    +		the <strong>Files Pane</strong>.</p>
    +	<h3>
    +		Copying a File</h3>
    +	<p>In order to copy a file to a different folder, select it, and drag onto the target folder in the
    +		<strong>Folders Pane</strong>. When you drop it onto a folder name, choose the <strong>
    +		Copy File Here</strong> option from the context menu.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_drag_copy.png" width="130" height="54" alt="Copying a file in CKFinder" />&nbsp;</p>
    +	<p>
    +		The file will be duplicated and its copy will be placed in the target folder. The
    +		source folder will remain untouched.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_copied.png" width="304" height="149" alt="File copied in CKFinder" />&nbsp;</p>
    +	<p>
    +		<span class="info">Note:</span> If the file with the same name already exists in the
    +		target folder, you will be prompted to choose between overwriting it or automatically
    +		renaming the copied file (this is the default option).</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_already_exists.png" width="304" height="190" alt="Error message for a file that already exists in CKFinder" />&nbsp;</p>
    +	<h3>
    +		Moving a File</h3>
    +	<p>In order to move a file to a different folder, select it, and drag onto the target folder
    +		in the <strong>Folders Pane</strong>. When you drop it onto a folder name, choose the
    +		<strong>Move File Here</strong> option from the context menu.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_drag_move.png" width="130" height="54" alt="Moving a file in CKFinder" />&nbsp;</p>
    +	<p>
    +		The file will be removed from the source folder and pasted into the target folder.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_moved.png" width="304" height="149" alt="File moved in CKFinder" />&nbsp;</p>
    +	<h2>
    +		Advanced Operations</h2>
    +	<p>
    +		Advanced operations can be performed on a file by using its <strong><a href="012.html">Context
    +		Menu</a></strong>. Depending on the circumstances, the following options may be available:</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_menu.png" width="130" height="156" alt="File context menu in CKFinder" />&nbsp;</p>
    +	<ul>
    +		<li><strong>Select</strong> &ndash; selects the file.</li>
    +		<li><strong>View</strong> &ndash; displays the full-sized file in a new browser tab or window.</li>
    +		<li><strong>Download</strong> &ndash; downloads the file from the server to your computer.</li>
    +		<li><strong>Resize</strong> &ndash; allows you to modify file size and/or create a new thumbnail.</li>
    +		<li><strong>Rename</strong> &ndash; changes the name of the file.</li>
    +		<li><strong>Delete</strong> &ndash; permanently removes the file.</li>
    +	</ul>
    +	<p>
    +		<span class="info">Note:</span> Some context menu options may be disabled (and thus
    +		grayed out), depending on CKFinder settings enforced by your system administrator.</p>
    +	<h3>
    +		Selecting a File</h3>
    +	<p>
    +		In order to select a file by using the context menu, choose the <strong>Select</strong>
    +		option. Alternatively, you can also perform a double-click on the file with your mouse.</p>
    +	<p>
    +		Depending on the environment where CKFinder is used, the selection operation can, for example,
    +		send the file URL to another application or insert an image directly into an article created
    +		in your CMS system.</p>
    +	<h3>
    +		Viewing (Previewing) a File</h3>
    +	<p>
    +		In order to preview a file in the browser, choose the <strong>View</strong> option from
    +		its context menu. Not all kinds of files can be viewed in browsers, but this feature
    +		is quite useful for images, text, and PDF files. In other cases, the browser will ask
    +		you to open the file with an appropriate application.</p>
    +	<p>
    +		When you attempt to preview an image, CKFinder will display in directly in a lightbox popup.</p>
    +	<h3>
    +		Downloading a File</h3>
    +	<p>
    +		In order to download a file, choose the <strong>Download</strong> option from its context
    +		menu. The browser will ask you for a location on your computer to save the downloaded file.
    +		Depending on your browser and operating system settings, the file might also be opened
    +		immediately after it is downloaded by using an appropriate application of your operating
    +		system.</p>
    +	<h3>
    +		Resizing a File (Image)</h3>
    +	<p>
    +		In order to change the image size or its thumbnail size, choose the <strong>Resize</strong>
    +		option from its context menu. Once you enter new image dimensions or choose a thumbnail size,
    +		close the dialog window to apply the changes.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_resize.png" width="424" height="319" alt="Resizing an image in CKFinder" />&nbsp;</p>
    +	<p>If the image is too big, you can alter its dimensions by entering new values into the
    +		<strong>Width</strong> and <strong>Height</strong> fields. By default the image ratio is locked,
    +		which you can see thanks to the <img src="../../files/images/CKFinder_resize_lock.png" width="7" height="8" alt="Image size ratio locked in CKFinder" />
    +		(<strong>Lock</strong>) button. This means that when you change one of the size values (width
    +		or height), the other one will be adjusted automatically.</p>
    +	<p>If you want to freely modify both dimensions, click the <strong>Lock</strong> button in order to
    +		unlock the ratio. The button will now change to
    +		<img src="../../files/images/CKFinder_resize_unlock.png" width="7" height="10" alt="Image size ratio unlocked in CKFinder" />
    +		(<strong>Unlock</strong>) and modification of one dimension will not automatically cause the
    +		other one to be adjusted. To lock the image ratio again, click the <strong>Unlock</strong> button
    +		once more.</p>
    +	<p>You can easily return to original image size by pressing the
    +		<img src="../../files/images/CKFinder_resize_reset.png" width="11" height="11" alt="Image size ratio reset in CKFinder" />
    +		(<strong>Reset Size</strong>) button. This will reset the image size; the original width and height
    +		will now appear in appropriate text boxes.</p>
    +	<p>
    +		If you resize the image, you can decide to save it under the same name, overwriting the
    +		existing file. Please note that this operation cannot be undone and once you save the file with its
    +		modified dimensions, you will not be able to restore the original size. In order to overwrite the
    +		original image, leave the <strong>Create a new image</strong> checkbox unselected.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_resize_overwrite.png" width="424" height="319" alt="Overwriting a resized image in CKFinder" />&nbsp;</p>
    +	<p>
    +		You can also decide to save the resized image in a new file and leave the original as is. If you
    +		select the <strong>Create a new image</strong> checkbox, you will be able to give the modified
    +		file a new name. By default CKFinder suggests to save the image under the name that is built from
    +		the original file name and new file dimensions (for example: <code>Sun1_100x100.jpg</code> when the
    +		original file was named <code>Sun1.jpg</code> and the file was resized to 100 pixels wide and 100
    +		pixels high).</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_resize_new.png" width="424" height="319" alt="Creating a new resized image in CKFinder" />&nbsp;</p>
    +	<p>
    +		When you are ready with your changes, click the <strong>OK</strong> button to close the dialog
    +		window. On successful resizing a confirmation message will be displayed.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_resize_resized.png" width="304" height="149" alt="File resized in CKFinder" />&nbsp;</p>
    +	<p>
    +		If you saved the resized image in a new file, you will see both files appear inside the folder.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_resize_both.png" width="268" height="170" alt="Original and resized file in CKFinder" />&nbsp;</p>
    +	<p>
    +		<span class="info">Note:</span> The size of the original image may limit the options available for
    +		the <strong>Resize</strong> feature. The modified image size cannot exceed the original dimensions.
    +		</p>
    +	<h3>
    +		Generating Thumbnails</h3>
    +	<p>
    +		The <strong>Resize</strong> feature can also be used in order to generate resized copies of
    +		images (thumbnails) that you can use in articles on your website or in blog posts. Thanks to
    +		the thumbnail resizing feature the site administrator can set predefined thumbnail size
    +		options that can be used by CKFinder users. This will save you the effort to manually
    +		enter modified width and height values for each image and will let you keep the thumbnail
    +		sizes consistent across your site.</p>
    +	<p>
    +		In order to use one of the predefined thumbnail sizes, choose the <strong>Resize</strong>
    +		option from the image context menu. In the <strong>Create a new thumbnail</strong> section
    +		of the <strong>Resize</strong> dialog window select the checkbox(es) representing the
    +		desired thumbnail size(s). On successful resizing a confirmation message will be displayed.
    +		The resized image copies will be created in the same folder and the new files will be named
    +		according to the thumbnail size option that you choose (with <code>_large</code>,
    +		<code>_medium</code> and <code>_small</code> suffixes added to the original file name).</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_resize_thumbnails.png" width="398" height="170" alt="Thumbnails generated in CKFinder" />&nbsp;</p>
    +	<p>
    +		<span class="info">Note:</span> If the image is smaller than some of the thumbnails options
    +		(see example above), the ones that are unavailable will be grayed out.</p>
    +	<h3>
    +		Renaming a File</h3>
    +	<p>
    +		In order to rename a file, choose the <strong>Rename</strong> option from its context menu
    +		or use the <em>F2</em> keyboard shortcut. Type the new file name in the dialog window that
    +		will be displayed, overwriting the existing name. Once you enter the new file name and close
    +		the dialog window, the file will be renamed.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_rename.png" width="304" height="149" alt="Renaming a file in CKFinder" />&nbsp;</p>
    +	<p>
    +		Not all characters can be used in folder and file names due to limitations of the
    +		systems where CKFinder runs. Among the characters that cannot be used in folders and
    +		files names are: <code>\</code> <code>/</code> <code>:</code> <code>*</code>
    +		<code>?</code> <code>&quot;</code> <code>&lt;</code> <code>&gt;</code> and <code>|</code>.</p>
    +	<p>
    +		<span class="warning">Attention:</span> When you rename a file, links or media insertions
    +		available on other pages and pointing to the renamed file will be broken, and thus not
    +		available anymore. Because of that be careful when using this feature.</p>
    +	<h3>
    +		Deleting a File</h3>
    +	<p>
    +		In order to delete a file, choose the <strong>Delete</strong> option from its context menu
    +		or use the <em>Del</em> key. A confirmation message will appear to ensure that this operation
    +		is what you really intend to do. Once you confirm the deletion, the file will be removed.</p>
    +	<p>
    +		<span class="warning">Attention:</span> This operation cannot be undone. Once you delete the
    +		file, you will not be able to restore it.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_delete.png" width="304" height="149" alt="Deleting a file in CKFinder" />&nbsp;</p>
    +	<p>
    +		<span class="warning">Attention:</span> When you delete a file, links or media insertions
    +		available on other pages and pointing to the deleted file will be broken, and thus not
    +		available anymore. Because of that be careful when using this feature.</p>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/005.html b/src/main/webapp/plug-in/ckfinder/help/en/files/005.html
    new file mode 100644
    index 00000000..d448737b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/005.html
    @@ -0,0 +1,43 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Toolbar
    +	</h1>
    +	<p>
    +		The <strong>Toolbar</strong> is a dedicated section at the top of the CKFinder interface. It contains
    +		a series of menu buttons that can be clicked in order to give you access to various file browser
    +		features.</p>
    +	<p>
    +		This is what the standard CKFinder toolbar looks like:</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_toolbar.png" width="253" height="38" alt="CKFinder Toolbar" />&nbsp;</p>
    +	<h2>Using the Toolbar</h2>
    +	<p>In order to perform an operation assigned to a button, click the button once. In most cases it will
    +		either immediately perform some predefined action or open a drop-down panel with further configuration
    +		options for a feature.</p>
    +	<p>Remember that the toolbar can also be used with your keyboard. To enter the toolbar, use the
    +		<em>Alt+F10</em> keyboard shortcut. To move to the next or previous button, use the <em>Right Arrow</em>
    +		and <em>Left Arrow</em> keys, respectively. To activate a selected toolbar button, press <em>Enter</em>
    +		or <em>Space</em>.</p>
    +	<h2>
    +		Toolbar Buttons</h2>
    +	<p>
    +		The following is the list of buttons available in the standard toolbar:</p>
    +	<ul>
    +		<li><strong><a href="006.html">Upload</a></strong> &ndash; opens the <strong>Upload Pane</strong>
    +			that can be used to add new files to the current folder.</li>
    +		<li><strong><a href="007.html">Refresh</a></strong> &ndash; reloads the list of files in the
    +			<strong><a href="004.html">Files Pane</a></strong>.</li>
    +		<li><strong><a href="008.html">Settings</a></strong> &ndash; opens the <strong>Settings Pane</strong>
    +			where you can configure and personalize CKFinder.</li>
    +		<li><strong><a href="009.html">Help</a></strong> &ndash; opens this User's Guide.</li>
    +	</ul>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/006.html b/src/main/webapp/plug-in/ckfinder/help/en/files/006.html
    new file mode 100644
    index 00000000..fde6bc80
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/006.html
    @@ -0,0 +1,127 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Upload Button</h1>
    +	<p>
    +		The <strong>Upload</strong> button that is available in the CKFinder
    +		<strong><a href="005.html">Toolbar</a></strong> opens the
    +		<strong>Upload Pane</strong> which you can use to add new files to the
    +		current folder.</p>
    +	<p>The figure below presents the default file browser <strong>Upload Pane</strong>
    +		that is expanded when you click the toolbar button.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_upload_01.png" width="591" height="145" alt="Flash Upload Panel in CKFinder" />&nbsp;</p>
    +	<p>
    +		In order to close (collapse) the <strong>Upload Pane</strong>, press
    +		the <strong>Cancel</strong> button (if you have not started the upload process yet)
    +		or the <strong>Close</strong> button (if the upload has already finished). You can
    +		also click the <strong>Upload</strong> toolbar button once again to collapse the panel.</p>
    +	<p>
    +		<span class="info">Note:</span> <em>Upload</em> is a technical term that
    +		stands for the action of sending the files from your local computer to a central
    +		computer (also known as a <em>server</em>).</p>
    +	<h2>
    +		Upload Pane Versions</h2>
    +	<p>CKFinder <strong>Upload Pane</strong> comes in two flavors, depending on your
    +		environment. By default, the multiple upload solution (that lets you send more
    +		files to the server in one operation) is used for all environments that support
    +		Adobe Flash. If, however, your local system does not support Flash, you will
    +		still be able to upload individual files in separate operations thanks to the
    +		fallback solution.</p>
    +	<p>The figure above presents the default <strong>Upload Pane</strong> with multiple
    +		upload solution enabled. For all systems that do not support Flash (including
    +		some mobile browsers) the following <strong>Upload Pane</strong> format will
    +		be used.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_upload_09.png" width="572" height="143" alt="Single file Upload Panel in CKFinder" />&nbsp;</p>
    +	<h2>
    +		Multiple File Upload</h2>
    +	<p>
    +		By default CKFinder will allow you to upload multiple files at the same time.
    +		In order to send the files to the server, follow the steps described below.</p>
    +	<p><em>Step 1:</em> Click the <strong>Upload</strong> toolbar button to open the
    +		<strong>Upload Pane</strong>.</p>
    +	<p><em>Step 2:</em> When the <strong>Upload Pane</strong> expands, choose the
    +		<strong>Add Files</strong> button. A native file selection dialog window of
    +		your operating system that opens will let you choose the local file to be
    +		uploaded to the server.</p>
    +	<p><span class="info">Note:</span> You can choose as many files as you want by
    +		selecting them in the dialog window all at once.</p>
    +	<p><em>Step 3:</em> The local file(s) will now be added to the upload queue.
    +		If you want to add further files to this upload batch, click the
    +		<strong>Add Files</strong> button again and repeat the steps described above.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_upload_03.png" width="590" height="283" alt="Upload queue in CKFinder" />&nbsp;</p>
    +	<p><em>Step 4:</em> If you change your mind about the files that should be sent to the server, you
    +		can always either remove individual files from the upload queue by clicking
    +		the <strong>Remove</strong> button next to the file, or decide to cancel the whole
    +		upload process by choosing the <strong>Cancel</strong> button of the <strong>
    +		Upload Pane</strong>.</p>
    +	<p><em>Step 5:</em> If you are ready with the file selection process, you can click the
    +		<strong>Upload</strong> button to start the upload. The progress of the whole process
    +		as well as individual files can be observed on the screen.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_upload_04.png" width="575" height="289" alt="Multiple file upload progress" />&nbsp;</p>
    +	<p><em>Step 6:</em> Wait for the upload to terminate. Once it is completed, the folder
    +		content will refresh and the uploaded file (or the last one of the multiple files)
    +		will be selected in the <a href="004.html"><strong>Files Pane</strong></a>.</p>
    +	<h2>
    +		Single File Upload</h2>
    +	<p>When Adobe Flash is not available in your system, CKFinder upload will be fully
    +		functional, though limited to uploading one file at a time. In order to send the
    +		file to the server, follow the steps described below.</p>
    +	<p><em>Step 1:</em> Click the <strong>Upload</strong> toolbar button to open the
    +		<strong>Upload Pane</strong>.</p>
    +	<p><em>Step 2:</em> When the <strong>Upload Pane</strong> expands, choose the
    +		<strong>Browse</strong> button.	A native file selection dialog window of your
    +		operating system that opens will let you choose the local file to be uploaded
    +		to the server.</p>
    +	<p><span class="info">Note:</span> The button caption may differ between browsers.</p>
    +	<p><em>Step 3:</em> The local file will now be selected. You can only upload one file
    +		at a time.</p>
    +	<p><em>Step 4:</em> If you are ready with the file selection process, you can click the
    +		<strong>Upload Selected File</strong> button to start the upload. The progress of the
    +		file upload process can be observed on the screen.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_upload_10.png" width="574" height="172" alt="Single file upload in CKFinder" />&nbsp;</p>
    +	<p><em>Step 5:</em> Wait for the upload to terminate. Once it is completed, the <strong>
    +		Upload Pane</strong> will be closed, the folder content will refresh, and the uploaded
    +		 file will be selected in the <a href="004.html"><strong>Files Pane</strong></a>.</p>
    +	<h2>
    +		Upload Errors</h2>
    +	<p>
    +		The following error messages  may appear when uploading files.</p>
    +	<h3>
    +		A file with the same name is already available. The uploaded file was renamed
    +		to "<em>filename(1).ext</em>"</h3>
    +	<p>
    +		This message indicates that the uploaded file name is already in use by another
    +		file in the same folder. To avoid conflict, a consecutive number, the "(1)", was
    +		appended to the original name.</p>
    +	<h3>
    +		Invalid file</h3>
    +	<p>
    +		The file that you attempted to upload was not accepted.
    +	</p>
    +	<p>
    +		The most common cause for this message is that CKFinder was configured to not
    +		accept the kind of file you are trying to upload based on its extension. This
    +		is a security restriction. It is also possible that the file size is too
    +		large for your system. If this is the case, the server must be configured to
    +		accept bigger files.
    +	</p>
    +	<h3>Upload cancelled for security reasons. The file contains HTML-like data.</h3>
    +	<p>The uploaded file contains HTML code. For security reasons, only files with selected
    +		extensions are allowed to contain HTML code.</p>
    +	<p>
    +		Please contact your system administrator to get more information regarding the
    +		accepted file types and their size limits.</p>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/007.html b/src/main/webapp/plug-in/ckfinder/help/en/files/007.html
    new file mode 100644
    index 00000000..f666c2f9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/007.html
    @@ -0,0 +1,29 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Refresh Button</h1>
    +	<p>When you work in a shared environment managed by CKFinder, where dozens or even hundreds
    +		of users are working on the same files at the same time, it may happen that some
    +		changes are being introduced by others to the files or folders that you are processing
    +		or viewing at any given moment.</p>
    +	<p>This is where the <strong>Refresh</strong> option might come to the rescue. This feature
    +		lets you reload the contents of a folder and see its most current state. Whenever you
    +		need to see the updated file list, click the <strong>Refresh</strong>
    +		button from the CKFinder <strong><a href="005.html">Toolbar</a></strong>.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_toolbar_refresh.png" width="251" height="64" alt="Refresh button in the CKFinder toolbar" />&nbsp;</p>
    +	<p>
    +		This feature is particularly useful if you are using CKFinder as <em>collaborative
    +		software</em>, sharing files and folders with friends, family, colleagues, or any other
    +		group of users. In order to ensure that you always see the most current version of the
    +		content managed by CKFinder, you might want to occasionally refresh the files list to
    +		update it.</p>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/008.html b/src/main/webapp/plug-in/ckfinder/help/en/files/008.html
    new file mode 100644
    index 00000000..d1d01925
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/008.html
    @@ -0,0 +1,90 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Settings Button</h1>
    +	<p>
    +		The <strong>Settings</strong> button that is available in the CKFinder
    +		<strong><a href="005.html">Toolbar</a></strong> opens the
    +		<strong>Settings Pane</strong> where you can configure and customize
    +		CKFinder.</p>
    +	<p>The figure below presents the file browser <strong>Settings Pane</strong>
    +		that is expanded when you click the toolbar button.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_settings.png" width="580" height="233" alt="CKFinder Settings Pane" />&nbsp;</p>
    +	<p>
    +		All settings are saved automatically by using Internet browser "cookies".
    +		"Cookies" are small files that store private configuration information
    +		for specific websites on your computer.</p>
    +	<p>
    +		In order to close (collapse) the <strong>Settings Pane</strong>, press
    +		the <strong>Close</strong> button or click the <strong>Settings</strong>
    +		toolbar button once again.</p>
    +	<h2>
    +		CKFinder Configuration Options</h2>
    +	<p>
    +		All configuration options pertain to the <strong><a href="004.html">Files Pane</a>
    +		</strong> and control the way the files are displayed in CKFinder. The
    +		<strong>Files Pane</strong> will react immediately to changes introduced
    +		in the <strong>Settings Pane</strong>.</p>
    +	<h3>
    +		View</h3>
    +	<p>
    +		Sets the view mode in the <strong>Files Pane</strong>:</p>
    +	<ul>
    +		<li><strong>Thumbnails</strong> &ndash; this mode will display each file in a
    +			box (frame). For images a small preview (called a <em>thumbnail</em>) will
    +			be displayed inside the box. For other files an icon will be available
    +			instead.</li>
    +		<li><strong>List</strong> &ndash; this mode will display all files in a list.
    +			No image previews are available in this mode.</li>
    +	</ul>
    +	<h3>
    +		Display</h3>
    +	<p>
    +		Sets the amount of information available in the <strong>Files Pane</strong>.
    +		The following options can be turned on and off:</p>
    +	<ul>
    +		<li><strong>File Name</strong> &ndash; displays the file name, along with its
    +			extension.</li>
    +		<li><strong>Date</strong> &ndash; displays the last file modification date.</li>
    +		<li><strong>File Size</strong> &ndash; displays the file size, in kilobytes.</li>
    +	</ul>
    +	<p>If you are using the <strong>Thumbnails</strong> view mode, you can deselect all
    +		options. In the <strong>List</strong> mode the file name will always be displayed.</p>
    +	<p>The image below presents various display options as viewed in the
    +		<strong>Thumbnail</strong> mode.</p>
    +	<table align="center" cellpadding="0" cellspacing="0">
    +		<tr>
    +			<td valign="top" style="padding-left: 10px">
    +				<img src="../../files/images/CKFinder_file_display_04.png" width="122" height="112" alt="File displayed in Thumbnails mode without file name, size, and modification date" /></td>
    +			<td valign="top" style="padding-right: 10px; padding-left: 10px">
    +				<img src="../../files/images/CKFinder_file_display_03.png" width="122" height="128" alt="File displayed in Thumbnails mode with file name only" /></td>
    +			<td valign="top" style="padding-right: 10px; padding-left: 10px">
    +				<img src="../../files/images/CKFinder_file_display_02.png" width="122" height="142" alt="File displayed in Thumbnails mode with file name and modification date" /></td>
    +			<td valign="top" style="padding-right: 10px">
    +				<img src="../../files/images/CKFinder_file_display_01.png" width="122" height="158" alt="File displayed in Thumbnails mode with file name, size, and modification date" /></td>
    +		</tr>
    +	</table>
    +	<h3>
    +		Sorting</h3>
    +	<p>
    +		Sets the order in which the files will be listed. The following options are available:</p>
    +	<ul>
    +		<li><strong>By File Name</strong> &ndash; sorts the files alphabetically according to
    +			their names.</li>
    +		<li><strong>By Date</strong> &ndash; sorts the files by the last modification date, with
    +			newest displayed first.</li>
    +		<li><strong>By Size</strong> &ndash; sorts the files by their size, with largest displayed
    +			first.</li>
    +		<li><strong>By Extension</strong> &ndash; sorts the files first alphabetically by their
    +			extension, and then alphabetically according to their names.</li>
    +	</ul>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/009.html b/src/main/webapp/plug-in/ckfinder/help/en/files/009.html
    new file mode 100644
    index 00000000..8f37cf0e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/009.html
    @@ -0,0 +1,19 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Help Button</h1>
    +	<p>
    +		The <strong>Help</strong> button is available in the <strong>
    +		<a href="005.html">Toolbar</a></strong> for all CKFinder views. When you click it,
    +		the "User's Guide" will open in a new browser tab or window.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_toolbar_help.png" width="266" height="64" alt="Help button in the CKFinder toolbar" />&nbsp;</p>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/010.html b/src/main/webapp/plug-in/ckfinder/help/en/files/010.html
    new file mode 100644
    index 00000000..92604810
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/010.html
    @@ -0,0 +1,33 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Status Bar</h1>
    +	<p>
    +		The <strong>Status Bar</strong> is the section at the bottom of the CKFinder
    +		interface that displays information about the selected file, the total number
    +		of files in the folder, etc.</p>
    +	<p>
    +		If a file is selected in CKFinder, the <strong>Status Bar</strong> will display
    +		detailed information about that file, including the file name, its size, and the
    +		data of its last modification. For example:</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_status_file.png" width="187" height="39" alt="CKFinder Status Bar with a file selected" />&nbsp;</p>
    +	<p>
    +		If no files are selected, the <strong>Status Bar</strong> will instead display the
    +		total number of files in the current folder. For example:</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_status_folder.png" width="187" height="39" alt="CKFinder Status Bar with no files selected" />&nbsp;</p>
    +	<p>
    +		If the folder is empty, the <strong>Status Bar</strong> will display an appropriate
    +		message. For example:</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_status_empty.png" width="187" height="39" alt="CKFinder Status Bar for an empty folder" />&nbsp;</p>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/011.html b/src/main/webapp/plug-in/ckfinder/help/en/files/011.html
    new file mode 100644
    index 00000000..cdeb0fbe
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/011.html
    @@ -0,0 +1,25 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Legal Notices</h1>
    +	<p>
    +		CKFinder, including this documentation, is Copyright &copy; 2007-2013 <a href="http://cksource.com" target="_blank">CKSource</a> - Frederico Knabben. All rights
    +		reserved. Please ensure that you have read and understood the <a href="license.html">CKFinder
    +		License</a>.</p>
    +	<p>
    +		The icons used in the toolbar and context menus were designed by Mark James.
    +		Please check the following URL for more information:<br />
    +		<a href="http://www.famfamfam.com/lab/icons/silk/">http://www.famfamfam.com/lab/icons/silk/</a></p>
    +	<h2>
    +		Trademarks</h2>
    +	<p>
    +		CKFinder, the CKFinder Logo, CKSource, CKEditor, and FCKeditor are trademarks of <a href="http://cksource.com" target="_blank">CKSource</a> - Frederico Knabben.</p>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/012.html b/src/main/webapp/plug-in/ckfinder/help/en/files/012.html
    new file mode 100644
    index 00000000..aa737196
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/012.html
    @@ -0,0 +1,64 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Context Menu</h1>
    +	<p>
    +		The <strong>Context Menu</strong> is a pop-up menu that appears whenever you
    +		click a file or a folder inside the CKFinder interface with the right mouse
    +		button, use the <em>Menu/Application</em> key on your keyboard, or the
    +		<em>(Ctrl+)Shift+F10</em> keyboard shortcut. It gives you access to file browser
    +		operations that are available for a given type of object.</p>
    +	<p>The context menu can also be opened by clicking the down arrow icon
    +		(<img src="../../files/images/CKFinder_menu_arrow.png" width="9" height="7" alt="" />)
    +		that is available in some environments or in mobile browsers next the name of the
    +		active folder or in the file boxes, as visible in the figure below.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_menu_arrows.png" width="469" height="251" alt="CKFinder context menu with helper arrows" />&nbsp;</p>
    +	<p>Each context menu consists of a series of options (commands) that can be
    +		selected in order to perform a specific operation that they are associated
    +		with.</p>
    +	<p>
    +		<span class="info">Note:</span> Some context menu options may be disabled (and
    +		thus grayed out), depending on CKFinder settings enforced by your system
    +		administrator.</p>
    +	<h2>
    +		Using the Context Menu</h2>
    +	<p>
    +		In order to perform an operation listed in the context menu, click it with the
    +		left mouse button. You can also move up and down the context menu with the
    +		<em>Up</em> and <em>Down Arrow</em> keys or the <em>Shift+Tab</em> and
    +		<em>Tab</em> combinations. Once an option is highlighted, you can activate
    +		it with the <em>Space</em> or <em>Enter</em> button. If an option is grayed out,
    +		it is unavailable unless some pre-conditions are met (e.g. you have system
    +		permissions to make specific changes to a file or folder).</p>
    +	<h2>
    +		Available Menus</h2>
    +	<p>
    +		The menu is context-sensitive which means that the options displayed in it
    +		depend on the object that you select. The following are the menus that you may
    +		encounter while working with a standard CKFinder installation.</p>
    +	<h3>
    +		Folder Context Menu</h3>
    +	<p>
    +		It appears when you click a folder in the <strong><a href="003.html">Folders Pane</a>
    +		</strong> with the right mouse button (or use the keyboard shortcuts described
    +		above):</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_folder_menu.png" width="148" height="128" alt="CKFinder folder context menu" />&nbsp;</p>
    +	<h3>
    +		File Context Menu</h3>
    +	<p>
    +		It appears when you click a file in the <strong><a href="004.html">Files Pane</a>
    +		</strong> with the right mouse button (or use the keyboard shortcuts described
    +		above):</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_file_menu.png" width="130" height="156" alt="CKFinder file context menu" />&nbsp;</p>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/013.html b/src/main/webapp/plug-in/ckfinder/help/en/files/013.html
    new file mode 100644
    index 00000000..910a857a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/013.html
    @@ -0,0 +1,35 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Compatibility and System Requirements</h1>
    +	<p>
    +		CKFinder is a <em>web application</em>. It means that it is designed to run
    +		inside Internet browsers, which makes it easy to deploy and to use on any
    +		computer.</p>
    +	<p>
    +		Currently, the following browsers are required for CKFinder to run:</p>
    +	<ul>
    +		<li>Internet Explorer 6.0+</li>
    +		<li>Firefox 3.0+</li>
    +		<li>Safari</li>
    +		<li>Google Chrome</li>
    +		<li>Opera</li>
    +	</ul>
    +	<p>
    +		Some features depend on your browser settings. CKFinder should work in any of the
    +		browsers listed above with their default settings enabled. If you are experiencing problems
    +		with the <strong><a href="012.html">Context Menu</a></strong> or your <strong>
    +		<a href="008.html">Settings</a></strong> are not being saved, make sure that your browser
    +		is configured to "<strong>allow scripts to replace context menus</strong>" ("allow scripts
    +		to receive right clicks") and that you have "<strong>cookies support enabled</strong>".</p>
    +	<p>
    +		Please contact your system administrator if you have any doubts.</p>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/014.html b/src/main/webapp/plug-in/ckfinder/help/en/files/014.html
    new file mode 100644
    index 00000000..c096d82b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/014.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Basket</h1>
    +	<p>
    +		The <strong>Basket</strong> folder that is available in the
    +		<strong><a href="003.html">Folders Pane</a></strong> opens the
    +		<strong>Basket Pane</strong>.</p>
    +	<p>
    +		The <strong>Basket</strong> is a virtual and temporary placeholder that can
    +		be used to perform batch operations on files in CKFinder. It is a
    +		<em>virtual</em> container, since the files that are placed in the
    +		<strong>Basket</strong> are not physically moved from their parent folders.
    +		</p>
    +	<p>The figure below presents the file browser <strong>Basket Pane</strong>
    +		that is expanded when you click the <strong>Basket</strong> folder in the
    +		<strong>Folders Pane</strong>.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_basket_empty.png" width="548" height="235" alt="CKFinder Basket folder" />&nbsp;</p>
    +	<p>
    +		<span class="info">Note:</span> The <strong>Basket</strong> folder is private
    +		in the sense that it is not being shared with other users of the file system
    +		and is tied to your browser session.</p>
    +	<h2>
    +		Adding Files to Basket</h2>
    +	<p>
    +		At the beginning of each CKFinder session the <strong>Basket</strong> is empty.
    +		A message urging you to drag some files and drop them into the <strong>Basket</strong>
    +		will be displayed. In order to do this, go to the folder that contains the files
    +		that you are going to use, drag it onto the <strong>Basket</strong> folder in
    +		the <strong>Folders Pane</strong>, and drop.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_basket_drag.png" width="482" height="303" alt="Dragging a file to the Basket in CKFinder" />&nbsp;</p>
    +	<p>The file should now appear in the <strong>Basket</strong> folder.</p>
    +	<h2>
    +		File Context Menu</h2>
    +	<p>
    +		When a file is placed in the <strong>Basket</strong>, its context menu will change
    +		to only include the operations that are available in this special folder.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_basket_file_menu.png" width="137" height="130" alt="File context menu opened in the Basket" />&nbsp;</p>
    +	<h2>
    +		Removing Files from Basket</h2>
    +	<p>
    +		There are two methods of removing a file from the <strong>Basket</strong>. Firstly,
    +		you can remove an individual file by choosing the <strong>Remove from Basket</strong>
    +		option from the file context menu. When you select the context menu removal option,
    +		a confirmation message will appear.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_basket_remove.png" width="342" height="149" alt="Removing a file from the Basket in CKFinder" />&nbsp;</p>
    +	<p>You can also remove all files at once by clicking the <strong>Clear Basket</strong> toolbar
    +		button. When you do this, you will be prompted to confirm whether you intend to remove
    +		all <strong>Basket</strong> contents.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_basket_clear.png" width="304" height="149" alt="Removing all files from the Basket in CKFinder" />&nbsp;</p>
    +	<p>
    +		<span class="info">Note:</span> Removing a file from the <strong>Basket</strong> does
    +		not delete it from the file system. It will still be available in its parent folder.</p>
    +	<h2>
    +		Showing File Parent Folder</h2>
    +	<p>
    +		As mentioned above, the <strong>Basket</strong> is a virtual folder that lists files that
    +		are physically located in other file system folders. If you want to check the source folder
    +		of a file, choose the <strong>Open Parent Folder</strong> option from the file context
    +		menu. CKFinder will show the folder that the file is located in.</p>
    +	<h2>
    +		Copying Files from Basket</h2>
    +	<p>
    +		Once you conveniently place some files in the <strong>Basket</strong>, you will now be
    +		able to copy them to a different (physical) folder. In order to achieve this, select the
    +		target folder in the <strong><a href="003.html">Folders Pane</a></strong> and choose the
    +		<strong>Copy Files from Basket</strong> option from its context menu.</p>
    +	<p>
    +		A confirmation message will appear, listing the files that were copied to the target
    +		folder.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_folder_copied_from_basket.png" width="304" height="206" alt="Copying files from Basket in CKFinder" />&nbsp;</p>
    +	<p>
    +		The files will be duplicated and their copies will be placed in the target folder. The
    +		source folder will remain untouched.</p>
    +	<h2>Moving Files from Basket</h2>
    +	<p>
    +		The <strong>Basket</strong> is also useful if you want to move some files between folders.
    +		Once you place some files in the <strong>Basket</strong>, select a target folder in the
    +		<strong>Folders Pane</strong>, and choose the <strong>Move Files from Basket</strong> option
    +		from its context menu.</p>
    +	<p>
    +		A confirmation message will appear, listing the files that were moved to the target folder.</p>
    +	<p style="text-align: center">
    +		<img src="../../files/images/CKFinder_folder_moved_from_basket.png" width="304" height="206" alt="Moving files from Basket in CKFinder" />&nbsp;</p>
    +	<p>
    +		The files will be removed from the source folder and pasted into the target folder.</p>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/015.html b/src/main/webapp/plug-in/ckfinder/help/en/files/015.html
    new file mode 100644
    index 00000000..49b082e1
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/015.html
    @@ -0,0 +1,46 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		Keyboard Shortcuts</h1>
    +	<p>
    +		Many functions in CKFinder have their equivalent keyboard shortcuts. This is one
    +		of the reasons why working with the file browser is both simple and efficient.</p>
    +	<p>
    +		The list below contains available keyboard shortcuts grouped by problem areas.</p>
    +	<h2>CKFinder Interface</h2>
    +	<ul>
    +		<li><em>Alt+F8</em> &ndash; enters the <strong><a href="003.html">Folders Pane</a></strong>.</li>
    +		<li><em>Alt+F9</em> &ndash; enters the <strong><a href="004.html">Files Pane</a></strong>.</li>
    +		<li><em>Alt+F10</em> &ndash; enters the <strong><a href="005.html">Toolbar</a></strong>.</li>
    +		<li><em>Alt+U</em> &ndash; opens the <strong><a href="006.html">Upload Pane</a></strong>.</li>
    +		<li><em>(Ctrl+)Shift+F10</em> &ndash; opens the <strong><a href="012.html">Context Menu</a></strong> of a file or folder.</li>
    +		<li><em>Esc</em> &ndash; equivalent of the <strong>Cancel</strong> button. Closes
    +		a CKFinder dialog window or context menu without saving any changes.</li>
    +		<li><em>Enter</em> &ndash; equivalent of the <strong>OK</strong> button in a dialog window.
    +		Selects a CKFinder function from the toolbar or context menu.</li>
    +		<li><em>Left and Right Arrows</em> &ndash; move between toolbar buttons.</li>
    +		<li><em>Up and Down Arrows</em> or <em>Tab and Shift+Tab</em> &ndash; move between context menu options.</li>
    +	</ul>
    +	<h2>
    +		Files Pane Navigation</h2>
    +	<ul>
    +		<li><em>Page Down</em> &ndash; scrolls down the <strong>Files Pane</strong>.</li>
    +		<li><em>Page Up</em> &ndash; scrolls up the <strong>Files Pane</strong>.</li>
    +		<li><em>End</em> &ndash; scrolls the <strong>Files Pane</strong> to the last row.</li>
    +		<li><em>Home</em> &ndash; scrolls the <strong>Files Pane</strong> to the first row.</li>
    +	</ul>
    +	<h2>
    +		Working with Files and Folders</h2>
    +	<ul>
    +		<li><em>F2</em> &ndash; equivalent to the <strong>Rename</strong> command.</li>
    +		<li><em>Del</em> &ndash; equivalent to the <strong>Delete</strong> command.</li>
    +	</ul>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/header.html b/src/main/webapp/plug-in/ckfinder/help/en/files/header.html
    new file mode 100644
    index 00000000..bb6642a6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/header.html
    @@ -0,0 +1,33 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<meta name="robots" content="noindex, nofollow" />
    +	<style type="text/css">
    +		body
    +		{
    +			margin: 0px;
    +			font-family: Trebuchet, Trebuchet MS, Verdana;
    +			background-color: #696969;
    +			color: #f5f5f5;
    +			padding-left: 20px;
    +			padding-right: 20px;
    +			overflow: hidden;
    +		}
    +		a { color: #f5f5f5; text-decoration: none ; }
    +		a:hover { text-decoration: underline ; }
    +	</style>
    +</head>
    +<body>
    +	<table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0">
    +		<tr>
    +			<td valign="middle">
    +				<h2 style="margin: 0px; padding: 0px;">
    +					CKFinder User's Guide</h2>
    +			</td>
    +			<td align="right" valign="middle">
    +				<a href="http://cksource.com/ckfinder" target="_blank">Visit the CKFinder Website</a></td>
    +		</tr>
    +	</table>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/license.html b/src/main/webapp/plug-in/ckfinder/help/en/files/license.html
    new file mode 100644
    index 00000000..36e24a04
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/license.html
    @@ -0,0 +1,15 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +</head>
    +<body>
    +	<h1>
    +		CKFinder License
    +	</h1>
    +	<iframe src="../../../license.txt" style="width:800px;height:600px"></iframe>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/suggestions.html b/src/main/webapp/plug-in/ckfinder/help/en/files/suggestions.html
    new file mode 100644
    index 00000000..d3315f7a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/suggestions.html
    @@ -0,0 +1,33 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<link href="../../files/other/help.css" type="text/css" rel="stylesheet" />
    +	<script type="text/javascript" src="../../files/other/help.js"></script>
    +	<meta name="robots" content="noindex, nofollow" />
    +	<script type="text/javascript">
    +
    +function CheckForm()
    +{
    +	if ( document.getElementById( 'xSuggestion' ).value == '' )
    +	{
    +		alert( 'Please type your suggestion text before sending.' ) ;
    +		return false ;
    +	}
    +
    +	document.getElementById( 'xSubmit' ).disabled = true ;
    +	document.getElementById( 'spamcheck' ).value = 9945 + 13671 ;
    +
    +	return true ;
    +}
    +
    +	</script>
    +</head>
    +<body>
    +	<h1>
    +		Your Suggestions</h1>
    +	<p>
    +		Feel free to <a href="http://cksource.com/contact">send us your suggestions</a> about this documentation.
    +		We are always willing to improve it as we want to offer you better software every day.</p>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/files/toc.html b/src/main/webapp/plug-in/ckfinder/help/en/files/toc.html
    new file mode 100644
    index 00000000..a6482b73
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/files/toc.html
    @@ -0,0 +1,95 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<meta name="robots" content="noindex, nofollow" />
    +	<style type="text/css">
    +		body
    +		{
    +			margin: 0px;
    +			font-family: Trebuchet, Trebuchet MS, Arial;
    +		}
    +		a { text-decoration: none ; }
    +		a:hover { text-decoration: underline ; }
    +		ul { list-style-type: none; padding-left: 20px; margin:0px; }
    +		li { white-space: nowrap; padding-left:2px; padding-right:2px; }
    +		.toc
    +		{
    +			background-color: #696969;
    +			color: #f5f5f5;
    +			margin: 0px;
    +			font-weight: bold;
    +			text-align: center;
    +		}
    +		.contents { padding: 10px; }
    +		.active  { color: highlighttext; background-color: highlight; }
    +	</style>
    +	<script type="text/javascript">
    +
    +window.onload = function()
    +{
    +	for ( var i = 0 ; i < document.links.length ; i++ )
    +	{
    +		var link = document.links[i] ;
    +		link.target = 'CKDocsMain' ;
    +		link.innerHTML = '&nbsp;' + link.innerHTML + '&nbsp;' ;
    +	}
    +}
    +
    +var lastLink = null ;
    +
    +window.top.SetActiveTopic = function( topicUrl )
    +{
    +	var pageName = topicUrl.match( /(?:^|\/|\\)([^\\\/]+)$/ )[1] ;
    +
    +	if ( lastLink )
    +		lastLink.className = '' ;
    +
    +	for ( var i = 0 ; i < document.links.length ; i++ )
    +	{
    +		var link = document.links[i] ;
    +		if ( link.href.match( /(?:^|\/|\\)([^\\\/]+)$/ )[1] == pageName )
    +		{
    +			lastLink = link ;
    +			link.className = 'active' ;
    +			return ;
    +		}
    +	}
    +}
    +
    +	</script>
    +</head>
    +<body>
    +	<p class="toc">
    +		&nbsp;Table of Contents</p>
    +	<div class="contents">
    +		<ul style="padding-left: 0px;">
    +			<li><a href="001.html">Welcome</a></li>
    +			<li><a href="002.html">CKFinder Interface</a>
    +				<ul>
    +					<li><a href="003.html">Folders Pane</a>
    +						<ul>
    +							<li><a href="014.html">Basket</a></li>
    +						</ul>
    +					</li>
    +					<li><a href="004.html">Files Pane</a></li>
    +					<li><a href="005.html">Toolbar</a>
    +						<ul>
    +							<li><a href="006.html">Upload</a></li>
    +							<li><a href="007.html">Refresh</a></li>
    +							<li><a href="008.html">Settings</a></li>
    +							<li><a href="009.html">Help</a></li>
    +						</ul>
    +					</li>
    +					<li><a href="010.html">Status Bar</a></li>
    +					<li><a href="012.html">Context Menu</a></li>
    +				</ul>
    +			</li>
    +			<li><a href="015.html">Keyboard Shortcuts</a></li>
    +			<li><a href="013.html">Compatibility and System Requirements</a></li>
    +			<li><a href="011.html">Legal Notices</a></li>
    +			<li><a href="suggestions.html">Suggestions?</a></li>
    +		</ul>
    +	</div>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/help/en/index.html b/src/main/webapp/plug-in/ckfinder/help/en/index.html
    new file mode 100644
    index 00000000..9d2174a9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/help/en/index.html
    @@ -0,0 +1,18 @@
    +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
    +<html lang="en">
    +<head>
    +	<title>CKFinder User's Guide</title>
    +	<meta name="robots" content="noindex, nofollow">
    +	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    +	<style type="text/css">
    +		frame {border-color:#f5f5f5}
    +	</style>
    +</head>
    +<frameset rows="50,*">
    +	<frame src="files/header.html" noresize="noresize" frameborder="0">
    +	<frameset cols="200,*">
    +			<frame src="files/toc.html">
    +			<frame src="files/001.html" name="CKDocsMain">
    +	</frameset>
    +</frameset>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/lang/en.js b/src/main/webapp/plug-in/ckfinder/lang/en.js
    new file mode 100644
    index 00000000..661c3127
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/lang/en.js
    @@ -0,0 +1,312 @@
    +锘/*
    + * CKFinder
    + * ========
    + * http://cksource.com/ckfinder
    + * Copyright (C) 2007-2013, CKSource - Frederico Knabben. All rights reserved.
    + *
    + * The software, this file, and its contents are subject to the CKFinder
    + * License. Please read the license.txt file before using, installing, copying,
    + * modifying, or distributing this file or part of its contents. The contents of
    + * this file is part of the Source Code of CKFinder.
    + *
    + */
    +
    +/**
    + * @fileOverview Defines the {@link CKFinder.lang} object for the English
    + *		language. This is the base file for all translations.
    + */
    +
    +/**
    + * Contains the dictionary of language entries.
    + * @namespace
    + */
    +CKFinder.lang['en'] =
    +{
    +	appTitle : 'CKFinder',
    +
    +	// Common messages and labels.
    +	common :
    +	{
    +		// Put the voice-only part of the label in the span.
    +		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>',
    +		confirmCancel	: 'Some of the options were changed. Are you sure you want to close the dialog window?',
    +		ok				: 'OK',
    +		cancel			: 'Cancel',
    +		confirmationTitle	: 'Confirmation',
    +		messageTitle	: 'Information',
    +		inputTitle		: 'Question',
    +		undo			: 'Undo',
    +		redo			: 'Redo',
    +		skip			: 'Skip',
    +		skipAll			: 'Skip all',
    +		makeDecision	: 'What action should be taken?',
    +		rememberDecision: 'Remember my decision'
    +	},
    +
    +
    +	// Language direction, 'ltr' or 'rtl'.
    +	dir : 'ltr',
    +	HelpLang : 'en',
    +	LangCode : 'en',
    +
    +	// Date Format
    +	//		d    : Day
    +	//		dd   : Day (padding zero)
    +	//		m    : Month
    +	//		mm   : Month (padding zero)
    +	//		yy   : Year (two digits)
    +	//		yyyy : Year (four digits)
    +	//		h    : Hour (12 hour clock)
    +	//		hh   : Hour (12 hour clock, padding zero)
    +	//		H    : Hour (24 hour clock)
    +	//		HH   : Hour (24 hour clock, padding zero)
    +	//		M    : Minute
    +	//		MM   : Minute (padding zero)
    +	//		a    : Firt char of AM/PM
    +	//		aa   : AM/PM
    +	DateTime : 'm/d/yyyy h:MM aa',
    +	DateAmPm : ['AM','PM'],
    +
    +	// Folders
    +	FoldersTitle	: 'Folders',
    +	FolderLoading	: 'Loading...',
    +	FolderNew		: 'Please type the new folder name: ',
    +	FolderRename	: 'Please type the new folder name: ',
    +	FolderDelete	: 'Are you sure you want to delete the "%1" folder?',
    +	FolderRenaming	: ' (Renaming...)',
    +	FolderDeleting	: ' (Deleting...)',
    +	DestinationFolder	: 'Destination Folder',
    +
    +	// Files
    +	FileRename		: 'Please type the new file name: ',
    +	FileRenameExt	: 'Are you sure you want to change the file extension? The file may become unusable.',
    +	FileRenaming	: 'Renaming...',
    +	FileDelete		: 'Are you sure you want to delete the file "%1"?',
    +	FilesDelete	: 'Are you sure you want to delete %1 files?',
    +	FilesLoading	: 'Loading...',
    +	FilesEmpty		: 'The folder is empty.',
    +	DestinationFile	: 'Destination File',
    +	SkippedFiles	: 'List of skipped files:',
    +
    +	// Basket
    +	BasketFolder		: 'Basket',
    +	BasketClear			: 'Clear Basket',
    +	BasketRemove		: 'Remove from Basket',
    +	BasketOpenFolder	: 'Open Parent Folder',
    +	BasketTruncateConfirm : 'Do you really want to remove all files from the basket?',
    +	BasketRemoveConfirm	: 'Do you really want to remove the file "%1" from the basket?',
    +	BasketRemoveConfirmMultiple	: 'Do you really want to remove %1 files from the basket?',
    +	BasketEmpty			: 'No files in the basket, drag and drop some.',
    +	BasketCopyFilesHere	: 'Copy Files from Basket',
    +	BasketMoveFilesHere	: 'Move Files from Basket',
    +
    +	// Global messages
    +	OperationCompletedSuccess	: 'Operation completed successfully.',
    +	OperationCompletedErrors		: 'Operation completed with errors.',
    +	FileError				: '%s: %e',
    +
    +	// Move and Copy files
    +	MovedFilesNumber		: 'Number of files moved: %s.',
    +	CopiedFilesNumber	: 'Number of files copied: %s.',
    +	MoveFailedList		: 'The following files could not be moved:<br />%s',
    +	CopyFailedList		: 'The following files could not be copied:<br />%s',
    +
    +	// Toolbar Buttons (some used elsewhere)
    +	Upload		: 'Upload',
    +	UploadTip	: 'Upload New File',
    +	Refresh		: 'Refresh',
    +	Settings	: 'Settings',
    +	Help		: 'Help',
    +	HelpTip		: 'Help',
    +
    +	// Context Menus
    +	Select			: 'Select',
    +	SelectThumbnail : 'Select Thumbnail',
    +	View			: 'View',
    +	Download		: 'Download',
    +
    +	NewSubFolder	: 'New Subfolder',
    +	Rename			: 'Rename',
    +	Delete			: 'Delete',
    +	DeleteFiles		: 'Delete Files',
    +
    +	CopyDragDrop	: 'Copy Here',
    +	MoveDragDrop	: 'Move Here',
    +
    +	// Dialogs
    +	RenameDlgTitle		: 'Rename',
    +	NewNameDlgTitle		: 'New Name',
    +	FileExistsDlgTitle	: 'File Already Exists',
    +	SysErrorDlgTitle : 'System Error',
    +
    +	FileOverwrite	: 'Overwrite',
    +	FileAutorename	: 'Auto-rename',
    +	ManuallyRename	: 'Manually rename',
    +
    +	// Generic
    +	OkBtn		: 'OK',
    +	CancelBtn	: 'Cancel',
    +	CloseBtn	: 'Close',
    +
    +	// Upload Panel
    +	UploadTitle			: 'Upload New File',
    +	UploadSelectLbl		: 'Select a file to upload',
    +	UploadProgressLbl	: '(Upload in progress, please wait...)',
    +	UploadBtn			: 'Upload Selected File',
    +	UploadBtnCancel		: 'Cancel',
    +
    +	UploadNoFileMsg		: 'Please select a file from your computer.',
    +	UploadNoFolder		: 'Please select a folder before uploading.',
    +	UploadNoPerms		: 'File upload not allowed.',
    +	UploadUnknError		: 'Error sending the file.',
    +	UploadExtIncorrect	: 'File extension not allowed in this folder.',
    +
    +	// Flash Uploads
    +	UploadLabel			: 'Files to Upload',
    +	UploadTotalFiles	: 'Total Files:',
    +	UploadTotalSize		: 'Total Size:',
    +	UploadSend			: 'Upload',
    +	UploadAddFiles		: 'Add Files',
    +	UploadClearFiles	: 'Clear Files',
    +	UploadCancel		: 'Cancel Upload',
    +	UploadRemove		: 'Remove',
    +	UploadRemoveTip		: 'Remove !f',
    +	UploadUploaded		: 'Uploaded !n%',
    +	UploadProcessing	: 'Processing...',
    +
    +	// Settings Panel
    +	SetTitle		: 'Settings',
    +	SetView			: 'View:',
    +	SetViewThumb	: 'Thumbnails',
    +	SetViewList		: 'List',
    +	SetDisplay		: 'Display:',
    +	SetDisplayName	: 'File Name',
    +	SetDisplayDate	: 'Date',
    +	SetDisplaySize	: 'File Size',
    +	SetSort			: 'Sorting:',
    +	SetSortName		: 'by File Name',
    +	SetSortDate		: 'by Date',
    +	SetSortSize		: 'by Size',
    +	SetSortExtension		: 'by Extension',
    +
    +	// Status Bar
    +	FilesCountEmpty : '<Empty Folder>',
    +	FilesCountOne	: '1 file',
    +	FilesCountMany	: '%1 files',
    +
    +	// Size and Speed
    +	Kb				: '%1 KB',
    +	Mb				: '%1 MB',
    +	Gb				: '%1 GB',
    +	SizePerSecond	: '%1/s',
    +
    +	// Connector Error Messages.
    +	ErrorUnknown	: 'It was not possible to complete the request. (Error %1)',
    +	Errors :
    +	{
    +	 10 : 'Invalid command.',
    +	 11 : 'The resource type was not specified in the request.',
    +	 12 : 'The requested resource type is not valid.',
    +	102 : 'Invalid file or folder name.',
    +	103 : 'It was not possible to complete the request due to authorization restrictions.',
    +	104 : 'It was not possible to complete the request due to file system permission restrictions.',
    +	105 : 'Invalid file extension.',
    +	109 : 'Invalid request.',
    +	110 : 'Unknown error.',
    +	111 : 'It was not possible to complete the request due to resulting file size.',
    +	115 : 'A file or folder with the same name already exists.',
    +	116 : 'Folder not found. Please refresh and try again.Otherwise please make sure the folder path is right in the configuration file "sysConfig.properties"!',
    +	117 : 'File not found. Please refresh the files list and try again.',
    +	118 : 'Source and target paths are equal.',
    +	201 : 'A file with the same name is already available. The uploaded file was renamed to "%1".',
    +	202 : 'Invalid file.',
    +	203 : 'Invalid file. The file size is too big.',
    +	204 : 'The uploaded file is corrupt.',
    +	205 : 'No temporary folder is available for upload in the server.',
    +	206 : 'Upload cancelled due to security reasons. The file contains HTML-like data.',
    +	207 : 'The uploaded file was renamed to "%1".',
    +	300 : 'Moving file(s) failed.',
    +	301 : 'Copying file(s) failed.',
    +	500 : 'The file browser is disabled for security reasons. Please contact your system administrator and check the CKFinder configuration file.',
    +	501 : 'The thumbnails support is disabled.'
    +	},
    +
    +	// Other Error Messages.
    +	ErrorMsg :
    +	{
    +		FileEmpty		: 'The file name cannot be empty.',
    +		FileExists		: 'File %s already exists.',
    +		FolderEmpty		: 'The folder name cannot be empty.',
    +		FolderExists	: 'Folder %s already exists.',
    +		FolderNameExists	: 'Folder already exists.',
    +
    +		FileInvChar		: 'The file name cannot contain any of the following characters: \n\\ / : * ? " < > |',
    +		FolderInvChar	: 'The folder name cannot contain any of the following characters: \n\\ / : * ? " < > |',
    +
    +		PopupBlockView	: 'It was not possible to open the file in a new window. Please configure your browser and disable all popup blockers for this site.',
    +		XmlError		: 'It was not possible to properly load the XML response from the web server.',
    +		XmlEmpty		: 'It was not possible to load the XML response from the web server. The server returned an empty response.',
    +		XmlRawResponse	: 'Raw response from the server: %s'
    +	},
    +
    +	// Imageresize plugin
    +	Imageresize :
    +	{
    +		dialogTitle		: 'Resize %s',
    +		sizeTooBig		: 'Cannot set image height or width to a value bigger than the original size (%size).',
    +		resizeSuccess	: 'Image resized successfully.',
    +		thumbnailNew	: 'Create a new thumbnail',
    +		thumbnailSmall	: 'Small (%s)',
    +		thumbnailMedium	: 'Medium (%s)',
    +		thumbnailLarge	: 'Large (%s)',
    +		newSize			: 'Set a new size',
    +		width			: 'Width',
    +		height			: 'Height',
    +		invalidHeight	: 'Invalid height.',
    +		invalidWidth	: 'Invalid width.',
    +		invalidName		: 'Invalid file name.',
    +		newImage		: 'Create a new image',
    +		noExtensionChange : 'File extension cannot be changed.',
    +		imageSmall		: 'Source image is too small.',
    +		contextMenuName	: 'Resize',
    +		lockRatio		: 'Lock ratio',
    +		resetSize		: 'Reset size'
    +	},
    +
    +	// Fileeditor plugin
    +	Fileeditor :
    +	{
    +		save			: 'Save',
    +		fileOpenError	: 'Unable to open file.',
    +		fileSaveSuccess	: 'File saved successfully.',
    +		contextMenuName	: 'Edit',
    +		loadingFile		: 'Loading file, please wait...'
    +	},
    +
    +	Maximize :
    +	{
    +		maximize : 'Maximize',
    +		minimize : 'Minimize'
    +	},
    +
    +	Gallery :
    +	{
    +		current : 'Image {current} of {total}'
    +	},
    +
    +	Zip :
    +	{
    +		extractHereLabel	: 'Extract here',
    +		extractToLabel		: 'Extract to...',
    +		downloadZipLabel	: 'Download as zip',
    +		compressZipLabel	: 'Compress to zip',
    +		removeAndExtract	: 'Remove existing and extract',
    +		extractAndOverwrite	: 'Extract overwriting existing files',
    +		extractSuccess		: 'File extracted successfully.'
    +	},
    +
    +	Search :
    +	{
    +		searchPlaceholder : 'Search'
    +	}
    +};
    diff --git a/src/main/webapp/plug-in/ckfinder/lang/zh-cn.js b/src/main/webapp/plug-in/ckfinder/lang/zh-cn.js
    new file mode 100644
    index 00000000..01eb45a0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/lang/zh-cn.js
    @@ -0,0 +1,312 @@
    +锘/*
    + * CKFinder
    + * ========
    + * http://cksource.com/ckfinder
    + * Copyright (C) 2007-2013, CKSource - Frederico Knabben. All rights reserved.
    + *
    + * The software, this file, and its contents are subject to the CKFinder
    + * License. Please read the license.txt file before using, installing, copying,
    + * modifying, or distributing this file or part of its contents. The contents of
    + * this file is part of the Source Code of CKFinder.
    + *
    + */
    +
    +/**
    + * @fileOverview Defines the {@link CKFinder.lang} object for the Chinese-Simplified
    + *		language.
    + */
    +
    +/**
    + * Contains the dictionary of language entries.
    + * @namespace
    + */
    +CKFinder.lang['zh-cn'] =
    +{
    +	appTitle : 'CKFinder',
    +
    +	// Common messages and labels.
    +	common :
    +	{
    +		// Put the voice-only part of the label in the span.
    +		unavailable		: '%1<span class="cke_accessibility">, 涓嶅彲鐢</span>',
    +		confirmCancel	: '閮ㄥ垎鍐呭灏氭湭淇濆瓨锛岀‘瀹氬叧闂璇濇涔?',
    +		ok				: '纭畾',
    +		cancel			: '鍙栨秷',
    +		confirmationTitle	: '纭',
    +		messageTitle	: '鎻愮ず',
    +		inputTitle		: '璇㈤棶',
    +		undo			: '鎾ら攢',
    +		redo			: '閲嶅仛',
    +		skip			: '璺宠繃',
    +		skipAll			: '鍏ㄩ儴璺宠繃',
    +		makeDecision	: '搴旈噰鍙栦綍鏍锋帾鏂?',
    +		rememberDecision: '涓嬫涓嶅啀璇㈤棶'
    +	},
    +
    +
    +	// Language direction, 'ltr' or 'rtl'.
    +	dir : 'ltr',
    +	HelpLang : 'en',
    +	LangCode : 'zh-cn',
    +
    +	// Date Format
    +	//		d    : Day
    +	//		dd   : Day (padding zero)
    +	//		m    : Month
    +	//		mm   : Month (padding zero)
    +	//		yy   : Year (two digits)
    +	//		yyyy : Year (four digits)
    +	//		h    : Hour (12 hour clock)
    +	//		hh   : Hour (12 hour clock, padding zero)
    +	//		H    : Hour (24 hour clock)
    +	//		HH   : Hour (24 hour clock, padding zero)
    +	//		M    : Minute
    +	//		MM   : Minute (padding zero)
    +	//		a    : Firt char of AM/PM
    +	//		aa   : AM/PM
    +	DateTime : 'yyyy骞磎鏈坉鏃 h:MM aa',
    +	DateAmPm : ['AM', 'PM'],
    +
    +	// Folders
    +	FoldersTitle	: '鏂囦欢澶',
    +	FolderLoading	: '姝e湪鍔犺浇鏂囦欢澶...',
    +	FolderNew		: '璇疯緭鍏ユ柊鏂囦欢澶瑰悕绉: ',
    +	FolderRename	: '璇疯緭鍏ユ柊鏂囦欢澶瑰悕绉: ',
    +	FolderDelete	: '鎮ㄧ‘瀹氳鍒犻櫎鏂囦欢澶 "%1" 鍚?',
    +	FolderRenaming	: ' (姝e湪閲嶅懡鍚...)',
    +	FolderDeleting	: ' (姝e湪鍒犻櫎...)',
    +	DestinationFolder	: 'Destination Folder', // MISSING
    +
    +	// Files
    +	FileRename		: '璇疯緭鍏ユ柊鏂囦欢鍚: ',
    +	FileRenameExt	: '濡傛灉鏀瑰彉鏂囦欢鎵╁睍鍚嶏紝鍙兘浼氬鑷存枃浠朵笉鍙敤銆俓r\n纭畾瑕佹洿鏀瑰悧锛',
    +	FileRenaming	: '姝e湪閲嶅懡鍚...',
    +	FileDelete		: '鎮ㄧ‘瀹氳鍒犻櫎鏂囦欢 "%1" 鍚?',
    +	FilesDelete	: 'Are you sure you want to delete %1 files?', // MISSING
    +	FilesLoading	: '鍔犺浇涓...',
    +	FilesEmpty		: '绌烘枃浠跺す',
    +	DestinationFile	: 'Destination File', // MISSING
    +	SkippedFiles	: 'List of skipped files:', // MISSING
    +
    +	// Basket
    +	BasketFolder		: '涓存椂鏂囦欢澶',
    +	BasketClear			: '娓呯┖涓存椂鏂囦欢澶',
    +	BasketRemove		: '浠庝复鏃舵枃浠跺す绉婚櫎',
    +	BasketOpenFolder	: '鎵撳紑涓存椂鏂囦欢澶',
    +	BasketTruncateConfirm : '纭娓呯┖涓存椂鏂囦欢澶?',
    +	BasketRemoveConfirm	: '纭浠庝复鏃舵枃浠跺す涓Щ闄ゆ枃浠 "%1"锛',
    +	BasketRemoveConfirmMultiple	: 'Do you really want to remove %1 files from the basket?', // MISSING
    +	BasketEmpty			: '涓存椂鏂囦欢澶逛负绌, 鍙嫋鏀炬枃浠惰嚦鍏朵腑銆',
    +	BasketCopyFilesHere	: '浠庝复鏃舵枃浠跺す澶嶅埗鑷虫',
    +	BasketMoveFilesHere	: '浠庝复鏃舵枃浠跺す绉诲姩鑷虫',
    +
    +	// Global messages
    +	OperationCompletedSuccess	: 'Operation completed successfully.', // MISSING
    +	OperationCompletedErrors		: 'Operation completed with errors.', // MISSING
    +	FileError				: '%s: %e', // MISSING
    +
    +	// Move and Copy files
    +	MovedFilesNumber		: 'Number of files moved: %s.', // MISSING
    +	CopiedFilesNumber	: 'Number of files copied: %s.', // MISSING
    +	MoveFailedList		: 'The following files could not be moved:<br />%s', // MISSING
    +	CopyFailedList		: 'The following files could not be copied:<br />%s', // MISSING
    +
    +	// Toolbar Buttons (some used elsewhere)
    +	Upload		: '涓婁紶',
    +	UploadTip	: '涓婁紶鏂囦欢',
    +	Refresh		: '鍒锋柊',
    +	Settings	: '璁剧疆',
    +	Help		: '甯姪',
    +	HelpTip		: '鏌ョ湅鍦ㄧ嚎甯姪',
    +
    +	// Context Menus
    +	Select			: '閫夋嫨',
    +	SelectThumbnail : '閫変腑缂╃暐鍥',
    +	View			: '鏌ョ湅',
    +	Download		: '涓嬭浇',
    +
    +	NewSubFolder	: '鍒涘缓瀛愭枃浠跺す',
    +	Rename			: '閲嶅懡鍚',
    +	Delete			: '鍒犻櫎',
    +	DeleteFiles		: 'Delete Files', // MISSING
    +
    +	CopyDragDrop	: '灏嗘枃浠跺鍒惰嚦姝',
    +	MoveDragDrop	: '灏嗘枃浠剁Щ鍔ㄨ嚦姝',
    +
    +	// Dialogs
    +	RenameDlgTitle		: '閲嶅懡鍚',
    +	NewNameDlgTitle		: '鏂囦欢鍚',
    +	FileExistsDlgTitle	: '鏂囦欢宸插瓨鍦',
    +	SysErrorDlgTitle : '绯荤粺閿欒',
    +
    +	FileOverwrite	: '鑷姩瑕嗙洊閲嶅悕鏂囦欢',
    +	FileAutorename	: '缁欓噸鍚嶆枃浠惰嚜鍔ㄥ懡鍚',
    +	ManuallyRename	: 'Manually rename', // MISSING
    +
    +	// Generic
    +	OkBtn		: '纭畾',
    +	CancelBtn	: '鍙栨秷',
    +	CloseBtn	: '鍏抽棴',
    +
    +	// Upload Panel
    +	UploadTitle			: '涓婁紶鏂囦欢',
    +	UploadSelectLbl		: '閫夊畾瑕佷笂浼犵殑鏂囦欢',
    +	UploadProgressLbl	: '(姝e湪涓婁紶鏂囦欢锛岃绋嶅...)',
    +	UploadBtn			: '涓婁紶閫夊畾鐨勬枃浠',
    +	UploadBtnCancel		: '鍙栨秷',
    +
    +	UploadNoFileMsg		: '璇烽夋嫨涓涓涓婁紶鐨勬枃浠',
    +	UploadNoFolder		: '闇鍏堥夋嫨涓涓枃浠躲',
    +	UploadNoPerms		: '鏃犳枃浠朵笂浼犳潈闄愩',
    +	UploadUnknError		: '涓婁紶鏂囦欢鍑洪敊銆',
    +	UploadExtIncorrect	: '姝ゆ枃浠跺悗缂鍦ㄥ綋鍓嶆枃浠跺す涓笉鍙敤銆',
    +
    +	// Flash Uploads
    +	UploadLabel			: '涓婁紶鏂囦欢',
    +	UploadTotalFiles	: '涓婁紶鎬昏:',
    +	UploadTotalSize		: '涓婁紶鎬诲ぇ灏:',
    +	UploadSend			: '涓婁紶',
    +	UploadAddFiles		: '娣诲姞鏂囦欢',
    +	UploadClearFiles	: '娓呯┖鏂囦欢',
    +	UploadCancel		: '鍙栨秷涓婁紶',
    +	UploadRemove		: '鍒犻櫎',
    +	UploadRemoveTip		: '宸插垹闄!f',
    +	UploadUploaded		: '宸蹭笂浼!n%',
    +	UploadProcessing	: '涓婁紶涓...',
    +
    +	// Settings Panel
    +	SetTitle		: '璁剧疆',
    +	SetView			: '鏌ョ湅:',
    +	SetViewThumb	: '缂╃暐鍥',
    +	SetViewList		: '鍒楄〃',
    +	SetDisplay		: '鏄剧ず:',
    +	SetDisplayName	: '鏂囦欢鍚',
    +	SetDisplayDate	: '鏃ユ湡',
    +	SetDisplaySize	: '澶у皬',
    +	SetSort			: '鎺掑垪椤哄簭:',
    +	SetSortName		: '鎸夋枃浠跺悕',
    +	SetSortDate		: '鎸夋棩鏈',
    +	SetSortSize		: '鎸夊ぇ灏',
    +	SetSortExtension		: '鎸夋墿灞曞悕',
    +
    +	// Status Bar
    +	FilesCountEmpty : '<绌烘枃浠跺す>',
    +	FilesCountOne	: '1 涓枃浠',
    +	FilesCountMany	: '%1 涓枃浠',
    +
    +	// Size and Speed
    +	Kb				: '%1 KB',
    +	Mb				: '%1 MB',
    +	Gb				: '%1 GB',
    +	SizePerSecond	: '%1/s',
    +
    +	// Connector Error Messages.
    +	ErrorUnknown	: '璇锋眰鐨勬搷浣滄湭鑳藉畬鎴. (閿欒 %1)',
    +	Errors :
    +	{
    +	 10 : '鏃犳晥鐨勬寚浠ゃ',
    +	 11 : '鏂囦欢绫诲瀷涓嶅湪璁稿彲鑼冨洿涔嬪唴銆',
    +	 12 : '鏂囦欢绫诲瀷鏃犳晥銆',
    +	102 : '鏃犳晥鐨勬枃浠跺悕鎴栨枃浠跺す鍚嶇О銆',
    +	103 : '鐢变簬浣滆呴檺鍒讹紝璇ヨ姹備笉鑳藉畬鎴愩',
    +	104 : '鐢变簬鏂囦欢绯荤粺鐨勯檺鍒讹紝璇ヨ姹備笉鑳藉畬鎴愩',
    +	105 : '鏃犳晥鐨勬墿灞曞悕銆',
    +	109 : '鏃犳晥璇锋眰銆',
    +	110 : '鏈煡閿欒銆',
    +	111 : 'It was not possible to complete the request due to resulting file size.', // MISSING
    +	115 : '瀛樺湪閲嶅悕鐨勬枃浠舵垨鏂囦欢澶广',
    +	116 : '鏂囦欢澶逛笉瀛樺湪. 璇峰埛鏂板悗鍐嶈瘯銆傚惁鍒欒纭閰嶇疆鏂囦欢sysConfig.properties涓枃浠跺す璺緞鏄惁姝g‘锛',
    +	117 : '鏂囦欢涓嶅瓨鍦. 璇峰埛鏂板垪琛ㄥ悗鍐嶈瘯銆',
    +	118 : '鐩爣浣嶇疆涓庡綋鍓嶄綅缃浉鍚屻',
    +	201 : '鏂囦欢涓庣幇鏈夌殑閲嶅悕. 鏂颁笂浼犵殑鏂囦欢鏀瑰悕涓 "%1"銆',
    +	202 : '鏃犳晥鐨勬枃浠躲',
    +	203 : '鏃犳晥鐨勬枃浠. 鏂囦欢灏哄澶ぇ銆',
    +	204 : '涓婁紶鏂囦欢宸叉崯澶便',
    +	205 : '鏈嶅姟鍣ㄤ腑鐨勪笂浼犱复鏃舵枃浠跺す鏃犳晥銆',
    +	206 : '鍥犱负瀹夊叏鍘熷洜锛屼笂浼犱腑鏂. 涓婁紶鏂囦欢鍖呭惈涓嶈兘 HTML 绫诲瀷鏁版嵁銆',
    +	207 : '鏂颁笂浼犵殑鏂囦欢鏀瑰悕涓 "%1"銆',
    +	300 : '绉诲姩鏂囦欢澶辫触銆',
    +	301 : '澶嶅埗鏂囦欢澶辫触銆',
    +	500 : '鍥犱负瀹夊叏鍘熷洜锛屾枃浠朵笉鍙祻瑙. 璇疯仈绯荤郴缁熺鐞嗗憳骞舵鏌KFinder閰嶇疆鏂囦欢銆',
    +	501 : '涓嶆敮鎸佺缉鐣ュ浘鏂瑰紡銆'
    +	},
    +
    +	// Other Error Messages.
    +	ErrorMsg :
    +	{
    +		FileEmpty		: '鏂囦欢鍚嶄笉鑳戒负绌恒',
    +		FileExists		: '鏂囦欢 %s 宸插瓨鍦ㄣ',
    +		FolderEmpty		: '鏂囦欢澶瑰悕绉颁笉鑳戒负绌恒',
    +		FolderExists	: 'Folder %s already exists.', // MISSING
    +		FolderNameExists	: 'Folder already exists.', // MISSING
    +
    +		FileInvChar		: '鏂囦欢鍚嶄笉鑳藉寘鍚互涓嬪瓧绗: \n\\ / : * ? " < > |',
    +		FolderInvChar	: '鏂囦欢澶瑰悕绉颁笉鑳藉寘鍚互涓嬪瓧绗: \n\\ / : * ? " < > |',
    +
    +		PopupBlockView	: '鏈兘鍦ㄦ柊绐楀彛涓墦寮鏂囦欢. 璇蜂慨鏀规祻瑙堝櫒閰嶇疆瑙i櫎瀵规湰绔欑偣鐨勯攣瀹氥',
    +		XmlError		: '浠庢湇鍔″櫒璇诲彇XML鏁版嵁鍑洪敊',
    +		XmlEmpty		: '鏃犳硶浠庢湇鍔″櫒璇诲彇鏁版嵁锛屽洜XML鍝嶅簲杩斿洖缁撴灉涓虹┖',
    +		XmlRawResponse	: '鏈嶅姟鍣ㄨ繑鍥炲師濮嬬粨鏋: %s'
    +	},
    +
    +	// Imageresize plugin
    +	Imageresize :
    +	{
    +		dialogTitle		: '鏀瑰彉灏哄 %s',
    +		sizeTooBig		: '鏃犳硶澶т簬鍘熷浘灏哄 (%size)銆',
    +		resizeSuccess	: '鍥惧儚灏哄宸蹭慨鏀广',
    +		thumbnailNew	: '鍒涘缓缂╃暐鍥',
    +		thumbnailSmall	: '灏 (%s)',
    +		thumbnailMedium	: '涓 (%s)',
    +		thumbnailLarge	: '澶 (%s)',
    +		newSize			: '璁剧疆鏂板昂瀵',
    +		width			: '瀹藉害',
    +		height			: '楂樺害',
    +		invalidHeight	: '鏃犳晥楂樺害銆',
    +		invalidWidth	: '鏃犳晥瀹藉害銆',
    +		invalidName		: '鏂囦欢鍚嶆棤鏁堛',
    +		newImage		: '鍒涘缓鍥惧儚',
    +		noExtensionChange : '鏃犳硶鏀瑰彉鏂囦欢鍚庣紑銆',
    +		imageSmall		: '鍘熸枃浠跺昂瀵歌繃灏',
    +		contextMenuName	: '鏀瑰彉灏哄',
    +		lockRatio		: '閿佸畾姣斾緥',
    +		resetSize		: '鍘熷灏哄'
    +	},
    +
    +	// Fileeditor plugin
    +	Fileeditor :
    +	{
    +		save			: '淇濆瓨',
    +		fileOpenError	: '鏃犳硶鎵撳紑鏂囦欢銆',
    +		fileSaveSuccess	: '鎴愬姛淇濆瓨鏂囦欢銆',
    +		contextMenuName	: '缂栬緫',
    +		loadingFile		: '鍔犺浇鏂囦欢涓...'
    +	},
    +
    +	Maximize :
    +	{
    +		maximize : '鍏ㄥ睆',
    +		minimize : '鏈灏忓寲'
    +	},
    +
    +	Gallery :
    +	{
    +		current : '绗 {current} 涓浘鍍忥紝鍏 {total} 涓'
    +	},
    +
    +	Zip :
    +	{
    +		extractHereLabel	: 'Extract here', // MISSING
    +		extractToLabel		: 'Extract to...', // MISSING
    +		downloadZipLabel	: 'Download as zip', // MISSING
    +		compressZipLabel	: 'Compress to zip', // MISSING
    +		removeAndExtract	: 'Remove existing and extract', // MISSING
    +		extractAndOverwrite	: 'Extract overwriting existing files', // MISSING
    +		extractSuccess		: 'File extracted successfully.' // MISSING
    +	},
    +
    +	Search :
    +	{
    +		searchPlaceholder : '鎼滅储'
    +	}
    +};
    diff --git a/src/main/webapp/plug-in/ckfinder/lang/zh-tw.js b/src/main/webapp/plug-in/ckfinder/lang/zh-tw.js
    new file mode 100644
    index 00000000..e6a4a251
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/lang/zh-tw.js
    @@ -0,0 +1,312 @@
    +锘/*
    + * CKFinder
    + * ========
    + * http://cksource.com/ckfinder
    + * Copyright (C) 2007-2013, CKSource - Frederico Knabben. All rights reserved.
    + *
    + * The software, this file, and its contents are subject to the CKFinder
    + * License. Please read the license.txt file before using, installing, copying,
    + * modifying, or distributing this file or part of its contents. The contents of
    + * this file is part of the Source Code of CKFinder.
    + *
    + */
    +
    +/**
    + * @fileOverview Defines the {@link CKFinder.lang} object for the Chinese (Taiwan)
    + *		language.
    + */
    +
    +/**
    + * Contains the dictionary of language entries.
    + * @namespace
    + */
    +CKFinder.lang['zh-tw'] =
    +{
    +	appTitle : 'CKFinder',
    +
    +	// Common messages and labels.
    +	common :
    +	{
    +		// Put the voice-only part of the label in the span.
    +		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>', // MISSING
    +		confirmCancel	: 'Some of the options were changed. Are you sure you want to close the dialog window?', // MISSING
    +		ok				: 'OK', // MISSING
    +		cancel			: 'Cancel', // MISSING
    +		confirmationTitle	: 'Confirmation', // MISSING
    +		messageTitle	: 'Information', // MISSING
    +		inputTitle		: 'Question', // MISSING
    +		undo			: 'Undo', // MISSING
    +		redo			: 'Redo', // MISSING
    +		skip			: 'Skip', // MISSING
    +		skipAll			: 'Skip all', // MISSING
    +		makeDecision	: 'What action should be taken?', // MISSING
    +		rememberDecision: 'Remember my decision' // MISSING
    +	},
    +
    +
    +	// Language direction, 'ltr' or 'rtl'.
    +	dir : 'ltr',
    +	HelpLang : 'zh-tw',
    +	LangCode : 'zh-tw',
    +
    +	// Date Format
    +	//		d    : Day
    +	//		dd   : Day (padding zero)
    +	//		m    : Month
    +	//		mm   : Month (padding zero)
    +	//		yy   : Year (two digits)
    +	//		yyyy : Year (four digits)
    +	//		h    : Hour (12 hour clock)
    +	//		hh   : Hour (12 hour clock, padding zero)
    +	//		H    : Hour (24 hour clock)
    +	//		HH   : Hour (24 hour clock, padding zero)
    +	//		M    : Minute
    +	//		MM   : Minute (padding zero)
    +	//		a    : Firt char of AM/PM
    +	//		aa   : AM/PM
    +	DateTime : 'mm/dd/yyyy HH:MM',
    +	DateAmPm : ['涓婂崍', '涓嬪崍'],
    +
    +	// Folders
    +	FoldersTitle	: '鐩寗',
    +	FolderLoading	: '杓夊叆涓...',
    +	FolderNew		: '璜嬭几鍏ユ柊鐩寗鍚嶇ū: ',
    +	FolderRename	: '璜嬭几鍏ユ柊鐩寗鍚嶇ū: ',
    +	FolderDelete	: '纰哄畾鍒櫎 "%1" 閫欏嬬洰閷勫棊?',
    +	FolderRenaming	: ' (淇敼鐩寗...)',
    +	FolderDeleting	: ' (鍒櫎鐩寗...)',
    +	DestinationFolder	: 'Destination Folder', // MISSING
    +
    +	// Files
    +	FileRename		: '璜嬭几鍏ユ柊妾旀鍚嶇ū: ',
    +	FileRenameExt	: '纰哄畾璁婃洿閫欏嬫獢妗堢殑鍓獢鍚嶅棊? 璁婃洿寰 , 姝ゆ獢妗堝彲鑳芥渻鐒℃硶浣跨敤 !',
    +	FileRenaming	: '淇敼妾旀鍚嶇ū...',
    +	FileDelete		: '纰哄畾瑕佸埅闄ら欏嬫獢妗 "%1"?',
    +	FilesDelete	: 'Are you sure you want to delete %1 files?', // MISSING
    +	FilesLoading	: '杓夊叆涓...',
    +	FilesEmpty		: 'The folder is empty.', // MISSING
    +	DestinationFile	: 'Destination File', // MISSING
    +	SkippedFiles	: 'List of skipped files:', // MISSING
    +
    +	// Basket
    +	BasketFolder		: 'Basket', // MISSING
    +	BasketClear			: 'Clear Basket', // MISSING
    +	BasketRemove		: 'Remove from Basket', // MISSING
    +	BasketOpenFolder	: 'Open Parent Folder', // MISSING
    +	BasketTruncateConfirm : 'Do you really want to remove all files from the basket?', // MISSING
    +	BasketRemoveConfirm	: 'Do you really want to remove the file "%1" from the basket?', // MISSING
    +	BasketRemoveConfirmMultiple	: 'Do you really want to remove %1 files from the basket?', // MISSING
    +	BasketEmpty			: 'No files in the basket, drag and drop some.', // MISSING
    +	BasketCopyFilesHere	: 'Copy Files from Basket', // MISSING
    +	BasketMoveFilesHere	: 'Move Files from Basket', // MISSING
    +
    +	// Global messages
    +	OperationCompletedSuccess	: 'Operation completed successfully.', // MISSING
    +	OperationCompletedErrors		: 'Operation completed with errors.', // MISSING
    +	FileError				: '%s: %e', // MISSING
    +
    +	// Move and Copy files
    +	MovedFilesNumber		: 'Number of files moved: %s.', // MISSING
    +	CopiedFilesNumber	: 'Number of files copied: %s.', // MISSING
    +	MoveFailedList		: 'The following files could not be moved:<br />%s', // MISSING
    +	CopyFailedList		: 'The following files could not be copied:<br />%s', // MISSING
    +
    +	// Toolbar Buttons (some used elsewhere)
    +	Upload		: '涓婂偝妾旀',
    +	UploadTip	: '涓婂偝涓鍊嬫柊妾旀',
    +	Refresh		: '閲嶆柊鏁寸悊',
    +	Settings	: '鍋忓ソ瑷畾',
    +	Help		: '瑾槑',
    +	HelpTip		: '瑾槑',
    +
    +	// Context Menus
    +	Select			: '閬告搰',
    +	SelectThumbnail : 'Select Thumbnail', // MISSING
    +	View			: '鐎忚',
    +	Download		: '涓嬭級',
    +
    +	NewSubFolder	: '寤虹珛鏂板瓙鐩寗',
    +	Rename			: '閲嶆柊鍛藉悕',
    +	Delete			: '鍒櫎',
    +	DeleteFiles		: 'Delete Files', // MISSING
    +
    +	CopyDragDrop	: 'Copy Here', // MISSING
    +	MoveDragDrop	: 'Move Here', // MISSING
    +
    +	// Dialogs
    +	RenameDlgTitle		: 'Rename', // MISSING
    +	NewNameDlgTitle		: 'New Name', // MISSING
    +	FileExistsDlgTitle	: 'File Already Exists', // MISSING
    +	SysErrorDlgTitle : 'System Error', // MISSING
    +
    +	FileOverwrite	: 'Overwrite', // MISSING
    +	FileAutorename	: 'Auto-rename', // MISSING
    +	ManuallyRename	: 'Manually rename', // MISSING
    +
    +	// Generic
    +	OkBtn		: '纰哄畾',
    +	CancelBtn	: '鍙栨秷',
    +	CloseBtn	: '闂滈枆',
    +
    +	// Upload Panel
    +	UploadTitle			: '涓婂偝鏂版獢妗',
    +	UploadSelectLbl		: '璜嬮伕鎿囪涓婂偝鐨勬獢妗',
    +	UploadProgressLbl	: '(妾旀涓婂偝涓 , 璜嬬◢鍊...)',
    +	UploadBtn			: '灏囨獢妗堜笂鍌冲埌浼烘湇鍣',
    +	UploadBtnCancel		: '鍙栨秷',
    +
    +	UploadNoFileMsg		: '璜嬪緸浣犵殑闆昏叇閬告搰涓鍊嬫獢妗.',
    +	UploadNoFolder		: 'Please select a folder before uploading.', // MISSING
    +	UploadNoPerms		: 'File upload not allowed.', // MISSING
    +	UploadUnknError		: 'Error sending the file.', // MISSING
    +	UploadExtIncorrect	: 'File extension not allowed in this folder.', // MISSING
    +
    +	// Flash Uploads
    +	UploadLabel			: 'Files to Upload', // MISSING
    +	UploadTotalFiles	: 'Total Files:', // MISSING
    +	UploadTotalSize		: 'Total Size:', // MISSING
    +	UploadSend			: '涓婂偝妾旀',
    +	UploadAddFiles		: 'Add Files', // MISSING
    +	UploadClearFiles	: 'Clear Files', // MISSING
    +	UploadCancel		: 'Cancel Upload', // MISSING
    +	UploadRemove		: 'Remove', // MISSING
    +	UploadRemoveTip		: 'Remove !f', // MISSING
    +	UploadUploaded		: 'Uploaded !n%', // MISSING
    +	UploadProcessing	: 'Processing...', // MISSING
    +
    +	// Settings Panel
    +	SetTitle		: '瑷畾',
    +	SetView			: '鐎忚鏂瑰紡:',
    +	SetViewThumb	: '绺湒闋愯',
    +	SetViewList		: '娓呭柈鍒楄〃',
    +	SetDisplay		: '椤ず娆勪綅:',
    +	SetDisplayName	: '妾旀鍚嶇ū',
    +	SetDisplayDate	: '妾旀鏃ユ湡',
    +	SetDisplaySize	: '妾旀澶у皬',
    +	SetSort			: '鎺掑簭鏂瑰紡:',
    +	SetSortName		: '渚 妾旀鍚嶇ū',
    +	SetSortDate		: '渚 妾旀鏃ユ湡',
    +	SetSortSize		: '渚 妾旀澶у皬',
    +	SetSortExtension		: 'by Extension', // MISSING
    +
    +	// Status Bar
    +	FilesCountEmpty : '<姝ょ洰閷勬矑鏈変换浣曟獢妗>',
    +	FilesCountOne	: '1 鍊嬫獢妗',
    +	FilesCountMany	: '%1 鍊嬫獢妗',
    +
    +	// Size and Speed
    +	Kb				: '%1 KB',
    +	Mb				: '%1 MB', // MISSING
    +	Gb				: '%1 GB', // MISSING
    +	SizePerSecond	: '%1/s', // MISSING
    +
    +	// Connector Error Messages.
    +	ErrorUnknown	: '鐒℃硶閫f帴鍒颁己鏈嶅櫒 ! (閷浠g⒓ %1)',
    +	Errors :
    +	{
    +	 10 : '涓嶅悎娉曠殑鎸囦护.',
    +	 11 : '閫f帴閬庣▼涓 , 鏈寚瀹氳硣婧愬舰鎱 !',
    +	 12 : '閫f帴閬庣▼涓嚭鐝句笉鍚堟硶鐨勮硣婧愬舰鎱 !',
    +	102 : '涓嶅悎娉曠殑妾旀鎴栫洰閷勫悕绋 !',
    +	103 : '鐒℃硶閫f帴锛氬彲鑳芥槸浣跨敤鑰呮瑠闄愯ō瀹氶尟瑾 !',
    +	104 : '鐒℃硶閫f帴锛氬彲鑳芥槸浼烘湇鍣ㄦ獢妗堟瑠闄愯ō瀹氶尟瑾 !',
    +	105 : '鐒℃硶涓婂偝锛氫笉鍚堟硶鐨勫壇妾斿悕 !',
    +	109 : '涓嶅悎娉曠殑璜嬫眰 !',
    +	110 : '涓嶆槑閷 !',
    +	111 : 'It was not possible to complete the request due to resulting file size.', // MISSING
    +	115 : '妾旀鎴栫洰閷勫悕绋遍噸瑜 !',
    +	116 : '鎵句笉鍒扮洰閷 ! 璜嬪厛閲嶆柊鏁寸悊 , 鐒跺緦鍐嶈│涓娆 !鍚﹀墖璜嬬⒑瑾嶉厤缃枃浠秙ysConfig.properties涓枃浠跺ぞ璺緫鏄惁姝g⒑锛',
    +	117 : '鎵句笉鍒版獢妗 ! 璜嬪厛閲嶆柊鏁寸悊 , 鐒跺緦鍐嶈│涓娆 !',
    +	118 : 'Source and target paths are equal.', // MISSING
    +	201 : '浼烘湇鍣ㄤ笂宸叉湁鐩稿悓鐨勬獢妗堝悕绋 ! 鎮ㄤ笂鍌崇殑妾旀鍚嶇ū灏囨渻鑷嫊鏇存敼鐐 "%1".',
    +	202 : '涓嶅悎娉曠殑妾旀 !',
    +	203 : '涓嶅悎娉曠殑妾旀 ! 妾旀澶у皬瓒呴亷闋愯ō鍊 !',
    +	204 : '鎮ㄤ笂鍌崇殑妾旀宸茬稉鎼嶆瘈 !',
    +	205 : '浼烘湇鍣ㄤ笂娌掓湁闋愯ō鐨勬毇瀛樼洰閷 !',
    +	206 : '妾旀涓婂偝绋嬪簭鍥犵偤瀹夊叏鍥犵礌宸茶绯荤当鑷嫊鍙栨秷 ! 鍙兘鏄笂鍌崇殑妾旀鍏у鍖呭惈 HTML 纰 !',
    +	207 : '鎮ㄤ笂鍌崇殑妾旀鍚嶇ū灏囨渻鑷嫊鏇存敼鐐 "%1".',
    +	300 : 'Moving file(s) failed.', // MISSING
    +	301 : 'Copying file(s) failed.', // MISSING
    +	500 : '鍥犵偤瀹夊叏鍥犵礌 , 妾旀鐎忚鍣ㄥ凡琚仠鐢 ! 璜嬭伅绲℃偍鐨勭郴绲辩鐞嗚呬甫妾㈡煡 CKFinder 鐨勮ō瀹氭獢 config.php !',
    +	501 : '绺湒闋愯鍔熻兘宸茶鍋滅敤 !'
    +	},
    +
    +	// Other Error Messages.
    +	ErrorMsg :
    +	{
    +		FileEmpty		: '妾旀鍚嶇ū涓嶈兘绌虹櫧 !',
    +		FileExists		: 'File %s already exists.', // MISSING
    +		FolderEmpty		: '鐩寗鍚嶇ū涓嶈兘绌虹櫧 !',
    +		FolderExists	: 'Folder %s already exists.', // MISSING
    +		FolderNameExists	: 'Folder already exists.', // MISSING
    +
    +		FileInvChar		: '妾旀鍚嶇ū涓嶈兘鍖呭惈浠ヤ笅瀛楀厓锛 \n\\ / : * ? " < > |',
    +		FolderInvChar	: '鐩寗鍚嶇ū涓嶈兘鍖呭惈浠ヤ笅瀛楀厓锛 \n\\ / : * ? " < > |',
    +
    +		PopupBlockView	: '鐒℃硶鍦ㄦ柊瑕栫獥闁嬪暉妾旀 ! 璜嬫鏌ョ忚鍣ㄧ殑瑷畾涓︿笖閲濆皪閫欏嬬恫绔 闂滈枆 <灏侀帠褰堣烦瑕栫獥> 閫欏嬪姛鑳 !',
    +		XmlError		: 'It was not possible to properly load the XML response from the web server.', // MISSING
    +		XmlEmpty		: 'It was not possible to load the XML response from the web server. The server returned an empty response.', // MISSING
    +		XmlRawResponse	: 'Raw response from the server: %s' // MISSING
    +	},
    +
    +	// Imageresize plugin
    +	Imageresize :
    +	{
    +		dialogTitle		: 'Resize %s', // MISSING
    +		sizeTooBig		: 'Cannot set image height or width to a value bigger than the original size (%size).', // MISSING
    +		resizeSuccess	: 'Image resized successfully.', // MISSING
    +		thumbnailNew	: 'Create a new thumbnail', // MISSING
    +		thumbnailSmall	: 'Small (%s)', // MISSING
    +		thumbnailMedium	: 'Medium (%s)', // MISSING
    +		thumbnailLarge	: 'Large (%s)', // MISSING
    +		newSize			: 'Set a new size', // MISSING
    +		width			: 'Width', // MISSING
    +		height			: 'Height', // MISSING
    +		invalidHeight	: 'Invalid height.', // MISSING
    +		invalidWidth	: 'Invalid width.', // MISSING
    +		invalidName		: 'Invalid file name.', // MISSING
    +		newImage		: 'Create a new image', // MISSING
    +		noExtensionChange : 'File extension cannot be changed.', // MISSING
    +		imageSmall		: 'Source image is too small.', // MISSING
    +		contextMenuName	: 'Resize', // MISSING
    +		lockRatio		: 'Lock ratio', // MISSING
    +		resetSize		: 'Reset size' // MISSING
    +	},
    +
    +	// Fileeditor plugin
    +	Fileeditor :
    +	{
    +		save			: 'Save', // MISSING
    +		fileOpenError	: 'Unable to open file.', // MISSING
    +		fileSaveSuccess	: 'File saved successfully.', // MISSING
    +		contextMenuName	: 'Edit', // MISSING
    +		loadingFile		: 'Loading file, please wait...' // MISSING
    +	},
    +
    +	Maximize :
    +	{
    +		maximize : 'Maximize', // MISSING
    +		minimize : 'Minimize' // MISSING
    +	},
    +
    +	Gallery :
    +	{
    +		current : 'Image {current} of {total}' // MISSING
    +	},
    +
    +	Zip :
    +	{
    +		extractHereLabel	: 'Extract here', // MISSING
    +		extractToLabel		: 'Extract to...', // MISSING
    +		downloadZipLabel	: 'Download as zip', // MISSING
    +		compressZipLabel	: 'Compress to zip', // MISSING
    +		removeAndExtract	: 'Remove existing and extract', // MISSING
    +		extractAndOverwrite	: 'Extract overwriting existing files', // MISSING
    +		extractSuccess		: 'File extracted successfully.' // MISSING
    +	},
    +
    +	Search :
    +	{
    +		searchPlaceholder : '鎼滃皨'
    +	}
    +};
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/dummy/lang/en.js b/src/main/webapp/plug-in/ckfinder/plugins/dummy/lang/en.js
    new file mode 100644
    index 00000000..7eda5ddb
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/dummy/lang/en.js
    @@ -0,0 +1,14 @@
    +锘/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +
    +CKFinder.setPluginLang( 'dummy', 'en',
    +{
    +	dummy :
    +	{
    +		title : 'Dummy dialog',
    +		menuItem : 'Open dummy dialog',
    +		typeText : 'Please type some text.'
    +	}
    +});
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/dummy/lang/pl.js b/src/main/webapp/plug-in/ckfinder/plugins/dummy/lang/pl.js
    new file mode 100644
    index 00000000..669963ec
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/dummy/lang/pl.js
    @@ -0,0 +1,14 @@
    +锘/*
    +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://ckeditor.com/license
    +*/
    +
    +CKFinder.setPluginLang( 'dummy', 'pl',
    +		{
    +			dummy :
    +			{
    +				title : 'Testowe okienko',
    +				menuItem : 'Otw贸rz okienko dummy',
    +				typeText : 'Podaj jaki艣 tekst.'
    +			}
    +		});
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/dummy/plugin.js b/src/main/webapp/plug-in/ckfinder/plugins/dummy/plugin.js
    new file mode 100644
    index 00000000..8a88928c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/dummy/plugin.js
    @@ -0,0 +1,72 @@
    +锘/**
    + * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + * For licensing, see LICENSE.html or http://ckeditor.com/license
    + *
    + * CKFinder 2.x - sample "dummy" plugin.
    + *
    + * To enable it, add the following line to config.js:
    + *     config.extraPlugins = 'dummy';
    + */
    +
    +/**
    + * See http://docs.cksource.com/ckfinder_2.x_api/symbols/CKFinder.html#.addPlugin
    + */
    +CKFinder.addPlugin( 'dummy', {
    +
    +	lang : [ 'en', 'pl' ],
    +
    +	appReady : function( api ) {
    +		CKFinder.dialog.add( 'dummydialog', function( api )
    +			{
    +				// CKFinder.dialog.definition
    +				var dialogDefinition =
    +				{
    +					title : api.lang.dummy.title,
    +					minWidth : 390,
    +					minHeight : 230,
    +					onOk : function() {
    +						// "this" is now a CKFinder.dialog object.
    +						var value = this.getValueOf( 'tab1', 'textareaId' );
    +						if ( !value ) {
    +							api.openMsgDialog( '', api.lang.dummy.typeText );
    +							return false;
    +						}
    +						else {
    +							alert( "You have entered: " + value );
    +							return true;
    +						}
    +					},
    +					contents : [
    +						{
    +							id : 'tab1',
    +							label : '',
    +							title : '',
    +							expand : true,
    +							padding : 0,
    +							elements :
    +							[
    +								{
    +									type : 'html',
    +									html : '<h3>' +  api.lang.dummy.typeText + '</h3>'
    +								},
    +								{
    +									type : 'textarea',
    +									id : 'textareaId',
    +									rows : 10,
    +									cols : 40
    +								}
    +							]
    +						}
    +					],
    +					buttons : [ CKFinder.dialog.cancelButton, CKFinder.dialog.okButton ]
    +				};
    +
    +				return dialogDefinition;
    +			} );
    +
    +		api.addFileContextMenuOption( { label : api.lang.dummy.menuItem, command : "dummycommand" } , function( api, file )
    +		{
    +			api.openDialog('dummydialog');
    +		});
    +	}
    +});
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/LICENSE b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/LICENSE
    new file mode 100644
    index 00000000..3916e96b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/LICENSE
    @@ -0,0 +1,23 @@
    +Copyright (C) 2012 by Marijn Haverbeke <marijnh@gmail.com>
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy
    +of this software and associated documentation files (the "Software"), to deal
    +in the Software without restriction, including without limitation the rights
    +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    +copies of the Software, and to permit persons to whom the Software is
    +furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in
    +all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    +THE SOFTWARE.
    +
    +Please note that some subdirectories of the CodeMirror distribution
    +include their own LICENSE files, and are released under different
    +licences.
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/lib/codemirror.css b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/lib/codemirror.css
    new file mode 100644
    index 00000000..9c9c29aa
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/lib/codemirror.css
    @@ -0,0 +1,114 @@
    +.CodeMirror {
    +  line-height: 1em;
    +  font-family: monospace;
    +}
    +
    +.CodeMirror-scroll {
    +  overflow: auto;
    +  height: 300px;
    +  /* This is needed to prevent an IE[67] bug where the scrolled content
    +     is visible outside of the scrolling box. */
    +  position: relative;
    +  outline: none;
    +}
    +
    +.CodeMirror-gutter {
    +  position: absolute; left: 0; top: 0;
    +  z-index: 10;
    +  background-color: #f7f7f7;
    +  border-right: 1px solid #eee;
    +  min-width: 2em;
    +  height: 100%;
    +}
    +.CodeMirror-gutter-text {
    +  color: #aaa;
    +  text-align: right;
    +  padding: .4em .2em .4em .4em;
    +  white-space: pre !important;
    +}
    +.CodeMirror-lines {
    +  padding: .4em;
    +  white-space: pre;
    +}
    +
    +.CodeMirror pre {
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  -o-border-radius: 0;
    +  border-radius: 0;
    +  border-width: 0; margin: 0; padding: 0; background: transparent;
    +  font-family: inherit;
    +  font-size: inherit;
    +  padding: 0; margin: 0;
    +  white-space: pre;
    +  word-wrap: normal;
    +  line-height: inherit;
    +}
    +
    +.CodeMirror-wrap pre {
    +  word-wrap: break-word;
    +  white-space: pre-wrap;
    +  word-break: normal;
    +}
    +.CodeMirror-wrap .CodeMirror-scroll {
    +  overflow-x: hidden;
    +}
    +
    +.CodeMirror textarea {
    +  outline: none !important;
    +}
    +
    +.CodeMirror pre.CodeMirror-cursor {
    +  z-index: 10;
    +  position: absolute;
    +  visibility: hidden;
    +  border-left: 1px solid black;
    +  border-right:none;
    +  width:0;
    +}
    +.CodeMirror pre.CodeMirror-cursor.CodeMirror-overwrite {}
    +.CodeMirror-focused pre.CodeMirror-cursor {
    +  visibility: visible;
    +}
    +
    +div.CodeMirror-selected { background: #d9d9d9; }
    +.CodeMirror-focused div.CodeMirror-selected { background: #d7d4f0; }
    +
    +.CodeMirror-searching {
    +  background: #ffa;
    +  background: rgba(255, 255, 0, .4);
    +}
    +
    +/* Default theme */
    +
    +.cm-s-default span.cm-keyword {color: #708;}
    +.cm-s-default span.cm-atom {color: #219;}
    +.cm-s-default span.cm-number {color: #164;}
    +.cm-s-default span.cm-def {color: #00f;}
    +.cm-s-default span.cm-variable {color: black;}
    +.cm-s-default span.cm-variable-2 {color: #05a;}
    +.cm-s-default span.cm-variable-3 {color: #085;}
    +.cm-s-default span.cm-property {color: black;}
    +.cm-s-default span.cm-operator {color: black;}
    +.cm-s-default span.cm-comment {color: #a50;}
    +.cm-s-default span.cm-string {color: #a11;}
    +.cm-s-default span.cm-string-2 {color: #f50;}
    +.cm-s-default span.cm-meta {color: #555;}
    +.cm-s-default span.cm-error {color: #f00;}
    +.cm-s-default span.cm-qualifier {color: #555;}
    +.cm-s-default span.cm-builtin {color: #30a;}
    +.cm-s-default span.cm-bracket {color: #cc7;}
    +.cm-s-default span.cm-tag {color: #170;}
    +.cm-s-default span.cm-attribute {color: #00c;}
    +.cm-s-default span.cm-header {color: #a0a;}
    +.cm-s-default span.cm-quote {color: #090;}
    +.cm-s-default span.cm-hr {color: #999;}
    +.cm-s-default span.cm-link {color: #00c;}
    +
    +span.cm-header, span.cm-strong {font-weight: bold;}
    +span.cm-em {font-style: italic;}
    +span.cm-emstrong {font-style: italic; font-weight: bold;}
    +span.cm-link {text-decoration: underline;}
    +
    +div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
    +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/lib/codemirror.js b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/lib/codemirror.js
    new file mode 100644
    index 00000000..2c558271
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/lib/codemirror.js
    @@ -0,0 +1,3047 @@
    +锘// CodeMirror version 2.24
    +//
    +// All functions that need access to the editor's state live inside
    +// the CodeMirror function. Below that, at the bottom of the file,
    +// some utilities are defined.
    +
    +// CodeMirror is the only global var we claim
    +var CodeMirror = (function() {
    +  // This is the function that produces an editor instance. Its
    +  // closure is used to store the editor state.
    +  function CodeMirror(place, givenOptions) {
    +    // Determine effective options based on given values and defaults.
    +    var options = {}, defaults = CodeMirror.defaults;
    +    for (var opt in defaults)
    +      if (defaults.hasOwnProperty(opt))
    +        options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt];
    +
    +    // The element in which the editor lives.
    +    var wrapper = document.createElement("div");
    +    wrapper.className = "CodeMirror" + (options.lineWrapping ? " CodeMirror-wrap" : "");
    +    // This mess creates the base DOM structure for the editor.
    +    wrapper.innerHTML =
    +      '<div style="overflow: hidden; position: relative; width: 3px; height: 0px;">' + // Wraps and hides input textarea
    +        '<textarea style="position: absolute; padding: 0; width: 1px; height: 1em" wrap="off" ' +
    +          'autocorrect="off" autocapitalize="off"></textarea></div>' +
    +      '<div class="CodeMirror-scroll" tabindex="-1">' +
    +        '<div style="position: relative">' + // Set to the height of the text, causes scrolling
    +          '<div style="position: relative">' + // Moved around its parent to cover visible view
    +            '<div class="CodeMirror-gutter"><div class="CodeMirror-gutter-text"></div></div>' +
    +            // Provides positioning relative to (visible) text origin
    +            '<div class="CodeMirror-lines"><div style="position: relative; z-index: 0">' +
    +              '<div style="position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden;"></div>' +
    +              '<pre class="CodeMirror-cursor">&#160;</pre>' + // Absolutely positioned blinky cursor
    +              '<div style="position: relative; z-index: -1"></div><div></div>' + // DIVs containing the selection and the actual code
    +            '</div></div></div></div></div>';
    +    if (place.appendChild) place.appendChild(wrapper); else place(wrapper);
    +    // I've never seen more elegant code in my life.
    +    var inputDiv = wrapper.firstChild, input = inputDiv.firstChild,
    +        scroller = wrapper.lastChild, code = scroller.firstChild,
    +        mover = code.firstChild, gutter = mover.firstChild, gutterText = gutter.firstChild,
    +        lineSpace = gutter.nextSibling.firstChild, measure = lineSpace.firstChild,
    +        cursor = measure.nextSibling, selectionDiv = cursor.nextSibling,
    +        lineDiv = selectionDiv.nextSibling;
    +    themeChanged();
    +    // Needed to hide big blue blinking cursor on Mobile Safari
    +    if (ios) input.style.width = "0px";
    +    if (!webkit) lineSpace.draggable = true;
    +    lineSpace.style.outline = "none";
    +    if (options.tabindex != null) input.tabIndex = options.tabindex;
    +    if (options.autofocus) focusInput();
    +    if (!options.gutter && !options.lineNumbers) gutter.style.display = "none";
    +    // Needed to handle Tab key in KHTML
    +    if (khtml) inputDiv.style.height = "1px", inputDiv.style.position = "absolute";
    +
    +    // Check for problem with IE innerHTML not working when we have a
    +    // P (or similar) parent node.
    +    try { stringWidth("x"); }
    +    catch (e) {
    +      if (e.message.match(/runtime/i))
    +        e = new Error("A CodeMirror inside a P-style element does not work in Internet Explorer. (innerHTML bug)");
    +      throw e;
    +    }
    +
    +    // Delayed object wrap timeouts, making sure only one is active. blinker holds an interval.
    +    var poll = new Delayed(), highlight = new Delayed(), blinker;
    +
    +    // mode holds a mode API object. doc is the tree of Line objects,
    +    // work an array of lines that should be parsed, and history the
    +    // undo history (instance of History constructor).
    +    var mode, doc = new BranchChunk([new LeafChunk([new Line("")])]), work, focused;
    +    loadMode();
    +    // The selection. These are always maintained to point at valid
    +    // positions. Inverted is used to remember that the user is
    +    // selecting bottom-to-top.
    +    var sel = {from: {line: 0, ch: 0}, to: {line: 0, ch: 0}, inverted: false};
    +    // Selection-related flags. shiftSelecting obviously tracks
    +    // whether the user is holding shift.
    +    var shiftSelecting, lastClick, lastDoubleClick, lastScrollPos = 0, draggingText,
    +        overwrite = false, suppressEdits = false;
    +    // Variables used by startOperation/endOperation to track what
    +    // happened during the operation.
    +    var updateInput, userSelChange, changes, textChanged, selectionChanged, leaveInputAlone,
    +        gutterDirty, callbacks;
    +    // Current visible range (may be bigger than the view window).
    +    var displayOffset = 0, showingFrom = 0, showingTo = 0, lastSizeC = 0;
    +    // bracketHighlighted is used to remember that a bracket has been
    +    // marked.
    +    var bracketHighlighted;
    +    // Tracks the maximum line length so that the horizontal scrollbar
    +    // can be kept static when scrolling.
    +    var maxLine = "", maxWidth;
    +    var tabCache = {};
    +
    +    // Initialize the content.
    +    operation(function(){setValue(options.value || ""); updateInput = false;})();
    +    var history = new History();
    +
    +    // Register our event handlers.
    +    connect(scroller, "mousedown", operation(onMouseDown));
    +    connect(scroller, "dblclick", operation(onDoubleClick));
    +    connect(lineSpace, "selectstart", e_preventDefault);
    +    // Gecko browsers fire contextmenu *after* opening the menu, at
    +    // which point we can't mess with it anymore. Context menu is
    +    // handled in onMouseDown for Gecko.
    +    if (!gecko) connect(scroller, "contextmenu", onContextMenu);
    +    connect(scroller, "scroll", function() {
    +      lastScrollPos = scroller.scrollTop;
    +      updateDisplay([]);
    +      if (options.fixedGutter) gutter.style.left = scroller.scrollLeft + "px";
    +      if (options.onScroll) options.onScroll(instance);
    +    });
    +    connect(window, "resize", function() {updateDisplay(true);});
    +    connect(input, "keyup", operation(onKeyUp));
    +    connect(input, "input", fastPoll);
    +    connect(input, "keydown", operation(onKeyDown));
    +    connect(input, "keypress", operation(onKeyPress));
    +    connect(input, "focus", onFocus);
    +    connect(input, "blur", onBlur);
    +
    +    if (options.dragDrop) {
    +      connect(lineSpace, "dragstart", onDragStart);
    +      function drag_(e) {
    +        if (options.onDragEvent && options.onDragEvent(instance, addStop(e))) return;
    +        e_stop(e);
    +      }
    +      connect(scroller, "dragenter", drag_);
    +      connect(scroller, "dragover", drag_);
    +      connect(scroller, "drop", operation(onDrop));
    +    }
    +    connect(scroller, "paste", function(){focusInput(); fastPoll();});
    +    connect(input, "paste", fastPoll);
    +    connect(input, "cut", operation(function(){
    +      if (!options.readOnly) replaceSelection("");
    +    }));
    +
    +    // Needed to handle Tab key in KHTML
    +    if (khtml) connect(code, "mouseup", function() {
    +        if (document.activeElement == input) input.blur();
    +        focusInput();
    +    });
    +
    +    // IE throws unspecified error in certain cases, when
    +    // trying to access activeElement before onload
    +    var hasFocus; try { hasFocus = (document.activeElement == input); } catch(e) { }
    +    if (hasFocus || options.autofocus) setTimeout(onFocus, 20);
    +    else onBlur();
    +
    +    function isLine(l) {return l >= 0 && l < doc.size;}
    +    // The instance object that we'll return. Mostly calls out to
    +    // local functions in the CodeMirror function. Some do some extra
    +    // range checking and/or clipping. operation is used to wrap the
    +    // call so that changes it makes are tracked, and the display is
    +    // updated afterwards.
    +    var instance = wrapper.CodeMirror = {
    +      getValue: getValue,
    +      setValue: operation(setValue),
    +      getSelection: getSelection,
    +      replaceSelection: operation(replaceSelection),
    +      focus: function(){window.focus(); focusInput(); onFocus(); fastPoll();},
    +      setOption: function(option, value) {
    +        var oldVal = options[option];
    +        options[option] = value;
    +        if (option == "mode" || option == "indentUnit") loadMode();
    +        else if (option == "readOnly" && value == "nocursor") {onBlur(); input.blur();}
    +        else if (option == "readOnly" && !value) {resetInput(true);}
    +        else if (option == "theme") themeChanged();
    +        else if (option == "lineWrapping" && oldVal != value) operation(wrappingChanged)();
    +        else if (option == "tabSize") updateDisplay(true);
    +        if (option == "lineNumbers" || option == "gutter" || option == "firstLineNumber" || option == "theme") {
    +          gutterChanged();
    +          updateDisplay(true);
    +        }
    +      },
    +      getOption: function(option) {return options[option];},
    +      undo: operation(undo),
    +      redo: operation(redo),
    +      indentLine: operation(function(n, dir) {
    +        if (typeof dir != "string") {
    +          if (dir == null) dir = options.smartIndent ? "smart" : "prev";
    +          else dir = dir ? "add" : "subtract";
    +        }
    +        if (isLine(n)) indentLine(n, dir);
    +      }),
    +      indentSelection: operation(indentSelected),
    +      historySize: function() {return {undo: history.done.length, redo: history.undone.length};},
    +      clearHistory: function() {history = new History();},
    +      matchBrackets: operation(function(){matchBrackets(true);}),
    +      getTokenAt: operation(function(pos) {
    +        pos = clipPos(pos);
    +        return getLine(pos.line).getTokenAt(mode, getStateBefore(pos.line), pos.ch);
    +      }),
    +      getStateAfter: function(line) {
    +        line = clipLine(line == null ? doc.size - 1: line);
    +        return getStateBefore(line + 1);
    +      },
    +      cursorCoords: function(start, mode) {
    +        if (start == null) start = sel.inverted;
    +        return this.charCoords(start ? sel.from : sel.to, mode);
    +      },
    +      charCoords: function(pos, mode) {
    +        pos = clipPos(pos);
    +        if (mode == "local") return localCoords(pos, false);
    +        if (mode == "div") return localCoords(pos, true);
    +        return pageCoords(pos);
    +      },
    +      coordsChar: function(coords) {
    +        var off = eltOffset(lineSpace);
    +        return coordsChar(coords.x - off.left, coords.y - off.top);
    +      },
    +      markText: operation(markText),
    +      setBookmark: setBookmark,
    +      findMarksAt: findMarksAt,
    +      setMarker: operation(addGutterMarker),
    +      clearMarker: operation(removeGutterMarker),
    +      setLineClass: operation(setLineClass),
    +      hideLine: operation(function(h) {return setLineHidden(h, true);}),
    +      showLine: operation(function(h) {return setLineHidden(h, false);}),
    +      onDeleteLine: function(line, f) {
    +        if (typeof line == "number") {
    +          if (!isLine(line)) return null;
    +          line = getLine(line);
    +        }
    +        (line.handlers || (line.handlers = [])).push(f);
    +        return line;
    +      },
    +      lineInfo: lineInfo,
    +      addWidget: function(pos, node, scroll, vert, horiz) {
    +        pos = localCoords(clipPos(pos));
    +        var top = pos.yBot, left = pos.x;
    +        node.style.position = "absolute";
    +        code.appendChild(node);
    +        if (vert == "over") top = pos.y;
    +        else if (vert == "near") {
    +          var vspace = Math.max(scroller.offsetHeight, doc.height * textHeight()),
    +              hspace = Math.max(code.clientWidth, lineSpace.clientWidth) - paddingLeft();
    +          if (pos.yBot + node.offsetHeight > vspace && pos.y > node.offsetHeight)
    +            top = pos.y - node.offsetHeight;
    +          if (left + node.offsetWidth > hspace)
    +            left = hspace - node.offsetWidth;
    +        }
    +        node.style.top = (top + paddingTop()) + "px";
    +        node.style.left = node.style.right = "";
    +        if (horiz == "right") {
    +          left = code.clientWidth - node.offsetWidth;
    +          node.style.right = "0px";
    +        } else {
    +          if (horiz == "left") left = 0;
    +          else if (horiz == "middle") left = (code.clientWidth - node.offsetWidth) / 2;
    +          node.style.left = (left + paddingLeft()) + "px";
    +        }
    +        if (scroll)
    +          scrollIntoView(left, top, left + node.offsetWidth, top + node.offsetHeight);
    +      },
    +
    +      lineCount: function() {return doc.size;},
    +      clipPos: clipPos,
    +      getCursor: function(start) {
    +        if (start == null) start = sel.inverted;
    +        return copyPos(start ? sel.from : sel.to);
    +      },
    +      somethingSelected: function() {return !posEq(sel.from, sel.to);},
    +      setCursor: operation(function(line, ch, user) {
    +        if (ch == null && typeof line.line == "number") setCursor(line.line, line.ch, user);
    +        else setCursor(line, ch, user);
    +      }),
    +      setSelection: operation(function(from, to, user) {
    +        (user ? setSelectionUser : setSelection)(clipPos(from), clipPos(to || from));
    +      }),
    +      getLine: function(line) {if (isLine(line)) return getLine(line).text;},
    +      getLineHandle: function(line) {if (isLine(line)) return getLine(line);},
    +      setLine: operation(function(line, text) {
    +        if (isLine(line)) replaceRange(text, {line: line, ch: 0}, {line: line, ch: getLine(line).text.length});
    +      }),
    +      removeLine: operation(function(line) {
    +        if (isLine(line)) replaceRange("", {line: line, ch: 0}, clipPos({line: line+1, ch: 0}));
    +      }),
    +      replaceRange: operation(replaceRange),
    +      getRange: function(from, to) {return getRange(clipPos(from), clipPos(to));},
    +
    +      triggerOnKeyDown: operation(onKeyDown),
    +      execCommand: function(cmd) {return commands[cmd](instance);},
    +      // Stuff used by commands, probably not much use to outside code.
    +      moveH: operation(moveH),
    +      deleteH: operation(deleteH),
    +      moveV: operation(moveV),
    +      toggleOverwrite: function() {
    +        if(overwrite){
    +          overwrite = false;
    +          cursor.className = cursor.className.replace(" CodeMirror-overwrite", "");
    +        } else {
    +          overwrite = true;
    +          cursor.className += " CodeMirror-overwrite";
    +        }
    +      },
    +
    +      posFromIndex: function(off) {
    +        var lineNo = 0, ch;
    +        doc.iter(0, doc.size, function(line) {
    +          var sz = line.text.length + 1;
    +          if (sz > off) { ch = off; return true; }
    +          off -= sz;
    +          ++lineNo;
    +        });
    +        return clipPos({line: lineNo, ch: ch});
    +      },
    +      indexFromPos: function (coords) {
    +        if (coords.line < 0 || coords.ch < 0) return 0;
    +        var index = coords.ch;
    +        doc.iter(0, coords.line, function (line) {
    +          index += line.text.length + 1;
    +        });
    +        return index;
    +      },
    +      scrollTo: function(x, y) {
    +        if (x != null) scroller.scrollLeft = x;
    +        if (y != null) scroller.scrollTop = y;
    +        updateDisplay([]);
    +      },
    +
    +      operation: function(f){return operation(f)();},
    +      compoundChange: function(f){return compoundChange(f);},
    +      refresh: function(){
    +        updateDisplay(true);
    +        if (scroller.scrollHeight > lastScrollPos)
    +          scroller.scrollTop = lastScrollPos;
    +      },
    +      getInputField: function(){return input;},
    +      getWrapperElement: function(){return wrapper;},
    +      getScrollerElement: function(){return scroller;},
    +      getGutterElement: function(){return gutter;}
    +    };
    +
    +    function getLine(n) { return getLineAt(doc, n); }
    +    function updateLineHeight(line, height) {
    +      gutterDirty = true;
    +      var diff = height - line.height;
    +      for (var n = line; n; n = n.parent) n.height += diff;
    +    }
    +
    +    function setValue(code) {
    +      var top = {line: 0, ch: 0};
    +      updateLines(top, {line: doc.size - 1, ch: getLine(doc.size-1).text.length},
    +                  splitLines(code), top, top);
    +      updateInput = true;
    +    }
    +    function getValue() {
    +      var text = [];
    +      doc.iter(0, doc.size, function(line) { text.push(line.text); });
    +      return text.join("\n");
    +    }
    +
    +    function onMouseDown(e) {
    +      setShift(e_prop(e, "shiftKey"));
    +      // Check whether this is a click in a widget
    +      for (var n = e_target(e); n != wrapper; n = n.parentNode)
    +        if (n.parentNode == code && n != mover) return;
    +
    +      // See if this is a click in the gutter
    +      for (var n = e_target(e); n != wrapper; n = n.parentNode)
    +        if (n.parentNode == gutterText) {
    +          if (options.onGutterClick)
    +            options.onGutterClick(instance, indexOf(gutterText.childNodes, n) + showingFrom, e);
    +          return e_preventDefault(e);
    +        }
    +
    +      var start = posFromMouse(e);
    +
    +      switch (e_button(e)) {
    +      case 3:
    +        if (gecko && !mac) onContextMenu(e);
    +        return;
    +      case 2:
    +        if (start) setCursor(start.line, start.ch, true);
    +        return;
    +      }
    +      // For button 1, if it was clicked inside the editor
    +      // (posFromMouse returning non-null), we have to adjust the
    +      // selection.
    +      if (!start) {if (e_target(e) == scroller) e_preventDefault(e); return;}
    +
    +      if (!focused) onFocus();
    +
    +      var now = +new Date;
    +      if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {
    +        e_preventDefault(e);
    +        setTimeout(focusInput, 20);
    +        return selectLine(start.line);
    +      } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) {
    +        lastDoubleClick = {time: now, pos: start};
    +        e_preventDefault(e);
    +        return selectWordAt(start);
    +      } else { lastClick = {time: now, pos: start}; }
    +
    +      var last = start, going;
    +      if (options.dragDrop && dragAndDrop && !options.readOnly && !posEq(sel.from, sel.to) &&
    +          !posLess(start, sel.from) && !posLess(sel.to, start)) {
    +        // Let the drag handler handle this.
    +        if (webkit) lineSpace.draggable = true;
    +        function dragEnd(e2) {
    +          if (webkit) lineSpace.draggable = false;
    +          draggingText = false;
    +          up(); drop();
    +          if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
    +            e_preventDefault(e2);
    +            setCursor(start.line, start.ch, true);
    +            focusInput();
    +          }
    +        }
    +        var up = connect(document, "mouseup", operation(dragEnd), true);
    +        var drop = connect(scroller, "drop", operation(dragEnd), true);
    +        draggingText = true;
    +        // IE's approach to draggable
    +        if (lineSpace.dragDrop) lineSpace.dragDrop();
    +        return;
    +      }
    +      e_preventDefault(e);
    +      setCursor(start.line, start.ch, true);
    +
    +      function extend(e) {
    +        var cur = posFromMouse(e, true);
    +        if (cur && !posEq(cur, last)) {
    +          if (!focused) onFocus();
    +          last = cur;
    +          setSelectionUser(start, cur);
    +          updateInput = false;
    +          var visible = visibleLines();
    +          if (cur.line >= visible.to || cur.line < visible.from)
    +            going = setTimeout(operation(function(){extend(e);}), 150);
    +        }
    +      }
    +
    +      function done(e) {
    +        clearTimeout(going);
    +        var cur = posFromMouse(e);
    +        if (cur) setSelectionUser(start, cur);
    +        e_preventDefault(e);
    +        focusInput();
    +        updateInput = true;
    +        move(); up();
    +      }
    +      var move = connect(document, "mousemove", operation(function(e) {
    +        clearTimeout(going);
    +        e_preventDefault(e);
    +        if (!ie && !e_button(e)) done(e);
    +        else extend(e);
    +      }), true);
    +      var up = connect(document, "mouseup", operation(done), true);
    +    }
    +    function onDoubleClick(e) {
    +      for (var n = e_target(e); n != wrapper; n = n.parentNode)
    +        if (n.parentNode == gutterText) return e_preventDefault(e);
    +      var start = posFromMouse(e);
    +      if (!start) return;
    +      lastDoubleClick = {time: +new Date, pos: start};
    +      e_preventDefault(e);
    +      selectWordAt(start);
    +    }
    +    function onDrop(e) {
    +      if (options.onDragEvent && options.onDragEvent(instance, addStop(e))) return;
    +      e.preventDefault();
    +      var pos = posFromMouse(e, true), files = e.dataTransfer.files;
    +      if (!pos || options.readOnly) return;
    +      if (files && files.length && window.FileReader && window.File) {
    +        function loadFile(file, i) {
    +          var reader = new FileReader;
    +          reader.onload = function() {
    +            text[i] = reader.result;
    +            if (++read == n) {
    +              pos = clipPos(pos);
    +              operation(function() {
    +                var end = replaceRange(text.join(""), pos, pos);
    +                setSelectionUser(pos, end);
    +              })();
    +            }
    +          };
    +          reader.readAsText(file);
    +        }
    +        var n = files.length, text = Array(n), read = 0;
    +        for (var i = 0; i < n; ++i) loadFile(files[i], i);
    +      }
    +      else {
    +        try {
    +          var text = e.dataTransfer.getData("Text");
    +          if (text) {
    +            compoundChange(function() {
    +              var curFrom = sel.from, curTo = sel.to;
    +              setSelectionUser(pos, pos);
    +              if (draggingText) replaceRange("", curFrom, curTo);
    +              replaceSelection(text);
    +              focusInput();
    +            });
    +          }
    +        }
    +        catch(e){}
    +      }
    +    }
    +    function onDragStart(e) {
    +      var txt = getSelection();
    +      e.dataTransfer.setData("Text", txt);
    +
    +      // Use dummy image instead of default browsers image.
    +      if (gecko || chrome) {
    +        var img = document.createElement('img');
    +        img.scr = 'data:image/gif;base64,R0lGODdhAgACAIAAAAAAAP///ywAAAAAAgACAAACAoRRADs='; //1x1 image
    +        e.dataTransfer.setDragImage(img, 0, 0);
    +      }
    +    }
    +
    +    function doHandleBinding(bound, dropShift) {
    +      if (typeof bound == "string") {
    +        bound = commands[bound];
    +        if (!bound) return false;
    +      }
    +      var prevShift = shiftSelecting;
    +      try {
    +        if (options.readOnly) suppressEdits = true;
    +        if (dropShift) shiftSelecting = null;
    +        bound(instance);
    +      } catch(e) {
    +        if (e != Pass) throw e;
    +        return false;
    +      } finally {
    +        shiftSelecting = prevShift;
    +        suppressEdits = false;
    +      }
    +      return true;
    +    }
    +    function handleKeyBinding(e) {
    +      // Handle auto keymap transitions
    +      var startMap = getKeyMap(options.keyMap), next = startMap.auto;
    +      clearTimeout(maybeTransition);
    +      if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {
    +        if (getKeyMap(options.keyMap) == startMap) {
    +          options.keyMap = (next.call ? next.call(null, instance) : next);
    +        }
    +      }, 50);
    +
    +      var name = keyNames[e_prop(e, "keyCode")], handled = false;
    +      if (name == null || e.altGraphKey) return false;
    +      if (e_prop(e, "altKey")) name = "Alt-" + name;
    +      if (e_prop(e, "ctrlKey")) name = "Ctrl-" + name;
    +      if (e_prop(e, "metaKey")) name = "Cmd-" + name;
    +
    +      var stopped = false;
    +      function stop() { stopped = true; }
    +
    +      if (e_prop(e, "shiftKey")) {
    +        handled = lookupKey("Shift-" + name, options.extraKeys, options.keyMap,
    +                            function(b) {return doHandleBinding(b, true);}, stop)
    +               || lookupKey(name, options.extraKeys, options.keyMap, function(b) {
    +                 if (typeof b == "string" && /^go[A-Z]/.test(b)) return doHandleBinding(b);
    +               }, stop);
    +      } else {
    +        handled = lookupKey(name, options.extraKeys, options.keyMap, doHandleBinding, stop);
    +      }
    +      if (stopped) handled = false;
    +      if (handled) {
    +        e_preventDefault(e);
    +        if (ie) { e.oldKeyCode = e.keyCode; e.keyCode = 0; }
    +      }
    +      return handled;
    +    }
    +    function handleCharBinding(e, ch) {
    +      var handled = lookupKey("'" + ch + "'", options.extraKeys,
    +                              options.keyMap, function(b) { return doHandleBinding(b, true); });
    +      if (handled) e_preventDefault(e);
    +      return handled;
    +    }
    +
    +    var lastStoppedKey = null, maybeTransition;
    +    function onKeyDown(e) {
    +      if (!focused) onFocus();
    +      if (ie && e.keyCode == 27) { e.returnValue = false; }
    +      if (pollingFast) { if (readInput()) pollingFast = false; }
    +      if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
    +      var code = e_prop(e, "keyCode");
    +      // IE does strange things with escape.
    +      setShift(code == 16 || e_prop(e, "shiftKey"));
    +      // First give onKeyEvent option a chance to handle this.
    +      var handled = handleKeyBinding(e);
    +      if (window.opera) {
    +        lastStoppedKey = handled ? code : null;
    +        // Opera has no cut event... we try to at least catch the key combo
    +        if (!handled && code == 88 && e_prop(e, mac ? "metaKey" : "ctrlKey"))
    +          replaceSelection("");
    +      }
    +    }
    +    function onKeyPress(e) {
    +      if (pollingFast) readInput();
    +      if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
    +      var keyCode = e_prop(e, "keyCode"), charCode = e_prop(e, "charCode");
    +      if (window.opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
    +      if (((window.opera && !e.which) || khtml) && handleKeyBinding(e)) return;
    +      var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
    +      if (options.electricChars && mode.electricChars && options.smartIndent && !options.readOnly) {
    +        if (mode.electricChars.indexOf(ch) > -1)
    +          setTimeout(operation(function() {indentLine(sel.to.line, "smart");}), 75);
    +      }
    +      if (handleCharBinding(e, ch)) return;
    +      fastPoll();
    +    }
    +    function onKeyUp(e) {
    +      if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
    +      if (e_prop(e, "keyCode") == 16) shiftSelecting = null;
    +    }
    +
    +    function onFocus() {
    +      if (options.readOnly == "nocursor") return;
    +      if (!focused) {
    +        if (options.onFocus) options.onFocus(instance);
    +        focused = true;
    +        if (wrapper.className.search(/\bCodeMirror-focused\b/) == -1)
    +          wrapper.className += " CodeMirror-focused";
    +        if (!leaveInputAlone) resetInput(true);
    +      }
    +      slowPoll();
    +      restartBlink();
    +    }
    +    function onBlur() {
    +      if (focused) {
    +        if (options.onBlur) options.onBlur(instance);
    +        focused = false;
    +        if (bracketHighlighted)
    +          operation(function(){
    +            if (bracketHighlighted) { bracketHighlighted(); bracketHighlighted = null; }
    +          })();
    +        wrapper.className = wrapper.className.replace(" CodeMirror-focused", "");
    +      }
    +      clearInterval(blinker);
    +      setTimeout(function() {if (!focused) shiftSelecting = null;}, 150);
    +    }
    +
    +    // Replace the range from from to to by the strings in newText.
    +    // Afterwards, set the selection to selFrom, selTo.
    +    function updateLines(from, to, newText, selFrom, selTo) {
    +      if (suppressEdits) return;
    +      if (history) {
    +        var old = [];
    +        doc.iter(from.line, to.line + 1, function(line) { old.push(line.text); });
    +        history.addChange(from.line, newText.length, old);
    +        while (history.done.length > options.undoDepth) history.done.shift();
    +      }
    +      updateLinesNoUndo(from, to, newText, selFrom, selTo);
    +    }
    +    function unredoHelper(from, to) {
    +      if (!from.length) return;
    +      var set = from.pop(), out = [];
    +      for (var i = set.length - 1; i >= 0; i -= 1) {
    +        var change = set[i];
    +        var replaced = [], end = change.start + change.added;
    +        doc.iter(change.start, end, function(line) { replaced.push(line.text); });
    +        out.push({start: change.start, added: change.old.length, old: replaced});
    +        var pos = clipPos({line: change.start + change.old.length - 1,
    +                           ch: editEnd(replaced[replaced.length-1], change.old[change.old.length-1])});
    +        updateLinesNoUndo({line: change.start, ch: 0}, {line: end - 1, ch: getLine(end-1).text.length}, change.old, pos, pos);
    +      }
    +      updateInput = true;
    +      to.push(out);
    +    }
    +    function undo() {unredoHelper(history.done, history.undone);}
    +    function redo() {unredoHelper(history.undone, history.done);}
    +
    +    function updateLinesNoUndo(from, to, newText, selFrom, selTo) {
    +      if (suppressEdits) return;
    +      var recomputeMaxLength = false, maxLineLength = maxLine.length;
    +      if (!options.lineWrapping)
    +        doc.iter(from.line, to.line + 1, function(line) {
    +          if (line.text.length == maxLineLength) {recomputeMaxLength = true; return true;}
    +        });
    +      if (from.line != to.line || newText.length > 1) gutterDirty = true;
    +
    +      var nlines = to.line - from.line, firstLine = getLine(from.line), lastLine = getLine(to.line);
    +      // First adjust the line structure, taking some care to leave highlighting intact.
    +      if (from.ch == 0 && to.ch == 0 && newText[newText.length - 1] == "") {
    +        // This is a whole-line replace. Treated specially to make
    +        // sure line objects move the way they are supposed to.
    +        var added = [], prevLine = null;
    +        if (from.line) {
    +          prevLine = getLine(from.line - 1);
    +          prevLine.fixMarkEnds(lastLine);
    +        } else lastLine.fixMarkStarts();
    +        for (var i = 0, e = newText.length - 1; i < e; ++i)
    +          added.push(Line.inheritMarks(newText[i], prevLine));
    +        if (nlines) doc.remove(from.line, nlines, callbacks);
    +        if (added.length) doc.insert(from.line, added);
    +      } else if (firstLine == lastLine) {
    +        if (newText.length == 1)
    +          firstLine.replace(from.ch, to.ch, newText[0]);
    +        else {
    +          lastLine = firstLine.split(to.ch, newText[newText.length-1]);
    +          firstLine.replace(from.ch, null, newText[0]);
    +          firstLine.fixMarkEnds(lastLine);
    +          var added = [];
    +          for (var i = 1, e = newText.length - 1; i < e; ++i)
    +            added.push(Line.inheritMarks(newText[i], firstLine));
    +          added.push(lastLine);
    +          doc.insert(from.line + 1, added);
    +        }
    +      } else if (newText.length == 1) {
    +        firstLine.replace(from.ch, null, newText[0]);
    +        lastLine.replace(null, to.ch, "");
    +        firstLine.append(lastLine);
    +        doc.remove(from.line + 1, nlines, callbacks);
    +      } else {
    +        var added = [];
    +        firstLine.replace(from.ch, null, newText[0]);
    +        lastLine.replace(null, to.ch, newText[newText.length-1]);
    +        firstLine.fixMarkEnds(lastLine);
    +        for (var i = 1, e = newText.length - 1; i < e; ++i)
    +          added.push(Line.inheritMarks(newText[i], firstLine));
    +        if (nlines > 1) doc.remove(from.line + 1, nlines - 1, callbacks);
    +        doc.insert(from.line + 1, added);
    +      }
    +      if (options.lineWrapping) {
    +        var perLine = Math.max(5, scroller.clientWidth / charWidth() - 3);
    +        doc.iter(from.line, from.line + newText.length, function(line) {
    +          if (line.hidden) return;
    +          var guess = Math.ceil(line.text.length / perLine) || 1;
    +          if (guess != line.height) updateLineHeight(line, guess);
    +        });
    +      } else {
    +        doc.iter(from.line, from.line + newText.length, function(line) {
    +          var l = line.text;
    +          if (l.length > maxLineLength) {
    +            maxLine = l; maxLineLength = l.length; maxWidth = null;
    +            recomputeMaxLength = false;
    +          }
    +        });
    +        if (recomputeMaxLength) {
    +          maxLineLength = 0; maxLine = ""; maxWidth = null;
    +          doc.iter(0, doc.size, function(line) {
    +            var l = line.text;
    +            if (l.length > maxLineLength) {
    +              maxLineLength = l.length; maxLine = l;
    +            }
    +          });
    +        }
    +      }
    +
    +      // Add these lines to the work array, so that they will be
    +      // highlighted. Adjust work lines if lines were added/removed.
    +      var newWork = [], lendiff = newText.length - nlines - 1;
    +      for (var i = 0, l = work.length; i < l; ++i) {
    +        var task = work[i];
    +        if (task < from.line) newWork.push(task);
    +        else if (task > to.line) newWork.push(task + lendiff);
    +      }
    +      var hlEnd = from.line + Math.min(newText.length, 500);
    +      highlightLines(from.line, hlEnd);
    +      newWork.push(hlEnd);
    +      work = newWork;
    +      startWorker(100);
    +      // Remember that these lines changed, for updating the display
    +      changes.push({from: from.line, to: to.line + 1, diff: lendiff});
    +      var changeObj = {from: from, to: to, text: newText};
    +      if (textChanged) {
    +        for (var cur = textChanged; cur.next; cur = cur.next) {}
    +        cur.next = changeObj;
    +      } else textChanged = changeObj;
    +
    +      // Update the selection
    +      function updateLine(n) {return n <= Math.min(to.line, to.line + lendiff) ? n : n + lendiff;}
    +      setSelection(selFrom, selTo, updateLine(sel.from.line), updateLine(sel.to.line));
    +
    +      // Make sure the scroll-size div has the correct height.
    +      if (scroller.clientHeight)
    +        code.style.height = (doc.height * textHeight() + 2 * paddingTop()) + "px";
    +    }
    +
    +    function replaceRange(code, from, to) {
    +      from = clipPos(from);
    +      if (!to) to = from; else to = clipPos(to);
    +      code = splitLines(code);
    +      function adjustPos(pos) {
    +        if (posLess(pos, from)) return pos;
    +        if (!posLess(to, pos)) return end;
    +        var line = pos.line + code.length - (to.line - from.line) - 1;
    +        var ch = pos.ch;
    +        if (pos.line == to.line)
    +          ch += code[code.length-1].length - (to.ch - (to.line == from.line ? from.ch : 0));
    +        return {line: line, ch: ch};
    +      }
    +      var end;
    +      replaceRange1(code, from, to, function(end1) {
    +        end = end1;
    +        return {from: adjustPos(sel.from), to: adjustPos(sel.to)};
    +      });
    +      return end;
    +    }
    +    function replaceSelection(code, collapse) {
    +      replaceRange1(splitLines(code), sel.from, sel.to, function(end) {
    +        if (collapse == "end") return {from: end, to: end};
    +        else if (collapse == "start") return {from: sel.from, to: sel.from};
    +        else return {from: sel.from, to: end};
    +      });
    +    }
    +    function replaceRange1(code, from, to, computeSel) {
    +      var endch = code.length == 1 ? code[0].length + from.ch : code[code.length-1].length;
    +      var newSel = computeSel({line: from.line + code.length - 1, ch: endch});
    +      updateLines(from, to, code, newSel.from, newSel.to);
    +    }
    +
    +    function getRange(from, to) {
    +      var l1 = from.line, l2 = to.line;
    +      if (l1 == l2) return getLine(l1).text.slice(from.ch, to.ch);
    +      var code = [getLine(l1).text.slice(from.ch)];
    +      doc.iter(l1 + 1, l2, function(line) { code.push(line.text); });
    +      code.push(getLine(l2).text.slice(0, to.ch));
    +      return code.join("\n");
    +    }
    +    function getSelection() {
    +      return getRange(sel.from, sel.to);
    +    }
    +
    +    var pollingFast = false; // Ensures slowPoll doesn't cancel fastPoll
    +    function slowPoll() {
    +      if (pollingFast) return;
    +      poll.set(options.pollInterval, function() {
    +        startOperation();
    +        readInput();
    +        if (focused) slowPoll();
    +        endOperation();
    +      });
    +    }
    +    function fastPoll() {
    +      var missed = false;
    +      pollingFast = true;
    +      function p() {
    +        startOperation();
    +        var changed = readInput();
    +        if (!changed && !missed) {missed = true; poll.set(60, p);}
    +        else {pollingFast = false; slowPoll();}
    +        endOperation();
    +      }
    +      poll.set(20, p);
    +    }
    +
    +    // Previnput is a hack to work with IME. If we reset the textarea
    +    // on every change, that breaks IME. So we look for changes
    +    // compared to the previous content instead. (Modern browsers have
    +    // events that indicate IME taking place, but these are not widely
    +    // supported or compatible enough yet to rely on.)
    +    var prevInput = "";
    +    function readInput() {
    +      if (leaveInputAlone || !focused || hasSelection(input) || options.readOnly) return false;
    +      var text = input.value;
    +      if (text == prevInput) return false;
    +      shiftSelecting = null;
    +      var same = 0, l = Math.min(prevInput.length, text.length);
    +      while (same < l && prevInput[same] == text[same]) ++same;
    +      if (same < prevInput.length)
    +        sel.from = {line: sel.from.line, ch: sel.from.ch - (prevInput.length - same)};
    +      else if (overwrite && posEq(sel.from, sel.to))
    +        sel.to = {line: sel.to.line, ch: Math.min(getLine(sel.to.line).text.length, sel.to.ch + (text.length - same))};
    +      replaceSelection(text.slice(same), "end");
    +      prevInput = text;
    +      return true;
    +    }
    +    function resetInput(user) {
    +      if (!posEq(sel.from, sel.to)) {
    +        prevInput = "";
    +        input.value = getSelection();
    +        selectInput(input);
    +      } else if (user) prevInput = input.value = "";
    +    }
    +
    +    function focusInput() {
    +      if (options.readOnly != "nocursor") input.focus();
    +    }
    +
    +    function scrollEditorIntoView() {
    +      if (!cursor.getBoundingClientRect) return;
    +      var rect = cursor.getBoundingClientRect();
    +      // IE returns bogus coordinates when the instance sits inside of an iframe and the cursor is hidden
    +      if (ie && rect.top == rect.bottom) return;
    +      var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);
    +      if (rect.top < 0 || rect.bottom > winH) cursor.scrollIntoView();
    +    }
    +    function scrollCursorIntoView() {
    +      var cursor = localCoords(sel.inverted ? sel.from : sel.to);
    +      var x = options.lineWrapping ? Math.min(cursor.x, lineSpace.offsetWidth) : cursor.x;
    +      return scrollIntoView(x, cursor.y, x, cursor.yBot);
    +    }
    +    function scrollIntoView(x1, y1, x2, y2) {
    +      var pl = paddingLeft(), pt = paddingTop();
    +      y1 += pt; y2 += pt; x1 += pl; x2 += pl;
    +      var screen = scroller.clientHeight, screentop = scroller.scrollTop, scrolled = false, result = true;
    +      if (y1 < screentop) {scroller.scrollTop = Math.max(0, y1); scrolled = true;}
    +      else if (y2 > screentop + screen) {scroller.scrollTop = y2 - screen; scrolled = true;}
    +
    +      var screenw = scroller.clientWidth, screenleft = scroller.scrollLeft;
    +      var gutterw = options.fixedGutter ? gutter.clientWidth : 0;
    +      var atLeft = x1 < gutterw + pl + 10;
    +      if (x1 < screenleft + gutterw || atLeft) {
    +        if (atLeft) x1 = 0;
    +        scroller.scrollLeft = Math.max(0, x1 - 10 - gutterw);
    +        scrolled = true;
    +      }
    +      else if (x2 > screenw + screenleft - 3) {
    +        scroller.scrollLeft = x2 + 10 - screenw;
    +        scrolled = true;
    +        if (x2 > code.clientWidth) result = false;
    +      }
    +      if (scrolled && options.onScroll) options.onScroll(instance);
    +      return result;
    +    }
    +
    +    function visibleLines() {
    +      var lh = textHeight(), top = scroller.scrollTop - paddingTop();
    +      var fromHeight = Math.max(0, Math.floor(top / lh));
    +      var toHeight = Math.ceil((top + scroller.clientHeight) / lh);
    +      return {from: lineAtHeight(doc, fromHeight),
    +              to: lineAtHeight(doc, toHeight)};
    +    }
    +    // Uses a set of changes plus the current scroll position to
    +    // determine which DOM updates have to be made, and makes the
    +    // updates.
    +    function updateDisplay(changes, suppressCallback) {
    +      if (!scroller.clientWidth) {
    +        showingFrom = showingTo = displayOffset = 0;
    +        return;
    +      }
    +      // Compute the new visible window
    +      var visible = visibleLines();
    +      // Bail out if the visible area is already rendered and nothing changed.
    +      if (changes !== true && changes.length == 0 && visible.from > showingFrom && visible.to < showingTo) return;
    +      var from = Math.max(visible.from - 100, 0), to = Math.min(doc.size, visible.to + 100);
    +      if (showingFrom < from && from - showingFrom < 20) from = showingFrom;
    +      if (showingTo > to && showingTo - to < 20) to = Math.min(doc.size, showingTo);
    +
    +      // Create a range of theoretically intact lines, and punch holes
    +      // in that using the change info.
    +      var intact = changes === true ? [] :
    +        computeIntact([{from: showingFrom, to: showingTo, domStart: 0}], changes);
    +      // Clip off the parts that won't be visible
    +      var intactLines = 0;
    +      for (var i = 0; i < intact.length; ++i) {
    +        var range = intact[i];
    +        if (range.from < from) {range.domStart += (from - range.from); range.from = from;}
    +        if (range.to > to) range.to = to;
    +        if (range.from >= range.to) intact.splice(i--, 1);
    +        else intactLines += range.to - range.from;
    +      }
    +      if (intactLines == to - from && from == showingFrom && to == showingTo) return;
    +      intact.sort(function(a, b) {return a.domStart - b.domStart;});
    +
    +      var th = textHeight(), gutterDisplay = gutter.style.display;
    +      lineDiv.style.display = "none";
    +      patchDisplay(from, to, intact);
    +      lineDiv.style.display = gutter.style.display = "";
    +
    +      // Position the mover div to align with the lines it's supposed
    +      // to be showing (which will cover the visible display)
    +      var different = from != showingFrom || to != showingTo || lastSizeC != scroller.clientHeight + th;
    +      // This is just a bogus formula that detects when the editor is
    +      // resized or the font size changes.
    +      if (different) lastSizeC = scroller.clientHeight + th;
    +      showingFrom = from; showingTo = to;
    +      displayOffset = heightAtLine(doc, from);
    +      mover.style.top = (displayOffset * th) + "px";
    +      if (scroller.clientHeight)
    +        code.style.height = (doc.height * th + 2 * paddingTop()) + "px";
    +
    +      // Since this is all rather error prone, it is honoured with the
    +      // only assertion in the whole file.
    +      if (lineDiv.childNodes.length != showingTo - showingFrom)
    +        throw new Error("BAD PATCH! " + JSON.stringify(intact) + " size=" + (showingTo - showingFrom) +
    +                        " nodes=" + lineDiv.childNodes.length);
    +
    +      function checkHeights() {
    +        maxWidth = scroller.clientWidth;
    +        var curNode = lineDiv.firstChild, heightChanged = false;
    +        doc.iter(showingFrom, showingTo, function(line) {
    +          if (!line.hidden) {
    +            var height = Math.round(curNode.offsetHeight / th) || 1;
    +            if (line.height != height) {
    +              updateLineHeight(line, height);
    +              gutterDirty = heightChanged = true;
    +            }
    +          }
    +          curNode = curNode.nextSibling;
    +        });
    +        if (heightChanged)
    +          code.style.height = (doc.height * th + 2 * paddingTop()) + "px";
    +        return heightChanged;
    +      }
    +
    +      if (options.lineWrapping) {
    +        checkHeights();
    +      } else {
    +        if (maxWidth == null) maxWidth = stringWidth(maxLine);
    +        if (maxWidth > scroller.clientWidth) {
    +          lineSpace.style.width = maxWidth + "px";
    +          // Needed to prevent odd wrapping/hiding of widgets placed in here.
    +          code.style.width = "";
    +          code.style.width = scroller.scrollWidth + "px";
    +        } else {
    +          lineSpace.style.width = code.style.width = "";
    +        }
    +      }
    +
    +      gutter.style.display = gutterDisplay;
    +      if (different || gutterDirty) {
    +        // If the gutter grew in size, re-check heights. If those changed, re-draw gutter.
    +        updateGutter() && options.lineWrapping && checkHeights() && updateGutter();
    +      }
    +      updateSelection();
    +      if (!suppressCallback && options.onUpdate) options.onUpdate(instance);
    +      return true;
    +    }
    +
    +    function computeIntact(intact, changes) {
    +      for (var i = 0, l = changes.length || 0; i < l; ++i) {
    +        var change = changes[i], intact2 = [], diff = change.diff || 0;
    +        for (var j = 0, l2 = intact.length; j < l2; ++j) {
    +          var range = intact[j];
    +          if (change.to <= range.from && change.diff)
    +            intact2.push({from: range.from + diff, to: range.to + diff,
    +                          domStart: range.domStart});
    +          else if (change.to <= range.from || change.from >= range.to)
    +            intact2.push(range);
    +          else {
    +            if (change.from > range.from)
    +              intact2.push({from: range.from, to: change.from, domStart: range.domStart});
    +            if (change.to < range.to)
    +              intact2.push({from: change.to + diff, to: range.to + diff,
    +                            domStart: range.domStart + (change.to - range.from)});
    +          }
    +        }
    +        intact = intact2;
    +      }
    +      return intact;
    +    }
    +
    +    function patchDisplay(from, to, intact) {
    +      // The first pass removes the DOM nodes that aren't intact.
    +      if (!intact.length) lineDiv.innerHTML = "";
    +      else {
    +        function killNode(node) {
    +          var tmp = node.nextSibling;
    +          node.parentNode.removeChild(node);
    +          return tmp;
    +        }
    +        var domPos = 0, curNode = lineDiv.firstChild, n;
    +        for (var i = 0; i < intact.length; ++i) {
    +          var cur = intact[i];
    +          while (cur.domStart > domPos) {curNode = killNode(curNode); domPos++;}
    +          for (var j = 0, e = cur.to - cur.from; j < e; ++j) {curNode = curNode.nextSibling; domPos++;}
    +        }
    +        while (curNode) curNode = killNode(curNode);
    +      }
    +      // This pass fills in the lines that actually changed.
    +      var nextIntact = intact.shift(), curNode = lineDiv.firstChild, j = from;
    +      var scratch = document.createElement("div");
    +      doc.iter(from, to, function(line) {
    +        if (nextIntact && nextIntact.to == j) nextIntact = intact.shift();
    +        if (!nextIntact || nextIntact.from > j) {
    +          if (line.hidden) var html = scratch.innerHTML = "<pre></pre>";
    +          else {
    +            var html = '<pre' + (line.className ? ' class="' + line.className + '"' : '') + '>'
    +              + line.getHTML(makeTab) + '</pre>';
    +            // Kludge to make sure the styled element lies behind the selection (by z-index)
    +            if (line.bgClassName)
    +              html = '<div style="position: relative"><pre class="' + line.bgClassName +
    +              '" style="position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: -2">&#160;</pre>' + html + "</div>";
    +          }
    +          scratch.innerHTML = html;
    +          lineDiv.insertBefore(scratch.firstChild, curNode);
    +        } else {
    +          curNode = curNode.nextSibling;
    +        }
    +        ++j;
    +      });
    +    }
    +
    +    function updateGutter() {
    +      if (!options.gutter && !options.lineNumbers) return;
    +      var hText = mover.offsetHeight, hEditor = scroller.clientHeight;
    +      gutter.style.height = (hText - hEditor < 2 ? hEditor : hText) + "px";
    +      var html = [], i = showingFrom, normalNode;
    +      doc.iter(showingFrom, Math.max(showingTo, showingFrom + 1), function(line) {
    +        if (line.hidden) {
    +          html.push("<pre></pre>");
    +        } else {
    +          var marker = line.gutterMarker;
    +          var text = options.lineNumbers ? i + options.firstLineNumber : null;
    +          if (marker && marker.text)
    +            text = marker.text.replace("%N%", text != null ? text : "");
    +          else if (text == null)
    +            text = "\u00a0";
    +          html.push((marker && marker.style ? '<pre class="' + marker.style + '">' : "<pre>"), text);
    +          for (var j = 1; j < line.height; ++j) html.push("<br/>&#160;");
    +          html.push("</pre>");
    +          if (!marker) normalNode = i;
    +        }
    +        ++i;
    +      });
    +      gutter.style.display = "none";
    +      gutterText.innerHTML = html.join("");
    +      // Make sure scrolling doesn't cause number gutter size to pop
    +      if (normalNode != null) {
    +        var node = gutterText.childNodes[normalNode - showingFrom];
    +        var minwidth = String(doc.size).length, val = eltText(node), pad = "";
    +        while (val.length + pad.length < minwidth) pad += "\u00a0";
    +        if (pad) node.insertBefore(document.createTextNode(pad), node.firstChild);
    +      }
    +      gutter.style.display = "";
    +      var resized = Math.abs((parseInt(lineSpace.style.marginLeft) || 0) - gutter.offsetWidth) > 2;
    +      lineSpace.style.marginLeft = gutter.offsetWidth + "px";
    +      gutterDirty = false;
    +      return resized;
    +    }
    +    function updateSelection() {
    +      var collapsed = posEq(sel.from, sel.to);
    +      var fromPos = localCoords(sel.from, true);
    +      var toPos = collapsed ? fromPos : localCoords(sel.to, true);
    +      var headPos = sel.inverted ? fromPos : toPos, th = textHeight();
    +      var wrapOff = eltOffset(wrapper), lineOff = eltOffset(lineDiv);
    +      inputDiv.style.top = Math.max(0, Math.min(scroller.offsetHeight, headPos.y + lineOff.top - wrapOff.top)) + "px";
    +      inputDiv.style.left = Math.max(0, Math.min(scroller.offsetWidth, headPos.x + lineOff.left - wrapOff.left)) + "px";
    +      if (collapsed) {
    +        cursor.style.top = headPos.y + "px";
    +        cursor.style.left = (options.lineWrapping ? Math.min(headPos.x, lineSpace.offsetWidth) : headPos.x) + "px";
    +        cursor.style.display = "";
    +        selectionDiv.style.display = "none";
    +      } else {
    +        var sameLine = fromPos.y == toPos.y, html = "";
    +        var clientWidth = lineSpace.clientWidth || lineSpace.offsetWidth;
    +        var clientHeight = lineSpace.clientHeight || lineSpace.offsetHeight;
    +        function add(left, top, right, height) {
    +          var rstyle = quirksMode ? "width: " + (!right ? clientWidth : clientWidth - right - left) + "px"
    +                                  : "right: " + right + "px";
    +          html += '<div class="CodeMirror-selected" style="position: absolute; left: ' + left +
    +            'px; top: ' + top + 'px; ' + rstyle + '; height: ' + height + 'px"></div>';
    +        }
    +        if (sel.from.ch && fromPos.y >= 0) {
    +          var right = sameLine ? clientWidth - toPos.x : 0;
    +          add(fromPos.x, fromPos.y, right, th);
    +        }
    +        var middleStart = Math.max(0, fromPos.y + (sel.from.ch ? th : 0));
    +        var middleHeight = Math.min(toPos.y, clientHeight) - middleStart;
    +        if (middleHeight > 0.2 * th)
    +          add(0, middleStart, 0, middleHeight);
    +        if ((!sameLine || !sel.from.ch) && toPos.y < clientHeight - .5 * th)
    +          add(0, toPos.y, clientWidth - toPos.x, th);
    +        selectionDiv.innerHTML = html;
    +        cursor.style.display = "none";
    +        selectionDiv.style.display = "";
    +      }
    +    }
    +
    +    function setShift(val) {
    +      if (val) shiftSelecting = shiftSelecting || (sel.inverted ? sel.to : sel.from);
    +      else shiftSelecting = null;
    +    }
    +    function setSelectionUser(from, to) {
    +      var sh = shiftSelecting && clipPos(shiftSelecting);
    +      if (sh) {
    +        if (posLess(sh, from)) from = sh;
    +        else if (posLess(to, sh)) to = sh;
    +      }
    +      setSelection(from, to);
    +      userSelChange = true;
    +    }
    +    // Update the selection. Last two args are only used by
    +    // updateLines, since they have to be expressed in the line
    +    // numbers before the update.
    +    function setSelection(from, to, oldFrom, oldTo) {
    +      goalColumn = null;
    +      if (oldFrom == null) {oldFrom = sel.from.line; oldTo = sel.to.line;}
    +      if (posEq(sel.from, from) && posEq(sel.to, to)) return;
    +      if (posLess(to, from)) {var tmp = to; to = from; from = tmp;}
    +
    +      // Skip over hidden lines.
    +      if (from.line != oldFrom) {
    +        var from1 = skipHidden(from, oldFrom, sel.from.ch);
    +        // If there is no non-hidden line left, force visibility on current line
    +        if (!from1) setLineHidden(from.line, false);
    +        else from = from1;
    +      }
    +      if (to.line != oldTo) to = skipHidden(to, oldTo, sel.to.ch);
    +
    +      if (posEq(from, to)) sel.inverted = false;
    +      else if (posEq(from, sel.to)) sel.inverted = false;
    +      else if (posEq(to, sel.from)) sel.inverted = true;
    +
    +      if (options.autoClearEmptyLines && posEq(sel.from, sel.to)) {
    +        var head = sel.inverted ? from : to;
    +        if (head.line != sel.from.line && sel.from.line < doc.size) {
    +          var oldLine = getLine(sel.from.line);
    +          if (/^\s+$/.test(oldLine.text))
    +            setTimeout(operation(function() {
    +              if (oldLine.parent && /^\s+$/.test(oldLine.text)) {
    +                var no = lineNo(oldLine);
    +                replaceRange("", {line: no, ch: 0}, {line: no, ch: oldLine.text.length});
    +              }
    +            }, 10));
    +        }
    +      }
    +
    +      sel.from = from; sel.to = to;
    +      selectionChanged = true;
    +    }
    +    function skipHidden(pos, oldLine, oldCh) {
    +      function getNonHidden(dir) {
    +        var lNo = pos.line + dir, end = dir == 1 ? doc.size : -1;
    +        while (lNo != end) {
    +          var line = getLine(lNo);
    +          if (!line.hidden) {
    +            var ch = pos.ch;
    +            if (toEnd || ch > oldCh || ch > line.text.length) ch = line.text.length;
    +            return {line: lNo, ch: ch};
    +          }
    +          lNo += dir;
    +        }
    +      }
    +      var line = getLine(pos.line);
    +      var toEnd = pos.ch == line.text.length && pos.ch != oldCh;
    +      if (!line.hidden) return pos;
    +      if (pos.line >= oldLine) return getNonHidden(1) || getNonHidden(-1);
    +      else return getNonHidden(-1) || getNonHidden(1);
    +    }
    +    function setCursor(line, ch, user) {
    +      var pos = clipPos({line: line, ch: ch || 0});
    +      (user ? setSelectionUser : setSelection)(pos, pos);
    +    }
    +
    +    function clipLine(n) {return Math.max(0, Math.min(n, doc.size-1));}
    +    function clipPos(pos) {
    +      if (pos.line < 0) return {line: 0, ch: 0};
    +      if (pos.line >= doc.size) return {line: doc.size-1, ch: getLine(doc.size-1).text.length};
    +      var ch = pos.ch, linelen = getLine(pos.line).text.length;
    +      if (ch == null || ch > linelen) return {line: pos.line, ch: linelen};
    +      else if (ch < 0) return {line: pos.line, ch: 0};
    +      else return pos;
    +    }
    +
    +    function findPosH(dir, unit) {
    +      var end = sel.inverted ? sel.from : sel.to, line = end.line, ch = end.ch;
    +      var lineObj = getLine(line);
    +      function findNextLine() {
    +        for (var l = line + dir, e = dir < 0 ? -1 : doc.size; l != e; l += dir) {
    +          var lo = getLine(l);
    +          if (!lo.hidden) { line = l; lineObj = lo; return true; }
    +        }
    +      }
    +      function moveOnce(boundToLine) {
    +        if (ch == (dir < 0 ? 0 : lineObj.text.length)) {
    +          if (!boundToLine && findNextLine()) ch = dir < 0 ? lineObj.text.length : 0;
    +          else return false;
    +        } else ch += dir;
    +        return true;
    +      }
    +      if (unit == "char") moveOnce();
    +      else if (unit == "column") moveOnce(true);
    +      else if (unit == "word") {
    +        var sawWord = false;
    +        for (;;) {
    +          if (dir < 0) if (!moveOnce()) break;
    +          if (isWordChar(lineObj.text.charAt(ch))) sawWord = true;
    +          else if (sawWord) {if (dir < 0) {dir = 1; moveOnce();} break;}
    +          if (dir > 0) if (!moveOnce()) break;
    +        }
    +      }
    +      return {line: line, ch: ch};
    +    }
    +    function moveH(dir, unit) {
    +      var pos = dir < 0 ? sel.from : sel.to;
    +      if (shiftSelecting || posEq(sel.from, sel.to)) pos = findPosH(dir, unit);
    +      setCursor(pos.line, pos.ch, true);
    +    }
    +    function deleteH(dir, unit) {
    +      if (!posEq(sel.from, sel.to)) replaceRange("", sel.from, sel.to);
    +      else if (dir < 0) replaceRange("", findPosH(dir, unit), sel.to);
    +      else replaceRange("", sel.from, findPosH(dir, unit));
    +      userSelChange = true;
    +    }
    +    var goalColumn = null;
    +    function moveV(dir, unit) {
    +      var dist = 0, pos = localCoords(sel.inverted ? sel.from : sel.to, true);
    +      if (goalColumn != null) pos.x = goalColumn;
    +      if (unit == "page") dist = Math.min(scroller.clientHeight, window.innerHeight || document.documentElement.clientHeight);
    +      else if (unit == "line") dist = textHeight();
    +      var target = coordsChar(pos.x, pos.y + dist * dir + 2);
    +      if (unit == "page") scroller.scrollTop += localCoords(target, true).y - pos.y;
    +      setCursor(target.line, target.ch, true);
    +      goalColumn = pos.x;
    +    }
    +
    +    function selectWordAt(pos) {
    +      var line = getLine(pos.line).text;
    +      var start = pos.ch, end = pos.ch;
    +      while (start > 0 && isWordChar(line.charAt(start - 1))) --start;
    +      while (end < line.length && isWordChar(line.charAt(end))) ++end;
    +      setSelectionUser({line: pos.line, ch: start}, {line: pos.line, ch: end});
    +    }
    +    function selectLine(line) {
    +      setSelectionUser({line: line, ch: 0}, clipPos({line: line + 1, ch: 0}));
    +    }
    +    function indentSelected(mode) {
    +      if (posEq(sel.from, sel.to)) return indentLine(sel.from.line, mode);
    +      var e = sel.to.line - (sel.to.ch ? 0 : 1);
    +      for (var i = sel.from.line; i <= e; ++i) indentLine(i, mode);
    +    }
    +
    +    function indentLine(n, how) {
    +      if (!how) how = "add";
    +      if (how == "smart") {
    +        if (!mode.indent) how = "prev";
    +        else var state = getStateBefore(n);
    +      }
    +
    +      var line = getLine(n), curSpace = line.indentation(options.tabSize),
    +          curSpaceString = line.text.match(/^\s*/)[0], indentation;
    +      if (how == "prev") {
    +        if (n) indentation = getLine(n-1).indentation(options.tabSize);
    +        else indentation = 0;
    +      }
    +      else if (how == "smart") indentation = mode.indent(state, line.text.slice(curSpaceString.length), line.text);
    +      else if (how == "add") indentation = curSpace + options.indentUnit;
    +      else if (how == "subtract") indentation = curSpace - options.indentUnit;
    +      indentation = Math.max(0, indentation);
    +      var diff = indentation - curSpace;
    +
    +      if (!diff) {
    +        if (sel.from.line != n && sel.to.line != n) return;
    +        var indentString = curSpaceString;
    +      }
    +      else {
    +        var indentString = "", pos = 0;
    +        if (options.indentWithTabs)
    +          for (var i = Math.floor(indentation / options.tabSize); i; --i) {pos += options.tabSize; indentString += "\t";}
    +        while (pos < indentation) {++pos; indentString += " ";}
    +      }
    +
    +      replaceRange(indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length});
    +    }
    +
    +    function loadMode() {
    +      mode = CodeMirror.getMode(options, options.mode);
    +      doc.iter(0, doc.size, function(line) { line.stateAfter = null; });
    +      work = [0];
    +      startWorker();
    +    }
    +    function gutterChanged() {
    +      var visible = options.gutter || options.lineNumbers;
    +      gutter.style.display = visible ? "" : "none";
    +      if (visible) gutterDirty = true;
    +      else lineDiv.parentNode.style.marginLeft = 0;
    +    }
    +    function wrappingChanged(from, to) {
    +      if (options.lineWrapping) {
    +        wrapper.className += " CodeMirror-wrap";
    +        var perLine = scroller.clientWidth / charWidth() - 3;
    +        doc.iter(0, doc.size, function(line) {
    +          if (line.hidden) return;
    +          var guess = Math.ceil(line.text.length / perLine) || 1;
    +          if (guess != 1) updateLineHeight(line, guess);
    +        });
    +        lineSpace.style.width = code.style.width = "";
    +      } else {
    +        wrapper.className = wrapper.className.replace(" CodeMirror-wrap", "");
    +        maxWidth = null; maxLine = "";
    +        doc.iter(0, doc.size, function(line) {
    +          if (line.height != 1 && !line.hidden) updateLineHeight(line, 1);
    +          if (line.text.length > maxLine.length) maxLine = line.text;
    +        });
    +      }
    +      changes.push({from: 0, to: doc.size});
    +    }
    +    function makeTab(col) {
    +      var w = options.tabSize - col % options.tabSize, cached = tabCache[w];
    +      if (cached) return cached;
    +      for (var str = '<span class="cm-tab">', i = 0; i < w; ++i) str += " ";
    +      return (tabCache[w] = {html: str + "</span>", width: w});
    +    }
    +    function themeChanged() {
    +      scroller.className = scroller.className.replace(/\s*cm-s-\S+/g, "") +
    +        options.theme.replace(/(^|\s)\s*/g, " cm-s-");
    +    }
    +
    +    function TextMarker() { this.set = []; }
    +    TextMarker.prototype.clear = operation(function() {
    +      var min = Infinity, max = -Infinity;
    +      for (var i = 0, e = this.set.length; i < e; ++i) {
    +        var line = this.set[i], mk = line.marked;
    +        if (!mk || !line.parent) continue;
    +        var lineN = lineNo(line);
    +        min = Math.min(min, lineN); max = Math.max(max, lineN);
    +        for (var j = 0; j < mk.length; ++j)
    +          if (mk[j].marker == this) mk.splice(j--, 1);
    +      }
    +      if (min != Infinity)
    +        changes.push({from: min, to: max + 1});
    +    });
    +    TextMarker.prototype.find = function() {
    +      var from, to;
    +      for (var i = 0, e = this.set.length; i < e; ++i) {
    +        var line = this.set[i], mk = line.marked;
    +        for (var j = 0; j < mk.length; ++j) {
    +          var mark = mk[j];
    +          if (mark.marker == this) {
    +            if (mark.from != null || mark.to != null) {
    +              var found = lineNo(line);
    +              if (found != null) {
    +                if (mark.from != null) from = {line: found, ch: mark.from};
    +                if (mark.to != null) to = {line: found, ch: mark.to};
    +              }
    +            }
    +          }
    +        }
    +      }
    +      return {from: from, to: to};
    +    };
    +
    +    function markText(from, to, className) {
    +      from = clipPos(from); to = clipPos(to);
    +      var tm = new TextMarker();
    +      if (!posLess(from, to)) return tm;
    +      function add(line, from, to, className) {
    +        getLine(line).addMark(new MarkedText(from, to, className, tm));
    +      }
    +      if (from.line == to.line) add(from.line, from.ch, to.ch, className);
    +      else {
    +        add(from.line, from.ch, null, className);
    +        for (var i = from.line + 1, e = to.line; i < e; ++i)
    +          add(i, null, null, className);
    +        add(to.line, null, to.ch, className);
    +      }
    +      changes.push({from: from.line, to: to.line + 1});
    +      return tm;
    +    }
    +
    +    function setBookmark(pos) {
    +      pos = clipPos(pos);
    +      var bm = new Bookmark(pos.ch);
    +      getLine(pos.line).addMark(bm);
    +      return bm;
    +    }
    +
    +    function findMarksAt(pos) {
    +      pos = clipPos(pos);
    +      var markers = [], marked = getLine(pos.line).marked;
    +      if (!marked) return markers;
    +      for (var i = 0, e = marked.length; i < e; ++i) {
    +        var m = marked[i];
    +        if ((m.from == null || m.from <= pos.ch) &&
    +            (m.to == null || m.to >= pos.ch))
    +          markers.push(m.marker || m);
    +      }
    +      return markers;
    +    }
    +
    +    function addGutterMarker(line, text, className) {
    +      if (typeof line == "number") line = getLine(clipLine(line));
    +      line.gutterMarker = {text: text, style: className};
    +      gutterDirty = true;
    +      return line;
    +    }
    +    function removeGutterMarker(line) {
    +      if (typeof line == "number") line = getLine(clipLine(line));
    +      line.gutterMarker = null;
    +      gutterDirty = true;
    +    }
    +
    +    function changeLine(handle, op) {
    +      var no = handle, line = handle;
    +      if (typeof handle == "number") line = getLine(clipLine(handle));
    +      else no = lineNo(handle);
    +      if (no == null) return null;
    +      if (op(line, no)) changes.push({from: no, to: no + 1});
    +      else return null;
    +      return line;
    +    }
    +    function setLineClass(handle, className, bgClassName) {
    +      return changeLine(handle, function(line) {
    +        if (line.className != className || line.bgClassName != bgClassName) {
    +          line.className = className;
    +          line.bgClassName = bgClassName;
    +          return true;
    +        }
    +      });
    +    }
    +    function setLineHidden(handle, hidden) {
    +      return changeLine(handle, function(line, no) {
    +        if (line.hidden != hidden) {
    +          line.hidden = hidden;
    +          updateLineHeight(line, hidden ? 0 : 1);
    +          var fline = sel.from.line, tline = sel.to.line;
    +          if (hidden && (fline == no || tline == no)) {
    +            var from = fline == no ? skipHidden({line: fline, ch: 0}, fline, 0) : sel.from;
    +            var to = tline == no ? skipHidden({line: tline, ch: 0}, tline, 0) : sel.to;
    +            // Can't hide the last visible line, we'd have no place to put the cursor
    +            if (!to) return;
    +            setSelection(from, to);
    +          }
    +          return (gutterDirty = true);
    +        }
    +      });
    +    }
    +
    +    function lineInfo(line) {
    +      if (typeof line == "number") {
    +        if (!isLine(line)) return null;
    +        var n = line;
    +        line = getLine(line);
    +        if (!line) return null;
    +      }
    +      else {
    +        var n = lineNo(line);
    +        if (n == null) return null;
    +      }
    +      var marker = line.gutterMarker;
    +      return {line: n, handle: line, text: line.text, markerText: marker && marker.text,
    +              markerClass: marker && marker.style, lineClass: line.className, bgClass: line.bgClassName};
    +    }
    +
    +    function stringWidth(str) {
    +      measure.innerHTML = "<pre><span>x</span></pre>";
    +      measure.firstChild.firstChild.firstChild.nodeValue = str;
    +      return measure.firstChild.firstChild.offsetWidth || 10;
    +    }
    +    // These are used to go from pixel positions to character
    +    // positions, taking varying character widths into account.
    +    function charFromX(line, x) {
    +      if (x <= 0) return 0;
    +      var lineObj = getLine(line), text = lineObj.text;
    +      function getX(len) {
    +        return measureLine(lineObj, len).left;
    +      }
    +      var from = 0, fromX = 0, to = text.length, toX;
    +      // Guess a suitable upper bound for our search.
    +      var estimated = Math.min(to, Math.ceil(x / charWidth()));
    +      for (;;) {
    +        var estX = getX(estimated);
    +        if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));
    +        else {toX = estX; to = estimated; break;}
    +      }
    +      if (x > toX) return to;
    +      // Try to guess a suitable lower bound as well.
    +      estimated = Math.floor(to * 0.8); estX = getX(estimated);
    +      if (estX < x) {from = estimated; fromX = estX;}
    +      // Do a binary search between these bounds.
    +      for (;;) {
    +        if (to - from <= 1) return (toX - x > x - fromX) ? from : to;
    +        var middle = Math.ceil((from + to) / 2), middleX = getX(middle);
    +        if (middleX > x) {to = middle; toX = middleX;}
    +        else {from = middle; fromX = middleX;}
    +      }
    +    }
    +
    +    var tempId = "CodeMirror-temp-" + Math.floor(Math.random() * 0xffffff).toString(16);
    +    function measureLine(line, ch) {
    +      if (ch == 0) return {top: 0, left: 0};
    +      var wbr = options.lineWrapping && ch < line.text.length &&
    +                spanAffectsWrapping.test(line.text.slice(ch - 1, ch + 1));
    +      measure.innerHTML = "<pre>" + line.getHTML(makeTab, ch, tempId, wbr) + "</pre>";
    +      var elt = document.getElementById(tempId);
    +      var top = elt.offsetTop, left = elt.offsetLeft;
    +      // Older IEs report zero offsets for spans directly after a wrap
    +      if (ie && top == 0 && left == 0) {
    +        var backup = document.createElement("span");
    +        backup.innerHTML = "x";
    +        elt.parentNode.insertBefore(backup, elt.nextSibling);
    +        top = backup.offsetTop;
    +      }
    +      return {top: top, left: left};
    +    }
    +    function localCoords(pos, inLineWrap) {
    +      var x, lh = textHeight(), y = lh * (heightAtLine(doc, pos.line) - (inLineWrap ? displayOffset : 0));
    +      if (pos.ch == 0) x = 0;
    +      else {
    +        var sp = measureLine(getLine(pos.line), pos.ch);
    +        x = sp.left;
    +        if (options.lineWrapping) y += Math.max(0, sp.top);
    +      }
    +      return {x: x, y: y, yBot: y + lh};
    +    }
    +    // Coords must be lineSpace-local
    +    function coordsChar(x, y) {
    +      if (y < 0) y = 0;
    +      var th = textHeight(), cw = charWidth(), heightPos = displayOffset + Math.floor(y / th);
    +      var lineNo = lineAtHeight(doc, heightPos);
    +      if (lineNo >= doc.size) return {line: doc.size - 1, ch: getLine(doc.size - 1).text.length};
    +      var lineObj = getLine(lineNo), text = lineObj.text;
    +      var tw = options.lineWrapping, innerOff = tw ? heightPos - heightAtLine(doc, lineNo) : 0;
    +      if (x <= 0 && innerOff == 0) return {line: lineNo, ch: 0};
    +      function getX(len) {
    +        var sp = measureLine(lineObj, len);
    +        if (tw) {
    +          var off = Math.round(sp.top / th);
    +          return Math.max(0, sp.left + (off - innerOff) * scroller.clientWidth);
    +        }
    +        return sp.left;
    +      }
    +      var from = 0, fromX = 0, to = text.length, toX;
    +      // Guess a suitable upper bound for our search.
    +      var estimated = Math.min(to, Math.ceil((x + innerOff * scroller.clientWidth * .9) / cw));
    +      for (;;) {
    +        var estX = getX(estimated);
    +        if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));
    +        else {toX = estX; to = estimated; break;}
    +      }
    +      if (x > toX) return {line: lineNo, ch: to};
    +      // Try to guess a suitable lower bound as well.
    +      estimated = Math.floor(to * 0.8); estX = getX(estimated);
    +      if (estX < x) {from = estimated; fromX = estX;}
    +      // Do a binary search between these bounds.
    +      for (;;) {
    +        if (to - from <= 1) return {line: lineNo, ch: (toX - x > x - fromX) ? from : to};
    +        var middle = Math.ceil((from + to) / 2), middleX = getX(middle);
    +        if (middleX > x) {to = middle; toX = middleX;}
    +        else {from = middle; fromX = middleX;}
    +      }
    +    }
    +    function pageCoords(pos) {
    +      var local = localCoords(pos, true), off = eltOffset(lineSpace);
    +      return {x: off.left + local.x, y: off.top + local.y, yBot: off.top + local.yBot};
    +    }
    +
    +    var cachedHeight, cachedHeightFor, measureText;
    +    function textHeight() {
    +      if (measureText == null) {
    +        measureText = "<pre>";
    +        for (var i = 0; i < 49; ++i) measureText += "x<br/>";
    +        measureText += "x</pre>";
    +      }
    +      var offsetHeight = lineDiv.clientHeight;
    +      if (offsetHeight == cachedHeightFor) return cachedHeight;
    +      cachedHeightFor = offsetHeight;
    +      measure.innerHTML = measureText;
    +      cachedHeight = measure.firstChild.offsetHeight / 50 || 1;
    +      measure.innerHTML = "";
    +      return cachedHeight;
    +    }
    +    var cachedWidth, cachedWidthFor = 0;
    +    function charWidth() {
    +      if (scroller.clientWidth == cachedWidthFor) return cachedWidth;
    +      cachedWidthFor = scroller.clientWidth;
    +      return (cachedWidth = stringWidth("x"));
    +    }
    +    function paddingTop() {return lineSpace.offsetTop;}
    +    function paddingLeft() {return lineSpace.offsetLeft;}
    +
    +    function posFromMouse(e, liberal) {
    +      var offW = eltOffset(scroller, true), x, y;
    +      // Fails unpredictably on IE[67] when mouse is dragged around quickly.
    +      try { x = e.clientX; y = e.clientY; } catch (e) { return null; }
    +      // This is a mess of a heuristic to try and determine whether a
    +      // scroll-bar was clicked or not, and to return null if one was
    +      // (and !liberal).
    +      if (!liberal && (x - offW.left > scroller.clientWidth || y - offW.top > scroller.clientHeight))
    +        return null;
    +      var offL = eltOffset(lineSpace, true);
    +      return coordsChar(x - offL.left, y - offL.top);
    +    }
    +    function onContextMenu(e) {
    +      var pos = posFromMouse(e), scrollPos = scroller.scrollTop;
    +      if (!pos || window.opera) return; // Opera is difficult.
    +      if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to))
    +        operation(setCursor)(pos.line, pos.ch);
    +
    +      var oldCSS = input.style.cssText;
    +      inputDiv.style.position = "absolute";
    +      input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +
    +        "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; " +
    +        "border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
    +      leaveInputAlone = true;
    +      var val = input.value = getSelection();
    +      focusInput();
    +      selectInput(input);
    +      function rehide() {
    +        var newVal = splitLines(input.value).join("\n");
    +        if (newVal != val) operation(replaceSelection)(newVal, "end");
    +        inputDiv.style.position = "relative";
    +        input.style.cssText = oldCSS;
    +        if (ie_lt9) scroller.scrollTop = scrollPos;
    +        leaveInputAlone = false;
    +        resetInput(true);
    +        slowPoll();
    +      }
    +
    +      if (gecko) {
    +        e_stop(e);
    +        var mouseup = connect(window, "mouseup", function() {
    +          mouseup();
    +          setTimeout(rehide, 20);
    +        }, true);
    +      } else {
    +        setTimeout(rehide, 50);
    +      }
    +    }
    +
    +    // Cursor-blinking
    +    function restartBlink() {
    +      clearInterval(blinker);
    +      var on = true;
    +      cursor.style.visibility = "";
    +      blinker = setInterval(function() {
    +        cursor.style.visibility = (on = !on) ? "" : "hidden";
    +      }, 650);
    +    }
    +
    +    var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"};
    +    function matchBrackets(autoclear) {
    +      var head = sel.inverted ? sel.from : sel.to, line = getLine(head.line), pos = head.ch - 1;
    +      var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];
    +      if (!match) return;
    +      var ch = match.charAt(0), forward = match.charAt(1) == ">", d = forward ? 1 : -1, st = line.styles;
    +      for (var off = pos + 1, i = 0, e = st.length; i < e; i+=2)
    +        if ((off -= st[i].length) <= 0) {var style = st[i+1]; break;}
    +
    +      var stack = [line.text.charAt(pos)], re = /[(){}[\]]/;
    +      function scan(line, from, to) {
    +        if (!line.text) return;
    +        var st = line.styles, pos = forward ? 0 : line.text.length - 1, cur;
    +        for (var i = forward ? 0 : st.length - 2, e = forward ? st.length : -2; i != e; i += 2*d) {
    +          var text = st[i];
    +          if (st[i+1] != null && st[i+1] != style) {pos += d * text.length; continue;}
    +          for (var j = forward ? 0 : text.length - 1, te = forward ? text.length : -1; j != te; j += d, pos+=d) {
    +            if (pos >= from && pos < to && re.test(cur = text.charAt(j))) {
    +              var match = matching[cur];
    +              if (match.charAt(1) == ">" == forward) stack.push(cur);
    +              else if (stack.pop() != match.charAt(0)) return {pos: pos, match: false};
    +              else if (!stack.length) return {pos: pos, match: true};
    +            }
    +          }
    +        }
    +      }
    +      for (var i = head.line, e = forward ? Math.min(i + 100, doc.size) : Math.max(-1, i - 100); i != e; i+=d) {
    +        var line = getLine(i), first = i == head.line;
    +        var found = scan(line, first && forward ? pos + 1 : 0, first && !forward ? pos : line.text.length);
    +        if (found) break;
    +      }
    +      if (!found) found = {pos: null, match: false};
    +      var style = found.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
    +      var one = markText({line: head.line, ch: pos}, {line: head.line, ch: pos+1}, style),
    +          two = found.pos != null && markText({line: i, ch: found.pos}, {line: i, ch: found.pos + 1}, style);
    +      var clear = operation(function(){one.clear(); two && two.clear();});
    +      if (autoclear) setTimeout(clear, 800);
    +      else bracketHighlighted = clear;
    +    }
    +
    +    // Finds the line to start with when starting a parse. Tries to
    +    // find a line with a stateAfter, so that it can start with a
    +    // valid state. If that fails, it returns the line with the
    +    // smallest indentation, which tends to need the least context to
    +    // parse correctly.
    +    function findStartLine(n) {
    +      var minindent, minline;
    +      for (var search = n, lim = n - 40; search > lim; --search) {
    +        if (search == 0) return 0;
    +        var line = getLine(search-1);
    +        if (line.stateAfter) return search;
    +        var indented = line.indentation(options.tabSize);
    +        if (minline == null || minindent > indented) {
    +          minline = search - 1;
    +          minindent = indented;
    +        }
    +      }
    +      return minline;
    +    }
    +    function getStateBefore(n) {
    +      var start = findStartLine(n), state = start && getLine(start-1).stateAfter;
    +      if (!state) state = startState(mode);
    +      else state = copyState(mode, state);
    +      doc.iter(start, n, function(line) {
    +        line.highlight(mode, state, options.tabSize);
    +        line.stateAfter = copyState(mode, state);
    +      });
    +      if (start < n) changes.push({from: start, to: n});
    +      if (n < doc.size && !getLine(n).stateAfter) work.push(n);
    +      return state;
    +    }
    +    function highlightLines(start, end) {
    +      var state = getStateBefore(start);
    +      doc.iter(start, end, function(line) {
    +        line.highlight(mode, state, options.tabSize);
    +        line.stateAfter = copyState(mode, state);
    +      });
    +    }
    +    function highlightWorker() {
    +      var end = +new Date + options.workTime;
    +      var foundWork = work.length;
    +      while (work.length) {
    +        if (!getLine(showingFrom).stateAfter) var task = showingFrom;
    +        else var task = work.pop();
    +        if (task >= doc.size) continue;
    +        var start = findStartLine(task), state = start && getLine(start-1).stateAfter;
    +        if (state) state = copyState(mode, state);
    +        else state = startState(mode);
    +
    +        var unchanged = 0, compare = mode.compareStates, realChange = false,
    +            i = start, bail = false;
    +        doc.iter(i, doc.size, function(line) {
    +          var hadState = line.stateAfter;
    +          if (+new Date > end) {
    +            work.push(i);
    +            startWorker(options.workDelay);
    +            if (realChange) changes.push({from: task, to: i + 1});
    +            return (bail = true);
    +          }
    +          var changed = line.highlight(mode, state, options.tabSize);
    +          if (changed) realChange = true;
    +          line.stateAfter = copyState(mode, state);
    +          var done = null;
    +          if (compare) {
    +            var same = hadState && compare(hadState, state);
    +            if (same != Pass) done = !!same;
    +          }
    +          if (done == null) {
    +            if (changed !== false || !hadState) unchanged = 0;
    +            else if (++unchanged > 3 && (!mode.indent || mode.indent(hadState, "") == mode.indent(state, "")))
    +              done = true;
    +          }
    +          if (done) return true;
    +          ++i;
    +        });
    +        if (bail) return;
    +        if (realChange) changes.push({from: task, to: i + 1});
    +      }
    +      if (foundWork && options.onHighlightComplete)
    +        options.onHighlightComplete(instance);
    +    }
    +    function startWorker(time) {
    +      if (!work.length) return;
    +      highlight.set(time, operation(highlightWorker));
    +    }
    +
    +    // Operations are used to wrap changes in such a way that each
    +    // change won't have to update the cursor and display (which would
    +    // be awkward, slow, and error-prone), but instead updates are
    +    // batched and then all combined and executed at once.
    +    function startOperation() {
    +      updateInput = userSelChange = textChanged = null;
    +      changes = []; selectionChanged = false; callbacks = [];
    +    }
    +    function endOperation() {
    +      var reScroll = false, updated;
    +      if (selectionChanged) reScroll = !scrollCursorIntoView();
    +      if (changes.length) updated = updateDisplay(changes, true);
    +      else {
    +        if (selectionChanged) updateSelection();
    +        if (gutterDirty) updateGutter();
    +      }
    +      if (reScroll) scrollCursorIntoView();
    +      if (selectionChanged) {scrollEditorIntoView(); restartBlink();}
    +
    +      if (focused && !leaveInputAlone &&
    +          (updateInput === true || (updateInput !== false && selectionChanged)))
    +        resetInput(userSelChange);
    +
    +      if (selectionChanged && options.matchBrackets)
    +        setTimeout(operation(function() {
    +          if (bracketHighlighted) {bracketHighlighted(); bracketHighlighted = null;}
    +          if (posEq(sel.from, sel.to)) matchBrackets(false);
    +        }), 20);
    +      var tc = textChanged, cbs = callbacks; // these can be reset by callbacks
    +      if (selectionChanged && options.onCursorActivity)
    +        options.onCursorActivity(instance);
    +      if (tc && options.onChange && instance)
    +        options.onChange(instance, tc);
    +      for (var i = 0; i < cbs.length; ++i) cbs[i](instance);
    +      if (updated && options.onUpdate) options.onUpdate(instance);
    +    }
    +    var nestedOperation = 0;
    +    function operation(f) {
    +      return function() {
    +        if (!nestedOperation++) startOperation();
    +        try {var result = f.apply(this, arguments);}
    +        finally {if (!--nestedOperation) endOperation();}
    +        return result;
    +      };
    +    }
    +
    +    function compoundChange(f) {
    +      history.startCompound();
    +      try { return f(); } finally { history.endCompound(); }
    +    }
    +
    +    for (var ext in extensions)
    +      if (extensions.propertyIsEnumerable(ext) &&
    +          !instance.propertyIsEnumerable(ext))
    +        instance[ext] = extensions[ext];
    +    return instance;
    +  } // (end of function CodeMirror)
    +
    +  // The default configuration options.
    +  CodeMirror.defaults = {
    +    value: "",
    +    mode: null,
    +    theme: "default",
    +    indentUnit: 2,
    +    indentWithTabs: false,
    +    smartIndent: true,
    +    tabSize: 4,
    +    keyMap: "default",
    +    extraKeys: null,
    +    electricChars: true,
    +    autoClearEmptyLines: false,
    +    onKeyEvent: null,
    +    onDragEvent: null,
    +    lineWrapping: false,
    +    lineNumbers: false,
    +    gutter: false,
    +    fixedGutter: false,
    +    firstLineNumber: 1,
    +    readOnly: false,
    +    dragDrop: true,
    +    onChange: null,
    +    onCursorActivity: null,
    +    onGutterClick: null,
    +    onHighlightComplete: null,
    +    onUpdate: null,
    +    onFocus: null, onBlur: null, onScroll: null,
    +    matchBrackets: false,
    +    workTime: 100,
    +    workDelay: 200,
    +    pollInterval: 100,
    +    undoDepth: 40,
    +    tabindex: null,
    +    autofocus: null
    +  };
    +
    +  var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent);
    +  var mac = ios || /Mac/.test(navigator.platform);
    +  var win = /Win/.test(navigator.platform);
    +
    +  // Known modes, by name and by MIME
    +  var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};
    +  CodeMirror.defineMode = function(name, mode) {
    +    if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
    +    if (arguments.length > 2) {
    +      mode.dependencies = [];
    +      for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]);
    +    }
    +    modes[name] = mode;
    +  };
    +  CodeMirror.defineMIME = function(mime, spec) {
    +    mimeModes[mime] = spec;
    +  };
    +  CodeMirror.resolveMode = function(spec) {
    +    if (typeof spec == "string" && mimeModes.hasOwnProperty(spec))
    +      spec = mimeModes[spec];
    +    else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec))
    +      return CodeMirror.resolveMode("application/xml");
    +    if (typeof spec == "string") return {name: spec};
    +    else return spec || {name: "null"};
    +  };
    +  CodeMirror.getMode = function(options, spec) {
    +    var spec = CodeMirror.resolveMode(spec);
    +    var mfactory = modes[spec.name];
    +    if (!mfactory) return CodeMirror.getMode(options, "text/plain");
    +    return mfactory(options, spec);
    +  };
    +  CodeMirror.listModes = function() {
    +    var list = [];
    +    for (var m in modes)
    +      if (modes.propertyIsEnumerable(m)) list.push(m);
    +    return list;
    +  };
    +  CodeMirror.listMIMEs = function() {
    +    var list = [];
    +    for (var m in mimeModes)
    +      if (mimeModes.propertyIsEnumerable(m)) list.push({mime: m, mode: mimeModes[m]});
    +    return list;
    +  };
    +
    +  var extensions = CodeMirror.extensions = {};
    +  CodeMirror.defineExtension = function(name, func) {
    +    extensions[name] = func;
    +  };
    +
    +  var commands = CodeMirror.commands = {
    +    selectAll: function(cm) {cm.setSelection({line: 0, ch: 0}, {line: cm.lineCount() - 1});},
    +    killLine: function(cm) {
    +      var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);
    +      if (!sel && cm.getLine(from.line).length == from.ch) cm.replaceRange("", from, {line: from.line + 1, ch: 0});
    +      else cm.replaceRange("", from, sel ? to : {line: from.line});
    +    },
    +    deleteLine: function(cm) {var l = cm.getCursor().line; cm.replaceRange("", {line: l, ch: 0}, {line: l});},
    +    undo: function(cm) {cm.undo();},
    +    redo: function(cm) {cm.redo();},
    +    goDocStart: function(cm) {cm.setCursor(0, 0, true);},
    +    goDocEnd: function(cm) {cm.setSelection({line: cm.lineCount() - 1}, null, true);},
    +    goLineStart: function(cm) {cm.setCursor(cm.getCursor().line, 0, true);},
    +    goLineStartSmart: function(cm) {
    +      var cur = cm.getCursor();
    +      var text = cm.getLine(cur.line), firstNonWS = Math.max(0, text.search(/\S/));
    +      cm.setCursor(cur.line, cur.ch <= firstNonWS && cur.ch ? 0 : firstNonWS, true);
    +    },
    +    goLineEnd: function(cm) {cm.setSelection({line: cm.getCursor().line}, null, true);},
    +    goLineUp: function(cm) {cm.moveV(-1, "line");},
    +    goLineDown: function(cm) {cm.moveV(1, "line");},
    +    goPageUp: function(cm) {cm.moveV(-1, "page");},
    +    goPageDown: function(cm) {cm.moveV(1, "page");},
    +    goCharLeft: function(cm) {cm.moveH(-1, "char");},
    +    goCharRight: function(cm) {cm.moveH(1, "char");},
    +    goColumnLeft: function(cm) {cm.moveH(-1, "column");},
    +    goColumnRight: function(cm) {cm.moveH(1, "column");},
    +    goWordLeft: function(cm) {cm.moveH(-1, "word");},
    +    goWordRight: function(cm) {cm.moveH(1, "word");},
    +    delCharLeft: function(cm) {cm.deleteH(-1, "char");},
    +    delCharRight: function(cm) {cm.deleteH(1, "char");},
    +    delWordLeft: function(cm) {cm.deleteH(-1, "word");},
    +    delWordRight: function(cm) {cm.deleteH(1, "word");},
    +    indentAuto: function(cm) {cm.indentSelection("smart");},
    +    indentMore: function(cm) {cm.indentSelection("add");},
    +    indentLess: function(cm) {cm.indentSelection("subtract");},
    +    insertTab: function(cm) {cm.replaceSelection("\t", "end");},
    +    transposeChars: function(cm) {
    +      var cur = cm.getCursor(), line = cm.getLine(cur.line);
    +      if (cur.ch > 0 && cur.ch < line.length - 1)
    +        cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1),
    +                        {line: cur.line, ch: cur.ch - 1}, {line: cur.line, ch: cur.ch + 1});
    +    },
    +    newlineAndIndent: function(cm) {
    +      cm.replaceSelection("\n", "end");
    +      cm.indentLine(cm.getCursor().line);
    +    },
    +    toggleOverwrite: function(cm) {cm.toggleOverwrite();}
    +  };
    +
    +  var keyMap = CodeMirror.keyMap = {};
    +  keyMap.basic = {
    +    "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
    +    "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
    +    "Delete": "delCharRight", "Backspace": "delCharLeft", "Tab": "insertTab", "Shift-Tab": "indentAuto",
    +    "Enter": "newlineAndIndent", "Insert": "toggleOverwrite"
    +  };
    +  // Note that the save and find-related commands aren't defined by
    +  // default. Unknown commands are simply ignored.
    +  keyMap.pcDefault = {
    +    "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
    +    "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
    +    "Ctrl-Left": "goWordLeft", "Ctrl-Right": "goWordRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
    +    "Ctrl-Backspace": "delWordLeft", "Ctrl-Delete": "delWordRight", "Ctrl-S": "save", "Ctrl-F": "find",
    +    "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
    +    "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
    +    fallthrough: "basic"
    +  };
    +  keyMap.macDefault = {
    +    "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
    +    "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goWordLeft",
    +    "Alt-Right": "goWordRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delWordLeft",
    +    "Ctrl-Alt-Backspace": "delWordRight", "Alt-Delete": "delWordRight", "Cmd-S": "save", "Cmd-F": "find",
    +    "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
    +    "Cmd-[": "indentLess", "Cmd-]": "indentMore",
    +    fallthrough: ["basic", "emacsy"]
    +  };
    +  keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
    +  keyMap.emacsy = {
    +    "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
    +    "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
    +    "Ctrl-V": "goPageUp", "Shift-Ctrl-V": "goPageDown", "Ctrl-D": "delCharRight", "Ctrl-H": "delCharLeft",
    +    "Alt-D": "delWordRight", "Alt-Backspace": "delWordLeft", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
    +  };
    +
    +  function getKeyMap(val) {
    +    if (typeof val == "string") return keyMap[val];
    +    else return val;
    +  }
    +  function lookupKey(name, extraMap, map, handle, stop) {
    +    function lookup(map) {
    +      map = getKeyMap(map);
    +      var found = map[name];
    +      if (found != null && handle(found)) return true;
    +      if (map.nofallthrough) {
    +        if (stop) stop();
    +        return true;
    +      }
    +      var fallthrough = map.fallthrough;
    +      if (fallthrough == null) return false;
    +      if (Object.prototype.toString.call(fallthrough) != "[object Array]")
    +        return lookup(fallthrough);
    +      for (var i = 0, e = fallthrough.length; i < e; ++i) {
    +        if (lookup(fallthrough[i])) return true;
    +      }
    +      return false;
    +    }
    +    if (extraMap && lookup(extraMap)) return true;
    +    return lookup(map);
    +  }
    +  function isModifierKey(event) {
    +    var name = keyNames[e_prop(event, "keyCode")];
    +    return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
    +  }
    +
    +  CodeMirror.fromTextArea = function(textarea, options) {
    +    if (!options) options = {};
    +    options.value = textarea.value;
    +    if (!options.tabindex && textarea.tabindex)
    +      options.tabindex = textarea.tabindex;
    +    if (options.autofocus == null && textarea.getAttribute("autofocus") != null)
    +      options.autofocus = true;
    +
    +    function save() {textarea.value = instance.getValue();}
    +    if (textarea.form) {
    +      // Deplorable hack to make the submit method do the right thing.
    +      var rmSubmit = connect(textarea.form, "submit", save, true);
    +      if (typeof textarea.form.submit == "function") {
    +        var realSubmit = textarea.form.submit;
    +        function wrappedSubmit() {
    +          save();
    +          textarea.form.submit = realSubmit;
    +          textarea.form.submit();
    +          textarea.form.submit = wrappedSubmit;
    +        }
    +        textarea.form.submit = wrappedSubmit;
    +      }
    +    }
    +
    +    textarea.style.display = "none";
    +    var instance = CodeMirror(function(node) {
    +      textarea.parentNode.insertBefore(node, textarea.nextSibling);
    +    }, options);
    +    instance.save = save;
    +    instance.getTextArea = function() { return textarea; };
    +    instance.toTextArea = function() {
    +      save();
    +      textarea.parentNode.removeChild(instance.getWrapperElement());
    +      textarea.style.display = "";
    +      if (textarea.form) {
    +        rmSubmit();
    +        if (typeof textarea.form.submit == "function")
    +          textarea.form.submit = realSubmit;
    +      }
    +    };
    +    return instance;
    +  };
    +
    +  // Utility functions for working with state. Exported because modes
    +  // sometimes need to do this.
    +  function copyState(mode, state) {
    +    if (state === true) return state;
    +    if (mode.copyState) return mode.copyState(state);
    +    var nstate = {};
    +    for (var n in state) {
    +      var val = state[n];
    +      if (val instanceof Array) val = val.concat([]);
    +      nstate[n] = val;
    +    }
    +    return nstate;
    +  }
    +  CodeMirror.copyState = copyState;
    +  function startState(mode, a1, a2) {
    +    return mode.startState ? mode.startState(a1, a2) : true;
    +  }
    +  CodeMirror.startState = startState;
    +
    +  // The character stream used by a mode's parser.
    +  function StringStream(string, tabSize) {
    +    this.pos = this.start = 0;
    +    this.string = string;
    +    this.tabSize = tabSize || 8;
    +  }
    +  StringStream.prototype = {
    +    eol: function() {return this.pos >= this.string.length;},
    +    sol: function() {return this.pos == 0;},
    +    peek: function() {return this.string.charAt(this.pos);},
    +    next: function() {
    +      if (this.pos < this.string.length)
    +        return this.string.charAt(this.pos++);
    +    },
    +    eat: function(match) {
    +      var ch = this.string.charAt(this.pos);
    +      if (typeof match == "string") var ok = ch == match;
    +      else var ok = ch && (match.test ? match.test(ch) : match(ch));
    +      if (ok) {++this.pos; return ch;}
    +    },
    +    eatWhile: function(match) {
    +      var start = this.pos;
    +      while (this.eat(match)){}
    +      return this.pos > start;
    +    },
    +    eatSpace: function() {
    +      var start = this.pos;
    +      while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
    +      return this.pos > start;
    +    },
    +    skipToEnd: function() {this.pos = this.string.length;},
    +    skipTo: function(ch) {
    +      var found = this.string.indexOf(ch, this.pos);
    +      if (found > -1) {this.pos = found; return true;}
    +    },
    +    backUp: function(n) {this.pos -= n;},
    +    column: function() {return countColumn(this.string, this.start, this.tabSize);},
    +    indentation: function() {return countColumn(this.string, null, this.tabSize);},
    +    match: function(pattern, consume, caseInsensitive) {
    +      if (typeof pattern == "string") {
    +        function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
    +        if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
    +          if (consume !== false) this.pos += pattern.length;
    +          return true;
    +        }
    +      }
    +      else {
    +        var match = this.string.slice(this.pos).match(pattern);
    +        if (match && consume !== false) this.pos += match[0].length;
    +        return match;
    +      }
    +    },
    +    current: function(){return this.string.slice(this.start, this.pos);}
    +  };
    +  CodeMirror.StringStream = StringStream;
    +
    +  function MarkedText(from, to, className, marker) {
    +    this.from = from; this.to = to; this.style = className; this.marker = marker;
    +  }
    +  MarkedText.prototype = {
    +    attach: function(line) { this.marker.set.push(line); },
    +    detach: function(line) {
    +      var ix = indexOf(this.marker.set, line);
    +      if (ix > -1) this.marker.set.splice(ix, 1);
    +    },
    +    split: function(pos, lenBefore) {
    +      if (this.to <= pos && this.to != null) return null;
    +      var from = this.from < pos || this.from == null ? null : this.from - pos + lenBefore;
    +      var to = this.to == null ? null : this.to - pos + lenBefore;
    +      return new MarkedText(from, to, this.style, this.marker);
    +    },
    +    dup: function() { return new MarkedText(null, null, this.style, this.marker); },
    +    clipTo: function(fromOpen, from, toOpen, to, diff) {
    +      if (fromOpen && to > this.from && (to < this.to || this.to == null))
    +        this.from = null;
    +      else if (this.from != null && this.from >= from)
    +        this.from = Math.max(to, this.from) + diff;
    +      if (toOpen && (from < this.to || this.to == null) && (from > this.from || this.from == null))
    +        this.to = null;
    +      else if (this.to != null && this.to > from)
    +        this.to = to < this.to ? this.to + diff : from;
    +    },
    +    isDead: function() { return this.from != null && this.to != null && this.from >= this.to; },
    +    sameSet: function(x) { return this.marker == x.marker; }
    +  };
    +
    +  function Bookmark(pos) {
    +    this.from = pos; this.to = pos; this.line = null;
    +  }
    +  Bookmark.prototype = {
    +    attach: function(line) { this.line = line; },
    +    detach: function(line) { if (this.line == line) this.line = null; },
    +    split: function(pos, lenBefore) {
    +      if (pos < this.from) {
    +        this.from = this.to = (this.from - pos) + lenBefore;
    +        return this;
    +      }
    +    },
    +    isDead: function() { return this.from > this.to; },
    +    clipTo: function(fromOpen, from, toOpen, to, diff) {
    +      if ((fromOpen || from < this.from) && (toOpen || to > this.to)) {
    +        this.from = 0; this.to = -1;
    +      } else if (this.from > from) {
    +        this.from = this.to = Math.max(to, this.from) + diff;
    +      }
    +    },
    +    sameSet: function(x) { return false; },
    +    find: function() {
    +      if (!this.line || !this.line.parent) return null;
    +      return {line: lineNo(this.line), ch: this.from};
    +    },
    +    clear: function() {
    +      if (this.line) {
    +        var found = indexOf(this.line.marked, this);
    +        if (found != -1) this.line.marked.splice(found, 1);
    +        this.line = null;
    +      }
    +    }
    +  };
    +
    +  // Line objects. These hold state related to a line, including
    +  // highlighting info (the styles array).
    +  function Line(text, styles) {
    +    this.styles = styles || [text, null];
    +    this.text = text;
    +    this.height = 1;
    +    this.marked = this.gutterMarker = this.className = this.bgClassName = this.handlers = null;
    +    this.stateAfter = this.parent = this.hidden = null;
    +  }
    +  Line.inheritMarks = function(text, orig) {
    +    var ln = new Line(text), mk = orig && orig.marked;
    +    if (mk) {
    +      for (var i = 0; i < mk.length; ++i) {
    +        if (mk[i].to == null && mk[i].style) {
    +          var newmk = ln.marked || (ln.marked = []), mark = mk[i];
    +          var nmark = mark.dup(); newmk.push(nmark); nmark.attach(ln);
    +        }
    +      }
    +    }
    +    return ln;
    +  }
    +  Line.prototype = {
    +    // Replace a piece of a line, keeping the styles around it intact.
    +    replace: function(from, to_, text) {
    +      var st = [], mk = this.marked, to = to_ == null ? this.text.length : to_;
    +      copyStyles(0, from, this.styles, st);
    +      if (text) st.push(text, null);
    +      copyStyles(to, this.text.length, this.styles, st);
    +      this.styles = st;
    +      this.text = this.text.slice(0, from) + text + this.text.slice(to);
    +      this.stateAfter = null;
    +      if (mk) {
    +        var diff = text.length - (to - from);
    +        for (var i = 0; i < mk.length; ++i) {
    +          var mark = mk[i];
    +          mark.clipTo(from == null, from || 0, to_ == null, to, diff);
    +          if (mark.isDead()) {mark.detach(this); mk.splice(i--, 1);}
    +        }
    +      }
    +    },
    +    // Split a part off a line, keeping styles and markers intact.
    +    split: function(pos, textBefore) {
    +      var st = [textBefore, null], mk = this.marked;
    +      copyStyles(pos, this.text.length, this.styles, st);
    +      var taken = new Line(textBefore + this.text.slice(pos), st);
    +      if (mk) {
    +        for (var i = 0; i < mk.length; ++i) {
    +          var mark = mk[i];
    +          var newmark = mark.split(pos, textBefore.length);
    +          if (newmark) {
    +            if (!taken.marked) taken.marked = [];
    +            taken.marked.push(newmark); newmark.attach(taken);
    +            if (newmark == mark) mk.splice(i--, 1);
    +          }
    +        }
    +      }
    +      return taken;
    +    },
    +    append: function(line) {
    +      var mylen = this.text.length, mk = line.marked, mymk = this.marked;
    +      this.text += line.text;
    +      copyStyles(0, line.text.length, line.styles, this.styles);
    +      if (mymk) {
    +        for (var i = 0; i < mymk.length; ++i)
    +          if (mymk[i].to == null) mymk[i].to = mylen;
    +      }
    +      if (mk && mk.length) {
    +        if (!mymk) this.marked = mymk = [];
    +        outer: for (var i = 0; i < mk.length; ++i) {
    +          var mark = mk[i];
    +          if (!mark.from) {
    +            for (var j = 0; j < mymk.length; ++j) {
    +              var mymark = mymk[j];
    +              if (mymark.to == mylen && mymark.sameSet(mark)) {
    +                mymark.to = mark.to == null ? null : mark.to + mylen;
    +                if (mymark.isDead()) {
    +                  mymark.detach(this);
    +                  mk.splice(i--, 1);
    +                }
    +                continue outer;
    +              }
    +            }
    +          }
    +          mymk.push(mark);
    +          mark.attach(this);
    +          mark.from += mylen;
    +          if (mark.to != null) mark.to += mylen;
    +        }
    +      }
    +    },
    +    fixMarkEnds: function(other) {
    +      var mk = this.marked, omk = other.marked;
    +      if (!mk) return;
    +      for (var i = 0; i < mk.length; ++i) {
    +        var mark = mk[i], close = mark.to == null;
    +        if (close && omk) {
    +          for (var j = 0; j < omk.length; ++j)
    +            if (omk[j].sameSet(mark)) {close = false; break;}
    +        }
    +        if (close) mark.to = this.text.length;
    +      }
    +    },
    +    fixMarkStarts: function() {
    +      var mk = this.marked;
    +      if (!mk) return;
    +      for (var i = 0; i < mk.length; ++i)
    +        if (mk[i].from == null) mk[i].from = 0;
    +    },
    +    addMark: function(mark) {
    +      mark.attach(this);
    +      if (this.marked == null) this.marked = [];
    +      this.marked.push(mark);
    +      this.marked.sort(function(a, b){return (a.from || 0) - (b.from || 0);});
    +    },
    +    // Run the given mode's parser over a line, update the styles
    +    // array, which contains alternating fragments of text and CSS
    +    // classes.
    +    highlight: function(mode, state, tabSize) {
    +      var stream = new StringStream(this.text, tabSize), st = this.styles, pos = 0;
    +      var changed = false, curWord = st[0], prevWord;
    +      if (this.text == "" && mode.blankLine) mode.blankLine(state);
    +      while (!stream.eol()) {
    +        var style = mode.token(stream, state);
    +        var substr = this.text.slice(stream.start, stream.pos);
    +        stream.start = stream.pos;
    +        if (pos && st[pos-1] == style)
    +          st[pos-2] += substr;
    +        else if (substr) {
    +          if (!changed && (st[pos+1] != style || (pos && st[pos-2] != prevWord))) changed = true;
    +          st[pos++] = substr; st[pos++] = style;
    +          prevWord = curWord; curWord = st[pos];
    +        }
    +        // Give up when line is ridiculously long
    +        if (stream.pos > 5000) {
    +          st[pos++] = this.text.slice(stream.pos); st[pos++] = null;
    +          break;
    +        }
    +      }
    +      if (st.length != pos) {st.length = pos; changed = true;}
    +      if (pos && st[pos-2] != prevWord) changed = true;
    +      // Short lines with simple highlights return null, and are
    +      // counted as changed by the driver because they are likely to
    +      // highlight the same way in various contexts.
    +      return changed || (st.length < 5 && this.text.length < 10 ? null : false);
    +    },
    +    // Fetch the parser token for a given character. Useful for hacks
    +    // that want to inspect the mode state (say, for completion).
    +    getTokenAt: function(mode, state, ch) {
    +      var txt = this.text, stream = new StringStream(txt);
    +      while (stream.pos < ch && !stream.eol()) {
    +        stream.start = stream.pos;
    +        var style = mode.token(stream, state);
    +      }
    +      return {start: stream.start,
    +              end: stream.pos,
    +              string: stream.current(),
    +              className: style || null,
    +              state: state};
    +    },
    +    indentation: function(tabSize) {return countColumn(this.text, null, tabSize);},
    +    // Produces an HTML fragment for the line, taking selection,
    +    // marking, and highlighting into account.
    +    getHTML: function(makeTab, wrapAt, wrapId, wrapWBR) {
    +      var html = [], first = true, col = 0;
    +      function span_(text, style) {
    +        if (!text) return;
    +        // Work around a bug where, in some compat modes, IE ignores leading spaces
    +        if (first && ie && text.charAt(0) == " ") text = "\u00a0" + text.slice(1);
    +        first = false;
    +        if (text.indexOf("\t") == -1) {
    +          col += text.length;
    +          var escaped = htmlEscape(text);
    +        } else {
    +          var escaped = "";
    +          for (var pos = 0;;) {
    +            var idx = text.indexOf("\t", pos);
    +            if (idx == -1) {
    +              escaped += htmlEscape(text.slice(pos));
    +              col += text.length - pos;
    +              break;
    +            } else {
    +              col += idx - pos;
    +              var tab = makeTab(col);
    +              escaped += htmlEscape(text.slice(pos, idx)) + tab.html;
    +              col += tab.width;
    +              pos = idx + 1;
    +            }
    +          }
    +        }
    +        if (style) html.push('<span class="', style, '">', escaped, "</span>");
    +        else html.push(escaped);
    +      }
    +      var span = span_;
    +      if (wrapAt != null) {
    +        var outPos = 0, open = "<span id=\"" + wrapId + "\">";
    +        span = function(text, style) {
    +          var l = text.length;
    +          if (wrapAt >= outPos && wrapAt < outPos + l) {
    +            if (wrapAt > outPos) {
    +              span_(text.slice(0, wrapAt - outPos), style);
    +              // See comment at the definition of spanAffectsWrapping
    +              if (wrapWBR) html.push("<wbr>");
    +            }
    +            html.push(open);
    +            span_(text.slice(wrapAt - outPos), style);
    +            html.push("</span>");
    +            wrapAt--;
    +            outPos += l;
    +          } else {
    +            outPos += l;
    +            span_(text, style);
    +            // Output empty wrapper when at end of line
    +            if (outPos == wrapAt && outPos == len) html.push(open + "</span>");
    +            // Stop outputting HTML when gone sufficiently far beyond measure
    +            else if (outPos > wrapAt + 10 && /\s/.test(text)) span = function(){};
    +          }
    +        }
    +      }
    +
    +      var st = this.styles, allText = this.text, marked = this.marked;
    +      var len = allText.length;
    +      function styleToClass(style) {
    +        if (!style) return null;
    +        return "cm-" + style.replace(/ +/g, " cm-");
    +      }
    +
    +      if (!allText && wrapAt == null) {
    +        span(" ");
    +      } else if (!marked || !marked.length) {
    +        for (var i = 0, ch = 0; ch < len; i+=2) {
    +          var str = st[i], style = st[i+1], l = str.length;
    +          if (ch + l > len) str = str.slice(0, len - ch);
    +          ch += l;
    +          span(str, styleToClass(style));
    +        }
    +      } else {
    +        var pos = 0, i = 0, text = "", style, sg = 0;
    +        var nextChange = marked[0].from || 0, marks = [], markpos = 0;
    +        function advanceMarks() {
    +          var m;
    +          while (markpos < marked.length &&
    +                 ((m = marked[markpos]).from == pos || m.from == null)) {
    +            if (m.style != null) marks.push(m);
    +            ++markpos;
    +          }
    +          nextChange = markpos < marked.length ? marked[markpos].from : Infinity;
    +          for (var i = 0; i < marks.length; ++i) {
    +            var to = marks[i].to || Infinity;
    +            if (to == pos) marks.splice(i--, 1);
    +            else nextChange = Math.min(to, nextChange);
    +          }
    +        }
    +        var m = 0;
    +        while (pos < len) {
    +          if (nextChange == pos) advanceMarks();
    +          var upto = Math.min(len, nextChange);
    +          while (true) {
    +            if (text) {
    +              var end = pos + text.length;
    +              var appliedStyle = style;
    +              for (var j = 0; j < marks.length; ++j)
    +                appliedStyle = (appliedStyle ? appliedStyle + " " : "") + marks[j].style;
    +              span(end > upto ? text.slice(0, upto - pos) : text, appliedStyle);
    +              if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
    +              pos = end;
    +            }
    +            text = st[i++]; style = styleToClass(st[i++]);
    +          }
    +        }
    +      }
    +      return html.join("");
    +    },
    +    cleanUp: function() {
    +      this.parent = null;
    +      if (this.marked)
    +        for (var i = 0, e = this.marked.length; i < e; ++i) this.marked[i].detach(this);
    +    }
    +  };
    +  // Utility used by replace and split above
    +  function copyStyles(from, to, source, dest) {
    +    for (var i = 0, pos = 0, state = 0; pos < to; i+=2) {
    +      var part = source[i], end = pos + part.length;
    +      if (state == 0) {
    +        if (end > from) dest.push(part.slice(from - pos, Math.min(part.length, to - pos)), source[i+1]);
    +        if (end >= from) state = 1;
    +      }
    +      else if (state == 1) {
    +        if (end > to) dest.push(part.slice(0, to - pos), source[i+1]);
    +        else dest.push(part, source[i+1]);
    +      }
    +      pos = end;
    +    }
    +  }
    +
    +  // Data structure that holds the sequence of lines.
    +  function LeafChunk(lines) {
    +    this.lines = lines;
    +    this.parent = null;
    +    for (var i = 0, e = lines.length, height = 0; i < e; ++i) {
    +      lines[i].parent = this;
    +      height += lines[i].height;
    +    }
    +    this.height = height;
    +  }
    +  LeafChunk.prototype = {
    +    chunkSize: function() { return this.lines.length; },
    +    remove: function(at, n, callbacks) {
    +      for (var i = at, e = at + n; i < e; ++i) {
    +        var line = this.lines[i];
    +        this.height -= line.height;
    +        line.cleanUp();
    +        if (line.handlers)
    +          for (var j = 0; j < line.handlers.length; ++j) callbacks.push(line.handlers[j]);
    +      }
    +      this.lines.splice(at, n);
    +    },
    +    collapse: function(lines) {
    +      lines.splice.apply(lines, [lines.length, 0].concat(this.lines));
    +    },
    +    insertHeight: function(at, lines, height) {
    +      this.height += height;
    +      // The trick below is apparently too advanced for IE, which
    +      // occasionally corrupts this.lines (duplicating elements) when
    +      // it is used.
    +      if (ie) this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
    +      else this.lines.splice.apply(this.lines, [at, 0].concat(lines));
    +      for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this;
    +    },
    +    iterN: function(at, n, op) {
    +      for (var e = at + n; at < e; ++at)
    +        if (op(this.lines[at])) return true;
    +    }
    +  };
    +  function BranchChunk(children) {
    +    this.children = children;
    +    var size = 0, height = 0;
    +    for (var i = 0, e = children.length; i < e; ++i) {
    +      var ch = children[i];
    +      size += ch.chunkSize(); height += ch.height;
    +      ch.parent = this;
    +    }
    +    this.size = size;
    +    this.height = height;
    +    this.parent = null;
    +  }
    +  BranchChunk.prototype = {
    +    chunkSize: function() { return this.size; },
    +    remove: function(at, n, callbacks) {
    +      this.size -= n;
    +      for (var i = 0; i < this.children.length; ++i) {
    +        var child = this.children[i], sz = child.chunkSize();
    +        if (at < sz) {
    +          var rm = Math.min(n, sz - at), oldHeight = child.height;
    +          child.remove(at, rm, callbacks);
    +          this.height -= oldHeight - child.height;
    +          if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
    +          if ((n -= rm) == 0) break;
    +          at = 0;
    +        } else at -= sz;
    +      }
    +      if (this.size - n < 25) {
    +        var lines = [];
    +        this.collapse(lines);
    +        this.children = [new LeafChunk(lines)];
    +        this.children[0].parent = this;
    +      }
    +    },
    +    collapse: function(lines) {
    +      for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines);
    +    },
    +    insert: function(at, lines) {
    +      var height = 0;
    +      for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height;
    +      this.insertHeight(at, lines, height);
    +    },
    +    insertHeight: function(at, lines, height) {
    +      this.size += lines.length;
    +      this.height += height;
    +      for (var i = 0, e = this.children.length; i < e; ++i) {
    +        var child = this.children[i], sz = child.chunkSize();
    +        if (at <= sz) {
    +          child.insertHeight(at, lines, height);
    +          if (child.lines && child.lines.length > 50) {
    +            while (child.lines.length > 50) {
    +              var spilled = child.lines.splice(child.lines.length - 25, 25);
    +              var newleaf = new LeafChunk(spilled);
    +              child.height -= newleaf.height;
    +              this.children.splice(i + 1, 0, newleaf);
    +              newleaf.parent = this;
    +            }
    +            this.maybeSpill();
    +          }
    +          break;
    +        }
    +        at -= sz;
    +      }
    +    },
    +    maybeSpill: function() {
    +      if (this.children.length <= 10) return;
    +      var me = this;
    +      do {
    +        var spilled = me.children.splice(me.children.length - 5, 5);
    +        var sibling = new BranchChunk(spilled);
    +        if (!me.parent) { // Become the parent node
    +          var copy = new BranchChunk(me.children);
    +          copy.parent = me;
    +          me.children = [copy, sibling];
    +          me = copy;
    +        } else {
    +          me.size -= sibling.size;
    +          me.height -= sibling.height;
    +          var myIndex = indexOf(me.parent.children, me);
    +          me.parent.children.splice(myIndex + 1, 0, sibling);
    +        }
    +        sibling.parent = me.parent;
    +      } while (me.children.length > 10);
    +      me.parent.maybeSpill();
    +    },
    +    iter: function(from, to, op) { this.iterN(from, to - from, op); },
    +    iterN: function(at, n, op) {
    +      for (var i = 0, e = this.children.length; i < e; ++i) {
    +        var child = this.children[i], sz = child.chunkSize();
    +        if (at < sz) {
    +          var used = Math.min(n, sz - at);
    +          if (child.iterN(at, used, op)) return true;
    +          if ((n -= used) == 0) break;
    +          at = 0;
    +        } else at -= sz;
    +      }
    +    }
    +  };
    +
    +  function getLineAt(chunk, n) {
    +    while (!chunk.lines) {
    +      for (var i = 0;; ++i) {
    +        var child = chunk.children[i], sz = child.chunkSize();
    +        if (n < sz) { chunk = child; break; }
    +        n -= sz;
    +      }
    +    }
    +    return chunk.lines[n];
    +  }
    +  function lineNo(line) {
    +    if (line.parent == null) return null;
    +    var cur = line.parent, no = indexOf(cur.lines, line);
    +    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
    +      for (var i = 0, e = chunk.children.length; ; ++i) {
    +        if (chunk.children[i] == cur) break;
    +        no += chunk.children[i].chunkSize();
    +      }
    +    }
    +    return no;
    +  }
    +  function lineAtHeight(chunk, h) {
    +    var n = 0;
    +    outer: do {
    +      for (var i = 0, e = chunk.children.length; i < e; ++i) {
    +        var child = chunk.children[i], ch = child.height;
    +        if (h < ch) { chunk = child; continue outer; }
    +        h -= ch;
    +        n += child.chunkSize();
    +      }
    +      return n;
    +    } while (!chunk.lines);
    +    for (var i = 0, e = chunk.lines.length; i < e; ++i) {
    +      var line = chunk.lines[i], lh = line.height;
    +      if (h < lh) break;
    +      h -= lh;
    +    }
    +    return n + i;
    +  }
    +  function heightAtLine(chunk, n) {
    +    var h = 0;
    +    outer: do {
    +      for (var i = 0, e = chunk.children.length; i < e; ++i) {
    +        var child = chunk.children[i], sz = child.chunkSize();
    +        if (n < sz) { chunk = child; continue outer; }
    +        n -= sz;
    +        h += child.height;
    +      }
    +      return h;
    +    } while (!chunk.lines);
    +    for (var i = 0; i < n; ++i) h += chunk.lines[i].height;
    +    return h;
    +  }
    +
    +  // The history object 'chunks' changes that are made close together
    +  // and at almost the same time into bigger undoable units.
    +  function History() {
    +    this.time = 0;
    +    this.done = []; this.undone = [];
    +    this.compound = 0;
    +    this.closed = false;
    +  }
    +  History.prototype = {
    +    addChange: function(start, added, old) {
    +      this.undone.length = 0;
    +      var time = +new Date, cur = this.done[this.done.length - 1], last = cur && cur[cur.length - 1];
    +      var dtime = time - this.time;
    +
    +      if (this.compound && cur && !this.closed) {
    +        cur.push({start: start, added: added, old: old});
    +      } else if (dtime > 400 || !last || this.closed ||
    +                 last.start > start + old.length || last.start + last.added < start) {
    +        this.done.push([{start: start, added: added, old: old}]);
    +        this.closed = false;
    +      } else {
    +        var startBefore = Math.max(0, last.start - start),
    +            endAfter = Math.max(0, (start + old.length) - (last.start + last.added));
    +        for (var i = startBefore; i > 0; --i) last.old.unshift(old[i - 1]);
    +        for (var i = endAfter; i > 0; --i) last.old.push(old[old.length - i]);
    +        if (startBefore) last.start = start;
    +        last.added += added - (old.length - startBefore - endAfter);
    +      }
    +      this.time = time;
    +    },
    +    startCompound: function() {
    +      if (!this.compound++) this.closed = true;
    +    },
    +    endCompound: function() {
    +      if (!--this.compound) this.closed = true;
    +    }
    +  };
    +
    +  function stopMethod() {e_stop(this);}
    +  // Ensure an event has a stop method.
    +  function addStop(event) {
    +    if (!event.stop) event.stop = stopMethod;
    +    return event;
    +  }
    +
    +  function e_preventDefault(e) {
    +    if (e.preventDefault) e.preventDefault();
    +    else e.returnValue = false;
    +  }
    +  function e_stopPropagation(e) {
    +    if (e.stopPropagation) e.stopPropagation();
    +    else e.cancelBubble = true;
    +  }
    +  function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
    +  CodeMirror.e_stop = e_stop;
    +  CodeMirror.e_preventDefault = e_preventDefault;
    +  CodeMirror.e_stopPropagation = e_stopPropagation;
    +
    +  function e_target(e) {return e.target || e.srcElement;}
    +  function e_button(e) {
    +    if (e.which) return e.which;
    +    else if (e.button & 1) return 1;
    +    else if (e.button & 2) return 3;
    +    else if (e.button & 4) return 2;
    +  }
    +
    +  // Allow 3rd-party code to override event properties by adding an override
    +  // object to an event object.
    +  function e_prop(e, prop) {
    +    var overridden = e.override && e.override.hasOwnProperty(prop);
    +    return overridden ? e.override[prop] : e[prop];
    +  }
    +
    +  // Event handler registration. If disconnect is true, it'll return a
    +  // function that unregisters the handler.
    +  function connect(node, type, handler, disconnect) {
    +    if (typeof node.addEventListener == "function") {
    +      node.addEventListener(type, handler, false);
    +      if (disconnect) return function() {node.removeEventListener(type, handler, false);};
    +    }
    +    else {
    +      var wrapHandler = function(event) {handler(event || window.event);};
    +      node.attachEvent("on" + type, wrapHandler);
    +      if (disconnect) return function() {node.detachEvent("on" + type, wrapHandler);};
    +    }
    +  }
    +  CodeMirror.connect = connect;
    +
    +  function Delayed() {this.id = null;}
    +  Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}};
    +
    +  var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}};
    +
    +  var gecko = /gecko\/\d{7}/i.test(navigator.userAgent);
    +  var ie = /MSIE \d/.test(navigator.userAgent);
    +  var ie_lt9 = /MSIE [1-8]\b/.test(navigator.userAgent);
    +  var quirksMode = ie && document.documentMode == 5;
    +  var webkit = /WebKit\//.test(navigator.userAgent);
    +  var chrome = /Chrome\//.test(navigator.userAgent);
    +  var safari = /Apple Computer/.test(navigator.vendor);
    +  var khtml = /KHTML\//.test(navigator.userAgent);
    +
    +  // Detect drag-and-drop
    +  var dragAndDrop = function() {
    +    // There is *some* kind of drag-and-drop support in IE6-8, but I
    +    // couldn't get it to work yet.
    +    if (ie_lt9) return false;
    +    var div = document.createElement('div');
    +    return "draggable" in div || "dragDrop" in div;
    +  }();
    +
    +  // Feature-detect whether newlines in textareas are converted to \r\n
    +  var lineSep = function () {
    +    var te = document.createElement("textarea");
    +    te.value = "foo\nbar";
    +    if (te.value.indexOf("\r") > -1) return "\r\n";
    +    return "\n";
    +  }();
    +
    +  // For a reason I have yet to figure out, some browsers disallow
    +  // word wrapping between certain characters *only* if a new inline
    +  // element is started between them. This makes it hard to reliably
    +  // measure the position of things, since that requires inserting an
    +  // extra span. This terribly fragile set of regexps matches the
    +  // character combinations that suffer from this phenomenon on the
    +  // various browsers.
    +  var spanAffectsWrapping = /^$/; // Won't match any two-character string
    +  if (gecko) spanAffectsWrapping = /$'/;
    +  else if (safari) spanAffectsWrapping = /\-[^ \-?]|\?[^ !'\"\),.\-\/:;\?\]\}]/;
    +  else if (chrome) spanAffectsWrapping = /\-[^ \-\.?]|\?[^ \-\.?\]\}:;!'\"\),\/]|[\.!\"#&%\)*+,:;=>\]|\}~][\(\{\[<]|\$'/;
    +
    +  // Counts the column offset in a string, taking tabs into account.
    +  // Used mostly to find indentation.
    +  function countColumn(string, end, tabSize) {
    +    if (end == null) {
    +      end = string.search(/[^\s\u00a0]/);
    +      if (end == -1) end = string.length;
    +    }
    +    for (var i = 0, n = 0; i < end; ++i) {
    +      if (string.charAt(i) == "\t") n += tabSize - (n % tabSize);
    +      else ++n;
    +    }
    +    return n;
    +  }
    +
    +  function computedStyle(elt) {
    +    if (elt.currentStyle) return elt.currentStyle;
    +    return window.getComputedStyle(elt, null);
    +  }
    +
    +  // Find the position of an element by following the offsetParent chain.
    +  // If screen==true, it returns screen (rather than page) coordinates.
    +  function eltOffset(node, screen) {
    +    var bod = node.ownerDocument.body;
    +    var x = 0, y = 0, skipBody = false;
    +    for (var n = node; n; n = n.offsetParent) {
    +      var ol = n.offsetLeft, ot = n.offsetTop;
    +      // Firefox reports weird inverted offsets when the body has a border.
    +      if (n == bod) { x += Math.abs(ol); y += Math.abs(ot); }
    +      else { x += ol, y += ot; }
    +      if (screen && computedStyle(n).position == "fixed")
    +        skipBody = true;
    +    }
    +    var e = screen && !skipBody ? null : bod;
    +    for (var n = node.parentNode; n != e; n = n.parentNode)
    +      if (n.scrollLeft != null) { x -= n.scrollLeft; y -= n.scrollTop;}
    +    return {left: x, top: y};
    +  }
    +  // Use the faster and saner getBoundingClientRect method when possible.
    +  if (document.documentElement.getBoundingClientRect != null) eltOffset = function(node, screen) {
    +    // Take the parts of bounding client rect that we are interested in so we are able to edit if need be,
    +    // since the returned value cannot be changed externally (they are kept in sync as the element moves within the page)
    +    try { var box = node.getBoundingClientRect(); box = { top: box.top, left: box.left }; }
    +    catch(e) { box = {top: 0, left: 0}; }
    +    if (!screen) {
    +      // Get the toplevel scroll, working around browser differences.
    +      if (window.pageYOffset == null) {
    +        var t = document.documentElement || document.body.parentNode;
    +        if (t.scrollTop == null) t = document.body;
    +        box.top += t.scrollTop; box.left += t.scrollLeft;
    +      } else {
    +        box.top += window.pageYOffset; box.left += window.pageXOffset;
    +      }
    +    }
    +    return box;
    +  };
    +
    +  // Get a node's text content.
    +  function eltText(node) {
    +    return node.textContent || node.innerText || node.nodeValue || "";
    +  }
    +  function selectInput(node) {
    +    if (ios) { // Mobile Safari apparently has a bug where select() is broken.
    +      node.selectionStart = 0;
    +      node.selectionEnd = node.value.length;
    +    } else node.select();
    +  }
    +
    +  // Operations on {line, ch} objects.
    +  function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
    +  function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);}
    +  function copyPos(x) {return {line: x.line, ch: x.ch};}
    +
    +  var escapeElement = document.createElement("pre");
    +  function htmlEscape(str) {
    +    escapeElement.textContent = str;
    +    return escapeElement.innerHTML;
    +  }
    +  // Recent (late 2011) Opera betas insert bogus newlines at the start
    +  // of the textContent, so we strip those.
    +  if (htmlEscape("a") == "\na")
    +    htmlEscape = function(str) {
    +      escapeElement.textContent = str;
    +      return escapeElement.innerHTML.slice(1);
    +    };
    +  // Some IEs don't preserve tabs through innerHTML
    +  else if (htmlEscape("\t") != "\t")
    +    htmlEscape = function(str) {
    +      escapeElement.innerHTML = "";
    +      escapeElement.appendChild(document.createTextNode(str));
    +      return escapeElement.innerHTML;
    +    };
    +  CodeMirror.htmlEscape = htmlEscape;
    +
    +  // Used to position the cursor after an undo/redo by finding the
    +  // last edited character.
    +  function editEnd(from, to) {
    +    if (!to) return 0;
    +    if (!from) return to.length;
    +    for (var i = from.length, j = to.length; i >= 0 && j >= 0; --i, --j)
    +      if (from.charAt(i) != to.charAt(j)) break;
    +    return j + 1;
    +  }
    +
    +  function indexOf(collection, elt) {
    +    if (collection.indexOf) return collection.indexOf(elt);
    +    for (var i = 0, e = collection.length; i < e; ++i)
    +      if (collection[i] == elt) return i;
    +    return -1;
    +  }
    +  function isWordChar(ch) {
    +    return /\w/.test(ch) || ch.toUpperCase() != ch.toLowerCase();
    +  }
    +
    +  // See if "".split is the broken IE version, if so, provide an
    +  // alternative way to split lines.
    +  var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
    +    var pos = 0, nl, result = [];
    +    while ((nl = string.indexOf("\n", pos)) > -1) {
    +      result.push(string.slice(pos, string.charAt(nl-1) == "\r" ? nl - 1 : nl));
    +      pos = nl + 1;
    +    }
    +    result.push(string.slice(pos));
    +    return result;
    +  } : function(string){return string.split(/\r?\n/);};
    +  CodeMirror.splitLines = splitLines;
    +
    +  var hasSelection = window.getSelection ? function(te) {
    +    try { return te.selectionStart != te.selectionEnd; }
    +    catch(e) { return false; }
    +  } : function(te) {
    +    try {var range = te.ownerDocument.selection.createRange();}
    +    catch(e) {}
    +    if (!range || range.parentElement() != te) return false;
    +    return range.compareEndPoints("StartToEnd", range) != 0;
    +  };
    +
    +  CodeMirror.defineMode("null", function() {
    +    return {token: function(stream) {stream.skipToEnd();}};
    +  });
    +  CodeMirror.defineMIME("text/plain", "null");
    +
    +  var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
    +                  19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
    +                  36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
    +                  46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 127: "Delete", 186: ";", 187: "=", 188: ",",
    +                  189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 63276: "PageUp",
    +                  63277: "PageDown", 63275: "End", 63273: "Home", 63234: "Left", 63232: "Up", 63235: "Right",
    +                  63233: "Down", 63302: "Insert", 63272: "Delete"};
    +  CodeMirror.keyNames = keyNames;
    +  (function() {
    +    // Number keys
    +    for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i);
    +    // Alphabetic keys
    +    for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
    +    // Function keys
    +    for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
    +  })();
    +
    +  return CodeMirror;
    +})();
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/clike/clike.js b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/clike/clike.js
    new file mode 100644
    index 00000000..75ef608e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/clike/clike.js
    @@ -0,0 +1,234 @@
    +锘緾odeMirror.defineMode("clike", function(config, parserConfig) {
    +  var indentUnit = config.indentUnit,
    +      keywords = parserConfig.keywords || {},
    +      blockKeywords = parserConfig.blockKeywords || {},
    +      atoms = parserConfig.atoms || {},
    +      hooks = parserConfig.hooks || {},
    +      multiLineStrings = parserConfig.multiLineStrings;
    +  var isOperatorChar = /[+\-*&%=<>!?|\/]/;
    +
    +  var curPunc;
    +
    +  function tokenBase(stream, state) {
    +    var ch = stream.next();
    +    if (hooks[ch]) {
    +      var result = hooks[ch](stream, state);
    +      if (result !== false) return result;
    +    }
    +    if (ch == '"' || ch == "'") {
    +      state.tokenize = tokenString(ch);
    +      return state.tokenize(stream, state);
    +    }
    +    if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
    +      curPunc = ch;
    +      return null;
    +    }
    +    if (/\d/.test(ch)) {
    +      stream.eatWhile(/[\w\.]/);
    +      return "number";
    +    }
    +    if (ch == "/") {
    +      if (stream.eat("*")) {
    +        state.tokenize = tokenComment;
    +        return tokenComment(stream, state);
    +      }
    +      if (stream.eat("/")) {
    +        stream.skipToEnd();
    +        return "comment";
    +      }
    +    }
    +    if (isOperatorChar.test(ch)) {
    +      stream.eatWhile(isOperatorChar);
    +      return "operator";
    +    }
    +    stream.eatWhile(/[\w\$_]/);
    +    var cur = stream.current();
    +    if (keywords.propertyIsEnumerable(cur)) {
    +      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
    +      return "keyword";
    +    }
    +    if (atoms.propertyIsEnumerable(cur)) return "atom";
    +    return "word";
    +  }
    +
    +  function tokenString(quote) {
    +    return function(stream, state) {
    +      var escaped = false, next, end = false;
    +      while ((next = stream.next()) != null) {
    +        if (next == quote && !escaped) {end = true; break;}
    +        escaped = !escaped && next == "\\";
    +      }
    +      if (end || !(escaped || multiLineStrings))
    +        state.tokenize = null;
    +      return "string";
    +    };
    +  }
    +
    +  function tokenComment(stream, state) {
    +    var maybeEnd = false, ch;
    +    while (ch = stream.next()) {
    +      if (ch == "/" && maybeEnd) {
    +        state.tokenize = null;
    +        break;
    +      }
    +      maybeEnd = (ch == "*");
    +    }
    +    return "comment";
    +  }
    +
    +  function Context(indented, column, type, align, prev) {
    +    this.indented = indented;
    +    this.column = column;
    +    this.type = type;
    +    this.align = align;
    +    this.prev = prev;
    +  }
    +  function pushContext(state, col, type) {
    +    return state.context = new Context(state.indented, col, type, null, state.context);
    +  }
    +  function popContext(state) {
    +    var t = state.context.type;
    +    if (t == ")" || t == "]" || t == "}")
    +      state.indented = state.context.indented;
    +    return state.context = state.context.prev;
    +  }
    +
    +  // Interface
    +
    +  return {
    +    startState: function(basecolumn) {
    +      return {
    +        tokenize: null,
    +        context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
    +        indented: 0,
    +        startOfLine: true
    +      };
    +    },
    +
    +    token: function(stream, state) {
    +      var ctx = state.context;
    +      if (stream.sol()) {
    +        if (ctx.align == null) ctx.align = false;
    +        state.indented = stream.indentation();
    +        state.startOfLine = true;
    +      }
    +      if (stream.eatSpace()) return null;
    +      curPunc = null;
    +      var style = (state.tokenize || tokenBase)(stream, state);
    +      if (style == "comment" || style == "meta") return style;
    +      if (ctx.align == null) ctx.align = true;
    +
    +      if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state);
    +      else if (curPunc == "{") pushContext(state, stream.column(), "}");
    +      else if (curPunc == "[") pushContext(state, stream.column(), "]");
    +      else if (curPunc == "(") pushContext(state, stream.column(), ")");
    +      else if (curPunc == "}") {
    +        while (ctx.type == "statement") ctx = popContext(state);
    +        if (ctx.type == "}") ctx = popContext(state);
    +        while (ctx.type == "statement") ctx = popContext(state);
    +      }
    +      else if (curPunc == ctx.type) popContext(state);
    +      else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement"))
    +        pushContext(state, stream.column(), "statement");
    +      state.startOfLine = false;
    +      return style;
    +    },
    +
    +    indent: function(state, textAfter) {
    +      if (state.tokenize != tokenBase && state.tokenize != null) return 0;
    +      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
    +      if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
    +      var closing = firstChar == ctx.type;
    +      if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit);
    +      else if (ctx.align) return ctx.column + (closing ? 0 : 1);
    +      else return ctx.indented + (closing ? 0 : indentUnit);
    +    },
    +
    +    electricChars: "{}"
    +  };
    +});
    +
    +(function() {
    +  function words(str) {
    +    var obj = {}, words = str.split(" ");
    +    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
    +    return obj;
    +  }
    +  var cKeywords = "auto if break int case long char register continue return default short do sizeof " +
    +    "double static else struct entry switch extern typedef float union for unsigned " +
    +    "goto while enum void const signed volatile";
    +
    +  function cppHook(stream, state) {
    +    if (!state.startOfLine) return false;
    +    stream.skipToEnd();
    +    return "meta";
    +  }
    +
    +  // C#-style strings where "" escapes a quote.
    +  function tokenAtString(stream, state) {
    +    var next;
    +    while ((next = stream.next()) != null) {
    +      if (next == '"' && !stream.eat('"')) {
    +        state.tokenize = null;
    +        break;
    +      }
    +    }
    +    return "string";
    +  }
    +
    +  CodeMirror.defineMIME("text/x-csrc", {
    +    name: "clike",
    +    keywords: words(cKeywords),
    +    blockKeywords: words("case do else for if switch while struct"),
    +    atoms: words("null"),
    +    hooks: {"#": cppHook}
    +  });
    +  CodeMirror.defineMIME("text/x-c++src", {
    +    name: "clike",
    +    keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try bool explicit new " +
    +                    "static_cast typeid catch operator template typename class friend private " +
    +                    "this using const_cast inline public throw virtual delete mutable protected " +
    +                    "wchar_t"),
    +    blockKeywords: words("catch class do else finally for if struct switch try while"),
    +    atoms: words("true false null"),
    +    hooks: {"#": cppHook}
    +  });
    +  CodeMirror.defineMIME("text/x-java", {
    +    name: "clike",
    +    keywords: words("abstract assert boolean break byte case catch char class const continue default " +
    +                    "do double else enum extends final finally float for goto if implements import " +
    +                    "instanceof int interface long native new package private protected public " +
    +                    "return short static strictfp super switch synchronized this throw throws transient " +
    +                    "try void volatile while"),
    +    blockKeywords: words("catch class do else finally for if switch try while"),
    +    atoms: words("true false null"),
    +    hooks: {
    +      "@": function(stream, state) {
    +        stream.eatWhile(/[\w\$_]/);
    +        return "meta";
    +      }
    +    }
    +  });
    +  CodeMirror.defineMIME("text/x-csharp", {
    +    name: "clike",
    +    keywords: words("abstract as base bool break byte case catch char checked class const continue decimal" +
    +                    " default delegate do double else enum event explicit extern finally fixed float for" +
    +                    " foreach goto if implicit in int interface internal is lock long namespace new object" +
    +                    " operator out override params private protected public readonly ref return sbyte sealed short" +
    +                    " sizeof stackalloc static string struct switch this throw try typeof uint ulong unchecked" +
    +                    " unsafe ushort using virtual void volatile while add alias ascending descending dynamic from get" +
    +                    " global group into join let orderby partial remove select set value var yield"),
    +    blockKeywords: words("catch class do else finally for foreach if struct switch try while"),
    +    atoms: words("true false null"),
    +    hooks: {
    +      "@": function(stream, state) {
    +        if (stream.eat('"')) {
    +          state.tokenize = tokenAtString;
    +          return tokenAtString(stream, state);
    +        }
    +        stream.eatWhile(/[\w\$_]/);
    +        return "meta";
    +      }
    +    }
    +  });
    +}());
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/css/css.js b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/css/css.js
    new file mode 100644
    index 00000000..9f637fdc
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/css/css.js
    @@ -0,0 +1,124 @@
    +锘緾odeMirror.defineMode("css", function(config) {
    +  var indentUnit = config.indentUnit, type;
    +  function ret(style, tp) {type = tp; return style;}
    +
    +  function tokenBase(stream, state) {
    +    var ch = stream.next();
    +    if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());}
    +    else if (ch == "/" && stream.eat("*")) {
    +      state.tokenize = tokenCComment;
    +      return tokenCComment(stream, state);
    +    }
    +    else if (ch == "<" && stream.eat("!")) {
    +      state.tokenize = tokenSGMLComment;
    +      return tokenSGMLComment(stream, state);
    +    }
    +    else if (ch == "=") ret(null, "compare");
    +    else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare");
    +    else if (ch == "\"" || ch == "'") {
    +      state.tokenize = tokenString(ch);
    +      return state.tokenize(stream, state);
    +    }
    +    else if (ch == "#") {
    +      stream.eatWhile(/[\w\\\-]/);
    +      return ret("atom", "hash");
    +    }
    +    else if (ch == "!") {
    +      stream.match(/^\s*\w*/);
    +      return ret("keyword", "important");
    +    }
    +    else if (/\d/.test(ch)) {
    +      stream.eatWhile(/[\w.%]/);
    +      return ret("number", "unit");
    +    }
    +    else if (/[,.+>*\/]/.test(ch)) {
    +      return ret(null, "select-op");
    +    }
    +    else if (/[;{}:\[\]]/.test(ch)) {
    +      return ret(null, ch);
    +    }
    +    else {
    +      stream.eatWhile(/[\w\\\-]/);
    +      return ret("variable", "variable");
    +    }
    +  }
    +
    +  function tokenCComment(stream, state) {
    +    var maybeEnd = false, ch;
    +    while ((ch = stream.next()) != null) {
    +      if (maybeEnd && ch == "/") {
    +        state.tokenize = tokenBase;
    +        break;
    +      }
    +      maybeEnd = (ch == "*");
    +    }
    +    return ret("comment", "comment");
    +  }
    +
    +  function tokenSGMLComment(stream, state) {
    +    var dashes = 0, ch;
    +    while ((ch = stream.next()) != null) {
    +      if (dashes >= 2 && ch == ">") {
    +        state.tokenize = tokenBase;
    +        break;
    +      }
    +      dashes = (ch == "-") ? dashes + 1 : 0;
    +    }
    +    return ret("comment", "comment");
    +  }
    +
    +  function tokenString(quote) {
    +    return function(stream, state) {
    +      var escaped = false, ch;
    +      while ((ch = stream.next()) != null) {
    +        if (ch == quote && !escaped)
    +          break;
    +        escaped = !escaped && ch == "\\";
    +      }
    +      if (!escaped) state.tokenize = tokenBase;
    +      return ret("string", "string");
    +    };
    +  }
    +
    +  return {
    +    startState: function(base) {
    +      return {tokenize: tokenBase,
    +              baseIndent: base || 0,
    +              stack: []};
    +    },
    +
    +    token: function(stream, state) {
    +      if (stream.eatSpace()) return null;
    +      var style = state.tokenize(stream, state);
    +
    +      var context = state.stack[state.stack.length-1];
    +      if (type == "hash" && context != "rule") style = "string-2";
    +      else if (style == "variable") {
    +        if (context == "rule") style = "number";
    +        else if (!context || context == "@media{") style = "tag";
    +      }
    +
    +      if (context == "rule" && /^[\{\};]$/.test(type))
    +        state.stack.pop();
    +      if (type == "{") {
    +        if (context == "@media") state.stack[state.stack.length-1] = "@media{";
    +        else state.stack.push("{");
    +      }
    +      else if (type == "}") state.stack.pop();
    +      else if (type == "@media") state.stack.push("@media");
    +      else if (context == "{" && type != "comment") state.stack.push("rule");
    +      return style;
    +    },
    +
    +    indent: function(state, textAfter) {
    +      var n = state.stack.length;
    +      if (/^\}/.test(textAfter))
    +        n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
    +      return state.baseIndent + n * indentUnit;
    +    },
    +
    +    electricChars: "}"
    +  };
    +});
    +
    +CodeMirror.defineMIME("text/css", "css");
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/htmlmixed/htmlmixed.js b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/htmlmixed/htmlmixed.js
    new file mode 100644
    index 00000000..5440e79f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/htmlmixed/htmlmixed.js
    @@ -0,0 +1,85 @@
    +锘緾odeMirror.defineMode("htmlmixed", function(config, parserConfig) {
    +  var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true});
    +  var jsMode = CodeMirror.getMode(config, "javascript");
    +  var cssMode = CodeMirror.getMode(config, "css");
    +
    +  function html(stream, state) {
    +    var style = htmlMode.token(stream, state.htmlState);
    +    if (style == "tag" && stream.current() == ">" && state.htmlState.context) {
    +      if (/^script$/i.test(state.htmlState.context.tagName)) {
    +        state.token = javascript;
    +        state.localState = jsMode.startState(htmlMode.indent(state.htmlState, ""));
    +        state.mode = "javascript";
    +      }
    +      else if (/^style$/i.test(state.htmlState.context.tagName)) {
    +        state.token = css;
    +        state.localState = cssMode.startState(htmlMode.indent(state.htmlState, ""));
    +        state.mode = "css";
    +      }
    +    }
    +    return style;
    +  }
    +  function maybeBackup(stream, pat, style) {
    +    var cur = stream.current();
    +    var close = cur.search(pat);
    +    if (close > -1) stream.backUp(cur.length - close);
    +    return style;
    +  }
    +  function javascript(stream, state) {
    +    if (stream.match(/^<\/\s*script\s*>/i, false)) {
    +      state.token = html;
    +      state.localState = null;
    +      state.mode = "html";
    +      return html(stream, state);
    +    }
    +    return maybeBackup(stream, /<\/\s*script\s*>/,
    +                       jsMode.token(stream, state.localState));
    +  }
    +  function css(stream, state) {
    +    if (stream.match(/^<\/\s*style\s*>/i, false)) {
    +      state.token = html;
    +      state.localState = null;
    +      state.mode = "html";
    +      return html(stream, state);
    +    }
    +    return maybeBackup(stream, /<\/\s*style\s*>/,
    +                       cssMode.token(stream, state.localState));
    +  }
    +
    +  return {
    +    startState: function() {
    +      var state = htmlMode.startState();
    +      return {token: html, localState: null, mode: "html", htmlState: state};
    +    },
    +
    +    copyState: function(state) {
    +      if (state.localState)
    +        var local = CodeMirror.copyState(state.token == css ? cssMode : jsMode, state.localState);
    +      return {token: state.token, localState: local, mode: state.mode,
    +              htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};
    +    },
    +
    +    token: function(stream, state) {
    +      return state.token(stream, state);
    +    },
    +
    +    indent: function(state, textAfter) {
    +      if (state.token == html || /^\s*<\//.test(textAfter))
    +        return htmlMode.indent(state.htmlState, textAfter);
    +      else if (state.token == javascript)
    +        return jsMode.indent(state.localState, textAfter);
    +      else
    +        return cssMode.indent(state.localState, textAfter);
    +    },
    +
    +    compareStates: function(a, b) {
    +      if (a.mode != b.mode) return false;
    +      if (a.localState) return CodeMirror.Pass;
    +      return htmlMode.compareStates(a.htmlState, b.htmlState);
    +    },
    +
    +    electricChars: "/{}:"
    +  }
    +}, "xml", "javascript", "css");
    +
    +CodeMirror.defineMIME("text/html", "htmlmixed");
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/javascript/javascript.js b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/javascript/javascript.js
    new file mode 100644
    index 00000000..b85467da
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/javascript/javascript.js
    @@ -0,0 +1,361 @@
    +锘緾odeMirror.defineMode("javascript", function(config, parserConfig) {
    +  var indentUnit = config.indentUnit;
    +  var jsonMode = parserConfig.json;
    +
    +  // Tokenizer
    +
    +  var keywords = function(){
    +    function kw(type) {return {type: type, style: "keyword"};}
    +    var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
    +    var operator = kw("operator"), atom = {type: "atom", style: "atom"};
    +    return {
    +      "if": A, "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
    +      "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C,
    +      "var": kw("var"), "const": kw("var"), "let": kw("var"),
    +      "function": kw("function"), "catch": kw("catch"),
    +      "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
    +      "in": operator, "typeof": operator, "instanceof": operator,
    +      "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom
    +    };
    +  }();
    +
    +  var isOperatorChar = /[+\-*&%=<>!?|]/;
    +
    +  function chain(stream, state, f) {
    +    state.tokenize = f;
    +    return f(stream, state);
    +  }
    +
    +  function nextUntilUnescaped(stream, end) {
    +    var escaped = false, next;
    +    while ((next = stream.next()) != null) {
    +      if (next == end && !escaped)
    +        return false;
    +      escaped = !escaped && next == "\\";
    +    }
    +    return escaped;
    +  }
    +
    +  // Used as scratch variables to communicate multiple values without
    +  // consing up tons of objects.
    +  var type, content;
    +  function ret(tp, style, cont) {
    +    type = tp; content = cont;
    +    return style;
    +  }
    +
    +  function jsTokenBase(stream, state) {
    +    var ch = stream.next();
    +    if (ch == '"' || ch == "'")
    +      return chain(stream, state, jsTokenString(ch));
    +    else if (/[\[\]{}\(\),;\:\.]/.test(ch))
    +      return ret(ch);
    +    else if (ch == "0" && stream.eat(/x/i)) {
    +      stream.eatWhile(/[\da-f]/i);
    +      return ret("number", "number");
    +    }
    +    else if (/\d/.test(ch)) {
    +      stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
    +      return ret("number", "number");
    +    }
    +    else if (ch == "/") {
    +      if (stream.eat("*")) {
    +        return chain(stream, state, jsTokenComment);
    +      }
    +      else if (stream.eat("/")) {
    +        stream.skipToEnd();
    +        return ret("comment", "comment");
    +      }
    +      else if (state.reAllowed) {
    +        nextUntilUnescaped(stream, "/");
    +        stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla
    +        return ret("regexp", "string-2");
    +      }
    +      else {
    +        stream.eatWhile(isOperatorChar);
    +        return ret("operator", null, stream.current());
    +      }
    +    }
    +    else if (ch == "#") {
    +        stream.skipToEnd();
    +        return ret("error", "error");
    +    }
    +    else if (isOperatorChar.test(ch)) {
    +      stream.eatWhile(isOperatorChar);
    +      return ret("operator", null, stream.current());
    +    }
    +    else {
    +      stream.eatWhile(/[\w\$_]/);
    +      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
    +      return (known && state.kwAllowed) ? ret(known.type, known.style, word) :
    +                     ret("variable", "variable", word);
    +    }
    +  }
    +
    +  function jsTokenString(quote) {
    +    return function(stream, state) {
    +      if (!nextUntilUnescaped(stream, quote))
    +        state.tokenize = jsTokenBase;
    +      return ret("string", "string");
    +    };
    +  }
    +
    +  function jsTokenComment(stream, state) {
    +    var maybeEnd = false, ch;
    +    while (ch = stream.next()) {
    +      if (ch == "/" && maybeEnd) {
    +        state.tokenize = jsTokenBase;
    +        break;
    +      }
    +      maybeEnd = (ch == "*");
    +    }
    +    return ret("comment", "comment");
    +  }
    +
    +  // Parser
    +
    +  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true};
    +
    +  function JSLexical(indented, column, type, align, prev, info) {
    +    this.indented = indented;
    +    this.column = column;
    +    this.type = type;
    +    this.prev = prev;
    +    this.info = info;
    +    if (align != null) this.align = align;
    +  }
    +
    +  function inScope(state, varname) {
    +    for (var v = state.localVars; v; v = v.next)
    +      if (v.name == varname) return true;
    +  }
    +
    +  function parseJS(state, style, type, content, stream) {
    +    var cc = state.cc;
    +    // Communicate our context to the combinators.
    +    // (Less wasteful than consing up a hundred closures on every call.)
    +    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
    +
    +    if (!state.lexical.hasOwnProperty("align"))
    +      state.lexical.align = true;
    +
    +    while(true) {
    +      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
    +      if (combinator(type, content)) {
    +        while(cc.length && cc[cc.length - 1].lex)
    +          cc.pop()();
    +        if (cx.marked) return cx.marked;
    +        if (type == "variable" && inScope(state, content)) return "variable-2";
    +        return style;
    +      }
    +    }
    +  }
    +
    +  // Combinator utils
    +
    +  var cx = {state: null, column: null, marked: null, cc: null};
    +  function pass() {
    +    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
    +  }
    +  function cont() {
    +    pass.apply(null, arguments);
    +    return true;
    +  }
    +  function register(varname) {
    +    var state = cx.state;
    +    if (state.context) {
    +      cx.marked = "def";
    +      for (var v = state.localVars; v; v = v.next)
    +        if (v.name == varname) return;
    +      state.localVars = {name: varname, next: state.localVars};
    +    }
    +  }
    +
    +  // Combinators
    +
    +  var defaultVars = {name: "this", next: {name: "arguments"}};
    +  function pushcontext() {
    +    if (!cx.state.context) cx.state.localVars = defaultVars;
    +    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
    +  }
    +  function popcontext() {
    +    cx.state.localVars = cx.state.context.vars;
    +    cx.state.context = cx.state.context.prev;
    +  }
    +  function pushlex(type, info) {
    +    var result = function() {
    +      var state = cx.state;
    +      state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info)
    +    };
    +    result.lex = true;
    +    return result;
    +  }
    +  function poplex() {
    +    var state = cx.state;
    +    if (state.lexical.prev) {
    +      if (state.lexical.type == ")")
    +        state.indented = state.lexical.indented;
    +      state.lexical = state.lexical.prev;
    +    }
    +  }
    +  poplex.lex = true;
    +
    +  function expect(wanted) {
    +    return function expecting(type) {
    +      if (type == wanted) return cont();
    +      else if (wanted == ";") return pass();
    +      else return cont(arguments.callee);
    +    };
    +  }
    +
    +  function statement(type) {
    +    if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex);
    +    if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
    +    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
    +    if (type == "{") return cont(pushlex("}"), block, poplex);
    +    if (type == ";") return cont();
    +    if (type == "function") return cont(functiondef);
    +    if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
    +                                      poplex, statement, poplex);
    +    if (type == "variable") return cont(pushlex("stat"), maybelabel);
    +    if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
    +                                         block, poplex, poplex);
    +    if (type == "case") return cont(expression, expect(":"));
    +    if (type == "default") return cont(expect(":"));
    +    if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
    +                                        statement, poplex, popcontext);
    +    return pass(pushlex("stat"), expression, expect(";"), poplex);
    +  }
    +  function expression(type) {
    +    if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);
    +    if (type == "function") return cont(functiondef);
    +    if (type == "keyword c") return cont(maybeexpression);
    +    if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator);
    +    if (type == "operator") return cont(expression);
    +    if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator);
    +    if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator);
    +    return cont();
    +  }
    +  function maybeexpression(type) {
    +    if (type.match(/[;\}\)\],]/)) return pass();
    +    return pass(expression);
    +  }
    +
    +  function maybeoperator(type, value) {
    +    if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
    +    if (type == "operator" || type == ":") return cont(expression);
    +    if (type == ";") return;
    +    if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
    +    if (type == ".") return cont(property, maybeoperator);
    +    if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator);
    +  }
    +  function maybelabel(type) {
    +    if (type == ":") return cont(poplex, statement);
    +    return pass(maybeoperator, expect(";"), poplex);
    +  }
    +  function property(type) {
    +    if (type == "variable") {cx.marked = "property"; return cont();}
    +  }
    +  function objprop(type) {
    +    if (type == "variable") cx.marked = "property";
    +    if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression);
    +  }
    +  function commasep(what, end) {
    +    function proceed(type) {
    +      if (type == ",") return cont(what, proceed);
    +      if (type == end) return cont();
    +      return cont(expect(end));
    +    }
    +    return function commaSeparated(type) {
    +      if (type == end) return cont();
    +      else return pass(what, proceed);
    +    };
    +  }
    +  function block(type) {
    +    if (type == "}") return cont();
    +    return pass(statement, block);
    +  }
    +  function vardef1(type, value) {
    +    if (type == "variable"){register(value); return cont(vardef2);}
    +    return cont();
    +  }
    +  function vardef2(type, value) {
    +    if (value == "=") return cont(expression, vardef2);
    +    if (type == ",") return cont(vardef1);
    +  }
    +  function forspec1(type) {
    +    if (type == "var") return cont(vardef1, forspec2);
    +    if (type == ";") return pass(forspec2);
    +    if (type == "variable") return cont(formaybein);
    +    return pass(forspec2);
    +  }
    +  function formaybein(type, value) {
    +    if (value == "in") return cont(expression);
    +    return cont(maybeoperator, forspec2);
    +  }
    +  function forspec2(type, value) {
    +    if (type == ";") return cont(forspec3);
    +    if (value == "in") return cont(expression);
    +    return cont(expression, expect(";"), forspec3);
    +  }
    +  function forspec3(type) {
    +    if (type != ")") cont(expression);
    +  }
    +  function functiondef(type, value) {
    +    if (type == "variable") {register(value); return cont(functiondef);}
    +    if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext);
    +  }
    +  function funarg(type, value) {
    +    if (type == "variable") {register(value); return cont();}
    +  }
    +
    +  // Interface
    +
    +  return {
    +    startState: function(basecolumn) {
    +      return {
    +        tokenize: jsTokenBase,
    +        reAllowed: true,
    +        kwAllowed: true,
    +        cc: [],
    +        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
    +        localVars: parserConfig.localVars,
    +        context: parserConfig.localVars && {vars: parserConfig.localVars},
    +        indented: 0
    +      };
    +    },
    +
    +    token: function(stream, state) {
    +      if (stream.sol()) {
    +        if (!state.lexical.hasOwnProperty("align"))
    +          state.lexical.align = false;
    +        state.indented = stream.indentation();
    +      }
    +      if (stream.eatSpace()) return null;
    +      var style = state.tokenize(stream, state);
    +      if (type == "comment") return style;
    +      state.reAllowed = !!(type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/));
    +      state.kwAllowed = type != '.';
    +      return parseJS(state, style, type, content, stream);
    +    },
    +
    +    indent: function(state, textAfter) {
    +      if (state.tokenize != jsTokenBase) return 0;
    +      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
    +      if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
    +      var type = lexical.type, closing = firstChar == type;
    +      if (type == "vardef") return lexical.indented + 4;
    +      else if (type == "form" && firstChar == "{") return lexical.indented;
    +      else if (type == "stat" || type == "form") return lexical.indented + indentUnit;
    +      else if (lexical.info == "switch" && !closing)
    +        return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
    +      else if (lexical.align) return lexical.column + (closing ? 0 : 1);
    +      else return lexical.indented + (closing ? 0 : indentUnit);
    +    },
    +
    +    electricChars: ":{}"
    +  };
    +});
    +
    +CodeMirror.defineMIME("text/javascript", "javascript");
    +CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/xml/xml.js b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/xml/xml.js
    new file mode 100644
    index 00000000..407dad6c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/codemirror/mode/xml/xml.js
    @@ -0,0 +1,325 @@
    +锘緾odeMirror.defineMode("xml", function(config, parserConfig) {
    +  var indentUnit = config.indentUnit;
    +  var Kludges = parserConfig.htmlMode ? {
    +    autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,
    +                      'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,
    +                      'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,
    +                      'track': true, 'wbr': true},
    +    implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,
    +                       'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,
    +                       'th': true, 'tr': true},
    +    contextGrabbers: {
    +      'dd': {'dd': true, 'dt': true},
    +      'dt': {'dd': true, 'dt': true},
    +      'li': {'li': true},
    +      'option': {'option': true, 'optgroup': true},
    +      'optgroup': {'optgroup': true},
    +      'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,
    +            'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,
    +            'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,
    +            'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,
    +            'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},
    +      'rp': {'rp': true, 'rt': true},
    +      'rt': {'rp': true, 'rt': true},
    +      'tbody': {'tbody': true, 'tfoot': true},
    +      'td': {'td': true, 'th': true},
    +      'tfoot': {'tbody': true},
    +      'th': {'td': true, 'th': true},
    +      'thead': {'tbody': true, 'tfoot': true},
    +      'tr': {'tr': true}
    +    },
    +    doNotIndent: {"pre": true},
    +    allowUnquoted: true,
    +    allowMissing: false
    +  } : {
    +    autoSelfClosers: {},
    +    implicitlyClosed: {},
    +    contextGrabbers: {},
    +    doNotIndent: {},
    +    allowUnquoted: false,
    +    allowMissing: false
    +  };
    +  var alignCDATA = parserConfig.alignCDATA;
    +
    +  // Return variables for tokenizers
    +  var tagName, type;
    +
    +  function inText(stream, state) {
    +    function chain(parser) {
    +      state.tokenize = parser;
    +      return parser(stream, state);
    +    }
    +
    +    var ch = stream.next();
    +    if (ch == "<") {
    +      if (stream.eat("!")) {
    +        if (stream.eat("[")) {
    +          if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>"));
    +          else return null;
    +        }
    +        else if (stream.match("--")) return chain(inBlock("comment", "-->"));
    +        else if (stream.match("DOCTYPE", true, true)) {
    +          stream.eatWhile(/[\w\._\-]/);
    +          return chain(doctype(1));
    +        }
    +        else return null;
    +      }
    +      else if (stream.eat("?")) {
    +        stream.eatWhile(/[\w\._\-]/);
    +        state.tokenize = inBlock("meta", "?>");
    +        return "meta";
    +      }
    +      else {
    +        type = stream.eat("/") ? "closeTag" : "openTag";
    +        stream.eatSpace();
    +        tagName = "";
    +        var c;
    +        while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c;
    +        state.tokenize = inTag;
    +        return "tag";
    +      }
    +    }
    +    else if (ch == "&") {
    +      var ok;
    +      if (stream.eat("#")) {
    +        if (stream.eat("x")) {
    +          ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";");
    +        } else {
    +          ok = stream.eatWhile(/[\d]/) && stream.eat(";");
    +        }
    +      } else {
    +        ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";");
    +      }
    +      return ok ? "atom" : "error";
    +    }
    +    else {
    +      stream.eatWhile(/[^&<]/);
    +      return null;
    +    }
    +  }
    +
    +  function inTag(stream, state) {
    +    var ch = stream.next();
    +    if (ch == ">" || (ch == "/" && stream.eat(">"))) {
    +      state.tokenize = inText;
    +      type = ch == ">" ? "endTag" : "selfcloseTag";
    +      return "tag";
    +    }
    +    else if (ch == "=") {
    +      type = "equals";
    +      return null;
    +    }
    +    else if (/[\'\"]/.test(ch)) {
    +      state.tokenize = inAttribute(ch);
    +      return state.tokenize(stream, state);
    +    }
    +    else {
    +      stream.eatWhile(/[^\s\u00a0=<>\"\'\/?]/);
    +      return "word";
    +    }
    +  }
    +
    +  function inAttribute(quote) {
    +    return function(stream, state) {
    +      while (!stream.eol()) {
    +        if (stream.next() == quote) {
    +          state.tokenize = inTag;
    +          break;
    +        }
    +      }
    +      return "string";
    +    };
    +  }
    +
    +  function inBlock(style, terminator) {
    +    return function(stream, state) {
    +      while (!stream.eol()) {
    +        if (stream.match(terminator)) {
    +          state.tokenize = inText;
    +          break;
    +        }
    +        stream.next();
    +      }
    +      return style;
    +    };
    +  }
    +  function doctype(depth) {
    +    return function(stream, state) {
    +      var ch;
    +      while ((ch = stream.next()) != null) {
    +        if (ch == "<") {
    +          state.tokenize = doctype(depth + 1);
    +          return state.tokenize(stream, state);
    +        } else if (ch == ">") {
    +          if (depth == 1) {
    +            state.tokenize = inText;
    +            break;
    +          } else {
    +            state.tokenize = doctype(depth - 1);
    +            return state.tokenize(stream, state);
    +          }
    +        }
    +      }
    +      return "meta";
    +    };
    +  }
    +
    +  var curState, setStyle;
    +  function pass() {
    +    for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);
    +  }
    +  function cont() {
    +    pass.apply(null, arguments);
    +    return true;
    +  }
    +
    +  function pushContext(tagName, startOfLine) {
    +    var noIndent = Kludges.doNotIndent.hasOwnProperty(tagName) || (curState.context && curState.context.noIndent);
    +    curState.context = {
    +      prev: curState.context,
    +      tagName: tagName,
    +      indent: curState.indented,
    +      startOfLine: startOfLine,
    +      noIndent: noIndent
    +    };
    +  }
    +  function popContext() {
    +    if (curState.context) curState.context = curState.context.prev;
    +  }
    +
    +  function element(type) {
    +    if (type == "openTag") {
    +      curState.tagName = tagName;
    +      return cont(attributes, endtag(curState.startOfLine));
    +    } else if (type == "closeTag") {
    +      var err = false;
    +      if (curState.context) {
    +        if (curState.context.tagName != tagName) {
    +          if (Kludges.implicitlyClosed.hasOwnProperty(curState.context.tagName.toLowerCase())) {
    +            popContext();
    +          }
    +          err = !curState.context || curState.context.tagName != tagName;
    +        }
    +      } else {
    +        err = true;
    +      }
    +      if (err) setStyle = "error";
    +      return cont(endclosetag(err));
    +    }
    +    return cont();
    +  }
    +  function endtag(startOfLine) {
    +    return function(type) {
    +      if (type == "selfcloseTag" ||
    +          (type == "endTag" && Kludges.autoSelfClosers.hasOwnProperty(curState.tagName.toLowerCase()))) {
    +        maybePopContext(curState.tagName.toLowerCase());
    +        return cont();
    +      }
    +      if (type == "endTag") {
    +        maybePopContext(curState.tagName.toLowerCase());
    +        pushContext(curState.tagName, startOfLine);
    +        return cont();
    +      }
    +      return cont();
    +    };
    +  }
    +  function endclosetag(err) {
    +    return function(type) {
    +      if (err) setStyle = "error";
    +      if (type == "endTag") { popContext(); return cont(); }
    +      setStyle = "error";
    +      return cont(arguments.callee);
    +    }
    +  }
    +  function maybePopContext(nextTagName) {
    +    var parentTagName;
    +    while (true) {
    +      if (!curState.context) {
    +        return;
    +      }
    +      parentTagName = curState.context.tagName.toLowerCase();
    +      if (!Kludges.contextGrabbers.hasOwnProperty(parentTagName) ||
    +          !Kludges.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {
    +        return;
    +      }
    +      popContext();
    +    }
    +  }
    +
    +  function attributes(type) {
    +    if (type == "word") {setStyle = "attribute"; return cont(attribute, attributes);}
    +    if (type == "endTag" || type == "selfcloseTag") return pass();
    +    setStyle = "error";
    +    return cont(attributes);
    +  }
    +  function attribute(type) {
    +    if (type == "equals") return cont(attvalue, attributes);
    +    if (!Kludges.allowMissing) setStyle = "error";
    +    return (type == "endTag" || type == "selfcloseTag") ? pass() : cont();
    +  }
    +  function attvalue(type) {
    +    if (type == "string") return cont(attvaluemaybe);
    +    if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return cont();}
    +    setStyle = "error";
    +    return (type == "endTag" || type == "selfCloseTag") ? pass() : cont();
    +  }
    +  function attvaluemaybe(type) {
    +    if (type == "string") return cont(attvaluemaybe);
    +    else return pass();
    +  }
    +
    +  return {
    +    startState: function() {
    +      return {tokenize: inText, cc: [], indented: 0, startOfLine: true, tagName: null, context: null};
    +    },
    +
    +    token: function(stream, state) {
    +      if (stream.sol()) {
    +        state.startOfLine = true;
    +        state.indented = stream.indentation();
    +      }
    +      if (stream.eatSpace()) return null;
    +
    +      setStyle = type = tagName = null;
    +      var style = state.tokenize(stream, state);
    +      state.type = type;
    +      if ((style || type) && style != "comment") {
    +        curState = state;
    +        while (true) {
    +          var comb = state.cc.pop() || element;
    +          if (comb(type || style)) break;
    +        }
    +      }
    +      state.startOfLine = false;
    +      return setStyle || style;
    +    },
    +
    +    indent: function(state, textAfter, fullLine) {
    +      var context = state.context;
    +      if ((state.tokenize != inTag && state.tokenize != inText) ||
    +          context && context.noIndent)
    +        return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0;
    +      if (alignCDATA && /<!\[CDATA\[/.test(textAfter)) return 0;
    +      if (context && /^<\//.test(textAfter))
    +        context = context.prev;
    +      while (context && !context.startOfLine)
    +        context = context.prev;
    +      if (context) return context.indent + indentUnit;
    +      else return 0;
    +    },
    +
    +    compareStates: function(a, b) {
    +      if (a.indented != b.indented || a.tokenize != b.tokenize) return false;
    +      for (var ca = a.context, cb = b.context; ; ca = ca.prev, cb = cb.prev) {
    +        if (!ca || !cb) return ca == cb;
    +        if (ca.tagName != cb.tagName) return false;
    +      }
    +    },
    +
    +    electricChars: "/"
    +  };
    +});
    +
    +CodeMirror.defineMIME("application/xml", "xml");
    +if (!CodeMirror.mimeModes.hasOwnProperty("text/html"))
    +  CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true});
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/plugin.js b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/plugin.js
    new file mode 100644
    index 00000000..3e644407
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/fileeditor/plugin.js
    @@ -0,0 +1,227 @@
    +锘/*
    + * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + * For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    + *
    + * The software, this file and its contents are subject to the CKFinder
    + * License. Please read the license.txt file before using, installing, copying,
    + * modifying or distribute this file or part of its contents. The contents of
    + * this file is part of the Source Code of CKFinder.
    + */
    +
    +CKFinder.addPlugin( 'fileeditor', function( api )
    +{
    +	var regexExt = /^(.*)\.([^\.]+)$/,
    +		regexTextExt = /^(txt|css|html|htm|js|asp|cfm|cfc|ascx|php|inc|xml|xslt|xsl|cs)$/i,
    +		regexCodeMirrorExt = /^(css|html|htm|js|xml|xsl|php|cs)$/i,
    +		codemirror,
    +		file,
    +		fileLoaded = false,
    +		doc;
    +
    +	var codemirrorPath = CKFinder.getPluginPath( 'fileeditor' ) + 'codemirror/';
    +	var codeMirrorParsers = {
    +		css :	codemirrorPath + 'mode/css/css.js',
    +		js :	codemirrorPath + 'mode/javascript/javascript.js',
    +		html :	[ codemirrorPath + 'mode/xml/xml.js', codemirrorPath + 'mode/javascript/javascript.js', codemirrorPath + 'mode/css/css.js', codemirrorPath + 'mode/htmlmixed/htmlmixed.js' ],
    +		xml :	codemirrorPath + 'mode/xml/xml.js',
    +		php :	[ codemirrorPath + 'mode/xml/xml.js', codemirrorPath + 'mode/javascript/javascript.js', codemirrorPath + 'mode/css/css.js', codemirrorPath + 'mode/clike/clike.js', codemirrorPath + 'mode/php/php.js' ],
    +		c :	codemirrorPath + 'mode/clike/clike.js'
    +	};
    +	codeMirrorParsers.htm = codeMirrorParsers.html;
    +	codeMirrorParsers.xsl = codeMirrorParsers.xml;
    +	codeMirrorParsers.cs = codeMirrorParsers.c;
    +	codeMirrorParsers.cpp = codeMirrorParsers.c;
    +	var codeMirrorModes = {
    +		js : 'javascript',
    +		htm : 'htmlmixed',
    +		html : 'htmlmixed',
    +		xsl : 'xml',
    +		c : 'clike',
    +		cs : 'clike',
    +		cpp : 'clike'
    +	};
    +
    +	CKFinder.dialog.add( 'fileEditor', function( api )
    +	{
    +		var height, width;
    +		var saveButton = (function()
    +				{
    +					return {
    +						id : 'save',
    +						label : api.lang.Fileeditor.save,
    +						type : 'button',
    +						onClick : function ( evt )
    +						{
    +							if ( !fileLoaded )
    +								return true;
    +
    +							var dialog = evt.data.dialog;
    +							var content = codemirror ? codemirror.getValue() : doc.getById( 'fileContent' ).getValue();
    +							api.connector.sendCommandPost( 'SaveFile', null, {
    +									content : content,
    +									fileName : file.name
    +								},
    +								function( xml )
    +								{
    +									if ( xml.checkError() )
    +										return false;
    +
    +									api.openMsgDialog( '', api.lang.Fileeditor.fileSaveSuccess );
    +									dialog.hide();
    +									return undefined;
    +								},
    +								file.folder.type,
    +								file.folder
    +							);
    +							return false;
    +						}
    +					};
    +				})();
    +
    +		if ( api.inPopup )
    +		{
    +			width = api.document.documentElement.offsetWidth;
    +			height = api.document.documentElement.offsetHeight;
    +		}
    +		else
    +		{
    +			var parentWindow = ( api.document.parentWindow || api.document.defaultView ).parent;
    +			width = parentWindow.innerWidth ? parentWindow.innerWidth : parentWindow.document.documentElement.clientWidth;
    +			height = parentWindow.innerHeight ? parentWindow.innerHeight : parentWindow.document.documentElement.clientHeight;
    +		}
    +
    +		var cssWidth = parseInt( width, 10 ) * 0.6 - 10,
    +			cssHeight = parseInt( height, 10 ) * 0.7 - 20;
    +
    +		return {
    +			title : api.getSelectedFile().name,
    +			minWidth : parseInt( width, 10 ) * 0.6,
    +			minHeight : parseInt( height, 10 ) * 0.7,
    +			onHide : function()
    +			{
    +				if ( fileLoaded )
    +				{
    +					var fileContent = doc.getById( 'fileContent' );
    +					if ( fileContent )
    +						fileContent.remove();
    +				}
    +			},
    +			onShow : function()
    +			{
    +				var dialog = this;
    +
    +				doc = dialog.getElement().getDocument();
    +				var win = doc.getWindow();
    +				doc.getById( 'fileArea' ).setHtml( '<div class="ckfinder_loader_32" style="margin: 100px auto 0 auto;text-align:center;"><p style="height:' + cssHeight + 'px;width:' + cssWidth + 'px;">' + api.lang.Fileeditor.loadingFile + '</p></div>' );
    +
    +				file = api.getSelectedFile();
    +				var enableCodeMirror = regexCodeMirrorExt.test( file.ext );
    +				this.setTitle( file.name );
    +
    +				if ( enableCodeMirror && win.$.CodeMirror === undefined )
    +					doc.appendStyleSheet( codemirrorPath + 'lib/codemirror.css' );
    +
    +				// If CKFinder is runninng under a different domain than baseUrl, then the following call will fail:
    +				// CKFinder.ajax.load( file.getUrl() + '?t=' + (new Date().getTime()), function( data )...
    +
    +				var url = api.connector.composeUrl( 'DownloadFile', { FileName : file.name, format : 'text', t : new Date().getTime() },
    +						file.folder.type, file.folder );
    +
    +				CKFinder.ajax.load( url, function( data )
    +				{
    +					if ( data === null || ( file.size > 0 && data === '' ) )
    +					{
    +						api.openMsgDialog( '', api.lang.Fileeditor.fileOpenError );
    +						dialog.hide();
    +						return;
    +					}
    +					else
    +						fileLoaded = true;
    +
    +					var fileArea = doc.getById( 'fileArea' );
    +
    +					fileArea.setStyle( 'height', '100%' );
    +					fileArea.setHtml( '<textarea id="fileContent" style="height:' + cssHeight + 'px; width:' + cssWidth + 'px"></textarea>' );
    +					if ( CKFinder.env.opera )
    +						doc.getById( 'fileContent' ).setHtml( CKFinder.tools.htmlEncode( data ) );
    +					else
    +						doc.getById( 'fileContent' ).setText( data );
    +
    +					codemirror = null;
    +					if ( enableCodeMirror )
    +					{
    +						CKFinder.scriptLoader.load( codemirrorPath + 'lib/codemirror.js', function()
    +						{
    +							CKFinder.scriptLoader.load( codeMirrorParsers[ file.ext ], function()
    +							{
    +								codemirror = win.$.CodeMirror.fromTextArea( doc.getById( 'fileContent' ).$, { mode : codeMirrorModes[ file.ext ] || file.ext } );
    +
    +								// TODO get rid of ugly buttons and provide something better
    +								var undoB = doc.createElement( 'button', { attributes: { 'label' : api.lang.common.undo } } );
    +								undoB.on( 'click', function()
    +								{
    +									codemirror.undo();
    +								});
    +								undoB.setHtml( api.lang.common.undo );
    +								undoB.appendTo( doc.getById( 'fileArea' ) );
    +
    +								var redoB = doc.createElement( 'button', { attributes: { 'label' : api.lang.common.redo } } );
    +								redoB.on( 'click', function()
    +								{
    +									codemirror.redo();
    +								});
    +								redoB.setHtml( api.lang.common.redo );
    +								redoB.appendTo( doc.getById( 'fileArea' ) );
    +							}, this, false, doc.getHead() );
    +						}, this, false, doc.getHead() );
    +					}
    +				});
    +			},
    +			contents : [
    +				{
    +					id : 'tab1',
    +					label : '',
    +					title : '',
    +					expand : true,
    +					padding : 0,
    +					elements :
    +					[
    +						{
    +							type : 'html',
    +							id : 'htmlLoader',
    +							html : '' +
    +							'<style type="text/css">' +
    +							'#fileArea .CodeMirror {background:white}' +
    +							'#fileArea .CodeMirror-scroll {height:'+cssHeight+'px; width:'+cssWidth+'px}' +
    +							'#fileArea .CodeMirror .cm-tab {white-space:pre;}' +
    +							// FF >= 12 has some scrolling issue
    +							( CKFinder.env.gecko && CKFinder.env.version >= 120000 ? '#fileArea .CodeMirror-scroll > div > div {position:absolute !important}' : '' ) +
    +							'</style>' +
    +							'<div id="fileArea"></div>'
    +						}
    +					]
    +				}
    +			],
    +			// TODO http://dev.fckeditor.net/ticket/4750
    +			buttons : [ saveButton, CKFinder.dialog.cancelButton ]
    +		};
    +	} );
    +
    +	api.addFileContextMenuOption( { label : api.lang.Fileeditor.contextMenuName, command : 'fileEditor' } , function( api, file )
    +			{
    +				api.openDialog( 'fileEditor' );
    +			},
    +			function ( file )
    +			{
    +				var maxSize = 1024;
    +
    +				if ( typeof ( CKFinder.config.fileeditorMaxSize ) != 'undefined' )
    +					maxSize = CKFinder.config.fileeditorMaxSize;
    +
    +				// Disable for images, binary files, large files etc.
    +				if ( regexTextExt.test( file.ext ) && file.size <= maxSize )
    +					return file.folder.acl.fileDelete ? true : -1;
    +
    +				return false;
    +			});
    +} );
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/flashupload/Uploader.html b/src/main/webapp/plug-in/ckfinder/plugins/flashupload/Uploader.html
    new file mode 100644
    index 00000000..7bb7dbf7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/flashupload/Uploader.html
    @@ -0,0 +1,146 @@
    +<html lang="en">
    +<!---
    + * CKFinder
    + * ========
    + * http://cksource.com/ckfinder
    + * Copyright (C) 2007-2013, CKSource - Frederico Knabben. All rights reserved.
    + *
    + * The software, this file and its contents are subject to the CKFinder
    + * License. Please read the license.txt file before using, installing, copying,
    + * modifying or distribute this file or part of its contents. The contents of
    + * this file is part of the Source Code of CKFinder.
    +--->
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    +<title></title>
    +<style>
    +body {
    +	margin: 0px;
    +	overflow:hidden;
    +	padding: 5px 0;
    +}
    +#cke_flashupload {
    +	display:block;
    +	z-index:100;
    +}
    +</style>
    +</head>
    +<body scroll="no">
    +<div id="cke_flashupload" tabindex="0"></div>
    +<script language="JavaScript" type="text/javascript">
    +/**
    + * Protection against scrolling browser window.
    + * @param event
    + */
    +function wheel( event ) {
    +	var e = event || window.event;
    +	e.cancelBubble = true;
    +	if (e.stopPropagation) e.stopPropagation();
    +	return false;
    +}
    +if( window.addEventListener ) {
    +	window.addEventListener('DOMMouseScroll', wheel, false);
    +}
    +else {
    +	window.attachEvent("onscroll", wheel);
    +}
    +window.onmousewheel = document.onmousewheel = wheel;
    +
    +var lang = window.parent.api.lang;
    +var api = window.parent.api;
    +var params = {
    +	width : "100%",
    +	height : "100%",
    +	id : "Uploader",
    +	quality : "high",
    +	bgcolor : "#FFFFFF",
    +	name : "Uploader",
    +	wmode : "transparent",
    +	allowScriptAccess :"sameDomain"
    +};
    +// flashvars must be encoded due to problems in IE
    +// http://code.google.com/p/swfobject/issues/detail?id=66
    +var flashvars = {
    +	layoutDirection : lang.dir,
    +	browseButtonLabel : encodeURIComponent(lang.UploadAddFiles),
    +	totalSizeLabel : encodeURIComponent(lang.UploadTotalSize),
    +	totalFilesLabel : encodeURIComponent(lang.UploadTotalFiles),
    +	clearButtonLabel : encodeURIComponent(lang.UploadClearFiles),
    +	cancelButtonLabel : encodeURIComponent(lang.CancelBtn),
    +	closeButtonLabel : encodeURIComponent(lang.CloseBtn),
    +	uploadButtonLabel : encodeURIComponent(lang.UploadSend),
    +	cancelUploadButtonLabel : encodeURIComponent(lang.UploadCancel),
    +	removeButtonLabel : encodeURIComponent(lang.UploadRemove),
    +	removeTip : encodeURIComponent(lang.UploadRemoveTip),
    +	uploadedLabel : encodeURIComponent(lang.UploadUploaded),
    +	fileTooLargeMsg : encodeURIComponent(lang.Errors[203]),
    +	processingMsg : encodeURIComponent(lang.UploadProcessing),
    +	uploadMaxSize : window.parent.api.config.uploadMaxSize,
    +	uploadCheckImages : window.parent.api.config.uploadCheckImages ? 1 : 0,
    +	isIE : window.parent.CKFinder.env.ie ? 1 : 0
    +};
    +var attributes = {};
    +var swfobject = window.parent.create_swfobject(window, document);
    +swfobject.embedSWF("flash/Uploader.swf", "cke_flashupload", "100%", "100%", "10.2.0", "", flashvars, params, attributes);
    +/**
    + * Functions called by Flash uploader.
    + */
    +function getAllowedExtensions() {
    +	var api = window.parent.api;
    +	return api.getSelectedFolder().getResourceType().allowedExtensions;
    +}
    +function getFilterDescription() {
    +	var api = window.parent.api;
    +	return api.getSelectedFolder().type;
    +}
    +function getUploadUrl() {
    +	var api = window.parent.api;
    +	return api.getSelectedFolder().getUploadUrl() + "&response_type=txt";
    +}
    +function getMaxSize() {
    +	var api = window.parent.api;
    +	return parseInt(api.getSelectedFolder().getResourceType().maxSize, 10);
    +}
    +function getLang() {
    +	return window.parent.api.lang;
    +}
    +// Name of cookies used as session identifiers and the name to be used in the URL.
    +// An unfortunate requirement of flash uploader due to infamous cookie bug in Flash.
    +function getSessionIdentifiers() {
    +	return window.parent.sessionIdentifiers;
    +}
    +function getCookies() {
    +	// Loaded via LoadCookies
    +	if ( window.parent.flash_cookies )
    +		return window.parent.flash_cookies;
    +
    +	// document.cookie does not store HttpOnly cookies
    +	var cookie, cookies = {};
    +	if ( window.parent.document.cookie.length ) {
    +		var cookieArray = window.parent.document.cookie.split(';'),
    +			name, eqIndex;
    +		for (var i = cookieArray.length-1; i > 0; i--)
    +		{
    +			cookie = cookieArray[i];
    +			cookie = cookie.replace(/^( )+/g, "");
    +			eqIndex = cookie.indexOf("=");
    +			if (eqIndex > 0)
    +			{
    +				name = cookie.substring(0, eqIndex);
    +				if (name.indexOf("CKFinder_") !== 0)
    +					cookies[cookie.substring(0, eqIndex)] = cookie.substring(eqIndex + 1);
    +			}
    +		}
    +	}
    +	return cookies;
    +}
    +function focusDocument() {
    +	setTimeout(function() {document.focus;}, 200);
    +}
    +function showFiles(selectedFile) {
    +	var api = window.parent.api;
    +	api.getSelectedFolder().showFiles( selectedFile );
    +}
    +</script>
    +</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/flashupload/flash/Uploader.swf b/src/main/webapp/plug-in/ckfinder/plugins/flashupload/flash/Uploader.swf
    new file mode 100644
    index 00000000..536a3ad0
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/flashupload/flash/Uploader.swf differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/colorbox.css b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/colorbox.css
    new file mode 100644
    index 00000000..14c17559
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/colorbox.css
    @@ -0,0 +1,69 @@
    +/*
    +    Colorbox Core Style:
    +    The following CSS is consistent between example themes and should not be altered.
    +*/
    +#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
    +#cboxOverlay{position:fixed; width:100%; height:100%;}
    +#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
    +#cboxContent{position:relative;}
    +#cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;}
    +#cboxTitle{margin:0;}
    +#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
    +#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
    +.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;}
    +.cboxIframe{width:100%; height:100%; display:block; border:0;}
    +#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
    +
    +/*
    +    User Style:
    +    Change the following styles to modify the appearance of Colorbox.  They are
    +    ordered & tabbed in a way that represents the nesting of the generated HTML.
    +*/
    +#cboxOverlay{background:url(images/overlay.png) repeat 0 0;}
    +#colorbox{outline:0;}
    +    #cboxTopLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px 0;}
    +    #cboxTopRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px 0;}
    +    #cboxBottomLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px -29px;}
    +    #cboxBottomRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px -29px;}
    +    #cboxMiddleLeft{width:21px; background:url(images/controls.png) left top repeat-y;}
    +    #cboxMiddleRight{width:21px; background:url(images/controls.png) right top repeat-y;}
    +    #cboxTopCenter{height:21px; background:url(images/border.png) 0 0 repeat-x;}
    +    #cboxBottomCenter{height:21px; background:url(images/border.png) 0 -29px repeat-x;}
    +    #cboxContent{background:#fff; overflow:hidden;font-family: Arial,Helvetica,sans-serif;font-size:14px;line-height:1.2em;}
    +        .cboxIframe{background:#fff;}
    +        #cboxError{padding:50px; border:1px solid #ccc;}
    +        #cboxLoadedContent{margin-bottom:28px;}
    +        #cboxTitle{position:absolute; bottom:4px; right:30px; text-align:right; width:100%; color:#949494;line-height:1.2em;height: 1.2em; overflow:hidden;}
    +        #cboxCurrent{position:absolute; bottom:4px; left:50px; color:#949494; background:#fff; padding-right: 2px; padding-left: 6px; line-height:1.2em;height: 1.2em; }
    +        #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
    +        #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
    +
    +        /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */
    +        #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; width:auto; background:none; }
    +
    +        /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */
    +        #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;}
    +
    +        #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;}
    +        #cboxPrevious{position:absolute; bottom:0; left:0; background:url(images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;}
    +        #cboxPrevious:hover{background-position:-75px -25px;}
    +        #cboxNext{position:absolute; bottom:0; left:25px; background:url(images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;}
    +        #cboxNext:hover{background-position:-50px -25px;}
    +        #cboxClose{position:absolute; bottom:0; right:0; background:url(images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;}
    +        #cboxClose:hover{background-position:-25px -25px;}
    +
    +/*
    +  The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
    +  when an alpha filter (opacity change) is set on the element or ancestor element.  This style is not applied to or needed in IE9.
    +  See: http://jacklmoore.com/notes/ie-transparency-problems/
    +*/
    +.cboxIE #cboxTopLeft,
    +.cboxIE #cboxTopCenter,
    +.cboxIE #cboxTopRight,
    +.cboxIE #cboxBottomLeft,
    +.cboxIE #cboxBottomCenter,
    +.cboxIE #cboxBottomRight,
    +.cboxIE #cboxMiddleLeft,
    +.cboxIE #cboxMiddleRight {
    +    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
    +}
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/border.png b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/border.png
    new file mode 100644
    index 00000000..f463a10d
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/border.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/controls.png b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/controls.png
    new file mode 100644
    index 00000000..dcfd6fb9
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/controls.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderBottomCenter.png b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderBottomCenter.png
    new file mode 100644
    index 00000000..0d4475ed
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderBottomCenter.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderBottomLeft.png b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderBottomLeft.png
    new file mode 100644
    index 00000000..2775eba8
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderBottomLeft.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderBottomRight.png b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderBottomRight.png
    new file mode 100644
    index 00000000..f7f51379
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderBottomRight.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderMiddleLeft.png b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderMiddleLeft.png
    new file mode 100644
    index 00000000..a2d63d15
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderMiddleLeft.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderMiddleRight.png b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderMiddleRight.png
    new file mode 100644
    index 00000000..fd7c3e84
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderMiddleRight.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderTopCenter.png b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderTopCenter.png
    new file mode 100644
    index 00000000..2937a9cf
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderTopCenter.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderTopLeft.png b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderTopLeft.png
    new file mode 100644
    index 00000000..f9d458b5
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderTopLeft.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderTopRight.png b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderTopRight.png
    new file mode 100644
    index 00000000..74b8583c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/ie6/borderTopRight.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/loading.gif b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/loading.gif
    new file mode 100644
    index 00000000..b4695d81
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/loading.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/loading_background.png b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/loading_background.png
    new file mode 100644
    index 00000000..6ae83e69
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/loading_background.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/overlay.png b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/overlay.png
    new file mode 100644
    index 00000000..53ea98f7
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/images/overlay.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/jquery.colorbox-min.js b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/jquery.colorbox-min.js
    new file mode 100644
    index 00000000..25051785
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/jquery.colorbox-min.js
    @@ -0,0 +1,7 @@
    +锘/*!
    + Colorbox v1.4.27 - 2013-07-16
    + jQuery lightbox and modal window plugin
    + (c) 2013 Jack Moore - http://www.jacklmoore.com/colorbox
    + license: http://www.opensource.org/licenses/mit-license.php
    + */
    +(function(M,l,aa){var N={transition:"elastic",speed:300,fadeOut:300,width:false,initialWidth:"600",innerWidth:false,maxWidth:false,minWidth:false,height:false,initialHeight:"450",innerHeight:false,maxHeight:false,minHeight:false,scalePhotos:true,scrolling:true,inline:false,html:false,iframe:false,fastIframe:true,photo:false,href:false,title:false,rel:false,opacity:0.9,preloading:true,className:false,retinaImage:false,retinaUrl:false,retinaSuffix:"@2x.$1",current:"image {current} of {total}",previous:"previous",next:"next",close:"close",xhrError:"This content failed to load.",imgError:"This image failed to load.",open:false,returnFocus:true,trapFocus:true,reposition:true,loop:true,slideshow:false,slideshowAuto:true,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",photoRegex:/\.(gif|png|jp(e|g|eg)|bmp|ico|webp)((#|\?).*)?$/i,onOpen:false,onLoad:false,onComplete:false,onCleanup:false,onClosed:false,overlayClose:true,escKey:true,arrowKey:true,top:false,bottom:false,left:false,right:false,fixed:false,data:undefined,closeButton:true},x="colorbox",V="cbox",r=V+"Element",Z=V+"_open",e=V+"_load",X=V+"_complete",v=V+"_cleanup",ag=V+"_closed",i=V+"_purge",T,al,am,d,K,p,b,S,c,ae,Q,k,h,o,u,ab,t,U,z,B,I=M("<a/>"),aj,an,m,g,a,w,L,n,D,ac,P,A,O,ai="div",ah,G=0,ad={},af;function J(ao,ar,aq){var ap=l.createElement(ao);if(ar){ap.id=V+ar}if(aq){ap.style.cssText=aq}return M(ap)}function s(){return aa.innerHeight?aa.innerHeight:M(aa).height()}function F(ap){var ao=c.length,aq=(L+ap)%ao;return(aq<0)?ao+aq:aq}function R(ao,ap){return Math.round((/%/.test(ao)?((ap==="x"?ae.width():s())/100):1)*parseInt(ao,10))}function C(ap,ao){return ap.photo||ap.photoRegex.test(ao)}function E(ap,ao){return ap.retinaUrl&&aa.devicePixelRatio>1?ao.replace(ap.photoRegex,ap.retinaSuffix):ao}function ak(ao){if("contains" in al[0]&&!al[0].contains(ao.target)){ao.stopPropagation();al.focus()}}function W(){var ao,ap=M.data(w,x);if(ap==null){aj=M.extend({},N);if(console&&console.log){console.log("Error: cboxElement missing settings object")}}else{aj=M.extend({},ap)}for(ao in aj){if(M.isFunction(aj[ao])&&ao.slice(0,2)!=="on"){aj[ao]=aj[ao].call(w)}}aj.rel=aj.rel||w.rel||M(w).data("rel")||"nofollow";aj.href=aj.href||M(w).attr("href");aj.title=aj.title||w.title;if(typeof aj.href==="string"){aj.href=M.trim(aj.href)}}function H(ao,ap){M(l).trigger(ao);I.trigger(ao);if(M.isFunction(ap)){ap.call(w)}}function y(){var ap,ar=V+"Slideshow_",at="click."+V,ao,av,au,aq;if(aj.slideshow&&c[1]){ao=function(){clearTimeout(ap)};av=function(){if(aj.loop||c[L+1]){ap=setTimeout(O.next,aj.slideshowSpeed)}};au=function(){ab.html(aj.slideshowStop).unbind(at).one(at,aq);I.bind(X,av).bind(e,ao).bind(v,aq);al.removeClass(ar+"off").addClass(ar+"on")};aq=function(){ao();I.unbind(X,av).unbind(e,ao).unbind(v,aq);ab.html(aj.slideshowStart).unbind(at).one(at,function(){O.next();au()});al.removeClass(ar+"on").addClass(ar+"off")};if(aj.slideshowAuto){au()}else{aq()}}else{al.removeClass(ar+"off "+ar+"on")}}function f(ao){if(!P){w=ao;W();c=M(w);L=0;if(aj.rel!=="nofollow"){c=M("."+r).filter(function(){var aq=M.data(this,x),ap;if(aq){ap=M(this).data("rel")||aq.rel||this.rel}return(ap===aj.rel)});L=c.index(w);if(L===-1){c=c.add(w);L=c.length-1}}T.css({opacity:parseFloat(aj.opacity),cursor:aj.overlayClose?"pointer":"auto",visibility:"visible"}).show();if(ah){al.add(T).removeClass(ah)}if(aj.className){al.add(T).addClass(aj.className)}ah=aj.className;if(aj.closeButton){z.html(aj.close).appendTo(d)}else{z.appendTo("<div/>")}if(!D){D=ac=true;al.css({visibility:"hidden",display:"block"});Q=J(ai,"LoadedContent","width:0; height:0; overflow:hidden");d.css({width:"",height:""}).append(Q);an=K.height()+S.height()+d.outerHeight(true)-d.height();m=p.width()+b.width()+d.outerWidth(true)-d.width();g=Q.outerHeight(true);a=Q.outerWidth(true);aj.w=R(aj.initialWidth,"x");aj.h=R(aj.initialHeight,"y");O.position();y();H(Z,aj.onOpen);B.add(o).hide();al.focus();if(aj.trapFocus){if(l.addEventListener){l.addEventListener("focus",ak,true);I.one(ag,function(){l.removeEventListener("focus",ak,true)})}}if(aj.returnFocus){I.one(ag,function(){M(w).focus()})}}Y()}}function q(){if(!al&&l.body){af=false;ae=M(aa);al=J(ai).attr({id:x,"class":M.support.opacity===false?V+"IE":"",role:"dialog",tabindex:"-1"}).hide();T=J(ai,"Overlay").hide();h=M([J(ai,"LoadingOverlay")[0],J(ai,"LoadingGraphic")[0]]);am=J(ai,"Wrapper");d=J(ai,"Content").append(o=J(ai,"Title"),u=J(ai,"Current"),U=M('<button type="button"/>').attr({id:V+"Previous"}),t=M('<button type="button"/>').attr({id:V+"Next"}),ab=J("button","Slideshow"),h);z=M('<button type="button"/>').attr({id:V+"Close"});am.append(J(ai).append(J(ai,"TopLeft"),K=J(ai,"TopCenter"),J(ai,"TopRight")),J(ai,false,"clear:left").append(p=J(ai,"MiddleLeft"),d,b=J(ai,"MiddleRight")),J(ai,false,"clear:left").append(J(ai,"BottomLeft"),S=J(ai,"BottomCenter"),J(ai,"BottomRight"))).find("div div").css({"float":"left"});k=J(ai,false,"position:absolute; width:9999px; visibility:hidden; display:none");B=t.add(U).add(u).add(ab);M(l.body).append(T,al.append(am,k))}}function j(){function ao(ap){if(!(ap.which>1||ap.shiftKey||ap.altKey||ap.metaKey||ap.ctrlKey)){ap.preventDefault();f(this)}}if(al){if(!af){af=true;t.click(function(){O.next()});U.click(function(){O.prev()});z.click(function(){O.close()});T.click(function(){if(aj.overlayClose){O.close()}});M(l).bind("keydown."+V,function(aq){var ap=aq.keyCode;if(D&&aj.escKey&&ap===27){aq.preventDefault();O.close()}if(D&&aj.arrowKey&&c[1]&&!aq.altKey){if(ap===37){aq.preventDefault();U.click()}else{if(ap===39){aq.preventDefault();t.click()}}}});if(M.isFunction(M.fn.on)){M(l).on("click."+V,"."+r,ao)}else{M("."+r).live("click."+V,ao)}}return true}return false}if(M.colorbox){return}M(q);O=M.fn[x]=M[x]=function(ao,aq){var ap=this;ao=ao||{};q();if(j()){if(M.isFunction(ap)){ap=M("<a/>");ao.open=true}else{if(!ap[0]){return ap}}if(aq){ao.onComplete=aq}ap.each(function(){M.data(this,x,M.extend({},M.data(this,x)||N,ao))}).addClass(r);if((M.isFunction(ao.open)&&ao.open.call(ap))||ao.open){f(ap[0])}}return ap};O.position=function(aq,at){var aw,ay=0,ap=0,au=al.offset(),ao,ar;ae.unbind("resize."+V);al.css({top:-90000,left:-90000});ao=ae.scrollTop();ar=ae.scrollLeft();if(aj.fixed){au.top-=ao;au.left-=ar;al.css({position:"fixed"})}else{ay=ao;ap=ar;al.css({position:"absolute"})}if(aj.right!==false){ap+=Math.max(ae.width()-aj.w-a-m-R(aj.right,"x"),0)}else{if(aj.left!==false){ap+=R(aj.left,"x")}else{ap+=Math.round(Math.max(ae.width()-aj.w-a-m,0)/2)}}if(aj.bottom!==false){ay+=Math.max(s()-aj.h-g-an-R(aj.bottom,"y"),0)}else{if(aj.top!==false){ay+=R(aj.top,"y")}else{ay+=Math.round(Math.max(s()-aj.h-g-an,0)/2)}}al.css({top:au.top,left:au.left,visibility:"visible"});am[0].style.width=am[0].style.height="9999px";function ax(){K[0].style.width=S[0].style.width=d[0].style.width=(parseInt(al[0].style.width,10)-m)+"px";d[0].style.height=p[0].style.height=b[0].style.height=(parseInt(al[0].style.height,10)-an)+"px"}aw={width:aj.w+a+m,height:aj.h+g+an,top:ay,left:ap};if(aq){var av=0;M.each(aw,function(az){if(aw[az]!==ad[az]){av=aq;return}});aq=av}ad=aw;if(!aq){al.css(aw)}al.dequeue().animate(aw,{duration:aq||0,complete:function(){ax();ac=false;am[0].style.width=(aj.w+a+m)+"px";am[0].style.height=(aj.h+g+an)+"px";if(aj.reposition){setTimeout(function(){ae.bind("resize."+V,O.position)},1)}if(at){at()}},step:ax})};O.resize=function(ap){var ao;if(D){ap=ap||{};if(ap.width){aj.w=R(ap.width,"x")-a-m}if(ap.innerWidth){aj.w=R(ap.innerWidth,"x")}Q.css({width:aj.w});if(ap.height){aj.h=R(ap.height,"y")-g-an}if(ap.innerHeight){aj.h=R(ap.innerHeight,"y")}if(!ap.innerHeight&&!ap.height){ao=Q.scrollTop();Q.css({height:"auto"});aj.h=Q.height()}Q.css({height:aj.h});if(ao){Q.scrollTop(ao)}O.position(aj.transition==="none"?0:aj.speed)}};O.prep=function(ap){if(!D){return}var at,aq=aj.transition==="none"?0:aj.speed;Q.empty().remove();Q=J(ai,"LoadedContent").append(ap);function ao(){aj.w=aj.w||Q.width();aj.w=aj.minw&&aj.minw>aj.w?aj.minw:aj.w;aj.w=aj.mw&&aj.mw<aj.w?aj.mw:aj.w;return aj.w}function ar(){aj.h=aj.h||Q.height();aj.h=aj.minh&&aj.minh>aj.h?aj.minh:aj.h;aj.h=aj.mh&&aj.mh<aj.h?aj.mh:aj.h;return aj.h}Q.hide().appendTo(k.show()).css({width:ao(),overflow:aj.scrolling?"auto":"hidden"}).css({height:ar()}).prependTo(d);k.hide();M(n).css({"float":"none"});at=function(){var ay=c.length,aw,ax="frameBorder",au="allowTransparency",av;if(!D){return}function az(){if(M.support.opacity===false){al[0].style.removeAttribute("filter")}}av=function(){clearTimeout(A);h.hide();H(X,aj.onComplete)};o.html(aj.title).add(Q).show();if(ay>1){if(typeof aj.current==="string"){u.html(aj.current.replace("{current}",L+1).replace("{total}",ay)).show()}t[(aj.loop||L<ay-1)?"show":"hide"]().html(aj.next);U[(aj.loop||L)?"show":"hide"]().html(aj.previous);if(aj.slideshow){ab.show()}if(aj.preloading){M.each([F(-1),F(1)],function(){var aD,aA,aB=c[this],aC=M.data(aB,x);if(aC&&aC.href){aD=aC.href;if(M.isFunction(aD)){aD=aD.call(aB)}}else{aD=M(aB).attr("href")}if(aD&&C(aC,aD)){aD=E(aC,aD);aA=l.createElement("img");aA.src=aD}})}}else{B.hide()}if(aj.iframe){aw=J("iframe")[0];if(ax in aw){aw[ax]=0}if(au in aw){aw[au]="true"}if(!aj.scrolling){aw.scrolling="no"}M(aw).attr({src:aj.href,name:(new Date()).getTime(),"class":V+"Iframe",allowFullScreen:true,webkitAllowFullScreen:true,mozallowfullscreen:true}).one("load",av).appendTo(Q);I.one(i,function(){aw.src="//about:blank"});if(aj.fastIframe){M(aw).trigger("load")}}else{av()}if(aj.transition==="fade"){al.fadeTo(aq,1,az)}else{az()}};if(aj.transition==="fade"){al.fadeTo(aq,0,function(){O.position(0,at)})}else{O.position(aq,at)}};function Y(){var aq,ar,ap=O.prep,ao,at=++G;ac=true;n=false;w=c[L];W();H(i);H(e,aj.onLoad);aj.h=aj.height?R(aj.height,"y")-g-an:aj.innerHeight&&R(aj.innerHeight,"y");aj.w=aj.width?R(aj.width,"x")-a-m:aj.innerWidth&&R(aj.innerWidth,"x");aj.mw=aj.w;aj.mh=aj.h;aj.minw=aj.w;aj.minh=aj.h;if(aj.maxWidth){aj.mw=R(aj.maxWidth,"x")-a-m;aj.mw=aj.w&&aj.w<aj.mw?aj.w:aj.mw}if(aj.minWidth){aj.minw=R(aj.minWidth,"x")-a-m;aj.minw=aj.w&&aj.w>aj.minw?aj.w:aj.minw}if(aj.maxHeight){aj.mh=R(aj.maxHeight,"y")-g-an;aj.mh=aj.h&&aj.h<aj.mh?aj.h:aj.mh}if(aj.minHeight){aj.minh=R(aj.minHeight,"y")-g-an;aj.minh=aj.h&&aj.h>aj.minh?aj.h:aj.minh}aq=aj.href;A=setTimeout(function(){h.show()},100);if(aj.inline){ao=J(ai).hide().insertBefore(M(aq)[0]);I.one(i,function(){ao.replaceWith(Q.children())});ap(M(aq))}else{if(aj.iframe){ap(" ")}else{if(aj.html){ap(aj.html)}else{if(C(aj,aq)){aq=E(aj,aq);n=l.createElement("img");M(n).addClass(V+"Photo").bind("error",function(){aj.title=false;ap(J(ai,"Error").html(aj.imgError))}).one("load",function(){var au;if(at!==G){return}n.alt=M(w).attr("alt")||M(w).attr("data-alt")||"";if(aj.retinaImage&&aa.devicePixelRatio>1){n.height=n.height/aa.devicePixelRatio;n.width=n.width/aa.devicePixelRatio}if(aj.scalePhotos){ar=function(){n.height-=n.height*au;n.width-=n.width*au};if(aj.mw&&n.width>aj.mw){au=(n.width-aj.mw)/n.width;ar()}if(aj.mh&&n.height>aj.mh){au=(n.height-aj.mh)/n.height;ar()}}if(aj.h){n.style.marginTop=Math.max(aj.mh-n.height,0)/2+"px"}if(c[1]&&(aj.loop||c[L+1])){n.style.cursor="pointer";n.onclick=function(){O.next()}}n.style.width=n.width+"px";n.style.height=n.height+"px";setTimeout(function(){ap(n)},1)});setTimeout(function(){n.src=aq},1)}else{if(aq){k.load(aq,aj.data,function(av,au){if(at===G){ap(au==="error"?J(ai,"Error").html(aj.xhrError):M(this).contents())}})}}}}}}O.next=function(){if(!ac&&c[1]&&(aj.loop||c[L+1])){L=F(1);f(c[L])}};O.prev=function(){if(!ac&&c[1]&&(aj.loop||L)){L=F(-1);f(c[L])}};O.close=function(){if(D&&!P){P=true;D=false;H(v,aj.onCleanup);ae.unbind("."+V);T.fadeTo(aj.fadeOut||0,0);al.stop().fadeTo(aj.fadeOut||0,0,function(){al.add(T).css({"opacity":1,cursor:"auto"}).hide();H(i);Q.empty().remove();setTimeout(function(){P=false;H(ag,aj.onClosed)},1)})}};O.remove=function(){if(!al){return}al.stop();M.colorbox.close();al.stop().remove();T.remove();P=false;al=null;M("."+r).removeData(x).removeClass(r);M(l).unbind("click."+V)};O.element=function(){return M(w)};O.settings=N}(jQuery,document,window));
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/jquery.min.js b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/jquery.min.js
    new file mode 100644
    index 00000000..1cf271b8
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/jquery.min.js
    @@ -0,0 +1,6 @@
    +锘/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
    +//@ sourceMappingURL=jquery.min.map
    +*/
    +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
    +}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
    +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/license.txt b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/license.txt
    new file mode 100644
    index 00000000..13ac9ac5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/gallery/colorbox/license.txt
    @@ -0,0 +1,29 @@
    +Sources of Intellectual Property Included in the gallery plugin:
    +
    +ColorBox - A lightweight customizable lightbox plugin for jQuery created by
    +Jack Moore is released under the MIT License.
    +Copyright (c) Jack Moore, http://jacklmoore.com/colorbox/
    +
    +jQuery - the jQuery project is released under the MIT License.
    +Copyright (c) 2011 John Resig, http://jquery.com/
    +
    +== The MIT License (MIT) ==
    +
    +Permission is hereby granted, free of charge, to any person obtaining
    +a copy of this software and associated documentation files (the
    +"Software"), to deal in the Software without restriction, including
    +without limitation the rights to use, copy, modify, merge, publish,
    +distribute, sublicense, and/or sell copies of the Software, and to
    +permit persons to whom the Software is furnished to do so, subject to
    +the following conditions:
    +
    +The above copyright notice and this permission notice shall be
    +included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/imageresize/images/mini.gif b/src/main/webapp/plug-in/ckfinder/plugins/imageresize/images/mini.gif
    new file mode 100644
    index 00000000..54d91074
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/plugins/imageresize/images/mini.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/plugins/imageresize/plugin.js b/src/main/webapp/plug-in/ckfinder/plugins/imageresize/plugin.js
    new file mode 100644
    index 00000000..f9001b15
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/plugins/imageresize/plugin.js
    @@ -0,0 +1,676 @@
    +锘/*
    + * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
    + * For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    + *
    + * The software, this file and its contents are subject to the CKFinder
    + * License. Please read the license.txt file before using, installing, copying,
    + * modifying or distribute this file or part of its contents. The contents of
    + * this file is part of the Source Code of CKFinder.
    + */
    +
    +CKFinder.addPlugin( 'imageresize', {
    +	readOnly : false,
    +	connectorInitialized : function( api, xml )
    +	{
    +		var node = xml.selectSingleNode( 'Connector/PluginsInfo/imageresize/@smallThumb' );
    +		if ( node )
    +			CKFinder.config.imageresize_thumbSmall = node.value;
    +
    +		node = xml.selectSingleNode( 'Connector/PluginsInfo/imageresize/@mediumThumb' );
    +		if ( node )
    +			CKFinder.config.imageresize_thumbMedium = node.value;
    +
    +		node = xml.selectSingleNode( 'Connector/PluginsInfo/imageresize/@largeThumb' );
    +		if ( node )
    +			CKFinder.config.imageresize_thumbLarge = node.value;
    +	},
    +	uiReady : function( api )
    +	{
    +		var regexExt = /^(.*)\.([^\.]+)$/,
    +			regexFileName = /^(.*?)(?:_\d+x\d+)?\.([^\.]+)$/,
    +			regexGetSize = /^\s*(\d+)(px)?\s*$/i,
    +			regexGetSizeOrEmpty = /(^\s*(\d+)(px)?\s*$)|^$/i,
    +			imageDimension = { width : 0, height : 0 },
    +			file,
    +			doc;
    +
    +		var updateFileName = function( dialog )
    +		{
    +			var width = dialog.getValueOf( 'tab1', 'width' ) || 0,
    +				height = dialog.getValueOf( 'tab1', 'height' ) || 0,
    +				e = dialog.getContentElement( 'tab1', 'createNewBox' );
    +
    +			if ( width && height )
    +			{
    +				var matches = file.name.match( regexFileName );
    +				dialog.setValueOf( 'tab1', 'fileName', matches[1] + '_' + width + 'x' + height );
    +				e.getElement().show();
    +			}
    +			else
    +				e.getElement().hide();
    +		};
    +
    +		var onSizeChange = function()
    +		{
    +			var value = this.getValue(),	// This = input element.
    +				dialog = this.getDialog(),
    +				maxWidth = api.config.imagesMaxWidth,
    +				maxHeight = api.config.imagesMaxHeight,
    +				aMatch  =  value.match( regexGetSize ),
    +				width = imageDimension.width,
    +				height = imageDimension.height,
    +				newHeight,
    +				newWidth;
    +
    +			if ( aMatch )
    +				value = aMatch[1];
    +
    +			if ( !api.config.imageresize_allowEnlarging )
    +			{
    +				if ( width && width < maxWidth )
    +					maxWidth = width;
    +
    +				if ( height && height < maxHeight )
    +					maxHeight = height;
    +			}
    +
    +			if ( maxHeight > 0 && this.id == 'height' && value > maxHeight )
    +			{
    +				value = maxHeight;
    +				dialog.setValueOf( 'tab1', 'height', value );
    +			}
    +
    +			if ( maxWidth > 0 && this.id == 'width' && value > maxWidth )
    +			{
    +				value = maxWidth;
    +				dialog.setValueOf( 'tab1', 'width', value );
    +			}
    +
    +			// Only if ratio is locked
    +			if ( dialog.lockRatio && width && height )
    +			{
    +				if ( this.id == 'height' )
    +				{
    +					if ( value && value != '0' )
    +						value = Math.round( width * ( value  / height ) );
    +
    +					if ( !isNaN( value ) )
    +					{
    +						// newWidth > maxWidth
    +						if ( maxWidth > 0 && value > maxWidth )
    +						{
    +							value = maxWidth;
    +							newHeight = Math.round( height * ( value  / width ) );
    +							dialog.setValueOf( 'tab1', 'height', newHeight );
    +						}
    +
    +						dialog.setValueOf( 'tab1', 'width', value );
    +					}
    +				}
    +				else	//this.id = txtWidth.
    +				{
    +					if ( value && value != '0' )
    +						value = Math.round( height * ( value  / width ) );
    +
    +					if ( !isNaN( value ) )
    +					{
    +						// newHeight > maxHeight
    +						if ( maxHeight > 0 && value > maxHeight )
    +						{
    +							value = maxHeight;
    +							newWidth = Math.round( width * ( value  / height ) );
    +							dialog.setValueOf( 'tab1', 'width', newWidth );
    +						}
    +
    +						dialog.setValueOf( 'tab1', 'height', value );
    +					}
    +				}
    +			}
    +
    +			updateFileName( dialog );
    +		};
    +
    +		var resetSize = function( dialog )
    +		{
    +			if ( imageDimension.width && imageDimension.height )
    +			{
    +				dialog.setValueOf( 'tab1', 'width', imageDimension.width );
    +				dialog.setValueOf( 'tab1', 'height', imageDimension.height );
    +				updateFileName( dialog );
    +			}
    +		};
    +
    +		var switchLockRatio = function( dialog, value )
    +		{
    +			var doc = dialog.getElement().getDocument(),
    +				ratioButton = doc.getById( 'btnLockSizes' );
    +
    +			if ( imageDimension.width && imageDimension.height )
    +			{
    +				if ( value == 'check' )	// Check image ratio and original image ratio.
    +				{
    +					var width = dialog.getValueOf( 'tab1', 'width' ),
    +						height = dialog.getValueOf( 'tab1', 'height' ),
    +						originalRatio = imageDimension.width * 1000 / imageDimension.height,
    +						thisRatio = width * 1000 / height;
    +					dialog.lockRatio  = false;	// Default: unlock ratio
    +
    +					if ( !width && !height )
    +						dialog.lockRatio = true; // If someone didn't start typing, lock ratio.
    +					else if ( !isNaN( originalRatio ) && !isNaN( thisRatio ) )
    +					{
    +						if ( Math.round( originalRatio ) == Math.round( thisRatio ) )
    +							dialog.lockRatio = true;
    +					}
    +				}
    +				else if ( value != undefined )
    +					dialog.lockRatio = value;
    +				else
    +					dialog.lockRatio = !dialog.lockRatio;
    +			}
    +			else if ( value != 'check' )	// I can't lock ratio if ratio is unknown.
    +				dialog.lockRatio = false;
    +
    +			if ( dialog.lockRatio )
    +				ratioButton.removeClass( 'ckf_btn_unlocked' );
    +			else
    +				ratioButton.addClass( 'ckf_btn_unlocked' );
    +
    +			return dialog.lockRatio;
    +		};
    +
    +		CKFinder.dialog.add( 'resizeDialog', function( api )
    +		{
    +			return {
    +				title : api.lang.Imageresize.dialogTitle.replace( '%s', api.getSelectedFile().name ),
    +				// TODO resizable : CKFinder.DIALOG_RESIZE_BOTH
    +				minWidth : CKFinder.env.webkit ? 290 : 390,
    +				minHeight : 230,
    +				onShow : function()
    +				{
    +					var dialog = this,
    +						thumbSmall = CKFinder.config.imageresize_thumbSmall,
    +						thumbMedium = CKFinder.config.imageresize_thumbMedium,
    +						thumbLarge = CKFinder.config.imageresize_thumbLarge;
    +
    +					doc = dialog.getElement().getDocument();
    +					file = api.getSelectedFile();
    +
    +					this.setTitle( api.lang.Imageresize.dialogTitle.replace( '%s', file.name ) );
    +
    +					var previewImg = doc.getById( 'previewImage' );
    +					var sizeSpan = doc.getById( 'imageSize' );
    +
    +					// Thumbnails should be limited to a reasonable value (#1020).
    +					previewImg.setAttribute( 'src', file.getThumbnailUrl( true ) );
    +					previewImg.on( 'load', function()
    +					{
    +						previewImg.removeStyle( 'width' );
    +						previewImg.removeStyle( 'height' );
    +						var width = previewImg.$.width,
    +							height = previewImg.$.height;
    +						previewImg.hide();
    +						if ( CKFinder.env.ie6Compat )
    +						{
    +							if ( width > height )
    +								previewImg.setStyles( { width : 100 + 'px', height : Math.round( height / ( width / 100 ) ) + 'px' } );
    +							else
    +								previewImg.setStyles( { height : 100 + 'px', width : Math.round( width / ( height / 100 ) ) + 'px' } );
    +						}
    +						else
    +						{
    +							previewImg.removeStyle( 'max-width' );
    +							previewImg.removeStyle( 'max-height' );
    +							if ( width > height )
    +								previewImg.setStyle( 'max-width', '100px' );
    +							else
    +								previewImg.setStyle( 'max-height', '100px' );
    +						}
    +						previewImg.show();
    +					});
    +
    +					var updateImgDimension = function( width, height )
    +					{
    +						if ( !width || !height )
    +						{
    +							sizeSpan.setText( '' );
    +							return;
    +						}
    +
    +						imageDimension.width = width;
    +						imageDimension.height = height;
    +						sizeSpan.setText( width + ' x ' + height + ' px' );
    +						CKFinder.tools.setTimeout( function(){ switchLockRatio( dialog, 'check' ); }, 0, dialog );
    +					};
    +
    +					api.connector.sendCommand( 'ImageResizeInfo', {
    +							fileName : file.name
    +						},
    +						function( xml )
    +						{
    +							if ( xml.checkError() )
    +								return;
    +							var width = xml.selectSingleNode( 'Connector/ImageInfo/@width' ),
    +								height = xml.selectSingleNode( 'Connector/ImageInfo/@height' ),
    +								result;
    +
    +							if ( width && height )
    +							{
    +								width = parseInt( width.value, 10 );
    +								height = parseInt( height.value, 10 );
    +								updateImgDimension( width, height );
    +
    +								var checkThumbs = function( id, size )
    +								{
    +									if ( !size )
    +										return;
    +
    +									var reThumb = /^(\d+)x(\d+)$/;
    +										result = reThumb.exec( size );
    +
    +									var el = dialog.getContentElement( 'tab1', id );
    +									if ( 0 + result[ 1 ] > width && 0 + result[ 2 ] > height )
    +									{
    +										el.disable();
    +										el.getElement().setAttribute( 'title', api.lang.Imageresize.imageSmall ).addClass( 'cke_disabled' );
    +									}
    +									else
    +									{
    +										el.enable();
    +										el.getElement().setAttribute( 'title', '' ).removeClass( 'cke_disabled' );
    +									}
    +								};
    +
    +								checkThumbs( 'smallThumb', thumbSmall );
    +								checkThumbs( 'mediumThumb', thumbMedium );
    +								checkThumbs( 'largeThumb', thumbLarge );
    +							}
    +						},
    +						file.folder.type,
    +						file.folder
    +					);
    +
    +					if ( !thumbSmall )
    +						dialog.getContentElement( 'tab1', 'smallThumb' ).getElement().hide();
    +
    +					if ( !thumbMedium )
    +						dialog.getContentElement( 'tab1', 'mediumThumb' ).getElement().hide();
    +
    +					if ( !thumbLarge )
    +						dialog.getContentElement( 'tab1', 'largeThumb' ).getElement().hide();
    +
    +					if ( !thumbSmall && !thumbMedium && !thumbLarge )
    +						dialog.getContentElement( 'tab1', 'thumbsLabel' ).getElement().hide();
    +
    +					dialog.setValueOf( 'tab1', 'fileName', file.name );
    +					dialog.getContentElement( 'tab1', 'fileNameExt' ).getElement().setHtml( '.' + file.ext );
    +					dialog.getContentElement( 'tab1', 'width' ).focus();
    +					dialog.getContentElement( 'tab1', 'fileName').setValue( '' );
    +					dialog.getContentElement( 'tab1', 'createNewBox' ).getElement().hide();
    +					updateImgDimension( 0,0 );
    +				},
    +				onOk : function()
    +				{
    +					var dialog = this,
    +						width = dialog.getValueOf( 'tab1', 'width' ),
    +						height = dialog.getValueOf( 'tab1', 'height' ),
    +						small = dialog.getValueOf( 'tab1', 'smallThumb' ),
    +						medium = dialog.getValueOf( 'tab1', 'mediumThumb' ),
    +						large = dialog.getValueOf( 'tab1', 'largeThumb' ),
    +						fileName = dialog.getValueOf( 'tab1', 'fileName' ),
    +						createNew = dialog.getValueOf( 'tab1', 'createNew' );
    +
    +					if ( width && !height )
    +					{
    +						api.openMsgDialog( '', api.lang.Imageresize.invalidHeight );
    +						return false;
    +					}
    +					else if ( !width && height )
    +					{
    +						api.openMsgDialog( '', api.lang.Imageresize.invalidWidth );
    +						return false;
    +					}
    +					if ( !api.config.imageresize_allowEnlarging && ( parseInt( width, 10 ) > imageDimension.width || parseInt( height, 10 ) > imageDimension.height ) )
    +					{
    +						var str = api.lang.Imageresize.sizeTooBig;
    +						api.openMsgDialog( '', str.replace( '%size', imageDimension.width + 'x' + imageDimension.height ) );
    +						return false;
    +					}
    +
    +					if ( ( width && height ) || small || medium || large )
    +					{
    +						if ( !createNew )
    +							fileName = file.name;
    +
    +						api.connector.sendCommandPost( 'ImageResize', null, {
    +								width : width,
    +								height : height,
    +								fileName : file.name,
    +								newFileName : fileName + (createNew ? '.' + file.ext : ''),
    +								overwrite : createNew ? 0 : 1,
    +								small : small ? 1 : 0,
    +								medium : medium ? 1 : 0,
    +								large : large ? 1 : 0
    +							},
    +							function( xml )
    +							{
    +								if ( xml.checkError() )
    +									return;
    +								api.openMsgDialog( '', api.lang.Imageresize.resizeSuccess );
    +								api.refreshOpenedFolder();
    +							},
    +							file.folder.type,
    +							file.folder
    +						);
    +					}
    +					return undefined;
    +				},
    +				contents : [
    +					{
    +						id : 'tab1',
    +						label : '',
    +						title : '',
    +						expand : true,
    +						padding : 0,
    +						elements :
    +						[
    +							{
    +								type : 'hbox',
    +								// The dialog window looks weird on Webkit (#1021)
    +								widths : [ ( CKFinder.env.webkit ? 130 : 180 ) + 'px', ( CKFinder.env.webkit ? 250 : 280 ) + 'px' ],
    +								children:
    +								[
    +									{
    +										type : 'vbox',
    +										children:
    +										[
    +											{
    +												type : 'html',
    +												html : '' +
    +												'<style type="text/css">' +
    +												'a.ckf_btn_reset' +
    +												'{' +
    +													'float: right;' +
    +													'background-position: 0 -32px;' +
    +													'background-image: url("' + CKFinder.getPluginPath( 'imageresize' ) + 'images/mini.gif");' +
    +													'width: 16px;' +
    +													'height: 16px;' +
    +													'background-repeat: no-repeat;' +
    +													'border: 1px none;' +
    +													'font-size: 1px;' +
    +												'}' +
    +
    +												'a.ckf_btn_locked,' +
    +												'a.ckf_btn_unlocked' +
    +												'{' +
    +													'float: left;' +
    +													'background-position: 0 0;' +
    +													'background-image: url("' + CKFinder.getPluginPath( 'imageresize' ) + 'images/mini.gif");' +
    +													'width: 16px;' +
    +													'height: 16px;' +
    +													'background-repeat: no-repeat;' +
    +													'border: none 1px;' +
    +													'font-size: 1px;' +
    +												'}' +
    +
    +												'a.ckf_btn_unlocked' +
    +												'{' +
    +													'background-position: 0 -16px;' +
    +													'background-image: url("' + CKFinder.getPluginPath( 'imageresize' ) + '/images/mini.gif");' +
    +												'}' +
    +
    +												'.ckf_btn_over' +
    +												'{' +
    +													'border: outset 1px;' +
    +													'cursor: pointer;' +
    +													'cursor: hand;' +
    +												'}' +
    +												'</style>' +
    +
    +												'<div style="height:110px;padding:7px">' +
    +												'<img id="previewImage" src="" style="margin-bottom:4px; max-width: 100px; max-height: 100px;" /><br />' +
    +												'<span style="font-size:9px;" id="imageSize"></span>' +
    +												'</div>'
    +											},
    +											{
    +												type : 'html',
    +												id : 'thumbsLabel',
    +												html : '<strong>' + api.lang.Imageresize.thumbnailNew + '</strong>'
    +											},
    +											{
    +												type : 'checkbox',
    +												id : 'smallThumb',
    +												checked : false,
    +												label : api.lang.Imageresize.thumbnailSmall.replace( '%s', CKFinder.config.imageresize_thumbSmall )
    +											},
    +											{
    +												type : 'checkbox',
    +												id : 'mediumThumb',
    +												checked : false,
    +												label : api.lang.Imageresize.thumbnailMedium.replace( '%s', CKFinder.config.imageresize_thumbMedium )
    +											},
    +											{
    +												type : 'checkbox',
    +												id : 'largeThumb',
    +												checked : false,
    +												label : api.lang.Imageresize.thumbnailLarge.replace( '%s', CKFinder.config.imageresize_thumbLarge )
    +											}
    +										]
    +									},
    +									{
    +										type : 'vbox',
    +										children :
    +										[
    +											{
    +												type : 'html',
    +												html : '<strong>' + api.lang.Imageresize.newSize + '</strong>'
    +											},
    +											{
    +												type : 'hbox',
    +												widths : [ '80%', '20%' ],
    +												children:
    +												[
    +													{
    +														type : 'vbox',
    +														children:
    +														[
    +															{
    +																type : 'text',
    +																labelLayout : 'horizontal',
    +																label : api.lang.Imageresize.width,
    +																onKeyUp : onSizeChange,
    +																validate: function()
    +																{
    +																	var value = this.getValue();
    +																	if ( value )
    +																	{
    +																		var aMatch  =  value.match( regexGetSize );
    +																		if ( !aMatch || parseInt( aMatch[1], 10 ) < 1 )
    +																		{
    +																			api.openMsgDialog( '', api.lang.Imageresize.invalidWidth );
    +																			return false;
    +																		}
    +																	}
    +																	return true;
    +																},
    +																id : 'width'
    +															},
    +															{
    +																type : 'text',
    +																labelLayout : 'horizontal',
    +																label : api.lang.Imageresize.height,
    +																onKeyUp : onSizeChange,
    +																validate: function()
    +																{
    +																	var value = this.getValue();
    +																	if ( value )
    +																	{
    +																		var aMatch  =  value.match( regexGetSize );
    +																		if ( !aMatch || parseInt( aMatch[1], 10 ) < 1 )
    +																		{
    +																			api.openMsgDialog( '', api.lang.Imageresize.invalidHeight );
    +																			return false;
    +																		}
    +																	}
    +																	return true;
    +																},
    +																id : 'height'
    +															}
    +														]
    +													},
    +													{
    +														type : 'html',
    +														onLoad : function()
    +														{
    +															var doc = this.getElement().getDocument(),
    +																dialog = this.getDialog();
    +															// Activate Reset button
    +															var	resetButton = doc.getById( 'btnResetSize' ),
    +																ratioButton = doc.getById( 'btnLockSizes' );
    +															if ( resetButton )
    +															{
    +																resetButton.on( 'click', function( evt )
    +																	{
    +																		resetSize( this );
    +																		evt.data.preventDefault();
    +																	}, dialog );
    +																resetButton.on( 'mouseover', function()
    +																	{
    +																		this.addClass( 'ckf_btn_over' );
    +																	}, resetButton );
    +																resetButton.on( 'mouseout', function()
    +																	{
    +																		this.removeClass( 'ckf_btn_over' );
    +																	}, resetButton );
    +															}
    +															// Activate (Un)LockRatio button
    +															if ( ratioButton )
    +															{
    +																ratioButton.on( 'click', function( evt )
    +																	{
    +																		var locked = switchLockRatio( this ),
    +																			width = this.getValueOf( 'tab1', 'width' );
    +
    +																		if ( imageDimension.width && width )
    +																		{
    +																			var height = imageDimension.height / imageDimension.width * width;
    +																			if ( !isNaN( height ) )
    +																			{
    +																				this.setValueOf( 'tab1', 'height', Math.round( height ) );
    +																				updateFileName( dialog );
    +																			}
    +																		}
    +																		evt.data.preventDefault();
    +																	}, dialog );
    +																ratioButton.on( 'mouseover', function()
    +																	{
    +																		this.addClass( 'ckf_btn_over' );
    +																	}, ratioButton );
    +																ratioButton.on( 'mouseout', function()
    +																	{
    +																		this.removeClass( 'ckf_btn_over' );
    +																	}, ratioButton );
    +															}
    +														},
    +														html : '<div style="margin-top:4px">'+
    +															'<a href="javascript:void(0)" tabindex="-1" title="' + api.lang.Imageresize.lockRatio + '" class="ckf_btn_locked ckf_btn_unlocked" id="btnLockSizes"></a>' +
    +															'<a href="javascript:void(0)" tabindex="-1" title="' + api.lang.Imageresize.resetSize + '" class="ckf_btn_reset" id="btnResetSize"></a>'+
    +															'</div>'
    +													}
    +												]
    +											},
    +											{
    +												type : 'vbox',
    +												id : 'createNewBox',
    +												hidden : true,
    +												children:
    +												[
    +													{
    +														type : 'checkbox',
    +														checked : true,
    +														id : 'createNew',
    +														label : api.lang.Imageresize.newImage,
    +														'default' : true,
    +														onChange : function()
    +														{
    +															var dialog = this.getDialog();
    +															var filenameInput = dialog.getContentElement( 'tab1', 'fileNameWithExt' );
    +															if ( filenameInput )
    +															{
    +																if ( !this.getValue() )
    +																	filenameInput.getElement().hide();
    +																else
    +																	filenameInput.getElement().show();
    +															}
    +														}
    +													},
    +													{
    +														type : 'hbox',
    +														widths : [ '90%', '10%' ],
    +														padding : 0,
    +														id : 'fileNameWithExt',
    +														children :
    +														[
    +															{
    +																type : 'text',
    +																label : '',
    +																validate : function()
    +																{
    +																	var dialog = this.getDialog(),
    +																		createNew = dialog.getContentElement( 'tab1', 'createNew' ),
    +																		value = this.getValue();
    +
    +																	if ( createNew && dialog.getValueOf( 'tab1', 'width' ) && dialog.getValueOf( 'tab1', 'height' ) )
    +																	{
    +																		if ( !value )
    +																		{
    +																			api.openMsgDialog( '', api.lang.Imageresize.invalidName );
    +																			return false;
    +																		}
    +																	}
    +																	return true;
    +																},
    +																id : 'fileName'
    +															},
    +															{
    +																type : 'html',
    +																html : '',
    +																id : 'fileNameExt',
    +																onLoad : function()
    +																{
    +																	this.getElement().getParent().setStyles( { 'vertical-align' : 'bottom', 'padding-bottom' : '2px' } );
    +																}
    +															}
    +														]
    +													}
    +												]
    +											}
    +										]
    +									}
    +								]
    +							}
    +						]
    +					}
    +				],
    +				// TODO http://dev.fckeditor.net/ticket/4750
    +				buttons : [ CKFinder.dialog.okButton, CKFinder.dialog.cancelButton ]
    +			};
    +		} );
    +
    +		api.addFileContextMenuOption( { label : api.lang.Imageresize.contextMenuName, command : 'resizeImage' } , function( api, file )
    +			{
    +				api.openDialog( 'resizeDialog' );
    +			},
    +			function ( file )
    +			{
    +				// Disable for files other than images.
    +				if ( !file.isImage() || !api.getSelectedFolder().type )
    +					return false;
    +				if ( file.folder.acl.fileDelete && file.folder.acl.fileUpload )
    +					return true;
    +				else
    +					return -1;
    +			}
    +		);
    +	}
    +} );
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/app.css b/src/main/webapp/plug-in/ckfinder/skins/kama/app.css
    new file mode 100644
    index 00000000..74a72d51
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/skins/kama/app.css
    @@ -0,0 +1,16 @@
    +/*
    +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    +*/
    +
    +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}:focus{outline:0;}ins{text-decoration:none;}del{text-decoration:line-through;}table{border-collapse:collapse;border-spacing:0;}body{font:9pt/1.5em Arial,Helvetica,sans-serif;}pre,code,tt{font:1em/1.5em 'Andale Mono','Lucida Console',monospace;}h1,h2,h3,h4,h5,h6,b,strong{font-weight:bold;}em,i,dfn{font-style:italic;}dfn{font-weight:bold;}p,code,pre,kbd{margin:0 0 1.5em 0;}blockquote{margin:0 1.5em 1.5em 1.5em;}li ul,li ol{margin:0 1.5em;}ul,ol{margin:0 1.5em 1.5em 1.5em;}ul,ul li{list-style-type:disc;}ol,ol li{list-style-type:decimal;}dl{margin:0 0 1.5em 0;}dl dt{font-weight:bold;}dd{margin-left:1.5em;}table{margin-bottom:1.4em;width:100%;}th{font-weight:bold;}th,td,caption{padding:4px 10px 4px 5px;}tfoot{font-style:italic;}sup,sub{line-height:0;}abbr,acronym{border-bottom:1px dotted;}address{margin:0 0 1.5em;font-style:italic;}del{text-decoration:line-through;}pre{margin:1.5em 0;white-space:pre;}img.centered,.aligncenter,div.aligncenter{display:block;margin-left:auto;margin-right:auto;}img.alignright{display:inline;}img.alignleft{display:inline;}.alignright{float:right;margin-left:10px;}.alignleft{float:left;margin-right:10px;}.clearfix::after,.group::after{content:".";display:block;height:0;clear:both;visibility:hidden;}*:first-child+html .clearfix{zoom:1;display:block;}* html .clearfix{zoom:1;display:block;}*:first-child+html .group{zoom:1;display:block;}* html .group{zoom:1;display:block;}html,body,.fake_wrapper,#ckfinder{height:100%;width:100%;overflow:hidden;-webkit-touch-callout:none;}#ckfinder_view{text-align:left;width:100%;height:100%;margin:auto;}.cke_rtl #ckfinder_view{text-align:right;}.container{vertical-align:top;padding:0;height:100%;overflow:hidden;}.columns_1 #sidebar_container{display:none;}.columns_2 #sidebar_container{width:200px;}#sidebar_wrapper{height:100%;}#sidebar_container{float:left;}.cke_rtl #sidebar_container{float:right;}#folder_view,.tools_view{overflow:hidden;}#status_view{height:2em;}#panel_view{overflow:auto;}#panel_view,#files_view{clear:both;}.cke_compatibility a,.cke_compatibility a:hover,.cke_compatibility a:active,.cke_compatibility a:visited{color:black;text-decoration:none;}.cke_compatibility,.cke_compatibility td,.cke_compatibility td *{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;line-height:1;border:0;}.cke_compatibility tbody{border:0;}.cke_compatibility .cke_accessibility{display:none;}.cke_compatibility table{width:auto;}.cke_compatibility{background-color:#FFF;}.cke_compatibility *{color:black;height:auto;border-collapse:collapse;padding:0;margin:0;vertical-align:baseline;white-space:nowrap;}.cke_compatibility pre,.cke_compatibility textarea{white-space:pre;}.cke_compatibility code,.cke_compatibility font{white-space:normal;}@media print{.cke_skin_kama .cke_toolbox{display:none;}}.cke_skin_kama .cke_browser_webkit .cke_toolbox,.cke_skin_kama .cke_browser_webkit .cke_toolbox>span{white-space:normal;}.cke_skin_kama .cke_toolbox{clear:both;padding:5px 3px 5px 6px;}.cke_skin_kama .cke_rtl .cke_toolbox{padding:5px 6px 5px 3px;}.cke_skin_kama a.cke_toolbox_collapser,.cke_skin_kama a:hover.cke_toolbox_collapser{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:3px -1366px;background-repeat:no-repeat;width:11px;height:11px;float:right;border:1px outset #D3D3D3;margin:11px 4px 2px;cursor:pointer;}.cke_skin_kama .cke_rtl a.cke_toolbox_collapser,.cke_skin_kama .cke_rtl a:hover.cke_toolbox_collapser{float:left;}.cke_skin_kama a.cke_toolbox_collapser_min,.cke_skin_kama a:hover.cke_toolbox_collapser_min{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:4px -1387px;background-repeat:no-repeat;margin:2px 4px;}
    +.cke_skin_kama .cke_rtl a.cke_toolbox_collapser_min,.cke_skin_kama .cke_rtl a:hover.cke_toolbox_collapser_min{background-position:4px -1408px;}.cke_skin_kama .cke_toolbar{display:inline;}.cke_skin_kama .cke_separator{display:none;}.cke_skin_kama .cke_break{font-size:0;clear:left;}.cke_skin_kama .cke_rtl .cke_break{clear:right;}.cke_skin_kama .cke_toolbar_start{display:none;}.cke_skin_kama .cke_toolgroup{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:repeat-x;background-position:0 -500px;float:left;margin-right:6px;margin-bottom:5px;padding:2px;display:inline;}.cke_skin_kama .cke_rtl .cke_toolgroup{float:right;margin-right:0;margin-left:6px;}.cke_skin_kama .cke_search_box{float:right;position:relative;max-width:104px;}.cke_skin_kama .cke_search_box input,.cke_skin_kama .cke_search_placeholder{font-size:100%;height:20px;line-height:20px;margin:0;padding:4px 3px 2px 20px;max-width:80px;}.cke_skin_kama .cke_search_box input{background:url(images/toolbar/view.gif) no-repeat scroll 2px 6px #f2f2f2;border:1px solid #ccc;border-radius:5px 5px 5px 5px;}.cke_skin_kama .cke_search_placeholder{color:#777;left:0;position:absolute;top:0;width:100%;}.cke_skin_kama .cke_toolbar{display:block;}.cke_skin_kama .cke_toolbar .cke_toolbar_end,.cke_skin_kama .cke_search_box .cke_toolbar_end{display:none;}.cke_skin_kama .cke_rtl .cke_search_box{float:left;}.cke_skin_kama .cke_rtl .cke_search_box input{background-position:right center;text-align:right;}.cke_skin_kama .cke_rtl .cke_search_box input,.cke_skin_kama .cke_rtl .cke_search_placeholder{padding:4px 20px 2px 3px;}.cke_skin_kama .cke_rtl .cke_search_placeholder{left:auto;right:0;}.cke_skin_kama .cke_button a,.cke_skin_kama .cke_button a:hover,.cke_skin_kama .cke_button a:focus,.cke_skin_kama .cke_button a:active,.cke_skin_kama .cke_button a.cke_off{border-radius:3px;outline:none;padding:2px 4px;height:18px;display:inline-block;cursor:default;}.cke_skin_kama .cke_button a,.cke_skin_kama .cke_button a.cke_off{filter:alpha(opacity=70);opacity:.70;-moz-border-radius:3px;-webkit-border-radius:3px;}.cke_skin_kama .cke_hc .cke_button a,.cke_skin_kama .cke_hc .cke_button a.cke_off{opacity:1.0;filter:alpha(opacity=100);border:1px solid white;}.cke_skin_kama .cke_button a.cke_on{background-color:#a3d7ff;filter:alpha(opacity=100);opacity:1;padding:2px 4px;}.cke_skin_kama .cke_hc .cke_button a.cke_on{padding:0 2px!important;border-width:3px;}.cke_skin_kama .cke_button a.cke_disabled,.cke_skin_kama .cke_browser_ie a:hover.cke_button .cke_disabled{filter:alpha(opacity=30);opacity:.3;}.cke_skin_kama .cke_hc .cke_button a.cke_disabled,.cke_skin_kama .cke_browser_ie.cke_hc a:hover.cke_button .cke_disabled{filter:alpha(opacity=60);opacity:.6;}.cke_skin_kama .cke_button a:hover.cke_on,.cke_skin_kama .cke_button a:focus.cke_on,.cke_skin_kama .cke_button a:active.cke_on,.cke_skin_kama .cke_button a:hover.cke_off,.cke_skin_kama .cke_button a:focus.cke_off,.cke_skin_kama .cke_button a:active.cke_off{filter:alpha(opacity=100);opacity:1;padding:2px 4px;}.cke_skin_kama .cke_button a:hover.cke_on,.cke_skin_kama .cke_button a:focus.cke_on,.cke_skin_kama .cke_button a:active.cke_on{background-color:#86caff;}.cke_skin_kama .cke_button a:hover.cke_off,.cke_skin_kama .cke_button a:focus.cke_off,.cke_skin_kama .cke_button a:active.cke_off{background-color:#dff1ff;}.cke_skin_kama .cke_hc .cke_button a:hover.cke_on,.cke_skin_kama .cke_hc .cke_button a:focus.cke_on,.cke_skin_kama .cke_hc .cke_button a:active.cke_on,.cke_skin_kama .cke_hc .cke_button a:hover.cke_off,.cke_skin_kama .cke_hc .cke_button a:focus.cke_off,.cke_skin_kama .cke_hc .cke_button a:active.cke_off{padding:0 2px!important;border-width:3px;}.cke_skin_kama .cke_button .cke_icon{margin-top:1px;width:16px;height:16px;display:inline-block;float:left;}.cke_skin_kama .cke_rtl .cke_button .cke_icon{float:right;}.cke_skin_kama .cke_button .cke_label{cursor:default;display:none;padding-left:3px;line-height:18px;vertical-align:middle;float:left;}
    +.cke_skin_kama .cke_rtl .cke_button .cke_label{padding-left:0;padding-right:3px;float:right;}.cke_skin_kama .cke_hc .cke_button .cke_label{padding:0;display:inline-block;}.cke_skin_kama .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_kama .cke_accessibility{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_kama .cke_button .cke_buttonarrow{display:inline-block;height:17px;width:8px;background-position:2px -1469px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;float:left;}.cke_skin_kama .cke_rtl .cke_button .cke_buttonarrow{background-position:0 -1469px;float:right;}.cke_skin_kama .cke_hc .cke_button .cke_buttonarrow{display:none;}.cke_skin_kama .cke_browser_gecko .cke_toolbar,.cke_skin_kama .cke_browser_gecko .cke_button a,.cke_skin_kama .cke_browser_gecko .cke_button a.cke_off,.cke_skin_kama .cke_browser_gecko .cke_button .cke_icon,.cke_skin_kama .cke_browser_gecko .cke_button .cke_buttonarrow,.cke_skin_kama .cke_browser_gecko .cke_separator,.cke_skin_kama .cke_browser_gecko .cke_toolbar_start{display:block;float:left;}.cke_skin_kama .cke_browser_gecko.cke_hc .cke_button .cke_icon{display:none;}.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_toolbar,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button a,.cke_skin_kama .cke_browser_gecko .cke_rtl.cke_button a.cke_off,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button .cke_icon,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button .cke_buttonarrow,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_toolbar_start{float:right;}.cke_skin_kama .cke_browser_gecko .cke_button .cke_label,.cke_skin_kama .cke_browser_gecko .cke_break{float:left;}.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button .cke_label,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_break{float:right;}.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button .cke_icon,.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button .cke_label,.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button .cke_buttonarrow{float:none;}.cke_skin_kama .cke_browser_webkit .cke_toolbar{float:left;}.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_toolbar{float:right;}.cke_skin_kama .cke_browser_ie8 .cke_button .cke_label,.cke_skin_kama .cke_browser_opera .cke_button .cke_label,.cke_skin_kama .cke_browser_webkit .cke_button .cke_label{line-height:20px;}.cke_skin_kama .cke_browser_opera.cke_browser_quirks .cke_button .cke_label,.cke_skin_kama .cke_browser_iequirks .cke_button .cke_label{line-height:17px;}.cke_skin_kama .cke_browser_ie8 .cke_button .cke_label{vertical-align:top;}.cke_skin_kama .cke_browser_iequirks.cke_browser_ie8 .cke_button .cke_label{vertical-align:middle;}.cke_skin_kama .cke_button_TruncateBasket .cke_icon{background:url('images/toolbar/clear_basket.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_settings .cke_icon{background:url('images/toolbar/settings.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_refresh .cke_icon{background:url('images/toolbar/refresh.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_upload .cke_icon{background:url('images/toolbar/add.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_help .cke_icon{background:url('images/toolbar/help.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_downloadFile .cke_icon{background:url('images/toolbar/download.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_viewFile .cke_icon{background:url('images/toolbar/view.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_deleteFile .cke_icon,.cke_skin_kama .cke_button_deleteFiles .cke_icon{background:url('images/toolbar/delete.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_removeFolder .cke_icon{background:url('images/toolbar/delete.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_maximize .cke_icon{background:url('images/toolbar/maximize.gif') no-repeat 0 0;}#folders_view .folder_tree li a{background:url('images/ckffolder.gif') 3px 0 no-repeat;}.cke_rtl #folders_view .folder_tree li a{background-position:right;}#folders_view .folder_tree li.closable a{background-image:url('images/ckffolderopened.gif');}#folders_view .folder_tree li.openable a{background-image:url('images/ckffolder.gif');}
    +#folders_view .folder_tree li.nochildren a{background-image:url('images/ckffolder.gif');}#folders_view .folder_tree li a.processing{background-image:url('images/loaders/16x16.gif');}#folders_view .folder_tree li.closable .expander{background-image:url('images/ckfminus.gif');}#folders_view .folder_tree li.openable .expander{background-image:url('images/ckfplus.gif');}#files_view .files_thumbnails .processing div.image{background:url("images/loaders/32x32.gif") 50% 50% no-repeat;}.cke_skin_kama .cke_contextmenu{padding:2px;}.cke_skin_kama .cke_menuitem a{display:block;}.cke_skin_kama .cke_menuitem span{cursor:default;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{background-color:#D3D3D3;display:block;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover,.cke_skin_kama .cke_menuitem a.cke_disabled:focus,.cke_skin_kama .cke_menuitem a.cke_disabled:active{background-color:transparent!important;}.cke_skin_kama .cke_menuitem .cke_icon{width:16px;height:16px;float:left;}.cke_skin_kama .cke_menuitem .cke_disabled .cke_icon{filter:alpha(opacity=70);opacity:.70;}.cke_skin_kama .cke_menuitem .cke_icon_wrapper{background-color:#D3D3D3;border:solid 4px #D3D3D3;width:16px;height:16px;float:left;filter:alpha(opacity=70);opacity:.70;clear:both;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_icon_wrapper{float:right;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{background-color:#9d9d9d;border:solid 4px #9d9d9d;filter:alpha(opacity=70);opacity:.70;}.cke_skin_kama .cke_menuitem a:hover.cke_disabled .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus.cke_disabled .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active.cke_disabled .cke_icon_wrapper{background-color:#D3D3D3;border:solid 4px #D3D3D3;}.cke_skin_kama .cke_menuitem .cke_label{display:block;padding-right:3px;padding-top:5px;padding-left:4px;height:19px;margin-left:24px;background-color:#fff;}.cke_skin_kama .cke_frameLoaded .cke_menuitem .cke_label{filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_label{padding-right:0;margin-left:0;padding-left:3px;margin-right:28px;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.30;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{background-color:#D3D3D3;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{background-color:transparent;}.cke_skin_kama .cke_menuseparator{background-color:#D3D3D3;height:2px;filter:alpha(opacity=70);opacity:.70;_font-size:0;}.cke_skin_kama .cke_menuarrow{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1411px;background-repeat:no-repeat;height:5px;width:3px;float:right;margin-right:2px;margin-top:3px;}.cke_rtl .cke_skin_kama .cke_menuarrow{float:left;margin-right:0;margin-left:2px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1390px;background-repeat:no-repeat;}.cke_browser_ie.cke_ltr .cke_skin_kama .cke_menuarrow{position:absolute;right:2px;}.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuarrow{position:absolute;left:2px;}.cke_skin_kama .cke_panel{border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.cke_skin_kama .cke_contextmenu{margin:0;}.cke_skin_kama .cke_panel iframe{width:100%;height:100%;}html.cke_skin_kama_container{overflow:auto;overflow-x:hidden;}body.cke_panel_frame{overflow:auto;overflow-x:hidden;}ul.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap;}li.cke_panel_listItem{margin:0;}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit;text-decoration:none;overflow:hidden;text-overflow:ellipsis;}
    +* html .cke_panel_listItem a{width:100%;color:#000;}*:first-child+html .cke_panel_listItem a{color:#000;}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff;}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff;}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px;}html.cke_skin_kama_container{visibility:visible;}.cke_skin_kama .ckf_uploadButtons span.cke_dialog_ui_button{width:110px;padding:2px;}.cke_skin_kama .ckf_uploadButtons .cke_dialog_ui_button{margin:3px 0;}.cke_skin_kama .ckf_uploadButtons a.cke_dialog_ui_button_ok span,.cke_skin_kama .ckf_uploadButtons a.cke_dialog_ui_button_cancel span{background-image:none;padding:2px;}body .cke_dialog{visibility:visible;background-color:#fff;}.cke_skin_kama table.cke_dialog.cke_browser_gecko{display:block;}.cke_skin_kama .cke_dialog_body{z-index:1;border:solid 1px #ddd;padding:5px;background-color:#fff;position:relative;_position:static;}.cke_skin_kama .cke_dialog_tl,.cke_skin_kama .cke_dialog_tr,.cke_skin_kama .cke_dialog_tc,.cke_skin_kama .cke_dialog_bl,.cke_skin_kama .cke_dialog_br,.cke_skin_kama .cke_dialog_bc,.cke_skin_kama .cke_dialog_ml,.cke_skin_kama .cke_dialog_mr{display:none;}.cke_skin_kama .cke_dialog_title{font-weight:bold;font-size:14px;padding:3px 3px 8px;cursor:move;position:relative;border-bottom:1px solid #eee;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_title,.cke_skin_kama .cke_browser_ie6 .cke_dialog_title,.cke_skin_kama .cke_browser_ie7 .cke_dialog_title{margin-bottom:22px;}.cke_skin_kama .cke_browser_iequirks.cke_single_page .cke_dialog_title,.cke_skin_kama .cke_browser_ie6.cke_single_page .cke_dialog_title,.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_title{margin-bottom:10px;}.cke_skin_kama .cke_dialog_contents{background-color:#ebebeb;border:solid 1px #fff;border-bottom:none;overflow:auto;padding:17px 10px 5px 10px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;border-top-left-radius:5px;border-top-right-radius:5px;margin-top:22px;}.cke_skin_kama .cke_dialog_footer{text-align:right;background-color:#ebebeb;border:solid 1px #fff;border-bottom:none;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;}.cke_skin_kama .cke_rtl .cke_dialog_footer{text-align:left;}.cke_skin_kama .cke_dialog_page_contents{position:relative;}.cke_skin_kama .cke_dialog_footer .cke_resizer{margin-top:20px;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_footer .cke_resizer,.cke_skin_kama .cke_browser_ie6 .cke_dialog_footer .cke_resizer{margin-top:27px;}.cke_skin_kama .cke_dialog_tabs{height:23px;display:inline-block;_display:block;margin-left:10px;margin-right:10px;margin-top:11px;position:absolute;z-index:2;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_tabs,.cke_skin_kama .cke_browser_ie6 .cke_dialog_tabs,.cke_skin_kama .cke_browser_ie7 .cke_dialog_tabs{top:33px;}.cke_skin_kama .cke_rtl .cke_dialog_tabs{right:10px;}.cke_skin_kama a.cke_dialog_tab,.cke_skin_kama a:link.cke_dialog_tab,.cke_skin_kama a:active.cke_dialog_tab,.cke_skin_kama a:hover.cke_dialog_tab,.cke_skin_kama a:visited.cke_dialog_tab{background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1323px;background-color:#ebebeb;height:14px;padding:4px 8px;display:inline-block;cursor:pointer;}.cke_skin_kama .cke_browser_gecko18 a.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:link.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:active.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:hover.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:visited.cke_dialog_tab{display:inline;position:relative;top:6px;}.cke_skin_kama a:hover.cke_dialog_tab{background-color:#f1f1e3;}
    +.cke_skin_kama a.cke_dialog_tab_selected,.cke_skin_kama a:link.cke_dialog_tab_selected,.cke_skin_kama a:active.cke_dialog_tab_selected,.cke_skin_kama a:hover.cke_dialog_tab_selected,.cke_skin_kama a:visited.cke_dialog_tab_selected{background-position:0 -1279px;cursor:default;}.cke_skin_kama .cke_single_page .cke_dialog_tabs{display:none;}.cke_skin_kama .cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:10px;}.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_contents,.cke_skin_kama .cke_browser_ie7Compat.cke_single_page .cke_dialog_contents{margin-top:-10px;position:relative;margin-bottom:-22px;}.cke_skin_kama .cke_dialog_ui_vbox table,.cke_skin_kama .cke_dialog_ui_hbox table{margin:auto;}.cke_skin_kama .cke_dialog_ui_vbox_child{padding:5px 0;}.cke_skin_kama input.cke_dialog_ui_input_text,.cke_skin_kama input.cke_dialog_ui_input_password{background-color:white;border:none;padding:0;width:100%;height:1.4em;line-height:1.4em;}.cke_skin_kama div.cke_dialog_ui_input_text,.cke_skin_kama div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_kama textarea.cke_dialog_ui_input_textarea{background-color:white;border:none;padding:0;width:100%;_width:99%;overflow:auto;resize:none;}.cke_skin_kama div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_kama div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default;}.cke_skin_kama .cke_dialog_ui_hbox{width:100%;}.cke_skin_kama .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_dialog_ui_hbox_child,.cke_skin_kama .cke_dialog_ui_hbox_last{vertical-align:top;}.cke_skin_kama .cke_ltr .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px;}.cke_skin_kama .cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px;}.cke_skin_kama a.cke_dialog_ui_button{border-collapse:separate;cursor:default;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent url(images/sprites.png) repeat-x scroll 0 -1069px;_background:none;padding:5px 0;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button{padding:0;}.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button span{width:70px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span{width:100px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button span{padding:5px 15px;text-align:center;color:#3b3b1f;background:#53D9F0 none;display:inline-block;cursor:default;}.cke_skin_kama .cke_browser_webkit a.cke_dialog_ui_button span.cke_dialog_ui_button{margin:0;}.cke_skin_kama .cke_browser_webkit a.cke_dialog_ui_button{display:inline-block;padding-top:3px;padding-bottom:2px;margin:2px 0;}.cke_skin_kama a.cke_dialog_ui_button_ok span,.cke_skin_kama a.cke_dialog_ui_button_cancel span{padding-right:20px;padding-left:20px;}.cke_skin_kama a.cke_dialog_ui_button_ok{background-position:0 -1143px;}.cke_skin_kama a.cke_dialog_ui_button_ok span{background:transparent url(images/sprites.png) no-repeat scroll right -1219px;}.cke_skin_kama .cke_rtl a.cke_dialog_ui_button_ok span{background-position:left -1219px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_ok span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_ok span{background-color:#B8E834;margin-right:0;}.cke_skin_kama a.cke_dialog_ui_button_cancel{background-position:0 -1104px;}.cke_skin_kama a.cke_dialog_ui_button_cancel span{background:transparent url(images/sprites.png) no-repeat scroll right -1245px;}.cke_skin_kama .cke_rtl a.cke_dialog_ui_button_cancel span{background-position:left -1245px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_cancel span{background-color:#F65D20;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_ok span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_ok span{background-image:none;}
    +.cke_skin_kama span.cke_dialog_ui_button{padding:2px 10px;text-align:center;color:#222;display:inline-block;cursor:default;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{display:block;}.cke_skin_kama a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3;}.cke_skin_kama a:hover.cke_dialog_ui_button,.cke_skin_kama a:focus.cke_dialog_ui_button,.cke_skin_kama a:active.cke_dialog_ui_button{background-position:0 -1179px;color:#000;}.cke_skin_kama .cke_browser_iequirks a:hover.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a:focus.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a:active.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:hover.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:focus.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:active.cke_dialog_ui_button span{background-image:none;background:#F7A922;}.cke_skin_kama .cke_dialog_footer_buttons{display:inline-table;margin-right:12px;margin-left:12px;width:auto;position:relative;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons{display:inline;}.cke_skin_kama .cke_dialog_footer_buttons span.cke_dialog_ui_button{margin:7px 0;width:60px;text-align:center;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons a.cke_dialog_ui_button{display:block;padding:0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{padding-bottom:5px;padding-top:6px;margin-bottom:0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons .cke_dialog_ui_button_ok .cke_dialog_ui_button{background-position:right -1214px;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons .cke_dialog_ui_button_cancel .cke_dialog_ui_button{background-position:right -1242px;}.cke_skin_kama strong{font-weight:bold;}.cke_skin_kama .cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:0 -1022px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;_background-image:url(images/sprites_ie6.png);}.cke_skin_kama .cke_dialog_close_button span{display:none;}.cke_skin_kama .cke_dialog_close_button:hover{background-position:0 -1045px;}.cke_skin_kama .cke_ltr .cke_dialog_close_button{right:10px;}.cke_skin_kama .cke_browser_ie8.cke_rtl .cke_dialog_close_button{left:8px;}.cke_skin_kama .cke_rtl .cke_dialog_close_button{left:10px;}.cke_skin_kama .cke_browser_ie7.cke_rtl .cke_dialog_close_button{left:16px;top:0;}.cke_skin_kama .cke_browser_ie7.cke_rtl .cke_dialog_close_button{position:absolute;left:10px;top:5px;}.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_footer{margin-top:22px;}.cke_skin_kama .cke_browser_ie6 .cke_dialog_close_button,.cke_skin_kama .cke_browser_iequirks .cke_dialog_close_button{top:7px;}.cke_skin_kama .cke_browser_ie7.cke_ltr .cke_dialog_close_button{margin-top:0;}.cke_skin_kama .cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white;}.cke_skin_kama iframe.cke_dialog_ui_input_file{width:100%;height:25px;}.cke_skin_kama .cke_dialog .cke_dark_background{background-color:#eaead1;}.cke_skin_kama .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_kama .cke_dialog .cke_centered{text-align:center;}.cke_skin_kama .cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px;}.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_reset{float:left;}.cke_skin_kama .cke_dialog a.cke_btn_locked,.cke_skin_kama .cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px;}.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_locked,.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_unlocked{float:right;}.cke_skin_kama .cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif);}.cke_skin_kama .cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer;cursor:hand;}
    +.cke_skin_kama .cke_dialog #ImagePreviewBox{white-space:normal;border:2px ridge black;overflow:scroll;height:160px;width:230px;padding:2px;background-color:white;}.cke_skin_kama .cke_dialog #ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4;}.cke_skin_kama .cke_dialog #FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white;}.cke_skin_kama .cke_dialog .cke_dark_background{text-align:center;background-color:#eaead1;font-size:14px;}.cke_skin_kama .cke_dialog .cke_light_background{text-align:center;background-color:#ffffbe;}.cke_skin_kama .cke_dialog .cke_hand{cursor:pointer;cursor:hand;}.cke_skin_kama .cke_disabled,.cke_skin_kama .cke_disabled label{color:#a0a0a0;}.cke_skin_kama .cke_hc .cke_dialog_title,.cke_skin_kama .cke_hc .cke_dialog_tabs,.cke_skin_kama .cke_hc .cke_dialog_contents,.cke_skin_kama .cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_title{border-top:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_footer{border-bottom:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;cursor:hand;font-weight:bold;position:relative;top:3px;}.cke_skin_kama .cke_hc a.cke_btn_locked,.cke_skin_kama .cke_hc a.cke_btn_unlocked,.cke_skin_kama .cke_hc a.cke_btn_reset{border-style:solid;}.cke_skin_kama a.cke_smile img{border:2px solid #eaead1;}.cke_skin_kama a.cke_smile:focus img,.cke_skin_kama a.cke_smile:active img,.cke_skin_kama a.cke_smile:hover img{border-color:#C7C78F;}.ckfinder_loader_32{background:url("images/loaders/32x32.gif") 50% 50% no-repeat;}.cke_skin_kama .cke_dialog_file_exist_options table{margin-bottom:10px;}.cke_skin_kama .cke_dialog_remember_decision td{padding:10px;}.cke_skin_kama .cke_dialog_error_msg strong{color:red;border:1px solid #FFF;padding:10px;margin-bottom:20px;display:block;}.cke_skin_kama .cke_files_list{padding:10px 10% 0;line-height:1.2em;}.cke_skin_kama .cke_files_list_many{height:5em;overflow:auto;}.cke_skin_kama .cke_dialog_file_exist_options .cke_dialog_ui_labeled_label{margin-bottom:10px;}.cke_skin_kama .cke_browser_opera .cke_editor.cke_skin_kama .cke_resizer{display:table;}.cke_skin_kama .cke_resizer{width:12px;height:12px;margin-top:9px;display:block;float:right;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1428px;background-repeat:no-repeat;cursor:se-resize;}.cke_skin_kama .cke_browser_air .cke_resizer,.cke_skin_kama .cke_browser_air .cke_rtl .cke_resizer{cursor:move;}.cke_skin_kama .cke_rtl .cke_resizer{cursor:sw-resize;background-position:0 -1455px;float:left;}.cke_skin_kama .cke_resizer_horizontal,.cke_skin_kama .cke_rtl .cke_resizer_horizontal{cursor:e-resize;}.cke_skin_kama .cke_resizer_vertical,.cke_skin_kama .cke_rtl .cke_resizer_vertical{cursor:n-resize;}.cke_skin_kama .cke_maximized .cke_resizer{display:none;}.cke_skin_kama .cke_dialog label{display:inline;margin-bottom:auto;cursor:default;}.cke_skin_kama .cke_dialog_remember_decision td{padding:5px 0;}body{font-size:8pt;}.no_list,.no_list li{list-style-type:none;margin:0;}.view h2{padding:.3em .5em;font-size:2em;_zoom:1;}.dragged_source{filter:alpha(opacity=50);opacity:.50;}#dragged_container{filter:alpha(opacity=75);opacity:.75;z-index:999;}.drag_multiple div{background-position:top center;background-repeat:no-repeat;text-align:center;width:32px;height:40px;padding-top:32px;}body.dragging a,body.dragging a:hover,body.dragging a:active,body.dragging a:visited{color:inherit!important;text-decoration:none;cursor:default!important;}body.dragging .drop_target,body.dragging .drop_target a{cursor:pointer!important;}body.dragging .cke_skin_kama .cke_button a.cke_off:hover,body.dragging .cke_skin_kama .cke_button a:hover,body.dragging .cke_skin_kama .cke_button a:active{background-color:inherit!important;filter:alpha(opacity=70);opacity:.70;}body.during_sidebar_resize *{cursor:e-resize!important;}
    +body.during_sidebar_resize .browser_webkit *{-webkit-user-select:none;}#sidebar_wrapper,#sidebar_container{_position:relative;}#sidebar_container{cursor:e-resize;}#sidebar_wrapper{cursor:default;}#folders_view{overflow:auto;overflow-x:hidden;position:relative;}#folders_view .folder_tree_wrapper{position:relative;z-index:1;}#folders_view .folder_tree{padding-bottom:5px;position:relative;z-index:2;}#folders_view .folder_tree ul{margin:0;padding-left:15px;}.cke_rtl #folders_view .folder_tree ul{padding-right:15px;padding-left:0;}#folders_view .folder_tree li{white-space:nowrap;}#folders_view .folder_tree li.drop_target ul a{color:inherit;}#folders_view .folder_tree li.loading{padding-left:23px;font-style:italic;}#folders_view .folder_tree li.openable ul{display:none;}#folders_view .folder_tree li a{display:inline-block;padding:0;margin:0;height:14px;padding-left:23px;padding-bottom:3px;}.cke_rtl #folders_view .folder_tree li a{padding-right:23px;padding-left:0;}#folders_view .folder_tree li .expander{float:left;_zoom:1;_float:none;height:16px;width:16px;background:0 2px no-repeat;}.cke_rtl #folders_view .folder_tree li .expander{float:right;}#folders_view .folder_tree li.nochildren .expander{background-image:none;}#folders_view .folder_tree li.nochildren ul{display:none;}#folders_view .folder_tree_wrapper .selection{position:absolute;left:0;width:100%;display:none;margin-top:-2px;padding-top:2px;}.cke_rtl #folders_view .folder_tree_wrapper .selection{right:0;}#folders_view .folder_tree li.drop_target a{font-weight:bold!important;text-decoration:none!important;}#folders_view .folder_tree li.drop_target ul a{font-weight:inherit!important;cursor:default!important;}#folders_view .folder_tree a.processing{filter:alpha(opacity=50);opacity:.50;}#folders_view .folder_tree .dropdown{padding-left:5px;padding-right:5px;display:none;}#folders_view .selected ul .dropdown{display:none;}#folders_view .selected .dropdown{display:inline;}#sidebar_container .tool_panel ul li img{vertical-align:middle;margin-right:.3em;}.cke_rtl #sidebar_container .tool_panel ul li img{margin-right:0;margin-left:.3em;}#sidebar_container .tool_panel ul{padding-left:.5em;padding-right:.5em;}#sidebar_container .tool_panel p{margin:0 1em .5em 1em;}#sidebar_container .tool,#sidebar_container .tool *{overflow:auto;}#toolbar_view{float:left;width:100%;border-bottom:1px solid;}.cke_rtl #toolbar_view{float:right;}#toolbar_view .cke_button .cke_label{display:inline;}#toolbar_view .cke_toolgroup{margin-bottom:0;}#panel_view{clear:left;position:relative;}.cke_rtl #panel_view{clear:right;}#panel_view .panel_widget form{text-align:center;}#panel_view .panel_widget h2{text-align:left;}#panel_view .panel_widget table{width:auto;margin:0 auto 1em;text-align:left;}.cke_rtl #panel_view .panel_widget h2,.cke_rtl #panel_view .panel_widget table{text-align:right;}#panel_view .panel_widget dl{padding:5px;margin:0;white-space:nowrap;}#panel_view .panel_widget dd{margin:0;}#panel_view .panel_widget dd input{vertical-align:middle;}#panel_view .panel_widget .buttons{width:100%;text-align:right;}.cke_rtl #panel_view .panel_widget .buttons{text-align:left;}#panel_view .panel_widget .buttons input{margin:.5em;}#panel_view .panel_widget{border:1px solid;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;}.ckf_progress_bar_container{margin:4px 0;border:1px solid #333;background:#F3F3F3;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.ckf_progress_bar_container div{height:4px;background:#19A6FF;width:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.ckf_upload_info{margin:2px;padding:3px 8px;background-color:#e5e5e5;overflow:hidden;}#ckf_globalUploads{background:white;}.ckf_progress_wrapper{float:left;width:100%;}.ckf_progress_info{padding:4px 0;margin-right:130px;}.ckf_uploadButtons{text-align:center;width:120px;float:left;margin-left:-120px;}.cke_rtl .ckf_progress_wrapper{float:right;width:100%;}.cke_rtl .ckf_progress_info{margin-right:0;margin-left:130px;}.cke_rtl .ckf_uploadButtons{float:right;margin-left:0;margin-right:-120px;}.ckf_status{font-weight:bold;}
    +.ckf_speed{display:none;}#ckf_fileInput{visibility:hidden;width:0;height:0;margin:0;}.ckf_FileError .ckf_outcome{color:red;}#ckf_upload_form{max-height:230px;}#files_view{clear:left;height:auto;overflow:auto;_width:99.9%;overflow-x:hidden;border:1px solid transparent;}.cke_rtl #files_view{clear:right;}#files_view .message_content{display:none;}#files_view.files_message .message_content{display:block;}#files_view .message_content{float:left;margin:1em;padding:1em;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;}.cke_rtl #files_view .message_content{float:right;}#files_view .files_thumbnails{height:auto;clear:left;}.cke_rtl #files_view .files_thumbnails{clear:right;}#files_view.files_thumbnails table.files_details{display:none;}#files_view.files_details .files_thumbnails{display:none;}#files_view .files_thumbnails .file_entry,#dragged_container.file_entry{float:left;border:1px solid;margin:5px;padding:5px;overflow:hidden;text-align:center;}.cke_rtl #files_view .files_thumbnails .file_entry,.cke_rtl #dragged_container.file_entry{float:right;}#files_view .files_thumbnails .file_entry h5,#dragged_container.file_entry h5{display:block;font-weight:normal;overflow:hidden;white-space:nowrap;}#files_view .files_thumbnails .file_entry .image div,#dragged_container.file_entry .image div,#files_view .files_thumbnails .processing .image{margin:auto;overflow:hidden;background:50% 50% no-repeat;}#files_view .files_thumbnails .processing .image div{display:none;}#files_view .files_thumbnails .file_entry .details span,#dragged_container.file_entry .details span{display:block;}#files_view .files_thumbnails .extra,#dragged_container.file_entry .extra{height:1.3em;overflow:hidden;}.files_thumbnails .dropdown{position:absolute;top:0;left:0;padding:2px 20px 20px 3px;}.cke_rtl .files_thumbnails .dropdown{right:0;padding:2px 3px 20px 20px;}.files_details .dropdown{padding:.3em 5px;}#dragged_container .dropdown{display:none;}#files_view .files_thumbnails .file_entry{position:relative;}.browser_ie6 .files_thumbnails .dropdown,.browser_ie7 .files_thumbnails .dropdown{position:static;display:block;width:100%;padding:0;text-align:left;cursor:hand;}.browser_ie6 .cke_rtl .files_thumbnails .dropdown,.browser_ie7 .cke_rtl .files_thumbnails .dropdown{text-align:right;}.browser_ie6 #files_view .files_thumbnails .file_entry,.browser_ie7 #files_view .files_thumbnails .file_entry{position:static;}#files_view .files_details{width:100%;clear:left;}.cke_rtl #files_view .files_details{clear:right;}#files_view .files_details thead td{text-align:center;font-weight:bold;}#files_view .files_details td.image img{vertical-align:middle;}#files_view .files_details td.name{width:100%;}#files_view .files_details td{vertical-align:middle;padding:.3em .5em;white-space:nowrap;border:1px solid;}#files_view .files_details td.extra{text-align:right;padding-right:2em;}.cke_rtl #files_view .files_details td.extra{padding-right:0;padding-left:2em;}#files_view .files_details td.last{padding-right:1em;border-right:0;}.cke_rtl #files_view .files_details td.last{padding-right:0;padding-left:1em;}#status_view p{padding:5px;margin:0;vertical-align:middle;}#ckfinder{color:black;position:absolute;top:7px;left:7px;bottom:7px;right:7px;overflow:hidden;width:auto;height:auto;_height:100%;}.browser_ie7 .fake_wrapper{position:absolute;top:0;bottom:0;}#main_container .view{margin-bottom:7px;}#main_container #status_view{margin-bottom:0;}#sidebar_container .tool_panel,#sidebar_container .tool{margin-top:7px;}.cke_ltr #sidebar_container{border-right-width:7px;}.cke_rtl #sidebar_container{border-left-width:7px;}.browser_ie6 #toolbar_view{zoom:1;}#panel_view{_zoom:1;}#status_view{height:2.5em;}body{background:url("images/sprites.png") 0 -1950px repeat-x;_background-image:none;}#sidebar_container .view{border:1px solid;}#sidebar_container{border-style:solid;}.browser_ie6 #toolbar_view{padding-bottom:5px;}#panel_view .submit{-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;-webkit-border-bottom-left-radius:5px;}.view{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:white;}
    +#status_view{_clear:both;}#toolbar_view .cke_toolbox{padding:0;}body{background-color:#D3D3D3;}#files_view .files_thumbnails .file_entry,#dragged_container.file_entry{background:white;border-color:#D3D3D3;}.view h2{color:black;}#sidebar_container{border-color:transparent;_border-color:#D3D3D3;}#panel_view .panel_widget .buttons_wrapper{background-color:#D3D3D3;-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0 0 5px 5px;}#panel_view .panel_widget .buttons{background-color:#E0E0E0;-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0 0 5px 5px;}#folders_view .folder_tree li a,#folders_view .folder_tree li a:hover,#folders_view .folder_tree li a:active,#folders_view .folder_tree li a:visited,#files_view .files_thumbnails a.file_entry,#files_view .files_thumbnails a.file_entry:hover,#files_view .files_thumbnails a.file_entry:active,#files_view .files_thumbnails a.file_entry:visited{color:black;text-decoration:none;}#folders_view .folder_tree li a:hover,#folders_view .folder_tree li a:focus,#folders_view .folder_tree li a:active{color:blue;text-decoration:underline;}#status_view{background-color:#E0E0E0;}#toolbar_view{border:none;background:transparent;}.view{background-color:white;}#sidebar_container .view{border-color:#D3D3D3;}#files_view{background:#E0E0E0;_border-color:#D3D3D3;}#files_view .files_thumbnails .file_entry:hover{background-color:#DFF1FF;border-color:#9CF;}#files_view .files_thumbnails .file_entry.selected{background-color:#b4d9ff;border-color:#6565fe;_background-color:#b4d9ff!important;_border-color:#6565fe!important;}.dropdown{color:#666;background:none!important;text-decoration:none;}body.dragging #files_view .file_entry{background:white!important;border-color:#D3D3D3!important;}body.dragging #files_view .dragged_source{background-color:#b4d9ff!important;border-color:#6565fe!important;}#files_view .files_details tbody tr:hover,#files_view .files_details tbody tr:hover td,#files_view .files_details tbody tr.hover td,#files_view .files_details tbody tr:hover td.name,#files_view .files_details tbody tr.hover td.name{background-color:#DFF1FF;}#files_view .files_details tr.selected,#files_view .files_details tr.selected td{background-color:#b4d9ff;}#folders_view .folder_tree_wrapper .selection{background-color:antiquewhite;}#files_view .files_details td.name{background-color:white;}#files_view .files_details td{border-color:#D3D3D3;}#files_view .message_content{background-color:#b4d9ff;}.focus_inside{border-color:#5cacfd!important;}#panel_view .panel_widget{border:0;}#panel_view .show_border{border:1px solid #D3D3D3;}.drag_multiple div span{font-weight:bold;color:red;}
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/host.css b/src/main/webapp/plug-in/ckfinder/skins/kama/host.css
    new file mode 100644
    index 00000000..ab937908
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/skins/kama/host.css
    @@ -0,0 +1,9 @@
    +/*
    +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    +*/
    +
    +.cke_compatibility a,.cke_compatibility a:hover,.cke_compatibility a:active,.cke_compatibility a:visited{color:black;text-decoration:none;}.cke_compatibility,.cke_compatibility td,.cke_compatibility td *{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;line-height:1;border:0;}.cke_compatibility tbody{border:0;}.cke_compatibility .cke_accessibility{display:none;}.cke_compatibility table{width:auto;}.cke_compatibility{background-color:#FFF;}.cke_compatibility *{color:black;height:auto;border-collapse:collapse;padding:0;margin:0;vertical-align:baseline;white-space:nowrap;}.cke_compatibility pre,.cke_compatibility textarea{white-space:pre;}.cke_compatibility code,.cke_compatibility font{white-space:normal;}body .cke_dialog{visibility:visible;background-color:#fff;}.cke_skin_kama table.cke_dialog.cke_browser_gecko{display:block;}.cke_skin_kama .cke_dialog_body{z-index:1;border:solid 1px #ddd;padding:5px;background-color:#fff;position:relative;_position:static;}.cke_skin_kama .cke_dialog_tl,.cke_skin_kama .cke_dialog_tr,.cke_skin_kama .cke_dialog_tc,.cke_skin_kama .cke_dialog_bl,.cke_skin_kama .cke_dialog_br,.cke_skin_kama .cke_dialog_bc,.cke_skin_kama .cke_dialog_ml,.cke_skin_kama .cke_dialog_mr{display:none;}.cke_skin_kama .cke_dialog_title{font-weight:bold;font-size:14px;padding:3px 3px 8px;cursor:move;position:relative;border-bottom:1px solid #eee;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_title,.cke_skin_kama .cke_browser_ie6 .cke_dialog_title,.cke_skin_kama .cke_browser_ie7 .cke_dialog_title{margin-bottom:22px;}.cke_skin_kama .cke_browser_iequirks.cke_single_page .cke_dialog_title,.cke_skin_kama .cke_browser_ie6.cke_single_page .cke_dialog_title,.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_title{margin-bottom:10px;}.cke_skin_kama .cke_dialog_contents{background-color:#ebebeb;border:solid 1px #fff;border-bottom:none;overflow:auto;padding:17px 10px 5px 10px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;border-top-left-radius:5px;border-top-right-radius:5px;margin-top:22px;}.cke_skin_kama .cke_dialog_footer{text-align:right;background-color:#ebebeb;border:solid 1px #fff;border-bottom:none;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;}.cke_skin_kama .cke_rtl .cke_dialog_footer{text-align:left;}.cke_skin_kama .cke_dialog_page_contents{position:relative;}.cke_skin_kama .cke_dialog_footer .cke_resizer{margin-top:20px;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_footer .cke_resizer,.cke_skin_kama .cke_browser_ie6 .cke_dialog_footer .cke_resizer{margin-top:27px;}.cke_skin_kama .cke_dialog_tabs{height:23px;display:inline-block;_display:block;margin-left:10px;margin-right:10px;margin-top:11px;position:absolute;z-index:2;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_tabs,.cke_skin_kama .cke_browser_ie6 .cke_dialog_tabs,.cke_skin_kama .cke_browser_ie7 .cke_dialog_tabs{top:33px;}.cke_skin_kama .cke_rtl .cke_dialog_tabs{right:10px;}.cke_skin_kama a.cke_dialog_tab,.cke_skin_kama a:link.cke_dialog_tab,.cke_skin_kama a:active.cke_dialog_tab,.cke_skin_kama a:hover.cke_dialog_tab,.cke_skin_kama a:visited.cke_dialog_tab{background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1323px;background-color:#ebebeb;height:14px;padding:4px 8px;display:inline-block;cursor:pointer;}.cke_skin_kama .cke_browser_gecko18 a.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:link.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:active.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:hover.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:visited.cke_dialog_tab{display:inline;position:relative;top:6px;}.cke_skin_kama a:hover.cke_dialog_tab{background-color:#f1f1e3;}.cke_skin_kama a.cke_dialog_tab_selected,.cke_skin_kama a:link.cke_dialog_tab_selected,.cke_skin_kama a:active.cke_dialog_tab_selected,.cke_skin_kama a:hover.cke_dialog_tab_selected,.cke_skin_kama a:visited.cke_dialog_tab_selected{background-position:0 -1279px;cursor:default;}
    +.cke_skin_kama .cke_single_page .cke_dialog_tabs{display:none;}.cke_skin_kama .cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:10px;}.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_contents,.cke_skin_kama .cke_browser_ie7Compat.cke_single_page .cke_dialog_contents{margin-top:-10px;position:relative;margin-bottom:-22px;}.cke_skin_kama .cke_dialog_ui_vbox table,.cke_skin_kama .cke_dialog_ui_hbox table{margin:auto;}.cke_skin_kama .cke_dialog_ui_vbox_child{padding:5px 0;}.cke_skin_kama input.cke_dialog_ui_input_text,.cke_skin_kama input.cke_dialog_ui_input_password{background-color:white;border:none;padding:0;width:100%;height:1.4em;line-height:1.4em;}.cke_skin_kama div.cke_dialog_ui_input_text,.cke_skin_kama div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_kama textarea.cke_dialog_ui_input_textarea{background-color:white;border:none;padding:0;width:100%;_width:99%;overflow:auto;resize:none;}.cke_skin_kama div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_kama div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default;}.cke_skin_kama .cke_dialog_ui_hbox{width:100%;}.cke_skin_kama .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_dialog_ui_hbox_child,.cke_skin_kama .cke_dialog_ui_hbox_last{vertical-align:top;}.cke_skin_kama .cke_ltr .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px;}.cke_skin_kama .cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px;}.cke_skin_kama a.cke_dialog_ui_button{border-collapse:separate;cursor:default;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent url(images/sprites.png) repeat-x scroll 0 -1069px;_background:none;padding:5px 0;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button{padding:0;}.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button span{width:70px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span{width:100px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button span{padding:5px 15px;text-align:center;color:#3b3b1f;background:#53D9F0 none;display:inline-block;cursor:default;}.cke_skin_kama .cke_browser_webkit a.cke_dialog_ui_button span.cke_dialog_ui_button{margin:0;}.cke_skin_kama .cke_browser_webkit a.cke_dialog_ui_button{display:inline-block;padding-top:3px;padding-bottom:2px;margin:2px 0;}.cke_skin_kama a.cke_dialog_ui_button_ok span,.cke_skin_kama a.cke_dialog_ui_button_cancel span{padding-right:20px;padding-left:20px;}.cke_skin_kama a.cke_dialog_ui_button_ok{background-position:0 -1143px;}.cke_skin_kama a.cke_dialog_ui_button_ok span{background:transparent url(images/sprites.png) no-repeat scroll right -1219px;}.cke_skin_kama .cke_rtl a.cke_dialog_ui_button_ok span{background-position:left -1219px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_ok span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_ok span{background-color:#B8E834;margin-right:0;}.cke_skin_kama a.cke_dialog_ui_button_cancel{background-position:0 -1104px;}.cke_skin_kama a.cke_dialog_ui_button_cancel span{background:transparent url(images/sprites.png) no-repeat scroll right -1245px;}.cke_skin_kama .cke_rtl a.cke_dialog_ui_button_cancel span{background-position:left -1245px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_cancel span{background-color:#F65D20;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_ok span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_ok span{background-image:none;}.cke_skin_kama span.cke_dialog_ui_button{padding:2px 10px;text-align:center;color:#222;display:inline-block;cursor:default;}
    +.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{display:block;}.cke_skin_kama a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3;}.cke_skin_kama a:hover.cke_dialog_ui_button,.cke_skin_kama a:focus.cke_dialog_ui_button,.cke_skin_kama a:active.cke_dialog_ui_button{background-position:0 -1179px;color:#000;}.cke_skin_kama .cke_browser_iequirks a:hover.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a:focus.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a:active.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:hover.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:focus.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:active.cke_dialog_ui_button span{background-image:none;background:#F7A922;}.cke_skin_kama .cke_dialog_footer_buttons{display:inline-table;margin-right:12px;margin-left:12px;width:auto;position:relative;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons{display:inline;}.cke_skin_kama .cke_dialog_footer_buttons span.cke_dialog_ui_button{margin:7px 0;width:60px;text-align:center;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons a.cke_dialog_ui_button{display:block;padding:0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{padding-bottom:5px;padding-top:6px;margin-bottom:0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons .cke_dialog_ui_button_ok .cke_dialog_ui_button{background-position:right -1214px;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons .cke_dialog_ui_button_cancel .cke_dialog_ui_button{background-position:right -1242px;}.cke_skin_kama strong{font-weight:bold;}.cke_skin_kama .cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:0 -1022px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;_background-image:url(images/sprites_ie6.png);}.cke_skin_kama .cke_dialog_close_button span{display:none;}.cke_skin_kama .cke_dialog_close_button:hover{background-position:0 -1045px;}.cke_skin_kama .cke_ltr .cke_dialog_close_button{right:10px;}.cke_skin_kama .cke_browser_ie8.cke_rtl .cke_dialog_close_button{left:8px;}.cke_skin_kama .cke_rtl .cke_dialog_close_button{left:10px;}.cke_skin_kama .cke_browser_ie7.cke_rtl .cke_dialog_close_button{left:16px;top:0;}.cke_skin_kama .cke_browser_ie7.cke_rtl .cke_dialog_close_button{position:absolute;left:10px;top:5px;}.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_footer{margin-top:22px;}.cke_skin_kama .cke_browser_ie6 .cke_dialog_close_button,.cke_skin_kama .cke_browser_iequirks .cke_dialog_close_button{top:7px;}.cke_skin_kama .cke_browser_ie7.cke_ltr .cke_dialog_close_button{margin-top:0;}.cke_skin_kama .cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white;}.cke_skin_kama iframe.cke_dialog_ui_input_file{width:100%;height:25px;}.cke_skin_kama .cke_dialog .cke_dark_background{background-color:#eaead1;}.cke_skin_kama .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_kama .cke_dialog .cke_centered{text-align:center;}.cke_skin_kama .cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px;}.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_reset{float:left;}.cke_skin_kama .cke_dialog a.cke_btn_locked,.cke_skin_kama .cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px;}.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_locked,.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_unlocked{float:right;}.cke_skin_kama .cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif);}.cke_skin_kama .cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer;cursor:hand;}.cke_skin_kama .cke_dialog #ImagePreviewBox{white-space:normal;border:2px ridge black;overflow:scroll;height:160px;width:230px;padding:2px;background-color:white;}
    +.cke_skin_kama .cke_dialog #ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4;}.cke_skin_kama .cke_dialog #FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white;}.cke_skin_kama .cke_dialog .cke_dark_background{text-align:center;background-color:#eaead1;font-size:14px;}.cke_skin_kama .cke_dialog .cke_light_background{text-align:center;background-color:#ffffbe;}.cke_skin_kama .cke_dialog .cke_hand{cursor:pointer;cursor:hand;}.cke_skin_kama .cke_disabled,.cke_skin_kama .cke_disabled label{color:#a0a0a0;}.cke_skin_kama .cke_hc .cke_dialog_title,.cke_skin_kama .cke_hc .cke_dialog_tabs,.cke_skin_kama .cke_hc .cke_dialog_contents,.cke_skin_kama .cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_title{border-top:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_footer{border-bottom:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;cursor:hand;font-weight:bold;position:relative;top:3px;}.cke_skin_kama .cke_hc a.cke_btn_locked,.cke_skin_kama .cke_hc a.cke_btn_unlocked,.cke_skin_kama .cke_hc a.cke_btn_reset{border-style:solid;}.cke_skin_kama a.cke_smile img{border:2px solid #eaead1;}.cke_skin_kama a.cke_smile:focus img,.cke_skin_kama a.cke_smile:active img,.cke_skin_kama a.cke_smile:hover img{border-color:#C7C78F;}.ckfinder_loader_32{background:url("images/loaders/32x32.gif") 50% 50% no-repeat;}.cke_skin_kama .cke_dialog_file_exist_options table{margin-bottom:10px;}.cke_skin_kama .cke_dialog_remember_decision td{padding:10px;}.cke_skin_kama .cke_dialog_error_msg strong{color:red;border:1px solid #FFF;padding:10px;margin-bottom:20px;display:block;}.cke_skin_kama .cke_files_list{padding:10px 10% 0;line-height:1.2em;}.cke_skin_kama .cke_files_list_many{height:5em;overflow:auto;}.cke_skin_kama .cke_dialog_file_exist_options .cke_dialog_ui_labeled_label{margin-bottom:10px;}.cke_skin_kama .cke_browser_opera .cke_editor.cke_skin_kama .cke_resizer{display:table;}.cke_skin_kama .cke_resizer{width:12px;height:12px;margin-top:9px;display:block;float:right;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1428px;background-repeat:no-repeat;cursor:se-resize;}.cke_skin_kama .cke_browser_air .cke_resizer,.cke_skin_kama .cke_browser_air .cke_rtl .cke_resizer{cursor:move;}.cke_skin_kama .cke_rtl .cke_resizer{cursor:sw-resize;background-position:0 -1455px;float:left;}.cke_skin_kama .cke_resizer_horizontal,.cke_skin_kama .cke_rtl .cke_resizer_horizontal{cursor:e-resize;}.cke_skin_kama .cke_resizer_vertical,.cke_skin_kama .cke_rtl .cke_resizer_vertical{cursor:n-resize;}.cke_skin_kama .cke_maximized .cke_resizer{display:none;}.cke_skin_kama .cke_dialog label{display:inline;margin-bottom:auto;cursor:default;}.cke_skin_kama .cke_dialog_remember_decision td{padding:5px 0;}
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckffolder.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckffolder.gif
    new file mode 100644
    index 00000000..f901c6af
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckffolder.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckffolderopened.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckffolderopened.gif
    new file mode 100644
    index 00000000..b0c72428
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckffolderopened.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckfminus.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckfminus.gif
    new file mode 100644
    index 00000000..30f3ec65
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckfminus.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckfnothumb.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckfnothumb.gif
    new file mode 100644
    index 00000000..adc127e7
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckfnothumb.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckfplus.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckfplus.gif
    new file mode 100644
    index 00000000..0250b1f0
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/ckfplus.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons.png b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons.png
    new file mode 100644
    index 00000000..a713b4e4
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/ai.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/ai.gif
    new file mode 100644
    index 00000000..ba5a9131
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/ai.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/avi.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/avi.gif
    new file mode 100644
    index 00000000..6f3bac9b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/avi.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/bmp.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/bmp.gif
    new file mode 100644
    index 00000000..7708dd89
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/bmp.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/cs.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/cs.gif
    new file mode 100644
    index 00000000..4d927230
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/cs.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/default.icon.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/default.icon.gif
    new file mode 100644
    index 00000000..6ce26a4d
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/default.icon.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/dll.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/dll.gif
    new file mode 100644
    index 00000000..48d445ac
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/dll.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/doc.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/doc.gif
    new file mode 100644
    index 00000000..6535b4c0
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/doc.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/docx.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/docx.gif
    new file mode 100644
    index 00000000..6535b4c0
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/docx.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/exe.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/exe.gif
    new file mode 100644
    index 00000000..315817f5
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/exe.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/fla.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/fla.gif
    new file mode 100644
    index 00000000..8f91a98e
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/fla.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/gif.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/gif.gif
    new file mode 100644
    index 00000000..a5e3e6cf
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/gif.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/jpg.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/jpg.gif
    new file mode 100644
    index 00000000..634b3861
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/jpg.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/js.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/js.gif
    new file mode 100644
    index 00000000..4ea17d45
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/js.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/mdb.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/mdb.gif
    new file mode 100644
    index 00000000..0d7c1021
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/mdb.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/mp3.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/mp3.gif
    new file mode 100644
    index 00000000..6f3bac9b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/mp3.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/ogg.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/ogg.gif
    new file mode 100644
    index 00000000..c8ba2622
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/ogg.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/pdf.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/pdf.gif
    new file mode 100644
    index 00000000..ca1f94ac
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/pdf.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/ppt.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/ppt.gif
    new file mode 100644
    index 00000000..877a8c86
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/ppt.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/pptx.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/pptx.gif
    new file mode 100644
    index 00000000..877a8c86
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/pptx.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/rdp.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/rdp.gif
    new file mode 100644
    index 00000000..916cd7e6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/rdp.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/swf.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/swf.gif
    new file mode 100644
    index 00000000..314469da
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/swf.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/swt.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/swt.gif
    new file mode 100644
    index 00000000..314469da
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/swt.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/txt.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/txt.gif
    new file mode 100644
    index 00000000..1511ba3e
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/txt.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/vsd.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/vsd.gif
    new file mode 100644
    index 00000000..9be3daae
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/vsd.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/xls.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/xls.gif
    new file mode 100644
    index 00000000..f57715d6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/xls.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/xlsx.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/xlsx.gif
    new file mode 100644
    index 00000000..f57715d6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/xlsx.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/xml.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/xml.gif
    new file mode 100644
    index 00000000..45599287
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/xml.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/zip.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/zip.gif
    new file mode 100644
    index 00000000..b1e24921
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/16/zip.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/ai.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/ai.gif
    new file mode 100644
    index 00000000..699e6a38
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/ai.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/avi.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/avi.gif
    new file mode 100644
    index 00000000..97025bb6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/avi.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/bmp.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/bmp.gif
    new file mode 100644
    index 00000000..f3c7f82a
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/bmp.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/cs.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/cs.gif
    new file mode 100644
    index 00000000..b62bd026
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/cs.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/default.icon.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/default.icon.gif
    new file mode 100644
    index 00000000..976997b1
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/default.icon.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/dll.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/dll.gif
    new file mode 100644
    index 00000000..9b549645
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/dll.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/doc.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/doc.gif
    new file mode 100644
    index 00000000..b557568b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/doc.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/docx.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/docx.gif
    new file mode 100644
    index 00000000..b557568b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/docx.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/exe.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/exe.gif
    new file mode 100644
    index 00000000..75849939
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/exe.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/fla.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/fla.gif
    new file mode 100644
    index 00000000..923079fc
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/fla.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/gif.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/gif.gif
    new file mode 100644
    index 00000000..df5f5795
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/gif.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/jpg.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/jpg.gif
    new file mode 100644
    index 00000000..de78363f
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/jpg.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/js.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/js.gif
    new file mode 100644
    index 00000000..fe0c98e9
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/js.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/mdb.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/mdb.gif
    new file mode 100644
    index 00000000..d3af9e87
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/mdb.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/mp3.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/mp3.gif
    new file mode 100644
    index 00000000..7d6360f2
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/mp3.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/ogg.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/ogg.gif
    new file mode 100644
    index 00000000..b87e3e73
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/ogg.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/ogg.png b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/ogg.png
    new file mode 100644
    index 00000000..26b7b680
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/ogg.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/pdf.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/pdf.gif
    new file mode 100644
    index 00000000..4950ec87
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/pdf.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/ppt.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/ppt.gif
    new file mode 100644
    index 00000000..023431c1
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/ppt.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/pptx.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/pptx.gif
    new file mode 100644
    index 00000000..023431c1
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/pptx.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/rdp.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/rdp.gif
    new file mode 100644
    index 00000000..b9eace7e
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/rdp.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/swf.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/swf.gif
    new file mode 100644
    index 00000000..5df7de57
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/swf.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/swt.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/swt.gif
    new file mode 100644
    index 00000000..7807c075
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/swt.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/txt.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/txt.gif
    new file mode 100644
    index 00000000..4e2c2e3c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/txt.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/vsd.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/vsd.gif
    new file mode 100644
    index 00000000..7624697c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/vsd.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/xls.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/xls.gif
    new file mode 100644
    index 00000000..afe724a3
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/xls.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/xlsx.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/xlsx.gif
    new file mode 100644
    index 00000000..afe724a3
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/xlsx.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/xml.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/xml.gif
    new file mode 100644
    index 00000000..4fae3566
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/xml.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/zip.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/zip.gif
    new file mode 100644
    index 00000000..7157f72a
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/icons/32/zip.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/loaders/16x16.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/loaders/16x16.gif
    new file mode 100644
    index 00000000..9dd71fd5
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/loaders/16x16.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/loaders/32x32.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/loaders/32x32.gif
    new file mode 100644
    index 00000000..bca96650
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/loaders/32x32.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/spacer.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/spacer.gif
    new file mode 100644
    index 00000000..5bfd67a2
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/spacer.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/sprites.png b/src/main/webapp/plug-in/ckfinder/skins/kama/images/sprites.png
    new file mode 100644
    index 00000000..0cb4e1c6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/sprites.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/sprites_ie6.png b/src/main/webapp/plug-in/ckfinder/skins/kama/images/sprites_ie6.png
    new file mode 100644
    index 00000000..5bb305c8
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/sprites_ie6.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/add.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/add.gif
    new file mode 100644
    index 00000000..a8a33fa5
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/add.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/clear_basket.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/clear_basket.gif
    new file mode 100644
    index 00000000..48013823
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/clear_basket.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/delete.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/delete.gif
    new file mode 100644
    index 00000000..48013823
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/delete.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/download.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/download.gif
    new file mode 100644
    index 00000000..31225f35
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/download.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/help.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/help.gif
    new file mode 100644
    index 00000000..1931b56f
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/help.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/maximize.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/maximize.gif
    new file mode 100644
    index 00000000..815dea83
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/maximize.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/refresh.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/refresh.gif
    new file mode 100644
    index 00000000..9c25f984
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/refresh.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/settings.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/settings.gif
    new file mode 100644
    index 00000000..82d3072d
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/settings.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/view.gif b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/view.gif
    new file mode 100644
    index 00000000..f058cfc3
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/kama/images/toolbar/view.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/richcombo.css b/src/main/webapp/plug-in/ckfinder/skins/kama/richcombo.css
    new file mode 100644
    index 00000000..9d802360
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/skins/kama/richcombo.css
    @@ -0,0 +1,7 @@
    +/*
    +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    +*/
    +
    +.cke_skin_kama .cke_rcombo{display:inline;}.cke_skin_kama .cke_rcombopanel{border:1px solid #8F8F73;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;height:auto;_height:100px;}.cke_skin_kama .cke_rcombo a,.cke_skin_kama .cke_rcombo a:active,.cke_skin_kama .cke_rcombo a:hover{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:repeat-x;background-position:0 -100px;border-bottom:1px solid #DAD9D9;border-right:1px solid #DAD9D9;float:left;padding:2px;height:21px;margin-right:6px;}.cke_skin_kama .cke_rtl .cke_rcombo a,.cke_skin_kama .cke_rtl .cke_rcombo a:active,.cke_skin_kama .cke_rtl .cke_rcombo a:hover{float:right;margin-right:0;margin-left:6px;}.cke_skin_kama .cke_hc .cke_rcombo a{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_kama .cke_rcombo .cke_label{display:none;line-height:26px;vertical-align:top;margin-right:5px;filter:alpha(opacity=70);opacity:.70;}.cke_skin_kama .cke_rtl .cke_rcombo .cke_label{margin-right:0;margin-left:5px;}.cke_skin_kama .cke_rcombo .cke_inline_label{line-height:21px;font-style:italic;color:#666;}.cke_skin_kama .cke_hc .cke_rcombo .cke_label{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_kama .cke_rcombo .cke_text{filter:alpha(opacity=70);opacity:.70;height:21px;line-height:21px;width:60px;text-overflow:ellipsis;overflow:hidden;display:inline-block;margin:0 2px 0 4px;}.cke_skin_kama .cke_rtl .cke_rcombo .cke_text{margin:0 4px 0 2px;}.cke_skin_kama .cke_rcombo .cke_openbutton{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -68px;background-repeat:no-repeat;display:inline-block;width:17px;height:19px;margin:1px 2px;background-repeat:no-repeat;}.cke_skin_kama .cke_browser_iequirks .cke_rcombo .cke_openbutton{margin-bottom:0;}.cke_skin_kama .cke_rcombo .cke_off a:hover .cke_text,.cke_skin_kama .cke_rcombo .cke_off a:focus .cke_text,.cke_skin_kama .cke_rcombo .cke_off a:active .cke_text,.cke_skin_kama .cke_rcombo .cke_on .cke_text{border-color:#316ac5;filter:alpha(opacity=100);opacity:1;}.cke_skin_kama .cke_rcombo .cke_off a:hover .cke_openbutton,.cke_skin_kama .cke_rcombo .cke_off a:focus .cke_openbutton,.cke_skin_kama .cke_rcombo .cke_off a:active .cke_openbutton,.cke_skin_kama .cke_rcombo .cke_on .cke_openbutton{border-color:#316ac5;background-color:#dff1ff;}.cke_skin_kama .cke_rcombo .cke_on .cke_text{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;}.cke_skin_kama .cke_rcombo .cke_on .cke_openbutton{-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;}.cke_skin_kama .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.3;}.cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=70);opacity:.7;}.cke_skin_kama .cke_rcombo .cke_disabled .cke_text,.cke_skin_kama .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);opacity:.5;}.cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_text,.cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=80);opacity:.8;}.cke_skin_kama .cke_rcombo .cke_disabled .cke_text{color:#fff;}.cke_skin_kama .cke_browser_gecko .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_gecko .cke_rcombo .cke_openbutton,.cke_skin_kama .cke_browser_webkit .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_webkit .cke_rcombo .cke_openbutton{display:block;float:left;}.cke_skin_kama .cke_browser_gecko .cke_rcombo .cke_label,.cke_skin_kama .cke_browser_webkit .cke_rcombo .cke_label{float:left;}.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_label,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_openbutton,.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_rcombo .cke_label,.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_rcombo .cke_openbutton{float:right;}
    +.cke_skin_kama .cke_browser_ie7 .cke_rcombo .cke_text{line-height:18px;}.cke_skin_kama .cke_browser_ie6 .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_iequirks .cke_rcombo .cke_text{height:auto;line-height:17px;}
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/skin.js b/src/main/webapp/plug-in/ckfinder/skins/kama/skin.js
    new file mode 100644
    index 00000000..d7f087e8
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/skins/kama/skin.js
    @@ -0,0 +1,7 @@
    +锘/*
    +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    +*/
    +
    +CKFINDER.skins.add('kama',(function(){var a=['images/loaders/16x16.gif','images/loaders/32x32.gif','images/ckffolder.gif','images/ckffolderopened.gif'];if(CKFINDER.env.ie&&CKFINDER.env.version<7)a.push('images/sprites_ie6.png');return{preload:a,application:{css:['app.css']},host:{intoHostPage:1,css:['host.css']},marginMainContainer:7,marginSidebarContainer:7,fixMainContentWidth:1,init:function(b){if(b.config.width&&!isNaN(b.config.width))b.config.width-=12;var c=[],d='/* UI Color Support */.cke_skin_kama .cke_menuitem .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{\tbackground-color: transparent !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuseparator{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{\tbackground-color: $color !important;}';if(CKFINDER.env.webkit){d=d.split('}').slice(0,-1);for(var e=0;e<d.length;e++)d[e]=d[e].split('{');}function f(i){var j=i.getHead().append('style');j.setAttribute('id','cke_ui_color');j.setAttribute('type','text/css');return j;};function g(i,j,k){var l,m,n;for(var o=0;o<i.length;o++){if(CKFINDER.env.webkit){for(m=0;m<i[o].$.sheet.rules.length;m++)i[o].$.sheet.removeRule(m);for(m=0;m<j.length;m++){n=j[m][1];for(l=0;l<k.length;l++)n=n.replace(k[l][0],k[l][1]);i[o].$.sheet.addRule(j[m][0],n);}}else{n=j;for(l=0;l<k.length;l++)n=n.replace(k[l][0],k[l][1]);if(CKFINDER.env.ie)i[o].$.styleSheet.cssText=n;
    +else i[o].setHtml(n);}}};var h=/\$color/g;CKFINDER.tools.extend(b,{uiColor:null,getUiColor:function(){return this.uiColor;},setUiColor:function(i){var j,k,l=f(CKFINDER.documentHost),m=f(this.document),n='.cke_'+b.name.replace('.','\\.'),o=[n+' .cke_wrapper',n+'_dialog .cke_dialog_contents',n+'_dialog a.cke_dialog_tab',n+'_dialog .cke_dialog_footer'].join(','),p='background-color: $color !important;';if(CKFINDER.env.webkit){j=[[o,p]];k=[['body,'+o,p]];}else{j=o+'{'+p+'}';k='body,'+o+'{'+p+'}';}return(this.setUiColor=function(q){var r=[[h,q]];b.uiColor=q;g([l],j,r);g([m],k,r);g(c,d,r);})(i);}});b.on('menuShow',function(i){var j=i.data[0],k=j.element.getElementsByTag('iframe').getItem(0).getFrameDocument();if(!k.getById('cke_ui_color')){var l=f(k);c.push(l);var m=b.getUiColor();if(m)g([l],d,[[h,m]]);}});if(b.config.uiColor)b.on('uiReady',function(){b.setUiColor(b.config.uiColor);});}};})());(function(){CKFINDER.dialog?a():CKFINDER.on('dialogPluginReady',a);function a(){CKFINDER.dialog.on('resize',function(b){var c=b.data,d=c.width,e=c.height,f=c.dialog,g=f.parts.contents;if(c.skin!='kama')return;g.setStyles({width:d+'px',height:e+'px'});setTimeout(function(){var h=f.parts.dialog.getChild([0,0,0]),i=h.getChild(0),j=h.getChild(2);j.setStyle('width',i.$.offsetWidth+'px');j=h.getChild(7);j.setStyle('width',i.$.offsetWidth-28+'px');j=h.getChild(4);j.setStyle('height',i.$.offsetHeight-31-14+'px');j=h.getChild(5);j.setStyle('height',i.$.offsetHeight-31-14+'px');},100);});};})();
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/kama/uipanel.css b/src/main/webapp/plug-in/ckfinder/skins/kama/uipanel.css
    new file mode 100644
    index 00000000..5cafdae7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/skins/kama/uipanel.css
    @@ -0,0 +1,8 @@
    +/*
    +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    +*/
    +
    +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}:focus{outline:0;}ins{text-decoration:none;}del{text-decoration:line-through;}table{border-collapse:collapse;border-spacing:0;}body{font:9pt/1.5em Arial,Helvetica,sans-serif;}pre,code,tt{font:1em/1.5em 'Andale Mono','Lucida Console',monospace;}h1,h2,h3,h4,h5,h6,b,strong{font-weight:bold;}em,i,dfn{font-style:italic;}dfn{font-weight:bold;}p,code,pre,kbd{margin:0 0 1.5em 0;}blockquote{margin:0 1.5em 1.5em 1.5em;}li ul,li ol{margin:0 1.5em;}ul,ol{margin:0 1.5em 1.5em 1.5em;}ul,ul li{list-style-type:disc;}ol,ol li{list-style-type:decimal;}dl{margin:0 0 1.5em 0;}dl dt{font-weight:bold;}dd{margin-left:1.5em;}table{margin-bottom:1.4em;width:100%;}th{font-weight:bold;}th,td,caption{padding:4px 10px 4px 5px;}tfoot{font-style:italic;}sup,sub{line-height:0;}abbr,acronym{border-bottom:1px dotted;}address{margin:0 0 1.5em;font-style:italic;}del{text-decoration:line-through;}pre{margin:1.5em 0;white-space:pre;}img.centered,.aligncenter,div.aligncenter{display:block;margin-left:auto;margin-right:auto;}img.alignright{display:inline;}img.alignleft{display:inline;}.alignright{float:right;margin-left:10px;}.alignleft{float:left;margin-right:10px;}.clearfix::after,.group::after{content:".";display:block;height:0;clear:both;visibility:hidden;}*:first-child+html .clearfix{zoom:1;display:block;}* html .clearfix{zoom:1;display:block;}*:first-child+html .group{zoom:1;display:block;}* html .group{zoom:1;display:block;}.cke_compatibility a,.cke_compatibility a:hover,.cke_compatibility a:active,.cke_compatibility a:visited{color:black;text-decoration:none;}.cke_compatibility,.cke_compatibility td,.cke_compatibility td *{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;line-height:1;border:0;}.cke_compatibility tbody{border:0;}.cke_compatibility .cke_accessibility{display:none;}.cke_compatibility table{width:auto;}.cke_compatibility{background-color:#FFF;}.cke_compatibility *{color:black;height:auto;border-collapse:collapse;padding:0;margin:0;vertical-align:baseline;white-space:nowrap;}.cke_compatibility pre,.cke_compatibility textarea{white-space:pre;}.cke_compatibility code,.cke_compatibility font{white-space:normal;}.cke_skin_kama .cke_contextmenu{padding:2px;}.cke_skin_kama .cke_menuitem a{display:block;}.cke_skin_kama .cke_menuitem span{cursor:default;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{background-color:#D3D3D3;display:block;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover,.cke_skin_kama .cke_menuitem a.cke_disabled:focus,.cke_skin_kama .cke_menuitem a.cke_disabled:active{background-color:transparent!important;}.cke_skin_kama .cke_menuitem .cke_icon{width:16px;height:16px;float:left;}.cke_skin_kama .cke_menuitem .cke_disabled .cke_icon{filter:alpha(opacity=70);opacity:.70;}.cke_skin_kama .cke_menuitem .cke_icon_wrapper{background-color:#D3D3D3;border:solid 4px #D3D3D3;width:16px;height:16px;float:left;filter:alpha(opacity=70);opacity:.70;clear:both;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_icon_wrapper{float:right;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{background-color:#9d9d9d;border:solid 4px #9d9d9d;filter:alpha(opacity=70);opacity:.70;}.cke_skin_kama .cke_menuitem a:hover.cke_disabled .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus.cke_disabled .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active.cke_disabled .cke_icon_wrapper{background-color:#D3D3D3;border:solid 4px #D3D3D3;}
    +.cke_skin_kama .cke_menuitem .cke_label{display:block;padding-right:3px;padding-top:5px;padding-left:4px;height:19px;margin-left:24px;background-color:#fff;}.cke_skin_kama .cke_frameLoaded .cke_menuitem .cke_label{filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_label{padding-right:0;margin-left:0;padding-left:3px;margin-right:28px;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.30;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{background-color:#D3D3D3;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{background-color:transparent;}.cke_skin_kama .cke_menuseparator{background-color:#D3D3D3;height:2px;filter:alpha(opacity=70);opacity:.70;_font-size:0;}.cke_skin_kama .cke_menuarrow{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1411px;background-repeat:no-repeat;height:5px;width:3px;float:right;margin-right:2px;margin-top:3px;}.cke_rtl .cke_skin_kama .cke_menuarrow{float:left;margin-right:0;margin-left:2px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1390px;background-repeat:no-repeat;}.cke_browser_ie.cke_ltr .cke_skin_kama .cke_menuarrow{position:absolute;right:2px;}.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuarrow{position:absolute;left:2px;}.cke_skin_kama .cke_panel{border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.cke_skin_kama .cke_contextmenu{margin:0;}.cke_skin_kama .cke_panel iframe{width:100%;height:100%;}html.cke_skin_kama_container{overflow:auto;overflow-x:hidden;}body.cke_panel_frame{overflow:auto;overflow-x:hidden;}ul.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap;}li.cke_panel_listItem{margin:0;}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit;text-decoration:none;overflow:hidden;text-overflow:ellipsis;}* html .cke_panel_listItem a{width:100%;color:#000;}*:first-child+html .cke_panel_listItem a{color:#000;}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff;}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff;}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px;}html.cke_skin_kama_container{visibility:visible;}.cke_skin_kama .ckf_uploadButtons span.cke_dialog_ui_button{width:110px;padding:2px;}.cke_skin_kama .ckf_uploadButtons .cke_dialog_ui_button{margin:3px 0;}.cke_skin_kama .ckf_uploadButtons a.cke_dialog_ui_button_ok span,.cke_skin_kama .ckf_uploadButtons a.cke_dialog_ui_button_cancel span{background-image:none;padding:2px;}.cke_skin_kama .cke_button_TruncateBasket .cke_icon{background:url('images/toolbar/clear_basket.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_settings .cke_icon{background:url('images/toolbar/settings.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_refresh .cke_icon{background:url('images/toolbar/refresh.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_upload .cke_icon{background:url('images/toolbar/add.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_help .cke_icon{background:url('images/toolbar/help.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_downloadFile .cke_icon{background:url('images/toolbar/download.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_viewFile .cke_icon{background:url('images/toolbar/view.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_deleteFile .cke_icon,.cke_skin_kama .cke_button_deleteFiles .cke_icon{background:url('images/toolbar/delete.gif') no-repeat 0 0;}.cke_skin_kama .cke_button_removeFolder .cke_icon{background:url('images/toolbar/delete.gif') no-repeat 0 0;}
    +.cke_skin_kama .cke_button_maximize .cke_icon{background:url('images/toolbar/maximize.gif') no-repeat 0 0;}#folders_view .folder_tree li a{background:url('images/ckffolder.gif') 3px 0 no-repeat;}.cke_rtl #folders_view .folder_tree li a{background-position:right;}#folders_view .folder_tree li.closable a{background-image:url('images/ckffolderopened.gif');}#folders_view .folder_tree li.openable a{background-image:url('images/ckffolder.gif');}#folders_view .folder_tree li.nochildren a{background-image:url('images/ckffolder.gif');}#folders_view .folder_tree li a.processing{background-image:url('images/loaders/16x16.gif');}#folders_view .folder_tree li.closable .expander{background-image:url('images/ckfminus.gif');}#folders_view .folder_tree li.openable .expander{background-image:url('images/ckfplus.gif');}#files_view .files_thumbnails .processing div.image{background:url("images/loaders/32x32.gif") 50% 50% no-repeat;}
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/app.css b/src/main/webapp/plug-in/ckfinder/skins/v1/app.css
    new file mode 100644
    index 00000000..0d9ea8c3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/skins/v1/app.css
    @@ -0,0 +1,15 @@
    +/*
    +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    +*/
    +
    +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}:focus{outline:0;}ins{text-decoration:none;}del{text-decoration:line-through;}table{border-collapse:collapse;border-spacing:0;}body{font:9pt/1.5em Arial,Helvetica,sans-serif;}pre,code,tt{font:1em/1.5em 'Andale Mono','Lucida Console',monospace;}h1,h2,h3,h4,h5,h6,b,strong{font-weight:bold;}em,i,dfn{font-style:italic;}dfn{font-weight:bold;}p,code,pre,kbd{margin:0 0 1.5em 0;}blockquote{margin:0 1.5em 1.5em 1.5em;}li ul,li ol{margin:0 1.5em;}ul,ol{margin:0 1.5em 1.5em 1.5em;}ul,ul li{list-style-type:disc;}ol,ol li{list-style-type:decimal;}dl{margin:0 0 1.5em 0;}dl dt{font-weight:bold;}dd{margin-left:1.5em;}table{margin-bottom:1.4em;width:100%;}th{font-weight:bold;}th,td,caption{padding:4px 10px 4px 5px;}tfoot{font-style:italic;}sup,sub{line-height:0;}abbr,acronym{border-bottom:1px dotted;}address{margin:0 0 1.5em;font-style:italic;}del{text-decoration:line-through;}pre{margin:1.5em 0;white-space:pre;}img.centered,.aligncenter,div.aligncenter{display:block;margin-left:auto;margin-right:auto;}img.alignright{display:inline;}img.alignleft{display:inline;}.alignright{float:right;margin-left:10px;}.alignleft{float:left;margin-right:10px;}.clearfix::after,.group::after{content:".";display:block;height:0;clear:both;visibility:hidden;}*:first-child+html .clearfix{zoom:1;display:block;}* html .clearfix{zoom:1;display:block;}*:first-child+html .group{zoom:1;display:block;}* html .group{zoom:1;display:block;}html,body,.fake_wrapper,#ckfinder{height:100%;width:100%;overflow:hidden;-webkit-touch-callout:none;}#ckfinder_view{text-align:left;width:100%;height:100%;margin:auto;}.cke_rtl #ckfinder_view{text-align:right;}.container{vertical-align:top;padding:0;height:100%;overflow:hidden;}.columns_1 #sidebar_container{display:none;}.columns_2 #sidebar_container{width:200px;}#sidebar_wrapper{height:100%;}#sidebar_container{float:left;}.cke_rtl #sidebar_container{float:right;}#folder_view,.tools_view{overflow:hidden;}#status_view{height:2em;}#panel_view{overflow:auto;}#panel_view,#files_view{clear:both;}.cke_compatibility a,.cke_compatibility a:hover,.cke_compatibility a:active,.cke_compatibility a:visited{color:black;text-decoration:none;}.cke_compatibility,.cke_compatibility td,.cke_compatibility td *{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;line-height:1;border:0;}.cke_compatibility tbody{border:0;}.cke_compatibility .cke_accessibility{display:none;}.cke_compatibility table{width:auto;}.cke_compatibility{background-color:#FFF;}.cke_compatibility *{color:black;height:auto;border-collapse:collapse;padding:0;margin:0;vertical-align:baseline;white-space:nowrap;}.cke_compatibility pre,.cke_compatibility textarea{white-space:pre;}.cke_compatibility code,.cke_compatibility font{white-space:normal;}@media print{.cke_skin_v1 .cke_toolbox{display:none;}}.cke_skin_v1 .cke_browser_webkit .cke_toolbox,.cke_skin_v1 .cke_browser_webkit .cke_toolbox>span{white-space:normal;}.cke_skin_v1 a.cke_toolbox_collapser,.cke_skin_v1 a:hover.cke_toolbox_collapser{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:3px -739px;background-repeat:no-repeat;width:11px;height:11px;float:right;border:outset 1px;margin:11px 2px 2px;cursor:pointer;}.cke_skin_v1 .cke_rtl a.cke_toolbox_collapser,.cke_skin_v1 .cke_rtl a:hover.cke_toolbox_collapser{float:left;}.cke_skin_v1 a.cke_toolbox_collapser_min,.cke_skin_v1 a:hover.cke_toolbox_collapser_min{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:4px -760px;background-repeat:no-repeat;margin:2px;}
    +.cke_skin_v1 .cke_rtl a.cke_toolbox_collapser_min,.cke_skin_v1 .cke_rtl a:hover.cke_toolbox_collapser_min{background-position:4px -781px;}.cke_skin_v1 .cke_toolbar{padding-top:1px;padding-bottom:1px;display:inline-block;float:left;}.cke_skin_v1 .cke_rtl .cke_toolbar{float:right;}.cke_skin_v1 .cke_toolgroup{display:inline-block;float:left;}.cke_skin_v1 .cke_search_box{float:right;position:relative;}.cke_skin_v1 .cke_search_box input,.cke_skin_v1 .cke_search_placeholder{font-size:1em;line-height:1.2em;margin:3px 4px 0;padding:1px 1px 1px 20px;height:16px;}.cke_skin_v1 .cke_search_box input{background:url(images/toolbar/view.gif) no-repeat scroll 2px 2px #fff;border:1px solid #a0a0a0;max-width:84px;}.cke_skin_v1 .cke_search_placeholder{color:#777;left:10px;max-width:84px;position:absolute;top:3px;}.cke_skin_v1 .cke_rtl .cke_search_box{float:left;}.cke_skin_v1 .cke_rtl .cke_search_box input{background-position:right center;text-align:right;}.cke_skin_v1 .cke_rtl .cke_search_box input,.cke_skin_v1 .cke_rtl .cke_search_box .cke_search_placeholder{padding:1px 20px 1px 1px;}.cke_skin_v1 .cke_toolbar{display:block;}.cke_skin_v1 .cke_search_box .cke_toolbar_end{display:none;}.cke_skin_v1 .cke_search_box .cke_toolbar_end{display:none;}.cke_skin_v1 .cke_rtl .cke_search_box .cke_search_placeholder{left:auto;right:10px;}.cke_skin_v1 .browser_ie8 .cke_search_box input{padding-top:4px;line-height:1.1em;height:14px;}.cke_skin_v1 .browser_ie8 .cke_search_box{width:122px;}.cke_skin_v1 .cke_browser_ie .cke_toolgroup{#float:none;#display:inline;}.cke_skin_v1 .cke_rtl .cke_toolgroup{float:right;}.cke_skin_v1 .cke_browser_ie .cke_rtl .cke_toolgroup{#float:none;}.cke_skin_v1 .cke_separator{display:inline-block;float:left;border-left:solid 1px #999;margin:0 2px;height:16px;}.cke_skin_v1 .cke_browser_ie .cke_separator{#float:none;#display:inline;}.cke_skin_v1 .cke_rtl .cke_separator{float:right;}.cke_skin_v1 .cke_browser_ie .cke_rtl .cke_separator{#float:none;}.cke_skin_v1 .cke_break{clear:left;}.cke_skin_v1 .cke_rtl .cke_break{clear:right;}.cke_skin_v1 .cke_toolbar_start{display:inline-block;background-image:url(images/toolbar_start.gif);background-repeat:no-repeat;margin:4px 2px 0 2px;width:3px;height:16px;float:left;}.cke_skin_v1 .cke_browser_ie .cke_toolbar_start{#float:none;#display:inline;}.cke_skin_v1 .cke_rtl .cke_toolbar_start{float:right;}.cke_skin_v1 .cke_browser_ie .cke_rtl .cke_toolbar_start{#float:none;}.cke_skin_v1 .cke_toolbar_end{display:inline-block;float:left;}.cke_skin_v1 .cke_browser_ie .cke_toolbar_end{#float:none;#display:inline;}.cke_skin_v1 .cke_rtl .cke_toolbar_end{float:right;}.cke_skin_v1 .cke_browser_ie .cke_rtl .cke_toolbar_end{#float:none;}.cke_skin_v1 .cke_button a,.cke_skin_v1 .cke_button a:hover,.cke_skin_v1 .cke_button a:focus,.cke_skin_v1 .cke_button a:active,.cke_skin_v1 .cke_button a.cke_off{border:solid 1px #efefde;display:inline-block;border-radius:3px;outline:none;padding-top:2px;padding-left:4px;padding-right:4px;padding-bottom:2px;height:18px;cursor:default;}.cke_skin_v1 .cke_button a,.cke_skin_v1 .cke_button a.cke_off{background-color:#efefde;filter:alpha(opacity=70);opacity:.70;-moz-border-radius:3px;-webkit-border-radius:3px;}.cke_skin_v1 .cke_hc .cke_button a,.cke_skin_v1 .cke_hc .cke_button a.cke_off{opacity:1.0;filter:alpha(opacity=100);}.cke_skin_v1 .cke_button a.cke_on{border:solid 1px #316ac5;background-color:#a3d7ff;filter:alpha(opacity=100);opacity:1;}.cke_skin_v1 .cke_hc .cke_button a.cke_on{padding:0 2px!important;border-width:3px;}.cke_skin_v1 .cke_button a.cke_disabled,.cke_skin_v1 .cke_browser_ie a:hover.cke_button .cke_disabled{border:solid 1px #efefde;background-color:#efefde;filter:alpha(opacity=30);opacity:.3;}.cke_skin_v1 .cke_hc .cke_button a.cke_disabled,.cke_skin_v1 .cke_browser_ie.cke_hc a:hover.cke_button .cke_disabled{filter:alpha(opacity=60);opacity:.6;}.cke_skin_v1 .cke_button a:hover.cke_on,.cke_skin_v1 .cke_button a:focus.cke_on,.cke_skin_v1 .cke_button a:active.cke_on,.cke_skin_v1 .cke_button a:hover.cke_off,.cke_skin_v1 .cke_button a:focus.cke_off,.cke_skin_v1 .cke_button a:active.cke_off{border:solid 1px #316ac5;background-color:#dff1ff;filter:alpha(opacity=100);opacity:1;padding:2px 4px;}
    +.cke_skin_v1 .cke_hc .cke_button a:hover.cke_on,.cke_skin_v1 .cke_hc .cke_button a:focus.cke_on,.cke_skin_v1 .cke_hc .cke_button a:active.cke_on,.cke_skin_v1 .cke_hc .cke_button a:hover.cke_off,.cke_skin_v1 .cke_hc .cke_button a:focus.cke_off,.cke_skin_v1 .cke_hc .cke_button a:active.cke_off{padding:0 2px!important;border-width:3px;}.cke_skin_v1 .cke_button .cke_icon{margin-top:1px;width:16px;height:16px;display:inline-block;}.cke_skin_v1 .cke_button .cke_label{cursor:default;display:none;padding-left:3px;vertical-align:3px;}.cke_skin_v1 .cke_hc .cke_button .cke_label{padding:0;display:inline-block;}.cke_skin_v1 .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_v1 .cke_accessibility{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_v1 .cke_button .cke_buttonarrow{display:inline-block;height:17px;width:8px;background-position:2px -717px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;}.cke_skin_v1 .cke_rtl .cke_button .cke_buttonarrow{background-position:0 -717px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);}.cke_skin_v1 .cke_browser_gecko18 .cke_toolbar,.cke_skin_v1 .cke_browser_gecko18 .cke_button a,.cke_skin_v1 .cke_browser_gecko18 .cke_button a.cke_off,.cke_skin_v1 .cke_browser_gecko18 .cke_button .cke_icon,.cke_skin_v1 .cke_browser_gecko18 .cke_button .cke_buttonarrow,.cke_skin_v1 .cke_browser_gecko18 .cke_separator,.cke_skin_v1 .cke_browser_gecko18 .cke_toolbar_start{display:block;float:left;}.cke_skin_v1 .cke_browser_gecko18 .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_toolbar,.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_button a,.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_button a.cke_off,.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_button .cke_icon,.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_button .cke_buttonarrow,.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_separator,.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_toolbar_start{float:right;}.cke_skin_v1 .cke_browser_gecko18 .cke_button .cke_label,.cke_skin_v1 .cke_browser_gecko18 .cke_break{float:left;}.cke_skin_v1 .cke_browser_gecko18 .cke_rtl span.cke_inline_label{float:right;}.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_button .cke_label,.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_break{float:right;}.cke_skin_v1 .cke_browser_gecko18 .cke_separator{margin-top:4px;}.cke_skin_v1 .cke_browser_gecko18 .cke_button .cke_label{padding-top:3px;}.cke_skin_v1 .cke_browser_ie .cke_rtl .cke_toolgroup,.cke_skin_v1 .cke_browser_ie .cke_rtl .cke_separator,.cke_skin_v1 .cke_browser_ie .cke_rtl .cke_toolbar_start,.cke_skin_v1 .cke_browser_ie .cke_rtl .cke_toolbar_end{float:none;}.cke_skin_v1 .cke_browser_ie8 .cke_toolbar,.cke_skin_v1 .cke_browser_ie8 .cke_toolgroup{vertical-align:top;}.cke_skin_v1 .cke_browser_iequirks.cke_browser_ie8 .cke_toolbar,.cke_skin_v1 .cke_browser_iequirks.cke_browser_ie8 .cke_toolgroup{vertical-align:baseline;}.cke_skin_v1 .cke_button_TruncateBasket .cke_icon{background:url('images/toolbar/clear_basket.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_settings .cke_icon{background:url('images/toolbar/settings.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_refresh .cke_icon{background:url('images/toolbar/refresh.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_upload .cke_icon{background:url('images/toolbar/add.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_help .cke_icon{background:url('images/toolbar/help.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_downloadFile .cke_icon{background:url('images/toolbar/download.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_viewFile .cke_icon{background:url('images/toolbar/view.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_deleteFile .cke_icon,.cke_skin_v1 .cke_button_deleteFiles .cke_icon{background:url('images/toolbar/delete.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_removeFolder .cke_icon{background:url('images/toolbar/delete.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_maximize .cke_icon{background:url('images/toolbar/maximize.gif') no-repeat 0 0;}
    +#folders_view .folder_tree li a{background:url('images/ckffolder.gif') 3px 0 no-repeat;}.cke_rtl #folders_view .folder_tree li a{background-position:right;}#folders_view .folder_tree li.closable a{background-image:url('images/ckffolderopened.gif');}#folders_view .folder_tree li.openable a{background-image:url('images/ckffolder.gif');}#folders_view .folder_tree li.nochildren a{background-image:url('images/ckffolder.gif');}#folders_view .folder_tree li a.processing{background-image:url('images/loaders/16x16.gif');}#folders_view .folder_tree li.closable .expander{background-image:url('images/ckfminus.gif');}#folders_view .folder_tree li.openable .expander{background-image:url('images/ckfplus.gif');}#files_view .files_thumbnails .processing div.image{background:url("images/loaders/32x32.gif") 50% 50% no-repeat;}.cke_skin_v1 .cke_contextmenu{padding:2px;}.cke_skin_v1 .cke_menuitem a{display:block;}.cke_skin_v1 .cke_menuitem span{cursor:default;}.cke_skin_v1 .cke_menuitem a:hover,.cke_skin_v1 .cke_menuitem a:focus,.cke_skin_v1 .cke_menuitem a:active{background-color:#8f8f73;display:block;}.cke_skin_v1 .cke_menuitem a.cke_disabled:hover,.cke_skin_v1 .cke_menuitem a.cke_disabled:focus,.cke_skin_v1 .cke_menuitem a.cke_disabled:active{background-color:transparent!important;}.cke_skin_v1 .cke_menuitem .cke_icon{width:16px;height:16px;float:left;}.cke_skin_v1 .cke_menuitem .cke_disabled .cke_icon{filter:alpha(opacity=70);opacity:.70;}.cke_skin_v1 .cke_menuitem .cke_icon_wrapper{background-color:#e3e3c7;border:solid 4px #e3e3c7;width:16px;height:16px;float:left;filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_v1 .cke_menuitem .cke_icon_wrapper{float:right;}.cke_skin_v1 .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_v1 .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_v1 .cke_menuitem a:active .cke_icon_wrapper{background-color:#9d9d9d;border:solid 4px #9d9d9d;filter:alpha(opacity=70);opacity:.70;}.cke_skin_v1 .cke_menuitem a:hover.cke_disabled .cke_icon_wrapper,.cke_skin_v1 .cke_menuitem a:focus.cke_disabled .cke_icon_wrapper,.cke_skin_v1 .cke_menuitem a:active.cke_disabled .cke_icon_wrapper{background-color:#e3e3c7;border:solid 4px #e3e3c7;}.cke_skin_v1 .cke_menuitem .cke_label{display:block;padding-right:3px;padding-top:5px;padding-left:4px;height:19px;margin-left:24px;background-color:#fff;}.cke_skin_v1 .cke_frameLoaded .cke_menuitem .cke_label{filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_v1 .cke_menuitem .cke_label{padding-right:0;margin-left:0;padding-left:3px;margin-right:28px;}.cke_skin_v1 .cke_menuitem a.cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.30;}.cke_skin_v1 .cke_menuitem a:hover .cke_label,.cke_skin_v1 .cke_menuitem a:focus .cke_label,.cke_skin_v1 .cke_menuitem a:active .cke_label{background-color:#8f8f73;color:white;}.cke_skin_v1 .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_v1 .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_v1 .cke_menuitem a.cke_disabled:active .cke_label{background-color:transparent;color:black;}.cke_skin_v1 .cke_menuseparator{background-color:#e3e3c7;height:2px;filter:alpha(opacity=70);opacity:.70;_font-size:0;}.cke_skin_v1 .cke_menuarrow{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -784px;background-repeat:no-repeat;height:5px;width:3px;float:right;margin-right:2px;margin-top:3px;}.cke_rtl .cke_skin_v1 .cke_menuarrow{float:left;margin-right:0;margin-left:2px;background-position:0 -763px;}.cke_browser_ie.cke_ltr .cke_skin_v1 .cke_menuarrow{position:absolute;right:2px;}.cke_browser_ie.cke_rtl .cke_skin_v1 .cke_menuarrow{position:absolute;left:2px;}.cke_skin_v1 .cke_panel{border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.cke_skin_v1 .cke_panel iframe{width:100%;height:100%;}html.cke_skin_v1_container{overflow:auto;overflow-x:hidden;}body.cke_panel_frame{overflow:auto;overflow-x:hidden;}ul.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap;}li.cke_panel_listItem{margin:0;}
    +.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit;text-decoration:none;overflow:hidden;text-overflow:ellipsis;}* html .cke_panel_listItem a{width:100%;color:#000;}*:first-child+html .cke_panel_listItem a{color:#000;}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff;}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff;}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px;}html.cke_skin_v1_container{visibility:visible;}.cke_skin_v1 .ckf_uploadButtons span.cke_dialog_ui_button{width:110px;padding:2px;}.cke_skin_v1 .ckf_uploadButtons .cke_dialog_ui_button{margin:1px 0;}.cke_skin_v1 .ckf_uploadButtons a.cke_dialog_ui_button_ok span,.cke_skin_v1 .ckf_uploadButtons a.cke_dialog_ui_button_cancel span{background-image:none;padding:2px;}body .cke_dialog{visibility:visible;}.cke_skin_v1 table.cke_dialog.cke_browser_gecko{display:block;}.cke_skin_v1 .cke_dialog_body{margin-left:16px;margin-right:16px;margin-top:2px;margin-bottom:20px;z-index:1;position:relative;_position:static;}.cke_skin_v1 .cke_dialog_tl,.cke_skin_v1 .cke_dialog_tr,.cke_skin_v1 .cke_dialog_tc,.cke_skin_v1 .cke_dialog_bl,.cke_skin_v1 .cke_dialog_br,.cke_skin_v1 .cke_dialog_bc{background-image:url(images/sprites.png);background-repeat:no-repeat;position:absolute;_background-image:url(images/sprites_ie6.png);_z-index:-1;}.cke_skin_v1 .cke_dialog_tl{background-position:-16px -16px;height:16px;width:16px;top:0;left:0;}.cke_skin_v1 .cke_rtl .cke_dialog_tl{background-position:-16px -397px;}.cke_skin_v1 .cke_dialog_tr{background-position:-16px -76px;height:16px;width:16px;top:0;right:0;}.cke_skin_v1 .cke_rtl .cke_dialog_tr{background-position:-16px -457px;}.cke_skin_v1 .cke_dialog_tc{background-position:0 -136px;background-repeat:repeat-x;height:16px;top:0;left:16px;right:16px;}.cke_skin_v1 .cke_dialog_bl{background-position:-16px -196px;height:51px;width:30px;bottom:0;left:0;}.cke_skin_v1 .cke_rtl .cke_dialog_bl{background-position:-16px -517px;}.cke_skin_v1 .cke_dialog_br{background-position:-16px -263px;height:51px;width:30px;bottom:0;right:0;}.cke_skin_v1 .cke_rtl .cke_dialog_br{background-position:-16px -584px;}.cke_skin_v1 .cke_dialog_bc{background-position:0 -330px;background-repeat:repeat-x;height:51px;bottom:0;left:30px;right:30px;}.cke_skin_v1 .cke_dialog_ml,.cke_skin_v1 .cke_dialog_mr{background-image:url(images/dialog_sides.png);background-repeat:repeat-y;position:absolute;width:16px;top:16px;bottom:51px;_background-image:url(images/dialog_sides.gif);_top:auto;}.cke_skin_v1 .cke_rtl .cke_dialog_ml,.cke_skin_v1 .cke_rtl .cke_dialog_mr{background-image:url(images/dialog_sides_rtl.png);_background-image:url(images/dialog_sides.gif);}.cke_skin_v1 .cke_dialog_ml{background-position:0 0;left:0;}.cke_skin_v1 .cke_dialog_mr{background-position:-16px 0;right:0;}.cke_skin_v1 .cke_browser_iequirks .cke_dialog_ml,.cke_skin_v1 .cke_browser_iequirks .cke_dialog_mr{margin-top:3px;}.cke_skin_v1 .cke_dialog_title{font-weight:bold;font-size:14pt;color:#737357;background-color:#e3e3c7;padding:3px 10px 26px 10px;cursor:move;position:relative;}.cke_skin_v1 .cke_dialog_contents{background-color:#f1f1e3;border:#d5d59d 1px solid;overflow:auto;padding:5px 10px;}.cke_skin_v1 .cke_dialog_footer{background-color:#e3e3c7;text-align:right;}.cke_skin_v1 .cke_rtl .cke_dialog_footer{text-align:left;}.cke_skin_v1 .cke_dialog_page_contents{position:relative;}.cke_skin_v1 .cke_dialog_footer .cke_resizer{margin-top:21px;}.cke_skin_v1 .cke_dialog_tabs{height:23px;background-color:#e3e3c7;display:inline-block;margin-left:10px;margin-right:10px;margin-top:-23px;position:absolute;z-index:2;}.cke_skin_v1 .cke_rtl .cke_dialog_tabs{right:10px;}.cke_skin_v1 a.cke_dialog_tab,.cke_skin_v1 a:link.cke_dialog_tab,.cke_skin_v1 a:active.cke_dialog_tab,.cke_skin_v1 a:hover.cke_dialog_tab,.cke_skin_v1 a:visited.cke_dialog_tab{color:#737357;border-left:1px solid #d5d59d;border-right:1px solid #d5d59d;border-top:1px solid #d5d59d;height:14px;padding:4px 5px;display:inline-block;cursor:pointer;}
    +.cke_skin_v1 .cke_browser_gecko18 a.cke_dialog_tab,.cke_skin_v1 .cke_browser_gecko18 a:link.cke_dialog_tab,.cke_skin_v1 .cke_browser_gecko18 a:active.cke_dialog_tab,.cke_skin_v1 .cke_browser_gecko18 a:hover.cke_dialog_tab,.cke_skin_v1 .cke_browser_gecko18 a:visited.cke_dialog_tab{display:inline;position:relative;top:6px;}.cke_skin_v1 a:hover.cke_dialog_tab{background-color:#f1f1e3;}.cke_skin_v1 a.cke_dialog_tab_selected,.cke_skin_v1 a:link.cke_dialog_tab_selected,.cke_skin_v1 a:active.cke_dialog_tab_selected,.cke_skin_v1 a:hover.cke_dialog_tab_selected,.cke_skin_v1 a:visited.cke_dialog_tab_selected{border-bottom:1px solid #f1f1e3;background-color:#f1f1e3;font-weight:bold;cursor:default;}.cke_skin_v1 .cke_single_page .cke_dialog_tabs{display:none;}.cke_skin_v1 .cke_single_page .cke_dialog_title{padding-bottom:3px;}.cke_skin_v1 .cke_dialog_ui_vbox table,.cke_skin_v1 .cke_dialog_ui_hbox table{margin:auto;}.cke_skin_v1 .cke_dialog_ui_vbox_child{padding:5px 0;}.cke_skin_v1 input.cke_dialog_ui_input_text,.cke_skin_v1 input.cke_dialog_ui_input_password{background-color:white;border:none;padding:0;width:100%;height:14px;}.cke_skin_v1 div.cke_dialog_ui_input_text,.cke_skin_v1 div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_v1 textarea.cke_dialog_ui_input_textarea{background-color:white;border:none;padding:0;width:100%;_width:99%;overflow:auto;resize:none;}.cke_skin_v1 div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_v1 div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default;}.cke_skin_v1 .cke_dialog_ui_hbox{width:100%;}.cke_skin_v1 .cke_dialog_ui_hbox_first,.cke_skin_v1 .cke_dialog_ui_hbox_child,.cke_skin_v1 .cke_dialog_ui_hbox_last{vertical-align:top;}.cke_skin_v1 .cke_ltr .cke_dialog_ui_hbox_first,.cke_skin_v1 .cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px;}.cke_skin_v1 .cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_v1 .cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px;}.cke_skin_v1 a.cke_dialog_ui_button{border-collapse:separate;cursor:default;}.cke_skin_v1 span.cke_dialog_ui_button{border:#737357 1px solid;padding:2px 10px;text-align:center;color:#3b3b1f;background-color:#c7c78f;display:inline-block;cursor:default;}.cke_skin_v1 .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{display:block;}.cke_skin_v1 a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3;}.cke_skin_v1 a:focus span.cke_dialog_ui_button,.cke_skin_v1 a:active span.cke_dialog_ui_button{background-color:#e3e3c7;}.cke_skin_v1 .cke_dialog_footer_buttons{display:inline-table;margin-right:12px;margin-left:12px;width:auto;position:relative;}.cke_skin_v1 .cke_browser_gecko18 .cke_dialog_footer_buttons{display:inline;}.cke_skin_v1 .cke_dialog_footer_buttons span.cke_dialog_ui_button{width:60px;margin:7px 0;}.cke_skin_v1 strong{font-weight:bold;}.cke_skin_v1 .cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:-16px -651px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;_background-image:url(images/sprites_ie6.png);}.cke_skin_v1 .cke_dialog_close_button span{display:none;}.cke_skin_v1 .cke_dialog_close_button:hover{background-position:-16px -687px;}.cke_skin_v1 .cke_ltr .cke_dialog_close_button{right:10px;_right:22px;}.cke_skin_v1 .cke_rtl .cke_dialog_close_button{left:10px;_left:16px;_top:7px;}.cke_skin_v1 .cke_browser_ie6.cke_rtl .cke_dialog_close_button{position:relative;float:left;margin-top:-55px;margin-left:-7px;}.cke_skin_v1 .cke_browser_iequirks.cke_rtl.cke_single_page .cke_dialog_close_button{margin-top:-32px;}.cke_skin_v1 .cke_browser_iequirks.cke_ltr .cke_dialog_close_button{margin-top:0;}.cke_skin_v1 .cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white;}.cke_skin_v1 iframe.cke_dialog_ui_input_file{width:100%;height:25px;}.cke_skin_v1 .cke_dialog .cke_dark_background{background-color:#eaead1;}.cke_skin_v1 .cke_dialog .cke_hand{cursor:pointer;}
    +.cke_skin_v1 .cke_dialog .cke_centered{text-align:center;}.cke_skin_v1 .cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px;}.cke_skin_v1 .cke_rtl .cke_dialog a.cke_btn_reset{float:left;}.cke_skin_v1 .cke_dialog a.cke_btn_locked,.cke_skin_v1 .cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px;}.cke_skin_v1 .cke_rtl .cke_dialog a.cke_btn_locked,.cke_skin_v1 .cke_rtl .cke_dialog a.cke_btn_unlocked{float:right;}.cke_skin_v1 .cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif);}.cke_skin_v1 .cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer;cursor:hand;}.cke_skin_v1 .cke_dialog #ImagePreviewBox{white-space:normal;border:2px ridge black;overflow:scroll;height:160px;width:230px;padding:2px;background-color:white;}.cke_skin_v1 .cke_dialog #ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4;}.cke_skin_v1 .cke_dialog #FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white;}.cke_skin_v1 .cke_dialog .cke_dark_background{text-align:center;background-color:#eaead1;font-size:14px;}.cke_skin_v1 .cke_dialog .cke_light_background{text-align:center;background-color:#ffffbe;}.cke_skin_v1 .cke_dialog .cke_hand{cursor:pointer;cursor:hand;}.cke_skin_v1 .cke_disabled,.cke_skin_v1 .cke_disabled label{color:#a0a0a0;}.cke_skin_v1 .cke_hc .cke_dialog_title,.cke_skin_v1 .cke_hc .cke_dialog_tabs,.cke_skin_v1 .cke_hc .cke_dialog_contents,.cke_skin_v1 .cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid;}.cke_skin_v1 .cke_hc .cke_dialog_title{border-top:1px solid;}.cke_skin_v1 .cke_hc .cke_dialog_footer{border-bottom:1px solid;}.cke_skin_v1 .cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;cursor:hand;font-weight:bold;position:relative;top:3px;}.cke_skin_v1 .cke_hc a.cke_btn_locked,.cke_skin_v1 .cke_hc a.cke_btn_unlocked,.cke_skin_v1 .cke_hc a.cke_btn_reset{border-style:solid;}.cke_skin_v1 a.cke_smile img{border:2px solid #eaead1;}.cke_skin_v1 a.cke_smile:focus img,.cke_skin_v1 a.cke_smile:active img,.cke_skin_v1 a.cke_smile:hover img{border-color:#C7C78F;}.ckfinder_loader_32{background:url("images/loaders/32x32.gif") 50% 50% no-repeat;}.cke_skin_v1 .cke_dialog_file_exist_options table{margin-bottom:10px;}.cke_skin_v1 .cke_dialog_remember_decision td{padding:10px;}.cke_skin_v1 .cke_dialog_error_msg strong{color:red;border:1px solid #FFF;padding:10px;margin-bottom:20px;display:block;}.cke_skin_v1 .cke_files_list{padding:10px 10% 0;line-height:1.2em;}.cke_skin_v1 .cke_files_list_many{height:5em;overflow:auto;}.cke_skin_v1 .cke_dialog_file_exist_options .cke_dialog_ui_labeled_label{margin-bottom:10px;}.cke_skin_v1 .cke_resizer{width:12px;height:12px;margin-top:16px;display:block;float:right;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -801px;background-repeat:no-repeat;cursor:se-resize;}.cke_skin_v1 .cke_browser_air .cke_resizer,.cke_skin_v1 .cke_browser_air .cke_rtl .cke_resizer{cursor:move;}.cke_skin_v1 .cke_rtl .cke_resizer{cursor:sw-resize;background-position:0 -828px;float:left;}.cke_skin_v1 .cke_resizer_horizontal,.cke_skin_v1 .cke_rtl .cke_resizer_horizontal{cursor:e-resize;}.cke_skin_v1 .cke_resizer_vertical,.cke_skin_v1 .cke_rtl .cke_resizer_vertical{cursor:n-resize;}.cke_skin_v1 .cke_maximized .cke_resizer{display:none;}.cke_skin_v1 .cke_dialog label{display:inline;margin-bottom:auto;cursor:default;}.cke_skin_v1 .cke_dialog_remember_decision td{padding:5px 0;}body{font-size:8pt;}.no_list,.no_list li{list-style-type:none;margin:0;}.view h2{padding:.3em .5em;font-size:2em;_zoom:1;}.dragged_source{filter:alpha(opacity=50);opacity:.50;}
    +#dragged_container{filter:alpha(opacity=75);opacity:.75;z-index:999;}.drag_multiple div{background-position:top center;background-repeat:no-repeat;text-align:center;width:32px;height:40px;padding-top:32px;}body.dragging a,body.dragging a:hover,body.dragging a:active,body.dragging a:visited{color:inherit!important;text-decoration:none;cursor:default!important;}body.dragging .drop_target,body.dragging .drop_target a{cursor:pointer!important;}body.dragging .cke_skin_kama .cke_button a.cke_off:hover,body.dragging .cke_skin_kama .cke_button a:hover,body.dragging .cke_skin_kama .cke_button a:active{background-color:inherit!important;filter:alpha(opacity=70);opacity:.70;}body.during_sidebar_resize *{cursor:e-resize!important;}body.during_sidebar_resize .browser_webkit *{-webkit-user-select:none;}#sidebar_wrapper,#sidebar_container{_position:relative;}#sidebar_container{cursor:e-resize;}#sidebar_wrapper{cursor:default;}#folders_view{overflow:auto;overflow-x:hidden;position:relative;}#folders_view .folder_tree_wrapper{position:relative;z-index:1;}#folders_view .folder_tree{padding-bottom:5px;position:relative;z-index:2;}#folders_view .folder_tree ul{margin:0;padding-left:15px;}.cke_rtl #folders_view .folder_tree ul{padding-right:15px;padding-left:0;}#folders_view .folder_tree li{white-space:nowrap;}#folders_view .folder_tree li.drop_target ul a{color:inherit;}#folders_view .folder_tree li.loading{padding-left:23px;font-style:italic;}#folders_view .folder_tree li.openable ul{display:none;}#folders_view .folder_tree li a{display:inline-block;padding:0;margin:0;height:14px;padding-left:23px;padding-bottom:3px;}.cke_rtl #folders_view .folder_tree li a{padding-right:23px;padding-left:0;}#folders_view .folder_tree li .expander{float:left;_zoom:1;_float:none;height:16px;width:16px;background:0 2px no-repeat;}.cke_rtl #folders_view .folder_tree li .expander{float:right;}#folders_view .folder_tree li.nochildren .expander{background-image:none;}#folders_view .folder_tree li.nochildren ul{display:none;}#folders_view .folder_tree_wrapper .selection{position:absolute;left:0;width:100%;display:none;margin-top:-2px;padding-top:2px;}.cke_rtl #folders_view .folder_tree_wrapper .selection{right:0;}#folders_view .folder_tree li.drop_target a{font-weight:bold!important;text-decoration:none!important;}#folders_view .folder_tree li.drop_target ul a{font-weight:inherit!important;cursor:default!important;}#folders_view .folder_tree a.processing{filter:alpha(opacity=50);opacity:.50;}#folders_view .folder_tree .dropdown{padding-left:5px;padding-right:5px;display:none;}#folders_view .selected ul .dropdown{display:none;}#folders_view .selected .dropdown{display:inline;}#sidebar_container .tool_panel ul li img{vertical-align:middle;margin-right:.3em;}.cke_rtl #sidebar_container .tool_panel ul li img{margin-right:0;margin-left:.3em;}#sidebar_container .tool_panel ul{padding-left:.5em;padding-right:.5em;}#sidebar_container .tool_panel p{margin:0 1em .5em 1em;}#sidebar_container .tool,#sidebar_container .tool *{overflow:auto;}#toolbar_view{float:left;width:100%;border-bottom:1px solid;}.cke_rtl #toolbar_view{float:right;}#toolbar_view .cke_button .cke_label{display:inline;}#toolbar_view .cke_toolgroup{margin-bottom:0;}#panel_view{clear:left;position:relative;}.cke_rtl #panel_view{clear:right;}#panel_view .panel_widget form{text-align:center;}#panel_view .panel_widget h2{text-align:left;}#panel_view .panel_widget table{width:auto;margin:0 auto 1em;text-align:left;}.cke_rtl #panel_view .panel_widget h2,.cke_rtl #panel_view .panel_widget table{text-align:right;}#panel_view .panel_widget dl{padding:5px;margin:0;white-space:nowrap;}#panel_view .panel_widget dd{margin:0;}#panel_view .panel_widget dd input{vertical-align:middle;}#panel_view .panel_widget .buttons{width:100%;text-align:right;}.cke_rtl #panel_view .panel_widget .buttons{text-align:left;}#panel_view .panel_widget .buttons input{margin:.5em;}#panel_view .panel_widget{border:1px solid;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;}.ckf_progress_bar_container{margin:4px 0;border:1px solid #333;background:#F3F3F3;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
    +.ckf_progress_bar_container div{height:4px;background:#19A6FF;width:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.ckf_upload_info{margin:2px;padding:3px 8px;background-color:#e5e5e5;overflow:hidden;}#ckf_globalUploads{background:white;}.ckf_progress_wrapper{float:left;width:100%;}.ckf_progress_info{padding:4px 0;margin-right:130px;}.ckf_uploadButtons{text-align:center;width:120px;float:left;margin-left:-120px;}.cke_rtl .ckf_progress_wrapper{float:right;width:100%;}.cke_rtl .ckf_progress_info{margin-right:0;margin-left:130px;}.cke_rtl .ckf_uploadButtons{float:right;margin-left:0;margin-right:-120px;}.ckf_status{font-weight:bold;}.ckf_speed{display:none;}#ckf_fileInput{visibility:hidden;width:0;height:0;margin:0;}.ckf_FileError .ckf_outcome{color:red;}#ckf_upload_form{max-height:230px;}#files_view{clear:left;height:auto;overflow:auto;_width:99.9%;overflow-x:hidden;border:1px solid transparent;}.cke_rtl #files_view{clear:right;}#files_view .message_content{display:none;}#files_view.files_message .message_content{display:block;}#files_view .message_content{float:left;margin:1em;padding:1em;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;}.cke_rtl #files_view .message_content{float:right;}#files_view .files_thumbnails{height:auto;clear:left;}.cke_rtl #files_view .files_thumbnails{clear:right;}#files_view.files_thumbnails table.files_details{display:none;}#files_view.files_details .files_thumbnails{display:none;}#files_view .files_thumbnails .file_entry,#dragged_container.file_entry{float:left;border:1px solid;margin:5px;padding:5px;overflow:hidden;text-align:center;}.cke_rtl #files_view .files_thumbnails .file_entry,.cke_rtl #dragged_container.file_entry{float:right;}#files_view .files_thumbnails .file_entry h5,#dragged_container.file_entry h5{display:block;font-weight:normal;overflow:hidden;white-space:nowrap;}#files_view .files_thumbnails .file_entry .image div,#dragged_container.file_entry .image div,#files_view .files_thumbnails .processing .image{margin:auto;overflow:hidden;background:50% 50% no-repeat;}#files_view .files_thumbnails .processing .image div{display:none;}#files_view .files_thumbnails .file_entry .details span,#dragged_container.file_entry .details span{display:block;}#files_view .files_thumbnails .extra,#dragged_container.file_entry .extra{height:1.3em;overflow:hidden;}.files_thumbnails .dropdown{position:absolute;top:0;left:0;padding:2px 20px 20px 3px;}.cke_rtl .files_thumbnails .dropdown{right:0;padding:2px 3px 20px 20px;}.files_details .dropdown{padding:.3em 5px;}#dragged_container .dropdown{display:none;}#files_view .files_thumbnails .file_entry{position:relative;}.browser_ie6 .files_thumbnails .dropdown,.browser_ie7 .files_thumbnails .dropdown{position:static;display:block;width:100%;padding:0;text-align:left;cursor:hand;}.browser_ie6 .cke_rtl .files_thumbnails .dropdown,.browser_ie7 .cke_rtl .files_thumbnails .dropdown{text-align:right;}.browser_ie6 #files_view .files_thumbnails .file_entry,.browser_ie7 #files_view .files_thumbnails .file_entry{position:static;}#files_view .files_details{width:100%;clear:left;}.cke_rtl #files_view .files_details{clear:right;}#files_view .files_details thead td{text-align:center;font-weight:bold;}#files_view .files_details td.image img{vertical-align:middle;}#files_view .files_details td.name{width:100%;}#files_view .files_details td{vertical-align:middle;padding:.3em .5em;white-space:nowrap;border:1px solid;}#files_view .files_details td.extra{text-align:right;padding-right:2em;}.cke_rtl #files_view .files_details td.extra{padding-right:0;padding-left:2em;}#files_view .files_details td.last{padding-right:1em;border-right:0;}.cke_rtl #files_view .files_details td.last{padding-right:0;padding-left:1em;}#status_view p{padding:5px;margin:0;vertical-align:middle;}.cke_ltr #sidebar_container{border-right-width:5px;}.cke_rtl #sidebar_container{border-left-width:5px;}.cke_skin_v1 .cke_browser_ie .cke_toolbar_start{vertical-align:top;}#sidebar_container .view{border-bottom:1px solid transparent;}#upload_form p{margin:1em 0;}#ckfinder_view{color:black;background:#F1F1E3;}
    +#files_view .files_thumbnails .file_entry,#dragged_container.file_entry{background:white;border-color:#D3D3D3;}#files_view{_border-color:#F1F1E3;}.view h2{background:#E3E3C7;color:#737357;}#sidebar_container{border-color:#E3E3C7;border-style:solid;}#panel_view .panel_widget .buttons{background-color:#E3E3C7;}#folders_view .folder_tree li a,#folders_view .folder_tree li a:hover,#folders_view .folder_tree li a:active,#folders_view .folder_tree li a:visited,#files_view .files_thumbnails a.file_entry,#files_view .files_thumbnails a.file_entry:hover,#files_view .files_thumbnails a.file_entry:active,#files_view .files_thumbnails a.file_entry:visited{color:black;text-decoration:none;}#folders_view .folder_tree li a:hover{color:blue;text-decoration:underline;}#status_view{background-color:#E3E3C7;}#toolbar_view{border-color:black;}#files_view .files_thumbnails .file_entry:hover{background-color:#FFFACD;border-color:#F93;}#files_view .files_thumbnails .file_entry.selected{background-color:#9CF;border-color:#00F;_background-color:#9CF!important;_border-color:#00F!important;}.dropdown{color:#666;background:none!important;text-decoration:none;}body.dragging #files_view .file_entry{background:white!important;border-color:#D3D3D3!important;}body.dragging #files_view .dragged_source{background-color:#9CF!important;border-color:#00F!important;}#files_view .files_details tbody tr:hover,#files_view .files_details tbody tr:hover td,#files_view .files_details tbody tr.hover td,#files_view .files_details tbody tr:hover td.name,#files_view .files_details tbody tr.hover td.name{background-color:#FFFACD;}#files_view .files_details tr.selected,#files_view .files_details tr.selected td{background-color:#9CF;}#folders_view .folder_tree_wrapper .selection{background-color:antiquewhite;}#files_view .files_details td.name{background-color:white;}#files_view .files_details td{border-color:#F1F1E3;}#files_view .message_content{background-color:#9CF;}.focus_inside{border-color:#5cacfd!important;}#panel_view .panel_widget{border-width:0;}#panel_view .focus_inside{border-width:0;}.drag_multiple div span{font-weight:bold;color:red;}
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/host.css b/src/main/webapp/plug-in/ckfinder/skins/v1/host.css
    new file mode 100644
    index 00000000..cb7dec2a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/skins/v1/host.css
    @@ -0,0 +1,8 @@
    +/*
    +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    +*/
    +
    +.cke_compatibility a,.cke_compatibility a:hover,.cke_compatibility a:active,.cke_compatibility a:visited{color:black;text-decoration:none;}.cke_compatibility,.cke_compatibility td,.cke_compatibility td *{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;line-height:1;border:0;}.cke_compatibility tbody{border:0;}.cke_compatibility .cke_accessibility{display:none;}.cke_compatibility table{width:auto;}.cke_compatibility{background-color:#FFF;}.cke_compatibility *{color:black;height:auto;border-collapse:collapse;padding:0;margin:0;vertical-align:baseline;white-space:nowrap;}.cke_compatibility pre,.cke_compatibility textarea{white-space:pre;}.cke_compatibility code,.cke_compatibility font{white-space:normal;}body .cke_dialog{visibility:visible;}.cke_skin_v1 table.cke_dialog.cke_browser_gecko{display:block;}.cke_skin_v1 .cke_dialog_body{margin-left:16px;margin-right:16px;margin-top:2px;margin-bottom:20px;z-index:1;position:relative;_position:static;}.cke_skin_v1 .cke_dialog_tl,.cke_skin_v1 .cke_dialog_tr,.cke_skin_v1 .cke_dialog_tc,.cke_skin_v1 .cke_dialog_bl,.cke_skin_v1 .cke_dialog_br,.cke_skin_v1 .cke_dialog_bc{background-image:url(images/sprites.png);background-repeat:no-repeat;position:absolute;_background-image:url(images/sprites_ie6.png);_z-index:-1;}.cke_skin_v1 .cke_dialog_tl{background-position:-16px -16px;height:16px;width:16px;top:0;left:0;}.cke_skin_v1 .cke_rtl .cke_dialog_tl{background-position:-16px -397px;}.cke_skin_v1 .cke_dialog_tr{background-position:-16px -76px;height:16px;width:16px;top:0;right:0;}.cke_skin_v1 .cke_rtl .cke_dialog_tr{background-position:-16px -457px;}.cke_skin_v1 .cke_dialog_tc{background-position:0 -136px;background-repeat:repeat-x;height:16px;top:0;left:16px;right:16px;}.cke_skin_v1 .cke_dialog_bl{background-position:-16px -196px;height:51px;width:30px;bottom:0;left:0;}.cke_skin_v1 .cke_rtl .cke_dialog_bl{background-position:-16px -517px;}.cke_skin_v1 .cke_dialog_br{background-position:-16px -263px;height:51px;width:30px;bottom:0;right:0;}.cke_skin_v1 .cke_rtl .cke_dialog_br{background-position:-16px -584px;}.cke_skin_v1 .cke_dialog_bc{background-position:0 -330px;background-repeat:repeat-x;height:51px;bottom:0;left:30px;right:30px;}.cke_skin_v1 .cke_dialog_ml,.cke_skin_v1 .cke_dialog_mr{background-image:url(images/dialog_sides.png);background-repeat:repeat-y;position:absolute;width:16px;top:16px;bottom:51px;_background-image:url(images/dialog_sides.gif);_top:auto;}.cke_skin_v1 .cke_rtl .cke_dialog_ml,.cke_skin_v1 .cke_rtl .cke_dialog_mr{background-image:url(images/dialog_sides_rtl.png);_background-image:url(images/dialog_sides.gif);}.cke_skin_v1 .cke_dialog_ml{background-position:0 0;left:0;}.cke_skin_v1 .cke_dialog_mr{background-position:-16px 0;right:0;}.cke_skin_v1 .cke_browser_iequirks .cke_dialog_ml,.cke_skin_v1 .cke_browser_iequirks .cke_dialog_mr{margin-top:3px;}.cke_skin_v1 .cke_dialog_title{font-weight:bold;font-size:14pt;color:#737357;background-color:#e3e3c7;padding:3px 10px 26px 10px;cursor:move;position:relative;}.cke_skin_v1 .cke_dialog_contents{background-color:#f1f1e3;border:#d5d59d 1px solid;overflow:auto;padding:5px 10px;}.cke_skin_v1 .cke_dialog_footer{background-color:#e3e3c7;text-align:right;}.cke_skin_v1 .cke_rtl .cke_dialog_footer{text-align:left;}.cke_skin_v1 .cke_dialog_page_contents{position:relative;}.cke_skin_v1 .cke_dialog_footer .cke_resizer{margin-top:21px;}.cke_skin_v1 .cke_dialog_tabs{height:23px;background-color:#e3e3c7;display:inline-block;margin-left:10px;margin-right:10px;margin-top:-23px;position:absolute;z-index:2;}.cke_skin_v1 .cke_rtl .cke_dialog_tabs{right:10px;}.cke_skin_v1 a.cke_dialog_tab,.cke_skin_v1 a:link.cke_dialog_tab,.cke_skin_v1 a:active.cke_dialog_tab,.cke_skin_v1 a:hover.cke_dialog_tab,.cke_skin_v1 a:visited.cke_dialog_tab{color:#737357;border-left:1px solid #d5d59d;border-right:1px solid #d5d59d;border-top:1px solid #d5d59d;height:14px;padding:4px 5px;display:inline-block;cursor:pointer;}.cke_skin_v1 .cke_browser_gecko18 a.cke_dialog_tab,.cke_skin_v1 .cke_browser_gecko18 a:link.cke_dialog_tab,.cke_skin_v1 .cke_browser_gecko18 a:active.cke_dialog_tab,.cke_skin_v1 .cke_browser_gecko18 a:hover.cke_dialog_tab,.cke_skin_v1 .cke_browser_gecko18 a:visited.cke_dialog_tab{display:inline;position:relative;top:6px;}
    +.cke_skin_v1 a:hover.cke_dialog_tab{background-color:#f1f1e3;}.cke_skin_v1 a.cke_dialog_tab_selected,.cke_skin_v1 a:link.cke_dialog_tab_selected,.cke_skin_v1 a:active.cke_dialog_tab_selected,.cke_skin_v1 a:hover.cke_dialog_tab_selected,.cke_skin_v1 a:visited.cke_dialog_tab_selected{border-bottom:1px solid #f1f1e3;background-color:#f1f1e3;font-weight:bold;cursor:default;}.cke_skin_v1 .cke_single_page .cke_dialog_tabs{display:none;}.cke_skin_v1 .cke_single_page .cke_dialog_title{padding-bottom:3px;}.cke_skin_v1 .cke_dialog_ui_vbox table,.cke_skin_v1 .cke_dialog_ui_hbox table{margin:auto;}.cke_skin_v1 .cke_dialog_ui_vbox_child{padding:5px 0;}.cke_skin_v1 input.cke_dialog_ui_input_text,.cke_skin_v1 input.cke_dialog_ui_input_password{background-color:white;border:none;padding:0;width:100%;height:14px;}.cke_skin_v1 div.cke_dialog_ui_input_text,.cke_skin_v1 div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_v1 textarea.cke_dialog_ui_input_textarea{background-color:white;border:none;padding:0;width:100%;_width:99%;overflow:auto;resize:none;}.cke_skin_v1 div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_v1 div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default;}.cke_skin_v1 .cke_dialog_ui_hbox{width:100%;}.cke_skin_v1 .cke_dialog_ui_hbox_first,.cke_skin_v1 .cke_dialog_ui_hbox_child,.cke_skin_v1 .cke_dialog_ui_hbox_last{vertical-align:top;}.cke_skin_v1 .cke_ltr .cke_dialog_ui_hbox_first,.cke_skin_v1 .cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px;}.cke_skin_v1 .cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_v1 .cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px;}.cke_skin_v1 a.cke_dialog_ui_button{border-collapse:separate;cursor:default;}.cke_skin_v1 span.cke_dialog_ui_button{border:#737357 1px solid;padding:2px 10px;text-align:center;color:#3b3b1f;background-color:#c7c78f;display:inline-block;cursor:default;}.cke_skin_v1 .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{display:block;}.cke_skin_v1 a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3;}.cke_skin_v1 a:focus span.cke_dialog_ui_button,.cke_skin_v1 a:active span.cke_dialog_ui_button{background-color:#e3e3c7;}.cke_skin_v1 .cke_dialog_footer_buttons{display:inline-table;margin-right:12px;margin-left:12px;width:auto;position:relative;}.cke_skin_v1 .cke_browser_gecko18 .cke_dialog_footer_buttons{display:inline;}.cke_skin_v1 .cke_dialog_footer_buttons span.cke_dialog_ui_button{width:60px;margin:7px 0;}.cke_skin_v1 strong{font-weight:bold;}.cke_skin_v1 .cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:-16px -651px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;_background-image:url(images/sprites_ie6.png);}.cke_skin_v1 .cke_dialog_close_button span{display:none;}.cke_skin_v1 .cke_dialog_close_button:hover{background-position:-16px -687px;}.cke_skin_v1 .cke_ltr .cke_dialog_close_button{right:10px;_right:22px;}.cke_skin_v1 .cke_rtl .cke_dialog_close_button{left:10px;_left:16px;_top:7px;}.cke_skin_v1 .cke_browser_ie6.cke_rtl .cke_dialog_close_button{position:relative;float:left;margin-top:-55px;margin-left:-7px;}.cke_skin_v1 .cke_browser_iequirks.cke_rtl.cke_single_page .cke_dialog_close_button{margin-top:-32px;}.cke_skin_v1 .cke_browser_iequirks.cke_ltr .cke_dialog_close_button{margin-top:0;}.cke_skin_v1 .cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white;}.cke_skin_v1 iframe.cke_dialog_ui_input_file{width:100%;height:25px;}.cke_skin_v1 .cke_dialog .cke_dark_background{background-color:#eaead1;}.cke_skin_v1 .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_v1 .cke_dialog .cke_centered{text-align:center;}.cke_skin_v1 .cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px;}.cke_skin_v1 .cke_rtl .cke_dialog a.cke_btn_reset{float:left;}
    +.cke_skin_v1 .cke_dialog a.cke_btn_locked,.cke_skin_v1 .cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px;}.cke_skin_v1 .cke_rtl .cke_dialog a.cke_btn_locked,.cke_skin_v1 .cke_rtl .cke_dialog a.cke_btn_unlocked{float:right;}.cke_skin_v1 .cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif);}.cke_skin_v1 .cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer;cursor:hand;}.cke_skin_v1 .cke_dialog #ImagePreviewBox{white-space:normal;border:2px ridge black;overflow:scroll;height:160px;width:230px;padding:2px;background-color:white;}.cke_skin_v1 .cke_dialog #ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4;}.cke_skin_v1 .cke_dialog #FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white;}.cke_skin_v1 .cke_dialog .cke_dark_background{text-align:center;background-color:#eaead1;font-size:14px;}.cke_skin_v1 .cke_dialog .cke_light_background{text-align:center;background-color:#ffffbe;}.cke_skin_v1 .cke_dialog .cke_hand{cursor:pointer;cursor:hand;}.cke_skin_v1 .cke_disabled,.cke_skin_v1 .cke_disabled label{color:#a0a0a0;}.cke_skin_v1 .cke_hc .cke_dialog_title,.cke_skin_v1 .cke_hc .cke_dialog_tabs,.cke_skin_v1 .cke_hc .cke_dialog_contents,.cke_skin_v1 .cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid;}.cke_skin_v1 .cke_hc .cke_dialog_title{border-top:1px solid;}.cke_skin_v1 .cke_hc .cke_dialog_footer{border-bottom:1px solid;}.cke_skin_v1 .cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;cursor:hand;font-weight:bold;position:relative;top:3px;}.cke_skin_v1 .cke_hc a.cke_btn_locked,.cke_skin_v1 .cke_hc a.cke_btn_unlocked,.cke_skin_v1 .cke_hc a.cke_btn_reset{border-style:solid;}.cke_skin_v1 a.cke_smile img{border:2px solid #eaead1;}.cke_skin_v1 a.cke_smile:focus img,.cke_skin_v1 a.cke_smile:active img,.cke_skin_v1 a.cke_smile:hover img{border-color:#C7C78F;}.ckfinder_loader_32{background:url("images/loaders/32x32.gif") 50% 50% no-repeat;}.cke_skin_v1 .cke_dialog_file_exist_options table{margin-bottom:10px;}.cke_skin_v1 .cke_dialog_remember_decision td{padding:10px;}.cke_skin_v1 .cke_dialog_error_msg strong{color:red;border:1px solid #FFF;padding:10px;margin-bottom:20px;display:block;}.cke_skin_v1 .cke_files_list{padding:10px 10% 0;line-height:1.2em;}.cke_skin_v1 .cke_files_list_many{height:5em;overflow:auto;}.cke_skin_v1 .cke_dialog_file_exist_options .cke_dialog_ui_labeled_label{margin-bottom:10px;}.cke_skin_v1 .cke_resizer{width:12px;height:12px;margin-top:16px;display:block;float:right;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -801px;background-repeat:no-repeat;cursor:se-resize;}.cke_skin_v1 .cke_browser_air .cke_resizer,.cke_skin_v1 .cke_browser_air .cke_rtl .cke_resizer{cursor:move;}.cke_skin_v1 .cke_rtl .cke_resizer{cursor:sw-resize;background-position:0 -828px;float:left;}.cke_skin_v1 .cke_resizer_horizontal,.cke_skin_v1 .cke_rtl .cke_resizer_horizontal{cursor:e-resize;}.cke_skin_v1 .cke_resizer_vertical,.cke_skin_v1 .cke_rtl .cke_resizer_vertical{cursor:n-resize;}.cke_skin_v1 .cke_maximized .cke_resizer{display:none;}.cke_skin_v1 .cke_dialog label{display:inline;margin-bottom:auto;cursor:default;}.cke_skin_v1 .cke_dialog_remember_decision td{padding:5px 0;}.cke_skin_v1 .cke_dialog_contents{width:100%;}
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckffolder.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckffolder.gif
    new file mode 100644
    index 00000000..f901c6af
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckffolder.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckffolderopened.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckffolderopened.gif
    new file mode 100644
    index 00000000..b0c72428
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckffolderopened.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckfminus.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckfminus.gif
    new file mode 100644
    index 00000000..30f3ec65
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckfminus.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckfnothumb.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckfnothumb.gif
    new file mode 100644
    index 00000000..adc127e7
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckfnothumb.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckfplus.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckfplus.gif
    new file mode 100644
    index 00000000..0250b1f0
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/ckfplus.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/dialog_sides.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/dialog_sides.gif
    new file mode 100644
    index 00000000..8f91b475
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/dialog_sides.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/dialog_sides.png b/src/main/webapp/plug-in/ckfinder/skins/v1/images/dialog_sides.png
    new file mode 100644
    index 00000000..1042a61c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/dialog_sides.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/dialog_sides_rtl.png b/src/main/webapp/plug-in/ckfinder/skins/v1/images/dialog_sides_rtl.png
    new file mode 100644
    index 00000000..d7f7b49f
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/dialog_sides_rtl.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons.png b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons.png
    new file mode 100644
    index 00000000..394ce895
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/ai.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/ai.gif
    new file mode 100644
    index 00000000..ba5a9131
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/ai.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/avi.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/avi.gif
    new file mode 100644
    index 00000000..6f3bac9b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/avi.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/bmp.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/bmp.gif
    new file mode 100644
    index 00000000..7708dd89
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/bmp.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/cs.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/cs.gif
    new file mode 100644
    index 00000000..4d927230
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/cs.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/default.icon.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/default.icon.gif
    new file mode 100644
    index 00000000..6ce26a4d
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/default.icon.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/dll.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/dll.gif
    new file mode 100644
    index 00000000..48d445ac
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/dll.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/doc.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/doc.gif
    new file mode 100644
    index 00000000..6535b4c0
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/doc.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/docx.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/docx.gif
    new file mode 100644
    index 00000000..6535b4c0
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/docx.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/exe.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/exe.gif
    new file mode 100644
    index 00000000..315817f5
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/exe.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/fla.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/fla.gif
    new file mode 100644
    index 00000000..8f91a98e
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/fla.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/gif.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/gif.gif
    new file mode 100644
    index 00000000..a5e3e6cf
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/gif.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/jpg.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/jpg.gif
    new file mode 100644
    index 00000000..634b3861
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/jpg.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/js.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/js.gif
    new file mode 100644
    index 00000000..4ea17d45
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/js.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/mdb.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/mdb.gif
    new file mode 100644
    index 00000000..0d7c1021
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/mdb.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/mp3.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/mp3.gif
    new file mode 100644
    index 00000000..6f3bac9b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/mp3.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/pdf.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/pdf.gif
    new file mode 100644
    index 00000000..ca1f94ac
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/pdf.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/ppt.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/ppt.gif
    new file mode 100644
    index 00000000..877a8c86
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/ppt.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/pptx.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/pptx.gif
    new file mode 100644
    index 00000000..877a8c86
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/pptx.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/rdp.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/rdp.gif
    new file mode 100644
    index 00000000..916cd7e6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/rdp.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/swf.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/swf.gif
    new file mode 100644
    index 00000000..314469da
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/swf.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/swt.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/swt.gif
    new file mode 100644
    index 00000000..314469da
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/swt.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/txt.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/txt.gif
    new file mode 100644
    index 00000000..1511ba3e
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/txt.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/vsd.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/vsd.gif
    new file mode 100644
    index 00000000..9be3daae
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/vsd.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/xls.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/xls.gif
    new file mode 100644
    index 00000000..f57715d6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/xls.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/xlsx.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/xlsx.gif
    new file mode 100644
    index 00000000..f57715d6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/xlsx.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/xml.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/xml.gif
    new file mode 100644
    index 00000000..45599287
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/xml.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/zip.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/zip.gif
    new file mode 100644
    index 00000000..b1e24921
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/16/zip.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/ai.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/ai.gif
    new file mode 100644
    index 00000000..699e6a38
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/ai.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/avi.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/avi.gif
    new file mode 100644
    index 00000000..97025bb6
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/avi.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/bmp.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/bmp.gif
    new file mode 100644
    index 00000000..f3c7f82a
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/bmp.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/cs.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/cs.gif
    new file mode 100644
    index 00000000..b62bd026
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/cs.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/default.icon.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/default.icon.gif
    new file mode 100644
    index 00000000..976997b1
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/default.icon.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/dll.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/dll.gif
    new file mode 100644
    index 00000000..9b549645
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/dll.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/doc.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/doc.gif
    new file mode 100644
    index 00000000..b557568b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/doc.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/docx.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/docx.gif
    new file mode 100644
    index 00000000..b557568b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/docx.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/exe.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/exe.gif
    new file mode 100644
    index 00000000..75849939
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/exe.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/fla.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/fla.gif
    new file mode 100644
    index 00000000..923079fc
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/fla.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/gif.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/gif.gif
    new file mode 100644
    index 00000000..df5f5795
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/gif.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/jpg.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/jpg.gif
    new file mode 100644
    index 00000000..de78363f
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/jpg.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/js.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/js.gif
    new file mode 100644
    index 00000000..fe0c98e9
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/js.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/mdb.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/mdb.gif
    new file mode 100644
    index 00000000..d3af9e87
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/mdb.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/mp3.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/mp3.gif
    new file mode 100644
    index 00000000..7d6360f2
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/mp3.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/pdf.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/pdf.gif
    new file mode 100644
    index 00000000..4950ec87
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/pdf.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/ppt.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/ppt.gif
    new file mode 100644
    index 00000000..023431c1
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/ppt.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/pptx.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/pptx.gif
    new file mode 100644
    index 00000000..023431c1
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/pptx.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/rdp.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/rdp.gif
    new file mode 100644
    index 00000000..b9eace7e
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/rdp.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/swf.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/swf.gif
    new file mode 100644
    index 00000000..5df7de57
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/swf.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/swt.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/swt.gif
    new file mode 100644
    index 00000000..7807c075
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/swt.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/txt.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/txt.gif
    new file mode 100644
    index 00000000..4e2c2e3c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/txt.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/vsd.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/vsd.gif
    new file mode 100644
    index 00000000..7624697c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/vsd.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/xls.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/xls.gif
    new file mode 100644
    index 00000000..afe724a3
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/xls.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/xlsx.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/xlsx.gif
    new file mode 100644
    index 00000000..afe724a3
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/xlsx.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/xml.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/xml.gif
    new file mode 100644
    index 00000000..4fae3566
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/xml.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/zip.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/zip.gif
    new file mode 100644
    index 00000000..7157f72a
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/icons/32/zip.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/loaders/16x16.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/loaders/16x16.gif
    new file mode 100644
    index 00000000..9dd71fd5
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/loaders/16x16.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/loaders/32x32.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/loaders/32x32.gif
    new file mode 100644
    index 00000000..bca96650
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/loaders/32x32.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/spacer.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/spacer.gif
    new file mode 100644
    index 00000000..5bfd67a2
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/spacer.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/sprites.png b/src/main/webapp/plug-in/ckfinder/skins/v1/images/sprites.png
    new file mode 100644
    index 00000000..982717bf
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/sprites.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/sprites_ie6.png b/src/main/webapp/plug-in/ckfinder/skins/v1/images/sprites_ie6.png
    new file mode 100644
    index 00000000..4389b65b
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/sprites_ie6.png differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/add.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/add.gif
    new file mode 100644
    index 00000000..a8a33fa5
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/add.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/clear_basket.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/clear_basket.gif
    new file mode 100644
    index 00000000..48013823
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/clear_basket.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/delete.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/delete.gif
    new file mode 100644
    index 00000000..48013823
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/delete.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/download.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/download.gif
    new file mode 100644
    index 00000000..31225f35
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/download.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/help.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/help.gif
    new file mode 100644
    index 00000000..1931b56f
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/help.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/maximize.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/maximize.gif
    new file mode 100644
    index 00000000..815dea83
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/maximize.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/refresh.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/refresh.gif
    new file mode 100644
    index 00000000..9c25f984
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/refresh.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/settings.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/settings.gif
    new file mode 100644
    index 00000000..82d3072d
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/settings.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/view.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/view.gif
    new file mode 100644
    index 00000000..f058cfc3
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar/view.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar_start.gif b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar_start.gif
    new file mode 100644
    index 00000000..1774246c
    Binary files /dev/null and b/src/main/webapp/plug-in/ckfinder/skins/v1/images/toolbar_start.gif differ
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/richcombo.css b/src/main/webapp/plug-in/ckfinder/skins/v1/richcombo.css
    new file mode 100644
    index 00000000..d25295e1
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/skins/v1/richcombo.css
    @@ -0,0 +1,7 @@
    +/*
    +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    +*/
    +
    +.cke_skin_v1 .cke_rcombo{display:inline-block;margin-left:2px;margin-right:2px;margin-top:2px;vertical-align:top;float:left;}.cke_skin_v1 .cke_browser_ie .cke_rcombo{#float:none;#display:inline;}.cke_skin_v1 .cke_rtl .cke_rcombo{float:right;}.cke_skin_v1 .cke_browser_ie .cke_rcombo{#float:none;}.cke_skin_v1 .cke_rcombopanel{border:1px solid #316ac5;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;}.cke_skin_v1 .cke_rcombo a{display:inline-block;float:left;filter:alpha(opacity=70);opacity:.70;}.cke_skin_v1 .cke_rtl .cke_rcombo a{float:right;}.cke_skin_v1 .cke_hc .cke_rcombo a{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_v1 .cke_rcombo .cke_label{display:inline-block;float:left;line-height:24px;height:24px;vertical-align:top;padding-left:4px;padding-right:5px;filter:alpha(opacity=70);opacity:.70;background-color:#f1f1e3;}.cke_skin_v1 .cke_rtl .cke_rcombo .cke_label{float:right;padding-right:4px;padding-left:5px;}.cke_skin_v1 .cke_hc .cke_rcombo .cke_label{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_v1 .cke_rcombo .cke_inline_label{color:#fff;}.cke_skin_v1 .cke_rcombo .cke_text{border:1px solid #8f8f73;background-color:#fff;height:14px;width:60px;padding-top:4px;padding-bottom:4px;padding-left:5px;padding-right:5px;text-overflow:ellipsis;overflow:hidden;display:inline-block;vertical-align:top;}.cke_skin_v1 .cke_ltr .cke_rcombo .cke_text{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.cke_skin_v1 .cke_rtl .cke_rcombo .cke_text{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}.cke_skin_v1 .cke_browser_iequirks .cke_rcombo .cke_text{height:22px;}.cke_skin_v1 .cke_rcombo .cke_openbutton{display:inline-block;background-position:5px -715px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;border-top:1px solid #8f8f73;border-bottom:1px solid #8f8f73;width:14px;height:22px;}.cke_skin_v1 .cke_ltr .cke_rcombo .cke_openbutton{border-right:1px solid #8f8f73;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}.cke_skin_v1 .cke_rtl .cke_rcombo .cke_openbutton{border-left:1px solid #8f8f73;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.cke_skin_v1 .cke_rcombo .cke_off a:hover,.cke_skin_v1 .cke_rcombo .cke_off a:focus,.cke_skin_v1 .cke_rcombo .cke_off a:active,.cke_skin_v1 .cke_rcombo .cke_on a{filter:alpha(opacity=100);opacity:1;}.cke_skin_v1 .cke_rcombo .cke_off a:hover .cke_text,.cke_skin_v1 .cke_rcombo .cke_off a:focus .cke_text,.cke_skin_v1 .cke_rcombo .cke_off a:active .cke_text,.cke_skin_v1 .cke_rcombo .cke_on .cke_text{border-color:#316ac5;}.cke_skin_v1 .cke_rcombo .cke_off a:hover .cke_openbutton,.cke_skin_v1 .cke_rcombo .cke_off a:focus .cke_openbutton,.cke_skin_v1 .cke_rcombo .cke_off a:active .cke_openbutton,.cke_skin_v1 .cke_rcombo .cke_on .cke_openbutton{border-color:#316ac5;background-color:#dff1ff;}.cke_skin_v1 .cke_rcombo .cke_on .cke_text{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;}.cke_skin_v1 .cke_rcombo .cke_on .cke_openbutton{-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;}.cke_skin_v1 .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.3;}.cke_skin_v1 .cke_hc .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=70);opacity:.7;}.cke_skin_v1 .cke_rcombo .cke_disabled .cke_text,.cke_skin_v1 .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);opacity:.5;}.cke_skin_v1 .cke_hc .cke_rcombo .cke_disabled .cke_text,.cke_skin_v1 .cke_hc .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=80);opacity:.8;}
    +.cke_skin_v1 .cke_rcombo .cke_disabled .cke_text{color:#fff;}.cke_skin_v1 .cke_browser_gecko18 .cke_rcombo,.cke_skin_v1 .cke_browser_gecko18 .cke_rcombo .cke_label,.cke_skin_v1 .cke_browser_gecko18 .cke_rcombo .cke_text,.cke_skin_v1 .cke_browser_gecko18 .cke_rcombo .cke_openbutton,.cke_skin_v1 .cke_browser_webkit .cke_rcombo .cke_label,.cke_skin_v1 .cke_browser_webkit .cke_rcombo .cke_text,.cke_skin_v1 .cke_browser_webkit .cke_rcombo .cke_openbutton{display:block;float:left;}.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_rcombo,.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_label,.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_text,.cke_skin_v1 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_openbutton,.cke_skin_v1 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_label,.cke_skin_v1 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_text,.cke_skin_v1 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_openbutton{float:right;}.cke_skin_v1 .cke_browser_ie .cke_rtl .cke_rcombo,.cke_skin_v1 .cke_browser_ie .cke_rtl .cke_rcombo a,.cke_skin_v1 .cke_browser_ie .cke_rtl .cke_rcombo .cke_label{float:none;}
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/skin.js b/src/main/webapp/plug-in/ckfinder/skins/v1/skin.js
    new file mode 100644
    index 00000000..98bc0619
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/skins/v1/skin.js
    @@ -0,0 +1,5 @@
    +锘/*
    +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    +*/
    +CKFINDER.skins.add('v1',(function(){var a=['images/loaders/16x16.gif','images/loaders/32x32.gif','images/ckffolder.gif','images/ckffolderopened.gif'];if(CKFINDER.env.ie&&CKFINDER.env.version<7)a.push('images/sprites_ie6.png');return{preload:a,application:{css:['app.css']},fixMainContentWidth:1,fixMainContentWidthValue:-8,marginSidebarContainer:0,host:{intoHostPage:1,css:['host.css']}};})());(function(){CKFINDER.dialog?a():CKFINDER.on('dialogPluginReady',a);function a(){CKFINDER.dialog.on('resize',function(b){var c=b.data,d=c.width,e=c.height,f=c.dialog,g=f.parts.contents;if(c.skin!='v1')return;g.setStyles({width:d+'px',height:e+'px'});setTimeout(function(){var h=f.parts.dialog.getChild([0,0,0]),i=h.getChild(0),j=h.getChild(2);j.setStyle('width',i.$.offsetWidth+'px');j=h.getChild(7);j.setStyle('width',i.$.offsetWidth-28+'px');j=h.getChild(4);j.setStyle('height',i.$.offsetHeight-31-14+'px');j=h.getChild(5);j.setStyle('height',i.$.offsetHeight-31-14+'px');},100);});};})();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/ckfinder/skins/v1/uipanel.css b/src/main/webapp/plug-in/ckfinder/skins/v1/uipanel.css
    new file mode 100644
    index 00000000..5abfd9d1
    --- /dev/null
    +++ b/src/main/webapp/plug-in/ckfinder/skins/v1/uipanel.css
    @@ -0,0 +1,8 @@
    +/*
    +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
    +For licensing, see LICENSE.html or http://cksource.com/license/ckfinder
    +*/
    +
    +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}:focus{outline:0;}ins{text-decoration:none;}del{text-decoration:line-through;}table{border-collapse:collapse;border-spacing:0;}body{font:9pt/1.5em Arial,Helvetica,sans-serif;}pre,code,tt{font:1em/1.5em 'Andale Mono','Lucida Console',monospace;}h1,h2,h3,h4,h5,h6,b,strong{font-weight:bold;}em,i,dfn{font-style:italic;}dfn{font-weight:bold;}p,code,pre,kbd{margin:0 0 1.5em 0;}blockquote{margin:0 1.5em 1.5em 1.5em;}li ul,li ol{margin:0 1.5em;}ul,ol{margin:0 1.5em 1.5em 1.5em;}ul,ul li{list-style-type:disc;}ol,ol li{list-style-type:decimal;}dl{margin:0 0 1.5em 0;}dl dt{font-weight:bold;}dd{margin-left:1.5em;}table{margin-bottom:1.4em;width:100%;}th{font-weight:bold;}th,td,caption{padding:4px 10px 4px 5px;}tfoot{font-style:italic;}sup,sub{line-height:0;}abbr,acronym{border-bottom:1px dotted;}address{margin:0 0 1.5em;font-style:italic;}del{text-decoration:line-through;}pre{margin:1.5em 0;white-space:pre;}img.centered,.aligncenter,div.aligncenter{display:block;margin-left:auto;margin-right:auto;}img.alignright{display:inline;}img.alignleft{display:inline;}.alignright{float:right;margin-left:10px;}.alignleft{float:left;margin-right:10px;}.clearfix::after,.group::after{content:".";display:block;height:0;clear:both;visibility:hidden;}*:first-child+html .clearfix{zoom:1;display:block;}* html .clearfix{zoom:1;display:block;}*:first-child+html .group{zoom:1;display:block;}* html .group{zoom:1;display:block;}.cke_compatibility a,.cke_compatibility a:hover,.cke_compatibility a:active,.cke_compatibility a:visited{color:black;text-decoration:none;}.cke_compatibility,.cke_compatibility td,.cke_compatibility td *{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;line-height:1;border:0;}.cke_compatibility tbody{border:0;}.cke_compatibility .cke_accessibility{display:none;}.cke_compatibility table{width:auto;}.cke_compatibility{background-color:#FFF;}.cke_compatibility *{color:black;height:auto;border-collapse:collapse;padding:0;margin:0;vertical-align:baseline;white-space:nowrap;}.cke_compatibility pre,.cke_compatibility textarea{white-space:pre;}.cke_compatibility code,.cke_compatibility font{white-space:normal;}.cke_skin_v1 .cke_contextmenu{padding:2px;}.cke_skin_v1 .cke_menuitem a{display:block;}.cke_skin_v1 .cke_menuitem span{cursor:default;}.cke_skin_v1 .cke_menuitem a:hover,.cke_skin_v1 .cke_menuitem a:focus,.cke_skin_v1 .cke_menuitem a:active{background-color:#8f8f73;display:block;}.cke_skin_v1 .cke_menuitem a.cke_disabled:hover,.cke_skin_v1 .cke_menuitem a.cke_disabled:focus,.cke_skin_v1 .cke_menuitem a.cke_disabled:active{background-color:transparent!important;}.cke_skin_v1 .cke_menuitem .cke_icon{width:16px;height:16px;float:left;}.cke_skin_v1 .cke_menuitem .cke_disabled .cke_icon{filter:alpha(opacity=70);opacity:.70;}.cke_skin_v1 .cke_menuitem .cke_icon_wrapper{background-color:#e3e3c7;border:solid 4px #e3e3c7;width:16px;height:16px;float:left;filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_v1 .cke_menuitem .cke_icon_wrapper{float:right;}.cke_skin_v1 .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_v1 .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_v1 .cke_menuitem a:active .cke_icon_wrapper{background-color:#9d9d9d;border:solid 4px #9d9d9d;filter:alpha(opacity=70);opacity:.70;}.cke_skin_v1 .cke_menuitem a:hover.cke_disabled .cke_icon_wrapper,.cke_skin_v1 .cke_menuitem a:focus.cke_disabled .cke_icon_wrapper,.cke_skin_v1 .cke_menuitem a:active.cke_disabled .cke_icon_wrapper{background-color:#e3e3c7;border:solid 4px #e3e3c7;}.cke_skin_v1 .cke_menuitem .cke_label{display:block;padding-right:3px;padding-top:5px;padding-left:4px;height:19px;margin-left:24px;background-color:#fff;}
    +.cke_skin_v1 .cke_frameLoaded .cke_menuitem .cke_label{filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_v1 .cke_menuitem .cke_label{padding-right:0;margin-left:0;padding-left:3px;margin-right:28px;}.cke_skin_v1 .cke_menuitem a.cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.30;}.cke_skin_v1 .cke_menuitem a:hover .cke_label,.cke_skin_v1 .cke_menuitem a:focus .cke_label,.cke_skin_v1 .cke_menuitem a:active .cke_label{background-color:#8f8f73;color:white;}.cke_skin_v1 .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_v1 .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_v1 .cke_menuitem a.cke_disabled:active .cke_label{background-color:transparent;color:black;}.cke_skin_v1 .cke_menuseparator{background-color:#e3e3c7;height:2px;filter:alpha(opacity=70);opacity:.70;_font-size:0;}.cke_skin_v1 .cke_menuarrow{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -784px;background-repeat:no-repeat;height:5px;width:3px;float:right;margin-right:2px;margin-top:3px;}.cke_rtl .cke_skin_v1 .cke_menuarrow{float:left;margin-right:0;margin-left:2px;background-position:0 -763px;}.cke_browser_ie.cke_ltr .cke_skin_v1 .cke_menuarrow{position:absolute;right:2px;}.cke_browser_ie.cke_rtl .cke_skin_v1 .cke_menuarrow{position:absolute;left:2px;}.cke_skin_v1 .cke_panel{border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.cke_skin_v1 .cke_panel iframe{width:100%;height:100%;}html.cke_skin_v1_container{overflow:auto;overflow-x:hidden;}body.cke_panel_frame{overflow:auto;overflow-x:hidden;}ul.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap;}li.cke_panel_listItem{margin:0;}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit;text-decoration:none;overflow:hidden;text-overflow:ellipsis;}* html .cke_panel_listItem a{width:100%;color:#000;}*:first-child+html .cke_panel_listItem a{color:#000;}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff;}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff;}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px;}html.cke_skin_v1_container{visibility:visible;}.cke_skin_v1 .ckf_uploadButtons span.cke_dialog_ui_button{width:110px;padding:2px;}.cke_skin_v1 .ckf_uploadButtons .cke_dialog_ui_button{margin:1px 0;}.cke_skin_v1 .ckf_uploadButtons a.cke_dialog_ui_button_ok span,.cke_skin_v1 .ckf_uploadButtons a.cke_dialog_ui_button_cancel span{background-image:none;padding:2px;}.cke_skin_v1 .cke_button_TruncateBasket .cke_icon{background:url('images/toolbar/clear_basket.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_settings .cke_icon{background:url('images/toolbar/settings.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_refresh .cke_icon{background:url('images/toolbar/refresh.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_upload .cke_icon{background:url('images/toolbar/add.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_help .cke_icon{background:url('images/toolbar/help.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_downloadFile .cke_icon{background:url('images/toolbar/download.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_viewFile .cke_icon{background:url('images/toolbar/view.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_deleteFile .cke_icon,.cke_skin_v1 .cke_button_deleteFiles .cke_icon{background:url('images/toolbar/delete.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_removeFolder .cke_icon{background:url('images/toolbar/delete.gif') no-repeat 0 0;}.cke_skin_v1 .cke_button_maximize .cke_icon{background:url('images/toolbar/maximize.gif') no-repeat 0 0;}#folders_view .folder_tree li a{background:url('images/ckffolder.gif') 3px 0 no-repeat;}.cke_rtl #folders_view .folder_tree li a{background-position:right;}#folders_view .folder_tree li.closable a{background-image:url('images/ckffolderopened.gif');}
    +#folders_view .folder_tree li.openable a{background-image:url('images/ckffolder.gif');}#folders_view .folder_tree li.nochildren a{background-image:url('images/ckffolder.gif');}#folders_view .folder_tree li a.processing{background-image:url('images/loaders/16x16.gif');}#folders_view .folder_tree li.closable .expander{background-image:url('images/ckfminus.gif');}#folders_view .folder_tree li.openable .expander{background-image:url('images/ckfplus.gif');}#files_view .files_thumbnails .processing div.image{background:url("images/loaders/32x32.gif") 50% 50% no-repeat;}
    diff --git a/src/main/webapp/plug-in/clipboard/ZeroClipboard.js b/src/main/webapp/plug-in/clipboard/ZeroClipboard.js
    new file mode 100644
    index 00000000..44dfca0f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/clipboard/ZeroClipboard.js
    @@ -0,0 +1,311 @@
    +// Simple Set Clipboard System
    +// Author: Joseph Huckaby
    +
    +var ZeroClipboard = {
    +	
    +	version: "1.0.7",
    +	clients: {}, // registered upload clients on page, indexed by id
    +	moviePath: 'plug-in/clipboard/ZeroClipboard.swf', // URL to movie
    +	nextId: 1, // ID of next movie
    +	
    +	$: function(thingy) {
    +		// simple DOM lookup utility function
    +		if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
    +		if (!thingy.addClass) {
    +			// extend element with a few useful methods
    +			thingy.hide = function() { this.style.display = 'none'; };
    +			thingy.show = function() { this.style.display = ''; };
    +			thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
    +			thingy.removeClass = function(name) {
    +				var classes = this.className.split(/\s+/);
    +				var idx = -1;
    +				for (var k = 0; k < classes.length; k++) {
    +					if (classes[k] == name) { idx = k; k = classes.length; }
    +				}
    +				if (idx > -1) {
    +					classes.splice( idx, 1 );
    +					this.className = classes.join(' ');
    +				}
    +				return this;
    +			};
    +			thingy.hasClass = function(name) {
    +				return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
    +			};
    +		}
    +		return thingy;
    +	},
    +	
    +	setMoviePath: function(path) {
    +		// set path to ZeroClipboard.swf
    +		this.moviePath = path;
    +	},
    +	
    +	dispatch: function(id, eventName, args) {
    +		// receive event from flash movie, send to client		
    +		var client = this.clients[id];
    +		if (client) {
    +			client.receiveEvent(eventName, args);
    +		}
    +	},
    +	
    +	register: function(id, client) {
    +		// register new client to receive events
    +		this.clients[id] = client;
    +	},
    +	
    +	getDOMObjectPosition: function(obj, stopObj) {
    +		// get absolute coordinates for dom element
    +		var info = {
    +			left: 0, 
    +			top: 0, 
    +			width: obj.width ? obj.width : obj.offsetWidth, 
    +			height: obj.height ? obj.height : obj.offsetHeight
    +		};
    +
    +		while (obj && (obj != stopObj)) {
    +			info.left += obj.offsetLeft;
    +			info.top += obj.offsetTop;
    +			obj = obj.offsetParent;
    +		}
    +
    +		return info;
    +	},
    +	
    +	Client: function(elem) {
    +		// constructor for new simple upload client
    +		this.handlers = {};
    +		
    +		// unique ID
    +		this.id = ZeroClipboard.nextId++;
    +		this.movieId = 'ZeroClipboardMovie_' + this.id;
    +		
    +		// register client with singleton to receive flash events
    +		ZeroClipboard.register(this.id, this);
    +		
    +		// create movie
    +		if (elem) this.glue(elem);
    +	}
    +};
    +
    +ZeroClipboard.Client.prototype = {
    +	
    +	id: 0, // unique ID for us
    +	ready: false, // whether movie is ready to receive events or not
    +	movie: null, // reference to movie object
    +	clipText: '', // text to copy to clipboard
    +	handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
    +	cssEffects: true, // enable CSS mouse effects on dom container
    +	handlers: null, // user event handlers
    +	
    +	glue: function(elem, appendElem, stylesToAdd) {
    +		// glue to DOM element
    +		// elem can be ID or actual DOM element object
    +		this.domElement = ZeroClipboard.$(elem);
    +		
    +		// float just above object, or zIndex 99 if dom element isn't set
    +		var zIndex = 99999;
    +		if (this.domElement.style.zIndex) {
    +			zIndex = parseInt(this.domElement.style.zIndex, 10) + 1;
    +		}
    +		
    +		if (typeof(appendElem) == 'string') {
    +			appendElem = ZeroClipboard.$(appendElem);
    +		}
    +		else if (typeof(appendElem) == 'undefined') {
    +			appendElem = document.getElementsByTagName('body')[0];
    +		}
    +		
    +		// find X/Y position of domElement
    +		var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem);
    +		
    +		// create floating DIV above element
    +		this.div = document.createElement('div');
    +		var style = this.div.style;
    +		style.position = 'absolute';
    +		style.left = '' + box.left + 'px';
    +		style.top = '' + box.top + 'px';
    +		style.width = '' + box.width + 'px';
    +		style.height = '' + box.height + 'px';
    +		style.zIndex = zIndex;
    +		
    +		if (typeof(stylesToAdd) == 'object') {
    +			for (addedStyle in stylesToAdd) {
    +				style[addedStyle] = stylesToAdd[addedStyle];
    +			}
    +		}
    +		
    +//		 style.backgroundColor = '#f00'; // debug
    +		
    +		appendElem.appendChild(this.div);
    +		
    +		this.div.innerHTML = this.getHTML( box.width, box.height );
    +	},
    +	
    +	getHTML: function(width, height) {
    +		// return HTML for movie
    +		var html = '';
    +		var flashvars = 'id=' + this.id + 
    +			'&width=' + width + 
    +			'&height=' + height;
    +			
    +		if (navigator.userAgent.match(/MSIE/)) {
    +			// IE gets an OBJECT tag
    +			var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
    +			html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>';
    +		}
    +		else {
    +			// all other browsers get an EMBED tag
    +			html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';
    +		}
    +		return html;
    +	},
    +	
    +	hide: function() {
    +		// temporarily hide floater offscreen
    +		if (this.div) {
    +			this.div.style.left = '-2000px';
    +		}
    +	},
    +	
    +	show: function() {
    +		// show ourselves after a call to hide()
    +		this.reposition();
    +	},
    +	
    +	destroy: function() {
    +		// destroy control and floater
    +		if (this.domElement && this.div) {
    +			this.hide();
    +			this.div.innerHTML = '';
    +			
    +			var body = document.getElementsByTagName('body')[0];
    +			try { body.removeChild( this.div ); } catch(e) {;}
    +			
    +			this.domElement = null;
    +			this.div = null;
    +		}
    +	},
    +	
    +	reposition: function(elem) {
    +		// reposition our floating div, optionally to new container
    +		// warning: container CANNOT change size, only position
    +		if (elem) {
    +			this.domElement = ZeroClipboard.$(elem);
    +			if (!this.domElement) this.hide();
    +		}
    +		
    +		if (this.domElement && this.div) {
    +			var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
    +			var style = this.div.style;
    +			style.left = '' + box.left + 'px';
    +			style.top = '' + box.top + 'px';
    +		}
    +	},
    +	
    +	setText: function(newText) {
    +		// set text to be copied to clipboard
    +		this.clipText = newText;
    +		if (this.ready) this.movie.setText(newText);
    +	},
    +	
    +	addEventListener: function(eventName, func) {
    +		// add user event listener for event
    +		// event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
    +		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
    +		if (!this.handlers[eventName]) this.handlers[eventName] = [];
    +		this.handlers[eventName].push(func);
    +	},
    +	
    +	setHandCursor: function(enabled) {
    +		// enable hand cursor (true), or default arrow cursor (false)
    +		this.handCursorEnabled = enabled;
    +		if (this.ready) this.movie.setHandCursor(enabled);
    +	},
    +	
    +	setCSSEffects: function(enabled) {
    +		// enable or disable CSS effects on DOM container
    +		this.cssEffects = !!enabled;
    +	},
    +	
    +	receiveEvent: function(eventName, args) {
    +		// receive event from flash
    +		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
    +				
    +		// special behavior for certain events
    +		switch (eventName) {
    +			case 'load':
    +				// movie claims it is ready, but in IE this isn't always the case...
    +				// bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
    +				this.movie = document.getElementById(this.movieId);
    +				if (!this.movie) {
    +					var self = this;
    +					setTimeout( function() { self.receiveEvent('load', null); }, 1 );
    +					return;
    +				}
    +				
    +				// firefox on pc needs a "kick" in order to set these in certain cases
    +				if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
    +					var self = this;
    +					setTimeout( function() { self.receiveEvent('load', null); }, 100 );
    +					this.ready = true;
    +					return;
    +				}
    +				
    +				this.ready = true;
    +				this.movie.setText( this.clipText );
    +				this.movie.setHandCursor( this.handCursorEnabled );
    +				break;
    +			
    +			case 'mouseover':
    +				if (this.domElement && this.cssEffects) {
    +					this.domElement.addClass('hover');
    +					if (this.recoverActive) this.domElement.addClass('active');
    +				}
    +				break;
    +			
    +			case 'mouseout':
    +				if (this.domElement && this.cssEffects) {
    +					this.recoverActive = false;
    +					if (this.domElement.hasClass('active')) {
    +						this.domElement.removeClass('active');
    +						this.recoverActive = true;
    +					}
    +					this.domElement.removeClass('hover');
    +				}
    +				break;
    +			
    +			case 'mousedown':
    +				if (this.domElement && this.cssEffects) {
    +					this.domElement.addClass('active');
    +				}
    +				break;
    +			
    +			case 'mouseup':
    +				if (this.domElement && this.cssEffects) {
    +					this.domElement.removeClass('active');
    +					this.recoverActive = false;
    +				}
    +				break;
    +		} // switch eventName
    +		
    +		if (this.handlers[eventName]) {
    +			for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
    +				var func = this.handlers[eventName][idx];
    +			
    +				if (typeof(func) == 'function') {
    +					// actual function reference
    +					func(this, args);
    +				}
    +				else if ((typeof(func) == 'object') && (func.length == 2)) {
    +					// PHP style object + method, i.e. [myObject, 'myMethod']
    +					func[0][ func[1] ](this, args);
    +				}
    +				else if (typeof(func) == 'string') {
    +					// name of function
    +					window[func](this, args);
    +				}
    +			} // foreach event handler defined
    +		} // user defined handler for event
    +	}
    +	
    +};
    diff --git a/src/main/webapp/plug-in/clipboard/ZeroClipboard.swf b/src/main/webapp/plug-in/clipboard/ZeroClipboard.swf
    new file mode 100644
    index 00000000..13bf8e39
    Binary files /dev/null and b/src/main/webapp/plug-in/clipboard/ZeroClipboard.swf differ
    diff --git a/src/main/webapp/plug-in/datatables/css/bootstrap.css b/src/main/webapp/plug-in/datatables/css/bootstrap.css
    new file mode 100644
    index 00000000..ea4ad9e6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/css/bootstrap.css
    @@ -0,0 +1,2736 @@
    +html,body {
    +	margin: 0;
    +	padding: 0;
    +}
    +
    +h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,cite,code,del,dfn,em,img,q,s,samp,small,strike,strong,sub,sup,tt,var,dd,dl,dt,li,ol,ul,fieldset,form,label,legend,button,table,caption,tbody,tfoot,thead,tr,th,td
    +	{
    +	margin: 0;
    +	padding: 0;
    +	border: 0;
    +	font-weight: normal;
    +	font-style: normal;
    +	font-size: 100%;
    +	line-height: 1;
    +	font-family: inherit;
    +}
    +
    +table {
    +	border-collapse: collapse;
    +	border-spacing: 0;
    +}
    +
    +ol,ul {
    +	list-style: none;
    +}
    +
    +q:before,q:after,blockquote:before,blockquote:after {
    +	content: "";
    +}
    +
    +html {
    +	overflow-y: scroll;
    +	font-size: 100%;
    +	-webkit-text-size-adjust: 100%;
    +	-ms-text-size-adjust: 100%;
    +}
    +
    +a:focus {
    +	outline: thin dotted;
    +}
    +
    +a:hover,a:active {
    +	outline: 0;
    +}
    +
    +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section
    +	{
    +	display: block;
    +}
    +
    +audio,canvas,video {
    +	display: inline-block;
    +	*display: inline;
    +	*zoom: 1;
    +}
    +
    +audio:not ([controls] ){
    +	display: none;
    +}
    +
    +sub,sup {
    +	font-size: 75%;
    +	line-height: 0;
    +	position: relative;
    +	vertical-align: baseline;
    +}
    +
    +sup {
    +	top: -0.5em;
    +}
    +
    +sub {
    +	bottom: -0.25em;
    +}
    +
    +img {
    +	border: 0;
    +	-ms-interpolation-mode: bicubic;
    +}
    +
    +button,input,select,textarea {
    +	font-size: 100%;
    +	margin: 0;
    +	vertical-align: baseline;
    +	*vertical-align: middle;
    +}
    +
    +button,input {
    +	line-height: normal;
    +	*overflow: visible;
    +}
    +
    +button::-moz-focus-inner,input::-moz-focus-inner {
    +	border: 0;
    +	padding: 0;
    +}
    +
    +button,input[type="button"],input[type="reset"],input[type="submit"] {
    +	cursor: pointer;
    +	-webkit-appearance: button;
    +}
    +
    +input[type="search"] {
    +	-webkit-appearance: textfield;
    +	-webkit-box-sizing: content-box;
    +	-moz-box-sizing: content-box;
    +	box-sizing: content-box;
    +}
    +
    +input[type="search"]::-webkit-search-decoration {
    +	-webkit-appearance: none;
    +}
    +
    +textarea {
    +	overflow: auto;
    +	vertical-align: top;
    +}
    +
    +body {
    +	background-color: #ffffff;
    +	margin: 0;
    +	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    +	font-size: 13px;
    +	font-weight: normal;
    +	line-height: 18px;
    +	color: #404040;
    +}
    +
    +.container {
    +	width: 940px;
    +	margin-left: auto;
    +	margin-right: auto;
    +	zoom: 1;
    +}
    +
    +.container:before,.container:after {
    +	display: table;
    +	content: "";
    +	zoom: 1;
    +}
    +
    +.container:after {
    +	clear: both;
    +}
    +
    +.container-fluid {
    +	position: relative;
    +	min-width: 940px;
    +	padding-left: 20px;
    +	padding-right: 20px;
    +	zoom: 1;
    +}
    +
    +.container-fluid:before,.container-fluid:after {
    +	display: table;
    +	content: "";
    +	zoom: 1;
    +}
    +
    +.container-fluid:after {
    +	clear: both;
    +}
    +
    +.container-fluid>.sidebar {
    +	position: absolute;
    +	top: 0;
    +	left: 20px;
    +	width: 220px;
    +}
    +
    +.container-fluid>.content {
    +	margin-left: 240px;
    +}
    +
    +a {
    +	color: #0069d6;
    +	text-decoration: none;
    +	line-height: inherit;
    +	font-weight: inherit;
    +}
    +
    +a:hover {
    +	color: #00438a;
    +	text-decoration: underline;
    +}
    +
    +.pull-right {
    +	float: right;
    +}
    +
    +.pull-left {
    +	float: left;
    +}
    +
    +.hide {
    +	display: none;
    +}
    +
    +.show {
    +	display: block;
    +}
    +
    +.row {
    +	zoom: 1;
    +	margin-left: -20px;
    +}
    +
    +.row:before,.row:after {
    +	display: table;
    +	content: "";
    +	zoom: 1;
    +}
    +
    +.row:after {
    +	clear: both;
    +}
    +
    +.row>[class *="span"] {
    +	display: inline;
    +	float: left;
    +	margin-left: 20px;
    +}
    +
    +.span1 {
    +	width: 40px;
    +}
    +
    +.span2 {
    +	width: 100px;
    +}
    +
    +.span3 {
    +	width: 160px;
    +}
    +
    +.span4 {
    +	width: 220px;
    +}
    +
    +.span5 {
    +	width: 280px;
    +}
    +
    +.span6 {
    +	width: 340px;
    +}
    +
    +.span7 {
    +	width: 400px;
    +}
    +
    +.span8 {
    +	width: 460px;
    +}
    +
    +.span9 {
    +	width: 520px;
    +}
    +
    +.span10 {
    +	width: 580px;
    +}
    +
    +.span11 {
    +	width: 640px;
    +}
    +
    +.span12 {
    +	width: 700px;
    +}
    +
    +.span13 {
    +	width: 760px;
    +}
    +
    +.span14 {
    +	width: 820px;
    +}
    +
    +.span15 {
    +	width: 880px;
    +}
    +
    +.span16 {
    +	width: 940px;
    +}
    +
    +.span17 {
    +	width: 1000px;
    +}
    +
    +.span18 {
    +	width: 1060px;
    +}
    +
    +.span19 {
    +	width: 1120px;
    +}
    +
    +.span20 {
    +	width: 1180px;
    +}
    +
    +.span21 {
    +	width: 1240px;
    +}
    +
    +.span22 {
    +	width: 1300px;
    +}
    +
    +.span23 {
    +	width: 1360px;
    +}
    +
    +.span24 {
    +	width: 1420px;
    +}
    +
    +.row>.offset1 {
    +	margin-left: 80px;
    +}
    +
    +.row>.offset2 {
    +	margin-left: 140px;
    +}
    +
    +.row>.offset3 {
    +	margin-left: 200px;
    +}
    +
    +.row>.offset4 {
    +	margin-left: 260px;
    +}
    +
    +.row>.offset5 {
    +	margin-left: 320px;
    +}
    +
    +.row>.offset6 {
    +	margin-left: 380px;
    +}
    +
    +.row>.offset7 {
    +	margin-left: 440px;
    +}
    +
    +.row>.offset8 {
    +	margin-left: 500px;
    +}
    +
    +.row>.offset9 {
    +	margin-left: 560px;
    +}
    +
    +.row>.offset10 {
    +	margin-left: 620px;
    +}
    +
    +.row>.offset11 {
    +	margin-left: 680px;
    +}
    +
    +.row>.offset12 {
    +	margin-left: 740px;
    +}
    +
    +.span-one-third {
    +	width: 300px;
    +}
    +
    +.span-two-thirds {
    +	width: 620px;
    +}
    +
    +.row>.offset-one-third {
    +	margin-left: 340px;
    +}
    +
    +.row>.offset-two-thirds {
    +	margin-left: 660px;
    +}
    +
    +p {
    +	font-size: 13px;
    +	font-weight: normal;
    +	line-height: 18px;
    +	margin-bottom: 9px;
    +}
    +
    +p small {
    +	font-size: 11px;
    +	color: #bfbfbf;
    +}
    +
    +h1,h2,h3,h4,h5,h6 {
    +	font-weight: bold;
    +	color: #404040;
    +}
    +
    +h1 small,h2 small,h3 small,h4 small,h5 small,h6 small {
    +	color: #bfbfbf;
    +}
    +
    +h1 {
    +	margin-bottom: 18px;
    +	font-size: 30px;
    +	line-height: 36px;
    +}
    +
    +h1 small {
    +	font-size: 18px;
    +}
    +
    +h2 {
    +	font-size: 24px;
    +	line-height: 36px;
    +}
    +
    +h2 small {
    +	font-size: 14px;
    +}
    +
    +h3,h4,h5,h6 {
    +	line-height: 18px;
    +}
    +
    +h3 {
    +	font-size: 18px;
    +}
    +
    +h3 small {
    +	font-size: 14px;
    +}
    +
    +h4 {
    +	font-size: 16px;
    +}
    +
    +h4 small {
    +	font-size: 12px;
    +}
    +
    +h5 {
    +	font-size: 14px;
    +}
    +
    +h6 {
    +	font-size: 13px;
    +	color: #bfbfbf;
    +	text-transform: uppercase;
    +}
    +
    +ul,ol {
    +	margin: 0 0 18px 25px;
    +}
    +
    +ul ul,ul ol,ol ol,ol ul {
    +	margin-bottom: 0;
    +}
    +
    +ul {
    +	list-style: disc;
    +}
    +
    +ol {
    +	list-style: decimal;
    +}
    +
    +li {
    +	line-height: 18px;
    +	color: #808080;
    +}
    +
    +ul.unstyled {
    +	list-style: none;
    +	margin-left: 0;
    +}
    +
    +dl {
    +	margin-bottom: 18px;
    +}
    +
    +dl dt,dl dd {
    +	line-height: 18px;
    +}
    +
    +dl dt {
    +	font-weight: bold;
    +}
    +
    +dl dd {
    +	margin-left: 9px;
    +}
    +
    +hr {
    +	margin: 20px 0 19px;
    +	border: 0;
    +	border-bottom: 1px solid #eee;
    +}
    +
    +strong {
    +	font-style: inherit;
    +	font-weight: bold;
    +}
    +
    +em {
    +	font-style: italic;
    +	font-weight: inherit;
    +	line-height: inherit;
    +}
    +
    +.muted {
    +	color: #bfbfbf;
    +}
    +
    +blockquote {
    +	margin-bottom: 18px;
    +	border-left: 5px solid #eee;
    +	padding-left: 15px;
    +}
    +
    +blockquote p {
    +	font-size: 14px;
    +	font-weight: 300;
    +	line-height: 18px;
    +	margin-bottom: 0;
    +}
    +
    +blockquote small {
    +	display: block;
    +	font-size: 12px;
    +	font-weight: 300;
    +	line-height: 18px;
    +	color: #bfbfbf;
    +}
    +
    +blockquote small:before {
    +	content: '\2014 \00A0';
    +}
    +
    +address {
    +	display: block;
    +	line-height: 18px;
    +	margin-bottom: 18px;
    +}
    +
    +code,pre {
    +	padding: 0 3px 2px;
    +	font-family: Monaco, Andale Mono, Courier New, monospace;
    +	font-size: 12px;
    +	-webkit-border-radius: 3px;
    +	-moz-border-radius: 3px;
    +	border-radius: 3px;
    +}
    +
    +code {
    +	background-color: #fee9cc;
    +	color: rgba(0, 0, 0, 0.75);
    +	padding: 1px 3px;
    +}
    +
    +pre {
    +	background-color: #f5f5f5;
    +	display: block;
    +	padding: 8.5px;
    +	margin: 0 0 18px;
    +	line-height: 18px;
    +	font-size: 12px;
    +	border: 1px solid #ccc;
    +	border: 1px solid rgba(0, 0, 0, 0.15);
    +	-webkit-border-radius: 3px;
    +	-moz-border-radius: 3px;
    +	border-radius: 3px;
    +	white-space: pre;
    +	white-space: pre-wrap;
    +	word-wrap: break-word;
    +}
    +
    +form {
    +	margin-bottom: 18px;
    +}
    +
    +fieldset {
    +	margin-bottom: 18px;
    +	padding-top: 18px;
    +}
    +
    +fieldset legend {
    +	display: block;
    +	padding-left: 150px;
    +	font-size: 19.5px;
    +	line-height: 1;
    +	color: #404040;
    +	*padding: 0 0 5px 145px;
    +	*line-height: 1.5;
    +}
    +
    +form .clearfix {
    +	margin-bottom: 18px;
    +	zoom: 1;
    +}
    +
    +form .clearfix:before,form .clearfix:after {
    +	display: table;
    +	content: "";
    +	zoom: 1;
    +}
    +
    +form .clearfix:after {
    +	clear: both;
    +}
    +
    +label,input,select,textarea {
    +	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    +	font-size: 13px;
    +	font-weight: normal;
    +	line-height: normal;
    +}
    +
    +label {
    +	padding-top: 6px;
    +	font-size: 13px;
    +	line-height: 18px;
    +	float: left;
    +	width: 130px;
    +	text-align: right;
    +	color: #404040;
    +}
    +
    +form .input {
    +	margin-left: 150px;
    +}
    +
    +input[type=checkbox],input[type=radio] {
    +	cursor: pointer;
    +}
    +
    +input,textarea,select,.uneditable-input {
    +	display: inline-block;
    +	width: 210px;
    +	height: 18px;
    +	padding: 4px;
    +	font-size: 13px;
    +	line-height: 18px;
    +	color: #808080;
    +	border: 1px solid #ccc;
    +	-webkit-border-radius: 3px;
    +	-moz-border-radius: 3px;
    +	border-radius: 3px;
    +}
    +
    +select {
    +	padding: initial;
    +}
    +
    +input[type=checkbox],input[type=radio] {
    +	width: auto;
    +	height: auto;
    +	padding: 0;
    +	margin: 3px 0;
    +	*margin-top: 0;
    +	line-height: normal;
    +	border: none;
    +}
    +
    +input[type=file] {
    +	background-color: #ffffff;
    +	padding: initial;
    +	border: initial;
    +	line-height: initial;
    +	-webkit-box-shadow: none;
    +	-moz-box-shadow: none;
    +	box-shadow: none;
    +}
    +
    +input[type=button],input[type=reset],input[type=submit] {
    +	width: auto;
    +	height: auto;
    +}
    +
    +select,input[type=file] {
    +	height: 27px;
    +	*height: auto;
    +	line-height: 27px;
    +	*margin-top: 4px;
    +}
    +
    +select[multiple] {
    +	height: inherit;
    +	background-color: #ffffff;
    +}
    +
    +textarea {
    +	height: auto;
    +}
    +
    +.uneditable-input {
    +	background-color: #ffffff;
    +	display: block;
    +	
    +	border-color: #eee;
    +	-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
    +	-moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
    +	box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
    +	cursor: not-allowed;
    +}
    +.uneditable-input:focus {
    +  border-color: rgba(82, 168, 236, 0.8);
    +  outline: 0;
    +  /* IE6-9 */
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +}
    +
    +
    +:-moz-placeholder {
    +	color: #bfbfbf;
    +}
    +
    +::-webkit-input-placeholder {
    +	color: #bfbfbf;
    +}
    +
    +input,textarea {
    +	-webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
    +	-moz-transition: border linear 0.2s, box-shadow linear 0.2s;
    +	-ms-transition: border linear 0.2s, box-shadow linear 0.2s;
    +	-o-transition: border linear 0.2s, box-shadow linear 0.2s;
    +	transition: border linear 0.2s, box-shadow linear 0.2s;
    +	-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
    +	-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
    +	box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
    +}
    +
    +input:focus,textarea:focus {
    +	outline: 0;
    +	border-color: rgba(82, 168, 236, 0.8);
    +	-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px
    +		rgba(82, 168, 236, 0.6);
    +	-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px
    +		rgba(82, 168, 236, 0.6);
    +	box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px
    +		rgba(82, 168, 236, 0.6);
    +}
    +
    +input[type=file]:focus,input[type=checkbox]:focus,select:focus {
    +	-webkit-box-shadow: none;
    +	-moz-box-shadow: none;
    +	box-shadow: none;
    +	outline: 1px dotted #666;
    +}
    +
    +form .clearfix.error>label,form .clearfix.error .help-block,form .clearfix.error .help-inline
    +	{
    +	color: #b94a48;
    +}
    +
    +form .clearfix.error input,form .clearfix.error textarea {
    +	color: #b94a48;
    +	border-color: #ee5f5b;
    +}
    +
    +form .clearfix.error input:focus,form .clearfix.error textarea:focus {
    +	border-color: #e9322d;
    +	-webkit-box-shadow: 0 0 6px #f8b9b7;
    +	-moz-box-shadow: 0 0 6px #f8b9b7;
    +	box-shadow: 0 0 6px #f8b9b7;
    +}
    +
    +form .clearfix.error .input-prepend .add-on,form .clearfix.error .input-append .add-on
    +	{
    +	color: #b94a48;
    +	background-color: #fce6e6;
    +	border-color: #b94a48;
    +}
    +
    +form .clearfix.warning>label,form .clearfix.warning .help-block,form .clearfix.warning .help-inline
    +	{
    +	color: #c09853;
    +}
    +
    +form .clearfix.warning input,form .clearfix.warning textarea {
    +	color: #c09853;
    +	border-color: #ccae64;
    +}
    +
    +form .clearfix.warning input:focus,form .clearfix.warning textarea:focus
    +	{
    +	border-color: #be9a3f;
    +	-webkit-box-shadow: 0 0 6px #e5d6b1;
    +	-moz-box-shadow: 0 0 6px #e5d6b1;
    +	box-shadow: 0 0 6px #e5d6b1;
    +}
    +
    +form .clearfix.warning .input-prepend .add-on,form .clearfix.warning .input-append .add-on
    +	{
    +	color: #c09853;
    +	background-color: #d2b877;
    +	border-color: #c09853;
    +}
    +
    +form .clearfix.success>label,form .clearfix.success .help-block,form .clearfix.success .help-inline
    +	{
    +	color: #468847;
    +}
    +
    +form .clearfix.success input,form .clearfix.success textarea {
    +	color: #468847;
    +	border-color: #57a957;
    +}
    +
    +form .clearfix.success input:focus,form .clearfix.success textarea:focus
    +	{
    +	border-color: #458845;
    +	-webkit-box-shadow: 0 0 6px #9acc9a;
    +	-moz-box-shadow: 0 0 6px #9acc9a;
    +	box-shadow: 0 0 6px #9acc9a;
    +}
    +
    +form .clearfix.success .input-prepend .add-on,form .clearfix.success .input-append .add-on
    +	{
    +	color: #468847;
    +	background-color: #bcddbc;
    +	border-color: #468847;
    +}
    +
    +.input-mini,input.mini,textarea.mini,select.mini {
    +	width: 60px;
    +}
    +
    +.input-small,input.small,textarea.small,select.small {
    +	width: 90px;
    +}
    +
    +.input-medium,input.medium,textarea.medium,select.medium {
    +	width: 150px;
    +}
    +
    +.input-large,input.large,textarea.large,select.large {
    +	width: 210px;
    +}
    +
    +.input-xlarge,input.xlarge,textarea.xlarge,select.xlarge {
    +	width: 270px;
    +}
    +
    +.input-xxlarge,input.xxlarge,textarea.xxlarge,select.xxlarge {
    +	width: 530px;
    +}
    +
    +textarea.xxlarge {
    +	overflow-y: auto;
    +}
    +
    +input.span1,textarea.span1 {
    +	display: inline-block;
    +	float: none;
    +	width: 30px;
    +	margin-left: 0;
    +}
    +
    +input.span2,textarea.span2 {
    +	display: inline-block;
    +	float: none;
    +	width: 90px;
    +	margin-left: 0;
    +}
    +
    +input.span3,textarea.span3 {
    +	display: inline-block;
    +	float: none;
    +	width: 150px;
    +	margin-left: 0;
    +}
    +
    +input.span4,textarea.span4 {
    +	display: inline-block;
    +	float: none;
    +	width: 210px;
    +	margin-left: 0;
    +}
    +
    +input.span5,textarea.span5 {
    +	display: inline-block;
    +	float: none;
    +	width: 270px;
    +	margin-left: 0;
    +}
    +
    +input.span6,textarea.span6 {
    +	display: inline-block;
    +	float: none;
    +	width: 330px;
    +	margin-left: 0;
    +}
    +
    +input.span7,textarea.span7 {
    +	display: inline-block;
    +	float: none;
    +	width: 390px;
    +	margin-left: 0;
    +}
    +
    +input.span8,textarea.span8 {
    +	display: inline-block;
    +	float: none;
    +	width: 450px;
    +	margin-left: 0;
    +}
    +
    +input.span9,textarea.span9 {
    +	display: inline-block;
    +	float: none;
    +	width: 510px;
    +	margin-left: 0;
    +}
    +
    +input.span10,textarea.span10 {
    +	display: inline-block;
    +	float: none;
    +	width: 570px;
    +	margin-left: 0;
    +}
    +
    +input.span11,textarea.span11 {
    +	display: inline-block;
    +	float: none;
    +	width: 630px;
    +	margin-left: 0;
    +}
    +
    +input.span12,textarea.span12 {
    +	display: inline-block;
    +	float: none;
    +	width: 690px;
    +	margin-left: 0;
    +}
    +
    +input.span13,textarea.span13 {
    +	display: inline-block;
    +	float: none;
    +	width: 750px;
    +	margin-left: 0;
    +}
    +
    +input.span14,textarea.span14 {
    +	display: inline-block;
    +	float: none;
    +	width: 810px;
    +	margin-left: 0;
    +}
    +
    +input.span15,textarea.span15 {
    +	display: inline-block;
    +	float: none;
    +	width: 870px;
    +	margin-left: 0;
    +}
    +
    +input.span16,textarea.span16 {
    +	display: inline-block;
    +	float: none;
    +	width: 930px;
    +	margin-left: 0;
    +}
    +
    +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]
    +	{
    +	background-color: #f5f5f5;
    +	border-color: #ddd;
    +	cursor: not-allowed;
    +}
    +
    +.actions {
    +	background: #f5f5f5;
    +	margin-top: 18px;
    +	margin-bottom: 18px;
    +	padding: 17px 20px 18px 150px;
    +	border-top: 1px solid #ddd;
    +	-webkit-border-radius: 0 0 3px 3px;
    +	-moz-border-radius: 0 0 3px 3px;
    +	border-radius: 0 0 3px 3px;
    +}
    +
    +.actions .secondary-action {
    +	float: right;
    +}
    +
    +.actions .secondary-action a {
    +	line-height: 30px;
    +}
    +
    +.actions .secondary-action a:hover {
    +	text-decoration: underline;
    +}
    +
    +.help-inline,.help-block {
    +	font-size: 13px;
    +	line-height: 18px;
    +	color: #bfbfbf;
    +}
    +
    +.help-inline {
    +	padding-left: 5px;
    +	*position: relative;
    +	*top: -5px;
    +}
    +
    +.help-block {
    +	display: block;
    +	max-width: 600px;
    +}
    +
    +.inline-inputs {
    +	color: #808080;
    +}
    +
    +.inline-inputs span {
    +	padding: 0 2px 0 1px;
    +}
    +
    +.input-prepend input,.input-append input {
    +	-webkit-border-radius: 0 3px 3px 0;
    +	-moz-border-radius: 0 3px 3px 0;
    +	border-radius: 0 3px 3px 0;
    +}
    +
    +.input-prepend .add-on,.input-append .add-on {
    +	position: relative;
    +	background: #f5f5f5;
    +	border: 1px solid #ccc;
    +	z-index: 2;
    +	float: left;
    +	display: block;
    +	width: auto;
    +	min-width: 16px;
    +	height: 18px;
    +	padding: 4px 4px 4px 5px;
    +	margin-right: -1px;
    +	font-weight: normal;
    +	line-height: 18px;
    +	color: #bfbfbf;
    +	text-align: center;
    +	text-shadow: 0 1px 0 #ffffff;
    +	-webkit-border-radius: 3px 0 0 3px;
    +	-moz-border-radius: 3px 0 0 3px;
    +	border-radius: 3px 0 0 3px;
    +}
    +
    +.input-prepend .active,.input-append .active {
    +	background: #a9dba9;
    +	border-color: #46a546;
    +}
    +
    +.input-prepend .add-on {
    +	*margin-top: 1px;
    +}
    +
    +.input-append input {
    +	float: left;
    +	-webkit-border-radius: 3px 0 0 3px;
    +	-moz-border-radius: 3px 0 0 3px;
    +	border-radius: 3px 0 0 3px;
    +}
    +
    +.input-append .add-on {
    +	-webkit-border-radius: 0 3px 3px 0;
    +	-moz-border-radius: 0 3px 3px 0;
    +	border-radius: 0 3px 3px 0;
    +	margin-right: 0;
    +	margin-left: -1px;
    +}
    +
    +.inputs-list {
    +	margin: 0 0 5px;
    +	width: 100%;
    +}
    +
    +.inputs-list li {
    +	display: block;
    +	padding: 0;
    +	width: 100%;
    +}
    +
    +.inputs-list label {
    +	display: block;
    +	float: none;
    +	width: auto;
    +	padding: 0;
    +	margin-left: 20px;
    +	line-height: 18px;
    +	text-align: left;
    +	white-space: normal;
    +}
    +
    +.inputs-list label strong {
    +	color: #808080;
    +}
    +
    +.inputs-list label small {
    +	font-size: 11px;
    +	font-weight: normal;
    +}
    +
    +.inputs-list .inputs-list {
    +	margin-left: 25px;
    +	margin-bottom: 10px;
    +	padding-top: 0;
    +}
    +
    +.inputs-list:first-child {
    +	padding-top: 6px;
    +}
    +
    +.inputs-list li+li {
    +	padding-top: 2px;
    +}
    +
    +.inputs-list input[type=radio],.inputs-list input[type=checkbox] {
    +	margin-bottom: 0;
    +	margin-left: -20px;
    +	float: left;
    +}
    +
    +.form-stacked {
    +	padding-left: 20px;
    +}
    +
    +.form-stacked fieldset {
    +	padding-top: 9px;
    +}
    +
    +.form-stacked legend {
    +	padding-left: 0;
    +}
    +
    +.form-stacked label {
    +	display: block;
    +	float: none;
    +	width: auto;
    +	font-weight: bold;
    +	text-align: left;
    +	line-height: 20px;
    +	padding-top: 0;
    +}
    +
    +.form-stacked .clearfix {
    +	margin-bottom: 9px;
    +}
    +
    +.form-stacked .clearfix div.input {
    +	margin-left: 0;
    +}
    +
    +.form-stacked .inputs-list {
    +	margin-bottom: 0;
    +}
    +
    +.form-stacked .inputs-list li {
    +	padding-top: 0;
    +}
    +
    +.form-stacked .inputs-list li label {
    +	font-weight: normal;
    +	padding-top: 0;
    +}
    +
    +.form-stacked div.clearfix.error {
    +	padding-top: 10px;
    +	padding-bottom: 10px;
    +	padding-left: 10px;
    +	margin-top: 0;
    +	margin-left: -10px;
    +}
    +
    +.form-stacked .actions {
    +	margin-left: -20px;
    +	padding-left: 20px;
    +}
    +
    +table {
    +	width: 100%;
    +	margin-bottom: 18px;
    +	padding: 0;
    +	font-size: 13px;
    +	border-collapse: collapse;
    +}
    +
    +table th,table td {
    +	padding: 10px 10px 9px;
    +	line-height: 18px;
    +	text-align: left;
    +}
    +
    +table th {
    +	padding-top: 9px;
    +	font-weight: bold;
    +	vertical-align: middle;
    +}
    +
    +table td {
    +	vertical-align: top;
    +	border-top: 1px solid #ddd;
    +}
    +
    +table tbody th {
    +	border-top: 1px solid #ddd;
    +	vertical-align: top;
    +}
    +
    +.condensed-table th,.condensed-table td {
    +	padding: 5px 5px 4px;
    +}
    +
    +.bordered-table {
    +	border: 1px solid #ddd;
    +	border-collapse: separate;
    +	*border-collapse: collapse;
    +	-webkit-border-radius: 4px;
    +	-moz-border-radius: 4px;
    +	border-radius: 4px;
    +}
    +
    +.bordered-table th+th,.bordered-table td+td,.bordered-table th+td {
    +	border-left: 1px solid #ddd;
    +}
    +
    +.bordered-table thead tr:first-child th:first-child,.bordered-table tbody tr:first-child td:first-child
    +	{
    +	-webkit-border-radius: 4px 0 0 0;
    +	-moz-border-radius: 4px 0 0 0;
    +	border-radius: 4px 0 0 0;
    +}
    +
    +.bordered-table thead tr:first-child th:last-child,.bordered-table tbody tr:first-child td:last-child
    +	{
    +	-webkit-border-radius: 0 4px 0 0;
    +	-moz-border-radius: 0 4px 0 0;
    +	border-radius: 0 4px 0 0;
    +}
    +
    +.bordered-table tbody tr:last-child td:first-child {
    +	-webkit-border-radius: 0 0 0 4px;
    +	-moz-border-radius: 0 0 0 4px;
    +	border-radius: 0 0 0 4px;
    +}
    +
    +.bordered-table tbody tr:last-child td:last-child {
    +	-webkit-border-radius: 0 0 4px 0;
    +	-moz-border-radius: 0 0 4px 0;
    +	border-radius: 0 0 4px 0;
    +}
    +
    +table .span1 {
    +	width: 20px;
    +}
    +
    +table .span2 {
    +	width: 60px;
    +}
    +
    +table .span3 {
    +	width: 100px;
    +}
    +
    +table .span4 {
    +	width: 140px;
    +}
    +
    +table .span5 {
    +	width: 180px;
    +}
    +
    +table .span6 {
    +	width: 220px;
    +}
    +
    +table .span7 {
    +	width: 260px;
    +}
    +
    +table .span8 {
    +	width: 300px;
    +}
    +
    +table .span9 {
    +	width: 340px;
    +}
    +
    +table .span10 {
    +	width: 380px;
    +}
    +
    +table .span11 {
    +	width: 420px;
    +}
    +
    +table .span12 {
    +	width: 460px;
    +}
    +
    +table .span13 {
    +	width: 500px;
    +}
    +
    +table .span14 {
    +	width: 540px;
    +}
    +
    +table .span15 {
    +	width: 580px;
    +}
    +
    +table .span16 {
    +	width: 620px;
    +}
    +
    +.zebra-striped tbody tr:nth-child(odd) td,.zebra-striped tbody tr:nth-child(odd) th
    +	{
    +	background-color: #f9f9f9;
    +}
    +
    +.zebra-striped tbody tr:hover td,.zebra-striped tbody tr:hover th {
    +	background-color: #f5f5f5;
    +}
    +
    +table .header {
    +	cursor: pointer;
    +}
    +
    +table .header:after {
    +	content: "";
    +	float: right;
    +	margin-top: 7px;
    +	border-width: 0 4px 4px;
    +	border-style: solid;
    +	border-color: #000 transparent;
    +	visibility: hidden;
    +}
    +
    +table .headerSortUp,table .headerSortDown {
    +	background-color: rgba(141, 192, 219, 0.25);
    +	text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
    +}
    +
    +table .header:hover:after {
    +	visibility: visible;
    +}
    +
    +table .headerSortDown:after,table .headerSortDown:hover:after {
    +	visibility: visible;
    +	filter: alpha(opacity = 60);
    +	-khtml-opacity: 0.6;
    +	-moz-opacity: 0.6;
    +	opacity: 0.6;
    +}
    +
    +table .headerSortUp:after {
    +	border-bottom: none;
    +	border-left: 4px solid transparent;
    +	border-right: 4px solid transparent;
    +	border-top: 4px solid #000;
    +	visibility: visible;
    +	-webkit-box-shadow: none;
    +	-moz-box-shadow: none;
    +	box-shadow: none;
    +	filter: alpha(opacity = 60);
    +	-khtml-opacity: 0.6;
    +	-moz-opacity: 0.6;
    +	opacity: 0.6;
    +}
    +
    +table .blue {
    +	color: #049cdb;
    +	border-bottom-color: #049cdb;
    +}
    +
    +table .headerSortUp.blue,table .headerSortDown.blue {
    +	background-color: #ade6fe;
    +}
    +
    +table .green {
    +	color: #46a546;
    +	border-bottom-color: #46a546;
    +}
    +
    +table .headerSortUp.green,table .headerSortDown.green {
    +	background-color: #cdeacd;
    +}
    +
    +table .red {
    +	color: #9d261d;
    +	border-bottom-color: #9d261d;
    +}
    +
    +table .headerSortUp.red,table .headerSortDown.red {
    +	background-color: #f4c8c5;
    +}
    +
    +table .yellow {
    +	color: #ffc40d;
    +	border-bottom-color: #ffc40d;
    +}
    +
    +table .headerSortUp.yellow,table .headerSortDown.yellow {
    +	background-color: #fff6d9;
    +}
    +
    +table .orange {
    +	color: #f89406;
    +	border-bottom-color: #f89406;
    +}
    +
    +table .headerSortUp.orange,table .headerSortDown.orange {
    +	background-color: #fee9cc;
    +}
    +
    +table .purple {
    +	color: #7a43b6;
    +	border-bottom-color: #7a43b6;
    +}
    +
    +table .headerSortUp.purple,table .headerSortDown.purple {
    +	background-color: #e2d5f0;
    +}
    +
    +.topbar {
    +	height: 40px;
    +	position: fixed;
    +	top: 0;
    +	left: 0;
    +	right: 0;
    +	z-index: 10000;
    +	overflow: visible;
    +}
    +
    +.topbar a {
    +	color: #bfbfbf;
    +	text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +}
    +
    +.topbar h3 a:hover,.topbar .brand:hover,.topbar ul .active>a {
    +	background-color: #333;
    +	background-color: rgba(255, 255, 255, 0.05);
    +	color: #ffffff;
    +	text-decoration: none;
    +}
    +
    +.topbar h3 {
    +	position: relative;
    +}
    +
    +.topbar h3 a,.topbar .brand {
    +	float: left;
    +	display: block;
    +	padding: 8px 20px 12px;
    +	margin-left: -20px;
    +	color: #ffffff;
    +	font-size: 20px;
    +	font-weight: 200;
    +	line-height: 1;
    +}
    +
    +.topbar p {
    +	margin: 0;
    +	line-height: 40px;
    +}
    +
    +.topbar p a:hover {
    +	background-color: transparent;
    +	color: #ffffff;
    +}
    +
    +.topbar form {
    +	float: left;
    +	margin: 5px 0 0 0;
    +	position: relative;
    +	filter: alpha(opacity = 100);
    +	-khtml-opacity: 1;
    +	-moz-opacity: 1;
    +	opacity: 1;
    +}
    +
    +.topbar form.pull-right {
    +	float: right;
    +}
    +
    +.topbar input {
    +	background-color: #444;
    +	background-color: rgba(255, 255, 255, 0.3);
    +	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    +	font-size: normal;
    +	font-weight: 13px;
    +	line-height: 1;
    +	padding: 4px 9px;
    +	color: #ffffff;
    +	color: rgba(255, 255, 255, 0.75);
    +	border: 1px solid #111;
    +	-webkit-border-radius: 4px;
    +	-moz-border-radius: 4px;
    +	border-radius: 4px;
    +	-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px
    +		rgba(255, 255, 255, 0.25);
    +	-moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px
    +		rgba(255, 255, 255, 0.25);
    +	box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px
    +		rgba(255, 255, 255, 0.25);
    +	-webkit-transition: none;
    +	-moz-transition: none;
    +	-ms-transition: none;
    +	-o-transition: none;
    +	transition: none;
    +}
    +
    +.topbar input:-moz-placeholder {
    +	color: #e6e6e6;
    +}
    +
    +.topbar input::-webkit-input-placeholder {
    +	color: #e6e6e6;
    +}
    +
    +.topbar input:hover {
    +	background-color: #bfbfbf;
    +	background-color: rgba(255, 255, 255, 0.5);
    +	color: #ffffff;
    +}
    +
    +.topbar input:focus,.topbar input.focused {
    +	outline: 0;
    +	background-color: #ffffff;
    +	color: #404040;
    +	text-shadow: 0 1px 0 #ffffff;
    +	border: 0;
    +	padding: 5px 10px;
    +	-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
    +	-moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
    +	box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
    +}
    +
    +.topbar-inner,.topbar .fill {
    +	background-color: #222;
    +	background-color: #222222;
    +	background-repeat: repeat-x;
    +	background-image: -khtml-gradient(linear, left top, left bottom, from(#333333),
    +		to(#222222) );
    +	background-image: -moz-linear-gradient(top, #333333, #222222);
    +	background-image: -ms-linear-gradient(top, #333333, #222222);
    +	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333),
    +		color-stop(100%, #222222) );
    +	background-image: -webkit-linear-gradient(top, #333333, #222222);
    +	background-image: -o-linear-gradient(top, #333333, #222222);
    +	background-image: linear-gradient(top, #333333, #222222);
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#333333', endColorstr = '#222222', GradientType = 0 );
    +	-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0
    +		rgba(0, 0, 0, 0.1);
    +	-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0
    +		rgba(0, 0, 0, 0.1);
    +	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0
    +		rgba(0, 0, 0, 0.1);
    +}
    +
    +.topbar div>ul,.nav {
    +	display: block;
    +	float: left;
    +	margin: 0 10px 0 0;
    +	position: relative;
    +	left: 0;
    +}
    +
    +.topbar div>ul>li,.nav>li {
    +	display: block;
    +	float: left;
    +}
    +
    +.topbar div>ul a,.nav a {
    +	display: block;
    +	float: none;
    +	padding: 10px 10px 11px;
    +	line-height: 19px;
    +	text-decoration: none;
    +}
    +
    +.topbar div>ul a:hover,.nav a:hover {
    +	color: #ffffff;
    +	text-decoration: none;
    +}
    +
    +.topbar div>ul .active>a,.nav .active>a {
    +	background-color: #222;
    +	background-color: rgba(0, 0, 0, 0.5);
    +}
    +
    +.topbar div>ul.secondary-nav,.nav.secondary-nav {
    +	float: right;
    +	margin-left: 10px;
    +	margin-right: 0;
    +}
    +
    +.topbar div>ul.secondary-nav .menu-dropdown,.nav.secondary-nav .menu-dropdown,.topbar div>ul.secondary-nav .dropdown-menu,.nav.secondary-nav .dropdown-menu
    +	{
    +	right: 0;
    +	border: 0;
    +}
    +
    +.topbar div>ul a.menu:hover,.nav a.menu:hover,.topbar div>ul li.open .menu,.nav li.open .menu,.topbar div>ul .dropdown-toggle:hover,.nav .dropdown-toggle:hover,.topbar div>ul .dropdown.open .dropdown-toggle,.nav .dropdown.open .dropdown-toggle
    +	{
    +	background: #444;
    +	background: rgba(255, 255, 255, 0.05);
    +}
    +
    +.topbar div>ul .menu-dropdown,.nav .menu-dropdown,.topbar div>ul .dropdown-menu,.nav .dropdown-menu
    +	{
    +	background-color: #333;
    +}
    +
    +.topbar div>ul .menu-dropdown a.menu,.nav .menu-dropdown a.menu,.topbar div>ul .dropdown-menu a.menu,.nav .dropdown-menu a.menu,.topbar div>ul .menu-dropdown .dropdown-toggle,.nav .menu-dropdown .dropdown-toggle,.topbar div>ul .dropdown-menu .dropdown-toggle,.nav .dropdown-menu .dropdown-toggle
    +	{
    +	color: #ffffff;
    +}
    +
    +.topbar div>ul .menu-dropdown a.menu.open,.nav .menu-dropdown a.menu.open,.topbar div>ul .dropdown-menu a.menu.open,.nav .dropdown-menu a.menu.open,.topbar div>ul .menu-dropdown .dropdown-toggle.open,.nav .menu-dropdown .dropdown-toggle.open,.topbar div>ul .dropdown-menu .dropdown-toggle.open,.nav .dropdown-menu .dropdown-toggle.open
    +	{
    +	background: #444;
    +	background: rgba(255, 255, 255, 0.05);
    +}
    +
    +.topbar div>ul .menu-dropdown li a,.nav .menu-dropdown li a,.topbar div>ul .dropdown-menu li a,.nav .dropdown-menu li a
    +	{
    +	color: #999;
    +	text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5);
    +}
    +
    +.topbar div>ul .menu-dropdown li a:hover,.nav .menu-dropdown li a:hover,.topbar div>ul .dropdown-menu li a:hover,.nav .dropdown-menu li a:hover
    +	{
    +	background-color: #191919;
    +	background-repeat: repeat-x;
    +	background-image: -khtml-gradient(linear, left top, left bottom, from(#292929),
    +		to(#191919) );
    +	background-image: -moz-linear-gradient(top, #292929, #191919);
    +	background-image: -ms-linear-gradient(top, #292929, #191919);
    +	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929),
    +		color-stop(100%, #191919) );
    +	background-image: -webkit-linear-gradient(top, #292929, #191919);
    +	background-image: -o-linear-gradient(top, #292929, #191919);
    +	background-image: linear-gradient(top, #292929, #191919);
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#292929', endColorstr = '#191919', GradientType = 0 );
    +	color: #ffffff;
    +}
    +
    +.topbar div>ul .menu-dropdown .active a,.nav .menu-dropdown .active a,.topbar div>ul .dropdown-menu .active a,.nav .dropdown-menu .active a
    +	{
    +	color: #ffffff;
    +}
    +
    +.topbar div>ul .menu-dropdown .divider,.nav .menu-dropdown .divider,.topbar div>ul .dropdown-menu .divider,.nav .dropdown-menu .divider
    +	{
    +	background-color: #222;
    +	border-color: #444;
    +}
    +
    +.topbar ul .menu-dropdown li a,.topbar ul .dropdown-menu li a {
    +	padding: 4px 15px;
    +}
    +
    +li.menu,.dropdown {
    +	position: relative;
    +}
    +
    +a.menu:after,.dropdown-toggle:after {
    +	width: 0;
    +	height: 0;
    +	display: inline-block;
    +	content: "&darr;";
    +	text-indent: -99999px;
    +	vertical-align: top;
    +	margin-top: 8px;
    +	margin-left: 4px;
    +	border-left: 4px solid transparent;
    +	border-right: 4px solid transparent;
    +	border-top: 4px solid #ffffff;
    +	filter: alpha(opacity = 50);
    +	-khtml-opacity: 0.5;
    +	-moz-opacity: 0.5;
    +	opacity: 0.5;
    +}
    +
    +.menu-dropdown,.dropdown-menu {
    +	background-color: #ffffff;
    +	float: left;
    +	display: none;
    +	position: absolute;
    +	top: 40px;
    +	z-index: 900;
    +	min-width: 160px;
    +	max-width: 220px;
    +	_width: 160px;
    +	margin-left: 0;
    +	margin-right: 0;
    +	padding: 6px 0;
    +	zoom: 1;
    +	border-color: #999;
    +	border-color: rgba(0, 0, 0, 0.2);
    +	border-style: solid;
    +	border-width: 0 1px 1px;
    +	-webkit-border-radius: 0 0 6px 6px;
    +	-moz-border-radius: 0 0 6px 6px;
    +	border-radius: 0 0 6px 6px;
    +	-webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
    +	-moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
    +	box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
    +	-webkit-background-clip: padding-box;
    +	-moz-background-clip: padding-box;
    +	background-clip: padding-box;
    +}
    +
    +.menu-dropdown li,.dropdown-menu li {
    +	float: none;
    +	display: block;
    +	background-color: none;
    +}
    +
    +.menu-dropdown .divider,.dropdown-menu .divider {
    +	height: 1px;
    +	margin: 5px 0;
    +	overflow: hidden;
    +	background-color: #eee;
    +	border-bottom: 1px solid #ffffff;
    +}
    +
    +.topbar .dropdown-menu a,.dropdown-menu a {
    +	display: block;
    +	padding: 4px 15px;
    +	clear: both;
    +	font-weight: normal;
    +	line-height: 18px;
    +	color: #808080;
    +	text-shadow: 0 1px 0 #ffffff;
    +}
    +
    +.topbar .dropdown-menu a:hover,.dropdown-menu a:hover,.topbar .dropdown-menu a.hover,.dropdown-menu a.hover
    +	{
    +	background-color: #dddddd;
    +	background-repeat: repeat-x;
    +	background-image: -khtml-gradient(linear, left top, left bottom, from(#eeeeee),
    +		to(#dddddd) );
    +	background-image: -moz-linear-gradient(top, #eeeeee, #dddddd);
    +	background-image: -ms-linear-gradient(top, #eeeeee, #dddddd);
    +	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee),
    +		color-stop(100%, #dddddd) );
    +	background-image: -webkit-linear-gradient(top, #eeeeee, #dddddd);
    +	background-image: -o-linear-gradient(top, #eeeeee, #dddddd);
    +	background-image: linear-gradient(top, #eeeeee, #dddddd);
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#eeeeee', endColorstr = '#dddddd', GradientType = 0 );
    +	color: #404040;
    +	text-decoration: none;
    +	-webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px
    +		rgba(0, 0, 0, 0.025);
    +	-moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px
    +		rgba(0, 0, 0, 0.025);
    +	box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px
    +		rgba(0, 0, 0, 0.025);
    +}
    +
    +.open .menu,.dropdown.open .menu,.open .dropdown-toggle,.dropdown.open .dropdown-toggle
    +	{
    +	color: #ffffff;
    +	background: #ccc;
    +	background: rgba(0, 0, 0, 0.3);
    +}
    +
    +.open .menu-dropdown,.dropdown.open .menu-dropdown,.open .dropdown-menu,.dropdown.open .dropdown-menu
    +	{
    +	display: block;
    +}
    +
    +.tabs,.pills {
    +	margin: 0 0 18px;
    +	padding: 0;
    +	list-style: none;
    +	zoom: 1;
    +}
    +
    +.tabs:before,.pills:before,.tabs:after,.pills:after {
    +	display: table;
    +	content: "";
    +	zoom: 1;
    +}
    +
    +.tabs:after,.pills:after {
    +	clear: both;
    +}
    +
    +.tabs>li,.pills>li {
    +	float: left;
    +}
    +
    +.tabs>li>a,.pills>li>a {
    +	display: block;
    +}
    +
    +.tabs {
    +	border-color: #ddd;
    +	border-style: solid;
    +	border-width: 0 0 1px;
    +}
    +
    +.tabs>li {
    +	position: relative;
    +	margin-bottom: -1px;
    +}
    +
    +.tabs>li>a {
    +	padding: 0 15px;
    +	margin-right: 2px;
    +	line-height: 34px;
    +	border: 1px solid transparent;
    +	-webkit-border-radius: 4px 4px 0 0;
    +	-moz-border-radius: 4px 4px 0 0;
    +	border-radius: 4px 4px 0 0;
    +}
    +
    +.tabs>li>a:hover {
    +	text-decoration: none;
    +	background-color: #eee;
    +	border-color: #eee #eee #ddd;
    +}
    +
    +.tabs .active>a,.tabs .active>a:hover {
    +	color: #808080;
    +	background-color: #ffffff;
    +	border: 1px solid #ddd;
    +	border-bottom-color: transparent;
    +	cursor: default;
    +}
    +
    +.tabs .menu-dropdown,.tabs .dropdown-menu {
    +	top: 35px;
    +	border-width: 1px;
    +	-webkit-border-radius: 0 6px 6px 6px;
    +	-moz-border-radius: 0 6px 6px 6px;
    +	border-radius: 0 6px 6px 6px;
    +}
    +
    +.tabs a.menu:after,.tabs .dropdown-toggle:after {
    +	border-top-color: #999;
    +	margin-top: 15px;
    +	margin-left: 5px;
    +}
    +
    +.tabs li.open.menu .menu,.tabs .open.dropdown .dropdown-toggle {
    +	border-color: #999;
    +}
    +
    +.tabs li.open a.menu:after,.tabs .dropdown.open .dropdown-toggle:after {
    +	border-top-color: #555;
    +}
    +
    +.pills a {
    +	margin: 5px 3px 5px 0;
    +	padding: 0 15px;
    +	line-height: 30px;
    +	text-shadow: 0 1px 1px #ffffff;
    +	-webkit-border-radius: 15px;
    +	-moz-border-radius: 15px;
    +	border-radius: 15px;
    +}
    +
    +.pills a:hover {
    +	color: #ffffff;
    +	text-decoration: none;
    +	text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25);
    +	background-color: #00438a;
    +}
    +
    +.pills .active a {
    +	color: #ffffff;
    +	text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25);
    +	background-color: #0069d6;
    +}
    +
    +.pills-vertical>li {
    +	float: none;
    +}
    +
    +.tab-content>.tab-pane,.pill-content>.pill-pane,.tab-content>div,.pill-content>div
    +	{
    +	display: none;
    +}
    +
    +.tab-content>.active,.pill-content>.active {
    +	display: block;
    +}
    +
    +.breadcrumb {
    +	padding: 7px 14px;
    +	margin: 0 0 18px;
    +	background-color: #f5f5f5;
    +	background-repeat: repeat-x;
    +	background-image: -khtml-gradient(linear, left top, left bottom, from(#ffffff),
    +		to(#f5f5f5) );
    +	background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
    +	background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
    +	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff),
    +		color-stop(100%, #f5f5f5) );
    +	background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
    +	background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
    +	background-image: linear-gradient(top, #ffffff, #f5f5f5);
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#ffffff', endColorstr = '#f5f5f5', GradientType = 0 );
    +	border: 1px solid #ddd;
    +	-webkit-border-radius: 3px;
    +	-moz-border-radius: 3px;
    +	border-radius: 3px;
    +	-webkit-box-shadow: inset 0 1px 0 #ffffff;
    +	-moz-box-shadow: inset 0 1px 0 #ffffff;
    +	box-shadow: inset 0 1px 0 #ffffff;
    +}
    +
    +.breadcrumb li {
    +	display: inline;
    +	text-shadow: 0 1px 0 #ffffff;
    +}
    +
    +.breadcrumb .divider {
    +	padding: 0 5px;
    +	color: #bfbfbf;
    +}
    +
    +.breadcrumb .active a {
    +	color: #404040;
    +}
    +
    +.hero-unit {
    +	background-color: #f5f5f5;
    +	margin-bottom: 30px;
    +	padding: 60px;
    +	-webkit-border-radius: 6px;
    +	-moz-border-radius: 6px;
    +	border-radius: 6px;
    +}
    +
    +.hero-unit h1 {
    +	margin-bottom: 0;
    +	font-size: 60px;
    +	line-height: 1;
    +	letter-spacing: -1px;
    +}
    +
    +.hero-unit p {
    +	font-size: 18px;
    +	font-weight: 200;
    +	line-height: 27px;
    +}
    +
    +footer {
    +	margin-top: 17px;
    +	padding-top: 17px;
    +	border-top: 1px solid #eee;
    +}
    +
    +.page-header {
    +	margin-bottom: 17px;
    +	border-bottom: 1px solid #ddd;
    +	-webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
    +	-moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
    +	box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
    +}
    +
    +.page-header h1 {
    +	margin-bottom: 8px;
    +}
    +
    +.btn.danger,.alert-message.danger,.btn.danger:hover,.alert-message.danger:hover,.btn.error,.alert-message.error,.btn.error:hover,.alert-message.error:hover,.btn.success,.alert-message.success,.btn.success:hover,.alert-message.success:hover,.btn.info,.alert-message.info,.btn.info:hover,.alert-message.info:hover
    +	{
    +	color: #ffffff;
    +}
    +
    +.btn .close,.alert-message .close {
    +	font-family: Arial, sans-serif;
    +	line-height: 18px;
    +}
    +
    +.btn.danger,.alert-message.danger,.btn.error,.alert-message.error {
    +	background-color: #c43c35;
    +	background-repeat: repeat-x;
    +	background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b),
    +		to(#c43c35) );
    +	background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
    +	background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
    +	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b),
    +		color-stop(100%, #c43c35) );
    +	background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
    +	background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
    +	background-image: linear-gradient(top, #ee5f5b, #c43c35);
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#ee5f5b', endColorstr = '#c43c35', GradientType = 0 );
    +	text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +	border-color: #c43c35 #c43c35 #882a25;
    +	border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +}
    +
    +.btn.success,.alert-message.success {
    +	background-color: #57a957;
    +	background-repeat: repeat-x;
    +	background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462),
    +		to(#57a957) );
    +	background-image: -moz-linear-gradient(top, #62c462, #57a957);
    +	background-image: -ms-linear-gradient(top, #62c462, #57a957);
    +	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462),
    +		color-stop(100%, #57a957) );
    +	background-image: -webkit-linear-gradient(top, #62c462, #57a957);
    +	background-image: -o-linear-gradient(top, #62c462, #57a957);
    +	background-image: linear-gradient(top, #62c462, #57a957);
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#62c462', endColorstr = '#57a957', GradientType = 0 );
    +	text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +	border-color: #57a957 #57a957 #3d773d;
    +	border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +}
    +
    +.btn.info,.alert-message.info {
    +	background-color: #339bb9;
    +	background-repeat: repeat-x;
    +	background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de),
    +		to(#339bb9) );
    +	background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
    +	background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
    +	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de),
    +		color-stop(100%, #339bb9) );
    +	background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
    +	background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
    +	background-image: linear-gradient(top, #5bc0de, #339bb9);
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#5bc0de', endColorstr = '#339bb9', GradientType = 0 );
    +	text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +	border-color: #339bb9 #339bb9 #22697d;
    +	border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +}
    +
    +.btn {
    +	cursor: pointer;
    +	display: inline-block;
    +	background-color: #e6e6e6;
    +	background-repeat: no-repeat;
    +	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff),
    +		color-stop(25%, #ffffff), to(#e6e6e6) );
    +	background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
    +	background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
    +	background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
    +	background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
    +	background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#ffffff', endColorstr = '#e6e6e6', GradientType = 0 );
    +	padding: 5px 14px 6px;
    +	text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
    +	color: #333;
    +	font-size: 13px;
    +	line-height: normal;
    +	border: 1px solid #ccc;
    +	border-bottom-color: #bbb;
    +	-webkit-border-radius: 4px;
    +	-moz-border-radius: 4px;
    +	border-radius: 4px;
    +	-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px
    +		rgba(0, 0, 0, 0.05);
    +	-moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px
    +		rgba(0, 0, 0, 0.05);
    +	box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px
    +		rgba(0, 0, 0, 0.05);
    +	-webkit-transition: 0.1s linear all;
    +	-moz-transition: 0.1s linear all;
    +	-ms-transition: 0.1s linear all;
    +	-o-transition: 0.1s linear all;
    +	transition: 0.1s linear all;
    +}
    +
    +.btn:hover {
    +	background-position: 0 -15px;
    +	color: #333;
    +	text-decoration: none;
    +}
    +
    +.btn:focus {
    +	outline: 1px dotted #666;
    +}
    +
    +.btn.primary {
    +	color: #ffffff;
    +	background-color: #0064cd;
    +	background-repeat: repeat-x;
    +	background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb),
    +		to(#0064cd) );
    +	background-image: -moz-linear-gradient(top, #049cdb, #0064cd);
    +	background-image: -ms-linear-gradient(top, #049cdb, #0064cd);
    +	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb),
    +		color-stop(100%, #0064cd) );
    +	background-image: -webkit-linear-gradient(top, #049cdb, #0064cd);
    +	background-image: -o-linear-gradient(top, #049cdb, #0064cd);
    +	background-image: linear-gradient(top, #049cdb, #0064cd);
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#049cdb', endColorstr = '#0064cd', GradientType = 0 );
    +	text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +	border-color: #0064cd #0064cd #003f81;
    +	border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +}
    +
    +.btn.active,.btn:active {
    +	-webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px
    +		rgba(0, 0, 0, 0.05);
    +	-moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px
    +		rgba(0, 0, 0, 0.05);
    +	box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px
    +		rgba(0, 0, 0, 0.05);
    +}
    +
    +.btn.disabled {
    +	cursor: default;
    +	background-image: none;
    +	filter: progid : DXImageTransform.Microsoft.gradient ( enabled =   false
    +		);
    +	filter: alpha(opacity = 65);
    +	-khtml-opacity: 0.65;
    +	-moz-opacity: 0.65;
    +	opacity: 0.65;
    +	-webkit-box-shadow: none;
    +	-moz-box-shadow: none;
    +	box-shadow: none;
    +}
    +
    +.btn[disabled] {
    +	cursor: default;
    +	background-image: none;
    +	filter: progid : DXImageTransform.Microsoft.gradient ( enabled =   false
    +		);
    +	filter: alpha(opacity = 65);
    +	-khtml-opacity: 0.65;
    +	-moz-opacity: 0.65;
    +	opacity: 0.65;
    +	-webkit-box-shadow: none;
    +	-moz-box-shadow: none;
    +	box-shadow: none;
    +}
    +
    +.btn.large {
    +	font-size: 15px;
    +	line-height: normal;
    +	padding: 9px 14px 9px;
    +	-webkit-border-radius: 6px;
    +	-moz-border-radius: 6px;
    +	border-radius: 6px;
    +}
    +
    +.btn.small {
    +	padding: 7px 9px 7px;
    +	font-size: 11px;
    +}
    +
    +:root .alert-message,:root .btn {
    +	border-radius: 0 \0;
    +}
    +
    +button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner {
    +	padding: 0;
    +	border: 0;
    +}
    +
    +.close {
    +	float: right;
    +	color: #000000;
    +	font-size: 20px;
    +	font-weight: bold;
    +	line-height: 13.5px;
    +	text-shadow: 0 1px 0 #ffffff;
    +	filter: alpha(opacity = 25);
    +	-khtml-opacity: 0.25;
    +	-moz-opacity: 0.25;
    +	opacity: 0.25;
    +}
    +
    +.close:hover {
    +	color: #000000;
    +	text-decoration: none;
    +	filter: alpha(opacity = 40);
    +	-khtml-opacity: 0.4;
    +	-moz-opacity: 0.4;
    +	opacity: 0.4;
    +}
    +
    +.alert-message {
    +	position: relative;
    +	padding: 7px 15px;
    +	margin-bottom: 18px;
    +	color: #404040;
    +	background-color: #eedc94;
    +	background-repeat: repeat-x;
    +	background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
    +		to(#eedc94) );
    +	background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
    +	background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
    +	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1),
    +		color-stop(100%, #eedc94) );
    +	background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
    +	background-image: -o-linear-gradient(top, #fceec1, #eedc94);
    +	background-image: linear-gradient(top, #fceec1, #eedc94);
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#fceec1', endColorstr = '#eedc94', GradientType = 0 );
    +	text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +	border-color: #eedc94 #eedc94 #e4c652;
    +	border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +	text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
    +	border-width: 1px;
    +	border-style: solid;
    +	-webkit-border-radius: 4px;
    +	-moz-border-radius: 4px;
    +	border-radius: 4px;
    +	-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
    +	-moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
    +	box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
    +}
    +
    +.alert-message .close {
    +	margin-top: 1px;
    +	*margin-top: 0;
    +}
    +
    +.alert-message a {
    +	font-weight: bold;
    +	color: #404040;
    +}
    +
    +.alert-message.danger p a,.alert-message.error p a,.alert-message.success p a,.alert-message.info p a
    +	{
    +	color: #ffffff;
    +}
    +
    +.alert-message h5 {
    +	line-height: 18px;
    +}
    +
    +.alert-message p {
    +	margin-bottom: 0;
    +}
    +
    +.alert-message div {
    +	margin-top: 5px;
    +	margin-bottom: 2px;
    +	line-height: 28px;
    +}
    +
    +.alert-message .btn {
    +	-webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
    +	-moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
    +	box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
    +}
    +
    +.alert-message.block-message {
    +	background-image: none;
    +	background-color: #fdf5d9;
    +	filter: progid : DXImageTransform.Microsoft.gradient ( enabled =   false
    +		);
    +	padding: 14px;
    +	border-color: #fceec1;
    +	-webkit-box-shadow: none;
    +	-moz-box-shadow: none;
    +	box-shadow: none;
    +}
    +
    +.alert-message.block-message ul,.alert-message.block-message p {
    +	margin-right: 30px;
    +}
    +
    +.alert-message.block-message ul {
    +	margin-bottom: 0;
    +}
    +
    +.alert-message.block-message li {
    +	color: #404040;
    +}
    +
    +.alert-message.block-message .alert-actions {
    +	margin-top: 5px;
    +}
    +
    +.alert-message.block-message.error,.alert-message.block-message.success,.alert-message.block-message.info
    +	{
    +	color: #404040;
    +	text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
    +}
    +
    +.alert-message.block-message.error {
    +	background-color: #fddfde;
    +	border-color: #fbc7c6;
    +}
    +
    +.alert-message.block-message.success {
    +	background-color: #d1eed1;
    +	border-color: #bfe7bf;
    +}
    +
    +.alert-message.block-message.info {
    +	background-color: #ddf4fb;
    +	border-color: #c6edf9;
    +}
    +
    +.alert-message.block-message.danger p a,.alert-message.block-message.error p a,.alert-message.block-message.success p a,.alert-message.block-message.info p a
    +	{
    +	color: #404040;
    +}
    +
    +.pagination {
    +	height: 36px;
    +	margin: 18px 0;
    +}
    +
    +.pagination ul {
    +	float: left;
    +	margin: 0;
    +	border: 1px solid #ddd;
    +	border: 1px solid rgba(0, 0, 0, 0.15);
    +	-webkit-border-radius: 3px;
    +	-moz-border-radius: 3px;
    +	border-radius: 3px;
    +	-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
    +	-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
    +	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
    +}
    +
    +.pagination li {
    +	display: inline;
    +}
    +
    +.pagination a {
    +	float: left;
    +	padding: 0 14px;
    +	line-height: 34px;
    +	border-right: 1px solid;
    +	border-right-color: #ddd;
    +	border-right-color: rgba(0, 0, 0, 0.15);
    +	*border-right-color: #ddd;
    +	text-decoration: none;
    +}
    +
    +.pagination a:hover,.pagination .active a {
    +	background-color: #c7eefe;
    +}
    +
    +.pagination .disabled a,.pagination .disabled a:hover {
    +	background-color: transparent;
    +	color: #bfbfbf;
    +}
    +
    +.pagination .next a {
    +	border: 0;
    +}
    +
    +.well {
    +	background-color: #f5f5f5;
    +	margin-bottom: 20px;
    +	padding: 19px;
    +	min-height: 20px;
    +	border: 1px solid #eee;
    +	border: 1px solid rgba(0, 0, 0, 0.05);
    +	-webkit-border-radius: 4px;
    +	-moz-border-radius: 4px;
    +	border-radius: 4px;
    +	-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
    +	-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
    +	box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
    +}
    +
    +.well blockquote {
    +	border-color: #ddd;
    +	border-color: rgba(0, 0, 0, 0.15);
    +}
    +
    +.modal-backdrop {
    +	background-color: #000000;
    +	position: fixed;
    +	top: 0;
    +	left: 0;
    +	right: 0;
    +	bottom: 0;
    +	z-index: 10000;
    +}
    +
    +.modal-backdrop.fade {
    +	opacity: 0;
    +}
    +
    +.modal-backdrop,.modal-backdrop.fade.in {
    +	filter: alpha(opacity = 80);
    +	-khtml-opacity: 0.8;
    +	-moz-opacity: 0.8;
    +	opacity: 0.8;
    +}
    +
    +.modal {
    +	position: fixed;
    +	top: 50%;
    +	left: 50%;
    +	z-index: 11000;
    +	width: 560px;
    +	margin: -250px 0 0 -280px;
    +	background-color: #ffffff;
    +	border: 1px solid #999;
    +	border: 1px solid rgba(0, 0, 0, 0.3);
    +	*border: 1px solid #999;
    +	-webkit-border-radius: 6px;
    +	-moz-border-radius: 6px;
    +	border-radius: 6px;
    +	-webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
    +	-moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
    +	box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
    +	-webkit-background-clip: padding-box;
    +	-moz-background-clip: padding-box;
    +	background-clip: padding-box;
    +}
    +
    +.modal .close {
    +	margin-top: 7px;
    +}
    +
    +.modal.fade {
    +	-webkit-transition: opacity .3s linear, top .3s ease-out;
    +	-moz-transition: opacity .3s linear, top .3s ease-out;
    +	-ms-transition: opacity .3s linear, top .3s ease-out;
    +	-o-transition: opacity .3s linear, top .3s ease-out;
    +	transition: opacity .3s linear, top .3s ease-out;
    +	top: -25%;
    +}
    +
    +.modal.fade.in {
    +	top: 50%;
    +}
    +
    +.modal-header {
    +	border-bottom: 1px solid #eee;
    +	padding: 5px 15px;
    +}
    +
    +.modal-body {
    +	padding: 15px;
    +}
    +
    +.modal-body form {
    +	margin-bottom: 0;
    +}
    +
    +.modal-footer {
    +	background-color: #f5f5f5;
    +	padding: 14px 15px 15px;
    +	border-top: 1px solid #ddd;
    +	-webkit-border-radius: 0 0 6px 6px;
    +	-moz-border-radius: 0 0 6px 6px;
    +	border-radius: 0 0 6px 6px;
    +	-webkit-box-shadow: inset 0 1px 0 #ffffff;
    +	-moz-box-shadow: inset 0 1px 0 #ffffff;
    +	box-shadow: inset 0 1px 0 #ffffff;
    +	zoom: 1;
    +	margin-bottom: 0;
    +}
    +
    +.modal-footer:before,.modal-footer:after {
    +	display: table;
    +	content: "";
    +	zoom: 1;
    +}
    +
    +.modal-footer:after {
    +	clear: both;
    +}
    +
    +.modal-footer .btn {
    +	float: right;
    +	margin-left: 5px;
    +}
    +
    +.modal .popover,.modal .twipsy {
    +	z-index: 12000;
    +}
    +
    +.twipsy {
    +	display: block;
    +	position: absolute;
    +	visibility: visible;
    +	padding: 5px;
    +	font-size: 11px;
    +	z-index: 1000;
    +	filter: alpha(opacity = 80);
    +	-khtml-opacity: 0.8;
    +	-moz-opacity: 0.8;
    +	opacity: 0.8;
    +}
    +
    +.twipsy.fade.in {
    +	filter: alpha(opacity = 80);
    +	-khtml-opacity: 0.8;
    +	-moz-opacity: 0.8;
    +	opacity: 0.8;
    +}
    +
    +.twipsy.above .twipsy-arrow {
    +	bottom: 0;
    +	left: 50%;
    +	margin-left: -5px;
    +	border-left: 5px solid transparent;
    +	border-right: 5px solid transparent;
    +	border-top: 5px solid #000000;
    +}
    +
    +.twipsy.left .twipsy-arrow {
    +	top: 50%;
    +	right: 0;
    +	margin-top: -5px;
    +	border-top: 5px solid transparent;
    +	border-bottom: 5px solid transparent;
    +	border-left: 5px solid #000000;
    +}
    +
    +.twipsy.below .twipsy-arrow {
    +	top: 0;
    +	left: 50%;
    +	margin-left: -5px;
    +	border-left: 5px solid transparent;
    +	border-right: 5px solid transparent;
    +	border-bottom: 5px solid #000000;
    +}
    +
    +.twipsy.right .twipsy-arrow {
    +	top: 50%;
    +	left: 0;
    +	margin-top: -5px;
    +	border-top: 5px solid transparent;
    +	border-bottom: 5px solid transparent;
    +	border-right: 5px solid #000000;
    +}
    +
    +.twipsy-inner {
    +	padding: 3px 8px;
    +	background-color: #000000;
    +	color: white;
    +	text-align: center;
    +	max-width: 200px;
    +	text-decoration: none;
    +	-webkit-border-radius: 4px;
    +	-moz-border-radius: 4px;
    +	border-radius: 4px;
    +}
    +
    +.twipsy-arrow {
    +	position: absolute;
    +	width: 0;
    +	height: 0;
    +}
    +
    +.popover {
    +	position: absolute;
    +	top: 0;
    +	left: 0;
    +	z-index: 1000;
    +	padding: 5px;
    +	display: none;
    +}
    +
    +.popover.above .arrow {
    +	bottom: 0;
    +	left: 50%;
    +	margin-left: -5px;
    +	border-left: 5px solid transparent;
    +	border-right: 5px solid transparent;
    +	border-top: 5px solid #000000;
    +}
    +
    +.popover.right .arrow {
    +	top: 50%;
    +	left: 0;
    +	margin-top: -5px;
    +	border-top: 5px solid transparent;
    +	border-bottom: 5px solid transparent;
    +	border-right: 5px solid #000000;
    +}
    +
    +.popover.below .arrow {
    +	top: 0;
    +	left: 50%;
    +	margin-left: -5px;
    +	border-left: 5px solid transparent;
    +	border-right: 5px solid transparent;
    +	border-bottom: 5px solid #000000;
    +}
    +
    +.popover.left .arrow {
    +	top: 50%;
    +	right: 0;
    +	margin-top: -5px;
    +	border-top: 5px solid transparent;
    +	border-bottom: 5px solid transparent;
    +	border-left: 5px solid #000000;
    +}
    +
    +.popover .arrow {
    +	position: absolute;
    +	width: 0;
    +	height: 0;
    +}
    +
    +.popover .inner {
    +	background: #000000;
    +	background: rgba(0, 0, 0, 0.8);
    +	padding: 3px;
    +	overflow: hidden;
    +	width: 280px;
    +	-webkit-border-radius: 6px;
    +	-moz-border-radius: 6px;
    +	border-radius: 6px;
    +	-webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
    +	-moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
    +	box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
    +}
    +
    +.popover .title {
    +	background-color: #f5f5f5;
    +	padding: 9px 15px;
    +	line-height: 1;
    +	-webkit-border-radius: 3px 3px 0 0;
    +	-moz-border-radius: 3px 3px 0 0;
    +	border-radius: 3px 3px 0 0;
    +	border-bottom: 1px solid #eee;
    +}
    +
    +.popover .content {
    +	background-color: #ffffff;
    +	padding: 14px;
    +	-webkit-border-radius: 0 0 3px 3px;
    +	-moz-border-radius: 0 0 3px 3px;
    +	border-radius: 0 0 3px 3px;
    +	-webkit-background-clip: padding-box;
    +	-moz-background-clip: padding-box;
    +	background-clip: padding-box;
    +}
    +
    +.popover .content p,.popover .content ul,.popover .content ol {
    +	margin-bottom: 0;
    +}
    +
    +.fade {
    +	-webkit-transition: opacity 0.15s linear;
    +	-moz-transition: opacity 0.15s linear;
    +	-ms-transition: opacity 0.15s linear;
    +	-o-transition: opacity 0.15s linear;
    +	transition: opacity 0.15s linear;
    +	opacity: 0;
    +}
    +
    +.fade.in {
    +	opacity: 1;
    +}
    +
    +.label {
    +	padding: 1px 3px 2px;
    +	font-size: 9.75px;
    +	font-weight: bold;
    +	color: #ffffff;
    +	text-transform: uppercase;
    +	white-space: nowrap;
    +	background-color: #bfbfbf;
    +	-webkit-border-radius: 3px;
    +	-moz-border-radius: 3px;
    +	border-radius: 3px;
    +}
    +
    +.label.important {
    +	background-color: #c43c35;
    +}
    +
    +.label.warning {
    +	background-color: #f89406;
    +}
    +
    +.label.success {
    +	background-color: #46a546;
    +}
    +
    +.label.notice {
    +	background-color: #62cffc;
    +}
    +
    +.media-grid {
    +	margin-left: -20px;
    +	margin-bottom: 0;
    +	zoom: 1;
    +}
    +
    +.media-grid:before,.media-grid:after {
    +	display: table;
    +	content: "";
    +	zoom: 1;
    +}
    +
    +.media-grid:after {
    +	clear: both;
    +}
    +
    +.media-grid li {
    +	display: inline;
    +}
    +
    +.media-grid a {
    +	float: left;
    +	padding: 4px;
    +	margin: 0 0 18px 20px;
    +	border: 1px solid #ddd;
    +	-webkit-border-radius: 4px;
    +	-moz-border-radius: 4px;
    +	border-radius: 4px;
    +	-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
    +	-moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
    +	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
    +}
    +
    +.media-grid a img {
    +	display: block;
    +}
    +
    +.media-grid a:hover {
    +	border-color: #0069d6;
    +	-webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
    +	-moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
    +	box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/css/bootstrap.min.css b/src/main/webapp/plug-in/datatables/css/bootstrap.min.css
    new file mode 100644
    index 00000000..62ea314d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/css/bootstrap.min.css
    @@ -0,0 +1,740 @@
    +http://bootswatch.com/amelia/bootstrap.min.css@import url(https://fonts.googleapis.com/css?family=Telex);
    +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
    +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
    +audio:not([controls]){display:none;}
    +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
    +a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
    +a:hover,a:active{outline:0;}
    +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
    +sup{top:-0.5em;}
    +sub{bottom:-0.25em;}
    +img{max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;}
    +#map_canvas img{max-width:none;}
    +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
    +button,input{*overflow:visible;line-height:normal;}
    +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
    +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
    +input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;}
    +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
    +textarea{overflow:auto;vertical-align:top;}
    +.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}
    +.clearfix:after{clear:both;}
    +.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
    +.input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;}
    +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#555555;background-color:#ffffff;}
    +a{color:#369bd7;text-decoration:none;}
    +a:hover{color:#2071a1;text-decoration:underline;}
    +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";}
    +.row:after{clear:both;}
    +[class*="span"]{float:left;margin-left:20px;}
    +.container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
    +.span12{width:940px;}
    +.span11{width:860px;}
    +.span10{width:780px;}
    +.span9{width:700px;}
    +.span8{width:620px;}
    +.span7{width:540px;}
    +.span6{width:460px;}
    +.span5{width:380px;}
    +.span4{width:300px;}
    +.span3{width:220px;}
    +.span2{width:140px;}
    +.span1{width:60px;}
    +.offset12{margin-left:980px;}
    +.offset11{margin-left:900px;}
    +.offset10{margin-left:820px;}
    +.offset9{margin-left:740px;}
    +.offset8{margin-left:660px;}
    +.offset7{margin-left:580px;}
    +.offset6{margin-left:500px;}
    +.offset5{margin-left:420px;}
    +.offset4{margin-left:340px;}
    +.offset3{margin-left:260px;}
    +.offset2{margin-left:180px;}
    +.offset1{margin-left:100px;}
    +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";}
    +.row-fluid:after{clear:both;}
    +.row-fluid [class*="span"]{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574%;*margin-left:2.0744680846382977%;}
    +.row-fluid [class*="span"]:first-child{margin-left:0;}
    +.row-fluid .span12{width:99.99999998999999%;*width:99.94680850063828%;}
    +.row-fluid .span11{width:91.489361693%;*width:91.4361702036383%;}
    +.row-fluid .span10{width:82.97872339599999%;*width:82.92553190663828%;}
    +.row-fluid .span9{width:74.468085099%;*width:74.4148936096383%;}
    +.row-fluid .span8{width:65.95744680199999%;*width:65.90425531263828%;}
    +.row-fluid .span7{width:57.446808505%;*width:57.3936170156383%;}
    +.row-fluid .span6{width:48.93617020799999%;*width:48.88297871863829%;}
    +.row-fluid .span5{width:40.425531911%;*width:40.3723404216383%;}
    +.row-fluid .span4{width:31.914893614%;*width:31.8617021246383%;}
    +.row-fluid .span3{width:23.404255317%;*width:23.3510638276383%;}
    +.row-fluid .span2{width:14.89361702%;*width:14.8404255306383%;}
    +.row-fluid .span1{width:6.382978723%;*width:6.329787233638298%;}
    +.container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";}
    +.container:after{clear:both;}
    +.container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";}
    +.container-fluid:after{clear:both;}
    +p{margin:0 0 9px;}p small{font-size:11px;color:#999999;}
    +.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;}
    +h1,h2,h3,h4,h5,h6{margin:0;font-family:'Telex',sans-serif;font-weight:bold;color:#317eac;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}
    +h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;}
    +h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;}
    +h3{font-size:18px;line-height:27px;}h3 small{font-size:14px;}
    +h4,h5,h6{line-height:18px;}
    +h4{font-size:14px;}h4 small{font-size:12px;}
    +h5{font-size:12px;}
    +h6{font-size:11px;color:#999999;text-transform:uppercase;}
    +.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #f5f5f5;}
    +.page-header h1{line-height:1;}
    +ul,ol{padding:0;margin:0 0 9px 25px;}
    +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
    +ul{list-style:disc;}
    +ol{list-style:decimal;}
    +li{line-height:18px;}
    +ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
    +dl{margin-bottom:18px;}
    +dt,dd{line-height:18px;}
    +dt{font-weight:bold;line-height:17px;}
    +dd{margin-left:9px;}
    +.dl-horizontal dt{float:left;width:120px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
    +.dl-horizontal dd{margin-left:130px;}
    +hr{margin:18px 0;border:0;border-top:1px solid #f5f5f5;border-bottom:1px solid #ffffff;}
    +strong{font-weight:bold;}
    +em{font-style:italic;}
    +.muted{color:#999999;}
    +abbr[title]{cursor:help;border-bottom:1px dotted #999999;}
    +abbr.initialism{font-size:90%;text-transform:uppercase;}
    +blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #f5f5f5;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;}
    +blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
    +blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #f5f5f5;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
    +q:before,q:after,blockquote:before,blockquote:after{content:"";}
    +address{display:block;margin-bottom:18px;font-style:normal;line-height:18px;}
    +small{font-size:100%;}
    +cite{font-style:normal;}
    +code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
    +code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;}
    +pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12.025px;line-height:18px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:18px;}
    +pre code{padding:0;color:inherit;background-color:transparent;border:0;}
    +.pre-scrollable{max-height:340px;overflow-y:scroll;}
    +form{margin:0 0 18px;}
    +fieldset{padding:0;margin:0;border:0;}
    +legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:13.5px;color:#999999;}
    +label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;}
    +input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
    +label{display:block;margin-bottom:5px;}
    +select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;}
    +input,textarea{width:210px;}
    +textarea{height:auto;}
    +textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);}
    +input[type="radio"],input[type="checkbox"]{margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;}
    +input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;}
    +.uneditable-textarea{width:auto;height:auto;}
    +select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;}
    +select{width:220px;border:1px solid #bbb;}
    +select[multiple],select[size]{height:auto;}
    +select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
    +.radio,.checkbox{min-height:18px;padding-left:18px;}
    +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
    +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
    +.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
    +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
    +.input-mini{width:60px;}
    +.input-small{width:90px;}
    +.input-medium{width:150px;}
    +.input-large{width:210px;}
    +.input-xlarge{width:270px;}
    +.input-xxlarge{width:530px;}
    +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;}
    +.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;}
    +input,textarea,.uneditable-input{margin-left:0;}
    +input.span12, textarea.span12, .uneditable-input.span12{width:930px;}
    +input.span11, textarea.span11, .uneditable-input.span11{width:850px;}
    +input.span10, textarea.span10, .uneditable-input.span10{width:770px;}
    +input.span9, textarea.span9, .uneditable-input.span9{width:690px;}
    +input.span8, textarea.span8, .uneditable-input.span8{width:610px;}
    +input.span7, textarea.span7, .uneditable-input.span7{width:530px;}
    +input.span6, textarea.span6, .uneditable-input.span6{width:450px;}
    +input.span5, textarea.span5, .uneditable-input.span5{width:370px;}
    +input.span4, textarea.span4, .uneditable-input.span4{width:290px;}
    +input.span3, textarea.span3, .uneditable-input.span3{width:210px;}
    +input.span2, textarea.span2, .uneditable-input.span2{width:130px;}
    +input.span1, textarea.span1, .uneditable-input.span1{width:50px;}
    +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#f5f5f5;border-color:#ddd;}
    +input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;}
    +.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#1c628b;}
    +.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#1c628b;border-color:#1c628b;}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#134461;-webkit-box-shadow:0 0 6px #369bd7;-moz-box-shadow:0 0 6px #369bd7;box-shadow:0 0 6px #369bd7;}
    +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#1c628b;background-color:#8bc5e8;border-color:#1c628b;}
    +.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#bd4247;}
    +.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#bd4247;border-color:#bd4247;}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#983538;-webkit-box-shadow:0 0 6px #d88e90;-moz-box-shadow:0 0 6px #d88e90;box-shadow:0 0 6px #d88e90;}
    +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#bd4247;background-color:#eddbe3;border-color:#bd4247;}
    +.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#669533;}
    +.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#669533;border-color:#669533;}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#4c6f26;-webkit-box-shadow:0 0 6px #99ca63;-moz-box-shadow:0 0 6px #99ca63;box-shadow:0 0 6px #99ca63;}
    +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#669533;background-color:#ccddbb;border-color:#669533;}
    +input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
    +.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";}
    +.form-actions:after{clear:both;}
    +.uneditable-input{overflow:hidden;white-space:nowrap;cursor:not-allowed;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);}
    +:-moz-placeholder{color:#999999;}
    +:-ms-input-placeholder{color:#999999;}
    +::-webkit-input-placeholder{color:#999999;}
    +.help-block,.help-inline{color:#555555;}
    +.help-block{display:block;margin-bottom:9px;}
    +.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}
    +.input-prepend,.input-append{margin-bottom:5px;}.input-prepend input,.input-append input,.input-prepend select,.input-append select,.input-prepend .uneditable-input,.input-append .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:middle;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend select:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{z-index:2;}
    +.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;}
    +.input-prepend .add-on,.input-append .add-on{display:inline-block;width:auto;height:18px;min-width:16px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #ffffff;vertical-align:middle;background-color:#f5f5f5;border:1px solid #ccc;}
    +.input-prepend .add-on,.input-append .add-on,.input-prepend .btn,.input-append .btn{margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
    +.input-prepend .active,.input-append .active{background-color:#bede9c;border-color:#73a839;}
    +.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}
    +.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
    +.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
    +.input-append .uneditable-input{border-right-color:#ccc;border-left-color:#eee;}
    +.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
    +.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
    +.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
    +.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
    +.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;}
    +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;}
    +.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
    +.form-search label,.form-inline label{display:inline-block;}
    +.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}
    +.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}
    +.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;}
    +.control-group{margin-bottom:9px;}
    +legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;}
    +.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";}
    +.form-horizontal .control-group:after{clear:both;}
    +.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;}
    +.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:160px;}
    +.form-horizontal .help-block{margin-top:9px;margin-bottom:0;}
    +.form-horizontal .form-actions{padding-left:160px;}
    +table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;}
    +.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}
    +.table th{font-weight:bold;}
    +.table thead th{vertical-align:bottom;}
    +.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;}
    +.table tbody+tbody{border-top:2px solid #dddddd;}
    +.table-condensed th,.table-condensed td{padding:4px 5px;}
    +.table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapsed;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;}
    +.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
    +.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;}
    +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;}
    +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;}
    +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;}
    +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
    +.table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;}
    +table .span1{float:none;width:44px;margin-left:0;}
    +table .span2{float:none;width:124px;margin-left:0;}
    +table .span3{float:none;width:204px;margin-left:0;}
    +table .span4{float:none;width:284px;margin-left:0;}
    +table .span5{float:none;width:364px;margin-left:0;}
    +table .span6{float:none;width:444px;margin-left:0;}
    +table .span7{float:none;width:524px;margin-left:0;}
    +table .span8{float:none;width:604px;margin-left:0;}
    +table .span9{float:none;width:684px;margin-left:0;}
    +table .span10{float:none;width:764px;margin-left:0;}
    +table .span11{float:none;width:844px;margin-left:0;}
    +table .span12{float:none;width:924px;margin-left:0;}
    +table .span13{float:none;width:1004px;margin-left:0;}
    +table .span14{float:none;width:1084px;margin-left:0;}
    +table .span15{float:none;width:1164px;margin-left:0;}
    +table .span16{float:none;width:1244px;margin-left:0;}
    +table .span17{float:none;width:1324px;margin-left:0;}
    +table .span18{float:none;width:1404px;margin-left:0;}
    +table .span19{float:none;width:1484px;margin-left:0;}
    +table .span20{float:none;width:1564px;margin-left:0;}
    +table .span21{float:none;width:1644px;margin-left:0;}
    +table .span22{float:none;width:1724px;margin-left:0;}
    +table .span23{float:none;width:1804px;margin-left:0;}
    +table .span24{float:none;width:1884px;margin-left:0;}
    +[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0;}
    +.icon-white{background-image:url("../img/glyphicons-halflings-white.png");}
    +.icon-glass{background-position:0 0;}
    +.icon-music{background-position:-24px 0;}
    +.icon-search{background-position:-48px 0;}
    +.icon-envelope{background-position:-72px 0;}
    +.icon-heart{background-position:-96px 0;}
    +.icon-star{background-position:-120px 0;}
    +.icon-star-empty{background-position:-144px 0;}
    +.icon-user{background-position:-168px 0;}
    +.icon-film{background-position:-192px 0;}
    +.icon-th-large{background-position:-216px 0;}
    +.icon-th{background-position:-240px 0;}
    +.icon-th-list{background-position:-264px 0;}
    +.icon-ok{background-position:-288px 0;}
    +.icon-remove{background-position:-312px 0;}
    +.icon-zoom-in{background-position:-336px 0;}
    +.icon-zoom-out{background-position:-360px 0;}
    +.icon-off{background-position:-384px 0;}
    +.icon-signal{background-position:-408px 0;}
    +.icon-cog{background-position:-432px 0;}
    +.icon-trash{background-position:-456px 0;}
    +.icon-home{background-position:0 -24px;}
    +.icon-file{background-position:-24px -24px;}
    +.icon-time{background-position:-48px -24px;}
    +.icon-road{background-position:-72px -24px;}
    +.icon-download-alt{background-position:-96px -24px;}
    +.icon-download{background-position:-120px -24px;}
    +.icon-upload{background-position:-144px -24px;}
    +.icon-inbox{background-position:-168px -24px;}
    +.icon-play-circle{background-position:-192px -24px;}
    +.icon-repeat{background-position:-216px -24px;}
    +.icon-refresh{background-position:-240px -24px;}
    +.icon-list-alt{background-position:-264px -24px;}
    +.icon-lock{background-position:-287px -24px;}
    +.icon-flag{background-position:-312px -24px;}
    +.icon-headphones{background-position:-336px -24px;}
    +.icon-volume-off{background-position:-360px -24px;}
    +.icon-volume-down{background-position:-384px -24px;}
    +.icon-volume-up{background-position:-408px -24px;}
    +.icon-qrcode{background-position:-432px -24px;}
    +.icon-barcode{background-position:-456px -24px;}
    +.icon-tag{background-position:0 -48px;}
    +.icon-tags{background-position:-25px -48px;}
    +.icon-book{background-position:-48px -48px;}
    +.icon-bookmark{background-position:-72px -48px;}
    +.icon-print{background-position:-96px -48px;}
    +.icon-camera{background-position:-120px -48px;}
    +.icon-font{background-position:-144px -48px;}
    +.icon-bold{background-position:-167px -48px;}
    +.icon-italic{background-position:-192px -48px;}
    +.icon-text-height{background-position:-216px -48px;}
    +.icon-text-width{background-position:-240px -48px;}
    +.icon-align-left{background-position:-264px -48px;}
    +.icon-align-center{background-position:-288px -48px;}
    +.icon-align-right{background-position:-312px -48px;}
    +.icon-align-justify{background-position:-336px -48px;}
    +.icon-list{background-position:-360px -48px;}
    +.icon-indent-left{background-position:-384px -48px;}
    +.icon-indent-right{background-position:-408px -48px;}
    +.icon-facetime-video{background-position:-432px -48px;}
    +.icon-picture{background-position:-456px -48px;}
    +.icon-pencil{background-position:0 -72px;}
    +.icon-map-marker{background-position:-24px -72px;}
    +.icon-adjust{background-position:-48px -72px;}
    +.icon-tint{background-position:-72px -72px;}
    +.icon-edit{background-position:-96px -72px;}
    +.icon-share{background-position:-120px -72px;}
    +.icon-check{background-position:-144px -72px;}
    +.icon-move{background-position:-168px -72px;}
    +.icon-step-backward{background-position:-192px -72px;}
    +.icon-fast-backward{background-position:-216px -72px;}
    +.icon-backward{background-position:-240px -72px;}
    +.icon-play{background-position:-264px -72px;}
    +.icon-pause{background-position:-288px -72px;}
    +.icon-stop{background-position:-312px -72px;}
    +.icon-forward{background-position:-336px -72px;}
    +.icon-fast-forward{background-position:-360px -72px;}
    +.icon-step-forward{background-position:-384px -72px;}
    +.icon-eject{background-position:-408px -72px;}
    +.icon-chevron-left{background-position:-432px -72px;}
    +.icon-chevron-right{background-position:-456px -72px;}
    +.icon-plus-sign{background-position:0 -96px;}
    +.icon-minus-sign{background-position:-24px -96px;}
    +.icon-remove-sign{background-position:-48px -96px;}
    +.icon-ok-sign{background-position:-72px -96px;}
    +.icon-question-sign{background-position:-96px -96px;}
    +.icon-info-sign{background-position:-120px -96px;}
    +.icon-screenshot{background-position:-144px -96px;}
    +.icon-remove-circle{background-position:-168px -96px;}
    +.icon-ok-circle{background-position:-192px -96px;}
    +.icon-ban-circle{background-position:-216px -96px;}
    +.icon-arrow-left{background-position:-240px -96px;}
    +.icon-arrow-right{background-position:-264px -96px;}
    +.icon-arrow-up{background-position:-289px -96px;}
    +.icon-arrow-down{background-position:-312px -96px;}
    +.icon-share-alt{background-position:-336px -96px;}
    +.icon-resize-full{background-position:-360px -96px;}
    +.icon-resize-small{background-position:-384px -96px;}
    +.icon-plus{background-position:-408px -96px;}
    +.icon-minus{background-position:-433px -96px;}
    +.icon-asterisk{background-position:-456px -96px;}
    +.icon-exclamation-sign{background-position:0 -120px;}
    +.icon-gift{background-position:-24px -120px;}
    +.icon-leaf{background-position:-48px -120px;}
    +.icon-fire{background-position:-72px -120px;}
    +.icon-eye-open{background-position:-96px -120px;}
    +.icon-eye-close{background-position:-120px -120px;}
    +.icon-warning-sign{background-position:-144px -120px;}
    +.icon-plane{background-position:-168px -120px;}
    +.icon-calendar{background-position:-192px -120px;}
    +.icon-random{background-position:-216px -120px;}
    +.icon-comment{background-position:-240px -120px;}
    +.icon-magnet{background-position:-264px -120px;}
    +.icon-chevron-up{background-position:-288px -120px;}
    +.icon-chevron-down{background-position:-313px -119px;}
    +.icon-retweet{background-position:-336px -120px;}
    +.icon-shopping-cart{background-position:-360px -120px;}
    +.icon-folder-close{background-position:-384px -120px;}
    +.icon-folder-open{background-position:-408px -120px;}
    +.icon-resize-vertical{background-position:-432px -119px;}
    +.icon-resize-horizontal{background-position:-456px -118px;}
    +.icon-hdd{background-position:0 -144px;}
    +.icon-bullhorn{background-position:-24px -144px;}
    +.icon-bell{background-position:-48px -144px;}
    +.icon-certificate{background-position:-72px -144px;}
    +.icon-thumbs-up{background-position:-96px -144px;}
    +icon-text-width.icon-thumbs-down{background-position:-120px -144px;}
    +.icon-hand-right{background-position:-144px -144px;}
    +.icon-hand-left{background-position:-168px -144px;}
    +.icon-hand-up{background-position:-192px -144px;}
    +.icon-hand-down{background-position:-216px -144px;}
    +.icon-circle-arrow-right{background-position:-240px -144px;}
    +.icon-circle-arrow-left{background-position:-264px -144px;}
    +.icon-circle-arrow-up{background-position:-288px -144px;}
    +.icon-circle-arrow-down{background-position:-312px -144px;}
    +.icon-globe{background-position:-336px -144px;}
    +.icon-wrench{background-position:-360px -144px;}
    +.icon-tasks{background-position:-384px -144px;}
    +.icon-filter{background-position:-408px -144px;}
    +.icon-briefcase{background-position:-432px -144px;}
    +.icon-fullscreen{background-position:-456px -144px;}
    +.dropup,.dropdown{position:relative;}
    +.dropdown-toggle{*margin-bottom:-3px;}
    +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
    +.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";opacity:0.3;filter:alpha(opacity=30);}
    +.dropdown .caret{margin-top:8px;margin-left:2px;}
    +.dropdown:hover .caret,.open .caret{opacity:1;filter:alpha(opacity=100);}
    +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:4px 0;margin:1px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;}.dropdown-menu.pull-right{right:0;left:auto;}
    +.dropdown-menu .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
    +.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#333333;white-space:nowrap;}
    +.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#369bd7;}
    +.open{*z-index:1000;}.open >.dropdown-menu{display:block;}
    +.pull-right>.dropdown-menu{right:0;left:auto;}
    +.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"\2191";}
    +.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;}
    +.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
    +.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
    +.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
    +.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
    +.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;}
    +.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;}
    +.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);}
    +button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;}
    +.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;*line-height:20px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-ms-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(top, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #cccccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;*background-color:#d9d9d9;}
    +.btn:active,.btn.active{background-color:#cccccc \9;}
    +.btn:first-child{*margin-left:0;}
    +.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
    +.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
    +.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
    +.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
    +.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
    +.btn-large [class^="icon-"]{margin-top:1px;}
    +.btn-small{padding:5px 9px;font-size:11px;line-height:16px;}
    +.btn-small [class^="icon-"]{margin-top:-1px;}
    +.btn-mini{padding:2px 6px;font-size:11px;line-height:14px;}
    +.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
    +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}
    +.btn{border-color:#ccc;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
    +.btn-primary{background-color:#368bd7;background-image:-moz-linear-gradient(top, #369bd7, #3673d7);background-image:-ms-linear-gradient(top, #369bd7, #3673d7);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#369bd7), to(#3673d7));background-image:-webkit-linear-gradient(top, #369bd7, #3673d7);background-image:-o-linear-gradient(top, #369bd7, #3673d7);background-image:linear-gradient(top, #369bd7, #3673d7);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#369bd7', endColorstr='#3673d7', GradientType=0);border-color:#3673d7 #3673d7 #2050a1;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#3673d7;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#3673d7;*background-color:#2866cb;}
    +.btn-primary:active,.btn-primary.active{background-color:#245bb6 \9;}
    +.btn-warning{background-color:#dd5600;background-image:-moz-linear-gradient(top, #dd5600, #dd5600);background-image:-ms-linear-gradient(top, #dd5600, #dd5600);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#dd5600), to(#dd5600));background-image:-webkit-linear-gradient(top, #dd5600, #dd5600);background-image:-o-linear-gradient(top, #dd5600, #dd5600);background-image:linear-gradient(top, #dd5600, #dd5600);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd5600', endColorstr='#dd5600', GradientType=0);border-color:#dd5600 #dd5600 #913800;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#dd5600;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#dd5600;*background-color:#c44c00;}
    +.btn-warning:active,.btn-warning.active{background-color:#aa4200 \9;}
    +.btn-danger{background-color:#c32627;background-image:-moz-linear-gradient(top, #c71c22, #bd362f);background-image:-ms-linear-gradient(top, #c71c22, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#c71c22), to(#bd362f));background-image:-webkit-linear-gradient(top, #c71c22, #bd362f);background-image:-o-linear-gradient(top, #c71c22, #bd362f);background-image:linear-gradient(top, #c71c22, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#c71c22', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;*background-color:#a9302a;}
    +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
    +.btn-success{background-color:#65a643;background-image:-moz-linear-gradient(top, #73a839, #51a351);background-image:-ms-linear-gradient(top, #73a839, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#73a839), to(#51a351));background-image:-webkit-linear-gradient(top, #73a839, #51a351);background-image:-o-linear-gradient(top, #73a839, #51a351);background-image:linear-gradient(top, #73a839, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#73a839', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;*background-color:#499249;}
    +.btn-success:active,.btn-success.active{background-color:#408140 \9;}
    +.btn-info{background-color:#6d76b3;background-image:-moz-linear-gradient(top, #9760b3, #2f96b4);background-image:-ms-linear-gradient(top, #9760b3, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#9760b3), to(#2f96b4));background-image:-webkit-linear-gradient(top, #9760b3, #2f96b4);background-image:-o-linear-gradient(top, #9760b3, #2f96b4);background-image:linear-gradient(top, #9760b3, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9760b3', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;*background-color:#2a85a0;}
    +.btn-info:active,.btn-info.active{background-color:#24748c \9;}
    +.btn-inverse{background-color:#a27a28;background-image:-moz-linear-gradient(top, #f7b42c, #222222);background-image:-ms-linear-gradient(top, #f7b42c, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f7b42c), to(#222222));background-image:-webkit-linear-gradient(top, #f7b42c, #222222);background-image:-o-linear-gradient(top, #f7b42c, #222222);background-image:linear-gradient(top, #f7b42c, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7b42c', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#222222;*background-color:#151515;}
    +.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
    +button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
    +button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}
    +button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}
    +button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}
    +.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";}
    +.btn-group:after{clear:both;}
    +.btn-group:first-child{*margin-left:0;}
    +.btn-group+.btn-group{margin-left:5px;}
    +.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;}
    +.btn-group>.btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
    +.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
    +.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
    +.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
    +.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
    +.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;}
    +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
    +.btn-group>.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:4px;*padding-bottom:4px;}
    +.btn-group>.btn-mini.dropdown-toggle{padding-left:5px;padding-right:5px;}
    +.btn-group>.btn-small.dropdown-toggle{*padding-top:4px;*padding-bottom:4px;}
    +.btn-group>.btn-large.dropdown-toggle{padding-left:12px;padding-right:12px;}
    +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
    +.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;}
    +.btn-group.open .btn-primary.dropdown-toggle{background-color:#3673d7;}
    +.btn-group.open .btn-warning.dropdown-toggle{background-color:#dd5600;}
    +.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;}
    +.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;}
    +.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;}
    +.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;}
    +.btn .caret{margin-top:7px;margin-left:0;}
    +.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);}
    +.btn-mini .caret{margin-top:5px;}
    +.btn-small .caret{margin-top:6px;}
    +.btn-large .caret{margin-top:6px;border-left-width:5px;border-right-width:5px;border-top-width:5px;}
    +.dropup .btn-large .caret{border-bottom:5px solid #000000;border-top:0;}
    +.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);}
    +.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#8bc5e8;border:1px solid #7ed0e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#1c628b;}
    +.alert-heading{color:inherit;}
    +.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;}
    +.alert-success{background-color:#ccddbb;border-color:#c6d4aa;color:#669533;}
    +.alert-danger,.alert-error{background-color:#eddbe3;border-color:#e8d1df;color:#bd4247;}
    +.alert-info{background-color:#edebe1;border-color:#e0d9cb;color:#817b58;}
    +.alert-block{padding-top:14px;padding-bottom:14px;}
    +.alert-block>p,.alert-block>ul{margin-bottom:0;}
    +.alert-block p+p{margin-top:5px;}
    +.nav{margin-left:0;margin-bottom:18px;list-style:none;}
    +.nav>li>a{display:block;}
    +.nav>li>a:hover{text-decoration:none;background-color:#f5f5f5;}
    +.nav>.pull-right{float:right;}
    +.nav .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;}
    +.nav li+.nav-header{margin-top:9px;}
    +.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;}
    +.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
    +.nav-list>li>a{padding:3px 15px;}
    +.nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#369bd7;}
    +.nav-list [class^="icon-"]{margin-right:2px;}
    +.nav-list .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
    +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";}
    +.nav-tabs:after,.nav-pills:after{clear:both;}
    +.nav-tabs>li,.nav-pills>li{float:left;}
    +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
    +.nav-tabs{border-bottom:1px solid #ddd;}
    +.nav-tabs>li{margin-bottom:-1px;}
    +.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:18px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#f5f5f5 #f5f5f5 #dddddd;}
    +.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
    +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
    +.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#369bd7;}
    +.nav-stacked>li{float:none;}
    +.nav-stacked>li>a{margin-right:0;}
    +.nav-tabs.nav-stacked{border-bottom:0;}
    +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
    +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
    +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
    +.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;}
    +.nav-pills.nav-stacked>li>a{margin-bottom:3px;}
    +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
    +.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;}
    +.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
    +.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#369bd7;border-bottom-color:#369bd7;margin-top:6px;}
    +.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#2071a1;border-bottom-color:#2071a1;}
    +.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;border-bottom-color:#333333;}
    +.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;}
    +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;}
    +.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
    +.tabs-stacked .open>a:hover{border-color:#999999;}
    +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";}
    +.tabbable:after{clear:both;}
    +.tab-content{overflow:auto;}
    +.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;}
    +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
    +.tab-content>.active,.pill-content>.active{display:block;}
    +.tabs-below>.nav-tabs{border-top:1px solid #ddd;}
    +.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;}
    +.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;}
    +.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd;}
    +.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;}
    +.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
    +.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
    +.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
    +.tabs-left>.nav-tabs>li>a:hover{border-color:#f5f5f5 #dddddd #f5f5f5 #f5f5f5;}
    +.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
    +.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
    +.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
    +.tabs-right>.nav-tabs>li>a:hover{border-color:#f5f5f5 #f5f5f5 #f5f5f5 #dddddd;}
    +.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
    +.navbar{*position:relative;*z-index:2;overflow:visible;margin-bottom:18px;}
    +.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#50a8dc;background-image:-moz-linear-gradient(top, #61b0df, #369bd7);background-image:-ms-linear-gradient(top, #61b0df, #369bd7);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#61b0df), to(#369bd7));background-image:-webkit-linear-gradient(top, #61b0df, #369bd7);background-image:-o-linear-gradient(top, #61b0df, #369bd7);background-image:linear-gradient(top, #61b0df, #369bd7);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#61b0df', endColorstr='#369bd7', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1);}
    +.navbar .container{width:auto;}
    +.nav-collapse.collapse{height:auto;}
    +.navbar{color:#f5f5f5;}.navbar .brand:hover{text-decoration:none;}
    +.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#f5f5f5;}
    +.navbar .navbar-text{margin-bottom:0;line-height:40px;}
    +.navbar .navbar-link{color:#f5f5f5;}.navbar .navbar-link:hover{color:#ffffff;}
    +.navbar .btn,.navbar .btn-group{margin-top:5px;}
    +.navbar .btn-group .btn{margin:0;}
    +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";}
    +.navbar-form:after{clear:both;}
    +.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
    +.navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0;}
    +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
    +.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}
    +.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;background-color:#a0d0ec;border:1px solid #288ecb;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query:-moz-placeholder{color:#ffffff;}
    +.navbar-search .search-query:-ms-input-placeholder{color:#ffffff;}
    +.navbar-search .search-query::-webkit-input-placeholder{color:#ffffff;}
    +.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
    +.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;}
    +.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
    +.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
    +.navbar-fixed-top{top:0;}
    +.navbar-fixed-bottom{bottom:0;}
    +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
    +.navbar .nav.pull-right{float:right;}
    +.navbar .nav>li{display:block;float:left;}
    +.navbar .nav>li>a{float:none;padding:9px 10px 11px;line-height:19px;color:#f5f5f5;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
    +.navbar .btn{display:inline-block;padding:4px 10px 4px;margin:5px 5px 6px;line-height:18px;}
    +.navbar .btn-group{margin:0;padding:5px 5px 6px;}
    +.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;}
    +.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:rgba(0, 0, 0, 0.2);}
    +.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#369bd7;border-right:1px solid #61b0df;}
    +.navbar .nav.pull-right{margin-left:10px;margin-right:0;}
    +.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#50a8dc;background-image:-moz-linear-gradient(top, #61b0df, #369bd7);background-image:-ms-linear-gradient(top, #61b0df, #369bd7);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#61b0df), to(#369bd7));background-image:-webkit-linear-gradient(top, #61b0df, #369bd7);background-image:-o-linear-gradient(top, #61b0df, #369bd7);background-image:linear-gradient(top, #61b0df, #369bd7);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#61b0df', endColorstr='#369bd7', GradientType=0);border-color:#369bd7 #369bd7 #2071a1;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#369bd7;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{background-color:#369bd7;*background-color:#288ecb;}
    +.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#2480b6 \9;}
    +.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
    +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
    +.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
    +.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
    +.navbar-fixed-bottom .dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;}
    +.navbar-fixed-bottom .dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;}
    +.navbar .nav li.dropdown .dropdown-toggle .caret,.navbar .nav li.dropdown.open .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
    +.navbar .nav li.dropdown.active .caret{opacity:1;filter:alpha(opacity=100);}
    +.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:transparent;}
    +.navbar .nav li.dropdown.active>.dropdown-toggle:hover{color:#ffffff;}
    +.navbar .pull-right .dropdown-menu,.navbar .dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right .dropdown-menu:before,.navbar .dropdown-menu.pull-right:before{left:auto;right:12px;}
    +.navbar .pull-right .dropdown-menu:after,.navbar .dropdown-menu.pull-right:after{left:auto;right:13px;}
    +.breadcrumb{padding:7px 14px;margin:0 0 18px;list-style:none;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}
    +.breadcrumb .divider{padding:0 5px;color:#999999;}
    +.breadcrumb .active a{color:#333333;}
    +.pagination{height:36px;margin:18px 0;}
    +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
    +.pagination li{display:inline;}
    +.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;}
    +.pagination a:hover,.pagination .active a{background-color:#f5f5f5;}
    +.pagination .active a{color:#999999;cursor:default;}
    +.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;}
    +.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
    +.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
    +.pagination-centered{text-align:center;}
    +.pagination-right{text-align:right;}
    +.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";}
    +.pager:after{clear:both;}
    +.pager li{display:inline;}
    +.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
    +.pager a:hover{text-decoration:none;background-color:#f5f5f5;}
    +.pager .next a{float:right;}
    +.pager .previous a{float:left;}
    +.pager .disabled a,.pager .disabled a:hover{color:#999999;background-color:#fff;cursor:default;}
    +.modal-open .dropdown-menu{z-index:2050;}
    +.modal-open .dropdown.open{*z-index:2050;}
    +.modal-open .popover{z-index:2060;}
    +.modal-open .tooltip{z-index:2070;}
    +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
    +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
    +.modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
    +.modal.fade.in{top:50%;}
    +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
    +.modal-body{overflow-y:auto;max-height:400px;padding:15px;}
    +.modal-form{margin-bottom:0;}
    +.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";}
    +.modal-footer:after{clear:both;}
    +.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;}
    +.modal-footer .btn-group .btn+.btn{margin-left:-1px;}
    +.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
    +.tooltip.top{margin-top:-2px;}
    +.tooltip.right{margin-left:2px;}
    +.tooltip.bottom{margin-top:2px;}
    +.tooltip.left{margin-left:-2px;}
    +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
    +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
    +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
    +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
    +.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
    +.tooltip-arrow{position:absolute;width:0;height:0;}
    +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;}
    +.popover.right{margin-left:5px;}
    +.popover.bottom{margin-top:5px;}
    +.popover.left{margin-left:-5px;}
    +.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
    +.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
    +.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
    +.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
    +.popover .arrow{position:absolute;width:0;height:0;}
    +.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);}
    +.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;}
    +.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;}
    +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";}
    +.thumbnails:after{clear:both;}
    +.row-fluid .thumbnails{margin-left:0;}
    +.thumbnails>li{float:left;margin-bottom:18px;margin-left:20px;}
    +.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}
    +a.thumbnail:hover{border-color:#369bd7;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
    +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
    +.thumbnail .caption{padding:9px;}
    +.label,.badge{font-size:10.998px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;}
    +.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
    +.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;}
    +a.label:hover,a.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;}
    +.label-important,.badge-important{background-color:#bd4247;}
    +.label-important[href],.badge-important[href]{background-color:#983538;}
    +.label-warning,.badge-warning{background-color:#dd5600;}
    +.label-warning[href],.badge-warning[href]{background-color:#aa4200;}
    +.label-success,.badge-success{background-color:#669533;}
    +.label-success[href],.badge-success[href]{background-color:#4c6f26;}
    +.label-info,.badge-info{background-color:#817b58;}
    +.label-info[href],.badge-info[href]{background-color:#625e43;}
    +.label-inverse,.badge-inverse{background-color:#333333;}
    +.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;}
    +@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
    +.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;}
    +.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;}
    +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
    +.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);}
    +.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
    +.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);}
    +.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
    +.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);}
    +.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
    +.progress-warning .bar{background-color:#f16e1a;background-image:-moz-linear-gradient(top, #ff7d2b, #dd5600);background-image:-ms-linear-gradient(top, #ff7d2b, #dd5600);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ff7d2b), to(#dd5600));background-image:-webkit-linear-gradient(top, #ff7d2b, #dd5600);background-image:-o-linear-gradient(top, #ff7d2b, #dd5600);background-image:linear-gradient(top, #ff7d2b, #dd5600);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff7d2b', endColorstr='#dd5600', GradientType=0);}
    +.progress-warning.progress-striped .bar{background-color:#ff7d2b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
    +.accordion{margin-bottom:18px;}
    +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
    +.accordion-heading{border-bottom:0;}
    +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
    +.accordion-toggle{cursor:pointer;}
    +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
    +.carousel{position:relative;margin-bottom:18px;line-height:1;}
    +.carousel-inner{overflow:hidden;width:100%;position:relative;}
    +.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}
    +.carousel .item>img{display:block;line-height:1;}
    +.carousel .active,.carousel .next,.carousel .prev{display:block;}
    +.carousel .active{left:0;}
    +.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;}
    +.carousel .next{left:100%;}
    +.carousel .prev{left:-100%;}
    +.carousel .next.left,.carousel .prev.right{left:0;}
    +.carousel .active.left{left:-100%;}
    +.carousel .active.right{left:100%;}
    +.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
    +.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
    +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);}
    +.carousel-caption h4,.carousel-caption p{color:#ffffff;}
    +.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;}
    +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;color:inherit;}
    +.pull-right{float:right;}
    +.pull-left{float:left;}
    +.hide{display:none;}
    +.show{display:block;}
    +.invisible{visibility:hidden;}
    +.navbar{font-family:'Telex',sans-serif;}.navbar .navbar-inner{background-color:#3f9fd9;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#369bd7), color-stop(90%, #369bd7), to(#61b0df));background-image:-webkit-linear-gradient(#369bd7, #369bd7 90%, #61b0df);background-image:-moz-linear-gradient(top, #369bd7, #369bd7 90%, #61b0df);background-image:-ms-linear-gradient(#369bd7, #369bd7 90%, #61b0df);background-image:-o-linear-gradient(#369bd7, #369bd7 90%, #61b0df);background-image:linear-gradient(#369bd7, #369bd7 90%, #61b0df);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#369bd7', endColorstr='#61b0df', GradientType=0);}
    +.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.active.open>.dropdown-toggle{background-color:rgba(0, 0, 0, 0.2);}
    +.navbar .search-query{border:1px solid #2480b6;}
    +.navbar .nav-collapse.in>.nav>li .dropdown-menu a{color:#ffffff;}.navbar .nav-collapse.in>.nav>li .dropdown-menu a:hover{color:#ffffff;}
    +.navbar .nav-collapse.in .nav li>a{color:#ffffff;}.navbar .nav-collapse.in .nav li>a:hover{background-color:#2B7CAC;}
    +.navbar .btn-navbar:hover{background-color:#cccccc;}
    +div.subnav{font-family:'Telex',sans-serif;}
    +.btn{background-color:#ffffff;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(5%, #ffffff), to(#ffffff));background-image:-webkit-linear-gradient(#ffffff, #ffffff 5%, #ffffff);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 5%, #ffffff);background-image:-ms-linear-gradient(#ffffff, #ffffff 5%, #ffffff);background-image:-o-linear-gradient(#ffffff, #ffffff 5%, #ffffff);background-image:linear-gradient(#ffffff, #ffffff 5%, #ffffff);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#ffffff', GradientType=0);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);}.btn:hover{background-position:0 0;}
    +.btn-primary{background-color:#43a1da;background-image:-moz-linear-gradient(top, #4ba6db, #369bd7);background-image:-ms-linear-gradient(top, #4ba6db, #369bd7);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#4ba6db), to(#369bd7));background-image:-webkit-linear-gradient(top, #4ba6db, #369bd7);background-image:-o-linear-gradient(top, #4ba6db, #369bd7);background-image:linear-gradient(top, #4ba6db, #369bd7);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4ba6db', endColorstr='#369bd7', GradientType=0);border-color:#369bd7 #369bd7 #2071a1;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#369bd7;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#369bd7;*background-color:#288ecb;}
    +.btn-primary:active,.btn-primary.active{background-color:#2480b6 \9;}
    +.btn-info{background-color:#9e6ab8;background-image:-moz-linear-gradient(top, #a271bb, #9760b3);background-image:-ms-linear-gradient(top, #a271bb, #9760b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#a271bb), to(#9760b3));background-image:-webkit-linear-gradient(top, #a271bb, #9760b3);background-image:-o-linear-gradient(top, #a271bb, #9760b3);background-image:linear-gradient(top, #a271bb, #9760b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#a271bb', endColorstr='#9760b3', GradientType=0);border-color:#9760b3 #9760b3 #6f4086;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#9760b3;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#9760b3;*background-color:#8b51a9;}
    +.btn-info:active,.btn-info.active{background-color:#7d4898 \9;}
    +.btn-success{background-color:#7bb33d;background-image:-moz-linear-gradient(top, #80bb3f, #73a839);background-image:-ms-linear-gradient(top, #80bb3f, #73a839);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#80bb3f), to(#73a839));background-image:-webkit-linear-gradient(top, #80bb3f, #73a839);background-image:-o-linear-gradient(top, #80bb3f, #73a839);background-image:linear-gradient(top, #80bb3f, #73a839);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80bb3f', endColorstr='#73a839', GradientType=0);border-color:#73a839 #73a839 #4c6f26;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#73a839;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#73a839;*background-color:#669533;}
    +.btn-success:active,.btn-success.active{background-color:#59822c \9;}
    +.btn-warning{background-color:#ec5c00;background-image:-moz-linear-gradient(top, #f76000, #dd5600);background-image:-ms-linear-gradient(top, #f76000, #dd5600);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f76000), to(#dd5600));background-image:-webkit-linear-gradient(top, #f76000, #dd5600);background-image:-o-linear-gradient(top, #f76000, #dd5600);background-image:linear-gradient(top, #f76000, #dd5600);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f76000', endColorstr='#dd5600', GradientType=0);border-color:#dd5600 #dd5600 #913800;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#dd5600;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#dd5600;*background-color:#c44c00;}
    +.btn-warning:active,.btn-warning.active{background-color:#aa4200 \9;}
    +.btn-danger{background-color:#d41e24;background-image:-moz-linear-gradient(top, #dd1f26, #c71c22);background-image:-ms-linear-gradient(top, #dd1f26, #c71c22);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#dd1f26), to(#c71c22));background-image:-webkit-linear-gradient(top, #dd1f26, #c71c22);background-image:-o-linear-gradient(top, #dd1f26, #c71c22);background-image:linear-gradient(top, #dd1f26, #c71c22);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd1f26', endColorstr='#c71c22', GradientType=0);border-color:#c71c22 #c71c22 #841317;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#c71c22;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#c71c22;*background-color:#b1191e;}
    +.btn-danger:active,.btn-danger.active{background-color:#9a161a \9;}
    +.btn-inverse{background-color:#f8b93b;background-image:-moz-linear-gradient(top, #f8bd45, #f7b42c);background-image:-ms-linear-gradient(top, #f8bd45, #f7b42c);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f8bd45), to(#f7b42c));background-image:-webkit-linear-gradient(top, #f8bd45, #f7b42c);background-image:-o-linear-gradient(top, #f8bd45, #f7b42c);background-image:linear-gradient(top, #f8bd45, #f7b42c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8bd45', endColorstr='#f7b42c', GradientType=0);border-color:#f7b42c #f7b42c #cf8d08;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f7b42c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#f7b42c;*background-color:#f6ab13;}
    +.btn-inverse:active,.btn-inverse.active{background-color:#e79e09 \9;}
    +i[class^="icon-"]{opacity:0.8;}
    +.pull-right{float:right;}
    +.pull-left{float:left;}
    +.hide{display:none;}
    +.show{display:block;}
    +.invisible{visibility:hidden;}
    diff --git a/src/main/webapp/plug-in/datatables/css/datatables_style_02.css b/src/main/webapp/plug-in/datatables/css/datatables_style_02.css
    new file mode 100644
    index 00000000..6fdac054
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/css/datatables_style_02.css
    @@ -0,0 +1,1167 @@
    +/***
    + * Created by: Mienard Lumaad
    + * Date: Nov 26, 2011
    + * Website: http://themepixels.com/
    +***/
    +
    +
    +
    +@font-face {
    +    font-family: 'BebasNeueRegular';
    +    src: url('../font/BebasNeue-webfont.eot');
    +    src: url('../font/BebasNeue-webfontd41d.eot?#iefix') format('embedded-opentype'),
    +         url('../font/BebasNeue-webfont.woff') format('woff'),
    +         url('../font/BebasNeue-webfont.ttf') format('truetype'),
    +         url('../font/BebasNeue-webfont.svg#BebasNeueRegular') format('svg');
    +    font-weight: normal;
    +    font-style: normal;
    +
    +}
    +
    +html, body, div, span, applet, object, iframe,
    +h1, h2, h3, h4, h5, h6, p, blockquote, pre,
    +a, abbr, acronym, address, big, cite, code,
    +del, dfn, em, font, img, ins, kbd, q, s, samp,
    +small, strike, strong, sub, sup, tt, var,
    +b, u, i, center,
    +dl, dt, dd, ol, ul, li,
    +fieldset, form, label, legend,
    +table, caption, tbody, tfoot, thead, tr, th, td {
    +	background: transparent;
    +	border: 0;
    +	margin: 0;
    +	padding: 0;
    +	vertical-align: baseline;
    +}
    +
    +/************GENERAL STYLES****************/
    +body { background: #fff url(../images/bgmain.png); font-family: Arial, Helvetica, sans-serif; font-size: 12px; color: #666; }
    +body.login { background: #555 url(../images/bgmain.png); }
    +body.errorpage { background-color: #666; }
    +
    +a { color: #069; text-decoration: none; outline: none; }
    +a:hover { text-decoration: underline; }
    +a.whitelink { color: #ccc; }
    +a.whitelink:hover { color: #fff; text-decoration: none; }
    +a img { border: 0; }
    +input,select,textarea { font-size: 12px; font-family: Arial, Helvetica, sans-serif; outline: none; }
    +small, .small { font-family: Arial, Helvetica, sans-serif; font-size: 11px; }
    +
    +h1 { font-size: 28px; }
    +h2 { font-size: 24px; }
    +h3 { font-size: 20px; }
    +h4 { font-size: 16px; }
    +h1,h2,h3 { font-family: 'BebasNeueRegular', Arial, Helvetica, sans-serif; letter-spacing: 0.5px; font-weight: normal; color: #333; }
    +
    +.radius2 { -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; }
    +.radius3 { -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; }
    +.radius25 { -moz-border-radius: 25px; -webkit-border-radius: 25px; border-radius: 25px; }
    +.radius50 { -moz-border-radius: 50px; -webkit-border-radius: 50px; border-radius: 50px; }
    +.bebas { font-family: 'BebasNeueRegular', Arial, Helvetica, sans-serif; }
    +.width1 { width: 1px; }
    +
    +button,input,select,textarea { font-size: 12px; font-family: Arial, Helvetica, sans-serif; margin: 0; }
    +
    +/***********LOGIN PAGE STYLES*************/
    +.loginbox { background: #444; padding: 10px; width: 400px; margin: 8% auto 0 auto; position: relative; }
    +.loginboxinner { 
    +	background: #333; padding: 20px; position: relative; border: 1px solid #333;
    +	-moz-box-shadow: inset 0 1px 0 #444; -webkit-box-shadow: inset 0 1px 0 #444; box-shadow: inset 0 1px 0 #444;
    +}
    +.loginheader { height: 60px; }
    +.loginform { margin-top: 20px; }
    +
    +.loginbox h1 { font-size: 30px; letter-spacing: 1px; color: #555; font-weight: normal; padding-top: 10px; }
    +.loginbox .logo { position: absolute; top: 20px; right: 20px; }
    +.loginbox p { margin: 10px 0 15px 0; }
    +.loginbox label { display: block; color: #ccc; letter-spacing: 1px; font-size: 18px; }
    +.loginbox input { 
    +	padding: 12px 10px; background: #282828 url(../images/loginputbg.png) repeat-x top left; color: #ccc; 
    +	font-family: Arial, Helvetica, sans-serif; margin-top: 8px; font-size: 15px; border: 0; width: 340px; 
    +	-moz-box-shadow: 0 1px 0 #444; -webkit-box-shadow: 0 1px 0 #444; box-shadow: 0 1px 0 #444; outline: none; 
    +}
    +.loginbox button { 
    +	background: #999; padding: 10px 20px; font-size: 18px; border: 0; letter-spacing: 1px; color: #333; width: 360px;
    +	-moz-box-shadow: 1px 1px 3px #222; -webkit-box-shadow: 1px 1px 3px #222; box-shadow: 1px 1px 3px #222; cursor: pointer;
    +}
    +.loginbox button.default { background: #999; color: #333; }
    +.loginbox button.hover { background: #ccc; color: #000; }
    +.loginbox button:active { background: #111; color: #fff; }
    +.loginerror { color: #990000; background: #fbe3e3; padding: 0 10px; overflow: hidden; display: none; }
    +.loginerror { -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; }
    +.loginerror p { margin: 10px 0; }
    +
    +/**********HEADER STYLES**************/
    +.header { 
    +	background: #333 url(../images/headbg.png) repeat-x top left; margin: 10px; position: relative;	border: 1px solid #222; 
    +	-moz-box-shadow: 1px 1px 3px #666; -webkit-box-shadow: 1px 1px 3px #666; box-shadow: 1px 1px 3px #666; 
    +}
    +.headerinner { padding: 10px; }
    +.headercolumn { height: 33px; padding: 12px 10px; border-left: 1px solid #444; border-right: 1px solid #272727; float: left; position: relative; }
    +
    +.headleft { position: absolute; top: 0; left: 0; }
    +.headleft .headercolumn { border-color: #2c2c2c; border-left: 0; }
    +.headleft .headercolumn:first-child { margin-left: 260px; border-left: 1px solid #2c2c2c; }
    +
    +.headlinkwrap { width: 38px; }
    +.headlink { position: absolute; top: 0; left: 0; padding: 19px 15px; }
    +.headlink:hover { background: #373737; }
    +
    +.searchbox { display: inline-block; }
    +.searchbox input { border: 0; padding: 9px 8px; font-size: 13px; background: #222; color: #999; width: 200px; font-style: italic; }
    +.searchbox input { -moz-box-shadow: inset 1px 1px 5px #171717; }
    +.searchbox input:focus { font-style: normal; }
    +
    +.headright { position: absolute; top: 0; right: 0; }
    +.headright img { vertical-align: middle; }
    +
    +.headright .noalert { display: inline-block; padding: 8px 10px 9px 10px; background: #999; color: #fff; font-weight: bold; }
    +.headright .noalert:hover { text-decoration: none; }
    +.headright .notialert { display: inline-block; padding: 8px 10px 9px 10px; background: #cc0000; color: #fff; font-weight: bold; }
    +.headright .notialert:hover { text-decoration: none; }
    +
    +.headright .userinfo { 
    +	display: inline-block; border: 1px solid #272727; padding: 3px 25px 3px 3px; color: #ccc; 
    +	vertical-align: top; background: #373737 url(../images/menudroparrow.png) no-repeat right -31px; position: relative;
    +	-moz-box-shadow: 0 1px 0 #444; -webkit-box-shadow: 0 1px 0 #444; box-shadow: 0 1px 0 #444;
    +}
    +.headright .userinfo:hover { text-decoration: none; background-color: #3c3c3c; }
    +.headright .userinfo span { display: inline-block; padding: 0 10px; }
    +
    +.headright .userinfodrop { 
    +	background: #fff url(../images/arrow2.png) no-repeat right -87px; color: #333; z-index: 20; 
    +	border: 1px solid #fff; height: 29px; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none;
    +}
    +.headright .userinfodrop:hover { background-color: #fff; color: #333; border: 1px solid #fff; }
    +
    +.headright .headercolumn:last-child { border-right: 0; }
    +.headright .headercolumn:first-child { border-left: 0; }
    +
    +.userdrop { 
    +	background: #fff; position: absolute; top: 45px; right: 10px; display: none; overflow: hidden; 
    +	z-index: 10; -moz-border-radius: 2px 0 2px 2px; -webkit-border-radius: 2px 0 2px 2px; border-radius: 2px 0 2px 2px; 
    +	-moz-box-shadow: 0 0 2px #333; -webkit-box-shadow: 0 0 2px #333; box-shadow: 0 0 2px #333;
    +}
    +.userdrop ul { list-style: none; margin: 5px 0; }
    +.userdrop ul li { display: block; }
    +.userdrop ul li a { display: block; padding: 8px 10px; color: #666; }
    +.userdrop ul li a:hover { background: #eee; text-decoration: none; }
    +
    +
    +.headerinner2 { border-top: 1px solid #444; height: 57px; position: relative; }
    +.userinfomenu { position: absolute; top: 0; right: 0; }
    +.userinfomenu img { vertical-align: middle; }
    +.userinfomenu .userinfo { 
    +	display: inline-block; border: 1px solid #272727; padding: 3px 25px 3px 3px; color: #ccc; 
    +	vertical-align: top; background: #373737 url(../images/menudroparrow.png) no-repeat right -31px; position: relative;
    +	-moz-box-shadow: 0 1px 0 #444; -webkit-box-shadow: 0 1px 0 #444; box-shadow: 0 1px 0 #444;
    +}
    +.userinfomenu .userinfo:hover { text-decoration: none; background-color: #3c3c3c; }
    +.userinfomenu .userinfo span { display: inline-block; padding: 0 10px; }
    +
    +.userinfomenu .userinfodrop { 
    +	background: #fff url(../images/arrow2.png) no-repeat right -87px; color: #333; z-index: 20; 
    +	border: 1px solid #fff; height: 29px; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none;
    +}
    +.userinfomenu .userinfodrop:hover { background-color: #fff; color: #333; border: 1px solid #fff; }
    +
    +
    +.headright .notiactive { 
    +	background: #fff; color: #333; -moz-border-radius: 2px 2px 0 0; -webkit-border-radius: 2px 2px 0 0; border-radius: 2px 2px 0 0; 
    +	position: relative; z-index: 20; height: 18px;
    +}
    +.notiwrapper { position: relative; display: inline-block; min-height: 50px; }
    +.notibox { 
    +	background: #fff; padding: 10px; position: absolute; z-index: 10; right: 0; top: 32px; width: 300px; line-height: 21px;
    +	-moz-box-shadow: 0 0 2px #333; -webkit-box-shadow: 0 0 2px #333; box-shadow: 0 0 2px #333; border: 1px solid #eee; 
    +	-moz-border-radius: 2px 0 2px 2px; -webkit-border-radius: 2px 0 2px 2px; border-radius: 2px 0 2px 2px; display: none;
    +}
    +.notibox .loader { font-style: italic; color: #666; display: none; padding: 5px 0; font-size: 11px; }
    +.noticontent { margin: 5px 0; }
    +
    +.tabmenu { list-style: none; }
    +.tabmenu li { display: inline-block; float: left; width: 50%; border-bottom: 1px solid #ddd; }
    +.tabmenu li a { display: block; font-weight: bold; color: #666; padding: 8px 10px; text-align: center; }
    +.tabmenu li a:hover { text-decoration: none; color: #333; }
    +.tabmenu li.current a { background: #ddd; color: #333; }
    +
    +
    +/***** MESSAGE LIST *****/
    +
    +.msglist { list-style: none; font-size: 11px; line-height: 16px; }
    +.msglist li { display: block; background-color: #eee; background-repeat: no-repeat; background-position: 10px 10px; border: 1px solid #ddd; border-top: 0; }
    +.msglist li:first-child { border-top: 1px solid #ddd; }
    +
    +.msglist li.message { background-image: url(../images/icons/default/mail.png); }
    +.msglist li.user { background-image: url(../images/icons/default/users.png); }
    +.msglist li.call { background-image: url(../images/icons/default/call.png); }
    +.msglist li.calendar { background-image: url(../images/icons/default/calendar.png); }
    +.msglist li.settings { background-image: url(../images/icons/default/settings.png); }
    +
    +.msglist li.new { background-color: #fff; }
    +.msglist li .msg { margin-left: 35px; background: #f7f7f7; padding: 8px 10px; border-left: 1px solid #ddd; }
    +.msglist li.new .msg { background: #fff; }
    +.msglist li a.subject { margin: 2px 0; color: #333; font-weight: bold; display: block; }
    +.msglist li a.subject:hover { text-decoration: none; color: #666; }
    +.msgmore a { display: block; text-align: center; color: #666; background: #ccc; padding: 5px 0; margin-top: 5px; font-size: 11px; font-weight: bold; }
    +.msgmore a:hover { text-decoration: none; background: #bbb; color: #333; }
    +
    +/***COLUMNS***/
    +.one_half{ width:48.5%; }
    +.one_third{ width:31.16%; }
    +.two_third{ width:65.83%; }
    +.one_fourth{ width:22.5%; }
    +.three_fourth{ width:74.5%; }
    +.one_fifth{ width:17.3%; }
    +.two_fifth{ width:38.1%; }
    +.three_fifth{ width:58.9%; }
    +.four_fifth{ width:67.7%; }
    +.one_sixth{ width:13.83%; }
    +.five_sixth{ width:83.17%; }
    +
    +.one_half,.one_third,.two_third,.three_fourth,.one_fourth,.one_fifth,
    +.two_fifth,.three_fifth,.four_fifth,.one_sixth,.five_sixth{ position:relative; margin-right:3%; float:left; }
    +
    +.last{ margin-right:0 !important; clear:right; }
    +
    +/**********MAIN CONTENT STYLES*******/
    +.mainwrapper { margin: 10px; position: relative; }
    +
    +/**LEFT**/
    +.mainleft { width: 250px; position: absolute; top: 0; left: 0; padding-bottom: 20px; }
    +
    +.leftmenu { -moz-box-shadow: 1px 1px 2px #eee; -webkit-box-shadow: 1px 1px 2px #eee; box-shadow: 1px 1px 2px #eee; }
    +.leftmenu ul { list-style: none; }
    +.leftmenu ul li { display: block; position: relative; }
    +.leftmenu ul li a { 
    +	border: 1px solid #ddd; border-top: 0; display: block; background: #fcfcfc url(../images/icons/default/sprites.png); color: #666; padding-left: 35px;
    +	background-repeat: no-repeat; background-position: 8px center; font-weight: bold;
    +}
    +.leftmenu ul li a:hover { color: #333; text-decoration: none; background-color: #eee; }
    +.leftmenu ul li:first-child a { border-top: 1px solid #ddd; -moz-border-radius: 2px 2px 0 0; -webkit-border-radius: 2px 2px 0 0; border-radius: 2px 2px 0 0; }
    +.leftmenu ul li:last-child a { -moz-border-radius: 0 0 2px 2px; -webkit-border-radius: 0 0 2px 2px; border-radius: 0 0 2px 2px; }
    +.leftmenu ul li a span { display: block; padding: 8px 10px; border-left: 1px solid #eee; background: #fff; }
    +.leftmenu ul li a:hover span { border-left: 1px solid #ddd; background: #f7f7f7; }
    +.leftmenu ul li.current a { background-color: #222; color: #fff; border: 1px solid #222; }
    +.leftmenu ul li.current a span { border-left: 1px solid #444; background: #333; }
    +.leftmenu ul li a.menudrop:hover span { background: #f7f7f7 url(../images/menudroparrow.png) no-repeat right 0; }
    +.leftmenu ul li.current a.menudrop:hover span { background: #333 url(../images/menudroparrow.png) no-repeat right -31px; }
    +.leftmenu ul li a.active { background-color: #eee; }
    +.leftmenu ul li a.active span { background: #f7f7f7 url(../images/menudroparrow.png) no-repeat right 0; border-left: 1px solid #ddd; }
    +.leftmenu ul li.current a.active { background-color: #222; }
    +.leftmenu ul li.current a.active span { background: #333 url(../images/menudroparrow.png) no-repeat right -31px; border-left: 1px solid #444; }
    +.leftmenu ul li a em { font-style: normal; }
    +
    +.leftmenu ul li a.dashboard { background-position: -154px -443px; }
    +.leftmenu ul li a.widgets { background-position: -190px -443px; }
    +.leftmenu ul li a.tables { background-position: -82px -480px; }
    +.leftmenu ul li a.elements { background-position: -10px -443px; }
    +.leftmenu ul li a.charts { background-position: -119px -480px; }
    +.leftmenu ul li a.media { background-position: -47px -408px; }
    +.leftmenu ul li a.form { background-position: -154px -262px; }
    +.leftmenu ul li a.editor { background-position: -154px -262px; }
    +.leftmenu ul li a.grid { background-position: -190px -443px; }
    +.leftmenu ul li a.calendar { background-position: -82px -155px; }
    +.leftmenu ul li a.buttons { background-position: -47px -443px; }
    +.leftmenu ul li a.chat { background-position: -119px -299px; }
    +.leftmenu ul li a.contacts { background-position: -82px -227px; }
    +.leftmenu ul li a.users { background-position: -82px -191px; }
    +.leftmenu ul li a.error { background-position: -119px -119px; }
    +.leftmenu ul li .menutip { 
    +	position: absolute; z-index: 100; left: 38px; top: 0; background: url(../images/blacktrans.png); color: #fff; padding: 9px 10px; display: none;
    +	-moz-border-radius: 0 2px 2px 0; -webkit-border-radius: 0 2px 2px 0; border-radius: 0 2px 2px 0; 
    +}
    +
    +.leftmenu ul li ul { margin: 0 0 10px 36px; display: none; }
    +.leftmenu ul li ul li:first-child a { border-top: 0; -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; }
    +.leftmenu ul li ul li:last-child a { -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; }
    +.leftmenu ul li ul li a { padding-left: 0; background: #f7f7f7; }
    +.leftmenu ul li ul li a span { border-left: 0; }
    +.leftmenu ul li ul li a:hover span { border-left: 0; background: #eee; }
    +.leftmenu ul li.current ul li a { border-top: 0; border-bottom: 1px solid #272727; }
    +.leftmenu ul li.current ul li a span { border-left: 0; }
    +.leftmenu ul li.current ul li a:hover span { background: #2e2e2e; }
    +
    +/**SHOW ICON ONLY LEFT MENU**/
    +.lefticon .mainleft { width: 34px; }
    +.lefticon .leftmenu { overflow: none;}
    +.lefticon .leftmenu ul li { width: 250px; }
    +.lefticon .leftmenu ul li a { width: 2px; height: 32px; }
    +.lefticon .leftmenu ul li a span { display: none; }
    +.lefticon .maincontent { margin-left: 45px; }
    +
    +#togglemenuleft { border-top: 1px solid #eee; margin-top: 20px; text-align: center; }
    +#togglemenuleft a { 
    +	display: inline-block; position: relative; top: -13px; width: 22px; height: 22px; 
    +	background: url(../images/toggle.png) no-repeat 0 0; cursor: pointer; 
    +}
    +#togglemenuleft a.toggle { background: url(../images/toggle.png) no-repeat 0 -25px; text-align: left; }
    +
    +
    +/**CONTENT**/
    +.maincontent { margin: 0 310px 0 260px; }
    +.maincontentinner { }
    +
    +/**MAIN TAB MENU**/
    +.maintabmenu { list-style: none; margin: 0; line-height: 21px; position: relative; z-index: 5; }
    +.maintabmenu li { display: inline-block; }
    +.maintabmenu li a { 
    +	padding: 8px 20px 4px 20px; color: #999; font-family: 'BebasNeueRegular', Arial, Helvetica, sans-serif; font-size: 20px; 
    +	-moz-border-radius: 2px 2px 0 0; -webkit-border-radius: 2px 2px 0 0; border-radius: 2px 2px 0 0; border: 1px solid #ddd;
    +	letter-spacing: 0.8px; display: block; background: #eee url(../images/titlebg.png) repeat-x top left; text-shadow: 1px 1px #f7f7f7;
    +}
    +.maintabmenu li a:hover { text-decoration: none; color: #666; background: #ddd; border-color: #ccc; text-shadow: 1px 1px #e7e7e7; }
    +.maintabmenu li.current a { display: block; background: #fff; border: 1px solid #ddd; border-bottom: 1px solid #fff; color: #333; }
    +.maintabmenu li.current a:hover { text-shadow: none; }
    +
    +.content { 
    +	padding: 20px; border: 1px solid #ddd; background: #fff; margin-top: -1px; position: relative; line-height: 21px; 
    +	-moz-border-radius: 0 2px 2px 2px; -webkit-border-radius: 0 2px 2px 2px; border-radius: 0 2px 2px 2px;
    +	-moz-box-shadow: 1px 1px 2px #eee; -webkit-box-shadow: 1px 1px 2px #eee; box-shadow: 1px 1px 2px #eee;
    +}
    +
    +.contenttitle { background: #222; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; }
    +.contenttitle h2 { 
    +	font-size: 18px; letter-spacing: 0.8px; font-family: 'BebasNeueRegular', Arial, Helvetica, sans-serif; font-weight: normal; padding: 0 0 0 10px; 
    +	background-repeat: no-repeat; background-image: url(../images/icons/default/sprites.png); background-position: -154px -443px; color: #fff; 
    +}
    +.contenttitle h2 span { 
    +	display: block; padding: 6px 0 6px 10px; margin-left: 25px; border-left: 1px solid #444; background: #333; 
    +	-moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; text-shadow: 1px 1px #222;
    +}
    +
    +.contenttitle h2.inbox { background-position: -82px -335px; }
    +.contenttitle h2.table { background-position: -82px -480px; }
    +.contenttitle h2.form { background-position: -154px -262px; }
    +.contenttitle h2.chart { background-position: -10px -227px; }
    +.contenttitle h2.image { background-position: -10px -408px; }
    +.contenttitle h2.button { background-position: -47px -443px; }
    +
    +.widgetlist { list-style: none; }
    +.widgetlist li { float: left; margin-right: 10px; margin-bottom: 10px; }
    +.widgetlist li a { 
    +	display: inline-block; padding: 85px 20px 20px 20px; background-repeat: no-repeat; background-position: center 20px; color: #eee; font-weight: bold; 
    +	background-color: #bbb;  width: 80px; text-align: center; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; 
    +}
    +.widgetlist li a:hover { text-decoration: none; }
    +.widgetlist li a.default { background-color: #bbb; }
    +.widgetlist li a.hover { background-color: #666; }
    +
    +.widgetlist li a.events { background-image: url(../images/icons/default/events.png); }
    +.widgetlist li a.message { background-image: url(../images/icons/default/message.png); }
    +.widgetlist li a.upload { background-image: url(../images/icons/default/image.png); }
    +
    +/*****STANDARD TABLE (tables.html)*****/
    +.stdtable { width: 100%; }
    +.stdtable .con0 { background: #fcfcfc; }
    +.stdtable .con1 { background: #f9f9f9; }
    +.stdtable th, .stdtable td { line-height: 16px; vertical-align: middle; }
    +.stdtable thead th, .stdtable thead td { padding: 5px 10px; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; }
    +.stdtable tfoot th, .stdtable tfoot td { padding: 5px 10px; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; }
    +.stdtable thead th:first-child, .stdtable tfoot th:first-child,
    +.stdtable thead td:first-child, .stdtable tfoot td:first-child { border-left: 1px solid #ddd; }
    +.stdtable thead th.head0, .stdtable tfoot th.head0, .stdtable thead td.head0, .stdtable tfoot td.head0 { background-color: #eee; }
    +.stdtable thead th.head1, .stdtable tfoot th.head1, .stdtable thead td.head1, .stdtable tfoot td.head1 { background-color: #ddd; }
    +.stdtable thead th.sorting, .stdtable thead td.sorting { 
    +	background-image: url(../images/sort_both.png); background-repeat: no-repeat; background-position: right 3px; }
    +.stdtable thead th.sorting_asc, .stdtable thead td.sorting_asc { 
    +	background-image: url(../images/sort_asc.png); background-repeat: no-repeat; background-position: right 4px; }
    +.stdtable thead th.sorting_desc, .stdtable thead td.sorting_desc  { 
    +	background-image: url(../images/sort_desc.png); background-repeat: no-repeat; background-position: right 4px; }
    +.stdtable thead td { font-weight: bold; }
    +.stdtable thead td.center { text-align: center; }
    +.stdtable tbody tr td { padding: 8px 10px; border-right: 1px solid #eee; border-bottom: 1px solid #eee; }
    +.stdtable tbody tr:last-child td { border-bottom: 1px solid #ccc; }
    +.stdtable tbody tr td:first-child { border-left: 1px solid #ddd; }
    +.stdtable tbody tr td:last-child { border-right: 1px solid #ddd; }
    +.stdtable tbody tr:hover td, .stdtable tbody tr.selected td { background: #fffccc; color: #333; }
    +.stdtable tbody tr.togglerow td { background: #fff; }
    +.stdtable tbody tr.togglerow:hover td { background: #fff; }
    +.stdtable tbody tr.hiderow { display: none; }
    +
    +.tableoptions { background: #eee url(../images/titlebg.png) repeat-x top left; border: 1px solid #ccc; border-top: 0; padding: 8px; }
    +.tableoptions button { 
    +	background: #fcfcfc url(../images/titlebg.png) repeat-x top left; font-size: 11px; color: #666; padding: 7px 10px; 
    +	border: 1px solid #bbb; -moz-box-shadow: 1px 1px 2px #ddd; -webkit-box-shadow: 1px 1px 2px #ddd; box-shadow: 1px 1px 2px #ddd; margin: 0; outline: none;
    +}
    +.tableoptions button:hover { background: #eee; cursor: pointer; }
    +.tableoptions select { 
    +	background: #fcfcfc url(../images/titlebg.png) repeat-x top left; padding: 6px 5px 7px 5px; border: 1px solid #bbb; margin: 0; outline: none;
    +	-moz-box-shadow: 1px 1px 2px #ddd; -webkit-box-shadow: 1px 1px 2px #ddd; box-shadow: 1px 1px 2px #ddd; font-size: 11px; color: #666; 
    +}
    +
    +/***** DYNAMIC TABLE (tables.html) *****/
    +.dataTables_wrapper { position: relative; }
    +.dataTables_length, .dataTables_paginate { background: #eee url(../images/titlebg.png) repeat-x top left; border: 1px solid #ccc; border-top: 0; padding: 8px; }
    +.dataTables_wrapper select { 
    +	background: #fcfcfc url(../images/titlebg.png) repeat-x top left; padding: 5px; border: 1px solid #bbb; margin: 0; outline: none;
    +	-moz-box-shadow: 1px 1px 2px #ddd; -webkit-box-shadow: 1px 1px 2px #ddd; box-shadow: 1px 1px 2px #ddd; font-size: 11px; color: #666; 
    +}
    +.dataTables_wrapper input { border: 1px solid #ccc; padding: 6px 5px 7px 5px; width: 200px; }
    +.dataTables_filter { position: absolute; top: 8px; right: 8px; }
    +.dataTables_info { position: absolute; bottom: 13px; left: 8px; }
    +.dataTables_paginate { text-align: right; line-height: 16px; }
    +.dataTables_paginate span { display: inline-block; }
    +.dataTables_paginate .paginate_button { 
    +	border: 1px solid #ccc; padding: 5px 7px; margin-left: 5px; font-weight: bold; background: #fcfcfc; 
    +	-moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px;  font-size: 11px;
    +	-moz-box-shadow: 1px 1px 2px #ddd; -webkit-box-shadow: 1px 1px 2px #ddd; box-shadow: 1px 1px 2px #ddd; 
    +}
    +.dataTables_paginate .paginate_active { 
    +	border: 1px solid #222; background: #333;  color: #fff; padding: 5px 7px; margin-left: 5px; font-weight: bold; 
    +	-moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; font-size: 11px;
    +}
    +.dataTables_paginate .paginate_button:hover { background: #ddd; border: 1px solid #ccc; cursor: pointer; color: #333; }
    +
    +
    +/***** CALENDAR (calendar.html) *****/
    +#external-events p { font-size: 11px; }
    +.external-event { 
    +	background: #c3e1ff; color: #333; padding: 5px 10px; margin-bottom: 5px; font-weight: bold; 
    +	-moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; cursor: move;
    +}
    +
    +.fc-header-left span.fc-state-active { 
    +	background: #444; color: #fff; border: 1px solid #333; -moz-box-shadow: inset 1px 1px 1px #333; -webkit-box-shadow: insest 1px 1px 1px #333;
    +}
    +.fc-header-title { font-family: 'BebasNeueRegular', Arial, Helvetica, sans-serif; font-size: 18px; }
    +.fc-header-title h2 { font-size: 24px; }
    +.fc-button-prev:hover, .fc-button-next:hover { color: #fff; background: #444; border-color: #333; }
    +.fc-button-today:hover { background: #444; border-color: #333; color: #fff; }
    +
    +/*****STANDARD FORM (forms.html)*****/
    +
    +.stdform p, .stdform div.par { margin: 15px 0; }
    +.stdform div.par { overflow: hidden; }
    +.stdform span.field, .stdform div.field { margin-left: 220px; display: block; position: relative; }
    +.stdform .formwrapper { display: block; padding-top: 5px; margin-left: 220px; line-height: 25px; }
    +.stdform label { float: left; width: 200px; text-align: right; padding: 5px 20px 0 0; }
    +.stdform label.error { float: none; color: #ff6600; font-size: 11px; display: block; text-align: left; font-weight: bold; }
    +
    +.stdform input { 
    +	border: 1px solid #ccc; background: #fcfcfc; padding: 8px 5px; width: 300px; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; 
    +	-moz-box-shadow: inset 1px 1px 2px #ddd; -webkit-box-shadow: inset 1px 1px 2px #ddd; box-shadow: inset 1px 1px 2px #ddd; color: #666; 
    +}
    +.stdform input:focus { background: #fff; -moz-box-shadow: inset 1px 1px 2px #eee; -webkit-box-shadow: inset 1px 1px 2px #eee; box-shadow: inset 1px 1px 2px #eee; }
    +.stdform .smallinput { width: 40%; }
    +.stdform .mediuminput { width: 60%; }
    +.stdform .longinput { width: 80%; }
    +.stdform input.error { border: 1px solid #ff6600; }
    +
    +.stdform input[type=radio], .stdform input[type=checkbox] { width: auto; margin: 0; vertical-align: middle; }
    +.stdform input[type=submit] { 
    +	width: auto; margin: 0; font-weight: bold; color: #eee; background: #333; border: 0; padding: 7px 10px; 
    +	-moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; cursor: pointer;
    +}
    +.stdform input[type=reset] {
    +	width: auto; margin: 0; font-weight: bold; color: #666; border: 1px solid #ccc; background: #eee; padding: 7px 10px;	
    +	-moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; margin-left: 5px;
    +}
    +.stdform input[type=submit]:hover { background: #ffdd00; color: #333; }
    +.stdform input[type=reset]:hover { background: #ddd; cursor: pointer; color: #333; }
    +
    +.stdform textarea { 
    +	border: 1px solid #ccc; background: #fcfcfc; padding: 8px 5px; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; 
    +	-moz-box-shadow: inset 1px 1px 2px #ddd; -webkit-box-shadow: inset 1px 1px 2px #ddd; box-shadow: inset 1px 1px 2px #ddd; color: #666;
    +}
    +.stdform textarea.error { border: 1px solid #ff6600; }
    +
    +.stdform select { 
    +	border: 1px solid #ccc; padding: 7px 5px; min-width: 40%; background: #fcfcfc; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; 
    +	-moz-box-shadow: inset 1px 1px 2px #ddd; -webkit-box-shadow: inset 1px 1px 2px #ddd; box-shadow: inset 1px 1px 2px #ddd; color: #666;
    +}
    +.stdform select.error { border: 1px solid #ff6600; }
    +
    +.stdform textarea:focus, .stdform select:focus { 
    +	background: #fff; -moz-box-shadow: inset 1px 1px 2px #eee; -webkit-box-shadow: inset 1px 1px 2px #eee; box-shadow: inset 1px 1px 2px #eee; 
    +}
    +
    +.stdform button { border: 1px solid #333; background: #333; color: #fff; cursor: pointer; padding: 7px 10px; font-weight: bold; }
    +.stdform button:hover { background: #111; border: 1px solid #000; color: #fff; }
    +.stdform button.cancel { background: #eee; color: #666; border: 1px solid #ddd; }
    +.stdform button.cancel:hover { background: #ddd; border: 1px solid #ccc; }
    +.stdform small.desc { font-size: 11px; color: #999; font-style: italic; display: block; margin: 5px 0 0 220px; }
    +.stdform .stdformbutton { margin-left: 220px; }
    +
    +/***** FORM STYLE 2 (form.html) *****/
    +.stdform2 p, .stdform2 div.par { border: 1px solid #ddd; background: #fcfcfc; margin: 0; border-top: 0; }
    +.stdform2 div.terms { border: 0; background: none; }
    +.stdform2 p:first-child, .stdform2 div.par:first-child { border-top: 1px solid #ddd; }
    +.stdform div.par { overflow: hidden; }
    +.stdform2 label { display: inline-block; padding: 20px; vertical-align: top; text-align: left; font-weight: bold; }
    +.stdform2 label.error { margin-left: 0; padding: 0; }
    +.stdform2 label small { font-size: 11px; color: #999; display: block; font-weight: normal; line-height: 16px; }
    +.stdform2 span.field, .stdform2 div.field { margin-left: 220px; display: block; background: #fff; padding: 20px; border-left: 1px solid #ddd; }
    +.stdform2 .stdformbutton { margin-left: 0; padding: 20px; background: #fff; }
    +
    +/**DUAL SELECT**/
    +.dualselect { margin-left: 220px; display: block; }
    +.dualselect select { height: 200px; width: 40%; }
    +.dualselect .ds_arrow { display: inline-block; vertical-align: top; padding-top: 60px; margin: 0 10px; }
    +.dualselect .ds_arrow .ds_prev, .dualselect .ds_arrow .ds_next { 
    +	display: block; padding: 5px 10px 7px 10px; border: 1px solid #ccc; margin-bottom: 5px; font-size: 24px; font-weight: bold; 
    +	-moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; background: #eee url(../images/titlebg.png) repeat-x top left;
    +}
    +.dualselect .ds_arrow .ds_prev:hover, .dualselect .ds_arrow .ds_next:hover {
    +	background: #444; color: #fff; border-color: #333; cursor: pointer;	
    +}
    +
    +/*****QUICK FORM (ajax/tabledata.php called from tables.html)*****/
    +.quickform { margin: 10px; }
    +.quickform p { margin: 10px 0; }
    +.quickform label { display: block; margin-bottom: 5px; color: #333; font-weight: bold; width: 100px; }
    +.quickform .smallinput { width: 60px; }
    +.quickform .action { margin-left: 120px; }
    +
    +/**RIGHT**/
    +.mainright { width: 300px; position: absolute; top: 0; right: 0; }
    +.mainrightinner { margin-bottom: 20px; }
    +
    +
    +/**WIDGET BOX***/
    +.widgetbox { 
    +	background: #fff; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; margin-bottom: 10px; 
    +	-moz-box-shadow: 1px 1px 2px #eee; -webkit-box-shadow: 1px 1px 2px #eee; box-shadow: 1px 1px 2px #eee; 
    +}
    +.widgetbox .title { 
    +	background: #222; -moz-border-radius: 2px 2px 0 0; -webkit-border-radius: 2px 2px 0 0;
    +	border-radius: 2px 2px 0 0;
    +}
    +.widgetbox .title h2 { 
    +	font-size: 18px; letter-spacing: 0.8px; font-family: 'BebasNeueRegular', Arial, Helvetica, sans-serif; font-weight: normal; 
    +	background-repeat: no-repeat; padding: 0 0 0 10px; color: #fff; background-image: url(../images/icons/default/sprites.png);
    +}
    +.widgetbox .title h2 span { 
    +	display: block; padding: 6px 0 6px 10px; margin-left: 25px; border-left: 1px solid #444; background: #333; 
    +	-moz-border-radius: 0 2px 0 0; -webkit-border-radius: 0 2px 0 0; border-radius: 0 2px 0 0; text-shadow: 1px 1px #222;
    +}
    +.widgetbox .widgetcontent { 
    +	border: 1px solid #ddd; border-top: 0; padding: 10px; line-height: 21px; 
    +	-moz-border-radius: 0 0 2px 2px; -webkit-border-radius: 0 0 2px 2px; border-radius: 0 0 2px 2px; 
    +}
    +.widgetcontent ul.linklist { list-style: none; }
    +.widgetcontent ul.linklist li { border-bottom: 1px dotted #ddd; padding: 1px 0; }
    +.widgetcontent ul.linklist li a { display: block; padding: 2px 5px; color: #666; }
    +.widgetcontent ul.linklist li a:hover { background: #f7f7f7; text-decoration: none; }
    +
    +.widgetbox .titlehover h2 span { background: #333 url(../images/icons/arrow.png) no-repeat right; }
    +.widgetbox .widgettoggle { overflow: hidden; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; }
    +
    +.widgetbox .title h2.chart { background-position: -10px -227px; }
    +.widgetbox .title h2.calendar { background-position: -82px -155px; }
    +.widgetbox .title h2.tabbed { background-position: -190px -443px; }
    +.widgetbox .title h2.general { background-position: -154px -443px; }
    +.widgetbox .title h2.chat { background-position: -82px -299px; }
    +
    +.widgetbox .listthumb { list-style: none; margin: 0; }
    +.widgetbox .listthumb li { padding: 0; margin: 8px 0; }
    +.widgetbox .listthumb img { vertical-align: middle; }
    +.widgetbox .thumb { list-style: none; margin: 0; }
    +.widgetbox .thumb li { display: inline-block; padding: 0; margin-right: 5px; }
    +
    +/**WIDGET BOX (dashboard.html)**/
    +.analytics2 { padding: 5px; background: #eee; border: 1px solid #ccc; text-align: center; }
    +.analytics small { text-transform: uppercase; font-size: 10px; font-weight: bold; color: #069; }
    +.analytics h1 { font-size: 24px; color: #333; margin: 2px 0; }
    +.analytics h2 { font-size: 18px; color: #333; text-align: center; }
    +.analytics h3 { font-size: 16px; color: #333; }
    +
    +/***** CUSTOM STYLE: WYSIWYG EDITOR *****/
    +.wysiwyg-dialog-content input.submit, .ui-dialog .wysiwyg input.submit { 
    +	background: #333; color: #ccc; font-weight: bold; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px;
    +	cursor: pointer; border: 1px solid #333;
    +}
    +.wysiwyg-dialog-content input.submit:hover, .ui-dialog .wysiwyg input.submit:hover { background: #ffdd00; border: 1px solid #ff9900; color: #333; }
    +.wysiwyg-dialog-content input.reset, .ui-dialog .wysiwyg input.reset { 
    +	-moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; cursor: pointer; font-weight: bold; color: #666; background: #f7f7f7; 
    +}
    +.wysiwyg-dialog-content input.reset:hover, .ui-dialog .wysiwyg input.reset:hover { background: #eee; }
    +
    +/*****NOTIFICATION MESSAGE STYLES (media.html)*****/
    +.notifyMessage { padding: 7px 10px; font-weight: bold; margin: 10px 0; display: none; }
    +.notifySuccess { border: 1px solid #C1D779; background: #EFFEB9; display: block; }
    +.notifyError { border: 1px solid #E18B7C; background: #FAD5CF; display: block; }
    +
    +
    +/***** FORM WIZARD (wizard.html) *****/
    +.wizard .hormenu { list-style: none; }
    +.wizard .hormenu li { float: left; width: 33%; }
    +.wizard .hormenu li a { display: block; }
    +.wizard .hormenu li a:hover { text-decoration: none; }
    +.wizard .hormenu li a span.h2 { font-size: 24px; color: #999; text-align: center; display: block; font-family: 'BebasNeueRegular', Arial, Helvetica, sans-serif; }
    +.wizard .hormenu li a span.dot { display: block; height: 20px; margin-top: 5px; text-align: center; background: url(../images/stepline.png) repeat-x center left; }
    +.wizard .hormenu li span.label { display: block; text-align: center; font-weight: bold; color: #999; }
    +.wizard .hormenu li a span.dot span { width: 20px; height: 20px; display: inline-block; background: url(../images/steps.png) no-repeat 0 -40px; }
    +.wizard .hormenu li:first-child a span.dot { margin-left: 45%; text-align: left; }
    +.wizard .hormenu li:last-child a span.dot { margin-right: 45%; text-align: right; }
    +.wizard .hormenu li a.done span.h2,.wizard .hormenu li a.done span.label { color: #333; }
    +.wizard .hormenu li a.done span.dot span { background-position: 0 -20px; }
    +.wizard .hormenu li:first-child a.done span.dot span { background-position: 0 0; }
    +.wizard .hormenu li a.selected span.dot span { background-position: 0 -120px; }
    +.wizard .hormenu li:first-child a.selected span.dot span { background-position: 0 -100px; }
    +.wizard .hormenu li a.selected span.h2,.wizard .hormenu li a.selected span.label { color: #333; }
    +
    +/** TABBED WIZARD **/
    +.wizard .tabbedmenu { list-style: none; background: #f7f7f7; padding: 10px; padding-bottom: 0; border: 1px solid #ddd; }
    +.wizard .tabbedmenu li { display: inline-block; margin-right: 5px; position: relative; bottom: -1px; }
    +.wizard .tabbedmenu li a { display: block; padding: 10px 20px; color: #999; border: 1px solid #ddd; background: #eee; }
    +.wizard .tabbedmenu li a { -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; }
    +.wizard .tabbedmenu li a span { font-weight: bold; }
    +.wizard .tabbedmenu li a span.h2 { color: #999; display: block; font-size: 24px; font-family: 'BebasNeueRegular', Arial, Helvetica, sans-serif; font-weight: normal; }
    +.wizard .tabbedmenu li a:hover { text-decoration: none; }
    +.wizard .tabbedmenu li a.selected, .wizard .tabbedmenu li a.done { background: #fff; color: #333; border-bottom: 1px solid #fff; }
    +.wizard .tabbedmenu li a.selected span.h2, .wizard .tabbedmenu li a.selected span { color: #333; }
    +.wizard .tabbedmenu li a.done span.h2, .wizard .tabbedmenu li a.done span { color: #333; }
    +
    +.stepContainer .content { 
    +	border: 0; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none;
    +	-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; padding: 0;
    +}
    +.stepContainer .content p { border: 1px solid #ddd; border-bottom: 0; }
    +.stepContainer .content p:last-child { border-bottom: 1px solid #ddd; }
    +.stepContainer .par p { margin: 10px 0; padding: 0; border: 0; background: none; }
    +.stepContainer .par p:last-child { border-bottom: 0; }
    +.actionBar { padding: 10px 0; position: relative; overflow: none; clear: both; }
    +.actionBar .loader { float: left; display: none; }
    +.actionBar a { 
    +	float: right; display: inline-block; padding: 5px 15px; background: #333; color: #eee; margin-left: 5px; font-weight: bold; text-shadow: 1px 1px #111;
    +	-moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px;
    +}
    +.actionBar a:hover { text-decoration: none; background: #000; color: #fff; text-shadow: none; }
    +.actionBar a.buttonDisabled { background: #ccc; color: #666; text-shadow: 1px 1px #ddd; }
    +.actionBar a.buttonDisabled:hover { background: #ccc; color: #666; text-shadow: 1px 1px #ddd; cursor: default; }
    +.actionBar .msgBox { margin: 40px 0 10px 0; position: relative; }
    +.actionBar .msgBox .content { padding: 7px 10px; background: #fffccc; color: #333; border: 1px solid #FEEA7A; }
    +.actionBar .msgBox .close { 
    +	padding: 0 2px 2px 2px; background: none; line-height: 10px; text-transform: lowercase; font-size: 10px; position: absolute; top: 5px; right: 7px; 
    +	color: #333; text-shadow: none; font-weight: bold; -moz-border-radius: 1px; -webkit-border-radius: 1px; border-radius: 1px; 
    +}
    +.actionBar .msgBox .close:hover { background: #333; color: #eee; }
    +
    +/** VERTICAL WIZARD **/
    +.verwizard .verticalmenu { list-style: none; float: left; width: 180px; }
    +.verwizard .verticalmenu li { margin-bottom: 2px; }
    +.verwizard .verticalmenu a { display: block; padding: 5px; color: #999; }
    +.verwizard .verticalmenu a:hover { text-decoration: none; }
    +.verwizard .verticalmenu a.selected { background: #333; color: #fff; }
    +.verwizard .verticalmenu a.done { background: #333; color: #aaa; }
    +.verwizard .verticalmenu a span { font-weight: bold; }
    +.verwizard .stepContainer { margin-left: 200px; }
    +.verwizard .actionBar { margin: 10px 0 0 200px; }
    +
    +
    +/*****MEDIA STYLES (media.html)*****/
    +.imagelist { list-style: none; }
    +.imagelist li { 
    +	float: left; padding: 5px; margin: 0 20px 20px 0; background: #fff; border: 1px solid #ddd; -moz-border-radius: 2px; -webkit-border-radius: 2px; 
    +	border-radius: 2px; -moz-box-shadow: 1px 1px 2px #eee; -webkit-box-shadow: 1px 1px 2px #eee; box-shadow: 1px 1px 2px #eee; 
    +}
    +.imagelist li img { display: block; margin-bottom: 10px; }
    +.imagelist li span { display: block; text-align: right;}
    +.imagelist li span a { vertical-align: middle; }
    +.imagelist li span a.name { font-weight: bold; float: left; color: #999; }
    +.imagelist li span a.name:hover { color: #333; text-decoration: none; }
    +.imagelist li span a.edit, .imagelist li span a.view, .imagelist li span a.delete { 
    +	display: inline-block; width: 16px; height: 16px; cursor: pointer; margin-left: 5px; vertical-align: middle; opacity: 0.5;
    +}
    +.imagelist li span a.edit:hover, .imagelist li span a.view:hover, .imagelist li span a.delete:hover { opacity: 1; }
    +.imagelist li span a.edit { background: url(../images/icons/default/editor.png); }
    +.imagelist li span a.view { background: url(../images/icons/default/glass.png); }
    +.imagelist li span a.delete { background: url(../images/icons/default/trash.png); }
    +
    +.photoEdit { width: 480px; }
    +
    +
    +/*****ELEMENT STYLES (elements.html)*****/
    +.colorselector { 
    +	display: inline-block; height: 28px; width: 28x; vertical-align: middle; 
    +	position: relative; vertical-align: middle; margin-left: 5px; 
    +}
    +.colorselector span { 
    +	display: block; height: 28px; width: 28px; position: absolute; left: 0; top: 0; 
    +	background: #000 url(../../images/colorpicker/select2.html) no-repeat -4px -4px; 
    +}
    +
    +/***NOTIFICATION MESSAGES***/
    +.notification { 
    +	height: 51px; overflow: hidden; position: relative; margin-bottom: 20px; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; 
    +	-moz-box-shadow: 1px 1px 2px #ddd;
    +}
    +.notification p { margin: 14px 10px 0 75px; font-size: 13px; color: #333; }
    +.notification a.close { 
    +	position: absolute; width: 14px; height: 14px; top: 5px; right: 5px; background-image: url(../images/close.png); background-repeat: no-repeat; }
    +.notification a.close:hover { cursor: pointer; }
    +.msgalert a.close { background-position: -14px 0; }
    +.msgalert a.close:hover { background-position: -14px -14px; }
    +.msginfo a.close { background-position: -42px 0; }
    +.msginfo a.close:hover { background-position: -42px -14px; }
    +.msgsuccess a.close { background-position: -28px 0; }
    +.msgsuccess a.close:hover { background-position: -28px -14px; }
    +.msgerror a.close { background-position: 0 0; }
    +.msgerror a.close:hover { background-position: 0 -14px; }
    +
    +.msgalert { border: 1px solid #eac572; background: #ffe9ad url(../images/notifications.png) no-repeat 0 -52px; }
    +.msginfo { border: 1px solid #99c4ea; background: #d1e4f3 url(../images/notifications.png) no-repeat 0 -156px; }
    +.msgsuccess { border: 1px solid #c1d779; background: #effeb9 url(../images/notifications.png) no-repeat 0 -104px; }
    +.msgerror { border: 1px solid #e18b7c; background: #fad5cf url(../images/notifications.png) no-repeat 0 0; }
    +
    +
    +/*****BUTTONS & ICONS*****/
    +.button_alert { background-image: url(../images/icons/default/alert.png); }
    +
    +.anchorbutton { 
    +	display: inline-block; border: 1px solid #ccc; color: #333; -moz-border-radius: 2px; -webkit-border-radius: 2px;
    +	border-radius: 2px; background-position: 7px; background-repeat: no-repeat; background-color: #f7f7f7; 
    +	-moz-box-shadow: 1px 1px 2px #e7e7e7; -webkit-box-shadow: 1px 1px 2px #e7e7e7; box-shadow: 1px 1px 2px #e7e7e7;
    +}
    +.anchorbutton:hover { text-decoration: none; }
    +.anchorbutton span { background-color: #fff; display: block; margin-left: 30px; border-left: 1px solid #ddd; padding: 5px 10px; }
    +
    +/***PROGRESS BAR (dashboard.html)***/
    +.progress { margin: 5px 0; }
    +.progress .bar { background: #eee; -moz-border-radius: 50px; -webkit-border-radius: 50px; border-radius: 50px; padding: 1px; border: 1px solid #ccc; }
    +.progress .bar { -moz-box-shadow: inset 2px 2px 3px #fff; -webkit-box-shadow: inset 2px 2px 3px #fff; box-shadow: inset 2px 2px 3px #fff; }
    +.progress .bar .value { height: 5px; -moz-border-radius: 50px; -webkit-border-radius: 50px; border-radius: 50px; background-image: url(../images/progress.png); }
    +
    +.progress .bar2 { background: #eee; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; padding: 1px; border: 1px solid #ccc; }
    +.progress .bar2 { -moz-box-shadow: inset 2px 2px 3px #fff; -webkit-box-shadow: inset 2px 2px 3px #fff; box-shadow: inset 2px 2px 3px #fff; }
    +.progress .bar2 .value { padding: 0; text-align: center; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; color: #fff; }
    +.progress .bar2 .value { background-image: url(../images/progress.png); background-position: 0 0; font-size: 11px; font-weight: bold; }
    +
    +.progress .bluebar { background-color: #06f; box-shadow: inset 1px 1px 2px #9af; }
    +.progress .orangebar { background-color: #F90; }
    +.progress .redbar { background-color: #cc0000; }
    +
    +
    +/*****WIDGETS (widgets.html) *****/
    +.widgetgrid .widgetbox { display: inline-block; vertical-align: top; margin: 0 20px 20px 0; }
    +
    +.announcement p { margin: 20px 0; color: #666; }
    +.announcement p:first-child { margin-top: 0; }
    +.announcement p:last-child { margin-bottom: 0; }
    +.announcement p span { color: #333; background: #999; padding: 1px 10px; color: #fff; font-size: 11px; display: inline-block; }
    +
    +.statement table td { text-align: center; }
    +.statement table tbody tr td:first-child, .statement table thead tr th:first-child { border-left: 0; }
    +.statement table tbody tr td:last-child, .statement table thead tr th:last-child { border-right: 0; }
    +.statement table tbody tr:hover td { background: #fff; }
    +
    +.activitylist { list-style: none; }
    +.activitylist li { display: block; border-bottom: 1px solid #eee; }
    +.activitylist li a { display: block; padding: 7px 5px 8px 40px; color: #666; margin: 1px; background-repeat: no-repeat; background-position: 8px center; }
    +.activitylist li a:hover { text-decoration: none; background-color: #f7f7f7;  }
    +.activitylist li a span { font-size: 10px; color: #999; line-height: 10px; }
    +
    +.activitylist li.message a { background-image: url(../images/icons/default/mail.png); }
    +.activitylist li.user a { background-image: url(../images/icons/default/users.png); }
    +.activitylist li.media a { background-image: url(../images/icons/default/media.png); }
    +
    +.userlistwidget ul { list-style: none; }
    +.userlistwidget ul li { font-size: 11px; line-height: 18px; border-bottom: 1px dashed #ddd; padding: 10px 0; }
    +.userlistwidget ul li:first-child { padding-top: 0; }
    +.userlistwidget ul li:last-child { border-bottom: 0; padding-bottom: 0; }
    +.userlistwidget ul li .avatar { float: left; margin-right: 10px; padding: 2px; border: 1px solid #eee; }
    +.userlistwidget ul li a { font-weight:  bold; }
    +.userlistwidget .more { 
    +	display: block; text-align: center; background: #eee; color: #069; padding: 1px 0; font-size: 10px; text-transform: uppercase; font-weight: bold; }
    +.userlistwidget .more:hover { text-decoration: none; background: #e7e7e7; }
    +
    +.stdformwidget label { width: 80px; }
    +.stdformwidget div.par { margin: 13px 0 14px 0; }
    +.stdformwidget div.field { margin-left: 100px; }
    +
    +
    +/***** BUTTONS & ICONS *****/
    +.buttonlist { list-style: none; }
    +.buttonlist li { display: inline-block; margin-bottom: 15px; margin-right: 10px; }
    +a.btn { 
    +	display: inline-block; border: 1px solid #ccc; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; font-weight: bold;
    +	background-color: #f7f7f7; background-repeat: no-repeat; background-image: url(../images/icons/default/sprites.png);
    +	-moz-box-shadow: 1px 1px 2px #eee; -webkit-box-shadow: 1px 1px 2px #eee; box-shadow: 1px 1px 2px #eee; color: #666;
    +}
    +a.btn:hover { 
    +	text-decoration: none; color: #333; -moz-box-shadow: 1px 1px 5px #ddd; -webkit-box-shadow: 1px 1px 5px #ddd; box-shadow: 1px 1px 5px #ddd; 
    +}
    +a.btn span { 
    +	padding: 5px 10px; margin-left: 35px; display: block; background: #fff url(../images/buttonbg.png) repeat-x 0 -31px; border-left: 1px solid #ccc; 
    +	text-shadow: 1px 1px #fff;
    +}
    +a.btn2 { -moz-border-radius: 50px; -webkit-border-radius: 50px; border-radius: 50px; }
    +a.btn2 span { -moz-border-radius: 0 50px 50px 0; -webkit-border-radius: 0 50px 50px 0; border-radius: 0 50px 50px 0; padding-right: 15px; }
    +a.btn3 { width: 34px; height: 32px; }
    +a.btn4 { width: 34px; height: 32px; -moz-border-radius: 50px; -webkit-border-radius: 50px; border-radius: 50px; }
    +
    +a.btn_search { background-position: -10px -12px; }
    +a.btn_trash { background-position: -47px -12px; }
    +a.btn_flag { background-position: -82px -12px; }
    +a.btn_home { background-position: -119px -12px; }
    +a.btn_link { background-position: -154px -12px; }
    +a.btn_book { background-position: -190px -12px; }
    +
    +a.btn_mail { background-position: -10px -47px; }
    +a.btn_help { background-position: -47px -47px; }
    +a.btn_rss { background-position: -82px -47px; }
    +a.btn_archive { background-position: -119px -47px; }
    +a.btn_info { background-position: -154px -47px; }
    +a.btn_bell { background-position: -190px -47px; }
    +
    +a.btn_world { background-position: -10px -83px; }
    +a.btn_bulb { background-position: -47px -83px; }
    +a.btn_cloud { background-position: -82px -83px; }
    +a.btn_clip { background-position: -119px -83px; }
    +a.btn_folder { background-position: -154px -83px; }
    +a.btn_lock { background-position: -190px -83px; }
    +
    +a.btn_tag { background-position: -10px -119px; }
    +a.btn_note { background-position: -47px -119px; }
    +a.btn_key { background-position: -82px -119px; }
    +a.btn_stop { background-position: -119px -119px; }
    +a.btn_airplane { background-position: -154px -119px; }
    +a.btn_info2 { background-position: -190px -119px; }
    +
    +a.btn_alarm { background-position: -10px -155px; }
    +a.btn_clock { background-position: -47px -155px; }
    +a.btn_calendar { background-position: -82px -155px; }
    +a.btn_basket { background-position: -119px -155px; }
    +a.btn_dollartag { background-position: -154px -155px; }
    +a.btn_cart { background-position: -190px -155px; }
    +
    +a.btn_cart2 { background-position: -10px -191px; }
    +a.btn_user { background-position: -47px -191px; }
    +a.btn_users { background-position: -82px -191px; }
    +a.btn_male { background-position: -119px -191px; }
    +a.btn_female { background-position: -154px -191px; }
    +a.btn_refresh { background-position: -190px -191px; }
    +
    +a.btn_chart { background-position: -10px -227px; }
    +a.btn_pie { background-position: -47px -227px; }
    +a.btn_address { background-position: -82px -227px; }
    +a.btn_zip { background-position: -119px -227px; }
    +a.btn_document { background-position: -154px -227px; }
    +a.btn_pdf { background-position: -190px -227px; }
    +
    +a.btn_marker { background-position: -10px -262px; }
    +a.btn_sign { background-position: -47px -262px; }
    +a.btn_note { background-position: -82px -262px; }
    +a.btn_cut { background-position: -119px -262px; }
    +a.btn_pencil { background-position: -154px -262px; }
    +a.btn_paint { background-position: -190px -262px; }
    +
    +a.btn_battery { background-position: -10px -299px; }
    +a.btn_battery2 { background-position: -47px -299px; }
    +a.btn_chat { background-position: -82px -299px; }
    +a.btn_chat2 { background-position: -119px -299px; }
    +a.btn_message { background-position: -154px -299px; }
    +a.btn_message2 { background-position: -190px -299px; }
    +
    +a.btn_phone { background-position: -10px -335px; }
    +a.btn_call { background-position: -47px -335px; }
    +a.btn_inbox { background-position: -82px -335px; }
    +a.btn_inboxo { background-position: -119px -335px; }
    +a.btn_inboxi { background-position: -154px -335px; }
    +a.btn_bluetooth { background-position: -190px -335px; }
    +
    +a.btn_wifi { background-position: -10px -370px; }
    +a.btn_settings { background-position: -47px -370px; }
    +a.btn_settings2 { background-position: -82px -370px; }
    +a.btn_settings3 { background-position: -119px -370px; }
    +a.btn_hd { background-position: -154px -370px; }
    +a.btn_hd2 { background-position: -190px -370px; }
    +
    +a.btn_image { background-position: -10px -408px; }
    +a.btn_image2 { background-position: -47px -408px; }
    +a.btn_sound { background-position: -82px -408px; }
    +a.btn_media { background-position: -119px -408px; }
    +a.btn_mic { background-position: -154px -408px; }
    +a.btn_print { background-position: -190px -408px; }
    +
    +a.btn_laptop { background-position: -10px -443px; }
    +a.btn_mouse { background-position: -47px -443px; }
    +a.btn_camera { background-position: -82px -443px; }
    +a.btn_video { background-position: -119px -443px; }
    +a.btn_grid { background-position: -154px -443px; }
    +a.btn_grid2 { background-position: -190px -443px; }
    +
    +a.btn_list { background-position: -10px -480px; }
    +a.btn_list2 { background-position: -47px -480px; }
    +a.btn_table { background-position: -82px -480px; }
    +
    +.stdbtn { 
    +	font-weight: bold; padding: 7px 10px; border: 1px solid #ccc; background: #eee url(../images/buttons.png) repeat-x top left; color: #333; 
    +	-moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; cursor: pointer;
    +}
    +.stdbtn:hover { text-decoration: none; }
    +
    +.btn_yellow { background-position: 0 -38px; border-color: #ebb205; color: #ae510d; }
    +.btn_blue { background-position: 0 -76px; border-color: #0282ce; color: #fff; }
    +.btn_black { background-position: 0 -114px; border-color: #222; color: #fff; }
    +.btn_lime { background-position: 0 -152px; border-color: #59bf04; color: #367501; }
    +.btn_orange { background-position: 0 -190px; border-color: #cd7a03; color: #6e3c17; }
    +.btn_red { background-position: 0 -228px; border-color: #a31314; color: #fff; }
    +
    +.stdbtn:active { background: #eee; }
    +.btn_yellow:active { background: #ffde06; }
    +.btn_blue:active { background: #0591e5; }
    +.btn_black:active { background: #333333; }
    +.btn_lime:active { background: #6adc0b; }
    +.btn_orange:active { background: #ff9702; }
    +.btn_red:active { background: #eb2f30; }
    +
    +
    +/***** CHAT (chat.html) *****/
    +.contactlist { list-style: none; }
    +.contactlist li { border-top: 1px solid #eee; position: relative; padding: 1px; }
    +.contactlist li:first-child { border-top: 0; }
    +.contactlist li span.msgcount { 
    +	position: absolute; top: 12px; right: 30px; font-size: 10px; padding: 3px 5px; line-height: 10px; color: #fff; background: #dd0000; font-weight: bold;  
    +	-moz-border-radius: 50px; -webkit-border-radius: 50px; border-radius: 50px;
    +}
    +.contactlist li a { padding: 8px 10px; display: block; color: #666; }
    +.contactlist li.online a { background: url(../images/online.png) no-repeat right 16px; }
    +.contactlist li.new a { font-weight: bold; }
    +.contactlist li a:hover { background-color: #fcfcfc; text-decoration: none; }
    +.contactlist li a img { vertical-align: middle; display: inline-block; margin-right: 10px; }
    +
    +.chatsearch { padding: 5px; background: #eee; border-bottom: 1px solid #ddd; overflow: hidden; }
    +.chatsearch input { 
    +	float: left; border: 1px solid #ddd; padding: 7px 5px 7px 35px; width: 245px; background: #fff url(../images/search.png) no-repeat left center; 
    +	color: #ccc;
    +}
    +.chatsearch input:focus { color: #333; }
    +.chatbottom { padding: 8px 10px; background: #f7f7f7; border-top: 1px solid #ddd; }
    +.chatbottom a { color: #666; font-weight: bold; font-size: 11px; border: 1px solid #ddd; background: #fcfcfc; display: inline-block; padding: 2px 10px; }
    +.chatbottom a:hover { text-decoration: none; border: 1px solid #bbb; -moz-box-shadow: 0 0 1px #ddd; -webkit-box-shadow: 0 0 1px #ddd; box-shadow: 0 0 1px #ddd; }
    +
    +.chatcontent { height: 500px; position: relative; padding: 0; }
    +.chatcontent .messagebox { position: absolute; bottom: 0; left: 0; width: 100%; background: #f7f7f7; border-top: 1px solid #ddd; padding: 10px 0; }
    +.chatcontent .messagebox input { 
    +	border: 1px solid #ccc; padding: 8px 5px 8px 30px; width: 78.6%; display: inline-block; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px;
    +	margin-left: 1%; background: #fff url(../images/icons/default/chat.png) no-repeat 8px 8px;
    +}
    +.chatcontent .messagebox input:focus { -moz-box-shadow: 0 0 5px #eee; -webkit-box-shadow: 0 0 5px #eee; box-shadow: 0 0 5px #eee; }
    +.chatcontent .messagebox button { 
    +	border: 0; padding: 7px 0; text-align: center; font-weight: bold; background: #333; color: #fff; display: inline-block; margin-left: 1%; 
    +	-moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; width: 13%;
    +}
    +.chatcontent .messagebox button:hover { background: #111; color: #fff; cursor: pointer; }
    +.chatmessage { height: 425px; border: 1px solid #ddd; margin: 10px; overflow: auto; position: relative; }
    +
    +#chatmessageinner { }
    +#chatmessageinner p { padding: 10px; border-bottom: 1px dotted #ddd; }
    +
    +/***** PAGINATION *****/
    +.pagination { list-style: none; overflow: hidden; }
    +.pagination li { display: inline-block; float: left; margin-right: 5px; }
    +.pagination li.first, .pagination li.previous, .pagination li.next, .pagination li.last { font-size: 18px; }
    +.pagination li a { display: block; font-weight: bold; border: 1px solid #ccc; padding: 5px 10px; color: #333; line-height: 21px; vertical-align: top; }
    +.pagination li a { background: #f7f7f7; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; }
    +.pagination li a:hover { cursor: pointer; text-decoration: none; background: #eee; }
    +.pagination li a.current { background: #333; color: #fff; border: 1px solid #272727; }
    +.pagination li.first a:active, .pagination li.previous a:active, .pagination li.next a:active, .pagination li.last a:active {
    +	background: #333; color: #fff; border 1px solid #272727;
    +}
    +.pagination li a.disable { color: #ccc; }
    +.pagination li a.disable:hover { background: #f7f7f7; cursor: default; }
    +.pagination li a.disable:active { background: #f7f7f7; border: 1px solid #ccc; color: #ccc; }
    +
    +/***** CHECKBOX STYLES *****/
    +.checkbox { display: inline-block; width: 16px; height: 16px; background: url(../images/checkbox.png) no-repeat 0 0; vertical-align: middle; }
    +.checkbox input { opacity: 0; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=00)"; filter: alpha(opacity=00); }
    +.radio { display: inline-block; width: 16px; height: 16px; background: url(../images/radio.png) no-repeat 0 0; vertical-align: middle; }
    +.radio input { opacity: 0; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=00)"; filter: alpha(opacity=00); }
    +.checked { background-position: 0 -16px; }
    +
    +/***** ERROR PAGES *****/
    +.errorWrapper { width: 700px; text-align: center; margin: 80px auto 0 auto; }
    +.errorWrapper span { color: #fff; font-size: 14px; font-style: italic; text-shadow: 1px 1px #555; }
    +.errorWrapper a { 
    +	display: inline-block; padding: 10px 30px; background: #999; color: #222; font-weight: bold; margin-top: 20px; 
    +	-moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; 
    +}
    +.errorWrapper a.default { color: #222; background: #999; }
    +.errorWrapper a.hover { background: #fff; color: #333; }
    +.errorWrapper a:hover { text-decoration: none; }
    +.pageErrorTitle { color: #fff; font-size: 56px; text-shadow: 1px 1px #333; }
    +
    +/***** FOOTER *****/
    +.footer { margin: 10px 0; font-size: 11px; }
    +
    +/**** CUSTOM STYLES *****/
    +.center { text-align: center; }
    +.block { display: block; }
    +.margintop10 { margin-top: 10px; }
    +.textright { text-align: right; }
    +.tooltipflot { font-size: 11px; padding: 5px 10px; background: url(../images/blacktrans.png); color: #eee; }
    +.noright { margin-right: 0; }
    +.radiusbottom0 { -moz-border-radius: 2px 2px 0 0; -webkit-border-radius: 2px 2px 0 0; border-radius: 2px 2px 0 0; }
    +.padding0 { padding: 0 !important; }
    +.width100 { width: 100px !important; }
    +#popwizard { padding: 20px; }
    +#popwizard .stepContainer { height: 268px !important; }
    +#popwizard .actionBar { padding-top: 30px; }
    +.pie { font-size:10px; text-align:center; padding:2px; color:#fff; text-shadow: 1px 1px #444; }
    +.quickform .notifyMessage  { margin: 0; margin-bottom: 20px; }
    +.stdform .vsmallinput { width: 60px; }
    +.borderTop0 { border-top: 0; }
    +.color333 { color: #333; }
    +.floatleft { float: left; }
    +.loaders img { margin-right: 10px; display: inline-block; }
    +
    +.chartplace { margin-bottom: 10px; height: 150px; }
    +.average { font-size: 10px; text-transform: uppercase; color: #069; font-weight: bold; border-top: 1px dashed #ccc; padding-top: 5px; }
    +.average h3 { display: inline-block; vertical-align: bottom; margin-left: 10px; font-size: 16px; }
    +.ui-datepicker-inline .ui-datepicker-calendar td a:hover { background: #ddd; text-decoration: none; color: #666; text-shadow: none; }
    +.ui-datepicker-inline .ui-datepicker-calendar td.ui-datepicker-today a { 
    +	background: #333; text-decoration: none; color: #fff; text-shadow: none; font-weight: bold; 
    +}
    +
    +@media screen and (max-width: 1024px) {
    +	.maincontent { margin-right: 260px; margin-left: 230px; }
    +	.mainright { width: 250px; }
    +	.contenttitle, .widgetbox .title { height: 32px; overflow: hidden; }
    +	.contenttitle h2, .widgetbox .title h2 { font-size: 16px; }
    +	.mainleft { width: 220px; }
    +	.notification p { }
    +	.noright { margin-right: 0; }
    +	.errorWrapper { width: auto; }
    +	.chatcontent .messagebox input { width: 74.3%; }
    +}
    +
    +@media screen and (max-width: 700px) { 
    +	.maincontent { margin-right: 0; }
    +	.mainright { position: relative; margin-top: 10px; width: auto; }
    +	.mainright .widgetbox { width: 48%; float: left; margin-right: 4%; }
    +	.mainright .widgetbox:nth-child(even) { margin-right: 0; }
    +	.footer { clear: both; }
    +	.searchbox input { width: 150px; }
    +	.chatcontent .messagebox input { width: 75%; }
    +	.imagelist li img { width: 240px; }
    +	.floatright { display: none; }
    +}
    +
    +@media screen and (max-width: 650px) {
    +	#userPanel { border-left: 0; }
    +	#searchPanel { border-right: 0; }
    +	.imagelist li img { width: 200px; }
    +	
    +	.stdform p, .stdform div.par { background: none; }
    +	.stdform label { display: block; text-align: left; float: none; width: auto; }
    +	.stdform span.field, .stdform div.field, .dualselect, 
    +	.stdform .formwrapper, .stdform .formwrapper { margin-left: 0; }
    +	.stdform small.desc { margin: 5px 0 0 0; }
    +	.stdform .stdformbutton { margin-left: 0; }
    +	
    +	.stdform2 p, .stdform2 div.par { background: none; }
    +	.stdform2 label { display: block; padding: 7px 10px; background: #f7f7f7; border-bottom: 1px solid #ddd; float: none; width: auto; }
    +	.stdform2 span.field, .stdform2 div.field { display: block; margin-left: 0; border-left: 0; }
    +	.verwizard .actionBar { margin: 0; }
    +}
    +
    +@media screen and (max-width: 580px) {
    +	.headerinner { border-bottom: 1px solid #222; }
    +}
    +
    +@media screen and (max-width: 570px) {
    +	.tablewrapper { width: 100%; overflow: auto; }	
    +	.mainright .widgetbox { float: none; margin-right: 0; width: auto; margin-bottom: 10px; }
    +	.one_half, .one_third, .two_third, .three_fourth, 
    +	.one_fourth, .one_fifth, .two_fifth, .three_fifth, 
    +	.four_fifth, .one_sixth, .five_sixth {
    +		float: none; width: auto; margin-right: 0; margin-bottom: 20px; display: block; 
    +	}
    +	
    +	.chartbox .one_half { float: left; margin-right: 3%; width: 48.5%; }
    +	
    +	.searchbox input { width: 200px; }
    +	.imagelist li { margin: 0 10px 10px 0; }
    +	.imagelist li img { width: 150px; }
    +	.imagelist li span a.name { font-size: 11px; }
    +	.imagelist li span a.edit, .imagelist li span a.view, .imagelist li span a.delete { display: none; }
    +	
    +	/* CALENDAR STYLES */
    +	.fc-header-left { font-size: 11px; }
    +	.fc-button, .fc-button-content { height: auto; }
    +	.fc-button-month .fc-button-content, 
    +	.fc-button-agendaWeek .fc-button-content, 
    +	.fc-button-agendaDay .fc-button-content, 
    +	.fc-button-today .fc-button-content { padding: 2px 5px; }
    +	.fc-header-title h2 { font-size: 14px; }
    +	
    +	.maintabmenu li a { padding: 8px 10px; font-size: 16px; }
    +	.verwizard .verticalmenu { font-size: 11px; width: auto; float: none; }
    +	.verwizard .stepContainer { margin-left: 0; margin-top: 20px; }
    +	.wizard .tabbedmenu li a { padding: 5px; }
    +	.wizard .tabbedmenu li a h2 { font-size: 16px; }
    +	.wizard .tabbedmenu li a span { font-weight: normal; font-size: 11px; }
    +	
    +}
    +
    +@media screen and (max-width: 480px) {
    +	
    +	.maincontent { margin-right: 0; }
    +	.mainright .widgetbox {  }
    +	.widgetlist li { width: 48%; margin-right: 4%; }
    +	.widgetlist li:nth-child(even) { margin-right: 0; }
    +	.widgetlist li a { width: auto; display: block; }
    +	.headerinner2 .searchbox { border-right: 0; }
    +	.headerinner2 .searchbox input { width: 150px; }
    +	.searchbox input { width: 150px; }
    +	.stdtable td, .stdtable th { font-size: 11px; }
    +	.chatcontent .messagebox input { width: 70%; }
    +	.wizard .tabbedmenu li a { padding: 10px 20px; }
    +	.wizard .tabbedmenu li a h2 { font-size: 20px; }
    +	.wizard .tabbedmenu li a span { display: none; }
    +	.widgetgrid .widgetbox { width: auto !important; display: block; margin-right: 0; }
    +}
    +
    +@media screen and (max-width: 430px) {
    +	
    +	body { font-size: 11px; }
    +	button, input, select, textarea { font-size: 11px; }
    +	
    +	.loginbox { width: auto; margin: 10px; }
    +	.loginbox input { width: 95%; }
    +	.loginbox button { width: 100%; }
    +	
    +	.userinfomenu .userinfo { font-size: 11px; }
    +	.userdrop ul li a { font-size: 11px; }
    +	.headerinner2 .searchbox input { width: 70px; font-size: 11px; }
    +	.notibox { width: 250px; }
    +	.tabmenu li a, .widgetlist li a { font-size: 11px; }
    +	.dataTables_wrapper input { width: 70px; }
    +	.deletebutton { display: none; }
    +	.tableoptions select { padding: 2px; }
    +	.tableoptions button { padding: 2px 5px; }
    +	.stdtablecb thead th:first-child, .stdtablecb tbody tr td:first-child { display: none; }
    +	.flatmode { display: none; }
    +	.vs2 { margin-left: 0 !important; }
    +	.imagelist li img { width: 210px; }
    +	.multipletabmenu li a { 
    +		width: auto; padding: 5px; font-size: 11px; font-weight: bold; text-transform: uppercase; font-family: Arial, Helvetica, sans-serif; 
    +		letter-spacing: 0; 
    +	}
    +	.dualselect select { 30%; }
    +	.dualselect .ds_arrow { margin: 0; }
    +	.stdform button, .stdform input[type="reset"] { padding: 5px; }
    +	.stdform2 span.field, .stdform2 div.field, .stdform2 .stdformbutton { padding: 10px; }
    +	.stepContainer h2 { font-size: 16px; }
    +	.fc-header-left, .fc-button-today { display: none; }
    +	.fc-header-title h2 { font-size: 20px; }
    +	.fc-header-center { text-align: left; }
    +	.chatcontent .messagebox input { width: 150px; }
    +	.chatcontent .messagebox button { margin-left: 5px; width: 60px; }
    +	.errorWrapper a { display: block; margin-top: 0; padding: 20px 0; font-size: 12px; }
    +	.errorWrapper span { display: block; margin-bottom: 20px; }
    +	.footer { font-size: 10px; }
    +	
    +}
    +
    +
    +/** theme **/
    +.theme { display: inline-block; position: fixed; bottom: 10px; left: 0; background: #fff; border: 1px solid #ccc; border-left: 0; }
    +.theme { -moz-box-shadow: 0 0 5px #ddd; -webkit-box-shadow: 0 0 5px #ddd; box-shadow: 0 0 5px #ddd; overflow: hidden; }
    +.theme { -moz-border-radius: 0 3px 3px 0; -webkit-border-radius: 0 3px 3px 0; border-radius: 0 3px 3px 0; }
    +.theme h4 { font-size: 10px; text-transform: uppercase; font-weight: normal; background: #333; padding: 5px; color: #ccc; }
    +.theme a { display: inline-block; width: 16px; height: 16px; margin: 5px; }
    +.theme a.darkblue { background: #001F3E; }
    +.theme a.gray { background: #ccc; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/default/datatables_style.css b/src/main/webapp/plug-in/datatables/default/datatables_style.css
    new file mode 100644
    index 00000000..fb692c2a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/default/datatables_style.css
    @@ -0,0 +1,709 @@
    +/*
    + *  File:         demo_table.css
    + *  CVS:          $Id: datatables_style.css,v 1.1 2012/12/05 01:39:36 ghp Exp $
    + *  Description:  CSS descriptions for DataTables demo pages
    + *  Author:       Allan Jardine
    + *  Created:      Tue May 12 06:47:22 BST 2009
    + *  Modified:     $Date: 2012/12/05 01:39:36 $ by $Author: ghp $
    + *  Language:     CSS
    + *  Project:      DataTables
    + * Common issues:
    + *   'full_numbers' pagination - I use an extra selector on the body tag to ensure that there is
    + *     no conflict between the two pagination types. If you want to use full_numbers pagination
    + *     ensure that you either have "example_alt_pagination" as a body class name, or better yet,
    + *     modify that selector.
    + *   Note that the path used for Images is relative. All images are by default located in
    + *     images/ - relative to this CSS file.
    + */
    +.dataTables_wrapper {
    +	position: relative;
    +	clear: both;
    +	zoom: 1; /* Feeling sorry for IE */
    +}
    +
    +.box .dataTables_wrapper {
    +	padding-top: 5px;
    +}
    +/*鍒楄〃闀垮害涓嬫媺妗嗗搴*/
    +div.dataTables_length select {
    +	width: 60px;
    +}
    +
    +.dataTables_processing {
    +	position: absolute;
    +	top: 50%;
    +	left: 50%;
    +	width: 250px;
    +	height: 30px;
    +	margin-left: -125px;
    +	margin-top: -15px;
    +	padding: 14px 0 2px 0;
    +	border: 1px solid #ddd;
    +	text-align: center;
    +	color: #999;
    +	font-size: 14px;
    +	background-color: white;
    +}
    +
    +.dataTables_length {
    +	width: auto;
    +	float: right;
    +}
    +
    +.dataTables_length .selector {
    +	margin-left: 10px;
    +}
    +
    +.dataTables_length .selector select {
    +	width: 50px !important;
    +}
    +
    +.box .dataTables_length {
    +	margin-right: 15px;
    +}
    +
    +.dataTables_filter {
    +	width: auto;
    +	float: left;
    +	text-align: left;
    +}
    +
    +.dataTables_filter input {
    +	margin-left: 10px;
    +	background: url(../images/search.png) no-repeat 98% center;
    +}
    +
    +.box .dataTables_filter {
    +	margin-left: 15px;
    +}
    +
    +.dataTables_info {
    +	width: auto;
    +	float: left;
    +	margin-top: 10px;
    +	padding-left: 10px;
    +}
    +
    +.box .dataTables_info {
    +	margin-top: 15px;
    +	margin-bottom: 15px;
    +}
    +
    +.dataTables_paginate {
    +	float: right;
    +	text-align: right;
    +	margin-top: 10px;
    +	margin-right: 10px;
    +}
    +
    +/* Pagination nested */
    +.paginate_disabled_previous,.paginate_enabled_previous,.paginate_disabled_next,.paginate_enabled_next
    +	{
    +	display: inline-block;
    +	float: left;
    +	padding: 0 14px;
    +	line-height: 28px;
    +	text-decoration: none;
    +	border: 1px solid #c4c4c4;
    +	border-left-width: 1px;
    +	background: rgb(255, 255, 255);
    +	background:
    +		url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
    +	background: -moz-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, rgba(255,
    +		255, 255, 1) ), color-stop(100%, rgba(243, 243, 243, 1) ) );
    +	background: -webkit-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -o-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -ms-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	filter: progid : DXImageTransform.Microsoft.gradient (   startColorstr =
    +		'#ffffff', endColorstr = '#f3f3f3', GradientType = 0 );
    +	min-height: 28px;
    +	color: #717171;
    +	box-shadow: 0 1px 0 #eaeaea, 0 1px 0 #fff inset;
    +	margin-right: 4px;
    +	-webkit-border-radius: 2px 2px 2px 2px;
    +	-moz-border-radius: 2px 2px 2px 2px;
    +	border-radius: 2px 2px 2px 2px;
    +	font-weight: 700;
    +}
    +
    +.paginate_disabled_previous:hover,.paginate_enabled_previous:hover,.paginate_disabled_next:hover,.paginate_enabled_next:hover
    +	{
    +	text-decoration: none !important;
    +}
    +
    +.paginate_disabled_previous:active,.paginate_enabled_previous:active,.paginate_disabled_next:active,.paginate_enabled_next:active
    +	{
    +	outline: none;
    +}
    +
    +.paginate_disabled_previous,.paginate_disabled_next {
    +	color: #666 !important;
    +}
    +
    +.paginate_disabled_previous,.paginate_enabled_previous {
    +	padding-left: 23px;
    +}
    +
    +.paginate_disabled_next,.paginate_enabled_next {
    +	padding-right: 23px;
    +	margin-left: 10px;
    +}
    +
    +.paginate_disabled_previous {
    +	opacity: 0.7;
    +	filter: alpha(opacity = 70);
    +}
    +
    +.paginate_enabled_previous,.paginate_enabled_next:hover {
    +	opacity: 1;
    +	filter: alpha(opacity = 100);
    +	cursor: pointer;
    +}
    +
    +.paginate_enabled_previous:hover {
    +	border: 1px solid #a3a3a3;
    +	background: #e8e6e6;
    +}
    +
    +.paginate_disabled_next {
    +	opacity: 0.7;
    +	filter: alpha(opacity = 70);
    +}
    +
    +.paginate_enabled_next {
    +	opacity: 1;
    +	filter: alpha(opacity = 100);
    +}
    +
    +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    + * DataTables display
    + */
    +table.display {
    +	margin: 0 auto;
    +	clear: both;
    +	width: 100%;
    +	/* Note Firefox 3.5 and before have a bug with border-collapse
    +	 * ( https://bugzilla.mozilla.org/show%5Fbug.cgi?id=155955 ) 
    +	 * border-spacing: 0; is one possible option. Conditional-css.com is
    +	 * useful for this kind of thing
    +	 *
    +	 * Further note IE 6/7 has problems when calculating widths with border width.
    +	 * It subtracts one px relative to the other browsers from the first column, and
    +	 * adds one to the end...
    +	 *
    +	 * If you want that effect I'd suggest setting a border-top/left on th/td's and 
    +	 * then filling in the gaps with other borders.
    +	 */
    +}
    +
    +table.display thead tr {
    +	background: rgb(255, 255, 255);
    +	background:
    +		url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
    +	background: -moz-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, rgba(255,
    +		255, 255, 1) ), color-stop(100%, rgba(243, 243, 243, 1) ) );
    +	background: -webkit-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -o-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -ms-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	filter: progid : DXImageTransform.Microsoft.gradient (   startColorstr =
    +		'#ffffff', endColorstr = '#f3f3f3', GradientType = 0 );
    +	-moz-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +}
    +
    +table.display thead th {
    +	font-weight: bold;
    +	cursor: pointer; *
    +	cursor: hand;
    +}
    +
    +table.display tfoot tr {
    +	background: rgb(255, 255, 255);
    +	background:
    +		url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
    +	background: -moz-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, rgba(255,
    +		255, 255, 1) ), color-stop(100%, rgba(243, 243, 243, 1) ) );
    +	background: -webkit-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -o-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -ms-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	filter: progid : DXImageTransform.Microsoft.gradient (   startColorstr =
    +		'#ffffff', endColorstr = '#f3f3f3', GradientType = 0 );
    +	-moz-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	border-bottom: 1px solid #c4c4c4;
    +}
    +
    +table.display tfoot th {
    +	font-weight: bold;
    +}
    +
    +.box table.display tfoot th {
    +	border-bottom: 1px solid #c4c4c4;
    +}
    +
    +table.display tr.heading2 td {
    +	border-bottom: 1px solid #aaa;
    +}
    +
    +table.display td {
    +	padding: 3px 2px;
    +}
    +table.display th {
    +	padding: 3px 3px;
    +}
    +
    +table.display td.center {
    +	text-align: center;
    +	width: auto;
    +	display: table-cell;
    +}
    +
    +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    + * DataTables sorting
    + */
    +.sorting_asc {
    +	background: url('../images/sort_asc.png') no-repeat center right
    +		!important;
    +}
    +
    +.sorting_desc {
    +	background: url('../images/sort_desc.png') no-repeat center right
    +		!important;
    +}
    +
    +.sorting {
    +	background: url('../images/sort_both.png') no-repeat center right
    +		!important;
    +}
    +
    +.sorting_asc_disabled {
    +	background: url('../images/sort_asc_disabled.png') no-repeat center
    +		right !important;
    +}
    +
    +.sorting_desc_disabled {
    +	background: url('../images/sort_desc_disabled.png') no-repeat center
    +		right !important;
    +}
    +
    +th:active {
    +	outline: none;
    +}
    +
    +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    + * DataTables row classes
    + */
    +table.display tr.odd.gradeA {
    +	background-color: #ffffff;
    +}
    +
    +table.display tr.even.gradeA {
    +	background-color: #f7f7f7;
    +}
    +
    +table.display tr.odd.gradeC {
    +	background-color: #ffffff;
    +}
    +
    +table.display tr.even.gradeC {
    +	background-color: #f7f7f7;
    +}
    +
    +table.display tr.odd.gradeX {
    +	background-color: #ffffff;
    +}
    +
    +table.display tr.even.gradeX {
    +	background-color: #f7f7f7;
    +}
    +
    +table.display tr.odd.gradeU {
    +	background-color: #ffffff;
    +}
    +
    +table.display tr.even.gradeU {
    +	background-color: #f7f7f7;
    +}
    +
    +tr.odd {
    +	background-color: #f7f7f7;
    +}
    +
    +tr.even {
    +	background-color: white;
    +}
    +
    +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    + * Misc
    + */
    +.dataTables_scroll {
    +	clear: both;
    +}
    +
    +.dataTables_scrollBody {
    +	*margin-top: -1px;
    +	-webkit-overflow-scrolling: touch;
    +}
    +
    +/*.top, .bottom {
    +	padding: 15px;
    +	background-color: #F5F5F5;
    +	border: 1px solid #CCCCCC;
    +}*/
    +.top .dataTables_info {
    +	float: none;
    +}
    +
    +.clear {
    +	clear: both;
    +}
    +
    +.dataTables_empty {
    +	text-align: center;
    +}
    +
    +tfoot input {
    +	margin: 0.5em 0;
    +	width: 100%;
    +	color: #444;
    +}
    +
    +tfoot input.search_init {
    +	color: #999;
    +}
    +
    +td.group {
    +	background-color: #d1cfd0;
    +	border-bottom: 2px solid #A19B9E;
    +	border-top: 2px solid #A19B9E;
    +}
    +
    +td.details {
    +	background-color: #d1cfd0;
    +	border: 2px solid #A19B9E;
    +}
    +
    +.example_alt_pagination div.dataTables_info {
    +	width: 40%;
    +}
    +
    +.paging_full_numbers {
    +	height: 28px;
    +}
    +
    +.paging_full_numbers a:active {
    +	color: #f2f2f2;
    +	box-shadow: 0 1px 0 #eaeaea, 0 1px 0 #67c3da inset;
    +	border-color: #5098aa;
    +	background: #88BBC8;
    +}
    +
    +.paging_full_numbers a:hover {
    +	border: 1px solid #a3a3a3;
    +	background: #e8e6e6;
    +}
    +
    +.paging_full_numbers a.paginate_button,.paging_full_numbers a.paginate_active
    +	{
    +	border: 1px solid #aaa;
    +	-webkit-border-radius: 5px;
    +	-moz-border-radius: 5px;
    +	padding: 2px 5px;
    +	margin: 0 3px;
    +	cursor: pointer;
    +	*cursor: hand;
    +	color: #333 !important;
    +}
    +
    +.paging_full_numbers a.paginate_button {
    +	display: inline-block;
    +	float: left;
    +	padding: 0 14px;
    +	line-height: 28px;
    +	text-decoration: none;
    +	border: 1px solid #c4c4c4;
    +	border-left-width: 1px;
    +	background: rgb(255, 255, 255);
    +	background:
    +		url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
    +	background: -moz-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, rgba(255,
    +		255, 255, 1) ), color-stop(100%, rgba(243, 243, 243, 1) ) );
    +	background: -webkit-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -o-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -ms-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	filter: progid : DXImageTransform.Microsoft.gradient (   startColorstr =
    +		'#ffffff', endColorstr = '#f3f3f3', GradientType = 0 );
    +	min-height: 28px;
    +	color: #717171;
    +	box-shadow: 0 1px 0 #eaeaea, 0 1px 0 #fff inset;
    +	margin-right: 4px;
    +	-webkit-border-radius: 2px 2px 2px 2px;
    +	-moz-border-radius: 2px 2px 2px 2px;
    +	border-radius: 2px 2px 2px 2px;
    +	font-weight: 700;
    +}
    +
    +.paging_full_numbers a.paginate_button:hover {
    +	border: 1px solid #a3a3a3;
    +	background: #e8e6e6;
    +}
    +
    +.paging_full_numbers a.paginate_active {
    +	color: #f2f2f2;
    +	box-shadow: 0 1px 0 #eaeaea, 0 1px 0 #67c3da inset;
    +	border-color: #5098aa;
    +	background: #88BBC8;
    +	float: left;
    +	padding: 0 14px;
    +	line-height: 28px;
    +	-webkit-border-radius: 2px 2px 2px 2px;
    +	-moz-border-radius: 2px 2px 2px 2px;
    +	border-radius: 2px 2px 2px 2px;
    +	font-weight: 700;
    +	cursor: default;
    +	text-decoration: none;
    +	color: #fff;
    +}
    +
    +table.display tr.even.row_selected td {
    +	background-color: #B0BED9;
    +}
    +
    +table.display tr.odd.row_selected td {
    +	background-color: #9FAFD1;
    +}
    +
    +/*
    + * Sorting classes for columns
    + */
    +/* For the standard odd/even */
    +tr.odd td.sorting_1 { /*background-color: #eeeeee;*/
    +	
    +}
    +
    +tr.odd td.sorting_2 { /*background-color: #eeeeee;*/
    +	
    +}
    +
    +tr.odd td.sorting_3 { /*background-color: #eeeeee;*/
    +	
    +}
    +
    +tr.even td.sorting_1 { /*background-color: #e0e0e0;*/
    +	
    +}
    +
    +tr.even td.sorting_2 { /*background-color: #e0e0e0;*/
    +	
    +}
    +
    +tr.even td.sorting_3 { /*background-color: #e0e0e0;*/
    +	
    +}
    +
    +/* For the Conditional-CSS grading rows */
    +/*
    + 	Colour calculations (based off the main row colours)
    +  Level 1:
    +		dd > c4
    +		ee > d5
    +	Level 2:
    +	  dd > d1
    +	  ee > e2
    + */
    +/*tr.odd.gradeA td.sorting_1 {
    +	background-color: #c4ffc4;
    +}
    +
    +tr.odd.gradeA td.sorting_2 {
    +	background-color: #d1ffd1;
    +}
    +
    +tr.odd.gradeA td.sorting_3 {
    +	background-color: #d1ffd1;
    +}
    +
    +tr.even.gradeA td.sorting_1 {
    +	background-color: #d5ffd5;
    +}
    +
    +tr.even.gradeA td.sorting_2 {
    +	background-color: #e2ffe2;
    +}
    +
    +tr.even.gradeA td.sorting_3 {
    +	background-color: #e2ffe2;
    +}
    +
    +tr.odd.gradeC td.sorting_1 {
    +	background-color: #c4c4ff;
    +}
    +
    +tr.odd.gradeC td.sorting_2 {
    +	background-color: #d1d1ff;
    +}
    +
    +tr.odd.gradeC td.sorting_3 {
    +	background-color: #d1d1ff;
    +}
    +
    +tr.even.gradeC td.sorting_1 {
    +	background-color: #d5d5ff;
    +}
    +
    +tr.even.gradeC td.sorting_2 {
    +	background-color: #e2e2ff;
    +}
    +
    +tr.even.gradeC td.sorting_3 {
    +	background-color: #e2e2ff;
    +}
    +
    +tr.odd.gradeX td.sorting_1 {
    +	background-color: #ffc4c4;
    +}
    +
    +tr.odd.gradeX td.sorting_2 {
    +	background-color: #ffd1d1;
    +}
    +
    +tr.odd.gradeX td.sorting_3 {
    +	background-color: #ffd1d1;
    +}
    +
    +tr.even.gradeX td.sorting_1 {
    +	background-color: #ffd5d5;
    +}
    +
    +tr.even.gradeX td.sorting_2 {
    +	background-color: #ffe2e2;
    +}
    +
    +tr.even.gradeX td.sorting_3 {
    +	background-color: #ffe2e2;
    +}
    +
    +tr.odd.gradeU td.sorting_1 {
    +	background-color: #c4c4c4;
    +}
    +
    +tr.odd.gradeU td.sorting_2 {
    +	background-color: #d1d1d1;
    +}
    +
    +tr.odd.gradeU td.sorting_3 {
    +	background-color: #d1d1d1;
    +}
    +
    +tr.even.gradeU td.sorting_1 {
    +	background-color: #d5d5d5;
    +}
    +
    +tr.even.gradeU td.sorting_2 {
    +	background-color: #e2e2e2;
    +}
    +
    +tr.even.gradeU td.sorting_3 {
    +	background-color: #e2e2e2;
    +}*/
    +/*
    + * Row highlighting example
    + */
    +.ex_highlight #example tbody tr.even:hover,#example tbody tr.even td.highlighted
    +	{
    +	background-color: #ECFFB3;
    +}
    +
    +.ex_highlight #example tbody tr.odd:hover,#example tbody tr.odd td.highlighted
    +	{
    +	background-color: #E6FF99;
    +}
    +
    +.ex_highlight_row #example tr.even:hover {
    +	background-color: #ECFFB3;
    +}
    +
    +.ex_highlight_row #example tr.even:hover td.sorting_1 {
    +	background-color: #DDFF75;
    +}
    +
    +.ex_highlight_row #example tr.even:hover td.sorting_2 {
    +	background-color: #E7FF9E;
    +}
    +
    +.ex_highlight_row #example tr.even:hover td.sorting_3 {
    +	background-color: #E2FF89;
    +}
    +
    +.ex_highlight_row #example tr.odd:hover {
    +	background-color: #E6FF99;
    +}
    +
    +.ex_highlight_row #example tr.odd:hover td.sorting_1 {
    +	background-color: #D6FF5C;
    +}
    +
    +.ex_highlight_row #example tr.odd:hover td.sorting_2 {
    +	background-color: #E0FF84;
    +}
    +
    +.ex_highlight_row #example tr.odd:hover td.sorting_3 {
    +	background-color: #DBFF70;
    +}
    +
    +/*
    + * KeyTable
    + */
    +table.KeyTable td {
    +	border: 3px solid transparent;
    +}
    +
    +table.KeyTable td.focus {
    +	border: 3px solid #3366FF;
    +}
    +
    +table.display tr.gradeA {
    +	background-color: #eeffee;
    +}
    +
    +table.display tr.gradeC {
    +	background-color: #ddddff;
    +}
    +
    +table.display tr.gradeX {
    +	background-color: #ffdddd;
    +}
    +
    +table.display tr.gradeU {
    +	background-color: #ddd;
    +}
    diff --git a/src/main/webapp/plug-in/datatables/default/main.css b/src/main/webapp/plug-in/datatables/default/main.css
    new file mode 100644
    index 00000000..990a651a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/default/main.css
    @@ -0,0 +1,519 @@
    +/* Main.css version 1.1
    +================================================== */
    +
    +body {
    +	background: #fff;
    +	-webkit-font-smoothing: antialiased;
    +	overflow-x:	hidden;
    +	background: url(../images/patterns/5.png) repeat;
    +}
    +
    +
    +/*position elements*/
    +.left {float:left;}
    +.right {float:right;}
    +.center {text-align:center; width:100%; }
    +	.center i {float:none; display: inline;}
    +
    +/*margins*/
    +.marginR5 {margin-right: 5px;}
    +.marginR10{margin-right: 10px;}
    +.marginT5 {margin-top:5px;}
    +.marginT10{margin-top:10px;}
    +.marginB5 {margin-bottom: 5px;}
    +.marginB10 {margin-bottom: 10px;}
    +.marginL5 {margin-left: 5px;}
    +.marginL10 {margin-left: 10px;}
    +.margin10 {margin: 10px;}
    +
    +/*paddings*/
    +.padding15 {padding:15px;}
    +.padingR5 {padding-right: 5px;}
    +.padingR10{padding-right: 10px;}
    +.padingT5 {padding-top:5px;}
    +.padingT10{padding-top:10px;}
    +.padingB5 {padding-bottom: 5px;}
    +.padingB10 {padding-bottom: 10px;}
    +.padingL5 {padding-left: 5px;}
    +.padingL10 {padding-left: 10px;}
    +.padding {padding: 10px;}
    +
    +div.centerContent {margin: 0;display: block;}
    +
    +.strong {font-weight: 700;}
    +
    +a,.btn {outline: none !important;}
    +
    +
    +/* Typography 
    +-------------------------------------------------- */
    +
    +li {margin-bottom:7px;}
    +a {
    +  color: #3399cc;
    +  text-decoration: none;
    +}
    +a:hover {
    +  color: #005580;
    +  text-decoration: underline;
    +}
    +
    +body {
    +	font-family: 'Droid Sans', 
    +	Helvetica, Arial, sans-serif; 
    +	color:#353535; 
    +	font-size: 13px;
    +	-webkit-font-smoothing: antialiased; /* Fix for webkit rendering */
    +	-webkit-text-size-adjust: 100%; 
    +	font-size-adjust: 100%;
    +	font-weight: 400;
    +	/*-webkit-text-stroke: 100%;*/
    +}
    +
    +p {
    +  margin: 0 0 9px;
    +  font-family: 'Droid Sans', Helvetica, Arial, sans-serif;
    +  font-size: 13px;
    +  line-height: 22px;
    +  font-weight: 400;
    +}
    +p small {
    +  font-size: 11px;
    +  color: #999999;
    +}
    +
    +h1,h2,h3,h4,h5,h6 {
    +  margin: 0;
    +  font-family: 'Open Sans', sans-serif;
    +  /*font-family: 'Signika', sans-serif;*/
    +  font-weight: 700;
    +  color: inherit;
    +  text-rendering: optimizelegibility;
    +  margin-bottom:10px;
    +}
    +
    +
    +
    +h1 small,h2 small,h3 small,h4 small,h5 small,h6 small {
    +  font-weight: normal;
    +  color: #999999;
    +}
    +
    +h1 { font-size: 30px;line-height: 45px;}
    +h1 small {font-size: 18px;}
    +h2 { font-size: 24px;line-height: 36px;}
    +h2 small {font-size: 18px;}
    +h3 {font-size: 18px;line-height: 27px;}
    +h3 small {font-size: 14px;}
    +h4,h5,h6 {line-height: 18px;}
    +h4 {font-size: 14px;}
    +h4 small {font-size: 12px;}
    +h5 {font-size: 12px;}
    +h6 {font-size: 11px;color: #999999;text-transform: uppercase;}
    +
    +
    +
    +body, p {font-family: 'Droid Sans', Helvetica, Arial, sans-serif;}
    + 
    +/* Boostrap override (make it pretty :)
    +================================================== */
    +
    +/*Page header*/
    +.page-header {
    +	padding-bottom: 0; 
    +	margin-top:9px; 
    +	border-color: #c4c4c4;
    +	-moz-box-shadow:0 1px 0px rgba(255, 255, 255, 1);
    +	-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +}
    +
    +/*Tables*/
    +.table {position: relative;}
    +.table td { border-top: 1px solid #c4c4c4;}
    +.table thead th, .table tbody td {text-align: center;}
    +.table thead th:first-child, .table tbody td:first-child  {text-align: left;}
    +
    +.table tr {
    +	-moz-box-shadow:0 1px 0px rgba(255, 255, 255, 1);
    +	-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +}
    +
    +.table tbody {background-color:#fafafa;}
    +.table tbody + tbody {border-top: 2px solid #c4c4c4;}
    +.table tbody tr:last-child{border-bottom: 1px solid #c4c4c4;}
    +.table thead th {
    +  	background: rgb(255,255,255);
    +	background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
    +	background: -moz-linear-gradient(top,  rgba(255,255,255,1) 1%, rgba(243,243,243,1) 100%);
    +	background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgba(255,255,255,1)), color-stop(100%,rgba(243,243,243,1)));
    +	background: -webkit-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +	background: -o-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +	background: -ms-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +	background: linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +	-moz-box-shadow:0 1px 0px rgba(255, 255, 255, 1);
    +	-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +}
    +
    +.table-bordered {
    +  border-color: #c4c4c4;
    +  border-top:1px solid transparent;
    +  -webkit-border-radius: 2px;
    +     -moz-border-radius: 2px;
    +          border-radius: 2px;
    +   padding-bottom: 1px;
    +   border-collapse: collapse;
    +   margin-top:-1px;
    +   margin-left:-1px;
    +}
    +
    +.table caption + thead tr:first-child th,.table caption + thead tr:first-child td,.table colgroup + thead tr:first-child th,
    +.table colgroup + thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td {
    +  border-top: 1px solid #c4c4c4;
    +}
    +.table-bordered th,.table-bordered td { border-left: 1px solid #c4c4c4;}
    +.table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child {
    +  -webkit-border-top-left-radius: 2px;
    +          border-top-left-radius: 2px;
    +  -moz-border-radius-topleft: 2px;
    +}
    +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child {
    +  -webkit-border-top-right-radius: 2px;
    +          border-top-right-radius: 2px;
    +  -moz-border-radius-topright: 2px;
    +}
    +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child {
    +  -webkit-border-radius: 0 0 0 2px;
    +     -moz-border-radius: 0 0 0 2px;
    +          border-radius: 0 0 0 2px;
    +  -webkit-border-bottom-left-radius: 2px;
    +          border-bottom-left-radius: 2px;
    +  -moz-border-radius-bottomleft: 2px;
    +}
    +
    +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child {
    +  -webkit-border-bottom-right-radius: 2px;
    +          border-bottom-right-radius: 2px;
    +  -moz-border-radius-bottomright: 2px;
    +}
    +
    +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th {
    +  background-color: #f7f7f7;
    +}
    +
    +.table tbody tr:hover td,
    +.table tbody tr:hover th {
    +  background-color: #e8eaeb;
    +}
    +
    +.table .ch {width: 10px;}
    +.noPad .table {border: 1px solid transparent;margin-bottom: -1px; margin-top:-1px;}
    +.box .dataTables_wrapper {margin-left: -1px;}
    +
    +
    +/*Pagination*/
    +.pagination {
    +	height: auto;
    +	margin: 0 0 18px 0;
    +}
    +	.pagination a {
    +		display: inline-block !important;
    +		float: left !important;
    +		padding: 0 14px !important;
    +		line-height: 28px !important;
    +		text-decoration: none !important;
    +		border: 1px solid #c4c4c4 !important;
    +		border-left-width: 1px !important;
    +		background-color: #f3f3f3 !important;
    +		background: rgb(255,255,255) !important;
    +		background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+) !important;
    +		background: -moz-linear-gradient(top,  rgba(255,255,255,1) 1%, rgba(243,243,243,1) 100%) !important;
    +		background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgba(255,255,255,1)), color-stop(100%,rgba(243,243,243,1))) !important;
    +		background: -webkit-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%) !important;
    +		background: -o-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%) !important;
    +		background: -ms-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%) !important;
    +		background: linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%) !important;
    +		filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f3f3f3',GradientType=0 ) !important;
    +		min-height: 28px !important;
    +		color: #717171 !important;
    +		box-shadow:0 1px 0 #eaeaea ,0 1px 0 #fff inset !important;
    +		margin-right: 4px !important;
    +		-webkit-border-radius: 2px 2px 2px 2px !important;
    +		-moz-border-radius: 2px 2px 2px 2px !important;
    +		border-radius: 2px 2px 2px 2px !important;
    +		font-weight: 700 !important;
    +		margin-bottom: 10px !important;
    +	}
    +
    +	.pagination li:first-child a {
    +		border-left-width: 1px;
    +		-webkit-border-radius: 2px 2px 2px 2px;
    +		-moz-border-radius: 2px 2px 2px 2px;
    +		border-radius: 2px 2px 2px 2px;
    +	}
    +	.pagination li:last-child a {
    +		-webkit-border-radius: 2px 2px 2px 2px;
    +		-moz-border-radius: 2px 2px 2px 2px;
    +		border-radius: 2px 2px 2px 2px;
    +	}
    +	.pagination a span {
    +		margin:0;
    +		color: #717171;
    +		padding:0;
    +		line-height: 28px;
    +		background: transparent;
    +		border: none;
    +	}
    +
    +	.pagination li>span {
    +		margin: 0px 8px 0 7px !important; 
    +		padding:0 5px 0 5px !important;
    +		float:left !important;
    +		display: inline-block !important;
    +		border:none !important;
    +		background: transparent !important;
    +		line-height: 30px !important;
    +
    +	}
    +
    +	.pagination .active a, .pagination .active a:hover {
    +		color: #f2f2f2 !important;
    +		box-shadow:0 1px 0 #eaeaea ,0 1px 0 #67c3da inset !important;
    +		border-color: #5098aa !important;
    +		background: #88BBC8 !important;
    +		filter: progid:DXImageTransform.Microsoft.gradient(enabled='false') !important;
    +	}
    +
    +	.pagination a:hover {
    +		border: 1px solid #a3a3a3 !important;
    +		background: #e8e6e6 !important;
    +	}
    +
    +.pager a {
    +	display: inline-block;
    +	padding: 5px 14px;
    +	border: 1px solid #c4c4c4;
    +	-webkit-border-radius: 2px;
    +	-moz-border-radius: 2px;
    +	border-radius: 2px;
    +	background: rgb(255,255,255);
    +	background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
    +	background: -moz-linear-gradient(top,  rgba(255,255,255,1) 1%, rgba(243,243,243,1) 100%);
    +	background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgba(255,255,255,1)), color-stop(100%,rgba(243,243,243,1)));
    +	background: -webkit-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +	background: -o-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +	background: -ms-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +	background: linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f3f3f3',GradientType=0 );
    +	color: #717171;
    +	box-shadow:0 1px 0 #eaeaea ,0 1px 0 #fff inset;
    +	margin-right: 4px;
    +}
    +.pager a:hover {
    +	border: 1px solid #a3a3a3;
    +	background: #e8e6e6;
    +}
    +
    +
    +
    +
    +
    +#wrapper {
    +	height: auto;
    +	min-height: 100%;
    +	position: relative;
    +}
    +
    +/*Content for left sidebar only*/
    +#content {
    +	padding: 67px 25px 25px 25px;
    +	margin-left: 213px;
    +	padding-top: 67px;
    +	min-height: 100%;
    +	background: url(../images/patterns/5.png) repeat;
    +}
    +
    +/*Content for right sidebar only*/
    +#content-one {
    +	padding: 67px 25px 25px 25px;
    +	margin-right: 212px;
    +	padding-top: 67px;
    +	min-height: 100%;
    +	background: url(../images/patterns/5.png) repeat;
    +}
    +
    +/*Content for two sidebars*/
    +#content-two {
    +	padding: 67px 25px 25px 25px;
    +	margin-left: 213px;
    +	margin-right: 212px;
    +	padding-top: 67px;
    +	min-height: 100%;
    +	background: url(../images/patterns/5.png) repeat;
    +}
    +.contentwrapper {
    +	float: left;
    +	width: 100%;
    +}
    +
    +
    +
    +
    +/*Widget box style*/
    +.box {
    +	width:100%;
    +	min-height:100%;
    +	-moz-box-shadow:0 1px 0px rgba(255, 255, 255, 1);
    +	-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	margin-bottom: 25px;
    +}
    +.box.hover {
    +	-moz-box-shadow:0px 0px 3px rgba(0, 0, 0, 0.2);
    +	-webkit-box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.2);
    +	box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.2);
    +	-webkit-transition: all 1s ease;
    +	-moz-transition: all 1s ease;
    +	-ms-transition: all 1s ease;
    +	-o-transition: all 1s ease;
    +	transition: all 1s ease;
    +}
    +.box.plain.hover {box-shadow: none;}
    +	.box .title {
    +		height:auto;
    +		background: url(../images/patterns/2.png) repeat;
    +		position: relative;
    +		border:1px solid #c4c4c4;
    +		border-top-left-radius: 2px;
    +		border-top-right-radius: 2px;
    +		-moz-box-shadow:0 1px 0px rgba(255, 255, 255, 1);
    +		-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +		box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	}
    +	.box.plain .title {
    +		border-top: none;
    +		border-left: none;
    +		border-right: none;
    +		background: none;
    +	}
    +	.box.gradient .title {
    +		background: rgb(255,255,255);
    +		background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
    +		background: -moz-linear-gradient(top,  rgba(255,255,255,1) 1%, rgba(243,243,243,1) 100%);
    +		background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgba(255,255,255,1)), color-stop(100%,rgba(243,243,243,1)));
    +		background: -webkit-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +		background: -o-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +		background: -ms-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +		background: linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +		filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f3f3f3',GradientType=0 );
    +	}
    +	.box .title.min {
    +		border-bottom-left-radius: 2px;
    +		border-bottom-right-radius: 2px;
    +	}
    +		.box .title h4 {
    +			padding-left:15px;
    +			margin-bottom: 0;
    +			padding-top: 9px;
    +			padding-bottom: 9px;
    +		}
    +
    +		h4 .label {float: right; margin-right: 40px;}
    +		h4 .badge {float: right; margin-right: 40px;}
    +
    +		.box .title span[class*=" icon-"], .box .title span[class*=" brocco-icon-"], .box .title span[class*=" cut-icon-"], 
    +		.box .title span[class*=" entypo-icon-"], .box .title span[class*=" icomoon-icon-"], .box .title span[class*=" minia-icon-"], 
    +		.box .title span[class*=" iconic-icon-"], .box .title span[class*=" meteo-icon-"], .box .title span[class*=" silk-icon-"],
    +		.box .title span[class*=" typ-icon-"], .box .title span[class*=" wpzoom-"], .box .title span[class*=" eco-"]
    +		{
    +			margin: 0 10px 0 0px;
    +		}
    +		.box .title .loader {
    +			position: absolute;
    +			right:40px;
    +			top:10px;
    +		}
    +		.box .title>a {
    +			position: absolute;
    +			right:10px;
    +			top:8px;
    +			border: 1px solid #c4c4c4;
    +			border-radius:2px;
    +			-webkit-border-radius:2px;
    +			-moz-border-radius:2px;
    +			text-decoration:none;
    +			color: #3f3f3f;
    +			/*padding: 2px 4px 0px 4px;*/
    +			text-indent: -9999px;
    +			background-color: #f3f3f3;
    +			width:16px;
    +			height:16px;
    +			padding:0px 2px 3px 2px;
    +		}
    +		.box .spark {
    +			margin-right: 40px;
    +			float: right;
    +		}
    +		.box .box-form {
    +			margin-right: 40px;
    +			margin-bottom: 0;
    +			position: relative;
    +		}
    +		.box .box-form input {
    +			width: 100%;
    +			margin-bottom: 0;
    +		}
    +		.box .box-form .dropdown-menu {top:auto; left:auto;}
    +		.box .box-form .btn-mini.dropdown-toggle {margin-top:-1px;}
    +		.box .box-form .btn span {margin-right: 0; margin-top: -8px; display: inline-block;}
    +		.box .box-form .btn-mini span {margin-top: 0;}
    +		.box .box-form .dropdown-toggle {margin-top: -4px; padding-bottom: 0;}
    +		.box .box-form .btn span.caret {margin-left: 2px; margin-top:7px;}
    +		.box .box-form .ibutton-container {	margin-top:-2px;}
    +		.box .title .label span, .box .title .badge span {margin-left:0; margin-right:0}
    +		.box .title .progress {
    +			width:40%;
    +			position: absolute;
    +			right:40px;
    +			top:8px;
    +		}
    +		.box .title .minimize {
    +			cursor:pointer;
    +			background: url(../images/icons/minus.png) no-repeat center 3px #f3f3f3;
    +			display: none;
    +		}
    +		.box .title .maximize {
    +			background: url(../images/icons/plus.png) no-repeat center 3px #f3f3f3;
    +			display: block;
    +		}
    +	.box .content {
    +		padding:10px;
    +		border:1px solid #c4c4c4;
    +		border-bottom-left-radius: 2px;
    +		border-bottom-right-radius: 2px;
    +		border-top: none;
    +		background-color: #fff;
    +		position: relative;
    +	}
    +	.box .content.vertical-scroll {
    +		width: 200px;
    +	}
    +	.box .content.noPad {
    +		padding: 0;
    +	}
    +	.box .content.noPad .nav-tabs {
    +		margin-top: -1px;
    +		margin-left: -1px;
    +		margin-right: -1px;
    +	}
    +	.box .content.noPad .tab-content {
    +		margin-bottom: -1px;
    +		margin-left: -1px;
    +		margin-right: -1px;
    +	}
    +	.box.boxMargin {margin-bottom: 27px;}	
    +
    +
    +
    diff --git a/src/main/webapp/plug-in/datatables/grey/datatables_style.css b/src/main/webapp/plug-in/datatables/grey/datatables_style.css
    new file mode 100644
    index 00000000..507c60a2
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/grey/datatables_style.css
    @@ -0,0 +1,217 @@
    +
    +html,body {
    +	margin: 0;
    +	padding: 0;
    +	margin-top: 3px;
    +}
    +.dataTables_wrapper {
    +	position: relative;
    +	min-height: 100%;
    +	clear: both;
    +	_height: 100%;
    +	zoom: 1; /* Feeling sorry for IE */
    +}
    +/*鍔犺浇淇℃伅鏍峰紡*/
    +.dataTables_processing {
    +	position: absolute;
    +	top: 45%;
    +	left: 50%;
    +	width: 200px;
    +	height: 20px;
    +	margin-left: -125px;
    +	margin-top: -15px;
    +	padding: 14px 0 2px 0;
    +	border: 1px solid #ddd;
    +	text-align: center;
    +	color: #ddd;
    +	font-size: 14px;
    +	background-color: white;
    +}
    +
    +
    +
    +/*鍒楄〃闀垮害鏂囧瓧鎻忚堪瀹藉害*/
    +div.dataTables_length label {
    +	width: 150px;
    +	float: left;
    +	text-align: left;
    +}
    +/*鍒楄〃闀垮害涓嬫媺妗嗗搴*/
    +div.dataTables_length select {
    +	width: 60px;
    +}
    +/*鎼滅储妗嗛暱搴*/
    +div.dataTables_filter label {
    +	float: right;
    +	width:250px;
    +}
    +/*鍒楄〃INFO璁剧疆*/
    +div.dataTables_info {
    +	padding-top:0px;
    +	width: 60%;
    +	float: left;
    +}
    +/*鍒嗛〉鏉℃牱寮*/
    +div.dataTables_paginate {
    +	text-align: right;
    +	float: right;
    +	margin: 0;
    +}
    +/* Pagination nested */
    +.paginate_disabled_previous, .paginate_enabled_previous, .paginate_disabled_next, .paginate_enabled_next {
    +	height: 19px;
    +	width: 19px;
    +	margin-left: 3px;
    +	float: left;
    +}
    +
    +/*琛ㄦ牸杈硅窛*/
    +table {
    +	margin: 2px 0;
    +	clear: both;
    +}
    +
    +table.dataTable th:active {
    +	outline: none;
    +}
    +.uneditable-input:focus {
    +  border-color: rgba(82, 168, 236, 0.8);
    +  outline: 0;
    +  /* IE6-9 鎼滅储妗嗘牱寮 */
    +
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +}
    +h1,h2,h3,h4,h5,h6{margin:0;font-family:'Telex',sans-serif;font-weight:bold;color:#317eac;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}
    +h4{font-size:14px;}h4 small{font-size:12px;}
    +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:12px;color:#555555;background-color:#ffffff;}
    +.table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;}
    +label,input,button,select,textarea{font-size:12px;font-weight:normal;line-height:10px;}
    +table .header {
    +	cursor: pointer;
    +}
    +
    +table .header:after {
    +	content: "";
    +	float: right;
    +	margin-top: 5px;
    +	border-width: 0 4px 4px;
    +	border-style: solid;
    +	border-color: #000 transparent;
    +	visibility: hidden;
    +}
    +table .headerSortUp,table .headerSortDown {
    +	background-color: rgba(141, 192, 219, 0.25);
    +	text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
    +}
    +
    +table .header:hover:after {
    +	visibility: visible;
    +}
    +
    +table .headerSortDown:after,table .headerSortDown:hover:after {
    +	visibility: visible;
    +	filter: alpha(opacity = 60);
    +	-khtml-opacity: 0.6;
    +	-moz-opacity: 0.6;
    +	opacity: 0.6;
    +}
    +
    +table .headerSortUp:after {
    +	border-bottom: none;
    +	border-left: 4px solid transparent;
    +	border-right: 4px solid transparent;
    +	border-top: 4px solid #000;
    +	visibility: visible;
    +	-webkit-box-shadow: none;
    +	-moz-box-shadow: none;
    +	box-shadow: none;
    +	filter: alpha(opacity = 60);
    +	-khtml-opacity: 0.6;
    +	-moz-opacity: 0.6;
    +	opacity: 0.6;
    +}
    +
    +table .blue {
    +	color: #049cdb;
    +	border-bottom-color: #049cdb;
    +}
    +
    +table .headerSortUp.blue,table .headerSortDown.blue {
    +	background-color: #ade6fe;
    +}
    +
    +table .green {
    +	color: #46a546;
    +	border-bottom-color: #46a546;
    +}
    +
    +table .headerSortUp.green,table .headerSortDown.green {
    +	background-color: #cdeacd;
    +}
    +
    +table .red {
    +	color: #9d261d;
    +	border-bottom-color: #9d261d;
    +}
    +
    +table .headerSortUp.red,table .headerSortDown.red {
    +	background-color: #f4c8c5;
    +}
    +
    +table .yellow {
    +	color: #ffc40d;
    +	border-bottom-color: #ffc40d;
    +}
    +
    +table .headerSortUp.yellow,table .headerSortDown.yellow {
    +	background-color: #fff6d9;
    +}
    +
    +table .orange {
    +	color: #f89406;
    +	border-bottom-color: #f89406;
    +}
    +
    +table .headerSortUp.orange,table .headerSortDown.orange {
    +	background-color: #fee9cc;
    +}
    +
    +table .purple {
    +	color: #7a43b6;
    +	border-bottom-color: #7a43b6;
    +}
    +
    +table .headerSortUp.purple,table .headerSortDown.purple {
    +	background-color: #e2d5f0;
    +}
    +/*鍒嗛〉鏉℃牱寮*/
    +.pagination {
    +  height: 20px;
    +  margin: 5px 0;
    +}
    +.pagination ul > li > a,
    +.pagination ul > li > span {
    +  float: left;
    +  padding: 0 10px;
    +  line-height: 25px;
    +  text-decoration: none;
    +  background-color: #ffffff;
    +  border: 1px solid #dddddd;
    +  border-left-width: 0;
    +}
    +/*鍒楄〃鏍峰紡*/
    +.table {
    +  width: 100%;
    +  margin-bottom: 5px;
    +}
    +.table th,
    +.table td {
    +  padding: 6px;
    +  line-height: 17px;
    +  text-align: left;
    +  vertical-align: top;
    +  border-top: 1px solid #dddddd;
    +}
    +
    diff --git a/src/main/webapp/plug-in/datatables/grey/datatables_style.js b/src/main/webapp/plug-in/datatables/grey/datatables_style.js
    new file mode 100644
    index 00000000..6e0fe239
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/grey/datatables_style.js
    @@ -0,0 +1,125 @@
    +/* Default class modification */
    +$.extend($.fn.dataTableExt.oStdClasses, {
    +	"sSortAsc" : "header headerSortDown",
    +	"sSortDesc" : "header headerSortUp",
    +	"sSortable" : "header"
    +});
    +
    +/* API method to get paging information */
    +$.fn.dataTableExt.oApi.fnPagingInfo = function(oSettings) {
    +	return {
    +		"iStart" : oSettings._iDisplayStart,
    +		"iEnd" : oSettings.fnDisplayEnd(),
    +		"iLength" : oSettings._iDisplayLength,
    +		"iTotal" : oSettings.fnRecordsTotal(),
    +		"iFilteredTotal" : oSettings.fnRecordsDisplay(),
    +		"iPage" : Math.ceil(oSettings._iDisplayStart
    +				/ oSettings._iDisplayLength),
    +		"iTotalPages" : Math.ceil(oSettings.fnRecordsDisplay()
    +				/ oSettings._iDisplayLength)
    +	};
    +};
    +
    +/* Bootstrap style pagination control */
    +$.extend(
    +				$.fn.dataTableExt.oPagination,
    +				{
    +					"bootstrap" : {
    +						"fnInit" : function(oSettings, nPaging, fnDraw) {
    +							var oLang = oSettings.oLanguage.oPaginate;
    +							var fnClickHandler = function(e) {
    +								e.preventDefault();
    +								if (oSettings.oApi._fnPageChange(oSettings,
    +										e.data.action)) {
    +									fnDraw(oSettings);
    +								}
    +							};
    +
    +							$(nPaging)
    +									.addClass('pagination')
    +									.append(
    +											'<ul>'
    +													+ '<li class="prev disabled"><a href="#">&larr; '
    +													+ oLang.sPrevious
    +													+ '</a></li>'
    +													+ '<li class="next disabled"><a href="#">'
    +													+ oLang.sNext
    +													+ ' &rarr; </a></li>'
    +													+ '</ul>');
    +							var els = $('a', nPaging);
    +							$(els[0]).bind('click.DT', {
    +								action : "previous"
    +							}, fnClickHandler);
    +							$(els[1]).bind('click.DT', {
    +								action : "next"
    +							}, fnClickHandler);
    +						},
    +
    +						"fnUpdate" : function(oSettings, fnDraw) {
    +							var iListLength = 5;
    +							var oPaging = oSettings.oInstance.fnPagingInfo();
    +							var an = oSettings.aanFeatures.p;
    +							var i, j, sClass, iStart, iEnd, iHalf = Math
    +									.floor(iListLength / 2);
    +
    +							if (oPaging.iTotalPages < iListLength) {
    +								iStart = 1;
    +								iEnd = oPaging.iTotalPages;
    +							} else if (oPaging.iPage <= iHalf) {
    +								iStart = 1;
    +								iEnd = iListLength;
    +							} else if (oPaging.iPage >= (oPaging.iTotalPages - iHalf)) {
    +								iStart = oPaging.iTotalPages - iListLength + 1;
    +								iEnd = oPaging.iTotalPages;
    +							} else {
    +								iStart = oPaging.iPage - iHalf + 1;
    +								iEnd = iStart + iListLength - 1;
    +							}
    +
    +							for (i = 0, iLen = an.length; i < iLen; i++) {
    +								// Remove the middle elements
    +								$('li:gt(0)', an[i]).filter(':not(:last)')
    +										.remove();
    +
    +								// Add the new list items and their event
    +								// handlers
    +								for (j = iStart; j <= iEnd; j++) {
    +									sClass = (j == oPaging.iPage + 1) ? 'class="active"'
    +											: '';
    +									$(
    +											'<li ' + sClass + '><a href="#">'
    +													+ j + '</a></li>')
    +											.insertBefore(
    +													$('li:last', an[i])[0])
    +											.bind(
    +													'click',
    +													function(e) {
    +														e.preventDefault();
    +														oSettings._iDisplayStart = (parseInt(
    +																$('a', this)
    +																		.text(),
    +																10) - 1)
    +																* oPaging.iLength;
    +														fnDraw(oSettings);
    +													});
    +								}
    +
    +								// Add / remove disabled classes from the static
    +								// elements
    +								if (oPaging.iPage === 0) {
    +									$('li:first', an[i]).addClass('disabled');
    +								} else {
    +									$('li:first', an[i])
    +											.removeClass('disabled');
    +								}
    +
    +								if (oPaging.iPage === oPaging.iTotalPages - 1
    +										|| oPaging.iTotalPages === 0) {
    +									$('li:last', an[i]).addClass('disabled');
    +								} else {
    +									$('li:last', an[i]).removeClass('disabled');
    +								}
    +							}
    +						}
    +					}
    +				});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/grey/datatables_top.css b/src/main/webapp/plug-in/datatables/grey/datatables_top.css
    new file mode 100644
    index 00000000..e29cb2e5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/grey/datatables_top.css
    @@ -0,0 +1,490 @@
    +.req {
    +    color: red !important;
    +    font-weight: bold;
    +}
    +body {
    +    padding-top:60px;
    +    padding-bottom: 40px;
    +    background-image: url("../images/bg/furley_bg.png");
    +    background-repeat: repeat;
    +}
    +.well {
    +    background-color: #ffffff;
    +}
    +.main-nav-wrapper {
    +    position: relative;
    +    top:-90px;
    +}
    +.main-nav-wrapper {
    +    margin-left: -20px;
    +    margin-right: -20px;
    +}
    +.page-header {
    +    padding-bottom: 0;
    +}
    +.page-header h1 {
    +    border-bottom: 1px solid #e9e9e9;
    +    font-family: Tahoma;
    +    font-size: 45px;
    +    height: 55px;
    +}
    +.main-nav li.active a {
    +    background-image:none;
    +    background-position: center bottom;
    +    background-repeat: no-repeat;
    +    background-color: transparent;
    +}
    +
    +.main-nav li.active.main-nav-arrow a {
    +    background-position: center bottom;
    +    background-repeat: no-repeat;
    +    background-image:url("../images/top-arrow.png");
    +}
    +
    +.main-nav li.main-nav-arrow a {
    +    background-position: center bottom;
    +    background-repeat: no-repeat;
    +    background-image:url("../images/top-arrow.png");
    +}
    +.main-nav {
    +    margin-bottom: 0px;
    +}
    +
    +.navbar .nav {
    +    float: none;
    +}
    +
    +
    +
    +div.logo {
    +    font-family: tahoma;
    +    background-repeat: no-repeat;
    +    height: 62px;
    +    width: 99%;
    +    margin: 5px;
    +    position: absolute;
    +    top:0px;
    +}
    +
    +div.logo h1 {
    +    margin-top:10px;
    +    font-size: 45px;
    +    font-family: tahoma;
    +    background-image: url(../images/glyphicons/glyphicons_023_cogwheels.png);
    +    background-repeat: no-repeat;
    +    background-position: left center;
    +    padding-left: 30px;
    +}
    +
    +.main-nav.navbar .nav > li > a {
    +    margin-top: 0px ;
    +    text-align:center;
    +    height: 52px;
    +
    +}
    +.main-nav.navbar .nav > li {
    +    display: inline-block;
    +    float: left;
    +    width: 16.5%;
    +    border-left: 1px solid #61B0DF;
    +}
    +.main-nav.navbar .nav > li:first-child {
    +    border-left:none;
    +}
    +
    +
    +.main-nav .navbar-inner {-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;
    +    -webkit-border-radius: 0px;
    +    -moz-border-radius: 0px;
    +    border-radius: 0px;
    +}
    +
    +.main-nav .main-nav-icon-big {
    +    text-align: center;
    +    padding: 5px;
    +}
    +
    +.user-option {
    +    margin-top: 10px;
    +    margin-right: 10px;
    +}
    +
    +
    +/* Dashboard */
    +.dashboard-chart {
    +    width: 90%;
    +    height: 300px;
    +}
    +.dashboard-member-activity p {
    +    margin:0;
    +}
    +img.dashboard-member-activity-avatar {
    +    border: 1px solid #CCCCCC;
    +    border-radius: 3px 3px 3px 3px;
    +}
    +ul.dashboard-member-activity {
    +    margin: 10px 0;
    +}
    +ul.dashboard-member-activity li {
    +    list-style: none;
    +    padding-bottom:10px;
    +    padding-top:10px;
    +}
    +ul.dashboard-member-activity li:first-child {
    +    border-top: none;
    +    padding-top:0;
    +}
    +ul.dashboard-member-activity li:last-child {
    +    border-bottom: none;
    +    padding-bottom:0;
    +}
    +ul.dashboard-statistics li a {
    +
    +    display: block;
    +    line-height: 10px;
    +    text-decoration: none;
    +}
    +ul.dashboard-member-activity li a {
    +
    +    display: inline;
    +    text-decoration: none;
    +}
    +ul.dashboard-member-activity li a:hover {
    +
    +}
    +
    +img.dashboard-member-activity-avatar {
    +    height:50px;
    +    width:50px;
    +    padding:1px;
    +    float:left;
    +    margin-left:15px;
    +    margin-right:15px;
    +}
    +
    +ul.dashboard-member-activity  .post-toolbar {
    +    cursor:pointer;
    +    text-align: left;
    +    padding-left: 85px;
    +}
    +tr .post-toolbar {
    +    visibility:hidden;
    +}
    +
    +tr:hover .post-toolbar {
    +    visibility: visible;
    +}
    +
    +ul.dashboard-member-activity li {
    +    border-bottom: 1px solid #EBEBEB;
    +    border-top: 1px solid #FFFFFF;
    +}
    +ul.news-item {
    +    list-style: none;
    +    padding-bottom:10px;
    +    padding-top:10px;
    +    margin-left: 0px;
    +}
    +.news-item li {
    +    border-bottom: 1px solid #EBEBEB;
    +    border-top: 1px solid #FFFFFF;
    +}
    +
    +
    +.news-item li:first-child {
    +    border-top: none;
    +    padding-top:0;
    +}
    +.news-item li:last-child {
    +    border-bottom: none;
    +    padding-bottom:0;
    +}
    +
    +.news-date {
    +    float: left;
    +    font-size: 140%;
    +    font-weight: bold;
    +    width: 50px;
    +
    +    margin: 5px;
    +
    +
    +
    +}
    +.news-date span {
    +    display: block;
    +    padding: 3px;
    +    text-align: center;
    +}
    +/* Subnav */
    +.subnav {
    +    width: 100%;
    +    height: 36px;
    +    background-color: #ffffff; /* Old browsers */
    +    /*background-repeat: repeat-x; *//* Repeat the gradient *//*
    +    background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); *//* FF3.6+ *//*
    +    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#eeeeee)); *//* Chrome,Safari4+ *//*
    +    background-image: -webkit-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); *//* Chrome 10+,Safari 5.1+ *//*
    +    background-image: -ms-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); *//* IE10+ *//*
    +    background-image: -o-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); *//* Opera 11.10+ *//*
    +    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); *//* IE6-9 *//*
    +    background-image: linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); *//* W3C */
    +    border-bottom: 1px solid #e5e5e5;
    +    -webkit-border-radius: 0px;
    +    -moz-border-radius: 0px;
    +    border-radius: 0px;
    +    margin-top: 0px;
    +}
    +.subnav .nav {
    +    margin-bottom: 0;
    +}
    +.subnav .nav > li > a {
    +    margin: 0;
    +    padding-top:    11px;
    +    padding-bottom: 10px;
    +    border-left: 1px solid #f5f5f5;
    +    border-right: 1px solid #e5e5e5;
    +    -webkit-border-radius: 0;
    +    -moz-border-radius: 0;
    +    border-radius: 0;
    +}
    +.subnav .nav > .active > a,
    +.subnav .nav > .active > a:hover {
    +    padding-left: 13px;
    +    color: #2071A1;
    +    background-color: inherit;
    +    border-right-color: #ddd;
    +    border-left: 0;  /*
    +    -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.05);
    +    -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.05);
    +    box-shadow: inset 0 3px 5px rgba(0,0,0,.05); */
    +    font-weight: bold;
    +}
    +.subnav .nav > .active > a .caret,
    +.subnav .nav > .active > a:hover .caret {
    +    /* border-top-color: #777;*/
    +}
    +.subnav .nav > li:first-child > a,
    +.subnav .nav > li:first-child > a:hover {
    +    border-left: 0;
    +    padding-left: 12px;
    +    -webkit-border-radius: 4px 0 0 4px;
    +    -moz-border-radius: 4px 0 0 4px;
    +    border-radius: 4px 0 0 4px;
    +}
    +.subnav .nav > li:last-child > a {
    +    border-right: 0;
    +}
    +.subnav .dropdown-menu {
    +    -webkit-border-radius: 0 0 4px 4px;
    +    -moz-border-radius: 0 0 4px 4px;
    +    border-radius: 0 0 4px 4px;
    +}
    +
    +/* Portlets */
    +.box {
    +    margin-bottom:5px;
    +}
    +.box h4.box-header {
    +    size:10px;
    +    padding: 5px 5px;
    +    margin: 0;
    +    list-style: none;
    +    cursor:move;
    +}
    +
    +
    +.box-content {
    +    padding:3px;
    +    padding-bottom: 30px;
    +    background-color: #ffffff;
    +}
    +.box-container-toggle {
    +    background-color: #ffffff;
    +}
    +
    +.box-content.form-box {
    +    padding-top: 5px;
    +    padding-bottom: 5px;
    +    padding: 0px;
    +    text-indent: 10px;
    +}
    +
    +.box-content.form-box .form-box-wrapper {
    +    text-indent: 0;
    +    margin-left: 10px;
    +    padding-top:10px;
    +}
    +
    +.box-content.form-box .table {
    +    margin-bottom: 0px;
    +}
    +
    +.box-content.form-box .fileupload-buttonbar {
    +    padding-left:10px;
    +}
    +.box-content.form-box form, .box-content.form-box .form-actions {
    +    margin: 0;
    +}
    +
    +.box-btn {
    +    float:right;
    +    margin-left:2px;
    +    margin-right:2px;
    +    height: 14px;
    +    width: 14px;
    +    text-decoration:none;
    +    display: block;
    +    float: right;
    +    overflow: hidden;
    +    background-position:center;
    +    cursor:pointer;
    +}
    +
    +.box-btn [class^="icon-"], .box-btn [class*=" icon-"] {
    +    vertical-align:top;
    +}
    +
    +.box-container-closed {
    +    display:none;
    +}
    +/* Portlets */
    +.box h4.box-header {
    +    background-color: #e9e9e9; /* Old browsers */
    +    border: 1px solid #e5e5e5;
    +    -webkit-box-shadow: inset 0 1px 0 #ffffff;
    +    -moz-box-shadow: inset 0 1px 0 #ffffff;
    +    box-shadow: inset 0 1px 0 #ffffff;
    +}
    +
    +.box .box-container-toggle {
    +    border-left:1px solid #DDD;
    +    border-right:1px solid #DDD;
    +    border-bottom:1px solid #DDD;
    +
    +    -webkit-border-radius: 3px;
    +    -moz-border-radius: 3px;
    +    border-radius: 3px;
    +    -webkit-border-top-left-radius: 0px;
    +    -webkit-border-top-right-radius: 0px;
    +    -moz-border-top-left-radius: 0px;
    +    -moz-border-top-right-radius: 0px;
    +    border-top-left-radius: 0px;
    +    border-top-right-radius: 0px
    +}
    +
    +.box-btn, .box [class^="icon-"], .box [class*=" icon-"]  {
    +    margin-top: 2px;
    +}
    +
    +/* Round Corners and text effects
    +----------------------------------------------------------------------------------------------------*/
    +
    +.round-all {
    +    -webkit-border-radius: 3px;
    +    -moz-border-radius: 3px;
    +    border-radius: 3px;
    +}
    +.round-top {
    +    -webkit-border-top-left-radius: 3px;
    +    -webkit-border-top-right-radius: 3px;
    +    -moz-border-radius-topleft: 3px;
    +    -moz-border-radius-topright: 3px;
    +    border-radius: 3px 3px 0 0;
    +}
    +.round-bottom {
    +    -webkit-border-bottom-right-radius: 3px;
    +    -webkit-border-bottom-left-radius: 3px;
    +    -moz-border-radius-bottomright: 3px;
    +    -moz-border-radius-bottomleft: 3px;
    +    border-radius: 0 0 3px 3px;
    +}
    +.round-left {
    +    -webkit-border-top-left-radius: 3px;
    +    -webkit-border-bottom-left-radius: 3px;
    +    -moz-border-radius-topleft: 3px;
    +    -moz-border-radius-bottomleft: 3px;
    +    border-radius: 3px 0 0 3px;
    +}
    +.round-right {
    +    -webkit-border-top-right-radius: 3px;
    +    -webkit-border-bottom-right-radius: 3px;
    +    -moz-border-radius-topright: 3px;
    +    -moz-border-radius-bottomright: 3px;
    +    border-radius:0 3px 3px 0;
    +}
    +
    +
    +/* Show Grid */
    +.show-grid {
    +    margin-bottom: 10px;
    +    margin-top: 10px;
    +}
    +.show-grid [class*="span"] {
    +
    +    line-height: 30px;
    +    min-height: 30px;
    +    text-align: center;
    +}
    +.show-grid .show-grid {
    +    margin-bottom: 0;
    +    margin-top: 0;
    +}
    +
    +.show-grid [class*="span"] {
    +    background: none repeat scroll 0 0 #ffffff;
    +    border-radius: 3px 3px 3px 3px;
    +}
    +
    +.show-grid:hover [class*="span"] {
    +    background: none repeat scroll 0 0 #DDDDDD;
    +}
    +
    +.show-grid .show-grid [class*="span"] {
    +    background-color: #CCCCCC;
    +}
    +
    +/* Bootstrap Data Tables Styles */
    +div.dataTables_length label {
    +    float: left;
    +    text-align: left;
    +}
    +
    +div.dataTables_length select {
    +    width: 50px;
    +}
    +
    +div.dataTables_filter label {
    +    float: right;
    +}
    +
    +div.dataTables_info {
    +    padding-top: 0px;
    +}
    +
    +div.dataTables_paginate {
    +	padding-top: 0px;
    +    float: right;
    +    margin: 0;
    +}
    +
    +
    +
    +table.dataTable th:active {
    +    outline: none;
    +}
    +.dataTables_filter input, .dataTables_length select {
    +    display: inline-block;
    +    *display: inline;
    +    margin: 0;
    +    *zoom: 1;
    +}
    +
    +.sort-index, .hidden {
    +    left: -10000px;
    +    position: absolute;
    +    top: -10000px;
    +    visibility: hidden;
    +}
    +
    +
    diff --git a/src/main/webapp/plug-in/datatables/grey/demo.txt b/src/main/webapp/plug-in/datatables/grey/demo.txt
    new file mode 100644
    index 00000000..5d60eb75
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/grey/demo.txt
    @@ -0,0 +1,129 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<!DOCTYPE html>
    +<html>
    +	<head> 
    +		<title>bootstarp娴嬭瘯</title>
    +		<link type="text/css" rel="stylesheet" href="plug-in/bootstrap/css/bootstrap.css"" ></link>
    +		<link type="text/css" rel="stylesheet" href="plug-in/datatables/grey/datatables_top.css"></link>
    +		<link rel="stylesheet" href="plug-in/datatables/grey/datatables_style.css" type="text/css"></link>
    +		<script type="text/javascript" src="plug-in/jquery/jquery-1.8.js"></script>
    +		<script type="text/javascript" src="plug-in/datatables/js/jquery.dataTables.js"></script>
    +		<script type="text/javascript" src="plug-in/datatables/grey/datatables_style.js"></script>
    +		<script type="text/javascript">
    +	    $(document).ready(function() {
    +		var oTable = $('#example').dataTable({
    +			//"sDom" : "<'row'<'span6'l><'span6'f>r>t<'row'<'span6'i><'span6'p>>",
    +			"bProcessing" : true,//褰揹atatable鑾峰彇鏁版嵁鏃跺欐槸鍚︽樉绀烘鍦ㄥ鐞嗘彁绀轰俊鎭
    +			"bPaginate" : true, //鏄惁鍒嗛〉
    +			"sPaginationType" : "bootstrap",//鍒嗛〉鏍峰紡full_numbers,
    +			"bFilter" : true,//鏄惁浣跨敤鍐呯疆鐨勮繃婊ゅ姛鑳
    +			"bSort" : true, //鎺掑簭鍔熻兘
    +			"bAutoWidth" : true,//鑷姩瀹藉害
    +			"bLengthChange" : true,//鏄惁鍏佽鐢ㄦ埛鑷畾涔夋瘡椤垫樉绀烘潯鏁
    +			"bInfo" : true,//椤佃剼淇℃伅
    +			"sAjaxSource" : "userController.do?test",
    +			"bServerSide" : true,//鎸囧畾浠庢湇鍔″櫒绔幏鍙栨暟鎹 	
    +			"oLanguage" : { //姹夊寲  
    +				"sLengthMenu" : " _MENU_ 鏉¤褰",
    +				"sZeroRecords" : "娌℃湁妫绱㈠埌鏁版嵁",
    +				"sInfo" : "绗 _START_ 鑷 _END_ 鏉℃暟鎹 鍏 _TOTAL_ 鏉",
    +				"sInfoEmtpy" : "娌℃湁鏁版嵁",
    +				"sProcessing" : "姝e湪鍔犺浇鏁版嵁...",
    +				"sSearch" : "鎼滅储",
    +				"oPaginate" : {
    +					"sFirst" : "棣栭〉",
    +					"sPrevious" : "鍓嶉〉", 
    +					"sNext" : "鍚庨〉",
    +					"sLast" : "灏鹃〉"
    +				}
    +			},
    +			//鑾峰彇鏁版嵁鐨勫鐞嗗嚱鏁 //"data" : {_dt_json : JSON.stringify(aoData)},
    +			"fnServerData" : function(sSource, aoData, fnCallback, oSettings) {
    +				oSettings.jqXHR = $.ajax({
    +					"dataType" : 'json',
    +					"type" : "POST",
    +					"url" : sSource,
    +					"data" : aoData,
    +					"success" : fnCallback
    +				});
    +			},
    +			//"aaSorting": [[0 , "desc" ],[1 , "asc" ]],
    +			"aoColumnDefs" : [ {
    +				"sClass" : "center",
    +				"aTargets" : [ 0, 1, 2, 3 ]
    +			},
    +			
    +			{
    +				"bSearchable" : false,
    +				"aTargets" : [ 3, 4 ]
    +			}, {
    +				"bVisible" : false,
    +				"aTargets" : [ 0 ]
    +			},
    +			{
    +				"bSortable" : false,
    +				"aTargets" : [ 3, 4 ]
    +			} ],
    +			"aoColumns" : [ {
    +				"sName" : "id",
    +				"sTitle" : "ID",
    +				"mDataProp" : "id",
    +				"mData" : "id"
    +			}, {
    +				"sName" : "userName",
    +				"sTitle" : "鐢ㄦ埛鍚",
    +				"mDataProp" : "userName",
    +				"mData" : "userName",
    +				"sWidth":"20%"
    +			}, {
    +				"sName" : "mobilePhone",
    +				"sTitle" : "鎵嬫満",
    +				"mDataProp" : "mobilePhone",
    +				"mData" : "mobilePhone",
    +				"bSortable" : false,
    +				"bSearchable" : false,
    +				"sWidth":"20%"
    +			}, {
    +				"sName" : "TSDepart_departname",
    +				"sTitle" : "閮ㄩ棬",
    +				"mDataProp" : "TSDepart_departname",
    +				"mData" : "TSDepart_departname",
    +				"sWidth":"20%"
    +			}, {
    +				"sTitle" : "鎿嶄綔",
    +				"mData" : "id",
    +				"sWidth":"30%",
    +				"mRender" : function(data, type, row) {
    +					return row.id;
    +				}
    +			} ]
    +		});
    +	});
    +</script>
    +  	</head>
    +	<body>
    +		
    +			<div class="row-fluid">
    +				<div class="span12">
    +					<div class="box">
    +						<h4 class="box-header round-top">
    +							<i class="icon-list"></i> 鐢ㄦ埛绠$悊
    +							<small class="hidden-phone">鐢ㄦ埛鍒楄〃</small>
    +							<a class="box-btn" title="鍏抽棴"><i class="icon-remove" ></i> </a>
    +							<a class="box-btn" title="鏀剁缉"><i class="icon-minus"></i> </a>
    +							<a class="box-btn" title="璁剧疆" data-toggle="modal"><i class="icon-cog"></i> </a>
    +						</h4>
    +						<div class="box-container-toggle" id="dd">
    +							<div class="box-content">
    +								<table width="100%" cellpadding="0" cellspacing="0" border="0" class="table table-striped table-bordered bootstrap-datatable" id="example">
    +								</table>
    +							</div>
    +						</div>
    +					</div>
    +				</div>
    +				<!--/span-->
    +			</div>
    +			<!--/row-->
    +		
    +	</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/images/back_disabled.png b/src/main/webapp/plug-in/datatables/images/back_disabled.png
    new file mode 100644
    index 00000000..881de797
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/images/back_disabled.png differ
    diff --git a/src/main/webapp/plug-in/datatables/images/back_enabled.png b/src/main/webapp/plug-in/datatables/images/back_enabled.png
    new file mode 100644
    index 00000000..c608682b
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/images/back_enabled.png differ
    diff --git a/src/main/webapp/plug-in/datatables/images/back_enabled_hover.png b/src/main/webapp/plug-in/datatables/images/back_enabled_hover.png
    new file mode 100644
    index 00000000..d300f106
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/images/back_enabled_hover.png differ
    diff --git a/src/main/webapp/plug-in/datatables/images/forward_disabled.png b/src/main/webapp/plug-in/datatables/images/forward_disabled.png
    new file mode 100644
    index 00000000..6a6ded7d
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/images/forward_disabled.png differ
    diff --git a/src/main/webapp/plug-in/datatables/images/forward_enabled.png b/src/main/webapp/plug-in/datatables/images/forward_enabled.png
    new file mode 100644
    index 00000000..a4e6b538
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/images/forward_enabled.png differ
    diff --git a/src/main/webapp/plug-in/datatables/images/forward_enabled_hover.png b/src/main/webapp/plug-in/datatables/images/forward_enabled_hover.png
    new file mode 100644
    index 00000000..fc46c5eb
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/images/forward_enabled_hover.png differ
    diff --git a/src/main/webapp/plug-in/datatables/images/sort_asc.png b/src/main/webapp/plug-in/datatables/images/sort_asc.png
    new file mode 100644
    index 00000000..aeb59322
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/images/sort_asc.png differ
    diff --git a/src/main/webapp/plug-in/datatables/images/sort_asc_disabled.png b/src/main/webapp/plug-in/datatables/images/sort_asc_disabled.png
    new file mode 100644
    index 00000000..79b8ba55
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/images/sort_asc_disabled.png differ
    diff --git a/src/main/webapp/plug-in/datatables/images/sort_both.png b/src/main/webapp/plug-in/datatables/images/sort_both.png
    new file mode 100644
    index 00000000..47c4417f
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/images/sort_both.png differ
    diff --git a/src/main/webapp/plug-in/datatables/images/sort_desc.png b/src/main/webapp/plug-in/datatables/images/sort_desc.png
    new file mode 100644
    index 00000000..d641677b
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/images/sort_desc.png differ
    diff --git a/src/main/webapp/plug-in/datatables/images/sort_desc_disabled.png b/src/main/webapp/plug-in/datatables/images/sort_desc_disabled.png
    new file mode 100644
    index 00000000..979f04be
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/images/sort_desc_disabled.png differ
    diff --git a/src/main/webapp/plug-in/datatables/js/jquery.dataTables.js b/src/main/webapp/plug-in/datatables/js/jquery.dataTables.js
    new file mode 100644
    index 00000000..1d8a220b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/js/jquery.dataTables.js
    @@ -0,0 +1,12099 @@
    +/**
    + * @summary     DataTables
    + * @description Paginate, search and sort HTML tables
    + * @version     1.9.4
    + * @file        jquery.dataTables.js
    + * @author      Allan Jardine (www.sprymedia.co.uk)
    + * @contact     www.sprymedia.co.uk/contact
    + *
    + * @copyright Copyright 2008-2012 Allan Jardine, all rights reserved.
    + *
    + * This source file is free software, under either the GPL v2 license or a
    + * BSD style license, available at:
    + *   http://datatables.net/license_gpl2
    + *   http://datatables.net/license_bsd
    + * 
    + * This source file is distributed in the hope that it will be useful, but 
    + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
    + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
    + * 
    + * For details please refer to: http://www.datatables.net
    + */
    +
    +/*jslint evil: true, undef: true, browser: true */
    +/*globals $, jQuery,define,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex,_fnInfoMacros,_fnBrowserDetect,_fnGetColumns*/
    +
    +(/** @lends <global> */function( window, document, undefined ) {
    +
    +(function( factory ) {
    +	"use strict";
    +
    +	// Define as an AMD module if possible
    +	if ( typeof define === 'function' && define.amd )
    +	{
    +		define( ['jquery'], factory );
    +	}
    +	/* Define using browser globals otherwise
    +	 * Prevent multiple instantiations if the script is loaded twice
    +	 */
    +	else if ( jQuery && !jQuery.fn.dataTable )
    +	{
    +		factory( jQuery );
    +	}
    +}
    +(/** @lends <global> */function( $ ) {
    +	"use strict";
    +	/** 
    +	 * DataTables is a plug-in for the jQuery Javascript library. It is a 
    +	 * highly flexible tool, based upon the foundations of progressive 
    +	 * enhancement, which will add advanced interaction controls to any 
    +	 * HTML table. For a full list of features please refer to
    +	 * <a href="http://datatables.net">DataTables.net</a>.
    +	 *
    +	 * Note that the <i>DataTable</i> object is not a global variable but is
    +	 * aliased to <i>jQuery.fn.DataTable</i> and <i>jQuery.fn.dataTable</i> through which 
    +	 * it may be  accessed.
    +	 *
    +	 *  @class
    +	 *  @param {object} [oInit={}] Configuration object for DataTables. Options
    +	 *    are defined by {@link DataTable.defaults}
    +	 *  @requires jQuery 1.3+
    +	 * 
    +	 *  @example
    +	 *    // Basic initialisation
    +	 *    $(document).ready( function {
    +	 *      $('#example').dataTable();
    +	 *    } );
    +	 *  
    +	 *  @example
    +	 *    // Initialisation with configuration options - in this case, disable
    +	 *    // pagination and sorting.
    +	 *    $(document).ready( function {
    +	 *      $('#example').dataTable( {
    +	 *        "bPaginate": false,
    +	 *        "bSort": false 
    +	 *      } );
    +	 *    } );
    +	 */
    +	var DataTable = function( oInit )
    +	{
    +		
    +		
    +		/**
    +		 * Add a column to the list used for the table with default values
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {node} nTh The th element for this column
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnAddColumn( oSettings, nTh )
    +		{
    +			var oDefaults = DataTable.defaults.columns;
    +			var iCol = oSettings.aoColumns.length;
    +			var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
    +				"sSortingClass": oSettings.oClasses.sSortable,
    +				"sSortingClassJUI": oSettings.oClasses.sSortJUI,
    +				"nTh": nTh ? nTh : document.createElement('th'),
    +				"sTitle":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',
    +				"aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
    +				"mData": oDefaults.mData ? oDefaults.oDefaults : iCol
    +			} );
    +			oSettings.aoColumns.push( oCol );
    +			
    +			/* Add a column specific filter */
    +			if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null )
    +			{
    +				oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch );
    +			}
    +			else
    +			{
    +				var oPre = oSettings.aoPreSearchCols[ iCol ];
    +				
    +				/* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */
    +				if ( oPre.bRegex === undefined )
    +				{
    +					oPre.bRegex = true;
    +				}
    +				
    +				if ( oPre.bSmart === undefined )
    +				{
    +					oPre.bSmart = true;
    +				}
    +				
    +				if ( oPre.bCaseInsensitive === undefined )
    +				{
    +					oPre.bCaseInsensitive = true;
    +				}
    +			}
    +			
    +			/* Use the column options function to initialise classes etc */
    +			_fnColumnOptions( oSettings, iCol, null );
    +		}
    +		
    +		
    +		/**
    +		 * Apply options for a column
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} iCol column index to consider
    +		 *  @param {object} oOptions object with sType, bVisible and bSearchable etc
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnColumnOptions( oSettings, iCol, oOptions )
    +		{
    +			var oCol = oSettings.aoColumns[ iCol ];
    +			
    +			/* User specified column options */
    +			if ( oOptions !== undefined && oOptions !== null )
    +			{
    +				/* Backwards compatibility for mDataProp */
    +				if ( oOptions.mDataProp && !oOptions.mData )
    +				{
    +					oOptions.mData = oOptions.mDataProp;
    +				}
    +		
    +				if ( oOptions.sType !== undefined )
    +				{
    +					oCol.sType = oOptions.sType;
    +					oCol._bAutoType = false;
    +				}
    +				
    +				$.extend( oCol, oOptions );
    +				_fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
    +		
    +				/* iDataSort to be applied (backwards compatibility), but aDataSort will take
    +				 * priority if defined
    +				 */
    +				if ( oOptions.iDataSort !== undefined )
    +				{
    +					oCol.aDataSort = [ oOptions.iDataSort ];
    +				}
    +				_fnMap( oCol, oOptions, "aDataSort" );
    +			}
    +		
    +			/* Cache the data get and set functions for speed */
    +			var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
    +			var mData = _fnGetObjectDataFn( oCol.mData );
    +		
    +			oCol.fnGetData = function (oData, sSpecific) {
    +				var innerData = mData( oData, sSpecific );
    +		
    +				if ( oCol.mRender && (sSpecific && sSpecific !== '') )
    +				{
    +					return mRender( innerData, sSpecific, oData );
    +				}
    +				return innerData;
    +			};
    +			oCol.fnSetData = _fnSetObjectDataFn( oCol.mData );
    +			
    +			/* Feature sorting overrides column specific when off */
    +			if ( !oSettings.oFeatures.bSort )
    +			{
    +				oCol.bSortable = false;
    +			}
    +			
    +			/* Check that the class assignment is correct for sorting */
    +			if ( !oCol.bSortable ||
    +				 ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) )
    +			{
    +				oCol.sSortingClass = oSettings.oClasses.sSortableNone;
    +				oCol.sSortingClassJUI = "";
    +			}
    +			else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1 )
    +			{
    +				oCol.sSortingClass = oSettings.oClasses.sSortable;
    +				oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI;
    +			}
    +			else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 )
    +			{
    +				oCol.sSortingClass = oSettings.oClasses.sSortableAsc;
    +				oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed;
    +			}
    +			else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 )
    +			{
    +				oCol.sSortingClass = oSettings.oClasses.sSortableDesc;
    +				oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed;
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Adjust the table column widths for new data. Note: you would probably want to 
    +		 * do a redraw after calling this function!
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnAdjustColumnSizing ( oSettings )
    +		{
    +			/* Not interested in doing column width calculation if auto-width is disabled */
    +			if ( oSettings.oFeatures.bAutoWidth === false )
    +			{
    +				return false;
    +			}
    +			
    +			_fnCalculateColumnWidths( oSettings );
    +			for ( var i=0 , iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +			{
    +				oSettings.aoColumns[i].nTh.style.width = oSettings.aoColumns[i].sWidth;
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Covert the index of a visible column to the index in the data array (take account
    +		 * of hidden columns)
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} iMatch Visible column index to lookup
    +		 *  @returns {int} i the data index
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnVisibleToColumnIndex( oSettings, iMatch )
    +		{
    +			var aiVis = _fnGetColumns( oSettings, 'bVisible' );
    +		
    +			return typeof aiVis[iMatch] === 'number' ?
    +				aiVis[iMatch] :
    +				null;
    +		}
    +		
    +		
    +		/**
    +		 * Covert the index of an index in the data array and convert it to the visible
    +		 *   column index (take account of hidden columns)
    +		 *  @param {int} iMatch Column index to lookup
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns {int} i the data index
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnColumnIndexToVisible( oSettings, iMatch )
    +		{
    +			var aiVis = _fnGetColumns( oSettings, 'bVisible' );
    +			var iPos = $.inArray( iMatch, aiVis );
    +		
    +			return iPos !== -1 ? iPos : null;
    +		}
    +		
    +		
    +		/**
    +		 * Get the number of visible columns
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns {int} i the number of visible columns
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnVisbleColumns( oSettings )
    +		{
    +			return _fnGetColumns( oSettings, 'bVisible' ).length;
    +		}
    +		
    +		
    +		/**
    +		 * Get an array of column indexes that match a given property
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {string} sParam Parameter in aoColumns to look for - typically 
    +		 *    bVisible or bSearchable
    +		 *  @returns {array} Array of indexes with matched properties
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnGetColumns( oSettings, sParam )
    +		{
    +			var a = [];
    +		
    +			$.map( oSettings.aoColumns, function(val, i) {
    +				if ( val[sParam] ) {
    +					a.push( i );
    +				}
    +			} );
    +		
    +			return a;
    +		}
    +		
    +		
    +		/**
    +		 * Get the sort type based on an input string
    +		 *  @param {string} sData data we wish to know the type of
    +		 *  @returns {string} type (defaults to 'string' if no type can be detected)
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnDetectType( sData )
    +		{
    +			var aTypes = DataTable.ext.aTypes;
    +			var iLen = aTypes.length;
    +			
    +			for ( var i=0 ; i<iLen ; i++ )
    +			{
    +				var sType = aTypes[i]( sData );
    +				if ( sType !== null )
    +				{
    +					return sType;
    +				}
    +			}
    +			
    +			return 'string';
    +		}
    +		
    +		
    +		/**
    +		 * Figure out how to reorder a display list
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns array {int} aiReturn index list for reordering
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnReOrderIndex ( oSettings, sColumns )
    +		{
    +			var aColumns = sColumns.split(',');
    +			var aiReturn = [];
    +			
    +			for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +			{
    +				for ( var j=0 ; j<iLen ; j++ )
    +				{
    +					if ( oSettings.aoColumns[i].sName == aColumns[j] )
    +					{
    +						aiReturn.push( j );
    +						break;
    +					}
    +				}
    +			}
    +			
    +			return aiReturn;
    +		}
    +		
    +		
    +		/**
    +		 * Get the column ordering that DataTables expects
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns {string} comma separated list of names
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnColumnOrdering ( oSettings )
    +		{
    +			var sNames = '';
    +			for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +			{
    +				sNames += oSettings.aoColumns[i].sName+',';
    +			}
    +			if ( sNames.length == iLen )
    +			{
    +				return "";
    +			}
    +			return sNames.slice(0, -1);
    +		}
    +		
    +		
    +		/**
    +		 * Take the column definitions and static columns arrays and calculate how
    +		 * they relate to column indexes. The callback function will then apply the
    +		 * definition found for a column to a suitable configuration object.
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {array} aoColDefs The aoColumnDefs array that is to be applied
    +		 *  @param {array} aoCols The aoColumns array that defines columns individually
    +		 *  @param {function} fn Callback function - takes two parameters, the calculated
    +		 *    column index and the definition for that column.
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
    +		{
    +			var i, iLen, j, jLen, k, kLen;
    +		
    +			// Column definitions with aTargets
    +			if ( aoColDefs )
    +			{
    +				/* Loop over the definitions array - loop in reverse so first instance has priority */
    +				for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
    +				{
    +					/* Each definition can target multiple columns, as it is an array */
    +					var aTargets = aoColDefs[i].aTargets;
    +					if ( !$.isArray( aTargets ) )
    +					{
    +						_fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) );
    +					}
    +		
    +					for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
    +					{
    +						if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
    +						{
    +							/* Add columns that we don't yet know about */
    +							while( oSettings.aoColumns.length <= aTargets[j] )
    +							{
    +								_fnAddColumn( oSettings );
    +							}
    +		
    +							/* Integer, basic index */
    +							fn( aTargets[j], aoColDefs[i] );
    +						}
    +						else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
    +						{
    +							/* Negative integer, right to left column counting */
    +							fn( oSettings.aoColumns.length+aTargets[j], aoColDefs[i] );
    +						}
    +						else if ( typeof aTargets[j] === 'string' )
    +						{
    +							/* Class name matching on TH element */
    +							for ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ )
    +							{
    +								if ( aTargets[j] == "_all" ||
    +								     $(oSettings.aoColumns[k].nTh).hasClass( aTargets[j] ) )
    +								{
    +									fn( k, aoColDefs[i] );
    +								}
    +							}
    +						}
    +					}
    +				}
    +			}
    +		
    +			// Statically defined columns array
    +			if ( aoCols )
    +			{
    +				for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
    +				{
    +					fn( i, aoCols[i] );
    +				}
    +			}
    +		}
    +		
    +		/**
    +		 * Add a data array to the table, creating DOM node etc. This is the parallel to 
    +		 * _fnGatherData, but for adding rows from a Javascript source, rather than a
    +		 * DOM source.
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {array} aData data array to be added
    +		 *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnAddData ( oSettings, aDataSupplied )
    +		{
    +			var oCol;
    +			
    +			/* Take an independent copy of the data source so we can bash it about as we wish */
    +			var aDataIn = ($.isArray(aDataSupplied)) ?
    +				aDataSupplied.slice() :
    +				$.extend( true, {}, aDataSupplied );
    +			
    +			/* Create the object for storing information about this new row */
    +			var iRow = oSettings.aoData.length;
    +			var oData = $.extend( true, {}, DataTable.models.oRow );
    +			oData._aData = aDataIn;
    +			oSettings.aoData.push( oData );
    +		
    +			/* Create the cells */
    +			var nTd, sThisType;
    +			for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +			{
    +				oCol = oSettings.aoColumns[i];
    +		
    +				/* Use rendered data for filtering / sorting */
    +				if ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mData !== null )
    +				{
    +					_fnSetCellData( oSettings, iRow, i, _fnRender(oSettings, iRow, i) );
    +				}
    +				else
    +				{
    +					_fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) );
    +				}
    +				
    +				/* See if we should auto-detect the column type */
    +				if ( oCol._bAutoType && oCol.sType != 'string' )
    +				{
    +					/* Attempt to auto detect the type - same as _fnGatherData() */
    +					var sVarType = _fnGetCellData( oSettings, iRow, i, 'type' );
    +					if ( sVarType !== null && sVarType !== '' )
    +					{
    +						sThisType = _fnDetectType( sVarType );
    +						if ( oCol.sType === null )
    +						{
    +							oCol.sType = sThisType;
    +						}
    +						else if ( oCol.sType != sThisType && oCol.sType != "html" )
    +						{
    +							/* String is always the 'fallback' option */
    +							oCol.sType = 'string';
    +						}
    +					}
    +				}
    +			}
    +			
    +			/* Add to the display array */
    +			oSettings.aiDisplayMaster.push( iRow );
    +		
    +			/* Create the DOM information */
    +			if ( !oSettings.oFeatures.bDeferRender )
    +			{
    +				_fnCreateTr( oSettings, iRow );
    +			}
    +		
    +			return iRow;
    +		}
    +		
    +		
    +		/**
    +		 * Read in the data from the target table from the DOM
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnGatherData( oSettings )
    +		{
    +			var iLoop, i, iLen, j, jLen, jInner,
    +			 	nTds, nTrs, nTd, nTr, aLocalData, iThisIndex,
    +				iRow, iRows, iColumn, iColumns, sNodeName,
    +				oCol, oData;
    +			
    +			/*
    +			 * Process by row first
    +			 * Add the data object for the whole table - storing the tr node. Note - no point in getting
    +			 * DOM based data if we are going to go and replace it with Ajax source data.
    +			 */
    +			if ( oSettings.bDeferLoading || oSettings.sAjaxSource === null )
    +			{
    +				nTr = oSettings.nTBody.firstChild;
    +				while ( nTr )
    +				{
    +					if ( nTr.nodeName.toUpperCase() == "TR" )
    +					{
    +						iThisIndex = oSettings.aoData.length;
    +						nTr._DT_RowIndex = iThisIndex;
    +						oSettings.aoData.push( $.extend( true, {}, DataTable.models.oRow, {
    +							"nTr": nTr
    +						} ) );
    +		
    +						oSettings.aiDisplayMaster.push( iThisIndex );
    +						nTd = nTr.firstChild;
    +						jInner = 0;
    +						while ( nTd )
    +						{
    +							sNodeName = nTd.nodeName.toUpperCase();
    +							if ( sNodeName == "TD" || sNodeName == "TH" )
    +							{
    +								_fnSetCellData( oSettings, iThisIndex, jInner, $.trim(nTd.innerHTML) );
    +								jInner++;
    +							}
    +							nTd = nTd.nextSibling;
    +						}
    +					}
    +					nTr = nTr.nextSibling;
    +				}
    +			}
    +			
    +			/* Gather in the TD elements of the Table - note that this is basically the same as
    +			 * fnGetTdNodes, but that function takes account of hidden columns, which we haven't yet
    +			 * setup!
    +			 */
    +			nTrs = _fnGetTrNodes( oSettings );
    +			nTds = [];
    +			for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
    +			{
    +				nTd = nTrs[i].firstChild;
    +				while ( nTd )
    +				{
    +					sNodeName = nTd.nodeName.toUpperCase();
    +					if ( sNodeName == "TD" || sNodeName == "TH" )
    +					{
    +						nTds.push( nTd );
    +					}
    +					nTd = nTd.nextSibling;
    +				}
    +			}
    +			
    +			/* Now process by column */
    +			for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
    +			{
    +				oCol = oSettings.aoColumns[iColumn];
    +		
    +				/* Get the title of the column - unless there is a user set one */
    +				if ( oCol.sTitle === null )
    +				{
    +					oCol.sTitle = oCol.nTh.innerHTML;
    +				}
    +				
    +				var
    +					bAutoType = oCol._bAutoType,
    +					bRender = typeof oCol.fnRender === 'function',
    +					bClass = oCol.sClass !== null,
    +					bVisible = oCol.bVisible,
    +					nCell, sThisType, sRendered, sValType;
    +				
    +				/* A single loop to rule them all (and be more efficient) */
    +				if ( bAutoType || bRender || bClass || !bVisible )
    +				{
    +					for ( iRow=0, iRows=oSettings.aoData.length ; iRow<iRows ; iRow++ )
    +					{
    +						oData = oSettings.aoData[iRow];
    +						nCell = nTds[ (iRow*iColumns) + iColumn ];
    +						
    +						/* Type detection */
    +						if ( bAutoType && oCol.sType != 'string' )
    +						{
    +							sValType = _fnGetCellData( oSettings, iRow, iColumn, 'type' );
    +							if ( sValType !== '' )
    +							{
    +								sThisType = _fnDetectType( sValType );
    +								if ( oCol.sType === null )
    +								{
    +									oCol.sType = sThisType;
    +								}
    +								else if ( oCol.sType != sThisType && 
    +								          oCol.sType != "html" )
    +								{
    +									/* String is always the 'fallback' option */
    +									oCol.sType = 'string';
    +								}
    +							}
    +						}
    +		
    +						if ( oCol.mRender )
    +						{
    +							// mRender has been defined, so we need to get the value and set it
    +							nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
    +						}
    +						else if ( oCol.mData !== iColumn )
    +						{
    +							// If mData is not the same as the column number, then we need to
    +							// get the dev set value. If it is the column, no point in wasting
    +							// time setting the value that is already there!
    +							nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
    +						}
    +						
    +						/* Rendering */
    +						if ( bRender )
    +						{
    +							sRendered = _fnRender( oSettings, iRow, iColumn );
    +							nCell.innerHTML = sRendered;
    +							if ( oCol.bUseRendered )
    +							{
    +								/* Use the rendered data for filtering / sorting */
    +								_fnSetCellData( oSettings, iRow, iColumn, sRendered );
    +							}
    +						}
    +						
    +						/* Classes */
    +						if ( bClass )
    +						{
    +							nCell.className += ' '+oCol.sClass;
    +						}
    +						
    +						/* Column visibility */
    +						if ( !bVisible )
    +						{
    +							oData._anHidden[iColumn] = nCell;
    +							nCell.parentNode.removeChild( nCell );
    +						}
    +						else
    +						{
    +							oData._anHidden[iColumn] = null;
    +						}
    +		
    +						if ( oCol.fnCreatedCell )
    +						{
    +							oCol.fnCreatedCell.call( oSettings.oInstance,
    +								nCell, _fnGetCellData( oSettings, iRow, iColumn, 'display' ), oData._aData, iRow, iColumn
    +							);
    +						}
    +					}
    +				}
    +			}
    +		
    +			/* Row created callbacks */
    +			if ( oSettings.aoRowCreatedCallback.length !== 0 )
    +			{
    +				for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
    +				{
    +					oData = oSettings.aoData[i];
    +					_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, i] );
    +				}
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Take a TR element and convert it to an index in aoData
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {node} n the TR element to find
    +		 *  @returns {int} index if the node is found, null if not
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnNodeToDataIndex( oSettings, n )
    +		{
    +			return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
    +		}
    +		
    +		
    +		/**
    +		 * Take a TD element and convert it into a column data index (not the visible index)
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} iRow The row number the TD/TH can be found in
    +		 *  @param {node} n The TD/TH element to find
    +		 *  @returns {int} index if the node is found, -1 if not
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnNodeToColumnIndex( oSettings, iRow, n )
    +		{
    +			var anCells = _fnGetTdNodes( oSettings, iRow );
    +		
    +			for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +			{
    +				if ( anCells[i] === n )
    +				{
    +					return i;
    +				}
    +			}
    +			return -1;
    +		}
    +		
    +		
    +		/**
    +		 * Get an array of data for a given row from the internal data cache
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} iRow aoData row id
    +		 *  @param {string} sSpecific data get type ('type' 'filter' 'sort')
    +		 *  @param {array} aiColumns Array of column indexes to get data from
    +		 *  @returns {array} Data array
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnGetRowData( oSettings, iRow, sSpecific, aiColumns )
    +		{
    +			var out = [];
    +			for ( var i=0, iLen=aiColumns.length ; i<iLen ; i++ )
    +			{
    +				out.push( _fnGetCellData( oSettings, iRow, aiColumns[i], sSpecific ) );
    +			}
    +			return out;
    +		}
    +		
    +		
    +		/**
    +		 * Get the data for a given cell from the internal cache, taking into account data mapping
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} iRow aoData row id
    +		 *  @param {int} iCol Column index
    +		 *  @param {string} sSpecific data get type ('display', 'type' 'filter' 'sort')
    +		 *  @returns {*} Cell data
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnGetCellData( oSettings, iRow, iCol, sSpecific )
    +		{
    +			var sData;
    +			var oCol = oSettings.aoColumns[iCol];
    +			var oData = oSettings.aoData[iRow]._aData;
    +		
    +			if ( (sData=oCol.fnGetData( oData, sSpecific )) === undefined )
    +			{
    +				if ( oSettings.iDrawError != oSettings.iDraw && oCol.sDefaultContent === null )
    +				{
    +					_fnLog( oSettings, 0, "Requested unknown parameter "+
    +						(typeof oCol.mData=='function' ? '{mData function}' : "'"+oCol.mData+"'")+
    +						" from the data source for row "+iRow );
    +					oSettings.iDrawError = oSettings.iDraw;
    +				}
    +				return oCol.sDefaultContent;
    +			}
    +		
    +			/* When the data source is null, we can use default column data */
    +			if ( sData === null && oCol.sDefaultContent !== null )
    +			{
    +				sData = oCol.sDefaultContent;
    +			}
    +			else if ( typeof sData === 'function' )
    +			{
    +				/* If the data source is a function, then we run it and use the return */
    +				return sData();
    +			}
    +		
    +			if ( sSpecific == 'display' && sData === null )
    +			{
    +				return '';
    +			}
    +			return sData;
    +		}
    +		
    +		
    +		/**
    +		 * Set the value for a specific cell, into the internal data cache
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} iRow aoData row id
    +		 *  @param {int} iCol Column index
    +		 *  @param {*} val Value to set
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnSetCellData( oSettings, iRow, iCol, val )
    +		{
    +			var oCol = oSettings.aoColumns[iCol];
    +			var oData = oSettings.aoData[iRow]._aData;
    +		
    +			oCol.fnSetData( oData, val );
    +		}
    +		
    +		
    +		// Private variable that is used to match array syntax in the data property object
    +		var __reArray = /\[.*?\]$/;
    +		
    +		/**
    +		 * Return a function that can be used to get data from a source object, taking
    +		 * into account the ability to use nested objects as a source
    +		 *  @param {string|int|function} mSource The data source for the object
    +		 *  @returns {function} Data get function
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnGetObjectDataFn( mSource )
    +		{
    +			if ( mSource === null )
    +			{
    +				/* Give an empty string for rendering / sorting etc */
    +				return function (data, type) {
    +					return null;
    +				};
    +			}
    +			else if ( typeof mSource === 'function' )
    +			{
    +				return function (data, type, extra) {
    +					return mSource( data, type, extra );
    +				};
    +			}
    +			else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
    +			{
    +				/* If there is a . in the source string then the data source is in a 
    +				 * nested object so we loop over the data for each level to get the next
    +				 * level down. On each loop we test for undefined, and if found immediately
    +				 * return. This allows entire objects to be missing and sDefaultContent to
    +				 * be used if defined, rather than throwing an error
    +				 */
    +				var fetchData = function (data, type, src) {
    +					var a = src.split('.');
    +					var arrayNotation, out, innerSrc;
    +		
    +					if ( src !== "" )
    +					{
    +						for ( var i=0, iLen=a.length ; i<iLen ; i++ )
    +						{
    +							// Check if we are dealing with an array notation request
    +							arrayNotation = a[i].match(__reArray);
    +		
    +							if ( arrayNotation ) {
    +								a[i] = a[i].replace(__reArray, '');
    +		
    +								// Condition allows simply [] to be passed in
    +								if ( a[i] !== "" ) {
    +									data = data[ a[i] ];
    +								}
    +								out = [];
    +								
    +								// Get the remainder of the nested object to get
    +								a.splice( 0, i+1 );
    +								innerSrc = a.join('.');
    +		
    +								// Traverse each entry in the array getting the properties requested
    +								for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
    +									out.push( fetchData( data[j], type, innerSrc ) );
    +								}
    +		
    +								// If a string is given in between the array notation indicators, that
    +								// is used to join the strings together, otherwise an array is returned
    +								var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
    +								data = (join==="") ? out : out.join(join);
    +		
    +								// The inner call to fetchData has already traversed through the remainder
    +								// of the source requested, so we exit from the loop
    +								break;
    +							}
    +		
    +							if ( data === null || data[ a[i] ] === undefined )
    +							{
    +								return undefined;
    +							}
    +							data = data[ a[i] ];
    +						}
    +					}
    +		
    +					return data;
    +				};
    +		
    +				return function (data, type) {
    +					return fetchData( data, type, mSource );
    +				};
    +			}
    +			else
    +			{
    +				/* Array or flat object mapping */
    +				return function (data, type) {
    +					return data[mSource];	
    +				};
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Return a function that can be used to set data from a source object, taking
    +		 * into account the ability to use nested objects as a source
    +		 *  @param {string|int|function} mSource The data source for the object
    +		 *  @returns {function} Data set function
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnSetObjectDataFn( mSource )
    +		{
    +			if ( mSource === null )
    +			{
    +				/* Nothing to do when the data source is null */
    +				return function (data, val) {};
    +			}
    +			else if ( typeof mSource === 'function' )
    +			{
    +				return function (data, val) {
    +					mSource( data, 'set', val );
    +				};
    +			}
    +			else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
    +			{
    +				/* Like the get, we need to get data from a nested object */
    +				var setData = function (data, val, src) {
    +					var a = src.split('.'), b;
    +					var arrayNotation, o, innerSrc;
    +		
    +					for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
    +					{
    +						// Check if we are dealing with an array notation request
    +						arrayNotation = a[i].match(__reArray);
    +		
    +						if ( arrayNotation )
    +						{
    +							a[i] = a[i].replace(__reArray, '');
    +							data[ a[i] ] = [];
    +							
    +							// Get the remainder of the nested object to set so we can recurse
    +							b = a.slice();
    +							b.splice( 0, i+1 );
    +							innerSrc = b.join('.');
    +		
    +							// Traverse each entry in the array setting the properties requested
    +							for ( var j=0, jLen=val.length ; j<jLen ; j++ )
    +							{
    +								o = {};
    +								setData( o, val[j], innerSrc );
    +								data[ a[i] ].push( o );
    +							}
    +		
    +							// The inner call to setData has already traversed through the remainder
    +							// of the source and has set the data, thus we can exit here
    +							return;
    +						}
    +		
    +						// If the nested object doesn't currently exist - since we are
    +						// trying to set the value - create it
    +						if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
    +						{
    +							data[ a[i] ] = {};
    +						}
    +						data = data[ a[i] ];
    +					}
    +		
    +					// If array notation is used, we just want to strip it and use the property name
    +					// and assign the value. If it isn't used, then we get the result we want anyway
    +					data[ a[a.length-1].replace(__reArray, '') ] = val;
    +				};
    +		
    +				return function (data, val) {
    +					return setData( data, val, mSource );
    +				};
    +			}
    +			else
    +			{
    +				/* Array or flat object mapping */
    +				return function (data, val) {
    +					data[mSource] = val;	
    +				};
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Return an array with the full table data
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns array {array} aData Master data array
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnGetDataMaster ( oSettings )
    +		{
    +			var aData = [];
    +			var iLen = oSettings.aoData.length;
    +			for ( var i=0 ; i<iLen; i++ )
    +			{
    +				aData.push( oSettings.aoData[i]._aData );
    +			}
    +			return aData;
    +		}
    +		
    +		
    +		/**
    +		 * Nuke the table
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnClearTable( oSettings )
    +		{
    +			oSettings.aoData.splice( 0, oSettings.aoData.length );
    +			oSettings.aiDisplayMaster.splice( 0, oSettings.aiDisplayMaster.length );
    +			oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length );
    +			_fnCalculateEnd( oSettings );
    +		}
    +		
    +		
    +		 /**
    +		 * Take an array of integers (index array) and remove a target integer (value - not 
    +		 * the key!)
    +		 *  @param {array} a Index array to target
    +		 *  @param {int} iTarget value to find
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnDeleteIndex( a, iTarget )
    +		{
    +			var iTargetIndex = -1;
    +			
    +			for ( var i=0, iLen=a.length ; i<iLen ; i++ )
    +			{
    +				if ( a[i] == iTarget )
    +				{
    +					iTargetIndex = i;
    +				}
    +				else if ( a[i] > iTarget )
    +				{
    +					a[i]--;
    +				}
    +			}
    +			
    +			if ( iTargetIndex != -1 )
    +			{
    +				a.splice( iTargetIndex, 1 );
    +			}
    +		}
    +		
    +		
    +		 /**
    +		 * Call the developer defined fnRender function for a given cell (row/column) with
    +		 * the required parameters and return the result.
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} iRow aoData index for the row
    +		 *  @param {int} iCol aoColumns index for the column
    +		 *  @returns {*} Return of the developer's fnRender function
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnRender( oSettings, iRow, iCol )
    +		{
    +			var oCol = oSettings.aoColumns[iCol];
    +		
    +			return oCol.fnRender( {
    +				"iDataRow":    iRow,
    +				"iDataColumn": iCol,
    +				"oSettings":   oSettings,
    +				"aData":       oSettings.aoData[iRow]._aData,
    +				"mDataProp":   oCol.mData
    +			}, _fnGetCellData(oSettings, iRow, iCol, 'display') );
    +		}
    +		/**
    +		 * Create a new TR element (and it's TD children) for a row
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} iRow Row to consider
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnCreateTr ( oSettings, iRow )
    +		{
    +			var oData = oSettings.aoData[iRow];
    +			var nTd;
    +		
    +			if ( oData.nTr === null )
    +			{
    +				oData.nTr = document.createElement('tr');
    +		
    +				/* Use a private property on the node to allow reserve mapping from the node
    +				 * to the aoData array for fast look up
    +				 */
    +				oData.nTr._DT_RowIndex = iRow;
    +		
    +				/* Special parameters can be given by the data source to be used on the row */
    +				if ( oData._aData.DT_RowId )
    +				{
    +					oData.nTr.id = oData._aData.DT_RowId;
    +				}
    +		
    +				if ( oData._aData.DT_RowClass )
    +				{
    +					oData.nTr.className = oData._aData.DT_RowClass;
    +				}
    +		
    +				/* Process each column */
    +				for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +				{
    +					var oCol = oSettings.aoColumns[i];
    +					nTd = document.createElement( oCol.sCellType );
    +		
    +					/* Render if needed - if bUseRendered is true then we already have the rendered
    +					 * value in the data source - so can just use that
    +					 */
    +					nTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mData === null)) ?
    +						_fnRender( oSettings, iRow, i ) :
    +						_fnGetCellData( oSettings, iRow, i, 'display' );
    +				
    +					/* Add user defined class */
    +					if ( oCol.sClass !== null )
    +					{
    +						nTd.className = oCol.sClass;
    +					}
    +					
    +					if ( oCol.bVisible )
    +					{
    +						oData.nTr.appendChild( nTd );
    +						oData._anHidden[i] = null;
    +					}
    +					else
    +					{
    +						oData._anHidden[i] = nTd;
    +					}
    +		
    +					if ( oCol.fnCreatedCell )
    +					{
    +						oCol.fnCreatedCell.call( oSettings.oInstance,
    +							nTd, _fnGetCellData( oSettings, iRow, i, 'display' ), oData._aData, iRow, i
    +						);
    +					}
    +				}
    +		
    +				_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, iRow] );
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Create the HTML header for the table
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnBuildHead( oSettings )
    +		{
    +			var i, nTh, iLen, j, jLen;
    +			var iThs = $('th, td', oSettings.nTHead).length;
    +			var iCorrector = 0;
    +			var jqChildren;
    +			
    +			/* If there is a header in place - then use it - otherwise it's going to get nuked... */
    +			if ( iThs !== 0 )
    +			{
    +				/* We've got a thead from the DOM, so remove hidden columns and apply width to vis cols */
    +				for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +				{
    +					nTh = oSettings.aoColumns[i].nTh;
    +					nTh.setAttribute('role', 'columnheader');
    +					if ( oSettings.aoColumns[i].bSortable )
    +					{
    +						nTh.setAttribute('tabindex', oSettings.iTabIndex);
    +						nTh.setAttribute('aria-controls', oSettings.sTableId);
    +					}
    +		
    +					if ( oSettings.aoColumns[i].sClass !== null )
    +					{
    +						$(nTh).addClass( oSettings.aoColumns[i].sClass );
    +					}
    +					
    +					/* Set the title of the column if it is user defined (not what was auto detected) */
    +					if ( oSettings.aoColumns[i].sTitle != nTh.innerHTML )
    +					{
    +						nTh.innerHTML = oSettings.aoColumns[i].sTitle;
    +					}
    +				}
    +			}
    +			else
    +			{
    +				/* We don't have a header in the DOM - so we are going to have to create one */
    +				var nTr = document.createElement( "tr" );
    +				
    +				for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +				{
    +					nTh = oSettings.aoColumns[i].nTh;
    +					nTh.innerHTML = oSettings.aoColumns[i].sTitle;
    +					nTh.setAttribute('tabindex', '0');
    +					
    +					if ( oSettings.aoColumns[i].sClass !== null )
    +					{
    +						$(nTh).addClass( oSettings.aoColumns[i].sClass );
    +					}
    +					
    +					nTr.appendChild( nTh );
    +				}
    +				$(oSettings.nTHead).html( '' )[0].appendChild( nTr );
    +				_fnDetectHeader( oSettings.aoHeader, oSettings.nTHead );
    +			}
    +			
    +			/* ARIA role for the rows */	
    +			$(oSettings.nTHead).children('tr').attr('role', 'row');
    +			
    +			/* Add the extra markup needed by jQuery UI's themes */
    +			if ( oSettings.bJUI )
    +			{
    +				for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +				{
    +					nTh = oSettings.aoColumns[i].nTh;
    +					
    +					var nDiv = document.createElement('div');
    +					nDiv.className = oSettings.oClasses.sSortJUIWrapper;
    +					$(nTh).contents().appendTo(nDiv);
    +					
    +					var nSpan = document.createElement('span');
    +					nSpan.className = oSettings.oClasses.sSortIcon;
    +					nDiv.appendChild( nSpan );
    +					nTh.appendChild( nDiv );
    +				}
    +			}
    +			
    +			if ( oSettings.oFeatures.bSort )
    +			{
    +				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
    +				{
    +					if ( oSettings.aoColumns[i].bSortable !== false )
    +					{
    +						_fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );
    +					}
    +					else
    +					{
    +						$(oSettings.aoColumns[i].nTh).addClass( oSettings.oClasses.sSortableNone );
    +					}
    +				}
    +			}
    +			
    +			/* Deal with the footer - add classes if required */
    +			if ( oSettings.oClasses.sFooterTH !== "" )
    +			{
    +				$(oSettings.nTFoot).children('tr').children('th').addClass( oSettings.oClasses.sFooterTH );
    +			}
    +			
    +			/* Cache the footer elements */
    +			if ( oSettings.nTFoot !== null )
    +			{
    +				var anCells = _fnGetUniqueThs( oSettings, null, oSettings.aoFooter );
    +				for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +				{
    +					if ( anCells[i] )
    +					{
    +						oSettings.aoColumns[i].nTf = anCells[i];
    +						if ( oSettings.aoColumns[i].sClass )
    +						{
    +							$(anCells[i]).addClass( oSettings.aoColumns[i].sClass );
    +						}
    +					}
    +				}
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Draw the header (or footer) element based on the column visibility states. The
    +		 * methodology here is to use the layout array from _fnDetectHeader, modified for
    +		 * the instantaneous column visibility, to construct the new layout. The grid is
    +		 * traversed over cell at a time in a rows x columns grid fashion, although each 
    +		 * cell insert can cover multiple elements in the grid - which is tracks using the
    +		 * aApplied array. Cell inserts in the grid will only occur where there isn't
    +		 * already a cell in that position.
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param array {objects} aoSource Layout array from _fnDetectHeader
    +		 *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc, 
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
    +		{
    +			var i, iLen, j, jLen, k, kLen, n, nLocalTr;
    +			var aoLocal = [];
    +			var aApplied = [];
    +			var iColumns = oSettings.aoColumns.length;
    +			var iRowspan, iColspan;
    +		
    +			if (  bIncludeHidden === undefined )
    +			{
    +				bIncludeHidden = false;
    +			}
    +		
    +			/* Make a copy of the master layout array, but without the visible columns in it */
    +			for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
    +			{
    +				aoLocal[i] = aoSource[i].slice();
    +				aoLocal[i].nTr = aoSource[i].nTr;
    +		
    +				/* Remove any columns which are currently hidden */
    +				for ( j=iColumns-1 ; j>=0 ; j-- )
    +				{
    +					if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
    +					{
    +						aoLocal[i].splice( j, 1 );
    +					}
    +				}
    +		
    +				/* Prep the applied array - it needs an element for each row */
    +				aApplied.push( [] );
    +			}
    +		
    +			for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
    +			{
    +				nLocalTr = aoLocal[i].nTr;
    +				
    +				/* All cells are going to be replaced, so empty out the row */
    +				if ( nLocalTr )
    +				{
    +					while( (n = nLocalTr.firstChild) )
    +					{
    +						nLocalTr.removeChild( n );
    +					}
    +				}
    +		
    +				for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
    +				{
    +					iRowspan = 1;
    +					iColspan = 1;
    +		
    +					/* Check to see if there is already a cell (row/colspan) covering our target
    +					 * insert point. If there is, then there is nothing to do.
    +					 */
    +					if ( aApplied[i][j] === undefined )
    +					{
    +						nLocalTr.appendChild( aoLocal[i][j].cell );
    +						aApplied[i][j] = 1;
    +		
    +						/* Expand the cell to cover as many rows as needed */
    +						while ( aoLocal[i+iRowspan] !== undefined &&
    +						        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
    +						{
    +							aApplied[i+iRowspan][j] = 1;
    +							iRowspan++;
    +						}
    +		
    +						/* Expand the cell to cover as many columns as needed */
    +						while ( aoLocal[i][j+iColspan] !== undefined &&
    +						        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
    +						{
    +							/* Must update the applied array over the rows for the columns */
    +							for ( k=0 ; k<iRowspan ; k++ )
    +							{
    +								aApplied[i+k][j+iColspan] = 1;
    +							}
    +							iColspan++;
    +						}
    +		
    +						/* Do the actual expansion in the DOM */
    +						aoLocal[i][j].cell.rowSpan = iRowspan;
    +						aoLocal[i][j].cell.colSpan = iColspan;
    +					}
    +				}
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Insert the required TR nodes into the table for display
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnDraw( oSettings )
    +		{
    +			/* Provide a pre-callback function which can be used to cancel the draw is false is returned */
    +			var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
    +			if ( $.inArray( false, aPreDraw ) !== -1 )
    +			{
    +				_fnProcessingDisplay( oSettings, false );
    +				return;
    +			}
    +			
    +			var i, iLen, n;
    +			var anRows = [];
    +			var iRowCount = 0;
    +			var iStripes = oSettings.asStripeClasses.length;
    +			var iOpenRows = oSettings.aoOpenRows.length;
    +			
    +			oSettings.bDrawing = true;
    +			
    +			/* Check and see if we have an initial draw position from state saving */
    +			if ( oSettings.iInitDisplayStart !== undefined && oSettings.iInitDisplayStart != -1 )
    +			{
    +				if ( oSettings.oFeatures.bServerSide )
    +				{
    +					oSettings._iDisplayStart = oSettings.iInitDisplayStart;
    +				}
    +				else
    +				{
    +					oSettings._iDisplayStart = (oSettings.iInitDisplayStart >= oSettings.fnRecordsDisplay()) ?
    +						0 : oSettings.iInitDisplayStart;
    +				}
    +				oSettings.iInitDisplayStart = -1;
    +				_fnCalculateEnd( oSettings );
    +			}
    +			
    +			/* Server-side processing draw intercept */
    +			if ( oSettings.bDeferLoading )
    +			{
    +				oSettings.bDeferLoading = false;
    +				oSettings.iDraw++;
    +			}
    +			else if ( !oSettings.oFeatures.bServerSide )
    +			{
    +				oSettings.iDraw++;
    +			}
    +			else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
    +			{
    +				return;
    +			}
    +			
    +			if ( oSettings.aiDisplay.length !== 0 )
    +			{
    +				var iStart = oSettings._iDisplayStart;
    +				var iEnd = oSettings._iDisplayEnd;
    +				
    +				if ( oSettings.oFeatures.bServerSide )
    +				{
    +					iStart = 0;
    +					iEnd = oSettings.aoData.length;
    +				}
    +				
    +				for ( var j=iStart ; j<iEnd ; j++ )
    +				{
    +					var aoData = oSettings.aoData[ oSettings.aiDisplay[j] ];
    +					if ( aoData.nTr === null )
    +					{
    +						_fnCreateTr( oSettings, oSettings.aiDisplay[j] );
    +					}
    +		
    +					var nRow = aoData.nTr;
    +					
    +					/* Remove the old striping classes and then add the new one */
    +					if ( iStripes !== 0 )
    +					{
    +						var sStripe = oSettings.asStripeClasses[ iRowCount % iStripes ];
    +						if ( aoData._sRowStripe != sStripe )
    +						{
    +							$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
    +							aoData._sRowStripe = sStripe;
    +						}
    +					}
    +					
    +					/* Row callback functions - might want to manipulate the row */
    +					_fnCallbackFire( oSettings, 'aoRowCallback', null, 
    +						[nRow, oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j] );
    +					
    +					anRows.push( nRow );
    +					iRowCount++;
    +					
    +					/* If there is an open row - and it is attached to this parent - attach it on redraw */
    +					if ( iOpenRows !== 0 )
    +					{
    +						for ( var k=0 ; k<iOpenRows ; k++ )
    +						{
    +							if ( nRow == oSettings.aoOpenRows[k].nParent )
    +							{
    +								anRows.push( oSettings.aoOpenRows[k].nTr );
    +								break;
    +							}
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				/* Table is empty - create a row with an empty message in it */
    +				anRows[ 0 ] = document.createElement( 'tr' );
    +				
    +				if ( oSettings.asStripeClasses[0] )
    +				{
    +					anRows[ 0 ].className = oSettings.asStripeClasses[0];
    +				}
    +		
    +				var oLang = oSettings.oLanguage;
    +				var sZero = oLang.sZeroRecords;
    +				if ( oSettings.iDraw == 1 && oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
    +				{
    +					sZero = oLang.sLoadingRecords;
    +				}
    +				else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
    +				{
    +					sZero = oLang.sEmptyTable;
    +				}
    +		
    +				var nTd = document.createElement( 'td' );
    +				nTd.setAttribute( 'valign', "top" );
    +				nTd.colSpan = _fnVisbleColumns( oSettings );
    +				nTd.className = oSettings.oClasses.sRowEmpty;
    +				nTd.innerHTML = _fnInfoMacros( oSettings, sZero );
    +				
    +				anRows[ iRowCount ].appendChild( nTd );
    +			}
    +			
    +			/* Header and footer callbacks */
    +			_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0], 
    +				_fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );
    +			
    +			_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0], 
    +				_fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );
    +			
    +			/* 
    +			 * Need to remove any old row from the display - note we can't just empty the tbody using
    +			 * $().html('') since this will unbind the jQuery event handlers (even although the node 
    +			 * still exists!) - equally we can't use innerHTML, since IE throws an exception.
    +			 */
    +			var
    +				nAddFrag = document.createDocumentFragment(),
    +				nRemoveFrag = document.createDocumentFragment(),
    +				nBodyPar, nTrs;
    +			
    +			if ( oSettings.nTBody )
    +			{
    +				nBodyPar = oSettings.nTBody.parentNode;
    +				nRemoveFrag.appendChild( oSettings.nTBody );
    +				
    +				/* When doing infinite scrolling, only remove child rows when sorting, filtering or start
    +				 * up. When not infinite scroll, always do it.
    +				 */
    +				if ( !oSettings.oScroll.bInfinite || !oSettings._bInitComplete ||
    +				 	oSettings.bSorted || oSettings.bFiltered )
    +				{
    +					while( (n = oSettings.nTBody.firstChild) )
    +					{
    +						oSettings.nTBody.removeChild( n );
    +					}
    +				}
    +				
    +				/* Put the draw table into the dom */
    +				for ( i=0, iLen=anRows.length ; i<iLen ; i++ )
    +				{
    +					nAddFrag.appendChild( anRows[i] );
    +				}
    +				
    +				oSettings.nTBody.appendChild( nAddFrag );
    +				if ( nBodyPar !== null )
    +				{
    +					nBodyPar.appendChild( oSettings.nTBody );
    +				}
    +			}
    +			
    +			/* Call all required callback functions for the end of a draw */
    +			_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
    +			
    +			/* Draw is complete, sorting and filtering must be as well */
    +			oSettings.bSorted = false;
    +			oSettings.bFiltered = false;
    +			oSettings.bDrawing = false;
    +			
    +			if ( oSettings.oFeatures.bServerSide )
    +			{
    +				_fnProcessingDisplay( oSettings, false );
    +				if ( !oSettings._bInitComplete )
    +				{
    +					_fnInitComplete( oSettings );
    +				}
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Redraw the table - taking account of the various features which are enabled
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnReDraw( oSettings )
    +		{
    +			if ( oSettings.oFeatures.bSort )
    +			{
    +				/* Sorting will refilter and draw for us */
    +				_fnSort( oSettings, oSettings.oPreviousSearch );
    +			}
    +			else if ( oSettings.oFeatures.bFilter )
    +			{
    +				/* Filtering will redraw for us */
    +				_fnFilterComplete( oSettings, oSettings.oPreviousSearch );
    +			}
    +			else
    +			{
    +				_fnCalculateEnd( oSettings );
    +				_fnDraw( oSettings );
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Add the options to the page HTML for the table
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnAddOptionsHtml ( oSettings )
    +		{
    +			/*
    +			 * Create a temporary, empty, div which we can later on replace with what we have generated
    +			 * we do it this way to rendering the 'options' html offline - speed :-)
    +			 */
    +			var nHolding = $('<div></div>')[0];
    +			oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable );
    +			
    +			/* 
    +			 * All DataTables are wrapped in a div
    +			 */
    +			oSettings.nTableWrapper = $('<div id="'+oSettings.sTableId+'_wrapper" class="'+oSettings.oClasses.sWrapper+'" role="grid"></div>')[0];
    +			oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
    +		
    +			/* Track where we want to insert the option */
    +			var nInsertNode = oSettings.nTableWrapper;
    +			
    +			/* Loop over the user set positioning and place the elements as needed */
    +			var aDom = oSettings.sDom.split('');
    +			var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j;
    +			for ( var i=0 ; i<aDom.length ; i++ )
    +			{
    +				iPushFeature = 0;
    +				cOption = aDom[i];
    +				
    +				if ( cOption == '<' )
    +				{
    +					/* New container div */
    +					nNewNode = $('<div></div>')[0];
    +					
    +					/* Check to see if we should append an id and/or a class name to the container */
    +					cNext = aDom[i+1];
    +					if ( cNext == "'" || cNext == '"' )
    +					{
    +						sAttr = "";
    +						j = 2;
    +						while ( aDom[i+j] != cNext )
    +						{
    +							sAttr += aDom[i+j];
    +							j++;
    +						}
    +						
    +						/* Replace jQuery UI constants */
    +						if ( sAttr == "H" )
    +						{
    +							sAttr = oSettings.oClasses.sJUIHeader;
    +						}
    +						else if ( sAttr == "F" )
    +						{
    +							sAttr = oSettings.oClasses.sJUIFooter;
    +						}
    +						
    +						/* The attribute can be in the format of "#id.class", "#id" or "class" This logic
    +						 * breaks the string into parts and applies them as needed
    +						 */
    +						if ( sAttr.indexOf('.') != -1 )
    +						{
    +							var aSplit = sAttr.split('.');
    +							nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
    +							nNewNode.className = aSplit[1];
    +						}
    +						else if ( sAttr.charAt(0) == "#" )
    +						{
    +							nNewNode.id = sAttr.substr(1, sAttr.length-1);
    +						}
    +						else
    +						{
    +							nNewNode.className = sAttr;
    +						}
    +						
    +						i += j; /* Move along the position array */
    +					}
    +					
    +					nInsertNode.appendChild( nNewNode );
    +					nInsertNode = nNewNode;
    +				}
    +				else if ( cOption == '>' )
    +				{
    +					/* End container div */
    +					nInsertNode = nInsertNode.parentNode;
    +				}
    +				else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange )
    +				{
    +					/* Length */
    +					nTmp = _fnFeatureHtmlLength( oSettings );
    +					iPushFeature = 1;
    +				}
    +				else if ( cOption == 'f' && oSettings.oFeatures.bFilter )
    +				{
    +					/* Filter */
    +					nTmp = _fnFeatureHtmlFilter( oSettings );
    +					iPushFeature = 1;
    +				}
    +				else if ( cOption == 'r' && oSettings.oFeatures.bProcessing )
    +				{
    +					/* pRocessing */
    +					nTmp = _fnFeatureHtmlProcessing( oSettings );
    +					iPushFeature = 1;
    +				}
    +				else if ( cOption == 't' )
    +				{
    +					/* Table */
    +					nTmp = _fnFeatureHtmlTable( oSettings );
    +					iPushFeature = 1;
    +				}
    +				else if ( cOption ==  'i' && oSettings.oFeatures.bInfo )
    +				{
    +					/* Info */
    +					nTmp = _fnFeatureHtmlInfo( oSettings );
    +					iPushFeature = 1;
    +				}
    +				else if ( cOption == 'p' && oSettings.oFeatures.bPaginate )
    +				{
    +					/* Pagination */
    +					nTmp = _fnFeatureHtmlPaginate( oSettings );
    +					iPushFeature = 1;
    +				}
    +				else if ( DataTable.ext.aoFeatures.length !== 0 )
    +				{
    +					/* Plug-in features */
    +					var aoFeatures = DataTable.ext.aoFeatures;
    +					for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
    +					{
    +						if ( cOption == aoFeatures[k].cFeature )
    +						{
    +							nTmp = aoFeatures[k].fnInit( oSettings );
    +							if ( nTmp )
    +							{
    +								iPushFeature = 1;
    +							}
    +							break;
    +						}
    +					}
    +				}
    +				
    +				/* Add to the 2D features array */
    +				if ( iPushFeature == 1 && nTmp !== null )
    +				{
    +					if ( typeof oSettings.aanFeatures[cOption] !== 'object' )
    +					{
    +						oSettings.aanFeatures[cOption] = [];
    +					}
    +					oSettings.aanFeatures[cOption].push( nTmp );
    +					nInsertNode.appendChild( nTmp );
    +				}
    +			}
    +			
    +			/* Built our DOM structure - replace the holding div with what we want */
    +			nHolding.parentNode.replaceChild( oSettings.nTableWrapper, nHolding );
    +		}
    +		
    +		
    +		/**
    +		 * Use the DOM source to create up an array of header cells. The idea here is to
    +		 * create a layout grid (array) of rows x columns, which contains a reference
    +		 * to the cell that that point in the grid (regardless of col/rowspan), such that
    +		 * any column / row could be removed and the new grid constructed
    +		 *  @param array {object} aLayout Array to store the calculated layout in
    +		 *  @param {node} nThead The header/footer element for the table
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnDetectHeader ( aLayout, nThead )
    +		{
    +			var nTrs = $(nThead).children('tr');
    +			var nTr, nCell;
    +			var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
    +			var bUnique;
    +			var fnShiftCol = function ( a, i, j ) {
    +				var k = a[i];
    +		                while ( k[j] ) {
    +					j++;
    +				}
    +				return j;
    +			};
    +		
    +			aLayout.splice( 0, aLayout.length );
    +			
    +			/* We know how many rows there are in the layout - so prep it */
    +			for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
    +			{
    +				aLayout.push( [] );
    +			}
    +			
    +			/* Calculate a layout array */
    +			for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
    +			{
    +				nTr = nTrs[i];
    +				iColumn = 0;
    +				
    +				/* For every cell in the row... */
    +				nCell = nTr.firstChild;
    +				while ( nCell ) {
    +					if ( nCell.nodeName.toUpperCase() == "TD" ||
    +					     nCell.nodeName.toUpperCase() == "TH" )
    +					{
    +						/* Get the col and rowspan attributes from the DOM and sanitise them */
    +						iColspan = nCell.getAttribute('colspan') * 1;
    +						iRowspan = nCell.getAttribute('rowspan') * 1;
    +						iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
    +						iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
    +		
    +						/* There might be colspan cells already in this row, so shift our target 
    +						 * accordingly
    +						 */
    +						iColShifted = fnShiftCol( aLayout, i, iColumn );
    +						
    +						/* Cache calculation for unique columns */
    +						bUnique = iColspan === 1 ? true : false;
    +						
    +						/* If there is col / rowspan, copy the information into the layout grid */
    +						for ( l=0 ; l<iColspan ; l++ )
    +						{
    +							for ( k=0 ; k<iRowspan ; k++ )
    +							{
    +								aLayout[i+k][iColShifted+l] = {
    +									"cell": nCell,
    +									"unique": bUnique
    +								};
    +								aLayout[i+k].nTr = nTr;
    +							}
    +						}
    +					}
    +					nCell = nCell.nextSibling;
    +				}
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Get an array of unique th elements, one for each column
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {node} nHeader automatically detect the layout from this node - optional
    +		 *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
    +		 *  @returns array {node} aReturn list of unique th's
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
    +		{
    +			var aReturn = [];
    +			if ( !aLayout )
    +			{
    +				aLayout = oSettings.aoHeader;
    +				if ( nHeader )
    +				{
    +					aLayout = [];
    +					_fnDetectHeader( aLayout, nHeader );
    +				}
    +			}
    +		
    +			for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
    +			{
    +				for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
    +				{
    +					if ( aLayout[i][j].unique && 
    +						 (!aReturn[j] || !oSettings.bSortCellsTop) )
    +					{
    +						aReturn[j] = aLayout[i][j].cell;
    +					}
    +				}
    +			}
    +			
    +			return aReturn;
    +		}
    +		
    +		
    +		
    +		/**
    +		 * Update the table using an Ajax call
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns {boolean} Block the table drawing or not
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnAjaxUpdate( oSettings )
    +		{
    +			if ( oSettings.bAjaxDataGet )
    +			{
    +				oSettings.iDraw++;
    +				_fnProcessingDisplay( oSettings, true );
    +				var iColumns = oSettings.aoColumns.length;
    +				var aoData = _fnAjaxParameters( oSettings );
    +				_fnServerParams( oSettings, aoData );
    +				
    +				oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData,
    +					function(json) {
    +						_fnAjaxUpdateDraw( oSettings, json );
    +					}, oSettings );
    +				return false;
    +			}
    +			else
    +			{
    +				return true;
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Build up the parameters in an object needed for a server-side processing request
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns {bool} block the table drawing or not
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnAjaxParameters( oSettings )
    +		{
    +			var iColumns = oSettings.aoColumns.length;
    +			var aoData = [], mDataProp, aaSort, aDataSort;
    +			var i, j;
    +			
    +			aoData.push( { "name": "sEcho",          "value": oSettings.iDraw } );
    +			aoData.push( { "name": "iColumns",       "value": iColumns } );
    +			aoData.push( { "name": "sColumns",       "value": _fnColumnOrdering(oSettings) } );
    +			aoData.push( { "name": "iDisplayStart",  "value": oSettings._iDisplayStart } );
    +			aoData.push( { "name": "iDisplayLength", "value": oSettings.oFeatures.bPaginate !== false ?
    +				oSettings._iDisplayLength : -1 } );
    +				
    +			for ( i=0 ; i<iColumns ; i++ )
    +			{
    +			  mDataProp = oSettings.aoColumns[i].mData;
    +				aoData.push( { "name": "mDataProp_"+i, "value": typeof(mDataProp)==="function" ? 'function' : mDataProp } );
    +			}
    +			
    +			/* Filtering */
    +			if ( oSettings.oFeatures.bFilter !== false )
    +			{
    +				aoData.push( { "name": "sSearch", "value": oSettings.oPreviousSearch.sSearch } );
    +				aoData.push( { "name": "bRegex",  "value": oSettings.oPreviousSearch.bRegex } );
    +				for ( i=0 ; i<iColumns ; i++ )
    +				{
    +					aoData.push( { "name": "sSearch_"+i,     "value": oSettings.aoPreSearchCols[i].sSearch } );
    +					aoData.push( { "name": "bRegex_"+i,      "value": oSettings.aoPreSearchCols[i].bRegex } );
    +					aoData.push( { "name": "bSearchable_"+i, "value": oSettings.aoColumns[i].bSearchable } );
    +				}
    +			}
    +			
    +			/* Sorting */
    +			if ( oSettings.oFeatures.bSort !== false )
    +			{
    +				var iCounter = 0;
    +		
    +				aaSort = ( oSettings.aaSortingFixed !== null ) ?
    +					oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
    +					oSettings.aaSorting.slice();
    +				
    +				for ( i=0 ; i<aaSort.length ; i++ )
    +				{
    +					aDataSort = oSettings.aoColumns[ aaSort[i][0] ].aDataSort;
    +					
    +					for ( j=0 ; j<aDataSort.length ; j++ )
    +					{
    +						aoData.push( { "name": "iSortCol_"+iCounter,  "value": aDataSort[j] } );
    +						aoData.push( { "name": "sSortDir_"+iCounter,  "value": aaSort[i][1] } );
    +						iCounter++;
    +					}
    +				}
    +				aoData.push( { "name": "iSortingCols",   "value": iCounter } );
    +				
    +				for ( i=0 ; i<iColumns ; i++ )
    +				{
    +					aoData.push( { "name": "bSortable_"+i,  "value": oSettings.aoColumns[i].bSortable } );
    +				}
    +			}
    +			
    +			return aoData;
    +		}
    +		
    +		
    +		/**
    +		 * Add Ajax parameters from plug-ins
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param array {objects} aoData name/value pairs to send to the server
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnServerParams( oSettings, aoData )
    +		{
    +			_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [aoData] );
    +		}
    +		
    +		
    +		/**
    +		 * Data the data from the server (nuking the old) and redraw the table
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {object} json json data return from the server.
    +		 *  @param {string} json.sEcho Tracking flag for DataTables to match requests
    +		 *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
    +		 *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
    +		 *  @param {array} json.aaData The data to display on this page
    +		 *  @param {string} [json.sColumns] Column ordering (sName, comma separated)
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnAjaxUpdateDraw ( oSettings, json )
    +		{
    +			if ( json.sEcho !== undefined )
    +			{
    +				/* Protect against old returns over-writing a new one. Possible when you get
    +				 * very fast interaction, and later queries are completed much faster
    +				 */
    +				if ( json.sEcho*1 < oSettings.iDraw )
    +				{
    +					return;
    +				}
    +				else
    +				{
    +					oSettings.iDraw = json.sEcho * 1;
    +				}
    +			}
    +			
    +			if ( !oSettings.oScroll.bInfinite ||
    +				   (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) )
    +			{
    +				_fnClearTable( oSettings );
    +			}
    +			oSettings._iRecordsTotal = parseInt(json.iTotalRecords, 10);
    +			oSettings._iRecordsDisplay = parseInt(json.iTotalDisplayRecords, 10);
    +			
    +			/* Determine if reordering is required */
    +			var sOrdering = _fnColumnOrdering(oSettings);
    +			var bReOrder = (json.sColumns !== undefined && sOrdering !== "" && json.sColumns != sOrdering );
    +			var aiIndex;
    +			if ( bReOrder )
    +			{
    +				aiIndex = _fnReOrderIndex( oSettings, json.sColumns );
    +			}
    +			
    +			var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );
    +			for ( var i=0, iLen=aData.length ; i<iLen ; i++ )
    +			{
    +				if ( bReOrder )
    +				{
    +					/* If we need to re-order, then create a new array with the correct order and add it */
    +					var aDataSorted = [];
    +					for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
    +					{
    +						aDataSorted.push( aData[i][ aiIndex[j] ] );
    +					}
    +					_fnAddData( oSettings, aDataSorted );
    +				}
    +				else
    +				{
    +					/* No re-order required, sever got it "right" - just straight add */
    +					_fnAddData( oSettings, aData[i] );
    +				}
    +			}
    +			oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
    +			
    +			oSettings.bAjaxDataGet = false;
    +			_fnDraw( oSettings );
    +			oSettings.bAjaxDataGet = true;
    +			_fnProcessingDisplay( oSettings, false );
    +		}
    +		
    +		
    +		
    +		/**
    +		 * Generate the node required for filtering text
    +		 *  @returns {node} Filter control element
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnFeatureHtmlFilter ( oSettings )
    +		{
    +			var oPreviousSearch = oSettings.oPreviousSearch;
    +			
    +			var sSearchStr = oSettings.oLanguage.sSearch;
    +			sSearchStr = (sSearchStr.indexOf('_INPUT_') !== -1) ?
    +			  sSearchStr.replace('_INPUT_', '<input type="text" />') :
    +			  sSearchStr==="" ? '<input type="text" />' : sSearchStr+' <input type="text" />';
    +			
    +			var nFilter = document.createElement( 'div' );
    +			nFilter.className = oSettings.oClasses.sFilter;
    +			nFilter.innerHTML = '<label>'+sSearchStr+'</label>';
    +			if ( !oSettings.aanFeatures.f )
    +			{
    +				nFilter.id = oSettings.sTableId+'_filter';
    +			}
    +			
    +			var jqFilter = $('input[type="text"]', nFilter);
    +		
    +			// Store a reference to the input element, so other input elements could be
    +			// added to the filter wrapper if needed (submit button for example)
    +			nFilter._DT_Input = jqFilter[0];
    +		
    +			jqFilter.val( oPreviousSearch.sSearch.replace('"','&quot;') );
    +			jqFilter.bind( 'keyup.DT', function(e) {
    +				/* Update all other filter input elements for the new display */
    +				var n = oSettings.aanFeatures.f;
    +				var val = this.value==="" ? "" : this.value; // mental IE8 fix :-(
    +		
    +				for ( var i=0, iLen=n.length ; i<iLen ; i++ )
    +				{
    +					if ( n[i] != $(this).parents('div.dataTables_filter')[0] )
    +					{
    +						$(n[i]._DT_Input).val( val );
    +					}
    +				}
    +				
    +				/* Now do the filter */
    +				if ( val != oPreviousSearch.sSearch )
    +				{
    +					_fnFilterComplete( oSettings, { 
    +						"sSearch": val, 
    +						"bRegex": oPreviousSearch.bRegex,
    +						"bSmart": oPreviousSearch.bSmart ,
    +						"bCaseInsensitive": oPreviousSearch.bCaseInsensitive 
    +					} );
    +				}
    +			} );
    +		
    +			jqFilter
    +				.attr('aria-controls', oSettings.sTableId)
    +				.bind( 'keypress.DT', function(e) {
    +					/* Prevent form submission */
    +					if ( e.keyCode == 13 )
    +					{
    +						return false;
    +					}
    +				}
    +			);
    +			
    +			return nFilter;
    +		}
    +		
    +		
    +		/**
    +		 * Filter the table using both the global filter and column based filtering
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {object} oSearch search information
    +		 *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnFilterComplete ( oSettings, oInput, iForce )
    +		{
    +			var oPrevSearch = oSettings.oPreviousSearch;
    +			var aoPrevSearch = oSettings.aoPreSearchCols;
    +			var fnSaveFilter = function ( oFilter ) {
    +				/* Save the filtering values */
    +				oPrevSearch.sSearch = oFilter.sSearch;
    +				oPrevSearch.bRegex = oFilter.bRegex;
    +				oPrevSearch.bSmart = oFilter.bSmart;
    +				oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
    +			};
    +		
    +			/* In server-side processing all filtering is done by the server, so no point hanging around here */
    +			if ( !oSettings.oFeatures.bServerSide )
    +			{
    +				/* Global filter */
    +				_fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart, oInput.bCaseInsensitive );
    +				fnSaveFilter( oInput );
    +		
    +				/* Now do the individual column filter */
    +				for ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i++ )
    +				{
    +					_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, aoPrevSearch[i].bRegex, 
    +						aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
    +				}
    +				
    +				/* Custom filtering */
    +				_fnFilterCustom( oSettings );
    +			}
    +			else
    +			{
    +				fnSaveFilter( oInput );
    +			}
    +			
    +			/* Tell the draw function we have been filtering */
    +			oSettings.bFiltered = true;
    +			$(oSettings.oInstance).trigger('filter', oSettings);
    +			
    +			/* Redraw the table */
    +			oSettings._iDisplayStart = 0;
    +			_fnCalculateEnd( oSettings );
    +			_fnDraw( oSettings );
    +			
    +			/* Rebuild search array 'offline' */
    +			_fnBuildSearchArray( oSettings, 0 );
    +		}
    +		
    +		
    +		/**
    +		 * Apply custom filtering functions
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnFilterCustom( oSettings )
    +		{
    +			var afnFilters = DataTable.ext.afnFiltering;
    +			var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
    +		
    +			for ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ )
    +			{
    +				var iCorrector = 0;
    +				for ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ )
    +				{
    +					var iDisIndex = oSettings.aiDisplay[j-iCorrector];
    +					var bTest = afnFilters[i](
    +						oSettings,
    +						_fnGetRowData( oSettings, iDisIndex, 'filter', aiFilterColumns ),
    +						iDisIndex
    +					);
    +					
    +					/* Check if we should use this row based on the filtering function */
    +					if ( !bTest )
    +					{
    +						oSettings.aiDisplay.splice( j-iCorrector, 1 );
    +						iCorrector++;
    +					}
    +				}
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Filter the table on a per-column basis
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {string} sInput string to filter on
    +		 *  @param {int} iColumn column to filter
    +		 *  @param {bool} bRegex treat search string as a regular expression or not
    +		 *  @param {bool} bSmart use smart filtering or not
    +		 *  @param {bool} bCaseInsensitive Do case insenstive matching or not
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnFilterColumn ( oSettings, sInput, iColumn, bRegex, bSmart, bCaseInsensitive )
    +		{
    +			if ( sInput === "" )
    +			{
    +				return;
    +			}
    +			
    +			var iIndexCorrector = 0;
    +			var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
    +			
    +			for ( var i=oSettings.aiDisplay.length-1 ; i>=0 ; i-- )
    +			{
    +				var sData = _fnDataToSearch( _fnGetCellData( oSettings, oSettings.aiDisplay[i], iColumn, 'filter' ),
    +					oSettings.aoColumns[iColumn].sType );
    +				if ( ! rpSearch.test( sData ) )
    +				{
    +					oSettings.aiDisplay.splice( i, 1 );
    +					iIndexCorrector++;
    +				}
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Filter the data table based on user input and draw the table
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {string} sInput string to filter on
    +		 *  @param {int} iForce optional - force a research of the master array (1) or not (undefined or 0)
    +		 *  @param {bool} bRegex treat as a regular expression or not
    +		 *  @param {bool} bSmart perform smart filtering or not
    +		 *  @param {bool} bCaseInsensitive Do case insenstive matching or not
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive )
    +		{
    +			var i;
    +			var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
    +			var oPrevSearch = oSettings.oPreviousSearch;
    +			
    +			/* Check if we are forcing or not - optional parameter */
    +			if ( !iForce )
    +			{
    +				iForce = 0;
    +			}
    +			
    +			/* Need to take account of custom filtering functions - always filter */
    +			if ( DataTable.ext.afnFiltering.length !== 0 )
    +			{
    +				iForce = 1;
    +			}
    +			
    +			/*
    +			 * If the input is blank - we want the full data set
    +			 */
    +			if ( sInput.length <= 0 )
    +			{
    +				oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
    +				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
    +			}
    +			else
    +			{
    +				/*
    +				 * We are starting a new search or the new search string is smaller 
    +				 * then the old one (i.e. delete). Search from the master array
    +			 	 */
    +				if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length ||
    +					   oPrevSearch.sSearch.length > sInput.length || iForce == 1 ||
    +					   sInput.indexOf(oPrevSearch.sSearch) !== 0 )
    +				{
    +					/* Nuke the old display array - we are going to rebuild it */
    +					oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
    +					
    +					/* Force a rebuild of the search array */
    +					_fnBuildSearchArray( oSettings, 1 );
    +					
    +					/* Search through all records to populate the search array
    +					 * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 
    +					 * mapping
    +					 */
    +					for ( i=0 ; i<oSettings.aiDisplayMaster.length ; i++ )
    +					{
    +						if ( rpSearch.test(oSettings.asDataSearch[i]) )
    +						{
    +							oSettings.aiDisplay.push( oSettings.aiDisplayMaster[i] );
    +						}
    +					}
    +			  }
    +			  else
    +				{
    +			  	/* Using old search array - refine it - do it this way for speed
    +			  	 * Don't have to search the whole master array again
    +					 */
    +			  	var iIndexCorrector = 0;
    +			  	
    +			  	/* Search the current results */
    +			  	for ( i=0 ; i<oSettings.asDataSearch.length ; i++ )
    +					{
    +			  		if ( ! rpSearch.test(oSettings.asDataSearch[i]) )
    +						{
    +			  			oSettings.aiDisplay.splice( i-iIndexCorrector, 1 );
    +			  			iIndexCorrector++;
    +			  		}
    +			  	}
    +			  }
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Create an array which can be quickly search through
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} iMaster use the master data array - optional
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnBuildSearchArray ( oSettings, iMaster )
    +		{
    +			if ( !oSettings.oFeatures.bServerSide )
    +			{
    +				/* Clear out the old data */
    +				oSettings.asDataSearch = [];
    +		
    +				var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
    +				var aiIndex = (iMaster===1) ?
    +				 	oSettings.aiDisplayMaster :
    +				 	oSettings.aiDisplay;
    +				
    +				for ( var i=0, iLen=aiIndex.length ; i<iLen ; i++ )
    +				{
    +					oSettings.asDataSearch[i] = _fnBuildSearchRow(
    +						oSettings,
    +						_fnGetRowData( oSettings, aiIndex[i], 'filter', aiFilterColumns )
    +					);
    +				}
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Create a searchable string from a single data row
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {array} aData Row data array to use for the data to search
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnBuildSearchRow( oSettings, aData )
    +		{
    +			var sSearch = aData.join('  ');
    +			
    +			/* If it looks like there is an HTML entity in the string, attempt to decode it */
    +			if ( sSearch.indexOf('&') !== -1 )
    +			{
    +				sSearch = $('<div>').html(sSearch).text();
    +			}
    +			
    +			// Strip newline characters
    +			return sSearch.replace( /[\n\r]/g, " " );
    +		}
    +		
    +		/**
    +		 * Build a regular expression object suitable for searching a table
    +		 *  @param {string} sSearch string to search for
    +		 *  @param {bool} bRegex treat as a regular expression or not
    +		 *  @param {bool} bSmart perform smart filtering or not
    +		 *  @param {bool} bCaseInsensitive Do case insensitive matching or not
    +		 *  @returns {RegExp} constructed object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive )
    +		{
    +			var asSearch, sRegExpString;
    +			
    +			if ( bSmart )
    +			{
    +				/* Generate the regular expression to use. Something along the lines of:
    +				 * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$
    +				 */
    +				asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' );
    +				sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$';
    +				return new RegExp( sRegExpString, bCaseInsensitive ? "i" : "" );
    +			}
    +			else
    +			{
    +				sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch );
    +				return new RegExp( sSearch, bCaseInsensitive ? "i" : "" );
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Convert raw data into something that the user can search on
    +		 *  @param {string} sData data to be modified
    +		 *  @param {string} sType data type
    +		 *  @returns {string} search string
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnDataToSearch ( sData, sType )
    +		{
    +			if ( typeof DataTable.ext.ofnSearch[sType] === "function" )
    +			{
    +				return DataTable.ext.ofnSearch[sType]( sData );
    +			}
    +			else if ( sData === null )
    +			{
    +				return '';
    +			}
    +			else if ( sType == "html" )
    +			{
    +				return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" );
    +			}
    +			else if ( typeof sData === "string" )
    +			{
    +				return sData.replace(/[\r\n]/g," ");
    +			}
    +			return sData;
    +		}
    +		
    +		
    +		/**
    +		 * scape a string such that it can be used in a regular expression
    +		 *  @param {string} sVal string to escape
    +		 *  @returns {string} escaped string
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnEscapeRegex ( sVal )
    +		{
    +			var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ];
    +			var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' );
    +			return sVal.replace(reReplace, '\\$1');
    +		}
    +		
    +		
    +		/**
    +		 * Generate the node required for the info display
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns {node} Information element
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnFeatureHtmlInfo ( oSettings )
    +		{
    +			var nInfo = document.createElement( 'div' );
    +			nInfo.className = oSettings.oClasses.sInfo;
    +			
    +			/* Actions that are to be taken once only for this feature */
    +			if ( !oSettings.aanFeatures.i )
    +			{
    +				/* Add draw callback */
    +				oSettings.aoDrawCallback.push( {
    +					"fn": _fnUpdateInfo,
    +					"sName": "information"
    +				} );
    +				
    +				/* Add id */
    +				nInfo.id = oSettings.sTableId+'_info';
    +			}
    +			oSettings.nTable.setAttribute( 'aria-describedby', oSettings.sTableId+'_info' );
    +			
    +			return nInfo;
    +		}
    +		
    +		
    +		/**
    +		 * Update the information elements in the display
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnUpdateInfo ( oSettings )
    +		{
    +			/* Show information about the table */
    +			if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 )
    +			{
    +				return;
    +			}
    +			
    +			var
    +				oLang = oSettings.oLanguage,
    +				iStart = oSettings._iDisplayStart+1,
    +				iEnd = oSettings.fnDisplayEnd(),
    +				iMax = oSettings.fnRecordsTotal(),
    +				iTotal = oSettings.fnRecordsDisplay(),
    +				sOut;
    +			
    +			if ( iTotal === 0 )
    +			{
    +				/* Empty record set */
    +				sOut = oLang.sInfoEmpty;
    +			}
    +			else {
    +				/* Normal record set */
    +				sOut = oLang.sInfo;
    +			}
    +		
    +			if ( iTotal != iMax )
    +			{
    +				/* Record set after filtering */
    +				sOut += ' ' + oLang.sInfoFiltered;
    +			}
    +		
    +			// Convert the macros
    +			sOut += oLang.sInfoPostFix;
    +			sOut = _fnInfoMacros( oSettings, sOut );
    +			
    +			if ( oLang.fnInfoCallback !== null )
    +			{
    +				sOut = oLang.fnInfoCallback.call( oSettings.oInstance, 
    +					oSettings, iStart, iEnd, iMax, iTotal, sOut );
    +			}
    +			
    +			var n = oSettings.aanFeatures.i;
    +			for ( var i=0, iLen=n.length ; i<iLen ; i++ )
    +			{
    +				$(n[i]).html( sOut );
    +			}
    +		}
    +		
    +		
    +		function _fnInfoMacros ( oSettings, str )
    +		{
    +			var
    +				iStart = oSettings._iDisplayStart+1,
    +				sStart = oSettings.fnFormatNumber( iStart ),
    +				iEnd = oSettings.fnDisplayEnd(),
    +				sEnd = oSettings.fnFormatNumber( iEnd ),
    +				iTotal = oSettings.fnRecordsDisplay(),
    +				sTotal = oSettings.fnFormatNumber( iTotal ),
    +				iMax = oSettings.fnRecordsTotal(),
    +				sMax = oSettings.fnFormatNumber( iMax );
    +		
    +			// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
    +			// internally
    +			if ( oSettings.oScroll.bInfinite )
    +			{
    +				sStart = oSettings.fnFormatNumber( 1 );
    +			}
    +		
    +			return str.
    +				replace(/_START_/g, sStart).
    +				replace(/_END_/g,   sEnd).
    +				replace(/_TOTAL_/g, sTotal).
    +				replace(/_MAX_/g,   sMax);
    +		}
    +		
    +		
    +		
    +		/**
    +		 * Draw the table for the first time, adding all required features
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnInitialise ( oSettings )
    +		{
    +			var i, iLen, iAjaxStart=oSettings.iInitDisplayStart;
    +			
    +			/* Ensure that the table data is fully initialised */
    +			if ( oSettings.bInitialised === false )
    +			{
    +				setTimeout( function(){ _fnInitialise( oSettings ); }, 200 );
    +				return;
    +			}
    +			
    +			/* Show the display HTML options */
    +			_fnAddOptionsHtml( oSettings );
    +			
    +			/* Build and draw the header / footer for the table */
    +			_fnBuildHead( oSettings );
    +			_fnDrawHead( oSettings, oSettings.aoHeader );
    +			if ( oSettings.nTFoot )
    +			{
    +				_fnDrawHead( oSettings, oSettings.aoFooter );
    +			}
    +		
    +			/* Okay to show that something is going on now */
    +			_fnProcessingDisplay( oSettings, true );
    +			
    +			/* Calculate sizes for columns */
    +			if ( oSettings.oFeatures.bAutoWidth )
    +			{
    +				_fnCalculateColumnWidths( oSettings );
    +			}
    +			
    +			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +			{
    +				if ( oSettings.aoColumns[i].sWidth !== null )
    +				{
    +					oSettings.aoColumns[i].nTh.style.width = _fnStringToCss( oSettings.aoColumns[i].sWidth );
    +				}
    +			}
    +			
    +			/* If there is default sorting required - let's do it. The sort function will do the
    +			 * drawing for us. Otherwise we draw the table regardless of the Ajax source - this allows
    +			 * the table to look initialised for Ajax sourcing data (show 'loading' message possibly)
    +			 */
    +			if ( oSettings.oFeatures.bSort )
    +			{
    +				_fnSort( oSettings );
    +			}
    +			else if ( oSettings.oFeatures.bFilter )
    +			{
    +				_fnFilterComplete( oSettings, oSettings.oPreviousSearch );
    +			}
    +			else
    +			{
    +				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
    +				_fnCalculateEnd( oSettings );
    +				_fnDraw( oSettings );
    +			}
    +			
    +			/* if there is an ajax source load the data */
    +			if ( oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
    +			{
    +				var aoData = [];
    +				_fnServerParams( oSettings, aoData );
    +				oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData, function(json) {
    +					var aData = (oSettings.sAjaxDataProp !== "") ?
    +					 	_fnGetObjectDataFn( oSettings.sAjaxDataProp )(json) : json;
    +		
    +					/* Got the data - add it to the table */
    +					for ( i=0 ; i<aData.length ; i++ )
    +					{
    +						_fnAddData( oSettings, aData[i] );
    +					}
    +					
    +					/* Reset the init display for cookie saving. We've already done a filter, and
    +					 * therefore cleared it before. So we need to make it appear 'fresh'
    +					 */
    +					oSettings.iInitDisplayStart = iAjaxStart;
    +					
    +					if ( oSettings.oFeatures.bSort )
    +					{
    +						_fnSort( oSettings );
    +					}
    +					else
    +					{
    +						oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
    +						_fnCalculateEnd( oSettings );
    +						_fnDraw( oSettings );
    +					}
    +					
    +					_fnProcessingDisplay( oSettings, false );
    +					_fnInitComplete( oSettings, json );
    +				}, oSettings );
    +				return;
    +			}
    +			
    +			/* Server-side processing initialisation complete is done at the end of _fnDraw */
    +			if ( !oSettings.oFeatures.bServerSide )
    +			{
    +				_fnProcessingDisplay( oSettings, false );
    +				_fnInitComplete( oSettings );
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Draw the table for the first time, adding all required features
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {object} [json] JSON from the server that completed the table, if using Ajax source
    +		 *    with client-side processing (optional)
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnInitComplete ( oSettings, json )
    +		{
    +			oSettings._bInitComplete = true;
    +			_fnCallbackFire( oSettings, 'aoInitComplete', 'init', [oSettings, json] );
    +		}
    +		
    +		
    +		/**
    +		 * Language compatibility - when certain options are given, and others aren't, we
    +		 * need to duplicate the values over, in order to provide backwards compatibility
    +		 * with older language files.
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnLanguageCompat( oLanguage )
    +		{
    +			var oDefaults = DataTable.defaults.oLanguage;
    +		
    +			/* Backwards compatibility - if there is no sEmptyTable given, then use the same as
    +			 * sZeroRecords - assuming that is given.
    +			 */
    +			if ( !oLanguage.sEmptyTable && oLanguage.sZeroRecords &&
    +				oDefaults.sEmptyTable === "No data available in table" )
    +			{
    +				_fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' );
    +			}
    +		
    +			/* Likewise with loading records */
    +			if ( !oLanguage.sLoadingRecords && oLanguage.sZeroRecords &&
    +				oDefaults.sLoadingRecords === "Loading..." )
    +			{
    +				_fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' );
    +			}
    +		}
    +		
    +		
    +		
    +		/**
    +		 * Generate the node required for user display length changing
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns {node} Display length feature node
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnFeatureHtmlLength ( oSettings )
    +		{
    +			if ( oSettings.oScroll.bInfinite )
    +			{
    +				return null;
    +			}
    +			
    +			/* This can be overruled by not using the _MENU_ var/macro in the language variable */
    +			var sName = 'name="'+oSettings.sTableId+'_length"';
    +			var sStdMenu = '<select size="1" '+sName+'>';
    +			var i, iLen;
    +			var aLengthMenu = oSettings.aLengthMenu;
    +			
    +			if ( aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' && 
    +					typeof aLengthMenu[1] === 'object' )
    +			{
    +				for ( i=0, iLen=aLengthMenu[0].length ; i<iLen ; i++ )
    +				{
    +					sStdMenu += '<option value="'+aLengthMenu[0][i]+'">'+aLengthMenu[1][i]+'</option>';
    +				}
    +			}
    +			else
    +			{
    +				for ( i=0, iLen=aLengthMenu.length ; i<iLen ; i++ )
    +				{
    +					sStdMenu += '<option value="'+aLengthMenu[i]+'">'+aLengthMenu[i]+'</option>';
    +				}
    +			}
    +			sStdMenu += '</select>';
    +			
    +			var nLength = document.createElement( 'div' );
    +			if ( !oSettings.aanFeatures.l )
    +			{
    +				nLength.id = oSettings.sTableId+'_length';
    +			}
    +			nLength.className = oSettings.oClasses.sLength;
    +			nLength.innerHTML = '<label>'+oSettings.oLanguage.sLengthMenu.replace( '_MENU_', sStdMenu )+'</label>';
    +			
    +			/*
    +			 * Set the length to the current display length - thanks to Andrea Pavlovic for this fix,
    +			 * and Stefan Skopnik for fixing the fix!
    +			 */
    +			$('select option[value="'+oSettings._iDisplayLength+'"]', nLength).attr("selected", true);
    +			
    +			$('select', nLength).bind( 'change.DT', function(e) {
    +				var iVal = $(this).val();
    +				
    +				/* Update all other length options for the new display */
    +				var n = oSettings.aanFeatures.l;
    +				for ( i=0, iLen=n.length ; i<iLen ; i++ )
    +				{
    +					if ( n[i] != this.parentNode )
    +					{
    +						$('select', n[i]).val( iVal );
    +					}
    +				}
    +				
    +				/* Redraw the table */
    +				oSettings._iDisplayLength = parseInt(iVal, 10);
    +				_fnCalculateEnd( oSettings );
    +				
    +				/* If we have space to show extra rows (backing up from the end point - then do so */
    +				if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() )
    +				{
    +					oSettings._iDisplayStart = oSettings.fnDisplayEnd() - oSettings._iDisplayLength;
    +					if ( oSettings._iDisplayStart < 0 )
    +					{
    +						oSettings._iDisplayStart = 0;
    +					}
    +				}
    +				
    +				if ( oSettings._iDisplayLength == -1 )
    +				{
    +					oSettings._iDisplayStart = 0;
    +				}
    +				
    +				_fnDraw( oSettings );
    +			} );
    +		
    +		
    +			$('select', nLength).attr('aria-controls', oSettings.sTableId);
    +			
    +			return nLength;
    +		}
    +		
    +		
    +		/**
    +		 * Recalculate the end point based on the start point
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnCalculateEnd( oSettings )
    +		{
    +			if ( oSettings.oFeatures.bPaginate === false )
    +			{
    +				oSettings._iDisplayEnd = oSettings.aiDisplay.length;
    +			}
    +			else
    +			{
    +				/* Set the end point of the display - based on how many elements there are
    +				 * still to display
    +				 */
    +				if ( oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length ||
    +					   oSettings._iDisplayLength == -1 )
    +				{
    +					oSettings._iDisplayEnd = oSettings.aiDisplay.length;
    +				}
    +				else
    +				{
    +					oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength;
    +				}
    +			}
    +		}
    +		
    +		
    +		
    +		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    +		 * Note that most of the paging logic is done in 
    +		 * DataTable.ext.oPagination
    +		 */
    +		
    +		/**
    +		 * Generate the node required for default pagination
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns {node} Pagination feature node
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnFeatureHtmlPaginate ( oSettings )
    +		{
    +			if ( oSettings.oScroll.bInfinite )
    +			{
    +				return null;
    +			}
    +			
    +			var nPaginate = document.createElement( 'div' );
    +			nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType;
    +			
    +			DataTable.ext.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate, 
    +				function( oSettings ) {
    +					_fnCalculateEnd( oSettings );
    +					_fnDraw( oSettings );
    +				}
    +			);
    +			
    +			/* Add a draw callback for the pagination on first instance, to update the paging display */
    +			if ( !oSettings.aanFeatures.p )
    +			{
    +				oSettings.aoDrawCallback.push( {
    +					"fn": function( oSettings ) {
    +						DataTable.ext.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) {
    +							_fnCalculateEnd( oSettings );
    +							_fnDraw( oSettings );
    +						} );
    +					},
    +					"sName": "pagination"
    +				} );
    +			}
    +			return nPaginate;
    +		}
    +		
    +		
    +		/**
    +		 * Alter the display settings to change the page
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
    +		 *    or page number to jump to (integer)
    +		 *  @returns {bool} true page has changed, false - no change (no effect) eg 'first' on page 1
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnPageChange ( oSettings, mAction )
    +		{
    +			var iOldStart = oSettings._iDisplayStart;
    +			
    +			if ( typeof mAction === "number" )
    +			{
    +				oSettings._iDisplayStart = mAction * oSettings._iDisplayLength;
    +				if ( oSettings._iDisplayStart > oSettings.fnRecordsDisplay() )
    +				{
    +					oSettings._iDisplayStart = 0;
    +				}
    +			}
    +			else if ( mAction == "first" )
    +			{
    +				oSettings._iDisplayStart = 0;
    +			}
    +			else if ( mAction == "previous" )
    +			{
    +				oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ?
    +					oSettings._iDisplayStart - oSettings._iDisplayLength :
    +					0;
    +				
    +				/* Correct for under-run */
    +				if ( oSettings._iDisplayStart < 0 )
    +				{
    +				  oSettings._iDisplayStart = 0;
    +				}
    +			}
    +			else if ( mAction == "next" )
    +			{
    +				if ( oSettings._iDisplayLength >= 0 )
    +				{
    +					/* Make sure we are not over running the display array */
    +					if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() )
    +					{
    +						oSettings._iDisplayStart += oSettings._iDisplayLength;
    +					}
    +				}
    +				else
    +				{
    +					oSettings._iDisplayStart = 0;
    +				}
    +			}
    +			else if ( mAction == "last" )
    +			{
    +				if ( oSettings._iDisplayLength >= 0 )
    +				{
    +					var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1;
    +					oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength;
    +				}
    +				else
    +				{
    +					oSettings._iDisplayStart = 0;
    +				}
    +			}
    +			else
    +			{
    +				_fnLog( oSettings, 0, "Unknown paging action: "+mAction );
    +			}
    +			$(oSettings.oInstance).trigger('page', oSettings);
    +			
    +			return iOldStart != oSettings._iDisplayStart;
    +		}
    +		
    +		
    +		
    +		/**
    +		 * Generate the node required for the processing node
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns {node} Processing element
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnFeatureHtmlProcessing ( oSettings )
    +		{
    +			var nProcessing = document.createElement( 'div' );
    +			
    +			if ( !oSettings.aanFeatures.r )
    +			{
    +				nProcessing.id = oSettings.sTableId+'_processing';
    +			}
    +			nProcessing.innerHTML = oSettings.oLanguage.sProcessing;
    +			nProcessing.className = oSettings.oClasses.sProcessing;
    +			oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable );
    +			
    +			return nProcessing;
    +		}
    +		
    +		
    +		/**
    +		 * Display or hide the processing indicator
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {bool} bShow Show the processing indicator (true) or not (false)
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnProcessingDisplay ( oSettings, bShow )
    +		{
    +			if ( oSettings.oFeatures.bProcessing )
    +			{
    +				var an = oSettings.aanFeatures.r;
    +				for ( var i=0, iLen=an.length ; i<iLen ; i++ )
    +				{
    +					an[i].style.visibility = bShow ? "visible" : "hidden";
    +				}
    +			}
    +		
    +			$(oSettings.oInstance).trigger('processing', [oSettings, bShow]);
    +		}
    +		
    +		/**
    +		 * Add any control elements for the table - specifically scrolling
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns {node} Node to add to the DOM
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnFeatureHtmlTable ( oSettings )
    +		{
    +			/* Check if scrolling is enabled or not - if not then leave the DOM unaltered */
    +			if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
    +			{
    +				return oSettings.nTable;
    +			}
    +			
    +			/*
    +			 * The HTML structure that we want to generate in this function is:
    +			 *  div - nScroller
    +			 *    div - nScrollHead
    +			 *      div - nScrollHeadInner
    +			 *        table - nScrollHeadTable
    +			 *          thead - nThead
    +			 *    div - nScrollBody
    +			 *      table - oSettings.nTable
    +			 *        thead - nTheadSize
    +			 *        tbody - nTbody
    +			 *    div - nScrollFoot
    +			 *      div - nScrollFootInner
    +			 *        table - nScrollFootTable
    +			 *          tfoot - nTfoot
    +			 */
    +			var
    +			 	nScroller = document.createElement('div'),
    +			 	nScrollHead = document.createElement('div'),
    +			 	nScrollHeadInner = document.createElement('div'),
    +			 	nScrollBody = document.createElement('div'),
    +			 	nScrollFoot = document.createElement('div'),
    +			 	nScrollFootInner = document.createElement('div'),
    +			 	nScrollHeadTable = oSettings.nTable.cloneNode(false),
    +			 	nScrollFootTable = oSettings.nTable.cloneNode(false),
    +				nThead = oSettings.nTable.getElementsByTagName('thead')[0],
    +			 	nTfoot = oSettings.nTable.getElementsByTagName('tfoot').length === 0 ? null : 
    +					oSettings.nTable.getElementsByTagName('tfoot')[0],
    +				oClasses = oSettings.oClasses;
    +			
    +			nScrollHead.appendChild( nScrollHeadInner );
    +			nScrollFoot.appendChild( nScrollFootInner );
    +			nScrollBody.appendChild( oSettings.nTable );
    +			nScroller.appendChild( nScrollHead );
    +			nScroller.appendChild( nScrollBody );
    +			nScrollHeadInner.appendChild( nScrollHeadTable );
    +			nScrollHeadTable.appendChild( nThead );
    +			if ( nTfoot !== null )
    +			{
    +				nScroller.appendChild( nScrollFoot );
    +				nScrollFootInner.appendChild( nScrollFootTable );
    +				nScrollFootTable.appendChild( nTfoot );
    +			}
    +			
    +			nScroller.className = oClasses.sScrollWrapper;
    +			nScrollHead.className = oClasses.sScrollHead;
    +			nScrollHeadInner.className = oClasses.sScrollHeadInner;
    +			nScrollBody.className = oClasses.sScrollBody;
    +			nScrollFoot.className = oClasses.sScrollFoot;
    +			nScrollFootInner.className = oClasses.sScrollFootInner;
    +			
    +			if ( oSettings.oScroll.bAutoCss )
    +			{
    +				nScrollHead.style.overflow = "hidden";
    +				nScrollHead.style.position = "relative";
    +				nScrollFoot.style.overflow = "hidden";
    +				nScrollBody.style.overflow = "auto";
    +			}
    +			
    +			nScrollHead.style.border = "0";
    +			nScrollHead.style.width = "100%";
    +			nScrollFoot.style.border = "0";
    +			nScrollHeadInner.style.width = oSettings.oScroll.sXInner !== "" ?
    +				oSettings.oScroll.sXInner : "100%"; /* will be overwritten */
    +			
    +			/* Modify attributes to respect the clones */
    +			nScrollHeadTable.removeAttribute('id');
    +			nScrollHeadTable.style.marginLeft = "0";
    +			oSettings.nTable.style.marginLeft = "0";
    +			if ( nTfoot !== null )
    +			{
    +				nScrollFootTable.removeAttribute('id');
    +				nScrollFootTable.style.marginLeft = "0";
    +			}
    +			
    +			/* Move caption elements from the body to the header, footer or leave where it is
    +			 * depending on the configuration. Note that the DTD says there can be only one caption */
    +			var nCaption = $(oSettings.nTable).children('caption');
    +			if ( nCaption.length > 0 )
    +			{
    +				nCaption = nCaption[0];
    +				if ( nCaption._captionSide === "top" )
    +				{
    +					nScrollHeadTable.appendChild( nCaption );
    +				}
    +				else if ( nCaption._captionSide === "bottom" && nTfoot )
    +				{
    +					nScrollFootTable.appendChild( nCaption );
    +				}
    +			}
    +			
    +			/*
    +			 * Sizing
    +			 */
    +			/* When x-scrolling add the width and a scroller to move the header with the body */
    +			if ( oSettings.oScroll.sX !== "" )
    +			{
    +				nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX );
    +				nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX );
    +				
    +				if ( nTfoot !== null )
    +				{
    +					nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX );	
    +				}
    +				
    +				/* When the body is scrolled, then we also want to scroll the headers */
    +				$(nScrollBody).scroll( function (e) {
    +					nScrollHead.scrollLeft = this.scrollLeft;
    +					
    +					if ( nTfoot !== null )
    +					{
    +						nScrollFoot.scrollLeft = this.scrollLeft;
    +					}
    +				} );
    +			}
    +			
    +			/* When yscrolling, add the height */
    +			if ( oSettings.oScroll.sY !== "" )
    +			{
    +				nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY );
    +			}
    +			
    +			/* Redraw - align columns across the tables */
    +			oSettings.aoDrawCallback.push( {
    +				"fn": _fnScrollDraw,
    +				"sName": "scrolling"
    +			} );
    +			
    +			/* Infinite scrolling event handlers */
    +			if ( oSettings.oScroll.bInfinite )
    +			{
    +				$(nScrollBody).scroll( function() {
    +					/* Use a blocker to stop scrolling from loading more data while other data is still loading */
    +					if ( !oSettings.bDrawing && $(this).scrollTop() !== 0 )
    +					{
    +						/* Check if we should load the next data set */
    +						if ( $(this).scrollTop() + $(this).height() > 
    +							$(oSettings.nTable).height() - oSettings.oScroll.iLoadGap )
    +						{
    +							/* Only do the redraw if we have to - we might be at the end of the data */
    +							if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() )
    +							{
    +								_fnPageChange( oSettings, 'next' );
    +								_fnCalculateEnd( oSettings );
    +								_fnDraw( oSettings );
    +							}
    +						}
    +					}
    +				} );
    +			}
    +			
    +			oSettings.nScrollHead = nScrollHead;
    +			oSettings.nScrollFoot = nScrollFoot;
    +			
    +			return nScroller;
    +		}
    +		
    +		
    +		/**
    +		 * Update the various tables for resizing. It's a bit of a pig this function, but
    +		 * basically the idea to:
    +		 *   1. Re-create the table inside the scrolling div
    +		 *   2. Take live measurements from the DOM
    +		 *   3. Apply the measurements
    +		 *   4. Clean up
    +		 *  @param {object} o dataTables settings object
    +		 *  @returns {node} Node to add to the DOM
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnScrollDraw ( o )
    +		{
    +			var
    +				nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0],
    +				nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
    +				nScrollBody = o.nTable.parentNode,
    +				i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis,
    +				nTheadSize, nTfootSize,
    +				iWidth, aApplied=[], aAppliedFooter=[], iSanityWidth,
    +				nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null,
    +				nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null,
    +				ie67 = o.oBrowser.bScrollOversize,
    +				zeroOut = function(nSizer) {
    +					oStyle = nSizer.style;
    +					oStyle.paddingTop = "0";
    +					oStyle.paddingBottom = "0";
    +					oStyle.borderTopWidth = "0";
    +					oStyle.borderBottomWidth = "0";
    +					oStyle.height = 0;
    +				};
    +			
    +			/*
    +			 * 1. Re-create the table inside the scrolling div
    +			 */
    +			
    +			/* Remove the old minimised thead and tfoot elements in the inner table */
    +			$(o.nTable).children('thead, tfoot').remove();
    +		
    +			/* Clone the current header and footer elements and then place it into the inner table */
    +			nTheadSize = $(o.nTHead).clone()[0];
    +			o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] );
    +			anHeadToSize = o.nTHead.getElementsByTagName('tr');
    +			anHeadSizers = nTheadSize.getElementsByTagName('tr');
    +			
    +			if ( o.nTFoot !== null )
    +			{
    +				nTfootSize = $(o.nTFoot).clone()[0];
    +				o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] );
    +				anFootToSize = o.nTFoot.getElementsByTagName('tr');
    +				anFootSizers = nTfootSize.getElementsByTagName('tr');
    +			}
    +			
    +			/*
    +			 * 2. Take live measurements from the DOM - do not alter the DOM itself!
    +			 */
    +			
    +			/* Remove old sizing and apply the calculated column widths
    +			 * Get the unique column headers in the newly created (cloned) header. We want to apply the
    +			 * calculated sizes to this header
    +			 */
    +			if ( o.oScroll.sX === "" )
    +			{
    +				nScrollBody.style.width = '100%';
    +				nScrollHeadInner.parentNode.style.width = '100%';
    +			}
    +			
    +			var nThs = _fnGetUniqueThs( o, nTheadSize );
    +			for ( i=0, iLen=nThs.length ; i<iLen ; i++ )
    +			{
    +				iVis = _fnVisibleToColumnIndex( o, i );
    +				nThs[i].style.width = o.aoColumns[iVis].sWidth;
    +			}
    +			
    +			if ( o.nTFoot !== null )
    +			{
    +				_fnApplyToChildren( function(n) {
    +					n.style.width = "";
    +				}, anFootSizers );
    +			}
    +		
    +			// If scroll collapse is enabled, when we put the headers back into the body for sizing, we
    +			// will end up forcing the scrollbar to appear, making our measurements wrong for when we
    +			// then hide it (end of this function), so add the header height to the body scroller.
    +			if ( o.oScroll.bCollapse && o.oScroll.sY !== "" )
    +			{
    +				nScrollBody.style.height = (nScrollBody.offsetHeight + o.nTHead.offsetHeight)+"px";
    +			}
    +			
    +			/* Size the table as a whole */
    +			iSanityWidth = $(o.nTable).outerWidth();
    +			if ( o.oScroll.sX === "" )
    +			{
    +				/* No x scrolling */
    +				o.nTable.style.width = "100%";
    +				
    +				/* I know this is rubbish - but IE7 will make the width of the table when 100% include
    +				 * the scrollbar - which is shouldn't. When there is a scrollbar we need to take this
    +				 * into account.
    +				 */
    +				if ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight || 
    +					$(nScrollBody).css('overflow-y') == "scroll")  )
    +				{
    +					o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth);
    +				}
    +			}
    +			else
    +			{
    +				if ( o.oScroll.sXInner !== "" )
    +				{
    +					/* x scroll inner has been given - use it */
    +					o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner);
    +				}
    +				else if ( iSanityWidth == $(nScrollBody).width() &&
    +				   $(nScrollBody).height() < $(o.nTable).height() )
    +				{
    +					/* There is y-scrolling - try to take account of the y scroll bar */
    +					o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth );
    +					if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth )
    +					{
    +						/* Not possible to take account of it */
    +						o.nTable.style.width = _fnStringToCss( iSanityWidth );
    +					}
    +				}
    +				else
    +				{
    +					/* All else fails */
    +					o.nTable.style.width = _fnStringToCss( iSanityWidth );
    +				}
    +			}
    +			
    +			/* Recalculate the sanity width - now that we've applied the required width, before it was
    +			 * a temporary variable. This is required because the column width calculation is done
    +			 * before this table DOM is created.
    +			 */
    +			iSanityWidth = $(o.nTable).outerWidth();
    +			
    +			/* We want the hidden header to have zero height, so remove padding and borders. Then
    +			 * set the width based on the real headers
    +			 */
    +			
    +			// Apply all styles in one pass. Invalidates layout only once because we don't read any 
    +			// DOM properties.
    +			_fnApplyToChildren( zeroOut, anHeadSizers );
    +			 
    +			// Read all widths in next pass. Forces layout only once because we do not change 
    +			// any DOM properties.
    +			_fnApplyToChildren( function(nSizer) {
    +				aApplied.push( _fnStringToCss( $(nSizer).width() ) );
    +			}, anHeadSizers );
    +			 
    +			// Apply all widths in final pass. Invalidates layout only once because we do not
    +			// read any DOM properties.
    +			_fnApplyToChildren( function(nToSize, i) {
    +				nToSize.style.width = aApplied[i];
    +			}, anHeadToSize );
    +		
    +			$(anHeadSizers).height(0);
    +			
    +			/* Same again with the footer if we have one */
    +			if ( o.nTFoot !== null )
    +			{
    +				_fnApplyToChildren( zeroOut, anFootSizers );
    +				 
    +				_fnApplyToChildren( function(nSizer) {
    +					aAppliedFooter.push( _fnStringToCss( $(nSizer).width() ) );
    +				}, anFootSizers );
    +				 
    +				_fnApplyToChildren( function(nToSize, i) {
    +					nToSize.style.width = aAppliedFooter[i];
    +				}, anFootToSize );
    +		
    +				$(anFootSizers).height(0);
    +			}
    +			
    +			/*
    +			 * 3. Apply the measurements
    +			 */
    +			
    +			/* "Hide" the header and footer that we used for the sizing. We want to also fix their width
    +			 * to what they currently are
    +			 */
    +			_fnApplyToChildren( function(nSizer, i) {
    +				nSizer.innerHTML = "";
    +				nSizer.style.width = aApplied[i];
    +			}, anHeadSizers );
    +			
    +			if ( o.nTFoot !== null )
    +			{
    +				_fnApplyToChildren( function(nSizer, i) {
    +					nSizer.innerHTML = "";
    +					nSizer.style.width = aAppliedFooter[i];
    +				}, anFootSizers );
    +			}
    +			
    +			/* Sanity check that the table is of a sensible width. If not then we are going to get
    +			 * misalignment - try to prevent this by not allowing the table to shrink below its min width
    +			 */
    +			if ( $(o.nTable).outerWidth() < iSanityWidth )
    +			{
    +				/* The min width depends upon if we have a vertical scrollbar visible or not */
    +				var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight || 
    +					$(nScrollBody).css('overflow-y') == "scroll")) ?
    +						iSanityWidth+o.oScroll.iBarWidth : iSanityWidth;
    +				
    +				/* IE6/7 are a law unto themselves... */
    +				if ( ie67 && (nScrollBody.scrollHeight > 
    +					nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll")  )
    +				{
    +					o.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth );
    +				}
    +				
    +				/* Apply the calculated minimum width to the table wrappers */
    +				nScrollBody.style.width = _fnStringToCss( iCorrection );
    +				o.nScrollHead.style.width = _fnStringToCss( iCorrection );
    +				
    +				if ( o.nTFoot !== null )
    +				{
    +					o.nScrollFoot.style.width = _fnStringToCss( iCorrection );
    +				}
    +				
    +				/* And give the user a warning that we've stopped the table getting too small */
    +				if ( o.oScroll.sX === "" )
    +				{
    +					_fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
    +						" misalignment. The table has been drawn at its minimum possible width." );
    +				}
    +				else if ( o.oScroll.sXInner !== "" )
    +				{
    +					_fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
    +						" misalignment. Increase the sScrollXInner value or remove it to allow automatic"+
    +						" calculation" );
    +				}
    +			}
    +			else
    +			{
    +				nScrollBody.style.width = _fnStringToCss( '100%' );
    +				o.nScrollHead.style.width = _fnStringToCss( '100%' );
    +				
    +				if ( o.nTFoot !== null )
    +				{
    +					o.nScrollFoot.style.width = _fnStringToCss( '100%' );
    +				}
    +			}
    +			
    +			
    +			/*
    +			 * 4. Clean up
    +			 */
    +			if ( o.oScroll.sY === "" )
    +			{
    +				/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
    +				 * the scrollbar height from the visible display, rather than adding it on. We need to
    +				 * set the height in order to sort this. Don't want to do it in any other browsers.
    +				 */
    +				if ( ie67 )
    +				{
    +					nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth );
    +				}
    +			}
    +			
    +			if ( o.oScroll.sY !== "" && o.oScroll.bCollapse )
    +			{
    +				nScrollBody.style.height = _fnStringToCss( o.oScroll.sY );
    +				
    +				var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ?
    +				 	o.oScroll.iBarWidth : 0;
    +				if ( o.nTable.offsetHeight < nScrollBody.offsetHeight )
    +				{
    +					nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra );
    +				}
    +			}
    +			
    +			/* Finally set the width's of the header and footer tables */
    +			var iOuterWidth = $(o.nTable).outerWidth();
    +			nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth );
    +			nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth );
    +		
    +			// Figure out if there are scrollbar present - if so then we need a the header and footer to
    +			// provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
    +			var bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == "scroll";
    +			nScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
    +			
    +			if ( o.nTFoot !== null )
    +			{
    +				nScrollFootTable.style.width = _fnStringToCss( iOuterWidth );
    +				nScrollFootInner.style.width = _fnStringToCss( iOuterWidth );
    +				nScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
    +			}
    +		
    +			/* Adjust the position of the header in case we loose the y-scrollbar */
    +			$(nScrollBody).scroll();
    +			
    +			/* If sorting or filtering has occurred, jump the scrolling back to the top */
    +			if ( o.bSorted || o.bFiltered )
    +			{
    +				nScrollBody.scrollTop = 0;
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Apply a given function to the display child nodes of an element array (typically
    +		 * TD children of TR rows
    +		 *  @param {function} fn Method to apply to the objects
    +		 *  @param array {nodes} an1 List of elements to look through for display children
    +		 *  @param array {nodes} an2 Another list (identical structure to the first) - optional
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnApplyToChildren( fn, an1, an2 )
    +		{
    +			var index=0, i=0, iLen=an1.length;
    +			var nNode1, nNode2;
    +		
    +			while ( i < iLen )
    +			{
    +				nNode1 = an1[i].firstChild;
    +				nNode2 = an2 ? an2[i].firstChild : null;
    +				while ( nNode1 )
    +				{
    +					if ( nNode1.nodeType === 1 )
    +					{
    +						if ( an2 )
    +						{
    +							fn( nNode1, nNode2, index );
    +						}
    +						else
    +						{
    +							fn( nNode1, index );
    +						}
    +						index++;
    +					}
    +					nNode1 = nNode1.nextSibling;
    +					nNode2 = an2 ? nNode2.nextSibling : null;
    +				}
    +				i++;
    +			}
    +		}
    +		
    +		/**
    +		 * Convert a CSS unit width to pixels (e.g. 2em)
    +		 *  @param {string} sWidth width to be converted
    +		 *  @param {node} nParent parent to get the with for (required for relative widths) - optional
    +		 *  @returns {int} iWidth width in pixels
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnConvertToWidth ( sWidth, nParent )
    +		{
    +			if ( !sWidth || sWidth === null || sWidth === '' )
    +			{
    +				return 0;
    +			}
    +			
    +			if ( !nParent )
    +			{
    +				nParent = document.body;
    +			}
    +			
    +			var iWidth;
    +			var nTmp = document.createElement( "div" );
    +			nTmp.style.width = _fnStringToCss( sWidth );
    +			
    +			nParent.appendChild( nTmp );
    +			iWidth = nTmp.offsetWidth;
    +			nParent.removeChild( nTmp );
    +			
    +			return ( iWidth );
    +		}
    +		
    +		
    +		/**
    +		 * Calculate the width of columns for the table
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnCalculateColumnWidths ( oSettings )
    +		{
    +			var iTableWidth = oSettings.nTable.offsetWidth;
    +			var iUserInputs = 0;
    +			var iTmpWidth;
    +			var iVisibleColumns = 0;
    +			var iColums = oSettings.aoColumns.length;
    +			var i, iIndex, iCorrector, iWidth;
    +			var oHeaders = $('th', oSettings.nTHead);
    +			var widthAttr = oSettings.nTable.getAttribute('width');
    +			var nWrapper = oSettings.nTable.parentNode;
    +			
    +			/* Convert any user input sizes into pixel sizes */
    +			for ( i=0 ; i<iColums ; i++ )
    +			{
    +				if ( oSettings.aoColumns[i].bVisible )
    +				{
    +					iVisibleColumns++;
    +					
    +					if ( oSettings.aoColumns[i].sWidth !== null )
    +					{
    +						iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig, 
    +							nWrapper );
    +						if ( iTmpWidth !== null )
    +						{
    +							oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
    +						}
    +							
    +						iUserInputs++;
    +					}
    +				}
    +			}
    +			
    +			/* If the number of columns in the DOM equals the number that we have to process in 
    +			 * DataTables, then we can use the offsets that are created by the web-browser. No custom 
    +			 * sizes can be set in order for this to happen, nor scrolling used
    +			 */
    +			if ( iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums &&
    +				oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
    +			{
    +				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
    +				{
    +					iTmpWidth = $(oHeaders[i]).width();
    +					if ( iTmpWidth !== null )
    +					{
    +						oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
    +					}
    +				}
    +			}
    +			else
    +			{
    +				/* Otherwise we are going to have to do some calculations to get the width of each column.
    +				 * Construct a 1 row table with the widest node in the data, and any user defined widths,
    +				 * then insert it into the DOM and allow the browser to do all the hard work of
    +				 * calculating table widths.
    +				 */
    +				var
    +					nCalcTmp = oSettings.nTable.cloneNode( false ),
    +					nTheadClone = oSettings.nTHead.cloneNode(true),
    +					nBody = document.createElement( 'tbody' ),
    +					nTr = document.createElement( 'tr' ),
    +					nDivSizing;
    +				
    +				nCalcTmp.removeAttribute( "id" );
    +				nCalcTmp.appendChild( nTheadClone );
    +				if ( oSettings.nTFoot !== null )
    +				{
    +					nCalcTmp.appendChild( oSettings.nTFoot.cloneNode(true) );
    +					_fnApplyToChildren( function(n) {
    +						n.style.width = "";
    +					}, nCalcTmp.getElementsByTagName('tr') );
    +				}
    +				
    +				nCalcTmp.appendChild( nBody );
    +				nBody.appendChild( nTr );
    +				
    +				/* Remove any sizing that was previously applied by the styles */
    +				var jqColSizing = $('thead th', nCalcTmp);
    +				if ( jqColSizing.length === 0 )
    +				{
    +					jqColSizing = $('tbody tr:eq(0)>td', nCalcTmp);
    +				}
    +		
    +				/* Apply custom sizing to the cloned header */
    +				var nThs = _fnGetUniqueThs( oSettings, nTheadClone );
    +				iCorrector = 0;
    +				for ( i=0 ; i<iColums ; i++ )
    +				{
    +					var oColumn = oSettings.aoColumns[i];
    +					if ( oColumn.bVisible && oColumn.sWidthOrig !== null && oColumn.sWidthOrig !== "" )
    +					{
    +						nThs[i-iCorrector].style.width = _fnStringToCss( oColumn.sWidthOrig );
    +					}
    +					else if ( oColumn.bVisible )
    +					{
    +						nThs[i-iCorrector].style.width = "";
    +					}
    +					else
    +					{
    +						iCorrector++;
    +					}
    +				}
    +		
    +				/* Find the biggest td for each column and put it into the table */
    +				for ( i=0 ; i<iColums ; i++ )
    +				{
    +					if ( oSettings.aoColumns[i].bVisible )
    +					{
    +						var nTd = _fnGetWidestNode( oSettings, i );
    +						if ( nTd !== null )
    +						{
    +							nTd = nTd.cloneNode(true);
    +							if ( oSettings.aoColumns[i].sContentPadding !== "" )
    +							{
    +								nTd.innerHTML += oSettings.aoColumns[i].sContentPadding;
    +							}
    +							nTr.appendChild( nTd );
    +						}
    +					}
    +				}
    +				
    +				/* Build the table and 'display' it */
    +				nWrapper.appendChild( nCalcTmp );
    +				
    +				/* When scrolling (X or Y) we want to set the width of the table as appropriate. However,
    +				 * when not scrolling leave the table width as it is. This results in slightly different,
    +				 * but I think correct behaviour
    +				 */
    +				if ( oSettings.oScroll.sX !== "" && oSettings.oScroll.sXInner !== "" )
    +				{
    +					nCalcTmp.style.width = _fnStringToCss(oSettings.oScroll.sXInner);
    +				}
    +				else if ( oSettings.oScroll.sX !== "" )
    +				{
    +					nCalcTmp.style.width = "";
    +					if ( $(nCalcTmp).width() < nWrapper.offsetWidth )
    +					{
    +						nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
    +					}
    +				}
    +				else if ( oSettings.oScroll.sY !== "" )
    +				{
    +					nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
    +				}
    +				else if ( widthAttr )
    +				{
    +					nCalcTmp.style.width = _fnStringToCss( widthAttr );
    +				}
    +				nCalcTmp.style.visibility = "hidden";
    +				
    +				/* Scrolling considerations */
    +				_fnScrollingWidthAdjust( oSettings, nCalcTmp );
    +				
    +				/* Read the width's calculated by the browser and store them for use by the caller. We
    +				 * first of all try to use the elements in the body, but it is possible that there are
    +				 * no elements there, under which circumstances we use the header elements
    +				 */
    +				var oNodes = $("tbody tr:eq(0)", nCalcTmp).children();
    +				if ( oNodes.length === 0 )
    +				{
    +					oNodes = _fnGetUniqueThs( oSettings, $('thead', nCalcTmp)[0] );
    +				}
    +		
    +				/* Browsers need a bit of a hand when a width is assigned to any columns when 
    +				 * x-scrolling as they tend to collapse the table to the min-width, even if
    +				 * we sent the column widths. So we need to keep track of what the table width
    +				 * should be by summing the user given values, and the automatic values
    +				 */
    +				if ( oSettings.oScroll.sX !== "" )
    +				{
    +					var iTotal = 0;
    +					iCorrector = 0;
    +					for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
    +					{
    +						if ( oSettings.aoColumns[i].bVisible )
    +						{
    +							if ( oSettings.aoColumns[i].sWidthOrig === null )
    +							{
    +								iTotal += $(oNodes[iCorrector]).outerWidth();
    +							}
    +							else
    +							{
    +								iTotal += parseInt(oSettings.aoColumns[i].sWidth.replace('px',''), 10) +
    +									($(oNodes[iCorrector]).outerWidth() - $(oNodes[iCorrector]).width());
    +							}
    +							iCorrector++;
    +						}
    +					}
    +					
    +					nCalcTmp.style.width = _fnStringToCss( iTotal );
    +					oSettings.nTable.style.width = _fnStringToCss( iTotal );
    +				}
    +		
    +				iCorrector = 0;
    +				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
    +				{
    +					if ( oSettings.aoColumns[i].bVisible )
    +					{
    +						iWidth = $(oNodes[iCorrector]).width();
    +						if ( iWidth !== null && iWidth > 0 )
    +						{
    +							oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth );
    +						}
    +						iCorrector++;
    +					}
    +				}
    +		
    +				var cssWidth = $(nCalcTmp).css('width');
    +				oSettings.nTable.style.width = (cssWidth.indexOf('%') !== -1) ?
    +				    cssWidth : _fnStringToCss( $(nCalcTmp).outerWidth() );
    +				nCalcTmp.parentNode.removeChild( nCalcTmp );
    +			}
    +		
    +			if ( widthAttr )
    +			{
    +				oSettings.nTable.style.width = _fnStringToCss( widthAttr );
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Adjust a table's width to take account of scrolling
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {node} n table node
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnScrollingWidthAdjust ( oSettings, n )
    +		{
    +			if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" )
    +			{
    +				/* When y-scrolling only, we want to remove the width of the scroll bar so the table
    +				 * + scroll bar will fit into the area avaialble.
    +				 */
    +				var iOrigWidth = $(n).width();
    +				n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth );
    +			}
    +			else if ( oSettings.oScroll.sX !== "" )
    +			{
    +				/* When x-scrolling both ways, fix the table at it's current size, without adjusting */
    +				n.style.width = _fnStringToCss( $(n).outerWidth() );
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Get the widest node
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} iCol column of interest
    +		 *  @returns {node} widest table node
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnGetWidestNode( oSettings, iCol )
    +		{
    +			var iMaxIndex = _fnGetMaxLenString( oSettings, iCol );
    +			if ( iMaxIndex < 0 )
    +			{
    +				return null;
    +			}
    +		
    +			if ( oSettings.aoData[iMaxIndex].nTr === null )
    +			{
    +				var n = document.createElement('td');
    +				n.innerHTML = _fnGetCellData( oSettings, iMaxIndex, iCol, '' );
    +				return n;
    +			}
    +			return _fnGetTdNodes(oSettings, iMaxIndex)[iCol];
    +		}
    +		
    +		
    +		/**
    +		 * Get the maximum strlen for each data column
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} iCol column of interest
    +		 *  @returns {string} max string length for each column
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnGetMaxLenString( oSettings, iCol )
    +		{
    +			var iMax = -1;
    +			var iMaxIndex = -1;
    +			
    +			for ( var i=0 ; i<oSettings.aoData.length ; i++ )
    +			{
    +				var s = _fnGetCellData( oSettings, i, iCol, 'display' )+"";
    +				s = s.replace( /<.*?>/g, "" );
    +				if ( s.length > iMax )
    +				{
    +					iMax = s.length;
    +					iMaxIndex = i;
    +				}
    +			}
    +			
    +			return iMaxIndex;
    +		}
    +		
    +		
    +		/**
    +		 * Append a CSS unit (only if required) to a string
    +		 *  @param {array} aArray1 first array
    +		 *  @param {array} aArray2 second array
    +		 *  @returns {int} 0 if match, 1 if length is different, 2 if no match
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnStringToCss( s )
    +		{
    +			if ( s === null )
    +			{
    +				return "0px";
    +			}
    +			
    +			if ( typeof s == 'number' )
    +			{
    +				if ( s < 0 )
    +				{
    +					return "0px";
    +				}
    +				return s+"px";
    +			}
    +			
    +			/* Check if the last character is not 0-9 */
    +			var c = s.charCodeAt( s.length-1 );
    +			if (c < 0x30 || c > 0x39)
    +			{
    +				return s;
    +			}
    +			return s+"px";
    +		}
    +		
    +		
    +		/**
    +		 * Get the width of a scroll bar in this browser being used
    +		 *  @returns {int} width in pixels
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnScrollBarWidth ()
    +		{  
    +			var inner = document.createElement('p');
    +			var style = inner.style;
    +			style.width = "100%";
    +			style.height = "200px";
    +			style.padding = "0px";
    +			
    +			var outer = document.createElement('div');
    +			style = outer.style;
    +			style.position = "absolute";
    +			style.top = "0px";
    +			style.left = "0px";
    +			style.visibility = "hidden";
    +			style.width = "200px";
    +			style.height = "150px";
    +			style.padding = "0px";
    +			style.overflow = "hidden";
    +			outer.appendChild(inner);
    +			
    +			document.body.appendChild(outer);
    +			var w1 = inner.offsetWidth;
    +			outer.style.overflow = 'scroll';
    +			var w2 = inner.offsetWidth;
    +			if ( w1 == w2 )
    +			{
    +				w2 = outer.clientWidth;
    +			}
    +			
    +			document.body.removeChild(outer);
    +			return (w1 - w2);  
    +		}
    +		
    +		/**
    +		 * Change the order of the table
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {bool} bApplyClasses optional - should we apply classes or not
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnSort ( oSettings, bApplyClasses )
    +		{
    +			var
    +				i, iLen, j, jLen, k, kLen,
    +				sDataType, nTh,
    +				aaSort = [],
    +			 	aiOrig = [],
    +				oSort = DataTable.ext.oSort,
    +				aoData = oSettings.aoData,
    +				aoColumns = oSettings.aoColumns,
    +				oAria = oSettings.oLanguage.oAria;
    +			
    +			/* No sorting required if server-side or no sorting array */
    +			if ( !oSettings.oFeatures.bServerSide && 
    +				(oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) )
    +			{
    +				aaSort = ( oSettings.aaSortingFixed !== null ) ?
    +					oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
    +					oSettings.aaSorting.slice();
    +				
    +				/* If there is a sorting data type, and a function belonging to it, then we need to
    +				 * get the data from the developer's function and apply it for this column
    +				 */
    +				for ( i=0 ; i<aaSort.length ; i++ )
    +				{
    +					var iColumn = aaSort[i][0];
    +					var iVisColumn = _fnColumnIndexToVisible( oSettings, iColumn );
    +					sDataType = oSettings.aoColumns[ iColumn ].sSortDataType;
    +					if ( DataTable.ext.afnSortData[sDataType] )
    +					{
    +						var aData = DataTable.ext.afnSortData[sDataType].call( 
    +							oSettings.oInstance, oSettings, iColumn, iVisColumn
    +						);
    +						if ( aData.length === aoData.length )
    +						{
    +							for ( j=0, jLen=aoData.length ; j<jLen ; j++ )
    +							{
    +								_fnSetCellData( oSettings, j, iColumn, aData[j] );
    +							}
    +						}
    +						else
    +						{
    +							_fnLog( oSettings, 0, "Returned data sort array (col "+iColumn+") is the wrong length" );
    +						}
    +					}
    +				}
    +				
    +				/* Create a value - key array of the current row positions such that we can use their
    +				 * current position during the sort, if values match, in order to perform stable sorting
    +				 */
    +				for ( i=0, iLen=oSettings.aiDisplayMaster.length ; i<iLen ; i++ )
    +				{
    +					aiOrig[ oSettings.aiDisplayMaster[i] ] = i;
    +				}
    +		
    +				/* Build an internal data array which is specific to the sort, so we can get and prep
    +				 * the data to be sorted only once, rather than needing to do it every time the sorting
    +				 * function runs. This make the sorting function a very simple comparison
    +				 */
    +				var iSortLen = aaSort.length;
    +				var fnSortFormat, aDataSort;
    +				for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
    +				{
    +					for ( j=0 ; j<iSortLen ; j++ )
    +					{
    +						aDataSort = aoColumns[ aaSort[j][0] ].aDataSort;
    +		
    +						for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
    +						{
    +							sDataType = aoColumns[ aDataSort[k] ].sType;
    +							fnSortFormat = oSort[ (sDataType ? sDataType : 'string')+"-pre" ];
    +							
    +							aoData[i]._aSortData[ aDataSort[k] ] = fnSortFormat ?
    +								fnSortFormat( _fnGetCellData( oSettings, i, aDataSort[k], 'sort' ) ) :
    +								_fnGetCellData( oSettings, i, aDataSort[k], 'sort' );
    +						}
    +					}
    +				}
    +				
    +				/* Do the sort - here we want multi-column sorting based on a given data source (column)
    +				 * and sorting function (from oSort) in a certain direction. It's reasonably complex to
    +				 * follow on it's own, but this is what we want (example two column sorting):
    +				 *  fnLocalSorting = function(a,b){
    +				 *  	var iTest;
    +				 *  	iTest = oSort['string-asc']('data11', 'data12');
    +				 *  	if (iTest !== 0)
    +				 *  		return iTest;
    +				 *    iTest = oSort['numeric-desc']('data21', 'data22');
    +				 *    if (iTest !== 0)
    +				 *  		return iTest;
    +				 *  	return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
    +				 *  }
    +				 * Basically we have a test for each sorting column, if the data in that column is equal,
    +				 * test the next column. If all columns match, then we use a numeric sort on the row 
    +				 * positions in the original data array to provide a stable sort.
    +				 */
    +				oSettings.aiDisplayMaster.sort( function ( a, b ) {
    +					var k, l, lLen, iTest, aDataSort, sDataType;
    +					for ( k=0 ; k<iSortLen ; k++ )
    +					{
    +						aDataSort = aoColumns[ aaSort[k][0] ].aDataSort;
    +		
    +						for ( l=0, lLen=aDataSort.length ; l<lLen ; l++ )
    +						{
    +							sDataType = aoColumns[ aDataSort[l] ].sType;
    +							
    +							iTest = oSort[ (sDataType ? sDataType : 'string')+"-"+aaSort[k][1] ](
    +								aoData[a]._aSortData[ aDataSort[l] ],
    +								aoData[b]._aSortData[ aDataSort[l] ]
    +							);
    +						
    +							if ( iTest !== 0 )
    +							{
    +								return iTest;
    +							}
    +						}
    +					}
    +					
    +					return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
    +				} );
    +			}
    +			
    +			/* Alter the sorting classes to take account of the changes */
    +			if ( (bApplyClasses === undefined || bApplyClasses) && !oSettings.oFeatures.bDeferRender )
    +			{
    +				_fnSortingClasses( oSettings );
    +			}
    +		
    +			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +			{
    +				var sTitle = aoColumns[i].sTitle.replace( /<.*?>/g, "" );
    +				nTh = aoColumns[i].nTh;
    +				nTh.removeAttribute('aria-sort');
    +				nTh.removeAttribute('aria-label');
    +				
    +				/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
    +				if ( aoColumns[i].bSortable )
    +				{
    +					if ( aaSort.length > 0 && aaSort[0][0] == i )
    +					{
    +						nTh.setAttribute('aria-sort', aaSort[0][1]=="asc" ? "ascending" : "descending" );
    +						
    +						var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ? 
    +							aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0];
    +						nTh.setAttribute('aria-label', sTitle+
    +							(nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
    +					}
    +					else
    +					{
    +						nTh.setAttribute('aria-label', sTitle+
    +							(aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
    +					}
    +				}
    +				else
    +				{
    +					nTh.setAttribute('aria-label', sTitle);
    +				}
    +			}
    +			
    +			/* Tell the draw function that we have sorted the data */
    +			oSettings.bSorted = true;
    +			$(oSettings.oInstance).trigger('sort', oSettings);
    +			
    +			/* Copy the master data into the draw array and re-draw */
    +			if ( oSettings.oFeatures.bFilter )
    +			{
    +				/* _fnFilter() will redraw the table for us */
    +				_fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
    +			}
    +			else
    +			{
    +				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
    +				oSettings._iDisplayStart = 0; /* reset display back to page 0 */
    +				_fnCalculateEnd( oSettings );
    +				_fnDraw( oSettings );
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Attach a sort handler (click) to a node
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {node} nNode node to attach the handler to
    +		 *  @param {int} iDataIndex column sorting index
    +		 *  @param {function} [fnCallback] callback function
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback )
    +		{
    +			_fnBindAction( nNode, {}, function (e) {
    +				/* If the column is not sortable - don't to anything */
    +				if ( oSettings.aoColumns[iDataIndex].bSortable === false )
    +				{
    +					return;
    +				}
    +				
    +				/*
    +				 * This is a little bit odd I admit... I declare a temporary function inside the scope of
    +				 * _fnBuildHead and the click handler in order that the code presented here can be used 
    +				 * twice - once for when bProcessing is enabled, and another time for when it is 
    +				 * disabled, as we need to perform slightly different actions.
    +				 *   Basically the issue here is that the Javascript engine in modern browsers don't 
    +				 * appear to allow the rendering engine to update the display while it is still executing
    +				 * it's thread (well - it does but only after long intervals). This means that the 
    +				 * 'processing' display doesn't appear for a table sort. To break the js thread up a bit
    +				 * I force an execution break by using setTimeout - but this breaks the expected 
    +				 * thread continuation for the end-developer's point of view (their code would execute
    +				 * too early), so we only do it when we absolutely have to.
    +				 */
    +				var fnInnerSorting = function () {
    +					var iColumn, iNextSort;
    +					
    +					/* If the shift key is pressed then we are multiple column sorting */
    +					if ( e.shiftKey )
    +					{
    +						/* Are we already doing some kind of sort on this column? */
    +						var bFound = false;
    +						for ( var i=0 ; i<oSettings.aaSorting.length ; i++ )
    +						{
    +							if ( oSettings.aaSorting[i][0] == iDataIndex )
    +							{
    +								bFound = true;
    +								iColumn = oSettings.aaSorting[i][0];
    +								iNextSort = oSettings.aaSorting[i][2]+1;
    +								
    +								if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )
    +								{
    +									/* Reached the end of the sorting options, remove from multi-col sort */
    +									oSettings.aaSorting.splice( i, 1 );
    +								}
    +								else
    +								{
    +									/* Move onto next sorting direction */
    +									oSettings.aaSorting[i][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
    +									oSettings.aaSorting[i][2] = iNextSort;
    +								}
    +								break;
    +							}
    +						}
    +						
    +						/* No sort yet - add it in */
    +						if ( bFound === false )
    +						{
    +							oSettings.aaSorting.push( [ iDataIndex, 
    +								oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
    +						}
    +					}
    +					else
    +					{
    +						/* If no shift key then single column sort */
    +						if ( oSettings.aaSorting.length == 1 && oSettings.aaSorting[0][0] == iDataIndex )
    +						{
    +							iColumn = oSettings.aaSorting[0][0];
    +							iNextSort = oSettings.aaSorting[0][2]+1;
    +							if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )
    +							{
    +								iNextSort = 0;
    +							}
    +							oSettings.aaSorting[0][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
    +							oSettings.aaSorting[0][2] = iNextSort;
    +						}
    +						else
    +						{
    +							oSettings.aaSorting.splice( 0, oSettings.aaSorting.length );
    +							oSettings.aaSorting.push( [ iDataIndex, 
    +								oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
    +						}
    +					}
    +					
    +					/* Run the sort */
    +					_fnSort( oSettings );
    +				}; /* /fnInnerSorting */
    +				
    +				if ( !oSettings.oFeatures.bProcessing )
    +				{
    +					fnInnerSorting();
    +				}
    +				else
    +				{
    +					_fnProcessingDisplay( oSettings, true );
    +					setTimeout( function() {
    +						fnInnerSorting();
    +						if ( !oSettings.oFeatures.bServerSide )
    +						{
    +							_fnProcessingDisplay( oSettings, false );
    +						}
    +					}, 0 );
    +				}
    +				
    +				/* Call the user specified callback function - used for async user interaction */
    +				if ( typeof fnCallback == 'function' )
    +				{
    +					fnCallback( oSettings );
    +				}
    +			} );
    +		}
    +		
    +		
    +		/**
    +		 * Set the sorting classes on the header, Note: it is safe to call this function 
    +		 * when bSort and bSortClasses are false
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnSortingClasses( oSettings )
    +		{
    +			var i, iLen, j, jLen, iFound;
    +			var aaSort, sClass;
    +			var iColumns = oSettings.aoColumns.length;
    +			var oClasses = oSettings.oClasses;
    +			
    +			for ( i=0 ; i<iColumns ; i++ )
    +			{
    +				if ( oSettings.aoColumns[i].bSortable )
    +				{
    +					$(oSettings.aoColumns[i].nTh).removeClass( oClasses.sSortAsc +" "+ oClasses.sSortDesc +
    +						" "+ oSettings.aoColumns[i].sSortingClass );
    +				}
    +			}
    +			
    +			if ( oSettings.aaSortingFixed !== null )
    +			{
    +				aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );
    +			}
    +			else
    +			{
    +				aaSort = oSettings.aaSorting.slice();
    +			}
    +			
    +			/* Apply the required classes to the header */
    +			for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
    +			{
    +				if ( oSettings.aoColumns[i].bSortable )
    +				{
    +					sClass = oSettings.aoColumns[i].sSortingClass;
    +					iFound = -1;
    +					for ( j=0 ; j<aaSort.length ; j++ )
    +					{
    +						if ( aaSort[j][0] == i )
    +						{
    +							sClass = ( aaSort[j][1] == "asc" ) ?
    +								oClasses.sSortAsc : oClasses.sSortDesc;
    +							iFound = j;
    +							break;
    +						}
    +					}
    +					$(oSettings.aoColumns[i].nTh).addClass( sClass );
    +					
    +					if ( oSettings.bJUI )
    +					{
    +						/* jQuery UI uses extra markup */
    +						var jqSpan = $("span."+oClasses.sSortIcon,  oSettings.aoColumns[i].nTh);
    +						jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+ 
    +							oClasses.sSortJUI +" "+ oClasses.sSortJUIAscAllowed +" "+ oClasses.sSortJUIDescAllowed );
    +						
    +						var sSpanClass;
    +						if ( iFound == -1 )
    +						{
    +						 	sSpanClass = oSettings.aoColumns[i].sSortingClassJUI;
    +						}
    +						else if ( aaSort[iFound][1] == "asc" )
    +						{
    +							sSpanClass = oClasses.sSortJUIAsc;
    +						}
    +						else
    +						{
    +							sSpanClass = oClasses.sSortJUIDesc;
    +						}
    +						
    +						jqSpan.addClass( sSpanClass );
    +					}
    +				}
    +				else
    +				{
    +					/* No sorting on this column, so add the base class. This will have been assigned by
    +					 * _fnAddColumn
    +					 */
    +					$(oSettings.aoColumns[i].nTh).addClass( oSettings.aoColumns[i].sSortingClass );
    +				}
    +			}
    +			
    +			/* 
    +			 * Apply the required classes to the table body
    +			 * Note that this is given as a feature switch since it can significantly slow down a sort
    +			 * on large data sets (adding and removing of classes is always slow at the best of times..)
    +			 * Further to this, note that this code is admittedly fairly ugly. It could be made a lot 
    +			 * simpler using jQuery selectors and add/removeClass, but that is significantly slower
    +			 * (on the order of 5 times slower) - hence the direct DOM manipulation here.
    +			 * Note that for deferred drawing we do use jQuery - the reason being that taking the first
    +			 * row found to see if the whole column needs processed can miss classes since the first
    +			 * column might be new.
    +			 */
    +			sClass = oClasses.sSortColumn;
    +			
    +			if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses )
    +			{
    +				var nTds = _fnGetTdNodes( oSettings );
    +				
    +				/* Determine what the sorting class for each column should be */
    +				var iClass, iTargetCol;
    +				var asClasses = [];
    +				for (i = 0; i < iColumns; i++)
    +				{
    +					asClasses.push("");
    +				}
    +				for (i = 0, iClass = 1; i < aaSort.length; i++)
    +				{
    +					iTargetCol = parseInt( aaSort[i][0], 10 );
    +					asClasses[iTargetCol] = sClass + iClass;
    +					
    +					if ( iClass < 3 )
    +					{
    +						iClass++;
    +					}
    +				}
    +				
    +				/* Make changes to the classes for each cell as needed */
    +				var reClass = new RegExp(sClass + "[123]");
    +				var sTmpClass, sCurrentClass, sNewClass;
    +				for ( i=0, iLen=nTds.length; i<iLen; i++ )
    +				{
    +					/* Determine which column we're looking at */
    +					iTargetCol = i % iColumns;
    +					
    +					/* What is the full list of classes now */
    +					sCurrentClass = nTds[i].className;
    +					/* What sorting class should be applied? */
    +					sNewClass = asClasses[iTargetCol];
    +					/* What would the new full list be if we did a replacement? */
    +					sTmpClass = sCurrentClass.replace(reClass, sNewClass);
    +					
    +					if ( sTmpClass != sCurrentClass )
    +					{
    +						/* We changed something */
    +						nTds[i].className = $.trim( sTmpClass );
    +					}
    +					else if ( sNewClass.length > 0 && sCurrentClass.indexOf(sNewClass) == -1 )
    +					{
    +						/* We need to add a class */
    +						nTds[i].className = sCurrentClass + " " + sNewClass;
    +					}
    +				}
    +			}
    +		}
    +		
    +		
    +		
    +		/**
    +		 * Save the state of a table in a cookie such that the page can be reloaded
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnSaveState ( oSettings )
    +		{
    +			if ( !oSettings.oFeatures.bStateSave || oSettings.bDestroying )
    +			{
    +				return;
    +			}
    +		
    +			/* Store the interesting variables */
    +			var i, iLen, bInfinite=oSettings.oScroll.bInfinite;
    +			var oState = {
    +				"iCreate":      new Date().getTime(),
    +				"iStart":       (bInfinite ? 0 : oSettings._iDisplayStart),
    +				"iEnd":         (bInfinite ? oSettings._iDisplayLength : oSettings._iDisplayEnd),
    +				"iLength":      oSettings._iDisplayLength,
    +				"aaSorting":    $.extend( true, [], oSettings.aaSorting ),
    +				"oSearch":      $.extend( true, {}, oSettings.oPreviousSearch ),
    +				"aoSearchCols": $.extend( true, [], oSettings.aoPreSearchCols ),
    +				"abVisCols":    []
    +			};
    +		
    +			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +			{
    +				oState.abVisCols.push( oSettings.aoColumns[i].bVisible );
    +			}
    +		
    +			_fnCallbackFire( oSettings, "aoStateSaveParams", 'stateSaveParams', [oSettings, oState] );
    +			
    +			oSettings.fnStateSave.call( oSettings.oInstance, oSettings, oState );
    +		}
    +		
    +		
    +		/**
    +		 * Attempt to load a saved table state from a cookie
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {object} oInit DataTables init object so we can override settings
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnLoadState ( oSettings, oInit )
    +		{
    +			if ( !oSettings.oFeatures.bStateSave )
    +			{
    +				return;
    +			}
    +		
    +			var oData = oSettings.fnStateLoad.call( oSettings.oInstance, oSettings );
    +			if ( !oData )
    +			{
    +				return;
    +			}
    +			
    +			/* Allow custom and plug-in manipulation functions to alter the saved data set and
    +			 * cancelling of loading by returning false
    +			 */
    +			var abStateLoad = _fnCallbackFire( oSettings, 'aoStateLoadParams', 'stateLoadParams', [oSettings, oData] );
    +			if ( $.inArray( false, abStateLoad ) !== -1 )
    +			{
    +				return;
    +			}
    +			
    +			/* Store the saved state so it might be accessed at any time */
    +			oSettings.oLoadedState = $.extend( true, {}, oData );
    +			
    +			/* Restore key features */
    +			oSettings._iDisplayStart    = oData.iStart;
    +			oSettings.iInitDisplayStart = oData.iStart;
    +			oSettings._iDisplayEnd      = oData.iEnd;
    +			oSettings._iDisplayLength   = oData.iLength;
    +			oSettings.aaSorting         = oData.aaSorting.slice();
    +			oSettings.saved_aaSorting   = oData.aaSorting.slice();
    +			
    +			/* Search filtering  */
    +			$.extend( oSettings.oPreviousSearch, oData.oSearch );
    +			$.extend( true, oSettings.aoPreSearchCols, oData.aoSearchCols );
    +			
    +			/* Column visibility state
    +			 * Pass back visibility settings to the init handler, but to do not here override
    +			 * the init object that the user might have passed in
    +			 */
    +			oInit.saved_aoColumns = [];
    +			for ( var i=0 ; i<oData.abVisCols.length ; i++ )
    +			{
    +				oInit.saved_aoColumns[i] = {};
    +				oInit.saved_aoColumns[i].bVisible = oData.abVisCols[i];
    +			}
    +		
    +			_fnCallbackFire( oSettings, 'aoStateLoaded', 'stateLoaded', [oSettings, oData] );
    +		}
    +		
    +		
    +		/**
    +		 * Create a new cookie with a value to store the state of a table
    +		 *  @param {string} sName name of the cookie to create
    +		 *  @param {string} sValue the value the cookie should take
    +		 *  @param {int} iSecs duration of the cookie
    +		 *  @param {string} sBaseName sName is made up of the base + file name - this is the base
    +		 *  @param {function} fnCallback User definable function to modify the cookie
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnCreateCookie ( sName, sValue, iSecs, sBaseName, fnCallback )
    +		{
    +			var date = new Date();
    +			date.setTime( date.getTime()+(iSecs*1000) );
    +			
    +			/* 
    +			 * Shocking but true - it would appear IE has major issues with having the path not having
    +			 * a trailing slash on it. We need the cookie to be available based on the path, so we
    +			 * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the
    +			 * patch to use at least some of the path
    +			 */
    +			var aParts = window.location.pathname.split('/');
    +			var sNameFile = sName + '_' + aParts.pop().replace(/[\/:]/g,"").toLowerCase();
    +			var sFullCookie, oData;
    +			
    +			if ( fnCallback !== null )
    +			{
    +				oData = (typeof $.parseJSON === 'function') ? 
    +					$.parseJSON( sValue ) : eval( '('+sValue+')' );
    +				sFullCookie = fnCallback( sNameFile, oData, date.toGMTString(),
    +					aParts.join('/')+"/" );
    +			}
    +			else
    +			{
    +				sFullCookie = sNameFile + "=" + encodeURIComponent(sValue) +
    +					"; expires=" + date.toGMTString() +"; path=" + aParts.join('/')+"/";
    +			}
    +			
    +			/* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies
    +			 * belonging to DataTables.
    +			 */
    +			var
    +				aCookies =document.cookie.split(';'),
    +				iNewCookieLen = sFullCookie.split(';')[0].length,
    +				aOldCookies = [];
    +			
    +			if ( iNewCookieLen+document.cookie.length+10 > 4096 ) /* Magic 10 for padding */
    +			{
    +				for ( var i=0, iLen=aCookies.length ; i<iLen ; i++ )
    +				{
    +					if ( aCookies[i].indexOf( sBaseName ) != -1 )
    +					{
    +						/* It's a DataTables cookie, so eval it and check the time stamp */
    +						var aSplitCookie = aCookies[i].split('=');
    +						try {
    +							oData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' );
    +		
    +							if ( oData && oData.iCreate )
    +							{
    +								aOldCookies.push( {
    +									"name": aSplitCookie[0],
    +									"time": oData.iCreate
    +								} );
    +							}
    +						}
    +						catch( e ) {}
    +					}
    +				}
    +		
    +				// Make sure we delete the oldest ones first
    +				aOldCookies.sort( function (a, b) {
    +					return b.time - a.time;
    +				} );
    +		
    +				// Eliminate as many old DataTables cookies as we need to
    +				while ( iNewCookieLen + document.cookie.length + 10 > 4096 ) {
    +					if ( aOldCookies.length === 0 ) {
    +						// Deleted all DT cookies and still not enough space. Can't state save
    +						return;
    +					}
    +					
    +					var old = aOldCookies.pop();
    +					document.cookie = old.name+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+
    +						aParts.join('/') + "/";
    +				}
    +			}
    +			
    +			document.cookie = sFullCookie;
    +		}
    +		
    +		
    +		/**
    +		 * Read an old cookie to get a cookie with an old table state
    +		 *  @param {string} sName name of the cookie to read
    +		 *  @returns {string} contents of the cookie - or null if no cookie with that name found
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnReadCookie ( sName )
    +		{
    +			var
    +				aParts = window.location.pathname.split('/'),
    +				sNameEQ = sName + '_' + aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase() + '=',
    +			 	sCookieContents = document.cookie.split(';');
    +			
    +			for( var i=0 ; i<sCookieContents.length ; i++ )
    +			{
    +				var c = sCookieContents[i];
    +				
    +				while (c.charAt(0)==' ')
    +				{
    +					c = c.substring(1,c.length);
    +				}
    +				
    +				if (c.indexOf(sNameEQ) === 0)
    +				{
    +					return decodeURIComponent( c.substring(sNameEQ.length,c.length) );
    +				}
    +			}
    +			return null;
    +		}
    +		
    +		
    +		/**
    +		 * Return the settings object for a particular table
    +		 *  @param {node} nTable table we are using as a dataTable
    +		 *  @returns {object} Settings object - or null if not found
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnSettingsFromNode ( nTable )
    +		{
    +			for ( var i=0 ; i<DataTable.settings.length ; i++ )
    +			{
    +				if ( DataTable.settings[i].nTable === nTable )
    +				{
    +					return DataTable.settings[i];
    +				}
    +			}
    +			
    +			return null;
    +		}
    +		
    +		
    +		/**
    +		 * Return an array with the TR nodes for the table
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @returns {array} TR array
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnGetTrNodes ( oSettings )
    +		{
    +			var aNodes = [];
    +			var aoData = oSettings.aoData;
    +			for ( var i=0, iLen=aoData.length ; i<iLen ; i++ )
    +			{
    +				if ( aoData[i].nTr !== null )
    +				{
    +					aNodes.push( aoData[i].nTr );
    +				}
    +			}
    +			return aNodes;
    +		}
    +		
    +		
    +		/**
    +		 * Return an flat array with all TD nodes for the table, or row
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} [iIndividualRow] aoData index to get the nodes for - optional 
    +		 *    if not given then the return array will contain all nodes for the table
    +		 *  @returns {array} TD array
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnGetTdNodes ( oSettings, iIndividualRow )
    +		{
    +			var anReturn = [];
    +			var iCorrector;
    +			var anTds, nTd;
    +			var iRow, iRows=oSettings.aoData.length,
    +				iColumn, iColumns, oData, sNodeName, iStart=0, iEnd=iRows;
    +			
    +			/* Allow the collection to be limited to just one row */
    +			if ( iIndividualRow !== undefined )
    +			{
    +				iStart = iIndividualRow;
    +				iEnd = iIndividualRow+1;
    +			}
    +		
    +			for ( iRow=iStart ; iRow<iEnd ; iRow++ )
    +			{
    +				oData = oSettings.aoData[iRow];
    +				if ( oData.nTr !== null )
    +				{
    +					/* get the TD child nodes - taking into account text etc nodes */
    +					anTds = [];
    +					nTd = oData.nTr.firstChild;
    +					while ( nTd )
    +					{
    +						sNodeName = nTd.nodeName.toLowerCase();
    +						if ( sNodeName == 'td' || sNodeName == 'th' )
    +						{
    +							anTds.push( nTd );
    +						}
    +						nTd = nTd.nextSibling;
    +					}
    +		
    +					iCorrector = 0;
    +					for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
    +					{
    +						if ( oSettings.aoColumns[iColumn].bVisible )
    +						{
    +							anReturn.push( anTds[iColumn-iCorrector] );
    +						}
    +						else
    +						{
    +							anReturn.push( oData._anHidden[iColumn] );
    +							iCorrector++;
    +						}
    +					}
    +				}
    +			}
    +		
    +			return anReturn;
    +		}
    +		
    +		
    +		/**
    +		 * Log an error message
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {int} iLevel log error messages, or display them to the user
    +		 *  @param {string} sMesg error message
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnLog( oSettings, iLevel, sMesg )
    +		{
    +			var sAlert = (oSettings===null) ?
    +				"DataTables warning: "+sMesg :
    +				"DataTables warning (table id = '"+oSettings.sTableId+"'): "+sMesg;
    +			
    +			if ( iLevel === 0 )
    +			{
    +				if ( DataTable.ext.sErrMode == 'alert' )
    +				{
    +					alert( sAlert );
    +				}
    +				else
    +				{
    +					throw new Error(sAlert);
    +				}
    +				return;
    +			}
    +			else if ( window.console && console.log )
    +			{
    +				console.log( sAlert );
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * See if a property is defined on one object, if so assign it to the other object
    +		 *  @param {object} oRet target object
    +		 *  @param {object} oSrc source object
    +		 *  @param {string} sName property
    +		 *  @param {string} [sMappedName] name to map too - optional, sName used if not given
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnMap( oRet, oSrc, sName, sMappedName )
    +		{
    +			if ( sMappedName === undefined )
    +			{
    +				sMappedName = sName;
    +			}
    +			if ( oSrc[sName] !== undefined )
    +			{
    +				oRet[sMappedName] = oSrc[sName];
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Extend objects - very similar to jQuery.extend, but deep copy objects, and shallow
    +		 * copy arrays. The reason we need to do this, is that we don't want to deep copy array
    +		 * init values (such as aaSorting) since the dev wouldn't be able to override them, but
    +		 * we do want to deep copy arrays.
    +		 *  @param {object} oOut Object to extend
    +		 *  @param {object} oExtender Object from which the properties will be applied to oOut
    +		 *  @returns {object} oOut Reference, just for convenience - oOut === the return.
    +		 *  @memberof DataTable#oApi
    +		 *  @todo This doesn't take account of arrays inside the deep copied objects.
    +		 */
    +		function _fnExtend( oOut, oExtender )
    +		{
    +			var val;
    +			
    +			for ( var prop in oExtender )
    +			{
    +				if ( oExtender.hasOwnProperty(prop) )
    +				{
    +					val = oExtender[prop];
    +		
    +					if ( typeof oInit[prop] === 'object' && val !== null && $.isArray(val) === false )
    +					{
    +						$.extend( true, oOut[prop], val );
    +					}
    +					else
    +					{
    +						oOut[prop] = val;
    +					}
    +				}
    +			}
    +		
    +			return oOut;
    +		}
    +		
    +		
    +		/**
    +		 * Bind an event handers to allow a click or return key to activate the callback.
    +		 * This is good for accessibility since a return on the keyboard will have the
    +		 * same effect as a click, if the element has focus.
    +		 *  @param {element} n Element to bind the action to
    +		 *  @param {object} oData Data object to pass to the triggered function
    +		 *  @param {function} fn Callback function for when the event is triggered
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnBindAction( n, oData, fn )
    +		{
    +			$(n)
    +				.bind( 'click.DT', oData, function (e) {
    +						n.blur(); // Remove focus outline for mouse users
    +						fn(e);
    +					} )
    +				.bind( 'keypress.DT', oData, function (e){
    +					if ( e.which === 13 ) {
    +						fn(e);
    +					} } )
    +				.bind( 'selectstart.DT', function () {
    +					/* Take the brutal approach to cancelling text selection */
    +					return false;
    +					} );
    +		}
    +		
    +		
    +		/**
    +		 * Register a callback function. Easily allows a callback function to be added to
    +		 * an array store of callback functions that can then all be called together.
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {string} sStore Name of the array storage for the callbacks in oSettings
    +		 *  @param {function} fn Function to be called back
    +		 *  @param {string} sName Identifying name for the callback (i.e. a label)
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnCallbackReg( oSettings, sStore, fn, sName )
    +		{
    +			if ( fn )
    +			{
    +				oSettings[sStore].push( {
    +					"fn": fn,
    +					"sName": sName
    +				} );
    +			}
    +		}
    +		
    +		
    +		/**
    +		 * Fire callback functions and trigger events. Note that the loop over the callback
    +		 * array store is done backwards! Further note that you do not want to fire off triggers
    +		 * in time sensitive applications (for example cell creation) as its slow.
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @param {string} sStore Name of the array storage for the callbacks in oSettings
    +		 *  @param {string} sTrigger Name of the jQuery custom event to trigger. If null no trigger
    +		 *    is fired
    +		 *  @param {array} aArgs Array of arguments to pass to the callback function / trigger
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnCallbackFire( oSettings, sStore, sTrigger, aArgs )
    +		{
    +			var aoStore = oSettings[sStore];
    +			var aRet =[];
    +		
    +			for ( var i=aoStore.length-1 ; i>=0 ; i-- )
    +			{
    +				aRet.push( aoStore[i].fn.apply( oSettings.oInstance, aArgs ) );
    +			}
    +		
    +			if ( sTrigger !== null )
    +			{
    +				$(oSettings.oInstance).trigger(sTrigger, aArgs);
    +			}
    +		
    +			return aRet;
    +		}
    +		
    +		
    +		/**
    +		 * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other
    +		 * library, then we use that as it is fast, safe and accurate. If the function isn't 
    +		 * available then we need to built it ourselves - the inspiration for this function comes
    +		 * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is
    +		 * not perfect and absolutely should not be used as a replacement to json2.js - but it does
    +		 * do what we need, without requiring a dependency for DataTables.
    +		 *  @param {object} o JSON object to be converted
    +		 *  @returns {string} JSON string
    +		 *  @memberof DataTable#oApi
    +		 */
    +		var _fnJsonString = (window.JSON) ? JSON.stringify : function( o )
    +		{
    +			/* Not an object or array */
    +			var sType = typeof o;
    +			if (sType !== "object" || o === null)
    +			{
    +				// simple data type
    +				if (sType === "string")
    +				{
    +					o = '"'+o+'"';
    +				}
    +				return o+"";
    +			}
    +		
    +			/* If object or array, need to recurse over it */
    +			var
    +				sProp, mValue,
    +				json = [],
    +				bArr = $.isArray(o);
    +			
    +			for (sProp in o)
    +			{
    +				mValue = o[sProp];
    +				sType = typeof mValue;
    +		
    +				if (sType === "string")
    +				{
    +					mValue = '"'+mValue+'"';
    +				}
    +				else if (sType === "object" && mValue !== null)
    +				{
    +					mValue = _fnJsonString(mValue);
    +				}
    +		
    +				json.push((bArr ? "" : '"'+sProp+'":') + mValue);
    +			}
    +		
    +			return (bArr ? "[" : "{") + json + (bArr ? "]" : "}");
    +		};
    +		
    +		
    +		/**
    +		 * From some browsers (specifically IE6/7) we need special handling to work around browser
    +		 * bugs - this function is used to detect when these workarounds are needed.
    +		 *  @param {object} oSettings dataTables settings object
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnBrowserDetect( oSettings )
    +		{
    +			/* IE6/7 will oversize a width 100% element inside a scrolling element, to include the
    +			 * width of the scrollbar, while other browsers ensure the inner element is contained
    +			 * without forcing scrolling
    +			 */
    +			var n = $(
    +				'<div style="position:absolute; top:0; left:0; height:1px; width:1px; overflow:hidden">'+
    +					'<div style="position:absolute; top:1px; left:1px; width:100px; overflow:scroll;">'+
    +						'<div id="DT_BrowserTest" style="width:100%; height:10px;"></div>'+
    +					'</div>'+
    +				'</div>')[0];
    +		
    +			document.body.appendChild( n );
    +			oSettings.oBrowser.bScrollOversize = $('#DT_BrowserTest', n)[0].offsetWidth === 100 ? true : false;
    +			document.body.removeChild( n );
    +		}
    +		
    +
    +		/**
    +		 * Perform a jQuery selector action on the table's TR elements (from the tbody) and
    +		 * return the resulting jQuery object.
    +		 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
    +		 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
    +		 *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
    +		 *    criterion ("applied") or all TR elements (i.e. no filter).
    +		 *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
    +		 *    Can be either 'current', whereby the current sorting of the table is used, or
    +		 *    'original' whereby the original order the data was read into the table is used.
    +		 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
    +		 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be 
    +		 *    'current' and filter is 'applied', regardless of what they might be given as.
    +		 *  @returns {object} jQuery object, filtered by the given selector.
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *
    +		 *      // Highlight every second row
    +		 *      oTable.$('tr:odd').css('backgroundColor', 'blue');
    +		 *    } );
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *
    +		 *      // Filter to rows with 'Webkit' in them, add a background colour and then
    +		 *      // remove the filter, thus highlighting the 'Webkit' rows only.
    +		 *      oTable.fnFilter('Webkit');
    +		 *      oTable.$('tr', {"filter": "applied"}).css('backgroundColor', 'blue');
    +		 *      oTable.fnFilter('');
    +		 *    } );
    +		 */
    +		this.$ = function ( sSelector, oOpts )
    +		{
    +			var i, iLen, a = [], tr;
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			var aoData = oSettings.aoData;
    +			var aiDisplay = oSettings.aiDisplay;
    +			var aiDisplayMaster = oSettings.aiDisplayMaster;
    +		
    +			if ( !oOpts )
    +			{
    +				oOpts = {};
    +			}
    +		
    +			oOpts = $.extend( {}, {
    +				"filter": "none", // applied
    +				"order": "current", // "original"
    +				"page": "all" // current
    +			}, oOpts );
    +		
    +			// Current page implies that order=current and fitler=applied, since it is fairly
    +			// senseless otherwise
    +			if ( oOpts.page == 'current' )
    +			{
    +				for ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i<iLen ; i++ )
    +				{
    +					tr = aoData[ aiDisplay[i] ].nTr;
    +					if ( tr )
    +					{
    +						a.push( tr );
    +					}
    +				}
    +			}
    +			else if ( oOpts.order == "current" && oOpts.filter == "none" )
    +			{
    +				for ( i=0, iLen=aiDisplayMaster.length ; i<iLen ; i++ )
    +				{
    +					tr = aoData[ aiDisplayMaster[i] ].nTr;
    +					if ( tr )
    +					{
    +						a.push( tr );
    +					}
    +				}
    +			}
    +			else if ( oOpts.order == "current" && oOpts.filter == "applied" )
    +			{
    +				for ( i=0, iLen=aiDisplay.length ; i<iLen ; i++ )
    +				{
    +					tr = aoData[ aiDisplay[i] ].nTr;
    +					if ( tr )
    +					{
    +						a.push( tr );
    +					}
    +				}
    +			}
    +			else if ( oOpts.order == "original" && oOpts.filter == "none" )
    +			{
    +				for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
    +				{
    +					tr = aoData[ i ].nTr ;
    +					if ( tr )
    +					{
    +						a.push( tr );
    +					}
    +				}
    +			}
    +			else if ( oOpts.order == "original" && oOpts.filter == "applied" )
    +			{
    +				for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
    +				{
    +					tr = aoData[ i ].nTr;
    +					if ( $.inArray( i, aiDisplay ) !== -1 && tr )
    +					{
    +						a.push( tr );
    +					}
    +				}
    +			}
    +			else
    +			{
    +				_fnLog( oSettings, 1, "Unknown selection options" );
    +			}
    +		
    +			/* We need to filter on the TR elements and also 'find' in their descendants
    +			 * to make the selector act like it would in a full table - so we need
    +			 * to build both results and then combine them together
    +			 */
    +			var jqA = $(a);
    +			var jqTRs = jqA.filter( sSelector );
    +			var jqDescendants = jqA.find( sSelector );
    +		
    +			return $( [].concat($.makeArray(jqTRs), $.makeArray(jqDescendants)) );
    +		};
    +		
    +		
    +		/**
    +		 * Almost identical to $ in operation, but in this case returns the data for the matched
    +		 * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
    +		 * rather than any descendants, so the data can be obtained for the row/cell. If matching
    +		 * rows are found, the data returned is the original data array/object that was used to  
    +		 * create the row (or a generated array if from a DOM source).
    +		 *
    +		 * This method is often useful in-combination with $ where both functions are given the
    +		 * same parameters and the array indexes will match identically.
    +		 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
    +		 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
    +		 *  @param {string} [oOpts.filter=none] Select elements that meet the current filter
    +		 *    criterion ("applied") or all elements (i.e. no filter).
    +		 *  @param {string} [oOpts.order=current] Order of the data in the processed array.
    +		 *    Can be either 'current', whereby the current sorting of the table is used, or
    +		 *    'original' whereby the original order the data was read into the table is used.
    +		 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
    +		 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be 
    +		 *    'current' and filter is 'applied', regardless of what they might be given as.
    +		 *  @returns {array} Data for the matched elements. If any elements, as a result of the
    +		 *    selector, were not TR, TD or TH elements in the DataTable, they will have a null 
    +		 *    entry in the array.
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *
    +		 *      // Get the data from the first row in the table
    +		 *      var data = oTable._('tr:first');
    +		 *
    +		 *      // Do something useful with the data
    +		 *      alert( "First cell is: "+data[0] );
    +		 *    } );
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *
    +		 *      // Filter to 'Webkit' and get all data for 
    +		 *      oTable.fnFilter('Webkit');
    +		 *      var data = oTable._('tr', {"filter": "applied"});
    +		 *      
    +		 *      // Do something with the data
    +		 *      alert( data.length+" rows matched the filter" );
    +		 *    } );
    +		 */
    +		this._ = function ( sSelector, oOpts )
    +		{
    +			var aOut = [];
    +			var i, iLen, iIndex;
    +			var aTrs = this.$( sSelector, oOpts );
    +		
    +			for ( i=0, iLen=aTrs.length ; i<iLen ; i++ )
    +			{
    +				aOut.push( this.fnGetData(aTrs[i]) );
    +			}
    +		
    +			return aOut;
    +		};
    +		
    +		
    +		/**
    +		 * Add a single new row or multiple rows of data to the table. Please note
    +		 * that this is suitable for client-side processing only - if you are using 
    +		 * server-side processing (i.e. "bServerSide": true), then to add data, you
    +		 * must add it to the data source, i.e. the server-side, through an Ajax call.
    +		 *  @param {array|object} mData The data to be added to the table. This can be:
    +		 *    <ul>
    +		 *      <li>1D array of data - add a single row with the data provided</li>
    +		 *      <li>2D array of arrays - add multiple rows in a single call</li>
    +		 *      <li>object - data object when using <i>mData</i></li>
    +		 *      <li>array of objects - multiple data objects when using <i>mData</i></li>
    +		 *    </ul>
    +		 *  @param {bool} [bRedraw=true] redraw the table or not
    +		 *  @returns {array} An array of integers, representing the list of indexes in 
    +		 *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to 
    +		 *    the table.
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    // Global var for counter
    +		 *    var giCount = 2;
    +		 *    
    +		 *    $(document).ready(function() {
    +		 *      $('#example').dataTable();
    +		 *    } );
    +		 *    
    +		 *    function fnClickAddRow() {
    +		 *      $('#example').dataTable().fnAddData( [
    +		 *        giCount+".1",
    +		 *        giCount+".2",
    +		 *        giCount+".3",
    +		 *        giCount+".4" ]
    +		 *      );
    +		 *        
    +		 *      giCount++;
    +		 *    }
    +		 */
    +		this.fnAddData = function( mData, bRedraw )
    +		{
    +			if ( mData.length === 0 )
    +			{
    +				return [];
    +			}
    +			
    +			var aiReturn = [];
    +			var iTest;
    +			
    +			/* Find settings from table node */
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			
    +			/* Check if we want to add multiple rows or not */
    +			if ( typeof mData[0] === "object" && mData[0] !== null )
    +			{
    +				for ( var i=0 ; i<mData.length ; i++ )
    +				{
    +					iTest = _fnAddData( oSettings, mData[i] );
    +					if ( iTest == -1 )
    +					{
    +						return aiReturn;
    +					}
    +					aiReturn.push( iTest );
    +				}
    +			}
    +			else
    +			{
    +				iTest = _fnAddData( oSettings, mData );
    +				if ( iTest == -1 )
    +				{
    +					return aiReturn;
    +				}
    +				aiReturn.push( iTest );
    +			}
    +			
    +			oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
    +			
    +			if ( bRedraw === undefined || bRedraw )
    +			{
    +				_fnReDraw( oSettings );
    +			}
    +			return aiReturn;
    +		};
    +		
    +		
    +		/**
    +		 * This function will make DataTables recalculate the column sizes, based on the data 
    +		 * contained in the table and the sizes applied to the columns (in the DOM, CSS or 
    +		 * through the sWidth parameter). This can be useful when the width of the table's 
    +		 * parent element changes (for example a window resize).
    +		 *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable( {
    +		 *        "sScrollY": "200px",
    +		 *        "bPaginate": false
    +		 *      } );
    +		 *      
    +		 *      $(window).bind('resize', function () {
    +		 *        oTable.fnAdjustColumnSizing();
    +		 *      } );
    +		 *    } );
    +		 */
    +		this.fnAdjustColumnSizing = function ( bRedraw )
    +		{
    +			var oSettings = _fnSettingsFromNode(this[DataTable.ext.iApiIndex]);
    +			_fnAdjustColumnSizing( oSettings );
    +			
    +			if ( bRedraw === undefined || bRedraw )
    +			{
    +				this.fnDraw( false );
    +			}
    +			else if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
    +			{
    +				/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
    +				this.oApi._fnScrollDraw(oSettings);
    +			}
    +		};
    +		
    +		
    +		/**
    +		 * Quickly and simply clear a table
    +		 *  @param {bool} [bRedraw=true] redraw the table or not
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      
    +		 *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
    +		 *      oTable.fnClearTable();
    +		 *    } );
    +		 */
    +		this.fnClearTable = function( bRedraw )
    +		{
    +			/* Find settings from table node */
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			_fnClearTable( oSettings );
    +			
    +			if ( bRedraw === undefined || bRedraw )
    +			{
    +				_fnDraw( oSettings );
    +			}
    +		};
    +		
    +		
    +		/**
    +		 * The exact opposite of 'opening' a row, this function will close any rows which 
    +		 * are currently 'open'.
    +		 *  @param {node} nTr the table row to 'close'
    +		 *  @returns {int} 0 on success, or 1 if failed (can't find the row)
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable;
    +		 *      
    +		 *      // 'open' an information row when a row is clicked on
    +		 *      $('#example tbody tr').click( function () {
    +		 *        if ( oTable.fnIsOpen(this) ) {
    +		 *          oTable.fnClose( this );
    +		 *        } else {
    +		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
    +		 *        }
    +		 *      } );
    +		 *      
    +		 *      oTable = $('#example').dataTable();
    +		 *    } );
    +		 */
    +		this.fnClose = function( nTr )
    +		{
    +			/* Find settings from table node */
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			
    +			for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )
    +			{
    +				if ( oSettings.aoOpenRows[i].nParent == nTr )
    +				{
    +					var nTrParent = oSettings.aoOpenRows[i].nTr.parentNode;
    +					if ( nTrParent )
    +					{
    +						/* Remove it if it is currently on display */
    +						nTrParent.removeChild( oSettings.aoOpenRows[i].nTr );
    +					}
    +					oSettings.aoOpenRows.splice( i, 1 );
    +					return 0;
    +				}
    +			}
    +			return 1;
    +		};
    +		
    +		
    +		/**
    +		 * Remove a row for the table
    +		 *  @param {mixed} mTarget The index of the row from aoData to be deleted, or
    +		 *    the TR element you want to delete
    +		 *  @param {function|null} [fnCallBack] Callback function
    +		 *  @param {bool} [bRedraw=true] Redraw the table or not
    +		 *  @returns {array} The row that was deleted
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      
    +		 *      // Immediately remove the first row
    +		 *      oTable.fnDeleteRow( 0 );
    +		 *    } );
    +		 */
    +		this.fnDeleteRow = function( mTarget, fnCallBack, bRedraw )
    +		{
    +			/* Find settings from table node */
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			var i, iLen, iAODataIndex;
    +			
    +			iAODataIndex = (typeof mTarget === 'object') ? 
    +				_fnNodeToDataIndex(oSettings, mTarget) : mTarget;
    +			
    +			/* Return the data array from this row */
    +			var oData = oSettings.aoData.splice( iAODataIndex, 1 );
    +		
    +			/* Update the _DT_RowIndex parameter */
    +			for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
    +			{
    +				if ( oSettings.aoData[i].nTr !== null )
    +				{
    +					oSettings.aoData[i].nTr._DT_RowIndex = i;
    +				}
    +			}
    +			
    +			/* Remove the target row from the search array */
    +			var iDisplayIndex = $.inArray( iAODataIndex, oSettings.aiDisplay );
    +			oSettings.asDataSearch.splice( iDisplayIndex, 1 );
    +			
    +			/* Delete from the display arrays */
    +			_fnDeleteIndex( oSettings.aiDisplayMaster, iAODataIndex );
    +			_fnDeleteIndex( oSettings.aiDisplay, iAODataIndex );
    +			
    +			/* If there is a user callback function - call it */
    +			if ( typeof fnCallBack === "function" )
    +			{
    +				fnCallBack.call( this, oSettings, oData );
    +			}
    +			
    +			/* Check for an 'overflow' they case for displaying the table */
    +			if ( oSettings._iDisplayStart >= oSettings.fnRecordsDisplay() )
    +			{
    +				oSettings._iDisplayStart -= oSettings._iDisplayLength;
    +				if ( oSettings._iDisplayStart < 0 )
    +				{
    +					oSettings._iDisplayStart = 0;
    +				}
    +			}
    +			
    +			if ( bRedraw === undefined || bRedraw )
    +			{
    +				_fnCalculateEnd( oSettings );
    +				_fnDraw( oSettings );
    +			}
    +			
    +			return oData;
    +		};
    +		
    +		
    +		/**
    +		 * Restore the table to it's original state in the DOM by removing all of DataTables 
    +		 * enhancements, alterations to the DOM structure of the table and event listeners.
    +		 *  @param {boolean} [bRemove=false] Completely remove the table from the DOM
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      // This example is fairly pointless in reality, but shows how fnDestroy can be used
    +		 *      var oTable = $('#example').dataTable();
    +		 *      oTable.fnDestroy();
    +		 *    } );
    +		 */
    +		this.fnDestroy = function ( bRemove )
    +		{
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			var nOrig = oSettings.nTableWrapper.parentNode;
    +			var nBody = oSettings.nTBody;
    +			var i, iLen;
    +		
    +			bRemove = (bRemove===undefined) ? false : bRemove;
    +			
    +			/* Flag to note that the table is currently being destroyed - no action should be taken */
    +			oSettings.bDestroying = true;
    +			
    +			/* Fire off the destroy callbacks for plug-ins etc */
    +			_fnCallbackFire( oSettings, "aoDestroyCallback", "destroy", [oSettings] );
    +		
    +			/* If the table is not being removed, restore the hidden columns */
    +			if ( !bRemove )
    +			{
    +				for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
    +				{
    +					if ( oSettings.aoColumns[i].bVisible === false )
    +					{
    +						this.fnSetColumnVis( i, true );
    +					}
    +				}
    +			}
    +			
    +			/* Blitz all DT events */
    +			$(oSettings.nTableWrapper).find('*').andSelf().unbind('.DT');
    +			
    +			/* If there is an 'empty' indicator row, remove it */
    +			$('tbody>tr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove();
    +			
    +			/* When scrolling we had to break the table up - restore it */
    +			if ( oSettings.nTable != oSettings.nTHead.parentNode )
    +			{
    +				$(oSettings.nTable).children('thead').remove();
    +				oSettings.nTable.appendChild( oSettings.nTHead );
    +			}
    +			
    +			if ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode )
    +			{
    +				$(oSettings.nTable).children('tfoot').remove();
    +				oSettings.nTable.appendChild( oSettings.nTFoot );
    +			}
    +			
    +			/* Remove the DataTables generated nodes, events and classes */
    +			oSettings.nTable.parentNode.removeChild( oSettings.nTable );
    +			$(oSettings.nTableWrapper).remove();
    +			
    +			oSettings.aaSorting = [];
    +			oSettings.aaSortingFixed = [];
    +			_fnSortingClasses( oSettings );
    +			
    +			$(_fnGetTrNodes( oSettings )).removeClass( oSettings.asStripeClasses.join(' ') );
    +			
    +			$('th, td', oSettings.nTHead).removeClass( [
    +				oSettings.oClasses.sSortable,
    +				oSettings.oClasses.sSortableAsc,
    +				oSettings.oClasses.sSortableDesc,
    +				oSettings.oClasses.sSortableNone ].join(' ')
    +			);
    +			if ( oSettings.bJUI )
    +			{
    +				$('th span.'+oSettings.oClasses.sSortIcon
    +					+ ', td span.'+oSettings.oClasses.sSortIcon, oSettings.nTHead).remove();
    +		
    +				$('th, td', oSettings.nTHead).each( function () {
    +					var jqWrapper = $('div.'+oSettings.oClasses.sSortJUIWrapper, this);
    +					var kids = jqWrapper.contents();
    +					$(this).append( kids );
    +					jqWrapper.remove();
    +				} );
    +			}
    +			
    +			/* Add the TR elements back into the table in their original order */
    +			if ( !bRemove && oSettings.nTableReinsertBefore )
    +			{
    +				nOrig.insertBefore( oSettings.nTable, oSettings.nTableReinsertBefore );
    +			}
    +			else if ( !bRemove )
    +			{
    +				nOrig.appendChild( oSettings.nTable );
    +			}
    +		
    +			for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
    +			{
    +				if ( oSettings.aoData[i].nTr !== null )
    +				{
    +					nBody.appendChild( oSettings.aoData[i].nTr );
    +				}
    +			}
    +			
    +			/* Restore the width of the original table */
    +			if ( oSettings.oFeatures.bAutoWidth === true )
    +			{
    +			  oSettings.nTable.style.width = _fnStringToCss(oSettings.sDestroyWidth);
    +			}
    +			
    +			/* If the were originally stripe classes - then we add them back here. Note
    +			 * this is not fool proof (for example if not all rows had stripe classes - but
    +			 * it's a good effort without getting carried away
    +			 */
    +			iLen = oSettings.asDestroyStripes.length;
    +			if (iLen)
    +			{
    +				var anRows = $(nBody).children('tr');
    +				for ( i=0 ; i<iLen ; i++ )
    +				{
    +					anRows.filter(':nth-child(' + iLen + 'n + ' + i + ')').addClass( oSettings.asDestroyStripes[i] );
    +				}
    +			}
    +			
    +			/* Remove the settings object from the settings array */
    +			for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )
    +			{
    +				if ( DataTable.settings[i] == oSettings )
    +				{
    +					DataTable.settings.splice( i, 1 );
    +				}
    +			}
    +			
    +			/* End it all */
    +			oSettings = null;
    +			oInit = null;
    +		};
    +		
    +		
    +		/**
    +		 * Redraw the table
    +		 *  @param {bool} [bComplete=true] Re-filter and resort (if enabled) the table before the draw.
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      
    +		 *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
    +		 *      oTable.fnDraw();
    +		 *    } );
    +		 */
    +		this.fnDraw = function( bComplete )
    +		{
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			if ( bComplete === false )
    +			{
    +				_fnCalculateEnd( oSettings );
    +				_fnDraw( oSettings );
    +			}
    +			else
    +			{
    +				_fnReDraw( oSettings );
    +			}
    +		};
    +		
    +		
    +		/**
    +		 * Filter the input based on data
    +		 *  @param {string} sInput String to filter the table on
    +		 *  @param {int|null} [iColumn] Column to limit filtering to
    +		 *  @param {bool} [bRegex=false] Treat as regular expression or not
    +		 *  @param {bool} [bSmart=true] Perform smart filtering or not
    +		 *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
    +		 *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      
    +		 *      // Sometime later - filter...
    +		 *      oTable.fnFilter( 'test string' );
    +		 *    } );
    +		 */
    +		this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
    +		{
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			
    +			if ( !oSettings.oFeatures.bFilter )
    +			{
    +				return;
    +			}
    +			
    +			if ( bRegex === undefined || bRegex === null )
    +			{
    +				bRegex = false;
    +			}
    +			
    +			if ( bSmart === undefined || bSmart === null )
    +			{
    +				bSmart = true;
    +			}
    +			
    +			if ( bShowGlobal === undefined || bShowGlobal === null )
    +			{
    +				bShowGlobal = true;
    +			}
    +			
    +			if ( bCaseInsensitive === undefined || bCaseInsensitive === null )
    +			{
    +				bCaseInsensitive = true;
    +			}
    +			
    +			if ( iColumn === undefined || iColumn === null )
    +			{
    +				/* Global filter */
    +				_fnFilterComplete( oSettings, {
    +					"sSearch":sInput+"",
    +					"bRegex": bRegex,
    +					"bSmart": bSmart,
    +					"bCaseInsensitive": bCaseInsensitive
    +				}, 1 );
    +				
    +				if ( bShowGlobal && oSettings.aanFeatures.f )
    +				{
    +					var n = oSettings.aanFeatures.f;
    +					for ( var i=0, iLen=n.length ; i<iLen ; i++ )
    +					{
    +						// IE9 throws an 'unknown error' if document.activeElement is used
    +						// inside an iframe or frame...
    +						try {
    +							if ( n[i]._DT_Input != document.activeElement )
    +							{
    +								$(n[i]._DT_Input).val( sInput );
    +							}
    +						}
    +						catch ( e ) {
    +							$(n[i]._DT_Input).val( sInput );
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				/* Single column filter */
    +				$.extend( oSettings.aoPreSearchCols[ iColumn ], {
    +					"sSearch": sInput+"",
    +					"bRegex": bRegex,
    +					"bSmart": bSmart,
    +					"bCaseInsensitive": bCaseInsensitive
    +				} );
    +				_fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
    +			}
    +		};
    +		
    +		
    +		/**
    +		 * Get the data for the whole table, an individual row or an individual cell based on the 
    +		 * provided parameters.
    +		 *  @param {int|node} [mRow] A TR row node, TD/TH cell node or an integer. If given as
    +		 *    a TR node then the data source for the whole row will be returned. If given as a
    +		 *    TD/TH cell node then iCol will be automatically calculated and the data for the
    +		 *    cell returned. If given as an integer, then this is treated as the aoData internal
    +		 *    data index for the row (see fnGetPosition) and the data for that row used.
    +		 *  @param {int} [iCol] Optional column index that you want the data of.
    +		 *  @returns {array|object|string} If mRow is undefined, then the data for all rows is
    +		 *    returned. If mRow is defined, just data for that row, and is iCol is
    +		 *    defined, only data for the designated cell is returned.
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    // Row data
    +		 *    $(document).ready(function() {
    +		 *      oTable = $('#example').dataTable();
    +		 *
    +		 *      oTable.$('tr').click( function () {
    +		 *        var data = oTable.fnGetData( this );
    +		 *        // ... do something with the array / object of data for the row
    +		 *      } );
    +		 *    } );
    +		 *
    +		 *  @example
    +		 *    // Individual cell data
    +		 *    $(document).ready(function() {
    +		 *      oTable = $('#example').dataTable();
    +		 *
    +		 *      oTable.$('td').click( function () {
    +		 *        var sData = oTable.fnGetData( this );
    +		 *        alert( 'The cell clicked on had the value of '+sData );
    +		 *      } );
    +		 *    } );
    +		 */
    +		this.fnGetData = function( mRow, iCol )
    +		{
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			
    +			if ( mRow !== undefined )
    +			{
    +				var iRow = mRow;
    +				if ( typeof mRow === 'object' )
    +				{
    +					var sNode = mRow.nodeName.toLowerCase();
    +					if (sNode === "tr" )
    +					{
    +						iRow = _fnNodeToDataIndex(oSettings, mRow);
    +					}
    +					else if ( sNode === "td" )
    +					{
    +						iRow = _fnNodeToDataIndex(oSettings, mRow.parentNode);
    +						iCol = _fnNodeToColumnIndex( oSettings, iRow, mRow );
    +					}
    +				}
    +		
    +				if ( iCol !== undefined )
    +				{
    +					return _fnGetCellData( oSettings, iRow, iCol, '' );
    +				}
    +				return (oSettings.aoData[iRow]!==undefined) ?
    +					oSettings.aoData[iRow]._aData : null;
    +			}
    +			return _fnGetDataMaster( oSettings );
    +		};
    +		
    +		
    +		/**
    +		 * Get an array of the TR nodes that are used in the table's body. Note that you will 
    +		 * typically want to use the '$' API method in preference to this as it is more 
    +		 * flexible.
    +		 *  @param {int} [iRow] Optional row index for the TR element you want
    +		 *  @returns {array|node} If iRow is undefined, returns an array of all TR elements
    +		 *    in the table's body, or iRow is defined, just the TR element requested.
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      
    +		 *      // Get the nodes from the table
    +		 *      var nNodes = oTable.fnGetNodes( );
    +		 *    } );
    +		 */
    +		this.fnGetNodes = function( iRow )
    +		{
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			
    +			if ( iRow !== undefined ) {
    +				return (oSettings.aoData[iRow]!==undefined) ?
    +					oSettings.aoData[iRow].nTr : null;
    +			}
    +			return _fnGetTrNodes( oSettings );
    +		};
    +		
    +		
    +		/**
    +		 * Get the array indexes of a particular cell from it's DOM element
    +		 * and column index including hidden columns
    +		 *  @param {node} nNode this can either be a TR, TD or TH in the table's body
    +		 *  @returns {int} If nNode is given as a TR, then a single index is returned, or
    +		 *    if given as a cell, an array of [row index, column index (visible), 
    +		 *    column index (all)] is given.
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      $('#example tbody td').click( function () {
    +		 *        // Get the position of the current data from the node
    +		 *        var aPos = oTable.fnGetPosition( this );
    +		 *        
    +		 *        // Get the data array for this row
    +		 *        var aData = oTable.fnGetData( aPos[0] );
    +		 *        
    +		 *        // Update the data array and return the value
    +		 *        aData[ aPos[1] ] = 'clicked';
    +		 *        this.innerHTML = 'clicked';
    +		 *      } );
    +		 *      
    +		 *      // Init DataTables
    +		 *      oTable = $('#example').dataTable();
    +		 *    } );
    +		 */
    +		this.fnGetPosition = function( nNode )
    +		{
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			var sNodeName = nNode.nodeName.toUpperCase();
    +			
    +			if ( sNodeName == "TR" )
    +			{
    +				return _fnNodeToDataIndex(oSettings, nNode);
    +			}
    +			else if ( sNodeName == "TD" || sNodeName == "TH" )
    +			{
    +				var iDataIndex = _fnNodeToDataIndex( oSettings, nNode.parentNode );
    +				var iColumnIndex = _fnNodeToColumnIndex( oSettings, iDataIndex, nNode );
    +				return [ iDataIndex, _fnColumnIndexToVisible(oSettings, iColumnIndex ), iColumnIndex ];
    +			}
    +			return null;
    +		};
    +		
    +		
    +		/**
    +		 * Check to see if a row is 'open' or not.
    +		 *  @param {node} nTr the table row to check
    +		 *  @returns {boolean} true if the row is currently open, false otherwise
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable;
    +		 *      
    +		 *      // 'open' an information row when a row is clicked on
    +		 *      $('#example tbody tr').click( function () {
    +		 *        if ( oTable.fnIsOpen(this) ) {
    +		 *          oTable.fnClose( this );
    +		 *        } else {
    +		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
    +		 *        }
    +		 *      } );
    +		 *      
    +		 *      oTable = $('#example').dataTable();
    +		 *    } );
    +		 */
    +		this.fnIsOpen = function( nTr )
    +		{
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			var aoOpenRows = oSettings.aoOpenRows;
    +			
    +			for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )
    +			{
    +				if ( oSettings.aoOpenRows[i].nParent == nTr )
    +				{
    +					return true;
    +				}
    +			}
    +			return false;
    +		};
    +		
    +		
    +		/**
    +		 * This function will place a new row directly after a row which is currently 
    +		 * on display on the page, with the HTML contents that is passed into the 
    +		 * function. This can be used, for example, to ask for confirmation that a 
    +		 * particular record should be deleted.
    +		 *  @param {node} nTr The table row to 'open'
    +		 *  @param {string|node|jQuery} mHtml The HTML to put into the row
    +		 *  @param {string} sClass Class to give the new TD cell
    +		 *  @returns {node} The row opened. Note that if the table row passed in as the
    +		 *    first parameter, is not found in the table, this method will silently
    +		 *    return.
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable;
    +		 *      
    +		 *      // 'open' an information row when a row is clicked on
    +		 *      $('#example tbody tr').click( function () {
    +		 *        if ( oTable.fnIsOpen(this) ) {
    +		 *          oTable.fnClose( this );
    +		 *        } else {
    +		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
    +		 *        }
    +		 *      } );
    +		 *      
    +		 *      oTable = $('#example').dataTable();
    +		 *    } );
    +		 */
    +		this.fnOpen = function( nTr, mHtml, sClass )
    +		{
    +			/* Find settings from table node */
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +		
    +			/* Check that the row given is in the table */
    +			var nTableRows = _fnGetTrNodes( oSettings );
    +			if ( $.inArray(nTr, nTableRows) === -1 )
    +			{
    +				return;
    +			}
    +			
    +			/* the old open one if there is one */
    +			this.fnClose( nTr );
    +			
    +			var nNewRow = document.createElement("tr");
    +			var nNewCell = document.createElement("td");
    +			nNewRow.appendChild( nNewCell );
    +			nNewCell.className = sClass;
    +			nNewCell.colSpan = _fnVisbleColumns( oSettings );
    +		
    +			if (typeof mHtml === "string")
    +			{
    +				nNewCell.innerHTML = mHtml;
    +			}
    +			else
    +			{
    +				$(nNewCell).html( mHtml );
    +			}
    +		
    +			/* If the nTr isn't on the page at the moment - then we don't insert at the moment */
    +			var nTrs = $('tr', oSettings.nTBody);
    +			if ( $.inArray(nTr, nTrs) != -1  )
    +			{
    +				$(nNewRow).insertAfter(nTr);
    +			}
    +			
    +			oSettings.aoOpenRows.push( {
    +				"nTr": nNewRow,
    +				"nParent": nTr
    +			} );
    +			
    +			return nNewRow;
    +		};
    +		
    +		
    +		/**
    +		 * Change the pagination - provides the internal logic for pagination in a simple API 
    +		 * function. With this function you can have a DataTables table go to the next, 
    +		 * previous, first or last pages.
    +		 *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
    +		 *    or page number to jump to (integer), note that page 0 is the first page.
    +		 *  @param {bool} [bRedraw=true] Redraw the table or not
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      oTable.fnPageChange( 'next' );
    +		 *    } );
    +		 */
    +		this.fnPageChange = function ( mAction, bRedraw )
    +		{
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			_fnPageChange( oSettings, mAction );
    +			_fnCalculateEnd( oSettings );
    +			
    +			if ( bRedraw === undefined || bRedraw )
    +			{
    +				_fnDraw( oSettings );
    +			}
    +		};
    +		
    +		
    +		/**
    +		 * Show a particular column
    +		 *  @param {int} iCol The column whose display should be changed
    +		 *  @param {bool} bShow Show (true) or hide (false) the column
    +		 *  @param {bool} [bRedraw=true] Redraw the table or not
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      
    +		 *      // Hide the second column after initialisation
    +		 *      oTable.fnSetColumnVis( 1, false );
    +		 *    } );
    +		 */
    +		this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
    +		{
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			var i, iLen;
    +			var aoColumns = oSettings.aoColumns;
    +			var aoData = oSettings.aoData;
    +			var nTd, bAppend, iBefore;
    +			
    +			/* No point in doing anything if we are requesting what is already true */
    +			if ( aoColumns[iCol].bVisible == bShow )
    +			{
    +				return;
    +			}
    +			
    +			/* Show the column */
    +			if ( bShow )
    +			{
    +				var iInsert = 0;
    +				for ( i=0 ; i<iCol ; i++ )
    +				{
    +					if ( aoColumns[i].bVisible )
    +					{
    +						iInsert++;
    +					}
    +				}
    +				
    +				/* Need to decide if we should use appendChild or insertBefore */
    +				bAppend = (iInsert >= _fnVisbleColumns( oSettings ));
    +		
    +				/* Which coloumn should we be inserting before? */
    +				if ( !bAppend )
    +				{
    +					for ( i=iCol ; i<aoColumns.length ; i++ )
    +					{
    +						if ( aoColumns[i].bVisible )
    +						{
    +							iBefore = i;
    +							break;
    +						}
    +					}
    +				}
    +		
    +				for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
    +				{
    +					if ( aoData[i].nTr !== null )
    +					{
    +						if ( bAppend )
    +						{
    +							aoData[i].nTr.appendChild( 
    +								aoData[i]._anHidden[iCol]
    +							);
    +						}
    +						else
    +						{
    +							aoData[i].nTr.insertBefore(
    +								aoData[i]._anHidden[iCol], 
    +								_fnGetTdNodes( oSettings, i )[iBefore] );
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				/* Remove a column from display */
    +				for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
    +				{
    +					if ( aoData[i].nTr !== null )
    +					{
    +						nTd = _fnGetTdNodes( oSettings, i )[iCol];
    +						aoData[i]._anHidden[iCol] = nTd;
    +						nTd.parentNode.removeChild( nTd );
    +					}
    +				}
    +			}
    +		
    +			/* Clear to set the visible flag */
    +			aoColumns[iCol].bVisible = bShow;
    +		
    +			/* Redraw the header and footer based on the new column visibility */
    +			_fnDrawHead( oSettings, oSettings.aoHeader );
    +			if ( oSettings.nTFoot )
    +			{
    +				_fnDrawHead( oSettings, oSettings.aoFooter );
    +			}
    +			
    +			/* If there are any 'open' rows, then we need to alter the colspan for this col change */
    +			for ( i=0, iLen=oSettings.aoOpenRows.length ; i<iLen ; i++ )
    +			{
    +				oSettings.aoOpenRows[i].nTr.colSpan = _fnVisbleColumns( oSettings );
    +			}
    +			
    +			/* Do a redraw incase anything depending on the table columns needs it 
    +			 * (built-in: scrolling) 
    +			 */
    +			if ( bRedraw === undefined || bRedraw )
    +			{
    +				_fnAdjustColumnSizing( oSettings );
    +				_fnDraw( oSettings );
    +			}
    +			
    +			_fnSaveState( oSettings );
    +		};
    +		
    +		
    +		/**
    +		 * Get the settings for a particular table for external manipulation
    +		 *  @returns {object} DataTables settings object. See 
    +		 *    {@link DataTable.models.oSettings}
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      var oSettings = oTable.fnSettings();
    +		 *      
    +		 *      // Show an example parameter from the settings
    +		 *      alert( oSettings._iDisplayStart );
    +		 *    } );
    +		 */
    +		this.fnSettings = function()
    +		{
    +			return _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +		};
    +		
    +		
    +		/**
    +		 * Sort the table by a particular column
    +		 *  @param {int} iCol the data index to sort on. Note that this will not match the 
    +		 *    'display index' if you have hidden data entries
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      
    +		 *      // Sort immediately with columns 0 and 1
    +		 *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
    +		 *    } );
    +		 */
    +		this.fnSort = function( aaSort )
    +		{
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			oSettings.aaSorting = aaSort;
    +			_fnSort( oSettings );
    +		};
    +		
    +		
    +		/**
    +		 * Attach a sort listener to an element for a given column
    +		 *  @param {node} nNode the element to attach the sort listener to
    +		 *  @param {int} iColumn the column that a click on this node will sort on
    +		 *  @param {function} [fnCallback] callback function when sort is run
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      
    +		 *      // Sort on column 1, when 'sorter' is clicked on
    +		 *      oTable.fnSortListener( document.getElementById('sorter'), 1 );
    +		 *    } );
    +		 */
    +		this.fnSortListener = function( nNode, iColumn, fnCallback )
    +		{
    +			_fnSortAttachListener( _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ), nNode, iColumn,
    +			 	fnCallback );
    +		};
    +		
    +		
    +		/**
    +		 * Update a table cell or row - this method will accept either a single value to
    +		 * update the cell with, an array of values with one element for each column or
    +		 * an object in the same format as the original data source. The function is
    +		 * self-referencing in order to make the multi column updates easier.
    +		 *  @param {object|array|string} mData Data to update the cell/row with
    +		 *  @param {node|int} mRow TR element you want to update or the aoData index
    +		 *  @param {int} [iColumn] The column to update (not used of mData is an array or object)
    +		 *  @param {bool} [bRedraw=true] Redraw the table or not
    +		 *  @param {bool} [bAction=true] Perform pre-draw actions or not
    +		 *  @returns {int} 0 on success, 1 on error
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
    +		 *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], 1, 0 ); // Row
    +		 *    } );
    +		 */
    +		this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
    +		{
    +			var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
    +			var i, iLen, sDisplay;
    +			var iRow = (typeof mRow === 'object') ? 
    +				_fnNodeToDataIndex(oSettings, mRow) : mRow;
    +			
    +			if ( $.isArray(mData) && iColumn === undefined )
    +			{
    +				/* Array update - update the whole row */
    +				oSettings.aoData[iRow]._aData = mData.slice();
    +				
    +				/* Flag to the function that we are recursing */
    +				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
    +				{
    +					this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
    +				}
    +			}
    +			else if ( $.isPlainObject(mData) && iColumn === undefined )
    +			{
    +				/* Object update - update the whole row - assume the developer gets the object right */
    +				oSettings.aoData[iRow]._aData = $.extend( true, {}, mData );
    +		
    +				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
    +				{
    +					this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
    +				}
    +			}
    +			else
    +			{
    +				/* Individual cell update */
    +				_fnSetCellData( oSettings, iRow, iColumn, mData );
    +				sDisplay = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
    +				
    +				var oCol = oSettings.aoColumns[iColumn];
    +				if ( oCol.fnRender !== null )
    +				{
    +					sDisplay = _fnRender( oSettings, iRow, iColumn );
    +					if ( oCol.bUseRendered )
    +					{
    +						_fnSetCellData( oSettings, iRow, iColumn, sDisplay );
    +					}
    +				}
    +				
    +				if ( oSettings.aoData[iRow].nTr !== null )
    +				{
    +					/* Do the actual HTML update */
    +					_fnGetTdNodes( oSettings, iRow )[iColumn].innerHTML = sDisplay;
    +				}
    +			}
    +			
    +			/* Modify the search index for this row (strictly this is likely not needed, since fnReDraw
    +			 * will rebuild the search array - however, the redraw might be disabled by the user)
    +			 */
    +			var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay );
    +			oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow(
    +				oSettings, 
    +				_fnGetRowData( oSettings, iRow, 'filter', _fnGetColumns( oSettings, 'bSearchable' ) )
    +			);
    +			
    +			/* Perform pre-draw actions */
    +			if ( bAction === undefined || bAction )
    +			{
    +				_fnAdjustColumnSizing( oSettings );
    +			}
    +			
    +			/* Redraw the table */
    +			if ( bRedraw === undefined || bRedraw )
    +			{
    +				_fnReDraw( oSettings );
    +			}
    +			return 0;
    +		};
    +		
    +		
    +		/**
    +		 * Provide a common method for plug-ins to check the version of DataTables being used, in order
    +		 * to ensure compatibility.
    +		 *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
    +		 *    formats "X" and "X.Y" are also acceptable.
    +		 *  @returns {boolean} true if this version of DataTables is greater or equal to the required
    +		 *    version, or false if this version of DataTales is not suitable
    +		 *  @method
    +		 *  @dtopt API
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      alert( oTable.fnVersionCheck( '1.9.0' ) );
    +		 *    } );
    +		 */
    +		this.fnVersionCheck = DataTable.ext.fnVersionCheck;
    +		
    +		
    +		/*
    +		 * This is really a good bit rubbish this method of exposing the internal methods
    +		 * publicly... - To be fixed in 2.0 using methods on the prototype
    +		 */
    +		
    +		
    +		/**
    +		 * Create a wrapper function for exporting an internal functions to an external API.
    +		 *  @param {string} sFunc API function name
    +		 *  @returns {function} wrapped function
    +		 *  @memberof DataTable#oApi
    +		 */
    +		function _fnExternApiFunc (sFunc)
    +		{
    +			return function() {
    +				var aArgs = [_fnSettingsFromNode(this[DataTable.ext.iApiIndex])].concat( 
    +					Array.prototype.slice.call(arguments) );
    +				return DataTable.ext.oApi[sFunc].apply( this, aArgs );
    +			};
    +		}
    +		
    +		
    +		/**
    +		 * Reference to internal functions for use by plug-in developers. Note that these
    +		 * methods are references to internal functions and are considered to be private.
    +		 * If you use these methods, be aware that they are liable to change between versions
    +		 * (check the upgrade notes).
    +		 *  @namespace
    +		 */
    +		this.oApi = {
    +			"_fnExternApiFunc": _fnExternApiFunc,
    +			"_fnInitialise": _fnInitialise,
    +			"_fnInitComplete": _fnInitComplete,
    +			"_fnLanguageCompat": _fnLanguageCompat,
    +			"_fnAddColumn": _fnAddColumn,
    +			"_fnColumnOptions": _fnColumnOptions,
    +			"_fnAddData": _fnAddData,
    +			"_fnCreateTr": _fnCreateTr,
    +			"_fnGatherData": _fnGatherData,
    +			"_fnBuildHead": _fnBuildHead,
    +			"_fnDrawHead": _fnDrawHead,
    +			"_fnDraw": _fnDraw,
    +			"_fnReDraw": _fnReDraw,
    +			"_fnAjaxUpdate": _fnAjaxUpdate,
    +			"_fnAjaxParameters": _fnAjaxParameters,
    +			"_fnAjaxUpdateDraw": _fnAjaxUpdateDraw,
    +			"_fnServerParams": _fnServerParams,
    +			"_fnAddOptionsHtml": _fnAddOptionsHtml,
    +			"_fnFeatureHtmlTable": _fnFeatureHtmlTable,
    +			"_fnScrollDraw": _fnScrollDraw,
    +			"_fnAdjustColumnSizing": _fnAdjustColumnSizing,
    +			"_fnFeatureHtmlFilter": _fnFeatureHtmlFilter,
    +			"_fnFilterComplete": _fnFilterComplete,
    +			"_fnFilterCustom": _fnFilterCustom,
    +			"_fnFilterColumn": _fnFilterColumn,
    +			"_fnFilter": _fnFilter,
    +			"_fnBuildSearchArray": _fnBuildSearchArray,
    +			"_fnBuildSearchRow": _fnBuildSearchRow,
    +			"_fnFilterCreateSearch": _fnFilterCreateSearch,
    +			"_fnDataToSearch": _fnDataToSearch,
    +			"_fnSort": _fnSort,
    +			"_fnSortAttachListener": _fnSortAttachListener,
    +			"_fnSortingClasses": _fnSortingClasses,
    +			"_fnFeatureHtmlPaginate": _fnFeatureHtmlPaginate,
    +			"_fnPageChange": _fnPageChange,
    +			"_fnFeatureHtmlInfo": _fnFeatureHtmlInfo,
    +			"_fnUpdateInfo": _fnUpdateInfo,
    +			"_fnFeatureHtmlLength": _fnFeatureHtmlLength,
    +			"_fnFeatureHtmlProcessing": _fnFeatureHtmlProcessing,
    +			"_fnProcessingDisplay": _fnProcessingDisplay,
    +			"_fnVisibleToColumnIndex": _fnVisibleToColumnIndex,
    +			"_fnColumnIndexToVisible": _fnColumnIndexToVisible,
    +			"_fnNodeToDataIndex": _fnNodeToDataIndex,
    +			"_fnVisbleColumns": _fnVisbleColumns,
    +			"_fnCalculateEnd": _fnCalculateEnd,
    +			"_fnConvertToWidth": _fnConvertToWidth,
    +			"_fnCalculateColumnWidths": _fnCalculateColumnWidths,
    +			"_fnScrollingWidthAdjust": _fnScrollingWidthAdjust,
    +			"_fnGetWidestNode": _fnGetWidestNode,
    +			"_fnGetMaxLenString": _fnGetMaxLenString,
    +			"_fnStringToCss": _fnStringToCss,
    +			"_fnDetectType": _fnDetectType,
    +			"_fnSettingsFromNode": _fnSettingsFromNode,
    +			"_fnGetDataMaster": _fnGetDataMaster,
    +			"_fnGetTrNodes": _fnGetTrNodes,
    +			"_fnGetTdNodes": _fnGetTdNodes,
    +			"_fnEscapeRegex": _fnEscapeRegex,
    +			"_fnDeleteIndex": _fnDeleteIndex,
    +			"_fnReOrderIndex": _fnReOrderIndex,
    +			"_fnColumnOrdering": _fnColumnOrdering,
    +			"_fnLog": _fnLog,
    +			"_fnClearTable": _fnClearTable,
    +			"_fnSaveState": _fnSaveState,
    +			"_fnLoadState": _fnLoadState,
    +			"_fnCreateCookie": _fnCreateCookie,
    +			"_fnReadCookie": _fnReadCookie,
    +			"_fnDetectHeader": _fnDetectHeader,
    +			"_fnGetUniqueThs": _fnGetUniqueThs,
    +			"_fnScrollBarWidth": _fnScrollBarWidth,
    +			"_fnApplyToChildren": _fnApplyToChildren,
    +			"_fnMap": _fnMap,
    +			"_fnGetRowData": _fnGetRowData,
    +			"_fnGetCellData": _fnGetCellData,
    +			"_fnSetCellData": _fnSetCellData,
    +			"_fnGetObjectDataFn": _fnGetObjectDataFn,
    +			"_fnSetObjectDataFn": _fnSetObjectDataFn,
    +			"_fnApplyColumnDefs": _fnApplyColumnDefs,
    +			"_fnBindAction": _fnBindAction,
    +			"_fnExtend": _fnExtend,
    +			"_fnCallbackReg": _fnCallbackReg,
    +			"_fnCallbackFire": _fnCallbackFire,
    +			"_fnJsonString": _fnJsonString,
    +			"_fnRender": _fnRender,
    +			"_fnNodeToColumnIndex": _fnNodeToColumnIndex,
    +			"_fnInfoMacros": _fnInfoMacros,
    +			"_fnBrowserDetect": _fnBrowserDetect,
    +			"_fnGetColumns": _fnGetColumns
    +		};
    +		
    +		$.extend( DataTable.ext.oApi, this.oApi );
    +		
    +		for ( var sFunc in DataTable.ext.oApi )
    +		{
    +			if ( sFunc )
    +			{
    +				this[sFunc] = _fnExternApiFunc(sFunc);
    +			}
    +		}
    +		
    +		
    +		var _that = this;
    +		this.each(function() {
    +			var i=0, iLen, j, jLen, k, kLen;
    +			var sId = this.getAttribute( 'id' );
    +			var bInitHandedOff = false;
    +			var bUsePassedData = false;
    +			
    +			
    +			/* Sanity check */
    +			if ( this.nodeName.toLowerCase() != 'table' )
    +			{
    +				_fnLog( null, 0, "Attempted to initialise DataTables on a node which is not a "+
    +					"table: "+this.nodeName );
    +				return;
    +			}
    +			
    +			/* Check to see if we are re-initialising a table */
    +			for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )
    +			{
    +				/* Base check on table node */
    +				if ( DataTable.settings[i].nTable == this )
    +				{
    +					if ( oInit === undefined || oInit.bRetrieve )
    +					{
    +						return DataTable.settings[i].oInstance;
    +					}
    +					else if ( oInit.bDestroy )
    +					{
    +						DataTable.settings[i].oInstance.fnDestroy();
    +						break;
    +					}
    +					else
    +					{
    +						_fnLog( DataTable.settings[i], 0, "Cannot reinitialise DataTable.\n\n"+
    +							"To retrieve the DataTables object for this table, pass no arguments or see "+
    +							"the docs for bRetrieve and bDestroy" );
    +						return;
    +					}
    +				}
    +				
    +				/* If the element we are initialising has the same ID as a table which was previously
    +				 * initialised, but the table nodes don't match (from before) then we destroy the old
    +				 * instance by simply deleting it. This is under the assumption that the table has been
    +				 * destroyed by other methods. Anyone using non-id selectors will need to do this manually
    +				 */
    +				if ( DataTable.settings[i].sTableId == this.id )
    +				{
    +					DataTable.settings.splice( i, 1 );
    +					break;
    +				}
    +			}
    +			
    +			/* Ensure the table has an ID - required for accessibility */
    +			if ( sId === null || sId === "" )
    +			{
    +				sId = "DataTables_Table_"+(DataTable.ext._oExternConfig.iNextUnique++);
    +				this.id = sId;
    +			}
    +			
    +			/* Create the settings object for this table and set some of the default parameters */
    +			var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
    +				"nTable":        this,
    +				"oApi":          _that.oApi,
    +				"oInit":         oInit,
    +				"sDestroyWidth": $(this).width(),
    +				"sInstance":     sId,
    +				"sTableId":      sId
    +			} );
    +			DataTable.settings.push( oSettings );
    +			
    +			// Need to add the instance after the instance after the settings object has been added
    +			// to the settings array, so we can self reference the table instance if more than one
    +			oSettings.oInstance = (_that.length===1) ? _that : $(this).dataTable();
    +			
    +			/* Setting up the initialisation object */
    +			if ( !oInit )
    +			{
    +				oInit = {};
    +			}
    +			
    +			// Backwards compatibility, before we apply all the defaults
    +			if ( oInit.oLanguage )
    +			{
    +				_fnLanguageCompat( oInit.oLanguage );
    +			}
    +			
    +			oInit = _fnExtend( $.extend(true, {}, DataTable.defaults), oInit );
    +			
    +			// Map the initialisation options onto the settings object
    +			_fnMap( oSettings.oFeatures, oInit, "bPaginate" );
    +			_fnMap( oSettings.oFeatures, oInit, "bLengthChange" );
    +			_fnMap( oSettings.oFeatures, oInit, "bFilter" );
    +			_fnMap( oSettings.oFeatures, oInit, "bSort" );
    +			_fnMap( oSettings.oFeatures, oInit, "bInfo" );
    +			_fnMap( oSettings.oFeatures, oInit, "bProcessing" );
    +			_fnMap( oSettings.oFeatures, oInit, "bAutoWidth" );
    +			_fnMap( oSettings.oFeatures, oInit, "bSortClasses" );
    +			_fnMap( oSettings.oFeatures, oInit, "bServerSide" );
    +			_fnMap( oSettings.oFeatures, oInit, "bDeferRender" );
    +			_fnMap( oSettings.oScroll, oInit, "sScrollX", "sX" );
    +			_fnMap( oSettings.oScroll, oInit, "sScrollXInner", "sXInner" );
    +			_fnMap( oSettings.oScroll, oInit, "sScrollY", "sY" );
    +			_fnMap( oSettings.oScroll, oInit, "bScrollCollapse", "bCollapse" );
    +			_fnMap( oSettings.oScroll, oInit, "bScrollInfinite", "bInfinite" );
    +			_fnMap( oSettings.oScroll, oInit, "iScrollLoadGap", "iLoadGap" );
    +			_fnMap( oSettings.oScroll, oInit, "bScrollAutoCss", "bAutoCss" );
    +			_fnMap( oSettings, oInit, "asStripeClasses" );
    +			_fnMap( oSettings, oInit, "asStripClasses", "asStripeClasses" ); // legacy
    +			_fnMap( oSettings, oInit, "fnServerData" );
    +			_fnMap( oSettings, oInit, "fnFormatNumber" );
    +			_fnMap( oSettings, oInit, "sServerMethod" );
    +			_fnMap( oSettings, oInit, "aaSorting" );
    +			_fnMap( oSettings, oInit, "aaSortingFixed" );
    +			_fnMap( oSettings, oInit, "aLengthMenu" );
    +			_fnMap( oSettings, oInit, "sPaginationType" );
    +			_fnMap( oSettings, oInit, "sAjaxSource" );
    +			_fnMap( oSettings, oInit, "sAjaxDataProp" );
    +			_fnMap( oSettings, oInit, "iCookieDuration" );
    +			_fnMap( oSettings, oInit, "sCookiePrefix" );
    +			_fnMap( oSettings, oInit, "sDom" );
    +			_fnMap( oSettings, oInit, "bSortCellsTop" );
    +			_fnMap( oSettings, oInit, "iTabIndex" );
    +			_fnMap( oSettings, oInit, "oSearch", "oPreviousSearch" );
    +			_fnMap( oSettings, oInit, "aoSearchCols", "aoPreSearchCols" );
    +			_fnMap( oSettings, oInit, "iDisplayLength", "_iDisplayLength" );
    +			_fnMap( oSettings, oInit, "bJQueryUI", "bJUI" );
    +			_fnMap( oSettings, oInit, "fnCookieCallback" );
    +			_fnMap( oSettings, oInit, "fnStateLoad" );
    +			_fnMap( oSettings, oInit, "fnStateSave" );
    +			_fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
    +			
    +			/* Callback functions which are array driven */
    +			_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );
    +			_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );
    +			_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );
    +			_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );
    +			_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );
    +			_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );
    +			_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );
    +			_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );
    +			_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );
    +			_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );
    +			_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );
    +			
    +			if ( oSettings.oFeatures.bServerSide && oSettings.oFeatures.bSort &&
    +				   oSettings.oFeatures.bSortClasses )
    +			{
    +				/* Enable sort classes for server-side processing. Safe to do it here, since server-side
    +				 * processing must be enabled by the developer
    +				 */
    +				_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'server_side_sort_classes' );
    +			}
    +			else if ( oSettings.oFeatures.bDeferRender )
    +			{
    +				_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'defer_sort_classes' );
    +			}
    +			
    +			if ( oInit.bJQueryUI )
    +			{
    +				/* Use the JUI classes object for display. You could clone the oStdClasses object if 
    +				 * you want to have multiple tables with multiple independent classes 
    +				 */
    +				$.extend( oSettings.oClasses, DataTable.ext.oJUIClasses );
    +				
    +				if ( oInit.sDom === DataTable.defaults.sDom && DataTable.defaults.sDom === "lfrtip" )
    +				{
    +					/* Set the DOM to use a layout suitable for jQuery UI's theming */
    +					oSettings.sDom = '<"H"lfr>t<"F"ip>';
    +				}
    +			}
    +			else
    +			{
    +				$.extend( oSettings.oClasses, DataTable.ext.oStdClasses );
    +			}
    +			$(this).addClass( oSettings.oClasses.sTable );
    +			
    +			/* Calculate the scroll bar width and cache it for use later on */
    +			if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
    +			{
    +				oSettings.oScroll.iBarWidth = _fnScrollBarWidth();
    +			}
    +			
    +			if ( oSettings.iInitDisplayStart === undefined )
    +			{
    +				/* Display start point, taking into account the save saving */
    +				oSettings.iInitDisplayStart = oInit.iDisplayStart;
    +				oSettings._iDisplayStart = oInit.iDisplayStart;
    +			}
    +			
    +			/* Must be done after everything which can be overridden by a cookie! */
    +			if ( oInit.bStateSave )
    +			{
    +				oSettings.oFeatures.bStateSave = true;
    +				_fnLoadState( oSettings, oInit );
    +				_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
    +			}
    +			
    +			if ( oInit.iDeferLoading !== null )
    +			{
    +				oSettings.bDeferLoading = true;
    +				var tmp = $.isArray( oInit.iDeferLoading );
    +				oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
    +				oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
    +			}
    +			
    +			if ( oInit.aaData !== null )
    +			{
    +				bUsePassedData = true;
    +			}
    +			
    +			/* Language definitions */
    +			if ( oInit.oLanguage.sUrl !== "" )
    +			{
    +				/* Get the language definitions from a file - because this Ajax call makes the language
    +				 * get async to the remainder of this function we use bInitHandedOff to indicate that 
    +				 * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
    +				 */
    +				oSettings.oLanguage.sUrl = oInit.oLanguage.sUrl;
    +				$.getJSON( oSettings.oLanguage.sUrl, null, function( json ) {
    +					_fnLanguageCompat( json );
    +					$.extend( true, oSettings.oLanguage, oInit.oLanguage, json );
    +					_fnInitialise( oSettings );
    +				} );
    +				bInitHandedOff = true;
    +			}
    +			else
    +			{
    +				$.extend( true, oSettings.oLanguage, oInit.oLanguage );
    +			}
    +			
    +			
    +			/*
    +			 * Stripes
    +			 */
    +			if ( oInit.asStripeClasses === null )
    +			{
    +				oSettings.asStripeClasses =[
    +					oSettings.oClasses.sStripeOdd,
    +					oSettings.oClasses.sStripeEven
    +				];
    +			}
    +			
    +			/* Remove row stripe classes if they are already on the table row */
    +			iLen=oSettings.asStripeClasses.length;
    +			oSettings.asDestroyStripes = [];
    +			if (iLen)
    +			{
    +				var bStripeRemove = false;
    +				var anRows = $(this).children('tbody').children('tr:lt(' + iLen + ')');
    +				for ( i=0 ; i<iLen ; i++ )
    +				{
    +					if ( anRows.hasClass( oSettings.asStripeClasses[i] ) )
    +					{
    +						bStripeRemove = true;
    +						
    +						/* Store the classes which we are about to remove so they can be re-added on destroy */
    +						oSettings.asDestroyStripes.push( oSettings.asStripeClasses[i] );
    +					}
    +				}
    +				
    +				if ( bStripeRemove )
    +				{
    +					anRows.removeClass( oSettings.asStripeClasses.join(' ') );
    +				}
    +			}
    +			
    +			/*
    +			 * Columns
    +			 * See if we should load columns automatically or use defined ones
    +			 */
    +			var anThs = [];
    +			var aoColumnsInit;
    +			var nThead = this.getElementsByTagName('thead');
    +			if ( nThead.length !== 0 )
    +			{
    +				_fnDetectHeader( oSettings.aoHeader, nThead[0] );
    +				anThs = _fnGetUniqueThs( oSettings );
    +			}
    +			
    +			/* If not given a column array, generate one with nulls */
    +			if ( oInit.aoColumns === null )
    +			{
    +				aoColumnsInit = [];
    +				for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
    +				{
    +					aoColumnsInit.push( null );
    +				}
    +			}
    +			else
    +			{
    +				aoColumnsInit = oInit.aoColumns;
    +			}
    +			
    +			/* Add the columns */
    +			for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
    +			{
    +				/* Short cut - use the loop to check if we have column visibility state to restore */
    +				if ( oInit.saved_aoColumns !== undefined && oInit.saved_aoColumns.length == iLen )
    +				{
    +					if ( aoColumnsInit[i] === null )
    +					{
    +						aoColumnsInit[i] = {};
    +					}
    +					aoColumnsInit[i].bVisible = oInit.saved_aoColumns[i].bVisible;
    +				}
    +				
    +				_fnAddColumn( oSettings, anThs ? anThs[i] : null );
    +			}
    +			
    +			/* Apply the column definitions */
    +			_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
    +				_fnColumnOptions( oSettings, iCol, oDef );
    +			} );
    +			
    +			
    +			/*
    +			 * Sorting
    +			 * Check the aaSorting array
    +			 */
    +			for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ )
    +			{
    +				if ( oSettings.aaSorting[i][0] >= oSettings.aoColumns.length )
    +				{
    +					oSettings.aaSorting[i][0] = 0;
    +				}
    +				var oColumn = oSettings.aoColumns[ oSettings.aaSorting[i][0] ];
    +				
    +				/* Add a default sorting index */
    +				if ( oSettings.aaSorting[i][2] === undefined )
    +				{
    +					oSettings.aaSorting[i][2] = 0;
    +				}
    +				
    +				/* If aaSorting is not defined, then we use the first indicator in asSorting */
    +				if ( oInit.aaSorting === undefined && oSettings.saved_aaSorting === undefined )
    +				{
    +					oSettings.aaSorting[i][1] = oColumn.asSorting[0];
    +				}
    +				
    +				/* Set the current sorting index based on aoColumns.asSorting */
    +				for ( j=0, jLen=oColumn.asSorting.length ; j<jLen ; j++ )
    +				{
    +					if ( oSettings.aaSorting[i][1] == oColumn.asSorting[j] )
    +					{
    +						oSettings.aaSorting[i][2] = j;
    +						break;
    +					}
    +				}
    +			}
    +				
    +			/* Do a first pass on the sorting classes (allows any size changes to be taken into
    +			 * account, and also will apply sorting disabled classes if disabled
    +			 */
    +			_fnSortingClasses( oSettings );
    +			
    +			
    +			/*
    +			 * Final init
    +			 * Cache the header, body and footer as required, creating them if needed
    +			 */
    +			
    +			/* Browser support detection */
    +			_fnBrowserDetect( oSettings );
    +			
    +			// Work around for Webkit bug 83867 - store the caption-side before removing from doc
    +			var captions = $(this).children('caption').each( function () {
    +				this._captionSide = $(this).css('caption-side');
    +			} );
    +			
    +			var thead = $(this).children('thead');
    +			if ( thead.length === 0 )
    +			{
    +				thead = [ document.createElement( 'thead' ) ];
    +				this.appendChild( thead[0] );
    +			}
    +			oSettings.nTHead = thead[0];
    +			
    +			var tbody = $(this).children('tbody');
    +			if ( tbody.length === 0 )
    +			{
    +				tbody = [ document.createElement( 'tbody' ) ];
    +				this.appendChild( tbody[0] );
    +			}
    +			oSettings.nTBody = tbody[0];
    +			oSettings.nTBody.setAttribute( "role", "alert" );
    +			oSettings.nTBody.setAttribute( "aria-live", "polite" );
    +			oSettings.nTBody.setAttribute( "aria-relevant", "all" );
    +			
    +			var tfoot = $(this).children('tfoot');
    +			if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") )
    +			{
    +				// If we are a scrolling table, and no footer has been given, then we need to create
    +				// a tfoot element for the caption element to be appended to
    +				tfoot = [ document.createElement( 'tfoot' ) ];
    +				this.appendChild( tfoot[0] );
    +			}
    +			
    +			if ( tfoot.length > 0 )
    +			{
    +				oSettings.nTFoot = tfoot[0];
    +				_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
    +			}
    +			
    +			/* Check if there is data passing into the constructor */
    +			if ( bUsePassedData )
    +			{
    +				for ( i=0 ; i<oInit.aaData.length ; i++ )
    +				{
    +					_fnAddData( oSettings, oInit.aaData[ i ] );
    +				}
    +			}
    +			else
    +			{
    +				/* Grab the data from the page */
    +				_fnGatherData( oSettings );
    +			}
    +			
    +			/* Copy the data index array */
    +			oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
    +			
    +			/* Initialisation complete - table can be drawn */
    +			oSettings.bInitialised = true;
    +			
    +			/* Check if we need to initialise the table (it might not have been handed off to the
    +			 * language processor)
    +			 */
    +			if ( bInitHandedOff === false )
    +			{
    +				_fnInitialise( oSettings );
    +			}
    +		} );
    +		_that = null;
    +		return this;
    +	};
    +
    +	
    +	
    +	/**
    +	 * Provide a common method for plug-ins to check the version of DataTables being used, in order
    +	 * to ensure compatibility.
    +	 *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
    +	 *    formats "X" and "X.Y" are also acceptable.
    +	 *  @returns {boolean} true if this version of DataTables is greater or equal to the required
    +	 *    version, or false if this version of DataTales is not suitable
    +	 *  @static
    +	 *  @dtopt API-Static
    +	 *
    +	 *  @example
    +	 *    alert( $.fn.dataTable.fnVersionCheck( '1.9.0' ) );
    +	 */
    +	DataTable.fnVersionCheck = function( sVersion )
    +	{
    +		/* This is cheap, but effective */
    +		var fnZPad = function (Zpad, count)
    +		{
    +			while(Zpad.length < count) {
    +				Zpad += '0';
    +			}
    +			return Zpad;
    +		};
    +		var aThis = DataTable.ext.sVersion.split('.');
    +		var aThat = sVersion.split('.');
    +		var sThis = '', sThat = '';
    +		
    +		for ( var i=0, iLen=aThat.length ; i<iLen ; i++ )
    +		{
    +			sThis += fnZPad( aThis[i], 3 );
    +			sThat += fnZPad( aThat[i], 3 );
    +		}
    +		
    +		return parseInt(sThis, 10) >= parseInt(sThat, 10);
    +	};
    +	
    +	
    +	/**
    +	 * Check if a TABLE node is a DataTable table already or not.
    +	 *  @param {node} nTable The TABLE node to check if it is a DataTable or not (note that other
    +	 *    node types can be passed in, but will always return false).
    +	 *  @returns {boolean} true the table given is a DataTable, or false otherwise
    +	 *  @static
    +	 *  @dtopt API-Static
    +	 *
    +	 *  @example
    +	 *    var ex = document.getElementById('example');
    +	 *    if ( ! $.fn.DataTable.fnIsDataTable( ex ) ) {
    +	 *      $(ex).dataTable();
    +	 *    }
    +	 */
    +	DataTable.fnIsDataTable = function ( nTable )
    +	{
    +		var o = DataTable.settings;
    +	
    +		for ( var i=0 ; i<o.length ; i++ )
    +		{
    +			if ( o[i].nTable === nTable || o[i].nScrollHead === nTable || o[i].nScrollFoot === nTable )
    +			{
    +				return true;
    +			}
    +		}
    +	
    +		return false;
    +	};
    +	
    +	
    +	/**
    +	 * Get all DataTable tables that have been initialised - optionally you can select to
    +	 * get only currently visible tables.
    +	 *  @param {boolean} [bVisible=false] Flag to indicate if you want all (default) or 
    +	 *    visible tables only.
    +	 *  @returns {array} Array of TABLE nodes (not DataTable instances) which are DataTables
    +	 *  @static
    +	 *  @dtopt API-Static
    +	 *
    +	 *  @example
    +	 *    var table = $.fn.dataTable.fnTables(true);
    +	 *    if ( table.length > 0 ) {
    +	 *      $(table).dataTable().fnAdjustColumnSizing();
    +	 *    }
    +	 */
    +	DataTable.fnTables = function ( bVisible )
    +	{
    +		var out = [];
    +	
    +		jQuery.each( DataTable.settings, function (i, o) {
    +			if ( !bVisible || (bVisible === true && $(o.nTable).is(':visible')) )
    +			{
    +				out.push( o.nTable );
    +			}
    +		} );
    +	
    +		return out;
    +	};
    +	
    +
    +	/**
    +	 * Version string for plug-ins to check compatibility. Allowed format is
    +	 * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and
    +	 * e are optional
    +	 *  @member
    +	 *  @type string
    +	 *  @default Version number
    +	 */
    +	DataTable.version = "1.9.4";
    +
    +	/**
    +	 * Private data store, containing all of the settings objects that are created for the
    +	 * tables on a given page.
    +	 * 
    +	 * Note that the <i>DataTable.settings</i> object is aliased to <i>jQuery.fn.dataTableExt</i> 
    +	 * through which it may be accessed and manipulated, or <i>jQuery.fn.dataTable.settings</i>.
    +	 *  @member
    +	 *  @type array
    +	 *  @default []
    +	 *  @private
    +	 */
    +	DataTable.settings = [];
    +
    +	/**
    +	 * Object models container, for the various models that DataTables has available
    +	 * to it. These models define the objects that are used to hold the active state 
    +	 * and configuration of the table.
    +	 *  @namespace
    +	 */
    +	DataTable.models = {};
    +	
    +	
    +	/**
    +	 * DataTables extension options and plug-ins. This namespace acts as a collection "area"
    +	 * for plug-ins that can be used to extend the default DataTables behaviour - indeed many
    +	 * of the build in methods use this method to provide their own capabilities (sorting methods
    +	 * for example).
    +	 * 
    +	 * Note that this namespace is aliased to jQuery.fn.dataTableExt so it can be readily accessed
    +	 * and modified by plug-ins.
    +	 *  @namespace
    +	 */
    +	DataTable.models.ext = {
    +		/**
    +		 * Plug-in filtering functions - this method of filtering is complimentary to the default
    +		 * type based filtering, and a lot more comprehensive as it allows you complete control
    +		 * over the filtering logic. Each element in this array is a function (parameters
    +		 * described below) that is called for every row in the table, and your logic decides if
    +		 * it should be included in the filtered data set or not.
    +		 *   <ul>
    +		 *     <li>
    +		 *       Function input parameters:
    +		 *       <ul>
    +		 *         <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
    +		 *         <li>{array|object} Data for the row to be processed (same as the original format
    +		 *           that was passed in as the data source, or an array from a DOM data source</li>
    +		 *         <li>{int} Row index in aoData ({@link DataTable.models.oSettings.aoData}), which can
    +		 *           be useful to retrieve the TR element if you need DOM interaction.</li>
    +		 *       </ul>
    +		 *     </li>
    +		 *     <li>
    +		 *       Function return:
    +		 *       <ul>
    +		 *         <li>{boolean} Include the row in the filtered result set (true) or not (false)</li>
    +		 *       </ul>
    +		 *     </il>
    +		 *   </ul>
    +		 *  @type array
    +		 *  @default []
    +		 *
    +		 *  @example
    +		 *    // The following example shows custom filtering being applied to the fourth column (i.e.
    +		 *    // the aData[3] index) based on two input values from the end-user, matching the data in 
    +		 *    // a certain range.
    +		 *    $.fn.dataTableExt.afnFiltering.push(
    +		 *      function( oSettings, aData, iDataIndex ) {
    +		 *        var iMin = document.getElementById('min').value * 1;
    +		 *        var iMax = document.getElementById('max').value * 1;
    +		 *        var iVersion = aData[3] == "-" ? 0 : aData[3]*1;
    +		 *        if ( iMin == "" && iMax == "" ) {
    +		 *          return true;
    +		 *        }
    +		 *        else if ( iMin == "" && iVersion < iMax ) {
    +		 *          return true;
    +		 *        }
    +		 *        else if ( iMin < iVersion && "" == iMax ) {
    +		 *          return true;
    +		 *        }
    +		 *        else if ( iMin < iVersion && iVersion < iMax ) {
    +		 *          return true;
    +		 *        }
    +		 *        return false;
    +		 *      }
    +		 *    );
    +		 */
    +		"afnFiltering": [],
    +	
    +	
    +		/**
    +		 * Plug-in sorting functions - this method of sorting is complimentary to the default type
    +		 * based sorting that DataTables does automatically, allowing much greater control over the
    +		 * the data that is being used to sort a column. This is useful if you want to do sorting
    +		 * based on live data (for example the contents of an 'input' element) rather than just the
    +		 * static string that DataTables knows of. The way these plug-ins work is that you create
    +		 * an array of the values you wish to be sorted for the column in question and then return
    +		 * that array. Which pre-sorting function is run here depends on the sSortDataType parameter
    +		 * that is used for the column (if any). This is the corollary of <i>ofnSearch</i> for sort 
    +		 * data.
    +		 *   <ul>
    +	     *     <li>
    +	     *       Function input parameters:
    +	     *       <ul>
    +		 *         <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
    +	     *         <li>{int} Target column index</li>
    +	     *       </ul>
    +	     *     </li>
    +		 *     <li>
    +		 *       Function return:
    +		 *       <ul>
    +		 *         <li>{array} Data for the column to be sorted upon</li>
    +		 *       </ul>
    +		 *     </il>
    +		 *   </ul>
    +		 *  
    +		 * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for
    +		 * the different uses that DataTables can put the data to. Specifically <i>mData</i> when
    +		 * used as a function will give you a 'type' (sorting, filtering etc) that you can use to 
    +		 * prepare the data as required for the different types. As such, this method is deprecated.
    +		 *  @type array
    +		 *  @default []
    +		 *  @deprecated
    +		 *
    +		 *  @example
    +		 *    // Updating the cached sorting information with user entered values in HTML input elements
    +		 *    jQuery.fn.dataTableExt.afnSortData['dom-text'] = function ( oSettings, iColumn )
    +		 *    {
    +		 *      var aData = [];
    +		 *      $( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {
    +		 *        aData.push( this.value );
    +		 *      } );
    +		 *      return aData;
    +		 *    }
    +		 */
    +		"afnSortData": [],
    +	
    +	
    +		/**
    +		 * Feature plug-ins - This is an array of objects which describe the feature plug-ins that are
    +		 * available to DataTables. These feature plug-ins are accessible through the sDom initialisation
    +		 * option. As such, each feature plug-in must describe a function that is used to initialise
    +		 * itself (fnInit), a character so the feature can be enabled by sDom (cFeature) and the name
    +		 * of the feature (sFeature). Thus the objects attached to this method must provide:
    +		 *   <ul>
    +		 *     <li>{function} fnInit Initialisation of the plug-in
    +		 *       <ul>
    +	     *         <li>
    +	     *           Function input parameters:
    +	     *           <ul>
    +		 *             <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
    +	     *           </ul>
    +	     *         </li>
    +		 *         <li>
    +		 *           Function return:
    +		 *           <ul>
    +		 *             <li>{node|null} The element which contains your feature. Note that the return
    +		 *                may also be void if your plug-in does not require to inject any DOM elements 
    +		 *                into DataTables control (sDom) - for example this might be useful when 
    +		 *                developing a plug-in which allows table control via keyboard entry.</li>
    +		 *           </ul>
    +		 *         </il>
    +		 *       </ul>
    +		 *     </li>
    +		 *     <li>{character} cFeature Character that will be matched in sDom - case sensitive</li>
    +		 *     <li>{string} sFeature Feature name</li>
    +		 *   </ul>
    +		 *  @type array
    +		 *  @default []
    +		 * 
    +		 *  @example
    +		 *    // How TableTools initialises itself.
    +		 *    $.fn.dataTableExt.aoFeatures.push( {
    +		 *      "fnInit": function( oSettings ) {
    +		 *        return new TableTools( { "oDTSettings": oSettings } );
    +		 *      },
    +		 *      "cFeature": "T",
    +		 *      "sFeature": "TableTools"
    +		 *    } );
    +		 */
    +		"aoFeatures": [],
    +	
    +	
    +		/**
    +		 * Type detection plug-in functions - DataTables utilises types to define how sorting and
    +		 * filtering behave, and types can be either  be defined by the developer (sType for the
    +		 * column) or they can be automatically detected by the methods in this array. The functions
    +		 * defined in the array are quite simple, taking a single parameter (the data to analyse) 
    +		 * and returning the type if it is a known type, or null otherwise.
    +		 *   <ul>
    +	     *     <li>
    +	     *       Function input parameters:
    +	     *       <ul>
    +		 *         <li>{*} Data from the column cell to be analysed</li>
    +	     *       </ul>
    +	     *     </li>
    +		 *     <li>
    +		 *       Function return:
    +		 *       <ul>
    +		 *         <li>{string|null} Data type detected, or null if unknown (and thus pass it
    +		 *           on to the other type detection functions.</li>
    +		 *       </ul>
    +		 *     </il>
    +		 *   </ul>
    +		 *  @type array
    +		 *  @default []
    +		 *  
    +		 *  @example
    +		 *    // Currency type detection plug-in:
    +		 *    jQuery.fn.dataTableExt.aTypes.push(
    +		 *      function ( sData ) {
    +		 *        var sValidChars = "0123456789.-";
    +		 *        var Char;
    +		 *        
    +		 *        // Check the numeric part
    +		 *        for ( i=1 ; i<sData.length ; i++ ) {
    +		 *          Char = sData.charAt(i); 
    +		 *          if (sValidChars.indexOf(Char) == -1) {
    +		 *            return null;
    +		 *          }
    +		 *        }
    +		 *        
    +		 *        // Check prefixed by currency
    +		 *        if ( sData.charAt(0) == '$' || sData.charAt(0) == '&pound;' ) {
    +		 *          return 'currency';
    +		 *        }
    +		 *        return null;
    +		 *      }
    +		 *    );
    +		 */
    +		"aTypes": [],
    +	
    +	
    +		/**
    +		 * Provide a common method for plug-ins to check the version of DataTables being used, 
    +		 * in order to ensure compatibility.
    +		 *  @type function
    +		 *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note 
    +		 *    that the formats "X" and "X.Y" are also acceptable.
    +		 *  @returns {boolean} true if this version of DataTables is greater or equal to the 
    +		 *    required version, or false if this version of DataTales is not suitable
    +		 *
    +		 *  @example
    +		 *    $(document).ready(function() {
    +		 *      var oTable = $('#example').dataTable();
    +		 *      alert( oTable.fnVersionCheck( '1.9.0' ) );
    +		 *    } );
    +		 */
    +		"fnVersionCheck": DataTable.fnVersionCheck,
    +	
    +	
    +		/**
    +		 * Index for what 'this' index API functions should use
    +		 *  @type int
    +		 *  @default 0
    +		 */
    +		"iApiIndex": 0,
    +	
    +	
    +		/**
    +		 * Pre-processing of filtering data plug-ins - When you assign the sType for a column
    +		 * (or have it automatically detected for you by DataTables or a type detection plug-in), 
    +		 * you will typically be using this for custom sorting, but it can also be used to provide 
    +		 * custom filtering by allowing you to pre-processing the data and returning the data in
    +		 * the format that should be filtered upon. This is done by adding functions this object 
    +		 * with a parameter name which matches the sType for that target column. This is the
    +		 * corollary of <i>afnSortData</i> for filtering data.
    +		 *   <ul>
    +	     *     <li>
    +	     *       Function input parameters:
    +	     *       <ul>
    +		 *         <li>{*} Data from the column cell to be prepared for filtering</li>
    +	     *       </ul>
    +	     *     </li>
    +		 *     <li>
    +		 *       Function return:
    +		 *       <ul>
    +		 *         <li>{string|null} Formatted string that will be used for the filtering.</li>
    +		 *       </ul>
    +		 *     </il>
    +		 *   </ul>
    +		 * 
    +		 * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for
    +		 * the different uses that DataTables can put the data to. Specifically <i>mData</i> when
    +		 * used as a function will give you a 'type' (sorting, filtering etc) that you can use to 
    +		 * prepare the data as required for the different types. As such, this method is deprecated.
    +		 *  @type object
    +		 *  @default {}
    +		 *  @deprecated
    +		 *
    +		 *  @example
    +		 *    $.fn.dataTableExt.ofnSearch['title-numeric'] = function ( sData ) {
    +		 *      return sData.replace(/\n/g," ").replace( /<.*?>/g, "" );
    +		 *    }
    +		 */
    +		"ofnSearch": {},
    +	
    +	
    +		/**
    +		 * Container for all private functions in DataTables so they can be exposed externally
    +		 *  @type object
    +		 *  @default {}
    +		 */
    +		"oApi": {},
    +	
    +	
    +		/**
    +		 * Storage for the various classes that DataTables uses
    +		 *  @type object
    +		 *  @default {}
    +		 */
    +		"oStdClasses": {},
    +		
    +	
    +		/**
    +		 * Storage for the various classes that DataTables uses - jQuery UI suitable
    +		 *  @type object
    +		 *  @default {}
    +		 */
    +		"oJUIClasses": {},
    +	
    +	
    +		/**
    +		 * Pagination plug-in methods - The style and controls of the pagination can significantly 
    +		 * impact on how the end user interacts with the data in your table, and DataTables allows 
    +		 * the addition of pagination controls by extending this object, which can then be enabled
    +		 * through the <i>sPaginationType</i> initialisation parameter. Each pagination type that
    +		 * is added is an object (the property name of which is what <i>sPaginationType</i> refers
    +		 * to) that has two properties, both methods that are used by DataTables to update the
    +		 * control's state.
    +		 *   <ul>
    +		 *     <li>
    +		 *       fnInit -  Initialisation of the paging controls. Called only during initialisation 
    +		 *         of the table. It is expected that this function will add the required DOM elements 
    +		 *         to the page for the paging controls to work. The element pointer 
    +		 *         'oSettings.aanFeatures.p' array is provided by DataTables to contain the paging 
    +		 *         controls (note that this is a 2D array to allow for multiple instances of each 
    +		 *         DataTables DOM element). It is suggested that you add the controls to this element 
    +		 *         as children
    +		 *       <ul>
    +	     *         <li>
    +	     *           Function input parameters:
    +	     *           <ul>
    +		 *             <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
    +		 *             <li>{node} Container into which the pagination controls must be inserted</li>
    +		 *             <li>{function} Draw callback function - whenever the controls cause a page
    +		 *               change, this method must be called to redraw the table.</li>
    +	     *           </ul>
    +	     *         </li>
    +		 *         <li>
    +		 *           Function return:
    +		 *           <ul>
    +		 *             <li>No return required</li>
    +		 *           </ul>
    +		 *         </il>
    +		 *       </ul>
    +		 *     </il>
    +		 *     <li>
    +		 *       fnInit -  This function is called whenever the paging status of the table changes and is
    +		 *         typically used to update classes and/or text of the paging controls to reflex the new 
    +		 *         status.
    +		 *       <ul>
    +	     *         <li>
    +	     *           Function input parameters:
    +	     *           <ul>
    +		 *             <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
    +		 *             <li>{function} Draw callback function - in case you need to redraw the table again
    +		 *               or attach new event listeners</li>
    +	     *           </ul>
    +	     *         </li>
    +		 *         <li>
    +		 *           Function return:
    +		 *           <ul>
    +		 *             <li>No return required</li>
    +		 *           </ul>
    +		 *         </il>
    +		 *       </ul>
    +		 *     </il>
    +		 *   </ul>
    +		 *  @type object
    +		 *  @default {}
    +		 *
    +		 *  @example
    +		 *    $.fn.dataTableExt.oPagination.four_button = {
    +		 *      "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) {
    +		 *        nFirst = document.createElement( 'span' );
    +		 *        nPrevious = document.createElement( 'span' );
    +		 *        nNext = document.createElement( 'span' );
    +		 *        nLast = document.createElement( 'span' );
    +		 *        
    +		 *        nFirst.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sFirst ) );
    +		 *        nPrevious.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sPrevious ) );
    +		 *        nNext.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sNext ) );
    +		 *        nLast.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sLast ) );
    +		 *        
    +		 *        nFirst.className = "paginate_button first";
    +		 *        nPrevious.className = "paginate_button previous";
    +		 *        nNext.className="paginate_button next";
    +		 *        nLast.className = "paginate_button last";
    +		 *        
    +		 *        nPaging.appendChild( nFirst );
    +		 *        nPaging.appendChild( nPrevious );
    +		 *        nPaging.appendChild( nNext );
    +		 *        nPaging.appendChild( nLast );
    +		 *        
    +		 *        $(nFirst).click( function () {
    +		 *          oSettings.oApi._fnPageChange( oSettings, "first" );
    +		 *          fnCallbackDraw( oSettings );
    +		 *        } );
    +		 *        
    +		 *        $(nPrevious).click( function() {
    +		 *          oSettings.oApi._fnPageChange( oSettings, "previous" );
    +		 *          fnCallbackDraw( oSettings );
    +		 *        } );
    +		 *        
    +		 *        $(nNext).click( function() {
    +		 *          oSettings.oApi._fnPageChange( oSettings, "next" );
    +		 *          fnCallbackDraw( oSettings );
    +		 *        } );
    +		 *        
    +		 *        $(nLast).click( function() {
    +		 *          oSettings.oApi._fnPageChange( oSettings, "last" );
    +		 *          fnCallbackDraw( oSettings );
    +		 *        } );
    +		 *        
    +		 *        $(nFirst).bind( 'selectstart', function () { return false; } );
    +		 *        $(nPrevious).bind( 'selectstart', function () { return false; } );
    +		 *        $(nNext).bind( 'selectstart', function () { return false; } );
    +		 *        $(nLast).bind( 'selectstart', function () { return false; } );
    +		 *      },
    +		 *      
    +		 *      "fnUpdate": function ( oSettings, fnCallbackDraw ) {
    +		 *        if ( !oSettings.aanFeatures.p ) {
    +		 *          return;
    +		 *        }
    +		 *        
    +		 *        // Loop over each instance of the pager
    +		 *        var an = oSettings.aanFeatures.p;
    +		 *        for ( var i=0, iLen=an.length ; i<iLen ; i++ ) {
    +		 *          var buttons = an[i].getElementsByTagName('span');
    +		 *          if ( oSettings._iDisplayStart === 0 ) {
    +		 *            buttons[0].className = "paginate_disabled_previous";
    +		 *            buttons[1].className = "paginate_disabled_previous";
    +		 *          }
    +		 *          else {
    +		 *            buttons[0].className = "paginate_enabled_previous";
    +		 *            buttons[1].className = "paginate_enabled_previous";
    +		 *          }
    +		 *          
    +		 *          if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) {
    +		 *            buttons[2].className = "paginate_disabled_next";
    +		 *            buttons[3].className = "paginate_disabled_next";
    +		 *          }
    +		 *          else {
    +		 *            buttons[2].className = "paginate_enabled_next";
    +		 *            buttons[3].className = "paginate_enabled_next";
    +		 *          }
    +		 *        }
    +		 *      }
    +		 *    };
    +		 */
    +		"oPagination": {},
    +	
    +	
    +		/**
    +		 * Sorting plug-in methods - Sorting in DataTables is based on the detected type of the
    +		 * data column (you can add your own type detection functions, or override automatic 
    +		 * detection using sType). With this specific type given to the column, DataTables will 
    +		 * apply the required sort from the functions in the object. Each sort type must provide
    +		 * two mandatory methods, one each for ascending and descending sorting, and can optionally
    +		 * provide a pre-formatting method that will help speed up sorting by allowing DataTables
    +		 * to pre-format the sort data only once (rather than every time the actual sort functions
    +		 * are run). The two sorting functions are typical Javascript sort methods:
    +		 *   <ul>
    +	     *     <li>
    +	     *       Function input parameters:
    +	     *       <ul>
    +		 *         <li>{*} Data to compare to the second parameter</li>
    +		 *         <li>{*} Data to compare to the first parameter</li>
    +	     *       </ul>
    +	     *     </li>
    +		 *     <li>
    +		 *       Function return:
    +		 *       <ul>
    +		 *         <li>{int} Sorting match: <0 if first parameter should be sorted lower than
    +		 *           the second parameter, ===0 if the two parameters are equal and >0 if
    +		 *           the first parameter should be sorted height than the second parameter.</li>
    +		 *       </ul>
    +		 *     </il>
    +		 *   </ul>
    +		 *  @type object
    +		 *  @default {}
    +		 *
    +		 *  @example
    +		 *    // Case-sensitive string sorting, with no pre-formatting method
    +		 *    $.extend( $.fn.dataTableExt.oSort, {
    +		 *      "string-case-asc": function(x,y) {
    +		 *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    +		 *      },
    +		 *      "string-case-desc": function(x,y) {
    +		 *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
    +		 *      }
    +		 *    } );
    +		 *
    +		 *  @example
    +		 *    // Case-insensitive string sorting, with pre-formatting
    +		 *    $.extend( $.fn.dataTableExt.oSort, {
    +		 *      "string-pre": function(x) {
    +		 *        return x.toLowerCase();
    +		 *      },
    +		 *      "string-asc": function(x,y) {
    +		 *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    +		 *      },
    +		 *      "string-desc": function(x,y) {
    +		 *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
    +		 *      }
    +		 *    } );
    +		 */
    +		"oSort": {},
    +	
    +	
    +		/**
    +		 * Version string for plug-ins to check compatibility. Allowed format is
    +		 * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and
    +		 * e are optional
    +		 *  @type string
    +		 *  @default Version number
    +		 */
    +		"sVersion": DataTable.version,
    +	
    +	
    +		/**
    +		 * How should DataTables report an error. Can take the value 'alert' or 'throw'
    +		 *  @type string
    +		 *  @default alert
    +		 */
    +		"sErrMode": "alert",
    +	
    +	
    +		/**
    +		 * Store information for DataTables to access globally about other instances
    +		 *  @namespace
    +		 *  @private
    +		 */
    +		"_oExternConfig": {
    +			/* int:iNextUnique - next unique number for an instance */
    +			"iNextUnique": 0
    +		}
    +	};
    +	
    +	
    +	
    +	
    +	/**
    +	 * Template object for the way in which DataTables holds information about
    +	 * search information for the global filter and individual column filters.
    +	 *  @namespace
    +	 */
    +	DataTable.models.oSearch = {
    +		/**
    +		 * Flag to indicate if the filtering should be case insensitive or not
    +		 *  @type boolean
    +		 *  @default true
    +		 */
    +		"bCaseInsensitive": true,
    +	
    +		/**
    +		 * Applied search term
    +		 *  @type string
    +		 *  @default <i>Empty string</i>
    +		 */
    +		"sSearch": "",
    +	
    +		/**
    +		 * Flag to indicate if the search term should be interpreted as a
    +		 * regular expression (true) or not (false) and therefore and special
    +		 * regex characters escaped.
    +		 *  @type boolean
    +		 *  @default false
    +		 */
    +		"bRegex": false,
    +	
    +		/**
    +		 * Flag to indicate if DataTables is to use its smart filtering or not.
    +		 *  @type boolean
    +		 *  @default true
    +		 */
    +		"bSmart": true
    +	};
    +	
    +	
    +	
    +	
    +	/**
    +	 * Template object for the way in which DataTables holds information about
    +	 * each individual row. This is the object format used for the settings 
    +	 * aoData array.
    +	 *  @namespace
    +	 */
    +	DataTable.models.oRow = {
    +		/**
    +		 * TR element for the row
    +		 *  @type node
    +		 *  @default null
    +		 */
    +		"nTr": null,
    +	
    +		/**
    +		 * Data object from the original data source for the row. This is either
    +		 * an array if using the traditional form of DataTables, or an object if
    +		 * using mData options. The exact type will depend on the passed in
    +		 * data from the data source, or will be an array if using DOM a data 
    +		 * source.
    +		 *  @type array|object
    +		 *  @default []
    +		 */
    +		"_aData": [],
    +	
    +		/**
    +		 * Sorting data cache - this array is ostensibly the same length as the
    +		 * number of columns (although each index is generated only as it is 
    +		 * needed), and holds the data that is used for sorting each column in the
    +		 * row. We do this cache generation at the start of the sort in order that
    +		 * the formatting of the sort data need be done only once for each cell
    +		 * per sort. This array should not be read from or written to by anything
    +		 * other than the master sorting methods.
    +		 *  @type array
    +		 *  @default []
    +		 *  @private
    +		 */
    +		"_aSortData": [],
    +	
    +		/**
    +		 * Array of TD elements that are cached for hidden rows, so they can be
    +		 * reinserted into the table if a column is made visible again (or to act
    +		 * as a store if a column is made hidden). Only hidden columns have a 
    +		 * reference in the array. For non-hidden columns the value is either
    +		 * undefined or null.
    +		 *  @type array nodes
    +		 *  @default []
    +		 *  @private
    +		 */
    +		"_anHidden": [],
    +	
    +		/**
    +		 * Cache of the class name that DataTables has applied to the row, so we
    +		 * can quickly look at this variable rather than needing to do a DOM check
    +		 * on className for the nTr property.
    +		 *  @type string
    +		 *  @default <i>Empty string</i>
    +		 *  @private
    +		 */
    +		"_sRowStripe": ""
    +	};
    +	
    +	
    +	
    +	/**
    +	 * Template object for the column information object in DataTables. This object
    +	 * is held in the settings aoColumns array and contains all the information that
    +	 * DataTables needs about each individual column.
    +	 * 
    +	 * Note that this object is related to {@link DataTable.defaults.columns} 
    +	 * but this one is the internal data store for DataTables's cache of columns.
    +	 * It should NOT be manipulated outside of DataTables. Any configuration should
    +	 * be done through the initialisation options.
    +	 *  @namespace
    +	 */
    +	DataTable.models.oColumn = {
    +		/**
    +		 * A list of the columns that sorting should occur on when this column
    +		 * is sorted. That this property is an array allows multi-column sorting
    +		 * to be defined for a column (for example first name / last name columns
    +		 * would benefit from this). The values are integers pointing to the
    +		 * columns to be sorted on (typically it will be a single integer pointing
    +		 * at itself, but that doesn't need to be the case).
    +		 *  @type array
    +		 */
    +		"aDataSort": null,
    +	
    +		/**
    +		 * Define the sorting directions that are applied to the column, in sequence
    +		 * as the column is repeatedly sorted upon - i.e. the first value is used
    +		 * as the sorting direction when the column if first sorted (clicked on).
    +		 * Sort it again (click again) and it will move on to the next index.
    +		 * Repeat until loop.
    +		 *  @type array
    +		 */
    +		"asSorting": null,
    +		
    +		/**
    +		 * Flag to indicate if the column is searchable, and thus should be included
    +		 * in the filtering or not.
    +		 *  @type boolean
    +		 */
    +		"bSearchable": null,
    +		
    +		/**
    +		 * Flag to indicate if the column is sortable or not.
    +		 *  @type boolean
    +		 */
    +		"bSortable": null,
    +		
    +		/**
    +		 * <code>Deprecated</code> When using fnRender, you have two options for what 
    +		 * to do with the data, and this property serves as the switch. Firstly, you 
    +		 * can have the sorting and filtering use the rendered value (true - default), 
    +		 * or you can have the sorting and filtering us the original value (false).
    +		 *
    +		 * Please note that this option has now been deprecated and will be removed
    +		 * in the next version of DataTables. Please use mRender / mData rather than
    +		 * fnRender.
    +		 *  @type boolean
    +		 *  @deprecated
    +		 */
    +		"bUseRendered": null,
    +		
    +		/**
    +		 * Flag to indicate if the column is currently visible in the table or not
    +		 *  @type boolean
    +		 */
    +		"bVisible": null,
    +		
    +		/**
    +		 * Flag to indicate to the type detection method if the automatic type
    +		 * detection should be used, or if a column type (sType) has been specified
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @private
    +		 */
    +		"_bAutoType": true,
    +		
    +		/**
    +		 * Developer definable function that is called whenever a cell is created (Ajax source,
    +		 * etc) or processed for input (DOM source). This can be used as a compliment to mRender
    +		 * allowing you to modify the DOM element (add background colour for example) when the
    +		 * element is available.
    +		 *  @type function
    +		 *  @param {element} nTd The TD node that has been created
    +		 *  @param {*} sData The Data for the cell
    +		 *  @param {array|object} oData The data for the whole row
    +		 *  @param {int} iRow The row index for the aoData data store
    +		 *  @default null
    +		 */
    +		"fnCreatedCell": null,
    +		
    +		/**
    +		 * Function to get data from a cell in a column. You should <b>never</b>
    +		 * access data directly through _aData internally in DataTables - always use
    +		 * the method attached to this property. It allows mData to function as
    +		 * required. This function is automatically assigned by the column 
    +		 * initialisation method
    +		 *  @type function
    +		 *  @param {array|object} oData The data array/object for the array 
    +		 *    (i.e. aoData[]._aData)
    +		 *  @param {string} sSpecific The specific data type you want to get - 
    +		 *    'display', 'type' 'filter' 'sort'
    +		 *  @returns {*} The data for the cell from the given row's data
    +		 *  @default null
    +		 */
    +		"fnGetData": null,
    +		
    +		/**
    +		 * <code>Deprecated</code> Custom display function that will be called for the 
    +		 * display of each cell in this column.
    +		 *
    +		 * Please note that this option has now been deprecated and will be removed
    +		 * in the next version of DataTables. Please use mRender / mData rather than
    +		 * fnRender.
    +		 *  @type function
    +		 *  @param {object} o Object with the following parameters:
    +		 *  @param {int}    o.iDataRow The row in aoData
    +		 *  @param {int}    o.iDataColumn The column in question
    +		 *  @param {array}  o.aData The data for the row in question
    +		 *  @param {object} o.oSettings The settings object for this DataTables instance
    +		 *  @returns {string} The string you which to use in the display
    +		 *  @default null
    +		 *  @deprecated
    +		 */
    +		"fnRender": null,
    +		
    +		/**
    +		 * Function to set data for a cell in the column. You should <b>never</b> 
    +		 * set the data directly to _aData internally in DataTables - always use
    +		 * this method. It allows mData to function as required. This function
    +		 * is automatically assigned by the column initialisation method
    +		 *  @type function
    +		 *  @param {array|object} oData The data array/object for the array 
    +		 *    (i.e. aoData[]._aData)
    +		 *  @param {*} sValue Value to set
    +		 *  @default null
    +		 */
    +		"fnSetData": null,
    +		
    +		/**
    +		 * Property to read the value for the cells in the column from the data 
    +		 * source array / object. If null, then the default content is used, if a
    +		 * function is given then the return from the function is used.
    +		 *  @type function|int|string|null
    +		 *  @default null
    +		 */
    +		"mData": null,
    +		
    +		/**
    +		 * Partner property to mData which is used (only when defined) to get
    +		 * the data - i.e. it is basically the same as mData, but without the
    +		 * 'set' option, and also the data fed to it is the result from mData.
    +		 * This is the rendering method to match the data method of mData.
    +		 *  @type function|int|string|null
    +		 *  @default null
    +		 */
    +		"mRender": null,
    +		
    +		/**
    +		 * Unique header TH/TD element for this column - this is what the sorting
    +		 * listener is attached to (if sorting is enabled.)
    +		 *  @type node
    +		 *  @default null
    +		 */
    +		"nTh": null,
    +		
    +		/**
    +		 * Unique footer TH/TD element for this column (if there is one). Not used 
    +		 * in DataTables as such, but can be used for plug-ins to reference the 
    +		 * footer for each column.
    +		 *  @type node
    +		 *  @default null
    +		 */
    +		"nTf": null,
    +		
    +		/**
    +		 * The class to apply to all TD elements in the table's TBODY for the column
    +		 *  @type string
    +		 *  @default null
    +		 */
    +		"sClass": null,
    +		
    +		/**
    +		 * When DataTables calculates the column widths to assign to each column,
    +		 * it finds the longest string in each column and then constructs a
    +		 * temporary table and reads the widths from that. The problem with this
    +		 * is that "mmm" is much wider then "iiii", but the latter is a longer 
    +		 * string - thus the calculation can go wrong (doing it properly and putting
    +		 * it into an DOM object and measuring that is horribly(!) slow). Thus as
    +		 * a "work around" we provide this option. It will append its value to the
    +		 * text that is found to be the longest string for the column - i.e. padding.
    +		 *  @type string
    +		 */
    +		"sContentPadding": null,
    +		
    +		/**
    +		 * Allows a default value to be given for a column's data, and will be used
    +		 * whenever a null data source is encountered (this can be because mData
    +		 * is set to null, or because the data source itself is null).
    +		 *  @type string
    +		 *  @default null
    +		 */
    +		"sDefaultContent": null,
    +		
    +		/**
    +		 * Name for the column, allowing reference to the column by name as well as
    +		 * by index (needs a lookup to work by name).
    +		 *  @type string
    +		 */
    +		"sName": null,
    +		
    +		/**
    +		 * Custom sorting data type - defines which of the available plug-ins in
    +		 * afnSortData the custom sorting will use - if any is defined.
    +		 *  @type string
    +		 *  @default std
    +		 */
    +		"sSortDataType": 'std',
    +		
    +		/**
    +		 * Class to be applied to the header element when sorting on this column
    +		 *  @type string
    +		 *  @default null
    +		 */
    +		"sSortingClass": null,
    +		
    +		/**
    +		 * Class to be applied to the header element when sorting on this column -
    +		 * when jQuery UI theming is used.
    +		 *  @type string
    +		 *  @default null
    +		 */
    +		"sSortingClassJUI": null,
    +		
    +		/**
    +		 * Title of the column - what is seen in the TH element (nTh).
    +		 *  @type string
    +		 */
    +		"sTitle": null,
    +		
    +		/**
    +		 * Column sorting and filtering type
    +		 *  @type string
    +		 *  @default null
    +		 */
    +		"sType": null,
    +		
    +		/**
    +		 * Width of the column
    +		 *  @type string
    +		 *  @default null
    +		 */
    +		"sWidth": null,
    +		
    +		/**
    +		 * Width of the column when it was first "encountered"
    +		 *  @type string
    +		 *  @default null
    +		 */
    +		"sWidthOrig": null
    +	};
    +	
    +	
    +	
    +	/**
    +	 * Initialisation options that can be given to DataTables at initialisation 
    +	 * time.
    +	 *  @namespace
    +	 */
    +	DataTable.defaults = {
    +		/**
    +		 * An array of data to use for the table, passed in at initialisation which 
    +		 * will be used in preference to any data which is already in the DOM. This is
    +		 * particularly useful for constructing tables purely in Javascript, for
    +		 * example with a custom Ajax call.
    +		 *  @type array
    +		 *  @default null
    +		 *  @dtopt Option
    +		 * 
    +		 *  @example
    +		 *    // Using a 2D array data source
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "aaData": [
    +		 *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
    +		 *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
    +		 *        ],
    +		 *        "aoColumns": [
    +		 *          { "sTitle": "Engine" },
    +		 *          { "sTitle": "Browser" },
    +		 *          { "sTitle": "Platform" },
    +		 *          { "sTitle": "Version" },
    +		 *          { "sTitle": "Grade" }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using an array of objects as a data source (mData)
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "aaData": [
    +		 *          {
    +		 *            "engine":   "Trident",
    +		 *            "browser":  "Internet Explorer 4.0",
    +		 *            "platform": "Win 95+",
    +		 *            "version":  4,
    +		 *            "grade":    "X"
    +		 *          },
    +		 *          {
    +		 *            "engine":   "Trident",
    +		 *            "browser":  "Internet Explorer 5.0",
    +		 *            "platform": "Win 95+",
    +		 *            "version":  5,
    +		 *            "grade":    "C"
    +		 *          }
    +		 *        ],
    +		 *        "aoColumns": [
    +		 *          { "sTitle": "Engine",   "mData": "engine" },
    +		 *          { "sTitle": "Browser",  "mData": "browser" },
    +		 *          { "sTitle": "Platform", "mData": "platform" },
    +		 *          { "sTitle": "Version",  "mData": "version" },
    +		 *          { "sTitle": "Grade",    "mData": "grade" }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"aaData": null,
    +	
    +	
    +		/**
    +		 * If sorting is enabled, then DataTables will perform a first pass sort on 
    +		 * initialisation. You can define which column(s) the sort is performed upon, 
    +		 * and the sorting direction, with this variable. The aaSorting array should 
    +		 * contain an array for each column to be sorted initially containing the 
    +		 * column's index and a direction string ('asc' or 'desc').
    +		 *  @type array
    +		 *  @default [[0,'asc']]
    +		 *  @dtopt Option
    +		 * 
    +		 *  @example
    +		 *    // Sort by 3rd column first, and then 4th column
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aaSorting": [[2,'asc'], [3,'desc']]
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *    // No initial sorting
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aaSorting": []
    +		 *      } );
    +		 *    } );
    +		 */
    +		"aaSorting": [[0,'asc']],
    +	
    +	
    +		/**
    +		 * This parameter is basically identical to the aaSorting parameter, but 
    +		 * cannot be overridden by user interaction with the table. What this means 
    +		 * is that you could have a column (visible or hidden) which the sorting will 
    +		 * always be forced on first - any sorting after that (from the user) will 
    +		 * then be performed as required. This can be useful for grouping rows 
    +		 * together.
    +		 *  @type array
    +		 *  @default null
    +		 *  @dtopt Option
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aaSortingFixed": [[0,'asc']]
    +		 *      } );
    +		 *    } )
    +		 */
    +		"aaSortingFixed": null,
    +	
    +	
    +		/**
    +		 * This parameter allows you to readily specify the entries in the length drop
    +		 * down menu that DataTables shows when pagination is enabled. It can be 
    +		 * either a 1D array of options which will be used for both the displayed 
    +		 * option and the value, or a 2D array which will use the array in the first 
    +		 * position as the value, and the array in the second position as the 
    +		 * displayed options (useful for language strings such as 'All').
    +		 *  @type array
    +		 *  @default [ 10, 25, 50, 100 ]
    +		 *  @dtopt Option
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
    +		 *      } );
    +		 *    } );
    +		 *  
    +		 *  @example
    +		 *    // Setting the default display length as well as length menu
    +		 *    // This is likely to be wanted if you remove the '10' option which
    +		 *    // is the iDisplayLength default.
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "iDisplayLength": 25,
    +		 *        "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"aLengthMenu": [ 10, 25, 50, 100 ],
    +	
    +	
    +		/**
    +		 * The aoColumns option in the initialisation parameter allows you to define
    +		 * details about the way individual columns behave. For a full list of
    +		 * column options that can be set, please see 
    +		 * {@link DataTable.defaults.columns}. Note that if you use aoColumns to
    +		 * define your columns, you must have an entry in the array for every single
    +		 * column that you have in your table (these can be null if you don't which
    +		 * to specify any options).
    +		 *  @member
    +		 */
    +		"aoColumns": null,
    +	
    +		/**
    +		 * Very similar to aoColumns, aoColumnDefs allows you to target a specific 
    +		 * column, multiple columns, or all columns, using the aTargets property of 
    +		 * each object in the array. This allows great flexibility when creating 
    +		 * tables, as the aoColumnDefs arrays can be of any length, targeting the 
    +		 * columns you specifically want. aoColumnDefs may use any of the column 
    +		 * options available: {@link DataTable.defaults.columns}, but it _must_
    +		 * have aTargets defined in each object in the array. Values in the aTargets
    +		 * array may be:
    +		 *   <ul>
    +		 *     <li>a string - class name will be matched on the TH for the column</li>
    +		 *     <li>0 or a positive integer - column index counting from the left</li>
    +		 *     <li>a negative integer - column index counting from the right</li>
    +		 *     <li>the string "_all" - all columns (i.e. assign a default)</li>
    +		 *   </ul>
    +		 *  @member
    +		 */
    +		"aoColumnDefs": null,
    +	
    +	
    +		/**
    +		 * Basically the same as oSearch, this parameter defines the individual column
    +		 * filtering state at initialisation time. The array must be of the same size 
    +		 * as the number of columns, and each element be an object with the parameters
    +		 * "sSearch" and "bEscapeRegex" (the latter is optional). 'null' is also
    +		 * accepted and the default will be used.
    +		 *  @type array
    +		 *  @default []
    +		 *  @dtopt Option
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoSearchCols": [
    +		 *          null,
    +		 *          { "sSearch": "My filter" },
    +		 *          null,
    +		 *          { "sSearch": "^[0-9]", "bEscapeRegex": false }
    +		 *        ]
    +		 *      } );
    +		 *    } )
    +		 */
    +		"aoSearchCols": [],
    +	
    +	
    +		/**
    +		 * An array of CSS classes that should be applied to displayed rows. This 
    +		 * array may be of any length, and DataTables will apply each class 
    +		 * sequentially, looping when required.
    +		 *  @type array
    +		 *  @default null <i>Will take the values determined by the oClasses.sStripe*
    +		 *    options</i>
    +		 *  @dtopt Option
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "asStripeClasses": [ 'strip1', 'strip2', 'strip3' ]
    +		 *      } );
    +		 *    } )
    +		 */
    +		"asStripeClasses": null,
    +	
    +	
    +		/**
    +		 * Enable or disable automatic column width calculation. This can be disabled
    +		 * as an optimisation (it takes some time to calculate the widths) if the
    +		 * tables widths are passed in using aoColumns.
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "bAutoWidth": false
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bAutoWidth": true,
    +	
    +	
    +		/**
    +		 * Deferred rendering can provide DataTables with a huge speed boost when you
    +		 * are using an Ajax or JS data source for the table. This option, when set to
    +		 * true, will cause DataTables to defer the creation of the table elements for
    +		 * each row until they are needed for a draw - saving a significant amount of
    +		 * time.
    +		 *  @type boolean
    +		 *  @default false
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      var oTable = $('#example').dataTable( {
    +		 *        "sAjaxSource": "sources/arrays.txt",
    +		 *        "bDeferRender": true
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bDeferRender": false,
    +	
    +	
    +		/**
    +		 * Replace a DataTable which matches the given selector and replace it with 
    +		 * one which has the properties of the new initialisation object passed. If no
    +		 * table matches the selector, then the new DataTable will be constructed as
    +		 * per normal.
    +		 *  @type boolean
    +		 *  @default false
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "sScrollY": "200px",
    +		 *        "bPaginate": false
    +		 *      } );
    +		 *      
    +		 *      // Some time later....
    +		 *      $('#example').dataTable( {
    +		 *        "bFilter": false,
    +		 *        "bDestroy": true
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bDestroy": false,
    +	
    +	
    +		/**
    +		 * Enable or disable filtering of data. Filtering in DataTables is "smart" in
    +		 * that it allows the end user to input multiple words (space separated) and
    +		 * will match a row containing those words, even if not in the order that was
    +		 * specified (this allow matching across multiple columns). Note that if you
    +		 * wish to use filtering in DataTables this must remain 'true' - to remove the
    +		 * default filtering input box and retain filtering abilities, please use
    +		 * {@link DataTable.defaults.sDom}.
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "bFilter": false
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bFilter": true,
    +	
    +	
    +		/**
    +		 * Enable or disable the table information display. This shows information 
    +		 * about the data that is currently visible on the page, including information
    +		 * about filtered data if that action is being performed.
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "bInfo": false
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bInfo": true,
    +	
    +	
    +		/**
    +		 * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some
    +		 * slightly different and additional mark-up from what DataTables has
    +		 * traditionally used).
    +		 *  @type boolean
    +		 *  @default false
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bJQueryUI": true
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bJQueryUI": false,
    +	
    +	
    +		/**
    +		 * Allows the end user to select the size of a formatted page from a select
    +		 * menu (sizes are 10, 25, 50 and 100). Requires pagination (bPaginate).
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "bLengthChange": false
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bLengthChange": true,
    +	
    +	
    +		/**
    +		 * Enable or disable pagination.
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "bPaginate": false
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bPaginate": true,
    +	
    +	
    +		/**
    +		 * Enable or disable the display of a 'processing' indicator when the table is
    +		 * being processed (e.g. a sort). This is particularly useful for tables with
    +		 * large amounts of data where it can take a noticeable amount of time to sort
    +		 * the entries.
    +		 *  @type boolean
    +		 *  @default false
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "bProcessing": true
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bProcessing": false,
    +	
    +	
    +		/**
    +		 * Retrieve the DataTables object for the given selector. Note that if the
    +		 * table has already been initialised, this parameter will cause DataTables
    +		 * to simply return the object that has already been set up - it will not take
    +		 * account of any changes you might have made to the initialisation object
    +		 * passed to DataTables (setting this parameter to true is an acknowledgement
    +		 * that you understand this). bDestroy can be used to reinitialise a table if
    +		 * you need.
    +		 *  @type boolean
    +		 *  @default false
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      initTable();
    +		 *      tableActions();
    +		 *    } );
    +		 *    
    +		 *    function initTable ()
    +		 *    {
    +		 *      return $('#example').dataTable( {
    +		 *        "sScrollY": "200px",
    +		 *        "bPaginate": false,
    +		 *        "bRetrieve": true
    +		 *      } );
    +		 *    }
    +		 *    
    +		 *    function tableActions ()
    +		 *    {
    +		 *      var oTable = initTable();
    +		 *      // perform API operations with oTable 
    +		 *    }
    +		 */
    +		"bRetrieve": false,
    +	
    +	
    +		/**
    +		 * Indicate if DataTables should be allowed to set the padding / margin
    +		 * etc for the scrolling header elements or not. Typically you will want
    +		 * this.
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bScrollAutoCss": false,
    +		 *        "sScrollY": "200px"
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bScrollAutoCss": true,
    +	
    +	
    +		/**
    +		 * When vertical (y) scrolling is enabled, DataTables will force the height of
    +		 * the table's viewport to the given height at all times (useful for layout).
    +		 * However, this can look odd when filtering data down to a small data set,
    +		 * and the footer is left "floating" further down. This parameter (when
    +		 * enabled) will cause DataTables to collapse the table's viewport down when
    +		 * the result set will fit within the given Y height.
    +		 *  @type boolean
    +		 *  @default false
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "sScrollY": "200",
    +		 *        "bScrollCollapse": true
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bScrollCollapse": false,
    +	
    +	
    +		/**
    +		 * Enable infinite scrolling for DataTables (to be used in combination with
    +		 * sScrollY). Infinite scrolling means that DataTables will continually load
    +		 * data as a user scrolls through a table, which is very useful for large
    +		 * dataset. This cannot be used with pagination, which is automatically
    +		 * disabled. Note - the Scroller extra for DataTables is recommended in
    +		 * in preference to this option.
    +		 *  @type boolean
    +		 *  @default false
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bScrollInfinite": true,
    +		 *        "bScrollCollapse": true,
    +		 *        "sScrollY": "200px"
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bScrollInfinite": false,
    +	
    +	
    +		/**
    +		 * Configure DataTables to use server-side processing. Note that the
    +		 * sAjaxSource parameter must also be given in order to give DataTables a
    +		 * source to obtain the required data for each draw.
    +		 *  @type boolean
    +		 *  @default false
    +		 *  @dtopt Features
    +		 *  @dtopt Server-side
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "bServerSide": true,
    +		 *        "sAjaxSource": "xhr.php"
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bServerSide": false,
    +	
    +	
    +		/**
    +		 * Enable or disable sorting of columns. Sorting of individual columns can be
    +		 * disabled by the "bSortable" option for each column.
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "bSort": false
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bSort": true,
    +	
    +	
    +		/**
    +		 * Allows control over whether DataTables should use the top (true) unique
    +		 * cell that is found for a single column, or the bottom (false - default).
    +		 * This is useful when using complex headers.
    +		 *  @type boolean
    +		 *  @default false
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bSortCellsTop": true
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bSortCellsTop": false,
    +	
    +	
    +		/**
    +		 * Enable or disable the addition of the classes 'sorting_1', 'sorting_2' and
    +		 * 'sorting_3' to the columns which are currently being sorted on. This is
    +		 * presented as a feature switch as it can increase processing time (while
    +		 * classes are removed and added) so for large data sets you might want to
    +		 * turn this off.
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "bSortClasses": false
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bSortClasses": true,
    +	
    +	
    +		/**
    +		 * Enable or disable state saving. When enabled a cookie will be used to save
    +		 * table display information such as pagination information, display length,
    +		 * filtering and sorting. As such when the end user reloads the page the
    +		 * display display will match what thy had previously set up.
    +		 *  @type boolean
    +		 *  @default false
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "bStateSave": true
    +		 *      } );
    +		 *    } );
    +		 */
    +		"bStateSave": false,
    +	
    +	
    +		/**
    +		 * Customise the cookie and / or the parameters being stored when using
    +		 * DataTables with state saving enabled. This function is called whenever
    +		 * the cookie is modified, and it expects a fully formed cookie string to be
    +		 * returned. Note that the data object passed in is a Javascript object which
    +		 * must be converted to a string (JSON.stringify for example).
    +		 *  @type function
    +		 *  @param {string} sName Name of the cookie defined by DataTables
    +		 *  @param {object} oData Data to be stored in the cookie
    +		 *  @param {string} sExpires Cookie expires string
    +		 *  @param {string} sPath Path of the cookie to set
    +		 *  @returns {string} Cookie formatted string (which should be encoded by
    +		 *    using encodeURIComponent())
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function () {
    +		 *      $('#example').dataTable( {
    +		 *        "fnCookieCallback": function (sName, oData, sExpires, sPath) {
    +		 *          // Customise oData or sName or whatever else here
    +		 *          return sName + "="+JSON.stringify(oData)+"; expires=" + sExpires +"; path=" + sPath;
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnCookieCallback": null,
    +	
    +	
    +		/**
    +		 * This function is called when a TR element is created (and all TD child
    +		 * elements have been inserted), or registered if using a DOM source, allowing
    +		 * manipulation of the TR element (adding classes etc).
    +		 *  @type function
    +		 *  @param {node} nRow "TR" element for the current row
    +		 *  @param {array} aData Raw data array for this row
    +		 *  @param {int} iDataIndex The index of this row in aoData
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "fnCreatedRow": function( nRow, aData, iDataIndex ) {
    +		 *          // Bold the grade for all 'A' grade browsers
    +		 *          if ( aData[4] == "A" )
    +		 *          {
    +		 *            $('td:eq(4)', nRow).html( '<b>A</b>' );
    +		 *          }
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnCreatedRow": null,
    +	
    +	
    +		/**
    +		 * This function is called on every 'draw' event, and allows you to
    +		 * dynamically modify any aspect you want about the created DOM.
    +		 *  @type function
    +		 *  @param {object} oSettings DataTables settings object
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "fnDrawCallback": function( oSettings ) {
    +		 *          alert( 'DataTables has redrawn the table' );
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnDrawCallback": null,
    +	
    +	
    +		/**
    +		 * Identical to fnHeaderCallback() but for the table footer this function
    +		 * allows you to modify the table footer on every 'draw' even.
    +		 *  @type function
    +		 *  @param {node} nFoot "TR" element for the footer
    +		 *  @param {array} aData Full table data (as derived from the original HTML)
    +		 *  @param {int} iStart Index for the current display starting point in the 
    +		 *    display array
    +		 *  @param {int} iEnd Index for the current display ending point in the 
    +		 *    display array
    +		 *  @param {array int} aiDisplay Index array to translate the visual position
    +		 *    to the full data array
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "fnFooterCallback": function( nFoot, aData, iStart, iEnd, aiDisplay ) {
    +		 *          nFoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+iStart;
    +		 *        }
    +		 *      } );
    +		 *    } )
    +		 */
    +		"fnFooterCallback": null,
    +	
    +	
    +		/**
    +		 * When rendering large numbers in the information element for the table
    +		 * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
    +		 * to have a comma separator for the 'thousands' units (e.g. 1 million is
    +		 * rendered as "1,000,000") to help readability for the end user. This
    +		 * function will override the default method DataTables uses.
    +		 *  @type function
    +		 *  @member
    +		 *  @param {int} iIn number to be formatted
    +		 *  @returns {string} formatted string for DataTables to show the number
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "fnFormatNumber": function ( iIn ) {
    +		 *          if ( iIn &lt; 1000 ) {
    +		 *            return iIn;
    +		 *          } else {
    +		 *            var 
    +		 *              s=(iIn+""), 
    +		 *              a=s.split(""), out="", 
    +		 *              iLen=s.length;
    +		 *            
    +		 *            for ( var i=0 ; i&lt;iLen ; i++ ) {
    +		 *              if ( i%3 === 0 &amp;&amp; i !== 0 ) {
    +		 *                out = "'"+out;
    +		 *              }
    +		 *              out = a[iLen-i-1]+out;
    +		 *            }
    +		 *          }
    +		 *          return out;
    +		 *        };
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnFormatNumber": function ( iIn ) {
    +			if ( iIn < 1000 )
    +			{
    +				// A small optimisation for what is likely to be the majority of use cases
    +				return iIn;
    +			}
    +	
    +			var s=(iIn+""), a=s.split(""), out="", iLen=s.length;
    +			
    +			for ( var i=0 ; i<iLen ; i++ )
    +			{
    +				if ( i%3 === 0 && i !== 0 )
    +				{
    +					out = this.oLanguage.sInfoThousands+out;
    +				}
    +				out = a[iLen-i-1]+out;
    +			}
    +			return out;
    +		},
    +	
    +	
    +		/**
    +		 * This function is called on every 'draw' event, and allows you to
    +		 * dynamically modify the header row. This can be used to calculate and
    +		 * display useful information about the table.
    +		 *  @type function
    +		 *  @param {node} nHead "TR" element for the header
    +		 *  @param {array} aData Full table data (as derived from the original HTML)
    +		 *  @param {int} iStart Index for the current display starting point in the
    +		 *    display array
    +		 *  @param {int} iEnd Index for the current display ending point in the
    +		 *    display array
    +		 *  @param {array int} aiDisplay Index array to translate the visual position
    +		 *    to the full data array
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "fnHeaderCallback": function( nHead, aData, iStart, iEnd, aiDisplay ) {
    +		 *          nHead.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records";
    +		 *        }
    +		 *      } );
    +		 *    } )
    +		 */
    +		"fnHeaderCallback": null,
    +	
    +	
    +		/**
    +		 * The information element can be used to convey information about the current
    +		 * state of the table. Although the internationalisation options presented by
    +		 * DataTables are quite capable of dealing with most customisations, there may
    +		 * be times where you wish to customise the string further. This callback
    +		 * allows you to do exactly that.
    +		 *  @type function
    +		 *  @param {object} oSettings DataTables settings object
    +		 *  @param {int} iStart Starting position in data for the draw
    +		 *  @param {int} iEnd End position in data for the draw
    +		 *  @param {int} iMax Total number of rows in the table (regardless of
    +		 *    filtering)
    +		 *  @param {int} iTotal Total number of rows in the data set, after filtering
    +		 *  @param {string} sPre The string that DataTables has formatted using it's
    +		 *    own rules
    +		 *  @returns {string} The string to be displayed in the information element.
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    $('#example').dataTable( {
    +		 *      "fnInfoCallback": function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) {
    +		 *        return iStart +" to "+ iEnd;
    +		 *      }
    +		 *    } );
    +		 */
    +		"fnInfoCallback": null,
    +	
    +	
    +		/**
    +		 * Called when the table has been initialised. Normally DataTables will
    +		 * initialise sequentially and there will be no need for this function,
    +		 * however, this does not hold true when using external language information
    +		 * since that is obtained using an async XHR call.
    +		 *  @type function
    +		 *  @param {object} oSettings DataTables settings object
    +		 *  @param {object} json The JSON object request from the server - only
    +		 *    present if client-side Ajax sourced data is used
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "fnInitComplete": function(oSettings, json) {
    +		 *          alert( 'DataTables has finished its initialisation.' );
    +		 *        }
    +		 *      } );
    +		 *    } )
    +		 */
    +		"fnInitComplete": null,
    +	
    +	
    +		/**
    +		 * Called at the very start of each table draw and can be used to cancel the
    +		 * draw by returning false, any other return (including undefined) results in
    +		 * the full draw occurring).
    +		 *  @type function
    +		 *  @param {object} oSettings DataTables settings object
    +		 *  @returns {boolean} False will cancel the draw, anything else (including no
    +		 *    return) will allow it to complete.
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "fnPreDrawCallback": function( oSettings ) {
    +		 *          if ( $('#test').val() == 1 ) {
    +		 *            return false;
    +		 *          }
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnPreDrawCallback": null,
    +	
    +	
    +		/**
    +		 * This function allows you to 'post process' each row after it have been
    +		 * generated for each table draw, but before it is rendered on screen. This
    +		 * function might be used for setting the row class name etc.
    +		 *  @type function
    +		 *  @param {node} nRow "TR" element for the current row
    +		 *  @param {array} aData Raw data array for this row
    +		 *  @param {int} iDisplayIndex The display index for the current table draw
    +		 *  @param {int} iDisplayIndexFull The index of the data in the full list of
    +		 *    rows (after filtering)
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
    +		 *          // Bold the grade for all 'A' grade browsers
    +		 *          if ( aData[4] == "A" )
    +		 *          {
    +		 *            $('td:eq(4)', nRow).html( '<b>A</b>' );
    +		 *          }
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnRowCallback": null,
    +	
    +	
    +		/**
    +		 * This parameter allows you to override the default function which obtains
    +		 * the data from the server ($.getJSON) so something more suitable for your
    +		 * application. For example you could use POST data, or pull information from
    +		 * a Gears or AIR database.
    +		 *  @type function
    +		 *  @member
    +		 *  @param {string} sSource HTTP source to obtain the data from (sAjaxSource)
    +		 *  @param {array} aoData A key/value pair object containing the data to send
    +		 *    to the server
    +		 *  @param {function} fnCallback to be called on completion of the data get
    +		 *    process that will draw the data on the page.
    +		 *  @param {object} oSettings DataTables settings object
    +		 *  @dtopt Callbacks
    +		 *  @dtopt Server-side
    +		 * 
    +		 *  @example
    +		 *    // POST data to server
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bProcessing": true,
    +		 *        "bServerSide": true,
    +		 *        "sAjaxSource": "xhr.php",
    +		 *        "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) {
    +		 *          oSettings.jqXHR = $.ajax( {
    +		 *            "dataType": 'json', 
    +		 *            "type": "POST", 
    +		 *            "url": sSource, 
    +		 *            "data": aoData, 
    +		 *            "success": fnCallback
    +		 *          } );
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnServerData": function ( sUrl, aoData, fnCallback, oSettings ) {
    +			oSettings.jqXHR = $.ajax( {
    +				"url":  sUrl,
    +				"data": aoData,
    +				"success": function (json) {
    +					if ( json.sError ) {
    +						oSettings.oApi._fnLog( oSettings, 0, json.sError );
    +					}
    +					
    +					$(oSettings.oInstance).trigger('xhr', [oSettings, json]);
    +					fnCallback( json );
    +				},
    +				"dataType": "json",
    +				"cache": false,
    +				"type": oSettings.sServerMethod,
    +				"error": function (xhr, error, thrown) {
    +					if ( error == "parsererror" ) {
    +						oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+
    +							"server could not be parsed. This is caused by a JSON formatting error." );
    +					}
    +				}
    +			} );
    +		},
    +	
    +	
    +		/**
    +		 * It is often useful to send extra data to the server when making an Ajax
    +		 * request - for example custom filtering information, and this callback
    +		 * function makes it trivial to send extra information to the server. The
    +		 * passed in parameter is the data set that has been constructed by
    +		 * DataTables, and you can add to this or modify it as you require.
    +		 *  @type function
    +		 *  @param {array} aoData Data array (array of objects which are name/value
    +		 *    pairs) that has been constructed by DataTables and will be sent to the
    +		 *    server. In the case of Ajax sourced data with server-side processing
    +		 *    this will be an empty array, for server-side processing there will be a
    +		 *    significant number of parameters!
    +		 *  @returns {undefined} Ensure that you modify the aoData array passed in,
    +		 *    as this is passed by reference.
    +		 *  @dtopt Callbacks
    +		 *  @dtopt Server-side
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bProcessing": true,
    +		 *        "bServerSide": true,
    +		 *        "sAjaxSource": "scripts/server_processing.php",
    +		 *        "fnServerParams": function ( aoData ) {
    +		 *          aoData.push( { "name": "more_data", "value": "my_value" } );
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnServerParams": null,
    +	
    +	
    +		/**
    +		 * Load the table state. With this function you can define from where, and how, the
    +		 * state of a table is loaded. By default DataTables will load from its state saving
    +		 * cookie, but you might wish to use local storage (HTML5) or a server-side database.
    +		 *  @type function
    +		 *  @member
    +		 *  @param {object} oSettings DataTables settings object
    +		 *  @return {object} The DataTables state object to be loaded
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bStateSave": true,
    +		 *        "fnStateLoad": function (oSettings) {
    +		 *          var o;
    +		 *          
    +		 *          // Send an Ajax request to the server to get the data. Note that
    +		 *          // this is a synchronous request.
    +		 *          $.ajax( {
    +		 *            "url": "/state_load",
    +		 *            "async": false,
    +		 *            "dataType": "json",
    +		 *            "success": function (json) {
    +		 *              o = json;
    +		 *            }
    +		 *          } );
    +		 *          
    +		 *          return o;
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnStateLoad": function ( oSettings ) {
    +			var sData = this.oApi._fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance );
    +			var oData;
    +	
    +			try {
    +				oData = (typeof $.parseJSON === 'function') ? 
    +					$.parseJSON(sData) : eval( '('+sData+')' );
    +			} catch (e) {
    +				oData = null;
    +			}
    +	
    +			return oData;
    +		},
    +	
    +	
    +		/**
    +		 * Callback which allows modification of the saved state prior to loading that state.
    +		 * This callback is called when the table is loading state from the stored data, but
    +		 * prior to the settings object being modified by the saved state. Note that for 
    +		 * plug-in authors, you should use the 'stateLoadParams' event to load parameters for 
    +		 * a plug-in.
    +		 *  @type function
    +		 *  @param {object} oSettings DataTables settings object
    +		 *  @param {object} oData The state object that is to be loaded
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    // Remove a saved filter, so filtering is never loaded
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bStateSave": true,
    +		 *        "fnStateLoadParams": function (oSettings, oData) {
    +		 *          oData.oSearch.sSearch = "";
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 * 
    +		 *  @example
    +		 *    // Disallow state loading by returning false
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bStateSave": true,
    +		 *        "fnStateLoadParams": function (oSettings, oData) {
    +		 *          return false;
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnStateLoadParams": null,
    +	
    +	
    +		/**
    +		 * Callback that is called when the state has been loaded from the state saving method
    +		 * and the DataTables settings object has been modified as a result of the loaded state.
    +		 *  @type function
    +		 *  @param {object} oSettings DataTables settings object
    +		 *  @param {object} oData The state object that was loaded
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    // Show an alert with the filtering value that was saved
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bStateSave": true,
    +		 *        "fnStateLoaded": function (oSettings, oData) {
    +		 *          alert( 'Saved filter was: '+oData.oSearch.sSearch );
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnStateLoaded": null,
    +	
    +	
    +		/**
    +		 * Save the table state. This function allows you to define where and how the state
    +		 * information for the table is stored - by default it will use a cookie, but you
    +		 * might want to use local storage (HTML5) or a server-side database.
    +		 *  @type function
    +		 *  @member
    +		 *  @param {object} oSettings DataTables settings object
    +		 *  @param {object} oData The state object to be saved
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bStateSave": true,
    +		 *        "fnStateSave": function (oSettings, oData) {
    +		 *          // Send an Ajax request to the server with the state object
    +		 *          $.ajax( {
    +		 *            "url": "/state_save",
    +		 *            "data": oData,
    +		 *            "dataType": "json",
    +		 *            "method": "POST"
    +		 *            "success": function () {}
    +		 *          } );
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnStateSave": function ( oSettings, oData ) {
    +			this.oApi._fnCreateCookie( 
    +				oSettings.sCookiePrefix+oSettings.sInstance, 
    +				this.oApi._fnJsonString(oData), 
    +				oSettings.iCookieDuration, 
    +				oSettings.sCookiePrefix, 
    +				oSettings.fnCookieCallback
    +			);
    +		},
    +	
    +	
    +		/**
    +		 * Callback which allows modification of the state to be saved. Called when the table 
    +		 * has changed state a new state save is required. This method allows modification of
    +		 * the state saving object prior to actually doing the save, including addition or 
    +		 * other state properties or modification. Note that for plug-in authors, you should 
    +		 * use the 'stateSaveParams' event to save parameters for a plug-in.
    +		 *  @type function
    +		 *  @param {object} oSettings DataTables settings object
    +		 *  @param {object} oData The state object to be saved
    +		 *  @dtopt Callbacks
    +		 * 
    +		 *  @example
    +		 *    // Remove a saved filter, so filtering is never saved
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bStateSave": true,
    +		 *        "fnStateSaveParams": function (oSettings, oData) {
    +		 *          oData.oSearch.sSearch = "";
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"fnStateSaveParams": null,
    +	
    +	
    +		/**
    +		 * Duration of the cookie which is used for storing session information. This
    +		 * value is given in seconds.
    +		 *  @type int
    +		 *  @default 7200 <i>(2 hours)</i>
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "iCookieDuration": 60*60*24; // 1 day
    +		 *      } );
    +		 *    } )
    +		 */
    +		"iCookieDuration": 7200,
    +	
    +	
    +		/**
    +		 * When enabled DataTables will not make a request to the server for the first
    +		 * page draw - rather it will use the data already on the page (no sorting etc
    +		 * will be applied to it), thus saving on an XHR at load time. iDeferLoading
    +		 * is used to indicate that deferred loading is required, but it is also used
    +		 * to tell DataTables how many records there are in the full table (allowing
    +		 * the information element and pagination to be displayed correctly). In the case
    +		 * where a filtering is applied to the table on initial load, this can be
    +		 * indicated by giving the parameter as an array, where the first element is
    +		 * the number of records available after filtering and the second element is the
    +		 * number of records without filtering (allowing the table information element
    +		 * to be shown correctly).
    +		 *  @type int | array
    +		 *  @default null
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    // 57 records available in the table, no filtering applied
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bServerSide": true,
    +		 *        "sAjaxSource": "scripts/server_processing.php",
    +		 *        "iDeferLoading": 57
    +		 *      } );
    +		 *    } );
    +		 * 
    +		 *  @example
    +		 *    // 57 records after filtering, 100 without filtering (an initial filter applied)
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bServerSide": true,
    +		 *        "sAjaxSource": "scripts/server_processing.php",
    +		 *        "iDeferLoading": [ 57, 100 ],
    +		 *        "oSearch": {
    +		 *          "sSearch": "my_filter"
    +		 *        }
    +		 *      } );
    +		 *    } );
    +		 */
    +		"iDeferLoading": null,
    +	
    +	
    +		/**
    +		 * Number of rows to display on a single page when using pagination. If
    +		 * feature enabled (bLengthChange) then the end user will be able to override
    +		 * this to a custom setting using a pop-up menu.
    +		 *  @type int
    +		 *  @default 10
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "iDisplayLength": 50
    +		 *      } );
    +		 *    } )
    +		 */
    +		"iDisplayLength": 10,
    +	
    +	
    +		/**
    +		 * Define the starting point for data display when using DataTables with
    +		 * pagination. Note that this parameter is the number of records, rather than
    +		 * the page number, so if you have 10 records per page and want to start on
    +		 * the third page, it should be "20".
    +		 *  @type int
    +		 *  @default 0
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "iDisplayStart": 20
    +		 *      } );
    +		 *    } )
    +		 */
    +		"iDisplayStart": 0,
    +	
    +	
    +		/**
    +		 * The scroll gap is the amount of scrolling that is left to go before
    +		 * DataTables will load the next 'page' of data automatically. You typically
    +		 * want a gap which is big enough that the scrolling will be smooth for the
    +		 * user, while not so large that it will load more data than need.
    +		 *  @type int
    +		 *  @default 100
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bScrollInfinite": true,
    +		 *        "bScrollCollapse": true,
    +		 *        "sScrollY": "200px",
    +		 *        "iScrollLoadGap": 50
    +		 *      } );
    +		 *    } );
    +		 */
    +		"iScrollLoadGap": 100,
    +	
    +	
    +		/**
    +		 * By default DataTables allows keyboard navigation of the table (sorting, paging,
    +		 * and filtering) by adding a tabindex attribute to the required elements. This
    +		 * allows you to tab through the controls and press the enter key to activate them.
    +		 * The tabindex is default 0, meaning that the tab follows the flow of the document.
    +		 * You can overrule this using this parameter if you wish. Use a value of -1 to
    +		 * disable built-in keyboard navigation.
    +		 *  @type int
    +		 *  @default 0
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "iTabIndex": 1
    +		 *      } );
    +		 *    } );
    +		 */
    +		"iTabIndex": 0,
    +	
    +	
    +		/**
    +		 * All strings that DataTables uses in the user interface that it creates
    +		 * are defined in this object, allowing you to modified them individually or
    +		 * completely replace them all as required.
    +		 *  @namespace
    +		 */
    +		"oLanguage": {
    +			/**
    +			 * Strings that are used for WAI-ARIA labels and controls only (these are not
    +			 * actually visible on the page, but will be read by screenreaders, and thus
    +			 * must be internationalised as well).
    +			 *  @namespace
    +			 */
    +			"oAria": {
    +				/**
    +				 * ARIA label that is added to the table headers when the column may be
    +				 * sorted ascending by activing the column (click or return when focused).
    +				 * Note that the column header is prefixed to this string.
    +				 *  @type string
    +				 *  @default : activate to sort column ascending
    +				 *  @dtopt Language
    +				 * 
    +				 *  @example
    +				 *    $(document).ready( function() {
    +				 *      $('#example').dataTable( {
    +				 *        "oLanguage": {
    +				 *          "oAria": {
    +				 *            "sSortAscending": " - click/return to sort ascending"
    +				 *          }
    +				 *        }
    +				 *      } );
    +				 *    } );
    +				 */
    +				"sSortAscending": ": activate to sort column ascending",
    +	
    +				/**
    +				 * ARIA label that is added to the table headers when the column may be
    +				 * sorted descending by activing the column (click or return when focused).
    +				 * Note that the column header is prefixed to this string.
    +				 *  @type string
    +				 *  @default : activate to sort column ascending
    +				 *  @dtopt Language
    +				 * 
    +				 *  @example
    +				 *    $(document).ready( function() {
    +				 *      $('#example').dataTable( {
    +				 *        "oLanguage": {
    +				 *          "oAria": {
    +				 *            "sSortDescending": " - click/return to sort descending"
    +				 *          }
    +				 *        }
    +				 *      } );
    +				 *    } );
    +				 */
    +				"sSortDescending": ": activate to sort column descending"
    +			},
    +	
    +			/**
    +			 * Pagination string used by DataTables for the two built-in pagination
    +			 * control types ("two_button" and "full_numbers")
    +			 *  @namespace
    +			 */
    +			"oPaginate": {
    +				/**
    +				 * Text to use when using the 'full_numbers' type of pagination for the
    +				 * button to take the user to the first page.
    +				 *  @type string
    +				 *  @default First
    +				 *  @dtopt Language
    +				 * 
    +				 *  @example
    +				 *    $(document).ready( function() {
    +				 *      $('#example').dataTable( {
    +				 *        "oLanguage": {
    +				 *          "oPaginate": {
    +				 *            "sFirst": "First page"
    +				 *          }
    +				 *        }
    +				 *      } );
    +				 *    } );
    +				 */
    +				"sFirst": "First",
    +			
    +			
    +				/**
    +				 * Text to use when using the 'full_numbers' type of pagination for the
    +				 * button to take the user to the last page.
    +				 *  @type string
    +				 *  @default Last
    +				 *  @dtopt Language
    +				 * 
    +				 *  @example
    +				 *    $(document).ready( function() {
    +				 *      $('#example').dataTable( {
    +				 *        "oLanguage": {
    +				 *          "oPaginate": {
    +				 *            "sLast": "Last page"
    +				 *          }
    +				 *        }
    +				 *      } );
    +				 *    } );
    +				 */
    +				"sLast": "Last",
    +			
    +			
    +				/**
    +				 * Text to use for the 'next' pagination button (to take the user to the 
    +				 * next page).
    +				 *  @type string
    +				 *  @default Next
    +				 *  @dtopt Language
    +				 * 
    +				 *  @example
    +				 *    $(document).ready( function() {
    +				 *      $('#example').dataTable( {
    +				 *        "oLanguage": {
    +				 *          "oPaginate": {
    +				 *            "sNext": "Next page"
    +				 *          }
    +				 *        }
    +				 *      } );
    +				 *    } );
    +				 */
    +				"sNext": "Next",
    +			
    +			
    +				/**
    +				 * Text to use for the 'previous' pagination button (to take the user to  
    +				 * the previous page).
    +				 *  @type string
    +				 *  @default Previous
    +				 *  @dtopt Language
    +				 * 
    +				 *  @example
    +				 *    $(document).ready( function() {
    +				 *      $('#example').dataTable( {
    +				 *        "oLanguage": {
    +				 *          "oPaginate": {
    +				 *            "sPrevious": "Previous page"
    +				 *          }
    +				 *        }
    +				 *      } );
    +				 *    } );
    +				 */
    +				"sPrevious": "Previous"
    +			},
    +		
    +			/**
    +			 * This string is shown in preference to sZeroRecords when the table is
    +			 * empty of data (regardless of filtering). Note that this is an optional
    +			 * parameter - if it is not given, the value of sZeroRecords will be used
    +			 * instead (either the default or given value).
    +			 *  @type string
    +			 *  @default No data available in table
    +			 *  @dtopt Language
    +			 * 
    +			 *  @example
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sEmptyTable": "No data available in table"
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 */
    +			"sEmptyTable": "No data available in table",
    +		
    +		
    +			/**
    +			 * This string gives information to the end user about the information that 
    +			 * is current on display on the page. The _START_, _END_ and _TOTAL_ 
    +			 * variables are all dynamically replaced as the table display updates, and 
    +			 * can be freely moved or removed as the language requirements change.
    +			 *  @type string
    +			 *  @default Showing _START_ to _END_ of _TOTAL_ entries
    +			 *  @dtopt Language
    +			 * 
    +			 *  @example
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sInfo": "Got a total of _TOTAL_ entries to show (_START_ to _END_)"
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 */
    +			"sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
    +		
    +		
    +			/**
    +			 * Display information string for when the table is empty. Typically the 
    +			 * format of this string should match sInfo.
    +			 *  @type string
    +			 *  @default Showing 0 to 0 of 0 entries
    +			 *  @dtopt Language
    +			 * 
    +			 *  @example
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sInfoEmpty": "No entries to show"
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 */
    +			"sInfoEmpty": "Showing 0 to 0 of 0 entries",
    +		
    +		
    +			/**
    +			 * When a user filters the information in a table, this string is appended 
    +			 * to the information (sInfo) to give an idea of how strong the filtering 
    +			 * is. The variable _MAX_ is dynamically updated.
    +			 *  @type string
    +			 *  @default (filtered from _MAX_ total entries)
    +			 *  @dtopt Language
    +			 * 
    +			 *  @example
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sInfoFiltered": " - filtering from _MAX_ records"
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 */
    +			"sInfoFiltered": "(filtered from _MAX_ total entries)",
    +		
    +		
    +			/**
    +			 * If can be useful to append extra information to the info string at times,
    +			 * and this variable does exactly that. This information will be appended to
    +			 * the sInfo (sInfoEmpty and sInfoFiltered in whatever combination they are
    +			 * being used) at all times.
    +			 *  @type string
    +			 *  @default <i>Empty string</i>
    +			 *  @dtopt Language
    +			 * 
    +			 *  @example
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sInfoPostFix": "All records shown are derived from real information."
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 */
    +			"sInfoPostFix": "",
    +		
    +		
    +			/**
    +			 * DataTables has a build in number formatter (fnFormatNumber) which is used
    +			 * to format large numbers that are used in the table information. By
    +			 * default a comma is used, but this can be trivially changed to any
    +			 * character you wish with this parameter.
    +			 *  @type string
    +			 *  @default ,
    +			 *  @dtopt Language
    +			 * 
    +			 *  @example
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sInfoThousands": "'"
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 */
    +			"sInfoThousands": ",",
    +		
    +		
    +			/**
    +			 * Detail the action that will be taken when the drop down menu for the
    +			 * pagination length option is changed. The '_MENU_' variable is replaced
    +			 * with a default select list of 10, 25, 50 and 100, and can be replaced
    +			 * with a custom select box if required.
    +			 *  @type string
    +			 *  @default Show _MENU_ entries
    +			 *  @dtopt Language
    +			 * 
    +			 *  @example
    +			 *    // Language change only
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sLengthMenu": "Display _MENU_ records"
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 *    
    +			 *  @example
    +			 *    // Language and options change
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sLengthMenu": 'Display <select>'+
    +			 *            '<option value="10">10</option>'+
    +			 *            '<option value="20">20</option>'+
    +			 *            '<option value="30">30</option>'+
    +			 *            '<option value="40">40</option>'+
    +			 *            '<option value="50">50</option>'+
    +			 *            '<option value="-1">All</option>'+
    +			 *            '</select> records'
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 */
    +			"sLengthMenu": "Show _MENU_ entries",
    +		
    +		
    +			/**
    +			 * When using Ajax sourced data and during the first draw when DataTables is
    +			 * gathering the data, this message is shown in an empty row in the table to
    +			 * indicate to the end user the the data is being loaded. Note that this
    +			 * parameter is not used when loading data by server-side processing, just
    +			 * Ajax sourced data with client-side processing.
    +			 *  @type string
    +			 *  @default Loading...
    +			 *  @dtopt Language
    +			 * 
    +			 *  @example
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sLoadingRecords": "Please wait - loading..."
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 */
    +			"sLoadingRecords": "Loading...",
    +		
    +		
    +			/**
    +			 * Text which is displayed when the table is processing a user action
    +			 * (usually a sort command or similar).
    +			 *  @type string
    +			 *  @default Processing...
    +			 *  @dtopt Language
    +			 * 
    +			 *  @example
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sProcessing": "DataTables is currently busy"
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 */
    +			"sProcessing": "Processing...",
    +		
    +		
    +			/**
    +			 * Details the actions that will be taken when the user types into the
    +			 * filtering input text box. The variable "_INPUT_", if used in the string,
    +			 * is replaced with the HTML text box for the filtering input allowing
    +			 * control over where it appears in the string. If "_INPUT_" is not given
    +			 * then the input box is appended to the string automatically.
    +			 *  @type string
    +			 *  @default Search:
    +			 *  @dtopt Language
    +			 * 
    +			 *  @example
    +			 *    // Input text box will be appended at the end automatically
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sSearch": "Filter records:"
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 *    
    +			 *  @example
    +			 *    // Specify where the filter should appear
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sSearch": "Apply filter _INPUT_ to table"
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 */
    +			"sSearch": "Search:",
    +		
    +		
    +			/**
    +			 * All of the language information can be stored in a file on the
    +			 * server-side, which DataTables will look up if this parameter is passed.
    +			 * It must store the URL of the language file, which is in a JSON format,
    +			 * and the object has the same properties as the oLanguage object in the
    +			 * initialiser object (i.e. the above parameters). Please refer to one of
    +			 * the example language files to see how this works in action.
    +			 *  @type string
    +			 *  @default <i>Empty string - i.e. disabled</i>
    +			 *  @dtopt Language
    +			 * 
    +			 *  @example
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sUrl": "http://www.sprymedia.co.uk/dataTables/lang.txt"
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 */
    +			"sUrl": "",
    +		
    +		
    +			/**
    +			 * Text shown inside the table records when the is no information to be
    +			 * displayed after filtering. sEmptyTable is shown when there is simply no
    +			 * information in the table at all (regardless of filtering).
    +			 *  @type string
    +			 *  @default No matching records found
    +			 *  @dtopt Language
    +			 * 
    +			 *  @example
    +			 *    $(document).ready( function() {
    +			 *      $('#example').dataTable( {
    +			 *        "oLanguage": {
    +			 *          "sZeroRecords": "No records to display"
    +			 *        }
    +			 *      } );
    +			 *    } );
    +			 */
    +			"sZeroRecords": "No matching records found"
    +		},
    +	
    +	
    +		/**
    +		 * This parameter allows you to have define the global filtering state at
    +		 * initialisation time. As an object the "sSearch" parameter must be
    +		 * defined, but all other parameters are optional. When "bRegex" is true,
    +		 * the search string will be treated as a regular expression, when false
    +		 * (default) it will be treated as a straight string. When "bSmart"
    +		 * DataTables will use it's smart filtering methods (to word match at
    +		 * any point in the data), when false this will not be done.
    +		 *  @namespace
    +		 *  @extends DataTable.models.oSearch
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "oSearch": {"sSearch": "Initial search"}
    +		 *      } );
    +		 *    } )
    +		 */
    +		"oSearch": $.extend( {}, DataTable.models.oSearch ),
    +	
    +	
    +		/**
    +		 * By default DataTables will look for the property 'aaData' when obtaining
    +		 * data from an Ajax source or for server-side processing - this parameter
    +		 * allows that property to be changed. You can use Javascript dotted object
    +		 * notation to get a data source for multiple levels of nesting.
    +		 *  @type string
    +		 *  @default aaData
    +		 *  @dtopt Options
    +		 *  @dtopt Server-side
    +		 * 
    +		 *  @example
    +		 *    // Get data from { "data": [...] }
    +		 *    $(document).ready( function() {
    +		 *      var oTable = $('#example').dataTable( {
    +		 *        "sAjaxSource": "sources/data.txt",
    +		 *        "sAjaxDataProp": "data"
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Get data from { "data": { "inner": [...] } }
    +		 *    $(document).ready( function() {
    +		 *      var oTable = $('#example').dataTable( {
    +		 *        "sAjaxSource": "sources/data.txt",
    +		 *        "sAjaxDataProp": "data.inner"
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sAjaxDataProp": "aaData",
    +	
    +	
    +		/**
    +		 * You can instruct DataTables to load data from an external source using this
    +		 * parameter (use aData if you want to pass data in you already have). Simply
    +		 * provide a url a JSON object can be obtained from. This object must include
    +		 * the parameter 'aaData' which is the data source for the table.
    +		 *  @type string
    +		 *  @default null
    +		 *  @dtopt Options
    +		 *  @dtopt Server-side
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "sAjaxSource": "http://www.sprymedia.co.uk/dataTables/json.php"
    +		 *      } );
    +		 *    } )
    +		 */
    +		"sAjaxSource": null,
    +	
    +	
    +		/**
    +		 * This parameter can be used to override the default prefix that DataTables
    +		 * assigns to a cookie when state saving is enabled.
    +		 *  @type string
    +		 *  @default SpryMedia_DataTables_
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "sCookiePrefix": "my_datatable_",
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sCookiePrefix": "SpryMedia_DataTables_",
    +	
    +	
    +		/**
    +		 * This initialisation variable allows you to specify exactly where in the
    +		 * DOM you want DataTables to inject the various controls it adds to the page
    +		 * (for example you might want the pagination controls at the top of the
    +		 * table). DIV elements (with or without a custom class) can also be added to
    +		 * aid styling. The follow syntax is used:
    +		 *   <ul>
    +		 *     <li>The following options are allowed:	
    +		 *       <ul>
    +		 *         <li>'l' - Length changing</li
    +		 *         <li>'f' - Filtering input</li>
    +		 *         <li>'t' - The table!</li>
    +		 *         <li>'i' - Information</li>
    +		 *         <li>'p' - Pagination</li>
    +		 *         <li>'r' - pRocessing</li>
    +		 *       </ul>
    +		 *     </li>
    +		 *     <li>The following constants are allowed:
    +		 *       <ul>
    +		 *         <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>
    +		 *         <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>
    +		 *       </ul>
    +		 *     </li>
    +		 *     <li>The following syntax is expected:
    +		 *       <ul>
    +		 *         <li>'&lt;' and '&gt;' - div elements</li>
    +		 *         <li>'&lt;"class" and '&gt;' - div with a class</li>
    +		 *         <li>'&lt;"#id" and '&gt;' - div with an ID</li>
    +		 *       </ul>
    +		 *     </li>
    +		 *     <li>Examples:
    +		 *       <ul>
    +		 *         <li>'&lt;"wrapper"flipt&gt;'</li>
    +		 *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>
    +		 *       </ul>
    +		 *     </li>
    +		 *   </ul>
    +		 *  @type string
    +		 *  @default lfrtip <i>(when bJQueryUI is false)</i> <b>or</b> 
    +		 *    <"H"lfr>t<"F"ip> <i>(when bJQueryUI is true)</i>
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "sDom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sDom": "lfrtip",
    +	
    +	
    +		/**
    +		 * DataTables features two different built-in pagination interaction methods
    +		 * ('two_button' or 'full_numbers') which present different page controls to
    +		 * the end user. Further methods can be added using the API (see below).
    +		 *  @type string
    +		 *  @default two_button
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "sPaginationType": "full_numbers"
    +		 *      } );
    +		 *    } )
    +		 */
    +		"sPaginationType": "two_button",
    +	
    +	
    +		/**
    +		 * Enable horizontal scrolling. When a table is too wide to fit into a certain
    +		 * layout, or you have a large number of columns in the table, you can enable
    +		 * x-scrolling to show the table in a viewport, which can be scrolled. This
    +		 * property can be any CSS unit, or a number (in which case it will be treated
    +		 * as a pixel measurement).
    +		 *  @type string
    +		 *  @default <i>blank string - i.e. disabled</i>
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "sScrollX": "100%",
    +		 *        "bScrollCollapse": true
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sScrollX": "",
    +	
    +	
    +		/**
    +		 * This property can be used to force a DataTable to use more width than it
    +		 * might otherwise do when x-scrolling is enabled. For example if you have a
    +		 * table which requires to be well spaced, this parameter is useful for
    +		 * "over-sizing" the table, and thus forcing scrolling. This property can by
    +		 * any CSS unit, or a number (in which case it will be treated as a pixel
    +		 * measurement).
    +		 *  @type string
    +		 *  @default <i>blank string - i.e. disabled</i>
    +		 *  @dtopt Options
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "sScrollX": "100%",
    +		 *        "sScrollXInner": "110%"
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sScrollXInner": "",
    +	
    +	
    +		/**
    +		 * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
    +		 * to the given height, and enable scrolling for any data which overflows the
    +		 * current viewport. This can be used as an alternative to paging to display
    +		 * a lot of data in a small area (although paging and scrolling can both be
    +		 * enabled at the same time). This property can be any CSS unit, or a number
    +		 * (in which case it will be treated as a pixel measurement).
    +		 *  @type string
    +		 *  @default <i>blank string - i.e. disabled</i>
    +		 *  @dtopt Features
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "sScrollY": "200px",
    +		 *        "bPaginate": false
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sScrollY": "",
    +	
    +	
    +		/**
    +		 * Set the HTTP method that is used to make the Ajax call for server-side
    +		 * processing or Ajax sourced data.
    +		 *  @type string
    +		 *  @default GET
    +		 *  @dtopt Options
    +		 *  @dtopt Server-side
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "bServerSide": true,
    +		 *        "sAjaxSource": "scripts/post.php",
    +		 *        "sServerMethod": "POST"
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sServerMethod": "GET"
    +	};
    +	
    +	
    +	
    +	/**
    +	 * Column options that can be given to DataTables at initialisation time.
    +	 *  @namespace
    +	 */
    +	DataTable.defaults.columns = {
    +		/**
    +		 * Allows a column's sorting to take multiple columns into account when 
    +		 * doing a sort. For example first name / last name columns make sense to 
    +		 * do a multi-column sort over the two columns.
    +		 *  @type array
    +		 *  @default null <i>Takes the value of the column index automatically</i>
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [
    +		 *          { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] },
    +		 *          { "aDataSort": [ 1, 0 ], "aTargets": [ 1 ] },
    +		 *          { "aDataSort": [ 2, 3, 4 ], "aTargets": [ 2 ] }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [
    +		 *          { "aDataSort": [ 0, 1 ] },
    +		 *          { "aDataSort": [ 1, 0 ] },
    +		 *          { "aDataSort": [ 2, 3, 4 ] },
    +		 *          null,
    +		 *          null
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"aDataSort": null,
    +	
    +	
    +		/**
    +		 * You can control the default sorting direction, and even alter the behaviour
    +		 * of the sort handler (i.e. only allow ascending sorting etc) using this
    +		 * parameter.
    +		 *  @type array
    +		 *  @default [ 'asc', 'desc' ]
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [
    +		 *          { "asSorting": [ "asc" ], "aTargets": [ 1 ] },
    +		 *          { "asSorting": [ "desc", "asc", "asc" ], "aTargets": [ 2 ] },
    +		 *          { "asSorting": [ "desc" ], "aTargets": [ 3 ] }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [
    +		 *          null,
    +		 *          { "asSorting": [ "asc" ] },
    +		 *          { "asSorting": [ "desc", "asc", "asc" ] },
    +		 *          { "asSorting": [ "desc" ] },
    +		 *          null
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"asSorting": [ 'asc', 'desc' ],
    +	
    +	
    +		/**
    +		 * Enable or disable filtering on the data in this column.
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ 
    +		 *          { "bSearchable": false, "aTargets": [ 0 ] }
    +		 *        ] } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [ 
    +		 *          { "bSearchable": false },
    +		 *          null,
    +		 *          null,
    +		 *          null,
    +		 *          null
    +		 *        ] } );
    +		 *    } );
    +		 */
    +		"bSearchable": true,
    +	
    +	
    +		/**
    +		 * Enable or disable sorting on this column.
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ 
    +		 *          { "bSortable": false, "aTargets": [ 0 ] }
    +		 *        ] } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [ 
    +		 *          { "bSortable": false },
    +		 *          null,
    +		 *          null,
    +		 *          null,
    +		 *          null
    +		 *        ] } );
    +		 *    } );
    +		 */
    +		"bSortable": true,
    +	
    +	
    +		/**
    +		 * <code>Deprecated</code> When using fnRender() for a column, you may wish 
    +		 * to use the original data (before rendering) for sorting and filtering 
    +		 * (the default is to used the rendered data that the user can see). This 
    +		 * may be useful for dates etc.
    +		 * 
    +		 * Please note that this option has now been deprecated and will be removed
    +		 * in the next version of DataTables. Please use mRender / mData rather than
    +		 * fnRender.
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @dtopt Columns
    +		 *  @deprecated
    +		 */
    +		"bUseRendered": true,
    +	
    +	
    +		/**
    +		 * Enable or disable the display of this column.
    +		 *  @type boolean
    +		 *  @default true
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ 
    +		 *          { "bVisible": false, "aTargets": [ 0 ] }
    +		 *        ] } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [ 
    +		 *          { "bVisible": false },
    +		 *          null,
    +		 *          null,
    +		 *          null,
    +		 *          null
    +		 *        ] } );
    +		 *    } );
    +		 */
    +		"bVisible": true,
    +		
    +		
    +		/**
    +		 * Developer definable function that is called whenever a cell is created (Ajax source,
    +		 * etc) or processed for input (DOM source). This can be used as a compliment to mRender
    +		 * allowing you to modify the DOM element (add background colour for example) when the
    +		 * element is available.
    +		 *  @type function
    +		 *  @param {element} nTd The TD node that has been created
    +		 *  @param {*} sData The Data for the cell
    +		 *  @param {array|object} oData The data for the whole row
    +		 *  @param {int} iRow The row index for the aoData data store
    +		 *  @param {int} iCol The column index for aoColumns
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ {
    +		 *          "aTargets": [3],
    +		 *          "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
    +		 *            if ( sData == "1.7" ) {
    +		 *              $(nTd).css('color', 'blue')
    +		 *            }
    +		 *          }
    +		 *        } ]
    +		 *      });
    +		 *    } );
    +		 */
    +		"fnCreatedCell": null,
    +	
    +	
    +		/**
    +		 * <code>Deprecated</code> Custom display function that will be called for the 
    +		 * display of each cell in this column.
    +		 *
    +		 * Please note that this option has now been deprecated and will be removed
    +		 * in the next version of DataTables. Please use mRender / mData rather than
    +		 * fnRender.
    +		 *  @type function
    +		 *  @param {object} o Object with the following parameters:
    +		 *  @param {int}    o.iDataRow The row in aoData
    +		 *  @param {int}    o.iDataColumn The column in question
    +		 *  @param {array}  o.aData The data for the row in question
    +		 *  @param {object} o.oSettings The settings object for this DataTables instance
    +		 *  @param {object} o.mDataProp The data property used for this column
    +		 *  @param {*}      val The current cell value
    +		 *  @returns {string} The string you which to use in the display
    +		 *  @dtopt Columns
    +		 *  @deprecated
    +		 */
    +		"fnRender": null,
    +	
    +	
    +		/**
    +		 * The column index (starting from 0!) that you wish a sort to be performed
    +		 * upon when this column is selected for sorting. This can be used for sorting
    +		 * on hidden columns for example.
    +		 *  @type int
    +		 *  @default -1 <i>Use automatically calculated column index</i>
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ 
    +		 *          { "iDataSort": 1, "aTargets": [ 0 ] }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [ 
    +		 *          { "iDataSort": 1 },
    +		 *          null,
    +		 *          null,
    +		 *          null,
    +		 *          null
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"iDataSort": -1,
    +	
    +	
    +		/**
    +		 * This parameter has been replaced by mData in DataTables to ensure naming
    +		 * consistency. mDataProp can still be used, as there is backwards compatibility
    +		 * in DataTables for this option, but it is strongly recommended that you use
    +		 * mData in preference to mDataProp.
    +		 *  @name DataTable.defaults.columns.mDataProp
    +		 */
    +	
    +	
    +		/**
    +		 * This property can be used to read data from any JSON data source property,
    +		 * including deeply nested objects / properties. mData can be given in a
    +		 * number of different ways which effect its behaviour:
    +		 *   <ul>
    +		 *     <li>integer - treated as an array index for the data source. This is the
    +		 *       default that DataTables uses (incrementally increased for each column).</li>
    +		 *     <li>string - read an object property from the data source. Note that you can
    +		 *       use Javascript dotted notation to read deep properties / arrays from the
    +		 *       data source.</li>
    +		 *     <li>null - the sDefaultContent option will be used for the cell (null
    +		 *       by default, so you will need to specify the default content you want -
    +		 *       typically an empty string). This can be useful on generated columns such 
    +		 *       as edit / delete action columns.</li>
    +		 *     <li>function - the function given will be executed whenever DataTables 
    +		 *       needs to set or get the data for a cell in the column. The function 
    +		 *       takes three parameters:
    +		 *       <ul>
    +		 *         <li>{array|object} The data source for the row</li>
    +		 *         <li>{string} The type call data requested - this will be 'set' when
    +		 *           setting data or 'filter', 'display', 'type', 'sort' or undefined when 
    +		 *           gathering data. Note that when <i>undefined</i> is given for the type
    +		 *           DataTables expects to get the raw data for the object back</li>
    +		 *         <li>{*} Data to set when the second parameter is 'set'.</li>
    +		 *       </ul>
    +		 *       The return value from the function is not required when 'set' is the type
    +		 *       of call, but otherwise the return is what will be used for the data
    +		 *       requested.</li>
    +		 *    </ul>
    +		 *
    +		 * Note that prior to DataTables 1.9.2 mData was called mDataProp. The name change
    +		 * reflects the flexibility of this property and is consistent with the naming of
    +		 * mRender. If 'mDataProp' is given, then it will still be used by DataTables, as
    +		 * it automatically maps the old name to the new if required.
    +		 *  @type string|int|function|null
    +		 *  @default null <i>Use automatically calculated column index</i>
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Read table data from objects
    +		 *    $(document).ready( function() {
    +		 *      var oTable = $('#example').dataTable( {
    +		 *        "sAjaxSource": "sources/deep.txt",
    +		 *        "aoColumns": [
    +		 *          { "mData": "engine" },
    +		 *          { "mData": "browser" },
    +		 *          { "mData": "platform.inner" },
    +		 *          { "mData": "platform.details.0" },
    +		 *          { "mData": "platform.details.1" }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 * 
    +		 *  @example
    +		 *    // Using mData as a function to provide different information for
    +		 *    // sorting, filtering and display. In this case, currency (price)
    +		 *    $(document).ready( function() {
    +		 *      var oTable = $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ {
    +		 *          "aTargets": [ 0 ],
    +		 *          "mData": function ( source, type, val ) {
    +		 *            if (type === 'set') {
    +		 *              source.price = val;
    +		 *              // Store the computed dislay and filter values for efficiency
    +		 *              source.price_display = val=="" ? "" : "$"+numberFormat(val);
    +		 *              source.price_filter  = val=="" ? "" : "$"+numberFormat(val)+" "+val;
    +		 *              return;
    +		 *            }
    +		 *            else if (type === 'display') {
    +		 *              return source.price_display;
    +		 *            }
    +		 *            else if (type === 'filter') {
    +		 *              return source.price_filter;
    +		 *            }
    +		 *            // 'sort', 'type' and undefined all just use the integer
    +		 *            return source.price;
    +		 *          }
    +		 *        } ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"mData": null,
    +	
    +	
    +		/**
    +		 * This property is the rendering partner to mData and it is suggested that
    +		 * when you want to manipulate data for display (including filtering, sorting etc)
    +		 * but not altering the underlying data for the table, use this property. mData
    +		 * can actually do everything this property can and more, but this parameter is
    +		 * easier to use since there is no 'set' option. Like mData is can be given
    +		 * in a number of different ways to effect its behaviour, with the addition of 
    +		 * supporting array syntax for easy outputting of arrays (including arrays of
    +		 * objects):
    +		 *   <ul>
    +		 *     <li>integer - treated as an array index for the data source. This is the
    +		 *       default that DataTables uses (incrementally increased for each column).</li>
    +		 *     <li>string - read an object property from the data source. Note that you can
    +		 *       use Javascript dotted notation to read deep properties / arrays from the
    +		 *       data source and also array brackets to indicate that the data reader should
    +		 *       loop over the data source array. When characters are given between the array
    +		 *       brackets, these characters are used to join the data source array together.
    +		 *       For example: "accounts[, ].name" would result in a comma separated list with
    +		 *       the 'name' value from the 'accounts' array of objects.</li>
    +		 *     <li>function - the function given will be executed whenever DataTables 
    +		 *       needs to set or get the data for a cell in the column. The function 
    +		 *       takes three parameters:
    +		 *       <ul>
    +		 *         <li>{array|object} The data source for the row (based on mData)</li>
    +		 *         <li>{string} The type call data requested - this will be 'filter', 'display', 
    +		 *           'type' or 'sort'.</li>
    +		 *         <li>{array|object} The full data source for the row (not based on mData)</li>
    +		 *       </ul>
    +		 *       The return value from the function is what will be used for the data
    +		 *       requested.</li>
    +		 *    </ul>
    +		 *  @type string|int|function|null
    +		 *  @default null <i>Use mData</i>
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Create a comma separated list from an array of objects
    +		 *    $(document).ready( function() {
    +		 *      var oTable = $('#example').dataTable( {
    +		 *        "sAjaxSource": "sources/deep.txt",
    +		 *        "aoColumns": [
    +		 *          { "mData": "engine" },
    +		 *          { "mData": "browser" },
    +		 *          {
    +		 *            "mData": "platform",
    +		 *            "mRender": "[, ].name"
    +		 *          }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 * 
    +		 *  @example
    +		 *    // Use as a function to create a link from the data source
    +		 *    $(document).ready( function() {
    +		 *      var oTable = $('#example').dataTable( {
    +		 *        "aoColumnDefs": [
    +		 *        {
    +		 *          "aTargets": [ 0 ],
    +		 *          "mData": "download_link",
    +		 *          "mRender": function ( data, type, full ) {
    +		 *            return '<a href="'+data+'">Download</a>';
    +		 *          }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"mRender": null,
    +	
    +	
    +		/**
    +		 * Change the cell type created for the column - either TD cells or TH cells. This
    +		 * can be useful as TH cells have semantic meaning in the table body, allowing them
    +		 * to act as a header for a row (you may wish to add scope='row' to the TH elements).
    +		 *  @type string
    +		 *  @default td
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Make the first column use TH cells
    +		 *    $(document).ready( function() {
    +		 *      var oTable = $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ {
    +		 *          "aTargets": [ 0 ],
    +		 *          "sCellType": "th"
    +		 *        } ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sCellType": "td",
    +	
    +	
    +		/**
    +		 * Class to give to each cell in this column.
    +		 *  @type string
    +		 *  @default <i>Empty string</i>
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ 
    +		 *          { "sClass": "my_class", "aTargets": [ 0 ] }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [ 
    +		 *          { "sClass": "my_class" },
    +		 *          null,
    +		 *          null,
    +		 *          null,
    +		 *          null
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sClass": "",
    +		
    +		/**
    +		 * When DataTables calculates the column widths to assign to each column,
    +		 * it finds the longest string in each column and then constructs a
    +		 * temporary table and reads the widths from that. The problem with this
    +		 * is that "mmm" is much wider then "iiii", but the latter is a longer 
    +		 * string - thus the calculation can go wrong (doing it properly and putting
    +		 * it into an DOM object and measuring that is horribly(!) slow). Thus as
    +		 * a "work around" we provide this option. It will append its value to the
    +		 * text that is found to be the longest string for the column - i.e. padding.
    +		 * Generally you shouldn't need this, and it is not documented on the 
    +		 * general DataTables.net documentation
    +		 *  @type string
    +		 *  @default <i>Empty string<i>
    +		 *  @dtopt Columns
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [ 
    +		 *          null,
    +		 *          null,
    +		 *          null,
    +		 *          {
    +		 *            "sContentPadding": "mmm"
    +		 *          }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sContentPadding": "",
    +	
    +	
    +		/**
    +		 * Allows a default value to be given for a column's data, and will be used
    +		 * whenever a null data source is encountered (this can be because mData
    +		 * is set to null, or because the data source itself is null).
    +		 *  @type string
    +		 *  @default null
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ 
    +		 *          {
    +		 *            "mData": null,
    +		 *            "sDefaultContent": "Edit",
    +		 *            "aTargets": [ -1 ]
    +		 *          }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [ 
    +		 *          null,
    +		 *          null,
    +		 *          null,
    +		 *          {
    +		 *            "mData": null,
    +		 *            "sDefaultContent": "Edit"
    +		 *          }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sDefaultContent": null,
    +	
    +	
    +		/**
    +		 * This parameter is only used in DataTables' server-side processing. It can
    +		 * be exceptionally useful to know what columns are being displayed on the
    +		 * client side, and to map these to database fields. When defined, the names
    +		 * also allow DataTables to reorder information from the server if it comes
    +		 * back in an unexpected order (i.e. if you switch your columns around on the
    +		 * client-side, your server-side code does not also need updating).
    +		 *  @type string
    +		 *  @default <i>Empty string</i>
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ 
    +		 *          { "sName": "engine", "aTargets": [ 0 ] },
    +		 *          { "sName": "browser", "aTargets": [ 1 ] },
    +		 *          { "sName": "platform", "aTargets": [ 2 ] },
    +		 *          { "sName": "version", "aTargets": [ 3 ] },
    +		 *          { "sName": "grade", "aTargets": [ 4 ] }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [ 
    +		 *          { "sName": "engine" },
    +		 *          { "sName": "browser" },
    +		 *          { "sName": "platform" },
    +		 *          { "sName": "version" },
    +		 *          { "sName": "grade" }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sName": "",
    +	
    +	
    +		/**
    +		 * Defines a data source type for the sorting which can be used to read
    +		 * real-time information from the table (updating the internally cached
    +		 * version) prior to sorting. This allows sorting to occur on user editable
    +		 * elements such as form inputs.
    +		 *  @type string
    +		 *  @default std
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [
    +		 *          { "sSortDataType": "dom-text", "aTargets": [ 2, 3 ] },
    +		 *          { "sType": "numeric", "aTargets": [ 3 ] },
    +		 *          { "sSortDataType": "dom-select", "aTargets": [ 4 ] },
    +		 *          { "sSortDataType": "dom-checkbox", "aTargets": [ 5 ] }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [
    +		 *          null,
    +		 *          null,
    +		 *          { "sSortDataType": "dom-text" },
    +		 *          { "sSortDataType": "dom-text", "sType": "numeric" },
    +		 *          { "sSortDataType": "dom-select" },
    +		 *          { "sSortDataType": "dom-checkbox" }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sSortDataType": "std",
    +	
    +	
    +		/**
    +		 * The title of this column.
    +		 *  @type string
    +		 *  @default null <i>Derived from the 'TH' value for this column in the 
    +		 *    original HTML table.</i>
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ 
    +		 *          { "sTitle": "My column title", "aTargets": [ 0 ] }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [ 
    +		 *          { "sTitle": "My column title" },
    +		 *          null,
    +		 *          null,
    +		 *          null,
    +		 *          null
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sTitle": null,
    +	
    +	
    +		/**
    +		 * The type allows you to specify how the data for this column will be sorted.
    +		 * Four types (string, numeric, date and html (which will strip HTML tags
    +		 * before sorting)) are currently available. Note that only date formats
    +		 * understood by Javascript's Date() object will be accepted as type date. For
    +		 * example: "Mar 26, 2008 5:03 PM". May take the values: 'string', 'numeric',
    +		 * 'date' or 'html' (by default). Further types can be adding through
    +		 * plug-ins.
    +		 *  @type string
    +		 *  @default null <i>Auto-detected from raw data</i>
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ 
    +		 *          { "sType": "html", "aTargets": [ 0 ] }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [ 
    +		 *          { "sType": "html" },
    +		 *          null,
    +		 *          null,
    +		 *          null,
    +		 *          null
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sType": null,
    +	
    +	
    +		/**
    +		 * Defining the width of the column, this parameter may take any CSS value
    +		 * (3em, 20px etc). DataTables apples 'smart' widths to columns which have not
    +		 * been given a specific width through this interface ensuring that the table
    +		 * remains readable.
    +		 *  @type string
    +		 *  @default null <i>Automatic</i>
    +		 *  @dtopt Columns
    +		 * 
    +		 *  @example
    +		 *    // Using aoColumnDefs
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumnDefs": [ 
    +		 *          { "sWidth": "20%", "aTargets": [ 0 ] }
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 *    
    +		 *  @example
    +		 *    // Using aoColumns
    +		 *    $(document).ready( function() {
    +		 *      $('#example').dataTable( {
    +		 *        "aoColumns": [ 
    +		 *          { "sWidth": "20%" },
    +		 *          null,
    +		 *          null,
    +		 *          null,
    +		 *          null
    +		 *        ]
    +		 *      } );
    +		 *    } );
    +		 */
    +		"sWidth": null
    +	};
    +	
    +	
    +	
    +	/**
    +	 * DataTables settings object - this holds all the information needed for a
    +	 * given table, including configuration, data and current application of the
    +	 * table options. DataTables does not have a single instance for each DataTable
    +	 * with the settings attached to that instance, but rather instances of the
    +	 * DataTable "class" are created on-the-fly as needed (typically by a 
    +	 * $().dataTable() call) and the settings object is then applied to that
    +	 * instance.
    +	 * 
    +	 * Note that this object is related to {@link DataTable.defaults} but this 
    +	 * one is the internal data store for DataTables's cache of columns. It should
    +	 * NOT be manipulated outside of DataTables. Any configuration should be done
    +	 * through the initialisation options.
    +	 *  @namespace
    +	 *  @todo Really should attach the settings object to individual instances so we
    +	 *    don't need to create new instances on each $().dataTable() call (if the
    +	 *    table already exists). It would also save passing oSettings around and
    +	 *    into every single function. However, this is a very significant 
    +	 *    architecture change for DataTables and will almost certainly break
    +	 *    backwards compatibility with older installations. This is something that
    +	 *    will be done in 2.0.
    +	 */
    +	DataTable.models.oSettings = {
    +		/**
    +		 * Primary features of DataTables and their enablement state.
    +		 *  @namespace
    +		 */
    +		"oFeatures": {
    +			
    +			/**
    +			 * Flag to say if DataTables should automatically try to calculate the
    +			 * optimum table and columns widths (true) or not (false).
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bAutoWidth": null,
    +	
    +			/**
    +			 * Delay the creation of TR and TD elements until they are actually
    +			 * needed by a driven page draw. This can give a significant speed
    +			 * increase for Ajax source and Javascript source data, but makes no
    +			 * difference at all fro DOM and server-side processing tables.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bDeferRender": null,
    +			
    +			/**
    +			 * Enable filtering on the table or not. Note that if this is disabled
    +			 * then there is no filtering at all on the table, including fnFilter.
    +			 * To just remove the filtering input use sDom and remove the 'f' option.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bFilter": null,
    +			
    +			/**
    +			 * Table information element (the 'Showing x of y records' div) enable
    +			 * flag.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bInfo": null,
    +			
    +			/**
    +			 * Present a user control allowing the end user to change the page size
    +			 * when pagination is enabled.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bLengthChange": null,
    +	
    +			/**
    +			 * Pagination enabled or not. Note that if this is disabled then length
    +			 * changing must also be disabled.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bPaginate": null,
    +			
    +			/**
    +			 * Processing indicator enable flag whenever DataTables is enacting a
    +			 * user request - typically an Ajax request for server-side processing.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bProcessing": null,
    +			
    +			/**
    +			 * Server-side processing enabled flag - when enabled DataTables will
    +			 * get all data from the server for every draw - there is no filtering,
    +			 * sorting or paging done on the client-side.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bServerSide": null,
    +			
    +			/**
    +			 * Sorting enablement flag.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bSort": null,
    +			
    +			/**
    +			 * Apply a class to the columns which are being sorted to provide a
    +			 * visual highlight or not. This can slow things down when enabled since
    +			 * there is a lot of DOM interaction.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bSortClasses": null,
    +			
    +			/**
    +			 * State saving enablement flag.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bStateSave": null
    +		},
    +		
    +	
    +		/**
    +		 * Scrolling settings for a table.
    +		 *  @namespace
    +		 */
    +		"oScroll": {
    +			/**
    +			 * Indicate if DataTables should be allowed to set the padding / margin
    +			 * etc for the scrolling header elements or not. Typically you will want
    +			 * this.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bAutoCss": null,
    +			
    +			/**
    +			 * When the table is shorter in height than sScrollY, collapse the
    +			 * table container down to the height of the table (when true).
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bCollapse": null,
    +			
    +			/**
    +			 * Infinite scrolling enablement flag. Now deprecated in favour of
    +			 * using the Scroller plug-in.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type boolean
    +			 */
    +			"bInfinite": null,
    +			
    +			/**
    +			 * Width of the scrollbar for the web-browser's platform. Calculated
    +			 * during table initialisation.
    +			 *  @type int
    +			 *  @default 0
    +			 */
    +			"iBarWidth": 0,
    +			
    +			/**
    +			 * Space (in pixels) between the bottom of the scrolling container and 
    +			 * the bottom of the scrolling viewport before the next page is loaded
    +			 * when using infinite scrolling.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type int
    +			 */
    +			"iLoadGap": null,
    +			
    +			/**
    +			 * Viewport width for horizontal scrolling. Horizontal scrolling is 
    +			 * disabled if an empty string.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type string
    +			 */
    +			"sX": null,
    +			
    +			/**
    +			 * Width to expand the table to when using x-scrolling. Typically you
    +			 * should not need to use this.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type string
    +			 *  @deprecated
    +			 */
    +			"sXInner": null,
    +			
    +			/**
    +			 * Viewport height for vertical scrolling. Vertical scrolling is disabled
    +			 * if an empty string.
    +			 * Note that this parameter will be set by the initialisation routine. To
    +			 * set a default use {@link DataTable.defaults}.
    +			 *  @type string
    +			 */
    +			"sY": null
    +		},
    +		
    +		/**
    +		 * Language information for the table.
    +		 *  @namespace
    +		 *  @extends DataTable.defaults.oLanguage
    +		 */
    +		"oLanguage": {
    +			/**
    +			 * Information callback function. See 
    +			 * {@link DataTable.defaults.fnInfoCallback}
    +			 *  @type function
    +			 *  @default null
    +			 */
    +			"fnInfoCallback": null
    +		},
    +		
    +		/**
    +		 * Browser support parameters
    +		 *  @namespace
    +		 */
    +		"oBrowser": {
    +			/**
    +			 * Indicate if the browser incorrectly calculates width:100% inside a
    +			 * scrolling element (IE6/7)
    +			 *  @type boolean
    +			 *  @default false
    +			 */
    +			"bScrollOversize": false
    +		},
    +		
    +		/**
    +		 * Array referencing the nodes which are used for the features. The 
    +		 * parameters of this object match what is allowed by sDom - i.e.
    +		 *   <ul>
    +		 *     <li>'l' - Length changing</li>
    +		 *     <li>'f' - Filtering input</li>
    +		 *     <li>'t' - The table!</li>
    +		 *     <li>'i' - Information</li>
    +		 *     <li>'p' - Pagination</li>
    +		 *     <li>'r' - pRocessing</li>
    +		 *   </ul>
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aanFeatures": [],
    +		
    +		/**
    +		 * Store data information - see {@link DataTable.models.oRow} for detailed
    +		 * information.
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoData": [],
    +		
    +		/**
    +		 * Array of indexes which are in the current display (after filtering etc)
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aiDisplay": [],
    +		
    +		/**
    +		 * Array of indexes for display - no filtering
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aiDisplayMaster": [],
    +		
    +		/**
    +		 * Store information about each column that is in use
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoColumns": [],
    +		
    +		/**
    +		 * Store information about the table's header
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoHeader": [],
    +		
    +		/**
    +		 * Store information about the table's footer
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoFooter": [],
    +		
    +		/**
    +		 * Search data array for regular expression searching
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"asDataSearch": [],
    +		
    +		/**
    +		 * Store the applied global search information in case we want to force a 
    +		 * research or compare the old search to a new one.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @namespace
    +		 *  @extends DataTable.models.oSearch
    +		 */
    +		"oPreviousSearch": {},
    +		
    +		/**
    +		 * Store the applied search for each column - see 
    +		 * {@link DataTable.models.oSearch} for the format that is used for the
    +		 * filtering information for each column.
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoPreSearchCols": [],
    +		
    +		/**
    +		 * Sorting that is applied to the table. Note that the inner arrays are
    +		 * used in the following manner:
    +		 * <ul>
    +		 *   <li>Index 0 - column number</li>
    +		 *   <li>Index 1 - current sorting direction</li>
    +		 *   <li>Index 2 - index of asSorting for this column</li>
    +		 * </ul>
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type array
    +		 *  @todo These inner arrays should really be objects
    +		 */
    +		"aaSorting": null,
    +		
    +		/**
    +		 * Sorting that is always applied to the table (i.e. prefixed in front of
    +		 * aaSorting).
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type array|null
    +		 *  @default null
    +		 */
    +		"aaSortingFixed": null,
    +		
    +		/**
    +		 * Classes to use for the striping of a table.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"asStripeClasses": null,
    +		
    +		/**
    +		 * If restoring a table - we should restore its striping classes as well
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"asDestroyStripes": [],
    +		
    +		/**
    +		 * If restoring a table - we should restore its width 
    +		 *  @type int
    +		 *  @default 0
    +		 */
    +		"sDestroyWidth": 0,
    +		
    +		/**
    +		 * Callback functions array for every time a row is inserted (i.e. on a draw).
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoRowCallback": [],
    +		
    +		/**
    +		 * Callback functions for the header on each draw.
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoHeaderCallback": [],
    +		
    +		/**
    +		 * Callback function for the footer on each draw.
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoFooterCallback": [],
    +		
    +		/**
    +		 * Array of callback functions for draw callback functions
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoDrawCallback": [],
    +		
    +		/**
    +		 * Array of callback functions for row created function
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoRowCreatedCallback": [],
    +		
    +		/**
    +		 * Callback functions for just before the table is redrawn. A return of 
    +		 * false will be used to cancel the draw.
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoPreDrawCallback": [],
    +		
    +		/**
    +		 * Callback functions for when the table has been initialised.
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoInitComplete": [],
    +	
    +		
    +		/**
    +		 * Callbacks for modifying the settings to be stored for state saving, prior to
    +		 * saving state.
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoStateSaveParams": [],
    +		
    +		/**
    +		 * Callbacks for modifying the settings that have been stored for state saving
    +		 * prior to using the stored values to restore the state.
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoStateLoadParams": [],
    +		
    +		/**
    +		 * Callbacks for operating on the settings object once the saved state has been
    +		 * loaded
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoStateLoaded": [],
    +		
    +		/**
    +		 * Cache the table ID for quick access
    +		 *  @type string
    +		 *  @default <i>Empty string</i>
    +		 */
    +		"sTableId": "",
    +		
    +		/**
    +		 * The TABLE node for the main table
    +		 *  @type node
    +		 *  @default null
    +		 */
    +		"nTable": null,
    +		
    +		/**
    +		 * Permanent ref to the thead element
    +		 *  @type node
    +		 *  @default null
    +		 */
    +		"nTHead": null,
    +		
    +		/**
    +		 * Permanent ref to the tfoot element - if it exists
    +		 *  @type node
    +		 *  @default null
    +		 */
    +		"nTFoot": null,
    +		
    +		/**
    +		 * Permanent ref to the tbody element
    +		 *  @type node
    +		 *  @default null
    +		 */
    +		"nTBody": null,
    +		
    +		/**
    +		 * Cache the wrapper node (contains all DataTables controlled elements)
    +		 *  @type node
    +		 *  @default null
    +		 */
    +		"nTableWrapper": null,
    +		
    +		/**
    +		 * Indicate if when using server-side processing the loading of data 
    +		 * should be deferred until the second draw.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type boolean
    +		 *  @default false
    +		 */
    +		"bDeferLoading": false,
    +		
    +		/**
    +		 * Indicate if all required information has been read in
    +		 *  @type boolean
    +		 *  @default false
    +		 */
    +		"bInitialised": false,
    +		
    +		/**
    +		 * Information about open rows. Each object in the array has the parameters
    +		 * 'nTr' and 'nParent'
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoOpenRows": [],
    +		
    +		/**
    +		 * Dictate the positioning of DataTables' control elements - see
    +		 * {@link DataTable.model.oInit.sDom}.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type string
    +		 *  @default null
    +		 */
    +		"sDom": null,
    +		
    +		/**
    +		 * Which type of pagination should be used.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type string 
    +		 *  @default two_button
    +		 */
    +		"sPaginationType": "two_button",
    +		
    +		/**
    +		 * The cookie duration (for bStateSave) in seconds.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type int
    +		 *  @default 0
    +		 */
    +		"iCookieDuration": 0,
    +		
    +		/**
    +		 * The cookie name prefix.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type string
    +		 *  @default <i>Empty string</i>
    +		 */
    +		"sCookiePrefix": "",
    +		
    +		/**
    +		 * Callback function for cookie creation.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type function
    +		 *  @default null
    +		 */
    +		"fnCookieCallback": null,
    +		
    +		/**
    +		 * Array of callback functions for state saving. Each array element is an 
    +		 * object with the following parameters:
    +		 *   <ul>
    +		 *     <li>function:fn - function to call. Takes two parameters, oSettings
    +		 *       and the JSON string to save that has been thus far created. Returns
    +		 *       a JSON string to be inserted into a json object 
    +		 *       (i.e. '"param": [ 0, 1, 2]')</li>
    +		 *     <li>string:sName - name of callback</li>
    +		 *   </ul>
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoStateSave": [],
    +		
    +		/**
    +		 * Array of callback functions for state loading. Each array element is an 
    +		 * object with the following parameters:
    +		 *   <ul>
    +		 *     <li>function:fn - function to call. Takes two parameters, oSettings 
    +		 *       and the object stored. May return false to cancel state loading</li>
    +		 *     <li>string:sName - name of callback</li>
    +		 *   </ul>
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoStateLoad": [],
    +		
    +		/**
    +		 * State that was loaded from the cookie. Useful for back reference
    +		 *  @type object
    +		 *  @default null
    +		 */
    +		"oLoadedState": null,
    +		
    +		/**
    +		 * Source url for AJAX data for the table.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type string
    +		 *  @default null
    +		 */
    +		"sAjaxSource": null,
    +		
    +		/**
    +		 * Property from a given object from which to read the table data from. This
    +		 * can be an empty string (when not server-side processing), in which case 
    +		 * it is  assumed an an array is given directly.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type string
    +		 */
    +		"sAjaxDataProp": null,
    +		
    +		/**
    +		 * Note if draw should be blocked while getting data
    +		 *  @type boolean
    +		 *  @default true
    +		 */
    +		"bAjaxDataGet": true,
    +		
    +		/**
    +		 * The last jQuery XHR object that was used for server-side data gathering. 
    +		 * This can be used for working with the XHR information in one of the 
    +		 * callbacks
    +		 *  @type object
    +		 *  @default null
    +		 */
    +		"jqXHR": null,
    +		
    +		/**
    +		 * Function to get the server-side data.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type function
    +		 */
    +		"fnServerData": null,
    +		
    +		/**
    +		 * Functions which are called prior to sending an Ajax request so extra 
    +		 * parameters can easily be sent to the server
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoServerParams": [],
    +		
    +		/**
    +		 * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if 
    +		 * required).
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type string
    +		 */
    +		"sServerMethod": null,
    +		
    +		/**
    +		 * Format numbers for display.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type function
    +		 */
    +		"fnFormatNumber": null,
    +		
    +		/**
    +		 * List of options that can be used for the user selectable length menu.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aLengthMenu": null,
    +		
    +		/**
    +		 * Counter for the draws that the table does. Also used as a tracker for
    +		 * server-side processing
    +		 *  @type int
    +		 *  @default 0
    +		 */
    +		"iDraw": 0,
    +		
    +		/**
    +		 * Indicate if a redraw is being done - useful for Ajax
    +		 *  @type boolean
    +		 *  @default false
    +		 */
    +		"bDrawing": false,
    +		
    +		/**
    +		 * Draw index (iDraw) of the last error when parsing the returned data
    +		 *  @type int
    +		 *  @default -1
    +		 */
    +		"iDrawError": -1,
    +		
    +		/**
    +		 * Paging display length
    +		 *  @type int
    +		 *  @default 10
    +		 */
    +		"_iDisplayLength": 10,
    +	
    +		/**
    +		 * Paging start point - aiDisplay index
    +		 *  @type int
    +		 *  @default 0
    +		 */
    +		"_iDisplayStart": 0,
    +	
    +		/**
    +		 * Paging end point - aiDisplay index. Use fnDisplayEnd rather than
    +		 * this property to get the end point
    +		 *  @type int
    +		 *  @default 10
    +		 *  @private
    +		 */
    +		"_iDisplayEnd": 10,
    +		
    +		/**
    +		 * Server-side processing - number of records in the result set
    +		 * (i.e. before filtering), Use fnRecordsTotal rather than
    +		 * this property to get the value of the number of records, regardless of
    +		 * the server-side processing setting.
    +		 *  @type int
    +		 *  @default 0
    +		 *  @private
    +		 */
    +		"_iRecordsTotal": 0,
    +	
    +		/**
    +		 * Server-side processing - number of records in the current display set
    +		 * (i.e. after filtering). Use fnRecordsDisplay rather than
    +		 * this property to get the value of the number of records, regardless of
    +		 * the server-side processing setting.
    +		 *  @type boolean
    +		 *  @default 0
    +		 *  @private
    +		 */
    +		"_iRecordsDisplay": 0,
    +		
    +		/**
    +		 * Flag to indicate if jQuery UI marking and classes should be used.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type boolean
    +		 */
    +		"bJUI": null,
    +		
    +		/**
    +		 * The classes to use for the table
    +		 *  @type object
    +		 *  @default {}
    +		 */
    +		"oClasses": {},
    +		
    +		/**
    +		 * Flag attached to the settings object so you can check in the draw 
    +		 * callback if filtering has been done in the draw. Deprecated in favour of
    +		 * events.
    +		 *  @type boolean
    +		 *  @default false
    +		 *  @deprecated
    +		 */
    +		"bFiltered": false,
    +		
    +		/**
    +		 * Flag attached to the settings object so you can check in the draw 
    +		 * callback if sorting has been done in the draw. Deprecated in favour of
    +		 * events.
    +		 *  @type boolean
    +		 *  @default false
    +		 *  @deprecated
    +		 */
    +		"bSorted": false,
    +		
    +		/**
    +		 * Indicate that if multiple rows are in the header and there is more than 
    +		 * one unique cell per column, if the top one (true) or bottom one (false) 
    +		 * should be used for sorting / title by DataTables.
    +		 * Note that this parameter will be set by the initialisation routine. To
    +		 * set a default use {@link DataTable.defaults}.
    +		 *  @type boolean
    +		 */
    +		"bSortCellsTop": null,
    +		
    +		/**
    +		 * Initialisation object that is used for the table
    +		 *  @type object
    +		 *  @default null
    +		 */
    +		"oInit": null,
    +		
    +		/**
    +		 * Destroy callback functions - for plug-ins to attach themselves to the
    +		 * destroy so they can clean up markup and events.
    +		 *  @type array
    +		 *  @default []
    +		 */
    +		"aoDestroyCallback": [],
    +	
    +		
    +		/**
    +		 * Get the number of records in the current record set, before filtering
    +		 *  @type function
    +		 */
    +		"fnRecordsTotal": function ()
    +		{
    +			if ( this.oFeatures.bServerSide ) {
    +				return parseInt(this._iRecordsTotal, 10);
    +			} else {
    +				return this.aiDisplayMaster.length;
    +			}
    +		},
    +		
    +		/**
    +		 * Get the number of records in the current record set, after filtering
    +		 *  @type function
    +		 */
    +		"fnRecordsDisplay": function ()
    +		{
    +			if ( this.oFeatures.bServerSide ) {
    +				return parseInt(this._iRecordsDisplay, 10);
    +			} else {
    +				return this.aiDisplay.length;
    +			}
    +		},
    +		
    +		/**
    +		 * Set the display end point - aiDisplay index
    +		 *  @type function
    +		 *  @todo Should do away with _iDisplayEnd and calculate it on-the-fly here
    +		 */
    +		"fnDisplayEnd": function ()
    +		{
    +			if ( this.oFeatures.bServerSide ) {
    +				if ( this.oFeatures.bPaginate === false || this._iDisplayLength == -1 ) {
    +					return this._iDisplayStart+this.aiDisplay.length;
    +				} else {
    +					return Math.min( this._iDisplayStart+this._iDisplayLength, 
    +						this._iRecordsDisplay );
    +				}
    +			} else {
    +				return this._iDisplayEnd;
    +			}
    +		},
    +		
    +		/**
    +		 * The DataTables object for this table
    +		 *  @type object
    +		 *  @default null
    +		 */
    +		"oInstance": null,
    +		
    +		/**
    +		 * Unique identifier for each instance of the DataTables object. If there
    +		 * is an ID on the table node, then it takes that value, otherwise an
    +		 * incrementing internal counter is used.
    +		 *  @type string
    +		 *  @default null
    +		 */
    +		"sInstance": null,
    +	
    +		/**
    +		 * tabindex attribute value that is added to DataTables control elements, allowing
    +		 * keyboard navigation of the table and its controls.
    +		 */
    +		"iTabIndex": 0,
    +	
    +		/**
    +		 * DIV container for the footer scrolling table if scrolling
    +		 */
    +		"nScrollHead": null,
    +	
    +		/**
    +		 * DIV container for the footer scrolling table if scrolling
    +		 */
    +		"nScrollFoot": null
    +	};
    +
    +	/**
    +	 * Extension object for DataTables that is used to provide all extension options.
    +	 * 
    +	 * Note that the <i>DataTable.ext</i> object is available through
    +	 * <i>jQuery.fn.dataTable.ext</i> where it may be accessed and manipulated. It is
    +	 * also aliased to <i>jQuery.fn.dataTableExt</i> for historic reasons.
    +	 *  @namespace
    +	 *  @extends DataTable.models.ext
    +	 */
    +	DataTable.ext = $.extend( true, {}, DataTable.models.ext );
    +	
    +	$.extend( DataTable.ext.oStdClasses, {
    +		"sTable": "dataTable",
    +	
    +		/* Two buttons buttons */
    +		"sPagePrevEnabled": "paginate_enabled_previous",
    +		"sPagePrevDisabled": "paginate_disabled_previous",
    +		"sPageNextEnabled": "paginate_enabled_next",
    +		"sPageNextDisabled": "paginate_disabled_next",
    +		"sPageJUINext": "",
    +		"sPageJUIPrev": "",
    +		
    +		/* Full numbers paging buttons */
    +		"sPageButton": "paginate_button",
    +		"sPageButtonActive": "paginate_active",
    +		"sPageButtonStaticDisabled": "paginate_button paginate_button_disabled",
    +		"sPageFirst": "first",
    +		"sPagePrevious": "previous",
    +		"sPageNext": "next",
    +		"sPageLast": "last",
    +		
    +		/* Striping classes */
    +		"sStripeOdd": "odd",
    +		"sStripeEven": "even",
    +		
    +		/* Empty row */
    +		"sRowEmpty": "dataTables_empty",
    +		
    +		/* Features */
    +		"sWrapper": "dataTables_wrapper",
    +		"sFilter": "dataTables_filter",
    +		"sInfo": "dataTables_info",
    +		"sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
    +		"sLength": "dataTables_length",
    +		"sProcessing": "dataTables_processing",
    +		
    +		/* Sorting */
    +		"sSortAsc": "sorting_asc",
    +		"sSortDesc": "sorting_desc",
    +		"sSortable": "sorting", /* Sortable in both directions */
    +		"sSortableAsc": "sorting_asc_disabled",
    +		"sSortableDesc": "sorting_desc_disabled",
    +		"sSortableNone": "sorting_disabled",
    +		"sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
    +		"sSortJUIAsc": "",
    +		"sSortJUIDesc": "",
    +		"sSortJUI": "",
    +		"sSortJUIAscAllowed": "",
    +		"sSortJUIDescAllowed": "",
    +		"sSortJUIWrapper": "",
    +		"sSortIcon": "",
    +		
    +		/* Scrolling */
    +		"sScrollWrapper": "dataTables_scroll",
    +		"sScrollHead": "dataTables_scrollHead",
    +		"sScrollHeadInner": "dataTables_scrollHeadInner",
    +		"sScrollBody": "dataTables_scrollBody",
    +		"sScrollFoot": "dataTables_scrollFoot",
    +		"sScrollFootInner": "dataTables_scrollFootInner",
    +		
    +		/* Misc */
    +		"sFooterTH": "",
    +		"sJUIHeader": "",
    +		"sJUIFooter": ""
    +	} );
    +	
    +	
    +	$.extend( DataTable.ext.oJUIClasses, DataTable.ext.oStdClasses, {
    +		/* Two buttons buttons */
    +		"sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left",
    +		"sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled",
    +		"sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right",
    +		"sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled",
    +		"sPageJUINext": "ui-icon ui-icon-circle-arrow-e",
    +		"sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w",
    +		
    +		/* Full numbers paging buttons */
    +		"sPageButton": "fg-button ui-button ui-state-default",
    +		"sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled",
    +		"sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled",
    +		"sPageFirst": "first ui-corner-tl ui-corner-bl",
    +		"sPageLast": "last ui-corner-tr ui-corner-br",
    +		
    +		/* Features */
    +		"sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
    +			"ui-buttonset-multi paging_", /* Note that the type is postfixed */
    +		
    +		/* Sorting */
    +		"sSortAsc": "ui-state-default",
    +		"sSortDesc": "ui-state-default",
    +		"sSortable": "ui-state-default",
    +		"sSortableAsc": "ui-state-default",
    +		"sSortableDesc": "ui-state-default",
    +		"sSortableNone": "ui-state-default",
    +		"sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n",
    +		"sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s",
    +		"sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s",
    +		"sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n",
    +		"sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s",
    +		"sSortJUIWrapper": "DataTables_sort_wrapper",
    +		"sSortIcon": "DataTables_sort_icon",
    +		
    +		/* Scrolling */
    +		"sScrollHead": "dataTables_scrollHead ui-state-default",
    +		"sScrollFoot": "dataTables_scrollFoot ui-state-default",
    +		
    +		/* Misc */
    +		"sFooterTH": "ui-state-default",
    +		"sJUIHeader": "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix",
    +		"sJUIFooter": "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix"
    +	} );
    +	
    +	/*
    +	 * Variable: oPagination
    +	 * Purpose:  
    +	 * Scope:    jQuery.fn.dataTableExt
    +	 */
    +	$.extend( DataTable.ext.oPagination, {
    +		/*
    +		 * Variable: two_button
    +		 * Purpose:  Standard two button (forward/back) pagination
    +		 * Scope:    jQuery.fn.dataTableExt.oPagination
    +		 */
    +		"two_button": {
    +			/*
    +			 * Function: oPagination.two_button.fnInit
    +			 * Purpose:  Initialise dom elements required for pagination with forward/back buttons only
    +			 * Returns:  -
    +			 * Inputs:   object:oSettings - dataTables settings object
    +			 *           node:nPaging - the DIV which contains this pagination control
    +			 *           function:fnCallbackDraw - draw function which must be called on update
    +			 */
    +			"fnInit": function ( oSettings, nPaging, fnCallbackDraw )
    +			{
    +				var oLang = oSettings.oLanguage.oPaginate;
    +				var oClasses = oSettings.oClasses;
    +				var fnClickHandler = function ( e ) {
    +					if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )
    +					{
    +						fnCallbackDraw( oSettings );
    +					}
    +				};
    +	
    +				var sAppend = (!oSettings.bJUI) ?
    +					'<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sPrevious+'</a>'+
    +					'<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sNext+'</a>'
    +					:
    +					'<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUIPrev+'"></span></a>'+
    +					'<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUINext+'"></span></a>';
    +				$(nPaging).append( sAppend );
    +				
    +				var els = $('a', nPaging);
    +				var nPrevious = els[0],
    +					nNext = els[1];
    +				
    +				oSettings.oApi._fnBindAction( nPrevious, {action: "previous"}, fnClickHandler );
    +				oSettings.oApi._fnBindAction( nNext,     {action: "next"},     fnClickHandler );
    +				
    +				/* ID the first elements only */
    +				if ( !oSettings.aanFeatures.p )
    +				{
    +					nPaging.id = oSettings.sTableId+'_paginate';
    +					nPrevious.id = oSettings.sTableId+'_previous';
    +					nNext.id = oSettings.sTableId+'_next';
    +	
    +					nPrevious.setAttribute('aria-controls', oSettings.sTableId);
    +					nNext.setAttribute('aria-controls', oSettings.sTableId);
    +				}
    +			},
    +			
    +			/*
    +			 * Function: oPagination.two_button.fnUpdate
    +			 * Purpose:  Update the two button pagination at the end of the draw
    +			 * Returns:  -
    +			 * Inputs:   object:oSettings - dataTables settings object
    +			 *           function:fnCallbackDraw - draw function to call on page change
    +			 */
    +			"fnUpdate": function ( oSettings, fnCallbackDraw )
    +			{
    +				if ( !oSettings.aanFeatures.p )
    +				{
    +					return;
    +				}
    +				
    +				var oClasses = oSettings.oClasses;
    +				var an = oSettings.aanFeatures.p;
    +				var nNode;
    +	
    +				/* Loop over each instance of the pager */
    +				for ( var i=0, iLen=an.length ; i<iLen ; i++ )
    +				{
    +					nNode = an[i].firstChild;
    +					if ( nNode )
    +					{
    +						/* Previous page */
    +						nNode.className = ( oSettings._iDisplayStart === 0 ) ?
    +						    oClasses.sPagePrevDisabled : oClasses.sPagePrevEnabled;
    +						    
    +						/* Next page */
    +						nNode = nNode.nextSibling;
    +						nNode.className = ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ?
    +						    oClasses.sPageNextDisabled : oClasses.sPageNextEnabled;
    +					}
    +				}
    +			}
    +		},
    +		
    +		
    +		/*
    +		 * Variable: iFullNumbersShowPages
    +		 * Purpose:  Change the number of pages which can be seen
    +		 * Scope:    jQuery.fn.dataTableExt.oPagination
    +		 */
    +		"iFullNumbersShowPages": 5,
    +		
    +		/*
    +		 * Variable: full_numbers
    +		 * Purpose:  Full numbers pagination
    +		 * Scope:    jQuery.fn.dataTableExt.oPagination
    +		 */
    +		"full_numbers": {
    +			/*
    +			 * Function: oPagination.full_numbers.fnInit
    +			 * Purpose:  Initialise dom elements required for pagination with a list of the pages
    +			 * Returns:  -
    +			 * Inputs:   object:oSettings - dataTables settings object
    +			 *           node:nPaging - the DIV which contains this pagination control
    +			 *           function:fnCallbackDraw - draw function which must be called on update
    +			 */
    +			"fnInit": function ( oSettings, nPaging, fnCallbackDraw )
    +			{
    +				var oLang = oSettings.oLanguage.oPaginate;
    +				var oClasses = oSettings.oClasses;
    +				var fnClickHandler = function ( e ) {
    +					if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )
    +					{
    +						fnCallbackDraw( oSettings );
    +					}
    +				};
    +	
    +				$(nPaging).append(
    +					'<a  tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageFirst+'">'+oLang.sFirst+'</a>'+
    +					'<a  tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPagePrevious+'">'+oLang.sPrevious+'</a>'+
    +					'<span></span>'+
    +					'<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageNext+'">'+oLang.sNext+'</a>'+
    +					'<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageLast+'">'+oLang.sLast+'</a>'
    +				);
    +				var els = $('a', nPaging);
    +				var nFirst = els[0],
    +					nPrev = els[1],
    +					nNext = els[2],
    +					nLast = els[3];
    +				
    +				oSettings.oApi._fnBindAction( nFirst, {action: "first"},    fnClickHandler );
    +				oSettings.oApi._fnBindAction( nPrev,  {action: "previous"}, fnClickHandler );
    +				oSettings.oApi._fnBindAction( nNext,  {action: "next"},     fnClickHandler );
    +				oSettings.oApi._fnBindAction( nLast,  {action: "last"},     fnClickHandler );
    +				
    +				/* ID the first elements only */
    +				if ( !oSettings.aanFeatures.p )
    +				{
    +					nPaging.id = oSettings.sTableId+'_paginate';
    +					nFirst.id =oSettings.sTableId+'_first';
    +					nPrev.id =oSettings.sTableId+'_previous';
    +					nNext.id =oSettings.sTableId+'_next';
    +					nLast.id =oSettings.sTableId+'_last';
    +				}
    +			},
    +			
    +			/*
    +			 * Function: oPagination.full_numbers.fnUpdate
    +			 * Purpose:  Update the list of page buttons shows
    +			 * Returns:  -
    +			 * Inputs:   object:oSettings - dataTables settings object
    +			 *           function:fnCallbackDraw - draw function to call on page change
    +			 */
    +			"fnUpdate": function ( oSettings, fnCallbackDraw )
    +			{
    +				if ( !oSettings.aanFeatures.p )
    +				{
    +					return;
    +				}
    +				
    +				var iPageCount = DataTable.ext.oPagination.iFullNumbersShowPages;
    +				var iPageCountHalf = Math.floor(iPageCount / 2);
    +				var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength);
    +				var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
    +				var sList = "";
    +				var iStartButton, iEndButton, i, iLen;
    +				var oClasses = oSettings.oClasses;
    +				var anButtons, anStatic, nPaginateList, nNode;
    +				var an = oSettings.aanFeatures.p;
    +				var fnBind = function (j) {
    +					oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) {
    +						/* Use the information in the element to jump to the required page */
    +						oSettings.oApi._fnPageChange( oSettings, e.data.page );
    +						fnCallbackDraw( oSettings );
    +						e.preventDefault();
    +					} );
    +				};
    +				
    +				/* Pages calculation */
    +				if ( oSettings._iDisplayLength === -1 )
    +				{
    +					iStartButton = 1;
    +					iEndButton = 1;
    +					iCurrentPage = 1;
    +				}
    +				else if (iPages < iPageCount)
    +				{
    +					iStartButton = 1;
    +					iEndButton = iPages;
    +				}
    +				else if (iCurrentPage <= iPageCountHalf)
    +				{
    +					iStartButton = 1;
    +					iEndButton = iPageCount;
    +				}
    +				else if (iCurrentPage >= (iPages - iPageCountHalf))
    +				{
    +					iStartButton = iPages - iPageCount + 1;
    +					iEndButton = iPages;
    +				}
    +				else
    +				{
    +					iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;
    +					iEndButton = iStartButton + iPageCount - 1;
    +				}
    +	
    +				
    +				/* Build the dynamic list */
    +				for ( i=iStartButton ; i<=iEndButton ; i++ )
    +				{
    +					sList += (iCurrentPage !== i) ?
    +						'<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+'">'+oSettings.fnFormatNumber(i)+'</a>' :
    +						'<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButtonActive+'">'+oSettings.fnFormatNumber(i)+'</a>';
    +				}
    +				
    +				/* Loop over each instance of the pager */
    +				for ( i=0, iLen=an.length ; i<iLen ; i++ )
    +				{
    +					nNode = an[i];
    +					if ( !nNode.hasChildNodes() )
    +					{
    +						continue;
    +					}
    +					
    +					/* Build up the dynamic list first - html and listeners */
    +					$('span:eq(0)', nNode)
    +						.html( sList )
    +						.children('a').each( fnBind );
    +					
    +					/* Update the permanent button's classes */
    +					anButtons = nNode.getElementsByTagName('a');
    +					anStatic = [
    +						anButtons[0], anButtons[1], 
    +						anButtons[anButtons.length-2], anButtons[anButtons.length-1]
    +					];
    +	
    +					$(anStatic).removeClass( oClasses.sPageButton+" "+oClasses.sPageButtonActive+" "+oClasses.sPageButtonStaticDisabled );
    +					$([anStatic[0], anStatic[1]]).addClass( 
    +						(iCurrentPage==1) ?
    +							oClasses.sPageButtonStaticDisabled :
    +							oClasses.sPageButton
    +					);
    +					$([anStatic[2], anStatic[3]]).addClass(
    +						(iPages===0 || iCurrentPage===iPages || oSettings._iDisplayLength===-1) ?
    +							oClasses.sPageButtonStaticDisabled :
    +							oClasses.sPageButton
    +					);
    +				}
    +			}
    +		}
    +	} );
    +	
    +	$.extend( DataTable.ext.oSort, {
    +		/*
    +		 * text sorting
    +		 */
    +		"string-pre": function ( a )
    +		{
    +			if ( typeof a != 'string' ) {
    +				a = (a !== null && a.toString) ? a.toString() : '';
    +			}
    +			return a.toLowerCase();
    +		},
    +	
    +		"string-asc": function ( x, y )
    +		{
    +			return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    +		},
    +		
    +		"string-desc": function ( x, y )
    +		{
    +			return ((x < y) ? 1 : ((x > y) ? -1 : 0));
    +		},
    +		
    +		
    +		/*
    +		 * html sorting (ignore html tags)
    +		 */
    +		"html-pre": function ( a )
    +		{
    +			return a.replace( /<.*?>/g, "" ).toLowerCase();
    +		},
    +		
    +		"html-asc": function ( x, y )
    +		{
    +			return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    +		},
    +		
    +		"html-desc": function ( x, y )
    +		{
    +			return ((x < y) ? 1 : ((x > y) ? -1 : 0));
    +		},
    +		
    +		
    +		/*
    +		 * date sorting
    +		 */
    +		"date-pre": function ( a )
    +		{
    +			var x = Date.parse( a );
    +			
    +			if ( isNaN(x) || x==="" )
    +			{
    +				x = Date.parse( "01/01/1970 00:00:00" );
    +			}
    +			return x;
    +		},
    +	
    +		"date-asc": function ( x, y )
    +		{
    +			return x - y;
    +		},
    +		
    +		"date-desc": function ( x, y )
    +		{
    +			return y - x;
    +		},
    +		
    +		
    +		/*
    +		 * numerical sorting
    +		 */
    +		"numeric-pre": function ( a )
    +		{
    +			return (a=="-" || a==="") ? 0 : a*1;
    +		},
    +	
    +		"numeric-asc": function ( x, y )
    +		{
    +			return x - y;
    +		},
    +		
    +		"numeric-desc": function ( x, y )
    +		{
    +			return y - x;
    +		}
    +	} );
    +	
    +	
    +	$.extend( DataTable.ext.aTypes, [
    +		/*
    +		 * Function: -
    +		 * Purpose:  Check to see if a string is numeric
    +		 * Returns:  string:'numeric' or null
    +		 * Inputs:   mixed:sText - string to check
    +		 */
    +		function ( sData )
    +		{
    +			/* Allow zero length strings as a number */
    +			if ( typeof sData === 'number' )
    +			{
    +				return 'numeric';
    +			}
    +			else if ( typeof sData !== 'string' )
    +			{
    +				return null;
    +			}
    +			
    +			var sValidFirstChars = "0123456789-";
    +			var sValidChars = "0123456789.";
    +			var Char;
    +			var bDecimal = false;
    +			
    +			/* Check for a valid first char (no period and allow negatives) */
    +			Char = sData.charAt(0); 
    +			if (sValidFirstChars.indexOf(Char) == -1) 
    +			{
    +				return null;
    +			}
    +			
    +			/* Check all the other characters are valid */
    +			for ( var i=1 ; i<sData.length ; i++ ) 
    +			{
    +				Char = sData.charAt(i); 
    +				if (sValidChars.indexOf(Char) == -1) 
    +				{
    +					return null;
    +				}
    +				
    +				/* Only allowed one decimal place... */
    +				if ( Char == "." )
    +				{
    +					if ( bDecimal )
    +					{
    +						return null;
    +					}
    +					bDecimal = true;
    +				}
    +			}
    +			
    +			return 'numeric';
    +		},
    +		
    +		/*
    +		 * Function: -
    +		 * Purpose:  Check to see if a string is actually a formatted date
    +		 * Returns:  string:'date' or null
    +		 * Inputs:   string:sText - string to check
    +		 */
    +		function ( sData )
    +		{
    +			var iParse = Date.parse(sData);
    +			if ( (iParse !== null && !isNaN(iParse)) || (typeof sData === 'string' && sData.length === 0) )
    +			{
    +				return 'date';
    +			}
    +			return null;
    +		},
    +		
    +		/*
    +		 * Function: -
    +		 * Purpose:  Check to see if a string should be treated as an HTML string
    +		 * Returns:  string:'html' or null
    +		 * Inputs:   string:sText - string to check
    +		 */
    +		function ( sData )
    +		{
    +			if ( typeof sData === 'string' && sData.indexOf('<') != -1 && sData.indexOf('>') != -1 )
    +			{
    +				return 'html';
    +			}
    +			return null;
    +		}
    +	] );
    +	
    +
    +	// jQuery aliases
    +	$.fn.DataTable = DataTable;
    +	$.fn.dataTable = DataTable;
    +	$.fn.dataTableSettings = DataTable.settings;
    +	$.fn.dataTableExt = DataTable.ext;
    +
    +
    +	// Information about events fired by DataTables - for documentation.
    +	/**
    +	 * Draw event, fired whenever the table is redrawn on the page, at the same point as
    +	 * fnDrawCallback. This may be useful for binding events or performing calculations when
    +	 * the table is altered at all.
    +	 *  @name DataTable#draw
    +	 *  @event
    +	 *  @param {event} e jQuery event object
    +	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
    +	 */
    +
    +	/**
    +	 * Filter event, fired when the filtering applied to the table (using the build in global
    +	 * global filter, or column filters) is altered.
    +	 *  @name DataTable#filter
    +	 *  @event
    +	 *  @param {event} e jQuery event object
    +	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
    +	 */
    +
    +	/**
    +	 * Page change event, fired when the paging of the table is altered.
    +	 *  @name DataTable#page
    +	 *  @event
    +	 *  @param {event} e jQuery event object
    +	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
    +	 */
    +
    +	/**
    +	 * Sort event, fired when the sorting applied to the table is altered.
    +	 *  @name DataTable#sort
    +	 *  @event
    +	 *  @param {event} e jQuery event object
    +	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
    +	 */
    +
    +	/**
    +	 * DataTables initialisation complete event, fired when the table is fully drawn,
    +	 * including Ajax data loaded, if Ajax data is required.
    +	 *  @name DataTable#init
    +	 *  @event
    +	 *  @param {event} e jQuery event object
    +	 *  @param {object} oSettings DataTables settings object
    +	 *  @param {object} json The JSON object request from the server - only
    +	 *    present if client-side Ajax sourced data is used</li></ol>
    +	 */
    +
    +	/**
    +	 * State save event, fired when the table has changed state a new state save is required.
    +	 * This method allows modification of the state saving object prior to actually doing the
    +	 * save, including addition or other state properties (for plug-ins) or modification
    +	 * of a DataTables core property.
    +	 *  @name DataTable#stateSaveParams
    +	 *  @event
    +	 *  @param {event} e jQuery event object
    +	 *  @param {object} oSettings DataTables settings object
    +	 *  @param {object} json The state information to be saved
    +	 */
    +
    +	/**
    +	 * State load event, fired when the table is loading state from the stored data, but
    +	 * prior to the settings object being modified by the saved state - allowing modification
    +	 * of the saved state is required or loading of state for a plug-in.
    +	 *  @name DataTable#stateLoadParams
    +	 *  @event
    +	 *  @param {event} e jQuery event object
    +	 *  @param {object} oSettings DataTables settings object
    +	 *  @param {object} json The saved state information
    +	 */
    +
    +	/**
    +	 * State loaded event, fired when state has been loaded from stored data and the settings
    +	 * object has been modified by the loaded data.
    +	 *  @name DataTable#stateLoaded
    +	 *  @event
    +	 *  @param {event} e jQuery event object
    +	 *  @param {object} oSettings DataTables settings object
    +	 *  @param {object} json The saved state information
    +	 */
    +
    +	/**
    +	 * Processing event, fired when DataTables is doing some kind of processing (be it,
    +	 * sort, filter or anything else). Can be used to indicate to the end user that
    +	 * there is something happening, or that something has finished.
    +	 *  @name DataTable#processing
    +	 *  @event
    +	 *  @param {event} e jQuery event object
    +	 *  @param {object} oSettings DataTables settings object
    +	 *  @param {boolean} bShow Flag for if DataTables is doing processing or not
    +	 */
    +
    +	/**
    +	 * Ajax (XHR) event, fired whenever an Ajax request is completed from a request to 
    +	 * made to the server for new data (note that this trigger is called in fnServerData,
    +	 * if you override fnServerData and which to use this event, you need to trigger it in
    +	 * you success function).
    +	 *  @name DataTable#xhr
    +	 *  @event
    +	 *  @param {event} e jQuery event object
    +	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
    +	 *  @param {object} json JSON returned from the server
    +	 */
    +
    +	/**
    +	 * Destroy event, fired when the DataTable is destroyed by calling fnDestroy or passing
    +	 * the bDestroy:true parameter in the initialisation object. This can be used to remove
    +	 * bound events, added DOM nodes, etc.
    +	 *  @name DataTable#destroy
    +	 *  @event
    +	 *  @param {event} e jQuery event object
    +	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
    +	 */
    +}));
    +
    +}(window, document));
    +
    diff --git a/src/main/webapp/plug-in/datatables/js/jquery.dataTables.min.js b/src/main/webapp/plug-in/datatables/js/jquery.dataTables.min.js
    new file mode 100644
    index 00000000..02694a4a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/js/jquery.dataTables.min.js
    @@ -0,0 +1,155 @@
    +/*
    + * File:        jquery.dataTables.min.js
    + * Version:     1.9.4
    + * Author:      Allan Jardine (www.sprymedia.co.uk)
    + * Info:        www.datatables.net
    + * 
    + * Copyright 2008-2012 Allan Jardine, all rights reserved.
    + *
    + * This source file is free software, under either the GPL v2 license or a
    + * BSD style license, available at:
    + *   http://datatables.net/license_gpl2
    + *   http://datatables.net/license_bsd
    + * 
    + * This source file is distributed in the hope that it will be useful, but 
    + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
    + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
    + */
    +(function(X,l,n){var L=function(h){var j=function(e){function o(a,b){var c=j.defaults.columns,d=a.aoColumns.length,c=h.extend({},j.models.oColumn,c,{sSortingClass:a.oClasses.sSortable,sSortingClassJUI:a.oClasses.sSortJUI,nTh:b?b:l.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.oDefaults:d});a.aoColumns.push(c);if(a.aoPreSearchCols[d]===n||null===a.aoPreSearchCols[d])a.aoPreSearchCols[d]=h.extend({},j.models.oSearch);else if(c=a.aoPreSearchCols[d],
    +c.bRegex===n&&(c.bRegex=!0),c.bSmart===n&&(c.bSmart=!0),c.bCaseInsensitive===n)c.bCaseInsensitive=!0;m(a,d,null)}function m(a,b,c){var d=a.aoColumns[b];c!==n&&null!==c&&(c.mDataProp&&!c.mData&&(c.mData=c.mDataProp),c.sType!==n&&(d.sType=c.sType,d._bAutoType=!1),h.extend(d,c),p(d,c,"sWidth","sWidthOrig"),c.iDataSort!==n&&(d.aDataSort=[c.iDataSort]),p(d,c,"aDataSort"));var i=d.mRender?Q(d.mRender):null,f=Q(d.mData);d.fnGetData=function(a,b){var c=f(a,b);return d.mRender&&b&&""!==b?i(c,b,a):c};d.fnSetData=
    +L(d.mData);a.oFeatures.bSort||(d.bSortable=!1);!d.bSortable||-1==h.inArray("asc",d.asSorting)&&-1==h.inArray("desc",d.asSorting)?(d.sSortingClass=a.oClasses.sSortableNone,d.sSortingClassJUI=""):-1==h.inArray("asc",d.asSorting)&&-1==h.inArray("desc",d.asSorting)?(d.sSortingClass=a.oClasses.sSortable,d.sSortingClassJUI=a.oClasses.sSortJUI):-1!=h.inArray("asc",d.asSorting)&&-1==h.inArray("desc",d.asSorting)?(d.sSortingClass=a.oClasses.sSortableAsc,d.sSortingClassJUI=a.oClasses.sSortJUIAscAllowed):-1==
    +h.inArray("asc",d.asSorting)&&-1!=h.inArray("desc",d.asSorting)&&(d.sSortingClass=a.oClasses.sSortableDesc,d.sSortingClassJUI=a.oClasses.sSortJUIDescAllowed)}function k(a){if(!1===a.oFeatures.bAutoWidth)return!1;da(a);for(var b=0,c=a.aoColumns.length;b<c;b++)a.aoColumns[b].nTh.style.width=a.aoColumns[b].sWidth}function G(a,b){var c=r(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function R(a,b){var c=r(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}function t(a){return r(a,"bVisible").length}
    +function r(a,b){var c=[];h.map(a.aoColumns,function(a,i){a[b]&&c.push(i)});return c}function B(a){for(var b=j.ext.aTypes,c=b.length,d=0;d<c;d++){var i=b[d](a);if(null!==i)return i}return"string"}function u(a,b){for(var c=b.split(","),d=[],i=0,f=a.aoColumns.length;i<f;i++)for(var g=0;g<f;g++)if(a.aoColumns[i].sName==c[g]){d.push(g);break}return d}function M(a){for(var b="",c=0,d=a.aoColumns.length;c<d;c++)b+=a.aoColumns[c].sName+",";return b.length==d?"":b.slice(0,-1)}function ta(a,b,c,d){var i,f,
    +g,e,w;if(b)for(i=b.length-1;0<=i;i--){var j=b[i].aTargets;h.isArray(j)||D(a,1,"aTargets must be an array of targets, not a "+typeof j);f=0;for(g=j.length;f<g;f++)if("number"===typeof j[f]&&0<=j[f]){for(;a.aoColumns.length<=j[f];)o(a);d(j[f],b[i])}else if("number"===typeof j[f]&&0>j[f])d(a.aoColumns.length+j[f],b[i]);else if("string"===typeof j[f]){e=0;for(w=a.aoColumns.length;e<w;e++)("_all"==j[f]||h(a.aoColumns[e].nTh).hasClass(j[f]))&&d(e,b[i])}}if(c){i=0;for(a=c.length;i<a;i++)d(i,c[i])}}function H(a,
    +b){var c;c=h.isArray(b)?b.slice():h.extend(!0,{},b);var d=a.aoData.length,i=h.extend(!0,{},j.models.oRow);i._aData=c;a.aoData.push(i);for(var f,i=0,g=a.aoColumns.length;i<g;i++)c=a.aoColumns[i],"function"===typeof c.fnRender&&c.bUseRendered&&null!==c.mData?F(a,d,i,S(a,d,i)):F(a,d,i,v(a,d,i)),c._bAutoType&&"string"!=c.sType&&(f=v(a,d,i,"type"),null!==f&&""!==f&&(f=B(f),null===c.sType?c.sType=f:c.sType!=f&&"html"!=c.sType&&(c.sType="string")));a.aiDisplayMaster.push(d);a.oFeatures.bDeferRender||ea(a,
    +d);return d}function ua(a){var b,c,d,i,f,g,e;if(a.bDeferLoading||null===a.sAjaxSource)for(b=a.nTBody.firstChild;b;){if("TR"==b.nodeName.toUpperCase()){c=a.aoData.length;b._DT_RowIndex=c;a.aoData.push(h.extend(!0,{},j.models.oRow,{nTr:b}));a.aiDisplayMaster.push(c);f=b.firstChild;for(d=0;f;){g=f.nodeName.toUpperCase();if("TD"==g||"TH"==g)F(a,c,d,h.trim(f.innerHTML)),d++;f=f.nextSibling}}b=b.nextSibling}i=T(a);d=[];b=0;for(c=i.length;b<c;b++)for(f=i[b].firstChild;f;)g=f.nodeName.toUpperCase(),("TD"==
    +g||"TH"==g)&&d.push(f),f=f.nextSibling;c=0;for(i=a.aoColumns.length;c<i;c++){e=a.aoColumns[c];null===e.sTitle&&(e.sTitle=e.nTh.innerHTML);var w=e._bAutoType,o="function"===typeof e.fnRender,k=null!==e.sClass,n=e.bVisible,m,p;if(w||o||k||!n){g=0;for(b=a.aoData.length;g<b;g++)f=a.aoData[g],m=d[g*i+c],w&&"string"!=e.sType&&(p=v(a,g,c,"type"),""!==p&&(p=B(p),null===e.sType?e.sType=p:e.sType!=p&&"html"!=e.sType&&(e.sType="string"))),e.mRender?m.innerHTML=v(a,g,c,"display"):e.mData!==c&&(m.innerHTML=v(a,
    +g,c,"display")),o&&(p=S(a,g,c),m.innerHTML=p,e.bUseRendered&&F(a,g,c,p)),k&&(m.className+=" "+e.sClass),n?f._anHidden[c]=null:(f._anHidden[c]=m,m.parentNode.removeChild(m)),e.fnCreatedCell&&e.fnCreatedCell.call(a.oInstance,m,v(a,g,c,"display"),f._aData,g,c)}}if(0!==a.aoRowCreatedCallback.length){b=0;for(c=a.aoData.length;b<c;b++)f=a.aoData[b],A(a,"aoRowCreatedCallback",null,[f.nTr,f._aData,b])}}function I(a,b){return b._DT_RowIndex!==n?b._DT_RowIndex:null}function fa(a,b,c){for(var b=J(a,b),d=0,a=
    +a.aoColumns.length;d<a;d++)if(b[d]===c)return d;return-1}function Y(a,b,c,d){for(var i=[],f=0,g=d.length;f<g;f++)i.push(v(a,b,d[f],c));return i}function v(a,b,c,d){var i=a.aoColumns[c];if((c=i.fnGetData(a.aoData[b]._aData,d))===n)return a.iDrawError!=a.iDraw&&null===i.sDefaultContent&&(D(a,0,"Requested unknown parameter "+("function"==typeof i.mData?"{mData function}":"'"+i.mData+"'")+" from the data source for row "+b),a.iDrawError=a.iDraw),i.sDefaultContent;if(null===c&&null!==i.sDefaultContent)c=
    +i.sDefaultContent;else if("function"===typeof c)return c();return"display"==d&&null===c?"":c}function F(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d)}function Q(a){if(null===a)return function(){return null};if("function"===typeof a)return function(b,d,i){return a(b,d,i)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("["))){var b=function(a,d,i){var f=i.split("."),g;if(""!==i){var e=0;for(g=f.length;e<g;e++){if(i=f[e].match(U)){f[e]=f[e].replace(U,"");""!==f[e]&&(a=a[f[e]]);
    +g=[];f.splice(0,e+1);for(var f=f.join("."),e=0,h=a.length;e<h;e++)g.push(b(a[e],d,f));a=i[0].substring(1,i[0].length-1);a=""===a?g:g.join(a);break}if(null===a||a[f[e]]===n)return n;a=a[f[e]]}}return a};return function(c,d){return b(c,d,a)}}return function(b){return b[a]}}function L(a){if(null===a)return function(){};if("function"===typeof a)return function(b,d){a(b,"set",d)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("["))){var b=function(a,d,i){var i=i.split("."),f,g,e=0;for(g=
    +i.length-1;e<g;e++){if(f=i[e].match(U)){i[e]=i[e].replace(U,"");a[i[e]]=[];f=i.slice();f.splice(0,e+1);g=f.join(".");for(var h=0,j=d.length;h<j;h++)f={},b(f,d[h],g),a[i[e]].push(f);return}if(null===a[i[e]]||a[i[e]]===n)a[i[e]]={};a=a[i[e]]}a[i[i.length-1].replace(U,"")]=d};return function(c,d){return b(c,d,a)}}return function(b,d){b[a]=d}}function Z(a){for(var b=[],c=a.aoData.length,d=0;d<c;d++)b.push(a.aoData[d]._aData);return b}function ga(a){a.aoData.splice(0,a.aoData.length);a.aiDisplayMaster.splice(0,
    +a.aiDisplayMaster.length);a.aiDisplay.splice(0,a.aiDisplay.length);y(a)}function ha(a,b){for(var c=-1,d=0,i=a.length;d<i;d++)a[d]==b?c=d:a[d]>b&&a[d]--; -1!=c&&a.splice(c,1)}function S(a,b,c){var d=a.aoColumns[c];return d.fnRender({iDataRow:b,iDataColumn:c,oSettings:a,aData:a.aoData[b]._aData,mDataProp:d.mData},v(a,b,c,"display"))}function ea(a,b){var c=a.aoData[b],d;if(null===c.nTr){c.nTr=l.createElement("tr");c.nTr._DT_RowIndex=b;c._aData.DT_RowId&&(c.nTr.id=c._aData.DT_RowId);c._aData.DT_RowClass&&
    +(c.nTr.className=c._aData.DT_RowClass);for(var i=0,f=a.aoColumns.length;i<f;i++){var g=a.aoColumns[i];d=l.createElement(g.sCellType);d.innerHTML="function"===typeof g.fnRender&&(!g.bUseRendered||null===g.mData)?S(a,b,i):v(a,b,i,"display");null!==g.sClass&&(d.className=g.sClass);g.bVisible?(c.nTr.appendChild(d),c._anHidden[i]=null):c._anHidden[i]=d;g.fnCreatedCell&&g.fnCreatedCell.call(a.oInstance,d,v(a,b,i,"display"),c._aData,b,i)}A(a,"aoRowCreatedCallback",null,[c.nTr,c._aData,b])}}function va(a){var b,
    +c,d;if(0!==h("th, td",a.nTHead).length){b=0;for(d=a.aoColumns.length;b<d;b++)if(c=a.aoColumns[b].nTh,c.setAttribute("role","columnheader"),a.aoColumns[b].bSortable&&(c.setAttribute("tabindex",a.iTabIndex),c.setAttribute("aria-controls",a.sTableId)),null!==a.aoColumns[b].sClass&&h(c).addClass(a.aoColumns[b].sClass),a.aoColumns[b].sTitle!=c.innerHTML)c.innerHTML=a.aoColumns[b].sTitle}else{var i=l.createElement("tr");b=0;for(d=a.aoColumns.length;b<d;b++)c=a.aoColumns[b].nTh,c.innerHTML=a.aoColumns[b].sTitle,
    +c.setAttribute("tabindex","0"),null!==a.aoColumns[b].sClass&&h(c).addClass(a.aoColumns[b].sClass),i.appendChild(c);h(a.nTHead).html("")[0].appendChild(i);V(a.aoHeader,a.nTHead)}h(a.nTHead).children("tr").attr("role","row");if(a.bJUI){b=0;for(d=a.aoColumns.length;b<d;b++){c=a.aoColumns[b].nTh;i=l.createElement("div");i.className=a.oClasses.sSortJUIWrapper;h(c).contents().appendTo(i);var f=l.createElement("span");f.className=a.oClasses.sSortIcon;i.appendChild(f);c.appendChild(i)}}if(a.oFeatures.bSort)for(b=
    +0;b<a.aoColumns.length;b++)!1!==a.aoColumns[b].bSortable?ia(a,a.aoColumns[b].nTh,b):h(a.aoColumns[b].nTh).addClass(a.oClasses.sSortableNone);""!==a.oClasses.sFooterTH&&h(a.nTFoot).children("tr").children("th").addClass(a.oClasses.sFooterTH);if(null!==a.nTFoot){c=N(a,null,a.aoFooter);b=0;for(d=a.aoColumns.length;b<d;b++)c[b]&&(a.aoColumns[b].nTf=c[b],a.aoColumns[b].sClass&&h(c[b]).addClass(a.aoColumns[b].sClass))}}function W(a,b,c){var d,i,f,g=[],e=[],h=a.aoColumns.length,j;c===n&&(c=!1);d=0;for(i=
    +b.length;d<i;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(f=h-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[d].splice(f,1);e.push([])}d=0;for(i=g.length;d<i;d++){if(a=g[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[d].length;f<b;f++)if(j=h=1,e[d][f]===n){a.appendChild(g[d][f].cell);for(e[d][f]=1;g[d+h]!==n&&g[d][f].cell==g[d+h][f].cell;)e[d+h][f]=1,h++;for(;g[d][f+j]!==n&&g[d][f].cell==g[d][f+j].cell;){for(c=0;c<h;c++)e[d+c][f+j]=1;j++}g[d][f].cell.rowSpan=h;g[d][f].cell.colSpan=j}}}function x(a){var b=
    +A(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))E(a,!1);else{var c,d,b=[],i=0,f=a.asStripeClasses.length;c=a.aoOpenRows.length;a.bDrawing=!0;a.iInitDisplayStart!==n&&-1!=a.iInitDisplayStart&&(a._iDisplayStart=a.oFeatures.bServerSide?a.iInitDisplayStart:a.iInitDisplayStart>=a.fnRecordsDisplay()?0:a.iInitDisplayStart,a.iInitDisplayStart=-1,y(a));if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++;else if(a.oFeatures.bServerSide){if(!a.bDestroying&&!wa(a))return}else a.iDraw++;if(0!==a.aiDisplay.length){var g=
    +a._iDisplayStart;d=a._iDisplayEnd;a.oFeatures.bServerSide&&(g=0,d=a.aoData.length);for(;g<d;g++){var e=a.aoData[a.aiDisplay[g]];null===e.nTr&&ea(a,a.aiDisplay[g]);var j=e.nTr;if(0!==f){var o=a.asStripeClasses[i%f];e._sRowStripe!=o&&(h(j).removeClass(e._sRowStripe).addClass(o),e._sRowStripe=o)}A(a,"aoRowCallback",null,[j,a.aoData[a.aiDisplay[g]]._aData,i,g]);b.push(j);i++;if(0!==c)for(e=0;e<c;e++)if(j==a.aoOpenRows[e].nParent){b.push(a.aoOpenRows[e].nTr);break}}}else b[0]=l.createElement("tr"),a.asStripeClasses[0]&&
    +(b[0].className=a.asStripeClasses[0]),c=a.oLanguage,f=c.sZeroRecords,1==a.iDraw&&null!==a.sAjaxSource&&!a.oFeatures.bServerSide?f=c.sLoadingRecords:c.sEmptyTable&&0===a.fnRecordsTotal()&&(f=c.sEmptyTable),c=l.createElement("td"),c.setAttribute("valign","top"),c.colSpan=t(a),c.className=a.oClasses.sRowEmpty,c.innerHTML=ja(a,f),b[i].appendChild(c);A(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Z(a),a._iDisplayStart,a.fnDisplayEnd(),a.aiDisplay]);A(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],
    +Z(a),a._iDisplayStart,a.fnDisplayEnd(),a.aiDisplay]);i=l.createDocumentFragment();c=l.createDocumentFragment();if(a.nTBody){f=a.nTBody.parentNode;c.appendChild(a.nTBody);if(!a.oScroll.bInfinite||!a._bInitComplete||a.bSorted||a.bFiltered)for(;c=a.nTBody.firstChild;)a.nTBody.removeChild(c);c=0;for(d=b.length;c<d;c++)i.appendChild(b[c]);a.nTBody.appendChild(i);null!==f&&f.appendChild(a.nTBody)}A(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1;a.oFeatures.bServerSide&&(E(a,!1),
    +a._bInitComplete||$(a))}}function aa(a){a.oFeatures.bSort?O(a,a.oPreviousSearch):a.oFeatures.bFilter?K(a,a.oPreviousSearch):(y(a),x(a))}function xa(a){var b=h("<div></div>")[0];a.nTable.parentNode.insertBefore(b,a.nTable);a.nTableWrapper=h('<div id="'+a.sTableId+'_wrapper" class="'+a.oClasses.sWrapper+'" role="grid"></div>')[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var c=a.nTableWrapper,d=a.sDom.split(""),i,f,g,e,w,o,k,m=0;m<d.length;m++){f=0;g=d[m];if("<"==g){e=h("<div></div>")[0];w=d[m+
    +1];if("'"==w||'"'==w){o="";for(k=2;d[m+k]!=w;)o+=d[m+k],k++;"H"==o?o=a.oClasses.sJUIHeader:"F"==o&&(o=a.oClasses.sJUIFooter);-1!=o.indexOf(".")?(w=o.split("."),e.id=w[0].substr(1,w[0].length-1),e.className=w[1]):"#"==o.charAt(0)?e.id=o.substr(1,o.length-1):e.className=o;m+=k}c.appendChild(e);c=e}else if(">"==g)c=c.parentNode;else if("l"==g&&a.oFeatures.bPaginate&&a.oFeatures.bLengthChange)i=ya(a),f=1;else if("f"==g&&a.oFeatures.bFilter)i=za(a),f=1;else if("r"==g&&a.oFeatures.bProcessing)i=Aa(a),f=
    +1;else if("t"==g)i=Ba(a),f=1;else if("i"==g&&a.oFeatures.bInfo)i=Ca(a),f=1;else if("p"==g&&a.oFeatures.bPaginate)i=Da(a),f=1;else if(0!==j.ext.aoFeatures.length){e=j.ext.aoFeatures;k=0;for(w=e.length;k<w;k++)if(g==e[k].cFeature){(i=e[k].fnInit(a))&&(f=1);break}}1==f&&null!==i&&("object"!==typeof a.aanFeatures[g]&&(a.aanFeatures[g]=[]),a.aanFeatures[g].push(i),c.appendChild(i))}b.parentNode.replaceChild(a.nTableWrapper,b)}function V(a,b){var c=h(b).children("tr"),d,i,f,g,e,j,o,k,m,p;a.splice(0,a.length);
    +f=0;for(j=c.length;f<j;f++)a.push([]);f=0;for(j=c.length;f<j;f++){d=c[f];for(i=d.firstChild;i;){if("TD"==i.nodeName.toUpperCase()||"TH"==i.nodeName.toUpperCase()){k=1*i.getAttribute("colspan");m=1*i.getAttribute("rowspan");k=!k||0===k||1===k?1:k;m=!m||0===m||1===m?1:m;g=0;for(e=a[f];e[g];)g++;o=g;p=1===k?!0:!1;for(e=0;e<k;e++)for(g=0;g<m;g++)a[f+g][o+e]={cell:i,unique:p},a[f+g].nTr=d}i=i.nextSibling}}}function N(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],V(c,b)));for(var b=0,i=c.length;b<i;b++)for(var f=
    +0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function wa(a){if(a.bAjaxDataGet){a.iDraw++;E(a,!0);var b=Ea(a);ka(a,b);a.fnServerData.call(a.oInstance,a.sAjaxSource,b,function(b){Fa(a,b)},a);return!1}return!0}function Ea(a){var b=a.aoColumns.length,c=[],d,i,f,g;c.push({name:"sEcho",value:a.iDraw});c.push({name:"iColumns",value:b});c.push({name:"sColumns",value:M(a)});c.push({name:"iDisplayStart",value:a._iDisplayStart});c.push({name:"iDisplayLength",
    +value:!1!==a.oFeatures.bPaginate?a._iDisplayLength:-1});for(f=0;f<b;f++)d=a.aoColumns[f].mData,c.push({name:"mDataProp_"+f,value:"function"===typeof d?"function":d});if(!1!==a.oFeatures.bFilter){c.push({name:"sSearch",value:a.oPreviousSearch.sSearch});c.push({name:"bRegex",value:a.oPreviousSearch.bRegex});for(f=0;f<b;f++)c.push({name:"sSearch_"+f,value:a.aoPreSearchCols[f].sSearch}),c.push({name:"bRegex_"+f,value:a.aoPreSearchCols[f].bRegex}),c.push({name:"bSearchable_"+f,value:a.aoColumns[f].bSearchable})}if(!1!==
    +a.oFeatures.bSort){var e=0;d=null!==a.aaSortingFixed?a.aaSortingFixed.concat(a.aaSorting):a.aaSorting.slice();for(f=0;f<d.length;f++){i=a.aoColumns[d[f][0]].aDataSort;for(g=0;g<i.length;g++)c.push({name:"iSortCol_"+e,value:i[g]}),c.push({name:"sSortDir_"+e,value:d[f][1]}),e++}c.push({name:"iSortingCols",value:e});for(f=0;f<b;f++)c.push({name:"bSortable_"+f,value:a.aoColumns[f].bSortable})}return c}function ka(a,b){A(a,"aoServerParams","serverParams",[b])}function Fa(a,b){if(b.sEcho!==n){if(1*b.sEcho<
    +a.iDraw)return;a.iDraw=1*b.sEcho}(!a.oScroll.bInfinite||a.oScroll.bInfinite&&(a.bSorted||a.bFiltered))&&ga(a);a._iRecordsTotal=parseInt(b.iTotalRecords,10);a._iRecordsDisplay=parseInt(b.iTotalDisplayRecords,10);var c=M(a),c=b.sColumns!==n&&""!==c&&b.sColumns!=c,d;c&&(d=u(a,b.sColumns));for(var i=Q(a.sAjaxDataProp)(b),f=0,g=i.length;f<g;f++)if(c){for(var e=[],h=0,j=a.aoColumns.length;h<j;h++)e.push(i[f][d[h]]);H(a,e)}else H(a,i[f]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;x(a);a.bAjaxDataGet=
    +!0;E(a,!1)}function za(a){var b=a.oPreviousSearch,c=a.oLanguage.sSearch,c=-1!==c.indexOf("_INPUT_")?c.replace("_INPUT_",'<input type="text" />'):""===c?'<input type="text" />':c+' <input type="text" />',d=l.createElement("div");d.className=a.oClasses.sFilter;d.innerHTML="<label>"+c+"</label>";a.aanFeatures.f||(d.id=a.sTableId+"_filter");c=h('input[type="text"]',d);d._DT_Input=c[0];c.val(b.sSearch.replace('"',"&quot;"));c.bind("keyup.DT",function(){for(var c=a.aanFeatures.f,d=this.value===""?"":this.value,
    +g=0,e=c.length;g<e;g++)c[g]!=h(this).parents("div.dataTables_filter")[0]&&h(c[g]._DT_Input).val(d);d!=b.sSearch&&K(a,{sSearch:d,bRegex:b.bRegex,bSmart:b.bSmart,bCaseInsensitive:b.bCaseInsensitive})});c.attr("aria-controls",a.sTableId).bind("keypress.DT",function(a){if(a.keyCode==13)return false});return d}function K(a,b,c){var d=a.oPreviousSearch,i=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};if(a.oFeatures.bServerSide)f(b);
    +else{Ga(a,b.sSearch,c,b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<a.aoPreSearchCols.length;b++)Ha(a,i[b].sSearch,b,i[b].bRegex,i[b].bSmart,i[b].bCaseInsensitive);Ia(a)}a.bFiltered=!0;h(a.oInstance).trigger("filter",a);a._iDisplayStart=0;y(a);x(a);la(a,0)}function Ia(a){for(var b=j.ext.afnFiltering,c=r(a,"bSearchable"),d=0,i=b.length;d<i;d++)for(var f=0,g=0,e=a.aiDisplay.length;g<e;g++){var h=a.aiDisplay[g-f];b[d](a,Y(a,h,"filter",c),h)||(a.aiDisplay.splice(g-f,1),f++)}}function Ha(a,b,c,
    +d,i,f){if(""!==b)for(var g=0,b=ma(b,d,i,f),d=a.aiDisplay.length-1;0<=d;d--)i=Ja(v(a,a.aiDisplay[d],c,"filter"),a.aoColumns[c].sType),b.test(i)||(a.aiDisplay.splice(d,1),g++)}function Ga(a,b,c,d,i,f){d=ma(b,d,i,f);i=a.oPreviousSearch;c||(c=0);0!==j.ext.afnFiltering.length&&(c=1);if(0>=b.length)a.aiDisplay.splice(0,a.aiDisplay.length),a.aiDisplay=a.aiDisplayMaster.slice();else if(a.aiDisplay.length==a.aiDisplayMaster.length||i.sSearch.length>b.length||1==c||0!==b.indexOf(i.sSearch)){a.aiDisplay.splice(0,
    +a.aiDisplay.length);la(a,1);for(b=0;b<a.aiDisplayMaster.length;b++)d.test(a.asDataSearch[b])&&a.aiDisplay.push(a.aiDisplayMaster[b])}else for(b=c=0;b<a.asDataSearch.length;b++)d.test(a.asDataSearch[b])||(a.aiDisplay.splice(b-c,1),c++)}function la(a,b){if(!a.oFeatures.bServerSide){a.asDataSearch=[];for(var c=r(a,"bSearchable"),d=1===b?a.aiDisplayMaster:a.aiDisplay,i=0,f=d.length;i<f;i++)a.asDataSearch[i]=na(a,Y(a,d[i],"filter",c))}}function na(a,b){var c=b.join("  ");-1!==c.indexOf("&")&&(c=h("<div>").html(c).text());
    +return c.replace(/[\n\r]/g," ")}function ma(a,b,c,d){if(c)return a=b?a.split(" "):oa(a).split(" "),a="^(?=.*?"+a.join(")(?=.*?")+").*$",RegExp(a,d?"i":"");a=b?a:oa(a);return RegExp(a,d?"i":"")}function Ja(a,b){return"function"===typeof j.ext.ofnSearch[b]?j.ext.ofnSearch[b](a):null===a?"":"html"==b?a.replace(/[\r\n]/g," ").replace(/<.*?>/g,""):"string"===typeof a?a.replace(/[\r\n]/g," "):a}function oa(a){return a.replace(RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),
    +"\\$1")}function Ca(a){var b=l.createElement("div");b.className=a.oClasses.sInfo;a.aanFeatures.i||(a.aoDrawCallback.push({fn:Ka,sName:"information"}),b.id=a.sTableId+"_info");a.nTable.setAttribute("aria-describedby",a.sTableId+"_info");return b}function Ka(a){if(a.oFeatures.bInfo&&0!==a.aanFeatures.i.length){var b=a.oLanguage,c=a._iDisplayStart+1,d=a.fnDisplayEnd(),i=a.fnRecordsTotal(),f=a.fnRecordsDisplay(),g;g=0===f?b.sInfoEmpty:b.sInfo;f!=i&&(g+=" "+b.sInfoFiltered);g+=b.sInfoPostFix;g=ja(a,g);
    +null!==b.fnInfoCallback&&(g=b.fnInfoCallback.call(a.oInstance,a,c,d,i,f,g));a=a.aanFeatures.i;b=0;for(c=a.length;b<c;b++)h(a[b]).html(g)}}function ja(a,b){var c=a.fnFormatNumber(a._iDisplayStart+1),d=a.fnDisplayEnd(),d=a.fnFormatNumber(d),i=a.fnRecordsDisplay(),i=a.fnFormatNumber(i),f=a.fnRecordsTotal(),f=a.fnFormatNumber(f);a.oScroll.bInfinite&&(c=a.fnFormatNumber(1));return b.replace(/_START_/g,c).replace(/_END_/g,d).replace(/_TOTAL_/g,i).replace(/_MAX_/g,f)}function ba(a){var b,c,d=a.iInitDisplayStart;
    +if(!1===a.bInitialised)setTimeout(function(){ba(a)},200);else{xa(a);va(a);W(a,a.aoHeader);a.nTFoot&&W(a,a.aoFooter);E(a,!0);a.oFeatures.bAutoWidth&&da(a);b=0;for(c=a.aoColumns.length;b<c;b++)null!==a.aoColumns[b].sWidth&&(a.aoColumns[b].nTh.style.width=q(a.aoColumns[b].sWidth));a.oFeatures.bSort?O(a):a.oFeatures.bFilter?K(a,a.oPreviousSearch):(a.aiDisplay=a.aiDisplayMaster.slice(),y(a),x(a));null!==a.sAjaxSource&&!a.oFeatures.bServerSide?(c=[],ka(a,c),a.fnServerData.call(a.oInstance,a.sAjaxSource,
    +c,function(c){var f=a.sAjaxDataProp!==""?Q(a.sAjaxDataProp)(c):c;for(b=0;b<f.length;b++)H(a,f[b]);a.iInitDisplayStart=d;if(a.oFeatures.bSort)O(a);else{a.aiDisplay=a.aiDisplayMaster.slice();y(a);x(a)}E(a,false);$(a,c)},a)):a.oFeatures.bServerSide||(E(a,!1),$(a))}}function $(a,b){a._bInitComplete=!0;A(a,"aoInitComplete","init",[a,b])}function pa(a){var b=j.defaults.oLanguage;!a.sEmptyTable&&(a.sZeroRecords&&"No data available in table"===b.sEmptyTable)&&p(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&
    +(a.sZeroRecords&&"Loading..."===b.sLoadingRecords)&&p(a,a,"sZeroRecords","sLoadingRecords")}function ya(a){if(a.oScroll.bInfinite)return null;var b='<select size="1" '+('name="'+a.sTableId+'_length"')+">",c,d,i=a.aLengthMenu;if(2==i.length&&"object"===typeof i[0]&&"object"===typeof i[1]){c=0;for(d=i[0].length;c<d;c++)b+='<option value="'+i[0][c]+'">'+i[1][c]+"</option>"}else{c=0;for(d=i.length;c<d;c++)b+='<option value="'+i[c]+'">'+i[c]+"</option>"}b+="</select>";i=l.createElement("div");a.aanFeatures.l||
    +(i.id=a.sTableId+"_length");i.className=a.oClasses.sLength;i.innerHTML="<label>"+a.oLanguage.sLengthMenu.replace("_MENU_",b)+"</label>";h('select option[value="'+a._iDisplayLength+'"]',i).attr("selected",!0);h("select",i).bind("change.DT",function(){var b=h(this).val(),i=a.aanFeatures.l;c=0;for(d=i.length;c<d;c++)i[c]!=this.parentNode&&h("select",i[c]).val(b);a._iDisplayLength=parseInt(b,10);y(a);if(a.fnDisplayEnd()==a.fnRecordsDisplay()){a._iDisplayStart=a.fnDisplayEnd()-a._iDisplayLength;if(a._iDisplayStart<
    +0)a._iDisplayStart=0}if(a._iDisplayLength==-1)a._iDisplayStart=0;x(a)});h("select",i).attr("aria-controls",a.sTableId);return i}function y(a){a._iDisplayEnd=!1===a.oFeatures.bPaginate?a.aiDisplay.length:a._iDisplayStart+a._iDisplayLength>a.aiDisplay.length||-1==a._iDisplayLength?a.aiDisplay.length:a._iDisplayStart+a._iDisplayLength}function Da(a){if(a.oScroll.bInfinite)return null;var b=l.createElement("div");b.className=a.oClasses.sPaging+a.sPaginationType;j.ext.oPagination[a.sPaginationType].fnInit(a,
    +b,function(a){y(a);x(a)});a.aanFeatures.p||a.aoDrawCallback.push({fn:function(a){j.ext.oPagination[a.sPaginationType].fnUpdate(a,function(a){y(a);x(a)})},sName:"pagination"});return b}function qa(a,b){var c=a._iDisplayStart;if("number"===typeof b)a._iDisplayStart=b*a._iDisplayLength,a._iDisplayStart>a.fnRecordsDisplay()&&(a._iDisplayStart=0);else if("first"==b)a._iDisplayStart=0;else if("previous"==b)a._iDisplayStart=0<=a._iDisplayLength?a._iDisplayStart-a._iDisplayLength:0,0>a._iDisplayStart&&(a._iDisplayStart=
    +0);else if("next"==b)0<=a._iDisplayLength?a._iDisplayStart+a._iDisplayLength<a.fnRecordsDisplay()&&(a._iDisplayStart+=a._iDisplayLength):a._iDisplayStart=0;else if("last"==b)if(0<=a._iDisplayLength){var d=parseInt((a.fnRecordsDisplay()-1)/a._iDisplayLength,10)+1;a._iDisplayStart=(d-1)*a._iDisplayLength}else a._iDisplayStart=0;else D(a,0,"Unknown paging action: "+b);h(a.oInstance).trigger("page",a);return c!=a._iDisplayStart}function Aa(a){var b=l.createElement("div");a.aanFeatures.r||(b.id=a.sTableId+
    +"_processing");b.innerHTML=a.oLanguage.sProcessing;b.className=a.oClasses.sProcessing;a.nTable.parentNode.insertBefore(b,a.nTable);return b}function E(a,b){if(a.oFeatures.bProcessing)for(var c=a.aanFeatures.r,d=0,i=c.length;d<i;d++)c[d].style.visibility=b?"visible":"hidden";h(a.oInstance).trigger("processing",[a,b])}function Ba(a){if(""===a.oScroll.sX&&""===a.oScroll.sY)return a.nTable;var b=l.createElement("div"),c=l.createElement("div"),d=l.createElement("div"),i=l.createElement("div"),f=l.createElement("div"),
    +g=l.createElement("div"),e=a.nTable.cloneNode(!1),j=a.nTable.cloneNode(!1),o=a.nTable.getElementsByTagName("thead")[0],k=0===a.nTable.getElementsByTagName("tfoot").length?null:a.nTable.getElementsByTagName("tfoot")[0],m=a.oClasses;c.appendChild(d);f.appendChild(g);i.appendChild(a.nTable);b.appendChild(c);b.appendChild(i);d.appendChild(e);e.appendChild(o);null!==k&&(b.appendChild(f),g.appendChild(j),j.appendChild(k));b.className=m.sScrollWrapper;c.className=m.sScrollHead;d.className=m.sScrollHeadInner;
    +i.className=m.sScrollBody;f.className=m.sScrollFoot;g.className=m.sScrollFootInner;a.oScroll.bAutoCss&&(c.style.overflow="hidden",c.style.position="relative",f.style.overflow="hidden",i.style.overflow="auto");c.style.border="0";c.style.width="100%";f.style.border="0";d.style.width=""!==a.oScroll.sXInner?a.oScroll.sXInner:"100%";e.removeAttribute("id");e.style.marginLeft="0";a.nTable.style.marginLeft="0";null!==k&&(j.removeAttribute("id"),j.style.marginLeft="0");d=h(a.nTable).children("caption");0<
    +d.length&&(d=d[0],"top"===d._captionSide?e.appendChild(d):"bottom"===d._captionSide&&k&&j.appendChild(d));""!==a.oScroll.sX&&(c.style.width=q(a.oScroll.sX),i.style.width=q(a.oScroll.sX),null!==k&&(f.style.width=q(a.oScroll.sX)),h(i).scroll(function(){c.scrollLeft=this.scrollLeft;if(k!==null)f.scrollLeft=this.scrollLeft}));""!==a.oScroll.sY&&(i.style.height=q(a.oScroll.sY));a.aoDrawCallback.push({fn:La,sName:"scrolling"});a.oScroll.bInfinite&&h(i).scroll(function(){if(!a.bDrawing&&h(this).scrollTop()!==
    +0&&h(this).scrollTop()+h(this).height()>h(a.nTable).height()-a.oScroll.iLoadGap&&a.fnDisplayEnd()<a.fnRecordsDisplay()){qa(a,"next");y(a);x(a)}});a.nScrollHead=c;a.nScrollFoot=f;return b}function La(a){var b=a.nScrollHead.getElementsByTagName("div")[0],c=b.getElementsByTagName("table")[0],d=a.nTable.parentNode,i,f,g,e,j,o,k,m,p=[],n=[],l=null!==a.nTFoot?a.nScrollFoot.getElementsByTagName("div")[0]:null,R=null!==a.nTFoot?l.getElementsByTagName("table")[0]:null,r=a.oBrowser.bScrollOversize,s=function(a){k=
    +a.style;k.paddingTop="0";k.paddingBottom="0";k.borderTopWidth="0";k.borderBottomWidth="0";k.height=0};h(a.nTable).children("thead, tfoot").remove();i=h(a.nTHead).clone()[0];a.nTable.insertBefore(i,a.nTable.childNodes[0]);g=a.nTHead.getElementsByTagName("tr");e=i.getElementsByTagName("tr");null!==a.nTFoot&&(j=h(a.nTFoot).clone()[0],a.nTable.insertBefore(j,a.nTable.childNodes[1]),o=a.nTFoot.getElementsByTagName("tr"),j=j.getElementsByTagName("tr"));""===a.oScroll.sX&&(d.style.width="100%",b.parentNode.style.width=
    +"100%");var t=N(a,i);i=0;for(f=t.length;i<f;i++)m=G(a,i),t[i].style.width=a.aoColumns[m].sWidth;null!==a.nTFoot&&C(function(a){a.style.width=""},j);a.oScroll.bCollapse&&""!==a.oScroll.sY&&(d.style.height=d.offsetHeight+a.nTHead.offsetHeight+"px");i=h(a.nTable).outerWidth();if(""===a.oScroll.sX){if(a.nTable.style.width="100%",r&&(h("tbody",d).height()>d.offsetHeight||"scroll"==h(d).css("overflow-y")))a.nTable.style.width=q(h(a.nTable).outerWidth()-a.oScroll.iBarWidth)}else""!==a.oScroll.sXInner?a.nTable.style.width=
    +q(a.oScroll.sXInner):i==h(d).width()&&h(d).height()<h(a.nTable).height()?(a.nTable.style.width=q(i-a.oScroll.iBarWidth),h(a.nTable).outerWidth()>i-a.oScroll.iBarWidth&&(a.nTable.style.width=q(i))):a.nTable.style.width=q(i);i=h(a.nTable).outerWidth();C(s,e);C(function(a){p.push(q(h(a).width()))},e);C(function(a,b){a.style.width=p[b]},g);h(e).height(0);null!==a.nTFoot&&(C(s,j),C(function(a){n.push(q(h(a).width()))},j),C(function(a,b){a.style.width=n[b]},o),h(j).height(0));C(function(a,b){a.innerHTML=
    +"";a.style.width=p[b]},e);null!==a.nTFoot&&C(function(a,b){a.innerHTML="";a.style.width=n[b]},j);if(h(a.nTable).outerWidth()<i){g=d.scrollHeight>d.offsetHeight||"scroll"==h(d).css("overflow-y")?i+a.oScroll.iBarWidth:i;if(r&&(d.scrollHeight>d.offsetHeight||"scroll"==h(d).css("overflow-y")))a.nTable.style.width=q(g-a.oScroll.iBarWidth);d.style.width=q(g);a.nScrollHead.style.width=q(g);null!==a.nTFoot&&(a.nScrollFoot.style.width=q(g));""===a.oScroll.sX?D(a,1,"The table cannot fit into the current element which will cause column misalignment. The table has been drawn at its minimum possible width."):
    +""!==a.oScroll.sXInner&&D(a,1,"The table cannot fit into the current element which will cause column misalignment. Increase the sScrollXInner value or remove it to allow automatic calculation")}else d.style.width=q("100%"),a.nScrollHead.style.width=q("100%"),null!==a.nTFoot&&(a.nScrollFoot.style.width=q("100%"));""===a.oScroll.sY&&r&&(d.style.height=q(a.nTable.offsetHeight+a.oScroll.iBarWidth));""!==a.oScroll.sY&&a.oScroll.bCollapse&&(d.style.height=q(a.oScroll.sY),r=""!==a.oScroll.sX&&a.nTable.offsetWidth>
    +d.offsetWidth?a.oScroll.iBarWidth:0,a.nTable.offsetHeight<d.offsetHeight&&(d.style.height=q(a.nTable.offsetHeight+r)));r=h(a.nTable).outerWidth();c.style.width=q(r);b.style.width=q(r);c=h(a.nTable).height()>d.clientHeight||"scroll"==h(d).css("overflow-y");b.style.paddingRight=c?a.oScroll.iBarWidth+"px":"0px";null!==a.nTFoot&&(R.style.width=q(r),l.style.width=q(r),l.style.paddingRight=c?a.oScroll.iBarWidth+"px":"0px");h(d).scroll();if(a.bSorted||a.bFiltered)d.scrollTop=0}function C(a,b,c){for(var d=
    +0,i=0,f=b.length,g,e;i<f;){g=b[i].firstChild;for(e=c?c[i].firstChild:null;g;)1===g.nodeType&&(c?a(g,e,d):a(g,d),d++),g=g.nextSibling,e=c?e.nextSibling:null;i++}}function Ma(a,b){if(!a||null===a||""===a)return 0;b||(b=l.body);var c,d=l.createElement("div");d.style.width=q(a);b.appendChild(d);c=d.offsetWidth;b.removeChild(d);return c}function da(a){var b=0,c,d=0,i=a.aoColumns.length,f,e,j=h("th",a.nTHead),o=a.nTable.getAttribute("width");e=a.nTable.parentNode;for(f=0;f<i;f++)a.aoColumns[f].bVisible&&
    +(d++,null!==a.aoColumns[f].sWidth&&(c=Ma(a.aoColumns[f].sWidthOrig,e),null!==c&&(a.aoColumns[f].sWidth=q(c)),b++));if(i==j.length&&0===b&&d==i&&""===a.oScroll.sX&&""===a.oScroll.sY)for(f=0;f<a.aoColumns.length;f++)c=h(j[f]).width(),null!==c&&(a.aoColumns[f].sWidth=q(c));else{b=a.nTable.cloneNode(!1);f=a.nTHead.cloneNode(!0);d=l.createElement("tbody");c=l.createElement("tr");b.removeAttribute("id");b.appendChild(f);null!==a.nTFoot&&(b.appendChild(a.nTFoot.cloneNode(!0)),C(function(a){a.style.width=
    +""},b.getElementsByTagName("tr")));b.appendChild(d);d.appendChild(c);d=h("thead th",b);0===d.length&&(d=h("tbody tr:eq(0)>td",b));j=N(a,f);for(f=d=0;f<i;f++){var k=a.aoColumns[f];k.bVisible&&null!==k.sWidthOrig&&""!==k.sWidthOrig?j[f-d].style.width=q(k.sWidthOrig):k.bVisible?j[f-d].style.width="":d++}for(f=0;f<i;f++)a.aoColumns[f].bVisible&&(d=Na(a,f),null!==d&&(d=d.cloneNode(!0),""!==a.aoColumns[f].sContentPadding&&(d.innerHTML+=a.aoColumns[f].sContentPadding),c.appendChild(d)));e.appendChild(b);
    +""!==a.oScroll.sX&&""!==a.oScroll.sXInner?b.style.width=q(a.oScroll.sXInner):""!==a.oScroll.sX?(b.style.width="",h(b).width()<e.offsetWidth&&(b.style.width=q(e.offsetWidth))):""!==a.oScroll.sY?b.style.width=q(e.offsetWidth):o&&(b.style.width=q(o));b.style.visibility="hidden";Oa(a,b);i=h("tbody tr:eq(0)",b).children();0===i.length&&(i=N(a,h("thead",b)[0]));if(""!==a.oScroll.sX){for(f=d=e=0;f<a.aoColumns.length;f++)a.aoColumns[f].bVisible&&(e=null===a.aoColumns[f].sWidthOrig?e+h(i[d]).outerWidth():
    +e+(parseInt(a.aoColumns[f].sWidth.replace("px",""),10)+(h(i[d]).outerWidth()-h(i[d]).width())),d++);b.style.width=q(e);a.nTable.style.width=q(e)}for(f=d=0;f<a.aoColumns.length;f++)a.aoColumns[f].bVisible&&(e=h(i[d]).width(),null!==e&&0<e&&(a.aoColumns[f].sWidth=q(e)),d++);i=h(b).css("width");a.nTable.style.width=-1!==i.indexOf("%")?i:q(h(b).outerWidth());b.parentNode.removeChild(b)}o&&(a.nTable.style.width=q(o))}function Oa(a,b){""===a.oScroll.sX&&""!==a.oScroll.sY?(h(b).width(),b.style.width=q(h(b).outerWidth()-
    +a.oScroll.iBarWidth)):""!==a.oScroll.sX&&(b.style.width=q(h(b).outerWidth()))}function Na(a,b){var c=Pa(a,b);if(0>c)return null;if(null===a.aoData[c].nTr){var d=l.createElement("td");d.innerHTML=v(a,c,b,"");return d}return J(a,c)[b]}function Pa(a,b){for(var c=-1,d=-1,i=0;i<a.aoData.length;i++){var e=v(a,i,b,"display")+"",e=e.replace(/<.*?>/g,"");e.length>c&&(c=e.length,d=i)}return d}function q(a){if(null===a)return"0px";if("number"==typeof a)return 0>a?"0px":a+"px";var b=a.charCodeAt(a.length-1);
    +return 48>b||57<b?a:a+"px"}function Qa(){var a=l.createElement("p"),b=a.style;b.width="100%";b.height="200px";b.padding="0px";var c=l.createElement("div"),b=c.style;b.position="absolute";b.top="0px";b.left="0px";b.visibility="hidden";b.width="200px";b.height="150px";b.padding="0px";b.overflow="hidden";c.appendChild(a);l.body.appendChild(c);b=a.offsetWidth;c.style.overflow="scroll";a=a.offsetWidth;b==a&&(a=c.clientWidth);l.body.removeChild(c);return b-a}function O(a,b){var c,d,i,e,g,k,o=[],m=[],p=
    +j.ext.oSort,l=a.aoData,q=a.aoColumns,G=a.oLanguage.oAria;if(!a.oFeatures.bServerSide&&(0!==a.aaSorting.length||null!==a.aaSortingFixed)){o=null!==a.aaSortingFixed?a.aaSortingFixed.concat(a.aaSorting):a.aaSorting.slice();for(c=0;c<o.length;c++)if(d=o[c][0],i=R(a,d),e=a.aoColumns[d].sSortDataType,j.ext.afnSortData[e])if(g=j.ext.afnSortData[e].call(a.oInstance,a,d,i),g.length===l.length){i=0;for(e=l.length;i<e;i++)F(a,i,d,g[i])}else D(a,0,"Returned data sort array (col "+d+") is the wrong length");c=
    +0;for(d=a.aiDisplayMaster.length;c<d;c++)m[a.aiDisplayMaster[c]]=c;var r=o.length,s;c=0;for(d=l.length;c<d;c++)for(i=0;i<r;i++){s=q[o[i][0]].aDataSort;g=0;for(k=s.length;g<k;g++)e=q[s[g]].sType,e=p[(e?e:"string")+"-pre"],l[c]._aSortData[s[g]]=e?e(v(a,c,s[g],"sort")):v(a,c,s[g],"sort")}a.aiDisplayMaster.sort(function(a,b){var c,d,e,i,f;for(c=0;c<r;c++){f=q[o[c][0]].aDataSort;d=0;for(e=f.length;d<e;d++)if(i=q[f[d]].sType,i=p[(i?i:"string")+"-"+o[c][1]](l[a]._aSortData[f[d]],l[b]._aSortData[f[d]]),0!==
    +i)return i}return p["numeric-asc"](m[a],m[b])})}(b===n||b)&&!a.oFeatures.bDeferRender&&P(a);c=0;for(d=a.aoColumns.length;c<d;c++)e=q[c].sTitle.replace(/<.*?>/g,""),i=q[c].nTh,i.removeAttribute("aria-sort"),i.removeAttribute("aria-label"),q[c].bSortable?0<o.length&&o[0][0]==c?(i.setAttribute("aria-sort","asc"==o[0][1]?"ascending":"descending"),i.setAttribute("aria-label",e+("asc"==(q[c].asSorting[o[0][2]+1]?q[c].asSorting[o[0][2]+1]:q[c].asSorting[0])?G.sSortAscending:G.sSortDescending))):i.setAttribute("aria-label",
    +e+("asc"==q[c].asSorting[0]?G.sSortAscending:G.sSortDescending)):i.setAttribute("aria-label",e);a.bSorted=!0;h(a.oInstance).trigger("sort",a);a.oFeatures.bFilter?K(a,a.oPreviousSearch,1):(a.aiDisplay=a.aiDisplayMaster.slice(),a._iDisplayStart=0,y(a),x(a))}function ia(a,b,c,d){Ra(b,{},function(b){if(!1!==a.aoColumns[c].bSortable){var e=function(){var d,e;if(b.shiftKey){for(var f=!1,h=0;h<a.aaSorting.length;h++)if(a.aaSorting[h][0]==c){f=!0;d=a.aaSorting[h][0];e=a.aaSorting[h][2]+1;a.aoColumns[d].asSorting[e]?
    +(a.aaSorting[h][1]=a.aoColumns[d].asSorting[e],a.aaSorting[h][2]=e):a.aaSorting.splice(h,1);break}!1===f&&a.aaSorting.push([c,a.aoColumns[c].asSorting[0],0])}else 1==a.aaSorting.length&&a.aaSorting[0][0]==c?(d=a.aaSorting[0][0],e=a.aaSorting[0][2]+1,a.aoColumns[d].asSorting[e]||(e=0),a.aaSorting[0][1]=a.aoColumns[d].asSorting[e],a.aaSorting[0][2]=e):(a.aaSorting.splice(0,a.aaSorting.length),a.aaSorting.push([c,a.aoColumns[c].asSorting[0],0]));O(a)};a.oFeatures.bProcessing?(E(a,!0),setTimeout(function(){e();
    +a.oFeatures.bServerSide||E(a,!1)},0)):e();"function"==typeof d&&d(a)}})}function P(a){var b,c,d,e,f,g=a.aoColumns.length,j=a.oClasses;for(b=0;b<g;b++)a.aoColumns[b].bSortable&&h(a.aoColumns[b].nTh).removeClass(j.sSortAsc+" "+j.sSortDesc+" "+a.aoColumns[b].sSortingClass);c=null!==a.aaSortingFixed?a.aaSortingFixed.concat(a.aaSorting):a.aaSorting.slice();for(b=0;b<a.aoColumns.length;b++)if(a.aoColumns[b].bSortable){f=a.aoColumns[b].sSortingClass;e=-1;for(d=0;d<c.length;d++)if(c[d][0]==b){f="asc"==c[d][1]?
    +j.sSortAsc:j.sSortDesc;e=d;break}h(a.aoColumns[b].nTh).addClass(f);a.bJUI&&(f=h("span."+j.sSortIcon,a.aoColumns[b].nTh),f.removeClass(j.sSortJUIAsc+" "+j.sSortJUIDesc+" "+j.sSortJUI+" "+j.sSortJUIAscAllowed+" "+j.sSortJUIDescAllowed),f.addClass(-1==e?a.aoColumns[b].sSortingClassJUI:"asc"==c[e][1]?j.sSortJUIAsc:j.sSortJUIDesc))}else h(a.aoColumns[b].nTh).addClass(a.aoColumns[b].sSortingClass);f=j.sSortColumn;if(a.oFeatures.bSort&&a.oFeatures.bSortClasses){a=J(a);e=[];for(b=0;b<g;b++)e.push("");b=0;
    +for(d=1;b<c.length;b++)j=parseInt(c[b][0],10),e[j]=f+d,3>d&&d++;f=RegExp(f+"[123]");var o;b=0;for(c=a.length;b<c;b++)j=b%g,d=a[b].className,o=e[j],j=d.replace(f,o),j!=d?a[b].className=h.trim(j):0<o.length&&-1==d.indexOf(o)&&(a[b].className=d+" "+o)}}function ra(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b,c;b=a.oScroll.bInfinite;var d={iCreate:(new Date).getTime(),iStart:b?0:a._iDisplayStart,iEnd:b?a._iDisplayLength:a._iDisplayEnd,iLength:a._iDisplayLength,aaSorting:h.extend(!0,[],a.aaSorting),
    +oSearch:h.extend(!0,{},a.oPreviousSearch),aoSearchCols:h.extend(!0,[],a.aoPreSearchCols),abVisCols:[]};b=0;for(c=a.aoColumns.length;b<c;b++)d.abVisCols.push(a.aoColumns[b].bVisible);A(a,"aoStateSaveParams","stateSaveParams",[a,d]);a.fnStateSave.call(a.oInstance,a,d)}}function Sa(a,b){if(a.oFeatures.bStateSave){var c=a.fnStateLoad.call(a.oInstance,a);if(c){var d=A(a,"aoStateLoadParams","stateLoadParams",[a,c]);if(-1===h.inArray(!1,d)){a.oLoadedState=h.extend(!0,{},c);a._iDisplayStart=c.iStart;a.iInitDisplayStart=
    +c.iStart;a._iDisplayEnd=c.iEnd;a._iDisplayLength=c.iLength;a.aaSorting=c.aaSorting.slice();a.saved_aaSorting=c.aaSorting.slice();h.extend(a.oPreviousSearch,c.oSearch);h.extend(!0,a.aoPreSearchCols,c.aoSearchCols);b.saved_aoColumns=[];for(d=0;d<c.abVisCols.length;d++)b.saved_aoColumns[d]={},b.saved_aoColumns[d].bVisible=c.abVisCols[d];A(a,"aoStateLoaded","stateLoaded",[a,c])}}}}function s(a){for(var b=0;b<j.settings.length;b++)if(j.settings[b].nTable===a)return j.settings[b];return null}function T(a){for(var b=
    +[],a=a.aoData,c=0,d=a.length;c<d;c++)null!==a[c].nTr&&b.push(a[c].nTr);return b}function J(a,b){var c=[],d,e,f,g,h,j;e=0;var o=a.aoData.length;b!==n&&(e=b,o=b+1);for(f=e;f<o;f++)if(j=a.aoData[f],null!==j.nTr){e=[];for(d=j.nTr.firstChild;d;)g=d.nodeName.toLowerCase(),("td"==g||"th"==g)&&e.push(d),d=d.nextSibling;g=d=0;for(h=a.aoColumns.length;g<h;g++)a.aoColumns[g].bVisible?c.push(e[g-d]):(c.push(j._anHidden[g]),d++)}return c}function D(a,b,c){a=null===a?"DataTables warning: "+c:"DataTables warning (table id = '"+
    +a.sTableId+"'): "+c;if(0===b)if("alert"==j.ext.sErrMode)alert(a);else throw Error(a);else X.console&&console.log&&console.log(a)}function p(a,b,c,d){d===n&&(d=c);b[c]!==n&&(a[d]=b[c])}function Ta(a,b){var c,d;for(d in b)b.hasOwnProperty(d)&&(c=b[d],"object"===typeof e[d]&&null!==c&&!1===h.isArray(c)?h.extend(!0,a[d],c):a[d]=c);return a}function Ra(a,b,c){h(a).bind("click.DT",b,function(b){a.blur();c(b)}).bind("keypress.DT",b,function(a){13===a.which&&c(a)}).bind("selectstart.DT",function(){return!1})}
    +function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function A(a,b,c,d){for(var b=a[b],e=[],f=b.length-1;0<=f;f--)e.push(b[f].fn.apply(a.oInstance,d));null!==c&&h(a.oInstance).trigger(c,d);return e}function Ua(a){var b=h('<div style="position:absolute; top:0; left:0; height:1px; width:1px; overflow:hidden"><div style="position:absolute; top:1px; left:1px; width:100px; overflow:scroll;"><div id="DT_BrowserTest" style="width:100%; height:10px;"></div></div></div>')[0];l.body.appendChild(b);a.oBrowser.bScrollOversize=
    +100===h("#DT_BrowserTest",b)[0].offsetWidth?!0:!1;l.body.removeChild(b)}function Va(a){return function(){var b=[s(this[j.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return j.ext.oApi[a].apply(this,b)}}var U=/\[.*?\]$/,Wa=X.JSON?JSON.stringify:function(a){var b=typeof a;if("object"!==b||null===a)return"string"===b&&(a='"'+a+'"'),a+"";var c,d,e=[],f=h.isArray(a);for(c in a)d=a[c],b=typeof d,"string"===b?d='"'+d+'"':"object"===b&&null!==d&&(d=Wa(d)),e.push((f?"":'"'+c+'":')+d);return(f?
    +"[":"{")+e+(f?"]":"}")};this.$=function(a,b){var c,d,e=[],f;d=s(this[j.ext.iApiIndex]);var g=d.aoData,o=d.aiDisplay,k=d.aiDisplayMaster;b||(b={});b=h.extend({},{filter:"none",order:"current",page:"all"},b);if("current"==b.page){c=d._iDisplayStart;for(d=d.fnDisplayEnd();c<d;c++)(f=g[o[c]].nTr)&&e.push(f)}else if("current"==b.order&&"none"==b.filter){c=0;for(d=k.length;c<d;c++)(f=g[k[c]].nTr)&&e.push(f)}else if("current"==b.order&&"applied"==b.filter){c=0;for(d=o.length;c<d;c++)(f=g[o[c]].nTr)&&e.push(f)}else if("original"==
    +b.order&&"none"==b.filter){c=0;for(d=g.length;c<d;c++)(f=g[c].nTr)&&e.push(f)}else if("original"==b.order&&"applied"==b.filter){c=0;for(d=g.length;c<d;c++)f=g[c].nTr,-1!==h.inArray(c,o)&&f&&e.push(f)}else D(d,1,"Unknown selection options");e=h(e);c=e.filter(a);e=e.find(a);return h([].concat(h.makeArray(c),h.makeArray(e)))};this._=function(a,b){var c=[],d,e,f=this.$(a,b);d=0;for(e=f.length;d<e;d++)c.push(this.fnGetData(f[d]));return c};this.fnAddData=function(a,b){if(0===a.length)return[];var c=[],
    +d,e=s(this[j.ext.iApiIndex]);if("object"===typeof a[0]&&null!==a[0])for(var f=0;f<a.length;f++){d=H(e,a[f]);if(-1==d)return c;c.push(d)}else{d=H(e,a);if(-1==d)return c;c.push(d)}e.aiDisplay=e.aiDisplayMaster.slice();(b===n||b)&&aa(e);return c};this.fnAdjustColumnSizing=function(a){var b=s(this[j.ext.iApiIndex]);k(b);a===n||a?this.fnDraw(!1):(""!==b.oScroll.sX||""!==b.oScroll.sY)&&this.oApi._fnScrollDraw(b)};this.fnClearTable=function(a){var b=s(this[j.ext.iApiIndex]);ga(b);(a===n||a)&&x(b)};this.fnClose=
    +function(a){for(var b=s(this[j.ext.iApiIndex]),c=0;c<b.aoOpenRows.length;c++)if(b.aoOpenRows[c].nParent==a)return(a=b.aoOpenRows[c].nTr.parentNode)&&a.removeChild(b.aoOpenRows[c].nTr),b.aoOpenRows.splice(c,1),0;return 1};this.fnDeleteRow=function(a,b,c){var d=s(this[j.ext.iApiIndex]),e,f,a="object"===typeof a?I(d,a):a,g=d.aoData.splice(a,1);e=0;for(f=d.aoData.length;e<f;e++)null!==d.aoData[e].nTr&&(d.aoData[e].nTr._DT_RowIndex=e);e=h.inArray(a,d.aiDisplay);d.asDataSearch.splice(e,1);ha(d.aiDisplayMaster,
    +a);ha(d.aiDisplay,a);"function"===typeof b&&b.call(this,d,g);d._iDisplayStart>=d.fnRecordsDisplay()&&(d._iDisplayStart-=d._iDisplayLength,0>d._iDisplayStart&&(d._iDisplayStart=0));if(c===n||c)y(d),x(d);return g};this.fnDestroy=function(a){var b=s(this[j.ext.iApiIndex]),c=b.nTableWrapper.parentNode,d=b.nTBody,i,f,a=a===n?!1:a;b.bDestroying=!0;A(b,"aoDestroyCallback","destroy",[b]);if(!a){i=0;for(f=b.aoColumns.length;i<f;i++)!1===b.aoColumns[i].bVisible&&this.fnSetColumnVis(i,!0)}h(b.nTableWrapper).find("*").andSelf().unbind(".DT");
    +h("tbody>tr>td."+b.oClasses.sRowEmpty,b.nTable).parent().remove();b.nTable!=b.nTHead.parentNode&&(h(b.nTable).children("thead").remove(),b.nTable.appendChild(b.nTHead));b.nTFoot&&b.nTable!=b.nTFoot.parentNode&&(h(b.nTable).children("tfoot").remove(),b.nTable.appendChild(b.nTFoot));b.nTable.parentNode.removeChild(b.nTable);h(b.nTableWrapper).remove();b.aaSorting=[];b.aaSortingFixed=[];P(b);h(T(b)).removeClass(b.asStripeClasses.join(" "));h("th, td",b.nTHead).removeClass([b.oClasses.sSortable,b.oClasses.sSortableAsc,
    +b.oClasses.sSortableDesc,b.oClasses.sSortableNone].join(" "));b.bJUI&&(h("th span."+b.oClasses.sSortIcon+", td span."+b.oClasses.sSortIcon,b.nTHead).remove(),h("th, td",b.nTHead).each(function(){var a=h("div."+b.oClasses.sSortJUIWrapper,this),c=a.contents();h(this).append(c);a.remove()}));!a&&b.nTableReinsertBefore?c.insertBefore(b.nTable,b.nTableReinsertBefore):a||c.appendChild(b.nTable);i=0;for(f=b.aoData.length;i<f;i++)null!==b.aoData[i].nTr&&d.appendChild(b.aoData[i].nTr);!0===b.oFeatures.bAutoWidth&&
    +(b.nTable.style.width=q(b.sDestroyWidth));if(f=b.asDestroyStripes.length){a=h(d).children("tr");for(i=0;i<f;i++)a.filter(":nth-child("+f+"n + "+i+")").addClass(b.asDestroyStripes[i])}i=0;for(f=j.settings.length;i<f;i++)j.settings[i]==b&&j.settings.splice(i,1);e=b=null};this.fnDraw=function(a){var b=s(this[j.ext.iApiIndex]);!1===a?(y(b),x(b)):aa(b)};this.fnFilter=function(a,b,c,d,e,f){var g=s(this[j.ext.iApiIndex]);if(g.oFeatures.bFilter){if(c===n||null===c)c=!1;if(d===n||null===d)d=!0;if(e===n||null===
    +e)e=!0;if(f===n||null===f)f=!0;if(b===n||null===b){if(K(g,{sSearch:a+"",bRegex:c,bSmart:d,bCaseInsensitive:f},1),e&&g.aanFeatures.f){b=g.aanFeatures.f;c=0;for(d=b.length;c<d;c++)try{b[c]._DT_Input!=l.activeElement&&h(b[c]._DT_Input).val(a)}catch(o){h(b[c]._DT_Input).val(a)}}}else h.extend(g.aoPreSearchCols[b],{sSearch:a+"",bRegex:c,bSmart:d,bCaseInsensitive:f}),K(g,g.oPreviousSearch,1)}};this.fnGetData=function(a,b){var c=s(this[j.ext.iApiIndex]);if(a!==n){var d=a;if("object"===typeof a){var e=a.nodeName.toLowerCase();
    +"tr"===e?d=I(c,a):"td"===e&&(d=I(c,a.parentNode),b=fa(c,d,a))}return b!==n?v(c,d,b,""):c.aoData[d]!==n?c.aoData[d]._aData:null}return Z(c)};this.fnGetNodes=function(a){var b=s(this[j.ext.iApiIndex]);return a!==n?b.aoData[a]!==n?b.aoData[a].nTr:null:T(b)};this.fnGetPosition=function(a){var b=s(this[j.ext.iApiIndex]),c=a.nodeName.toUpperCase();return"TR"==c?I(b,a):"TD"==c||"TH"==c?(c=I(b,a.parentNode),a=fa(b,c,a),[c,R(b,a),a]):null};this.fnIsOpen=function(a){for(var b=s(this[j.ext.iApiIndex]),c=0;c<
    +b.aoOpenRows.length;c++)if(b.aoOpenRows[c].nParent==a)return!0;return!1};this.fnOpen=function(a,b,c){var d=s(this[j.ext.iApiIndex]),e=T(d);if(-1!==h.inArray(a,e)){this.fnClose(a);var e=l.createElement("tr"),f=l.createElement("td");e.appendChild(f);f.className=c;f.colSpan=t(d);"string"===typeof b?f.innerHTML=b:h(f).html(b);b=h("tr",d.nTBody);-1!=h.inArray(a,b)&&h(e).insertAfter(a);d.aoOpenRows.push({nTr:e,nParent:a});return e}};this.fnPageChange=function(a,b){var c=s(this[j.ext.iApiIndex]);qa(c,a);
    +y(c);(b===n||b)&&x(c)};this.fnSetColumnVis=function(a,b,c){var d=s(this[j.ext.iApiIndex]),e,f,g=d.aoColumns,h=d.aoData,o,m;if(g[a].bVisible!=b){if(b){for(e=f=0;e<a;e++)g[e].bVisible&&f++;m=f>=t(d);if(!m)for(e=a;e<g.length;e++)if(g[e].bVisible){o=e;break}e=0;for(f=h.length;e<f;e++)null!==h[e].nTr&&(m?h[e].nTr.appendChild(h[e]._anHidden[a]):h[e].nTr.insertBefore(h[e]._anHidden[a],J(d,e)[o]))}else{e=0;for(f=h.length;e<f;e++)null!==h[e].nTr&&(o=J(d,e)[a],h[e]._anHidden[a]=o,o.parentNode.removeChild(o))}g[a].bVisible=
    +b;W(d,d.aoHeader);d.nTFoot&&W(d,d.aoFooter);e=0;for(f=d.aoOpenRows.length;e<f;e++)d.aoOpenRows[e].nTr.colSpan=t(d);if(c===n||c)k(d),x(d);ra(d)}};this.fnSettings=function(){return s(this[j.ext.iApiIndex])};this.fnSort=function(a){var b=s(this[j.ext.iApiIndex]);b.aaSorting=a;O(b)};this.fnSortListener=function(a,b,c){ia(s(this[j.ext.iApiIndex]),a,b,c)};this.fnUpdate=function(a,b,c,d,e){var f=s(this[j.ext.iApiIndex]),b="object"===typeof b?I(f,b):b;if(h.isArray(a)&&c===n){f.aoData[b]._aData=a.slice();
    +for(c=0;c<f.aoColumns.length;c++)this.fnUpdate(v(f,b,c),b,c,!1,!1)}else if(h.isPlainObject(a)&&c===n){f.aoData[b]._aData=h.extend(!0,{},a);for(c=0;c<f.aoColumns.length;c++)this.fnUpdate(v(f,b,c),b,c,!1,!1)}else{F(f,b,c,a);var a=v(f,b,c,"display"),g=f.aoColumns[c];null!==g.fnRender&&(a=S(f,b,c),g.bUseRendered&&F(f,b,c,a));null!==f.aoData[b].nTr&&(J(f,b)[c].innerHTML=a)}c=h.inArray(b,f.aiDisplay);f.asDataSearch[c]=na(f,Y(f,b,"filter",r(f,"bSearchable")));(e===n||e)&&k(f);(d===n||d)&&aa(f);return 0};
    +this.fnVersionCheck=j.ext.fnVersionCheck;this.oApi={_fnExternApiFunc:Va,_fnInitialise:ba,_fnInitComplete:$,_fnLanguageCompat:pa,_fnAddColumn:o,_fnColumnOptions:m,_fnAddData:H,_fnCreateTr:ea,_fnGatherData:ua,_fnBuildHead:va,_fnDrawHead:W,_fnDraw:x,_fnReDraw:aa,_fnAjaxUpdate:wa,_fnAjaxParameters:Ea,_fnAjaxUpdateDraw:Fa,_fnServerParams:ka,_fnAddOptionsHtml:xa,_fnFeatureHtmlTable:Ba,_fnScrollDraw:La,_fnAdjustColumnSizing:k,_fnFeatureHtmlFilter:za,_fnFilterComplete:K,_fnFilterCustom:Ia,_fnFilterColumn:Ha,
    +_fnFilter:Ga,_fnBuildSearchArray:la,_fnBuildSearchRow:na,_fnFilterCreateSearch:ma,_fnDataToSearch:Ja,_fnSort:O,_fnSortAttachListener:ia,_fnSortingClasses:P,_fnFeatureHtmlPaginate:Da,_fnPageChange:qa,_fnFeatureHtmlInfo:Ca,_fnUpdateInfo:Ka,_fnFeatureHtmlLength:ya,_fnFeatureHtmlProcessing:Aa,_fnProcessingDisplay:E,_fnVisibleToColumnIndex:G,_fnColumnIndexToVisible:R,_fnNodeToDataIndex:I,_fnVisbleColumns:t,_fnCalculateEnd:y,_fnConvertToWidth:Ma,_fnCalculateColumnWidths:da,_fnScrollingWidthAdjust:Oa,_fnGetWidestNode:Na,
    +_fnGetMaxLenString:Pa,_fnStringToCss:q,_fnDetectType:B,_fnSettingsFromNode:s,_fnGetDataMaster:Z,_fnGetTrNodes:T,_fnGetTdNodes:J,_fnEscapeRegex:oa,_fnDeleteIndex:ha,_fnReOrderIndex:u,_fnColumnOrdering:M,_fnLog:D,_fnClearTable:ga,_fnSaveState:ra,_fnLoadState:Sa,_fnCreateCookie:function(a,b,c,d,e){var f=new Date;f.setTime(f.getTime()+1E3*c);var c=X.location.pathname.split("/"),a=a+"_"+c.pop().replace(/[\/:]/g,"").toLowerCase(),g;null!==e?(g="function"===typeof h.parseJSON?h.parseJSON(b):eval("("+b+")"),
    +b=e(a,g,f.toGMTString(),c.join("/")+"/")):b=a+"="+encodeURIComponent(b)+"; expires="+f.toGMTString()+"; path="+c.join("/")+"/";a=l.cookie.split(";");e=b.split(";")[0].length;f=[];if(4096<e+l.cookie.length+10){for(var j=0,o=a.length;j<o;j++)if(-1!=a[j].indexOf(d)){var k=a[j].split("=");try{(g=eval("("+decodeURIComponent(k[1])+")"))&&g.iCreate&&f.push({name:k[0],time:g.iCreate})}catch(m){}}for(f.sort(function(a,b){return b.time-a.time});4096<e+l.cookie.length+10;){if(0===f.length)return;d=f.pop();l.cookie=
    +d.name+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+c.join("/")+"/"}}l.cookie=b},_fnReadCookie:function(a){for(var b=X.location.pathname.split("/"),a=a+"_"+b[b.length-1].replace(/[\/:]/g,"").toLowerCase()+"=",b=l.cookie.split(";"),c=0;c<b.length;c++){for(var d=b[c];" "==d.charAt(0);)d=d.substring(1,d.length);if(0===d.indexOf(a))return decodeURIComponent(d.substring(a.length,d.length))}return null},_fnDetectHeader:V,_fnGetUniqueThs:N,_fnScrollBarWidth:Qa,_fnApplyToChildren:C,_fnMap:p,_fnGetRowData:Y,
    +_fnGetCellData:v,_fnSetCellData:F,_fnGetObjectDataFn:Q,_fnSetObjectDataFn:L,_fnApplyColumnDefs:ta,_fnBindAction:Ra,_fnExtend:Ta,_fnCallbackReg:z,_fnCallbackFire:A,_fnJsonString:Wa,_fnRender:S,_fnNodeToColumnIndex:fa,_fnInfoMacros:ja,_fnBrowserDetect:Ua,_fnGetColumns:r};h.extend(j.ext.oApi,this.oApi);for(var sa in j.ext.oApi)sa&&(this[sa]=Va(sa));var ca=this;this.each(function(){var a=0,b,c,d;c=this.getAttribute("id");var i=!1,f=!1;if("table"!=this.nodeName.toLowerCase())D(null,0,"Attempted to initialise DataTables on a node which is not a table: "+
    +this.nodeName);else{a=0;for(b=j.settings.length;a<b;a++){if(j.settings[a].nTable==this){if(e===n||e.bRetrieve)return j.settings[a].oInstance;if(e.bDestroy){j.settings[a].oInstance.fnDestroy();break}else{D(j.settings[a],0,"Cannot reinitialise DataTable.\n\nTo retrieve the DataTables object for this table, pass no arguments or see the docs for bRetrieve and bDestroy");return}}if(j.settings[a].sTableId==this.id){j.settings.splice(a,1);break}}if(null===c||""===c)this.id=c="DataTables_Table_"+j.ext._oExternConfig.iNextUnique++;
    +var g=h.extend(!0,{},j.models.oSettings,{nTable:this,oApi:ca.oApi,oInit:e,sDestroyWidth:h(this).width(),sInstance:c,sTableId:c});j.settings.push(g);g.oInstance=1===ca.length?ca:h(this).dataTable();e||(e={});e.oLanguage&&pa(e.oLanguage);e=Ta(h.extend(!0,{},j.defaults),e);p(g.oFeatures,e,"bPaginate");p(g.oFeatures,e,"bLengthChange");p(g.oFeatures,e,"bFilter");p(g.oFeatures,e,"bSort");p(g.oFeatures,e,"bInfo");p(g.oFeatures,e,"bProcessing");p(g.oFeatures,e,"bAutoWidth");p(g.oFeatures,e,"bSortClasses");
    +p(g.oFeatures,e,"bServerSide");p(g.oFeatures,e,"bDeferRender");p(g.oScroll,e,"sScrollX","sX");p(g.oScroll,e,"sScrollXInner","sXInner");p(g.oScroll,e,"sScrollY","sY");p(g.oScroll,e,"bScrollCollapse","bCollapse");p(g.oScroll,e,"bScrollInfinite","bInfinite");p(g.oScroll,e,"iScrollLoadGap","iLoadGap");p(g.oScroll,e,"bScrollAutoCss","bAutoCss");p(g,e,"asStripeClasses");p(g,e,"asStripClasses","asStripeClasses");p(g,e,"fnServerData");p(g,e,"fnFormatNumber");p(g,e,"sServerMethod");p(g,e,"aaSorting");p(g,
    +e,"aaSortingFixed");p(g,e,"aLengthMenu");p(g,e,"sPaginationType");p(g,e,"sAjaxSource");p(g,e,"sAjaxDataProp");p(g,e,"iCookieDuration");p(g,e,"sCookiePrefix");p(g,e,"sDom");p(g,e,"bSortCellsTop");p(g,e,"iTabIndex");p(g,e,"oSearch","oPreviousSearch");p(g,e,"aoSearchCols","aoPreSearchCols");p(g,e,"iDisplayLength","_iDisplayLength");p(g,e,"bJQueryUI","bJUI");p(g,e,"fnCookieCallback");p(g,e,"fnStateLoad");p(g,e,"fnStateSave");p(g.oLanguage,e,"fnInfoCallback");z(g,"aoDrawCallback",e.fnDrawCallback,"user");
    +z(g,"aoServerParams",e.fnServerParams,"user");z(g,"aoStateSaveParams",e.fnStateSaveParams,"user");z(g,"aoStateLoadParams",e.fnStateLoadParams,"user");z(g,"aoStateLoaded",e.fnStateLoaded,"user");z(g,"aoRowCallback",e.fnRowCallback,"user");z(g,"aoRowCreatedCallback",e.fnCreatedRow,"user");z(g,"aoHeaderCallback",e.fnHeaderCallback,"user");z(g,"aoFooterCallback",e.fnFooterCallback,"user");z(g,"aoInitComplete",e.fnInitComplete,"user");z(g,"aoPreDrawCallback",e.fnPreDrawCallback,"user");g.oFeatures.bServerSide&&
    +g.oFeatures.bSort&&g.oFeatures.bSortClasses?z(g,"aoDrawCallback",P,"server_side_sort_classes"):g.oFeatures.bDeferRender&&z(g,"aoDrawCallback",P,"defer_sort_classes");e.bJQueryUI?(h.extend(g.oClasses,j.ext.oJUIClasses),e.sDom===j.defaults.sDom&&"lfrtip"===j.defaults.sDom&&(g.sDom='<"H"lfr>t<"F"ip>')):h.extend(g.oClasses,j.ext.oStdClasses);h(this).addClass(g.oClasses.sTable);if(""!==g.oScroll.sX||""!==g.oScroll.sY)g.oScroll.iBarWidth=Qa();g.iInitDisplayStart===n&&(g.iInitDisplayStart=e.iDisplayStart,
    +g._iDisplayStart=e.iDisplayStart);e.bStateSave&&(g.oFeatures.bStateSave=!0,Sa(g,e),z(g,"aoDrawCallback",ra,"state_save"));null!==e.iDeferLoading&&(g.bDeferLoading=!0,a=h.isArray(e.iDeferLoading),g._iRecordsDisplay=a?e.iDeferLoading[0]:e.iDeferLoading,g._iRecordsTotal=a?e.iDeferLoading[1]:e.iDeferLoading);null!==e.aaData&&(f=!0);""!==e.oLanguage.sUrl?(g.oLanguage.sUrl=e.oLanguage.sUrl,h.getJSON(g.oLanguage.sUrl,null,function(a){pa(a);h.extend(true,g.oLanguage,e.oLanguage,a);ba(g)}),i=!0):h.extend(!0,
    +g.oLanguage,e.oLanguage);null===e.asStripeClasses&&(g.asStripeClasses=[g.oClasses.sStripeOdd,g.oClasses.sStripeEven]);b=g.asStripeClasses.length;g.asDestroyStripes=[];if(b){c=!1;d=h(this).children("tbody").children("tr:lt("+b+")");for(a=0;a<b;a++)d.hasClass(g.asStripeClasses[a])&&(c=!0,g.asDestroyStripes.push(g.asStripeClasses[a]));c&&d.removeClass(g.asStripeClasses.join(" "))}c=[];a=this.getElementsByTagName("thead");0!==a.length&&(V(g.aoHeader,a[0]),c=N(g));if(null===e.aoColumns){d=[];a=0;for(b=
    +c.length;a<b;a++)d.push(null)}else d=e.aoColumns;a=0;for(b=d.length;a<b;a++)e.saved_aoColumns!==n&&e.saved_aoColumns.length==b&&(null===d[a]&&(d[a]={}),d[a].bVisible=e.saved_aoColumns[a].bVisible),o(g,c?c[a]:null);ta(g,e.aoColumnDefs,d,function(a,b){m(g,a,b)});a=0;for(b=g.aaSorting.length;a<b;a++){g.aaSorting[a][0]>=g.aoColumns.length&&(g.aaSorting[a][0]=0);var k=g.aoColumns[g.aaSorting[a][0]];g.aaSorting[a][2]===n&&(g.aaSorting[a][2]=0);e.aaSorting===n&&g.saved_aaSorting===n&&(g.aaSorting[a][1]=
    +k.asSorting[0]);c=0;for(d=k.asSorting.length;c<d;c++)if(g.aaSorting[a][1]==k.asSorting[c]){g.aaSorting[a][2]=c;break}}P(g);Ua(g);a=h(this).children("caption").each(function(){this._captionSide=h(this).css("caption-side")});b=h(this).children("thead");0===b.length&&(b=[l.createElement("thead")],this.appendChild(b[0]));g.nTHead=b[0];b=h(this).children("tbody");0===b.length&&(b=[l.createElement("tbody")],this.appendChild(b[0]));g.nTBody=b[0];g.nTBody.setAttribute("role","alert");g.nTBody.setAttribute("aria-live",
    +"polite");g.nTBody.setAttribute("aria-relevant","all");b=h(this).children("tfoot");if(0===b.length&&0<a.length&&(""!==g.oScroll.sX||""!==g.oScroll.sY))b=[l.createElement("tfoot")],this.appendChild(b[0]);0<b.length&&(g.nTFoot=b[0],V(g.aoFooter,g.nTFoot));if(f)for(a=0;a<e.aaData.length;a++)H(g,e.aaData[a]);else ua(g);g.aiDisplay=g.aiDisplayMaster.slice();g.bInitialised=!0;!1===i&&ba(g)}});ca=null;return this};j.fnVersionCheck=function(e){for(var h=function(e,h){for(;e.length<h;)e+="0";return e},m=j.ext.sVersion.split("."),
    +e=e.split("."),k="",n="",l=0,t=e.length;l<t;l++)k+=h(m[l],3),n+=h(e[l],3);return parseInt(k,10)>=parseInt(n,10)};j.fnIsDataTable=function(e){for(var h=j.settings,m=0;m<h.length;m++)if(h[m].nTable===e||h[m].nScrollHead===e||h[m].nScrollFoot===e)return!0;return!1};j.fnTables=function(e){var o=[];jQuery.each(j.settings,function(j,k){(!e||!0===e&&h(k.nTable).is(":visible"))&&o.push(k.nTable)});return o};j.version="1.9.4";j.settings=[];j.models={};j.models.ext={afnFiltering:[],afnSortData:[],aoFeatures:[],
    +aTypes:[],fnVersionCheck:j.fnVersionCheck,iApiIndex:0,ofnSearch:{},oApi:{},oStdClasses:{},oJUIClasses:{},oPagination:{},oSort:{},sVersion:j.version,sErrMode:"alert",_oExternConfig:{iNextUnique:0}};j.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};j.models.oRow={nTr:null,_aData:[],_aSortData:[],_anHidden:[],_sRowStripe:""};j.models.oColumn={aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bUseRendered:null,bVisible:null,_bAutoType:!0,fnCreatedCell:null,fnGetData:null,
    +fnRender:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};j.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,
    +bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollAutoCss:!0,bScrollCollapse:!1,bScrollInfinite:!1,bServerSide:!1,bSort:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCookieCallback:null,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(e){if(1E3>e)return e;for(var h=e+"",e=h.split(""),j="",h=h.length,k=0;k<h;k++)0===k%3&&0!==k&&(j=this.oLanguage.sInfoThousands+j),j=e[h-k-1]+j;return j},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,
    +fnRowCallback:null,fnServerData:function(e,j,m,k){k.jqXHR=h.ajax({url:e,data:j,success:function(e){e.sError&&k.oApi._fnLog(k,0,e.sError);h(k.oInstance).trigger("xhr",[k,e]);m(e)},dataType:"json",cache:!1,type:k.sServerMethod,error:function(e,h){"parsererror"==h&&k.oApi._fnLog(k,0,"DataTables warning: JSON data from server could not be parsed. This is caused by a JSON formatting error.")}})},fnServerParams:null,fnStateLoad:function(e){var e=this.oApi._fnReadCookie(e.sCookiePrefix+e.sInstance),j;try{j=
    +"function"===typeof h.parseJSON?h.parseJSON(e):eval("("+e+")")}catch(m){j=null}return j},fnStateLoadParams:null,fnStateLoaded:null,fnStateSave:function(e,h){this.oApi._fnCreateCookie(e.sCookiePrefix+e.sInstance,this.oApi._fnJsonString(h),e.iCookieDuration,e.sCookiePrefix,e.fnCookieCallback)},fnStateSaveParams:null,iCookieDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iScrollLoadGap:100,iTabIndex:0,oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},
    +oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sInfoThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},j.models.oSearch),sAjaxDataProp:"aaData",
    +sAjaxSource:null,sCookiePrefix:"SpryMedia_DataTables_",sDom:"lfrtip",sPaginationType:"two_button",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET"};j.defaults.columns={aDataSort:null,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bUseRendered:!0,bVisible:!0,fnCreatedCell:null,fnRender:null,iDataSort:-1,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};j.models.oSettings={oFeatures:{bAutoWidth:null,
    +bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortClasses:null,bStateSave:null},oScroll:{bAutoCss:null,bCollapse:null,bInfinite:null,iBarWidth:0,iLoadGap:null,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1},aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aoColumns:[],aoHeader:[],aoFooter:[],asDataSearch:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:null,
    +asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,sPaginationType:"two_button",iCookieDuration:0,sCookiePrefix:"",fnCookieCallback:null,aoStateSave:[],aoStateLoad:[],
    +oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iDisplayEnd:10,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return this.oFeatures.bServerSide?parseInt(this._iRecordsTotal,10):this.aiDisplayMaster.length},
    +fnRecordsDisplay:function(){return this.oFeatures.bServerSide?parseInt(this._iRecordsDisplay,10):this.aiDisplay.length},fnDisplayEnd:function(){return this.oFeatures.bServerSide?!1===this.oFeatures.bPaginate||-1==this._iDisplayLength?this._iDisplayStart+this.aiDisplay.length:Math.min(this._iDisplayStart+this._iDisplayLength,this._iRecordsDisplay):this._iDisplayEnd},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null};j.ext=h.extend(!0,{},j.models.ext);h.extend(j.ext.oStdClasses,
    +{sTable:"dataTable",sPagePrevEnabled:"paginate_enabled_previous",sPagePrevDisabled:"paginate_disabled_previous",sPageNextEnabled:"paginate_enabled_next",sPageNextDisabled:"paginate_disabled_next",sPageJUINext:"",sPageJUIPrev:"",sPageButton:"paginate_button",sPageButtonActive:"paginate_active",sPageButtonStaticDisabled:"paginate_button paginate_button_disabled",sPageFirst:"first",sPagePrevious:"previous",sPageNext:"next",sPageLast:"last",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",
    +sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",
    +sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sFooterTH:"",sJUIHeader:"",sJUIFooter:""});h.extend(j.ext.oJUIClasses,j.ext.oStdClasses,{sPagePrevEnabled:"fg-button ui-button ui-state-default ui-corner-left",sPagePrevDisabled:"fg-button ui-button ui-state-default ui-corner-left ui-state-disabled",sPageNextEnabled:"fg-button ui-button ui-state-default ui-corner-right",
    +sPageNextDisabled:"fg-button ui-button ui-state-default ui-corner-right ui-state-disabled",sPageJUINext:"ui-icon ui-icon-circle-arrow-e",sPageJUIPrev:"ui-icon ui-icon-circle-arrow-w",sPageButton:"fg-button ui-button ui-state-default",sPageButtonActive:"fg-button ui-button ui-state-default ui-state-disabled",sPageButtonStaticDisabled:"fg-button ui-button ui-state-default ui-state-disabled",sPageFirst:"first ui-corner-tl ui-corner-bl",sPageLast:"last ui-corner-tr ui-corner-br",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",
    +sSortAsc:"ui-state-default",sSortDesc:"ui-state-default",sSortable:"ui-state-default",sSortableAsc:"ui-state-default",sSortableDesc:"ui-state-default",sSortableNone:"ui-state-default",sSortJUIAsc:"css_right ui-icon ui-icon-triangle-1-n",sSortJUIDesc:"css_right ui-icon ui-icon-triangle-1-s",sSortJUI:"css_right ui-icon ui-icon-carat-2-n-s",sSortJUIAscAllowed:"css_right ui-icon ui-icon-carat-1-n",sSortJUIDescAllowed:"css_right ui-icon ui-icon-carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",
    +sScrollHead:"dataTables_scrollHead ui-state-default",sScrollFoot:"dataTables_scrollFoot ui-state-default",sFooterTH:"ui-state-default",sJUIHeader:"fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix",sJUIFooter:"fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix"});h.extend(j.ext.oPagination,{two_button:{fnInit:function(e,j,m){var k=e.oLanguage.oPaginate,n=function(h){e.oApi._fnPageChange(e,h.data.action)&&m(e)},k=!e.bJUI?'<a class="'+
    +e.oClasses.sPagePrevDisabled+'" tabindex="'+e.iTabIndex+'" role="button">'+k.sPrevious+'</a><a class="'+e.oClasses.sPageNextDisabled+'" tabindex="'+e.iTabIndex+'" role="button">'+k.sNext+"</a>":'<a class="'+e.oClasses.sPagePrevDisabled+'" tabindex="'+e.iTabIndex+'" role="button"><span class="'+e.oClasses.sPageJUIPrev+'"></span></a><a class="'+e.oClasses.sPageNextDisabled+'" tabindex="'+e.iTabIndex+'" role="button"><span class="'+e.oClasses.sPageJUINext+'"></span></a>';h(j).append(k);var l=h("a",j),
    +k=l[0],l=l[1];e.oApi._fnBindAction(k,{action:"previous"},n);e.oApi._fnBindAction(l,{action:"next"},n);e.aanFeatures.p||(j.id=e.sTableId+"_paginate",k.id=e.sTableId+"_previous",l.id=e.sTableId+"_next",k.setAttribute("aria-controls",e.sTableId),l.setAttribute("aria-controls",e.sTableId))},fnUpdate:function(e){if(e.aanFeatures.p)for(var h=e.oClasses,j=e.aanFeatures.p,k,l=0,n=j.length;l<n;l++)if(k=j[l].firstChild)k.className=0===e._iDisplayStart?h.sPagePrevDisabled:h.sPagePrevEnabled,k=k.nextSibling,
    +k.className=e.fnDisplayEnd()==e.fnRecordsDisplay()?h.sPageNextDisabled:h.sPageNextEnabled}},iFullNumbersShowPages:5,full_numbers:{fnInit:function(e,j,m){var k=e.oLanguage.oPaginate,l=e.oClasses,n=function(h){e.oApi._fnPageChange(e,h.data.action)&&m(e)};h(j).append('<a  tabindex="'+e.iTabIndex+'" class="'+l.sPageButton+" "+l.sPageFirst+'">'+k.sFirst+'</a><a  tabindex="'+e.iTabIndex+'" class="'+l.sPageButton+" "+l.sPagePrevious+'">'+k.sPrevious+'</a><span></span><a tabindex="'+e.iTabIndex+'" class="'+
    +l.sPageButton+" "+l.sPageNext+'">'+k.sNext+'</a><a tabindex="'+e.iTabIndex+'" class="'+l.sPageButton+" "+l.sPageLast+'">'+k.sLast+"</a>");var t=h("a",j),k=t[0],l=t[1],r=t[2],t=t[3];e.oApi._fnBindAction(k,{action:"first"},n);e.oApi._fnBindAction(l,{action:"previous"},n);e.oApi._fnBindAction(r,{action:"next"},n);e.oApi._fnBindAction(t,{action:"last"},n);e.aanFeatures.p||(j.id=e.sTableId+"_paginate",k.id=e.sTableId+"_first",l.id=e.sTableId+"_previous",r.id=e.sTableId+"_next",t.id=e.sTableId+"_last")},
    +fnUpdate:function(e,o){if(e.aanFeatures.p){var m=j.ext.oPagination.iFullNumbersShowPages,k=Math.floor(m/2),l=Math.ceil(e.fnRecordsDisplay()/e._iDisplayLength),n=Math.ceil(e._iDisplayStart/e._iDisplayLength)+1,t="",r,B=e.oClasses,u,M=e.aanFeatures.p,L=function(h){e.oApi._fnBindAction(this,{page:h+r-1},function(h){e.oApi._fnPageChange(e,h.data.page);o(e);h.preventDefault()})};-1===e._iDisplayLength?n=k=r=1:l<m?(r=1,k=l):n<=k?(r=1,k=m):n>=l-k?(r=l-m+1,k=l):(r=n-Math.ceil(m/2)+1,k=r+m-1);for(m=r;m<=k;m++)t+=
    +n!==m?'<a tabindex="'+e.iTabIndex+'" class="'+B.sPageButton+'">'+e.fnFormatNumber(m)+"</a>":'<a tabindex="'+e.iTabIndex+'" class="'+B.sPageButtonActive+'">'+e.fnFormatNumber(m)+"</a>";m=0;for(k=M.length;m<k;m++)u=M[m],u.hasChildNodes()&&(h("span:eq(0)",u).html(t).children("a").each(L),u=u.getElementsByTagName("a"),u=[u[0],u[1],u[u.length-2],u[u.length-1]],h(u).removeClass(B.sPageButton+" "+B.sPageButtonActive+" "+B.sPageButtonStaticDisabled),h([u[0],u[1]]).addClass(1==n?B.sPageButtonStaticDisabled:
    +B.sPageButton),h([u[2],u[3]]).addClass(0===l||n===l||-1===e._iDisplayLength?B.sPageButtonStaticDisabled:B.sPageButton))}}}});h.extend(j.ext.oSort,{"string-pre":function(e){"string"!=typeof e&&(e=null!==e&&e.toString?e.toString():"");return e.toLowerCase()},"string-asc":function(e,h){return e<h?-1:e>h?1:0},"string-desc":function(e,h){return e<h?1:e>h?-1:0},"html-pre":function(e){return e.replace(/<.*?>/g,"").toLowerCase()},"html-asc":function(e,h){return e<h?-1:e>h?1:0},"html-desc":function(e,h){return e<
    +h?1:e>h?-1:0},"date-pre":function(e){e=Date.parse(e);if(isNaN(e)||""===e)e=Date.parse("01/01/1970 00:00:00");return e},"date-asc":function(e,h){return e-h},"date-desc":function(e,h){return h-e},"numeric-pre":function(e){return"-"==e||""===e?0:1*e},"numeric-asc":function(e,h){return e-h},"numeric-desc":function(e,h){return h-e}});h.extend(j.ext.aTypes,[function(e){if("number"===typeof e)return"numeric";if("string"!==typeof e)return null;var h,j=!1;h=e.charAt(0);if(-1=="0123456789-".indexOf(h))return null;
    +for(var k=1;k<e.length;k++){h=e.charAt(k);if(-1=="0123456789.".indexOf(h))return null;if("."==h){if(j)return null;j=!0}}return"numeric"},function(e){var h=Date.parse(e);return null!==h&&!isNaN(h)||"string"===typeof e&&0===e.length?"date":null},function(e){return"string"===typeof e&&-1!=e.indexOf("<")&&-1!=e.indexOf(">")?"html":null}]);h.fn.DataTable=j;h.fn.dataTable=j;h.fn.dataTableSettings=j.settings;h.fn.dataTableExt=j.ext};"function"===typeof define&&define.amd?define(["jquery"],L):jQuery&&!jQuery.fn.dataTable&&
    +L(jQuery)})(window,document);
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/css/ad.css b/src/main/webapp/plug-in/datatables/thems/black/css/ad.css
    new file mode 100644
    index 00000000..30f71a28
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/css/ad.css
    @@ -0,0 +1,735 @@
    +/* ADMINITY ADMINISTRATION INTERFACE */
    +
    +/* BODY */
    +
    +body {
    +	background: #d8d6d8 url(../img/bkg-pat.png);
    +	min-width: 320px;
    +}
    +
    +/* HEADER */
    +
    +.header {
    +	padding: 7px 0;
    +	margin-left: 3%;
    +}
    +
    +/* TOP BAR NAVIGATION */
    +
    +.top-bar {
    +	height: 80px;
    +	background: url(../img/grad-overlay.png) #292929;
    +	border-top: 1px solid #515151;
    +    border-bottom: 1px solid #222;
    +}
    +.top-bar a { color: #9e9e9e; font-size: 10px; text-shadow: 0px 1px 0px #222; }
    +
    +/* USER PANEL */
    +
    +#user-panel {
    +	width: 240px;
    +	height: 60px;
    +	float: left;
    +	position: relative;
    +}
    +#usr-avatar {
    +	width: 46px;
    +	height: 46px;
    +	margin: 7px 0 0 7px;
    +	border-radius: 2px;
    +}
    +#usr-info {
    +	position: relative;
    +	top: -49px;
    +	left: 60px;
    +	width: 240px;
    +}
    +#usr-info p {line-height: 1.5em;}
    +#usr-name {color: #83ab24; font-weight: 600; font-size: 12px;}
    +#usr-notif {color: #dfdfdf; font-size: 10px;}
    +#usr-info a {margin-right: 20px;}
    +
    +/* NAVIGATION */
    +
    +#nav {
    +	margin: 10px 3%;
    +	min-width: 1214px;
    +}
    +.nav-item {
    +	height: 60px;
    +	float: left;
    +	margin-left: 8px;
    +}
    +.nav-item a {
    +	display: block;
    +	width: 80px;
    +	height: 60px;
    +}
    +.nav-item p {font-size: 11px; font-weight: 600; text-align: center;}
    +.nav-item img {
    +	width: 30px;
    +	height: 30px;
    +	padding: 8px 25px 4px;
    +}
    +.nav-item:hover, #user-panel {
    +	background: url(../img/nav/nav-hover.png);
    +	border-radius: 3px;
    +	box-shadow: inset 0px 0px 1px 0px #000;
    +}
    +
    +/* SUB NAVIGATION */
    +
    +#top-nav {
    +	position: relative;
    +}
    +
    +.sub-nav {
    +	display: none;
    +	position: relative;
    +	left: 0;
    +	top: 0;
    +	background: #343434;
    +	border-radius: 2px;
    +	z-index: 9999;
    +}
    +.sub-nav a {
    +	height: 20px;
    +	padding: 6px 0 0 0;
    +	text-align: center;
    +	font-size: 11px;
    +}
    +.sub-nav a:hover {
    +	color: #83ab24;
    +	background: #3d3d3d;
    +	border-radius: 2px;
    +}
    +
    +/* CONTENT */
    +
    +.content {
    +    padding: 20px 0;
    +}
    +
    +/* NOTIFICATIONS, MESSAGES */
    +
    +.ad-notif-error, .ad-notif-success, .ad-notif-warn, .ad-notif-info {
    +	max-height: 50px;
    +	margin-bottom: 20px;
    +	border-radius: 3px;
    +	background: url(../img/ui/notif-bg.jpg) repeat-x;
    +	box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.3);
    +	box-sizing: border-box;
    +	-webkit-box-sizing: border-box;
    +	-moz-box-sizing: border-box;
    +}
    +.ad-notif-error p, .ad-notif-success p, .ad-notif-warn p, .ad-notif-info p {
    +	color: rgba(0, 0, 0, 0.6);
    +	padding: 10px 0;
    +	margin: 0 10px;
    +	font-size: 12px;
    +	font-weight: 700;
    +	text-shadow: 0 1px 0 rgba(255, 255, 255, 0.3);
    +}
    +.ad-notif-success { background-position: 0 0; border: 1px solid #71a100; }
    +.ad-notif-warn { background-position: 0 -50px; border: 1px solid #cbac00; }
    +.ad-notif-error { background-position: 0 -100px; border: 1px solid #c63434; }
    +.ad-notif-info { background-position: 0 -150px; border: 1px solid #308eef; }
    +
    +.sticky-note {
    +	font-weight: 600;
    +	font-size: 12px;
    +}
    +
    +/* GENERAL ELEMENTS */
    +
    +.box {
    +	margin-bottom: 20px;
    +    border-radius: 3px;
    +}
    +.box-head {
    +	background: url(../img/grad-overlay-s.png) #393939;
    +	border-radius: 2px;
    +	max-height: 40px;
    +}
    +.box-head:hover {
    +	background: url(../img/grad-overlay-s.png) #444;
    +}
    +.box-icon, .box-icon-16, .box-icon-24, .box-icon-32 { float: left; }
    +.box-icon-16 { margin: 9px 9px 0 9px; }
    +.box-icon-24 { margin: 6px 4px 0 6px; }
    +.box-icon-32 { margin: 1px 4px 0 2px; }
    +
    +.box-head h2 {
    +	padding: 10px 10px;
    +	color: #ddd;
    +	font-size: 14px;
    +	font-weight: 600;
    +	text-shadow: 0 1px 0 #222;
    +}
    +.box-content {
    +	background: #eee;
    +	border: 1px solid #bbb;
    +	border-top: none;
    +	border-radius: 0 0 3px 3px;
    +	padding: 10px 10px;
    +}
    +.box-content p, .ui-widget-content p {
    +	color: #292929;
    +	line-height: 1.4em;
    +	text-shadow: 0 1px 0 #fff;
    +}
    +.sm-box {
    +	margin-bottom: 20px;
    +    border-radius: 3px;
    +    background: #eee;
    +}
    +.sm-box span { padding: 10px; border: 1px solid #bbb; border-radius: 3px; display: block; }
    +.sm-box h2 {
    +	font-size: 12px;
    +	font-weight: 600;
    +	color: #666;
    +	text-shadow: 0 1px 0 #fff;
    +	margin: 8px 0 0 10px;
    +	float: right;
    +}
    +
    +/* Styling for the STATS PANEL on the dashboard */
    +
    +.ad-stats ul li {
    +	font-weight: 600;
    +	font-size: 12px;
    +	color: #292929;
    +	text-shadow: 0 1px 0 #fff;
    +}
    +.ad-stats ul h3 {
    +	display: inline-block;
    +	width: 60px;
    +	margin-right: 10px;
    +	text-align: right;
    +	font-size: 16px;
    +	font-weight: 500;
    +	font-family: 'Ubuntu', sans-serif;
    +	color: #444;
    +	text-shadow: 0 1px 0 #eee;
    +	background: url(../img/grad-overlay.png) #ddd;
    +	padding: 4px 8px;
    +	margin-bottom: 8px;
    +	border-radius: 3px;
    +	border: 1px solid #bbb;
    +}
    +.ad-stats ul li:last-child h3 { margin-bottom: 0; }
    +.ad-stats .stats-down h3 {color: #a62626;}
    +.ad-stats .stats-up h3 {color: #6f9300;}
    +
    +/* FLOT CHARTS STYLING */
    +
    +.tickLabel, .legendLabel {
    +	font-size: 10px;
    +}
    +.legendLabel {
    +	vertical-align: middle;
    +}
    +
    +/* TYPOGRAPHY */
    +
    +h1, h2, h3, h4, h5, h6 { font-weight: 600; }
    +h1 { font-size: 26px; }
    +h2 { font-size: 24px; }
    +h3 { font-size: 22px; }
    +h4 { font-size: 20px; }
    +h5 { font-size: 18px; }
    +h6 { font-size: 16px; }
    +
    +p { font-size: 12px; font-weight: 400; }
    +
    +.font-thin { font-weight: 300; }
    +.font-bold { font-weight: 600; }
    +.textsh { text-shadow: 0 1px 0 #fff; }
    +.text-tiny { font-size: 9px; }
    +.text-small { font-size: 10px; }
    +.text-normal { font-size: 12px; }
    +.text-big { font-size: 14px; }
    +.text-huge { font-size: 16px; }
    +
    +ul.circle { list-style-type: circle; }
    +ol.decimal { list-style-type: decimal; }
    +
    +ul.circle li, ol.decimal li { height: 1em; margin: 0 0 4px 20px;}
    +
    +
    +/* ERROR PAGES */
    +
    +#error-heading, #error-desc, #error-back {
    +	text-shadow: 0 1px 0 #ededed;
    +	text-align: center;
    +	margin: 40px 0;
    +	color: #292929;
    +}
    +#error-heading { font-size: 160px; text-shadow: 0 2px 4px #ededed; }
    +#error-desc { font-size: 20px; font-weight: 600; }
    +#error-back { font-size: 14px; font-weight: 600; }
    +#error-back a { color: #4c7500; }
    +
    +/* WIDGETS & jQuery UI OVERRIDES */
    +
    +.close-x { background: url(../img/ui/close.png); width: 16px; height: 16px; text-indent: -9999px; }
    +
    +.ui-tabs-nav, .ui-accordion-header, .ui-dialog-titlebar, .ui-datepicker-header {
    +	background: url(../img/grad-overlay-s.png) #393939;
    +	max-height: 40px;
    +	border-radius: 2px;
    +	border: none;
    +}
    +.ui-accordion-header:hover {
    +	background: url(../img/grad-overlay-s.png) #444;
    +}
    +.ui-accordion .ui-icon { display: none; }
    +.ui-accordion h3 a { padding: 8px !important; }
    +.ui-accordion h3 a, .ui-dialog-title, .ui-datepicker-title {
    +	color: #ddd !important;
    +	font-size: 14px !important;
    +	font-weight: 600 !important;
    +	text-shadow: 0 1px 0 #222 !important;
    +}
    +.ui-accordion-content { border-radius: 0 0 3px 3px; }
    +.ui-widget-content { background: #eee; border: 1px solid #bbb; }
    +.ui-tabs { padding: 0 !important; }
    +.ui-tabs-nav { border-radius: 2px 2px 0 0 !important; }
    +.ui-tabs .ui-tabs-nav li { margin-top: 6px; border-radius: 2px 2px 0 0 !important; }
    +.ui-tabs .ui-tabs-nav li a { padding: 6px !important; }
    +.ui-tabs-selected {
    +	background: #eee !important;
    +	border: none !important;
    +}
    +.ui-tabs a {
    +	color: #999 !important;
    +	font-size: 12px;
    +	font-weight: 600;
    +	text-shadow: 0 1px 0 #222;
    +}
    +.ui-tabs-selected a { color: #292929 !important; text-shadow: 0 1px 0 #fff; }
    +
    +.ui-progressbar {
    +	background: #6a6a6a;
    +	border: none;
    +	box-shadow: inset 0 0 2px 0 #333;
    +}
    +.ui-progressbar-value { background: url(../img/ui/pbar.png) #292929 !important; border: none !important; }
    +
    +.ui-dialog { padding: 0 !important; border: none !important; }
    +.ui-dialog .ui-dialog-titlebar, .ui-datepicker-header { border-radius: 2px 2px 0 0 !important; }
    +.ui-dialog .ui-dialog-title { margin: 5px 5px !important; }
    +.ui-dialog .ui-dialog-buttonpane { padding: 0 !important; background: #ccc !important; margin: 0 !important; border-radius: 0 0 2px 2px !important; border: 1px solid #bbb !important; border-top: 0 !important; }
    +.ui-dialog .ui-dialog-content { border: 1px solid #bbb; padding: 20px; }
    +
    +.ui-state-focus, *:focus { outline: none !important; }
    +.ui-widget-overlay { background: url(../img/ui/overlay.png) !important; }
    +
    +/* SLIDERS */
    +
    +.ui-slider {
    +	background: #6a6a6a;
    +	border: none;
    +	box-shadow: inset 0 0 2px 0 #333;
    +}
    +.ui-slider-horizontal { height: 8px; }
    +.ui-slider-vertical { width: 8px; }
    +.ui-slider-range { border-radius: 4px; box-shadow: inset 0 0 1px 0 rgba(0, 0, 0, 0.4); }
    +.ui-slider-horizontal>.ui-slider-range { background: url(../img/slider-hz.png) #a1b900; }
    +.ui-slider-vertical>.ui-slider-range { background: url(../img/slider-vt.png) #a1b900; }
    +.ui-slider-handle { 
    +	background: url(../img/slider-handle.png) no-repeat !important;
    +	border: none !important;
    +}
    +
    +/* BUTONS */
    +
    +.button {
    +	border-radius: 3px;
    +	box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.3);
    +	padding: 4px 14px 5px 14px;
    +	margin-right: 5px;
    +	cursor: pointer;
    +	font-size: 10px !important;
    +	font-weight: 600 !important;
    +	font-family: 'Open Sans', sans-serif !important;
    +	color: #292929;
    +	text-shadow: 0 1px 0 rgba(255, 255, 255, 0.3);
    +	height: 28px;
    +	max-height: 40px !important;
    +}
    +.button:hover { box-shadow: none; }
    +.button:active { box-shadow: inset 0 0 1px 0 rgba(0,0,0, 0.7); }
    +
    +.button.small { padding: 2px 8px; height: 24px; }
    +.button.big { padding: 8px 18px; height: 32px; }
    +
    +.button.red { background: url(../img/grad-overlay-s.png) #df3030; border: 1px solid #c90000; }
    +.button.green { background: url(../img/grad-overlay-s.png) #a1b900; border: 1px solid #869a00; }
    +.button.blue { background: url(../img/grad-overlay-s.png) #2c99f5; border: 1px solid #166fbb; }
    +.button.orange { background: url(../img/grad-overlay-s.png) #e3b822; border: 1px solid #c79f16; }
    +.button.purple { background: url(../img/grad-overlay-s.png) #bc66bb; border: 1px solid #9e4c9d; }
    +.button.yellow { background: url(../img/grad-overlay-s.png) #efdb2f; border: 1px solid #ccb708; }
    +.button.black { background: url(../img/grad-overlay-s.png) #555; border: 1px solid #444; color: #ddd; text-shadow: 0 1px 0 #000; }
    +.button.grey { background: url(../img/grad-overlay-s.png) #dbdbdb; border: 1px solid #ababab; }
    +.button.disabled { color: #666; cursor: default !important; box-shadow: none !important; }
    +
    +/* FORMS */
    +
    +form {
    +	display: block;
    +}
    +input, select {
    +	background: #fff;
    +	border-radius: 3px;
    +	border: 1px solid #ccc;
    +	outline: none;
    +	padding: 6px 3px;
    +	font-size: 10px;
    +	color: #292929;
    +}
    +input:disabled {
    +	background: #ddd;
    +}
    +input[type="radio"], input[type="checkbox"] {
    +	background: none;
    +	border: none;
    +}
    +select {
    +	border: 1px solid #bbb;
    +	box-shadow: none;
    +	box-sizing: content-box;
    +	-webkit-box-sizing: content-box;
    +	-moz-box-sizing: content-box;
    +}
    +.form-row {
    +	padding: 10px 8px 10px 0;
    +}
    +.form-label {
    +	display: inline-block;
    +	width: 120px;
    +	margin-right: 12px;
    +	margin-top: 3px;
    +	font-size: 11px;
    +    text-shadow: 0 1px 0 #fff;
    +    float: left;
    +}
    +.form-item {
    +	display: block;
    +    overflow: hidden;
    +    padding: 0 8px 0 0;
    +    position: relative;
    +}
    +.form-item input, .form-item select {
    +	width: 100%;
    +}
    +.form-icon {
    +	display: inline-block;
    +	width: 16px;
    +	height: 16px;
    +	position: absolute;
    +	top: 5px;
    +	right: 6px;
    +}
    +form p, form label, .form-row p, .form-row label {
    +	display: inline-block;
    +	float: left;
    +}
    +input.filebase {
    +	opacity: 0;
    +	position: absolute;
    +	top: 0;
    +	z-index: 1;
    +}
    +.filetext {
    +	position: absolute;
    +	top: 7px;
    +	left: 10px;
    +	z-index: 0;
    +	font-size: 12px;
    +}
    +::-webkit-input-placeholder {
    +    color: #888;
    +}
    +:-moz-placeholder {
    +    color: #888;
    +}
    +
    +/*  STYLER */
    +
    +.styler {
    +	width: 40px;
    +	height: 42px;
    +	background: url(../img/styler-icon.png) no-repeat #444;
    +	background-position: 3px 5px;
    +	position: absolute;
    +	top: 0px;
    +	left: 240px;
    +	border-radius: 0 0 20px 20px;
    +	border-bottom: 1px solid #000;
    +}
    +.styler-active {
    +    border-radius: 0 0 0 20px;
    +}
    +.styler-show {
    +	width: 200px;
    +	height: 42px;
    +	background: #444;
    +	position: relative;
    +	top: 0;
    +	left: 40px;
    +	border-radius: 0 0 20px 0;
    +    display: none;
    +    border-bottom: 1px solid #000;
    +}
    +.styler-show li {
    +    padding: 12px 0 0 12px;
    +    display: inline-block;
    +}
    +.styler-show li div {
    +	border-radius: 2px;
    +	box-shadow: inset 0px 0px 1px 0px #000;
    +}
    +#colorSelector-top-bar {
    +	width: 20px;
    +	height: 20px;
    +	background: #292929;
    +}
    +#colorSelector-box-head {
    +	width: 20px;
    +	height: 20px;
    +	background: #292929;
    +}
    +
    +/* USEFUL CLASSES */
    +
    +.grad-ov { background-image: url(../img/grad-overlay.png); }
    +.grad-ov-s { background-image: url(../img/grad-overlay-s.png); }
    +.mg { margin-bottom: 20px; }
    +.small-mg { margin-bottom: 10px; }
    +.no-pad { padding: 0; }
    +.no-mg { margin: 0; }
    +.clear { clear: both; }
    +.no-display { display: none; }
    +
    +/* FOOTER */
    +
    +.footer {
    +	clear: both;
    +}
    +.footer p {
    +	font-size: 13px;
    +	font-weight: 600;
    +	text-align: center;
    +	padding: 10px 0 30px 0;
    +	text-align: center;
    +	color: #292929;
    +	text-shadow: 0 1px 0 #ededed;
    +	width: 320px;
    +	margin: 0 auto;
    +}
    +
    +/* ADAPTIVE LAYOUT CSS */
    +
    +/* For screens smaller than 490px (including iPhone/smartphone screens) */
    +
    +@media only screen and (min-width: 0px) and (max-width: 500px){
    +	.top-bar {
    +		height: 44px !important;
    +	}
    +	#user-panel {
    +		box-shadow: none;
    +		background: none;
    +		padding: 0;
    +		margin: 0;
    +		border-radius: 0;
    +		position: absolute;
    +	}
    +	#usr-notif { position: absolute; top: 1px !important; left: 4px !important; }
    +	#usr-notif + p { position: absolute; left: 168px !important; }
    +	#usr-notif + p a { margin-right: 10px; }
    +	#usr-info { position: absolute; top: 1px !important; left: 4px !important; width: 320px; }
    +	#usr-info p { line-height: 1; }
    +	#usr-name, #usr-avatar { display: none; }
    +	#nav { margin: 0 1%; min-width: 320px; }
    +	.nav-item { margin-top: 14px !important; }
    +}
    +
    +/* For screens smaller than 600px (tablets or very small PC screens) */
    +
    +@media only screen and (min-width: 0px) and (max-width: 600px){
    +	.grid_1,
    +	.grid_2,
    +	.grid_3,
    +	.grid_4,
    +	.grid_5,
    +	.grid_6,
    +	.grid_7,
    +	.grid_8,
    +	.grid_9,
    +	.grid_10,
    +	.grid_11,
    +	.grid_12,
    +	.grid_13,
    +	.grid_14,
    +	.grid_15,
    +	.grid_16 {
    +		width: 98% !important;
    +		margin-left: 1% !important;
    +		margin-right: 1% !important;
    +	}
    +	.top-bar {
    +		height: 30px;
    +	}
    +	#user-panel {
    +		box-shadow: none;
    +		background: none;
    +		padding: 1px;
    +		margin: 0;
    +		border-radius: 0;
    +		width: 170px;
    +		height: 28px;
    +	}
    +	#usr-info { top: 4px; left: 4px; }
    +	#usr-info p { line-height: 1; }
    +	#usr-name { display: none; }
    +	#usr-avatar {
    +	    display: none;
    +    }
    +	#nav { margin: 0 1%; padding: 0; min-width: 320px; }
    +	.nav-item {
    +	    margin: 1px 1px 0 0;
    +	    height: 28px;
    +		width: 28px;
    +	}
    +	.nav-item a {
    +		height: 28px;
    +		width: 28px;
    +	}
    +	.top-bar a p {
    +		display: none;
    +		max-height: 0px;
    +	}
    +	.nav-item img {
    +		width: 24px;
    +		height: 24px;
    +		padding: 2px;
    +	}
    +	.sub-nav { width: 60px; }
    +    .sub-nav a { width: 60px; height: 16px; }
    +    .ad-notif-error.no-display { display: block !important; }
    +    .box, .ad-notif-error, .ad-notif-info, .ad-notif-warn, .ad-notif-success {
    +		margin-bottom: 10px;
    +	}
    +	.content { padding: 10px 0; }
    +	.container_12, .container_16 {
    +		width: 100%;
    +		margin: 0;
    +	}
    +}
    +
    +/* Grid changes for screens smaller than 1064px */
    +
    +@media only screen and (min-width: 600px) and (max-width: 1064px){
    +	.container_12 .grid_1,
    +	.container_12 .grid_2,
    +	.container_12 .grid_3,
    +	.container_12 .grid_4,
    +	.container_12 .grid_5,
    +	.container_16 .grid_1,
    +	.container_16 .grid_2,
    +	.container_16 .grid_3,
    +	.container_16 .grid_4,
    +	.container_16 .grid_5,
    +	.container_16 .grid_6,
    +	.container_16 .grid_7 {
    +		width: 48% !important;
    +	}
    +	.container_12 .grid_6,
    +	.container_12 .grid_7,
    +	.container_12 .grid_8,
    +	.container_12 .grid_9,
    +	.container_12 .grid_10,
    +	.container_12 .grid_11,
    +	.container_12 .grid_12,
    +	.container_16 .grid_8,
    +	.container_16 .grid_9,
    +	.container_16 .grid_10,
    +	.container_16 .grid_11,
    +	.container_16 .grid_12,
    +	.container_16 .grid_13,
    +	.container_16 .grid_14,
    +	.container_16 .grid_15,
    +	.container_16 .grid_16 {
    +		width: 98% !important;
    +	}
    +	.ad-notif-error.no-display { display: block !important; }
    +}
    +
    +/* For screens smaller than 1280px */
    +
    +@media only screen and (min-width: 600px) and (max-width: 1249px){
    +	.top-bar {
    +		float: left;
    +		width: 80px;
    +		background: url(../img/grad-overlay-hz.png) 0 0 repeat-y #292929;
    +		border: none;
    +		border-right: 1px solid #515151;
    +		position: absolute;
    +		top: 0;
    +	}
    +	#nav {
    +		margin: 0;
    +		display: block;
    +		min-width: 0;
    +	}
    +	.nav-item {
    +		float: none;
    +		margin-top: 6px;
    +		margin-left: 0;
    +	}
    +	.nav-item a {
    +		display: list-item;
    +	}
    +	.nav-item:hover { border-radius: 0; }
    +    #user-panel {
    +    	position: absolute !important;
    +    	top: 4px;
    +    	left: 80px;
    +    	clear: left;
    +    	background: url(../img/grad-overlay.png) #eee;
    +    	height: 46px;
    +    	width: 200px;
    +    	border-radius: 0 2px 2px 0;
    +    	box-shadow: inset 1px 0 1px 0 #000;
    +    }
    +    #usr-avatar { display: none; }
    +    #usr-info {
    +    	margin: 0;
    +    	padding: 0;
    +    	position: absolute;
    +    	top: 2px;
    +    	left: 10px;
    +    }
    +    #usr-notif { color: #292929; }
    +    #usr-info a { color: #323232; }
    +    #usr-info p { line-height: 1.2em; }
    +    #usr-name, #usr-notif, #usr-info a { font-weight: 600; text-shadow: 0 1px 0 #eee; }
    +    .styler {
    +    	position: absolute;
    +    	left: -100px !important;
    +    }
    +	.content, .footer {
    +		width: auto !important;
    +		margin-left: 2px !important;
    +		margin-right: 2px !important;
    +	}
    +	.header {
    +		position: absolute;
    +		top: 0;
    +		right: 20px;
    +	}
    +	.content {
    +		margin-top: 0px;
    +	}
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/css/colorpicker.css b/src/main/webapp/plug-in/datatables/thems/black/css/colorpicker.css
    new file mode 100644
    index 00000000..b981efea
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/css/colorpicker.css
    @@ -0,0 +1,161 @@
    +.colorpicker {
    +	width: 356px;
    +	height: 176px;
    +	overflow: hidden;
    +	position: absolute;
    +	background: url(../img/colorpicker/colorpicker_background.png);
    +	font-family: Arial, Helvetica, sans-serif;
    +	display: none;
    +}
    +.colorpicker_color {
    +	width: 150px;
    +	height: 150px;
    +	left: 14px;
    +	top: 13px;
    +	position: absolute;
    +	background: #f00;
    +	overflow: hidden;
    +	cursor: crosshair;
    +}
    +.colorpicker_color div {
    +	position: absolute;
    +	top: 0;
    +	left: 0;
    +	width: 150px;
    +	height: 150px;
    +	background: url(../img/colorpicker/colorpicker_overlay.png);
    +}
    +.colorpicker_color div div {
    +	position: absolute;
    +	top: 0;
    +	left: 0;
    +	width: 11px;
    +	height: 11px;
    +	overflow: hidden;
    +	background: url(../img/colorpicker/colorpicker_select.gif);
    +	margin: -5px 0 0 -5px;
    +}
    +.colorpicker_hue {
    +	position: absolute;
    +	top: 13px;
    +	left: 171px;
    +	width: 35px;
    +	height: 150px;
    +	cursor: n-resize;
    +}
    +.colorpicker_hue div {
    +	position: absolute;
    +	width: 35px;
    +	height: 9px;
    +	overflow: hidden;
    +	background: url(../img/colorpicker/colorpicker_indic.gif) left top;
    +	margin: -4px 0 0 0;
    +	left: 0px;
    +}
    +.colorpicker_new_color {
    +	position: absolute;
    +	width: 60px;
    +	height: 30px;
    +	left: 213px;
    +	top: 13px;
    +	background: #f00;
    +}
    +.colorpicker_current_color {
    +	position: absolute;
    +	width: 60px;
    +	height: 30px;
    +	left: 283px;
    +	top: 13px;
    +	background: #f00;
    +}
    +.colorpicker input {
    +	background-color: transparent;
    +	border: 1px solid transparent;
    +	position: absolute;
    +	font-size: 10px;
    +	font-family: Arial, Helvetica, sans-serif;
    +	color: #898989;
    +	top: 4px;
    +	right: 11px;
    +	text-align: right;
    +	margin: 0;
    +	padding: 0;
    +	height: 11px;
    +}
    +.colorpicker_hex {
    +	position: absolute;
    +	width: 72px;
    +	height: 22px;
    +	background: url(../img/colorpicker/colorpicker_hex.png) top;
    +	left: 212px;
    +	top: 142px;
    +}
    +.colorpicker_hex input {
    +	right: 6px;
    +}
    +.colorpicker_field {
    +	height: 22px;
    +	width: 62px;
    +	background-position: top;
    +	position: absolute;
    +}
    +.colorpicker_field span {
    +	position: absolute;
    +	width: 12px;
    +	height: 22px;
    +	overflow: hidden;
    +	top: 0;
    +	right: 0;
    +	cursor: n-resize;
    +}
    +.colorpicker_rgb_r {
    +	background-image: url(../img/colorpicker/colorpicker_rgb_r.png);
    +	top: 52px;
    +	left: 212px;
    +}
    +.colorpicker_rgb_g {
    +	background-image: url(../img/colorpicker/colorpicker_rgb_g.png);
    +	top: 82px;
    +	left: 212px;
    +}
    +.colorpicker_rgb_b {
    +	background-image: url(../img/colorpicker/colorpicker_rgb_b.png);
    +	top: 112px;
    +	left: 212px;
    +}
    +.colorpicker_hsb_h {
    +	background-image: url(../img/colorpicker/colorpicker_hsb_h.png);
    +	top: 52px;
    +	left: 282px;
    +}
    +.colorpicker_hsb_s {
    +	background-image: url(../img/colorpicker/colorpicker_hsb_s.png);
    +	top: 82px;
    +	left: 282px;
    +}
    +.colorpicker_hsb_b {
    +	background-image: url(../img/colorpicker/colorpicker_hsb_b.png);
    +	top: 112px;
    +	left: 282px;
    +}
    +.colorpicker_submit {
    +	position: absolute;
    +	width: 22px;
    +	height: 22px;
    +	background: url(../img/colorpicker/colorpicker_submit.png) top;
    +	left: 322px;
    +	top: 142px;
    +	overflow: hidden;
    +}
    +.colorpicker_focus {
    +	background-position: center;
    +}
    +.colorpicker_hex.colorpicker_focus {
    +	background-position: bottom;
    +}
    +.colorpicker_submit.colorpicker_focus {
    +	background-position: bottom;
    +}
    +.colorpicker_slider {
    +	background-position: bottom;
    +}
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/css/css.css b/src/main/webapp/plug-in/datatables/thems/black/css/css.css
    new file mode 100644
    index 00000000..afa6ab68
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/css/css.css
    @@ -0,0 +1,24 @@
    +@font-face {
    +  font-family: 'Open Sans';
    +  font-style: normal;
    +  font-weight: 700;
    +  src: local('Open Sans Bold'), local('OpenSans-Bold'), url(http://themes.googleusercontent.com/static/fonts/opensans/v6/k3k702ZOKiLJc3WVjuplzHhCUOGz7vYGh680lGh-uXM.woff) format('woff');
    +}
    +@font-face {
    +  font-family: 'Open Sans';
    +  font-style: normal;
    +  font-weight: 300;
    +  src: local('Open Sans Light'), local('OpenSans-Light'), url(http://themes.googleusercontent.com/static/fonts/opensans/v6/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff) format('woff');
    +}
    +@font-face {
    +  font-family: 'Open Sans';
    +  font-style: normal;
    +  font-weight: 600;
    +  src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(http://themes.googleusercontent.com/static/fonts/opensans/v6/MTP_ySUJH_bn48VBG8sNSnhCUOGz7vYGh680lGh-uXM.woff) format('woff');
    +}
    +@font-face {
    +  font-family: 'Open Sans';
    +  font-style: normal;
    +  font-weight: 400;
    +  src: local('Open Sans'), local('OpenSans'), url(http://themes.googleusercontent.com/static/fonts/opensans/v6/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff');
    +}
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/css/demo.css b/src/main/webapp/plug-in/datatables/thems/black/css/demo.css
    new file mode 100644
    index 00000000..f792a5c9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/css/demo.css
    @@ -0,0 +1,27 @@
    +
    +/**********************************************************************
    +*     THIS STYLESHEET IS FOR DEMONSTRATION PURPOSE ONLY               *
    +**********************************************************************/
    +
    +.dashboard-demo { min-height: 168px; }
    +.grid-demo-12, .grid-demo-16 { padding-top: 20px; }
    +.grid-demo-12 .box-head, .grid-demo-16 .box-head { background: #555; margin-bottom: 20px; }
    +.grid-demo-12 .box-head h2, .grid-demo-16 .box-head h2 { font-size: 12px; }
    +
    +#flot-demo { height: 154px; margin: 4px 2px; }
    +#flot-lines, #flot-bars {
    +	height: 160px;
    +	margin: 4px 2px;
    +}
    +#flot-pie, #flot-realtime {
    +	height: 300px;
    +	margin: 4px 2px;
    +}
    +#gallery a img {
    +	margin: 10px;
    +}
    +#widget-list li { display: inline; margin-bottom: 10px; margin-top: 10px; }
    +#eq span { height:120px; float:left; margin: 10px 0 0 20px; }
    +
    +.sliders { height: 200px; }
    +#accordion { height: 254px; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/css/grid.css b/src/main/webapp/plug-in/datatables/thems/black/css/grid.css
    new file mode 100644
    index 00000000..e2c25778
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/css/grid.css
    @@ -0,0 +1,491 @@
    +/*
    +	960 Grid System ~ Core CSS.
    +	Learn more ~ http://960.gs/
    +
    +	Licensed under GPL and MIT.
    +*/
    +
    +/* =Containers
    +--------------------------------------------------------------------------------*/
    +
    +.container_12,
    +.container_16
    +{
    +	width: 96%;
    +	margin-left: 2%;
    +	margin-right: 2%;
    +}
    +
    +/* =Grid >> Global
    +--------------------------------------------------------------------------------*/
    +
    +.grid_1,
    +.grid_2,
    +.grid_3,
    +.grid_4,
    +.grid_5,
    +.grid_6,
    +.grid_7,
    +.grid_8,
    +.grid_9,
    +.grid_10,
    +.grid_11,
    +.grid_12,
    +.grid_13,
    +.grid_14,
    +.grid_15,
    +.grid_16
    +{
    +	display: inline;
    +	float: left;
    +	margin-left: 1%;
    +	margin-right: 1%;
    +}
    +
    +.container_12 .grid_3,
    +.container_16 .grid_4
    +{
    +	width: 23%;
    +}
    +
    +.container_12 .grid_6,
    +.container_16 .grid_8
    +{
    +	width: 48%;
    +}
    +
    +.container_12 .grid_9,
    +.container_16 .grid_12
    +{
    +	width: 73%;
    +}
    +
    +.container_12 .grid_12,
    +.container_16 .grid_16
    +{
    +	width: 98%;
    +}
    +
    +/* =Grid >> Children (Alpha ~ First, Omega ~ Last)
    +--------------------------------------------------------------------------------*/
    +
    +.alpha
    +{
    +	margin-left: 0;
    +}
    +
    +.omega
    +{
    +	margin-right: 0;
    +}
    +
    +/* =Grid >> 12 Columns
    +--------------------------------------------------------------------------------*/
    +
    +.container_12 .grid_1
    +{
    +	width: 6.333%;
    +}
    +
    +.container_12 .grid_2
    +{
    +	width: 14.666%;
    +}
    +
    +.container_12 .grid_4
    +{
    +	width: 31.333%;
    +}
    +
    +.container_12 .grid_5
    +{
    +	width: 39.666%;
    +}
    +
    +.container_12 .grid_7
    +{
    +	width: 56.333%;
    +}
    +
    +.container_12 .grid_8
    +{
    +	width: 64.666%;
    +}
    +
    +.container_12 .grid_10
    +{
    +	width: 81.333%;
    +}
    +
    +.container_12 .grid_11
    +{
    +	width: 89.666%;
    +}
    +
    +/* =Grid >> 16 Columns
    +--------------------------------------------------------------------------------*/
    +
    +.container_16 .grid_1
    +{
    +	width: 4.25%;
    +}
    +
    +.container_16 .grid_2
    +{
    +	width: 10.5%;
    +}
    +
    +.container_16 .grid_3
    +{
    +	width: 16.75%;
    +}
    +
    +.container_16 .grid_5
    +{
    +	width: 29.25%;
    +}
    +
    +.container_16 .grid_6
    +{
    +	width: 35.5%;
    +}
    +
    +.container_16 .grid_7
    +{
    +	width: 41.75%;
    +}
    +
    +.container_16 .grid_9
    +{
    +	width: 54.25%;
    +}
    +
    +.container_16 .grid_10
    +{
    +	width: 60.5%;
    +}
    +
    +.container_16 .grid_11
    +{
    +	width: 66.75%;
    +}
    +
    +.container_16 .grid_13
    +{
    +	width: 79.25%;
    +}
    +
    +.container_16 .grid_14
    +{
    +	width: 85.5%;
    +}
    +
    +.container_16 .grid_15
    +{
    +	width: 91.75%;
    +}
    +
    +/* =Prefix Extra Space >> Global
    +--------------------------------------------------------------------------------*/
    +
    +.container_12 .prefix_3,
    +.container_16 .prefix_4
    +{
    +	padding-left: 25%;
    +}
    +
    +.container_12 .prefix_6,
    +.container_16 .prefix_8
    +{
    +	padding-left: 50%;
    +}
    +
    +.container_12 .prefix_9,
    +.container_16 .prefix_12
    +{
    +	padding-left: 75%;
    +}
    +
    +/* =Prefix Extra Space >> 12 Columns
    +--------------------------------------------------------------------------------*/
    +
    +.container_12 .prefix_1
    +{
    +	padding-left: 8.333%;
    +}
    +
    +.container_12 .prefix_2
    +{
    +	padding-left: 16.666%;
    +}
    +
    +.container_12 .prefix_4
    +{
    +	padding-left: 33.333%;
    +}
    +
    +.container_12 .prefix_5
    +{
    +	padding-left: 41.666%;
    +}
    +
    +.container_12 .prefix_7
    +{
    +	padding-left: 58.333%;
    +}
    +
    +.container_12 .prefix_8
    +{
    +	padding-left: 66.666%;
    +}
    +
    +.container_12 .prefix_10
    +{
    +	padding-left: 83.333%;
    +}
    +
    +.container_12 .prefix_11
    +{
    +	padding-left: 91.666%;
    +}
    +
    +/* =Prefix Extra Space >> 16 Columns
    +--------------------------------------------------------------------------------*/
    +
    +.container_16 .prefix_1
    +{
    +	padding-left: 6.25%;
    +}
    +
    +.container_16 .prefix_2
    +{
    +	padding-left: 12.5%;
    +}
    +
    +.container_16 .prefix_3
    +{
    +	padding-left: 18.75%;
    +}
    +
    +.container_16 .prefix_5
    +{
    +	padding-left: 31.25%;
    +}
    +
    +.container_16 .prefix_6
    +{
    +	padding-left: 37.5%;
    +}
    +
    +.container_16 .prefix_7
    +{
    +	padding-left: 43.75%;
    +}
    +
    +.container_16 .prefix_9
    +{
    +	padding-left: 56.25%;
    +}
    +
    +.container_16 .prefix_10
    +{
    +	padding-left: 62.5%;
    +}
    +
    +.container_16 .prefix_11
    +{
    +	padding-left: 68.75%;
    +}
    +
    +.container_16 .prefix_13
    +{
    +	padding-left: 81.25%;
    +}
    +
    +.container_16 .prefix_14
    +{
    +	padding-left: 87.5%;
    +}
    +
    +.container_16 .prefix_15
    +{
    +	padding-left: 93.75%;
    +}
    +
    +/* =Suffix Extra Space >> Global
    +--------------------------------------------------------------------------------*/
    +
    +.container_12 .suffix_3,
    +.container_16 .suffix_4
    +{
    +	padding-right: 25%;
    +}
    +
    +.container_12 .suffix_6,
    +.container_16 .suffix_8
    +{
    +	padding-right: 50%;
    +}
    +
    +.container_12 .suffix_9,
    +.container_16 .suffix_12
    +{
    +	padding-right: 75%;
    +}
    +
    +/* =Suffix Extra Space >> 12 Columns
    +--------------------------------------------------------------------------------*/
    +
    +.container_12 .suffix_1
    +{
    +	padding-right: 8.333%;
    +}
    +
    +.container_12 .suffix_2
    +{
    +	padding-right: 16.666%;
    +}
    +
    +.container_12 .suffix_4
    +{
    +	padding-right: 33.333%;
    +}
    +
    +.container_12 .suffix_5
    +{
    +	padding-right: 41.666%;
    +}
    +
    +.container_12 .suffix_7
    +{
    +	padding-right: 58.333%;
    +}
    +
    +.container_12 .suffix_8
    +{
    +	padding-right: 66.666%;
    +}
    +
    +.container_12 .suffix_10
    +{
    +	padding-right: 83.333%;
    +}
    +
    +.container_12 .suffix_11
    +{
    +	padding-right: 91.666%;
    +}
    +
    +/* =Suffix Extra Space >> 16 Columns
    +--------------------------------------------------------------------------------*/
    +
    +.container_16 .suffix_1
    +{
    +	padding-right: 6.25%;
    +}
    +
    +.container_16 .suffix_2
    +{
    +	padding-right: 16.5%;
    +}
    +
    +.container_16 .suffix_3
    +{
    +	padding-right: 18.75%;
    +}
    +
    +.container_16 .suffix_5
    +{
    +	padding-right: 31.25%;
    +}
    +
    +.container_16 .suffix_6
    +{
    +	padding-right: 37.5%;
    +}
    +
    +.container_16 .suffix_7
    +{
    +	padding-right: 43.75%;
    +}
    +
    +.container_16 .suffix_9
    +{
    +	padding-right: 56.25%;
    +}
    +
    +.container_16 .suffix_10
    +{
    +	padding-right: 62.5%;
    +}
    +
    +.container_16 .suffix_11
    +{
    +	padding-right: 68.75%;
    +}
    +
    +.container_16 .suffix_13
    +{
    +	padding-right: 81.25%;
    +}
    +
    +.container_16 .suffix_14
    +{
    +	padding-right: 87.5%;
    +}
    +
    +.container_16 .suffix_15
    +{
    +	padding-right: 93.75%;
    +}
    +
    +/* =Clear Floated Elements
    +--------------------------------------------------------------------------------*/
    +
    +/* http://sonspring.com/journal/clearing-floats */
    +
    +html body * span.clear,
    +html body * div.clear,
    +html body * li.clear,
    +html body * dd.clear
    +{
    +	background: none;
    +	border: 0;
    +	clear: both;
    +	display: block;
    +	float: none;
    +	font-size: 0;
    +	list-style: none;
    +	margin: 0;
    +	padding: 0;
    +	overflow: hidden;
    +	visibility: hidden;
    +	width: 0;
    +	height: 0;
    +}
    +
    +/* http://www.positioniseverything.net/easyclearing.html */
    +
    +.clearfix:after
    +{
    +	clear: both;
    +	content: '.';
    +	display: block;
    +	visibility: hidden;
    +	height: 0;
    +}
    +
    +.clearfix
    +{
    +	display: inline-block;
    +}
    +
    +* html .clearfix
    +{
    +	height: 1%;
    +}
    +
    +.clearfix
    +{
    +	display: block;
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/css/jquery-ui.css b/src/main/webapp/plug-in/datatables/thems/black/css/jquery-ui.css
    new file mode 100644
    index 00000000..63dd2444
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/css/jquery-ui.css
    @@ -0,0 +1,566 @@
    +/*
    + * jQuery UI CSS Framework 1.8.17
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Theming/API
    + */
    +
    +/* Layout helpers
    +----------------------------------*/
    +.ui-helper-hidden { display: none; }
    +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
    +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
    +.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
    +.ui-helper-clearfix:after { clear: both; }
    +.ui-helper-clearfix { zoom: 1; }
    +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
    +
    +
    +/* Interaction Cues
    +----------------------------------*/
    +.ui-state-disabled { cursor: default !important; }
    +
    +
    +/* Icons
    +----------------------------------*/
    +
    +/* states and images */
    +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
    +
    +
    +/* Misc visuals
    +----------------------------------*/
    +
    +/* Overlays */
    +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
    +
    +
    +/*
    + * jQuery UI CSS Framework 1.8.17
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Theming/API
    + *
    + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
    + */
    +
    +
    +/* Component containers
    +----------------------------------*/
    +.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
    +.ui-widget .ui-widget { font-size: 1em; }
    +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
    +.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(../img/ui/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
    +.ui-widget-content a { color: #222222; }
    +.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(../img/ui/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
    +.ui-widget-header a { color: #222222; }
    +
    +/* Interaction states
    +----------------------------------*/
    +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { /* border: 1px solid #d3d3d3; background: #e6e6e6 url(../img/ui/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; */ }
    +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
    +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { /* border: 1px solid #999999; background: #dadada url(../img/ui/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; */ }
    +.ui-state-hover a, .ui-state-hover a:hover { /* color: #212121; text-decoration: none; */ }
    +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(../img/ui/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
    +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
    +.ui-widget :active { outline: none; }
    +
    +/* Interaction Cues
    +----------------------------------*/
    +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1; background: #fbf9ee url(../img/ui/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
    +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
    +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(../img/ui/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
    +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
    +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
    +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
    +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
    +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
    +
    +/* Icons
    +----------------------------------*/
    +
    +/* states and images */
    +.ui-icon { width: 16px; height: 16px; background-image: url(../img/ui/ui-icons_222222_256x240.png); }
    +.ui-widget-content .ui-icon {background-image: url(../img/ui/ui-icons_222222_256x240.png); }
    +.ui-widget-header .ui-icon {background-image: url(../img/ui/ui-icons_222222_256x240.png); }
    +.ui-state-default .ui-icon { background-image: url(../img/ui/ui-icons_888888_256x240.png); }
    +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon { /* background-image: url(../img/ui/ui-icons_454545_256x240.png); */ }
    +.ui-state-active .ui-icon {background-image: url(../img/ui/ui-icons_454545_256x240.png); }
    +.ui-state-highlight .ui-icon {background-image: url(../img/ui/ui-icons_2e83ff_256x240.png); }
    +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(../img/ui/ui-icons_cd0a0a_256x240.png); }
    +
    +/* positioning */
    +.ui-icon-carat-1-n { background-position: 0 0; }
    +.ui-icon-carat-1-ne { background-position: -16px 0; }
    +.ui-icon-carat-1-e { background-position: -32px 0; }
    +.ui-icon-carat-1-se { background-position: -48px 0; }
    +.ui-icon-carat-1-s { background-position: -64px 0; }
    +.ui-icon-carat-1-sw { background-position: -80px 0; }
    +.ui-icon-carat-1-w { background-position: -96px 0; }
    +.ui-icon-carat-1-nw { background-position: -112px 0; }
    +.ui-icon-carat-2-n-s { background-position: -128px 0; }
    +.ui-icon-carat-2-e-w { background-position: -144px 0; }
    +.ui-icon-triangle-1-n { background-position: 0 -16px; }
    +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
    +.ui-icon-triangle-1-e { background-position: -32px -16px; }
    +.ui-icon-triangle-1-se { background-position: -48px -16px; }
    +.ui-icon-triangle-1-s { background-position: -64px -16px; }
    +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
    +.ui-icon-triangle-1-w { background-position: -96px -16px; }
    +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
    +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
    +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
    +.ui-icon-arrow-1-n { background-position: 0 -32px; }
    +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
    +.ui-icon-arrow-1-e { background-position: -32px -32px; }
    +.ui-icon-arrow-1-se { background-position: -48px -32px; }
    +.ui-icon-arrow-1-s { background-position: -64px -32px; }
    +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
    +.ui-icon-arrow-1-w { background-position: -96px -32px; }
    +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
    +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
    +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
    +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
    +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
    +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
    +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
    +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
    +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
    +.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
    +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
    +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
    +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
    +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
    +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
    +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
    +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
    +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
    +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
    +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
    +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
    +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
    +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
    +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
    +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
    +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
    +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
    +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
    +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
    +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
    +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
    +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
    +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
    +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
    +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
    +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
    +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
    +.ui-icon-arrow-4 { background-position: 0 -80px; }
    +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
    +.ui-icon-extlink { background-position: -32px -80px; }
    +.ui-icon-newwin { background-position: -48px -80px; }
    +.ui-icon-refresh { background-position: -64px -80px; }
    +.ui-icon-shuffle { background-position: -80px -80px; }
    +.ui-icon-transfer-e-w { background-position: -96px -80px; }
    +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
    +.ui-icon-folder-collapsed { background-position: 0 -96px; }
    +.ui-icon-folder-open { background-position: -16px -96px; }
    +.ui-icon-document { background-position: -32px -96px; }
    +.ui-icon-document-b { background-position: -48px -96px; }
    +.ui-icon-note { background-position: -64px -96px; }
    +.ui-icon-mail-closed { background-position: -80px -96px; }
    +.ui-icon-mail-open { background-position: -96px -96px; }
    +.ui-icon-suitcase { background-position: -112px -96px; }
    +.ui-icon-comment { background-position: -128px -96px; }
    +.ui-icon-person { background-position: -144px -96px; }
    +.ui-icon-print { background-position: -160px -96px; }
    +.ui-icon-trash { background-position: -176px -96px; }
    +.ui-icon-locked { background-position: -192px -96px; }
    +.ui-icon-unlocked { background-position: -208px -96px; }
    +.ui-icon-bookmark { background-position: -224px -96px; }
    +.ui-icon-tag { background-position: -240px -96px; }
    +.ui-icon-home { background-position: 0 -112px; }
    +.ui-icon-flag { background-position: -16px -112px; }
    +.ui-icon-calendar { background-position: -32px -112px; }
    +.ui-icon-cart { background-position: -48px -112px; }
    +.ui-icon-pencil { background-position: -64px -112px; }
    +.ui-icon-clock { background-position: -80px -112px; }
    +.ui-icon-disk { background-position: -96px -112px; }
    +.ui-icon-calculator { background-position: -112px -112px; }
    +.ui-icon-zoomin { background-position: -128px -112px; }
    +.ui-icon-zoomout { background-position: -144px -112px; }
    +.ui-icon-search { background-position: -160px -112px; }
    +.ui-icon-wrench { background-position: -176px -112px; }
    +.ui-icon-gear { background-position: -192px -112px; }
    +.ui-icon-heart { background-position: -208px -112px; }
    +.ui-icon-star { background-position: -224px -112px; }
    +.ui-icon-link { background-position: -240px -112px; }
    +.ui-icon-cancel { background-position: 0 -128px; }
    +.ui-icon-plus { background-position: -16px -128px; }
    +.ui-icon-plusthick { background-position: -32px -128px; }
    +.ui-icon-minus { background-position: -48px -128px; }
    +.ui-icon-minusthick { background-position: -64px -128px; }
    +.ui-icon-close { background-position: -80px -128px; }
    +.ui-icon-closethick { background-position: -96px -128px; }
    +.ui-icon-key { background-position: -112px -128px; }
    +.ui-icon-lightbulb { background-position: -128px -128px; }
    +.ui-icon-scissors { background-position: -144px -128px; }
    +.ui-icon-clipboard { background-position: -160px -128px; }
    +.ui-icon-copy { background-position: -176px -128px; }
    +.ui-icon-contact { background-position: -192px -128px; }
    +.ui-icon-image { background-position: -208px -128px; }
    +.ui-icon-video { background-position: -224px -128px; }
    +.ui-icon-script { background-position: -240px -128px; }
    +.ui-icon-alert { background-position: 0 -144px; }
    +.ui-icon-info { background-position: -16px -144px; }
    +.ui-icon-notice { background-position: -32px -144px; }
    +.ui-icon-help { background-position: -48px -144px; }
    +.ui-icon-check { background-position: -64px -144px; }
    +.ui-icon-bullet { background-position: -80px -144px; }
    +.ui-icon-radio-off { background-position: -96px -144px; }
    +.ui-icon-radio-on { background-position: -112px -144px; }
    +.ui-icon-pin-w { background-position: -128px -144px; }
    +.ui-icon-pin-s { background-position: -144px -144px; }
    +.ui-icon-play { background-position: 0 -160px; }
    +.ui-icon-pause { background-position: -16px -160px; }
    +.ui-icon-seek-next { background-position: -32px -160px; }
    +.ui-icon-seek-prev { background-position: -48px -160px; }
    +.ui-icon-seek-end { background-position: -64px -160px; }
    +.ui-icon-seek-start { background-position: -80px -160px; }
    +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
    +.ui-icon-seek-first { background-position: -80px -160px; }
    +.ui-icon-stop { background-position: -96px -160px; }
    +.ui-icon-eject { background-position: -112px -160px; }
    +.ui-icon-volume-off { background-position: -128px -160px; }
    +.ui-icon-volume-on { background-position: -144px -160px; }
    +.ui-icon-power { background-position: 0 -176px; }
    +.ui-icon-signal-diag { background-position: -16px -176px; }
    +.ui-icon-signal { background-position: -32px -176px; }
    +.ui-icon-battery-0 { background-position: -48px -176px; }
    +.ui-icon-battery-1 { background-position: -64px -176px; }
    +.ui-icon-battery-2 { background-position: -80px -176px; }
    +.ui-icon-battery-3 { background-position: -96px -176px; }
    +.ui-icon-circle-plus { background-position: 0 -192px; }
    +.ui-icon-circle-minus { background-position: -16px -192px; }
    +.ui-icon-circle-close { background-position: -32px -192px; }
    +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
    +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
    +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
    +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
    +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
    +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
    +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
    +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
    +.ui-icon-circle-zoomin { background-position: -176px -192px; }
    +.ui-icon-circle-zoomout { background-position: -192px -192px; }
    +.ui-icon-circle-check { background-position: -208px -192px; }
    +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
    +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
    +.ui-icon-circlesmall-close { background-position: -32px -208px; }
    +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
    +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
    +.ui-icon-squaresmall-close { background-position: -80px -208px; }
    +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
    +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
    +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
    +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
    +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
    +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
    +
    +
    +/* Misc visuals
    +----------------------------------*/
    +
    +/* Corner radius */
    +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
    +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
    +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
    +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
    +
    +/* Overlays */
    +.ui-widget-overlay { background: #aaaaaa url(../img/ui/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; }
    +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(../img/ui/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
    + * jQuery UI Resizable 1.8.17
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Resizable#theming
    + */
    +.ui-resizable { position: relative;}
    +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
    +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
    +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
    +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
    +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
    +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
    +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
    +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
    +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
    +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
    + * jQuery UI Selectable 1.8.17
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Selectable#theming
    + */
    +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
    +/*
    + * jQuery UI Accordion 1.8.17
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Accordion#theming
    + */
    +/* IE/Win - Fix animation bug - #4615 */
    +.ui-accordion { width: 100%; }
    +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
    +.ui-accordion .ui-accordion-li-fix { display: inline; }
    +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
    +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
    +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
    +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
    +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
    +.ui-accordion .ui-accordion-content-active { display: block; }
    +/*
    + * jQuery UI Autocomplete 1.8.17
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Autocomplete#theming
    + */
    +.ui-autocomplete { position: absolute; cursor: default; }	
    +
    +/* workarounds */
    +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
    +
    +/*
    + * jQuery UI Menu 1.8.17
    + *
    + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Menu#theming
    + */
    +.ui-menu {
    +	list-style:none;
    +	padding: 2px;
    +	margin: 0;
    +	display:block;
    +	float: left;
    +}
    +.ui-menu .ui-menu {
    +	margin-top: -3px;
    +}
    +.ui-menu .ui-menu-item {
    +	margin:0;
    +	padding: 0;
    +	zoom: 1;
    +	float: left;
    +	clear: left;
    +	width: 100%;
    +}
    +.ui-menu .ui-menu-item a {
    +	text-decoration:none;
    +	display:block;
    +	padding:.2em .4em;
    +	line-height:1.5;
    +	zoom:1;
    +}
    +.ui-menu .ui-menu-item a.ui-state-hover,
    +.ui-menu .ui-menu-item a.ui-state-active {
    +	font-weight: normal;
    +	margin: -1px;
    +}
    +/*
    + * jQuery UI Button 1.8.17
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Button#theming
    + */
    +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
    +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
    +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
    +.ui-button-icons-only { width: 3.4em; } 
    +button.ui-button-icons-only { width: 3.7em; } 
    +
    +/*button text element */
    +.ui-button .ui-button-text { display: block; line-height: 1.4;  }
    +.ui-button-text-only .ui-button-text { /* padding: .4em 1em; */ }
    +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
    +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
    +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
    +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
    +/* no icon support for input elements, provide padding by default */
    +input.ui-button { /* padding: .4em 1em; */ }
    +
    +/*button icon element(s) */
    +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
    +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
    +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
    +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
    +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
    +
    +/*button sets*/
    +.ui-buttonset { margin-right: 7px; }
    +.ui-buttonset .ui-button { margin-right: 0; }
    +
    +/* workarounds */
    +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
    +/*
    + * jQuery UI Dialog 1.8.17
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Dialog#theming
    + */
    +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
    +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
    +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
    +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
    +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
    +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { /* padding: 0; */ }
    +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
    +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
    +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
    +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
    +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
    +.ui-draggable .ui-dialog-titlebar { cursor: move; }
    +/*
    + * jQuery UI Slider 1.8.17
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Slider#theming
    + */
    +.ui-slider { position: relative; text-align: left; }
    +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 24px; height: 24px; cursor: default; }
    +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
    +
    +.ui-slider-horizontal { height: .8em; }
    +.ui-slider-horizontal .ui-slider-handle { top: -4px; margin-left: -8px; }
    +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
    +.ui-slider-horizontal .ui-slider-range-min { left: 0; }
    +.ui-slider-horizontal .ui-slider-range-max { right: 0; }
    +
    +.ui-slider-vertical { width: .8em; height: 100px; }
    +.ui-slider-vertical .ui-slider-handle { left: -4px; margin-left: 0; margin-bottom: -16px; }
    +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
    +.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
    +.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
    + * jQuery UI Tabs 1.8.17
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Tabs#theming
    + */
    +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
    +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
    +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; left: 8px; margin: 0 .2em 0 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
    +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
    +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
    +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
    +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
    +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
    +.ui-tabs .ui-tabs-hide { display: none !important; }
    +/*
    + * jQuery UI Datepicker 1.8.17
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Datepicker#theming
    + */
    +.ui-datepicker { width: 160px; /* padding: .2em .2em 0; */ margin-top: -6px; display: none; }
    +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 1px; }
    +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
    +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { /* top: 1px; */ }
    +.ui-datepicker .ui-datepicker-prev { left:2px; }
    +.ui-datepicker .ui-datepicker-next { right:2px; }
    +.ui-datepicker .ui-datepicker-prev-hover { /*left:1px; */ }
    +.ui-datepicker .ui-datepicker-next-hover { /*right:1px; */ }
    +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
    +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
    +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
    +.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
    +.ui-datepicker select.ui-datepicker-month, 
    +.ui-datepicker select.ui-datepicker-year { width: 49%;}
    +.ui-datepicker table {width: 100%; font-size: 10px; border-collapse: collapse; margin:0 0 .4em; }
    +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
    +.ui-datepicker td { border: 0; padding: 1px; }
    +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
    +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
    +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
    +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
    +.ui-datepicker td .ui-state-highlight { border: none; background: #ccc; }
    +
    +/* with multiple calendars */
    +.ui-datepicker.ui-datepicker-multi { width:auto; }
    +.ui-datepicker-multi .ui-datepicker-group { float:left; }
    +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
    +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
    +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
    +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
    +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
    +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
    +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
    +.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
    +
    +/* RTL support */
    +.ui-datepicker-rtl { direction: rtl; }
    +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
    +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
    +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
    +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
    +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
    +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
    +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
    +.ui-datepicker-rtl .ui-datepicker-group { float:right; }
    +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
    +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
    +
    +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
    +.ui-datepicker-cover {
    +    display: none; /*sorry for IE5*/
    +    display/**/: block; /*sorry for IE5*/
    +    position: absolute; /*must have*/
    +    z-index: -1; /*must have*/
    +    filter: mask(); /*must have*/
    +    top: -4px; /*must have*/
    +    left: -4px; /*must have*/
    +    width: 200px; /*must have*/
    +    height: 200px; /*must have*/
    +}/*
    + * jQuery UI Progressbar 1.8.17
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Progressbar#theming
    + */
    +.ui-progressbar { height:2em; text-align: left; overflow: hidden; }
    +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/css/master.css b/src/main/webapp/plug-in/datatables/thems/black/css/master.css
    new file mode 100644
    index 00000000..0447977f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/css/master.css
    @@ -0,0 +1,9 @@
    +@import url('reset.css');
    +@import url('grid.css');
    +@import url('tipTip.css');
    +@import url('jquery-ui.css');
    +@import url('ad.css');
    +@import url('sticky.full.css');
    +@import url('colorpicker.css');
    +/* For demonstrational purposes, should be removed */
    +@import url('demo.css');
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/css/reset.css b/src/main/webapp/plug-in/datatables/thems/black/css/reset.css
    new file mode 100644
    index 00000000..6f043379
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/css/reset.css
    @@ -0,0 +1,55 @@
    +html, body, div, span, applet, object, iframe,
    +h1, h2, h3, h4, h5, h6, p, blockquote, pre,
    +a, abbr, acronym, address, big, cite, code,
    +del, dfn, em, img, ins, kbd, q, s, samp,
    +small, strike, strong, sub, sup, tt, var,
    +b, u, i, center,
    +dl, dt, dd, ol, ul, li,
    +fieldset, form, label, legend,
    +table, caption, tbody, tfoot, thead, tr, th, td,
    +article, aside, canvas, details, embed, 
    +figure, figcaption, footer, header, hgroup, 
    +menu, nav, output, ruby, section, summary,
    +time, mark, audio, video {
    +	margin: 0;
    +	padding: 0;
    +	border: 0;
    +	font-size: 100%;
    +	font-family: 'Open Sans', sans-serif;
    +	text-decoration: none;
    +}
    +
    +article, aside, details, figcaption, figure, 
    +footer, header, hgroup, menu, nav, section {
    +	display: block;
    +}
    +body {
    +	line-height: 1;
    +}
    +
    +html, body {
    +	min-height: 100%;
    +	height: 100%;
    +	overflow: visible;
    +}
    +
    +ol, ul {
    +	list-style: none;
    +}
    +blockquote, q {
    +	quotes: none;
    +}
    +
    +blockquote:before, blockquote:after,
    +q:before, q:after {
    +	content: '';
    +	content: none;
    +}
    +
    +table {
    +	border-collapse: collapse;
    +	border-spacing: 0;
    +}
    +a {
    +   outline: 0;
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/css/sticky.full.css b/src/main/webapp/plug-in/datatables/thems/black/css/sticky.full.css
    new file mode 100644
    index 00000000..bba32e3b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/css/sticky.full.css
    @@ -0,0 +1,64 @@
    +div.sticky-queue
    +	{ 
    +	position:fixed;
    +	background:#fff;
    +	border:1px solid #999;
    +	box-shadow:0px 0px 5px #bbb;
    +	-moz-box-shadow:0px 0px 5px #bbb;
    +	-webkit-box-shadow:0px 0px 5px #bbb;
    +	width: 200px;
    +	}
    +div.sticky-note
    +	{ padding-right:20px; }
    +div.sticky
    +	{
    +	font-size:12px;
    +	color:#292929;
    +	display:none;
    +	padding:10px;
    +	position:relative;
    +	}
    +img.sticky-close
    +	{
    +	position:absolute;
    +	top:10px;
    +	right:10px;
    +	height:14px;
    +	width:14px;
    +	cursor:pointer;
    +	}
    +	
    +	
    +.top-right
    +	{ right:20px; }
    +.top-left
    +	{ left:20px; }
    +.top-right, .top-left
    +	{
    +	top:-2px;
    +	border-bottom-right-radius:6px;
    +	border-bottom-left-radius:6px;
    +	-moz-border-radius-bottomright:6px;
    +	-moz-border-radius-bottomleft:6px;
    +	-webkit-border-bottom-right-radius:6px;
    +	-webkit-border-bottom-left-radius:6px;
    +	}
    +.bottom-right
    +	{ right:20px; }
    +.bottom-left
    +	{ left:20px; }
    +.bottom-right, .bottom-left
    +	{
    +	bottom:-2px;
    +	border-top-right-radius:6px;
    +	border-top-left-radius:6px;
    +	-moz-border-radius-topright:6px;
    +	-moz-border-radius-topleft:6px;
    +	-webkit-border-top-right-radius:6px;
    +	-webkit-border-top-left-radius:6px;
    +	}
    +
    +.border-top-right, .border-top-left
    +	{ border-top:1px solid #999; }
    +.border-bottom-right, .border-bottom-left
    +	{ border-bottom:1px solid #999; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/css/tables.css b/src/main/webapp/plug-in/datatables/thems/black/css/tables.css
    new file mode 100644
    index 00000000..27e7199e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/css/tables.css
    @@ -0,0 +1,356 @@
    +
    +/* DataTables Styling */
    +
    +table { font-size: 12px; }
    +
    +table.dataTable {
    +	margin: 0 auto;
    +	clear: both;
    +	width: 100%;
    +}
    +
    +table.dataTable thead th {
    +	padding: 3px 18px 3px 10px;
    +	font-weight: bold;
    +	cursor: pointer;
    +}
    +
    +table.dataTable tfoot th {
    +	padding: 3px 18px 3px 10px;
    +	border-top: 1px solid black;
    +	font-weight: bold;
    +}
    +
    +table.dataTable td {
    +	padding: 3px 10px;
    +}
    +
    +table.dataTable td.center,
    +table.dataTable td.dataTables_empty {
    +	text-align: center;
    +}
    +
    +table.dataTable tr.odd { background-color: #fff; }
    +table.dataTable tr.even { background-color: #f6f6f6; }
    +table.dataTable td { padding: 8px 10px; border-right: 1px solid #ccc; }
    +table.dataTable tr.odd:hover, table.dataTable tr.even:hover { background-color: #ddd; }
    +table.dataTable thead th { border-right: 1px solid #ccc; }
    +table.dataTable thead th:last-of-type { border-right: none; }
    +
    +/* Commented out to simplify
    +
    +table.dataTable tr.odd td.sorting_1 { background-color: #D3D6FF; }
    +table.dataTable tr.odd td.sorting_2 { background-color: #DADCFF; }
    +table.dataTable tr.odd td.sorting_3 { background-color: #E0E2FF; }
    +table.dataTable tr.even td.sorting_1 { background-color: #EAEBFF; }
    +table.dataTable tr.even td.sorting_2 { background-color: #F2F3FF; }
    +table.dataTable tr.even td.sorting_3 { background-color: #F9F9FF; }
    +
    +*/
    +
    +
    +/*
    + * Table wrapper
    + */
    +.dataTables_wrapper {
    +	position: relative;
    +	clear: both;
    +	zoom: 1;
    +}
    +
    +
    +/*
    + * Page length menu
    + */
    +.dataTables_length {
    +	float: left;
    +}
    +
    +
    +/*
    + * Filter
    + */
    +.dataTables_filter {
    +	float: right;
    +	text-align: right;
    +}
    +
    +
    +/*
    + * Table information
    + */
    +.dataTables_info {
    +	margin: 12px;
    +	clear: both;
    +	float: left;
    +	color: #292929 !important;
    +	text-shadow: 0 1px 0 #fff;
    +	font-size: 10px;
    +	font-weight: 400;
    +}
    +
    +
    +/*
    + * Pagination
    + */
    +.dataTables_paginate {
    +	margin-top: 6px;
    +	float: right;
    +	text-align: right;
    +}
    +
    +/* Two button pagination - previous / next */
    +.paginate_disabled_previous,
    +.paginate_enabled_previous,
    +.paginate_disabled_next,
    +.paginate_enabled_next {
    +	height: 19px;
    +	float: left;
    +	cursor: pointer;
    +	color: #292929 !important;
    +	text-shadow: 0 1px 0 #fff;
    +}
    +.paginate_disabled_previous:hover,
    +.paginate_enabled_previous:hover,
    +.paginate_disabled_next:hover,
    +.paginate_enabled_next:hover {
    +	text-decoration: none !important;
    +}
    +.paginate_disabled_previous:active,
    +.paginate_enabled_previous:active,
    +.paginate_disabled_next:active,
    +.paginate_enabled_next:active {
    +	outline: none;
    +}
    +
    +.paginate_disabled_previous,
    +.paginate_disabled_next {
    +	color: #666 !important;
    +}
    +.paginate_disabled_previous,
    +.paginate_enabled_previous {
    +	padding-left: 23px;
    +}
    +.paginate_disabled_next,
    +.paginate_enabled_next {
    +	padding-right: 23px;
    +	margin-left: 10px;
    +}
    +
    +.paginate_enabled_previous { background: url('../images/back_enabled.png') no-repeat top left; }
    +.paginate_enabled_previous:hover { background: url('../images/back_enabled_hover.png') no-repeat top left; }
    +.paginate_disabled_previous { background: url('../images/back_disabled.png') no-repeat top left; }
    +
    +.paginate_enabled_next { background: url('../images/forward_enabled.png') no-repeat top right; }
    +.paginate_enabled_next:hover { background: url('../images/forward_enabled_hover.png') no-repeat top right; }
    +.paginate_disabled_next { background: url('../images/forward_disabled.png') no-repeat top right; }
    +
    +/* Full number pagination */
    +
    +.paging_full_numbers a:active {
    +	outline: none
    +}
    +.paging_full_numbers a:hover {
    +	text-decoration: none;
    +}
    +
    +.paging_full_numbers a.paginate_button,
    +.paging_full_numbers a.paginate_active {
    +	border: 1px solid #aaa;
    +	padding: 2px 20px;
    +	margin: 0 3px;
    +	cursor: pointer;
    +	color: #333 !important;
    +}
    +
    +.paging_full_numbers a.paginate_button {
    +	background-color: #ddd;
    +}
    +
    +.paging_full_numbers a.paginate_button:hover {
    +	background-color: #ccc;
    +	text-decoration: none !important;
    +}
    +
    +.paging_full_numbers a.paginate_active {
    +	background-color: #99B3FF;
    +}
    +
    +
    +/*
    + * Processing indicator
    + */
    +.dataTables_processing {
    +	position: absolute;
    +	top: 50%;
    +	left: 50%;
    +	width: 250px;
    +	height: 30px;
    +	margin-left: -125px;
    +	margin-top: -15px;
    +	padding: 14px 0 2px 0;
    +	border: 1px solid #ddd;
    +	text-align: center;
    +	color: #999;
    +	font-size: 14px;
    +	background-color: white;
    +}
    +
    +
    +table.dataTable th:active {
    +	outline: none;
    +}
    +
    +/*
    + * Scrolling
    + */
    +.dataTables_scroll {
    +	clear: both;
    +}
    +
    +.dataTables_scrollBody {
    +	margin-top: -1px;
    +}
    +
    +
    +/*
    +==============================================
    += ADMINITY TABLE & DATA TABLE CUSTOM STYLING =
    +==============================================
    +*/
    +
    +
    +/* GENERAL */
    +
    +table thead tr {
    +	background-image: url(../img/grad-overlay.png);
    +	height: 30px; 
    +}
    +table thead th {
    +	border-right: 1px solid #ccc;
    +	color: #292929;
    +	text-shadow: 0 1px 0 #fff;
    +	font-size: 12px; 
    +}
    +table thead th:last-of-type { border-right: none; }
    +table tbody {
    +	border-top: 1px solid #bbb;
    +	border-bottom: 1px solid #bbb;
    +}
    +table tr.odd { background-color: #fff; }
    +table tr.even { background-color: #f6f6f6; }
    +table td { padding: 8px 10px; border-right: 1px solid #ccc; }
    +table tbody tr:hover { background-color: #ddd; }
    +
    +.display { width: 100%; }
    +
    +/* TOOLBAR */
    +
    +.fg-toolbar {
    +	background: url(../img/grad-overlay.png) #eee;
    +	border: none;
    +	border-radius: 0 0 2px 2px;
    +}
    +.table-toolbar {
    +	height: 30px;
    +	border-bottom: 1px solid #ccc;
    +	background: url(../img/grad-overlay.png) #eee;
    +}
    +.table-toolbar li {
    +	height: 30px;
    +	border-right: 1px solid #ccc;
    +	float: left;
    +}
    +.table-toolbar li a {
    +	color: #292929;
    +	font-size: 12px;
    +	position: relative;
    +	top: 4px;
    +	padding: 7px 10px;
    +	text-shadow: 0 1px 0 #fff;
    +}
    +.table-toolbar img {
    +	position: relative;
    +	top: 3px;
    +}
    +
    +/* WRAPPER AND CONTENT */
    +
    +.DataTables_sort_wrapper {
    +	padding: 4px 0;
    +	position: relative;
    +}
    +.DataTables_sort_wrapper span {
    +	position: absolute;
    +	top: 50%;
    +	margin-top: -8px;
    +}
    +
    +.dataTables_wrapper {position: relative;}
    +.dataTables_filter, .dataTables_length {
    +	position: absolute;
    +	top: -25px;
    +	right: 8px;
    +	display: inline-block;
    +    color: #ddd;
    +    height: 17px;
    +}
    +.dataTables_length {margin-right: 170px; }
    +.table-toolbar + .dataTables_wrapper .dataTables_filter,
    +.table-toolbar + .dataTables_wrapper .dataTables_length {
    +	color: #292929;
    +	text-shadow: 0 1px 0 #fff;
    +	font-size: 12px;
    +}
    +.dataTables_wrapper .dataTables_filter,
    +.dataTables_wrapper .dataTables_length {
    +	color: #ddd;
    +	text-shadow: 0 1px 0 #222;
    +	font-size: 12px;
    +}
    +.dataTables_wrapper input {
    +	padding: 1px !important;
    +	box-shadow: none !important;
    +}
    +.dataTables_wrapper select {
    +	padding: 0;
    +	box-shadow: none !important;
    +}
    +.table-toolbar + .dataTables_wrapper.dataTables_filter input,
    +.table-toolbar + .dataTables_wrapper.dataTables_length select {
    +	background-color: #eee;
    +	border: 1px solid #bbb;
    +	border-radius: 2px;
    +}
    +
    +.dataTables_wrapper .dataTables_filter input,
    +.dataTables_wrapper .dataTables_length select {
    +	background-color: #ddd;
    +	border: 1px solid #bbb;
    +	border-radius: 2px;
    +}
    +
    +.dataTables_paginate .fg-button {
    +	background: url(../img/grad-overlay-s.png) #ddd;
    +	padding: 5px 7px;
    +	font-weight: 400;
    +	font-size: 10px;
    +	color: #292929;
    +	text-shadow: 0 1px 0 #eee;
    +}
    +.dataTables_paginate.paging_two_button { border: none !important; }
    +.paging_two_button .fg-button {
    +	background: url(../img/grad-overlay-s.png) #ddd;
    +	padding: 2px 4px;
    +	border: 1px solid #bbb;
    +}
    +.dataTables_paginate .fg-button:hover { background-color: #ccc; }
    +.dataTables_paginate {
    +	border: 1px solid #bbb;
    +	border-radius: 2px;
    +}
    +
    +/* For preventing interference with the jQuery Flot chart legends */
    +
    +.legendColorBox, .legendLabel { padding: 1px 2px; border: none; }
    +
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/css/tipTip.css b/src/main/webapp/plug-in/datatables/thems/black/css/tipTip.css
    new file mode 100644
    index 00000000..7d7b4fa2
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/css/tipTip.css
    @@ -0,0 +1,87 @@
    +/* TipTip CSS - Version 1.2 */
    +
    +#tiptip_holder {
    +	display: none;
    +	position: absolute;
    +	top: 0;
    +	left: 0;
    +	z-index: 99999;
    +}
    +
    +#tiptip_holder.tip_top {
    +	padding-bottom: 5px;
    +}
    +
    +#tiptip_holder.tip_bottom {
    +	padding-top: 5px;
    +}
    +
    +#tiptip_holder.tip_right {
    +	padding-left: 5px;
    +}
    +
    +#tiptip_holder.tip_left {
    +	padding-right: 5px;
    +}
    +
    +#tiptip_content {
    +	font-size: 10px;
    +	color: #fff;
    +	text-shadow: 0 0 2px #000;
    +	padding: 4px 8px;
    +	background-color: rgb(25,25,25);
    +	background-color: rgba(25,25,25,0.8);
    +	background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));
    +	border-radius: 2px;
    +}
    +
    +#tiptip_arrow, #tiptip_arrow_inner {
    +	position: absolute;
    +	border-color: transparent;
    +	border-style: solid;
    +	border-width: 6px;
    +	height: 0;
    +	width: 0;
    +}
    +
    +#tiptip_holder.tip_top #tiptip_arrow_inner {
    +	margin-top: -7px;
    +	margin-left: -6px;
    +	border-top-color: rgb(25,25,25);
    +	border-top-color: rgba(25,25,25,0.92);
    +}
    +
    +#tiptip_holder.tip_bottom #tiptip_arrow_inner {
    +	margin-top: -5px;
    +	margin-left: -6px;
    +	border-bottom-color: rgb(25,25,25);
    +	border-bottom-color: rgba(25,25,25,0.92);
    +}
    +
    +#tiptip_holder.tip_right #tiptip_arrow_inner {
    +	margin-top: -6px;
    +	margin-left: -5px;
    +	border-right-color: rgb(25,25,25);
    +	border-right-color: rgba(25,25,25,0.92);
    +}
    +
    +#tiptip_holder.tip_left #tiptip_arrow_inner {
    +	margin-top: -6px;
    +	margin-left: -7px;
    +	border-left-color: rgb(25,25,25);
    +	border-left-color: rgba(25,25,25,0.92);
    +}
    +
    +/* Webkit Hacks  */
    +@media screen and (-webkit-min-device-pixel-ratio:0) {	
    +	#tiptip_content {
    +		padding: 4px 8px 5px 8px;
    +		background-color: rgba(45,45,45,0.88);
    +	}
    +	#tiptip_holder.tip_bottom #tiptip_arrow_inner { 
    +		border-bottom-color: rgba(45,45,45,0.88);
    +	}
    +	#tiptip_holder.tip_top #tiptip_arrow_inner { 
    +		border-top-color: rgba(20,20,20,0.92);
    +	}
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/bkg-pat.png b/src/main/webapp/plug-in/datatables/thems/black/img/bkg-pat.png
    new file mode 100644
    index 00000000..8b828ace
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/bkg-pat.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/close.png b/src/main/webapp/plug-in/datatables/thems/black/img/close.png
    new file mode 100644
    index 00000000..3823c6e4
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/close.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/grad-overlay-s.png b/src/main/webapp/plug-in/datatables/thems/black/img/grad-overlay-s.png
    new file mode 100644
    index 00000000..4f73352f
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/grad-overlay-s.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/grad-overlay.png b/src/main/webapp/plug-in/datatables/thems/black/img/grad-overlay.png
    new file mode 100644
    index 00000000..5d3041f1
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/grad-overlay.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/delete.png b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/delete.png
    new file mode 100644
    index 00000000..3e94d7c9
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/delete.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/down.png b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/down.png
    new file mode 100644
    index 00000000..81758987
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/down.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/logo.png b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/logo.png
    new file mode 100644
    index 00000000..711c1355
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/logo.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/plus.png b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/plus.png
    new file mode 100644
    index 00000000..1b218367
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/plus.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/print.png b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/print.png
    new file mode 100644
    index 00000000..5e9bf5da
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/print.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/save.png b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/save.png
    new file mode 100644
    index 00000000..cd0162b6
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/save.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/up.png b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/up.png
    new file mode 100644
    index 00000000..f12a7b66
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/icons/basic/up.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/logo.png b/src/main/webapp/plug-in/datatables/thems/black/img/logo.png
    new file mode 100644
    index 00000000..711c1355
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/logo.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav-hover.png b/src/main/webapp/plug-in/datatables/thems/black/img/nav-hover.png
    new file mode 100644
    index 00000000..4687e5f5
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav-hover.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav/anlt.png b/src/main/webapp/plug-in/datatables/thems/black/img/nav/anlt.png
    new file mode 100644
    index 00000000..7e0b2d79
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav/anlt.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav/cal.png b/src/main/webapp/plug-in/datatables/thems/black/img/nav/cal.png
    new file mode 100644
    index 00000000..bb4b713d
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav/cal.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav/dash.png b/src/main/webapp/plug-in/datatables/thems/black/img/nav/dash.png
    new file mode 100644
    index 00000000..6a444388
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav/dash.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav/err.png b/src/main/webapp/plug-in/datatables/thems/black/img/nav/err.png
    new file mode 100644
    index 00000000..3fc3f63a
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav/err.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav/flm.png b/src/main/webapp/plug-in/datatables/thems/black/img/nav/flm.png
    new file mode 100644
    index 00000000..908b76c4
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav/flm.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav/gal.png b/src/main/webapp/plug-in/datatables/thems/black/img/nav/gal.png
    new file mode 100644
    index 00000000..3ccd71db
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav/gal.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav/grid.png b/src/main/webapp/plug-in/datatables/thems/black/img/nav/grid.png
    new file mode 100644
    index 00000000..49f1412e
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav/grid.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav/icn.png b/src/main/webapp/plug-in/datatables/thems/black/img/nav/icn.png
    new file mode 100644
    index 00000000..2a716985
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav/icn.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav/tb-active.png b/src/main/webapp/plug-in/datatables/thems/black/img/nav/tb-active.png
    new file mode 100644
    index 00000000..e38af4d0
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav/tb-active.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav/typ.png b/src/main/webapp/plug-in/datatables/thems/black/img/nav/typ.png
    new file mode 100644
    index 00000000..2be207e3
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav/typ.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav/usr-avatar.jpg b/src/main/webapp/plug-in/datatables/thems/black/img/nav/usr-avatar.jpg
    new file mode 100644
    index 00000000..e78ea982
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav/usr-avatar.jpg differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/nav/widgets.png b/src/main/webapp/plug-in/datatables/thems/black/img/nav/widgets.png
    new file mode 100644
    index 00000000..a40fdfb7
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/nav/widgets.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/notif-bg.jpg b/src/main/webapp/plug-in/datatables/thems/black/img/notif-bg.jpg
    new file mode 100644
    index 00000000..8f641dd9
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/notif-bg.jpg differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/pbar.png b/src/main/webapp/plug-in/datatables/thems/black/img/pbar.png
    new file mode 100644
    index 00000000..0fde5f4d
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/pbar.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/slider-hz.png b/src/main/webapp/plug-in/datatables/thems/black/img/slider-hz.png
    new file mode 100644
    index 00000000..ccb9f104
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/slider-hz.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/slider-vt.png b/src/main/webapp/plug-in/datatables/thems/black/img/slider-vt.png
    new file mode 100644
    index 00000000..98b9f289
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/slider-vt.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/img/styler-icon.png b/src/main/webapp/plug-in/datatables/thems/black/img/styler-icon.png
    new file mode 100644
    index 00000000..079cff59
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/black/img/styler-icon.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/js/excanvas.min.js b/src/main/webapp/plug-in/datatables/thems/black/js/excanvas.min.js
    new file mode 100644
    index 00000000..12c74f7b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/js/excanvas.min.js
    @@ -0,0 +1 @@
    +if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z<j.length;Z++){this.initElement(j[Z])}},initElement:function(i){if(!i.getContext){i.getContext=T;r(i.ownerDocument);i.innerHTML="";i.attachEvent("onpropertychange",S);i.attachEvent("onresize",w);var Z=i.attributes;if(Z.width&&Z.width.specified){i.style.width=Z.width.nodeValue+"px"}else{i.width=i.clientWidth}if(Z.height&&Z.height.specified){i.style.height=Z.height.nodeValue+"px"}else{i.height=i.clientHeight}}return i}};function S(i){var Z=i.srcElement;switch(i.propertyName){case"width":Z.getContext().clearRect();Z.style.width=Z.attributes.width.nodeValue+"px";Z.firstChild.style.width=Z.clientWidth+"px";break;case"height":Z.getContext().clearRect();Z.style.height=Z.attributes.height.nodeValue+"px";Z.firstChild.style.height=Z.clientHeight+"px";break}}function w(i){var Z=i.srcElement;if(Z.firstChild){Z.firstChild.style.width=Z.clientWidth+"px";Z.firstChild.style.height=Z.clientHeight+"px"}}E.init();var I=[];for(var AC=0;AC<16;AC++){for(var AB=0;AB<16;AB++){I[AC*16+AB]=AC.toString(16)+AB.toString(16)}}function V(){return[[1,0,0],[0,1,0],[0,0,1]]}function d(m,j){var i=V();for(var Z=0;Z<3;Z++){for(var AF=0;AF<3;AF++){var p=0;for(var AE=0;AE<3;AE++){p+=m[Z][AE]*j[AE][AF]}i[Z][AF]=p}}return i}function Q(i,Z){Z.fillStyle=i.fillStyle;Z.lineCap=i.lineCap;Z.lineJoin=i.lineJoin;Z.lineWidth=i.lineWidth;Z.miterLimit=i.miterLimit;Z.shadowBlur=i.shadowBlur;Z.shadowColor=i.shadowColor;Z.shadowOffsetX=i.shadowOffsetX;Z.shadowOffsetY=i.shadowOffsetY;Z.strokeStyle=i.strokeStyle;Z.globalAlpha=i.globalAlpha;Z.font=i.font;Z.textAlign=i.textAlign;Z.textBaseline=i.textBaseline;Z.arcScaleX_=i.arcScaleX_;Z.arcScaleY_=i.arcScaleY_;Z.lineScale_=i.lineScale_}var B={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function g(i){var m=i.indexOf("(",3);var Z=i.indexOf(")",m+1);var j=i.substring(m+1,Z).split(",");if(j.length==4&&i.substr(3,1)=="a"){alpha=Number(j[3])}else{j[3]=1}return j}function C(Z){return parseFloat(Z)/100}function N(i,j,Z){return Math.min(Z,Math.max(j,i))}function c(AF){var j,i,Z;h=parseFloat(AF[0])/360%360;if(h<0){h++}s=N(C(AF[1]),0,1);l=N(C(AF[2]),0,1);if(s==0){j=i=Z=l}else{var m=l<0.5?l*(1+s):l+s-l*s;var AE=2*l-m;j=A(AE,m,h+1/3);i=A(AE,m,h);Z=A(AE,m,h-1/3)}return"#"+I[Math.floor(j*255)]+I[Math.floor(i*255)]+I[Math.floor(Z*255)]}function A(i,Z,j){if(j<0){j++}if(j>1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" <g_vml_:group",' coordsize="',D*Z,",",D*AE,'"',' coordorigin="0,0"',' style="width:',Z,"px;height:",AE,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var p=[];p.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",K(AW.x/D),",","Dy=",K(AW.y/D),"");var AS=AW;var AR=this.getCoords_(AH+AJ,AF);var AP=this.getCoords_(AH,AF+AV);var AL=this.getCoords_(AH+AJ,AF+AV);AS.x=z.max(AS.x,AR.x,AP.x,AL.x);AS.y=z.max(AS.y,AR.y,AP.y,AL.y);AU.push("padding:0 ",K(AS.x/D),"px ",K(AS.y/D),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",p.join(""),", sizingmethod='clip');")}else{AU.push("top:",K(AW.y/D),"px;left:",K(AW.x/D),"px;")}AU.push(' ">','<g_vml_:image src="',AO.src,'"',' style="width:',D*AJ,"px;"," height:",D*AV,'px"',' cropleft="',AM/AG,'"',' croptop="',AK/AT,'"',' cropright="',(AG-AM-AQ)/AG,'"',' cropbottom="',(AT-AK-AX)/AT,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AH<this.currentPath_.length;AH+=AE){var AK=[];var AF=false;AK.push("<g_vml_:shape",' filled="',!!AM,'"',' style="position:absolute;width:',m,"px;height:",AN,'px;"',' coordorigin="0,0"',' coordsize="',D*m,",",D*AN,'"',' stroked="',!AM,'"',' path="');var AO=false;for(var AI=AH;AI<Math.min(AH+AE,this.currentPath_.length);AI++){if(AI%AE==0&&AI>0){AK.push(" m ",K(this.currentPath_[AI-1].x),",",K(this.currentPath_[AI-1].y))}var Z=this.currentPath_[AI];var AJ;switch(Z.type){case"moveTo":AJ=Z;AK.push(" m ",K(Z.x),",",K(Z.y));break;case"lineTo":AK.push(" l ",K(Z.x),",",K(Z.y));break;case"close":AK.push(" x ");Z=null;break;case"bezierCurveTo":AK.push(" c ",K(Z.cp1x),",",K(Z.cp1y),",",K(Z.cp2x),",",K(Z.cp2y),",",K(Z.x),",",K(Z.y));break;case"at":case"wa":AK.push(" ",Z.type," ",K(Z.x-this.arcScaleX_*Z.radius),",",K(Z.y-this.arcScaleY_*Z.radius)," ",K(Z.x+this.arcScaleX_*Z.radius),",",K(Z.y+this.arcScaleY_*Z.radius)," ",K(Z.xStart),",",K(Z.yStart)," ",K(Z.xEnd),",",K(Z.yEnd));break}if(Z){if(AG.x==null||Z.x<AG.x){AG.x=Z.x}if(AL.x==null||Z.x>AL.x){AL.x=Z.x}if(AG.y==null||Z.y<AG.y){AG.y=Z.y}if(AL.y==null||Z.y>AL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("<g_vml_:stroke",' opacity="',p,'"',' joinstyle="',j.lineJoin,'"',' miterlimit="',j.miterLimit,'"',' endcap="',t(j.lineCap),'"',' weight="',Z,'px"',' color="',m,'" />')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae<AN;Ae++){var AM=AS[Ae];Ab.push(AM.offset*AK+AU+" "+AM.color)}AG.push('<g_vml_:fill type="',AH.type_,'"',' method="none" focus="100%"',' color="',AR,'"',' color2="',AQ,'"',' colors="',Ab.join(","),'"',' opacity="',AV,'"',' g_o_:opacity2="',AW,'"',' angle="',AL,'"',' focusposition="',Ac.x,",",Ac.y,'" />')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("<g_vml_:fill",' position="',AF/Z*AY*AY,",",AZ/m*AX*AX,'"',' type="tile"',' src="',AH.src_,'" />')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('<g_vml_:fill color="',AT,'" opacity="',Ad,'" />')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('<g_vml_:line from="',-i,' 0" to="',AP,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!AG,'" stroked="',!!AG,'" style="position:absolute;width:1px;height:1px;">');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('<g_vml_:skew on="t" matrix="',AL,'" ',' offset="',AJ,'" origin="',i,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',AD(AK),'" style="v-text-align:',p,";font:",AD(j),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()};
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/js/global.js b/src/main/webapp/plug-in/datatables/thems/black/js/global.js
    new file mode 100644
    index 00000000..8f47861e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/js/global.js
    @@ -0,0 +1,58 @@
    +$(document).ready(function () {
    +      
    +      /* GLOBAL SCRIPTS */
    +
    +      $('#top-nav li').hover(
    +       function () {
    +           $('ul', this).slideDown(100);
    +         }, 
    +       function () {
    +           $('ul', this).slideUp(100);         
    +      }); /*for the dropdown sub-nav*/
    +
    +      $('.ad-notif-success, .ad-notif-warn, .ad-notif-error, .ad-notif-info').click(function() {
    +        $(this).slideUp(300);
    +      }); /* for dismissing notifications */
    +
    +      $('#usr-notif a').click(function () {
    +        $.sticky('Well hello there!');
    +      }); /* for displaying a sticky notification */ 
    +
    +      $('.box-head').click(function() {
    +          $(this).next(".box-content").css("min-height", "0").slideToggle(400);
    +      }); /* for collapsing panels on header click */
    +
    +
    +      var link = $("<link>");
    +      link.attr({
    +              type: 'text/css',
    +              rel: 'stylesheet',
    +              href: 'css/icons.css'
    +      });
    +      if($('.silk, .fugue, .fugue-2, .fugue-24, .opsrc').length>0) {
    +
    +          $("head").append( link ); 
    +      }; /* for only including "icons.css" (big file) if an icon class is used anywhere in the page */
    +
    +      /* FOR ADAPTIVE LAYOUT, remove if not needed */
    +
    +      function fullHeight(){
    +          if ($(window).width() > 600)  {
    +            if ($(window).width() < 1250) {
    +               $(".top-bar").height($(document).height());
    +            }
    +            else {
    +              $(".top-bar").height(80);
    +            }
    +          }
    +          else {
    +              $(".top-bar").height(30);
    +            }
    +      }
    +          fullHeight();
    +
    +          $(window).resize(function(){
    +              fullHeight();
    +          }); 
    +      /* sets the .top-bar height to 100% of document height if resolution smaller than 1250px and larger than 600px */
    +});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/js/jquery.dataTables.min.js b/src/main/webapp/plug-in/datatables/thems/black/js/jquery.dataTables.min.js
    new file mode 100644
    index 00000000..56cb36fb
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/js/jquery.dataTables.min.js
    @@ -0,0 +1,153 @@
    +/*
    + * File:        jquery.dataTables.min.js
    + * Version:     1.9.0
    + * Author:      Allan Jardine (www.sprymedia.co.uk)
    + * Info:        www.datatables.net
    + * 
    + * Copyright 2008-2012 Allan Jardine, all rights reserved.
    + *
    + * This source file is free software, under either the GPL v2 license or a
    + * BSD style license, available at:
    + *   http://datatables.net/license_gpl2
    + *   http://datatables.net/license_bsd
    + * 
    + * This source file is distributed in the hope that it will be useful, but 
    + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
    + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
    + */
    +(function(i,aa,k,l){var j=function(e){function o(a,b){var c=j.defaults.columns,d=a.aoColumns.length,c=i.extend({},j.models.oColumn,c,{sSortingClass:a.oClasses.sSortable,sSortingClassJUI:a.oClasses.sSortJUI,nTh:b?b:k.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mDataProp:c.mDataProp?c.oDefaults:d});a.aoColumns.push(c);if(a.aoPreSearchCols[d]===l||null===a.aoPreSearchCols[d])a.aoPreSearchCols[d]=i.extend({},j.models.oSearch);else{c=a.aoPreSearchCols[d];
    +if(c.bRegex===l)c.bRegex=!0;if(c.bSmart===l)c.bSmart=!0;if(c.bCaseInsensitive===l)c.bCaseInsensitive=!0}E(a,d,null)}function E(a,b,c){b=a.aoColumns[b];if(c!==l&&null!==c){if(c.sType!==l)b.sType=c.sType,b._bAutoType=!1;i.extend(b,c);n(b,c,"sWidth","sWidthOrig");if(c.iDataSort!==l)b.aDataSort=[c.iDataSort];n(b,c,"aDataSort")}b.fnGetData=V(b.mDataProp);b.fnSetData=sa(b.mDataProp);if(!a.oFeatures.bSort)b.bSortable=!1;if(!b.bSortable||-1==i.inArray("asc",b.asSorting)&&-1==i.inArray("desc",b.asSorting))b.sSortingClass=
    +a.oClasses.sSortableNone,b.sSortingClassJUI="";else if(b.bSortable||-1==i.inArray("asc",b.asSorting)&&-1==i.inArray("desc",b.asSorting))b.sSortingClass=a.oClasses.sSortable,b.sSortingClassJUI=a.oClasses.sSortJUI;else if(-1!=i.inArray("asc",b.asSorting)&&-1==i.inArray("desc",b.asSorting))b.sSortingClass=a.oClasses.sSortableAsc,b.sSortingClassJUI=a.oClasses.sSortJUIAscAllowed;else if(-1==i.inArray("asc",b.asSorting)&&-1!=i.inArray("desc",b.asSorting))b.sSortingClass=a.oClasses.sSortableDesc,b.sSortingClassJUI=
    +a.oClasses.sSortJUIDescAllowed}function r(a){if(!1===a.oFeatures.bAutoWidth)return!1;ba(a);for(var b=0,c=a.aoColumns.length;b<c;b++)a.aoColumns[b].nTh.style.width=a.aoColumns[b].sWidth}function s(a,b){for(var c=-1,d=0;d<a.aoColumns.length;d++)if(!0===a.aoColumns[d].bVisible&&c++,c==b)return d;return null}function t(a,b){for(var c=-1,d=0;d<a.aoColumns.length;d++)if(!0===a.aoColumns[d].bVisible&&c++,d==b)return!0===a.aoColumns[d].bVisible?c:null;return null}function v(a){for(var b=0,c=0;c<a.aoColumns.length;c++)!0===
    +a.aoColumns[c].bVisible&&b++;return b}function B(a){for(var b=j.ext.aTypes,c=b.length,d=0;d<c;d++){var f=b[d](a);if(null!==f)return f}return"string"}function D(a,b){for(var c=b.split(","),d=[],f=0,h=a.aoColumns.length;f<h;f++)for(var g=0;g<h;g++)if(a.aoColumns[f].sName==c[g]){d.push(g);break}return d}function x(a){for(var b="",c=0,d=a.aoColumns.length;c<d;c++)b+=a.aoColumns[c].sName+",";return b.length==d?"":b.slice(0,-1)}function I(a,b,c,d){var f,h,g,e,q;if(b)for(f=b.length-1;0<=f;f--){var m=b[f].aTargets;
    +i.isArray(m)||F(a,1,"aTargets must be an array of targets, not a "+typeof m);for(h=0,g=m.length;h<g;h++)if("number"===typeof m[h]&&0<=m[h]){for(;a.aoColumns.length<=m[h];)o(a);d(m[h],b[f])}else if("number"===typeof m[h]&&0>m[h])d(a.aoColumns.length+m[h],b[f]);else if("string"===typeof m[h])for(e=0,q=a.aoColumns.length;e<q;e++)("_all"==m[h]||i(a.aoColumns[e].nTh).hasClass(m[h]))&&d(e,b[f])}if(c)for(f=0,a=c.length;f<a;f++)d(f,c[f])}function G(a,b){var c;c=i.isArray(b)?b.slice():i.extend(!0,{},b);var d=
    +a.aoData.length;c=i.extend(!0,{},j.models.oRow,{_aData:c});a.aoData.push(c);for(var f,h=0,g=a.aoColumns.length;h<g;h++)if(c=a.aoColumns[h],"function"===typeof c.fnRender&&c.bUseRendered&&null!==c.mDataProp&&J(a,d,h,R(a,d,h)),c._bAutoType&&"string"!=c.sType&&(f=w(a,d,h,"type"),null!==f&&""!==f))if(f=B(f),null===c.sType)c.sType=f;else if(c.sType!=f&&"html"!=c.sType)c.sType="string";a.aiDisplayMaster.push(d);a.oFeatures.bDeferRender||ca(a,d);return d}function ta(a){var b,c,d,f,h,g,e,q,m;if(a.bDeferLoading||
    +null===a.sAjaxSource){e=a.nTBody.childNodes;for(b=0,c=e.length;b<c;b++)if("TR"==e[b].nodeName.toUpperCase()){q=a.aoData.length;e[b]._DT_RowIndex=q;a.aoData.push(i.extend(!0,{},j.models.oRow,{nTr:e[b]}));a.aiDisplayMaster.push(q);g=e[b].childNodes;h=0;for(d=0,f=g.length;d<f;d++)if(m=g[d].nodeName.toUpperCase(),"TD"==m||"TH"==m)J(a,q,h,i.trim(g[d].innerHTML)),h++}}e=S(a);g=[];for(b=0,c=e.length;b<c;b++)for(d=0,f=e[b].childNodes.length;d<f;d++)h=e[b].childNodes[d],m=h.nodeName.toUpperCase(),("TD"==m||
    +"TH"==m)&&g.push(h);for(f=0,e=a.aoColumns.length;f<e;f++){m=a.aoColumns[f];if(null===m.sTitle)m.sTitle=m.nTh.innerHTML;h=m._bAutoType;q="function"===typeof m.fnRender;var o=null!==m.sClass,r=m.bVisible,l,n;if(h||q||o||!r)for(b=0,c=a.aoData.length;b<c;b++){d=a.aoData[b];l=g[b*e+f];if(h&&"string"!=m.sType&&(n=w(a,b,f,"type"),""!==n))if(n=B(n),null===m.sType)m.sType=n;else if(m.sType!=n&&"html"!=m.sType)m.sType="string";if("function"===typeof m.mDataProp)l.innerHTML=w(a,b,f,"display");if(q)n=R(a,b,f),
    +l.innerHTML=n,m.bUseRendered&&J(a,b,f,n);o&&(l.className+=" "+m.sClass);r?d._anHidden[f]=null:(d._anHidden[f]=l,l.parentNode.removeChild(l));m.fnCreatedCell&&m.fnCreatedCell.call(a.oInstance,l,w(a,b,f,"display"),d._aData,b,f)}}if(0!==a.aoRowCreatedCallback.length)for(b=0,c=a.aoData.length;b<c;b++)d=a.aoData[b],C(a,"aoRowCreatedCallback",null,[d.nTr,d._aData,b])}function K(a,b){return b._DT_RowIndex!==l?b._DT_RowIndex:null}function da(a,b,c){for(var b=L(a,b),d=0,a=a.aoColumns.length;d<a;d++)if(b[d]===
    +c)return d;return-1}function W(a,b,c){for(var d=[],f=0,h=a.aoColumns.length;f<h;f++)d.push(w(a,b,f,c));return d}function w(a,b,c,d){var f=a.aoColumns[c];if((c=f.fnGetData(a.aoData[b]._aData,d))===l){if(a.iDrawError!=a.iDraw&&null===f.sDefaultContent)F(a,0,"Requested unknown parameter '"+f.mDataProp+"' from the data source for row "+b),a.iDrawError=a.iDraw;return f.sDefaultContent}if(null===c&&null!==f.sDefaultContent)c=f.sDefaultContent;else if("function"===typeof c)return c();return"display"==d&&
    +null===c?"":c}function J(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d)}function V(a){if(null===a)return function(){return null};if("function"===typeof a)return function(b,d){return a(b,d)};if("string"===typeof a&&-1!=a.indexOf(".")){var b=a.split(".");return function(a){for(var d=0,f=b.length;d<f;d++)if(a=a[b[d]],a===l)return l;return a}}return function(b){return b[a]}}function sa(a){if(null===a)return function(){};if("function"===typeof a)return function(b,d){a(b,"set",d)};if("string"===
    +typeof a&&-1!=a.indexOf(".")){var b=a.split(".");return function(a,d){for(var f=0,h=b.length-1;f<h;f++)a=a[b[f]];a[b[b.length-1]]=d}}return function(b,d){b[a]=d}}function X(a){for(var b=[],c=a.aoData.length,d=0;d<c;d++)b.push(a.aoData[d]._aData);return b}function ea(a){a.aoData.splice(0,a.aoData.length);a.aiDisplayMaster.splice(0,a.aiDisplayMaster.length);a.aiDisplay.splice(0,a.aiDisplay.length);z(a)}function fa(a,b){for(var c=-1,d=0,f=a.length;d<f;d++)a[d]==b?c=d:a[d]>b&&a[d]--; -1!=c&&a.splice(c,
    +1)}function R(a,b,c){var d=a.aoColumns[c];return d.fnRender({iDataRow:b,iDataColumn:c,oSettings:a,aData:a.aoData[b]._aData,mDataProp:d.mDataProp},w(a,b,c,"display"))}function ca(a,b){var c=a.aoData[b],d;if(null===c.nTr){c.nTr=k.createElement("tr");c.nTr._DT_RowIndex=b;if(c._aData.DT_RowId)c.nTr.id=c._aData.DT_RowId;c._aData.DT_RowClass&&i(c.nTr).addClass(c._aData.DT_RowClass);for(var f=0,h=a.aoColumns.length;f<h;f++){var g=a.aoColumns[f];d=k.createElement("td");d.innerHTML="function"===typeof g.fnRender&&
    +(!g.bUseRendered||null===g.mDataProp)?R(a,b,f):w(a,b,f,"display");if(null!==g.sClass)d.className=g.sClass;g.bVisible?(c.nTr.appendChild(d),c._anHidden[f]=null):c._anHidden[f]=d;g.fnCreatedCell&&g.fnCreatedCell.call(a.oInstance,d,w(a,b,f,"display"),c._aData,b,f)}C(a,"aoRowCreatedCallback",null,[c.nTr,c._aData,b])}}function ua(a){var b,c,d;if(0!==a.nTHead.getElementsByTagName("th").length)for(b=0,d=a.aoColumns.length;b<d;b++){if(c=a.aoColumns[b].nTh,c.setAttribute("role","columnheader"),a.aoColumns[b].bSortable&&
    +(c.setAttribute("tabindex",a.iTabIndex),c.setAttribute("aria-controls",a.sTableId)),null!==a.aoColumns[b].sClass&&i(c).addClass(a.aoColumns[b].sClass),a.aoColumns[b].sTitle!=c.innerHTML)c.innerHTML=a.aoColumns[b].sTitle}else{var f=k.createElement("tr");for(b=0,d=a.aoColumns.length;b<d;b++)c=a.aoColumns[b].nTh,c.innerHTML=a.aoColumns[b].sTitle,c.setAttribute("tabindex","0"),null!==a.aoColumns[b].sClass&&i(c).addClass(a.aoColumns[b].sClass),f.appendChild(c);i(a.nTHead).html("")[0].appendChild(f);T(a.aoHeader,
    +a.nTHead)}i(a.nTHead).children("tr").attr("role","row");if(a.bJUI)for(b=0,d=a.aoColumns.length;b<d;b++){c=a.aoColumns[b].nTh;f=k.createElement("div");f.className=a.oClasses.sSortJUIWrapper;i(c).contents().appendTo(f);var h=k.createElement("span");h.className=a.oClasses.sSortIcon;f.appendChild(h);c.appendChild(f)}if(a.oFeatures.bSort)for(b=0;b<a.aoColumns.length;b++)!1!==a.aoColumns[b].bSortable?ga(a,a.aoColumns[b].nTh,b):i(a.aoColumns[b].nTh).addClass(a.oClasses.sSortableNone);""!==a.oClasses.sFooterTH&&
    +i(a.nTFoot).children("tr").children("th").addClass(a.oClasses.sFooterTH);if(null!==a.nTFoot){c=O(a,null,a.aoFooter);for(b=0,d=a.aoColumns.length;b<d;b++)if(c[b])a.aoColumns[b].nTf=c[b],a.aoColumns[b].sClass&&i(c[b]).addClass(a.aoColumns[b].sClass)}}function U(a,b,c){var d,f,h,g=[],e=[],i=a.aoColumns.length,m;c===l&&(c=!1);for(d=0,f=b.length;d<f;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(h=i-1;0<=h;h--)!a.aoColumns[h].bVisible&&!c&&g[d].splice(h,1);e.push([])}for(d=0,f=g.length;d<f;d++){if(a=g[d].nTr)for(;h=
    +a.firstChild;)a.removeChild(h);for(h=0,b=g[d].length;h<b;h++)if(m=i=1,e[d][h]===l){a.appendChild(g[d][h].cell);for(e[d][h]=1;g[d+i]!==l&&g[d][h].cell==g[d+i][h].cell;)e[d+i][h]=1,i++;for(;g[d][h+m]!==l&&g[d][h].cell==g[d][h+m].cell;){for(c=0;c<i;c++)e[d+c][h+m]=1;m++}g[d][h].cell.rowSpan=i;g[d][h].cell.colSpan=m}}}function y(a){var b,c,d=[],f=0,h=a.asStripeClasses.length;b=a.aoOpenRows.length;c=C(a,"aoPreDrawCallback","preDraw",[a]);if(-1===i.inArray(!1,c)){a.bDrawing=!0;if(a.iInitDisplayStart!==
    +l&&-1!=a.iInitDisplayStart)a._iDisplayStart=a.oFeatures.bServerSide?a.iInitDisplayStart:a.iInitDisplayStart>=a.fnRecordsDisplay()?0:a.iInitDisplayStart,a.iInitDisplayStart=-1,z(a);if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++;else if(a.oFeatures.bServerSide){if(!a.bDestroying&&!va(a))return}else a.iDraw++;if(0!==a.aiDisplay.length){var g=a._iDisplayStart;c=a._iDisplayEnd;if(a.oFeatures.bServerSide)g=0,c=a.aoData.length;for(;g<c;g++){var e=a.aoData[a.aiDisplay[g]];null===e.nTr&&ca(a,a.aiDisplay[g]);
    +var q=e.nTr;if(0!==h){var m=a.asStripeClasses[f%h];if(e._sRowStripe!=m)i(q).removeClass(e._sRowStripe).addClass(m),e._sRowStripe=m}C(a,"aoRowCallback",null,[q,a.aoData[a.aiDisplay[g]]._aData,f,g]);d.push(q);f++;if(0!==b)for(e=0;e<b;e++)if(q==a.aoOpenRows[e].nParent){d.push(a.aoOpenRows[e].nTr);break}}}else{d[0]=k.createElement("tr");if(a.asStripeClasses[0])d[0].className=a.asStripeClasses[0];h=a.oLanguage.sZeroRecords.replace("_MAX_",a.fnFormatNumber(a.fnRecordsTotal()));if(1==a.iDraw&&null!==a.sAjaxSource&&
    +!a.oFeatures.bServerSide)h=a.oLanguage.sLoadingRecords;else if(a.oLanguage.sEmptyTable&&0===a.fnRecordsTotal())h=a.oLanguage.sEmptyTable;b=k.createElement("td");b.setAttribute("valign","top");b.colSpan=v(a);b.className=a.oClasses.sRowEmpty;b.innerHTML=h;d[f].appendChild(b)}C(a,"aoHeaderCallback","header",[i(a.nTHead).children("tr")[0],X(a),a._iDisplayStart,a.fnDisplayEnd(),a.aiDisplay]);C(a,"aoFooterCallback","footer",[i(a.nTFoot).children("tr")[0],X(a),a._iDisplayStart,a.fnDisplayEnd(),a.aiDisplay]);
    +f=k.createDocumentFragment();b=k.createDocumentFragment();if(a.nTBody){h=a.nTBody.parentNode;b.appendChild(a.nTBody);if(!a.oScroll.bInfinite||!a._bInitComplete||a.bSorted||a.bFiltered)for(;b=a.nTBody.firstChild;)a.nTBody.removeChild(b);for(b=0,c=d.length;b<c;b++)f.appendChild(d[b]);a.nTBody.appendChild(f);null!==h&&h.appendChild(a.nTBody)}C(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1;a.oFeatures.bServerSide&&(H(a,!1),a._bInitComplete||Y(a))}}function Z(a){a.oFeatures.bSort?
    +P(a,a.oPreviousSearch):a.oFeatures.bFilter?M(a,a.oPreviousSearch):(z(a),y(a))}function wa(a){var b=i("<div></div>")[0];a.nTable.parentNode.insertBefore(b,a.nTable);a.nTableWrapper=i('<div id="'+a.sTableId+'_wrapper" class="'+a.oClasses.sWrapper+'" role="grid"></div>')[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var c=a.nTableWrapper,d=a.sDom.split(""),f,h,g,e,q,m,o,l=0;l<d.length;l++){h=0;g=d[l];if("<"==g){e=i("<div></div>")[0];q=d[l+1];if("'"==q||'"'==q){m="";for(o=2;d[l+o]!=q;)m+=d[l+o],
    +o++;"H"==m?m="fg-toolbar ui-toolbar ui-corner-tl ui-corner-tr ui-helper-clearfix":"F"==m&&(m="fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix");-1!=m.indexOf(".")?(q=m.split("."),e.id=q[0].substr(1,q[0].length-1),e.className=q[1]):"#"==m.charAt(0)?e.id=m.substr(1,m.length-1):e.className=m;l+=o}c.appendChild(e);c=e}else if(">"==g)c=c.parentNode;else if("l"==g&&a.oFeatures.bPaginate&&a.oFeatures.bLengthChange)f=xa(a),h=1;else if("f"==g&&a.oFeatures.bFilter)f=
    +ya(a),h=1;else if("r"==g&&a.oFeatures.bProcessing)f=za(a),h=1;else if("t"==g)f=Aa(a),h=1;else if("i"==g&&a.oFeatures.bInfo)f=Ba(a),h=1;else if("p"==g&&a.oFeatures.bPaginate)f=Ca(a),h=1;else if(0!==j.ext.aoFeatures.length){e=j.ext.aoFeatures;o=0;for(q=e.length;o<q;o++)if(g==e[o].cFeature){(f=e[o].fnInit(a))&&(h=1);break}}1==h&&null!==f&&("object"!==typeof a.aanFeatures[g]&&(a.aanFeatures[g]=[]),a.aanFeatures[g].push(f),c.appendChild(f))}b.parentNode.replaceChild(a.nTableWrapper,b)}function T(a,b){var c=
    +i(b).children("tr"),d,f,h,g,e,q,m,j;a.splice(0,a.length);for(f=0,q=c.length;f<q;f++)a.push([]);for(f=0,q=c.length;f<q;f++)for(h=0,m=c[f].childNodes.length;h<m;h++)if(d=c[f].childNodes[h],"TD"==d.nodeName.toUpperCase()||"TH"==d.nodeName.toUpperCase()){var o=1*d.getAttribute("colspan"),l=1*d.getAttribute("rowspan"),o=!o||0===o||1===o?1:o,l=!l||0===l||1===l?1:l;for(g=0;a[f][g];)g++;j=g;for(e=0;e<o;e++)for(g=0;g<l;g++)a[f+g][j+e]={cell:d,unique:1==o?!0:!1},a[f+g].nTr=c[f]}}function O(a,b,c){var d=[];
    +if(!c)c=a.aoHeader,b&&(c=[],T(c,b));for(var b=0,f=c.length;b<f;b++)for(var h=0,g=c[b].length;h<g;h++)if(c[b][h].unique&&(!d[h]||!a.bSortCellsTop))d[h]=c[b][h].cell;return d}function va(a){if(a.bAjaxDataGet){a.iDraw++;H(a,!0);var b=Da(a);ha(a,b);a.fnServerData.call(a.oInstance,a.sAjaxSource,b,function(b){Ea(a,b)},a);return!1}return!0}function Da(a){var b=a.aoColumns.length,c=[],d,f;c.push({name:"sEcho",value:a.iDraw});c.push({name:"iColumns",value:b});c.push({name:"sColumns",value:x(a)});c.push({name:"iDisplayStart",
    +value:a._iDisplayStart});c.push({name:"iDisplayLength",value:!1!==a.oFeatures.bPaginate?a._iDisplayLength:-1});for(f=0;f<b;f++)d=a.aoColumns[f].mDataProp,c.push({name:"mDataProp_"+f,value:"function"===typeof d?"function":d});if(!1!==a.oFeatures.bFilter){c.push({name:"sSearch",value:a.oPreviousSearch.sSearch});c.push({name:"bRegex",value:a.oPreviousSearch.bRegex});for(f=0;f<b;f++)c.push({name:"sSearch_"+f,value:a.aoPreSearchCols[f].sSearch}),c.push({name:"bRegex_"+f,value:a.aoPreSearchCols[f].bRegex}),
    +c.push({name:"bSearchable_"+f,value:a.aoColumns[f].bSearchable})}if(!1!==a.oFeatures.bSort){d=null!==a.aaSortingFixed?a.aaSortingFixed.length:0;var h=a.aaSorting.length;c.push({name:"iSortingCols",value:d+h});for(f=0;f<d;f++)c.push({name:"iSortCol_"+f,value:a.aaSortingFixed[f][0]}),c.push({name:"sSortDir_"+f,value:a.aaSortingFixed[f][1]});for(f=0;f<h;f++)c.push({name:"iSortCol_"+(f+d),value:a.aaSorting[f][0]}),c.push({name:"sSortDir_"+(f+d),value:a.aaSorting[f][1]});for(f=0;f<b;f++)c.push({name:"bSortable_"+
    +f,value:a.aoColumns[f].bSortable})}return c}function ha(a,b){C(a,"aoServerParams","serverParams",[b])}function Ea(a,b){if(b.sEcho!==l){if(1*b.sEcho<a.iDraw)return;a.iDraw=1*b.sEcho}(!a.oScroll.bInfinite||a.oScroll.bInfinite&&(a.bSorted||a.bFiltered))&&ea(a);a._iRecordsTotal=parseInt(b.iTotalRecords,10);a._iRecordsDisplay=parseInt(b.iTotalDisplayRecords,10);var c=x(a),c=b.sColumns!==l&&""!==c&&b.sColumns!=c,d;c&&(d=D(a,b.sColumns));for(var f=V(a.sAjaxDataProp)(b),h=0,g=f.length;h<g;h++)if(c){for(var e=
    +[],i=0,m=a.aoColumns.length;i<m;i++)e.push(f[h][d[i]]);G(a,e)}else G(a,f[h]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;y(a);a.bAjaxDataGet=!0;H(a,!1)}function ya(a){var b=a.oPreviousSearch,c=a.oLanguage.sSearch,c=-1!==c.indexOf("_INPUT_")?c.replace("_INPUT_",'<input type="text" />'):""===c?'<input type="text" />':c+' <input type="text" />',d=k.createElement("div");d.className=a.oClasses.sFilter;d.innerHTML="<label>"+c+"</label>";if(!a.aanFeatures.f)d.id=a.sTableId+"_filter";c=i("input",
    +d);c.val(b.sSearch.replace('"',"&quot;"));c.bind("keyup.DT",function(){for(var c=a.aanFeatures.f,d=0,g=c.length;d<g;d++)c[d]!=i(this).parents("div.dataTables_filter")[0]&&i("input",c[d]).val(this.value);this.value!=b.sSearch&&M(a,{sSearch:this.value,bRegex:b.bRegex,bSmart:b.bSmart,bCaseInsensitive:b.bCaseInsensitive})});c.attr("aria-controls",a.sTableId).bind("keypress.DT",function(a){if(13==a.keyCode)return!1});return d}function M(a,b,c){var d=a.oPreviousSearch,f=a.aoPreSearchCols,h=function(a){d.sSearch=
    +a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};if(a.oFeatures.bServerSide)h(b);else{Fa(a,b.sSearch,c,b.bRegex,b.bSmart,b.bCaseInsensitive);h(b);for(b=0;b<a.aoPreSearchCols.length;b++)Ga(a,f[b].sSearch,b,f[b].bRegex,f[b].bSmart,f[b].bCaseInsensitive);Ha(a)}a.bFiltered=!0;i(a.oInstance).trigger("filter",a);a._iDisplayStart=0;z(a);y(a);ia(a,0)}function Ha(a){for(var b=j.ext.afnFiltering,c=0,d=b.length;c<d;c++)for(var f=0,h=0,g=a.aiDisplay.length;h<g;h++){var e=a.aiDisplay[h-
    +f];b[c](a,W(a,e,"filter"),e)||(a.aiDisplay.splice(h-f,1),f++)}}function Ga(a,b,c,d,f,h){if(""!==b)for(var g=0,b=ja(b,d,f,h),d=a.aiDisplay.length-1;0<=d;d--)f=ka(w(a,a.aiDisplay[d],c,"filter"),a.aoColumns[c].sType),b.test(f)||(a.aiDisplay.splice(d,1),g++)}function Fa(a,b,c,d,f,h){d=ja(b,d,f,h);f=a.oPreviousSearch;c||(c=0);0!==j.ext.afnFiltering.length&&(c=1);if(0>=b.length)a.aiDisplay.splice(0,a.aiDisplay.length),a.aiDisplay=a.aiDisplayMaster.slice();else if(a.aiDisplay.length==a.aiDisplayMaster.length||
    +f.sSearch.length>b.length||1==c||0!==b.indexOf(f.sSearch)){a.aiDisplay.splice(0,a.aiDisplay.length);ia(a,1);for(b=0;b<a.aiDisplayMaster.length;b++)d.test(a.asDataSearch[b])&&a.aiDisplay.push(a.aiDisplayMaster[b])}else for(b=c=0;b<a.asDataSearch.length;b++)d.test(a.asDataSearch[b])||(a.aiDisplay.splice(b-c,1),c++)}function ia(a,b){if(!a.oFeatures.bServerSide){a.asDataSearch.splice(0,a.asDataSearch.length);for(var c=b&&1===b?a.aiDisplayMaster:a.aiDisplay,d=0,f=c.length;d<f;d++)a.asDataSearch[d]=la(a,
    +W(a,c[d],"filter"))}}function la(a,b){var c="";if(a.__nTmpFilter===l)a.__nTmpFilter=k.createElement("div");for(var d=a.__nTmpFilter,f=0,h=a.aoColumns.length;f<h;f++)a.aoColumns[f].bSearchable&&(c+=ka(b[f],a.aoColumns[f].sType)+"  ");if(-1!==c.indexOf("&"))d.innerHTML=c,c=d.textContent?d.textContent:d.innerText,c=c.replace(/\n/g," ").replace(/\r/g,"");return c}function ja(a,b,c,d){if(c)return a=b?a.split(" "):ma(a).split(" "),a="^(?=.*?"+a.join(")(?=.*?")+").*$",RegExp(a,d?"i":"");a=b?a:ma(a);return RegExp(a,
    +d?"i":"")}function ka(a,b){return"function"===typeof j.ext.ofnSearch[b]?j.ext.ofnSearch[b](a):"html"==b?a.replace(/[\r\n]/g," ").replace(/<.*?>/g,""):"string"===typeof a?a.replace(/[\r\n]/g," "):null===a?"":a}function ma(a){return a.replace(RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^)","g"),"\\$1")}function Ba(a){var b=k.createElement("div");b.className=a.oClasses.sInfo;if(!a.aanFeatures.i)a.aoDrawCallback.push({fn:Ia,sName:"information"}),b.id=a.sTableId+"_info";a.nTable.setAttribute("aria-describedby",
    +a.sTableId+"_info");return b}function Ia(a){if(a.oFeatures.bInfo&&0!==a.aanFeatures.i.length){var b=a._iDisplayStart+1,c=a.fnDisplayEnd(),d=a.fnRecordsTotal(),f=a.fnRecordsDisplay(),h=a.fnFormatNumber(b),g=a.fnFormatNumber(c),e=a.fnFormatNumber(d),q=a.fnFormatNumber(f);a.oScroll.bInfinite&&(h=a.fnFormatNumber(1));h=0===a.fnRecordsDisplay()&&a.fnRecordsDisplay()==a.fnRecordsTotal()?a.oLanguage.sInfoEmpty+a.oLanguage.sInfoPostFix:0===a.fnRecordsDisplay()?a.oLanguage.sInfoEmpty+" "+a.oLanguage.sInfoFiltered.replace("_MAX_",
    +e)+a.oLanguage.sInfoPostFix:a.fnRecordsDisplay()==a.fnRecordsTotal()?a.oLanguage.sInfo.replace("_START_",h).replace("_END_",g).replace("_TOTAL_",q)+a.oLanguage.sInfoPostFix:a.oLanguage.sInfo.replace("_START_",h).replace("_END_",g).replace("_TOTAL_",q)+" "+a.oLanguage.sInfoFiltered.replace("_MAX_",a.fnFormatNumber(a.fnRecordsTotal()))+a.oLanguage.sInfoPostFix;null!==a.oLanguage.fnInfoCallback&&(h=a.oLanguage.fnInfoCallback.call(a.oInstance,a,b,c,d,f,h));a=a.aanFeatures.i;b=0;for(c=a.length;b<c;b++)i(a[b]).html(h)}}
    +function $(a){var b,c,d=a.iInitDisplayStart;if(!1===a.bInitialised)setTimeout(function(){$(a)},200);else{wa(a);ua(a);U(a,a.aoHeader);a.nTFoot&&U(a,a.aoFooter);H(a,!0);a.oFeatures.bAutoWidth&&ba(a);for(b=0,c=a.aoColumns.length;b<c;b++)if(null!==a.aoColumns[b].sWidth)a.aoColumns[b].nTh.style.width=p(a.aoColumns[b].sWidth);a.oFeatures.bSort?P(a):a.oFeatures.bFilter?M(a,a.oPreviousSearch):(a.aiDisplay=a.aiDisplayMaster.slice(),z(a),y(a));null!==a.sAjaxSource&&!a.oFeatures.bServerSide?(c=[],ha(a,c),a.fnServerData.call(a.oInstance,
    +a.sAjaxSource,c,function(c){var h=""!==a.sAjaxDataProp?V(a.sAjaxDataProp)(c):c;for(b=0;b<h.length;b++)G(a,h[b]);a.iInitDisplayStart=d;a.oFeatures.bSort?P(a):(a.aiDisplay=a.aiDisplayMaster.slice(),z(a),y(a));H(a,!1);Y(a,c)},a)):a.oFeatures.bServerSide||(H(a,!1),Y(a))}}function Y(a,b){a._bInitComplete=!0;C(a,"aoInitComplete","init",[a,b])}function na(a){!a.sEmptyTable&&a.sZeroRecords&&n(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&a.sZeroRecords&&n(a,a,"sZeroRecords","sLoadingRecords")}function xa(a){if(a.oScroll.bInfinite)return null;
    +var b='<select size="1" '+('name="'+a.sTableId+'_length"')+">",c,d,f=a.aLengthMenu;if(2==f.length&&"object"===typeof f[0]&&"object"===typeof f[1])for(c=0,d=f[0].length;c<d;c++)b+='<option value="'+f[0][c]+'">'+f[1][c]+"</option>";else for(c=0,d=f.length;c<d;c++)b+='<option value="'+f[c]+'">'+f[c]+"</option>";b+="</select>";f=k.createElement("div");if(!a.aanFeatures.l)f.id=a.sTableId+"_length";f.className=a.oClasses.sLength;f.innerHTML="<label>"+a.oLanguage.sLengthMenu.replace("_MENU_",b)+"</label>";
    +i('select option[value="'+a._iDisplayLength+'"]',f).attr("selected",!0);i("select",f).bind("change.DT",function(){var b=i(this).val(),f=a.aanFeatures.l;for(c=0,d=f.length;c<d;c++)f[c]!=this.parentNode&&i("select",f[c]).val(b);a._iDisplayLength=parseInt(b,10);z(a);if(a.fnDisplayEnd()==a.fnRecordsDisplay()&&(a._iDisplayStart=a.fnDisplayEnd()-a._iDisplayLength,0>a._iDisplayStart))a._iDisplayStart=0;if(-1==a._iDisplayLength)a._iDisplayStart=0;y(a)});i("select",f).attr("aria-controls",a.sTableId);return f}
    +function z(a){a._iDisplayEnd=!1===a.oFeatures.bPaginate?a.aiDisplay.length:a._iDisplayStart+a._iDisplayLength>a.aiDisplay.length||-1==a._iDisplayLength?a.aiDisplay.length:a._iDisplayStart+a._iDisplayLength}function Ca(a){if(a.oScroll.bInfinite)return null;var b=k.createElement("div");b.className=a.oClasses.sPaging+a.sPaginationType;j.ext.oPagination[a.sPaginationType].fnInit(a,b,function(a){z(a);y(a)});a.aanFeatures.p||a.aoDrawCallback.push({fn:function(a){j.ext.oPagination[a.sPaginationType].fnUpdate(a,
    +function(a){z(a);y(a)})},sName:"pagination"});return b}function oa(a,b){var c=a._iDisplayStart;if("number"===typeof b){if(a._iDisplayStart=b*a._iDisplayLength,a._iDisplayStart>a.fnRecordsDisplay())a._iDisplayStart=0}else if("first"==b)a._iDisplayStart=0;else if("previous"==b){if(a._iDisplayStart=0<=a._iDisplayLength?a._iDisplayStart-a._iDisplayLength:0,0>a._iDisplayStart)a._iDisplayStart=0}else if("next"==b)0<=a._iDisplayLength?a._iDisplayStart+a._iDisplayLength<a.fnRecordsDisplay()&&(a._iDisplayStart+=
    +a._iDisplayLength):a._iDisplayStart=0;else if("last"==b)if(0<=a._iDisplayLength){var d=parseInt((a.fnRecordsDisplay()-1)/a._iDisplayLength,10)+1;a._iDisplayStart=(d-1)*a._iDisplayLength}else a._iDisplayStart=0;else F(a,0,"Unknown paging action: "+b);i(a.oInstance).trigger("page",a);return c!=a._iDisplayStart}function za(a){var b=k.createElement("div");if(!a.aanFeatures.r)b.id=a.sTableId+"_processing";b.innerHTML=a.oLanguage.sProcessing;b.className=a.oClasses.sProcessing;a.nTable.parentNode.insertBefore(b,
    +a.nTable);return b}function H(a,b){if(a.oFeatures.bProcessing)for(var c=a.aanFeatures.r,d=0,f=c.length;d<f;d++)c[d].style.visibility=b?"visible":"hidden";i(a.oInstance).trigger("processing",[a,b])}function Aa(a){if(""===a.oScroll.sX&&""===a.oScroll.sY)return a.nTable;var b=k.createElement("div"),c=k.createElement("div"),d=k.createElement("div"),f=k.createElement("div"),h=k.createElement("div"),g=k.createElement("div"),e=a.nTable.cloneNode(!1),q=a.nTable.cloneNode(!1),m=a.nTable.getElementsByTagName("thead")[0],
    +j=0===a.nTable.getElementsByTagName("tfoot").length?null:a.nTable.getElementsByTagName("tfoot")[0],o=a.oClasses;c.appendChild(d);h.appendChild(g);f.appendChild(a.nTable);b.appendChild(c);b.appendChild(f);d.appendChild(e);e.appendChild(m);null!==j&&(b.appendChild(h),g.appendChild(q),q.appendChild(j));b.className=o.sScrollWrapper;c.className=o.sScrollHead;d.className=o.sScrollHeadInner;f.className=o.sScrollBody;h.className=o.sScrollFoot;g.className=o.sScrollFootInner;if(a.oScroll.bAutoCss)c.style.overflow=
    +"hidden",c.style.position="relative",h.style.overflow="hidden",f.style.overflow="auto";c.style.border="0";c.style.width="100%";h.style.border="0";d.style.width="150%";e.removeAttribute("id");e.style.marginLeft="0";a.nTable.style.marginLeft="0";if(null!==j)q.removeAttribute("id"),q.style.marginLeft="0";d=i(a.nTable).children("caption");g=0;for(q=d.length;g<q;g++)e.appendChild(d[g]);if(""!==a.oScroll.sX){c.style.width=p(a.oScroll.sX);f.style.width=p(a.oScroll.sX);if(null!==j)h.style.width=p(a.oScroll.sX);
    +i(f).scroll(function(){c.scrollLeft=this.scrollLeft;if(null!==j)h.scrollLeft=this.scrollLeft})}if(""!==a.oScroll.sY)f.style.height=p(a.oScroll.sY);a.aoDrawCallback.push({fn:Ja,sName:"scrolling"});a.oScroll.bInfinite&&i(f).scroll(function(){!a.bDrawing&&0!==i(this).scrollTop()&&i(this).scrollTop()+i(this).height()>i(a.nTable).height()-a.oScroll.iLoadGap&&a.fnDisplayEnd()<a.fnRecordsDisplay()&&(oa(a,"next"),z(a),y(a))});a.nScrollHead=c;a.nScrollFoot=h;return b}function Ja(a){var b=a.nScrollHead.getElementsByTagName("div")[0],
    +c=b.getElementsByTagName("table")[0],d=a.nTable.parentNode,f,h,g,e,j,m,o,l,r=[],n=null!==a.nTFoot?a.nScrollFoot.getElementsByTagName("div")[0]:null,E=null!==a.nTFoot?n.getElementsByTagName("table")[0]:null,k=i.browser.msie&&7>=i.browser.version;g=a.nTable.getElementsByTagName("thead");0<g.length&&a.nTable.removeChild(g[0]);null!==a.nTFoot&&(j=a.nTable.getElementsByTagName("tfoot"),0<j.length&&a.nTable.removeChild(j[0]));g=a.nTHead.cloneNode(!0);a.nTable.insertBefore(g,a.nTable.childNodes[0]);null!==
    +a.nTFoot&&(j=a.nTFoot.cloneNode(!0),a.nTable.insertBefore(j,a.nTable.childNodes[1]));if(""===a.oScroll.sX)d.style.width="100%",b.parentNode.style.width="100%";var t=O(a,g);for(f=0,h=t.length;f<h;f++)o=s(a,f),t[f].style.width=a.aoColumns[o].sWidth;null!==a.nTFoot&&N(function(a){a.style.width=""},j.getElementsByTagName("tr"));f=i(a.nTable).outerWidth();if(""===a.oScroll.sX){if(a.nTable.style.width="100%",k&&(i("tbody",d).height()>d.offsetHeight||"scroll"==i(d).css("overflow-y")))a.nTable.style.width=
    +p(i(a.nTable).outerWidth()-a.oScroll.iBarWidth)}else if(""!==a.oScroll.sXInner)a.nTable.style.width=p(a.oScroll.sXInner);else if(f==i(d).width()&&i(d).height()<i(a.nTable).height()){if(a.nTable.style.width=p(f-a.oScroll.iBarWidth),i(a.nTable).outerWidth()>f-a.oScroll.iBarWidth)a.nTable.style.width=p(f)}else a.nTable.style.width=p(f);f=i(a.nTable).outerWidth();h=a.nTHead.getElementsByTagName("tr");g=g.getElementsByTagName("tr");N(function(a,b){m=a.style;m.paddingTop="0";m.paddingBottom="0";m.borderTopWidth=
    +"0";m.borderBottomWidth="0";m.height=0;l=i(a).width();b.style.width=p(l);r.push(l)},g,h);i(g).height(0);null!==a.nTFoot&&(e=j.getElementsByTagName("tr"),j=a.nTFoot.getElementsByTagName("tr"),N(function(a,b){m=a.style;m.paddingTop="0";m.paddingBottom="0";m.borderTopWidth="0";m.borderBottomWidth="0";m.height=0;l=i(a).width();b.style.width=p(l);r.push(l)},e,j),i(e).height(0));N(function(a){a.innerHTML="";a.style.width=p(r.shift())},g);null!==a.nTFoot&&N(function(a){a.innerHTML="";a.style.width=p(r.shift())},
    +e);if(i(a.nTable).outerWidth()<f){e=d.scrollHeight>d.offsetHeight||"scroll"==i(d).css("overflow-y")?f+a.oScroll.iBarWidth:f;if(k&&(d.scrollHeight>d.offsetHeight||"scroll"==i(d).css("overflow-y")))a.nTable.style.width=p(e-a.oScroll.iBarWidth);d.style.width=p(e);b.parentNode.style.width=p(e);if(null!==a.nTFoot)n.parentNode.style.width=p(e);""===a.oScroll.sX?F(a,1,"The table cannot fit into the current element which will cause column misalignment. The table has been drawn at its minimum possible width."):
    +""!==a.oScroll.sXInner&&F(a,1,"The table cannot fit into the current element which will cause column misalignment. Increase the sScrollXInner value or remove it to allow automatic calculation")}else if(d.style.width=p("100%"),b.parentNode.style.width=p("100%"),null!==a.nTFoot)n.parentNode.style.width=p("100%");if(""===a.oScroll.sY&&k)d.style.height=p(a.nTable.offsetHeight+a.oScroll.iBarWidth);if(""!==a.oScroll.sY&&a.oScroll.bCollapse&&(d.style.height=p(a.oScroll.sY),k=""!==a.oScroll.sX&&a.nTable.offsetWidth>
    +d.offsetWidth?a.oScroll.iBarWidth:0,a.nTable.offsetHeight<d.offsetHeight))d.style.height=p(i(a.nTable).height()+k);k=i(a.nTable).outerWidth();c.style.width=p(k);b.style.width=p(k);if(null!==a.nTFoot)n.style.width=p(a.nTable.offsetWidth),E.style.width=p(a.nTable.offsetWidth);if(a.bSorted||a.bFiltered)d.scrollTop=0}function N(a,b,c){for(var d=0,f=b.length;d<f;d++)for(var h=0,g=b[d].childNodes.length;h<g;h++)1==b[d].childNodes[h].nodeType&&(c?a(b[d].childNodes[h],c[d].childNodes[h]):a(b[d].childNodes[h]))}
    +function Ka(a,b){if(!a||null===a||""===a)return 0;b||(b=k.getElementsByTagName("body")[0]);var c,d=k.createElement("div");d.style.width=p(a);b.appendChild(d);c=d.offsetWidth;b.removeChild(d);return c}function ba(a){var b=0,c,d=0,f=a.aoColumns.length,h,g=i("th",a.nTHead),e=a.nTable.getAttribute("width");for(h=0;h<f;h++)if(a.aoColumns[h].bVisible&&(d++,null!==a.aoColumns[h].sWidth)){c=Ka(a.aoColumns[h].sWidthOrig,a.nTable.parentNode);if(null!==c)a.aoColumns[h].sWidth=p(c);b++}if(f==g.length&&0===b&&
    +d==f&&""===a.oScroll.sX&&""===a.oScroll.sY)for(h=0;h<a.aoColumns.length;h++){if(c=i(g[h]).width(),null!==c)a.aoColumns[h].sWidth=p(c)}else{b=a.nTable.cloneNode(!1);h=a.nTHead.cloneNode(!0);d=k.createElement("tbody");c=k.createElement("tr");b.removeAttribute("id");b.appendChild(h);null!==a.nTFoot&&(b.appendChild(a.nTFoot.cloneNode(!0)),N(function(a){a.style.width=""},b.getElementsByTagName("tr")));b.appendChild(d);d.appendChild(c);d=i("thead th",b);0===d.length&&(d=i("tbody tr:eq(0)>td",b));g=O(a,
    +h);for(h=d=0;h<f;h++){var j=a.aoColumns[h];j.bVisible&&null!==j.sWidthOrig&&""!==j.sWidthOrig?g[h-d].style.width=p(j.sWidthOrig):j.bVisible?g[h-d].style.width="":d++}for(h=0;h<f;h++)a.aoColumns[h].bVisible&&(d=La(a,h),null!==d&&(d=d.cloneNode(!0),""!==a.aoColumns[h].sContentPadding&&(d.innerHTML+=a.aoColumns[h].sContentPadding),c.appendChild(d)));f=a.nTable.parentNode;f.appendChild(b);if(""!==a.oScroll.sX&&""!==a.oScroll.sXInner)b.style.width=p(a.oScroll.sXInner);else if(""!==a.oScroll.sX){if(b.style.width=
    +"",i(b).width()<f.offsetWidth)b.style.width=p(f.offsetWidth)}else if(""!==a.oScroll.sY)b.style.width=p(f.offsetWidth);else if(e)b.style.width=p(e);b.style.visibility="hidden";Ma(a,b);f=i("tbody tr:eq(0)",b).children();0===f.length&&(f=O(a,i("thead",b)[0]));if(""!==a.oScroll.sX){for(h=d=c=0;h<a.aoColumns.length;h++)a.aoColumns[h].bVisible&&(c=null===a.aoColumns[h].sWidthOrig?c+i(f[d]).outerWidth():c+(parseInt(a.aoColumns[h].sWidth.replace("px",""),10)+(i(f[d]).outerWidth()-i(f[d]).width())),d++);b.style.width=
    +p(c);a.nTable.style.width=p(c)}for(h=d=0;h<a.aoColumns.length;h++)if(a.aoColumns[h].bVisible){c=i(f[d]).width();if(null!==c&&0<c)a.aoColumns[h].sWidth=p(c);d++}f=i(b).css("width");a.nTable.style.width=-1!==f.indexOf("%")?f:p(i(b).outerWidth());b.parentNode.removeChild(b)}if(e)a.nTable.style.width=p(e)}function Ma(a,b){if(""===a.oScroll.sX&&""!==a.oScroll.sY)i(b).width(),b.style.width=p(i(b).outerWidth()-a.oScroll.iBarWidth);else if(""!==a.oScroll.sX)b.style.width=p(i(b).outerWidth())}function La(a,
    +b){var c=Na(a,b);if(0>c)return null;if(null===a.aoData[c].nTr){var d=k.createElement("td");d.innerHTML=w(a,c,b,"");return d}return L(a,c)[b]}function Na(a,b){for(var c=-1,d=-1,f=0;f<a.aoData.length;f++){var h=w(a,f,b,"display")+"",h=h.replace(/<.*?>/g,"");if(h.length>c)c=h.length,d=f}return d}function p(a){if(null===a)return"0px";if("number"==typeof a)return 0>a?"0px":a+"px";var b=a.charCodeAt(a.length-1);return 48>b||57<b?a:a+"px"}function Oa(){var a=k.createElement("p"),b=a.style;b.width="100%";
    +b.height="200px";b.padding="0px";var c=k.createElement("div"),b=c.style;b.position="absolute";b.top="0px";b.left="0px";b.visibility="hidden";b.width="200px";b.height="150px";b.padding="0px";b.overflow="hidden";c.appendChild(a);k.body.appendChild(c);b=a.offsetWidth;c.style.overflow="scroll";a=a.offsetWidth;if(b==a)a=c.clientWidth;k.body.removeChild(c);return b-a}function P(a,b){var c,d,f,h,g,e,o=[],m=[],r=j.ext.oSort,n=a.aoData,k=a.aoColumns,E=a.oLanguage.oAria;if(!a.oFeatures.bServerSide&&(0!==a.aaSorting.length||
    +null!==a.aaSortingFixed)){o=null!==a.aaSortingFixed?a.aaSortingFixed.concat(a.aaSorting):a.aaSorting.slice();for(c=0;c<o.length;c++)if(d=o[c][0],f=t(a,d),h=a.aoColumns[d].sSortDataType,j.ext.afnSortData[h]){g=j.ext.afnSortData[h](a,d,f);for(f=0,h=n.length;f<h;f++)J(a,f,d,g[f])}for(c=0,d=a.aiDisplayMaster.length;c<d;c++)m[a.aiDisplayMaster[c]]=c;var p=o.length,s;for(c=0,d=n.length;c<d;c++)for(f=0;f<p;f++){s=k[o[f][0]].aDataSort;for(g=0,e=s.length;g<e;g++)h=k[s[g]].sType,h=r[(h?h:"string")+"-pre"],
    +n[c]._aSortData[s[g]]=h?h(w(a,c,s[g],"sort")):w(a,c,s[g],"sort")}a.aiDisplayMaster.sort(function(a,b){var c,d,f,h,g;for(c=0;c<p;c++){g=k[o[c][0]].aDataSort;for(d=0,f=g.length;d<f;d++)if(h=k[g[d]].sType,h=r[(h?h:"string")+"-"+o[c][1]](n[a]._aSortData[g[d]],n[b]._aSortData[g[d]]),0!==h)return h}return r["numeric-asc"](m[a],m[b])})}(b===l||b)&&!a.oFeatures.bDeferRender&&Q(a);for(c=0,d=a.aoColumns.length;c<d;c++)f=k[c].nTh,f.removeAttribute("aria-sort"),f.removeAttribute("aria-label"),k[c].bSortable?
    +0<o.length&&o[0][0]==c?(f.setAttribute("aria-sort","asc"==o[0][1]?"ascending":"descending"),f.setAttribute("aria-label",k[c].sTitle+("asc"==(k[c].asSorting[o[0][2]+1]?k[c].asSorting[o[0][2]+1]:k[c].asSorting[0])?E.sSortAscending:E.sSortDescending))):f.setAttribute("aria-label",k[c].sTitle+("asc"==k[c].asSorting[0]?E.sSortAscending:E.sSortDescending)):f.setAttribute("aria-label",k[c].sTitle);a.bSorted=!0;i(a.oInstance).trigger("sort",a);a.oFeatures.bFilter?M(a,a.oPreviousSearch,1):(a.aiDisplay=a.aiDisplayMaster.slice(),
    +a._iDisplayStart=0,z(a),y(a))}function ga(a,b,c,d){Pa(b,{},function(b){if(!1!==a.aoColumns[c].bSortable){var h=function(){var d,h;if(b.shiftKey){for(var e=!1,i=0;i<a.aaSorting.length;i++)if(a.aaSorting[i][0]==c){e=!0;d=a.aaSorting[i][0];h=a.aaSorting[i][2]+1;a.aoColumns[d].asSorting[h]?(a.aaSorting[i][1]=a.aoColumns[d].asSorting[h],a.aaSorting[i][2]=h):a.aaSorting.splice(i,1);break}!1===e&&a.aaSorting.push([c,a.aoColumns[c].asSorting[0],0])}else 1==a.aaSorting.length&&a.aaSorting[0][0]==c?(d=a.aaSorting[0][0],
    +h=a.aaSorting[0][2]+1,a.aoColumns[d].asSorting[h]||(h=0),a.aaSorting[0][1]=a.aoColumns[d].asSorting[h],a.aaSorting[0][2]=h):(a.aaSorting.splice(0,a.aaSorting.length),a.aaSorting.push([c,a.aoColumns[c].asSorting[0],0]));P(a)};a.oFeatures.bProcessing?(H(a,!0),setTimeout(function(){h();a.oFeatures.bServerSide||H(a,!1)},0)):h();"function"==typeof d&&d(a)}})}function Q(a){var b,c,d,f,h,g=a.aoColumns.length,e=a.oClasses;for(b=0;b<g;b++)a.aoColumns[b].bSortable&&i(a.aoColumns[b].nTh).removeClass(e.sSortAsc+
    +" "+e.sSortDesc+" "+a.aoColumns[b].sSortingClass);f=null!==a.aaSortingFixed?a.aaSortingFixed.concat(a.aaSorting):a.aaSorting.slice();for(b=0;b<a.aoColumns.length;b++)if(a.aoColumns[b].bSortable){h=a.aoColumns[b].sSortingClass;d=-1;for(c=0;c<f.length;c++)if(f[c][0]==b){h="asc"==f[c][1]?e.sSortAsc:e.sSortDesc;d=c;break}i(a.aoColumns[b].nTh).addClass(h);a.bJUI&&(c=i("span."+e.sSortIcon,a.aoColumns[b].nTh),c.removeClass(e.sSortJUIAsc+" "+e.sSortJUIDesc+" "+e.sSortJUI+" "+e.sSortJUIAscAllowed+" "+e.sSortJUIDescAllowed),
    +c.addClass(-1==d?a.aoColumns[b].sSortingClassJUI:"asc"==f[d][1]?e.sSortJUIAsc:e.sSortJUIDesc))}else i(a.aoColumns[b].nTh).addClass(a.aoColumns[b].sSortingClass);h=e.sSortColumn;if(a.oFeatures.bSort&&a.oFeatures.bSortClasses){d=L(a);if(a.oFeatures.bDeferRender)i(d).removeClass(h+"1 "+h+"2 "+h+"3");else if(d.length>=g)for(b=0;b<g;b++)if(-1!=d[b].className.indexOf(h+"1"))for(c=0,a=d.length/g;c<a;c++)d[g*c+b].className=i.trim(d[g*c+b].className.replace(h+"1",""));else if(-1!=d[b].className.indexOf(h+
    +"2"))for(c=0,a=d.length/g;c<a;c++)d[g*c+b].className=i.trim(d[g*c+b].className.replace(h+"2",""));else if(-1!=d[b].className.indexOf(h+"3"))for(c=0,a=d.length/g;c<a;c++)d[g*c+b].className=i.trim(d[g*c+b].className.replace(" "+h+"3",""));var e=1,j;for(b=0;b<f.length;b++){j=parseInt(f[b][0],10);for(c=0,a=d.length/g;c<a;c++)d[g*c+j].className+=" "+h+e;3>e&&e++}}}function pa(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b,c;b=a.oScroll.bInfinite;var d={iCreate:(new Date).getTime(),iStart:b?0:a._iDisplayStart,
    +iEnd:b?a._iDisplayLength:a._iDisplayEnd,iLength:a._iDisplayLength,aaSorting:i.extend(!0,[],a.aaSorting),oSearch:i.extend(!0,{},a.oPreviousSearch),aoSearchCols:i.extend(!0,[],a.aoPreSearchCols),abVisCols:[]};for(b=0,c=a.aoColumns.length;b<c;b++)d.abVisCols.push(a.aoColumns[b].bVisible);C(a,"aoStateSaveParams","stateSaveParams",[a,d]);a.fnStateSave.call(a.oInstance,a,d)}}function Qa(a,b){if(a.oFeatures.bStateSave){var c=a.fnStateLoad.call(a.oInstance,a);if(c){var d=C(a,"aoStateLoadParams","stateLoadParams",
    +[a,c]);if(-1===i.inArray(!1,d)){a.oLoadedState=i.extend(!0,{},c);a._iDisplayStart=c.iStart;a.iInitDisplayStart=c.iStart;a._iDisplayEnd=c.iEnd;a._iDisplayLength=c.iLength;a.aaSorting=c.aaSorting.slice();a.saved_aaSorting=c.aaSorting.slice();i.extend(a.oPreviousSearch,c.oSearch);i.extend(!0,a.aoPreSearchCols,c.aoSearchCols);b.saved_aoColumns=[];for(d=0;d<c.abVisCols.length;d++)b.saved_aoColumns[d]={},b.saved_aoColumns[d].bVisible=c.abVisCols[d];C(a,"aoStateLoaded","stateLoaded",[a,c])}}}}function Ra(a){for(var b=
    +aa.location.pathname.split("/"),a=a+"_"+b[b.length-1].replace(/[\/:]/g,"").toLowerCase()+"=",b=k.cookie.split(";"),c=0;c<b.length;c++){for(var d=b[c];" "==d.charAt(0);)d=d.substring(1,d.length);if(0===d.indexOf(a))return decodeURIComponent(d.substring(a.length,d.length))}return null}function u(a){for(var b=0;b<j.settings.length;b++)if(j.settings[b].nTable===a)return j.settings[b];return null}function S(a){for(var b=[],a=a.aoData,c=0,d=a.length;c<d;c++)null!==a[c].nTr&&b.push(a[c].nTr);return b}function L(a,
    +b){var c=[],d,f,h,e,i,j;f=0;var o=a.aoData.length;b!==l&&(f=b,o=b+1);for(h=f;h<o;h++)if(j=a.aoData[h],null!==j.nTr){f=[];for(e=0,i=j.nTr.childNodes.length;e<i;e++)d=j.nTr.childNodes[e].nodeName.toLowerCase(),("td"==d||"th"==d)&&f.push(j.nTr.childNodes[e]);d=0;for(e=0,i=a.aoColumns.length;e<i;e++)a.aoColumns[e].bVisible?c.push(f[e-d]):(c.push(j._anHidden[e]),d++)}return c}function F(a,b,c){a=null===a?"DataTables warning: "+c:"DataTables warning (table id = '"+a.sTableId+"'): "+c;if(0===b)if("alert"==
    +j.ext.sErrMode)alert(a);else throw a;else console!==l&&console.log&&console.log(a)}function n(a,b,c,d){d===l&&(d=c);b[c]!==l&&(a[d]=b[c])}function Sa(a,b){for(var c in a)a.hasOwnProperty(c)&&b[c]!==l&&("object"===typeof e[c]&&!1===i.isArray(b[c])?i.extend(!0,a[c],b[c]):a[c]=b[c]);return a}function Pa(a,b,c){i(a).bind("click.DT",b,function(b){c(b);a.blur()}).bind("keypress.DT",b,function(a){13===a.which&&c(a)}).bind("selectstart.DT",function(){return!1})}function A(a,b,c,d){c&&a[b].push({fn:c,sName:d})}
    +function C(a,b,c,d){for(var b=a[b],f=[],h=b.length-1;0<=h;h--)f.push(b[h].fn.apply(a.oInstance,d));null!==c&&i(a.oInstance).trigger(c,d);return f}function Ta(a){return function(){var b=[u(this[j.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return j.ext.oApi[a].apply(this,b)}}var Ua=aa.JSON?JSON.stringify:function(a){var b=typeof a;if("object"!==b||null===a)return"string"===b&&(a='"'+a+'"'),a+"";var c,d,f=[],h=i.isArray(a);for(c in a)d=a[c],b=typeof d,"string"===b?d='"'+d+'"':"object"===
    +b&&null!==d&&(d=Ua(d)),f.push((h?"":'"'+c+'":')+d);return(h?"[":"{")+f+(h?"]":"}")};this.$=function(a,b){var c,d,f=[],h=u(this[j.ext.iApiIndex]);b||(b={});b=i.extend({},{filter:"none",order:"current",page:"all"},b);if("current"==b.page)for(c=h._iDisplayStart,d=h.fnDisplayEnd();c<d;c++)f.push(h.aoData[h.aiDisplay[c]].nTr);else if("current"==b.order&&"none"==b.filter)for(c=0,d=h.aiDisplayMaster.length;c<d;c++)f.push(h.aoData[h.aiDisplayMaster[c]].nTr);else if("current"==b.order&&"applied"==b.filter)for(c=
    +0,d=h.aiDisplay.length;c<d;c++)f.push(h.aoData[h.aiDisplay[c]].nTr);else if("original"==b.order&&"none"==b.filter)for(c=0,d=h.aoData.length;c<d;c++)f.push(h.aoData[c].nTr);else if("original"==b.order&&"applied"==b.filter)for(c=0,d=h.aoData.length;c<d;c++)-1!==i.inArray(c,h.aiDisplay)&&f.push(h.aoData[c].nTr);else F(h,1,"Unknown selection options");d=i(f);c=d.filter(a);d=d.find(a);return i([].concat(i.makeArray(c),i.makeArray(d)))};this._=function(a,b){var c=[],d,f,h=this.$(a,b);for(d=0,f=h.length;d<
    +f;d++)c.push(this.fnGetData(h[d]));return c};this.fnAddData=function(a,b){if(0===a.length)return[];var c=[],d,f=u(this[j.ext.iApiIndex]);if("object"===typeof a[0]&&null!==a[0])for(var h=0;h<a.length;h++){d=G(f,a[h]);if(-1==d)return c;c.push(d)}else{d=G(f,a);if(-1==d)return c;c.push(d)}f.aiDisplay=f.aiDisplayMaster.slice();(b===l||b)&&Z(f);return c};this.fnAdjustColumnSizing=function(a){var b=u(this[j.ext.iApiIndex]);r(b);a===l||a?this.fnDraw(!1):(""!==b.oScroll.sX||""!==b.oScroll.sY)&&this.oApi._fnScrollDraw(b)};
    +this.fnClearTable=function(a){var b=u(this[j.ext.iApiIndex]);ea(b);(a===l||a)&&y(b)};this.fnClose=function(a){for(var b=u(this[j.ext.iApiIndex]),c=0;c<b.aoOpenRows.length;c++)if(b.aoOpenRows[c].nParent==a)return(a=b.aoOpenRows[c].nTr.parentNode)&&a.removeChild(b.aoOpenRows[c].nTr),b.aoOpenRows.splice(c,1),0;return 1};this.fnDeleteRow=function(a,b,c){var d=u(this[j.ext.iApiIndex]),f,h,a="object"===typeof a?K(d,a):a,e=d.aoData.splice(a,1);for(f=0,h=d.aoData.length;f<h;f++)if(null!==d.aoData[f].nTr)d.aoData[f].nTr._DT_RowIndex=
    +f;f=i.inArray(a,d.aiDisplay);d.asDataSearch.splice(f,1);fa(d.aiDisplayMaster,a);fa(d.aiDisplay,a);"function"===typeof b&&b.call(this,d,e);if(d._iDisplayStart>=d.aiDisplay.length&&(d._iDisplayStart-=d._iDisplayLength,0>d._iDisplayStart))d._iDisplayStart=0;if(c===l||c)z(d),y(d);return e};this.fnDestroy=function(a){var b=u(this[j.ext.iApiIndex]),c=b.nTableWrapper.parentNode,d=b.nTBody,f,e,a=a===l?!1:!0;b.bDestroying=!0;for(f=0,e=b.aoDestroyCallback.length;f<e;f++)b.aoDestroyCallback[f].fn();for(f=0,
    +e=b.aoColumns.length;f<e;f++)!1===b.aoColumns[f].bVisible&&this.fnSetColumnVis(f,!0);i(b.nTableWrapper).find("*").andSelf().unbind(".DT");i("tbody>tr>td."+b.oClasses.sRowEmpty,b.nTable).parent().remove();b.nTable!=b.nTHead.parentNode&&(i(b.nTable).children("thead").remove(),b.nTable.appendChild(b.nTHead));b.nTFoot&&b.nTable!=b.nTFoot.parentNode&&(i(b.nTable).children("tfoot").remove(),b.nTable.appendChild(b.nTFoot));b.nTable.parentNode.removeChild(b.nTable);i(b.nTableWrapper).remove();b.aaSorting=
    +[];b.aaSortingFixed=[];Q(b);i(S(b)).removeClass(b.asStripeClasses.join(" "));i("th, td",b.nTHead).removeClass([b.oClasses.sSortable,b.oClasses.sSortableAsc,b.oClasses.sSortableDesc,b.oClasses.sSortableNone].join(" "));b.bJUI&&(i("th span."+b.oClasses.sSortIcon+", td span."+b.oClasses.sSortIcon,b.nTHead).remove(),i("th, td",b.nTHead).each(function(){var a=i("div."+b.oClasses.sSortJUIWrapper,this),c=a.contents();i(this).append(c);a.remove()}));!a&&b.nTableReinsertBefore?c.insertBefore(b.nTable,b.nTableReinsertBefore):
    +a||c.appendChild(b.nTable);for(f=0,e=b.aoData.length;f<e;f++)null!==b.aoData[f].nTr&&d.appendChild(b.aoData[f].nTr);if(!0===b.oFeatures.bAutoWidth)b.nTable.style.width=p(b.sDestroyWidth);i(d).children("tr:even").addClass(b.asDestroyStripes[0]);i(d).children("tr:odd").addClass(b.asDestroyStripes[1]);for(f=0,e=j.settings.length;f<e;f++)j.settings[f]==b&&j.settings.splice(f,1);b=null};this.fnDraw=function(a){var b=u(this[j.ext.iApiIndex]);a?(z(b),y(b)):Z(b)};this.fnFilter=function(a,b,c,d,f,e){var g=
    +u(this[j.ext.iApiIndex]);if(g.oFeatures.bFilter){if(c===l||null===c)c=!1;if(d===l||null===d)d=!0;if(f===l||null===f)f=!0;if(e===l||null===e)e=!0;if(b===l||null===b){if(M(g,{sSearch:a+"",bRegex:c,bSmart:d,bCaseInsensitive:e},1),f&&g.aanFeatures.f){b=g.aanFeatures.f;c=0;for(d=b.length;c<d;c++)i("input",b[c]).val(a)}}else i.extend(g.aoPreSearchCols[b],{sSearch:a+"",bRegex:c,bSmart:d,bCaseInsensitive:e}),M(g,g.oPreviousSearch,1)}};this.fnGetData=function(a,b){var c=u(this[j.ext.iApiIndex]);if(a!==l){var d=
    +a;if("object"===typeof a){var f=a.nodeName.toLowerCase();"tr"===f?d=K(c,a):"td"===f&&(d=K(c,a.parentNode),b=da(c,d,a))}return b!==l?w(c,d,b,""):c.aoData[d]!==l?c.aoData[d]._aData:null}return X(c)};this.fnGetNodes=function(a){var b=u(this[j.ext.iApiIndex]);return a!==l?b.aoData[a]!==l?b.aoData[a].nTr:null:S(b)};this.fnGetPosition=function(a){var b=u(this[j.ext.iApiIndex]),c=a.nodeName.toUpperCase();if("TR"==c)return K(b,a);return"TD"==c||"TH"==c?(c=K(b,a.parentNode),a=da(b,c,a),[c,t(b,a),a]):null};
    +this.fnIsOpen=function(a){for(var b=u(this[j.ext.iApiIndex]),c=0;c<b.aoOpenRows.length;c++)if(b.aoOpenRows[c].nParent==a)return!0;return!1};this.fnOpen=function(a,b,c){var d=u(this[j.ext.iApiIndex]),f=S(d);if(-1!==i.inArray(a,f)){this.fnClose(a);var f=k.createElement("tr"),e=k.createElement("td");f.appendChild(e);e.className=c;e.colSpan=v(d);"string"===typeof b?e.innerHTML=b:i(e).html(b);b=i("tr",d.nTBody);-1!=i.inArray(a,b)&&i(f).insertAfter(a);d.aoOpenRows.push({nTr:f,nParent:a});return f}};this.fnPageChange=
    +function(a,b){var c=u(this[j.ext.iApiIndex]);oa(c,a);z(c);(b===l||b)&&y(c)};this.fnSetColumnVis=function(a,b,c){var d=u(this[j.ext.iApiIndex]),f,e,g=d.aoColumns,i=d.aoData,o,m;if(g[a].bVisible!=b){if(b){for(f=e=0;f<a;f++)g[f].bVisible&&e++;m=e>=v(d);if(!m)for(f=a;f<g.length;f++)if(g[f].bVisible){o=f;break}for(f=0,e=i.length;f<e;f++)null!==i[f].nTr&&(m?i[f].nTr.appendChild(i[f]._anHidden[a]):i[f].nTr.insertBefore(i[f]._anHidden[a],L(d,f)[o]))}else for(f=0,e=i.length;f<e;f++)null!==i[f].nTr&&(o=L(d,
    +f)[a],i[f]._anHidden[a]=o,o.parentNode.removeChild(o));g[a].bVisible=b;U(d,d.aoHeader);d.nTFoot&&U(d,d.aoFooter);for(f=0,e=d.aoOpenRows.length;f<e;f++)d.aoOpenRows[f].nTr.colSpan=v(d);if(c===l||c)r(d),y(d);pa(d)}};this.fnSettings=function(){return u(this[j.ext.iApiIndex])};this.fnSort=function(a){var b=u(this[j.ext.iApiIndex]);b.aaSorting=a;P(b)};this.fnSortListener=function(a,b,c){ga(u(this[j.ext.iApiIndex]),a,b,c)};this.fnUpdate=function(a,b,c,d,f){var e=u(this[j.ext.iApiIndex]),b="object"===typeof b?
    +K(e,b):b;if(e.__fnUpdateDeep===l&&i.isArray(a)&&"object"===typeof a){e.aoData[b]._aData=a.slice();e.__fnUpdateDeep=!0;for(c=0;c<e.aoColumns.length;c++)this.fnUpdate(w(e,b,c),b,c,!1,!1);e.__fnUpdateDeep=l}else if(e.__fnUpdateDeep===l&&null!==a&&"object"===typeof a){e.aoData[b]._aData=i.extend(!0,{},a);e.__fnUpdateDeep=!0;for(c=0;c<e.aoColumns.length;c++)this.fnUpdate(w(e,b,c),b,c,!1,!1);e.__fnUpdateDeep=l}else{J(e,b,c,a);var a=w(e,b,c,"display"),g=e.aoColumns[c];null!==g.fnRender&&(a=R(e,b,c),g.bUseRendered&&
    +J(e,b,c,a));if(null!==e.aoData[b].nTr)L(e,b)[c].innerHTML=a}c=i.inArray(b,e.aiDisplay);e.asDataSearch[c]=la(e,W(e,b,"filter"));(f===l||f)&&r(e);(d===l||d)&&Z(e);return 0};this.fnVersionCheck=j.ext.fnVersionCheck;this.oApi={_fnExternApiFunc:Ta,_fnInitialise:$,_fnInitComplete:Y,_fnLanguageCompat:na,_fnAddColumn:o,_fnColumnOptions:E,_fnAddData:G,_fnCreateTr:ca,_fnGatherData:ta,_fnBuildHead:ua,_fnDrawHead:U,_fnDraw:y,_fnReDraw:Z,_fnAjaxUpdate:va,_fnAjaxParameters:Da,_fnAjaxUpdateDraw:Ea,_fnServerParams:ha,
    +_fnAddOptionsHtml:wa,_fnFeatureHtmlTable:Aa,_fnScrollDraw:Ja,_fnAdjustColumnSizing:r,_fnFeatureHtmlFilter:ya,_fnFilterComplete:M,_fnFilterCustom:Ha,_fnFilterColumn:Ga,_fnFilter:Fa,_fnBuildSearchArray:ia,_fnBuildSearchRow:la,_fnFilterCreateSearch:ja,_fnDataToSearch:ka,_fnSort:P,_fnSortAttachListener:ga,_fnSortingClasses:Q,_fnFeatureHtmlPaginate:Ca,_fnPageChange:oa,_fnFeatureHtmlInfo:Ba,_fnUpdateInfo:Ia,_fnFeatureHtmlLength:xa,_fnFeatureHtmlProcessing:za,_fnProcessingDisplay:H,_fnVisibleToColumnIndex:s,
    +_fnColumnIndexToVisible:t,_fnNodeToDataIndex:K,_fnVisbleColumns:v,_fnCalculateEnd:z,_fnConvertToWidth:Ka,_fnCalculateColumnWidths:ba,_fnScrollingWidthAdjust:Ma,_fnGetWidestNode:La,_fnGetMaxLenString:Na,_fnStringToCss:p,_fnDetectType:B,_fnSettingsFromNode:u,_fnGetDataMaster:X,_fnGetTrNodes:S,_fnGetTdNodes:L,_fnEscapeRegex:ma,_fnDeleteIndex:fa,_fnReOrderIndex:D,_fnColumnOrdering:x,_fnLog:F,_fnClearTable:ea,_fnSaveState:pa,_fnLoadState:Qa,_fnCreateCookie:function(a,b,c,d,e){var h=new Date;h.setTime(h.getTime()+
    +1E3*c);var c=aa.location.pathname.split("/"),a=a+"_"+c.pop().replace(/[\/:]/g,"").toLowerCase(),g;null!==e?(g="function"===typeof i.parseJSON?i.parseJSON(b):eval("("+b+")"),b=e(a,g,h.toGMTString(),c.join("/")+"/")):b=a+"="+encodeURIComponent(b)+"; expires="+h.toGMTString()+"; path="+c.join("/")+"/";e="";h=9999999999999;if(4096<(null!==Ra(a)?k.cookie.length:b.length+k.cookie.length)+10){for(var a=k.cookie.split(";"),j=0,o=a.length;j<o;j++)if(-1!=a[j].indexOf(d)){var m=a[j].split("=");try{g=eval("("+
    +decodeURIComponent(m[1])+")")}catch(l){continue}if(g.iCreate&&g.iCreate<h)e=m[0],h=g.iCreate}if(""!==e)k.cookie=e+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+c.join("/")+"/"}k.cookie=b},_fnReadCookie:Ra,_fnDetectHeader:T,_fnGetUniqueThs:O,_fnScrollBarWidth:Oa,_fnApplyToChildren:N,_fnMap:n,_fnGetRowData:W,_fnGetCellData:w,_fnSetCellData:J,_fnGetObjectDataFn:V,_fnSetObjectDataFn:sa,_fnApplyColumnDefs:I,_fnBindAction:Pa,_fnExtend:Sa,_fnCallbackReg:A,_fnCallbackFire:C,_fnJsonString:Ua,_fnRender:R,
    +_fnNodeToColumnIndex:da};i.extend(j.ext.oApi,this.oApi);for(var qa in j.ext.oApi)qa&&(this[qa]=Ta(qa));var ra=this;return this.each(function(){var a=0,b,c,d;c=this.getAttribute("id");var f=!1,h=!1;if("table"!=this.nodeName.toLowerCase())F(null,0,"Attempted to initialise DataTables on a node which is not a table: "+this.nodeName);else{for(a=0,b=j.settings.length;a<b;a++){if(j.settings[a].nTable==this){if(e===l||e.bRetrieve)return j.settings[a].oInstance;if(e.bDestroy){j.settings[a].oInstance.fnDestroy();
    +break}else{F(j.settings[a],0,"Cannot reinitialise DataTable.\n\nTo retrieve the DataTables object for this table, pass no arguments or see the docs for bRetrieve and bDestroy");return}}if(j.settings[a].sTableId==this.id){j.settings.splice(a,1);break}}if(null===c)this.id=c="DataTables_Table_"+j.ext._oExternConfig.iNextUnique++;var g=i.extend(!0,{},j.models.oSettings,{nTable:this,oApi:ra.oApi,oInit:e,sDestroyWidth:i(this).width(),sInstance:c,sTableId:c});j.settings.push(g);g.oInstance=1===ra.length?
    +ra:i(this).dataTable();e||(e={});e.oLanguage&&na(e.oLanguage);e=Sa(i.extend(!0,{},j.defaults),e);n(g.oFeatures,e,"bPaginate");n(g.oFeatures,e,"bLengthChange");n(g.oFeatures,e,"bFilter");n(g.oFeatures,e,"bSort");n(g.oFeatures,e,"bInfo");n(g.oFeatures,e,"bProcessing");n(g.oFeatures,e,"bAutoWidth");n(g.oFeatures,e,"bSortClasses");n(g.oFeatures,e,"bServerSide");n(g.oFeatures,e,"bDeferRender");n(g.oScroll,e,"sScrollX","sX");n(g.oScroll,e,"sScrollXInner","sXInner");n(g.oScroll,e,"sScrollY","sY");n(g.oScroll,
    +e,"bScrollCollapse","bCollapse");n(g.oScroll,e,"bScrollInfinite","bInfinite");n(g.oScroll,e,"iScrollLoadGap","iLoadGap");n(g.oScroll,e,"bScrollAutoCss","bAutoCss");n(g,e,"asStripClasses","asStripeClasses");n(g,e,"asStripeClasses");n(g,e,"fnServerData");n(g,e,"fnFormatNumber");n(g,e,"sServerMethod");n(g,e,"aaSorting");n(g,e,"aaSortingFixed");n(g,e,"aLengthMenu");n(g,e,"sPaginationType");n(g,e,"sAjaxSource");n(g,e,"sAjaxDataProp");n(g,e,"iCookieDuration");n(g,e,"sCookiePrefix");n(g,e,"sDom");n(g,e,
    +"bSortCellsTop");n(g,e,"iTabIndex");n(g,e,"oSearch","oPreviousSearch");n(g,e,"aoSearchCols","aoPreSearchCols");n(g,e,"iDisplayLength","_iDisplayLength");n(g,e,"bJQueryUI","bJUI");n(g,e,"fnCookieCallback");n(g,e,"fnStateLoad");n(g,e,"fnStateSave");n(g.oLanguage,e,"fnInfoCallback");A(g,"aoDrawCallback",e.fnDrawCallback,"user");A(g,"aoServerParams",e.fnServerParams,"user");A(g,"aoStateSaveParams",e.fnStateSaveParams,"user");A(g,"aoStateLoadParams",e.fnStateLoadParams,"user");A(g,"aoStateLoaded",e.fnStateLoaded,
    +"user");A(g,"aoRowCallback",e.fnRowCallback,"user");A(g,"aoRowCreatedCallback",e.fnCreatedRow,"user");A(g,"aoHeaderCallback",e.fnHeaderCallback,"user");A(g,"aoFooterCallback",e.fnFooterCallback,"user");A(g,"aoInitComplete",e.fnInitComplete,"user");A(g,"aoPreDrawCallback",e.fnPreDrawCallback,"user");g.oFeatures.bServerSide&&g.oFeatures.bSort&&g.oFeatures.bSortClasses?A(g,"aoDrawCallback",Q,"server_side_sort_classes"):g.oFeatures.bDeferRender&&A(g,"aoDrawCallback",Q,"defer_sort_classes");if(e.bJQueryUI){if(i.extend(g.oClasses,
    +j.ext.oJUIClasses),e.sDom===j.defaults.sDom&&"lfrtip"===j.defaults.sDom)g.sDom='<"H"lfr>t<"F"ip>'}else i.extend(g.oClasses,j.ext.oStdClasses);i(this).addClass(g.oClasses.sTable);if(""!==g.oScroll.sX||""!==g.oScroll.sY)g.oScroll.iBarWidth=Oa();if(g.iInitDisplayStart===l)g.iInitDisplayStart=e.iDisplayStart,g._iDisplayStart=e.iDisplayStart;if(e.bStateSave)g.oFeatures.bStateSave=!0,Qa(g,e),A(g,"aoDrawCallback",pa,"state_save");if(null!==e.iDeferLoading)g.bDeferLoading=!0,g._iRecordsTotal=e.iDeferLoading,
    +g._iRecordsDisplay=e.iDeferLoading;null!==e.aaData&&(h=!0);""!==e.oLanguage.sUrl?(g.oLanguage.sUrl=e.oLanguage.sUrl,i.getJSON(g.oLanguage.sUrl,null,function(a){na(a);i.extend(!0,g.oLanguage,e.oLanguage,a);$(g)}),f=!0):i.extend(!0,g.oLanguage,e.oLanguage);c=!1;d=i(this).children("tbody").children("tr");for(a=0,b=g.asStripeClasses.length;a<b;a++)if(d.filter(":lt(2)").hasClass(g.asStripeClasses[a])){c=!0;break}if(c)g.asDestroyStripes=["",""],i(d[0]).hasClass(g.oClasses.sStripeOdd)&&(g.asDestroyStripes[0]+=
    +g.oClasses.sStripeOdd+" "),i(d[0]).hasClass(g.oClasses.sStripeEven)&&(g.asDestroyStripes[0]+=g.oClasses.sStripeEven),i(d[1]).hasClass(g.oClasses.sStripeOdd)&&(g.asDestroyStripes[1]+=g.oClasses.sStripeOdd+" "),i(d[1]).hasClass(g.oClasses.sStripeEven)&&(g.asDestroyStripes[1]+=g.oClasses.sStripeEven),d.removeClass(g.asStripeClasses.join(" "));c=[];a=this.getElementsByTagName("thead");0!==a.length&&(T(g.aoHeader,a[0]),c=O(g));if(null===e.aoColumns){d=[];for(a=0,b=c.length;a<b;a++)d.push(null)}else d=
    +e.aoColumns;for(a=0,b=d.length;a<b;a++){if(e.saved_aoColumns!==l&&e.saved_aoColumns.length==b)null===d[a]&&(d[a]={}),d[a].bVisible=e.saved_aoColumns[a].bVisible;o(g,c?c[a]:null)}I(g,e.aoColumnDefs,d,function(a,b){E(g,a,b)});for(a=0,b=g.aaSorting.length;a<b;a++){g.aaSorting[a][0]>=g.aoColumns.length&&(g.aaSorting[a][0]=0);var r=g.aoColumns[g.aaSorting[a][0]];g.aaSorting[a][2]===l&&(g.aaSorting[a][2]=0);e.aaSorting===l&&g.saved_aaSorting===l&&(g.aaSorting[a][1]=r.asSorting[0]);for(c=0,d=r.asSorting.length;c<
    +d;c++)if(g.aaSorting[a][1]==r.asSorting[c]){g.aaSorting[a][2]=c;break}}Q(g);a=i(this).children("thead");0===a.length&&(a=[k.createElement("thead")],this.appendChild(a[0]));g.nTHead=a[0];a=i(this).children("tbody");0===a.length&&(a=[k.createElement("tbody")],this.appendChild(a[0]));g.nTBody=a[0];g.nTBody.setAttribute("role","alert");g.nTBody.setAttribute("aria-live","polite");g.nTBody.setAttribute("aria-relevant","all");a=i(this).children("tfoot");if(0<a.length)g.nTFoot=a[0],T(g.aoFooter,g.nTFoot);
    +if(h)for(a=0;a<e.aaData.length;a++)G(g,e.aaData[a]);else ta(g);g.aiDisplay=g.aiDisplayMaster.slice();g.bInitialised=!0;!1===f&&$(g)}})};j.version="1.9.0";j.settings=[];j.models={};j.models.ext={afnFiltering:[],afnSortData:[],aoFeatures:[],aTypes:[],fnVersionCheck:function(e){for(var i=function(e,i){for(;e.length<i;)e+="0";return e},l=j.ext.sVersion.split("."),e=e.split("."),r="",k="",t=0,v=e.length;t<v;t++)r+=i(l[t],3),k+=i(e[t],3);return parseInt(r,10)>=parseInt(k,10)},iApiIndex:0,ofnSearch:{},oApi:{},
    +oStdClasses:{},oJUIClasses:{},oPagination:{},oSort:{},sVersion:j.version,sErrMode:"alert",_oExternConfig:{iNextUnique:0}};j.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};j.models.oRow={nTr:null,_aData:[],_aSortData:[],_anHidden:[],_sRowStripe:""};j.models.oColumn={aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bUseRendered:null,bVisible:null,_bAutoType:!0,fnCreatedCell:null,fnGetData:null,fnRender:null,fnSetData:null,mDataProp:null,nTh:null,nTf:null,sClass:null,
    +sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};j.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:["odd","even"],bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollAutoCss:!0,bScrollCollapse:!1,
    +bScrollInfinite:!1,bServerSide:!1,bSort:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCookieCallback:null,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(e){if(1E3>e)return e;for(var i=e+"",e=i.split(""),j="",i=i.length,l=0;l<i;l++)0===l%3&&0!==l&&(j=this.oLanguage.sInfoThousands+j),j=e[i-l-1]+j;return j},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:function(e,j,l,k){k.jqXHR=i.ajax({url:e,
    +data:j,success:function(e){i(k.oInstance).trigger("xhr",k);l(e)},dataType:"json",cache:!1,type:k.sServerMethod,error:function(e,i){"parsererror"==i&&alert("DataTables warning: JSON data from server could not be parsed. This is caused by a JSON formatting error.")}})},fnServerParams:null,fnStateLoad:function(e){var e=this.oApi._fnReadCookie(e.sCookiePrefix+e.sInstance),j;try{j="function"===typeof i.parseJSON?i.parseJSON(e):eval("("+e+")")}catch(l){j=null}return j},fnStateLoadParams:null,fnStateLoaded:null,
    +fnStateSave:function(e,i){this.oApi._fnCreateCookie(e.sCookiePrefix+e.sInstance,this.oApi._fnJsonString(i),e.iCookieDuration,e.sCookiePrefix,e.fnCookieCallback)},fnStateSaveParams:null,iCookieDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iScrollLoadGap:100,iTabIndex:0,oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",
    +sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sInfoThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sUrl:"",sZeroRecords:"No matching records found"},oSearch:i.extend({},j.models.oSearch),sAjaxDataProp:"aaData",sAjaxSource:null,sCookiePrefix:"SpryMedia_DataTables_",sDom:"lfrtip",sPaginationType:"two_button",sScrollX:"",
    +sScrollXInner:"",sScrollY:"",sServerMethod:"GET"};j.defaults.columns={aDataSort:null,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bUseRendered:!0,bVisible:!0,fnCreatedCell:null,fnRender:null,iDataSort:-1,mDataProp:null,sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};j.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,
    +bSortClasses:null,bStateSave:null},oScroll:{bAutoCss:null,bCollapse:null,bInfinite:null,iBarWidth:0,iLoadGap:null,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aoColumns:[],aoHeader:[],aoFooter:[],asDataSearch:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:null,asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],
    +aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,sPaginationType:"two_button",iCookieDuration:0,sCookiePrefix:"",fnCookieCallback:null,aoStateSave:[],aoStateLoad:[],oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,
    +aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iDisplayEnd:10,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return this.oFeatures.bServerSide?parseInt(this._iRecordsTotal,10):this.aiDisplayMaster.length},fnRecordsDisplay:function(){return this.oFeatures.bServerSide?parseInt(this._iRecordsDisplay,10):this.aiDisplay.length},fnDisplayEnd:function(){return this.oFeatures.bServerSide?
    +!1===this.oFeatures.bPaginate||-1==this._iDisplayLength?this._iDisplayStart+this.aiDisplay.length:Math.min(this._iDisplayStart+this._iDisplayLength,this._iRecordsDisplay):this._iDisplayEnd},oInstance:null,sInstance:null,iTabIndex:0};j.ext=i.extend(!0,{},j.models.ext);i.extend(j.ext.oStdClasses,{sTable:"dataTable",sPagePrevEnabled:"paginate_enabled_previous",sPagePrevDisabled:"paginate_disabled_previous",sPageNextEnabled:"paginate_enabled_next",sPageNextDisabled:"paginate_disabled_next",sPageJUINext:"",
    +sPageJUIPrev:"",sPageButton:"paginate_button",sPageButtonActive:"paginate_active",sPageButtonStaticDisabled:"paginate_button paginate_button_disabled",sPageFirst:"first",sPagePrevious:"previous",sPageNext:"next",sPageLast:"last",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",
    +sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",
    +sFooterTH:""});i.extend(j.ext.oJUIClasses,j.ext.oStdClasses,{sPagePrevEnabled:"fg-button ui-button ui-state-default ui-corner-left",sPagePrevDisabled:"fg-button ui-button ui-state-default ui-corner-left ui-state-disabled",sPageNextEnabled:"fg-button ui-button ui-state-default ui-corner-right",sPageNextDisabled:"fg-button ui-button ui-state-default ui-corner-right ui-state-disabled",sPageJUINext:"ui-icon ui-icon-circle-arrow-e",sPageJUIPrev:"ui-icon ui-icon-circle-arrow-w",sPageButton:"fg-button ui-button ui-state-default",
    +sPageButtonActive:"fg-button ui-button ui-state-default ui-state-disabled",sPageButtonStaticDisabled:"fg-button ui-button ui-state-default ui-state-disabled",sPageFirst:"first",sPageLast:"last",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:"ui-state-default",sSortDesc:"ui-state-default",sSortable:"ui-state-default",sSortableAsc:"ui-state-default",sSortableDesc:"ui-state-default",sSortableNone:"ui-state-default",
    +sSortJUIAsc:"css_right ui-icon ui-icon-triangle-1-n",sSortJUIDesc:"css_right ui-icon ui-icon-triangle-1-s",sSortJUI:"css_right ui-icon ui-icon-carat-2-n-s",sSortJUIAscAllowed:"css_right ui-icon ui-icon-carat-1-n",sSortJUIDescAllowed:"css_right ui-icon ui-icon-carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead ui-state-default",sScrollFoot:"dataTables_scrollFoot ui-state-default",sFooterTH:"ui-state-default"});i.extend(j.ext.oPagination,
    +{two_button:{fnInit:function(e,j,l){var k=e.oLanguage.oPaginate,s=function(i){e.oApi._fnPageChange(e,i.data.action)&&l(e)},k=!e.bJUI?'<a class="'+e.oClasses.sPagePrevDisabled+'" tabindex="'+e.iTabIndex+'" role="button">'+k.sPrevious+'</a><a class="'+e.oClasses.sPageNextDisabled+'" tabindex="'+e.iTabIndex+'" role="button">'+k.sNext+"</a>":'<a class="'+e.oClasses.sPagePrevDisabled+'" tabindex="'+e.iTabIndex+'" role="button"><span class="'+e.oClasses.sPageJUIPrev+'"></span></a><a class="'+e.oClasses.sPageNextDisabled+
    +'" tabindex="'+e.iTabIndex+'" role="button"><span class="'+e.oClasses.sPageJUINext+'"></span></a>';i(j).append(k);var t=i("a",j),k=t[0],t=t[1];e.oApi._fnBindAction(k,{action:"previous"},s);e.oApi._fnBindAction(t,{action:"next"},s);if(!e.aanFeatures.p)j.id=e.sTableId+"_paginate",k.id=e.sTableId+"_previous",t.id=e.sTableId+"_next",k.setAttribute("aria-controls",e.sTableId),t.setAttribute("aria-controls",e.sTableId)},fnUpdate:function(e){if(e.aanFeatures.p)for(var i=e.oClasses,j=e.aanFeatures.p,l=0,
    +k=j.length;l<k;l++)if(0!==j[l].childNodes.length)j[l].childNodes[0].className=0===e._iDisplayStart?i.sPagePrevDisabled:i.sPagePrevEnabled,j[l].childNodes[1].className=e.fnDisplayEnd()==e.fnRecordsDisplay()?i.sPageNextDisabled:i.sPageNextEnabled}},iFullNumbersShowPages:5,full_numbers:{fnInit:function(e,j,l){var k=e.oLanguage.oPaginate,s=e.oClasses,t=function(i){e.oApi._fnPageChange(e,i.data.action)&&l(e)};i(j).append('<a  tabindex="'+e.iTabIndex+'" class="'+s.sPageButton+" "+s.sPageFirst+'">'+k.sFirst+
    +'</a><a  tabindex="'+e.iTabIndex+'" class="'+s.sPageButton+" "+s.sPagePrevious+'">'+k.sPrevious+'</a><span></span><a tabindex="'+e.iTabIndex+'" class="'+s.sPageButton+" "+s.sPageNext+'">'+k.sNext+'</a><a tabindex="'+e.iTabIndex+'" class="'+s.sPageButton+" "+s.sPageLast+'">'+k.sLast+"</a>");var v=i("a",j),k=v[0],s=v[1],B=v[2],v=v[3];e.oApi._fnBindAction(k,{action:"first"},t);e.oApi._fnBindAction(s,{action:"previous"},t);e.oApi._fnBindAction(B,{action:"next"},t);e.oApi._fnBindAction(v,{action:"last"},
    +t);if(!e.aanFeatures.p)j.id=e.sTableId+"_paginate",k.id=e.sTableId+"_first",s.id=e.sTableId+"_previous",B.id=e.sTableId+"_next",v.id=e.sTableId+"_last"},fnUpdate:function(e,l){if(e.aanFeatures.p){var k=j.ext.oPagination.iFullNumbersShowPages,r=Math.floor(k/2),s=Math.ceil(e.fnRecordsDisplay()/e._iDisplayLength),t=Math.ceil(e._iDisplayStart/e._iDisplayLength)+1,v="",B,D=e.oClasses,x,I=e.aanFeatures.p,G=function(i){e.oApi._fnBindAction(this,{page:i+B-1},function(i){e.oApi._fnPageChange(e,i.data.page);
    +l(e);i.preventDefault()})};s<k?(B=1,r=s):t<=r?(B=1,r=k):t>=s-r?(B=s-k+1,r=s):(B=t-Math.ceil(k/2)+1,r=B+k-1);for(k=B;k<=r;k++)v+=t!==k?'<a tabindex="'+e.iTabIndex+'" class="'+D.sPageButton+'">'+e.fnFormatNumber(k)+"</a>":'<a tabindex="'+e.iTabIndex+'" class="'+D.sPageButtonActive+'">'+e.fnFormatNumber(k)+"</a>";for(k=0,r=I.length;k<r;k++)0!==I[k].childNodes.length&&(i("span:eq(0)",I[k]).html(v).children("a").each(G),x=I[k].getElementsByTagName("a"),x=[x[0],x[1],x[x.length-2],x[x.length-1]],i(x).removeClass(D.sPageButton+
    +" "+D.sPageButtonActive+" "+D.sPageButtonStaticDisabled),i([x[0],x[1]]).addClass(1==t?D.sPageButtonStaticDisabled:D.sPageButton),i([x[2],x[3]]).addClass(0===s||t===s||-1===e._iDisplayLength?D.sPageButtonStaticDisabled:D.sPageButton))}}}});i.extend(j.ext.oSort,{"string-pre":function(e){"string"!=typeof e&&(e="");return e.toLowerCase()},"string-asc":function(e,i){return e<i?-1:e>i?1:0},"string-desc":function(e,i){return e<i?1:e>i?-1:0},"html-pre":function(e){return e.replace(/<.*?>/g,"").toLowerCase()},
    +"html-asc":function(e,i){return e<i?-1:e>i?1:0},"html-desc":function(e,i){return e<i?1:e>i?-1:0},"date-pre":function(e){e=Date.parse(e);if(isNaN(e)||""===e)e=Date.parse("01/01/1970 00:00:00");return e},"date-asc":function(e,i){return e-i},"date-desc":function(e,i){return i-e},"numeric-pre":function(e){return"-"==e||""===e?0:1*e},"numeric-asc":function(e,i){return e-i},"numeric-desc":function(e,i){return i-e}});i.extend(j.ext.aTypes,[function(e){if("number"===typeof e)return"numeric";if("string"!==
    +typeof e)return null;var i,j=!1;i=e.charAt(0);if(-1=="0123456789-".indexOf(i))return null;for(var k=1;k<e.length;k++){i=e.charAt(k);if(-1=="0123456789.".indexOf(i))return null;if("."==i){if(j)return null;j=!0}}return"numeric"},function(e){var i=Date.parse(e);return null!==i&&!isNaN(i)||"string"===typeof e&&0===e.length?"date":null},function(e){return"string"===typeof e&&-1!=e.indexOf("<")&&-1!=e.indexOf(">")?"html":null}]);i.fn.DataTable=j;i.fn.dataTable=j;i.fn.dataTableSettings=j.settings;i.fn.dataTableExt=
    +j.ext})(jQuery,window,document,void 0);
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/js/sticky.full.js b/src/main/webapp/plug-in/datatables/thems/black/js/sticky.full.js
    new file mode 100644
    index 00000000..39a9ced3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/js/sticky.full.js
    @@ -0,0 +1,99 @@
    +// Sticky v1.0 by Daniel Raftery
    +// http://thrivingkings.com/sticky
    +//
    +// http://twitter.com/ThrivingKings
    +
    +(function( $ )
    +	{
    +	
    +	// Using it without an object
    +	$.sticky = function(note, options, callback) { return $.fn.sticky(note, options, callback); };
    +	
    +	$.fn.sticky = function(note, options, callback) 
    +		{
    +		// Default settings
    +		var position = 'top-right'; // top-left, top-right, bottom-left, or bottom-right
    +		
    +		var settings =
    +			{
    +			'speed'			:	'fast',	 // animations: fast, slow, or integer
    +			'duplicates'	:	true,  // true or false
    +			'autoclose'		:	5000  // integer or false
    +			};
    +		
    +		// Passing in the object instead of specifying a note
    +		if(!note)
    +			{ note = this.html(); }
    +		
    +		if(options)
    +			{ $.extend(settings, options); }
    +		
    +		// Variables
    +		var display = true;
    +		var duplicate = 'no';
    +		
    +		// Somewhat of a unique ID
    +		var uniqID = Math.floor(Math.random()*99999);
    +		
    +		// Handling duplicate notes and IDs
    +		$('.sticky-note').each(function()
    +			{
    +			if($(this).html() == note && $(this).is(':visible'))
    +				{ 
    +				duplicate = 'yes';
    +				if(!settings['duplicates'])
    +					{ display = false; }
    +				}
    +			if($(this).attr('id')==uniqID)
    +				{ uniqID = Math.floor(Math.random()*9999999); }
    +			});
    +		
    +		// Make sure the sticky queue exists
    +		if(!$('body').find('.sticky-queue').html())
    +			{ $('body').append('<div class="sticky-queue ' + position + '"></div>'); }
    +		
    +		// Can it be displayed?
    +		if(display)
    +			{
    +			// Building and inserting sticky note
    +			$('.sticky-queue').prepend('<div class="sticky border-' + position + '" id="' + uniqID + '"></div>');
    +			$('#' + uniqID).append('<img src="img/close.png" class="sticky-close" rel="' + uniqID + '" title="Close" />');
    +			$('#' + uniqID).append('<div class="sticky-note" rel="' + uniqID + '">' + note + '</div>');
    +			
    +			// Smoother animation
    +			var height = $('#' + uniqID).height();
    +			$('#' + uniqID).css('height', height);
    +			
    +			$('#' + uniqID).slideDown(settings['speed']);
    +			display = true;
    +			}
    +		
    +		// Listeners
    +		$('.sticky').ready(function()
    +			{
    +			// If 'autoclose' is enabled, set a timer to close the sticky
    +			if(settings['autoclose'])
    +				{ $('#' + uniqID).delay(settings['autoclose']).fadeOut(settings['speed']); }
    +			});
    +		// Closing a sticky
    +		$('.sticky-close').click(function()
    +			{ $('#' + $(this).attr('rel')).dequeue().fadeOut(settings['speed']); });
    +		
    +		
    +		// Callback data
    +		var response = 
    +			{
    +			'id'		:	uniqID,
    +			'duplicate'	:	duplicate,
    +			'displayed'	: 	display,
    +			'position'	:	position
    +			}
    +		
    +		// Callback function?
    +		if(callback)
    +			{ callback(response); }
    +		else
    +			{ return(response); }
    +		
    +		}
    +	})( jQuery );
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/black/js/styler.js b/src/main/webapp/plug-in/datatables/thems/black/js/styler.js
    new file mode 100644
    index 00000000..fa1b405b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/black/js/styler.js
    @@ -0,0 +1,42 @@
    +$(document).ready(function () {
    +
    +  $('.styler').click(function() {
    +    $(".styler").toggleClass("styler-active");
    +    $('.styler-show').slideToggle('slow');     
    +  }); /* to show the styler */
    +  
    +  $('#colorSelector-top-bar').tipTip({content: "Change the top bar color", defaultPosition: "right"});
    +  $('#colorSelector-box-head').tipTip({content: "Change the box header color", defaultPosition: "right"});
    +  /* for the tooltips describing what each colorpicker changes */
    +
    +  $('#colorSelector-top-bar').ColorPicker({
    +          color: '#292929',
    +          onShow: function (colpkr) {
    +            $(colpkr).fadeIn(500);
    +            return false;
    +          },
    +          onHide: function (colpkr) {
    +            $(colpkr).fadeOut(500);
    +            return false;
    +          },
    +          onChange: function (hsb, hex, rgb) {
    +            $('.top-bar, #colorSelector-top-bar').css('backgroundColor', '#' + hex);
    +          }
    +  });
    +  $('#colorSelector-box-head').ColorPicker({
    +          color: '#292929',
    +          onShow: function (colpkr) {
    +            $(colpkr).fadeIn(500);
    +            return false;
    +          },
    +          onHide: function (colpkr) {
    +            $(colpkr).fadeOut(500);
    +            return false;
    +          },
    +          onChange: function (hsb, hex, rgb) {
    +            $('.box-head, #colorSelector-box-head').css('backgroundColor', '#' + hex);
    +          }
    +  });
    +
    +  
    +});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/default/box.css b/src/main/webapp/plug-in/datatables/thems/default/box.css
    new file mode 100644
    index 00000000..f4c9193a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/default/box.css
    @@ -0,0 +1,165 @@
    +/*=====================瀹瑰櫒鏍峰紡============================= */
    +h1,h2,h3,h4,h5,h6 {
    +  margin: 0;
    +  font-family: 'Open Sans', sans-serif;
    +  /*font-family: 'Signika', sans-serif;*/
    +  font-weight: 700;
    +  color: inherit;
    +  text-rendering: optimizelegibility;
    +  margin-bottom:10px;
    +}
    +.box {
    +	width:100%;
    +	min-height:100%;
    +	-moz-box-shadow:0 1px 0px rgba(255, 255, 255, 1);
    +	-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	margin-bottom: 25px;
    +}
    +.box.hover {
    +	-moz-box-shadow:0px 0px 3px rgba(0, 0, 0, 0.2);
    +	-webkit-box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.2);
    +	box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.2);
    +	-webkit-transition: all 1s ease;
    +	-moz-transition: all 1s ease;
    +	-ms-transition: all 1s ease;
    +	-o-transition: all 1s ease;
    +	transition: all 1s ease;
    +}
    +.box.plain.hover {box-shadow: none;}
    +	.box .title {
    +		height:auto;
    +		background: url(img/2.png) repeat;
    +		position: relative;
    +		border:1px solid #c4c4c4;
    +		border-top-left-radius: 2px;
    +		border-top-right-radius: 2px;
    +		-moz-box-shadow:0 1px 0px rgba(255, 255, 255, 1);
    +		-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +		box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	}
    +	.box.plain .title {
    +		border-top: none;
    +		border-left: none;
    +		border-right: none;
    +		background: none;
    +	}
    +	.box.gradient .title {
    +		background: rgb(255,255,255);
    +		background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
    +		background: -moz-linear-gradient(top,  rgba(255,255,255,1) 1%, rgba(243,243,243,1) 100%);
    +		background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgba(255,255,255,1)), color-stop(100%,rgba(243,243,243,1)));
    +		background: -webkit-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +		background: -o-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +		background: -ms-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +		background: linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +		filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f3f3f3',GradientType=0 );
    +	}
    +	.box .title.min {
    +		border-bottom-left-radius: 2px;
    +		border-bottom-right-radius: 2px;
    +	}
    +		.box .title h4 {
    +			padding-left:15px;
    +			margin-bottom: 0;
    +			padding-top: 9px;
    +			padding-bottom: 9px;
    +		}
    +
    +		h4 .label {float: right; margin-right: 40px;}
    +		h4 .badge {float: right; margin-right: 40px;}
    +
    +		.box .title span[class*=" icon-"], .box .title span[class*=" brocco-icon-"], .box .title span[class*=" cut-icon-"], 
    +		.box .title span[class*=" entypo-icon-"], .box .title span[class*=" icomoon-icon-"], .box .title span[class*=" minia-icon-"], 
    +		.box .title span[class*=" iconic-icon-"], .box .title span[class*=" meteo-icon-"], .box .title span[class*=" silk-icon-"],
    +		.box .title span[class*=" typ-icon-"], .box .title span[class*=" wpzoom-"], .box .title span[class*=" eco-"]
    +		{
    +			margin: 0 10px 0 0px;
    +		}
    +		.box .title .loader {
    +			position: absolute;
    +			right:40px;
    +			top:10px;
    +		}
    +		.box .title>a {
    +			position: absolute;
    +			right:10px;
    +			top:8px;
    +			border: 1px solid #c4c4c4;
    +			border-radius:2px;
    +			-webkit-border-radius:2px;
    +			-moz-border-radius:2px;
    +			text-decoration:none;
    +			color: #3f3f3f;
    +			/*padding: 2px 4px 0px 4px;*/
    +			text-indent: -9999px;
    +			background-color: #f3f3f3;
    +			width:16px;
    +			height:16px;
    +			padding:0px 2px 3px 2px;
    +		}
    +		.box .spark {
    +			margin-right: 40px;
    +			float: right;
    +		}
    +		.box .box-form {
    +			margin-right: 40px;
    +			margin-bottom: 0;
    +			position: relative;
    +		}
    +		.box .box-form input {
    +			width: 100%;
    +			margin-bottom: 0;
    +		}
    +		.box .box-form .dropdown-menu {top:auto; left:auto;}
    +		.box .box-form .btn-mini.dropdown-toggle {margin-top:-1px;}
    +		.box .box-form .btn span {margin-right: 0; margin-top: -8px; display: inline-block;}
    +		.box .box-form .btn-mini span {margin-top: 0;}
    +		.box .box-form .dropdown-toggle {margin-top: -4px; padding-bottom: 0;}
    +		.box .box-form .btn span.caret {margin-left: 2px; margin-top:7px;}
    +		.box .box-form .ibutton-container {	margin-top:-2px;}
    +		.box .title .label span, .box .title .badge span {margin-left:0; margin-right:0}
    +		.box .title .progress {
    +			width:40%;
    +			position: absolute;
    +			right:40px;
    +			top:8px;
    +		}
    +		.box .title .minimize {
    +			cursor:pointer;
    +			background: url(img/minus.png) no-repeat center 3px #f3f3f3;
    +			display: none;
    +		}
    +		.box .title .maximize {
    +			background: url(img/plus.png) no-repeat center 3px #f3f3f3;
    +			display: block;
    +		}
    +	.box .content {
    +		padding:10px;
    +		border:1px solid #c4c4c4;
    +		border-bottom-left-radius: 2px;
    +		border-bottom-right-radius: 2px;
    +		border-top: none;
    +		background-color: #fff;
    +		position: relative;
    +	}
    +	.box .content.vertical-scroll {
    +		width: 200px;
    +	}
    +	.box .content.noPad {
    +		padding: 0;
    +	}
    +	.box .content.noPad .nav-tabs {
    +		margin-top: -1px;
    +		margin-left: -1px;
    +		margin-right: -1px;
    +	}
    +	.box .content.noPad .tab-content {
    +		margin-bottom: -1px;
    +		margin-left: -1px;
    +		margin-right: -1px;
    +	}
    +	.box.boxMargin {margin-bottom: 27px;}	
    +
    +
    +
    diff --git a/src/main/webapp/plug-in/datatables/thems/default/datatables_style.css b/src/main/webapp/plug-in/datatables/thems/default/datatables_style.css
    new file mode 100644
    index 00000000..706f4f68
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/default/datatables_style.css
    @@ -0,0 +1,467 @@
    +/*
    + * 琛ㄦ牸鏍峰紡
    + */
    + body {
    +	background: #fff;
    +	-webkit-font-smoothing: antialiased;
    +	overflow-x:	hidden;
    +	background: url(img/5.png) repeat;
    +	font-family: 'Droid Sans', Helvetica, Arial, sans-serif锛
    +	Helvetica, Arial, sans-serif; 
    +	color:#353535; 
    +	font-size: 13px;
    +	-webkit-font-smoothing: antialiased; /* Fix for webkit rendering */
    +	-webkit-text-size-adjust: 100%; 
    +	font-size-adjust: 100%;
    +	font-weight: 400;
    +	/*-webkit-text-stroke: 100%;*/
    +}
    +.dataTables_wrapper {
    +	position: relative;
    +	clear: both;
    +	zoom: 1; /* Feeling sorry for IE */
    +}
    +
    +.box .dataTables_wrapper {
    +	padding-top: 5px;
    +}
    +/*鍒楄〃闀垮害涓嬫媺妗嗗搴*/
    +div.dataTables_length select {
    +	width: 60px;
    +}
    +
    +.dataTables_processing {
    +	position: absolute;
    +	top: 50%;
    +	left: 50%;
    +	width: 250px;
    +	height: 30px;
    +	margin-left: -125px;
    +	margin-top: -15px;
    +	padding: 14px 0 2px 0;
    +	border: 1px solid #ddd;
    +	text-align: center;
    +	color: #999;
    +	font-size: 14px;
    +	background-color: white;
    +}
    +
    +.dataTables_length {
    +	width: auto;
    +	float: right;
    +}
    +
    +.dataTables_length .selector {
    +	margin-left: 10px;
    +}
    +
    +.dataTables_length .selector select {
    +	width: 50px !important;
    +}
    +
    +.box .dataTables_length {
    +	margin-right: 15px;
    +}
    +
    +.dataTables_filter {
    +	width: auto;
    +	float: left;
    +	text-align: left;
    +}
    +
    +.dataTables_filter input {
    +	margin-left: 10px;
    +	background: url(img/search.png) no-repeat 98% center;
    +}
    +
    +.box .dataTables_filter {
    +	margin-left: 15px;
    +}
    +
    +.dataTables_info {
    +	width: auto;
    +	float: left;
    +	margin-top: 10px;
    +	padding-left: 10px;
    +}
    +
    +.box .dataTables_info {
    +	margin-top: 15px;
    +	margin-bottom: 15px;
    +}
    +
    +.dataTables_paginate {
    +	float: right;
    +	text-align: right;
    +	margin-top: 10px;
    +	margin-right: 10px;
    +}
    +
    +
    +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    + * DataTables display
    + */
    +table.display {
    +	margin: 0 auto;
    +	clear: both;
    +	width: 100%;
    +}
    +
    +table.display thead tr {
    +	background: rgb(255, 255, 255);
    +	background:
    +		url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
    +	background: -moz-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, rgba(255,
    +		255, 255, 1) ), color-stop(100%, rgba(243, 243, 243, 1) ) );
    +	background: -webkit-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -o-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -ms-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	filter: progid : DXImageTransform.Microsoft.gradient (   startColorstr =
    +		'#ffffff', endColorstr = '#f3f3f3', GradientType = 0 );
    +	-moz-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +}
    +
    +table.display thead th {
    +	font-weight: bold;
    +	cursor: pointer; *
    +	cursor: hand;
    +}
    +
    +table.display tfoot tr {
    +	background: rgb(255, 255, 255);
    +	background:
    +		url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
    +	background: -moz-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, rgba(255,
    +		255, 255, 1) ), color-stop(100%, rgba(243, 243, 243, 1) ) );
    +	background: -webkit-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -o-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -ms-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	filter: progid : DXImageTransform.Microsoft.gradient (   startColorstr =
    +		'#ffffff', endColorstr = '#f3f3f3', GradientType = 0 );
    +	-moz-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	border-bottom: 1px solid #c4c4c4;
    +}
    +
    +table.display tfoot th {
    +	font-weight: bold;
    +}
    +
    +.box table.display tfoot th {
    +	border-bottom: 1px solid #c4c4c4;
    +}
    +
    +table.display tr.heading2 td {
    +	border-bottom: 1px solid #aaa;
    +}
    +
    +table.display td {
    +	padding: 3px 2px;
    +}
    +table.display th {
    +	padding: 3px 3px;
    +}
    +
    +table.display td.center {
    +	text-align: center;
    +	width: auto;
    +	display: table-cell;
    +}
    +
    +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    + * DataTables sorting
    + */
    +.sorting_asc {
    +	background: url('img/sort_asc.png') no-repeat center right
    +		!important;
    +}
    +
    +.sorting_desc {
    +	background: url('img/sort_desc.png') no-repeat center right
    +		!important;
    +}
    +
    +.sorting {
    +	background: url('img/sort_both.png') no-repeat center right
    +		!important;
    +}
    +
    +.sorting_asc_disabled {
    +	background: url('img/sort_asc_disabled.png') no-repeat center
    +		right !important;
    +}
    +
    +.sorting_desc_disabled {
    +	background: url('img/sort_desc_disabled.png') no-repeat center
    +		right !important;
    +}
    +
    +th:active {
    +	outline: none;
    +}
    +
    +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    + * DataTables row classes
    + */
    +table.display tr.odd.gradeA {
    +	background-color: #ffffff;
    +}
    +
    +table.display tr.even.gradeA {
    +	background-color: #f7f7f7;
    +}
    +
    +table.display tr.odd.gradeC {
    +	background-color: #ffffff;
    +}
    +
    +table.display tr.even.gradeC {
    +	background-color: #f7f7f7;
    +}
    +
    +table.display tr.odd.gradeX {
    +	background-color: #ffffff;
    +}
    +
    +table.display tr.even.gradeX {
    +	background-color: #f7f7f7;
    +}
    +
    +table.display tr.odd.gradeU {
    +	background-color: #ffffff;
    +}
    +
    +table.display tr.even.gradeU {
    +	background-color: #f7f7f7;
    +}
    +
    +tr.odd {
    +	background-color: #f7f7f7;
    +}
    +
    +tr.even {
    +	background-color: white;
    +}
    +.dataTables_scroll {
    +	clear: both;
    +}
    +
    +.dataTables_scrollBody {
    +	*margin-top: -1px;
    +	-webkit-overflow-scrolling: touch;
    +}
    +.top .dataTables_info {
    +	float: none;
    +}
    +
    +.clear {
    +	clear: both;
    +}
    +
    +.dataTables_empty {
    +	text-align: center;
    +}
    +
    +tfoot input {
    +	margin: 0.5em 0;
    +	width: 100%;
    +	color: #444;
    +}
    +
    +tfoot input.search_init {
    +	color: #999;
    +}
    +
    +td.group {
    +	background-color: #d1cfd0;
    +	border-bottom: 2px solid #A19B9E;
    +	border-top: 2px solid #A19B9E;
    +}
    +
    +td.details {
    +	background-color: #d1cfd0;
    +	border: 2px solid #A19B9E;
    +}
    +
    +.example_alt_pagination div.dataTables_info {
    +	width: 40%;
    +}
    +
    +.paging_full_numbers {
    +	height: 28px;
    +}
    +
    +.paging_full_numbers a:active {
    +	color: #f2f2f2;
    +	box-shadow: 0 1px 0 #eaeaea, 0 1px 0 #67c3da inset;
    +	border-color: #5098aa;
    +	background: #88BBC8;
    +}
    +
    +.paging_full_numbers a:hover {
    +	border: 1px solid #a3a3a3;
    +	background: #e8e6e6;
    +}
    +
    +.paging_full_numbers a.paginate_button,.paging_full_numbers a.paginate_active
    +	{
    +	border: 1px solid #aaa;
    +	-webkit-border-radius: 5px;
    +	-moz-border-radius: 5px;
    +	padding: 2px 5px;
    +	margin: 0 3px;
    +	cursor: pointer;
    +	*cursor: hand;
    +	color: #333 !important;
    +}
    +
    +.paging_full_numbers a.paginate_button {
    +	display: inline-block;
    +	float: left;
    +	padding: 0 14px;
    +	line-height: 28px;
    +	text-decoration: none;
    +	border: 1px solid #c4c4c4;
    +	border-left-width: 1px;
    +	background: rgb(255, 255, 255);
    +	background:
    +		url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
    +	background: -moz-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, rgba(255,
    +		255, 255, 1) ), color-stop(100%, rgba(243, 243, 243, 1) ) );
    +	background: -webkit-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -o-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: -ms-linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	background: linear-gradient(top, rgba(255, 255, 255, 1) 1%,
    +		rgba(243, 243, 243, 1) 100% );
    +	filter: progid : DXImageTransform.Microsoft.gradient (   startColorstr =
    +		'#ffffff', endColorstr = '#f3f3f3', GradientType = 0 );
    +	min-height: 28px;
    +	color: #717171;
    +	box-shadow: 0 1px 0 #eaeaea, 0 1px 0 #fff inset;
    +	margin-right: 4px;
    +	-webkit-border-radius: 2px 2px 2px 2px;
    +	-moz-border-radius: 2px 2px 2px 2px;
    +	border-radius: 2px 2px 2px 2px;
    +	font-weight: 700;
    +}
    +
    +.paging_full_numbers a.paginate_button:hover {
    +	border: 1px solid #a3a3a3;
    +	background: #e8e6e6;
    +}
    +
    +.paging_full_numbers a.paginate_active {
    +	color: #f2f2f2;
    +	box-shadow: 0 1px 0 #eaeaea, 0 1px 0 #67c3da inset;
    +	border-color: #5098aa;
    +	background: #88BBC8;
    +	float: left;
    +	padding: 0 14px;
    +	line-height: 28px;
    +	-webkit-border-radius: 2px 2px 2px 2px;
    +	-moz-border-radius: 2px 2px 2px 2px;
    +	border-radius: 2px 2px 2px 2px;
    +	font-weight: 700;
    +	cursor: default;
    +	text-decoration: none;
    +	color: #fff;
    +}
    +
    +/*琛ㄦ牸鏍峰紡*/
    +.table {position: relative;}
    +.table td { border-top: 1px solid #c4c4c4;}
    +.table thead th, .table tbody td {text-align: center;}
    +.table thead th:first-child, .table tbody td:first-child  {text-align: left;}
    +.table tr {
    +	-moz-box-shadow:0 1px 0px rgba(255, 255, 255, 1);
    +	-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +}
    +.table tbody {background-color:#fafafa;}
    +.table tbody + tbody {border-top: 2px solid #c4c4c4;}
    +.table tbody tr:last-child{border-bottom: 1px solid #c4c4c4;}
    +.table thead th {
    +  	background: rgb(255,255,255);
    +	background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmM2YzZjMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
    +	background: -moz-linear-gradient(top,  rgba(255,255,255,1) 1%, rgba(243,243,243,1) 100%);
    +	background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgba(255,255,255,1)), color-stop(100%,rgba(243,243,243,1)));
    +	background: -webkit-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +	background: -o-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +	background: -ms-linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +	background: linear-gradient(top,  rgba(255,255,255,1) 1%,rgba(243,243,243,1) 100%);
    +	-moz-box-shadow:0 1px 0px rgba(255, 255, 255, 1);
    +	-webkit-box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +	box-shadow: 0 1px 0px rgba(255, 255, 255, 1);
    +}
    +
    +.table-bordered {
    +  border-color: #c4c4c4;
    +  border-top:1px solid transparent;
    +  -webkit-border-radius: 2px;
    +     -moz-border-radius: 2px;
    +          border-radius: 2px;
    +   padding-bottom: 1px;
    +   border-collapse: collapse;
    +   margin-top:-1px;
    +   margin-left:-1px;
    +}
    +
    +.table caption + thead tr:first-child th,.table caption + thead tr:first-child td,.table colgroup + thead tr:first-child th,
    +.table colgroup + thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td {
    +  border-top: 1px solid #c4c4c4;
    +}
    +.table-bordered th,.table-bordered td { border-left: 1px solid #c4c4c4;}
    +.table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child {
    +  -webkit-border-top-left-radius: 2px;
    +          border-top-left-radius: 2px;
    +  -moz-border-radius-topleft: 2px;
    +}
    +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child {
    +  -webkit-border-top-right-radius: 2px;
    +          border-top-right-radius: 2px;
    +  -moz-border-radius-topright: 2px;
    +}
    +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child {
    +  -webkit-border-radius: 0 0 0 2px;
    +     -moz-border-radius: 0 0 0 2px;
    +          border-radius: 0 0 0 2px;
    +  -webkit-border-bottom-left-radius: 2px;
    +          border-bottom-left-radius: 2px;
    +  -moz-border-radius-bottomleft: 2px;
    +}
    +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child {
    +  -webkit-border-bottom-right-radius: 2px;
    +          border-bottom-right-radius: 2px;
    +  -moz-border-radius-bottomright: 2px;
    +}
    +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th {
    +  background-color: #f7f7f7;
    +}
    +.table tbody tr:hover td,
    +.table tbody tr:hover th {
    +  background-color: #e8eaeb;
    +}
    +.noPad .table {border: 1px solid transparent;margin-bottom: -1px; margin-top:-1px;}
    +.box .dataTables_wrapper {margin-left: -1px;}
    diff --git a/src/main/webapp/plug-in/datatables/thems/default/demo.txt b/src/main/webapp/plug-in/datatables/thems/default/demo.txt
    new file mode 100644
    index 00000000..755c1bba
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/default/demo.txt
    @@ -0,0 +1,42 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<!DOCTYPE html>
    +<%@include file="/context/mytags.jsp"%>
    +<html>
    + <head>
    +  <title>bootstarp娴嬭瘯</title>
    +  <link type="text/css" rel="stylesheet" href="plug-in/bootstrap/css/bootstrap.css"" ></link>
    +  <link type="text/css" rel="stylesheet" href="plug-in/datatables/thems/default/datatables_style.css"></link>
    +  <link href="plug-in/datatables/thems/default/box.css" rel="stylesheet" type="text/css" />
    +  <script type="text/javascript" src="plug-in/jquery/jquery-1.8.2.min.js"></script>
    +  <script type="text/javascript" src="plug-in/datatables/js/jquery.dataTables.js"></script>
    +  <script type="text/javascript" src="plug-in/artDiglog/jquery.artDialog.js?skin=blue"></script>
    +  <script type="text/javascript" src="plug-in/artDiglog/plugins/iframeTools.js"></script>
    +  <script type="text/javascript" src="plug-in/tools/curdtools_zh-cn.js"></script>
    + </head>
    + <body>
    +  <div class="row-fluid">
    +   <div class="span12">
    +    <div class="box gradient">
    +     <div class="title">
    +      <h4>
    +       <span>鐢ㄦ埛鍒楄〃</span>
    +      </h4>
    +     </div>
    +     <div class="content noPad clearfix">
    +      <t:dategrid name="userList" title="鐢ㄦ埛绠$悊" actionUrl="userController.do?datagrid" style="dynamicTable display table table-bordered" idField="id">
    +       <t:dgCol title="ID" field="id" hidden="true"></t:dgCol>
    +       <t:dgCol title="鐢ㄦ埛鍚" field="userName"></t:dgCol>
    +       <t:dgCol title="鎵嬫満" field="mobilePhone" query="true"></t:dgCol>
    +       <t:dgCol title="閮ㄩ棬" field="TSDepart_departname" sortable="false"></t:dgCol>
    +       <t:dgCol title="鎿嶄綔" field="opt"></t:dgCol>
    +       <t:dgurl type="1" url="userController.do?del&id={0}" arg="id" name="鍒犻櫎"></t:dgurl>
    +      </t:dategrid>
    +     </div>
    +    </div>
    +    <!-- End .box -->
    +   </div>
    +   <!-- End .span12 -->
    +  </div>
    +  <!-- End .row-fluid -->
    + </body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/default/img/sort_asc.png b/src/main/webapp/plug-in/datatables/thems/default/img/sort_asc.png
    new file mode 100644
    index 00000000..aeb59322
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/default/img/sort_asc.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/default/img/sort_asc_disabled.png b/src/main/webapp/plug-in/datatables/thems/default/img/sort_asc_disabled.png
    new file mode 100644
    index 00000000..79b8ba55
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/default/img/sort_asc_disabled.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/default/img/sort_both.png b/src/main/webapp/plug-in/datatables/thems/default/img/sort_both.png
    new file mode 100644
    index 00000000..47c4417f
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/default/img/sort_both.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/default/img/sort_desc.png b/src/main/webapp/plug-in/datatables/thems/default/img/sort_desc.png
    new file mode 100644
    index 00000000..d641677b
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/default/img/sort_desc.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/default/img/sort_desc_disabled.png b/src/main/webapp/plug-in/datatables/thems/default/img/sort_desc_disabled.png
    new file mode 100644
    index 00000000..979f04be
    Binary files /dev/null and b/src/main/webapp/plug-in/datatables/thems/default/img/sort_desc_disabled.png differ
    diff --git a/src/main/webapp/plug-in/datatables/thems/grey/datatables_style.css b/src/main/webapp/plug-in/datatables/thems/grey/datatables_style.css
    new file mode 100644
    index 00000000..507c60a2
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/grey/datatables_style.css
    @@ -0,0 +1,217 @@
    +
    +html,body {
    +	margin: 0;
    +	padding: 0;
    +	margin-top: 3px;
    +}
    +.dataTables_wrapper {
    +	position: relative;
    +	min-height: 100%;
    +	clear: both;
    +	_height: 100%;
    +	zoom: 1; /* Feeling sorry for IE */
    +}
    +/*鍔犺浇淇℃伅鏍峰紡*/
    +.dataTables_processing {
    +	position: absolute;
    +	top: 45%;
    +	left: 50%;
    +	width: 200px;
    +	height: 20px;
    +	margin-left: -125px;
    +	margin-top: -15px;
    +	padding: 14px 0 2px 0;
    +	border: 1px solid #ddd;
    +	text-align: center;
    +	color: #ddd;
    +	font-size: 14px;
    +	background-color: white;
    +}
    +
    +
    +
    +/*鍒楄〃闀垮害鏂囧瓧鎻忚堪瀹藉害*/
    +div.dataTables_length label {
    +	width: 150px;
    +	float: left;
    +	text-align: left;
    +}
    +/*鍒楄〃闀垮害涓嬫媺妗嗗搴*/
    +div.dataTables_length select {
    +	width: 60px;
    +}
    +/*鎼滅储妗嗛暱搴*/
    +div.dataTables_filter label {
    +	float: right;
    +	width:250px;
    +}
    +/*鍒楄〃INFO璁剧疆*/
    +div.dataTables_info {
    +	padding-top:0px;
    +	width: 60%;
    +	float: left;
    +}
    +/*鍒嗛〉鏉℃牱寮*/
    +div.dataTables_paginate {
    +	text-align: right;
    +	float: right;
    +	margin: 0;
    +}
    +/* Pagination nested */
    +.paginate_disabled_previous, .paginate_enabled_previous, .paginate_disabled_next, .paginate_enabled_next {
    +	height: 19px;
    +	width: 19px;
    +	margin-left: 3px;
    +	float: left;
    +}
    +
    +/*琛ㄦ牸杈硅窛*/
    +table {
    +	margin: 2px 0;
    +	clear: both;
    +}
    +
    +table.dataTable th:active {
    +	outline: none;
    +}
    +.uneditable-input:focus {
    +  border-color: rgba(82, 168, 236, 0.8);
    +  outline: 0;
    +  /* IE6-9 鎼滅储妗嗘牱寮 */
    +
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +}
    +h1,h2,h3,h4,h5,h6{margin:0;font-family:'Telex',sans-serif;font-weight:bold;color:#317eac;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}
    +h4{font-size:14px;}h4 small{font-size:12px;}
    +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:12px;color:#555555;background-color:#ffffff;}
    +.table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;}
    +label,input,button,select,textarea{font-size:12px;font-weight:normal;line-height:10px;}
    +table .header {
    +	cursor: pointer;
    +}
    +
    +table .header:after {
    +	content: "";
    +	float: right;
    +	margin-top: 5px;
    +	border-width: 0 4px 4px;
    +	border-style: solid;
    +	border-color: #000 transparent;
    +	visibility: hidden;
    +}
    +table .headerSortUp,table .headerSortDown {
    +	background-color: rgba(141, 192, 219, 0.25);
    +	text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
    +}
    +
    +table .header:hover:after {
    +	visibility: visible;
    +}
    +
    +table .headerSortDown:after,table .headerSortDown:hover:after {
    +	visibility: visible;
    +	filter: alpha(opacity = 60);
    +	-khtml-opacity: 0.6;
    +	-moz-opacity: 0.6;
    +	opacity: 0.6;
    +}
    +
    +table .headerSortUp:after {
    +	border-bottom: none;
    +	border-left: 4px solid transparent;
    +	border-right: 4px solid transparent;
    +	border-top: 4px solid #000;
    +	visibility: visible;
    +	-webkit-box-shadow: none;
    +	-moz-box-shadow: none;
    +	box-shadow: none;
    +	filter: alpha(opacity = 60);
    +	-khtml-opacity: 0.6;
    +	-moz-opacity: 0.6;
    +	opacity: 0.6;
    +}
    +
    +table .blue {
    +	color: #049cdb;
    +	border-bottom-color: #049cdb;
    +}
    +
    +table .headerSortUp.blue,table .headerSortDown.blue {
    +	background-color: #ade6fe;
    +}
    +
    +table .green {
    +	color: #46a546;
    +	border-bottom-color: #46a546;
    +}
    +
    +table .headerSortUp.green,table .headerSortDown.green {
    +	background-color: #cdeacd;
    +}
    +
    +table .red {
    +	color: #9d261d;
    +	border-bottom-color: #9d261d;
    +}
    +
    +table .headerSortUp.red,table .headerSortDown.red {
    +	background-color: #f4c8c5;
    +}
    +
    +table .yellow {
    +	color: #ffc40d;
    +	border-bottom-color: #ffc40d;
    +}
    +
    +table .headerSortUp.yellow,table .headerSortDown.yellow {
    +	background-color: #fff6d9;
    +}
    +
    +table .orange {
    +	color: #f89406;
    +	border-bottom-color: #f89406;
    +}
    +
    +table .headerSortUp.orange,table .headerSortDown.orange {
    +	background-color: #fee9cc;
    +}
    +
    +table .purple {
    +	color: #7a43b6;
    +	border-bottom-color: #7a43b6;
    +}
    +
    +table .headerSortUp.purple,table .headerSortDown.purple {
    +	background-color: #e2d5f0;
    +}
    +/*鍒嗛〉鏉℃牱寮*/
    +.pagination {
    +  height: 20px;
    +  margin: 5px 0;
    +}
    +.pagination ul > li > a,
    +.pagination ul > li > span {
    +  float: left;
    +  padding: 0 10px;
    +  line-height: 25px;
    +  text-decoration: none;
    +  background-color: #ffffff;
    +  border: 1px solid #dddddd;
    +  border-left-width: 0;
    +}
    +/*鍒楄〃鏍峰紡*/
    +.table {
    +  width: 100%;
    +  margin-bottom: 5px;
    +}
    +.table th,
    +.table td {
    +  padding: 6px;
    +  line-height: 17px;
    +  text-align: left;
    +  vertical-align: top;
    +  border-top: 1px solid #dddddd;
    +}
    +
    diff --git a/src/main/webapp/plug-in/datatables/thems/grey/datatables_style.js b/src/main/webapp/plug-in/datatables/thems/grey/datatables_style.js
    new file mode 100644
    index 00000000..6e0fe239
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/grey/datatables_style.js
    @@ -0,0 +1,125 @@
    +/* Default class modification */
    +$.extend($.fn.dataTableExt.oStdClasses, {
    +	"sSortAsc" : "header headerSortDown",
    +	"sSortDesc" : "header headerSortUp",
    +	"sSortable" : "header"
    +});
    +
    +/* API method to get paging information */
    +$.fn.dataTableExt.oApi.fnPagingInfo = function(oSettings) {
    +	return {
    +		"iStart" : oSettings._iDisplayStart,
    +		"iEnd" : oSettings.fnDisplayEnd(),
    +		"iLength" : oSettings._iDisplayLength,
    +		"iTotal" : oSettings.fnRecordsTotal(),
    +		"iFilteredTotal" : oSettings.fnRecordsDisplay(),
    +		"iPage" : Math.ceil(oSettings._iDisplayStart
    +				/ oSettings._iDisplayLength),
    +		"iTotalPages" : Math.ceil(oSettings.fnRecordsDisplay()
    +				/ oSettings._iDisplayLength)
    +	};
    +};
    +
    +/* Bootstrap style pagination control */
    +$.extend(
    +				$.fn.dataTableExt.oPagination,
    +				{
    +					"bootstrap" : {
    +						"fnInit" : function(oSettings, nPaging, fnDraw) {
    +							var oLang = oSettings.oLanguage.oPaginate;
    +							var fnClickHandler = function(e) {
    +								e.preventDefault();
    +								if (oSettings.oApi._fnPageChange(oSettings,
    +										e.data.action)) {
    +									fnDraw(oSettings);
    +								}
    +							};
    +
    +							$(nPaging)
    +									.addClass('pagination')
    +									.append(
    +											'<ul>'
    +													+ '<li class="prev disabled"><a href="#">&larr; '
    +													+ oLang.sPrevious
    +													+ '</a></li>'
    +													+ '<li class="next disabled"><a href="#">'
    +													+ oLang.sNext
    +													+ ' &rarr; </a></li>'
    +													+ '</ul>');
    +							var els = $('a', nPaging);
    +							$(els[0]).bind('click.DT', {
    +								action : "previous"
    +							}, fnClickHandler);
    +							$(els[1]).bind('click.DT', {
    +								action : "next"
    +							}, fnClickHandler);
    +						},
    +
    +						"fnUpdate" : function(oSettings, fnDraw) {
    +							var iListLength = 5;
    +							var oPaging = oSettings.oInstance.fnPagingInfo();
    +							var an = oSettings.aanFeatures.p;
    +							var i, j, sClass, iStart, iEnd, iHalf = Math
    +									.floor(iListLength / 2);
    +
    +							if (oPaging.iTotalPages < iListLength) {
    +								iStart = 1;
    +								iEnd = oPaging.iTotalPages;
    +							} else if (oPaging.iPage <= iHalf) {
    +								iStart = 1;
    +								iEnd = iListLength;
    +							} else if (oPaging.iPage >= (oPaging.iTotalPages - iHalf)) {
    +								iStart = oPaging.iTotalPages - iListLength + 1;
    +								iEnd = oPaging.iTotalPages;
    +							} else {
    +								iStart = oPaging.iPage - iHalf + 1;
    +								iEnd = iStart + iListLength - 1;
    +							}
    +
    +							for (i = 0, iLen = an.length; i < iLen; i++) {
    +								// Remove the middle elements
    +								$('li:gt(0)', an[i]).filter(':not(:last)')
    +										.remove();
    +
    +								// Add the new list items and their event
    +								// handlers
    +								for (j = iStart; j <= iEnd; j++) {
    +									sClass = (j == oPaging.iPage + 1) ? 'class="active"'
    +											: '';
    +									$(
    +											'<li ' + sClass + '><a href="#">'
    +													+ j + '</a></li>')
    +											.insertBefore(
    +													$('li:last', an[i])[0])
    +											.bind(
    +													'click',
    +													function(e) {
    +														e.preventDefault();
    +														oSettings._iDisplayStart = (parseInt(
    +																$('a', this)
    +																		.text(),
    +																10) - 1)
    +																* oPaging.iLength;
    +														fnDraw(oSettings);
    +													});
    +								}
    +
    +								// Add / remove disabled classes from the static
    +								// elements
    +								if (oPaging.iPage === 0) {
    +									$('li:first', an[i]).addClass('disabled');
    +								} else {
    +									$('li:first', an[i])
    +											.removeClass('disabled');
    +								}
    +
    +								if (oPaging.iPage === oPaging.iTotalPages - 1
    +										|| oPaging.iTotalPages === 0) {
    +									$('li:last', an[i]).addClass('disabled');
    +								} else {
    +									$('li:last', an[i]).removeClass('disabled');
    +								}
    +							}
    +						}
    +					}
    +				});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/datatables/thems/grey/datatables_top.css b/src/main/webapp/plug-in/datatables/thems/grey/datatables_top.css
    new file mode 100644
    index 00000000..e29cb2e5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/grey/datatables_top.css
    @@ -0,0 +1,490 @@
    +.req {
    +    color: red !important;
    +    font-weight: bold;
    +}
    +body {
    +    padding-top:60px;
    +    padding-bottom: 40px;
    +    background-image: url("../images/bg/furley_bg.png");
    +    background-repeat: repeat;
    +}
    +.well {
    +    background-color: #ffffff;
    +}
    +.main-nav-wrapper {
    +    position: relative;
    +    top:-90px;
    +}
    +.main-nav-wrapper {
    +    margin-left: -20px;
    +    margin-right: -20px;
    +}
    +.page-header {
    +    padding-bottom: 0;
    +}
    +.page-header h1 {
    +    border-bottom: 1px solid #e9e9e9;
    +    font-family: Tahoma;
    +    font-size: 45px;
    +    height: 55px;
    +}
    +.main-nav li.active a {
    +    background-image:none;
    +    background-position: center bottom;
    +    background-repeat: no-repeat;
    +    background-color: transparent;
    +}
    +
    +.main-nav li.active.main-nav-arrow a {
    +    background-position: center bottom;
    +    background-repeat: no-repeat;
    +    background-image:url("../images/top-arrow.png");
    +}
    +
    +.main-nav li.main-nav-arrow a {
    +    background-position: center bottom;
    +    background-repeat: no-repeat;
    +    background-image:url("../images/top-arrow.png");
    +}
    +.main-nav {
    +    margin-bottom: 0px;
    +}
    +
    +.navbar .nav {
    +    float: none;
    +}
    +
    +
    +
    +div.logo {
    +    font-family: tahoma;
    +    background-repeat: no-repeat;
    +    height: 62px;
    +    width: 99%;
    +    margin: 5px;
    +    position: absolute;
    +    top:0px;
    +}
    +
    +div.logo h1 {
    +    margin-top:10px;
    +    font-size: 45px;
    +    font-family: tahoma;
    +    background-image: url(../images/glyphicons/glyphicons_023_cogwheels.png);
    +    background-repeat: no-repeat;
    +    background-position: left center;
    +    padding-left: 30px;
    +}
    +
    +.main-nav.navbar .nav > li > a {
    +    margin-top: 0px ;
    +    text-align:center;
    +    height: 52px;
    +
    +}
    +.main-nav.navbar .nav > li {
    +    display: inline-block;
    +    float: left;
    +    width: 16.5%;
    +    border-left: 1px solid #61B0DF;
    +}
    +.main-nav.navbar .nav > li:first-child {
    +    border-left:none;
    +}
    +
    +
    +.main-nav .navbar-inner {-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;
    +    -webkit-border-radius: 0px;
    +    -moz-border-radius: 0px;
    +    border-radius: 0px;
    +}
    +
    +.main-nav .main-nav-icon-big {
    +    text-align: center;
    +    padding: 5px;
    +}
    +
    +.user-option {
    +    margin-top: 10px;
    +    margin-right: 10px;
    +}
    +
    +
    +/* Dashboard */
    +.dashboard-chart {
    +    width: 90%;
    +    height: 300px;
    +}
    +.dashboard-member-activity p {
    +    margin:0;
    +}
    +img.dashboard-member-activity-avatar {
    +    border: 1px solid #CCCCCC;
    +    border-radius: 3px 3px 3px 3px;
    +}
    +ul.dashboard-member-activity {
    +    margin: 10px 0;
    +}
    +ul.dashboard-member-activity li {
    +    list-style: none;
    +    padding-bottom:10px;
    +    padding-top:10px;
    +}
    +ul.dashboard-member-activity li:first-child {
    +    border-top: none;
    +    padding-top:0;
    +}
    +ul.dashboard-member-activity li:last-child {
    +    border-bottom: none;
    +    padding-bottom:0;
    +}
    +ul.dashboard-statistics li a {
    +
    +    display: block;
    +    line-height: 10px;
    +    text-decoration: none;
    +}
    +ul.dashboard-member-activity li a {
    +
    +    display: inline;
    +    text-decoration: none;
    +}
    +ul.dashboard-member-activity li a:hover {
    +
    +}
    +
    +img.dashboard-member-activity-avatar {
    +    height:50px;
    +    width:50px;
    +    padding:1px;
    +    float:left;
    +    margin-left:15px;
    +    margin-right:15px;
    +}
    +
    +ul.dashboard-member-activity  .post-toolbar {
    +    cursor:pointer;
    +    text-align: left;
    +    padding-left: 85px;
    +}
    +tr .post-toolbar {
    +    visibility:hidden;
    +}
    +
    +tr:hover .post-toolbar {
    +    visibility: visible;
    +}
    +
    +ul.dashboard-member-activity li {
    +    border-bottom: 1px solid #EBEBEB;
    +    border-top: 1px solid #FFFFFF;
    +}
    +ul.news-item {
    +    list-style: none;
    +    padding-bottom:10px;
    +    padding-top:10px;
    +    margin-left: 0px;
    +}
    +.news-item li {
    +    border-bottom: 1px solid #EBEBEB;
    +    border-top: 1px solid #FFFFFF;
    +}
    +
    +
    +.news-item li:first-child {
    +    border-top: none;
    +    padding-top:0;
    +}
    +.news-item li:last-child {
    +    border-bottom: none;
    +    padding-bottom:0;
    +}
    +
    +.news-date {
    +    float: left;
    +    font-size: 140%;
    +    font-weight: bold;
    +    width: 50px;
    +
    +    margin: 5px;
    +
    +
    +
    +}
    +.news-date span {
    +    display: block;
    +    padding: 3px;
    +    text-align: center;
    +}
    +/* Subnav */
    +.subnav {
    +    width: 100%;
    +    height: 36px;
    +    background-color: #ffffff; /* Old browsers */
    +    /*background-repeat: repeat-x; *//* Repeat the gradient *//*
    +    background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); *//* FF3.6+ *//*
    +    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#eeeeee)); *//* Chrome,Safari4+ *//*
    +    background-image: -webkit-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); *//* Chrome 10+,Safari 5.1+ *//*
    +    background-image: -ms-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); *//* IE10+ *//*
    +    background-image: -o-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); *//* Opera 11.10+ *//*
    +    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); *//* IE6-9 *//*
    +    background-image: linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); *//* W3C */
    +    border-bottom: 1px solid #e5e5e5;
    +    -webkit-border-radius: 0px;
    +    -moz-border-radius: 0px;
    +    border-radius: 0px;
    +    margin-top: 0px;
    +}
    +.subnav .nav {
    +    margin-bottom: 0;
    +}
    +.subnav .nav > li > a {
    +    margin: 0;
    +    padding-top:    11px;
    +    padding-bottom: 10px;
    +    border-left: 1px solid #f5f5f5;
    +    border-right: 1px solid #e5e5e5;
    +    -webkit-border-radius: 0;
    +    -moz-border-radius: 0;
    +    border-radius: 0;
    +}
    +.subnav .nav > .active > a,
    +.subnav .nav > .active > a:hover {
    +    padding-left: 13px;
    +    color: #2071A1;
    +    background-color: inherit;
    +    border-right-color: #ddd;
    +    border-left: 0;  /*
    +    -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.05);
    +    -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.05);
    +    box-shadow: inset 0 3px 5px rgba(0,0,0,.05); */
    +    font-weight: bold;
    +}
    +.subnav .nav > .active > a .caret,
    +.subnav .nav > .active > a:hover .caret {
    +    /* border-top-color: #777;*/
    +}
    +.subnav .nav > li:first-child > a,
    +.subnav .nav > li:first-child > a:hover {
    +    border-left: 0;
    +    padding-left: 12px;
    +    -webkit-border-radius: 4px 0 0 4px;
    +    -moz-border-radius: 4px 0 0 4px;
    +    border-radius: 4px 0 0 4px;
    +}
    +.subnav .nav > li:last-child > a {
    +    border-right: 0;
    +}
    +.subnav .dropdown-menu {
    +    -webkit-border-radius: 0 0 4px 4px;
    +    -moz-border-radius: 0 0 4px 4px;
    +    border-radius: 0 0 4px 4px;
    +}
    +
    +/* Portlets */
    +.box {
    +    margin-bottom:5px;
    +}
    +.box h4.box-header {
    +    size:10px;
    +    padding: 5px 5px;
    +    margin: 0;
    +    list-style: none;
    +    cursor:move;
    +}
    +
    +
    +.box-content {
    +    padding:3px;
    +    padding-bottom: 30px;
    +    background-color: #ffffff;
    +}
    +.box-container-toggle {
    +    background-color: #ffffff;
    +}
    +
    +.box-content.form-box {
    +    padding-top: 5px;
    +    padding-bottom: 5px;
    +    padding: 0px;
    +    text-indent: 10px;
    +}
    +
    +.box-content.form-box .form-box-wrapper {
    +    text-indent: 0;
    +    margin-left: 10px;
    +    padding-top:10px;
    +}
    +
    +.box-content.form-box .table {
    +    margin-bottom: 0px;
    +}
    +
    +.box-content.form-box .fileupload-buttonbar {
    +    padding-left:10px;
    +}
    +.box-content.form-box form, .box-content.form-box .form-actions {
    +    margin: 0;
    +}
    +
    +.box-btn {
    +    float:right;
    +    margin-left:2px;
    +    margin-right:2px;
    +    height: 14px;
    +    width: 14px;
    +    text-decoration:none;
    +    display: block;
    +    float: right;
    +    overflow: hidden;
    +    background-position:center;
    +    cursor:pointer;
    +}
    +
    +.box-btn [class^="icon-"], .box-btn [class*=" icon-"] {
    +    vertical-align:top;
    +}
    +
    +.box-container-closed {
    +    display:none;
    +}
    +/* Portlets */
    +.box h4.box-header {
    +    background-color: #e9e9e9; /* Old browsers */
    +    border: 1px solid #e5e5e5;
    +    -webkit-box-shadow: inset 0 1px 0 #ffffff;
    +    -moz-box-shadow: inset 0 1px 0 #ffffff;
    +    box-shadow: inset 0 1px 0 #ffffff;
    +}
    +
    +.box .box-container-toggle {
    +    border-left:1px solid #DDD;
    +    border-right:1px solid #DDD;
    +    border-bottom:1px solid #DDD;
    +
    +    -webkit-border-radius: 3px;
    +    -moz-border-radius: 3px;
    +    border-radius: 3px;
    +    -webkit-border-top-left-radius: 0px;
    +    -webkit-border-top-right-radius: 0px;
    +    -moz-border-top-left-radius: 0px;
    +    -moz-border-top-right-radius: 0px;
    +    border-top-left-radius: 0px;
    +    border-top-right-radius: 0px
    +}
    +
    +.box-btn, .box [class^="icon-"], .box [class*=" icon-"]  {
    +    margin-top: 2px;
    +}
    +
    +/* Round Corners and text effects
    +----------------------------------------------------------------------------------------------------*/
    +
    +.round-all {
    +    -webkit-border-radius: 3px;
    +    -moz-border-radius: 3px;
    +    border-radius: 3px;
    +}
    +.round-top {
    +    -webkit-border-top-left-radius: 3px;
    +    -webkit-border-top-right-radius: 3px;
    +    -moz-border-radius-topleft: 3px;
    +    -moz-border-radius-topright: 3px;
    +    border-radius: 3px 3px 0 0;
    +}
    +.round-bottom {
    +    -webkit-border-bottom-right-radius: 3px;
    +    -webkit-border-bottom-left-radius: 3px;
    +    -moz-border-radius-bottomright: 3px;
    +    -moz-border-radius-bottomleft: 3px;
    +    border-radius: 0 0 3px 3px;
    +}
    +.round-left {
    +    -webkit-border-top-left-radius: 3px;
    +    -webkit-border-bottom-left-radius: 3px;
    +    -moz-border-radius-topleft: 3px;
    +    -moz-border-radius-bottomleft: 3px;
    +    border-radius: 3px 0 0 3px;
    +}
    +.round-right {
    +    -webkit-border-top-right-radius: 3px;
    +    -webkit-border-bottom-right-radius: 3px;
    +    -moz-border-radius-topright: 3px;
    +    -moz-border-radius-bottomright: 3px;
    +    border-radius:0 3px 3px 0;
    +}
    +
    +
    +/* Show Grid */
    +.show-grid {
    +    margin-bottom: 10px;
    +    margin-top: 10px;
    +}
    +.show-grid [class*="span"] {
    +
    +    line-height: 30px;
    +    min-height: 30px;
    +    text-align: center;
    +}
    +.show-grid .show-grid {
    +    margin-bottom: 0;
    +    margin-top: 0;
    +}
    +
    +.show-grid [class*="span"] {
    +    background: none repeat scroll 0 0 #ffffff;
    +    border-radius: 3px 3px 3px 3px;
    +}
    +
    +.show-grid:hover [class*="span"] {
    +    background: none repeat scroll 0 0 #DDDDDD;
    +}
    +
    +.show-grid .show-grid [class*="span"] {
    +    background-color: #CCCCCC;
    +}
    +
    +/* Bootstrap Data Tables Styles */
    +div.dataTables_length label {
    +    float: left;
    +    text-align: left;
    +}
    +
    +div.dataTables_length select {
    +    width: 50px;
    +}
    +
    +div.dataTables_filter label {
    +    float: right;
    +}
    +
    +div.dataTables_info {
    +    padding-top: 0px;
    +}
    +
    +div.dataTables_paginate {
    +	padding-top: 0px;
    +    float: right;
    +    margin: 0;
    +}
    +
    +
    +
    +table.dataTable th:active {
    +    outline: none;
    +}
    +.dataTables_filter input, .dataTables_length select {
    +    display: inline-block;
    +    *display: inline;
    +    margin: 0;
    +    *zoom: 1;
    +}
    +
    +.sort-index, .hidden {
    +    left: -10000px;
    +    position: absolute;
    +    top: -10000px;
    +    visibility: hidden;
    +}
    +
    +
    diff --git a/src/main/webapp/plug-in/datatables/thems/grey/demo.txt b/src/main/webapp/plug-in/datatables/thems/grey/demo.txt
    new file mode 100644
    index 00000000..edcb192d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/datatables/thems/grey/demo.txt
    @@ -0,0 +1,129 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<!DOCTYPE html>
    +<html>
    +	<head> 
    +		<title>bootstarp娴嬭瘯</title>
    +		<link type="text/css" rel="stylesheet" href="plug-in/bootstrap/css/bootstrap.css"" ></link>
    +		<link type="text/css" rel="stylesheet" href="plug-in/datatables/thems/grey/datatables_top.css"></link>
    +		<link rel="stylesheet" href="plug-in/datatables/thems/grey/datatables_style.css" type="text/css"></link>
    +		<script type="text/javascript" src="plug-in/jquery/jquery-1.8.2.min.js"></script>
    +		<script type="text/javascript" src="plug-in/datatables/js/jquery.dataTables.js"></script>
    +		<script type="text/javascript" src="plug-in/datatables/thems/grey/datatables_style.js"></script>
    +		<script type="text/javascript">
    +	    $(document).ready(function() {
    +		var oTable = $('#example').dataTable({
    +			//"sDom" : "<'row'<'span6'l><'span6'f>r>t<'row'<'span6'i><'span6'p>>",
    +			"bProcessing" : true,//褰揹atatable鑾峰彇鏁版嵁鏃跺欐槸鍚︽樉绀烘鍦ㄥ鐞嗘彁绀轰俊鎭
    +			"bPaginate" : true, //鏄惁鍒嗛〉
    +			"sPaginationType" : "bootstrap",//鍒嗛〉鏍峰紡full_numbers,
    +			"bFilter" : true,//鏄惁浣跨敤鍐呯疆鐨勮繃婊ゅ姛鑳
    +			"bSort" : true, //鎺掑簭鍔熻兘
    +			"bAutoWidth" : true,//鑷姩瀹藉害
    +			"bLengthChange" : true,//鏄惁鍏佽鐢ㄦ埛鑷畾涔夋瘡椤垫樉绀烘潯鏁
    +			"bInfo" : true,//椤佃剼淇℃伅
    +			"sAjaxSource" : "userController.do?test",
    +			"bServerSide" : true,//鎸囧畾浠庢湇鍔″櫒绔幏鍙栨暟鎹 	
    +			"oLanguage" : { //姹夊寲  
    +				"sLengthMenu" : " _MENU_ 鏉¤褰",
    +				"sZeroRecords" : "娌℃湁妫绱㈠埌鏁版嵁",
    +				"sInfo" : "绗 _START_ 鑷 _END_ 鏉℃暟鎹 鍏 _TOTAL_ 鏉",
    +				"sInfoEmtpy" : "娌℃湁鏁版嵁",
    +				"sProcessing" : "姝e湪鍔犺浇鏁版嵁...",
    +				"sSearch" : "鎼滅储",
    +				"oPaginate" : {
    +					"sFirst" : "棣栭〉",
    +					"sPrevious" : "鍓嶉〉", 
    +					"sNext" : "鍚庨〉",
    +					"sLast" : "灏鹃〉"
    +				}
    +			},
    +			//鑾峰彇鏁版嵁鐨勫鐞嗗嚱鏁 //"data" : {_dt_json : JSON.stringify(aoData)},
    +			"fnServerData" : function(sSource, aoData, fnCallback, oSettings) {
    +				oSettings.jqXHR = $.ajax({
    +					"dataType" : 'json',
    +					"type" : "POST",
    +					"url" : sSource,
    +					"data" : aoData,
    +					"success" : fnCallback
    +				});
    +			},
    +			//"aaSorting": [[0 , "desc" ],[1 , "asc" ]],
    +			"aoColumnDefs" : [ {
    +				"sClass" : "center",
    +				"aTargets" : [ 0, 1, 2, 3 ]
    +			},
    +			
    +			{
    +				"bSearchable" : false,
    +				"aTargets" : [ 3, 4 ]
    +			}, {
    +				"bVisible" : false,
    +				"aTargets" : [ 0 ]
    +			},
    +			{
    +				"bSortable" : false,
    +				"aTargets" : [ 3, 4 ]
    +			} ],
    +			"aoColumns" : [ {
    +				"sName" : "id",
    +				"sTitle" : "ID",
    +				"mDataProp" : "id",
    +				"mData" : "id"
    +			}, {
    +				"sName" : "userName",
    +				"sTitle" : "鐢ㄦ埛鍚",
    +				"mDataProp" : "userName",
    +				"mData" : "userName",
    +				"sWidth":"20%"
    +			}, {
    +				"sName" : "mobilePhone",
    +				"sTitle" : "鎵嬫満",
    +				"mDataProp" : "mobilePhone",
    +				"mData" : "mobilePhone",
    +				"bSortable" : false,
    +				"bSearchable" : false,
    +				"sWidth":"20%"
    +			}, {
    +				"sName" : "TSDepart_departname",
    +				"sTitle" : "閮ㄩ棬",
    +				"mDataProp" : "TSDepart_departname",
    +				"mData" : "TSDepart_departname",
    +				"sWidth":"20%"
    +			}, {
    +				"sTitle" : "鎿嶄綔",
    +				"mData" : "id",
    +				"sWidth":"30%",
    +				"mRender" : function(data, type, row) {
    +					return row.id;
    +				}
    +			} ]
    +		});
    +	});
    +</script>
    +  	</head>
    +	<body>
    +		
    +			<div class="row-fluid">
    +				<div class="span12">
    +					<div class="box">
    +						<h4 class="box-header round-top">
    +							<i class="icon-list"></i> 鐢ㄦ埛绠$悊
    +							<small class="hidden-phone">鐢ㄦ埛鍒楄〃</small>
    +							<a class="box-btn" title="鍏抽棴"><i class="icon-remove" ></i> </a>
    +							<a class="box-btn" title="鏀剁缉"><i class="icon-minus"></i> </a>
    +							<a class="box-btn" title="璁剧疆" data-toggle="modal"><i class="icon-cog"></i> </a>
    +						</h4>
    +						<div class="box-container-toggle" id="dd">
    +							<div class="box-content">
    +								<table width="100%" cellpadding="0" cellspacing="0" border="0" class="table table-striped table-bordered bootstrap-datatable" id="example">
    +								</table>
    +							</div>
    +						</div>
    +					</div>
    +				</div>
    +				<!--/span-->
    +			</div>
    +			<!--/row-->
    +		
    +	</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/easyui/extends/datagrid-scrollview.js b/src/main/webapp/plug-in/easyui/extends/datagrid-scrollview.js
    new file mode 100644
    index 00000000..909af515
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/extends/datagrid-scrollview.js
    @@ -0,0 +1,533 @@
    +/***
    + * @author jueyue
    + * @version1.0
    + *铏氭嫙甯冨眬锛屾彁渚涘ぇ鏁版嵁閲忕殑甯冨眬鏂瑰紡锛屾渶濂界殑鏂瑰紡鏄嚜宸辨彁渚涢珮搴﹀拰瀹藉害锛岄粯璁ら珮搴25
    + *鐗瑰埆鏄湪鏈夊浘鐗囩殑鎯呭喌涓,璇锋寚瀹氳楂橀粯璁25px
    + *濡傛灉淇敼楂樺害 rowStyler 鎸囧畾琛岄珮锛屼笉鐒朵笉濂藉榻
    + *涓娆″姞杞芥暟鎹娆℃覆鏌撴暟鎹,鎵浠e涓嬩篃涓嶅瓨鍦ㄨ鏁板お澶氳屼笉娓叉煋澶辫触鐨勯棶棰
    + */
    +var scrollview = $.extend({}, $.fn.datagrid.defaults.view, {
    +	/***
    +	 * 娓叉煋鍑芥暟
    +	 * @param {} target
    +	 * @param {} container
    +	 * @param {} frozen
    +	 */
    +	render : function(target, container, frozen) {
    +		var state = $.data(target, 'datagrid');
    +		var opts = state.options;
    +		var rows = this.rows || [];
    +		if (!rows.length) {
    +			return;
    +		}
    +		var fields = $(target).datagrid('getColumnFields', frozen);
    +
    +		if (frozen) {
    +			if (!(opts.rownumbers || (opts.frozenColumns && opts.frozenColumns.length))) {
    +				return;
    +			}
    +		}
    +
    +		var index = this.index;
    +		var classValue = '';
    +		var styleValue = '';
    +		var style = '';
    +		var table = ['<table class="datagrid-btable" cellspacing="0" cellpadding="0" border="0"><tbody>'];
    +		for (var i = 0; i < rows.length; i++) {
    +			var css = opts.rowStyler ? opts.rowStyler.call(target, index,
    +					rows[i]) : '';
    +			if (typeof css == 'string') {
    +				styleValue = css;
    +			} else if (css) {
    +				classValue = css['class'] || '';
    +				styleValue = css['style'] || '';
    +			}
    +			var cls = 'class="datagrid-row '
    +					+ (index % 2 && opts.striped ? 'datagrid-row-alt ' : ' ')
    +					+ classValue + '"';
    +					
    +			if(frozen){
    +				style = 'style="height:'+opts.rowHeight+'px;"'
    +			}else{
    +				style = styleValue ? 'style="' + styleValue + '"' : 'style="height:25px;"';
    +			}
    +			var rowId = state.rowIdPrefix + '-' + (frozen ? 1 : 2) + '-'
    +					+ index;
    +			table.push('<tr id="' + rowId + '" datagrid-row-index="' + index
    +					+ '" ' + cls + ' ' + style + '>');
    +			table.push(this.renderRow.call(this, target, fields, frozen, index,
    +					rows[i]));
    +			table.push('</tr>');
    +
    +			// render the detail row
    +			if (opts.detailFormatter) {
    +				table.push('<tr style="display:none;">');
    +				if (frozen) {
    +					table.push('<td colspan=' + (fields.length + 2)
    +							+ ' style="border-right:0">');
    +				} else {
    +					table.push('<td colspan=' + (fields.length) + '>');
    +				}
    +				table.push('<div class="datagrid-row-detail">');
    +				if (frozen) {
    +					table.push('&nbsp;');
    +				} else {
    +					table.push(opts.detailFormatter.call(target, i, rows[i]));
    +				}
    +				table.push('</div>');
    +				table.push('</td>');
    +				table.push('</tr>');
    +			}
    +			index++;
    +		}
    +		table.push('</tbody></table>');
    +		$(container).html(table.join(''));
    +		
    +	},
    +	/**
    +	 * 娓叉煋琛,杩欓噷涓珮搴﹂兘鏄痑uto,鍙互鍦╟ol閲岄潰鏉ュ仛style闄愬埗
    +	 * @param {} target
    +	 * @param {} fields
    +	 * @param {} frozen
    +	 * @param {} rowIndex
    +	 * @param {} rowData
    +	 * @return {}
    +	 */
    +	renderRow : function(target, fields, frozen, rowIndex, rowData) {
    +		var opts = $.data(target, 'datagrid').options;
    +
    +		var cc = [];
    +		//娣诲姞琛屽彿
    +		if (frozen && opts.rownumbers) {
    +			var rownumber = rowIndex + 1;
    +			if (opts.pagination) {
    +				rownumber += (opts.pageNumber - 1) * opts.pageSize;
    +			}
    +			cc.push('<td class="datagrid-td-rownumber"><div class="datagrid-cell-rownumber" style="text-align:center">'
    +							+ rownumber + '</div></td>');
    +		}
    +		for (var i = 0; i < fields.length; i++) {
    +			var field = fields[i];
    +			var col = $(target).datagrid('getColumnOption', field);
    +			if (col) {
    +				var value = rowData[field]; // the field value
    +				var css = col.styler
    +						? (col.styler(value, rowData, rowIndex) || '')
    +						: '';
    +				var classValue = '';
    +				var styleValue = '';
    +				if (typeof css == 'string') {
    +					styleValue = css;
    +				} else if (cc) {
    +					classValue = css['class'] || '';
    +					styleValue = css['style'] || '';
    +				}
    +				var cls = classValue ? 'class="' + classValue + '"' : '';
    +				var style = col.hidden
    +						? 'style="display:none;' + styleValue + '"'
    +						: (styleValue ? 'style="' + styleValue + '"' : '');
    +
    +				cc.push('<td field="' + field + '" ' + cls + ' ' + style + '>');
    +
    +				if (col.checkbox) {
    +					style = 'height:15;';
    +				} else if (col.expander) {
    +					style = "text-align:center;height:15;";
    +				} else {
    +					style = styleValue;
    +					if (col.align) {
    +						style += ';text-align:' + col.align + ';'
    +					}
    +					if (!opts.nowrap) {
    +						style += ';white-space:normal;height:auto;';
    +					} else if (opts.autoRowHeight) {
    +						style += ';height:auto;';
    +					}
    +				}
    +
    +				cc.push('<div style="' + style + '" ');
    +				if (col.checkbox) {
    +					cc.push('class="datagrid-cell-check');
    +				} else {
    +					cc.push('class="datagrid-cell ' + col.cellClass);
    +				}
    +				cc.push('">');
    +
    +				if (col.checkbox) {
    +					cc.push('<input type="checkbox" name="' + field
    +							+ '" value="' + (value != undefined ? value : '')
    +							+ '">');
    +				} else if (col.expander) {
    +					cc.push('<span class="datagrid-row-expander datagrid-row-expand" style="display:inline-block;width:25px;height:auto;cursor:pointer;" />');
    +				} else if (col.formatter) {
    +					cc.push(col.formatter(value, rowData, rowIndex));
    +				} else {
    +					cc.push(value);
    +				}
    +
    +				cc.push('</div>');
    +				cc.push('</td>');
    +			}
    +		}
    +		return cc.join('');
    +	},
    +
    +	bindEvents : function(target) {
    +		var state = $.data(target, 'datagrid');
    +		var dc = state.dc;
    +		var opts = state.options;
    +		var body = dc.body1.add(dc.body2);
    +		var clickHandler = ($.data(body[0], 'events') || $._data(body[0],
    +				'events')).click[0].handler;
    +		body.unbind('click').bind('click', function(e) {
    +					var tt = $(e.target);
    +					var tr = tt.closest('tr.datagrid-row');
    +					if (!tr.length) {
    +						return
    +					}
    +					if (tt.hasClass('datagrid-row-expander')) {
    +						var rowIndex = parseInt(tr.attr('datagrid-row-index'));
    +						if (tt.hasClass('datagrid-row-expand')) {
    +							$(target).datagrid('expandRow', rowIndex);
    +						} else {
    +							$(target).datagrid('collapseRow', rowIndex);
    +						}
    +						$(target).datagrid('fixRowHeight');
    +
    +					} else {
    +						clickHandler(e);
    +					}
    +					e.stopPropagation();
    +				});
    +	},
    +
    +	onBeforeRender : function(target) {
    +		var state = $.data(target, 'datagrid');
    +		var opts = state.options;
    +		//杩欎釜鏄敤鏉ラ檺鍒舵樉绀鸿鏁扮殑
    +		var dc = state.dc;
    +		var view = this;
    +		/**
    +		 * 璁剧疆琛岄珮,杩欎釜鍦版柟闇瑕佹敞鎰,濡傛灉涓嶅悓琛岄珮,姣斿鏈夊浘鐗囨垨鑰呭叾浠栫殑涓滆タ,璇峰湪rowStyle璁剧疆琛岄珮
    +		 * 涓嶇劧鏃犳硶璁$畻楂樺害,骞朵笖璋冪敤rowStyler鏂规硶浼犲叆鑱屼负null杩欎釜闇瑕佹敞鎰忎笅
    +		 * 瑙f瀽鏂规硶灏辨槸涓嬮潰鐨,鎵浠ヨ涓嶈娣诲姞绌烘牸浠涔堢殑
    +		 */
    +		opts.rowHeight = calculateDataGridTrStyleHeight(opts.rowStyler
    +				? opts.rowStyler.call(null, null, null)
    +				: '');
    +		/**
    +		 * 璁剧疆椤佃鏁,鎰熻姣忔婊氬姩鐨勬潯鏁板湪4琛岀殑鏍峰瓙锛屾墍浠ュ娓叉煋6琛岋紝chrome鍑犱箮娌℃湁鎰熻锛宨eie鍩烘湰涔熸病鏈夊暐鎰熻,
    +		 * 杩欎釜+10鍙互鑷繁璋冩暣涓
    +		 */
    +		opts.viewPageSize = Math.floor(dc.body2.height()/opts.rowHeight)+10;
    +		//杩欓噷鐢ㄦ潵缂撳瓨鏁版嵁
    +		state.data.cacheRows  = state.data.rows;
    +		opts.finder.getRow = function(t, p) {
    +			var index = (typeof p == 'object')
    +					? p.attr('datagrid-row-index')
    +					: p;
    +			var row = $.data(t, 'datagrid').data.rows[index];
    +			if (!row) {
    +				var v = $(t).datagrid('options').view;
    +				row = v.rows[index - v.index];
    +			}
    +			return row;
    +		};
    +
    +		dc.body1.add(dc.body2).empty();
    +		this.rows = undefined; // the rows to be rendered
    +		this.r1 = this.r2 = []; // the first part and last part of rows
    +
    +		init();
    +		createHeaderExpander();
    +
    +		function init() {
    +			state.onLoadSuccess = opts.onLoadSuccess;
    +			opts.onLoadSuccess = function() {
    +			};
    +			setTimeout(function() {
    +						dc.body2.unbind('.datagrid').bind('scroll.datagrid',
    +								function(e) {
    +									if (state.onLoadSuccess) {
    +										opts.onLoadSuccess = state.onLoadSuccess; // restore
    +										state.onLoadSuccess = undefined;
    +									}
    +									if (view.scrollTimer) {
    +										clearTimeout(view.scrollTimer);
    +									}
    +									view.scrollTimer = setTimeout(function() {
    +												scrolling.call(view);
    +											}, 50);
    +								});
    +						dc.body2.triggerHandler('scroll.datagrid');
    +					}, 0);
    +		}
    +		/**
    +		 * 杩欓噷鎵嶆槸閲嶇偣,鐩戝惉婊氬姩鏉$殑绉诲姩
    +		 * 鍔ㄦ佹覆鏌撹
    +		 */
    +		function scrolling() {
    +			if (dc.body2.is(':empty')) {
    +				reload.call(this);
    +			} else {
    +				var firstTr = opts.finder.getTr(target, this.index, 'body', 2);
    +				var lastTr = opts.finder.getTr(target, 0, 'last', 2);
    +				var headerHeight = dc.view2.children('div.datagrid-header')
    +						.outerHeight();
    +				var top = firstTr.position().top - headerHeight;
    +				var bottom = lastTr.position().top + lastTr.outerHeight()
    +						- headerHeight;
    +
    +				if (top > dc.body2.height() || bottom < 0) {
    +					reload.call(this);
    +				} else if (top > 0) {
    +					var page = Math.floor(this.index / opts.viewPageSize);
    +					this.getRows.call(this, target, page, function(rows) {
    +								this.r2 = this.r1;
    +								this.r1 = rows;
    +								this.index = (page - 1) * opts.viewPageSize;
    +								this.rows = this.r1.concat(this.r2);
    +								this.populate.call(this, target);
    +							});
    +				} else if (bottom < dc.body2.height()) {
    +					var page = Math.floor(this.index / opts.viewPageSize) + 2;
    +					if (this.r2.length) {
    +						page++;
    +					}
    +					this.getRows.call(this, target, page, function(rows) {
    +								if (!this.r2.length) {
    +									this.r2 = rows;
    +								} else {
    +									this.r1 = this.r2;
    +									this.r2 = rows;
    +									this.index += opts.viewPageSize;
    +								}
    +								this.rows = this.r1.concat(this.r2);
    +								this.populate.call(this, target);
    +							});
    +				}
    +			}
    +			/**
    +			 * 杩欓噷杩涜鏁版嵁閲嶈浇
    +			 */
    +			function reload() {
    +				var top = $(dc.body2).scrollTop();
    +				var index = Math.floor(top / opts.rowHeight);
    +				var page = Math.floor(index / opts.viewPageSize) + 1;
    +
    +				this.getRows.call(this, target, page, function(rows) {
    +							this.index = (page - 1) * opts.viewPageSize;
    +							this.rows = rows;
    +							this.r1 = rows;
    +							this.r2 = [];
    +							this.populate.call(this, target);
    +							dc.body2.triggerHandler('scroll.datagrid');
    +						});
    +			}
    +		}
    +		function createHeaderExpander() {
    +			if (!opts.detailFormatter) {
    +				return
    +			}
    +
    +			var t = $(target);
    +			var hasExpander = false;
    +			var fields = t.datagrid('getColumnFields', true).concat(t
    +					.datagrid('getColumnFields'));
    +			for (var i = 0; i < fields.length; i++) {
    +				var col = t.datagrid('getColumnOption', fields[i]);
    +				if (col.expander) {
    +					hasExpander = true;
    +					break;
    +				}
    +			}
    +			if (!hasExpander) {
    +				if (opts.frozenColumns && opts.frozenColumns.length) {
    +					opts.frozenColumns[0].splice(0, 0, {
    +								field : '_expander',
    +								expander : true,
    +								width : 24,
    +								resizable : false,
    +								fixed : true
    +							});
    +				} else {
    +					opts.frozenColumns = [[{
    +								field : '_expander',
    +								expander : true,
    +								width : 24,
    +								resizable : false,
    +								fixed : true
    +							}]];
    +				}
    +
    +				var t = dc.view1.children('div.datagrid-header').find('table');
    +				var td = $('<td rowspan="'
    +						+ opts.frozenColumns.length
    +						+ '"><div class="datagrid-header-expander" style="width:24px;"></div></td>');
    +				if ($('tr', t).length == 0) {
    +					td.wrap('<tr></tr>').parent().appendTo($('tbody', t));
    +				} else if (opts.rownumbers) {
    +					td.insertAfter(t
    +							.find('td:has(div.datagrid-header-rownumber)'));
    +				} else {
    +					td.prependTo(t.find('tr:first'));
    +				}
    +			}
    +
    +			setTimeout(function() {
    +						view.bindEvents(target);
    +					}, 0);
    +		}
    +	},
    +
    +	onAfterRender : function(target) {
    +		$.fn.datagrid.defaults.view.onAfterRender.call(this, target);
    +		var dc = $.data(target, 'datagrid').dc;
    +		var footer = dc.footer1.add(dc.footer2);
    +		footer.find('span.datagrid-row-expander').css('visibility', 'hidden');
    +	},
    +	/**
    +	 * getRows 鑾峰彇鏁版嵁鐨勫湴鏂
    +	 * @param {} target
    +	 * @param {} page
    +	 * @param {} callback
    +	 */
    +	getRows : function(target, page, callback) {
    +		var state = $.data(target, 'datagrid');
    +		var opts = state.options;
    +		var index = (page - 1) * opts.viewPageSize;
    +		var rows = state.data.cacheRows.slice(index, index + opts.viewPageSize);
    +		if (rows.length) {
    +			callback.call(this, rows);
    +		}
    +	},
    +
    +	populate : function(target) {
    +		var state = $.data(target, 'datagrid');
    +		var opts = state.options;
    +		var dc = state.dc;
    +		var rowHeight = opts.rowHeight;
    +
    +		if (this.rows.length) {
    +			opts.view.render.call(opts.view, target, dc.body2, false);
    +			opts.view.render.call(opts.view, target, dc.body1, true);
    +			dc.body1.add(dc.body2).children('table.datagrid-btable').css({
    +				marginTop : this.index * rowHeight,
    +				marginBottom : state.data.cacheRows.length * rowHeight - this.rows.length
    +						* rowHeight - this.index * rowHeight
    +			});
    +		}
    +		if (this.rows.length) {
    +
    +			var r = [];
    +			for (var i = 0; i < this.index; i++) {
    +				r.push({});
    +			}
    +			state.data.rows = r.concat(this.rows);
    +			/**
    +			 * 杩欓噷鏄缃畆ows鐨勬潯鏁帮紝杩欎釜鍥犱负鍒嗛〉鐨勶紝鎵浠ヨ缃拰褰撳墠椤甸〉鐩稿悓
    +			 */
    +			opts.onLoadSuccess.call(target, {
    +						total : this.rows.length,
    +						rows : this.rows
    +					});
    +		}
    +	}
    +});
    +
    +$.extend($.fn.datagrid.methods, {	
    +			fixDetailRowHeight : function(jq, index) {
    +				return jq.each(function() {
    +							var opts = $.data(this, 'datagrid').options;
    +							var dc = $.data(this, 'datagrid').dc;
    +							var tr1 = opts.finder.getTr(this, index, 'body', 1)
    +									.next();
    +							var tr2 = opts.finder.getTr(this, index, 'body', 2)
    +									.next();
    +							if (tr2.is(':visible')) {
    +								tr1.css('height', '');
    +								tr2.css('height', '');
    +								var height = Math.max(tr1.height(), tr2
    +												.height());
    +								tr1.css('height', height);
    +								tr2.css('height', height);
    +							}
    +							dc.body2.triggerHandler('scroll');
    +						});
    +			},
    +			getExpander : function(jq, index) { // get row expander object
    +				var opts = $.data(jq[0], 'datagrid').options;
    +				return opts.finder.getTr(jq[0], index)
    +						.find('span.datagrid-row-expander');
    +			},
    +			// get row detail container
    +			getRowDetail : function(jq, index) {
    +				var opts = $.data(jq[0], 'datagrid').options;
    +				var tr = opts.finder.getTr(jq[0], index, 'body', 2);
    +				return tr.next().find('div.datagrid-row-detail');
    +			},
    +			expandRow : function(jq, index) {
    +				return jq.each(function() {
    +							var opts = $(this).datagrid('options');
    +							var dc = $.data(this, 'datagrid').dc;
    +							var expander = $(this).datagrid('getExpander',
    +									index);
    +							if (expander.hasClass('datagrid-row-expand')) {
    +								expander.removeClass('datagrid-row-expand')
    +										.addClass('datagrid-row-collapse');
    +								var tr1 = opts.finder.getTr(this, index,
    +										'body', 1).next();
    +								var tr2 = opts.finder.getTr(this, index,
    +										'body', 2).next();
    +								tr1.show();
    +								tr2.show();
    +								$(this).datagrid('fixDetailRowHeight', index);
    +								if (opts.onExpandRow) {
    +									var row = $(this).datagrid('getRows')[index];
    +									opts.onExpandRow.call(this, index, row);
    +								}
    +							}
    +						});
    +			},
    +			collapseRow : function(jq, index) {
    +				return jq.each(function() {
    +							var opts = $(this).datagrid('options');
    +							var dc = $.data(this, 'datagrid').dc;
    +							var expander = $(this).datagrid('getExpander',
    +									index);
    +							if (expander.hasClass('datagrid-row-collapse')) {
    +								expander.removeClass('datagrid-row-collapse')
    +										.addClass('datagrid-row-expand');
    +								var tr1 = opts.finder.getTr(this, index,
    +										'body', 1).next();
    +								var tr2 = opts.finder.getTr(this, index,
    +										'body', 2).next();
    +								tr1.hide();
    +								tr2.hide();
    +								dc.body2.triggerHandler('scroll');
    +								if (opts.onCollapseRow) {
    +									var row = $(this).datagrid('getRows')[index];
    +									opts.onCollapseRow.call(this, index, row);
    +								}
    +							}
    +						});
    +			}
    +		});
    +function calculateDataGridTrStyleHeight(css) {
    +	var styleValue;
    +	if (typeof css == 'string') {
    +		styleValue = css;
    +	} else if (css) {
    +		classValue = css['class'] || '';
    +		styleValue = css['style'] || '';
    +	}
    +
    +	if (styleValue && styleValue.indexOf("height") > -1) {
    +		var index = styleValue.indexOf("height") + 7;
    +		styleValue = styleValue.substr(index);
    +		return styleValue.substring(0, styleValue.indexOf(";"))
    +				.replace("px", '');
    +	}
    +	return 25;
    +
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/easyui/jquery.easyui.min.1.3.2.js b/src/main/webapp/plug-in/easyui/jquery.easyui.min.1.3.2.js
    new file mode 100644
    index 00000000..56197d51
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/jquery.easyui.min.1.3.2.js
    @@ -0,0 +1,11379 @@
    +锘/**
    + * jQuery EasyUI 1.3.2
    + * 
    + * Copyright (c) 2009-2013 www.jeasyui.com. All rights reserved.
    + *
    + * Licensed under the GPL or commercial licenses
    + * To use it on other terms please contact us: jeasyui@gmail.com
    + * http://www.gnu.org/licenses/gpl.txt
    + * http://www.jeasyui.com/license_commercial.php
    + *
    + */
    +(function($){
    +$.parser={auto:true,onComplete:function(_1){
    +},plugins:["draggable","droppable","resizable","pagination","linkbutton","menu","menubutton","splitbutton","progressbar","tree","combobox","combotree","combogrid","numberbox","validatebox","searchbox","numberspinner","timespinner","calendar","datebox","datetimebox","slider","layout","panel","datagrid","propertygrid","treegrid","tabs","accordion","window","dialog"],parse:function(_2){
    +var aa=[];
    +for(var i=0;i<$.parser.plugins.length;i++){
    +var _3=$.parser.plugins[i];
    +var r=$(".easyui-"+_3,_2);
    +if(r.length){
    +if(r[_3]){
    +r[_3]();
    +}else{
    +aa.push({name:_3,jq:r});
    +}
    +}
    +}
    +if(aa.length&&window.easyloader){
    +var _4=[];
    +for(var i=0;i<aa.length;i++){
    +_4.push(aa[i].name);
    +}
    +easyloader.load(_4,function(){
    +for(var i=0;i<aa.length;i++){
    +var _5=aa[i].name;
    +var jq=aa[i].jq;
    +jq[_5]();
    +}
    +$.parser.onComplete.call($.parser,_2);
    +});
    +}else{
    +$.parser.onComplete.call($.parser,_2);
    +}
    +},parseOptions:function(_6,_7){
    +var t=$(_6);
    +var _8={};
    +var s=$.trim(t.attr("data-options"));
    +if(s){
    +var _9=s.substring(0,1);
    +var _a=s.substring(s.length-1,1);
    +if(_9!="{"){
    +s="{"+s;
    +}
    +if(_a!="}"){
    +s=s+"}";
    +}
    +_8=(new Function("return "+s))();
    +}
    +if(_7){
    +var _b={};
    +for(var i=0;i<_7.length;i++){
    +var pp=_7[i];
    +if(typeof pp=="string"){
    +if(pp=="width"||pp=="height"||pp=="left"||pp=="top"){
    +_b[pp]=parseInt(_6.style[pp])||undefined;
    +}else{
    +_b[pp]=t.attr(pp);
    +}
    +}else{
    +for(var _c in pp){
    +var _d=pp[_c];
    +if(_d=="boolean"){
    +_b[_c]=t.attr(_c)?(t.attr(_c)=="true"):undefined;
    +}else{
    +if(_d=="number"){
    +_b[_c]=t.attr(_c)=="0"?0:parseFloat(t.attr(_c))||undefined;
    +}
    +}
    +}
    +}
    +}
    +$.extend(_8,_b);
    +}
    +return _8;
    +}};
    +$(function(){
    +if(!window.easyloader&&$.parser.auto){
    +$.parser.parse();
    +}
    +});
    +$.fn._outerWidth=function(_e){
    +if(_e==undefined){
    +if(this[0]==window){
    +return this.width()||document.body.clientWidth;
    +}
    +return this.outerWidth()||0;
    +}
    +return this.each(function(){
    +if(!$.support.boxModel&&$.browser.msie){
    +$(this).width(_e);
    +}else{
    +$(this).width(_e-($(this).outerWidth()-$(this).width()));
    +}
    +});
    +};
    +$.fn._outerHeight=function(_f){
    +if(_f==undefined){
    +if(this[0]==window){
    +return this.height()||document.body.clientHeight;
    +}
    +return this.outerHeight()||0;
    +}
    +return this.each(function(){
    +if(!$.support.boxModel&&$.browser.msie){
    +$(this).height(_f);
    +}else{
    +$(this).height(_f-($(this).outerHeight()-$(this).height()));
    +}
    +});
    +};
    +$.fn._scrollLeft=function(_10){
    +if(_10==undefined){
    +return this.scrollLeft();
    +}else{
    +return this.each(function(){
    +$(this).scrollLeft(_10);
    +});
    +}
    +};
    +$.fn._propAttr=$.fn.prop||$.fn.attr;
    +$.fn._fit=function(fit){
    +fit=fit==undefined?true:fit;
    +var p=this.parent()[0];
    +var t=this[0];
    +var _11=p.fcount||0;
    +if(fit){
    +if(!t.fitted){
    +t.fitted=true;
    +p.fcount=_11+1;
    +$(p).addClass("panel-noscroll");
    +if(p.tagName=="BODY"){
    +$("html").addClass("panel-fit");
    +}
    +}
    +}else{
    +if(t.fitted){
    +t.fitted=false;
    +p.fcount=_11-1;
    +if(p.fcount==0){
    +$(p).removeClass("panel-noscroll");
    +if(p.tagName=="BODY"){
    +$("html").removeClass("panel-fit");
    +}
    +}
    +}
    +}
    +return {width:$(p).width(),height:$(p).height()};
    +};
    +})(jQuery);
    +(function($){
    +var _12=false;
    +function _13(e){
    +var _14=$.data(e.data.target,"draggable");
    +var _15=_14.options;
    +var _16=_14.proxy;
    +var _17=e.data;
    +var _18=_17.startLeft+e.pageX-_17.startX;
    +var top=_17.startTop+e.pageY-_17.startY;
    +if(_16){
    +if(_16.parent()[0]==document.body){
    +if(_15.deltaX!=null&&_15.deltaX!=undefined){
    +_18=e.pageX+_15.deltaX;
    +}else{
    +_18=e.pageX-e.data.offsetWidth;
    +}
    +if(_15.deltaY!=null&&_15.deltaY!=undefined){
    +top=e.pageY+_15.deltaY;
    +}else{
    +top=e.pageY-e.data.offsetHeight;
    +}
    +}else{
    +if(_15.deltaX!=null&&_15.deltaX!=undefined){
    +_18+=e.data.offsetWidth+_15.deltaX;
    +}
    +if(_15.deltaY!=null&&_15.deltaY!=undefined){
    +top+=e.data.offsetHeight+_15.deltaY;
    +}
    +}
    +}
    +if(e.data.parent!=document.body){
    +_18+=$(e.data.parent).scrollLeft();
    +top+=$(e.data.parent).scrollTop();
    +}
    +if(_15.axis=="h"){
    +_17.left=_18;
    +}else{
    +if(_15.axis=="v"){
    +_17.top=top;
    +}else{
    +_17.left=_18;
    +_17.top=top;
    +}
    +}
    +};
    +function _19(e){
    +var _1a=$.data(e.data.target,"draggable");
    +var _1b=_1a.options;
    +var _1c=_1a.proxy;
    +if(!_1c){
    +_1c=$(e.data.target);
    +}
    +_1c.css({left:e.data.left,top:e.data.top});
    +$("body").css("cursor",_1b.cursor);
    +};
    +function _1d(e){
    +_12=true;
    +var _1e=$.data(e.data.target,"draggable");
    +var _1f=_1e.options;
    +var _20=$(".droppable").filter(function(){
    +return e.data.target!=this;
    +}).filter(function(){
    +var _21=$.data(this,"droppable").options.accept;
    +if(_21){
    +return $(_21).filter(function(){
    +return this==e.data.target;
    +}).length>0;
    +}else{
    +return true;
    +}
    +});
    +_1e.droppables=_20;
    +var _22=_1e.proxy;
    +if(!_22){
    +if(_1f.proxy){
    +if(_1f.proxy=="clone"){
    +_22=$(e.data.target).clone().insertAfter(e.data.target);
    +}else{
    +_22=_1f.proxy.call(e.data.target,e.data.target);
    +}
    +_1e.proxy=_22;
    +}else{
    +_22=$(e.data.target);
    +}
    +}
    +_22.css("position","absolute");
    +_13(e);
    +_19(e);
    +_1f.onStartDrag.call(e.data.target,e);
    +return false;
    +};
    +function _23(e){
    +var _24=$.data(e.data.target,"draggable");
    +_13(e);
    +if(_24.options.onDrag.call(e.data.target,e)!=false){
    +_19(e);
    +}
    +var _25=e.data.target;
    +_24.droppables.each(function(){
    +var _26=$(this);
    +if(_26.droppable("options").disabled){
    +return;
    +}
    +var p2=_26.offset();
    +if(e.pageX>p2.left&&e.pageX<p2.left+_26.outerWidth()&&e.pageY>p2.top&&e.pageY<p2.top+_26.outerHeight()){
    +if(!this.entered){
    +$(this).trigger("_dragenter",[_25]);
    +this.entered=true;
    +}
    +$(this).trigger("_dragover",[_25]);
    +}else{
    +if(this.entered){
    +$(this).trigger("_dragleave",[_25]);
    +this.entered=false;
    +}
    +}
    +});
    +return false;
    +};
    +function _27(e){
    +_12=false;
    +_23(e);
    +var _28=$.data(e.data.target,"draggable");
    +var _29=_28.proxy;
    +var _2a=_28.options;
    +if(_2a.revert){
    +if(_2b()==true){
    +$(e.data.target).css({position:e.data.startPosition,left:e.data.startLeft,top:e.data.startTop});
    +}else{
    +if(_29){
    +var _2c,top;
    +if(_29.parent()[0]==document.body){
    +_2c=e.data.startX-e.data.offsetWidth;
    +top=e.data.startY-e.data.offsetHeight;
    +}else{
    +_2c=e.data.startLeft;
    +top=e.data.startTop;
    +}
    +_29.animate({left:_2c,top:top},function(){
    +_2d();
    +});
    +}else{
    +$(e.data.target).animate({left:e.data.startLeft,top:e.data.startTop},function(){
    +$(e.data.target).css("position",e.data.startPosition);
    +});
    +}
    +}
    +}else{
    +$(e.data.target).css({position:"absolute",left:e.data.left,top:e.data.top});
    +_2b();
    +}
    +_2a.onStopDrag.call(e.data.target,e);
    +$(document).unbind(".draggable");
    +setTimeout(function(){
    +$("body").css("cursor","");
    +},100);
    +function _2d(){
    +if(_29){
    +_29.remove();
    +}
    +_28.proxy=null;
    +};
    +function _2b(){
    +var _2e=false;
    +_28.droppables.each(function(){
    +var _2f=$(this);
    +if(_2f.droppable("options").disabled){
    +return;
    +}
    +var p2=_2f.offset();
    +if(e.pageX>p2.left&&e.pageX<p2.left+_2f.outerWidth()&&e.pageY>p2.top&&e.pageY<p2.top+_2f.outerHeight()){
    +if(_2a.revert){
    +$(e.data.target).css({position:e.data.startPosition,left:e.data.startLeft,top:e.data.startTop});
    +}
    +_2d();
    +$(this).trigger("_drop",[e.data.target]);
    +_2e=true;
    +this.entered=false;
    +return false;
    +}
    +});
    +if(!_2e&&!_2a.revert){
    +_2d();
    +}
    +return _2e;
    +};
    +return false;
    +};
    +$.fn.draggable=function(_30,_31){
    +if(typeof _30=="string"){
    +return $.fn.draggable.methods[_30](this,_31);
    +}
    +return this.each(function(){
    +var _32;
    +var _33=$.data(this,"draggable");
    +if(_33){
    +_33.handle.unbind(".draggable");
    +_32=$.extend(_33.options,_30);
    +}else{
    +_32=$.extend({},$.fn.draggable.defaults,$.fn.draggable.parseOptions(this),_30||{});
    +}
    +if(_32.disabled==true){
    +$(this).css("cursor","");
    +return;
    +}
    +var _34=null;
    +if(typeof _32.handle=="undefined"||_32.handle==null){
    +_34=$(this);
    +}else{
    +_34=(typeof _32.handle=="string"?$(_32.handle,this):_32.handle);
    +}
    +$.data(this,"draggable",{options:_32,handle:_34});
    +_34.unbind(".draggable").bind("mousemove.draggable",{target:this},function(e){
    +if(_12){
    +return;
    +}
    +var _35=$.data(e.data.target,"draggable").options;
    +if(_36(e)){
    +$(this).css("cursor",_35.cursor);
    +}else{
    +$(this).css("cursor","");
    +}
    +}).bind("mouseleave.draggable",{target:this},function(e){
    +$(this).css("cursor","");
    +}).bind("mousedown.draggable",{target:this},function(e){
    +if(_36(e)==false){
    +return;
    +}
    +$(this).css("cursor","");
    +var _37=$(e.data.target).position();
    +var _38=$(e.data.target).offset();
    +var _39={startPosition:$(e.data.target).css("position"),startLeft:_37.left,startTop:_37.top,left:_37.left,top:_37.top,startX:e.pageX,startY:e.pageY,offsetWidth:(e.pageX-_38.left),offsetHeight:(e.pageY-_38.top),target:e.data.target,parent:$(e.data.target).parent()[0]};
    +$.extend(e.data,_39);
    +var _3a=$.data(e.data.target,"draggable").options;
    +if(_3a.onBeforeDrag.call(e.data.target,e)==false){
    +return;
    +}
    +$(document).bind("mousedown.draggable",e.data,_1d);
    +$(document).bind("mousemove.draggable",e.data,_23);
    +$(document).bind("mouseup.draggable",e.data,_27);
    +});
    +function _36(e){
    +var _3b=$.data(e.data.target,"draggable");
    +var _3c=_3b.handle;
    +var _3d=$(_3c).offset();
    +var _3e=$(_3c).outerWidth();
    +var _3f=$(_3c).outerHeight();
    +var t=e.pageY-_3d.top;
    +var r=_3d.left+_3e-e.pageX;
    +var b=_3d.top+_3f-e.pageY;
    +var l=e.pageX-_3d.left;
    +return Math.min(t,r,b,l)>_3b.options.edge;
    +};
    +});
    +};
    +$.fn.draggable.methods={options:function(jq){
    +return $.data(jq[0],"draggable").options;
    +},proxy:function(jq){
    +return $.data(jq[0],"draggable").proxy;
    +},enable:function(jq){
    +return jq.each(function(){
    +$(this).draggable({disabled:false});
    +});
    +},disable:function(jq){
    +return jq.each(function(){
    +$(this).draggable({disabled:true});
    +});
    +}};
    +$.fn.draggable.parseOptions=function(_40){
    +var t=$(_40);
    +return $.extend({},$.parser.parseOptions(_40,["cursor","handle","axis",{"revert":"boolean","deltaX":"number","deltaY":"number","edge":"number"}]),{disabled:(t.attr("disabled")?true:undefined)});
    +};
    +$.fn.draggable.defaults={proxy:null,revert:false,cursor:"move",deltaX:null,deltaY:null,handle:null,disabled:false,edge:0,axis:null,onBeforeDrag:function(e){
    +},onStartDrag:function(e){
    +},onDrag:function(e){
    +},onStopDrag:function(e){
    +}};
    +})(jQuery);
    +(function($){
    +function _41(_42){
    +$(_42).addClass("droppable");
    +$(_42).bind("_dragenter",function(e,_43){
    +$.data(_42,"droppable").options.onDragEnter.apply(_42,[e,_43]);
    +});
    +$(_42).bind("_dragleave",function(e,_44){
    +$.data(_42,"droppable").options.onDragLeave.apply(_42,[e,_44]);
    +});
    +$(_42).bind("_dragover",function(e,_45){
    +$.data(_42,"droppable").options.onDragOver.apply(_42,[e,_45]);
    +});
    +$(_42).bind("_drop",function(e,_46){
    +$.data(_42,"droppable").options.onDrop.apply(_42,[e,_46]);
    +});
    +};
    +$.fn.droppable=function(_47,_48){
    +if(typeof _47=="string"){
    +return $.fn.droppable.methods[_47](this,_48);
    +}
    +_47=_47||{};
    +return this.each(function(){
    +var _49=$.data(this,"droppable");
    +if(_49){
    +$.extend(_49.options,_47);
    +}else{
    +_41(this);
    +$.data(this,"droppable",{options:$.extend({},$.fn.droppable.defaults,$.fn.droppable.parseOptions(this),_47)});
    +}
    +});
    +};
    +$.fn.droppable.methods={options:function(jq){
    +return $.data(jq[0],"droppable").options;
    +},enable:function(jq){
    +return jq.each(function(){
    +$(this).droppable({disabled:false});
    +});
    +},disable:function(jq){
    +return jq.each(function(){
    +$(this).droppable({disabled:true});
    +});
    +}};
    +$.fn.droppable.parseOptions=function(_4a){
    +var t=$(_4a);
    +return $.extend({},$.parser.parseOptions(_4a,["accept"]),{disabled:(t.attr("disabled")?true:undefined)});
    +};
    +$.fn.droppable.defaults={accept:null,disabled:false,onDragEnter:function(e,_4b){
    +},onDragOver:function(e,_4c){
    +},onDragLeave:function(e,_4d){
    +},onDrop:function(e,_4e){
    +}};
    +})(jQuery);
    +(function($){
    +var _4f=false;
    +$.fn.resizable=function(_50,_51){
    +if(typeof _50=="string"){
    +return $.fn.resizable.methods[_50](this,_51);
    +}
    +function _52(e){
    +var _53=e.data;
    +var _54=$.data(_53.target,"resizable").options;
    +if(_53.dir.indexOf("e")!=-1){
    +var _55=_53.startWidth+e.pageX-_53.startX;
    +_55=Math.min(Math.max(_55,_54.minWidth),_54.maxWidth);
    +_53.width=_55;
    +}
    +if(_53.dir.indexOf("s")!=-1){
    +var _56=_53.startHeight+e.pageY-_53.startY;
    +_56=Math.min(Math.max(_56,_54.minHeight),_54.maxHeight);
    +_53.height=_56;
    +}
    +if(_53.dir.indexOf("w")!=-1){
    +_53.width=_53.startWidth-e.pageX+_53.startX;
    +if(_53.width>=_54.minWidth&&_53.width<=_54.maxWidth){
    +_53.left=_53.startLeft+e.pageX-_53.startX;
    +}
    +}
    +if(_53.dir.indexOf("n")!=-1){
    +_53.height=_53.startHeight-e.pageY+_53.startY;
    +if(_53.height>=_54.minHeight&&_53.height<=_54.maxHeight){
    +_53.top=_53.startTop+e.pageY-_53.startY;
    +}
    +}
    +};
    +function _57(e){
    +var _58=e.data;
    +var _59=_58.target;
    +$(_59).css({left:_58.left,top:_58.top});
    +$(_59)._outerWidth(_58.width)._outerHeight(_58.height);
    +};
    +function _5a(e){
    +_4f=true;
    +$.data(e.data.target,"resizable").options.onStartResize.call(e.data.target,e);
    +return false;
    +};
    +function _5b(e){
    +_52(e);
    +if($.data(e.data.target,"resizable").options.onResize.call(e.data.target,e)!=false){
    +_57(e);
    +}
    +return false;
    +};
    +function _5c(e){
    +_4f=false;
    +_52(e,true);
    +_57(e);
    +$.data(e.data.target,"resizable").options.onStopResize.call(e.data.target,e);
    +$(document).unbind(".resizable");
    +$("body").css("cursor","");
    +return false;
    +};
    +return this.each(function(){
    +var _5d=null;
    +var _5e=$.data(this,"resizable");
    +if(_5e){
    +$(this).unbind(".resizable");
    +_5d=$.extend(_5e.options,_50||{});
    +}else{
    +_5d=$.extend({},$.fn.resizable.defaults,$.fn.resizable.parseOptions(this),_50||{});
    +$.data(this,"resizable",{options:_5d});
    +}
    +if(_5d.disabled==true){
    +return;
    +}
    +$(this).bind("mousemove.resizable",{target:this},function(e){
    +if(_4f){
    +return;
    +}
    +var dir=_5f(e);
    +if(dir==""){
    +$(e.data.target).css("cursor","");
    +}else{
    +$(e.data.target).css("cursor",dir+"-resize");
    +}
    +}).bind("mouseleave.resizable",{target:this},function(e){
    +$(e.data.target).css("cursor","");
    +}).bind("mousedown.resizable",{target:this},function(e){
    +var dir=_5f(e);
    +if(dir==""){
    +return;
    +}
    +function _60(css){
    +var val=parseInt($(e.data.target).css(css));
    +if(isNaN(val)){
    +return 0;
    +}else{
    +return val;
    +}
    +};
    +var _61={target:e.data.target,dir:dir,startLeft:_60("left"),startTop:_60("top"),left:_60("left"),top:_60("top"),startX:e.pageX,startY:e.pageY,startWidth:$(e.data.target).outerWidth(),startHeight:$(e.data.target).outerHeight(),width:$(e.data.target).outerWidth(),height:$(e.data.target).outerHeight(),deltaWidth:$(e.data.target).outerWidth()-$(e.data.target).width(),deltaHeight:$(e.data.target).outerHeight()-$(e.data.target).height()};
    +$(document).bind("mousedown.resizable",_61,_5a);
    +$(document).bind("mousemove.resizable",_61,_5b);
    +$(document).bind("mouseup.resizable",_61,_5c);
    +$("body").css("cursor",dir+"-resize");
    +});
    +function _5f(e){
    +var tt=$(e.data.target);
    +var dir="";
    +var _62=tt.offset();
    +var _63=tt.outerWidth();
    +var _64=tt.outerHeight();
    +var _65=_5d.edge;
    +if(e.pageY>_62.top&&e.pageY<_62.top+_65){
    +dir+="n";
    +}else{
    +if(e.pageY<_62.top+_64&&e.pageY>_62.top+_64-_65){
    +dir+="s";
    +}
    +}
    +if(e.pageX>_62.left&&e.pageX<_62.left+_65){
    +dir+="w";
    +}else{
    +if(e.pageX<_62.left+_63&&e.pageX>_62.left+_63-_65){
    +dir+="e";
    +}
    +}
    +var _66=_5d.handles.split(",");
    +for(var i=0;i<_66.length;i++){
    +var _67=_66[i].replace(/(^\s*)|(\s*$)/g,"");
    +if(_67=="all"||_67==dir){
    +return dir;
    +}
    +}
    +return "";
    +};
    +});
    +};
    +$.fn.resizable.methods={options:function(jq){
    +return $.data(jq[0],"resizable").options;
    +},enable:function(jq){
    +return jq.each(function(){
    +$(this).resizable({disabled:false});
    +});
    +},disable:function(jq){
    +return jq.each(function(){
    +$(this).resizable({disabled:true});
    +});
    +}};
    +$.fn.resizable.parseOptions=function(_68){
    +var t=$(_68);
    +return $.extend({},$.parser.parseOptions(_68,["handles",{minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number",edge:"number"}]),{disabled:(t.attr("disabled")?true:undefined)});
    +};
    +$.fn.resizable.defaults={disabled:false,handles:"n, e, s, w, ne, se, sw, nw, all",minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000,edge:5,onStartResize:function(e){
    +},onResize:function(e){
    +},onStopResize:function(e){
    +}};
    +})(jQuery);
    +(function($){
    +function _69(_6a){
    +var _6b=$.data(_6a,"linkbutton").options;
    +$(_6a).empty();
    +$(_6a).addClass("l-btn");
    +if(_6b.id){
    +$(_6a).attr("id",_6b.id);
    +}else{
    +$(_6a).attr("id","");
    +}
    +if(_6b.plain){
    +$(_6a).addClass("l-btn-plain");
    +}else{
    +$(_6a).removeClass("l-btn-plain");
    +}
    +if(_6b.text){
    +$(_6a).html(_6b.text).wrapInner("<span class=\"l-btn-left\">"+"<span class=\"l-btn-text\">"+"</span>"+"</span>");
    +if(_6b.iconCls){
    +$(_6a).find(".l-btn-text").addClass(_6b.iconCls).addClass(_6b.iconAlign=="left"?"l-btn-icon-left":"l-btn-icon-right");
    +}
    +}else{
    +$(_6a).html("&nbsp;").wrapInner("<span class=\"l-btn-left\">"+"<span class=\"l-btn-text\">"+"<span class=\"l-btn-empty\"></span>"+"</span>"+"</span>");
    +if(_6b.iconCls){
    +$(_6a).find(".l-btn-empty").addClass(_6b.iconCls);
    +}
    +}
    +$(_6a).unbind(".linkbutton").bind("focus.linkbutton",function(){
    +if(!_6b.disabled){
    +$(this).find("span.l-btn-text").addClass("l-btn-focus");
    +}
    +}).bind("blur.linkbutton",function(){
    +$(this).find("span.l-btn-text").removeClass("l-btn-focus");
    +});
    +_6c(_6a,_6b.disabled);
    +};
    +function _6c(_6d,_6e){
    +var _6f=$.data(_6d,"linkbutton");
    +if(_6e){
    +_6f.options.disabled=true;
    +var _70=$(_6d).attr("href");
    +if(_70){
    +_6f.href=_70;
    +$(_6d).attr("href","javascript:void(0)");
    +}
    +if(_6d.onclick){
    +_6f.onclick=_6d.onclick;
    +_6d.onclick=null;
    +}
    +$(_6d).addClass("l-btn-disabled");
    +}else{
    +_6f.options.disabled=false;
    +if(_6f.href){
    +$(_6d).attr("href",_6f.href);
    +}
    +if(_6f.onclick){
    +_6d.onclick=_6f.onclick;
    +}
    +$(_6d).removeClass("l-btn-disabled");
    +}
    +};
    +$.fn.linkbutton=function(_71,_72){
    +if(typeof _71=="string"){
    +return $.fn.linkbutton.methods[_71](this,_72);
    +}
    +_71=_71||{};
    +return this.each(function(){
    +var _73=$.data(this,"linkbutton");
    +if(_73){
    +$.extend(_73.options,_71);
    +}else{
    +$.data(this,"linkbutton",{options:$.extend({},$.fn.linkbutton.defaults,$.fn.linkbutton.parseOptions(this),_71)});
    +$(this).removeAttr("disabled");
    +}
    +_69(this);
    +});
    +};
    +$.fn.linkbutton.methods={options:function(jq){
    +return $.data(jq[0],"linkbutton").options;
    +},enable:function(jq){
    +return jq.each(function(){
    +_6c(this,false);
    +});
    +},disable:function(jq){
    +return jq.each(function(){
    +_6c(this,true);
    +});
    +}};
    +$.fn.linkbutton.parseOptions=function(_74){
    +var t=$(_74);
    +return $.extend({},$.parser.parseOptions(_74,["id","iconCls","iconAlign",{plain:"boolean"}]),{disabled:(t.attr("disabled")?true:undefined),text:$.trim(t.html()),iconCls:(t.attr("icon")||t.attr("iconCls"))});
    +};
    +$.fn.linkbutton.defaults={id:null,disabled:false,plain:false,text:"",iconCls:null,iconAlign:"left"};
    +})(jQuery);
    +(function($){
    +function _75(_76){
    +var _77=$.data(_76,"pagination");
    +var _78=_77.options;
    +var bb=_77.bb={};
    +var _79=$(_76).addClass("pagination").html("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tr></tr></table>");
    +var tr=_79.find("tr");
    +function _7a(_7b){
    +var btn=_78.nav[_7b];
    +var a=$("<a href=\"javascript:void(0)\"></a>").appendTo(tr);
    +a.wrap("<td></td>");
    +a.linkbutton({iconCls:btn.iconCls,plain:true}).unbind(".pagination").bind("click.pagination",function(){
    +btn.handler.call(_76);
    +});
    +return a;
    +};
    +if(_78.showPageList){
    +var ps=$("<select class=\"pagination-page-list\"></select>");
    +ps.bind("change",function(){
    +_78.pageSize=parseInt($(this).val());
    +_78.onChangePageSize.call(_76,_78.pageSize);
    +_7d(_76,_78.pageNumber);
    +});
    +for(var i=0;i<_78.pageList.length;i++){
    +$("<option></option>").text(_78.pageList[i]).appendTo(ps);
    +}
    +$("<td></td>").append(ps).appendTo(tr);
    +$("<td><div class=\"pagination-btn-separator\"></div></td>").appendTo(tr);
    +}
    +bb.first=_7a("first");
    +bb.prev=_7a("prev");
    +$("<td><div class=\"pagination-btn-separator\"></div></td>").appendTo(tr);
    +$("<span style=\"padding-left:6px;\"></span>").html(_78.beforePageText).appendTo(tr).wrap("<td></td>");
    +bb.num=$("<input class=\"pagination-num\" type=\"text\" value=\"1\" size=\"2\">").appendTo(tr).wrap("<td></td>");
    +bb.num.unbind(".pagination").bind("keydown.pagination",function(e){
    +if(e.keyCode==13){
    +var _7c=parseInt($(this).val())||1;
    +_7d(_76,_7c);
    +return false;
    +}
    +});
    +bb.after=$("<span style=\"padding-right:6px;\"></span>").appendTo(tr).wrap("<td></td>");
    +$("<td><div class=\"pagination-btn-separator\"></div></td>").appendTo(tr);
    +bb.next=_7a("next");
    +bb.last=_7a("last");
    +if(_78.showRefresh){
    +$("<td><div class=\"pagination-btn-separator\"></div></td>").appendTo(tr);
    +bb.refresh=_7a("refresh");
    +}
    +if(_78.buttons){
    +$("<td><div class=\"pagination-btn-separator\"></div></td>").appendTo(tr);
    +for(var i=0;i<_78.buttons.length;i++){
    +var btn=_78.buttons[i];
    +if(btn=="-"){
    +$("<td><div class=\"pagination-btn-separator\"></div></td>").appendTo(tr);
    +}else{
    +var td=$("<td></td>").appendTo(tr);
    +$("<a href=\"javascript:void(0)\"></a>").appendTo(td).linkbutton($.extend(btn,{plain:true})).bind("click",eval(btn.handler||function(){
    +}));
    +}
    +}
    +}
    +$("<div class=\"pagination-info\"></div>").appendTo(_79);
    +$("<div style=\"clear:both;\"></div>").appendTo(_79);
    +};
    +function _7d(_7e,_7f){
    +var _80=$.data(_7e,"pagination").options;
    +var _81=Math.ceil(_80.total/_80.pageSize)||1;
    +_80.pageNumber=_7f;
    +if(_80.pageNumber<1){
    +_80.pageNumber=1;
    +}
    +if(_80.pageNumber>_81){
    +_80.pageNumber=_81;
    +}
    +_82(_7e,{pageNumber:_80.pageNumber});
    +_80.onSelectPage.call(_7e,_80.pageNumber,_80.pageSize);
    +};
    +function _82(_83,_84){
    +var _85=$.data(_83,"pagination").options;
    +var bb=$.data(_83,"pagination").bb;
    +$.extend(_85,_84||{});
    +var ps=$(_83).find("select.pagination-page-list");
    +if(ps.length){
    +ps.val(_85.pageSize+"");
    +_85.pageSize=parseInt(ps.val());
    +}
    +var _86=Math.ceil(_85.total/_85.pageSize)||1;
    +bb.num.val(_85.pageNumber);
    +bb.after.html(_85.afterPageText.replace(/{pages}/,_86));
    +var _87=_85.displayMsg;
    +_87=_87.replace(/{from}/,_85.total==0?0:_85.pageSize*(_85.pageNumber-1)+1);
    +_87=_87.replace(/{to}/,Math.min(_85.pageSize*(_85.pageNumber),_85.total));
    +_87=_87.replace(/{total}/,_85.total);
    +$(_83).find("div.pagination-info").html(_87);
    +bb.first.add(bb.prev).linkbutton({disabled:(_85.pageNumber==1)});
    +bb.next.add(bb.last).linkbutton({disabled:(_85.pageNumber==_86)});
    +_88(_83,_85.loading);
    +};
    +function _88(_89,_8a){
    +var _8b=$.data(_89,"pagination").options;
    +var bb=$.data(_89,"pagination").bb;
    +_8b.loading=_8a;
    +if(_8b.showRefresh){
    +if(_8b.loading){
    +bb.refresh.linkbutton({iconCls:"pagination-loading"});
    +}else{
    +bb.refresh.linkbutton({iconCls:"pagination-load"});
    +}
    +}
    +};
    +$.fn.pagination=function(_8c,_8d){
    +if(typeof _8c=="string"){
    +return $.fn.pagination.methods[_8c](this,_8d);
    +}
    +_8c=_8c||{};
    +return this.each(function(){
    +var _8e;
    +var _8f=$.data(this,"pagination");
    +if(_8f){
    +_8e=$.extend(_8f.options,_8c);
    +}else{
    +_8e=$.extend({},$.fn.pagination.defaults,$.fn.pagination.parseOptions(this),_8c);
    +$.data(this,"pagination",{options:_8e});
    +}
    +_75(this);
    +_82(this);
    +});
    +};
    +$.fn.pagination.methods={options:function(jq){
    +return $.data(jq[0],"pagination").options;
    +},loading:function(jq){
    +return jq.each(function(){
    +_88(this,true);
    +});
    +},loaded:function(jq){
    +return jq.each(function(){
    +_88(this,false);
    +});
    +},refresh:function(jq,_90){
    +return jq.each(function(){
    +_82(this,_90);
    +});
    +},select:function(jq,_91){
    +return jq.each(function(){
    +_7d(this,_91);
    +});
    +}};
    +$.fn.pagination.parseOptions=function(_92){
    +var t=$(_92);
    +return $.extend({},$.parser.parseOptions(_92,[{total:"number",pageSize:"number",pageNumber:"number"},{loading:"boolean",showPageList:"boolean",showRefresh:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined)});
    +};
    +$.fn.pagination.defaults={total:1,pageSize:10,pageNumber:1,pageList:[10,20,30,50],loading:false,buttons:null,showPageList:true,showRefresh:true,onSelectPage:function(_93,_94){
    +},onBeforeRefresh:function(_95,_96){
    +},onRefresh:function(_97,_98){
    +},onChangePageSize:function(_99){
    +},beforePageText:"Page",afterPageText:"of {pages}",displayMsg:"Displaying {from} to {to} of {total} items",nav:{first:{iconCls:"pagination-first",handler:function(){
    +var _9a=$(this).pagination("options");
    +if(_9a.pageNumber>1){
    +$(this).pagination("select",1);
    +}
    +}},prev:{iconCls:"pagination-prev",handler:function(){
    +var _9b=$(this).pagination("options");
    +if(_9b.pageNumber>1){
    +$(this).pagination("select",_9b.pageNumber-1);
    +}
    +}},next:{iconCls:"pagination-next",handler:function(){
    +var _9c=$(this).pagination("options");
    +var _9d=Math.ceil(_9c.total/_9c.pageSize);
    +if(_9c.pageNumber<_9d){
    +$(this).pagination("select",_9c.pageNumber+1);
    +}
    +}},last:{iconCls:"pagination-last",handler:function(){
    +var _9e=$(this).pagination("options");
    +var _9f=Math.ceil(_9e.total/_9e.pageSize);
    +if(_9e.pageNumber<_9f){
    +$(this).pagination("select",_9f);
    +}
    +}},refresh:{iconCls:"pagination-refresh",handler:function(){
    +var _a0=$(this).pagination("options");
    +if(_a0.onBeforeRefresh.call(this,_a0.pageNumber,_a0.pageSize)!=false){
    +$(this).pagination("select",_a0.pageNumber);
    +_a0.onRefresh.call(this,_a0.pageNumber,_a0.pageSize);
    +}
    +}}}};
    +})(jQuery);
    +(function($){
    +function _a1(_a2){
    +var _a3=$(_a2);
    +_a3.addClass("tree");
    +return _a3;
    +};
    +function _a4(_a5){
    +var _a6=[];
    +_a7(_a6,$(_a5));
    +function _a7(aa,_a8){
    +_a8.children("li").each(function(){
    +var _a9=$(this);
    +var _aa=$.extend({},$.parser.parseOptions(this,["id","iconCls","state"]),{checked:(_a9.attr("checked")?true:undefined)});
    +_aa.text=_a9.children("span").html();
    +if(!_aa.text){
    +_aa.text=_a9.html();
    +}
    +var _ab=_a9.children("ul");
    +if(_ab.length){
    +_aa.children=[];
    +_a7(_aa.children,_ab);
    +}
    +aa.push(_aa);
    +});
    +};
    +return _a6;
    +};
    +function _ac(_ad){
    +var _ae=$.data(_ad,"tree").options;
    +$(_ad).unbind().bind("mouseover",function(e){
    +var tt=$(e.target);
    +var _af=tt.closest("div.tree-node");
    +if(!_af.length){
    +return;
    +}
    +_af.addClass("tree-node-hover");
    +if(tt.hasClass("tree-hit")){
    +if(tt.hasClass("tree-expanded")){
    +tt.addClass("tree-expanded-hover");
    +}else{
    +tt.addClass("tree-collapsed-hover");
    +}
    +}
    +e.stopPropagation();
    +}).bind("mouseout",function(e){
    +var tt=$(e.target);
    +var _b0=tt.closest("div.tree-node");
    +if(!_b0.length){
    +return;
    +}
    +_b0.removeClass("tree-node-hover");
    +if(tt.hasClass("tree-hit")){
    +if(tt.hasClass("tree-expanded")){
    +tt.removeClass("tree-expanded-hover");
    +}else{
    +tt.removeClass("tree-collapsed-hover");
    +}
    +}
    +e.stopPropagation();
    +}).bind("click",function(e){
    +var tt=$(e.target);
    +var _b1=tt.closest("div.tree-node");
    +if(!_b1.length){
    +return;
    +}
    +if(tt.hasClass("tree-hit")){
    +_119(_ad,_b1[0]);
    +return false;
    +}else{
    +if(tt.hasClass("tree-checkbox")){
    +_d9(_ad,_b1[0],!tt.hasClass("tree-checkbox1"));
    +return false;
    +}else{
    +_157(_ad,_b1[0]);
    +_ae.onClick.call(_ad,_b4(_ad,_b1[0]));
    +}
    +}
    +e.stopPropagation();
    +}).bind("dblclick",function(e){
    +var _b2=$(e.target).closest("div.tree-node");
    +if(!_b2.length){
    +return;
    +}
    +_157(_ad,_b2[0]);
    +_ae.onDblClick.call(_ad,_b4(_ad,_b2[0]));
    +e.stopPropagation();
    +}).bind("contextmenu",function(e){
    +var _b3=$(e.target).closest("div.tree-node");
    +if(!_b3.length){
    +return;
    +}
    +_ae.onContextMenu.call(_ad,e,_b4(_ad,_b3[0]));
    +e.stopPropagation();
    +});
    +};
    +function _b5(_b6){
    +var _b7=$(_b6).find("div.tree-node");
    +_b7.draggable("disable");
    +_b7.css("cursor","pointer");
    +};
    +function _b8(_b9){
    +var _ba=$.data(_b9,"tree");
    +var _bb=_ba.options;
    +var _bc=_ba.tree;
    +_ba.disabledNodes=[];
    +_bc.find("div.tree-node").draggable({disabled:false,revert:true,cursor:"pointer",proxy:function(_bd){
    +var p=$("<div class=\"tree-node-proxy\"></div>").appendTo("body");
    +p.html("<span class=\"tree-dnd-icon tree-dnd-no\">&nbsp;</span>"+$(_bd).find(".tree-title").html());
    +p.hide();
    +return p;
    +},deltaX:15,deltaY:15,onBeforeDrag:function(e){
    +if(_bb.onBeforeDrag.call(_b9,_b4(_b9,this))==false){
    +return false;
    +}
    +if($(e.target).hasClass("tree-hit")||$(e.target).hasClass("tree-checkbox")){
    +return false;
    +}
    +if(e.which!=1){
    +return false;
    +}
    +$(this).next("ul").find("div.tree-node").droppable({accept:"no-accept"});
    +var _be=$(this).find("span.tree-indent");
    +if(_be.length){
    +e.data.offsetWidth-=_be.length*_be.width();
    +}
    +},onStartDrag:function(){
    +$(this).draggable("proxy").css({left:-10000,top:-10000});
    +_bb.onStartDrag.call(_b9,_b4(_b9,this));
    +var _bf=_b4(_b9,this);
    +if(_bf.id==undefined){
    +_bf.id="easyui_tree_node_id_temp";
    +_14f(_b9,_bf);
    +}
    +_ba.draggingNodeId=_bf.id;
    +},onDrag:function(e){
    +var x1=e.pageX,y1=e.pageY,x2=e.data.startX,y2=e.data.startY;
    +var d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    +if(d>3){
    +$(this).draggable("proxy").show();
    +}
    +this.pageY=e.pageY;
    +},onStopDrag:function(){
    +$(this).next("ul").find("div.tree-node").droppable({accept:"div.tree-node"});
    +for(var i=0;i<_ba.disabledNodes.length;i++){
    +$(_ba.disabledNodes[i]).droppable("enable");
    +}
    +_ba.disabledNodes=[];
    +var _c0=_155(_b9,_ba.draggingNodeId);
    +if(_c0.id=="easyui_tree_node_id_temp"){
    +_c0.id="";
    +_14f(_b9,_c0);
    +}
    +_bb.onStopDrag.call(_b9,_c0);
    +}}).droppable({accept:"div.tree-node",onDragEnter:function(e,_c1){
    +if(_bb.onDragEnter.call(_b9,this,_b4(_b9,_c1))==false){
    +_c2(_c1,false);
    +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom");
    +$(this).droppable("disable");
    +_ba.disabledNodes.push(this);
    +}
    +},onDragOver:function(e,_c3){
    +if($(this).droppable("options").disabled){
    +return;
    +}
    +var _c4=_c3.pageY;
    +var top=$(this).offset().top;
    +var _c5=top+$(this).outerHeight();
    +_c2(_c3,true);
    +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom");
    +if(_c4>top+(_c5-top)/2){
    +if(_c5-_c4<5){
    +$(this).addClass("tree-node-bottom");
    +}else{
    +$(this).addClass("tree-node-append");
    +}
    +}else{
    +if(_c4-top<5){
    +$(this).addClass("tree-node-top");
    +}else{
    +$(this).addClass("tree-node-append");
    +}
    +}
    +if(_bb.onDragOver.call(_b9,this,_b4(_b9,_c3))==false){
    +_c2(_c3,false);
    +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom");
    +$(this).droppable("disable");
    +_ba.disabledNodes.push(this);
    +}
    +},onDragLeave:function(e,_c6){
    +_c2(_c6,false);
    +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom");
    +_bb.onDragLeave.call(_b9,this,_b4(_b9,_c6));
    +},onDrop:function(e,_c7){
    +var _c8=this;
    +var _c9,_ca;
    +if($(this).hasClass("tree-node-append")){
    +_c9=_cb;
    +}else{
    +_c9=_cc;
    +_ca=$(this).hasClass("tree-node-top")?"top":"bottom";
    +}
    +_c9(_c7,_c8,_ca);
    +$(this).removeClass("tree-node-append tree-node-top tree-node-bottom");
    +}});
    +function _c2(_cd,_ce){
    +var _cf=$(_cd).draggable("proxy").find("span.tree-dnd-icon");
    +_cf.removeClass("tree-dnd-yes tree-dnd-no").addClass(_ce?"tree-dnd-yes":"tree-dnd-no");
    +};
    +function _cb(_d0,_d1){
    +if(_b4(_b9,_d1).state=="closed"){
    +_111(_b9,_d1,function(){
    +_d2();
    +});
    +}else{
    +_d2();
    +}
    +function _d2(){
    +var _d3=$(_b9).tree("pop",_d0);
    +$(_b9).tree("append",{parent:_d1,data:[_d3]});
    +_bb.onDrop.call(_b9,_d1,_d3,"append");
    +};
    +};
    +function _cc(_d4,_d5,_d6){
    +var _d7={};
    +if(_d6=="top"){
    +_d7.before=_d5;
    +}else{
    +_d7.after=_d5;
    +}
    +var _d8=$(_b9).tree("pop",_d4);
    +_d7.data=_d8;
    +$(_b9).tree("insert",_d7);
    +_bb.onDrop.call(_b9,_d5,_d8,_d6);
    +};
    +};
    +function _d9(_da,_db,_dc){
    +var _dd=$.data(_da,"tree").options;
    +if(!_dd.checkbox){
    +return;
    +}
    +var _de=_b4(_da,_db);
    +if(_dd.onBeforeCheck.call(_da,_de,_dc)==false){
    +return;
    +}
    +var _df=$(_db);
    +var ck=_df.find(".tree-checkbox");
    +ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2");
    +if(_dc){
    +ck.addClass("tree-checkbox1");
    +}else{
    +ck.addClass("tree-checkbox0");
    +}
    +if(_dd.cascadeCheck){
    +_e0(_df);
    +_e1(_df);
    +}
    +_dd.onCheck.call(_da,_de,_dc);
    +function _e1(_e2){
    +var _e3=_e2.next().find(".tree-checkbox");
    +_e3.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2");
    +if(_e2.find(".tree-checkbox").hasClass("tree-checkbox1")){
    +_e3.addClass("tree-checkbox1");
    +}else{
    +_e3.addClass("tree-checkbox0");
    +}
    +};
    +function _e0(_e4){
    +var _e5=_124(_da,_e4[0]);
    +if(_e5){
    +var ck=$(_e5.target).find(".tree-checkbox");
    +ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2");
    +if(_e6(_e4)){
    +ck.addClass("tree-checkbox1");
    +}else{
    +if(_e7(_e4)){
    +ck.addClass("tree-checkbox0");
    +}else{
    +ck.addClass("tree-checkbox2");
    +}
    +}
    +_e0($(_e5.target));
    +}
    +function _e6(n){
    +var ck=n.find(".tree-checkbox");
    +if(ck.hasClass("tree-checkbox0")||ck.hasClass("tree-checkbox2")){
    +return false;
    +}
    +var b=true;
    +n.parent().siblings().each(function(){
    +if(!$(this).children("div.tree-node").children(".tree-checkbox").hasClass("tree-checkbox1")){
    +b=false;
    +}
    +});
    +return b;
    +};
    +function _e7(n){
    +var ck=n.find(".tree-checkbox");
    +if(ck.hasClass("tree-checkbox1")||ck.hasClass("tree-checkbox2")){
    +return false;
    +}
    +var b=true;
    +n.parent().siblings().each(function(){
    +if(!$(this).children("div.tree-node").children(".tree-checkbox").hasClass("tree-checkbox0")){
    +b=false;
    +}
    +});
    +return b;
    +};
    +};
    +};
    +function _e8(_e9,_ea){
    +var _eb=$.data(_e9,"tree").options;
    +var _ec=$(_ea);
    +if(_ed(_e9,_ea)){
    +var ck=_ec.find(".tree-checkbox");
    +if(ck.length){
    +if(ck.hasClass("tree-checkbox1")){
    +_d9(_e9,_ea,true);
    +}else{
    +_d9(_e9,_ea,false);
    +}
    +}else{
    +if(_eb.onlyLeafCheck){
    +$("<span class=\"tree-checkbox tree-checkbox0\"></span>").insertBefore(_ec.find(".tree-title"));
    +}
    +}
    +}else{
    +var ck=_ec.find(".tree-checkbox");
    +if(_eb.onlyLeafCheck){
    +ck.remove();
    +}else{
    +if(ck.hasClass("tree-checkbox1")){
    +_d9(_e9,_ea,true);
    +}else{
    +if(ck.hasClass("tree-checkbox2")){
    +var _ee=true;
    +var _ef=true;
    +var _f0=_f1(_e9,_ea);
    +for(var i=0;i<_f0.length;i++){
    +if(_f0[i].checked){
    +_ef=false;
    +}else{
    +_ee=false;
    +}
    +}
    +if(_ee){
    +_d9(_e9,_ea,true);
    +}
    +if(_ef){
    +_d9(_e9,_ea,false);
    +}
    +}
    +}
    +}
    +}
    +};
    +function _f2(_f3,ul,_f4,_f5){
    +var _f6=$.data(_f3,"tree").options;
    +_f4=_f6.loadFilter.call(_f3,_f4,$(ul).prev("div.tree-node")[0]);
    +if(!_f5){
    +$(ul).empty();
    +}
    +var _f7=[];
    +var _f8=$(ul).prev("div.tree-node").find("span.tree-indent, span.tree-hit").length;
    +_f9(ul,_f4,_f8);
    +if(_f6.dnd){
    +_b8(_f3);
    +}else{
    +_b5(_f3);
    +}
    +for(var i=0;i<_f7.length;i++){
    +_d9(_f3,_f7[i],true);
    +}
    +setTimeout(function(){
    +_101(_f3,_f3);
    +},0);
    +var _fa=null;
    +if(_f3!=ul){
    +var _fb=$(ul).prev();
    +_fa=_b4(_f3,_fb[0]);
    +}
    +_f6.onLoadSuccess.call(_f3,_fa,_f4);
    +function _f9(ul,_fc,_fd){
    +for(var i=0;i<_fc.length;i++){
    +var li=$("<li></li>").appendTo(ul);
    +var _fe=_fc[i];
    +if(_fe.state!="open"&&_fe.state!="closed"){
    +_fe.state="open";
    +}
    +var _ff=$("<div class=\"tree-node\"></div>").appendTo(li);
    +_ff.attr("node-id",_fe.id);
    +$.data(_ff[0],"tree-node",{id:_fe.id,text:_fe.text,iconCls:_fe.iconCls,attributes:_fe.attributes});
    +$("<span class=\"tree-title\"></span>").html(_fe.text).appendTo(_ff);
    +if(_f6.checkbox){
    +if(_f6.onlyLeafCheck){
    +if(_fe.state=="open"&&(!_fe.children||!_fe.children.length)){
    +if(_fe.checked){
    +$("<span class=\"tree-checkbox tree-checkbox1\"></span>").prependTo(_ff);
    +}else{
    +$("<span class=\"tree-checkbox tree-checkbox0\"></span>").prependTo(_ff);
    +}
    +}
    +}else{
    +if(_fe.checked){
    +$("<span class=\"tree-checkbox tree-checkbox1\"></span>").prependTo(_ff);
    +_f7.push(_ff[0]);
    +}else{
    +$("<span class=\"tree-checkbox tree-checkbox0\"></span>").prependTo(_ff);
    +}
    +}
    +}
    +if(_fe.children&&_fe.children.length){
    +var _100=$("<ul></ul>").appendTo(li);
    +if(_fe.state=="open"){
    +$("<span class=\"tree-icon tree-folder tree-folder-open\"></span>").addClass(_fe.iconCls).prependTo(_ff);
    +$("<span class=\"tree-hit tree-expanded\"></span>").prependTo(_ff);
    +}else{
    +$("<span class=\"tree-icon tree-folder\"></span>").addClass(_fe.iconCls).prependTo(_ff);
    +$("<span class=\"tree-hit tree-collapsed\"></span>").prependTo(_ff);
    +_100.css("display","none");
    +}
    +_f9(_100,_fe.children,_fd+1);
    +}else{
    +if(_fe.state=="closed"){
    +$("<span class=\"tree-icon tree-folder\"></span>").addClass(_fe.iconCls).prependTo(_ff);
    +$("<span class=\"tree-hit tree-collapsed\"></span>").prependTo(_ff);
    +}else{
    +$("<span class=\"tree-icon tree-file\"></span>").addClass(_fe.iconCls).prependTo(_ff);
    +$("<span class=\"tree-indent\"></span>").prependTo(_ff);
    +}
    +}
    +for(var j=0;j<_fd;j++){
    +$("<span class=\"tree-indent\"></span>").prependTo(_ff);
    +}
    +}
    +};
    +};
    +function _101(_102,ul,_103){
    +var opts=$.data(_102,"tree").options;
    +if(!opts.lines){
    +return;
    +}
    +if(!_103){
    +_103=true;
    +$(_102).find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom");
    +$(_102).find("div.tree-node").removeClass("tree-node-last tree-root-first tree-root-one");
    +var _104=$(_102).tree("getRoots");
    +if(_104.length>1){
    +$(_104[0].target).addClass("tree-root-first");
    +}else{
    +if(_104.length==1){
    +$(_104[0].target).addClass("tree-root-one");
    +}
    +}
    +}
    +$(ul).children("li").each(function(){
    +var node=$(this).children("div.tree-node");
    +var ul=node.next("ul");
    +if(ul.length){
    +if($(this).next().length){
    +_105(node);
    +}
    +_101(_102,ul,_103);
    +}else{
    +_106(node);
    +}
    +});
    +var _107=$(ul).children("li:last").children("div.tree-node").addClass("tree-node-last");
    +_107.children("span.tree-join").removeClass("tree-join").addClass("tree-joinbottom");
    +function _106(node,_108){
    +var icon=node.find("span.tree-icon");
    +icon.prev("span.tree-indent").addClass("tree-join");
    +};
    +function _105(node){
    +var _109=node.find("span.tree-indent, span.tree-hit").length;
    +node.next().find("div.tree-node").each(function(){
    +$(this).children("span:eq("+(_109-1)+")").addClass("tree-line");
    +});
    +};
    +};
    +function _10a(_10b,ul,_10c,_10d){
    +var opts=$.data(_10b,"tree").options;
    +_10c=_10c||{};
    +var _10e=null;
    +if(_10b!=ul){
    +var node=$(ul).prev();
    +_10e=_b4(_10b,node[0]);
    +}
    +if(opts.onBeforeLoad.call(_10b,_10e,_10c)==false){
    +return;
    +}
    +var _10f=$(ul).prev().children("span.tree-folder");
    +_10f.addClass("tree-loading");
    +var _110=opts.loader.call(_10b,_10c,function(data){
    +_10f.removeClass("tree-loading");
    +_f2(_10b,ul,data);
    +if(_10d){
    +_10d();
    +}
    +},function(){
    +_10f.removeClass("tree-loading");
    +opts.onLoadError.apply(_10b,arguments);
    +if(_10d){
    +_10d();
    +}
    +});
    +if(_110==false){
    +_10f.removeClass("tree-loading");
    +}
    +};
    +function _111(_112,_113,_114){
    +var opts=$.data(_112,"tree").options;
    +var hit=$(_113).children("span.tree-hit");
    +if(hit.length==0){
    +return;
    +}
    +if(hit.hasClass("tree-expanded")){
    +return;
    +}
    +var node=_b4(_112,_113);
    +if(opts.onBeforeExpand.call(_112,node)==false){
    +return;
    +}
    +hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded");
    +hit.next().addClass("tree-folder-open");
    +var ul=$(_113).next();
    +if(ul.length){
    +if(opts.animate){
    +ul.slideDown("normal",function(){
    +opts.onExpand.call(_112,node);
    +if(_114){
    +_114();
    +}
    +});
    +}else{
    +ul.css("display","block");
    +opts.onExpand.call(_112,node);
    +if(_114){
    +_114();
    +}
    +}
    +}else{
    +var _115=$("<ul style=\"display:none\"></ul>").insertAfter(_113);
    +_10a(_112,_115[0],{id:node.id},function(){
    +if(_115.is(":empty")){
    +_115.remove();
    +}
    +if(opts.animate){
    +_115.slideDown("normal",function(){
    +opts.onExpand.call(_112,node);
    +if(_114){
    +_114();
    +}
    +});
    +}else{
    +_115.css("display","block");
    +opts.onExpand.call(_112,node);
    +if(_114){
    +_114();
    +}
    +}
    +});
    +}
    +};
    +function _116(_117,_118){
    +var opts=$.data(_117,"tree").options;
    +var hit=$(_118).children("span.tree-hit");
    +if(hit.length==0){
    +return;
    +}
    +if(hit.hasClass("tree-collapsed")){
    +return;
    +}
    +var node=_b4(_117,_118);
    +if(opts.onBeforeCollapse.call(_117,node)==false){
    +return;
    +}
    +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed");
    +hit.next().removeClass("tree-folder-open");
    +var ul=$(_118).next();
    +if(opts.animate){
    +ul.slideUp("normal",function(){
    +opts.onCollapse.call(_117,node);
    +});
    +}else{
    +ul.css("display","none");
    +opts.onCollapse.call(_117,node);
    +}
    +};
    +function _119(_11a,_11b){
    +var hit=$(_11b).children("span.tree-hit");
    +if(hit.length==0){
    +return;
    +}
    +if(hit.hasClass("tree-expanded")){
    +_116(_11a,_11b);
    +}else{
    +_111(_11a,_11b);
    +}
    +};
    +function _11c(_11d,_11e){
    +var _11f=_f1(_11d,_11e);
    +if(_11e){
    +_11f.unshift(_b4(_11d,_11e));
    +}
    +for(var i=0;i<_11f.length;i++){
    +_111(_11d,_11f[i].target);
    +}
    +};
    +function _120(_121,_122){
    +var _123=[];
    +var p=_124(_121,_122);
    +while(p){
    +_123.unshift(p);
    +p=_124(_121,p.target);
    +}
    +for(var i=0;i<_123.length;i++){
    +_111(_121,_123[i].target);
    +}
    +};
    +function _125(_126,_127){
    +var _128=_f1(_126,_127);
    +if(_127){
    +_128.unshift(_b4(_126,_127));
    +}
    +for(var i=0;i<_128.length;i++){
    +_116(_126,_128[i].target);
    +}
    +};
    +function _129(_12a){
    +var _12b=_12c(_12a);
    +if(_12b.length){
    +return _12b[0];
    +}else{
    +return null;
    +}
    +};
    +function _12c(_12d){
    +var _12e=[];
    +$(_12d).children("li").each(function(){
    +var node=$(this).children("div.tree-node");
    +_12e.push(_b4(_12d,node[0]));
    +});
    +return _12e;
    +};
    +function _f1(_12f,_130){
    +var _131=[];
    +if(_130){
    +_132($(_130));
    +}else{
    +var _133=_12c(_12f);
    +for(var i=0;i<_133.length;i++){
    +_131.push(_133[i]);
    +_132($(_133[i].target));
    +}
    +}
    +function _132(node){
    +node.next().find("div.tree-node").each(function(){
    +_131.push(_b4(_12f,this));
    +});
    +};
    +return _131;
    +};
    +function _124(_134,_135){
    +var ul=$(_135).parent().parent();
    +if(ul[0]==_134){
    +return null;
    +}else{
    +return _b4(_134,ul.prev()[0]);
    +}
    +};
    +function _136(_137,_138){
    +_138=_138||"checked";
    +var _139="";
    +if(_138=="checked"){
    +_139="span.tree-checkbox1";
    +}else{
    +if(_138=="unchecked"){
    +_139="span.tree-checkbox0";
    +}else{
    +if(_138=="indeterminate"){
    +_139="span.tree-checkbox2";
    +}
    +}
    +}
    +var _13a=[];
    +$(_137).find(_139).each(function(){
    +var node=$(this).parent();
    +_13a.push(_b4(_137,node[0]));
    +});
    +return _13a;
    +};
    +function _13b(_13c){
    +var node=$(_13c).find("div.tree-node-selected");
    +if(node.length){
    +return _b4(_13c,node[0]);
    +}else{
    +return null;
    +}
    +};
    +function _13d(_13e,_13f){
    +var node=$(_13f.parent);
    +var ul;
    +if(node.length==0){
    +ul=$(_13e);
    +}else{
    +ul=node.next();
    +if(ul.length==0){
    +ul=$("<ul></ul>").insertAfter(node);
    +}
    +}
    +if(_13f.data&&_13f.data.length){
    +var _140=node.find("span.tree-icon");
    +if(_140.hasClass("tree-file")){
    +_140.removeClass("tree-file").addClass("tree-folder tree-folder-open");
    +var hit=$("<span class=\"tree-hit tree-expanded\"></span>").insertBefore(_140);
    +if(hit.prev().length){
    +hit.prev().remove();
    +}
    +}
    +}
    +_f2(_13e,ul[0],_13f.data,true);
    +_e8(_13e,ul.prev());
    +};
    +function _141(_142,_143){
    +var ref=_143.before||_143.after;
    +var _144=_124(_142,ref);
    +var li;
    +if(_144){
    +_13d(_142,{parent:_144.target,data:[_143.data]});
    +li=$(_144.target).next().children("li:last");
    +}else{
    +_13d(_142,{parent:null,data:[_143.data]});
    +li=$(_142).children("li:last");
    +}
    +if(_143.before){
    +li.insertBefore($(ref).parent());
    +}else{
    +li.insertAfter($(ref).parent());
    +}
    +};
    +function _145(_146,_147){
    +var _148=_124(_146,_147);
    +var node=$(_147);
    +var li=node.parent();
    +var ul=li.parent();
    +li.remove();
    +if(ul.children("li").length==0){
    +var node=ul.prev();
    +node.find(".tree-icon").removeClass("tree-folder").addClass("tree-file");
    +node.find(".tree-hit").remove();
    +$("<span class=\"tree-indent\"></span>").prependTo(node);
    +if(ul[0]!=_146){
    +ul.remove();
    +}
    +}
    +if(_148){
    +_e8(_146,_148.target);
    +}
    +_101(_146,_146);
    +};
    +function _149(_14a,_14b){
    +function _14c(aa,ul){
    +ul.children("li").each(function(){
    +var node=$(this).children("div.tree-node");
    +var _14d=_b4(_14a,node[0]);
    +var sub=$(this).children("ul");
    +if(sub.length){
    +_14d.children=[];
    +_14c(_14d.children,sub);
    +}
    +aa.push(_14d);
    +});
    +};
    +if(_14b){
    +var _14e=_b4(_14a,_14b);
    +_14e.children=[];
    +_14c(_14e.children,$(_14b).next());
    +return _14e;
    +}else{
    +return null;
    +}
    +};
    +function _14f(_150,_151){
    +var node=$(_151.target);
    +var _152=_b4(_150,_151.target);
    +if(_152.iconCls){
    +node.find(".tree-icon").removeClass(_152.iconCls);
    +}
    +var data=$.extend({},_152,_151);
    +$.data(_151.target,"tree-node",data);
    +node.attr("node-id",data.id);
    +node.find(".tree-title").html(data.text);
    +if(data.iconCls){
    +node.find(".tree-icon").addClass(data.iconCls);
    +}
    +if(_152.checked!=data.checked){
    +_d9(_150,_151.target,data.checked);
    +}
    +};
    +function _b4(_153,_154){
    +var node=$.extend({},$.data(_154,"tree-node"),{target:_154,checked:$(_154).find(".tree-checkbox").hasClass("tree-checkbox1")});
    +if(!_ed(_153,_154)){
    +node.state=$(_154).find(".tree-hit").hasClass("tree-expanded")?"open":"closed";
    +}
    +return node;
    +};
    +function _155(_156,id){
    +var node=$(_156).find("div.tree-node[node-id="+id+"]");
    +if(node.length){
    +return _b4(_156,node[0]);
    +}else{
    +return null;
    +}
    +};
    +function _157(_158,_159){
    +var opts=$.data(_158,"tree").options;
    +var node=_b4(_158,_159);
    +if(opts.onBeforeSelect.call(_158,node)==false){
    +return;
    +}
    +$("div.tree-node-selected",_158).removeClass("tree-node-selected");
    +$(_159).addClass("tree-node-selected");
    +opts.onSelect.call(_158,node);
    +};
    +function _ed(_15a,_15b){
    +var node=$(_15b);
    +var hit=node.children("span.tree-hit");
    +return hit.length==0;
    +};
    +function _15c(_15d,_15e){
    +var opts=$.data(_15d,"tree").options;
    +var node=_b4(_15d,_15e);
    +if(opts.onBeforeEdit.call(_15d,node)==false){
    +return;
    +}
    +$(_15e).css("position","relative");
    +var nt=$(_15e).find(".tree-title");
    +var _15f=nt.outerWidth();
    +nt.empty();
    +var _160=$("<input class=\"tree-editor\">").appendTo(nt);
    +_160.val(node.text).focus();
    +_160.width(_15f+20);
    +_160.height(document.compatMode=="CSS1Compat"?(18-(_160.outerHeight()-_160.height())):18);
    +_160.bind("click",function(e){
    +return false;
    +}).bind("mousedown",function(e){
    +e.stopPropagation();
    +}).bind("mousemove",function(e){
    +e.stopPropagation();
    +}).bind("keydown",function(e){
    +if(e.keyCode==13){
    +_161(_15d,_15e);
    +return false;
    +}else{
    +if(e.keyCode==27){
    +_165(_15d,_15e);
    +return false;
    +}
    +}
    +}).bind("blur",function(e){
    +e.stopPropagation();
    +_161(_15d,_15e);
    +});
    +};
    +function _161(_162,_163){
    +var opts=$.data(_162,"tree").options;
    +$(_163).css("position","");
    +var _164=$(_163).find("input.tree-editor");
    +var val=_164.val();
    +_164.remove();
    +var node=_b4(_162,_163);
    +node.text=val;
    +_14f(_162,node);
    +opts.onAfterEdit.call(_162,node);
    +};
    +function _165(_166,_167){
    +var opts=$.data(_166,"tree").options;
    +$(_167).css("position","");
    +$(_167).find("input.tree-editor").remove();
    +var node=_b4(_166,_167);
    +_14f(_166,node);
    +opts.onCancelEdit.call(_166,node);
    +};
    +$.fn.tree=function(_168,_169){
    +if(typeof _168=="string"){
    +return $.fn.tree.methods[_168](this,_169);
    +}
    +var _168=_168||{};
    +return this.each(function(){
    +var _16a=$.data(this,"tree");
    +var opts;
    +if(_16a){
    +opts=$.extend(_16a.options,_168);
    +_16a.options=opts;
    +}else{
    +opts=$.extend({},$.fn.tree.defaults,$.fn.tree.parseOptions(this),_168);
    +$.data(this,"tree",{options:opts,tree:_a1(this)});
    +var data=_a4(this);
    +if(data.length&&!opts.data){
    +opts.data=data;
    +}
    +}
    +_ac(this);
    +if(opts.lines){
    +$(this).addClass("tree-lines");
    +}
    +if(opts.data){
    +_f2(this,this,opts.data);
    +}else{
    +if(opts.dnd){
    +_b8(this);
    +}else{
    +_b5(this);
    +}
    +}
    +_10a(this,this);
    +});
    +};
    +$.fn.tree.methods={options:function(jq){
    +return $.data(jq[0],"tree").options;
    +},loadData:function(jq,data){
    +return jq.each(function(){
    +_f2(this,this,data);
    +});
    +},getNode:function(jq,_16b){
    +return _b4(jq[0],_16b);
    +},getData:function(jq,_16c){
    +return _149(jq[0],_16c);
    +},reload:function(jq,_16d){
    +return jq.each(function(){
    +if(_16d){
    +var node=$(_16d);
    +var hit=node.children("span.tree-hit");
    +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed");
    +node.next().remove();
    +_111(this,_16d);
    +}else{
    +$(this).empty();
    +_10a(this,this);
    +}
    +});
    +},getRoot:function(jq){
    +return _129(jq[0]);
    +},getRoots:function(jq){
    +return _12c(jq[0]);
    +},getParent:function(jq,_16e){
    +return _124(jq[0],_16e);
    +},getChildren:function(jq,_16f){
    +return _f1(jq[0],_16f);
    +},getChecked:function(jq,_170){
    +return _136(jq[0],_170);
    +},getSelected:function(jq){
    +return _13b(jq[0]);
    +},isLeaf:function(jq,_171){
    +return _ed(jq[0],_171);
    +},find:function(jq,id){
    +return _155(jq[0],id);
    +},select:function(jq,_172){
    +return jq.each(function(){
    +_157(this,_172);
    +});
    +},check:function(jq,_173){
    +return jq.each(function(){
    +_d9(this,_173,true);
    +});
    +},uncheck:function(jq,_174){
    +return jq.each(function(){
    +_d9(this,_174,false);
    +});
    +},collapse:function(jq,_175){
    +return jq.each(function(){
    +_116(this,_175);
    +});
    +},expand:function(jq,_176){
    +return jq.each(function(){
    +_111(this,_176);
    +});
    +},collapseAll:function(jq,_177){
    +return jq.each(function(){
    +_125(this,_177);
    +});
    +},expandAll:function(jq,_178){
    +return jq.each(function(){
    +_11c(this,_178);
    +});
    +},expandTo:function(jq,_179){
    +return jq.each(function(){
    +_120(this,_179);
    +});
    +},toggle:function(jq,_17a){
    +return jq.each(function(){
    +_119(this,_17a);
    +});
    +},append:function(jq,_17b){
    +return jq.each(function(){
    +_13d(this,_17b);
    +});
    +},insert:function(jq,_17c){
    +return jq.each(function(){
    +_141(this,_17c);
    +});
    +},remove:function(jq,_17d){
    +return jq.each(function(){
    +_145(this,_17d);
    +});
    +},pop:function(jq,_17e){
    +var node=jq.tree("getData",_17e);
    +jq.tree("remove",_17e);
    +return node;
    +},update:function(jq,_17f){
    +return jq.each(function(){
    +_14f(this,_17f);
    +});
    +},enableDnd:function(jq){
    +return jq.each(function(){
    +_b8(this);
    +});
    +},disableDnd:function(jq){
    +return jq.each(function(){
    +_b5(this);
    +});
    +},beginEdit:function(jq,_180){
    +return jq.each(function(){
    +_15c(this,_180);
    +});
    +},endEdit:function(jq,_181){
    +return jq.each(function(){
    +_161(this,_181);
    +});
    +},cancelEdit:function(jq,_182){
    +return jq.each(function(){
    +_165(this,_182);
    +});
    +}};
    +$.fn.tree.parseOptions=function(_183){
    +var t=$(_183);
    +return $.extend({},$.parser.parseOptions(_183,["url","method",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean",lines:"boolean",dnd:"boolean"}]));
    +};
    +$.fn.tree.defaults={url:null,method:"post",animate:false,checkbox:false,cascadeCheck:true,onlyLeafCheck:false,lines:false,dnd:false,data:null,loader:function(_184,_185,_186){
    +var opts=$(this).tree("options");
    +if(!opts.url){
    +return false;
    +}
    +$.ajax({type:opts.method,url:opts.url,data:_184,dataType:"json",success:function(data){
    +_185(data);
    +},error:function(){
    +_186.apply(this,arguments);
    +}});
    +},loadFilter:function(data,_187){
    +return data;
    +},onBeforeLoad:function(node,_188){
    +},onLoadSuccess:function(node,data){
    +},onLoadError:function(){
    +},onClick:function(node){
    +},onDblClick:function(node){
    +},onBeforeExpand:function(node){
    +},onExpand:function(node){
    +},onBeforeCollapse:function(node){
    +},onCollapse:function(node){
    +},onBeforeCheck:function(node,_189){
    +},onCheck:function(node,_18a){
    +},onBeforeSelect:function(node){
    +},onSelect:function(node){
    +},onContextMenu:function(e,node){
    +},onBeforeDrag:function(node){
    +},onStartDrag:function(node){
    +},onStopDrag:function(node){
    +},onDragEnter:function(_18b,_18c){
    +},onDragOver:function(_18d,_18e){
    +},onDragLeave:function(_18f,_190){
    +},onDrop:function(_191,_192,_193){
    +},onBeforeEdit:function(node){
    +},onAfterEdit:function(node){
    +},onCancelEdit:function(node){
    +}};
    +})(jQuery);
    +(function($){
    +function init(_194){
    +$(_194).addClass("progressbar");
    +$(_194).html("<div class=\"progressbar-text\"></div><div class=\"progressbar-value\"><div class=\"progressbar-text\"></div></div>");
    +return $(_194);
    +};
    +function _195(_196,_197){
    +var opts=$.data(_196,"progressbar").options;
    +var bar=$.data(_196,"progressbar").bar;
    +if(_197){
    +opts.width=_197;
    +}
    +bar._outerWidth(opts.width)._outerHeight(opts.height);
    +bar.find("div.progressbar-text").width(bar.width());
    +bar.find("div.progressbar-text,div.progressbar-value").css({height:bar.height()+"px",lineHeight:bar.height()+"px"});
    +};
    +$.fn.progressbar=function(_198,_199){
    +if(typeof _198=="string"){
    +var _19a=$.fn.progressbar.methods[_198];
    +if(_19a){
    +return _19a(this,_199);
    +}
    +}
    +_198=_198||{};
    +return this.each(function(){
    +var _19b=$.data(this,"progressbar");
    +if(_19b){
    +$.extend(_19b.options,_198);
    +}else{
    +_19b=$.data(this,"progressbar",{options:$.extend({},$.fn.progressbar.defaults,$.fn.progressbar.parseOptions(this),_198),bar:init(this)});
    +}
    +$(this).progressbar("setValue",_19b.options.value);
    +_195(this);
    +});
    +};
    +$.fn.progressbar.methods={options:function(jq){
    +return $.data(jq[0],"progressbar").options;
    +},resize:function(jq,_19c){
    +return jq.each(function(){
    +_195(this,_19c);
    +});
    +},getValue:function(jq){
    +return $.data(jq[0],"progressbar").options.value;
    +},setValue:function(jq,_19d){
    +if(_19d<0){
    +_19d=0;
    +}
    +if(_19d>100){
    +_19d=100;
    +}
    +return jq.each(function(){
    +var opts=$.data(this,"progressbar").options;
    +var text=opts.text.replace(/{value}/,_19d);
    +var _19e=opts.value;
    +opts.value=_19d;
    +$(this).find("div.progressbar-value").width(_19d+"%");
    +$(this).find("div.progressbar-text").html(text);
    +if(_19e!=_19d){
    +opts.onChange.call(this,_19d,_19e);
    +}
    +});
    +}};
    +$.fn.progressbar.parseOptions=function(_19f){
    +return $.extend({},$.parser.parseOptions(_19f,["width","height","text",{value:"number"}]));
    +};
    +$.fn.progressbar.defaults={width:"auto",height:22,value:0,text:"{value}%",onChange:function(_1a0,_1a1){
    +}};
    +})(jQuery);
    +(function($){
    +function _1a2(node){
    +node.each(function(){
    +$(this).remove();
    +if($.browser.msie){
    +this.outerHTML="";
    +}
    +});
    +};
    +function _1a3(_1a4,_1a5){
    +var opts=$.data(_1a4,"panel").options;
    +var _1a6=$.data(_1a4,"panel").panel;
    +var _1a7=_1a6.children("div.panel-header");
    +var _1a8=_1a6.children("div.panel-body");
    +if(_1a5){
    +if(_1a5.width){
    +opts.width=_1a5.width;
    +}
    +if(_1a5.height){
    +opts.height=_1a5.height;
    +}
    +if(_1a5.left!=null){
    +opts.left=_1a5.left;
    +}
    +if(_1a5.top!=null){
    +opts.top=_1a5.top;
    +}
    +}
    +opts.fit?$.extend(opts,_1a6._fit()):_1a6._fit(false);
    +_1a6.css({left:opts.left,top:opts.top});
    +if(!isNaN(opts.width)){
    +_1a6._outerWidth(opts.width);
    +}else{
    +_1a6.width("auto");
    +}
    +_1a7.add(_1a8)._outerWidth(_1a6.width());
    +if(!isNaN(opts.height)){
    +_1a6._outerHeight(opts.height);
    +_1a8._outerHeight(_1a6.height()-_1a7._outerHeight());
    +}else{
    +_1a8.height("auto");
    +}
    +_1a6.css("height","");
    +opts.onResize.apply(_1a4,[opts.width,opts.height]);
    +_1a6.find(">div.panel-body>div").triggerHandler("_resize");
    +};
    +function _1a9(_1aa,_1ab){
    +var opts=$.data(_1aa,"panel").options;
    +var _1ac=$.data(_1aa,"panel").panel;
    +if(_1ab){
    +if(_1ab.left!=null){
    +opts.left=_1ab.left;
    +}
    +if(_1ab.top!=null){
    +opts.top=_1ab.top;
    +}
    +}
    +_1ac.css({left:opts.left,top:opts.top});
    +opts.onMove.apply(_1aa,[opts.left,opts.top]);
    +};
    +function _1ad(_1ae){
    +$(_1ae).addClass("panel-body");
    +var _1af=$("<div class=\"panel\"></div>").insertBefore(_1ae);
    +_1af[0].appendChild(_1ae);
    +_1af.bind("_resize",function(){
    +var opts=$.data(_1ae,"panel").options;
    +if(opts.fit==true){
    +_1a3(_1ae);
    +}
    +return false;
    +});
    +return _1af;
    +};
    +function _1b0(_1b1){
    +var opts=$.data(_1b1,"panel").options;
    +var _1b2=$.data(_1b1,"panel").panel;
    +if(opts.tools&&typeof opts.tools=="string"){
    +_1b2.find(">div.panel-header>div.panel-tool .panel-tool-a").appendTo(opts.tools);
    +}
    +_1a2(_1b2.children("div.panel-header"));
    +if(opts.title&&!opts.noheader){
    +var _1b3=$("<div class=\"panel-header\"><div class=\"panel-title\">"+opts.title+"</div></div>").prependTo(_1b2);
    +if(opts.iconCls){
    +_1b3.find(".panel-title").addClass("panel-with-icon");
    +$("<div class=\"panel-icon\"></div>").addClass(opts.iconCls).appendTo(_1b3);
    +}
    +var tool=$("<div class=\"panel-tool\"></div>").appendTo(_1b3);
    +tool.bind("click",function(e){
    +e.stopPropagation();
    +});
    +if(opts.tools){
    +if(typeof opts.tools=="string"){
    +$(opts.tools).children().each(function(){
    +$(this).addClass($(this).attr("iconCls")).addClass("panel-tool-a").appendTo(tool);
    +});
    +}else{
    +for(var i=0;i<opts.tools.length;i++){
    +var t=$("<a href=\"javascript:void(0)\"></a>").addClass(opts.tools[i].iconCls).appendTo(tool);
    +if(opts.tools[i].handler){
    +t.bind("click",eval(opts.tools[i].handler));
    +}
    +}
    +}
    +}
    +if(opts.collapsible){
    +$("<a class=\"panel-tool-collapse\" href=\"javascript:void(0)\"></a>").appendTo(tool).bind("click",function(){
    +if(opts.collapsed==true){
    +_1ce(_1b1,true);
    +}else{
    +_1c3(_1b1,true);
    +}
    +return false;
    +});
    +}
    +if(opts.minimizable){
    +$("<a class=\"panel-tool-min\" href=\"javascript:void(0)\"></a>").appendTo(tool).bind("click",function(){
    +_1d4(_1b1);
    +return false;
    +});
    +}
    +if(opts.maximizable){
    +$("<a class=\"panel-tool-max\" href=\"javascript:void(0)\"></a>").appendTo(tool).bind("click",function(){
    +if(opts.maximized==true){
    +_1d7(_1b1);
    +}else{
    +_1c2(_1b1);
    +}
    +return false;
    +});
    +}
    +if(opts.closable){
    +$("<a class=\"panel-tool-close\" href=\"javascript:void(0)\"></a>").appendTo(tool).bind("click",function(){
    +_1b4(_1b1);
    +return false;
    +});
    +}
    +_1b2.children("div.panel-body").removeClass("panel-body-noheader");
    +}else{
    +_1b2.children("div.panel-body").addClass("panel-body-noheader");
    +}
    +};
    +function _1b5(_1b6){
    +var _1b7=$.data(_1b6,"panel");
    +var opts=_1b7.options;
    +if(opts.href){
    +if(!_1b7.isLoaded||!opts.cache){
    +_1b7.isLoaded=false;
    +_1b8(_1b6);
    +if(opts.loadingMessage){
    +$(_1b6).html($("<div class=\"panel-loading\"></div>").html(opts.loadingMessage));
    +}
    +$.ajax({url:opts.href,cache:false,dataType:"html",success:function(data){
    +_1b9(opts.extractor.call(_1b6,data));
    +opts.onLoad.apply(_1b6,arguments);
    +_1b7.isLoaded=true;
    +}});
    +}
    +}else{
    +if(opts.content){
    +if(!_1b7.isLoaded){
    +_1b8(_1b6);
    +_1b9(opts.content);
    +_1b7.isLoaded=true;
    +}
    +}
    +}
    +function _1b9(_1ba){
    +$(_1b6).html(_1ba);
    +if($.parser){
    +$.parser.parse($(_1b6));
    +}
    +};
    +};
    +function _1b8(_1bb){
    +var t=$(_1bb);
    +t.find(".combo-f").each(function(){
    +$(this).combo("destroy");
    +});
    +t.find(".m-btn").each(function(){
    +$(this).menubutton("destroy");
    +});
    +t.find(".s-btn").each(function(){
    +$(this).splitbutton("destroy");
    +});
    +};
    +function _1bc(_1bd){
    +$(_1bd).find("div.panel:visible,div.accordion:visible,div.tabs-container:visible,div.layout:visible").each(function(){
    +$(this).triggerHandler("_resize",[true]);
    +});
    +};
    +function _1be(_1bf,_1c0){
    +var opts=$.data(_1bf,"panel").options;
    +var _1c1=$.data(_1bf,"panel").panel;
    +if(_1c0!=true){
    +if(opts.onBeforeOpen.call(_1bf)==false){
    +return;
    +}
    +}
    +_1c1.show();
    +opts.closed=false;
    +opts.minimized=false;
    +var tool=_1c1.children("div.panel-header").find("a.panel-tool-restore");
    +if(tool.length){
    +opts.maximized=true;
    +}
    +opts.onOpen.call(_1bf);
    +if(opts.maximized==true){
    +opts.maximized=false;
    +_1c2(_1bf);
    +}
    +if(opts.collapsed==true){
    +opts.collapsed=false;
    +_1c3(_1bf);
    +}
    +if(!opts.collapsed){
    +_1b5(_1bf);
    +_1bc(_1bf);
    +}
    +};
    +function _1b4(_1c4,_1c5){
    +var opts=$.data(_1c4,"panel").options;
    +var _1c6=$.data(_1c4,"panel").panel;
    +if(_1c5!=true){
    +if(opts.onBeforeClose.call(_1c4)==false){
    +return;
    +}
    +}
    +_1c6._fit(false);
    +_1c6.hide();
    +opts.closed=true;
    +opts.onClose.call(_1c4);
    +};
    +function _1c7(_1c8,_1c9){
    +var opts=$.data(_1c8,"panel").options;
    +var _1ca=$.data(_1c8,"panel").panel;
    +if(_1c9!=true){
    +if(opts.onBeforeDestroy.call(_1c8)==false){
    +return;
    +}
    +}
    +_1b8(_1c8);
    +_1a2(_1ca);
    +opts.onDestroy.call(_1c8);
    +};
    +function _1c3(_1cb,_1cc){
    +var opts=$.data(_1cb,"panel").options;
    +var _1cd=$.data(_1cb,"panel").panel;
    +var body=_1cd.children("div.panel-body");
    +var tool=_1cd.children("div.panel-header").find("a.panel-tool-collapse");
    +if(opts.collapsed==true){
    +return;
    +}
    +body.stop(true,true);
    +if(opts.onBeforeCollapse.call(_1cb)==false){
    +return;
    +}
    +tool.addClass("panel-tool-expand");
    +if(_1cc==true){
    +body.slideUp("normal",function(){
    +opts.collapsed=true;
    +opts.onCollapse.call(_1cb);
    +});
    +}else{
    +body.hide();
    +opts.collapsed=true;
    +opts.onCollapse.call(_1cb);
    +}
    +};
    +function _1ce(_1cf,_1d0){
    +var opts=$.data(_1cf,"panel").options;
    +var _1d1=$.data(_1cf,"panel").panel;
    +var body=_1d1.children("div.panel-body");
    +var tool=_1d1.children("div.panel-header").find("a.panel-tool-collapse");
    +if(opts.collapsed==false){
    +return;
    +}
    +body.stop(true,true);
    +if(opts.onBeforeExpand.call(_1cf)==false){
    +return;
    +}
    +tool.removeClass("panel-tool-expand");
    +if(_1d0==true){
    +body.slideDown("normal",function(){
    +opts.collapsed=false;
    +opts.onExpand.call(_1cf);
    +_1b5(_1cf);
    +_1bc(_1cf);
    +});
    +}else{
    +body.show();
    +opts.collapsed=false;
    +opts.onExpand.call(_1cf);
    +_1b5(_1cf);
    +_1bc(_1cf);
    +}
    +};
    +function _1c2(_1d2){
    +var opts=$.data(_1d2,"panel").options;
    +var _1d3=$.data(_1d2,"panel").panel;
    +var tool=_1d3.children("div.panel-header").find("a.panel-tool-max");
    +if(opts.maximized==true){
    +return;
    +}
    +tool.addClass("panel-tool-restore");
    +if(!$.data(_1d2,"panel").original){
    +$.data(_1d2,"panel").original={width:opts.width,height:opts.height,left:opts.left,top:opts.top,fit:opts.fit};
    +}
    +opts.left=0;
    +opts.top=0;
    +opts.fit=true;
    +_1a3(_1d2);
    +opts.minimized=false;
    +opts.maximized=true;
    +opts.onMaximize.call(_1d2);
    +};
    +function _1d4(_1d5){
    +var opts=$.data(_1d5,"panel").options;
    +var _1d6=$.data(_1d5,"panel").panel;
    +_1d6._fit(false);
    +_1d6.hide();
    +opts.minimized=true;
    +opts.maximized=false;
    +opts.onMinimize.call(_1d5);
    +};
    +function _1d7(_1d8){
    +var opts=$.data(_1d8,"panel").options;
    +var _1d9=$.data(_1d8,"panel").panel;
    +var tool=_1d9.children("div.panel-header").find("a.panel-tool-max");
    +if(opts.maximized==false){
    +return;
    +}
    +_1d9.show();
    +tool.removeClass("panel-tool-restore");
    +$.extend(opts,$.data(_1d8,"panel").original);
    +_1a3(_1d8);
    +opts.minimized=false;
    +opts.maximized=false;
    +$.data(_1d8,"panel").original=null;
    +opts.onRestore.call(_1d8);
    +};
    +function _1da(_1db){
    +var opts=$.data(_1db,"panel").options;
    +var _1dc=$.data(_1db,"panel").panel;
    +var _1dd=$(_1db).panel("header");
    +var body=$(_1db).panel("body");
    +_1dc.css(opts.style);
    +_1dc.addClass(opts.cls);
    +if(opts.border){
    +_1dd.removeClass("panel-header-noborder");
    +body.removeClass("panel-body-noborder");
    +}else{
    +_1dd.addClass("panel-header-noborder");
    +body.addClass("panel-body-noborder");
    +}
    +_1dd.addClass(opts.headerCls);
    +body.addClass(opts.bodyCls);
    +if(opts.id){
    +$(_1db).attr("id",opts.id);
    +}else{
    +$(_1db).attr("id","");
    +}
    +};
    +function _1de(_1df,_1e0){
    +$.data(_1df,"panel").options.title=_1e0;
    +$(_1df).panel("header").find("div.panel-title").html(_1e0);
    +};
    +var TO=false;
    +var _1e1=true;
    +$(window).unbind(".panel").bind("resize.panel",function(){
    +if(!_1e1){
    +return;
    +}
    +if(TO!==false){
    +clearTimeout(TO);
    +}
    +TO=setTimeout(function(){
    +_1e1=false;
    +var _1e2=$("body.layout");
    +if(_1e2.length){
    +_1e2.layout("resize");
    +}else{
    +$("body").children("div.panel,div.accordion,div.tabs-container,div.layout").triggerHandler("_resize");
    +}
    +_1e1=true;
    +TO=false;
    +},200);
    +});
    +$.fn.panel=function(_1e3,_1e4){
    +if(typeof _1e3=="string"){
    +return $.fn.panel.methods[_1e3](this,_1e4);
    +}
    +_1e3=_1e3||{};
    +return this.each(function(){
    +var _1e5=$.data(this,"panel");
    +var opts;
    +if(_1e5){
    +opts=$.extend(_1e5.options,_1e3);
    +_1e5.isLoaded=false;
    +}else{
    +opts=$.extend({},$.fn.panel.defaults,$.fn.panel.parseOptions(this),_1e3);
    +$(this).attr("title","");
    +_1e5=$.data(this,"panel",{options:opts,panel:_1ad(this),isLoaded:false});
    +}
    +_1b0(this);
    +_1da(this);
    +if(opts.doSize==true){
    +_1e5.panel.css("display","block");
    +_1a3(this);
    +}
    +if(opts.closed==true||opts.minimized==true){
    +_1e5.panel.hide();
    +}else{
    +_1be(this);
    +}
    +});
    +};
    +$.fn.panel.methods={options:function(jq){
    +return $.data(jq[0],"panel").options;
    +},panel:function(jq){
    +return $.data(jq[0],"panel").panel;
    +},header:function(jq){
    +return $.data(jq[0],"panel").panel.find(">div.panel-header");
    +},body:function(jq){
    +return $.data(jq[0],"panel").panel.find(">div.panel-body");
    +},setTitle:function(jq,_1e6){
    +return jq.each(function(){
    +_1de(this,_1e6);
    +});
    +},open:function(jq,_1e7){
    +return jq.each(function(){
    +_1be(this,_1e7);
    +});
    +},close:function(jq,_1e8){
    +return jq.each(function(){
    +_1b4(this,_1e8);
    +});
    +},destroy:function(jq,_1e9){
    +return jq.each(function(){
    +_1c7(this,_1e9);
    +});
    +},refresh:function(jq,href){
    +return jq.each(function(){
    +$.data(this,"panel").isLoaded=false;
    +if(href){
    +$.data(this,"panel").options.href=href;
    +}
    +_1b5(this);
    +});
    +},resize:function(jq,_1ea){
    +return jq.each(function(){
    +_1a3(this,_1ea);
    +});
    +},move:function(jq,_1eb){
    +return jq.each(function(){
    +_1a9(this,_1eb);
    +});
    +},maximize:function(jq){
    +return jq.each(function(){
    +_1c2(this);
    +});
    +},minimize:function(jq){
    +return jq.each(function(){
    +_1d4(this);
    +});
    +},restore:function(jq){
    +return jq.each(function(){
    +_1d7(this);
    +});
    +},collapse:function(jq,_1ec){
    +return jq.each(function(){
    +_1c3(this,_1ec);
    +});
    +},expand:function(jq,_1ed){
    +return jq.each(function(){
    +_1ce(this,_1ed);
    +});
    +}};
    +$.fn.panel.parseOptions=function(_1ee){
    +var t=$(_1ee);
    +return $.extend({},$.parser.parseOptions(_1ee,["id","width","height","left","top","title","iconCls","cls","headerCls","bodyCls","tools","href",{cache:"boolean",fit:"boolean",border:"boolean",noheader:"boolean"},{collapsible:"boolean",minimizable:"boolean",maximizable:"boolean"},{closable:"boolean",collapsed:"boolean",minimized:"boolean",maximized:"boolean",closed:"boolean"}]),{loadingMessage:(t.attr("loadingMessage")!=undefined?t.attr("loadingMessage"):undefined)});
    +};
    +$.fn.panel.defaults={id:null,title:null,iconCls:null,width:"auto",height:"auto",left:null,top:null,cls:null,headerCls:null,bodyCls:null,style:{},href:null,cache:true,fit:false,border:true,doSize:true,noheader:false,content:null,collapsible:false,minimizable:false,maximizable:false,closable:false,collapsed:false,minimized:false,maximized:false,closed:false,tools:null,href:null,loadingMessage:"Loading...",extractor:function(data){
    +var _1ef=/<body[^>]*>((.|[\n\r])*)<\/body>/im;
    +var _1f0=_1ef.exec(data);
    +if(_1f0){
    +return _1f0[1];
    +}else{
    +return data;
    +}
    +},onLoad:function(){
    +},onBeforeOpen:function(){
    +},onOpen:function(){
    +},onBeforeClose:function(){
    +},onClose:function(){
    +},onBeforeDestroy:function(){
    +},onDestroy:function(){
    +},onResize:function(_1f1,_1f2){
    +},onMove:function(left,top){
    +},onMaximize:function(){
    +},onRestore:function(){
    +},onMinimize:function(){
    +},onBeforeCollapse:function(){
    +},onBeforeExpand:function(){
    +},onCollapse:function(){
    +},onExpand:function(){
    +}};
    +})(jQuery);
    +(function($){
    +function _1f3(_1f4,_1f5){
    +var opts=$.data(_1f4,"window").options;
    +if(_1f5){
    +if(_1f5.width){
    +opts.width=_1f5.width;
    +}
    +if(_1f5.height){
    +opts.height=_1f5.height;
    +}
    +if(_1f5.left!=null){
    +opts.left=_1f5.left;
    +}
    +if(_1f5.top!=null){
    +opts.top=_1f5.top;
    +}
    +}
    +$(_1f4).panel("resize",opts);
    +};
    +function _1f6(_1f7,_1f8){
    +var _1f9=$.data(_1f7,"window");
    +if(_1f8){
    +if(_1f8.left!=null){
    +_1f9.options.left=_1f8.left;
    +}
    +if(_1f8.top!=null){
    +_1f9.options.top=_1f8.top;
    +}
    +}
    +$(_1f7).panel("move",_1f9.options);
    +if(_1f9.shadow){
    +_1f9.shadow.css({left:_1f9.options.left,top:_1f9.options.top});
    +}
    +};
    +function _1fa(_1fb,_1fc){
    +var _1fd=$.data(_1fb,"window");
    +var opts=_1fd.options;
    +var _1fe=opts.width;
    +if(isNaN(_1fe)){
    +_1fe=_1fd.window._outerWidth();
    +}
    +if(opts.inline){
    +var _1ff=_1fd.window.parent();
    +opts.left=(_1ff.width()-_1fe)/2+_1ff.scrollLeft();
    +}else{
    +opts.left=($(window)._outerWidth()-_1fe)/2+$(document).scrollLeft();
    +}
    +if(_1fc){
    +_1f6(_1fb);
    +}
    +};
    +function _200(_201,_202){
    +var _203=$.data(_201,"window");
    +var opts=_203.options;
    +var _204=opts.height;
    +if(isNaN(_204)){
    +_204=_203.window._outerHeight();
    +}
    +if(opts.inline){
    +var _205=_203.window.parent();
    +opts.top=(_205.height()-_204)/2+_205.scrollTop();
    +}else{
    +opts.top=($(window)._outerHeight()-_204)/2+$(document).scrollTop();
    +}
    +if(_202){
    +_1f6(_201);
    +}
    +};
    +function _206(_207){
    +var _208=$.data(_207,"window");
    +var win=$(_207).panel($.extend({},_208.options,{border:false,doSize:true,closed:true,cls:"window",headerCls:"window-header",bodyCls:"window-body "+(_208.options.noheader?"window-body-noheader":""),onBeforeDestroy:function(){
    +if(_208.options.onBeforeDestroy.call(_207)==false){
    +return false;
    +}
    +if(_208.shadow){
    +_208.shadow.remove();
    +}
    +if(_208.mask){
    +_208.mask.remove();
    +}
    +},onClose:function(){
    +if(_208.shadow){
    +_208.shadow.hide();
    +}
    +if(_208.mask){
    +_208.mask.hide();
    +}
    +_208.options.onClose.call(_207);
    +},onOpen:function(){
    +if(_208.mask){
    +_208.mask.css({display:"block",zIndex:$.fn.window.defaults.zIndex++});
    +}
    +if(_208.shadow){
    +_208.shadow.css({display:"block",zIndex:$.fn.window.defaults.zIndex++,left:_208.options.left,top:_208.options.top,width:_208.window._outerWidth(),height:_208.window._outerHeight()});
    +}
    +_208.window.css("z-index",$.fn.window.defaults.zIndex++);
    +_208.options.onOpen.call(_207);
    +},onResize:function(_209,_20a){
    +var opts=$(this).panel("options");
    +$.extend(_208.options,{width:opts.width,height:opts.height,left:opts.left,top:opts.top});
    +if(_208.shadow){
    +_208.shadow.css({left:_208.options.left,top:_208.options.top,width:_208.window._outerWidth(),height:_208.window._outerHeight()});
    +}
    +_208.options.onResize.call(_207,_209,_20a);
    +},onMinimize:function(){
    +if(_208.shadow){
    +_208.shadow.hide();
    +}
    +if(_208.mask){
    +_208.mask.hide();
    +}
    +_208.options.onMinimize.call(_207);
    +},onBeforeCollapse:function(){
    +if(_208.options.onBeforeCollapse.call(_207)==false){
    +return false;
    +}
    +if(_208.shadow){
    +_208.shadow.hide();
    +}
    +},onExpand:function(){
    +if(_208.shadow){
    +_208.shadow.show();
    +}
    +_208.options.onExpand.call(_207);
    +}}));
    +_208.window=win.panel("panel");
    +if(_208.mask){
    +_208.mask.remove();
    +}
    +if(_208.options.modal==true){
    +_208.mask=$("<div class=\"window-mask\"></div>").insertAfter(_208.window);
    +_208.mask.css({width:(_208.options.inline?_208.mask.parent().width():_20b().width),height:(_208.options.inline?_208.mask.parent().height():_20b().height),display:"none"});
    +}
    +if(_208.shadow){
    +_208.shadow.remove();
    +}
    +if(_208.options.shadow==true){
    +_208.shadow=$("<div class=\"window-shadow\"></div>").insertAfter(_208.window);
    +_208.shadow.css({display:"none"});
    +}
    +if(_208.options.left==null){
    +_1fa(_207);
    +}
    +if(_208.options.top==null){
    +_200(_207);
    +}
    +_1f6(_207);
    +if(_208.options.closed==false){
    +win.window("open");
    +}
    +};
    +function _20c(_20d){
    +var _20e=$.data(_20d,"window");
    +_20e.window.draggable({handle:">div.panel-header>div.panel-title",disabled:_20e.options.draggable==false,onStartDrag:function(e){
    +if(_20e.mask){
    +_20e.mask.css("z-index",$.fn.window.defaults.zIndex++);
    +}
    +if(_20e.shadow){
    +_20e.shadow.css("z-index",$.fn.window.defaults.zIndex++);
    +}
    +_20e.window.css("z-index",$.fn.window.defaults.zIndex++);
    +if(!_20e.proxy){
    +_20e.proxy=$("<div class=\"window-proxy\"></div>").insertAfter(_20e.window);
    +}
    +_20e.proxy.css({display:"none",zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top});
    +_20e.proxy._outerWidth(_20e.window._outerWidth());
    +_20e.proxy._outerHeight(_20e.window._outerHeight());
    +setTimeout(function(){
    +if(_20e.proxy){
    +_20e.proxy.show();
    +}
    +},500);
    +},onDrag:function(e){
    +_20e.proxy.css({display:"block",left:e.data.left,top:e.data.top});
    +return false;
    +},onStopDrag:function(e){
    +_20e.options.left=e.data.left;
    +_20e.options.top=e.data.top;
    +$(_20d).window("move");
    +_20e.proxy.remove();
    +_20e.proxy=null;
    +}});
    +_20e.window.resizable({disabled:_20e.options.resizable==false,onStartResize:function(e){
    +_20e.pmask=$("<div class=\"window-proxy-mask\"></div>").insertAfter(_20e.window);
    +_20e.pmask.css({zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top,width:_20e.window._outerWidth(),height:_20e.window._outerHeight()});
    +if(!_20e.proxy){
    +_20e.proxy=$("<div class=\"window-proxy\"></div>").insertAfter(_20e.window);
    +}
    +_20e.proxy.css({zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top});
    +_20e.proxy._outerWidth(e.data.width);
    +_20e.proxy._outerHeight(e.data.height);
    +},onResize:function(e){
    +_20e.proxy.css({left:e.data.left,top:e.data.top});
    +_20e.proxy._outerWidth(e.data.width);
    +_20e.proxy._outerHeight(e.data.height);
    +return false;
    +},onStopResize:function(e){
    +$.extend(_20e.options,{left:e.data.left,top:e.data.top,width:e.data.width,height:e.data.height});
    +_1f3(_20d);
    +_20e.pmask.remove();
    +_20e.pmask=null;
    +_20e.proxy.remove();
    +_20e.proxy=null;
    +}});
    +};
    +function _20b(){
    +if(document.compatMode=="BackCompat"){
    +return {width:Math.max(document.body.scrollWidth,document.body.clientWidth),height:Math.max(document.body.scrollHeight,document.body.clientHeight)};
    +}else{
    +return {width:Math.max(document.documentElement.scrollWidth,document.documentElement.clientWidth),height:Math.max(document.documentElement.scrollHeight,document.documentElement.clientHeight)};
    +}
    +};
    +$(window).resize(function(){
    +$("body>div.window-mask").css({width:$(window)._outerWidth(),height:$(window)._outerHeight()});
    +setTimeout(function(){
    +$("body>div.window-mask").css({width:_20b().width,height:_20b().height});
    +},50);
    +});
    +$.fn.window=function(_20f,_210){
    +if(typeof _20f=="string"){
    +var _211=$.fn.window.methods[_20f];
    +if(_211){
    +return _211(this,_210);
    +}else{
    +return this.panel(_20f,_210);
    +}
    +}
    +_20f=_20f||{};
    +return this.each(function(){
    +var _212=$.data(this,"window");
    +if(_212){
    +$.extend(_212.options,_20f);
    +}else{
    +_212=$.data(this,"window",{options:$.extend({},$.fn.window.defaults,$.fn.window.parseOptions(this),_20f)});
    +if(!_212.options.inline){
    +document.body.appendChild(this);
    +}
    +}
    +_206(this);
    +_20c(this);
    +});
    +};
    +$.fn.window.methods={options:function(jq){
    +var _213=jq.panel("options");
    +var _214=$.data(jq[0],"window").options;
    +return $.extend(_214,{closed:_213.closed,collapsed:_213.collapsed,minimized:_213.minimized,maximized:_213.maximized});
    +},window:function(jq){
    +return $.data(jq[0],"window").window;
    +},resize:function(jq,_215){
    +return jq.each(function(){
    +_1f3(this,_215);
    +});
    +},move:function(jq,_216){
    +return jq.each(function(){
    +_1f6(this,_216);
    +});
    +},hcenter:function(jq){
    +return jq.each(function(){
    +_1fa(this,true);
    +});
    +},vcenter:function(jq){
    +return jq.each(function(){
    +_200(this,true);
    +});
    +},center:function(jq){
    +return jq.each(function(){
    +_1fa(this);
    +_200(this);
    +_1f6(this);
    +});
    +}};
    +$.fn.window.parseOptions=function(_217){
    +return $.extend({},$.fn.panel.parseOptions(_217),$.parser.parseOptions(_217,[{draggable:"boolean",resizable:"boolean",shadow:"boolean",modal:"boolean",inline:"boolean"}]));
    +};
    +$.fn.window.defaults=$.extend({},$.fn.panel.defaults,{zIndex:9000,draggable:true,resizable:true,shadow:true,modal:false,inline:false,title:"New Window",collapsible:true,minimizable:true,maximizable:true,closable:true,closed:false});
    +})(jQuery);
    +(function($){
    +function _218(_219){
    +var cp=document.createElement("div");
    +while(_219.firstChild){
    +cp.appendChild(_219.firstChild);
    +}
    +_219.appendChild(cp);
    +var _21a=$(cp);
    +_21a.attr("style",$(_219).attr("style"));
    +$(_219).removeAttr("style").css("overflow","hidden");
    +_21a.panel({border:false,doSize:false,bodyCls:"dialog-content"});
    +return _21a;
    +};
    +function _21b(_21c){
    +var opts=$.data(_21c,"dialog").options;
    +var _21d=$.data(_21c,"dialog").contentPanel;
    +if(opts.toolbar){
    +if(typeof opts.toolbar=="string"){
    +$(opts.toolbar).addClass("dialog-toolbar").prependTo(_21c);
    +$(opts.toolbar).show();
    +}else{
    +$(_21c).find("div.dialog-toolbar").remove();
    +var _21e=$("<div class=\"dialog-toolbar\"><table cellspacing=\"0\" cellpadding=\"0\"><tr></tr></table></div>").prependTo(_21c);
    +var tr=_21e.find("tr");
    +for(var i=0;i<opts.toolbar.length;i++){
    +var btn=opts.toolbar[i];
    +if(btn=="-"){
    +$("<td><div class=\"dialog-tool-separator\"></div></td>").appendTo(tr);
    +}else{
    +var td=$("<td></td>").appendTo(tr);
    +var tool=$("<a href=\"javascript:void(0)\"></a>").appendTo(td);
    +tool[0].onclick=eval(btn.handler||function(){
    +});
    +tool.linkbutton($.extend({},btn,{plain:true}));
    +}
    +}
    +}
    +}else{
    +$(_21c).find("div.dialog-toolbar").remove();
    +}
    +if(opts.buttons){
    +if(typeof opts.buttons=="string"){
    +$(opts.buttons).addClass("dialog-button").appendTo(_21c);
    +$(opts.buttons).show();
    +}else{
    +$(_21c).find("div.dialog-button").remove();
    +var _21f=$("<div class=\"dialog-button\"></div>").appendTo(_21c);
    +for(var i=0;i<opts.buttons.length;i++){
    +var p=opts.buttons[i];
    +var _220=$("<a href=\"javascript:void(0)\"></a>").appendTo(_21f);
    +if(p.handler){
    +_220[0].onclick=p.handler;
    +}
    +_220.linkbutton(p);
    +}
    +}
    +}else{
    +$(_21c).find("div.dialog-button").remove();
    +}
    +var _221=opts.href;
    +var _222=opts.content;
    +opts.href=null;
    +opts.content=null;
    +_21d.panel({closed:opts.closed,cache:opts.cache,href:_221,content:_222,onLoad:function(){
    +if(opts.height=="auto"){
    +$(_21c).window("resize");
    +}
    +opts.onLoad.apply(_21c,arguments);
    +}});
    +$(_21c).window($.extend({},opts,{onOpen:function(){
    +if(_21d.panel("options").closed){
    +_21d.panel("open");
    +}
    +if(opts.onOpen){
    +opts.onOpen.call(_21c);
    +}
    +},onResize:function(_223,_224){
    +var _225=$(_21c);
    +_21d.panel("panel").show();
    +_21d.panel("resize",{width:_225.width(),height:(_224=="auto")?"auto":_225.height()-_225.children("div.dialog-toolbar")._outerHeight()-_225.children("div.dialog-button")._outerHeight()});
    +if(opts.onResize){
    +opts.onResize.call(_21c,_223,_224);
    +}
    +}}));
    +opts.href=_221;
    +opts.content=_222;
    +};
    +function _226(_227,href){
    +var _228=$.data(_227,"dialog").contentPanel;
    +_228.panel("refresh",href);
    +};
    +$.fn.dialog=function(_229,_22a){
    +if(typeof _229=="string"){
    +var _22b=$.fn.dialog.methods[_229];
    +if(_22b){
    +return _22b(this,_22a);
    +}else{
    +return this.window(_229,_22a);
    +}
    +}
    +_229=_229||{};
    +return this.each(function(){
    +var _22c=$.data(this,"dialog");
    +if(_22c){
    +$.extend(_22c.options,_229);
    +}else{
    +$.data(this,"dialog",{options:$.extend({},$.fn.dialog.defaults,$.fn.dialog.parseOptions(this),_229),contentPanel:_218(this)});
    +}
    +_21b(this);
    +});
    +};
    +$.fn.dialog.methods={options:function(jq){
    +var _22d=$.data(jq[0],"dialog").options;
    +var _22e=jq.panel("options");
    +$.extend(_22d,{closed:_22e.closed,collapsed:_22e.collapsed,minimized:_22e.minimized,maximized:_22e.maximized});
    +var _22f=$.data(jq[0],"dialog").contentPanel;
    +return _22d;
    +},dialog:function(jq){
    +return jq.window("window");
    +},refresh:function(jq,href){
    +return jq.each(function(){
    +_226(this,href);
    +});
    +}};
    +$.fn.dialog.parseOptions=function(_230){
    +return $.extend({},$.fn.window.parseOptions(_230),$.parser.parseOptions(_230,["toolbar","buttons"]));
    +};
    +$.fn.dialog.defaults=$.extend({},$.fn.window.defaults,{title:"New Dialog",collapsible:false,minimizable:false,maximizable:false,resizable:false,toolbar:null,buttons:null});
    +})(jQuery);
    +(function($){
    +function show(el,type,_231,_232){
    +var win=$(el).window("window");
    +if(!win){
    +return;
    +}
    +switch(type){
    +case null:
    +win.show();
    +break;
    +case "slide":
    +win.slideDown(_231);
    +break;
    +case "fade":
    +win.fadeIn(_231);
    +break;
    +case "show":
    +win.show(_231);
    +break;
    +}
    +var _233=null;
    +if(_232>0){
    +_233=setTimeout(function(){
    +hide(el,type,_231);
    +},_232);
    +}
    +win.hover(function(){
    +if(_233){
    +clearTimeout(_233);
    +}
    +},function(){
    +if(_232>0){
    +_233=setTimeout(function(){
    +hide(el,type,_231);
    +},_232);
    +}
    +});
    +};
    +function hide(el,type,_234){
    +if(el.locked==true){
    +return;
    +}
    +el.locked=true;
    +var win=$(el).window("window");
    +if(!win){
    +return;
    +}
    +switch(type){
    +case null:
    +win.hide();
    +break;
    +case "slide":
    +win.slideUp(_234);
    +break;
    +case "fade":
    +win.fadeOut(_234);
    +break;
    +case "show":
    +win.hide(_234);
    +break;
    +}
    +setTimeout(function(){
    +$(el).window("destroy");
    +},_234);
    +};
    +function _235(_236){
    +var opts=$.extend({},$.fn.window.defaults,{collapsible:false,minimizable:false,maximizable:false,shadow:false,draggable:false,resizable:false,closed:true,style:{left:"",top:"",right:0,zIndex:$.fn.window.defaults.zIndex++,bottom:-document.body.scrollTop-document.documentElement.scrollTop},onBeforeOpen:function(){
    +show(this,opts.showType,opts.showSpeed,opts.timeout);
    +return false;
    +},onBeforeClose:function(){
    +hide(this,opts.showType,opts.showSpeed);
    +return false;
    +}},{title:"",width:250,height:100,showType:"slide",showSpeed:600,msg:"",timeout:4000},_236);
    +opts.style.zIndex=$.fn.window.defaults.zIndex++;
    +var win=$("<div class=\"messager-body\"></div>").html(opts.msg).appendTo("body");
    +win.window(opts);
    +win.window("window").css(opts.style);
    +win.window("open");
    +return win;
    +};
    +function _237(_238,_239,_23a){
    +var win=$("<div class=\"messager-body\"></div>").appendTo("body");
    +win.append(_239);
    +if(_23a){
    +var tb=$("<div class=\"messager-button\"></div>").appendTo(win);
    +for(var _23b in _23a){
    +$("<a></a>").attr("href","javascript:void(0)").text(_23b).css("margin-left",10).bind("click",eval(_23a[_23b])).appendTo(tb).linkbutton();
    +}
    +}
    +win.window({title:_238,noheader:(_238?false:true),width:300,height:"auto",modal:true,collapsible:false,minimizable:false,maximizable:false,resizable:false,onClose:function(){
    +setTimeout(function(){
    +win.window("destroy");
    +},100);
    +}});
    +win.window("window").addClass("messager-window");
    +win.children("div.messager-button").children("a:first").focus();
    +return win;
    +};
    +$.messager={show:function(_23c){
    +return _235(_23c);
    +},alert:function(_23d,msg,icon,fn){
    +var _23e="<div>"+msg+"</div>";
    +switch(icon){
    +case "error":
    +_23e="<div class=\"messager-icon messager-error\"></div>"+_23e;
    +break;
    +case "info":
    +_23e="<div class=\"messager-icon messager-info\"></div>"+_23e;
    +break;
    +case "question":
    +_23e="<div class=\"messager-icon messager-question\"></div>"+_23e;
    +break;
    +case "warning":
    +_23e="<div class=\"messager-icon messager-warning\"></div>"+_23e;
    +break;
    +}
    +_23e+="<div style=\"clear:both;\"/>";
    +var _23f={};
    +_23f[$.messager.defaults.ok]=function(){
    +win.window("close");
    +if(fn){
    +fn();
    +return false;
    +}
    +};
    +var win=_237(_23d,_23e,_23f);
    +return win;
    +},confirm:function(_240,msg,fn){
    +var _241="<div class=\"messager-icon messager-question\"></div>"+"<div>"+msg+"</div>"+"<div style=\"clear:both;\"/>";
    +var _242={};
    +_242[$.messager.defaults.ok]=function(){
    +win.window("close");
    +if(fn){
    +fn(true);
    +return false;
    +}
    +};
    +_242[$.messager.defaults.cancel]=function(){
    +win.window("close");
    +if(fn){
    +fn(false);
    +return false;
    +}
    +};
    +var win=_237(_240,_241,_242);
    +return win;
    +},prompt:function(_243,msg,fn){
    +var _244="<div class=\"messager-icon messager-question\"></div>"+"<div>"+msg+"</div>"+"<br/>"+"<div style=\"clear:both;\"/>"+"<div><input class=\"messager-input\" type=\"text\"/></div>";
    +var _245={};
    +_245[$.messager.defaults.ok]=function(){
    +win.window("close");
    +if(fn){
    +fn($(".messager-input",win).val());
    +return false;
    +}
    +};
    +_245[$.messager.defaults.cancel]=function(){
    +win.window("close");
    +if(fn){
    +fn();
    +return false;
    +}
    +};
    +var win=_237(_243,_244,_245);
    +win.children("input.messager-input").focus();
    +return win;
    +},progress:function(_246){
    +var _247={bar:function(){
    +return $("body>div.messager-window").find("div.messager-p-bar");
    +},close:function(){
    +var win=$("body>div.messager-window>div.messager-body:has(div.messager-progress)");
    +if(win.length){
    +win.window("close");
    +}
    +}};
    +if(typeof _246=="string"){
    +var _248=_247[_246];
    +return _248();
    +}
    +var opts=$.extend({title:"",msg:"",text:undefined,interval:300},_246||{});
    +var _249="<div class=\"messager-progress\"><div class=\"messager-p-msg\"></div><div class=\"messager-p-bar\"></div></div>";
    +var win=_237(opts.title,_249,null);
    +win.find("div.messager-p-msg").html(opts.msg);
    +var bar=win.find("div.messager-p-bar");
    +bar.progressbar({text:opts.text});
    +win.window({closable:false,onClose:function(){
    +if(this.timer){
    +clearInterval(this.timer);
    +}
    +$(this).window("destroy");
    +}});
    +if(opts.interval){
    +win[0].timer=setInterval(function(){
    +var v=bar.progressbar("getValue");
    +v+=10;
    +if(v>100){
    +v=0;
    +}
    +bar.progressbar("setValue",v);
    +},opts.interval);
    +}
    +return win;
    +}};
    +$.messager.defaults={ok:"Ok",cancel:"Cancel"};
    +})(jQuery);
    +(function($){
    +function _24a(_24b){
    +var opts=$.data(_24b,"accordion").options;
    +var _24c=$.data(_24b,"accordion").panels;
    +var cc=$(_24b);
    +opts.fit?$.extend(opts,cc._fit()):cc._fit(false);
    +if(opts.width>0){
    +cc._outerWidth(opts.width);
    +}
    +var _24d="auto";
    +if(opts.height>0){
    +cc._outerHeight(opts.height);
    +var _24e=_24c.length?_24c[0].panel("header").css("height","")._outerHeight():"auto";
    +var _24d=cc.height()-(_24c.length-1)*_24e;
    +}
    +for(var i=0;i<_24c.length;i++){
    +var _24f=_24c[i];
    +var _250=_24f.panel("header");
    +_250._outerHeight(_24e);
    +_24f.panel("resize",{width:cc.width(),height:_24d});
    +}
    +};
    +function _251(_252){
    +var _253=$.data(_252,"accordion").panels;
    +for(var i=0;i<_253.length;i++){
    +var _254=_253[i];
    +if(_254.panel("options").collapsed==false){
    +return _254;
    +}
    +}
    +return null;
    +};
    +function _255(_256,_257){
    +var _258=$.data(_256,"accordion").panels;
    +for(var i=0;i<_258.length;i++){
    +if(_258[i][0]==$(_257)[0]){
    +return i;
    +}
    +}
    +return -1;
    +};
    +function _259(_25a,_25b,_25c){
    +var _25d=$.data(_25a,"accordion").panels;
    +if(typeof _25b=="number"){
    +if(_25b<0||_25b>=_25d.length){
    +return null;
    +}else{
    +var _25e=_25d[_25b];
    +if(_25c){
    +_25d.splice(_25b,1);
    +}
    +return _25e;
    +}
    +}
    +for(var i=0;i<_25d.length;i++){
    +var _25e=_25d[i];
    +if(_25e.panel("options").title==_25b){
    +if(_25c){
    +_25d.splice(i,1);
    +}
    +return _25e;
    +}
    +}
    +return null;
    +};
    +function _25f(_260){
    +var opts=$.data(_260,"accordion").options;
    +var cc=$(_260);
    +if(opts.border){
    +cc.removeClass("accordion-noborder");
    +}else{
    +cc.addClass("accordion-noborder");
    +}
    +};
    +function _261(_262){
    +var cc=$(_262);
    +cc.addClass("accordion");
    +var _263=[];
    +cc.children("div").each(function(){
    +var opts=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)});
    +var pp=$(this);
    +_263.push(pp);
    +_265(_262,pp,opts);
    +});
    +cc.bind("_resize",function(e,_264){
    +var opts=$.data(_262,"accordion").options;
    +if(opts.fit==true||_264){
    +_24a(_262);
    +}
    +return false;
    +});
    +return {accordion:cc,panels:_263};
    +};
    +function _265(_266,pp,_267){
    +pp.panel($.extend({},_267,{collapsible:false,minimizable:false,maximizable:false,closable:false,doSize:false,collapsed:true,headerCls:"accordion-header",bodyCls:"accordion-body",onBeforeExpand:function(){
    +var curr=_251(_266);
    +if(curr){
    +var _268=$(curr).panel("header");
    +_268.removeClass("accordion-header-selected");
    +_268.find(".accordion-collapse").triggerHandler("click");
    +}
    +var _268=pp.panel("header");
    +_268.addClass("accordion-header-selected");
    +_268.find(".accordion-collapse").removeClass("accordion-expand");
    +},onExpand:function(){
    +var opts=$.data(_266,"accordion").options;
    +opts.onSelect.call(_266,pp.panel("options").title,_255(_266,this));
    +},onBeforeCollapse:function(){
    +var _269=pp.panel("header");
    +_269.removeClass("accordion-header-selected");
    +_269.find(".accordion-collapse").addClass("accordion-expand");
    +}}));
    +var _26a=pp.panel("header");
    +var t=$("<a class=\"accordion-collapse accordion-expand\" href=\"javascript:void(0)\"></a>").appendTo(_26a.children("div.panel-tool"));
    +t.bind("click",function(e){
    +var _26b=$.data(_266,"accordion").options.animate;
    +_276(_266);
    +if(pp.panel("options").collapsed){
    +pp.panel("expand",_26b);
    +}else{
    +pp.panel("collapse",_26b);
    +}
    +return false;
    +});
    +_26a.click(function(){
    +$(this).find(".accordion-collapse").triggerHandler("click");
    +return false;
    +});
    +};
    +function _26c(_26d,_26e){
    +var _26f=_259(_26d,_26e);
    +if(!_26f){
    +return;
    +}
    +var curr=_251(_26d);
    +if(curr&&curr[0]==_26f[0]){
    +return;
    +}
    +_26f.panel("header").triggerHandler("click");
    +};
    +function _270(_271){
    +var _272=$.data(_271,"accordion").panels;
    +for(var i=0;i<_272.length;i++){
    +if(_272[i].panel("options").selected){
    +_273(i);
    +return;
    +}
    +}
    +if(_272.length){
    +_273(0);
    +}
    +function _273(_274){
    +var opts=$.data(_271,"accordion").options;
    +var _275=opts.animate;
    +opts.animate=false;
    +_26c(_271,_274);
    +opts.animate=_275;
    +};
    +};
    +function _276(_277){
    +var _278=$.data(_277,"accordion").panels;
    +for(var i=0;i<_278.length;i++){
    +_278[i].stop(true,true);
    +}
    +};
    +function add(_279,_27a){
    +var opts=$.data(_279,"accordion").options;
    +var _27b=$.data(_279,"accordion").panels;
    +if(_27a.selected==undefined){
    +_27a.selected=true;
    +}
    +_276(_279);
    +var pp=$("<div></div>").appendTo(_279);
    +_27b.push(pp);
    +_265(_279,pp,_27a);
    +_24a(_279);
    +opts.onAdd.call(_279,_27a.title,_27b.length-1);
    +if(_27a.selected){
    +_26c(_279,_27b.length-1);
    +}
    +};
    +function _27c(_27d,_27e){
    +var opts=$.data(_27d,"accordion").options;
    +var _27f=$.data(_27d,"accordion").panels;
    +_276(_27d);
    +var _280=_259(_27d,_27e);
    +var _281=_280.panel("options").title;
    +var _282=_255(_27d,_280);
    +if(opts.onBeforeRemove.call(_27d,_281,_282)==false){
    +return;
    +}
    +var _280=_259(_27d,_27e,true);
    +if(_280){
    +_280.panel("destroy");
    +if(_27f.length){
    +_24a(_27d);
    +var curr=_251(_27d);
    +if(!curr){
    +_26c(_27d,0);
    +}
    +}
    +}
    +opts.onRemove.call(_27d,_281,_282);
    +};
    +$.fn.accordion=function(_283,_284){
    +if(typeof _283=="string"){
    +return $.fn.accordion.methods[_283](this,_284);
    +}
    +_283=_283||{};
    +return this.each(function(){
    +var _285=$.data(this,"accordion");
    +var opts;
    +if(_285){
    +opts=$.extend(_285.options,_283);
    +_285.opts=opts;
    +}else{
    +opts=$.extend({},$.fn.accordion.defaults,$.fn.accordion.parseOptions(this),_283);
    +var r=_261(this);
    +$.data(this,"accordion",{options:opts,accordion:r.accordion,panels:r.panels});
    +}
    +_25f(this);
    +_24a(this);
    +_270(this);
    +});
    +};
    +$.fn.accordion.methods={options:function(jq){
    +return $.data(jq[0],"accordion").options;
    +},panels:function(jq){
    +return $.data(jq[0],"accordion").panels;
    +},resize:function(jq){
    +return jq.each(function(){
    +_24a(this);
    +});
    +},getSelected:function(jq){
    +return _251(jq[0]);
    +},getPanel:function(jq,_286){
    +return _259(jq[0],_286);
    +},getPanelIndex:function(jq,_287){
    +return _255(jq[0],_287);
    +},select:function(jq,_288){
    +return jq.each(function(){
    +_26c(this,_288);
    +});
    +},add:function(jq,_289){
    +return jq.each(function(){
    +add(this,_289);
    +});
    +},remove:function(jq,_28a){
    +return jq.each(function(){
    +_27c(this,_28a);
    +});
    +}};
    +$.fn.accordion.parseOptions=function(_28b){
    +var t=$(_28b);
    +return $.extend({},$.parser.parseOptions(_28b,["width","height",{fit:"boolean",border:"boolean",animate:"boolean"}]));
    +};
    +$.fn.accordion.defaults={width:"auto",height:"auto",fit:false,border:true,animate:true,onSelect:function(_28c,_28d){
    +},onAdd:function(_28e,_28f){
    +},onBeforeRemove:function(_290,_291){
    +},onRemove:function(_292,_293){
    +}};
    +})(jQuery);
    +(function($){
    +function _294(_295){
    +var opts=$.data(_295,"tabs").options;
    +if(opts.tabPosition=="left"||opts.tabPosition=="right"){
    +return;
    +}
    +var _296=$(_295).children("div.tabs-header");
    +var tool=_296.children("div.tabs-tool");
    +var _297=_296.children("div.tabs-scroller-left");
    +var _298=_296.children("div.tabs-scroller-right");
    +var wrap=_296.children("div.tabs-wrap");
    +tool._outerHeight(_296.outerHeight()-(opts.plain?2:0));
    +var _299=0;
    +$("ul.tabs li",_296).each(function(){
    +_299+=$(this).outerWidth(true);
    +});
    +var _29a=_296.width()-tool._outerWidth();
    +if(_299>_29a){
    +_297.show();
    +_298.show();
    +if(opts.toolPosition=="left"){
    +tool.css({left:_297.outerWidth(),right:""});
    +wrap.css({marginLeft:_297.outerWidth()+tool._outerWidth(),marginRight:_298._outerWidth(),width:_29a-_297.outerWidth()-_298.outerWidth()});
    +}else{
    +tool.css({left:"",right:_298.outerWidth()});
    +wrap.css({marginLeft:_297.outerWidth(),marginRight:_298.outerWidth()+tool._outerWidth(),width:_29a-_297.outerWidth()-_298.outerWidth()});
    +}
    +}else{
    +_297.hide();
    +_298.hide();
    +if(opts.toolPosition=="left"){
    +tool.css({left:0,right:""});
    +wrap.css({marginLeft:tool._outerWidth(),marginRight:0,width:_29a});
    +}else{
    +tool.css({left:"",right:0});
    +wrap.css({marginLeft:0,marginRight:tool._outerWidth(),width:_29a});
    +}
    +}
    +};
    +function _29b(_29c){
    +var opts=$.data(_29c,"tabs").options;
    +var _29d=$(_29c).children("div.tabs-header");
    +if(opts.tools){
    +if(typeof opts.tools=="string"){
    +$(opts.tools).addClass("tabs-tool").appendTo(_29d);
    +$(opts.tools).show();
    +}else{
    +_29d.children("div.tabs-tool").remove();
    +var _29e=$("<div class=\"tabs-tool\"></div>").appendTo(_29d);
    +for(var i=0;i<opts.tools.length;i++){
    +var tool=$("<a href=\"javascript:void(0);\"></a>").appendTo(_29e);
    +tool[0].onclick=eval(opts.tools[i].handler||function(){
    +});
    +tool.linkbutton($.extend({},opts.tools[i],{plain:true}));
    +}
    +}
    +}else{
    +_29d.children("div.tabs-tool").remove();
    +}
    +};
    +function _29f(_2a0){
    +var opts=$.data(_2a0,"tabs").options;
    +var cc=$(_2a0);
    +opts.fit?$.extend(opts,cc._fit()):cc._fit(false);
    +cc.width(opts.width).height(opts.height);
    +var _2a1=$(_2a0).children("div.tabs-header");
    +var _2a2=$(_2a0).children("div.tabs-panels");
    +if(opts.tabPosition=="left"||opts.tabPosition=="right"){
    +_2a1._outerWidth(opts.headerWidth);
    +_2a2._outerWidth(cc.width()-opts.headerWidth);
    +_2a1.add(_2a2)._outerHeight(opts.height);
    +var wrap=_2a1.find("div.tabs-wrap");
    +wrap._outerWidth(_2a1.width());
    +_2a1.find(".tabs")._outerWidth(wrap.width());
    +}else{
    +_2a1.css("height","");
    +_2a1.find("div.tabs-wrap").css("width","");
    +_2a1.find(".tabs").css("width","");
    +_2a1._outerWidth(opts.width);
    +_294(_2a0);
    +var _2a3=opts.height;
    +if(!isNaN(_2a3)){
    +_2a2._outerHeight(_2a3-_2a1.outerHeight());
    +}else{
    +_2a2.height("auto");
    +}
    +var _2a4=opts.width;
    +if(!isNaN(_2a4)){
    +_2a2._outerWidth(_2a4);
    +}else{
    +_2a2.width("auto");
    +}
    +}
    +};
    +function _2a5(_2a6){
    +var opts=$.data(_2a6,"tabs").options;
    +var tab=_2a7(_2a6);
    +if(tab){
    +var _2a8=$(_2a6).children("div.tabs-panels");
    +var _2a9=opts.width=="auto"?"auto":_2a8.width();
    +var _2aa=opts.height=="auto"?"auto":_2a8.height();
    +tab.panel("resize",{width:_2a9,height:_2aa});
    +}
    +};
    +function _2ab(_2ac){
    +var tabs=$.data(_2ac,"tabs").tabs;
    +var cc=$(_2ac);
    +cc.addClass("tabs-container");
    +cc.wrapInner("<div class=\"tabs-panels\"/>");
    +$("<div class=\"tabs-header\">"+"<div class=\"tabs-scroller-left\"></div>"+"<div class=\"tabs-scroller-right\"></div>"+"<div class=\"tabs-wrap\">"+"<ul class=\"tabs\"></ul>"+"</div>"+"</div>").prependTo(_2ac);
    +cc.children("div.tabs-panels").children("div").each(function(i){
    +var opts=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)});
    +var pp=$(this);
    +tabs.push(pp);
    +_2b2(_2ac,pp,opts);
    +});
    +cc.children("div.tabs-header").find(".tabs-scroller-left, .tabs-scroller-right").hover(function(){
    +$(this).addClass("tabs-scroller-over");
    +},function(){
    +$(this).removeClass("tabs-scroller-over");
    +});
    +cc.bind("_resize",function(e,_2ad){
    +var opts=$.data(_2ac,"tabs").options;
    +if(opts.fit==true||_2ad){
    +_29f(_2ac);
    +_2a5(_2ac);
    +}
    +return false;
    +});
    +};
    +function _2ae(_2af){
    +var opts=$.data(_2af,"tabs").options;
    +var _2b0=$(_2af).children("div.tabs-header");
    +var _2b1=$(_2af).children("div.tabs-panels");
    +_2b0.removeClass("tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right");
    +_2b1.removeClass("tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right");
    +if(opts.tabPosition=="top"){
    +_2b0.insertBefore(_2b1);
    +}else{
    +if(opts.tabPosition=="bottom"){
    +_2b0.insertAfter(_2b1);
    +_2b0.addClass("tabs-header-bottom");
    +_2b1.addClass("tabs-panels-top");
    +}else{
    +if(opts.tabPosition=="left"){
    +_2b0.addClass("tabs-header-left");
    +_2b1.addClass("tabs-panels-right");
    +}else{
    +if(opts.tabPosition=="right"){
    +_2b0.addClass("tabs-header-right");
    +_2b1.addClass("tabs-panels-left");
    +}
    +}
    +}
    +}
    +if(opts.plain==true){
    +_2b0.addClass("tabs-header-plain");
    +}else{
    +_2b0.removeClass("tabs-header-plain");
    +}
    +if(opts.border==true){
    +_2b0.removeClass("tabs-header-noborder");
    +_2b1.removeClass("tabs-panels-noborder");
    +}else{
    +_2b0.addClass("tabs-header-noborder");
    +_2b1.addClass("tabs-panels-noborder");
    +}
    +$(".tabs-scroller-left",_2b0).unbind(".tabs").bind("click.tabs",function(){
    +$(_2af).tabs("scrollBy",-opts.scrollIncrement);
    +});
    +$(".tabs-scroller-right",_2b0).unbind(".tabs").bind("click.tabs",function(){
    +$(_2af).tabs("scrollBy",opts.scrollIncrement);
    +});
    +};
    +function _2b2(_2b3,pp,_2b4){
    +var _2b5=$.data(_2b3,"tabs");
    +_2b4=_2b4||{};
    +pp.panel($.extend({},_2b4,{border:false,noheader:true,closed:true,doSize:false,iconCls:(_2b4.icon?_2b4.icon:undefined),onLoad:function(){
    +if(_2b4.onLoad){
    +_2b4.onLoad.call(this,arguments);
    +}
    +_2b5.options.onLoad.call(_2b3,$(this));
    +}}));
    +var opts=pp.panel("options");
    +var tabs=$(_2b3).children("div.tabs-header").find("ul.tabs");
    +opts.tab=$("<li></li>").appendTo(tabs);
    +opts.tab.append("<a href=\"javascript:void(0)\" class=\"tabs-inner\">"+"<span class=\"tabs-title\"></span>"+"<span class=\"tabs-icon\"></span>"+"</a>");
    +opts.tab.unbind(".tabs").bind("click.tabs",{p:pp},function(e){
    +if($(this).hasClass("tabs-disabled")){
    +return;
    +}
    +_2ba(_2b3,_2b6(_2b3,e.data.p));
    +}).bind("contextmenu.tabs",{p:pp},function(e){
    +if($(this).hasClass("tabs-disabled")){
    +return;
    +}
    +_2b5.options.onContextMenu.call(_2b3,e,$(this).find("span.tabs-title").html(),_2b6(_2b3,e.data.p));
    +});
    +$(_2b3).tabs("update",{tab:pp,options:opts});
    +};
    +function _2b7(_2b8,_2b9){
    +var opts=$.data(_2b8,"tabs").options;
    +var tabs=$.data(_2b8,"tabs").tabs;
    +if(_2b9.selected==undefined){
    +_2b9.selected=true;
    +}
    +var pp=$("<div></div>").appendTo($(_2b8).children("div.tabs-panels"));
    +tabs.push(pp);
    +_2b2(_2b8,pp,_2b9);
    +opts.onAdd.call(_2b8,_2b9.title,tabs.length-1);
    +_294(_2b8);
    +if(_2b9.selected){
    +_2ba(_2b8,tabs.length-1);
    +}
    +};
    +function _2bb(_2bc,_2bd){
    +var _2be=$.data(_2bc,"tabs").selectHis;
    +var pp=_2bd.tab;
    +var _2bf=pp.panel("options").title;
    +pp.panel($.extend({},_2bd.options,{iconCls:(_2bd.options.icon?_2bd.options.icon:undefined)}));
    +var opts=pp.panel("options");
    +var tab=opts.tab;
    +var _2c0=tab.find("span.tabs-title");
    +var _2c1=tab.find("span.tabs-icon");
    +_2c0.html(opts.title);
    +_2c1.attr("class","tabs-icon");
    +tab.find("a.tabs-close").remove();
    +if(opts.closable){
    +_2c0.addClass("tabs-closable");
    +var _2c2=$("<a href=\"javascript:void(0)\" class=\"tabs-close\"></a>").appendTo(tab);
    +_2c2.bind("click.tabs",{p:pp},function(e){
    +if($(this).parent().hasClass("tabs-disabled")){
    +return;
    +}
    +_2c4(_2bc,_2b6(_2bc,e.data.p));
    +return false;
    +});
    +}else{
    +_2c0.removeClass("tabs-closable");
    +}
    +if(opts.iconCls){
    +_2c0.addClass("tabs-with-icon");
    +_2c1.addClass(opts.iconCls);
    +}else{
    +_2c0.removeClass("tabs-with-icon");
    +}
    +if(_2bf!=opts.title){
    +for(var i=0;i<_2be.length;i++){
    +if(_2be[i]==_2bf){
    +_2be[i]=opts.title;
    +}
    +}
    +}
    +tab.find("span.tabs-p-tool").remove();
    +if(opts.tools){
    +var _2c3=$("<span class=\"tabs-p-tool\"></span>").insertAfter(tab.find("a.tabs-inner"));
    +if(typeof opts.tools=="string"){
    +$(opts.tools).children().appendTo(_2c3);
    +}else{
    +for(var i=0;i<opts.tools.length;i++){
    +var t=$("<a href=\"javascript:void(0)\"></a>").appendTo(_2c3);
    +t.addClass(opts.tools[i].iconCls);
    +if(opts.tools[i].handler){
    +t.bind("click",{handler:opts.tools[i].handler},function(e){
    +if($(this).parents("li").hasClass("tabs-disabled")){
    +return;
    +}
    +e.data.handler.call(this);
    +});
    +}
    +}
    +}
    +var pr=_2c3.children().length*12;
    +if(opts.closable){
    +pr+=8;
    +}else{
    +pr-=3;
    +_2c3.css("right","5px");
    +}
    +_2c0.css("padding-right",pr+"px");
    +}
    +_294(_2bc);
    +$.data(_2bc,"tabs").options.onUpdate.call(_2bc,opts.title,_2b6(_2bc,pp));
    +};
    +function _2c4(_2c5,_2c6){
    +var opts=$.data(_2c5,"tabs").options;
    +var tabs=$.data(_2c5,"tabs").tabs;
    +var _2c7=$.data(_2c5,"tabs").selectHis;
    +if(!_2c8(_2c5,_2c6)){
    +return;
    +}
    +var tab=_2c9(_2c5,_2c6);
    +var _2ca=tab.panel("options").title;
    +var _2cb=_2b6(_2c5,tab);
    +if(opts.onBeforeClose.call(_2c5,_2ca,_2cb)==false){
    +return;
    +}
    +var tab=_2c9(_2c5,_2c6,true);
    +tab.panel("options").tab.remove();
    +tab.panel("destroy");
    +opts.onClose.call(_2c5,_2ca,_2cb);
    +_294(_2c5);
    +for(var i=0;i<_2c7.length;i++){
    +if(_2c7[i]==_2ca){
    +_2c7.splice(i,1);
    +i--;
    +}
    +}
    +var _2cc=_2c7.pop();
    +if(_2cc){
    +_2ba(_2c5,_2cc);
    +}else{
    +if(tabs.length){
    +_2ba(_2c5,0);
    +}
    +}
    +};
    +function _2c9(_2cd,_2ce,_2cf){
    +var tabs=$.data(_2cd,"tabs").tabs;
    +if(typeof _2ce=="number"){
    +if(_2ce<0||_2ce>=tabs.length){
    +return null;
    +}else{
    +var tab=tabs[_2ce];
    +if(_2cf){
    +tabs.splice(_2ce,1);
    +}
    +return tab;
    +}
    +}
    +for(var i=0;i<tabs.length;i++){
    +var tab=tabs[i];
    +if(tab.panel("options").title==_2ce){
    +if(_2cf){
    +tabs.splice(i,1);
    +}
    +return tab;
    +}
    +}
    +return null;
    +};
    +function _2b6(_2d0,tab){
    +var tabs=$.data(_2d0,"tabs").tabs;
    +for(var i=0;i<tabs.length;i++){
    +if(tabs[i][0]==$(tab)[0]){
    +return i;
    +}
    +}
    +return -1;
    +};
    +function _2a7(_2d1){
    +var tabs=$.data(_2d1,"tabs").tabs;
    +for(var i=0;i<tabs.length;i++){
    +var tab=tabs[i];
    +if(tab.panel("options").closed==false){
    +return tab;
    +}
    +}
    +return null;
    +};
    +function _2d2(_2d3){
    +var tabs=$.data(_2d3,"tabs").tabs;
    +for(var i=0;i<tabs.length;i++){
    +if(tabs[i].panel("options").selected){
    +_2ba(_2d3,i);
    +return;
    +}
    +}
    +if(tabs.length){
    +_2ba(_2d3,0);
    +}
    +};
    +function _2ba(_2d4,_2d5){
    +var opts=$.data(_2d4,"tabs").options;
    +var tabs=$.data(_2d4,"tabs").tabs;
    +var _2d6=$.data(_2d4,"tabs").selectHis;
    +if(tabs.length==0){
    +return;
    +}
    +var _2d7=_2c9(_2d4,_2d5);
    +if(!_2d7){
    +return;
    +}
    +var _2d8=_2a7(_2d4);
    +if(_2d8){
    +_2d8.panel("close");
    +_2d8.panel("options").tab.removeClass("tabs-selected");
    +}
    +_2d7.panel("open");
    +var _2d9=_2d7.panel("options").title;
    +_2d6.push(_2d9);
    +var tab=_2d7.panel("options").tab;
    +tab.addClass("tabs-selected");
    +var wrap=$(_2d4).find(">div.tabs-header>div.tabs-wrap");
    +var left=tab.position().left;
    +var _2da=left+tab.outerWidth();
    +if(left<0||_2da>wrap.width()){
    +var _2db=left-(wrap.width()-tab.width())/2;
    +$(_2d4).tabs("scrollBy",_2db);
    +}else{
    +$(_2d4).tabs("scrollBy",0);
    +}
    +_2a5(_2d4);
    +opts.onSelect.call(_2d4,_2d9,_2b6(_2d4,_2d7));
    +};
    +function _2c8(_2dc,_2dd){
    +return _2c9(_2dc,_2dd)!=null;
    +};
    +$.fn.tabs=function(_2de,_2df){
    +if(typeof _2de=="string"){
    +return $.fn.tabs.methods[_2de](this,_2df);
    +}
    +_2de=_2de||{};
    +return this.each(function(){
    +var _2e0=$.data(this,"tabs");
    +var opts;
    +if(_2e0){
    +opts=$.extend(_2e0.options,_2de);
    +_2e0.options=opts;
    +}else{
    +$.data(this,"tabs",{options:$.extend({},$.fn.tabs.defaults,$.fn.tabs.parseOptions(this),_2de),tabs:[],selectHis:[]});
    +_2ab(this);
    +}
    +_29b(this);
    +_2ae(this);
    +_29f(this);
    +_2d2(this);
    +});
    +};
    +$.fn.tabs.methods={options:function(jq){
    +return $.data(jq[0],"tabs").options;
    +},tabs:function(jq){
    +return $.data(jq[0],"tabs").tabs;
    +},resize:function(jq){
    +return jq.each(function(){
    +_29f(this);
    +_2a5(this);
    +});
    +},add:function(jq,_2e1){
    +return jq.each(function(){
    +_2b7(this,_2e1);
    +});
    +},close:function(jq,_2e2){
    +return jq.each(function(){
    +_2c4(this,_2e2);
    +});
    +},getTab:function(jq,_2e3){
    +return _2c9(jq[0],_2e3);
    +},getTabIndex:function(jq,tab){
    +return _2b6(jq[0],tab);
    +},getSelected:function(jq){
    +return _2a7(jq[0]);
    +},select:function(jq,_2e4){
    +return jq.each(function(){
    +_2ba(this,_2e4);
    +});
    +},exists:function(jq,_2e5){
    +return _2c8(jq[0],_2e5);
    +},update:function(jq,_2e6){
    +return jq.each(function(){
    +_2bb(this,_2e6);
    +});
    +},enableTab:function(jq,_2e7){
    +return jq.each(function(){
    +$(this).tabs("getTab",_2e7).panel("options").tab.removeClass("tabs-disabled");
    +});
    +},disableTab:function(jq,_2e8){
    +return jq.each(function(){
    +$(this).tabs("getTab",_2e8).panel("options").tab.addClass("tabs-disabled");
    +});
    +},scrollBy:function(jq,_2e9){
    +return jq.each(function(){
    +var opts=$(this).tabs("options");
    +var wrap=$(this).find(">div.tabs-header>div.tabs-wrap");
    +var pos=Math.min(wrap._scrollLeft()+_2e9,_2ea());
    +wrap.animate({scrollLeft:pos},opts.scrollDuration);
    +function _2ea(){
    +var w=0;
    +var ul=wrap.children("ul");
    +ul.children("li").each(function(){
    +w+=$(this).outerWidth(true);
    +});
    +return w-wrap.width()+(ul.outerWidth()-ul.width());
    +};
    +});
    +}};
    +$.fn.tabs.parseOptions=function(_2eb){
    +return $.extend({},$.parser.parseOptions(_2eb,["width","height","tools","toolPosition","tabPosition",{fit:"boolean",border:"boolean",plain:"boolean",headerWidth:"number"}]));
    +};
    +$.fn.tabs.defaults={width:"auto",height:"auto",headerWidth:150,plain:false,fit:false,border:true,tools:null,toolPosition:"right",tabPosition:"top",scrollIncrement:100,scrollDuration:400,onLoad:function(_2ec){
    +},onSelect:function(_2ed,_2ee){
    +},onBeforeClose:function(_2ef,_2f0){
    +},onClose:function(_2f1,_2f2){
    +},onAdd:function(_2f3,_2f4){
    +},onUpdate:function(_2f5,_2f6){
    +},onContextMenu:function(e,_2f7,_2f8){
    +}};
    +})(jQuery);
    +(function($){
    +var _2f9=false;
    +function _2fa(_2fb){
    +var opts=$.data(_2fb,"layout").options;
    +var _2fc=$.data(_2fb,"layout").panels;
    +var cc=$(_2fb);
    +opts.fit?cc.css(cc._fit()):cc._fit(false);
    +var cpos={top:0,left:0,width:cc.width(),height:cc.height()};
    +function _2fd(pp){
    +if(pp.length==0){
    +return;
    +}
    +pp.panel("resize",{width:cc.width(),height:pp.panel("options").height,left:0,top:0});
    +cpos.top+=pp.panel("options").height;
    +cpos.height-=pp.panel("options").height;
    +};
    +if(_301(_2fc.expandNorth)){
    +_2fd(_2fc.expandNorth);
    +}else{
    +_2fd(_2fc.north);
    +}
    +function _2fe(pp){
    +if(pp.length==0){
    +return;
    +}
    +pp.panel("resize",{width:cc.width(),height:pp.panel("options").height,left:0,top:cc.height()-pp.panel("options").height});
    +cpos.height-=pp.panel("options").height;
    +};
    +if(_301(_2fc.expandSouth)){
    +_2fe(_2fc.expandSouth);
    +}else{
    +_2fe(_2fc.south);
    +}
    +function _2ff(pp){
    +if(pp.length==0){
    +return;
    +}
    +pp.panel("resize",{width:pp.panel("options").width,height:cpos.height,left:cc.width()-pp.panel("options").width,top:cpos.top});
    +cpos.width-=pp.panel("options").width;
    +};
    +if(_301(_2fc.expandEast)){
    +_2ff(_2fc.expandEast);
    +}else{
    +_2ff(_2fc.east);
    +}
    +function _300(pp){
    +if(pp.length==0){
    +return;
    +}
    +pp.panel("resize",{width:pp.panel("options").width,height:cpos.height,left:0,top:cpos.top});
    +cpos.left+=pp.panel("options").width;
    +cpos.width-=pp.panel("options").width;
    +};
    +if(_301(_2fc.expandWest)){
    +_300(_2fc.expandWest);
    +}else{
    +_300(_2fc.west);
    +}
    +_2fc.center.panel("resize",cpos);
    +};
    +function init(_302){
    +var cc=$(_302);
    +if(cc[0].tagName=="BODY"){
    +$("html").addClass("panel-fit");
    +}
    +cc.addClass("layout");
    +function _303(cc){
    +cc.children("div").each(function(){
    +var opts=$.parser.parseOptions(this,["region"]);
    +var r=opts.region;
    +if(r=="north"||r=="south"||r=="east"||r=="west"||r=="center"){
    +_305(_302,{region:r},this);
    +}
    +});
    +};
    +cc.children("form").length?_303(cc.children("form")):_303(cc);
    +$("<div class=\"layout-split-proxy-h\"></div>").appendTo(cc);
    +$("<div class=\"layout-split-proxy-v\"></div>").appendTo(cc);
    +cc.bind("_resize",function(e,_304){
    +var opts=$.data(_302,"layout").options;
    +if(opts.fit==true||_304){
    +_2fa(_302);
    +}
    +return false;
    +});
    +};
    +function _305(_306,_307,el){
    +_307.region=_307.region||"center";
    +var _308=$.data(_306,"layout").panels;
    +var cc=$(_306);
    +var dir=_307.region;
    +if(_308[dir].length){
    +return;
    +}
    +var pp=$(el);
    +if(!pp.length){
    +pp=$("<div></div>").appendTo(cc);
    +}
    +pp.panel($.extend({},{width:(pp.length?parseInt(pp[0].style.width)||pp.outerWidth():"auto"),height:(pp.length?parseInt(pp[0].style.height)||pp.outerHeight():"auto"),split:(pp.attr("split")?pp.attr("split")=="true":undefined),doSize:false,cls:("layout-panel layout-panel-"+dir),bodyCls:"layout-body",onOpen:function(){
    +var _309={north:"up",south:"down",east:"right",west:"left"};
    +if(!_309[dir]){
    +return;
    +}
    +var _30a="layout-button-"+_309[dir];
    +var tool=$(this).panel("header").children("div.panel-tool");
    +if(!tool.children("a."+_30a).length){
    +var t=$("<a href=\"javascript:void(0)\"></a>").addClass(_30a).appendTo(tool);
    +t.bind("click",{dir:dir},function(e){
    +_316(_306,e.data.dir);
    +return false;
    +});
    +}
    +}},_307));
    +_308[dir]=pp;
    +if(pp.panel("options").split){
    +var _30b=pp.panel("panel");
    +_30b.addClass("layout-split-"+dir);
    +var _30c="";
    +if(dir=="north"){
    +_30c="s";
    +}
    +if(dir=="south"){
    +_30c="n";
    +}
    +if(dir=="east"){
    +_30c="w";
    +}
    +if(dir=="west"){
    +_30c="e";
    +}
    +_30b.resizable({handles:_30c,onStartResize:function(e){
    +_2f9=true;
    +if(dir=="north"||dir=="south"){
    +var _30d=$(">div.layout-split-proxy-v",_306);
    +}else{
    +var _30d=$(">div.layout-split-proxy-h",_306);
    +}
    +var top=0,left=0,_30e=0,_30f=0;
    +var pos={display:"block"};
    +if(dir=="north"){
    +pos.top=parseInt(_30b.css("top"))+_30b.outerHeight()-_30d.height();
    +pos.left=parseInt(_30b.css("left"));
    +pos.width=_30b.outerWidth();
    +pos.height=_30d.height();
    +}else{
    +if(dir=="south"){
    +pos.top=parseInt(_30b.css("top"));
    +pos.left=parseInt(_30b.css("left"));
    +pos.width=_30b.outerWidth();
    +pos.height=_30d.height();
    +}else{
    +if(dir=="east"){
    +pos.top=parseInt(_30b.css("top"))||0;
    +pos.left=parseInt(_30b.css("left"))||0;
    +pos.width=_30d.width();
    +pos.height=_30b.outerHeight();
    +}else{
    +if(dir=="west"){
    +pos.top=parseInt(_30b.css("top"))||0;
    +pos.left=_30b.outerWidth()-_30d.width();
    +pos.width=_30d.width();
    +pos.height=_30b.outerHeight();
    +}
    +}
    +}
    +}
    +_30d.css(pos);
    +$("<div class=\"layout-mask\"></div>").css({left:0,top:0,width:cc.width(),height:cc.height()}).appendTo(cc);
    +},onResize:function(e){
    +if(dir=="north"||dir=="south"){
    +var _310=$(">div.layout-split-proxy-v",_306);
    +_310.css("top",e.pageY-$(_306).offset().top-_310.height()/2);
    +}else{
    +var _310=$(">div.layout-split-proxy-h",_306);
    +_310.css("left",e.pageX-$(_306).offset().left-_310.width()/2);
    +}
    +return false;
    +},onStopResize:function(){
    +$(">div.layout-split-proxy-v",_306).css("display","none");
    +$(">div.layout-split-proxy-h",_306).css("display","none");
    +var opts=pp.panel("options");
    +opts.width=_30b.outerWidth();
    +opts.height=_30b.outerHeight();
    +opts.left=_30b.css("left");
    +opts.top=_30b.css("top");
    +pp.panel("resize");
    +_2fa(_306);
    +_2f9=false;
    +cc.find(">div.layout-mask").remove();
    +}});
    +}
    +};
    +function _311(_312,_313){
    +var _314=$.data(_312,"layout").panels;
    +if(_314[_313].length){
    +_314[_313].panel("destroy");
    +_314[_313]=$();
    +var _315="expand"+_313.substring(0,1).toUpperCase()+_313.substring(1);
    +if(_314[_315]){
    +_314[_315].panel("destroy");
    +_314[_315]=undefined;
    +}
    +}
    +};
    +function _316(_317,_318,_319){
    +if(_319==undefined){
    +_319="normal";
    +}
    +var _31a=$.data(_317,"layout").panels;
    +var p=_31a[_318];
    +if(p.panel("options").onBeforeCollapse.call(p)==false){
    +return;
    +}
    +var _31b="expand"+_318.substring(0,1).toUpperCase()+_318.substring(1);
    +if(!_31a[_31b]){
    +_31a[_31b]=_31c(_318);
    +_31a[_31b].panel("panel").click(function(){
    +var _31d=_31e();
    +p.panel("expand",false).panel("open").panel("resize",_31d.collapse);
    +p.panel("panel").animate(_31d.expand);
    +return false;
    +});
    +}
    +var _31f=_31e();
    +if(!_301(_31a[_31b])){
    +_31a.center.panel("resize",_31f.resizeC);
    +}
    +p.panel("panel").animate(_31f.collapse,_319,function(){
    +p.panel("collapse",false).panel("close");
    +_31a[_31b].panel("open").panel("resize",_31f.expandP);
    +});
    +function _31c(dir){
    +var icon;
    +if(dir=="east"){
    +icon="layout-button-left";
    +}else{
    +if(dir=="west"){
    +icon="layout-button-right";
    +}else{
    +if(dir=="north"){
    +icon="layout-button-down";
    +}else{
    +if(dir=="south"){
    +icon="layout-button-up";
    +}
    +}
    +}
    +}
    +var p=$("<div></div>").appendTo(_317).panel({cls:"layout-expand",title:"&nbsp;",closed:true,doSize:false,tools:[{iconCls:icon,handler:function(){
    +_320(_317,_318);
    +return false;
    +}}]});
    +p.panel("panel").hover(function(){
    +$(this).addClass("layout-expand-over");
    +},function(){
    +$(this).removeClass("layout-expand-over");
    +});
    +return p;
    +};
    +function _31e(){
    +var cc=$(_317);
    +if(_318=="east"){
    +return {resizeC:{width:_31a.center.panel("options").width+_31a["east"].panel("options").width-28},expand:{left:cc.width()-_31a["east"].panel("options").width},expandP:{top:_31a["east"].panel("options").top,left:cc.width()-28,width:28,height:_31a["center"].panel("options").height},collapse:{left:cc.width()}};
    +}else{
    +if(_318=="west"){
    +return {resizeC:{width:_31a.center.panel("options").width+_31a["west"].panel("options").width-28,left:28},expand:{left:0},expandP:{left:0,top:_31a["west"].panel("options").top,width:28,height:_31a["center"].panel("options").height},collapse:{left:-_31a["west"].panel("options").width}};
    +}else{
    +if(_318=="north"){
    +var hh=cc.height()-28;
    +if(_301(_31a.expandSouth)){
    +hh-=_31a.expandSouth.panel("options").height;
    +}else{
    +if(_301(_31a.south)){
    +hh-=_31a.south.panel("options").height;
    +}
    +}
    +_31a.east.panel("resize",{top:28,height:hh});
    +_31a.west.panel("resize",{top:28,height:hh});
    +if(_301(_31a.expandEast)){
    +_31a.expandEast.panel("resize",{top:28,height:hh});
    +}
    +if(_301(_31a.expandWest)){
    +_31a.expandWest.panel("resize",{top:28,height:hh});
    +}
    +return {resizeC:{top:28,height:hh},expand:{top:0},expandP:{top:0,left:0,width:cc.width(),height:28},collapse:{top:-_31a["north"].panel("options").height}};
    +}else{
    +if(_318=="south"){
    +var hh=cc.height()-28;
    +if(_301(_31a.expandNorth)){
    +hh-=_31a.expandNorth.panel("options").height;
    +}else{
    +if(_301(_31a.north)){
    +hh-=_31a.north.panel("options").height;
    +}
    +}
    +_31a.east.panel("resize",{height:hh});
    +_31a.west.panel("resize",{height:hh});
    +if(_301(_31a.expandEast)){
    +_31a.expandEast.panel("resize",{height:hh});
    +}
    +if(_301(_31a.expandWest)){
    +_31a.expandWest.panel("resize",{height:hh});
    +}
    +return {resizeC:{height:hh},expand:{top:cc.height()-_31a["south"].panel("options").height},expandP:{top:cc.height()-28,left:0,width:cc.width(),height:28},collapse:{top:cc.height()}};
    +}
    +}
    +}
    +}
    +};
    +};
    +function _320(_321,_322){
    +var _323=$.data(_321,"layout").panels;
    +var _324=_325();
    +var p=_323[_322];
    +if(p.panel("options").onBeforeExpand.call(p)==false){
    +return;
    +}
    +var _326="expand"+_322.substring(0,1).toUpperCase()+_322.substring(1);
    +_323[_326].panel("close");
    +p.panel("panel").stop(true,true);
    +p.panel("expand",false).panel("open").panel("resize",_324.collapse);
    +p.panel("panel").animate(_324.expand,function(){
    +_2fa(_321);
    +});
    +function _325(){
    +var cc=$(_321);
    +if(_322=="east"&&_323.expandEast){
    +return {collapse:{left:cc.width()},expand:{left:cc.width()-_323["east"].panel("options").width}};
    +}else{
    +if(_322=="west"&&_323.expandWest){
    +return {collapse:{left:-_323["west"].panel("options").width},expand:{left:0}};
    +}else{
    +if(_322=="north"&&_323.expandNorth){
    +return {collapse:{top:-_323["north"].panel("options").height},expand:{top:0}};
    +}else{
    +if(_322=="south"&&_323.expandSouth){
    +return {collapse:{top:cc.height()},expand:{top:cc.height()-_323["south"].panel("options").height}};
    +}
    +}
    +}
    +}
    +};
    +};
    +function _327(_328){
    +var _329=$.data(_328,"layout").panels;
    +var cc=$(_328);
    +if(_329.east.length){
    +_329.east.panel("panel").bind("mouseover","east",_32a);
    +}
    +if(_329.west.length){
    +_329.west.panel("panel").bind("mouseover","west",_32a);
    +}
    +if(_329.north.length){
    +_329.north.panel("panel").bind("mouseover","north",_32a);
    +}
    +if(_329.south.length){
    +_329.south.panel("panel").bind("mouseover","south",_32a);
    +}
    +_329.center.panel("panel").bind("mouseover","center",_32a);
    +function _32a(e){
    +if(_2f9==true){
    +return;
    +}
    +if(e.data!="east"&&_301(_329.east)&&_301(_329.expandEast)){
    +_316(_328,"east");
    +}
    +if(e.data!="west"&&_301(_329.west)&&_301(_329.expandWest)){
    +_316(_328,"west");
    +}
    +if(e.data!="north"&&_301(_329.north)&&_301(_329.expandNorth)){
    +_316(_328,"north");
    +}
    +if(e.data!="south"&&_301(_329.south)&&_301(_329.expandSouth)){
    +_316(_328,"south");
    +}
    +return false;
    +};
    +};
    +function _301(pp){
    +if(!pp){
    +return false;
    +}
    +if(pp.length){
    +return pp.panel("panel").is(":visible");
    +}else{
    +return false;
    +}
    +};
    +function _32b(_32c){
    +var _32d=$.data(_32c,"layout").panels;
    +if(_32d.east.length&&_32d.east.panel("options").collapsed){
    +_316(_32c,"east",0);
    +}
    +if(_32d.west.length&&_32d.west.panel("options").collapsed){
    +_316(_32c,"west",0);
    +}
    +if(_32d.north.length&&_32d.north.panel("options").collapsed){
    +_316(_32c,"north",0);
    +}
    +if(_32d.south.length&&_32d.south.panel("options").collapsed){
    +_316(_32c,"south",0);
    +}
    +};
    +$.fn.layout=function(_32e,_32f){
    +if(typeof _32e=="string"){
    +return $.fn.layout.methods[_32e](this,_32f);
    +}
    +_32e=_32e||{};
    +return this.each(function(){
    +var _330=$.data(this,"layout");
    +if(_330){
    +$.extend(_330.options,_32e);
    +}else{
    +var opts=$.extend({},$.fn.layout.defaults,$.fn.layout.parseOptions(this),_32e);
    +$.data(this,"layout",{options:opts,panels:{center:$(),north:$(),south:$(),east:$(),west:$()}});
    +init(this);
    +_327(this);
    +}
    +_2fa(this);
    +_32b(this);
    +});
    +};
    +$.fn.layout.methods={resize:function(jq){
    +return jq.each(function(){
    +_2fa(this);
    +});
    +},panel:function(jq,_331){
    +return $.data(jq[0],"layout").panels[_331];
    +},collapse:function(jq,_332){
    +return jq.each(function(){
    +_316(this,_332);
    +});
    +},expand:function(jq,_333){
    +return jq.each(function(){
    +_320(this,_333);
    +});
    +},add:function(jq,_334){
    +return jq.each(function(){
    +_305(this,_334);
    +_2fa(this);
    +if($(this).layout("panel",_334.region).panel("options").collapsed){
    +_316(this,_334.region,0);
    +}
    +});
    +},remove:function(jq,_335){
    +return jq.each(function(){
    +_311(this,_335);
    +_2fa(this);
    +});
    +}};
    +$.fn.layout.parseOptions=function(_336){
    +return $.extend({},$.parser.parseOptions(_336,[{fit:"boolean"}]));
    +};
    +$.fn.layout.defaults={fit:false};
    +})(jQuery);
    +(function($){
    +function init(_337){
    +$(_337).appendTo("body");
    +$(_337).addClass("menu-top");
    +$(document).unbind(".menu").bind("mousedown.menu",function(e){
    +var _338=$("body>div.menu:visible");
    +var m=$(e.target).closest("div.menu",_338);
    +if(m.length){
    +return;
    +}
    +$("body>div.menu-top:visible").menu("hide");
    +});
    +var _339=_33a($(_337));
    +for(var i=0;i<_339.length;i++){
    +_33b(_339[i]);
    +}
    +function _33a(menu){
    +var _33c=[];
    +menu.addClass("menu");
    +if(!menu[0].style.width){
    +menu[0].autowidth=true;
    +}
    +_33c.push(menu);
    +if(!menu.hasClass("menu-content")){
    +menu.children("div").each(function(){
    +var _33d=$(this).children("div");
    +if(_33d.length){
    +_33d.insertAfter(_337);
    +this.submenu=_33d;
    +var mm=_33a(_33d);
    +_33c=_33c.concat(mm);
    +}
    +});
    +}
    +return _33c;
    +};
    +function _33b(menu){
    +if(!menu.hasClass("menu-content")){
    +menu.children("div").each(function(){
    +var item=$(this);
    +if(item.hasClass("menu-sep")){
    +}else{
    +var _33e=$.extend({},$.parser.parseOptions(this,["name","iconCls","href"]),{disabled:(item.attr("disabled")?true:undefined)});
    +item.attr("name",_33e.name||"").attr("href",_33e.href||"");
    +var text=item.addClass("menu-item").html();
    +item.empty().append($("<div class=\"menu-text\"></div>").html(text));
    +if(_33e.iconCls){
    +$("<div class=\"menu-icon\"></div>").addClass(_33e.iconCls).appendTo(item);
    +}
    +if(_33e.disabled){
    +_33f(_337,item[0],true);
    +}
    +if(item[0].submenu){
    +$("<div class=\"menu-rightarrow\"></div>").appendTo(item);
    +}
    +item._outerHeight(22);
    +_340(_337,item);
    +}
    +});
    +$("<div class=\"menu-line\"></div>").prependTo(menu);
    +}
    +_341(_337,menu);
    +menu.hide();
    +_342(_337,menu);
    +};
    +};
    +function _341(_343,menu){
    +var opts=$.data(_343,"menu").options;
    +var d=menu.css("display");
    +menu.css({display:"block",left:-10000});
    +var _344=menu._outerWidth();
    +var _345=0;
    +menu.find("div.menu-text").each(function(){
    +if(_345<$(this)._outerWidth()){
    +_345=$(this)._outerWidth();
    +}
    +});
    +_345+=65;
    +menu._outerWidth(Math.max(_344,_345,opts.minWidth));
    +menu.css("display",d);
    +};
    +function _342(_346,menu){
    +var _347=$.data(_346,"menu");
    +menu.unbind(".menu").bind("mouseenter.menu",function(){
    +if(_347.timer){
    +clearTimeout(_347.timer);
    +_347.timer=null;
    +}
    +}).bind("mouseleave.menu",function(){
    +_347.timer=setTimeout(function(){
    +_348(_346);
    +},100);
    +});
    +};
    +function _340(_349,item){
    +item.unbind(".menu");
    +item.bind("click.menu",function(){
    +if($(this).hasClass("menu-item-disabled")){
    +return;
    +}
    +if(!this.submenu){
    +_348(_349);
    +var href=$(this).attr("href");
    +if(href){
    +location.href=href;
    +}
    +}
    +var item=$(_349).menu("getItem",this);
    +$.data(_349,"menu").options.onClick.call(_349,item);
    +}).bind("mouseenter.menu",function(e){
    +item.siblings().each(function(){
    +if(this.submenu){
    +_34c(this.submenu);
    +}
    +$(this).removeClass("menu-active");
    +});
    +item.addClass("menu-active");
    +if($(this).hasClass("menu-item-disabled")){
    +item.addClass("menu-active-disabled");
    +return;
    +}
    +var _34a=item[0].submenu;
    +if(_34a){
    +$(_349).menu("show",{menu:_34a,parent:item});
    +}
    +}).bind("mouseleave.menu",function(e){
    +item.removeClass("menu-active menu-active-disabled");
    +var _34b=item[0].submenu;
    +if(_34b){
    +if(e.pageX>=parseInt(_34b.css("left"))){
    +item.addClass("menu-active");
    +}else{
    +_34c(_34b);
    +}
    +}else{
    +item.removeClass("menu-active");
    +}
    +});
    +};
    +function _348(_34d){
    +var _34e=$.data(_34d,"menu");
    +if(_34e){
    +if($(_34d).is(":visible")){
    +_34c($(_34d));
    +_34e.options.onHide.call(_34d);
    +}
    +}
    +return false;
    +};
    +function _34f(_350,_351){
    +var left,top;
    +var menu=$(_351.menu||_350);
    +if(menu.hasClass("menu-top")){
    +var opts=$.data(_350,"menu").options;
    +left=opts.left;
    +top=opts.top;
    +if(_351.alignTo){
    +var at=$(_351.alignTo);
    +left=at.offset().left;
    +top=at.offset().top+at._outerHeight();
    +}
    +if(_351.left!=undefined){
    +left=_351.left;
    +}
    +if(_351.top!=undefined){
    +top=_351.top;
    +}
    +if(left+menu.outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){
    +left=$(window)._outerWidth()+$(document).scrollLeft()-menu.outerWidth()-5;
    +}
    +if(top+menu.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){
    +top-=menu.outerHeight();
    +}
    +}else{
    +var _352=_351.parent;
    +left=_352.offset().left+_352.outerWidth()-2;
    +if(left+menu.outerWidth()+5>$(window)._outerWidth()+$(document).scrollLeft()){
    +left=_352.offset().left-menu.outerWidth()+2;
    +}
    +var top=_352.offset().top-3;
    +if(top+menu.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){
    +top=$(window)._outerHeight()+$(document).scrollTop()-menu.outerHeight()-5;
    +}
    +}
    +menu.css({left:left,top:top});
    +menu.show(0,function(){
    +if(!menu[0].shadow){
    +menu[0].shadow=$("<div class=\"menu-shadow\"></div>").insertAfter(menu);
    +}
    +menu[0].shadow.css({display:"block",zIndex:$.fn.menu.defaults.zIndex++,left:menu.css("left"),top:menu.css("top"),width:menu.outerWidth(),height:menu.outerHeight()});
    +menu.css("z-index",$.fn.menu.defaults.zIndex++);
    +if(menu.hasClass("menu-top")){
    +$.data(menu[0],"menu").options.onShow.call(menu[0]);
    +}
    +});
    +};
    +function _34c(menu){
    +if(!menu){
    +return;
    +}
    +_353(menu);
    +menu.find("div.menu-item").each(function(){
    +if(this.submenu){
    +_34c(this.submenu);
    +}
    +$(this).removeClass("menu-active");
    +});
    +function _353(m){
    +m.stop(true,true);
    +if(m[0].shadow){
    +m[0].shadow.hide();
    +}
    +m.hide();
    +};
    +};
    +function _354(_355,text){
    +var _356=null;
    +var tmp=$("<div></div>");
    +function find(menu){
    +menu.children("div.menu-item").each(function(){
    +var item=$(_355).menu("getItem",this);
    +var s=tmp.empty().html(item.text).text();
    +if(text==$.trim(s)){
    +_356=item;
    +}else{
    +if(this.submenu&&!_356){
    +find(this.submenu);
    +}
    +}
    +});
    +};
    +find($(_355));
    +tmp.remove();
    +return _356;
    +};
    +function _33f(_357,_358,_359){
    +var t=$(_358);
    +if(_359){
    +t.addClass("menu-item-disabled");
    +if(_358.onclick){
    +_358.onclick1=_358.onclick;
    +_358.onclick=null;
    +}
    +}else{
    +t.removeClass("menu-item-disabled");
    +if(_358.onclick1){
    +_358.onclick=_358.onclick1;
    +_358.onclick1=null;
    +}
    +}
    +};
    +function _35a(_35b,_35c){
    +var menu=$(_35b);
    +if(_35c.parent){
    +if(!_35c.parent.submenu){
    +var _35d=$("<div class=\"menu\"><div class=\"menu-line\"></div></div>").appendTo("body");
    +_35d[0].autowidth=true;
    +_35d.hide();
    +_35c.parent.submenu=_35d;
    +$("<div class=\"menu-rightarrow\"></div>").appendTo(_35c.parent);
    +}
    +menu=_35c.parent.submenu;
    +}
    +var item=$("<div class=\"menu-item\"></div>").appendTo(menu);
    +$("<div class=\"menu-text\"></div>").html(_35c.text).appendTo(item);
    +if(_35c.iconCls){
    +$("<div class=\"menu-icon\"></div>").addClass(_35c.iconCls).appendTo(item);
    +}
    +if(_35c.id){
    +item.attr("id",_35c.id);
    +}
    +if(_35c.href){
    +item.attr("href",_35c.href);
    +}
    +if(_35c.name){
    +item.attr("name",_35c.name);
    +}
    +if(_35c.onclick){
    +if(typeof _35c.onclick=="string"){
    +item.attr("onclick",_35c.onclick);
    +}else{
    +item[0].onclick=eval(_35c.onclick);
    +}
    +}
    +if(_35c.handler){
    +item[0].onclick=eval(_35c.handler);
    +}
    +_340(_35b,item);
    +if(_35c.disabled){
    +_33f(_35b,item[0],true);
    +}
    +_342(_35b,menu);
    +_341(_35b,menu);
    +};
    +function _35e(_35f,_360){
    +function _361(el){
    +if(el.submenu){
    +el.submenu.children("div.menu-item").each(function(){
    +_361(this);
    +});
    +var _362=el.submenu[0].shadow;
    +if(_362){
    +_362.remove();
    +}
    +el.submenu.remove();
    +}
    +$(el).remove();
    +};
    +_361(_360);
    +};
    +function _363(_364){
    +$(_364).children("div.menu-item").each(function(){
    +_35e(_364,this);
    +});
    +if(_364.shadow){
    +_364.shadow.remove();
    +}
    +$(_364).remove();
    +};
    +$.fn.menu=function(_365,_366){
    +if(typeof _365=="string"){
    +return $.fn.menu.methods[_365](this,_366);
    +}
    +_365=_365||{};
    +return this.each(function(){
    +var _367=$.data(this,"menu");
    +if(_367){
    +$.extend(_367.options,_365);
    +}else{
    +_367=$.data(this,"menu",{options:$.extend({},$.fn.menu.defaults,$.fn.menu.parseOptions(this),_365)});
    +init(this);
    +}
    +$(this).css({left:_367.options.left,top:_367.options.top});
    +});
    +};
    +$.fn.menu.methods={options:function(jq){
    +return $.data(jq[0],"menu").options;
    +},show:function(jq,pos){
    +return jq.each(function(){
    +_34f(this,pos);
    +});
    +},hide:function(jq){
    +return jq.each(function(){
    +_348(this);
    +});
    +},destroy:function(jq){
    +return jq.each(function(){
    +_363(this);
    +});
    +},setText:function(jq,_368){
    +return jq.each(function(){
    +$(_368.target).children("div.menu-text").html(_368.text);
    +});
    +},setIcon:function(jq,_369){
    +return jq.each(function(){
    +var item=$(this).menu("getItem",_369.target);
    +if(item.iconCls){
    +$(item.target).children("div.menu-icon").removeClass(item.iconCls).addClass(_369.iconCls);
    +}else{
    +$("<div class=\"menu-icon\"></div>").addClass(_369.iconCls).appendTo(_369.target);
    +}
    +});
    +},getItem:function(jq,_36a){
    +var t=$(_36a);
    +var item={target:_36a,id:t.attr("id"),text:$.trim(t.children("div.menu-text").html()),disabled:t.hasClass("menu-item-disabled"),href:t.attr("href"),name:t.attr("name"),onclick:_36a.onclick};
    +var icon=t.children("div.menu-icon");
    +if(icon.length){
    +var cc=[];
    +var aa=icon.attr("class").split(" ");
    +for(var i=0;i<aa.length;i++){
    +if(aa[i]!="menu-icon"){
    +cc.push(aa[i]);
    +}
    +}
    +item.iconCls=cc.join(" ");
    +}
    +return item;
    +},findItem:function(jq,text){
    +return _354(jq[0],text);
    +},appendItem:function(jq,_36b){
    +return jq.each(function(){
    +_35a(this,_36b);
    +});
    +},removeItem:function(jq,_36c){
    +return jq.each(function(){
    +_35e(this,_36c);
    +});
    +},enableItem:function(jq,_36d){
    +return jq.each(function(){
    +_33f(this,_36d,false);
    +});
    +},disableItem:function(jq,_36e){
    +return jq.each(function(){
    +_33f(this,_36e,true);
    +});
    +}};
    +$.fn.menu.parseOptions=function(_36f){
    +return $.extend({},$.parser.parseOptions(_36f,["left","top",{minWidth:"number"}]));
    +};
    +$.fn.menu.defaults={zIndex:110000,left:0,top:0,minWidth:120,onShow:function(){
    +},onHide:function(){
    +},onClick:function(item){
    +}};
    +})(jQuery);
    +(function($){
    +function init(_370){
    +var opts=$.data(_370,"menubutton").options;
    +var btn=$(_370);
    +btn.removeClass("m-btn-active m-btn-plain-active").addClass("m-btn");
    +btn.linkbutton($.extend({},opts,{text:opts.text+"<span class=\"m-btn-downarrow\">&nbsp;</span>"}));
    +if(opts.menu){
    +$(opts.menu).menu({onShow:function(){
    +btn.addClass((opts.plain==true)?"m-btn-plain-active":"m-btn-active");
    +},onHide:function(){
    +btn.removeClass((opts.plain==true)?"m-btn-plain-active":"m-btn-active");
    +}});
    +}
    +_371(_370,opts.disabled);
    +};
    +function _371(_372,_373){
    +var opts=$.data(_372,"menubutton").options;
    +opts.disabled=_373;
    +var btn=$(_372);
    +if(_373){
    +btn.linkbutton("disable");
    +btn.unbind(".menubutton");
    +}else{
    +btn.linkbutton("enable");
    +btn.unbind(".menubutton");
    +btn.bind("click.menubutton",function(){
    +_374();
    +return false;
    +});
    +var _375=null;
    +btn.bind("mouseenter.menubutton",function(){
    +_375=setTimeout(function(){
    +_374();
    +},opts.duration);
    +return false;
    +}).bind("mouseleave.menubutton",function(){
    +if(_375){
    +clearTimeout(_375);
    +}
    +});
    +}
    +function _374(){
    +if(!opts.menu){
    +return;
    +}
    +$("body>div.menu-top").menu("hide");
    +$(opts.menu).menu("show",{alignTo:btn});
    +btn.blur();
    +};
    +};
    +$.fn.menubutton=function(_376,_377){
    +if(typeof _376=="string"){
    +return $.fn.menubutton.methods[_376](this,_377);
    +}
    +_376=_376||{};
    +return this.each(function(){
    +var _378=$.data(this,"menubutton");
    +if(_378){
    +$.extend(_378.options,_376);
    +}else{
    +$.data(this,"menubutton",{options:$.extend({},$.fn.menubutton.defaults,$.fn.menubutton.parseOptions(this),_376)});
    +$(this).removeAttr("disabled");
    +}
    +init(this);
    +});
    +};
    +$.fn.menubutton.methods={options:function(jq){
    +return $.data(jq[0],"menubutton").options;
    +},enable:function(jq){
    +return jq.each(function(){
    +_371(this,false);
    +});
    +},disable:function(jq){
    +return jq.each(function(){
    +_371(this,true);
    +});
    +},destroy:function(jq){
    +return jq.each(function(){
    +var opts=$(this).menubutton("options");
    +if(opts.menu){
    +$(opts.menu).menu("destroy");
    +}
    +$(this).remove();
    +});
    +}};
    +$.fn.menubutton.parseOptions=function(_379){
    +var t=$(_379);
    +return $.extend({},$.fn.linkbutton.parseOptions(_379),$.parser.parseOptions(_379,["menu",{plain:"boolean",duration:"number"}]));
    +};
    +$.fn.menubutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,menu:null,duration:100});
    +})(jQuery);
    +(function($){
    +function init(_37a){
    +var opts=$.data(_37a,"splitbutton").options;
    +var btn=$(_37a);
    +btn.removeClass("s-btn-active s-btn-plain-active").addClass("s-btn");
    +btn.linkbutton($.extend({},opts,{text:opts.text+"<span class=\"s-btn-downarrow\">&nbsp;</span>"}));
    +if(opts.menu){
    +$(opts.menu).menu({onShow:function(){
    +btn.addClass((opts.plain==true)?"s-btn-plain-active":"s-btn-active");
    +},onHide:function(){
    +btn.removeClass((opts.plain==true)?"s-btn-plain-active":"s-btn-active");
    +}});
    +}
    +_37b(_37a,opts.disabled);
    +};
    +function _37b(_37c,_37d){
    +var opts=$.data(_37c,"splitbutton").options;
    +opts.disabled=_37d;
    +var btn=$(_37c);
    +var _37e=btn.find(".s-btn-downarrow");
    +if(_37d){
    +btn.linkbutton("disable");
    +_37e.unbind(".splitbutton");
    +}else{
    +btn.linkbutton("enable");
    +_37e.unbind(".splitbutton");
    +_37e.bind("click.splitbutton",function(){
    +_37f();
    +return false;
    +});
    +var _380=null;
    +_37e.bind("mouseenter.splitbutton",function(){
    +_380=setTimeout(function(){
    +_37f();
    +},opts.duration);
    +return false;
    +}).bind("mouseleave.splitbutton",function(){
    +if(_380){
    +clearTimeout(_380);
    +}
    +});
    +}
    +function _37f(){
    +if(!opts.menu){
    +return;
    +}
    +$("body>div.menu-top").menu("hide");
    +$(opts.menu).menu("show",{alignTo:btn});
    +btn.blur();
    +};
    +};
    +$.fn.splitbutton=function(_381,_382){
    +if(typeof _381=="string"){
    +return $.fn.splitbutton.methods[_381](this,_382);
    +}
    +_381=_381||{};
    +return this.each(function(){
    +var _383=$.data(this,"splitbutton");
    +if(_383){
    +$.extend(_383.options,_381);
    +}else{
    +$.data(this,"splitbutton",{options:$.extend({},$.fn.splitbutton.defaults,$.fn.splitbutton.parseOptions(this),_381)});
    +$(this).removeAttr("disabled");
    +}
    +init(this);
    +});
    +};
    +$.fn.splitbutton.methods={options:function(jq){
    +return $.data(jq[0],"splitbutton").options;
    +},enable:function(jq){
    +return jq.each(function(){
    +_37b(this,false);
    +});
    +},disable:function(jq){
    +return jq.each(function(){
    +_37b(this,true);
    +});
    +},destroy:function(jq){
    +return jq.each(function(){
    +var opts=$(this).splitbutton("options");
    +if(opts.menu){
    +$(opts.menu).menu("destroy");
    +}
    +$(this).remove();
    +});
    +}};
    +$.fn.splitbutton.parseOptions=function(_384){
    +var t=$(_384);
    +return $.extend({},$.fn.linkbutton.parseOptions(_384),$.parser.parseOptions(_384,["menu",{plain:"boolean",duration:"number"}]));
    +};
    +$.fn.splitbutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,menu:null,duration:100});
    +})(jQuery);
    +(function($){
    +function init(_385){
    +$(_385).hide();
    +var span=$("<span class=\"searchbox\"></span>").insertAfter(_385);
    +var _386=$("<input type=\"text\" class=\"searchbox-text\">").appendTo(span);
    +$("<span><span class=\"searchbox-button\"></span></span>").appendTo(span);
    +var name=$(_385).attr("name");
    +if(name){
    +_386.attr("name",name);
    +$(_385).removeAttr("name").attr("searchboxName",name);
    +}
    +return span;
    +};
    +function _387(_388,_389){
    +var opts=$.data(_388,"searchbox").options;
    +var sb=$.data(_388,"searchbox").searchbox;
    +if(_389){
    +opts.width=_389;
    +}
    +sb.appendTo("body");
    +if(isNaN(opts.width)){
    +opts.width=sb._outerWidth();
    +}
    +var _38a=sb.find("span.searchbox-button");
    +var menu=sb.find("a.searchbox-menu");
    +var _38b=sb.find("input.searchbox-text");
    +sb._outerWidth(opts.width)._outerHeight(opts.height);
    +_38b._outerWidth(sb.width()-menu._outerWidth()-_38a._outerWidth());
    +_38b.css({height:sb.height()+"px",lineHeight:sb.height()+"px"});
    +menu._outerHeight(sb.height());
    +_38a._outerHeight(sb.height());
    +var _38c=menu.find("span.l-btn-left");
    +_38c._outerHeight(sb.height());
    +_38c.find("span.l-btn-text,span.m-btn-downarrow").css({height:_38c.height()+"px",lineHeight:_38c.height()+"px"});
    +sb.insertAfter(_388);
    +};
    +function _38d(_38e){
    +var _38f=$.data(_38e,"searchbox");
    +var opts=_38f.options;
    +if(opts.menu){
    +_38f.menu=$(opts.menu).menu({onClick:function(item){
    +_390(item);
    +}});
    +var item=_38f.menu.children("div.menu-item:first");
    +_38f.menu.children("div.menu-item").each(function(){
    +var _391=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)});
    +if(_391.selected){
    +item=$(this);
    +return false;
    +}
    +});
    +item.triggerHandler("click");
    +}else{
    +_38f.searchbox.find("a.searchbox-menu").remove();
    +_38f.menu=null;
    +}
    +function _390(item){
    +_38f.searchbox.find("a.searchbox-menu").remove();
    +var mb=$("<a class=\"searchbox-menu\" href=\"javascript:void(0)\"></a>").html(item.text);
    +mb.prependTo(_38f.searchbox).menubutton({menu:_38f.menu,iconCls:item.iconCls});
    +_38f.searchbox.find("input.searchbox-text").attr("name",$(item.target).attr("name")||item.text);
    +_387(_38e);
    +};
    +};
    +function _392(_393){
    +var _394=$.data(_393,"searchbox");
    +var opts=_394.options;
    +var _395=_394.searchbox.find("input.searchbox-text");
    +var _396=_394.searchbox.find(".searchbox-button");
    +_395.unbind(".searchbox").bind("blur.searchbox",function(e){
    +opts.value=$(this).val();
    +if(opts.value==""){
    +$(this).val(opts.prompt);
    +$(this).addClass("searchbox-prompt");
    +}else{
    +$(this).removeClass("searchbox-prompt");
    +}
    +}).bind("focus.searchbox",function(e){
    +if($(this).val()!=opts.value){
    +$(this).val(opts.value);
    +}
    +$(this).removeClass("searchbox-prompt");
    +}).bind("keydown.searchbox",function(e){
    +if(e.keyCode==13){
    +e.preventDefault();
    +var name=$.fn.prop?_395.prop("name"):_395.attr("name");
    +opts.value=$(this).val();
    +opts.searcher.call(_393,opts.value,name);
    +return false;
    +}
    +});
    +_396.unbind(".searchbox").bind("click.searchbox",function(){
    +var name=$.fn.prop?_395.prop("name"):_395.attr("name");
    +opts.searcher.call(_393,opts.value,name);
    +}).bind("mouseenter.searchbox",function(){
    +$(this).addClass("searchbox-button-hover");
    +}).bind("mouseleave.searchbox",function(){
    +$(this).removeClass("searchbox-button-hover");
    +});
    +};
    +function _397(_398){
    +var _399=$.data(_398,"searchbox");
    +var opts=_399.options;
    +var _39a=_399.searchbox.find("input.searchbox-text");
    +if(opts.value==""){
    +_39a.val(opts.prompt);
    +_39a.addClass("searchbox-prompt");
    +}else{
    +_39a.val(opts.value);
    +_39a.removeClass("searchbox-prompt");
    +}
    +};
    +$.fn.searchbox=function(_39b,_39c){
    +if(typeof _39b=="string"){
    +return $.fn.searchbox.methods[_39b](this,_39c);
    +}
    +_39b=_39b||{};
    +return this.each(function(){
    +var _39d=$.data(this,"searchbox");
    +if(_39d){
    +$.extend(_39d.options,_39b);
    +}else{
    +_39d=$.data(this,"searchbox",{options:$.extend({},$.fn.searchbox.defaults,$.fn.searchbox.parseOptions(this),_39b),searchbox:init(this)});
    +}
    +_38d(this);
    +_397(this);
    +_392(this);
    +_387(this);
    +});
    +};
    +$.fn.searchbox.methods={options:function(jq){
    +return $.data(jq[0],"searchbox").options;
    +},menu:function(jq){
    +return $.data(jq[0],"searchbox").menu;
    +},textbox:function(jq){
    +return $.data(jq[0],"searchbox").searchbox.find("input.searchbox-text");
    +},getValue:function(jq){
    +return $.data(jq[0],"searchbox").options.value;
    +},setValue:function(jq,_39e){
    +return jq.each(function(){
    +$(this).searchbox("options").value=_39e;
    +$(this).searchbox("textbox").val(_39e);
    +$(this).searchbox("textbox").blur();
    +});
    +},getName:function(jq){
    +return $.data(jq[0],"searchbox").searchbox.find("input.searchbox-text").attr("name");
    +},selectName:function(jq,name){
    +return jq.each(function(){
    +var menu=$.data(this,"searchbox").menu;
    +if(menu){
    +menu.children("div.menu-item[name=\""+name+"\"]").triggerHandler("click");
    +}
    +});
    +},destroy:function(jq){
    +return jq.each(function(){
    +var menu=$(this).searchbox("menu");
    +if(menu){
    +menu.menu("destroy");
    +}
    +$.data(this,"searchbox").searchbox.remove();
    +$(this).remove();
    +});
    +},resize:function(jq,_39f){
    +return jq.each(function(){
    +_387(this,_39f);
    +});
    +}};
    +$.fn.searchbox.parseOptions=function(_3a0){
    +var t=$(_3a0);
    +return $.extend({},$.parser.parseOptions(_3a0,["width","height","prompt","menu"]),{value:t.val(),searcher:(t.attr("searcher")?eval(t.attr("searcher")):undefined)});
    +};
    +$.fn.searchbox.defaults={width:"auto",height:22,prompt:"",value:"",menu:null,searcher:function(_3a1,name){
    +}};
    +})(jQuery);
    +(function($){
    +function init(_3a2){
    +$(_3a2).addClass("validatebox-text");
    +};
    +function _3a3(_3a4){
    +var _3a5=$.data(_3a4,"validatebox");
    +_3a5.validating=false;
    +var tip=_3a5.tip;
    +if(tip){
    +tip.remove();
    +}
    +$(_3a4).unbind();
    +$(_3a4).remove();
    +};
    +function _3a6(_3a7){
    +var box=$(_3a7);
    +var _3a8=$.data(_3a7,"validatebox");
    +box.unbind(".validatebox").bind("focus.validatebox",function(){
    +_3a8.validating=true;
    +_3a8.value=undefined;
    +(function(){
    +if(_3a8.validating){
    +if(_3a8.value!=box.val()){
    +_3a8.value=box.val();
    +if(_3a8.timer){
    +clearTimeout(_3a8.timer);
    +}
    +_3a8.timer=setTimeout(function(){
    +$(_3a7).validatebox("validate");
    +},_3a8.options.delay);
    +}else{
    +_3ac(_3a7);
    +}
    +setTimeout(arguments.callee,200);
    +}
    +})();
    +}).bind("blur.validatebox",function(){
    +if(_3a8.timer){
    +clearTimeout(_3a8.timer);
    +_3a8.timer=undefined;
    +}
    +_3a8.validating=false;
    +_3a9(_3a7);
    +}).bind("mouseenter.validatebox",function(){
    +if(box.hasClass("validatebox-invalid")){
    +_3aa(_3a7);
    +}
    +}).bind("mouseleave.validatebox",function(){
    +if(!_3a8.validating){
    +_3a9(_3a7);
    +}
    +});
    +};
    +function _3aa(_3ab){
    +var msg=$.data(_3ab,"validatebox").message;
    +var tip=$.data(_3ab,"validatebox").tip;
    +if(!tip){
    +tip=$("<div class=\"validatebox-tip\">"+"<span class=\"validatebox-tip-content\">"+"</span>"+"<span class=\"validatebox-tip-pointer\">"+"</span>"+"</div>").appendTo("body");
    +$.data(_3ab,"validatebox").tip=tip;
    +}
    +tip.find(".validatebox-tip-content").html(msg);
    +_3ac(_3ab);
    +};
    +function _3ac(_3ad){
    +var _3ae=$.data(_3ad,"validatebox");
    +if(!_3ae){
    +return;
    +}
    +var tip=_3ae.tip;
    +if(tip){
    +var box=$(_3ad);
    +var _3af=tip.find(".validatebox-tip-pointer");
    +var _3b0=tip.find(".validatebox-tip-content");
    +tip.show();
    +tip.css("top",box.offset().top-(_3b0._outerHeight()-box._outerHeight())/2);
    +if(_3ae.options.tipPosition=="left"){
    +tip.css("left",box.offset().left-tip._outerWidth());
    +tip.addClass("validatebox-tip-left");
    +}else{
    +tip.css("left",box.offset().left+box._outerWidth());
    +tip.removeClass("validatebox-tip-left");
    +}
    +_3af.css("top",(_3b0._outerHeight()-_3af._outerHeight())/2);
    +}
    +};
    +function _3a9(_3b1){
    +var tip=$.data(_3b1,"validatebox").tip;
    +if(tip){
    +tip.remove();
    +$.data(_3b1,"validatebox").tip=null;
    +}
    +};
    +function _3b2(_3b3){
    +var _3b4=$.data(_3b3,"validatebox");
    +var opts=_3b4.options;
    +var tip=_3b4.tip;
    +var box=$(_3b3);
    +var _3b5=box.val();
    +function _3b6(msg){
    +_3b4.message=msg;
    +};
    +function _3b7(_3b8){
    +var _3b9=/([a-zA-Z_]+)(.*)/.exec(_3b8);
    +var rule=opts.rules[_3b9[1]];
    +if(rule&&_3b5){
    +var _3ba=eval(_3b9[2]);
    +if(!rule["validator"](_3b5,_3ba)){
    +box.addClass("validatebox-invalid");
    +var _3bb=rule["message"];
    +if(_3ba){
    +for(var i=0;i<_3ba.length;i++){
    +_3bb=_3bb.replace(new RegExp("\\{"+i+"\\}","g"),_3ba[i]);
    +}
    +}
    +_3b6(opts.invalidMessage||_3bb);
    +if(_3b4.validating){
    +_3aa(_3b3);
    +}
    +return false;
    +}
    +}
    +return true;
    +};
    +if(opts.required){
    +if(_3b5==""){
    +box.addClass("validatebox-invalid");
    +_3b6(opts.missingMessage);
    +if(_3b4.validating){
    +_3aa(_3b3);
    +}
    +return false;
    +}
    +}
    +if(opts.validType){
    +if(typeof opts.validType=="string"){
    +if(!_3b7(opts.validType)){
    +return false;
    +}
    +}else{
    +for(var i=0;i<opts.validType.length;i++){
    +if(!_3b7(opts.validType[i])){
    +return false;
    +}
    +}
    +}
    +}
    +box.removeClass("validatebox-invalid");
    +_3a9(_3b3);
    +return true;
    +};
    +$.fn.validatebox=function(_3bc,_3bd){
    +if(typeof _3bc=="string"){
    +return $.fn.validatebox.methods[_3bc](this,_3bd);
    +}
    +_3bc=_3bc||{};
    +return this.each(function(){
    +var _3be=$.data(this,"validatebox");
    +if(_3be){
    +$.extend(_3be.options,_3bc);
    +}else{
    +init(this);
    +$.data(this,"validatebox",{options:$.extend({},$.fn.validatebox.defaults,$.fn.validatebox.parseOptions(this),_3bc)});
    +}
    +_3a6(this);
    +});
    +};
    +$.fn.validatebox.methods={destroy:function(jq){
    +return jq.each(function(){
    +_3a3(this);
    +});
    +},validate:function(jq){
    +return jq.each(function(){
    +_3b2(this);
    +});
    +},isValid:function(jq){
    +return _3b2(jq[0]);
    +}};
    +$.fn.validatebox.parseOptions=function(_3bf){
    +var t=$(_3bf);
    +return $.extend({},$.parser.parseOptions(_3bf,["validType","missingMessage","invalidMessage","tipPosition",{delay:"number"}]),{required:(t.attr("required")?true:undefined)});
    +};
    +$.fn.validatebox.defaults={required:false,validType:null,delay:200,missingMessage:"This field is required.",invalidMessage:null,tipPosition:"right",rules:{email:{validator:function(_3c0){
    +return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(_3c0);
    +},message:"Please enter a valid email address."},url:{validator:function(_3c1){
    +return /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(_3c1);
    +},message:"Please enter a valid URL."},length:{validator:function(_3c2,_3c3){
    +var len=$.trim(_3c2).length;
    +return len>=_3c3[0]&&len<=_3c3[1];
    +},message:"Please enter a value between {0} and {1}."},remote:{validator:function(_3c4,_3c5){
    +var data={};
    +data[_3c5[1]]=_3c4;
    +var _3c6=$.ajax({url:_3c5[0],dataType:"json",data:data,async:false,cache:false,type:"post"}).responseText;
    +return _3c6=="true";
    +},message:"Please fix this field."}}};
    +})(jQuery);
    +(function($){
    +function _3c7(_3c8,_3c9){
    +_3c9=_3c9||{};
    +var _3ca={};
    +if(_3c9.onSubmit){
    +if(_3c9.onSubmit.call(_3c8,_3ca)==false){
    +return;
    +}
    +}
    +var form=$(_3c8);
    +if(_3c9.url){
    +form.attr("action",_3c9.url);
    +}
    +var _3cb="easyui_frame_"+(new Date().getTime());
    +var _3cc=$("<iframe id="+_3cb+" name="+_3cb+"></iframe>").attr("src",window.ActiveXObject?"javascript:false":"about:blank").css({position:"absolute",top:-1000,left:-1000});
    +var t=form.attr("target"),a=form.attr("action");
    +form.attr("target",_3cb);
    +var _3cd=$();
    +try{
    +_3cc.appendTo("body");
    +_3cc.bind("load",cb);
    +for(var n in _3ca){
    +var f=$("<input type=\"hidden\" name=\""+n+"\">").val(_3ca[n]).appendTo(form);
    +_3cd=_3cd.add(f);
    +}
    +form[0].submit();
    +}
    +finally{
    +form.attr("action",a);
    +t?form.attr("target",t):form.removeAttr("target");
    +_3cd.remove();
    +}
    +var _3ce=10;
    +function cb(){
    +_3cc.unbind();
    +var body=$("#"+_3cb).contents().find("body");
    +var data=body.html();
    +if(data==""){
    +if(--_3ce){
    +setTimeout(cb,100);
    +return;
    +}
    +return;
    +}
    +var ta=body.find(">textarea");
    +if(ta.length){
    +data=ta.val();
    +}else{
    +var pre=body.find(">pre");
    +if(pre.length){
    +data=pre.html();
    +}
    +}
    +if(_3c9.success){
    +_3c9.success(data);
    +}
    +setTimeout(function(){
    +_3cc.unbind();
    +_3cc.remove();
    +},100);
    +};
    +};
    +function load(_3cf,data){
    +if(!$.data(_3cf,"form")){
    +$.data(_3cf,"form",{options:$.extend({},$.fn.form.defaults)});
    +}
    +var opts=$.data(_3cf,"form").options;
    +if(typeof data=="string"){
    +var _3d0={};
    +if(opts.onBeforeLoad.call(_3cf,_3d0)==false){
    +return;
    +}
    +$.ajax({url:data,data:_3d0,dataType:"json",success:function(data){
    +_3d1(data);
    +},error:function(){
    +opts.onLoadError.apply(_3cf,arguments);
    +}});
    +}else{
    +_3d1(data);
    +}
    +function _3d1(data){
    +var form=$(_3cf);
    +for(var name in data){
    +var val=data[name];
    +var rr=_3d2(name,val);
    +if(!rr.length){
    +var f=form.find("input[numberboxName=\""+name+"\"]");
    +if(f.length){
    +f.numberbox("setValue",val);
    +}else{
    +$("input[name=\""+name+"\"]",form).val(val);
    +$("textarea[name=\""+name+"\"]",form).val(val);
    +$("select[name=\""+name+"\"]",form).val(val);
    +}
    +}
    +_3d3(name,val);
    +}
    +opts.onLoadSuccess.call(_3cf,data);
    +_3d6(_3cf);
    +};
    +function _3d2(name,val){
    +var form=$(_3cf);
    +var rr=$("input[name=\""+name+"\"][type=radio], input[name=\""+name+"\"][type=checkbox]",form);
    +$.fn.prop?rr.prop("checked",false):rr.attr("checked",false);
    +rr.each(function(){
    +var f=$(this);
    +if(f.val()==String(val)){
    +$.fn.prop?f.prop("checked",true):f.attr("checked",true);
    +}
    +});
    +return rr;
    +};
    +function _3d3(name,val){
    +var form=$(_3cf);
    +var cc=["combobox","combotree","combogrid","datetimebox","datebox","combo"];
    +var c=form.find("[comboName=\""+name+"\"]");
    +if(c.length){
    +for(var i=0;i<cc.length;i++){
    +var type=cc[i];
    +if(c.hasClass(type+"-f")){
    +if(c[type]("options").multiple){
    +c[type]("setValues",val);
    +}else{
    +c[type]("setValue",val);
    +}
    +return;
    +}
    +}
    +}
    +};
    +};
    +function _3d4(_3d5){
    +$("input,select,textarea",_3d5).each(function(){
    +var t=this.type,tag=this.tagName.toLowerCase();
    +if(t=="text"||t=="hidden"||t=="password"||tag=="textarea"){
    +this.value="";
    +}else{
    +if(t=="file"){
    +var file=$(this);
    +file.after(file.clone().val(""));
    +file.remove();
    +}else{
    +if(t=="checkbox"||t=="radio"){
    +this.checked=false;
    +}else{
    +if(tag=="select"){
    +this.selectedIndex=-1;
    +}
    +}
    +}
    +}
    +});
    +if($.fn.combo){
    +$(".combo-f",_3d5).combo("clear");
    +}
    +if($.fn.combobox){
    +$(".combobox-f",_3d5).combobox("clear");
    +}
    +if($.fn.combotree){
    +$(".combotree-f",_3d5).combotree("clear");
    +}
    +if($.fn.combogrid){
    +$(".combogrid-f",_3d5).combogrid("clear");
    +}
    +_3d6(_3d5);
    +};
    +function _3d7(_3d8){
    +_3d8.reset();
    +var t=$(_3d8);
    +if($.fn.combo){
    +t.find(".combo-f").combo("reset");
    +}
    +if($.fn.combobox){
    +t.find(".combobox-f").combobox("reset");
    +}
    +if($.fn.combotree){
    +t.find(".combotree-f").combotree("reset");
    +}
    +if($.fn.combogrid){
    +t.find(".combogrid-f").combogrid("reset");
    +}
    +if($.fn.spinner){
    +t.find(".spinner-f").spinner("reset");
    +}
    +if($.fn.timespinner){
    +t.find(".timespinner-f").timespinner("reset");
    +}
    +if($.fn.numberbox){
    +t.find(".numberbox-f").numberbox("reset");
    +}
    +if($.fn.numberspinner){
    +t.find(".numberspinner-f").numberspinner("reset");
    +}
    +_3d6(_3d8);
    +};
    +function _3d9(_3da){
    +var _3db=$.data(_3da,"form").options;
    +var form=$(_3da);
    +form.unbind(".form").bind("submit.form",function(){
    +setTimeout(function(){
    +_3c7(_3da,_3db);
    +},0);
    +return false;
    +});
    +};
    +function _3d6(_3dc){
    +if($.fn.validatebox){
    +var t=$(_3dc);
    +t.find(".validatebox-text:not(:disabled)").validatebox("validate");
    +var _3dd=t.find(".validatebox-invalid");
    +_3dd.filter(":not(:disabled):first").focus();
    +return _3dd.length==0;
    +}
    +return true;
    +};
    +$.fn.form=function(_3de,_3df){
    +if(typeof _3de=="string"){
    +return $.fn.form.methods[_3de](this,_3df);
    +}
    +_3de=_3de||{};
    +return this.each(function(){
    +if(!$.data(this,"form")){
    +$.data(this,"form",{options:$.extend({},$.fn.form.defaults,_3de)});
    +}
    +_3d9(this);
    +});
    +};
    +$.fn.form.methods={submit:function(jq,_3e0){
    +return jq.each(function(){
    +_3c7(this,$.extend({},$.fn.form.defaults,_3e0||{}));
    +});
    +},load:function(jq,data){
    +return jq.each(function(){
    +load(this,data);
    +});
    +},clear:function(jq){
    +return jq.each(function(){
    +_3d4(this);
    +});
    +},reset:function(jq){
    +return jq.each(function(){
    +_3d7(this);
    +});
    +},validate:function(jq){
    +return _3d6(jq[0]);
    +}};
    +$.fn.form.defaults={url:null,onSubmit:function(_3e1){
    +return $(this).form("validate");
    +},success:function(data){
    +},onBeforeLoad:function(_3e2){
    +},onLoadSuccess:function(data){
    +},onLoadError:function(){
    +}};
    +})(jQuery);
    +(function($){
    +function init(_3e3){
    +$(_3e3).addClass("numberbox-f");
    +var v=$("<input type=\"hidden\">").insertAfter(_3e3);
    +var name=$(_3e3).attr("name");
    +if(name){
    +v.attr("name",name);
    +$(_3e3).removeAttr("name").attr("numberboxName",name);
    +}
    +return v;
    +};
    +function _3e4(_3e5){
    +var opts=$.data(_3e5,"numberbox").options;
    +var fn=opts.onChange;
    +opts.onChange=function(){
    +};
    +_3e6(_3e5,opts.parser.call(_3e5,opts.value));
    +opts.onChange=fn;
    +opts.originalValue=_3e7(_3e5);
    +};
    +function _3e7(_3e8){
    +return $.data(_3e8,"numberbox").field.val();
    +};
    +function _3e6(_3e9,_3ea){
    +var _3eb=$.data(_3e9,"numberbox");
    +var opts=_3eb.options;
    +var _3ec=_3e7(_3e9);
    +_3ea=opts.parser.call(_3e9,_3ea);
    +opts.value=_3ea;
    +_3eb.field.val(_3ea);
    +$(_3e9).val(opts.formatter.call(_3e9,_3ea));
    +if(_3ec!=_3ea){
    +opts.onChange.call(_3e9,_3ea,_3ec);
    +}
    +};
    +function _3ed(_3ee){
    +var opts=$.data(_3ee,"numberbox").options;
    +$(_3ee).unbind(".numberbox").bind("keypress.numberbox",function(e){
    +if(e.which==45){
    +if($(this).val().indexOf("-")==-1){
    +return true;
    +}else{
    +return false;
    +}
    +}
    +if(e.which==46){
    +if($(this).val().indexOf(".")==-1){
    +return true;
    +}else{
    +return false;
    +}
    +}else{
    +if((e.which>=48&&e.which<=57&&e.ctrlKey==false&&e.shiftKey==false)||e.which==0||e.which==8){
    +return true;
    +}else{
    +if(e.ctrlKey==true&&(e.which==99||e.which==118)){
    +return true;
    +}else{
    +return false;
    +}
    +}
    +}
    +}).bind("blur.numberbox",function(){
    +_3e6(_3ee,$(this).val());
    +$(this).val(opts.formatter.call(_3ee,_3e7(_3ee)));
    +}).bind("focus.numberbox",function(){
    +var vv=_3e7(_3ee);
    +if($(this).val()!=vv){
    +$(this).val(vv);
    +}
    +});
    +};
    +function _3ef(_3f0){
    +if($.fn.validatebox){
    +var opts=$.data(_3f0,"numberbox").options;
    +$(_3f0).validatebox(opts);
    +}
    +};
    +function _3f1(_3f2,_3f3){
    +var opts=$.data(_3f2,"numberbox").options;
    +if(_3f3){
    +opts.disabled=true;
    +$(_3f2).attr("disabled",true);
    +}else{
    +opts.disabled=false;
    +$(_3f2).removeAttr("disabled");
    +}
    +};
    +$.fn.numberbox=function(_3f4,_3f5){
    +if(typeof _3f4=="string"){
    +var _3f6=$.fn.numberbox.methods[_3f4];
    +if(_3f6){
    +return _3f6(this,_3f5);
    +}else{
    +return this.validatebox(_3f4,_3f5);
    +}
    +}
    +_3f4=_3f4||{};
    +return this.each(function(){
    +var _3f7=$.data(this,"numberbox");
    +if(_3f7){
    +$.extend(_3f7.options,_3f4);
    +}else{
    +_3f7=$.data(this,"numberbox",{options:$.extend({},$.fn.numberbox.defaults,$.fn.numberbox.parseOptions(this),_3f4),field:init(this)});
    +$(this).removeAttr("disabled");
    +$(this).css({imeMode:"disabled"});
    +}
    +_3f1(this,_3f7.options.disabled);
    +_3ed(this);
    +_3ef(this);
    +_3e4(this);
    +});
    +};
    +$.fn.numberbox.methods={options:function(jq){
    +return $.data(jq[0],"numberbox").options;
    +},destroy:function(jq){
    +return jq.each(function(){
    +$.data(this,"numberbox").field.remove();
    +$(this).validatebox("destroy");
    +$(this).remove();
    +});
    +},disable:function(jq){
    +return jq.each(function(){
    +_3f1(this,true);
    +});
    +},enable:function(jq){
    +return jq.each(function(){
    +_3f1(this,false);
    +});
    +},fix:function(jq){
    +return jq.each(function(){
    +_3e6(this,$(this).val());
    +});
    +},setValue:function(jq,_3f8){
    +return jq.each(function(){
    +_3e6(this,_3f8);
    +});
    +},getValue:function(jq){
    +return _3e7(jq[0]);
    +},clear:function(jq){
    +return jq.each(function(){
    +var _3f9=$.data(this,"numberbox");
    +_3f9.field.val("");
    +$(this).val("");
    +});
    +},reset:function(jq){
    +return jq.each(function(){
    +var opts=$(this).numberbox("options");
    +$(this).numberbox("setValue",opts.originalValue);
    +});
    +}};
    +$.fn.numberbox.parseOptions=function(_3fa){
    +var t=$(_3fa);
    +return $.extend({},$.fn.validatebox.parseOptions(_3fa),$.parser.parseOptions(_3fa,["decimalSeparator","groupSeparator","suffix",{min:"number",max:"number",precision:"number"}]),{prefix:(t.attr("prefix")?t.attr("prefix"):undefined),disabled:(t.attr("disabled")?true:undefined),value:(t.val()||undefined)});
    +};
    +$.fn.numberbox.defaults=$.extend({},$.fn.validatebox.defaults,{disabled:false,value:"",min:null,max:null,precision:0,decimalSeparator:".",groupSeparator:"",prefix:"",suffix:"",formatter:function(_3fb){
    +if(!_3fb){
    +return _3fb;
    +}
    +_3fb=_3fb+"";
    +var opts=$(this).numberbox("options");
    +var s1=_3fb,s2="";
    +var dpos=_3fb.indexOf(".");
    +if(dpos>=0){
    +s1=_3fb.substring(0,dpos);
    +s2=_3fb.substring(dpos+1,_3fb.length);
    +}
    +if(opts.groupSeparator){
    +var p=/(\d+)(\d{3})/;
    +while(p.test(s1)){
    +s1=s1.replace(p,"$1"+opts.groupSeparator+"$2");
    +}
    +}
    +if(s2){
    +return opts.prefix+s1+opts.decimalSeparator+s2+opts.suffix;
    +}else{
    +return opts.prefix+s1+opts.suffix;
    +}
    +},parser:function(s){
    +s=s+"";
    +var opts=$(this).numberbox("options");
    +if(opts.groupSeparator){
    +s=s.replace(new RegExp("\\"+opts.groupSeparator,"g"),"");
    +}
    +if(opts.decimalSeparator){
    +s=s.replace(new RegExp("\\"+opts.decimalSeparator,"g"),".");
    +}
    +if(opts.prefix){
    +s=s.replace(new RegExp("\\"+$.trim(opts.prefix),"g"),"");
    +}
    +if(opts.suffix){
    +s=s.replace(new RegExp("\\"+$.trim(opts.suffix),"g"),"");
    +}
    +s=s.replace(/\s/g,"");
    +var val=parseFloat(s).toFixed(opts.precision);
    +if(isNaN(val)){
    +val="";
    +}else{
    +if(typeof (opts.min)=="number"&&val<opts.min){
    +val=opts.min.toFixed(opts.precision);
    +}else{
    +if(typeof (opts.max)=="number"&&val>opts.max){
    +val=opts.max.toFixed(opts.precision);
    +}
    +}
    +}
    +return val;
    +},onChange:function(_3fc,_3fd){
    +}});
    +})(jQuery);
    +(function($){
    +function _3fe(_3ff){
    +var opts=$.data(_3ff,"calendar").options;
    +var t=$(_3ff);
    +if(opts.fit==true){
    +var p=t.parent();
    +opts.width=p.width();
    +opts.height=p.height();
    +}
    +var _400=t.find(".calendar-header");
    +t._outerWidth(opts.width);
    +t._outerHeight(opts.height);
    +t.find(".calendar-body")._outerHeight(t.height()-_400._outerHeight());
    +};
    +function init(_401){
    +$(_401).addClass("calendar").wrapInner("<div class=\"calendar-header\">"+"<div class=\"calendar-prevmonth\"></div>"+"<div class=\"calendar-nextmonth\"></div>"+"<div class=\"calendar-prevyear\"></div>"+"<div class=\"calendar-nextyear\"></div>"+"<div class=\"calendar-title\">"+"<span>Aprial 2010</span>"+"</div>"+"</div>"+"<div class=\"calendar-body\">"+"<div class=\"calendar-menu\">"+"<div class=\"calendar-menu-year-inner\">"+"<span class=\"calendar-menu-prev\"></span>"+"<span><input class=\"calendar-menu-year\" type=\"text\"></input></span>"+"<span class=\"calendar-menu-next\"></span>"+"</div>"+"<div class=\"calendar-menu-month-inner\">"+"</div>"+"</div>"+"</div>");
    +$(_401).find(".calendar-title span").hover(function(){
    +$(this).addClass("calendar-menu-hover");
    +},function(){
    +$(this).removeClass("calendar-menu-hover");
    +}).click(function(){
    +var menu=$(_401).find(".calendar-menu");
    +if(menu.is(":visible")){
    +menu.hide();
    +}else{
    +_408(_401);
    +}
    +});
    +$(".calendar-prevmonth,.calendar-nextmonth,.calendar-prevyear,.calendar-nextyear",_401).hover(function(){
    +$(this).addClass("calendar-nav-hover");
    +},function(){
    +$(this).removeClass("calendar-nav-hover");
    +});
    +$(_401).find(".calendar-nextmonth").click(function(){
    +_402(_401,1);
    +});
    +$(_401).find(".calendar-prevmonth").click(function(){
    +_402(_401,-1);
    +});
    +$(_401).find(".calendar-nextyear").click(function(){
    +_405(_401,1);
    +});
    +$(_401).find(".calendar-prevyear").click(function(){
    +_405(_401,-1);
    +});
    +$(_401).bind("_resize",function(){
    +var opts=$.data(_401,"calendar").options;
    +if(opts.fit==true){
    +_3fe(_401);
    +}
    +return false;
    +});
    +};
    +function _402(_403,_404){
    +var opts=$.data(_403,"calendar").options;
    +opts.month+=_404;
    +if(opts.month>12){
    +opts.year++;
    +opts.month=1;
    +}else{
    +if(opts.month<1){
    +opts.year--;
    +opts.month=12;
    +}
    +}
    +show(_403);
    +var menu=$(_403).find(".calendar-menu-month-inner");
    +menu.find("td.calendar-selected").removeClass("calendar-selected");
    +menu.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected");
    +};
    +function _405(_406,_407){
    +var opts=$.data(_406,"calendar").options;
    +opts.year+=_407;
    +show(_406);
    +var menu=$(_406).find(".calendar-menu-year");
    +menu.val(opts.year);
    +};
    +function _408(_409){
    +var opts=$.data(_409,"calendar").options;
    +$(_409).find(".calendar-menu").show();
    +if($(_409).find(".calendar-menu-month-inner").is(":empty")){
    +$(_409).find(".calendar-menu-month-inner").empty();
    +var t=$("<table></table>").appendTo($(_409).find(".calendar-menu-month-inner"));
    +var idx=0;
    +for(var i=0;i<3;i++){
    +var tr=$("<tr></tr>").appendTo(t);
    +for(var j=0;j<4;j++){
    +$("<td class=\"calendar-menu-month\"></td>").html(opts.months[idx++]).attr("abbr",idx).appendTo(tr);
    +}
    +}
    +$(_409).find(".calendar-menu-prev,.calendar-menu-next").hover(function(){
    +$(this).addClass("calendar-menu-hover");
    +},function(){
    +$(this).removeClass("calendar-menu-hover");
    +});
    +$(_409).find(".calendar-menu-next").click(function(){
    +var y=$(_409).find(".calendar-menu-year");
    +if(!isNaN(y.val())){
    +y.val(parseInt(y.val())+1);
    +}
    +});
    +$(_409).find(".calendar-menu-prev").click(function(){
    +var y=$(_409).find(".calendar-menu-year");
    +if(!isNaN(y.val())){
    +y.val(parseInt(y.val()-1));
    +}
    +});
    +$(_409).find(".calendar-menu-year").keypress(function(e){
    +if(e.keyCode==13){
    +_40a();
    +}
    +});
    +$(_409).find(".calendar-menu-month").hover(function(){
    +$(this).addClass("calendar-menu-hover");
    +},function(){
    +$(this).removeClass("calendar-menu-hover");
    +}).click(function(){
    +var menu=$(_409).find(".calendar-menu");
    +menu.find(".calendar-selected").removeClass("calendar-selected");
    +$(this).addClass("calendar-selected");
    +_40a();
    +});
    +}
    +function _40a(){
    +var menu=$(_409).find(".calendar-menu");
    +var year=menu.find(".calendar-menu-year").val();
    +var _40b=menu.find(".calendar-selected").attr("abbr");
    +if(!isNaN(year)){
    +opts.year=parseInt(year);
    +opts.month=parseInt(_40b);
    +show(_409);
    +}
    +menu.hide();
    +};
    +var body=$(_409).find(".calendar-body");
    +var sele=$(_409).find(".calendar-menu");
    +var _40c=sele.find(".calendar-menu-year-inner");
    +var _40d=sele.find(".calendar-menu-month-inner");
    +_40c.find("input").val(opts.year).focus();
    +_40d.find("td.calendar-selected").removeClass("calendar-selected");
    +_40d.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected");
    +sele._outerWidth(body._outerWidth());
    +sele._outerHeight(body._outerHeight());
    +_40d._outerHeight(sele.height()-_40c._outerHeight());
    +};
    +function _40e(_40f,year,_410){
    +var opts=$.data(_40f,"calendar").options;
    +var _411=[];
    +var _412=new Date(year,_410,0).getDate();
    +for(var i=1;i<=_412;i++){
    +_411.push([year,_410,i]);
    +}
    +var _413=[],week=[];
    +var _414=-1;
    +while(_411.length>0){
    +var date=_411.shift();
    +week.push(date);
    +var day=new Date(date[0],date[1]-1,date[2]).getDay();
    +if(_414==day){
    +day=0;
    +}else{
    +if(day==(opts.firstDay==0?7:opts.firstDay)-1){
    +_413.push(week);
    +week=[];
    +}
    +}
    +_414=day;
    +}
    +if(week.length){
    +_413.push(week);
    +}
    +var _415=_413[0];
    +if(_415.length<7){
    +while(_415.length<7){
    +var _416=_415[0];
    +var date=new Date(_416[0],_416[1]-1,_416[2]-1);
    +_415.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]);
    +}
    +}else{
    +var _416=_415[0];
    +var week=[];
    +for(var i=1;i<=7;i++){
    +var date=new Date(_416[0],_416[1]-1,_416[2]-i);
    +week.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]);
    +}
    +_413.unshift(week);
    +}
    +var _417=_413[_413.length-1];
    +while(_417.length<7){
    +var _418=_417[_417.length-1];
    +var date=new Date(_418[0],_418[1]-1,_418[2]+1);
    +_417.push([date.getFullYear(),date.getMonth()+1,date.getDate()]);
    +}
    +if(_413.length<6){
    +var _418=_417[_417.length-1];
    +var week=[];
    +for(var i=1;i<=7;i++){
    +var date=new Date(_418[0],_418[1]-1,_418[2]+i);
    +week.push([date.getFullYear(),date.getMonth()+1,date.getDate()]);
    +}
    +_413.push(week);
    +}
    +return _413;
    +};
    +function show(_419){
    +var opts=$.data(_419,"calendar").options;
    +$(_419).find(".calendar-title span").html(opts.months[opts.month-1]+" "+opts.year);
    +var body=$(_419).find("div.calendar-body");
    +body.find(">table").remove();
    +var t=$("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><thead></thead><tbody></tbody></table>").prependTo(body);
    +var tr=$("<tr></tr>").appendTo(t.find("thead"));
    +for(var i=opts.firstDay;i<opts.weeks.length;i++){
    +tr.append("<th>"+opts.weeks[i]+"</th>");
    +}
    +for(var i=0;i<opts.firstDay;i++){
    +tr.append("<th>"+opts.weeks[i]+"</th>");
    +}
    +var _41a=_40e(_419,opts.year,opts.month);
    +for(var i=0;i<_41a.length;i++){
    +var week=_41a[i];
    +var tr=$("<tr></tr>").appendTo(t.find("tbody"));
    +for(var j=0;j<week.length;j++){
    +var day=week[j];
    +$("<td class=\"calendar-day calendar-other-month\"></td>").attr("abbr",day[0]+","+day[1]+","+day[2]).html(day[2]).appendTo(tr);
    +}
    +}
    +t.find("td[abbr^=\""+opts.year+","+opts.month+"\"]").removeClass("calendar-other-month");
    +var now=new Date();
    +var _41b=now.getFullYear()+","+(now.getMonth()+1)+","+now.getDate();
    +t.find("td[abbr=\""+_41b+"\"]").addClass("calendar-today");
    +if(opts.current){
    +t.find(".calendar-selected").removeClass("calendar-selected");
    +var _41c=opts.current.getFullYear()+","+(opts.current.getMonth()+1)+","+opts.current.getDate();
    +t.find("td[abbr=\""+_41c+"\"]").addClass("calendar-selected");
    +}
    +var _41d=6-opts.firstDay;
    +var _41e=_41d+1;
    +if(_41d>=7){
    +_41d-=7;
    +}
    +if(_41e>=7){
    +_41e-=7;
    +}
    +t.find("tr").find("td:eq("+_41d+")").addClass("calendar-saturday");
    +t.find("tr").find("td:eq("+_41e+")").addClass("calendar-sunday");
    +t.find("td").hover(function(){
    +$(this).addClass("calendar-hover");
    +},function(){
    +$(this).removeClass("calendar-hover");
    +}).click(function(){
    +t.find(".calendar-selected").removeClass("calendar-selected");
    +$(this).addClass("calendar-selected");
    +var _41f=$(this).attr("abbr").split(",");
    +opts.current=new Date(_41f[0],parseInt(_41f[1])-1,_41f[2]);
    +opts.onSelect.call(_419,opts.current);
    +});
    +};
    +$.fn.calendar=function(_420,_421){
    +if(typeof _420=="string"){
    +return $.fn.calendar.methods[_420](this,_421);
    +}
    +_420=_420||{};
    +return this.each(function(){
    +var _422=$.data(this,"calendar");
    +if(_422){
    +$.extend(_422.options,_420);
    +}else{
    +_422=$.data(this,"calendar",{options:$.extend({},$.fn.calendar.defaults,$.fn.calendar.parseOptions(this),_420)});
    +init(this);
    +}
    +if(_422.options.border==false){
    +$(this).addClass("calendar-noborder");
    +}
    +_3fe(this);
    +show(this);
    +$(this).find("div.calendar-menu").hide();
    +});
    +};
    +$.fn.calendar.methods={options:function(jq){
    +return $.data(jq[0],"calendar").options;
    +},resize:function(jq){
    +return jq.each(function(){
    +_3fe(this);
    +});
    +},moveTo:function(jq,date){
    +return jq.each(function(){
    +$(this).calendar({year:date.getFullYear(),month:date.getMonth()+1,current:date});
    +});
    +}};
    +$.fn.calendar.parseOptions=function(_423){
    +var t=$(_423);
    +return $.extend({},$.parser.parseOptions(_423,["width","height",{firstDay:"number",fit:"boolean",border:"boolean"}]));
    +};
    +$.fn.calendar.defaults={width:180,height:180,fit:false,border:true,firstDay:0,weeks:["S","M","T","W","T","F","S"],months:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],year:new Date().getFullYear(),month:new Date().getMonth()+1,current:new Date(),onSelect:function(date){
    +}};
    +})(jQuery);
    +(function($){
    +function init(_424){
    +var _425=$("<span class=\"spinner\">"+"<span class=\"spinner-arrow\">"+"<span class=\"spinner-arrow-up\"></span>"+"<span class=\"spinner-arrow-down\"></span>"+"</span>"+"</span>").insertAfter(_424);
    +$(_424).addClass("spinner-text spinner-f").prependTo(_425);
    +return _425;
    +};
    +function _426(_427,_428){
    +var opts=$.data(_427,"spinner").options;
    +var _429=$.data(_427,"spinner").spinner;
    +if(_428){
    +opts.width=_428;
    +}
    +var _42a=$("<div style=\"display:none\"></div>").insertBefore(_429);
    +_429.appendTo("body");
    +if(isNaN(opts.width)){
    +opts.width=$(_427).outerWidth();
    +}
    +var _42b=_429.find(".spinner-arrow");
    +_429._outerWidth(opts.width)._outerHeight(opts.height);
    +$(_427)._outerWidth(_429.width()-_42b.outerWidth());
    +$(_427).css({height:_429.height()+"px",lineHeight:_429.height()+"px"});
    +_42b._outerHeight(_429.height());
    +_42b.find("span")._outerHeight(_42b.height()/2);
    +_429.insertAfter(_42a);
    +_42a.remove();
    +};
    +function _42c(_42d){
    +var opts=$.data(_42d,"spinner").options;
    +var _42e=$.data(_42d,"spinner").spinner;
    +_42e.find(".spinner-arrow-up,.spinner-arrow-down").unbind(".spinner");
    +if(!opts.disabled){
    +_42e.find(".spinner-arrow-up").bind("mouseenter.spinner",function(){
    +$(this).addClass("spinner-arrow-hover");
    +}).bind("mouseleave.spinner",function(){
    +$(this).removeClass("spinner-arrow-hover");
    +}).bind("click.spinner",function(){
    +opts.spin.call(_42d,false);
    +opts.onSpinUp.call(_42d);
    +$(_42d).validatebox("validate");
    +});
    +_42e.find(".spinner-arrow-down").bind("mouseenter.spinner",function(){
    +$(this).addClass("spinner-arrow-hover");
    +}).bind("mouseleave.spinner",function(){
    +$(this).removeClass("spinner-arrow-hover");
    +}).bind("click.spinner",function(){
    +opts.spin.call(_42d,true);
    +opts.onSpinDown.call(_42d);
    +$(_42d).validatebox("validate");
    +});
    +}
    +};
    +function _42f(_430,_431){
    +var opts=$.data(_430,"spinner").options;
    +if(_431){
    +opts.disabled=true;
    +$(_430).attr("disabled",true);
    +}else{
    +opts.disabled=false;
    +$(_430).removeAttr("disabled");
    +}
    +};
    +$.fn.spinner=function(_432,_433){
    +if(typeof _432=="string"){
    +var _434=$.fn.spinner.methods[_432];
    +if(_434){
    +return _434(this,_433);
    +}else{
    +return this.validatebox(_432,_433);
    +}
    +}
    +_432=_432||{};
    +return this.each(function(){
    +var _435=$.data(this,"spinner");
    +if(_435){
    +$.extend(_435.options,_432);
    +}else{
    +_435=$.data(this,"spinner",{options:$.extend({},$.fn.spinner.defaults,$.fn.spinner.parseOptions(this),_432),spinner:init(this)});
    +$(this).removeAttr("disabled");
    +}
    +_435.options.originalValue=_435.options.value;
    +$(this).val(_435.options.value);
    +$(this).attr("readonly",!_435.options.editable);
    +_42f(this,_435.options.disabled);
    +_426(this);
    +$(this).validatebox(_435.options);
    +_42c(this);
    +});
    +};
    +$.fn.spinner.methods={options:function(jq){
    +var opts=$.data(jq[0],"spinner").options;
    +return $.extend(opts,{value:jq.val()});
    +},destroy:function(jq){
    +return jq.each(function(){
    +var _436=$.data(this,"spinner").spinner;
    +$(this).validatebox("destroy");
    +_436.remove();
    +});
    +},resize:function(jq,_437){
    +return jq.each(function(){
    +_426(this,_437);
    +});
    +},enable:function(jq){
    +return jq.each(function(){
    +_42f(this,false);
    +_42c(this);
    +});
    +},disable:function(jq){
    +return jq.each(function(){
    +_42f(this,true);
    +_42c(this);
    +});
    +},getValue:function(jq){
    +return jq.val();
    +},setValue:function(jq,_438){
    +return jq.each(function(){
    +var opts=$.data(this,"spinner").options;
    +opts.value=_438;
    +$(this).val(_438);
    +});
    +},clear:function(jq){
    +return jq.each(function(){
    +var opts=$.data(this,"spinner").options;
    +opts.value="";
    +$(this).val("");
    +});
    +},reset:function(jq){
    +return jq.each(function(){
    +var opts=$(this).spinner("options");
    +$(this).spinner("setValue",opts.originalValue);
    +});
    +}};
    +$.fn.spinner.parseOptions=function(_439){
    +var t=$(_439);
    +return $.extend({},$.fn.validatebox.parseOptions(_439),$.parser.parseOptions(_439,["width","height","min","max",{increment:"number",editable:"boolean"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined)});
    +};
    +$.fn.spinner.defaults=$.extend({},$.fn.validatebox.defaults,{width:"auto",height:22,value:"",min:null,max:null,increment:1,editable:true,disabled:false,spin:function(down){
    +},onSpinUp:function(){
    +},onSpinDown:function(){
    +}});
    +})(jQuery);
    +(function($){
    +function _43a(_43b){
    +$(_43b).addClass("numberspinner-f");
    +var opts=$.data(_43b,"numberspinner").options;
    +$(_43b).spinner(opts).numberbox(opts);
    +};
    +function _43c(_43d,down){
    +var opts=$.data(_43d,"numberspinner").options;
    +var v=parseFloat($(_43d).numberbox("getValue")||opts.value)||0;
    +if(down==true){
    +v-=opts.increment;
    +}else{
    +v+=opts.increment;
    +}
    +$(_43d).numberbox("setValue",v);
    +};
    +$.fn.numberspinner=function(_43e,_43f){
    +if(typeof _43e=="string"){
    +var _440=$.fn.numberspinner.methods[_43e];
    +if(_440){
    +return _440(this,_43f);
    +}else{
    +return this.spinner(_43e,_43f);
    +}
    +}
    +_43e=_43e||{};
    +return this.each(function(){
    +var _441=$.data(this,"numberspinner");
    +if(_441){
    +$.extend(_441.options,_43e);
    +}else{
    +$.data(this,"numberspinner",{options:$.extend({},$.fn.numberspinner.defaults,$.fn.numberspinner.parseOptions(this),_43e)});
    +}
    +_43a(this);
    +});
    +};
    +$.fn.numberspinner.methods={options:function(jq){
    +var opts=$.data(jq[0],"numberspinner").options;
    +return $.extend(opts,{value:jq.numberbox("getValue"),originalValue:jq.numberbox("options").originalValue});
    +},setValue:function(jq,_442){
    +return jq.each(function(){
    +$(this).numberbox("setValue",_442);
    +});
    +},getValue:function(jq){
    +return jq.numberbox("getValue");
    +},clear:function(jq){
    +return jq.each(function(){
    +$(this).spinner("clear");
    +$(this).numberbox("clear");
    +});
    +},reset:function(jq){
    +return jq.each(function(){
    +var opts=$(this).numberspinner("options");
    +$(this).numberspinner("setValue",opts.originalValue);
    +});
    +}};
    +$.fn.numberspinner.parseOptions=function(_443){
    +return $.extend({},$.fn.spinner.parseOptions(_443),$.fn.numberbox.parseOptions(_443),{});
    +};
    +$.fn.numberspinner.defaults=$.extend({},$.fn.spinner.defaults,$.fn.numberbox.defaults,{spin:function(down){
    +_43c(this,down);
    +}});
    +})(jQuery);
    +(function($){
    +function _444(_445){
    +var opts=$.data(_445,"timespinner").options;
    +$(_445).addClass("timespinner-f");
    +$(_445).spinner(opts);
    +$(_445).unbind(".timespinner");
    +$(_445).bind("click.timespinner",function(){
    +var _446=0;
    +if(this.selectionStart!=null){
    +_446=this.selectionStart;
    +}else{
    +if(this.createTextRange){
    +var _447=_445.createTextRange();
    +var s=document.selection.createRange();
    +s.setEndPoint("StartToStart",_447);
    +_446=s.text.length;
    +}
    +}
    +if(_446>=0&&_446<=2){
    +opts.highlight=0;
    +}else{
    +if(_446>=3&&_446<=5){
    +opts.highlight=1;
    +}else{
    +if(_446>=6&&_446<=8){
    +opts.highlight=2;
    +}
    +}
    +}
    +_449(_445);
    +}).bind("blur.timespinner",function(){
    +_448(_445);
    +});
    +};
    +function _449(_44a){
    +var opts=$.data(_44a,"timespinner").options;
    +var _44b=0,end=0;
    +if(opts.highlight==0){
    +_44b=0;
    +end=2;
    +}else{
    +if(opts.highlight==1){
    +_44b=3;
    +end=5;
    +}else{
    +if(opts.highlight==2){
    +_44b=6;
    +end=8;
    +}
    +}
    +}
    +if(_44a.selectionStart!=null){
    +_44a.setSelectionRange(_44b,end);
    +}else{
    +if(_44a.createTextRange){
    +var _44c=_44a.createTextRange();
    +_44c.collapse();
    +_44c.moveEnd("character",end);
    +_44c.moveStart("character",_44b);
    +_44c.select();
    +}
    +}
    +$(_44a).focus();
    +};
    +function _44d(_44e,_44f){
    +var opts=$.data(_44e,"timespinner").options;
    +if(!_44f){
    +return null;
    +}
    +var vv=_44f.split(opts.separator);
    +for(var i=0;i<vv.length;i++){
    +if(isNaN(vv[i])){
    +return null;
    +}
    +}
    +while(vv.length<3){
    +vv.push(0);
    +}
    +return new Date(1900,0,0,vv[0],vv[1],vv[2]);
    +};
    +function _448(_450){
    +var opts=$.data(_450,"timespinner").options;
    +var _451=$(_450).val();
    +var time=_44d(_450,_451);
    +if(!time){
    +time=_44d(_450,opts.value);
    +}
    +if(!time){
    +opts.value="";
    +$(_450).val("");
    +return;
    +}
    +var _452=_44d(_450,opts.min);
    +var _453=_44d(_450,opts.max);
    +if(_452&&_452>time){
    +time=_452;
    +}
    +if(_453&&_453<time){
    +time=_453;
    +}
    +var tt=[_454(time.getHours()),_454(time.getMinutes())];
    +if(opts.showSeconds){
    +tt.push(_454(time.getSeconds()));
    +}
    +var val=tt.join(opts.separator);
    +opts.value=val;
    +$(_450).val(val);
    +function _454(_455){
    +return (_455<10?"0":"")+_455;
    +};
    +};
    +function _456(_457,down){
    +var opts=$.data(_457,"timespinner").options;
    +var val=$(_457).val();
    +if(val==""){
    +val=[0,0,0].join(opts.separator);
    +}
    +var vv=val.split(opts.separator);
    +for(var i=0;i<vv.length;i++){
    +vv[i]=parseInt(vv[i],10);
    +}
    +if(down==true){
    +vv[opts.highlight]-=opts.increment;
    +}else{
    +vv[opts.highlight]+=opts.increment;
    +}
    +$(_457).val(vv.join(opts.separator));
    +_448(_457);
    +_449(_457);
    +};
    +$.fn.timespinner=function(_458,_459){
    +if(typeof _458=="string"){
    +var _45a=$.fn.timespinner.methods[_458];
    +if(_45a){
    +return _45a(this,_459);
    +}else{
    +return this.spinner(_458,_459);
    +}
    +}
    +_458=_458||{};
    +return this.each(function(){
    +var _45b=$.data(this,"timespinner");
    +if(_45b){
    +$.extend(_45b.options,_458);
    +}else{
    +$.data(this,"timespinner",{options:$.extend({},$.fn.timespinner.defaults,$.fn.timespinner.parseOptions(this),_458)});
    +_444(this);
    +}
    +});
    +};
    +$.fn.timespinner.methods={options:function(jq){
    +var opts=$.data(jq[0],"timespinner").options;
    +return $.extend(opts,{value:jq.val(),originalValue:jq.spinner("options").originalValue});
    +},setValue:function(jq,_45c){
    +return jq.each(function(){
    +$(this).val(_45c);
    +_448(this);
    +});
    +},getHours:function(jq){
    +var opts=$.data(jq[0],"timespinner").options;
    +var vv=jq.val().split(opts.separator);
    +return parseInt(vv[0],10);
    +},getMinutes:function(jq){
    +var opts=$.data(jq[0],"timespinner").options;
    +var vv=jq.val().split(opts.separator);
    +return parseInt(vv[1],10);
    +},getSeconds:function(jq){
    +var opts=$.data(jq[0],"timespinner").options;
    +var vv=jq.val().split(opts.separator);
    +return parseInt(vv[2],10)||0;
    +}};
    +$.fn.timespinner.parseOptions=function(_45d){
    +return $.extend({},$.fn.spinner.parseOptions(_45d),$.parser.parseOptions(_45d,["separator",{showSeconds:"boolean",highlight:"number"}]));
    +};
    +$.fn.timespinner.defaults=$.extend({},$.fn.spinner.defaults,{separator:":",showSeconds:false,highlight:0,spin:function(down){
    +_456(this,down);
    +}});
    +})(jQuery);
    +(function($){
    +var _45e=0;
    +function _45f(a,o){
    +for(var i=0,len=a.length;i<len;i++){
    +if(a[i]==o){
    +return i;
    +}
    +}
    +return -1;
    +};
    +function _460(a,o,id){
    +if(typeof o=="string"){
    +for(var i=0,len=a.length;i<len;i++){
    +if(a[i][o]==id){
    +a.splice(i,1);
    +return;
    +}
    +}
    +}else{
    +var _461=_45f(a,o);
    +if(_461!=-1){
    +a.splice(_461,1);
    +}
    +}
    +};
    +function _462(a,o,r){
    +for(var i=0,len=a.length;i<len;i++){
    +if(a[i][o]==r[o]){
    +return;
    +}
    +}
    +a.push(r);
    +};
    +function _463(_464,_465){
    +var opts=$.data(_464,"datagrid").options;
    +var _466=$.data(_464,"datagrid").panel;
    +if(_465){
    +if(_465.width){
    +opts.width=_465.width;
    +}
    +if(_465.height){
    +opts.height=_465.height;
    +}
    +}
    +if(opts.fit==true){
    +var p=_466.panel("panel").parent();
    +opts.width=p.width();
    +opts.height=p.height();
    +}
    +_466.panel("resize",{width:opts.width,height:opts.height});
    +};
    +function _467(_468){
    +var opts=$.data(_468,"datagrid").options;
    +var dc=$.data(_468,"datagrid").dc;
    +var wrap=$.data(_468,"datagrid").panel;
    +var _469=wrap.width();
    +var _46a=wrap.height();
    +var view=dc.view;
    +var _46b=dc.view1;
    +var _46c=dc.view2;
    +var _46d=_46b.children("div.datagrid-header");
    +var _46e=_46c.children("div.datagrid-header");
    +var _46f=_46d.find("table");
    +var _470=_46e.find("table");
    +view.width(_469);
    +var _471=_46d.children("div.datagrid-header-inner").show();
    +_46b.width(_471.find("table").width());
    +if(!opts.showHeader){
    +_471.hide();
    +}
    +_46c.width(_469-_46b._outerWidth());
    +_46b.children("div.datagrid-header,div.datagrid-body,div.datagrid-footer").width(_46b.width());
    +_46c.children("div.datagrid-header,div.datagrid-body,div.datagrid-footer").width(_46c.width());
    +var hh;
    +_46d.css("height","");
    +_46e.css("height","");
    +_46f.css("height","");
    +_470.css("height","");
    +hh=Math.max(_46f.height(),_470.height());
    +_46f.height(hh);
    +_470.height(hh);
    +_46d.add(_46e)._outerHeight(hh);
    +if(opts.height!="auto"){
    +var _472=_46a-_46c.children("div.datagrid-header")._outerHeight()-_46c.children("div.datagrid-footer")._outerHeight()-wrap.children("div.datagrid-toolbar")._outerHeight();
    +wrap.children("div.datagrid-pager").each(function(){
    +_472-=$(this)._outerHeight();
    +});
    +dc.body1.add(dc.body2).children("table.datagrid-btable-frozen").css({position:"absolute",top:dc.header2._outerHeight()});
    +var _473=dc.body2.children("table.datagrid-btable-frozen")._outerHeight();
    +_46b.add(_46c).children("div.datagrid-body").css({marginTop:_473,height:(_472-_473)});
    +}
    +view.height(_46c.height());
    +};
    +function _474(_475,_476,_477){
    +var rows=$.data(_475,"datagrid").data.rows;
    +var opts=$.data(_475,"datagrid").options;
    +var dc=$.data(_475,"datagrid").dc;
    +if(!dc.body1.is(":empty")&&(!opts.nowrap||opts.autoRowHeight||_477)){
    +if(_476!=undefined){
    +var tr1=opts.finder.getTr(_475,_476,"body",1);
    +var tr2=opts.finder.getTr(_475,_476,"body",2);
    +_478(tr1,tr2);
    +}else{
    +var tr1=opts.finder.getTr(_475,0,"allbody",1);
    +var tr2=opts.finder.getTr(_475,0,"allbody",2);
    +_478(tr1,tr2);
    +if(opts.showFooter){
    +var tr1=opts.finder.getTr(_475,0,"allfooter",1);
    +var tr2=opts.finder.getTr(_475,0,"allfooter",2);
    +_478(tr1,tr2);
    +}
    +}
    +}
    +_467(_475);
    +if(opts.height=="auto"){
    +var _479=dc.body1.parent();
    +var _47a=dc.body2;
    +var _47b=0;
    +var _47c=0;
    +_47a.children().each(function(){
    +var c=$(this);
    +if(c.is(":visible")){
    +_47b+=c._outerHeight();
    +if(_47c<c._outerWidth()){
    +_47c=c._outerWidth();
    +}
    +}
    +});
    +if(_47c>_47a.width()){
    +_47b+=18;
    +}
    +_479.height(_47b);
    +_47a.height(_47b);
    +dc.view.height(dc.view2.height());
    +}
    +dc.body2.triggerHandler("scroll");
    +function _478(trs1,trs2){
    +for(var i=0;i<trs2.length;i++){
    +var tr1=$(trs1[i]);
    +var tr2=$(trs2[i]);
    +tr1.css("height","");
    +tr2.css("height","");
    +var _47d=Math.max(tr1.height(),tr2.height());
    +tr1.css("height",_47d);
    +tr2.css("height",_47d);
    +}
    +};
    +};
    +function _47e(_47f,_480){
    +var _481=$.data(_47f,"datagrid");
    +var opts=_481.options;
    +var dc=_481.dc;
    +if(!dc.body2.children("table.datagrid-btable-frozen").length){
    +dc.body1.add(dc.body2).prepend("<table class=\"datagrid-btable datagrid-btable-frozen\" cellspacing=\"0\" cellpadding=\"0\"></table>");
    +}
    +_482(true);
    +_482(false);
    +_467(_47f);
    +function _482(_483){
    +var _484=_483?1:2;
    +var tr=opts.finder.getTr(_47f,_480,"body",_484);
    +(_483?dc.body1:dc.body2).children("table.datagrid-btable-frozen").append(tr);
    +};
    +};
    +function _485(_486,_487){
    +function _488(){
    +var _489=[];
    +var _48a=[];
    +$(_486).children("thead").each(function(){
    +var opt=$.parser.parseOptions(this,[{frozen:"boolean"}]);
    +$(this).find("tr").each(function(){
    +var cols=[];
    +$(this).find("th").each(function(){
    +var th=$(this);
    +var col=$.extend({},$.parser.parseOptions(this,["field","align","halign","order",{sortable:"boolean",checkbox:"boolean",resizable:"boolean"},{rowspan:"number",colspan:"number",width:"number"}]),{title:(th.html()||undefined),hidden:(th.attr("hidden")?true:undefined),formatter:(th.attr("formatter")?eval(th.attr("formatter")):undefined),styler:(th.attr("styler")?eval(th.attr("styler")):undefined),sorter:(th.attr("sorter")?eval(th.attr("sorter")):undefined)});
    +if(th.attr("editor")){
    +var s=$.trim(th.attr("editor"));
    +if(s.substr(0,1)=="{"){
    +col.editor=eval("("+s+")");
    +}else{
    +col.editor=s;
    +}
    +}
    +cols.push(col);
    +});
    +opt.frozen?_489.push(cols):_48a.push(cols);
    +});
    +});
    +return [_489,_48a];
    +};
    +var _48b=$("<div class=\"datagrid-wrap\">"+"<div class=\"datagrid-view\">"+"<div class=\"datagrid-view1\">"+"<div class=\"datagrid-header\">"+"<div class=\"datagrid-header-inner\"></div>"+"</div>"+"<div class=\"datagrid-body\">"+"<div class=\"datagrid-body-inner\"></div>"+"</div>"+"<div class=\"datagrid-footer\">"+"<div class=\"datagrid-footer-inner\"></div>"+"</div>"+"</div>"+"<div class=\"datagrid-view2\">"+"<div class=\"datagrid-header\">"+"<div class=\"datagrid-header-inner\"></div>"+"</div>"+"<div class=\"datagrid-body\"></div>"+"<div class=\"datagrid-footer\">"+"<div class=\"datagrid-footer-inner\"></div>"+"</div>"+"</div>"+"</div>"+"</div>").insertAfter(_486);
    +_48b.panel({doSize:false});
    +_48b.panel("panel").addClass("datagrid").bind("_resize",function(e,_48c){
    +var opts=$.data(_486,"datagrid").options;
    +if(opts.fit==true||_48c){
    +_463(_486);
    +setTimeout(function(){
    +if($.data(_486,"datagrid")){
    +_48d(_486);
    +}
    +},0);
    +}
    +return false;
    +});
    +$(_486).hide().appendTo(_48b.children("div.datagrid-view"));
    +var cc=_488();
    +var view=_48b.children("div.datagrid-view");
    +var _48e=view.children("div.datagrid-view1");
    +var _48f=view.children("div.datagrid-view2");
    +return {panel:_48b,frozenColumns:cc[0],columns:cc[1],dc:{view:view,view1:_48e,view2:_48f,header1:_48e.children("div.datagrid-header").children("div.datagrid-header-inner"),header2:_48f.children("div.datagrid-header").children("div.datagrid-header-inner"),body1:_48e.children("div.datagrid-body").children("div.datagrid-body-inner"),body2:_48f.children("div.datagrid-body"),footer1:_48e.children("div.datagrid-footer").children("div.datagrid-footer-inner"),footer2:_48f.children("div.datagrid-footer").children("div.datagrid-footer-inner")}};
    +};
    +function _490(_491){
    +var data={total:0,rows:[]};
    +var _492=_493(_491,true).concat(_493(_491,false));
    +$(_491).find("tbody tr").each(function(){
    +data.total++;
    +var col={};
    +for(var i=0;i<_492.length;i++){
    +col[_492[i]]=$("td:eq("+i+")",this).html();
    +}
    +data.rows.push(col);
    +});
    +return data;
    +};
    +function _494(_495){
    +var _496=$.data(_495,"datagrid");
    +var opts=_496.options;
    +var dc=_496.dc;
    +var _497=_496.panel;
    +_497.panel($.extend({},opts,{id:null,doSize:false,onResize:function(_498,_499){
    +setTimeout(function(){
    +if($.data(_495,"datagrid")){
    +_467(_495);
    +_4b7(_495);
    +opts.onResize.call(_497,_498,_499);
    +}
    +},0);
    +},onExpand:function(){
    +_474(_495);
    +opts.onExpand.call(_497);
    +}}));
    +_496.rowIdPrefix="datagrid-row-r"+(++_45e);
    +_49a(dc.header1,opts.frozenColumns,true);
    +_49a(dc.header2,opts.columns,false);
    +_49b();
    +dc.header1.add(dc.header2).css("display",opts.showHeader?"block":"none");
    +dc.footer1.add(dc.footer2).css("display",opts.showFooter?"block":"none");
    +if(opts.toolbar){
    +if(typeof opts.toolbar=="string"){
    +$(opts.toolbar).addClass("datagrid-toolbar").prependTo(_497);
    +$(opts.toolbar).show();
    +}else{
    +$("div.datagrid-toolbar",_497).remove();
    +var tb=$("<div class=\"datagrid-toolbar\"><table cellspacing=\"0\" cellpadding=\"0\"><tr></tr></table></div>").prependTo(_497);
    +var tr=tb.find("tr");
    +for(var i=0;i<opts.toolbar.length;i++){
    +var btn=opts.toolbar[i];
    +if(btn=="-"){
    +$("<td><div class=\"datagrid-btn-separator\"></div></td>").appendTo(tr);
    +}else{
    +var td=$("<td></td>").appendTo(tr);
    +var tool=$("<a href=\"javascript:void(0)\"></a>").appendTo(td);
    +tool[0].onclick=eval(btn.handler||function(){
    +});
    +tool.linkbutton($.extend({},btn,{plain:true}));
    +}
    +}
    +}
    +}else{
    +$("div.datagrid-toolbar",_497).remove();
    +}
    +$("div.datagrid-pager",_497).remove();
    +if(opts.pagination){
    +var _49c=$("<div class=\"datagrid-pager\"></div>");
    +if(opts.pagePosition=="bottom"){
    +_49c.appendTo(_497);
    +}else{
    +if(opts.pagePosition=="top"){
    +_49c.addClass("datagrid-pager-top").prependTo(_497);
    +}else{
    +var ptop=$("<div class=\"datagrid-pager datagrid-pager-top\"></div>").prependTo(_497);
    +_49c.appendTo(_497);
    +_49c=_49c.add(ptop);
    +}
    +}
    +_49c.pagination({total:0,pageNumber:opts.pageNumber,pageSize:opts.pageSize,pageList:opts.pageList,onSelectPage:function(_49d,_49e){
    +opts.pageNumber=_49d;
    +opts.pageSize=_49e;
    +_49c.pagination("refresh",{pageNumber:_49d,pageSize:_49e});
    +_576(_495);
    +}});
    +opts.pageSize=_49c.pagination("options").pageSize;
    +}
    +function _49a(_49f,_4a0,_4a1){
    +if(!_4a0){
    +return;
    +}
    +$(_49f).show();
    +$(_49f).empty();
    +var t=$("<table class=\"datagrid-htable\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tbody></tbody></table>").appendTo(_49f);
    +for(var i=0;i<_4a0.length;i++){
    +var tr=$("<tr class=\"datagrid-header-row\"></tr>").appendTo($("tbody",t));
    +var cols=_4a0[i];
    +for(var j=0;j<cols.length;j++){
    +var col=cols[j];
    +var attr="";
    +if(col.rowspan){
    +attr+="rowspan=\""+col.rowspan+"\" ";
    +}
    +if(col.colspan){
    +attr+="colspan=\""+col.colspan+"\" ";
    +}
    +var td=$("<td "+attr+"></td>").appendTo(tr);
    +if(col.checkbox){
    +td.attr("field",col.field);
    +$("<div class=\"datagrid-header-check\"></div>").html("<input type=\"checkbox\"/>").appendTo(td);
    +}else{
    +if(col.field){
    +td.attr("field",col.field);
    +td.append("<div class=\"datagrid-cell\"><span></span><span class=\"datagrid-sort-icon\"></span></div>");
    +$("span",td).html(col.title);
    +$("span.datagrid-sort-icon",td).html("&nbsp;");
    +var cell=td.find("div.datagrid-cell");
    +if(col.resizable==false){
    +cell.attr("resizable","false");
    +}
    +if(col.width){
    +cell._outerWidth(col.width);
    +col.boxWidth=parseInt(cell[0].style.width);
    +}else{
    +col.auto=true;
    +}
    +cell.css("text-align",(col.halign||col.align||""));
    +col.cellClass="datagrid-cell-c"+_45e+"-"+col.field.replace(/\./g,"-");
    +col.cellSelector="div."+col.cellClass;
    +}else{
    +$("<div class=\"datagrid-cell-group\"></div>").html(col.title).appendTo(td);
    +}
    +}
    +if(col.hidden){
    +td.hide();
    +}
    +}
    +}
    +if(_4a1&&opts.rownumbers){
    +var td=$("<td rowspan=\""+opts.frozenColumns.length+"\"><div class=\"datagrid-header-rownumber\"></div></td>");
    +if($("tr",t).length==0){
    +td.wrap("<tr class=\"datagrid-header-row\"></tr>").parent().appendTo($("tbody",t));
    +}else{
    +td.prependTo($("tr:first",t));
    +}
    +}
    +};
    +function _49b(){
    +var ss=["<style type=\"text/css\">"];
    +var _4a2=_493(_495,true).concat(_493(_495));
    +for(var i=0;i<_4a2.length;i++){
    +var col=_4a3(_495,_4a2[i]);
    +if(col&&!col.checkbox){
    +ss.push(col.cellSelector+" {width:"+col.boxWidth+"px;}");
    +}
    +}
    +ss.push("</style>");
    +$(ss.join("\n")).prependTo(dc.view);
    +};
    +};
    +function _4a4(_4a5){
    +var _4a6=$.data(_4a5,"datagrid");
    +var _4a7=_4a6.panel;
    +var opts=_4a6.options;
    +var dc=_4a6.dc;
    +var _4a8=dc.header1.add(dc.header2);
    +_4a8.find("input[type=checkbox]").unbind(".datagrid").bind("click.datagrid",function(e){
    +if(opts.singleSelect&&opts.selectOnCheck){
    +return false;
    +}
    +if($(this).is(":checked")){
    +_511(_4a5);
    +}else{
    +_517(_4a5);
    +}
    +e.stopPropagation();
    +});
    +var _4a9=_4a8.find("div.datagrid-cell");
    +_4a9.closest("td").unbind(".datagrid").bind("mouseenter.datagrid",function(){
    +if(_4a6.resizing){
    +return;
    +}
    +$(this).addClass("datagrid-header-over");
    +}).bind("mouseleave.datagrid",function(){
    +$(this).removeClass("datagrid-header-over");
    +}).bind("contextmenu.datagrid",function(e){
    +var _4aa=$(this).attr("field");
    +opts.onHeaderContextMenu.call(_4a5,e,_4aa);
    +});
    +_4a9.unbind(".datagrid").bind("click.datagrid",function(e){
    +var p1=$(this).offset().left+5;
    +var p2=$(this).offset().left+$(this)._outerWidth()-5;
    +if(e.pageX<p2&&e.pageX>p1){
    +var _4ab=$(this).parent().attr("field");
    +var col=_4a3(_4a5,_4ab);
    +if(!col.sortable||_4a6.resizing){
    +return;
    +}
    +opts.sortName=_4ab;
    +opts.sortOrder=col.order||"asc";
    +var cls="datagrid-sort-"+opts.sortOrder;
    +if($(this).hasClass("datagrid-sort-asc")){
    +cls="datagrid-sort-desc";
    +opts.sortOrder="desc";
    +}else{
    +if($(this).hasClass("datagrid-sort-desc")){
    +cls="datagrid-sort-asc";
    +opts.sortOrder="asc";
    +}
    +}
    +_4a9.removeClass("datagrid-sort-asc datagrid-sort-desc");
    +$(this).addClass(cls);
    +if(opts.remoteSort){
    +_576(_4a5);
    +}else{
    +var data=$.data(_4a5,"datagrid").data;
    +_4e5(_4a5,data);
    +}
    +opts.onSortColumn.call(_4a5,opts.sortName,opts.sortOrder);
    +}
    +}).bind("dblclick.datagrid",function(e){
    +var p1=$(this).offset().left+5;
    +var p2=$(this).offset().left+$(this)._outerWidth()-5;
    +var cond=opts.resizeHandle=="right"?(e.pageX>p2):(opts.resizeHandle=="left"?(e.pageX<p1):(e.pageX<p1||e.pageX>p2));
    +if(cond){
    +var _4ac=$(this).parent().attr("field");
    +var col=_4a3(_4a5,_4ac);
    +if(col.resizable==false){
    +return;
    +}
    +$(_4a5).datagrid("autoSizeColumn",_4ac);
    +col.auto=false;
    +}
    +});
    +var _4ad=opts.resizeHandle=="right"?"e":(opts.resizeHandle=="left"?"w":"e,w");
    +_4a9.each(function(){
    +$(this).resizable({handles:_4ad,disabled:($(this).attr("resizable")?$(this).attr("resizable")=="false":false),minWidth:25,onStartResize:function(e){
    +_4a6.resizing=true;
    +_4a8.css("cursor",$("body").css("cursor"));
    +if(!_4a6.proxy){
    +_4a6.proxy=$("<div class=\"datagrid-resize-proxy\"></div>").appendTo(dc.view);
    +}
    +_4a6.proxy.css({left:e.pageX-$(_4a7).offset().left-1,display:"none"});
    +setTimeout(function(){
    +if(_4a6.proxy){
    +_4a6.proxy.show();
    +}
    +},500);
    +},onResize:function(e){
    +_4a6.proxy.css({left:e.pageX-$(_4a7).offset().left-1,display:"block"});
    +return false;
    +},onStopResize:function(e){
    +_4a8.css("cursor","");
    +var _4ae=$(this).parent().attr("field");
    +var col=_4a3(_4a5,_4ae);
    +col.width=$(this)._outerWidth();
    +col.boxWidth=parseInt(this.style.width);
    +col.auto=undefined;
    +_48d(_4a5,_4ae);
    +_4a6.proxy.remove();
    +_4a6.proxy=null;
    +if($(this).parents("div:first.datagrid-header").parent().hasClass("datagrid-view1")){
    +_467(_4a5);
    +}
    +_4b7(_4a5);
    +opts.onResizeColumn.call(_4a5,_4ae,col.width);
    +setTimeout(function(){
    +_4a6.resizing=false;
    +},0);
    +}});
    +});
    +dc.body1.add(dc.body2).unbind().bind("mouseover",function(e){
    +if(_4a6.resizing){
    +return;
    +}
    +var tr=$(e.target).closest("tr.datagrid-row");
    +if(!tr.length){
    +return;
    +}
    +var _4af=_4b0(tr);
    +opts.finder.getTr(_4a5,_4af).addClass("datagrid-row-over");
    +e.stopPropagation();
    +}).bind("mouseout",function(e){
    +var tr=$(e.target).closest("tr.datagrid-row");
    +if(!tr.length){
    +return;
    +}
    +var _4b1=_4b0(tr);
    +opts.finder.getTr(_4a5,_4b1).removeClass("datagrid-row-over");
    +e.stopPropagation();
    +}).bind("click",function(e){
    +var tt=$(e.target);
    +var tr=tt.closest("tr.datagrid-row");
    +if(!tr.length){
    +return;
    +}
    +var _4b2=_4b0(tr);
    +if(tt.parent().hasClass("datagrid-cell-check")){
    +if(opts.singleSelect&&opts.selectOnCheck){
    +if(!opts.checkOnSelect){
    +_517(_4a5,true);
    +}
    +_501(_4a5,_4b2);
    +}else{
    +if(tt.is(":checked")){
    +_501(_4a5,_4b2);
    +}else{
    +_50b(_4a5,_4b2);
    +}
    +}
    +}else{
    +var row=opts.finder.getRow(_4a5,_4b2);
    +var td=tt.closest("td[field]",tr);
    +if(td.length){
    +var _4b3=td.attr("field");
    +opts.onClickCell.call(_4a5,_4b2,_4b3,row[_4b3]);
    +}
    +if(opts.singleSelect==true){
    +_4fa(_4a5,_4b2);
    +}else{
    +if(tr.hasClass("datagrid-row-selected")){
    +_505(_4a5,_4b2);
    +}else{
    +_4fa(_4a5,_4b2);
    +}
    +}
    +opts.onClickRow.call(_4a5,_4b2,row);
    +}
    +e.stopPropagation();
    +}).bind("dblclick",function(e){
    +var tt=$(e.target);
    +var tr=tt.closest("tr.datagrid-row");
    +if(!tr.length){
    +return;
    +}
    +var _4b4=_4b0(tr);
    +var row=opts.finder.getRow(_4a5,_4b4);
    +var td=tt.closest("td[field]",tr);
    +if(td.length){
    +var _4b5=td.attr("field");
    +opts.onDblClickCell.call(_4a5,_4b4,_4b5,row[_4b5]);
    +}
    +opts.onDblClickRow.call(_4a5,_4b4,row);
    +e.stopPropagation();
    +}).bind("contextmenu",function(e){
    +var tr=$(e.target).closest("tr.datagrid-row");
    +if(!tr.length){
    +return;
    +}
    +var _4b6=_4b0(tr);
    +var row=opts.finder.getRow(_4a5,_4b6);
    +opts.onRowContextMenu.call(_4a5,e,_4b6,row);
    +e.stopPropagation();
    +});
    +dc.body2.bind("scroll",function(){
    +dc.view1.children("div.datagrid-body").scrollTop($(this).scrollTop());
    +dc.view2.children("div.datagrid-header,div.datagrid-footer")._scrollLeft($(this)._scrollLeft());
    +dc.body2.children("table.datagrid-btable-frozen").css("left",-$(this)._scrollLeft());
    +});
    +function _4b0(tr){
    +if(tr.attr("datagrid-row-index")){
    +return parseInt(tr.attr("datagrid-row-index"));
    +}else{
    +return tr.attr("node-id");
    +}
    +};
    +};
    +function _4b7(_4b8){
    +var opts=$.data(_4b8,"datagrid").options;
    +var dc=$.data(_4b8,"datagrid").dc;
    +if(!opts.fitColumns){
    +return;
    +}
    +var _4b9=dc.view2.children("div.datagrid-header");
    +var _4ba=0;
    +var _4bb;
    +var _4bc=_493(_4b8,false);
    +for(var i=0;i<_4bc.length;i++){
    +var col=_4a3(_4b8,_4bc[i]);
    +if(_4bd(col)){
    +_4ba+=col.width;
    +_4bb=col;
    +}
    +}
    +var _4be=_4b9.children("div.datagrid-header-inner").show();
    +var _4bf=_4b9.width()-_4b9.find("table").width()-opts.scrollbarSize;
    +var rate=_4bf/_4ba;
    +if(!opts.showHeader){
    +_4be.hide();
    +}
    +for(var i=0;i<_4bc.length;i++){
    +var col=_4a3(_4b8,_4bc[i]);
    +if(_4bd(col)){
    +var _4c0=Math.floor(col.width*rate);
    +_4c1(col,_4c0);
    +_4bf-=_4c0;
    +}
    +}
    +if(_4bf&&_4bb){
    +_4c1(_4bb,_4bf);
    +}
    +_48d(_4b8);
    +function _4c1(col,_4c2){
    +col.width+=_4c2;
    +col.boxWidth+=_4c2;
    +_4b9.find("td[field=\""+col.field+"\"] div.datagrid-cell").width(col.boxWidth);
    +};
    +function _4bd(col){
    +if(!col.hidden&&!col.checkbox&&!col.auto){
    +return true;
    +}
    +};
    +};
    +function _4c3(_4c4,_4c5){
    +var opts=$.data(_4c4,"datagrid").options;
    +var dc=$.data(_4c4,"datagrid").dc;
    +if(_4c5){
    +_463(_4c5);
    +if(opts.fitColumns){
    +_467(_4c4);
    +_4b7(_4c4);
    +}
    +}else{
    +var _4c6=false;
    +var _4c7=_493(_4c4,true).concat(_493(_4c4,false));
    +for(var i=0;i<_4c7.length;i++){
    +var _4c5=_4c7[i];
    +var col=_4a3(_4c4,_4c5);
    +if(col.auto){
    +_463(_4c5);
    +_4c6=true;
    +}
    +}
    +if(_4c6&&opts.fitColumns){
    +_467(_4c4);
    +_4b7(_4c4);
    +}
    +}
    +function _463(_4c8){
    +var _4c9=dc.view.find("div.datagrid-header td[field=\""+_4c8+"\"] div.datagrid-cell");
    +_4c9.css("width","");
    +var col=$(_4c4).datagrid("getColumnOption",_4c8);
    +col.width=undefined;
    +col.boxWidth=undefined;
    +col.auto=true;
    +$(_4c4).datagrid("fixColumnSize",_4c8);
    +var _4ca=Math.max(_4c9._outerWidth(),_4cb("allbody"),_4cb("allfooter"));
    +_4c9._outerWidth(_4ca);
    +col.width=_4ca;
    +col.boxWidth=parseInt(_4c9[0].style.width);
    +$(_4c4).datagrid("fixColumnSize",_4c8);
    +opts.onResizeColumn.call(_4c4,_4c8,col.width);
    +function _4cb(type){
    +var _4cc=0;
    +opts.finder.getTr(_4c4,0,type).find("td[field=\""+_4c8+"\"] div.datagrid-cell").each(function(){
    +var w=$(this)._outerWidth();
    +if(_4cc<w){
    +_4cc=w;
    +}
    +});
    +return _4cc;
    +};
    +};
    +};
    +function _48d(_4cd,_4ce){
    +var opts=$.data(_4cd,"datagrid").options;
    +var dc=$.data(_4cd,"datagrid").dc;
    +var _4cf=dc.view.find("table.datagrid-btable,table.datagrid-ftable");
    +_4cf.css("table-layout","fixed");
    +if(_4ce){
    +fix(_4ce);
    +}else{
    +var ff=_493(_4cd,true).concat(_493(_4cd,false));
    +for(var i=0;i<ff.length;i++){
    +fix(ff[i]);
    +}
    +}
    +_4cf.css("table-layout","auto");
    +_4d0(_4cd);
    +setTimeout(function(){
    +_474(_4cd);
    +_4d8(_4cd);
    +},0);
    +function fix(_4d1){
    +var col=_4a3(_4cd,_4d1);
    +if(col.checkbox){
    +return;
    +}
    +var _4d2=dc.view.children("style")[0];
    +var _4d3=_4d2.styleSheet?_4d2.styleSheet:(_4d2.sheet||document.styleSheets[document.styleSheets.length-1]);
    +var _4d4=_4d3.cssRules||_4d3.rules;
    +for(var i=0,len=_4d4.length;i<len;i++){
    +var rule=_4d4[i];
    +if(rule.selectorText.toLowerCase()==col.cellSelector.toLowerCase()){
    +rule.style["width"]=col.boxWidth?col.boxWidth+"px":"auto";
    +break;
    +}
    +}
    +};
    +};
    +function _4d0(_4d5){
    +var dc=$.data(_4d5,"datagrid").dc;
    +dc.body1.add(dc.body2).find("td.datagrid-td-merged").each(function(){
    +var td=$(this);
    +var _4d6=td.attr("colspan")||1;
    +var _4d7=_4a3(_4d5,td.attr("field")).width;
    +for(var i=1;i<_4d6;i++){
    +td=td.next();
    +_4d7+=_4a3(_4d5,td.attr("field")).width+1;
    +}
    +$(this).children("div.datagrid-cell")._outerWidth(_4d7);
    +});
    +};
    +function _4d8(_4d9){
    +var dc=$.data(_4d9,"datagrid").dc;
    +dc.view.find("div.datagrid-editable").each(function(){
    +var cell=$(this);
    +var _4da=cell.parent().attr("field");
    +var col=$(_4d9).datagrid("getColumnOption",_4da);
    +cell._outerWidth(col.width);
    +var ed=$.data(this,"datagrid.editor");
    +if(ed.actions.resize){
    +ed.actions.resize(ed.target,cell.width());
    +}
    +});
    +};
    +function _4a3(_4db,_4dc){
    +function find(_4dd){
    +if(_4dd){
    +for(var i=0;i<_4dd.length;i++){
    +var cc=_4dd[i];
    +for(var j=0;j<cc.length;j++){
    +var c=cc[j];
    +if(c.field==_4dc){
    +return c;
    +}
    +}
    +}
    +}
    +return null;
    +};
    +var opts=$.data(_4db,"datagrid").options;
    +var col=find(opts.columns);
    +if(!col){
    +col=find(opts.frozenColumns);
    +}
    +return col;
    +};
    +function _493(_4de,_4df){
    +var opts=$.data(_4de,"datagrid").options;
    +var _4e0=(_4df==true)?(opts.frozenColumns||[[]]):opts.columns;
    +if(_4e0.length==0){
    +return [];
    +}
    +var _4e1=[];
    +function _4e2(_4e3){
    +var c=0;
    +var i=0;
    +while(true){
    +if(_4e1[i]==undefined){
    +if(c==_4e3){
    +return i;
    +}
    +c++;
    +}
    +i++;
    +}
    +};
    +function _4e4(r){
    +var ff=[];
    +var c=0;
    +for(var i=0;i<_4e0[r].length;i++){
    +var col=_4e0[r][i];
    +if(col.field){
    +ff.push([c,col.field]);
    +}
    +c+=parseInt(col.colspan||"1");
    +}
    +for(var i=0;i<ff.length;i++){
    +ff[i][0]=_4e2(ff[i][0]);
    +}
    +for(var i=0;i<ff.length;i++){
    +var f=ff[i];
    +_4e1[f[0]]=f[1];
    +}
    +};
    +for(var i=0;i<_4e0.length;i++){
    +_4e4(i);
    +}
    +return _4e1;
    +};
    +function _4e5(_4e6,data){
    +var _4e7=$.data(_4e6,"datagrid");
    +var opts=_4e7.options;
    +var dc=_4e7.dc;
    +data=opts.loadFilter.call(_4e6,data);
    +data.total=parseInt(data.total);
    +_4e7.data=data;
    +if(data.footer){
    +_4e7.footer=data.footer;
    +}
    +if(!opts.remoteSort){
    +var opt=_4a3(_4e6,opts.sortName);
    +if(opt){
    +var _4e8=opt.sorter||function(a,b){
    +return (a>b?1:-1);
    +};
    +data.rows.sort(function(r1,r2){
    +return _4e8(r1[opts.sortName],r2[opts.sortName])*(opts.sortOrder=="asc"?1:-1);
    +});
    +}
    +}
    +if(opts.view.onBeforeRender){
    +opts.view.onBeforeRender.call(opts.view,_4e6,data.rows);
    +}
    +opts.view.render.call(opts.view,_4e6,dc.body2,false);
    +opts.view.render.call(opts.view,_4e6,dc.body1,true);
    +if(opts.showFooter){
    +opts.view.renderFooter.call(opts.view,_4e6,dc.footer2,false);
    +opts.view.renderFooter.call(opts.view,_4e6,dc.footer1,true);
    +}
    +if(opts.view.onAfterRender){
    +opts.view.onAfterRender.call(opts.view,_4e6);
    +}
    +dc.view.children("style:gt(0)").remove();
    +opts.onLoadSuccess.call(_4e6,data);
    +var _4e9=$(_4e6).datagrid("getPager");
    +if(_4e9.length){
    +if(_4e9.pagination("options").total!=data.total){
    +_4e9.pagination("refresh",{total:data.total});
    +}
    +}
    +_474(_4e6);
    +dc.body2.triggerHandler("scroll");
    +_4ea();
    +$(_4e6).datagrid("autoSizeColumn");
    +function _4ea(){
    +if(opts.idField){
    +for(var i=0;i<data.rows.length;i++){
    +var row=data.rows[i];
    +if(_4eb(_4e7.selectedRows,row)){
    +_4fa(_4e6,i,true);
    +}
    +if(_4eb(_4e7.checkedRows,row)){
    +_501(_4e6,i,true);
    +}
    +}
    +}
    +function _4eb(a,r){
    +for(var i=0;i<a.length;i++){
    +if(a[i][opts.idField]==r[opts.idField]){
    +a[i]=r;
    +return true;
    +}
    +}
    +return false;
    +};
    +};
    +};
    +function _4ec(_4ed,row){
    +var opts=$.data(_4ed,"datagrid").options;
    +var rows=$.data(_4ed,"datagrid").data.rows;
    +if(typeof row=="object"){
    +return _45f(rows,row);
    +}else{
    +for(var i=0;i<rows.length;i++){
    +if(rows[i][opts.idField]==row){
    +return i;
    +}
    +}
    +return -1;
    +}
    +};
    +function _4ee(_4ef){
    +var _4f0=$.data(_4ef,"datagrid");
    +var opts=_4f0.options;
    +var data=_4f0.data;
    +if(opts.idField){
    +return _4f0.selectedRows;
    +}else{
    +var rows=[];
    +opts.finder.getTr(_4ef,"","selected",2).each(function(){
    +var _4f1=parseInt($(this).attr("datagrid-row-index"));
    +rows.push(data.rows[_4f1]);
    +});
    +return rows;
    +}
    +};
    +function _4f2(_4f3){
    +var _4f4=$.data(_4f3,"datagrid");
    +var opts=_4f4.options;
    +if(opts.idField){
    +return _4f4.checkedRows;
    +}else{
    +var rows=[];
    +_4f4.dc.view.find("div.datagrid-cell-check input:checked").each(function(){
    +var _4f5=$(this).closest("tr.datagrid-row").attr("datagrid-row-index");
    +rows.push(opts.finder.getRow(_4f3,_4f5));
    +});
    +return rows;
    +}
    +};
    +function _4f6(_4f7,_4f8){
    +var opts=$.data(_4f7,"datagrid").options;
    +if(opts.idField){
    +var _4f9=_4ec(_4f7,_4f8);
    +if(_4f9>=0){
    +_4fa(_4f7,_4f9);
    +}
    +}
    +};
    +function _4fa(_4fb,_4fc,_4fd){
    +var _4fe=$.data(_4fb,"datagrid");
    +var dc=_4fe.dc;
    +var opts=_4fe.options;
    +var _4ff=_4fe.selectedRows;
    +if(opts.singleSelect){
    +_500(_4fb);
    +_4ff.splice(0,_4ff.length);
    +}
    +if(!_4fd&&opts.checkOnSelect){
    +_501(_4fb,_4fc,true);
    +}
    +var row=opts.finder.getRow(_4fb,_4fc);
    +if(opts.idField){
    +_462(_4ff,opts.idField,row);
    +}
    +opts.onSelect.call(_4fb,_4fc,row);
    +var tr=opts.finder.getTr(_4fb,_4fc).addClass("datagrid-row-selected");
    +if(tr.length){
    +if(tr.closest("table").hasClass("datagrid-btable-frozen")){
    +return;
    +}
    +var _502=dc.view2.children("div.datagrid-header")._outerHeight();
    +var _503=dc.body2;
    +var _504=_503.outerHeight(true)-_503.outerHeight();
    +var top=tr.position().top-_502-_504;
    +if(top<0){
    +_503.scrollTop(_503.scrollTop()+top);
    +}else{
    +if(top+tr._outerHeight()>_503.height()-18){
    +_503.scrollTop(_503.scrollTop()+top+tr._outerHeight()-_503.height()+18);
    +}
    +}
    +}
    +};
    +function _505(_506,_507,_508){
    +var _509=$.data(_506,"datagrid");
    +var dc=_509.dc;
    +var opts=_509.options;
    +var _50a=$.data(_506,"datagrid").selectedRows;
    +if(!_508&&opts.checkOnSelect){
    +_50b(_506,_507,true);
    +}
    +opts.finder.getTr(_506,_507).removeClass("datagrid-row-selected");
    +var row=opts.finder.getRow(_506,_507);
    +if(opts.idField){
    +_460(_50a,opts.idField,row[opts.idField]);
    +}
    +opts.onUnselect.call(_506,_507,row);
    +};
    +function _50c(_50d,_50e){
    +var _50f=$.data(_50d,"datagrid");
    +var opts=_50f.options;
    +var rows=_50f.data.rows;
    +var _510=$.data(_50d,"datagrid").selectedRows;
    +if(!_50e&&opts.checkOnSelect){
    +_511(_50d,true);
    +}
    +opts.finder.getTr(_50d,"","allbody").addClass("datagrid-row-selected");
    +if(opts.idField){
    +for(var _512=0;_512<rows.length;_512++){
    +_462(_510,opts.idField,rows[_512]);
    +}
    +}
    +opts.onSelectAll.call(_50d,rows);
    +};
    +function _500(_513,_514){
    +var _515=$.data(_513,"datagrid");
    +var opts=_515.options;
    +var rows=_515.data.rows;
    +var _516=$.data(_513,"datagrid").selectedRows;
    +if(!_514&&opts.checkOnSelect){
    +_517(_513,true);
    +}
    +opts.finder.getTr(_513,"","selected").removeClass("datagrid-row-selected");
    +if(opts.idField){
    +for(var _518=0;_518<rows.length;_518++){
    +_460(_516,opts.idField,rows[_518][opts.idField]);
    +}
    +}
    +opts.onUnselectAll.call(_513,rows);
    +};
    +function _501(_519,_51a,_51b){
    +var _51c=$.data(_519,"datagrid");
    +var opts=_51c.options;
    +if(!_51b&&opts.selectOnCheck){
    +_4fa(_519,_51a,true);
    +}
    +var ck=opts.finder.getTr(_519,_51a).find("div.datagrid-cell-check input[type=checkbox]");
    +ck._propAttr("checked",true);
    +ck=opts.finder.getTr(_519,"","allbody").find("div.datagrid-cell-check input[type=checkbox]:not(:checked)");
    +if(!ck.length){
    +var dc=_51c.dc;
    +var _51d=dc.header1.add(dc.header2);
    +_51d.find("input[type=checkbox]")._propAttr("checked",true);
    +}
    +var row=opts.finder.getRow(_519,_51a);
    +if(opts.idField){
    +_462(_51c.checkedRows,opts.idField,row);
    +}
    +opts.onCheck.call(_519,_51a,row);
    +};
    +function _50b(_51e,_51f,_520){
    +var _521=$.data(_51e,"datagrid");
    +var opts=_521.options;
    +if(!_520&&opts.selectOnCheck){
    +_505(_51e,_51f,true);
    +}
    +var ck=opts.finder.getTr(_51e,_51f).find("div.datagrid-cell-check input[type=checkbox]");
    +ck._propAttr("checked",false);
    +var dc=_521.dc;
    +var _522=dc.header1.add(dc.header2);
    +_522.find("input[type=checkbox]")._propAttr("checked",false);
    +var row=opts.finder.getRow(_51e,_51f);
    +if(opts.idField){
    +_460(_521.checkedRows,opts.idField,row[opts.idField]);
    +}
    +opts.onUncheck.call(_51e,_51f,row);
    +};
    +function _511(_523,_524){
    +var _525=$.data(_523,"datagrid");
    +var opts=_525.options;
    +var rows=_525.data.rows;
    +if(!_524&&opts.selectOnCheck){
    +_50c(_523,true);
    +}
    +var dc=_525.dc;
    +var hck=dc.header1.add(dc.header2).find("input[type=checkbox]");
    +var bck=opts.finder.getTr(_523,"","allbody").find("div.datagrid-cell-check input[type=checkbox]");
    +hck.add(bck)._propAttr("checked",true);
    +if(opts.idField){
    +for(var i=0;i<rows.length;i++){
    +_462(_525.checkedRows,opts.idField,rows[i]);
    +}
    +}
    +opts.onCheckAll.call(_523,rows);
    +};
    +function _517(_526,_527){
    +var _528=$.data(_526,"datagrid");
    +var opts=_528.options;
    +var rows=_528.data.rows;
    +if(!_527&&opts.selectOnCheck){
    +_500(_526,true);
    +}
    +var dc=_528.dc;
    +var hck=dc.header1.add(dc.header2).find("input[type=checkbox]");
    +var bck=opts.finder.getTr(_526,"","allbody").find("div.datagrid-cell-check input[type=checkbox]");
    +hck.add(bck)._propAttr("checked",false);
    +if(opts.idField){
    +for(var i=0;i<rows.length;i++){
    +_460(_528.checkedRows,opts.idField,rows[i][opts.idField]);
    +}
    +}
    +opts.onUncheckAll.call(_526,rows);
    +};
    +function _529(_52a,_52b){
    +var opts=$.data(_52a,"datagrid").options;
    +var tr=opts.finder.getTr(_52a,_52b);
    +var row=opts.finder.getRow(_52a,_52b);
    +if(tr.hasClass("datagrid-row-editing")){
    +return;
    +}
    +if(opts.onBeforeEdit.call(_52a,_52b,row)==false){
    +return;
    +}
    +tr.addClass("datagrid-row-editing");
    +_52c(_52a,_52b);
    +_4d8(_52a);
    +tr.find("div.datagrid-editable").each(function(){
    +var _52d=$(this).parent().attr("field");
    +var ed=$.data(this,"datagrid.editor");
    +ed.actions.setValue(ed.target,row[_52d]);
    +});
    +_52e(_52a,_52b);
    +};
    +function _52f(_530,_531,_532){
    +var opts=$.data(_530,"datagrid").options;
    +var _533=$.data(_530,"datagrid").updatedRows;
    +var _534=$.data(_530,"datagrid").insertedRows;
    +var tr=opts.finder.getTr(_530,_531);
    +var row=opts.finder.getRow(_530,_531);
    +if(!tr.hasClass("datagrid-row-editing")){
    +return;
    +}
    +if(!_532){
    +if(!_52e(_530,_531)){
    +return;
    +}
    +var _535=false;
    +var _536={};
    +tr.find("div.datagrid-editable").each(function(){
    +var _537=$(this).parent().attr("field");
    +var ed=$.data(this,"datagrid.editor");
    +var _538=ed.actions.getValue(ed.target);
    +if(row[_537]!=_538){
    +row[_537]=_538;
    +_535=true;
    +_536[_537]=_538;
    +}
    +});
    +if(_535){
    +if(_45f(_534,row)==-1){
    +if(_45f(_533,row)==-1){
    +_533.push(row);
    +}
    +}
    +}
    +}
    +tr.removeClass("datagrid-row-editing");
    +_539(_530,_531);
    +$(_530).datagrid("refreshRow",_531);
    +if(!_532){
    +opts.onAfterEdit.call(_530,_531,row,_536);
    +}else{
    +opts.onCancelEdit.call(_530,_531,row);
    +}
    +};
    +function _53a(_53b,_53c){
    +var opts=$.data(_53b,"datagrid").options;
    +var tr=opts.finder.getTr(_53b,_53c);
    +var _53d=[];
    +tr.children("td").each(function(){
    +var cell=$(this).find("div.datagrid-editable");
    +if(cell.length){
    +var ed=$.data(cell[0],"datagrid.editor");
    +_53d.push(ed);
    +}
    +});
    +return _53d;
    +};
    +function _53e(_53f,_540){
    +var _541=_53a(_53f,_540.index);
    +for(var i=0;i<_541.length;i++){
    +if(_541[i].field==_540.field){
    +return _541[i];
    +}
    +}
    +return null;
    +};
    +function _52c(_542,_543){
    +var opts=$.data(_542,"datagrid").options;
    +var tr=opts.finder.getTr(_542,_543);
    +tr.children("td").each(function(){
    +var cell=$(this).find("div.datagrid-cell");
    +var _544=$(this).attr("field");
    +var col=_4a3(_542,_544);
    +if(col&&col.editor){
    +var _545,_546;
    +if(typeof col.editor=="string"){
    +_545=col.editor;
    +}else{
    +_545=col.editor.type;
    +_546=col.editor.options;
    +}
    +var _547=opts.editors[_545];
    +if(_547){
    +var _548=cell.html();
    +var _549=cell._outerWidth();
    +cell.addClass("datagrid-editable");
    +cell._outerWidth(_549);
    +cell.html("<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\"><tr><td></td></tr></table>");
    +cell.children("table").bind("click dblclick contextmenu",function(e){
    +e.stopPropagation();
    +});
    +$.data(cell[0],"datagrid.editor",{actions:_547,target:_547.init(cell.find("td"),_546),field:_544,type:_545,oldHtml:_548});
    +}
    +}
    +});
    +_474(_542,_543,true);
    +};
    +function _539(_54a,_54b){
    +var opts=$.data(_54a,"datagrid").options;
    +var tr=opts.finder.getTr(_54a,_54b);
    +tr.children("td").each(function(){
    +var cell=$(this).find("div.datagrid-editable");
    +if(cell.length){
    +var ed=$.data(cell[0],"datagrid.editor");
    +if(ed.actions.destroy){
    +ed.actions.destroy(ed.target);
    +}
    +cell.html(ed.oldHtml);
    +$.removeData(cell[0],"datagrid.editor");
    +cell.removeClass("datagrid-editable");
    +cell.css("width","");
    +}
    +});
    +};
    +function _52e(_54c,_54d){
    +var tr=$.data(_54c,"datagrid").options.finder.getTr(_54c,_54d);
    +if(!tr.hasClass("datagrid-row-editing")){
    +return true;
    +}
    +var vbox=tr.find(".validatebox-text");
    +vbox.validatebox("validate");
    +vbox.trigger("mouseleave");
    +var _54e=tr.find(".validatebox-invalid");
    +return _54e.length==0;
    +};
    +function _54f(_550,_551){
    +var _552=$.data(_550,"datagrid").insertedRows;
    +var _553=$.data(_550,"datagrid").deletedRows;
    +var _554=$.data(_550,"datagrid").updatedRows;
    +if(!_551){
    +var rows=[];
    +rows=rows.concat(_552);
    +rows=rows.concat(_553);
    +rows=rows.concat(_554);
    +return rows;
    +}else{
    +if(_551=="inserted"){
    +return _552;
    +}else{
    +if(_551=="deleted"){
    +return _553;
    +}else{
    +if(_551=="updated"){
    +return _554;
    +}
    +}
    +}
    +}
    +return [];
    +};
    +function _555(_556,_557){
    +var _558=$.data(_556,"datagrid");
    +var opts=_558.options;
    +var data=_558.data;
    +var _559=_558.insertedRows;
    +var _55a=_558.deletedRows;
    +$(_556).datagrid("cancelEdit",_557);
    +var row=data.rows[_557];
    +if(_45f(_559,row)>=0){
    +_460(_559,row);
    +}else{
    +_55a.push(row);
    +}
    +_460(_558.selectedRows,opts.idField,data.rows[_557][opts.idField]);
    +_460(_558.checkedRows,opts.idField,data.rows[_557][opts.idField]);
    +opts.view.deleteRow.call(opts.view,_556,_557);
    +if(opts.height=="auto"){
    +_474(_556);
    +}
    +$(_556).datagrid("getPager").pagination("refresh",{total:data.total});
    +};
    +function _55b(_55c,_55d){
    +var data=$.data(_55c,"datagrid").data;
    +var view=$.data(_55c,"datagrid").options.view;
    +var _55e=$.data(_55c,"datagrid").insertedRows;
    +view.insertRow.call(view,_55c,_55d.index,_55d.row);
    +_55e.push(_55d.row);
    +$(_55c).datagrid("getPager").pagination("refresh",{total:data.total});
    +};
    +function _55f(_560,row){
    +var data=$.data(_560,"datagrid").data;
    +var view=$.data(_560,"datagrid").options.view;
    +var _561=$.data(_560,"datagrid").insertedRows;
    +view.insertRow.call(view,_560,null,row);
    +_561.push(row);
    +$(_560).datagrid("getPager").pagination("refresh",{total:data.total});
    +};
    +function _562(_563){
    +var _564=$.data(_563,"datagrid");
    +var data=_564.data;
    +var rows=data.rows;
    +var _565=[];
    +for(var i=0;i<rows.length;i++){
    +_565.push($.extend({},rows[i]));
    +}
    +_564.originalRows=_565;
    +_564.updatedRows=[];
    +_564.insertedRows=[];
    +_564.deletedRows=[];
    +};
    +function _566(_567){
    +var data=$.data(_567,"datagrid").data;
    +var ok=true;
    +for(var i=0,len=data.rows.length;i<len;i++){
    +if(_52e(_567,i)){
    +_52f(_567,i,false);
    +}else{
    +ok=false;
    +}
    +}
    +if(ok){
    +_562(_567);
    +}
    +};
    +function _568(_569){
    +var _56a=$.data(_569,"datagrid");
    +var opts=_56a.options;
    +var _56b=_56a.originalRows;
    +var _56c=_56a.insertedRows;
    +var _56d=_56a.deletedRows;
    +var _56e=_56a.selectedRows;
    +var _56f=_56a.checkedRows;
    +var data=_56a.data;
    +function _570(a){
    +var ids=[];
    +for(var i=0;i<a.length;i++){
    +ids.push(a[i][opts.idField]);
    +}
    +return ids;
    +};
    +function _571(ids,_572){
    +for(var i=0;i<ids.length;i++){
    +var _573=_4ec(_569,ids[i]);
    +(_572=="s"?_4fa:_501)(_569,_573,true);
    +}
    +};
    +for(var i=0;i<data.rows.length;i++){
    +_52f(_569,i,true);
    +}
    +var _574=_570(_56e);
    +var _575=_570(_56f);
    +_56e.splice(0,_56e.length);
    +_56f.splice(0,_56f.length);
    +data.total+=_56d.length-_56c.length;
    +data.rows=_56b;
    +_4e5(_569,data);
    +_571(_574,"s");
    +_571(_575,"c");
    +_562(_569);
    +};
    +function _576(_577,_578){
    +var opts=$.data(_577,"datagrid").options;
    +if(_578){
    +opts.queryParams=_578;
    +}
    +var _579=$.extend({},opts.queryParams);
    +if(opts.pagination){
    +$.extend(_579,{page:opts.pageNumber,rows:opts.pageSize});
    +}
    +if(opts.sortName){
    +$.extend(_579,{sort:opts.sortName,order:opts.sortOrder});
    +}
    +if(opts.onBeforeLoad.call(_577,_579)==false){
    +return;
    +}
    +$(_577).datagrid("loading");
    +setTimeout(function(){
    +_57a();
    +},0);
    +function _57a(){
    +var _57b=opts.loader.call(_577,_579,function(data){
    +setTimeout(function(){
    +$(_577).datagrid("loaded");
    +},0);
    +_4e5(_577,data);
    +setTimeout(function(){
    +_562(_577);
    +},0);
    +},function(){
    +setTimeout(function(){
    +$(_577).datagrid("loaded");
    +},0);
    +opts.onLoadError.apply(_577,arguments);
    +});
    +if(_57b==false){
    +$(_577).datagrid("loaded");
    +}
    +};
    +};
    +function _57c(_57d,_57e){
    +var opts=$.data(_57d,"datagrid").options;
    +_57e.rowspan=_57e.rowspan||1;
    +_57e.colspan=_57e.colspan||1;
    +if(_57e.rowspan==1&&_57e.colspan==1){
    +return;
    +}
    +var tr=opts.finder.getTr(_57d,(_57e.index!=undefined?_57e.index:_57e.id));
    +if(!tr.length){
    +return;
    +}
    +var row=opts.finder.getRow(_57d,tr);
    +var _57f=row[_57e.field];
    +var td=tr.find("td[field=\""+_57e.field+"\"]");
    +td.attr("rowspan",_57e.rowspan).attr("colspan",_57e.colspan);
    +td.addClass("datagrid-td-merged");
    +for(var i=1;i<_57e.colspan;i++){
    +td=td.next();
    +td.hide();
    +row[td.attr("field")]=_57f;
    +}
    +for(var i=1;i<_57e.rowspan;i++){
    +tr=tr.next();
    +if(!tr.length){
    +break;
    +}
    +var row=opts.finder.getRow(_57d,tr);
    +var td=tr.find("td[field=\""+_57e.field+"\"]").hide();
    +row[td.attr("field")]=_57f;
    +for(var j=1;j<_57e.colspan;j++){
    +td=td.next();
    +td.hide();
    +row[td.attr("field")]=_57f;
    +}
    +}
    +_4d0(_57d);
    +};
    +$.fn.datagrid=function(_580,_581){
    +if(typeof _580=="string"){
    +return $.fn.datagrid.methods[_580](this,_581);
    +}
    +_580=_580||{};
    +return this.each(function(){
    +var _582=$.data(this,"datagrid");
    +var opts;
    +if(_582){
    +opts=$.extend(_582.options,_580);
    +_582.options=opts;
    +}else{
    +opts=$.extend({},$.extend({},$.fn.datagrid.defaults,{queryParams:{}}),$.fn.datagrid.parseOptions(this),_580);
    +$(this).css("width","").css("height","");
    +var _583=_485(this,opts.rownumbers);
    +if(!opts.columns){
    +opts.columns=_583.columns;
    +}
    +if(!opts.frozenColumns){
    +opts.frozenColumns=_583.frozenColumns;
    +}
    +opts.columns=$.extend(true,[],opts.columns);
    +opts.frozenColumns=$.extend(true,[],opts.frozenColumns);
    +opts.view=$.extend({},opts.view);
    +$.data(this,"datagrid",{options:opts,panel:_583.panel,dc:_583.dc,selectedRows:[],checkedRows:[],data:{total:0,rows:[]},originalRows:[],updatedRows:[],insertedRows:[],deletedRows:[]});
    +}
    +_494(this);
    +if(opts.data){
    +_4e5(this,opts.data);
    +_562(this);
    +}else{
    +var data=_490(this);
    +if(data.total>0){
    +_4e5(this,data);
    +_562(this);
    +}
    +}
    +_463(this);
    +_576(this);
    +_4a4(this);
    +});
    +};
    +var _584={text:{init:function(_585,_586){
    +var _587=$("<input type=\"text\" class=\"datagrid-editable-input\">").appendTo(_585);
    +return _587;
    +},getValue:function(_588){
    +return $(_588).val();
    +},setValue:function(_589,_58a){
    +$(_589).val(_58a);
    +},resize:function(_58b,_58c){
    +$(_58b)._outerWidth(_58c);
    +}},textarea:{init:function(_58d,_58e){
    +var _58f=$("<textarea class=\"datagrid-editable-input\"></textarea>").appendTo(_58d);
    +return _58f;
    +},getValue:function(_590){
    +return $(_590).val();
    +},setValue:function(_591,_592){
    +$(_591).val(_592);
    +},resize:function(_593,_594){
    +$(_593)._outerWidth(_594);
    +}},checkbox:{init:function(_595,_596){
    +var _597=$("<input type=\"checkbox\">").appendTo(_595);
    +_597.val(_596.on);
    +_597.attr("offval",_596.off);
    +return _597;
    +},getValue:function(_598){
    +if($(_598).is(":checked")){
    +return $(_598).val();
    +}else{
    +return $(_598).attr("offval");
    +}
    +},setValue:function(_599,_59a){
    +var _59b=false;
    +if($(_599).val()==_59a){
    +_59b=true;
    +}
    +$(_599)._propAttr("checked",_59b);
    +}},numberbox:{init:function(_59c,_59d){
    +var _59e=$("<input type=\"text\" class=\"datagrid-editable-input\">").appendTo(_59c);
    +_59e.numberbox(_59d);
    +return _59e;
    +},destroy:function(_59f){
    +$(_59f).numberbox("destroy");
    +},getValue:function(_5a0){
    +$(_5a0).blur();
    +return $(_5a0).numberbox("getValue");
    +},setValue:function(_5a1,_5a2){
    +$(_5a1).numberbox("setValue",_5a2);
    +},resize:function(_5a3,_5a4){
    +$(_5a3)._outerWidth(_5a4);
    +}},validatebox:{init:function(_5a5,_5a6){
    +var _5a7=$("<input type=\"text\" class=\"datagrid-editable-input\">").appendTo(_5a5);
    +_5a7.validatebox(_5a6);
    +return _5a7;
    +},destroy:function(_5a8){
    +$(_5a8).validatebox("destroy");
    +},getValue:function(_5a9){
    +return $(_5a9).val();
    +},setValue:function(_5aa,_5ab){
    +$(_5aa).val(_5ab);
    +},resize:function(_5ac,_5ad){
    +$(_5ac)._outerWidth(_5ad);
    +}},datebox:{init:function(_5ae,_5af){
    +var _5b0=$("<input type=\"text\">").appendTo(_5ae);
    +_5b0.datebox(_5af);
    +return _5b0;
    +},destroy:function(_5b1){
    +$(_5b1).datebox("destroy");
    +},getValue:function(_5b2){
    +return $(_5b2).datebox("getValue");
    +},setValue:function(_5b3,_5b4){
    +$(_5b3).datebox("setValue",_5b4);
    +},resize:function(_5b5,_5b6){
    +$(_5b5).datebox("resize",_5b6);
    +}},combobox:{init:function(_5b7,_5b8){
    +var _5b9=$("<input type=\"text\">").appendTo(_5b7);
    +_5b9.combobox(_5b8||{});
    +return _5b9;
    +},destroy:function(_5ba){
    +$(_5ba).combobox("destroy");
    +},getValue:function(_5bb){
    +return $(_5bb).combobox("getValue");
    +},setValue:function(_5bc,_5bd){
    +$(_5bc).combobox("setValue",_5bd);
    +},resize:function(_5be,_5bf){
    +$(_5be).combobox("resize",_5bf);
    +}},combotree:{init:function(_5c0,_5c1){
    +var _5c2=$("<input type=\"text\">").appendTo(_5c0);
    +_5c2.combotree(_5c1);
    +return _5c2;
    +},destroy:function(_5c3){
    +$(_5c3).combotree("destroy");
    +},getValue:function(_5c4){
    +return $(_5c4).combotree("getValue");
    +},setValue:function(_5c5,_5c6){
    +$(_5c5).combotree("setValue",_5c6);
    +},resize:function(_5c7,_5c8){
    +$(_5c7).combotree("resize",_5c8);
    +}}};
    +$.fn.datagrid.methods={options:function(jq){
    +var _5c9=$.data(jq[0],"datagrid").options;
    +var _5ca=$.data(jq[0],"datagrid").panel.panel("options");
    +var opts=$.extend(_5c9,{width:_5ca.width,height:_5ca.height,closed:_5ca.closed,collapsed:_5ca.collapsed,minimized:_5ca.minimized,maximized:_5ca.maximized});
    +return opts;
    +},getPanel:function(jq){
    +return $.data(jq[0],"datagrid").panel;
    +},getPager:function(jq){
    +return $.data(jq[0],"datagrid").panel.children("div.datagrid-pager");
    +},getColumnFields:function(jq,_5cb){
    +return _493(jq[0],_5cb);
    +},getColumnOption:function(jq,_5cc){
    +return _4a3(jq[0],_5cc);
    +},resize:function(jq,_5cd){
    +return jq.each(function(){
    +_463(this,_5cd);
    +});
    +},load:function(jq,_5ce){
    +return jq.each(function(){
    +var opts=$(this).datagrid("options");
    +opts.pageNumber=1;
    +var _5cf=$(this).datagrid("getPager");
    +_5cf.pagination({pageNumber:1});
    +_576(this,_5ce);
    +});
    +},reload:function(jq,_5d0){
    +return jq.each(function(){
    +_576(this,_5d0);
    +});
    +},reloadFooter:function(jq,_5d1){
    +return jq.each(function(){
    +var opts=$.data(this,"datagrid").options;
    +var dc=$.data(this,"datagrid").dc;
    +if(_5d1){
    +$.data(this,"datagrid").footer=_5d1;
    +}
    +if(opts.showFooter){
    +opts.view.renderFooter.call(opts.view,this,dc.footer2,false);
    +opts.view.renderFooter.call(opts.view,this,dc.footer1,true);
    +if(opts.view.onAfterRender){
    +opts.view.onAfterRender.call(opts.view,this);
    +}
    +$(this).datagrid("fixRowHeight");
    +}
    +});
    +},loading:function(jq){
    +return jq.each(function(){
    +var opts=$.data(this,"datagrid").options;
    +$(this).datagrid("getPager").pagination("loading");
    +if(opts.loadMsg){
    +var _5d2=$(this).datagrid("getPanel");
    +$("<div class=\"datagrid-mask\" style=\"display:block\"></div>").appendTo(_5d2);
    +var msg=$("<div class=\"datagrid-mask-msg\" style=\"display:block;left:50%\"></div>").html(opts.loadMsg).appendTo(_5d2);
    +msg.css("marginLeft",-msg.outerWidth()/2);
    +}
    +});
    +},loaded:function(jq){
    +return jq.each(function(){
    +$(this).datagrid("getPager").pagination("loaded");
    +var _5d3=$(this).datagrid("getPanel");
    +_5d3.children("div.datagrid-mask-msg").remove();
    +_5d3.children("div.datagrid-mask").remove();
    +});
    +},fitColumns:function(jq){
    +return jq.each(function(){
    +_4b7(this);
    +});
    +},fixColumnSize:function(jq,_5d4){
    +return jq.each(function(){
    +_48d(this,_5d4);
    +});
    +},fixRowHeight:function(jq,_5d5){
    +return jq.each(function(){
    +_474(this,_5d5);
    +});
    +},freezeRow:function(jq,_5d6){
    +return jq.each(function(){
    +_47e(this,_5d6);
    +});
    +},autoSizeColumn:function(jq,_5d7){
    +return jq.each(function(){
    +_4c3(this,_5d7);
    +});
    +},loadData:function(jq,data){
    +return jq.each(function(){
    +_4e5(this,data);
    +_562(this);
    +});
    +},getData:function(jq){
    +return $.data(jq[0],"datagrid").data;
    +},getRows:function(jq){
    +return $.data(jq[0],"datagrid").data.rows;
    +},getFooterRows:function(jq){
    +return $.data(jq[0],"datagrid").footer;
    +},getRowIndex:function(jq,id){
    +return _4ec(jq[0],id);
    +},getChecked:function(jq){
    +return _4f2(jq[0]);
    +},getSelected:function(jq){
    +var rows=_4ee(jq[0]);
    +return rows.length>0?rows[0]:null;
    +},getSelections:function(jq){
    +return _4ee(jq[0]);
    +},clearSelections:function(jq){
    +return jq.each(function(){
    +var _5d8=$.data(this,"datagrid").selectedRows;
    +_5d8.splice(0,_5d8.length);
    +_500(this);
    +});
    +},clearChecked:function(jq){
    +return jq.each(function(){
    +var _5d9=$.data(this,"datagrid").checkedRows;
    +_5d9.splice(0,_5d9.length);
    +_517(this);
    +});
    +},selectAll:function(jq){
    +return jq.each(function(){
    +_50c(this);
    +});
    +},unselectAll:function(jq){
    +return jq.each(function(){
    +_500(this);
    +});
    +},selectRow:function(jq,_5da){
    +return jq.each(function(){
    +_4fa(this,_5da);
    +});
    +},selectRecord:function(jq,id){
    +return jq.each(function(){
    +_4f6(this,id);
    +});
    +},unselectRow:function(jq,_5db){
    +return jq.each(function(){
    +_505(this,_5db);
    +});
    +},checkRow:function(jq,_5dc){
    +return jq.each(function(){
    +_501(this,_5dc);
    +});
    +},uncheckRow:function(jq,_5dd){
    +return jq.each(function(){
    +_50b(this,_5dd);
    +});
    +},checkAll:function(jq){
    +return jq.each(function(){
    +_511(this);
    +});
    +},uncheckAll:function(jq){
    +return jq.each(function(){
    +_517(this);
    +});
    +},beginEdit:function(jq,_5de){
    +return jq.each(function(){
    +_529(this,_5de);
    +});
    +},endEdit:function(jq,_5df){
    +return jq.each(function(){
    +_52f(this,_5df,false);
    +});
    +},cancelEdit:function(jq,_5e0){
    +return jq.each(function(){
    +_52f(this,_5e0,true);
    +});
    +},getEditors:function(jq,_5e1){
    +return _53a(jq[0],_5e1);
    +},getEditor:function(jq,_5e2){
    +return _53e(jq[0],_5e2);
    +},refreshRow:function(jq,_5e3){
    +return jq.each(function(){
    +var opts=$.data(this,"datagrid").options;
    +opts.view.refreshRow.call(opts.view,this,_5e3);
    +});
    +},validateRow:function(jq,_5e4){
    +return _52e(jq[0],_5e4);
    +},updateRow:function(jq,_5e5){
    +return jq.each(function(){
    +var opts=$.data(this,"datagrid").options;
    +opts.view.updateRow.call(opts.view,this,_5e5.index,_5e5.row);
    +});
    +},appendRow:function(jq,row){
    +return jq.each(function(){
    +_55f(this,row);
    +});
    +},insertRow:function(jq,_5e6){
    +return jq.each(function(){
    +_55b(this,_5e6);
    +});
    +},deleteRow:function(jq,_5e7){
    +return jq.each(function(){
    +_555(this,_5e7);
    +});
    +},getChanges:function(jq,_5e8){
    +return _54f(jq[0],_5e8);
    +},acceptChanges:function(jq){
    +return jq.each(function(){
    +_566(this);
    +});
    +},rejectChanges:function(jq){
    +return jq.each(function(){
    +_568(this);
    +});
    +},mergeCells:function(jq,_5e9){
    +return jq.each(function(){
    +_57c(this,_5e9);
    +});
    +},showColumn:function(jq,_5ea){
    +return jq.each(function(){
    +var _5eb=$(this).datagrid("getPanel");
    +_5eb.find("td[field=\""+_5ea+"\"]").show();
    +$(this).datagrid("getColumnOption",_5ea).hidden=false;
    +$(this).datagrid("fitColumns");
    +});
    +},hideColumn:function(jq,_5ec){
    +return jq.each(function(){
    +var _5ed=$(this).datagrid("getPanel");
    +_5ed.find("td[field=\""+_5ec+"\"]").hide();
    +$(this).datagrid("getColumnOption",_5ec).hidden=true;
    +$(this).datagrid("fitColumns");
    +});
    +}};
    +$.fn.datagrid.parseOptions=function(_5ee){
    +var t=$(_5ee);
    +return $.extend({},$.fn.panel.parseOptions(_5ee),$.parser.parseOptions(_5ee,["url","toolbar","idField","sortName","sortOrder","pagePosition","resizeHandle",{fitColumns:"boolean",autoRowHeight:"boolean",striped:"boolean",nowrap:"boolean"},{rownumbers:"boolean",singleSelect:"boolean",checkOnSelect:"boolean",selectOnCheck:"boolean"},{pagination:"boolean",pageSize:"number",pageNumber:"number"},{remoteSort:"boolean",showHeader:"boolean",showFooter:"boolean"},{scrollbarSize:"number"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined),loadMsg:(t.attr("loadMsg")!=undefined?t.attr("loadMsg"):undefined),rowStyler:(t.attr("rowStyler")?eval(t.attr("rowStyler")):undefined)});
    +};
    +var _5ef={render:function(_5f0,_5f1,_5f2){
    +var _5f3=$.data(_5f0,"datagrid");
    +var opts=_5f3.options;
    +var rows=_5f3.data.rows;
    +var _5f4=$(_5f0).datagrid("getColumnFields",_5f2);
    +if(_5f2){
    +if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){
    +return;
    +}
    +}
    +var _5f5=["<table class=\"datagrid-btable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>"];
    +for(var i=0;i<rows.length;i++){
    +var cls=(i%2&&opts.striped)?"class=\"datagrid-row datagrid-row-alt\"":"class=\"datagrid-row\"";
    +var _5f6=opts.rowStyler?opts.rowStyler.call(_5f0,i,rows[i]):"";
    +var _5f7=_5f6?"style=\""+_5f6+"\"":"";
    +var _5f8=_5f3.rowIdPrefix+"-"+(_5f2?1:2)+"-"+i;
    +_5f5.push("<tr id=\""+_5f8+"\" datagrid-row-index=\""+i+"\" "+cls+" "+_5f7+">");
    +_5f5.push(this.renderRow.call(this,_5f0,_5f4,_5f2,i,rows[i]));
    +_5f5.push("</tr>");
    +}
    +_5f5.push("</tbody></table>");
    +$(_5f1).html(_5f5.join(""));
    +},renderFooter:function(_5f9,_5fa,_5fb){
    +var opts=$.data(_5f9,"datagrid").options;
    +var rows=$.data(_5f9,"datagrid").footer||[];
    +var _5fc=$(_5f9).datagrid("getColumnFields",_5fb);
    +var _5fd=["<table class=\"datagrid-ftable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>"];
    +for(var i=0;i<rows.length;i++){
    +_5fd.push("<tr class=\"datagrid-row\" datagrid-row-index=\""+i+"\">");
    +_5fd.push(this.renderRow.call(this,_5f9,_5fc,_5fb,i,rows[i]));
    +_5fd.push("</tr>");
    +}
    +_5fd.push("</tbody></table>");
    +$(_5fa).html(_5fd.join(""));
    +},renderRow:function(_5fe,_5ff,_600,_601,_602){
    +var opts=$.data(_5fe,"datagrid").options;
    +var cc=[];
    +if(_600&&opts.rownumbers){
    +var _603=_601+1;
    +if(opts.pagination){
    +_603+=(opts.pageNumber-1)*opts.pageSize;
    +}
    +cc.push("<td class=\"datagrid-td-rownumber\"><div class=\"datagrid-cell-rownumber\">"+_603+"</div></td>");
    +}
    +for(var i=0;i<_5ff.length;i++){
    +var _604=_5ff[i];
    +var col=$(_5fe).datagrid("getColumnOption",_604);
    +if(col){
    +var _605=_602[_604];
    +var _606=col.styler?(col.styler(_605,_602,_601)||""):"";
    +var _607=col.hidden?"style=\"display:none;"+_606+"\"":(_606?"style=\""+_606+"\"":"");
    +cc.push("<td field=\""+_604+"\" "+_607+">");
    +if(col.checkbox){
    +var _607="";
    +}else{
    +var _607="";
    +if(col.align){
    +_607+="text-align:"+col.align+";";
    +}
    +if(!opts.nowrap){
    +_607+="white-space:normal;height:auto;";
    +}else{
    +if(opts.autoRowHeight){
    +_607+="height:auto;";
    +}
    +}
    +}
    +cc.push("<div style=\""+_607+"\" ");
    +if(col.checkbox){
    +cc.push("class=\"datagrid-cell-check ");
    +}else{
    +cc.push("class=\"datagrid-cell "+col.cellClass);
    +}
    +cc.push("\">");
    +if(col.checkbox){
    +cc.push("<input type=\"checkbox\" name=\""+_604+"\" value=\""+(_605!=undefined?_605:"")+"\"/>");
    +}else{
    +if(col.formatter){
    +cc.push(col.formatter(_605,_602,_601));
    +}else{
    +cc.push(_605);
    +}
    +}
    +cc.push("</div>");
    +cc.push("</td>");
    +}
    +}
    +return cc.join("");
    +},refreshRow:function(_608,_609){
    +this.updateRow.call(this,_608,_609,{});
    +},updateRow:function(_60a,_60b,row){
    +var opts=$.data(_60a,"datagrid").options;
    +var rows=$(_60a).datagrid("getRows");
    +$.extend(rows[_60b],row);
    +var _60c=opts.rowStyler?opts.rowStyler.call(_60a,_60b,rows[_60b]):"";
    +function _60d(_60e){
    +var _60f=$(_60a).datagrid("getColumnFields",_60e);
    +var tr=opts.finder.getTr(_60a,_60b,"body",(_60e?1:2));
    +var _610=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked");
    +tr.html(this.renderRow.call(this,_60a,_60f,_60e,_60b,rows[_60b]));
    +tr.attr("style",_60c||"");
    +if(_610){
    +tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true);
    +}
    +};
    +_60d.call(this,true);
    +_60d.call(this,false);
    +$(_60a).datagrid("fixRowHeight",_60b);
    +},insertRow:function(_611,_612,row){
    +var _613=$.data(_611,"datagrid");
    +var opts=_613.options;
    +var dc=_613.dc;
    +var data=_613.data;
    +if(_612==undefined||_612==null){
    +_612=data.rows.length;
    +}
    +if(_612>data.rows.length){
    +_612=data.rows.length;
    +}
    +function _614(_615){
    +var _616=_615?1:2;
    +for(var i=data.rows.length-1;i>=_612;i--){
    +var tr=opts.finder.getTr(_611,i,"body",_616);
    +tr.attr("datagrid-row-index",i+1);
    +tr.attr("id",_613.rowIdPrefix+"-"+_616+"-"+(i+1));
    +if(_615&&opts.rownumbers){
    +var _617=i+2;
    +if(opts.pagination){
    +_617+=(opts.pageNumber-1)*opts.pageSize;
    +}
    +tr.find("div.datagrid-cell-rownumber").html(_617);
    +}
    +}
    +};
    +function _618(_619){
    +var _61a=_619?1:2;
    +var _61b=$(_611).datagrid("getColumnFields",_619);
    +var _61c=_613.rowIdPrefix+"-"+_61a+"-"+_612;
    +var tr="<tr id=\""+_61c+"\" class=\"datagrid-row\" datagrid-row-index=\""+_612+"\"></tr>";
    +if(_612>=data.rows.length){
    +if(data.rows.length){
    +opts.finder.getTr(_611,"","last",_61a).after(tr);
    +}else{
    +var cc=_619?dc.body1:dc.body2;
    +cc.html("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>"+tr+"</tbody></table>");
    +}
    +}else{
    +opts.finder.getTr(_611,_612+1,"body",_61a).before(tr);
    +}
    +};
    +_614.call(this,true);
    +_614.call(this,false);
    +_618.call(this,true);
    +_618.call(this,false);
    +data.total+=1;
    +data.rows.splice(_612,0,row);
    +this.refreshRow.call(this,_611,_612);
    +},deleteRow:function(_61d,_61e){
    +var _61f=$.data(_61d,"datagrid");
    +var opts=_61f.options;
    +var data=_61f.data;
    +function _620(_621){
    +var _622=_621?1:2;
    +for(var i=_61e+1;i<data.rows.length;i++){
    +var tr=opts.finder.getTr(_61d,i,"body",_622);
    +tr.attr("datagrid-row-index",i-1);
    +tr.attr("id",_61f.rowIdPrefix+"-"+_622+"-"+(i-1));
    +if(_621&&opts.rownumbers){
    +var _623=i;
    +if(opts.pagination){
    +_623+=(opts.pageNumber-1)*opts.pageSize;
    +}
    +tr.find("div.datagrid-cell-rownumber").html(_623);
    +}
    +}
    +};
    +opts.finder.getTr(_61d,_61e).remove();
    +_620.call(this,true);
    +_620.call(this,false);
    +data.total-=1;
    +data.rows.splice(_61e,1);
    +},onBeforeRender:function(_624,rows){
    +},onAfterRender:function(_625){
    +var opts=$.data(_625,"datagrid").options;
    +if(opts.showFooter){
    +var _626=$(_625).datagrid("getPanel").find("div.datagrid-footer");
    +_626.find("div.datagrid-cell-rownumber,div.datagrid-cell-check").css("visibility","hidden");
    +}
    +}};
    +$.fn.datagrid.defaults=$.extend({},$.fn.panel.defaults,{frozenColumns:undefined,columns:undefined,fitColumns:false,resizeHandle:"right",autoRowHeight:true,toolbar:null,striped:false,method:"post",nowrap:true,idField:null,url:null,data:null,loadMsg:"Processing, please wait ...",rownumbers:false,singleSelect:false,selectOnCheck:true,checkOnSelect:true,pagination:false,pagePosition:"bottom",pageNumber:1,pageSize:10,pageList:[10,20,30,40,50],queryParams:{},sortName:null,sortOrder:"asc",remoteSort:true,showHeader:true,showFooter:false,scrollbarSize:18,rowStyler:function(_627,_628){
    +},loader:function(_629,_62a,_62b){
    +var opts=$(this).datagrid("options");
    +if(!opts.url){
    +return false;
    +}
    +$.ajax({type:opts.method,url:opts.url,data:_629,dataType:"json",success:function(data){
    +_62a(data);
    +},error:function(){
    +_62b.apply(this,arguments);
    +}});
    +},loadFilter:function(data){
    +if(typeof data.length=="number"&&typeof data.splice=="function"){
    +return {total:data.length,rows:data};
    +}else{
    +return data;
    +}
    +},editors:_584,finder:{getTr:function(_62c,_62d,type,_62e){
    +type=type||"body";
    +_62e=_62e||0;
    +var _62f=$.data(_62c,"datagrid");
    +var dc=_62f.dc;
    +var opts=_62f.options;
    +if(_62e==0){
    +var tr1=opts.finder.getTr(_62c,_62d,type,1);
    +var tr2=opts.finder.getTr(_62c,_62d,type,2);
    +return tr1.add(tr2);
    +}else{
    +if(type=="body"){
    +var tr=$("#"+_62f.rowIdPrefix+"-"+_62e+"-"+_62d);
    +if(!tr.length){
    +tr=(_62e==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index="+_62d+"]");
    +}
    +return tr;
    +}else{
    +if(type=="footer"){
    +return (_62e==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index="+_62d+"]");
    +}else{
    +if(type=="selected"){
    +return (_62e==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-selected");
    +}else{
    +if(type=="last"){
    +return (_62e==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]:last");
    +}else{
    +if(type=="allbody"){
    +return (_62e==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]");
    +}else{
    +if(type=="allfooter"){
    +return (_62e==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index]");
    +}
    +}
    +}
    +}
    +}
    +}
    +}
    +},getRow:function(_630,p){
    +var _631=(typeof p=="object")?p.attr("datagrid-row-index"):p;
    +return $.data(_630,"datagrid").data.rows[parseInt(_631)];
    +}},view:_5ef,onBeforeLoad:function(_632){
    +},onLoadSuccess:function(){
    +},onLoadError:function(){
    +},onClickRow:function(_633,_634){
    +},onDblClickRow:function(_635,_636){
    +},onClickCell:function(_637,_638,_639){
    +},onDblClickCell:function(_63a,_63b,_63c){
    +},onSortColumn:function(sort,_63d){
    +},onResizeColumn:function(_63e,_63f){
    +},onSelect:function(_640,_641){
    +},onUnselect:function(_642,_643){
    +},onSelectAll:function(rows){
    +},onUnselectAll:function(rows){
    +},onCheck:function(_644,_645){
    +},onUncheck:function(_646,_647){
    +},onCheckAll:function(rows){
    +},onUncheckAll:function(rows){
    +},onBeforeEdit:function(_648,_649){
    +},onAfterEdit:function(_64a,_64b,_64c){
    +},onCancelEdit:function(_64d,_64e){
    +},onHeaderContextMenu:function(e,_64f){
    +},onRowContextMenu:function(e,_650,_651){
    +}});
    +})(jQuery);
    +(function($){
    +var _652;
    +function _653(_654){
    +var _655=$.data(_654,"propertygrid");
    +var opts=$.data(_654,"propertygrid").options;
    +$(_654).datagrid($.extend({},opts,{cls:"propertygrid",view:(opts.showGroup?_656:undefined),onClickRow:function(_657,row){
    +if(_652!=this){
    +_658(_652);
    +_652=this;
    +}
    +if(opts.editIndex!=_657&&row.editor){
    +var col=$(this).datagrid("getColumnOption","value");
    +col.editor=row.editor;
    +_658(_652);
    +$(this).datagrid("beginEdit",_657);
    +$(this).datagrid("getEditors",_657)[0].target.focus();
    +opts.editIndex=_657;
    +}
    +opts.onClickRow.call(_654,_657,row);
    +},loadFilter:function(data){
    +_658(this);
    +return opts.loadFilter.call(this,data);
    +},onLoadSuccess:function(data){
    +$(_654).datagrid("getPanel").find("div.datagrid-group").attr("style","");
    +opts.onLoadSuccess.call(_654,data);
    +}}));
    +$(document).unbind(".propertygrid").bind("mousedown.propertygrid",function(e){
    +var p=$(e.target).closest("div.datagrid-view,div.combo-panel");
    +if(p.length){
    +return;
    +}
    +_658(_652);
    +_652=undefined;
    +});
    +};
    +function _658(_659){
    +var t=$(_659);
    +if(!t.length){
    +return;
    +}
    +var opts=$.data(_659,"propertygrid").options;
    +var _65a=opts.editIndex;
    +if(_65a==undefined){
    +return;
    +}
    +var ed=t.datagrid("getEditors",_65a)[0];
    +if(ed){
    +ed.target.blur();
    +if(t.datagrid("validateRow",_65a)){
    +t.datagrid("endEdit",_65a);
    +}else{
    +t.datagrid("cancelEdit",_65a);
    +}
    +}
    +opts.editIndex=undefined;
    +};
    +$.fn.propertygrid=function(_65b,_65c){
    +if(typeof _65b=="string"){
    +var _65d=$.fn.propertygrid.methods[_65b];
    +if(_65d){
    +return _65d(this,_65c);
    +}else{
    +return this.datagrid(_65b,_65c);
    +}
    +}
    +_65b=_65b||{};
    +return this.each(function(){
    +var _65e=$.data(this,"propertygrid");
    +if(_65e){
    +$.extend(_65e.options,_65b);
    +}else{
    +var opts=$.extend({},$.fn.propertygrid.defaults,$.fn.propertygrid.parseOptions(this),_65b);
    +opts.frozenColumns=$.extend(true,[],opts.frozenColumns);
    +opts.columns=$.extend(true,[],opts.columns);
    +$.data(this,"propertygrid",{options:opts});
    +}
    +_653(this);
    +});
    +};
    +$.fn.propertygrid.methods={options:function(jq){
    +return $.data(jq[0],"propertygrid").options;
    +}};
    +$.fn.propertygrid.parseOptions=function(_65f){
    +var t=$(_65f);
    +return $.extend({},$.fn.datagrid.parseOptions(_65f),$.parser.parseOptions(_65f,[{showGroup:"boolean"}]));
    +};
    +var _656=$.extend({},$.fn.datagrid.defaults.view,{render:function(_660,_661,_662){
    +var _663=$.data(_660,"datagrid");
    +var opts=_663.options;
    +var rows=_663.data.rows;
    +var _664=$(_660).datagrid("getColumnFields",_662);
    +var _665=[];
    +var _666=0;
    +var _667=this.groups;
    +for(var i=0;i<_667.length;i++){
    +var _668=_667[i];
    +_665.push("<div class=\"datagrid-group\" group-index="+i+" style=\"height:25px;overflow:hidden;border-bottom:1px solid #ccc;\">");
    +_665.push("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" style=\"height:100%\"><tbody>");
    +_665.push("<tr>");
    +_665.push("<td style=\"border:0;\">");
    +if(!_662){
    +_665.push("<span style=\"color:#666;font-weight:bold;\">");
    +_665.push(opts.groupFormatter.call(_660,_668.fvalue,_668.rows));
    +_665.push("</span>");
    +}
    +_665.push("</td>");
    +_665.push("</tr>");
    +_665.push("</tbody></table>");
    +_665.push("</div>");
    +_665.push("<table class=\"datagrid-btable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>");
    +for(var j=0;j<_668.rows.length;j++){
    +var cls=(_666%2&&opts.striped)?"class=\"datagrid-row datagrid-row-alt\"":"class=\"datagrid-row\"";
    +var _669=opts.rowStyler?opts.rowStyler.call(_660,_666,_668.rows[j]):"";
    +var _66a=_669?"style=\""+_669+"\"":"";
    +var _66b=_663.rowIdPrefix+"-"+(_662?1:2)+"-"+_666;
    +_665.push("<tr id=\""+_66b+"\" datagrid-row-index=\""+_666+"\" "+cls+" "+_66a+">");
    +_665.push(this.renderRow.call(this,_660,_664,_662,_666,_668.rows[j]));
    +_665.push("</tr>");
    +_666++;
    +}
    +_665.push("</tbody></table>");
    +}
    +$(_661).html(_665.join(""));
    +},onAfterRender:function(_66c){
    +var opts=$.data(_66c,"datagrid").options;
    +var dc=$.data(_66c,"datagrid").dc;
    +var view=dc.view;
    +var _66d=dc.view1;
    +var _66e=dc.view2;
    +$.fn.datagrid.defaults.view.onAfterRender.call(this,_66c);
    +if(opts.rownumbers||opts.frozenColumns.length){
    +var _66f=_66d.find("div.datagrid-group");
    +}else{
    +var _66f=_66e.find("div.datagrid-group");
    +}
    +$("<td style=\"border:0;text-align:center;width:25px\"><span class=\"datagrid-row-expander datagrid-row-collapse\" style=\"display:inline-block;width:16px;height:16px;cursor:pointer\">&nbsp;</span></td>").insertBefore(_66f.find("td"));
    +view.find("div.datagrid-group").each(function(){
    +var _670=$(this).attr("group-index");
    +$(this).find("span.datagrid-row-expander").bind("click",{groupIndex:_670},function(e){
    +if($(this).hasClass("datagrid-row-collapse")){
    +$(_66c).datagrid("collapseGroup",e.data.groupIndex);
    +}else{
    +$(_66c).datagrid("expandGroup",e.data.groupIndex);
    +}
    +});
    +});
    +},onBeforeRender:function(_671,rows){
    +var opts=$.data(_671,"datagrid").options;
    +var _672=[];
    +for(var i=0;i<rows.length;i++){
    +var row=rows[i];
    +var _673=_674(row[opts.groupField]);
    +if(!_673){
    +_673={fvalue:row[opts.groupField],rows:[row],startRow:i};
    +_672.push(_673);
    +}else{
    +_673.rows.push(row);
    +}
    +}
    +function _674(_675){
    +for(var i=0;i<_672.length;i++){
    +var _676=_672[i];
    +if(_676.fvalue==_675){
    +return _676;
    +}
    +}
    +return null;
    +};
    +this.groups=_672;
    +var _677=[];
    +for(var i=0;i<_672.length;i++){
    +var _673=_672[i];
    +for(var j=0;j<_673.rows.length;j++){
    +_677.push(_673.rows[j]);
    +}
    +}
    +$.data(_671,"datagrid").data.rows=_677;
    +}});
    +$.extend($.fn.datagrid.methods,{expandGroup:function(jq,_678){
    +return jq.each(function(){
    +var view=$.data(this,"datagrid").dc.view;
    +if(_678!=undefined){
    +var _679=view.find("div.datagrid-group[group-index=\""+_678+"\"]");
    +}else{
    +var _679=view.find("div.datagrid-group");
    +}
    +var _67a=_679.find("span.datagrid-row-expander");
    +if(_67a.hasClass("datagrid-row-expand")){
    +_67a.removeClass("datagrid-row-expand").addClass("datagrid-row-collapse");
    +_679.next("table").show();
    +}
    +$(this).datagrid("fixRowHeight");
    +});
    +},collapseGroup:function(jq,_67b){
    +return jq.each(function(){
    +var view=$.data(this,"datagrid").dc.view;
    +if(_67b!=undefined){
    +var _67c=view.find("div.datagrid-group[group-index=\""+_67b+"\"]");
    +}else{
    +var _67c=view.find("div.datagrid-group");
    +}
    +var _67d=_67c.find("span.datagrid-row-expander");
    +if(_67d.hasClass("datagrid-row-collapse")){
    +_67d.removeClass("datagrid-row-collapse").addClass("datagrid-row-expand");
    +_67c.next("table").hide();
    +}
    +$(this).datagrid("fixRowHeight");
    +});
    +}});
    +$.fn.propertygrid.defaults=$.extend({},$.fn.datagrid.defaults,{singleSelect:true,remoteSort:false,fitColumns:true,loadMsg:"",frozenColumns:[[{field:"f",width:16,resizable:false}]],columns:[[{field:"name",title:"Name",width:100,sortable:true},{field:"value",title:"Value",width:100,resizable:false}]],showGroup:false,groupField:"group",groupFormatter:function(_67e,rows){
    +return _67e;
    +}});
    +})(jQuery);
    +(function($){
    +function _67f(a,o){
    +for(var i=0,len=a.length;i<len;i++){
    +if(a[i]==o){
    +return i;
    +}
    +}
    +return -1;
    +};
    +function _680(a,o){
    +var _681=_67f(a,o);
    +if(_681!=-1){
    +a.splice(_681,1);
    +}
    +};
    +function _682(_683){
    +var opts=$.data(_683,"treegrid").options;
    +$(_683).datagrid($.extend({},opts,{url:null,data:null,loader:function(){
    +return false;
    +},onLoadSuccess:function(){
    +},onResizeColumn:function(_684,_685){
    +_69a(_683);
    +opts.onResizeColumn.call(_683,_684,_685);
    +},onSortColumn:function(sort,_686){
    +opts.sortName=sort;
    +opts.sortOrder=_686;
    +if(opts.remoteSort){
    +_699(_683);
    +}else{
    +var data=$(_683).treegrid("getData");
    +_6af(_683,0,data);
    +}
    +opts.onSortColumn.call(_683,sort,_686);
    +},onBeforeEdit:function(_687,row){
    +if(opts.onBeforeEdit.call(_683,row)==false){
    +return false;
    +}
    +},onAfterEdit:function(_688,row,_689){
    +opts.onAfterEdit.call(_683,row,_689);
    +},onCancelEdit:function(_68a,row){
    +opts.onCancelEdit.call(_683,row);
    +},onSelect:function(_68b){
    +opts.onSelect.call(_683,find(_683,_68b));
    +},onUnselect:function(_68c){
    +opts.onUnselect.call(_683,find(_683,_68c));
    +},onSelectAll:function(){
    +opts.onSelectAll.call(_683,$.data(_683,"treegrid").data);
    +},onUnselectAll:function(){
    +opts.onUnselectAll.call(_683,$.data(_683,"treegrid").data);
    +},onCheck:function(_68d){
    +opts.onCheck.call(_683,find(_683,_68d));
    +},onUncheck:function(_68e){
    +opts.onUncheck.call(_683,find(_683,_68e));
    +},onCheckAll:function(){
    +opts.onCheckAll.call(_683,$.data(_683,"treegrid").data);
    +},onUncheckAll:function(){
    +opts.onUncheckAll.call(_683,$.data(_683,"treegrid").data);
    +},onClickRow:function(_68f){
    +opts.onClickRow.call(_683,find(_683,_68f));
    +},onDblClickRow:function(_690){
    +opts.onDblClickRow.call(_683,find(_683,_690));
    +},onClickCell:function(_691,_692){
    +opts.onClickCell.call(_683,_692,find(_683,_691));
    +},onDblClickCell:function(_693,_694){
    +opts.onDblClickCell.call(_683,_694,find(_683,_693));
    +},onRowContextMenu:function(e,_695){
    +opts.onContextMenu.call(_683,e,find(_683,_695));
    +}}));
    +if(opts.pagination){
    +var _696=$(_683).datagrid("getPager");
    +_696.pagination({pageNumber:opts.pageNumber,pageSize:opts.pageSize,pageList:opts.pageList,onSelectPage:function(_697,_698){
    +opts.pageNumber=_697;
    +opts.pageSize=_698;
    +_699(_683);
    +}});
    +opts.pageSize=_696.pagination("options").pageSize;
    +}
    +};
    +function _69a(_69b,_69c){
    +var opts=$.data(_69b,"datagrid").options;
    +var dc=$.data(_69b,"datagrid").dc;
    +if(!dc.body1.is(":empty")&&(!opts.nowrap||opts.autoRowHeight)){
    +if(_69c!=undefined){
    +var _69d=_69e(_69b,_69c);
    +for(var i=0;i<_69d.length;i++){
    +_69f(_69d[i][opts.idField]);
    +}
    +}
    +}
    +$(_69b).datagrid("fixRowHeight",_69c);
    +function _69f(_6a0){
    +var tr1=opts.finder.getTr(_69b,_6a0,"body",1);
    +var tr2=opts.finder.getTr(_69b,_6a0,"body",2);
    +tr1.css("height","");
    +tr2.css("height","");
    +var _6a1=Math.max(tr1.height(),tr2.height());
    +tr1.css("height",_6a1);
    +tr2.css("height",_6a1);
    +};
    +};
    +function _6a2(_6a3){
    +var dc=$.data(_6a3,"datagrid").dc;
    +var opts=$.data(_6a3,"treegrid").options;
    +if(!opts.rownumbers){
    +return;
    +}
    +dc.body1.find("div.datagrid-cell-rownumber").each(function(i){
    +$(this).html(i+1);
    +});
    +};
    +function _6a4(_6a5){
    +var dc=$.data(_6a5,"datagrid").dc;
    +var body=dc.body1.add(dc.body2);
    +var _6a6=($.data(body[0],"events")||$._data(body[0],"events")).click[0].handler;
    +dc.body1.add(dc.body2).bind("mouseover",function(e){
    +var tt=$(e.target);
    +var tr=tt.closest("tr.datagrid-row");
    +if(!tr.length){
    +return;
    +}
    +if(tt.hasClass("tree-hit")){
    +tt.hasClass("tree-expanded")?tt.addClass("tree-expanded-hover"):tt.addClass("tree-collapsed-hover");
    +}
    +e.stopPropagation();
    +}).bind("mouseout",function(e){
    +var tt=$(e.target);
    +var tr=tt.closest("tr.datagrid-row");
    +if(!tr.length){
    +return;
    +}
    +if(tt.hasClass("tree-hit")){
    +tt.hasClass("tree-expanded")?tt.removeClass("tree-expanded-hover"):tt.removeClass("tree-collapsed-hover");
    +}
    +e.stopPropagation();
    +}).unbind("click").bind("click",function(e){
    +var tt=$(e.target);
    +var tr=tt.closest("tr.datagrid-row");
    +if(!tr.length){
    +return;
    +}
    +if(tt.hasClass("tree-hit")){
    +_6a7(_6a5,tr.attr("node-id"));
    +}else{
    +_6a6(e);
    +}
    +e.stopPropagation();
    +});
    +};
    +function _6a8(_6a9,_6aa){
    +var opts=$.data(_6a9,"treegrid").options;
    +var tr1=opts.finder.getTr(_6a9,_6aa,"body",1);
    +var tr2=opts.finder.getTr(_6a9,_6aa,"body",2);
    +var _6ab=$(_6a9).datagrid("getColumnFields",true).length+(opts.rownumbers?1:0);
    +var _6ac=$(_6a9).datagrid("getColumnFields",false).length;
    +_6ad(tr1,_6ab);
    +_6ad(tr2,_6ac);
    +function _6ad(tr,_6ae){
    +$("<tr class=\"treegrid-tr-tree\">"+"<td style=\"border:0px\" colspan=\""+_6ae+"\">"+"<div></div>"+"</td>"+"</tr>").insertAfter(tr);
    +};
    +};
    +function _6af(_6b0,_6b1,data,_6b2){
    +var opts=$.data(_6b0,"treegrid").options;
    +var dc=$.data(_6b0,"datagrid").dc;
    +data=opts.loadFilter.call(_6b0,data,_6b1);
    +var node=find(_6b0,_6b1);
    +if(node){
    +var _6b3=opts.finder.getTr(_6b0,_6b1,"body",1);
    +var _6b4=opts.finder.getTr(_6b0,_6b1,"body",2);
    +var cc1=_6b3.next("tr.treegrid-tr-tree").children("td").children("div");
    +var cc2=_6b4.next("tr.treegrid-tr-tree").children("td").children("div");
    +}else{
    +var cc1=dc.body1;
    +var cc2=dc.body2;
    +}
    +if(!_6b2){
    +$.data(_6b0,"treegrid").data=[];
    +cc1.empty();
    +cc2.empty();
    +}
    +if(opts.view.onBeforeRender){
    +opts.view.onBeforeRender.call(opts.view,_6b0,_6b1,data);
    +}
    +opts.view.render.call(opts.view,_6b0,cc1,true);
    +opts.view.render.call(opts.view,_6b0,cc2,false);
    +if(opts.showFooter){
    +opts.view.renderFooter.call(opts.view,_6b0,dc.footer1,true);
    +opts.view.renderFooter.call(opts.view,_6b0,dc.footer2,false);
    +}
    +if(opts.view.onAfterRender){
    +opts.view.onAfterRender.call(opts.view,_6b0);
    +}
    +opts.onLoadSuccess.call(_6b0,node,data);
    +if(!_6b1&&opts.pagination){
    +var _6b5=$.data(_6b0,"treegrid").total;
    +var _6b6=$(_6b0).datagrid("getPager");
    +if(_6b6.pagination("options").total!=_6b5){
    +_6b6.pagination({total:_6b5});
    +}
    +}
    +_69a(_6b0);
    +_6a2(_6b0);
    +$(_6b0).treegrid("autoSizeColumn");
    +};
    +function _699(_6b7,_6b8,_6b9,_6ba,_6bb){
    +var opts=$.data(_6b7,"treegrid").options;
    +var body=$(_6b7).datagrid("getPanel").find("div.datagrid-body");
    +if(_6b9){
    +opts.queryParams=_6b9;
    +}
    +var _6bc=$.extend({},opts.queryParams);
    +if(opts.pagination){
    +$.extend(_6bc,{page:opts.pageNumber,rows:opts.pageSize});
    +}
    +if(opts.sortName){
    +$.extend(_6bc,{sort:opts.sortName,order:opts.sortOrder});
    +}
    +var row=find(_6b7,_6b8);
    +if(opts.onBeforeLoad.call(_6b7,row,_6bc)==false){
    +return;
    +}
    +var _6bd=body.find("tr[node-id="+_6b8+"] span.tree-folder");
    +_6bd.addClass("tree-loading");
    +$(_6b7).treegrid("loading");
    +var _6be=opts.loader.call(_6b7,_6bc,function(data){
    +_6bd.removeClass("tree-loading");
    +$(_6b7).treegrid("loaded");
    +_6af(_6b7,_6b8,data,_6ba);
    +if(_6bb){
    +_6bb();
    +}
    +},function(){
    +_6bd.removeClass("tree-loading");
    +$(_6b7).treegrid("loaded");
    +opts.onLoadError.apply(_6b7,arguments);
    +if(_6bb){
    +_6bb();
    +}
    +});
    +if(_6be==false){
    +_6bd.removeClass("tree-loading");
    +$(_6b7).treegrid("loaded");
    +}
    +};
    +function _6bf(_6c0){
    +var rows=_6c1(_6c0);
    +if(rows.length){
    +return rows[0];
    +}else{
    +return null;
    +}
    +};
    +function _6c1(_6c2){
    +return $.data(_6c2,"treegrid").data;
    +};
    +function _6c3(_6c4,_6c5){
    +var row=find(_6c4,_6c5);
    +if(row._parentId){
    +return find(_6c4,row._parentId);
    +}else{
    +return null;
    +}
    +};
    +function _69e(_6c6,_6c7){
    +var opts=$.data(_6c6,"treegrid").options;
    +var body=$(_6c6).datagrid("getPanel").find("div.datagrid-view2 div.datagrid-body");
    +var _6c8=[];
    +if(_6c7){
    +_6c9(_6c7);
    +}else{
    +var _6ca=_6c1(_6c6);
    +for(var i=0;i<_6ca.length;i++){
    +_6c8.push(_6ca[i]);
    +_6c9(_6ca[i][opts.idField]);
    +}
    +}
    +function _6c9(_6cb){
    +var _6cc=find(_6c6,_6cb);
    +if(_6cc&&_6cc.children){
    +for(var i=0,len=_6cc.children.length;i<len;i++){
    +var _6cd=_6cc.children[i];
    +_6c8.push(_6cd);
    +_6c9(_6cd[opts.idField]);
    +}
    +}
    +};
    +return _6c8;
    +};
    +function _6ce(_6cf){
    +var rows=_6d0(_6cf);
    +if(rows.length){
    +return rows[0];
    +}else{
    +return null;
    +}
    +};
    +function _6d0(_6d1){
    +var rows=[];
    +var _6d2=$(_6d1).datagrid("getPanel");
    +_6d2.find("div.datagrid-view2 div.datagrid-body tr.datagrid-row-selected").each(function(){
    +var id=$(this).attr("node-id");
    +rows.push(find(_6d1,id));
    +});
    +return rows;
    +};
    +function _6d3(_6d4,_6d5){
    +if(!_6d5){
    +return 0;
    +}
    +var opts=$.data(_6d4,"treegrid").options;
    +var view=$(_6d4).datagrid("getPanel").children("div.datagrid-view");
    +var node=view.find("div.datagrid-body tr[node-id="+_6d5+"]").children("td[field="+opts.treeField+"]");
    +return node.find("span.tree-indent,span.tree-hit").length;
    +};
    +function find(_6d6,_6d7){
    +var opts=$.data(_6d6,"treegrid").options;
    +var data=$.data(_6d6,"treegrid").data;
    +var cc=[data];
    +while(cc.length){
    +var c=cc.shift();
    +for(var i=0;i<c.length;i++){
    +var node=c[i];
    +if(node[opts.idField]==_6d7){
    +return node;
    +}else{
    +if(node["children"]){
    +cc.push(node["children"]);
    +}
    +}
    +}
    +}
    +return null;
    +};
    +function _6d8(_6d9,_6da){
    +var opts=$.data(_6d9,"treegrid").options;
    +var row=find(_6d9,_6da);
    +var tr=opts.finder.getTr(_6d9,_6da);
    +var hit=tr.find("span.tree-hit");
    +if(hit.length==0){
    +return;
    +}
    +if(hit.hasClass("tree-collapsed")){
    +return;
    +}
    +if(opts.onBeforeCollapse.call(_6d9,row)==false){
    +return;
    +}
    +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed");
    +hit.next().removeClass("tree-folder-open");
    +row.state="closed";
    +tr=tr.next("tr.treegrid-tr-tree");
    +var cc=tr.children("td").children("div");
    +if(opts.animate){
    +cc.slideUp("normal",function(){
    +$(_6d9).treegrid("autoSizeColumn");
    +_69a(_6d9,_6da);
    +opts.onCollapse.call(_6d9,row);
    +});
    +}else{
    +cc.hide();
    +$(_6d9).treegrid("autoSizeColumn");
    +_69a(_6d9,_6da);
    +opts.onCollapse.call(_6d9,row);
    +}
    +};
    +function _6db(_6dc,_6dd){
    +var opts=$.data(_6dc,"treegrid").options;
    +var tr=opts.finder.getTr(_6dc,_6dd);
    +var hit=tr.find("span.tree-hit");
    +var row=find(_6dc,_6dd);
    +if(hit.length==0){
    +return;
    +}
    +if(hit.hasClass("tree-expanded")){
    +return;
    +}
    +if(opts.onBeforeExpand.call(_6dc,row)==false){
    +return;
    +}
    +hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded");
    +hit.next().addClass("tree-folder-open");
    +var _6de=tr.next("tr.treegrid-tr-tree");
    +if(_6de.length){
    +var cc=_6de.children("td").children("div");
    +_6df(cc);
    +}else{
    +_6a8(_6dc,row[opts.idField]);
    +var _6de=tr.next("tr.treegrid-tr-tree");
    +var cc=_6de.children("td").children("div");
    +cc.hide();
    +_699(_6dc,row[opts.idField],{id:row[opts.idField]},true,function(){
    +if(cc.is(":empty")){
    +_6de.remove();
    +}else{
    +_6df(cc);
    +}
    +});
    +}
    +function _6df(cc){
    +row.state="open";
    +if(opts.animate){
    +cc.slideDown("normal",function(){
    +$(_6dc).treegrid("autoSizeColumn");
    +_69a(_6dc,_6dd);
    +opts.onExpand.call(_6dc,row);
    +});
    +}else{
    +cc.show();
    +$(_6dc).treegrid("autoSizeColumn");
    +_69a(_6dc,_6dd);
    +opts.onExpand.call(_6dc,row);
    +}
    +};
    +};
    +function _6a7(_6e0,_6e1){
    +var opts=$.data(_6e0,"treegrid").options;
    +var tr=opts.finder.getTr(_6e0,_6e1);
    +var hit=tr.find("span.tree-hit");
    +if(hit.hasClass("tree-expanded")){
    +_6d8(_6e0,_6e1);
    +}else{
    +_6db(_6e0,_6e1);
    +}
    +};
    +function _6e2(_6e3,_6e4){
    +var opts=$.data(_6e3,"treegrid").options;
    +var _6e5=_69e(_6e3,_6e4);
    +if(_6e4){
    +_6e5.unshift(find(_6e3,_6e4));
    +}
    +for(var i=0;i<_6e5.length;i++){
    +_6d8(_6e3,_6e5[i][opts.idField]);
    +}
    +};
    +function _6e6(_6e7,_6e8){
    +var opts=$.data(_6e7,"treegrid").options;
    +var _6e9=_69e(_6e7,_6e8);
    +if(_6e8){
    +_6e9.unshift(find(_6e7,_6e8));
    +}
    +for(var i=0;i<_6e9.length;i++){
    +_6db(_6e7,_6e9[i][opts.idField]);
    +}
    +};
    +function _6ea(_6eb,_6ec){
    +var opts=$.data(_6eb,"treegrid").options;
    +var ids=[];
    +var p=_6c3(_6eb,_6ec);
    +while(p){
    +var id=p[opts.idField];
    +ids.unshift(id);
    +p=_6c3(_6eb,id);
    +}
    +for(var i=0;i<ids.length;i++){
    +_6db(_6eb,ids[i]);
    +}
    +};
    +function _6ed(_6ee,_6ef){
    +var opts=$.data(_6ee,"treegrid").options;
    +if(_6ef.parent){
    +var tr=opts.finder.getTr(_6ee,_6ef.parent);
    +if(tr.next("tr.treegrid-tr-tree").length==0){
    +_6a8(_6ee,_6ef.parent);
    +}
    +var cell=tr.children("td[field="+opts.treeField+"]").children("div.datagrid-cell");
    +var _6f0=cell.children("span.tree-icon");
    +if(_6f0.hasClass("tree-file")){
    +_6f0.removeClass("tree-file").addClass("tree-folder");
    +var hit=$("<span class=\"tree-hit tree-expanded\"></span>").insertBefore(_6f0);
    +if(hit.prev().length){
    +hit.prev().remove();
    +}
    +}
    +}
    +_6af(_6ee,_6ef.parent,_6ef.data,true);
    +};
    +function _6f1(_6f2,_6f3){
    +var ref=_6f3.before||_6f3.after;
    +var opts=$.data(_6f2,"treegrid").options;
    +var _6f4=_6c3(_6f2,ref);
    +_6ed(_6f2,{parent:(_6f4?_6f4[opts.idField]:null),data:[_6f3.data]});
    +_6f5(true);
    +_6f5(false);
    +_6a2(_6f2);
    +function _6f5(_6f6){
    +var _6f7=_6f6?1:2;
    +var tr=opts.finder.getTr(_6f2,_6f3.data[opts.idField],"body",_6f7);
    +var _6f8=tr.closest("table.datagrid-btable");
    +tr=tr.parent().children();
    +var dest=opts.finder.getTr(_6f2,ref,"body",_6f7);
    +if(_6f3.before){
    +tr.insertBefore(dest);
    +}else{
    +var sub=dest.next("tr.treegrid-tr-tree");
    +tr.insertAfter(sub.length?sub:dest);
    +}
    +_6f8.remove();
    +};
    +};
    +function _6f9(_6fa,_6fb){
    +var opts=$.data(_6fa,"treegrid").options;
    +var tr=opts.finder.getTr(_6fa,_6fb);
    +tr.next("tr.treegrid-tr-tree").remove();
    +tr.remove();
    +var _6fc=del(_6fb);
    +if(_6fc){
    +if(_6fc.children.length==0){
    +tr=opts.finder.getTr(_6fa,_6fc[opts.idField]);
    +tr.next("tr.treegrid-tr-tree").remove();
    +var cell=tr.children("td[field="+opts.treeField+"]").children("div.datagrid-cell");
    +cell.find(".tree-icon").removeClass("tree-folder").addClass("tree-file");
    +cell.find(".tree-hit").remove();
    +$("<span class=\"tree-indent\"></span>").prependTo(cell);
    +}
    +}
    +_6a2(_6fa);
    +function del(id){
    +var cc;
    +var _6fd=_6c3(_6fa,_6fb);
    +if(_6fd){
    +cc=_6fd.children;
    +}else{
    +cc=$(_6fa).treegrid("getData");
    +}
    +for(var i=0;i<cc.length;i++){
    +if(cc[i][opts.idField]==id){
    +cc.splice(i,1);
    +break;
    +}
    +}
    +return _6fd;
    +};
    +};
    +$.fn.treegrid=function(_6fe,_6ff){
    +if(typeof _6fe=="string"){
    +var _700=$.fn.treegrid.methods[_6fe];
    +if(_700){
    +return _700(this,_6ff);
    +}else{
    +return this.datagrid(_6fe,_6ff);
    +}
    +}
    +_6fe=_6fe||{};
    +return this.each(function(){
    +var _701=$.data(this,"treegrid");
    +if(_701){
    +$.extend(_701.options,_6fe);
    +}else{
    +_701=$.data(this,"treegrid",{options:$.extend({},$.fn.treegrid.defaults,$.fn.treegrid.parseOptions(this),_6fe),data:[]});
    +}
    +_682(this);
    +if(_701.options.data){
    +$(this).treegrid("loadData",_701.options.data);
    +}
    +_699(this);
    +_6a4(this);
    +});
    +};
    +$.fn.treegrid.methods={options:function(jq){
    +return $.data(jq[0],"treegrid").options;
    +},resize:function(jq,_702){
    +return jq.each(function(){
    +$(this).datagrid("resize",_702);
    +});
    +},fixRowHeight:function(jq,_703){
    +return jq.each(function(){
    +_69a(this,_703);
    +});
    +},loadData:function(jq,data){
    +return jq.each(function(){
    +_6af(this,null,data);
    +});
    +},reload:function(jq,id){
    +return jq.each(function(){
    +if(id){
    +var node=$(this).treegrid("find",id);
    +if(node.children){
    +node.children.splice(0,node.children.length);
    +}
    +var body=$(this).datagrid("getPanel").find("div.datagrid-body");
    +var tr=body.find("tr[node-id="+id+"]");
    +tr.next("tr.treegrid-tr-tree").remove();
    +var hit=tr.find("span.tree-hit");
    +hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed");
    +_6db(this,id);
    +}else{
    +_699(this,null,{});
    +}
    +});
    +},reloadFooter:function(jq,_704){
    +return jq.each(function(){
    +var opts=$.data(this,"treegrid").options;
    +var dc=$.data(this,"datagrid").dc;
    +if(_704){
    +$.data(this,"treegrid").footer=_704;
    +}
    +if(opts.showFooter){
    +opts.view.renderFooter.call(opts.view,this,dc.footer1,true);
    +opts.view.renderFooter.call(opts.view,this,dc.footer2,false);
    +if(opts.view.onAfterRender){
    +opts.view.onAfterRender.call(opts.view,this);
    +}
    +$(this).treegrid("fixRowHeight");
    +}
    +});
    +},getData:function(jq){
    +return $.data(jq[0],"treegrid").data;
    +},getFooterRows:function(jq){
    +return $.data(jq[0],"treegrid").footer;
    +},getRoot:function(jq){
    +return _6bf(jq[0]);
    +},getRoots:function(jq){
    +return _6c1(jq[0]);
    +},getParent:function(jq,id){
    +return _6c3(jq[0],id);
    +},getChildren:function(jq,id){
    +return _69e(jq[0],id);
    +},getSelected:function(jq){
    +return _6ce(jq[0]);
    +},getSelections:function(jq){
    +return _6d0(jq[0]);
    +},getLevel:function(jq,id){
    +return _6d3(jq[0],id);
    +},find:function(jq,id){
    +return find(jq[0],id);
    +},isLeaf:function(jq,id){
    +var opts=$.data(jq[0],"treegrid").options;
    +var tr=opts.finder.getTr(jq[0],id);
    +var hit=tr.find("span.tree-hit");
    +return hit.length==0;
    +},select:function(jq,id){
    +return jq.each(function(){
    +$(this).datagrid("selectRow",id);
    +});
    +},unselect:function(jq,id){
    +return jq.each(function(){
    +$(this).datagrid("unselectRow",id);
    +});
    +},collapse:function(jq,id){
    +return jq.each(function(){
    +_6d8(this,id);
    +});
    +},expand:function(jq,id){
    +return jq.each(function(){
    +_6db(this,id);
    +});
    +},toggle:function(jq,id){
    +return jq.each(function(){
    +_6a7(this,id);
    +});
    +},collapseAll:function(jq,id){
    +return jq.each(function(){
    +_6e2(this,id);
    +});
    +},expandAll:function(jq,id){
    +return jq.each(function(){
    +_6e6(this,id);
    +});
    +},expandTo:function(jq,id){
    +return jq.each(function(){
    +_6ea(this,id);
    +});
    +},append:function(jq,_705){
    +return jq.each(function(){
    +_6ed(this,_705);
    +});
    +},insert:function(jq,_706){
    +return jq.each(function(){
    +_6f1(this,_706);
    +});
    +},remove:function(jq,id){
    +return jq.each(function(){
    +_6f9(this,id);
    +});
    +},pop:function(jq,id){
    +var row=jq.treegrid("find",id);
    +jq.treegrid("remove",id);
    +return row;
    +},refresh:function(jq,id){
    +return jq.each(function(){
    +var opts=$.data(this,"treegrid").options;
    +opts.view.refreshRow.call(opts.view,this,id);
    +});
    +},update:function(jq,_707){
    +return jq.each(function(){
    +var opts=$.data(this,"treegrid").options;
    +opts.view.updateRow.call(opts.view,this,_707.id,_707.row);
    +});
    +},beginEdit:function(jq,id){
    +return jq.each(function(){
    +$(this).datagrid("beginEdit",id);
    +$(this).treegrid("fixRowHeight",id);
    +});
    +},endEdit:function(jq,id){
    +return jq.each(function(){
    +$(this).datagrid("endEdit",id);
    +});
    +},cancelEdit:function(jq,id){
    +return jq.each(function(){
    +$(this).datagrid("cancelEdit",id);
    +});
    +}};
    +$.fn.treegrid.parseOptions=function(_708){
    +return $.extend({},$.fn.datagrid.parseOptions(_708),$.parser.parseOptions(_708,["treeField",{animate:"boolean"}]));
    +};
    +var _709=$.extend({},$.fn.datagrid.defaults.view,{render:function(_70a,_70b,_70c){
    +var opts=$.data(_70a,"treegrid").options;
    +var _70d=$(_70a).datagrid("getColumnFields",_70c);
    +var _70e=$.data(_70a,"datagrid").rowIdPrefix;
    +if(_70c){
    +if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){
    +return;
    +}
    +}
    +var view=this;
    +var _70f=_710(_70c,this.treeLevel,this.treeNodes);
    +$(_70b).append(_70f.join(""));
    +function _710(_711,_712,_713){
    +var _714=["<table class=\"datagrid-btable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>"];
    +for(var i=0;i<_713.length;i++){
    +var row=_713[i];
    +if(row.state!="open"&&row.state!="closed"){
    +row.state="open";
    +}
    +var _715=opts.rowStyler?opts.rowStyler.call(_70a,row):"";
    +var _716=_715?"style=\""+_715+"\"":"";
    +var _717=_70e+"-"+(_711?1:2)+"-"+row[opts.idField];
    +_714.push("<tr id=\""+_717+"\" class=\"datagrid-row\" node-id="+row[opts.idField]+" "+_716+">");
    +_714=_714.concat(view.renderRow.call(view,_70a,_70d,_711,_712,row));
    +_714.push("</tr>");
    +if(row.children&&row.children.length){
    +var tt=_710(_711,_712+1,row.children);
    +var v=row.state=="closed"?"none":"block";
    +_714.push("<tr class=\"treegrid-tr-tree\"><td style=\"border:0px\" colspan="+(_70d.length+(opts.rownumbers?1:0))+"><div style=\"display:"+v+"\">");
    +_714=_714.concat(tt);
    +_714.push("</div></td></tr>");
    +}
    +}
    +_714.push("</tbody></table>");
    +return _714;
    +};
    +},renderFooter:function(_718,_719,_71a){
    +var opts=$.data(_718,"treegrid").options;
    +var rows=$.data(_718,"treegrid").footer||[];
    +var _71b=$(_718).datagrid("getColumnFields",_71a);
    +var _71c=["<table class=\"datagrid-ftable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>"];
    +for(var i=0;i<rows.length;i++){
    +var row=rows[i];
    +row[opts.idField]=row[opts.idField]||("foot-row-id"+i);
    +_71c.push("<tr class=\"datagrid-row\" node-id="+row[opts.idField]+">");
    +_71c.push(this.renderRow.call(this,_718,_71b,_71a,0,row));
    +_71c.push("</tr>");
    +}
    +_71c.push("</tbody></table>");
    +$(_719).html(_71c.join(""));
    +},renderRow:function(_71d,_71e,_71f,_720,row){
    +var opts=$.data(_71d,"treegrid").options;
    +var cc=[];
    +if(_71f&&opts.rownumbers){
    +cc.push("<td class=\"datagrid-td-rownumber\"><div class=\"datagrid-cell-rownumber\">0</div></td>");
    +}
    +for(var i=0;i<_71e.length;i++){
    +var _721=_71e[i];
    +var col=$(_71d).datagrid("getColumnOption",_721);
    +if(col){
    +var _722=col.styler?(col.styler(row[_721],row)||""):"";
    +var _723=col.hidden?"style=\"display:none;"+_722+"\"":(_722?"style=\""+_722+"\"":"");
    +cc.push("<td field=\""+_721+"\" "+_723+">");
    +if(col.checkbox){
    +var _723="";
    +}else{
    +var _723="";
    +if(col.align){
    +_723+="text-align:"+col.align+";";
    +}
    +if(!opts.nowrap){
    +_723+="white-space:normal;height:auto;";
    +}else{
    +if(opts.autoRowHeight){
    +_723+="height:auto;";
    +}
    +}
    +}
    +cc.push("<div style=\""+_723+"\" ");
    +if(col.checkbox){
    +cc.push("class=\"datagrid-cell-check ");
    +}else{
    +cc.push("class=\"datagrid-cell "+col.cellClass);
    +}
    +cc.push("\">");
    +if(col.checkbox){
    +if(row.checked){
    +cc.push("<input type=\"checkbox\" checked=\"checked\"");
    +}else{
    +cc.push("<input type=\"checkbox\"");
    +}
    +cc.push(" name=\""+_721+"\" value=\""+(row[_721]!=undefined?row[_721]:"")+"\"/>");
    +}else{
    +var val=null;
    +if(col.formatter){
    +val=col.formatter(row[_721],row);
    +}else{
    +val=row[_721];
    +}
    +if(_721==opts.treeField){
    +for(var j=0;j<_720;j++){
    +cc.push("<span class=\"tree-indent\"></span>");
    +}
    +if(row.state=="closed"){
    +cc.push("<span class=\"tree-hit tree-collapsed\"></span>");
    +cc.push("<span class=\"tree-icon tree-folder "+(row.iconCls?row.iconCls:"")+"\"></span>");
    +}else{
    +if(row.children&&row.children.length){
    +cc.push("<span class=\"tree-hit tree-expanded\"></span>");
    +cc.push("<span class=\"tree-icon tree-folder tree-folder-open "+(row.iconCls?row.iconCls:"")+"\"></span>");
    +}else{
    +cc.push("<span class=\"tree-indent\"></span>");
    +cc.push("<span class=\"tree-icon tree-file "+(row.iconCls?row.iconCls:"")+"\"></span>");
    +}
    +}
    +cc.push("<span class=\"tree-title\">"+val+"</span>");
    +}else{
    +cc.push(val);
    +}
    +}
    +cc.push("</div>");
    +cc.push("</td>");
    +}
    +}
    +return cc.join("");
    +},refreshRow:function(_724,id){
    +this.updateRow.call(this,_724,id,{});
    +},updateRow:function(_725,id,row){
    +var opts=$.data(_725,"treegrid").options;
    +var _726=$(_725).treegrid("find",id);
    +$.extend(_726,row);
    +var _727=$(_725).treegrid("getLevel",id)-1;
    +var _728=opts.rowStyler?opts.rowStyler.call(_725,_726):"";
    +function _729(_72a){
    +var _72b=$(_725).treegrid("getColumnFields",_72a);
    +var tr=opts.finder.getTr(_725,id,"body",(_72a?1:2));
    +var _72c=tr.find("div.datagrid-cell-rownumber").html();
    +var _72d=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked");
    +tr.html(this.renderRow(_725,_72b,_72a,_727,_726));
    +tr.attr("style",_728||"");
    +tr.find("div.datagrid-cell-rownumber").html(_72c);
    +if(_72d){
    +tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true);
    +}
    +};
    +_729.call(this,true);
    +_729.call(this,false);
    +$(_725).treegrid("fixRowHeight",id);
    +},onBeforeRender:function(_72e,_72f,data){
    +if(!data){
    +return false;
    +}
    +var opts=$.data(_72e,"treegrid").options;
    +if(data.length==undefined){
    +if(data.footer){
    +$.data(_72e,"treegrid").footer=data.footer;
    +}
    +if(data.total){
    +$.data(_72e,"treegrid").total=data.total;
    +}
    +data=this.transfer(_72e,_72f,data.rows);
    +}else{
    +function _730(_731,_732){
    +for(var i=0;i<_731.length;i++){
    +var row=_731[i];
    +row._parentId=_732;
    +if(row.children&&row.children.length){
    +_730(row.children,row[opts.idField]);
    +}
    +}
    +};
    +_730(data,_72f);
    +}
    +var node=find(_72e,_72f);
    +if(node){
    +if(node.children){
    +node.children=node.children.concat(data);
    +}else{
    +node.children=data;
    +}
    +}else{
    +$.data(_72e,"treegrid").data=$.data(_72e,"treegrid").data.concat(data);
    +}
    +if(!opts.remoteSort){
    +this.sort(_72e,data);
    +}
    +this.treeNodes=data;
    +this.treeLevel=$(_72e).treegrid("getLevel",_72f);
    +},sort:function(_733,data){
    +var opts=$.data(_733,"treegrid").options;
    +var opt=$(_733).treegrid("getColumnOption",opts.sortName);
    +if(opt){
    +var _734=opt.sorter||function(a,b){
    +return (a>b?1:-1);
    +};
    +_735(data);
    +}
    +function _735(rows){
    +rows.sort(function(r1,r2){
    +return _734(r1[opts.sortName],r2[opts.sortName])*(opts.sortOrder=="asc"?1:-1);
    +});
    +for(var i=0;i<rows.length;i++){
    +var _736=rows[i].children;
    +if(_736&&_736.length){
    +_735(_736);
    +}
    +}
    +};
    +},transfer:function(_737,_738,data){
    +var opts=$.data(_737,"treegrid").options;
    +var rows=[];
    +for(var i=0;i<data.length;i++){
    +rows.push(data[i]);
    +}
    +var _739=[];
    +for(var i=0;i<rows.length;i++){
    +var row=rows[i];
    +if(!_738){
    +if(!row._parentId){
    +_739.push(row);
    +_680(rows,row);
    +i--;
    +}
    +}else{
    +if(row._parentId==_738){
    +_739.push(row);
    +_680(rows,row);
    +i--;
    +}
    +}
    +}
    +var toDo=[];
    +for(var i=0;i<_739.length;i++){
    +toDo.push(_739[i]);
    +}
    +while(toDo.length){
    +var node=toDo.shift();
    +for(var i=0;i<rows.length;i++){
    +var row=rows[i];
    +if(row._parentId==node[opts.idField]){
    +if(node.children){
    +node.children.push(row);
    +}else{
    +node.children=[row];
    +}
    +toDo.push(row);
    +_680(rows,row);
    +i--;
    +}
    +}
    +}
    +return _739;
    +}});
    +$.fn.treegrid.defaults=$.extend({},$.fn.datagrid.defaults,{treeField:null,animate:false,singleSelect:true,view:_709,loader:function(_73a,_73b,_73c){
    +var opts=$(this).treegrid("options");
    +if(!opts.url){
    +return false;
    +}
    +$.ajax({type:opts.method,url:opts.url,data:_73a,dataType:"json",success:function(data){
    +_73b(data);
    +},error:function(){
    +_73c.apply(this,arguments);
    +}});
    +},loadFilter:function(data,_73d){
    +return data;
    +},finder:{getTr:function(_73e,id,type,_73f){
    +type=type||"body";
    +_73f=_73f||0;
    +var dc=$.data(_73e,"datagrid").dc;
    +if(_73f==0){
    +var opts=$.data(_73e,"treegrid").options;
    +var tr1=opts.finder.getTr(_73e,id,type,1);
    +var tr2=opts.finder.getTr(_73e,id,type,2);
    +return tr1.add(tr2);
    +}else{
    +if(type=="body"){
    +var tr=$("#"+$.data(_73e,"datagrid").rowIdPrefix+"-"+_73f+"-"+id);
    +if(!tr.length){
    +tr=(_73f==1?dc.body1:dc.body2).find("tr[node-id="+id+"]");
    +}
    +return tr;
    +}else{
    +if(type=="footer"){
    +return (_73f==1?dc.footer1:dc.footer2).find("tr[node-id="+id+"]");
    +}else{
    +if(type=="selected"){
    +return (_73f==1?dc.body1:dc.body2).find("tr.datagrid-row-selected");
    +}else{
    +if(type=="last"){
    +return (_73f==1?dc.body1:dc.body2).find("tr:last[node-id]");
    +}else{
    +if(type=="allbody"){
    +return (_73f==1?dc.body1:dc.body2).find("tr[node-id]");
    +}else{
    +if(type=="allfooter"){
    +return (_73f==1?dc.footer1:dc.footer2).find("tr[node-id]");
    +}
    +}
    +}
    +}
    +}
    +}
    +}
    +},getRow:function(_740,p){
    +var id=(typeof p=="object")?p.attr("node-id"):p;
    +return $(_740).treegrid("find",id);
    +}},onBeforeLoad:function(row,_741){
    +},onLoadSuccess:function(row,data){
    +},onLoadError:function(){
    +},onBeforeCollapse:function(row){
    +},onCollapse:function(row){
    +},onBeforeExpand:function(row){
    +},onExpand:function(row){
    +},onClickRow:function(row){
    +},onDblClickRow:function(row){
    +},onClickCell:function(_742,row){
    +},onDblClickCell:function(_743,row){
    +},onContextMenu:function(e,row){
    +},onBeforeEdit:function(row){
    +},onAfterEdit:function(row,_744){
    +},onCancelEdit:function(row){
    +}});
    +})(jQuery);
    +(function($){
    +function _745(_746,_747){
    +var opts=$.data(_746,"combo").options;
    +var _748=$.data(_746,"combo").combo;
    +var _749=$.data(_746,"combo").panel;
    +if(_747){
    +opts.width=_747;
    +}
    +if(isNaN(opts.width)){
    +var c=$(_746).clone();
    +c.css("visibility","hidden");
    +c.appendTo("body");
    +opts.width=c.outerWidth();
    +c.remove();
    +}
    +_748.appendTo("body");
    +var _74a=_748.find("input.combo-text");
    +var _74b=_748.find(".combo-arrow");
    +var _74c=opts.hasDownArrow?_74b._outerWidth():0;
    +_748._outerWidth(opts.width)._outerHeight(opts.height);
    +_74a._outerWidth(_748.width()-_74c);
    +_74a.css({height:_748.height()+"px",lineHeight:_748.height()+"px"});
    +_74b._outerHeight(_748.height());
    +_749.panel("resize",{width:(opts.panelWidth?opts.panelWidth:_748.outerWidth()),height:opts.panelHeight});
    +_748.insertAfter(_746);
    +};
    +function _74d(_74e){
    +var opts=$.data(_74e,"combo").options;
    +var _74f=$.data(_74e,"combo").combo;
    +if(opts.hasDownArrow){
    +_74f.find(".combo-arrow").show();
    +}else{
    +_74f.find(".combo-arrow").hide();
    +}
    +};
    +function init(_750){
    +$(_750).addClass("combo-f").hide();
    +var span=$("<span class=\"combo\"></span>").insertAfter(_750);
    +var _751=$("<input type=\"text\" class=\"combo-text\">").appendTo(span);
    +$("<span><span class=\"combo-arrow\"></span></span>").appendTo(span);
    +$("<input type=\"hidden\" class=\"combo-value\">").appendTo(span);
    +var _752=$("<div class=\"combo-panel\"></div>").appendTo("body");
    +_752.panel({doSize:false,closed:true,cls:"combo-p",style:{position:"absolute",zIndex:10},onOpen:function(){
    +$(this).panel("resize");
    +}});
    +var name=$(_750).attr("name");
    +if(name){
    +span.find("input.combo-value").attr("name",name);
    +$(_750).removeAttr("name").attr("comboName",name);
    +}
    +_751.attr("autocomplete","off");
    +return {combo:span,panel:_752};
    +};
    +function _753(_754){
    +var _755=$.data(_754,"combo").combo.find("input.combo-text");
    +_755.validatebox("destroy");
    +$.data(_754,"combo").panel.panel("destroy");
    +$.data(_754,"combo").combo.remove();
    +$(_754).remove();
    +};
    +function _756(_757){
    +var _758=$.data(_757,"combo");
    +var opts=_758.options;
    +var _759=$.data(_757,"combo").combo;
    +var _75a=$.data(_757,"combo").panel;
    +var _75b=_759.find(".combo-text");
    +var _75c=_759.find(".combo-arrow");
    +$(document).unbind(".combo").bind("mousedown.combo",function(e){
    +var p=$(e.target).closest("span.combo,div.combo-panel");
    +if(p.length){
    +return;
    +}
    +var _75d=$("body>div.combo-p>div.combo-panel");
    +_75d.panel("close");
    +});
    +_759.unbind(".combo");
    +_75a.unbind(".combo");
    +_75b.unbind(".combo");
    +_75c.unbind(".combo");
    +if(!opts.disabled){
    +_75b.bind("mousedown.combo",function(e){
    +$("div.combo-panel").not(_75a).panel("close");
    +e.stopPropagation();
    +}).bind("keydown.combo",function(e){
    +switch(e.keyCode){
    +case 38:
    +opts.keyHandler.up.call(_757);
    +break;
    +case 40:
    +opts.keyHandler.down.call(_757);
    +break;
    +case 13:
    +e.preventDefault();
    +opts.keyHandler.enter.call(_757);
    +return false;
    +case 9:
    +case 27:
    +_764(_757);
    +break;
    +default:
    +if(opts.editable){
    +if(_758.timer){
    +clearTimeout(_758.timer);
    +}
    +_758.timer=setTimeout(function(){
    +var q=_75b.val();
    +if(_758.previousValue!=q){
    +_758.previousValue=q;
    +$(_757).combo("showPanel");
    +opts.keyHandler.query.call(_757,_75b.val());
    +_767(_757,true);
    +}
    +},opts.delay);
    +}
    +}
    +});
    +_75c.bind("click.combo",function(){
    +if(_75a.is(":visible")){
    +_764(_757);
    +}else{
    +$("div.combo-panel").panel("close");
    +$(_757).combo("showPanel");
    +}
    +_75b.focus();
    +}).bind("mouseenter.combo",function(){
    +$(this).addClass("combo-arrow-hover");
    +}).bind("mouseleave.combo",function(){
    +$(this).removeClass("combo-arrow-hover");
    +}).bind("mousedown.combo",function(){
    +});
    +}
    +};
    +function _75e(_75f){
    +var opts=$.data(_75f,"combo").options;
    +var _760=$.data(_75f,"combo").combo;
    +var _761=$.data(_75f,"combo").panel;
    +if($.fn.window){
    +_761.panel("panel").css("z-index",$.fn.window.defaults.zIndex++);
    +}
    +_761.panel("move",{left:_760.offset().left,top:_762()});
    +if(_761.panel("options").closed){
    +_761.panel("open");
    +opts.onShowPanel.call(_75f);
    +}
    +(function(){
    +if(_761.is(":visible")){
    +_761.panel("move",{left:_763(),top:_762()});
    +setTimeout(arguments.callee,200);
    +}
    +})();
    +function _763(){
    +var left=_760.offset().left;
    +if(left+_761._outerWidth()>$(window)._outerWidth()+$(document).scrollLeft()){
    +left=$(window)._outerWidth()+$(document).scrollLeft()-_761._outerWidth();
    +}
    +if(left<0){
    +left=0;
    +}
    +return left;
    +};
    +function _762(){
    +var top=_760.offset().top+_760._outerHeight();
    +if(top+_761._outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){
    +top=_760.offset().top-_761._outerHeight();
    +}
    +if(top<$(document).scrollTop()){
    +top=_760.offset().top+_760._outerHeight();
    +}
    +return top;
    +};
    +};
    +function _764(_765){
    +var opts=$.data(_765,"combo").options;
    +var _766=$.data(_765,"combo").panel;
    +_766.panel("close");
    +opts.onHidePanel.call(_765);
    +};
    +function _767(_768,doit){
    +var opts=$.data(_768,"combo").options;
    +var _769=$.data(_768,"combo").combo.find("input.combo-text");
    +_769.validatebox(opts);
    +if(doit){
    +_769.validatebox("validate");
    +}
    +};
    +function _76a(_76b,_76c){
    +var opts=$.data(_76b,"combo").options;
    +var _76d=$.data(_76b,"combo").combo;
    +if(_76c){
    +opts.disabled=true;
    +$(_76b).attr("disabled",true);
    +_76d.find(".combo-value").attr("disabled",true);
    +_76d.find(".combo-text").attr("disabled",true);
    +}else{
    +opts.disabled=false;
    +$(_76b).removeAttr("disabled");
    +_76d.find(".combo-value").removeAttr("disabled");
    +_76d.find(".combo-text").removeAttr("disabled");
    +}
    +};
    +function _76e(_76f){
    +var opts=$.data(_76f,"combo").options;
    +var _770=$.data(_76f,"combo").combo;
    +if(opts.multiple){
    +_770.find("input.combo-value").remove();
    +}else{
    +_770.find("input.combo-value").val("");
    +}
    +_770.find("input.combo-text").val("");
    +};
    +function _771(_772){
    +var _773=$.data(_772,"combo").combo;
    +return _773.find("input.combo-text").val();
    +};
    +function _774(_775,text){
    +var _776=$.data(_775,"combo").combo;
    +_776.find("input.combo-text").val(text);
    +_767(_775,true);
    +$.data(_775,"combo").previousValue=text;
    +};
    +function _777(_778){
    +var _779=[];
    +var _77a=$.data(_778,"combo").combo;
    +_77a.find("input.combo-value").each(function(){
    +_779.push($(this).val());
    +});
    +return _779;
    +};
    +function _77b(_77c,_77d){
    +var opts=$.data(_77c,"combo").options;
    +var _77e=_777(_77c);
    +var _77f=$.data(_77c,"combo").combo;
    +_77f.find("input.combo-value").remove();
    +var name=$(_77c).attr("comboName");
    +for(var i=0;i<_77d.length;i++){
    +var _780=$("<input type=\"hidden\" class=\"combo-value\">").appendTo(_77f);
    +if(name){
    +_780.attr("name",name);
    +}
    +_780.val(_77d[i]);
    +}
    +var tmp=[];
    +for(var i=0;i<_77e.length;i++){
    +tmp[i]=_77e[i];
    +}
    +var aa=[];
    +for(var i=0;i<_77d.length;i++){
    +for(var j=0;j<tmp.length;j++){
    +if(_77d[i]==tmp[j]){
    +aa.push(_77d[i]);
    +tmp.splice(j,1);
    +break;
    +}
    +}
    +}
    +if(aa.length!=_77d.length||_77d.length!=_77e.length){
    +if(opts.multiple){
    +opts.onChange.call(_77c,_77d,_77e);
    +}else{
    +opts.onChange.call(_77c,_77d[0],_77e[0]);
    +}
    +}
    +};
    +function _781(_782){
    +var _783=_777(_782);
    +return _783[0];
    +};
    +function _784(_785,_786){
    +_77b(_785,[_786]);
    +};
    +function _787(_788){
    +var opts=$.data(_788,"combo").options;
    +var fn=opts.onChange;
    +opts.onChange=function(){
    +};
    +if(opts.multiple){
    +if(opts.value){
    +if(typeof opts.value=="object"){
    +_77b(_788,opts.value);
    +}else{
    +_784(_788,opts.value);
    +}
    +}else{
    +_77b(_788,[]);
    +}
    +opts.originalValue=_777(_788);
    +}else{
    +_784(_788,opts.value);
    +opts.originalValue=opts.value;
    +}
    +opts.onChange=fn;
    +};
    +$.fn.combo=function(_789,_78a){
    +if(typeof _789=="string"){
    +return $.fn.combo.methods[_789](this,_78a);
    +}
    +_789=_789||{};
    +return this.each(function(){
    +var _78b=$.data(this,"combo");
    +if(_78b){
    +$.extend(_78b.options,_789);
    +}else{
    +var r=init(this);
    +_78b=$.data(this,"combo",{options:$.extend({},$.fn.combo.defaults,$.fn.combo.parseOptions(this),_789),combo:r.combo,panel:r.panel,previousValue:null});
    +$(this).removeAttr("disabled");
    +}
    +$("input.combo-text",_78b.combo).attr("readonly",!_78b.options.editable);
    +_74d(this);
    +_76a(this,_78b.options.disabled);
    +_745(this);
    +_756(this);
    +_767(this);
    +_787(this);
    +});
    +};
    +$.fn.combo.methods={options:function(jq){
    +return $.data(jq[0],"combo").options;
    +},panel:function(jq){
    +return $.data(jq[0],"combo").panel;
    +},textbox:function(jq){
    +return $.data(jq[0],"combo").combo.find("input.combo-text");
    +},destroy:function(jq){
    +return jq.each(function(){
    +_753(this);
    +});
    +},resize:function(jq,_78c){
    +return jq.each(function(){
    +_745(this,_78c);
    +});
    +},showPanel:function(jq){
    +return jq.each(function(){
    +_75e(this);
    +});
    +},hidePanel:function(jq){
    +return jq.each(function(){
    +_764(this);
    +});
    +},disable:function(jq){
    +return jq.each(function(){
    +_76a(this,true);
    +_756(this);
    +});
    +},enable:function(jq){
    +return jq.each(function(){
    +_76a(this,false);
    +_756(this);
    +});
    +},validate:function(jq){
    +return jq.each(function(){
    +_767(this,true);
    +});
    +},isValid:function(jq){
    +var _78d=$.data(jq[0],"combo").combo.find("input.combo-text");
    +return _78d.validatebox("isValid");
    +},clear:function(jq){
    +return jq.each(function(){
    +_76e(this);
    +});
    +},reset:function(jq){
    +return jq.each(function(){
    +var opts=$.data(this,"combo").options;
    +if(opts.multiple){
    +$(this).combo("setValues",opts.originalValue);
    +}else{
    +$(this).combo("setValue",opts.originalValue);
    +}
    +});
    +},getText:function(jq){
    +return _771(jq[0]);
    +},setText:function(jq,text){
    +return jq.each(function(){
    +_774(this,text);
    +});
    +},getValues:function(jq){
    +return _777(jq[0]);
    +},setValues:function(jq,_78e){
    +return jq.each(function(){
    +_77b(this,_78e);
    +});
    +},getValue:function(jq){
    +return _781(jq[0]);
    +},setValue:function(jq,_78f){
    +return jq.each(function(){
    +_784(this,_78f);
    +});
    +}};
    +$.fn.combo.parseOptions=function(_790){
    +var t=$(_790);
    +return $.extend({},$.fn.validatebox.parseOptions(_790),$.parser.parseOptions(_790,["width","height","separator",{panelWidth:"number",editable:"boolean",hasDownArrow:"boolean",delay:"number"}]),{panelHeight:(t.attr("panelHeight")=="auto"?"auto":parseInt(t.attr("panelHeight"))||undefined),multiple:(t.attr("multiple")?true:undefined),disabled:(t.attr("disabled")?true:undefined),value:(t.val()||undefined)});
    +};
    +$.fn.combo.defaults=$.extend({},$.fn.validatebox.defaults,{width:"auto",height:22,panelWidth:null,panelHeight:200,multiple:false,separator:",",editable:true,disabled:false,hasDownArrow:true,value:"",delay:200,keyHandler:{up:function(){
    +},down:function(){
    +},enter:function(){
    +},query:function(q){
    +}},onShowPanel:function(){
    +},onHidePanel:function(){
    +},onChange:function(_791,_792){
    +}});
    +})(jQuery);
    +(function($){
    +function _793(_794,_795){
    +var _796=$(_794).combo("panel");
    +var item=_796.find("div.combobox-item[value=\""+_795+"\"]");
    +if(item.length){
    +if(item.position().top<=0){
    +var h=_796.scrollTop()+item.position().top;
    +_796.scrollTop(h);
    +}else{
    +if(item.position().top+item.outerHeight()>_796.height()){
    +var h=_796.scrollTop()+item.position().top+item.outerHeight()-_796.height();
    +_796.scrollTop(h);
    +}
    +}
    +}
    +};
    +function _797(_798){
    +var _799=$(_798).combo("panel");
    +var _79a=$(_798).combo("getValues");
    +var item=_799.find("div.combobox-item[value=\""+_79a.pop()+"\"]");
    +if(item.length){
    +var prev=item.prev(":visible");
    +if(prev.length){
    +item=prev;
    +}
    +}else{
    +item=_799.find("div.combobox-item:visible:last");
    +}
    +var _79b=item.attr("value");
    +_79c(_798,_79b);
    +_793(_798,_79b);
    +};
    +function _79d(_79e){
    +var _79f=$(_79e).combo("panel");
    +var _7a0=$(_79e).combo("getValues");
    +var item=_79f.find("div.combobox-item[value=\""+_7a0.pop()+"\"]");
    +if(item.length){
    +var next=item.next(":visible");
    +if(next.length){
    +item=next;
    +}
    +}else{
    +item=_79f.find("div.combobox-item:visible:first");
    +}
    +var _7a1=item.attr("value");
    +_79c(_79e,_7a1);
    +_793(_79e,_7a1);
    +};
    +function _79c(_7a2,_7a3){
    +var opts=$.data(_7a2,"combobox").options;
    +var data=$.data(_7a2,"combobox").data;
    +if(opts.multiple){
    +var _7a4=$(_7a2).combo("getValues");
    +for(var i=0;i<_7a4.length;i++){
    +if(_7a4[i]==_7a3){
    +return;
    +}
    +}
    +_7a4.push(_7a3);
    +_7a5(_7a2,_7a4);
    +}else{
    +_7a5(_7a2,[_7a3]);
    +}
    +for(var i=0;i<data.length;i++){
    +if(data[i][opts.valueField]==_7a3){
    +opts.onSelect.call(_7a2,data[i]);
    +return;
    +}
    +}
    +};
    +function _7a6(_7a7,_7a8){
    +var opts=$.data(_7a7,"combobox").options;
    +var data=$.data(_7a7,"combobox").data;
    +var _7a9=$(_7a7).combo("getValues");
    +for(var i=0;i<_7a9.length;i++){
    +if(_7a9[i]==_7a8){
    +_7a9.splice(i,1);
    +_7a5(_7a7,_7a9);
    +break;
    +}
    +}
    +for(var i=0;i<data.length;i++){
    +if(data[i][opts.valueField]==_7a8){
    +opts.onUnselect.call(_7a7,data[i]);
    +return;
    +}
    +}
    +};
    +function _7a5(_7aa,_7ab,_7ac){
    +var opts=$.data(_7aa,"combobox").options;
    +var data=$.data(_7aa,"combobox").data;
    +var _7ad=$(_7aa).combo("panel");
    +_7ad.find("div.combobox-item-selected").removeClass("combobox-item-selected");
    +var vv=[],ss=[];
    +for(var i=0;i<_7ab.length;i++){
    +var v=_7ab[i];
    +var s=v;
    +for(var j=0;j<data.length;j++){
    +if(data[j][opts.valueField]==v){
    +s=data[j][opts.textField];
    +break;
    +}
    +}
    +vv.push(v);
    +ss.push(s);
    +_7ad.find("div.combobox-item[value=\""+v+"\"]").addClass("combobox-item-selected");
    +}
    +$(_7aa).combo("setValues",vv);
    +if(!_7ac){
    +$(_7aa).combo("setText",ss.join(opts.separator));
    +}
    +};
    +function _7ae(_7af){
    +var opts=$.data(_7af,"combobox").options;
    +var data=[];
    +$(">option",_7af).each(function(){
    +var item={};
    +item[opts.valueField]=$(this).attr("value")!=undefined?$(this).attr("value"):$(this).html();
    +item[opts.textField]=$(this).html();
    +item["selected"]=$(this).attr("selected");
    +data.push(item);
    +});
    +return data;
    +};
    +function _7b0(_7b1,data,_7b2){
    +var opts=$.data(_7b1,"combobox").options;
    +var _7b3=$(_7b1).combo("panel");
    +$.data(_7b1,"combobox").data=data;
    +var _7b4=$(_7b1).combobox("getValues");
    +_7b3.empty();
    +for(var i=0;i<data.length;i++){
    +var v=data[i][opts.valueField];
    +var s=data[i][opts.textField];
    +var item=$("<div class=\"combobox-item\"></div>").appendTo(_7b3);
    +item.attr("value",v);
    +if(opts.formatter){
    +item.html(opts.formatter.call(_7b1,data[i]));
    +}else{
    +item.html(s);
    +}
    +if(data[i]["selected"]){
    +(function(){
    +for(var i=0;i<_7b4.length;i++){
    +if(v==_7b4[i]){
    +return;
    +}
    +}
    +_7b4.push(v);
    +})();
    +}
    +}
    +if(opts.multiple){
    +_7a5(_7b1,_7b4,_7b2);
    +}else{
    +if(_7b4.length){
    +_7a5(_7b1,[_7b4[_7b4.length-1]],_7b2);
    +}else{
    +_7a5(_7b1,[],_7b2);
    +}
    +}
    +opts.onLoadSuccess.call(_7b1,data);
    +$(".combobox-item",_7b3).hover(function(){
    +$(this).addClass("combobox-item-hover");
    +},function(){
    +$(this).removeClass("combobox-item-hover");
    +}).click(function(){
    +var item=$(this);
    +if(opts.multiple){
    +if(item.hasClass("combobox-item-selected")){
    +_7a6(_7b1,item.attr("value"));
    +}else{
    +_79c(_7b1,item.attr("value"));
    +}
    +}else{
    +_79c(_7b1,item.attr("value"));
    +$(_7b1).combo("hidePanel");
    +}
    +});
    +};
    +function _7b5(_7b6,url,_7b7,_7b8){
    +var opts=$.data(_7b6,"combobox").options;
    +if(url){
    +opts.url=url;
    +}
    +_7b7=_7b7||{};
    +if(opts.onBeforeLoad.call(_7b6,_7b7)==false){
    +return;
    +}
    +opts.loader.call(_7b6,_7b7,function(data){
    +_7b0(_7b6,data,_7b8);
    +},function(){
    +opts.onLoadError.apply(this,arguments);
    +});
    +};
    +function _7b9(_7ba,q){
    +var opts=$.data(_7ba,"combobox").options;
    +if(opts.multiple&&!q){
    +_7a5(_7ba,[],true);
    +}else{
    +_7a5(_7ba,[q],true);
    +}
    +if(opts.mode=="remote"){
    +_7b5(_7ba,null,{q:q},true);
    +}else{
    +var _7bb=$(_7ba).combo("panel");
    +_7bb.find("div.combobox-item").hide();
    +var data=$.data(_7ba,"combobox").data;
    +for(var i=0;i<data.length;i++){
    +if(opts.filter.call(_7ba,q,data[i])){
    +var v=data[i][opts.valueField];
    +var s=data[i][opts.textField];
    +var item=_7bb.find("div.combobox-item[value=\""+v+"\"]");
    +item.show();
    +if(s==q){
    +_7a5(_7ba,[v],true);
    +item.addClass("combobox-item-selected");
    +}
    +}
    +}
    +}
    +};
    +function _7bc(_7bd){
    +var opts=$.data(_7bd,"combobox").options;
    +$(_7bd).addClass("combobox-f");
    +$(_7bd).combo($.extend({},opts,{onShowPanel:function(){
    +$(_7bd).combo("panel").find("div.combobox-item").show();
    +_793(_7bd,$(_7bd).combobox("getValue"));
    +opts.onShowPanel.call(_7bd);
    +}}));
    +};
    +$.fn.combobox=function(_7be,_7bf){
    +if(typeof _7be=="string"){
    +var _7c0=$.fn.combobox.methods[_7be];
    +if(_7c0){
    +return _7c0(this,_7bf);
    +}else{
    +return this.combo(_7be,_7bf);
    +}
    +}
    +_7be=_7be||{};
    +return this.each(function(){
    +var _7c1=$.data(this,"combobox");
    +if(_7c1){
    +$.extend(_7c1.options,_7be);
    +_7bc(this);
    +}else{
    +_7c1=$.data(this,"combobox",{options:$.extend({},$.fn.combobox.defaults,$.fn.combobox.parseOptions(this),_7be)});
    +_7bc(this);
    +_7b0(this,_7ae(this));
    +}
    +if(_7c1.options.data){
    +_7b0(this,_7c1.options.data);
    +}
    +_7b5(this);
    +});
    +};
    +$.fn.combobox.methods={options:function(jq){
    +var opts=$.data(jq[0],"combobox").options;
    +opts.originalValue=jq.combo("options").originalValue;
    +return opts;
    +},getData:function(jq){
    +return $.data(jq[0],"combobox").data;
    +},setValues:function(jq,_7c2){
    +return jq.each(function(){
    +_7a5(this,_7c2);
    +});
    +},setValue:function(jq,_7c3){
    +return jq.each(function(){
    +_7a5(this,[_7c3]);
    +});
    +},clear:function(jq){
    +return jq.each(function(){
    +$(this).combo("clear");
    +var _7c4=$(this).combo("panel");
    +_7c4.find("div.combobox-item-selected").removeClass("combobox-item-selected");
    +});
    +},reset:function(jq){
    +return jq.each(function(){
    +var opts=$(this).combobox("options");
    +if(opts.multiple){
    +$(this).combobox("setValues",opts.originalValue);
    +}else{
    +$(this).combobox("setValue",opts.originalValue);
    +}
    +});
    +},loadData:function(jq,data){
    +return jq.each(function(){
    +_7b0(this,data);
    +});
    +},reload:function(jq,url){
    +return jq.each(function(){
    +_7b5(this,url);
    +});
    +},select:function(jq,_7c5){
    +return jq.each(function(){
    +_79c(this,_7c5);
    +});
    +},unselect:function(jq,_7c6){
    +return jq.each(function(){
    +_7a6(this,_7c6);
    +});
    +}};
    +$.fn.combobox.parseOptions=function(_7c7){
    +var t=$(_7c7);
    +return $.extend({},$.fn.combo.parseOptions(_7c7),$.parser.parseOptions(_7c7,["valueField","textField","mode","method","url"]));
    +};
    +$.fn.combobox.defaults=$.extend({},$.fn.combo.defaults,{valueField:"value",textField:"text",mode:"local",method:"post",url:null,data:null,keyHandler:{up:function(){
    +_797(this);
    +},down:function(){
    +_79d(this);
    +},enter:function(){
    +var _7c8=$(this).combobox("getValues");
    +$(this).combobox("setValues",_7c8);
    +$(this).combobox("hidePanel");
    +},query:function(q){
    +_7b9(this,q);
    +}},filter:function(q,row){
    +var opts=$(this).combobox("options");
    +return row[opts.textField].indexOf(q)==0;
    +},formatter:function(row){
    +var opts=$(this).combobox("options");
    +return row[opts.textField];
    +},loader:function(_7c9,_7ca,_7cb){
    +var opts=$(this).combobox("options");
    +if(!opts.url){
    +return false;
    +}
    +$.ajax({type:opts.method,url:opts.url,data:_7c9,dataType:"json",success:function(data){
    +_7ca(data);
    +},error:function(){
    +_7cb.apply(this,arguments);
    +}});
    +},onBeforeLoad:function(_7cc){
    +},onLoadSuccess:function(){
    +},onLoadError:function(){
    +},onSelect:function(_7cd){
    +},onUnselect:function(_7ce){
    +}});
    +})(jQuery);
    +(function($){
    +function _7cf(_7d0){
    +var opts=$.data(_7d0,"combotree").options;
    +var tree=$.data(_7d0,"combotree").tree;
    +$(_7d0).addClass("combotree-f");
    +$(_7d0).combo(opts);
    +var _7d1=$(_7d0).combo("panel");
    +if(!tree){
    +tree=$("<ul></ul>").appendTo(_7d1);
    +$.data(_7d0,"combotree").tree=tree;
    +}
    +tree.tree($.extend({},opts,{checkbox:opts.multiple,onLoadSuccess:function(node,data){
    +var _7d2=$(_7d0).combotree("getValues");
    +if(opts.multiple){
    +var _7d3=tree.tree("getChecked");
    +for(var i=0;i<_7d3.length;i++){
    +var id=_7d3[i].id;
    +(function(){
    +for(var i=0;i<_7d2.length;i++){
    +if(id==_7d2[i]){
    +return;
    +}
    +}
    +_7d2.push(id);
    +})();
    +}
    +}
    +$(_7d0).combotree("setValues",_7d2);
    +opts.onLoadSuccess.call(this,node,data);
    +},onClick:function(node){
    +_7d5(_7d0);
    +$(_7d0).combo("hidePanel");
    +opts.onClick.call(this,node);
    +},onCheck:function(node,_7d4){
    +_7d5(_7d0);
    +opts.onCheck.call(this,node,_7d4);
    +}}));
    +};
    +function _7d5(_7d6){
    +var opts=$.data(_7d6,"combotree").options;
    +var tree=$.data(_7d6,"combotree").tree;
    +var vv=[],ss=[];
    +if(opts.multiple){
    +var _7d7=tree.tree("getChecked");
    +for(var i=0;i<_7d7.length;i++){
    +vv.push(_7d7[i].id);
    +ss.push(_7d7[i].text);
    +}
    +}else{
    +var node=tree.tree("getSelected");
    +if(node){
    +vv.push(node.id);
    +ss.push(node.text);
    +}
    +}
    +$(_7d6).combo("setValues",vv).combo("setText",ss.join(opts.separator));
    +};
    +function _7d8(_7d9,_7da){
    +var opts=$.data(_7d9,"combotree").options;
    +var tree=$.data(_7d9,"combotree").tree;
    +tree.find("span.tree-checkbox").addClass("tree-checkbox0").removeClass("tree-checkbox1 tree-checkbox2");
    +var vv=[],ss=[];
    +for(var i=0;i<_7da.length;i++){
    +var v=_7da[i];
    +var s=v;
    +var node=tree.tree("find",v);
    +if(node){
    +s=node.text;
    +tree.tree("check",node.target);
    +tree.tree("select",node.target);
    +}
    +vv.push(v);
    +ss.push(s);
    +}
    +$(_7d9).combo("setValues",vv).combo("setText",ss.join(opts.separator));
    +};
    +$.fn.combotree=function(_7db,_7dc){
    +if(typeof _7db=="string"){
    +var _7dd=$.fn.combotree.methods[_7db];
    +if(_7dd){
    +return _7dd(this,_7dc);
    +}else{
    +return this.combo(_7db,_7dc);
    +}
    +}
    +_7db=_7db||{};
    +return this.each(function(){
    +var _7de=$.data(this,"combotree");
    +if(_7de){
    +$.extend(_7de.options,_7db);
    +}else{
    +$.data(this,"combotree",{options:$.extend({},$.fn.combotree.defaults,$.fn.combotree.parseOptions(this),_7db)});
    +}
    +_7cf(this);
    +});
    +};
    +$.fn.combotree.methods={options:function(jq){
    +var opts=$.data(jq[0],"combotree").options;
    +opts.originalValue=jq.combo("options").originalValue;
    +return opts;
    +},tree:function(jq){
    +return $.data(jq[0],"combotree").tree;
    +},loadData:function(jq,data){
    +return jq.each(function(){
    +var opts=$.data(this,"combotree").options;
    +opts.data=data;
    +var tree=$.data(this,"combotree").tree;
    +tree.tree("loadData",data);
    +});
    +},reload:function(jq,url){
    +return jq.each(function(){
    +var opts=$.data(this,"combotree").options;
    +var tree=$.data(this,"combotree").tree;
    +if(url){
    +opts.url=url;
    +}
    +tree.tree({url:opts.url});
    +});
    +},setValues:function(jq,_7df){
    +return jq.each(function(){
    +_7d8(this,_7df);
    +});
    +},setValue:function(jq,_7e0){
    +return jq.each(function(){
    +_7d8(this,[_7e0]);
    +});
    +},clear:function(jq){
    +return jq.each(function(){
    +var tree=$.data(this,"combotree").tree;
    +tree.find("div.tree-node-selected").removeClass("tree-node-selected");
    +var cc=tree.tree("getChecked");
    +for(var i=0;i<cc.length;i++){
    +tree.tree("uncheck",cc[i].target);
    +}
    +$(this).combo("clear");
    +});
    +},reset:function(jq){
    +return jq.each(function(){
    +var opts=$(this).combotree("options");
    +if(opts.multiple){
    +$(this).combotree("setValues",opts.originalValue);
    +}else{
    +$(this).combotree("setValue",opts.originalValue);
    +}
    +});
    +}};
    +$.fn.combotree.parseOptions=function(_7e1){
    +return $.extend({},$.fn.combo.parseOptions(_7e1),$.fn.tree.parseOptions(_7e1));
    +};
    +$.fn.combotree.defaults=$.extend({},$.fn.combo.defaults,$.fn.tree.defaults,{editable:false});
    +})(jQuery);
    +(function($){
    +function _7e2(_7e3){
    +var opts=$.data(_7e3,"combogrid").options;
    +var grid=$.data(_7e3,"combogrid").grid;
    +$(_7e3).addClass("combogrid-f");
    +$(_7e3).combo(opts);
    +var _7e4=$(_7e3).combo("panel");
    +if(!grid){
    +grid=$("<table></table>").appendTo(_7e4);
    +$.data(_7e3,"combogrid").grid=grid;
    +}
    +grid.datagrid($.extend({},opts,{border:false,fit:true,singleSelect:(!opts.multiple),onLoadSuccess:function(data){
    +var _7e5=$.data(_7e3,"combogrid").remainText;
    +var _7e6=$(_7e3).combo("getValues");
    +_7f2(_7e3,_7e6,_7e5);
    +opts.onLoadSuccess.apply(_7e3,arguments);
    +},onClickRow:_7e7,onSelect:function(_7e8,row){
    +_7e9();
    +opts.onSelect.call(this,_7e8,row);
    +},onUnselect:function(_7ea,row){
    +_7e9();
    +opts.onUnselect.call(this,_7ea,row);
    +},onSelectAll:function(rows){
    +_7e9();
    +opts.onSelectAll.call(this,rows);
    +},onUnselectAll:function(rows){
    +if(opts.multiple){
    +_7e9();
    +}
    +opts.onUnselectAll.call(this,rows);
    +}}));
    +function _7e7(_7eb,row){
    +$.data(_7e3,"combogrid").remainText=false;
    +_7e9();
    +if(!opts.multiple){
    +$(_7e3).combo("hidePanel");
    +}
    +opts.onClickRow.call(this,_7eb,row);
    +};
    +function _7e9(){
    +var _7ec=$.data(_7e3,"combogrid").remainText;
    +var rows=grid.datagrid("getSelections");
    +var vv=[],ss=[];
    +for(var i=0;i<rows.length;i++){
    +vv.push(rows[i][opts.idField]);
    +ss.push(rows[i][opts.textField]);
    +}
    +if(!opts.multiple){
    +$(_7e3).combo("setValues",(vv.length?vv:[""]));
    +}else{
    +$(_7e3).combo("setValues",vv);
    +}
    +if(!_7ec){
    +$(_7e3).combo("setText",ss.join(opts.separator));
    +}
    +};
    +};
    +function _7ed(_7ee,step){
    +var opts=$.data(_7ee,"combogrid").options;
    +var grid=$.data(_7ee,"combogrid").grid;
    +var _7ef=grid.datagrid("getRows").length;
    +if(!_7ef){
    +return;
    +}
    +$.data(_7ee,"combogrid").remainText=false;
    +var _7f0;
    +var _7f1=grid.datagrid("getSelections");
    +if(_7f1.length){
    +_7f0=grid.datagrid("getRowIndex",_7f1[_7f1.length-1][opts.idField]);
    +_7f0+=step;
    +if(_7f0<0){
    +_7f0=0;
    +}
    +if(_7f0>=_7ef){
    +_7f0=_7ef-1;
    +}
    +}else{
    +if(step>0){
    +_7f0=0;
    +}else{
    +if(step<0){
    +_7f0=_7ef-1;
    +}else{
    +_7f0=-1;
    +}
    +}
    +}
    +if(_7f0>=0){
    +grid.datagrid("clearSelections");
    +grid.datagrid("selectRow",_7f0);
    +}
    +};
    +function _7f2(_7f3,_7f4,_7f5){
    +var opts=$.data(_7f3,"combogrid").options;
    +var grid=$.data(_7f3,"combogrid").grid;
    +var rows=grid.datagrid("getRows");
    +var ss=[];
    +for(var i=0;i<_7f4.length;i++){
    +var _7f6=grid.datagrid("getRowIndex",_7f4[i]);
    +if(_7f6>=0){
    +grid.datagrid("selectRow",_7f6);
    +ss.push(rows[_7f6][opts.textField]);
    +}else{
    +ss.push(_7f4[i]);
    +}
    +}
    +if($(_7f3).combo("getValues").join(",")==_7f4.join(",")){
    +return;
    +}
    +$(_7f3).combo("setValues",_7f4);
    +if(!_7f5){
    +$(_7f3).combo("setText",ss.join(opts.separator));
    +}
    +};
    +function _7f7(_7f8,q){
    +var opts=$.data(_7f8,"combogrid").options;
    +var grid=$.data(_7f8,"combogrid").grid;
    +$.data(_7f8,"combogrid").remainText=true;
    +if(opts.multiple&&!q){
    +_7f2(_7f8,[],true);
    +}else{
    +_7f2(_7f8,[q],true);
    +}
    +if(opts.mode=="remote"){
    +grid.datagrid("clearSelections");
    +grid.datagrid("load",$.extend({},opts.queryParams,{q:q}));
    +}else{
    +if(!q){
    +return;
    +}
    +var rows=grid.datagrid("getRows");
    +for(var i=0;i<rows.length;i++){
    +if(opts.filter.call(_7f8,q,rows[i])){
    +grid.datagrid("clearSelections");
    +grid.datagrid("selectRow",i);
    +return;
    +}
    +}
    +}
    +};
    +$.fn.combogrid=function(_7f9,_7fa){
    +if(typeof _7f9=="string"){
    +var _7fb=$.fn.combogrid.methods[_7f9];
    +if(_7fb){
    +return _7fb(this,_7fa);
    +}else{
    +return $.fn.combo.methods[_7f9](this,_7fa);
    +}
    +}
    +_7f9=_7f9||{};
    +return this.each(function(){
    +var _7fc=$.data(this,"combogrid");
    +if(_7fc){
    +$.extend(_7fc.options,_7f9);
    +}else{
    +_7fc=$.data(this,"combogrid",{options:$.extend({},$.fn.combogrid.defaults,$.fn.combogrid.parseOptions(this),_7f9)});
    +}
    +_7e2(this);
    +});
    +};
    +$.fn.combogrid.methods={options:function(jq){
    +var opts=$.data(jq[0],"combogrid").options;
    +opts.originalValue=jq.combo("options").originalValue;
    +return opts;
    +},grid:function(jq){
    +return $.data(jq[0],"combogrid").grid;
    +},setValues:function(jq,_7fd){
    +return jq.each(function(){
    +_7f2(this,_7fd);
    +});
    +},setValue:function(jq,_7fe){
    +return jq.each(function(){
    +_7f2(this,[_7fe]);
    +});
    +},clear:function(jq){
    +return jq.each(function(){
    +$(this).combogrid("grid").datagrid("clearSelections");
    +$(this).combo("clear");
    +});
    +},reset:function(jq){
    +return jq.each(function(){
    +var opts=$(this).combogrid("options");
    +if(opts.multiple){
    +$(this).combogrid("setValues",opts.originalValue);
    +}else{
    +$(this).combogrid("setValue",opts.originalValue);
    +}
    +});
    +}};
    +$.fn.combogrid.parseOptions=function(_7ff){
    +var t=$(_7ff);
    +return $.extend({},$.fn.combo.parseOptions(_7ff),$.fn.datagrid.parseOptions(_7ff),$.parser.parseOptions(_7ff,["idField","textField","mode"]));
    +};
    +$.fn.combogrid.defaults=$.extend({},$.fn.combo.defaults,$.fn.datagrid.defaults,{loadMsg:null,idField:null,textField:null,mode:"local",keyHandler:{up:function(){
    +_7ed(this,-1);
    +},down:function(){
    +_7ed(this,1);
    +},enter:function(){
    +_7ed(this,0);
    +$(this).combo("hidePanel");
    +},query:function(q){
    +_7f7(this,q);
    +}},filter:function(q,row){
    +var opts=$(this).combogrid("options");
    +return row[opts.textField].indexOf(q)==0;
    +}});
    +})(jQuery);
    +(function($){
    +function _800(_801){
    +var _802=$.data(_801,"datebox");
    +var opts=_802.options;
    +$(_801).addClass("datebox-f");
    +$(_801).combo($.extend({},opts,{onShowPanel:function(){
    +_802.calendar.calendar("resize");
    +opts.onShowPanel.call(_801);
    +}}));
    +$(_801).combo("textbox").parent().addClass("datebox");
    +if(!_802.calendar){
    +_803();
    +}
    +function _803(){
    +var _804=$(_801).combo("panel");
    +_802.calendar=$("<div></div>").appendTo(_804).wrap("<div class=\"datebox-calendar-inner\"></div>");
    +_802.calendar.calendar({fit:true,border:false,onSelect:function(date){
    +var _805=opts.formatter(date);
    +_809(_801,_805);
    +$(_801).combo("hidePanel");
    +opts.onSelect.call(_801,date);
    +}});
    +_809(_801,opts.value);
    +var _806=$("<div class=\"datebox-button\"></div>").appendTo(_804);
    +$("<a href=\"javascript:void(0)\" class=\"datebox-current\"></a>").html(opts.currentText).appendTo(_806);
    +$("<a href=\"javascript:void(0)\" class=\"datebox-close\"></a>").html(opts.closeText).appendTo(_806);
    +_806.find(".datebox-current,.datebox-close").hover(function(){
    +$(this).addClass("datebox-button-hover");
    +},function(){
    +$(this).removeClass("datebox-button-hover");
    +});
    +_806.find(".datebox-current").click(function(){
    +_802.calendar.calendar({year:new Date().getFullYear(),month:new Date().getMonth()+1,current:new Date()});
    +});
    +_806.find(".datebox-close").click(function(){
    +$(_801).combo("hidePanel");
    +});
    +};
    +};
    +function _807(_808,q){
    +_809(_808,q);
    +};
    +function _80a(_80b){
    +var opts=$.data(_80b,"datebox").options;
    +var c=$.data(_80b,"datebox").calendar;
    +var _80c=opts.formatter(c.calendar("options").current);
    +_809(_80b,_80c);
    +$(_80b).combo("hidePanel");
    +};
    +function _809(_80d,_80e){
    +var _80f=$.data(_80d,"datebox");
    +var opts=_80f.options;
    +$(_80d).combo("setValue",_80e).combo("setText",_80e);
    +_80f.calendar.calendar("moveTo",opts.parser(_80e));
    +};
    +$.fn.datebox=function(_810,_811){
    +if(typeof _810=="string"){
    +var _812=$.fn.datebox.methods[_810];
    +if(_812){
    +return _812(this,_811);
    +}else{
    +return this.combo(_810,_811);
    +}
    +}
    +_810=_810||{};
    +return this.each(function(){
    +var _813=$.data(this,"datebox");
    +if(_813){
    +$.extend(_813.options,_810);
    +}else{
    +$.data(this,"datebox",{options:$.extend({},$.fn.datebox.defaults,$.fn.datebox.parseOptions(this),_810)});
    +}
    +_800(this);
    +});
    +};
    +$.fn.datebox.methods={options:function(jq){
    +var opts=$.data(jq[0],"datebox").options;
    +opts.originalValue=jq.combo("options").originalValue;
    +return opts;
    +},calendar:function(jq){
    +return $.data(jq[0],"datebox").calendar;
    +},setValue:function(jq,_814){
    +return jq.each(function(){
    +_809(this,_814);
    +});
    +},reset:function(jq){
    +return jq.each(function(){
    +var opts=$(this).datebox("options");
    +$(this).datebox("setValue",opts.originalValue);
    +});
    +}};
    +$.fn.datebox.parseOptions=function(_815){
    +var t=$(_815);
    +return $.extend({},$.fn.combo.parseOptions(_815),{});
    +};
    +$.fn.datebox.defaults=$.extend({},$.fn.combo.defaults,{panelWidth:180,panelHeight:"auto",keyHandler:{up:function(){
    +},down:function(){
    +},enter:function(){
    +_80a(this);
    +},query:function(q){
    +_807(this,q);
    +}},currentText:"Today",closeText:"Close",okText:"Ok",formatter:function(date){
    +var y=date.getFullYear();
    +var m=date.getMonth()+1;
    +var d=date.getDate();
    +return m+"/"+d+"/"+y;
    +},parser:function(s){
    +var t=Date.parse(s);
    +if(!isNaN(t)){
    +return new Date(t);
    +}else{
    +return new Date();
    +}
    +},onSelect:function(date){
    +}});
    +})(jQuery);
    +(function($){
    +function _816(_817){
    +var _818=$.data(_817,"datetimebox");
    +var opts=_818.options;
    +$(_817).datebox($.extend({},opts,{onShowPanel:function(){
    +var _819=$(_817).datetimebox("getValue");
    +_81c(_817,_819,true);
    +opts.onShowPanel.call(_817);
    +},formatter:$.fn.datebox.defaults.formatter,parser:$.fn.datebox.defaults.parser}));
    +$(_817).removeClass("datebox-f").addClass("datetimebox-f");
    +$(_817).datebox("calendar").calendar({onSelect:function(date){
    +opts.onSelect.call(_817,date);
    +}});
    +var _81a=$(_817).datebox("panel");
    +if(!_818.spinner){
    +var p=$("<div style=\"padding:2px\"><input style=\"width:80px\"></div>").insertAfter(_81a.children("div.datebox-calendar-inner"));
    +_818.spinner=p.children("input");
    +var _81b=_81a.children("div.datebox-button");
    +var ok=$("<a href=\"javascript:void(0)\" class=\"datebox-ok\"></a>").html(opts.okText).appendTo(_81b);
    +ok.hover(function(){
    +$(this).addClass("datebox-button-hover");
    +},function(){
    +$(this).removeClass("datebox-button-hover");
    +}).click(function(){
    +_821(_817);
    +});
    +}
    +_818.spinner.timespinner({showSeconds:opts.showSeconds,separator:opts.timeSeparator}).unbind(".datetimebox").bind("mousedown.datetimebox",function(e){
    +e.stopPropagation();
    +});
    +_81c(_817,opts.value);
    +};
    +function _81d(_81e){
    +var c=$(_81e).datetimebox("calendar");
    +var t=$(_81e).datetimebox("spinner");
    +var date=c.calendar("options").current;
    +return new Date(date.getFullYear(),date.getMonth(),date.getDate(),t.timespinner("getHours"),t.timespinner("getMinutes"),t.timespinner("getSeconds"));
    +};
    +function _81f(_820,q){
    +_81c(_820,q,true);
    +};
    +function _821(_822){
    +var opts=$.data(_822,"datetimebox").options;
    +var date=_81d(_822);
    +_81c(_822,opts.formatter.call(_822,date));
    +$(_822).combo("hidePanel");
    +};
    +function _81c(_823,_824,_825){
    +var opts=$.data(_823,"datetimebox").options;
    +$(_823).combo("setValue",_824);
    +if(!_825){
    +if(_824){
    +var date=opts.parser.call(_823,_824);
    +$(_823).combo("setValue",opts.formatter.call(_823,date));
    +$(_823).combo("setText",opts.formatter.call(_823,date));
    +}else{
    +$(_823).combo("setText",_824);
    +}
    +}
    +var date=opts.parser.call(_823,_824);
    +$(_823).datetimebox("calendar").calendar("moveTo",date);
    +$(_823).datetimebox("spinner").timespinner("setValue",_826(date));
    +function _826(date){
    +function _827(_828){
    +return (_828<10?"0":"")+_828;
    +};
    +var tt=[_827(date.getHours()),_827(date.getMinutes())];
    +if(opts.showSeconds){
    +tt.push(_827(date.getSeconds()));
    +}
    +return tt.join($(_823).datetimebox("spinner").timespinner("options").separator);
    +};
    +};
    +$.fn.datetimebox=function(_829,_82a){
    +if(typeof _829=="string"){
    +var _82b=$.fn.datetimebox.methods[_829];
    +if(_82b){
    +return _82b(this,_82a);
    +}else{
    +return this.datebox(_829,_82a);
    +}
    +}
    +_829=_829||{};
    +return this.each(function(){
    +var _82c=$.data(this,"datetimebox");
    +if(_82c){
    +$.extend(_82c.options,_829);
    +}else{
    +$.data(this,"datetimebox",{options:$.extend({},$.fn.datetimebox.defaults,$.fn.datetimebox.parseOptions(this),_829)});
    +}
    +_816(this);
    +});
    +};
    +$.fn.datetimebox.methods={options:function(jq){
    +var opts=$.data(jq[0],"datetimebox").options;
    +opts.originalValue=jq.datebox("options").originalValue;
    +return opts;
    +},spinner:function(jq){
    +return $.data(jq[0],"datetimebox").spinner;
    +},setValue:function(jq,_82d){
    +return jq.each(function(){
    +_81c(this,_82d);
    +});
    +},reset:function(jq){
    +return jq.each(function(){
    +var opts=$(this).datetimebox("options");
    +$(this).datetimebox("setValue",opts.originalValue);
    +});
    +}};
    +$.fn.datetimebox.parseOptions=function(_82e){
    +var t=$(_82e);
    +return $.extend({},$.fn.datebox.parseOptions(_82e),$.parser.parseOptions(_82e,["timeSeparator",{showSeconds:"boolean"}]));
    +};
    +$.fn.datetimebox.defaults=$.extend({},$.fn.datebox.defaults,{showSeconds:true,timeSeparator:":",keyHandler:{up:function(){
    +},down:function(){
    +},enter:function(){
    +_821(this);
    +},query:function(q){
    +_81f(this,q);
    +}},formatter:function(date){
    +var h=date.getHours();
    +var M=date.getMinutes();
    +var s=date.getSeconds();
    +function _82f(_830){
    +return (_830<10?"0":"")+_830;
    +};
    +var _831=$(this).datetimebox("spinner").timespinner("options").separator;
    +var r=$.fn.datebox.defaults.formatter(date)+" "+_82f(h)+_831+_82f(M);
    +if($(this).datetimebox("options").showSeconds){
    +r+=_831+_82f(s);
    +}
    +return r;
    +},parser:function(s){
    +if($.trim(s)==""){
    +return new Date();
    +}
    +var dt=s.split(" ");
    +var d=$.fn.datebox.defaults.parser(dt[0]);
    +if(dt.length<2){
    +return d;
    +}
    +var _832=$(this).datetimebox("spinner").timespinner("options").separator;
    +var tt=dt[1].split(_832);
    +var hour=parseInt(tt[0],10)||0;
    +var _833=parseInt(tt[1],10)||0;
    +var _834=parseInt(tt[2],10)||0;
    +return new Date(d.getFullYear(),d.getMonth(),d.getDate(),hour,_833,_834);
    +}});
    +})(jQuery);
    +(function($){
    +function init(_835){
    +var _836=$("<div class=\"slider\">"+"<div class=\"slider-inner\">"+"<a href=\"javascript:void(0)\" class=\"slider-handle\"></a>"+"<span class=\"slider-tip\"></span>"+"</div>"+"<div class=\"slider-rule\"></div>"+"<div class=\"slider-rulelabel\"></div>"+"<div style=\"clear:both\"></div>"+"<input type=\"hidden\" class=\"slider-value\">"+"</div>").insertAfter(_835);
    +var name=$(_835).hide().attr("name");
    +if(name){
    +_836.find("input.slider-value").attr("name",name);
    +$(_835).removeAttr("name").attr("sliderName",name);
    +}
    +return _836;
    +};
    +function _837(_838,_839){
    +var opts=$.data(_838,"slider").options;
    +var _83a=$.data(_838,"slider").slider;
    +if(_839){
    +if(_839.width){
    +opts.width=_839.width;
    +}
    +if(_839.height){
    +opts.height=_839.height;
    +}
    +}
    +if(opts.mode=="h"){
    +_83a.css("height","");
    +_83a.children("div").css("height","");
    +if(!isNaN(opts.width)){
    +_83a.width(opts.width);
    +}
    +}else{
    +_83a.css("width","");
    +_83a.children("div").css("width","");
    +if(!isNaN(opts.height)){
    +_83a.height(opts.height);
    +_83a.find("div.slider-rule").height(opts.height);
    +_83a.find("div.slider-rulelabel").height(opts.height);
    +_83a.find("div.slider-inner")._outerHeight(opts.height);
    +}
    +}
    +_83b(_838);
    +};
    +function _83c(_83d){
    +var opts=$.data(_83d,"slider").options;
    +var _83e=$.data(_83d,"slider").slider;
    +var aa=opts.mode=="h"?opts.rule:opts.rule.slice(0).reverse();
    +if(opts.reversed){
    +aa=aa.slice(0).reverse();
    +}
    +_83f(aa);
    +function _83f(aa){
    +var rule=_83e.find("div.slider-rule");
    +var _840=_83e.find("div.slider-rulelabel");
    +rule.empty();
    +_840.empty();
    +for(var i=0;i<aa.length;i++){
    +var _841=i*100/(aa.length-1)+"%";
    +var span=$("<span></span>").appendTo(rule);
    +span.css((opts.mode=="h"?"left":"top"),_841);
    +if(aa[i]!="|"){
    +span=$("<span></span>").appendTo(_840);
    +span.html(aa[i]);
    +if(opts.mode=="h"){
    +span.css({left:_841,marginLeft:-Math.round(span.outerWidth()/2)});
    +}else{
    +span.css({top:_841,marginTop:-Math.round(span.outerHeight()/2)});
    +}
    +}
    +}
    +};
    +};
    +function _842(_843){
    +var opts=$.data(_843,"slider").options;
    +var _844=$.data(_843,"slider").slider;
    +_844.removeClass("slider-h slider-v slider-disabled");
    +_844.addClass(opts.mode=="h"?"slider-h":"slider-v");
    +_844.addClass(opts.disabled?"slider-disabled":"");
    +_844.find("a.slider-handle").draggable({axis:opts.mode,cursor:"pointer",disabled:opts.disabled,onDrag:function(e){
    +var left=e.data.left;
    +var _845=_844.width();
    +if(opts.mode!="h"){
    +left=e.data.top;
    +_845=_844.height();
    +}
    +if(left<0||left>_845){
    +return false;
    +}else{
    +var _846=_855(_843,left);
    +_847(_846);
    +return false;
    +}
    +},onStartDrag:function(){
    +opts.onSlideStart.call(_843,opts.value);
    +},onStopDrag:function(e){
    +var _848=_855(_843,(opts.mode=="h"?e.data.left:e.data.top));
    +_847(_848);
    +opts.onSlideEnd.call(_843,opts.value);
    +}});
    +function _847(_849){
    +var s=Math.abs(_849%opts.step);
    +if(s<opts.step/2){
    +_849-=s;
    +}else{
    +_849=_849-s+opts.step;
    +}
    +_84a(_843,_849);
    +};
    +};
    +function _84a(_84b,_84c){
    +var opts=$.data(_84b,"slider").options;
    +var _84d=$.data(_84b,"slider").slider;
    +var _84e=opts.value;
    +if(_84c<opts.min){
    +_84c=opts.min;
    +}
    +if(_84c>opts.max){
    +_84c=opts.max;
    +}
    +opts.value=_84c;
    +$(_84b).val(_84c);
    +_84d.find("input.slider-value").val(_84c);
    +var pos=_84f(_84b,_84c);
    +var tip=_84d.find(".slider-tip");
    +if(opts.showTip){
    +tip.show();
    +tip.html(opts.tipFormatter.call(_84b,opts.value));
    +}else{
    +tip.hide();
    +}
    +if(opts.mode=="h"){
    +var _850="left:"+pos+"px;";
    +_84d.find(".slider-handle").attr("style",_850);
    +tip.attr("style",_850+"margin-left:"+(-Math.round(tip.outerWidth()/2))+"px");
    +}else{
    +var _850="top:"+pos+"px;";
    +_84d.find(".slider-handle").attr("style",_850);
    +tip.attr("style",_850+"margin-left:"+(-Math.round(tip.outerWidth()))+"px");
    +}
    +if(_84e!=_84c){
    +opts.onChange.call(_84b,_84c,_84e);
    +}
    +};
    +function _83b(_851){
    +var opts=$.data(_851,"slider").options;
    +var fn=opts.onChange;
    +opts.onChange=function(){
    +};
    +_84a(_851,opts.value);
    +opts.onChange=fn;
    +};
    +function _84f(_852,_853){
    +var opts=$.data(_852,"slider").options;
    +var _854=$.data(_852,"slider").slider;
    +if(opts.mode=="h"){
    +var pos=(_853-opts.min)/(opts.max-opts.min)*_854.width();
    +if(opts.reversed){
    +pos=_854.width()-pos;
    +}
    +}else{
    +var pos=_854.height()-(_853-opts.min)/(opts.max-opts.min)*_854.height();
    +if(opts.reversed){
    +pos=_854.height()-pos;
    +}
    +}
    +return pos.toFixed(0);
    +};
    +function _855(_856,pos){
    +var opts=$.data(_856,"slider").options;
    +var _857=$.data(_856,"slider").slider;
    +if(opts.mode=="h"){
    +var _858=opts.min+(opts.max-opts.min)*(pos/_857.width());
    +}else{
    +var _858=opts.min+(opts.max-opts.min)*((_857.height()-pos)/_857.height());
    +}
    +return opts.reversed?opts.max-_858.toFixed(0):_858.toFixed(0);
    +};
    +$.fn.slider=function(_859,_85a){
    +if(typeof _859=="string"){
    +return $.fn.slider.methods[_859](this,_85a);
    +}
    +_859=_859||{};
    +return this.each(function(){
    +var _85b=$.data(this,"slider");
    +if(_85b){
    +$.extend(_85b.options,_859);
    +}else{
    +_85b=$.data(this,"slider",{options:$.extend({},$.fn.slider.defaults,$.fn.slider.parseOptions(this),_859),slider:init(this)});
    +$(this).removeAttr("disabled");
    +}
    +_842(this);
    +_83c(this);
    +_837(this);
    +});
    +};
    +$.fn.slider.methods={options:function(jq){
    +return $.data(jq[0],"slider").options;
    +},destroy:function(jq){
    +return jq.each(function(){
    +$.data(this,"slider").slider.remove();
    +$(this).remove();
    +});
    +},resize:function(jq,_85c){
    +return jq.each(function(){
    +_837(this,_85c);
    +});
    +},getValue:function(jq){
    +return jq.slider("options").value;
    +},setValue:function(jq,_85d){
    +return jq.each(function(){
    +_84a(this,_85d);
    +});
    +},enable:function(jq){
    +return jq.each(function(){
    +$.data(this,"slider").options.disabled=false;
    +_842(this);
    +});
    +},disable:function(jq){
    +return jq.each(function(){
    +$.data(this,"slider").options.disabled=true;
    +_842(this);
    +});
    +}};
    +$.fn.slider.parseOptions=function(_85e){
    +var t=$(_85e);
    +return $.extend({},$.parser.parseOptions(_85e,["width","height","mode",{reversed:"boolean",showTip:"boolean",min:"number",max:"number",step:"number"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined),rule:(t.attr("rule")?eval(t.attr("rule")):undefined)});
    +};
    +$.fn.slider.defaults={width:"auto",height:"auto",mode:"h",reversed:false,showTip:false,disabled:false,value:0,min:0,max:100,step:1,rule:[],tipFormatter:function(_85f){
    +return _85f;
    +},onChange:function(_860,_861){
    +},onSlideStart:function(_862){
    +},onSlideEnd:function(_863){
    +}};
    +})(jQuery);
    +
    diff --git a/src/main/webapp/plug-in/easyui/jquery.easyui.min.js b/src/main/webapp/plug-in/easyui/jquery.easyui.min.js
    new file mode 100644
    index 00000000..d4d83324
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/jquery.easyui.min.js
    @@ -0,0 +1 @@
    +锘縠val(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(u($){$.1V={2q:Q,vh:u(JI){},vu:["2i","4x","2D","1Y","2P","11","4n","4v","3J","I","1R","2R","32","2E","1T","1M","5Y","3e","1p","2k","3n","21","2m","J","H","59","1B","1f","2n","1s","3d"],f6:u(kO){k aa=[];1h(k i=0;i<$.1V.vu.O;i++){k fE=$.1V.vu[i];k r=$(".JH-"+fE,kO);if(r.O){if(r[fE]){r[fE]()}K{aa.1i({1C:fE,jq:r})}}}if(aa.O&&1s.wM){k vl=[];1h(k i=0;i<aa.O;i++){vl.1i(aa[i].1C)}wM.8l(vl,u(){1h(k i=0;i<aa.O;i++){k A5=aa[i].1C;k jq=aa[i].jq;jq[A5]()}$.1V.vh.X($.1V,kO)})}K{$.1V.vh.X($.1V,kO)}},1o:u(wG,jM){k t=$(wG);k ij={};k s=$.82(t.1b("A-E"));if(s){k Aa=s.7g(0,1);k A8=s.7g(s.O-1,1);if(Aa!="{"){s="{"+s}if(A8!="}"){s=s+"}"}ij=(3s JY("C "+s))()}if(jM){k c8={};1h(k i=0;i<jM.O;i++){k pp=jM[i];if(2b pp=="2r"){if(pp=="U"||pp=="V"||pp=="Z"||pp=="14"){c8[pp]=2X(wG.2c[pp])||1P}K{c8[pp]=t.1b(pp)}}K{1h(k 9B in pp){k wC=pp[9B];if(wC=="1S"){c8[9B]=t.1b(9B)?(t.1b(9B)=="Q"):1P}K{if(wC=="2O"){c8[9B]=t.1b(9B)=="0"?0:oJ(t.1b(9B))||1P}}}}}$.1d(ij,c8)}C ij}};$(u(){if(!1s.wM&&$.1V.2q){$.1V.f6()}});$.fn.3B=u(w3){C B.P(u(){if(!$.tV&&$.mY.ni){$(B).U(w3)}K{$(B).U(w3-($(B).1N()-$(B).U()))}})};$.fn.58=u(wu){C B.P(u(){if(!$.tV&&$.mY.ni){$(B).V(wu)}K{$(B).V(wu-($(B).2j()-$(B).V()))}})}})(2T);(u($){k kD=N;u mp(e){k 8m=$.A(e.A.1v,"2i").E;k 8y=e.A;k fW=8y.8j+e.3V-8y.ba;k 14=8y.9l+e.4h-8y.bm;if(8m.cE!=1r&&8m.cE!=1P){fW=e.3V+8m.cE}if(8m.cA!=1r&&8m.cA!=1P){14=e.4h+8m.cA}if(e.A.2p!=2G.1q){fW+=$(e.A.2p).4i();14+=$(e.A.2p).4q()}if(8m.gC=="h"){8y.Z=fW}K{if(8m.gC=="v"){8y.14=14}K{8y.Z=fW;8y.14=14}}};u wk(e){k z9=$.A(e.A.1v,"2i").E;k jk=$.A(e.A.1v,"2i").2a;if(!jk){jk=$(e.A.1v)}jk.1l({Z:e.A.Z,14:e.A.14});$("1q").1l("4e",z9.4e)};u AI(e){kD=Q;k gb=$.A(e.A.1v,"2i").E;k za=$(".4x").ah(u(){C e.A.1v!=B}).ah(u(){k wm=$.A(B,"4x").E.bq;if(wm){C $(wm).ah(u(){C B==e.A.1v}).O>0}K{C Q}});$.A(e.A.1v,"2i").sW=za;k a6=$.A(e.A.1v,"2i").2a;if(!a6){if(gb.2a){if(gb.2a=="pD"){a6=$(e.A.1v).pD().4a(e.A.1v)}K{a6=gb.2a.X(e.A.1v,e.A.1v)}$.A(e.A.1v,"2i").2a=a6}K{a6=$(e.A.1v)}}a6.1l("4L","iM");mp(e);wk(e);gb.fV.X(e.A.1v,e);C N};u AM(e){mp(e);if($.A(e.A.1v,"2i").E.gn.X(e.A.1v,e)!=N){wk(e)}k n4=e.A.1v;$.A(e.A.1v,"2i").sW.P(u(){k wb=$(B);k p2=$(B).3K();if(e.3V>p2.Z&&e.3V<p2.Z+wb.1N()&&e.4h>p2.14&&e.4h<p2.14+wb.2j()){if(!B.f2){$(B).8D("xj",[n4]);B.f2=Q}$(B).8D("yj",[n4])}K{if(B.f2){$(B).8D("yl",[n4]);B.f2=N}}});C N};u Bl(e){kD=N;mp(e);k eY=$.A(e.A.1v,"2i").2a;k mj=$.A(e.A.1v,"2i").E;if(mj.fb){if(sT()==Q){mG();$(e.A.1v).1l({4L:e.A.hW,Z:e.A.8j,14:e.A.9l})}K{if(eY){eY.3U({Z:e.A.8j,14:e.A.9l},u(){mG()})}K{$(e.A.1v).3U({Z:e.A.8j,14:e.A.9l},u(){$(e.A.1v).1l("4L",e.A.hW)})}}}K{$(e.A.1v).1l({4L:"iM",Z:e.A.Z,14:e.A.14});mG();sT()}mj.fo.X(e.A.1v,e);$(2G).2x(".2i");3m(u(){$("1q").1l("4e","")},4Z);u mG(){if(eY){eY.1G()}$.A(e.A.1v,"2i").2a=1r};u sT(){k s7=N;$.A(e.A.1v,"2i").sW.P(u(){k sX=$(B);k p2=$(B).3K();if(e.3V>p2.Z&&e.3V<p2.Z+sX.1N()&&e.4h>p2.14&&e.4h<p2.14+sX.2j()){if(mj.fb){$(e.A.1v).1l({4L:e.A.hW,Z:e.A.8j,14:e.A.9l})}$(B).8D("yq",[e.A.1v]);s7=Q;B.f2=N}});C s7};C N};$.fn.2i=u(h5,zy){if(2b h5=="2r"){C $.fn.2i.1J[h5](B,zy)}C B.P(u(){k 7k;k m6=$.A(B,"2i");if(m6){m6.5n.2x(".2i");7k=$.1d(m6.E,h5)}K{7k=$.1d({},$.fn.2i.1u,$.fn.2i.1o(B),h5||{})}if(7k.1z==Q){$(B).1l("4e","");C}k hs=1r;if(2b 7k.5n=="1P"||7k.5n==1r){hs=$(B)}K{hs=(2b 7k.5n=="2r"?$(7k.5n,B):7k.5n)}$.A(B,"2i",{E:7k,5n:hs});hs.2x(".2i").1m("fI.2i",{1v:B},u(e){if(kD){C}k Cg=$.A(e.A.1v,"2i").E;if(ws(e)){$(B).1l("4e",Cg.4e)}K{$(B).1l("4e","")}}).1m("5h.2i",{1v:B},u(e){$(B).1l("4e","")}).1m("5q.2i",{1v:B},u(e){if(ws(e)==N){C}$(B).1l("4e","");k hk=$(e.A.1v).4L();k AU={hW:$(e.A.1v).1l("4L"),8j:hk.Z,9l:hk.14,Z:hk.Z,14:hk.14,ba:e.3V,bm:e.4h,1v:e.A.1v,2p:$(e.A.1v).2p()[0]};$.1d(e.A,AU);k AJ=$.A(e.A.1v,"2i").E;if(AJ.r5.X(e.A.1v,e)==N){C}$(2G).1m("5q.2i",e.A,AI);$(2G).1m("fI.2i",e.A,AM);$(2G).1m("Jx.2i",e.A,Bl)});u ws(e){k s8=$.A(e.A.1v,"2i");k j2=s8.5n;k gx=$(j2).3K();k x6=$(j2).1N();k x7=$(j2).2j();k t=e.4h-gx.14;k r=gx.Z+x6-e.3V;k b=gx.14+x7-e.4h;k l=e.3V-gx.Z;C 3v.3k(t,r,b,l)>s8.E.cJ}})};$.fn.2i.1J={E:u(jq){C $.A(jq[0],"2i").E},2a:u(jq){C $.A(jq[0],"2i").2a},6H:u(jq){C jq.P(u(){$(B).2i({1z:N})})},6l:u(jq){C jq.P(u(){$(B).2i({1z:Q})})}};$.fn.2i.1o=u(rZ){k t=$(rZ);C $.1d({},$.1V.1o(rZ,["4e","5n","gC",{"fb":"1S","cE":"2O","cA":"2O","cJ":"2O"}]),{1z:(t.1b("1z")?Q:1P)})};$.fn.2i.1u={2a:1r,fb:N,4e:"aR",cE:1r,cA:1r,5n:1r,1z:N,cJ:0,gC:1r,r5:u(e){},fV:u(e){},gn:u(e){},fo:u(e){}}})(2T);(u($){u yc(5D){$(5D).1e("4x");$(5D).1m("xj",u(e,wY){$.A(5D,"4x").E.Hy.4V(5D,[e,wY])});$(5D).1m("yl",u(e,yk){$.A(5D,"4x").E.ru.4V(5D,[e,yk])});$(5D).1m("yj",u(e,yi){$.A(5D,"4x").E.rH.4V(5D,[e,yi])});$(5D).1m("yq",u(e,yp){$.A(5D,"4x").E.cg.4V(5D,[e,yp])})};$.fn.4x=u(a0,yf){if(2b a0=="2r"){C $.fn.4x.1J[a0](B,yf)}a0=a0||{};C B.P(u(){k ut=$.A(B,"4x");if(ut){$.1d(ut.E,a0)}K{yc(B);$.A(B,"4x",{E:$.1d({},$.fn.4x.1u,$.fn.4x.1o(B),a0)})}})};$.fn.4x.1J={};$.fn.4x.1o=u(xC){C $.1d({},$.1V.1o(xC,["bq"]))};$.fn.4x.1u={bq:1r,Hy:u(e,JT){},rH:u(e,JR){},ru:u(e,JQ){},cg:u(e,JP){}}})(2T);(u($){k lQ=N;$.fn.2D=u(ey,Gb){if(2b ey=="2r"){C $.fn.2D.1J[ey](B,Gb)}u tx(e){k 3l=e.A;k 7G=$.A(3l.1v,"2D").E;if(3l.2y.7M("e")!=-1){k nc=3l.tS+e.3V-3l.ba;nc=3v.3k(3v.3h(nc,7G.fQ),7G.m9);3l.U=nc}if(3l.2y.7M("s")!=-1){k mW=3l.tL+e.4h-3l.bm;mW=3v.3k(3v.3h(mW,7G.ma),7G.me);3l.V=mW}if(3l.2y.7M("w")!=-1){3l.U=3l.tS-e.3V+3l.ba;if(3l.U>=7G.fQ&&3l.U<=7G.m9){3l.Z=3l.8j+e.3V-3l.ba}}if(3l.2y.7M("n")!=-1){3l.V=3l.tL-e.4h+3l.bm;if(3l.V>=7G.ma&&3l.V<=7G.me){3l.14=3l.9l+e.4h-3l.bm}}};u ty(e){k 6j=e.A;k tv=6j.1v;if(!$.tV&&$.mY.ni){$(tv).1l({U:6j.U,V:6j.V,Z:6j.Z,14:6j.14})}K{$(tv).1l({U:6j.U-6j.HW,V:6j.V-6j.Ie,Z:6j.Z,14:6j.14})}};u Jv(e){lQ=Q;$.A(e.A.1v,"2D").E.fP.X(e.A.1v,e);C N};u Jn(e){tx(e);if($.A(e.A.1v,"2D").E.5N.X(e.A.1v,e)!=N){ty(e)}C N};u JE(e){lQ=N;tx(e,Q);ty(e);$.A(e.A.1v,"2D").E.fL.X(e.A.1v,e);$(2G).2x(".2D");$("1q").1l("4e","");C N};C B.P(u(){k ar=1r;k tq=$.A(B,"2D");if(tq){$(B).2x(".2D");ar=$.1d(tq.E,ey||{})}K{ar=$.1d({},$.fn.2D.1u,$.fn.2D.1o(B),ey||{});$.A(B,"2D",{E:ar})}if(ar.1z==Q){C}$(B).1m("fI.2D",{1v:B},u(e){if(lQ){C}k 2y=tj(e);if(2y==""){$(e.A.1v).1l("4e","")}K{$(e.A.1v).1l("4e",2y+"-23")}}).1m("5h.2D",{1v:B},u(e){$(e.A.1v).1l("4e","")}).1m("5q.2D",{1v:B},u(e){k 2y=tj(e);if(2y==""){C}u eM(1l){k 1n=2X($(e.A.1v).1l(1l));if(4R(1n)){C 0}K{C 1n}};k m4={1v:e.A.1v,2y:2y,8j:eM("Z"),9l:eM("14"),Z:eM("Z"),14:eM("14"),ba:e.3V,bm:e.4h,tS:$(e.A.1v).1N(),tL:$(e.A.1v).2j(),U:$(e.A.1v).1N(),V:$(e.A.1v).2j(),HW:$(e.A.1v).1N()-$(e.A.1v).U(),Ie:$(e.A.1v).2j()-$(e.A.1v).V()};$(2G).1m("5q.2D",m4,Jv);$(2G).1m("fI.2D",m4,Jn);$(2G).1m("Jx.2D",m4,JE);$("1q").1l("4e",2y+"-23")});u tj(e){k tt=$(e.A.1v);k 2y="";k 7H=tt.3K();k uu=tt.1N();k tU=tt.2j();k eZ=ar.cJ;if(e.4h>7H.14&&e.4h<7H.14+eZ){2y+="n"}K{if(e.4h<7H.14+tU&&e.4h>7H.14+tU-eZ){2y+="s"}}if(e.3V>7H.Z&&e.3V<7H.Z+eZ){2y+="w"}K{if(e.3V<7H.Z+uu&&e.3V>7H.Z+uu-eZ){2y+="e"}}k ur=ar.fT.47(",");1h(k i=0;i<ur.O;i++){k u1=ur[i].5J(/(^\\s*)|(\\s*$)/g,"");if(u1=="Jp"||u1==2y){C 2y}}C""}})};$.fn.2D.1J={E:u(jq){C $.A(jq[0],"2D").E},6H:u(jq){C jq.P(u(){$(B).2D({1z:N})})},6l:u(jq){C jq.P(u(){$(B).2D({1z:Q})})}};$.fn.2D.1o=u(ua){k t=$(ua);C $.1d({},$.1V.1o(ua,["fT",{fQ:"2O",ma:"2O",m9:"2O",me:"2O",cJ:"2O"}]),{1z:(t.1b("1z")?Q:1P)})};$.fn.2D.1u={1z:N,fT:"n, e, s, w, ne, se, sw, nw, Jp",fQ:10,ma:10,m9:i6,me:i6,cJ:5,fP:u(e){},5N:u(e){},fL:u(e){}}})(2T);(u($){u J6(5I){k 6q=$.A(5I,"2P").E;$(5I).4u();$(5I).1e("l-1D");if(6q.id){$(5I).1b("id",6q.id)}K{$(5I).1b("id","")}if(6q.39){$(5I).1e("l-1D-39")}K{$(5I).1x("l-1D-39")}if(6q.1w){$(5I).1F(6q.1w).go("<1a Y=\\"l-1D-Z\\">"+"<1a Y=\\"l-1D-1w\\">"+"</1a>"+"</1a>");if(6q.1W){$(5I).L(".l-1D-1w").1e(6q.1W).1l("dn-Z","JM")}}K{$(5I).1F("&aL;").go("<1a Y=\\"l-1D-Z\\">"+"<1a Y=\\"l-1D-1w\\">"+"<1a Y=\\"l-1D-4u\\"></1a>"+"</1a>"+"</1a>");if(6q.1W){$(5I).L(".l-1D-4u").1e(6q.1W)}}$(5I).2x(".2P").1m("5o.2P",u(){if(!6q.1z){$(B).L("1a.l-1D-1w").1e("l-1D-5o")}}).1m("6Z.2P",u(){$(B).L("1a.l-1D-1w").1x("l-1D-5o")});mA(5I,6q.1z)};u mA(6V,J7){k 8t=$.A(6V,"2P");if(J7){8t.E.1z=Q;k rY=$(6V).1b("26");if(rY){8t.26=rY;$(6V).1b("26","3I:3Z(0)")}if(6V.3O){8t.3O=6V.3O;6V.3O=1r}$(6V).1e("l-1D-1z")}K{8t.E.1z=N;if(8t.26){$(6V).1b("26",8t.26)}if(8t.3O){6V.3O=8t.3O}$(6V).1x("l-1D-1z")}};$.fn.2P=u(aB,Jg){if(2b aB=="2r"){C $.fn.2P.1J[aB](B,Jg)}aB=aB||{};C B.P(u(){k t1=$.A(B,"2P");if(t1){$.1d(t1.E,aB)}K{$.A(B,"2P",{E:$.1d({},$.fn.2P.1u,$.fn.2P.1o(B),aB)});$(B).4K("1z")}J6(B)})};$.fn.2P.1J={E:u(jq){C $.A(jq[0],"2P").E},6H:u(jq){C jq.P(u(){mA(B,N)})},6l:u(jq){C jq.P(u(){mA(B,Q)})}};$.fn.2P.1o=u(sK){k t=$(sK);C $.1d({},$.1V.1o(sK,["id","1W",{39:"1S"}]),{1z:(t.1b("1z")?Q:1P),1w:$.82(t.1F()),1W:(t.1b("24")||t.1b("1W"))})};$.fn.2P.1u={id:1r,1z:N,39:N,1w:"",1W:1r}})(2T);(u($){u FJ(5O){k vW=$.A(5O,"1Y");k 3f=vW.E;k bb=vW.bb={};k wE={5H:{1W:"1Y-5H",4w:u(){if(3f.2J>1){7O(5O,1)}}},3F:{1W:"1Y-3F",4w:u(){if(3f.2J>1){7O(5O,3f.2J-1)}}},2B:{1W:"1Y-2B",4w:u(){k IY=3v.sg(3f.3p/3f.34);if(3f.2J<IY){7O(5O,3f.2J+1)}}},52:{1W:"1Y-52",4w:u(){k wR=3v.sg(3f.3p/3f.34);if(3f.2J<wR){7O(5O,wR)}}},64:{1W:"1Y-8l",4w:u(){if(3f.Fb.X(5O,3f.2J,3f.34)!=N){7O(5O,3f.2J);3f.EO.X(5O,3f.2J,3f.34)}}}};k lH=$(5O).1e("1Y").1F("<2s 6e=\\"0\\" 65=\\"0\\" 2W=\\"0\\"><tr></tr></2s>");k tr=lH.L("tr");u dj(wK){k a=$("<a 26=\\"3I:3Z(0)\\"></a>").1t(tr);a.2V("<td></td>");a.2P({1W:wE[wK].1W,39:Q}).2x(".1Y").1m("2e.1Y",wE[wK].4w);C a};if(3f.uH){k ps=$("<5C Y=\\"1Y-lU-IH\\"></5C>");ps.1m("JU",u(){3f.34=2X($(B).1n());3f.F0.X(5O,3f.34);7O(5O,3f.2J)});1h(k i=0;i<3f.5E.O;i++){$("<tO></tO>").1w(3f.5E[i]).1t(ps)}$("<td></td>").4D(ps).1t(tr);$("<td><G Y=\\"1Y-1D-3j\\"></G></td>").1t(tr)}bb.5H=dj("5H");bb.3F=dj("3F");$("<td><G Y=\\"1Y-1D-3j\\"></G></td>").1t(tr);$("<1a 2c=\\"dn-Z:Ii;\\"></1a>").1F(3f.F6).1t(tr).2V("<td></td>");bb.nb=$("<1L Y=\\"1Y-nb\\" 1I=\\"1w\\" 1A=\\"1\\" JS=\\"2\\">").1t(tr).2V("<td></td>");bb.nb.2x(".1Y").1m("jg.1Y",u(e){if(e.dv==13){k IW=2X($(B).1n())||1;7O(5O,IW);C N}});bb.ay=$("<1a 2c=\\"dn-6h:Ii;\\"></1a>").1t(tr).2V("<td></td>");$("<td><G Y=\\"1Y-1D-3j\\"></G></td>").1t(tr);bb.2B=dj("2B");bb.52=dj("52");if(3f.jQ){$("<td><G Y=\\"1Y-1D-3j\\"></G></td>").1t(tr);bb.64=dj("64")}if(3f.6s){$("<td><G Y=\\"1Y-1D-3j\\"></G></td>").1t(tr);1h(k i=0;i<3f.6s.O;i++){k 1D=3f.6s[i];if(1D=="-"){$("<td><G Y=\\"1Y-1D-3j\\"></G></td>").1t(tr)}K{k td=$("<td></td>").1t(tr);$("<a 26=\\"3I:3Z(0)\\"></a>").1t(td).2P($.1d(1D,{39:Q})).1m("2e",4U(1D.4w||u(){}))}}}$("<G Y=\\"1Y-kG\\"></G>").1t(lH);$("<G 2c=\\"43:cI;\\"></G>").1t(lH)};u 7O(nz,I0){k mS=$.A(nz,"1Y").E;jN(nz,{2J:I0});mS.ln.X(nz,mS.2J,mS.34)};u jN(cH,IK){k 49=$.A(cH,"1Y").E;k bb=$.A(cH,"1Y").bb;$.1d(49,IK||{});k ps=$(cH).L("5C.1Y-lU-IH");if(ps.O){ps.1n(49.34+"");49.34=2X(ps.1n())}k e9=3v.sg(49.3p/49.34)||1;if(49.2J<1){49.2J=1}if(49.2J>e9){49.2J=e9}bb.nb.1n(49.2J);bb.ay.1F(49.F2.5J(/{F1}/,e9));k 8P=49.F3;8P=8P.5J(/{F5}/,49.3p==0?0:49.34*(49.2J-1)+1);8P=8P.5J(/{to}/,3v.3k(49.34*(49.2J),49.3p));8P=8P.5J(/{3p}/,49.3p);$(cH).L("G.1Y-kG").1F(8P);bb.5H.4I(bb.3F).2P({1z:(49.2J==1)});bb.2B.4I(bb.52).2P({1z:(49.2J==e9)});jD(cH,49.4b)};u jD(sv,Ei){k hE=$.A(sv,"1Y").E;k bb=$.A(sv,"1Y").bb;hE.4b=Ei;if(hE.jQ){if(hE.4b){bb.64.2P({1W:"1Y-4b"})}K{bb.64.2P({1W:"1Y-8l"})}}};$.fn.1Y=u(bj,Ej){if(2b bj=="2r"){C $.fn.1Y.1J[bj](B,Ej)}bj=bj||{};C B.P(u(){k kC;k t2=$.A(B,"1Y");if(t2){kC=$.1d(t2.E,bj)}K{kC=$.1d({},$.fn.1Y.1u,$.fn.1Y.1o(B),bj);$.A(B,"1Y",{E:kC})}FJ(B);jN(B)})};$.fn.1Y.1J={E:u(jq){C $.A(jq[0],"1Y").E},4b:u(jq){C jq.P(u(){jD(B,Q)})},6A:u(jq){C jq.P(u(){jD(B,N)})},64:u(jq,EE){C jq.P(u(){jN(B,EE)})},5C:u(jq,EI){C jq.P(u(){7O(B,EI)})}};$.fn.1Y.1o=u(v2){k t=$(v2);C $.1d({},$.1V.1o(v2,[{3p:"2O",34:"2O",2J:"2O"},{4b:"1S",uH:"1S",jQ:"1S"}]),{5E:(t.1b("5E")?4U(t.1b("5E")):1P)})};$.fn.1Y.1u={3p:1,34:10,2J:1,5E:[10,20,30,50],4b:N,6s:1r,uH:Q,jQ:Q,ln:u(JV,K1){},Fb:u(K2,JL){},EO:u(JJ,JK){},F0:u(JX){},F6:"JZ",F2:"of {F1}",F3:"JN {F5} to {to} of {3p} K0"}})(2T);(u($){u A6(EM){k oU=$(EM);oU.1e("I");C oU};u A7(EH){k o5=[];nL(o5,$(EH));u nL(aa,EG){EG.17("li").P(u(){k fi=$(B);k aW=$.1d({},$.1V.1o(B,["id","1W","5c"]),{35:(fi.1b("35")?Q:1P)});aW.1w=fi.17("1a").1F();if(!aW.1w){aW.1w=fi.1F()}k nB=fi.17("ul");if(nB.O){aW.17=[];nL(aW.17,nB)}aa.1i(aW)})};C o5};u q6(5P){k jK=$.A(5P,"I").E;k jL=$.A(5P,"I").I;$("G.I-19",jL).2x(".I").1m("i1.I",u(){k8(5P,B);jK.z8.X(5P,k5(5P))}).1m("2e.I",u(){k8(5P,B);jK.b6.X(5P,k5(5P))}).1m("6t.I",u(){$(B).1e("I-19-2l");C N}).1m("5h.I",u(){$(B).1x("I-19-2l");C N}).1m("gt.I",u(e){jK.do.X(5P,e,3Y(5P,B))});$("1a.I-1O",jL).2x(".I").1m("2e.I",u(){k EF=$(B).2p();nO(5P,EF[0]);C N}).1m("6t.I",u(){if($(B).2h("I-3r")){$(B).1e("I-3r-2l")}K{$(B).1e("I-2C-2l")}}).1m("5h.I",u(){if($(B).2h("I-3r")){$(B).1x("I-3r-2l")}K{$(B).1x("I-2C-2l")}}).1m("5q.I",u(){C N});$("1a.I-2t",jL).2x(".I").1m("2e.I",u(){k Ez=$(B).2p();6G(5P,Ez[0],!$(B).2h("I-4Y"));C N}).1m("5q.I",u(){C N})};u jm(EB){k nU=$(EB).L("G.I-19");nU.2i("6l");nU.1l("4e","gk")};u l2(6N){k pC=$.A(6N,"I").E;k EC=$.A(6N,"I").I;EC.L("G.I-19").2i({1z:N,fb:Q,4e:"gk",2a:u(FN){k p=$("<G Y=\\"I-19-2a I-81-no\\"></G>").1t("1q");p.1F($(FN).L(".I-2f").1F());p.2z();C p},cE:15,cA:15,r5:u(e){if(e.8p!=1){C N}$(B).2B("ul").L("G.I-19").4x({bq:"no-bq"});k ky=$(B).L("1a.I-6d");if(ky.O){e.A.8j+=ky.O*ky.U()}},fV:u(){$(B).2i("2a").1l({Z:-i6,14:-i6})},gn:u(e){k x1=e.3V,y1=e.4h,x2=e.A.ba,y2=e.A.bm;k d=3v.JW((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));if(d>3){$(B).2i("2a").2F()}B.4h=e.4h},fo:u(){$(B).2B("ul").L("G.I-19").4x({bq:"G.I-19"})}}).4x({bq:"G.I-19",rH:u(e,rK){k hA=rK.4h;k 14=$(B).3K().14;k rf=14+$(B).2j();$(rK).2i("2a").1x("I-81-no").1e("I-81-CX");$(B).1x("I-19-4D I-19-14 I-19-7R");if(hA>14+(rf-14)/2){if(rf-hA<5){$(B).1e("I-19-7R")}K{$(B).1e("I-19-4D")}}K{if(hA-14<5){$(B).1e("I-19-14")}K{$(B).1e("I-19-4D")}}},ru:u(e,D2){$(D2).2i("2a").1x("I-81-CX").1e("I-81-no");$(B).1x("I-19-4D I-19-14 I-19-7R")},cg:u(e,CZ){k D1=B;k hT,rq;if($(B).2h("I-19-4D")){hT=D9}K{hT=CN;rq=$(B).2h("I-19-14")?"14":"7R"}3m(u(){hT(CZ,D1,rq)},0);$(B).1x("I-19-4D I-19-14 I-19-7R")}});u D9(Cz,g6){if(3Y(6N,g6).5c=="3b"){aY(6N,g6,u(){pG()})}K{pG()}u pG(){k pq=$(6N).I("dF",Cz);$(6N).I("4D",{2p:g6,A:[pq]});pC.cg.X(6N,g6,pq,"4D")}};u CN(CJ,iB,pz){k gf={};if(pz=="14"){gf.eT=iB}K{gf.ay=iB}k pA=$(6N).I("dF",CJ);gf.A=pA;$(6N).I("Ap",gf);pC.cg.X(6N,iB,pA,pz)}};u 6G(g9,py,qo){k iC=$.A(g9,"I").E;if(!iC.2t){C}k iA=$(py);k ck=iA.L(".I-2t");ck.1x("I-6k I-4Y I-9L");if(qo){ck.1e("I-4Y")}K{ck.1e("I-6k")}if(iC.qy){qu(iA);Ed(iA)}k DV=3Y(g9,py);iC.9M.X(g9,DV,qo);u Ed(qk){k iz=qk.2B().L(".I-2t");iz.1x("I-6k I-4Y I-9L");if(qk.L(".I-2t").2h("I-4Y")){iz.1e("I-4Y")}K{iz.1e("I-6k")}};u qu(iv){k iw=aT(g9,iv[0]);if(iw){k ck=$(iw.1v).L(".I-2t");ck.1x("I-6k I-4Y I-9L");if(DB(iv)){ck.1e("I-4Y")}K{if(Dw(iv)){ck.1e("I-6k")}K{ck.1e("I-9L")}}qu($(iw.1v))}u DB(n){k ck=n.L(".I-2t");if(ck.2h("I-6k")||ck.2h("I-9L")){C N}k b=Q;n.2p().nX().P(u(){if(!$(B).17("G.I-19").17(".I-2t").2h("I-4Y")){b=N}});C b};u Dw(n){k ck=n.L(".I-2t");if(ck.2h("I-4Y")||ck.2h("I-9L")){C N}k b=Q;n.2p().nX().P(u(){if(!$(B).17("G.I-19").17(".I-2t").2h("I-6k")){b=N}});C b}}};u nT(7B,83){k qg=$.A(7B,"I").E;k iG=$(83);if(k4(7B,83)){k ck=iG.L(".I-2t");if(ck.O){if(ck.2h("I-4Y")){6G(7B,83,Q)}K{6G(7B,83,N)}}K{if(qg.g3){$("<1a Y=\\"I-2t I-6k\\"></1a>").aO(iG.L(".I-2f"));q6(7B)}}}K{k ck=iG.L(".I-2t");if(qg.g3){ck.1G()}K{if(ck.2h("I-4Y")){6G(7B,83,Q)}K{if(ck.2h("I-9L")){k q3=Q;k q4=Q;k qf=fN(7B,83);1h(k i=0;i<qf.O;i++){if(qf[i].35){q4=N}K{q3=N}}if(q3){6G(7B,83,Q)}if(q4){6G(7B,83,N)}}}}}};u fS(6m,ul,eo,DF){k dk=$.A(6m,"I").E;eo=dk.dp.X(6m,eo,$(ul).3F("G.I-19")[0]);if(!DF){$(ul).4u()}k lx=[];k DH=$(ul).3F("G.I-19").L("1a.I-6d, 1a.I-1O").O;rE(ul,eo,DH);q6(6m);if(dk.81){l2(6m)}K{jm(6m)}1h(k i=0;i<lx.O;i++){6G(6m,lx[i],Q)}3m(u(){lE(6m,6m)},0);k pj=1r;if(6m!=ul){k Iw=$(ul).3F();pj=3Y(6m,Iw[0])}dk.53.X(6m,pj,eo);u rE(ul,pN,qI){1h(k i=0;i<pN.O;i++){k li=$("<li></li>").1t(ul);k 3X=pN[i];if(3X.5c!="3D"&&3X.5c!="3b"){3X.5c="3D"}k 4W=$("<G Y=\\"I-19\\"></G>").1t(li);4W.1b("19-id",3X.id);$.A(4W[0],"I-19",{id:3X.id,1w:3X.1w,1W:3X.1W,Il:3X.Il});$("<1a Y=\\"I-2f\\"></1a>").1F(3X.1w).1t(4W);if(dk.2t){if(dk.g3){if(3X.5c=="3D"&&(!3X.17||!3X.17.O)){if(3X.35){$("<1a Y=\\"I-2t I-4Y\\"></1a>").3o(4W)}K{$("<1a Y=\\"I-2t I-6k\\"></1a>").3o(4W)}}}K{if(3X.35){$("<1a Y=\\"I-2t I-4Y\\"></1a>").3o(4W);lx.1i(4W[0])}K{$("<1a Y=\\"I-2t I-6k\\"></1a>").3o(4W)}}}if(3X.17&&3X.17.O){k qM=$("<ul></ul>").1t(li);if(3X.5c=="3D"){$("<1a Y=\\"I-24 I-4o I-4o-3D\\"></1a>").1e(3X.1W).3o(4W);$("<1a Y=\\"I-1O I-3r\\"></1a>").3o(4W)}K{$("<1a Y=\\"I-24 I-4o\\"></1a>").1e(3X.1W).3o(4W);$("<1a Y=\\"I-1O I-2C\\"></1a>").3o(4W);qM.1l("3q","5e")}rE(qM,3X.17,qI+1)}K{if(3X.5c=="3b"){$("<1a Y=\\"I-24 I-4o\\"></1a>").1e(3X.1W).3o(4W);$("<1a Y=\\"I-1O I-2C\\"></1a>").3o(4W)}K{$("<1a Y=\\"I-24 I-5j\\"></1a>").1e(3X.1W).3o(4W);$("<1a Y=\\"I-6d\\"></1a>").3o(4W)}}1h(k j=0;j<qI;j++){$("<1a Y=\\"I-6d\\"></1a>").3o(4W)}}}};u lE(cK,ul,mB){k J1=$.A(cK,"I").E;if(!J1.g5){C}if(!mB){mB=Q;$(cK).L("1a.I-6d").1x("I-HH I-3R I-H0");$(cK).L("G.I-19").1x("I-19-52 I-m2-5H I-m2-Jc");k m5=$(cK).I("vz");if(m5.O>1){$(m5[0].1v).1e("I-m2-5H")}K{$(m5[0].1v).1e("I-m2-Jc")}}$(ul).17("li").P(u(){k my=$(B).17("G.I-19");k ul=my.2B("ul");if(ul.O){if($(B).2B().O){HE(my)}lE(cK,ul,mB)}K{Gj(my)}});k GK=$(ul).17("li:52").17("G.I-19").1e("I-19-52");GK.17("1a.I-3R").1x("I-3R").1e("I-H0");u Gj(Gw,JO){k H3=Gw.L("1a.I-24");H3.3F("1a.I-6d").1e("I-3R")};u HE(oR){k HF=oR.L("1a.I-6d, 1a.I-1O").O;oR.2B().L("G.I-19").P(u(){$(B).17("1a:eq("+(HF-1)+")").1e("I-HH")})}};u jX(9h,ul,h0,gR){k md=$.A(9h,"I").E;h0=h0||{};k nC=1r;if(9h!=ul){k HC=$(ul).3F();nC=3Y(9h,HC[0])}if(md.74.X(9h,nC,h0)==N){C}k gK=$(ul).3F().17("1a.I-4o");gK.1e("I-4b");k Hz=md.8s.X(9h,h0,u(Hw){gK.1x("I-4b");fS(9h,ul,Hw);if(gR){gR()}},u(){gK.1x("I-4b");md.77.4V(9h,5r);if(gR){gR()}});if(Hz==N){gK.1x("I-4b")}};u aY(8k,gN,86){k x=$.A(8k,"I").E;k 1O=$(gN).17("1a.I-1O");if(1O.O==0){C}if(1O.2h("I-3r")){C}k 19=3Y(8k,gN);if(x.8F.X(8k,19)==N){C}1O.1x("I-2C I-2C-2l").1e("I-3r");1O.2B().1e("I-4o-3D");k ul=$(gN).2B();if(ul.O){if(x.3U){ul.h7("75",u(){x.5d.X(8k,19);if(86){86()}})}K{ul.1l("3q","5w");x.5d.X(8k,19);if(86){86()}}}K{k bM=$("<ul 2c=\\"3q:5e\\"></ul>").4a(gN);jX(8k,bM[0],{id:19.id},u(){if(bM.is(":4u")){bM.1G()}if(x.3U){bM.h7("75",u(){x.5d.X(8k,19);if(86){86()}})}K{bM.1l("3q","5w");x.5d.X(8k,19);if(86){86()}}})}};u jw(bS,iI){k x=$.A(bS,"I").E;k 1O=$(iI).17("1a.I-1O");if(1O.O==0){C}if(1O.2h("I-2C")){C}k 19=3Y(bS,iI);if(x.7s.X(bS,19)==N){C}1O.1x("I-3r I-3r-2l").1e("I-2C");1O.2B().1x("I-4o-3D");k ul=$(iI).2B();if(x.3U){ul.iP("75",u(){x.80.X(bS,19)})}K{ul.1l("3q","5e");x.80.X(bS,19)}};u nO(rb,jB){k 1O=$(jB).17("1a.I-1O");if(1O.O==0){C}if(1O.2h("I-3r")){jw(rb,jB)}K{aY(rb,jB)}};u Ax(kE,kQ){k kz=fN(kE,kQ);if(kQ){kz.84(3Y(kE,kQ))}1h(k i=0;i<kz.O;i++){aY(kE,kz[i].1v)}};u AB(i3,yz){k hS=[];k p=aT(i3,yz);7n(p){hS.84(p);p=aT(i3,p.1v)}1h(k i=0;i<hS.O;i++){aY(i3,hS[i].1v)}};u As(n9,hJ){k ng=fN(n9,hJ);if(hJ){ng.84(3Y(n9,hJ))}1h(k i=0;i<ng.O;i++){jw(n9,ng[i].1v)}};u zQ(x4){k ol=k3(x4);if(ol.O){C ol[0]}K{C 1r}};u k3(od){k oe=[];$(od).17("li").P(u(){k 19=$(B).17("G.I-19");oe.1i(3Y(od,19[0]))});C oe};u fN(ou,oz){k kd=[];if(oz){oL($(oz))}K{k kB=k3(ou);1h(k i=0;i<kB.O;i++){kd.1i(kB[i]);oL($(kB[i].1v))}}u oL(19){19.2B().L("G.I-19").P(u(){kd.1i(3Y(ou,B))})};C kd};u aT(rc,B6){k ul=$(B6).2p().2p();if(ul[0]==rc){C 1r}K{C 3Y(rc,ul.3F()[0])}};u zU(rF){k qa=[];$(rF).L(".I-4Y").P(u(){k 19=$(B).2p();qa.1i(3Y(rF,19[0]))});C qa};u k5(qX){k 19=$(qX).L("G.I-19-1Q");if(19.O){C 3Y(qX,19[0])}K{C 1r}};u jA(jo,gI){k 19=$(gI.2p);k ul;if(19.O==0){ul=$(jo)}K{ul=19.2B();if(ul.O==0){ul=$("<ul></ul>").4a(19)}}if(gI.A&&gI.A.O){k nu=19.L("1a.I-24");if(nu.2h("I-5j")){nu.1x("I-5j").1e("I-4o");k 1O=$("<1a Y=\\"I-1O I-3r\\"></1a>").aO(nu);if(1O.3F().O){1O.3F().1G()}}}fS(jo,ul[0],gI.A,Q);nT(jo,ul.3F())};u Ah(gM,bW){k ja=bW.eT||bW.ay;k jn=aT(gM,ja);k li;if(jn){jA(gM,{2p:jn.1v,A:[bW.A]});li=$(jn.1v).2B().17("li:52")}K{jA(gM,{2p:1r,A:[bW.A]});li=$(gM).17("li:52")}if(bW.eT){li.aO($(ja).2p())}K{li.4a($(ja).2p())}};u Af(d3,qd){k qJ=aT(d3,qd);k 19=$(qd);k li=19.2p();k ul=li.2p();li.1G();if(ul.17("li").O==0){k 19=ul.3F();19.L(".I-24").1x("I-4o").1e("I-5j");19.L(".I-1O").1G();$("<1a Y=\\"I-6d\\"></1a>").3o(19);if(ul[0]!=d3){ul.1G()}}if(qJ){nT(d3,qJ.1v)}lE(d3,d3)};u zN(qj,j5){u pw(aa,ul){ul.17("li").P(u(){k 19=$(B).17("G.I-19");k iu=3Y(qj,19[0]);k qp=$(B).17("ul");if(qp.O){iu.17=[];pw(iu.17,qp)}aa.1i(iu)})};if(j5){k hL=3Y(qj,j5);hL.17=[];pw(hL.17,$(j5).2B());C hL}K{C 1r}};u l6(ra,cC){k 19=$(cC.1v);k g1=3Y(ra,cC.1v);if(g1.1W){19.L(".I-24").1x(g1.1W)}k A=$.1d({},g1,cC);$.A(cC.1v,"I-19",A);19.1b("19-id",A.id);19.L(".I-2f").1F(A.1w);if(A.1W){19.L(".I-24").1e(A.1W)}if(g1.35!=A.35){6G(ra,cC.1v,A.35)}};u 3Y(zX,cv){k 19=$.1d({},$.A(cv,"I-19"),{1v:cv,35:$(cv).L(".I-2t").2h("I-4Y")});if(!k4(zX,cv)){19.5c=$(cv).L(".I-1O").2h("I-3r")?"3D":"3b"}C 19};u zT(nW,id){k 19=$(nW).L("G.I-19[19-id="+id+"]");if(19.O){C 3Y(nW,19[0])}K{C 1r}};u k8(cl,nV){k x=$.A(cl,"I").E;k 19=3Y(cl,nV);if(x.z7.X(cl,19)==N){C}$("G.I-19-1Q",cl).1x("I-19-1Q");$(nV).1e("I-19-1Q");x.4l.X(cl,19)};u k4(KY,A3){k 19=$(A3);k 1O=19.17("1a.I-1O");C 1O.O==0};u Ao(bp,bk){k x=$.A(bp,"I").E;k 19=3Y(bp,bk);if(x.9Q.X(bp,19)==N){C}$(bk).1l("4L","O2");k nt=$(bk).L(".I-2f");k A1=nt.1N();nt.4u();k b8=$("<1L Y=\\"I-4j\\">").1t(nt);b8.1n(19.1w).5o();b8.U(A1+20);b8.V(2G.Cd=="NY"?(18-(b8.2j()-b8.V())):18);b8.1m("2e",u(e){C N}).1m("5q",u(e){e.54()}).1m("fI",u(e){e.54()}).1m("jg",u(e){if(e.dv==13){l9(bp,bk);C N}K{if(e.dv==27){rx(bp,bk);C N}}}).1m("6Z",u(e){e.54();l9(bp,bk)})};u l9(fJ,kJ){k x=$.A(fJ,"I").E;$(kJ).1l("4L","");k oX=$(kJ).L("1L.I-4j");k 1n=oX.1n();oX.1G();k 19=3Y(fJ,kJ);19.1w=1n;l6(fJ,19);x.9X.X(fJ,19)};u rx(fR,kX){k x=$.A(fR,"I").E;$(kX).1l("4L","");$(kX).L("1L.I-4j").1G();k 19=3Y(fR,kX);l6(fR,19);x.9Z.X(fR,19)};$.fn.I=u(aH,A9){if(2b aH=="2r"){C $.fn.I.1J[aH](B,A9)}k aH=aH||{};C B.P(u(){k kg=$.A(B,"I");k x;if(kg){x=$.1d(kg.E,aH);kg.E=x}K{x=$.1d({},$.fn.I.1u,$.fn.I.1o(B),aH);$.A(B,"I",{E:x,I:A6(B)});k A=A7(B);if(A.O&&!x.A){x.A=A}}if(x.g5){$(B).1e("I-g5")}if(x.A){fS(B,B,x.A)}K{if(x.81){l2(B)}K{jm(B)}}jX(B,B)})};$.fn.I.1J={E:u(jq){C $.A(jq[0],"I").E},bT:u(jq,A){C jq.P(u(){fS(B,B,A)})},O0:u(jq,zO){C 3Y(jq[0],zO)},9A:u(jq,zL){C zN(jq[0],zL)},gJ:u(jq,jY){C jq.P(u(){if(jY){k 19=$(jY);k 1O=19.17("1a.I-1O");1O.1x("I-3r I-3r-2l").1e("I-2C");19.2B().1G();aY(B,jY)}K{$(B).4u();jX(B,B)}})},xJ:u(jq){C zQ(jq[0])},vz:u(jq){C k3(jq[0])},xL:u(jq,zW){C aT(jq[0],zW)},xR:u(jq,zV){C fN(jq[0],zV)},h1:u(jq){C zU(jq[0])},dg:u(jq){C k5(jq[0])},y3:u(jq,zS){C k4(jq[0],zS)},L:u(jq,id){C zT(jq[0],id)},5C:u(jq,Ab){C jq.P(u(){k8(B,Ab)})},6x:u(jq,Ac){C jq.P(u(){6G(B,Ac,Q)})},BA:u(jq,Av){C jq.P(u(){6G(B,Av,N)})},37:u(jq,At){C jq.P(u(){jw(B,At)})},36:u(jq,Ar){C jq.P(u(){aY(B,Ar)})},xU:u(jq,Aw){C jq.P(u(){As(B,Aw)})},xW:u(jq,AC){C jq.P(u(){Ax(B,AC)})},xG:u(jq,AA){C jq.P(u(){AB(B,AA)})},xT:u(jq,Az){C jq.P(u(){nO(B,Az)})},4D:u(jq,Aq){C jq.P(u(){jA(B,Aq)})},Ap:u(jq,Ag){C jq.P(u(){Ah(B,Ag)})},1G:u(jq,Ad){C jq.P(u(){Af(B,Ad)})},dF:u(jq,o9){k 19=jq.I("9A",o9);jq.I("1G",o9);C 19},HK:u(jq,Ae){C jq.P(u(){l6(B,Ae)})},NS:u(jq){C jq.P(u(){l2(B)})},NO:u(jq){C jq.P(u(){jm(B)})},gS:u(jq,An){C jq.P(u(){Ao(B,An)})},gT:u(jq,Am){C jq.P(u(){l9(B,Am)})},bz:u(jq,Ak){C jq.P(u(){rx(B,Ak)})}};$.fn.I.1o=u(rm){k t=$(rm);C $.1d({},$.1V.1o(rm,["2N","8x",{2t:"1S",qy:"1S",g3:"1S"},{3U:"1S",g5:"1S",81:"1S"}]))};$.fn.I.1u={2N:1r,8x:"mw",3U:N,2t:N,qy:Q,g3:N,g5:N,81:N,A:1r,8s:u(Al,zK,zJ){k x=$(B).I("E");if(!x.2N){C N}$.9T({1I:x.8x,2N:x.2N,A:Al,dy:"ds",8v:u(A){zK(A)},b9:u(){zJ.4V(B,5r)}})},dp:u(A,Of){C A},74:u(19,Oe){},53:u(19,A){},77:u(){},b6:u(19){},z8:u(19){},8F:u(19){},5d:u(19){},7s:u(19){},80:u(19){},9M:u(19,NQ){},z7:u(19){},4l:u(19){},do:u(e,19){},cg:u(NW,Oa,Nz){},9Q:u(19){},9X:u(19){},9Z:u(19){}}})(2T);(u($){u 33(it){$(it).1e("3J");$(it).1F("<G Y=\\"3J-1w\\"></G><G Y=\\"3J-1A\\">&aL;</G>");C $(it)};u qc(qq,qw){k x=$.A(qq,"3J").E;k 5K=$.A(qq,"3J").5K;if(qw){x.U=qw}5K.3B(x.U);5K.L("G.3J-1w").U(5K.U())};$.fn.3J=u(a2,ze){if(2b a2=="2r"){k qx=$.fn.3J.1J[a2];if(qx){C qx(B,ze)}}a2=a2||{};C B.P(u(){k dZ=$.A(B,"3J");if(dZ){$.1d(dZ.E,a2)}K{dZ=$.A(B,"3J",{E:$.1d({},$.fn.3J.1u,$.fn.3J.1o(B),a2),5K:33(B)})}$(B).3J("2S",dZ.E.1A);qc(B)})};$.fn.3J.1J={E:u(jq){C $.A(jq[0],"3J").E},23:u(jq,zd){C jq.P(u(){qc(B,zd)})},3A:u(jq){C $.A(jq[0],"3J").E.1A},2S:u(jq,7p){if(7p<0){7p=0}if(7p>4Z){7p=4Z}C jq.P(u(){k x=$.A(B,"3J").E;k 1w=x.1w.5J(/{1A}/,7p);k q0=x.1A;x.1A=7p;$(B).L("G.3J-1A").U(7p+"%");$(B).L("G.3J-1w").1F(1w);if(q0!=7p){x.4Q.X(B,7p,q0)}})}};$.fn.3J.1o=u(zc){C $.1d({},$.1V.1o(zc,["U","1w",{1A:"2O"}]))};$.fn.3J.1u={U:"2q",1A:0,1w:"{1A}%",4Q:u(ML,MQ){}}})(2T);(u($){u nI(19){19.P(u(){$(B).1G();if($.mY.ni){B.MF=""}})};u bV(ls,7C){k x=$.A(ls,"J").E;k 6p=$.A(ls,"J").J;k pJ=6p.17("G.J-1K");k lN=6p.17("G.J-1q");if(7C){if(7C.U){x.U=7C.U}if(7C.V){x.V=7C.V}if(7C.Z!=1r){x.Z=7C.Z}if(7C.14!=1r){x.14=7C.14}}if(x.2Z==Q){k p=6p.2p();p.1e("J-lz");if(p[0].cf=="hy"){$("1F").1e("J-2Z")}x.U=p.U();x.V=p.V()}6p.1l({Z:x.Z,14:x.14});if(!4R(x.U)){6p.3B(x.U)}K{6p.U("2q")}pJ.4I(lN).3B(6p.U());if(!4R(x.V)){6p.58(x.V);lN.58(6p.V()-pJ.2j())}K{lN.V("2q")}6p.1l("V","");x.5N.4V(ls,[x.U,x.V]);6p.L(">G.J-1q>G").7l("8q")};u BY(mq,dh){k x=$.A(mq,"J").E;k yS=$.A(mq,"J").J;if(dh){if(dh.Z!=1r){x.Z=dh.Z}if(dh.14!=1r){x.14=dh.14}}yS.1l({Z:x.Z,14:x.14});x.BH.4V(mq,[x.Z,x.14])};u zs(d1){$(d1).1e("J-1q");k mC=$("<G Y=\\"J\\"></G>").aO(d1);mC[0].ME(d1);mC.1m("8q",u(){k x=$.A(d1,"J").E;if(x.2Z==Q){bV(d1)}C N});C mC};u zr(89){k x=$.A(89,"J").E;k cN=$.A(89,"J").J;if(x.3i&&2b x.3i=="2r"){cN.L(">G.J-1K>G.J-1X .J-1X-a").1t(x.3i)}nI(cN.17("G.J-1K"));if(x.2f&&!x.8g){k ml=$("<G Y=\\"J-1K\\"><G Y=\\"J-2f\\">"+x.2f+"</G></G>").3o(cN);if(x.1W){ml.L(".J-2f").1e("J-i8-24");$("<G Y=\\"J-24\\"></G>").1e(x.1W).1t(ml)}k 1X=$("<G Y=\\"J-1X\\"></G>").1t(ml);1X.1m("2e",u(e){e.54()});if(x.3i){if(2b x.3i=="2r"){$(x.3i).17().P(u(){$(B).1e($(B).1b("1W")).1e("J-1X-a").1t(1X)})}K{1h(k i=0;i<x.3i.O;i++){k t=$("<a 26=\\"3I:3Z(0)\\"></a>").1e(x.3i[i].1W).1t(1X);if(x.3i[i].4w){t.1m("2e",4U(x.3i[i].4w))}}}}if(x.8A){$("<a Y=\\"J-1X-37\\" 26=\\"3I:3Z(0)\\"></a>").1t(1X).1m("2e",u(){if(x.2C==Q){rC(89,Q)}K{hZ(89,Q)}C N})}if(x.8B){$("<a Y=\\"J-1X-3k\\" 26=\\"3I:3Z(0)\\"></a>").1t(1X).1m("2e",u(){pK(89);C N})}if(x.8C){$("<a Y=\\"J-1X-3h\\" 26=\\"3I:3Z(0)\\"></a>").1t(1X).1m("2e",u(){if(x.5b==Q){rN(89)}K{nr(89)}C N})}if(x.63){$("<a Y=\\"J-1X-4d\\" 26=\\"3I:3Z(0)\\"></a>").1t(1X).1m("2e",u(){qZ(89);C N})}cN.17("G.J-1q").1x("J-1q-8g")}K{cN.17("G.J-1q").1e("J-1q-8g")}};u hi(f4){k 6r=$.A(f4,"J");if(6r.E.26&&(!6r.gP||!6r.E.9O)){6r.gP=N;nR(f4);k m8=6r.J.L(">G.J-1q");if(6r.E.c0){m8.1F($("<G Y=\\"J-4b\\"></G>").1F(6r.E.c0))}$.9T({2N:6r.E.26,9O:N,8v:u(A){m8.1F(6r.E.BF.X(f4,A));if($.1V){$.1V.f6(m8)}6r.E.8w.4V(f4,5r);6r.gP=Q}})}};u nR(z1){k t=$(z1);t.L(".1c-f").P(u(){$(B).1c("2L")});t.L(".m-1D").P(u(){$(B).4n("2L")});t.L(".s-1D").P(u(){$(B).4v("2L")})};u ld(z0){$(z0).L("G.J:5W,G.2n:5W,G.1f-p0:5W,G.2m:5W").P(u(){$(B).7l("8q",[Q])})};u nZ(7L,yZ){k x=$.A(7L,"J").E;k yX=$.A(7L,"J").J;if(yZ!=Q){if(x.qW.X(7L)==N){C}}yX.2F();x.3b=N;x.5Z=N;x.7X.X(7L);if(x.5b==Q){x.5b=N;nr(7L)}if(x.2C==Q){x.2C=N;hZ(7L)}if(!x.2C){hi(7L);ld(7L)}};u qZ(f0,zg){k x=$.A(f0,"J").E;k zh=$.A(f0,"J").J;if(zg!=Q){if(x.gY.X(f0)==N){C}}zh.2z();x.3b=Q;x.9N.X(f0)};u BP(cR,zB){k x=$.A(cR,"J").E;k zw=$.A(cR,"J").J;if(zB!=Q){if(x.ki.X(cR)==N){C}}nR(cR);nI(zw);x.BG.X(cR)};u hZ(cY,zD){k x=$.A(cY,"J").E;k oY=$.A(cY,"J").J;k 1q=oY.17("G.J-1q");k 1X=oY.17("G.J-1K").L("a.J-1X-37");if(x.2C==Q){C}1q.f5(Q,Q);if(x.7s.X(cY)==N){C}1X.1e("J-1X-36");if(zD==Q){1q.iP("75",u(){x.2C=Q;x.80.X(cY)})}K{1q.2z();x.2C=Q;x.80.X(cY)}};u rC(73,zH){k x=$.A(73,"J").E;k p1=$.A(73,"J").J;k 1q=p1.17("G.J-1q");k 1X=p1.17("G.J-1K").L("a.J-1X-37");if(x.2C==N){C}1q.f5(Q,Q);if(x.8F.X(73)==N){C}1X.1x("J-1X-36");if(zH==Q){1q.h7("75",u(){x.2C=N;x.5d.X(73);hi(73);ld(73)})}K{1q.2F();x.2C=N;x.5d.X(73);hi(73);ld(73)}};u nr(ak){k x=$.A(ak,"J").E;k zE=$.A(ak,"J").J;k 1X=zE.17("G.J-1K").L("a.J-1X-3h");if(x.5b==Q){C}1X.1e("J-1X-rh");if(!$.A(ak,"J").lS){$.A(ak,"J").lS={U:x.U,V:x.V,Z:x.Z,14:x.14,2Z:x.2Z}}x.Z=0;x.14=0;x.2Z=Q;bV(ak);x.5Z=N;x.5b=Q;x.BZ.X(ak)};u pK(lO){k x=$.A(lO,"J").E;k zv=$.A(lO,"J").J;zv.2z();x.5Z=Q;x.5b=N;x.kx.X(lO)};u rN(ap){k x=$.A(ap,"J").E;k ot=$.A(ap,"J").J;k 1X=ot.17("G.J-1K").L("a.J-1X-3h");if(x.5b==N){C}ot.2F();1X.1x("J-1X-rh");k cW=$.A(ap,"J").lS;x.U=cW.U;x.V=cW.V;x.Z=cW.Z;x.14=cW.14;x.2Z=cW.2Z;bV(ap);x.5Z=N;x.5b=N;$.A(ap,"J").lS=1r;x.C0.X(ap)};u zp(af){k x=$.A(af,"J").E;k oB=$.A(af,"J").J;k nn=$(af).J("1K");k 1q=$(af).J("1q");oB.1l(x.2c);oB.1e(x.4M);if(x.2W){nn.1x("J-1K-6D");1q.1x("J-1q-6D")}K{nn.1e("J-1K-6D");1q.1e("J-1q-6D")}nn.1e(x.eg);1q.1e(x.bX);if(x.id){$(af).1b("id",x.id)}K{$(af).1b("id","")}};u AD(or,op){$.A(or,"J").E.2f=op;$(or).J("1K").L("G.J-2f").1F(op)};k eE=N;k mV=Q;$(1s).2x(".J").1m("23.J",u(){if(!mV){C}if(eE!==N){dE(eE)}eE=3m(u(){mV=N;k pc=$("1q.2m");if(pc.O){pc.2m("23")}K{$("1q").17("G.J,G.2n,G.1f-p0,G.2m").7l("8q")}mV=Q;eE=N},g7)});$.fn.J=u(aA,zo){if(2b aA=="2r"){C $.fn.J.1J[aA](B,zo)}aA=aA||{};C B.P(u(){k bU=$.A(B,"J");k x;if(bU){x=$.1d(bU.E,aA)}K{x=$.1d({},$.fn.J.1u,$.fn.J.1o(B),aA);$(B).1b("2f","");bU=$.A(B,"J",{E:x,J:zs(B),gP:N})}if(x.6y){$(B).1F(x.6y);if($.1V){$.1V.f6(B)}}zr(B);zp(B);if(x.6X==Q){bU.J.1l("3q","5w");bV(B)}if(x.3b==Q||x.5Z==Q){bU.J.2z()}K{nZ(B)}})};$.fn.J.1J={E:u(jq){C $.A(jq[0],"J").E},J:u(jq){C $.A(jq[0],"J").J},1K:u(jq){C $.A(jq[0],"J").J.L(">G.J-1K")},1q:u(jq){C $.A(jq[0],"J").J.L(">G.J-1q")},Ms:u(jq,AE){C jq.P(u(){AD(B,AE)})},3D:u(jq,BR){C jq.P(u(){nZ(B,BR)})},4d:u(jq,BQ){C jq.P(u(){qZ(B,BQ)})},2L:u(jq,BN){C jq.P(u(){BP(B,BN)})},64:u(jq,26){C jq.P(u(){$.A(B,"J").gP=N;if(26){$.A(B,"J").E.26=26}hi(B)})},23:u(jq,BT){C jq.P(u(){bV(B,BT)})},aR:u(jq,BX){C jq.P(u(){BY(B,BX)})},Mu:u(jq){C jq.P(u(){nr(B)})},Mr:u(jq){C jq.P(u(){pK(B)})},rh:u(jq){C jq.P(u(){rN(B)})},37:u(jq,BB){C jq.P(u(){hZ(B,BB)})},36:u(jq,Bz){C jq.P(u(){rC(B,Bz)})}};$.fn.J.1o=u(rd){k t=$(rd);C $.1d({},$.1V.1o(rd,["id","U","V","Z","14","2f","1W","4M","eg","bX","3i","26",{9O:"1S",2Z:"1S",2W:"1S",8g:"1S"},{8A:"1S",8B:"1S",8C:"1S"},{63:"1S",2C:"1S",5Z:"1S",5b:"1S",3b:"1S"}]),{c0:(t.1b("c0")!=1P?t.1b("c0"):1P)})};$.fn.J.1u={id:1r,2f:1r,1W:1r,U:"2q",V:"2q",Z:1r,14:1r,4M:1r,eg:1r,bX:1r,2c:{},26:1r,9O:Q,2Z:N,2W:Q,6X:Q,8g:N,6y:1r,8A:N,8B:N,8C:N,63:N,2C:N,5Z:N,5b:N,3b:N,3i:1r,26:1r,c0:"Mo...",BF:u(A){k BJ=/<1q[^>]*>((.|[\\n\\r])*)<\\/1q>/im;k nF=BJ.Ix(A);if(nF){C nF[1]}K{C A}},8w:u(){},qW:u(){},7X:u(){},gY:u(){},9N:u(){},ki:u(){},BG:u(){},5N:u(N2,N1){},BH:u(Z,14){},BZ:u(){},C0:u(){},kx:u(){},7s:u(){},8F:u(){},80:u(){},5d:u(){}}})(2T);(u($){u pb(om,7t){k x=$.A(om,"1s").E;if(7t){if(7t.U){x.U=7t.U}if(7t.V){x.V=7t.V}if(7t.Z!=1r){x.Z=7t.Z}if(7t.14!=1r){x.14=7t.14}}$(om).J("23",x)};u oo(oM,dQ){k 9u=$.A(oM,"1s");if(dQ){if(dQ.Z!=1r){9u.E.Z=dQ.Z}if(dQ.14!=1r){9u.E.14=dQ.14}}$(oM).J("aR",9u.E);if(9u.2U){9u.2U.1l({Z:9u.E.Z,14:9u.E.14})}};u Ca(66){k 1E=$.A(66,"1s");k 2o=$(66).J($.1d({},1E.E,{2W:N,6X:Q,3b:Q,4M:"1s",eg:"1s-1K",bX:"1s-1q "+(1E.E.8g?"1s-1q-8g":""),ki:u(){if(1E.E.ki.X(66)==N){C N}if(1E.2U){1E.2U.1G()}if(1E.3w){1E.3w.1G()}},9N:u(){if(1E.2U){1E.2U.2z()}if(1E.3w){1E.3w.2z()}1E.E.9N.X(66)},7X:u(){if(1E.3w){1E.3w.1l({3q:"5w",42:$.fn.1s.1u.42++})}if(1E.2U){1E.2U.1l({3q:"5w",42:$.fn.1s.1u.42++,Z:1E.E.Z,14:1E.E.14,U:1E.1s.1N(),V:1E.1s.2j()})}1E.1s.1l("z-2K",$.fn.1s.1u.42++);1E.E.7X.X(66)},5N:u(Ch,Cf){k x=$(66).J("E");1E.E.U=x.U;1E.E.V=x.V;1E.E.Z=x.Z;1E.E.14=x.14;if(1E.2U){1E.2U.1l({Z:1E.E.Z,14:1E.E.14,U:1E.1s.1N(),V:1E.1s.2j()})}1E.E.5N.X(66,Ch,Cf)},kx:u(){if(1E.2U){1E.2U.2z()}if(1E.3w){1E.3w.2z()}1E.E.kx.X(66)},7s:u(){if(1E.E.7s.X(66)==N){C N}if(1E.2U){1E.2U.2z()}},5d:u(){if(1E.2U){1E.2U.2F()}1E.E.5d.X(66)}}));1E.1s=2o.J("J");if(1E.3w){1E.3w.1G()}if(1E.E.jC==Q){1E.3w=$("<G Y=\\"1s-3w\\"></G>").4a(1E.1s);1E.3w.1l({U:(1E.E.an?1E.3w.2p().U():gZ().U),V:(1E.E.an?1E.3w.2p().V():gZ().V),3q:"5e"})}if(1E.2U){1E.2U.1G()}if(1E.E.2U==Q){1E.2U=$("<G Y=\\"1s-2U\\"></G>").4a(1E.1s);1E.2U.1l({3q:"5e"})}if(1E.E.Z==1r){k h8=1E.E.U;if(4R(h8)){h8=1E.1s.1N()}if(1E.E.an){k dO=1E.1s.2p();1E.E.Z=(dO.U()-h8)/2+dO.4i()}K{1E.E.Z=($(1s).U()-h8)/2+$(2G).4i()}}if(1E.E.14==1r){k hm=1E.1s.V;if(4R(hm)){hm=1E.1s.2j()}if(1E.E.an){k dO=1E.1s.2p();1E.E.14=(dO.V()-hm)/2+dO.4q()}K{1E.E.14=($(1s).V()-hm)/2+$(2G).4q()}}oo(66);if(1E.E.3b==N){2o.1s("3D")}};u C8(lr){k 2u=$.A(lr,"1s");2u.1s.2i({5n:">G.J-1K>G.J-2f",1z:2u.E.2i==N,fV:u(e){if(2u.3w){2u.3w.1l("z-2K",$.fn.1s.1u.42++)}if(2u.2U){2u.2U.1l("z-2K",$.fn.1s.1u.42++)}2u.1s.1l("z-2K",$.fn.1s.1u.42++);if(!2u.2a){2u.2a=$("<G Y=\\"1s-2a\\"></G>").4a(2u.1s)}2u.2a.1l({3q:"5e",42:$.fn.1s.1u.42++,Z:e.A.Z,14:e.A.14});2u.2a.3B(2u.1s.1N());2u.2a.58(2u.1s.2j());3m(u(){if(2u.2a){2u.2a.2F()}},El)},gn:u(e){2u.2a.1l({3q:"5w",Z:e.A.Z,14:e.A.14});C N},fo:u(e){2u.E.Z=e.A.Z;2u.E.14=e.A.14;$(lr).1s("aR");2u.2a.1G();2u.2a=1r}});2u.1s.2D({1z:2u.E.2D==N,fP:u(e){2u.mn=$("<G Y=\\"1s-2a-3w\\"></G>").4a(2u.1s);2u.mn.1l({42:$.fn.1s.1u.42++,Z:e.A.Z,14:e.A.14,U:2u.1s.1N(),V:2u.1s.2j()});if(!2u.2a){2u.2a=$("<G Y=\\"1s-2a\\"></G>").4a(2u.1s)}2u.2a.1l({42:$.fn.1s.1u.42++,Z:e.A.Z,14:e.A.14});2u.2a.3B(e.A.U);2u.2a.58(e.A.V)},5N:u(e){2u.2a.1l({Z:e.A.Z,14:e.A.14});2u.2a.3B(e.A.U);2u.2a.58(e.A.V);C N},fL:u(e){2u.E.Z=e.A.Z;2u.E.14=e.A.14;2u.E.U=e.A.U;2u.E.V=e.A.V;pb(lr);2u.mn.1G();2u.mn=1r;2u.2a.1G();2u.2a=1r}})};u gZ(){if(2G.Cd=="Nc"){C{U:3v.3h(2G.1q.C5,2G.1q.C4),V:3v.3h(2G.1q.C3,2G.1q.C1)}}K{C{U:3v.3h(2G.fD.C5,2G.fD.C4),V:3v.3h(2G.fD.C3,2G.fD.C1)}}};$(1s).23(u(){$("1q>G.1s-3w").1l({U:$(1s).U(),V:$(1s).V()});3m(u(){$("1q>G.1s-3w").1l({U:gZ().U,V:gZ().V})},50)});$.fn.1s=u(9F,nJ){if(2b 9F=="2r"){k oq=$.fn.1s.1J[9F];if(oq){C oq(B,nJ)}K{C B.J(9F,nJ)}}9F=9F||{};C B.P(u(){k gd=$.A(B,"1s");if(gd){$.1d(gd.E,9F)}K{gd=$.A(B,"1s",{E:$.1d({},$.fn.1s.1u,$.fn.1s.1o(B),9F)});if(!gd.E.an){$(B).1t("1q")}}Ca(B);C8(B)})};$.fn.1s.1J={E:u(jq){k eF=jq.J("E");k C9=$.A(jq[0],"1s").E;C $.1d(C9,{3b:eF.3b,2C:eF.2C,5Z:eF.5Z,5b:eF.5b})},1s:u(jq){C $.A(jq[0],"1s").1s},23:u(jq,yO){C jq.P(u(){pb(B,yO)})},aR:u(jq,Bx){C jq.P(u(){oo(B,Bx)})}};$.fn.1s.1o=u(oE){C $.1d({},$.fn.J.1o(oE),$.1V.1o(oE,[{2i:"1S",2D:"1S",2U:"1S",jC:"1S",an:"1S"}]))};$.fn.1s.1u=$.1d({},$.fn.J.1u,{42:N9,2i:Q,2D:Q,2U:Q,jC:N,an:N,2f:"AG Na",8A:Q,8B:Q,8C:Q,63:Q,3b:N})})(2T);(u($){u B1(AW){k t=$(AW);t.go("<G Y=\\"3d-6y\\"></G>");k m7=t.17("G.3d-6y");m7.1b("2c",t.1b("2c"));t.4K("2c").1l("GY","4T");m7.J({2W:N,6X:N});C m7};u AS(55){k x=$.A(55,"3d").E;k eR=$.A(55,"3d").iH;if(x.3z){if(2b x.3z=="2r"){$(x.3z).1e("3d-3z").3o(55);$(x.3z).2F()}K{$(55).L("G.3d-3z").1G();k m3=$("<G Y=\\"3d-3z\\"></G>").3o(55);1h(k i=0;i<x.3z.O;i++){k p=x.3z[i];if(p=="-"){m3.4D("<G Y=\\"3d-1X-3j\\"></G>")}K{k 1X=$("<a 26=\\"3I:3Z(0)\\"></a>").1t(m3);1X.1l("Fa","Z");1X[0].3O=4U(p.4w||u(){});1X.2P($.1d({},p,{39:Q}))}}m3.4D("<G 2c=\\"43:cI\\"></G>")}}K{$(55).L("G.3d-3z").1G()}if(x.6s){if(2b x.6s=="2r"){$(x.6s).1e("3d-44").1t(55);$(x.6s).2F()}K{$(55).L("G.3d-44").1G();k AT=$("<G Y=\\"3d-44\\"></G>").1t(55);1h(k i=0;i<x.6s.O;i++){k p=x.6s[i];k qR=$("<a 26=\\"3I:3Z(0)\\"></a>").1t(AT);if(p.4w){qR[0].3O=p.4w}qR.2P(p)}}}K{$(55).L("G.3d-44").1G()}k rp=x.26;k pI=x.6y;x.26=1r;x.6y=1r;eR.J({3b:x.3b,9O:x.9O,26:rp,6y:pI,8w:u(){if(x.V=="2q"){$(55).1s("23")}x.8w.4V(55,5r)}});$(55).1s($.1d({},x,{7X:u(){eR.J("3D");if(x.7X){x.7X.X(55)}},5N:u(AY,rz){k eO=$(55).J("J").L(">G.J-1q");eR.J("J").2F();eR.J("23",{U:eO.U(),V:(rz=="2q")?"2q":eO.V()-eO.L(">G.3d-3z").2j()-eO.L(">G.3d-44").2j()});if(x.5N){x.5N.X(55,AY,rz)}}}));x.26=rp;x.6y=pI};u AF(B4,26){k B3=$.A(B4,"3d").iH;B3.J("64",26)};$.fn.3d=u(9x,qr){if(2b 9x=="2r"){k pU=$.fn.3d.1J[9x];if(pU){C pU(B,qr)}K{C B.1s(9x,qr)}}9x=9x||{};C B.P(u(){k qt=$.A(B,"3d");if(qt){$.1d(qt.E,9x)}K{$.A(B,"3d",{E:$.1d({},$.fn.3d.1u,$.fn.3d.1o(B),9x),iH:B1(B)})}AS(B)})};$.fn.3d.1J={E:u(jq){k q7=$.A(jq[0],"3d").E;k dW=jq.J("E");$.1d(q7,{3b:dW.3b,2C:dW.2C,5Z:dW.5Z,5b:dW.5b});k Nb=$.A(jq[0],"3d").iH;C q7},3d:u(jq){C jq.1s("1s")},64:u(jq,26){C jq.P(u(){AF(B,26)})}};$.fn.3d.1o=u(po){C $.1d({},$.fn.1s.1o(po),$.1V.1o(po,["3z","6s"]))};$.fn.3d.1u=$.1d({},$.fn.1s.1u,{2f:"AG Nd",8A:N,8B:N,8C:N,2D:N,3z:1r,6s:1r})})(2T);(u($){u 2F(el,1I,dz,fw){k 2o=$(el).1s("1s");if(!2o){C}j7(1I){51 1r:2o.2F();4A;51"oc":2o.h7(dz);4A;51"B5":2o.Nf(dz);4A;51"2F":2o.2F(dz);4A}k fm=1r;if(fw>0){fm=3m(u(){2z(el,1I,dz)},fw)}2o.2l(u(){if(fm){dE(fm)}},u(){if(fw>0){fm=3m(u(){2z(el,1I,dz)},fw)}})};u 2z(el,1I,fv){if(el.AN==Q){C}el.AN=Q;k 2o=$(el).1s("1s");if(!2o){C}j7(1I){51 1r:2o.2z();4A;51"oc":2o.iP(fv);4A;51"B5":2o.Ne(fv);4A;51"2F":2o.2z(fv);4A}3m(u(){$(el).1s("2L")},fv)};u fj(oa,Bo,kY){k 2o=$("<G Y=\\"2Q-1q\\"></G>").1t("1q");2o.4D(Bo);if(kY){k tb=$("<G Y=\\"2Q-44\\"></G>").1t(2o);1h(k qV in kY){$("<a></a>").1b("26","3I:3Z(0)").1w(qV).1l("wv-Z",10).1m("2e",4U(kY[qV])).1t(tb).2P()}}2o.1s({2f:oa,8g:(oa?N:Q),U:Cr,V:"2q",jC:Q,8A:N,8B:N,8C:N,2D:N,9N:u(){3m(u(){2o.1s("2L")},4Z)}});2o.1s("1s").1e("2Q-1s");2o.17("G.2Q-44").17("a:5H").5o();C 2o};$.2Q={2F:u(Bv){k x=$.1d({nS:"oc",nP:N8,U:N7,V:4Z,4m:"",2f:"",Bs:N0},Bv||{});k 2o=$("<G Y=\\"2Q-1q\\"></G>").1F(x.4m).1t("1q");2o.1s({2f:x.2f,U:x.U,V:x.V,8A:N,8B:N,8C:N,2U:N,2i:N,2D:N,3b:Q,qW:u(){2F(B,x.nS,x.nP,x.Bs);C N},gY:u(){2z(B,x.nS,x.nP);C N}});2o.1s("1s").1l({Z:"",14:"",6h:0,42:$.fn.1s.1u.42++,7R:-2G.1q.4q-2G.fD.4q});2o.1s("3D")},MZ:u(B8,4m,24,fn){k 6W="<G>"+4m+"</G>";j7(24){51"b9":6W="<G Y=\\"2Q-24 2Q-b9\\"></G>"+6W;4A;51"kG":6W="<G Y=\\"2Q-24 2Q-kG\\"></G>"+6W;4A;51"kc":6W="<G Y=\\"2Q-24 2Q-kc\\"></G>"+6W;4A;51"B9":6W="<G Y=\\"2Q-24 2Q-B9\\"></G>"+6W;4A}6W+="<G 2c=\\"43:cI;\\"/>";k k0={};k0[$.2Q.1u.ok]=u(){2o.3d({3b:Q});if(fn){fn();C N}};k0[$.2Q.1u.ok]=u(){2o.1s("4d");if(fn){fn();C N}};k 2o=fj(B8,6W,k0)},N3:u(Bc,4m,fn){k Bd="<G Y=\\"2Q-24 2Q-kc\\"></G>"+"<G>"+4m+"</G>"+"<G 2c=\\"43:cI;\\"/>";k jZ={};jZ[$.2Q.1u.ok]=u(){2o.1s("4d");if(fn){fn(Q);C N}};jZ[$.2Q.1u.r9]=u(){2o.1s("4d");if(fn){fn(N);C N}};k 2o=fj(Bc,Bd,jZ)},7A:u(Bg,4m,fn){k Be="<G Y=\\"2Q-24 2Q-kc\\"></G>"+"<G>"+4m+"</G>"+"<br/>"+"<1L Y=\\"2Q-1L\\" 1I=\\"1w\\"/>"+"<G 2c=\\"43:cI;\\"/>";k jy={};jy[$.2Q.1u.ok]=u(){2o.1s("4d");if(fn){fn($(".2Q-1L",2o).1n());C N}};jy[$.2Q.1u.r9]=u(){2o.1s("4d");if(fn){fn();C N}};k 2o=fj(Bg,Be,jy);2o.17("1L.2Q-1L").5o()},xf:u(ju){k x=$.1d({2f:"",4m:"",1w:1P,r3:Cr},ju||{});k wS={5K:u(){C $("1q>G.2Q-1s").L("G.2Q-p-5K")},4d:u(){k 2o=$("1q>G.2Q-1s>G.2Q-1q");if(2o.O){if(2o[0].dA){N6(2o[0].dA)}2o.1s("4d")}}};if(2b ju=="2r"){k x0=wS[ju];C x0()}k xb="<G Y=\\"2Q-xf\\"><G Y=\\"2Q-p-4m\\"></G><G Y=\\"2Q-p-5K\\"></G></G>";k 2o=fj(x.2f,xb,1r);2o.L("G.2Q-p-4m").1F(x.4m);k 5K=2o.L("G.2Q-p-5K");5K.3J({1w:x.1w});2o.1s({63:N});if(x.r3){2o[0].dA=N5(u(){k v=5K.3J("3A");v+=10;if(v>4Z){v=0}5K.3J("2S",v)},x.r3)}}};$.2Q.1u={ok:"yY",r9:"N4"}})(2T);(u($){u dN(kq){k x=$.A(kq,"2n").E;k dC=$.A(kq,"2n").3g;k cc=$(kq);if(x.2Z==Q){k p=cc.2p();p.1e("J-lz");if(p[0].cf=="hy"){$("1F").1e("J-2Z")}x.U=p.U();x.V=p.V()}if(x.U>0){cc.3B(x.U)}k rw="2q";if(x.V>0){cc.58(x.V);k rA=dC.O?dC[0].J("1K").1l("V","").2j():"2q";k rw=cc.V()-(dC.O-1)*rA}1h(k i=0;i<dC.O;i++){k rJ=dC[i];k xh=rJ.J("1K");xh.58(rA);rJ.J("23",{U:cc.U(),V:rw})}};u eL(x8){k rt=$.A(x8,"2n").3g;1h(k i=0;i<rt.O;i++){k pL=rt[i];if(pL.J("E").2C==N){C pL}}C 1r};u np(x3,xa){k pH=$.A(x3,"2n").3g;1h(k i=0;i<pH.O;i++){if(pH[i][0]==$(xa)[0]){C i}}C-1};u eG(xe,bf,pn){k 9R=$.A(xe,"2n").3g;if(2b bf=="2O"){if(bf<0||bf>=9R.O){C 1r}K{k f8=9R[bf];if(pn){9R.4O(bf,1)}C f8}}1h(k i=0;i<9R.O;i++){k f8=9R[i];if(f8.J("E").2f==bf){if(pn){9R.4O(i,1)}C f8}}C 1r};u yF(qm){k x=$.A(qm,"2n").E;k cc=$(qm);if(x.2W){cc.1x("2n-6D")}K{cc.1e("2n-6D")}};u yG(gc){k cc=$(gc);cc.1e("2n");k qv=[];cc.17("G").P(u(){k x=$.1d({},$.1V.1o(B),{1Q:($(B).1b("1Q")?Q:1P)});k pp=$(B);qv.1i(pp);nK(gc,pp,x)});cc.1m("8q",u(e,xi){k x=$.A(gc,"2n").E;if(x.2Z==Q||xi){dN(gc)}C N});C{2n:cc,3g:qv}};u nK(9W,pp,wV){pp.J($.1d({},wV,{8A:N,8B:N,8C:N,63:N,6X:N,2C:Q,eg:"2n-1K",bX:"2n-1q",8F:u(){k 9c=eL(9W);if(9c){k dw=$(9c).J("1K");dw.1x("2n-1K-1Q");dw.L(".2n-37").7l("2e")}k dw=pp.J("1K");dw.1e("2n-1K-1Q");dw.L(".2n-37").1x("2n-36")},5d:u(){k x=$.A(9W,"2n").E;x.4l.X(9W,pp.J("E").2f,np(9W,B))},7s:u(){k pX=pp.J("1K");pX.1x("2n-1K-1Q");pX.L(".2n-37").1e("2n-36")}}));k ro=pp.J("1K");k t=$("<a Y=\\"2n-37 2n-36\\" 26=\\"3I:3Z(0)\\"></a>").1t(ro.17("G.J-1X"));t.1m("2e",u(e){k pB=$.A(9W,"2n").E.3U;lC(9W);if(pp.J("E").2C){pp.J("36",pB)}K{pp.J("37",pB)}C N});ro.2e(u(){$(B).L(".2n-37").7l("2e");C N})};u gX(rL,ym){k lp=eG(rL,ym);if(!lp){C}k 9c=eL(rL);if(9c&&9c[0]==lp[0]){C}lp.J("1K").7l("2e")};u yE(mk){k mf=$.A(mk,"2n").3g;1h(k i=0;i<mf.O;i++){if(mf[i].J("E").1Q){o0(i);C}}if(mf.O){o0(0)}u o0(yg){k x=$.A(mk,"2n").E;k y9=x.3U;x.3U=N;gX(mk,yg);x.3U=y9}};u lC(y8){k o4=$.A(y8,"2n").3g;1h(k i=0;i<o4.O;i++){o4[i].f5(Q,Q)}};u 4I(7N,dx){k x=$.A(7N,"2n").E;k lL=$.A(7N,"2n").3g;if(dx.1Q==1P){dx.1Q=Q}lC(7N);k pp=$("<G></G>").1t(7N);lL.1i(pp);nK(7N,pp,dx);dN(7N);x.mu.X(7N,dx.2f,lL.O-1);if(dx.1Q){gX(7N,lL.O-1)}};u yv(6o,oA){k x=$.A(6o,"2n").E;k ye=$.A(6o,"2n").3g;lC(6o);k dT=eG(6o,oA);k oH=dT.J("E").2f;k ow=np(6o,dT);if(x.yA.X(6o,oH,ow)==N){C}k dT=eG(6o,oA,Q);if(dT){dT.J("2L");if(ye.O){dN(6o);k 9c=eL(6o);if(!9c){gX(6o,0)}}}x.y5.X(6o,oH,ow)};$.fn.2n=u(ag,ys){if(2b ag=="2r"){C $.fn.2n.1J[ag](B,ys)}ag=ag||{};C B.P(u(){k mU=$.A(B,"2n");k x;if(mU){x=$.1d(mU.E,ag);mU.x=x}K{x=$.1d({},$.fn.2n.1u,$.fn.2n.1o(B),ag);k r=yG(B);$.A(B,"2n",{E:x,2n:r.2n,3g:r.3g})}yF(B);dN(B);yE(B)})};$.fn.2n.1J={E:u(jq){C $.A(jq[0],"2n").E},3g:u(jq){C $.A(jq[0],"2n").3g},23:u(jq){C jq.P(u(){dN(B)})},dg:u(jq){C eL(jq[0])},5p:u(jq,yM){C eG(jq[0],yM)},Ng:u(jq,yK){C np(jq[0],yK)},5C:u(jq,yC){C jq.P(u(){gX(B,yC)})},4I:u(jq,yw){C jq.P(u(){4I(B,yw)})},1G:u(jq,yu){C jq.P(u(){yv(B,yu)})}};$.fn.2n.1o=u(qF){k t=$(qF);C $.1d({},$.1V.1o(qF,["U","V",{2Z:"1S",2W:"1S",3U:"1S"}]))};$.fn.2n.1u={U:"2q",V:"2q",2Z:N,2W:Q,3U:Q,4l:u(Nh,Nu){},mu:u(Nt,Ns){},yA:u(Nv,Nw){},y5:u(Ny,Nx){}}})(2T);(u($){u iK(xz){k kU=$(xz).17("G.1f-1K");k nH=0;$("ul.1f li",kU).P(u(){nH+=$(B).1N(Q)});k xx=kU.17("G.1f-2V").U();k xB=2X(kU.L("ul.1f").1l("dn-Z"));C nH-xx+xB};u ii(oI){k x=$.A(oI,"1f").E;k 9f=$(oI).17("G.1f-1K");k 1X=9f.17("G.1f-1X");k hx=9f.17("G.1f-7v-Z");k bs=9f.17("G.1f-7v-6h");k 2V=9f.17("G.1f-2V");1X.58(9f.2j()-(x.39?2:0));k pk=0;$("ul.1f li",9f).P(u(){pk+=$(B).1N(Q)});k i0=9f.U()-1X.1N();if(pk>i0){hx.2F();bs.2F();1X.1l("6h",bs.1N());2V.1l({w2:hx.1N(),xE:bs.1N()+1X.1N(),Z:0,U:i0-hx.1N()-bs.1N()})}K{hx.2z();bs.2z();1X.1l("6h",0);2V.1l({w2:0,xE:1X.1N(),Z:0,U:i0});2V.4i(0)}};u H7(pg){k x=$.A(pg,"1f").E;k hw=$(pg).17("G.1f-1K");if(x.3i){if(2b x.3i=="2r"){$(x.3i).1e("1f-1X").1t(hw);$(x.3i).2F()}K{hw.17("G.1f-1X").1G();k xw=$("<G Y=\\"1f-1X\\"></G>").1t(hw);1h(k i=0;i<x.3i.O;i++){k 1X=$("<a 26=\\"3I:3Z(0);\\"></a>").1t(xw);1X[0].3O=4U(x.3i[i].4w||u(){});1X.2P($.1d({},x.3i[i],{39:Q}))}}}K{hw.17("G.1f-1X").1G()}};u na(bw){k x=$.A(bw,"1f").E;k cc=$(bw);if(x.2Z==Q){k p=cc.2p();p.1e("J-lz");if(p[0].cf=="hy"){$("1F").1e("J-2Z")}x.U=p.U();x.V=p.V()}cc.U(x.U).V(x.V);k pd=$(bw).17("G.1f-1K");pd.3B(x.U);ii(bw);k hv=$(bw).17("G.1f-3g");k oO=x.V;if(!4R(oO)){hv.58(oO-pd.2j())}K{hv.V("2q")}k p7=x.U;if(!4R(p7)){hv.3B(p7)}K{hv.U("2q")}};u n7(jT){k x=$.A(jT,"1f").E;k 2v=le(jT);if(2v){k p9=$(jT).17("G.1f-3g");k xp=x.U=="2q"?"2q":p9.U();k xq=x.V=="2q"?"2q":p9.V();2v.J("23",{U:xp,V:xq})}};u H8(9b){k 1f=$.A(9b,"1f").1f;k cc=$(9b);cc.1e("1f-p0");cc.go("<G Y=\\"1f-3g\\"/>");$("<G Y=\\"1f-1K\\">"+"<G Y=\\"1f-7v-Z\\"></G>"+"<G Y=\\"1f-7v-6h\\"></G>"+"<G Y=\\"1f-2V\\">"+"<ul Y=\\"1f\\"></ul>"+"</G>"+"</G>").3o(9b);cc.17("G.1f-3g").17("G").P(u(i){k x=$.1d({},$.1V.1o(B),{1Q:($(B).1b("1Q")?Q:1P)});k pp=$(B);1f.1i(pp);qH(9b,pp,x)});cc.17("G.1f-1K").L(".1f-7v-Z, .1f-7v-6h").2l(u(){$(B).1e("1f-7v-8Y")},u(){$(B).1x("1f-7v-8Y")});cc.1m("8q",u(e,xt){k x=$.A(9b,"1f").E;if(x.2Z==Q||xt){na(9b);n7(9b)}C N})};u pv(gW){k x=$.A(gW,"1f").E;k 8i=$(gW).17("G.1f-1K");k oN=$(gW).17("G.1f-3g");if(x.39==Q){8i.1e("1f-1K-39")}K{8i.1x("1f-1K-39")}if(x.2W==Q){8i.1x("1f-1K-6D");oN.1x("1f-3g-6D")}K{8i.1e("1f-1K-6D");oN.1e("1f-3g-6D")}$(".1f-7v-Z",8i).2x(".1f").1m("2e.1f",u(){k 2V=$(".1f-2V",8i);k 2A=2V.4i()-x.r6;2V.3U({4i:2A},x.hp)});$(".1f-7v-6h",8i).2x(".1f").1m("2e.1f",u(){k 2V=$(".1f-2V",8i);k 2A=3v.3k(2V.4i()+x.r6,iK(gW));2V.3U({4i:2A},x.hp)})};u qH(b2,pp,9a){k ob=$.A(b2,"1f");9a=9a||{};pp.J($.1d({},9a,{2W:N,8g:Q,3b:Q,6X:N,1W:(9a.24?9a.24:1P),8w:u(){if(9a.8w){9a.8w.X(B,5r)}ob.E.8w.X(b2,$(B))}}));k x=pp.J("E");k 1f=$(b2).17("G.1f-1K").L("ul.1f");u l8(li){C 1f.L("li").2K(li)};x.2v=$("<li></li>").1t(1f);x.2v.2x(".1f").1m("2e.1f",u(){if($(B).2h("1f-1z")){C}98(b2,l8(B))}).1m("gt.1f",u(e){if($(B).2h("1f-1z")){C}ob.E.do.X(b2,e,$(B).L("1a.1f-2f").1F(),l8(B))});k l3=$("<a 26=\\"3I:3Z(0)\\" Y=\\"1f-3H\\"></a>").1t(x.2v);k ko=$("<1a Y=\\"1f-2f\\"></1a>").1F(x.2f).1t(l3);k y0=$("<1a Y=\\"1f-24\\"></1a>").1t(l3);if(x.63){ko.1e("1f-63");k xX=$("<a 26=\\"3I:3Z(0)\\" Y=\\"1f-4d\\"></a>").1t(x.2v);xX.2x(".1f").1m("2e.1f",u(){if($(B).2p().2h("1f-1z")){C}pR(b2,l8($(B).2p()));C N})}if(x.1W){ko.1e("1f-i8-24");y0.1e(x.1W)}if(x.3i){k gH=$("<1a Y=\\"1f-p-1X\\"></1a>").4a(l3);if(2b x.3i=="2r"){$(x.3i).17().1t(gH)}K{1h(k i=0;i<x.3i.O;i++){k t=$("<a 26=\\"3I:3Z(0)\\"></a>").1t(gH);t.1e(x.3i[i].1W);if(x.3i[i].4w){t.1m("2e",4U(x.3i[i].4w))}}}k pr=gH.17().O*12;if(x.63){pr+=8}K{pr-=3;gH.1l("6h","Nr")}ko.1l("dn-6h",pr+"px")}};u Ha(9s,bQ){k x=$.A(9s,"1f").E;k 1f=$.A(9s,"1f").1f;if(bQ.1Q==1P){bQ.1Q=Q}k pp=$("<G></G>").1t($(9s).17("G.1f-3g"));1f.1i(pp);qH(9s,pp,bQ);x.mu.X(9s,bQ.2f,1f.O-1);ii(9s);if(bQ.1Q){98(9s,1f.O-1)}};u HL(bO,gO){k i9=$.A(bO,"1f").n3;k pp=gO.2v;k rB=pp.J("E").2f;pp.J($.1d({},gO.E,{1W:(gO.E.24?gO.E.24:1P)}));k x=pp.J("E");k 2v=x.2v;2v.L("1a.1f-24").1b("Y","1f-24");2v.L("a.1f-4d").1G();2v.L("1a.1f-2f").1F(x.2f);if(x.63){2v.L("1a.1f-2f").1e("1f-63");$("<a 26=\\"3I:3Z(0)\\" Y=\\"1f-4d\\"></a>").1t(2v)}K{2v.L("1a.1f-2f").1x("1f-63")}if(x.1W){2v.L("1a.1f-2f").1e("1f-i8-24");2v.L("1a.1f-24").1e(x.1W)}K{2v.L("1a.1f-2f").1x("1f-i8-24")}if(rB!=x.2f){1h(k i=0;i<i9.O;i++){if(i9[i]==rB){i9[i]=x.2f}}}pv(bO);$.A(bO,"1f").E.HG.X(bO,x.2f,hg(bO,pp))};u pR(5R,il){k x=$.A(5R,"1f").E;k 1f=$.A(5R,"1f").1f;k hf=$.A(5R,"1f").n3;if(!qB(5R,il)){C}k 2v=bK(5R,il);k ic=2v.J("E").2f;k rO=hg(5R,2v);if(x.gY.X(5R,ic,rO)==N){C}k 2v=bK(5R,il,Q);2v.J("E").2v.1G();2v.J("2L");x.9N.X(5R,ic,rO);ii(5R);1h(k i=0;i<hf.O;i++){if(hf[i]==ic){hf.4O(i,1);i--}}k rk=hf.dF();if(rk){98(5R,rk)}K{if(1f.O){98(5R,0)}}};u bK(Hm,b5,qn){k 1f=$.A(Hm,"1f").1f;if(2b b5=="2O"){if(b5<0||b5>=1f.O){C 1r}K{k 2v=1f[b5];if(qn){1f.4O(b5,1)}C 2v}}1h(k i=0;i<1f.O;i++){k 2v=1f[i];if(2v.J("E").2f==b5){if(qn){1f.4O(i,1)}C 2v}}C 1r};u hg(Hk,2v){k 1f=$.A(Hk,"1f").1f;1h(k i=0;i<1f.O;i++){if(1f[i][0]==$(2v)[0]){C i}}C-1};u le(Hi){k 1f=$.A(Hi,"1f").1f;1h(k i=0;i<1f.O;i++){k 2v=1f[i];if(2v.J("E").3b==N){C 2v}}C 1r};u H4(iQ){k 1f=$.A(iQ,"1f").1f;1h(k i=0;i<1f.O;i++){if(1f[i].J("E").1Q){98(iQ,i);C}}if(1f.O){98(iQ,0)}};u 98(6w,Hn){k x=$.A(6w,"1f").E;k 1f=$.A(6w,"1f").1f;k Ho=$.A(6w,"1f").n3;if(1f.O==0){C}k bJ=bK(6w,Hn);if(!bJ){C}k iN=le(6w);if(iN){iN.J("4d");iN.J("E").2v.1x("1f-1Q")}bJ.J("3D");k q9=bJ.J("E").2f;Ho.1i(q9);k 2v=bJ.J("E").2v;2v.1e("1f-1Q");k 2V=$(6w).L(">G.1f-1K G.1f-2V");k q8=2v.4L().Z+2V.4i();k Z=q8-2V.4i();k Ht=Z+2v.1N();if(Z<0||Ht>2V.Nq()){k 2A=3v.3k(q8-(2V.U()-2v.U())/2,iK(6w));2V.3U({4i:2A},x.hp)}K{k 2A=3v.3k(2V.4i(),iK(6w));2V.3U({4i:2A},x.hp)}n7(6w);x.4l.X(6w,q9,hg(6w,bJ))};u qB(Hp,Hq){C bK(Hp,Hq)!=1r};$.fn.1f=u(bc,Hh){if(2b bc=="2r"){C $.fn.1f.1J[bc](B,Hh)}bc=bc||{};C B.P(u(){k n6=$.A(B,"1f");k x;if(n6){x=$.1d(n6.E,bc);n6.E=x}K{$.A(B,"1f",{E:$.1d({},$.fn.1f.1u,$.fn.1f.1o(B),bc),1f:[],n3:[]});H8(B)}H7(B);pv(B);na(B);H4(B)})};$.fn.1f.1J={E:u(jq){C $.A(jq[0],"1f").E},1f:u(jq){C $.A(jq[0],"1f").1f},23:u(jq){C jq.P(u(){na(B);n7(B)})},4I:u(jq,Hf){C jq.P(u(){Ha(B,Hf)})},4d:u(jq,Hd){C jq.P(u(){pR(B,Hd)})},qA:u(jq,Hc){C bK(jq[0],Hc)},Nk:u(jq,2v){C hg(jq[0],2v)},dg:u(jq){C le(jq[0])},5C:u(jq,Hv){C jq.P(u(){98(B,Hv)})},Nj:u(jq,HM){C qB(jq[0],HM)},HK:u(jq,HP){C jq.P(u(){HL(B,HP)})},Ni:u(jq,HV){C jq.P(u(){$(B).1f("qA",HV).J("E").2v.1x("1f-1z")})},Nl:u(jq,HT){C jq.P(u(){$(B).1f("qA",HT).J("E").2v.1e("1f-1z")})}};$.fn.1f.1o=u(HS){C $.1d({},$.1V.1o(HS,["U","V","3i",{2Z:"1S",2W:"1S",39:"1S"}]))};$.fn.1f.1u={U:"2q",V:"2q",39:N,2Z:N,2W:Q,3i:1r,r6:4Z,hp:Nm,8w:u(Np){},4l:u(No,Nn){},gY:u(MY,MX){},9N:u(Mz,My){},mu:u(Mx,MA){},HG:u(MB,MD){},do:u(e,MC,Mw){}}})(2T);(u($){k mR=N;u 9k(ly){k x=$.A(ly,"2m").E;k 5F=$.A(ly,"2m").3g;k cc=$(ly);if(x.2Z==Q){k p=cc.2p();p.1e("J-lz");if(p[0].cf=="hy"){$("1F").1e("J-2Z")}cc.U(p.U());cc.V(p.V())}k 6u={14:0,Z:0,U:cc.U(),V:cc.V()};u og(pp){if(pp.O==0){C}pp.J("23",{U:cc.U(),V:pp.J("E").V,Z:0,14:0});6u.14+=pp.J("E").V;6u.V-=pp.J("E").V};if(4k(5F.bt)){og(5F.bt)}K{og(5F.3P)}u oh(pp){if(pp.O==0){C}pp.J("23",{U:cc.U(),V:pp.J("E").V,Z:0,14:cc.V()-pp.J("E").V});6u.V-=pp.J("E").V};if(4k(5F.cU)){oh(5F.cU)}K{oh(5F.3W)}u ov(pp){if(pp.O==0){C}pp.J("23",{U:pp.J("E").U,V:6u.V,Z:cc.U()-pp.J("E").U,14:6u.14});6u.U-=pp.J("E").U};if(4k(5F.9q)){ov(5F.9q)}K{ov(5F.3T)}u oD(pp){if(pp.O==0){C}pp.J("23",{U:pp.J("E").U,V:6u.V,Z:0,14:6u.14});6u.Z+=pp.J("E").U;6u.U-=pp.J("E").U};if(4k(5F.9n)){oD(5F.9n)}K{oD(5F.41)}5F.72.J("23",6u)};u 33(hr){k cc=$(hr);if(cc[0].cf=="hy"){$("1F").1e("J-2Z")}cc.1e("2m");u pf(cc){cc.17("G").P(u(){k x=$.1V.1o(B,["9i"]);k r=x.9i;if(r=="3P"||r=="3W"||r=="3T"||r=="41"||r=="72"){p5(hr,{9i:r},B)}})};cc.17("2M").O?pf(cc.17("2M")):pf(cc);$("<G Y=\\"2m-47-2a-h\\"></G>").1t(cc);$("<G Y=\\"2m-47-2a-v\\"></G>").1t(cc);cc.1m("8q",u(e,Gz){k x=$.A(hr,"2m").E;if(x.2Z==Q||Gz){9k(hr)}C N})};u p5(5T,hu,el){hu.9i=hu.9i||"72";k nQ=$.A(5T,"2m").3g;k cc=$(5T);k 2y=hu.9i;if(nQ[2y].O){C}k pp=$(el);if(!pp.O){pp=$("<G></G>").1t(cc)}pp.J($.1d({},{U:(pp.O?2X(pp[0].2c.U)||pp.1N():"2q"),V:(pp.O?2X(pp[0].2c.V)||pp.2j():"2q"),47:(pp.1b("47")?pp.1b("47")=="Q":1P),6X:N,4M:("2m-J 2m-J-"+2y),bX:"2m-1q",7X:u(){k oQ={3P:"up",3W:"4z",3T:"6h",41:"Z"};if(!oQ[2y]){C}k oW="2m-44-"+oQ[2y];k 1X=$(B).J("1K").17("G.J-1X");if(!1X.17("a."+oW).O){k t=$("<a 26=\\"3I:3Z(0)\\"></a>").1e(oW).1t(1X);t.1m("2e",{2y:2y},u(e){6i(5T,e.A.2y);C N})}}},hu));nQ[2y]=pp;if(pp.J("E").47){k 4s=pp.J("J");4s.1e("2m-47-"+2y);k bY="";if(2y=="3P"){bY="s"}if(2y=="3W"){bY="n"}if(2y=="3T"){bY="w"}if(2y=="41"){bY="e"}4s.2D({fT:bY,fP:u(e){mR=Q;if(2y=="3P"||2y=="3W"){k 7F=$(">G.2m-47-2a-v",5T)}K{k 7F=$(">G.2m-47-2a-h",5T)}k 14=0,Z=0,Mv=0,Mp=0;k 2A={3q:"5w"};if(2y=="3P"){2A.14=2X(4s.1l("14"))+4s.2j()-7F.V();2A.Z=2X(4s.1l("Z"));2A.U=4s.1N();2A.V=7F.V()}K{if(2y=="3W"){2A.14=2X(4s.1l("14"));2A.Z=2X(4s.1l("Z"));2A.U=4s.1N();2A.V=7F.V()}K{if(2y=="3T"){2A.14=2X(4s.1l("14"))||0;2A.Z=2X(4s.1l("Z"))||0;2A.U=7F.U();2A.V=4s.2j()}K{if(2y=="41"){2A.14=2X(4s.1l("14"))||0;2A.Z=4s.1N()-7F.U();2A.U=7F.U();2A.V=4s.2j()}}}}7F.1l(2A);$("<G Y=\\"2m-3w\\"></G>").1l({Z:0,14:0,U:cc.U(),V:cc.V()}).1t(cc)},5N:u(e){if(2y=="3P"||2y=="3W"){k bZ=$(">G.2m-47-2a-v",5T);bZ.1l("14",e.4h-$(5T).3K().14-bZ.V()/2)}K{k bZ=$(">G.2m-47-2a-h",5T);bZ.1l("Z",e.3V-$(5T).3K().Z-bZ.U()/2)}C N},fL:u(){$(">G.2m-47-2a-v",5T).1l("3q","5e");$(">G.2m-47-2a-h",5T).1l("3q","5e");k x=pp.J("E");x.U=4s.1N();x.V=4s.2j();x.Z=4s.1l("Z");x.14=4s.1l("14");pp.J("23");9k(5T);mR=N;cc.L(">G.2m-3w").1G()}})}};u GI(Gd,bR){k aE=$.A(Gd,"2m").3g;if(aE[bR].O){aE[bR].J("2L");aE[bR]=$();k nl="36"+bR.7g(0,1).p4()+bR.7g(1);if(aE[nl]){aE[nl].J("2L");aE[nl]=1P}}};u 6i(eK,7x,nh){if(nh==1P){nh="75"}k 2I=$.A(eK,"2m").3g;k p=2I[7x];if(p.J("E").7s.X(p)==N){C}k c1="36"+7x.7g(0,1).p4()+7x.7g(1);if(!2I[c1]){2I[c1]=Gf(7x);2I[c1].J("J").2e(u(){k o2=oV();p.J("36",N).J("3D").J("23",o2.37);p.J("J").3U(o2.36);C N})}k mX=oV();if(!4k(2I[c1])){2I.72.J("23",mX.eJ)}p.J("J").3U(mX.37,nh,u(){p.J("37",N).J("4d");2I[c1].J("3D").J("23",mX.eD)});u Gf(2y){k 24;if(2y=="3T"){24="2m-44-Z"}K{if(2y=="41"){24="2m-44-6h"}K{if(2y=="3P"){24="2m-44-4z"}K{if(2y=="3W"){24="2m-44-up"}}}}k p=$("<G></G>").1t(eK).J({4M:"2m-36",2f:"&aL;",3b:Q,6X:N,3i:[{1W:24,4w:u(){p8(eK,7x);C N}}]});p.J("J").2l(u(){$(B).1e("2m-36-8Y")},u(){$(B).1x("2m-36-8Y")});C p};u oV(){k cc=$(eK);if(7x=="3T"){C{eJ:{U:2I.72.J("E").U+2I["3T"].J("E").U-28},36:{Z:cc.U()-2I["3T"].J("E").U},eD:{14:2I["3T"].J("E").14,Z:cc.U()-28,U:28,V:2I["72"].J("E").V},37:{Z:cc.U()}}}K{if(7x=="41"){C{eJ:{U:2I.72.J("E").U+2I["41"].J("E").U-28,Z:28},36:{Z:0},eD:{Z:0,14:2I["41"].J("E").14,U:28,V:2I["72"].J("E").V},37:{Z:-2I["41"].J("E").U}}}K{if(7x=="3P"){k hh=cc.V()-28;if(4k(2I.cU)){hh-=2I.cU.J("E").V}K{if(4k(2I.3W)){hh-=2I.3W.J("E").V}}2I.3T.J("23",{14:28,V:hh});2I.41.J("23",{14:28,V:hh});if(4k(2I.9q)){2I.9q.J("23",{14:28,V:hh})}if(4k(2I.9n)){2I.9n.J("23",{14:28,V:hh})}C{eJ:{14:28,V:hh},36:{14:0},eD:{14:0,Z:0,U:cc.U(),V:28},37:{14:-2I["3P"].J("E").V}}}K{if(7x=="3W"){k hh=cc.V()-28;if(4k(2I.bt)){hh-=2I.bt.J("E").V}K{if(4k(2I.3P)){hh-=2I.3P.J("E").V}}2I.3T.J("23",{V:hh});2I.41.J("23",{V:hh});if(4k(2I.9q)){2I.9q.J("23",{V:hh})}if(4k(2I.9n)){2I.9n.J("23",{V:hh})}C{eJ:{V:hh},36:{14:cc.V()-2I["3W"].J("E").V},eD:{14:cc.V()-28,Z:0,U:cc.U(),V:28},37:{14:cc.V()}}}}}}}};u p8(mP,9p){k 6B=$.A(mP,"2m").3g;k oK=GA();k p=6B[9p];if(p.J("E").8F.X(p)==N){C}k Gi="36"+9p.7g(0,1).p4()+9p.7g(1);6B[Gi].J("4d");p.J("J").f5(Q,Q);p.J("36",N).J("3D").J("23",oK.37);p.J("J").3U(oK.36,u(){9k(mP)});u GA(){k cc=$(mP);if(9p=="3T"&&6B.9q){C{37:{Z:cc.U()},36:{Z:cc.U()-6B["3T"].J("E").U}}}K{if(9p=="41"&&6B.9n){C{37:{Z:-6B["41"].J("E").U},36:{Z:0}}}K{if(9p=="3P"&&6B.bt){C{37:{14:-6B["3P"].J("E").V},36:{14:0}}}K{if(9p=="3W"&&6B.cU){C{37:{14:cc.V()},36:{14:cc.V()-6B["3W"].J("E").V}}}}}}}};u GO(ao){k 4N=$.A(ao,"2m").3g;k cc=$(ao);if(4N.3T.O){4N.3T.J("J").1m("a8","3T",bB)}if(4N.41.O){4N.41.J("J").1m("a8","41",bB)}if(4N.3P.O){4N.3P.J("J").1m("a8","3P",bB)}if(4N.3W.O){4N.3W.J("J").1m("a8","3W",bB)}4N.72.J("J").1m("a8","72",bB);u bB(e){if(mR==Q){C}if(e.A!="3T"&&4k(4N.3T)&&4k(4N.9q)){6i(ao,"3T")}if(e.A!="41"&&4k(4N.41)&&4k(4N.9n)){6i(ao,"41")}if(e.A!="3P"&&4k(4N.3P)&&4k(4N.bt)){6i(ao,"3P")}if(e.A!="3W"&&4k(4N.3W)&&4k(4N.cU)){6i(ao,"3W")}C N}};u 4k(pp){if(!pp){C N}if(pp.O){C pp.J("J").is(":5W")}K{C N}};u GG(cT){k 7P=$.A(cT,"2m").3g;if(7P.3T.O&&7P.3T.J("E").2C){6i(cT,"3T",0)}if(7P.41.O&&7P.41.J("E").2C){6i(cT,"41",0)}if(7P.3P.O&&7P.3P.J("E").2C){6i(cT,"3P",0)}if(7P.3W.O&&7P.3W.J("E").2C){6i(cT,"3W",0)}};$.fn.2m=u(aq,GX){if(2b aq=="2r"){C $.fn.2m.1J[aq](B,GX)}aq=aq||{};C B.P(u(){k oG=$.A(B,"2m");if(oG){$.1d(oG.E,aq)}K{k x=$.1d({},$.fn.2m.1u,$.fn.2m.1o(B),aq);$.A(B,"2m",{E:x,3g:{72:$(),3P:$(),3W:$(),3T:$(),41:$()}});33(B);GO(B)}9k(B);GG(B)})};$.fn.2m.1J={23:u(jq){C jq.P(u(){9k(B)})},J:u(jq,GE){C $.A(jq[0],"2m").3g[GE]},37:u(jq,HX){C jq.P(u(){6i(B,HX)})},36:u(jq,GD){C jq.P(u(){p8(B,GD)})},4I:u(jq,lv){C jq.P(u(){p5(B,lv);9k(B);if($(B).2m("J",lv.9i).J("E").2C){6i(B,lv.9i,0)}})},1G:u(jq,GN){C jq.P(u(){GI(B,GN);9k(B)})}};$.fn.2m.1o=u(GM){C $.1d({},$.1V.1o(GM,[{2Z:"1S"}]))};$.fn.2m.1u={2Z:N}})(2T);(u($){u 33(8G){$(8G).1t("1q");$(8G).1e("11-14");k mo=[];nE($(8G));k 5g=1r;1h(k i=0;i<mo.O;i++){k 11=mo[i];GJ(11);11.17("G.11-1j").P(u(){qU(8G,$(B))});11.1m("6t",u(){if(5g){dE(5g);5g=1r}}).1m("5h",u(){5g=3m(u(){es(8G)},4Z)})}u nE(11){mo.1i(11);11.L(">G").P(u(){k 1j=$(B);k eN=1j.L(">G");if(eN.O){eN.4a(8G);1j[0].5i=eN;nE(eN)}})};u GJ(11){11.1e("11").L(">G").P(u(){k 1j=$(B);if(1j.2h("11-Mn")){1j.1F("&aL;")}K{k cL=$.1d({},$.1V.1o(B,["1C","1W","26"]),{1z:(1j.1b("1z")?Q:1P)});1j.1b("1C",cL.1C||"").1b("26",cL.26||"");k 1w=1j.1e("11-1j").1F();1j.4u().4D($("<G Y=\\"11-1w\\"></G>").1F(1w));if(cL.1W){$("<G Y=\\"11-24\\"></G>").1e(cL.1W).1t(1j)}if(cL.1z){e1(8G,1j[0],Q)}if(1j[0].5i){$("<G Y=\\"11-Mq\\"></G>").1t(1j)}1j.58(22)}});11.2z()}};u qU(f1,1j){1j.2x(".11");1j.1m("5q.11",u(){C N}).1m("2e.11",u(){if($(B).2h("11-1j-1z")){C}if(!B.5i){es(f1);k 26=$(B).1b("26");if(26){Mt.26=26}}k 1j=$(f1).11("mF",B);$.A(f1,"11").E.b6.X(f1,1j)}).1m("6t.11",u(e){1j.nX().P(u(){if(B.5i){f3(B.5i)}$(B).1x("11-4p")});1j.1e("11-4p");if($(B).2h("11-1j-1z")){1j.1e("11-4p-1z");C}k ai=1j[0].5i;if(ai){k Z=1j.3K().Z+1j.1N()-2;if(Z+ai.1N()+5>$(1s).U()+$(2G).4i()){Z=1j.3K().Z-ai.1N()+2}k 14=1j.3K().14-3;if(14+ai.2j()>$(1s).V()+$(2G).4q()){14=$(1s).V()+$(2G).4q()-ai.2j()-5}rP(ai,{Z:Z,14:14})}}).1m("5h.11",u(e){1j.1x("11-4p 11-4p-1z");k lY=1j[0].5i;if(lY){if(e.3V>=2X(lY.1l("Z"))){1j.1e("11-4p")}K{f3(lY)}}K{1j.1x("11-4p")}})};u es(mc){k x=$.A(mc,"11").E;f3($(mc));$(2G).2x(".11");x.lP.X(mc);C N};u IV(8o,2A){k x=$.A(8o,"11").E;if(2A){x.Z=2A.Z;x.14=2A.14;if(x.Z+$(8o).1N()>$(1s).U()+$(2G).4i()){x.Z=$(1s).U()+$(2G).4i()-$(8o).1N()-5}if(x.14+$(8o).2j()>$(1s).V()+$(2G).4q()){x.14-=$(8o).2j()}}rP($(8o),{Z:x.Z,14:x.14},u(){$(2G).2x(".11").1m("5q.11",u(){es(8o);$(2G).2x(".11");C N});x.lk.X(8o)})};u rP(11,2A,qY){if(!11){C}if(2A){11.1l(2A)}11.2F(0,u(){if(!11[0].2U){11[0].2U=$("<G Y=\\"11-2U\\"></G>").4a(11)}11[0].2U.1l({3q:"5w",42:$.fn.11.1u.42++,Z:11.1l("Z"),14:11.1l("14"),U:11.1N(),V:11.2j()});11.1l("z-2K",$.fn.11.1u.42++);if(qY){qY()}})};u f3(11){if(!11){C}IX(11);11.L("G.11-1j").P(u(){if(B.5i){f3(B.5i)}$(B).1x("11-4p")});u IX(m){m.f5(Q,Q);if(m[0].2U){m[0].2U.2z()}m.2z()}};u J4(r0,1w){k mi=1r;k 8E=$("<G></G>");u L(11){11.17("G.11-1j").P(u(){k 1j=$(r0).11("mF",B);k s=8E.4u().1F(1j.1w).1w();if(1w==$.82(s)){mi=1j}K{if(B.5i&&!mi){L(B.5i)}}})};L($(r0));8E.1G();C mi};u e1(MS,7o,Jj){k t=$(7o);if(Jj){t.1e("11-1j-1z");if(7o.3O){7o.mg=7o.3O;7o.3O=1r}}K{t.1x("11-1j-1z");if(7o.mg){7o.3O=7o.mg;7o.mg=1r}}};u J2(m1,4C){k 11=$(m1);if(4C.2p){11=4C.2p.5i}k 1j=$("<G Y=\\"11-1j\\"></G>").1t(11);$("<G Y=\\"11-1w\\"></G>").1F(4C.1w).1t(1j);if(4C.1W){$("<G Y=\\"11-24\\"></G>").1e(4C.1W).1t(1j)}if(4C.id){1j.1b("id",4C.id)}if(4C.26){1j.1b("26",4C.26)}if(4C.1C){1j.1b("1C",4C.1C)}if(4C.3O){if(2b 4C.3O=="2r"){1j.1b("3O",4C.3O)}K{1j[0].3O=4U(4C.3O)}}if(4C.4w){1j[0].3O=4U(4C.4w)}qU(m1,1j);if(4C.1z){e1(m1,1j[0],Q)}};u qK(MR,Jf){u r8(el){if(el.5i){el.5i.17("G.11-1j").P(u(){r8(B)});k r4=el.5i[0].2U;if(r4){r4.1G()}el.5i.1G()}$(el).1G()};r8(Jf)};u J0(cQ){$(cQ).17("G.11-1j").P(u(){qK(cQ,B)});if(cQ.2U){cQ.2U.1G()}$(cQ).1G()};$.fn.11=u(aD,IZ){if(2b aD=="2r"){C $.fn.11.1J[aD](B,IZ)}aD=aD||{};C B.P(u(){k cP=$.A(B,"11");if(cP){$.1d(cP.E,aD)}K{cP=$.A(B,"11",{E:$.1d({},$.fn.11.1u,$.fn.11.1o(B),aD)});33(B)}$(B).1l({Z:cP.E.Z,14:cP.E.14})})};$.fn.11.1J={2F:u(jq,2A){C jq.P(u(){IV(B,2A)})},2z:u(jq){C jq.P(u(){es(B)})},2L:u(jq){C jq.P(u(){J0(B)})},7q:u(jq,qG){C jq.P(u(){$(qG.1v).17("G.11-1w").1F(qG.1w)})},MT:u(jq,eP){C jq.P(u(){k 1j=$(B).11("mF",eP.1v);if(1j.1W){$(1j.1v).17("G.11-24").1x(1j.1W).1e(eP.1W)}K{$("<G Y=\\"11-24\\"></G>").1e(eP.1W).1t(eP.1v)}})},mF:u(jq,mE){k t=$(mE);k 1j={1v:mE,id:t.1b("id"),1w:$.82(t.17("G.11-1w").1F()),1z:t.2h("11-1j-1z"),26:t.1b("26"),1C:t.1b("1C"),3O:mE.3O};k 24=t.17("G.11-24");if(24.O){k cc=[];k aa=24.1b("Y").47(" ");1h(k i=0;i<aa.O;i++){if(aa[i]!="11-24"){cc.1i(aa[i])}}1j.1W=cc.3R(" ")}C 1j},MU:u(jq,1w){C J4(jq[0],1w)},MW:u(jq,Jk){C jq.P(u(){J2(B,Jk)})},MV:u(jq,Jy){C jq.P(u(){qK(B,Jy)})},MP:u(jq,JG){C jq.P(u(){e1(B,JG,N)})},MO:u(jq,JC){C jq.P(u(){e1(B,JC,Q)})}};$.fn.11.1o=u(JA){C $.1d({},$.1V.1o(JA,["Z","14"]))};$.fn.11.1u={42:MI,Z:0,14:0,lk:u(){},lP:u(){},b6:u(1j){}}})(2T);(u($){u 33(lw){k x=$.A(lw,"4n").E;k 1D=$(lw);1D.1x("m-1D-4p m-1D-39-4p").1e("m-1D");1D.2P($.1d({},x,{1w:x.1w+"<1a Y=\\"m-1D-rg\\">&aL;</1a>"}));if(x.11){$(x.11).11({lk:u(){1D.1e((x.39==Q)?"m-1D-39-4p":"m-1D-4p")},lP:u(){1D.1x((x.39==Q)?"m-1D-39-4p":"m-1D-4p")}})}lf(lw,x.1z)};u lf(ry,rG){k x=$.A(ry,"4n").E;x.1z=rG;k 1D=$(ry);if(rG){1D.2P("6l");1D.2x(".4n")}K{1D.2P("6H");1D.2x(".4n");1D.1m("2e.4n",u(){rM();C N});k lm=1r;1D.1m("6t.4n",u(){lm=3m(u(){rM()},x.dl);C N}).1m("5h.4n",u(){if(lm){dE(lm)}})}u rM(){if(!x.11){C}k Z=1D.3K().Z;if(Z+$(x.11).1N()+5>$(1s).U()){Z=$(1s).U()-$(x.11).1N()-5}$("1q>G.11-14").11("2z");$(x.11).11("2F",{Z:Z,14:1D.3K().14+1D.2j()});1D.6Z()}};$.fn.4n=u(aw,Jw){if(2b aw=="2r"){C $.fn.4n.1J[aw](B,Jw)}aw=aw||{};C B.P(u(){k rI=$.A(B,"4n");if(rI){$.1d(rI.E,aw)}K{$.A(B,"4n",{E:$.1d({},$.fn.4n.1u,$.fn.4n.1o(B),aw)});$(B).4K("1z")}33(B)})};$.fn.4n.1J={E:u(jq){C $.A(jq[0],"4n").E},6H:u(jq){C jq.P(u(){lf(B,N)})},6l:u(jq){C jq.P(u(){lf(B,Q)})},2L:u(jq){C jq.P(u(){k x=$(B).4n("E");if(x.11){$(x.11).11("2L")}$(B).1G()})}};$.fn.4n.1o=u(lg){k t=$(lg);C $.1d({},$.fn.2P.1o(lg),$.1V.1o(lg,["11",{39:"1S",dl:"2O"}]))};$.fn.4n.1u=$.1d({},$.fn.2P.1u,{39:Q,11:1r,dl:4Z})})(2T);(u($){u 33(lM){k x=$.A(lM,"4v").E;k 1D=$(lM);1D.1x("s-1D-4p s-1D-39-4p").1e("s-1D");1D.2P($.1d({},x,{1w:x.1w+"<1a Y=\\"s-1D-rg\\">&aL;</1a>"}));if(x.11){$(x.11).11({lk:u(){1D.1e((x.39==Q)?"s-1D-39-4p":"s-1D-4p")},lP:u(){1D.1x((x.39==Q)?"s-1D-39-4p":"s-1D-4p")}})}lD(lM,x.1z)};u lD(re,rn){k x=$.A(re,"4v").E;x.1z=rn;k 1D=$(re);k e7=1D.L(".s-1D-rg");if(rn){1D.2P("6l");e7.2x(".4v")}K{1D.2P("6H");e7.2x(".4v");e7.1m("2e.4v",u(){rv();C N});k lT=1r;e7.1m("6t.4v",u(){lT=3m(u(){rv()},x.dl);C N}).1m("5h.4v",u(){if(lT){dE(lT)}})}u rv(){if(!x.11){C}k Z=1D.3K().Z;if(Z+$(x.11).1N()+5>$(1s).U()){Z=$(1s).U()-$(x.11).1N()-5}$("1q>G.11-14").11("2z");$(x.11).11("2F",{Z:Z,14:1D.3K().14+1D.2j()});1D.6Z()}};$.fn.4v=u(ax,Ih){if(2b ax=="2r"){C $.fn.4v.1J[ax](B,Ih)}ax=ax||{};C B.P(u(){k rs=$.A(B,"4v");if(rs){$.1d(rs.E,ax)}K{$.A(B,"4v",{E:$.1d({},$.fn.4v.1u,$.fn.4v.1o(B),ax)});$(B).4K("1z")}33(B)})};$.fn.4v.1J={E:u(jq){C $.A(jq[0],"4v").E},6H:u(jq){C jq.P(u(){lD(B,N)})},6l:u(jq){C jq.P(u(){lD(B,Q)})},2L:u(jq){C jq.P(u(){k x=$(B).4v("E");if(x.11){$(x.11).11("2L")}$(B).1G()})}};$.fn.4v.1o=u(lB){k t=$(lB);C $.1d({},$.fn.2P.1o(lB),$.1V.1o(lB,["11",{39:"1S",dl:"2O"}]))};$.fn.4v.1u=$.1d({},$.fn.2P.1u,{39:Q,11:1r,dl:4Z})})(2T);(u($){u 33(dV){$(dV).2z();k 1a=$("<1a Y=\\"1M\\"></1a>").4a(dV);k Ik=$("<1L 1I=\\"1w\\" Y=\\"1M-1w\\">").1t(1a);$("<1a><1a Y=\\"1M-44\\"></1a></1a>").1t(1a);k 1C=$(dV).1b("1C");if(1C){Ik.1b("1C",1C);$(dV).4K("1C").1b("MH",1C)}C 1a};u mK(lG,pF){k x=$.A(lG,"1M").E;k sb=$.A(lG,"1M").1M;if(pF){x.U=pF}sb.1t("1q");if(4R(x.U)){x.U=sb.1N()}sb.3B(x.U);sb.L("1L.1M-1w").3B(sb.U()-sb.L("a.1M-11").1N()-sb.L("1a.1M-44").1N());sb.4a(lG)};u I7(pV){k 70=$.A(pV,"1M");k x=70.E;if(x.11){70.11=$(x.11).11({b6:u(1j){Ic(1j)}});k 1j=70.11.17("G.11-1j:5H");70.11.17("G.11-1j").P(u(){k Im=$.1d({},$.1V.1o(B),{1Q:($(B).1b("1Q")?Q:1P)});if(Im.1Q){1j=$(B);C N}});1j.7l("2e")}K{70.1M.L("a.1M-11").1G();70.11=1r}u Ic(1j){70.1M.L("a.1M-11").1G();k mb=$("<a Y=\\"1M-11\\" 26=\\"3I:3Z(0)\\"></a>").1F(1j.1w);mb.3o(70.1M).4n({11:70.11,1W:1j.1W});70.1M.L("1L.1M-1w").1b("1C",$(1j.1v).1b("1C")||1j.1w);mK(pV)}};u Ir(nv){k nj=$.A(nv,"1M");k x=nj.E;k de=nj.1M.L("1L.1M-1w");k HY=nj.1M.L(".1M-44");de.2x(".1M").1m("6Z.1M",u(e){x.1A=$(B).1n();if(x.1A==""){$(B).1n(x.7A);$(B).1e("1M-7A")}K{$(B).1x("1M-7A")}}).1m("5o.1M",u(e){if($(B).1n()!=x.1A){$(B).1n(x.1A)}$(B).1x("1M-7A")}).1m("jg.1M",u(e){if(e.dv==13){e.wZ();k 1C=$.fn.4S?de.4S("1C"):de.1b("1C");x.1A=$(B).1n();x.d4.X(nv,x.1A,1C);C N}});HY.2x(".1M").1m("2e.1M",u(){k 1C=$.fn.4S?de.4S("1C"):de.1b("1C");x.d4.X(nv,x.1A,1C)}).1m("6t.1M",u(){$(B).1e("1M-44-2l")}).1m("5h.1M",u(){$(B).1x("1M-44-2l")})};u Iq(I4){k pP=$.A(I4,"1M");k x=pP.E;k em=pP.1M.L("1L.1M-1w");if(x.1A==""){em.1n(x.7A);em.1e("1M-7A")}K{em.1n(x.1A);em.1x("1M-7A")}};$.fn.1M=u(a1,I9){if(2b a1=="2r"){C $.fn.1M.1J[a1](B,I9)}a1=a1||{};C B.P(u(){k nk=$.A(B,"1M");if(nk){$.1d(nk.E,a1)}K{nk=$.A(B,"1M",{E:$.1d({},$.fn.1M.1u,$.fn.1M.1o(B),a1),1M:33(B)})}I7(B);Iq(B);Ir(B);mK(B)})};$.fn.1M.1J={E:u(jq){C $.A(jq[0],"1M").E},11:u(jq){C $.A(jq[0],"1M").11},eC:u(jq){C $.A(jq[0],"1M").1M.L("1L.1M-1w")},3A:u(jq){C $.A(jq[0],"1M").E.1A},2S:u(jq,pi){C jq.P(u(){$(B).1M("E").1A=pi;$(B).1M("eC").1n(pi);$(B).1M("eC").6Z()})},MG:u(jq){C $.A(jq[0],"1M").1M.L("1L.1M-1w").1b("1C")},MJ:u(jq,1C){C jq.P(u(){k 11=$.A(B,"1M").11;if(11){11.17("G.11-1j[1C=\\""+1C+"\\"]").7l("2e")}})},2L:u(jq){C jq.P(u(){k 11=$(B).1M("11");if(11){11.11("2L")}$.A(B,"1M").1M.1G();$(B).1G()})},23:u(jq,II){C jq.P(u(){mK(B,II)})}};$.fn.1M.1o=u(pt){k t=$(pt);C $.1d({},$.1V.1o(pt,["U","7A","11"]),{1A:t.1n(),d4:(t.1b("d4")?4U(t.1b("d4")):1P)})};$.fn.1M.1u={U:"2q",7A:"",1A:"",11:1r,d4:u(NA,1C){}}})(2T);(u($){u 33(IS){$(IS).1e("1T-1w")};u IA(n1){k qi=$.A(n1,"1T");qi.ee=N;k 31=qi.31;if(31){31.1G()}$(n1).2x();$(n1).1G()};u IC(a9){k 4t=$(a9);k 8Q=$.A(a9,"1T");8Q.ee=N;4t.2x(".1T").1m("5o.1T",u(){8Q.ee=Q;8Q.1A=1P;(u(){if(8Q.ee){if(8Q.1A!=4t.1n()){8Q.1A=4t.1n();iS(a9)}3m(5r.x5,g7)}})()}).1m("6Z.1T",u(){8Q.ee=N;iJ(a9)}).1m("6t.1T",u(){if(4t.2h("1T-ce")){iL(a9)}}).1m("5h.1T",u(){iJ(a9)})};u iL(ec){k 4t=$(ec);k 4m=$.A(ec,"1T").9P;k 31=$.A(ec,"1T").31;if(!31){31=$("<G Y=\\"1T-31\\">"+"<1a Y=\\"1T-31-6y\\">"+"</1a>"+"<1a Y=\\"1T-31-gk\\">"+"</1a>"+"</G>").1t("1q");$.A(ec,"1T").31=31}31.L(".1T-31-6y").1F(4m);31.1l({3q:"5w",Z:4t.3K().Z+4t.1N(),14:4t.3K().14})};u iJ(q5){k 31=$.A(q5,"1T").31;if(31){31.1G();$.A(q5,"1T").31=1r}};u iS(8M){k x=$.A(8M,"1T").E;k 31=$.A(8M,"1T").31;k 4t=$(8M);k nA=4t.1n();u qE(4m){$.A(8M,"1T").9P=4m};k q1=4t.1b("1z");if(q1==Q||q1=="Q"){C Q}if(x.gE){if(nA==""){4t.1e("1T-ce");qE(x.pY);iL(8M);C N}}if(x.iR){k qb=/([a-zA-MK]+)(.*)/.Ix(x.iR);k 4F=x.wD[qb[1]];if(nA&&4F){k dX=4U(qb[2]);if(!4F["g8"](nA,dX)){4t.1e("1T-ce");k kt=4F["9P"];if(dX){1h(k i=0;i<dX.O;i++){kt=kt.5J(3s gl("\\\\{"+i+"\\\\}","g"),dX[i])}}qE(x.q2||kt);iL(8M);C N}}}4t.1x("1T-ce");iJ(8M);C Q};$.fn.1T=u(a5,IE){if(2b a5=="2r"){C $.fn.1T.1J[a5](B,IE)}a5=a5||{};C B.P(u(){k qe=$.A(B,"1T");if(qe){$.1d(qe.E,a5)}K{33(B);$.A(B,"1T",{E:$.1d({},$.fn.1T.1u,$.fn.1T.1o(B),a5)})}IC(B)})};$.fn.1T.1J={2L:u(jq){C jq.P(u(){IA(B)})},7S:u(jq){C jq.P(u(){iS(B)})},sR:u(jq){C iS(jq[0])}};$.fn.1T.1o=u(pZ){k t=$(pZ);C $.1d({},$.1V.1o(pZ,["iR","pY","q2"]),{gE:(t.1b("gE")?Q:1P)})};$.fn.1T.1u={gE:N,iR:1r,pY:"MN 29 is gE.",q2:1r,wD:{Dv:{g8:u(Dq){C/^((([a-z]|\\d|[!#\\$%&\'\\*\\+\\-\\/=\\?\\^6R`{\\|}~]|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])+(\\.([a-z]|\\d|[!#\\$%&\'\\*\\+\\-\\/=\\?\\^6R`{\\|}~]|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])+)*)|((\\Dp)((((\\iF|\\ga)*(\\qs\\Ds))?(\\iF|\\ga)+)?(([\\DM-\\MM\\DD\\DC\\NP-\\O3\\Dt]|\\O4|[\\O5-\\NZ]|[\\O7-\\Oh]|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])|(\\\\([\\DM-\\ga\\DD\\DC\\qs-\\Dt]|[\\3E-\\3C\\3G-\\3M\\3N-\\3L]))))*(((\\iF|\\ga)*(\\qs\\Ds))?(\\iF|\\ga)+)?(\\Dp)))@((([a-z]|\\d|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])|(([a-z]|\\d|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])([a-z]|\\d|-|\\.|6R|~|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])*([a-z]|\\d|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])))\\.)+(([a-z]|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])|(([a-z]|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])([a-z]|\\d|-|\\.|6R|~|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])*([a-z]|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])))\\.?$/i.io(Dq)},9P:"iD 8c a Eb Dv Od."},2N:{g8:u(E7){C/^(O8?|O9):\\/\\/(((([a-z]|\\d|-|\\.|6R|~|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])|(%[\\da-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])|(([a-z]|\\d|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])([a-z]|\\d|-|\\.|6R|~|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])*([a-z]|\\d|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])))\\.)+(([a-z]|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])|(([a-z]|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])([a-z]|\\d|-|\\.|6R|~|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])*([a-z]|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|6R|~|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])|(%[\\da-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|6R|~|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])|(%[\\da-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|6R|~|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])|(%[\\da-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:|@)|[\\Ob-\\NJ]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|6R|~|[\\3E-\\3C\\3G-\\3M\\3N-\\3L])|(%[\\da-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i.io(E7)},9P:"iD 8c a Eb ND."},O:{g8:u(Eh,qh){k 5z=$.82(Eh).O;C 5z>=qh[0]&&5z<=qh[1]},9P:"iD 8c a 1A NL {0} NT {1}."},u9:{g8:u(E5,ql){k A={};A[ql[1]]=E5;k DU=$.9T({2N:ql[0],dy:"ds",A:A,NU:N,9O:N,1I:"mw"}).NR;C DU=="Q"},9P:"iD f9 B 29."}}}})(2T);(u($){u pT(pW,8u){8u=8u||{};if(8u.pO){if(8u.pO.X(pW)==N){C}}k 2M=$(pW);if(8u.2N){2M.1b("pu",8u.2N)}k gg="NM"+(3s 4f().NN());k ch=$("<E2 id="+gg+" 1C="+gg+"></E2>").1b("NK",1s.NE?"3I:N":"NB:NG").1l({4L:"iM",14:-Do,Z:-Do});k t=2M.1b("1v"),a=2M.1b("pu");2M.1b("1v",gg);NI{ch.1t("1q");ch.1m("8l",cb);2M[0].pS()}NH{2M.1b("pu",a);t?2M.1b("1v",t):2M.4K("1v")}k CI=10;u cb(){ch.2x();k 1q=$("#"+gg).NV().L("1q");k A=1q.1F();if(A==""){if(--CI){3m(cb,4Z);C}C}k ta=1q.L(">av");if(ta.O){A=ta.1n()}K{k jf=1q.L(">jf");if(jf.O){A=jf.1F()}}if(8u.8v){8u.8v(A)}3m(u(){ch.2x();ch.1G()},4Z)}};u 8l(6O,A){if(!$.A(6O,"2M")){$.A(6O,"2M",{E:$.1d({},$.fn.2M.1u)})}k x=$.A(6O,"2M").E;if(2b A=="2r"){k pl={};if(x.74.X(6O,pl)==N){C}$.9T({2N:A,A:pl,dy:"ds",8v:u(A){pm(A)},b9:u(){x.77.4V(6O,5r)}})}K{pm(A)}u pm(A){k 2M=$(6O);1h(k 1C in A){k 1n=A[1C];k rr=CQ(1C,1n);if(!rr.O){k f=2M.L("1L[Dm=\\""+1C+"\\"]");if(f.O){f.2E("2S",1n)}K{$("1L[1C=\\""+1C+"\\"]",2M).1n(1n);$("av[1C=\\""+1C+"\\"]",2M).1n(1n);$("5C[1C=\\""+1C+"\\"]",2M).1n(1n)}}CG(1C,1n)}x.53.X(6O,A);j1(6O)};u CQ(1C,1n){k 2M=$(6O);k rr=$("1L[1C=\\""+1C+"\\"][1I=Ct], 1L[1C=\\""+1C+"\\"][1I=2t]",2M);$.fn.4S?rr.4S("35",N):rr.1b("35",N);rr.P(u(){k f=$(B);if(f.1n()==O6(1n)){$.fn.4S?f.4S("35",Q):f.1b("35",Q)}});C rr};u CG(1C,1n){k 2M=$(6O);k cc=["1R","2R","32","3n","2k","1c"];k c=2M.L("[uJ=\\""+1C+"\\"]");if(c.O){1h(k i=0;i<cc.O;i++){k 1I=cc[i];if(c.2h(1I+"-f")){if(c[1I]("E").4B){c[1I]("5S",1n)}K{c[1I]("2S",1n)}C}}}}};u Db(be){$("1L,5C,av",be).P(u(){k t=B.1I,pE=B.cf.ww();if(t=="1w"||t=="4T"||t=="O1"||pE=="av"){B.1A=""}K{if(t=="5j"){k 5j=$(B);5j.ay(5j.pD().1n(""));5j.1G()}K{if(t=="2t"||t=="Ct"){B.35=N}K{if(pE=="5C"){B.NC=-1}}}}});if($.fn.1c){$(".1c-f",be).1c("43")}if($.fn.1R){$(".1R-f",be).1R("43")}if($.fn.2R){$(".2R-f",be).2R("43")}if($.fn.32){$(".32-f",be).32("43")}j1(be)};u CV(iZ){k CE=$.A(iZ,"2M").E;k 2M=$(iZ);2M.2x(".2M").1m("pS.2M",u(){3m(u(){pT(iZ,CE)},0);C N})};u j1(pQ){if($.fn.1T){k 4t=$(".1T-1w",pQ);if(4t.O){4t.1T("7S");4t.8D("5o");4t.8D("6Z");k CC=$(".1T-ce:5H",pQ).5o();C CC.O==0}}C Q};$.fn.2M=u(cj,CU){if(2b cj=="2r"){C $.fn.2M.1J[cj](B,CU)}cj=cj||{};C B.P(u(){if(!$.A(B,"2M")){$.A(B,"2M",{E:$.1d({},$.fn.2M.1u,cj)})}CV(B)})};$.fn.2M.1J={pS:u(jq,Dd){C jq.P(u(){pT(B,$.1d({},$.fn.2M.1u,Dd||{}))})},8l:u(jq,A){C jq.P(u(){8l(B,A)})},43:u(jq){C jq.P(u(){Db(B)})},7S:u(jq){C j1(jq[0])}};$.fn.2M.1u={2N:1r,pO:u(){C $(B).2M("7S")},8v:u(A){},74:u(NX){},53:u(A){},77:u(){}}})(2T);(u($){u 33(hN){k v=$("<1L 1I=\\"4T\\">").4a(hN);k 1C=$(hN).1b("1C");if(1C){v.1b("1C",1C);$(hN).4K("1C").1b("Dm",1C)}C v};u Fu(hK){k x=$.A(hK,"2E").E;k fn=x.4Q;x.4Q=u(){};gA(hK,x.1V.X(hK,x.1A));x.4Q=fn};u gD(Dk){C $.A(Dk,"2E").29.1n()};u gA(bd,8H){k pM=$.A(bd,"2E");k x=pM.E;k qz=gD(bd);8H=x.1V.X(bd,8H);x.1A=8H;pM.29.1n(8H);$(bd).1n(x.3t.X(bd,8H));if(qz!=8H){x.4Q.X(bd,8H,qz)}};u Fx(b7){k x=$.A(b7,"2E").E;$(b7).2x(".2E").1m("Fo.2E",u(e){if(e.8p==45){if($(B).1n().7M("-")==-1){C Q}K{C N}}if(e.8p==46){if($(B).1n().7M(".")==-1){C Q}K{C N}}K{if((e.8p>=48&&e.8p<=57&&e.CW==N&&e.NF==N)||e.8p==0||e.8p==8){C Q}K{if(e.CW==Q&&(e.8p==99||e.8p==Oc)){C Q}K{C N}}}}).1m("Og.2E",u(){if(1s.D8){k s=D8.9A("1w");if(!/\\D/.io(s)){C Q}K{C N}}K{C N}}).1m("Ml.2E",u(){C N}).1m("6Z.2E",u(){gA(b7,$(B).1n());$(B).1n(x.3t.X(b7,gD(b7)))}).1m("5o.2E",u(){k vv=gD(b7);if($(B).1n()!=vv){$(B).1n(vv)}})};u Fw(ri){if($.fn.1T){k x=$.A(ri,"2E").E;$(ri).1T(x)}};u ih(hH,D5){k x=$.A(hH,"2E").E;if(D5){x.1z=Q;$(hH).1b("1z",Q)}K{x.1z=N;$(hH).4K("1z")}};$.fn.2E=u(8I,rj){if(2b 8I=="2r"){k rl=$.fn.2E.1J[8I];if(rl){C rl(B,rj)}K{C B.1T(8I,rj)}}8I=8I||{};C B.P(u(){k gv=$.A(B,"2E");if(gv){$.1d(gv.E,8I)}K{gv=$.A(B,"2E",{E:$.1d({},$.fn.2E.1u,$.fn.2E.1o(B),8I),29:33(B)});$(B).4K("1z");$(B).1l({KP:"1z"})}ih(B,gv.E.1z);Fx(B);Fw(B);Fu(B)})};$.fn.2E.1J={E:u(jq){C $.A(jq[0],"2E").E},2L:u(jq){C jq.P(u(){$.A(B,"2E").29.1G();$(B).1T("2L");$(B).1G()})},6l:u(jq){C jq.P(u(){ih(B,Q)})},6H:u(jq){C jq.P(u(){ih(B,N)})},f9:u(jq){C jq.P(u(){gA(B,$(B).1n())})},2S:u(jq,Fz){C jq.P(u(){gA(B,Fz)})},3A:u(jq){C gD(jq[0])},43:u(jq){C jq.P(u(){k FA=$.A(B,"2E");FA.29.1n("");$(B).1n("")})}};$.fn.2E.1o=u(ib){k t=$(ib);C $.1d({},$.fn.1T.1o(ib),$.1V.1o(ib,["gm","cd","c5","c4",{3k:"2O",3h:"2O",gj:"2O"}]),{1z:(t.1b("1z")?Q:1P),1A:(t.1n()||1P)})};$.fn.2E.1u=$.1d({},$.fn.1T.1u,{1z:N,1A:"",3k:1r,3h:1r,gj:0,gm:".",cd:"",c5:"",c4:"",3t:u(7b){if(!7b){C 7b}7b=7b+"";k x=$(B).2E("E");k s1=7b,s2="";k ip=7b.7M(".");if(ip>=0){s1=7b.7g(0,ip);s2=7b.7g(ip+1,7b.O)}if(x.cd){k p=/(\\d+)(\\d{3})/;7n(p.io(s1)){s1=s1.5J(p,"$1"+x.cd+"$2")}}if(s2){C x.c5+s1+x.gm+s2+x.c4}K{C x.c5+s1+x.c4}},1V:u(s){s=s+"";k x=$(B).2E("E");if(x.cd){s=s.5J(3s gl("\\\\"+x.cd,"g"),"")}if(x.gm){s=s.5J(3s gl("\\\\"+x.gm,"g"),".")}if(x.c5){s=s.5J(3s gl("\\\\"+$.82(x.c5),"g"),"")}if(x.c4){s=s.5J(3s gl("\\\\"+$.82(x.c4),"g"),"")}s=s.5J(/\\s/g,"");k 1n=oJ(s).fM(x.gj);if(4R(1n)){1n=""}K{if(2b(x.3k)=="2O"&&1n<x.3k){1n=x.3k.fM(x.gj)}K{if(2b(x.3h)=="2O"&&1n>x.3h){1n=x.3h.fM(x.gj)}}}C 1n},4Q:u(KO,KN){}})})(2T);(u($){u jF(rD){k x=$.A(rD,"1p").E;k t=$(rD);if(x.2Z==Q){k p=t.2p();x.U=p.U();x.V=p.V()}k Fk=t.L(".1p-1K");t.3B(x.U);t.58(x.V);t.L(".1p-1q").58(t.V()-Fk.2j())};u 33(4X){$(4X).1e("1p").go("<G Y=\\"1p-1K\\">"+"<G Y=\\"1p-qN\\"></G>"+"<G Y=\\"1p-qL\\"></G>"+"<G Y=\\"1p-qQ\\"></G>"+"<G Y=\\"1p-qO\\"></G>"+"<G Y=\\"1p-2f\\">"+"<1a>KQ KR</1a>"+"</G>"+"</G>"+"<G Y=\\"1p-1q\\">"+"<G Y=\\"1p-11\\">"+"<G Y=\\"1p-11-3y-3H\\">"+"<1a Y=\\"1p-11-3F\\"></1a>"+"<1a><1L Y=\\"1p-11-3y\\" 1I=\\"1w\\"></1L></1a>"+"<1a Y=\\"1p-11-2B\\"></1a>"+"</G>"+"<G Y=\\"1p-11-3Q-3H\\">"+"</G>"+"</G>"+"</G>");$(4X).L(".1p-2f 1a").2l(u(){$(B).1e("1p-11-2l")},u(){$(B).1x("1p-11-2l")}).2e(u(){k 11=$(4X).L(".1p-11");if(11.is(":5W")){11.2z()}K{Fp(4X)}});$(".1p-qN,.1p-qL,.1p-qQ,.1p-qO",4X).2l(u(){$(B).1e("1p-Fh-2l")},u(){$(B).1x("1p-Fh-2l")});$(4X).L(".1p-qL").2e(u(){qP(4X,1)});$(4X).L(".1p-qN").2e(u(){qP(4X,-1)});$(4X).L(".1p-qO").2e(u(){qC(4X,1)});$(4X).L(".1p-qQ").2e(u(){qC(4X,-1)});$(4X).1m("8q",u(){k x=$.A(4X,"1p").E;if(x.2Z==Q){jF(4X)}C N})};u qP(kw,Fl){k x=$.A(kw,"1p").E;x.3Q+=Fl;if(x.3Q>12){x.3y++;x.3Q=1}K{if(x.3Q<1){x.3y--;x.3Q=12}}2F(kw);k 11=$(kw).L(".1p-11-3Q-3H");11.L("td.1p-1Q").1x("1p-1Q");11.L("td:eq("+(x.3Q-1)+")").1e("1p-1Q")};u qC(kH,Fr){k x=$.A(kH,"1p").E;x.3y+=Fr;2F(kH);k 11=$(kH).L(".1p-11-3y");11.1n(x.3y)};u Fp(4P){k x=$.A(4P,"1p").E;$(4P).L(".1p-11").2F();if($(4P).L(".1p-11-3Q-3H").is(":4u")){$(4P).L(".1p-11-3Q-3H").4u();k t=$("<2s></2s>").1t($(4P).L(".1p-11-3Q-3H"));k qD=0;1h(k i=0;i<3;i++){k tr=$("<tr></tr>").1t(t);1h(k j=0;j<4;j++){$("<td Y=\\"1p-11-3Q\\"></td>").1F(x.o1[qD++]).1b("b3",qD).1t(tr)}}$(4P).L(".1p-11-3F,.1p-11-2B").2l(u(){$(B).1e("1p-11-2l")},u(){$(B).1x("1p-11-2l")});$(4P).L(".1p-11-2B").2e(u(){k y=$(4P).L(".1p-11-3y");if(!4R(y.1n())){y.1n(2X(y.1n())+1)}});$(4P).L(".1p-11-3F").2e(u(){k y=$(4P).L(".1p-11-3y");if(!4R(y.1n())){y.1n(2X(y.1n()-1))}});$(4P).L(".1p-11-3y").Fo(u(e){if(e.dv==13){ph()}});$(4P).L(".1p-11-3Q").2l(u(){$(B).1e("1p-11-2l")},u(){$(B).1x("1p-11-2l")}).2e(u(){k 11=$(4P).L(".1p-11");11.L(".1p-1Q").1x("1p-1Q");$(B).1e("1p-1Q");ph()})}u ph(){k 11=$(4P).L(".1p-11");k 3y=11.L(".1p-11-3y").1n();k FG=11.L(".1p-1Q").1b("b3");if(!4R(3y)){x.3y=2X(3y);x.3Q=2X(FG);2F(4P)}11.2z()};k 1q=$(4P).L(".1p-1q");k c7=$(4P).L(".1p-11");k qS=c7.L(".1p-11-3y-3H");k kl=c7.L(".1p-11-3Q-3H");qS.L("1L").1n(x.3y).5o();kl.L("td.1p-1Q").1x("1p-1Q");kl.L("td:eq("+(x.3Q-1)+")").1e("1p-1Q");c7.3B(1q.1N());c7.58(1q.2j());kl.58(c7.V()-qS.2j())};u G3(FY,3y,r7){k x=$.A(FY,"1p").E;k ks=[];k FW=3s 4f(3y,r7,0).78();1h(k i=1;i<=FW;i++){ks.1i([3y,r7,i])}k 7d=[],5m=[];7n(ks.O>0){k 2d=ks.uf();5m.1i(2d);k 90=3s 4f(2d[0],2d[1]-1,2d[2]).KT();if(90==(x.aZ==0?7:x.aZ)-1){7d.1i(5m);5m=[]}}if(5m.O){7d.1i(5m)}k c9=7d[0];if(c9.O<7){7n(c9.O<7){k 8S=c9[0];k 2d=3s 4f(8S[0],8S[1]-1,8S[2]-1);c9.84([2d.6b(),2d.62()+1,2d.78()])}}K{k 8S=c9[0];k 5m=[];1h(k i=1;i<=7;i++){k 2d=3s 4f(8S[0],8S[1]-1,8S[2]-i);5m.84([2d.6b(),2d.62()+1,2d.78()])}7d.84(5m)}k aK=7d[7d.O-1];7n(aK.O<7){k 8Z=aK[aK.O-1];k 2d=3s 4f(8Z[0],8Z[1]-1,8Z[2]+1);aK.1i([2d.6b(),2d.62()+1,2d.78()])}if(7d.O<6){k 8Z=aK[aK.O-1];k 5m=[];1h(k i=1;i<=7;i++){k 2d=3s 4f(8Z[0],8Z[1]-1,8Z[2]+i);5m.1i([2d.6b(),2d.62()+1,2d.78()])}7d.1i(5m)}C 7d};u 2F(cG){k x=$.A(cG,"1p").E;$(cG).L(".1p-2f 1a").1F(x.o1[x.3Q-1]+" "+x.3y);k 1q=$(cG).L("G.1p-1q");1q.L(">2s").1G();k t=$("<2s 6e=\\"0\\" 65=\\"0\\" 2W=\\"0\\"><hR></hR><3c></3c></2s>").3o(1q);k tr=$("<tr></tr>").1t(t.L("hR"));1h(k i=x.aZ;i<x.jI.O;i++){tr.4D("<th>"+x.jI[i]+"</th>")}1h(k i=0;i<x.aZ;i++){tr.4D("<th>"+x.jI[i]+"</th>")}k qT=G3(cG,x.3y,x.3Q);1h(k i=0;i<qT.O;i++){k 5m=qT[i];k tr=$("<tr></tr>").1t(t.L("3c"));1h(k j=0;j<5m.O;j++){k 90=5m[j];$("<td Y=\\"1p-90 1p-FU-3Q\\"></td>").1b("b3",90[0]+","+90[1]+","+90[2]).1F(90[2]).1t(tr)}}t.L("td[b3^=\\""+x.3y+","+x.3Q+"\\"]").1x("1p-FU-3Q");k l5=3s 4f();k FM=l5.6b()+","+(l5.62()+1)+","+l5.78();t.L("td[b3=\\""+FM+"\\"]").1e("1p-KS");if(x.5M){t.L(".1p-1Q").1x("1p-1Q");k FK=x.5M.6b()+","+(x.5M.62()+1)+","+x.5M.78();t.L("td[b3=\\""+FK+"\\"]").1e("1p-1Q")}k fc=6-x.aZ;k kV=fc+1;if(fc>=7){fc-=7}if(kV>=7){kV-=7}t.L("tr").L("td:eq("+fc+")").1e("1p-KM");t.L("tr").L("td:eq("+kV+")").1e("1p-KL");t.L("td").2l(u(){$(B).1e("1p-2l")},u(){$(B).1x("1p-2l")}).2e(u(){t.L(".1p-1Q").1x("1p-1Q");$(B).1e("1p-1Q");k kR=$(B).1b("b3").47(",");x.5M=3s 4f(kR[0],2X(kR[1])-1,kR[2]);x.4l.X(cG,x.5M)})};$.fn.1p=u(b0,FQ){if(2b b0=="2r"){C $.fn.1p.1J[b0](B,FQ)}b0=b0||{};C B.P(u(){k fa=$.A(B,"1p");if(fa){$.1d(fa.E,b0)}K{fa=$.A(B,"1p",{E:$.1d({},$.fn.1p.1u,$.fn.1p.1o(B),b0)});33(B)}if(fa.E.2W==N){$(B).1e("1p-6D")}jF(B);2F(B);$(B).L("G.1p-11").2z()})};$.fn.1p.1J={E:u(jq){C $.A(jq[0],"1p").E},23:u(jq){C jq.P(u(){jF(B)})},sF:u(jq,2d){C jq.P(u(){$(B).1p({3y:2d.6b(),3Q:2d.62()+1,5M:2d})})}};$.fn.1p.1o=u(o3){k t=$(o3);C $.1d({},$.1V.1o(o3,["U","V",{aZ:"2O",2Z:"1S",2W:"1S"}]))};$.fn.1p.1u={U:rS,V:rS,2Z:N,2W:Q,aZ:0,jI:["S","M","T","W","T","F","S"],o1:["KG","KF","KE","KH","KI","KK","KJ","KU","KV","L7","L6","L5"],3y:3s 4f().6b(),3Q:3s 4f().62()+1,5M:3s 4f(),4l:u(2d){}}})(2T);(u($){u 33(oZ){k oT=$("<1a Y=\\"1U\\">"+"<1a Y=\\"1U-4G\\">"+"<1a Y=\\"1U-4G-up\\"></1a>"+"<1a Y=\\"1U-4G-4z\\"></1a>"+"</1a>"+"</1a>").4a(oZ);$(oZ).1e("1U-1w").3o(oT);C oT};u os(fx,oS){k x=$.A(fx,"1U").E;k aV=$.A(fx,"1U").1U;if(oS){x.U=oS}k pa=$("<G 2c=\\"3q:5e\\"></G>").aO(aV);aV.1t("1q");if(4R(x.U)){x.U=$(fx).1N()}aV.3B(x.U);$(fx).3B(aV.U()-aV.L(".1U-4G").1N());aV.4a(pa);pa.1G()};u kf(7Q){k x=$.A(7Q,"1U").E;k jv=$.A(7Q,"1U").1U;jv.L(".1U-4G-up,.1U-4G-4z").2x(".1U");if(!x.1z){jv.L(".1U-4G-up").1m("6t.1U",u(){$(B).1e("1U-4G-2l")}).1m("5h.1U",u(){$(B).1x("1U-4G-2l")}).1m("2e.1U",u(){x.fG.X(7Q,N);x.Eq.X(7Q);$(7Q).1T("7S")});jv.L(".1U-4G-4z").1m("6t.1U",u(){$(B).1e("1U-4G-2l")}).1m("5h.1U",u(){$(B).1x("1U-4G-2l")}).1m("2e.1U",u(){x.fG.X(7Q,Q);x.Er.X(7Q);$(7Q).1T("7S")})}};u ka(jO,Ex){k x=$.A(jO,"1U").E;if(Ex){x.1z=Q;$(jO).1b("1z",Q)}K{x.1z=N;$(jO).4K("1z")}};$.fn.1U=u(91,p6){if(2b 91=="2r"){k p3=$.fn.1U.1J[91];if(p3){C p3(B,p6)}K{C B.1T(91,p6)}}91=91||{};C B.P(u(){k 92=$.A(B,"1U");if(92){$.1d(92.E,91)}K{92=$.A(B,"1U",{E:$.1d({},$.fn.1U.1u,$.fn.1U.1o(B),91),1U:33(B)});$(B).4K("1z")}$(B).1n(92.E.1A);$(B).1b("Bu",!92.E.4E);ka(B,92.E.1z);os(B);$(B).1T(92.E);kf(B)})};$.fn.1U.1J={E:u(jq){k x=$.A(jq[0],"1U").E;C $.1d(x,{1A:jq.1n()})},2L:u(jq){C jq.P(u(){k Ep=$.A(B,"1U").1U;$(B).1T("2L");Ep.1G()})},23:u(jq,Em){C jq.P(u(){os(B,Em)})},6H:u(jq){C jq.P(u(){ka(B,N);kf(B)})},6l:u(jq){C jq.P(u(){ka(B,Q);kf(B)})},3A:u(jq){C jq.1n()},2S:u(jq,oi){C jq.P(u(){k x=$.A(B,"1U").E;x.1A=oi;$(B).1n(oi)})},43:u(jq){C jq.P(u(){k x=$.A(B,"1U").E;x.1A="";$(B).1n("")})}};$.fn.1U.1o=u(k2){k t=$(k2);C $.1d({},$.fn.1T.1o(k2),$.1V.1o(k2,["U","3k","3h",{cx:"2O",4E:"1S"}]),{1A:(t.1n()||1P),1z:(t.1b("1z")?Q:1P)})};$.fn.1U.1u=$.1d({},$.fn.1T.1u,{U:"2q",1A:"",3k:1r,3h:1r,cx:1,4E:Q,1z:N,fG:u(4z){},Eq:u(){},Er:u(){}})})(2T);(u($){u Ev(oF){k x=$.A(oF,"5Y").E;$(oF).1U(x).2E(x)};u EL(jR,4z){k x=$.A(jR,"5Y").E;k v=oJ($(jR).2E("3A")||x.1A)||0;if(4z==Q){v-=x.cx}K{v+=x.cx}$(jR).2E("2S",v)};$.fn.5Y=u(8X,ox){if(2b 8X=="2r"){k oy=$.fn.5Y.1J[8X];if(oy){C oy(B,ox)}K{C B.1U(8X,ox)}}8X=8X||{};C B.P(u(){k oC=$.A(B,"5Y");if(oC){$.1d(oC.E,8X)}K{$.A(B,"5Y",{E:$.1d({},$.fn.5Y.1u,$.fn.5Y.1o(B),8X)})}Ev(B)})};$.fn.5Y.1J={E:u(jq){k x=$.A(jq[0],"5Y").E;C $.1d(x,{1A:jq.2E("3A")})},2S:u(jq,Eu){C jq.P(u(){$(B).2E("2S",Eu)})},3A:u(jq){C jq.2E("3A")},43:u(jq){C jq.P(u(){$(B).1U("43");$(B).2E("43")})}};$.fn.5Y.1o=u(oP){C $.1d({},$.fn.1U.1o(oP),$.fn.2E.1o(oP),{})};$.fn.5Y.1u=$.1d({},$.fn.1U.1u,$.fn.2E.1u,{fG:u(4z){EL(B,4z)}})})(2T);(u($){u ET(8T){k x=$.A(8T,"3e").E;$(8T).1U(x);$(8T).2x(".3e");$(8T).1m("2e.3e",u(){k 7T=0;if(B.oj!=1r){7T=B.oj}K{if(B.jr){k F4=8T.jr();k s=2G.L8.L9();s.Lb("La",F4);7T=s.1w.O}}if(7T>=0&&7T<=2){x.7f=0}K{if(7T>=3&&7T<=5){x.7f=1}K{if(7T>=6&&7T<=8){x.7f=2}}}nG(8T)}).1m("6Z.3e",u(){ir(8T)})};u nG(bl){k x=$.A(bl,"3e").E;k ct=0,cq=0;if(x.7f==0){ct=0;cq=2}K{if(x.7f==1){ct=3;cq=5}K{if(x.7f==2){ct=6;cq=8}}}if(bl.oj!=1r){bl.L4(ct,cq)}K{if(bl.jr){k fK=bl.jr();fK.37();fK.L3("F7",cq);fK.Mm("F7",ct);fK.5C()}}$(bl).5o()};u fB(F8,pe){k x=$.A(F8,"3e").E;if(!pe){C 1r}k vv=pe.47(x.3j);1h(k i=0;i<vv.O;i++){if(4R(vv[i])){C 1r}}7n(vv.O<3){vv.1i(0)}C 3s 4f(KX,0,0,vv[0],vv[1],vv[2])};u ir(7J){k x=$.A(7J,"3e").E;k EZ=$(7J).1n();k 5g=fB(7J,EZ);if(!5g){5g=fB(7J,x.1A)}if(!5g){x.1A="";$(7J).1n("");C}k kp=fB(7J,x.3k);k ku=fB(7J,x.3h);if(kp&&kp>5g){5g=kp}if(ku&&ku<5g){5g=ku}k tt=[i2(5g.er()),i2(5g.dY())];if(x.8a){tt.1i(i2(5g.e6()))}k 1n=tt.3R(x.3j);x.1A=1n;$(7J).1n(1n);u i2(nM){C(nM<10?"0":"")+nM}};u EV(cw,4z){k x=$.A(cw,"3e").E;k 1n=$(cw).1n();if(1n==""){1n=[0,0,0].3R(x.3j)}k vv=1n.47(x.3j);1h(k i=0;i<vv.O;i++){vv[i]=2X(vv[i],10)}if(4z==Q){vv[x.7f]-=x.cx}K{vv[x.7f]+=x.cx}$(cw).1n(vv.3R(x.3j));ir(cw);nG(cw)};$.fn.3e=u(8V,o6){if(2b 8V=="2r"){k nD=$.fn.3e.1J[8V];if(nD){C nD(B,o6)}K{C B.1U(8V,o6)}}8V=8V||{};C B.P(u(){k o8=$.A(B,"3e");if(o8){$.1d(o8.E,8V)}K{$.A(B,"3e",{E:$.1d({},$.fn.3e.1u,$.fn.3e.1o(B),8V)});ET(B)}})};$.fn.3e.1J={E:u(jq){k x=$.A(jq[0],"3e").E;C $.1d(x,{1A:jq.1n()})},2S:u(jq,EY){C jq.P(u(){$(B).1n(EY);ir(B)})},er:u(jq){k x=$.A(jq[0],"3e").E;k vv=jq.1n().47(x.3j);C 2X(vv[0],10)},dY:u(jq){k x=$.A(jq[0],"3e").E;k vv=jq.1n().47(x.3j);C 2X(vv[1],10)},e6:u(jq){k x=$.A(jq[0],"3e").E;k vv=jq.1n().47(x.3j);C 2X(vv[2],10)||0}};$.fn.3e.1o=u(nY){C $.1d({},$.fn.1U.1o(nY),$.1V.1o(nY,["3j",{8a:"1S",7f:"2O"}]))};$.fn.3e.1u=$.1d({},$.fn.1U.1u,{3j:":",8a:N,7f:0,fG:u(4z){EV(B,4z)}})})(2T);(u($){k vb=0;u cm(a,o){1h(k i=0,5z=a.O;i<5z;i++){if(a[i]==o){C i}}C-1};u gy(a,o,id){if(2b o=="2r"){1h(k i=0,5z=a.O;i<5z;i++){if(a[i][o]==id){a.4O(i,1);C}}}K{k o7=cm(a,o);if(o7!=-1){a.4O(o7,1)}}};u a3(nN,bC){k x=$.A(nN,"H").E;k s6=$.A(nN,"H").J;if(bC){if(bC.U){x.U=bC.U}if(bC.V){x.V=bC.V}}if(x.2Z==Q){k p=s6.J("J").2p();x.U=p.U();x.V=p.V()}s6.J("23",{U:x.U,V:x.V})};u cz(ix){k x=$.A(ix,"H").E;k dc=$.A(ix,"H").dc;k 2V=$.A(ix,"H").J;k vo=2V.U();k EU=2V.V();k 1y=dc.1y;k 8W=dc.am;k 7c=dc.6g;k fF=8W.17("G.H-1K");k je=7c.17("G.H-1K");k iE=fF.L("2s");k iT=je.L("2s");1y.U(vo);k vp=fF.17("G.H-1K-3H").2F();8W.U(vp.L("2s").U());if(!x.eX){vp.2z()}7c.U(vo-8W.1N());8W.17("G.H-1K,G.H-1q,G.H-3u").U(8W.U());7c.17("G.H-1K,G.H-1q,G.H-3u").U(7c.U());k hh;fF.1l("V","");je.1l("V","");iE.1l("V","");iT.1l("V","");hh=3v.3h(iE.V(),iT.V());iE.V(hh);iT.V(hh);fF.4I(je).58(hh);if(x.V!="2q"){k j8=EU-7c.17("G.H-1K").2j(Q)-7c.17("G.H-3u").2j(Q)-2V.17("G.H-3z").2j(Q);2V.17("G.H-a4").P(u(){j8-=$(B).2j(Q)});8W.17("G.H-1q").V(j8);7c.17("G.H-1q").V(j8)}1y.V(7c.V());7c.1l("Z",8W.1N())};u ab(6Y,iV,EW){k 1g=$.A(6Y,"H").A.1g;k x=$.A(6Y,"H").E;k dc=$.A(6Y,"H").dc;if(!dc.4r.is(":4u")&&(!x.dr||x.dU||EW)){if(iV!=1P){k 3x=x.1Z.2g(6Y,iV,"1q",1);k 3S=x.1Z.2g(6Y,iV,"1q",2);hO(3x,3S)}K{k 3x=x.1Z.2g(6Y,0,"9r",1);k 3S=x.1Z.2g(6Y,0,"9r",2);hO(3x,3S);if(x.8e){k 3x=x.1Z.2g(6Y,0,"eW",1);k 3S=x.1Z.2g(6Y,0,"eW",2);hO(3x,3S)}}}cz(6Y);if(x.V=="2q"){k EX=dc.4r.2p();k j3=dc.4c;k fH=0;k j0=0;j3.17().P(u(){k c=$(B);if(c.is(":5W")){fH+=c.2j();if(j0<c.1N()){j0=c.1N()}}});if(j0>j3.U()){fH+=18}EX.V(fH);j3.V(fH);dc.1y.V(dc.6g.V())}dc.4c.7l("w7");u hO(ES,vf){1h(k i=0;i<vf.O;i++){k 3x=$(ES[i]);k 3S=$(vf[i]);3x.1l("V","");3S.1l("V","");k ve=3v.3h(3x.V(),3S.V());3x.1l("V",ve);3S.1l("V",ve)}}};u Dg(8U,KW){u EQ(){k vk=[];k vj=[];$(8U).17("hR").P(u(){k 9d=$.1V.1o(B,[{EN:"1S"}]);$(B).L("tr").P(u(){k aJ=[];$(B).L("th").P(u(){k th=$(B);k 1k=$.1d({},$.1V.1o(B,["29","6L",{sj:"1S",2t:"1S",2D:"1S"},{6C:"2O",5v:"2O",U:"2O"}]),{2f:(th.1F()||1P),4T:(th.1b("4T")?Q:1P),3t:(th.1b("3t")?4U(th.1b("3t")):1P),6K:(th.1b("6K")?4U(th.1b("6K")):1P)});if(!1k.6L){1k.6L="Z"}if(th.1b("4j")){k s=$.82(th.1b("4j"));if(s.KZ(0,1)=="{"){1k.4j=4U("("+s+")")}K{1k.4j=s}}aJ.1i(1k)});9d.EN?vk.1i(aJ):vj.1i(aJ)})});C[vk,vj]};k cu=$("<G Y=\\"H-2V\\">"+"<G Y=\\"H-1y\\">"+"<G Y=\\"H-am\\">"+"<G Y=\\"H-1K\\">"+"<G Y=\\"H-1K-3H\\"></G>"+"</G>"+"<G Y=\\"H-1q\\">"+"<G Y=\\"H-1q-3H\\"></G>"+"</G>"+"<G Y=\\"H-3u\\">"+"<G Y=\\"H-3u-3H\\"></G>"+"</G>"+"</G>"+"<G Y=\\"H-6g\\">"+"<G Y=\\"H-1K\\">"+"<G Y=\\"H-1K-3H\\"></G>"+"</G>"+"<G Y=\\"H-1q\\"></G>"+"<G Y=\\"H-3u\\">"+"<G Y=\\"H-3u-3H\\"></G>"+"</G>"+"</G>"+"</G>"+"</G>").4a(8U);cu.J({6X:N});cu.J("J").1e("H").1m("8q",u(e,EP){k x=$.A(8U,"H").E;if(x.2Z==Q||EP){a3(8U);3m(u(){if($.A(8U,"H")){eb(8U)}},0)}C N});$(8U).2z().1t(cu.17("G.H-1y"));k cc=EQ();k 1y=cu.17("G.H-1y");k fz=1y.17("G.H-am");k fA=1y.17("G.H-6g");C{J:cu,5u:cc[0],7V:cc[1],dc:{1y:1y,am:fz,6g:fA,k1:fz.17("G.H-1K").17("G.H-1K-3H"),jW:fA.17("G.H-1K").17("G.H-1K-3H"),4r:fz.17("G.H-1q").17("G.H-1q-3H"),4c:fA.17("G.H-1q"),7u:fz.17("G.H-3u").17("G.H-3u-3H"),7w:fA.17("G.H-3u").17("G.H-3u-3H")}}};u De(kF){k A={3p:0,1g:[]};k vx=6S(kF,Q).6v(6S(kF,N));$(kF).L("3c tr").P(u(){A.3p++;k 1k={};1h(k i=0;i<vx.O;i++){1k[vx[i]]=$("td:eq("+i+")",B).1F()}A.1g.1i(1k)});C A};u Dc(7z){k fC=$.A(7z,"H");k x=fC.E;k dc=fC.dc;k 60=fC.J;60.J($.1d({},x,{id:1r,6X:N,5N:u(ER,F9){3m(u(){if($.A(7z,"H")){cz(7z);d9(7z);x.5N.X(60,ER,F9)}},0)},5d:u(){ab(7z);x.5d.X(60)}}));fC.dI="H-R-r"+(++vb);vF(dc.k1,x.5u,Q);vF(dc.jW,x.7V,N);Es();dc.k1.4I(dc.jW).1l("3q",x.eX?"5w":"5e");dc.7u.4I(dc.7w).1l("3q",x.8e?"5w":"5e");if(x.3z){if(2b x.3z=="2r"){$(x.3z).1e("H-3z").3o(60);$(x.3z).2F()}K{$("G.H-3z",60).1G();k tb=$("<G Y=\\"H-3z\\"></G>").3o(60);1h(k i=0;i<x.3z.O;i++){k 1D=x.3z[i];if(1D=="-"){$("<G Y=\\"H-1D-3j\\"></G>").1t(tb)}K{k 1X=$("<a 26=\\"3I:3Z(0)\\"></a>");1X[0].3O=4U(1D.4w||u(){});1X.1l("Fa","Z").1t(tb).2P($.1d({},1D,{39:Q}))}}}}K{$("G.H-3z",60).1G()}$("G.H-a4",60).1G();if(x.1Y){k 7K=$("<G Y=\\"H-a4\\"></G>");if(x.mz=="7R"){7K.1t(60)}K{if(x.mz=="14"){7K.1e("H-a4-14").3o(60)}K{k Fc=$("<G Y=\\"H-a4 H-a4-14\\"></G>").3o(60);7K.1t(60);7K=7K.4I(Fc)}}7K.1Y({2J:x.2J,34:x.34,5E:x.5E,ln:u(vy,vB){x.2J=vy;x.34=vB;7K.1Y("64",{2J:vy,34:vB});d8(7z)}});x.34=7K.1Y("E").34}u vF(kb,jU,Et){if(!jU){C}$(kb).2F();$(kb).4u();k t=$("<2s Y=\\"H-L0\\" 2W=\\"0\\" 6e=\\"0\\" 65=\\"0\\"><3c></3c></2s>").1t(kb);1h(k i=0;i<jU.O;i++){k tr=$("<tr Y=\\"H-1K-R\\"></tr>").1t($("3c",t));k aJ=jU[i];1h(k j=0;j<aJ.O;j++){k 1k=aJ[j];k 1b="";if(1k.6C){1b+="6C=\\""+1k.6C+"\\" "}if(1k.5v){1b+="5v=\\""+1k.5v+"\\" "}k td=$("<td "+1b+"></td>").1t(tr);if(1k.2t){td.1b("29",1k.29);$("<G Y=\\"H-1K-6x\\"></G>").1F("<1L 1I=\\"2t\\"/>").1t(td)}K{if(1k.29){td.1b("29",1k.29);td.4D("<G Y=\\"H-1H\\"><1a></1a><1a Y=\\"H-5f-24\\"></1a></G>");$("1a",td).1F(1k.2f);$("1a.H-5f-24",td).1F("&aL;");k 1H=td.L("G.H-1H");if(1k.2D==N){1H.1b("2D","N")}if(1k.U){1H.3B(1k.U);1k.7Y=2X(1H[0].2c.U)}K{1k.2q=Q}1H.1l("1w-6L",(1k.6L||"Z"));1k.iy="H-1H-c"+vb+"-"+1k.29.5J(".","-");1k.wA="G."+1k.iy}K{$("<G Y=\\"H-1H-5t\\"></G>").1F(1k.2f).1t(td)}}if(1k.4T){td.2z()}}}if(Et&&x.5B){k td=$("<td 6C=\\""+x.5u.O+"\\"><G Y=\\"H-1K-87\\"></G></td>");if($("tr",t).O==0){td.2V("<tr Y=\\"H-1K-R\\"></tr>").2p().1t($("3c",t))}K{td.3o($("tr:5H",t))}}};u Es(){dc.1y.17("2c").1G();k ss=["<2c 1I=\\"1w/1l\\">"];k uI=6S(7z,Q).6v(6S(7z));1h(k i=0;i<uI.O;i++){k 1k=5L(7z,uI[i]);if(1k&&!1k.2t){ss.1i(1k.wA+" {U:"+1k.7Y+"px;}")}}ss.1i("</2c>");$(ss.3R("\\n")).3o(dc.1y)}};u Df(2Y){k 5l=$.A(2Y,"H");k uT=5l.J;k x=5l.E;k dc=5l.dc;k cr=dc.k1.4I(dc.jW);cr.L("td:K3(G.H-1H)").2x(".H").1m("6t.H",u(){$(B).1e("H-1K-8Y")}).1m("5h.H",u(){$(B).1x("H-1K-8Y")}).1m("gt.H",u(e){k Ew=$(B).1b("29");x.GL.X(2Y,e,Ew)});cr.L("1L[1I=2t]").2x(".H").1m("2e.H",u(e){if(x.8f&&x.94){C N}if($(B).is(":35")){ns(2Y)}K{ep(2Y)}e.54()});k jS=cr.L("G.H-1H");jS.2x(".H").1m("2e.H",u(e){if(e.3V<$(B).3K().Z+$(B).1N()-5){k uA=$(B).2p().1b("29");k 1k=5L(2Y,uA);if(!1k.sj||5l.v6){C}x.5x=uA;x.7a="dM";k c="H-5f-dM";if($(B).2h(c)){c="H-5f-uD";x.7a="uD"}jS.1x("H-5f-dM H-5f-uD");$(B).1e(c);if(x.as){d8(2Y)}K{k A=$.A(2Y,"H").A;d7(2Y,A)}x.mJ.X(2Y,x.5x,x.7a)}}).1m("i1.H",u(e){if(e.3V>$(B).3K().Z+$(B).1N()-5){k uE=$(B).2p().1b("29");k 1k=5L(2Y,uE);if(1k.2D==N){C}$(2Y).H("97",uE);1k.2q=N}});jS.P(u(){$(B).2D({fT:"e",1z:($(B).1b("2D")?$(B).1b("2D")=="N":N),fQ:25,fP:u(e){5l.v6=Q;cr.1l("4e","e-23");if(!5l.2a){5l.2a=$("<G Y=\\"H-23-2a\\"></G>").1t(dc.1y)}5l.2a.1l({Z:e.3V-$(uT).3K().Z-1,3q:"5e"});3m(u(){if(5l.2a){5l.2a.2F()}},El)},5N:u(e){5l.2a.1l({Z:e.3V-$(uT).3K().Z-1,3q:"5w"});C N},fL:u(e){cr.1l("4e","");k ke=$(B).2p().1b("29");k 1k=5L(2Y,ke);1k.U=$(B).1N();1k.7Y=2X(B.2c.U);1k.2q=1P;eb(2Y,ke);dc.6g.17("G.H-1K").4i(dc.4c.4i());5l.2a.1G();5l.2a=1r;if($(B).IQ("G:5H.H-1K").2p().2h("H-am")){cz(2Y)}d9(2Y);x.hq.X(2Y,ke,1k.U);3m(u(){5l.v6=N},0)}})});dc.4r.4I(dc.4c).2x().1m("a8",u(e){k tr=$(e.1v).6T("tr.H-R");if(!tr.O){C}k Ek=cs(tr);x.1Z.2g(2Y,Ek).1e("H-R-8Y");e.54()}).1m("HA",u(e){k tr=$(e.1v).6T("tr.H-R");if(!tr.O){C}k En=cs(tr);x.1Z.2g(2Y,En).1x("H-R-8Y");e.54()}).1m("2e",u(e){k tt=$(e.1v);k tr=tt.6T("tr.H-R");if(!tr.O){C}k 7i=cs(tr);if(tt.2p().2h("H-1H-6x")){if(x.8f&&x.94){if(!x.aC){ep(2Y,Q)}gF(2Y,7i)}K{if(tt.is(":35")){gF(2Y,7i)}K{nd(2Y,7i)}}}K{k R=x.1Z.7I(2Y,7i);k td=tt.6T("td[29]",tr);if(td.O){k v4=td.1b("29");x.en.X(2Y,7i,v4,R[v4])}if(x.8f==Q){d5(2Y,7i)}K{if(tr.2h("H-R-1Q")){mL(2Y,7i)}K{d5(2Y,7i)}}x.85.X(2Y,7i,R)}e.54()}).1m("i1",u(e){k tt=$(e.1v);k tr=tt.6T("tr.H-R");if(!tr.O){C}k k7=cs(tr);k R=x.1Z.7I(2Y,k7);k td=tt.6T("td[29]",tr);if(td.O){k v7=td.1b("29");x.ei.X(2Y,k7,v7,R[v7])}x.ek.X(2Y,k7,R);e.54()}).1m("gt",u(e){k tr=$(e.1v).6T("tr.H-R");if(!tr.O){C}k v8=cs(tr);k R=x.1Z.7I(2Y,v8);x.sZ.X(2Y,e,v8,R);e.54()});dc.4c.1m("w7",u(){dc.am.17("G.H-1q").4q($(B).4q());dc.6g.17("G.H-1K,G.H-3u").4i($(B).4i())});u cs(tr){if(tr.1b("H-R-2K")){C 2X(tr.1b("H-R-2K"))}K{C tr.1b("19-id")}}};u d9(b4){k x=$.A(b4,"H").E;k dc=$.A(b4,"H").dc;if(!x.7Z){C}k fg=dc.6g.17("G.H-1K");k va=0;k jx;k fO=6S(b4,N);1h(k i=0;i<fO.O;i++){k 1k=5L(b4,fO[i]);if(vQ(1k)){va+=1k.U;jx=1k}}k Eo=fg.17("G.H-1K-3H").2F();k fy=fg.U()-fg.L("2s").U()-x.t7;k Ey=fy/va;if(!x.eX){Eo.2z()}1h(k i=0;i<fO.O;i++){k 1k=5L(b4,fO[i]);if(vQ(1k)){k uV=3v.L2(1k.U*Ey);uU(1k,uV);fy-=uV}}if(fy&&jx){uU(jx,fy)}eb(b4);u uU(1k,uX){1k.U+=uX;1k.7Y+=uX;fg.L("td[29=\\""+1k.29+"\\"] G.H-1H").U(1k.7Y)};u vQ(1k){if(!1k.4T&&!1k.2t&&!1k.2q){C Q}}};u IP(5y,cy){k x=$.A(5y,"H").E;k dc=$.A(5y,"H").dc;if(cy){a3(cy);if(x.7Z){cz(5y);d9(5y)}}K{k v0=N;k v1=6S(5y,Q).6v(6S(5y,N));1h(k i=0;i<v1.O;i++){k cy=v1[i];k 1k=5L(5y,cy);if(1k.2q){a3(cy);v0=Q}}if(v0&&x.7Z){cz(5y);d9(5y)}}u a3(aX){k fh=dc.1y.L("G.H-1K td[29=\\""+aX+"\\"] G.H-1H");fh.1l("U","");k 1k=$(5y).H("6E",aX);1k.U=1P;1k.7Y=1P;1k.2q=Q;$(5y).H("uq",aX);k uZ=3v.3h(fh.1N(),wL("9r"),wL("eW"));fh.3B(uZ);1k.U=uZ;1k.7Y=2X(fh[0].2c.U);$(5y).H("uq",aX);x.hq.X(5y,aX,1k.U);u wL(1I){k js=0;x.1Z.2g(5y,0,1I).L("td[29=\\""+aX+"\\"] G.H-1H").P(u(){k w=$(B).1N();if(js<w){js=w}});C js}}};u eb(7U,wP){k x=$.A(7U,"H").E;k dc=$.A(7U,"H").dc;k wQ=dc.1y.L("2s.H-kI,2s.H-sH");wQ.1l("2s-2m","L1");if(wP){f9(wP)}K{k ff=6S(7U,Q).6v(6S(7U,N));1h(k i=0;i<ff.O;i++){f9(ff[i])}}wQ.1l("2s-2m","2q");rX(7U);3m(u(){ab(7U);sL(7U)},0);u f9(EJ){k 1k=5L(7U,EJ);if(1k.2t){C}k jJ=dc.1y.17("2c")[0];k wF=jJ.EK?jJ.EK:(jJ.KD||2G.EA[2G.EA.O-1]);k wB=wF.KC||wF.wD;1h(k i=0,5z=wB.O;i<5z;i++){k 4F=wB[i];if(4F.Kf.ww()==1k.wA.ww()){4F.2c["U"]=1k.7Y?1k.7Y+"px":"2q";4A}}}};u rX(jG){k dc=$.A(jG,"H").dc;dc.4r.4I(dc.4c).L("td.H-td-Dl").P(u(){k td=$(B);k ED=td.1b("5v")||1;k wy=5L(jG,td.1b("29")).U;1h(k i=1;i<ED;i++){td=td.2B();wy+=5L(jG,td.1b("29")).U+1}$(B).17("G.H-1H").3B(wy)})};u sL(wI){k dc=$.A(wI,"H").dc;dc.1y.L("G.H-4E").P(u(){k 1H=$(B);k Fd=1H.2p().1b("29");k 1k=$(wI).H("6E",Fd);1H.3B(1k.U);k ed=$.A(B,"H.4j");if(ed.bi.23){ed.bi.23(ed.1v,1H.U())}})};u 5L(FP,Fe){u L(kh){if(kh){1h(k i=0;i<kh.O;i++){k cc=kh[i];1h(k j=0;j<cc.O;j++){k c=cc[j];if(c.29==Fe){C c}}}}C 1r};k x=$.A(FP,"H").E;k 1k=L(x.7V);if(!1k){1k=L(x.5u)}C 1k};u 6S(FR,FS){k x=$.A(FR,"H").E;k fk=(FS==Q)?(x.5u||[[]]):x.7V;if(fk.O==0){C[]}k kK=[];u FO(FT){k c=0;k i=0;7n(Q){if(kK[i]==1P){if(c==FT){C i}c++}i++}};u FI(r){k ff=[];k c=0;1h(k i=0;i<fk[r].O;i++){k 1k=fk[r][i];if(1k.29){ff.1i([c,1k.29])}c+=2X(1k.5v||"1")}1h(k i=0;i<ff.O;i++){ff[i][0]=FO(ff[i][0])}1h(k i=0;i<ff.O;i++){k f=ff[i];kK[f[0]]=f[1]}};1h(k i=0;i<fk.O;i++){FI(i)}C kK};u d7(5k,A){k cD=$.A(5k,"H");k x=cD.E;k dc=cD.dc;k l4=cD.7r;A=x.dp.X(5k,A);cD.A=A;if(A.3u){cD.3u=A.3u}if(!x.as){k 9d=5L(5k,x.5x);if(9d){k FL=9d.yr||u(a,b){C(a>b?1:-1)};A.1g.5f(u(r1,r2){C FL(r1[x.5x],r2[x.5x])*(x.7a=="dM"?1:-1)})}}if(x.1y.az){x.1y.az.X(x.1y,5k,A.1g)}x.1y.b1.X(x.1y,5k,dc.4c,N);x.1y.b1.X(x.1y,5k,dc.4r,Q);if(x.8e){x.1y.7D.X(x.1y,5k,dc.7w,N);x.1y.7D.X(x.1y,5k,dc.7u,Q)}if(x.1y.6z){x.1y.6z.X(x.1y,5k)}x.53.X(5k,A);k kW=$(5k).H("9g");if(kW.O){if(kW.1Y("E").3p!=A.3p){kW.1Y("64",{3p:A.3p})}}ab(5k);dc.4c.7l("w7");FV();$(5k).H("97");u FV(){if(x.2w){1h(k i=0;i<A.1g.O;i++){k R=A.1g[i];if(G4(R)){mM(5k,R[x.2w])}}}u G4(R){1h(k i=0;i<l4.O;i++){if(l4[i][x.2w]==R[x.2w]){l4[i]=R;C Q}}C N}}};u u2(vT,R){k x=$.A(vT,"H").E;k 1g=$.A(vT,"H").A.1g;if(2b R=="Bk"){C cm(1g,R)}K{1h(k i=0;i<1g.O;i++){if(1g[i][x.2w]==R){C i}}C-1}};u u5(fu){k x=$.A(fu,"H").E;k A=$.A(fu,"H").A;if(x.2w){C $.A(fu,"H").7r}K{k 1g=[];x.1Z.2g(fu,"","1Q",2).P(u(){k G5=2X($(B).1b("H-R-2K"));1g.1i(A.1g[G5])});C 1g}};u mM(l0,G6){k x=$.A(l0,"H").E;if(x.2w){k vV=u2(l0,G6);if(vV>=0){d5(l0,vV)}}};u d5(8R,co,G7){k l1=$.A(8R,"H");k dc=l1.dc;k x=l1.E;k A=l1.A;k cp=$.A(8R,"H").7r;if(x.8f){eh(8R);cp.4O(0,cp.O)}if(!G7&&x.aC){gF(8R,co,Q)}if(x.2w){k R=x.1Z.7I(8R,co);(u(){1h(k i=0;i<cp.O;i++){if(cp[i][x.2w]==R[x.2w]){C}}cp.1i(R)})()}x.4l.X(8R,co,A.1g[co]);k tr=x.1Z.2g(8R,co).1e("H-R-1Q");if(tr.O){k G2=dc.6g.17("G.H-1K").2j();k aQ=dc.4c;k 14=tr.4L().14-G2;if(14<=0){aQ.4q(aQ.4q()+14)}K{if(14+tr.2j()>aQ.V()-18){aQ.4q(aQ.4q()+14+tr.2j()-aQ.V()+18)}}}};u mL(aP,fr,G1){k kr=$.A(aP,"H");k dc=kr.dc;k x=kr.E;k A=kr.A;k FX=$.A(aP,"H").7r;if(!G1&&x.aC){nd(aP,fr,Q)}x.1Z.2g(aP,fr).1x("H-R-1Q");k R=x.1Z.7I(aP,fr);if(x.2w){gy(FX,x.2w,R[x.2w])}x.9z.X(aP,fr,R)};u sl(ca,FZ){k wa=$.A(ca,"H");k x=wa.E;k 1g=wa.A.1g;k kj=$.A(ca,"H").7r;if(!FZ&&x.aC){ns(ca,Q)}x.1Z.2g(ca,"","9r").1e("H-R-1Q");if(x.2w){1h(k kn=0;kn<1g.O;kn++){(u(){k R=1g[kn];1h(k i=0;i<kj.O;i++){if(kj[i][x.2w]==R[x.2w]){C}}kj.1i(R)})()}}x.bF.X(ca,1g)};u eh(c6,G0){k wo=$.A(c6,"H");k x=wo.E;k 1g=wo.A.1g;k FH=$.A(c6,"H").7r;if(!G0&&x.aC){ep(c6,Q)}x.1Z.2g(c6,"","1Q").1x("H-R-1Q");if(x.2w){1h(k kv=0;kv<1g.O;kv++){gy(FH,x.2w,1g[kv][x.2w])}}x.bE.X(c6,1g)};u gF(fq,fU,Fn){k wq=$.A(fq,"H");k x=wq.E;k A=wq.A;if(!Fn&&x.94){d5(fq,fU,Q)}k ck=x.1Z.2g(fq,fU).L("G.H-1H-6x 1L[1I=2t]");$.fn.4S?ck.4S("35",Q):ck.1b("35",Q);x.9M.X(fq,fU,A.1g[fU])};u nd(gp,gq,Fq){k wd=$.A(gp,"H");k x=wd.E;k A=wd.A;if(!Fq&&x.94){mL(gp,gq,Q)}k ck=x.1Z.2g(gp,gq).L("G.H-1H-6x 1L[1I=2t]");$.fn.4S?ck.4S("35",N):ck.1b("35",N);x.mQ.X(gp,gq,A.1g[gq])};u ns(gr,Fm){k wf=$.A(gr,"H");k x=wf.E;k A=wf.A;if(!Fm&&x.94){sl(gr,Q)}k wh=x.1Z.2g(gr,"","9r").L("G.H-1H-6x 1L[1I=2t]");$.fn.4S?wh.4S("35",Q):wh.1b("35",Q);x.nq.X(gr,A.1g)};u ep(gs,Fg){k uY=$.A(gs,"H");k x=uY.E;k A=uY.A;if(!Fg&&x.94){eh(gs,Q)}k sM=x.1Z.2g(gs,"","9r").L("G.H-1H-6x 1L[1I=2t]");$.fn.4S?sM.4S("35",N):sM.1b("35",N);x.mH.X(gs,A.1g)};u I6(8K,c3){k x=$.A(8K,"H").E;k tr=x.1Z.2g(8K,c3);k R=x.1Z.7I(8K,c3);if(tr.2h("H-R-gz")){C}if(x.9Q.X(8K,c3,R)==N){C}tr.1e("H-R-gz");Ft(8K,c3);sL(8K);tr.L("G.H-4E").P(u(){k Ff=$(B).2p().1b("29");k ed=$.A(B,"H.4j");ed.bi.2S(ed.1v,R[Ff])});e4(8K,c3)};u ej(6J,8J,sJ){k x=$.A(6J,"H").E;k uz=$.A(6J,"H").j4;k Fi=$.A(6J,"H").8L;k tr=x.1Z.2g(6J,8J);k R=x.1Z.7I(6J,8J);if(!tr.2h("H-R-gz")){C}if(!sJ){if(!e4(6J,8J)){C}k sN=N;k sC={};tr.L("G.H-4E").P(u(){k i5=$(B).2p().1b("29");k ed=$.A(B,"H.4j");k i4=ed.bi.3A(ed.1v);if(R[i5]!=i4){R[i5]=i4;sN=Q;sC[i5]=i4}});if(sN){if(cm(Fi,R)==-1){if(cm(uz,R)==-1){uz.1i(R)}}}}tr.1x("H-R-gz");FD(6J,8J);$(6J).H("aG",8J);if(!sJ){x.9X.X(6J,8J,R,sC)}K{x.9Z.X(6J,8J,R)}};u sy(sB,Fj){k x=$.A(sB,"H").E;k tr=x.1Z.2g(sB,Fj);k sE=[];tr.17("td").P(u(){k 1H=$(B).L("G.H-4E");if(1H.O){k ed=$.A(1H[0],"H.4j");sE.1i(ed)}});C sE};u I1(Fs,sG){k hY=sy(Fs,sG.2K);1h(k i=0;i<hY.O;i++){if(hY[i].29==sG.29){C hY[i]}}C 1r};u Ft(gB,t3){k x=$.A(gB,"H").E;k tr=x.1Z.2g(gB,t3);tr.17("td").P(u(){k 1H=$(B).L("G.H-1H");k t5=$(B).1b("29");k 1k=5L(gB,t5);if(1k&&1k.4j){k gu,sS;if(2b 1k.4j=="2r"){gu=1k.4j}K{gu=1k.4j.1I;sS=1k.4j.E}k ia=x.Jd[gu];if(ia){k FB=1H.1F();k FC=1H.1N();1H.1e("H-4E");1H.3B(FC);1H.1F("<2s 2W=\\"0\\" 6e=\\"0\\" 65=\\"1\\"><tr><td></td></tr></2s>");1H.17("2s").1b("6L",1k.6L);1H.17("2s").1m("2e i1 gt",u(e){e.54()});$.A(1H[0],"H.4j",{bi:ia,1v:ia.33(1H.L("td"),sS),29:t5,1I:gu,FF:FB})}}});ab(gB,t3,Q)};u FD(t6,FE){k x=$.A(t6,"H").E;k tr=x.1Z.2g(t6,FE);tr.17("td").P(u(){k 1H=$(B).L("G.H-4E");if(1H.O){k ed=$.A(1H[0],"H.4j");if(ed.bi.2L){ed.bi.2L(ed.1v)}1H.1F(ed.FF);$.Ke(1H[0],"H.4j");1H.1x("H-4E");1H.1l("U","")}})};u e4(sV,Fv){k tr=$.A(sV,"H").E.1Z.2g(sV,Fv);if(!tr.2h("H-R-gz")){C Q}k t0=tr.L(".1T-1w");t0.1T("7S");t0.8D("5h");k Fy=tr.L(".1T-ce");C Fy.O==0};u Id(hG,gw){k rQ=$.A(hG,"H").8L;k sz=$.A(hG,"H").fY;k s5=$.A(hG,"H").j4;if(!gw){k 1g=[];1g=1g.6v(rQ);1g=1g.6v(sz);1g=1g.6v(s5);C 1g}K{if(gw=="Kd"){C rQ}K{if(gw=="Kg"){C sz}K{if(gw=="Kh"){C s5}}}}C[]};u Ij(8r,gi){k x=$.A(8r,"H").E;k A=$.A(8r,"H").A;k s4=$.A(8r,"H").8L;k D4=$.A(8r,"H").fY;k D6=$.A(8r,"H").7r;$(8r).H("bz",gi);k R=A.1g[gi];if(cm(s4,R)>=0){gy(s4,R)}K{D4.1i(R)}gy(D6,x.2w,A.1g[gi][x.2w]);x.1y.w1.X(x.1y,8r,gi);if(x.V=="2q"){ab(8r)}};u Io(hz,hC){k 1y=$.A(hz,"H").E.1y;k D7=$.A(hz,"H").8L;1y.mm.X(1y,hz,hC.2K,hC.R);D7.1i(hC.R)};u In(hV,R){k 1y=$.A(hV,"H").E.1y;k D3=$.A(hV,"H").8L;1y.mm.X(1y,hV,1r,R);D3.1i(R)};u d6(cn){k A=$.A(cn,"H").A;k 1g=A.1g;k s9=[];1h(k i=0;i<1g.O;i++){s9.1i($.1d({},1g[i]))}$.A(cn,"H").sd=s9;$.A(cn,"H").j4=[];$.A(cn,"H").8L=[];$.A(cn,"H").fY=[]};u Ig(gh){k A=$.A(gh,"H").A;k ok=Q;1h(k i=0,5z=A.1g.O;i<5z;i++){if(e4(gh,i)){ej(gh,i,N)}K{ok=N}}if(ok){d6(gh)}};u IT(6P){k x=$.A(6P,"H").E;k Da=$.A(6P,"H").sd;k D0=$.A(6P,"H").8L;k CY=$.A(6P,"H").fY;k g2=$.A(6P,"H").7r;k A=$.A(6P,"H").A;1h(k i=0;i<A.1g.O;i++){ej(6P,i,Q)}k hU=[];1h(k i=0;i<g2.O;i++){hU.1i(g2[i][x.2w])}g2.4O(0,g2.O);A.3p+=CY.O-D0.O;A.1g=Da;d7(6P,A);1h(k i=0;i<hU.O;i++){mM(6P,hU[i])}d6(6P)};u d8(6Q,rR){k x=$.A(6Q,"H").E;if(rR){x.9V=rR}k g4=$.1d({},x.9V);if(x.1Y){$.1d(g4,{lU:x.2J,1g:x.34})}if(x.5x){$.1d(g4,{5f:x.5x,Hu:x.7a})}if(x.74.X(6Q,g4)==N){C}$(6Q).H("4b");3m(u(){Dj()},0);u Dj(){k Di=x.8s.X(6Q,g4,u(A){3m(u(){$(6Q).H("6A")},0);d7(6Q,A);3m(u(){d6(6Q)},0)},u(){3m(u(){$(6Q).H("6A")},0);x.77.4V(6Q,5r)});if(Di==N){$(6Q).H("6A")}}};u Js(g0,4g){k x=$.A(g0,"H").E;k 1g=$.A(g0,"H").A.1g;4g.6C=4g.6C||1;4g.5v=4g.5v||1;if(4g.2K<0||4g.2K>=1g.O){C}if(4g.6C==1&&4g.5v==1){C}k hM=1g[4g.2K][4g.29];k tr=x.1Z.2g(g0,4g.2K);k td=tr.L("td[29=\\""+4g.29+"\\"]");td.1b("6C",4g.6C).1b("5v",4g.5v);td.1e("H-td-Dl");1h(k i=1;i<4g.5v;i++){td=td.2B();td.2z();1g[4g.2K][td.1b("29")]=hM}1h(k i=1;i<4g.6C;i++){tr=tr.2B();k td=tr.L("td[29=\\""+4g.29+"\\"]").2z();1g[4g.2K+i][td.1b("29")]=hM;1h(k j=1;j<4g.5v;j++){td=td.2B();td.2z();1g[4g.2K+i][td.1b("29")]=hM}}rX(g0)};$.fn.H=u(bh,Dh){if(2b bh=="2r"){C $.fn.H.1J[bh](B,Dh)}bh=bh||{};C B.P(u(){k fZ=$.A(B,"H");k x;if(fZ){x=$.1d(fZ.E,bh);fZ.E=x}K{x=$.1d({},$.1d({},$.fn.H.1u,{9V:{}}),$.fn.H.1o(B),bh);$(B).1l("U","").1l("V","");k fX=Dg(B,x.5B);if(!x.7V){x.7V=fX.7V}if(!x.5u){x.5u=fX.5u}$.A(B,"H",{E:x,J:fX.J,dc:fX.dc,7r:[],A:{3p:0,1g:[]},sd:[],j4:[],8L:[],fY:[]})}Dc(B);if(!fZ){k A=De(B);if(A.3p>0){d7(B,A);d6(B)}}a3(B);d8(B);Df(B)})};k J8={1w:{33:u(CB,Kj){k CD=$("<1L 1I=\\"1w\\" Y=\\"H-4E-1L\\">").1t(CB);C CD},3A:u(CF){C $(CF).1n()},2S:u(CA,Cu){$(CA).1n(Cu)},23:u(Cv,Cw){$(Cv).3B(Cw)}},av:{33:u(Cy,Ki){k Cx=$("<av Y=\\"H-4E-1L\\"></av>").1t(Cy);C Cx},3A:u(CH){C $(CH).1n()},2S:u(CP,CR){$(CP).1n(CR)},23:u(CS,CT){$(CS).3B(CT)}},2t:{33:u(CO,tW){k j9=$("<1L 1I=\\"2t\\">").1t(CO);j9.1n(tW.on);j9.1b("CK",tW.wW);C j9},3A:u(jb){if($(jb).is(":35")){C $(jb).1n()}K{C $(jb).1b("CK")}},2S:u(jd,CL){k iU=N;if($(jd).1n()==CL){iU=Q}$.fn.4S?$(jd).4S("35",iU):$(jd).1b("35",iU)}},2E:{33:u(CM,Dn){k ud=$("<1L 1I=\\"1w\\" Y=\\"H-4E-1L\\">").1t(CM);ud.2E(Dn);C ud},2L:u(E0){$(E0).2E("2L")},3A:u(DZ){C $(DZ).2E("3A")},2S:u(E1,E3){$(E1).2E("2S",E3)},23:u(DY,DX){$(DY).3B(DX)}},1T:{33:u(DT,DS){k ug=$("<1L 1I=\\"1w\\" Y=\\"H-4E-1L\\">").1t(DT);ug.1T(DS);C ug},2L:u(DW){$(DW).1T("2L")},3A:u(E4){C $(E4).1n()},2S:u(Ee,Ef){$(Ee).1n(Ef)},23:u(Eg,Ec){$(Eg).3B(Ec)}},2k:{33:u(E6,E8){k tA=$("<1L 1I=\\"1w\\">").1t(E6);tA.2k(E8);C tA},2L:u(E9){$(E9).2k("2L")},3A:u(Ea){C $(Ea).2k("3A")},2S:u(DR,DQ){$(DR).2k("2S",DQ)},23:u(Dy,Dx){$(Dy).2k("23",Dx)}},1R:{33:u(Dz,DA){k tl=$("<1L 1I=\\"1w\\">").1t(Dz);tl.1R(DA||{});C tl},2L:u(Dr){$(Dr).1R("2L")},3A:u(Du){C $(Du).1R("3A")},2S:u(DL,DN){$(DL).1R("2S",DN)},23:u(DO,DP){$(DO).1R("23",DP)}},2R:{33:u(DK,G9){k tE=$("<1L 1I=\\"1w\\">").1t(DK);tE.2R(G9);C tE},2L:u(DE){$(DE).2R("2L")},3A:u(DG){C $(DG).2R("3A")},2S:u(DI,G8){$(DI).2R("2S",G8)},23:u(GC,IB){$(GC).2R("23",IB)}}};$.fn.H.1J={E:u(jq){k ID=$.A(jq[0],"H").E;k a7=$.A(jq[0],"H").J.J("E");k x=$.1d(ID,{U:a7.U,V:a7.V,3b:a7.3b,2C:a7.2C,5Z:a7.5Z,5b:a7.5b});k tQ=jq.H("9g");if(tQ.O){k tm=tQ.1Y("E");$.1d(x,{2J:tm.2J,34:tm.34})}C x},5p:u(jq){C $.A(jq[0],"H").J},9g:u(jq){C $.A(jq[0],"H").J.17("G.H-a4")},6a:u(jq,Iz){C 6S(jq[0],Iz)},6E:u(jq,Iy){C 5L(jq[0],Iy)},23:u(jq,It){C jq.P(u(){a3(B,It)})},8l:u(jq,Iu){C jq.P(u(){k x=$(B).H("E");x.2J=1;k Is=$(B).H("9g");Is.1Y({2J:1});d8(B,Iu)})},gJ:u(jq,Iv){C jq.P(u(){d8(B,Iv)})},xM:u(jq,tp){C jq.P(u(){k x=$.A(B,"H").E;k dc=$.A(B,"H").dc;if(tp){$.A(B,"H").3u=tp}if(x.8e){x.1y.7D.X(x.1y,B,dc.7w,N);x.1y.7D.X(x.1y,B,dc.7u,Q);if(x.1y.6z){x.1y.6z.X(x.1y,B)}$(B).H("7h")}})},4b:u(jq){C jq.P(u(){k x=$.A(B,"H").E;$(B).H("9g").1Y("4b");if(x.9G){k nf=$(B).H("5p");$("<G Y=\\"H-3w\\" 2c=\\"3q:5w\\"></G>").1t(nf);k 4m=$("<G Y=\\"H-3w-4m\\" 2c=\\"3q:5w\\"></G>").1F(x.9G).1t(nf);4m.1l("Z",(nf.U()-4m.1N())/2)}})},6A:u(jq){C jq.P(u(){$(B).H("9g").1Y("6A");k un=$(B).H("5p");un.17("G.H-3w-4m").1G();un.17("G.H-3w").1G()})},7Z:u(jq){C jq.P(u(){d9(B)})},uq:u(jq,IF){C jq.P(u(){eb(B,IF)})},7h:u(jq,IG){C jq.P(u(){ab(B,IG)})},97:u(jq,IO){C jq.P(u(){IP(B,IO)})},bT:u(jq,A){C jq.P(u(){d7(B,A);d6(B)})},9A:u(jq){C $.A(jq[0],"H").A},9U:u(jq){C $.A(jq[0],"H").A.1g},xI:u(jq){C $.A(jq[0],"H").3u},u4:u(jq,id){C u2(jq[0],id)},h1:u(jq){k rr=[];k 1g=jq.H("9U");k dc=$.A(jq[0],"H").dc;dc.1y.L("G.H-1H-6x 1L:35").P(u(){k IR=$(B).IQ("tr.H-R:5H").1b("H-R-2K");rr.1i(1g[IR])});C rr},dg:u(jq){k 1g=u5(jq[0]);C 1g.O>0?1g[0]:1r},lF:u(jq){C u5(jq[0])},eH:u(jq){C jq.P(u(){k te=$.A(B,"H").7r;te.4O(0,te.O);eh(B)})},Kc:u(jq){C jq.P(u(){sl(B)})},Kb:u(jq){C jq.P(u(){eh(B)})},gV:u(jq,IN){C jq.P(u(){d5(B,IN)})},K6:u(jq,id){C jq.P(u(){mM(B,id)})},xY:u(jq,IM){C jq.P(u(){mL(B,IM)})},K5:u(jq,IJ){C jq.P(u(){gF(B,IJ)})},K4:u(jq,IL){C jq.P(u(){nd(B,IL)})},K7:u(jq){C jq.P(u(){ns(B)})},K8:u(jq){C jq.P(u(){ep(B)})},gS:u(jq,I8){C jq.P(u(){I6(B,I8)})},gT:u(jq,Ia){C jq.P(u(){ej(B,Ia,N)})},bz:u(jq,I5){C jq.P(u(){ej(B,I5,Q)})},tN:u(jq,HZ){C sy(jq[0],HZ)},Ka:u(jq,I3){C I1(jq[0],I3)},aG:u(jq,I2){C jq.P(u(){k x=$.A(B,"H").E;x.1y.aG.X(x.1y,B,I2)})},GH:u(jq,Ib){C e4(jq[0],Ib)},lW:u(jq,vX){C jq.P(u(){k x=$.A(B,"H").E;x.1y.lW.X(x.1y,B,vX.2K,vX.R)})},K9:u(jq,R){C jq.P(u(){In(B,R)})},mm:u(jq,Ip){C jq.P(u(){Io(B,Ip)})},w1:u(jq,IU){C jq.P(u(){Ij(B,IU)})},Kk:u(jq,If){C Id(jq[0],If)},Kl:u(jq){C jq.P(u(){Ig(B)})},Kx:u(jq){C jq.P(u(){IT(B)})},Kw:u(jq,Jt){C jq.P(u(){Js(B,Jt)})},Kv:u(jq,uC){C jq.P(u(){k Ju=$(B).H("5p");Ju.L("td[29=\\""+uC+"\\"]").2F();$(B).H("6E",uC).4T=N;$(B).H("7Z")})},Ky:u(jq,uR){C jq.P(u(){k Jr=$(B).H("5p");Jr.L("td[29=\\""+uR+"\\"]").2z();$(B).H("6E",uR).4T=Q;$(B).H("7Z")})}};$.fn.H.1o=u(lh){k t=$(lh);C $.1d({},$.fn.J.1o(lh),$.1V.1o(lh,["2N","3z","2w","5x","7a","mz",{7Z:"1S",dU:"1S",lK:"1S",dr:"1S"},{5B:"1S",8f:"1S",aC:"1S",94:"1S"},{1Y:"1S",34:"2O",2J:"2O"},{as:"1S",eX:"1S",8e:"1S"},{t7:"2O"}]),{5E:(t.1b("5E")?4U(t.1b("5E")):1P),9G:(t.1b("9G")!=1P?t.1b("9G"):1P),5G:(t.1b("5G")?4U(t.1b("5G")):1P)})};k J9={b1:u(e5,Jo,e2){k ll=$.A(e5,"H");k x=ll.E;k 1g=ll.A.1g;k Jl=$(e5).H("6a",e2);if(e2){if(!(x.5B||(x.5u&&x.5u.O))){C}}k di=["<2s Y=\\"H-kI\\" 6e=\\"0\\" 65=\\"0\\" 2W=\\"0\\"><3c>"];1h(k i=0;i<1g.O;i++){k 4M=(i%2&&x.lK)?"Y=\\"H-R H-R-GZ\\"":"Y=\\"H-R\\"";k uO=x.5G?x.5G.X(e5,i,1g[i]):"";k Jm=uO?"2c=\\""+uO+"\\"":"";k Jq=ll.dI+"-"+(e2?1:2)+"-"+i;di.1i("<tr id=\\""+Jq+"\\" H-R-2K=\\""+i+"\\" "+4M+" "+Jm+">");di.1i(B.88.X(B,e5,Jl,e2,i,1g[i]));di.1i("</tr>")}di.1i("</3c></2s>");$(Jo).1F(di.3R(""))},7D:u(e0,JF,vJ){k x=$.A(e0,"H").E;k 1g=$.A(e0,"H").3u||[];k Jz=$(e0).H("6a",vJ);k df=["<2s Y=\\"H-sH\\" 6e=\\"0\\" 65=\\"0\\" 2W=\\"0\\"><3c>"];1h(k i=0;i<1g.O;i++){df.1i("<tr Y=\\"H-R\\" H-R-2K=\\""+i+"\\">");df.1i(B.88.X(B,e0,Jz,vJ,i,1g[i]));df.1i("</tr>")}df.1i("</3c></2s>");$(JF).1F(df.3R(""))},88:u(vi,vm,JB,lo,8N){k x=$.A(vi,"H").E;k cc=[];if(JB&&x.5B){k vd=lo+1;if(x.1Y){vd+=(x.2J-1)*x.34}cc.1i("<td Y=\\"H-td-87\\"><G Y=\\"H-1H-87\\">"+vd+"</G></td>")}1h(k i=0;i<vm.O;i++){k 8b=vm[i];k 1k=$(vi).H("6E",8b);if(1k){k lt=1k.6K?(1k.6K(8N[8b],8N,lo)||""):"";k 8O=1k.4T?"2c=\\"3q:5e;"+lt+"\\"":(lt?"2c=\\""+lt+"\\"":"");cc.1i("<td 29=\\""+8b+"\\" "+8O+">");if(1k.2t){k 8O=""}K{k 8O="";8O+="1w-6L:"+(1k.6L||"Z")+";";if(!x.dr){8O+="yB-yy:75;V:2q;"}K{if(x.dU){8O+="V:2q;"}}}cc.1i("<G 2c=\\""+8O+"\\" ");if(1k.2t){cc.1i("Y=\\"H-1H-6x ")}K{cc.1i("Y=\\"H-1H "+1k.iy)}cc.1i("\\">");if(1k.2t){cc.1i("<1L 1I=\\"2t\\" 1C=\\""+8b+"\\" 1A=\\""+(8N[8b]!=1P?8N[8b]:"")+"\\"/>")}K{if(1k.3t){cc.1i(1k.3t(8N[8b],8N,lo))}K{cc.1i(8N[8b])}}cc.1i("</G>");cc.1i("</td>")}}C cc.3R("")},aG:u(f7,vA){k R={};k vN=$(f7).H("6a",Q).6v($(f7).H("6a",N));1h(k i=0;i<vN.O;i++){R[vN[i]]=1P}k 1g=$(f7).H("9U");$.1d(R,1g[vA]);B.lW.X(B,f7,vA,R)},lW:u(au,5X,R){k x=$.A(au,"H").E;k 1g=$(au).H("9U");k tr=x.1Z.2g(au,5X);1h(k 93 in R){1g[5X][93]=R[93];k td=tr.17("td[29=\\""+93+"\\"]");k 1H=td.L("G.H-1H");k 1k=$(au).H("6E",93);if(1k){k mt=1k.6K?1k.6K(1g[5X][93],1g[5X],5X):"";td.1b("2c",mt||"");if(1k.4T){td.2z()}if(1k.3t){1H.1F(1k.3t(1g[5X][93],1g[5X],5X))}K{1H.1F(1g[5X][93])}}}k mt=x.5G?x.5G.X(au,5X,1g[5X]):"";tr.1b("2c",mt||"");$(au).H("7h",5X)},mm:u(5s,5a,R){k x=$.A(5s,"H").E;k dc=$.A(5s,"H").dc;k A=$.A(5s,"H").A;if(5a==1P||5a==1r){5a=A.1g.O}if(5a>A.1g.O){5a=A.1g.O}1h(k i=A.1g.O-1;i>=5a;i--){x.1Z.2g(5s,i,"1q",2).1b("H-R-2K",i+1);k tr=x.1Z.2g(5s,i,"1q",1).1b("H-R-2K",i+1);if(x.5B){tr.L("G.H-1H-87").1F(i+2)}}k JD=$(5s).H("6a",Q);k J3=$(5s).H("6a",N);k 3x="<tr Y=\\"H-R\\" H-R-2K=\\""+5a+"\\">"+B.88.X(B,5s,JD,Q,5a,R)+"</tr>";k 3S="<tr Y=\\"H-R\\" H-R-2K=\\""+5a+"\\">"+B.88.X(B,5s,J3,N,5a,R)+"</tr>";if(5a>=A.1g.O){if(A.1g.O){x.1Z.2g(5s,"","52",1).ay(3x);x.1Z.2g(5s,"","52",2).ay(3S)}K{dc.4r.1F("<2s 6e=\\"0\\" 65=\\"0\\" 2W=\\"0\\"><3c>"+3x+"</3c></2s>");dc.4c.1F("<2s 6e=\\"0\\" 65=\\"0\\" 2W=\\"0\\"><3c>"+3S+"</3c></2s>")}}K{x.1Z.2g(5s,5a+1,"1q",1).eT(3x);x.1Z.2g(5s,5a+1,"1q",2).eT(3S)}A.3p+=1;A.1g.4O(5a,0,R);B.aG.X(B,5s,5a)},w1:u(cO,mx){k x=$.A(cO,"H").E;k A=$.A(cO,"H").A;x.1Z.2g(cO,mx).1G();1h(k i=mx+1;i<A.1g.O;i++){x.1Z.2g(cO,i,"1q",2).1b("H-R-2K",i-1);k 3x=x.1Z.2g(cO,i,"1q",1).1b("H-R-2K",i-1);if(x.5B){3x.L("G.H-1H-87").1F(i)}}A.3p-=1;A.1g.4O(mx,1)},az:u(Kz,1g){},6z:u(wJ){k x=$.A(wJ,"H").E;if(x.8e){k J5=$(wJ).H("5p").L("G.H-3u");J5.L("G.H-1H-87,G.H-1H-6x").1l("KB","4T")}}};$.fn.H.1u=$.1d({},$.fn.J.1u,{5u:1P,7V:1P,7Z:N,dU:Q,3z:1r,lK:N,8x:"mw",dr:Q,2w:1r,2N:1r,9G:"KA, Ku Kt ...",5B:N,8f:N,94:Q,aC:Q,1Y:N,mz:"7R",2J:1,34:10,5E:[10,20,30,40,50],9V:{},5x:1r,7a:"dM",as:Q,eX:Q,8e:N,t7:18,5G:u(Ko,Kn){},8s:u(Jh,Ji,Je){k x=$(B).H("E");if(!x.2N){C N}$.9T({1I:x.8x,2N:x.2N,A:Jh,dy:"ds",8v:u(A){Ji(A)},b9:u(){Je.4V(B,5r)}})},dp:u(A){if(2b A.O=="2O"&&2b A.4O=="u"){C{3p:A.O,1g:A}}K{C A}},Jd:J8,1Z:{2g:u(lZ,cM,1I,71){1I=1I||"1q";71=71||0;k m0=$.A(lZ,"H");k dc=m0.dc;k x=m0.E;if(71==0){k 3x=x.1Z.2g(lZ,cM,1I,1);k 3S=x.1Z.2g(lZ,cM,1I,2);C 3x.4I(3S)}K{if(1I=="1q"){k tr=$("#"+m0.dI+"-"+71+"-"+cM);if(!tr.O){tr=(71==1?dc.4r:dc.4c).L(">2s>3c>tr[H-R-2K="+cM+"]")}C tr}K{if(1I=="3u"){C(71==1?dc.7u:dc.7w).L(">2s>3c>tr[H-R-2K="+cM+"]")}K{if(1I=="1Q"){C(71==1?dc.4r:dc.4c).L(">2s>3c>tr.H-R-1Q")}K{if(1I=="52"){C(71==1?dc.4r:dc.4c).L(">2s>3c>tr:52[H-R-2K]")}K{if(1I=="9r"){C(71==1?dc.4r:dc.4c).L(">2s>3c>tr[H-R-2K]")}K{if(1I=="eW"){C(71==1?dc.7u:dc.7w).L(">2s>3c>tr[H-R-2K]")}}}}}}}},7I:u(Ja,Jb){C $.A(Ja,"H").A.1g[Jb]}},1y:J9,74:u(Km){},53:u(){},77:u(){},85:u(Kp,Kq){},ek:u(Ks,Kr){},en:u(Lc,Ld,LZ){},ei:u(LY,LX,M0){},mJ:u(5f,M1){},hq:u(M3,M2){},4l:u(LW,LV){},9z:u(LQ,LP){},bF:u(1g){},bE:u(1g){},9M:u(LO,LR){},mQ:u(LS,LU){},nq:u(1g){},mH:u(1g){},9Q:u(LT,M4){},9X:u(M5,Mg,Mf){},9Z:u(Mh,Mi){},GL:u(e,Mk){},sZ:u(e,Mj,Me){}})})(2T);(u($){u GF(9j){k x=$.A(9j,"59").E;$(9j).H($.1d({},x,{4M:"59",1y:(x.si?GP:1P),85:u(cS,R){if(x.ez!=cS&&R.4j){k 1k=$(B).H("6E","1A");1k.4j=R.4j;tR(x.ez);$(B).H("gS",cS);$(B).H("tN",cS)[0].1v.5o();x.ez=cS}x.85.X(9j,cS,R)},53:u(A){$(9j).H("5p").L("G.H-5t").1l("2W","0");x.53.X(9j,A)}}));$(9j).H("5p").L("G.H-1q").2x(".59").1m("5q.59",u(e){e.54()});$(2G).2x(".59").1m("5q.59",u(){tR(x.ez);x.ez=1P});u tR(d0){if(d0==1P){C}k t=$(9j);t.H("tN",d0)[0].1v.6Z();if(t.H("GH",d0)){t.H("gT",d0)}K{t.H("bz",d0)}}};$.fn.59=u(9m,tB){if(2b 9m=="2r"){k tP=$.fn.59.1J[9m];if(tP){C tP(B,tB)}K{C B.H(9m,tB)}}9m=9m||{};C B.P(u(){k tn=$.A(B,"59");if(tn){$.1d(tn.E,9m)}K{$.A(B,"59",{E:$.1d({},$.fn.59.1u,$.fn.59.1o(B),9m)})}GF(B)})};$.fn.59.1J={};$.fn.59.1o=u(lj){k t=$(lj);C $.1d({},$.fn.H.1o(lj),$.1V.1o(lj,[{si:"1S"}]))};k GP=$.1d({},$.fn.H.1u.1y,{b1:u(cV,GR,ev){k lA=$.A(cV,"H");k x=lA.E;k 1g=lA.A.1g;k GV=$(cV).H("6a",ev);k 4J=[];k 9Y=0;k ti=B.Gk;1h(k i=0;i<ti.O;i++){k dm=ti[i];4J.1i("<G Y=\\"H-5t\\" 5t-2K="+i+" 2c=\\"V:GT;GY:4T;2W-7R:Md M8 #M7;\\">");4J.1i("<2s 6e=\\"0\\" 65=\\"0\\" 2W=\\"0\\" 2c=\\"V:4Z%\\"><3c>");4J.1i("<tr>");4J.1i("<td 2c=\\"2W:0;\\">");if(!ev){4J.1i("<1a 2c=\\"M6:#M9;Ma-Mc:Mb;\\">");4J.1i(x.Ga.X(cV,dm.u3,dm.1g));4J.1i("</1a>")}4J.1i("</td>");4J.1i("</tr>");4J.1i("</3c></2s>");4J.1i("</G>");4J.1i("<2s Y=\\"H-kI\\" 6e=\\"0\\" 65=\\"0\\" 2W=\\"0\\"><3c>");1h(k j=0;j<dm.1g.O;j++){k 4M=(9Y%2&&x.lK)?"Y=\\"H-R H-R-GZ\\"":"Y=\\"H-R\\"";k ui=x.5G?x.5G.X(cV,9Y,dm.1g[j]):"";k GW=ui?"2c=\\""+ui+"\\"":"";k H1=lA.dI+"-"+(ev?1:2)+"-"+9Y;4J.1i("<tr id=\\""+H1+"\\" H-R-2K=\\""+9Y+"\\" "+4M+" "+GW+">");4J.1i(B.88.X(B,cV,GV,ev,9Y,dm.1g[j]));4J.1i("</tr>");9Y++}4J.1i("</3c></2s>")}$(GR).1F(4J.3R(""))},6z:u(bx){k x=$.A(bx,"H").E;k dc=$.A(bx,"H").dc;k 1y=dc.1y;k GQ=dc.am;k GS=dc.6g;$.fn.H.1u.1y.6z.X(B,bx);if(x.5B||x.5u.O){k us=GQ.L("G.H-5t")}K{k us=GS.L("G.H-5t")}$("<td 2c=\\"2W:0\\"><G Y=\\"H-R-n8 H-R-37\\" 2c=\\"U:GT;V:LN;4e:gk\\"></G></td>").aO(us.L("td"));1y.L("G.H-5t").P(u(){k GU=$(B).1b("5t-2K");$(B).L("G.H-R-n8").1m("2e",{ue:GU},u(e){if($(B).2h("H-R-37")){$(bx).H("Gg",e.A.ue)}K{$(bx).H("Gl",e.A.ue)}})})},az:u(ub,1g){k x=$.A(ub,"H").E;k aj=[];1h(k i=0;i<1g.O;i++){k R=1g[i];k 9o=GB(R[x.sf]);if(!9o){9o={u3:R[x.sf],1g:[R],LM:i};aj.1i(9o)}K{9o.1g.1i(R)}}u GB(Gh){1h(k i=0;i<aj.O;i++){k tY=aj[i];if(tY.u3==Gh){C tY}}C 1r};B.Gk=aj;k uc=[];1h(k i=0;i<aj.O;i++){k 9o=aj[i];1h(k j=0;j<9o.1g.O;j++){uc.1i(9o.1g[j])}}$.A(ub,"H").A.1g=uc}});$.1d($.fn.H.1J,{Gl:u(jq,u6){C jq.P(u(){k 1y=$.A(B,"H").dc.1y;if(u6!=1P){k mZ=1y.L("G.H-5t[5t-2K=\\""+u6+"\\"]")}K{k mZ=1y.L("G.H-5t")}k u8=mZ.L("G.H-R-n8");if(u8.2h("H-R-36")){u8.1x("H-R-36").1e("H-R-37");mZ.2B("2s").2F()}$(B).H("7h")})},Gg:u(jq,sk){C jq.P(u(){k 1y=$.A(B,"H").dc.1y;if(sk!=1P){k mN=1y.L("G.H-5t[5t-2K=\\""+sk+"\\"]")}K{k mN=1y.L("G.H-5t")}k sm=mN.L("G.H-R-n8");if(sm.2h("H-R-37")){sm.1x("H-R-37").1e("H-R-36");mN.2B("2s").2z()}$(B).H("7h")})}});$.fn.59.1u=$.1d({},$.fn.H.1u,{8f:Q,as:N,7Z:Q,9G:"",5u:[[{29:"f",U:16,2D:N}]],7V:[[{29:"1C",2f:"Lp",U:4Z,sj:Q},{29:"1A",2f:"Lo",U:4Z,2D:N}]],si:N,sf:"5t",Ga:u(Gc,1g){C Gc}})})(2T);(u($){u Ge(a,o){1h(k i=0,5z=a.O;i<5z;i++){if(a[i]==o){C i}}C-1};u lu(a,o){k su=Ge(a,o);if(su!=-1){a.4O(su,1)}};u xO(2H){k x=$.A(2H,"1B").E;$(2H).H($.1d({},x,{2N:1r,8s:u(){C N},53:u(){},hq:u(Gm,Gn){95(2H);x.hq.X(2H,Gm,Gn)},mJ:u(5f,rU){x.5x=5f;x.7a=rU;if(x.as){bP(2H)}K{k A=$(2H).1B("9A");h2(2H,0,A)}x.mJ.X(2H,5f,rU)},9Q:u(Ln,R){if(x.9Q.X(2H,R)==N){C N}},9X:u(Lq,R,Gv){x.9X.X(2H,R,Gv)},9Z:u(Lr,R){x.9Z.X(2H,R)},4l:u(Gx){x.4l.X(2H,L(2H,Gx))},9z:u(Gy){x.9z.X(2H,L(2H,Gy))},bF:u(){x.bF.X(2H,$.A(2H,"1B").A)},bE:u(){x.bE.X(2H,$.A(2H,"1B").A)},9M:u(Gu){x.9M.X(2H,L(2H,Gu))},mQ:u(Gt){x.mQ.X(2H,L(2H,Gt))},nq:u(){x.nq.X(2H,$.A(2H,"1B").A)},mH:u(){x.mH.X(2H,$.A(2H,"1B").A)},85:u(Gp){x.85.X(2H,L(2H,Gp))},ek:u(Cs){x.ek.X(2H,L(2H,Cs))},en:u(Gq,Go){x.en.X(2H,Go,L(2H,Gq))},ei:u(Gs,Gr){x.ei.X(2H,Gr,L(2H,Gs))},sZ:u(e,H2){x.do.X(2H,e,L(2H,H2))}}));if(x.1Y){k wi=$(2H).H("9g");wi.1Y({2J:x.2J,34:x.34,5E:x.5E,ln:u(HD,HB){x.2J=HD;x.34=HB;bP(2H)}});x.34=wi.1Y("E").34}};u 95(ac,lX){k x=$.A(ac,"H").E;k dc=$.A(ac,"H").dc;if(!dc.4r.is(":4u")&&(!x.dr||x.dU)){if(lX!=1P){k we=gG(ac,lX);1h(k i=0;i<we.O;i++){Hx(we[i][x.2w])}}}$(ac).H("7h",lX);u Hx(wp){k 3x=x.1Z.2g(ac,wp,"1q",1);k 3S=x.1Z.2g(ac,wp,"1q",2);3x.1l("V","");3S.1l("V","");k wl=3v.3h(3x.V(),3S.V());3x.1l("V",wl);3S.1l("V",wl)}};u vn(wn){k dc=$.A(wn,"H").dc;k x=$.A(wn,"1B").E;if(!x.5B){C}dc.4r.L("G.H-1H-87").P(u(i){$(B).1F(i+1)})};u xP(vU){k dc=$.A(vU,"H").dc;k HI=dc.4r.4I(dc.4c).A("Lt").2e[0].4w;dc.4r.4I(dc.4c).1m("a8",u(e){k tt=$(e.1v);k tr=tt.6T("tr.H-R");if(!tr.O){C}if(tt.2h("I-1O")){tt.2h("I-3r")?tt.1e("I-3r-2l"):tt.1e("I-2C-2l")}e.54()}).1m("HA",u(e){k tt=$(e.1v);k tr=tt.6T("tr.H-R");if(!tr.O){C}if(tt.2h("I-1O")){tt.2h("I-3r")?tt.1x("I-3r-2l"):tt.1x("I-2C-2l")}e.54()}).2x("2e").1m("2e",u(e){k tt=$(e.1v);k tr=tt.6T("tr.H-R");if(!tr.O){C}if(tt.2h("I-1O")){uF(vU,tr.1b("19-id"))}K{HI(e)}e.54()})};u vq(bG,w6){k x=$.A(bG,"1B").E;k 3x=x.1Z.2g(bG,w6,"1q",1);k 3S=x.1Z.2g(bG,w6,"1q",2);k HJ=$(bG).H("6a",Q).O+(x.5B?1:0);k HR=$(bG).H("6a",N).O;wN(3x,HJ);wN(3S,HR);u wN(tr,HU){$("<tr Y=\\"1B-tr-I\\">"+"<td 2c=\\"2W:xF\\" 5v=\\""+HU+"\\">"+"<G></G>"+"</td>"+"</tr>").4a(tr)}};u h2(4y,9S,A,HO){k x=$.A(4y,"1B").E;k dc=$.A(4y,"H").dc;A=x.dp.X(4y,A,9S);k 19=L(4y,9S);if(19){k HQ=x.1Z.2g(4y,9S,"1q",1);k HN=x.1Z.2g(4y,9S,"1q",2);k mv=HQ.2B("tr.1B-tr-I").17("td").17("G");k ms=HN.2B("tr.1B-tr-I").17("td").17("G")}K{k mv=dc.4r;k ms=dc.4c}if(!HO){$.A(4y,"1B").A=[];mv.4u();ms.4u()}if(x.1y.az){x.1y.az.X(x.1y,4y,9S,A)}x.1y.b1.X(x.1y,4y,mv,Q);x.1y.b1.X(x.1y,4y,ms,N);if(x.8e){x.1y.7D.X(x.1y,4y,dc.7u,Q);x.1y.7D.X(x.1y,4y,dc.7w,N)}if(x.1y.6z){x.1y.6z.X(x.1y,4y)}x.53.X(4y,19,A);if(!9S&&x.1Y){k v9=$.A(4y,"1B").3p;k v3=$(4y).H("9g");if(v3.1Y("E").3p!=v9){v3.1Y({3p:v9})}}95(4y);vn(4y);$(4y).1B("97")};u bP(69,nm,v5,Hb,hc){k x=$.A(69,"1B").E;k 1q=$(69).H("5p").L("G.H-1q");if(v5){x.9V=v5}k hl=$.1d({},x.9V);if(x.1Y){$.1d(hl,{lU:x.2J,1g:x.34})}if(x.5x){$.1d(hl,{5f:x.5x,Hu:x.7a})}k R=L(69,nm);if(x.74.X(69,R,hl)==N){C}k h6=1q.L("tr[19-id="+nm+"] 1a.I-4o");h6.1e("I-4b");$(69).1B("4b");k He=x.8s.X(69,hl,u(A){h6.1x("I-4b");$(69).1B("6A");h2(69,nm,A,Hb);if(hc){hc()}},u(){h6.1x("I-4b");$(69).1B("6A");x.77.4V(69,5r);if(hc){hc()}});if(He==N){h6.1x("I-4b");$(69).1B("6A")}};u xK(H9){k 1g=km(H9);if(1g.O){C 1g[0]}K{C 1r}};u km(H5){C $.A(H5,"1B").A};u gL(vc,H6){k R=L(vc,H6);if(R.du){C L(vc,R.du)}K{C 1r}};u gG(hb,vD){k x=$.A(hb,"1B").E;k 1q=$(hb).H("5p").L("G.H-6g G.H-1q");k ny=[];if(vD){mT(vD)}K{k n5=km(hb);1h(k i=0;i<n5.O;i++){ny.1i(n5[i]);mT(n5[i][x.2w])}}u mT(Hg){k h9=L(hb,Hg);if(h9&&h9.17){1h(k i=0,5z=h9.17.O;i<5z;i++){k vH=h9.17[i];ny.1i(vH);mT(vH[x.2w])}}};C ny};u xS(Hr){k 1g=uK(Hr);if(1g.O){C 1g[0]}K{C 1r}};u uK(vO){k 1g=[];k Hs=$(vO).H("5p");Hs.L("G.H-6g G.H-1q tr.H-R-1Q").P(u(){k id=$(B).1b("19-id");1g.1i(L(vO,id))});C 1g};u xZ(vM,vL){if(!vL){C 0}k x=$.A(vM,"1B").E;k 1y=$(vM).H("5p").17("G.H-1y");k 19=1y.L("G.H-1q tr[19-id="+vL+"]").17("td[29="+x.ae+"]");C 19.L("1a.I-6d,1a.I-1O").O};u L(vK,Hj){k x=$.A(vK,"1B").E;k A=$.A(vK,"1B").A;k cc=[A];7n(cc.O){k c=cc.uf();1h(k i=0;i<c.O;i++){k 19=c[i];if(19[x.2w]==Hj){C 19}K{if(19["17"]){cc.1i(19["17"])}}}}C 1r};u kP(6U,ha){k x=$.A(6U,"1B").E;k R=L(6U,ha);k tr=x.1Z.2g(6U,ha);k 1O=tr.L("1a.I-1O");if(1O.O==0){C}if(1O.2h("I-2C")){C}if(x.7s.X(6U,R)==N){C}1O.1x("I-3r I-3r-2l").1e("I-2C");1O.2B().1x("I-4o-3D");R.5c="3b";tr=tr.2B("tr.1B-tr-I");k cc=tr.17("td").17("G");if(x.3U){cc.iP("75",u(){$(6U).1B("97");95(6U,ha);x.80.X(6U,R)})}K{cc.2z();$(6U).1B("97");95(6U,ha);x.80.X(6U,R)}};u bv(5V,h3){k x=$.A(5V,"1B").E;k tr=x.1Z.2g(5V,h3);k 1O=tr.L("1a.I-1O");k R=L(5V,h3);if(1O.O==0){C}if(1O.2h("I-3r")){C}if(x.8F.X(5V,R)==N){C}1O.1x("I-2C I-2C-2l").1e("I-3r");1O.2B().1e("I-4o-3D");k bD=tr.2B("tr.1B-tr-I");if(bD.O){k cc=bD.17("td").17("G");vs(cc)}K{vq(5V,R[x.2w]);k bD=tr.2B("tr.1B-tr-I");k cc=bD.17("td").17("G");cc.2z();bP(5V,R[x.2w],{id:R[x.2w]},Q,u(){if(cc.is(":4u")){bD.1G()}K{vs(cc)}})}u vs(cc){R.5c="3D";if(x.3U){cc.h7("75",u(){$(5V).1B("97");95(5V,h3);x.5d.X(5V,R)})}K{cc.2F();$(5V).1B("97");95(5V,h3);x.5d.X(5V,R)}}};u uF(h4,jj){k x=$.A(h4,"1B").E;k tr=x.1Z.2g(h4,jj);k 1O=tr.L("1a.I-1O");if(1O.2h("I-3r")){kP(h4,jj)}K{bv(h4,jj)}};u xV(hd,jh){k x=$.A(hd,"1B").E;k iW=gG(hd,jh);if(jh){iW.84(L(hd,jh))}1h(k i=0;i<iW.O;i++){kP(hd,iW[i][x.2w])}};u xH(hn,j6){k x=$.A(hn,"1B").E;k jl=gG(hn,j6);if(j6){jl.84(L(hn,j6))}1h(k i=0;i<jl.O;i++){bv(hn,jl[i][x.2w])}};u xr(hj,Hl){k x=$.A(hj,"1B").E;k hP=[];k p=gL(hj,Hl);7n(p){k id=p[x.2w];hP.84(id);p=gL(hj,id)}1h(k i=0;i<hP.O;i++){bv(hj,hP[i])}};u xs(he,bH){k x=$.A(he,"1B").E;if(bH.2p){k 1q=$(he).H("5p").L("G.H-1q");k tr=1q.L("tr[19-id="+bH.2p+"]");if(tr.2B("tr.1B-tr-I").O==0){vq(he,bH.2p)}k 1H=tr.17("td[29="+x.ae+"]").17("G.H-1H");k hQ=1H.17("1a.I-24");if(hQ.2h("I-5j")){hQ.1x("I-5j").1e("I-4o");k 1O=$("<1a Y=\\"I-1O I-3r\\"></1a>").aO(hQ);if(1O.3F().O){1O.3F().1G()}}}h2(he,bH.2p,bH.A,Q)};u xl(aN,iq){k x=$.A(aN,"1B").E;k tr=x.1Z.2g(aN,iq);tr.2B("tr.1B-tr-I").1G();tr.1G();k hD=DJ(iq);if(hD){if(hD.17.O==0){tr=x.1Z.2g(aN,hD[x.2w]);tr.2B("tr.1B-tr-I").1G();k 1H=tr.17("td[29="+x.ae+"]").17("G.H-1H");1H.L(".I-24").1x("I-4o").1e("I-5j");1H.L(".I-1O").1G();$("<1a Y=\\"I-6d\\"></1a>").3o(1H)}}vn(aN);u DJ(id){k cc;k ie=gL(aN,iq);if(ie){cc=ie.17}K{cc=$(aN).1B("9A")}1h(k i=0;i<cc.O;i++){if(cc[i][x.2w]==id){cc.4O(i,1);4A}}C ie}};$.fn.1B=u(96,vr){if(2b 96=="2r"){k tH=$.fn.1B.1J[96];if(tH){C tH(B,vr)}K{C B.H(96,vr)}}96=96||{};C B.P(u(){k vt=$.A(B,"1B");if(vt){$.1d(vt.E,96)}K{$.A(B,"1B",{E:$.1d({},$.fn.1B.1u,$.fn.1B.1o(B),96),A:[]})}xO(B);bP(B);xP(B)})};$.fn.1B.1J={E:u(jq){C $.A(jq[0],"1B").E},23:u(jq,xQ){C jq.P(u(){$(B).H("23",xQ)})},7h:u(jq,xN){C jq.P(u(){95(B,xN)})},bT:u(jq,A){C jq.P(u(){h2(B,1r,A)})},gJ:u(jq,id){C jq.P(u(){if(id){k 19=$(B).1B("L",id);if(19.17){19.17.4O(0,19.17.O)}k 1q=$(B).H("5p").L("G.H-1q");k tr=1q.L("tr[19-id="+id+"]");tr.2B("tr.1B-tr-I").1G();k 1O=tr.L("1a.I-1O");1O.1x("I-3r I-3r-2l").1e("I-2C");bv(B,id)}K{bP(B,1r,{})}})},xM:u(jq,vI){C jq.P(u(){k x=$.A(B,"1B").E;k dc=$.A(B,"H").dc;if(vI){$.A(B,"1B").3u=vI}if(x.8e){x.1y.7D.X(x.1y,B,dc.7u,Q);x.1y.7D.X(x.1y,B,dc.7w,N);if(x.1y.6z){x.1y.6z.X(x.1y,B)}$(B).1B("7h")}})},4b:u(jq){C jq.P(u(){$(B).H("4b")})},6A:u(jq){C jq.P(u(){$(B).H("6A")})},9A:u(jq){C $.A(jq[0],"1B").A},xI:u(jq){C $.A(jq[0],"1B").3u},xJ:u(jq){C xK(jq[0])},vz:u(jq){C km(jq[0])},xL:u(jq,id){C gL(jq[0],id)},xR:u(jq,id){C gG(jq[0],id)},dg:u(jq){C xS(jq[0])},lF:u(jq){C uK(jq[0])},yH:u(jq,id){C xZ(jq[0],id)},L:u(jq,id){C L(jq[0],id)},y3:u(jq,id){k x=$.A(jq[0],"1B").E;k tr=x.1Z.2g(jq[0],id);k 1O=tr.L("1a.I-1O");C 1O.O==0},5C:u(jq,id){C jq.P(u(){$(B).H("gV",id)})},C2:u(jq,id){C jq.P(u(){$(B).H("xY",id)})},37:u(jq,id){C jq.P(u(){kP(B,id)})},36:u(jq,id){C jq.P(u(){bv(B,id)})},xT:u(jq,id){C jq.P(u(){uF(B,id)})},xU:u(jq,id){C jq.P(u(){xV(B,id)})},xW:u(jq,id){C jq.P(u(){xH(B,id)})},xG:u(jq,id){C jq.P(u(){xr(B,id)})},4D:u(jq,xu){C jq.P(u(){xs(B,xu)})},1G:u(jq,id){C jq.P(u(){xl(B,id)})},64:u(jq,id){C jq.P(u(){k x=$.A(B,"1B").E;x.1y.aG.X(x.1y,B,id)})},gS:u(jq,id){C jq.P(u(){$(B).H("gS",id);$(B).1B("7h",id)})},gT:u(jq,id){C jq.P(u(){$(B).H("gT",id)})},bz:u(jq,id){C jq.P(u(){$(B).H("bz",id)})}};$.fn.1B.1o=u(wH){C $.1d({},$.fn.H.1o(wH),$.1V.1o(wH,["ae",{3U:"1S"}]))};k y6=$.1d({},$.fn.H.1u.1y,{b1:u(bA,xm,jH){k x=$.A(bA,"1B").E;k sO=$(bA).H("6a",jH);k xo=$.A(bA,"H").dI;if(jH){if(!(x.5B||(x.5u&&x.5u.O))){C}}k 1y=B;k xn=w9(jH,B.yI,B.yJ);$(xm).4D(xn.3R(""));u w9(hB,wc,wt){k 6M=["<2s Y=\\"H-kI\\" 6e=\\"0\\" 65=\\"0\\" 2W=\\"0\\"><3c>"];1h(k i=0;i<wt.O;i++){k R=wt[i];if(R.5c!="3D"&&R.5c!="3b"){R.5c="3D"}k w8=x.5G?x.5G.X(bA,R):"";k xD=w8?"2c=\\""+w8+"\\"":"";k xv=xo+"-"+(hB?1:2)+"-"+R[x.2w];6M.1i("<tr id=\\""+xv+"\\" Y=\\"H-R\\" 19-id="+R[x.2w]+" "+xD+">");6M=6M.6v(1y.88.X(1y,bA,sO,hB,wc,R));6M.1i("</tr>");if(R.17&&R.17.O){k tt=w9(hB,wc+1,R.17);k v=R.5c=="3b"?"5e":"5w";6M.1i("<tr Y=\\"1B-tr-I\\"><td 2c=\\"2W:xF\\" 5v="+(sO.O+(x.5B?1:0))+"><G 2c=\\"3q:"+v+"\\">");6M=6M.6v(tt);6M.1i("</G></td></tr>")}}6M.1i("</3c></2s>");C 6M}},7D:u(gU,xA,t8){k x=$.A(gU,"1B").E;k 1g=$.A(gU,"1B").3u||[];k xy=$(gU).H("6a",t8);k dq=["<2s Y=\\"H-sH\\" 6e=\\"0\\" 65=\\"0\\" 2W=\\"0\\"><3c>"];1h(k i=0;i<1g.O;i++){k R=1g[i];R[x.2w]=R[x.2w]||("Ls-R-id"+i);dq.1i("<tr Y=\\"H-R\\" 19-id="+R[x.2w]+">");dq.1i(B.88.X(B,gU,xy,t8,0,R));dq.1i("</tr>")}dq.1i("</3c></2s>");$(xA).1F(dq.3R(""))},88:u(sa,s3,y4,xk,R){k x=$.A(sa,"1B").E;k cc=[];if(y4&&x.5B){cc.1i("<td Y=\\"H-td-87\\"><G Y=\\"H-1H-87\\">0</G></td>")}1h(k i=0;i<s3.O;i++){k 76=s3[i];k 1k=$(sa).H("6E",76);if(1k){k ik=1k.6K?(1k.6K(R[76],R)||""):"";k 9e=1k.4T?"2c=\\"3q:5e;"+ik+"\\"":(ik?"2c=\\""+ik+"\\"":"");cc.1i("<td 29=\\""+76+"\\" "+9e+">");if(1k.2t){k 9e=""}K{k 9e="";9e+="1w-6L:"+(1k.6L||"Z")+";";if(!x.dr){9e+="yB-yy:75;V:2q;"}K{if(x.dU){9e+="V:2q;"}}}cc.1i("<G 2c=\\""+9e+"\\" ");if(1k.2t){cc.1i("Y=\\"H-1H-6x ")}K{cc.1i("Y=\\"H-1H "+1k.iy)}cc.1i("\\">");if(1k.2t){if(R.35){cc.1i("<1L 1I=\\"2t\\" 35=\\"35\\"")}K{cc.1i("<1L 1I=\\"2t\\"")}cc.1i(" 1C=\\""+76+"\\" 1A=\\""+(R[76]!=1P?R[76]:"")+"\\"/>")}K{k 1n=1r;if(1k.3t){1n=1k.3t(R[76],R)}K{1n=R[76]}if(76==x.ae){1h(k j=0;j<xk;j++){cc.1i("<1a Y=\\"I-6d\\"></1a>")}if(R.5c=="3b"){cc.1i("<1a Y=\\"I-1O I-2C\\"></1a>");cc.1i("<1a Y=\\"I-24 I-4o "+(R.1W?R.1W:"")+"\\"></1a>")}K{if(R.17&&R.17.O){cc.1i("<1a Y=\\"I-1O I-3r\\"></1a>");cc.1i("<1a Y=\\"I-24 I-4o I-4o-3D "+(R.1W?R.1W:"")+"\\"></1a>")}K{cc.1i("<1a Y=\\"I-6d\\"></1a>");cc.1i("<1a Y=\\"I-24 I-5j "+(R.1W?R.1W:"")+"\\"></1a>")}}cc.1i("<1a Y=\\"I-2f\\">"+1n+"</1a>")}K{cc.1i(1n)}}cc.1i("</G>");cc.1i("</td>")}}C cc.3R("")},aG:u(ad,id){k R=$(ad).1B("L",id);k x=$.A(ad,"1B").E;k s0=x.5G?x.5G.X(ad,R):"";k yt=s0?s0:"";k tr=x.1Z.2g(ad,id);tr.1b("2c",yt);tr.17("td").P(u(){k 1H=$(B).L("G.H-1H");k dJ=$(B).1b("29");k 1k=$(ad).H("6E",dJ);if(1k){k mh=1k.6K?(1k.6K(R[dJ],R)||""):"";k yD=1k.4T?"3q:5e;"+mh:(mh?mh:"");$(B).1b("2c",yD);k 1n=1r;if(1k.3t){1n=1k.3t(R[dJ],R)}K{1n=R[dJ]}if(dJ==x.ae){1H.17("1a.I-2f").1F(1n);k 4M="I-24";k 24=1H.17("1a.I-24");if(24.2h("I-4o")){4M+=" I-4o"}if(24.2h("I-4o-3D")){4M+=" I-4o-3D"}if(24.2h("I-5j")){4M+=" I-5j"}if(R.1W){4M+=" "+R.1W}24.1b("Y",4M)}K{1H.1F(1n)}}});$(ad).1B("7h",id)},az:u(7m,ew,A){if(!A){C N}k x=$.A(7m,"1B").E;if(A.O==1P){if(A.3u){$.A(7m,"1B").3u=A.3u}if(A.3p){$.A(7m,"1B").3p=A.3p}A=B.yb(7m,ew,A.1g)}K{u sh(sx,yL){1h(k i=0;i<sx.O;i++){k R=sx[i];R.du=yL;if(R.17&&R.17.O){sh(R.17,R[x.2w])}}};sh(A,ew)}k 19=L(7m,ew);if(19){if(19.17){19.17=19.17.6v(A)}K{19.17=A}}K{$.A(7m,"1B").A=$.A(7m,"1B").A.6v(A)}if(!x.as){B.5f(7m,A)}B.yJ=A;B.yI=$(7m).1B("yH",ew)},5f:u(tX,A){k x=$.A(tX,"1B").E;k 9d=$(tX).1B("6E",x.5x);if(9d){k yd=9d.yr||u(a,b){C(a>b?1:-1)};ux(A)}u ux(1g){1g.5f(u(r1,r2){C yd(r1[x.5x],r2[x.5x])*(x.7a=="dM"?1:-1)});1h(k i=0;i<1g.O;i++){k lI=1g[i].17;if(lI&&lI.O){ux(lI)}}}},yb:u(ya,uh,A){k x=$.A(ya,"1B").E;k 1g=[];1h(k i=0;i<A.O;i++){1g.1i(A[i])}k dK=[];1h(k i=0;i<1g.O;i++){k R=1g[i];if(!uh){if(!R.du){dK.1i(R);lu(1g,R);i--}}K{if(R.du==uh){dK.1i(R);lu(1g,R);i--}}}k eB=[];1h(k i=0;i<dK.O;i++){eB.1i(dK[i])}7n(eB.O){k 19=eB.uf();1h(k i=0;i<1g.O;i++){k R=1g[i];if(R.du==19[x.2w]){if(19.17){19.17.1i(R)}K{19.17=[R]}eB.1i(R);lu(1g,R);i--}}}C dK}});$.fn.1B.1u=$.1d({},$.fn.H.1u,{ae:1r,3U:N,8f:Q,1y:y6,8s:u(y7,yh,yo){k x=$(B).1B("E");if(!x.2N){C N}$.9T({1I:x.8x,2N:x.2N,A:y7,dy:"ds",8v:u(A){yh(A)},b9:u(){yo.4V(B,5r)}})},dp:u(A,Lm){C A},1Z:{2g:u(dH,id,1I,6I){1I=1I||"1q";6I=6I||0;k dc=$.A(dH,"H").dc;if(6I==0){k x=$.A(dH,"1B").E;k 3x=x.1Z.2g(dH,id,1I,1);k 3S=x.1Z.2g(dH,id,1I,2);C 3x.4I(3S)}K{if(1I=="1q"){k tr=$("#"+$.A(dH,"H").dI+"-"+6I+"-"+id);if(!tr.O){tr=(6I==1?dc.4r:dc.4c).L("tr[19-id="+id+"]")}C tr}K{if(1I=="3u"){C(6I==1?dc.7u:dc.7w).L("tr[19-id="+id+"]")}K{if(1I=="1Q"){C(6I==1?dc.4r:dc.4c).L("tr.H-R-1Q")}K{if(1I=="52"){C(6I==1?dc.4r:dc.4c).L("tr:52[19-id]")}K{if(1I=="9r"){C(6I==1?dc.4r:dc.4c).L("tr[19-id]")}K{if(1I=="eW"){C(6I==1?dc.7u:dc.7w).L("tr[19-id]")}}}}}}}},7I:u(yn,id){C $(yn).1B("L",id)}},74:u(R,Ll){},53:u(R,A){},77:u(){},7s:u(R){},80:u(R){},8F:u(R){},5d:u(R){},85:u(R){},ek:u(R){},en:u(Lg,R){},ei:u(Lf,R){},do:u(e,R){},9Q:u(R){},9X:u(R,Le){},9Z:u(R){}})})(2T);(u($){u vS(e8,tM){k x=$.A(e8,"1c").E;k 8h=$.A(e8,"1c").1c;k yN=$.A(e8,"1c").J;if(tM){x.U=tM}8h.1t("1q");if(4R(x.U)){x.U=8h.L("1L.1c-1w").1N()}k tF=0;if(x.hF){tF=8h.L(".1c-4G").1N()}8h.3B(x.U);8h.L("1L.1c-1w").U(8h.U()-tF);yN.J("23",{U:(x.eA?x.eA:8h.1N()),V:x.cZ});8h.4a(e8)};u Bw(tD){k x=$.A(tD,"1c").E;k tJ=$.A(tD,"1c").1c;if(x.hF){tJ.L(".1c-4G").2F()}K{tJ.L(".1c-4G").2z()}};u 33(eQ){$(eQ).1e("1c-f").2z();k 1a=$("<1a Y=\\"1c\\"></1a>").4a(eQ);k wX=$("<1L 1I=\\"1w\\" Y=\\"1c-1w\\">").1t(1a);$("<1a><1a Y=\\"1c-4G\\"></1a></1a>").1t(1a);$("<1L 1I=\\"4T\\" Y=\\"1c-1A\\">").1t(1a);k sn=$("<G Y=\\"1c-J\\"></G>").1t("1q");sn.J({6X:N,3b:Q,4M:"1c-p",2c:{4L:"iM",42:10},7X:u(){$(B).J("23")}});k 1C=$(eQ).1b("1C");if(1C){1a.L("1L.1c-1A").1b("1C",1C);$(eQ).4K("1C").1b("uJ",1C)}wX.1b("Lh","wW");C{1c:1a,J:sn}};u Bq(ge){k wU=$.A(ge,"1c").1c.L("1L.1c-1w");wU.1T("2L");$.A(ge,"1c").J.J("2L");$.A(ge,"1c").1c.1G();$(ge).1G()};u l7(5U){k bo=$.A(5U,"1c");k x=bo.E;k ji=$.A(5U,"1c").1c;k t4=$.A(5U,"1c").J;k dD=ji.L(".1c-1w");k sY=ji.L(".1c-4G");$(2G).2x(".1c").1m("5q.1c",u(e){k rW=$("1q>G.1c-p>G.1c-J");k p=$(e.1v).6T("G.1c-J",rW);if(p.O){C}rW.J("4d")});ji.2x(".1c");t4.2x(".1c");dD.2x(".1c");sY.2x(".1c");if(!x.1z){dD.1m("5q.1c",u(e){e.54()}).1m("jg.1c",u(e){j7(e.dv){51 38:x.8d.up.X(5U);4A;51 40:x.8d.4z.X(5U);4A;51 13:e.wZ();x.8d.8c.X(5U);C N;51 9:51 27:kM(5U);4A;Li:if(x.4E){if(bo.dA){dE(bo.dA)}bo.dA=3m(u(){k q=dD.1n();if(bo.iY!=q){bo.iY=q;kT(5U);x.8d.db.X(5U,dD.1n());ft(5U,Q)}},x.rT)}}});sY.1m("2e.1c",u(){if(t4.is(":5W")){kM(5U)}K{$("G.1c-J").J("4d");kT(5U)}dD.5o()}).1m("6t.1c",u(){$(B).1e("1c-4G-2l")}).1m("5h.1c",u(){$(B).1x("1c-4G-2l")}).1m("5q.1c",u(){C N})}};u kT(fs){k x=$.A(fs,"1c").E;k 8z=$.A(fs,"1c").1c;k 7e=$.A(fs,"1c").J;if($.fn.1s){7e.J("J").1l("z-2K",$.fn.1s.1u.42++)}7e.J("aR",{Z:8z.3K().Z,14:wx()});7e.J("3D");x.9v.X(fs);(u(){if(7e.is(":5W")){7e.J("aR",{Z:xg(),14:wx()});3m(5r.x5,g7)}})();u xg(){k Z=8z.3K().Z;if(Z+7e.1N()>$(1s).U()+$(2G).4i()){Z=$(1s).U()+$(2G).4i()-7e.1N()}if(Z<0){Z=0}C Z};u wx(){k 14=8z.3K().14+8z.2j();if(14+7e.2j()>$(1s).V()+$(2G).4q()){14=8z.3K().14-7e.2j()}if(14<$(2G).4q()){14=8z.3K().14+8z.2j()}C 14}};u kM(kL){k x=$.A(kL,"1c").E;k wT=$.A(kL,"1c").J;wT.J("4d");x.AH.X(kL)};u ft(vP,xd){k x=$.A(vP,"1c").E;k kS=$.A(vP,"1c").1c.L("1L.1c-1w");kS.1T(x);if(xd){kS.1T("7S");kS.8D("5h")}};u kN(fd,xc){k x=$.A(fd,"1c").E;k fe=$.A(fd,"1c").1c;if(xc){x.1z=Q;$(fd).1b("1z",Q);fe.L(".1c-1A").1b("1z",Q);fe.L(".1c-1w").1b("1z",Q)}K{x.1z=N;$(fd).4K("1z");fe.L(".1c-1A").4K("1z");fe.L(".1c-1w").4K("1z")}};u Bp(uP){k x=$.A(uP,"1c").E;k jt=$.A(uP,"1c").1c;if(x.4B){jt.L("1L.1c-1A").1G()}K{jt.L("1L.1c-1A").1n("")}jt.L("1L.1c-1w").1n("")};u AO(x9){k yx=$.A(x9,"1c").1c;C yx.L("1L.1c-1w").1n()};u AP(jP,1w){k Bf=$.A(jP,"1c").1c;Bf.L("1L.1c-1w").1n(1w);ft(jP,Q);$.A(jP,"1c").iY=1w};u kk(Bh){k vC=[];k Bi=$.A(Bh,"1c").1c;Bi.L("1L.1c-1A").P(u(){vC.1i($(B).1n())});C vC};u fp(aI,7E){k x=$.A(aI,"1c").E;k dR=kk(aI);k uG=$.A(aI,"1c").1c;uG.L("1L.1c-1A").1G();k 1C=$(aI).1b("uJ");1h(k i=0;i<7E.O;i++){k uS=$("<1L 1I=\\"4T\\" Y=\\"1c-1A\\">").1t(uG);if(1C){uS.1b("1C",1C)}uS.1n(7E[i])}k 8E=[];1h(k i=0;i<dR.O;i++){8E[i]=dR[i]}k aa=[];1h(k i=0;i<7E.O;i++){1h(k j=0;j<8E.O;j++){if(7E[i]==8E[j]){aa.1i(7E[i]);8E.4O(j,1);4A}}}if(aa.O!=7E.O||7E.O!=dR.O){if(x.4B){x.4Q.X(aI,7E,dR)}K{x.4Q.X(aI,7E[0],dR[0])}}};u AL(B7){k Ba=kk(B7);C Ba[0]};u i7(Bb,Bj){fp(Bb,[Bj])};u Br(dP){k x=$.A(dP,"1c").E;k fn=x.4Q;x.4Q=u(){};if(x.4B){if(x.1A){if(2b x.1A=="Bk"){fp(dP,x.1A)}K{i7(dP,x.1A)}}K{fp(dP,[])}}K{i7(dP,x.1A)}x.4Q=fn};$.fn.1c=u(bg,Bt){if(2b bg=="2r"){C $.fn.1c.1J[bg](B,Bt)}bg=bg||{};C B.P(u(){k aM=$.A(B,"1c");if(aM){$.1d(aM.E,bg)}K{k r=33(B);aM=$.A(B,"1c",{E:$.1d({},$.fn.1c.1u,$.fn.1c.1o(B),bg),1c:r.1c,J:r.J,iY:1r});$(B).4K("1z")}$("1L.1c-1w",aM.1c).1b("Bu",!aM.E.4E);Bw(B);kN(B,aM.E.1z);vS(B);l7(B);ft(B);Br(B)})};$.fn.1c.1J={E:u(jq){C $.A(jq[0],"1c").E},J:u(jq){C $.A(jq[0],"1c").J},eC:u(jq){C $.A(jq[0],"1c").1c.L("1L.1c-1w")},2L:u(jq){C jq.P(u(){Bq(B)})},23:u(jq,Bm){C jq.P(u(){vS(B,Bm)})},Lk:u(jq){C jq.P(u(){kT(B)})},7y:u(jq){C jq.P(u(){kM(B)})},6l:u(jq){C jq.P(u(){kN(B,Q);l7(B)})},6H:u(jq){C jq.P(u(){kN(B,N);l7(B)})},7S:u(jq){C jq.P(u(){ft(B,Q)})},sR:u(jq){k Bn=$.A(jq[0],"1c").1c.L("1L.1c-1w");C Bn.1T("sR")},43:u(jq){C jq.P(u(){Bp(B)})},Lj:u(jq){C AO(jq[0])},7q:u(jq,1w){C jq.P(u(){AP(B,1w)})},79:u(jq){C kk(jq[0])},5S:u(jq,AQ){C jq.P(u(){fp(B,AQ)})},3A:u(jq){C AL(jq[0])},2S:u(jq,AK){C jq.P(u(){i7(B,AK)})}};$.fn.1c.1o=u(hX){k t=$(hX);C $.1d({},$.fn.1T.1o(hX),$.1V.1o(hX,["U","3j",{eA:"2O",4E:"1S",hF:"1S",rT:"2O"}]),{cZ:(t.1b("cZ")=="2q"?"2q":2X(t.1b("cZ"))||1P),4B:(t.1b("4B")?Q:1P),1z:(t.1b("1z")?Q:1P),1A:(t.1n()||1P)})};$.fn.1c.1u=$.1d({},$.fn.1T.1u,{U:"2q",eA:1r,cZ:g7,4B:N,3j:",",4E:Q,1z:N,hF:Q,1A:"",rT:g7,8d:{up:u(){},4z:u(){},8c:u(){},db:u(q){}},9v:u(){},AH:u(){},4Q:u(Lu,Lv){}})})(2T);(u($){u nx(AR,B0){k 9y=$(AR).1c("J");k 1j=9y.L("G.1R-1j[1A=\\""+B0+"\\"]");if(1j.O){if(1j.4L().14<=0){k h=9y.4q()+1j.4L().14;9y.4q(h)}K{if(1j.4L().14+1j.2j()>9y.V()){k h=9y.4q()+1j.4L().14+1j.2j()-9y.V();9y.4q(h)}}}};u Cn(ef){k tZ=$(ef).1c("J");k B2=$(ef).1c("79");k 1j=tZ.L("G.1R-1j[1A=\\""+B2.dF()+"\\"]");if(1j.O){k 3F=1j.3F(":5W");if(3F.O){1j=3F}}K{1j=tZ.L("G.1R-1j:5W:52")}k u0=1j.1b("1A");dL(ef,u0);nx(ef,u0)};u Cm(e3){k uw=$(e3).1c("J");k AZ=$(e3).1c("79");k 1j=uw.L("G.1R-1j[1A=\\""+AZ.dF()+"\\"]");if(1j.O){k 2B=1j.2B(":5W");if(2B.O){1j=2B}}K{1j=uw.L("G.1R-1j:5W:5H")}k uj=1j.1b("1A");dL(e3,uj);nx(e3,uj)};u dL(at,eU){k x=$.A(at,"1R").E;k A=$.A(at,"1R").A;if(x.4B){k ea=$(at).1c("79");1h(k i=0;i<ea.O;i++){if(ea[i]==eU){C}}ea.1i(eU);6f(at,ea)}K{6f(at,[eU])}1h(k i=0;i<A.O;i++){if(A[i][x.9t]==eU){x.4l.X(at,A[i]);C}}};u tC(dB,tg){k x=$.A(dB,"1R").E;k A=$.A(dB,"1R").A;k eV=$(dB).1c("79");1h(k i=0;i<eV.O;i++){if(eV[i]==tg){eV.4O(i,1);6f(dB,eV);4A}}1h(k i=0;i<A.O;i++){if(A[i][x.9t]==tg){x.9z.X(dB,A[i]);C}}};u 6f(dG,tf,AV){k x=$.A(dG,"1R").E;k A=$.A(dG,"1R").A;k tk=$(dG).1c("J");tk.L("G.1R-1j-1Q").1x("1R-1j-1Q");k vv=[],ss=[];1h(k i=0;i<tf.O;i++){k v=tf[i];k s=v;1h(k j=0;j<A.O;j++){if(A[j][x.9t]==v){s=A[j][x.61];4A}}vv.1i(v);ss.1i(s);tk.L("G.1R-1j[1A=\\""+v+"\\"]").1e("1R-1j-1Q")}$(dG).1c("5S",vv);if(!AV){$(dG).1c("7q",ss.3R(x.3j))}};u By(tT){k x=$.A(tT,"1R").E;k A=[];$(">tO",tT).P(u(){k 1j={};1j[x.9t]=$(B).1b("1A")!=1P?$(B).1b("1A"):$(B).1F();1j[x.61]=$(B).1F();1j["1Q"]=$(B).1b("1Q");A.1i(1j)});C A};u ht(5A,A,mr){k x=$.A(5A,"1R").E;k lV=$(5A).1c("J");$.A(5A,"1R").A=A;k 9H=$(5A).1R("79");lV.4u();1h(k i=0;i<A.O;i++){k v=A[i][x.9t];k s=A[i][x.61];k 1j=$("<G Y=\\"1R-1j\\"></G>").1t(lV);1j.1b("1A",v);if(x.3t){1j.1F(x.3t.X(5A,A[i]))}K{1j.1F(s)}if(A[i]["1Q"]){(u(){1h(k i=0;i<9H.O;i++){if(v==9H[i]){C}}9H.1i(v)})()}}if(x.4B){6f(5A,9H,mr)}K{if(9H.O){6f(5A,[9H[9H.O-1]],mr)}K{6f(5A,[],mr)}}x.53.X(5A,A);$(".1R-1j",lV).2l(u(){$(B).1e("1R-1j-2l")},u(){$(B).1x("1R-1j-2l")}).2e(u(){k 1j=$(B);if(x.4B){if(1j.2h("1R-1j-1Q")){tC(5A,1j.1b("1A"))}K{dL(5A,1j.1b("1A"))}}K{dL(5A,1j.1b("1A"));$(5A).1c("7y")}})};u mO(et,2N,ex,AX){k x=$.A(et,"1R").E;if(2N){x.2N=2N}ex=ex||{};if(x.74.X(et,ex)==N){C}x.8s.X(et,ex,u(A){ht(et,A,AX)},u(){x.77.4V(B,5r)})};u Cp(7W,q){k x=$.A(7W,"1R").E;if(x.4B&&!q){6f(7W,[],Q)}K{6f(7W,[q],Q)}if(x.4H=="u9"){mO(7W,1r,{q:q},Q)}K{k sP=$(7W).1c("J");sP.L("G.1R-1j").2z();k A=$.A(7W,"1R").A;1h(k i=0;i<A.O;i++){if(x.ah.X(7W,q,A[i])){k v=A[i][x.9t];k s=A[i][x.61];k 1j=sP.L("G.1R-1j[1A=\\""+v+"\\"]");1j.2F();if(s==q){6f(7W,[v],Q);1j.1e("1R-1j-1Q")}}}}};u tG(9I){k x=$.A(9I,"1R").E;$(9I).1e("1R-f");$(9I).1c($.1d({},x,{9v:u(){$(9I).1c("J").L("G.1R-1j").2F();nx(9I,$(9I).1R("3A"));x.9v.X(9I)}}))};$.fn.1R=u(9K,tK){if(2b 9K=="2r"){k tI=$.fn.1R.1J[9K];if(tI){C tI(B,tK)}K{C B.1c(9K,tK)}}9K=9K||{};C B.P(u(){k dS=$.A(B,"1R");if(dS){$.1d(dS.E,9K);tG(B)}K{dS=$.A(B,"1R",{E:$.1d({},$.fn.1R.1u,$.fn.1R.1o(B),9K)});tG(B);ht(B,By(B))}if(dS.E.A){ht(B,dS.E.A)}mO(B)})};$.fn.1R.1J={E:u(jq){C $.A(jq[0],"1R").E},9A:u(jq){C $.A(jq[0],"1R").A},5S:u(jq,Cb){C jq.P(u(){6f(B,Cb)})},2S:u(jq,Cc){C jq.P(u(){6f(B,[Cc])})},43:u(jq){C jq.P(u(){$(B).1c("43");k C7=$(B).1c("J");C7.L("G.1R-1j-1Q").1x("1R-1j-1Q")})},bT:u(jq,A){C jq.P(u(){ht(B,A)})},gJ:u(jq,2N){C jq.P(u(){mO(B,2N)})},5C:u(jq,C6){C jq.P(u(){dL(B,C6)})},C2:u(jq,Ce){C jq.P(u(){tC(B,Ce)})}};$.fn.1R.1o=u(mD){k t=$(mD);C $.1d({},$.fn.1c.1o(mD),$.1V.1o(mD,["9t","61","4H","8x","2N"]))};$.fn.1R.1u=$.1d({},$.fn.1c.1u,{9t:"1A",61:"1w",4H:"zj",8x:"mw",2N:1r,A:1r,8d:{up:u(){Cn(B)},4z:u(){Cm(B)},8c:u(){k Co=$(B).1R("79");$(B).1R("5S",Co);$(B).1R("7y")},db:u(q){Cp(B,q)}},ah:u(q,R){k x=$(B).1R("E");C R[x.61].7M(q)==0},3t:u(R){k x=$(B).1R("E");C R[x.61]},8s:u(Cq,Cl,Ck){k x=$(B).1R("E");if(!x.2N){C N}$.9T({1I:x.8x,2N:x.2N,A:Cq,dy:"ds",8v:u(A){Cl(A)},b9:u(){Ck.4V(B,5r)}})},74:u(LH){},53:u(){},77:u(){},4l:u(LG){},9z:u(LF){}})})(2T);(u($){u BI(67){k x=$.A(67,"2R").E;k I=$.A(67,"2R").I;$(67).1e("2R-f");$(67).1c(x);k Ci=$(67).1c("J");if(!I){I=$("<ul></ul>").1t(Ci);$.A(67,"2R").I=I}I.I($.1d({},x,{2t:x.4B,53:u(19,A){k ho=$(67).2R("79");if(x.4B){k tz=I.I("h1");1h(k i=0;i<tz.O;i++){k id=tz[i].id;(u(){1h(k i=0;i<ho.O;i++){if(id==ho[i]){C}}ho.1i(id)})()}}$(67).2R("5S",ho);x.53.X(B,19,A)},b6:u(19){tw(67);$(67).1c("7y");x.b6.X(B,19)},9M:u(19,Cj){tw(67);x.9M.X(B,19,Cj)}}))};u tw(kZ){k x=$.A(kZ,"2R").E;k I=$.A(kZ,"2R").I;k vv=[],ss=[];if(x.4B){k ig=I.I("h1");1h(k i=0;i<ig.O;i++){vv.1i(ig[i].id);ss.1i(ig[i].1w)}}K{k 19=I.I("dg");if(19){vv.1i(19.id);ss.1i(19.1w)}}$(kZ).1c("5S",vv).1c("7q",ss.3R(x.3j))};u uo(jz,ts){k x=$.A(jz,"2R").E;k I=$.A(jz,"2R").I;I.L("1a.I-2t").1e("I-6k").1x("I-4Y I-9L");k vv=[],ss=[];1h(k i=0;i<ts.O;i++){k v=ts[i];k s=v;k 19=I.I("L",v);if(19){s=19.1w;I.I("6x",19.1v);I.I("5C",19.1v)}vv.1i(v);ss.1i(s)}$(jz).1c("5S",vv).1c("7q",ss.3R(x.3j))};$.fn.2R=u(9w,uk){if(2b 9w=="2r"){k tu=$.fn.2R.1J[9w];if(tu){C tu(B,uk)}K{C B.1c(9w,uk)}}9w=9w||{};C B.P(u(){k um=$.A(B,"2R");if(um){$.1d(um.E,9w)}K{$.A(B,"2R",{E:$.1d({},$.fn.2R.1u,$.fn.2R.1o(B),9w)})}BI(B)})};$.fn.2R.1J={E:u(jq){C $.A(jq[0],"2R").E},I:u(jq){C $.A(jq[0],"2R").I},bT:u(jq,A){C jq.P(u(){k x=$.A(B,"2R").E;x.A=A;k I=$.A(B,"2R").I;I.I("bT",A)})},gJ:u(jq,2N){C jq.P(u(){k x=$.A(B,"2R").E;k I=$.A(B,"2R").I;if(2N){x.2N=2N}I.I({2N:x.2N})})},5S:u(jq,BK){C jq.P(u(){uo(B,BK)})},2S:u(jq,BE){C jq.P(u(){uo(B,[BE])})},43:u(jq){C jq.P(u(){k I=$.A(B,"2R").I;I.L("G.I-19-1Q").1x("I-19-1Q");k cc=I.I("h1");1h(k i=0;i<cc.O;i++){I.I("BA",cc[i].1v)}$(B).1c("43")})}};$.fn.2R.1o=u(uv){C $.1d({},$.fn.1c.1o(uv),$.fn.I.1o(uv))};$.fn.2R.1u=$.1d({},$.fn.1c.1u,$.fn.I.1u,{4E:N})})(2T);(u($){u zq(56){k x=$.A(56,"32").E;k 3a=$.A(56,"32").3a;$(56).1e("32-f");$(56).1c(x);k BC=$(56).1c("J");if(!3a){3a=$("<2s></2s>").1t(BC);$.A(56,"32").3a=3a}3a.H($.1d({},x,{2W:N,2Z:Q,8f:(!x.4B),53:u(A){k BL=$.A(56,"32").gQ;k BD=$(56).1c("79");bu(56,BD,BL);x.53.4V(56,5r)},85:BU,4l:u(BM,R){bN();x.4l.X(B,BM,R)},9z:u(BV,R){bN();x.9z.X(B,BV,R)},bF:u(1g){bN();x.bF.X(B,1g)},bE:u(1g){if(x.4B){bN()}x.bE.X(B,1g)}}));u BU(BW,R){$.A(56,"32").gQ=N;bN();if(!x.4B){$(56).1c("7y")}x.85.X(B,BW,R)};u bN(){k BS=$.A(56,"32").gQ;k 1g=3a.H("lF");k vv=[],ss=[];1h(k i=0;i<1g.O;i++){vv.1i(1g[i][x.2w]);ss.1i(1g[i][x.61])}if(!x.4B){$(56).1c("5S",(vv.O?vv:[""]))}K{$(56).1c("5S",vv)}if(!BS){$(56).1c("7q",ss.3R(x.3j))}}};u n2(lJ,8n){k x=$.A(lJ,"32").E;k 3a=$.A(lJ,"32").3a;k lc=3a.H("9U").O;$.A(lJ,"32").gQ=N;k 6c;k lb=3a.H("lF");if(lb.O){6c=3a.H("u4",lb[lb.O-1][x.2w]);6c+=8n;if(6c<0){6c=0}if(6c>=lc){6c=lc-1}}K{if(8n>0){6c=0}K{if(8n<0){6c=lc-1}K{6c=-1}}}if(6c>=0){3a.H("eH");3a.H("gV",6c)}};u bu(bI,bL,BO){k x=$.A(bI,"32").E;k 3a=$.A(bI,"32").3a;k 1g=3a.H("9U");k ss=[];1h(k i=0;i<bL.O;i++){k lq=3a.H("u4",bL[i]);if(lq>=0){3a.H("gV",lq);ss.1i(1g[lq][x.61])}K{ss.1i(bL[i])}}if($(bI).1c("79").3R(",")==bL.3R(",")){C}$(bI).1c("5S",bL);if(!BO){$(bI).1c("7q",ss.3R(x.3j))}};u zi(aF,q){k x=$.A(aF,"32").E;k 3a=$.A(aF,"32").3a;$.A(aF,"32").gQ=Q;if(x.4B&&!q){bu(aF,[],Q)}K{bu(aF,[q],Q)}if(x.4H=="u9"){3a.H("eH");3a.H("8l",$.1d({},x.9V,{q:q}))}K{if(!q){C}k 1g=3a.H("9U");1h(k i=0;i<1g.O;i++){if(x.ah.X(aF,q,1g[i])){3a.H("eH");3a.H("gV",i);C}}}};$.fn.32=u(9D,tc){if(2b 9D=="2r"){k u7=$.fn.32.1J[9D];if(u7){C u7(B,tc)}K{C $.fn.1c.1J[9D](B,tc)}}9D=9D||{};C B.P(u(){k jc=$.A(B,"32");if(jc){$.1d(jc.E,9D)}K{jc=$.A(B,"32",{E:$.1d({},$.fn.32.1u,$.fn.32.1o(B),9D)})}zq(B)})};$.fn.32.1J={E:u(jq){C $.A(jq[0],"32").E},3a:u(jq){C $.A(jq[0],"32").3a},5S:u(jq,zt){C jq.P(u(){bu(B,zt)})},2S:u(jq,zn){C jq.P(u(){bu(B,[zn])})},43:u(jq){C jq.P(u(){$(B).32("3a").H("eH");$(B).1c("43")})}};$.fn.32.1o=u(eI){k t=$(eI);C $.1d({},$.fn.1c.1o(eI),$.fn.H.1o(eI),$.1V.1o(eI,["2w","61","4H"]))};$.fn.32.1u=$.1d({},$.fn.1c.1u,$.fn.H.1u,{9G:1r,2w:1r,61:1r,4H:"zj",8d:{up:u(){n2(B,-1)},4z:u(){n2(B,1)},8c:u(){n2(B,0);$(B).1c("7y")},db:u(q){zi(B,q)}},ah:u(q,R){k x=$(B).32("E");C R[x.61].7M(q)==0}})})(2T);(u($){u zF(6n){k al=$.A(6n,"2k");k x=al.E;$(6n).1e("2k-f");$(6n).1c($.1d({},x,{9v:u(){al.1p.1p("23");x.9v.X(6n)}}));$(6n).1c("eC").2p().1e("2k");if(!al.1p){zk()}u zk(){k so=$(6n).1c("J");al.1p=$("<G></G>").1t(so).2V("<G Y=\\"2k-1p-3H\\"></G>");al.1p.1p({2Z:Q,2W:N,4l:u(2d){k zl=x.3t(2d);cX(6n,zl);$(6n).1c("7y");x.4l.X(6n,2d)}});cX(6n,x.1A);k by=$("<G Y=\\"2k-44\\"></G>").1t(so);$("<a 26=\\"3I:3Z(0)\\" Y=\\"2k-5M\\"></a>").1F(x.zx).1t(by);$("<a 26=\\"3I:3Z(0)\\" Y=\\"2k-4d\\"></a>").1F(x.zz).1t(by);by.L(".2k-5M,.2k-4d").2l(u(){$(B).1e("2k-44-2l")},u(){$(B).1x("2k-44-2l")});by.L(".2k-5M").2e(u(){al.1p.1p({3y:3s 4f().6b(),3Q:3s 4f().62()+1,5M:3s 4f()})});by.L(".2k-4d").2e(u(){$(6n).1c("7y")})}};u zC(zm,q){cX(zm,q)};u zI(eu){k x=$.A(eu,"2k").E;k c=$.A(eu,"2k").1p;k zu=x.3t(c.1p("E").5M);cX(eu,zu);$(eu).1c("7y")};u cX(st,mI){k sp=$.A(st,"2k");k x=sp.E;$(st).1c("2S",mI).1c("7q",mI);sp.1p.1p("sF",x.1V(mI))};$.fn.2k=u(9J,sr){if(2b 9J=="2r"){k sq=$.fn.2k.1J[9J];if(sq){C sq(B,sr)}K{C B.1c(9J,sr)}}9J=9J||{};C B.P(u(){k sc=$.A(B,"2k");if(sc){$.1d(sc.E,9J)}K{$.A(B,"2k",{E:$.1d({},$.fn.2k.1u,$.fn.2k.1o(B),9J)})}zF(B)})};$.fn.2k.1J={E:u(jq){C $.A(jq[0],"2k").E},1p:u(jq){C $.A(jq[0],"2k").1p},2S:u(jq,zG){C jq.P(u(){cX(B,zG)})}};$.fn.2k.1o=u(rV){k t=$(rV);C $.1d({},$.fn.1c.1o(rV),{})};$.fn.2k.1u=$.1d({},$.fn.1c.1u,{eA:rS,cZ:"2q",8d:{up:u(){},4z:u(){},8c:u(){zI(B)},db:u(q){zC(B,q)}},zx:"LI",zz:"LJ",yV:"yY",3t:u(2d){k y=2d.6b();k m=2d.62()+1;k d=2d.78();C m+"/"+d+"/"+y},1V:u(s){k t=4f.f6(s);if(!4R(t)){C 3s 4f(t)}K{C 3s 4f()}},4l:u(2d){}})})(2T);(u($){u z2(68){k eS=$.A(68,"3n");k x=eS.E;$(68).2k($.1d({},x,{9v:u(){k yW=$(68).3n("3A");dd(68,yW,Q);x.9v.X(68)},3t:$.fn.2k.1u.3t,1V:$.fn.2k.1u.1V}));$(68).1x("2k-f").1e("3n-f");$(68).2k("1p").1p({4l:u(2d){x.4l.X(68,2d)}});k sU=$(68).2k("J");if(!eS.1U){k p=$("<G 2c=\\"dn:LL\\"><1L 2c=\\"U:LK\\"></G>").4a(sU.17("G.2k-1p-3H"));eS.1U=p.17("1L");k yQ=sU.17("G.2k-44");k ok=$("<a 26=\\"3I:3Z(0)\\" Y=\\"2k-ok\\"></a>").1F(x.yV).1t(yQ);ok.2l(u(){$(B).1e("2k-44-2l")},u(){$(B).1x("2k-44-2l")}).2e(u(){wg(68)})}eS.1U.3e({8a:x.8a,3j:x.uy}).2x(".3n").1m("5q.3n",u(e){e.54()});dd(68,x.1A)};u yR(t9){k c=$(t9).3n("1p");k t=$(t9).3n("1U");k 2d=c.1p("E").5M;C 3s 4f(2d.6b(),2d.62(),2d.78(),t.3e("er"),t.3e("dY"),t.3e("e6"))};u zb(yP,q){dd(yP,q,Q)};u wg(d2){k x=$.A(d2,"3n").E;k 2d=yR(d2);dd(d2,x.3t.X(d2,2d));$(d2).1c("7y")};u dd(5Q,c2,yU){k x=$.A(5Q,"3n").E;$(5Q).1c("2S",c2);if(!yU){if(c2){k 2d=x.1V.X(5Q,c2);$(5Q).1c("2S",x.3t.X(5Q,2d));$(5Q).1c("7q",x.3t.X(5Q,2d))}K{$(5Q).1c("7q",c2)}}k 2d=x.1V.X(5Q,c2);$(5Q).3n("1p").1p("sF",2d);$(5Q).3n("1U").3e("2S",yT(2d));u yT(2d){u lR(sD){C(sD<10?"0":"")+sD};k tt=[lR(2d.er()),lR(2d.dY())];if(x.8a){tt.1i(lR(2d.e6()))}C tt.3R($(5Q).3n("1U").3e("E").3j)}};$.fn.3n=u(9C,sI){if(2b 9C=="2r"){k sA=$.fn.3n.1J[9C];if(sA){C sA(B,sI)}K{C B.2k(9C,sI)}}9C=9C||{};C B.P(u(){k sQ=$.A(B,"3n");if(sQ){$.1d(sQ.E,9C)}K{$.A(B,"3n",{E:$.1d({},$.fn.3n.1u,$.fn.3n.1o(B),9C)})}z2(B)})};$.fn.3n.1J={E:u(jq){C $.A(jq[0],"3n").E},1U:u(jq){C $.A(jq[0],"3n").1U},2S:u(jq,z3){C jq.P(u(){dd(B,z3)})}};$.fn.3n.1o=u(n0){k t=$(n0);C $.1d({},$.fn.2k.1o(n0),$.1V.1o(n0,["uy",{8a:"1S"}]))};$.fn.3n.1u=$.1d({},$.fn.2k.1u,{8a:Q,uy:":",8d:{up:u(){},4z:u(){},8c:u(){wg(B)},db:u(q){zb(B,q)}},3t:u(2d){k h=2d.er();k M=2d.dY();k s=2d.e6();u iO(wj){C(wj<10?"0":"")+wj};k wr=$(B).3n("1U").3e("E").3j;k r=$.fn.2k.1u.3t(2d)+" "+iO(h)+wr+iO(M);if($(B).3n("E").8a){r+=wr+iO(s)}C r},1V:u(s){if($.82(s)==""){C 3s 4f()}k dt=s.47(" ");k d=$.fn.2k.1u.1V(dt[0]);if(dt.O<2){C d}k zf=$(B).3n("1U").3e("E").3j;k tt=dt[1].47(zf);k z5=2X(tt[0],10)||0;k z4=2X(tt[1],10)||0;k z6=2X(tt[2],10)||0;C 3s 4f(d.6b(),d.62(),d.78(),z5,z4,z6)}})})(2T);(u($){u 33(la){k vY=$("<G Y=\\"21\\">"+"<G Y=\\"21-3H\\">"+"<a 26=\\"3I:3Z(0)\\" Y=\\"21-5n\\"></a>"+"<1a Y=\\"21-31\\"></1a>"+"</G>"+"<G Y=\\"21-4F\\"></G>"+"<G Y=\\"21-w5\\"></G>"+"<G 2c=\\"43:cI\\"></G>"+"<1L 1I=\\"4T\\" Y=\\"21-1A\\">"+"</G>").4a(la);k 1C=$(la).2z().1b("1C");if(1C){vY.L("1L.21-1A").1b("1C",1C);$(la).4K("1C").1b("LE",1C)}C vY};u vG(iX,ci){k x=$.A(iX,"21").E;k 7j=$.A(iX,"21").21;if(ci){if(ci.U){x.U=ci.U}if(ci.V){x.V=ci.V}}if(x.4H=="h"){7j.1l("V","");7j.17("G").1l("V","");if(!4R(x.U)){7j.U(x.U)}}K{7j.1l("U","");7j.17("G").1l("U","");if(!4R(x.V)){7j.V(x.V);7j.L("G.21-4F").V(x.V);7j.L("G.21-w5").V(x.V);7j.L("G.21-3H").58(x.V)}}Ay(iX)};u zM(vR){k x=$.A(vR,"21").E;k w0=$.A(vR,"21").21;if(x.4H=="h"){vZ(x.4F)}K{vZ(x.4F.LD(0).Ly())}u vZ(aa){k 4F=w0.L("G.21-4F");k w4=w0.L("G.21-w5");4F.4u();w4.4u();1h(k i=0;i<aa.O;i++){k hI=i*4Z/(aa.O-1)+"%";k 1a=$("<1a></1a>").1t(4F);1a.1l((x.4H=="h"?"Z":"14"),hI);if(aa[i]!="|"){1a=$("<1a></1a>").1t(w4);1a.1F(aa[i]);if(x.4H=="h"){1a.1l({Z:hI,w2:-3v.jE(1a.1N()/2)})}K{1a.1l({14:hI,Lx:-3v.jE(1a.2j()/2)})}}}}};u jp(9E){k x=$.A(9E,"21").E;k bn=$.A(9E,"21").21;bn.1x("21-h 21-v 21-1z");bn.1e(x.4H=="h"?"21-h":"21-v");bn.1e(x.1z?"21-1z":"");bn.L("a.21-5n").2i({gC:x.4H,4e:"gk",1z:x.1z,gn:u(e){k Z=e.A.Z;k wO=bn.U();if(x.4H!="h"){Z=e.A.14;wO=bn.V()}if(Z<0||Z>wO){C N}K{k Aj=uL(9E,Z);wz(Aj);C N}},fV:u(){x.zZ.X(9E,x.1A)},fo:u(e){k Ai=uL(9E,(x.4H=="h"?e.A.Z:e.A.14));wz(Ai);x.A2.X(9E,x.1A)}});u wz(cB){k s=3v.Lw(cB%x.8n);if(s<x.8n/2){cB-=s}K{cB=cB-s+x.8n}kA(9E,cB)}};u kA(aU,6F){k x=$.A(aU,"21").E;k fl=$.A(aU,"21").21;k uW=x.1A;if(6F<x.3k){6F=x.3k}if(6F>x.3h){6F=x.3h}x.1A=6F;$(aU).1n(6F);fl.L("1L.21-1A").1n(6F);k 2A=Au(aU,6F);k 31=fl.L(".21-31");if(x.vg){31.2F();31.1F(x.A4.X(aU,x.1A))}K{31.2z()}if(x.4H=="h"){k cF="Z:"+2A+"px;";fl.L(".21-5n").1b("2c",cF);31.1b("2c",cF+"wv-Z:"+(-3v.jE(31.1N()/2))+"px")}K{k cF="14:"+2A+"px;";fl.L(".21-5n").1b("2c",cF);31.1b("2c",cF+"wv-Z:"+(-3v.jE(31.1N()))+"px")}if(uW!=6F){x.4Q.X(aU,6F,uW)}};u Ay(uB){k x=$.A(uB,"21").E;k fn=x.4Q;x.4Q=u(){};kA(uB,x.1A);x.4Q=fn};u Au(uQ,uN){k x=$.A(uQ,"21").E;k k6=$.A(uQ,"21").21;if(x.4H=="h"){k 2A=(uN-x.3k)/(x.3h-x.3k)*k6.U()}K{k 2A=k6.V()-(uN-x.3k)/(x.3h-x.3k)*k6.V()}C 2A.fM(0)};u uL(uM,2A){k x=$.A(uM,"21").E;k k9=$.A(uM,"21").21;if(x.4H=="h"){k vE=x.3k+(x.3h-x.3k)*(2A/k9.U())}K{k vE=x.3k+(x.3h-x.3k)*((k9.V()-2A)/k9.V())}C vE.fM(0)};$.fn.21=u(aS,zR){if(2b aS=="2r"){C $.fn.21.1J[aS](B,zR)}aS=aS||{};C B.P(u(){k jV=$.A(B,"21");if(jV){$.1d(jV.E,aS)}K{jV=$.A(B,"21",{E:$.1d({},$.fn.21.1u,$.fn.21.1o(B),aS),21:33(B)});$(B).4K("1z")}jp(B);zM(B);vG(B)})};$.fn.21.1J={E:u(jq){C $.A(jq[0],"21").E},2L:u(jq){C jq.P(u(){$.A(B,"21").21.1G();$(B).1G()})},23:u(jq,zP){C jq.P(u(){vG(B,zP)})},3A:u(jq){C jq.21("E").1A},2S:u(jq,zY){C jq.P(u(){kA(B,zY)})},6H:u(jq){C jq.P(u(){$.A(B,"21").E.1z=N;jp(B)})},6l:u(jq){C jq.P(u(){$.A(B,"21").E.1z=Q;jp(B)})}};$.fn.21.1o=u(vw){k t=$(vw);C $.1d({},$.1V.1o(vw,["U","V","4H",{vg:"1S",3k:"2O",3h:"2O",8n:"2O"}]),{1A:(t.1n()||1P),1z:(t.1b("1z")?Q:1P),4F:(t.1b("4F")?4U(t.1b("4F")):1P)})};$.fn.21.1u={U:"2q",V:"2q",4H:"h",vg:N,1z:N,1A:0,3k:0,3h:4Z,8n:1,4F:[],A4:u(A0){C A0},4Q:u(Lz,LA){},zZ:u(LC){},A2:u(LB){}}})(2T);',62,3118,'||||||||||||||||||||var||||||||||function|||opts|||data|this|return||options||div|datagrid|tree|panel|else|find||false|length|each|true|row|||width|height||call|class|left||menu|||top|||children||node|span|attr|combo|extend|addClass|tabs|rows|for|push|item|col|css|bind|val|parseOptions|calendar|body|null|window|appendTo|defaults|target|text|removeClass|view|disabled|value|treegrid|name|btn|_1e1|html|remove|cell|type|methods|header|input|searchbox|outerWidth|hit|undefined|selected|combobox|boolean|validatebox|spinner|parser|iconCls|tool|pagination|finder||slider||resize|icon||href|||field|proxy|typeof|style|date|click|title|getTr|hasClass|draggable|outerHeight|datebox|hover|layout|accordion|win|parent|auto|string|table|checkbox|_1ea|tab|idField|unbind|dir|hide|pos|next|collapsed|resizable|numberbox|show|document|_61e|_2fa|pageNumber|index|destroy|form|url|number|linkbutton|messager|combotree|setValue|jQuery|shadow|wrap|border|parseInt|_460|fit||tip|combogrid|init|pageSize|checked|expand|collapse||plain|grid|closed|tbody|dialog|timespinner|_6e|panels|max|tools|separator|min|_49|setTimeout|datetimebox|prependTo|total|display|expanded|new|formatter|footer|Math|mask|tr1|year|toolbar|getValue|_outerWidth|uD7FF|open|u00A0|prev|uF900|inner|javascript|progressbar|offset|uFFEF|uFDCF|uFDF0|onclick|north|month|join|tr2|east|animate|pageX|south|_e5|_c8|void||west|zIndex|clear|button|||split||_7d|insertAfter|loading|body2|close|cursor|Date|_52b|pageY|scrollLeft|editor|_2e1|onSelect|msg|menubutton|folder|active|scrollTop|body1|_2eb|box|empty|splitbutton|handler|droppable|_64b|down|break|multiple|_332|append|editable|rule|arrow|mode|add|_600|removeAttr|position|cls|_309|splice|_3cf|onChange|isNaN|prop|hidden|eval|apply|_e6|_3c7|checkbox1|100||case|last|onLoadSuccess|stopPropagation|_1f8|_76e||_outerHeight|propertygrid|_5bd|maximized|state|onExpand|none|sort|time|mouseleave|submenu|file|_4a0|_461|week|handle|focus|getPanel|mousedown|arguments|_5bc|group|frozenColumns|colspan|block|sortName|_47e|len|_73c|rownumbers|select|_38|pageList|_2dc|rowStyler|first|_60|replace|bar|_45e|current|onResize|_6c|_9e|_7ae|_2a7|setValues|_2e6|_6e2|_677|visible|_5b9|numberspinner|minimized|_452|textField|getMonth|closable|refresh|cellpadding|_1e0|_75b|_7a2|_652|getColumnFields|getFullYear|_77b|indent|cellspacing|_730|view2|right|_2f6|_4e|checkbox0|disable|_da|_78c|_257|_18b|_61|_19c|buttons|mouseenter|cpos|concat|_2b6|check|content|onAfterRender|loaded|_303|rowspan|noborder|getColumnOption|_7d7|_bf|enable|_6cc|_4e5|styler|align|_6a5|_a7|_398|_51d|_524|_|_44e|closest|_674|_63|_218|doSize|_437|blur|_361|_5cc|center|_1b3|onBeforeLoad|normal|_6b2|onLoadError|getDate|getValues|sortOrder|_3c1|_42f|_3d9|_6ec|highlight|substring|fixRowHeight|_46c|_7c5|_29|triggerHandler|_6bb|while|_32e|_182|setText|selectedRows|onBeforeCollapse|_1da|footer1|scroller|footer2|_2f8|hidePanel|_450|prompt|_d0|_18a|renderFooter|_708|_2ed|_4a|_58|getRow|_414|_457|_1a3|indexOf|_253|_76|_30d|_3f1|bottom|validate|_40a|_487|columns|_745|onOpen|boxWidth|fitColumns|onCollapse|dnd|trim|_d1|unshift|onClickRow|_103|rownumber|renderRow|_196|showSeconds|_5b2|enter|keyHandler|showFooter|singleSelect|noheader|_6d5|_290|startLeft|_101|load|_12|step|_326|which|_resize|_50b|loader|_65|_394|success|onLoad|method|_13|_6eb|collapsible|minimizable|maximizable|trigger|tmp|onBeforeExpand|_317|_3b0|_3ba|_4e6|_4df|insertedRows|_380|_5b0|_5b4|_7f|_37a|_4b1|_3db|_409|_441|_41c|_42e|_402|over|_3dd|day|_3f6|_3f9|_5ba|selectOnCheck|_635|_691|autoSizeColumn|_2a0||_294|_28c|curr|opt|_6b4|_276|getPager|_f7|region|_5f1|_2da|startTop|_5f6|expandWest|_60e|_302|expandEast|allbody|_29e|valueField|_1de|onShowPanel|_766|_205|_721|onUnselect|getData|_c|_7b4|_784|_7ce|_1eb|loadMsg|_73f|_748|_79b|_749|checkbox2|onCheck|onClose|cache|message|onBeforeEdit|_237|_64c|ajax|getRows|queryParams|_240|onAfterEdit|_601|onCancelEdit|_3d|_36d|_17d|_426|pager|_387|_1c|_577|mouseover|_379||_436|_636|_6b5|treeField|_1c0|_25d|filter|_320|_60d|_1b6|_78d|view1|inline|_308|_1bc|_30e|_53|remoteSort|_72d|_5b8|textarea|_34b|_356|after|onBeforeRender|_1c8|_67|checkOnSelect|_33a|_2f4|_783|refreshRow|_155|_707|cols|_3dc|nbsp|_716|_68d|insertBefore|_4bb|_4b9|move|_7e4|_113|_7d6|_3ee|_9b|_482|_100|firstDay|_3e5|render|_293|abbr|_472|_2b0|onClick|_3b4|_14d|error|startX||_2c0|_3af|_39e|_235|_714|_52d|actions|_84|_14b|_40e|startY|_7cf|_6e3|_14a|accept||_278|expandNorth|_77d|_676|_280|_607|_791|cancelEdit|_69b|_30a|_428|_679|onUnselectAll|onSelectAll|_644|_68a|_77e|_2b9|_2ab|_77f|_104|_774|_2a2|_634|_29f|_2f3|_106|loadData|_1ca|_188|_130|bodyCls|_2ec|_2f0|loadingMessage|_2fb|_7af|_4e0|suffix|prefix|_4c8|sele|_b|_3da|_4c2|||groupSeparator|invalid|tagName|onDrop|_396|_7c4|_3a5||_145|_423|_518|_4b2|_4b5|end|_463|_46a|_40f|_446|_141|_41b|increment|_47f|_42a|deltaY|_7d4|_13e|_4a1|deltaX|_7db|_3de|_7b|both|edge|_e9|_31c|_5cb|_197|_5c0|_33c|_339|_1ac|_5f3|_30c|expandSouth|_5fb|_1be|_794|_1af|panelHeight|_5f5|_193|_7ad|_133|searcher|_4b0|_517|_49f|_523|_471||query||_7a7|_367|_5ab|getSelected|_190|_5a3|_73|_dd|duration|_603|padding|onContextMenu|loadFilter|_6ad|nowrap|json||_parentId|keyCode|_242|_254|dataType|_20d|timer|_732|_226|_6e6|clearTimeout|pop|_735|_6cb|rowIdPrefix|_6b8|_6c6|_727|asc|_224|_1e6|_713|_1dd|_709|_74c|_25a|autoRowHeight|_35a|_20a|_385|getMinutes|_180|_5a7|_31d|_5a0|_729|_4e3|_59e|getSeconds|_353|_6d3|_7e|_72f|_448|_37d||validating|_723|headerCls|_4b6|onDblClickCell|_4e4|onDblClickRow||_36c|onClickCell|_db|_4cc||getHours|_323|_741|_796|_5fd|_6bc|_742|_46|editIndex|panelWidth|toDo|textbox|expandP|TO|_1ef|_233|clearSelections|_78a|resizeC|_2f7|_22b|_56|_31b|_201|_33e|_6db|_1f9|_7a3|before|_72e|_734|allfooter|showHeader|_21|_5b|_1a8|_31f|entered|_322|_19b|stop|parse|_5b5|_238|fix|_3e7|revert|_3e2|_6f6|_6f8||_473|_483|_9a|_211|_49a|_7d8|_20f||onStopDrag|_706|_4ce|_4bc|_6ea|_6f2|_4aa|_210|_20e|_3ec|_479|_449|_44a|_411|_451|documentElement|_3|_430|spin|_43d|mousemove|_14f|_410|onStopResize|toFixed|_d8|_476|onStartResize|minWidth|_153|_d9|handles|_4cf|onStartDrag|_14|_530|deletedRows|_52f|_52a|_13f|_521|onlyLeafCheck|_526|lines|_b7|200|validator|_c0|x09|_19|_23c|_1ee|_6df|_bd|_395|_51b|_50c|precision|pointer|RegExp|decimalSeparator|onDrag|wrapInner|_4d2|_4d3|_4d6|_4da|contextmenu|_4fa|_3bd|_506|_33|_424|editing|_3ac|_4f7|axis|_3ad|required|_4b7|_639|_29c|_12c|reload|_fd|_65e|_12f|_102|_2a3|isLoaded|remainText|_f9|beginEdit|endEdit|_6a9|selectRow|_28f|_246|onBeforeClose|_1e4|_f8|getChecked|_64a|_678|_67b|_27|_658|slideDown|_1e5|_667|_675|_661|_656|_67e|_689|_2a9|_2a6||_19a|_686|_2e|_657|_1e7|_682|_75d|scrollDuration|onResizeColumn|_2e2|_2b|_73b|_2e7|_282|_27d|_277|BODY|_511|_ad|_6a2|_512|_68f|_83|hasDownArrow|_505|_3b8|_7cc|_116|_3ab|_13b|_52c|_3a9|_43a|ids|_68b|thead|_112|_b2|_522|_515|startPosition|_71b|_4f6|_1a7|_27a|dblclick|_418|_110|_4ed|_4ec|10000|_70f|with|_2a4|_4fc|_3c0|_2ac||_690||_762|_3b7|_274|_8|_6b3|_2a8|||test|dpos|_68e|_40c||_179|_13a|_cb|_cc|_42b|cellClass|_ca|_c4|_bb|_c3|Please|_432|x20|_d3|contentPanel|_107|_37b|_26e|_37c|absolute|_2ba|_7ba|slideUp|_2b5|validType|_37f|_433|_548|_438|_680|_7c3|previousValue|_3a1|_43e|_39f|_32|_43c|updatedRows|_138|_683|switch|_435|_544|ref|_545|_787|_546|_431|pre|keydown|_67f|_6e4|_67c|_17|_684|_a3|_131|_12b|_7cd||createTextRange|_486|_6fb|_220|_3f2|_105|_475|_21f|_764|_12a|_10a|modal|_80|round|_3c4|_48f|_69d|weeks|_48c|_9f|_a0|_7|_7a|_3f4|_700|showRefresh|_401|_465|_286|_45b|_7e6|header2|_f6|_15a|_21c|_219|header1|_3fd|_11b|_d4|_128|_7df|_46e|_144|_7e2|_3f3|_45a|question|_120|_468|_3f0|_157|_497|onBeforeDestroy|_4c5|_702|_3d3|_65c|_4c7|_298|_416|_225|_4be|_3d7|_386|_417|_4cd|_3c9|onMinimize|_ab|_10e|_7d5|_122|_86|_10|_10c|_44c|info|_3cc|btable|_150|_49b|_6f0|_6ef|_6f5|_2|_673|_10d|_3e4|_6f4|_6e9|_270|_3e3|_4a4|_154|_214|_761|_4ad|_4b4|_a6|_297|_4a2|now|_13c|_6e1|_296|_14e|_7c0|_77c|_77a|_1a0|_287|_346|_34e|_59c||_5fa|onShow|_5a1|_34a|onSelectPage|_5af|_249|_781|_1e9|_189|_5b3|_61b|_314|_345|_de|_2db|noscroll|_5fe|_359|_250|_350|_e8|getSelections|_35d|_72|_6c3|_779|striped|_255|_34f|_18d|_1b9|onHide|_45|_7b2|original|_355|page|_73e|updateRow|_637|_321|_5ca|_5cd|_331|root|_1fa|_57|_ec|_2a|_1f6|_19e|maxWidth|minHeight||_324|_fa|maxHeight|_24c|onclick1|_6b9|_32c|_22|_24b|_198|insertRow|pmask|_318|_11|_18f|_73d|cc2|_5bb|onAdd|cc1|post|_5c1|_ed|pagePosition|_62|_ea|_194|_752|_33f|getItem|_24|onUncheckAll|_799|onSortColumn|_35c|_4ba|_4ac|_617|_740|_301|onUncheck|_2d9|_79|_664|_25f|_1c6|_4c|_2ff|browser|_614|_7b9|_376|_778|selectHis|_1e|_665|_2c2|_285|expander|_115|_27f|num|_4b|_4c0||_581|_117|_2f9|msie|_366|_36f|_2f5|_653|_1c2||_22f|onCheckAll|_1a6|_4c6||_12d|_365||_71e|_663|_77|_381|_9c|_fb|_41e|_319|_1d5|_40d|_271|_187|_1ec|_23f|_98|_419|_427|_108|showSpeed|_2e8|_19d|showType|_cf|_a5|_146|_143|siblings|_421|_1a2|_24d|months|_2fd|_3e8|_252|_97|_41d|_425|_41f|_16a|_212|_295|slide|_11c|_11d||_2dd|_2de|_3fc|selectionStart||_11a|_1d9||_1db|_1c5|_1ed|_1c4|_3eb|_1bd|_11e|_2df|_25c|_403|_404|_11f|_258|_1c1|_405|_2e0|_1f3|_3ff|_310|_25b|_275|parseFloat|_304|_121|_1dc|_291|_283|_407|_2e9|_f4|_3ed|_3ea|_94|_2fe|_2ea|_151|_1b1|_3e9|container|_1b5||_3f8|toUpperCase|_2e5|_3f7|_284|_300|_288|_3ef|_1d8|_1c7|_281|_413|_2e3|_27c|_3d0|_370|_e1|_279|_399|_39a|_236|_20c||_b9|||_372|action|_28e|_139||_c1|_bc|_be|_245|_a8|clone|tag|_35e|_b8|_232|_1fe|_18c|_1b8|_22e|_3b1|_e3|onSubmit|_36b|_3a3|_29b|submit|_392|_207|_360|_393|_243|missingMessage|_38a|_183|_383|invalidMessage|_d5|_d6|_37e|_9d|_209|_2bc|_2bb|_127|_384|_17a|_134|_389|_d7|_d2|_38e|_377|_137|_c9|_390|_23a|_2b1|_c2|sub|_17b|_206|x0d|_208|_c5|_23d|_17c|_17f|cascadeCheck|_3b2|getTab|_2aa|_3cb|idx|_382|_265|_33d|_292|_e4|_135|_333|nextmonth|_e7|prevmonth|nextyear|_3c8|prevyear|_1fc|_3d2|_3df|_31e|_215|onBeforeOpen|_129|_328|_199|_32b|||interval|_337|onBeforeDrag|scrollIncrement|_3d6|_336|cancel|_13d|_109|_123|_1d3|_351|_ae|downarrow|restore|_3b6|_3bb|_2ae|_3bc|_16f|_352|_244|_1fd|_b3||_358|_22d|onDragLeave|_354|_227|_152|_347|_200|_228|_2a5|_1b2|_3c5|_e0|_126|_348|onDragOver|_34d|_229|_ac|_247|_349|_1bb|_2ad|_327|_507|_525|180|delay|_621|_7a0|_6e8|_48a|_66|_36|_6b6|||_6af|_50d|_509|_429|_25|_31|_519|_6ae||_79e|originalRows||groupField|ceil|_6bd|showGroup|sortable|_616|_4c1|_618|_6dd|_78f|_79a|_79d|_79c||_798|_61c|_81||_6be|_4ef|_508|_7b6|_4f0|_4eb|_7b3|_4f2|moveTo|_4f5|ftable|_7b5|_4e7|_6a|_492|_4dd|_4ea|_69e|_746|_7b7|isValid|_4fb|_23|_7a5|_501|droppables|_26|_6e7|onRowContextMenu|vbox|_69|_87|_4f8|_6e5|_4f9|_4ff|scrollbarSize|_6ab|_7a9|||_785||_587|_736|_733||_602|_55|_738|_566|_579|_5f9||_580|_54||_765||_768|_4f|_760|_48|_4d|_75e|_55d|_5f7|_731|_6d9|_56f|_6d7|_747|_693|_74b|_6da|_74a|startHeight|_6d4|getEditors|option|_5f8|_578|_5f4|startWidth|_73a|_5a|boxModel|_543|_6c0|_611|_724|_726|_5d|_4a7|fvalue|getRowIndex|_4a9|_613|_786|_615|remote|_5e|_60c|_612|_54b|groupIndex|shift|_554|_6c5|_604|_72c|_767||_769|_582|_763||fixColumnSize|_5c|_60a|_3f|_59|_76c|_72a|_6c2|timeSeparator|_4e8|_466|_7dc|_598|desc|_467|_642|_70a|showPageList|_45d|comboName|_66b|_7e0|_7e1|_7de|_5a4|_6fa|_7dd|_59a|_70b|_462|_47b|_47a|_7d9|_47c|_4dc|_484|_480|_481|_8a|_651|_46d|_654|resizing|_46f|_470|_650|_474|_422|_65f|_5b1|_43f|trs2|showTip|onComplete|_5ac|_445|_444|_4|_5ad|_63d|_42c|_434|_643|_692|_67a|_694|plugins||_7e9|_44d|_458|getRoots|_5b6|_459|_704|_662|_7e3|_455|_7c2|_668|_697|_5a9|_671|_670|_66f|_5b7|_66c|_6f3|_477|_7c8|_6d2|_4a8|_640|_4af|_6d|_593|_7c1|_7ca|_7c9|deleteRow|marginLeft|_e|_7cb|rulelabel|_645|scroll|_6a6|_6a1|_4c4|_1f|_6a3|_4d5|_638|_4d8|_7ac|_4d9|_631|_7bb|_15|_63c|_1b|_63e|_4ca|_63b|_4d1|_7bc|_2d|_6a4|_f|margin|toLowerCase|_6ed|_491|_7d2|cellSelector|_48e|_d|rules|_6f|_48d|_6|_699|_493|_5c3|_74|_485|easyloader|_648|_7d0|_488|_489|_71|_221|_6f1|_6e0|_241|off|_6dc|_39|preventDefault|_222|||_230|_119|callee|_34|_35|_22c|_6fd|_231|_223|_6f7|doit|_234|progress|_6ee|_22a|_23e|_dragenter|_6b1|_68c|_69c|_6a0|_69f|_289|_28a|_685|_688|_28d|_698|_6a8|_27e|_272|_6ac|_26f|_6aa|_273|_40|_6a7|marginRight|0px|expandTo|_681|getFooterRows|getRoot|_65a|getParent|reloadFooter|_696|_61d|_63f|_695|getChildren|_669|toggle|collapseAll|_67d|expandAll|_29a|unselectRow|_66e|_299|||isLeaf|_6b0|onRemove|_69a|_6c7|_251|_24f|_6c4|transfer|_37|_6c1|_259|_3e|_24e|_6c8|_3b|_dragover|_3a|_dragleave|_248|_6cd|_6c9|_3c|_drop|sorter|_25e|_6b7|_264|_256|_263|_6fe|space|_111|onBeforeRemove|white|_262|_6ba|_24a|_239|_23b|getLevel|treeLevel|treeNodes|_261|_6bf|_260|_6d6|_1f1|_7ab|_7a6|_7a8|_191|_7b1|_7b0|okText|_7a4|_1a5|Ok|_1a4|_1a1|_19f|_7a1|_7b8|_7be|hour|_7bf|onBeforeSelect|onDblClick|_16|_1a|_7aa|_184|_181|_17e|_7bd|_1a9|_1aa|_782|local|_78e|_790|_793|_789|_1c9|_1bf|_76d|_195|_192|_788|_797|_1ba|_1ae|currentText|_28|closeText||_1ad|_792|_1b0|_1b7|_78b|_79f|_1b4|_795|_172|_171|_159|_7c7|_136|_158|_7e7|_118|_7e5|_15d|_142|_125|_15c|_15b|_140|_7e8|onSlideStart|_7ea|_14c|onSlideEnd|_148|tipFormatter|_5|_92|_95|_a|_156|_9|_15e|_15f|_169|_16b|_132|_168|_12e|_7d3|_7d1|_16e|_170|_16d|_16c|_149|insert|_167|_162|_114|_161|_7da|_160|_163|_10b|_7c6|_166|_165|_10f|_164|_1c3|_1cb|_202|New|onHidePanel|_18|_30|_71a|_70c|_1d|locked|_6fc|_6ff|_719|_71f|_1f7|_1fb|_2f|_737|_1f5|_743|_1ff|_72b|_720|_1f4|_725|_204|_203|fade|_124|_70d|_217|warning|_70e|_710|_21a|_21b|_21e|_701|_21d|_703|_705|_711|object|_20|_717|_718|_213|_6f9|_6de|_712|timeout|_715|readonly|_216|_6d8|_1f2|_739|_1d2|uncheck|_1d1|_76f|_771|_76b|extractor|onDestroy|onMove|_75a|_1d4|_76a|_770|_773|_1ce|_780|_1ab|_1cd|_1cc|_777|_1cf|_772|_775|_776|_1d0|_18e|onMaximize|onRestore|clientHeight|unselect|scrollHeight|clientWidth|scrollWidth|_750|_74f|_1e8|_1f0|_1df|_74d|_74e|compatMode|_751|_1e3|_2c|_1e2|_75c|_75f|_756|_755|_728|_722|_753|_744|_754|300|_62b|radio|_537|_538|_539|_53c|_53a|_b6|_536|_532|_3a4|_534|_3a2|_535|_39c|_53d|_397|_ba|offval|_547|_549|_b5|_542|_53e|_39b|_53f|_540|_541|_3a6|_3a0|ctrlKey|yes|_520|_b0|_51f|_b1|_af|_516|_50e|_3b9|_50f|_513|clipboardData|_b4|_51e|_39d|_44f|_3a7|_44b|_45f|_440|_52e|_528|_527|_3ae|merged|numberboxName|_54a|1000|x22|_38b|_567|x0a|x7f|_568|email|_ce|_563|_562|_564|_565|_cd|x0c|x0b|_570|_dc|_571|_df|_572|del|_56d|_569|x01|_56a|_56b|_56c|_561|_560|_553|_552|_391|_c7|_555|_551|_550|_54d|_54c|_54e|iframe|_54f|_556|_38f|_55b|_38c|_55c|_55e|_55f|valid|_55a|_c6|_557|_558|_559|_38d|_82|_85|_469|500|_3fb|_46b|_478|_3fa|onSpinUp|onSpinDown|_456|_45c|_406|_3fe|_464|_3f5|rate|_a2|styleSheets|_a4|_a9|_490|_88|_a1|_99|_96|_89|_48b|styleSheet|_400|_93|frozen|onRefresh|_447|_443|_453|trs1|_408|_42d|_41a|_439|_43b|_420|_415|onChangePageSize|pages|afterPageText|displayMsg|_40b|from|beforePageText|character|_412|_454|float|onBeforeRefresh|ptop|_494|_496|_4e2|_4db|nav|_4e9|_4f1|_3c6|_3ca|_4d7|_4d0|keypress|_3ce|_4d4|_3cd|_4f4|_4e1|_3aa|_502|_3b5|_3b3|_503|_3be|_3bf|_4fd|_4fe|_4ee|_500|oldHtml|_3d1|_4cb|_49e|_6b|_3e1|_4a3|_3e0|_aa|_49c|_495|_3e6|_498|_499|_49d|other|_4a5|_3d8|_4bf|_3d5|_4c3|_4c9|_4bd|_4b8|_3d4|_4a6|_4ab|_4ae|_4b3|_573|_56e|groupFormatter|_47|_619|_2f2|_61a|_2fc|collapseGroup|_610|_306|_ef|groups|expandGroup|_61f|_620|_62d|_62a|_62c|_62f|_62e|_629|_628|_624|_f1|_626|_627|_2e4|_305|_60f|_574|_313|_311|_5f0|_30b|validateRow|_2f1|_31a|_f0|onHeaderContextMenu|_316|_315|_307|_5f2|_608|_5fc|_609|25px|_60b|_5ff|_605|_30f|overflow|alt|joinbottom|_606|_630|_f3|_2b4|_65d|_660|_27b|_28b|_65b|_29d|_655|_2c5|_2c4|_659|_2c3|_666|_2c1|_2b3|_672|_2b2|_687|_2af|_2b7|_2b8|_2be|_2bf|_66a|_66d|_2bd|order|_2c6|_ff|_63a|onDragEnter|_fe|mouseout|_633|_fc|_632|_ee|_f5|onUpdate|line|_641|_646|update|_2a1|_2c7|_64f|_64d|_2c8|_64e|_647|_2cb|_2ca|_649|_2c9|deltaWidth|_312|_368|_58f|_78|_4f3|_591|_590|_36a|_58e|_4de|_35f|_58c|_36e|_58d|_592|_362|_504|deltaHeight|_596|_51a|_357|6px|_50a|_35b|attributes|_363|_514|_510|_594|_369|_364|_57e|_57c|_57d|_57f|_e2|exec|_57b|_57a|_375|_575|_378|_576|_388|_583|_584|list|_371|_58a|_7c|_58b|_589|_588|_585|_47d|parents|_586|_374|_51c|_595|_325|_75|_329|_70|_33b|_338|_eb|_330|_5bf|_32a|_5c4|_5f|_64|_531|_59d|_5ce|_5cf|one|editors|_5c9|_335|_68|_5c7|_5c8|_32f|_340|_5a2|_5a5|_51|_59f|all|_5a6|_59b|_529|_597|_599|_50|_34c|mouseup|_341|_5aa|_344|_5ae|_343|_5be|_52|_5a8|_342|easyui|_1|_8f|_90|_8e|20px|Displaying|_f2|_44|_43|_42|size|_41|change|_8b|sqrt|_91|Function|Page|items|_8c|_8d|has|uncheckRow|checkRow|selectRecord|checkAll|uncheckAll|appendRow|getEditor|unselectAll|selectAll|inserted|removeData|selectorText|deleted|updated|_53b|_533|getChanges|acceptChanges|_5d0|_5c6|_5c5|_5d1|_5d2|_5d4|_5d3|wait|please|showColumn|mergeCells|rejectChanges|hideColumn|_5c2|Processing|visibility|cssRules|sheet|Mar|Feb|Jan|Apr|May|Jul|Jun|sunday|saturday|_3c3|_3c2|imeMode|Aprial|2010|today|getDay|Aug|Sep|_442|1900|_147|substr|htable|fixed|floor|moveEnd|setSelectionRange|Dec|Nov|Oct|selection|createRange|StartToStart|setEndPoint|_5d5|_5d6|_6d1|_6d0|_6cf|autocomplete|default|getText|showPanel|_6ce|_6ca|_622|Value|Name|_623|_625|foot|events|_71c|_71d|abs|marginTop|reverse|_7eb|_7ec|_7ee|_7ed|slice|sliderName|_759|_758|_757|Today|Close|80px|2px|startRow|16px|_5e2|_5e1|_5e0|_5e3|_5e4|_5e6|_5e5|_5df|_5de|_5d9|_5d8|_5d7|_5da|_5db|_5dd|_5dc|_5e7|_5e8|color|ccc|solid|666|font|bold|weight|1px|_5ef|_5ea|_5e9|_5eb|_5ec|_5ee|_5ed|dragenter|moveStart|sep|Loading|_2ef|rightarrow|minimize|setTitle|location|maximize|_2ee|_2d8|_2d3|_2d2|_2d1|_2d4|_2d5|_2d7|_2d6|appendChild|outerHTML|getName|searchboxName|110000|selectName|Z_|_185|x08|This|disableItem|enableItem|_186|_334|_32d|setIcon|findItem|removeItem|appendItem|_2d0|_2cf|alert|4000|_1d7|_1d6|confirm|Cancel|setInterval|clearInterval|250|600|9000|Window|_20b|BackCompat|Dialog|fadeOut|fadeIn|getPanelIndex|_266|enableTab|exists|getTabIndex|disableTab|400|_2ce|_2cd|_2cc|innerWidth|5px|_269|_268|_267|_26a|_26b|_26d|_26c|_178|_373|about|selectedIndex|URL|ActiveXObject|shiftKey|blank|finally|try|uF8FF|src|between|easyui_frame_|getTime|disableDnd|x0e|_175|responseText|enableDnd|and|async|contents|_176|_3a8|CSS1Compat|x5b|getNode|password|relative|x1f|x21|x23|String|x5d|https|ftp|_177|uE000|118|address|_174|_173|paste|x7e'.split('|'),0,{}))
    diff --git a/src/main/webapp/plug-in/easyui/locale/en.js b/src/main/webapp/plug-in/easyui/locale/en.js
    new file mode 100644
    index 00000000..7331b8b7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/locale/en.js
    @@ -0,0 +1,70 @@
    +if ($.fn.pagination){
    +	$.fn.pagination.defaults.beforePageText = 'Page';
    +	$.fn.pagination.defaults.afterPageText = 'Total{pages}Page';
    +	$.fn.pagination.defaults.displayMsg = 'Show{from}To{to},Total{total}Record';
    +}
    +if ($.fn.datagrid){
    +	$.fn.datagrid.defaults.loadMsg = 'Process, Please Wait...';
    +}
    +if ($.fn.treegrid && $.fn.datagrid){
    +	$.fn.treegrid.defaults.loadMsg = $.fn.datagrid.defaults.loadMsg;
    +}
    +if ($.messager){
    +	$.messager.defaults.ok = 'Confirm';
    +	$.messager.defaults.cancel = 'Cancel';
    +}
    +if ($.fn.validatebox){
    +	$.fn.validatebox.defaults.missingMessage = 'This item must enter';
    +	$.fn.validatebox.defaults.rules.email.message = 'Please enter valid email address';
    +	$.fn.validatebox.defaults.rules.url.message = 'Please enter valid URL address';
    +	$.fn.validatebox.defaults.rules.length.message = 'Enter context length must betweeen{0}with{1}';
    +	$.fn.validatebox.defaults.rules.remote.message = 'Please fix this filed';
    +}
    +if ($.fn.numberbox){
    +	$.fn.numberbox.defaults.missingMessage = 'This item must enter';
    +}
    +if ($.fn.combobox){
    +	$.fn.combobox.defaults.missingMessage = 'This item must enter';
    +}
    +if ($.fn.combotree){
    +	$.fn.combotree.defaults.missingMessage = 'This item must enter';
    +}
    +if ($.fn.combogrid){
    +	$.fn.combogrid.defaults.missingMessage = 'This item must enter';
    +}
    +if ($.fn.calendar){
    +	$.fn.calendar.defaults.weeks = ['Sun','Mon','Tus','Wen','Ths','Fir','Sat'];
    +	$.fn.calendar.defaults.months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Set','Oct','Nov','Dec'];
    +}
    +if ($.fn.datebox){
    +	$.fn.datebox.defaults.currentText = 'Today';
    +	$.fn.datebox.defaults.closeText = 'Close';
    +	$.fn.datebox.defaults.okText = 'Confirm';
    +	$.fn.datebox.defaults.missingMessage = 'This item must enter';
    +	$.fn.datebox.defaults.formatter = function(date){
    +		var y = date.getFullYear();
    +		var m = date.getMonth()+1;
    +		var d = date.getDate();
    +		return y+'-'+(m<10?('0'+m):m)+'-'+(d<10?('0'+d):d);
    +	};
    +	$.fn.datebox.defaults.parser = function(s){
    +		if (!s) return new Date();
    +		var ss = s.split('-');
    +		var y = parseInt(ss[0],10);
    +		var m = parseInt(ss[1],10);
    +		var d = parseInt(ss[2],10);
    +		if (!isNaN(y) && !isNaN(m) && !isNaN(d)){
    +			return new Date(y,m-1,d);
    +		} else {
    +			return new Date();
    +		}
    +	};
    +}
    +if ($.fn.datetimebox && $.fn.datebox){
    +	$.extend($.fn.datetimebox.defaults,{
    +		currentText: $.fn.datebox.defaults.currentText,
    +		closeText: $.fn.datebox.defaults.closeText,
    +		okText: $.fn.datebox.defaults.okText,
    +		missingMessage: $.fn.datebox.defaults.missingMessage
    +	});
    +}
    diff --git a/src/main/webapp/plug-in/easyui/locale/zh-cn.js b/src/main/webapp/plug-in/easyui/locale/zh-cn.js
    new file mode 100644
    index 00000000..867d4205
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/locale/zh-cn.js
    @@ -0,0 +1,70 @@
    +if ($.fn.pagination){
    +	$.fn.pagination.defaults.beforePageText = '绗';
    +	$.fn.pagination.defaults.afterPageText = '鍏眥pages}椤';
    +	$.fn.pagination.defaults.displayMsg = '鏄剧ず{from}鍒皗to},鍏眥total}璁板綍';
    +}
    +if ($.fn.datagrid){
    +	$.fn.datagrid.defaults.loadMsg = '姝e湪澶勭悊锛岃绋嶅緟銆傘傘';
    +}
    +if ($.fn.treegrid && $.fn.datagrid){
    +	$.fn.treegrid.defaults.loadMsg = $.fn.datagrid.defaults.loadMsg;
    +}
    +if ($.messager){
    +	$.messager.defaults.ok = '纭畾';
    +	$.messager.defaults.cancel = '鍙栨秷';
    +}
    +if ($.fn.validatebox){
    +	$.fn.validatebox.defaults.missingMessage = '璇ヨ緭鍏ラ」涓哄繀杈撻」';
    +	$.fn.validatebox.defaults.rules.email.message = '璇疯緭鍏ユ湁鏁堢殑鐢靛瓙閭欢鍦板潃';
    +	$.fn.validatebox.defaults.rules.url.message = '璇疯緭鍏ユ湁鏁堢殑URL鍦板潃';
    +	$.fn.validatebox.defaults.rules.length.message = '杈撳叆鍐呭闀垮害蹇呴』浠嬩簬{0}鍜寋1}涔嬮棿';
    +	$.fn.validatebox.defaults.rules.remote.message = '璇蜂慨姝h瀛楁';
    +}
    +if ($.fn.numberbox){
    +	$.fn.numberbox.defaults.missingMessage = '璇ヨ緭鍏ラ」涓哄繀杈撻」';
    +}
    +if ($.fn.combobox){
    +	$.fn.combobox.defaults.missingMessage = '璇ヨ緭鍏ラ」涓哄繀杈撻」';
    +}
    +if ($.fn.combotree){
    +	$.fn.combotree.defaults.missingMessage = '璇ヨ緭鍏ラ」涓哄繀杈撻」';
    +}
    +if ($.fn.combogrid){
    +	$.fn.combogrid.defaults.missingMessage = '璇ヨ緭鍏ラ」涓哄繀杈撻」';
    +}
    +if ($.fn.calendar){
    +	$.fn.calendar.defaults.weeks = ['鏃','涓','浜','涓','鍥','浜','鍏'];
    +	$.fn.calendar.defaults.months = ['涓鏈','浜屾湀','涓夋湀','鍥涙湀','浜旀湀','鍏湀','涓冩湀','鍏湀','涔濇湀','鍗佹湀','鍗佷竴鏈','鍗佷簩鏈'];
    +}
    +if ($.fn.datebox){
    +	$.fn.datebox.defaults.currentText = '浠婂ぉ';
    +	$.fn.datebox.defaults.closeText = '鍏抽棴';
    +	$.fn.datebox.defaults.okText = '纭畾';
    +	$.fn.datebox.defaults.missingMessage = '璇ヨ緭鍏ラ」涓哄繀杈撻」';
    +	$.fn.datebox.defaults.formatter = function(date){
    +		var y = date.getFullYear();
    +		var m = date.getMonth()+1;
    +		var d = date.getDate();
    +		return y+'-'+(m<10?('0'+m):m)+'-'+(d<10?('0'+d):d);
    +	};
    +	$.fn.datebox.defaults.parser = function(s){
    +		if (!s) return new Date();
    +		var ss = s.split('-');
    +		var y = parseInt(ss[0],10);
    +		var m = parseInt(ss[1],10);
    +		var d = parseInt(ss[2],10);
    +		if (!isNaN(y) && !isNaN(m) && !isNaN(d)){
    +			return new Date(y,m-1,d);
    +		} else {
    +			return new Date();
    +		}
    +	};
    +}
    +if ($.fn.datetimebox && $.fn.datebox){
    +	$.extend($.fn.datetimebox.defaults,{
    +		currentText: $.fn.datebox.defaults.currentText,
    +		closeText: $.fn.datebox.defaults.closeText,
    +		okText: $.fn.datebox.defaults.okText,
    +		missingMessage: $.fn.datebox.defaults.missingMessage
    +	});
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/accordion.css b/src/main/webapp/plug-in/easyui/themes/black/accordion.css
    new file mode 100644
    index 00000000..a0f6ddc3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/accordion.css
    @@ -0,0 +1,41 @@
    +.accordion {
    +  overflow: hidden;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.accordion .accordion-header {
    +  border-width: 0 0 1px;
    +  cursor: pointer;
    +}
    +.accordion .accordion-body {
    +  border-width: 0 0 1px;
    +}
    +.accordion-noborder {
    +  border-width: 0;
    +}
    +.accordion-noborder .accordion-header {
    +  border-width: 0 0 1px;
    +}
    +.accordion-noborder .accordion-body {
    +  border-width: 0 0 1px;
    +}
    +.accordion-collapse {
    +  background: url('images/accordion_arrows.png') no-repeat 0 0;
    +}
    +.accordion-expand {
    +  background: url('images/accordion_arrows.png') no-repeat -16px 0;
    +}
    +.accordion {
    +  background: #666;
    +  border-color: #000;
    +}
    +.accordion .accordion-header {
    +  background: #3d3d3d;
    +  filter: none;
    +}
    +.accordion .accordion-header-selected {
    +  background: #0052A3;
    +}
    +.accordion .accordion-header-selected .panel-title {
    +  color: #fff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/calendar.css b/src/main/webapp/plug-in/easyui/themes/black/calendar.css
    new file mode 100644
    index 00000000..280f75f1
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/calendar.css
    @@ -0,0 +1,185 @@
    +.calendar {
    +  border-width: 1px;
    +  border-style: solid;
    +  padding: 1px;
    +  overflow: hidden;
    +  font-size: 12px;
    +}
    +.calendar table {
    +  border-collapse: separate;
    +  font-size: 12px;
    +  width: 100%;
    +  height: 100%;
    +}
    +.calendar-noborder {
    +  border: 0;
    +}
    +.calendar-header {
    +  position: relative;
    +  height: 22px;
    +}
    +.calendar-title {
    +  text-align: center;
    +  height: 22px;
    +}
    +.calendar-title span {
    +  position: relative;
    +  display: inline-block;
    +  top: 2px;
    +  padding: 0 3px;
    +  height: 18px;
    +  line-height: 18px;
    +  cursor: pointer;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-prevmonth,
    +.calendar-nextmonth,
    +.calendar-prevyear,
    +.calendar-nextyear {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -7px;
    +  width: 14px;
    +  height: 14px;
    +  cursor: pointer;
    +  font-size: 1px;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-prevmonth {
    +  left: 20px;
    +  background: url('images/calendar_arrows.png') no-repeat -18px -2px;
    +}
    +.calendar-nextmonth {
    +  right: 20px;
    +  background: url('images/calendar_arrows.png') no-repeat -34px -2px;
    +}
    +.calendar-prevyear {
    +  left: 3px;
    +  background: url('images/calendar_arrows.png') no-repeat -1px -2px;
    +}
    +.calendar-nextyear {
    +  right: 3px;
    +  background: url('images/calendar_arrows.png') no-repeat -49px -2px;
    +}
    +.calendar-body {
    +  position: relative;
    +}
    +.calendar-body th,
    +.calendar-body td {
    +  text-align: center;
    +}
    +.calendar-day {
    +  border: 0;
    +  padding: 1px;
    +  cursor: pointer;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-other-month {
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +}
    +.calendar-menu {
    +  position: absolute;
    +  top: 0;
    +  left: 0;
    +  width: 180px;
    +  height: 150px;
    +  padding: 5px;
    +  font-size: 12px;
    +  display: none;
    +  overflow: hidden;
    +}
    +.calendar-menu-year-inner {
    +  text-align: center;
    +  padding-bottom: 5px;
    +}
    +.calendar-menu-year {
    +  width: 40px;
    +  text-align: center;
    +  border-width: 1px;
    +  border-style: solid;
    +  margin: 0;
    +  padding: 2px;
    +  font-weight: bold;
    +}
    +.calendar-menu-prev,
    +.calendar-menu-next {
    +  display: inline-block;
    +  width: 21px;
    +  height: 21px;
    +  vertical-align: top;
    +  cursor: pointer;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-menu-prev {
    +  margin-right: 10px;
    +  background: url('images/calendar_arrows.png') no-repeat 2px 2px;
    +}
    +.calendar-menu-next {
    +  margin-left: 10px;
    +  background: url('images/calendar_arrows.png') no-repeat -45px 2px;
    +}
    +.calendar-menu-month {
    +  text-align: center;
    +  cursor: pointer;
    +  font-weight: bold;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-body th,
    +.calendar-menu-month {
    +  color: #ffffff;
    +}
    +.calendar-day {
    +  color: #fff;
    +}
    +.calendar-sunday {
    +  color: #CC2222;
    +}
    +.calendar-saturday {
    +  color: #00ee00;
    +}
    +.calendar-today {
    +  color: #0000ff;
    +}
    +.calendar-menu-year {
    +  border-color: #000;
    +}
    +.calendar {
    +  border-color: #000;
    +}
    +.calendar-header {
    +  background: #3d3d3d;
    +}
    +.calendar-body,
    +.calendar-menu {
    +  background: #666;
    +}
    +.calendar-body th {
    +  background: #555;
    +}
    +.calendar-hover,
    +.calendar-nav-hover,
    +.calendar-menu-hover {
    +  background-color: #777;
    +  color: #fff;
    +}
    +.calendar-hover {
    +  border: 1px solid #555;
    +  padding: 0;
    +}
    +.calendar-selected {
    +  background-color: #0052A3;
    +  color: #fff;
    +  border: 1px solid #00458a;
    +  padding: 0;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/combo.css b/src/main/webapp/plug-in/easyui/themes/black/combo.css
    new file mode 100644
    index 00000000..d0af3b7d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/combo.css
    @@ -0,0 +1,58 @@
    +.combo {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +  vertical-align: middle;
    +}
    +.combo .combo-text {
    +  font-size: 12px;
    +  border: 0px;
    +  line-height: 20px;
    +  height: 20px;
    +  margin: 0;
    +  padding: 0px 2px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.combo-arrow {
    +  width: 18px;
    +  height: 20px;
    +  overflow: hidden;
    +  display: inline-block;
    +  vertical-align: top;
    +  cursor: pointer;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.combo-arrow-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.combo-panel {
    +  overflow: auto;
    +}
    +.combo-arrow {
    +  background: url('images/combo_arrow.png') no-repeat center center;
    +}
    +.combo,
    +.combo-panel {
    +  background-color: #666;
    +}
    +.combo {
    +  border-color: #000;
    +  background-color: #666;
    +}
    +.combo-arrow {
    +  background-color: #3d3d3d;
    +}
    +.combo-arrow-hover {
    +  background-color: #777;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/combobox.css b/src/main/webapp/plug-in/easyui/themes/black/combobox.css
    new file mode 100644
    index 00000000..bb0c2b0e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/combobox.css
    @@ -0,0 +1,14 @@
    +.combobox-item {
    +  padding: 2px;
    +  font-size: 12px;
    +  padding: 3px;
    +  padding-right: 0px;
    +}
    +.combobox-item-hover {
    +  background-color: #777;
    +  color: #fff;
    +}
    +.combobox-item-selected {
    +  background-color: #0052A3;
    +  color: #fff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/datagrid.css b/src/main/webapp/plug-in/easyui/themes/black/datagrid.css
    new file mode 100644
    index 00000000..9df72aa6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/datagrid.css
    @@ -0,0 +1,253 @@
    +.datagrid .panel-body {
    +  overflow: hidden;
    +  position: relative;
    +}
    +.datagrid-view {
    +  position: relative;
    +  overflow: hidden;
    +}
    +.datagrid-view1,
    +.datagrid-view2 {
    +  position: absolute;
    +  overflow: hidden;
    +  top: 0;
    +}
    +.datagrid-view1 {
    +  left: 0;
    +}
    +.datagrid-view2 {
    +  right: 0;
    +}
    +.datagrid-mask {
    +  position: absolute;
    +  left: 0;
    +  top: 0;
    +  width: 100%;
    +  height: 100%;
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +  display: none;
    +}
    +.datagrid-mask-msg {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -20px;
    +  padding: 12px 5px 10px 30px;
    +  width: auto;
    +  height: 16px;
    +  border-width: 2px;
    +  border-style: solid;
    +  display: none;
    +}
    +.datagrid-sort-icon {
    +  padding: 0;
    +}
    +.datagrid-toolbar {
    +  height: auto;
    +  padding: 1px 2px;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.datagrid-btn-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #444;
    +  border-right: 1px solid #777;
    +  margin: 2px 1px;
    +}
    +.datagrid .datagrid-pager {
    +  margin: 0;
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +}
    +.datagrid .datagrid-pager-top {
    +  border-width: 0 0 1px 0;
    +}
    +.datagrid-header {
    +  overflow: hidden;
    +  cursor: default;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.datagrid-header-inner {
    +  float: left;
    +  width: 10000px;
    +}
    +.datagrid-header-row,
    +.datagrid-row {
    +  height: 25px;
    +}
    +.datagrid-header td,
    +.datagrid-body td,
    +.datagrid-footer td {
    +  border-width: 0 1px 1px 0;
    +  border-style: dotted;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-cell,
    +.datagrid-cell-group,
    +.datagrid-header-rownumber,
    +.datagrid-cell-rownumber {
    +  margin: 0;
    +  padding: 0 4px;
    +  white-space: nowrap;
    +  word-wrap: normal;
    +  overflow: hidden;
    +  height: 18px;
    +  line-height: 18px;
    +  font-weight: normal;
    +  font-size: 12px;
    +}
    +.datagrid-cell-group {
    +  text-align: center;
    +}
    +.datagrid-header-rownumber,
    +.datagrid-cell-rownumber {
    +  width: 25px;
    +  text-align: center;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body {
    +  margin: 0;
    +  padding: 0;
    +  overflow: auto;
    +  zoom: 1;
    +}
    +.datagrid-view1 .datagrid-body-inner {
    +  padding-bottom: 20px;
    +}
    +.datagrid-view1 .datagrid-body {
    +  overflow: hidden;
    +}
    +.datagrid-footer {
    +  overflow: hidden;
    +}
    +.datagrid-footer-inner {
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +  width: 10000px;
    +  float: left;
    +}
    +.datagrid-row-editing .datagrid-cell {
    +  height: auto;
    +}
    +.datagrid-header-check,
    +.datagrid-cell-check {
    +  padding: 0;
    +  width: 27px;
    +  height: 18px;
    +  font-size: 1px;
    +  text-align: center;
    +  overflow: hidden;
    +}
    +.datagrid-header-check input,
    +.datagrid-cell-check input {
    +  margin: 0;
    +  padding: 0;
    +  width: 15px;
    +  height: 18px;
    +}
    +.datagrid-resize-proxy {
    +  position: absolute;
    +  width: 1px;
    +  height: 10000px;
    +  top: 0;
    +  cursor: e-resize;
    +  display: none;
    +}
    +.datagrid-body .datagrid-editable {
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body .datagrid-editable table {
    +  width: 100%;
    +  height: 100%;
    +}
    +.datagrid-body .datagrid-editable td {
    +  border: 0;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body .datagrid-editable .datagrid-editable-input {
    +  margin: 0;
    +  padding: 2px;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.datagrid-sort-desc .datagrid-sort-icon {
    +  padding: 0 13px 0 0;
    +  background: url('images/datagrid_icons.png') no-repeat -16px center;
    +}
    +.datagrid-sort-asc .datagrid-sort-icon {
    +  padding: 0 13px 0 0;
    +  background: url('images/datagrid_icons.png') no-repeat 0px center;
    +}
    +.datagrid-row-collapse {
    +  background: url('images/datagrid_icons.png') no-repeat -48px center;
    +}
    +.datagrid-row-expand {
    +  background: url('images/datagrid_icons.png') no-repeat -32px center;
    +}
    +.datagrid-mask-msg {
    +  background: #666 url('images/loading.gif') no-repeat scroll 5px center;
    +}
    +.datagrid-header,
    +.datagrid-td-rownumber {
    +  background-color: #444;
    +  background: -webkit-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%);
    +  background: -moz-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%);
    +  background: -o-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%);
    +  background: linear-gradient(to bottom,#4c4c4c 0,#3f3f3f 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4c4c4c,endColorstr=#3f3f3f,GradientType=0);
    +}
    +.datagrid-cell-rownumber {
    +  color: #fff;
    +}
    +.datagrid-resize-proxy {
    +  background: #cccccc;
    +}
    +.datagrid-mask {
    +  background: #000;
    +}
    +.datagrid-mask-msg {
    +  border-color: #000;
    +}
    +.datagrid-toolbar,
    +.datagrid-pager {
    +  background: #555;
    +}
    +.datagrid-header,
    +.datagrid-toolbar,
    +.datagrid-pager,
    +.datagrid-footer-inner {
    +  border-color: #222;
    +}
    +.datagrid-header td,
    +.datagrid-body td,
    +.datagrid-footer td {
    +  border-color: #222;
    +}
    +.datagrid-htable,
    +.datagrid-btable,
    +.datagrid-ftable {
    +  color: #fff;
    +}
    +.datagrid-row-alt {
    +  background: #555;
    +}
    +.datagrid-row-over,
    +.datagrid-header td.datagrid-header-over {
    +  background: #777;
    +  color: #fff;
    +  cursor: default;
    +}
    +.datagrid-row-selected {
    +  background: #0052A3;
    +  color: #fff;
    +}
    +.datagrid-body .datagrid-editable .datagrid-editable-input {
    +  border-color: #000;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/datebox.css b/src/main/webapp/plug-in/easyui/themes/black/datebox.css
    new file mode 100644
    index 00000000..ccdf5bf6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/datebox.css
    @@ -0,0 +1,40 @@
    +.datebox-calendar-inner {
    +  height: 180px;
    +}
    +.datebox-button {
    +  height: 18px;
    +  padding: 2px 5px;
    +  font-size: 12px;
    +  text-align: center;
    +}
    +.datebox-current,
    +.datebox-close,
    +.datebox-ok {
    +  text-decoration: none;
    +  font-weight: bold;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.datebox-current,
    +.datebox-close {
    +  float: left;
    +}
    +.datebox-close {
    +  float: right;
    +}
    +.datebox-button-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.datebox .combo-arrow {
    +  background-image: url('images/datebox_arrow.png');
    +  background-position: center center;
    +}
    +.datebox-button {
    +  background-color: #555;
    +}
    +.datebox-current,
    +.datebox-close,
    +.datebox-ok {
    +  color: #fff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/dialog.css b/src/main/webapp/plug-in/easyui/themes/black/dialog.css
    new file mode 100644
    index 00000000..4ee224a9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/dialog.css
    @@ -0,0 +1,30 @@
    +.dialog-content {
    +  overflow: auto;
    +}
    +.dialog-toolbar {
    +  padding: 2px 5px;
    +}
    +.dialog-tool-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #444;
    +  border-right: 1px solid #777;
    +  margin: 2px 1px;
    +}
    +.dialog-button {
    +  padding: 5px;
    +  text-align: right;
    +}
    +.dialog-button .l-btn {
    +  margin-left: 5px;
    +}
    +.dialog-toolbar,
    +.dialog-button {
    +  background: #555;
    +}
    +.dialog-toolbar {
    +  border-bottom: 1px solid #222;
    +}
    +.dialog-button {
    +  border-top: 1px solid #222;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/easyui.css b/src/main/webapp/plug-in/easyui/themes/black/easyui.css
    new file mode 100644
    index 00000000..2bc470dc
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/easyui.css
    @@ -0,0 +1,2205 @@
    +.panel {
    +  overflow: hidden;
    +  font-size: 12px;
    +  text-align: left;
    +}
    +.panel-header,
    +.panel-body {
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.panel-header {
    +  padding: 5px;
    +  position: relative;
    +}
    +.panel-title {
    +  background: url('images/blank.gif') no-repeat;
    +}
    +.panel-header-noborder {
    +  border-width: 0 0 1px 0;
    +}
    +.panel-body {
    +  overflow: auto;
    +  border-top-width: 0px;
    +}
    +.panel-body-noheader {
    +  border-top-width: 1px;
    +}
    +.panel-body-noborder {
    +  border-width: 0px;
    +}
    +.panel-with-icon {
    +  padding-left: 18px;
    +}
    +.panel-icon,
    +.panel-tool {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -8px;
    +  height: 16px;
    +  overflow: hidden;
    +}
    +.panel-icon {
    +  left: 5px;
    +  width: 16px;
    +}
    +.panel-tool {
    +  right: 5px;
    +  width: auto;
    +}
    +.panel-tool a {
    +  display: inline-block;
    +  width: 16px;
    +  height: 16px;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +  margin: 0 0 0 2px;
    +  vertical-align: top;
    +}
    +.panel-tool a:hover {
    +  opacity: 1;
    +  filter: alpha(opacity=100);
    +  background-color: #777;
    +  -moz-border-radius: 3px 3px 3px 3px;
    +  -webkit-border-radius: 3px 3px 3px 3px;
    +  border-radius: 3px 3px 3px 3px;
    +}
    +.panel-loading {
    +  padding: 11px 0px 10px 30px;
    +}
    +.panel-noscroll {
    +  overflow: hidden;
    +}
    +.panel-fit,
    +.panel-fit body {
    +  height: 100%;
    +  margin: 0;
    +  padding: 0;
    +  border: 0;
    +  overflow: hidden;
    +}
    +.panel-loading {
    +  background: url('images/loading.gif') no-repeat 10px 10px;
    +}
    +.panel-tool-close {
    +  background: url('images/panel_tools.png') no-repeat -16px 0px;
    +}
    +.panel-tool-min {
    +  background: url('images/panel_tools.png') no-repeat 0px 0px;
    +}
    +.panel-tool-max {
    +  background: url('images/panel_tools.png') no-repeat 0px -16px;
    +}
    +.panel-tool-restore {
    +  background: url('images/panel_tools.png') no-repeat -16px -16px;
    +}
    +.panel-tool-collapse {
    +  background: url('images/panel_tools.png') no-repeat -32px 0;
    +}
    +.panel-tool-expand {
    +  background: url('images/panel_tools.png') no-repeat -32px -16px;
    +}
    +.panel-header,
    +.panel-body {
    +  border-color: #000;
    +}
    +.panel-header {
    +  background-color: #3d3d3d;
    +  background: -webkit-linear-gradient(top,#454545 0,#383838 100%);
    +  background: -moz-linear-gradient(top,#454545 0,#383838 100%);
    +  background: -o-linear-gradient(top,#454545 0,#383838 100%);
    +  background: linear-gradient(to bottom,#454545 0,#383838 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0);
    +}
    +.panel-body {
    +  background-color: #666;
    +  color: #fff;
    +}
    +.panel-title {
    +  font-weight: bold;
    +  color: #fff;
    +  height: 16px;
    +  line-height: 16px;
    +}
    +.accordion {
    +  overflow: hidden;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.accordion .accordion-header {
    +  border-width: 0 0 1px;
    +  cursor: pointer;
    +}
    +.accordion .accordion-body {
    +  border-width: 0 0 1px;
    +}
    +.accordion-noborder {
    +  border-width: 0;
    +}
    +.accordion-noborder .accordion-header {
    +  border-width: 0 0 1px;
    +}
    +.accordion-noborder .accordion-body {
    +  border-width: 0 0 1px;
    +}
    +.accordion-collapse {
    +  background: url('images/accordion_arrows.png') no-repeat 0 0;
    +}
    +.accordion-expand {
    +  background: url('images/accordion_arrows.png') no-repeat -16px 0;
    +}
    +.accordion {
    +  background: #666;
    +  border-color: #000;
    +}
    +.accordion .accordion-header {
    +  background: #3d3d3d;
    +  filter: none;
    +}
    +.accordion .accordion-header-selected {
    +  background: #0052A3;
    +}
    +.accordion .accordion-header-selected .panel-title {
    +  color: #fff;
    +}
    +.window {
    +  overflow: hidden;
    +  padding: 5px;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.window .window-header {
    +  background: transparent;
    +  padding: 0px 0px 6px 0px;
    +}
    +.window .window-body {
    +  border-width: 1px;
    +  border-style: solid;
    +  border-top-width: 0px;
    +}
    +.window .window-body-noheader {
    +  border-top-width: 1px;
    +}
    +.window .window-header .panel-icon,
    +.window .window-header .panel-tool {
    +  top: 50%;
    +  margin-top: -11px;
    +}
    +.window .window-header .panel-icon {
    +  left: 1px;
    +}
    +.window .window-header .panel-tool {
    +  right: 1px;
    +}
    +.window .window-header .panel-with-icon {
    +  padding-left: 18px;
    +}
    +.window-proxy {
    +  position: absolute;
    +  overflow: hidden;
    +}
    +.window-proxy-mask {
    +  position: absolute;
    +  filter: alpha(opacity=5);
    +  opacity: 0.05;
    +}
    +.window-mask {
    +  position: absolute;
    +  left: 0;
    +  top: 0;
    +  width: 100%;
    +  height: 100%;
    +  filter: alpha(opacity=40);
    +  opacity: 0.40;
    +  font-size: 1px;
    +  *zoom: 1;
    +  overflow: hidden;
    +}
    +.window,
    +.window-shadow {
    +  position: absolute;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.window-shadow {
    +  background: #777;
    +  -moz-box-shadow: 2px 2px 3px #787878;
    +  -webkit-box-shadow: 2px 2px 3px #787878;
    +  box-shadow: 2px 2px 3px #787878;
    +  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
    +}
    +.window,
    +.window .window-body {
    +  border-color: #000;
    +}
    +.window {
    +  background-color: #3d3d3d;
    +  background: -webkit-linear-gradient(top,#454545 0,#383838 20%);
    +  background: -moz-linear-gradient(top,#454545 0,#383838 20%);
    +  background: -o-linear-gradient(top,#454545 0,#383838 20%);
    +  background: linear-gradient(to bottom,#454545 0,#383838 20%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0);
    +}
    +.window-proxy {
    +  border: 1px dashed #000;
    +}
    +.window-proxy-mask,
    +.window-mask {
    +  background: #000;
    +}
    +.dialog-content {
    +  overflow: auto;
    +}
    +.dialog-toolbar {
    +  padding: 2px 5px;
    +}
    +.dialog-tool-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #444;
    +  border-right: 1px solid #777;
    +  margin: 2px 1px;
    +}
    +.dialog-button {
    +  padding: 5px;
    +  text-align: right;
    +}
    +.dialog-button .l-btn {
    +  margin-left: 5px;
    +}
    +.dialog-toolbar,
    +.dialog-button {
    +  background: #555;
    +}
    +.dialog-toolbar {
    +  border-bottom: 1px solid #222;
    +}
    +.dialog-button {
    +  border-top: 1px solid #222;
    +}
    +.combo {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +  vertical-align: middle;
    +}
    +.combo .combo-text {
    +  font-size: 12px;
    +  border: 0px;
    +  line-height: 20px;
    +  height: 20px;
    +  margin: 0;
    +  padding: 0px 2px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.combo-arrow {
    +  width: 18px;
    +  height: 20px;
    +  overflow: hidden;
    +  display: inline-block;
    +  vertical-align: top;
    +  cursor: pointer;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.combo-arrow-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.combo-panel {
    +  overflow: auto;
    +}
    +.combo-arrow {
    +  background: url('images/combo_arrow.png') no-repeat center center;
    +}
    +.combo,
    +.combo-panel {
    +  background-color: #666;
    +}
    +.combo {
    +  border-color: #000;
    +  background-color: #666;
    +}
    +.combo-arrow {
    +  background-color: #3d3d3d;
    +}
    +.combo-arrow-hover {
    +  background-color: #777;
    +}
    +.combobox-item {
    +  padding: 2px;
    +  font-size: 12px;
    +  padding: 3px;
    +  padding-right: 0px;
    +}
    +.combobox-item-hover {
    +  background-color: #777;
    +  color: #fff;
    +}
    +.combobox-item-selected {
    +  background-color: #0052A3;
    +  color: #fff;
    +}
    +.layout {
    +  position: relative;
    +  overflow: hidden;
    +  margin: 0;
    +  padding: 0;
    +  z-index: 0;
    +}
    +.layout-panel {
    +  position: absolute;
    +  overflow: hidden;
    +}
    +.layout-panel-east,
    +.layout-panel-west {
    +  z-index: 2;
    +}
    +.layout-panel-north,
    +.layout-panel-south {
    +  z-index: 3;
    +}
    +.layout-expand {
    +  position: absolute;
    +  padding: 0px;
    +  font-size: 1px;
    +  cursor: pointer;
    +  z-index: 1;
    +}
    +.layout-expand .panel-header,
    +.layout-expand .panel-body {
    +  background: transparent;
    +  filter: none;
    +  overflow: hidden;
    +}
    +.layout-expand .panel-header {
    +  border-bottom-width: 0px;
    +}
    +.layout-split-proxy-h,
    +.layout-split-proxy-v {
    +  position: absolute;
    +  font-size: 1px;
    +  display: none;
    +  z-index: 5;
    +}
    +.layout-split-proxy-h {
    +  width: 5px;
    +  cursor: e-resize;
    +}
    +.layout-split-proxy-v {
    +  height: 5px;
    +  cursor: n-resize;
    +}
    +.layout-mask {
    +  position: absolute;
    +  background: #fafafa;
    +  filter: alpha(opacity=10);
    +  opacity: 0.10;
    +  z-index: 4;
    +}
    +.layout-button-up {
    +  background: url('images/layout_arrows.png') no-repeat -16px -16px;
    +}
    +.layout-button-down {
    +  background: url('images/layout_arrows.png') no-repeat -16px 0;
    +}
    +.layout-button-left {
    +  background: url('images/layout_arrows.png') no-repeat 0 0;
    +}
    +.layout-button-right {
    +  background: url('images/layout_arrows.png') no-repeat 0 -16px;
    +}
    +.layout-split-proxy-h,
    +.layout-split-proxy-v {
    +  background-color: #cccccc;
    +}
    +.layout-split-north {
    +  border-bottom: 5px solid #444;
    +}
    +.layout-split-south {
    +  border-top: 5px solid #444;
    +}
    +.layout-split-east {
    +  border-left: 5px solid #444;
    +}
    +.layout-split-west {
    +  border-right: 5px solid #444;
    +}
    +.layout-expand {
    +  background-color: #3d3d3d;
    +}
    +.layout-expand-over {
    +  background-color: #3d3d3d;
    +}
    +.tabs-container {
    +  overflow: hidden;
    +}
    +.tabs-header {
    +  border-width: 1px;
    +  border-style: solid;
    +  border-bottom-width: 0;
    +  position: relative;
    +  padding: 0;
    +  padding-top: 2px;
    +  overflow: hidden;
    +}
    +.tabs-header-plain {
    +  border: 0;
    +  background: transparent;
    +}
    +.tabs-scroller-left,
    +.tabs-scroller-right {
    +  position: absolute;
    +  top: auto;
    +  bottom: 0;
    +  width: 18px;
    +  height: 28px !important;
    +  height: 30px;
    +  font-size: 1px;
    +  display: none;
    +  cursor: pointer;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.tabs-scroller-left {
    +  left: 0;
    +}
    +.tabs-scroller-right {
    +  right: 0;
    +}
    +.tabs-header-plain .tabs-scroller-left,
    +.tabs-header-plain .tabs-scroller-right {
    +  height: 25px !important;
    +  height: 27px;
    +}
    +.tabs-tool {
    +  position: absolute;
    +  bottom: 0;
    +  padding: 1px;
    +  overflow: hidden;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.tabs-header-plain .tabs-tool {
    +  padding: 0 1px;
    +}
    +.tabs-wrap {
    +  position: relative;
    +  left: 0;
    +  overflow: hidden;
    +  width: 100%;
    +  margin: 0;
    +  padding: 0;
    +}
    +.tabs-scrolling {
    +  margin-left: 18px;
    +  margin-right: 18px;
    +}
    +.tabs-disabled {
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +}
    +.tabs {
    +  list-style-type: none;
    +  height: 26px;
    +  margin: 0px;
    +  padding: 0px;
    +  padding-left: 4px;
    +  font-size: 12px;
    +  width: 5000px;
    +  border-style: solid;
    +  border-width: 0 0 1px 0;
    +}
    +.tabs li {
    +  float: left;
    +  display: inline-block;
    +  margin: 0 4px -1px 0;
    +  padding: 0;
    +  position: relative;
    +  border: 0;
    +}
    +.tabs li a.tabs-inner {
    +  display: inline-block;
    +  text-decoration: none;
    +  margin: 0;
    +  padding: 0 10px;
    +  height: 25px;
    +  line-height: 25px;
    +  text-align: center;
    +  white-space: nowrap;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 5px 5px 0 0;
    +  -webkit-border-radius: 5px 5px 0 0;
    +  border-radius: 5px 5px 0 0;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  font-weight: bold;
    +  outline: none;
    +}
    +.tabs li.tabs-selected a:hover.tabs-inner {
    +  cursor: default;
    +  pointer: default;
    +}
    +.tabs li a.tabs-close,
    +.tabs-p-tool {
    +  position: absolute;
    +  font-size: 1px;
    +  display: block;
    +  height: 12px;
    +  padding: 0;
    +  top: 50%;
    +  margin-top: -6px;
    +  overflow: hidden;
    +}
    +.tabs li a.tabs-close {
    +  width: 12px;
    +  right: 5px;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.tabs-p-tool {
    +  right: 16px;
    +}
    +.tabs-p-tool a {
    +  display: inline-block;
    +  font-size: 1px;
    +  width: 12px;
    +  height: 12px;
    +  margin: 0;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.tabs li a:hover.tabs-close,
    +.tabs-p-tool a:hover {
    +  opacity: 1;
    +  filter: alpha(opacity=100);
    +  cursor: hand;
    +  cursor: pointer;
    +}
    +.tabs-with-icon {
    +  padding-left: 18px;
    +}
    +.tabs-icon {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  left: 10px;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.tabs-closable {
    +  padding-right: 8px;
    +}
    +.tabs-panels {
    +  margin: 0px;
    +  padding: 0px;
    +  border-width: 1px;
    +  border-style: solid;
    +  border-top-width: 0;
    +  overflow: hidden;
    +}
    +.tabs-header-bottom {
    +  border-width: 0 1px 1px 1px;
    +  padding: 0 0 2px 0;
    +}
    +.tabs-header-bottom .tabs {
    +  border-width: 1px 0 0 0;
    +}
    +.tabs-header-bottom .tabs li {
    +  margin: -1px 4px 0 0;
    +}
    +.tabs-header-bottom .tabs li a.tabs-inner {
    +  -moz-border-radius: 0 0 5px 5px;
    +  -webkit-border-radius: 0 0 5px 5px;
    +  border-radius: 0 0 5px 5px;
    +}
    +.tabs-header-bottom .tabs-tool {
    +  top: 0;
    +}
    +.tabs-header-bottom .tabs-scroller-left,
    +.tabs-header-bottom .tabs-scroller-right {
    +  top: 0;
    +  bottom: auto;
    +}
    +.tabs-panels-top {
    +  border-width: 1px 1px 0 1px;
    +}
    +.tabs-header-left {
    +  float: left;
    +  border-width: 1px 0 1px 1px;
    +  padding: 0;
    +}
    +.tabs-header-right {
    +  float: right;
    +  border-width: 1px 1px 1px 0;
    +  padding: 0;
    +}
    +.tabs-header-left .tabs-wrap,
    +.tabs-header-right .tabs-wrap {
    +  height: 100%;
    +}
    +.tabs-header-left .tabs {
    +  height: 100%;
    +  padding: 4px 0 0 4px;
    +  border-width: 0 1px 0 0;
    +}
    +.tabs-header-right .tabs {
    +  height: 100%;
    +  padding: 4px 4px 0 0;
    +  border-width: 0 0 0 1px;
    +}
    +.tabs-header-left .tabs li,
    +.tabs-header-right .tabs li {
    +  display: block;
    +  width: 100%;
    +  position: relative;
    +}
    +.tabs-header-left .tabs li {
    +  left: auto;
    +  right: 0;
    +  margin: 0 -1px 4px 0;
    +  float: right;
    +}
    +.tabs-header-right .tabs li {
    +  left: 0;
    +  right: auto;
    +  margin: 0 0 4px -1px;
    +  float: left;
    +}
    +.tabs-header-left .tabs li a.tabs-inner {
    +  display: block;
    +  text-align: left;
    +  -moz-border-radius: 5px 0 0 5px;
    +  -webkit-border-radius: 5px 0 0 5px;
    +  border-radius: 5px 0 0 5px;
    +}
    +.tabs-header-right .tabs li a.tabs-inner {
    +  display: block;
    +  text-align: left;
    +  -moz-border-radius: 0 5px 5px 0;
    +  -webkit-border-radius: 0 5px 5px 0;
    +  border-radius: 0 5px 5px 0;
    +}
    +.tabs-panels-right {
    +  float: right;
    +  border-width: 1px 1px 1px 0;
    +}
    +.tabs-panels-left {
    +  float: left;
    +  border-width: 1px 0 1px 1px;
    +}
    +.tabs-header-noborder,
    +.tabs-panels-noborder {
    +  border: 0px;
    +}
    +.tabs-header-plain {
    +  border: 0px;
    +  background: transparent;
    +}
    +.tabs-scroller-left {
    +  background: #3d3d3d url('images/tabs_icons.png') no-repeat 1px center;
    +}
    +.tabs-scroller-right {
    +  background: #3d3d3d url('images/tabs_icons.png') no-repeat -15px center;
    +}
    +.tabs li a.tabs-close {
    +  background: url('images/tabs_icons.png') no-repeat -34px center;
    +}
    +.tabs li a.tabs-inner:hover {
    +  background: #777;
    +  color: #fff;
    +  filter: none;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  background-color: #666;
    +  color: #fff;
    +  background: -webkit-linear-gradient(top,#454545 0,#666 100%);
    +  background: -moz-linear-gradient(top,#454545 0,#666 100%);
    +  background: -o-linear-gradient(top,#454545 0,#666 100%);
    +  background: linear-gradient(to bottom,#454545 0,#666 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=0);
    +}
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {
    +  background: -webkit-linear-gradient(top,#666 0,#454545 100%);
    +  background: -moz-linear-gradient(top,#666 0,#454545 100%);
    +  background: -o-linear-gradient(top,#666 0,#454545 100%);
    +  background: linear-gradient(to bottom,#666 0,#454545 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=0);
    +}
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner {
    +  background: -webkit-linear-gradient(left,#454545 0,#666 100%);
    +  background: -moz-linear-gradient(left,#454545 0,#666 100%);
    +  background: -o-linear-gradient(left,#454545 0,#666 100%);
    +  background: linear-gradient(to right,#454545 0,#666 100%);
    +  background-repeat: repeat-y;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=1);
    +}
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  background: -webkit-linear-gradient(left,#666 0,#454545 100%);
    +  background: -moz-linear-gradient(left,#666 0,#454545 100%);
    +  background: -o-linear-gradient(left,#666 0,#454545 100%);
    +  background: linear-gradient(to right,#666 0,#454545 100%);
    +  background-repeat: repeat-y;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=1);
    +}
    +.tabs li a.tabs-inner {
    +  color: #fff;
    +  background-color: #3d3d3d;
    +  background: -webkit-linear-gradient(top,#454545 0,#383838 100%);
    +  background: -moz-linear-gradient(top,#454545 0,#383838 100%);
    +  background: -o-linear-gradient(top,#454545 0,#383838 100%);
    +  background: linear-gradient(to bottom,#454545 0,#383838 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0);
    +}
    +.tabs-header,
    +.tabs-tool {
    +  background-color: #3d3d3d;
    +}
    +.tabs-header-plain {
    +  background: transparent;
    +}
    +.tabs-header,
    +.tabs-scroller-left,
    +.tabs-scroller-right,
    +.tabs-tool,
    +.tabs,
    +.tabs-panels,
    +.tabs li a.tabs-inner,
    +.tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  border-color: #000;
    +}
    +.tabs-p-tool a:hover,
    +.tabs li a:hover.tabs-close,
    +.tabs-scroller-over {
    +  background-color: #777;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  border-bottom: 1px solid #666;
    +}
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {
    +  border-top: 1px solid #666;
    +}
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner {
    +  border-right: 1px solid #666;
    +}
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  border-left: 1px solid #666;
    +}
    +a.l-btn {
    +  background-position: right 0;
    +  font-size: 12px;
    +  text-decoration: none;
    +  display: inline-block;
    +  zoom: 1;
    +  height: 24px;
    +  padding-right: 18px;
    +  cursor: pointer;
    +  outline: none;
    +}
    +a.l-btn-plain {
    +  padding-right: 5px;
    +  border: 0;
    +  padding: 1px 6px 1px 1px;
    +}
    +a.l-btn-disabled {
    +  color: #ccc;
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +  cursor: default;
    +}
    +a.l-btn span.l-btn-left {
    +  display: inline-block;
    +  background-position: 0 -48px;
    +  padding: 4px 0px 4px 18px;
    +  line-height: 16px;
    +  height: 16px;
    +}
    +a.l-btn-plain span.l-btn-left {
    +  padding-left: 5px;
    +}
    +a.l-btn span span.l-btn-text {
    +  display: inline-block;
    +  vertical-align: baseline;
    +  width: auto;
    +  height: 16px;
    +  line-height: 16px;
    +  padding: 0;
    +  margin: 0;
    +}
    +a.l-btn span span.l-btn-icon-left {
    +  padding: 0 0 0 20px;
    +  background-position: left center;
    +}
    +a.l-btn span span.l-btn-icon-right {
    +  padding: 0 20px 0 0;
    +  background-position: right center;
    +}
    +a.l-btn span span span.l-btn-empty {
    +  display: inline-block;
    +  margin: 0;
    +  padding: 0;
    +  width: 16px;
    +}
    +a:hover.l-btn {
    +  background-position: right -24px;
    +  outline: none;
    +  text-decoration: none;
    +}
    +a:hover.l-btn span.l-btn-left {
    +  background-position: 0 bottom;
    +}
    +a:hover.l-btn-plain {
    +  padding: 0 5px 0 0;
    +}
    +a:hover.l-btn-disabled {
    +  background-position: right 0;
    +}
    +a:hover.l-btn-disabled span.l-btn-left {
    +  background-position: 0 -48px;
    +}
    +a.l-btn .l-btn-focus {
    +  outline: #0000FF dotted thin;
    +}
    +a.l-btn {
    +  color: #fff;
    +  background-image: url('images/linkbutton_bg.png');
    +  background-repeat: no-repeat;
    +  background: #777;
    +  background-repeat: repeat-x;
    +  border: 1px solid #555;
    +  background: -webkit-linear-gradient(top,#919191 0,#6a6a6a 100%);
    +  background: -moz-linear-gradient(top,#919191 0,#6a6a6a 100%);
    +  background: -o-linear-gradient(top,#919191 0,#6a6a6a 100%);
    +  background: linear-gradient(to bottom,#919191 0,#6a6a6a 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#919191,endColorstr=#6a6a6a,GradientType=0);
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +a.l-btn span.l-btn-left {
    +  background-image: url('images/linkbutton_bg.png');
    +  background-repeat: no-repeat;
    +  background-image: none;
    +}
    +a:hover.l-btn {
    +  background: #777;
    +  color: #fff;
    +  border: 1px solid #555;
    +  filter: none;
    +}
    +a.l-btn-plain,
    +a.l-btn-plain span.l-btn-left {
    +  background: transparent;
    +  border: 0;
    +  filter: none;
    +}
    +a:hover.l-btn-plain {
    +  background: #777;
    +  color: #fff;
    +  border: 1px solid #555;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +a.l-btn-disabled,
    +a:hover.l-btn-disabled {
    +  filter: alpha(opacity=50);
    +}
    +.datagrid .panel-body {
    +  overflow: hidden;
    +  position: relative;
    +}
    +.datagrid-view {
    +  position: relative;
    +  overflow: hidden;
    +}
    +.datagrid-view1,
    +.datagrid-view2 {
    +  position: absolute;
    +  overflow: hidden;
    +  top: 0;
    +}
    +.datagrid-view1 {
    +  left: 0;
    +}
    +.datagrid-view2 {
    +  right: 0;
    +}
    +.datagrid-mask {
    +  position: absolute;
    +  left: 0;
    +  top: 0;
    +  width: 100%;
    +  height: 100%;
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +  display: none;
    +}
    +.datagrid-mask-msg {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -20px;
    +  padding: 12px 5px 10px 30px;
    +  width: auto;
    +  height: 16px;
    +  border-width: 2px;
    +  border-style: solid;
    +  display: none;
    +}
    +.datagrid-sort-icon {
    +  padding: 0;
    +}
    +.datagrid-toolbar {
    +  height: auto;
    +  padding: 1px 2px;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.datagrid-btn-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #444;
    +  border-right: 1px solid #777;
    +  margin: 2px 1px;
    +}
    +.datagrid .datagrid-pager {
    +  margin: 0;
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +}
    +.datagrid .datagrid-pager-top {
    +  border-width: 0 0 1px 0;
    +}
    +.datagrid-header {
    +  overflow: hidden;
    +  cursor: default;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.datagrid-header-inner {
    +  float: left;
    +  width: 10000px;
    +}
    +.datagrid-header-row,
    +.datagrid-row {
    +  height: 25px;
    +}
    +.datagrid-header td,
    +.datagrid-body td,
    +.datagrid-footer td {
    +  border-width: 0 1px 1px 0;
    +  border-style: dotted;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-cell,
    +.datagrid-cell-group,
    +.datagrid-header-rownumber,
    +.datagrid-cell-rownumber {
    +  margin: 0;
    +  padding: 0 4px;
    +  white-space: nowrap;
    +  word-wrap: normal;
    +  overflow: hidden;
    +  height: 18px;
    +  line-height: 18px;
    +  font-weight: normal;
    +  font-size: 12px;
    +}
    +.datagrid-cell-group {
    +  text-align: center;
    +}
    +.datagrid-header-rownumber,
    +.datagrid-cell-rownumber {
    +  width: 25px;
    +  text-align: center;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body {
    +  margin: 0;
    +  padding: 0;
    +  overflow: auto;
    +  zoom: 1;
    +}
    +.datagrid-view1 .datagrid-body-inner {
    +  padding-bottom: 20px;
    +}
    +.datagrid-view1 .datagrid-body {
    +  overflow: hidden;
    +}
    +.datagrid-footer {
    +  overflow: hidden;
    +}
    +.datagrid-footer-inner {
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +  width: 10000px;
    +  float: left;
    +}
    +.datagrid-row-editing .datagrid-cell {
    +  height: auto;
    +}
    +.datagrid-header-check,
    +.datagrid-cell-check {
    +  padding: 0;
    +  width: 27px;
    +  height: 18px;
    +  font-size: 1px;
    +  text-align: center;
    +  overflow: hidden;
    +}
    +.datagrid-header-check input,
    +.datagrid-cell-check input {
    +  margin: 0;
    +  padding: 0;
    +  width: 15px;
    +  height: 18px;
    +}
    +.datagrid-resize-proxy {
    +  position: absolute;
    +  width: 1px;
    +  height: 10000px;
    +  top: 0;
    +  cursor: e-resize;
    +  display: none;
    +}
    +.datagrid-body .datagrid-editable {
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body .datagrid-editable table {
    +  width: 100%;
    +  height: 100%;
    +}
    +.datagrid-body .datagrid-editable td {
    +  border: 0;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body .datagrid-editable .datagrid-editable-input {
    +  margin: 0;
    +  padding: 2px;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.datagrid-sort-desc .datagrid-sort-icon {
    +  padding: 0 13px 0 0;
    +  background: url('images/datagrid_icons.png') no-repeat -16px center;
    +}
    +.datagrid-sort-asc .datagrid-sort-icon {
    +  padding: 0 13px 0 0;
    +  background: url('images/datagrid_icons.png') no-repeat 0px center;
    +}
    +.datagrid-row-collapse {
    +  background: url('images/datagrid_icons.png') no-repeat -48px center;
    +}
    +.datagrid-row-expand {
    +  background: url('images/datagrid_icons.png') no-repeat -32px center;
    +}
    +.datagrid-mask-msg {
    +  background: #666 url('images/loading.gif') no-repeat scroll 5px center;
    +}
    +.datagrid-header,
    +.datagrid-td-rownumber {
    +  background-color: #444;
    +  background: -webkit-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%);
    +  background: -moz-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%);
    +  background: -o-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%);
    +  background: linear-gradient(to bottom,#4c4c4c 0,#3f3f3f 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4c4c4c,endColorstr=#3f3f3f,GradientType=0);
    +}
    +.datagrid-cell-rownumber {
    +  color: #fff;
    +}
    +.datagrid-resize-proxy {
    +  background: #cccccc;
    +}
    +.datagrid-mask {
    +  background: #000;
    +}
    +.datagrid-mask-msg {
    +  border-color: #000;
    +}
    +.datagrid-toolbar,
    +.datagrid-pager {
    +  background: #555;
    +}
    +.datagrid-header,
    +.datagrid-toolbar,
    +.datagrid-pager,
    +.datagrid-footer-inner {
    +  border-color: #222;
    +}
    +.datagrid-header td,
    +.datagrid-body td,
    +.datagrid-footer td {
    +  border-color: #222;
    +}
    +.datagrid-htable,
    +.datagrid-btable,
    +.datagrid-ftable {
    +  color: #fff;
    +}
    +.datagrid-row-alt {
    +  background: #555;
    +}
    +.datagrid-row-over,
    +.datagrid-header td.datagrid-header-over {
    +  background: #777;
    +  color: #fff;
    +  cursor: default;
    +}
    +.datagrid-row-selected {
    +  background: #0052A3;
    +  color: #fff;
    +}
    +.datagrid-body .datagrid-editable .datagrid-editable-input {
    +  border-color: #000;
    +}
    +.propertygrid .datagrid-view1 .datagrid-body td {
    +  padding-bottom: 1px;
    +  border-width: 0 1px 0 0;
    +}
    +.propertygrid .datagrid-group {
    +  height: 21px;
    +  overflow: hidden;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.propertygrid .datagrid-group span {
    +  font-weight: bold;
    +}
    +.propertygrid .datagrid-view1 .datagrid-body td {
    +  border-color: #222;
    +}
    +.propertygrid .datagrid-view1 .datagrid-group {
    +  border-color: #3d3d3d;
    +}
    +.propertygrid .datagrid-view2 .datagrid-group {
    +  border-color: #222;
    +}
    +.propertygrid .datagrid-group,
    +.propertygrid .datagrid-view1 .datagrid-body,
    +.propertygrid .datagrid-view1 .datagrid-row-over,
    +.propertygrid .datagrid-view1 .datagrid-row-selected {
    +  background: #3d3d3d;
    +}
    +.pagination {
    +  zoom: 1;
    +}
    +.pagination table {
    +  float: left;
    +  height: 30px;
    +}
    +.pagination td {
    +  border: 0;
    +}
    +.pagination-btn-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #444;
    +  border-right: 1px solid #777;
    +  margin: 3px 1px;
    +}
    +.pagination .pagination-num {
    +  border-width: 1px;
    +  border-style: solid;
    +  margin: 0 2px;
    +  padding: 2px;
    +  width: 2em;
    +  height: auto;
    +}
    +.pagination-page-list {
    +  margin: 0px 6px;
    +  padding: 1px 2px;
    +  width: auto;
    +  height: auto;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.pagination-info {
    +  float: right;
    +  margin: 0 6px 0 0;
    +  padding: 0;
    +  height: 30px;
    +  line-height: 30px;
    +  font-size: 12px;
    +}
    +.pagination span {
    +  font-size: 12px;
    +}
    +.pagination-first {
    +  background: url('images/pagination_icons.png') no-repeat 0 0;
    +}
    +.pagination-prev {
    +  background: url('images/pagination_icons.png') no-repeat -16px 0;
    +}
    +.pagination-next {
    +  background: url('images/pagination_icons.png') no-repeat -32px 0;
    +}
    +.pagination-last {
    +  background: url('images/pagination_icons.png') no-repeat -48px 0;
    +}
    +.pagination-load {
    +  background: url('images/pagination_icons.png') no-repeat -64px 0;
    +}
    +.pagination-loading {
    +  background: url('images/loading.gif') no-repeat;
    +}
    +.pagination-page-list,
    +.pagination .pagination-num {
    +  border-color: #000;
    +}
    +.calendar {
    +  border-width: 1px;
    +  border-style: solid;
    +  padding: 1px;
    +  overflow: hidden;
    +  font-size: 12px;
    +}
    +.calendar table {
    +  border-collapse: separate;
    +  font-size: 12px;
    +  width: 100%;
    +  height: 100%;
    +}
    +.calendar-noborder {
    +  border: 0;
    +}
    +.calendar-header {
    +  position: relative;
    +  height: 22px;
    +}
    +.calendar-title {
    +  text-align: center;
    +  height: 22px;
    +}
    +.calendar-title span {
    +  position: relative;
    +  display: inline-block;
    +  top: 2px;
    +  padding: 0 3px;
    +  height: 18px;
    +  line-height: 18px;
    +  cursor: pointer;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-prevmonth,
    +.calendar-nextmonth,
    +.calendar-prevyear,
    +.calendar-nextyear {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -7px;
    +  width: 14px;
    +  height: 14px;
    +  cursor: pointer;
    +  font-size: 1px;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-prevmonth {
    +  left: 20px;
    +  background: url('images/calendar_arrows.png') no-repeat -18px -2px;
    +}
    +.calendar-nextmonth {
    +  right: 20px;
    +  background: url('images/calendar_arrows.png') no-repeat -34px -2px;
    +}
    +.calendar-prevyear {
    +  left: 3px;
    +  background: url('images/calendar_arrows.png') no-repeat -1px -2px;
    +}
    +.calendar-nextyear {
    +  right: 3px;
    +  background: url('images/calendar_arrows.png') no-repeat -49px -2px;
    +}
    +.calendar-body {
    +  position: relative;
    +}
    +.calendar-body th,
    +.calendar-body td {
    +  text-align: center;
    +}
    +.calendar-day {
    +  border: 0;
    +  padding: 1px;
    +  cursor: pointer;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-other-month {
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +}
    +.calendar-menu {
    +  position: absolute;
    +  top: 0;
    +  left: 0;
    +  width: 180px;
    +  height: 150px;
    +  padding: 5px;
    +  font-size: 12px;
    +  display: none;
    +  overflow: hidden;
    +}
    +.calendar-menu-year-inner {
    +  text-align: center;
    +  padding-bottom: 5px;
    +}
    +.calendar-menu-year {
    +  width: 40px;
    +  text-align: center;
    +  border-width: 1px;
    +  border-style: solid;
    +  margin: 0;
    +  padding: 2px;
    +  font-weight: bold;
    +}
    +.calendar-menu-prev,
    +.calendar-menu-next {
    +  display: inline-block;
    +  width: 21px;
    +  height: 21px;
    +  vertical-align: top;
    +  cursor: pointer;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-menu-prev {
    +  margin-right: 10px;
    +  background: url('images/calendar_arrows.png') no-repeat 2px 2px;
    +}
    +.calendar-menu-next {
    +  margin-left: 10px;
    +  background: url('images/calendar_arrows.png') no-repeat -45px 2px;
    +}
    +.calendar-menu-month {
    +  text-align: center;
    +  cursor: pointer;
    +  font-weight: bold;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-body th,
    +.calendar-menu-month {
    +  color: #ffffff;
    +}
    +.calendar-day {
    +  color: #fff;
    +}
    +.calendar-sunday {
    +  color: #CC2222;
    +}
    +.calendar-saturday {
    +  color: #00ee00;
    +}
    +.calendar-today {
    +  color: #0000ff;
    +}
    +.calendar-menu-year {
    +  border-color: #000;
    +}
    +.calendar {
    +  border-color: #000;
    +}
    +.calendar-header {
    +  background: #3d3d3d;
    +}
    +.calendar-body,
    +.calendar-menu {
    +  background: #666;
    +}
    +.calendar-body th {
    +  background: #555;
    +}
    +.calendar-hover,
    +.calendar-nav-hover,
    +.calendar-menu-hover {
    +  background-color: #777;
    +  color: #fff;
    +}
    +.calendar-hover {
    +  border: 1px solid #555;
    +  padding: 0;
    +}
    +.calendar-selected {
    +  background-color: #0052A3;
    +  color: #fff;
    +  border: 1px solid #00458a;
    +  padding: 0;
    +}
    +.datebox-calendar-inner {
    +  height: 180px;
    +}
    +.datebox-button {
    +  height: 18px;
    +  padding: 2px 5px;
    +  font-size: 12px;
    +  text-align: center;
    +}
    +.datebox-current,
    +.datebox-close,
    +.datebox-ok {
    +  text-decoration: none;
    +  font-weight: bold;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.datebox-current,
    +.datebox-close {
    +  float: left;
    +}
    +.datebox-close {
    +  float: right;
    +}
    +.datebox-button-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.datebox .combo-arrow {
    +  background-image: url('images/datebox_arrow.png');
    +  background-position: center center;
    +}
    +.datebox-button {
    +  background-color: #555;
    +}
    +.datebox-current,
    +.datebox-close,
    +.datebox-ok {
    +  color: #fff;
    +}
    +.spinner {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +  vertical-align: middle;
    +}
    +.spinner .spinner-text {
    +  font-size: 12px;
    +  border: 0px;
    +  line-height: 20px;
    +  height: 20px;
    +  margin: 0;
    +  padding: 0 2px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.spinner-arrow {
    +  display: inline-block;
    +  overflow: hidden;
    +  vertical-align: top;
    +  margin: 0;
    +  padding: 0;
    +}
    +.spinner-arrow-up,
    +.spinner-arrow-down {
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +  display: block;
    +  font-size: 1px;
    +  width: 18px;
    +  height: 10px;
    +}
    +.spinner-arrow-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.spinner-arrow-up {
    +  background: url('images/spinner_arrows.png') no-repeat 1px center;
    +}
    +.spinner-arrow-down {
    +  background: url('images/spinner_arrows.png') no-repeat -15px center;
    +}
    +.spinner {
    +  border-color: #000;
    +}
    +.spinner-arrow {
    +  background-color: #3d3d3d;
    +}
    +.spinner-arrow-hover {
    +  background-color: #777;
    +}
    +.progressbar {
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +  overflow: hidden;
    +}
    +.progressbar-text {
    +  text-align: center;
    +  position: absolute;
    +}
    +.progressbar-value {
    +  position: relative;
    +  overflow: hidden;
    +  width: 0;
    +  -moz-border-radius: 5px 0 0 5px;
    +  -webkit-border-radius: 5px 0 0 5px;
    +  border-radius: 5px 0 0 5px;
    +}
    +.progressbar {
    +  border-color: #000;
    +}
    +.progressbar-text {
    +  color: #fff;
    +}
    +.progressbar-value .progressbar-text {
    +  background-color: #0052A3;
    +  color: #fff;
    +}
    +.searchbox {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +}
    +.searchbox .searchbox-text {
    +  font-size: 12px;
    +  border: 0;
    +  margin: 0;
    +  padding: 0;
    +  line-height: 20px;
    +  height: 20px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.searchbox .searchbox-prompt {
    +  font-size: 12px;
    +  color: #ccc;
    +}
    +.searchbox-button {
    +  width: 18px;
    +  height: 20px;
    +  overflow: hidden;
    +  display: inline-block;
    +  vertical-align: top;
    +  cursor: pointer;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.searchbox-button-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.searchbox a.l-btn-plain {
    +  height: 20px;
    +  border: 0;
    +  padding: 0 6px 0 0;
    +  vertical-align: top;
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.searchbox a.l-btn .l-btn-left {
    +  padding: 2px 0 2px 4px;
    +}
    +.searchbox a.l-btn-plain:hover {
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +  border: 0;
    +  padding: 0 6px 0 0;
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.searchbox a.m-btn-plain-active {
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +}
    +.searchbox-button {
    +  background: url('images/searchbox_button.png') no-repeat center center;
    +}
    +.searchbox {
    +  border-color: #000;
    +  background-color: #fff;
    +}
    +.searchbox a.l-btn-plain {
    +  background: #3d3d3d;
    +}
    +.slider-disabled {
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +}
    +.slider-h {
    +  height: 22px;
    +}
    +.slider-v {
    +  width: 22px;
    +}
    +.slider-inner {
    +  position: relative;
    +  height: 6px;
    +  top: 7px;
    +  border-width: 1px;
    +  border-style: solid;
    +  border-radius: 3px;
    +}
    +.slider-handle {
    +  position: absolute;
    +  display: block;
    +  outline: none;
    +  width: 20px;
    +  height: 20px;
    +  top: -7px;
    +  margin-left: -10px;
    +}
    +.slider-tip {
    +  position: absolute;
    +  display: inline-block;
    +  line-height: 12px;
    +  white-space: nowrap;
    +  top: -22px;
    +}
    +.slider-rule {
    +  position: relative;
    +  top: 15px;
    +}
    +.slider-rule span {
    +  position: absolute;
    +  display: inline-block;
    +  font-size: 0;
    +  height: 5px;
    +  border-width: 0 0 0 1px;
    +  border-style: solid;
    +}
    +.slider-rulelabel {
    +  position: relative;
    +  top: 20px;
    +}
    +.slider-rulelabel span {
    +  position: absolute;
    +  display: inline-block;
    +}
    +.slider-v .slider-inner {
    +  width: 6px;
    +  left: 7px;
    +  top: 0;
    +  float: left;
    +}
    +.slider-v .slider-handle {
    +  left: 3px;
    +  margin-top: -10px;
    +}
    +.slider-v .slider-tip {
    +  left: -10px;
    +  margin-top: -6px;
    +}
    +.slider-v .slider-rule {
    +  float: left;
    +  top: 0;
    +  left: 16px;
    +}
    +.slider-v .slider-rule span {
    +  width: 5px;
    +  height: 'auto';
    +  border-left: 0;
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +}
    +.slider-v .slider-rulelabel {
    +  float: left;
    +  top: 0;
    +  left: 23px;
    +}
    +.slider-handle {
    +  background: url('images/slider_handle.png') no-repeat;
    +}
    +.slider-inner {
    +  border-color: #000;
    +  background: #3d3d3d;
    +}
    +.slider-rule span {
    +  border-color: #000;
    +}
    +.slider-rulelabel span {
    +  color: #fff;
    +}
    +.menu {
    +  position: absolute;
    +  margin: 0;
    +  padding: 2px;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +}
    +.menu-item {
    +  position: relative;
    +  margin: 0;
    +  padding: 0;
    +  overflow: hidden;
    +  white-space: nowrap;
    +  cursor: pointer;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.menu-text {
    +  height: 20px;
    +  line-height: 20px;
    +  float: left;
    +  padding-left: 28px;
    +}
    +.menu-icon {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  left: 2px;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.menu-rightarrow {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  right: 0;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.menu-line {
    +  position: absolute;
    +  left: 26px;
    +  top: 0;
    +  height: 2000px;
    +  font-size: 1px;
    +}
    +.menu-sep {
    +  margin: 3px 0px 3px 25px;
    +  font-size: 1px;
    +}
    +.menu-active {
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.menu-item-disabled {
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +  cursor: default;
    +}
    +.menu-text,
    +.menu-text span {
    +  font-size: 12px;
    +}
    +.menu-shadow {
    +  position: absolute;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +  background: #777;
    +  -moz-box-shadow: 2px 2px 3px #787878;
    +  -webkit-box-shadow: 2px 2px 3px #787878;
    +  box-shadow: 2px 2px 3px #787878;
    +  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
    +}
    +.menu-rightarrow {
    +  background: url('images/menu_arrows.png') no-repeat -32px center;
    +}
    +.menu-line {
    +  border-left: 1px solid #444;
    +  border-right: 1px solid #777;
    +}
    +.menu-sep {
    +  border-top: 1px solid #444;
    +  border-bottom: 1px solid #777;
    +}
    +.menu {
    +  background-color: #666;
    +  border-color: #444;
    +  color: #fff;
    +}
    +.menu-content {
    +  background: #666;
    +}
    +.menu-item {
    +  border-color: transparent;
    +  _border-color: #666;
    +}
    +.menu-active {
    +  border-color: #555;
    +  color: #fff;
    +  background: #777;
    +}
    +.menu-active-disabled {
    +  border-color: transparent;
    +  background: transparent;
    +  color: #fff;
    +}
    +.m-btn-downarrow {
    +  display: inline-block;
    +  width: 16px;
    +  height: 16px;
    +  line-height: 16px;
    +  _vertical-align: middle;
    +}
    +a.m-btn-active {
    +  background-position: bottom right;
    +}
    +a.m-btn-active span.l-btn-left {
    +  background-position: bottom left;
    +}
    +a.m-btn-plain-active {
    +  background: transparent;
    +  padding: 0 5px 0 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.m-btn-downarrow {
    +  background: url('images/menu_arrows.png') no-repeat 2px center;
    +}
    +a.m-btn-plain-active {
    +  border-color: #555;
    +  background-color: #777;
    +  color: #fff;
    +}
    +.s-btn-downarrow {
    +  display: inline-block;
    +  margin: 0 0 0 4px;
    +  padding: 0 0 0 1px;
    +  width: 14px;
    +  height: 16px;
    +  line-height: 16px;
    +  border-width: 0;
    +  border-style: solid;
    +  _vertical-align: middle;
    +}
    +a.s-btn-active {
    +  background-position: bottom right;
    +}
    +a.s-btn-active span.l-btn-left {
    +  background-position: bottom left;
    +}
    +a.s-btn-plain-active {
    +  background: transparent;
    +  padding: 0 5px 0 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.s-btn-downarrow {
    +  background: url('images/menu_arrows.png') no-repeat 2px center;
    +  border-color: #cccccc;
    +}
    +a:hover.l-btn .s-btn-downarrow,
    +a.s-btn-active .s-btn-downarrow,
    +a.s-btn-plain-active .s-btn-downarrow {
    +  background-position: 1px center;
    +  padding: 0;
    +  border-width: 0 0 0 1px;
    +}
    +a.s-btn-plain-active {
    +  border-color: #555;
    +  background-color: #777;
    +  color: #fff;
    +}
    +.messager-body {
    +  padding: 10px;
    +  overflow: hidden;
    +}
    +.messager-button {
    +  text-align: center;
    +  padding-top: 10px;
    +}
    +.messager-icon {
    +  float: left;
    +  width: 32px;
    +  height: 32px;
    +  margin: 0 10px 10px 0;
    +}
    +.messager-error {
    +  background: url('images/messager_icons.png') no-repeat scroll -64px 0;
    +}
    +.messager-info {
    +  background: url('images/messager_icons.png') no-repeat scroll 0 0;
    +}
    +.messager-question {
    +  background: url('images/messager_icons.png') no-repeat scroll -32px 0;
    +}
    +.messager-warning {
    +  background: url('images/messager_icons.png') no-repeat scroll -96px 0;
    +}
    +.messager-progress {
    +  padding: 10px;
    +}
    +.messager-p-msg {
    +  margin-bottom: 5px;
    +}
    +.messager-body .messager-input {
    +  width: 100%;
    +  padding: 1px 0;
    +  border: 1px solid #000;
    +}
    +.tree {
    +  margin: 0;
    +  padding: 0;
    +  list-style-type: none;
    +}
    +.tree li {
    +  white-space: nowrap;
    +}
    +.tree li ul {
    +  list-style-type: none;
    +  margin: 0;
    +  padding: 0;
    +}
    +.tree-node {
    +  height: 18px;
    +  white-space: nowrap;
    +  cursor: pointer;
    +}
    +.tree-hit {
    +  cursor: pointer;
    +}
    +.tree-expanded,
    +.tree-collapsed,
    +.tree-folder,
    +.tree-file,
    +.tree-checkbox,
    +.tree-indent {
    +  display: inline-block;
    +  width: 16px;
    +  height: 18px;
    +  vertical-align: top;
    +  overflow: hidden;
    +}
    +.tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -18px 0px;
    +}
    +.tree-expanded-hover {
    +  background: url('images/tree_icons.png') no-repeat -50px 0px;
    +}
    +.tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat 0px 0px;
    +}
    +.tree-collapsed-hover {
    +  background: url('images/tree_icons.png') no-repeat -32px 0px;
    +}
    +.tree-lines .tree-expanded,
    +.tree-lines .tree-root-first .tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -144px 0;
    +}
    +.tree-lines .tree-collapsed,
    +.tree-lines .tree-root-first .tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat -128px 0;
    +}
    +.tree-lines .tree-node-last .tree-expanded,
    +.tree-lines .tree-root-one .tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -80px 0;
    +}
    +.tree-lines .tree-node-last .tree-collapsed,
    +.tree-lines .tree-root-one .tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat -64px 0;
    +}
    +.tree-line {
    +  background: url('images/tree_icons.png') no-repeat -176px 0;
    +}
    +.tree-join {
    +  background: url('images/tree_icons.png') no-repeat -192px 0;
    +}
    +.tree-joinbottom {
    +  background: url('images/tree_icons.png') no-repeat -160px 0;
    +}
    +.tree-folder {
    +  background: url('images/tree_icons.png') no-repeat -208px 0;
    +}
    +.tree-folder-open {
    +  background: url('images/tree_icons.png') no-repeat -224px 0;
    +}
    +.tree-file {
    +  background: url('images/tree_icons.png') no-repeat -240px 0;
    +}
    +.tree-loading {
    +  background: url('images/loading.gif') no-repeat center center;
    +}
    +.tree-checkbox0 {
    +  background: url('images/tree_icons.png') no-repeat -208px -18px;
    +}
    +.tree-checkbox1 {
    +  background: url('images/tree_icons.png') no-repeat -224px -18px;
    +}
    +.tree-checkbox2 {
    +  background: url('images/tree_icons.png') no-repeat -240px -18px;
    +}
    +.tree-title {
    +  font-size: 12px;
    +  display: inline-block;
    +  text-decoration: none;
    +  vertical-align: top;
    +  white-space: nowrap;
    +  padding: 0 2px;
    +  height: 18px;
    +  line-height: 18px;
    +}
    +.tree-node-proxy {
    +  font-size: 12px;
    +  line-height: 20px;
    +  padding: 0 2px 0 20px;
    +  border-width: 1px;
    +  border-style: solid;
    +  z-index: 9900000;
    +}
    +.tree-dnd-icon {
    +  display: inline-block;
    +  position: absolute;
    +  width: 16px;
    +  height: 18px;
    +  left: 2px;
    +  top: 50%;
    +  margin-top: -9px;
    +}
    +.tree-dnd-yes {
    +  background: url('images/tree_icons.png') no-repeat -256px 0;
    +}
    +.tree-dnd-no {
    +  background: url('images/tree_icons.png') no-repeat -256px -18px;
    +}
    +.tree-node-top {
    +  border-top: 1px dotted red;
    +}
    +.tree-node-bottom {
    +  border-bottom: 1px dotted red;
    +}
    +.tree-node-append .tree-title {
    +  border: 1px dotted red;
    +}
    +.tree-editor {
    +  border: 1px solid #ccc;
    +  font-size: 12px;
    +  height: 14px !important;
    +  height: 18px;
    +  line-height: 14px;
    +  padding: 1px 2px;
    +  width: 80px;
    +  position: absolute;
    +  top: 0;
    +}
    +.tree-node-proxy {
    +  background-color: #666;
    +  color: #fff;
    +  border-color: #000;
    +}
    +.tree-node-hover {
    +  background: #777;
    +  color: #fff;
    +}
    +.tree-node-selected {
    +  background: #0052A3;
    +  color: #fff;
    +}
    +.validatebox-tip {
    +  position: absolute;
    +  width: 200px;
    +  height: auto;
    +  display: none;
    +  z-index: 9900000;
    +}
    +.validatebox-tip-content {
    +  display: inline-block;
    +  position: absolute;
    +  top: 0px;
    +  left: 8px;
    +  width: 150px;
    +  border-width: 1px;
    +  border-style: solid;
    +  padding: 3px 5px;
    +  z-index: 9900001;
    +  font-size: 12px;
    +}
    +.validatebox-tip-pointer {
    +  display: inline-block;
    +  width: 8px;
    +  height: 16px;
    +  position: absolute;
    +  left: 1px;
    +  top: 0px;
    +  z-index: 9900002;
    +}
    +.validatebox-tip-left .validatebox-tip-content {
    +  left: auto;
    +  right: 8px;
    +}
    +.validatebox-tip-left .validatebox-tip-pointer {
    +  background-position: -20px center;
    +  left: auto;
    +  right: 1px;
    +}
    +.validatebox-invalid {
    +  background-image: url('images/validatebox_warning.png');
    +  background-repeat: no-repeat;
    +  background-position: right center;
    +  border-color: #ffa8a8;
    +  background-color: #fff3f3;
    +  color: #000;
    +}
    +.validatebox-tip-pointer {
    +  background: url('images/validatebox_arrows.png') no-repeat -4px center;
    +}
    +.validatebox-tip-content {
    +  border-color: #CC9933;
    +  background-color: #FFFFCC;
    +  color: #000;
    +}
    +
    +.shortcut{
    +	margin-left: 5px;
    +	margin-top: 8px;
    +	height: 62px;
    +}
    +.shortcut li{
    +	float: left;
    +	list-style: none;
    +	margin-right: 10px;
    +	cursor: pointer;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/accordion_arrows.png b/src/main/webapp/plug-in/easyui/themes/black/images/accordion_arrows.png
    new file mode 100644
    index 00000000..45fd44aa
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/accordion_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/blank.gif b/src/main/webapp/plug-in/easyui/themes/black/images/blank.gif
    new file mode 100644
    index 00000000..1d11fa9a
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/blank.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/calendar_arrows.png b/src/main/webapp/plug-in/easyui/themes/black/images/calendar_arrows.png
    new file mode 100644
    index 00000000..430c4ad6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/calendar_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/combo_arrow.png b/src/main/webapp/plug-in/easyui/themes/black/images/combo_arrow.png
    new file mode 100644
    index 00000000..ac58921c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/combo_arrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/datagrid_icons.png b/src/main/webapp/plug-in/easyui/themes/black/images/datagrid_icons.png
    new file mode 100644
    index 00000000..bdf87e38
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/datagrid_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/datebox_arrow.png b/src/main/webapp/plug-in/easyui/themes/black/images/datebox_arrow.png
    new file mode 100644
    index 00000000..783c8335
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/datebox_arrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/layout_arrows.png b/src/main/webapp/plug-in/easyui/themes/black/images/layout_arrows.png
    new file mode 100644
    index 00000000..19c611fa
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/layout_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/linkbutton_bg.png b/src/main/webapp/plug-in/easyui/themes/black/images/linkbutton_bg.png
    new file mode 100644
    index 00000000..fc66bd2c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/linkbutton_bg.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/loading.gif b/src/main/webapp/plug-in/easyui/themes/black/images/loading.gif
    new file mode 100644
    index 00000000..68f01d04
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/loading.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/menu_arrows.png b/src/main/webapp/plug-in/easyui/themes/black/images/menu_arrows.png
    new file mode 100644
    index 00000000..2a984941
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/menu_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/messager_icons.png b/src/main/webapp/plug-in/easyui/themes/black/images/messager_icons.png
    new file mode 100644
    index 00000000..62c18c13
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/messager_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/pagination_icons.png b/src/main/webapp/plug-in/easyui/themes/black/images/pagination_icons.png
    new file mode 100644
    index 00000000..3490ff7c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/pagination_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/panel_tools.png b/src/main/webapp/plug-in/easyui/themes/black/images/panel_tools.png
    new file mode 100644
    index 00000000..f97761eb
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/panel_tools.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/searchbox_button.png b/src/main/webapp/plug-in/easyui/themes/black/images/searchbox_button.png
    new file mode 100644
    index 00000000..6dd19315
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/searchbox_button.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/slider_handle.png b/src/main/webapp/plug-in/easyui/themes/black/images/slider_handle.png
    new file mode 100644
    index 00000000..b9802bae
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/slider_handle.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/spinner_arrows.png b/src/main/webapp/plug-in/easyui/themes/black/images/spinner_arrows.png
    new file mode 100644
    index 00000000..25ee848d
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/spinner_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/tabs_icons.png b/src/main/webapp/plug-in/easyui/themes/black/images/tabs_icons.png
    new file mode 100644
    index 00000000..732b1237
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/tabs_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/tree_icons.png b/src/main/webapp/plug-in/easyui/themes/black/images/tree_icons.png
    new file mode 100644
    index 00000000..2b4fd202
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/tree_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/validatebox_arrows.png b/src/main/webapp/plug-in/easyui/themes/black/images/validatebox_arrows.png
    new file mode 100644
    index 00000000..5fe78f7c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/validatebox_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/images/validatebox_warning.png b/src/main/webapp/plug-in/easyui/themes/black/images/validatebox_warning.png
    new file mode 100644
    index 00000000..2b3d4f05
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/black/images/validatebox_warning.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/layout.css b/src/main/webapp/plug-in/easyui/themes/black/layout.css
    new file mode 100644
    index 00000000..31190da2
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/layout.css
    @@ -0,0 +1,91 @@
    +.layout {
    +  position: relative;
    +  overflow: hidden;
    +  margin: 0;
    +  padding: 0;
    +  z-index: 0;
    +}
    +.layout-panel {
    +  position: absolute;
    +  overflow: hidden;
    +}
    +.layout-panel-east,
    +.layout-panel-west {
    +  z-index: 2;
    +}
    +.layout-panel-north,
    +.layout-panel-south {
    +  z-index: 3;
    +}
    +.layout-expand {
    +  position: absolute;
    +  padding: 0px;
    +  font-size: 1px;
    +  cursor: pointer;
    +  z-index: 1;
    +}
    +.layout-expand .panel-header,
    +.layout-expand .panel-body {
    +  background: transparent;
    +  filter: none;
    +  overflow: hidden;
    +}
    +.layout-expand .panel-header {
    +  border-bottom-width: 0px;
    +}
    +.layout-split-proxy-h,
    +.layout-split-proxy-v {
    +  position: absolute;
    +  font-size: 1px;
    +  display: none;
    +  z-index: 5;
    +}
    +.layout-split-proxy-h {
    +  width: 5px;
    +  cursor: e-resize;
    +}
    +.layout-split-proxy-v {
    +  height: 5px;
    +  cursor: n-resize;
    +}
    +.layout-mask {
    +  position: absolute;
    +  background: #fafafa;
    +  filter: alpha(opacity=10);
    +  opacity: 0.10;
    +  z-index: 4;
    +}
    +.layout-button-up {
    +  background: url('images/layout_arrows.png') no-repeat -16px -16px;
    +}
    +.layout-button-down {
    +  background: url('images/layout_arrows.png') no-repeat -16px 0;
    +}
    +.layout-button-left {
    +  background: url('images/layout_arrows.png') no-repeat 0 0;
    +}
    +.layout-button-right {
    +  background: url('images/layout_arrows.png') no-repeat 0 -16px;
    +}
    +.layout-split-proxy-h,
    +.layout-split-proxy-v {
    +  background-color: #cccccc;
    +}
    +.layout-split-north {
    +  border-bottom: 5px solid #444;
    +}
    +.layout-split-south {
    +  border-top: 5px solid #444;
    +}
    +.layout-split-east {
    +  border-left: 5px solid #444;
    +}
    +.layout-split-west {
    +  border-right: 5px solid #444;
    +}
    +.layout-expand {
    +  background-color: #3d3d3d;
    +}
    +.layout-expand-over {
    +  background-color: #3d3d3d;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/linkbutton.css b/src/main/webapp/plug-in/easyui/themes/black/linkbutton.css
    new file mode 100644
    index 00000000..e4f78761
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/linkbutton.css
    @@ -0,0 +1,121 @@
    +a.l-btn {
    +  background-position: right 0;
    +  font-size: 12px;
    +  text-decoration: none;
    +  display: inline-block;
    +  zoom: 1;
    +  height: 24px;
    +  padding-right: 18px;
    +  cursor: pointer;
    +  outline: none;
    +}
    +a.l-btn-plain {
    +  padding-right: 5px;
    +  border: 0;
    +  padding: 1px 6px 1px 1px;
    +}
    +a.l-btn-disabled {
    +  color: #ccc;
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +  cursor: default;
    +}
    +a.l-btn span.l-btn-left {
    +  display: inline-block;
    +  background-position: 0 -48px;
    +  padding: 4px 0px 4px 18px;
    +  line-height: 16px;
    +  height: 16px;
    +}
    +a.l-btn-plain span.l-btn-left {
    +  padding-left: 5px;
    +}
    +a.l-btn span span.l-btn-text {
    +  display: inline-block;
    +  vertical-align: baseline;
    +  width: auto;
    +  height: 16px;
    +  line-height: 16px;
    +  padding: 0;
    +  margin: 0;
    +}
    +a.l-btn span span.l-btn-icon-left {
    +  padding: 0 0 0 20px;
    +  background-position: left center;
    +}
    +a.l-btn span span.l-btn-icon-right {
    +  padding: 0 20px 0 0;
    +  background-position: right center;
    +}
    +a.l-btn span span span.l-btn-empty {
    +  display: inline-block;
    +  margin: 0;
    +  padding: 0;
    +  width: 16px;
    +}
    +a:hover.l-btn {
    +  background-position: right -24px;
    +  outline: none;
    +  text-decoration: none;
    +}
    +a:hover.l-btn span.l-btn-left {
    +  background-position: 0 bottom;
    +}
    +a:hover.l-btn-plain {
    +  padding: 0 5px 0 0;
    +}
    +a:hover.l-btn-disabled {
    +  background-position: right 0;
    +}
    +a:hover.l-btn-disabled span.l-btn-left {
    +  background-position: 0 -48px;
    +}
    +a.l-btn .l-btn-focus {
    +  outline: #0000FF dotted thin;
    +}
    +a.l-btn {
    +  color: #fff;
    +  background-image: url('images/linkbutton_bg.png');
    +  background-repeat: no-repeat;
    +  background: #777;
    +  background-repeat: repeat-x;
    +  border: 1px solid #555;
    +  background: -webkit-linear-gradient(top,#919191 0,#6a6a6a 100%);
    +  background: -moz-linear-gradient(top,#919191 0,#6a6a6a 100%);
    +  background: -o-linear-gradient(top,#919191 0,#6a6a6a 100%);
    +  background: linear-gradient(to bottom,#919191 0,#6a6a6a 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#919191,endColorstr=#6a6a6a,GradientType=0);
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +a.l-btn span.l-btn-left {
    +  background-image: url('images/linkbutton_bg.png');
    +  background-repeat: no-repeat;
    +  background-image: none;
    +}
    +a:hover.l-btn {
    +  background: #777;
    +  color: #fff;
    +  border: 1px solid #555;
    +  filter: none;
    +}
    +a.l-btn-plain,
    +a.l-btn-plain span.l-btn-left {
    +  background: transparent;
    +  border: 0;
    +  filter: none;
    +}
    +a:hover.l-btn-plain {
    +  background: #777;
    +  color: #fff;
    +  border: 1px solid #555;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +a.l-btn-disabled,
    +a:hover.l-btn-disabled {
    +  filter: alpha(opacity=50);
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/menu.css b/src/main/webapp/plug-in/easyui/themes/black/menu.css
    new file mode 100644
    index 00000000..9e89ea5a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/menu.css
    @@ -0,0 +1,109 @@
    +.menu {
    +  position: absolute;
    +  margin: 0;
    +  padding: 2px;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +}
    +.menu-item {
    +  position: relative;
    +  margin: 0;
    +  padding: 0;
    +  overflow: hidden;
    +  white-space: nowrap;
    +  cursor: pointer;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.menu-text {
    +  height: 20px;
    +  line-height: 20px;
    +  float: left;
    +  padding-left: 28px;
    +}
    +.menu-icon {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  left: 2px;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.menu-rightarrow {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  right: 0;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.menu-line {
    +  position: absolute;
    +  left: 26px;
    +  top: 0;
    +  height: 2000px;
    +  font-size: 1px;
    +}
    +.menu-sep {
    +  margin: 3px 0px 3px 25px;
    +  font-size: 1px;
    +}
    +.menu-active {
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.menu-item-disabled {
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +  cursor: default;
    +}
    +.menu-text,
    +.menu-text span {
    +  font-size: 12px;
    +}
    +.menu-shadow {
    +  position: absolute;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +  background: #777;
    +  -moz-box-shadow: 2px 2px 3px #787878;
    +  -webkit-box-shadow: 2px 2px 3px #787878;
    +  box-shadow: 2px 2px 3px #787878;
    +  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
    +}
    +.menu-rightarrow {
    +  background: url('images/menu_arrows.png') no-repeat -32px center;
    +}
    +.menu-line {
    +  border-left: 1px solid #444;
    +  border-right: 1px solid #777;
    +}
    +.menu-sep {
    +  border-top: 1px solid #444;
    +  border-bottom: 1px solid #777;
    +}
    +.menu {
    +  background-color: #666;
    +  border-color: #444;
    +  color: #fff;
    +}
    +.menu-content {
    +  background: #666;
    +}
    +.menu-item {
    +  border-color: transparent;
    +  _border-color: #666;
    +}
    +.menu-active {
    +  border-color: #555;
    +  color: #fff;
    +  background: #777;
    +}
    +.menu-active-disabled {
    +  border-color: transparent;
    +  background: transparent;
    +  color: #fff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/menubutton.css b/src/main/webapp/plug-in/easyui/themes/black/menubutton.css
    new file mode 100644
    index 00000000..badab4ad
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/menubutton.css
    @@ -0,0 +1,30 @@
    +.m-btn-downarrow {
    +  display: inline-block;
    +  width: 16px;
    +  height: 16px;
    +  line-height: 16px;
    +  _vertical-align: middle;
    +}
    +a.m-btn-active {
    +  background-position: bottom right;
    +}
    +a.m-btn-active span.l-btn-left {
    +  background-position: bottom left;
    +}
    +a.m-btn-plain-active {
    +  background: transparent;
    +  padding: 0 5px 0 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.m-btn-downarrow {
    +  background: url('images/menu_arrows.png') no-repeat 2px center;
    +}
    +a.m-btn-plain-active {
    +  border-color: #555;
    +  background-color: #777;
    +  color: #fff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/messager.css b/src/main/webapp/plug-in/easyui/themes/black/messager.css
    new file mode 100644
    index 00000000..f378f2a6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/messager.css
    @@ -0,0 +1,37 @@
    +.messager-body {
    +  padding: 10px;
    +  overflow: hidden;
    +}
    +.messager-button {
    +  text-align: center;
    +  padding-top: 10px;
    +}
    +.messager-icon {
    +  float: left;
    +  width: 32px;
    +  height: 32px;
    +  margin: 0 10px 10px 0;
    +}
    +.messager-error {
    +  background: url('images/messager_icons.png') no-repeat scroll -64px 0;
    +}
    +.messager-info {
    +  background: url('images/messager_icons.png') no-repeat scroll 0 0;
    +}
    +.messager-question {
    +  background: url('images/messager_icons.png') no-repeat scroll -32px 0;
    +}
    +.messager-warning {
    +  background: url('images/messager_icons.png') no-repeat scroll -96px 0;
    +}
    +.messager-progress {
    +  padding: 10px;
    +}
    +.messager-p-msg {
    +  margin-bottom: 5px;
    +}
    +.messager-body .messager-input {
    +  width: 100%;
    +  padding: 1px 0;
    +  border: 1px solid #000;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/pagination.css b/src/main/webapp/plug-in/easyui/themes/black/pagination.css
    new file mode 100644
    index 00000000..92fa015c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/pagination.css
    @@ -0,0 +1,66 @@
    +.pagination {
    +  zoom: 1;
    +}
    +.pagination table {
    +  float: left;
    +  height: 30px;
    +}
    +.pagination td {
    +  border: 0;
    +}
    +.pagination-btn-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #444;
    +  border-right: 1px solid #777;
    +  margin: 3px 1px;
    +}
    +.pagination .pagination-num {
    +  border-width: 1px;
    +  border-style: solid;
    +  margin: 0 2px;
    +  padding: 2px;
    +  width: 2em;
    +  height: auto;
    +}
    +.pagination-page-list {
    +  margin: 0px 6px;
    +  padding: 1px 2px;
    +  width: auto;
    +  height: auto;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.pagination-info {
    +  float: right;
    +  margin: 0 6px 0 0;
    +  padding: 0;
    +  height: 30px;
    +  line-height: 30px;
    +  font-size: 12px;
    +}
    +.pagination span {
    +  font-size: 12px;
    +}
    +.pagination-first {
    +  background: url('images/pagination_icons.png') no-repeat 0 0;
    +}
    +.pagination-prev {
    +  background: url('images/pagination_icons.png') no-repeat -16px 0;
    +}
    +.pagination-next {
    +  background: url('images/pagination_icons.png') no-repeat -32px 0;
    +}
    +.pagination-last {
    +  background: url('images/pagination_icons.png') no-repeat -48px 0;
    +}
    +.pagination-load {
    +  background: url('images/pagination_icons.png') no-repeat -64px 0;
    +}
    +.pagination-loading {
    +  background: url('images/loading.gif') no-repeat;
    +}
    +.pagination-page-list,
    +.pagination .pagination-num {
    +  border-color: #000;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/panel.css b/src/main/webapp/plug-in/easyui/themes/black/panel.css
    new file mode 100644
    index 00000000..00a64bbd
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/panel.css
    @@ -0,0 +1,124 @@
    +.panel {
    +  overflow: hidden;
    +  font-size: 12px;
    +  text-align: left;
    +}
    +.panel-header,
    +.panel-body {
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.panel-header {
    +  padding: 5px;
    +  position: relative;
    +}
    +.panel-title {
    +  background: url('images/blank.gif') no-repeat;
    +}
    +.panel-header-noborder {
    +  border-width: 0 0 1px 0;
    +}
    +.panel-body {
    +  overflow: auto;
    +  border-top-width: 0px;
    +}
    +.panel-body-noheader {
    +  border-top-width: 1px;
    +}
    +.panel-body-noborder {
    +  border-width: 0px;
    +}
    +.panel-with-icon {
    +  padding-left: 18px;
    +}
    +.panel-icon,
    +.panel-tool {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -8px;
    +  height: 16px;
    +  overflow: hidden;
    +}
    +.panel-icon {
    +  left: 5px;
    +  width: 16px;
    +}
    +.panel-tool {
    +  right: 5px;
    +  width: auto;
    +}
    +.panel-tool a {
    +  display: inline-block;
    +  width: 16px;
    +  height: 16px;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +  margin: 0 0 0 2px;
    +  vertical-align: top;
    +}
    +.panel-tool a:hover {
    +  opacity: 1;
    +  filter: alpha(opacity=100);
    +  background-color: #777;
    +  -moz-border-radius: 3px 3px 3px 3px;
    +  -webkit-border-radius: 3px 3px 3px 3px;
    +  border-radius: 3px 3px 3px 3px;
    +}
    +.panel-loading {
    +  padding: 11px 0px 10px 30px;
    +}
    +.panel-noscroll {
    +  overflow: hidden;
    +}
    +.panel-fit,
    +.panel-fit body {
    +  height: 100%;
    +  margin: 0;
    +  padding: 0;
    +  border: 0;
    +  overflow: hidden;
    +}
    +.panel-loading {
    +  background: url('images/loading.gif') no-repeat 10px 10px;
    +}
    +.panel-tool-close {
    +  background: url('images/panel_tools.png') no-repeat -16px 0px;
    +}
    +.panel-tool-min {
    +  background: url('images/panel_tools.png') no-repeat 0px 0px;
    +}
    +.panel-tool-max {
    +  background: url('images/panel_tools.png') no-repeat 0px -16px;
    +}
    +.panel-tool-restore {
    +  background: url('images/panel_tools.png') no-repeat -16px -16px;
    +}
    +.panel-tool-collapse {
    +  background: url('images/panel_tools.png') no-repeat -32px 0;
    +}
    +.panel-tool-expand {
    +  background: url('images/panel_tools.png') no-repeat -32px -16px;
    +}
    +.panel-header,
    +.panel-body {
    +  border-color: #000;
    +}
    +.panel-header {
    +  background-color: #3d3d3d;
    +  background: -webkit-linear-gradient(top,#454545 0,#383838 100%);
    +  background: -moz-linear-gradient(top,#454545 0,#383838 100%);
    +  background: -o-linear-gradient(top,#454545 0,#383838 100%);
    +  background: linear-gradient(to bottom,#454545 0,#383838 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0);
    +}
    +.panel-body {
    +  background-color: #666;
    +  color: #fff;
    +}
    +.panel-title {
    +  font-weight: bold;
    +  color: #fff;
    +  height: 16px;
    +  line-height: 16px;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/progressbar.css b/src/main/webapp/plug-in/easyui/themes/black/progressbar.css
    new file mode 100644
    index 00000000..026aa946
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/progressbar.css
    @@ -0,0 +1,30 @@
    +.progressbar {
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +  overflow: hidden;
    +}
    +.progressbar-text {
    +  text-align: center;
    +  position: absolute;
    +}
    +.progressbar-value {
    +  position: relative;
    +  overflow: hidden;
    +  width: 0;
    +  -moz-border-radius: 5px 0 0 5px;
    +  -webkit-border-radius: 5px 0 0 5px;
    +  border-radius: 5px 0 0 5px;
    +}
    +.progressbar {
    +  border-color: #000;
    +}
    +.progressbar-text {
    +  color: #fff;
    +}
    +.progressbar-value .progressbar-text {
    +  background-color: #0052A3;
    +  color: #fff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/propertygrid.css b/src/main/webapp/plug-in/easyui/themes/black/propertygrid.css
    new file mode 100644
    index 00000000..d71ce7c8
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/propertygrid.css
    @@ -0,0 +1,28 @@
    +.propertygrid .datagrid-view1 .datagrid-body td {
    +  padding-bottom: 1px;
    +  border-width: 0 1px 0 0;
    +}
    +.propertygrid .datagrid-group {
    +  height: 21px;
    +  overflow: hidden;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.propertygrid .datagrid-group span {
    +  font-weight: bold;
    +}
    +.propertygrid .datagrid-view1 .datagrid-body td {
    +  border-color: #222;
    +}
    +.propertygrid .datagrid-view1 .datagrid-group {
    +  border-color: #3d3d3d;
    +}
    +.propertygrid .datagrid-view2 .datagrid-group {
    +  border-color: #222;
    +}
    +.propertygrid .datagrid-group,
    +.propertygrid .datagrid-view1 .datagrid-body,
    +.propertygrid .datagrid-view1 .datagrid-row-over,
    +.propertygrid .datagrid-view1 .datagrid-row-selected {
    +  background: #3d3d3d;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/searchbox.css b/src/main/webapp/plug-in/easyui/themes/black/searchbox.css
    new file mode 100644
    index 00000000..a5026520
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/searchbox.css
    @@ -0,0 +1,79 @@
    +.searchbox {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +}
    +.searchbox .searchbox-text {
    +  font-size: 12px;
    +  border: 0;
    +  margin: 0;
    +  padding: 0;
    +  line-height: 20px;
    +  height: 20px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.searchbox .searchbox-prompt {
    +  font-size: 12px;
    +  color: #ccc;
    +}
    +.searchbox-button {
    +  width: 18px;
    +  height: 20px;
    +  overflow: hidden;
    +  display: inline-block;
    +  vertical-align: top;
    +  cursor: pointer;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.searchbox-button-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.searchbox a.l-btn-plain {
    +  height: 20px;
    +  border: 0;
    +  padding: 0 6px 0 0;
    +  vertical-align: top;
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.searchbox a.l-btn .l-btn-left {
    +  padding: 2px 0 2px 4px;
    +}
    +.searchbox a.l-btn-plain:hover {
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +  border: 0;
    +  padding: 0 6px 0 0;
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.searchbox a.m-btn-plain-active {
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +}
    +.searchbox-button {
    +  background: url('images/searchbox_button.png') no-repeat center center;
    +}
    +.searchbox {
    +  border-color: #000;
    +  background-color: #fff;
    +}
    +.searchbox a.l-btn-plain {
    +  background: #3d3d3d;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/slider.css b/src/main/webapp/plug-in/easyui/themes/black/slider.css
    new file mode 100644
    index 00000000..8815dbc8
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/slider.css
    @@ -0,0 +1,98 @@
    +.slider-disabled {
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +}
    +.slider-h {
    +  height: 22px;
    +}
    +.slider-v {
    +  width: 22px;
    +}
    +.slider-inner {
    +  position: relative;
    +  height: 6px;
    +  top: 7px;
    +  border-width: 1px;
    +  border-style: solid;
    +  border-radius: 3px;
    +}
    +.slider-handle {
    +  position: absolute;
    +  display: block;
    +  outline: none;
    +  width: 20px;
    +  height: 20px;
    +  top: -7px;
    +  margin-left: -10px;
    +}
    +.slider-tip {
    +  position: absolute;
    +  display: inline-block;
    +  line-height: 12px;
    +  white-space: nowrap;
    +  top: -22px;
    +}
    +.slider-rule {
    +  position: relative;
    +  top: 15px;
    +}
    +.slider-rule span {
    +  position: absolute;
    +  display: inline-block;
    +  font-size: 0;
    +  height: 5px;
    +  border-width: 0 0 0 1px;
    +  border-style: solid;
    +}
    +.slider-rulelabel {
    +  position: relative;
    +  top: 20px;
    +}
    +.slider-rulelabel span {
    +  position: absolute;
    +  display: inline-block;
    +}
    +.slider-v .slider-inner {
    +  width: 6px;
    +  left: 7px;
    +  top: 0;
    +  float: left;
    +}
    +.slider-v .slider-handle {
    +  left: 3px;
    +  margin-top: -10px;
    +}
    +.slider-v .slider-tip {
    +  left: -10px;
    +  margin-top: -6px;
    +}
    +.slider-v .slider-rule {
    +  float: left;
    +  top: 0;
    +  left: 16px;
    +}
    +.slider-v .slider-rule span {
    +  width: 5px;
    +  height: 'auto';
    +  border-left: 0;
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +}
    +.slider-v .slider-rulelabel {
    +  float: left;
    +  top: 0;
    +  left: 23px;
    +}
    +.slider-handle {
    +  background: url('images/slider_handle.png') no-repeat;
    +}
    +.slider-inner {
    +  border-color: #000;
    +  background: #3d3d3d;
    +}
    +.slider-rule span {
    +  border-color: #000;
    +}
    +.slider-rulelabel span {
    +  color: #fff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/spinner.css b/src/main/webapp/plug-in/easyui/themes/black/spinner.css
    new file mode 100644
    index 00000000..18ea2a90
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/spinner.css
    @@ -0,0 +1,59 @@
    +.spinner {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +  vertical-align: middle;
    +}
    +.spinner .spinner-text {
    +  font-size: 12px;
    +  border: 0px;
    +  line-height: 20px;
    +  height: 20px;
    +  margin: 0;
    +  padding: 0 2px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.spinner-arrow {
    +  display: inline-block;
    +  overflow: hidden;
    +  vertical-align: top;
    +  margin: 0;
    +  padding: 0;
    +}
    +.spinner-arrow-up,
    +.spinner-arrow-down {
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +  display: block;
    +  font-size: 1px;
    +  width: 18px;
    +  height: 10px;
    +}
    +.spinner-arrow-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.spinner-arrow-up {
    +  background: url('images/spinner_arrows.png') no-repeat 1px center;
    +}
    +.spinner-arrow-down {
    +  background: url('images/spinner_arrows.png') no-repeat -15px center;
    +}
    +.spinner {
    +  border-color: #000;
    +}
    +.spinner-arrow {
    +  background-color: #3d3d3d;
    +}
    +.spinner-arrow-hover {
    +  background-color: #777;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/splitbutton.css b/src/main/webapp/plug-in/easyui/themes/black/splitbutton.css
    new file mode 100644
    index 00000000..e154d4df
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/splitbutton.css
    @@ -0,0 +1,42 @@
    +.s-btn-downarrow {
    +  display: inline-block;
    +  margin: 0 0 0 4px;
    +  padding: 0 0 0 1px;
    +  width: 14px;
    +  height: 16px;
    +  line-height: 16px;
    +  border-width: 0;
    +  border-style: solid;
    +  _vertical-align: middle;
    +}
    +a.s-btn-active {
    +  background-position: bottom right;
    +}
    +a.s-btn-active span.l-btn-left {
    +  background-position: bottom left;
    +}
    +a.s-btn-plain-active {
    +  background: transparent;
    +  padding: 0 5px 0 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.s-btn-downarrow {
    +  background: url('images/menu_arrows.png') no-repeat 2px center;
    +  border-color: #cccccc;
    +}
    +a:hover.l-btn .s-btn-downarrow,
    +a.s-btn-active .s-btn-downarrow,
    +a.s-btn-plain-active .s-btn-downarrow {
    +  background-position: 1px center;
    +  padding: 0;
    +  border-width: 0 0 0 1px;
    +}
    +a.s-btn-plain-active {
    +  border-color: #555;
    +  background-color: #777;
    +  color: #fff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/tabs.css b/src/main/webapp/plug-in/easyui/themes/black/tabs.css
    new file mode 100644
    index 00000000..3392f97e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/tabs.css
    @@ -0,0 +1,361 @@
    +.tabs-container {
    +  overflow: hidden;
    +}
    +.tabs-header {
    +  border-width: 1px;
    +  border-style: solid;
    +  border-bottom-width: 0;
    +  position: relative;
    +  padding: 0;
    +  padding-top: 2px;
    +  overflow: hidden;
    +}
    +.tabs-header-plain {
    +  border: 0;
    +  background: transparent;
    +}
    +.tabs-scroller-left,
    +.tabs-scroller-right {
    +  position: absolute;
    +  top: auto;
    +  bottom: 0;
    +  width: 18px;
    +  height: 28px !important;
    +  height: 30px;
    +  font-size: 1px;
    +  display: none;
    +  cursor: pointer;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.tabs-scroller-left {
    +  left: 0;
    +}
    +.tabs-scroller-right {
    +  right: 0;
    +}
    +.tabs-header-plain .tabs-scroller-left,
    +.tabs-header-plain .tabs-scroller-right {
    +  height: 25px !important;
    +  height: 27px;
    +}
    +.tabs-tool {
    +  position: absolute;
    +  bottom: 0;
    +  padding: 1px;
    +  overflow: hidden;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.tabs-header-plain .tabs-tool {
    +  padding: 0 1px;
    +}
    +.tabs-wrap {
    +  position: relative;
    +  left: 0;
    +  overflow: hidden;
    +  width: 100%;
    +  margin: 0;
    +  padding: 0;
    +}
    +.tabs-scrolling {
    +  margin-left: 18px;
    +  margin-right: 18px;
    +}
    +.tabs-disabled {
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +}
    +.tabs {
    +  list-style-type: none;
    +  height: 26px;
    +  margin: 0px;
    +  padding: 0px;
    +  padding-left: 4px;
    +  font-size: 12px;
    +  width: 5000px;
    +  border-style: solid;
    +  border-width: 0 0 1px 0;
    +}
    +.tabs li {
    +  float: left;
    +  display: inline-block;
    +  margin: 0 4px -1px 0;
    +  padding: 0;
    +  position: relative;
    +  border: 0;
    +}
    +.tabs li a.tabs-inner {
    +  display: inline-block;
    +  text-decoration: none;
    +  margin: 0;
    +  padding: 0 10px;
    +  height: 25px;
    +  line-height: 25px;
    +  text-align: center;
    +  white-space: nowrap;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 5px 5px 0 0;
    +  -webkit-border-radius: 5px 5px 0 0;
    +  border-radius: 5px 5px 0 0;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  font-weight: bold;
    +  outline: none;
    +}
    +.tabs li.tabs-selected a:hover.tabs-inner {
    +  cursor: default;
    +  pointer: default;
    +}
    +.tabs li a.tabs-close,
    +.tabs-p-tool {
    +  position: absolute;
    +  font-size: 1px;
    +  display: block;
    +  height: 12px;
    +  padding: 0;
    +  top: 50%;
    +  margin-top: -6px;
    +  overflow: hidden;
    +}
    +.tabs li a.tabs-close {
    +  width: 12px;
    +  right: 5px;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.tabs-p-tool {
    +  right: 16px;
    +}
    +.tabs-p-tool a {
    +  display: inline-block;
    +  font-size: 1px;
    +  width: 12px;
    +  height: 12px;
    +  margin: 0;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.tabs li a:hover.tabs-close,
    +.tabs-p-tool a:hover {
    +  opacity: 1;
    +  filter: alpha(opacity=100);
    +  cursor: hand;
    +  cursor: pointer;
    +}
    +.tabs-with-icon {
    +  padding-left: 18px;
    +}
    +.tabs-icon {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  left: 10px;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.tabs-closable {
    +  padding-right: 8px;
    +}
    +.tabs-panels {
    +  margin: 0px;
    +  padding: 0px;
    +  border-width: 1px;
    +  border-style: solid;
    +  border-top-width: 0;
    +  overflow: hidden;
    +}
    +.tabs-header-bottom {
    +  border-width: 0 1px 1px 1px;
    +  padding: 0 0 2px 0;
    +}
    +.tabs-header-bottom .tabs {
    +  border-width: 1px 0 0 0;
    +}
    +.tabs-header-bottom .tabs li {
    +  margin: -1px 4px 0 0;
    +}
    +.tabs-header-bottom .tabs li a.tabs-inner {
    +  -moz-border-radius: 0 0 5px 5px;
    +  -webkit-border-radius: 0 0 5px 5px;
    +  border-radius: 0 0 5px 5px;
    +}
    +.tabs-header-bottom .tabs-tool {
    +  top: 0;
    +}
    +.tabs-header-bottom .tabs-scroller-left,
    +.tabs-header-bottom .tabs-scroller-right {
    +  top: 0;
    +  bottom: auto;
    +}
    +.tabs-panels-top {
    +  border-width: 1px 1px 0 1px;
    +}
    +.tabs-header-left {
    +  float: left;
    +  border-width: 1px 0 1px 1px;
    +  padding: 0;
    +}
    +.tabs-header-right {
    +  float: right;
    +  border-width: 1px 1px 1px 0;
    +  padding: 0;
    +}
    +.tabs-header-left .tabs-wrap,
    +.tabs-header-right .tabs-wrap {
    +  height: 100%;
    +}
    +.tabs-header-left .tabs {
    +  height: 100%;
    +  padding: 4px 0 0 4px;
    +  border-width: 0 1px 0 0;
    +}
    +.tabs-header-right .tabs {
    +  height: 100%;
    +  padding: 4px 4px 0 0;
    +  border-width: 0 0 0 1px;
    +}
    +.tabs-header-left .tabs li,
    +.tabs-header-right .tabs li {
    +  display: block;
    +  width: 100%;
    +  position: relative;
    +}
    +.tabs-header-left .tabs li {
    +  left: auto;
    +  right: 0;
    +  margin: 0 -1px 4px 0;
    +  float: right;
    +}
    +.tabs-header-right .tabs li {
    +  left: 0;
    +  right: auto;
    +  margin: 0 0 4px -1px;
    +  float: left;
    +}
    +.tabs-header-left .tabs li a.tabs-inner {
    +  display: block;
    +  text-align: left;
    +  -moz-border-radius: 5px 0 0 5px;
    +  -webkit-border-radius: 5px 0 0 5px;
    +  border-radius: 5px 0 0 5px;
    +}
    +.tabs-header-right .tabs li a.tabs-inner {
    +  display: block;
    +  text-align: left;
    +  -moz-border-radius: 0 5px 5px 0;
    +  -webkit-border-radius: 0 5px 5px 0;
    +  border-radius: 0 5px 5px 0;
    +}
    +.tabs-panels-right {
    +  float: right;
    +  border-width: 1px 1px 1px 0;
    +}
    +.tabs-panels-left {
    +  float: left;
    +  border-width: 1px 0 1px 1px;
    +}
    +.tabs-header-noborder,
    +.tabs-panels-noborder {
    +  border: 0px;
    +}
    +.tabs-header-plain {
    +  border: 0px;
    +  background: transparent;
    +}
    +.tabs-scroller-left {
    +  background: #3d3d3d url('images/tabs_icons.png') no-repeat 1px center;
    +}
    +.tabs-scroller-right {
    +  background: #3d3d3d url('images/tabs_icons.png') no-repeat -15px center;
    +}
    +.tabs li a.tabs-close {
    +  background: url('images/tabs_icons.png') no-repeat -34px center;
    +}
    +.tabs li a.tabs-inner:hover {
    +  background: #777;
    +  color: #fff;
    +  filter: none;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  background-color: #666;
    +  color: #fff;
    +  background: -webkit-linear-gradient(top,#454545 0,#666 100%);
    +  background: -moz-linear-gradient(top,#454545 0,#666 100%);
    +  background: -o-linear-gradient(top,#454545 0,#666 100%);
    +  background: linear-gradient(to bottom,#454545 0,#666 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=0);
    +}
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {
    +  background: -webkit-linear-gradient(top,#666 0,#454545 100%);
    +  background: -moz-linear-gradient(top,#666 0,#454545 100%);
    +  background: -o-linear-gradient(top,#666 0,#454545 100%);
    +  background: linear-gradient(to bottom,#666 0,#454545 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=0);
    +}
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner {
    +  background: -webkit-linear-gradient(left,#454545 0,#666 100%);
    +  background: -moz-linear-gradient(left,#454545 0,#666 100%);
    +  background: -o-linear-gradient(left,#454545 0,#666 100%);
    +  background: linear-gradient(to right,#454545 0,#666 100%);
    +  background-repeat: repeat-y;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=1);
    +}
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  background: -webkit-linear-gradient(left,#666 0,#454545 100%);
    +  background: -moz-linear-gradient(left,#666 0,#454545 100%);
    +  background: -o-linear-gradient(left,#666 0,#454545 100%);
    +  background: linear-gradient(to right,#666 0,#454545 100%);
    +  background-repeat: repeat-y;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=1);
    +}
    +.tabs li a.tabs-inner {
    +  color: #fff;
    +  background-color: #3d3d3d;
    +  background: -webkit-linear-gradient(top,#454545 0,#383838 100%);
    +  background: -moz-linear-gradient(top,#454545 0,#383838 100%);
    +  background: -o-linear-gradient(top,#454545 0,#383838 100%);
    +  background: linear-gradient(to bottom,#454545 0,#383838 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0);
    +}
    +.tabs-header,
    +.tabs-tool {
    +  background-color: #3d3d3d;
    +}
    +.tabs-header-plain {
    +  background: transparent;
    +}
    +.tabs-header,
    +.tabs-scroller-left,
    +.tabs-scroller-right,
    +.tabs-tool,
    +.tabs,
    +.tabs-panels,
    +.tabs li a.tabs-inner,
    +.tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  border-color: #000;
    +}
    +.tabs-p-tool a:hover,
    +.tabs li a:hover.tabs-close,
    +.tabs-scroller-over {
    +  background-color: #777;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  border-bottom: 1px solid #666;
    +}
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {
    +  border-top: 1px solid #666;
    +}
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner {
    +  border-right: 1px solid #666;
    +}
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  border-left: 1px solid #666;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/tree.css b/src/main/webapp/plug-in/easyui/themes/black/tree.css
    new file mode 100644
    index 00000000..ea955cb3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/tree.css
    @@ -0,0 +1,157 @@
    +.tree {
    +  margin: 0;
    +  padding: 0;
    +  list-style-type: none;
    +}
    +.tree li {
    +  white-space: nowrap;
    +}
    +.tree li ul {
    +  list-style-type: none;
    +  margin: 0;
    +  padding: 0;
    +}
    +.tree-node {
    +  height: 18px;
    +  white-space: nowrap;
    +  cursor: pointer;
    +}
    +.tree-hit {
    +  cursor: pointer;
    +}
    +.tree-expanded,
    +.tree-collapsed,
    +.tree-folder,
    +.tree-file,
    +.tree-checkbox,
    +.tree-indent {
    +  display: inline-block;
    +  width: 16px;
    +  height: 18px;
    +  vertical-align: top;
    +  overflow: hidden;
    +}
    +.tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -18px 0px;
    +}
    +.tree-expanded-hover {
    +  background: url('images/tree_icons.png') no-repeat -50px 0px;
    +}
    +.tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat 0px 0px;
    +}
    +.tree-collapsed-hover {
    +  background: url('images/tree_icons.png') no-repeat -32px 0px;
    +}
    +.tree-lines .tree-expanded,
    +.tree-lines .tree-root-first .tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -144px 0;
    +}
    +.tree-lines .tree-collapsed,
    +.tree-lines .tree-root-first .tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat -128px 0;
    +}
    +.tree-lines .tree-node-last .tree-expanded,
    +.tree-lines .tree-root-one .tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -80px 0;
    +}
    +.tree-lines .tree-node-last .tree-collapsed,
    +.tree-lines .tree-root-one .tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat -64px 0;
    +}
    +.tree-line {
    +  background: url('images/tree_icons.png') no-repeat -176px 0;
    +}
    +.tree-join {
    +  background: url('images/tree_icons.png') no-repeat -192px 0;
    +}
    +.tree-joinbottom {
    +  background: url('images/tree_icons.png') no-repeat -160px 0;
    +}
    +.tree-folder {
    +  background: url('images/tree_icons.png') no-repeat -208px 0;
    +}
    +.tree-folder-open {
    +  background: url('images/tree_icons.png') no-repeat -224px 0;
    +}
    +.tree-file {
    +  background: url('images/tree_icons.png') no-repeat -240px 0;
    +}
    +.tree-loading {
    +  background: url('images/loading.gif') no-repeat center center;
    +}
    +.tree-checkbox0 {
    +  background: url('images/tree_icons.png') no-repeat -208px -18px;
    +}
    +.tree-checkbox1 {
    +  background: url('images/tree_icons.png') no-repeat -224px -18px;
    +}
    +.tree-checkbox2 {
    +  background: url('images/tree_icons.png') no-repeat -240px -18px;
    +}
    +.tree-title {
    +  font-size: 12px;
    +  display: inline-block;
    +  text-decoration: none;
    +  vertical-align: top;
    +  white-space: nowrap;
    +  padding: 0 2px;
    +  height: 18px;
    +  line-height: 18px;
    +}
    +.tree-node-proxy {
    +  font-size: 12px;
    +  line-height: 20px;
    +  padding: 0 2px 0 20px;
    +  border-width: 1px;
    +  border-style: solid;
    +  z-index: 9900000;
    +}
    +.tree-dnd-icon {
    +  display: inline-block;
    +  position: absolute;
    +  width: 16px;
    +  height: 18px;
    +  left: 2px;
    +  top: 50%;
    +  margin-top: -9px;
    +}
    +.tree-dnd-yes {
    +  background: url('images/tree_icons.png') no-repeat -256px 0;
    +}
    +.tree-dnd-no {
    +  background: url('images/tree_icons.png') no-repeat -256px -18px;
    +}
    +.tree-node-top {
    +  border-top: 1px dotted red;
    +}
    +.tree-node-bottom {
    +  border-bottom: 1px dotted red;
    +}
    +.tree-node-append .tree-title {
    +  border: 1px dotted red;
    +}
    +.tree-editor {
    +  border: 1px solid #ccc;
    +  font-size: 12px;
    +  height: 14px !important;
    +  height: 18px;
    +  line-height: 14px;
    +  padding: 1px 2px;
    +  width: 80px;
    +  position: absolute;
    +  top: 0;
    +}
    +.tree-node-proxy {
    +  background-color: #666;
    +  color: #fff;
    +  border-color: #000;
    +}
    +.tree-node-hover {
    +  background: #777;
    +  color: #fff;
    +}
    +.tree-node-selected {
    +  background: #0052A3;
    +  color: #fff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/validatebox.css b/src/main/webapp/plug-in/easyui/themes/black/validatebox.css
    new file mode 100644
    index 00000000..06d86a3e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/validatebox.css
    @@ -0,0 +1,53 @@
    +.validatebox-tip {
    +  position: absolute;
    +  width: 200px;
    +  height: auto;
    +  display: none;
    +  z-index: 9900000;
    +}
    +.validatebox-tip-content {
    +  display: inline-block;
    +  position: absolute;
    +  top: 0px;
    +  left: 8px;
    +  width: 150px;
    +  border-width: 1px;
    +  border-style: solid;
    +  padding: 3px 5px;
    +  z-index: 9900001;
    +  font-size: 12px;
    +}
    +.validatebox-tip-pointer {
    +  display: inline-block;
    +  width: 8px;
    +  height: 16px;
    +  position: absolute;
    +  left: 1px;
    +  top: 0px;
    +  z-index: 9900002;
    +}
    +.validatebox-tip-left .validatebox-tip-content {
    +  left: auto;
    +  right: 8px;
    +}
    +.validatebox-tip-left .validatebox-tip-pointer {
    +  background-position: -20px center;
    +  left: auto;
    +  right: 1px;
    +}
    +.validatebox-invalid {
    +  background-image: url('images/validatebox_warning.png');
    +  background-repeat: no-repeat;
    +  background-position: right center;
    +  border-color: #ffa8a8;
    +  background-color: #fff3f3;
    +  color: #000;
    +}
    +.validatebox-tip-pointer {
    +  background: url('images/validatebox_arrows.png') no-repeat -4px center;
    +}
    +.validatebox-tip-content {
    +  border-color: #CC9933;
    +  background-color: #FFFFCC;
    +  color: #000;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/black/window.css b/src/main/webapp/plug-in/easyui/themes/black/window.css
    new file mode 100644
    index 00000000..12772738
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/black/window.css
    @@ -0,0 +1,87 @@
    +.window {
    +  overflow: hidden;
    +  padding: 5px;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.window .window-header {
    +  background: transparent;
    +  padding: 0px 0px 6px 0px;
    +}
    +.window .window-body {
    +  border-width: 1px;
    +  border-style: solid;
    +  border-top-width: 0px;
    +}
    +.window .window-body-noheader {
    +  border-top-width: 1px;
    +}
    +.window .window-header .panel-icon,
    +.window .window-header .panel-tool {
    +  top: 50%;
    +  margin-top: -11px;
    +}
    +.window .window-header .panel-icon {
    +  left: 1px;
    +}
    +.window .window-header .panel-tool {
    +  right: 1px;
    +}
    +.window .window-header .panel-with-icon {
    +  padding-left: 18px;
    +}
    +.window-proxy {
    +  position: absolute;
    +  overflow: hidden;
    +}
    +.window-proxy-mask {
    +  position: absolute;
    +  filter: alpha(opacity=5);
    +  opacity: 0.05;
    +}
    +.window-mask {
    +  position: absolute;
    +  left: 0;
    +  top: 0;
    +  width: 100%;
    +  height: 100%;
    +  filter: alpha(opacity=40);
    +  opacity: 0.40;
    +  font-size: 1px;
    +  *zoom: 1;
    +  overflow: hidden;
    +}
    +.window,
    +.window-shadow {
    +  position: absolute;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.window-shadow {
    +  background: #777;
    +  -moz-box-shadow: 2px 2px 3px #787878;
    +  -webkit-box-shadow: 2px 2px 3px #787878;
    +  box-shadow: 2px 2px 3px #787878;
    +  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
    +}
    +.window,
    +.window .window-body {
    +  border-color: #000;
    +}
    +.window {
    +  background-color: #3d3d3d;
    +  background: -webkit-linear-gradient(top,#454545 0,#383838 20%);
    +  background: -moz-linear-gradient(top,#454545 0,#383838 20%);
    +  background: -o-linear-gradient(top,#454545 0,#383838 20%);
    +  background: linear-gradient(to bottom,#454545 0,#383838 20%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0);
    +}
    +.window-proxy {
    +  border: 1px dashed #000;
    +}
    +.window-proxy-mask,
    +.window-mask {
    +  background: #000;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/easyui.css b/src/main/webapp/plug-in/easyui/themes/default/easyui.css
    new file mode 100644
    index 00000000..bb829ec7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/default/easyui.css
    @@ -0,0 +1,2221 @@
    +.panel {
    +  overflow: hidden;
    +  font-size: 12px;
    +  text-align: left;
    +}
    +.panel-header,
    +.panel-body {
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.panel-header {
    +  padding: 5px;
    +  position: relative;
    +}
    +.panel-title {
    +  background: url('images/blank.gif') no-repeat;
    +}
    +.panel-header-noborder {
    +  border-width: 0 0 1px 0;
    +}
    +.panel-body {
    +  overflow: auto;
    +  border-top-width: 0px;
    +}
    +.panel-body-noheader {
    +  border-top-width: 1px;
    +}
    +.panel-body-noborder {
    +  border-width: 0px;
    +}
    +.panel-with-icon {
    +  padding-left: 18px;
    +}
    +.panel-icon,
    +.panel-tool {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -8px;
    +  height: 16px;
    +  overflow: hidden;
    +}
    +.panel-icon {
    +  left: 5px;
    +  width: 16px;
    +}
    +.panel-tool {
    +  right: 5px;
    +  width: auto;
    +}
    +.panel-tool a {
    +  display: inline-block;
    +  width: 16px;
    +  height: 16px;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +  margin: 0 0 0 2px;
    +  vertical-align: top;
    +}
    +.panel-tool a:hover {
    +  opacity: 1;
    +  filter: alpha(opacity=100);
    +  background-color: #eaf2ff;
    +  -moz-border-radius: 3px 3px 3px 3px;
    +  -webkit-border-radius: 3px 3px 3px 3px;
    +  border-radius: 3px 3px 3px 3px;
    +}
    +.panel-loading {
    +  padding: 11px 0px 10px 30px;
    +}
    +.panel-noscroll {
    +  overflow: hidden;
    +}
    +.panel-fit,
    +.panel-fit body {
    +  height: 100%;
    +  margin: 0;
    +  padding: 0;
    +  border: 0;
    +  overflow: hidden;
    +}
    +.panel-loading {
    +  background: url('images/loading.gif') no-repeat 10px 10px;
    +}
    +.panel-tool-close {
    +  background: url('images/panel_tools.png') no-repeat -16px 0px;
    +}
    +.panel-tool-min {
    +  background: url('images/panel_tools.png') no-repeat 0px 0px;
    +}
    +.panel-tool-max {
    +  background: url('images/panel_tools.png') no-repeat 0px -16px;
    +}
    +.panel-tool-restore {
    +  background: url('images/panel_tools.png') no-repeat -16px -16px;
    +}
    +.panel-tool-collapse {
    +  background: url('images/panel_tools.png') no-repeat -32px 0;
    +}
    +.panel-tool-expand {
    +  background: url('images/panel_tools.png') no-repeat -32px -16px;
    +}
    +.panel-header,
    +.panel-body {
    +  border-color: #95B8E7;
    +}
    +.panel-header {
    +  background-color: #E0ECFF;
    +  background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);
    +  background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);
    +  background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);
    +  background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);
    +}
    +.panel-body {
    +  background-color: #ffffff;
    +  color: #000000;
    +}
    +.panel-title {
    +  font-weight: bold;
    +  color: #0E2D5F;
    +  height: 16px;
    +  line-height: 16px;
    +}
    +.accordion {
    +  overflow: hidden;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.accordion .accordion-header {
    +  border-width: 0 0 1px;
    +  cursor: pointer;
    +}
    +.accordion .accordion-body {
    +  border-width: 0 0 1px;
    +}
    +.accordion-noborder {
    +  border-width: 0;
    +}
    +.accordion-noborder .accordion-header {
    +  border-width: 0 0 1px;
    +}
    +.accordion-noborder .accordion-body {
    +  border-width: 0 0 1px;
    +}
    +.accordion-collapse {
    +  background: url('images/accordion_arrows.png') no-repeat 0 0;
    +}
    +.accordion-expand {
    +  background: url('images/accordion_arrows.png') no-repeat -16px 0;
    +}
    +.accordion {
    +  background: #ffffff;
    +  border-color: #95B8E7;
    +}
    +.accordion .accordion-header {
    +  background: #E0ECFF;
    +  filter: none;
    +}
    +.accordion .accordion-header-selected {
    +  background: #FBEC88;
    +}
    +.accordion .accordion-header-selected .panel-title {
    +  color: #000000;
    +}
    +.window {
    +  overflow: hidden;
    +  padding: 5px;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.window .window-header {
    +  background: transparent;
    +  padding: 0px 0px 6px 0px;
    +}
    +.window .window-body {
    +  border-width: 1px;
    +  border-style: solid;
    +  border-top-width: 0px;
    +}
    +.window .window-body-noheader {
    +  border-top-width: 1px;
    +}
    +.window .window-header .panel-icon,
    +.window .window-header .panel-tool {
    +  top: 50%;
    +  margin-top: -11px;
    +}
    +.window .window-header .panel-icon {
    +  left: 1px;
    +}
    +.window .window-header .panel-tool {
    +  right: 1px;
    +}
    +.window .window-header .panel-with-icon {
    +  padding-left: 18px;
    +}
    +.window-proxy {
    +  position: absolute;
    +  overflow: hidden;
    +}
    +.window-proxy-mask {
    +  position: absolute;
    +  filter: alpha(opacity=5);
    +  opacity: 0.05;
    +}
    +.window-mask {
    +  position: absolute;
    +  left: 0;
    +  top: 0;
    +  width: 100%;
    +  height: 100%;
    +  filter: alpha(opacity=40);
    +  opacity: 0.40;
    +  font-size: 1px;
    +  *zoom: 1;
    +  overflow: hidden;
    +}
    +.window,
    +.window-shadow {
    +  position: absolute;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.window-shadow {
    +  background: #ccc;
    +  -moz-box-shadow: 2px 2px 3px #cccccc;
    +  -webkit-box-shadow: 2px 2px 3px #cccccc;
    +  box-shadow: 2px 2px 3px #cccccc;
    +  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
    +}
    +.window,
    +.window .window-body {
    +  border-color: #95B8E7;
    +}
    +.window {
    +  background-color: #E0ECFF;
    +  background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);
    +  background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);
    +  background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);
    +  background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 20%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);
    +}
    +.window-proxy {
    +  border: 1px dashed #95B8E7;
    +}
    +.window-proxy-mask,
    +.window-mask {
    +  background: #ccc;
    +}
    +.dialog-content {
    +  overflow: auto;
    +}
    +.dialog-toolbar {
    +  padding: 2px 5px;
    +}
    +.dialog-tool-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #ccc;
    +  border-right: 1px solid #fff;
    +  margin: 2px 1px;
    +}
    +.dialog-button {
    +  padding: 5px;
    +  text-align: right;
    +}
    +.dialog-button .l-btn {
    +  margin-left: 5px;
    +}
    +.dialog-toolbar,
    +.dialog-button {
    +  background: #F4F4F4;
    +}
    +.dialog-toolbar {
    +  border-bottom: 1px solid #dddddd;
    +}
    +.dialog-button {
    +  border-top: 1px solid #dddddd;
    +}
    +.combo {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +  vertical-align: middle;
    +}
    +.combo .combo-text {
    +  font-size: 12px;
    +  border: 0px;
    +  line-height: 20px;
    +  height: 20px;
    +  margin: 0;
    +  padding: 0px 2px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.combo-arrow {
    +  width: 18px;
    +  height: 20px;
    +  overflow: hidden;
    +  display: inline-block;
    +  vertical-align: top;
    +  cursor: pointer;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.combo-arrow-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.combo-panel {
    +  overflow: auto;
    +}
    +.combo-arrow {
    +  background: url('images/combo_arrow.png') no-repeat center center;
    +}
    +.combo,
    +.combo-panel {
    +  background-color: #ffffff;
    +}
    +.combo {
    +  border-color: #95B8E7;
    +  background-color: #ffffff;
    +}
    +.combo-arrow {
    +  background-color: #E0ECFF;
    +}
    +.combo-arrow-hover {
    +  background-color: #eaf2ff;
    +}
    +.combobox-item {
    +  padding: 2px;
    +  font-size: 12px;
    +  padding: 3px;
    +  padding-right: 0px;
    +}
    +.combobox-item-hover {
    +  background-color: #eaf2ff;
    +  color: #000000;
    +}
    +.combobox-item-selected {
    +  background-color: #FBEC88;
    +  color: #000000;
    +}
    +.layout {
    +  position: relative;
    +  overflow: hidden;
    +  margin: 0;
    +  padding: 0;
    +  z-index: 0;
    +}
    +.layout-panel {
    +  position: absolute;
    +  overflow: hidden;
    +}
    +.layout-panel-east,
    +.layout-panel-west {
    +  z-index: 2;
    +}
    +.layout-panel-north,
    +.layout-panel-south {
    +  z-index: 3;
    +}
    +.layout-expand {
    +  position: absolute;
    +  padding: 0px;
    +  font-size: 1px;
    +  cursor: pointer;
    +  z-index: 1;
    +}
    +.layout-expand .panel-header,
    +.layout-expand .panel-body {
    +  background: transparent;
    +  filter: none;
    +  overflow: hidden;
    +}
    +.layout-expand .panel-header {
    +  border-bottom-width: 0px;
    +}
    +.layout-split-proxy-h,
    +.layout-split-proxy-v {
    +  position: absolute;
    +  font-size: 1px;
    +  display: none;
    +  z-index: 5;
    +}
    +.layout-split-proxy-h {
    +  width: 5px;
    +  cursor: e-resize;
    +}
    +.layout-split-proxy-v {
    +  height: 5px;
    +  cursor: n-resize;
    +}
    +.layout-mask {
    +  position: absolute;
    +  background: #fafafa;
    +  filter: alpha(opacity=10);
    +  opacity: 0.10;
    +  z-index: 4;
    +}
    +.layout-button-up {
    +  background: url('images/layout_arrows.png') no-repeat -16px -16px;
    +}
    +.layout-button-down {
    +  background: url('images/layout_arrows.png') no-repeat -16px 0;
    +}
    +.layout-button-left {
    +  background: url('images/layout_arrows.png') no-repeat 0 0;
    +}
    +.layout-button-right {
    +  background: url('images/layout_arrows.png') no-repeat 0 -16px;
    +}
    +.layout-split-proxy-h,
    +.layout-split-proxy-v {
    +  background-color: #aac5e7;
    +}
    +.layout-split-north {
    +  border-bottom: 5px solid #E6EEF8;
    +}
    +.layout-split-south {
    +  border-top: 5px solid #E6EEF8;
    +}
    +.layout-split-east {
    +  border-left: 5px solid #E6EEF8;
    +}
    +.layout-split-west {
    +  border-right: 5px solid #E6EEF8;
    +}
    +.layout-expand {
    +  background-color: #E0ECFF;
    +}
    +.layout-expand-over {
    +  background-color: #E0ECFF;
    +}
    +.tabs-container {
    +  overflow: hidden;
    +}
    +.tabs-header {
    +  border-width: 1px;
    +  border-style: solid;
    +  border-bottom-width: 0;
    +  position: relative;
    +  padding: 0;
    +  padding-top: 2px;
    +  overflow: hidden;
    +}
    +.tabs-header-plain {
    +  border: 0;
    +  background: transparent;
    +}
    +.tabs-scroller-left,
    +.tabs-scroller-right {
    +  position: absolute;
    +  top: auto;
    +  bottom: 0;
    +  width: 18px;
    +  height: 28px !important;
    +  height: 30px;
    +  font-size: 1px;
    +  display: none;
    +  cursor: pointer;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.tabs-scroller-left {
    +  left: 0;
    +}
    +.tabs-scroller-right {
    +  right: 0;
    +}
    +.tabs-header-plain .tabs-scroller-left,
    +.tabs-header-plain .tabs-scroller-right {
    +  height: 25px !important;
    +  height: 27px;
    +}
    +.tabs-tool {
    +  position: absolute;
    +  bottom: 0;
    +  padding: 1px;
    +  overflow: hidden;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.tabs-header-plain .tabs-tool {
    +  padding: 0 1px;
    +}
    +.tabs-wrap {
    +  position: relative;
    +  left: 0;
    +  overflow: hidden;
    +  width: 100%;
    +  margin: 0;
    +  padding: 0;
    +}
    +.tabs-scrolling {
    +  margin-left: 18px;
    +  margin-right: 18px;
    +}
    +.tabs-disabled {
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +}
    +.tabs {
    +  list-style-type: none;
    +  height: 26px;
    +  margin: 0px;
    +  padding: 0px;
    +  padding-left: 4px;
    +  font-size: 12px;
    +  width: 5000px;
    +  border-style: solid;
    +  border-width: 0 0 1px 0;
    +}
    +.tabs li {
    +  float: left;
    +  display: inline-block;
    +  margin: 0 4px -1px 0;
    +  padding: 0;
    +  position: relative;
    +  border: 0;
    +}
    +.tabs li a.tabs-inner {
    +  display: inline-block;
    +  text-decoration: none;
    +  margin: 0;
    +  padding: 0 10px;
    +  height: 25px;
    +  line-height: 25px;
    +  text-align: center;
    +  white-space: nowrap;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 5px 5px 0 0;
    +  -webkit-border-radius: 5px 5px 0 0;
    +  border-radius: 5px 5px 0 0;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  font-weight: bold;
    +  outline: none;
    +}
    +.tabs li.tabs-selected a:hover.tabs-inner {
    +  cursor: default;
    +  pointer: default;
    +}
    +.tabs li a.tabs-close,
    +.tabs-p-tool {
    +  position: absolute;
    +  font-size: 1px;
    +  display: block;
    +  height: 12px;
    +  padding: 0;
    +  top: 50%;
    +  margin-top: -6px;
    +  overflow: hidden;
    +}
    +.tabs li a.tabs-close {
    +  width: 12px;
    +  right: 5px;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.tabs-p-tool {
    +  right: 16px;
    +}
    +.tabs-p-tool a {
    +  display: inline-block;
    +  font-size: 1px;
    +  width: 12px;
    +  height: 12px;
    +  margin: 0;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.tabs li a:hover.tabs-close,
    +.tabs-p-tool a:hover {
    +  opacity: 1;
    +  filter: alpha(opacity=100);
    +  cursor: hand;
    +  cursor: pointer;
    +}
    +.tabs-with-icon {
    +  padding-left: 18px;
    +}
    +.tabs-icon {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  left: 10px;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.tabs-closable {
    +  padding-right: 8px;
    +}
    +.tabs-panels {
    +  margin: 1px;
    +  padding: 0px;
    +  border-width: 1px;
    +  border-style: solid;
    +  border-top-width: 0;
    +  overflow: hidden;
    +}
    +.tabs-header-bottom {
    +  border-width: 0 1px 1px 1px;
    +  padding: 0 0 2px 0;
    +}
    +.tabs-header-bottom .tabs {
    +  border-width: 1px 0 0 0;
    +}
    +.tabs-header-bottom .tabs li {
    +  margin: -1px 4px 0 0;
    +}
    +.tabs-header-bottom .tabs li a.tabs-inner {
    +  -moz-border-radius: 0 0 5px 5px;
    +  -webkit-border-radius: 0 0 5px 5px;
    +  border-radius: 0 0 5px 5px;
    +}
    +.tabs-header-bottom .tabs-tool {
    +  top: 0;
    +}
    +.tabs-header-bottom .tabs-scroller-left,
    +.tabs-header-bottom .tabs-scroller-right {
    +  top: 0;
    +  bottom: auto;
    +}
    +.tabs-panels-top {
    +  border-width: 1px 1px 0 1px;
    +}
    +.tabs-header-left {
    +  float: left;
    +  border-width: 1px 0 1px 1px;
    +  padding: 0;
    +}
    +.tabs-header-right {
    +  float: right;
    +  border-width: 1px 1px 1px 0;
    +  padding: 0;
    +}
    +.tabs-header-left .tabs-wrap,
    +.tabs-header-right .tabs-wrap {
    +  height: 100%;
    +}
    +.tabs-header-left .tabs {
    +  height: 100%;
    +  padding: 4px 0 0 4px;
    +  border-width: 0 1px 0 0;
    +}
    +.tabs-header-right .tabs {
    +  height: 100%;
    +  padding: 4px 4px 0 0;
    +  border-width: 0 0 0 1px;
    +}
    +.tabs-header-left .tabs li,
    +.tabs-header-right .tabs li {
    +  display: block;
    +  width: 100%;
    +  position: relative;
    +}
    +.tabs-header-left .tabs li {
    +  left: auto;
    +  right: 0;
    +  margin: 0 -1px 4px 0;
    +  float: right;
    +}
    +.tabs-header-right .tabs li {
    +  left: 0;
    +  right: auto;
    +  margin: 0 0 4px -1px;
    +  float: left;
    +}
    +.tabs-header-left .tabs li a.tabs-inner {
    +  display: block;
    +  text-align: left;
    +  -moz-border-radius: 5px 0 0 5px;
    +  -webkit-border-radius: 5px 0 0 5px;
    +  border-radius: 5px 0 0 5px;
    +}
    +.tabs-header-right .tabs li a.tabs-inner {
    +  display: block;
    +  text-align: left;
    +  -moz-border-radius: 0 5px 5px 0;
    +  -webkit-border-radius: 0 5px 5px 0;
    +  border-radius: 0 5px 5px 0;
    +}
    +.tabs-panels-right {
    +  float: right;
    +  border-width: 1px 1px 1px 0;
    +}
    +.tabs-panels-left {
    +  float: left;
    +  border-width: 1px 0 1px 1px;
    +}
    +.tabs-header-noborder,
    +.tabs-panels-noborder {
    +  border: 0px;
    +}
    +.tabs-header-plain {
    +  border: 0px;
    +  background: transparent;
    +}
    +.tabs-scroller-left {
    +  background: #E0ECFF url('images/tabs_icons.png') no-repeat 1px center;
    +}
    +.tabs-scroller-right {
    +  background: #E0ECFF url('images/tabs_icons.png') no-repeat -15px center;
    +}
    +.tabs li a.tabs-close {
    +  background: url('images/tabs_icons.png') no-repeat -34px center;
    +}
    +.tabs li a.tabs-inner:hover {
    +  background: #eaf2ff;
    +  color: #000000;
    +  filter: none;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  background-color: #ffffff;
    +  color: #0E2D5F;
    +  background: -webkit-linear-gradient(top,#EFF5FF 0,#ffffff 100%);
    +  background: -moz-linear-gradient(top,#EFF5FF 0,#ffffff 100%);
    +  background: -o-linear-gradient(top,#EFF5FF 0,#ffffff 100%);
    +  background: linear-gradient(to bottom,#EFF5FF 0,#ffffff 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=0);
    +}
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {
    +  background: -webkit-linear-gradient(top,#ffffff 0,#EFF5FF 100%);
    +  background: -moz-linear-gradient(top,#ffffff 0,#EFF5FF 100%);
    +  background: -o-linear-gradient(top,#ffffff 0,#EFF5FF 100%);
    +  background: linear-gradient(to bottom,#ffffff 0,#EFF5FF 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=0);
    +}
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner {
    +  background: -webkit-linear-gradient(left,#EFF5FF 0,#ffffff 100%);
    +  background: -moz-linear-gradient(left,#EFF5FF 0,#ffffff 100%);
    +  background: -o-linear-gradient(left,#EFF5FF 0,#ffffff 100%);
    +  background: linear-gradient(to right,#EFF5FF 0,#ffffff 100%);
    +  background-repeat: repeat-y;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=1);
    +}
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  background: -webkit-linear-gradient(left,#ffffff 0,#EFF5FF 100%);
    +  background: -moz-linear-gradient(left,#ffffff 0,#EFF5FF 100%);
    +  background: -o-linear-gradient(left,#ffffff 0,#EFF5FF 100%);
    +  background: linear-gradient(to right,#ffffff 0,#EFF5FF 100%);
    +  background-repeat: repeat-y;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=1);
    +}
    +.tabs li a.tabs-inner {
    +  color: #0E2D5F;
    +  background-color: #E0ECFF;
    +  background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);
    +  background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);
    +  background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);
    +  background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);
    +}
    +.tabs-header,
    +.tabs-tool {
    +  background-color: #E0ECFF;
    +}
    +.tabs-header-plain {
    +  background: transparent;
    +}
    +.tabs-header,
    +.tabs-scroller-left,
    +.tabs-scroller-right,
    +.tabs-tool,
    +.tabs,
    +.tabs-panels,
    +.tabs li a.tabs-inner,
    +.tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  border-color: #95B8E7;
    +}
    +.tabs-p-tool a:hover,
    +.tabs li a:hover.tabs-close,
    +.tabs-scroller-over {
    +  background-color: #eaf2ff;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  border-bottom: 1px solid #ffffff;
    +}
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {
    +  border-top: 1px solid #ffffff;
    +}
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner {
    +  border-right: 1px solid #ffffff;
    +}
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  border-left: 1px solid #ffffff;
    +}
    +a.l-btn {
    +  background-position: right 0;
    +  font-size: 12px;
    +  text-decoration: none;
    +  display: inline-block;
    +  zoom: 1;
    +  height: 24px;
    +  padding-right: 18px;
    +  cursor: pointer;
    +  outline: none;
    +}
    +a.l-btn-plain {
    +  padding-right: 5px;
    +  border: 0;
    +  padding: 1px 6px 1px 1px;
    +}
    +a.l-btn-disabled {
    +  color: #ccc;
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +  cursor: default;
    +}
    +a.l-btn span.l-btn-left {
    +  display: inline-block;
    +  background-position: 0 -48px;
    +  padding: 4px 0px 4px 18px;
    +  line-height: 16px;
    +  height: 16px;
    +}
    +a.l-btn-plain span.l-btn-left {
    +  padding-left: 5px;
    +}
    +a.l-btn span span.l-btn-text {
    +  display: inline-block;
    +  vertical-align: baseline;
    +  width: auto;
    +  height: 16px;
    +  line-height: 16px;
    +  padding: 0;
    +  margin: 0;
    +}
    +a.l-btn span span.l-btn-icon-left {
    +  padding: 0 0 0 20px;
    +  background-position: left center;
    +}
    +a.l-btn span span.l-btn-icon-right {
    +  padding: 0 20px 0 0;
    +  background-position: right center;
    +}
    +a.l-btn span span span.l-btn-empty {
    +  display: inline-block;
    +  margin: 0;
    +  padding: 0;
    +  width: 16px;
    +}
    +a:hover.l-btn {
    +  background-position: right -24px;
    +  outline: none;
    +  text-decoration: none;
    +}
    +a:hover.l-btn span.l-btn-left {
    +  background-position: 0 bottom;
    +}
    +a:hover.l-btn-plain {
    +  padding: 0 5px 0 0;
    +}
    +a:hover.l-btn-disabled {
    +  background-position: right 0;
    +}
    +a:hover.l-btn-disabled span.l-btn-left {
    +  background-position: 0 -48px;
    +}
    +a.l-btn .l-btn-focus {
    +  outline: #0000FF dotted thin;
    +}
    +a.l-btn {
    +  color: #444;
    +  background-image: url('images/linkbutton_bg.png');
    +  background-repeat: no-repeat;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +a.l-btn span.l-btn-left {
    +  background-image: url('images/linkbutton_bg.png');
    +  background-repeat: no-repeat;
    +}
    +a.l-btn-plain,
    +a.l-btn-plain span.l-btn-left {
    +  background: transparent;
    +  border: 0;
    +  filter: none;
    +}
    +a:hover.l-btn-plain {
    +  background: #eaf2ff;
    +  color: #000000;
    +  border: 1px solid #b7d2ff;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +a.l-btn-disabled,
    +a:hover.l-btn-disabled {
    +  filter: alpha(opacity=50);
    +}
    +.datagrid .panel-body {
    +  overflow: hidden;
    +  position: relative;
    +}
    +.datagrid-view {
    +  position: relative;
    +  overflow: hidden;
    +}
    +.datagrid-view1,
    +.datagrid-view2 {
    +  position: absolute;
    +  overflow: hidden;
    +  top: 0;
    +}
    +.datagrid-view1 {
    +  left: 0;
    +}
    +.datagrid-view2 {
    +  right: 0;
    +}
    +.datagrid-mask {
    +  position: absolute;
    +  left: 0;
    +  top: 0;
    +  width: 100%;
    +  height: 100%;
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +  display: none;
    +}
    +.datagrid-mask-msg {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -20px;
    +  padding: 12px 5px 10px 30px;
    +  width: auto;
    +  height: 16px;
    +  border-width: 2px;
    +  border-style: solid;
    +  display: none;
    +}
    +.datagrid-sort-icon {
    +  padding: 0;
    +}
    +.datagrid-toolbar {
    +  height: auto;
    +  padding: 1px 2px;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.datagrid-btn-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #ccc;
    +  border-right: 1px solid #fff;
    +  margin: 2px 1px;
    +}
    +.datagrid .datagrid-pager {
    +  margin: 0;
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +}
    +.datagrid .datagrid-pager-top {
    +  border-width: 0 0 1px 0;
    +}
    +.datagrid-header {
    +  overflow: hidden;
    +  cursor: default;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.datagrid-header-inner {
    +  float: left;
    +  width: 10000px;
    +}
    +.datagrid-header-row,
    +.datagrid-row {
    +  height: 25px;
    +}
    +.datagrid-header td,
    +.datagrid-body td,
    +.datagrid-footer td {
    +  border-width: 0 1px 1px 0;
    +  border-style: dotted;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-cell,
    +.datagrid-cell-group,
    +.datagrid-header-rownumber,
    +.datagrid-cell-rownumber {
    +  margin: 0;
    +  padding: 0 4px;
    +  white-space: nowrap;
    +  word-wrap: normal;
    +  overflow: hidden;
    +  height: 18px;
    +  line-height: 18px;
    +  font-weight: normal;
    +  font-size: 12px;
    +}
    +.datagrid-cell-group {
    +  text-align: center;
    +}
    +.datagrid-header-rownumber,
    +.datagrid-cell-rownumber {
    +  width: 40px;
    +  text-align: center;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body {
    +  margin: 0;
    +  padding: 0;
    +  overflow: auto;
    +  zoom: 1;
    +}
    +.datagrid-view1 .datagrid-body-inner {
    +  padding-bottom: 20px;
    +}
    +.datagrid-view1 .datagrid-body {
    +  overflow: hidden;
    +}
    +.datagrid-footer {
    +  overflow: hidden;
    +}
    +.datagrid-footer-inner {
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +  width: 10000px;
    +  float: left;
    +}
    +.datagrid-row-editing .datagrid-cell {
    +  height: auto;
    +}
    +.datagrid-header-check,
    +.datagrid-cell-check {
    +  padding: 0;
    +  width: 27px;
    +  height: 18px;
    +  font-size: 1px;
    +  text-align: center;
    +  overflow: hidden;
    +}
    +.datagrid-header-check input,
    +.datagrid-cell-check input {
    +  margin: 0;
    +  padding: 0;
    +  width: 15px;
    +  height: 18px;
    +}
    +.datagrid-resize-proxy {
    +  position: absolute;
    +  width: 1px;
    +  height: 10000px;
    +  top: 0;
    +  cursor: e-resize;
    +  display: none;
    +}
    +.datagrid-body .datagrid-editable {
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body .datagrid-editable table {
    +  width: 100%;
    +  height: 100%;
    +}
    +.datagrid-body .datagrid-editable td {
    +  border: 0;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body .datagrid-editable .datagrid-editable-input {
    +  margin: 0;
    +  padding: 2px;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.datagrid-sort-desc .datagrid-sort-icon {
    +  padding: 0 13px 0 0;
    +  background: url('images/datagrid_icons.png') no-repeat -16px center;
    +}
    +.datagrid-sort-asc .datagrid-sort-icon {
    +  padding: 0 13px 0 0;
    +  background: url('images/datagrid_icons.png') no-repeat 0px center;
    +}
    +.datagrid-row-collapse {
    +  background: url('images/datagrid_icons.png') no-repeat -48px center;
    +}
    +.datagrid-row-expand {
    +  background: url('images/datagrid_icons.png') no-repeat -32px center;
    +}
    +.datagrid-mask-msg {
    +  background: #ffffff url('images/loading.gif') no-repeat scroll 5px center;
    +}
    +.datagrid-header,
    +.datagrid-td-rownumber {
    +  background-color: #efefef;
    +  background: -webkit-linear-gradient(top,#F9F9F9 0,#efefef 100%);
    +  background: -moz-linear-gradient(top,#F9F9F9 0,#efefef 100%);
    +  background: -o-linear-gradient(top,#F9F9F9 0,#efefef 100%);
    +  background: linear-gradient(to bottom,#F9F9F9 0,#efefef 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F9F9F9,endColorstr=#efefef,GradientType=0);
    +}
    +.datagrid-cell-rownumber {
    +  width:40px;
    +  color: #000000;
    +}
    +.datagrid-resize-proxy {
    +  background: #aac5e7;
    +}
    +.datagrid-mask {
    +  background: #ccc;
    +}
    +.datagrid-mask-msg {
    +  border-color: #95B8E7;
    +}
    +.datagrid-toolbar,
    +.datagrid-pager {
    +  background: #F4F4F4;
    +}
    +.datagrid-header,
    +.datagrid-toolbar,
    +.datagrid-pager,
    +.datagrid-footer-inner {
    +  border-color: #dddddd;
    +}
    +.datagrid-header td,
    +.datagrid-body td,
    +.datagrid-footer td {
    +  border-color: #ccc;
    +}
    +.datagrid-htable,
    +.datagrid-btable,
    +.datagrid-ftable {
    +  color: #000000;
    +}
    +.datagrid-row-alt {
    +  background: #fafafa;
    +}
    +.datagrid-row-over,
    +.datagrid-header td.datagrid-header-over {
    +  background: #eaf2ff;
    +  color: #000000;
    +  cursor: default;
    +}
    +.datagrid-row-selected {
    +  background: #FBEC88;
    +  color: #000000;
    +}
    +.datagrid-body .datagrid-editable .datagrid-editable-input {
    +  border-color: #95B8E7;
    +}
    +.propertygrid .datagrid-view1 .datagrid-body td {
    +  padding-bottom: 1px;
    +  border-width: 0 1px 0 0;
    +}
    +.propertygrid .datagrid-group {
    +  height: 21px;
    +  overflow: hidden;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.propertygrid .datagrid-group span {
    +  font-weight: bold;
    +}
    +.propertygrid .datagrid-view1 .datagrid-body td {
    +  border-color: #dddddd;
    +}
    +.propertygrid .datagrid-view1 .datagrid-group {
    +  border-color: #E0ECFF;
    +}
    +.propertygrid .datagrid-view2 .datagrid-group {
    +  border-color: #dddddd;
    +}
    +.propertygrid .datagrid-group,
    +.propertygrid .datagrid-view1 .datagrid-body,
    +.propertygrid .datagrid-view1 .datagrid-row-over,
    +.propertygrid .datagrid-view1 .datagrid-row-selected {
    +  background: #E0ECFF;
    +}
    +.pagination {
    +  zoom: 1;
    +}
    +.pagination table {
    +  float: left;
    +  height: 30px;
    +}
    +.pagination td {
    +  border: 0;
    +}
    +.pagination-btn-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #ccc;
    +  border-right: 1px solid #fff;
    +  margin: 3px 1px;
    +}
    +.pagination .pagination-num {
    +  border-width: 1px;
    +  border-style: solid;
    +  margin: 0 2px;
    +  padding: 2px;
    +  width: 2em;
    +  height: auto;
    +}
    +.pagination-page-list {
    +  margin: 0px 6px;
    +  padding: 1px 2px;
    +  width: auto;
    +  height: auto;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.pagination-info {
    +  float: right;
    +  margin: 0 6px 0 0;
    +  padding: 0;
    +  height: 30px;
    +  line-height: 30px;
    +  font-size: 12px;
    +}
    +.pagination span {
    +  font-size: 12px;
    +}
    +.pagination-first {
    +  background: url('images/pagination_icons.png') no-repeat 0 0;
    +}
    +.pagination-prev {
    +  background: url('images/pagination_icons.png') no-repeat -16px 0;
    +}
    +.pagination-next {
    +  background: url('images/pagination_icons.png') no-repeat -32px 0;
    +}
    +.pagination-last {
    +  background: url('images/pagination_icons.png') no-repeat -48px 0;
    +}
    +.pagination-load {
    +  background: url('images/pagination_icons.png') no-repeat -64px 0;
    +}
    +.pagination-loading {
    +  background: url('images/loading.gif') no-repeat;
    +}
    +.pagination-page-list,
    +.pagination .pagination-num {
    +  border-color: #95B8E7;
    +}
    +.calendar {
    +  border-width: 1px;
    +  border-style: solid;
    +  padding: 1px;
    +  overflow: hidden;
    +  font-size: 12px;
    +}
    +.calendar table {
    +  border-collapse: separate;
    +  font-size: 12px;
    +  width: 100%;
    +  height: 100%;
    +}
    +.calendar-noborder {
    +  border: 0;
    +}
    +.calendar-header {
    +  position: relative;
    +  height: 22px;
    +}
    +.calendar-title {
    +  text-align: center;
    +  height: 22px;
    +}
    +.calendar-title span {
    +  position: relative;
    +  display: inline-block;
    +  top: 2px;
    +  padding: 0 3px;
    +  height: 18px;
    +  line-height: 18px;
    +  cursor: pointer;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-prevmonth,
    +.calendar-nextmonth,
    +.calendar-prevyear,
    +.calendar-nextyear {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -7px;
    +  width: 14px;
    +  height: 14px;
    +  cursor: pointer;
    +  font-size: 1px;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-prevmonth {
    +  left: 20px;
    +  background: url('images/calendar_arrows.png') no-repeat -18px -2px;
    +}
    +.calendar-nextmonth {
    +  right: 20px;
    +  background: url('images/calendar_arrows.png') no-repeat -34px -2px;
    +}
    +.calendar-prevyear {
    +  left: 3px;
    +  background: url('images/calendar_arrows.png') no-repeat -1px -2px;
    +}
    +.calendar-nextyear {
    +  right: 3px;
    +  background: url('images/calendar_arrows.png') no-repeat -49px -2px;
    +}
    +.calendar-body {
    +  position: relative;
    +}
    +.calendar-body th,
    +.calendar-body td {
    +  text-align: center;
    +}
    +.calendar-day {
    +  border: 0;
    +  padding: 1px;
    +  cursor: pointer;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-other-month {
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +}
    +.calendar-menu {
    +  position: absolute;
    +  top: 0;
    +  left: 0;
    +  width: 180px;
    +  height: 150px;
    +  padding: 5px;
    +  font-size: 12px;
    +  display: none;
    +  overflow: hidden;
    +}
    +.calendar-menu-year-inner {
    +  text-align: center;
    +  padding-bottom: 5px;
    +}
    +.calendar-menu-year {
    +  width: 40px;
    +  text-align: center;
    +  border-width: 1px;
    +  border-style: solid;
    +  margin: 0;
    +  padding: 2px;
    +  font-weight: bold;
    +}
    +.calendar-menu-prev,
    +.calendar-menu-next {
    +  display: inline-block;
    +  width: 21px;
    +  height: 21px;
    +  vertical-align: top;
    +  cursor: pointer;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-menu-prev {
    +  margin-right: 10px;
    +  background: url('images/calendar_arrows.png') no-repeat 2px 2px;
    +}
    +.calendar-menu-next {
    +  margin-left: 10px;
    +  background: url('images/calendar_arrows.png') no-repeat -45px 2px;
    +}
    +.calendar-menu-month {
    +  text-align: center;
    +  cursor: pointer;
    +  font-weight: bold;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.calendar-body th,
    +.calendar-menu-month {
    +  color: #4d4d4d;
    +}
    +.calendar-day {
    +  color: #000000;
    +}
    +.calendar-sunday {
    +  color: #CC2222;
    +}
    +.calendar-saturday {
    +  color: #00ee00;
    +}
    +.calendar-today {
    +  color: #0000ff;
    +}
    +.calendar-menu-year {
    +  border-color: #95B8E7;
    +}
    +.calendar {
    +  border-color: #95B8E7;
    +}
    +.calendar-header {
    +  background: #E0ECFF;
    +}
    +.calendar-body,
    +.calendar-menu {
    +  background: #ffffff;
    +}
    +.calendar-body th {
    +  background: #F4F4F4;
    +}
    +.calendar-hover,
    +.calendar-nav-hover,
    +.calendar-menu-hover {
    +  background-color: #eaf2ff;
    +  color: #000000;
    +}
    +.calendar-hover {
    +  border: 1px solid #b7d2ff;
    +  padding: 0;
    +}
    +.calendar-selected {
    +  background-color: #FBEC88;
    +  color: #000000;
    +  border: 1px solid #E2C608;
    +  padding: 0;
    +}
    +.datebox-calendar-inner {
    +  height: 180px;
    +}
    +.datebox-button {
    +  height: 18px;
    +  padding: 2px 5px;
    +  font-size: 12px;
    +  text-align: center;
    +}
    +.datebox-current,
    +.datebox-close,
    +.datebox-ok {
    +  text-decoration: none;
    +  font-weight: bold;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.datebox-current,
    +.datebox-close {
    +  float: left;
    +}
    +.datebox-close {
    +  float: right;
    +}
    +.datebox-button-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.datebox .combo-arrow {
    +  background-image: url('images/datebox_arrow.png');
    +  background-position: center center;
    +}
    +.datebox-button {
    +  background-color: #F4F4F4;
    +}
    +.datebox-current,
    +.datebox-close,
    +.datebox-ok {
    +  color: #444;
    +}
    +.spinner {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +  vertical-align: middle;
    +}
    +.spinner .spinner-text {
    +  font-size: 12px;
    +  border: 0px;
    +  line-height: 20px;
    +  height: 20px;
    +  margin: 0;
    +  padding: 0 2px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.spinner-arrow {
    +  display: inline-block;
    +  overflow: hidden;
    +  vertical-align: top;
    +  margin: 0;
    +  padding: 0;
    +}
    +.spinner-arrow-up,
    +.spinner-arrow-down {
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +  display: block;
    +  font-size: 1px;
    +  width: 18px;
    +  height: 10px;
    +}
    +.spinner-arrow-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.spinner-arrow-up {
    +  background: url('images/spinner_arrows.png') no-repeat 1px center;
    +}
    +.spinner-arrow-down {
    +  background: url('images/spinner_arrows.png') no-repeat -15px center;
    +}
    +.spinner {
    +  border-color: #95B8E7;
    +}
    +.spinner-arrow {
    +  background-color: #E0ECFF;
    +}
    +.spinner-arrow-hover {
    +  background-color: #eaf2ff;
    +}
    +.progressbar {
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +  overflow: hidden;
    +}
    +.progressbar-text {
    +  text-align: center;
    +  position: absolute;
    +}
    +.progressbar-value {
    +  position: relative;
    +  overflow: hidden;
    +  width: 0;
    +  -moz-border-radius: 5px 0 0 5px;
    +  -webkit-border-radius: 5px 0 0 5px;
    +  border-radius: 5px 0 0 5px;
    +}
    +.progressbar {
    +  border-color: #95B8E7;
    +}
    +.progressbar-text {
    +  color: #000000;
    +}
    +.progressbar-value .progressbar-text {
    +  background-color: #FBEC88;
    +  color: #000000;
    +}
    +.searchbox {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +}
    +.searchbox .searchbox-text {
    +  font-size: 12px;
    +  border: 0;
    +  margin: 0;
    +  padding: 0;
    +  line-height: 20px;
    +  height: 20px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.searchbox-inputtext{
    +	border:#999 1px solid;
    +	height:20px;
    +	background:#fff url(images/searchbox_button.png) no-repeat right;
    +}
    +.searchbox-inputtext15{
    +	border:#999 1px solid;
    +	height:15px;
    +	background:#fff url(images/searchbox_button.png) no-repeat right;
    +}
    +.searchbox .searchbox-prompt {
    +  font-size: 12px;
    +  color: #ccc;
    +}
    +.searchbox-button {
    +  width: 18px;
    +  height: 20px;
    +  overflow: hidden;
    +  display: inline-block;
    +  vertical-align: top;
    +  cursor: pointer;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.searchbox-button-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.searchbox a.l-btn-plain {
    +  height: 20px;
    +  border: 0;
    +  padding: 0 6px 0 0;
    +  vertical-align: top;
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.searchbox a.l-btn .l-btn-left {
    +  padding: 2px 0 2px 4px;
    +}
    +.searchbox a.l-btn-plain:hover {
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +  border: 0;
    +  padding: 0 6px 0 0;
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.searchbox a.m-btn-plain-active {
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +}
    +.searchbox-button {
    +  background: url('images/searchbox_button.png') no-repeat center center;
    +}
    +.searchbox {
    +  border-color: #95B8E7;
    +  background-color: #fff;
    +}
    +.searchbox a.l-btn-plain {
    +  background: #E0ECFF;
    +}
    +.slider-disabled {
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +}
    +.slider-h {
    +  height: 22px;
    +}
    +.slider-v {
    +  width: 22px;
    +}
    +.slider-inner {
    +  position: relative;
    +  height: 6px;
    +  top: 7px;
    +  border-width: 1px;
    +  border-style: solid;
    +  border-radius: 3px;
    +}
    +.slider-handle {
    +  position: absolute;
    +  display: block;
    +  outline: none;
    +  width: 20px;
    +  height: 20px;
    +  top: -7px;
    +  margin-left: -10px;
    +}
    +.slider-tip {
    +  position: absolute;
    +  display: inline-block;
    +  line-height: 12px;
    +  white-space: nowrap;
    +  top: -22px;
    +}
    +.slider-rule {
    +  position: relative;
    +  top: 15px;
    +}
    +.slider-rule span {
    +  position: absolute;
    +  display: inline-block;
    +  font-size: 0;
    +  height: 5px;
    +  border-width: 0 0 0 1px;
    +  border-style: solid;
    +}
    +.slider-rulelabel {
    +  position: relative;
    +  top: 20px;
    +}
    +.slider-rulelabel span {
    +  position: absolute;
    +  display: inline-block;
    +}
    +.slider-v .slider-inner {
    +  width: 6px;
    +  left: 7px;
    +  top: 0;
    +  float: left;
    +}
    +.slider-v .slider-handle {
    +  left: 3px;
    +  margin-top: -10px;
    +}
    +.slider-v .slider-tip {
    +  left: -10px;
    +  margin-top: -6px;
    +}
    +.slider-v .slider-rule {
    +  float: left;
    +  top: 0;
    +  left: 16px;
    +}
    +.slider-v .slider-rule span {
    +  width: 5px;
    +  height: 'auto';
    +  border-left: 0;
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +}
    +.slider-v .slider-rulelabel {
    +  float: left;
    +  top: 0;
    +  left: 23px;
    +}
    +.slider-handle {
    +  background: url('images/slider_handle.png') no-repeat;
    +}
    +.slider-inner {
    +  border-color: #95B8E7;
    +  background: #E0ECFF;
    +}
    +.slider-rule span {
    +  border-color: #95B8E7;
    +}
    +.slider-rulelabel span {
    +  color: #000000;
    +}
    +.menu {
    +  position: absolute;
    +  margin: 0;
    +  padding: 2px;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +}
    +.menu-item {
    +  position: relative;
    +  margin: 0;
    +  padding: 0;
    +  overflow: hidden;
    +  white-space: nowrap;
    +  cursor: pointer;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.menu-text {
    +  height: 20px;
    +  line-height: 20px;
    +  float: left;
    +  padding-left: 28px;
    +}
    +.menu-icon {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  left: 2px;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.menu-rightarrow {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  right: 0;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.menu-line {
    +  position: absolute;
    +  left: 26px;
    +  top: 0;
    +  height: 2000px;
    +  font-size: 1px;
    +}
    +.menu-sep {
    +  margin: 3px 0px 3px 25px;
    +  font-size: 1px;
    +}
    +.menu-active {
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.menu-item-disabled {
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +  cursor: default;
    +}
    +.menu-text,
    +.menu-text span {
    +  font-size: 12px;
    +}
    +.menu-shadow {
    +  position: absolute;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +  background: #ccc;
    +  -moz-box-shadow: 2px 2px 3px #cccccc;
    +  -webkit-box-shadow: 2px 2px 3px #cccccc;
    +  box-shadow: 2px 2px 3px #cccccc;
    +  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
    +}
    +.menu-rightarrow {
    +  background: url('images/menu_arrows.png') no-repeat -32px center;
    +}
    +.menu-line {
    +  border-left: 1px solid #ccc;
    +  border-right: 1px solid #fff;
    +}
    +.menu-sep {
    +  border-top: 1px solid #ccc;
    +  border-bottom: 1px solid #fff;
    +}
    +.menu {
    +  background-color: #fafafa;
    +  border-color: #ddd;
    +  color: #444;
    +}
    +.menu-content {
    +  background: #ffffff;
    +}
    +.menu-item {
    +  border-color: transparent;
    +  _border-color: #fafafa;
    +}
    +.menu-active {
    +  border-color: #b7d2ff;
    +  color: #000000;
    +  background: #eaf2ff;
    +}
    +.menu-active-disabled {
    +  border-color: transparent;
    +  background: transparent;
    +  color: #444;
    +}
    +.m-btn-downarrow {
    +  display: inline-block;
    +  width: 16px;
    +  height: 16px;
    +  line-height: 16px;
    +  _vertical-align: middle;
    +}
    +a.m-btn-active {
    +  background-position: bottom right;
    +}
    +a.m-btn-active span.l-btn-left {
    +  background-position: bottom left;
    +}
    +a.m-btn-plain-active {
    +  background: transparent;
    +  padding: 0 5px 0 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.m-btn-downarrow {
    +  background: url('images/menu_arrows.png') no-repeat 2px center;
    +}
    +a.m-btn-plain-active {
    +  border-color: #b7d2ff;
    +  background-color: #eaf2ff;
    +  color: #000000;
    +}
    +.s-btn-downarrow {
    +  display: inline-block;
    +  margin: 0 0 0 4px;
    +  padding: 0 0 0 1px;
    +  width: 14px;
    +  height: 16px;
    +  line-height: 16px;
    +  border-width: 0;
    +  border-style: solid;
    +  _vertical-align: middle;
    +}
    +a.s-btn-active {
    +  background-position: bottom right;
    +}
    +a.s-btn-active span.l-btn-left {
    +  background-position: bottom left;
    +}
    +a.s-btn-plain-active {
    +  background: transparent;
    +  padding: 0 5px 0 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 5px 5px 5px 5px;
    +  -webkit-border-radius: 5px 5px 5px 5px;
    +  border-radius: 5px 5px 5px 5px;
    +}
    +.s-btn-downarrow {
    +  background: url('images/menu_arrows.png') no-repeat 2px center;
    +  border-color: #aac5e7;
    +}
    +a:hover.l-btn .s-btn-downarrow,
    +a.s-btn-active .s-btn-downarrow,
    +a.s-btn-plain-active .s-btn-downarrow {
    +  background-position: 1px center;
    +  padding: 0;
    +  border-width: 0 0 0 1px;
    +}
    +a.s-btn-plain-active {
    +  border-color: #b7d2ff;
    +  background-color: #eaf2ff;
    +  color: #000000;
    +}
    +.messager-body {
    +  padding: 10px;
    +  overflow: hidden;
    +}
    +.messager-button {
    +  text-align: center;
    +  padding-top: 10px;
    +}
    +.messager-icon {
    +  float: left;
    +  width: 32px;
    +  height: 32px;
    +  margin: 0 10px 10px 0;
    +}
    +.messager-error {
    +  background: url('images/messager_icons.png') no-repeat scroll -64px 0;
    +}
    +.messager-info {
    +  background: url('images/messager_icons.png') no-repeat scroll 0 0;
    +}
    +.messager-question {
    +  background: url('images/messager_icons.png') no-repeat scroll -32px 0;
    +}
    +.messager-warning {
    +  background: url('images/messager_icons.png') no-repeat scroll -96px 0;
    +}
    +.messager-progress {
    +  padding: 10px;
    +}
    +.messager-p-msg {
    +  margin-bottom: 5px;
    +}
    +.messager-body .messager-input {
    +  width: 100%;
    +  padding: 1px 0;
    +  border: 1px solid #95B8E7;
    +}
    +.tree {
    +  margin: 0;
    +  padding: 0;
    +  list-style-type: none;
    +}
    +.tree li {
    +  white-space: nowrap;
    +}
    +.tree li ul {
    +  list-style-type: none;
    +  margin: 0;
    +  padding: 0;
    +}
    +.tree-node {
    +  height: 18px;
    +  white-space: nowrap;
    +  cursor: pointer;
    +}
    +.tree-hit {
    +  cursor: pointer;
    +}
    +.tree-expanded,
    +.tree-collapsed,
    +.tree-folder,
    +.tree-file,
    +.tree-checkbox,
    +.tree-indent {
    +  display: inline-block;
    +  width: 16px;
    +  height: 18px;
    +  vertical-align: top;
    +  overflow: hidden;
    +}
    +.tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -18px 0px;
    +}
    +.tree-expanded-hover {
    +  background: url('images/tree_icons.png') no-repeat -50px 0px;
    +}
    +.tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat 0px 0px;
    +}
    +.tree-collapsed-hover {
    +  background: url('images/tree_icons.png') no-repeat -32px 0px;
    +}
    +.tree-lines .tree-expanded,
    +.tree-lines .tree-root-first .tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -144px 0;
    +}
    +.tree-lines .tree-collapsed,
    +.tree-lines .tree-root-first .tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat -128px 0;
    +}
    +.tree-lines .tree-node-last .tree-expanded,
    +.tree-lines .tree-root-one .tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -80px 0;
    +}
    +.tree-lines .tree-node-last .tree-collapsed,
    +.tree-lines .tree-root-one .tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat -64px 0;
    +}
    +.tree-line {
    +  background: url('images/tree_icons.png') no-repeat -176px 0;
    +}
    +.tree-join {
    +  background: url('images/tree_icons.png') no-repeat -192px 0;
    +}
    +.tree-joinbottom {
    +  background: url('images/tree_icons.png') no-repeat -160px 0;
    +}
    +.tree-folder {
    +  background: url('images/tree_icons.png') no-repeat -208px 0;
    +}
    +.tree-folder-open {
    +  background: url('images/tree_icons.png') no-repeat -224px 0;
    +}
    +.tree-file {
    +  background: url('images/tree_icons.png') no-repeat -240px 0;
    +}
    +.tree-loading {
    +  background: url('images/loading.gif') no-repeat center center;
    +}
    +.tree-checkbox0 {
    +  background: url('images/tree_icons.png') no-repeat -208px -18px;
    +}
    +.tree-checkbox1 {
    +  background: url('images/tree_icons.png') no-repeat -224px -18px;
    +}
    +.tree-checkbox2 {
    +  background: url('images/tree_icons.png') no-repeat -240px -18px;
    +}
    +.tree-title {
    +  font-size: 12px;
    +  display: inline-block;
    +  text-decoration: none;
    +  vertical-align: top;
    +  white-space: nowrap;
    +  padding: 0 2px;
    +  height: 18px;
    +  line-height: 18px;
    +}
    +.tree-node-proxy {
    +  font-size: 12px;
    +  line-height: 20px;
    +  padding: 0 2px 0 20px;
    +  border-width: 1px;
    +  border-style: solid;
    +  z-index: 9900000;
    +}
    +.tree-dnd-icon {
    +  display: inline-block;
    +  position: absolute;
    +  width: 16px;
    +  height: 18px;
    +  left: 2px;
    +  top: 50%;
    +  margin-top: -9px;
    +}
    +.tree-dnd-yes {
    +  background: url('images/tree_icons.png') no-repeat -256px 0;
    +}
    +.tree-dnd-no {
    +  background: url('images/tree_icons.png') no-repeat -256px -18px;
    +}
    +.tree-node-top {
    +  border-top: 1px dotted red;
    +}
    +.tree-node-bottom {
    +  border-bottom: 1px dotted red;
    +}
    +.tree-node-append .tree-title {
    +  border: 1px dotted red;
    +}
    +.tree-editor {
    +  border: 1px solid #ccc;
    +  font-size: 12px;
    +  height: 14px !important;
    +  height: 18px;
    +  line-height: 14px;
    +  padding: 1px 2px;
    +  width: 80px;
    +  position: absolute;
    +  top: 0;
    +}
    +.tree-node-proxy {
    +  background-color: #ffffff;
    +  color: #000000;
    +  border-color: #95B8E7;
    +}
    +.tree-node-hover {
    +  background: #eaf2ff;
    +  color: #000000;
    +}
    +.tree-node-selected {
    +  background: #FBEC88;
    +  color: #000000;
    +}
    +.validatebox-tip {
    +  position: absolute;
    +  width: 200px;
    +  height: auto;
    +  display: none;
    +  z-index: 9900000;
    +}
    +.validatebox-tip-content {
    +  display: inline-block;
    +  position: absolute;
    +  top: 0px;
    +  left: 8px;
    +  width: 150px;
    +  border-width: 1px;
    +  border-style: solid;
    +  padding: 3px 5px;
    +  z-index: 9900001;
    +  font-size: 12px;
    +}
    +.validatebox-tip-pointer {
    +  display: inline-block;
    +  width: 8px;
    +  height: 16px;
    +  position: absolute;
    +  left: 1px;
    +  top: 0px;
    +  z-index: 9900002;
    +}
    +.validatebox-tip-left .validatebox-tip-content {
    +  left: auto;
    +  right: 8px;
    +}
    +.validatebox-tip-left .validatebox-tip-pointer {
    +  background-position: -20px center;
    +  left: auto;
    +  right: 1px;
    +}
    +.validatebox-invalid {
    +  background-image: url('images/validatebox_warning.png');
    +  background-repeat: no-repeat;
    +  background-position: right center;
    +  border-color: #ffa8a8;
    +  background-color: #fff3f3;
    +  color: #000;
    +}
    +.validatebox-tip-pointer {
    +  background: url('images/validatebox_arrows.png') no-repeat -4px center;
    +}
    +.validatebox-tip-content {
    +  border-color: #CC9933;
    +  background-color: #FFFFCC;
    +  color: #000;
    +}
    +.plugin_box {
    +    width: 880px; 
    +    height:485px;
    +    margin-left: auto; 
    +    margin-right: auto; 
    +    outline: 0; 
    +    border: 1px solid #a0b3d6; 
    +    font-size: 12px; 
    +    word-wrap: break-word;
    + 	resize:none;
    +    overflow-x: hidden;
    +    overflow-y: auto;
    + 	border-radius:5px;
    + 	-moz-box-shadow: 0 0 6px rgba(0, 100, 255, .45);
    +	-webkit-box-shadow: 0 0 6px rgba(0, 100, 255, .45);
    +	box-shadow: 0 0 6px rgba(0, 100, 255, .45);
    +	border-color: #BEBEBE;
    +	border-width: 2px;
    +	background-color: #F0F0F0;
    +}
    +.shortcut{
    +	margin-left: 5px;
    +	margin-right: 15px;
    +	margin-top: 8px;
    +	height: 62px;
    +	float: right;
    +}
    +.shortcut li{
    +	float: left;
    +	list-style: none;
    +	margin-right: 10px;
    +	cursor: pointer;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/accordion_arrows.png b/src/main/webapp/plug-in/easyui/themes/default/images/accordion_arrows.png
    new file mode 100644
    index 00000000..720835f6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/accordion_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/accordion_collapse.png b/src/main/webapp/plug-in/easyui/themes/default/images/accordion_collapse.png
    new file mode 100644
    index 00000000..1919d8c1
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/accordion_collapse.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/accordion_expand.png b/src/main/webapp/plug-in/easyui/themes/default/images/accordion_expand.png
    new file mode 100644
    index 00000000..20280cc4
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/accordion_expand.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/bg.gif b/src/main/webapp/plug-in/easyui/themes/default/images/bg.gif
    new file mode 100644
    index 00000000..d56be814
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/bg.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/bg.jpg b/src/main/webapp/plug-in/easyui/themes/default/images/bg.jpg
    new file mode 100644
    index 00000000..00b606d6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/bg.jpg differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/blank.gif b/src/main/webapp/plug-in/easyui/themes/default/images/blank.gif
    new file mode 100644
    index 00000000..1d11fa9a
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/blank.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/button_a_bg.gif b/src/main/webapp/plug-in/easyui/themes/default/images/button_a_bg.gif
    new file mode 100644
    index 00000000..2e9b16d0
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/button_a_bg.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/button_plain_hover.png b/src/main/webapp/plug-in/easyui/themes/default/images/button_plain_hover.png
    new file mode 100644
    index 00000000..b074e4ed
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/button_plain_hover.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/button_span_bg.gif b/src/main/webapp/plug-in/easyui/themes/default/images/button_span_bg.gif
    new file mode 100644
    index 00000000..2acabca7
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/button_span_bg.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/calendar_arrows.png b/src/main/webapp/plug-in/easyui/themes/default/images/calendar_arrows.png
    new file mode 100644
    index 00000000..430c4ad6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/calendar_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/calendar_nextmonth.gif b/src/main/webapp/plug-in/easyui/themes/default/images/calendar_nextmonth.gif
    new file mode 100644
    index 00000000..f6a903e7
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/calendar_nextmonth.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/calendar_nextyear.gif b/src/main/webapp/plug-in/easyui/themes/default/images/calendar_nextyear.gif
    new file mode 100644
    index 00000000..4b2e7e0b
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/calendar_nextyear.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/calendar_prevmonth.gif b/src/main/webapp/plug-in/easyui/themes/default/images/calendar_prevmonth.gif
    new file mode 100644
    index 00000000..927325ba
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/calendar_prevmonth.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/calendar_prevyear.gif b/src/main/webapp/plug-in/easyui/themes/default/images/calendar_prevyear.gif
    new file mode 100644
    index 00000000..e8427779
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/calendar_prevyear.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/combo_arrow.gif b/src/main/webapp/plug-in/easyui/themes/default/images/combo_arrow.gif
    new file mode 100644
    index 00000000..99f8ba53
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/combo_arrow.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/combo_arrow.png b/src/main/webapp/plug-in/easyui/themes/default/images/combo_arrow.png
    new file mode 100644
    index 00000000..2e59fb9f
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/combo_arrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_header_bg.gif b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_header_bg.gif
    new file mode 100644
    index 00000000..1cd57cf5
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_header_bg.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_icons.png b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_icons.png
    new file mode 100644
    index 00000000..747ac4d1
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_row_collapse.gif b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_row_collapse.gif
    new file mode 100644
    index 00000000..9e1d56b9
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_row_collapse.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_row_expand.gif b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_row_expand.gif
    new file mode 100644
    index 00000000..1624b066
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_row_expand.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_sort_asc.gif b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_sort_asc.gif
    new file mode 100644
    index 00000000..67a2a4c6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_sort_asc.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_sort_desc.gif b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_sort_desc.gif
    new file mode 100644
    index 00000000..34db47c3
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_sort_desc.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_title_bg.png b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_title_bg.png
    new file mode 100644
    index 00000000..ddf17167
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/datagrid_title_bg.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/datebox_arrow.png b/src/main/webapp/plug-in/easyui/themes/default/images/datebox_arrow.png
    new file mode 100644
    index 00000000..783c8335
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/datebox_arrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/event.gif b/src/main/webapp/plug-in/easyui/themes/default/images/event.gif
    new file mode 100644
    index 00000000..9fb1ba95
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/event.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/layout_arrows.png b/src/main/webapp/plug-in/easyui/themes/default/images/layout_arrows.png
    new file mode 100644
    index 00000000..6f416542
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/layout_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/layout_button_down.gif b/src/main/webapp/plug-in/easyui/themes/default/images/layout_button_down.gif
    new file mode 100644
    index 00000000..dc2d7dbb
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/layout_button_down.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/layout_button_left.gif b/src/main/webapp/plug-in/easyui/themes/default/images/layout_button_left.gif
    new file mode 100644
    index 00000000..f2ac4992
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/layout_button_left.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/layout_button_right.gif b/src/main/webapp/plug-in/easyui/themes/default/images/layout_button_right.gif
    new file mode 100644
    index 00000000..99ff1da2
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/layout_button_right.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/layout_button_up.gif b/src/main/webapp/plug-in/easyui/themes/default/images/layout_button_up.gif
    new file mode 100644
    index 00000000..6bdd3149
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/layout_button_up.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/linkbutton_bg.png b/src/main/webapp/plug-in/easyui/themes/default/images/linkbutton_bg.png
    new file mode 100644
    index 00000000..fc66bd2c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/linkbutton_bg.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/loading.gif b/src/main/webapp/plug-in/easyui/themes/default/images/loading.gif
    new file mode 100644
    index 00000000..68f01d04
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/loading.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/menu.gif b/src/main/webapp/plug-in/easyui/themes/default/images/menu.gif
    new file mode 100644
    index 00000000..30a2c4b6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/menu.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/menu_arrows.png b/src/main/webapp/plug-in/easyui/themes/default/images/menu_arrows.png
    new file mode 100644
    index 00000000..b986842e
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/menu_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/menu_downarrow.png b/src/main/webapp/plug-in/easyui/themes/default/images/menu_downarrow.png
    new file mode 100644
    index 00000000..f03dfee4
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/menu_downarrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/menu_rightarrow.png b/src/main/webapp/plug-in/easyui/themes/default/images/menu_rightarrow.png
    new file mode 100644
    index 00000000..ea4f6602
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/menu_rightarrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/menu_sep.png b/src/main/webapp/plug-in/easyui/themes/default/images/menu_sep.png
    new file mode 100644
    index 00000000..37b07e6c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/menu_sep.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/menu_split_downarrow.png b/src/main/webapp/plug-in/easyui/themes/default/images/menu_split_downarrow.png
    new file mode 100644
    index 00000000..b33a93ff
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/menu_split_downarrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/messager_error.gif b/src/main/webapp/plug-in/easyui/themes/default/images/messager_error.gif
    new file mode 100644
    index 00000000..397b655a
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/messager_error.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/messager_icons.png b/src/main/webapp/plug-in/easyui/themes/default/images/messager_icons.png
    new file mode 100644
    index 00000000..62c18c13
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/messager_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/messager_info.gif b/src/main/webapp/plug-in/easyui/themes/default/images/messager_info.gif
    new file mode 100644
    index 00000000..58281c30
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/messager_info.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/messager_question.gif b/src/main/webapp/plug-in/easyui/themes/default/images/messager_question.gif
    new file mode 100644
    index 00000000..08abd82a
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/messager_question.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/messager_warning.gif b/src/main/webapp/plug-in/easyui/themes/default/images/messager_warning.gif
    new file mode 100644
    index 00000000..27ff98b4
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/messager_warning.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/pagination_first.gif b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_first.gif
    new file mode 100644
    index 00000000..d84f41a9
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_first.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/pagination_icons.png b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_icons.png
    new file mode 100644
    index 00000000..ccf9d038
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/pagination_last.gif b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_last.gif
    new file mode 100644
    index 00000000..3df5c2ba
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_last.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/pagination_load.png b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_load.png
    new file mode 100644
    index 00000000..d65defbc
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_load.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/pagination_loading.gif b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_loading.gif
    new file mode 100644
    index 00000000..68f01d04
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_loading.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/pagination_next.gif b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_next.gif
    new file mode 100644
    index 00000000..96016353
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_next.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/pagination_prev.gif b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_prev.gif
    new file mode 100644
    index 00000000..eb70cf8f
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/pagination_prev.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/panel_loading.gif b/src/main/webapp/plug-in/easyui/themes/default/images/panel_loading.gif
    new file mode 100644
    index 00000000..68f01d04
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/panel_loading.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/panel_title.png b/src/main/webapp/plug-in/easyui/themes/default/images/panel_title.png
    new file mode 100644
    index 00000000..ddf17167
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/panel_title.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/panel_tool_collapse.gif b/src/main/webapp/plug-in/easyui/themes/default/images/panel_tool_collapse.gif
    new file mode 100644
    index 00000000..98e341f7
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/panel_tool_collapse.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/panel_tool_expand.gif b/src/main/webapp/plug-in/easyui/themes/default/images/panel_tool_expand.gif
    new file mode 100644
    index 00000000..d5f8094e
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/panel_tool_expand.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/panel_tools.gif b/src/main/webapp/plug-in/easyui/themes/default/images/panel_tools.gif
    new file mode 100644
    index 00000000..daa0178c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/panel_tools.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/panel_tools.png b/src/main/webapp/plug-in/easyui/themes/default/images/panel_tools.png
    new file mode 100644
    index 00000000..19ecc946
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/panel_tools.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/searchbox_button.png b/src/main/webapp/plug-in/easyui/themes/default/images/searchbox_button.png
    new file mode 100644
    index 00000000..6dd19315
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/searchbox_button.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/slider_handle.png b/src/main/webapp/plug-in/easyui/themes/default/images/slider_handle.png
    new file mode 100644
    index 00000000..b9802bae
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/slider_handle.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/spinner_arrow_down.gif b/src/main/webapp/plug-in/easyui/themes/default/images/spinner_arrow_down.gif
    new file mode 100644
    index 00000000..4bf11c5c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/spinner_arrow_down.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/spinner_arrow_up.gif b/src/main/webapp/plug-in/easyui/themes/default/images/spinner_arrow_up.gif
    new file mode 100644
    index 00000000..6fdb6e55
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/spinner_arrow_up.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/spinner_arrows.png b/src/main/webapp/plug-in/easyui/themes/default/images/spinner_arrows.png
    new file mode 100644
    index 00000000..b68592de
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/spinner_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tabs_active.png b/src/main/webapp/plug-in/easyui/themes/default/images/tabs_active.png
    new file mode 100644
    index 00000000..e568bfb6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tabs_active.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tabs_close.gif b/src/main/webapp/plug-in/easyui/themes/default/images/tabs_close.gif
    new file mode 100644
    index 00000000..2bdd6239
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tabs_close.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tabs_enabled.png b/src/main/webapp/plug-in/easyui/themes/default/images/tabs_enabled.png
    new file mode 100644
    index 00000000..ddf17167
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tabs_enabled.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tabs_icons.png b/src/main/webapp/plug-in/easyui/themes/default/images/tabs_icons.png
    new file mode 100644
    index 00000000..4d29966d
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tabs_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tabs_leftarrow.png b/src/main/webapp/plug-in/easyui/themes/default/images/tabs_leftarrow.png
    new file mode 100644
    index 00000000..18f9cc10
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tabs_leftarrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tabs_rightarrow.png b/src/main/webapp/plug-in/easyui/themes/default/images/tabs_rightarrow.png
    new file mode 100644
    index 00000000..e252606d
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tabs_rightarrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tree_arrows.gif b/src/main/webapp/plug-in/easyui/themes/default/images/tree_arrows.gif
    new file mode 100644
    index 00000000..26834639
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tree_arrows.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tree_checkbox_0.gif b/src/main/webapp/plug-in/easyui/themes/default/images/tree_checkbox_0.gif
    new file mode 100644
    index 00000000..9e00266b
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tree_checkbox_0.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tree_checkbox_1.gif b/src/main/webapp/plug-in/easyui/themes/default/images/tree_checkbox_1.gif
    new file mode 100644
    index 00000000..ad12ced6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tree_checkbox_1.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tree_checkbox_2.gif b/src/main/webapp/plug-in/easyui/themes/default/images/tree_checkbox_2.gif
    new file mode 100644
    index 00000000..12931df5
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tree_checkbox_2.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tree_dnd_no.png b/src/main/webapp/plug-in/easyui/themes/default/images/tree_dnd_no.png
    new file mode 100644
    index 00000000..c73eec24
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tree_dnd_no.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tree_dnd_yes.png b/src/main/webapp/plug-in/easyui/themes/default/images/tree_dnd_yes.png
    new file mode 100644
    index 00000000..362ceeeb
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tree_dnd_yes.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tree_elbow.png b/src/main/webapp/plug-in/easyui/themes/default/images/tree_elbow.png
    new file mode 100644
    index 00000000..df2893e1
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tree_elbow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tree_file.gif b/src/main/webapp/plug-in/easyui/themes/default/images/tree_file.gif
    new file mode 100644
    index 00000000..1af80ce7
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tree_file.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tree_folder.gif b/src/main/webapp/plug-in/easyui/themes/default/images/tree_folder.gif
    new file mode 100644
    index 00000000..20412f7c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tree_folder.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tree_folder_open.gif b/src/main/webapp/plug-in/easyui/themes/default/images/tree_folder_open.gif
    new file mode 100644
    index 00000000..56ba737b
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tree_folder_open.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tree_icons.png b/src/main/webapp/plug-in/easyui/themes/default/images/tree_icons.png
    new file mode 100644
    index 00000000..e9be4f3a
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tree_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/tree_loading.gif b/src/main/webapp/plug-in/easyui/themes/default/images/tree_loading.gif
    new file mode 100644
    index 00000000..68f01d04
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/tree_loading.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/validatebox_arrows.png b/src/main/webapp/plug-in/easyui/themes/default/images/validatebox_arrows.png
    new file mode 100644
    index 00000000..5fe78f7c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/validatebox_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/validatebox_pointer.gif b/src/main/webapp/plug-in/easyui/themes/default/images/validatebox_pointer.gif
    new file mode 100644
    index 00000000..6a74491a
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/validatebox_pointer.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/default/images/validatebox_warning.png b/src/main/webapp/plug-in/easyui/themes/default/images/validatebox_warning.png
    new file mode 100644
    index 00000000..2b3d4f05
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/default/images/validatebox_warning.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icon.css b/src/main/webapp/plug-in/easyui/themes/icon.css
    new file mode 100644
    index 00000000..de0da17b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/icon.css
    @@ -0,0 +1,77 @@
    +.icon-blank{
    +	background:url('icons/blank.gif') no-repeat center center;
    +}
    +.icon-add{
    +	background:url('icons/edit_add.png') no-repeat center center;
    +}
    +.icon-edit{
    +	background:url('icons/pencil.png') no-repeat center center;
    +}
    +.icon-remove{
    +	background:url('icons/edit_remove.png') no-repeat center center;
    +}
    +.icon-save{
    +	background:url('icons/filesave.png') no-repeat center center;
    +}
    +.icon-cut{
    +	background:url('icons/cut.png') no-repeat center center;
    +}
    +.icon-ok{
    +	background:url('icons/ok.png') no-repeat center center;
    +}
    +.icon-no{
    +	background:url('icons/no.png') no-repeat center center;
    +}
    +.icon-cancel{
    +	background:url('icons/cancel.png') no-repeat center center;
    +}
    +.icon-reload{
    +	background:url('icons/reload.png') no-repeat center center;
    +}
    +.icon-search{
    +	background:url('icons/search.png') no-repeat center center;
    +}
    +.icon-print{
    +	background:url('icons/print.png') no-repeat center center;
    +}
    +.icon-help{
    +	background:url('icons/help.png') no-repeat center center;
    +}
    +.icon-undo{
    +	background:url('icons/undo.png') no-repeat center center;
    +}
    +.icon-redo{
    +	background:url('icons/redo.png') no-repeat center center;
    +}
    +.icon-back{
    +	background:url('icons/back.png') no-repeat center center;
    +}
    +.icon-sum{
    +	background:url('icons/sum.png') no-repeat center center;
    +}
    +.icon-tip{
    +	background:url('icons/tip.png') no-repeat center center;
    +}
    +
    +.icon-mini-add{
    +	background:url('icons/mini_add.png') no-repeat center center;
    +}
    +.icon-mini-edit{
    +	background:url('icons/mini_edit.png') no-repeat center center;
    +}
    +.icon-mini-refresh{
    +	background:url('icons/mini_refresh.png') no-repeat center center;
    +}
    +
    +.icon-put{
    +	background:url('icons/basket_put.png') no-repeat center center;
    +}
    +.icon-putout{
    +	background:url('icons/basket_remove.png') no-repeat center center;
    +}
    +.icon-comturn{
    +	background:url('icons/comturn.png') no-repeat center center;
    +}
    +.icon-exit{
    +	background:url('icons/exit.png') no-repeat center center;
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/back.png b/src/main/webapp/plug-in/easyui/themes/icons/back.png
    new file mode 100644
    index 00000000..3fe8b178
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/back.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/bar.png b/src/main/webapp/plug-in/easyui/themes/icons/bar.png
    new file mode 100644
    index 00000000..9051fbc6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/bar.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/basket_put.png b/src/main/webapp/plug-in/easyui/themes/icons/basket_put.png
    new file mode 100644
    index 00000000..be62faaa
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/basket_put.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/basket_remove.png b/src/main/webapp/plug-in/easyui/themes/icons/basket_remove.png
    new file mode 100644
    index 00000000..04dd7fd3
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/basket_remove.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/blank.gif b/src/main/webapp/plug-in/easyui/themes/icons/blank.gif
    new file mode 100644
    index 00000000..1d11fa9a
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/blank.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/cancel.png b/src/main/webapp/plug-in/easyui/themes/icons/cancel.png
    new file mode 100644
    index 00000000..a432b492
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/cancel.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/comturn.png b/src/main/webapp/plug-in/easyui/themes/icons/comturn.png
    new file mode 100644
    index 00000000..b8e743e1
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/comturn.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/cut.png b/src/main/webapp/plug-in/easyui/themes/icons/cut.png
    new file mode 100644
    index 00000000..21fdb4dc
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/cut.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/default.png b/src/main/webapp/plug-in/easyui/themes/icons/default.png
    new file mode 100644
    index 00000000..dc2e9d5f
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/default.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/edit_add.png b/src/main/webapp/plug-in/easyui/themes/icons/edit_add.png
    new file mode 100644
    index 00000000..e9485082
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/edit_add.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/edit_remove.png b/src/main/webapp/plug-in/easyui/themes/icons/edit_remove.png
    new file mode 100644
    index 00000000..d555d921
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/edit_remove.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/exit.png b/src/main/webapp/plug-in/easyui/themes/icons/exit.png
    new file mode 100644
    index 00000000..8d382b77
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/exit.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/filesave.png b/src/main/webapp/plug-in/easyui/themes/icons/filesave.png
    new file mode 100644
    index 00000000..fd0048de
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/filesave.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/help.png b/src/main/webapp/plug-in/easyui/themes/icons/help.png
    new file mode 100644
    index 00000000..28a0f9e5
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/help.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/home.png b/src/main/webapp/plug-in/easyui/themes/icons/home.png
    new file mode 100644
    index 00000000..fed62219
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/home.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/icon21.png b/src/main/webapp/plug-in/easyui/themes/icons/icon21.png
    new file mode 100644
    index 00000000..addd363f
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/icon21.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/image_add.png b/src/main/webapp/plug-in/easyui/themes/icons/image_add.png
    new file mode 100644
    index 00000000..fc5d6139
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/image_add.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/image_edit.png b/src/main/webapp/plug-in/easyui/themes/icons/image_edit.png
    new file mode 100644
    index 00000000..0aa4cc65
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/image_edit.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/line.png b/src/main/webapp/plug-in/easyui/themes/icons/line.png
    new file mode 100644
    index 00000000..85020f32
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/line.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/map.png b/src/main/webapp/plug-in/easyui/themes/icons/map.png
    new file mode 100644
    index 00000000..f90ef25e
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/map.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/message.png b/src/main/webapp/plug-in/easyui/themes/icons/message.png
    new file mode 100644
    index 00000000..39433cf7
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/message.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/mini_add.png b/src/main/webapp/plug-in/easyui/themes/icons/mini_add.png
    new file mode 100644
    index 00000000..fd82b92d
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/mini_add.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/mini_edit.png b/src/main/webapp/plug-in/easyui/themes/icons/mini_edit.png
    new file mode 100644
    index 00000000..db9221a8
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/mini_edit.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/mini_refresh.png b/src/main/webapp/plug-in/easyui/themes/icons/mini_refresh.png
    new file mode 100644
    index 00000000..6cdd0160
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/mini_refresh.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/no.png b/src/main/webapp/plug-in/easyui/themes/icons/no.png
    new file mode 100644
    index 00000000..37a7c749
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/no.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/ok.png b/src/main/webapp/plug-in/easyui/themes/icons/ok.png
    new file mode 100644
    index 00000000..5b0f6a61
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/ok.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/pencil.png b/src/main/webapp/plug-in/easyui/themes/icons/pencil.png
    new file mode 100644
    index 00000000..5b8cc893
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/pencil.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/pie.png b/src/main/webapp/plug-in/easyui/themes/icons/pie.png
    new file mode 100644
    index 00000000..fe00fa05
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/pie.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/print.png b/src/main/webapp/plug-in/easyui/themes/icons/print.png
    new file mode 100644
    index 00000000..fdf67a1e
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/print.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/qianzi.png b/src/main/webapp/plug-in/easyui/themes/icons/qianzi.png
    new file mode 100644
    index 00000000..9e58c87c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/qianzi.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/qm.png b/src/main/webapp/plug-in/easyui/themes/icons/qm.png
    new file mode 100644
    index 00000000..39659792
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/qm.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/redo.png b/src/main/webapp/plug-in/easyui/themes/icons/redo.png
    new file mode 100644
    index 00000000..f1e45cff
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/redo.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/reload.png b/src/main/webapp/plug-in/easyui/themes/icons/reload.png
    new file mode 100644
    index 00000000..f51cab8e
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/reload.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/search.png b/src/main/webapp/plug-in/easyui/themes/icons/search.png
    new file mode 100644
    index 00000000..6dd19315
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/search.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/sum.png b/src/main/webapp/plug-in/easyui/themes/icons/sum.png
    new file mode 100644
    index 00000000..fd7b32e4
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/sum.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/text.png b/src/main/webapp/plug-in/easyui/themes/icons/text.png
    new file mode 100644
    index 00000000..2fbdd692
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/text.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/tip.png b/src/main/webapp/plug-in/easyui/themes/icons/tip.png
    new file mode 100644
    index 00000000..845e1107
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/tip.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/icons/undo.png b/src/main/webapp/plug-in/easyui/themes/icons/undo.png
    new file mode 100644
    index 00000000..6129fa0c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/icons/undo.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/main.css b/src/main/webapp/plug-in/easyui/themes/main.css
    new file mode 100644
    index 00000000..e2103f7b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/main.css
    @@ -0,0 +1,5690 @@
    +@charset "UTF-8";
    +/* CSS Document */
    +body {
    +	font-size: 12px;
    +	font-family: '寰蒋闆呴粦', "瀹嬩綋";
    +	line-height: 180%;
    +	color: #333333;
    +	width: 100%;
    +	background-repeat: repeat-x;
    +	text-align: left;
    +	/*background: url(../images/footerBg.gif);*/
    +}
    +
    +body,img,form,ul,dl,input,fieldset,.clear,dt,dd,dl {
    +	margin: 0px;
    +	padding: 0px;
    +	border: 0px;
    +}
    +
    +select {
    +	padding: 2px;
    +}
    +
    +input {
    +	outline: none;
    +}
    +
    +ul,dl {
    +	list-style-type: none;
    +}
    +
    +h1,h2,h3,h4 {
    +	font-weight: normal;
    +	margin: 0px;
    +	padding: 0px;
    +}
    +
    +.clear {
    +	font-size: 0px;
    +	line-height: 0px;
    +	clear: both;
    +	height: 0px;
    +}
    +
    +.fl {
    +	float: left;
    +	display: inline;
    +}
    +
    +.fr {
    +	float: right;
    +	display: inline;
    +}
    +
    +.fn {
    +	float: none;
    +}
    +
    +.img_bor {
    +	border: 1px #d6d6d6 solid;
    +	padding: 1px;
    +}
    +
    +a {
    +	color: #4287cf;
    +}
    +
    +a:link,a:visited {
    +	text-decoration: none;
    +}
    +
    +a:hover {
    +	color: #fd7742;
    +	text-decoration: none;
    +}
    +
    +.font18 {
    +	font-size: 18px;
    +}
    +
    +.font14 {
    +	font-size: 14px;
    +}
    +
    +.font16 {
    +	font-size: 16px;
    +}
    +
    +.font24 {
    +	font-size: 24px;
    +}
    +
    +.font12 {
    +	font-size: 12px;
    +}
    +
    +.fontB {
    +	font-weight: bold;
    +}
    +
    +.fontRed {
    +	color: #F00;
    +	text-shadow: 0 1px 0 #FFF;
    +}
    +
    +.fontDeepRed {
    +	color: #8e241f;
    +	text-shadow: 0 1px 0 #FFF;
    +}
    +
    +.font999 {
    +	color: #999;
    +	text-shadow: 0 1px 0 #FFF;
    +}
    +
    +.font666 {
    +	color: #666;
    +	text-shadow: 0 1px 0 #FFF;
    +}
    +
    +.font333 {
    +	color: #333;
    +	text-shadow: 0 1px 0 #FFF;
    +}
    +
    +.fontBlack {
    +	color: #000;
    +	text-shadow: 0 1px 0 #FFF;
    +}
    +
    +.fontWhite {
    +	color: #FFF;
    +	text-shadow: 0 -1px 0 #000;
    +}
    +
    +.fontOrange {
    +	color: #fe3800;
    +}
    +
    +.fontGreen {
    +	color: #54b856;
    +}
    +
    +.fontOrange2 {
    +	color: #f29e00;
    +}
    +
    +.fontBlue {
    +	color: #00aeff;
    +}
    +
    +.mr10 {
    +	margin-right: 10px;
    +}
    +
    +.ml10 {
    +	margin-left: 10px;
    +}
    +
    +.mt5 {
    +	margin-top: 5px;
    +}
    +
    +.wf100 {
    +	width: 100%;
    +}
    +
    +.height10 {
    +	height: 10px;
    +	display: block;
    +}
    +
    +.height15 {
    +	height: 15px;
    +	display: block;
    +}
    +
    +/* 鍏叡鏍峰紡 */
    +.header {
    +	width: 100%;
    +	height: 67px;
    +	background: #FFF;
    +	z-index: 100;
    +	position: absolute;
    +}
    +
    +.headerBottom {
    +	width: 100%;
    +	height: 100px;
    +	float: left;
    +}
    +
    +.header .lineOne {
    +	height: 57px;
    +	padding-top: 10px;
    +}
    +
    +.header .logo {
    +	float: left;
    +	width: 120px;
    +}
    +
    +.logoIn {
    +	background: #fff;
    +	float: left;
    +	width: 120px;
    +	height: 33px;
    +}
    +
    +.header .lineOne .logo {
    +	margin:6px 0px 0px 13px;
    +	width:110px;
    +	height: 32px;
    +	background: url(../images/logo1.gif) bottom no-repeat;
    +}
    +
    +.header .lineTwo .logo {
    +	height: 33px;
    +	background: url(../images/logo2.png) top no-repeat;
    +}
    +
    +.lineTwo .logo {
    +	height: 33px;
    +	background: url(../images/logo2.png) top no-repeat;
    +}
    +
    +.header .lineOne .info {
    +	float: right;
    +}
    +
    +.header .lineOne .shopInfo .photo {
    +	float: left;
    +	padding-right: 10px;
    +}
    +
    +.header .lineOne .shopInfo .text {
    +	font-size: 12px;
    +	float: left;
    +}
    +
    +.header .lineOne .shopInfo .text .redBox {
    +	font-size: 12px;
    +	background-color: #eb7070;
    +	border-radius: 3px;
    +	height: 12px;
    +	width: 30px;
    +	text-align: center;
    +	display: inline-block;
    +	line-height: 12px;
    +	color: #FFF;
    +}
    +
    +.header .lineOne .shopInfo .text .redBox:hover {
    +	background-color: #78bf5f;
    +}
    +
    +.header .lineOne .newMemberTop,.header .lineOne .memberInfo,.header .lineOne .shopInfo
    +	{
    +	color: #7c8389;
    +	float: left;
    +	margin-right: 10px;
    +}
    +
    +.header .lineOne .newMemberTop,.header .lineOne .memberInfo {
    +	padding-top: 10px;
    +}
    +
    +.header .lineOne .newMemberTop .icon {
    +	background-image: url(../images/menuIcon.png);
    +	background-position: 0 -85px;
    +	width: 22px;
    +	height: 22px;
    +	float: left;
    +	padding-right: 5px;
    +}
    +
    +.header .lineOne .newMemberTop:hover .icon {
    +	background-image: url(../images/menuIcon.png);
    +	background-position: 0 -117px;
    +}
    +
    +.header .lineOne .newMemberTop div,.header .lineOne .newMemberTop a,.header .lineOne .memberInfo div,.header .lineOne .memberInfo a
    +	{
    +	float: left;
    +	color: #7c8389;
    +}
    +
    +.header .lineOne .newMemberTop a:hover div,.header .lineOne .memberInfo a:hover div
    +	{
    +	color: #fd7742;
    +}
    +
    +.header .lineOne .memberInfo .icon {
    +	background-image: url(../images/menuIcon.png);
    +	background-position: -49px -85px;
    +	width: 22px;
    +	height: 22px;
    +	float: left;
    +	padding-right: 5px;
    +}
    +
    +.memberInfo a:hover .text {
    +	color: #7c8389;
    +}
    +
    +.memberInfo a .arrow {
    +	-webkit-transform: rotate(0deg);
    +	-webkit-transition: -webkit-transform linear .3s;
    +	-o-transition: -webkit-transform linear .3s;
    +	-ms-transition: -webkit-transform linear .3s;
    +	-moz-transition: -webkit-transform linear .3s;
    +	padding: 7px 5px;
    +}
    +
    +.memberInfo a:hover .arrow {
    +	-webkit-transform: rotate(180deg);
    +	-webkit-transition: -webkit-transform linear .3s;
    +	-o-transition: -webkit-transform linear .3s;
    +	-ms-transition: -webkit-transform linear .3s;
    +	-moz-transition: -webkit-transform linear .3s;
    +	padding: 7px 5px;
    +}
    +
    +.MImore {
    +	position: absolute;
    +	border: 1px solid #D7D7D7;
    +	border-width: 0px 1px 1px 1px;
    +	width: 90px;
    +	/*padding-top: 30px;*/
    +	top: 14px;
    +	right: 5px;
    +	z-index: 1001;
    +	box-shadow: 0 2px 0 rgba(0, 0, 0, .2);
    +	margin-top: 25px;
    +}
    +
    +.MImore li {
    +	border-top: 1px solid #D7D7D7;
    +	float: left;
    +	width: 80px;
    +	background: #FFF;
    +	padding: 5px;
    +}
    +
    +.MImore .memberCenter .icon1 {
    +	width: 18px;
    +	height: 18px;
    +	background-image: url(../images/menuIcon.png);
    +	padding-right: 8px;
    +	background-position: -105px -83px;
    +	float: left;
    +}
    +
    +.MImore .memberCenter:hover .icon1 {
    +	background-position: -105px -115px;
    +}
    +
    +.MImore .memberCenter:hover .text,.MImore .changePassword:hover .text,.MImore .exit:hover .text
    +	{
    +	color: #fd7742;
    +}
    +
    +.MImore .changePassword .icon1 {
    +	width: 18px;
    +	height: 18px;
    +	background-image: url(../images/menuIcon.png);
    +	padding-right: 8px;
    +	background-position: -133px -83px;
    +	float: left;
    +}
    +
    +.MImore .changePassword:hover .icon1 {
    +	background-position: -133px -115px;
    +}
    +
    +.MImore .exit .icon1 {
    +	width: 18px;
    +	height: 18px;
    +	background-image: url(../images/menuIcon.png);
    +	padding-right: 8px;
    +	background-position: -160px -83px;
    +	float: left;
    +}
    +
    +.MImore .exit:hover .icon1 {
    +	background-position: -160px -115px;
    +}
    +
    +.lineTwo .tab {
    +	float: left;
    +}
    +
    +.lineTwo .tab ul li {
    +	float: left;
    +	padding-right: 5px;
    +}
    +#leftMenu{
    +	background:#00c0ff;
    +	overflow:hidden;
    +}
    +.lmenu {
    +	width: 110px;
    +	height:483px;
    +	overflow:hidden;
    +	/*background-image: url(../images/newYearBg.jpg);*/
    +}
    +
    +.lmenu ul li {
    +	float: left;
    +	width: 110px;
    +	height: 70px;
    +}
    +
    +.lmenu ul li a .icon {
    +	height: 45px;
    +	width: 110px;
    +	text-align:center;
    +	vertical-align:middle; 
    +	
    +}
    +.lmenu ul li a .icon img{
    +	width:32px;
    +	height:32px;
    +	margin:8px auto 5px;
    +}
    +.lmenu ul li a .text {
    +	height: 18px;
    +	font-size: 16px;
    +	color: #FFF;
    +	text-align: center;
    +	width: 110px;
    +	font-weight: normal;
    +	line-height:18px;
    +}
    +
    +.lmenu ul li a:hover .cover,.menuS .cover {
    +	background: url(../images/menuScover.png) no-repeat scroll -10px top;;
    +	position: absolute;
    +	width: 110px;
    +	height: 70px;
    +}
    +
    +.lmenuTop {
    +	width: 110px;
    +	height: 33px;
    +	background: #FFF;
    +	z-index: 100;
    +}
    +
    +.lmenuPrev,.lmenuNext{
    +	width:110px;
    +	height:22px;
    +	overflow:hidden;
    +}
    +.lmenuPrev a{
    +	display:block;
    +	width:100%;
    +	height:21px;
    +	overflow:hidden;
    +	background:#00c0ff url(../images/left_menu_up.gif) no-repeat center center;
    +	text-indent:-300px;
    +	border-bottom:1px solid #66d9ff;
    +}
    +.lmenuNext a{
    +	display:block;
    +	width:100%;
    +	height:21px;
    +	overflow:hidden;
    +	background:#00c0ff url(../images/left_menu_down.gif) no-repeat center center;
    +	text-indent:-300px;
    +	border-top:1px solid #66d9ff;
    +}
    +.lmenuNext{
    +	position:absolute;
    +	left:0px;
    +	bottom:0px;
    +}
    +.main {
    +	background-color: #ebebeb;
    +	padding: 15px 0px 8px 10px;
    +	margin:0px;
    +}
    +
    +.wellcome {
    +	height: 35px;
    +	line-height: 35PX;
    +}
    +
    +.shadowBoxWhite {
    +	background: #FFF;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
    +	filter: "progid:DXImageTransform.Microsoft.Shadow(color=#AAAAAA,direction=0,strength=0) progid:DXImageTransform.Microsoft.Shadow(color=#CCCCCC,direction=90,strength=3) progid:DXImageTransform.Microsoft.Shadow(color=#888888,direction=180,strength=5) progid:DXImageTransform.Microsoft.Shadow(color=#CCCCCC,direction=270,strength=3)";*/
    +}
    +.order_detail .shadowBoxWhite ,.goods_input .shadowBoxWhite,.member_detail .shadowBoxWhite{
    +	background: #FFF;
    +	box-shadow:none;
    +}
    +.shadowBoxYellow {
    +	background: #fff8be;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
    +	/*filter: "progid:DXImageTransform.Microsoft.Shadow(color=#AAAAAA,direction=0,strength=0) progid:DXImageTransform.Microsoft.Shadow(color=#CCCCCC,direction=90,strength=3) progid:DXImageTransform.Microsoft.Shadow(color=#888888,direction=180,strength=5) progid:DXImageTransform.Microsoft.Shadow(color=#CCCCCC,direction=270,strength=3)";*/
    +}
    +
    +.notice {
    +	width: 300px;
    +	float: right;
    +	font-size: 12px;
    +	margin-bottom: 8px;
    +	height: 27px;
    +}
    +
    +.notice .icon {
    +	background-image: url(../images/menuIcon.png);
    +	background-position: -195px -80px;
    +	width: 27px;
    +	height: 27px;
    +	float: left;
    +}
    +
    +.notice .text a {
    +	color: #fb5240;
    +}
    +
    +.notice .text a:hover {
    +	color: #78bf5f;
    +}
    +
    +.notice .text {
    +	width: 220px;
    +	overflow: hidden;
    +	height: 27px;
    +	float: left;
    +	line-height: 27px;
    +}
    +
    +.notice .more {
    +	float: left;
    +	line-height: 27px;
    +}
    +
    +.notice .more a {
    +	line-height: 27px;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#FFFFFF),
    +		to(#eaeaea));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#FFFFFF),
    +		to(#eaeaea));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#eaeaea));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#eaeaea));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#FFFFFF,
    +		endcolorstr=#eaeaea, gradientType=0);
    +	width: 53px;
    +	height: 27px;
    +	float: left;
    +	text-align: center;
    +	color: #999;
    +	cursor: pointer;
    +}
    +
    +.notice .more a:hover {
    +	color: #fd7742;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#eaeaea),
    +		to(#FFFFFF));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#eaeaea),
    +		to(#FFFFFF));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#eaeaea), to(#FFFFFF));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#eaeaea), to(#FFFFFF));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#eaeaea,
    +		endcolorstr=#FFFFFF, gradientType=0);
    +	cursor: pointer;
    +}
    +
    +.quickLaunch .QL1,.quickLaunch .QL2,.quickLaunch .QL3,.quickLaunch .QL4
    +	{
    +	border-bottom: 1px dashed #d7d7d7;
    +}
    +
    +.quickLaunch .QL1,.quickLaunch .QL2,.quickLaunch .QL3,.quickLaunch .QL5,.quickLaunch .QL6,.quickLaunch .QL7
    +	{
    +	border-right: 1px dashed #d7d7d7;
    +}
    +
    +.quickLaunch td:hover {
    +	background: #eeeeee;
    +	cursor: pointer;
    +}
    +
    +.quickLaunch .icon {
    +	width: 100px;
    +}
    +
    +.quickLaunch .text {
    +	width: 100px;
    +	/*color: #7c8389;*/
    +	padding-top: 15px;
    +}
    +
    +.warning {
    +	float: right;
    +	width: 300px;
    +	height: 310px;
    +}
    +
    +.warning .title {
    +	color: #f5b319;
    +	font-size: 18px;
    +	border-bottom: 1px solid #efe591;
    +	height: 45px;
    +	line-height: 45px;
    +	margin: 0 5px;
    +	width: 290px;
    +	text-indent: 5px;
    +}
    +
    +.warning li {
    +	padding: 10px;
    +	color: #000;
    +}
    +
    +.warning li a {
    +	color: #000;
    +	padding-bottom: 15px;
    +}
    +
    +.warning li a:hover {
    +	color: #fd7742;
    +}
    +
    +.chart .title,.todaySale .title,.contactUs .title,.whiteBox .title{
    +	border-bottom: 1px solid #dfdfdf;
    +    color: #53606b;
    +    font-size: 18px;
    +    height: 36px;
    +    line-height: 36px;
    +    margin: 0 5px;
    +    text-indent: 5px;
    +    font-weight:normal;
    +}
    +#orderbaseform .title,.index_nav{
    +	font-size: 18px;
    +	color: #333;
    +	height:18px;
    +	line-height:18px;
    +	text-align:left;
    +	padding-bottom:10px;
    +	font-weight:normal;
    +	border:none;
    +	margin:0px;
    +	text-indent:0;
    +
    +}
    +.whiteBox .text {
    +	padding: 20px 15px;
    +	text-align: center;
    +}
    +
    +.chart .text {
    +	padding: 20px 10px;
    +	text-align: center;
    +	height: 195px;
    +}
    +
    +.todaySale,.contactUs {
    +	width: 300px;
    +	float: right;
    +}
    +
    +.todaySale .text {
    +	font-size: 12px;
    +	color: #999999;
    +	text-align: center;
    +	width: 100%;
    +	padding: 30px 0 20px 0;
    +}
    +
    +.todaySale .text .num {
    +	font-size: 48px;
    +	line-height: 48px;
    +	color: 00aeff;
    +}
    +
    +.secondFloat {
    +	position: absolute;
    +	left: 110px;
    +	/*top: 33px;*/
    +	border: 2px solid #00c0ff;
    +	border-left:none;
    +	z-index: 99999;
    +	/*background: url(../images/St.png) top left no-repeat;*/
    +	width: 132px;
    +}
    +
    +.second {
    +	background: #f2f2f2;
    +	width: 132px;
    +	float: left;
    +	/*height: 490px;*/
    +}
    +
    +.secondBottom {
    +	width: 132px;
    +	background: url(../images/Sb.png) no-repeat;
    +	height: 5px;
    +	float: left;
    +}
    +
    +.second ul {
    +	float: left;
    +}
    +
    +.second ul li .title {
    +	width:100%;
    +	float: left;
    +	background-color: #FFF;
    +	height: 29px;
    +	border-bottom: 1px solid #e9e9e9;
    +	color: #000;
    +	float: left;
    +	line-height: 29px;
    +	text-indent: 5px;
    +}
    +
    +.second ul li {
    +	float: left;
    +	height: 100%;
    +	width:132px;
    +}
    +
    +.second ul li ul {
    +	background: none;
    +	padding: 5px 0;
    +	float: left;
    +}
    +
    +.second ul li ul li {
    +	background: none;
    +	padding: 0 15px;
    +	float: left;
    +
    +}
    +
    +.second ul li ul li a {
    +	/*color: #7c8389;*/
    +	color: #444444;
    +	width: 100px;
    +	height: 28px;
    +	border-bottom: 1px solid #d5d5d5;
    +	float: left;
    +	background: none;
    +	line-height: 28px;
    +	text-indent: 5px;
    +	overflow:hidden;
    +}
    +
    +.second ul li ul li a:hover {
    +	background: #454545;
    +	color: #FFF;
    +}
    +
    +.secondFloatBig {
    +	width: 280px;
    +}
    +
    +.secondFloatBig .second {
    +	width: 280px;
    +}
    +
    +.secondFloatBig .second ul {
    +	width: 280px;
    +}
    +
    +.secondFloatBig .second ul li {
    +	width: 280px;
    +}
    +
    +.secondFloatBig .second ul li .title {
    +	width: 100%;
    +	float: left;
    +}
    +
    +.secondFloatBig .second ul {
    +	width: 280px;
    +}
    +
    +.secondFloatBig .second ul li ul li {
    +	width: 110px;
    +	padding-bottom: 5px;
    +}
    +
    +.secondFloatBig .secondBottom {
    +	width: 280PX;
    +}
    +
    +.contactUs {
    +	height: 129px;
    +	overflow: hidden;
    +}
    +
    +.contactUs .text ul {
    +	padding: 10px 0px 10px 15px;
    +	float: left;
    +}
    +
    +.contactUs .text ul li {
    +	float: left;
    +	padding-right: 10px;
    +}
    +
    +.QQ,.weibo,.weixin,.mail {
    +	background: url(../images/contactIcon.png);
    +	width: 60px;
    +	height: 60px;
    +	display: block;
    +}
    +
    +.QQ {
    +	background-position: 0 0;
    +}
    +
    +.QQ:hover {
    +	background-position: 0 -70px;
    +}
    +
    +.weibo {
    +	background-position: -67px 0;
    +}
    +
    +.weibo:hover {
    +	background-position: -67px -70px;
    +}
    +
    +.weixin {
    +	background-position: -136px 0;
    +}
    +
    +.weixin:hover {
    +	background-position: -136px -70px;
    +}
    +
    +.mail {
    +	background-position: -206px 0;
    +}
    +
    +.mail:hover {
    +	background-position: -206px -70px;
    +}
    +
    +.footer {
    +	border-top: 1px solid #cfcfcf;
    +	color: #999;
    +	margin-top: 15px;
    +	padding-top: 10px;
    +}
    +
    +.footer .fr {
    +	text-align: right;
    +}
    +
    +/* 鍐呭椤 */
    +.button ,a.l-btn span.l-btn-left {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #f7f7f7;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f7f7f7),
    +		to(#f2f2f2));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f7f7f7),
    +		to(#f2f2f2));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f7f7f7), to(#f2f2f2));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f7f7f7), to(#f2f2f2));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f7f7f7,
    +		endcolorstr=#f2f2f2, gradientType=0);
    +	height: 28px;
    +	padding: 0 20px;
    +	cursor: pointer;
    +	line-height: 28px;
    +	display: inline-block;
    +	color: #666666;
    +	margin-right:5px;
    +	
    +}
    +a.l-btn span.l-btn-left .icon-ok{
    +	background-image:none;
    +}
    +
    +.button:hover,a.l-btn:hover span.l-btn-left {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #FFFFFF;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#FFFFFF),
    +		to(#f2f2f2));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#FFFFFF),
    +		to(#f2f2f2));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#f2f2f2));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#f2f2f2));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#FFFFFF,
    +		endcolorstr=#f2f2f2, gradientType=0);
    +	color: #666666;
    +	cursor: pointer;
    +}
    +
    +.button:active {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #f2f2f2;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2),
    +		to(#FFFFFF));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f2f2f2),
    +		to(#FFFFFF));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#FFFFFF));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#FFFFFF));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f2f2f2,
    +		endcolorstr=#FFFFFF, gradientType=0);
    +	color: #666666;
    +	cursor: pointer;
    +}
    +
    +.button1 {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #f7f7f7;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f7f7f7),
    +		to(#f2f2f2));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f7f7f7),
    +		to(#f2f2f2));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f7f7f7), to(#f2f2f2));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f7f7f7), to(#f2f2f2));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f7f7f7,
    +		endcolorstr=#f2f2f2, gradientType=0);
    +	height: 28px;
    +	padding: 0 20px;
    +	cursor: pointer;
    +	line-height: 28px;
    +	display: inline-block;
    +	color: #666666;
    +}
    +
    +.button1:hover {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #FFFFFF;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#FFFFFF),
    +		to(#f2f2f2));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#FFFFFF),
    +		to(#f2f2f2));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#f2f2f2));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#f2f2f2));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#FFFFFF,
    +		endcolorstr=#f2f2f2, gradientType=0);
    +	color: #666666;
    +	cursor: pointer;
    +}
    +
    +.button1:active {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #f2f2f2;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2),
    +		to(#FFFFFF));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f2f2f2),
    +		to(#FFFFFF));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#FFFFFF));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#FFFFFF));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f2f2f2,
    +		endcolorstr=#FFFFFF, gradientType=0);
    +	color: #666666;
    +	cursor: pointer;
    +}
    +
    +.blueButton {
    +	border: 1px solid #2f9df9;
    +	border-radius: 3px;
    +	background-color: #39befb;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#39befb),
    +		to(#2091fc));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#39befb),
    +		to(#2091fc));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#39befb), to(#2091fc));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#39befb), to(#2091fc));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#39befb,
    +		endcolorstr=#2091fc, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.blueButton:hover {
    +	border: 1px solid #2091fc;
    +	background-color: #6ecdff;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#6ecdff),
    +		to(#2091fc));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#6ecdff),
    +		to(#2091fc));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#6ecdff), to(#2091fc));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#6ecdff), to(#2091fc));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#6ecdff,
    +		endcolorstr=#2091fc, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.blueButton:active {
    +	border: 1px solid #2091fc;
    +	background-color: #2091fc;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#2091fc),
    +		to(#6ecdff));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#2091fc),
    +		to(#6ecdff));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#2091fc), to(#6ecdff));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#2091fc), to(#6ecdff));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#2091fc,
    +		endcolorstr=#6ecdff, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.greyButtonNoAction {
    +	border-radius: 3px;
    +	border: 1px solid #d1d1d1;
    +	background-color: #e6e6e8;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f3f3f3,
    +		endcolorstr=#e6e6e8, gradientType=0);
    +	color: #B9B9B9;
    +	width: 280px;
    +	height: 57px;
    +	display: inline-block;
    +	text-align: center;
    +	line-height: 57px;
    +	font-size: 16px;
    +}
    +
    +.greyButtonNoAction:hover {
    +	border-radius: 3px;
    +	border: 1px solid #d1d1d1;
    +	background-color: #e6e6e8;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f3f3f3,
    +		endcolorstr=#e6e6e8, gradientType=0);
    +	color: #B9B9B9;
    +	cursor: default;
    +}
    +
    +.redButton {
    +	border: 1px solid #fc5f4a;
    +	border-radius: 3px;
    +	background-color: #fd765c;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#fd765c),
    +		to(#fc5f4a));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#fd765c),
    +		to(#fc5f4a));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#fd765c), to(#fc5f4a));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#fd765c), to(#fc5f4a));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#fd765c,
    +		endcolorstr=#fc5f4a, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.redButton:hover {
    +	border: 1px solid #fc5f4a;
    +	background-color: #ffaa9a;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#ffaa9a),
    +		to(#fc5f4a));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#ffaa9a),
    +		to(#fc5f4a));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#ffaa9a), to(#fc5f4a));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#ffaa9a), to(#fc5f4a));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#ffaa9a,
    +		endcolorstr=#fc5f4a, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.redButton:active {
    +	border: 1px solid #fc5f4a;
    +	background-color: #fc5f4a;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#fc5f4a),
    +		to(#ffaa9a));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#fc5f4a),
    +		to(#ffaa9a));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#fc5f4a), to(#ffaa9a));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#fc5f4a), to(#ffaa9a));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#fc5f4a,
    +		endcolorstr=#ffaa9a, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.greenButton {
    +	border: 1px solid #7dc855;
    +	border-radius: 3px;
    +	background-color: #9bda6a;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#9bda6a),
    +		to(#7dc855));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#9bda6a),
    +		to(#7dc855));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#9bda6a), to(#7dc855));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#9bda6a), to(#7dc855));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#9bda6a,
    +		endcolorstr=#7dc855, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.greenButton:hover {
    +	border: 1px solid #7dc855;
    +	background-color: #b5eb8d;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#b5eb8d),
    +		to(#7dc855));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#b5eb8d),
    +		to(#7dc855));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#b5eb8d), to(#7dc855));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#b5eb8d), to(#7dc855));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#b5eb8d,
    +		endcolorstr=#7dc855, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.greenButton:active {
    +	border: 1px solid #7dc855;
    +	background-color: #7dc855;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#7dc855),
    +		to(#b5eb8d));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#7dc855),
    +		to(#b5eb8d));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#7dc855), to(#b5eb8d));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#7dc855), to(#b5eb8d));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#7dc855,
    +		endcolorstr=#b5eb8d, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.left {
    +	float: left;
    +}
    +
    +.left .button {
    +	margin-right: 5px;
    +}
    +
    +.right {
    +	float: right;
    +}
    +
    +.right .button {
    +	float: left;
    +	margin-left: 5px;
    +}
    +
    +.input_text,.lvPrice,.ipt {
    +	border: 1px solid #D7D7D7;
    +	border-radius: 3PX;
    +	/*height: 14PX;*/
    +	padding: 7px 0 7px 5px;
    +	line-height: 14PX;
    +	font-size: 12px;
    +	display: inline-block;
    +	width:300px;
    +}
    +
    +.input_text:focus,.lvPrice:focus,.ipt:focus {
    +	border: 1px solid #06F;
    +	box-shadow: inset 0 1px 2px rgba(0, 102, 255, 0.3);
    +}
    +
    +.inputText1 {
    +	border: 1px solid #D7D7D7;
    +	border-radius: 3PX;
    +	height: 14PX;
    +	padding: 7px 0;
    +	line-height: 14PX;
    +	padding-left: 5PX;
    +	font-size: 12px;
    +	display: inline-block;
    +}
    +
    +.inputText1:focus {
    +	border: 1px solid #06F;
    +	box-shadow: inset 0 1px 2px rgba(0, 102, 255, 0.3);
    +}
    +
    +.inputSelect {
    +	padding: 4px;
    +	border: 1px solid #D7D7D7;
    +}
    +
    +.searchAdvancedS {
    +	background-color: #fdea7a;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#fdea7a),
    +		to(#fef197));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#fdea7a),
    +		to(#fef197));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#fdea7a), to(#fef197));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#fdea7a), to(#fef197));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#fdea7a,
    +		endcolorstr=#fef197, gradientType=0);
    +}
    +
    +.searchAdvanced {
    +	border: 1px solid #d1d1d1;
    +	box-sizing: border-box;
    +	background: #fffbf4;
    +	float: left;
    +	width: 100%;
    +	margin-top: 10px;
    +	padding: 10px 0 5px 0;
    +	color: #7c8389;
    +}
    +
    +.searchAdvanced .searchAdvanced .inputText {
    +	float: left;
    +}
    +
    +.searchAdvanced div {
    +	float: left;
    +	padding-bottom: 5px;
    +}
    +
    +.searchAdvanced .title {
    +	padding: 0 5px 0 10px;
    +	line-height: 30px;
    +}
    +
    +.data {
    +	background: url(../images/cal.png) no-repeat right #FFF;
    +}
    +
    +.tableDiv {
    +	background: #D7D7D7;
    +}
    +
    +.tableDiv table th {
    +	background-color: #f7f7f7;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff),
    +		to(#f7f7f7));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#ffffff),
    +		to(#f7f7f7));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f7f7f7));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f7f7f7));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#ffffff,
    +		endcolorstr=#f7f7f7, gradientType=0);
    +	font-weight: bold;
    +}
    +
    +.tableDiv table th a {
    +	color: #4287cf;
    +}
    +
    +.tableDiv table th a:hover {
    +	color: #8bbf00;
    +}
    +
    +.tableDiv table tr td {
    +	/*color: #7c8389;*/
    +	white-space: normal;
    +	word-break: break-all;
    +	padding:6px;
    +}
    +
    +.tableDiv table tr:hover td {
    +	background: #f1f1f1;
    +}
    +
    +.copy {
    +	background-position: 0 -29px;
    +}
    +
    +.datagrid-btable a.edit {
    +	background-image: url("icons/icon21.png");
    +    display: inline-block;
    +    height: 23px;
    +    margin: 0 5px;
    +    width: 23px;
    +    float:none;
    +	background-position: -26px -29px;
    +	text-indent:0;
    +}
    +.datagrid-btable .add {
    +	background-image: url("icons/icon21.png");
    +    display: inline-block;
    +    height: 23px;
    +    margin: 0 5px;
    +    width: 23px;
    +	background-position: -34px -169px;
    +}
    +
    +.del,.delete {
    +	background-position: -52px -29px;
    +}
    +
    +.details {
    +	background-position: -52px -86px;
    +}
    +
    +.tableDiv table tr:hover td .copy {
    +	background-position: 0 0px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .edit ,.datagrid-row-over td .edit{
    +	background-position: -26px 0px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .del ,.datagrid-row-over .delete{
    +	background-position: -52px 0px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .add ,.datagrid-row-over .add{
    +	background-position: 0px -170px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .issue ,.datagrid-row-over td .issue{
    +	background-position: -68px -169px;
    +	cursor: pointer;
    +}
    +.tableDiv table tr:hover td .view ,.datagrid-row-over td .view{
    +	background-position: -136px -169px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .details {
    +	background-position: -52px -56px;
    +	cursor: pointer;
    +}
    +
    +.operate,.delete {
    +	margin: 0 5px;
    +	width: 24px;
    +	height: 24px;
    +	display: inline-block;
    +	background-image: url(icons/icon21.png);
    +	line-height:23px;
    +	overflow:visible;
    +}
    +a:hover .delete{
    +	background-position:-52px 0px;
    +}
    +a.issue {
    +	margin: 0 5px;
    +	width: 25px;
    +	height: 24px;
    +	display: inline-block;
    +	background: url(icons/icon21.png) no-repeat scroll -101px -169px;
    +	line-height:23px;
    +	overflow:visible;
    +}
    +
    +a.view {
    +	margin: 0 5px;
    +	width: 25px;
    +	height: 24px;
    +	display: inline-block;
    +	background: url(icons/icon21.png) no-repeat scroll -171px -169px;
    +	line-height:23px;
    +	overflow:visible;
    +}
    +
    +.switchOn {
    +	background: url(icons/icon21.png) -86px 0 no-repeat;
    +	width: 63px;
    +	height: 23px;
    +	display: inline-block;
    +}
    +
    +.switchOff {
    +	background: url(icons/icon21.png) -86px -29px no-repeat;
    +	width: 63px;
    +	height: 23px;
    +	display: inline-block;
    +}
    +
    +.tableDiv table .cancel td {
    +	color: #cccccc;
    +}
    +
    +.tableDiv table .cancel td a {
    +	text-decoration: underline;
    +	color: #cccccc;
    +}
    +
    +.tableDiv table .cancel td a:hover {
    +	color: #fd7742;
    +}
    +
    +.tableDiv table .cancel .cancelIcon {
    +	background: url(icons/icon21.png) no-repeat -158px 0;
    +	width: 30px;
    +	height: 14px;
    +	display: inline-block;
    +}
    +
    +.defaultIcon {
    +	background: url(../images/default.png) no-repeat;
    +	width: 30px;
    +	height: 14px;
    +	display: inline-block;
    +}
    +
    +.masterIcon {
    +	background: url(../images/baseAccount.png) no-repeat;
    +	width: 30px;
    +	height: 14px;
    +	display: inline-block;
    +}
    +
    +.pageArea {
    +	float: right;
    +}
    +
    +.pageArea a:hover {
    +	border-radius: 3px;
    +	background: #34a3db;
    +	color: #FFF;
    +	padding: 5px 8px;
    +	cursor: pointer;
    +}
    +
    +.pageArea a {
    +	border-radius: 3px;
    +	background: #d9d9d9;
    +	color: #000;
    +	padding: 5px 8px;
    +	cursor: pointer;
    +}
    +
    +.pageArea .pageOn,.pageArea .pageOff a:hover {
    +	border-radius: 3px;
    +	background: #34a3db;
    +	color: #FFF;
    +	padding: 5px 8px;
    +	cursor: pointer;
    +}
    +
    +.receipts {
    +	padding: 20px;
    +}
    +
    +.receipts .title {
    +	background: url(../images/line.png) bottom repeat-x;
    +}
    +
    +.receipts .title .text {
    +	color: #454c51;
    +	font-size: 24px;
    +	padding-bottom: 20px;
    +}
    +
    +.weixinPop {
    +	position: relative;
    +	top: -110px;
    +	left: 35px;
    +	width: 110px;
    +	height: 110px;
    +}
    +
    +.Odown {
    +	background: url(../images/icon_sort2.png) no-repeat right;
    +	padding-right: 15px;
    +	display: inline-block;
    +	color: #5f5f58;
    +}
    +
    +.Oup {
    +	background: url(../images/icon_sort.png) no-repeat right;
    +	padding-right: 15px;
    +	display: inline-block;
    +	color: #5f5f58;
    +}
    +
    +.Odown:hover {
    +	background: url(../images/icon_sort2hover.png) no-repeat right;
    +	display: inline-block;
    +	color: #8bbf00;
    +}
    +
    +.Oup:hover {
    +	background: url(../images/icon_sorthover.png) no-repeat right;
    +	padding-right: 15px;
    +	display: inline-block;
    +	color: #8bbf00;
    +}
    +
    +#lastLine:hover td {
    +	background: #FFF;
    +}
    +
    +.receipts {
    +	padding: 20px;
    +	padding-bottom: 80px;
    +}
    +
    +.receipts .title {
    +	background: url(../images/line.png) bottom repeat-x;
    +}
    +
    +.receipts .title .text {
    +	color: #454c51;
    +	font-size: 30px;
    +	line-height: 30px;
    +	padding-bottom: 20px;
    +}
    +
    +.receipts .baseData div div h4 {
    +	float: left;
    +	padding: 0 5px 0 10px;
    +	color: #7c8389;
    +}
    +
    +.receipts .baseData {
    +	display: block;
    +	padding: 10px 0;
    +	margin-top: 5px;
    +}
    +
    +/* .receipts .baseData div div span {
    +            float: left;
    +            padding: 0 5px 0 10px;
    +            color: #7c8389;
    +        }
    +
    +          .receipts .baseData .fl div span, .receipts .baseData .fr div span {
    +            float: left;
    +            line-height: 30px;
    +        }
    +*/
    +.receipts .baseData .fl div,.receipts .baseData .fr div {
    +	float: left;
    +}
    +
    +.receipts .baseData .fl div h4,.receipts .baseData .fr div h4 {
    +	float: left;
    +	line-height: 30px;
    +}
    +
    +.receipts .tableDiv tr th {
    +	background: #FFF;
    +	font-size: 14px;
    +	color: #000;
    +}
    +
    +.receipts .baseData input[type="checkbox"] {
    +	margin-top: 9px;
    +}
    +
    +.tableDiv table tr:hover .receiptsInputText:focus[readonly] {
    +	background: #F1F1F1;
    +	border: 1PX solid #f1f1f1;
    +	text-align: center;
    +}
    +
    +.tableDiv table tr .receiptsInputText:focus[readonly] {
    +	background: #FFFFFF;
    +	border: 1PX solid #FFFFFF;
    +	text-align: center;
    +}
    +
    +.weixinPop {
    +	position: relative;
    +	top: -110px;
    +	left: 35px;
    +	width: 110px;
    +	height: 110px;
    +}
    +
    +.Odown {
    +	background: url(../images/icon_sort2.png) no-repeat right;
    +	padding-right: 15px;
    +	display: inline-block;
    +	color: #5f5f58;
    +}
    +
    +.Oup {
    +	background: url(../images/icon_sort.png) no-repeat right;
    +	padding-right: 15px;
    +	display: inline-block;
    +	color: #5f5f58;
    +}
    +
    +.Odown:hover {
    +	background: url(../images/icon_sort2hover.png) no-repeat right;
    +	display: inline-block;
    +	color: #8bbf00;
    +}
    +
    +.Oup:hover {
    +	background: url(../images/icon_sorthover.png) no-repeat right;
    +	padding-right: 15px;
    +	display: inline-block;
    +	color: #8bbf00;
    +}
    +
    +.receiptsInputText {
    +	width: 95%;
    +	height: 14px;
    +	line-height: 14px;
    +	/*color: #7c8389;*/
    +	border: 1px solid #FFF;
    +	background-color: #FFF;
    +	padding: 5PX 0;
    +	text-indent: 5PX;
    +	border-radius: 3px;
    +	text-align: center;
    +}
    +
    +.receiptsInputText:hover {
    +	border: 1px solid #06F;
    +}
    +
    +.receiptsInputText:focus {
    +	border: 1px solid #06F;
    +}
    +
    +.tableDiv table tr:hover .receiptsInputText[readonly],.tableDiv table tr:hover .receiptsInputText:hover[readonly],.receipts .tableDiv table tr:hover .receiptsInputText:focus[readonly]
    +	{
    +	background: #F1F1F1;
    +	border: 1PX solid #F1F1F1;
    +}
    +
    +.receipts .tableDiv table tr:hover .plusLite {
    +	background: url(icons/icon21.png) no-repeat 0 -56px;
    +	width: 13px;
    +	height: 13px;
    +	display: inline-block;
    +	margin: 0 5px;
    +}
    +
    +.receipts .tableDiv table tr:hover .plusLite:hover {
    +	background: url(icons/icon21.png) no-repeat 0 -73px;
    +}
    +
    +.receipts .tableDiv table tr:hover .delLite {
    +	background: url(icons/icon21.png) no-repeat -20px -56px;
    +	width: 13px;
    +	height: 13px;
    +	display: inline-block;
    +	margin: 0 5px;
    +}
    +
    +.receipts .tableDiv table tr:hover .delLite:hover {
    +	background: url(icons/icon21.png) no-repeat -20px -73px;
    +}
    +
    +.receipts .tableDiv table tr .num {
    +	display: block;
    +}
    +
    +.receipts .tableDiv table tr .actionArea {
    +	display: none;
    +}
    +
    +.receipts .tableDiv table tr:hover .num {
    +	display: none;
    +}
    +
    +.receipts .tableDiv table tr:hover .actionArea {
    +	display: block;
    +}
    +
    +.choseGoods {
    +	border-radius: 3px;
    +	background-color: #36c77b;
    +	color: #FFF;
    +	cursor: pointer;
    +	height: 26px;
    +	line-height: 26px;
    +	padding: 0 10px;
    +	display: inline-block;
    +}
    +
    +.choseGoods:hover {
    +	background: #49dc8f;
    +	color: #FFF;
    +	cursor: pointer;
    +	display: inline-block;
    +}
    +
    +.choseGoods:active {
    +	background: #36c77b;
    +	color: #FFF;
    +	cursor: pointer;
    +	display: inline-block;
    +}
    +
    +.deliver {
    +	border: 1px solid #eeeeee;
    +	background-color: #f8f8f8;
    +	float: left;
    +	width: 100%;
    +	display: block;
    +	margin-top: 5px;
    +}
    +
    +.deliver span {
    +	padding: 0 5px 0 10px;
    +	line-height: 30px;
    +}
    +
    +.deliver input[type=checkbox] {
    +	margin: 8px 0 0 10px;
    +	float: left;
    +}
    +
    +#total td {
    +	background: #fffbf4;
    +}
    +
    +.inputBorder {
    +	border: 1px solid #d7d7d7;
    +	padding: 3px 0 3px 5px;
    +}
    +
    +.bottomButtonArea {
    +	padding: 20px 0;
    +	width: 100%;
    +}
    +
    +.quickAdd {
    +	width: 300px;
    +	float: right;
    +}
    +
    +.quickAdd .title {
    +	color: #f5b319;
    +	font-size: 18px;
    +	border-bottom: 1px solid #efe591;
    +	height: 45px;
    +	line-height: 45px;
    +	margin: 0 5px;
    +	width: 290px;
    +	text-indent: 5px;
    +}
    +
    +.quickAdd .text {
    +	padding: 10px 5px;
    +}
    +
    +.quickAdd input[type=text],.quickAdd textarea {
    +	border: 1px solid #efe591;
    +	width: 100%;
    +}
    +
    +.quickAdd input[type=text]:hover,.quickAdd input[type=text]:focus,.quickAdd textarea:focus,.quickAdd textarea:hover
    +	{
    +	border: 1px solid #F60;
    +}
    +
    +.field-validation-error {
    +	color: #fa0202;
    +	border: 1px solid #fb5240;
    +	text-indent: 30px;
    +	display: inline-block;
    +	background: url(../images/errorIcon.png) no-repeat 5px 2px #fef3f3;
    +	line-height: 27px;
    +	padding: 0 5px;
    +	font-size: 12px;
    +	border-radius: 3px;
    +	position: absolute;
    +	margin-top: -15px;
    +	white-space: nowrap;
    +	z-index: 100;
    +}
    +
    +.input-validation-error {
    +	border: 1px solid #ff0000;
    +}
    +
    +.validation-summary-errors {
    +	display: none;
    +}
    +
    +.errorInfo {
    +	border: 0px solid #000;
    +	position: absolute;
    +	top: 30px;
    +	right: 35%;
    +	width: 30%;
    +	z-index: 10000;
    +	color: #fff;
    +	line-height: 30px;
    +	padding: 0 5px;
    +	background: #fd7742;
    +	text-align: center;
    +	box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
    +	max-height: 95px;
    +	overflow: hidden;
    +	display: none;
    +	font-size: 14px;
    +	border-radius: 3px;
    +}
    +
    +.classify {
    +	width: 250px;
    +	float: left;
    +	overflow-x: auto;
    +}
    +
    +.classify .title {
    +	color: #f5b319;
    +	font-size: 18px;
    +	border-bottom: 1px solid #efe591;
    +	height: 45px;
    +	line-height: 45px;
    +	margin: 0 5px;
    +	width: 240px;
    +	text-indent: 5px;
    +}
    +
    +.classify .text {
    +	padding: 5px;
    +}
    +
    +.plusLite {
    +	background: url(icons/icon21.png) no-repeat 0 -56px;
    +	width: 13px;
    +	height: 13px;
    +	display: inline-block;
    +	margin: 0 5px;
    +	cursor: pointer;
    +}
    +
    +.plusLite:hover {
    +	background: url(icons/icon21.png) no-repeat 0 -73px;
    +}
    +
    +.delLite {
    +	background: url(icons/icon21.png) no-repeat -20px -56px;
    +	width: 13px;
    +	height: 13px;
    +	display: inline-block;
    +	margin: 0 5px;
    +}
    +
    +.delLite:hover {
    +	background: url(icons/icon21.png) no-repeat -20px -73px;
    +}
    +
    +.editLite {
    +	background: url(icons/icon21.png) no-repeat 0 -93px;
    +	width: 13px;
    +	height: 13px;
    +	display: inline-block;
    +	margin: 0 5px;
    +}
    +
    +.editLite:hover {
    +	background: url(icons/icon21.png) no-repeat 0 -110px;
    +}
    +
    +.title .titleButton {
    +	margin-top: 15px;
    +	cursor: pointer;
    +	float: right;
    +}
    +
    +.propertyTable tr td {
    +	background: #F8F8F8;
    +	border-bottom: 1px solid #ececec;
    +	padding: 10px 0;
    +}
    +
    +.propertyTable tr th {
    +	background: #F8F8F8;
    +	border-bottom: 1px solid #ececec;
    +	border-right: 1px solid #ececec;
    +	padding: 10px 0px;
    +	font-size: 14px;
    +}
    +
    +.property .text {
    +	padding: 0px 5px 10px 5px;
    +}
    +
    +.propertyValue {
    +	padding: 5px 10px;
    +	float: left;
    +	margin-left: 10px;
    +	cursor: pointer;
    +}
    +
    +.propertyValue:hover {
    +	background-color: #e6e6e8;
    +	float: left;
    +	display: inline-block;
    +}
    +
    +.propertyValue input[type="radio"] {
    +	margin-right: 5px;
    +}
    +
    +.nodata {
    +	text-align: center;
    +}
    +
    +.nodata .icon {
    +	font-size: 72px;
    +	color: #C9C9C9;
    +	line-height: 100px;
    +}
    +
    +.nodata .noticeText {
    +	font-size: 18px;
    +	color: #999999;
    +}
    +
    +.cancelImg {
    +	position: absolute;
    +	margin-top: 150px;
    +	margin-left: 400px;
    +	background: url(../images/cancel.png) no-repeat;
    +	width: 400px;
    +	height: 300px;
    +}
    +
    +.fontNodata {
    +	font-size: 28px;
    +	color: #bcbdc1;
    +	line-height: 34px;
    +}
    +
    +.returnGoodsIcon {
    +	background: url(../images/return.png) no-repeat;
    +	width: 30px;
    +	height: 14px;
    +	display: inline-block;
    +}
    +
    +.contentTab ul li {
    +	float: left;
    +	padding-right: 10px;
    +	color: #7C8389;
    +    font-size: 13px;
    +    height: 38px;
    +    line-height: 38px;
    +    padding: 0 25px;
    +    cursor:pointer;
    +}
    +
    +
    +.contentTab ul .contentTabS,.contentTab ul .contentTabN:hover,.contentTab .active {
    +	border-top: 3px solid #00aeef;
    +	background: #FFF;
    +	font-weight: bold;
    +	float: left;
    +	cursor: pointer;
    +}
    +
    +.contentTab ul .contentTabN {
    +	border-top: 3px solid #e6e6e8;
    +	float: left;
    +	cursor: pointer;
    +}
    +
    +.right .inputText {
    +	float: left;
    +	margin-left: 5px;
    +}
    +
    +.check {
    +	background-position: -86px -86px;
    +}
    +
    +.tableDiv table tr:hover td .check {
    +	background-position: -86px -56px;
    +	cursor: pointer;
    +}
    +
    +.tips {
    +	cursor: pointer;
    +}
    +
    +.tips .tipsPop {
    +	display: none;
    +	-webkit-transition: opacity ease-out .5;
    +	opacity: 0;
    +	padding: 5px;
    +	color: #666666;
    +}
    +
    +.tips:hover .tipsPop {
    +	-webkit-transition: opacity ease-in .5;
    +	display: block;
    +	opacity: 1;
    +	position: absolute;
    +	background: #FFF;
    +	border: 1px solid #fd7742;
    +	margin-top: -7px;
    +	margin-left: 220px;
    +	*margin-left: -95px;
    +	*margin-top: 25px;
    +}
    +
    +.right span {
    +	line-height: 30px;
    +	color: #7c8389;
    +}
    +
    +.displayMode {
    +	border: 1px solid #D7D7D7;
    +	height: 28px;
    +	background: #FFF;
    +	float: left;
    +	line-height: 30px;
    +	margin: 0 10px 0 5px;
    +}
    +
    +.displayMode a {
    +	width: 15px;
    +	height: 18px;
    +	margin: 6px;
    +	float: left;
    +	cursor: pointer;
    +	background-image: url(plug-in/login/images/icon21.png);
    +	background-repeat: no-repeat;
    +}
    +
    +.displayMode span {
    +	float: left;
    +}
    +
    +.displayMode .DMlist {
    +	background-position: -153px -59px;
    +}
    +
    +.displayMode .DMlist:hover,.displayMode .DMlistS {
    +	background-position: -153px -89px;
    +}
    +
    +.displayMode .DMchart {
    +	background-position: -182px -59px;
    +}
    +
    +.displayMode .DMchart:hover,.displayMode .DMchartS {
    +	background-position: -182px -89px;
    +}
    +
    +.DMchartContent {
    +	width: 410px;
    +	margin: 0 auto;
    +}
    +
    +.DMchartConentIn {
    +	background: url(../images/linebg.png) center repeat-y;
    +	width: 410px;
    +	float: left;
    +}
    +
    +.DMchartContent .list {
    +	padding-top: 60px;
    +}
    +
    +.nowStrock {
    +	background: url(../images/nowStock.png) no-repeat;
    +	width: 157px;
    +	height: 157px;
    +	overflow: hidden;
    +	margin: 0 auto;
    +}
    +
    +.nowStrock .num {
    +	padding: 70px 0 25px 0;
    +	width: 150px;
    +	text-align: center;
    +	color: #7c8389;
    +}
    +
    +.nowStrock .unit {
    +	width: 100px;
    +	margin: 0 auto;
    +	text-align: center;
    +	font-size: 16px;
    +	color: #7c8389;
    +	white-space: nowrap;
    +	overflow: hidden;
    +	text-overflow: ellipsis;
    +}
    +
    +.strockPlus .strockArrow,.strockShort .strockArrow {
    +	width: 54px;
    +}
    +
    +.strockPlus .strockText,.strockShort .strockText {
    +	width: 168px;
    +}
    +
    +.strockPlus .strockText .content,.strockShort .strockText .content {
    +	padding: 10px;
    +}
    +
    +.strockPlus .strockArrow .icon {
    +	background: url(../images/icon_stockPlus.png) no-repeat;
    +	display: inline-block;
    +}
    +
    +.one .strockArrow,.one .strockText {
    +	float: right;
    +}
    +
    +.two .strockArrow,.two .strockText {
    +	float: left;
    +}
    +
    +.one .strockArrow .arrow,.one .strockArrow .icon {
    +	float: right;
    +}
    +
    +.two .strockArrow .arrow,.two .strockArrow .icon {
    +	float: left;
    +}
    +
    +.one .strockArrow .icon {
    +	width: 37px;
    +	height: 43px;
    +}
    +
    +.two .strockArrow .icon {
    +	width: 37px;
    +	height: 43px;
    +}
    +
    +.strockShort .strockArrow .icon {
    +	background: url(../images/icon_stockShort.png) no-repeat;
    +	display: inline-block;
    +}
    +
    +.one {
    +	float: left;
    +	position: relative;
    +	margin: -50px 0 10px -4px;
    +	width: 230px;
    +}
    +
    +.two {
    +	float: right;
    +	position: relative;
    +	margin: -50px -9px 10px 0px;
    +	width: 230px;
    +}
    +
    +.one .strockArrow .arrow {
    +	background: url(../images/arrowR.png) no-repeat;
    +	width: 7px;
    +	height: 23px;
    +	margin-right: 10px;
    +}
    +
    +.two .strockArrow .arrow {
    +	background: url(../images/arrowL.png) no-repeat;
    +	width: 7px;
    +	height: 23px;
    +	margin-left: 10px;
    +}
    +
    +.strockText {
    +	border: 2px solid #e6e6e8;
    +}
    +
    +.strockText .strockData {
    +	background: #e6e6e8;
    +	font-size: 18px;
    +	line-height: 35px;
    +	color: #7c8389;
    +}
    +
    +.noAction table tr:hover td {
    +	background: #FFF;
    +}
    +
    +.tab_pd {
    +	float: left;
    +	border: 1px solid #2c8fff;
    +	border-radius: 3px;
    +	height: 30px;
    +	line-height: 30px;
    +}
    +
    +.tab_pd ul li {
    +	float: left;
    +}
    +
    +.tab_pdN a {
    +	color: #2c8fff;
    +	text-align: center;
    +	width: 120px;
    +	float: left;
    +	height: 30px;
    +}
    +
    +.tab_pdS a,.tab_pdN a:hover {
    +	background: #2c8fff;
    +	color: #FFF;
    +	text-align: center;
    +	width: 120px;
    +	float: left;
    +	height: 30px;
    +}
    +
    +/* 鏇存柊鏂版墜涓婅矾 */
    +.newMember2 {
    +	float: left;
    +}
    +
    +.newMember2 .step {
    +	background: #f8f8f8;
    +	border-bottom: 1px solid #DDD;
    +	padding: 20px 0;
    +	float: left;
    +	width: 100%;
    +}
    +
    +.newMember2 .step ul {
    +	padding-left: 20px;
    +}
    +
    +.newMember2 .step ul li {
    +	float: left;
    +	padding-right: 30px;
    +}
    +
    +.newMember2 .step ul li a {
    +	float: left;
    +}
    +
    +.newMember2 .step ul li a .icon {
    +	margin-right: 5px;
    +}
    +
    +.newMember2 .step ul li .stepN {
    +	font-size: 18px;
    +	color: #999;
    +	text-decoration: underline;
    +}
    +
    +.step ul li a {
    +	cursor: pointer;
    +}
    +
    +.newMember2 .step ul li .stepN .icon {
    +	background: url(../images/stepIcon.png) -30px 0;
    +	height: 22px;
    +	width: 22px;
    +	text-align: center;
    +	color: #FFF;
    +	font-size: 14px;
    +	line-height: 22px;
    +	display: inline-block;
    +}
    +
    +.newMember2 .step ul li .stepS,.newMember2 .step ul li .stepN:hover {
    +	font-size: 18px;
    +	text-decoration: none;
    +	color: #000;
    +}
    +
    +.newMember2 .step ul li .stepS .icon,.newMember2 .step ul li .stepN:hover .icon
    +	{
    +	background: url(../images/stepIcon.png) 0 0;
    +	height: 22px;
    +	width: 22px;
    +	text-align: center;
    +	color: #FFF;
    +	font-size: 14px;
    +	line-height: 22px;
    +	display: inline-block;
    +}
    +
    +.newMember2 .info {
    +	border-bottom: 1px solid #DDD;
    +	background-color: #fefef8;
    +	width: 100%;
    +	font-size: 12px;
    +	text-indent: 20px;
    +	padding: 10px 0;
    +	float: left;
    +}
    +
    +.newMember2 .content {
    +	float: left;
    +	width: 100%;
    +	padding-bottom: 100px;
    +}
    +
    +.newMember2 .content .contentIn {
    +	padding: 20px 20px 0 20px;
    +	float: left;
    +}
    +
    +.newMember2 .content .contentL {
    +	float: left;
    +	width: 330px;
    +}
    +
    +.newMember2 .content .contentL .title,.newMember2 .content .contentR .title
    +	{
    +	font-size: 24px;
    +	color: #000;
    +	line-height: 50px;
    +	display: block;
    +	padding-bottom: 10px;
    +}
    +
    +.newMember2 .metro90 {
    +	width: 90px;
    +	height: 90px;
    +	float: left;
    +	margin-right: 5px;
    +}
    +
    +.newMember2 .metro90 .icon {
    +	width: 90px;
    +	height: 50px;
    +	text-align: center;
    +	padding-top: 15px;
    +}
    +
    +.newMember2 .metro90 .text {
    +	width: 90px;
    +	text-align: center;
    +	color: #FFF;
    +}
    +
    +.newMember2 .content .contentL .buttonArea {
    +	float: left;
    +	width: 100%;
    +}
    +
    +.newMember2 .content .contentR {
    +	float: left;
    +	width: 300px;
    +}
    +
    +.newMember2 .content .contentR .buttonArea {
    +	float: left;
    +	width: 100%;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li {
    +	float: left;
    +	width: 150px;
    +	padding-bottom: 15px;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li a .icon {
    +	background: url(../images/membericon4.png) no-repeat;
    +	width: 30px;
    +	height: 30px;
    +	float: left;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon1 .icon {
    +	background-position: 0 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon1:hover .icon {
    +	background-position: -30px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon2 .icon {
    +	background-position: -60px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon2:hover .icon {
    +	background-position: -90px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon3 .icon {
    +	background-position: -120px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon3:hover .icon {
    +	background-position: -150px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon4 .icon {
    +	background-position: -180px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon4:hover .icon {
    +	background-position: -210px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon5 .icon {
    +	background-position: -240px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon5:hover .icon {
    +	background-position: -270px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon6 .icon {
    +	background-position: -300px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon6:hover .icon {
    +	background-position: -330px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon8 .icon {
    +	background-position: -360px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon8:hover .icon {
    +	background-position: -390px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li a .text {
    +	font-size: 14px;
    +	line-height: 30px;
    +	height: 30px;
    +	float: left;
    +	padding-left: 10px;
    +	color: #666;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li a:hover .text {
    +	color: #F00;
    +}
    +
    +.metro110 {
    +	width: 90px;
    +	height: 110px;
    +	float: left;
    +	margin-right: 5px;
    +}
    +
    +.metro110 .icon {
    +	width: 90px;
    +	height: 60px;
    +	float: left;
    +	padding-top: 20px;
    +	text-align: center;
    +	vertical-align: middle;
    +}
    +
    +.metro110 .text {
    +	width: 90px;
    +	float: left;
    +	text-align: center;
    +	color: #FFF;
    +}
    +
    +.metroCyan,.metroRed2,.metroBlue2,.metroPurple2 {
    +	color: #FFF;
    +	display: block;
    +	vertical-align: bottom;
    +}
    +
    +.metroCyan {
    +	background-color: #43b0a7;
    +}
    +
    +.metroCyan:hover {
    +	background-color: #4fd7cc;
    +}
    +
    +.metroRed2 {
    +	background-color: #fa646b;
    +}
    +
    +.metroRed2:hover {
    +	background-color: #f79fa3;
    +}
    +
    +.metroBlue2 {
    +	background-color: #00bbf1;
    +}
    +
    +.metroBlue2:hover {
    +	background-color: #2fd0ff;
    +}
    +
    +.metroPurple2 {
    +	background-color: #d485f7;
    +}
    +
    +.metroPurple2:hover {
    +	background-color: #e8b5ff;
    +}
    +
    +.newMember2 .blueButtonBig {
    +	background-color: #1c7efb;
    +	width: 280px;
    +	height: 57px;
    +	display: block;
    +	text-align: center;
    +	line-height: 57px;
    +	font-size: 16px;
    +	color: #FFF;
    +}
    +
    +.newMember2 .blueButtonBig:hover {
    +	background-color: #4b98f9;
    +	color: #FFF;
    +}
    +
    +.newMemberList {
    +	padding: 10px;
    +}
    +
    +.newMemberList li {
    +	float: left;
    +	width: 150px;
    +}
    +
    +.newMemberList .title {
    +	font-size: 24px;
    +	padding-bottom: 20px;
    +	float: left;
    +}
    +
    +.newMemberList li a {
    +	float: left;
    +	width: 150px;
    +	padding-bottom: 15px;
    +}
    +
    +.newMemberList li a .icon {
    +	width: 14px;
    +	height: 14px;
    +	float: left;
    +}
    +
    +.newMemberList li a .text {
    +	font-size: 14px;
    +	color: #666;
    +	padding-left: 10px;
    +	float: left;
    +	line-height: 14px;
    +}
    +
    +.newMemberList li a:hover .text {
    +	color: #F00;
    +}
    +
    +.greenM {
    +	background-color: #6cbe4a;
    +}
    +
    +.redM {
    +	background-color: #fa646b;
    +}
    +
    +.purpleM {
    +	background-color: #d485f7;
    +}
    +
    +.cyanM {
    +	background-color: #43b0a7;
    +}
    +
    +.blueM {
    +	background-color: #00bbf1;
    +}
    +
    +.blue2M {
    +	background-color: #1c7efb;
    +}
    +
    +.metroGreen,.metroRed,.metroBlue {
    +	width: 290px;
    +	height: 85px;
    +	color: #FFF;
    +	display: block;
    +	vertical-align: bottom;
    +}
    +
    +.metroGreen {
    +	background-color: #5cb101;
    +}
    +
    +.metroGreen:hover {
    +	background-color: #80d921;
    +}
    +
    +.metroRed {
    +	background-color: #b52b52;
    +}
    +
    +.metroRed:hover {
    +	background-color: #dd3f6c;
    +}
    +
    +.metroBlue {
    +	background-color: #0d4c99;
    +}
    +
    +.metroBlue:hover {
    +	background-color: #3f7bc3;
    +}
    +
    +.bigButton {
    +	font-size: 18px;
    +	padding: 10px 50px;
    +}
    +
    +/* 鐧诲綍淇敼 */
    +#loginContanier {
    +	background: url(../images/blueLine.png) repeat-x 0 107px #fff;
    +}
    +
    +.loginHeader {
    +	height: 107px;
    +	width: 100%;
    +	margin: 0 auto;
    +}
    +
    +.loginHeader .logo {
    +	background: url(../images/logo.jpg) no-repeat 30px 20px;
    +	width: 408px;
    +	height: 92px;
    +	float: left;
    +}
    +
    +.version {
    +	float: right;
    +	margin-top: 40px;
    +	height: 40px;
    +	padding-right: 10px;
    +}
    +
    +.version .android,.version .iOS,.version .weibo,.version .showcase {
    +	background-image: url(../images/loginIcon.png);
    +	background-repeat: no-repeat;
    +	height: 40px;
    +	display: inline-block;
    +	float: left;
    +}
    +
    +.version .android:hover,.version .iOS:hover,.version .weibo:hover,.version .showcase:hover
    +	{
    +	background-image: url(../images/loginIcon.png);
    +	background-repeat: no-repeat;
    +	height: 40px;
    +}
    +
    +.version .android {
    +	background-position: 0 0;
    +	width: 159px;
    +}
    +
    +.version .android:hover {
    +	background-position: 0 -40px;
    +	width: 159px;
    +}
    +
    +.version .iOS {
    +	background-position: -159px 0;
    +	width: 119px;
    +}
    +
    +.version .iOS:hover {
    +	background-position: -159px -40px;
    +	width: 119px;
    +}
    +
    +.version .weibo {
    +	background-position: -278px 0;
    +	width: 110px;
    +}
    +
    +.version .weibo:hover {
    +	background-position: -278px -40px;
    +	width: 110px;
    +}
    +
    +.version .showcase {
    +	background-position: -390px 0;
    +	width: 110px;
    +}
    +
    +.version .showcase:hover {
    +	background-position: -390px -40px;
    +	width: 110px;
    +}
    +
    +.loginBody {
    +	width: 100%;
    +	overflow-x: hidden;
    +}
    +
    +.loginMain {
    +	position: absolute;
    +	height: 530px;
    +	width: 100%;
    +	min-width: 1002px;
    +	top: 107px;
    +}
    +
    +.loginMain ul li {
    +	width: 100%;
    +	height: 530px;
    +	float: left;
    +}
    +
    +.bg0 {
    +	background: url(../images/loginBg4.jpg) no-repeat center;
    +}
    +
    +.bg1 {
    +	background: url(../images/loginBg1.jpg) no-repeat center;
    +}
    +
    +.bg2 {
    +	background: url(../images/loginBg2.jpg) no-repeat center;
    +}
    +
    +.bg3 {
    +	background: url(../images/loginBg3.jpg) no-repeat center;
    +}
    +
    +.bg4 {
    +	background: url(../images/loginBg5.jpg) no-repeat center;
    +}
    +
    +.bg5 {
    +	background: url(../images/loginBg.jpg) no-repeat center;
    +}
    +
    +.loginMainIn {
    +	height: 530px;
    +	margin: 0 auto;
    +	position: relative;
    +	z-index: 10;
    +}
    +
    +.loginForm {
    +	float: right;
    +	background: url(../images/loginFormBg.png) bottom no-repeat;
    +	width: 398px;
    +	height: 379px;
    +	padding-top: 80px;
    +	padding-right: 30px;
    +}
    +
    +.loginForm ul {
    +	float: left;
    +	padding: 30px 0 0 10px;
    +}
    +
    +.loginForm ul li {
    +	float: left;
    +	padding: 10px 0;
    +}
    +
    +.loginForm ul li h1 {
    +	font-size: 18px;
    +	color: #000;
    +	float: left;
    +	width: 100px;
    +	display: inline-block;
    +	line-height: 38px;
    +	text-align: right;
    +}
    +
    +.loginForm ul li h2 {
    +	float: left;
    +	display: inline-block;
    +	width: 230px;
    +}
    +
    +.loginForm ul li h2 .loginInput,.loginForm ul li h2 .passWord {
    +	background: url(../images/loginInput.png);
    +	border: 0px;
    +	height: 16px;
    +	line-height: 16px;
    +	font-size: 16px;
    +	color: #000;
    +	padding: 12px 0 12px 8px;
    +	width: 222px;
    +	display: inline-block;
    +}
    +
    +.loginForm ul li h2 .loginInput2 {
    +	background: url(../images/loginInput2.png);
    +	border: 0px;
    +	height: 16px;
    +	line-height: 16px;
    +	font-size: 16px;
    +	color: #000;
    +	padding: 12px 0 12px 8px;
    +	width: 134px;
    +	float: left;
    +}
    +
    +.loginForm ul li h2 .yzm {
    +	padding: 2px;
    +	float: right;
    +	/*background: url(../images/yzmbg.png);*/
    +	width: 82px;
    +	height: 36px;
    +}
    +
    +.loginForm ul li h2 .passWord .loginInput3 {
    +	border: 0px;
    +	background: none;
    +	float: left;
    +	height: 16px;
    +	line-height: 16px;
    +	color: #000;
    +	font-size: 16px;
    +	width: 150px;
    +}
    +
    +.Off {
    +	background-image: url(../images/loginPassword.png);
    +	width: 62px;
    +	height: 21px;
    +	float: right;
    +	margin-right: 3px;
    +	margin-top: -2px;
    +}
    +
    +.On {
    +	background-image: url(../images/loginPassword.png);
    +	background-position: 0 -21px;
    +	width: 62px;
    +	height: 21px;
    +	float: right;
    +	margin-right: 3px;
    +	margin-top: -2px;
    +}
    +
    +.loginButton {
    +	background: url(../images/loginButton.gif) 0 0;
    +	width: 229px;
    +	height: 44px;
    +	display: inline-block;
    +}
    +
    +.loginButton:hover {
    +	background: url(../images/loginButton.gif) 0 -44px;
    +}
    +
    +.loginButtonRun {
    +	background: url(../images/loginButton.gif) 0 -88px;
    +	width: 229px;
    +	height: 44px;
    +	display: inline-block;
    +}
    +
    +.loginFooter {
    +	width: 1200px;
    +	margin: 20px auto 10px auto;
    +	color: #999;
    +	vertical-align: top;
    +	text-align: center;
    +}
    +
    +.androidDownload {
    +	background: url(../images/downloadBg.png) no-repeat;
    +	width: 312px;
    +	height: 93px;
    +	padding: 20px 0 10px 10px;
    +	position: relative;
    +	z-index: 100;
    +	top: 40px;
    +	left: -120px;
    +}
    +
    +.androidDownload .qr {
    +	float: left;
    +	width: 54px;
    +	height: 54px;
    +	padding: 15px 15px 0 20px;
    +}
    +
    +.androidDownload .text {
    +	padding-top: 10px;
    +}
    +
    +.androidDownload .text span {
    +	font-size: 14px;
    +	color: #999;
    +	float: left;
    +	height: 30px;
    +	line-height: 30px;
    +}
    +
    +.androidDownload .text a {
    +	background-image: url(../images/download.png);
    +	width: 180px;
    +	height: 28px;
    +	float: left;
    +	display: inline-block;
    +}
    +
    +.androidDownload .text a:hover {
    +	background-position: 0 -28px;
    +}
    +
    +.iOSDownload {
    +	top: 40px;
    +	left: -120px;
    +}
    +
    +.artbox {
    +	width: 100%;
    +	background: #FFF;
    +}
    +
    +.article h1 {
    +	color: #333;
    +	font-size: 18px;
    +	text-align: center;
    +	padding: 10px;
    +}
    +
    +.article .info {
    +	color: #999;
    +	text-align: center;
    +	border-bottom: 1px dotted #CCC;
    +	padding-bottom: 10px;
    +}
    +
    +.artbox .article #Content {
    +	padding: 20px;
    +}
    +
    +/* 鏅鸿兘鎻愮ず妗嗘牱寮 20130402 */
    +.autoCompleteBox {
    +	border: 1px solid #D7D7D7;
    +	position: absolute;
    +	overflow-y: auto;
    +	overflow-x: hidden;
    +	display: none;
    +	z-index: 999999;
    +}
    +
    +.autoCompleteBox table {
    +	background: none repeat scroll 0 0 #FFFFFF;
    +	cursor: default;
    +	width: 100%;
    +}
    +
    +.autoCompleteBox table th {
    +	background: #e3f4fe;
    +	border-bottom: 1px solid #d7d7d7;
    +	height: 23px;
    +	font-size: 12px;
    +	padding: 0 4px;
    +	line-height: 23px;
    +	color: #9a6a00;
    +	text-align: left;
    +}
    +
    +.autoCompleteBox table tr {
    +	background: #fcf3f3;
    +}
    +
    +.autoCompleteBox table td {
    +	border-bottom: 1px solid #eee;
    +	height: 23px;
    +	line-height: 23px;
    +	color: #4c4c4b;
    +	padding: 0 4px;
    +	font-size: 12px;
    +	background-color: #FFF;
    +}
    +
    +.autoCompleteBox table td:hover {
    +	background: #f7fff3;
    +}
    +
    +.autoCompleteBox .nowRow {
    +	background: #fbdab0;
    +	border-bottom: 1px solid #e2d2ac;
    +	height: 23px;
    +	line-height: 23px;
    +	color: #4c4c4b;
    +	cursor: pointer;
    +}
    +
    +.autoCompleteBox .key {
    +	color: #F00;
    +	font-weight: bold;
    +}
    +
    +/* 閿欒 */
    +.errorContainer {
    +	width: 94%;
    +	padding: 20px 3%;
    +	min-width: 882px;
    +}
    +
    +.permissionImg {
    +	background: url(../images/nopermission.png) no-repeat center;
    +	width: 300px;
    +	height: 300px;
    +	padding: 160px 30px 80px 30px;
    +	float: left;
    +}
    +
    +.errorImg {
    +	background: url(../images/error.png) no-repeat center;
    +	width: 300px;
    +	height: 300px;
    +	padding: 120px 100px 80px 30px;
    +	float: left;
    +}
    +
    +/* 绯荤粺閲嶇疆 20130425 */
    +.checkBoxArea li {
    +	border-radius: 5px;
    +	background: #efefef;
    +	width: 110px;
    +	height: 40px;
    +	line-height: 40px;
    +	float: left;
    +	margin: 0 10px 10px 0;
    +	font-size: 14px;
    +	padding-left: 10px;
    +}
    +
    +.checkBoxArea li:hover {
    +	background: #d7d7d7;
    +	cursor: default;
    +}
    +
    +.orangeButton2 {
    +	background-color: #f15d2f;
    +	color: #FFF;
    +	height: 27px;
    +	display: inline-block;
    +	line-height: 27px;
    +	padding: 5px 20px;
    +}
    +
    +.orangeButton2:hover {
    +	background-color: #ff7c53;
    +	color: #FFF;
    +	-webkit-transition: ease-in .3s background-color;
    +	-moz-transition: ease-in .3s background-color;
    +	-ms-transition: ease-in .3s background-color;
    +	-o-transition: ease-in .3s background-color;
    +}
    +
    +/* 瀵煎叆鑱旂郴浜 20130426 */
    +.importContact {
    +	padding: 20px;
    +}
    +
    +.importContact .title {
    +	font-size: 24px;
    +	color: #000;
    +	padding-bottom: 20px;
    +}
    +
    +.importContact .tab {
    +	display: block;
    +	width: 100%;
    +	height: 141px;
    +	background-color: #d8d7d7;
    +}
    +
    +.importContact .tab ul {
    +	padding: 5px 5px 0 5px;
    +}
    +
    +.importContact .tab ul .tabN {
    +	float: left;
    +	border: 3px solid #d8d7d7;
    +	border-width: 3px 3px 5px 3px;
    +	height: 128px;
    +	margin-right: 5px;
    +}
    +
    +.importContact .tab ul .tabN:hover,.importContact .tab ul .tabS {
    +	float: left;
    +	border: 3px solid #FFF;
    +	border-width: 3px 3px 5px 3px;
    +	height: 128px;
    +	margin-right: 5px;
    +}
    +
    +.importButtonArea {
    +	border-bottom: 1px dashed #DCDCDC;
    +	padding: 0 0 10px 0;
    +	display: inline-block;
    +	width: 100%;
    +}
    +
    +.gmailLogin {
    +	background: url(../images/gmailLogin.gif);
    +	width: 262px;
    +	height: 55px;
    +	display: inline-block;
    +}
    +
    +.gmailLogin:hover {
    +	background: url(../images/gmailLogin.gif) -262px 0;
    +	height: 55px;
    +}
    +
    +.excelTemp {
    +	background: url(../images/excelTemp.gif);
    +	width: 197px;
    +	height: 55px;
    +	display: inline-block;
    +}
    +
    +.excelTemp:hover {
    +	background: url(../images/excelTemp.gif) -197px 0;
    +	height: 55px;
    +}
    +
    +/* 甯愬绠$悊  */
    +.newAccount {
    +	float: left;
    +	width: 304px;
    +	min-height: 310px;
    +	overflow: hidden;
    +	margin: 0 20px 20px 0;
    +}
    +
    +.newAccount .top {
    +	line-height: 40px;
    +}
    +
    +.newAccount .top .date {
    +	float: left;
    +	color: #ff7800;
    +	width: 80px;
    +	padding-left: 20px;
    +	background: none;
    +}
    +
    +.newAccount .top .state {
    +	float: left;
    +	color: #495056;
    +	width: 194px;
    +	padding-right: 10px;
    +	text-align: right;
    +}
    +
    +.newAccount .title {
    +	width: 284px;
    +	height: 40px;
    +	font-size: 16px;
    +	color: #FFF;
    +	padding-top: 60px;
    +	padding-left: 20px;
    +	overflow: hidden;
    +}
    +
    +.newAccount .content {
    +	padding: 20px 20px 0 20px;
    +	min-height: 150px;
    +}
    +
    +.accountOpen .top .state .stateButton {
    +	background-image: url(../images/accountButton1.png);
    +	margin-top: 5px;
    +	background-position: 0 0;
    +	background-repeat: no-repeat;
    +	width: 68px;
    +	height: 27px;
    +	float: right;
    +}
    +
    +/*.accountOpen:hover .top .state .stateButton {
    +    background-image: url(../images/accountButton1.png);
    +    background-position: -68px 0;
    +}
    +
    +    .accountOpen:hover .top .state .stateButton:hover {
    +        background-image: url(../images/accountButton1.png);
    +        background-position: -136px 0;
    +    }
    +
    +    .accountOpen:hover .top .state .stateButton:active {
    +        background-image: url(../images/accountButton1.png);
    +        background-position: -204px 0;
    +    }
    +*/
    +.newAccount:hover .accountEditArea {
    +	position: absolute;
    +	margin-top: -55px;
    +	margin-left: 248px;
    +}
    +
    +.newAccount:hover .accountEditArea .accountEdit {
    +	background-image: url(../images/accountEdit.png);
    +	width: 56px;
    +	height: 55px;
    +	display: inline-block;
    +}
    +
    +.newAccount:hover .accountEditArea .accountEdit:hover {
    +	background-image: url(../images/accountEdit.png);
    +	background-position: -56px 0;
    +}
    +
    +.accountBeginning .top .state .stateButton {
    +	background-image: url(../images/accountButton2.png);
    +	margin-top: 5px;
    +	background-position: 0 0;
    +	background-repeat: no-repeat;
    +	width: 68px;
    +	height: 27px;
    +	float: right;
    +}
    +
    +.accountBeginning:hover .top .state .stateButton {
    +	background-image: url(../images/accountButton2.png);
    +	background-position: -68px 0;
    +}
    +
    +.accountBeginning:hover .top .state .stateButton:hover {
    +	background-image: url(../images/accountButton2.png);
    +	background-position: -136px 0;
    +}
    +
    +.accountBeginning:hover .top .state .stateButton:active {
    +	background-image: url(../images/accountButton2.png);
    +	background-position: -204px 0;
    +}
    +
    +.newAccount .editTitle {
    +	font-size: 18px;
    +	color: #53606b;
    +	height: 45px;
    +	line-height: 45px;
    +	border-bottom: #dfdfdf 1px solid;
    +	margin: 0 5px;
    +	text-indent: 5px;
    +}
    +/*
    +.accountOpen:hover .top .state .stateButton {
    +    background-image: url(../images/accountButton1.png);
    +    background-position: -68px 0;
    +}*/
    +.newAccount .top .state .carryOver {
    +	background-image: url(../images/accountButton3.png);
    +	margin-top: 5px;
    +	background-position: 0 0;
    +	background-repeat: no-repeat;
    +	width: 68px;
    +	height: 27px;
    +	float: right;
    +	margin-left: 5px;
    +}
    +
    +.newAccount:hover .top .state .carryOver {
    +	background-image: url(../images/accountButton3.png);
    +	background-position: -68px 0;
    +}
    +
    +.newAccount:hover .top .state .carryOver:hover {
    +	background-image: url(../images/accountButton3.png);
    +	background-position: -136px 0;
    +}
    +
    +.newAccount:hover .top .state .carryOver:active {
    +	background-image: url(../images/accountButton3.png);
    +	background-position: -204px 0;
    +}
    +
    +/*loading*/
    +.loading {
    +	height: 50px;
    +	width: 200px;
    +	border-radius: 5PX;
    +	border: 1PX #D7D7D7 solid;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
    +	position: absolute;
    +	display: none;
    +	background: url(../images/loaderc.gif) center no-repeat #FFF;
    +	top: 300px;
    +	left: 45%;
    +	z-index: 10000;
    +}
    +
    +.imploading {
    +	height: 40px;
    +	padding-top: 60px;
    +	width: 400px;
    +	border-radius: 5PX;
    +	border: 1PX #D7D7D7 solid;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
    +	position: absolute;
    +	display: none;
    +	background: url(../images/loaderc.gif) 150px 30px no-repeat #FFF;
    +	top: 150px;
    +	left: 30%;
    +	z-index: 10000;
    +	text-align: center;
    +}
    +
    +/* 鏂伴椈鏍峰紡 */
    +.newsBox .newsList {
    +	border-bottom: 1px solid #e9e9e9;
    +	display: block;
    +	padding: 5px;
    +	margin-bottom: 5px;
    +}
    +
    +.newsBox .newsList:hover {
    +	background-color: #F8F8F8;
    +}
    +
    +.newsBox .unread .readTag {
    +	background: #6cbe4a;
    +	width: 5px;
    +	height: 60px;
    +	float: left;
    +}
    +
    +.newsBox .readTag {
    +	width: 5px;
    +	height: 60px;
    +	float: left;
    +	margin-right: 10px;
    +}
    +
    +.newsBox .newsLink {
    +	display: block;
    +	background: url(../images/newsArrow.png) no-repeat right;
    +}
    +
    +.newsBox .newsLink:hover {
    +	background: url(../images/newsArrow.png) no-repeat right;
    +}
    +
    +.newsBox .newsList .newsTitle {
    +	font-size: 14px;
    +	color: #777;
    +	white-space: nowrap;
    +	overflow: hidden;
    +	text-overflow: ellipsis;
    +	width: 600px;
    +	text-align: left;
    +}
    +
    +.newsBox .unread .newsTitle {
    +	font-size: 14px;
    +	color: #454c51;
    +	white-space: nowrap;
    +	overflow: hidden;
    +	text-overflow: ellipsis;
    +	width: 600px;
    +	text-align: left;
    +}
    +
    +.newsBox .unread .newsDate,.newsBox .newsList .newsDate {
    +	color: #999;
    +	text-align: left;
    +}
    +
    +.newsBox .text {
    +	padding: 5px;
    +}
    +
    +.newsIntro {
    +	font-size: 12px;
    +	color: #777;
    +	text-align: left;
    +}
    +
    +.NLcontent {
    +	height: 60px;
    +}
    +
    +/* 缁忚惀鐘跺喌鍒嗘瀽 */
    +.chartBox {
    +	width: 359px;
    +	height: 470px;
    +	overflow: hidden;
    +	margin: 0 10px 10px 0;
    +	float: left;
    +}
    +
    +.chartBox .title {
    +	font-size: 16px;
    +	padding-left: 15px;
    +	float: left;
    +	font-weight: bold;
    +	line-height: 40px;
    +}
    +
    +.chartBox .chartTab {
    +	float: right;
    +	padding-right: 5px;
    +}
    +
    +.chartBox .chartTab ul li {
    +	float: left;
    +	padding-top: 13px;
    +	margin-left: 1px;
    +}
    +
    +.chartBox .chartTab ul li a {
    +	float: left;
    +	padding: 0 10px;
    +	line-height: 27px;
    +}
    +
    +.chartArea {
    +	clear: both;
    +	float: left;
    +	width: 359px;
    +	text-align: center;
    +}
    +
    +.lineChart {
    +	height: 138px;
    +	text-align: center;
    +	padding: 20px 0;
    +}
    +
    +.lineChartN {
    +	height: 138px;
    +	text-align: center;
    +	padding: 20px 0;
    +	display: none;
    +}
    +
    +.chartDate {
    +	clear: both;
    +	float: left;
    +	padding: 10px 15px;
    +}
    +
    +.chartDate p {
    +	color: #9ea7b3;
    +	width: 359px;
    +}
    +
    +.chartDate p .mNum {
    +	font-size: 48px;
    +	line-height: 48px;
    +}
    +
    +.chartDateLine {
    +	border-top: 1px solid #eaedf1;
    +}
    +
    +.greenChart .title {
    +	color: #1fbba6;
    +}
    +
    +.greenChart .chartTab ul .chartTabN a {
    +	color: #1fbba6;
    +}
    +
    +.greenChart .chartTab ul .chartTabN a:hover,.greenChart .chartTab ul .chartTabS a
    +	{
    +	background: #1fbba6;
    +	color: #FFF;
    +}
    +
    +.greenChart .lineChart {
    +	background: #1fbba6;
    +}
    +
    +.greenChart p .mNum {
    +	color: #1fbba6;
    +}
    +
    +.orangeChart .title {
    +	color: #f27935;
    +}
    +
    +.orangeChart .chartTab ul .chartTabN a {
    +	color: #f27935;
    +}
    +
    +.orangeChart .chartTab ul .chartTabN a:hover,.orangeChart .chartTab ul .chartTabS a
    +	{
    +	background: #f27935;
    +	color: #FFF;
    +}
    +
    +.orangeChart .lineChart {
    +	background: #f27935;
    +}
    +
    +.orangeChart p .mNum {
    +	color: #f27935;
    +}
    +
    +.blueChart .title {
    +	color: #14b9d6;
    +}
    +
    +.blueChart .chartTab ul .chartTabN a {
    +	color: #14b9d6;
    +}
    +
    +.blueChart .chartTab ul .chartTabN a:hover,.blueChart .chartTab ul .chartTabS a
    +	{
    +	background: #14b9d6;
    +	color: #FFF;
    +}
    +
    +.blueChart .lineChart {
    +	background: #14b9d6;
    +}
    +
    +.blueChart p .mNum {
    +	color: #14b9d6;
    +}
    +
    +.chartMore {
    +	display: none;
    +}
    +
    +.viewDetail:hover .chartMore {
    +	display: block;
    +	position: absolute;
    +	background: url(../images/chartMore.png);
    +	width: 56px;
    +	height: 55px;
    +	margin: 415px 0 0 304px; +
    +	margin: 415px 0 0 224px;
    +}
    +
    +.viewDetail:hover .chartMore:hover {
    +	display: block;
    +	position: absolute;
    +	background: url(../images/chartMore.png) -57px 0;
    +	width: 56px;
    +	height: 55px;
    +}
    +
    +.viewDetail .chartMore a {
    +	width: 56px;
    +	height: 55px;
    +	display: block;
    +}
    +
    +.chartBottomTab {
    +	position: absolute;
    +	width: 359px;
    +	height: 120px;
    +	background: #f9fafc;
    +}
    +
    +.chartBottomTab ul li {
    +	width: 119px;
    +	float: left;
    +	height: 120px;
    +}
    +
    +.chartBottomTab ul li a {
    +	cursor: pointer;
    +}
    +
    +.chartBottomTab ul li a .photo {
    +	background: url(../images/chartIcon.png);
    +	width: 60px;
    +	height: 60px;
    +	float: left;
    +	margin: 20px 29px 10px 29px;
    +	cursor: pointer;
    +}
    +
    +.chartBottomTab ul li a .text {
    +	width: 119px;
    +	text-align: center;
    +	color: #5e6d81;
    +	font-size: 14px;
    +	float: left;
    +	cursor: pointer;
    +}
    +
    +.chartBottomTab ul li a:hover .text {
    +	color: #14b9d6;
    +}
    +
    +.chartBottomTab .profitTab1N {
    +	background: #f9fafc;
    +	border-top: 1px solid #eaedf1;
    +}
    +
    +.chartBottomTab .profitTab1S,.chartBottomTab .profitTab1N:hover {
    +	background: #FFF;
    +	border-top: 1px solid #FFF;
    +}
    +
    +.chartBottomTab .profitTab1S .text,.chartBottomTab .profitTab1N:hover .text
    +	{
    +	color: #14b9d6;
    +}
    +
    +.chartBottomTab .profitTab1N .photo {
    +	background-position: -15px -22px;
    +}
    +
    +.chartBottomTab .profitTab1S .photo,.chartBottomTab .profitTab1N:hover .photo
    +	{
    +	background-position: -15px -102px;
    +}
    +
    +.chartBottomTab .profitTab2N {
    +	background: #f9fafc;
    +	border-top: 1px solid #eaedf1;
    +	border-right: 1px solid #eaedf1;
    +	border-left: 1px solid #eaedf1;
    +}
    +
    +.chartBottomTab .profitTab2S,.chartBottomTab .profitTab2N:hover {
    +	background: #FFF;
    +	border-top: 1px solid #FFF;
    +	border-right: 1px solid #eaedf1;
    +	border-left: 1px solid #eaedf1;
    +}
    +
    +.chartBottomTab .profitTab2S .text,.chartBottomTab .profitTab2N:hover .text
    +	{
    +	color: #14b9d6;
    +}
    +
    +.chartBottomTab .profitTab2N .photo {
    +	background-position: -140px -22px;
    +}
    +
    +.chartBottomTab .profitTab2S .photo,.chartBottomTab .profitTab2N:hover .photo
    +	{
    +	background-position: -140px -102px;
    +}
    +
    +.chartBottomTab .profitTab3N {
    +	background: #f9fafc;
    +	border-top: 1px solid #eaedf1;
    +}
    +
    +.chartBottomTab .profitTab3S,.chartBottomTab .profitTab3N:hover {
    +	background: #FFF;
    +	border-top: 1px solid #FFF;
    +}
    +
    +.chartBottomTab .profitTab3S .text,.chartBottomTab .profitTab3N:hover .text
    +	{
    +	color: #14b9d6;
    +}
    +
    +.chartBottomTab .profitTab3N .photo {
    +	background-position: -255px -22px;
    +}
    +
    +.chartBottomTab .profitTab3S .photo,.chartBottomTab .profitTab3N:hover .photo
    +	{
    +	background-position: -255px -102px;
    +}
    +
    +/* 涓氬姟璁剧疆 */
    +.setList ul li {
    +	border-bottom: 1px solid #eeeeee;
    +	width: 96%;
    +	padding: 0 1%;
    +	margin: 0 1%;
    +	background: #FFF;
    +	height: 38px;
    +	line-height: 38px;
    +	color: #666666;
    +}
    +
    +.setList ul li:hover {
    +	background: #F8F8F8;
    +}
    +
    +.uncheck:hover {
    +	background: url(../images/icon2.png) -197px -136px no-repeat;
    +	width: 28px;
    +	height: 28px;
    +	margin-top: 5px;
    +	cursor: pointer;
    +}
    +
    +.checked {
    +	background: url(plug-in/login/images/icon21.png) -36px -136px no-repeat;
    +	width: 28px;
    +	height: 28px;
    +	margin-top: 5px;
    +	cursor: pointer;
    +}
    +
    +.uncheck {
    +	background: url(plug-in/login/images/icon21.png) 0 -136px no-repeat;
    +	width: 28px;
    +	height: 28px;
    +	margin-top: 5px;
    +	cursor: pointer;
    +}
    +
    +/* 鎵撳嵃 */
    +.printButton {
    +	width: 110px;
    +	height: 128px;
    +	float: left;
    +	margin: 0 10px 5px 0;
    +	cursor: pointer;
    +}
    +
    +.A4 {
    +	font-size: 24px;
    +	line-height: 24px;
    +	color: #a9aaaa;
    +	text-align: center;
    +	background: url(../images/printIconA4.png) center no-repeat #FFF;
    +	border: 1px solid #D7D7D7;
    +}
    +
    +.A4 span {
    +	padding-top: 50px;
    +	float: left;
    +	width: 110px;
    +}
    +
    +.others {
    +	background: url(../images/printOthers.png) center no-repeat #FFF;
    +	border: 1px solid #D7D7D7;
    +}
    +
    +.others .title {
    +	text-align: center;
    +	font-size: 14px;
    +	color: #A9aaaa;
    +	width: 110px;
    +	float: left;
    +	padding-top: 40px;
    +	border: none;
    +	text-indent: 0px;
    +	margin: 0px;
    +}
    +
    +.others .text {
    +	text-align: center;
    +	font-size: 10px;
    +	color: #A9AAAA;
    +	width: 110px;
    +	float: left;
    +	text-indent: 0px;
    +	margin: 0px;
    +	padding-left: 0px;
    +	padding-right: 0px;
    +}
    +
    +.printButton:hover {
    +	background-color: #fffded;
    +	color: #000;
    +}
    +
    +.printButton:hover span {
    +	color: #000;
    +}
    +
    +.borderB {
    +	border-bottom: 1px solid #e9e9e9;
    +}
    +
    +.activeSMS {
    +	background: url(../images/activeImg.jpg) bottom right no-repeat #FFF;
    +}
    +
    +.noActionButton,.noActionButton:hover,.noActionButton:active {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #e6e6e8;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f3f3f3,
    +		endcolorstr=#e6e6e8, gradientType=0);
    +	height: 28px;
    +	padding: 0 20px;
    +	cursor: default;
    +	line-height: 28px;
    +	display: inline-block;
    +	color: #B9B9B9;
    +}
    +
    +.SMSwhy:hover .activeTips {
    +	display: block;
    +}
    +
    +.activeTips {
    +	border: 1px solid #D7D7D7;
    +	box-shadow: 0 3px 2px rgba(0, 0, 0, 0.2);
    +	background: #FFF;
    +	padding: 3px;
    +	display: none;
    +	position: absolute;
    +}
    +
    +.loginSwitch {
    +	background: url(../images/loginSwitchBg.png);
    +	width: 123px;
    +	height: 18px;
    +	position: absolute;
    +	padding: 3px 0 0 20px;
    +	top: 600px;
    +	left: 45%;
    +	z-index: 9000;
    +}
    +
    +.loginSwitchOn,.loginSwitchOff:hover {
    +	background: url(../images/loginSwitchOn.png) no-repeat center;
    +	width: 13px;
    +	height: 14px;
    +	display: inline-block;
    +	padding-right: 10px;
    +	cursor: pointer;
    +}
    +
    +.loginSwitchOff {
    +	background: url(../images/loginSwitchOff.png) no-repeat center;
    +	width: 13px;
    +	height: 14px;
    +	display: inline-block;
    +	padding-right: 10px;
    +	cursor: pointer;
    +}
    +
    +.qrBig {
    +	position: absolute;
    +	margin-left: -235px;
    +}
    +
    +.custom {
    +	background: url(../images/printCustom.png) 20px 40px no-repeat #FFF;
    +	border: 1px solid #D7D7D7;
    +}
    +
    +.custom .title {
    +	padding-top: 80px;
    +	text-align: center;
    +	font-size: 14px;
    +	color: #A9AAAA;
    +	width: 110px;
    +	float: left;
    +	border: none;
    +	text-indent: 0px;
    +	margin: 0px;
    +}
    +
    +.textl {
    +	text-align: left;
    +}
    +
    +.textr {
    +	text-align: right;
    +}
    +/* 鏂板鍊熷嚭鍗 */
    +.return {
    +	background-position: -92px -146px;
    +}
    +
    +.sale {
    +	background-position: -126px -146px;
    +}
    +
    +.purchases {
    +	background-position: -156px -146px;
    +}
    +
    +.tableDiv table tr:hover td .return,.hoverTable:hover .return {
    +	background-position: -92px -116px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .sale,.hoverTable:hover .sale {
    +	background-position: -126px -116px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .purchases,.hoverTable:hover .purchases {
    +	background-position: -156px -116px;
    +	cursor: pointer;
    +}
    +
    +.hoverTable {
    +	margin-top: -1px;
    +	word-break: break-all;
    +	white-space: normal;
    +}
    +
    +.hoverTable:hover .copy {
    +	background-position: 0 0px;
    +	cursor: pointer;
    +}
    +
    +.hoverTable:hover .edit {
    +	background-position: -26px 0px;
    +	cursor: pointer;
    +}
    +
    +.hoverTable:hover .del {
    +	background-position: -52px 0px;
    +	cursor: pointer;
    +}
    +
    +.hoverTable:hover .details {
    +	background-position: -52px -56px;
    +	cursor: pointer;
    +}
    +
    +.hoverTable:hover td {
    +	background: #f1f1f1;
    +}
    +
    +.SUp {
    +	background: url(../images/up.png) right no-repeat;
    +	padding-right: 10px;
    +}
    +
    +.SDown {
    +	background: url(../images/down.png) right no-repeat;
    +	padding-right: 10px;
    +}
    +
    +.codeEdit {
    +	background: #FFF;
    +	border: 1px solid #FFF;
    +	height: 14PX;
    +	padding: 4px 0;
    +	line-height: 14PX;
    +	padding-left: 5PX;
    +	color: #999;
    +	text-decoration: underline;
    +	width: 150px;
    +	font-size: 12px;
    +	display: inline-block;
    +}
    +
    +.codeEdit:hover {
    +	border: 1px solid #D7D7D7;
    +	border-radius: 3PX;
    +	height: 14PX;
    +	padding: 4px 0;
    +	text-decoration: none;
    +	line-height: 14PX;
    +	padding-left: 5PX;
    +	font-size: 12px;
    +	display: inline-block;
    +}
    +
    +.codeEdit:focus {
    +	border: 1px solid #06F;
    +	box-shadow: inset 0 1px 2px rgba(0, 102, 255, 0.3);
    +	text-decoration: none;
    +	font-size: 12px;
    +}
    +
    +/* 2013-10-11鏂板搴忓垪鍙 */
    +.sn {
    +	width: 14px;
    +	height: 14px;
    +	background: url(../images/sn.png) no-repeat 2px 2px;
    +	display: inline-block;
    +	position: absolute;
    +	margin-top: 5px;
    +	*margin-left: -5px;
    +}
    +
    +.sn:hover,.snS {
    +	background-position: -15px 2px;
    +}
    +
    +.SnAdd .title {
    +	padding-bottom: 10px;
    +}
    +
    +.SnAdd .tab {
    +	width: 100%;
    +	font-size: 12px;
    +	color: #333;
    +}
    +
    +.SnAdd .tabN {
    +	margin-top: 2px;
    +}
    +
    +.SnAdd .tabS {
    +	background: #FFF;
    +	border-top: 2px solid #6cbe4a;
    +}
    +
    +.SnAdd .tab ul li {
    +	padding: 0 15px;
    +	line-height: 28px;
    +	height: 28px;
    +	margin-right: 10px;
    +	float: left;
    +}
    +
    +.SnAdd .tab ul li a {
    +	color: #333;
    +}
    +
    +.SnAdd .tab ul li a:hover {
    +	color: #fd7742;
    +}
    +
    +.SnAdd .tableDiv table tr .num {
    +	display: block;
    +}
    +
    +.SnAdd .tableDiv table tr .actionArea {
    +	display: none;
    +}
    +
    +.SnAdd .tableDiv table tr:hover .num {
    +	display: none;
    +}
    +
    +.SnAdd .tableDiv table tr:hover .actionArea {
    +	display: block;
    +}
    +
    +.snButtonArea {
    +	background-color: #FFFFFF;
    +	border-top: 1px solid #ccc;
    +	display: block;
    +	margin-top: 10px;
    +	padding: 10px 2%;
    +	float: left;
    +	width: 96%;
    +}
    +
    +.SNtable tr:hover .num {
    +	display: none;
    +}
    +
    +.SNtable tr .right,.SNtable tr .left {
    +	display: none;
    +}
    +
    +.SNtable tr:hover .right,.SNtable tr:hover .left {
    +	display: inline-block;
    +	width: 13px;
    +	height: 13px;
    +	background-image: url(../images/icon2.png);
    +	padding: 5px 5px 3px 3px;
    +}
    +
    +.SNtable tr:hover .right {
    +	background-position: -99px -173px;
    +}
    +
    +.SNtable tr:hover .left {
    +	background-position: -113px -173px;
    +}
    +
    +.SNtable td {
    +	word-break: break-all;
    +}
    +
    +.snList {
    +	border: 1px solid #ccc;
    +	border-width: 0 1px;
    +	box-shadow: 0 3px 2px rgba(0, 0, 0, 0.2);
    +	background: #fffde5;
    +	position: absolute;
    +	max-height: 300px;
    +	width: 200px;
    +	overflow-y: auto;
    +	overflow-x: hidden;
    +	margin-top: 0px;
    +	margin-left: 13px;
    +	*margin-left: 5px;
    +	z-index: 1010;
    +}
    +
    +.snList ul {
    +	width: 200px;
    +}
    +
    +.snList ul li {
    +	border-bottom: 1px solid #DDD;
    +	float: left;
    +	width: 200px;
    +	line-height: 220%;
    +}
    +
    +.snList ul li .snNum {
    +	width: 35px;
    +	text-align: center;
    +	color: #999;
    +	float: left;
    +}
    +
    +.snList ul li .snText {
    +	color: #000;
    +	float: left;
    +	width: 154px;
    +	border-left: 1px solid #dcdcdc;
    +	text-align: left;
    +	padding: 5px;
    +	line-height: 120%;
    +}
    +
    +.snList ul li .delLite {
    +	display: none;
    +	cursor: pointer;
    +}
    +
    +.snList .back {
    +	line-height: 220%;
    +	text-indent: 10px;
    +	width: 100%;
    +	float: left;
    +	padding: 5px 0;
    +}
    +
    +/* 2013-10-31 鏂板搴忓垪鍙风洏鐐 */
    +.AStable tr:hover .num {
    +	display: none;
    +}
    +
    +.AStable tr:hover .delLite {
    +	display: block;
    +}
    +
    +.AStable tr .num {
    +	display: block;
    +}
    +
    +.AStable tr .delLite {
    +	display: none;
    +}
    +
    +.accountStocks,.actualStocks {
    +	width: 430PX;
    +	height: 390px;
    +}
    +
    +.accountStocks .title,.actualStocks .title {
    +	font-size: 14px;
    +	font-weight: bold;
    +	color: #454c51;
    +	border-bottom: 1px solid #e9e9e9;
    +	line-height: 35px;
    +	text-indent: 10px;
    +	display: block;
    +}
    +
    +.ASadd {
    +	padding: 10px;
    +	float: left;
    +	border-top: 1px solid #ccc;
    +}
    +
    +.ASadd .inputText {
    +	width: 329px;
    +	margin-right: 8px;
    +}
    +
    +.actualStocks .tips {
    +	border-bottom: 1px solid #e5e5e5;
    +	color: #454c51;
    +	width: 100%;
    +	height: 38px;
    +	line-height: 38px;
    +	text-indent: 10px;
    +}
    +
    +.actualStocks .inputArea {
    +	padding: 10px;
    +}
    +
    +.actualStocks .buttonArea {
    +	text-align: right;
    +	padding-right: 10px;
    +	padding-bottom: 10px;
    +}
    +
    +.AStable .delSn,.AStable .addSn,.AStable .checkSn,.graphica .delSn,.graphica .addSn,.graphica .checkSn
    +	{
    +	background: url(../images/icon2.png) no-repeat;
    +}
    +
    +.AStable .delSn {
    +	background-position: -147px -195px;
    +	width: 8px;
    +	height: 8px;
    +}
    +
    +.AStable .addSn {
    +	background-position: -170px -195px;
    +	width: 8px;
    +	height: 8px;
    +}
    +
    +.AStable .checkSn {
    +	background-position: -190px -195px;
    +	width: 8px;
    +	height: 8px;
    +}
    +
    +.graphica .delSn {
    +	background-position: -147px -195px;
    +	width: 8px;
    +	height: 8px;
    +	margin-top: 15px;
    +}
    +
    +.graphica .addSn {
    +	background-position: -170px -195px;
    +	width: 8px;
    +	height: 8px;
    +	margin-top: 15px;
    +}
    +
    +.graphica .checkSn {
    +	background-position: -190px -195px;
    +	width: 8px;
    +	height: 8px;
    +	margin-top: 15px;
    +}
    +
    +.graphica {
    +	padding: 10px;
    +	border-top: 1px solid #ccc;
    +	height: 38px;
    +	line-height: 38px;
    +}
    +
    +.graphica div {
    +	padding-right: 10px;
    +}
    +
    +.accountStocks .tips {
    +	border-bottom: 1px solid #e5e5e5;
    +	color: #454c51;
    +	width: 100%;
    +	height: 38px;
    +	line-height: 38px;
    +	text-indent: 10px;
    +}
    +/* 閭婵娲 */
    +.activeEmail {
    +	background: url(../images/mailActive.png) bottom right no-repeat #FFF;
    +}
    +
    +/* 鏍搁攢娆犳 */
    +.tableDiv .price {
    +	display: block;
    +}
    +
    +.tableDiv tr:hover .price {
    +	display: none;
    +}
    +
    +.tableDiv tr .repayment {
    +	display: none;
    +}
    +
    +.tableDiv tr:hover .repayment {
    +	background: #58c56d;
    +	color: #FFF;
    +	display: block;
    +	border-radius: 3px;
    +}
    +
    +.tableDiv tr:hover .repayment:hover {
    +	background: #4be092;
    +	color: #FFF;
    +	display: block;
    +	border-radius: 3px;
    +}
    +
    +.repayment .repayTips {
    +	display: none;
    +	cursor: pointer;
    +	width: 200px;
    +}
    +
    +.repayment:hover .repayTips {
    +	display: inline-block;
    +	border: 1px solid #b0dcbd;
    +	background: #f3fef6;
    +	position: absolute;
    +	cursor: pointer;
    +	margin: -25px 0 0 -40px;
    +	padding: 10px;
    +	color: #666;
    +	width: 200px;
    +	white-space: normal;
    +	word-break: break-all;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, .3);
    +}
    +
    +.repaymentCheck {
    +	background: url(../images/checkGreen.png);
    +	width: 8px;
    +	height: 7px;
    +	display: inline-block;
    +	margin-left: 5px;
    +	cursor: pointer;
    +}
    +
    +.repaymentCheck .repaymentInfo {
    +	display: none;
    +	cursor: pointer;
    +}
    +
    +.repaymentCheck:hover .repaymentInfo {
    +	display: inline-block;
    +	border: 1px solid #b0dcbd;
    +	background: #f3fef6;
    +	position: absolute;
    +	cursor: pointer;
    +	margin: -17px 0 0 0px;
    +	padding: 10px;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, .3);
    +}
    +
    +/* 杞欢鏇存柊 */
    +.update {
    +	top: 150px;
    +	left: 30%;
    +}
    +
    +.update .close {
    +	background: url(../images/updateClose.jpg);
    +	width: 24px;
    +	height: 24px;
    +	cursor: pointer;
    +}
    +
    +.update .close:hover {
    +	background: url(../images/updateClose.jpg) -26px 0;
    +	width: 24px;
    +	height: 24px;
    +}
    +/* 灏忕瓟鐤 */
    +.QA {
    +	cursor: pointer;
    +}
    +
    +.QApop {
    +	display: none;
    +}
    +
    +.QA:hover .QApop {
    +	display: inline-block;
    +	border: 1px solid #b0dcbd;
    +	background: #f3fef6;
    +	position: absolute;
    +	cursor: pointer;
    +	padding: 10px;
    +	color: #666;
    +	width: 200px;
    +	white-space: normal;
    +	word-break: break-all;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, .3);
    +	font-size: 12px;
    +	line-height: 16px;
    +}
    +/* 缁撳瓨 */
    +.balanceTable tr td .moneyLink {
    +	color: #666;
    +}
    +
    +.balanceTable tr:hover td .moneyLink {
    +	color: #4287cf;
    +}
    +
    +.balanceTable tr:hover td .moneyLink:hover {
    +	color: #fd7742;
    +}
    +
    +.balanceTable tr td .month {
    +	display: block;
    +}
    +
    +.balanceTable tr:hover td .month {
    +	display: none;
    +}
    +
    +.balanceTable tr td .reverse {
    +	display: none;
    +}
    +
    +.balanceTable tr:hover td .reverse {
    +	display: block;
    +	background: #fd7742;
    +	border-radius: 3px;
    +	color: #FFF;
    +}
    +
    +.balanceTable tr:hover td .reverse:hover {
    +	display: block;
    +	background: #fea380;
    +	border-radius: 3px;
    +	color: #FFF;
    +}
    +
    +.balanceShort {
    +	float: left;
    +	border-radius: 0 0 3px 3px;
    +	border: 1px solid #ccc;
    +	border-width: 0 1px 1px 1px;
    +	padding: 0 15px;
    +	color: #333;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f3f3f3,
    +		endcolorstr=#e6e6e8, gradientType=0);
    +}
    +
    +/* 鏂板姛鑳芥彁绀 */
    +.newFunction {
    +	width: 7px;
    +	height: 7px;
    +	background-color: #f00;
    +	border: 2px solid #FFFFFF;
    +	box-shadow: 0 2px 0 rgba(0, 0, 0, .3);
    +	border-radius: 5px;
    +	position: absolute;
    +	margin: -40px 0 0 75px;
    +}
    +
    +.newTip {
    +	position: absolute;
    +	width: 170px;
    +	z-index: 1001;
    +}
    +
    +.newTip .angle {
    +	float: left;
    +	background: url(../images/angle.png) no-repeat 20px 0;
    +	height: 4px;
    +	width: 170px;
    +}
    +
    +.newTip .bg {
    +	background: url(../images/newTipBg.png);
    +	border-radius: 2px;
    +	color: #FFF;
    +	font-size: 12px;
    +	padding: 5px;
    +	width: 160px;
    +	float: left;
    +	white-space: normal;
    +	text-align: left;
    +}
    +
    +.newTip .bg .button {
    +	padding: 0px 5px;
    +	height: 19px;
    +	line-height: 19px;
    +	float: right;
    +}
    +
    +/*缁撳瓨 鏃ュ父鏀舵敮 璇︾粏*/
    +.balanceIncomeAndPayDetail {
    +	border: 1px solid #ccc;
    +	background: #fff;
    +	position: absolute;
    +	max-height: 300px;
    +	width: 200px;
    +	overflow-y: auto;
    +	overflow-x: hidden;
    +	margin-top: 0px;
    +	margin-left: 83px;
    +	*margin-left: 5px;
    +	z-index: 1001;
    +}
    +
    +.balanceReceiveAndPayDetail {
    +	border: 1px solid #ccc;
    +	background: #fff;
    +	position: absolute;
    +	max-height: 300px;
    +	width: 240px;
    +	overflow-y: auto;
    +	overflow-x: hidden;
    +	margin-top: -4px;
    +	margin-left: 83px;
    +	*margin-left: 5px;
    +	z-index: 1001;
    +}
    +/*鐩樼偣鏄庣粏 鏍囪瘑鐩樼泩鐩樹簭搴忓垪鍙*/
    +.pyLite {
    +	background: url(../images/py.png) no-repeat;
    +	width: 26px;
    +	height: 14px;
    +	display: inline-block;
    +	margin: 0 5px;
    +}
    +
    +.pkLite {
    +	background: url(../images/pk.png) no-repeat;
    +	width: 26px;
    +	height: 14px;
    +	display: inline-block;
    +	margin: 0 5px;
    +}
    +/* 鏂板鏈熷垵寤鸿处2014-1-15 */
    +.sc .step {
    +	background: url(../images/qcTabBg.png);
    +	height: 58px;
    +	width: 100%;
    +}
    +
    +.sc .step ul {
    +	height: 55px;
    +	float: left;
    +	width: 100%;
    +}
    +
    +.sc .step ul li {
    +	float: left;
    +	height: 55px;
    +	font-size: 16px;
    +	line-height: 55px;
    +	border-right: 1px solid #e9e9e9;
    +}
    +
    +.sc .step ul li .stepN {
    +	color: #999;
    +}
    +
    +.sc .step ul li a {
    +	display: block;
    +	padding: 0 15px 0 10px;
    +}
    +
    +.sc .step ul li a .icon {
    +	width: 30px;
    +	height: 55px;
    +	text-align: center;
    +	margin-right: 5px;
    +	float: left;
    +}
    +
    +.sc .step ul li .stepN .icon {
    +	background: url(../images/circleGrey.png) center no-repeat;
    +}
    +
    +.sc .step ul li .stepS .icon,.sc .step ul li .stepN:hover .icon {
    +	background: url(../images/circleBlue.png) center no-repeat;
    +	color: #2297fc;
    +}
    +
    +.sc .step ul li .stepS .text,.sc .step ul li .stepN:hover .text {
    +	color: #2297fc;
    +}
    +
    +.sc .step ul li .stepN:hover {
    +	background: url(../images/qcTabBgS.png);
    +}
    +
    +.greyBg {
    +	background: url(../images/greyBg2.png);
    +	height: 34px;
    +}
    +
    +.borderR {
    +	border-right: 1px solid #e9e9e9;
    +}
    +
    +.borderT {
    +	border-top: 1px solid #e9e9e9;
    +}
    +
    +.fontDeepBlue {
    +	color: #454c51;
    +}
    +
    +.fontLightBlue {
    +	color: #6e7983;
    +}
    +
    +.wf98 {
    +	width: 98%;
    +}
    +
    +.titleButton {
    +	cursor: pointer;
    +}
    +
    +/* 瀵煎叆鑱旂郴浜 20130426 */
    +.importContact {
    +	padding: 20px;
    +}
    +
    +.importContact .title {
    +	font-size: 24px;
    +	color: #000;
    +	padding-bottom: 20px;
    +}
    +
    +.importContact .tab {
    +	display: block;
    +	width: 100%;
    +	height: 141px;
    +	background-color: #d8d7d7;
    +}
    +
    +.importContact .tab ul {
    +	padding: 5px 5px 0 5px;
    +}
    +
    +.importContact .tab ul .tabN {
    +	float: left;
    +	border: 3px solid #d8d7d7;
    +	border-width: 3px 3px 5px 3px;
    +	height: 128px;
    +	margin-right: 5px;
    +}
    +
    +.importContact .tab ul .tabN:hover,.importContact .tab ul .tabS {
    +	float: left;
    +	border: 3px solid #FFF;
    +	border-width: 3px 3px 5px 3px;
    +	height: 128px;
    +	margin-right: 5px;
    +}
    +
    +.impotButtonArea {
    +	border-bottom: 1px dashed #DCDCDC;
    +	padding: 0 0 10px 0;
    +}
    +
    +.gmailLogin {
    +	background: url(../images/gmailLogin.gif);
    +	width: 262px;
    +	height: 55px;
    +	display: inline-block;
    +}
    +
    +.gmailLogin:hover {
    +	background: url(../images/gmailLogin.gif) -262px 0;
    +	height: 55px;
    +}
    +
    +.excelTemp {
    +	background: url(../images/excelTemp.gif);
    +	width: 197px;
    +	height: 55px;
    +	display: inline-block;
    +}
    +
    +.excelTemp:hover {
    +	background: url(../images/excelTemp.gif) -197px 0;
    +	height: 55px;
    +}
    +
    +.impotButtonArea .step1 {
    +	float: left;
    +}
    +
    +.impotButtonArea .step1 .downloadExcelTemp {
    +	background: url(../images/importExcel1.png);
    +	width: 197px;
    +	height: 156px;
    +	float: left;
    +	display: inline-block;
    +}
    +
    +.impotButtonArea .step1 .downloadExcelTemp:hover {
    +	background: url(../images/importExcel1.png) -197px 0;
    +}
    +
    +.impotButtonArea .step2 {
    +	float: left;
    +	background: url(../images/importExcel2.png);
    +	width: 197px;
    +	height: 156px;
    +	margin-left: 10px;
    +}
    +
    +.impotButtonArea .step2 .text {
    +	width: 145px;
    +	text-align: center;
    +	padding-top: 120px;
    +	float: left;
    +}
    +
    +.impotButtonArea .step3 {
    +	float: left;
    +	background: url(../images/importExcel3.png);
    +	width: 145px;
    +	height: 156px;
    +	margin-left: 10px;
    +}
    +
    +.choseFile {
    +	background: #1d91ff;
    +	color: #FFF;
    +	padding: 10px 20px;
    +}
    +
    +.choseFile:hover {
    +	background: #51a9fd;
    +	color: #FFF;
    +	padding: 10px 20px;
    +}
    +
    +.choseFileArea {
    +	width: 145px;
    +	text-align: center;
    +	float: left;
    +	padding-top: 60px;
    +}
    +
    +.impotButtonArea .step3 .text {
    +	width: 145px;
    +	padding-top: 15px;
    +	text-align: center;
    +	float: left;
    +	line-height: 120%;
    +}
    +
    +.impotButtonArea .step2End {
    +	background: url(../images/step2end.png);
    +	width: 145px;
    +	height: 156px;
    +	margin-left: 10px;
    +	float: left;
    +}
    +
    +.impotButtonArea .step2End .text {
    +	width: 145px;
    +	padding-top: 20px;
    +	text-align: center;
    +	float: left;
    +	line-height: 120%;
    +}
    +
    +.impotButtonArea .step1Outlook {
    +	float: left;
    +	background: url(../images/stepOutLook.png);
    +	width: 197px;
    +	height: 156px;
    +}
    +
    +.importSuccees {
    +	border: 1px solid #feeb9d;
    +	background: #fffbe9;
    +	padding: 10px;
    +	margin-top: 10px;
    +}
    +
    +.funList {
    +	display: block;
    +}
    +
    +.funList a {
    +	margin-right: 20px;
    +	padding: 8PX;
    +	border: 1PX solid #F8F8F8;
    +	display: inline-block;
    +	cursor: pointer;
    +}
    +
    +.funList a:hover {
    +	background: #eee;
    +	border: 1px solid #DDD;
    +	display: inline-block;
    +	padding: 8PX;
    +	border-radius: 3PX;
    +}
    +
    +.funList a .icon {
    +	background: url(../images/membericon4.png) no-repeat;
    +	width: 30px;
    +	height: 30px;
    +	display: inline-block;
    +}
    +
    +.funList .icon1 .icon {
    +	background-position: 0 0;
    +}
    +
    +.funList .icon2 .icon {
    +	background-position: -300px 0;
    +}
    +
    +.funList .icon3 .icon {
    +	background-position: -420px 0;
    +}
    +
    +.funList a .text {
    +	font-size: 14px;
    +	height: 30px;
    +	line-height: 19px;
    +	display: inline-block;
    +	padding-left: 10px;
    +	color: #666;
    +}
    +
    +.funList a:hover .text {
    +	color: #666;
    +}
    +
    +.moreFun {
    +	border: 1px solid #ddd;
    +	border-radius: 3px;
    +	background: #F8F8F8;
    +	padding: 20PX;
    +}
    +
    +/*鏂板勾鏍峰紡*/
    +/*.blueButton {
    +    border: 1px solid #951b0e;
    +    border-radius: 3px;
    +    background-color: #951b0e;
    +    background: -webkit-gradient(linear, 0 0, 0 100%, from(#b92111), to(#951b0e));
    +    background: -moz-gradient(linear, 0 0, 0 100%, from(#b92111), to(#951b0e));
    +    background: -o-gradient(linear, 0 0, 0 100%, from(#b92111), to(#951b0e));
    +    background: -ms-gradient(linear, 0 0, 0 100%, from(#b92111), to(#951b0e));
    +    filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#b92111,endcolorstr=#951b0e,gradientType=0);
    +    color: #FFFFFF;
    +}
    +
    +
    +    .blueButton:hover {
    +        border: 1px solid #951b0e;
    +        background-color: #951b0e;
    +        background: -webkit-gradient(linear, 0 0, 0 100%, from(#ea2a16), to(#951b0e));
    +        background: -moz-gradient(linear, 0 0, 0 100%, from(#ea2a16), to(#951b0e));
    +        background: -o-gradient(linear, 0 0, 0 100%, from(#ea2a16), to(#951b0e));
    +        background: -ms-gradient(linear, 0 0, 0 100%, from(#ea2a16), to(#951b0e));
    +        filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#ea2a16,endcolorstr=#951b0e,gradientType=0);
    +        color: #FFFFFF;
    +    }
    +
    +    .blueButton:active {
    +        border: 1px solid #951b0e;
    +        background-color: #6ecdff;
    +        background: -webkit-gradient(linear, 0 0, 0 100%, from(#951b0e), to(#ea2a16));
    +        background: -moz-gradient(linear, 0 0, 0 100%, from(#951b0e), to(#ea2a16));
    +        background: -o-gradient(linear, 0 0, 0 100%, from(#951b0e), to(#ea2a16));
    +        background: -ms-gradient(linear, 0 0, 0 100%, from(#951b0e), to(#ea2a16));
    +        filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#951b0e,endcolorstr=#ea2a16,gradientType=0);
    +        color: #FFFFFF;
    +    }*/
    +
    +/* 閿鍞崟淇敼2014-1-7 */
    +.count .short {
    +	background: url(../images/icon_ps.png) no-repeat 0 0;
    +	width: 22px;
    +	height: 22px;
    +	margin: 2px 0 0 2px;
    +	position: absolute;
    +	cursor: pointer;
    +	display: none;
    +}
    +
    +.count .short:hover {
    +	background: url(../images/icon_ps.png) no-repeat 0 -28px;
    +}
    +
    +.count .shortUnclickable {
    +	background: url(../images/icon_ps.png) no-repeat 0 -56px;
    +	width: 22px;
    +	height: 22px;
    +	margin: 2px 0 0 2px;
    +	position: absolute;
    +	cursor: default;
    +	display: none;
    +}
    +
    +.count .plus {
    +	background: url(../images/icon_ps.png) no-repeat -40px 0;
    +	width: 22px;
    +	height: 22px;
    +	margin: 2px 0 0 -24px;
    +	position: absolute;
    +	cursor: pointer;
    +	display: none;
    +}
    +
    +.count .plus:hover {
    +	background: url(../images/icon_ps.png) no-repeat -40px -28px;
    +}
    +
    +.tableDiv tr:hover td .count .short {
    +	display: inline-block;
    +}
    +
    +.tableDiv tr:hover td .count .plus {
    +	display: inline-block;
    +}
    +
    +.tableDiv tr:hover td .count .shortUnclickable {
    +	display: inline-block;
    +}
    +
    +.goodsNum {
    +	background: #ee6f4d;
    +	border-radius: 3px;
    +	color: #FFF;
    +	padding: 2px 5px;
    +	margin: 0 5px;
    +}
    +
    +.mr5 {
    +	margin-right: 5px;
    +}
    +
    +/* 鏈熷垵淇℃伅鏌ヨ 2014-02-13 */
    +.nav {
    +	margin-right: 10px;
    +}
    +
    +.nav .title {
    +	border-top: 3px solid #00aeef;
    +	font-size: 16px;
    +	color: #000;
    +	line-height: 40px;
    +	border-bottom: 1px solid #ddd;
    +	text-indent: 10px;
    +}
    +
    +.nav ul {
    +	padding: 5px;
    +}
    +
    +.nav ul li .tabN {
    +	line-height: 30px;
    +	height: 30px;
    +	width: 100%;
    +	display: block;
    +	border-bottom: 1px solid #eee;
    +	color: #666;
    +	text-indent: 10px;
    +	font-size: 14px;
    +}
    +
    +.nav ul li .tabS,.nav ul li .tabN:hover {
    +	line-height: 30px;
    +	height: 30px;
    +	width: 100%;
    +	display: block;
    +	border-bottom: 1px solid #eee;
    +	color: #FFF;
    +	background: #00aeef;
    +	text-indent: 10px;
    +	font-size: 14px;
    +}
    +
    +/* 鏂板鏁版嵁鍒嗕韩 2014-02-19  */
    +.getReady {
    +	border: 1px solid #ffba00;
    +	background: #fffbeb url(../images/loading.gif) no-repeat center top;
    +	padding: 38px 10px 10px 10px;
    +	display: block;
    +	color: #53606b;
    +	font-size: 14px;
    +	text-align: center;
    +}
    +
    +.already {
    +	border: 1px solid #c2c2c2;
    +	background: #ebebeb;
    +	padding: 10px;
    +	display: block;
    +	color: #53606b;
    +	font-size: 14px;
    +	text-align: left;
    +	word-break: break-all;
    +	white-space: normal;
    +}
    +
    +.shareList ul li {
    +	float: left;
    +	padding-right: 10px;
    +}
    +
    +.shareList ul li a {
    +	background: url(../images/share.jpg);
    +	width: 94px;
    +	height: 94px;
    +	display: inline-block;
    +}
    +
    +.shareList .copy {
    +	background-position: 0 0;
    +}
    +
    +.shareList .copy:hover {
    +	background-position: 0 -118px;
    +}
    +
    +.shareList .mail {
    +	background-position: -113px 0;
    +}
    +
    +.shareList .mail:hover {
    +	background-position: -113px -118px;
    +}
    +
    +.shareList .QQ {
    +	background-position: -227px 0;
    +}
    +
    +.shareList .QQ:hover {
    +	background-position: -227px -118px;
    +}
    +
    +.shareList .weixin {
    +	background-position: -339px 0;
    +}
    +
    +.shareList .weixin:hover {
    +	background-position: -339px -118px;
    +}
    +
    +.shareArea {
    +	border-top: 1px #DDD solid;
    +	padding: 10px;
    +}
    +
    +.VBbody {
    +	background: #758089;
    +}
    +
    +.viewBillsLogin {
    +	width: 430px;
    +	margin: 100px auto 10px auto;
    +}
    +
    +.BillsInfo {
    +	background: #ff8250;
    +	height: 150px;
    +	padding-top: 30px;
    +}
    +
    +.billsLogo {
    +	border-radius: 50px;
    +	width: 99px;
    +	height: 99px;
    +	border: 3px solid #FFF;
    +	margin: 0 auto;
    +}
    +
    +.VBLoginContent {
    +	padding: 10px;
    +}
    +
    +.billsTop {
    +	background: #FFFFFF;
    +	box-shadow: 0px 2px 1px rgba(0, 0, 0, .1);
    +	border-bottom: 1px solid #ccc;
    +	width: 100%;
    +	height: 100px;
    +}
    +
    +.VBlogo {
    +	width: 80px;
    +	height: 80px;
    +	border-radius: 45px;
    +	border: 2px solid #F8F8F8;
    +	background-position: center;
    +	margin: 5px 0 0 10px;
    +}
    +
    +.VBbottom {
    +	width: 100%;
    +	border-top: #CCC 1px solid;
    +	background-color: #FFF;
    +	text-align: right;
    +	padding: 10px 0;
    +}
    +
    +.popWechat {
    +	position: absolute;
    +	border: 1px solid #DDD;
    +	background: #f8f8f8;
    +	padding: 10px;
    +	margin: -150px 0 0 95px;
    +	width: 150px;
    +	*margin: -40px 0 0 0;
    +}
    +
    +.popWechat .text {
    +	white-space: normal;
    +}
    +
    +/*鏁版嵁澶囦唤杩樺師 涓婃鎺т欢鏍峰紡  start*/
    +#ui-upload-holder {
    +	position: relative;
    +	float: left;
    +	width: 100px;
    +	height: 30px;
    +	border: 0px solid silver;
    +	overflow: hidden;
    +}
    +
    +.ui-upload-input {
    +	position: absolute;
    +	top: 0px;
    +	right: 0px;
    +	height: 30px;
    +	width: 280px;
    +	cursor: pointer;
    +	opacity: 0;
    +	filter: alpha(opacity : 0);
    +	z-index: 999;
    +}
    +/*end*/
    +
    +/*loading鍔犺浇閬僵灞俢ss*/
    +#black_overlay {
    +	position: fixed;
    +	z-index: 10000;
    +	width: 100%;
    +	height: 100%;
    +	top: 0;
    +	left: 0;
    +	filter: alpha(opacity = 40);
    +	opacity: 0.4;
    +	overflow: hidden;
    +	background-color: #000;
    +}
    +
    +/*IE6*/
    +#black_overlay {
    +	position: absolute;
    +	left: expression(documentElement.scrollLeft + documentElement.clientWidth -  
    +		 this.offsetWidth);
    +	top: expression(documentElement.scrollTop + documentElement.clientHeight -  
    +		 this.offsetHeight);
    +}
    +
    +#load_content {
    +	display: none;
    +	position: absolute;
    +	top: 40%;
    +	left: 40%;
    +	width: 300px;
    +	height: 50px;
    +	border: 16px solid #FFF;
    +	border-bottom: none;
    +	background-color: white;
    +	z-index: 10002;
    +	overflow: auto;
    +	font-size: 14px;
    +	font-weight: bold;
    +}
    +
    +/* 鏂板鍑哄叆搴 */
    +.deliverIn {
    +	padding: 10px 10px 5px 10px;
    +	float: left;
    +}
    +
    +.deliverIn div {
    +	margin-bottom: 5px;
    +}
    +
    +.lightGreenButton {
    +	border: 1px solid #c3e4b5;
    +	border-radius: 3px;
    +	background-color: #edffe6;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#e0ffd2),
    +		to(#d1ffbe));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#e0ffd2),
    +		to(#d1ffbe));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#e0ffd2), to(#d1ffbe));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#e0ffd2), to(#d1ffbe));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#e0ffd2,
    +		endcolorstr=#d1ffbe, gradientType=0);
    +	color: #666666;
    +}
    +
    +.lightGreenButton:hover {
    +	border: 1px solid #c3e4b5;
    +	background-color: #f3ffee;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#eeffe7),
    +		to(#d1ffbe));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#eeffe7),
    +		to(#d1ffbe));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#eeffe7), to(#d1ffbe));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#eeffe7), to(#d1ffbe));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#eeffe7,
    +		endcolorstr=#d1ffbe, gradientType=0);
    +	color: #666666;
    +}
    +
    +.lightGreenButton:active {
    +	border: 1px solid #c3e4b5;
    +	background-color: #edffe6;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#d1ffbe),
    +		to(#eeffe7));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#d1ffbe),
    +		to(#eeffe7));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#d1ffbe), to(#eeffe7));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#d1ffbe), to(#edffe6));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#d1ffbe,
    +		endcolorstr=#eeffe7, gradientType=0);
    +	color: #666666;
    +}
    +
    +/* 2014-3-19tab鍒锋柊 */
    +.downArrow {
    +	float: left;
    +	position: absolute;
    +	left: 184px;
    +	top: 67px;
    +	z-index:1;
    +}
    +
    +.downArrow .downArrowIcon {
    +	background: url(../images/downArrow.png);
    +	width: 23px;
    +	height: 38px;
    +	float: left;
    +}
    +
    +.downArrow .downArrowContent {
    +	background: #FFF;
    +	position: absolute;
    +	z-index: 100;
    +	box-shadow: 0 2px 4px rgba(0, 0, 0, .4);
    +	margin: 25px 0 0 -10px;
    +	display: none;
    +	white-space: nowrap;
    +	border: 1px solid #eeeeee;
    +}
    +
    +.downArrow .downArrowContent span {
    +	clear: both;
    +	float: left;
    +	border-bottom: 1px solid #EEE;
    +	padding: 3px 10px;
    +	width: 80px;
    +}
    +
    +.downArrow .downArrowContent span:hover {
    +	background: #F8F8F8;
    +	cursor: pointer;
    +}
    +
    +.downArrow:hover .downArrowContent {
    +	display: block;
    +}
    +
    +.cs-north {
    +	height: 67px;
    +}
    +
    +.cs-north-bg {
    +	width: 100%;
    +	height: 100%;
    +	/*background: url(../../Content/themes/redhot/images/topbg.gif) repeat-x;*/
    +}
    +
    +.cs-north-logo {
    +	height: 40px;
    +	margin: 15px 0px 0px 5px;
    +	display: inline-block;
    +	color: #000000;
    +	font-size: 22px;
    +	font-weight: bold;
    +	text-decoration: none;
    +}
    +
    +.cs-west {
    +	width: 120px;
    +	padding: 0px;
    +	background-color: #FFF;
    +}
    +
    +.cs-south {
    +	height: 60px;
    +	background:
    +		url('themes/pepper-grinder/images/ui-bg_fine-grain_15_ffffff_60x60.png')
    +		repeat-x;
    +	padding: 0px;
    +	text-align: center;
    +}
    +
    +.cs-navi-tab {
    +	/*padding: 5px;*/
    +	
    +}
    +
    +.cs-tab-menu {
    +	width: 120px;
    +}
    +
    +.cs-home-remark {
    +	/*padding: 10px;*/
    +	
    +}
    +
    +.wrapper {
    +	float: right;
    +	height: 30px;
    +	margin-left: 10px;
    +}
    +
    +.ui-skin-nav {
    +	float: right;
    +	padding: 0;
    +	margin-right: 10px;
    +	list-style: none outside none;
    +	height: 30px;
    +}
    +
    +.ui-skin-nav .li-skinitem {
    +	float: left;
    +	font-size: 12px;
    +	line-height: 30px;
    +	margin-left: 10px;
    +	text-align: center;
    +}
    +
    +.ui-skin-nav .li-skinitem span {
    +	cursor: pointer;
    +	width: 10px;
    +	height: 10px;
    +	display: inline-block;
    +}
    +
    +.ui-skin-nav .li-skinitem span.cs-skin-on {
    +	border: 1px solid #FFFFFF;
    +}
    +
    +.ui-skin-nav .li-skinitem span.gray {
    +	background-color: gray;
    +}
    +
    +.ui-skin-nav .li-skinitem span.pepper-grinder {
    +	background-color: #BC3604;
    +}
    +
    +.ui-skin-nav .li-skinitem span.blue {
    +	background-color: blue;
    +}
    +
    +.ui-skin-nav .li-skinitem span.cupertino {
    +	background-color: #D7EBF9;
    +}
    +
    +.ui-skin-nav .li-skinitem span.dark-hive {
    +	background-color: black;
    +}
    +
    +.ui-skin-nav .li-skinitem span.sunny {
    +	background-color: #FFE57E;
    +}
    +.secondFloat{
    +	display:none;
    +}
    +.buttonArea{
    +	height:28px;
    +	margin-bottom:10px;
    +}
    +.contentTab{
    +	height:41px;
    +	width:100%;
    +}
    +.form-table th,.form-table td{
    +	font-size:14px;
    +	font-weight:normal;
    +}
    +.form-table th{
    +	width:120px;
    +	text-align:right;
    +}
    +.form-table tr{
    +	height:36px;
    +}
    +.form-table{width:100%;}
    +.sysmenu {margin-right:75px;float:right;margin-top:0px;}
    +.sysmenu li.message,.sysmenu li.logout,.sysmenu li.website{float:left;position:relative;margin-left:15px;padding-right:13px;background:url(../images/li_bg_01.gif) no-repeat scroll right 7px;line-height:32px;height:40px;}
    +.sysmenu li a{display:block;font-size:16px;padding-left:36px;background:url(../images/sys_icon.gif) no-repeat;overflow:hidden;color:#888;}
    +.sysmenu li a:hover{color:#09b2ea;}
    +.sysmenu .message a{background-position: 0px -132px;}
    +.sysmenu .message a:hover{background-position: 0px -161px;}
    +.sysmenu .logout a{background-position: 0px 0px;}
    +.sysmenu .logout a:hover{background-position: 0px -34px;}
    +.sysmenu .website a{background-position:0px -69px;}
    +.sysmenu .website a:hover{background-position:0px -101px;}
    +.sysmenu .website{background:none;}
    +.sysmenu .message a .num{diplay:block;width:18px;height:18px;line-height:18px;position:absolute;color:#fff;background:url(../images/sys_icon.gif) no-repeat scroll -7px -197px;top:20px;left:20px;text-align:center;line-height:16px;font-size:14px;}
    +.sysmenu li .msglist{clear:both;width:190px;padding:10px 15px;position:absolute;left:-100px;top:40px;border:1px solid #c0c0c0;background:#fff;z-index:999;}
    +.sysmenu li .msglist .triangle{position:absolute;top:-8px;left:110px;background:url(../images/triangle.gif) no-repeat scroll center 0px;width:15px;height:9px;}
    +.sysmenu li .msglist li{float:none;background:none;margin:0;padding:0;height:24;line-height:24px;overflow:hidden;}
    +.sysmenu li .msglist li a{background:none;font-size:12px;padding-left:0;color:#000;line-height:24px;}
    +.sysmenu li .msglist li a:hover{text-decoration:underline;}
    +#short_msg{float:right;margin-right:50px;margin-top:10px;height:22px;line-height:22px;}
    +
    +.layout-split-west{
    +	z-index:9;
    +}
    +.layout-panel-north{
    +	z-index:1;
    +}
    +.datagrid-pager a.l-btn span.l-btn-left{
    +	height:20px;
    +	line-height:20px;
    +	padding:0px 10px 0px 5px;
    +}
    +.tooltip {
    +    border-radius: 5px;
    +    border-style: solid;
    +    border-width: 1px;
    +    display: none;
    +    opacity: 1;
    +    outline: medium none;
    +    padding: 5px;
    +    position: absolute;
    +    z-index: 9900000;
    +}
    +.tooltip-content {
    +    font-size: 12px;
    +}
    +.tooltip-arrow-outer, .tooltip-arrow {
    +    border-color: rgba(0, 0, 0, 0);
    +    border-style: solid;
    +    border-width: 6px;
    +    font-size: 0;
    +    height: 0;
    +    line-height: 0;
    +    position: absolute;
    +    width: 0;
    +}
    +.tooltip-right .tooltip-arrow-outer {
    +    left: 0;
    +    margin: -6px 0 0 -13px;
    +    top: 50%;
    +}
    +.tooltip-right .tooltip-arrow {
    +    left: 0;
    +    margin: -6px 0 0 -12px;
    +    top: 50%;
    +}
    +.tooltip-left .tooltip-arrow-outer {
    +    margin: -6px -13px 0 0;
    +    right: 0;
    +    top: 50%;
    +}
    +.tooltip-left .tooltip-arrow {
    +    margin: -6px -12px 0 0;
    +    right: 0;
    +    top: 50%;
    +}
    +.tooltip-top .tooltip-arrow-outer {
    +    bottom: 0;
    +    left: 50%;
    +    margin: 0 0 -13px -6px;
    +}
    +.tooltip-top .tooltip-arrow {
    +    bottom: 0;
    +    left: 50%;
    +    margin: 0 0 -12px -6px;
    +}
    +.tooltip-bottom .tooltip-arrow-outer {
    +    left: 50%;
    +    margin: -13px 0 0 -6px;
    +    top: 0;
    +}
    +.tooltip-bottom .tooltip-arrow {
    +    left: 50%;
    +    margin: -12px 0 0 -6px;
    +    top: 0;
    +}
    +.tooltip {
    +    background-color: #FFFFFF;
    +    border-color: #D3D3D3;
    +    color: #000000;
    +}
    +.tooltip-right .tooltip-arrow-outer {
    +    border-right-color: #D3D3D3;
    +}
    +.tooltip-right .tooltip-arrow {
    +    border-right-color: #FFFFFF;
    +}
    +.tooltip-left .tooltip-arrow-outer {
    +    border-left-color: #D3D3D3;
    +}
    +.tooltip-left .tooltip-arrow {
    +    border-left-color: #FFFFFF;
    +}
    +.tooltip-top .tooltip-arrow-outer {
    +    border-top-color: #D3D3D3;
    +}
    +.tooltip-top .tooltip-arrow {
    +    border-top-color: #FFFFFF;
    +}
    +.tooltip-bottom .tooltip-arrow-outer {
    +    border-bottom-color: #D3D3D3;
    +}
    +.tooltip-bottom .tooltip-arrow {
    +    border-bottom-color: #FFFFFF;
    +}
    +.detail table{
    +	width:100%;
    +	background:#ccc;
    +	padding:1px 0px 0px 1px;
    +}
    +.detail th{
    +	padding: 3px 6px;
    +    white-space: normal;
    +    word-break: break-all;
    +    background:#F7F7F7;
    +    border-bottom: 1px solid #CCCCCC;
    +    border-right: 1px solid #CCCCCC;
    +    color: #333333;
    +    font-size: 12px;
    +    font-weight: bold;
    +    text-align:left;
    +   	cursor:pointer;
    + }
    + .detail tr{
    + 	background:#fff;
    + }
    +.detail td {
    +	padding:3px 6px;
    +    white-space: normal;
    +    word-break: break-all;
    +    border-bottom: 1px solid #CCCCCC;
    +    border-right: 1px solid #CCCCCC;
    +    font-size: 12px;
    +    margin: 0;
    +    overflow: hidden;
    +    text-align:left;
    + }
    + .main .input .tableform{
    + 	border-width: 1px 0 0;
    + 	border-style:solid;
    + 	border-color:#eaeaea;
    + 	margin:20px 0px 0px;
    + 	background:none;
    + 	padding:20px 0px 0px;
    + }
    + .main .input .box{
    + 	margin-right:20px;
    + 	margin-bottom:15px;
    + 	padding:0px 0px 4px 0px;
    + 	background:url(../images/division_bg.gif) repeat-x scroll left bottom;
    + }
    +
    +.main .input h5,#index_box .item .indexitem h3{
    +	height:48px;
    +	line-height:48px;
    +	border:1px solid #cfcfcf;
    +	border-bottom:none;
    +	text-indent:1em;
    +	text-align:left;
    +	font-size:18px;
    +	font-weight:normal;
    +	color:#666;
    +	margin:0px;
    +	padding:0;
    + }
    + #index_box .item .indexitem h3{
    + 	background:#fff
    +}
    + .main .division,.main .item .body{
    + 	margin:0px;
    + 	padding:0px ;
    + 	border:none;
    + 	font-size:14px;
    + 	border-left:1px solid #cfcfcf;
    +	border-right:1px solid #cfcfcf;
    + }
    +.main .division th,.main .item th{
    +	border-color:#e5e5e5 #e5e5e5 #e5e5e5 #cfcfcf;
    +	border-width:1px 1px 0px 0px;
    +	border-style:solid;
    +	background:#f4f4f4;
    +	height:28px;
    +	line-height:28px;
    +	color:#676767;
    +}
    +.main .division td,.main .item td{
    +	border-color:#e5e5e5 #cfcfcf #e5e5e5 #e5e5e5;
    +	border-width:1px 0px 0px 0px;
    +	border-style:solid;
    +	background:#fff;
    +	height:28px;
    +	line-height:28px;
    +	text-align:left;
    +	color:#676767;
    +} 
    +#index_box .item{
    +	width:302px;
    +	float:left;
    +	margin-right:15px;
    +	margin-top:15px;
    +}
    + #index_box .item .indexitem{
    + 	border-bottom:1px solid #cfcfcf;
    +}
    +#index_box .item .indexitem tr{
    + 	height:28px;
    + 	line-height:28px;
    +}
    +#index_box .item .indexitem th{
    + font-size:14px;
    + text-align:right;
    + width:130px;
    +font-weight:normal;
    +}
    +#index_box .item .indexitem td{
    +	font-size:14px;
    +	height:28px;
    +	line-height:28px;
    +	padding-left:5px;
    +}
    +#index_box .item .indexitem td div{
    +	line-height:18px; 
    +}
    + .detail .row-selected{
    + 	background:#fbec88;
    + }
    + .detail .row-over{
    + 	background:#f1f1f1;
    + }
    + .main .division .grid td{
    + 	border-right:1px solid #e5e5e5;
    + 	text-align:center; 
    + }
    +.buttonWrap{
    +	background:#fff;
    +    text-align: center;
    +    width: 100%;
    +    height:30px;
    +    padding:3px 0;
    +    	box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
    +	filter: "progid:DXImageTransform.Microsoft.Shadow(color=#AAAAAA,direction=0,strength=0) progid:DXImageTransform.Microsoft.Shadow(color=#CCCCCC,direction=90,strength=3) progid:DXImageTransform.Microsoft.Shadow(color=#888888,direction=180,strength=5) progid:DXImageTransform.Microsoft.Shadow(color=#CCCCCC,direction=270,strength=3)";*/
    +    
    +}
    +.fixed{
    +	position: fixed;
    +	border-top:1px solid #d6d6d6;
    +	box-shadow:1px 1px 5px #d6d6d6;
    +   -webkit-box-shadow:1px 1px 5px #d6d6d6;
    +   -moz-box-shadow:1px 1px 5px #d6d6d6;
    +    bottom: 0;
    +    left: 0;
    +}
    +.b_fr{
    +	margin-top:0px;
    +	display:block;
    +	float:right;
    +}
    +.mr5{
    +	margin-right:5px;
    +}
    +.blockUI{
    +	font-size:14px;
    +	line-height:38px;
    +	-moz-border-radius: 3px;      /* Gecko browsers */
    +    -webkit-border-radius: 3px;   /* Webkit browsers */
    +    border-radius:3px;
    +  }
    +.blockUI .success{
    +	padding-left:40px;
    +	background:url(../images/block_success_bg.gif) no-repeat scroll 6px 6px;
    +}
    +.blockUI .error{
    +	padding-left:40px;
    +	background:url(../images/block_error_bg.gif) no-repeat scroll 6px 6px;
    +}
    +.main .contentTab{
    +	height:32px;
    +}
    +.main .contentTab ul li{
    +	height:30px;
    +	padding:0px 20px;
    +	line-height:30px;
    +}
    +.main .contentTab ul li.contentTabS{
    +	padding:0px 35px;
    +	border-top:2px solid #6f6d6d;
    +	font-weight:normal;
    +}
    +#dlytype .shadowBoxWhite {
    +	padding:5px;
    +    box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
    +}
    +#dlytype .whiteBox .title {
    +    border-bottom: 1px solid #dfdfdf;
    +    color: #53606b;
    +    font-size: 18px;
    +    height: 36px;
    +    line-height: 36px;
    +    margin: 0 5px;
    +    text-indent: 5px;
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/accordion.css b/src/main/webapp/plug-in/easyui/themes/metro/accordion.css
    new file mode 100644
    index 00000000..31d6079e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/accordion.css
    @@ -0,0 +1,41 @@
    +.accordion {
    +  overflow: hidden;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.accordion .accordion-header {
    +  border-width: 0 0 1px;
    +  cursor: pointer;
    +}
    +.accordion .accordion-body {
    +  border-width: 0 0 1px;
    +}
    +.accordion-noborder {
    +  border-width: 0;
    +}
    +.accordion-noborder .accordion-header {
    +  border-width: 0 0 1px;
    +}
    +.accordion-noborder .accordion-body {
    +  border-width: 0 0 1px;
    +}
    +.accordion-collapse {
    +  background: url('images/accordion_arrows.png') no-repeat 0 0;
    +}
    +.accordion-expand {
    +  background: url('images/accordion_arrows.png') no-repeat -16px 0;
    +}
    +.accordion {
    +  background: #fff;
    +  border-color: #ddd;
    +}
    +.accordion .accordion-header {
    +  background: #ffffff;
    +  filter: none;
    +}
    +.accordion .accordion-header-selected {
    +  background: #CCE6FF;
    +}
    +.accordion .accordion-header-selected .panel-title {
    +  color: #000;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/calendar.css b/src/main/webapp/plug-in/easyui/themes/metro/calendar.css
    new file mode 100644
    index 00000000..a2e94f3c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/calendar.css
    @@ -0,0 +1,185 @@
    +.calendar {
    +  border-width: 1px;
    +  border-style: solid;
    +  padding: 1px;
    +  overflow: hidden;
    +  font-size: 12px;
    +}
    +.calendar table {
    +  border-collapse: separate;
    +  font-size: 12px;
    +  width: 100%;
    +  height: 100%;
    +}
    +.calendar-noborder {
    +  border: 0;
    +}
    +.calendar-header {
    +  position: relative;
    +  height: 22px;
    +}
    +.calendar-title {
    +  text-align: center;
    +  height: 22px;
    +}
    +.calendar-title span {
    +  position: relative;
    +  display: inline-block;
    +  top: 2px;
    +  padding: 0 3px;
    +  height: 18px;
    +  line-height: 18px;
    +  cursor: pointer;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.calendar-prevmonth,
    +.calendar-nextmonth,
    +.calendar-prevyear,
    +.calendar-nextyear {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -7px;
    +  width: 14px;
    +  height: 14px;
    +  cursor: pointer;
    +  font-size: 1px;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.calendar-prevmonth {
    +  left: 20px;
    +  background: url('images/calendar_arrows.png') no-repeat -18px -2px;
    +}
    +.calendar-nextmonth {
    +  right: 20px;
    +  background: url('images/calendar_arrows.png') no-repeat -34px -2px;
    +}
    +.calendar-prevyear {
    +  left: 3px;
    +  background: url('images/calendar_arrows.png') no-repeat -1px -2px;
    +}
    +.calendar-nextyear {
    +  right: 3px;
    +  background: url('images/calendar_arrows.png') no-repeat -49px -2px;
    +}
    +.calendar-body {
    +  position: relative;
    +}
    +.calendar-body th,
    +.calendar-body td {
    +  text-align: center;
    +}
    +.calendar-day {
    +  border: 0;
    +  padding: 1px;
    +  cursor: pointer;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.calendar-other-month {
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +}
    +.calendar-menu {
    +  position: absolute;
    +  top: 0;
    +  left: 0;
    +  width: 180px;
    +  height: 150px;
    +  padding: 5px;
    +  font-size: 12px;
    +  display: none;
    +  overflow: hidden;
    +}
    +.calendar-menu-year-inner {
    +  text-align: center;
    +  padding-bottom: 5px;
    +}
    +.calendar-menu-year {
    +  width: 40px;
    +  text-align: center;
    +  border-width: 1px;
    +  border-style: solid;
    +  margin: 0;
    +  padding: 2px;
    +  font-weight: bold;
    +}
    +.calendar-menu-prev,
    +.calendar-menu-next {
    +  display: inline-block;
    +  width: 21px;
    +  height: 21px;
    +  vertical-align: top;
    +  cursor: pointer;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.calendar-menu-prev {
    +  margin-right: 10px;
    +  background: url('images/calendar_arrows.png') no-repeat 2px 2px;
    +}
    +.calendar-menu-next {
    +  margin-left: 10px;
    +  background: url('images/calendar_arrows.png') no-repeat -45px 2px;
    +}
    +.calendar-menu-month {
    +  text-align: center;
    +  cursor: pointer;
    +  font-weight: bold;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.calendar-body th,
    +.calendar-menu-month {
    +  color: #919191;
    +}
    +.calendar-day {
    +  color: #444;
    +}
    +.calendar-sunday {
    +  color: #CC2222;
    +}
    +.calendar-saturday {
    +  color: #00ee00;
    +}
    +.calendar-today {
    +  color: #0000ff;
    +}
    +.calendar-menu-year {
    +  border-color: #ddd;
    +}
    +.calendar {
    +  border-color: #ddd;
    +}
    +.calendar-header {
    +  background: #ffffff;
    +}
    +.calendar-body,
    +.calendar-menu {
    +  background: #fff;
    +}
    +.calendar-body th {
    +  background: #fff;
    +}
    +.calendar-hover,
    +.calendar-nav-hover,
    +.calendar-menu-hover {
    +  background-color: #E6E6E6;
    +  color: #444;
    +}
    +.calendar-hover {
    +  border: 1px solid #ddd;
    +  padding: 0;
    +}
    +.calendar-selected {
    +  background-color: #CCE6FF;
    +  color: #000;
    +  border: 1px solid #99cdff;
    +  padding: 0;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/combo.css b/src/main/webapp/plug-in/easyui/themes/metro/combo.css
    new file mode 100644
    index 00000000..8922f8e1
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/combo.css
    @@ -0,0 +1,58 @@
    +.combo {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +  vertical-align: middle;
    +}
    +.combo .combo-text {
    +  font-size: 12px;
    +  border: 0px;
    +  line-height: 20px;
    +  height: 20px;
    +  margin: 0;
    +  padding: 0px 2px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.combo-arrow {
    +  width: 18px;
    +  height: 20px;
    +  overflow: hidden;
    +  display: inline-block;
    +  vertical-align: top;
    +  cursor: pointer;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.combo-arrow-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.combo-panel {
    +  overflow: auto;
    +}
    +.combo-arrow {
    +  background: url('images/combo_arrow.png') no-repeat center center;
    +}
    +.combo,
    +.combo-panel {
    +  background-color: #fff;
    +}
    +.combo {
    +  border-color: #ddd;
    +  background-color: #fff;
    +}
    +.combo-arrow {
    +  background-color: #ffffff;
    +}
    +.combo-arrow-hover {
    +  background-color: #E6E6E6;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/combobox.css b/src/main/webapp/plug-in/easyui/themes/metro/combobox.css
    new file mode 100644
    index 00000000..9e1b5838
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/combobox.css
    @@ -0,0 +1,14 @@
    +.combobox-item {
    +  padding: 2px;
    +  font-size: 12px;
    +  padding: 3px;
    +  padding-right: 0px;
    +}
    +.combobox-item-hover {
    +  background-color: #E6E6E6;
    +  color: #444;
    +}
    +.combobox-item-selected {
    +  background-color: #CCE6FF;
    +  color: #000;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/datagrid.css b/src/main/webapp/plug-in/easyui/themes/metro/datagrid.css
    new file mode 100644
    index 00000000..a35e9bcc
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/datagrid.css
    @@ -0,0 +1,247 @@
    +.datagrid .panel-body {
    +  overflow: hidden;
    +  position: relative;
    +}
    +.datagrid-view {
    +  position: relative;
    +  overflow: hidden;
    +}
    +.datagrid-view1,
    +.datagrid-view2 {
    +  position: absolute;
    +  overflow: hidden;
    +  top: 0;
    +}
    +.datagrid-view1 {
    +  left: 0;
    +}
    +.datagrid-view2 {
    +  right: 0;
    +}
    +.datagrid-mask {
    +  position: absolute;
    +  left: 0;
    +  top: 0;
    +  width: 100%;
    +  height: 100%;
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +  display: none;
    +}
    +.datagrid-mask-msg {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -20px;
    +  padding: 12px 5px 10px 30px;
    +  width: auto;
    +  height: 16px;
    +  border-width: 2px;
    +  border-style: solid;
    +  display: none;
    +}
    +.datagrid-sort-icon {
    +  padding: 0;
    +}
    +.datagrid-toolbar {
    +  height: auto;
    +  padding: 1px 2px;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.datagrid-btn-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #ddd;
    +  border-right: 1px solid #fff;
    +  margin: 2px 1px;
    +}
    +.datagrid .datagrid-pager {
    +  margin: 0;
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +}
    +.datagrid .datagrid-pager-top {
    +  border-width: 0 0 1px 0;
    +}
    +.datagrid-header {
    +  overflow: hidden;
    +  cursor: default;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.datagrid-header-inner {
    +  float: left;
    +  width: 10000px;
    +}
    +.datagrid-header-row,
    +.datagrid-row {
    +  height: 25px;
    +}
    +.datagrid-header td,
    +.datagrid-body td,
    +.datagrid-footer td {
    +  border-width: 0 1px 1px 0;
    +  border-style: dotted;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-cell,
    +.datagrid-cell-group,
    +.datagrid-header-rownumber,
    +.datagrid-cell-rownumber {
    +  margin: 0;
    +  padding: 0 4px;
    +  white-space: nowrap;
    +  word-wrap: normal;
    +  overflow: hidden;
    +  height: 18px;
    +  line-height: 18px;
    +  font-weight: normal;
    +  font-size: 12px;
    +}
    +.datagrid-cell-group {
    +  text-align: center;
    +}
    +.datagrid-header-rownumber,
    +.datagrid-cell-rownumber {
    +  width: 25px;
    +  text-align: center;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body {
    +  margin: 0;
    +  padding: 0;
    +  overflow: auto;
    +  zoom: 1;
    +}
    +.datagrid-view1 .datagrid-body-inner {
    +  padding-bottom: 20px;
    +}
    +.datagrid-view1 .datagrid-body {
    +  overflow: hidden;
    +}
    +.datagrid-footer {
    +  overflow: hidden;
    +}
    +.datagrid-footer-inner {
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +  width: 10000px;
    +  float: left;
    +}
    +.datagrid-row-editing .datagrid-cell {
    +  height: auto;
    +}
    +.datagrid-header-check,
    +.datagrid-cell-check {
    +  padding: 0;
    +  width: 27px;
    +  height: 18px;
    +  font-size: 1px;
    +  text-align: center;
    +  overflow: hidden;
    +}
    +.datagrid-header-check input,
    +.datagrid-cell-check input {
    +  margin: 0;
    +  padding: 0;
    +  width: 15px;
    +  height: 18px;
    +}
    +.datagrid-resize-proxy {
    +  position: absolute;
    +  width: 1px;
    +  height: 10000px;
    +  top: 0;
    +  cursor: e-resize;
    +  display: none;
    +}
    +.datagrid-body .datagrid-editable {
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body .datagrid-editable table {
    +  width: 100%;
    +  height: 100%;
    +}
    +.datagrid-body .datagrid-editable td {
    +  border: 0;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body .datagrid-editable .datagrid-editable-input {
    +  margin: 0;
    +  padding: 2px;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.datagrid-sort-desc .datagrid-sort-icon {
    +  padding: 0 13px 0 0;
    +  background: url('images/datagrid_icons.png') no-repeat -16px center;
    +}
    +.datagrid-sort-asc .datagrid-sort-icon {
    +  padding: 0 13px 0 0;
    +  background: url('images/datagrid_icons.png') no-repeat 0px center;
    +}
    +.datagrid-row-collapse {
    +  background: url('images/datagrid_icons.png') no-repeat -48px center;
    +}
    +.datagrid-row-expand {
    +  background: url('images/datagrid_icons.png') no-repeat -32px center;
    +}
    +.datagrid-mask-msg {
    +  background: #fff url('images/loading.gif') no-repeat scroll 5px center;
    +}
    +.datagrid-header,
    +.datagrid-td-rownumber {
    +  background-color: #ffffff;
    +}
    +.datagrid-cell-rownumber {
    +  color: #444;
    +}
    +.datagrid-resize-proxy {
    +  background: #b3b3b3;
    +}
    +.datagrid-mask {
    +  background: #eee;
    +}
    +.datagrid-mask-msg {
    +  border-color: #ddd;
    +}
    +.datagrid-toolbar,
    +.datagrid-pager {
    +  background: #fff;
    +}
    +.datagrid-header,
    +.datagrid-toolbar,
    +.datagrid-pager,
    +.datagrid-footer-inner {
    +  border-color: #ddd;
    +}
    +.datagrid-header td,
    +.datagrid-body td,
    +.datagrid-footer td {
    +  border-color: #ddd;
    +}
    +.datagrid-htable,
    +.datagrid-btable,
    +.datagrid-ftable {
    +  color: #444;
    +}
    +.datagrid-row-alt {
    +  background: #f5f5f5;
    +}
    +.datagrid-row-over,
    +.datagrid-header td.datagrid-header-over {
    +  background: #E6E6E6;
    +  color: #444;
    +  cursor: default;
    +}
    +.datagrid-row-selected {
    +  background: #CCE6FF;
    +  color: #000;
    +}
    +.datagrid-body .datagrid-editable .datagrid-editable-input {
    +  border-color: #ddd;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/datebox.css b/src/main/webapp/plug-in/easyui/themes/metro/datebox.css
    new file mode 100644
    index 00000000..b3c58a21
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/datebox.css
    @@ -0,0 +1,40 @@
    +.datebox-calendar-inner {
    +  height: 180px;
    +}
    +.datebox-button {
    +  height: 18px;
    +  padding: 2px 5px;
    +  font-size: 12px;
    +  text-align: center;
    +}
    +.datebox-current,
    +.datebox-close,
    +.datebox-ok {
    +  text-decoration: none;
    +  font-weight: bold;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.datebox-current,
    +.datebox-close {
    +  float: left;
    +}
    +.datebox-close {
    +  float: right;
    +}
    +.datebox-button-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.datebox .combo-arrow {
    +  background-image: url('images/datebox_arrow.png');
    +  background-position: center center;
    +}
    +.datebox-button {
    +  background-color: #fff;
    +}
    +.datebox-current,
    +.datebox-close,
    +.datebox-ok {
    +  color: #777;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/dialog.css b/src/main/webapp/plug-in/easyui/themes/metro/dialog.css
    new file mode 100644
    index 00000000..316cdc42
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/dialog.css
    @@ -0,0 +1,30 @@
    +.dialog-content {
    +  overflow: auto;
    +}
    +.dialog-toolbar {
    +  padding: 2px 5px;
    +}
    +.dialog-tool-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #ddd;
    +  border-right: 1px solid #fff;
    +  margin: 2px 1px;
    +}
    +.dialog-button {
    +  padding: 5px;
    +  text-align: right;
    +}
    +.dialog-button .l-btn {
    +  margin-left: 5px;
    +}
    +.dialog-toolbar,
    +.dialog-button {
    +  background: #fff;
    +}
    +.dialog-toolbar {
    +  border-bottom: 1px solid #ddd;
    +}
    +.dialog-button {
    +  border-top: 1px solid #ddd;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/easyui.css b/src/main/webapp/plug-in/easyui/themes/metro/easyui.css
    new file mode 100644
    index 00000000..f01b0d4a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/easyui.css
    @@ -0,0 +1,2183 @@
    +
    +.panel {
    +  overflow: hidden;
    +  font-size: 12px;
    +  text-align: left;
    +}
    +.panel-header,
    +.panel-body {
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.panel-header {
    +  padding: 5px;
    +  position: relative;
    +}
    +.panel-title {
    +  background: url('images/blank.gif') no-repeat;
    +}
    +.panel-header-noborder {
    +  border-width: 0 0 1px 0;
    +}
    +.panel-body {
    +  overflow: auto;
    +  border-top-width: 0px;
    +}
    +.panel-body-noheader {
    +  border-top-width: 1px;
    +/*   border-bottom-width: 0px;
    +  border-right-width: 0px;
    +  border-left-width: 0px; */
    +}
    +.panel-body-noborder {
    +  border-width: 0px;
    +}
    +.panel-with-icon {
    +  padding-left: 18px;
    +}
    +.panel-icon,
    +.panel-tool {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -8px;
    +  height: 16px;
    +  overflow: hidden;
    +}
    +.panel-icon {
    +  left: 5px;
    +  width: 16px;
    +}
    +.panel-tool {
    +  right: 5px;
    +  width: auto;
    +}
    +.panel-tool a {
    +  display: inline-block;
    +  width: 16px;
    +  height: 16px;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +  margin: 0 0 0 2px;
    +  vertical-align: top;
    +}
    +.panel-tool a:hover {
    +  opacity: 1;
    +  filter: alpha(opacity=100);
    +  background-color: #E6E6E6;
    +  -moz-border-radius: -2px -2px -2px -2px;
    +  -webkit-border-radius: -2px -2px -2px -2px;
    +  border-radius: -2px -2px -2px -2px;
    +}
    +.panel-loading {
    +  padding: 11px 0px 10px 30px;
    +}
    +.panel-noscroll {
    +  overflow: hidden;
    +}
    +.panel-fit,
    +.panel-fit body {
    +  height: 100%;
    +  margin: 0;
    +  padding: 0;
    +  border: 0;
    +  overflow: hidden;
    +}
    +.panel-loading {
    +  background: url('images/loading.gif') no-repeat 10px 10px;
    +}
    +.panel-tool-close {
    +  background: url('images/panel_tools.png') no-repeat -16px 0px;
    +}
    +.panel-tool-min {
    +  background: url('images/panel_tools.png') no-repeat 0px 0px;
    +}
    +.panel-tool-max {
    +  background: url('images/panel_tools.png') no-repeat 0px -16px;
    +}
    +.panel-tool-restore {
    +  background: url('images/panel_tools.png') no-repeat -16px -16px;
    +}
    +.panel-tool-collapse {
    +  background: url('images/panel_tools.png') no-repeat -32px 0;
    +}
    +.panel-tool-expand {
    +  background: url('images/panel_tools.png') no-repeat -32px -16px;
    +}
    +.panel-header,
    +.panel-body {
    +  border-color: #ddd;
    +}
    +.panel-header {
    +  background-color: #ffffff;
    +}
    +.panel-body {
    +  background-color: #fff;
    +  color: #444;
    +}
    +.panel-title {
    +  font-weight: bold;
    +  color: #777;
    +  height: 16px;
    +  line-height: 16px;
    +}
    +.accordion {
    +  overflow: hidden;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.accordion .accordion-header {
    +  border-width: 0 0 1px;
    +  cursor: pointer;
    +}
    +.accordion .accordion-body {
    +  border-width: 0 0 1px;
    +}
    +.accordion-noborder {
    +  border-width: 0;
    +}
    +.accordion-noborder .accordion-header {
    +  border-width: 0 0 1px;
    +}
    +.accordion-noborder .accordion-body {
    +  border-width: 0 0 1px;
    +}
    +.accordion-collapse {
    +  background: url('images/accordion_arrows.png') no-repeat 0 0;
    +}
    +.accordion-expand {
    +  background: url('images/accordion_arrows.png') no-repeat -16px 0;
    +}
    +.accordion {
    +  background: #fff;
    +  border-color: #ddd;
    +}
    +.accordion .accordion-header {
    +  background: #ffffff;
    +  filter: none;
    +}
    +.accordion .accordion-header-selected {
    +  background: #CCE6FF;
    +}
    +.accordion .accordion-header-selected .panel-title {
    +  color: #000;
    +}
    +.window {
    +  overflow: hidden;
    +  padding: 5px;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.window .window-header {
    +  background: transparent;
    +  padding: 0px 0px 6px 0px;
    +}
    +.window .window-body {
    +  border-width: 1px;
    +  border-style: solid;
    +  border-top-width: 0px;
    +}
    +.window .window-body-noheader {
    +  border-top-width: 1px;
    +}
    +.window .window-header .panel-icon,
    +.window .window-header .panel-tool {
    +  top: 50%;
    +  margin-top: -11px;
    +}
    +.window .window-header .panel-icon {
    +  left: 1px;
    +}
    +.window .window-header .panel-tool {
    +  right: 1px;
    +}
    +.window .window-header .panel-with-icon {
    +  padding-left: 18px;
    +}
    +.window-proxy {
    +  position: absolute;
    +  overflow: hidden;
    +}
    +.window-proxy-mask {
    +  position: absolute;
    +  filter: alpha(opacity=5);
    +  opacity: 0.05;
    +}
    +.window-mask {
    +  position: absolute;
    +  left: 0;
    +  top: 0;
    +  width: 100%;
    +  height: 100%;
    +  filter: alpha(opacity=40);
    +  opacity: 0.40;
    +  font-size: 1px;
    +  *zoom: 1;
    +  overflow: hidden;
    +}
    +.window,
    +.window-shadow {
    +  position: absolute;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.window-shadow {
    +  background: #eee;
    +  -moz-box-shadow: 2px 2px 3px #ededed;
    +  -webkit-box-shadow: 2px 2px 3px #ededed;
    +  box-shadow: 2px 2px 3px #ededed;
    +  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
    +}
    +.window,
    +.window .window-body {
    +  border-color: #ddd;
    +}
    +.window {
    +  background-color: #ffffff;
    +}
    +.window-proxy {
    +  border: 1px dashed #ddd;
    +}
    +.window-proxy-mask,
    +.window-mask {
    +  background: #eee;
    +}
    +.dialog-content {
    +  overflow: auto;
    +}
    +.dialog-toolbar {
    +  padding: 2px 5px;
    +}
    +.dialog-tool-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #ddd;
    +  border-right: 1px solid #fff;
    +  margin: 2px 1px;
    +}
    +.dialog-button {
    +  padding: 5px;
    +  text-align: right;
    +}
    +.dialog-button .l-btn {
    +  margin-left: 5px;
    +}
    +.dialog-toolbar,
    +.dialog-button {
    +  background: #fff;
    +}
    +.dialog-toolbar {
    +  border-bottom: 1px solid #ddd;
    +}
    +.dialog-button {
    +  border-top: 1px solid #ddd;
    +}
    +.combo {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +  vertical-align: middle;
    +}
    +.combo .combo-text {
    +  font-size: 12px;
    +  border: 0px;
    +  line-height: 20px;
    +  height: 20px !important;
    +  margin: 0;
    +  padding: 0px 2px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.combo-arrow {
    +  width: 18px;
    +  height: 20px!important;
    +  overflow: hidden;
    +  display: inline-block;
    +  vertical-align: top;
    +  cursor: pointer;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.combo-arrow-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.combo-panel {
    +  overflow: auto;
    +}
    +.combo-arrow {
    +  background: url('images/combo_arrow.png') no-repeat center center;
    +}
    +.combo,
    +.combo-panel {
    +  background-color: #fff;
    +}
    +.combo {
    +  border-color: #ddd;
    +  background-color: #fff;
    +  border-radius: 3px;
    +  padding: 4px 0 4px 5px;
    +  height: 20px !important;
    +}
    +.combo-arrow {
    +  background-color: #ffffff;
    +}
    +.combo-arrow-hover {
    +  background-color: #E6E6E6;
    +}
    +.combobox-item {
    +  padding: 2px;
    +  font-size: 12px;
    +  padding: 3px;
    +  padding-right: 0px;
    +}
    +.combobox-item-hover {
    +  background-color: #E6E6E6;
    +  color: #444;
    +}
    +.combobox-item-selected {
    +  background-color: #CCE6FF;
    +  color: #000;
    +}
    +.layout {
    +  position: relative;
    +  overflow: hidden;
    +  margin: 0;
    +  padding: 0;
    +  z-index: 0;
    +}
    +.layout-panel {
    +  position: absolute;
    +  overflow: hidden;
    +}
    +.layout-panel-east,
    +.layout-panel-west {
    +  z-index: 2;
    +}
    +.layout-panel-north,
    +.layout-panel-south {
    +  z-index: 3;
    +}
    +.layout-expand {
    +  position: absolute;
    +  padding: 0px;
    +  font-size: 1px;
    +  cursor: pointer;
    +  z-index: 1;
    +}
    +.layout-expand .panel-header,
    +.layout-expand .panel-body {
    +  background: transparent;
    +  filter: none;
    +  overflow: hidden;
    +}
    +.layout-expand .panel-header {
    +  border-bottom-width: 0px;
    +}
    +.layout-split-proxy-h,
    +.layout-split-proxy-v {
    +  position: absolute;
    +  font-size: 1px;
    +  display: none;
    +  z-index: 5;
    +}
    +.layout-split-proxy-h {
    +  width: 5px;
    +  cursor: e-resize;
    +}
    +.layout-split-proxy-v {
    +  height: 5px;
    +  cursor: n-resize;
    +}
    +.layout-mask {
    +  position: absolute;
    +  background: #fafafa;
    +  filter: alpha(opacity=10);
    +  opacity: 0.10;
    +  z-index: 4;
    +}
    +.layout-button-up {
    +  background: url('images/layout_arrows.png') no-repeat -16px -16px;
    +}
    +.layout-button-down {
    +  background: url('images/layout_arrows.png') no-repeat -16px 0;
    +}
    +.layout-button-left {
    +  background: url('images/layout_arrows.png') no-repeat 0 0;
    +}
    +.layout-button-right {
    +  background: url('images/layout_arrows.png') no-repeat 0 -16px;
    +}
    +.layout-split-proxy-h,
    +.layout-split-proxy-v {
    +  background-color: #b3b3b3;
    +}
    +.layout-split-north {
    +  border-bottom: 5px solid #fff;
    +}
    +.layout-split-south {
    +  border-top: 5px solid #fff;
    +}
    +.layout-split-east {
    +  border-left: 5px solid #fff;
    +}
    +.layout-split-west {
    +  border-right: 5px solid #fff;
    +}
    +.layout-expand {
    +  background-color: #ffffff;
    +}
    +.layout-expand-over {
    +  background-color: #ffffff;
    +}
    +.tabs-container {
    +  overflow: hidden;
    +}
    +.tabs-header {
    +  border-width: 1px;
    +  border-style: solid;
    +  border-bottom-width: 0;
    +  position: relative;
    +  padding: 0;
    +  padding-top: 2px;
    +  overflow: hidden;
    +}
    +.tabs-header-plain {
    +  border: 0;
    +  background: transparent;
    +}
    +.tabs-scroller-left,
    +.tabs-scroller-right {
    +  position: absolute;
    +  top: auto;
    +  bottom: 0;
    +  width: 18px;
    +  height: 28px !important;
    +  height: 30px;
    +  font-size: 1px;
    +  display: none;
    +  cursor: pointer;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.tabs-scroller-left {
    +  left: 0;
    +}
    +.tabs-scroller-right {
    +  right: 0;
    +}
    +.tabs-header-plain .tabs-scroller-left,
    +.tabs-header-plain .tabs-scroller-right {
    +  height: 25px !important;
    +  height: 27px;
    +}
    +.tabs-tool {
    +  position: absolute;
    +  bottom: 0;
    +  padding: 1px;
    +  overflow: hidden;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.tabs-header-plain .tabs-tool {
    +  padding: 0 1px;
    +}
    +.tabs-wrap {
    +  position: relative;
    +  left: 0;
    +  overflow: hidden;
    +  width: 100%;
    +  margin: 0;
    +  padding: 0;
    +}
    +.tabs-scrolling {
    +  margin-left: 18px;
    +  margin-right: 18px;
    +}
    +.tabs-disabled {
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +}
    +.tabs {
    +  list-style-type: none;
    +  height: 26px;
    +  margin: 0px;
    +  padding: 0px;
    +  padding-left: 4px;
    +  font-size: 12px;
    +  width: 5000px;
    +  border-style: solid;
    +  border-width: 0 0 1px 0;
    +}
    +.tabs li {
    +  float: left;
    +  display: inline-block;
    +  margin: 0 4px -1px 0;
    +  padding: 0;
    +  position: relative;
    +  border: 0;
    +}
    +.tabs li a.tabs-inner {
    +  display: inline-block;
    +  text-decoration: none;
    +  margin: 0;
    +  padding: 0 10px;
    +  height: 25px;
    +  line-height: 25px;
    +  text-align: center;
    +  white-space: nowrap;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 0px 0px 0 0;
    +  -webkit-border-radius: 0px 0px 0 0;
    +  border-radius: 0px 0px 0 0;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  font-weight: bold;
    +  outline: none;
    +}
    +.tabs li.tabs-selected a:hover.tabs-inner {
    +  cursor: default;
    +  pointer: default;
    +}
    +.tabs li a.tabs-close,
    +.tabs-p-tool {
    +  position: absolute;
    +  font-size: 1px;
    +  display: block;
    +  height: 12px;
    +  padding: 0;
    +  top: 50%;
    +  margin-top: -6px;
    +  overflow: hidden;
    +}
    +.tabs li a.tabs-close {
    +  width: 12px;
    +  right: 5px;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.tabs-p-tool {
    +  right: 16px;
    +}
    +.tabs-p-tool a {
    +  display: inline-block;
    +  font-size: 1px;
    +  width: 12px;
    +  height: 12px;
    +  margin: 0;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.tabs li a:hover.tabs-close,
    +.tabs-p-tool a:hover {
    +  opacity: 1;
    +  filter: alpha(opacity=100);
    +  cursor: hand;
    +  cursor: pointer;
    +}
    +.tabs-with-icon {
    +  padding-left: 18px;
    +}
    +.tabs-icon {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  left: 10px;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.tabs-closable {
    +  padding-right: 8px;
    +}
    +.tabs-panels {
    +  margin: 0px;
    +  padding: 0px;
    +  border-width: 1px;
    +  border-style: solid;
    +  border-top-width: 0;
    +  overflow: hidden;
    +}
    +.tabs-header-bottom {
    +  border-width: 0 1px 1px 1px;
    +  padding: 0 0 2px 0;
    +}
    +.tabs-header-bottom .tabs {
    +  border-width: 1px 0 0 0;
    +}
    +.tabs-header-bottom .tabs li {
    +  margin: -1px 4px 0 0;
    +}
    +.tabs-header-bottom .tabs li a.tabs-inner {
    +  -moz-border-radius: 0 0 0px 0px;
    +  -webkit-border-radius: 0 0 0px 0px;
    +  border-radius: 0 0 0px 0px;
    +}
    +.tabs-header-bottom .tabs-tool {
    +  top: 0;
    +}
    +.tabs-header-bottom .tabs-scroller-left,
    +.tabs-header-bottom .tabs-scroller-right {
    +  top: 0;
    +  bottom: auto;
    +}
    +.tabs-panels-top {
    +  border-width: 1px 1px 0 1px;
    +}
    +.tabs-header-left {
    +  float: left;
    +  border-width: 1px 0 1px 1px;
    +  padding: 0;
    +}
    +.tabs-header-right {
    +  float: right;
    +  border-width: 1px 1px 1px 0;
    +  padding: 0;
    +}
    +.tabs-header-left .tabs-wrap,
    +.tabs-header-right .tabs-wrap {
    +  height: 100%;
    +}
    +.tabs-header-left .tabs {
    +  height: 100%;
    +  padding: 4px 0 0 4px;
    +  border-width: 0 1px 0 0;
    +}
    +.tabs-header-right .tabs {
    +  height: 100%;
    +  padding: 4px 4px 0 0;
    +  border-width: 0 0 0 1px;
    +}
    +.tabs-header-left .tabs li,
    +.tabs-header-right .tabs li {
    +  display: block;
    +  width: 100%;
    +  position: relative;
    +}
    +.tabs-header-left .tabs li {
    +  left: auto;
    +  right: 0;
    +  margin: 0 -1px 4px 0;
    +  float: right;
    +}
    +.tabs-header-right .tabs li {
    +  left: 0;
    +  right: auto;
    +  margin: 0 0 4px -1px;
    +  float: left;
    +}
    +.tabs-header-left .tabs li a.tabs-inner {
    +  display: block;
    +  text-align: left;
    +  -moz-border-radius: 0px 0 0 0px;
    +  -webkit-border-radius: 0px 0 0 0px;
    +  border-radius: 0px 0 0 0px;
    +}
    +.tabs-header-right .tabs li a.tabs-inner {
    +  display: block;
    +  text-align: left;
    +  -moz-border-radius: 0 0px 0px 0;
    +  -webkit-border-radius: 0 0px 0px 0;
    +  border-radius: 0 0px 0px 0;
    +}
    +.tabs-panels-right {
    +  float: right;
    +  border-width: 1px 1px 1px 0;
    +}
    +.tabs-panels-left {
    +  float: left;
    +  border-width: 1px 0 1px 1px;
    +}
    +.tabs-header-noborder,
    +.tabs-panels-noborder {
    +  border: 0px;
    +}
    +.tabs-header-plain {
    +  border: 0px;
    +  background: transparent;
    +}
    +.tabs-scroller-left {
    +  background: #ffffff url('images/tabs_icons.png') no-repeat 1px center;
    +}
    +.tabs-scroller-right {
    +  background: #ffffff url('images/tabs_icons.png') no-repeat -15px center;
    +}
    +.tabs li a.tabs-close {
    +  background: url('images/tabs_icons.png') no-repeat -34px center;
    +}
    +.tabs li a.tabs-inner:hover {
    +  background: #E6E6E6;
    +  color: #444;
    +  filter: none;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  background-color: #fff;
    +  color: #777;
    +}
    +.tabs li a.tabs-inner {
    +  color: #777;
    +  background-color: #ffffff;
    +}
    +.tabs-header,
    +.tabs-tool {
    +  background-color: #ffffff;
    +}
    +.tabs-header-plain {
    +  background: transparent;
    +}
    +.tabs-header,
    +.tabs-scroller-left,
    +.tabs-scroller-right,
    +.tabs-tool,
    +.tabs,
    +.tabs-panels,
    +.tabs li a.tabs-inner,
    +.tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  border-color: #ddd;
    +}
    +.tabs-p-tool a:hover,
    +.tabs li a:hover.tabs-close,
    +.tabs-scroller-over {
    +  background-color: #E6E6E6;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  border-bottom: 1px solid #fff;
    +}
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {
    +  border-top: 1px solid #fff;
    +}
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner {
    +  border-right: 1px solid #fff;
    +}
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  border-left: 1px solid #fff;
    +}
    +a.l-btn {
    +  background-position: right 0;
    +  font-size: 12px;
    +  text-decoration: none;
    +  display: inline-block;
    +  zoom: 1;
    +  /*
    +  height: 24px;
    +  padding-right: 18px;
    +  */
    +  cursor: pointer;
    +  outline: none;
    +}
    +a.l-btn-plain {
    +  padding-right: 5px;
    +  border: 0;
    +  padding: 1px 6px 1px 1px;
    +}
    +a.l-btn-disabled {
    +  color: #ccc;
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +  cursor: default;
    +}
    +a.l-btn span.l-btn-left {
    +  display: inline-block;
    +  background-position: 0 -48px;
    +  padding: 4px 0px 4px 18px;
    +  line-height: 16px;
    +  height: 16px;
    +}
    +a.l-btn-plain span.l-btn-left {
    +  padding-left: 5px;
    +}
    +/* a.l-btn span span.l-btn-text {
    +  display: inline-block;
    +  vertical-align: baseline;
    +  width: auto;
    +  height: 16px;
    +  line-height: 16px;
    +  padding: 0;
    +} */
    +a.l-btn span span.l-btn-icon-left {
    +  padding: 0 0 0 20px;
    +  background-position: left center;
    +}
    +a.l-btn span span.l-btn-icon-right {
    +  padding: 0 20px 0 0;
    +  background-position: right center;
    +}
    +a.l-btn span span span.l-btn-empty {
    +  display: inline-block;
    +  margin: 0;
    +  padding: 0;
    +  width: 16px;
    +}
    +a:hover.l-btn {
    +  background-position: right -24px;
    +  outline: none;
    +  text-decoration: none;
    +}
    +a:hover.l-btn span.l-btn-left {
    +  background-position: 0 bottom;
    +}
    +a:hover.l-btn-plain {
    +  padding: 0 5px 0 0;
    +}
    +a:hover.l-btn-disabled {
    +  background-position: right 0;
    +}
    +a:hover.l-btn-disabled span.l-btn-left {
    +  background-position: 0 -48px;
    +}
    +a.l-btn .l-btn-focus {
    +  outline: #0000FF solid thin;
    +}
    +a.l-btn {
    +  color: #777;
    +  background-image: url('images/linkbutton_bg.png');
    +  background-repeat: no-repeat;
    +  background: #ffffff;
    +  background-repeat: repeat-x;
    +  border: 1px solid #fff;
    +  background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%);
    +  background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%);
    +  background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%);
    +  background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0);
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +a.l-btn span.l-btn-left {
    +  background-image: url('images/linkbutton_bg.png');
    +  background-repeat: no-repeat;
    +  background-image: none;
    +}
    +a:hover.l-btn {
    +  background: #fff;
    +  color: #444;
    +  border: 1px solid #fff;
    +  filter: none;
    +}
    +a.l-btn-plain,
    +a.l-btn-plain span.l-btn-left {
    +  background: transparent;
    +  border: 0;
    +  filter: none;
    +}
    +a:hover.l-btn-plain {
    +  background: #fff;
    +  color: #444;
    +  border: 1px solid #fff;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +a.l-btn-disabled,
    +a:hover.l-btn-disabled {
    +  filter: alpha(opacity=50);
    +}
    +.datagrid .panel-body {
    +  overflow: hidden;
    +  position: relative;
    +}
    +.datagrid-view {
    +  position: relative;
    +  overflow: hidden;
    +}
    +.datagrid-view1,
    +.datagrid-view2 {
    +  position: absolute;
    +  overflow: hidden;
    +  top: 0;
    +}
    +.datagrid-view1 {
    +  left: 0;
    +}
    +.datagrid-view2 {
    +  right: 0;
    +}
    +.datagrid-mask {
    +  position: absolute;
    +  left: 0;
    +  top: 0;
    +  width: 100%;
    +  height: 100%;
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +  display: none;
    +}
    +.datagrid-mask-msg {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -20px;
    +  padding: 12px 5px 10px 30px;
    +  width: auto;
    +  height: 16px;
    +  border-width: 2px;
    +  border-style: solid;
    +  display: none;
    +}
    +.datagrid-sort-icon {
    +  padding: 0;
    +}
    +.datagrid-toolbar {
    +  height: auto;
    +  padding: 5px 2px 2px 2px;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.datagrid-btn-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #ddd;
    +  border-right: 1px solid #fff;
    +  margin: 2px 1px;
    +}
    +.datagrid .datagrid-pager {
    +  margin: 0;
    +  border-width: 0 0 0 0;
    +  border-style: solid;
    +}
    +.datagrid .datagrid-pager-top {
    +  border-width: 0 0 1px 0;
    +}
    +.datagrid-header {
    +  overflow: hidden;
    +  cursor: default;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.datagrid-header-inner {
    +  float: left;
    +  width: 10000px;
    +}
    +  /*background: #EDEDED;*/
    +.datagrid-header-row{
    +  font-weight: bold;
    +  height: 25px;
    +  background-color:#f7f7f7;
    +  background:-webkit-gradient(linear, 0 0, 0 100%, from(#f7f7f7), to(#f2f2f2));
    +}
    +.datagrid-row {
    +  height: 25px;
    +}
    +.datagrid-header td{
    +  font-weight: bold;
    +  text-align: center;
    +  border-width: 0 1px 1px 0;
    +  border-style: solid;
    +  margin: 0;
    +  padding: 0;
    +  overflow: hidden;
    +}
    +.datagrid-body td,
    +.datagrid-footer td {
    +  border-width: 0 1px 1px 0;
    +  border-style: solid;
    +  margin: 0;
    +  padding: 0;
    +  overflow: hidden;
    +}
    +.datagrid-cell,
    +.datagrid-cell-group,
    +.datagrid-header-rownumber,
    +.datagrid-cell-rownumber {
    +  margin: 0;
    +  padding: 0 4px;	
    +  white-space: nowrap;
    +  word-wrap: normal;
    +  overflow: hidden;
    +  height: 36px;
    +  line-height: 36px;
    +  font-weight: normal;
    +  font-size: 12px;
    +}
    +.datagrid-cell-group {
    +  text-align: center;
    +}
    +.datagrid-header-rownumber,
    +.datagrid-cell-rownumber {
    +  width: 25px;
    +  text-align: center;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body {
    +  margin: 0;
    +  padding: 0;
    +  overflow: auto;
    +  zoom: 1;
    +}
    +.datagrid-view1 .datagrid-body-inner {
    +  padding-bottom: 20px;
    +}
    +.datagrid-view1 .datagrid-body {
    +  overflow: hidden;
    +}
    +.datagrid-footer {
    +  overflow: hidden;
    +}
    +.datagrid-footer-inner {
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +  width: 10000px;
    +  float: left;
    +}
    +.datagrid-row-editing .datagrid-cell {
    +  height: auto;
    +}
    +.datagrid-header-check,
    +.datagrid-cell-check {
    +  padding: 0;
    +  width: 27px;
    +  height: 18px;
    +  font-size: 1px;
    +  text-align: center;
    +  overflow: hidden;
    +}
    +.datagrid-header-check input,
    +.datagrid-cell-check input {
    +  margin: 0;
    +  padding: 0;
    +  width: 15px;
    +  height: 18px;
    +}
    +.datagrid-resize-proxy {
    +  position: absolute;
    +  width: 1px;
    +  height: 10000px;
    +  top: 0;
    +  cursor: e-resize;
    +  display: none;
    +}
    +.datagrid-body .datagrid-editable {
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body .datagrid-editable table {
    +  width: 100%;
    +  height: 100%;
    +}
    +.datagrid-body .datagrid-editable td {
    +  border: 0;
    +  margin: 0;
    +  padding: 0;
    +}
    +.datagrid-body .datagrid-editable .datagrid-editable-input {
    +  margin: 0;
    +  padding: 2px;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.datagrid-sort-desc .datagrid-sort-icon {
    +  padding: 0 13px 0 0;
    +  background: url('images/datagrid_icons.png') no-repeat -16px center;
    +}
    +.datagrid-sort-asc .datagrid-sort-icon {
    +  padding: 0 13px 0 0;
    +  background: url('images/datagrid_icons.png') no-repeat 0px center;
    +}
    +.datagrid-row-collapse {
    +  background: url('images/datagrid_icons.png') no-repeat -48px center;
    +}
    +.datagrid-row-expand {
    +  background: url('images/datagrid_icons.png') no-repeat -32px center;
    +}
    +.datagrid-mask-msg {
    +  background: #fff url('images/loading.gif') no-repeat scroll 5px center;
    +}
    +.datagrid-header,
    +.datagrid-td-rownumber {
    +  background-color: #ffffff;
    +}
    +.datagrid-cell-rownumber {
    +  color: #444;
    +}
    +.datagrid-resize-proxy {
    +  background: #b3b3b3;
    +}
    +.datagrid-mask {
    +  background: #eee;
    +}
    +.datagrid-mask-msg {
    +  border-color: #ddd;
    +}
    +.datagrid-toolbar,
    +.datagrid-pager {
    +  background: #fff;
    +}
    +.datagrid-header,
    +.datagrid-toolbar,
    +.datagrid-pager,
    +.datagrid-footer-inner {
    +  border-color: #ddd;
    +}
    +.datagrid-header td{
    +   font-weight: bold;
    +   border-color: #ddd;
    +}
    +.datagrid-body td,
    +.datagrid-footer td {
    +  border-color: #ddd;
    +}
    +.datagrid-htable,
    +.datagrid-btable,
    +.datagrid-ftable {
    +  color: #444;
    +}
    +.datagrid-row-alt {
    +  background: #f5f5f5;
    +}
    +.datagrid-row-over{
    +  background: #E6E6E6;
    +  color: #444;
    +  cursor: default;
    +  font-weight: normal;
    +}
    +.datagrid-header td.datagrid-header-over {
    +  background: #E6E6E6;
    +  color: #444;
    +  cursor: default;
    +  font-weight: bold;
    +}
    +.datagrid-row-selected {
    +  background: #CCE6FF;
    +  color: #000;
    +}
    +.datagrid-body .datagrid-editable .datagrid-editable-input {
    +  border-color: #ddd;
    +}
    +.propertygrid .datagrid-view1 .datagrid-body td {
    +  padding-bottom: 1px;
    +  border-width: 0 1px 0 0;
    +}
    +.propertygrid .datagrid-group {
    +  height: 21px;
    +  overflow: hidden;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.propertygrid .datagrid-group span {
    +  font-weight: bold;
    +}
    +.propertygrid .datagrid-view1 .datagrid-body td {
    +  border-color: #ddd;
    +}
    +.propertygrid .datagrid-view1 .datagrid-group {
    +  border-color: #ffffff;
    +}
    +.propertygrid .datagrid-view2 .datagrid-group {
    +  border-color: #ddd;
    +}
    +.propertygrid .datagrid-group,
    +.propertygrid .datagrid-view1 .datagrid-body,
    +.propertygrid .datagrid-view1 .datagrid-row-over,
    +.propertygrid .datagrid-view1 .datagrid-row-selected {
    +  background: #ffffff;
    +}
    +.pagination {
    +  zoom: 1;
    +}
    +.pagination table {
    +  float: left;
    +  height: 30px;
    +}
    +.pagination td {
    +  border: 0;
    +}
    +.pagination-btn-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #ddd;
    +  border-right: 1px solid #fff;
    +  margin: 3px 1px;
    +}
    +.pagination .pagination-num {
    +  border-width: 1px;
    +  border-style: solid;
    +  margin: 0 2px;
    +  padding: 2px;
    +  width: 2em;
    +  height: auto;
    +}
    +.pagination-page-list {
    +  margin: 0px 6px;
    +  padding: 1px 2px;
    +  width: auto;
    +  height: auto;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.pagination-info {
    +  float: right;
    +  margin: 0 6px 0 0;
    +  padding: 0;
    +  height: 30px;
    +  line-height: 30px;
    +  font-size: 12px;
    +}
    +.pagination span {
    +  font-size: 12px;
    +}
    +.pagination-first {
    +  background: url('images/pagination_icons.png') no-repeat 0 0;
    +}
    +.pagination-prev {
    +  background: url('images/pagination_icons.png') no-repeat -16px 0;
    +}
    +.pagination-next {
    +  background: url('images/pagination_icons.png') no-repeat -32px 0;
    +}
    +.pagination-last {
    +  background: url('images/pagination_icons.png') no-repeat -48px 0;
    +}
    +.pagination-load {
    +  background: url('images/pagination_icons.png') no-repeat -64px 0;
    +}
    +.pagination-loading {
    +  background: url('images/loading.gif') no-repeat;
    +}
    +.pagination-page-list,
    +.pagination .pagination-num {
    +  border-color: #ddd;
    +}
    +.calendar {
    +  border-width: 1px;
    +  border-style: solid;
    +  padding: 1px;
    +  overflow: hidden;
    +  font-size: 12px;
    +}
    +.calendar table {
    +  border-collapse: separate;
    +  font-size: 12px;
    +  width: 100%;
    +  height: 100%;
    +}
    +.calendar-noborder {
    +  border: 0;
    +}
    +.calendar-header {
    +  position: relative;
    +  height: 22px;
    +}
    +.calendar-title {
    +  text-align: center;
    +  height: 22px;
    +}
    +.calendar-title span {
    +  position: relative;
    +  display: inline-block;
    +  top: 2px;
    +  padding: 0 3px;
    +  height: 18px;
    +  line-height: 18px;
    +  cursor: pointer;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.calendar-prevmonth,
    +.calendar-nextmonth,
    +.calendar-prevyear,
    +.calendar-nextyear {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -7px;
    +  width: 14px;
    +  height: 14px;
    +  cursor: pointer;
    +  font-size: 1px;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.calendar-prevmonth {
    +  left: 20px;
    +  background: url('images/calendar_arrows.png') no-repeat -18px -2px;
    +}
    +.calendar-nextmonth {
    +  right: 20px;
    +  background: url('images/calendar_arrows.png') no-repeat -34px -2px;
    +}
    +.calendar-prevyear {
    +  left: 3px;
    +  background: url('images/calendar_arrows.png') no-repeat -1px -2px;
    +}
    +.calendar-nextyear {
    +  right: 3px;
    +  background: url('images/calendar_arrows.png') no-repeat -49px -2px;
    +}
    +.calendar-body {
    +  position: relative;
    +}
    +.calendar-body th,
    +.calendar-body td {
    +  text-align: center;
    +}
    +.calendar-day {
    +  border: 0;
    +  padding: 1px;
    +  cursor: pointer;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.calendar-other-month {
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +}
    +.calendar-menu {
    +  position: absolute;
    +  top: 0;
    +  left: 0;
    +  width: 180px;
    +  height: 150px;
    +  padding: 5px;
    +  font-size: 12px;
    +  display: none;
    +  overflow: hidden;
    +}
    +.calendar-menu-year-inner {
    +  text-align: center;
    +  padding-bottom: 5px;
    +}
    +.calendar-menu-year {
    +  width: 40px;
    +  text-align: center;
    +  border-width: 1px;
    +  border-style: solid;
    +  margin: 0;
    +  padding: 2px;
    +  font-weight: bold;
    +}
    +.calendar-menu-prev,
    +.calendar-menu-next {
    +  display: inline-block;
    +  width: 21px;
    +  height: 21px;
    +  vertical-align: top;
    +  cursor: pointer;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.calendar-menu-prev {
    +  margin-right: 10px;
    +  background: url('images/calendar_arrows.png') no-repeat 2px 2px;
    +}
    +.calendar-menu-next {
    +  margin-left: 10px;
    +  background: url('images/calendar_arrows.png') no-repeat -45px 2px;
    +}
    +.calendar-menu-month {
    +  text-align: center;
    +  cursor: pointer;
    +  font-weight: bold;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.calendar-body th,
    +.calendar-menu-month {
    +  color: #919191;
    +}
    +.calendar-day {
    +  color: #444;
    +}
    +.calendar-sunday {
    +  color: #CC2222;
    +}
    +.calendar-saturday {
    +  color: #00ee00;
    +}
    +.calendar-today {
    +  color: #0000ff;
    +}
    +.calendar-menu-year {
    +  border-color: #ddd;
    +}
    +.calendar {
    +  border-color: #ddd;
    +}
    +.calendar-header {
    +  background: #ffffff;
    +}
    +.calendar-body,
    +.calendar-menu {
    +  background: #fff;
    +}
    +.calendar-body th {
    +  background: #fff;
    +}
    +.calendar-hover,
    +.calendar-nav-hover,
    +.calendar-menu-hover {
    +  background-color: #E6E6E6;
    +  color: #444;
    +}
    +.calendar-hover {
    +  border: 1px solid #ddd;
    +  padding: 0;
    +}
    +.calendar-selected {
    +  background-color: #CCE6FF;
    +  color: #000;
    +  border: 1px solid #99cdff;
    +  padding: 0;
    +}
    +.datebox-calendar-inner {
    +  height: 180px;
    +}
    +.datebox-button {
    +  height: 18px;
    +  padding: 2px 5px;
    +  font-size: 12px;
    +  text-align: center;
    +}
    +.datebox-current,
    +.datebox-close,
    +.datebox-ok {
    +  text-decoration: none;
    +  font-weight: bold;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.datebox-current,
    +.datebox-close {
    +  float: left;
    +}
    +.datebox-close {
    +  float: right;
    +}
    +.datebox-button-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.datebox .combo-arrow {
    +  background-image: url('images/datebox_arrow.png');
    +  background-position: center center;
    +}
    +.datebox-button {
    +  background-color: #fff;
    +}
    +.datebox-current,
    +.datebox-close,
    +.datebox-ok {
    +  color: #777;
    +}
    +.spinner {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +  vertical-align: middle;
    +}
    +.spinner .spinner-text {
    +  font-size: 12px;
    +  border: 0px;
    +  line-height: 20px;
    +  height: 20px;
    +  margin: 0;
    +  padding: 0 2px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.spinner-arrow {
    +  display: inline-block;
    +  overflow: hidden;
    +  vertical-align: top;
    +  margin: 0;
    +  padding: 0;
    +}
    +.spinner-arrow-up,
    +.spinner-arrow-down {
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +  display: block;
    +  font-size: 1px;
    +  width: 18px;
    +  height: 10px;
    +}
    +.spinner-arrow-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.spinner-arrow-up {
    +  background: url('images/spinner_arrows.png') no-repeat 1px center;
    +}
    +.spinner-arrow-down {
    +  background: url('images/spinner_arrows.png') no-repeat -15px center;
    +}
    +.spinner {
    +  border-color: #ddd;
    +}
    +.spinner-arrow {
    +  background-color: #ffffff;
    +}
    +.spinner-arrow-hover {
    +  background-color: #E6E6E6;
    +}
    +.progressbar {
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +  overflow: hidden;
    +}
    +.progressbar-text {
    +  text-align: center;
    +  position: absolute;
    +}
    +.progressbar-value {
    +  position: relative;
    +  overflow: hidden;
    +  width: 0;
    +  -moz-border-radius: 0px 0 0 0px;
    +  -webkit-border-radius: 0px 0 0 0px;
    +  border-radius: 0px 0 0 0px;
    +}
    +.progressbar {
    +  border-color: #ddd;
    +}
    +.progressbar-text {
    +  color: #444;
    +}
    +.progressbar-value .progressbar-text {
    +  background-color: #CCE6FF;
    +  color: #000;
    +}
    +.searchbox {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +}
    +.searchbox .searchbox-text {
    +  font-size: 12px;
    +  border: 0;
    +  margin: 0;
    +  padding: 0;
    +  line-height: 20px;
    +  height: 20px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.searchbox .searchbox-prompt {
    +  font-size: 12px;
    +  color: #ccc;
    +}
    +.searchbox-button {
    +  width: 18px;
    +  height: 20px;
    +  overflow: hidden;
    +  display: inline-block;
    +  vertical-align: top;
    +  cursor: pointer;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.searchbox-button-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.searchbox a.l-btn-plain {
    +  height: 20px;
    +  border: 0;
    +  padding: 0 6px 0 0;
    +  vertical-align: top;
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.searchbox a.l-btn .l-btn-left {
    +  padding: 2px 0 2px 4px;
    +}
    +.searchbox a.l-btn-plain:hover {
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +  border: 0;
    +  padding: 0 6px 0 0;
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.searchbox a.m-btn-plain-active {
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +}
    +.searchbox-button {
    +  background: url('images/searchbox_button.png') no-repeat center center;
    +}
    +.searchbox {
    +  border-color: #ddd;
    +  background-color: #fff;
    +}
    +.searchbox a.l-btn-plain {
    +  background: #ffffff;
    +}
    +.slider-disabled {
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +}
    +.slider-h {
    +  height: 22px;
    +}
    +.slider-v {
    +  width: 22px;
    +}
    +.slider-inner {
    +  position: relative;
    +  height: 6px;
    +  top: 7px;
    +  border-width: 1px;
    +  border-style: solid;
    +  border-radius: 3px;
    +}
    +.slider-handle {
    +  position: absolute;
    +  display: block;
    +  outline: none;
    +  width: 20px;
    +  height: 20px;
    +  top: -7px;
    +  margin-left: -10px;
    +}
    +.slider-tip {
    +  position: absolute;
    +  display: inline-block;
    +  line-height: 12px;
    +  white-space: nowrap;
    +  top: -22px;
    +}
    +.slider-rule {
    +  position: relative;
    +  top: 15px;
    +}
    +.slider-rule span {
    +  position: absolute;
    +  display: inline-block;
    +  font-size: 0;
    +  height: 5px;
    +  border-width: 0 0 0 1px;
    +  border-style: solid;
    +}
    +.slider-rulelabel {
    +  position: relative;
    +  top: 20px;
    +}
    +.slider-rulelabel span {
    +  position: absolute;
    +  display: inline-block;
    +}
    +.slider-v .slider-inner {
    +  width: 6px;
    +  left: 7px;
    +  top: 0;
    +  float: left;
    +}
    +.slider-v .slider-handle {
    +  left: 3px;
    +  margin-top: -10px;
    +}
    +.slider-v .slider-tip {
    +  left: -10px;
    +  margin-top: -6px;
    +}
    +.slider-v .slider-rule {
    +  float: left;
    +  top: 0;
    +  left: 16px;
    +}
    +.slider-v .slider-rule span {
    +  width: 5px;
    +  height: 'auto';
    +  border-left: 0;
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +}
    +.slider-v .slider-rulelabel {
    +  float: left;
    +  top: 0;
    +  left: 23px;
    +}
    +.slider-handle {
    +  background: url('images/slider_handle.png') no-repeat;
    +}
    +.slider-inner {
    +  border-color: #ddd;
    +  background: #ffffff;
    +}
    +.slider-rule span {
    +  border-color: #ddd;
    +}
    +.slider-rulelabel span {
    +  color: #444;
    +}
    +.menu {
    +  position: absolute;
    +  margin: 0;
    +  padding: 2px;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +}
    +.menu-item {
    +  position: relative;
    +  margin: 0;
    +  padding: 0;
    +  overflow: hidden;
    +  white-space: nowrap;
    +  cursor: pointer;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.menu-text {
    +  height: 20px;
    +  line-height: 20px;
    +  float: left;
    +  padding-left: 28px;
    +}
    +.menu-icon {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  left: 2px;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.menu-rightarrow {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  right: 0;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.menu-line {
    +  position: absolute;
    +  left: 26px;
    +  top: 0;
    +  height: 2000px;
    +  font-size: 1px;
    +}
    +.menu-sep {
    +  margin: 3px 0px 3px 25px;
    +  font-size: 1px;
    +}
    +.menu-active {
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.menu-item-disabled {
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +  cursor: default;
    +}
    +.menu-text,
    +.menu-text span {
    +  font-size: 12px;
    +}
    +.menu-shadow {
    +  position: absolute;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +  background: #eee;
    +  -moz-box-shadow: 2px 2px 3px #ededed;
    +  -webkit-box-shadow: 2px 2px 3px #ededed;
    +  box-shadow: 2px 2px 3px #ededed;
    +  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
    +}
    +.menu-rightarrow {
    +  background: url('images/menu_arrows.png') no-repeat -32px center;
    +}
    +.menu-line {
    +  border-left: 1px solid #ddd;
    +  border-right: 1px solid #fff;
    +}
    +.menu-sep {
    +  border-top: 1px solid #ddd;
    +  border-bottom: 1px solid #fff;
    +}
    +.menu {
    +  background-color: #ffffff;
    +  border-color: #ddd;
    +  color: #444;
    +}
    +.menu-content {
    +  background: #fff;
    +}
    +.menu-item {
    +  border-color: transparent;
    +  _border-color: #ffffff;
    +}
    +.menu-active {
    +  border-color: #ddd;
    +  color: #444;
    +  background: #E6E6E6;
    +}
    +.menu-active-disabled {
    +  border-color: transparent;
    +  background: transparent;
    +  color: #444;
    +}
    +.m-btn-downarrow {
    +  display: inline-block;
    +  width: 16px;
    +  height: 16px;
    +  line-height: 16px;
    +  _vertical-align: middle;
    +}
    +a.m-btn-active {
    +  background-position: bottom right;
    +}
    +a.m-btn-active span.l-btn-left {
    +  background-position: bottom left;
    +}
    +a.m-btn-plain-active {
    +  background: transparent;
    +  padding: 0 5px 0 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.m-btn-downarrow {
    +  background: url('images/menu_arrows.png') no-repeat 2px center;
    +}
    +a.m-btn-plain-active {
    +  border-color: #ddd;
    +  background-color: #E6E6E6;
    +  color: #444;
    +}
    +.s-btn-downarrow {
    +  display: inline-block;
    +  margin: 0 0 0 4px;
    +  padding: 0 0 0 1px;
    +  width: 14px;
    +  height: 16px;
    +  line-height: 16px;
    +  border-width: 0;
    +  border-style: solid;
    +  _vertical-align: middle;
    +}
    +a.s-btn-active {
    +  background-position: bottom right;
    +}
    +a.s-btn-active span.l-btn-left {
    +  background-position: bottom left;
    +}
    +a.s-btn-plain-active {
    +  background: transparent;
    +  padding: 0 5px 0 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.s-btn-downarrow {
    +  background: url('images/menu_arrows.png') no-repeat 2px center;
    +  border-color: #b3b3b3;
    +}
    +a:hover.l-btn .s-btn-downarrow,
    +a.s-btn-active .s-btn-downarrow,
    +a.s-btn-plain-active .s-btn-downarrow {
    +  background-position: 1px center;
    +  padding: 0;
    +  border-width: 0 0 0 1px;
    +}
    +a.s-btn-plain-active {
    +  border-color: #ddd;
    +  background-color: #E6E6E6;
    +  color: #444;
    +}
    +.messager-body {
    +  padding: 10px;
    +  overflow: hidden;
    +}
    +.messager-button {
    +  text-align: center;
    +  padding-top: 10px;
    +}
    +.messager-icon {
    +  float: left;
    +  width: 32px;
    +  height: 32px;
    +  margin: 0 10px 10px 0;
    +}
    +.messager-error {
    +  background: url('images/messager_icons.png') no-repeat scroll -64px 0;
    +}
    +.messager-info {
    +  background: url('images/messager_icons.png') no-repeat scroll 0 0;
    +}
    +.messager-question {
    +  background: url('images/messager_icons.png') no-repeat scroll -32px 0;
    +}
    +.messager-warning {
    +  background: url('images/messager_icons.png') no-repeat scroll -96px 0;
    +}
    +.messager-progress {
    +  padding: 10px;
    +}
    +.messager-p-msg {
    +  margin-bottom: 5px;
    +}
    +.messager-body .messager-input {
    +  width: 100%;
    +  padding: 1px 0;
    +  border: 1px solid #ddd;
    +}
    +.tree {
    +  margin: 0;
    +  padding: 0;
    +  list-style-type: none;
    +}
    +.tree li {
    +  white-space: nowrap;
    +}
    +.tree li ul {
    +  list-style-type: none;
    +  margin: 0;
    +  padding: 0;
    +}
    +.tree-node {
    +  height: 18px;
    +  white-space: nowrap;
    +  cursor: pointer;
    +}
    +.tree-hit {
    +  cursor: pointer;
    +}
    +.tree-expanded,
    +.tree-collapsed,
    +.tree-folder,
    +.tree-file,
    +.tree-checkbox,
    +.tree-indent {
    +  display: inline-block;
    +  width: 16px;
    +  height: 18px;
    +  vertical-align: top;
    +  overflow: hidden;
    +}
    +.tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -18px 0px;
    +}
    +.tree-expanded-hover {
    +  background: url('images/tree_icons.png') no-repeat -50px 0px;
    +}
    +.tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat 0px 0px;
    +}
    +.tree-collapsed-hover {
    +  background: url('images/tree_icons.png') no-repeat -32px 0px;
    +}
    +.tree-lines .tree-expanded,
    +.tree-lines .tree-root-first .tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -144px 0;
    +}
    +.tree-lines .tree-collapsed,
    +.tree-lines .tree-root-first .tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat -128px 0;
    +}
    +.tree-lines .tree-node-last .tree-expanded,
    +.tree-lines .tree-root-one .tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -80px 0;
    +}
    +.tree-lines .tree-node-last .tree-collapsed,
    +.tree-lines .tree-root-one .tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat -64px 0;
    +}
    +.tree-line {
    +  background: url('images/tree_icons.png') no-repeat -176px 0;
    +}
    +.tree-join {
    +  background: url('images/tree_icons.png') no-repeat -192px 0;
    +}
    +.tree-joinbottom {
    +  background: url('images/tree_icons.png') no-repeat -160px 0;
    +}
    +.tree-folder {
    +  background: url('images/tree_icons.png') no-repeat -208px 0;
    +}
    +.tree-folder-open {
    +  background: url('images/tree_icons.png') no-repeat -224px 0;
    +}
    +.tree-file {
    +  background: url('images/tree_icons.png') no-repeat -240px 0;
    +}
    +.tree-loading {
    +  background: url('images/loading.gif') no-repeat center center;
    +}
    +.tree-checkbox0 {
    +  background: url('images/tree_icons.png') no-repeat -208px -18px;
    +}
    +.tree-checkbox1 {
    +  background: url('images/tree_icons.png') no-repeat -224px -18px;
    +}
    +.tree-checkbox2 {
    +  background: url('images/tree_icons.png') no-repeat -240px -18px;
    +}
    +.tree-title {
    +  font-size: 12px;
    +  display: inline-block;
    +  text-decoration: none;
    +  vertical-align: top;
    +  white-space: nowrap;
    +  padding: 0 2px;
    +  height: 18px;
    +  line-height: 18px;
    +}
    +.tree-node-proxy {
    +  font-size: 12px;
    +  line-height: 20px;
    +  padding: 0 2px 0 20px;
    +  border-width: 1px;
    +  border-style: solid;
    +  z-index: 9900000;
    +}
    +.tree-dnd-icon {
    +  display: inline-block;
    +  position: absolute;
    +  width: 16px;
    +  height: 18px;
    +  left: 2px;
    +  top: 50%;
    +  margin-top: -9px;
    +}
    +.tree-dnd-yes {
    +  background: url('images/tree_icons.png') no-repeat -256px 0;
    +}
    +.tree-dnd-no {
    +  background: url('images/tree_icons.png') no-repeat -256px -18px;
    +}
    +.tree-node-top {
    +  border-top: 1px solid red;
    +}
    +.tree-node-bottom {
    +  border-bottom: 1px solid red;
    +}
    +.tree-node-append .tree-title {
    +  border: 1px solid red;
    +}
    +.tree-editor {
    +  border: 1px solid #ccc;
    +  font-size: 12px;
    +  height: 14px !important;
    +  height: 18px;
    +  line-height: 14px;
    +  padding: 1px 2px;
    +  width: 80px;
    +  position: absolute;
    +  top: 0;
    +}
    +.tree-node-proxy {
    +  background-color: #fff;
    +  color: #444;
    +  border-color: #ddd;
    +}
    +.tree-node-hover {
    +  background: #E6E6E6;
    +  color: #444;
    +}
    +.tree-node-selected {
    +  background: #CCE6FF;
    +  color: #000;
    +}
    +.validatebox-tip {
    +  position: absolute;
    +  width: 200px;
    +  height: auto;
    +  display: none;
    +  z-index: 9900000;
    +}
    +.validatebox-tip-content {
    +  display: inline-block;
    +  position: absolute;
    +  top: 0px;
    +  left: 8px;
    +  width: 150px;
    +  border-width: 1px;
    +  border-style: solid;
    +  padding: 3px 5px;
    +  z-index: 9900001;
    +  font-size: 12px;
    +}
    +.validatebox-tip-pointer {
    +  display: inline-block;
    +  width: 8px;
    +  height: 16px;
    +  position: absolute;
    +  left: 1px;
    +  top: 0px;
    +  z-index: 9900002;
    +}
    +.validatebox-tip-left .validatebox-tip-content {
    +  left: auto;
    +  right: 8px;
    +}
    +.validatebox-tip-left .validatebox-tip-pointer {
    +  background-position: -20px center;
    +  left: auto;
    +  right: 1px;
    +}
    +.validatebox-invalid {
    +  background-image: url('images/validatebox_warning.png');
    +  background-repeat: no-repeat;
    +  background-position: right center;
    +  border-color: #ffa8a8;
    +  background-color: #fff3f3;
    +  color: #000;
    +}
    +.validatebox-tip-pointer {
    +  background: url('images/validatebox_arrows.png') no-repeat -4px center;
    +}
    +.validatebox-tip-content {
    +  border-color: #CC9933;
    +  background-color: #FFFFCC;
    +  color: #000;
    +}
    +
    +.shortcut{
    +	margin-left: 5px;
    +	margin-top: 8px;
    +	height: 62px;
    +}
    +.shortcut li{
    +	float: left;
    +	list-style: none;
    +	margin-right: 10px;
    +	cursor: pointer;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/Thumbs.db b/src/main/webapp/plug-in/easyui/themes/metro/images/Thumbs.db
    new file mode 100644
    index 00000000..5f257a2a
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/Thumbs.db differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/accordion_arrows.png b/src/main/webapp/plug-in/easyui/themes/metro/images/accordion_arrows.png
    new file mode 100644
    index 00000000..720835f6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/accordion_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/accordion_collapse.png b/src/main/webapp/plug-in/easyui/themes/metro/images/accordion_collapse.png
    new file mode 100644
    index 00000000..1919d8c1
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/accordion_collapse.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/accordion_expand.png b/src/main/webapp/plug-in/easyui/themes/metro/images/accordion_expand.png
    new file mode 100644
    index 00000000..20280cc4
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/accordion_expand.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/blank.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/blank.gif
    new file mode 100644
    index 00000000..1d11fa9a
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/blank.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_arrows.png b/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_arrows.png
    new file mode 100644
    index 00000000..430c4ad6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_nextmonth.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_nextmonth.gif
    new file mode 100644
    index 00000000..f6a903e7
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_nextmonth.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_nextyear.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_nextyear.gif
    new file mode 100644
    index 00000000..4b2e7e0b
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_nextyear.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_prevmonth.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_prevmonth.gif
    new file mode 100644
    index 00000000..927325ba
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_prevmonth.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_prevyear.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_prevyear.gif
    new file mode 100644
    index 00000000..e8427779
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/calendar_prevyear.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/combo_arrow.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/combo_arrow.gif
    new file mode 100644
    index 00000000..99f8ba53
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/combo_arrow.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/combo_arrow.png b/src/main/webapp/plug-in/easyui/themes/metro/images/combo_arrow.png
    new file mode 100644
    index 00000000..2e59fb9f
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/combo_arrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_icons.png b/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_icons.png
    new file mode 100644
    index 00000000..747ac4d1
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_row_collapse.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_row_collapse.gif
    new file mode 100644
    index 00000000..9e1d56b9
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_row_collapse.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_row_expand.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_row_expand.gif
    new file mode 100644
    index 00000000..1624b066
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_row_expand.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_sort_asc.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_sort_asc.gif
    new file mode 100644
    index 00000000..67a2a4c6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_sort_asc.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_sort_desc.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_sort_desc.gif
    new file mode 100644
    index 00000000..34db47c3
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/datagrid_sort_desc.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/datebox_arrow.png b/src/main/webapp/plug-in/easyui/themes/metro/images/datebox_arrow.png
    new file mode 100644
    index 00000000..783c8335
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/datebox_arrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/layout_arrows.png b/src/main/webapp/plug-in/easyui/themes/metro/images/layout_arrows.png
    new file mode 100644
    index 00000000..6f416542
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/layout_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/linkbutton_bg.png b/src/main/webapp/plug-in/easyui/themes/metro/images/linkbutton_bg.png
    new file mode 100644
    index 00000000..fc66bd2c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/linkbutton_bg.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/loading.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/loading.gif
    new file mode 100644
    index 00000000..68f01d04
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/loading.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/menu_arrows.png b/src/main/webapp/plug-in/easyui/themes/metro/images/menu_arrows.png
    new file mode 100644
    index 00000000..b986842e
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/menu_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/menu_downarrow.png b/src/main/webapp/plug-in/easyui/themes/metro/images/menu_downarrow.png
    new file mode 100644
    index 00000000..f03dfee4
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/menu_downarrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/menu_rightarrow.png b/src/main/webapp/plug-in/easyui/themes/metro/images/menu_rightarrow.png
    new file mode 100644
    index 00000000..ea4f6602
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/menu_rightarrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/menu_sep.png b/src/main/webapp/plug-in/easyui/themes/metro/images/menu_sep.png
    new file mode 100644
    index 00000000..37b07e6c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/menu_sep.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/menu_split_downarrow.png b/src/main/webapp/plug-in/easyui/themes/metro/images/menu_split_downarrow.png
    new file mode 100644
    index 00000000..b33a93ff
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/menu_split_downarrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/messager_error.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/messager_error.gif
    new file mode 100644
    index 00000000..397b655a
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/messager_error.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/messager_icons.png b/src/main/webapp/plug-in/easyui/themes/metro/images/messager_icons.png
    new file mode 100644
    index 00000000..62c18c13
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/messager_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/messager_info.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/messager_info.gif
    new file mode 100644
    index 00000000..58281c30
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/messager_info.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/messager_question.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/messager_question.gif
    new file mode 100644
    index 00000000..08abd82a
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/messager_question.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/messager_warning.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/messager_warning.gif
    new file mode 100644
    index 00000000..27ff98b4
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/messager_warning.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_first.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_first.gif
    new file mode 100644
    index 00000000..d84f41a9
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_first.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_icons.png b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_icons.png
    new file mode 100644
    index 00000000..ccf9d038
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_last.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_last.gif
    new file mode 100644
    index 00000000..3df5c2ba
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_last.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_load.png b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_load.png
    new file mode 100644
    index 00000000..d65defbc
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_load.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_loading.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_loading.gif
    new file mode 100644
    index 00000000..68f01d04
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_loading.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_next.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_next.gif
    new file mode 100644
    index 00000000..96016353
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_next.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_prev.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_prev.gif
    new file mode 100644
    index 00000000..eb70cf8f
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/pagination_prev.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/panel_loading.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/panel_loading.gif
    new file mode 100644
    index 00000000..68f01d04
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/panel_loading.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/panel_tools.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/panel_tools.gif
    new file mode 100644
    index 00000000..b8ac4271
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/panel_tools.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/panel_tools.png b/src/main/webapp/plug-in/easyui/themes/metro/images/panel_tools.png
    new file mode 100644
    index 00000000..fe682ef8
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/panel_tools.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/searchbox_button.png b/src/main/webapp/plug-in/easyui/themes/metro/images/searchbox_button.png
    new file mode 100644
    index 00000000..6dd19315
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/searchbox_button.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/slider_handle.png b/src/main/webapp/plug-in/easyui/themes/metro/images/slider_handle.png
    new file mode 100644
    index 00000000..b9802bae
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/slider_handle.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/spinner_arrows.png b/src/main/webapp/plug-in/easyui/themes/metro/images/spinner_arrows.png
    new file mode 100644
    index 00000000..b68592de
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/spinner_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tabs_close.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/tabs_close.gif
    new file mode 100644
    index 00000000..2bdd6239
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tabs_close.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tabs_icons.png b/src/main/webapp/plug-in/easyui/themes/metro/images/tabs_icons.png
    new file mode 100644
    index 00000000..4d29966d
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tabs_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tabs_leftarrow.png b/src/main/webapp/plug-in/easyui/themes/metro/images/tabs_leftarrow.png
    new file mode 100644
    index 00000000..629676c3
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tabs_leftarrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tabs_rightarrow.png b/src/main/webapp/plug-in/easyui/themes/metro/images/tabs_rightarrow.png
    new file mode 100644
    index 00000000..6a6ed7d8
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tabs_rightarrow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tree_arrows.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_arrows.gif
    new file mode 100644
    index 00000000..26834639
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_arrows.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tree_checkbox_0.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_checkbox_0.gif
    new file mode 100644
    index 00000000..9e00266b
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_checkbox_0.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tree_checkbox_1.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_checkbox_1.gif
    new file mode 100644
    index 00000000..ad12ced6
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_checkbox_1.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tree_checkbox_2.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_checkbox_2.gif
    new file mode 100644
    index 00000000..12931df5
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_checkbox_2.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tree_dnd_no.png b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_dnd_no.png
    new file mode 100644
    index 00000000..c73eec24
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_dnd_no.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tree_dnd_yes.png b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_dnd_yes.png
    new file mode 100644
    index 00000000..362ceeeb
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_dnd_yes.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tree_elbow.png b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_elbow.png
    new file mode 100644
    index 00000000..df2893e1
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_elbow.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tree_file.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_file.gif
    new file mode 100644
    index 00000000..1af80ce7
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_file.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tree_folder.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_folder.gif
    new file mode 100644
    index 00000000..20412f7c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_folder.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tree_folder_open.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_folder_open.gif
    new file mode 100644
    index 00000000..56ba737b
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_folder_open.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tree_icons.png b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_icons.png
    new file mode 100644
    index 00000000..e9be4f3a
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_icons.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/tree_loading.gif b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_loading.gif
    new file mode 100644
    index 00000000..68f01d04
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/tree_loading.gif differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/validatebox_arrows.png b/src/main/webapp/plug-in/easyui/themes/metro/images/validatebox_arrows.png
    new file mode 100644
    index 00000000..5fe78f7c
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/validatebox_arrows.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/images/validatebox_warning.png b/src/main/webapp/plug-in/easyui/themes/metro/images/validatebox_warning.png
    new file mode 100644
    index 00000000..2b3d4f05
    Binary files /dev/null and b/src/main/webapp/plug-in/easyui/themes/metro/images/validatebox_warning.png differ
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/layout.css b/src/main/webapp/plug-in/easyui/themes/metro/layout.css
    new file mode 100644
    index 00000000..7057fb2b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/layout.css
    @@ -0,0 +1,91 @@
    +.layout {
    +  position: relative;
    +  overflow: hidden;
    +  margin: 0;
    +  padding: 0;
    +  z-index: 0;
    +}
    +.layout-panel {
    +  position: absolute;
    +  overflow: hidden;
    +}
    +.layout-panel-east,
    +.layout-panel-west {
    +  z-index: 2;
    +}
    +.layout-panel-north,
    +.layout-panel-south {
    +  z-index: 3;
    +}
    +.layout-expand {
    +  position: absolute;
    +  padding: 0px;
    +  font-size: 1px;
    +  cursor: pointer;
    +  z-index: 1;
    +}
    +.layout-expand .panel-header,
    +.layout-expand .panel-body {
    +  background: transparent;
    +  filter: none;
    +  overflow: hidden;
    +}
    +.layout-expand .panel-header {
    +  border-bottom-width: 0px;
    +}
    +.layout-split-proxy-h,
    +.layout-split-proxy-v {
    +  position: absolute;
    +  font-size: 1px;
    +  display: none;
    +  z-index: 5;
    +}
    +.layout-split-proxy-h {
    +  width: 5px;
    +  cursor: e-resize;
    +}
    +.layout-split-proxy-v {
    +  height: 5px;
    +  cursor: n-resize;
    +}
    +.layout-mask {
    +  position: absolute;
    +  background: #fafafa;
    +  filter: alpha(opacity=10);
    +  opacity: 0.10;
    +  z-index: 4;
    +}
    +.layout-button-up {
    +  background: url('images/layout_arrows.png') no-repeat -16px -16px;
    +}
    +.layout-button-down {
    +  background: url('images/layout_arrows.png') no-repeat -16px 0;
    +}
    +.layout-button-left {
    +  background: url('images/layout_arrows.png') no-repeat 0 0;
    +}
    +.layout-button-right {
    +  background: url('images/layout_arrows.png') no-repeat 0 -16px;
    +}
    +.layout-split-proxy-h,
    +.layout-split-proxy-v {
    +  background-color: #b3b3b3;
    +}
    +.layout-split-north {
    +  border-bottom: 5px solid #fff;
    +}
    +.layout-split-south {
    +  border-top: 5px solid #fff;
    +}
    +.layout-split-east {
    +  border-left: 5px solid #fff;
    +}
    +.layout-split-west {
    +  border-right: 5px solid #fff;
    +}
    +.layout-expand {
    +  background-color: #ffffff;
    +}
    +.layout-expand-over {
    +  background-color: #ffffff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/linkbutton.css b/src/main/webapp/plug-in/easyui/themes/metro/linkbutton.css
    new file mode 100644
    index 00000000..e49d5436
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/linkbutton.css
    @@ -0,0 +1,121 @@
    +a.l-btn {
    +  background-position: right 0;
    +  font-size: 12px;
    +  text-decoration: none;
    +  display: inline-block;
    +  zoom: 1;
    +  height: 24px;
    +  padding-right: 18px;
    +  cursor: pointer;
    +  outline: none;
    +}
    +a.l-btn-plain {
    +  padding-right: 5px;
    +  border: 0;
    +  padding: 1px 6px 1px 1px;
    +}
    +a.l-btn-disabled {
    +  color: #ccc;
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +  cursor: default;
    +}
    +a.l-btn span.l-btn-left {
    +  display: inline-block;
    +  background-position: 0 -48px;
    +  padding: 4px 0px 4px 18px;
    +  line-height: 16px;
    +  height: 16px;
    +}
    +a.l-btn-plain span.l-btn-left {
    +  padding-left: 5px;
    +}
    +a.l-btn span span.l-btn-text {
    +  display: inline-block;
    +  vertical-align: baseline;
    +  width: auto;
    +  height: 16px;
    +  line-height: 16px;
    +  padding: 0;
    +  margin: 0;
    +}
    +a.l-btn span span.l-btn-icon-left {
    +  padding: 0 0 0 20px;
    +  background-position: left center;
    +}
    +a.l-btn span span.l-btn-icon-right {
    +  padding: 0 20px 0 0;
    +  background-position: right center;
    +}
    +a.l-btn span span span.l-btn-empty {
    +  display: inline-block;
    +  margin: 0;
    +  padding: 0;
    +  width: 16px;
    +}
    +a:hover.l-btn {
    +  background-position: right -24px;
    +  outline: none;
    +  text-decoration: none;
    +}
    +a:hover.l-btn span.l-btn-left {
    +  background-position: 0 bottom;
    +}
    +a:hover.l-btn-plain {
    +  padding: 0 5px 0 0;
    +}
    +a:hover.l-btn-disabled {
    +  background-position: right 0;
    +}
    +a:hover.l-btn-disabled span.l-btn-left {
    +  background-position: 0 -48px;
    +}
    +a.l-btn .l-btn-focus {
    +  outline: #0000FF dotted thin;
    +}
    +a.l-btn {
    +  color: #777;
    +  background-image: url('images/linkbutton_bg.png');
    +  background-repeat: no-repeat;
    +  background: #ffffff;
    +  background-repeat: repeat-x;
    +  border: 1px solid #dddddd;
    +  background: -webkit-linear-gradient(top,#ffffff 0,#ffffff 100%);
    +  background: -moz-linear-gradient(top,#ffffff 0,#ffffff 100%);
    +  background: -o-linear-gradient(top,#ffffff 0,#ffffff 100%);
    +  background: linear-gradient(to bottom,#ffffff 0,#ffffff 100%);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#ffffff,GradientType=0);
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +a.l-btn span.l-btn-left {
    +  background-image: url('images/linkbutton_bg.png');
    +  background-repeat: no-repeat;
    +  background-image: none;
    +}
    +a:hover.l-btn {
    +  background: #E6E6E6;
    +  color: #444;
    +  border: 1px solid #ddd;
    +  filter: none;
    +}
    +a.l-btn-plain,
    +a.l-btn-plain span.l-btn-left {
    +  background: transparent;
    +  border: 0;
    +  filter: none;
    +}
    +a:hover.l-btn-plain {
    +  background: #E6E6E6;
    +  color: #444;
    +  border: 1px solid #ddd;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +a.l-btn-disabled,
    +a:hover.l-btn-disabled {
    +  filter: alpha(opacity=50);
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/main.css b/src/main/webapp/plug-in/easyui/themes/metro/main.css
    new file mode 100644
    index 00000000..bbd8e2fd
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/main.css
    @@ -0,0 +1,5692 @@
    +@charset "UTF-8";
    +/* CSS Document */
    +body {
    +	font-size: 12px;
    +	font-family: '寰蒋闆呴粦', "瀹嬩綋";
    +	line-height: 180%;
    +	color: #333333;
    +	width: 100%;
    +	background-repeat: repeat-x;
    +	text-align: left;
    +	/*background: url(../images/footerBg.gif);*/
    +	padding: 0px;
    +	border: 0px;
    +}
    +
    +img,form,ul,dl,input,fieldset,.clear,dt,dd,dl {
    +	margin: 0px;
    +	padding: 0px;
    +	border: 0px;
    +}
    +
    +select {
    +	padding: 6px 0 6px 5px;
    +}
    +
    +input {
    +	outline: none;
    +}
    +
    +ul,dl {
    +	list-style-type: none;
    +}
    +
    +h1,h2,h3,h4 {
    +	font-weight: normal;
    +	margin: 0px;
    +	padding: 0px;
    +}
    +
    +.clear {
    +	font-size: 0px;
    +	line-height: 0px;
    +	clear: both;
    +	height: 0px;
    +}
    +
    +.fl {
    +	float: left;
    +	display: inline;
    +}
    +
    +.fr {
    +	float: right;
    +	display: inline;
    +}
    +
    +.fn {
    +	float: none;
    +}
    +
    +.img_bor {
    +	border: 1px #d6d6d6 solid;
    +	padding: 1px;
    +}
    +
    +a {
    +	color: #4287cf;
    +}
    +
    +a:link,a:visited {
    +	text-decoration: none;
    +}
    +
    +a:hover {
    +	color: #fd7742;
    +	text-decoration: none;
    +}
    +
    +.font18 {
    +	font-size: 18px;
    +}
    +
    +.font14 {
    +	font-size: 14px;
    +}
    +
    +.font16 {
    +	font-size: 16px;
    +}
    +
    +.font24 {
    +	font-size: 24px;
    +}
    +
    +.font12 {
    +	font-size: 12px;
    +}
    +
    +.fontB {
    +	font-weight: bold;
    +}
    +
    +.fontRed {
    +	color: #F00;
    +	text-shadow: 0 1px 0 #FFF;
    +}
    +
    +.fontDeepRed {
    +	color: #8e241f;
    +	text-shadow: 0 1px 0 #FFF;
    +}
    +
    +.font999 {
    +	color: #999;
    +	text-shadow: 0 1px 0 #FFF;
    +}
    +
    +.font666 {
    +	color: #666;
    +	text-shadow: 0 1px 0 #FFF;
    +}
    +
    +.font333 {
    +	color: #333;
    +	text-shadow: 0 1px 0 #FFF;
    +}
    +
    +.fontBlack {
    +	color: #000;
    +	text-shadow: 0 1px 0 #FFF;
    +}
    +
    +.fontWhite {
    +	color: #FFF;
    +	text-shadow: 0 -1px 0 #000;
    +}
    +
    +.fontOrange {
    +	color: #fe3800;
    +}
    +
    +.fontGreen {
    +	color: #54b856;
    +}
    +
    +.fontOrange2 {
    +	color: #f29e00;
    +}
    +
    +.fontBlue {
    +	color: #00aeff;
    +}
    +
    +.mr10 {
    +	margin-right: 10px;
    +}
    +
    +.ml10 {
    +	margin-left: 10px;
    +}
    +
    +.mt5 {
    +	margin-top: 5px;
    +}
    +
    +.wf100 {
    +	width: 100%;
    +}
    +
    +.height10 {
    +	height: 10px;
    +	display: block;
    +}
    +
    +.height15 {
    +	height: 15px;
    +	display: block;
    +}
    +
    +/* 鍏叡鏍峰紡 */
    +.header {
    +	width: 100%;
    +	height: 67px;
    +	background: #FFF;
    +	z-index: 100;
    +	position: absolute;
    +}
    +
    +.headerBottom {
    +	width: 100%;
    +	height: 100px;
    +	float: left;
    +}
    +
    +.header .lineOne {
    +	height: 57px;
    +	padding-top: 10px;
    +}
    +
    +.header .logo {
    +	float: left;
    +	width: 120px;
    +}
    +
    +.logoIn {
    +	background: #fff;
    +	float: left;
    +	width: 120px;
    +	height: 33px;
    +}
    +
    +.header .lineOne .logo {
    +	margin:6px 0px 0px 13px;
    +	width:110px;
    +	height: 32px;
    +	background: url(../images/logo1.gif) bottom no-repeat;
    +}
    +
    +.header .lineTwo .logo {
    +	height: 33px;
    +	background: url(../images/logo2.png) top no-repeat;
    +}
    +
    +.lineTwo .logo {
    +	height: 33px;
    +	background: url(../images/logo2.png) top no-repeat;
    +}
    +
    +.header .lineOne .info {
    +	float: right;
    +}
    +
    +.header .lineOne .shopInfo .photo {
    +	float: left;
    +	padding-right: 10px;
    +}
    +
    +.header .lineOne .shopInfo .text {
    +	font-size: 12px;
    +	float: left;
    +}
    +
    +.header .lineOne .shopInfo .text .redBox {
    +	font-size: 12px;
    +	background-color: #eb7070;
    +	border-radius: 3px;
    +	height: 12px;
    +	width: 30px;
    +	text-align: center;
    +	display: inline-block;
    +	line-height: 12px;
    +	color: #FFF;
    +}
    +
    +.header .lineOne .shopInfo .text .redBox:hover {
    +	background-color: #78bf5f;
    +}
    +
    +.header .lineOne .newMemberTop,.header .lineOne .memberInfo,.header .lineOne .shopInfo
    +	{
    +	color: #7c8389;
    +	float: left;
    +	margin-right: 10px;
    +}
    +
    +.header .lineOne .newMemberTop,.header .lineOne .memberInfo {
    +	padding-top: 10px;
    +}
    +
    +.header .lineOne .newMemberTop .icon {
    +	background-image: url(../images/menuIcon.png);
    +	background-position: 0 -85px;
    +	width: 22px;
    +	height: 22px;
    +	float: left;
    +	padding-right: 5px;
    +}
    +
    +.header .lineOne .newMemberTop:hover .icon {
    +	background-image: url(../images/menuIcon.png);
    +	background-position: 0 -117px;
    +}
    +
    +.header .lineOne .newMemberTop div,.header .lineOne .newMemberTop a,.header .lineOne .memberInfo div,.header .lineOne .memberInfo a
    +	{
    +	float: left;
    +	color: #7c8389;
    +}
    +
    +.header .lineOne .newMemberTop a:hover div,.header .lineOne .memberInfo a:hover div
    +	{
    +	color: #fd7742;
    +}
    +
    +.header .lineOne .memberInfo .icon {
    +	background-image: url(../images/menuIcon.png);
    +	background-position: -49px -85px;
    +	width: 22px;
    +	height: 22px;
    +	float: left;
    +	padding-right: 5px;
    +}
    +
    +.memberInfo a:hover .text {
    +	color: #7c8389;
    +}
    +
    +.memberInfo a .arrow {
    +	-webkit-transform: rotate(0deg);
    +	-webkit-transition: -webkit-transform linear .3s;
    +	-o-transition: -webkit-transform linear .3s;
    +	-ms-transition: -webkit-transform linear .3s;
    +	-moz-transition: -webkit-transform linear .3s;
    +	padding: 7px 5px;
    +}
    +
    +.memberInfo a:hover .arrow {
    +	-webkit-transform: rotate(180deg);
    +	-webkit-transition: -webkit-transform linear .3s;
    +	-o-transition: -webkit-transform linear .3s;
    +	-ms-transition: -webkit-transform linear .3s;
    +	-moz-transition: -webkit-transform linear .3s;
    +	padding: 7px 5px;
    +}
    +
    +.MImore {
    +	position: absolute;
    +	border: 1px solid #D7D7D7;
    +	border-width: 0px 1px 1px 1px;
    +	width: 90px;
    +	/*padding-top: 30px;*/
    +	top: 14px;
    +	right: 5px;
    +	z-index: 1001;
    +	box-shadow: 0 2px 0 rgba(0, 0, 0, .2);
    +	margin-top: 25px;
    +}
    +
    +.MImore li {
    +	border-top: 1px solid #D7D7D7;
    +	float: left;
    +	width: 80px;
    +	background: #FFF;
    +	padding: 5px;
    +}
    +
    +.MImore .memberCenter .icon1 {
    +	width: 18px;
    +	height: 18px;
    +	background-image: url(../images/menuIcon.png);
    +	padding-right: 8px;
    +	background-position: -105px -83px;
    +	float: left;
    +}
    +
    +.MImore .memberCenter:hover .icon1 {
    +	background-position: -105px -115px;
    +}
    +
    +.MImore .memberCenter:hover .text,.MImore .changePassword:hover .text,.MImore .exit:hover .text
    +	{
    +	color: #fd7742;
    +}
    +
    +.MImore .changePassword .icon1 {
    +	width: 18px;
    +	height: 18px;
    +	background-image: url(../images/menuIcon.png);
    +	padding-right: 8px;
    +	background-position: -133px -83px;
    +	float: left;
    +}
    +
    +.MImore .changePassword:hover .icon1 {
    +	background-position: -133px -115px;
    +}
    +
    +.MImore .exit .icon1 {
    +	width: 18px;
    +	height: 18px;
    +	background-image: url(../images/menuIcon.png);
    +	padding-right: 8px;
    +	background-position: -160px -83px;
    +	float: left;
    +}
    +
    +.MImore .exit:hover .icon1 {
    +	background-position: -160px -115px;
    +}
    +
    +.lineTwo .tab {
    +	float: left;
    +}
    +
    +.lineTwo .tab ul li {
    +	float: left;
    +	padding-right: 5px;
    +}
    +#leftMenu{
    +	background:#00c0ff;
    +	overflow:hidden;
    +}
    +.lmenu {
    +	width: 110px;
    +	height:483px;
    +	overflow:hidden;
    +	/*background-image: url(../images/newYearBg.jpg);*/
    +}
    +
    +.lmenu ul li {
    +	float: left;
    +	width: 110px;
    +	height: 70px;
    +}
    +
    +.lmenu ul li a .icon {
    +	height: 45px;
    +	width: 110px;
    +	text-align:center;
    +	vertical-align:middle; 
    +	
    +}
    +.lmenu ul li a .icon img{
    +	width:32px;
    +	height:32px;
    +	margin:8px auto 5px;
    +}
    +.lmenu ul li a .text {
    +	height: 18px;
    +	font-size: 16px;
    +	color: #FFF;
    +	text-align: center;
    +	width: 110px;
    +	font-weight: normal;
    +	line-height:18px;
    +}
    +
    +.lmenu ul li a:hover .cover,.menuS .cover {
    +	background: url(../images/menuScover.png) no-repeat scroll -10px top;;
    +	position: absolute;
    +	width: 110px;
    +	height: 70px;
    +}
    +
    +.lmenuTop {
    +	width: 110px;
    +	height: 33px;
    +	background: #FFF;
    +	z-index: 100;
    +}
    +
    +.lmenuPrev,.lmenuNext{
    +	width:110px;
    +	height:22px;
    +	overflow:hidden;
    +}
    +.lmenuPrev a{
    +	display:block;
    +	width:100%;
    +	height:21px;
    +	overflow:hidden;
    +	background:#00c0ff url(../images/left_menu_up.gif) no-repeat center center;
    +	text-indent:-300px;
    +	border-bottom:1px solid #66d9ff;
    +}
    +.lmenuNext a{
    +	display:block;
    +	width:100%;
    +	height:21px;
    +	overflow:hidden;
    +	background:#00c0ff url(../images/left_menu_down.gif) no-repeat center center;
    +	text-indent:-300px;
    +	border-top:1px solid #66d9ff;
    +}
    +.lmenuNext{
    +	position:absolute;
    +	left:0px;
    +	bottom:0px;
    +}
    +.main {
    +	background-color: #ebebeb;
    +	padding: 15px 0px 8px 10px;
    +	margin:0px;
    +}
    +
    +.wellcome {
    +	height: 35px;
    +	line-height: 35PX;
    +}
    +
    +.shadowBoxWhite {
    +	background: #FFF;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
    +	filter: "progid:DXImageTransform.Microsoft.Shadow(color=#AAAAAA,direction=0,strength=0) progid:DXImageTransform.Microsoft.Shadow(color=#CCCCCC,direction=90,strength=3) progid:DXImageTransform.Microsoft.Shadow(color=#888888,direction=180,strength=5) progid:DXImageTransform.Microsoft.Shadow(color=#CCCCCC,direction=270,strength=3)";*/
    +}
    +.order_detail .shadowBoxWhite ,.goods_input .shadowBoxWhite,.member_detail .shadowBoxWhite{
    +	background: #FFF;
    +	box-shadow:none;
    +}
    +.shadowBoxYellow {
    +	background: #fff8be;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
    +	/*filter: "progid:DXImageTransform.Microsoft.Shadow(color=#AAAAAA,direction=0,strength=0) progid:DXImageTransform.Microsoft.Shadow(color=#CCCCCC,direction=90,strength=3) progid:DXImageTransform.Microsoft.Shadow(color=#888888,direction=180,strength=5) progid:DXImageTransform.Microsoft.Shadow(color=#CCCCCC,direction=270,strength=3)";*/
    +}
    +
    +.notice {
    +	width: 300px;
    +	float: right;
    +	font-size: 12px;
    +	margin-bottom: 8px;
    +	height: 27px;
    +}
    +
    +.notice .icon {
    +	background-image: url(../images/menuIcon.png);
    +	background-position: -195px -80px;
    +	width: 27px;
    +	height: 27px;
    +	float: left;
    +}
    +
    +.notice .text a {
    +	color: #fb5240;
    +}
    +
    +.notice .text a:hover {
    +	color: #78bf5f;
    +}
    +
    +.notice .text {
    +	width: 220px;
    +	overflow: hidden;
    +	height: 27px;
    +	float: left;
    +	line-height: 27px;
    +}
    +
    +.notice .more {
    +	float: left;
    +	line-height: 27px;
    +}
    +
    +.notice .more a {
    +	line-height: 27px;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#FFFFFF),
    +		to(#eaeaea));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#FFFFFF),
    +		to(#eaeaea));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#eaeaea));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#eaeaea));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#FFFFFF,
    +		endcolorstr=#eaeaea, gradientType=0);
    +	width: 53px;
    +	height: 27px;
    +	float: left;
    +	text-align: center;
    +	color: #999;
    +	cursor: pointer;
    +}
    +
    +.notice .more a:hover {
    +	color: #fd7742;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#eaeaea),
    +		to(#FFFFFF));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#eaeaea),
    +		to(#FFFFFF));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#eaeaea), to(#FFFFFF));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#eaeaea), to(#FFFFFF));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#eaeaea,
    +		endcolorstr=#FFFFFF, gradientType=0);
    +	cursor: pointer;
    +}
    +
    +.quickLaunch .QL1,.quickLaunch .QL2,.quickLaunch .QL3,.quickLaunch .QL4
    +	{
    +	border-bottom: 1px dashed #d7d7d7;
    +}
    +
    +.quickLaunch .QL1,.quickLaunch .QL2,.quickLaunch .QL3,.quickLaunch .QL5,.quickLaunch .QL6,.quickLaunch .QL7
    +	{
    +	border-right: 1px dashed #d7d7d7;
    +}
    +
    +.quickLaunch td:hover {
    +	background: #eeeeee;
    +	cursor: pointer;
    +}
    +
    +.quickLaunch .icon {
    +	width: 100px;
    +}
    +
    +.quickLaunch .text {
    +	width: 100px;
    +	/*color: #7c8389;*/
    +	padding-top: 15px;
    +}
    +
    +.warning {
    +	float: right;
    +	width: 300px;
    +	height: 310px;
    +}
    +
    +.warning .title {
    +	color: #f5b319;
    +	font-size: 18px;
    +	border-bottom: 1px solid #efe591;
    +	height: 45px;
    +	line-height: 45px;
    +	margin: 0 5px;
    +	width: 290px;
    +	text-indent: 5px;
    +}
    +
    +.warning li {
    +	padding: 10px;
    +	color: #000;
    +}
    +
    +.warning li a {
    +	color: #000;
    +	padding-bottom: 15px;
    +}
    +
    +.warning li a:hover {
    +	color: #fd7742;
    +}
    +
    +.chart .title,.todaySale .title,.contactUs .title,.whiteBox .title{
    +	border-bottom: 1px solid #dfdfdf;
    +    color: #53606b;
    +    font-size: 18px;
    +    height: 36px;
    +    line-height: 36px;
    +    margin: 0 5px;
    +    text-indent: 5px;
    +    font-weight:normal;
    +}
    +#orderbaseform .title,.index_nav{
    +	font-size: 18px;
    +	color: #333;
    +	height:18px;
    +	line-height:18px;
    +	text-align:left;
    +	padding-bottom:10px;
    +	font-weight:normal;
    +	border:none;
    +	margin:0px;
    +	text-indent:0;
    +
    +}
    +.whiteBox .text {
    +	padding: 20px 15px;
    +	text-align: center;
    +}
    +
    +.chart .text {
    +	padding: 20px 10px;
    +	text-align: center;
    +	height: 195px;
    +}
    +
    +.todaySale,.contactUs {
    +	width: 300px;
    +	float: right;
    +}
    +
    +.todaySale .text {
    +	font-size: 12px;
    +	color: #999999;
    +	text-align: center;
    +	width: 100%;
    +	padding: 30px 0 20px 0;
    +}
    +
    +.todaySale .text .num {
    +	font-size: 48px;
    +	line-height: 48px;
    +	color: 00aeff;
    +}
    +
    +.secondFloat {
    +	position: absolute;
    +	left: 110px;
    +	/*top: 33px;*/
    +	border: 2px solid #00c0ff;
    +	border-left:none;
    +	z-index: 99999;
    +	/*background: url(../images/St.png) top left no-repeat;*/
    +	width: 132px;
    +}
    +
    +.second {
    +	background: #f2f2f2;
    +	width: 132px;
    +	float: left;
    +	/*height: 490px;*/
    +}
    +
    +.secondBottom {
    +	width: 132px;
    +	background: url(../images/Sb.png) no-repeat;
    +	height: 5px;
    +	float: left;
    +}
    +
    +.second ul {
    +	float: left;
    +}
    +
    +.second ul li .title {
    +	width:100%;
    +	float: left;
    +	background-color: #FFF;
    +	height: 29px;
    +	border-bottom: 1px solid #e9e9e9;
    +	color: #000;
    +	float: left;
    +	line-height: 29px;
    +	text-indent: 5px;
    +}
    +
    +.second ul li {
    +	float: left;
    +	height: 100%;
    +	width:132px;
    +}
    +
    +.second ul li ul {
    +	background: none;
    +	padding: 5px 0;
    +	float: left;
    +}
    +
    +.second ul li ul li {
    +	background: none;
    +	padding: 0 15px;
    +	float: left;
    +
    +}
    +
    +.second ul li ul li a {
    +	/*color: #7c8389;*/
    +	color: #444444;
    +	width: 100px;
    +	height: 28px;
    +	border-bottom: 1px solid #d5d5d5;
    +	float: left;
    +	background: none;
    +	line-height: 28px;
    +	text-indent: 5px;
    +	overflow:hidden;
    +}
    +
    +.second ul li ul li a:hover {
    +	background: #454545;
    +	color: #FFF;
    +}
    +
    +.secondFloatBig {
    +	width: 280px;
    +}
    +
    +.secondFloatBig .second {
    +	width: 280px;
    +}
    +
    +.secondFloatBig .second ul {
    +	width: 280px;
    +}
    +
    +.secondFloatBig .second ul li {
    +	width: 280px;
    +}
    +
    +.secondFloatBig .second ul li .title {
    +	width: 100%;
    +	float: left;
    +}
    +
    +.secondFloatBig .second ul {
    +	width: 280px;
    +}
    +
    +.secondFloatBig .second ul li ul li {
    +	width: 110px;
    +	padding-bottom: 5px;
    +}
    +
    +.secondFloatBig .secondBottom {
    +	width: 280PX;
    +}
    +
    +.contactUs {
    +	height: 129px;
    +	overflow: hidden;
    +}
    +
    +.contactUs .text ul {
    +	padding: 10px 0px 10px 15px;
    +	float: left;
    +}
    +
    +.contactUs .text ul li {
    +	float: left;
    +	padding-right: 10px;
    +}
    +
    +.QQ,.weibo,.weixin,.mail {
    +	background: url(../images/contactIcon.png);
    +	width: 60px;
    +	height: 60px;
    +	display: block;
    +}
    +
    +.QQ {
    +	background-position: 0 0;
    +}
    +
    +.QQ:hover {
    +	background-position: 0 -70px;
    +}
    +
    +.weibo {
    +	background-position: -67px 0;
    +}
    +
    +.weibo:hover {
    +	background-position: -67px -70px;
    +}
    +
    +.weixin {
    +	background-position: -136px 0;
    +}
    +
    +.weixin:hover {
    +	background-position: -136px -70px;
    +}
    +
    +.mail {
    +	background-position: -206px 0;
    +}
    +
    +.mail:hover {
    +	background-position: -206px -70px;
    +}
    +
    +.footer {
    +	border-top: 1px solid #cfcfcf;
    +	color: #999;
    +	margin-top: 15px;
    +	padding-top: 10px;
    +}
    +
    +.footer .fr {
    +	text-align: right;
    +}
    +
    +/* 鍐呭椤 */
    +.button ,a.l-btn span.l-btn-left {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #f7f7f7;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f7f7f7),
    +		to(#f2f2f2));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f7f7f7),
    +		to(#f2f2f2));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f7f7f7), to(#f2f2f2));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f7f7f7), to(#f2f2f2));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f7f7f7,
    +		endcolorstr=#f2f2f2, gradientType=0);
    +	height: 24px;
    +	padding: 0 20px;
    +	cursor: pointer;
    +	line-height: 24px;
    +	display: inline-block;
    +	color: #666666;
    +	margin-right:5px;
    +	
    +}
    +a.l-btn span.l-btn-left .icon-ok{
    +	background-image:none;
    +}
    +
    +.button:hover,a.l-btn:hover span.l-btn-left {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #FFFFFF;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#FFFFFF),
    +		to(#f2f2f2));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#FFFFFF),
    +		to(#f2f2f2));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#f2f2f2));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#f2f2f2));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#FFFFFF,
    +		endcolorstr=#f2f2f2, gradientType=0);
    +	color: #666666;
    +	cursor: pointer;
    +}
    +
    +.button:active {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #f2f2f2;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2),
    +		to(#FFFFFF));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f2f2f2),
    +		to(#FFFFFF));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#FFFFFF));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#FFFFFF));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f2f2f2,
    +		endcolorstr=#FFFFFF, gradientType=0);
    +	color: #666666;
    +	cursor: pointer;
    +}
    +
    +.button1 {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #f7f7f7;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f7f7f7),
    +		to(#f2f2f2));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f7f7f7),
    +		to(#f2f2f2));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f7f7f7), to(#f2f2f2));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f7f7f7), to(#f2f2f2));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f7f7f7,
    +		endcolorstr=#f2f2f2, gradientType=0);
    +	height: 28px;
    +	padding: 0 20px;
    +	cursor: pointer;
    +	line-height: 28px;
    +	display: inline-block;
    +	color: #666666;
    +}
    +
    +.button1:hover {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #FFFFFF;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#FFFFFF),
    +		to(#f2f2f2));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#FFFFFF),
    +		to(#f2f2f2));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#f2f2f2));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#f2f2f2));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#FFFFFF,
    +		endcolorstr=#f2f2f2, gradientType=0);
    +	color: #666666;
    +	cursor: pointer;
    +}
    +
    +.button1:active {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #f2f2f2;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2),
    +		to(#FFFFFF));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f2f2f2),
    +		to(#FFFFFF));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#FFFFFF));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#FFFFFF));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f2f2f2,
    +		endcolorstr=#FFFFFF, gradientType=0);
    +	color: #666666;
    +	cursor: pointer;
    +}
    +
    +.blueButton {
    +	border: 1px solid #2f9df9;
    +	border-radius: 3px;
    +	background-color: #39befb;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#39befb),
    +		to(#2091fc));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#39befb),
    +		to(#2091fc));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#39befb), to(#2091fc));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#39befb), to(#2091fc));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#39befb,
    +		endcolorstr=#2091fc, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.blueButton:hover {
    +	border: 1px solid #2091fc;
    +	background-color: #6ecdff;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#6ecdff),
    +		to(#2091fc));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#6ecdff),
    +		to(#2091fc));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#6ecdff), to(#2091fc));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#6ecdff), to(#2091fc));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#6ecdff,
    +		endcolorstr=#2091fc, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.blueButton:active {
    +	border: 1px solid #2091fc;
    +	background-color: #2091fc;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#2091fc),
    +		to(#6ecdff));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#2091fc),
    +		to(#6ecdff));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#2091fc), to(#6ecdff));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#2091fc), to(#6ecdff));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#2091fc,
    +		endcolorstr=#6ecdff, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.greyButtonNoAction {
    +	border-radius: 3px;
    +	border: 1px solid #d1d1d1;
    +	background-color: #e6e6e8;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f3f3f3,
    +		endcolorstr=#e6e6e8, gradientType=0);
    +	color: #B9B9B9;
    +	width: 280px;
    +	height: 57px;
    +	display: inline-block;
    +	text-align: center;
    +	line-height: 57px;
    +	font-size: 16px;
    +}
    +
    +.greyButtonNoAction:hover {
    +	border-radius: 3px;
    +	border: 1px solid #d1d1d1;
    +	background-color: #e6e6e8;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f3f3f3,
    +		endcolorstr=#e6e6e8, gradientType=0);
    +	color: #B9B9B9;
    +	cursor: default;
    +}
    +
    +.redButton {
    +	border: 1px solid #fc5f4a;
    +	border-radius: 3px;
    +	background-color: #fd765c;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#fd765c),
    +		to(#fc5f4a));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#fd765c),
    +		to(#fc5f4a));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#fd765c), to(#fc5f4a));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#fd765c), to(#fc5f4a));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#fd765c,
    +		endcolorstr=#fc5f4a, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.redButton:hover {
    +	border: 1px solid #fc5f4a;
    +	background-color: #ffaa9a;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#ffaa9a),
    +		to(#fc5f4a));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#ffaa9a),
    +		to(#fc5f4a));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#ffaa9a), to(#fc5f4a));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#ffaa9a), to(#fc5f4a));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#ffaa9a,
    +		endcolorstr=#fc5f4a, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.redButton:active {
    +	border: 1px solid #fc5f4a;
    +	background-color: #fc5f4a;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#fc5f4a),
    +		to(#ffaa9a));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#fc5f4a),
    +		to(#ffaa9a));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#fc5f4a), to(#ffaa9a));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#fc5f4a), to(#ffaa9a));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#fc5f4a,
    +		endcolorstr=#ffaa9a, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.greenButton {
    +	border: 1px solid #7dc855;
    +	border-radius: 3px;
    +	background-color: #9bda6a;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#9bda6a),
    +		to(#7dc855));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#9bda6a),
    +		to(#7dc855));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#9bda6a), to(#7dc855));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#9bda6a), to(#7dc855));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#9bda6a,
    +		endcolorstr=#7dc855, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.greenButton:hover {
    +	border: 1px solid #7dc855;
    +	background-color: #b5eb8d;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#b5eb8d),
    +		to(#7dc855));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#b5eb8d),
    +		to(#7dc855));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#b5eb8d), to(#7dc855));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#b5eb8d), to(#7dc855));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#b5eb8d,
    +		endcolorstr=#7dc855, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.greenButton:active {
    +	border: 1px solid #7dc855;
    +	background-color: #7dc855;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#7dc855),
    +		to(#b5eb8d));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#7dc855),
    +		to(#b5eb8d));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#7dc855), to(#b5eb8d));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#7dc855), to(#b5eb8d));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#7dc855,
    +		endcolorstr=#b5eb8d, gradientType=0);
    +	color: #FFFFFF;
    +}
    +
    +.left {
    +	float: left;
    +}
    +
    +.left .button {
    +	margin-right: 5px;
    +}
    +
    +.right {
    +	float: right;
    +}
    +
    +.right .button {
    +	float: left;
    +	margin-left: 5px;
    +}
    +
    +.input_text,.lvPrice,.ipt {
    +	border: 1px solid #D7D7D7;
    +	border-radius: 3PX;
    +	/*height: 14PX;*/
    +	padding: 7px 0 7px 5px;
    +	line-height: 14PX;
    +	font-size: 12px;
    +	display: inline-block;
    +	width:300px;
    +}
    +
    +.input_text:focus,.lvPrice:focus,.ipt:focus {
    +	border: 1px solid #06F;
    +	box-shadow: inset 0 1px 2px rgba(0, 102, 255, 0.3);
    +}
    +
    +.inputText1 {
    +	border: 1px solid #D7D7D7;
    +	border-radius: 3PX;
    +	height: 14PX;
    +	padding: 7px 0;
    +	line-height: 14PX;
    +	padding-left: 5PX;
    +	font-size: 12px;
    +	display: inline-block;
    +}
    +
    +.inputText1:focus {
    +	border: 1px solid #06F;
    +	box-shadow: inset 0 1px 2px rgba(0, 102, 255, 0.3);
    +}
    +
    +.inputSelect {
    +	padding: 4px;
    +	border: 1px solid #D7D7D7;
    +}
    +
    +.searchAdvancedS {
    +	background-color: #fdea7a;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#fdea7a),
    +		to(#fef197));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#fdea7a),
    +		to(#fef197));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#fdea7a), to(#fef197));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#fdea7a), to(#fef197));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#fdea7a,
    +		endcolorstr=#fef197, gradientType=0);
    +}
    +
    +.searchAdvanced {
    +	border: 1px solid #d1d1d1;
    +	box-sizing: border-box;
    +	background: #fffbf4;
    +	float: left;
    +	width: 100%;
    +	margin-top: 10px;
    +	padding: 10px 0 5px 0;
    +	color: #7c8389;
    +}
    +
    +.searchAdvanced .searchAdvanced .inputText {
    +	float: left;
    +}
    +
    +.searchAdvanced div {
    +	float: left;
    +	padding-bottom: 5px;
    +}
    +
    +.searchAdvanced .title {
    +	padding: 0 5px 0 10px;
    +	line-height: 30px;
    +}
    +
    +.data {
    +	background: url(../images/cal.png) no-repeat right #FFF;
    +}
    +
    +.tableDiv {
    +	background: #D7D7D7;
    +}
    +
    +.tableDiv table th {
    +	background-color: #f7f7f7;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff),
    +		to(#f7f7f7));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#ffffff),
    +		to(#f7f7f7));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f7f7f7));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f7f7f7));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#ffffff,
    +		endcolorstr=#f7f7f7, gradientType=0);
    +	font-weight: bold;
    +}
    +
    +.tableDiv table th a {
    +	color: #4287cf;
    +}
    +
    +.tableDiv table th a:hover {
    +	color: #8bbf00;
    +}
    +
    +.tableDiv table tr td {
    +	/*color: #7c8389;*/
    +	white-space: normal;
    +	word-break: break-all;
    +	padding:6px;
    +}
    +
    +.tableDiv table tr:hover td {
    +	background: #f1f1f1;
    +}
    +
    +.copy {
    +	background-position: 0 -29px;
    +}
    +
    +.datagrid-btable a.edit {
    +	background-image: url("icons/icon21.png");
    +    display: inline-block;
    +    height: 23px;
    +    margin: 0 5px;
    +    width: 23px;
    +    float:none;
    +	background-position: -26px -29px;
    +	text-indent:0;
    +}
    +.datagrid-btable .add {
    +	background-image: url("icons/icon21.png");
    +    display: inline-block;
    +    height: 23px;
    +    margin: 0 5px;
    +    width: 23px;
    +	background-position: -34px -169px;
    +}
    +
    +.del,.delete {
    +	background-position: -52px -29px;
    +}
    +
    +.details {
    +	background-position: -52px -86px;
    +}
    +
    +.tableDiv table tr:hover td .copy {
    +	background-position: 0 0px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .edit ,.datagrid-row-over td .edit{
    +	background-position: -26px 0px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .del ,.datagrid-row-over .delete{
    +	background-position: -52px 0px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .add ,.datagrid-row-over .add{
    +	background-position: 0px -170px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .issue ,.datagrid-row-over td .issue{
    +	background-position: -68px -169px;
    +	cursor: pointer;
    +}
    +.tableDiv table tr:hover td .view ,.datagrid-row-over td .view{
    +	background-position: -136px -169px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .details {
    +	background-position: -52px -56px;
    +	cursor: pointer;
    +}
    +
    +.operate,.delete {
    +	margin: 0 5px;
    +	width: 24px;
    +	height: 24px;
    +	display: inline-block;
    +	background-image: url(icons/icon21.png);
    +	line-height:23px;
    +	overflow:visible;
    +}
    +a:hover .delete{
    +	background-position:-52px 0px;
    +}
    +a.issue {
    +	margin: 0 5px;
    +	width: 25px;
    +	height: 24px;
    +	display: inline-block;
    +	background: url(icons/icon21.png) no-repeat scroll -101px -169px;
    +	line-height:23px;
    +	overflow:visible;
    +}
    +
    +a.view {
    +	margin: 0 5px;
    +	width: 25px;
    +	height: 24px;
    +	display: inline-block;
    +	background: url(icons/icon21.png) no-repeat scroll -171px -169px;
    +	line-height:23px;
    +	overflow:visible;
    +}
    +
    +.switchOn {
    +	background: url(icons/icon21.png) -86px 0 no-repeat;
    +	width: 63px;
    +	height: 23px;
    +	display: inline-block;
    +}
    +
    +.switchOff {
    +	background: url(icons/icon21.png) -86px -29px no-repeat;
    +	width: 63px;
    +	height: 23px;
    +	display: inline-block;
    +}
    +
    +.tableDiv table .cancel td {
    +	color: #cccccc;
    +}
    +
    +.tableDiv table .cancel td a {
    +	text-decoration: underline;
    +	color: #cccccc;
    +}
    +
    +.tableDiv table .cancel td a:hover {
    +	color: #fd7742;
    +}
    +
    +.tableDiv table .cancel .cancelIcon {
    +	background: url(icons/icon21.png) no-repeat -158px 0;
    +	width: 30px;
    +	height: 14px;
    +	display: inline-block;
    +}
    +
    +.defaultIcon {
    +	background: url(../images/default.png) no-repeat;
    +	width: 30px;
    +	height: 14px;
    +	display: inline-block;
    +}
    +
    +.masterIcon {
    +	background: url(../images/baseAccount.png) no-repeat;
    +	width: 30px;
    +	height: 14px;
    +	display: inline-block;
    +}
    +
    +.pageArea {
    +	float: right;
    +}
    +
    +.pageArea a:hover {
    +	border-radius: 3px;
    +	background: #34a3db;
    +	color: #FFF;
    +	padding: 5px 8px;
    +	cursor: pointer;
    +}
    +
    +.pageArea a {
    +	border-radius: 3px;
    +	background: #d9d9d9;
    +	color: #000;
    +	padding: 5px 8px;
    +	cursor: pointer;
    +}
    +
    +.pageArea .pageOn,.pageArea .pageOff a:hover {
    +	border-radius: 3px;
    +	background: #34a3db;
    +	color: #FFF;
    +	padding: 5px 8px;
    +	cursor: pointer;
    +}
    +
    +.receipts {
    +	padding: 20px;
    +}
    +
    +.receipts .title {
    +	background: url(../images/line.png) bottom repeat-x;
    +}
    +
    +.receipts .title .text {
    +	color: #454c51;
    +	font-size: 24px;
    +	padding-bottom: 20px;
    +}
    +
    +.weixinPop {
    +	position: relative;
    +	top: -110px;
    +	left: 35px;
    +	width: 110px;
    +	height: 110px;
    +}
    +
    +.Odown {
    +	background: url(../images/icon_sort2.png) no-repeat right;
    +	padding-right: 15px;
    +	display: inline-block;
    +	color: #5f5f58;
    +}
    +
    +.Oup {
    +	background: url(../images/icon_sort.png) no-repeat right;
    +	padding-right: 15px;
    +	display: inline-block;
    +	color: #5f5f58;
    +}
    +
    +.Odown:hover {
    +	background: url(../images/icon_sort2hover.png) no-repeat right;
    +	display: inline-block;
    +	color: #8bbf00;
    +}
    +
    +.Oup:hover {
    +	background: url(../images/icon_sorthover.png) no-repeat right;
    +	padding-right: 15px;
    +	display: inline-block;
    +	color: #8bbf00;
    +}
    +
    +#lastLine:hover td {
    +	background: #FFF;
    +}
    +
    +.receipts {
    +	padding: 20px;
    +	padding-bottom: 80px;
    +}
    +
    +.receipts .title {
    +	background: url(../images/line.png) bottom repeat-x;
    +}
    +
    +.receipts .title .text {
    +	color: #454c51;
    +	font-size: 30px;
    +	line-height: 30px;
    +	padding-bottom: 20px;
    +}
    +
    +.receipts .baseData div div h4 {
    +	float: left;
    +	padding: 0 5px 0 10px;
    +	color: #7c8389;
    +}
    +
    +.receipts .baseData {
    +	display: block;
    +	padding: 10px 0;
    +	margin-top: 5px;
    +}
    +
    +/* .receipts .baseData div div span {
    +            float: left;
    +            padding: 0 5px 0 10px;
    +            color: #7c8389;
    +        }
    +
    +          .receipts .baseData .fl div span, .receipts .baseData .fr div span {
    +            float: left;
    +            line-height: 30px;
    +        }
    +*/
    +.receipts .baseData .fl div,.receipts .baseData .fr div {
    +	float: left;
    +}
    +
    +.receipts .baseData .fl div h4,.receipts .baseData .fr div h4 {
    +	float: left;
    +	line-height: 30px;
    +}
    +
    +.receipts .tableDiv tr th {
    +	background: #FFF;
    +	font-size: 14px;
    +	color: #000;
    +}
    +
    +.receipts .baseData input[type="checkbox"] {
    +	margin-top: 9px;
    +}
    +
    +.tableDiv table tr:hover .receiptsInputText:focus[readonly] {
    +	background: #F1F1F1;
    +	border: 1PX solid #f1f1f1;
    +	text-align: center;
    +}
    +
    +.tableDiv table tr .receiptsInputText:focus[readonly] {
    +	background: #FFFFFF;
    +	border: 1PX solid #FFFFFF;
    +	text-align: center;
    +}
    +
    +.weixinPop {
    +	position: relative;
    +	top: -110px;
    +	left: 35px;
    +	width: 110px;
    +	height: 110px;
    +}
    +
    +.Odown {
    +	background: url(../images/icon_sort2.png) no-repeat right;
    +	padding-right: 15px;
    +	display: inline-block;
    +	color: #5f5f58;
    +}
    +
    +.Oup {
    +	background: url(../images/icon_sort.png) no-repeat right;
    +	padding-right: 15px;
    +	display: inline-block;
    +	color: #5f5f58;
    +}
    +
    +.Odown:hover {
    +	background: url(../images/icon_sort2hover.png) no-repeat right;
    +	display: inline-block;
    +	color: #8bbf00;
    +}
    +
    +.Oup:hover {
    +	background: url(../images/icon_sorthover.png) no-repeat right;
    +	padding-right: 15px;
    +	display: inline-block;
    +	color: #8bbf00;
    +}
    +
    +.receiptsInputText {
    +	width: 95%;
    +	height: 14px;
    +	line-height: 14px;
    +	/*color: #7c8389;*/
    +	border: 1px solid #FFF;
    +	background-color: #FFF;
    +	padding: 5PX 0;
    +	text-indent: 5PX;
    +	border-radius: 3px;
    +	text-align: center;
    +}
    +
    +.receiptsInputText:hover {
    +	border: 1px solid #06F;
    +}
    +
    +.receiptsInputText:focus {
    +	border: 1px solid #06F;
    +}
    +
    +.tableDiv table tr:hover .receiptsInputText[readonly],.tableDiv table tr:hover .receiptsInputText:hover[readonly],.receipts .tableDiv table tr:hover .receiptsInputText:focus[readonly]
    +	{
    +	background: #F1F1F1;
    +	border: 1PX solid #F1F1F1;
    +}
    +
    +.receipts .tableDiv table tr:hover .plusLite {
    +	background: url(icons/icon21.png) no-repeat 0 -56px;
    +	width: 13px;
    +	height: 13px;
    +	display: inline-block;
    +	margin: 0 5px;
    +}
    +
    +.receipts .tableDiv table tr:hover .plusLite:hover {
    +	background: url(icons/icon21.png) no-repeat 0 -73px;
    +}
    +
    +.receipts .tableDiv table tr:hover .delLite {
    +	background: url(icons/icon21.png) no-repeat -20px -56px;
    +	width: 13px;
    +	height: 13px;
    +	display: inline-block;
    +	margin: 0 5px;
    +}
    +
    +.receipts .tableDiv table tr:hover .delLite:hover {
    +	background: url(icons/icon21.png) no-repeat -20px -73px;
    +}
    +
    +.receipts .tableDiv table tr .num {
    +	display: block;
    +}
    +
    +.receipts .tableDiv table tr .actionArea {
    +	display: none;
    +}
    +
    +.receipts .tableDiv table tr:hover .num {
    +	display: none;
    +}
    +
    +.receipts .tableDiv table tr:hover .actionArea {
    +	display: block;
    +}
    +
    +.choseGoods {
    +	border-radius: 3px;
    +	background-color: #36c77b;
    +	color: #FFF;
    +	cursor: pointer;
    +	height: 26px;
    +	line-height: 26px;
    +	padding: 0 10px;
    +	display: inline-block;
    +}
    +
    +.choseGoods:hover {
    +	background: #49dc8f;
    +	color: #FFF;
    +	cursor: pointer;
    +	display: inline-block;
    +}
    +
    +.choseGoods:active {
    +	background: #36c77b;
    +	color: #FFF;
    +	cursor: pointer;
    +	display: inline-block;
    +}
    +
    +.deliver {
    +	border: 1px solid #eeeeee;
    +	background-color: #f8f8f8;
    +	float: left;
    +	width: 100%;
    +	display: block;
    +	margin-top: 5px;
    +}
    +
    +.deliver span {
    +	padding: 0 5px 0 10px;
    +	line-height: 30px;
    +}
    +
    +.deliver input[type=checkbox] {
    +	margin: 8px 0 0 10px;
    +	float: left;
    +}
    +
    +#total td {
    +	background: #fffbf4;
    +}
    +
    +.inputBorder {
    +	border: 1px solid #d7d7d7;
    +	padding: 3px 0 3px 5px;
    +}
    +
    +.bottomButtonArea {
    +	padding: 20px 0;
    +	width: 100%;
    +}
    +
    +.quickAdd {
    +	width: 300px;
    +	float: right;
    +}
    +
    +.quickAdd .title {
    +	color: #f5b319;
    +	font-size: 18px;
    +	border-bottom: 1px solid #efe591;
    +	height: 45px;
    +	line-height: 45px;
    +	margin: 0 5px;
    +	width: 290px;
    +	text-indent: 5px;
    +}
    +
    +.quickAdd .text {
    +	padding: 10px 5px;
    +}
    +
    +.quickAdd input[type=text],.quickAdd textarea {
    +	border: 1px solid #efe591;
    +	width: 100%;
    +}
    +
    +.quickAdd input[type=text]:hover,.quickAdd input[type=text]:focus,.quickAdd textarea:focus,.quickAdd textarea:hover
    +	{
    +	border: 1px solid #F60;
    +}
    +
    +.field-validation-error {
    +	color: #fa0202;
    +	border: 1px solid #fb5240;
    +	text-indent: 30px;
    +	display: inline-block;
    +	background: url(../images/errorIcon.png) no-repeat 5px 2px #fef3f3;
    +	line-height: 27px;
    +	padding: 0 5px;
    +	font-size: 12px;
    +	border-radius: 3px;
    +	position: absolute;
    +	margin-top: -15px;
    +	white-space: nowrap;
    +	z-index: 100;
    +}
    +
    +.input-validation-error {
    +	border: 1px solid #ff0000;
    +}
    +
    +.validation-summary-errors {
    +	display: none;
    +}
    +
    +.errorInfo {
    +	border: 0px solid #000;
    +	position: absolute;
    +	top: 30px;
    +	right: 35%;
    +	width: 30%;
    +	z-index: 10000;
    +	color: #fff;
    +	line-height: 30px;
    +	padding: 0 5px;
    +	background: #fd7742;
    +	text-align: center;
    +	box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
    +	max-height: 95px;
    +	overflow: hidden;
    +	display: none;
    +	font-size: 14px;
    +	border-radius: 3px;
    +}
    +
    +.classify {
    +	width: 250px;
    +	float: left;
    +	overflow-x: auto;
    +}
    +
    +.classify .title {
    +	color: #f5b319;
    +	font-size: 18px;
    +	border-bottom: 1px solid #efe591;
    +	height: 45px;
    +	line-height: 45px;
    +	margin: 0 5px;
    +	width: 240px;
    +	text-indent: 5px;
    +}
    +
    +.classify .text {
    +	padding: 5px;
    +}
    +
    +.plusLite {
    +	background: url(icons/icon21.png) no-repeat 0 -56px;
    +	width: 13px;
    +	height: 13px;
    +	display: inline-block;
    +	margin: 0 5px;
    +	cursor: pointer;
    +}
    +
    +.plusLite:hover {
    +	background: url(icons/icon21.png) no-repeat 0 -73px;
    +}
    +
    +.delLite {
    +	background: url(icons/icon21.png) no-repeat -20px -56px;
    +	width: 13px;
    +	height: 13px;
    +	display: inline-block;
    +	margin: 0 5px;
    +}
    +
    +.delLite:hover {
    +	background: url(icons/icon21.png) no-repeat -20px -73px;
    +}
    +
    +.editLite {
    +	background: url(icons/icon21.png) no-repeat 0 -93px;
    +	width: 13px;
    +	height: 13px;
    +	display: inline-block;
    +	margin: 0 5px;
    +}
    +
    +.editLite:hover {
    +	background: url(icons/icon21.png) no-repeat 0 -110px;
    +}
    +
    +.title .titleButton {
    +	margin-top: 15px;
    +	cursor: pointer;
    +	float: right;
    +}
    +
    +.propertyTable tr td {
    +	background: #F8F8F8;
    +	border-bottom: 1px solid #ececec;
    +	padding: 10px 0;
    +}
    +
    +.propertyTable tr th {
    +	background: #F8F8F8;
    +	border-bottom: 1px solid #ececec;
    +	border-right: 1px solid #ececec;
    +	padding: 10px 0px;
    +	font-size: 14px;
    +}
    +
    +.property .text {
    +	padding: 0px 5px 10px 5px;
    +}
    +
    +.propertyValue {
    +	padding: 5px 10px;
    +	float: left;
    +	margin-left: 10px;
    +	cursor: pointer;
    +}
    +
    +.propertyValue:hover {
    +	background-color: #e6e6e8;
    +	float: left;
    +	display: inline-block;
    +}
    +
    +.propertyValue input[type="radio"] {
    +	margin-right: 5px;
    +}
    +
    +.nodata {
    +	text-align: center;
    +}
    +
    +.nodata .icon {
    +	font-size: 72px;
    +	color: #C9C9C9;
    +	line-height: 100px;
    +}
    +
    +.nodata .noticeText {
    +	font-size: 18px;
    +	color: #999999;
    +}
    +
    +.cancelImg {
    +	position: absolute;
    +	margin-top: 150px;
    +	margin-left: 400px;
    +	background: url(../images/cancel.png) no-repeat;
    +	width: 400px;
    +	height: 300px;
    +}
    +
    +.fontNodata {
    +	font-size: 28px;
    +	color: #bcbdc1;
    +	line-height: 34px;
    +}
    +
    +.returnGoodsIcon {
    +	background: url(../images/return.png) no-repeat;
    +	width: 30px;
    +	height: 14px;
    +	display: inline-block;
    +}
    +
    +.contentTab ul li {
    +	float: left;
    +	padding-right: 10px;
    +	color: #7C8389;
    +    font-size: 13px;
    +    height: 38px;
    +    line-height: 38px;
    +    padding: 0 25px;
    +    cursor:pointer;
    +}
    +
    +
    +.contentTab ul .contentTabS,.contentTab ul .contentTabN:hover,.contentTab .active {
    +	border-top: 3px solid #00aeef;
    +	background: #FFF;
    +	font-weight: bold;
    +	float: left;
    +	cursor: pointer;
    +}
    +
    +.contentTab ul .contentTabN {
    +	border-top: 3px solid #e6e6e8;
    +	float: left;
    +	cursor: pointer;
    +}
    +
    +.right .inputText {
    +	float: left;
    +	margin-left: 5px;
    +}
    +
    +.check {
    +	background-position: -86px -86px;
    +}
    +
    +.tableDiv table tr:hover td .check {
    +	background-position: -86px -56px;
    +	cursor: pointer;
    +}
    +
    +.tips {
    +	cursor: pointer;
    +}
    +
    +.tips .tipsPop {
    +	display: none;
    +	-webkit-transition: opacity ease-out .5;
    +	opacity: 0;
    +	padding: 5px;
    +	color: #666666;
    +}
    +
    +.tips:hover .tipsPop {
    +	-webkit-transition: opacity ease-in .5;
    +	display: block;
    +	opacity: 1;
    +	position: absolute;
    +	background: #FFF;
    +	border: 1px solid #fd7742;
    +	margin-top: -7px;
    +	margin-left: 220px;
    +	*margin-left: -95px;
    +	*margin-top: 25px;
    +}
    +
    +.right span {
    +	line-height: 30px;
    +	color: #7c8389;
    +}
    +
    +.displayMode {
    +	border: 1px solid #D7D7D7;
    +	height: 28px;
    +	background: #FFF;
    +	float: left;
    +	line-height: 30px;
    +	margin: 0 10px 0 5px;
    +}
    +
    +.displayMode a {
    +	width: 15px;
    +	height: 18px;
    +	margin: 6px;
    +	float: left;
    +	cursor: pointer;
    +	background-image: url(plug-in/login/images/icon21.png);
    +	background-repeat: no-repeat;
    +}
    +
    +.displayMode span {
    +	float: left;
    +}
    +
    +.displayMode .DMlist {
    +	background-position: -153px -59px;
    +}
    +
    +.displayMode .DMlist:hover,.displayMode .DMlistS {
    +	background-position: -153px -89px;
    +}
    +
    +.displayMode .DMchart {
    +	background-position: -182px -59px;
    +}
    +
    +.displayMode .DMchart:hover,.displayMode .DMchartS {
    +	background-position: -182px -89px;
    +}
    +
    +.DMchartContent {
    +	width: 410px;
    +	margin: 0 auto;
    +}
    +
    +.DMchartConentIn {
    +	background: url(../images/linebg.png) center repeat-y;
    +	width: 410px;
    +	float: left;
    +}
    +
    +.DMchartContent .list {
    +	padding-top: 60px;
    +}
    +
    +.nowStrock {
    +	background: url(../images/nowStock.png) no-repeat;
    +	width: 157px;
    +	height: 157px;
    +	overflow: hidden;
    +	margin: 0 auto;
    +}
    +
    +.nowStrock .num {
    +	padding: 70px 0 25px 0;
    +	width: 150px;
    +	text-align: center;
    +	color: #7c8389;
    +}
    +
    +.nowStrock .unit {
    +	width: 100px;
    +	margin: 0 auto;
    +	text-align: center;
    +	font-size: 16px;
    +	color: #7c8389;
    +	white-space: nowrap;
    +	overflow: hidden;
    +	text-overflow: ellipsis;
    +}
    +
    +.strockPlus .strockArrow,.strockShort .strockArrow {
    +	width: 54px;
    +}
    +
    +.strockPlus .strockText,.strockShort .strockText {
    +	width: 168px;
    +}
    +
    +.strockPlus .strockText .content,.strockShort .strockText .content {
    +	padding: 10px;
    +}
    +
    +.strockPlus .strockArrow .icon {
    +	background: url(../images/icon_stockPlus.png) no-repeat;
    +	display: inline-block;
    +}
    +
    +.one .strockArrow,.one .strockText {
    +	float: right;
    +}
    +
    +.two .strockArrow,.two .strockText {
    +	float: left;
    +}
    +
    +.one .strockArrow .arrow,.one .strockArrow .icon {
    +	float: right;
    +}
    +
    +.two .strockArrow .arrow,.two .strockArrow .icon {
    +	float: left;
    +}
    +
    +.one .strockArrow .icon {
    +	width: 37px;
    +	height: 43px;
    +}
    +
    +.two .strockArrow .icon {
    +	width: 37px;
    +	height: 43px;
    +}
    +
    +.strockShort .strockArrow .icon {
    +	background: url(../images/icon_stockShort.png) no-repeat;
    +	display: inline-block;
    +}
    +
    +.one {
    +	float: left;
    +	position: relative;
    +	margin: -50px 0 10px -4px;
    +	width: 230px;
    +}
    +
    +.two {
    +	float: right;
    +	position: relative;
    +	margin: -50px -9px 10px 0px;
    +	width: 230px;
    +}
    +
    +.one .strockArrow .arrow {
    +	background: url(../images/arrowR.png) no-repeat;
    +	width: 7px;
    +	height: 23px;
    +	margin-right: 10px;
    +}
    +
    +.two .strockArrow .arrow {
    +	background: url(../images/arrowL.png) no-repeat;
    +	width: 7px;
    +	height: 23px;
    +	margin-left: 10px;
    +}
    +
    +.strockText {
    +	border: 2px solid #e6e6e8;
    +}
    +
    +.strockText .strockData {
    +	background: #e6e6e8;
    +	font-size: 18px;
    +	line-height: 35px;
    +	color: #7c8389;
    +}
    +
    +.noAction table tr:hover td {
    +	background: #FFF;
    +}
    +
    +.tab_pd {
    +	float: left;
    +	border: 1px solid #2c8fff;
    +	border-radius: 3px;
    +	height: 30px;
    +	line-height: 30px;
    +}
    +
    +.tab_pd ul li {
    +	float: left;
    +}
    +
    +.tab_pdN a {
    +	color: #2c8fff;
    +	text-align: center;
    +	width: 120px;
    +	float: left;
    +	height: 30px;
    +}
    +
    +.tab_pdS a,.tab_pdN a:hover {
    +	background: #2c8fff;
    +	color: #FFF;
    +	text-align: center;
    +	width: 120px;
    +	float: left;
    +	height: 30px;
    +}
    +
    +/* 鏇存柊鏂版墜涓婅矾 */
    +.newMember2 {
    +	float: left;
    +}
    +
    +.newMember2 .step {
    +	background: #f8f8f8;
    +	border-bottom: 1px solid #DDD;
    +	padding: 20px 0;
    +	float: left;
    +	width: 100%;
    +}
    +
    +.newMember2 .step ul {
    +	padding-left: 20px;
    +}
    +
    +.newMember2 .step ul li {
    +	float: left;
    +	padding-right: 30px;
    +}
    +
    +.newMember2 .step ul li a {
    +	float: left;
    +}
    +
    +.newMember2 .step ul li a .icon {
    +	margin-right: 5px;
    +}
    +
    +.newMember2 .step ul li .stepN {
    +	font-size: 18px;
    +	color: #999;
    +	text-decoration: underline;
    +}
    +
    +.step ul li a {
    +	cursor: pointer;
    +}
    +
    +.newMember2 .step ul li .stepN .icon {
    +	background: url(../images/stepIcon.png) -30px 0;
    +	height: 22px;
    +	width: 22px;
    +	text-align: center;
    +	color: #FFF;
    +	font-size: 14px;
    +	line-height: 22px;
    +	display: inline-block;
    +}
    +
    +.newMember2 .step ul li .stepS,.newMember2 .step ul li .stepN:hover {
    +	font-size: 18px;
    +	text-decoration: none;
    +	color: #000;
    +}
    +
    +.newMember2 .step ul li .stepS .icon,.newMember2 .step ul li .stepN:hover .icon
    +	{
    +	background: url(../images/stepIcon.png) 0 0;
    +	height: 22px;
    +	width: 22px;
    +	text-align: center;
    +	color: #FFF;
    +	font-size: 14px;
    +	line-height: 22px;
    +	display: inline-block;
    +}
    +
    +.newMember2 .info {
    +	border-bottom: 1px solid #DDD;
    +	background-color: #fefef8;
    +	width: 100%;
    +	font-size: 12px;
    +	text-indent: 20px;
    +	padding: 10px 0;
    +	float: left;
    +}
    +
    +.newMember2 .content {
    +	float: left;
    +	width: 100%;
    +	padding-bottom: 100px;
    +}
    +
    +.newMember2 .content .contentIn {
    +	padding: 20px 20px 0 20px;
    +	float: left;
    +}
    +
    +.newMember2 .content .contentL {
    +	float: left;
    +	width: 330px;
    +}
    +
    +.newMember2 .content .contentL .title,.newMember2 .content .contentR .title
    +	{
    +	font-size: 24px;
    +	color: #000;
    +	line-height: 50px;
    +	display: block;
    +	padding-bottom: 10px;
    +}
    +
    +.newMember2 .metro90 {
    +	width: 90px;
    +	height: 90px;
    +	float: left;
    +	margin-right: 5px;
    +}
    +
    +.newMember2 .metro90 .icon {
    +	width: 90px;
    +	height: 50px;
    +	text-align: center;
    +	padding-top: 15px;
    +}
    +
    +.newMember2 .metro90 .text {
    +	width: 90px;
    +	text-align: center;
    +	color: #FFF;
    +}
    +
    +.newMember2 .content .contentL .buttonArea {
    +	float: left;
    +	width: 100%;
    +}
    +
    +.newMember2 .content .contentR {
    +	float: left;
    +	width: 300px;
    +}
    +
    +.newMember2 .content .contentR .buttonArea {
    +	float: left;
    +	width: 100%;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li {
    +	float: left;
    +	width: 150px;
    +	padding-bottom: 15px;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li a .icon {
    +	background: url(../images/membericon4.png) no-repeat;
    +	width: 30px;
    +	height: 30px;
    +	float: left;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon1 .icon {
    +	background-position: 0 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon1:hover .icon {
    +	background-position: -30px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon2 .icon {
    +	background-position: -60px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon2:hover .icon {
    +	background-position: -90px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon3 .icon {
    +	background-position: -120px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon3:hover .icon {
    +	background-position: -150px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon4 .icon {
    +	background-position: -180px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon4:hover .icon {
    +	background-position: -210px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon5 .icon {
    +	background-position: -240px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon5:hover .icon {
    +	background-position: -270px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon6 .icon {
    +	background-position: -300px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon6:hover .icon {
    +	background-position: -330px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon8 .icon {
    +	background-position: -360px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li .icon8:hover .icon {
    +	background-position: -390px 0;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li a .text {
    +	font-size: 14px;
    +	line-height: 30px;
    +	height: 30px;
    +	float: left;
    +	padding-left: 10px;
    +	color: #666;
    +}
    +
    +.newMember2 .content .contentR .buttonArea ul li a:hover .text {
    +	color: #F00;
    +}
    +
    +.metro110 {
    +	width: 90px;
    +	height: 110px;
    +	float: left;
    +	margin-right: 5px;
    +}
    +
    +.metro110 .icon {
    +	width: 90px;
    +	height: 60px;
    +	float: left;
    +	padding-top: 20px;
    +	text-align: center;
    +	vertical-align: middle;
    +}
    +
    +.metro110 .text {
    +	width: 90px;
    +	float: left;
    +	text-align: center;
    +	color: #FFF;
    +}
    +
    +.metroCyan,.metroRed2,.metroBlue2,.metroPurple2 {
    +	color: #FFF;
    +	display: block;
    +	vertical-align: bottom;
    +}
    +
    +.metroCyan {
    +	background-color: #43b0a7;
    +}
    +
    +.metroCyan:hover {
    +	background-color: #4fd7cc;
    +}
    +
    +.metroRed2 {
    +	background-color: #fa646b;
    +}
    +
    +.metroRed2:hover {
    +	background-color: #f79fa3;
    +}
    +
    +.metroBlue2 {
    +	background-color: #00bbf1;
    +}
    +
    +.metroBlue2:hover {
    +	background-color: #2fd0ff;
    +}
    +
    +.metroPurple2 {
    +	background-color: #d485f7;
    +}
    +
    +.metroPurple2:hover {
    +	background-color: #e8b5ff;
    +}
    +
    +.newMember2 .blueButtonBig {
    +	background-color: #1c7efb;
    +	width: 280px;
    +	height: 57px;
    +	display: block;
    +	text-align: center;
    +	line-height: 57px;
    +	font-size: 16px;
    +	color: #FFF;
    +}
    +
    +.newMember2 .blueButtonBig:hover {
    +	background-color: #4b98f9;
    +	color: #FFF;
    +}
    +
    +.newMemberList {
    +	padding: 10px;
    +}
    +
    +.newMemberList li {
    +	float: left;
    +	width: 150px;
    +}
    +
    +.newMemberList .title {
    +	font-size: 24px;
    +	padding-bottom: 20px;
    +	float: left;
    +}
    +
    +.newMemberList li a {
    +	float: left;
    +	width: 150px;
    +	padding-bottom: 15px;
    +}
    +
    +.newMemberList li a .icon {
    +	width: 14px;
    +	height: 14px;
    +	float: left;
    +}
    +
    +.newMemberList li a .text {
    +	font-size: 14px;
    +	color: #666;
    +	padding-left: 10px;
    +	float: left;
    +	line-height: 14px;
    +}
    +
    +.newMemberList li a:hover .text {
    +	color: #F00;
    +}
    +
    +.greenM {
    +	background-color: #6cbe4a;
    +}
    +
    +.redM {
    +	background-color: #fa646b;
    +}
    +
    +.purpleM {
    +	background-color: #d485f7;
    +}
    +
    +.cyanM {
    +	background-color: #43b0a7;
    +}
    +
    +.blueM {
    +	background-color: #00bbf1;
    +}
    +
    +.blue2M {
    +	background-color: #1c7efb;
    +}
    +
    +.metroGreen,.metroRed,.metroBlue {
    +	width: 290px;
    +	height: 85px;
    +	color: #FFF;
    +	display: block;
    +	vertical-align: bottom;
    +}
    +
    +.metroGreen {
    +	background-color: #5cb101;
    +}
    +
    +.metroGreen:hover {
    +	background-color: #80d921;
    +}
    +
    +.metroRed {
    +	background-color: #b52b52;
    +}
    +
    +.metroRed:hover {
    +	background-color: #dd3f6c;
    +}
    +
    +.metroBlue {
    +	background-color: #0d4c99;
    +}
    +
    +.metroBlue:hover {
    +	background-color: #3f7bc3;
    +}
    +
    +.bigButton {
    +	font-size: 18px;
    +	padding: 10px 50px;
    +}
    +
    +/* 鐧诲綍淇敼 */
    +#loginContanier {
    +	background: url(../images/blueLine.png) repeat-x 0 107px #fff;
    +}
    +
    +.loginHeader {
    +	height: 107px;
    +	width: 100%;
    +	margin: 0 auto;
    +}
    +
    +.loginHeader .logo {
    +	background: url(../images/logo.jpg) no-repeat 30px 20px;
    +	width: 408px;
    +	height: 92px;
    +	float: left;
    +}
    +
    +.version {
    +	float: right;
    +	margin-top: 40px;
    +	height: 40px;
    +	padding-right: 10px;
    +}
    +
    +.version .android,.version .iOS,.version .weibo,.version .showcase {
    +	background-image: url(../images/loginIcon.png);
    +	background-repeat: no-repeat;
    +	height: 40px;
    +	display: inline-block;
    +	float: left;
    +}
    +
    +.version .android:hover,.version .iOS:hover,.version .weibo:hover,.version .showcase:hover
    +	{
    +	background-image: url(../images/loginIcon.png);
    +	background-repeat: no-repeat;
    +	height: 40px;
    +}
    +
    +.version .android {
    +	background-position: 0 0;
    +	width: 159px;
    +}
    +
    +.version .android:hover {
    +	background-position: 0 -40px;
    +	width: 159px;
    +}
    +
    +.version .iOS {
    +	background-position: -159px 0;
    +	width: 119px;
    +}
    +
    +.version .iOS:hover {
    +	background-position: -159px -40px;
    +	width: 119px;
    +}
    +
    +.version .weibo {
    +	background-position: -278px 0;
    +	width: 110px;
    +}
    +
    +.version .weibo:hover {
    +	background-position: -278px -40px;
    +	width: 110px;
    +}
    +
    +.version .showcase {
    +	background-position: -390px 0;
    +	width: 110px;
    +}
    +
    +.version .showcase:hover {
    +	background-position: -390px -40px;
    +	width: 110px;
    +}
    +
    +.loginBody {
    +	width: 100%;
    +	overflow-x: hidden;
    +}
    +
    +.loginMain {
    +	position: absolute;
    +	height: 530px;
    +	width: 100%;
    +	min-width: 1002px;
    +	top: 107px;
    +}
    +
    +.loginMain ul li {
    +	width: 100%;
    +	height: 530px;
    +	float: left;
    +}
    +
    +.bg0 {
    +	background: url(../images/loginBg4.jpg) no-repeat center;
    +}
    +
    +.bg1 {
    +	background: url(../images/loginBg1.jpg) no-repeat center;
    +}
    +
    +.bg2 {
    +	background: url(../images/loginBg2.jpg) no-repeat center;
    +}
    +
    +.bg3 {
    +	background: url(../images/loginBg3.jpg) no-repeat center;
    +}
    +
    +.bg4 {
    +	background: url(../images/loginBg5.jpg) no-repeat center;
    +}
    +
    +.bg5 {
    +	background: url(../images/loginBg.jpg) no-repeat center;
    +}
    +
    +.loginMainIn {
    +	height: 530px;
    +	margin: 0 auto;
    +	position: relative;
    +	z-index: 10;
    +}
    +
    +.loginForm {
    +	float: right;
    +	background: url(../images/loginFormBg.png) bottom no-repeat;
    +	width: 398px;
    +	height: 379px;
    +	padding-top: 80px;
    +	padding-right: 30px;
    +}
    +
    +.loginForm ul {
    +	float: left;
    +	padding: 30px 0 0 10px;
    +}
    +
    +.loginForm ul li {
    +	float: left;
    +	padding: 10px 0;
    +}
    +
    +.loginForm ul li h1 {
    +	font-size: 18px;
    +	color: #000;
    +	float: left;
    +	width: 100px;
    +	display: inline-block;
    +	line-height: 38px;
    +	text-align: right;
    +}
    +
    +.loginForm ul li h2 {
    +	float: left;
    +	display: inline-block;
    +	width: 230px;
    +}
    +
    +.loginForm ul li h2 .loginInput,.loginForm ul li h2 .passWord {
    +	background: url(../images/loginInput.png);
    +	border: 0px;
    +	height: 16px;
    +	line-height: 16px;
    +	font-size: 16px;
    +	color: #000;
    +	padding: 12px 0 12px 8px;
    +	width: 222px;
    +	display: inline-block;
    +}
    +
    +.loginForm ul li h2 .loginInput2 {
    +	background: url(../images/loginInput2.png);
    +	border: 0px;
    +	height: 16px;
    +	line-height: 16px;
    +	font-size: 16px;
    +	color: #000;
    +	padding: 12px 0 12px 8px;
    +	width: 134px;
    +	float: left;
    +}
    +
    +.loginForm ul li h2 .yzm {
    +	padding: 2px;
    +	float: right;
    +	/*background: url(../images/yzmbg.png);*/
    +	width: 82px;
    +	height: 36px;
    +}
    +
    +.loginForm ul li h2 .passWord .loginInput3 {
    +	border: 0px;
    +	background: none;
    +	float: left;
    +	height: 16px;
    +	line-height: 16px;
    +	color: #000;
    +	font-size: 16px;
    +	width: 150px;
    +}
    +
    +.Off {
    +	background-image: url(../images/loginPassword.png);
    +	width: 62px;
    +	height: 21px;
    +	float: right;
    +	margin-right: 3px;
    +	margin-top: -2px;
    +}
    +
    +.On {
    +	background-image: url(../images/loginPassword.png);
    +	background-position: 0 -21px;
    +	width: 62px;
    +	height: 21px;
    +	float: right;
    +	margin-right: 3px;
    +	margin-top: -2px;
    +}
    +
    +.loginButton {
    +	background: url(../images/loginButton.gif) 0 0;
    +	width: 229px;
    +	height: 44px;
    +	display: inline-block;
    +}
    +
    +.loginButton:hover {
    +	background: url(../images/loginButton.gif) 0 -44px;
    +}
    +
    +.loginButtonRun {
    +	background: url(../images/loginButton.gif) 0 -88px;
    +	width: 229px;
    +	height: 44px;
    +	display: inline-block;
    +}
    +
    +.loginFooter {
    +	width: 1200px;
    +	margin: 20px auto 10px auto;
    +	color: #999;
    +	vertical-align: top;
    +	text-align: center;
    +}
    +
    +.androidDownload {
    +	background: url(../images/downloadBg.png) no-repeat;
    +	width: 312px;
    +	height: 93px;
    +	padding: 20px 0 10px 10px;
    +	position: relative;
    +	z-index: 100;
    +	top: 40px;
    +	left: -120px;
    +}
    +
    +.androidDownload .qr {
    +	float: left;
    +	width: 54px;
    +	height: 54px;
    +	padding: 15px 15px 0 20px;
    +}
    +
    +.androidDownload .text {
    +	padding-top: 10px;
    +}
    +
    +.androidDownload .text span {
    +	font-size: 14px;
    +	color: #999;
    +	float: left;
    +	height: 30px;
    +	line-height: 30px;
    +}
    +
    +.androidDownload .text a {
    +	background-image: url(../images/download.png);
    +	width: 180px;
    +	height: 28px;
    +	float: left;
    +	display: inline-block;
    +}
    +
    +.androidDownload .text a:hover {
    +	background-position: 0 -28px;
    +}
    +
    +.iOSDownload {
    +	top: 40px;
    +	left: -120px;
    +}
    +
    +.artbox {
    +	width: 100%;
    +	background: #FFF;
    +}
    +
    +.article h1 {
    +	color: #333;
    +	font-size: 18px;
    +	text-align: center;
    +	padding: 10px;
    +}
    +
    +.article .info {
    +	color: #999;
    +	text-align: center;
    +	border-bottom: 1px dotted #CCC;
    +	padding-bottom: 10px;
    +}
    +
    +.artbox .article #Content {
    +	padding: 20px;
    +}
    +
    +/* 鏅鸿兘鎻愮ず妗嗘牱寮 20130402 */
    +.autoCompleteBox {
    +	border: 1px solid #D7D7D7;
    +	position: absolute;
    +	overflow-y: auto;
    +	overflow-x: hidden;
    +	display: none;
    +	z-index: 999999;
    +}
    +
    +.autoCompleteBox table {
    +	background: none repeat scroll 0 0 #FFFFFF;
    +	cursor: default;
    +	width: 100%;
    +}
    +
    +.autoCompleteBox table th {
    +	background: #e3f4fe;
    +	border-bottom: 1px solid #d7d7d7;
    +	height: 23px;
    +	font-size: 12px;
    +	padding: 0 4px;
    +	line-height: 23px;
    +	color: #9a6a00;
    +	text-align: left;
    +}
    +
    +.autoCompleteBox table tr {
    +	background: #fcf3f3;
    +}
    +
    +.autoCompleteBox table td {
    +	border-bottom: 1px solid #eee;
    +	height: 23px;
    +	line-height: 23px;
    +	color: #4c4c4b;
    +	padding: 0 4px;
    +	font-size: 12px;
    +	background-color: #FFF;
    +}
    +
    +.autoCompleteBox table td:hover {
    +	background: #f7fff3;
    +}
    +
    +.autoCompleteBox .nowRow {
    +	background: #fbdab0;
    +	border-bottom: 1px solid #e2d2ac;
    +	height: 23px;
    +	line-height: 23px;
    +	color: #4c4c4b;
    +	cursor: pointer;
    +}
    +
    +.autoCompleteBox .key {
    +	color: #F00;
    +	font-weight: bold;
    +}
    +
    +/* 閿欒 */
    +.errorContainer {
    +	width: 94%;
    +	padding: 20px 3%;
    +	min-width: 882px;
    +}
    +
    +.permissionImg {
    +	background: url(../images/nopermission.png) no-repeat center;
    +	width: 300px;
    +	height: 300px;
    +	padding: 160px 30px 80px 30px;
    +	float: left;
    +}
    +
    +.errorImg {
    +	background: url(../images/error.png) no-repeat center;
    +	width: 300px;
    +	height: 300px;
    +	padding: 120px 100px 80px 30px;
    +	float: left;
    +}
    +
    +/* 绯荤粺閲嶇疆 20130425 */
    +.checkBoxArea li {
    +	border-radius: 5px;
    +	background: #efefef;
    +	width: 110px;
    +	height: 40px;
    +	line-height: 40px;
    +	float: left;
    +	margin: 0 10px 10px 0;
    +	font-size: 14px;
    +	padding-left: 10px;
    +}
    +
    +.checkBoxArea li:hover {
    +	background: #d7d7d7;
    +	cursor: default;
    +}
    +
    +.orangeButton2 {
    +	background-color: #f15d2f;
    +	color: #FFF;
    +	height: 27px;
    +	display: inline-block;
    +	line-height: 27px;
    +	padding: 5px 20px;
    +}
    +
    +.orangeButton2:hover {
    +	background-color: #ff7c53;
    +	color: #FFF;
    +	-webkit-transition: ease-in .3s background-color;
    +	-moz-transition: ease-in .3s background-color;
    +	-ms-transition: ease-in .3s background-color;
    +	-o-transition: ease-in .3s background-color;
    +}
    +
    +/* 瀵煎叆鑱旂郴浜 20130426 */
    +.importContact {
    +	padding: 20px;
    +}
    +
    +.importContact .title {
    +	font-size: 24px;
    +	color: #000;
    +	padding-bottom: 20px;
    +}
    +
    +.importContact .tab {
    +	display: block;
    +	width: 100%;
    +	height: 141px;
    +	background-color: #d8d7d7;
    +}
    +
    +.importContact .tab ul {
    +	padding: 5px 5px 0 5px;
    +}
    +
    +.importContact .tab ul .tabN {
    +	float: left;
    +	border: 3px solid #d8d7d7;
    +	border-width: 3px 3px 5px 3px;
    +	height: 128px;
    +	margin-right: 5px;
    +}
    +
    +.importContact .tab ul .tabN:hover,.importContact .tab ul .tabS {
    +	float: left;
    +	border: 3px solid #FFF;
    +	border-width: 3px 3px 5px 3px;
    +	height: 128px;
    +	margin-right: 5px;
    +}
    +
    +.importButtonArea {
    +	border-bottom: 1px dashed #DCDCDC;
    +	padding: 0 0 10px 0;
    +	display: inline-block;
    +	width: 100%;
    +}
    +
    +.gmailLogin {
    +	background: url(../images/gmailLogin.gif);
    +	width: 262px;
    +	height: 55px;
    +	display: inline-block;
    +}
    +
    +.gmailLogin:hover {
    +	background: url(../images/gmailLogin.gif) -262px 0;
    +	height: 55px;
    +}
    +
    +.excelTemp {
    +	background: url(../images/excelTemp.gif);
    +	width: 197px;
    +	height: 55px;
    +	display: inline-block;
    +}
    +
    +.excelTemp:hover {
    +	background: url(../images/excelTemp.gif) -197px 0;
    +	height: 55px;
    +}
    +
    +/* 甯愬绠$悊  */
    +.newAccount {
    +	float: left;
    +	width: 304px;
    +	min-height: 310px;
    +	overflow: hidden;
    +	margin: 0 20px 20px 0;
    +}
    +
    +.newAccount .top {
    +	line-height: 40px;
    +}
    +
    +.newAccount .top .date {
    +	float: left;
    +	color: #ff7800;
    +	width: 80px;
    +	padding-left: 20px;
    +	background: none;
    +}
    +
    +.newAccount .top .state {
    +	float: left;
    +	color: #495056;
    +	width: 194px;
    +	padding-right: 10px;
    +	text-align: right;
    +}
    +
    +.newAccount .title {
    +	width: 284px;
    +	height: 40px;
    +	font-size: 16px;
    +	color: #FFF;
    +	padding-top: 60px;
    +	padding-left: 20px;
    +	overflow: hidden;
    +}
    +
    +.newAccount .content {
    +	padding: 20px 20px 0 20px;
    +	min-height: 150px;
    +}
    +
    +.accountOpen .top .state .stateButton {
    +	background-image: url(../images/accountButton1.png);
    +	margin-top: 5px;
    +	background-position: 0 0;
    +	background-repeat: no-repeat;
    +	width: 68px;
    +	height: 27px;
    +	float: right;
    +}
    +
    +/*.accountOpen:hover .top .state .stateButton {
    +    background-image: url(../images/accountButton1.png);
    +    background-position: -68px 0;
    +}
    +
    +    .accountOpen:hover .top .state .stateButton:hover {
    +        background-image: url(../images/accountButton1.png);
    +        background-position: -136px 0;
    +    }
    +
    +    .accountOpen:hover .top .state .stateButton:active {
    +        background-image: url(../images/accountButton1.png);
    +        background-position: -204px 0;
    +    }
    +*/
    +.newAccount:hover .accountEditArea {
    +	position: absolute;
    +	margin-top: -55px;
    +	margin-left: 248px;
    +}
    +
    +.newAccount:hover .accountEditArea .accountEdit {
    +	background-image: url(../images/accountEdit.png);
    +	width: 56px;
    +	height: 55px;
    +	display: inline-block;
    +}
    +
    +.newAccount:hover .accountEditArea .accountEdit:hover {
    +	background-image: url(../images/accountEdit.png);
    +	background-position: -56px 0;
    +}
    +
    +.accountBeginning .top .state .stateButton {
    +	background-image: url(../images/accountButton2.png);
    +	margin-top: 5px;
    +	background-position: 0 0;
    +	background-repeat: no-repeat;
    +	width: 68px;
    +	height: 27px;
    +	float: right;
    +}
    +
    +.accountBeginning:hover .top .state .stateButton {
    +	background-image: url(../images/accountButton2.png);
    +	background-position: -68px 0;
    +}
    +
    +.accountBeginning:hover .top .state .stateButton:hover {
    +	background-image: url(../images/accountButton2.png);
    +	background-position: -136px 0;
    +}
    +
    +.accountBeginning:hover .top .state .stateButton:active {
    +	background-image: url(../images/accountButton2.png);
    +	background-position: -204px 0;
    +}
    +
    +.newAccount .editTitle {
    +	font-size: 18px;
    +	color: #53606b;
    +	height: 45px;
    +	line-height: 45px;
    +	border-bottom: #dfdfdf 1px solid;
    +	margin: 0 5px;
    +	text-indent: 5px;
    +}
    +/*
    +.accountOpen:hover .top .state .stateButton {
    +    background-image: url(../images/accountButton1.png);
    +    background-position: -68px 0;
    +}*/
    +.newAccount .top .state .carryOver {
    +	background-image: url(../images/accountButton3.png);
    +	margin-top: 5px;
    +	background-position: 0 0;
    +	background-repeat: no-repeat;
    +	width: 68px;
    +	height: 27px;
    +	float: right;
    +	margin-left: 5px;
    +}
    +
    +.newAccount:hover .top .state .carryOver {
    +	background-image: url(../images/accountButton3.png);
    +	background-position: -68px 0;
    +}
    +
    +.newAccount:hover .top .state .carryOver:hover {
    +	background-image: url(../images/accountButton3.png);
    +	background-position: -136px 0;
    +}
    +
    +.newAccount:hover .top .state .carryOver:active {
    +	background-image: url(../images/accountButton3.png);
    +	background-position: -204px 0;
    +}
    +
    +/*loading*/
    +.loading {
    +	height: 50px;
    +	width: 200px;
    +	border-radius: 5PX;
    +	border: 1PX #D7D7D7 solid;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
    +	position: absolute;
    +	display: none;
    +	background: url(../images/loaderc.gif) center no-repeat #FFF;
    +	top: 300px;
    +	left: 45%;
    +	z-index: 10000;
    +}
    +
    +.imploading {
    +	height: 40px;
    +	padding-top: 60px;
    +	width: 400px;
    +	border-radius: 5PX;
    +	border: 1PX #D7D7D7 solid;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
    +	position: absolute;
    +	display: none;
    +	background: url(../images/loaderc.gif) 150px 30px no-repeat #FFF;
    +	top: 150px;
    +	left: 30%;
    +	z-index: 10000;
    +	text-align: center;
    +}
    +
    +/* 鏂伴椈鏍峰紡 */
    +.newsBox .newsList {
    +	border-bottom: 1px solid #e9e9e9;
    +	display: block;
    +	padding: 5px;
    +	margin-bottom: 5px;
    +}
    +
    +.newsBox .newsList:hover {
    +	background-color: #F8F8F8;
    +}
    +
    +.newsBox .unread .readTag {
    +	background: #6cbe4a;
    +	width: 5px;
    +	height: 60px;
    +	float: left;
    +}
    +
    +.newsBox .readTag {
    +	width: 5px;
    +	height: 60px;
    +	float: left;
    +	margin-right: 10px;
    +}
    +
    +.newsBox .newsLink {
    +	display: block;
    +	background: url(../images/newsArrow.png) no-repeat right;
    +}
    +
    +.newsBox .newsLink:hover {
    +	background: url(../images/newsArrow.png) no-repeat right;
    +}
    +
    +.newsBox .newsList .newsTitle {
    +	font-size: 14px;
    +	color: #777;
    +	white-space: nowrap;
    +	overflow: hidden;
    +	text-overflow: ellipsis;
    +	width: 600px;
    +	text-align: left;
    +}
    +
    +.newsBox .unread .newsTitle {
    +	font-size: 14px;
    +	color: #454c51;
    +	white-space: nowrap;
    +	overflow: hidden;
    +	text-overflow: ellipsis;
    +	width: 600px;
    +	text-align: left;
    +}
    +
    +.newsBox .unread .newsDate,.newsBox .newsList .newsDate {
    +	color: #999;
    +	text-align: left;
    +}
    +
    +.newsBox .text {
    +	padding: 5px;
    +}
    +
    +.newsIntro {
    +	font-size: 12px;
    +	color: #777;
    +	text-align: left;
    +}
    +
    +.NLcontent {
    +	height: 60px;
    +}
    +
    +/* 缁忚惀鐘跺喌鍒嗘瀽 */
    +.chartBox {
    +	width: 359px;
    +	height: 470px;
    +	overflow: hidden;
    +	margin: 0 10px 10px 0;
    +	float: left;
    +}
    +
    +.chartBox .title {
    +	font-size: 16px;
    +	padding-left: 15px;
    +	float: left;
    +	font-weight: bold;
    +	line-height: 40px;
    +}
    +
    +.chartBox .chartTab {
    +	float: right;
    +	padding-right: 5px;
    +}
    +
    +.chartBox .chartTab ul li {
    +	float: left;
    +	padding-top: 13px;
    +	margin-left: 1px;
    +}
    +
    +.chartBox .chartTab ul li a {
    +	float: left;
    +	padding: 0 10px;
    +	line-height: 27px;
    +}
    +
    +.chartArea {
    +	clear: both;
    +	float: left;
    +	width: 359px;
    +	text-align: center;
    +}
    +
    +.lineChart {
    +	height: 138px;
    +	text-align: center;
    +	padding: 20px 0;
    +}
    +
    +.lineChartN {
    +	height: 138px;
    +	text-align: center;
    +	padding: 20px 0;
    +	display: none;
    +}
    +
    +.chartDate {
    +	clear: both;
    +	float: left;
    +	padding: 10px 15px;
    +}
    +
    +.chartDate p {
    +	color: #9ea7b3;
    +	width: 359px;
    +}
    +
    +.chartDate p .mNum {
    +	font-size: 48px;
    +	line-height: 48px;
    +}
    +
    +.chartDateLine {
    +	border-top: 1px solid #eaedf1;
    +}
    +
    +.greenChart .title {
    +	color: #1fbba6;
    +}
    +
    +.greenChart .chartTab ul .chartTabN a {
    +	color: #1fbba6;
    +}
    +
    +.greenChart .chartTab ul .chartTabN a:hover,.greenChart .chartTab ul .chartTabS a
    +	{
    +	background: #1fbba6;
    +	color: #FFF;
    +}
    +
    +.greenChart .lineChart {
    +	background: #1fbba6;
    +}
    +
    +.greenChart p .mNum {
    +	color: #1fbba6;
    +}
    +
    +.orangeChart .title {
    +	color: #f27935;
    +}
    +
    +.orangeChart .chartTab ul .chartTabN a {
    +	color: #f27935;
    +}
    +
    +.orangeChart .chartTab ul .chartTabN a:hover,.orangeChart .chartTab ul .chartTabS a
    +	{
    +	background: #f27935;
    +	color: #FFF;
    +}
    +
    +.orangeChart .lineChart {
    +	background: #f27935;
    +}
    +
    +.orangeChart p .mNum {
    +	color: #f27935;
    +}
    +
    +.blueChart .title {
    +	color: #14b9d6;
    +}
    +
    +.blueChart .chartTab ul .chartTabN a {
    +	color: #14b9d6;
    +}
    +
    +.blueChart .chartTab ul .chartTabN a:hover,.blueChart .chartTab ul .chartTabS a
    +	{
    +	background: #14b9d6;
    +	color: #FFF;
    +}
    +
    +.blueChart .lineChart {
    +	background: #14b9d6;
    +}
    +
    +.blueChart p .mNum {
    +	color: #14b9d6;
    +}
    +
    +.chartMore {
    +	display: none;
    +}
    +
    +.viewDetail:hover .chartMore {
    +	display: block;
    +	position: absolute;
    +	background: url(../images/chartMore.png);
    +	width: 56px;
    +	height: 55px;
    +	margin: 415px 0 0 304px; +
    +	margin: 415px 0 0 224px;
    +}
    +
    +.viewDetail:hover .chartMore:hover {
    +	display: block;
    +	position: absolute;
    +	background: url(../images/chartMore.png) -57px 0;
    +	width: 56px;
    +	height: 55px;
    +}
    +
    +.viewDetail .chartMore a {
    +	width: 56px;
    +	height: 55px;
    +	display: block;
    +}
    +
    +.chartBottomTab {
    +	position: absolute;
    +	width: 359px;
    +	height: 120px;
    +	background: #f9fafc;
    +}
    +
    +.chartBottomTab ul li {
    +	width: 119px;
    +	float: left;
    +	height: 120px;
    +}
    +
    +.chartBottomTab ul li a {
    +	cursor: pointer;
    +}
    +
    +.chartBottomTab ul li a .photo {
    +	background: url(../images/chartIcon.png);
    +	width: 60px;
    +	height: 60px;
    +	float: left;
    +	margin: 20px 29px 10px 29px;
    +	cursor: pointer;
    +}
    +
    +.chartBottomTab ul li a .text {
    +	width: 119px;
    +	text-align: center;
    +	color: #5e6d81;
    +	font-size: 14px;
    +	float: left;
    +	cursor: pointer;
    +}
    +
    +.chartBottomTab ul li a:hover .text {
    +	color: #14b9d6;
    +}
    +
    +.chartBottomTab .profitTab1N {
    +	background: #f9fafc;
    +	border-top: 1px solid #eaedf1;
    +}
    +
    +.chartBottomTab .profitTab1S,.chartBottomTab .profitTab1N:hover {
    +	background: #FFF;
    +	border-top: 1px solid #FFF;
    +}
    +
    +.chartBottomTab .profitTab1S .text,.chartBottomTab .profitTab1N:hover .text
    +	{
    +	color: #14b9d6;
    +}
    +
    +.chartBottomTab .profitTab1N .photo {
    +	background-position: -15px -22px;
    +}
    +
    +.chartBottomTab .profitTab1S .photo,.chartBottomTab .profitTab1N:hover .photo
    +	{
    +	background-position: -15px -102px;
    +}
    +
    +.chartBottomTab .profitTab2N {
    +	background: #f9fafc;
    +	border-top: 1px solid #eaedf1;
    +	border-right: 1px solid #eaedf1;
    +	border-left: 1px solid #eaedf1;
    +}
    +
    +.chartBottomTab .profitTab2S,.chartBottomTab .profitTab2N:hover {
    +	background: #FFF;
    +	border-top: 1px solid #FFF;
    +	border-right: 1px solid #eaedf1;
    +	border-left: 1px solid #eaedf1;
    +}
    +
    +.chartBottomTab .profitTab2S .text,.chartBottomTab .profitTab2N:hover .text
    +	{
    +	color: #14b9d6;
    +}
    +
    +.chartBottomTab .profitTab2N .photo {
    +	background-position: -140px -22px;
    +}
    +
    +.chartBottomTab .profitTab2S .photo,.chartBottomTab .profitTab2N:hover .photo
    +	{
    +	background-position: -140px -102px;
    +}
    +
    +.chartBottomTab .profitTab3N {
    +	background: #f9fafc;
    +	border-top: 1px solid #eaedf1;
    +}
    +
    +.chartBottomTab .profitTab3S,.chartBottomTab .profitTab3N:hover {
    +	background: #FFF;
    +	border-top: 1px solid #FFF;
    +}
    +
    +.chartBottomTab .profitTab3S .text,.chartBottomTab .profitTab3N:hover .text
    +	{
    +	color: #14b9d6;
    +}
    +
    +.chartBottomTab .profitTab3N .photo {
    +	background-position: -255px -22px;
    +}
    +
    +.chartBottomTab .profitTab3S .photo,.chartBottomTab .profitTab3N:hover .photo
    +	{
    +	background-position: -255px -102px;
    +}
    +
    +/* 涓氬姟璁剧疆 */
    +.setList ul li {
    +	border-bottom: 1px solid #eeeeee;
    +	width: 96%;
    +	padding: 0 1%;
    +	margin: 0 1%;
    +	background: #FFF;
    +	height: 38px;
    +	line-height: 38px;
    +	color: #666666;
    +}
    +
    +.setList ul li:hover {
    +	background: #F8F8F8;
    +}
    +
    +.uncheck:hover {
    +	background: url(../images/icon2.png) -197px -136px no-repeat;
    +	width: 28px;
    +	height: 28px;
    +	margin-top: 5px;
    +	cursor: pointer;
    +}
    +
    +.checked {
    +	background: url(plug-in/login/images/icon21.png) -36px -136px no-repeat;
    +	width: 28px;
    +	height: 28px;
    +	margin-top: 5px;
    +	cursor: pointer;
    +}
    +
    +.uncheck {
    +	background: url(plug-in/login/images/icon21.png) 0 -136px no-repeat;
    +	width: 28px;
    +	height: 28px;
    +	margin-top: 5px;
    +	cursor: pointer;
    +}
    +
    +/* 鎵撳嵃 */
    +.printButton {
    +	width: 110px;
    +	height: 128px;
    +	float: left;
    +	margin: 0 10px 5px 0;
    +	cursor: pointer;
    +}
    +
    +.A4 {
    +	font-size: 24px;
    +	line-height: 24px;
    +	color: #a9aaaa;
    +	text-align: center;
    +	background: url(../images/printIconA4.png) center no-repeat #FFF;
    +	border: 1px solid #D7D7D7;
    +}
    +
    +.A4 span {
    +	padding-top: 50px;
    +	float: left;
    +	width: 110px;
    +}
    +
    +.others {
    +	background: url(../images/printOthers.png) center no-repeat #FFF;
    +	border: 1px solid #D7D7D7;
    +}
    +
    +.others .title {
    +	text-align: center;
    +	font-size: 14px;
    +	color: #A9aaaa;
    +	width: 110px;
    +	float: left;
    +	padding-top: 40px;
    +	border: none;
    +	text-indent: 0px;
    +	margin: 0px;
    +}
    +
    +.others .text {
    +	text-align: center;
    +	font-size: 10px;
    +	color: #A9AAAA;
    +	width: 110px;
    +	float: left;
    +	text-indent: 0px;
    +	margin: 0px;
    +	padding-left: 0px;
    +	padding-right: 0px;
    +}
    +
    +.printButton:hover {
    +	background-color: #fffded;
    +	color: #000;
    +}
    +
    +.printButton:hover span {
    +	color: #000;
    +}
    +
    +.borderB {
    +	border-bottom: 1px solid #e9e9e9;
    +}
    +
    +.activeSMS {
    +	background: url(../images/activeImg.jpg) bottom right no-repeat #FFF;
    +}
    +
    +.noActionButton,.noActionButton:hover,.noActionButton:active {
    +	border: 1px solid #d1d1d1;
    +	border-radius: 3px;
    +	background-color: #e6e6e8;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f3f3f3,
    +		endcolorstr=#e6e6e8, gradientType=0);
    +	height: 28px;
    +	padding: 0 20px;
    +	cursor: default;
    +	line-height: 28px;
    +	display: inline-block;
    +	color: #B9B9B9;
    +}
    +
    +.SMSwhy:hover .activeTips {
    +	display: block;
    +}
    +
    +.activeTips {
    +	border: 1px solid #D7D7D7;
    +	box-shadow: 0 3px 2px rgba(0, 0, 0, 0.2);
    +	background: #FFF;
    +	padding: 3px;
    +	display: none;
    +	position: absolute;
    +}
    +
    +.loginSwitch {
    +	background: url(../images/loginSwitchBg.png);
    +	width: 123px;
    +	height: 18px;
    +	position: absolute;
    +	padding: 3px 0 0 20px;
    +	top: 600px;
    +	left: 45%;
    +	z-index: 9000;
    +}
    +
    +.loginSwitchOn,.loginSwitchOff:hover {
    +	background: url(../images/loginSwitchOn.png) no-repeat center;
    +	width: 13px;
    +	height: 14px;
    +	display: inline-block;
    +	padding-right: 10px;
    +	cursor: pointer;
    +}
    +
    +.loginSwitchOff {
    +	background: url(../images/loginSwitchOff.png) no-repeat center;
    +	width: 13px;
    +	height: 14px;
    +	display: inline-block;
    +	padding-right: 10px;
    +	cursor: pointer;
    +}
    +
    +.qrBig {
    +	position: absolute;
    +	margin-left: -235px;
    +}
    +
    +.custom {
    +	background: url(../images/printCustom.png) 20px 40px no-repeat #FFF;
    +	border: 1px solid #D7D7D7;
    +}
    +
    +.custom .title {
    +	padding-top: 80px;
    +	text-align: center;
    +	font-size: 14px;
    +	color: #A9AAAA;
    +	width: 110px;
    +	float: left;
    +	border: none;
    +	text-indent: 0px;
    +	margin: 0px;
    +}
    +
    +.textl {
    +	text-align: left;
    +}
    +
    +.textr {
    +	text-align: right;
    +}
    +/* 鏂板鍊熷嚭鍗 */
    +.return {
    +	background-position: -92px -146px;
    +}
    +
    +.sale {
    +	background-position: -126px -146px;
    +}
    +
    +.purchases {
    +	background-position: -156px -146px;
    +}
    +
    +.tableDiv table tr:hover td .return,.hoverTable:hover .return {
    +	background-position: -92px -116px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .sale,.hoverTable:hover .sale {
    +	background-position: -126px -116px;
    +	cursor: pointer;
    +}
    +
    +.tableDiv table tr:hover td .purchases,.hoverTable:hover .purchases {
    +	background-position: -156px -116px;
    +	cursor: pointer;
    +}
    +
    +.hoverTable {
    +	margin-top: -1px;
    +	word-break: break-all;
    +	white-space: normal;
    +}
    +
    +.hoverTable:hover .copy {
    +	background-position: 0 0px;
    +	cursor: pointer;
    +}
    +
    +.hoverTable:hover .edit {
    +	background-position: -26px 0px;
    +	cursor: pointer;
    +}
    +
    +.hoverTable:hover .del {
    +	background-position: -52px 0px;
    +	cursor: pointer;
    +}
    +
    +.hoverTable:hover .details {
    +	background-position: -52px -56px;
    +	cursor: pointer;
    +}
    +
    +.hoverTable:hover td {
    +	background: #f1f1f1;
    +}
    +
    +.SUp {
    +	background: url(../images/up.png) right no-repeat;
    +	padding-right: 10px;
    +}
    +
    +.SDown {
    +	background: url(../images/down.png) right no-repeat;
    +	padding-right: 10px;
    +}
    +
    +.codeEdit {
    +	background: #FFF;
    +	border: 1px solid #FFF;
    +	height: 14PX;
    +	padding: 4px 0;
    +	line-height: 14PX;
    +	padding-left: 5PX;
    +	color: #999;
    +	text-decoration: underline;
    +	width: 150px;
    +	font-size: 12px;
    +	display: inline-block;
    +}
    +
    +.codeEdit:hover {
    +	border: 1px solid #D7D7D7;
    +	border-radius: 3PX;
    +	height: 14PX;
    +	padding: 4px 0;
    +	text-decoration: none;
    +	line-height: 14PX;
    +	padding-left: 5PX;
    +	font-size: 12px;
    +	display: inline-block;
    +}
    +
    +.codeEdit:focus {
    +	border: 1px solid #06F;
    +	box-shadow: inset 0 1px 2px rgba(0, 102, 255, 0.3);
    +	text-decoration: none;
    +	font-size: 12px;
    +}
    +
    +/* 2013-10-11鏂板搴忓垪鍙 */
    +.sn {
    +	width: 14px;
    +	height: 14px;
    +	background: url(../images/sn.png) no-repeat 2px 2px;
    +	display: inline-block;
    +	position: absolute;
    +	margin-top: 5px;
    +	*margin-left: -5px;
    +}
    +
    +.sn:hover,.snS {
    +	background-position: -15px 2px;
    +}
    +
    +.SnAdd .title {
    +	padding-bottom: 10px;
    +}
    +
    +.SnAdd .tab {
    +	width: 100%;
    +	font-size: 12px;
    +	color: #333;
    +}
    +
    +.SnAdd .tabN {
    +	margin-top: 2px;
    +}
    +
    +.SnAdd .tabS {
    +	background: #FFF;
    +	border-top: 2px solid #6cbe4a;
    +}
    +
    +.SnAdd .tab ul li {
    +	padding: 0 15px;
    +	line-height: 28px;
    +	height: 28px;
    +	margin-right: 10px;
    +	float: left;
    +}
    +
    +.SnAdd .tab ul li a {
    +	color: #333;
    +}
    +
    +.SnAdd .tab ul li a:hover {
    +	color: #fd7742;
    +}
    +
    +.SnAdd .tableDiv table tr .num {
    +	display: block;
    +}
    +
    +.SnAdd .tableDiv table tr .actionArea {
    +	display: none;
    +}
    +
    +.SnAdd .tableDiv table tr:hover .num {
    +	display: none;
    +}
    +
    +.SnAdd .tableDiv table tr:hover .actionArea {
    +	display: block;
    +}
    +
    +.snButtonArea {
    +	background-color: #FFFFFF;
    +	border-top: 1px solid #ccc;
    +	display: block;
    +	margin-top: 10px;
    +	padding: 10px 2%;
    +	float: left;
    +	width: 96%;
    +}
    +
    +.SNtable tr:hover .num {
    +	display: none;
    +}
    +
    +.SNtable tr .right,.SNtable tr .left {
    +	display: none;
    +}
    +
    +.SNtable tr:hover .right,.SNtable tr:hover .left {
    +	display: inline-block;
    +	width: 13px;
    +	height: 13px;
    +	background-image: url(../images/icon2.png);
    +	padding: 5px 5px 3px 3px;
    +}
    +
    +.SNtable tr:hover .right {
    +	background-position: -99px -173px;
    +}
    +
    +.SNtable tr:hover .left {
    +	background-position: -113px -173px;
    +}
    +
    +.SNtable td {
    +	word-break: break-all;
    +}
    +
    +.snList {
    +	border: 1px solid #ccc;
    +	border-width: 0 1px;
    +	box-shadow: 0 3px 2px rgba(0, 0, 0, 0.2);
    +	background: #fffde5;
    +	position: absolute;
    +	max-height: 300px;
    +	width: 200px;
    +	overflow-y: auto;
    +	overflow-x: hidden;
    +	margin-top: 0px;
    +	margin-left: 13px;
    +	*margin-left: 5px;
    +	z-index: 1010;
    +}
    +
    +.snList ul {
    +	width: 200px;
    +}
    +
    +.snList ul li {
    +	border-bottom: 1px solid #DDD;
    +	float: left;
    +	width: 200px;
    +	line-height: 220%;
    +}
    +
    +.snList ul li .snNum {
    +	width: 35px;
    +	text-align: center;
    +	color: #999;
    +	float: left;
    +}
    +
    +.snList ul li .snText {
    +	color: #000;
    +	float: left;
    +	width: 154px;
    +	border-left: 1px solid #dcdcdc;
    +	text-align: left;
    +	padding: 5px;
    +	line-height: 120%;
    +}
    +
    +.snList ul li .delLite {
    +	display: none;
    +	cursor: pointer;
    +}
    +
    +.snList .back {
    +	line-height: 220%;
    +	text-indent: 10px;
    +	width: 100%;
    +	float: left;
    +	padding: 5px 0;
    +}
    +
    +/* 2013-10-31 鏂板搴忓垪鍙风洏鐐 */
    +.AStable tr:hover .num {
    +	display: none;
    +}
    +
    +.AStable tr:hover .delLite {
    +	display: block;
    +}
    +
    +.AStable tr .num {
    +	display: block;
    +}
    +
    +.AStable tr .delLite {
    +	display: none;
    +}
    +
    +.accountStocks,.actualStocks {
    +	width: 430PX;
    +	height: 390px;
    +}
    +
    +.accountStocks .title,.actualStocks .title {
    +	font-size: 14px;
    +	font-weight: bold;
    +	color: #454c51;
    +	border-bottom: 1px solid #e9e9e9;
    +	line-height: 35px;
    +	text-indent: 10px;
    +	display: block;
    +}
    +
    +.ASadd {
    +	padding: 10px;
    +	float: left;
    +	border-top: 1px solid #ccc;
    +}
    +
    +.ASadd .inputText {
    +	width: 329px;
    +	margin-right: 8px;
    +}
    +
    +.actualStocks .tips {
    +	border-bottom: 1px solid #e5e5e5;
    +	color: #454c51;
    +	width: 100%;
    +	height: 38px;
    +	line-height: 38px;
    +	text-indent: 10px;
    +}
    +
    +.actualStocks .inputArea {
    +	padding: 10px;
    +}
    +
    +.actualStocks .buttonArea {
    +	text-align: right;
    +	padding-right: 10px;
    +	padding-bottom: 10px;
    +}
    +
    +.AStable .delSn,.AStable .addSn,.AStable .checkSn,.graphica .delSn,.graphica .addSn,.graphica .checkSn
    +	{
    +	background: url(../images/icon2.png) no-repeat;
    +}
    +
    +.AStable .delSn {
    +	background-position: -147px -195px;
    +	width: 8px;
    +	height: 8px;
    +}
    +
    +.AStable .addSn {
    +	background-position: -170px -195px;
    +	width: 8px;
    +	height: 8px;
    +}
    +
    +.AStable .checkSn {
    +	background-position: -190px -195px;
    +	width: 8px;
    +	height: 8px;
    +}
    +
    +.graphica .delSn {
    +	background-position: -147px -195px;
    +	width: 8px;
    +	height: 8px;
    +	margin-top: 15px;
    +}
    +
    +.graphica .addSn {
    +	background-position: -170px -195px;
    +	width: 8px;
    +	height: 8px;
    +	margin-top: 15px;
    +}
    +
    +.graphica .checkSn {
    +	background-position: -190px -195px;
    +	width: 8px;
    +	height: 8px;
    +	margin-top: 15px;
    +}
    +
    +.graphica {
    +	padding: 10px;
    +	border-top: 1px solid #ccc;
    +	height: 38px;
    +	line-height: 38px;
    +}
    +
    +.graphica div {
    +	padding-right: 10px;
    +}
    +
    +.accountStocks .tips {
    +	border-bottom: 1px solid #e5e5e5;
    +	color: #454c51;
    +	width: 100%;
    +	height: 38px;
    +	line-height: 38px;
    +	text-indent: 10px;
    +}
    +/* 閭婵娲 */
    +.activeEmail {
    +	background: url(../images/mailActive.png) bottom right no-repeat #FFF;
    +}
    +
    +/* 鏍搁攢娆犳 */
    +.tableDiv .price {
    +	display: block;
    +}
    +
    +.tableDiv tr:hover .price {
    +	display: none;
    +}
    +
    +.tableDiv tr .repayment {
    +	display: none;
    +}
    +
    +.tableDiv tr:hover .repayment {
    +	background: #58c56d;
    +	color: #FFF;
    +	display: block;
    +	border-radius: 3px;
    +}
    +
    +.tableDiv tr:hover .repayment:hover {
    +	background: #4be092;
    +	color: #FFF;
    +	display: block;
    +	border-radius: 3px;
    +}
    +
    +.repayment .repayTips {
    +	display: none;
    +	cursor: pointer;
    +	width: 200px;
    +}
    +
    +.repayment:hover .repayTips {
    +	display: inline-block;
    +	border: 1px solid #b0dcbd;
    +	background: #f3fef6;
    +	position: absolute;
    +	cursor: pointer;
    +	margin: -25px 0 0 -40px;
    +	padding: 10px;
    +	color: #666;
    +	width: 200px;
    +	white-space: normal;
    +	word-break: break-all;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, .3);
    +}
    +
    +.repaymentCheck {
    +	background: url(../images/checkGreen.png);
    +	width: 8px;
    +	height: 7px;
    +	display: inline-block;
    +	margin-left: 5px;
    +	cursor: pointer;
    +}
    +
    +.repaymentCheck .repaymentInfo {
    +	display: none;
    +	cursor: pointer;
    +}
    +
    +.repaymentCheck:hover .repaymentInfo {
    +	display: inline-block;
    +	border: 1px solid #b0dcbd;
    +	background: #f3fef6;
    +	position: absolute;
    +	cursor: pointer;
    +	margin: -17px 0 0 0px;
    +	padding: 10px;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, .3);
    +}
    +
    +/* 杞欢鏇存柊 */
    +.update {
    +	top: 150px;
    +	left: 30%;
    +}
    +
    +.update .close {
    +	background: url(../images/updateClose.jpg);
    +	width: 24px;
    +	height: 24px;
    +	cursor: pointer;
    +}
    +
    +.update .close:hover {
    +	background: url(../images/updateClose.jpg) -26px 0;
    +	width: 24px;
    +	height: 24px;
    +}
    +/* 灏忕瓟鐤 */
    +.QA {
    +	cursor: pointer;
    +}
    +
    +.QApop {
    +	display: none;
    +}
    +
    +.QA:hover .QApop {
    +	display: inline-block;
    +	border: 1px solid #b0dcbd;
    +	background: #f3fef6;
    +	position: absolute;
    +	cursor: pointer;
    +	padding: 10px;
    +	color: #666;
    +	width: 200px;
    +	white-space: normal;
    +	word-break: break-all;
    +	box-shadow: 0 2px 2px rgba(0, 0, 0, .3);
    +	font-size: 12px;
    +	line-height: 16px;
    +}
    +/* 缁撳瓨 */
    +.balanceTable tr td .moneyLink {
    +	color: #666;
    +}
    +
    +.balanceTable tr:hover td .moneyLink {
    +	color: #4287cf;
    +}
    +
    +.balanceTable tr:hover td .moneyLink:hover {
    +	color: #fd7742;
    +}
    +
    +.balanceTable tr td .month {
    +	display: block;
    +}
    +
    +.balanceTable tr:hover td .month {
    +	display: none;
    +}
    +
    +.balanceTable tr td .reverse {
    +	display: none;
    +}
    +
    +.balanceTable tr:hover td .reverse {
    +	display: block;
    +	background: #fd7742;
    +	border-radius: 3px;
    +	color: #FFF;
    +}
    +
    +.balanceTable tr:hover td .reverse:hover {
    +	display: block;
    +	background: #fea380;
    +	border-radius: 3px;
    +	color: #FFF;
    +}
    +
    +.balanceShort {
    +	float: left;
    +	border-radius: 0 0 3px 3px;
    +	border: 1px solid #ccc;
    +	border-width: 0 1px 1px 1px;
    +	padding: 0 15px;
    +	color: #333;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#f3f3f3),
    +		to(#e6e6e8));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#f3f3f3), to(#e6e6e8));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#f3f3f3,
    +		endcolorstr=#e6e6e8, gradientType=0);
    +}
    +
    +/* 鏂板姛鑳芥彁绀 */
    +.newFunction {
    +	width: 7px;
    +	height: 7px;
    +	background-color: #f00;
    +	border: 2px solid #FFFFFF;
    +	box-shadow: 0 2px 0 rgba(0, 0, 0, .3);
    +	border-radius: 5px;
    +	position: absolute;
    +	margin: -40px 0 0 75px;
    +}
    +
    +.newTip {
    +	position: absolute;
    +	width: 170px;
    +	z-index: 1001;
    +}
    +
    +.newTip .angle {
    +	float: left;
    +	background: url(../images/angle.png) no-repeat 20px 0;
    +	height: 4px;
    +	width: 170px;
    +}
    +
    +.newTip .bg {
    +	background: url(../images/newTipBg.png);
    +	border-radius: 2px;
    +	color: #FFF;
    +	font-size: 12px;
    +	padding: 5px;
    +	width: 160px;
    +	float: left;
    +	white-space: normal;
    +	text-align: left;
    +}
    +
    +.newTip .bg .button {
    +	padding: 0px 5px;
    +	height: 19px;
    +	line-height: 19px;
    +	float: right;
    +}
    +
    +/*缁撳瓨 鏃ュ父鏀舵敮 璇︾粏*/
    +.balanceIncomeAndPayDetail {
    +	border: 1px solid #ccc;
    +	background: #fff;
    +	position: absolute;
    +	max-height: 300px;
    +	width: 200px;
    +	overflow-y: auto;
    +	overflow-x: hidden;
    +	margin-top: 0px;
    +	margin-left: 83px;
    +	*margin-left: 5px;
    +	z-index: 1001;
    +}
    +
    +.balanceReceiveAndPayDetail {
    +	border: 1px solid #ccc;
    +	background: #fff;
    +	position: absolute;
    +	max-height: 300px;
    +	width: 240px;
    +	overflow-y: auto;
    +	overflow-x: hidden;
    +	margin-top: -4px;
    +	margin-left: 83px;
    +	*margin-left: 5px;
    +	z-index: 1001;
    +}
    +/*鐩樼偣鏄庣粏 鏍囪瘑鐩樼泩鐩樹簭搴忓垪鍙*/
    +.pyLite {
    +	background: url(../images/py.png) no-repeat;
    +	width: 26px;
    +	height: 14px;
    +	display: inline-block;
    +	margin: 0 5px;
    +}
    +
    +.pkLite {
    +	background: url(../images/pk.png) no-repeat;
    +	width: 26px;
    +	height: 14px;
    +	display: inline-block;
    +	margin: 0 5px;
    +}
    +/* 鏂板鏈熷垵寤鸿处2014-1-15 */
    +.sc .step {
    +	background: url(../images/qcTabBg.png);
    +	height: 58px;
    +	width: 100%;
    +}
    +
    +.sc .step ul {
    +	height: 55px;
    +	float: left;
    +	width: 100%;
    +}
    +
    +.sc .step ul li {
    +	float: left;
    +	height: 55px;
    +	font-size: 16px;
    +	line-height: 55px;
    +	border-right: 1px solid #e9e9e9;
    +}
    +
    +.sc .step ul li .stepN {
    +	color: #999;
    +}
    +
    +.sc .step ul li a {
    +	display: block;
    +	padding: 0 15px 0 10px;
    +}
    +
    +.sc .step ul li a .icon {
    +	width: 30px;
    +	height: 55px;
    +	text-align: center;
    +	margin-right: 5px;
    +	float: left;
    +}
    +
    +.sc .step ul li .stepN .icon {
    +	background: url(../images/circleGrey.png) center no-repeat;
    +}
    +
    +.sc .step ul li .stepS .icon,.sc .step ul li .stepN:hover .icon {
    +	background: url(../images/circleBlue.png) center no-repeat;
    +	color: #2297fc;
    +}
    +
    +.sc .step ul li .stepS .text,.sc .step ul li .stepN:hover .text {
    +	color: #2297fc;
    +}
    +
    +.sc .step ul li .stepN:hover {
    +	background: url(../images/qcTabBgS.png);
    +}
    +
    +.greyBg {
    +	background: url(../images/greyBg2.png);
    +	height: 34px;
    +}
    +
    +.borderR {
    +	border-right: 1px solid #e9e9e9;
    +}
    +
    +.borderT {
    +	border-top: 1px solid #e9e9e9;
    +}
    +
    +.fontDeepBlue {
    +	color: #454c51;
    +}
    +
    +.fontLightBlue {
    +	color: #6e7983;
    +}
    +
    +.wf98 {
    +	width: 98%;
    +}
    +
    +.titleButton {
    +	cursor: pointer;
    +}
    +
    +/* 瀵煎叆鑱旂郴浜 20130426 */
    +.importContact {
    +	padding: 20px;
    +}
    +
    +.importContact .title {
    +	font-size: 24px;
    +	color: #000;
    +	padding-bottom: 20px;
    +}
    +
    +.importContact .tab {
    +	display: block;
    +	width: 100%;
    +	height: 141px;
    +	background-color: #d8d7d7;
    +}
    +
    +.importContact .tab ul {
    +	padding: 5px 5px 0 5px;
    +}
    +
    +.importContact .tab ul .tabN {
    +	float: left;
    +	border: 3px solid #d8d7d7;
    +	border-width: 3px 3px 5px 3px;
    +	height: 128px;
    +	margin-right: 5px;
    +}
    +
    +.importContact .tab ul .tabN:hover,.importContact .tab ul .tabS {
    +	float: left;
    +	border: 3px solid #FFF;
    +	border-width: 3px 3px 5px 3px;
    +	height: 128px;
    +	margin-right: 5px;
    +}
    +
    +.impotButtonArea {
    +	border-bottom: 1px dashed #DCDCDC;
    +	padding: 0 0 10px 0;
    +}
    +
    +.gmailLogin {
    +	background: url(../images/gmailLogin.gif);
    +	width: 262px;
    +	height: 55px;
    +	display: inline-block;
    +}
    +
    +.gmailLogin:hover {
    +	background: url(../images/gmailLogin.gif) -262px 0;
    +	height: 55px;
    +}
    +
    +.excelTemp {
    +	background: url(../images/excelTemp.gif);
    +	width: 197px;
    +	height: 55px;
    +	display: inline-block;
    +}
    +
    +.excelTemp:hover {
    +	background: url(../images/excelTemp.gif) -197px 0;
    +	height: 55px;
    +}
    +
    +.impotButtonArea .step1 {
    +	float: left;
    +}
    +
    +.impotButtonArea .step1 .downloadExcelTemp {
    +	background: url(../images/importExcel1.png);
    +	width: 197px;
    +	height: 156px;
    +	float: left;
    +	display: inline-block;
    +}
    +
    +.impotButtonArea .step1 .downloadExcelTemp:hover {
    +	background: url(../images/importExcel1.png) -197px 0;
    +}
    +
    +.impotButtonArea .step2 {
    +	float: left;
    +	background: url(../images/importExcel2.png);
    +	width: 197px;
    +	height: 156px;
    +	margin-left: 10px;
    +}
    +
    +.impotButtonArea .step2 .text {
    +	width: 145px;
    +	text-align: center;
    +	padding-top: 120px;
    +	float: left;
    +}
    +
    +.impotButtonArea .step3 {
    +	float: left;
    +	background: url(../images/importExcel3.png);
    +	width: 145px;
    +	height: 156px;
    +	margin-left: 10px;
    +}
    +
    +.choseFile {
    +	background: #1d91ff;
    +	color: #FFF;
    +	padding: 10px 20px;
    +}
    +
    +.choseFile:hover {
    +	background: #51a9fd;
    +	color: #FFF;
    +	padding: 10px 20px;
    +}
    +
    +.choseFileArea {
    +	width: 145px;
    +	text-align: center;
    +	float: left;
    +	padding-top: 60px;
    +}
    +
    +.impotButtonArea .step3 .text {
    +	width: 145px;
    +	padding-top: 15px;
    +	text-align: center;
    +	float: left;
    +	line-height: 120%;
    +}
    +
    +.impotButtonArea .step2End {
    +	background: url(../images/step2end.png);
    +	width: 145px;
    +	height: 156px;
    +	margin-left: 10px;
    +	float: left;
    +}
    +
    +.impotButtonArea .step2End .text {
    +	width: 145px;
    +	padding-top: 20px;
    +	text-align: center;
    +	float: left;
    +	line-height: 120%;
    +}
    +
    +.impotButtonArea .step1Outlook {
    +	float: left;
    +	background: url(../images/stepOutLook.png);
    +	width: 197px;
    +	height: 156px;
    +}
    +
    +.importSuccees {
    +	border: 1px solid #feeb9d;
    +	background: #fffbe9;
    +	padding: 10px;
    +	margin-top: 10px;
    +}
    +
    +.funList {
    +	display: block;
    +}
    +
    +.funList a {
    +	margin-right: 20px;
    +	padding: 8PX;
    +	border: 1PX solid #F8F8F8;
    +	display: inline-block;
    +	cursor: pointer;
    +}
    +
    +.funList a:hover {
    +	background: #eee;
    +	border: 1px solid #DDD;
    +	display: inline-block;
    +	padding: 8PX;
    +	border-radius: 3PX;
    +}
    +
    +.funList a .icon {
    +	background: url(../images/membericon4.png) no-repeat;
    +	width: 30px;
    +	height: 30px;
    +	display: inline-block;
    +}
    +
    +.funList .icon1 .icon {
    +	background-position: 0 0;
    +}
    +
    +.funList .icon2 .icon {
    +	background-position: -300px 0;
    +}
    +
    +.funList .icon3 .icon {
    +	background-position: -420px 0;
    +}
    +
    +.funList a .text {
    +	font-size: 14px;
    +	height: 30px;
    +	line-height: 19px;
    +	display: inline-block;
    +	padding-left: 10px;
    +	color: #666;
    +}
    +
    +.funList a:hover .text {
    +	color: #666;
    +}
    +
    +.moreFun {
    +	border: 1px solid #ddd;
    +	border-radius: 3px;
    +	background: #F8F8F8;
    +	padding: 20PX;
    +}
    +
    +/*鏂板勾鏍峰紡*/
    +/*.blueButton {
    +    border: 1px solid #951b0e;
    +    border-radius: 3px;
    +    background-color: #951b0e;
    +    background: -webkit-gradient(linear, 0 0, 0 100%, from(#b92111), to(#951b0e));
    +    background: -moz-gradient(linear, 0 0, 0 100%, from(#b92111), to(#951b0e));
    +    background: -o-gradient(linear, 0 0, 0 100%, from(#b92111), to(#951b0e));
    +    background: -ms-gradient(linear, 0 0, 0 100%, from(#b92111), to(#951b0e));
    +    filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#b92111,endcolorstr=#951b0e,gradientType=0);
    +    color: #FFFFFF;
    +}
    +
    +
    +    .blueButton:hover {
    +        border: 1px solid #951b0e;
    +        background-color: #951b0e;
    +        background: -webkit-gradient(linear, 0 0, 0 100%, from(#ea2a16), to(#951b0e));
    +        background: -moz-gradient(linear, 0 0, 0 100%, from(#ea2a16), to(#951b0e));
    +        background: -o-gradient(linear, 0 0, 0 100%, from(#ea2a16), to(#951b0e));
    +        background: -ms-gradient(linear, 0 0, 0 100%, from(#ea2a16), to(#951b0e));
    +        filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#ea2a16,endcolorstr=#951b0e,gradientType=0);
    +        color: #FFFFFF;
    +    }
    +
    +    .blueButton:active {
    +        border: 1px solid #951b0e;
    +        background-color: #6ecdff;
    +        background: -webkit-gradient(linear, 0 0, 0 100%, from(#951b0e), to(#ea2a16));
    +        background: -moz-gradient(linear, 0 0, 0 100%, from(#951b0e), to(#ea2a16));
    +        background: -o-gradient(linear, 0 0, 0 100%, from(#951b0e), to(#ea2a16));
    +        background: -ms-gradient(linear, 0 0, 0 100%, from(#951b0e), to(#ea2a16));
    +        filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#951b0e,endcolorstr=#ea2a16,gradientType=0);
    +        color: #FFFFFF;
    +    }*/
    +
    +/* 閿鍞崟淇敼2014-1-7 */
    +.count .short {
    +	background: url(../images/icon_ps.png) no-repeat 0 0;
    +	width: 22px;
    +	height: 22px;
    +	margin: 2px 0 0 2px;
    +	position: absolute;
    +	cursor: pointer;
    +	display: none;
    +}
    +
    +.count .short:hover {
    +	background: url(../images/icon_ps.png) no-repeat 0 -28px;
    +}
    +
    +.count .shortUnclickable {
    +	background: url(../images/icon_ps.png) no-repeat 0 -56px;
    +	width: 22px;
    +	height: 22px;
    +	margin: 2px 0 0 2px;
    +	position: absolute;
    +	cursor: default;
    +	display: none;
    +}
    +
    +.count .plus {
    +	background: url(../images/icon_ps.png) no-repeat -40px 0;
    +	width: 22px;
    +	height: 22px;
    +	margin: 2px 0 0 -24px;
    +	position: absolute;
    +	cursor: pointer;
    +	display: none;
    +}
    +
    +.count .plus:hover {
    +	background: url(../images/icon_ps.png) no-repeat -40px -28px;
    +}
    +
    +.tableDiv tr:hover td .count .short {
    +	display: inline-block;
    +}
    +
    +.tableDiv tr:hover td .count .plus {
    +	display: inline-block;
    +}
    +
    +.tableDiv tr:hover td .count .shortUnclickable {
    +	display: inline-block;
    +}
    +
    +.goodsNum {
    +	background: #ee6f4d;
    +	border-radius: 3px;
    +	color: #FFF;
    +	padding: 2px 5px;
    +	margin: 0 5px;
    +}
    +
    +.mr5 {
    +	margin-right: 5px;
    +}
    +
    +/* 鏈熷垵淇℃伅鏌ヨ 2014-02-13 */
    +.nav {
    +	margin-right: 10px;
    +}
    +
    +.nav .title {
    +	border-top: 3px solid #00aeef;
    +	font-size: 16px;
    +	color: #000;
    +	line-height: 40px;
    +	border-bottom: 1px solid #ddd;
    +	text-indent: 10px;
    +}
    +
    +.nav ul {
    +	padding: 5px;
    +}
    +
    +.nav ul li .tabN {
    +	line-height: 30px;
    +	height: 30px;
    +	width: 100%;
    +	display: block;
    +	border-bottom: 1px solid #eee;
    +	color: #666;
    +	text-indent: 10px;
    +	font-size: 14px;
    +}
    +
    +.nav ul li .tabS,.nav ul li .tabN:hover {
    +	line-height: 30px;
    +	height: 30px;
    +	width: 100%;
    +	display: block;
    +	border-bottom: 1px solid #eee;
    +	color: #FFF;
    +	background: #00aeef;
    +	text-indent: 10px;
    +	font-size: 14px;
    +}
    +
    +/* 鏂板鏁版嵁鍒嗕韩 2014-02-19  */
    +.getReady {
    +	border: 1px solid #ffba00;
    +	background: #fffbeb url(../images/loading.gif) no-repeat center top;
    +	padding: 38px 10px 10px 10px;
    +	display: block;
    +	color: #53606b;
    +	font-size: 14px;
    +	text-align: center;
    +}
    +
    +.already {
    +	border: 1px solid #c2c2c2;
    +	background: #ebebeb;
    +	padding: 10px;
    +	display: block;
    +	color: #53606b;
    +	font-size: 14px;
    +	text-align: left;
    +	word-break: break-all;
    +	white-space: normal;
    +}
    +
    +.shareList ul li {
    +	float: left;
    +	padding-right: 10px;
    +}
    +
    +.shareList ul li a {
    +	background: url(../images/share.jpg);
    +	width: 94px;
    +	height: 94px;
    +	display: inline-block;
    +}
    +
    +.shareList .copy {
    +	background-position: 0 0;
    +}
    +
    +.shareList .copy:hover {
    +	background-position: 0 -118px;
    +}
    +
    +.shareList .mail {
    +	background-position: -113px 0;
    +}
    +
    +.shareList .mail:hover {
    +	background-position: -113px -118px;
    +}
    +
    +.shareList .QQ {
    +	background-position: -227px 0;
    +}
    +
    +.shareList .QQ:hover {
    +	background-position: -227px -118px;
    +}
    +
    +.shareList .weixin {
    +	background-position: -339px 0;
    +}
    +
    +.shareList .weixin:hover {
    +	background-position: -339px -118px;
    +}
    +
    +.shareArea {
    +	border-top: 1px #DDD solid;
    +	padding: 10px;
    +}
    +
    +.VBbody {
    +	background: #758089;
    +}
    +
    +.viewBillsLogin {
    +	width: 430px;
    +	margin: 100px auto 10px auto;
    +}
    +
    +.BillsInfo {
    +	background: #ff8250;
    +	height: 150px;
    +	padding-top: 30px;
    +}
    +
    +.billsLogo {
    +	border-radius: 50px;
    +	width: 99px;
    +	height: 99px;
    +	border: 3px solid #FFF;
    +	margin: 0 auto;
    +}
    +
    +.VBLoginContent {
    +	padding: 10px;
    +}
    +
    +.billsTop {
    +	background: #FFFFFF;
    +	box-shadow: 0px 2px 1px rgba(0, 0, 0, .1);
    +	border-bottom: 1px solid #ccc;
    +	width: 100%;
    +	height: 100px;
    +}
    +
    +.VBlogo {
    +	width: 80px;
    +	height: 80px;
    +	border-radius: 45px;
    +	border: 2px solid #F8F8F8;
    +	background-position: center;
    +	margin: 5px 0 0 10px;
    +}
    +
    +.VBbottom {
    +	width: 100%;
    +	border-top: #CCC 1px solid;
    +	background-color: #FFF;
    +	text-align: right;
    +	padding: 10px 0;
    +}
    +
    +.popWechat {
    +	position: absolute;
    +	border: 1px solid #DDD;
    +	background: #f8f8f8;
    +	padding: 10px;
    +	margin: -150px 0 0 95px;
    +	width: 150px;
    +	*margin: -40px 0 0 0;
    +}
    +
    +.popWechat .text {
    +	white-space: normal;
    +}
    +
    +/*鏁版嵁澶囦唤杩樺師 涓婃鎺т欢鏍峰紡  start*/
    +#ui-upload-holder {
    +	position: relative;
    +	float: left;
    +	width: 100px;
    +	height: 30px;
    +	border: 0px solid silver;
    +	overflow: hidden;
    +}
    +
    +.ui-upload-input {
    +	position: absolute;
    +	top: 0px;
    +	right: 0px;
    +	height: 30px;
    +	width: 280px;
    +	cursor: pointer;
    +	opacity: 0;
    +	filter: alpha(opacity : 0);
    +	z-index: 999;
    +}
    +/*end*/
    +
    +/*loading鍔犺浇閬僵灞俢ss*/
    +#black_overlay {
    +	position: fixed;
    +	z-index: 10000;
    +	width: 100%;
    +	height: 100%;
    +	top: 0;
    +	left: 0;
    +	filter: alpha(opacity = 40);
    +	opacity: 0.4;
    +	overflow: hidden;
    +	background-color: #000;
    +}
    +
    +/*IE6*/
    +#black_overlay {
    +	position: absolute;
    +	left: expression(documentElement.scrollLeft + documentElement.clientWidth -  
    +		 this.offsetWidth);
    +	top: expression(documentElement.scrollTop + documentElement.clientHeight -  
    +		 this.offsetHeight);
    +}
    +
    +#load_content {
    +	display: none;
    +	position: absolute;
    +	top: 40%;
    +	left: 40%;
    +	width: 300px;
    +	height: 50px;
    +	border: 16px solid #FFF;
    +	border-bottom: none;
    +	background-color: white;
    +	z-index: 10002;
    +	overflow: auto;
    +	font-size: 14px;
    +	font-weight: bold;
    +}
    +
    +/* 鏂板鍑哄叆搴 */
    +.deliverIn {
    +	padding: 10px 10px 5px 10px;
    +	float: left;
    +}
    +
    +.deliverIn div {
    +	margin-bottom: 5px;
    +}
    +
    +.lightGreenButton {
    +	border: 1px solid #c3e4b5;
    +	border-radius: 3px;
    +	background-color: #edffe6;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#e0ffd2),
    +		to(#d1ffbe));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#e0ffd2),
    +		to(#d1ffbe));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#e0ffd2), to(#d1ffbe));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#e0ffd2), to(#d1ffbe));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#e0ffd2,
    +		endcolorstr=#d1ffbe, gradientType=0);
    +	color: #666666;
    +}
    +
    +.lightGreenButton:hover {
    +	border: 1px solid #c3e4b5;
    +	background-color: #f3ffee;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#eeffe7),
    +		to(#d1ffbe));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#eeffe7),
    +		to(#d1ffbe));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#eeffe7), to(#d1ffbe));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#eeffe7), to(#d1ffbe));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#eeffe7,
    +		endcolorstr=#d1ffbe, gradientType=0);
    +	color: #666666;
    +}
    +
    +.lightGreenButton:active {
    +	border: 1px solid #c3e4b5;
    +	background-color: #edffe6;
    +	background: -webkit-gradient(linear, 0 0, 0 100%, from(#d1ffbe),
    +		to(#eeffe7));
    +	background: -moz-gradient(linear, 0 0, 0 100%, from(#d1ffbe),
    +		to(#eeffe7));
    +	background: -o-gradient(linear, 0 0, 0 100%, from(#d1ffbe), to(#eeffe7));
    +	background: -ms-gradient(linear, 0 0, 0 100%, from(#d1ffbe), to(#edffe6));
    +	filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#d1ffbe,
    +		endcolorstr=#eeffe7, gradientType=0);
    +	color: #666666;
    +}
    +
    +/* 2014-3-19tab鍒锋柊 */
    +.downArrow {
    +	float: left;
    +	position: absolute;
    +	left: 184px;
    +	top: 67px;
    +	z-index:1;
    +}
    +
    +.downArrow .downArrowIcon {
    +	background: url(../images/downArrow.png);
    +	width: 23px;
    +	height: 38px;
    +	float: left;
    +}
    +
    +.downArrow .downArrowContent {
    +	background: #FFF;
    +	position: absolute;
    +	z-index: 100;
    +	box-shadow: 0 2px 4px rgba(0, 0, 0, .4);
    +	margin: 25px 0 0 -10px;
    +	display: none;
    +	white-space: nowrap;
    +	border: 1px solid #eeeeee;
    +}
    +
    +.downArrow .downArrowContent span {
    +	clear: both;
    +	float: left;
    +	border-bottom: 1px solid #EEE;
    +	padding: 3px 10px;
    +	width: 80px;
    +}
    +
    +.downArrow .downArrowContent span:hover {
    +	background: #F8F8F8;
    +	cursor: pointer;
    +}
    +
    +.downArrow:hover .downArrowContent {
    +	display: block;
    +}
    +
    +.cs-north {
    +	height: 67px;
    +}
    +
    +.cs-north-bg {
    +	width: 100%;
    +	height: 100%;
    +	/*background: url(../../Content/themes/redhot/images/topbg.gif) repeat-x;*/
    +}
    +
    +.cs-north-logo {
    +	height: 40px;
    +	margin: 15px 0px 0px 5px;
    +	display: inline-block;
    +	color: #000000;
    +	font-size: 22px;
    +	font-weight: bold;
    +	text-decoration: none;
    +}
    +
    +.cs-west {
    +	width: 120px;
    +	padding: 0px;
    +	background-color: #FFF;
    +}
    +
    +.cs-south {
    +	height: 60px;
    +	background:
    +		url('themes/pepper-grinder/images/ui-bg_fine-grain_15_ffffff_60x60.png')
    +		repeat-x;
    +	padding: 0px;
    +	text-align: center;
    +}
    +
    +.cs-navi-tab {
    +	/*padding: 5px;*/
    +	
    +}
    +
    +.cs-tab-menu {
    +	width: 120px;
    +}
    +
    +.cs-home-remark {
    +	/*padding: 10px;*/
    +	
    +}
    +
    +.wrapper {
    +	float: right;
    +	height: 30px;
    +	margin-left: 10px;
    +}
    +
    +.ui-skin-nav {
    +	float: right;
    +	padding: 0;
    +	margin-right: 10px;
    +	list-style: none outside none;
    +	height: 30px;
    +}
    +
    +.ui-skin-nav .li-skinitem {
    +	float: left;
    +	font-size: 12px;
    +	line-height: 30px;
    +	margin-left: 10px;
    +	text-align: center;
    +}
    +
    +.ui-skin-nav .li-skinitem span {
    +	cursor: pointer;
    +	width: 10px;
    +	height: 10px;
    +	display: inline-block;
    +}
    +
    +.ui-skin-nav .li-skinitem span.cs-skin-on {
    +	border: 1px solid #FFFFFF;
    +}
    +
    +.ui-skin-nav .li-skinitem span.gray {
    +	background-color: gray;
    +}
    +
    +.ui-skin-nav .li-skinitem span.pepper-grinder {
    +	background-color: #BC3604;
    +}
    +
    +.ui-skin-nav .li-skinitem span.blue {
    +	background-color: blue;
    +}
    +
    +.ui-skin-nav .li-skinitem span.cupertino {
    +	background-color: #D7EBF9;
    +}
    +
    +.ui-skin-nav .li-skinitem span.dark-hive {
    +	background-color: black;
    +}
    +
    +.ui-skin-nav .li-skinitem span.sunny {
    +	background-color: #FFE57E;
    +}
    +.secondFloat{
    +	display:none;
    +}
    +.buttonArea{
    +	height:28px;
    +	margin-bottom:10px;
    +}
    +.contentTab{
    +	height:41px;
    +	width:100%;
    +}
    +.form-table th,.form-table td{
    +	font-size:14px;
    +	font-weight:normal;
    +}
    +.form-table th{
    +	width:120px;
    +	text-align:right;
    +}
    +.form-table tr{
    +	height:36px;
    +}
    +.form-table{width:100%;}
    +.sysmenu {margin-right:75px;float:right;margin-top:0px;}
    +.sysmenu li.message,.sysmenu li.logout,.sysmenu li.website{float:left;position:relative;margin-left:15px;padding-right:13px;background:url(../images/li_bg_01.gif) no-repeat scroll right 7px;line-height:32px;height:40px;}
    +.sysmenu li a{display:block;font-size:16px;padding-left:36px;background:url(../images/sys_icon.gif) no-repeat;overflow:hidden;color:#888;}
    +.sysmenu li a:hover{color:#09b2ea;}
    +.sysmenu .message a{background-position: 0px -132px;}
    +.sysmenu .message a:hover{background-position: 0px -161px;}
    +.sysmenu .logout a{background-position: 0px 0px;}
    +.sysmenu .logout a:hover{background-position: 0px -34px;}
    +.sysmenu .website a{background-position:0px -69px;}
    +.sysmenu .website a:hover{background-position:0px -101px;}
    +.sysmenu .website{background:none;}
    +.sysmenu .message a .num{diplay:block;width:18px;height:18px;line-height:18px;position:absolute;color:#fff;background:url(../images/sys_icon.gif) no-repeat scroll -7px -197px;top:20px;left:20px;text-align:center;line-height:16px;font-size:14px;}
    +.sysmenu li .msglist{clear:both;width:190px;padding:10px 15px;position:absolute;left:-100px;top:40px;border:1px solid #c0c0c0;background:#fff;z-index:999;}
    +.sysmenu li .msglist .triangle{position:absolute;top:-8px;left:110px;background:url(../images/triangle.gif) no-repeat scroll center 0px;width:15px;height:9px;}
    +.sysmenu li .msglist li{float:none;background:none;margin:0;padding:0;height:24;line-height:24px;overflow:hidden;}
    +.sysmenu li .msglist li a{background:none;font-size:12px;padding-left:0;color:#000;line-height:24px;}
    +.sysmenu li .msglist li a:hover{text-decoration:underline;}
    +#short_msg{float:right;margin-right:50px;margin-top:10px;height:22px;line-height:22px;}
    +
    +.layout-split-west{
    +	z-index:9;
    +}
    +.layout-panel-north{
    +	z-index:1;
    +}
    +.datagrid-pager a.l-btn span.l-btn-left{
    +	height:20px;
    +	line-height:20px;
    +	padding:0px 10px 0px 5px;
    +}
    +.tooltip {
    +    border-radius: 5px;
    +    border-style: solid;
    +    border-width: 1px;
    +    display: none;
    +    opacity: 1;
    +    outline: medium none;
    +    padding: 5px;
    +    position: absolute;
    +    z-index: 9900000;
    +}
    +.tooltip-content {
    +    font-size: 12px;
    +}
    +.tooltip-arrow-outer, .tooltip-arrow {
    +    border-color: rgba(0, 0, 0, 0);
    +    border-style: solid;
    +    border-width: 6px;
    +    font-size: 0;
    +    height: 0;
    +    line-height: 0;
    +    position: absolute;
    +    width: 0;
    +}
    +.tooltip-right .tooltip-arrow-outer {
    +    left: 0;
    +    margin: -6px 0 0 -13px;
    +    top: 50%;
    +}
    +.tooltip-right .tooltip-arrow {
    +    left: 0;
    +    margin: -6px 0 0 -12px;
    +    top: 50%;
    +}
    +.tooltip-left .tooltip-arrow-outer {
    +    margin: -6px -13px 0 0;
    +    right: 0;
    +    top: 50%;
    +}
    +.tooltip-left .tooltip-arrow {
    +    margin: -6px -12px 0 0;
    +    right: 0;
    +    top: 50%;
    +}
    +.tooltip-top .tooltip-arrow-outer {
    +    bottom: 0;
    +    left: 50%;
    +    margin: 0 0 -13px -6px;
    +}
    +.tooltip-top .tooltip-arrow {
    +    bottom: 0;
    +    left: 50%;
    +    margin: 0 0 -12px -6px;
    +}
    +.tooltip-bottom .tooltip-arrow-outer {
    +    left: 50%;
    +    margin: -13px 0 0 -6px;
    +    top: 0;
    +}
    +.tooltip-bottom .tooltip-arrow {
    +    left: 50%;
    +    margin: -12px 0 0 -6px;
    +    top: 0;
    +}
    +.tooltip {
    +    background-color: #FFFFFF;
    +    border-color: #D3D3D3;
    +    color: #000000;
    +}
    +.tooltip-right .tooltip-arrow-outer {
    +    border-right-color: #D3D3D3;
    +}
    +.tooltip-right .tooltip-arrow {
    +    border-right-color: #FFFFFF;
    +}
    +.tooltip-left .tooltip-arrow-outer {
    +    border-left-color: #D3D3D3;
    +}
    +.tooltip-left .tooltip-arrow {
    +    border-left-color: #FFFFFF;
    +}
    +.tooltip-top .tooltip-arrow-outer {
    +    border-top-color: #D3D3D3;
    +}
    +.tooltip-top .tooltip-arrow {
    +    border-top-color: #FFFFFF;
    +}
    +.tooltip-bottom .tooltip-arrow-outer {
    +    border-bottom-color: #D3D3D3;
    +}
    +.tooltip-bottom .tooltip-arrow {
    +    border-bottom-color: #FFFFFF;
    +}
    +.detail table{
    +	width:100%;
    +	background:#ccc;
    +	padding:1px 0px 0px 1px;
    +}
    +.detail th{
    +	padding: 3px 6px;
    +    white-space: normal;
    +    word-break: break-all;
    +    background:#F7F7F7;
    +    border-bottom: 1px solid #CCCCCC;
    +    border-right: 1px solid #CCCCCC;
    +    color: #333333;
    +    font-size: 12px;
    +    font-weight: bold;
    +    text-align:left;
    +   	cursor:pointer;
    + }
    + .detail tr{
    + 	background:#fff;
    + }
    +.detail td {
    +	padding:3px 6px;
    +    white-space: normal;
    +    word-break: break-all;
    +    border-bottom: 1px solid #CCCCCC;
    +    border-right: 1px solid #CCCCCC;
    +    font-size: 12px;
    +    margin: 0;
    +    overflow: hidden;
    +    text-align:left;
    + }
    + .main .input .tableform{
    + 	border-width: 1px 0 0;
    + 	border-style:solid;
    + 	border-color:#eaeaea;
    + 	margin:20px 0px 0px;
    + 	background:none;
    + 	padding:20px 0px 0px;
    + }
    + .main .input .box{
    + 	margin-right:20px;
    + 	margin-bottom:15px;
    + 	padding:0px 0px 4px 0px;
    + 	background:url(../images/division_bg.gif) repeat-x scroll left bottom;
    + }
    +
    +.main .input h5,#index_box .item .indexitem h3{
    +	height:48px;
    +	line-height:48px;
    +	border:1px solid #cfcfcf;
    +	border-bottom:none;
    +	text-indent:1em;
    +	text-align:left;
    +	font-size:18px;
    +	font-weight:normal;
    +	color:#666;
    +	margin:0px;
    +	padding:0;
    + }
    + #index_box .item .indexitem h3{
    + 	background:#fff
    +}
    + .main .division,.main .item .body{
    + 	margin:0px;
    + 	padding:0px ;
    + 	border:none;
    + 	font-size:14px;
    + 	border-left:1px solid #cfcfcf;
    +	border-right:1px solid #cfcfcf;
    + }
    +.main .division th,.main .item th{
    +	border-color:#e5e5e5 #e5e5e5 #e5e5e5 #cfcfcf;
    +	border-width:1px 1px 0px 0px;
    +	border-style:solid;
    +	background:#f4f4f4;
    +	height:28px;
    +	line-height:28px;
    +	color:#676767;
    +}
    +.main .division td,.main .item td{
    +	border-color:#e5e5e5 #cfcfcf #e5e5e5 #e5e5e5;
    +	border-width:1px 0px 0px 0px;
    +	border-style:solid;
    +	background:#fff;
    +	height:28px;
    +	line-height:28px;
    +	text-align:left;
    +	color:#676767;
    +} 
    +#index_box .item{
    +	width:302px;
    +	float:left;
    +	margin-right:15px;
    +	margin-top:15px;
    +}
    + #index_box .item .indexitem{
    + 	border-bottom:1px solid #cfcfcf;
    +}
    +#index_box .item .indexitem tr{
    + 	height:28px;
    + 	line-height:28px;
    +}
    +#index_box .item .indexitem th{
    + font-size:14px;
    + text-align:right;
    + width:130px;
    +font-weight:normal;
    +}
    +#index_box .item .indexitem td{
    +	font-size:14px;
    +	height:28px;
    +	line-height:28px;
    +	padding-left:5px;
    +}
    +#index_box .item .indexitem td div{
    +	line-height:18px; 
    +}
    + .detail .row-selected{
    + 	background:#fbec88;
    + }
    + .detail .row-over{
    + 	background:#f1f1f1;
    + }
    + .main .division .grid td{
    + 	border-right:1px solid #e5e5e5;
    + 	text-align:center; 
    + }
    +.buttonWrap{
    +	background:#fff;
    +    text-align: center;
    +    width: 100%;
    +    height:30px;
    +    padding:3px 0;
    +    	box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
    +	filter: "progid:DXImageTransform.Microsoft.Shadow(color=#AAAAAA,direction=0,strength=0) progid:DXImageTransform.Microsoft.Shadow(color=#CCCCCC,direction=90,strength=3) progid:DXImageTransform.Microsoft.Shadow(color=#888888,direction=180,strength=5) progid:DXImageTransform.Microsoft.Shadow(color=#CCCCCC,direction=270,strength=3)";*/
    +    
    +}
    +.fixed{
    +	position: fixed;
    +	border-top:1px solid #d6d6d6;
    +	box-shadow:1px 1px 5px #d6d6d6;
    +   -webkit-box-shadow:1px 1px 5px #d6d6d6;
    +   -moz-box-shadow:1px 1px 5px #d6d6d6;
    +    bottom: 0;
    +    left: 0;
    +}
    +.b_fr{
    +	margin-top:0px;
    +	display:block;
    +	float:right;
    +}
    +.mr5{
    +	margin-right:5px;
    +}
    +.blockUI{
    +	font-size:14px;
    +	line-height:38px;
    +	-moz-border-radius: 3px;      /* Gecko browsers */
    +    -webkit-border-radius: 3px;   /* Webkit browsers */
    +    border-radius:3px;
    +  }
    +.blockUI .success{
    +	padding-left:40px;
    +	background:url(../images/block_success_bg.gif) no-repeat scroll 6px 6px;
    +}
    +.blockUI .error{
    +	padding-left:40px;
    +	background:url(../images/block_error_bg.gif) no-repeat scroll 6px 6px;
    +}
    +.main .contentTab{
    +	height:32px;
    +}
    +.main .contentTab ul li{
    +	height:30px;
    +	padding:0px 20px;
    +	line-height:30px;
    +}
    +.main .contentTab ul li.contentTabS{
    +	padding:0px 35px;
    +	border-top:2px solid #6f6d6d;
    +	font-weight:normal;
    +}
    +#dlytype .shadowBoxWhite {
    +	padding:5px;
    +    box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
    +}
    +#dlytype .whiteBox .title {
    +    border-bottom: 1px solid #dfdfdf;
    +    color: #53606b;
    +    font-size: 18px;
    +    height: 36px;
    +    line-height: 36px;
    +    margin: 0 5px;
    +    text-indent: 5px;
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/menu.css b/src/main/webapp/plug-in/easyui/themes/metro/menu.css
    new file mode 100644
    index 00000000..5012a506
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/menu.css
    @@ -0,0 +1,109 @@
    +.menu {
    +  position: absolute;
    +  margin: 0;
    +  padding: 2px;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +}
    +.menu-item {
    +  position: relative;
    +  margin: 0;
    +  padding: 0;
    +  overflow: hidden;
    +  white-space: nowrap;
    +  cursor: pointer;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.menu-text {
    +  height: 20px;
    +  line-height: 20px;
    +  float: left;
    +  padding-left: 28px;
    +}
    +.menu-icon {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  left: 2px;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.menu-rightarrow {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  right: 0;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.menu-line {
    +  position: absolute;
    +  left: 26px;
    +  top: 0;
    +  height: 2000px;
    +  font-size: 1px;
    +}
    +.menu-sep {
    +  margin: 3px 0px 3px 25px;
    +  font-size: 1px;
    +}
    +.menu-active {
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.menu-item-disabled {
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +  cursor: default;
    +}
    +.menu-text,
    +.menu-text span {
    +  font-size: 12px;
    +}
    +.menu-shadow {
    +  position: absolute;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +  background: #eee;
    +  -moz-box-shadow: 2px 2px 3px #ededed;
    +  -webkit-box-shadow: 2px 2px 3px #ededed;
    +  box-shadow: 2px 2px 3px #ededed;
    +  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
    +}
    +.menu-rightarrow {
    +  background: url('images/menu_arrows.png') no-repeat -32px center;
    +}
    +.menu-line {
    +  border-left: 1px solid #ddd;
    +  border-right: 1px solid #fff;
    +}
    +.menu-sep {
    +  border-top: 1px solid #ddd;
    +  border-bottom: 1px solid #fff;
    +}
    +.menu {
    +  background-color: #ffffff;
    +  border-color: #ddd;
    +  color: #444;
    +}
    +.menu-content {
    +  background: #fff;
    +}
    +.menu-item {
    +  border-color: transparent;
    +  _border-color: #ffffff;
    +}
    +.menu-active {
    +  border-color: #ddd;
    +  color: #444;
    +  background: #E6E6E6;
    +}
    +.menu-active-disabled {
    +  border-color: transparent;
    +  background: transparent;
    +  color: #444;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/menubutton.css b/src/main/webapp/plug-in/easyui/themes/metro/menubutton.css
    new file mode 100644
    index 00000000..8b14692e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/menubutton.css
    @@ -0,0 +1,30 @@
    +.m-btn-downarrow {
    +  display: inline-block;
    +  width: 16px;
    +  height: 16px;
    +  line-height: 16px;
    +  _vertical-align: middle;
    +}
    +a.m-btn-active {
    +  background-position: bottom right;
    +}
    +a.m-btn-active span.l-btn-left {
    +  background-position: bottom left;
    +}
    +a.m-btn-plain-active {
    +  background: transparent;
    +  padding: 0 5px 0 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.m-btn-downarrow {
    +  background: url('images/menu_arrows.png') no-repeat 2px center;
    +}
    +a.m-btn-plain-active {
    +  border-color: #ddd;
    +  background-color: #E6E6E6;
    +  color: #444;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/messager.css b/src/main/webapp/plug-in/easyui/themes/metro/messager.css
    new file mode 100644
    index 00000000..3b9ac40c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/messager.css
    @@ -0,0 +1,37 @@
    +.messager-body {
    +  padding: 10px;
    +  overflow: hidden;
    +}
    +.messager-button {
    +  text-align: center;
    +  padding-top: 10px;
    +}
    +.messager-icon {
    +  float: left;
    +  width: 32px;
    +  height: 32px;
    +  margin: 0 10px 10px 0;
    +}
    +.messager-error {
    +  background: url('images/messager_icons.png') no-repeat scroll -64px 0;
    +}
    +.messager-info {
    +  background: url('images/messager_icons.png') no-repeat scroll 0 0;
    +}
    +.messager-question {
    +  background: url('images/messager_icons.png') no-repeat scroll -32px 0;
    +}
    +.messager-warning {
    +  background: url('images/messager_icons.png') no-repeat scroll -96px 0;
    +}
    +.messager-progress {
    +  padding: 10px;
    +}
    +.messager-p-msg {
    +  margin-bottom: 5px;
    +}
    +.messager-body .messager-input {
    +  width: 100%;
    +  padding: 1px 0;
    +  border: 1px solid #ddd;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/pagination.css b/src/main/webapp/plug-in/easyui/themes/metro/pagination.css
    new file mode 100644
    index 00000000..cf3268f4
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/pagination.css
    @@ -0,0 +1,66 @@
    +.pagination {
    +  zoom: 1;
    +}
    +.pagination table {
    +  float: left;
    +  height: 30px;
    +}
    +.pagination td {
    +  border: 0;
    +}
    +.pagination-btn-separator {
    +  float: left;
    +  height: 24px;
    +  border-left: 1px solid #ddd;
    +  border-right: 1px solid #fff;
    +  margin: 3px 1px;
    +}
    +.pagination .pagination-num {
    +  border-width: 1px;
    +  border-style: solid;
    +  margin: 0 2px;
    +  padding: 2px;
    +  width: 2em;
    +  height: auto;
    +}
    +.pagination-page-list {
    +  margin: 0px 6px;
    +  padding: 1px 2px;
    +  width: auto;
    +  height: auto;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.pagination-info {
    +  float: right;
    +  margin: 0 6px 0 0;
    +  padding: 0;
    +  height: 30px;
    +  line-height: 30px;
    +  font-size: 12px;
    +}
    +.pagination span {
    +  font-size: 12px;
    +}
    +.pagination-first {
    +  background: url('images/pagination_icons.png') no-repeat 0 0;
    +}
    +.pagination-prev {
    +  background: url('images/pagination_icons.png') no-repeat -16px 0;
    +}
    +.pagination-next {
    +  background: url('images/pagination_icons.png') no-repeat -32px 0;
    +}
    +.pagination-last {
    +  background: url('images/pagination_icons.png') no-repeat -48px 0;
    +}
    +.pagination-load {
    +  background: url('images/pagination_icons.png') no-repeat -64px 0;
    +}
    +.pagination-loading {
    +  background: url('images/loading.gif') no-repeat;
    +}
    +.pagination-page-list,
    +.pagination .pagination-num {
    +  border-color: #ddd;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/panel.css b/src/main/webapp/plug-in/easyui/themes/metro/panel.css
    new file mode 100644
    index 00000000..9408cc16
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/panel.css
    @@ -0,0 +1,118 @@
    +.panel {
    +  overflow: hidden;
    +  font-size: 12px;
    +  text-align: left;
    +}
    +.panel-header,
    +.panel-body {
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.panel-header {
    +  padding: 5px;
    +  position: relative;
    +}
    +.panel-title {
    +  background: url('images/blank.gif') no-repeat;
    +}
    +.panel-header-noborder {
    +  border-width: 0 0 1px 0;
    +}
    +.panel-body {
    +  overflow: auto;
    +  border-top-width: 0px;
    +}
    +.panel-body-noheader {
    +  border-top-width: 1px;
    +}
    +.panel-body-noborder {
    +  border-width: 0px;
    +}
    +.panel-with-icon {
    +  padding-left: 18px;
    +}
    +.panel-icon,
    +.panel-tool {
    +  position: absolute;
    +  top: 50%;
    +  margin-top: -8px;
    +  height: 16px;
    +  overflow: hidden;
    +}
    +.panel-icon {
    +  left: 5px;
    +  width: 16px;
    +}
    +.panel-tool {
    +  right: 5px;
    +  width: auto;
    +}
    +.panel-tool a {
    +  display: inline-block;
    +  width: 16px;
    +  height: 16px;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +  margin: 0 0 0 2px;
    +  vertical-align: top;
    +}
    +.panel-tool a:hover {
    +  opacity: 1;
    +  filter: alpha(opacity=100);
    +  background-color: #E6E6E6;
    +  -moz-border-radius: -2px -2px -2px -2px;
    +  -webkit-border-radius: -2px -2px -2px -2px;
    +  border-radius: -2px -2px -2px -2px;
    +}
    +.panel-loading {
    +  padding: 11px 0px 10px 30px;
    +}
    +.panel-noscroll {
    +  overflow: hidden;
    +}
    +.panel-fit,
    +.panel-fit body {
    +  height: 100%;
    +  margin: 0;
    +  padding: 0;
    +  border: 0;
    +  overflow: hidden;
    +}
    +.panel-loading {
    +  background: url('images/loading.gif') no-repeat 10px 10px;
    +}
    +.panel-tool-close {
    +  background: url('images/panel_tools.png') no-repeat -16px 0px;
    +}
    +.panel-tool-min {
    +  background: url('images/panel_tools.png') no-repeat 0px 0px;
    +}
    +.panel-tool-max {
    +  background: url('images/panel_tools.png') no-repeat 0px -16px;
    +}
    +.panel-tool-restore {
    +  background: url('images/panel_tools.png') no-repeat -16px -16px;
    +}
    +.panel-tool-collapse {
    +  background: url('images/panel_tools.png') no-repeat -32px 0;
    +}
    +.panel-tool-expand {
    +  background: url('images/panel_tools.png') no-repeat -32px -16px;
    +}
    +.panel-header,
    +.panel-body {
    +  border-color: #ddd;
    +}
    +.panel-header {
    +  background-color: #ffffff;
    +}
    +.panel-body {
    +  background-color: #fff;
    +  color: #444;
    +}
    +.panel-title {
    +  font-weight: bold;
    +  color: #777;
    +  height: 16px;
    +  line-height: 16px;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/progressbar.css b/src/main/webapp/plug-in/easyui/themes/metro/progressbar.css
    new file mode 100644
    index 00000000..fe58e6e9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/progressbar.css
    @@ -0,0 +1,30 @@
    +.progressbar {
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +  overflow: hidden;
    +}
    +.progressbar-text {
    +  text-align: center;
    +  position: absolute;
    +}
    +.progressbar-value {
    +  position: relative;
    +  overflow: hidden;
    +  width: 0;
    +  -moz-border-radius: 0px 0 0 0px;
    +  -webkit-border-radius: 0px 0 0 0px;
    +  border-radius: 0px 0 0 0px;
    +}
    +.progressbar {
    +  border-color: #ddd;
    +}
    +.progressbar-text {
    +  color: #444;
    +}
    +.progressbar-value .progressbar-text {
    +  background-color: #CCE6FF;
    +  color: #000;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/propertygrid.css b/src/main/webapp/plug-in/easyui/themes/metro/propertygrid.css
    new file mode 100644
    index 00000000..f5ae0c4e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/propertygrid.css
    @@ -0,0 +1,28 @@
    +.propertygrid .datagrid-view1 .datagrid-body td {
    +  padding-bottom: 1px;
    +  border-width: 0 1px 0 0;
    +}
    +.propertygrid .datagrid-group {
    +  height: 21px;
    +  overflow: hidden;
    +  border-width: 0 0 1px 0;
    +  border-style: solid;
    +}
    +.propertygrid .datagrid-group span {
    +  font-weight: bold;
    +}
    +.propertygrid .datagrid-view1 .datagrid-body td {
    +  border-color: #ddd;
    +}
    +.propertygrid .datagrid-view1 .datagrid-group {
    +  border-color: #ffffff;
    +}
    +.propertygrid .datagrid-view2 .datagrid-group {
    +  border-color: #ddd;
    +}
    +.propertygrid .datagrid-group,
    +.propertygrid .datagrid-view1 .datagrid-body,
    +.propertygrid .datagrid-view1 .datagrid-row-over,
    +.propertygrid .datagrid-view1 .datagrid-row-selected {
    +  background: #ffffff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/searchbox.css b/src/main/webapp/plug-in/easyui/themes/metro/searchbox.css
    new file mode 100644
    index 00000000..4e01696f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/searchbox.css
    @@ -0,0 +1,79 @@
    +.searchbox {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +}
    +.searchbox .searchbox-text {
    +  font-size: 12px;
    +  border: 0;
    +  margin: 0;
    +  padding: 0;
    +  line-height: 20px;
    +  height: 20px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.searchbox .searchbox-prompt {
    +  font-size: 12px;
    +  color: #ccc;
    +}
    +.searchbox-button {
    +  width: 18px;
    +  height: 20px;
    +  overflow: hidden;
    +  display: inline-block;
    +  vertical-align: top;
    +  cursor: pointer;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.searchbox-button-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.searchbox a.l-btn-plain {
    +  height: 20px;
    +  border: 0;
    +  padding: 0 6px 0 0;
    +  vertical-align: top;
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.searchbox a.l-btn .l-btn-left {
    +  padding: 2px 0 2px 4px;
    +}
    +.searchbox a.l-btn-plain:hover {
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +  border: 0;
    +  padding: 0 6px 0 0;
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.searchbox a.m-btn-plain-active {
    +  -moz-border-radius: 0;
    +  -webkit-border-radius: 0;
    +  border-radius: 0;
    +}
    +.searchbox-button {
    +  background: url('images/searchbox_button.png') no-repeat center center;
    +}
    +.searchbox {
    +  border-color: #ddd;
    +  background-color: #fff;
    +}
    +.searchbox a.l-btn-plain {
    +  background: #ffffff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/slider.css b/src/main/webapp/plug-in/easyui/themes/metro/slider.css
    new file mode 100644
    index 00000000..b6e01ea5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/slider.css
    @@ -0,0 +1,98 @@
    +.slider-disabled {
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +}
    +.slider-h {
    +  height: 22px;
    +}
    +.slider-v {
    +  width: 22px;
    +}
    +.slider-inner {
    +  position: relative;
    +  height: 6px;
    +  top: 7px;
    +  border-width: 1px;
    +  border-style: solid;
    +  border-radius: 3px;
    +}
    +.slider-handle {
    +  position: absolute;
    +  display: block;
    +  outline: none;
    +  width: 20px;
    +  height: 20px;
    +  top: -7px;
    +  margin-left: -10px;
    +}
    +.slider-tip {
    +  position: absolute;
    +  display: inline-block;
    +  line-height: 12px;
    +  white-space: nowrap;
    +  top: -22px;
    +}
    +.slider-rule {
    +  position: relative;
    +  top: 15px;
    +}
    +.slider-rule span {
    +  position: absolute;
    +  display: inline-block;
    +  font-size: 0;
    +  height: 5px;
    +  border-width: 0 0 0 1px;
    +  border-style: solid;
    +}
    +.slider-rulelabel {
    +  position: relative;
    +  top: 20px;
    +}
    +.slider-rulelabel span {
    +  position: absolute;
    +  display: inline-block;
    +}
    +.slider-v .slider-inner {
    +  width: 6px;
    +  left: 7px;
    +  top: 0;
    +  float: left;
    +}
    +.slider-v .slider-handle {
    +  left: 3px;
    +  margin-top: -10px;
    +}
    +.slider-v .slider-tip {
    +  left: -10px;
    +  margin-top: -6px;
    +}
    +.slider-v .slider-rule {
    +  float: left;
    +  top: 0;
    +  left: 16px;
    +}
    +.slider-v .slider-rule span {
    +  width: 5px;
    +  height: 'auto';
    +  border-left: 0;
    +  border-width: 1px 0 0 0;
    +  border-style: solid;
    +}
    +.slider-v .slider-rulelabel {
    +  float: left;
    +  top: 0;
    +  left: 23px;
    +}
    +.slider-handle {
    +  background: url('images/slider_handle.png') no-repeat;
    +}
    +.slider-inner {
    +  border-color: #ddd;
    +  background: #ffffff;
    +}
    +.slider-rule span {
    +  border-color: #ddd;
    +}
    +.slider-rulelabel span {
    +  color: #444;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/spinner.css b/src/main/webapp/plug-in/easyui/themes/metro/spinner.css
    new file mode 100644
    index 00000000..8676724c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/spinner.css
    @@ -0,0 +1,59 @@
    +.spinner {
    +  display: inline-block;
    +  white-space: nowrap;
    +  margin: 0;
    +  padding: 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  overflow: hidden;
    +  vertical-align: middle;
    +}
    +.spinner .spinner-text {
    +  font-size: 12px;
    +  border: 0px;
    +  line-height: 20px;
    +  height: 20px;
    +  margin: 0;
    +  padding: 0 2px;
    +  *margin-top: -1px;
    +  *height: 18px;
    +  *line-height: 18px;
    +  _height: 18px;
    +  _line-height: 18px;
    +  vertical-align: baseline;
    +}
    +.spinner-arrow {
    +  display: inline-block;
    +  overflow: hidden;
    +  vertical-align: top;
    +  margin: 0;
    +  padding: 0;
    +}
    +.spinner-arrow-up,
    +.spinner-arrow-down {
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +  display: block;
    +  font-size: 1px;
    +  width: 18px;
    +  height: 10px;
    +}
    +.spinner-arrow-hover {
    +  opacity: 1.0;
    +  filter: alpha(opacity=100);
    +}
    +.spinner-arrow-up {
    +  background: url('images/spinner_arrows.png') no-repeat 1px center;
    +}
    +.spinner-arrow-down {
    +  background: url('images/spinner_arrows.png') no-repeat -15px center;
    +}
    +.spinner {
    +  border-color: #ddd;
    +}
    +.spinner-arrow {
    +  background-color: #ffffff;
    +}
    +.spinner-arrow-hover {
    +  background-color: #E6E6E6;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/splitbutton.css b/src/main/webapp/plug-in/easyui/themes/metro/splitbutton.css
    new file mode 100644
    index 00000000..a8c55487
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/splitbutton.css
    @@ -0,0 +1,42 @@
    +.s-btn-downarrow {
    +  display: inline-block;
    +  margin: 0 0 0 4px;
    +  padding: 0 0 0 1px;
    +  width: 14px;
    +  height: 16px;
    +  line-height: 16px;
    +  border-width: 0;
    +  border-style: solid;
    +  _vertical-align: middle;
    +}
    +a.s-btn-active {
    +  background-position: bottom right;
    +}
    +a.s-btn-active span.l-btn-left {
    +  background-position: bottom left;
    +}
    +a.s-btn-plain-active {
    +  background: transparent;
    +  padding: 0 5px 0 0;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.s-btn-downarrow {
    +  background: url('images/menu_arrows.png') no-repeat 2px center;
    +  border-color: #b3b3b3;
    +}
    +a:hover.l-btn .s-btn-downarrow,
    +a.s-btn-active .s-btn-downarrow,
    +a.s-btn-plain-active .s-btn-downarrow {
    +  background-position: 1px center;
    +  padding: 0;
    +  border-width: 0 0 0 1px;
    +}
    +a.s-btn-plain-active {
    +  border-color: #ddd;
    +  background-color: #E6E6E6;
    +  color: #444;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/tabs.css b/src/main/webapp/plug-in/easyui/themes/metro/tabs.css
    new file mode 100644
    index 00000000..2373f48c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/tabs.css
    @@ -0,0 +1,325 @@
    +.tabs-container {
    +  overflow: hidden;
    +}
    +.tabs-header {
    +  border-width: 1px;
    +  border-style: solid;
    +  border-bottom-width: 0;
    +  position: relative;
    +  padding: 0;
    +  padding-top: 2px;
    +  overflow: hidden;
    +}
    +.tabs-header-plain {
    +  border: 0;
    +  background: transparent;
    +}
    +.tabs-scroller-left,
    +.tabs-scroller-right {
    +  position: absolute;
    +  top: auto;
    +  bottom: 0;
    +  width: 18px;
    +  height: 28px !important;
    +  height: 30px;
    +  font-size: 1px;
    +  display: none;
    +  cursor: pointer;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.tabs-scroller-left {
    +  left: 0;
    +}
    +.tabs-scroller-right {
    +  right: 0;
    +}
    +.tabs-header-plain .tabs-scroller-left,
    +.tabs-header-plain .tabs-scroller-right {
    +  height: 25px !important;
    +  height: 27px;
    +}
    +.tabs-tool {
    +  position: absolute;
    +  bottom: 0;
    +  padding: 1px;
    +  overflow: hidden;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.tabs-header-plain .tabs-tool {
    +  padding: 0 1px;
    +}
    +.tabs-wrap {
    +  position: relative;
    +  left: 0;
    +  overflow: hidden;
    +  width: 100%;
    +  margin: 0;
    +  padding: 0;
    +}
    +.tabs-scrolling {
    +  margin-left: 18px;
    +  margin-right: 18px;
    +}
    +.tabs-disabled {
    +  opacity: 0.3;
    +  filter: alpha(opacity=30);
    +}
    +.tabs {
    +  list-style-type: none;
    +  height: 26px;
    +  margin: 0px;
    +  padding: 0px;
    +  padding-left: 4px;
    +  font-size: 12px;
    +  width: 5000px;
    +  border-style: solid;
    +  border-width: 0 0 1px 0;
    +}
    +.tabs li {
    +  float: left;
    +  display: inline-block;
    +  margin: 0 4px -1px 0;
    +  padding: 0;
    +  position: relative;
    +  border: 0;
    +}
    +.tabs li a.tabs-inner {
    +  display: inline-block;
    +  text-decoration: none;
    +  margin: 0;
    +  padding: 0 10px;
    +  height: 25px;
    +  line-height: 25px;
    +  text-align: center;
    +  white-space: nowrap;
    +  border-width: 1px;
    +  border-style: solid;
    +  -moz-border-radius: 0px 0px 0 0;
    +  -webkit-border-radius: 0px 0px 0 0;
    +  border-radius: 0px 0px 0 0;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  font-weight: bold;
    +  outline: none;
    +}
    +.tabs li.tabs-selected a:hover.tabs-inner {
    +  cursor: default;
    +  pointer: default;
    +}
    +.tabs li a.tabs-close,
    +.tabs-p-tool {
    +  position: absolute;
    +  font-size: 1px;
    +  display: block;
    +  height: 12px;
    +  padding: 0;
    +  top: 50%;
    +  margin-top: -6px;
    +  overflow: hidden;
    +}
    +.tabs li a.tabs-close {
    +  width: 12px;
    +  right: 5px;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.tabs-p-tool {
    +  right: 16px;
    +}
    +.tabs-p-tool a {
    +  display: inline-block;
    +  font-size: 1px;
    +  width: 12px;
    +  height: 12px;
    +  margin: 0;
    +  opacity: 0.6;
    +  filter: alpha(opacity=60);
    +}
    +.tabs li a:hover.tabs-close,
    +.tabs-p-tool a:hover {
    +  opacity: 1;
    +  filter: alpha(opacity=100);
    +  cursor: hand;
    +  cursor: pointer;
    +}
    +.tabs-with-icon {
    +  padding-left: 18px;
    +}
    +.tabs-icon {
    +  position: absolute;
    +  width: 16px;
    +  height: 16px;
    +  left: 10px;
    +  top: 50%;
    +  margin-top: -8px;
    +}
    +.tabs-closable {
    +  padding-right: 8px;
    +}
    +.tabs-panels {
    +  margin: 0px;
    +  padding: 0px;
    +  border-width: 1px;
    +  border-style: solid;
    +  border-top-width: 0;
    +  overflow: hidden;
    +}
    +.tabs-header-bottom {
    +  border-width: 0 1px 1px 1px;
    +  padding: 0 0 2px 0;
    +}
    +.tabs-header-bottom .tabs {
    +  border-width: 1px 0 0 0;
    +}
    +.tabs-header-bottom .tabs li {
    +  margin: -1px 4px 0 0;
    +}
    +.tabs-header-bottom .tabs li a.tabs-inner {
    +  -moz-border-radius: 0 0 0px 0px;
    +  -webkit-border-radius: 0 0 0px 0px;
    +  border-radius: 0 0 0px 0px;
    +}
    +.tabs-header-bottom .tabs-tool {
    +  top: 0;
    +}
    +.tabs-header-bottom .tabs-scroller-left,
    +.tabs-header-bottom .tabs-scroller-right {
    +  top: 0;
    +  bottom: auto;
    +}
    +.tabs-panels-top {
    +  border-width: 1px 1px 0 1px;
    +}
    +.tabs-header-left {
    +  float: left;
    +  border-width: 1px 0 1px 1px;
    +  padding: 0;
    +}
    +.tabs-header-right {
    +  float: right;
    +  border-width: 1px 1px 1px 0;
    +  padding: 0;
    +}
    +.tabs-header-left .tabs-wrap,
    +.tabs-header-right .tabs-wrap {
    +  height: 100%;
    +}
    +.tabs-header-left .tabs {
    +  height: 100%;
    +  padding: 4px 0 0 4px;
    +  border-width: 0 1px 0 0;
    +}
    +.tabs-header-right .tabs {
    +  height: 100%;
    +  padding: 4px 4px 0 0;
    +  border-width: 0 0 0 1px;
    +}
    +.tabs-header-left .tabs li,
    +.tabs-header-right .tabs li {
    +  display: block;
    +  width: 100%;
    +  position: relative;
    +}
    +.tabs-header-left .tabs li {
    +  left: auto;
    +  right: 0;
    +  margin: 0 -1px 4px 0;
    +  float: right;
    +}
    +.tabs-header-right .tabs li {
    +  left: 0;
    +  right: auto;
    +  margin: 0 0 4px -1px;
    +  float: left;
    +}
    +.tabs-header-left .tabs li a.tabs-inner {
    +  display: block;
    +  text-align: left;
    +  -moz-border-radius: 0px 0 0 0px;
    +  -webkit-border-radius: 0px 0 0 0px;
    +  border-radius: 0px 0 0 0px;
    +}
    +.tabs-header-right .tabs li a.tabs-inner {
    +  display: block;
    +  text-align: left;
    +  -moz-border-radius: 0 0px 0px 0;
    +  -webkit-border-radius: 0 0px 0px 0;
    +  border-radius: 0 0px 0px 0;
    +}
    +.tabs-panels-right {
    +  float: right;
    +  border-width: 1px 1px 1px 0;
    +}
    +.tabs-panels-left {
    +  float: left;
    +  border-width: 1px 0 1px 1px;
    +}
    +.tabs-header-noborder,
    +.tabs-panels-noborder {
    +  border: 0px;
    +}
    +.tabs-header-plain {
    +  border: 0px;
    +  background: transparent;
    +}
    +.tabs-scroller-left {
    +  background: #ffffff url('images/tabs_icons.png') no-repeat 1px center;
    +}
    +.tabs-scroller-right {
    +  background: #ffffff url('images/tabs_icons.png') no-repeat -15px center;
    +}
    +.tabs li a.tabs-close {
    +  background: url('images/tabs_icons.png') no-repeat -34px center;
    +}
    +.tabs li a.tabs-inner:hover {
    +  background: #E6E6E6;
    +  color: #444;
    +  filter: none;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  background-color: #fff;
    +  color: #777;
    +}
    +.tabs li a.tabs-inner {
    +  color: #777;
    +  background-color: #ffffff;
    +}
    +.tabs-header,
    +.tabs-tool {
    +  background-color: #ffffff;
    +}
    +.tabs-header-plain {
    +  background: transparent;
    +}
    +.tabs-header,
    +.tabs-scroller-left,
    +.tabs-scroller-right,
    +.tabs-tool,
    +.tabs,
    +.tabs-panels,
    +.tabs li a.tabs-inner,
    +.tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner,
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  border-color: #ddd;
    +}
    +.tabs-p-tool a:hover,
    +.tabs li a:hover.tabs-close,
    +.tabs-scroller-over {
    +  background-color: #E6E6E6;
    +}
    +.tabs li.tabs-selected a.tabs-inner {
    +  border-bottom: 1px solid #fff;
    +}
    +.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {
    +  border-top: 1px solid #fff;
    +}
    +.tabs-header-left .tabs li.tabs-selected a.tabs-inner {
    +  border-right: 1px solid #fff;
    +}
    +.tabs-header-right .tabs li.tabs-selected a.tabs-inner {
    +  border-left: 1px solid #fff;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/tree.css b/src/main/webapp/plug-in/easyui/themes/metro/tree.css
    new file mode 100644
    index 00000000..a2ec6931
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/tree.css
    @@ -0,0 +1,157 @@
    +.tree {
    +  margin: 0;
    +  padding: 0;
    +  list-style-type: none;
    +}
    +.tree li {
    +  white-space: nowrap;
    +}
    +.tree li ul {
    +  list-style-type: none;
    +  margin: 0;
    +  padding: 0;
    +}
    +.tree-node {
    +  height: 18px;
    +  white-space: nowrap;
    +  cursor: pointer;
    +}
    +.tree-hit {
    +  cursor: pointer;
    +}
    +.tree-expanded,
    +.tree-collapsed,
    +.tree-folder,
    +.tree-file,
    +.tree-checkbox,
    +.tree-indent {
    +  display: inline-block;
    +  width: 16px;
    +  height: 18px;
    +  vertical-align: top;
    +  overflow: hidden;
    +}
    +.tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -18px 0px;
    +}
    +.tree-expanded-hover {
    +  background: url('images/tree_icons.png') no-repeat -50px 0px;
    +}
    +.tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat 0px 0px;
    +}
    +.tree-collapsed-hover {
    +  background: url('images/tree_icons.png') no-repeat -32px 0px;
    +}
    +.tree-lines .tree-expanded,
    +.tree-lines .tree-root-first .tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -144px 0;
    +}
    +.tree-lines .tree-collapsed,
    +.tree-lines .tree-root-first .tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat -128px 0;
    +}
    +.tree-lines .tree-node-last .tree-expanded,
    +.tree-lines .tree-root-one .tree-expanded {
    +  background: url('images/tree_icons.png') no-repeat -80px 0;
    +}
    +.tree-lines .tree-node-last .tree-collapsed,
    +.tree-lines .tree-root-one .tree-collapsed {
    +  background: url('images/tree_icons.png') no-repeat -64px 0;
    +}
    +.tree-line {
    +  background: url('images/tree_icons.png') no-repeat -176px 0;
    +}
    +.tree-join {
    +  background: url('images/tree_icons.png') no-repeat -192px 0;
    +}
    +.tree-joinbottom {
    +  background: url('images/tree_icons.png') no-repeat -160px 0;
    +}
    +.tree-folder {
    +  background: url('images/tree_icons.png') no-repeat -208px 0;
    +}
    +.tree-folder-open {
    +  background: url('images/tree_icons.png') no-repeat -224px 0;
    +}
    +.tree-file {
    +  background: url('images/tree_icons.png') no-repeat -240px 0;
    +}
    +.tree-loading {
    +  background: url('images/loading.gif') no-repeat center center;
    +}
    +.tree-checkbox0 {
    +  background: url('images/tree_icons.png') no-repeat -208px -18px;
    +}
    +.tree-checkbox1 {
    +  background: url('images/tree_icons.png') no-repeat -224px -18px;
    +}
    +.tree-checkbox2 {
    +  background: url('images/tree_icons.png') no-repeat -240px -18px;
    +}
    +.tree-title {
    +  font-size: 12px;
    +  display: inline-block;
    +  text-decoration: none;
    +  vertical-align: top;
    +  white-space: nowrap;
    +  padding: 0 2px;
    +  height: 18px;
    +  line-height: 18px;
    +}
    +.tree-node-proxy {
    +  font-size: 12px;
    +  line-height: 20px;
    +  padding: 0 2px 0 20px;
    +  border-width: 1px;
    +  border-style: solid;
    +  z-index: 9900000;
    +}
    +.tree-dnd-icon {
    +  display: inline-block;
    +  position: absolute;
    +  width: 16px;
    +  height: 18px;
    +  left: 2px;
    +  top: 50%;
    +  margin-top: -9px;
    +}
    +.tree-dnd-yes {
    +  background: url('images/tree_icons.png') no-repeat -256px 0;
    +}
    +.tree-dnd-no {
    +  background: url('images/tree_icons.png') no-repeat -256px -18px;
    +}
    +.tree-node-top {
    +  border-top: 1px dotted red;
    +}
    +.tree-node-bottom {
    +  border-bottom: 1px dotted red;
    +}
    +.tree-node-append .tree-title {
    +  border: 1px dotted red;
    +}
    +.tree-editor {
    +  border: 1px solid #ccc;
    +  font-size: 12px;
    +  height: 14px !important;
    +  height: 18px;
    +  line-height: 14px;
    +  padding: 1px 2px;
    +  width: 80px;
    +  position: absolute;
    +  top: 0;
    +}
    +.tree-node-proxy {
    +  background-color: #fff;
    +  color: #444;
    +  border-color: #ddd;
    +}
    +.tree-node-hover {
    +  background: #E6E6E6;
    +  color: #444;
    +}
    +.tree-node-selected {
    +  background: #CCE6FF;
    +  color: #000;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/validatebox.css b/src/main/webapp/plug-in/easyui/themes/metro/validatebox.css
    new file mode 100644
    index 00000000..06d86a3e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/validatebox.css
    @@ -0,0 +1,53 @@
    +.validatebox-tip {
    +  position: absolute;
    +  width: 200px;
    +  height: auto;
    +  display: none;
    +  z-index: 9900000;
    +}
    +.validatebox-tip-content {
    +  display: inline-block;
    +  position: absolute;
    +  top: 0px;
    +  left: 8px;
    +  width: 150px;
    +  border-width: 1px;
    +  border-style: solid;
    +  padding: 3px 5px;
    +  z-index: 9900001;
    +  font-size: 12px;
    +}
    +.validatebox-tip-pointer {
    +  display: inline-block;
    +  width: 8px;
    +  height: 16px;
    +  position: absolute;
    +  left: 1px;
    +  top: 0px;
    +  z-index: 9900002;
    +}
    +.validatebox-tip-left .validatebox-tip-content {
    +  left: auto;
    +  right: 8px;
    +}
    +.validatebox-tip-left .validatebox-tip-pointer {
    +  background-position: -20px center;
    +  left: auto;
    +  right: 1px;
    +}
    +.validatebox-invalid {
    +  background-image: url('images/validatebox_warning.png');
    +  background-repeat: no-repeat;
    +  background-position: right center;
    +  border-color: #ffa8a8;
    +  background-color: #fff3f3;
    +  color: #000;
    +}
    +.validatebox-tip-pointer {
    +  background: url('images/validatebox_arrows.png') no-repeat -4px center;
    +}
    +.validatebox-tip-content {
    +  border-color: #CC9933;
    +  background-color: #FFFFCC;
    +  color: #000;
    +}
    diff --git a/src/main/webapp/plug-in/easyui/themes/metro/window.css b/src/main/webapp/plug-in/easyui/themes/metro/window.css
    new file mode 100644
    index 00000000..6d2f9119
    --- /dev/null
    +++ b/src/main/webapp/plug-in/easyui/themes/metro/window.css
    @@ -0,0 +1,81 @@
    +.window {
    +  overflow: hidden;
    +  padding: 5px;
    +  border-width: 1px;
    +  border-style: solid;
    +}
    +.window .window-header {
    +  background: transparent;
    +  padding: 0px 0px 6px 0px;
    +}
    +.window .window-body {
    +  border-width: 1px;
    +  border-style: solid;
    +  border-top-width: 0px;
    +}
    +.window .window-body-noheader {
    +  border-top-width: 1px;
    +}
    +.window .window-header .panel-icon,
    +.window .window-header .panel-tool {
    +  top: 50%;
    +  margin-top: -11px;
    +}
    +.window .window-header .panel-icon {
    +  left: 1px;
    +}
    +.window .window-header .panel-tool {
    +  right: 1px;
    +}
    +.window .window-header .panel-with-icon {
    +  padding-left: 18px;
    +}
    +.window-proxy {
    +  position: absolute;
    +  overflow: hidden;
    +}
    +.window-proxy-mask {
    +  position: absolute;
    +  filter: alpha(opacity=5);
    +  opacity: 0.05;
    +}
    +.window-mask {
    +  position: absolute;
    +  left: 0;
    +  top: 0;
    +  width: 100%;
    +  height: 100%;
    +  filter: alpha(opacity=40);
    +  opacity: 0.40;
    +  font-size: 1px;
    +  *zoom: 1;
    +  overflow: hidden;
    +}
    +.window,
    +.window-shadow {
    +  position: absolute;
    +  -moz-border-radius: 0px 0px 0px 0px;
    +  -webkit-border-radius: 0px 0px 0px 0px;
    +  border-radius: 0px 0px 0px 0px;
    +}
    +.window-shadow {
    +  background: #eee;
    +  -moz-box-shadow: 2px 2px 3px #ededed;
    +  -webkit-box-shadow: 2px 2px 3px #ededed;
    +  box-shadow: 2px 2px 3px #ededed;
    +  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
    +}
    +.window,
    +.window .window-body {
    +  border-color: #ddd;
    +}
    +.window {
    +  background-color: #ffffff;
    +}
    +.window-proxy {
    +  border: 1px dashed #ddd;
    +}
    +.window-proxy-mask,
    +.window-mask {
    +  background: #eee;
    +}
    diff --git a/src/main/webapp/plug-in/graphreport/css/metro/report.css b/src/main/webapp/plug-in/graphreport/css/metro/report.css
    new file mode 100644
    index 00000000..30e7683c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/graphreport/css/metro/report.css
    @@ -0,0 +1,1317 @@
    +/*author linan@umeng.com*/
    +/*reset*/
    +html{color:#000;background:#fff;height:100%;}
    +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;outline:0;}
    +body{font-family:helvetica,"Microsoft Yahei",sans-serif;font-weight:normal;font-size:12px;line-height:20px;color:#333;height:100%;position:relative;}
    +table{border-collapse:collapse;border-spacing:0;}
    +fieldset,img{border:0;}
    +address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}
    +li{list-style:none;}
    +caption,th{text-align:left;}
    +h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}
    +q:before,q:after{content:'';}
    +abbr,acronym{border:0;font-variant:normal;}
    +sup{vertical-align:text-top;}
    +sub{vertical-align:text-bottom;}
    +input,textarea,select,button{font-family:inherit;font-size:inherit;font-weight:inherit;outline:none;}
    +input,textarea,select{*font-size:100%;resize:none;}
    +legend{color:#000;}
    +b{font-weight:normal;}
    +a{text-decoration:none;color:#2a5295;cursor:pointer;}
    +a.normal{font-size:12px;color:#333;text-decoration:underline;}
    +a:active,a:focus,a:link {outline: none;}
    +/*clear float*/
    +.clear{clear:both;display:block;overflow:hidden;visibility:hidden;width:0;height:0;}
    +.clearfix:after{clear:both;content:' ';display:block;font-size:0;line-height:0;visibility:hidden;height:0;overflow: hidden;}
    +.clearfix{*zoom:1;}
    +.mr10{margin-right:10px;}
    +.ml10{margin-left:10px;}
    +.ell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
    +/*gird*/
    +/*mod*/
    +
    +/*author linan@umeng.com*/
    +#doc{
    +	min-width: 1200px;
    +	position:relative;
    +	min-height:100%;
    +}
    +.hd .userHeader{
    +	height:50px;
    +	line-height:50px;
    +	padding-right:35px;
    +	border-bottom:1px solid #fff;
    +	background:url(images/backg.png) repeat-x 0 0;
    +	font-size:13px;
    +	color:#bebebe;
    +}
    +.hd .userHeader .logo{
    +  height:50px;
    +  float:left;
    +}
    +.hd .globalNav{
    +	height:60px;
    +	line-height:60px;
    +	background:url(images/backg.png) repeat-x 0 -61px;
    +}
    +#doc .bd{
    +	margin:0 12px;
    +  padding:15px 0 20px 228px;
    +  overflow-x:hidden;
    +}
    +#doc .ft{
    +	height:105px;
    +	background:url(images/backg.png) repeat-x 0 -748px;
    +	color:#999;
    +	text-align:center;
    +	position:absolute;
    +	bottom:0;
    +	width:100%;
    +}
    +#doc .hiddenft{
    +	height:105px;
    +}
    +#doc .ft a{
    +	color:#999;
    +}
    +#doc .ft .copyright{
    +	padding:27px 0;
    +	line-height:20px;
    +}
    +#doc .ft .copyright .copy{
    +	margin-top:10px;
    +}
    +.bd #leftColContainer{
    +	float:left;
    +	display:inline;
    +	margin-left:-228px;
    +  padding-bottom:50px;
    +}
    +.bd .leftCol{
    +	width:198px;
    +}
    +.bd #mainContainer{
    +	float:left;
    +  width:100%;
    +}
    +.bd2{
    +	padding:0 12px;
    +}
    +.bd2 .leftCol{
    +	float:left;
    +	display:inline;
    +	width:198px;
    +}
    +.bd2 .contentCol{
    +	margin-left:228px;
    +	text-align:center;
    +	overflow: visible;
    +	padding-bottom:0px;
    +}
    +.bd3 .leftCol{
    +	float:left;
    +    height:30px;
    +	display:inline;
    +	width:400px;
    +}
    +.bd3 .contentCol{
    +	margin-left:430px;
    +	text-align:right;
    +	overflow: visible;
    +	padding-bottom:0px;
    +}
    +.bd4 .leftCol{
    +	float:left;
    +    height:30px;
    +	display:inline;
    +	width:400px;
    +}
    +.bd4 .contentCol{
    +	margin-left:430px;
    +	text-align:right;
    +	overflow: visible;
    +	padding-bottom:0px;
    +}
    +
    +
    +label.error {
    +color: #ff0400;
    +}
    +/*icon*/
    +.icon{
    +  background:url(images/icon.png) no-repeat 0 0 transparent;
    +  display:inline-block;
    +  height:24px;
    +  overflow:hidden;
    +  vertical-align:middle;
    +  width:24px;
    +  *zoom:1;
    +  line-height:24px;
    +  text-indent:-9999px;
    +}
    +.icon2{
    +  background:url(images/iconEx.png) no-repeat 0 0 transparent;
    +  display:inline-block;
    +  height:24px;
    +  overflow:hidden;
    +  vertical-align:middle;
    +  width:24px;
    +  *zoom:1;
    +  line-height:24px;
    +  text-indent:-9999px;
    +}
    +.no_action{
    +  cursor:not-allowed!important;
    +}
    +.export{
    +  background-position:0 -72px;
    +  cursor:pointer;
    +}
    +.icon-lt{
    +	background-position:0 -1009px;
    +}
    +.icon-close{
    +	background-position:0 -793px;
    +}
    +.font-weight{
    +	font-weight:bold;
    +}
    +.icon-staroff{
    +	background-position:0 -818px;
    +}
    +.icon-staron,.icon-top{
    +	background-position:-24px -818px;
    +}
    +.icon-delete{
    +	background-position:0 -745px;
    +}
    +.icon-delete:hover{
    +	background-position:-24px -745px;
    +}
    +.icon-edit{
    +	background-position: 0 -697px;
    +}
    +.icon-edit:hover{
    +	background-position: -24px -697px;
    +}
    +.icon-add{
    +	background-position: 0 -1057px;
    +}
    +.icon-add:hover{
    +	background-position: -24px -1057px;
    +}
    +.tip-helper{
    +  background-position: 0 -217px;
    +}
    +.tip-helper-on{
    +  background-position: -24px -217px;
    +}
    +.export-icon-load{
    +	background:url(/images/pic/load-s.gif) no-repeat 0 0;
    +}
    +.icon-setting{
    +  background-position: 0 -1176px;
    +}
    +.icon-setting:hover{
    +  background-position: -24px -1176px;
    +}
    +.globalNav .linkpanel a .back-old-ver{
    +	background-position: 0px -194px;
    +}
    +.globalNav .linkpanel a:hover .back-old-ver{
    +	background-position:-24px -194px;
    +}
    +.icon-calendar .icon{
    +  background-position:0px -1250px;
    +}
    +.icon-calendar:hover .icon{
    +  background-position:-24px -1250px;
    +}
    +.globalNav .linkpanel{
    +  position:absolute;
    +  right:0;
    +}
    +.globalNav .linkpanel a{
    +  color:#333;
    +  font-size:12px;
    +  text-decoration: underline;
    +  margin-right:15px;
    +}
    +.globalNav .linkpanel a .au{
    +	background-position: 0px -168px;
    +}
    +.globalNav .linkpanel a:hover .au{
    +	background-position:-24px -168px;
    +}
    +
    +.feedback_help {
    +  display: block;
    +  position: fixed;
    +  right: 0;
    +  top:40%;
    +  z-index:300;
    +  font-size: 12px;
    +  padding:0;
    +  line-height: 44px;
    +}
    +.feedback_help .relative{
    +  position: relative;
    +}
    +.feedback_help .relative div{
    +  position: absolute;
    +}
    +.feedback_help .feed, .feedback_help .dev{
    +  line-height: 44px;
    +  width: 60px;
    +  border-radius: 4px;
    +  vertical-align: middle;
    +  background: #565656;
    +  border: 1px solid #393939;
    +}
    +.feedback_help .cssline{
    +  border-top: 1px solid #393939;
    +  border-bottom: 1px solid #838383;
    +  border-radius: 0;
    +  height: 0px;
    +  width: 62px;
    +  right: -37px;
    +  top: 44px;
    +  z-index: 302;
    +  text-indent: -9999px;
    +}
    +.feedback_help div.feed{
    +  border-bottom: 0;
    +  border-radius: 4px 0 0 0;
    +  top: 0px;
    +  right: -37px;
    +}
    +.feedback_help div.dev{
    +  border-top: 0;
    +  border-radius: 0 0 0 4px;
    +  top: 46px;
    +  right: -37px;
    +}
    +.feedback_help a{
    +  padding: 0 10px 0 0;
    +  color: #cccccc;
    +  display: block;
    +}
    +.icon-feedback{
    +  background: url(images/feedbackicon.png) 2px -1px;
    +}
    +.icon-help{
    +  background: url(images/feedbackicon.png) 2px 24px;
    +}
    +.feedback_help a:hover .icon-feedback{
    +  background: url(images/feedbackicon.png) -22px -1px;
    +}
    +.feedback_help a:hover .icon-help{
    +  background: url(images/feedbackicon.png) -22px 24px;
    +}
    +a.feed_back_all {
    +  display: block;
    +  position: fixed;
    +  right: 0;
    +  top: 40%;
    +  width: 29px;
    +  height: 72px;
    +  line-height: 72px;
    +  z-index: 300;
    +  font-size: 12px;
    +  color: white;
    +  text-align: center;
    +  padding: 10px 0;
    +  background: url(images/bg-feedback.png) no-repeat 0 0;
    +  color: white;
    +  text-indent: -9999px;
    +}
    +/*logo*/
    +.logo a{
    +  display: inline-block;
    +  line-height: 50px;
    +  height: 50px;
    +  margin:0 0 0 39px;
    +}
    +/*float*/
    +.fl{
    +  float:left;
    +  display:inline;
    +}
    +.fr{
    +  float:right;
    +  display:inline;
    +}
    +.small{
    +	font-size:10px;
    +}
    +.bold{
    +  font-weight:bold;
    +}
    +.hidden{display:none;}
    +/*column*/
    +.fix-column{
    +  width:100%;
    +  overflow:hidden;
    +}
    +.fix-column .col{
    +  display:inline;
    +  float:left;
    +}
    +.fix-column .col:last-child{
    +  margin-right:0;
    +}
    +.column-bg{
    +  background: url(images/backg.png) 0 -418px repeat-x;
    +}
    +.pos{
    +  text-align:center;
    +  border-right:1px solid #d6d6d6;
    +  padding:25px 0 53px;
    +}
    +.nopos{
    +  border-right:0;
    +}
    +.skimtitle{
    +  font-size:14px;
    +  color:#333333;
    +  margin-bottom:28px;
    +}
    +.skimnum{
    +  font-size:28px;
    +  color:#01a7ad;
    +}
    +/*topNav*/
    +.topNav{
    +  height:60px;
    +}
    +.navItem{
    +  display:inline-block;
    +  *display:inline;
    +  zoom:1;
    +  margin-right:60px;
    +  vertical-align: middle;
    +  overflow:hidden;
    +}
    +.navItem .icons1{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat 0 0;
    +}
    +.navItem .icons2{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat 0 -24px;
    +}
    +.navItem .icons3{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat 0 -48px;
    +}
    +.navItem .icons4{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat 0 -1080px;
    +}
    +div.currentItem .icons1{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat -24px 0;
    +}
    +div.currentItem .icons2{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat -24px -24px;
    +}
    +div.currentItem .icons3{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat -24px -48px;
    +}
    +div.currentItem .icons4{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat -24px -1080px;
    +}
    +.navItem span{
    +  line-height:16px;
    +  font-size:16px;
    +  color:#333333;
    +  display:block;
    +  zoom:1;
    +}
    +.navItem .bot{
    +  margin-top: 4px;
    +  height: 5px;
    +}
    +.currentItem .bot{
    +  background: #01A7AD;
    +}
    +/*topNav*/
    +
    +/*wrap*/
    +.wrap-table{
    +}
    +.nav-wrap-table{
    +  float:left;
    +  width:100%;
    +  margin-right:15px;
    +}
    +.wrap-move{
    +  position:relative;
    +}
    +/*mod*/
    +.mod{
    +	position:relative;
    +}
    +.mod1{
    +  margin-bottom:15px;
    +}
    +.mod2{
    +  margin-bottom:10px;
    +}
    +.mod3{
    +  margin-top:10px;
    +}
    +.mod4 .mod-header{
    +  border-top:0;
    +}
    +.mod1 .mod-header{
    +  height:43px;
    +  line-height:43px;
    +  padding:0 23px;
    +  background: url(images/backg.png) 0 -297px repeat-x;
    +  border:1px solid #b4b4b4;
    +}
    +.mod1 .mod-header .back{
    +  float:left;
    +}
    +.mod1 .mod-header h2{
    +  font-size:15px;
    +  color:#333;
    +}
    +.mod .mod-header{
    +  text-align:right;
    +}
    +.mod .mod-header h2{
    +  float:left;
    +}
    +.mod .mod-header .option{
    +}
    +.mod .mod-body{
    +  border:1px solid #b4b4b4;
    +  border-top:0px none;
    +  position:relative;
    +  padding-bottom: 1px;
    +}
    +.mod .mod-body .content{
    +  padding:15px 23px;
    +}
    +.mod-body .filter_tag_body{
    +  line-height:45px;
    +  padding:0 80px 0 18px;
    +  border-bottom:1px solid #B4B4B4;
    +}
    +.margin-l-1{
    +  margin-left:10px;
    +}
    +.filter_tag_body .edit_tags{
    +  position: absolute;
    +  right: 15px;
    +  top:9px;
    +}
    +.filter_tag_body ul{
    +  display: inline-block;
    +  padding-top:10px;
    +  -webkit-margin-before:-10px;
    +}
    +.colorPannel{
    +  position:absolute;
    +  background:white;
    +  -moz-border-radius:8px;
    +  -webkit-border-radius:8px;
    +  border-radius:8px;
    +  -moz-box-shadow:0 0 3px rgba(0,0,0,.3);
    +  -webkit-box-shadow:0 0 3px rgba(0,0,0,.3);
    +  box-shadow:0 0 3px rgba(0,0,0,.3);
    +  text-align:center;
    +  line-height:200%;
    +  padding-top:5px;
    +}
    +.colorPannel .colorList i,.cus_cr_preview{
    +  display: inline-block;
    +  vertical-align: middle;
    +  height:15px;
    +  width:20px;
    +  -moz-border-radius:2px;
    +  -webkit-border-radius:2px;
    +  border-radius:2px;
    +}
    +.cus_cr_preview{
    +  margin-left:10px;
    +  background:#fff;
    +}
    +.colorPannel .colorList i.sel,.colorPannel .colorList i:hover,.cus_cr_preview{
    +  -webkit-box-shadow:0 0 2px rgba(0,0,0,.4), inset 1px 1px 0 rgba(0,0,0,.2),inset -1px -1px 0 rgba(0,0,0,.2);
    +  -moz-box-shadow:0 0 2px rgba(0,0,0,.4), inset 1px 1px 0 rgba(0,0,0,.2),inset -1px -1px 0 rgba(0,0,0,.2);
    +  box-shadow:0 0 2px rgba(0,0,0,.4), inset 1px 1px 0 rgba(0,0,0,.2),inset -1px -1px 0 rgba(0,0,0,.2);
    +  border:1px solid grey\9;
    +}
    +.c1{
    +  background:#18c2c6;
    +}
    +.c2{
    +  background:#1fb8ff;
    +}
    +.c3{
    +  background:#439e16;
    +}
    +.c4{
    +  background:#c91d1d;
    +}
    +.c5{
    +  background:#ef8032;
    +}
    +.c6{
    +  background:#ab497f;
    +}
    +.colorPannel .new_tag_sure{
    +  margin:5px;
    +}
    +.tag{
    +  font-size:12px;
    +  padding:6px 11px;
    +  display:inline-block;
    +  box-sizing:border-box;
    +  -moz-box-sizing:border-box;
    +  font-style:normal;
    +  margin:0 5px;
    +  line-height:18px;
    +  position:relative;
    +  cursor: pointer;
    +  background-size:100% 3px;
    +  background-position:0 15px;
    +  border-bottom:3px solid silver;
    +  max-width: 300px;
    +  overflow: hidden;
    +  text-overflow: ellipsis;
    +}
    +.tag_td .tag{
    +  border:none;
    +  cursor: auto;
    +}
    +.filter_tag_body li span.close:hover{
    +  background: url(images/icon_tools.png) no-repeat -22px -19px;
    +}
    +.filter_tag_body li span.close{
    +  position: absolute;
    +  right: 5px;
    +  height:18px;
    +  width:18px;
    +  -webkit-border-radius:50%;
    +  -moz-border-radius:50%;
    +  border-radius:50%;
    +  background: url(images/icon_tools.png) no-repeat 2px -19px;
    +  text-align:center;
    +  top: 5px;
    +  color: white;
    +  cursor: pointer;
    +  display:none;
    +}
    +.tag:hover,.tag.sel,.tag.edit{
    +  background:#1FB8FF;
    +  color:white;
    +  text-shadow:0 1px 0 rgba(0,0,0,.21);
    +  -webkit-box-shadow:inset 0 2px 0 rgba(255,255,255,.29) ,inset 1px 1px 0 rgba(0,0,0,.2),inset -1px -1px 0 rgba(0,0,0,0.2);
    +  -moz-box-shadow:inset 0 2px 0 rgba(255,255,255,.29) ,inset 1px 1px 0 rgba(0,0,0,.2),inset -1px -1px 0 rgba(0,0,0,0.2);
    +  box-shadow:inset 0 2px 0 rgba(255,255,255,.29) ,inset 1px 1px 0 rgba(0,0,0,.2),inset -1px -1px 0 rgba(0,0,0,0.2);
    +  -moz-border-radius:6px;
    +  -webkit-border-radius:6px;
    +  border-radius:6px;
    +  border:none;
    +}
    +.tag.edit{
    +  padding-right:26px;
    +}
    +.filter_tag_body li.new_tag:hover{
    +  background:none;
    +  -webkit-box-shadow:none;
    +  -moz-box-shadow:none;
    +  box-shadow:none;
    +}
    +.tag.edit span.close{
    +  display: block;
    +
    +}
    +.filter_tag_body li.new_tag{
    +  display:inline-block;
    +  vertical-align: top;
    +  border:none;
    +  position: relative;
    +}
    +.mod-body .filter_tab_body{
    +  line-height:60px;
    +  padding-left:23px;
    +  border-bottom:1px solid #B4B4B4;
    +}
    +
    +.mod-body .mod-inner-header th{
    +  line-height:45px;
    +  font-size:15px;
    +  background:#EAEAEA;
    +  -moz-box-shadow:inset 0 1px 0 white,inset 0 -1px white;
    +  -webkit-box-shadow:inset 0 1px 0 white,inset 0 -1px white;
    +  box-shadow:inset 0 1px 0 white,inset 0 -1px white;
    +  padding-left:23px;
    +}
    +.mod-body.fb_list .mod-inner-header th{
    +  -moz-box-shadow:none;
    +  -webkit-box-shadow:none;
    +  box-shadow:none;
    +}
    +.mod-body .list_table {
    +  table-layout:fixed;
    +}
    +.mod-body .list_table tr:hover td{
    +  background:#D3F0F1;
    +  -moz-box-shadow:inset 0 1px 0 white,inset 0 -1px white;
    +  -webkit-box-shadow:inset 0 1px 0 white,inset 0 -1px white;
    +  box-shadow:inset 0 1px 0 white,inset 0 -1px white;
    +}
    +.mod-body .list_table tr:hover li.del_msg{
    +  display:block;
    +}
    +.mod-body .list_table td{
    +  border-top:1px solid #b4b4b4;
    +  padding:5px 0 5px 36px ;
    +  line-height:25px;
    +  font-size:14px;
    +  word-break:break-all;
    +  word-wrap:break-word;
    +}
    +.mod-body .list_table  tr td:nth-of-type(2){
    +  padding-left:24px;
    +}
    +.mod-body .list_table .reply_list li{
    +  line-height:2em;
    +}
    +.mod-body .list_table .reply{
    +  text-align:center;
    +}
    +.mod-body .list_table .reply textarea{
    +  width:90%;
    +  padding:5px;
    +  vertical-align: middle;
    +  -moz-border-radius:8px;
    +  -webkit-border-radius:8px;
    +  border-radius:8px;
    +  border:1px solid #b4b4b4;
    +}
    +.mod-body .list_table .reply button{
    +  vertical-align: middle;
    +}
    +.mod-body .list_table td .title{
    +  word-break:break-all;
    +  word-wrap:break-word;
    +}
    +.mod-body .list_table td .tags{
    +  position:relative;
    +  display: inline-block;
    +  width: 100%;
    +  height: 100%;
    +}
    +.mod-body .list_table td .tags_val{
    +  height: 100%;
    +  display: inline-block;
    +  vertical-align: middle;
    +  word-break:break-all;
    +  max-width: 90%;
    +  line-height:300%;
    +}
    +.mod-body .list_table td .hover_btns{
    +  position:absolute;
    +  right:10px;
    +  bottom:10px;
    +}
    +.mod-body .list_table td .hover_btns li{
    +  float:left;
    +  margin-left:10px;
    +}
    +.mod-body .list_table td .hover_btns li:hover{
    +  text-decoration:underline;
    +  color:#008386;
    +  cursor: pointer;
    +}
    +.mod-body .list_table td .time,.mod-body .list_table td .profile{
    +  font-size:12px;
    +  color:#888;
    +  display:inline-block;
    +  min-width:130px;
    +}
    +.mod-body .list_table td .time{
    +   /*width:150px;*/
    +   white-space: nowrap;
    +   font-style: italic;
    +}
    +.mod-body .list_table .tag_td .filterlist{
    +  min-width:120px;
    +}
    +.mod-body .list_table td .remark dd{
    +  word-break:break-all;
    +  word-wrap:break-word;
    +}
    +.icon_add{
    +  background:#E4E4E4;
    +  color:#7F7F7F;
    +  border:1px solid #B4B4B4;
    +  border-radius:2px;
    +  display:inline-block;
    +  width:15px;
    +  height:15px;
    +  text-align:center;
    +  cursor: pointer;
    +  line-height:100%;
    +  font-size:14px;
    +}
    +.icon_star{
    +  background:url(images/star.png) no-repeat 0 0;
    +  height:13px;
    +  width:13px;
    +  float:left;
    +  margin:20px 0 0 -25px;
    +  display: block;
    +  cursor: pointer;
    +}
    +.icon_star.grey{
    +  background-position: 0 -67px;
    +}
    +.icon_edit{
    +    background:url(images/icon_tools.png) no-repeat 0 2px;
    +    height:20px;
    +    width:20px;
    +    display:inline-block;
    +    vertical-align:3px;
    +    -webkit-margin-after: -8px;
    +    margin-left:5px;
    +}
    +.icon_edit:hover{
    +  background-position:-23px 2px;
    +}
    +.profile_icon{
    +  background:url(images/icon.png) no-repeat 0 -220px;
    +  height:20px;
    +  width:20px;
    +  display:inline-block;
    +  vertical-align: middle;
    +}
    +.profile_icon:hover{
    +  background-position:-24px -220px;
    +}
    +/*.render-table{
    +  position:relative;
    +  width:100%;
    +  overflow:hidden;
    +}
    +.render-table table{
    +  position:absolute;
    +}*/
    +.load-chart{
    +  height:300px;
    +  margin:0 auto;
    +}
    +.load-chart img{
    +	position: absolute;
    +	left: 50%;
    +	top: 50%;
    +	margin-left: -16px;
    +	margin-top: -16px;
    +}
    +.wait-load{
    +	text-indent:24px;
    +}
    +.wait-load img{
    +	position: absolute;
    +	left: 50%;
    +	top: 50%;
    +	margin-left: -16px;
    +	margin-top: -16px;
    +}
    +table.data-load{
    +	min-height:70px;
    +	min-height:0px\9;
    +}
    +table.data-load .colorGrad1{
    +  background:#49afb4;
    +}
    +table.data-load .colorGrad2{
    +  background:#5dcacf;
    +}
    +table.data-load .colorGrad3{
    +  background:#8ee6ea;
    +}
    +table.data-load .colorGrad4{
    +  background:#b6f2f3;
    +}
    +table.data-load th,dl.data-load dt{
    +  font-size:14px;
    +  color:#333333;
    +  overflow:hidden;
    +  background-color:#f5f5f5;
    +  height:36px;
    +  line-height:36px;
    +  text-indent:22px;
    +  border-right:1px solid #e8e8e8;
    +  border-left:1px solid #fff;
    +  border-bottom:1px solid #e8e8e8;
    +}
    +.small-table table.data-load th{
    +	font-size:12px;
    +	text-indent:0;
    +	text-align:center;
    +}
    +table.data-load th:first-child{
    +  border-left:0;
    +}
    +table.data-load th:last-child{
    +  border-right:0;
    +}
    +table.data-load td,dl.data-load dd{
    +  font-size:12px;
    +  color:#333333;
    +  height: 34px;
    +  line-height: 34px;
    +  padding:0 0 0 22px;
    +  border-right:1px solid #e8e8e8;
    +  border-left:1px solid #fff;
    +  border-bottom:1px solid #e8e8e8;
    +  word-break:break-all;
    +}
    +table.data-load .limit-height{
    +  height: 34px;
    +  line-height: 34px;
    +  overflow:hidden;
    +}
    +table.data-load td .mod-select{
    +  text-indent: 0px;
    +}
    +table.data-load td:first-child{
    +  border-left:0;
    +}
    +table.data-load td:last-child{
    +  border-right:0;
    +}
    +table.data-load tbody tr:hover{
    +  background-color:#d3f0f1;
    +}
    +.table-warning{
    +  margin-bottom:1px;
    +  border:1px solid #E5674A;
    +  background:#F5C2B7;
    +  color:#802626;
    +  font-size:14px;
    +  padding: 7px 20px;
    +  line-height:20px;
    +}
    +.table-info{
    +  margin-bottom:1px;
    +  border:1px solid #73d3d6;
    +  background:#c7edef;
    +  color:#333333;
    +  font-size:14px;
    +  padding: 7px 20px;
    +  line-height:20px;
    +}
    +.page-info-content{
    +	position:relative;
    +	height:0;
    +	z-index:199;
    +	text-align:center;
    +}
    +.page-info{
    +	height:30px;
    +	line-height:30px;
    +	font-size:14px;
    +	padding:0 18px;
    +	background:#73d3d6;
    +	filter:alpha(opacity=60);
    +	opacity:0.6;
    +	position:relative;
    +	display:inline-block;
    +	top:-7px;
    +	border-radius:8px;
    +	z-index:200;
    +	color:#000;
    +}
    +.tabpanel ul{
    +  display: inline-block;
    +  border:1px solid #B4B4B4;
    +  font-size:0;
    +}
    +.tabpanel li{
    +  height:28px;
    +  line-height:28px;
    +  font-size:13px;
    +  border-left: 1px solid #fff;
    +  display: inline-block;
    +  padding:0 14px;
    +  border-right: 1px solid #B4B4B4;
    +  cursor: pointer;
    +  background: url(images/backg2.png) 0 -120px repeat-x;
    +}
    +.tabpanel li.off{
    +  color: #666;
    +}
    +.tabpanel li:last-child{
    +  border-right:0;
    +  border-top-right-radius:6px;
    +  border-bottom-right-radius:6px;
    +}
    +.tabpanel li:first-child{
    +  border-left:0;
    +  border-top-left-radius:6px;
    +  border-bottom-left-radius:6px;
    +}
    +.tabpanel li.on{
    +  background:url(images/backg2.png) 0 1px repeat-x;
    +}
    +.tabpanel li a{
    +	display:block;
    +	color:#333;
    +}
    +/* left-nav begin*/
    +#siderNav ul.nav-items{
    +  border: 1px solid #b4b4b4;
    +  border-radius: 8px;
    +}
    +#siderNav .nav-item{
    +  background-color: #eaeaea;
    +  border-top: 1px solid #fff;
    +  border-bottom: 1px solid #c9c9c9;
    +}
    +#siderNav li.item-top{
    +  border-top-left-radius: 8px;
    +  border-top-right-radius: 8px;
    +  border-bottom: 1px solid #b4b4b4;
    +  zoom: 1;
    +}
    +#siderNav li.item-bottom{
    +  border-bottom: 0;
    +  border-bottom-left-radius: 8px;
    +  border-bottom-right-radius: 8px;
    +}
    +#siderNav li.item-bottom ul{
    +  border-bottom-left-radius: 8px;
    +  border-bottom-right-radius: 8px;
    +}
    +#siderNav .nav-item span{
    +  display: block;
    +  height: 47px;
    +  line-height: 47px;
    +}
    +#siderNav .nav-item span a{
    +  font-size: 16px;
    +  color: #555555;
    +  height:47px;
    +  line-height:47px;
    +  display:block;
    +  padding-left:23px;
    +  vertical-align: middle;
    +}
    +#siderNav .nav-item span a img.icon-new{
    +  position:relative;
    +  top:-3px;
    +  left:4px;
    +}
    +#siderNav .nav-item span a.icons{
    +  height:24px;
    +  line-height:24px;
    +  width:24px;
    +  margin-right:2px;
    +}
    +#siderNav .nav-item span b.item-1{
    +  background:url(images/icon.png) no-repeat 0 -98px;
    +}
    +#siderNav .nav-item span b.item-2{
    +  background:url(images/icon.png) no-repeat -1px -266px;
    +}
    +#siderNav .nav-item span b.item-3{
    +  background:url(images/icon.png) no-repeat -1px -216px;
    +}
    +#siderNav .nav-item span b.item-4{
    +  background:url(images/icon.png) no-repeat -1px -386px;
    +}
    +#siderNav .nav-item span b.item-5{
    +  background:url(images/icon.png) no-repeat -1px -241px;
    +}
    +#siderNav .nav-item span b.item-6{
    +  background:url(images/icon.png) no-repeat -1px -362px;
    +}
    +#siderNav .nav-item span b.item-7{
    +  background:url(images/icon.png) no-repeat -1px -601px;
    +}
    +#siderNav .nav-item span b.item-8{
    +  background:url(images/icon.png) no-repeat -1px -146px;
    +}
    +#siderNav .nav-item span b.item-9{
    +  background:url(images/icon.png) no-repeat -1px -410px;
    +}
    +#siderNav .nav-item span b.item-10{
    +  background:url(images/iconEx.png) no-repeat 0px -145px;
    +}
    +#siderNav .nav-item span b.item-11{
    +  background:url(images/icon.png) no-repeat -1px -433px;
    +}
    +#siderNav .nav-item span b.item-12{
    +  background:url(images/icon.png) no-repeat -1px -458px;
    +}
    +#siderNav .nav-item span b.item-13{
    +  background:url(images/iconEx.png) no-repeat 0px -49px;
    +}
    +#siderNav .nav-item span b.item-14{
    +  background:url(images/iconEx.png) no-repeat 0px -73px;
    +}
    +#siderNav .nav-item span b.item-15{
    +  background:url(images/iconEx.png) no-repeat 0px -97px;
    +}
    +#siderNav .nav-item span b.item-16{
    +  background:url(images/iconEx.png) no-repeat 0px -121px;
    +}
    +#siderNav .nav-item span b.item-17{
    +  background:url(images/icon.png) no-repeat 0px -506px;
    +}
    +#siderNav .nav-item span b.item-18{
    +  background:url(images/iconEx.png) no-repeat 0px -2px;
    +}
    +#siderNav .nav-item span b.item-19{
    +  background:url(images/iconEx.png) no-repeat 0px -26px;
    +}
    +#siderNav .nav-item span b.item-20{
    +  background:url(images/aliyun.png) no-repeat;
    +}
    +#siderNav .nav-item span b.item-21{
    +  background:url(images/iconEx.png) no-repeat -1px -241px;
    +}
    +#siderNav .nav-items .current-item span b.item-1{
    +  background:url(images/icon.png) no-repeat -24px -98px;
    +}
    +#siderNav .nav-items .current-item span b.item-2{
    +  background:url(images/icon.png) no-repeat -25px -266px;
    +}
    +#siderNav .nav-items .current-item span b.item-3{
    +  background:url(images/icon.png) no-repeat -25px -216px;
    +}
    +#siderNav .nav-items .current-item span b.item-4{
    +  background:url(images/icon.png) no-repeat -25px -386px;
    +}
    +#siderNav .nav-items .current-item span b.item-5{
    +  background:url(images/icon.png) no-repeat -25px -241px;
    +}
    +#siderNav .nav-items .current-item span b.item-6{
    +  background:url(images/icon.png) no-repeat -25px -362px;
    +}
    +#siderNav .nav-items .current-item span b.item-7{
    +  background:url(images/icon.png) no-repeat -25px -601px;
    +}
    +#siderNav .nav-items .current-item span b.item-8{
    +  background:url(images/icon.png) no-repeat -25px -146px;
    +}
    +#siderNav .current-item span b.item-9{
    +  background:url(images/icon.png) no-repeat -25px -410px;
    +}
    +#siderNav .current-item span b.item-10{
    +  background:url(images/iconEx.png) no-repeat -24px -145px;
    +}
    +#siderNav .current-item span b.item-11{
    +  background:url(images/icon.png) no-repeat -25px -433px;
    +}
    +#siderNav .current-item span b.item-12{
    +  background:url(images/icon.png) no-repeat -25px -458px;
    +}
    +#siderNav .current-item span b.item-13{
    +  background:url(images/iconEx.png) no-repeat -24px -49px;
    +}
    +#siderNav .current-item span b.item-14{
    +  background:url(images/iconEx.png) no-repeat -24px -73px;
    +}
    +#siderNav .current-item span b.item-15{
    +  background:url(images/iconEx.png) no-repeat -24px -97px;
    +}
    +#siderNav .current-item span b.item-16{
    +  background:url(images/iconEx.png) no-repeat -24px -121px;
    +}
    +#siderNav .current-item span b.item-17{
    +  background:url(images/icon.png) no-repeat -25px -506px;
    +}
    +#siderNav .current-item span b.item-18{
    +  background:url(images/iconEx.png) no-repeat -24px -1px;
    +}
    +#siderNav .current-item span b.item-19{
    +  background:url(images/iconEx.png) no-repeat -24px -26px;
    +}
    +#siderNav .current-item span b.item-20{
    +  background:url(images/aliyun-hl.png) no-repeat;
    +}
    +.sider-game #siderNav .nav-item span b.item-1{
    +  background:url(images/icon-game.png) no-repeat 0px 0px;
    +}
    +.sider-game #siderNav .nav-item span b.item-2{
    +  background:url(images/icon-game.png) no-repeat 0px -24px;
    +}
    +.sider-game #siderNav .nav-item span b.item-3{
    +  background:url(images/icon-game.png) no-repeat 0px -48px;
    +}
    +.sider-game #siderNav .nav-item span b.item-4{
    +  background:url(images/icon-game.png) no-repeat 0px -72px;
    +}
    +.sider-game #siderNav .current-item span b.item-1{
    +  background:url(images/icon-game.png) no-repeat -24px 0px;
    +}
    +.sider-game #siderNav .current-item span b.item-2{
    +  background:url(images/icon-game.png) no-repeat -24px -24px;
    +}
    +.sider-game #siderNav .current-item span b.item-3{
    +  background:url(images/icon-game.png) no-repeat -24px -48px;
    +}
    +.sider-game #siderNav .current-item span b.item-4{
    +  background:url(images/icon-game.png) no-repeat -24px -72px;
    +}
    +ul.sub-list{
    +  border-top: 1px solid #b4b4b4;
    +  background-color:#fff;
    +  display:none;
    +}
    +#siderNav .nav-items .on .sub-list{
    +  display:block;
    +}
    +ul.sub-list li{
    +  height:40px;
    +  line-height:40px;
    +}
    +#siderNav .nav-items ul.sub-list a{
    +  font-size: 13px;
    +  color: #444444;
    +  display:block;
    +  padding: 0 0 0 48px;
    +}
    +#siderNav .nav-items ul.sub-list a img.icon-new{
    +  position: relative;
    +  left: 4px;
    +  top: -2px;
    +}
    +#siderNav .nav-items .sub-list .current-item,#siderNav .nav-items .current-item span a{
    +  color: #008386;
    +
    +}
    +#siderDownLoad{
    +  margin-top:33px;
    +}
    +#siderDownLoad .sdkdown{
    +  margin-bottom: 13px;
    +
    +  /*-moz-box-shadow: 0px -1px 1px #8986A9;
    +  -webkit-box-shadow: 0px -1px 1px #8986A9;
    +  box-shadow: 0px -1px 1px #8986A9;
    +  border-top: 1px solid #C8C6E3;*/
    +  -moz-border-radius:8px;
    +  -webkit-border-radius:8px;
    +  border-radius: 8px;
    +}
    +#siderDownLoad .sdkdown a{
    +  font-size:13px;
    +  color:#fff;
    +  display:inline-block;
    +  border:1px solid #8986a9;
    +  -moz-border-radius:8px;
    +  -webkit-border-radius:8px;
    +  border-radius: 8px;
    +  background: #8C87BB;
    +  padding: 15px 0px 14px 0px;
    +  width: 195px;
    +  text-align:center;
    +  box-shadow:inset 0px 1px 1px #c8c6e3;
    +}
    +#siderDownLoad .updatetime{
    +  text-align:center;
    +  font-size: 12px;
    +  color:#666666;
    +}
    +/* left-nav end*/
    +/*particle*/
    +.particle{
    +  display:inline-block;
    +  zoom:1;
    +  height:30px;
    +  line-height:30px;
    +}
    +.particle li{
    +  padding:0 3px;
    +  margin-right:22px;
    +  cursor:pointer;
    +  display:inline-block;
    +  zoom:1;
    +}
    +.particle li.on{
    +  background:url(images/backg.png) repeat-x 0 -256px;
    +}
    +.particle li.off{
    +	color:#999;
    +	cursor:default;
    +}
    +/*operations-panel*/
    +.operations{
    +  margin-bottom:15px;
    +  height: 30px;
    +}
    +.radius {
    +border-top-left-radius: 8px;
    +border-top-right-radius: 8px;
    +}
    +.borders {
    +height: 28px;
    +line-height: 28px;
    +-moz-border-radius: 8px;
    +-webkit-border-radius: 8px;
    +border-radius: 8px;
    +}
    +.contrastpanel {
    +height: 30px;
    +line-height: 30px;
    +text-align: right;
    +position: relative;
    +}
    +.borders {
    +height: 28px;
    +line-height: 28px;
    +-moz-border-radius: 8px;
    +-webkit-border-radius: 8px;
    +border-radius: 8px;
    +}
    +.constr {
    +display: inline-block;
    +font-size: 14px;
    +color: #333;
    +padding: 0 14px;
    +background: url(/images/bgs/backg2.png) repeat-x 0 -120px;
    +border: 1px solid #b4b4b4;
    +}
    +
    +
    +
    +
    +input[type="text"].Wdate {
    +	/* height: 15px; */
    +	padding: 5px;
    +}
    +input[type="text"] {
    +	border: 1px solid #54A5D5;
    +}
    +.mod1 .mod-header {
    +	height: 30px;
    +	line-height: 30px;
    +	padding: 0 23px;
    +	border: 1px solid #b4b4b4;
    +	background: rgb(236, 242, 255);
    +}
    +.export {
    +	margin-top: 2px;
    +}
    +
    +body{padding: 0px 10px;}
    +
    +table.data-load .title{background: #1c3a70; color: white; line-height: 22px;}
    +
    +.operations{padding: 10px; margin-bottom: 0px; height: auto;}
    +.bd3 .contentCol {margin-left: 100px;}
    +.Wdate{width: 90px; padding-left: 5px;}
    +
    diff --git a/src/main/webapp/plug-in/graphreport/css/report.css b/src/main/webapp/plug-in/graphreport/css/report.css
    new file mode 100644
    index 00000000..b28a6bf0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/graphreport/css/report.css
    @@ -0,0 +1,1317 @@
    +/*author linan@umeng.com*/
    +/*reset*/
    +html{color:#000;background:#fff;height:100%;}
    +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;outline:0;}
    +body{font-family:helvetica,"Microsoft Yahei",sans-serif;font-weight:normal;font-size:12px;line-height:20px;color:#333;height:100%;position:relative;}
    +table{border-collapse:collapse;border-spacing:0;}
    +fieldset,img{border:0;}
    +address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}
    +li{list-style:none;}
    +caption,th{text-align:left;}
    +h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}
    +q:before,q:after{content:'';}
    +abbr,acronym{border:0;font-variant:normal;}
    +sup{vertical-align:text-top;}
    +sub{vertical-align:text-bottom;}
    +input,textarea,select,button{font-family:inherit;font-size:inherit;font-weight:inherit;outline:none;}
    +input,textarea,select{*font-size:100%;resize:none;}
    +legend{color:#000;}
    +b{font-weight:normal;}
    +a{text-decoration:none;color:#2a5295;cursor:pointer;}
    +a.normal{font-size:12px;color:#333;text-decoration:underline;}
    +a:active,a:focus,a:link {outline: none;}
    +/*clear float*/
    +.clear{clear:both;display:block;overflow:hidden;visibility:hidden;width:0;height:0;}
    +.clearfix:after{clear:both;content:' ';display:block;font-size:0;line-height:0;visibility:hidden;height:0;overflow: hidden;}
    +.clearfix{*zoom:1;}
    +.mr10{margin-right:10px;}
    +.ml10{margin-left:10px;}
    +.ell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
    +/*gird*/
    +/*mod*/
    +
    +/*author linan@umeng.com*/
    +#doc{
    +	min-width: 1200px;
    +	position:relative;
    +	min-height:100%;
    +}
    +.hd .userHeader{
    +	height:50px;
    +	line-height:50px;
    +	padding-right:35px;
    +	border-bottom:1px solid #fff;
    +	background:url(images/backg.png) repeat-x 0 0;
    +	font-size:13px;
    +	color:#bebebe;
    +}
    +.hd .userHeader .logo{
    +  height:50px;
    +  float:left;
    +}
    +.hd .globalNav{
    +	height:60px;
    +	line-height:60px;
    +	background:url(images/backg.png) repeat-x 0 -61px;
    +}
    +#doc .bd{
    +	margin:0 12px;
    +  padding:15px 0 20px 228px;
    +  overflow-x:hidden;
    +}
    +#doc .ft{
    +	height:105px;
    +	background:url(images/backg.png) repeat-x 0 -748px;
    +	color:#999;
    +	text-align:center;
    +	position:absolute;
    +	bottom:0;
    +	width:100%;
    +}
    +#doc .hiddenft{
    +	height:105px;
    +}
    +#doc .ft a{
    +	color:#999;
    +}
    +#doc .ft .copyright{
    +	padding:27px 0;
    +	line-height:20px;
    +}
    +#doc .ft .copyright .copy{
    +	margin-top:10px;
    +}
    +.bd #leftColContainer{
    +	float:left;
    +	display:inline;
    +	margin-left:-228px;
    +  padding-bottom:50px;
    +}
    +.bd .leftCol{
    +	width:198px;
    +}
    +.bd #mainContainer{
    +	float:left;
    +  width:100%;
    +}
    +.bd2{
    +	padding:0 12px;
    +}
    +.bd2 .leftCol{
    +	float:left;
    +	display:inline;
    +	width:198px;
    +}
    +.bd2 .contentCol{
    +	margin-left:228px;
    +	text-align:center;
    +	overflow: visible;
    +	padding-bottom:0px;
    +}
    +.bd3 .leftCol{
    +	float:left;
    +    height:30px;
    +	display:inline;
    +	width:400px;
    +}
    +.bd3 .contentCol{
    +	margin-left:430px;
    +	text-align:right;
    +	overflow: visible;
    +	padding-bottom:0px;
    +}
    +.bd4 .leftCol{
    +	float:left;
    +    height:30px;
    +	display:inline;
    +	width:400px;
    +}
    +.bd4 .contentCol{
    +	margin-left:430px;
    +	text-align:right;
    +	overflow: visible;
    +	padding-bottom:0px;
    +}
    +
    +
    +label.error {
    +color: #ff0400;
    +}
    +/*icon*/
    +.icon{
    +  background:url(images/icon.png) no-repeat 0 0 transparent;
    +  display:inline-block;
    +  height:24px;
    +  overflow:hidden;
    +  vertical-align:middle;
    +  width:24px;
    +  *zoom:1;
    +  line-height:24px;
    +  text-indent:-9999px;
    +}
    +.icon2{
    +  background:url(images/iconEx.png) no-repeat 0 0 transparent;
    +  display:inline-block;
    +  height:24px;
    +  overflow:hidden;
    +  vertical-align:middle;
    +  width:24px;
    +  *zoom:1;
    +  line-height:24px;
    +  text-indent:-9999px;
    +}
    +.no_action{
    +  cursor:not-allowed!important;
    +}
    +.export{
    +  background-position:0 -72px;
    +  cursor:pointer;
    +}
    +.icon-lt{
    +	background-position:0 -1009px;
    +}
    +.icon-close{
    +	background-position:0 -793px;
    +}
    +.font-weight{
    +	font-weight:bold;
    +}
    +.icon-staroff{
    +	background-position:0 -818px;
    +}
    +.icon-staron,.icon-top{
    +	background-position:-24px -818px;
    +}
    +.icon-delete{
    +	background-position:0 -745px;
    +}
    +.icon-delete:hover{
    +	background-position:-24px -745px;
    +}
    +.icon-edit{
    +	background-position: 0 -697px;
    +}
    +.icon-edit:hover{
    +	background-position: -24px -697px;
    +}
    +.icon-add{
    +	background-position: 0 -1057px;
    +}
    +.icon-add:hover{
    +	background-position: -24px -1057px;
    +}
    +.tip-helper{
    +  background-position: 0 -217px;
    +}
    +.tip-helper-on{
    +  background-position: -24px -217px;
    +}
    +.export-icon-load{
    +	background:url(/images/pic/load-s.gif) no-repeat 0 0;
    +}
    +.icon-setting{
    +  background-position: 0 -1176px;
    +}
    +.icon-setting:hover{
    +  background-position: -24px -1176px;
    +}
    +.globalNav .linkpanel a .back-old-ver{
    +	background-position: 0px -194px;
    +}
    +.globalNav .linkpanel a:hover .back-old-ver{
    +	background-position:-24px -194px;
    +}
    +.icon-calendar .icon{
    +  background-position:0px -1250px;
    +}
    +.icon-calendar:hover .icon{
    +  background-position:-24px -1250px;
    +}
    +.globalNav .linkpanel{
    +  position:absolute;
    +  right:0;
    +}
    +.globalNav .linkpanel a{
    +  color:#333;
    +  font-size:12px;
    +  text-decoration: underline;
    +  margin-right:15px;
    +}
    +.globalNav .linkpanel a .au{
    +	background-position: 0px -168px;
    +}
    +.globalNav .linkpanel a:hover .au{
    +	background-position:-24px -168px;
    +}
    +
    +.feedback_help {
    +  display: block;
    +  position: fixed;
    +  right: 0;
    +  top:40%;
    +  z-index:300;
    +  font-size: 12px;
    +  padding:0;
    +  line-height: 44px;
    +}
    +.feedback_help .relative{
    +  position: relative;
    +}
    +.feedback_help .relative div{
    +  position: absolute;
    +}
    +.feedback_help .feed, .feedback_help .dev{
    +  line-height: 44px;
    +  width: 60px;
    +  border-radius: 4px;
    +  vertical-align: middle;
    +  background: #565656;
    +  border: 1px solid #393939;
    +}
    +.feedback_help .cssline{
    +  border-top: 1px solid #393939;
    +  border-bottom: 1px solid #838383;
    +  border-radius: 0;
    +  height: 0px;
    +  width: 62px;
    +  right: -37px;
    +  top: 44px;
    +  z-index: 302;
    +  text-indent: -9999px;
    +}
    +.feedback_help div.feed{
    +  border-bottom: 0;
    +  border-radius: 4px 0 0 0;
    +  top: 0px;
    +  right: -37px;
    +}
    +.feedback_help div.dev{
    +  border-top: 0;
    +  border-radius: 0 0 0 4px;
    +  top: 46px;
    +  right: -37px;
    +}
    +.feedback_help a{
    +  padding: 0 10px 0 0;
    +  color: #cccccc;
    +  display: block;
    +}
    +.icon-feedback{
    +  background: url(images/feedbackicon.png) 2px -1px;
    +}
    +.icon-help{
    +  background: url(images/feedbackicon.png) 2px 24px;
    +}
    +.feedback_help a:hover .icon-feedback{
    +  background: url(images/feedbackicon.png) -22px -1px;
    +}
    +.feedback_help a:hover .icon-help{
    +  background: url(images/feedbackicon.png) -22px 24px;
    +}
    +a.feed_back_all {
    +  display: block;
    +  position: fixed;
    +  right: 0;
    +  top: 40%;
    +  width: 29px;
    +  height: 72px;
    +  line-height: 72px;
    +  z-index: 300;
    +  font-size: 12px;
    +  color: white;
    +  text-align: center;
    +  padding: 10px 0;
    +  background: url(images/bg-feedback.png) no-repeat 0 0;
    +  color: white;
    +  text-indent: -9999px;
    +}
    +/*logo*/
    +.logo a{
    +  display: inline-block;
    +  line-height: 50px;
    +  height: 50px;
    +  margin:0 0 0 39px;
    +}
    +/*float*/
    +.fl{
    +  float:left;
    +  display:inline;
    +}
    +.fr{
    +  float:right;
    +  display:inline;
    +}
    +.small{
    +	font-size:10px;
    +}
    +.bold{
    +  font-weight:bold;
    +}
    +.hidden{display:none;}
    +/*column*/
    +.fix-column{
    +  width:100%;
    +  overflow:hidden;
    +}
    +.fix-column .col{
    +  display:inline;
    +  float:left;
    +}
    +.fix-column .col:last-child{
    +  margin-right:0;
    +}
    +.column-bg{
    +  background: url(images/backg.png) 0 -418px repeat-x;
    +}
    +.pos{
    +  text-align:center;
    +  border-right:1px solid #d6d6d6;
    +  padding:25px 0 53px;
    +}
    +.nopos{
    +  border-right:0;
    +}
    +.skimtitle{
    +  font-size:14px;
    +  color:#333333;
    +  margin-bottom:28px;
    +}
    +.skimnum{
    +  font-size:28px;
    +  color:#01a7ad;
    +}
    +/*topNav*/
    +.topNav{
    +  height:60px;
    +}
    +.navItem{
    +  display:inline-block;
    +  *display:inline;
    +  zoom:1;
    +  margin-right:60px;
    +  vertical-align: middle;
    +  overflow:hidden;
    +}
    +.navItem .icons1{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat 0 0;
    +}
    +.navItem .icons2{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat 0 -24px;
    +}
    +.navItem .icons3{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat 0 -48px;
    +}
    +.navItem .icons4{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat 0 -1080px;
    +}
    +div.currentItem .icons1{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat -24px 0;
    +}
    +div.currentItem .icons2{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat -24px -24px;
    +}
    +div.currentItem .icons3{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat -24px -48px;
    +}
    +div.currentItem .icons4{
    +  margin:0 auto;
    +  background:url(images/icon.png) no-repeat -24px -1080px;
    +}
    +.navItem span{
    +  line-height:16px;
    +  font-size:16px;
    +  color:#333333;
    +  display:block;
    +  zoom:1;
    +}
    +.navItem .bot{
    +  margin-top: 4px;
    +  height: 5px;
    +}
    +.currentItem .bot{
    +  background: #01A7AD;
    +}
    +/*topNav*/
    +
    +/*wrap*/
    +.wrap-table{
    +}
    +.nav-wrap-table{
    +  float:left;
    +  width:100%;
    +  margin-right:15px;
    +}
    +.wrap-move{
    +  position:relative;
    +}
    +/*mod*/
    +.mod{
    +	position:relative;
    +}
    +.mod1{
    +  margin-bottom:15px;
    +}
    +.mod2{
    +  margin-bottom:10px;
    +}
    +.mod3{
    +  margin-top:10px;
    +}
    +.mod4 .mod-header{
    +  border-top:0;
    +}
    +.mod1 .mod-header{
    +  height:43px;
    +  line-height:43px;
    +  padding:0 23px;
    +  background: url(images/backg.png) 0 -297px repeat-x;
    +  border:1px solid #b4b4b4;
    +}
    +.mod1 .mod-header .back{
    +  float:left;
    +}
    +.mod1 .mod-header h2{
    +  font-size:15px;
    +  color:#333;
    +}
    +.mod .mod-header{
    +  text-align:right;
    +}
    +.mod .mod-header h2{
    +  float:left;
    +}
    +.mod .mod-header .option{
    +}
    +.mod .mod-body{
    +  border:1px solid #b4b4b4;
    +  border-top:0px none;
    +  position:relative;
    +  padding-bottom: 1px;
    +}
    +.mod .mod-body .content{
    +  padding:15px 23px;
    +}
    +.mod-body .filter_tag_body{
    +  line-height:45px;
    +  padding:0 80px 0 18px;
    +  border-bottom:1px solid #B4B4B4;
    +}
    +.margin-l-1{
    +  margin-left:10px;
    +}
    +.filter_tag_body .edit_tags{
    +  position: absolute;
    +  right: 15px;
    +  top:9px;
    +}
    +.filter_tag_body ul{
    +  display: inline-block;
    +  padding-top:10px;
    +  -webkit-margin-before:-10px;
    +}
    +.colorPannel{
    +  position:absolute;
    +  background:white;
    +  -moz-border-radius:8px;
    +  -webkit-border-radius:8px;
    +  border-radius:8px;
    +  -moz-box-shadow:0 0 3px rgba(0,0,0,.3);
    +  -webkit-box-shadow:0 0 3px rgba(0,0,0,.3);
    +  box-shadow:0 0 3px rgba(0,0,0,.3);
    +  text-align:center;
    +  line-height:200%;
    +  padding-top:5px;
    +}
    +.colorPannel .colorList i,.cus_cr_preview{
    +  display: inline-block;
    +  vertical-align: middle;
    +  height:15px;
    +  width:20px;
    +  -moz-border-radius:2px;
    +  -webkit-border-radius:2px;
    +  border-radius:2px;
    +}
    +.cus_cr_preview{
    +  margin-left:10px;
    +  background:#fff;
    +}
    +.colorPannel .colorList i.sel,.colorPannel .colorList i:hover,.cus_cr_preview{
    +  -webkit-box-shadow:0 0 2px rgba(0,0,0,.4), inset 1px 1px 0 rgba(0,0,0,.2),inset -1px -1px 0 rgba(0,0,0,.2);
    +  -moz-box-shadow:0 0 2px rgba(0,0,0,.4), inset 1px 1px 0 rgba(0,0,0,.2),inset -1px -1px 0 rgba(0,0,0,.2);
    +  box-shadow:0 0 2px rgba(0,0,0,.4), inset 1px 1px 0 rgba(0,0,0,.2),inset -1px -1px 0 rgba(0,0,0,.2);
    +  border:1px solid grey\9;
    +}
    +.c1{
    +  background:#18c2c6;
    +}
    +.c2{
    +  background:#1fb8ff;
    +}
    +.c3{
    +  background:#439e16;
    +}
    +.c4{
    +  background:#c91d1d;
    +}
    +.c5{
    +  background:#ef8032;
    +}
    +.c6{
    +  background:#ab497f;
    +}
    +.colorPannel .new_tag_sure{
    +  margin:5px;
    +}
    +.tag{
    +  font-size:12px;
    +  padding:6px 11px;
    +  display:inline-block;
    +  box-sizing:border-box;
    +  -moz-box-sizing:border-box;
    +  font-style:normal;
    +  margin:0 5px;
    +  line-height:18px;
    +  position:relative;
    +  cursor: pointer;
    +  background-size:100% 3px;
    +  background-position:0 15px;
    +  border-bottom:3px solid silver;
    +  max-width: 300px;
    +  overflow: hidden;
    +  text-overflow: ellipsis;
    +}
    +.tag_td .tag{
    +  border:none;
    +  cursor: auto;
    +}
    +.filter_tag_body li span.close:hover{
    +  background: url(images/icon_tools.png) no-repeat -22px -19px;
    +}
    +.filter_tag_body li span.close{
    +  position: absolute;
    +  right: 5px;
    +  height:18px;
    +  width:18px;
    +  -webkit-border-radius:50%;
    +  -moz-border-radius:50%;
    +  border-radius:50%;
    +  background: url(images/icon_tools.png) no-repeat 2px -19px;
    +  text-align:center;
    +  top: 5px;
    +  color: white;
    +  cursor: pointer;
    +  display:none;
    +}
    +.tag:hover,.tag.sel,.tag.edit{
    +  background:#1FB8FF;
    +  color:white;
    +  text-shadow:0 1px 0 rgba(0,0,0,.21);
    +  -webkit-box-shadow:inset 0 2px 0 rgba(255,255,255,.29) ,inset 1px 1px 0 rgba(0,0,0,.2),inset -1px -1px 0 rgba(0,0,0,0.2);
    +  -moz-box-shadow:inset 0 2px 0 rgba(255,255,255,.29) ,inset 1px 1px 0 rgba(0,0,0,.2),inset -1px -1px 0 rgba(0,0,0,0.2);
    +  box-shadow:inset 0 2px 0 rgba(255,255,255,.29) ,inset 1px 1px 0 rgba(0,0,0,.2),inset -1px -1px 0 rgba(0,0,0,0.2);
    +  -moz-border-radius:6px;
    +  -webkit-border-radius:6px;
    +  border-radius:6px;
    +  border:none;
    +}
    +.tag.edit{
    +  padding-right:26px;
    +}
    +.filter_tag_body li.new_tag:hover{
    +  background:none;
    +  -webkit-box-shadow:none;
    +  -moz-box-shadow:none;
    +  box-shadow:none;
    +}
    +.tag.edit span.close{
    +  display: block;
    +
    +}
    +.filter_tag_body li.new_tag{
    +  display:inline-block;
    +  vertical-align: top;
    +  border:none;
    +  position: relative;
    +}
    +.mod-body .filter_tab_body{
    +  line-height:60px;
    +  padding-left:23px;
    +  border-bottom:1px solid #B4B4B4;
    +}
    +
    +.mod-body .mod-inner-header th{
    +  line-height:45px;
    +  font-size:15px;
    +  background:#EAEAEA;
    +  -moz-box-shadow:inset 0 1px 0 white,inset 0 -1px white;
    +  -webkit-box-shadow:inset 0 1px 0 white,inset 0 -1px white;
    +  box-shadow:inset 0 1px 0 white,inset 0 -1px white;
    +  padding-left:23px;
    +}
    +.mod-body.fb_list .mod-inner-header th{
    +  -moz-box-shadow:none;
    +  -webkit-box-shadow:none;
    +  box-shadow:none;
    +}
    +.mod-body .list_table {
    +  table-layout:fixed;
    +}
    +.mod-body .list_table tr:hover td{
    +  background:#D3F0F1;
    +  -moz-box-shadow:inset 0 1px 0 white,inset 0 -1px white;
    +  -webkit-box-shadow:inset 0 1px 0 white,inset 0 -1px white;
    +  box-shadow:inset 0 1px 0 white,inset 0 -1px white;
    +}
    +.mod-body .list_table tr:hover li.del_msg{
    +  display:block;
    +}
    +.mod-body .list_table td{
    +  border-top:1px solid #b4b4b4;
    +  padding:5px 0 5px 36px ;
    +  line-height:25px;
    +  font-size:14px;
    +  word-break:break-all;
    +  word-wrap:break-word;
    +}
    +.mod-body .list_table  tr td:nth-of-type(2){
    +  padding-left:24px;
    +}
    +.mod-body .list_table .reply_list li{
    +  line-height:2em;
    +}
    +.mod-body .list_table .reply{
    +  text-align:center;
    +}
    +.mod-body .list_table .reply textarea{
    +  width:90%;
    +  padding:5px;
    +  vertical-align: middle;
    +  -moz-border-radius:8px;
    +  -webkit-border-radius:8px;
    +  border-radius:8px;
    +  border:1px solid #b4b4b4;
    +}
    +.mod-body .list_table .reply button{
    +  vertical-align: middle;
    +}
    +.mod-body .list_table td .title{
    +  word-break:break-all;
    +  word-wrap:break-word;
    +}
    +.mod-body .list_table td .tags{
    +  position:relative;
    +  display: inline-block;
    +  width: 100%;
    +  height: 100%;
    +}
    +.mod-body .list_table td .tags_val{
    +  height: 100%;
    +  display: inline-block;
    +  vertical-align: middle;
    +  word-break:break-all;
    +  max-width: 90%;
    +  line-height:300%;
    +}
    +.mod-body .list_table td .hover_btns{
    +  position:absolute;
    +  right:10px;
    +  bottom:10px;
    +}
    +.mod-body .list_table td .hover_btns li{
    +  float:left;
    +  margin-left:10px;
    +}
    +.mod-body .list_table td .hover_btns li:hover{
    +  text-decoration:underline;
    +  color:#008386;
    +  cursor: pointer;
    +}
    +.mod-body .list_table td .time,.mod-body .list_table td .profile{
    +  font-size:12px;
    +  color:#888;
    +  display:inline-block;
    +  min-width:130px;
    +}
    +.mod-body .list_table td .time{
    +   /*width:150px;*/
    +   white-space: nowrap;
    +   font-style: italic;
    +}
    +.mod-body .list_table .tag_td .filterlist{
    +  min-width:120px;
    +}
    +.mod-body .list_table td .remark dd{
    +  word-break:break-all;
    +  word-wrap:break-word;
    +}
    +.icon_add{
    +  background:#E4E4E4;
    +  color:#7F7F7F;
    +  border:1px solid #B4B4B4;
    +  border-radius:2px;
    +  display:inline-block;
    +  width:15px;
    +  height:15px;
    +  text-align:center;
    +  cursor: pointer;
    +  line-height:100%;
    +  font-size:14px;
    +}
    +.icon_star{
    +  background:url(images/star.png) no-repeat 0 0;
    +  height:13px;
    +  width:13px;
    +  float:left;
    +  margin:20px 0 0 -25px;
    +  display: block;
    +  cursor: pointer;
    +}
    +.icon_star.grey{
    +  background-position: 0 -67px;
    +}
    +.icon_edit{
    +    background:url(images/icon_tools.png) no-repeat 0 2px;
    +    height:20px;
    +    width:20px;
    +    display:inline-block;
    +    vertical-align:3px;
    +    -webkit-margin-after: -8px;
    +    margin-left:5px;
    +}
    +.icon_edit:hover{
    +  background-position:-23px 2px;
    +}
    +.profile_icon{
    +  background:url(images/icon.png) no-repeat 0 -220px;
    +  height:20px;
    +  width:20px;
    +  display:inline-block;
    +  vertical-align: middle;
    +}
    +.profile_icon:hover{
    +  background-position:-24px -220px;
    +}
    +/*.render-table{
    +  position:relative;
    +  width:100%;
    +  overflow:hidden;
    +}
    +.render-table table{
    +  position:absolute;
    +}*/
    +.load-chart{
    +  height:300px;
    +  margin:0 auto;
    +}
    +.load-chart img{
    +	position: absolute;
    +	left: 50%;
    +	top: 50%;
    +	margin-left: -16px;
    +	margin-top: -16px;
    +}
    +.wait-load{
    +	text-indent:24px;
    +}
    +.wait-load img{
    +	position: absolute;
    +	left: 50%;
    +	top: 50%;
    +	margin-left: -16px;
    +	margin-top: -16px;
    +}
    +table.data-load{
    +	min-height:70px;
    +	min-height:0px\9;
    +}
    +table.data-load .colorGrad1{
    +  background:#49afb4;
    +}
    +table.data-load .colorGrad2{
    +  background:#5dcacf;
    +}
    +table.data-load .colorGrad3{
    +  background:#8ee6ea;
    +}
    +table.data-load .colorGrad4{
    +  background:#b6f2f3;
    +}
    +table.data-load th,dl.data-load dt{
    +  font-size:14px;
    +  color:#333333;
    +  overflow:hidden;
    +  background-color:#f5f5f5;
    +  height:36px;
    +  line-height:36px;
    +  text-indent:22px;
    +  border-right:1px solid #e8e8e8;
    +  border-left:1px solid #fff;
    +  border-bottom:1px solid #e8e8e8;
    +}
    +.small-table table.data-load th{
    +	font-size:12px;
    +	text-indent:0;
    +	text-align:center;
    +}
    +table.data-load th:first-child{
    +  border-left:0;
    +}
    +table.data-load th:last-child{
    +  border-right:0;
    +}
    +table.data-load td,dl.data-load dd{
    +  font-size:12px;
    +  color:#333333;
    +  height: 34px;
    +  line-height: 34px;
    +  padding:0 0 0 22px;
    +  border-right:1px solid #e8e8e8;
    +  border-left:1px solid #fff;
    +  border-bottom:1px solid #e8e8e8;
    +  word-break:break-all;
    +}
    +table.data-load .limit-height{
    +  height: 34px;
    +  line-height: 34px;
    +  overflow:hidden;
    +}
    +table.data-load td .mod-select{
    +  text-indent: 0px;
    +}
    +table.data-load td:first-child{
    +  border-left:0;
    +}
    +table.data-load td:last-child{
    +  border-right:0;
    +}
    +table.data-load tbody tr:hover{
    +  background-color:#d3f0f1;
    +}
    +.table-warning{
    +  margin-bottom:1px;
    +  border:1px solid #E5674A;
    +  background:#F5C2B7;
    +  color:#802626;
    +  font-size:14px;
    +  padding: 7px 20px;
    +  line-height:20px;
    +}
    +.table-info{
    +  margin-bottom:1px;
    +  border:1px solid #73d3d6;
    +  background:#c7edef;
    +  color:#333333;
    +  font-size:14px;
    +  padding: 7px 20px;
    +  line-height:20px;
    +}
    +.page-info-content{
    +	position:relative;
    +	height:0;
    +	z-index:199;
    +	text-align:center;
    +}
    +.page-info{
    +	height:30px;
    +	line-height:30px;
    +	font-size:14px;
    +	padding:0 18px;
    +	background:#73d3d6;
    +	filter:alpha(opacity=60);
    +	opacity:0.6;
    +	position:relative;
    +	display:inline-block;
    +	top:-7px;
    +	border-radius:8px;
    +	z-index:200;
    +	color:#000;
    +}
    +.tabpanel ul{
    +  display: inline-block;
    +  border:1px solid #B4B4B4;
    +  font-size:0;
    +}
    +.tabpanel li{
    +  height:28px;
    +  line-height:28px;
    +  font-size:13px;
    +  border-left: 1px solid #fff;
    +  display: inline-block;
    +  padding:0 14px;
    +  border-right: 1px solid #B4B4B4;
    +  cursor: pointer;
    +  background: url(images/backg2.png) 0 -120px repeat-x;
    +}
    +.tabpanel li.off{
    +  color: #666;
    +}
    +.tabpanel li:last-child{
    +  border-right:0;
    +  border-top-right-radius:6px;
    +  border-bottom-right-radius:6px;
    +}
    +.tabpanel li:first-child{
    +  border-left:0;
    +  border-top-left-radius:6px;
    +  border-bottom-left-radius:6px;
    +}
    +.tabpanel li.on{
    +  background:url(images/backg2.png) 0 1px repeat-x;
    +}
    +.tabpanel li a{
    +	display:block;
    +	color:#333;
    +}
    +/* left-nav begin*/
    +#siderNav ul.nav-items{
    +  border: 1px solid #b4b4b4;
    +  border-radius: 8px;
    +}
    +#siderNav .nav-item{
    +  background-color: #eaeaea;
    +  border-top: 1px solid #fff;
    +  border-bottom: 1px solid #c9c9c9;
    +}
    +#siderNav li.item-top{
    +  border-top-left-radius: 8px;
    +  border-top-right-radius: 8px;
    +  border-bottom: 1px solid #b4b4b4;
    +  zoom: 1;
    +}
    +#siderNav li.item-bottom{
    +  border-bottom: 0;
    +  border-bottom-left-radius: 8px;
    +  border-bottom-right-radius: 8px;
    +}
    +#siderNav li.item-bottom ul{
    +  border-bottom-left-radius: 8px;
    +  border-bottom-right-radius: 8px;
    +}
    +#siderNav .nav-item span{
    +  display: block;
    +  height: 47px;
    +  line-height: 47px;
    +}
    +#siderNav .nav-item span a{
    +  font-size: 16px;
    +  color: #555555;
    +  height:47px;
    +  line-height:47px;
    +  display:block;
    +  padding-left:23px;
    +  vertical-align: middle;
    +}
    +#siderNav .nav-item span a img.icon-new{
    +  position:relative;
    +  top:-3px;
    +  left:4px;
    +}
    +#siderNav .nav-item span a.icons{
    +  height:24px;
    +  line-height:24px;
    +  width:24px;
    +  margin-right:2px;
    +}
    +#siderNav .nav-item span b.item-1{
    +  background:url(images/icon.png) no-repeat 0 -98px;
    +}
    +#siderNav .nav-item span b.item-2{
    +  background:url(images/icon.png) no-repeat -1px -266px;
    +}
    +#siderNav .nav-item span b.item-3{
    +  background:url(images/icon.png) no-repeat -1px -216px;
    +}
    +#siderNav .nav-item span b.item-4{
    +  background:url(images/icon.png) no-repeat -1px -386px;
    +}
    +#siderNav .nav-item span b.item-5{
    +  background:url(images/icon.png) no-repeat -1px -241px;
    +}
    +#siderNav .nav-item span b.item-6{
    +  background:url(images/icon.png) no-repeat -1px -362px;
    +}
    +#siderNav .nav-item span b.item-7{
    +  background:url(images/icon.png) no-repeat -1px -601px;
    +}
    +#siderNav .nav-item span b.item-8{
    +  background:url(images/icon.png) no-repeat -1px -146px;
    +}
    +#siderNav .nav-item span b.item-9{
    +  background:url(images/icon.png) no-repeat -1px -410px;
    +}
    +#siderNav .nav-item span b.item-10{
    +  background:url(images/iconEx.png) no-repeat 0px -145px;
    +}
    +#siderNav .nav-item span b.item-11{
    +  background:url(images/icon.png) no-repeat -1px -433px;
    +}
    +#siderNav .nav-item span b.item-12{
    +  background:url(images/icon.png) no-repeat -1px -458px;
    +}
    +#siderNav .nav-item span b.item-13{
    +  background:url(images/iconEx.png) no-repeat 0px -49px;
    +}
    +#siderNav .nav-item span b.item-14{
    +  background:url(images/iconEx.png) no-repeat 0px -73px;
    +}
    +#siderNav .nav-item span b.item-15{
    +  background:url(images/iconEx.png) no-repeat 0px -97px;
    +}
    +#siderNav .nav-item span b.item-16{
    +  background:url(images/iconEx.png) no-repeat 0px -121px;
    +}
    +#siderNav .nav-item span b.item-17{
    +  background:url(images/icon.png) no-repeat 0px -506px;
    +}
    +#siderNav .nav-item span b.item-18{
    +  background:url(images/iconEx.png) no-repeat 0px -2px;
    +}
    +#siderNav .nav-item span b.item-19{
    +  background:url(images/iconEx.png) no-repeat 0px -26px;
    +}
    +#siderNav .nav-item span b.item-20{
    +  background:url(images/aliyun.png) no-repeat;
    +}
    +#siderNav .nav-item span b.item-21{
    +  background:url(images/iconEx.png) no-repeat -1px -241px;
    +}
    +#siderNav .nav-items .current-item span b.item-1{
    +  background:url(images/icon.png) no-repeat -24px -98px;
    +}
    +#siderNav .nav-items .current-item span b.item-2{
    +  background:url(images/icon.png) no-repeat -25px -266px;
    +}
    +#siderNav .nav-items .current-item span b.item-3{
    +  background:url(images/icon.png) no-repeat -25px -216px;
    +}
    +#siderNav .nav-items .current-item span b.item-4{
    +  background:url(images/icon.png) no-repeat -25px -386px;
    +}
    +#siderNav .nav-items .current-item span b.item-5{
    +  background:url(images/icon.png) no-repeat -25px -241px;
    +}
    +#siderNav .nav-items .current-item span b.item-6{
    +  background:url(images/icon.png) no-repeat -25px -362px;
    +}
    +#siderNav .nav-items .current-item span b.item-7{
    +  background:url(images/icon.png) no-repeat -25px -601px;
    +}
    +#siderNav .nav-items .current-item span b.item-8{
    +  background:url(images/icon.png) no-repeat -25px -146px;
    +}
    +#siderNav .current-item span b.item-9{
    +  background:url(images/icon.png) no-repeat -25px -410px;
    +}
    +#siderNav .current-item span b.item-10{
    +  background:url(images/iconEx.png) no-repeat -24px -145px;
    +}
    +#siderNav .current-item span b.item-11{
    +  background:url(images/icon.png) no-repeat -25px -433px;
    +}
    +#siderNav .current-item span b.item-12{
    +  background:url(images/icon.png) no-repeat -25px -458px;
    +}
    +#siderNav .current-item span b.item-13{
    +  background:url(images/iconEx.png) no-repeat -24px -49px;
    +}
    +#siderNav .current-item span b.item-14{
    +  background:url(images/iconEx.png) no-repeat -24px -73px;
    +}
    +#siderNav .current-item span b.item-15{
    +  background:url(images/iconEx.png) no-repeat -24px -97px;
    +}
    +#siderNav .current-item span b.item-16{
    +  background:url(images/iconEx.png) no-repeat -24px -121px;
    +}
    +#siderNav .current-item span b.item-17{
    +  background:url(images/icon.png) no-repeat -25px -506px;
    +}
    +#siderNav .current-item span b.item-18{
    +  background:url(images/iconEx.png) no-repeat -24px -1px;
    +}
    +#siderNav .current-item span b.item-19{
    +  background:url(images/iconEx.png) no-repeat -24px -26px;
    +}
    +#siderNav .current-item span b.item-20{
    +  background:url(images/aliyun-hl.png) no-repeat;
    +}
    +.sider-game #siderNav .nav-item span b.item-1{
    +  background:url(images/icon-game.png) no-repeat 0px 0px;
    +}
    +.sider-game #siderNav .nav-item span b.item-2{
    +  background:url(images/icon-game.png) no-repeat 0px -24px;
    +}
    +.sider-game #siderNav .nav-item span b.item-3{
    +  background:url(images/icon-game.png) no-repeat 0px -48px;
    +}
    +.sider-game #siderNav .nav-item span b.item-4{
    +  background:url(images/icon-game.png) no-repeat 0px -72px;
    +}
    +.sider-game #siderNav .current-item span b.item-1{
    +  background:url(images/icon-game.png) no-repeat -24px 0px;
    +}
    +.sider-game #siderNav .current-item span b.item-2{
    +  background:url(images/icon-game.png) no-repeat -24px -24px;
    +}
    +.sider-game #siderNav .current-item span b.item-3{
    +  background:url(images/icon-game.png) no-repeat -24px -48px;
    +}
    +.sider-game #siderNav .current-item span b.item-4{
    +  background:url(images/icon-game.png) no-repeat -24px -72px;
    +}
    +ul.sub-list{
    +  border-top: 1px solid #b4b4b4;
    +  background-color:#fff;
    +  display:none;
    +}
    +#siderNav .nav-items .on .sub-list{
    +  display:block;
    +}
    +ul.sub-list li{
    +  height:40px;
    +  line-height:40px;
    +}
    +#siderNav .nav-items ul.sub-list a{
    +  font-size: 13px;
    +  color: #444444;
    +  display:block;
    +  padding: 0 0 0 48px;
    +}
    +#siderNav .nav-items ul.sub-list a img.icon-new{
    +  position: relative;
    +  left: 4px;
    +  top: -2px;
    +}
    +#siderNav .nav-items .sub-list .current-item,#siderNav .nav-items .current-item span a{
    +  color: #008386;
    +
    +}
    +#siderDownLoad{
    +  margin-top:33px;
    +}
    +#siderDownLoad .sdkdown{
    +  margin-bottom: 13px;
    +
    +  /*-moz-box-shadow: 0px -1px 1px #8986A9;
    +  -webkit-box-shadow: 0px -1px 1px #8986A9;
    +  box-shadow: 0px -1px 1px #8986A9;
    +  border-top: 1px solid #C8C6E3;*/
    +  -moz-border-radius:8px;
    +  -webkit-border-radius:8px;
    +  border-radius: 8px;
    +}
    +#siderDownLoad .sdkdown a{
    +  font-size:13px;
    +  color:#fff;
    +  display:inline-block;
    +  border:1px solid #8986a9;
    +  -moz-border-radius:8px;
    +  -webkit-border-radius:8px;
    +  border-radius: 8px;
    +  background: #8C87BB;
    +  padding: 15px 0px 14px 0px;
    +  width: 195px;
    +  text-align:center;
    +  box-shadow:inset 0px 1px 1px #c8c6e3;
    +}
    +#siderDownLoad .updatetime{
    +  text-align:center;
    +  font-size: 12px;
    +  color:#666666;
    +}
    +/* left-nav end*/
    +/*particle*/
    +.particle{
    +  display:inline-block;
    +  zoom:1;
    +  height:30px;
    +  line-height:30px;
    +}
    +.particle li{
    +  padding:0 3px;
    +  margin-right:22px;
    +  cursor:pointer;
    +  display:inline-block;
    +  zoom:1;
    +}
    +.particle li.on{
    +  background:url(images/backg.png) repeat-x 0 -256px;
    +}
    +.particle li.off{
    +	color:#999;
    +	cursor:default;
    +}
    +/*operations-panel*/
    +.operations{
    +  margin-bottom:15px;
    +  height: 30px;
    +}
    +.radius {
    +border-top-left-radius: 8px;
    +border-top-right-radius: 8px;
    +}
    +.borders {
    +height: 28px;
    +line-height: 28px;
    +-moz-border-radius: 8px;
    +-webkit-border-radius: 8px;
    +border-radius: 8px;
    +}
    +.contrastpanel {
    +height: 30px;
    +line-height: 30px;
    +text-align: right;
    +position: relative;
    +}
    +.borders {
    +height: 28px;
    +line-height: 28px;
    +-moz-border-radius: 8px;
    +-webkit-border-radius: 8px;
    +border-radius: 8px;
    +}
    +.constr {
    +display: inline-block;
    +font-size: 14px;
    +color: #333;
    +padding: 0 14px;
    +background: url(/images/bgs/backg2.png) repeat-x 0 -120px;
    +border: 1px solid #b4b4b4;
    +}
    +
    +
    +
    +
    +input[type="text"].Wdate {
    +	height: 15px;
    +	padding: 2px;
    +}
    +input[type="text"] {
    +	border: 1px solid #54A5D5;
    +}
    +.mod1 .mod-header {
    +	height: 30px;
    +	line-height: 30px;
    +	padding: 0 23px;
    +	border: 1px solid #b4b4b4;
    +	background: rgb(236, 242, 255);
    +}
    +.export {
    +	margin-top: 2px;
    +}
    +
    +body{padding: 0px 10px;}
    +
    +table.data-load .title{background: #1c3a70; color: white; line-height: 22px;}
    +
    +.operations{padding: 10px; margin-bottom: 0px; height: auto;}
    +.bd3 .contentCol {margin-left: 100px;}
    +.Wdate{width: 90px; padding-left: 5px;}
    +
    diff --git a/src/main/webapp/plug-in/graphreport/highcharts3.0.6.js b/src/main/webapp/plug-in/graphreport/highcharts3.0.6.js
    new file mode 100644
    index 00000000..f8edd5f3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/graphreport/highcharts3.0.6.js
    @@ -0,0 +1,283 @@
    +/*
    + Highcharts JS v3.0.6 (2013-10-04)
    +
    + (c) 2009-2013 Torstein H酶nsi
    +
    + License: www.highcharts.com/license
    +*/
    +(function(){function r(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function x(){var a,b=arguments.length,c={},d=function(a,b){var c,h;typeof a!=="object"&&(a={});for(h in b)b.hasOwnProperty(h)&&(c=b[h],a[h]=c&&typeof c==="object"&&Object.prototype.toString.call(c)!=="[object Array]"&&typeof c.nodeType!=="number"?d(a[h]||{},c):b[h]);return a};for(a=0;a<b;a++)c=d(c,arguments[a]);return c}function C(a,b){return parseInt(a,b||10)}function ea(a){return typeof a==="string"}function T(a){return typeof a===
    +"object"}function Ia(a){return Object.prototype.toString.call(a)==="[object Array]"}function sa(a){return typeof a==="number"}function na(a){return R.log(a)/R.LN10}function fa(a){return R.pow(10,a)}function ga(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}function u(a){return a!==w&&a!==null}function v(a,b,c){var d,e;if(ea(b))u(c)?a.setAttribute(b,c):a&&a.getAttribute&&(e=a.getAttribute(b));else if(u(b)&&T(b))for(d in b)a.setAttribute(d,b[d]);return e}function ja(a){return Ia(a)?
    +a:[a]}function o(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],typeof c!=="undefined"&&c!==null)return c}function K(a,b){if(ta&&b&&b.opacity!==w)b.filter="alpha(opacity="+b.opacity*100+")";r(a.style,b)}function U(a,b,c,d,e){a=y.createElement(a);b&&r(a,b);e&&K(a,{padding:0,border:S,margin:0});c&&K(a,c);d&&d.appendChild(a);return a}function ha(a,b){var c=function(){};c.prototype=new a;r(c.prototype,b);return c}function Aa(a,b,c,d){var e=M.lang,a=+a||0,f=b===-1?(a.toString().split(".")[1]||
    +"").length:isNaN(b=N(b))?2:b,b=c===void 0?e.decimalPoint:c,d=d===void 0?e.thousandsSep:d,e=a<0?"-":"",c=String(C(a=N(a).toFixed(f))),g=c.length>3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+N(a-c).toFixed(f).slice(2):"")}function Ba(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function mb(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this,a)}}function Ca(a,b){for(var c="{",d=!1,
    +e,f,g,h,i,j=[];(c=a.indexOf(c))!==-1;){e=a.slice(0,c);if(d){f=e.split(":");g=f.shift().split(".");i=g.length;e=b;for(h=0;h<i;h++)e=e[g[h]];if(f.length)f=f.join(":"),g=/\.([0-9])/,h=M.lang,i=void 0,/f$/.test(f)?(i=(i=f.match(g))?i[1]:-1,e=Aa(e,i,h.decimalPoint,f.indexOf(",")>-1?h.thousandsSep:"")):e=Xa(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}j.push(a);return j.join("")}function nb(a){return R.pow(10,P(R.log(a)/R.LN10))}function ob(a,b,c,d){var e,c=o(c,1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals===
    +!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d<b.length;d++)if(a=b[d],e<=(b[d]+(b[d+1]||b[d]))/2)break;a*=c;return a}function Cb(a,b){var c=b||[[Db,[1,2,5,10,20,25,50,100,200,500]],[pb,[1,2,5,10,15,30]],[Ya,[1,2,5,10,15,30]],[Qa,[1,2,3,4,6,8,12]],[ua,[1,2]],[Za,[1,2]],[Ra,[1,2,3,4,6]],[Da,null]],d=c[c.length-1],e=D[d[0]],f=d[1],g;for(g=0;g<c.length;g++)if(d=c[g],e=D[d[0]],f=d[1],c[g+1]&&a<=(e*f[f.length-1]+D[c[g+1][0]])/2)break;e===D[Da]&&a<5*e&&(f=[1,2,5]);c=ob(a/e,f,d[0]===Da?nb(a/e):1);
    +return{unitRange:e,count:c,unitName:d[0]}}function Eb(a,b,c,d){var e=[],f={},g=M.global.useUTC,h,i=new Date(b),j=a.unitRange,k=a.count;if(u(b)){j>=D[pb]&&(i.setMilliseconds(0),i.setSeconds(j>=D[Ya]?0:k*P(i.getSeconds()/k)));if(j>=D[Ya])i[Fb](j>=D[Qa]?0:k*P(i[qb]()/k));if(j>=D[Qa])i[Gb](j>=D[ua]?0:k*P(i[rb]()/k));if(j>=D[ua])i[sb](j>=D[Ra]?1:k*P(i[Sa]()/k));j>=D[Ra]&&(i[Hb](j>=D[Da]?0:k*P(i[$a]()/k)),h=i[ab]());j>=D[Da]&&(h-=h%k,i[Ib](h));if(j===D[Za])i[sb](i[Sa]()-i[tb]()+o(d,1));b=1;h=i[ab]();for(var d=
    +i.getTime(),l=i[$a](),m=i[Sa](),p=g?0:(864E5+i.getTimezoneOffset()*6E4)%864E5;d<c;)e.push(d),j===D[Da]?d=bb(h+b*k,0):j===D[Ra]?d=bb(h,l+b*k):!g&&(j===D[ua]||j===D[Za])?d=bb(h,l,m+b*k*(j===D[ua]?1:7)):d+=j*k,b++;e.push(d);n(ub(e,function(a){return j<=D[Qa]&&a%D[ua]===p}),function(a){f[a]=ua})}e.info=r(a,{higherRanks:f,totalRange:j*k});return e}function Jb(){this.symbol=this.color=0}function Kb(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].ss_i=e;a.sort(function(a,c){d=b(a,c);return d===0?a.ss_i-c.ss_i:
    +d});for(e=0;e<c;e++)delete a[e].ss_i}function Ja(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}function va(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);return c}function Ka(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Ta(a){cb||(cb=U(Ea));a&&cb.appendChild(a);cb.innerHTML=""}function ka(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw c;else O.console&&console.log(c)}function ia(a){return parseFloat(a.toPrecision(14))}
    +function La(a,b){Fa=o(a,b.animation)}function Lb(){var a=M.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set";bb=a?Date.UTC:function(a,b,c,g,h,i){return(new Date(a,b,o(c,1),o(g,0),o(h,0),o(i,0))).getTime()};qb=b+"Minutes";rb=b+"Hours";tb=b+"Day";Sa=b+"Date";$a=b+"Month";ab=b+"FullYear";Fb=c+"Minutes";Gb=c+"Hours";sb=c+"Date";Hb=c+"Month";Ib=c+"FullYear"}function wa(){}function Ma(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function vb(a,b){this.axis=a;if(b)this.options=
    +b,this.id=b.id}function Mb(a,b,c,d,e,f){var g=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total=null;this.points={};this.stack=e;this.percent=f==="percent";this.alignOptions={align:b.align||(g?c?"left":"right":"center"),verticalAlign:b.verticalAlign||(g?"middle":c?"bottom":"top"),y:o(b.y,g?4:c?14:-6),x:o(b.x,g?c?-6:6:0)};this.textAlign=b.textAlign||(g?c?"right":"left":"center")}function db(){this.init.apply(this,arguments)}function wb(){this.init.apply(this,arguments)}
    +function xb(a,b){this.init(a,b)}function eb(a,b){this.init(a,b)}function yb(){this.init.apply(this,arguments)}var w,y=document,O=window,R=Math,t=R.round,P=R.floor,xa=R.ceil,s=R.max,I=R.min,N=R.abs,V=R.cos,ca=R.sin,ya=R.PI,Ua=ya*2/360,oa=navigator.userAgent,Nb=O.opera,ta=/msie/i.test(oa)&&!Nb,fb=y.documentMode===8,gb=/AppleWebKit/.test(oa),hb=/Firefox/.test(oa),Ob=/(Mobile|Android|Windows Phone)/.test(oa),za="http://www.w3.org/2000/svg",Z=!!y.createElementNS&&!!y.createElementNS(za,"svg").createSVGRect,
    +Ub=hb&&parseInt(oa.split("Firefox/")[1],10)<4,$=!Z&&!ta&&!!y.createElement("canvas").getContext,Va,ib=y.documentElement.ontouchstart!==w,Pb={},zb=0,cb,M,Xa,Fa,Ab,D,pa=function(){},Ga=[],Ea="div",S="none",Qb="rgba(192,192,192,"+(Z?1.0E-4:0.002)+")",Db="millisecond",pb="second",Ya="minute",Qa="hour",ua="day",Za="week",Ra="month",Da="year",Rb="stroke-width",bb,qb,rb,tb,Sa,$a,ab,Fb,Gb,sb,Hb,Ib,W={};O.Highcharts=O.Highcharts?ka(16,!0):{};Xa=function(a,b,c){if(!u(b)||isNaN(b))return"Invalid date";var a=
    +o(a,"%Y-%m-%d %H:%M:%S"),d=new Date(b),e,f=d[rb](),g=d[tb](),h=d[Sa](),i=d[$a](),j=d[ab](),k=M.lang,l=k.weekdays,d=r({a:l[g].substr(0,3),A:l[g],d:Ba(h),e:h,b:k.shortMonths[i],B:k.months[i],m:Ba(i+1),y:j.toString().substr(2,2),Y:j,H:Ba(f),I:Ba(f%12||12),l:f%12||12,M:Ba(d[qb]()),p:f<12?"AM":"PM",P:f<12?"am":"pm",S:Ba(d.getSeconds()),L:Ba(t(b%1E3),3)},Highcharts.dateFormats);for(e in d)for(;a.indexOf("%"+e)!==-1;)a=a.replace("%"+e,typeof d[e]==="function"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+
    +a.substr(1):a};Jb.prototype={wrapColor:function(a){if(this.color>=a)this.color=0},wrapSymbol:function(a){if(this.symbol>=a)this.symbol=0}};D=function(){for(var a=0,b=arguments,c=b.length,d={};a<c;a++)d[b[a++]]=b[a];return d}(Db,1,pb,1E3,Ya,6E4,Qa,36E5,ua,864E5,Za,6048E5,Ra,26784E5,Da,31556952E3);Ab={init:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&
    +(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length<a;)d=[].concat(b).splice(b.length-f,f),e&&(d[f-6]=d[f-2],d[f-5]=d[f-1]),b=b.concat(d);h&&(b=b.concat(h),c=c.concat(i));return[b,c]},step:function(a,b,c,d){var e=[],f=a.length;if(c===1)e=d;else if(f===b.length&&c<1)for(;f--;)d=parseFloat(a[f]),e[f]=isNaN(d)?a[f]:c*parseFloat(b[f]-d)+d;else e=b;return e}};
    +(function(a){O.HighchartsAdapter=O.HighchartsAdapter||a&&{init:function(b){var c=a.fx,d=c.step,e,f=a.Tween,g=f&&f.propHooks;e=a.cssHooks.opacity;a.extend(a.easing,{easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c}});a.each(["cur","_default","width","height","opacity"],function(a,b){var e=d,k,l;b==="cur"?e=c.prototype:b==="_default"&&f&&(e=g[b],b="set");(k=e[b])&&(e[b]=function(c){c=a?c:this;if(c.prop!=="align")return l=c.elem,l.attr?l.attr(c.prop,b==="cur"?w:c.now):k.apply(this,arguments)})});
    +mb(e,"get",function(a,b,c){return b.attr?b.opacity||0:a.call(this,b,c)});e=function(a){var c=a.elem,d;if(!a.started)d=b.init(c,c.d,c.toD),a.start=d[0],a.end=d[1],a.started=!0;c.attr("d",b.step(a.start,a.end,a.pos,c.toD))};f?g.d={set:e}:d.d=e;this.each=Array.prototype.forEach?function(a,b){return Array.prototype.forEach.call(a,b)}:function(a,b){for(var c=0,d=a.length;c<d;c++)if(b.call(a[c],a[c],c,a)===!1)return c};a.fn.highcharts=function(){var a="Chart",b=arguments,c,d;ea(b[0])&&(a=b[0],b=Array.prototype.slice.call(b,
    +1));c=b[0];if(c!==w)c.chart=c.chart||{},c.chart.renderTo=this[0],new Highcharts[a](c,b[1]),d=this;c===w&&(d=Ga[v(this[0],"data-highcharts-chart")]);return d}},getScript:a.getScript,inArray:a.inArray,adapterRun:function(b,c){return a(b)[c]()},grep:a.grep,map:function(a,c){for(var d=[],e=0,f=a.length;e<f;e++)d[e]=c.call(a[e],a[e],e,a);return d},offset:function(b){return a(b).offset()},addEvent:function(b,c,d){a(b).bind(c,d)},removeEvent:function(b,c,d){var e=y.removeEventListener?"removeEventListener":
    +"detachEvent";y[e]&&b&&!b[e]&&(b[e]=function(){});a(b).unbind(c,d)},fireEvent:function(b,c,d,e){var f=a.Event(c),g="detached"+c,h;!ta&&d&&(delete d.layerX,delete d.layerY);r(f,d);b[c]&&(b[g]=b[c],b[c]=null);a.each(["preventDefault","stopPropagation"],function(a,b){var c=f[b];f[b]=function(){try{c.call(f)}catch(a){b==="preventDefault"&&(h=!0)}}});a(b).trigger(f);b[g]&&(b[c]=b[g],b[g]=null);e&&!f.isDefaultPrevented()&&!h&&e(f)},washMouseEvent:function(a){var c=a.originalEvent||a;if(c.pageX===w)c.pageX=
    +a.pageX,c.pageY=a.pageY;return c},animate:function(b,c,d){var e=a(b);if(!b.style)b.style={};if(c.d)b.toD=c.d,c.d=1;e.stop();c.opacity!==w&&b.attr&&(c.opacity+="px");e.animate(c,d)},stop:function(b){a(b).stop()}}})(O.jQuery);var X=O.HighchartsAdapter,G=X||{};X&&X.init.call(X,Ab);var jb=G.adapterRun,Vb=G.getScript,qa=G.inArray,n=G.each,ub=G.grep,Wb=G.offset,Na=G.map,J=G.addEvent,aa=G.removeEvent,z=G.fireEvent,Xb=G.washMouseEvent,Bb=G.animate,Wa=G.stop,G={enabled:!0,x:0,y:15,style:{color:"#666",cursor:"default",
    +fontSize:"11px",lineHeight:"14px"}};M={colors:"#2f7ed8,#0d233a,#8bbc21,#910000,#1aadce,#492970,#f28f43,#77a1e5,#c42525,#a6c96a".split(","),symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".",
    +numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:","},global:{useUTC:!0,canvasToolsURL:"http://code.highcharts.com/3.0.6/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/3.0.6/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:5,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],style:{fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif',
    +fontSize:"12px"},backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",margin:15,style:{color:"#274b6d",fontSize:"16px"}},subtitle:{text:"",align:"center",style:{color:"#4d759e"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,marker:{enabled:!0,lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0},select:{fillColor:"#FFFFFF",
    +lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:x(G,{align:"center",enabled:!1,formatter:function(){return this.y===null?"":Aa(this.y,-1)},verticalAlign:"bottom",y:0}),cropThreshold:300,pointRange:0,showInLegend:!0,states:{hover:{marker:{}},select:{marker:{}}},stickyTracking:!0}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderWidth:1,borderColor:"#909090",borderRadius:5,navigation:{activeColor:"#274b6d",
    +inactiveColor:"#CCC"},shadow:!1,itemStyle:{cursor:"pointer",color:"#274b6d",fontSize:"12px"},itemHoverStyle:{color:"#000"},itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},symbolWidth:16,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"1em"},style:{position:"absolute",backgroundColor:"white",opacity:0.5,textAlign:"center"}},tooltip:{enabled:!0,animation:Z,
    +backgroundColor:"rgba(255, 255, 255, .85)",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',shadow:!0,snap:Ob?25:10,style:{color:"#333333",cursor:"default",
    +fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090",fontSize:"9px"}}};var Y=M.plotOptions,X=Y.line;Lb();var ra=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Na(a.stops,function(a){return ra(a[1])}):(c=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(a))?b=[C(c[1]),C(c[2]),
    +C(c[3]),parseFloat(c[4],10)]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))?b=[C(c[1],16),C(c[2],16),C(c[3],16),1]:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(a))&&(b=[C(c[1]),C(c[2]),C(c[3]),1])})(a);return{get:function(c){var f;d?(f=x(a),f.stops=[].concat(f.stops),n(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})):f=b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a;return f},brighten:function(a){if(d)n(d,
    +function(b){b.brighten(a)});else if(sa(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=C(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this}}};wa.prototype={init:function(a,b){this.element=b==="span"?U(b):y.createElementNS(za,b);this.renderer=a;this.attrSetters={}},opacity:1,animate:function(a,b,c){b=o(b,Fa,!0);Wa(this);if(b){b=x(b);if(c)b.complete=c;Bb(this,a,b)}else this.attr(a),c&&c()},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName.toLowerCase(),
    +i=this.renderer,j,k=this.attrSetters,l=this.shadows,m,p,q=this;ea(a)&&u(b)&&(c=a,a={},a[c]=b);if(ea(a))c=a,h==="circle"?c={x:"cx",y:"cy"}[c]||c:c==="strokeWidth"&&(c="stroke-width"),q=v(g,c)||this[c]||0,c!=="d"&&c!=="visibility"&&c!=="fill"&&(q=parseFloat(q));else{for(c in a)if(j=!1,d=a[c],e=k[c]&&k[c].call(this,d,c),e!==!1){e!==w&&(d=e);if(c==="d")d&&d.join&&(d=d.join(" ")),/(NaN| {2}|^$)/.test(d)&&(d="M 0 0");else if(c==="x"&&h==="text")for(e=0;e<g.childNodes.length;e++)f=g.childNodes[e],v(f,"x")===
    +v(g,"x")&&v(f,"x",d);else if(this.rotation&&(c==="x"||c==="y"))p=!0;else if(c==="fill")d=i.color(d,g,c);else if(h==="circle"&&(c==="x"||c==="y"))c={x:"cx",y:"cy"}[c]||c;else if(h==="rect"&&c==="r")v(g,{rx:d,ry:d}),j=!0;else if(c==="translateX"||c==="translateY"||c==="rotation"||c==="verticalAlign"||c==="scaleX"||c==="scaleY")j=p=!0;else if(c==="stroke")d=i.color(d,g,c);else if(c==="dashstyle")if(c="stroke-dasharray",d=d&&d.toLowerCase(),d==="solid")d=S;else{if(d){d=d.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot",
    +"3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(e=d.length;e--;)d[e]=C(d[e])*o(a["stroke-width"],this["stroke-width"]);d=d.join(",")}}else if(c==="width")d=C(d);else if(c==="align")c="text-anchor",d={left:"start",center:"middle",right:"end"}[d];else if(c==="title")e=g.getElementsByTagName("title")[0],e||(e=y.createElementNS(za,"title"),g.appendChild(e)),e.textContent=d;c==="strokeWidth"&&
    +(c="stroke-width");if(c==="stroke-width"||c==="stroke"){this[c]=d;if(this.stroke&&this["stroke-width"])v(g,"stroke",this.stroke),v(g,"stroke-width",this["stroke-width"]),this.hasStroke=!0;else if(c==="stroke-width"&&d===0&&this.hasStroke)g.removeAttribute("stroke"),this.hasStroke=!1;j=!0}this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(c)&&(m||(this.symbolAttr(a),m=!0),j=!0);if(l&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(c))for(e=l.length;e--;)v(l[e],
    +c,c==="height"?s(d-(l[e].cutHeight||0),0):d);if((c==="width"||c==="height")&&h==="rect"&&d<0)d=0;this[c]=d;c==="text"?(d!==this.textStr&&delete this.bBox,this.textStr=d,this.added&&i.buildText(this)):j||v(g,c,d)}p&&this.updateTransform()}return q},addClass:function(a){var b=this.element,c=v(b,"class")||"";c.indexOf(a)===-1&&v(b,"class",c+" "+a);return this},symbolAttr:function(a){var b=this;n("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(c){b[c]=o(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x,
    +b.y,b.width,b.height,b)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":S)},crisp:function(a,b,c,d,e){var f,g={},h={},i,a=a||this.strokeWidth||this.attr&&this.attr("stroke-width")||0;i=t(a)%2/2;h.x=P(b||this.x||0)+i;h.y=P(c||this.y||0)+i;h.width=P((d||this.width||0)-2*i);h.height=P((e||this.height||0)-2*i);h.strokeWidth=a;for(f in h)this[f]!==h[f]&&(this[f]=g[f]=h[f]);return g},css:function(a){var b=this.element,c=a&&a.width&&b.nodeName.toLowerCase()==="text",
    +d,e="",f=function(a,b){return"-"+b.toLowerCase()};if(a&&a.color)a.fill=a.color;this.styles=a=r(this.styles,a);$&&c&&delete a.width;if(ta&&!Z)c&&delete a.width,K(this.element,a);else{for(d in a)e+=d.replace(/([A-Z])/g,f)+":"+a[d]+";";v(b,"style",e)}c&&this.added&&this.renderer.buildText(this);return this},on:function(a,b){var c=this,d=c.element;ib&&a==="click"?(d.ontouchstart=function(a){c.touchEventFired=Date.now();a.preventDefault();b.call(d,a)},d.onclick=function(a){(oa.indexOf("Android")===-1||
    +Date.now()-(c.touchEventFired||0)>1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){this.element.radialReference=a;return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},htmlCss:function(a){var b=this.element;if(b=a&&b.tagName==="SPAN"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();this.styles=r(this.styles,a);K(this.element,a);return this},htmlGetBBox:function(){var a=
    +this.element,b=this.bBox;if(!b){if(a.nodeName==="text")a.style.position="absolute";b=this.bBox={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}return b},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||"left",h={left:0,center:0.5,right:1}[g],i=g&&g!=="left",j=this.shadows;K(b,{marginLeft:c,marginTop:d});j&&n(j,function(a){K(a,{marginLeft:c+1,marginTop:d+1})});
    +this.inverted&&n(b.childNodes,function(c){a.invertChild(c,b)});if(b.tagName==="SPAN"){var k,l,j=this.rotation,m;k=0;var p=1,q=0,ba;m=C(this.textWidth);var A=this.xCorr||0,L=this.yCorr||0,Sb=[j,g,b.innerHTML,this.textWidth].join(",");if(Sb!==this.cTT){u(j)&&(k=j*Ua,p=V(k),q=ca(k),this.setSpanRotation(j,q,p));k=o(this.elemWidth,b.offsetWidth);l=o(this.elemHeight,b.offsetHeight);if(k>m&&/[ \-]/.test(b.textContent||b.innerText))K(b,{width:m+"px",display:"block",whiteSpace:"normal"}),k=m;m=a.fontMetrics(b.style.fontSize).b;
    +A=p<0&&-k;L=q<0&&-l;ba=p*q<0;A+=q*m*(ba?1-h:h);L-=p*m*(j?ba?h:1-h:1);i&&(A-=k*h*(p<0?-1:1),j&&(L-=l*h*(q<0?-1:1)),K(b,{textAlign:g}));this.xCorr=A;this.yCorr=L}K(b,{left:e+A+"px",top:f+L+"px"});if(gb)l=b.offsetHeight;this.cTT=Sb}}else this.alignOnAdd=!0},setSpanRotation:function(a){var b={};b[ta?"-ms-transform":gb?"-webkit-transform":hb?"MozTransform":Nb?"-o-transform":""]=b.transform="rotate("+a+"deg)";K(this.element,b)},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=
    +this.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(this.x||0)+" "+(this.y||0)+")");(u(c)||u(d))&&a.push("scale("+o(c,1)+" "+o(d,1)+")");a.length&&v(this.element,"transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions=
    +a,this.alignByTranslate=b,!c||ea(c))this.alignTo=d=c||"renderer",ga(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=o(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?"translateX":"x"]=t(f);if(e==="bottom"||e==="middle")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=t(g);this[this.placed?"animate":"attr"](h);this.placed=
    +!0;this.alignAttr=h;return this},getBBox:function(){var a=this.bBox,b=this.renderer,c,d=this.rotation;c=this.element;var e=this.styles,f=d*Ua;if(!a){if(c.namespaceURI===za||b.forExport){try{a=c.getBBox?r({},c.getBBox()):{width:c.offsetWidth,height:c.offsetHeight}}catch(g){}if(!a||a.width<0)a={width:0,height:0}}else a=this.htmlGetBBox();if(b.isSVG){b=a.width;c=a.height;if(ta&&e&&e.fontSize==="11px"&&c.toPrecision(3)==="22.7")a.height=c=14;if(d)a.width=N(c*ca(f))+N(b*V(f)),a.height=N(c*V(f))+N(b*ca(f))}this.bBox=
    +a}return a},show:function(){return this.attr({visibility:"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.hide()}})},add:function(a){var b=this.renderer,c=a||b,d=c.element||b.box,e=d.childNodes,f=this.element,g=v(f,"zIndex"),h;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(g)c.handleZ=!0,g=C(g);if(c.handleZ)for(c=0;c<e.length;c++)if(a=
    +e[c],b=v(a,"zIndex"),a!==f&&(C(b)>g||!u(g)&&u(b))){d.insertBefore(f,a);h=!0;break}h||d.appendChild(f);this.added=!0;z(this,"add");return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&b.parentNode,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;Wa(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f<a.stops.length;f++)a.stops[f]=a.stops[f].destroy();
    +a.stops=null}a.safeRemoveChild(b);for(c&&n(c,function(b){a.safeRemoveChild(b)});d&&d.childNodes.length===0;)b=d.parentNode,a.safeRemoveChild(d),d=b;a.alignTo&&ga(a.renderer.alignedObjects,a);for(e in a)delete a[e];return null},shadow:function(a,b,c){var d=[],e,f,g=this.element,h,i,j,k;if(a){i=o(a.width,3);j=(a.opacity||0.15)/i;k=this.parentInverted?"(-1,-1)":"("+o(a.offsetX,1)+", "+o(a.offsetY,1)+")";for(e=1;e<=i;e++){f=g.cloneNode(0);h=i*2+1-2*e;v(f,{isShadow:"true",stroke:a.color||"black","stroke-opacity":j*
    +e,"stroke-width":h,transform:"translate"+k,fill:S});if(c)v(f,"height",s(v(f,"height")-h,0)),f.cutHeight=h;b?b.element.appendChild(f):g.parentNode.insertBefore(f,g);d.push(f)}this.shadows=d}return this}};var Ha=function(){this.init.apply(this,arguments)};Ha.prototype={Element:wa,init:function(a,b,c,d){var e=location,f,g;f=this.createElement("svg").attr({version:"1.1"});g=f.element;a.appendChild(g);a.innerHTML.indexOf("xmlns")===-1&&v(g,"xmlns",za);this.isSVG=!0;this.box=g;this.boxWrapper=f;this.alignedObjects=
    +[];this.url=(hb||gb)&&y.getElementsByTagName("base").length?e.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(y.createTextNode("Created with Highcharts 3.0.6"));this.defs=this.createElement("defs").add();this.forExport=d;this.gradients={};this.setSize(b,c,!1);var h;if(hb&&a.getBoundingClientRect)this.subPixelFix=b=function(){K(a,{left:0,top:0});h=a.getBoundingClientRect();K(a,{left:xa(h.left)-h.left+"px",top:xa(h.top)-
    +h.top+"px"})},b(),J(O,"resize",b)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Ka(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&&aa(O,"resize",this.subPixelFix);return this.alignedObjects=null},createElement:function(a){var b=new this.Element;b.init(this,a);return b},draw:function(){},buildText:function(a){for(var b=a.element,c=this,d=c.forExport,e=o(a.textStr,
    +"").toString().replace(/<(b|strong)>/g,'<span style="font-weight:bold">').replace(/<(i|em)>/g,'<span style="font-style:italic">').replace(/<a/g,"<span").replace(/<\/(b|strong|i|em|a)>/g,"</span>").split(/<br.*?>/g),f=b.childNodes,g=/style="([^"]+)"/,h=/href="(http[^"]+)"/,i=v(b,"x"),j=a.styles,k=j&&j.width&&C(j.width),l=j&&j.lineHeight,m=f.length;m--;)b.removeChild(f[m]);k&&!a.added&&this.box.appendChild(b);e[e.length-1]===""&&e.pop();n(e,function(e,f){var m,o=0,e=e.replace(/<span/g,"|||<span").replace(/<\/span>/g,
    +"</span>|||");m=e.split("|||");n(m,function(e){if(e!==""||m.length===1){var p={},n=y.createElementNS(za,"tspan"),s;g.test(e)&&(s=e.match(g)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),v(n,"style",s));h.test(e)&&!d&&(v(n,"onclick",'location.href="'+e.match(h)[1]+'"'),K(n,{cursor:"pointer"}));e=(e.replace(/<(.|\n)*?>/g,"")||" ").replace(/&lt;/g,"<").replace(/&gt;/g,">");if(e!==" "&&(n.appendChild(y.createTextNode(e)),o?p.dx=0:p.x=i,v(n,p),!o&&f&&(!Z&&d&&K(n,{display:"block"}),v(n,"dy",l||c.fontMetrics(/px$/.test(n.style.fontSize)?
    +n.style.fontSize:j.fontSize).h,gb&&n.offsetHeight)),b.appendChild(n),o++,k))for(var e=e.replace(/([^\^])-/g,"$1- ").split(" "),u,t,p=a._clipHeight,E=[],w=C(l||16),B=1;e.length||E.length;)delete a.bBox,u=a.getBBox(),t=u.width,u=t>k,!u||e.length===1?(e=E,E=[],e.length&&(B++,p&&B*w>p?(e=["..."],a.attr("title",a.textStr)):(n=y.createElementNS(za,"tspan"),v(n,{dy:w,x:i}),s&&v(n,"style",s),b.appendChild(n),t>k&&(k=t)))):(n.removeChild(n.firstChild),E.unshift(e.pop())),e.length&&n.appendChild(y.createTextNode(e.join(" ").replace(/- /g,
    +"-")))}})})},button:function(a,b,c,d,e,f,g,h){var i=this.label(a,b,c,null,null,null,null,null,"button"),j=0,k,l,m,p,q,n,a={x1:0,y1:0,x2:0,y2:1},e=x({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);m=e.style;delete e.style;f=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);p=f.style;delete f.style;g=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);q=g.style;
    +delete g.style;h=x(e,{style:{color:"#CCC"}},h);n=h.style;delete h.style;J(i.element,ta?"mouseover":"mouseenter",function(){j!==3&&i.attr(f).css(p)});J(i.element,ta?"mouseout":"mouseleave",function(){j!==3&&(k=[e,f,g][j],l=[m,p,q][j],i.attr(k).css(l))});i.setState=function(a){(i.state=j=a)?a===2?i.attr(g).css(q):a===3&&i.attr(h).css(n):i.attr(e).css(m)};return i.on("click",function(){j!==3&&d.call(i)}).attr(e).css(r({cursor:"default"},m))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=t(a[1])-b%
    +2/2);a[2]===a[5]&&(a[2]=a[5]=t(a[2])+b%2/2);return a},path:function(a){var b={fill:S};Ia(a)?b.d=a:T(a)&&r(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=T(a)?a:{x:a,y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(T(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0});a.r=c;return a},rect:function(a,b,c,d,e,f){e=T(a)?a.r:e;e=this.createElement("rect").attr({rx:e,ry:e,
    +fill:S});return e.attr(T(a)?a:e.crisp(f,a,b,s(c,0),s(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[o(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return u(a)?b.attr({"class":"highcharts-"+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:S};arguments.length>1&&r(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink",
    +"href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(t(b),t(c),d,e,f),i=/^url\((.*?)\)$/,j,k;if(h)g=this.path(h),r(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&r(g,f);else if(i.test(a))k=function(a,b){a.element&&(a.attr({width:b[0],height:b[1]}),a.alignByTranslate||a.translate(t((d-b[0])/2),t((e-b[1])/2)))},j=a.match(i)[1],a=Pb[j],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),U("img",{onload:function(){k(g,
    +Pb[j]=[this.width,this.height])},src:j}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,
    +e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=V(f),j=ca(f),k=V(g),g=ca(g),e=e.end-f<ya?0:1;return["M",a+c*i,b+c*j,"A",c,c,0,e,1,a+c*k,b+c*g,h?"M":"L",a+d*k,b+d*g,"A",d,d,0,e,0,a+d*i,b+d*j,h?"":"Z"]}},clipRect:function(a,b,c,d){var e="highcharts-"+zb++,f=this.createElement("clipPath").attr({id:e}).add(this.defs),a=this.rect(a,b,c,d,0).add(f);a.id=e;a.clipPath=f;return a},color:function(a,b,c){var d=this,e,f=/^rgba/,g,h,i,j,k,l,m,p=[];a&&a.linearGradient?g="linearGradient":a&&a.radialGradient&&
    +(g="radialGradient");if(g){c=a[g];h=d.gradients;j=a.stops;b=b.radialReference;Ia(c)&&(a[g]=c={x1:c[0],y1:c[1],x2:c[2],y2:c[3],gradientUnits:"userSpaceOnUse"});g==="radialGradient"&&b&&!u(c.gradientUnits)&&(c=x(c,{cx:b[0]-b[2]/2+c.cx*b[2],cy:b[1]-b[2]/2+c.cy*b[2],r:c.r*b[2],gradientUnits:"userSpaceOnUse"}));for(m in c)m!=="id"&&p.push(m,c[m]);for(m in j)p.push(j[m]);p=p.join(",");h[p]?a=h[p].id:(c.id=a="highcharts-"+zb++,h[p]=i=d.createElement(g).attr(c).add(d.defs),i.stops=[],n(j,function(a){f.test(a[1])?
    +(e=ra(a[1]),k=e.get("rgb"),l=e.get("a")):(k=a[1],l=1);a=d.createElement("stop").attr({offset:a[0],"stop-color":k,"stop-opacity":l}).add(i);i.stops.push(a)}));return"url("+d.url+"#"+a+")"}else return f.test(a)?(e=ra(a),v(b,c+"-opacity",e.get("a")),e.get("rgb")):(b.removeAttribute(c+"-opacity"),a)},text:function(a,b,c,d){var e=M.chart.style,f=$||!Z&&this.forExport;if(d&&!this.forExport)return this.html(a,b,c);b=t(o(b,0));c=t(o(c,0));a=this.createElement("text").attr({x:b,y:c,text:a}).css({fontFamily:e.fontFamily,
    +fontSize:e.fontSize});f&&a.css({position:"absolute"});a.x=b;a.y=c;return a},html:function(a,b,c){var d=M.chart.style,e=this.createElement("span"),f=e.attrSetters,g=e.element,h=e.renderer;f.text=function(a){a!==g.innerHTML&&delete this.bBox;g.innerHTML=a;return!1};f.x=f.y=f.align=function(a,b){b==="align"&&(b="textAlign");e[b]=a;e.htmlUpdateTransform();return!1};e.attr({text:a,x:t(b),y:t(c)}).css({position:"absolute",whiteSpace:"nowrap",fontFamily:d.fontFamily,fontSize:d.fontSize});e.css=e.htmlCss;
    +if(h.isSVG)e.add=function(a){var b,c=h.box.parentNode,d=[];if(a){if(b=a.div,!b){for(;a;)d.push(a),a=a.parentGroup;n(d.reverse(),function(a){var d;b=a.div=a.div||U(Ea,{className:v(a.element,"class")},{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c);d=b.style;r(a.attrSetters,{translateX:function(a){d.left=a+"px"},translateY:function(a){d.top=a+"px"},visibility:function(a,b){d[b]=a}})})}}else b=c;b.appendChild(g);e.added=!0;e.alignOnAdd&&e.htmlUpdateTransform();return e};
    +return e},fontMetrics:function(a){var a=C(a||11),a=a<24?a+4:t(a*1.2),b=t(a*0.8);return{h:a,b:b}},label:function(a,b,c,d,e,f,g,h,i){function j(){var a,b;a=o.element.style;L=(Oa===void 0||la===void 0||q.styles.textAlign)&&o.getBBox();q.width=(Oa||L.width||0)+2*da+kb;q.height=(la||L.height||0)+2*da;v=da+p.fontMetrics(a&&a.fontSize).b;if(C){if(!A)a=t(-s*da),b=h?-v:0,q.box=A=d?p.symbol(d,a,b,q.width,q.height):p.rect(a,b,q.width,q.height,0,lb[Rb]),A.add(q);A.isImg||A.attr(x({width:q.width,height:q.height},
    +lb));lb=null}}function k(){var a=q.styles,a=a&&a.textAlign,b=kb+da*(1-s),c;c=h?0:v;if(u(Oa)&&(a==="center"||a==="right"))b+={center:0.5,right:1}[a]*(Oa-L.width);(b!==o.x||c!==o.y)&&o.attr({x:b,y:c});o.x=b;o.y=c}function l(a,b){A?A.attr(a,b):lb[a]=b}function m(){o.add(q);q.attr({text:a,x:b,y:c});A&&u(e)&&q.attr({anchorX:e,anchorY:f})}var p=this,q=p.g(i),o=p.text("",0,0,g).attr({zIndex:1}),A,L,s=0,da=3,kb=0,Oa,la,E,H,B=0,lb={},v,g=q.attrSetters,C;J(q,"add",m);g.width=function(a){Oa=a;return!1};g.height=
    +function(a){la=a;return!1};g.padding=function(a){u(a)&&a!==da&&(da=a,k());return!1};g.paddingLeft=function(a){u(a)&&a!==kb&&(kb=a,k());return!1};g.align=function(a){s={left:0,center:0.5,right:1}[a];return!1};g.text=function(a,b){o.attr(b,a);j();k();return!1};g[Rb]=function(a,b){C=!0;B=a%2/2;l(b,a);return!1};g.stroke=g.fill=g.r=function(a,b){b==="fill"&&(C=!0);l(b,a);return!1};g.anchorX=function(a,b){e=a;l(b,a+B-E);return!1};g.anchorY=function(a,b){f=a;l(b,a-H);return!1};g.x=function(a){q.x=a;a-=s*
    +((Oa||L.width)+da);E=t(a);q.attr("translateX",E);return!1};g.y=function(a){H=q.y=t(a);q.attr("translateY",H);return!1};var y=q.css;return r(q,{css:function(a){if(a){var b={},a=x(a);n("fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration,textShadow".split(","),function(c){a[c]!==w&&(b[c]=a[c],delete a[c])});o.css(b)}return y.call(q,a)},getBBox:function(){return{width:L.width+2*da,height:L.height+2*da,x:L.x-da,y:L.y-da}},shadow:function(a){A&&A.shadow(a);return q},destroy:function(){aa(q,
    +"add",m);aa(q.element,"mouseenter");aa(q.element,"mouseleave");o&&(o=o.destroy());A&&(A=A.destroy());wa.prototype.destroy.call(q);q=p=j=k=l=m=null}})}};Va=Ha;var F;if(!Z&&!$){Highcharts.VMLElement=F={init:function(a,b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ","absolute",";"],e=b===Ea;(b==="shape"||e)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",e?"hidden":"visible");c.push(' style="',d.join(""),'"/>');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=
    +U(c);this.renderer=a;this.attrSetters={}},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();z(this,"add");return this},updateTransform:wa.prototype.htmlUpdateTransform,setSpanRotation:function(a,b,c){K(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11=",c,", M12=",-b,", M21=",b,", M22=",c,", sizingMethod='auto expand')"].join(""):
    +S})},pathToVML:function(a){for(var b=a.length,c=[],d;b--;)if(sa(a[b]))c[b]=t(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))d=a[b]==="wa"?1:-1,c[b+5]===c[b+7]&&(c[b+7]-=d),c[b+6]===c[b+8]&&(c[b+8]-=d);return c.join(" ")||"x"},attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,h=f.nodeName,i=this.renderer,j=this.symbolName,k,l=this.shadows,m,p=this.attrSetters,q=this;ea(a)&&u(b)&&(c=a,a={},a[c]=b);if(ea(a))c=a,q=c==="strokeWidth"||c==="stroke-width"?
    +this.strokeweight:this[c];else for(c in a)if(d=a[c],m=!1,e=p[c]&&p[c].call(this,d,c),e!==!1&&d!==null){e!==w&&(d=e);if(j&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c))k||(this.symbolAttr(a),k=!0),m=!0;else if(c==="d"){d=d||[];this.d=d.join(" ");f.path=d=this.pathToVML(d);if(l)for(e=l.length;e--;)l[e].path=l[e].cutOff?this.cutOffPath(d,l[e].cutOff):d;m=!0}else if(c==="visibility"){if(l)for(e=l.length;e--;)l[e].style[c]=d;h==="DIV"&&(d=d==="hidden"?"-999em":0,fb||(g[c]=d?"visible":
    +"hidden"),c="top");g[c]=d;m=!0}else if(c==="zIndex")d&&(g[c]=d),m=!0;else if(qa(c,["x","y","width","height"])!==-1)this[c]=d,c==="x"||c==="y"?c={x:"left",y:"top"}[c]:d=s(0,d),this.updateClipping?(this[c]=d,this.updateClipping()):g[c]=d,m=!0;else if(c==="class"&&h==="DIV")f.className=d;else if(c==="stroke")d=i.color(d,f,c),c="strokecolor";else if(c==="stroke-width"||c==="strokeWidth")f.stroked=d?!0:!1,c="strokeweight",this[c]=d,sa(d)&&(d+="px");else if(c==="dashstyle")(f.getElementsByTagName("stroke")[0]||
    +U(i.prepVML(["<stroke/>"]),null,null,f))[c]=d||"solid",this.dashstyle=d,m=!0;else if(c==="fill")if(h==="SPAN")g.color=d;else{if(h!=="IMG")f.filled=d!==S?!0:!1,d=i.color(d,f,c,this),c="fillcolor"}else if(c==="opacity")m=!0;else if(h==="shape"&&c==="rotation")this[c]=f.style[c]=d,f.style.left=-t(ca(d*Ua)+1)+"px",f.style.top=t(V(d*Ua))+"px";else if(c==="translateX"||c==="translateY"||c==="rotation")this[c]=d,this.updateTransform(),m=!0;else if(c==="text")this.bBox=null,f.innerHTML=d,m=!0;m||(fb?f[c]=
    +d:v(f,c,d))}return q},clip:function(a){var b=this,c;a?(c=a.members,ga(c,b),c.push(b),b.destroyClip=function(){ga(c,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:fb?"inherit":"rect(auto)"});return b.css(a)},css:wa.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Ta(a)},destroy:function(){this.destroyClip&&this.destroyClip();return wa.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=O.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,
    +b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=C(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,l,m,p,q;k&&typeof k.value!=="string"&&(k="x");m=k;if(a){p=o(a.width,3);q=(a.opacity||0.15)/p;for(e=1;e<=3;e++){l=p*2+1-2*e;c&&(m=this.cutOffPath(k.value,l+0.5));j=['<shape isShadow="true" strokeweight="',l,'" filled="false" path="',m,'" coordsize="10 10" style="',f.style.cssText,'" />'];h=U(g.prepVML(j),null,
    +{left:C(i.left)+o(a.offsetX,1),top:C(i.top)+o(a.offsetY,1)});if(c)h.cutOff=l+1;j=['<stroke color="',a.color||"black",'" opacity="',q*e,'"/>'];U(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this}};F=ha(wa,F);var ma={Element:F,isIE8:oa.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d,e;this.alignedObjects=[];d=this.createElement(Ea);e=d.element;e.style.position="relative";a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=
    +d;this.setSize(b,c,!1);y.namespaces.hcv||(y.namespaces.add("hcv","urn:schemas-microsoft-com:vml"),(y.styleSheets.length?y.styleSheets[0]:y.createStyleSheet()).cssText+="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } ")},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=T(a);return r(e,{members:[],left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=
    +a.element,c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+t(a?e:d)+"px,"+t(a?f:b)+"px,"+t(a?b:f)+"px,"+t(a?d:e)+"px)"};!a&&fb&&c==="DIV"&&r(d,{width:b+"px",height:f+"px"});return d},updateClipping:function(){n(e.members,function(a){a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=S;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&(i="pattern");if(i){var k,l,m=a.linearGradient||a.radialGradient,
    +p,q,o,A,L,s="",a=a.stops,u,t=[],w=function(){h=['<fill colors="'+t.join(",")+'" opacity="',o,'" o:opacity2="',q,'" type="',i,'" ',s,'focus="100%" method="any" />'];U(e.prepVML(h),null,null,b)};p=a[0];u=a[a.length-1];p[0]>0&&a.unshift([0,p[1]]);u[0]<1&&a.push([1,u[1]]);n(a,function(a,b){g.test(a[1])?(f=ra(a[1]),k=f.get("rgb"),l=f.get("a")):(k=a[1],l=1);t.push(a[0]*100+"% "+k);b?(o=l,A=k):(q=l,L=k)});if(c==="fill")if(i==="gradient")c=m.x1||m[0]||0,a=m.y1||m[1]||0,p=m.x2||m[2]||0,m=m.y2||m[3]||0,s='angle="'+
    +(90-R.atan((m-a)/(p-c))*180/ya)+'"',w();else{var j=m.r,r=j*2,E=j*2,H=m.cx,B=m.cy,x=b.radialReference,v,j=function(){x&&(v=d.getBBox(),H+=(x[0]-v.x)/v.width-0.5,B+=(x[1]-v.y)/v.height-0.5,r*=x[2]/v.width,E*=x[2]/v.height);s='src="'+M.global.VMLRadialGradientURL+'" size="'+r+","+E+'" origin="0.5,0.5" position="'+H+","+B+'" color2="'+L+'" ';w()};d.added?j():J(d,"add",j);j=A}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=ra(a),h=["<",c,' opacity="',f.get("a"),'"/>'],U(this.prepVML(h),null,null,b),j=
    +f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type="solid";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","<hcv:");return a},text:Ha.prototype.html,path:function(a){var b={coordsize:"10 10"};
    +Ia(a)?b.d=a:T(a)&&r(b,a);return this.createElement("shape").attr(b)},circle:function(a,b,c){var d=this.symbol("circle");if(T(a))c=a.r,b=a.y,a=a.x;d.isCircle=!0;d.r=c;return d.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement(Ea).attr(b)},image:function(a,b,c,d,e){var f=this.createElement("img").attr({src:a});arguments.length>1&&f.attr({x:b,y:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){var g=this.symbol("rect");g.r=
    +T(a)?a.r:e;return g.attr(T(a)?a:g.crisp(f,a,b,s(c,0),s(d,0)))},invertChild:function(a,b){var c=b.style;K(a,{flip:"x",left:C(c.width)-1,top:C(c.height)-1,rotation:-90})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=V(f),i=ca(f),j=V(g),k=ca(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c*j,b+c*k,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);
    +e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){var f=a+c,g=b+d,h;!u(e)||!e.r?f=Ha.prototype.symbols.square.apply(0,arguments):(h=I(e.r,c,d),f=["M",a+h,b,"L",f-h,b,"wa",f-2*h,b,f,b+2*h,f-h,b,f,b+h,"L",f,g-h,"wa",f-2*h,g-2*h,f,g,f,g-h,f-h,g,"L",a+h,g,"wa",a,g-2*h,a+2*h,g,a+h,g,a,g-h,"L",a,b+h,"wa",a,b,a+2*h,b+2*h,a,b+h,a+h,b,"x","e"]);return f}}};Highcharts.VMLRenderer=F=function(){this.init.apply(this,arguments)};F.prototype=x(Ha.prototype,
    +ma);Va=F}var Tb;if($)Highcharts.CanVGRenderer=F=function(){za="http://www.w3.org/1999/xhtml"},F.prototype.symbols={},Tb=function(){function a(){var a=b.length,d;for(d=0;d<a;d++)b[d]();b=[]}var b=[];return{push:function(c,d){b.length===0&&Vb(d,a);b.push(c)}}}(),Va=F;Ma.prototype={addLabel:function(){var a=this.axis,b=a.options,c=a.chart,d=a.horiz,e=a.categories,f=a.series[0]&&a.series[0].names,g=this.pos,h=b.labels,i=a.tickPositions,d=d&&e&&!h.step&&!h.staggerLines&&!h.rotation&&c.plotWidth/i.length||
    +!d&&(c.margin[3]||c.chartWidth*0.33),j=g===i[0],k=g===i[i.length-1],l,f=e?o(e[g],f&&f[g],g):g,e=this.label,m=i.info;a.isDatetimeAxis&&m&&(l=b.dateTimeLabelFormats[m.higherRanks[g]||m.unitName]);this.isFirst=j;this.isLast=k;b=a.labelFormatter.call({axis:a,chart:c,isFirst:j,isLast:k,dateTimeLabelFormat:l,value:a.isLog?ia(fa(f)):f});g=d&&{width:s(1,t(d-2*(h.padding||10)))+"px"};g=r(g,h.style);if(u(e))e&&e.attr({text:b}).css(g);else{l={align:a.labelAlign};if(sa(h.rotation))l.rotation=h.rotation;if(d&&
    +h.ellipsis)l._clipHeight=a.len/i.length;this.label=u(b)&&h.enabled?c.renderer.text(b,0,0,h.useHTML).attr(l).css(g).add(a.labelGroup):null}},getLabelSize:function(){var a=this.label,b=this.axis;return a?(this.labelBBox=a.getBBox())[b.horiz?"height":"width"]:0},getLabelSides:function(){var a=this.axis,b=this.labelBBox.width,a=b*{left:0,center:0.5,right:1}[a.labelAlign]-a.options.labels.x;return[-a,b-a]},handleOverflow:function(a,b){var c=!0,d=this.axis,e=d.chart,f=this.isFirst,g=this.isLast,h=b.x,i=
    +d.reversed,j=d.tickPositions;if(f||g){var k=this.getLabelSides(),l=k[0],k=k[1],e=e.plotLeft,m=e+d.len,j=(d=d.ticks[j[a+(f?1:-1)]])&&d.label.xy&&d.label.xy.x+d.getLabelSides()[f?0:1];f&&!i||g&&i?h+l<e&&(h=e-l,d&&h+k>j&&(c=!1)):h+k>m&&(h=m-k,d&&h+l<j&&(c=!1));b.x=h}return c},getPosition:function(a,b,c,d){var e=this.axis,f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a?
    +g-e.bottom+e.offset-(e.opposite?e.height:0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,j=i.transA,k=i.reversed,l=i.staggerLines,m=i.chart.renderer.fontMetrics(e.style.fontSize).b,p=e.rotation,a=a+e.x-(f&&d?f*j*(k?-1:1):0),b=b+e.y-(f&&!d?f*j*(k?1:-1):0);p&&i.side===2&&(b-=m-m*V(p*Ua));!u(e.y)&&!p&&(b+=m-c.getBBox().height/2);l&&(b+=g/(h||1)%l*(i.labelOffset/l));return{x:a,y:b}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine(["M",a,b,"L",
    +a+(e?0:-c),b+(e?c:0)],d)},render:function(a,b,c){var d=this.axis,e=d.options,f=d.chart.renderer,g=d.horiz,h=this.type,i=this.label,j=this.pos,k=e.labels,l=this.gridLine,m=h?h+"Grid":"grid",p=h?h+"Tick":"tick",q=e[m+"LineWidth"],n=e[m+"LineColor"],A=e[m+"LineDashStyle"],s=e[p+"Length"],m=e[p+"Width"]||0,u=e[p+"Color"],t=e[p+"Position"],p=this.mark,r=k.step,v=!0,x=d.tickmarkOffset,E=this.getPosition(g,j,x,b),H=E.x,E=E.y,B=g&&H===d.pos+d.len||!g&&E===d.pos?-1:1,C=d.staggerLines;this.isActive=!0;if(q){j=
    +d.getPlotLinePath(j+x,q*B,b,!0);if(l===w){l={stroke:n,"stroke-width":q};if(A)l.dashstyle=A;if(!h)l.zIndex=1;if(b)l.opacity=0;this.gridLine=l=q?f.path(j).attr(l).add(d.gridGroup):null}if(!b&&l&&j)l[this.isNew?"attr":"animate"]({d:j,opacity:c})}if(m&&s)t==="inside"&&(s=-s),d.opposite&&(s=-s),b=this.getMarkPath(H,E,s,m*B,g,f),p?p.animate({d:b,opacity:c}):this.mark=f.path(b).attr({stroke:u,"stroke-width":m,opacity:c}).add(d.axisGroup);if(i&&!isNaN(H))i.xy=E=this.getLabelPosition(H,E,i,g,k,x,a,r),this.isFirst&&
    +!this.isLast&&!o(e.showFirstLabel,1)||this.isLast&&!this.isFirst&&!o(e.showLastLabel,1)?v=!1:!C&&g&&k.overflow==="justify"&&!this.handleOverflow(a,E)&&(v=!1),r&&a%r&&(v=!1),v&&!isNaN(E.y)?(E.opacity=c,i[this.isNew?"attr":"animate"](E),this.isNew=!1):i.attr("y",-9999)},destroy:function(){Ka(this,this.axis)}};vb.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=(b.pointRange||0)/2,e=a.options,f=e.label,g=a.label,h=e.width,i=e.to,j=e.from,k=u(j)&&u(i),l=e.value,m=e.dashStyle,p=a.svgElem,q=
    +[],n,A=e.color,L=e.zIndex,t=e.events,w=b.chart.renderer;b.isLog&&(j=na(j),i=na(i),l=na(l));if(h){if(q=b.getPlotLinePath(l,h),d={stroke:A,"stroke-width":h},m)d.dashstyle=m}else if(k){if(j=s(j,b.min-d),i=I(i,b.max+d),q=b.getPlotBandPath(j,i,e),d={fill:A},e.borderWidth)d.stroke=e.borderColor,d["stroke-width"]=e.borderWidth}else return;if(u(L))d.zIndex=L;if(p)q?p.animate({d:q},null,p.onGetPath):(p.hide(),p.onGetPath=function(){p.show()});else if(q&&q.length&&(a.svgElem=p=w.path(q).attr(d).add(),t))for(n in e=
    +function(b){p.on(b,function(c){t[b].apply(a,[c])})},t)e(n);if(f&&u(f.text)&&q&&q.length&&b.width>0&&b.height>0){f=x({align:c&&k&&"center",x:c?!k&&4:10,verticalAlign:!c&&k&&"middle",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},f);if(!g)a.label=g=w.text(f.text,0,0,f.useHTML).attr({align:f.textAlign||f.align,rotation:f.rotation,zIndex:L}).css(f.style).add();b=[q[1],q[4],o(q[6],q[1])];q=[q[2],q[5],o(q[7],q[2])];c=Ja(b);k=Ja(q);g.align(f,!1,{x:c,y:k,width:va(b)-c,height:va(q)-k});g.show()}else g&&g.hide();return a},
    +destroy:function(){ga(this.axis.plotLinesAndBands,this);delete this.axis;Ka(this)}};Mb.prototype={destroy:function(){Ka(this,this.axis)},render:function(a){var b=this.options,c=b.format,c=c?Ca(c,this):b.formatter.call(this);this.label?this.label.attr({text:c,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(c,0,0,b.useHTML).css(b.style).attr({align:this.textAlign,rotation:b.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,e=d.inverted,f=this.isNegative,
    +g=c.translate(this.percent?100:this.total,0,0,0,1),c=c.translate(0),c=N(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e.attr({visibility:this.options.crop===!1||d.isInsidePlot(f.x,f.y)?Z?"inherit":"visible":"hidden"})}};db.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",
    +month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",labels:G,lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#4d759e",fontWeight:"bold"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,
    +gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return Aa(this.total,-1)},style:G.style}},defaultLeftAxisOptions:{labels:{x:-8,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:8,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0,y:14},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-5},
    +title:{rotation:0}},init:function(a,b){var c=b.isX;this.horiz=a.inverted?!c:c;this.xOrY=(this.isXAxis=c)?"x":"y";this.opposite=b.opposite;this.side=this.horiz?this.opposite?0:2:this.opposite?1:3;this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.chart=a;this.reversed=d.reversed;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e==="category";this.isLog=e==="logarithmic";this.isDatetimeAxis=
    +e==="datetime";this.isLinked=u(d.linkedTo);this.tickmarkOffset=this.categories&&d.tickmarkPlacement==="between"?0.5:0;this.ticks={};this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stackExtremes={};this.min=this.max=null;var f,d=this.options.events;qa(this,a.axes)===-1&&(a.axes.push(this),a[c?"xAxis":"yAxis"].push(this));this.series=this.series||
    +[];if(a.inverted&&c&&this.reversed===w)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)J(this,f,d[f]);if(this.isLog)this.val2lin=na,this.lin2val=fa},setOptions:function(a){this.options=x(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],x(M[this.isXAxis?"xAxis":"yAxis"],a))},update:function(a,b){var c=this.chart,a=c.options[this.xOrY+
    +"Axis"][this.options.index]=x(this.userOptions,a);this.destroy(!0);this._addedPlotLB=this.userMin=this.userMax=w;this.init(c,r(a,{events:w}));c.isDirtyBox=!0;o(b,!0)&&c.redraw()},remove:function(a){var b=this.chart,c=this.xOrY+"Axis";n(this.series,function(a){a.remove(!1)});ga(b.axes,this);ga(b[c],this);b.options[c].splice(this.options.index,1);n(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;o(a,!0)&&b.redraw()},defaultLabelFormatter:function(){var a=this.axis,b=this.value,
    +c=a.categories,d=this.dateTimeLabelFormat,e=M.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Ca(h,this);else if(c)g=b;else if(d)g=Xa(d,b);else if(f&&a>=1E3)for(;f--&&g===w;)c=Math.pow(1E3,f+1),a>=c&&e[f]!==null&&(g=Aa(b/c,-1)+e[f]);g===w&&(g=b>=1E3?Aa(b,0):Aa(b,-1));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=null;a.stackExtremes={};a.buildStacks();n(a.series,function(c){if(c.visible||!b.options.chart.ignoreHiddenSeries){var d;
    +d=c.options.threshold;var e;a.hasVisibleSeries=!0;a.isLog&&d<=0&&(d=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=I(o(a.dataMin,d[0]),Ja(d)),a.dataMax=s(o(a.dataMax,d[0]),va(d))}else{c.getExtremes();e=c.dataMax;c=c.dataMin;if(u(c)&&u(e))a.dataMin=I(o(a.dataMin,c),c),a.dataMax=s(o(a.dataMax,e),e);if(u(d))if(a.dataMin>=d)a.dataMin=d,a.ignoreMinPadding=!0;else if(a.dataMax<d)a.dataMax=d,a.ignoreMaxPadding=!0}}})},translate:function(a,b,c,d,e,f){var g=this.len,h=1,i=0,j=d?this.oldTransA:this.transA,
    +d=d?this.oldMin:this.min,k=this.minPixelPadding,e=(this.options.ordinal||this.isLog&&e)&&this.lin2val;if(!j)j=this.transA;c&&(h*=-1,i=g);this.reversed&&(h*=-1,i-=h*g);b?(a=a*h+i,a-=k,a=a/j+d,e&&(a=this.lin2val(a))):(e&&(a=this.val2lin(a)),f==="between"&&(f=0.5),a=h*(a-d)*j+i+h*k+(sa(f)?j*f*this.pointRange:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a-(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,
    +b,c,d){var e=this.chart,f=this.left,g=this.top,h,i,j,a=this.translate(a,null,null,c),k=c&&e.oldChartHeight||e.chartHeight,l=c&&e.oldChartWidth||e.chartWidth,m;h=this.transB;c=i=t(a+h);h=j=t(k-a-h);if(isNaN(a))m=!0;else if(this.horiz){if(h=g,j=k-this.bottom,c<f||c>f+this.width)m=!0}else if(c=f,i=l-this.right,h<g||h>g+this.height)m=!0;return m&&!d?null:e.renderer.crispLine(["M",c,h,"L",i,j],b||0)},getPlotBandPath:function(a,b){var c=this.getPlotLinePath(b),d=this.getPlotLinePath(a);d&&c?d.push(c[4],
    +c[5],c[1],c[2]):d=null;return d},getLinearTickPositions:function(a,b,c){for(var d,b=ia(P(b/a)*a),c=ia(xa(c/a)*a),e=[];b<=c;){e.push(b);b=ia(b+a);if(b===d)break;d=b}return e},getLogTickPositions:function(a,b,c,d){var e=this.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=t(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=P(b),h,i,j,k,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f<c+1&&!l;f++){i=e.length;for(h=0;h<i&&!l;h++)j=na(fa(f)*e[h]),j>b&&(!d||
    +k<=c)&&g.push(k),k>c&&(l=!0),k=j}else if(b=fa(b),c=fa(c),a=e[d?"minorTickInterval":"tickInterval"],a=o(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)||1)),a=ob(a,null,nb(a)),g=Na(this.getLinearTickPositions(a,b,c),na),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e;if(this.isLog){e=b.length;for(a=1;a<e;a++)d=d.concat(this.getLogTickPositions(c,
    +b[a-1],b[a],!0))}else if(this.isDatetimeAxis&&a.minorTickInterval==="auto")d=d.concat(Eb(Cb(c),this.min,this.max,a.startOfWeek)),d[0]<this.min&&d.shift();else for(b=this.min+(b[0]-this.min)%c;b<=this.max;b+=c)d.push(b);return d},adjustForMinRange:function(){var a=this.options,b=this.min,c=this.max,d,e=this.dataMax-this.dataMin>=this.minRange,f,g,h,i,j;if(this.isXAxis&&this.minRange===w&&!this.isLog)u(a.min)||u(a.max)?this.minRange=null:(n(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length-
    +1;g>0;g--)if(h=i[g]-i[g-1],f===w||h<f)f=h}),this.minRange=I(f*5,this.dataMax-this.dataMin));if(c-b<this.minRange){var k=this.minRange;d=(k-c+b)/2;d=[b-d,o(a.min,b-d)];if(e)d[2]=this.dataMin;b=va(d);c=[b+k,o(a.max,b+k)];if(e)c[2]=this.dataMax;c=Ja(c);c-b<k&&(d[0]=c-k,d[1]=o(a.min,c-k),b=va(d))}this.min=b;this.max=c},setAxisTranslation:function(a){var b=this.max-this.min,c=0,d,e=0,f=0,g=this.linkedParent,h=this.transA;if(this.isXAxis)g?(e=g.minPointOffset,f=g.pointRangePadding):n(this.series,function(a){var g=
    +a.pointRange,h=a.options.pointPlacement,l=a.closestPointRange;g>b&&(g=0);c=s(c,g);e=s(e,ea(h)?0:g/2);f=s(f,h==="on"?0:g);!a.noSharedTooltip&&u(l)&&(d=u(d)?I(d,l):l)}),g=this.ordinalSlope&&d?this.ordinalSlope/d:1,this.minPointOffset=e*=g,this.pointRangePadding=f*=g,this.pointRange=I(c,b),this.closestPointRange=d;if(a)this.oldTransA=h;this.translationSlope=this.transA=h=this.len/(b+f||1);this.transB=this.horiz?this.left:this.bottom;this.minPixelPadding=h*e},setTickPositions:function(a){var b=this,c=
    +b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=b.options.tickPositioner,j=d.maxPadding,k=d.minPadding,l=d.tickInterval,m=d.minTickInterval,p=d.tickPixelInterval,q,ba=b.categories;h?(b.linkedParent=c[g?"xAxis":"yAxis"][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=o(c.min,c.dataMin),b.max=o(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&ka(11,1)):(b.min=o(b.userMin,d.min,b.dataMin),b.max=o(b.userMax,d.max,b.dataMax));if(e)!a&&I(b.min,o(b.dataMin,b.min))<=0&&
    +ka(10,1),b.min=ia(na(b.min)),b.max=ia(na(b.max));if(b.range&&(b.userMin=b.min=s(b.min,b.max-b.range),b.userMax=b.max,a))b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!ba&&!b.usePercentage&&!h&&u(b.min)&&u(b.max)&&(c=b.max-b.min)){if(!u(d.min)&&!u(b.userMin)&&k&&(b.dataMin<0||!b.ignoreMinPadding))b.min-=c*k;if(!u(d.max)&&!u(b.userMax)&&j&&(b.dataMax>0||!b.ignoreMaxPadding))b.max+=c*j}b.min===b.max||b.min===void 0||b.max===void 0?b.tickInterval=1:h&&!l&&p===b.linkedParent.options.tickPixelInterval?
    +b.tickInterval=b.linkedParent.tickInterval:(b.tickInterval=o(l,ba?1:(b.max-b.min)*p/s(b.len,p)),!u(l)&&b.len<p&&!this.isRadial&&(q=!0,b.tickInterval/=4));g&&!a&&n(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&b.beforeSetTickPositions();if(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);if(b.pointRange)b.tickInterval=s(b.pointRange,b.tickInterval);if(!l&&b.tickInterval<m)b.tickInterval=
    +m;if(!f&&!e&&!l)b.tickInterval=ob(b.tickInterval,null,nb(b.tickInterval),d);b.minorTickInterval=d.minorTickInterval==="auto"&&b.tickInterval?b.tickInterval/5:d.minorTickInterval;b.tickPositions=a=d.tickPositions?[].concat(d.tickPositions):i&&i.apply(b,[b.min,b.max]);if(!a)!b.ordinalPositions&&(b.max-b.min)/b.tickInterval>s(2*b.len,200)&&ka(19,!0),a=f?(b.getNonLinearTimeTicks||Eb)(Cb(b.tickInterval,d.units),b.min,b.max,d.startOfWeek,b.ordinalPositions,b.closestPointRange,!0):e?b.getLogTickPositions(b.tickInterval,
    +b.min,b.max):b.getLinearTickPositions(b.tickInterval,b.min,b.max),q&&a.splice(1,a.length-2),b.tickPositions=a;if(!h)e=a[0],f=a[a.length-1],h=b.minPointOffset||0,d.startOnTick?b.min=e:b.min-h>e&&a.shift(),d.endOnTick?b.max=f:b.max+h<f&&a.pop(),a.length===1&&(b.min-=0.001,b.max+=0.001)},setMaxTicks:function(){var a=this.chart,b=a.maxTicks||{},c=this.tickPositions,d=this._maxTicksKey=[this.xOrY,this.pos,this.len].join("-");if(!this.isLinked&&!this.isDatetimeAxis&&c&&c.length>(b[d]||0)&&this.options.alignTicks!==
    +!1)b[d]=c.length;a.maxTicks=b},adjustTickAmount:function(){var a=this._maxTicksKey,b=this.tickPositions,c=this.chart.maxTicks;if(c&&c[a]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1){var d=this.tickAmount,e=b.length;this.tickAmount=a=c[a];if(e<a){for(;b.length<a;)b.push(ia(b[b.length-1]+this.tickInterval));this.transA*=(e-1)/(a-1);this.max=b[b.length-1]}if(u(d)&&a!==d)this.isDirty=!0}},setScale:function(){var a=this.stacks,b,c,d,e;this.oldMin=this.min;this.oldMax=
    +this.max;this.oldAxisLength=this.len;this.setAxisSize();e=this.len!==this.oldAxisLength;n(this.series,function(a){if(a.isDirtyData||a.isDirty||a.xAxis.isDirty)d=!0});if(e||d||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax){if(!this.isXAxis)for(b in a)delete a[b];this.forceRedraw=!1;this.getSeriesExtremes();this.setTickPositions();this.oldUserMin=this.userMin;this.oldUserMax=this.userMax;if(!this.isDirty)this.isDirty=e||this.min!==this.oldMin||this.max!==
    +this.oldMax}else if(!this.isXAxis){if(this.oldStacks)a=this.stacks=this.oldStacks;for(b in a)for(c in a[b])a[b][c].cum=a[b][c].total}this.setMaxTicks()},setExtremes:function(a,b,c,d,e){var f=this,g=f.chart,c=o(c,!0),e=r(e,{min:a,max:b});z(f,"setExtremes",e,function(){f.userMin=a;f.userMax=b;f.eventArgs=e;f.isDirtyExtremes=!0;c&&g.redraw(d)})},zoom:function(a,b){this.allowZoomOutside||(u(this.dataMin)&&a<=this.dataMin&&(a=w),u(this.dataMax)&&b>=this.dataMax&&(b=w));this.displayBtn=a!==w||b!==w;this.setExtremes(a,
    +b,!1,w,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=b.offsetRight||0,e=this.horiz,f,g;this.left=g=o(b.left,a.plotLeft+c);this.top=f=o(b.top,a.plotTop);this.width=c=o(b.width,a.plotWidth-c+d);this.height=b=o(b.height,a.plotHeight);this.bottom=a.chartHeight-b-f;this.right=a.chartWidth-c-g;this.len=s(e?c:b,0);this.pos=e?g:f},getExtremes:function(){var a=this.isLog;return{min:a?ia(fa(this.min)):this.min,max:a?ia(fa(this.max)):this.max,dataMin:this.dataMin,
    +dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?fa(this.min):this.min,b=b?fa(this.max):this.max;c>a||a===null?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},addPlotBand:function(a){this.addPlotBandOrLine(a,"plotBands")},addPlotLine:function(a){this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(a,b){var c=(new vb(this,a)).render(),d=this.userOptions;c&&(b&&(d[b]=d[b]||[],d[b].push(a)),this.plotLinesAndBands.push(c));return c},
    +autoLabelAlign:function(a){a=(o(a,0)-this.side*90+720)%360;return a>15&&a<165?"right":a>195&&a<345?"left":"center"},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k=0,l,m=0,p=d.title,q=d.labels,ba=0,A=b.axisOffset,L=b.clipOffset,t=[-1,1,1,-1][h],r,v=1,x=o(q.maxStaggerLines,5),la,E,H,B;a.hasData=j=a.hasVisibleSeries||u(a.min)&&u(a.max)&&!!e;a.showAxis=b=j||o(d.showEmpty,!0);a.staggerLines=a.horiz&&q.staggerLines;
    +if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=c.g("axis-labels").attr({zIndex:q.zIndex||7}).add();if(j||a.isLinked){a.labelAlign=o(q.align||a.autoLabelAlign(q.rotation));n(e,function(b){f[b]?f[b].addLabel():f[b]=new Ma(a,b)});if(a.horiz&&!a.staggerLines&&x&&!q.rotation){for(r=a.reversed?[].concat(e).reverse():e;v<x;){j=[];la=!1;for(q=0;q<r.length;q++)E=r[q],H=(H=f[E].label&&f[E].label.getBBox())?H.width:
    +0,B=q%v,H&&(E=a.translate(E),j[B]!==w&&E<j[B]&&(la=!0),j[B]=E+H);if(la)v++;else break}if(v>1)a.staggerLines=v}n(e,function(b){if(h===0||h===2||{1:"left",3:"right"}[h]===a.labelAlign)ba=s(f[b].getLabelSize(),ba)});if(a.staggerLines)ba*=a.staggerLines,a.labelOffset=ba}else for(r in f)f[r].destroy(),delete f[r];if(p&&p.text&&p.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(p.text,0,0,p.useHTML).attr({zIndex:7,rotation:p.rotation||0,align:p.textAlign||{low:"left",middle:"center",high:"right"}[p.align]}).css(p.style).add(a.axisGroup),
    +a.axisTitle.isNew=!0;if(b)k=a.axisTitle.getBBox()[g?"height":"width"],m=o(p.margin,g?5:10),l=p.offset;a.axisTitle[b?"show":"hide"]()}a.offset=t*o(d.offset,A[h]);a.axisTitleMargin=o(l,ba+m+(h!==2&&ba&&t*d.labels[g?"y":"x"]));A[h]=s(A[h],a.axisTitleMargin+k+t*a.offset);L[i]=s(L[i],P(d.lineWidth/2)*2)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",
    +e?this.left:f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=C(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?i:0);return{x:a?d:b+(g?this.width:0)+h+(e.x||0),y:a?b-(g?this.height:0)+h:d+(e.y||0)}},render:function(){var a=this,
    +b=a.chart,c=b.renderer,d=a.options,e=a.isLog,f=a.isLinked,g=a.tickPositions,h=a.axisTitle,i=a.stacks,j=a.ticks,k=a.minorTicks,l=a.alternateBands,m=d.stackLabels,p=d.alternateGridColor,q=a.tickmarkOffset,o=d.lineWidth,A,s=b.hasRendered&&u(a.oldMin)&&!isNaN(a.oldMin);A=a.hasData;var t=a.showAxis,r,v;n([j,k,l],function(a){for(var b in a)a[b].isActive=!1});if(A||f)if(a.minorTickInterval&&!a.categories&&n(a.getMinorTickPositions(),function(b){k[b]||(k[b]=new Ma(a,b,"minor"));s&&k[b].isNew&&k[b].render(null,
    +!0);k[b].render(null,!1,1)}),g.length&&(n(g.slice(1).concat([g[0]]),function(b,c){c=c===g.length-1?0:c+1;if(!f||b>=a.min&&b<=a.max)j[b]||(j[b]=new Ma(a,b)),s&&j[b].isNew&&j[b].render(c,!0),j[b].render(c,!1,1)}),q&&a.min===0&&(j[-1]||(j[-1]=new Ma(a,-1,null,!0)),j[-1].render(-1))),p&&n(g,function(b,c){if(c%2===0&&b<a.max)l[b]||(l[b]=new vb(a)),r=b+q,v=g[c+1]!==w?g[c+1]+q:a.max,l[b].options={from:e?fa(r):r,to:e?fa(v):v,color:p},l[b].render(),l[b].isActive=!0}),!a._addedPlotLB)n((d.plotLines||[]).concat(d.plotBands||
    +[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0;n([j,k,l],function(a){var c,d,e=[],f=Fa?Fa.duration||500:0,g=function(){for(d=e.length;d--;)a[e[d]]&&!a[e[d]].isActive&&(a[e[d]].destroy(),delete a[e[d]])};for(c in a)if(!a[c].isActive)a[c].render(c,!1,0),a[c].isActive=!1,e.push(c);a===l||!b.hasRendered||!f?g():f&&setTimeout(g,f)});if(o)A=a.getLinePath(o),a.axisLine?a.axisLine.animate({d:A}):a.axisLine=c.path(A).attr({stroke:d.lineColor,"stroke-width":o,zIndex:7}).add(a.axisGroup),a.axisLine[t?
    +"show":"hide"]();if(h&&t)h[h.isNew?"attr":"animate"](a.getTitlePosition()),h.isNew=!1;if(m&&m.enabled){var x,la,d=a.stackTotalGroup;if(!d)a.stackTotalGroup=d=c.g("stack-labels").attr({visibility:"visible",zIndex:6}).add();d.translate(b.plotLeft,b.plotTop);for(x in i)for(la in c=i[x],c)c[la].render(d)}a.isDirty=!1},removePlotBandOrLine:function(a){for(var b=this.plotLinesAndBands,c=this.options,d=this.userOptions,e=b.length;e--;)b[e].id===a&&b[e].destroy();n([c.plotLines||[],d.plotLines||[],c.plotBands||
    +[],d.plotBands||[]],function(b){for(e=b.length;e--;)b[e].id===a&&ga(b,b[e])})},setTitle:function(a,b){this.update({title:a},b)},redraw:function(){var a=this.chart.pointer;a.reset&&a.reset(!0);this.render();n(this.plotLinesAndBands,function(a){a.render()});n(this.series,function(a){a.isDirty=!0})},buildStacks:function(){var a=this.series,b=a.length;if(!this.isXAxis){for(;b--;)a[b].setStackedPoints();if(this.usePercentage)for(b=0;b<a.length;b++)a[b].setPercentStacks()}},setCategories:function(a,b){this.update({categories:a},
    +b)},destroy:function(a){var b=this,c=b.stacks,d,e=b.plotLinesAndBands;a||aa(b);for(d in c)Ka(c[d]),c[d]=null;n([b.ticks,b.minorTicks,b.alternateBands],function(a){Ka(a)});for(a=e.length;a--;)e[a].destroy();n("stackTotalGroup,axisLine,axisGroup,gridGroup,labelGroup,axisTitle".split(","),function(a){b[a]&&(b[a]=b[a].destroy())})}};wb.prototype={init:function(a,b){var c=b.borderWidth,d=b.style,e=C(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.label=
    +a.renderer.label("",0,0,b.shape,null,null,b.useHTML,null,"tooltip").attr({padding:e,fill:b.backgroundColor,"stroke-width":c,r:b.borderRadius,zIndex:8}).css(d).css({padding:0}).add().attr({y:-999});$||this.label.shadow(b.shadow);this.shared=b.shared},destroy:function(){n(this.crosshairs,function(a){a&&a.destroy()});if(this.label)this.label=this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden;
    +r(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:b,anchorX:g?(2*f.anchorX+c)/3:c,anchorY:g?(f.anchorY+d)/2:d});e.label.attr(f);if(g&&(N(a-f.x)>1||N(b-f.y)>1))clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(){var a=this,b;clearTimeout(this.hideTimer);if(!this.isHidden)b=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){a.label.fadeOut();a.isHidden=!0},o(this.options.hideDelay,500)),b&&n(b,function(a){a.setState()}),this.chart.hoverPoints=
    +null},hideCrosshairs:function(){n(this.crosshairs,function(a){a&&a.hide()})},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=0,h=0,i,a=ja(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===w&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-f]);c||(n(a,function(a){i=a.series.yAxis;g+=a.plotX;h+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&i?i.top-f:0)}),g/=a.length,h/=a.length,c=[e?d.plotWidth-h:g,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-g:
    +h]);return Na(c,t)},getPosition:function(a,b,c){var d=this.chart,e=d.plotLeft,f=d.plotTop,g=d.plotWidth,h=d.plotHeight,i=o(this.options.distance,12),j=c.plotX,c=c.plotY,d=j+e+(d.inverted?i:-a-i),k=c-b+f+15,l;d<7&&(d=e+s(j,0)+i);d+a>e+g&&(d-=d+a-(e+g),k=c-b+f-i,l=!0);k<f+5&&(k=f+5,l&&c>=k&&c<=k+b&&(k=c+f+i));k+b>f+h&&(k=s(f,f+h-b-i));return{x:d,y:k}},defaultFormatter:function(a){var b=this.points||ja(this),c=b[0].series,d;d=[c.tooltipHeaderFormatter(b[0])];n(b,function(a){c=a.series;d.push(c.tooltipFormatter&&
    +c.tooltipFormatter(a)||a.point.tooltipFormatter(c.tooltipOptions.pointFormat))});d.push(a.options.footerFormat||"");return d.join("")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h={},i,j=[];i=e.formatter||this.defaultFormatter;var h=c.hoverPoints,k,l=e.crosshairs,m=this.shared;clearTimeout(this.hideTimer);this.followPointer=ja(a)[0].series.tooltipOptions.followPointer;g=this.getAnchor(a,b);f=g[0];g=g[1];m&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=a,h&&n(h,
    +function(a){a.setState()}),n(a,function(a){a.setState("hover");j.push(a.getLabelConfig())}),h={x:a[0].category,y:a[0].y},h.points=j,a=a[0]):h=a.getLabelConfig();i=i.call(h,this);h=a.series;i===!1?this.hide():(this.isHidden&&(Wa(d),d.attr("opacity",1).show()),d.attr({text:i}),k=e.borderColor||a.color||h.color||"#606060",d.attr({stroke:k}),this.updatePosition({plotX:f,plotY:g}),this.isHidden=!1);if(l){l=ja(l);for(d=l.length;d--;)if(m=a.series,e=m[d?"yAxis":"xAxis"],l[d]&&e)if(h=d?o(a.stackY,a.y):a.x,
    +e.isLog&&(h=na(h)),d===1&&m.modifyValue&&(h=m.modifyValue(h)),e=e.getPlotLinePath(h,1),this.crosshairs[d])this.crosshairs[d].attr({d:e,visibility:"visible"});else{h={"stroke-width":l[d].width||1,stroke:l[d].color||"#C0C0C0",zIndex:l[d].zIndex||2};if(l[d].dashStyle)h.dashstyle=l[d].dashStyle;this.crosshairs[d]=c.renderer.path(e).attr(h).add()}}z(c,"tooltipRefresh",{text:i,x:f+c.plotLeft,y:g+c.plotTop,borderColor:k})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||
    +this.getPosition).call(this,c.width,c.height,a);this.move(t(c.x),t(c.y),a.plotX+b.plotLeft,a.plotY+b.plotTop)}};xb.prototype={init:function(a,b){var c=b.chart,d=c.events,e=$?"":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=e&&!c||f&&c;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(b.tooltip.enabled)a.tooltip=new wb(a,b.tooltip);this.setDOMEvents()},normalize:function(a,b){var c,
    +d,a=a||O.event;if(!a.target)a.target=a.srcElement;a=Xb(a);d=a.touches?a.touches.item(0):a;if(!b)this.chartPosition=b=Wb(this.chart.container);d.pageX===w?(c=s(a.x,a.clientX-b.left),d=a.y):(c=d.pageX-b.left,d=d.pageY-b.top);return r(a,{chartX:t(c),chartY:t(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};n(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},getIndex:function(a){var b=this.chart;return b.inverted?
    +b.plotHeight+b.plotTop-a.chartY:a.chartX-b.plotLeft},runPointActions:function(a){var b=this.chart,c=b.series,d=b.tooltip,e,f=b.hoverPoint,g=b.hoverSeries,h,i,j=b.chartWidth,k=this.getIndex(a);if(d&&this.options.tooltip.shared&&(!g||!g.noSharedTooltip)){e=[];h=c.length;for(i=0;i<h;i++)if(c[i].visible&&c[i].options.enableMouseTracking!==!1&&!c[i].noSharedTooltip&&c[i].tooltipPoints.length&&(b=c[i].tooltipPoints[k])&&b.series)b._dist=N(k-b.clientX),j=I(j,b._dist),e.push(b);for(h=e.length;h--;)e[h]._dist>
    +j&&e.splice(h,1);if(e.length&&e[0].clientX!==this.hoverX)d.refresh(e,a),this.hoverX=e[0].clientX}if(g&&g.tracker){if((b=g.tooltipPoints[k])&&b!==f)b.onMouseOver(a)}else d&&d.followPointer&&!d.isHidden&&(a=d.getAnchor([{}],a),d.updatePosition({plotX:a[0],plotY:a[1]}))},reset:function(a){var b=this.chart,c=b.hoverSeries,d=b.hoverPoint,e=b.tooltip,b=e&&e.shared?b.hoverPoints:d;(a=a&&e&&b)&&ja(b)[0].plotX===w&&(a=!1);if(a)e.refresh(b);else{if(d)d.onMouseOut();if(c)c.onMouseOut();e&&(e.hide(),e.hideCrosshairs());
    +this.hoverX=null}},scaleGroups:function(a,b){var c=this.chart,d;n(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},pinchTranslateDirection:function(a,b,c,d,e,f,g){var h=this.chart,i=a?"x":"y",j=a?"X":"Y",k="chart"+j,l=a?"width":"height",m=h["plot"+(a?"Left":"Top")],p,q,o=1,n=h.inverted,s=h.bounds[a?"h":"v"],
    +t=b.length===1,u=b[0][k],r=c[0][k],w=!t&&b[1][k],v=!t&&c[1][k],x,c=function(){!t&&N(u-w)>20&&(o=N(r-v)/N(u-w));q=(m-r)/o+u;p=h["plot"+(a?"Width":"Height")]/o};c();b=q;b<s.min?(b=s.min,x=!0):b+p>s.max&&(b=s.max-p,x=!0);x?(r-=0.8*(r-g[i][0]),t||(v-=0.8*(v-g[i][1])),c()):g[i]=[r,v];n||(f[i]=q-m,f[l]=p);f=n?1/o:o;e[l]=p;e[i]=b;d[n?a?"scaleY":"scaleX":"scale"+j]=o;d["translate"+j]=f*m+(r-f*u)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=c.tooltip&&c.tooltip.options.followTouchMove,f=a.touches,
    +g=f.length,h=b.lastValidTouch,i=b.zoomHor||b.pinchHor,j=b.zoomVert||b.pinchVert,k=i||j,l=b.selectionMarker,m={},p=g===1&&(b.inClass(a.target,"highcharts-tracker")&&c.runTrackerClick||c.runChartClick),q={};(k||e)&&!p&&a.preventDefault();Na(f,function(a){return b.normalize(a)});if(a.type==="touchstart")n(f,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),h.x=[d[0].chartX,d[1]&&d[1].chartX],h.y=[d[0].chartY,d[1]&&d[1].chartY],n(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"],
    +d=a.minPixelPadding,e=a.toPixels(a.dataMin),f=a.toPixels(a.dataMax),g=I(e,f),e=s(e,f);b.min=I(a.pos,g-d);b.max=s(a.pos+a.len,e+d)}});else if(d.length){if(!l)b.selectionMarker=l=r({destroy:pa},c.plotBox);i&&b.pinchTranslateDirection(!0,d,f,m,l,q,h);j&&b.pinchTranslateDirection(!1,d,f,m,l,q,h);b.hasPinched=k;b.scaleGroups(m,q);!k&&e&&g===1&&this.runPointActions(b.normalize(a))}},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=
    +this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,j=b.plotWidth,k=b.plotHeight,l,m=this.mouseDownX,p=this.mouseDownY;d<h?d=h:d>h+j&&(d=h+j);e<i?e=i:e>i+k&&(e=i+k);this.hasDragged=Math.sqrt(Math.pow(m-d,2)+Math.pow(p-e,2));if(this.hasDragged>10){l=b.isInsidePlot(m-h,p-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!this.selectionMarker)this.selectionMarker=b.renderer.rect(h,i,f?1:j,g?
    +1:k,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();this.selectionMarker&&f&&(d-=m,this.selectionMarker.attr({width:N(d),x:(d>0?0:d)+m}));this.selectionMarker&&g&&(d=e-p,this.selectionMarker.attr({height:N(d),y:(d>0?0:d)+p}));l&&!this.selectionMarker&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this.chart,c=this.hasPinched;if(this.selectionMarker){var d={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},e=this.selectionMarker,f=e.x,g=e.y,h;if(this.hasDragged||
    +c)n(b.axes,function(a){if(a.zoomEnabled){var b=a.horiz,c=a.toValue(b?f:g),b=a.toValue(b?f+e.width:g+e.height);!isNaN(c)&&!isNaN(b)&&(d[a.xOrY+"Axis"].push({axis:a,min:I(c,b),max:s(c,b)}),h=!0)}}),h&&z(b,"selection",d,function(a){b.zoom(r(a,c?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();c&&this.scaleGroups()}if(b)K(b.container,{cursor:b._cursor}),b.cancelClick=this.hasDragged>10,b.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=
    +this.normalize(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(a){this.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,d=b.hoverSeries,a=this.normalize(a,c);c&&d&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){this.reset();this.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart,a=this.normalize(a);a.returnValue=
    +!1;b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=v(a,"class"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf("highcharts-container")!==-1)return!1;a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;if(b&&!b.options.stickyTracking&&!this.inClass(a.toElement||a.relatedTarget,"highcharts-tooltip"))b.onMouseOut()},
    +onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,f=b.inverted,g,h,i,a=this.normalize(a);a.cancelBubble=!0;if(!b.cancelClick)c&&this.inClass(a.target,"highcharts-tracker")?(g=this.chartPosition,h=c.plotX,i=c.plotY,r(c,{pageX:g.left+d+(f?b.plotWidth-i:h),pageY:g.top+e+(f?b.plotHeight-h:i)}),z(c.series,"click",r(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(r(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&z(b,"click",a))},onContainerTouchStart:function(a){var b=
    +this.chart;a.touches.length===1?(a=this.normalize(a),b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)?(this.runPointActions(a),this.pinch(a)):this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchMove:function(a){(a.touches.length===1||a.touches.length===2)&&this.pinch(a)},onDocumentTouchEnd:function(a){this.drop(a)},setDOMEvents:function(){var a=this,b=a.chart.container,c;this._events=c=[[b,"onmousedown","onContainerMouseDown"],[b,"onmousemove","onContainerMouseMove"],[b,"onclick",
    +"onContainerClick"],[b,"mouseleave","onContainerMouseLeave"],[y,"mousemove","onDocumentMouseMove"],[y,"mouseup","onDocumentMouseUp"]];ib&&c.push([b,"ontouchstart","onContainerTouchStart"],[b,"ontouchmove","onContainerTouchMove"],[y,"touchend","onDocumentTouchEnd"]);n(c,function(b){a["_"+b[2]]=function(c){a[b[2]](c)};b[1].indexOf("on")===0?b[0][b[1]]=a["_"+b[2]]:J(b[0],b[1],a["_"+b[2]])})},destroy:function(){var a=this;n(a._events,function(b){b[1].indexOf("on")===0?b[0][b[1]]=null:aa(b[0],b[1],a["_"+
    +b[2]])});delete a._events;clearInterval(a.tooltipTimeout)}};eb.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=o(b.padding,8),f=b.itemMarginTop||0;this.options=b;if(b.enabled)c.baseline=C(d.fontSize)+3+f,c.itemStyle=d,c.itemHiddenStyle=x(d,b.itemHiddenStyle),c.itemMarginTop=f,c.padding=e,c.initialItemX=e,c.initialItemY=e-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.lastLineHeight=0,c.render(),J(c.chart,"endResize",function(){c.positionCheckboxes()})},colorizeItem:function(a,b){var c=this.options,
    +d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.color:g,g=a.options&&a.options.marker,i={stroke:h,fill:h},j;d&&d.css({fill:c,color:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(j in g=a.convertAttribs(g),g)d=g[j],d!==w&&(i[j]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;a.legendGroup&&a.legendGroup.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x=
    +e,f.y=d},destroyItem:function(a){var b=a.checkbox;n(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Ta(a.checkbox)},destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()},positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight;if(b)c=b.translateY,n(this.allItems,function(e){var f=e.checkbox,g;f&&(g=c+f.y+(a||0)+3,K(f,{left:b.translateX+e.legendItemWidth+f.x-
    +20+"px",top:g+"px",display:g>c-6&&g<c+d-6?"":S}))})},renderTitle:function(){var a=this.padding,b=this.options.title,c=0;if(b.text){if(!this.title)this.title=this.chart.renderer.label(b.text,a-3,a-4,null,null,null,null,null,"legend-title").attr({zIndex:1}).css(b.style).add(this.group);a=this.title.getBBox();c=a.height;this.offsetWidth=a.width;this.contentGroup.attr({translateY:c})}this.titleHeight=c},renderItem:function(a){var B;var b=this,c=b.chart,d=c.renderer,e=b.options,f=e.layout==="horizontal",
    +g=e.symbolWidth,h=e.symbolPadding,i=b.itemStyle,j=b.itemHiddenStyle,k=b.padding,l=f?o(e.itemDistance,8):0,m=!e.rtl,p=e.width,q=e.itemMarginBottom||0,n=b.itemMarginTop,A=b.initialItemX,t=a.legendItem,u=a.series||a,r=u.options,w=r.showCheckbox,v=e.useHTML;if(!t&&(a.legendGroup=d.g("legend-item").attr({zIndex:1}).add(b.scrollGroup),u.drawLegendSymbol(b,a),a.legendItem=t=d.text(e.labelFormat?Ca(e.labelFormat,a):e.labelFormatter.call(a),m?g+h:-h,b.baseline,v).css(x(a.visible?i:j)).attr({align:m?"left":
    +"right",zIndex:2}).add(a.legendGroup),(v?t:a.legendGroup).on("mouseover",function(){a.setState("hover");t.css(b.options.itemHoverStyle)}).on("mouseout",function(){t.css(a.visible?i:j);a.setState()}).on("click",function(b){var c=function(){a.setVisible()},b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):z(a,"legendItemClick",b,c)}),b.colorizeItem(a,a.visible),r&&w))a.checkbox=U("input",{type:"checkbox",checked:a.selected,defaultChecked:a.selected},e.itemCheckboxStyle,c.container),
    +J(a.checkbox,"click",function(b){z(a,"checkboxClick",{checked:b.target.checked},function(){a.select()})});d=t.getBBox();B=a.legendItemWidth=e.itemWidth||g+h+d.width+l+(w?20:0),e=B;b.itemHeight=g=d.height;if(f&&b.itemX-A+e>(p||c.chartWidth-2*k-A))b.itemX=A,b.itemY+=n+b.lastLineHeight+q,b.lastLineHeight=0;b.maxItemWidth=s(b.maxItemWidth,e);b.lastItemY=n+b.itemY+q;b.lastLineHeight=s(g,b.lastLineHeight);a._legendItemPos=[b.itemX,b.itemY];f?b.itemX+=e:(b.itemY+=n+g+q,b.lastLineHeight=g);b.offsetWidth=
    +p||s((f?b.itemX-A-l:e)+k,b.offsetWidth)},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,l=j.borderWidth,m=j.backgroundColor;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=[];n(b.series,function(a){var b=a.options;b.showInLegend&&!u(b.linkedTo)&&(e=e.concat(a.legendItems||
    +(b.legendType==="point"?a.data:a)))});Kb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;n(e,function(b){a.renderItem(b)});g=j.width||a.offsetWidth;h=a.lastItemY+a.lastLineHeight+a.titleHeight;h=a.handleOverflow(h);if(l||m){g+=k;h+=k;if(i){if(g>0&&h>0)i[i.isNew?"attr":"animate"](i.crisp(null,null,null,g,h)),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,l||0).attr({stroke:j.borderColor,
    +"stroke-width":l||0,fill:m||S}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;n(e,function(b){a.positionItem(b)});f&&d.align(r({width:g,height:h},j),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h=this.clipRect,i=e.navigation,j=o(i.animation,!0),k=i.arrowSize||12,l=this.nav;e.layout===
    +"horizontal"&&(f/=2);g&&(f=I(f,g));if(a>f&&!e.useHTML){this.clipHeight=c=f-20-this.titleHeight;this.pageCount=xa(a/c);this.currentPage=o(this.currentPage,1);this.fullHeight=a;if(!h)h=b.clipRect=d.clipRect(0,0,9999,0),b.contentGroup.clip(h);h.attr({height:c});if(!l)this.nav=l=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,k,k).on("click",function(){b.scroll(-1,j)}).add(l),this.pager=d.text("",15,10).css(i.style).add(l),this.down=d.symbol("triangle-down",0,0,k,k).on("click",
    +function(){b.scroll(1,j)}).add(l);b.scroll(0);a=f}else if(l)h.attr({height:c.chartHeight}),l.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pageCount,d=this.currentPage+a,e=this.clipHeight,f=this.options.navigation,g=f.activeColor,h=f.inactiveColor,f=this.pager,i=this.padding;d>c&&(d=c);if(d>0)b!==w&&La(b,this.chart),this.nav.attr({translateX:i,translateY:e+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:d===1?h:g}).css({cursor:d===
    +1?"default":"pointer"}),f.attr({text:d+"/"+this.pageCount}),this.down.attr({x:18+this.pager.getBBox().width,fill:d===c?h:g}).css({cursor:d===c?"default":"pointer"}),e=-I(e*(d-1),this.fullHeight-e+i)+1,this.scrollGroup.animate({translateY:e}),f.attr({text:d+"/"+c}),this.currentPage=d,this.positionCheckboxes(e)}};/Trident.*?11\.0/.test(oa)&&mb(eb.prototype,"positionItem",function(a,b){var c=this;setTimeout(function(){a.call(c,b)})});yb.prototype={init:function(a,b){var c,d=a.series;a.series=null;c=
    +x(M,a);c.series=a.series=d;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=this.splashArray("spacing",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=Ga.length;Ga.push(f);d.reflow!==!1&&J(f,"load",function(){f.initReflow()});if(e)for(g in e)J(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=$?!1:o(d.animation,!0);f.pointCount=0;f.counters=new Jb;f.firstRender()},
    +initSeries:function(a){var b=this.options.chart;(b=W[a.type||b.type||b.defaultSeriesType])||ka(17,!0);b=new b;b.init(this,a);return b},addSeries:function(a,b,c){var d,e=this;a&&(b=o(b,!0),z(e,"addSeries",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?"xAxis":"yAxis",f=this.options;new db(this,x(a,{index:this[e].length,isX:b}));f[e]=ja(f[e]||{});f[e].push(a);o(c,!0)&&this.redraw(d)},isInsidePlot:function(a,b,
    +c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&n(this.axes,function(a){a.adjustTickAmount()});this.maxTicks=null},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.isDirtyBox,j=c.length,k=j,l=this.renderer,m=l.isHidden(),p=[];La(a,this);m&&this.cloneRenderTo();for(this.layOutTitles();k--;)if(a=c[k],a.options.stacking&&(g=!0,a.isDirty)){h=!0;
    +break}if(h)for(k=j;k--;)if(a=c[k],a.options.stacking)a.isDirty=!0;n(c,function(a){a.isDirty&&a.options.legendType==="point"&&(f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(this.hasCartesianSeries){if(!this.isResizing)this.maxTicks=null,n(b,function(a){a.setScale()});this.adjustTickAmounts();this.getMargins();n(b,function(a){a.isDirty&&(i=!0)});n(b,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=!1,p.push(function(){z(a,"afterSetExtremes",r(a.eventArgs,
    +a.getExtremes()));delete a.eventArgs});(i||g)&&a.redraw()})}i&&this.drawChartBox();n(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset&&d.reset(!0);l.draw();z(this,"redraw");m&&this.cloneRenderTo(!0);n(p,function(a){a.call()})},showLoading:function(a){var b=this.options,c=this.loadingDiv,d=b.loading;if(!c)this.loadingDiv=c=U(Ea,{className:"highcharts-loading"},r(d.style,{zIndex:10,display:S}),this.container),this.loadingSpan=U("span",null,d.labelStyle,c);this.loadingSpan.innerHTML=
    +a||b.lang.loading;if(!this.loadingShown)K(c,{opacity:0,display:"",left:this.plotLeft+"px",top:this.plotTop+"px",width:this.plotWidth+"px",height:this.plotHeight+"px"}),Bb(c,{opacity:d.style.opacity},{duration:d.showDuration||0}),this.loadingShown=!0},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&Bb(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){K(b,{display:S})}});this.loadingShown=!1},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;d<b.length;d++)if(b[d].options.id===
    +a)return b[d];for(d=0;d<c.length;d++)if(c[d].options.id===a)return c[d];for(d=0;d<c.length;d++){e=c[d].points||[];for(b=0;b<e.length;b++)if(e[b].id===a)return e[b]}return null},getAxes:function(){var a=this,b=this.options,c=b.xAxis=ja(b.xAxis||{}),b=b.yAxis=ja(b.yAxis||{});n(c,function(a,b){a.index=b;a.isX=!0});n(b,function(a,b){a.index=b});c=c.concat(b);n(c,function(b){new db(a,b)});a.adjustTickAmounts()},getSelectedPoints:function(){var a=[];n(this.series,function(b){a=a.concat(ub(b.points||[],
    +function(a){return a.selected}))});return a},getSelectedSeries:function(){return ub(this.series,function(a){return a.selected})},getStacks:function(){var a=this;n(a.yAxis,function(a){if(a.stacks&&a.hasVisibleSeries)a.oldStacks=a.stacks});n(a.series,function(b){if(b.options.stacking&&(b.visible===!0||a.options.chart.ignoreHiddenSeries===!1))b.stackKey=b.type+o(b.options.stack,"")})},showResetZoom:function(){var a=this,b=M.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=c.relativeTo===
    +"chart"?null:"plotBox";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).add().align(c.position,!1,f)},zoomOut:function(){var a=this;z(a,"selection",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var b,c=this.pointer,d=!1,e;!a||a.resetSelection?n(this.axes,function(a){b=a.zoom()}):n(a.xAxis.concat(a.yAxis),function(a){var e=a.axis,h=e.isXAxis;if(c[h?"zoomX":"zoomY"]||c[h?"pinchX":"pinchY"])b=
    +e.zoom(a.min,a.max),e.displayBtn&&(d=!0)});e=this.resetZoomButton;if(d&&!e)this.showResetZoom();else if(!d&&T(e))this.resetZoomButton=e.destroy();b&&this.redraw(o(this.options.chart.animation,a&&a.animation,this.pointCount<100))},pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&n(d,function(a){a.setState()});n(b==="xy"?[1,0]:[1],function(b){var d=a[b?"chartX":"chartY"],h=c[b?"xAxis":"yAxis"][0],i=c[b?"mouseDownX":"mouseDownY"],j=(h.pointRange||0)/2,k=h.getExtremes(),l=h.toValue(i-d,!0)+j,i=h.toValue(i+
    +c[b?"plotWidth":"plotHeight"]-d,!0)-j;h.series.length&&l>I(k.dataMin,k.min)&&i<s(k.dataMax,k.max)&&(h.setExtremes(l,i,!1,!1,{trigger:"pan"}),e=!0);c[b?"mouseDownX":"mouseDownY"]=d});e&&c.redraw(!1);K(c.container,{cursor:"move"})},setTitle:function(a,b){var f;var c=this,d=c.options,e;e=d.title=x(d.title,a);f=d.subtitle=x(d.subtitle,b),d=f;n([["title",a,e],["subtitle",b,d]],function(a){var b=a[0],d=c[b],e=a[1],a=a[2];d&&e&&(c[b]=d=d.destroy());a&&a.text&&!d&&(c[b]=c.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,
    +"class":"highcharts-"+b,zIndex:a.zIndex||4}).css(a.style).add())});c.layOutTitles()},layOutTitles:function(){var a=0,b=this.title,c=this.subtitle,d=this.options,e=d.title,d=d.subtitle,f=this.spacingBox.width-44;if(b&&(b.css({width:(e.width||f)+"px"}).align(r({y:15},e),!1,"spacingBox"),!e.floating&&!e.verticalAlign))a=b.getBBox().height,a>=18&&a<=25&&(a=15);c&&(c.css({width:(d.width||f)+"px"}).align(r({y:a+e.margin},d),!1,"spacingBox"),!d.floating&&!d.verticalAlign&&(a=xa(a+c.getBBox().height)));this.titleOffset=
    +a},getChartSize:function(){var a=this.options.chart,b=this.renderToClone||this.renderTo;this.containerWidth=jb(b,"width");this.containerHeight=jb(b,"height");this.chartWidth=s(0,a.width||this.containerWidth||600);this.chartHeight=s(0,o(a.height,this.containerHeight>19?this.containerHeight:400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Ta(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=
    +b=this.renderTo.cloneNode(0),K(b,{position:"absolute",top:"-9999px",display:"block"}),y.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options.chart,c,d,e;this.renderTo=a=b.renderTo;e="highcharts-"+zb++;if(ea(a))this.renderTo=a=y.getElementById(a);a||ka(13,!0);c=C(v(a,"data-highcharts-chart"));!isNaN(c)&&Ga[c]&&Ga[c].destroy();v(a,"data-highcharts-chart",this.index);a.innerHTML="";a.offsetWidth||this.cloneRenderTo();this.getChartSize();c=this.chartWidth;d=this.chartHeight;
    +this.container=a=U(Ea,{className:"highcharts-container"+(b.className?" "+b.className:""),id:e},r({position:"relative",overflow:"hidden",width:c+"px",height:d+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},b.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=b.forExport?new Ha(a,c,d,!0):new Va(a,c,d);$&&this.renderer.create(this,a,c,d)},getMargins:function(){var a=this.spacing,b,c=this.legend,d=this.margin,e=this.options.legend,
    +f=o(e.margin,10),g=e.x,h=e.y,i=e.align,j=e.verticalAlign,k=this.titleOffset;this.resetMargins();b=this.axisOffset;if(k&&!u(d[0]))this.plotTop=s(this.plotTop,k+this.options.title.margin+a[0]);if(c.display&&!e.floating)if(i==="right"){if(!u(d[1]))this.marginRight=s(this.marginRight,c.legendWidth-g+f+a[1])}else if(i==="left"){if(!u(d[3]))this.plotLeft=s(this.plotLeft,c.legendWidth+g+f+a[3])}else if(j==="top"){if(!u(d[0]))this.plotTop=s(this.plotTop,c.legendHeight+h+f+a[0])}else if(j==="bottom"&&!u(d[2]))this.marginBottom=
    +s(this.marginBottom,c.legendHeight-h+f+a[2]);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);this.hasCartesianSeries&&n(this.axes,function(a){a.getOffset()});u(d[3])||(this.plotLeft+=b[3]);u(d[0])||(this.plotTop+=b[0]);u(d[2])||(this.marginBottom+=b[2]);u(d[1])||(this.marginRight+=b[1]);this.setChartSize()},initReflow:function(){function a(a){var g=c.width||jb(d,"width"),h=c.height||jb(d,"height"),a=a?a.target:O;if(!b.hasUserSize&&
    +g&&h&&(a===O||a===y)){if(g!==b.containerWidth||h!==b.containerHeight)clearTimeout(e),b.reflowTimeout=e=setTimeout(function(){if(b.container)b.setSize(g,h,!1),b.hasUserSize=null},100);b.containerWidth=g;b.containerHeight=h}}var b=this,c=b.options.chart,d=b.renderTo,e;b.reflow=a;J(O,"resize",a);J(b,"destroy",function(){aa(O,"resize",a)})},setSize:function(a,b,c){var d=this,e,f,g;d.isResizing+=1;g=function(){d&&z(d,"endResize",null,function(){d.isResizing-=1})};La(c,d);d.oldChartHeight=d.chartHeight;
    +d.oldChartWidth=d.chartWidth;if(u(a))d.chartWidth=e=s(0,t(a)),d.hasUserSize=!!e;if(u(b))d.chartHeight=f=s(0,t(b));K(d.container,{width:e+"px",height:f+"px"});d.setChartSize(!0);d.renderer.setSize(e,f,c);d.maxTicks=null;n(d.axes,function(a){a.isDirty=!0;a.setScale()});n(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.getMargins();d.redraw(c);d.oldChartHeight=null;z(d,"resize");Fa===!1?g():setTimeout(g,Fa&&Fa.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,
    +d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,j,k,l;this.plotLeft=i=t(this.plotLeft);this.plotTop=j=t(this.plotTop);this.plotWidth=k=s(0,t(d-i-this.marginRight));this.plotHeight=l=s(0,t(e-j-this.marginBottom));this.plotSizeX=b?l:k;this.plotSizeY=b?k:l;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:j,width:k,height:l};d=2*P(this.plotBorderWidth/2);
    +b=xa(s(d,h[3])/2);c=xa(s(d,h[0])/2);this.clipBox={x:b,y:c,width:P(this.plotSizeX-s(d,h[1])/2-b),height:P(this.plotSizeY-s(d,h[2])/2-c)};a||n(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this.spacing,b=this.margin;this.plotTop=o(b[0],a[0]);this.marginRight=o(b[1],a[1]);this.marginBottom=o(b[2],a[2]);this.plotLeft=o(b[3],a[3]);this.axisOffset=[0,0,0,0];this.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,
    +d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth||0,p,q=this.plotLeft,o=this.plotTop,n=this.plotWidth,s=this.plotHeight,t=this.plotBox,u=this.clipRect,r=this.clipBox;p=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp(null,null,null,c-p,d-p));else{e={fill:j||S};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground=b.rect(p/2,p/
    +2,c-p,d-p,a.borderRadius,i).attr(e).add().shadow(a.shadow)}if(k)f?f.animate(t):this.plotBackground=b.rect(q,o,n,s,0).attr({fill:k}).add().shadow(a.plotShadow);if(l)h?h.animate(t):this.plotBGImage=b.image(l,q,o,n,s).add();u?u.animate({width:r.width,height:r.height}):this.clipRect=b.clipRect(r);if(m)g?g.animate(g.crisp(null,q,o,n,s)):this.plotBorder=b.rect(q,o,n,s,0,-m).attr({stroke:a.plotBorderColor,"stroke-width":m,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,
    +c,d=a.options.series,e,f;n(["inverted","angular","polar"],function(g){c=W[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=W[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;n(b,function(a){a.linkedSeries.length=0});n(b,function(b){var d=b.options.linkedTo;if(ea(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),b.linkedParent=d})},render:function(){var a=this,b=a.axes,c=a.renderer,d=a.options,
    +e=d.labels,f=d.credits,g;a.setTitle();a.legend=new eb(a,d.legend);a.getStacks();n(b,function(a){a.setScale()});a.getMargins();a.maxTicks=null;n(b,function(a){a.setTickPositions(!0);a.setMaxTicks()});a.adjustTickAmounts();a.getMargins();a.drawChartBox();a.hasCartesianSeries&&n(b,function(a){a.render()});if(!a.seriesGroup)a.seriesGroup=c.g("series-group").attr({zIndex:3}).add();n(a.series,function(a){a.translate();a.setTooltipPoints();a.render()});e.items&&n(e.items,function(b){var d=r(e.style,b.style),
    +f=C(d.left)+a.plotLeft,g=C(d.top)+a.plotTop+12;delete d.left;delete d.top;c.text(b.html,f,g).attr({zIndex:2}).css(d).add()});if(f.enabled&&!a.credits)g=f.href,a.credits=c.text(f.text,0,0).on("click",function(){if(g)location.href=g}).attr({align:f.position.align,zIndex:8}).css(f.style).add().align(f.position);a.hasRendered=!0},destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;z(a,"destroy");Ga[a.index]=w;a.renderTo.removeAttribute("data-highcharts-chart");aa(a);for(e=
    +b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();n("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML="",aa(d),f&&Ta(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!Z&&O==O.top&&y.readyState!=="complete"||$&&!O.canvg?($?Tb.push(function(){a.firstRender()},
    +a.options.global.canvasToolsURL):y.attachEvent("onreadystatechange",function(){y.detachEvent("onreadystatechange",a.firstRender);y.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender())a.getContainer(),z(a,"init"),a.resetMargins(),a.setChartSize(),a.propFromSeries(),a.getAxes(),n(b.series||[],function(b){a.initSeries(b)}),a.linkSeries(),z(a,"beforeRender"),a.pointer=new xb(a,b),a.render(),a.renderer.draw(),c&&c.apply(a,
    +[a]),n(a.callbacks,function(b){b.apply(a,[a])}),a.cloneRenderTo(!0),z(a,"load")},splashArray:function(a,b){var c=b[a],c=T(c)?c:[c,c,c,c];return[o(b[a+"Top"],c[0]),o(b[a+"Right"],c[1]),o(b[a+"Bottom"],c[2]),o(b[a+"Left"],c[3])]}};yb.prototype.callbacks=[];var Pa=function(){};Pa.prototype={init:function(a,b,c){this.series=a;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++],a.colorCounter===b.length))a.colorCounter=
    +0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.pointValKey,a=Pa.prototype.optionsToObject.call(this,a);r(this,a);this.options=this.options?r(this.options,a):a;if(d)this.y=this[d];if(this.x===w&&c)this.x=b===w?c.autoIncrement():b;return this},optionsToObject:function(a){var b,c=this.series,d=c.pointArrayMap||["y"],e=d.length,f=0,g=0;if(typeof a==="number"||a===null)b={y:a};else if(Ia(a)){b={};if(a.length>e){c=typeof a[0];if(c==="string")b.name=a[0];else if(c===
    +"number")b.x=a[0];f++}for(;g<e;)b[d[g++]]=a[f++]}else if(typeof a==="object"){b=a;if(a.dataLabels)c._hasPointLabels=!0;if(a.marker)c._hasPointMarkers=!0}return b},destroy:function(){var a=this.series.chart,b=a.hoverPoints,c;a.pointCount--;if(b&&(this.setState(),ga(b,this),!b.length))a.hoverPoints=null;if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)aa(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(c in this)this[c]=null},destroyElements:function(){for(var a=
    +"graphic,dataLabel,dataLabelUpper,group,connector,shadowGroup".split(","),b,c=6;c--;)b=a[c],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},select:function(a,b){var c=this,d=c.series,e=d.chart,a=o(a,!c.selected);c.firePointEvent(a?"select":"unselect",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[qa(c,d.data)]=
    +c.options;c.setState(a&&"select");b||n(e.getSelectedPoints(),function(a){if(a.selected&&a!==c)a.selected=a.options.selected=!1,d.options.data[qa(a,d.data)]=a.options,a.setState(""),a.firePointEvent("unselect")})})},onMouseOver:function(a){var b=this.series,c=b.chart,d=c.tooltip,e=c.hoverPoint;if(e&&e!==this)e.onMouseOut();this.firePointEvent("mouseOver");d&&(!d.shared||b.noSharedTooltip)&&d.refresh(this,a);this.setState("hover");c.hoverPoint=this},onMouseOut:function(){var a=this.series.chart,b=a.hoverPoints;
    +if(!b||qa(this,b)===-1)this.firePointEvent("mouseOut"),this.setState(),a.hoverPoint=null},tooltipFormatter:function(a){var b=this.series,c=b.tooltipOptions,d=o(c.valueDecimals,""),e=c.valuePrefix||"",f=c.valueSuffix||"";n(b.pointArrayMap||["y"],function(b){b="{point."+b;if(e||f)a=a.replace(b+"}",e+b+"}"+f);a=a.replace(b+"}",b+":,."+d+"f}")});return Ca(a,{point:this,series:this.series})},update:function(a,b,c){var d=this,e=d.series,f=d.graphic,g,h=e.data,i=e.chart,j=e.options,b=o(b,!0);d.firePointEvent("update",
    +{options:a},function(){d.applyOptions(a);if(T(a)&&(e.getAttribs(),f))a.marker&&a.marker.symbol?d.graphic=f.destroy():f.attr(d.pointAttr[d.state||""]);g=qa(d,h);e.xData[g]=d.x;e.yData[g]=e.toYData?e.toYData(d):d.y;e.zData[g]=d.z;j.data[g]=d.options;e.isDirty=e.isDirtyData=!0;if(!e.fixedBox&&e.hasCartesianSeries)i.isDirtyBox=!0;j.legendType==="point"&&i.legend.destroyItem(d);b&&i.redraw(c)})},remove:function(a,b){var c=this,d=c.series,e=d.points,f=d.chart,g,h=d.data;La(b,f);a=o(a,!0);c.firePointEvent("remove",
    +null,function(){g=qa(c,h);h.length===e.length&&e.splice(g,1);h.splice(g,1);d.options.data.splice(g,1);d.xData.splice(g,1);d.yData.splice(g,1);d.zData.splice(g,1);c.destroy();d.isDirty=!0;d.isDirtyData=!0;a&&f.redraw()})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();a==="click"&&e.allowPointSelect&&(c=function(a){d.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});z(this,a,b,c)},importEvents:function(){if(!this.hasImportedEvents){var a=
    +x(this.series.options.point,this.options).events,b;this.events=a;for(b in a)J(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a){var b=this.plotX,c=this.plotY,d=this.series,e=d.options.states,f=Y[d.type].marker&&d.options.marker,g=f&&!f.enabled,h=f&&f.states[a],i=h&&h.enabled===!1,j=d.stateMarkerGraphic,k=this.marker||{},l=d.chart,m=this.pointAttr,a=a||"";if(!(a===this.state||this.selected&&a!=="select"||e[a]&&e[a].enabled===!1||a&&(i||g&&!h.enabled))){if(this.graphic)e=f&&this.graphic.symbolName&&
    +m[a].r,this.graphic.attr(x(m[a],e?{x:b-e,y:c-e,width:2*e,height:2*e}:{}));else{if(a&&h)e=h.radius,k=k.symbol||d.symbol,j&&j.currentSymbol!==k&&(j=j.destroy()),j?j.attr({x:b-e,y:c-e}):(d.stateMarkerGraphic=j=l.renderer.symbol(k,b-e,c-e,2*e,2*e).attr(m[a]).add(d.markerGroup),j.currentSymbol=k);if(j)j[a&&l.isInsidePlot(b,c)?"show":"hide"]()}this.state=a}}};var Q=function(){};Q.prototype={isCartesian:!0,type:"line",pointClass:Pa,sorted:!0,requireSorting:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",
    +fill:"fillColor",r:"radius"},colorCounter:0,init:function(a,b){var c,d,e=a.series;this.chart=a;this.options=b=this.setOptions(b);this.linkedSeries=[];this.bindAxes();r(this,{name:b.name,state:"",pointAttr:{},visible:b.visible!==!1,selected:b.selected===!0});if($)b.animation=!1;d=b.events;for(c in d)J(this,c,d[c]);if(d&&d.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;this.getColor();this.getSymbol();this.setData(b.data,!1);if(this.isCartesian)a.hasCartesianSeries=
    +!0;e.push(this);this._i=e.length-1;Kb(e,function(a,b){return o(a.options.index,a._i)-o(b.options.index,a._i)});n(e,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart,d;a.isCartesian&&n(["xAxis","yAxis"],function(e){n(c[e],function(c){d=c.options;if(b[e]===d.index||b[e]!==w&&b[e]===d.id||b[e]===w&&d.index===0)c.series.push(a),a[e]=c,c.isDirty=!0});a[e]||ka(18,!0)})},autoIncrement:function(){var a=this.options,b=this.xIncrement,b=o(b,a.pointStart,
    +0);this.pointInterval=o(this.pointInterval,a.pointInterval,1);this.xIncrement=b+this.pointInterval;return b},getSegments:function(){var a=-1,b=[],c,d=this.points,e=d.length;if(e)if(this.options.connectNulls){for(c=e;c--;)d[c].y===null&&d.splice(c,1);d.length&&(b=[d])}else n(d,function(c,g){c.y===null?(g>a+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart.options,c=b.plotOptions,d=c[this.type];this.userOptions=a;a=x(d,c.series,
    +a);this.tooltipOptions=x(b.tooltip,a.tooltip);d.marker===null&&delete a.marker;return a},getColor:function(){var a=this.options,b=this.userOptions,c=this.chart.options.colors,d=this.chart.counters,e;e=a.color||Y[this.type].color;if(!e&&!a.colorByPoint)u(b._colorIndex)?a=b._colorIndex:(b._colorIndex=d.color,a=d.color++),e=c[a];this.color=e;d.wrapColor(c.length)},getSymbol:function(){var a=this.userOptions,b=this.options.marker,c=this.chart,d=c.options.symbols,c=c.counters;this.symbol=b.symbol;if(!this.symbol)u(a._symbolIndex)?
    +a=a._symbolIndex:(a._symbolIndex=c.symbol,a=c.symbol++),this.symbol=d[a];if(/^url/.test(this.symbol))b.radius=0;c.wrapSymbol(d.length)},drawLegendSymbol:function(a){var b=this.options,c=b.marker,d=a.options,e;e=d.symbolWidth;var f=this.chart.renderer,g=this.legendGroup,a=a.baseline-t(f.fontMetrics(d.itemStyle.fontSize).b*0.3);if(b.lineWidth){d={"stroke-width":b.lineWidth};if(b.dashStyle)d.dashstyle=b.dashStyle;this.legendLine=f.path(["M",0,a,"L",e,a]).attr(d).add(g)}if(c&&c.enabled)b=c.radius,this.legendSymbol=
    +e=f.symbol(this.symbol,e/2-b,a-b,2*b,2*b).add(g),e.isMarker=!0},addPoint:function(a,b,c,d){var e=this.options,f=this.data,g=this.graph,h=this.area,i=this.chart,j=this.xData,k=this.yData,l=this.zData,m=this.names,p=g&&g.shift||0,q=e.data,s;La(d,i);c&&n([g,h,this.graphNeg,this.areaNeg],function(a){if(a)a.shift=p+1});if(h)h.isArea=!0;b=o(b,!0);d={series:this};this.pointClass.prototype.applyOptions.apply(d,[a]);g=d.x;h=j.length;if(this.requireSorting&&g<j[h-1])for(s=!0;h&&j[h-1]>g;)h--;j.splice(h,0,g);
    +k.splice(h,0,this.toYData?this.toYData(d):d.y);l.splice(h,0,d.z);if(m)m[g]=d.name;q.splice(h,0,a);s&&(this.data.splice(h,0,null),this.processData());e.legendType==="point"&&this.generatePoints();c&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),j.shift(),k.shift(),l.shift(),q.shift()));this.isDirtyData=this.isDirty=!0;b&&(this.getAttribs(),i.redraw())},setData:function(a,b){var c=this.points,d=this.options,e=this.chart,f=null,g=this.xAxis,h=g&&g.categories&&!g.categories.length?[]:null,i;this.xIncrement=
    +null;this.pointRange=g&&g.categories?1:d.pointRange;this.colorCounter=0;var j=[],k=[],l=[],m=a?a.length:[];i=o(d.turboThreshold,1E3);var p=this.pointArrayMap,p=p&&p.length,q=!!this.toYData;if(i&&m>i){for(i=0;f===null&&i<m;)f=a[i],i++;if(sa(f)){f=o(d.pointStart,0);d=o(d.pointInterval,1);for(i=0;i<m;i++)j[i]=f,k[i]=a[i],f+=d;this.xIncrement=f}else if(Ia(f))if(p)for(i=0;i<m;i++)d=a[i],j[i]=d[0],k[i]=d.slice(1,p+1);else for(i=0;i<m;i++)d=a[i],j[i]=d[0],k[i]=d[1];else ka(12)}else for(i=0;i<m;i++)if(a[i]!==
    +w&&(d={series:this},this.pointClass.prototype.applyOptions.apply(d,[a[i]]),j[i]=d.x,k[i]=q?this.toYData(d):d.y,l[i]=d.z,h&&d.name))h[d.x]=d.name;ea(k[0])&&ka(14,!0);this.data=[];this.options.data=a;this.xData=j;this.yData=k;this.zData=l;this.names=h;for(i=c&&c.length||0;i--;)c[i]&&c[i].destroy&&c[i].destroy();if(g)g.minRange=g.userMinRange;this.isDirty=this.isDirtyData=e.isDirtyBox=!0;o(b,!0)&&e.redraw(!1)},remove:function(a,b){var c=this,d=c.chart,a=o(a,!0);if(!c.isRemoving)c.isRemoving=!0,z(c,"remove",
    +null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();a&&d.redraw(b)});c.isRemoving=!1},processData:function(a){var b=this.xData,c=this.yData,d=b.length,e;e=0;var f,g,h=this.xAxis,i=this.options,j=i.cropThreshold,k=this.isCartesian;if(k&&!this.isDirty&&!h.isDirty&&!this.yAxis.isDirty&&!a)return!1;if(k&&this.sorted&&(!j||d>j||this.forceCrop))if(a=h.min,h=h.max,b[d-1]<a||b[0]>h)b=[],c=[];else if(b[0]<a||b[d-1]>h)e=this.cropData(this.xData,this.yData,a,h),b=e.xData,c=e.yData,e=e.start,
    +f=!0;for(h=b.length-1;h>=0;h--)d=b[h]-b[h-1],d>0&&(g===w||d<g)?g=d:d<0&&this.requireSorting&&ka(15);this.cropped=f;this.cropStart=e;this.processedXData=b;this.processedYData=c;if(i.pointRange===null)this.pointRange=g||1;this.closestPointRange=g},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,h=o(this.cropShoulder,1),i;for(i=0;i<e;i++)if(a[i]>=c){f=s(0,i-h);break}for(;i<e;i++)if(a[i]>d){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,
    +b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,l=[],m;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(m=0;m<g;m++)i=h+m,j?l[m]=(new f).init(this,[d[m]].concat(ja(e[m]))):(b[i]?k=b[i]:a[i]!==w&&(b[i]=k=(new f).init(this,a[i],d[m])),l[m]=k);if(b&&(g!==(c=b.length)||j))for(m=0;m<c;m++)if(m===h&&!j&&(m+=g),b[m])b[m].destroyElements(),b[m].plotX=w;this.data=b;this.points=l},setStackedPoints:function(){if(this.options.stacking&&
    +!(this.visible!==!0&&this.chart.options.chart.ignoreHiddenSeries!==!1)){var a=this.processedXData,b=this.processedYData,c=[],d=b.length,e=this.options,f=e.threshold,g=e.stack,e=e.stacking,h=this.stackKey,i="-"+h,j=this.negStacks,k=this.yAxis,l=k.stacks,m=k.oldStacks,p,q,o,n,t;for(o=0;o<d;o++){n=a[o];t=b[o];q=(p=j&&t<f)?i:h;l[q]||(l[q]={});if(!l[q][n])m[q]&&m[q][n]?(l[q][n]=m[q][n],l[q][n].total=null):l[q][n]=new Mb(k,k.options.stackLabels,p,n,g,e);q=l[q][n];q.points[this.index]=[q.cum||0];e==="percent"?
    +(p=p?h:i,j&&l[p]&&l[p][n]?(p=l[p][n],q.total=p.total=s(p.total,q.total)+N(t)||0):q.total+=N(t)||0):q.total+=t||0;q.cum=(q.cum||0)+(t||0);q.points[this.index].push(q.cum);c[o]=q.cum}if(e==="percent")k.usePercentage=!0;this.stackedYData=c;k.oldStacks={}}},setPercentStacks:function(){var a=this,b=a.stackKey,c=a.yAxis.stacks;n([b,"-"+b],function(b){var d;for(var e=a.xData.length,f,g;e--;)if(f=a.xData[e],d=(g=c[b]&&c[b][f])&&g.points[a.index],f=d)g=g.total?100/g.total:0,f[0]=ia(f[0]*g),f[1]=ia(f[1]*g),
    +a.stackedYData[e]=f[1]})},getExtremes:function(){var a=this.yAxis,b=this.processedXData,c=this.stackedYData||this.processedYData,d=c.length,e=[],f=0,g=this.xAxis.getExtremes(),h=g.min,g=g.max,i,j,k,l;for(l=0;l<d;l++)if(j=b[l],k=c[l],i=k!==null&&k!==w&&(!a.isLog||k.length||k>0),j=this.getExtremesFromAll||this.cropped||(b[l+1]||j)>=h&&(b[l-1]||j)<=g,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]=k;this.dataMin=o(void 0,Ja(e));this.dataMax=o(void 0,va(e))},translate:function(){this.processedXData||
    +this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,j=i==="between"||sa(i),k=a.threshold,a=0;a<g;a++){var l=f[a],m=l.x,p=l.y,q=l.low,n=e.stacks[(this.negStacks&&p<k?"-":"")+this.stackKey];if(e.isLog&&p<=0)l.y=p=null;l.plotX=c.translate(m,0,0,0,1,i,this.type==="flags");if(b&&this.visible&&n&&n[m])n=n[m],p=n.points[this.index],q=p[0],p=p[1],q===0&&(q=o(k,e.min)),e.isLog&&
    +q<=0&&(q=null),l.percentage=b==="percent"&&p,l.total=l.stackTotal=n.total,l.stackY=p,n.setOffset(this.pointXOffset||0,this.barW||0);l.yBottom=u(q)?e.translate(q,0,1,0,1):null;h&&(p=this.modifyValue(p,l));l.plotY=typeof p==="number"&&p!==Infinity?e.translate(p,0,1,0,1):w;l.clientX=j?c.translate(m,0,0,0,1):l.plotX;l.negative=l.y<(k||0);l.category=d&&d[l.x]!==w?d[l.x]:l.x}this.getSegments()},setTooltipPoints:function(a){var b=[],c,d,e=this.xAxis,f=e&&e.getExtremes(),g=e?e.tooltipLen||e.len:this.chart.plotSizeX,
    +h,i,j=[];if(this.options.enableMouseTracking!==!1){if(a)this.tooltipPoints=null;n(this.segments||this.points,function(a){b=b.concat(a)});e&&e.reversed&&(b=b.reverse());this.orderTooltipPoints&&this.orderTooltipPoints(b);a=b.length;for(i=0;i<a;i++)if(e=b[i],c=e.x,c>=f.min&&c<=f.max){h=b[i+1];c=d===w?0:d+1;for(d=b[i+1]?I(s(0,P((e.clientX+(h?h.wrappedClientX||h.clientX:g))/2)),g):g;c>=0&&c<=d;)j[c++]=e}this.tooltipPoints=j}},tooltipHeaderFormatter:function(a){var b=this.tooltipOptions,c=b.xDateFormat,
    +d=b.dateTimeLabelFormats,e=this.xAxis,f=e&&e.options.type==="datetime",b=b.headerFormat,e=e&&e.closestPointRange,g;if(f&&!c)if(e)for(g in D){if(D[g]>=e){c=d[g];break}}else c=d.day;f&&c&&sa(a.key)&&(b=b.replace("{point.key}","{point.key:"+c+"}"));return Ca(b,{point:a,series:this})},onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&z(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options,
    +b=this.chart,c=b.tooltip,d=b.hoverPoint;if(d)d.onMouseOut();this&&a.events.mouseOut&&z(this,"mouseOut");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&&c.hide();this.setState();b.hoverSeries=null},animate:function(a){var b=this,c=b.chart,d=c.renderer,e;e=b.options.animation;var f=c.clipBox,g=c.inverted,h;if(e&&!T(e))e=Y[b.type].animation;h="_sharedClip"+e.duration+e.easing;if(a)a=c[h],e=c[h+"m"],a||(c[h]=a=d.clipRect(r(f,{width:0})),c[h+"m"]=e=d.clipRect(-99,g?-c.plotLeft:-c.plotTop,99,g?
    +c.chartWidth:c.chartHeight)),b.group.clip(a),b.markerGroup.clip(e),b.sharedClipKey=h;else{if(a=c[h])a.animate({width:c.plotSizeX},e),c[h+"m"].animate({width:c.plotSizeX+99},e);b.animate=null;b.animationTimeout=setTimeout(function(){b.afterAnimate()},e.duration)}},afterAnimate:function(){var a=this.chart,b=this.sharedClipKey,c=this.group;c&&this.options.clip!==!1&&(c.clip(a.clipRect),this.markerGroup.clip());setTimeout(function(){b&&a[b]&&(a[b]=a[b].destroy(),a[b+"m"]=a[b+"m"].destroy())},100)},drawPoints:function(){var a,
    +b=this.points,c=this.chart,d,e,f,g,h,i,j,k,l=this.options.marker,m,p=this.markerGroup;if(l.enabled||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=P(g.plotX),e=g.plotY,k=g.graphic,i=g.marker||{},a=l.enabled&&i.enabled===w||i.enabled,m=c.isInsidePlot(t(d),e,c.inverted),a&&e!==w&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""],h=a.r,i=o(i.symbol,this.symbol),j=i.indexOf("url")===0,k)k.attr({visibility:m?Z?"inherit":"visible":"hidden"}).animate(r({x:d-h,y:e-h},k.symbolName?{width:2*
    +h,height:2*h}:{}));else{if(m&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h).attr(a).add(p)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=o(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=Y[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color,h={stroke:g,fill:g},i=a.points||[],j=[],k,l=a.pointAttrToOptions,m=b.negativeColor,p=c.lineColor,q;
    +b.marker?(e.radius=e.radius||c.radius+2,e.lineWidth=e.lineWidth||c.lineWidth+1):e.color=e.color||ra(e.color||g).brighten(e.brightness).get();j[""]=a.convertAttribs(c,h);n(["hover","select"],function(b){j[b]=a.convertAttribs(d[b],j[""])});a.pointAttr=j;for(g=i.length;g--;){h=i[g];if((c=h.options&&h.options.marker||h.options)&&c.enabled===!1)c.radius=0;if(h.negative&&m)h.color=h.fillColor=m;f=b.colorByPoint||h.color;if(h.options)for(q in l)u(c[l[q]])&&(f=!0);if(f){c=c||{};k=[];d=c.states||{};f=d.hover=
    +d.hover||{};if(!b.marker)f.color=ra(f.color||h.color).brighten(f.brightness||e.brightness).get();k[""]=a.convertAttribs(r({color:h.color,fillColor:h.color,lineColor:p===null?h.color:w},c),j[""]);k.hover=a.convertAttribs(d.hover,j.hover,k[""]);k.select=a.convertAttribs(d.select,j.select,k[""])}else k=j;h.pointAttr=k}},update:function(a,b){var c=this.chart,d=this.type,e=W[d].prototype,f,a=x(this.userOptions,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1);
    +for(f in e)e.hasOwnProperty(f)&&(this[f]=w);r(this,W[a.type||d].prototype);this.init(c,a);o(b,!0)&&c.redraw(!1)},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\/533/.test(oa),d,e,f=a.data||[],g,h,i;z(a,"destroy");aa(a);n(["xAxis","yAxis"],function(b){if(i=a[b])ga(i.series,a),i.isDirty=i.forceRedraw=!0,i.stacks={}});a.legendItem&&a.chart.legend.destroyItem(a);for(e=f.length;e--;)(g=f[e])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);n("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","),
    +function(b){a[b]&&(d=c&&b==="group"?"hide":"destroy",a[b][d]())});if(b.hoverSeries===a)b.hoverSeries=null;ga(b.series,a);for(h in a)delete a[h]},drawDataLabels:function(){var a=this,b=a.options.dataLabels,c=a.points,d,e,f,g;if(b.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(b),g=a.plotGroup("dataLabelsGroup","data-labels",a.visible?"visible":"hidden",b.zIndex||6),e=b,n(c,function(c){var i,j=c.dataLabel,k,l,m=c.connector,p=!0;d=c.options&&c.options.dataLabels;i=o(d&&d.enabled,e.enabled);
    +if(j&&!i)c.dataLabel=j.destroy();else if(i){b=x(e,d);i=b.rotation;k=c.getLabelConfig();f=b.format?Ca(b.format,k):b.formatter.call(k,b);b.style.color=o(b.color,b.style.color,a.color,"black");if(j)if(u(f))j.attr({text:f}),p=!1;else{if(c.dataLabel=j=j.destroy(),m)c.connector=m.destroy()}else if(u(f)){j={fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.borderWidth,r:b.borderRadius||0,rotation:i,padding:b.padding,zIndex:1};for(l in j)j[l]===w&&delete j[l];j=c.dataLabel=a.chart.renderer[i?"text":
    +"label"](f,0,-999,null,null,null,b.useHTML).attr(j).css(b.style).add(g).shadow(b.shadow)}j&&a.alignDataLabel(c,j,b,null,p)}})},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=o(a.plotX,-999),i=o(a.plotY,-999),j=b.getBBox();if(a=this.visible&&f.isInsidePlot(a.plotX,a.plotY,g))d=r({x:g?f.plotWidth-i:h,y:t(g?f.plotHeight-h:i),width:0,height:0},d),r(c,{width:j.width,height:j.height}),c.rotation?(g={align:c.align,x:d.x+c.x+d.width/2,y:d.y+c.y+d.height/2},b[e?"attr":"animate"](g)):(b.align(c,
    +null,d),g=b.alignAttr,o(c.overflow,"justify")==="justify"?this.justifyDataLabel(b,c,g,j,d,e):o(c.crop,!0)&&(a=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+j.width,g.y+j.height)));a||b.attr({y:-999})},justifyDataLabel:function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k;j=c.x;if(j<0)h==="right"?b.align="left":b.x=-j,k=!0;j=c.x+d.width;if(j>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-j,k=!0;j=c.y;if(j<0)i==="bottom"?b.verticalAlign="top":b.y=-j,k=!0;j=c.y+d.height;if(j>g.plotHeight)i===
    +"top"?b.verticalAlign="bottom":b.y=g.plotHeight-j,k=!0;if(k)a.placed=!f,a.align(b,null,e)},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;n(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?"L":"M"),d&&f&&(i=a[f-1],d==="right"?c.push(i.plotX,h):d==="center"?c.push((i.plotX+g)/2,i.plotY,(i.plotX+g)/2,h):c.push(g,i.plotY)),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a=this,b=[],c,d=[];n(a.segments,function(e){c=
    +a.getSegmentPath(e);e.length>1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color]],d=b.lineWidth,e=b.dashStyle,f=this.getGraphPath(),g=b.negativeColor;g&&c.push(["graphNeg",g]);n(c,function(c,g){var j=c[0],k=a[j];if(k)Wa(k),k.animate({d:f});else if(d&&f.length)k={stroke:c[1],"stroke-width":d,zIndex:1},e?k.dashstyle=e:k["stroke-linecap"]=k["stroke-linejoin"]="round",a[j]=a.chart.renderer.path(f).attr(k).add(a.group).shadow(!g&&
    +b.shadow)})},clipNeg:function(){var a=this.options,b=this.chart,c=b.renderer,d=a.negativeColor||a.negativeFillColor,e,f=this.graph,g=this.area,h=this.posClip,i=this.negClip;e=b.chartWidth;var j=b.chartHeight,k=s(e,j),l=this.yAxis;if(d&&(f||g)){d=t(l.toPixels(a.threshold||0,!0));a={x:0,y:0,width:k,height:d};k={x:0,y:d,width:k,height:k};if(b.inverted)a.height=k.y=b.plotWidth-d,c.isVML&&(a={x:b.plotWidth-d-b.plotLeft,y:0,width:e,height:j},k={x:d+b.plotLeft-e,y:0,width:b.plotLeft+d,height:e});l.reversed?
    +(b=k,e=a):(b=a,e=k);h?(h.animate(b),i.animate(e)):(this.posClip=h=c.clipRect(b),this.negClip=i=c.clipRect(e),f&&this.graphNeg&&(f.clip(h),this.graphNeg.clip(i)),g&&(g.clip(h),this.areaNeg.clip(i)))}},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};n(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)J(c,"resize",a),J(b,"destroy",function(){aa(c,"resize",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,e){var f=this[a],
    +g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e));f[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){return{translateX:this.xAxis?this.xAxis.left:this.chart.plotLeft,translateY:this.yAxis?this.yAxis.top:this.chart.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this.chart,b,c=this.options,d=c.animation&&!!this.animate&&a.renderer.isSVG,e=this.visible?"visible":"hidden",f=c.zIndex,g=this.hasRendered,h=a.seriesGroup;b=this.plotGroup("group",
    +"series",e,f,h);this.markerGroup=this.plotGroup("markerGroup","markers",e,f,h);d&&this.animate(!0);this.getAttribs();b.inverted=this.isCartesian?a.inverted:!1;this.drawGraph&&(this.drawGraph(),this.clipNeg());this.drawDataLabels();this.drawPoints();this.options.enableMouseTracking!==!1&&this.drawTracker();a.inverted&&this.invertGroups();c.clip!==!1&&!this.sharedClipKey&&!g&&b.clip(a.clipRect);d?this.animate():g||this.afterAnimate();this.isDirty=this.isDirtyData=!1;this.hasRendered=!0},redraw:function(){var a=
    +this.chart,b=this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:o(d&&d.left,a.plotLeft),translateY:o(e&&e.top,a.plotTop)}));this.translate();this.setTooltipPoints(!0);this.render();b&&z(this,"updatedData")},setState:function(a){var b=this.options,c=this.graph,d=this.graphNeg,e=b.states,b=b.lineWidth,a=a||"";if(this.state!==a)this.state=a,e[a]&&e[a].enabled===!1||(a&&(b=e[a].lineWidth||b+1),c&&!c.dashstyle&&
    +(a={"stroke-width":b},c.attr(a),d&&d.attr(a)))},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===w?!h:a)?"show":"hide";n(["group","dataLabelsGroup","markerGroup","tracker"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&n(d.series,function(a){if(a.options.stacking&&a.visible)a.isDirty=!0});n(c.linkedSeries,function(b){b.setVisible(a,
    +!1)});if(g)d.isDirtyBox=!0;b!==!1&&d.redraw();z(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===w?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;z(this,a?"select":"unselect")},drawTracker:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,j=a.tracker,k=b.cursor,l=k&&{cursor:k},k=a.singlePoints,m,p=function(){if(f.hoverSeries!==
    +a)a.onMouseOver()};if(e&&!c)for(m=e+1;m--;)d[m]==="M"&&d.splice(m+1,0,d[m+1]-i,d[m+2],"L"),(m&&d[m]==="M"||m===e)&&d.splice(m,0,"L",d[m-2]+i,d[m-1]);for(m=0;m<k.length;m++)e=k[m],d.push("M",e.plotX-i,e.plotY,"L",e.plotX+i,e.plotY);j?j.attr({d:d}):(a.tracker=h.path(d).attr({"stroke-linejoin":"round",visibility:a.visible?"visible":"hidden",stroke:Qb,fill:c?Qb:S,"stroke-width":b.lineWidth+(c?0:2*i),zIndex:2}).add(a.group),n([a.tracker,a.markerGroup],function(a){a.addClass("highcharts-tracker").on("mouseover",
    +p).on("mouseout",function(a){g.onTrackerMouseOut(a)}).css(l);if(ib)a.on("touchstart",p)}))}};G=ha(Q);W.line=G;Y.area=x(X,{threshold:0});G=ha(Q,{type:"area",getSegments:function(){var a=[],b=[],c=[],d=this.xAxis,e=this.yAxis,f=e.stacks[this.stackKey],g={},h,i,j=this.points,k=this.options.connectNulls,l,m,p;if(this.options.stacking&&!this.cropped){for(m=0;m<j.length;m++)g[j[m].x]=j[m];for(p in f)c.push(+p);c.sort(function(a,b){return a-b});n(c,function(a){if(!k||g[a]&&g[a].y!==null)g[a]?b.push(g[a]):
    +(h=d.translate(a),l=f[a].percent?f[a].total?f[a].cum*100/f[a].total:0:f[a].cum,i=e.toPixels(l,!0),b.push({y:null,plotX:h,clientX:h,plotY:i,yBottom:i,onMouseOver:pa}))});b.length&&a.push(b)}else Q.prototype.getSegments.call(this),a=this.segments;this.segments=a},getSegmentPath:function(a){var b=Q.prototype.getSegmentPath.call(this,a),c=[].concat(b),d,e=this.options;d=b.length;var f=this.yAxis.getThreshold(e.threshold),g;d===3&&c.push("L",b[1],b[2]);if(e.stacking&&!this.closedStacks)for(d=a.length-
    +1;d>=0;d--)g=o(a[d].yBottom,f),d<a.length-1&&e.step&&c.push(a[d+1].plotX,g),c.push(a[d].plotX,g);else this.closeSegment(c,a,f);this.areaPath=this.areaPath.concat(c);return b},closeSegment:function(a,b,c){a.push("L",b[b.length-1].plotX,c,"L",b[0].plotX,c)},drawGraph:function(){this.areaPath=[];Q.prototype.drawGraph.apply(this);var a=this,b=this.areaPath,c=this.options,d=c.negativeColor,e=c.negativeFillColor,f=[["area",this.color,c.fillColor]];(d||e)&&f.push(["areaNeg",d,e]);n(f,function(d){var e=d[0],
    +f=a[e];f?f.animate({d:b}):a[e]=a.chart.renderer.path(b).attr({fill:o(d[2],ra(d[1]).setOpacity(o(c.fillOpacity,0.75)).get()),zIndex:0}).add(a.group)})},drawLegendSymbol:function(a,b){b.legendSymbol=this.chart.renderer.rect(0,a.baseline-11,a.options.symbolWidth,12,2).attr({zIndex:3}).add(b.legendGroup)}});W.area=G;Y.spline=x(X);F=ha(Q,{type:"spline",getPointSpline:function(a,b,c){var d=b.plotX,e=b.plotY,f=a[c-1],g=a[c+1],h,i,j,k;if(f&&g){a=f.plotY;j=g.plotX;var g=g.plotY,l;h=(1.5*d+f.plotX)/2.5;i=(1.5*
    +e+a)/2.5;j=(1.5*d+j)/2.5;k=(1.5*e+g)/2.5;l=(k-i)*(j-d)/(j-h)+e-k;i+=l;k+=l;i>a&&i>e?(i=s(a,e),k=2*e-i):i<a&&i<e&&(i=I(a,e),k=2*e-i);k>g&&k>e?(k=s(g,e),i=2*e-k):k<g&&k<e&&(k=I(g,e),i=2*e-k);b.rightContX=j;b.rightContY=k}c?(b=["C",f.rightContX||f.plotX,f.rightContY||f.plotY,h||d,i||e,d,e],f.rightContX=f.rightContY=null):b=["M",d,e];return b}});W.spline=F;Y.areaspline=x(Y.area);ma=G.prototype;F=ha(F,{type:"areaspline",closedStacks:!0,getSegmentPath:ma.getSegmentPath,closeSegment:ma.closeSegment,drawGraph:ma.drawGraph,
    +drawLegendSymbol:ma.drawLegendSymbol});W.areaspline=F;Y.column=x(X,{borderColor:"#FFFFFF",borderWidth:1,borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},stickyTracking:!1,threshold:0});F=ha(Q,{type:"column",pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color",
    +r:"borderRadius"},cropShoulder:0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){Q.prototype.init.apply(this,arguments);var a=this,b=a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0})},getColumnMetrics:function(){var a=this,b=a.options,c=a.xAxis,d=a.yAxis,e=c.reversed,f,g={},h,i=0;b.grouping===!1?i=1:n(a.chart.series,function(b){var c=b.options,e=b.yAxis;if(b.type===a.type&&b.visible&&d.len===e.len&&d.pos===e.pos)c.stacking?(f=b.stackKey,g[f]===
    +w&&(g[f]=i++),h=g[f]):c.grouping!==!1&&(h=i++),b.columnIndex=h});var c=I(N(c.transA)*(c.ordinalSlope||b.pointRange||c.closestPointRange||1),c.len),j=c*b.groupPadding,k=(c-2*j)/i,l=b.pointWidth,b=u(l)?(k-l)/2:k*b.pointPadding,l=o(l,k-2*b);return a.columnMetrics={width:l,offset:b+(j+((e?i-(a.columnIndex||0):a.columnIndex)||0)*k-c/2)*(e?-1:1)}},translate:function(){var a=this.chart,b=this.options,c=b.borderWidth,d=this.yAxis,e=this.translatedThreshold=d.getThreshold(b.threshold),f=o(b.minPointLength,
    +5),b=this.getColumnMetrics(),g=b.width,h=this.barW=xa(s(g,1+2*c)),i=this.pointXOffset=b.offset,j=-(c%2?0.5:0),k=c%2?0.5:1;a.renderer.isVML&&a.inverted&&(k+=1);Q.prototype.translate.apply(this);n(this.points,function(a){var b=o(a.yBottom,e),c=I(s(-999-b,a.plotY),d.len+999+b),n=a.plotX+i,u=h,r=I(c,b),w,c=s(c,b)-r;N(c)<f&&f&&(c=f,r=t(N(r-e)>f?b-f:e-(d.translate(a.y,0,1,0,1)<=e?f:0)));a.barX=n;a.pointWidth=g;b=N(n)<0.5;u=t(n+u)+j;n=t(n)+j;u-=n;w=N(r)<0.5;c=t(r+c)+k;r=t(r)+k;c-=r;b&&(n+=1,u-=1);w&&(r-=
    +1,c+=1);a.shapeType="rect";a.shapeArgs={x:n,y:r,width:u,height:c}})},getSymbol:pa,drawLegendSymbol:G.prototype.drawLegendSymbol,drawGraph:pa,drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d;n(a.points,function(e){var f=e.plotY,g=e.graphic;if(f!==w&&!isNaN(f)&&e.y!==null)d=e.shapeArgs,g?(Wa(g),g.animate(x(d))):e.graphic=c[e.shapeType](d).attr(e.pointAttr[e.selected?"select":""]).add(a.group).shadow(b.shadow,null,b.stacking&&!b.borderRadius);else if(g)e.graphic=g.destroy()})},drawTracker:function(){var a=
    +this,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(c){var d=c.target,e;if(b.hoverSeries!==a)a.onMouseOver();for(;d&&!e;)e=d.point,d=d.parentNode;if(e!==w&&e!==b.hoverPoint)e.onMouseOver(c)};n(a.points,function(a){if(a.graphic)a.graphic.element.point=a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)n(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass("highcharts-tracker").on("mouseover",f).on("mouseout",function(a){c.onTrackerMouseOut(a)}).css(e),ib))a[b].on("touchstart",
    +f)}),a._hasTracking=!0},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=a.dlBox||a.shapeArgs,i=a.below||a.plotY>o(this.translatedThreshold,f.plotSizeY),j=o(c.inside,!!this.options.stacking);if(h&&(d=x(h),g&&(d={x:f.plotWidth-d.y-d.height,y:f.plotHeight-d.x-d.width,width:d.height,height:d.width}),!j))g?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=o(c.align,!g||j?"center":i?"right":"left");c.verticalAlign=o(c.verticalAlign,g||j?"middle":i?"top":"bottom");Q.prototype.alignDataLabel.call(this,
    +a,b,c,d,e)},animate:function(a){var b=this.yAxis,c=this.options,d=this.chart.inverted,e={};if(Z)a?(e.scaleY=0.001,a=I(b.pos+b.len,s(b.pos,b.toPixels(c.threshold))),d?e.translateX=a-b.len:e.translateY=a,this.group.attr(e)):(e.scaleY=1,e[d?"translateX":"translateY"]=b.pos,this.group.animate(e,this.options.animation),this.animate=null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0});Q.prototype.remove.apply(a,arguments)}});W.column=F;Y.bar=
    +x(Y.column);ma=ha(F,{type:"bar",inverted:!0});W.bar=ma;Y.scatter=x(X,{lineWidth:0,tooltip:{headerFormat:'<span style="font-size: 10px; color:{series.color}">{series.name}</span><br/>',pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>",followPointer:!0},stickyTracking:!1});ma=ha(Q,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["markerGroup"],drawTracker:F.prototype.drawTracker,setTooltipPoints:pa});W.scatter=ma;Y.pie=x(X,{borderColor:"#FFFFFF",borderWidth:1,
    +center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});X={type:"pie",isCartesian:!1,pointClass:ha(Pa,{init:function(){Pa.prototype.init.apply(this,arguments);var a=this,b;if(a.y<0)a.y=null;r(a,{visible:a.visible!==!1,name:o(a.name,"Slice")});b=function(b){a.slice(b.type===
    +"select")};J(a,"select",b);J(a,"unselect",b);return a},setVisible:function(a){var b=this,c=b.series,d=c.chart,e;b.visible=b.options.visible=a=a===w?!b.visible:a;c.options.data[qa(b,c.data)]=b.options;e=a?"show":"hide";n(["graphic","dataLabel","connector","shadowGroup"],function(a){if(b[a])b[a][e]()});b.legendItem&&d.legend.colorizeItem(b,a);if(!c.isDirty&&c.options.ignoreHiddenPoint)c.isDirty=!0,d.redraw()},slice:function(a,b,c){var d=this.series;La(c,d.chart);o(b,!0);this.sliced=this.options.sliced=
    +a=u(a)?a:!this.sliced;d.options.data[qa(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:pa,animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)n(c,function(a){var c=a.graphic,a=a.shapeArgs;c&&(c.attr({r:b.center[3]/
    +2,start:d,end:d}),c.animate({r:a.r,start:a.start,end:a.end},b.options.animation))}),b.animate=null},setData:function(a,b){Q.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();o(b,!0)&&this.chart.redraw()},generatePoints:function(){var a,b=0,c,d,e,f=this.options.ignoreHiddenPoint;Q.prototype.generatePoints.call(this);c=this.points;d=c.length;for(a=0;a<d;a++)e=c[a],b+=f&&!e.visible?0:e.y;this.total=b;for(a=0;a<d;a++)e=c[a],e.percentage=b>0?e.y/b*100:0,e.total=b},getCenter:function(){var a=
    +this.options,b=this.chart,c=2*(a.slicedOffset||0),d,e=b.plotWidth-2*c,f=b.plotHeight-2*c,b=a.center,a=[o(b[0],"50%"),o(b[1],"50%"),a.size||"100%",a.innerSize||0],g=I(e,f),h;return Na(a,function(a,b){h=/%$/.test(a);d=b<2||b===2&&h;return(h?[e,f,g,g][b]*C(a)/100:a)+(d?c:0)})},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=ya/180*(i-90),i=(this.endAngleRad=ya/180*((c.endAngle||i+360)-90))-j,k=this.points,
    +l=c.dataLabels.distance,c=c.ignoreHiddenPoint,m,n=k.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=R.asin((b-a[1])/(a[2]/2+l));return a[0]+(c?-1:1)*V(h)*(a[2]/2+l)};for(m=0;m<n;m++){o=k[m];f=j+b*i;if(!c||o.visible)b+=o.percentage/100;g=j+b*i;o.shapeType="arc";o.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:t(f*1E3)/1E3,end:t(g*1E3)/1E3};h=(g+f)/2;h>0.75*i&&(h-=2*ya);o.slicedTranslation={translateX:t(V(h)*d),translateY:t(ca(h)*d)};f=V(h)*a[2]/2;g=ca(h)*a[2]/2;o.tooltipPos=
    +[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-ya/2||h>ya/2?1:0;o.angle=h;e=I(e,l/2);o.labelPos=[a[0]+f+V(h)*l,a[1]+g+ca(h)*l,a[0]+f+V(h)*e,a[1]+g+ca(h)*e,a[0]+f,a[1]+g,l<0?"center":o.half?"right":"left",h]}},setTooltipPoints:pa,drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group);n(a.points,function(h){d=h.graphic;g=h.shapeArgs;f=h.shadowGroup;if(e&&!f)f=h.shadowGroup=b.g("shadow").add(a.shadowGroup);c=h.sliced?
    +h.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);d?d.animate(r(g,c)):h.graphic=d=b.arc(g).setRadialReference(a.center).attr(h.pointAttr[h.selected?"select":""]).attr({"stroke-linejoin":"round"}).attr(c).add(a.group).shadow(e,f);h.visible===!1&&h.setVisible(!1)})},sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawDataLabels:function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=o(e.connectorPadding,10),g=o(e.connectorWidth,1),
    +h=d.plotWidth,d=d.plotHeight,i,j,k=o(e.softConnector,!0),l=e.distance,m=a.center,p=m[2]/2,q=m[1],u=l>0,r,w,v,x,C=[[],[]],y,z,E,H,B,D=[0,0,0,0],I=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){Q.prototype.drawDataLabels.apply(a);n(b,function(a){a.dataLabel&&C[a.half].push(a)});for(H=0;!x&&b[H];)x=b[H]&&b[H].dataLabel&&(b[H].dataLabel.getBBox().height||21),H++;for(H=2;H--;){var b=[],K=[],G=C[H],J=G.length,F;a.sortByAngle(G,H-0.5);if(l>0){for(B=q-p-l;B<=q+p+l;B+=x)b.push(B);
    +w=b.length;if(J>w){c=[].concat(G);c.sort(I);for(B=J;B--;)c[B].rank=B;for(B=J;B--;)G[B].rank>=w&&G.splice(B,1);J=G.length}for(B=0;B<J;B++){c=G[B];v=c.labelPos;c=9999;var O,M;for(M=0;M<w;M++)O=N(b[M]-v[1]),O<c&&(c=O,F=M);if(F<B&&b[B]!==null)F=B;else for(w<J-B+F&&b[B]!==null&&(F=w-J+B);b[F]===null;)F++;K.push({i:F,y:b[F]});b[F]=null}K.sort(I)}for(B=0;B<J;B++){c=G[B];v=c.labelPos;r=c.dataLabel;E=c.visible===!1?"hidden":"visible";c=v[1];if(l>0){if(w=K.pop(),F=w.i,z=w.y,c>z&&b[F+1]!==null||c<z&&b[F-1]!==
    +null)z=c}else z=c;y=e.justify?m[0]+(H?-1:1)*(p+l):a.getX(F===0||F===b.length-1?c:z,H);r._attr={visibility:E,align:v[6]};r._pos={x:y+e.x+({left:f,right:-f}[v[6]]||0),y:z+e.y-10};r.connX=y;r.connY=z;if(this.options.size===null)w=r.width,y-w<f?D[3]=s(t(w-y+f),D[3]):y+w>h-f&&(D[1]=s(t(y+w-h+f),D[1])),z-x/2<0?D[0]=s(t(-z+x/2),D[0]):z+x/2>d&&(D[2]=s(t(z+x/2-d),D[2]))}}if(va(D)===0||this.verifyDataLabelOverflow(D))this.placeDataLabels(),u&&g&&n(this.points,function(b){i=b.connector;v=b.labelPos;if((r=b.dataLabel)&&
    +r._pos)E=r._attr.visibility,y=r.connX,z=r.connY,j=k?["M",y+(v[6]==="left"?5:-5),z,"C",y,z,2*v[2]-v[4],2*v[3]-v[5],v[2],v[3],"L",v[4],v[5]]:["M",y+(v[6]==="left"?5:-5),z,"L",v[2],v[3],"L",v[4],v[5]],i?(i.animate({d:j}),i.attr("visibility",E)):b.connector=i=a.chart.renderer.path(j).attr({"stroke-width":g,stroke:e.connectorColor||b.color||"#606060",visibility:E}).add(a.group);else if(i)b.connector=i.destroy()})}},verifyDataLabelOverflow:function(a){var b=this.center,c=this.options,d=c.center,e=c=c.minSize||
    +80,f;d[0]!==null?e=s(b[2]-s(a[1],a[3]),c):(e=s(b[2]-a[1]-a[3],c),b[0]+=(a[3]-a[1])/2);d[1]!==null?e=s(I(e,b[2]-s(a[0],a[2])),c):(e=s(I(e,b[2]-a[0]-a[2]),c),b[1]+=(a[0]-a[2])/2);e<b[2]?(b[2]=e,this.translate(b),n(this.points,function(a){if(a.dataLabel)a.dataLabel._pos=null}),this.drawDataLabels()):f=!0;return f},placeDataLabels:function(){n(this.points,function(a){var a=a.dataLabel,b;if(a)(b=a._pos)?(a.attr(a._attr),a[a.moved?"animate":"attr"](b),a.moved=!0):a&&a.attr({y:-999})})},alignDataLabel:pa,
    +drawTracker:F.prototype.drawTracker,drawLegendSymbol:G.prototype.drawLegendSymbol,getSymbol:pa};X=ha(Q,X);W.pie=X;r(Highcharts,{Axis:db,Chart:yb,Color:ra,Legend:eb,Pointer:xb,Point:Pa,Tick:Ma,Tooltip:wb,Renderer:Va,Series:Q,SVGElement:wa,SVGRenderer:Ha,arrayMin:Ja,arrayMax:va,charts:Ga,dateFormat:Xa,format:Ca,pathAnim:Ab,getOptions:function(){return M},hasBidiBug:Ub,isTouchDevice:Ob,numberFormat:Aa,seriesTypes:W,setOptions:function(a){M=x(M,a);Lb();return M},addEvent:J,removeEvent:aa,createElement:U,
    +discardElement:Ta,css:K,each:n,extend:r,map:Na,merge:x,pick:o,splat:ja,extendClass:ha,pInt:C,wrap:mb,svg:Z,canvas:$,vml:!Z&&!$,product:"Highcharts",version:"3.0.6"})})();
    diff --git a/src/main/webapp/plug-in/graphreport/report.js b/src/main/webapp/plug-in/graphreport/report.js
    new file mode 100644
    index 00000000..d5a846c4
    --- /dev/null
    +++ b/src/main/webapp/plug-in/graphreport/report.js
    @@ -0,0 +1,143 @@
    +var reportUtil = {};
    +reportUtil.splineOptions = {
    +	chart: {
    +        type: 'spline'
    +    },
    +	title: {
    +	    text: null  //鏃犳爣棰
    +	},
    +	credits: {
    +		enabled: false //涓嶆樉鐗堟潈
    +	},
    +	xAxis: {
    +		categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    +	},
    +	yAxis: {
    +		title: {
    +			text: ''  //y杞存枃瀛
    +		},
    +		plotLines: [{
    +			value: 0,
    +			width: 1,
    +			color: '#808080'
    +		}]
    +	},
    +	tooltip: {
    +		crosshairs: true
    +        //shared: true
    +		//headerFormat: '<span style="color: rgb(90, 90, 90);">{point.key} ({point.percentage:.1f}%)</span><br/>',  //鐧惧垎姣旓紙鐢ㄤ簬楗煎浘锛
    +		//headerFormat: '<span style="color: rgb(90, 90, 90);">{series.name}</span><br/>',
    +		//pointFormat: '<span style="color: rgb(90, 90, 90);">{point.x}鐐: {point.y}</span>'
    +	},
    +	series: [{
    +		name: 'Tokyo',  //x杞存枃瀛
    +		data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
    +	}]
    +}
    +
    +/**
    + * 鑾峰緱鏇茬嚎鍙傛暟
    + * @param categories	x杞存樉绀烘暟鎹
    + * @param series		鏁版嵁鍒楄〃
    + * @param yText			y杞存枃瀛	
    + * @returns 鍙傛暟瀵硅薄
    + */
    +reportUtil.getSplineOptions = function(categories, series, yText) {
    +	var options = {};
    +	$.extend(options, reportUtil.splineOptions);
    +	
    +	options.xAxis.categories = categories;  //x杞存樉绀烘暟鎹
    +	options.series = series; //鏁版嵁鍒楄〃
    +	options.yAxis.title.text = yText;	//y杞存枃瀛	
    +	
    +	return options;
    +}
    +
    +$(function() {
    +	$(document).ajaxSend(function(evt, request, settings){
    +		showLoading();
    +	});
    +	$(document).ajaxComplete(function(evt, request, settings){
    +		removeLoading();
    +	});
    +})
    +
    +/**
    + * 鏄剧ず鍔犺浇鏁堟灉锛堥渶瑕佸紩鍏pin.min.js锛
    + */
    +function showLoading() {
    +	if($("#showLoadingDiv").length == 0) {
    +		$("body").append($("<div id=showLoadingDiv>").css({
    +				position: "fixed",
    +				_position: "absolute",
    +				width: "100%",
    +				height: $(window.document).height(),
    +				top: "0",
    +				left: "0", 
    +				opacity: "0.6",
    +				filter: "alpha(opacity = 60)", 
    +				background: "white",
    +				display: "none",
    +				"z-index": "9999"
    +			})
    +			.append($("<div>").css({
    +					width: "100px",
    +					height: "100px",
    +					position: "absolute",
    +					top: $(window).height()/2,
    +					left: "50%"
    +				})
    +				.append(new Spinner().spin().el)
    +		));
    +	}
    +	$(".spinner").css("position", "static");	
    +	$("#showLoadingDiv").fadeIn(200);
    +}
    +
    +/**
    + * 绉婚櫎鍔犺浇鏁堟灉
    + */
    +function removeLoading() {
    +	$("#showLoadingDiv").fadeOut(200);
    +}
    +
    +/**
    + * 璁$畻澶╂暟宸殑鍑芥暟
    + */
    +function dateDiff(sDate1,  sDate2){    //sDate1鍜宻Date2鏄2006-12-18鏍煎紡  
    +    var aDate, oDate1, oDate2, iDays  
    +    aDate = sDate1.split("-")  
    +    oDate1 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])    //杞崲涓12-18-2006鏍煎紡  
    +    aDate = sDate2.split("-")  
    +    oDate2 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])  
    +    iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 /24)    //鎶婄浉宸殑姣鏁拌浆鎹负澶╂暟  
    +    return iDays  
    +}
    +
    +/**
    + * 鑾峰緱涓ゆ棩鏈熶箣闂
    + */
    +function getBetweenDay(startDate, endDate) {
    +	var dayCount = dateDiff(endDate, startDate);
    +	
    +	var spliteStartDate = startDate.split("-");
    +	var startYear = parseInt(spliteStartDate[0]);
    +	var startMonth = parseInt(spliteStartDate[1]);
    +	var startDay = parseInt(spliteStartDate[2]);
    +	
    +	var result = new Array();
    +	for(var i = 0; i <= dayCount; i++) {
    +		var d = new Date(startYear, startMonth - 1, startDay + i);
    +		result.push(d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate());
    +	}
    +	return result;
    +}
    +
    +/**
    + * 鎺у埗鍙版墦鍗颁俊鎭紙瀵笽E鍋氫簡鍏煎锛
    + */
    +function log(msg) {
    +	if(console) {
    +		console.log(msg);
    +	}
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/graphreport/spin.min.js b/src/main/webapp/plug-in/graphreport/spin.min.js
    new file mode 100644
    index 00000000..6028cda6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/graphreport/spin.min.js
    @@ -0,0 +1,2 @@
    +//fgnass.github.com/spin.js#v1.3.3
    +!function(a,b){"object"==typeof exports?module.exports=b():"function"==typeof define&&define.amd?define(b):a.Spinner=b()}(this,function(){"use strict";function a(a,b){var c,d=document.createElement(a||"div");for(c in b)d[c]=b[c];return d}function b(a){for(var b=1,c=arguments.length;c>b;b++)a.appendChild(arguments[b]);return a}function c(a,b,c,d){var e=["opacity",b,~~(100*a),c,d].join("-"),f=.01+c/d*100,g=Math.max(1-(1-a)/b*(100-f),a),h=k.substring(0,k.indexOf("Animation")).toLowerCase(),i=h&&"-"+h+"-"||"";return m[e]||(n.insertRule("@"+i+"keyframes "+e+"{0%{opacity:"+g+"}"+f+"%{opacity:"+a+"}"+(f+.01)+"%{opacity:1}"+(f+b)%100+"%{opacity:"+a+"}100%{opacity:"+g+"}}",n.cssRules.length),m[e]=1),e}function d(a,b){var c,d,e=a.style;for(b=b.charAt(0).toUpperCase()+b.slice(1),d=0;d<l.length;d++)if(c=l[d]+b,void 0!==e[c])return c;return void 0!==e[b]?b:void 0}function e(a,b){for(var c in b)a.style[d(a,c)||c]=b[c];return a}function f(a){for(var b=1;b<arguments.length;b++){var c=arguments[b];for(var d in c)void 0===a[d]&&(a[d]=c[d])}return a}function g(a){for(var b={x:a.offsetLeft,y:a.offsetTop};a=a.offsetParent;)b.x+=a.offsetLeft,b.y+=a.offsetTop;return b}function h(a,b){return"string"==typeof a?a:a[b%a.length]}function i(a){return"undefined"==typeof this?new i(a):(this.opts=f(a||{},i.defaults,o),void 0)}function j(){function c(b,c){return a("<"+b+' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">',c)}n.addRule(".spin-vml","behavior:url(#default#VML)"),i.prototype.lines=function(a,d){function f(){return e(c("group",{coordsize:k+" "+k,coordorigin:-j+" "+-j}),{width:k,height:k})}function g(a,g,i){b(m,b(e(f(),{rotation:360/d.lines*a+"deg",left:~~g}),b(e(c("roundrect",{arcsize:d.corners}),{width:j,height:d.width,left:d.radius,top:-d.width>>1,filter:i}),c("fill",{color:h(d.color,a),opacity:d.opacity}),c("stroke",{opacity:0}))))}var i,j=d.length+d.width,k=2*j,l=2*-(d.width+d.length)+"px",m=e(f(),{position:"absolute",top:l,left:l});if(d.shadow)for(i=1;i<=d.lines;i++)g(i,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(i=1;i<=d.lines;i++)g(i);return b(a,m)},i.prototype.opacity=function(a,b,c,d){var e=a.firstChild;d=d.shadow&&d.lines||0,e&&b+d<e.childNodes.length&&(e=e.childNodes[b+d],e=e&&e.firstChild,e=e&&e.firstChild,e&&(e.opacity=c))}}var k,l=["webkit","Moz","ms","O"],m={},n=function(){var c=a("style",{type:"text/css"});return b(document.getElementsByTagName("head")[0],c),c.sheet||c.styleSheet}(),o={lines:12,length:7,width:5,radius:10,rotate:0,corners:1,color:"#000",direction:1,speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:"spinner",top:"auto",left:"auto",position:"relative"};i.defaults={},f(i.prototype,{spin:function(b){this.stop();var c,d,f=this,h=f.opts,i=f.el=e(a(0,{className:h.className}),{position:h.position,width:0,zIndex:h.zIndex}),j=h.radius+h.length+h.width;if(b&&(b.insertBefore(i,b.firstChild||null),d=g(b),c=g(i),e(i,{left:("auto"==h.left?d.x-c.x+(b.offsetWidth>>1):parseInt(h.left,10)+j)+"px",top:("auto"==h.top?d.y-c.y+(b.offsetHeight>>1):parseInt(h.top,10)+j)+"px"})),i.setAttribute("role","progressbar"),f.lines(i,f.opts),!k){var l,m=0,n=(h.lines-1)*(1-h.direction)/2,o=h.fps,p=o/h.speed,q=(1-h.opacity)/(p*h.trail/100),r=p/h.lines;!function s(){m++;for(var a=0;a<h.lines;a++)l=Math.max(1-(m+(h.lines-a)*r)%p*q,h.opacity),f.opacity(i,a*h.direction+n,l,h);f.timeout=f.el&&setTimeout(s,~~(1e3/o))}()}return f},stop:function(){var a=this.el;return a&&(clearTimeout(this.timeout),a.parentNode&&a.parentNode.removeChild(a),this.el=void 0),this},lines:function(d,f){function g(b,c){return e(a(),{position:"absolute",width:f.length+f.width+"px",height:f.width+"px",background:b,boxShadow:c,transformOrigin:"left",transform:"rotate("+~~(360/f.lines*j+f.rotate)+"deg) translate("+f.radius+"px,0)",borderRadius:(f.corners*f.width>>1)+"px"})}for(var i,j=0,l=(f.lines-1)*(1-f.direction)/2;j<f.lines;j++)i=e(a(),{position:"absolute",top:1+~(f.width/2)+"px",transform:f.hwaccel?"translate3d(0,0,0)":"",opacity:f.opacity,animation:k&&c(f.opacity,f.trail,l+j*f.direction,f.lines)+" "+1/f.speed+"s linear infinite"}),f.shadow&&b(i,e(g("#000","0 0 4px #000"),{top:"2px"})),b(d,b(i,g(h(f.color,j),"0 0 1px rgba(0,0,0,.1)")));return d},opacity:function(a,b,c){b<a.childNodes.length&&(a.childNodes[b].style.opacity=c)}});var p=e(a("group"),{behavior:"url(#default#VML)"});return!d(p,"transform")&&p.adj?j():k=d(p,"animation"),i});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/graphreport/x_js.js b/src/main/webapp/plug-in/graphreport/x_js.js
    new file mode 100644
    index 00000000..fc33895c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/graphreport/x_js.js
    @@ -0,0 +1,256 @@
    +//鏂板姞浜涘璞$敤鏉ヤ繚瀛樺父鐢ㄦ暟鎹紝 濡傦細娓告垙鍒楄〃涓猴細zyfc.gameList	(涓嬮潰鏁版嵁涔熷簲鏀惧叆姝ゅ璞★紝浣嗘殏鏃朵笉鍋氬鐞)
    +var zyfc = new Object();
    +//鑾峰緱娓告垙鍒楄〃
    +$.get("cgReportController.do?datagrid&configId=dynamic_game_list", function(data) {
    +	zyfc.gameList = {};
    +	for(var i = 0; i < data.rows.length; i++) {
    +		var game = data.rows[i];
    +		zyfc.gameList[game.gmid] = game;
    +	}
    +});
    +
    +
    +//鎵╁睍_瀵煎嚭
    +function x_export() {
    +	jQuery.ajaxSettings.traditional = true;
    +	
    +	//鍒ゆ柇璁板綍鏄惁澶т簬10w鏉
    +	var xjs_panel = $(".panel:visible[class='panel']").has("#x_export");
    +	var rowNum = xjs_panel.find(".pagination-info").text();
    +	if(rowNum) {
    +		rowNum = rowNum.match(/鍏盶d+/)[0].replace("鍏", "");
    +	}else {
    +		rowNum = 0;
    +	}
    +	if(rowNum == 0) {
    +		alert("娌℃湁瀵煎嚭鐨勮褰曪紒");
    +		return;
    +	}else if(rowNum  > 100000) {
    +		alert("瀵煎嚭璁板綍鏁伴噺涓嶈兘澶т簬10w鏉★紒");
    +		return;
    +    }
    +	
    +	var e = event || x_export.caller.arguments[0];
    +	var target = e.target || e.srcElement;
    +    var configId = $(target).parents("div[id$='Listtb']:first").attr("id").replace("Listtb", "");
    +	var url = "exCoreController.do?exportExcel&configId=" + configId;
    +	var datagridId = configId + 'List';
    +
    +	var queryParams = $('#'+datagridId).datagrid('options').queryParams;
    +	//鑾峰緱鏁扮粍鍙傛暟
    +	$("#" + configId + "Listtb").find(":input[id][tag='ComboGrid']").each(function() {
    +		queryParams[$(this).attr("id")] = $(this).combogrid('getValues');
    +	});
    +	$('#'+datagridId+'tb').find('*').each(function() {
    +	    queryParams[$(this).attr('name')] = $(this).val();
    +	});
    +	var params = '&' + $.param(queryParams);
    +	var fields = '&field=';
    +	$("#" + datagridId).parents(".datagrid-wrap:first").find(".datagrid-header-row td:visible").each(function() {
    +		var field = $(this).attr("field");
    +		if(field && field != "ck" && field != "opt") {
    +			fields+=field+',';
    +		}
    +	});
    +	var loc = url + params + encodeURI(fields);
    +	$("<iframe src='" + loc + "&p=1" + "' style='display:none;'></iframe>").appendTo("body");
    +	if(rowNum > 50000) {
    +		setTimeout(function() {
    +			$("<iframe src='" + loc + "&p=2' style='display:none;'></iframe>").appendTo("body");
    +		}, 1000 * 5);
    +	}
    +}
    +
    +//鎵╁睍_鍏嬮殕
    +function x_copy() {
    +	var e = event || x_export.caller.arguments[0];
    +	var target = e.target || e.srcElement;
    +    var configId = $(target).parents("div[id$='Listtb']:first").attr("id").replace("Listtb", "");
    +	eval(configId + "copy()");
    +}
    +
    +//姣25閽熻嚜鍔ㄨ繛鎺ヤ竴娆℃湇鍔″櫒锛岄槻姝ession杩囨湡
    +setInterval(function() {
    +	$.get("loginController.do?login", function(data) { });
    +}, 1000 * 60 * 100);
    +
    +//鍥捐〃閰嶇疆澶嶅埗
    +function popMenuLinkGraph(tableName,content){
    +	var url = "<input type='text' style='width:380px;' disabled=\"disabled\" id='menuLink' title='graphReportController.do?list&id=' value='graphReportController.do?list&isIframe&id="+tableName+"' />";
    +	$.dialog({
    +		content: url,
    +		drag :false,
    +		lock : true,
    +		title:'鑿滃崟閾炬帴['+content+']',
    +		opacity : 0.3,
    +		width:400,
    +		height:50,
    +		cache:false,
    +	    cancelVal: '鍏抽棴',
    +	    cancel: function(){clip.destroy();},
    +	    button : [{
    +	    	id : "coptyBtn",
    +	    	name : "澶嶅埗",
    +	    	callback : function () {
    +	    	}
    +	    }],
    +	    init : function () {
    +			clip = new ZeroClipboard.Client();
    +			clip.setHandCursor( true );
    +			
    +			clip.addEventListener('mouseOver', function(client){
    +				clip.setText( document.getElementById("menuLink").value );
    +			});
    +			clip.addEventListener('complete', function(client, text){
    +				alert("澶嶅埗鎴愬姛");
    +			});
    +			var menuLink = $("#menuLink").val();
    +			$($("input[type=button]")[0]).attr("id","coptyBtn");
    +			clip.setText(menuLink);
    +			clip.glue("coptyBtn");
    +	    }
    +	});  
    +}
    +
    +//鍥捐〃閰嶇疆澶嶅埗
    +function copy_url() {
    +    var e = event || x_export.caller.arguments[0];
    +    var target = e.target || e.srcElement;
    +    var configId = $(target).parents("tr:first").find("td[field='code']").text();
    +    popMenuLinkGraph(configId, configId);
    +}
    +//鍔熻兘娴嬭瘯
    +function graph_test() {
    +	var e = event || x_export.caller.arguments[0];
    +    var target = e.target || e.srcElement;
    +    var configId = $(target).parents("tr:first").find("td[field='code']").text();
    +    var configName = $(target).parents("tr:first").find("td[field='name']").text();
    +	    
    +	addOneTab("琛ㄥ崟鏁版嵁鍒楄〃 ["+configName+"]", "graphReportController.do?list&isIframe&id="+configId);
    +}
    +
    +//鍏憡绠$悊-鏌ョ湅鍖烘湇
    +function x_openServerList(id) {
    +    //addTab('娓犻亾鏀跺叆鏁版嵁(骞垮憡)','cgAutoListController.do?list&id=v_rpt_day_pay_ad&clickFunctionId=2c90aa6744866c7a0144875fc92c013e','pictures')
    +    addlisttab('db_mnet__dbo__v_game_server_notice_jjqy&noticeid='+id,'銆恓jqy銆戝尯鏈嶅叕鍛','0')
    +}
    +
    +//鍥涘悎涓鍥捐〃闅愯棌鐩稿叧鍒
    +function x_groupReport() {
    +	return;
    +	
    +	var xjs_panel = $("#maintabs .panel.datagrid:visible");
    +	var isGroupReport = $("#isGroupReport", xjs_panel);
    +	if(isGroupReport.length == 1) {
    +		var datagridId = xjs_panel .find(".datagrid-toolbar").attr("id").replace("tb", "");
    +		var queryParams = {serverid: $(":input[name='serverid']", xjs_panel).val(), ad_channel_id: $(":input[name='ad_channel_id']", xjs_panel).val()}
    +		//濡傛灉宸查変腑姹囨伙紝闅愯棌鐩稿叧鍒
    +		if(isGroupReport.attr("checked")) {
    +			if($(":checked#isGroupReport", xjs_panel).val() == 1) {
    +				//鏍规嵁鏁版嵁鏉′欢闅愯棌鐩稿簲鏁版嵁鍒
    +				if(queryParams.serverid != undefined) {
    +					$('#' + datagridId).datagrid("hideColumn", "serverid");
    +				}
    +				if(queryParams.ad_channel_id != undefined) {
    +					$('#' + datagridId).datagrid("hideColumn", "ad_channel_id");
    +					$('#' + datagridId).datagrid("hideColumn", "ad_channel_name");
    +				}
    +				/*if(!queryParams.serverid && queryParams.serverid != undefined) {
    +					$('#' + datagridId).datagrid("hideColumn", "serverid");
    +				}
    +				if(!queryParams.ad_channel_id && queryParams.ad_channel_id != undefined) {
    +					$('#' + datagridId).datagrid("hideColumn", "ad_channel_id");
    +					$('#' + datagridId).datagrid("hideColumn", "ad_channel_name");
    +				}*/
    +			}
    +		}else {
    +			//鍚﹀垯鏄剧ず鐩稿叧鍒
    +			if(queryParams.serverid != undefined) {
    +				$('#' + datagridId).datagrid("showColumn", "serverid");
    +			}
    +			if(queryParams.ad_channel_id != undefined) {
    +				$('#' + datagridId).datagrid("showColumn", "ad_channel_id");
    +			}
    +		}
    +	}
    +}
    +
    +//鏍规嵁娓告垙鏄剧ず鐩稿簲鍖烘湇
    +function x_showOnlyServer() {
    +	var xjs_panel = $("#maintabs .panel.datagrid:visible");
    +	var serveridObj = xjs_panel.find("#serverid");
    +	var gmid = xjs_panel.find("#gmid").val();
    +	//鎶奼mid鎹㈡垚csdkid
    +	if(gmid) {
    +		gmid = zyfc.gameList[gmid].csdkid || gmid;
    +	}
    +	var currServerid = serveridObj.combo("getValue");
    +	var data = $("option", serveridObj).map(function() {
    +		var serverId = $(this).val();
    +		var serverOption = null;
    +		if(serverId) {
    +			if(gmid == "appsg") {
    +				if(serverId.indexOf(".") == -1) {
    +					serverOption = {value: serverId, text: $(this).text()};
    +					if(currServerid == serverId) {
    +						serverOption.selected = true;
    +					}
    +				}
    +			}else {
    +				if(!gmid || serverId.indexOf(gmid + ".") != -1) {
    +					serverOption =  {value: serverId, text: $(this).text()};
    +					if(currServerid == serverId) {
    +						serverOption.selected = true;
    +					}
    +				}
    +			}
    +		}
    +		return serverOption;
    +	});
    +	serveridObj.combobox('setValue', '');
    +	serveridObj.combobox("loadData", x_getSCOptionOther("**鍏ㄩ儴鍖烘湇**").concat(data.get()));
    +}
    +
    +
    +
    +//鏍规嵁娓告垙鏄剧ず鐩稿簲娓犻亾
    +function x_showOnlyChannel() {
    +	var xjs_panel = $("#maintabs .panel.datagrid:visible");
    +	var gmidObj = xjs_panel.find("#gmid");
    +	var text = $("option[value='"+gmidObj.val()+"']", gmidObj).text();
    +	var serveridObj = xjs_panel.find("#ad_channel_id");
    +	var currServerid = serveridObj.combo("getValue");
    +	var data = $("option", serveridObj).map(function() {
    +		var serverOption = null;
    +		if(gmidObj.val() == "appsg") {
    +			if(new RegExp(text).test($(this).text())) {
    +				serverOption = {value:$(this).val(), text:$(this).text()}
    +				if(currServerid == $(this).val()) {
    +					serverOption.selected = true;
    +				}
    +			}
    +		}else {
    +			if(new RegExp("鍟暘涓夊浗").test($(this).text()) == false) {
    +				if($(this).val()) {
    +					serverOption = {value:$(this).val(), text:$(this).text()}
    +					if(currServerid == $(this).val()) {
    +						serverOption.selected = true;
    +					}
    +				}
    +			}
    +		}
    +		return serverOption;
    +	});
    +	data = x_getSCOptionOther("**鍏ㄩ儴娓犻亾**").concat(data.get());
    +	serveridObj.combobox('setValue', '');
    +	serveridObj.combobox("loadData", data);
    +}
    +
    +//鑾峰緱鍖烘湇鍜屾笭閬撻檮鍔犻夐」
    +function x_getSCOptionOther(showText) {
    +	var optionOther = [{value:"", text:""}];
    +	if($("#maintabs .panel.datagrid:visible #isGroupReport:checked").length > 0) {
    +		optionOther.push({value:"-1", text:showText});
    +	}
    +	return optionOther;
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/iColorPicker/images/color.png b/src/main/webapp/plug-in/iColorPicker/images/color.png
    new file mode 100644
    index 00000000..809fb00e
    Binary files /dev/null and b/src/main/webapp/plug-in/iColorPicker/images/color.png differ
    diff --git a/src/main/webapp/plug-in/iColorPicker/js/iColorPicker.js b/src/main/webapp/plug-in/iColorPicker/js/iColorPicker.js
    new file mode 100644
    index 00000000..3edae182
    --- /dev/null
    +++ b/src/main/webapp/plug-in/iColorPicker/js/iColorPicker.js
    @@ -0,0 +1,95 @@
    +/*Copyright(c)2009,www.supersite.me*/var imageUrl = 'plug-in/iColorPicker/images/color.png';
    +function iColorShow(id, id2) {
    +	var eICP = jQuery("#" + id2).position();
    +	jQuery("#iColorPicker").css({
    +		'top' : eICP.top + (jQuery("#" + id).outerHeight()) + "px",
    +		'left' : (eICP.left+400) + "px",
    +		'position' : 'absolute'
    +	}).fadeIn("fast");
    +	jQuery("#iColorPickerBg").css({
    +		'position' : 'fixed',
    +		'top' : 0,
    +		'left' : 0,
    +		'width' : '100%',
    +		'height' : '100%'
    +	}).fadeIn("fast");
    +	var def = jQuery("#" + id).val();
    +	jQuery('#colorPreview span').text(def);
    +	jQuery('#colorPreview').css('background', def);
    +	jQuery('#color').val(def);
    +	var hxs = jQuery('#iColorPicker');
    +	for (i = 0; i < hxs.length; i++) {
    +		var tbl = document.getElementById('hexSection' + i);
    +		var tblChilds = tbl.childNodes;
    +		for (j = 0; j < tblChilds.length; j++) {
    +			var tblCells = tblChilds[j].childNodes;
    +			for (k = 0; k < tblCells.length; k++) {
    +				jQuery(tblChilds[j].childNodes[k]).unbind().mouseover(
    +						function(a) {
    +							var aaa = "#" + jQuery(this).attr('hx');
    +							jQuery('#colorPreview').css('background', aaa);
    +							jQuery('#colorPreview span').text(aaa)
    +						}).click(function() {
    +					var aaa = "#" + jQuery(this).attr('hx');
    +					jQuery("#" + id).val(aaa).css("background", aaa);
    +					jQuery("#iColorPickerBg").hide();
    +					jQuery("#iColorPicker").fadeOut();
    +					jQuery(this)
    +				})
    +			}
    +		}
    +	}
    +}
    +this.iColorPicker = function() {
    +	jQuery("input.iColorPicker")
    +			.each(
    +					function(i) {
    +						if (i == 0) {
    +							jQuery(document.createElement("div"))
    +									.attr("id", "iColorPicker")
    +									.css('display', 'none')
    +									.html(
    +											'<table class="pickerTable" id="pickerTable0"><thead id="hexSection0"><tr><td style="background:#f00;" hx="f00"></td><td style="background:#ff0" hx="ff0"></td><td style="background:#0f0" hx="0f0"></td><td style="background:#0ff" hx="0ff"></td><td style="background:#00f" hx="00f"></td><td style="background:#f0f" hx="f0f"></td><td style="background:#fff" hx="fff"></td><td style="background:#ebebeb" hx="ebebeb"></td><td style="background:#e1e1e1" hx="e1e1e1"></td><td style="background:#d7d7d7" hx="d7d7d7"></td><td style="background:#cccccc" hx="cccccc"></td><td style="background:#c2c2c2" hx="c2c2c2"></td><td style="background:#b7b7b7" hx="b7b7b7"></td><td style="background:#acacac" hx="acacac"></td><td style="background:#a0a0a0" hx="a0a0a0"></td><td style="background:#959595" hx="959595"></td></tr><tr><td style="background:#ee1d24" hx="ee1d24"></td><td style="background:#fff100" hx="fff100"></td><td style="background:#00a650" hx="00a650"></td><td style="background:#00aeef" hx="00aeef"></td><td style="background:#2f3192" hx="2f3192"></td><td style="background:#ed008c" hx="ed008c"></td><td style="background:#898989" hx="898989"></td><td style="background:#7d7d7d" hx="7d7d7d"></td><td style="background:#707070" hx="707070"></td><td style="background:#626262" hx="626262"></td><td style="background:#555" hx="555"></td><td style="background:#464646" hx="464646"></td><td style="background:#363636" hx="363636"></td><td style="background:#262626" hx="262626"></td><td style="background:#111" hx="111"></td><td style="background:#000" hx="000"></td></tr><tr><td style="background:#f7977a" hx="f7977a"></td><td style="background:#fbad82" hx="fbad82"></td><td style="background:#fdc68c" hx="fdc68c"></td><td style="background:#fff799" hx="fff799"></td><td style="background:#c6df9c" hx="c6df9c"></td><td style="background:#a4d49d" hx="a4d49d"></td><td style="background:#81ca9d" hx="81ca9d"></td><td style="background:#7bcdc9" hx="7bcdc9"></td><td style="background:#6ccff7" hx="6ccff7"></td><td style="background:#7ca6d8" hx="7ca6d8"></td><td style="background:#8293ca" hx="8293ca"></td><td style="background:#8881be" hx="8881be"></td><td style="background:#a286bd" hx="a286bd"></td><td style="background:#bc8cbf" hx="bc8cbf"></td><td style="background:#f49bc1" hx="f49bc1"></td><td style="background:#f5999d" hx="f5999d"></td></tr><tr><td style="background:#f16c4d" hx="f16c4d"></td><td style="background:#f68e54" hx="f68e54"></td><td style="background:#fbaf5a" hx="fbaf5a"></td><td style="background:#fff467" hx="fff467"></td><td style="background:#acd372" hx="acd372"></td><td style="background:#7dc473" hx="7dc473"></td><td style="background:#39b778" hx="39b778"></td><td style="background:#16bcb4" hx="16bcb4"></td><td style="background:#00bff3" hx="00bff3"></td><td style="background:#438ccb" hx="438ccb"></td><td style="background:#5573b7" hx="5573b7"></td><td style="background:#5e5ca7" hx="5e5ca7"></td><td style="background:#855fa8" hx="855fa8"></td><td style="background:#a763a9" hx="a763a9"></td><td style="background:#ef6ea8" hx="ef6ea8"></td><td style="background:#f16d7e" hx="f16d7e"></td></tr><tr><td style="background:#ee1d24" hx="ee1d24"></td><td style="background:#f16522" hx="f16522"></td><td style="background:#f7941d" hx="f7941d"></td><td style="background:#fff100" hx="fff100"></td><td style="background:#8fc63d" hx="8fc63d"></td><td style="background:#37b44a" hx="37b44a"></td><td style="background:#00a650" hx="00a650"></td><td style="background:#00a99e" hx="00a99e"></td><td style="background:#00aeef" hx="00aeef"></td><td style="background:#0072bc" hx="0072bc"></td><td style="background:#0054a5" hx="0054a5"></td><td style="background:#2f3192" hx="2f3192"></td><td style="background:#652c91" hx="652c91"></td><td style="background:#91278f" hx="91278f"></td><td style="background:#ed008c" hx="ed008c"></td><td style="background:#ee105a" hx="ee105a"></td></tr><tr><td style="background:#9d0a0f" hx="9d0a0f"></td><td style="background:#a1410d" hx="a1410d"></td><td style="background:#a36209" hx="a36209"></td><td style="background:#aba000" hx="aba000"></td><td style="background:#588528" hx="588528"></td><td style="background:#197b30" hx="197b30"></td><td style="background:#007236" hx="007236"></td><td style="background:#00736a" hx="00736a"></td><td style="background:#0076a4" hx="0076a4"></td><td style="background:#004a80" hx="004a80"></td><td style="background:#003370" hx="003370"></td><td style="background:#1d1363" hx="1d1363"></td><td style="background:#450e61" hx="450e61"></td><td style="background:#62055f" hx="62055f"></td><td style="background:#9e005c" hx="9e005c"></td><td style="background:#9d0039" hx="9d0039"></td></tr><tr><td style="background:#790000" hx="790000"></td><td style="background:#7b3000" hx="7b3000"></td><td style="background:#7c4900" hx="7c4900"></td><td style="background:#827a00" hx="827a00"></td><td style="background:#3e6617" hx="3e6617"></td><td style="background:#045f20" hx="045f20"></td><td style="background:#005824" hx="005824"></td><td style="background:#005951" hx="005951"></td><td style="background:#005b7e" hx="005b7e"></td><td style="background:#003562" hx="003562"></td><td style="background:#002056" hx="002056"></td><td style="background:#0c004b" hx="0c004b"></td><td style="background:#30004a" hx="30004a"></td><td style="background:#4b0048" hx="4b0048"></td><td style="background:#7a0045" hx="7a0045"></td><td style="background:#7a0026" hx="7a0026"></td></tr></thead><tbody><tr><td style="border:1px solid #000;background:#fff;cursor:pointer;height:60px;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;" colspan="16" align="center" id="colorPreview"><span style="color:#000;border:1px solid rgb(0, 0, 0);padding:5px;background-color:#fff;font:11px Arial, Helvetica, sans-serif;"></span></td></tr></tbody></table><style>#iColorPicker input{margin:2px}</style>')
    +									.appendTo("body");
    +							jQuery(document.createElement("div")).attr("id",
    +									"iColorPickerBg").click(function() {
    +								jQuery("#iColorPickerBg").hide();
    +								jQuery("#iColorPicker").fadeOut()
    +							}).appendTo("body");
    +							jQuery('table.pickerTable td').css({
    +								'width' : '12px',
    +								'height' : '14px',
    +								'border' : '1px solid #000',
    +								'cursor' : 'pointer'
    +							});
    +							jQuery('#iColorPicker table.pickerTable').css({
    +								'border-collapse' : 'collapse'
    +							});
    +							jQuery('#iColorPicker').css({
    +								'border' : '1px solid #ccc',
    +								'background' : '#333',
    +								'padding' : '5px',
    +								'color' : '#fff',
    +								'z-index' : 9999
    +							})
    +						}
    +						jQuery('#colorPreview').css({
    +							'height' : '50px'
    +						});
    +						jQuery(this)
    +								.css("backgroundColor", jQuery(this).val())
    +								.after(
    +										'<a href="javascript:void(null)" id="icp_'
    +												+ this.id
    +												+ '" onclick="iColorShow(\''
    +												+ this.id
    +												+ '\',\'icp_'
    +												+ this.id
    +												+ '\')"><img src="'
    +												+ imageUrl
    +												+ '" style="border:0;margin:0 0 0 3px" align="absmiddle" ></a>')
    +					})
    +};
    +jQuery(function() {
    +	iColorPicker()
    +})
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/iviewer/img/grab.cur b/src/main/webapp/plug-in/iviewer/img/grab.cur
    new file mode 100644
    index 00000000..ef540be0
    Binary files /dev/null and b/src/main/webapp/plug-in/iviewer/img/grab.cur differ
    diff --git a/src/main/webapp/plug-in/iviewer/img/hand.cur b/src/main/webapp/plug-in/iviewer/img/hand.cur
    new file mode 100644
    index 00000000..1a5bafb5
    Binary files /dev/null and b/src/main/webapp/plug-in/iviewer/img/hand.cur differ
    diff --git a/src/main/webapp/plug-in/iviewer/img/iviewer.rotate_left.png b/src/main/webapp/plug-in/iviewer/img/iviewer.rotate_left.png
    new file mode 100644
    index 00000000..df0956de
    Binary files /dev/null and b/src/main/webapp/plug-in/iviewer/img/iviewer.rotate_left.png differ
    diff --git a/src/main/webapp/plug-in/iviewer/img/iviewer.rotate_right.png b/src/main/webapp/plug-in/iviewer/img/iviewer.rotate_right.png
    new file mode 100644
    index 00000000..7a6c8298
    Binary files /dev/null and b/src/main/webapp/plug-in/iviewer/img/iviewer.rotate_right.png differ
    diff --git a/src/main/webapp/plug-in/iviewer/img/iviewer.zoom_fit.gif b/src/main/webapp/plug-in/iviewer/img/iviewer.zoom_fit.gif
    new file mode 100644
    index 00000000..3199a1e3
    Binary files /dev/null and b/src/main/webapp/plug-in/iviewer/img/iviewer.zoom_fit.gif differ
    diff --git a/src/main/webapp/plug-in/iviewer/img/iviewer.zoom_in.gif b/src/main/webapp/plug-in/iviewer/img/iviewer.zoom_in.gif
    new file mode 100644
    index 00000000..5d596181
    Binary files /dev/null and b/src/main/webapp/plug-in/iviewer/img/iviewer.zoom_in.gif differ
    diff --git a/src/main/webapp/plug-in/iviewer/img/iviewer.zoom_out.gif b/src/main/webapp/plug-in/iviewer/img/iviewer.zoom_out.gif
    new file mode 100644
    index 00000000..77ec19af
    Binary files /dev/null and b/src/main/webapp/plug-in/iviewer/img/iviewer.zoom_out.gif differ
    diff --git a/src/main/webapp/plug-in/iviewer/img/iviewer.zoom_zero.gif b/src/main/webapp/plug-in/iviewer/img/iviewer.zoom_zero.gif
    new file mode 100644
    index 00000000..e56c670f
    Binary files /dev/null and b/src/main/webapp/plug-in/iviewer/img/iviewer.zoom_zero.gif differ
    diff --git a/src/main/webapp/plug-in/iviewer/jquery.iviewer.css b/src/main/webapp/plug-in/iviewer/jquery.iviewer.css
    new file mode 100644
    index 00000000..baec02e0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/iviewer/jquery.iviewer.css
    @@ -0,0 +1,60 @@
    +.iviewer_common {
    +    position:absolute;
    +    top:5px;
    +    border: 1px  solid #000;
    +    height: 28px;
    +    z-index: 5000;
    +}
    +
    +.iviewer_cursor {
    +    cursor: url(img/hand.cur) 6 8,  hand;;
    +}
    +.iviewer_drag_cursor {
    +    cursor: url(img/grab.cur) 6 8,  hand;;
    +}
    +
    +.iviewer_button {
    +    width: 28px;
    +    cursor: pointer;
    +    background-position: center center;
    +    background-repeat: no-repeat;
    +}
    +
    +.iviewer_zoom_in {
    +    left: 20px;
    +    background: url(img/iviewer.zoom_in.gif);
    +}
    +
    +.iviewer_zoom_out {
    +    left: 55px;
    +    background: url(img/iviewer.zoom_out.gif);
    +}
    +
    +.iviewer_zoom_zero {
    +    left: 90px;
    +    background: url(img/iviewer.zoom_zero.gif);
    +}
    +
    +.iviewer_zoom_fit {
    +    left: 125px;
    +    background: url(img/iviewer.zoom_fit.gif);
    +}
    +
    +.iviewer_zoom_status {
    +    left: 160px;
    +    font: 1em/28px Sans;
    +    color: #000;
    +    background-color: #fff;
    +    text-align: center;
    +    width: 60px;
    +}
    +
    +.iviewer_rotate_left {
    +    left: 227px;
    +    background: #fff url(img/iviewer.rotate_left.png) center center no-repeat;
    +}
    +
    +.iviewer_rotate_right {
    +    left: 262px;
    +    background: #fff url(img/iviewer.rotate_right.png) center center no-repeat;
    +}
    diff --git a/src/main/webapp/plug-in/iviewer/jquery.iviewer.js b/src/main/webapp/plug-in/iviewer/jquery.iviewer.js
    new file mode 100644
    index 00000000..74284b4d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/iviewer/jquery.iviewer.js
    @@ -0,0 +1,1061 @@
    +/*
    + * iviewer Widget for jQuery UI
    + * https://github.com/can3p/iviewer
    + *
    + * Copyright (c) 2009 - 2012 Dmitry Petrov
    + * Dual licensed under the MIT and GPL licenses.
    + *  - http://www.opensource.org/licenses/mit-license.php
    + *  - http://www.gnu.org/copyleft/gpl.html
    + *
    + * Author: Dmitry Petrov
    + * Version: 0.7.1
    + */
    +
    +( function( $, undefined ) {
    +
    +//this code was taken from the https://github.com/furf/jquery-ui-touch-punch
    +var mouseEvents = {
    +    touchstart: 'mousedown',
    +    touchmove: 'mousemove',
    +    touchend: 'mouseup'
    +};
    +
    +/**
    + * Convert a touch event to a mouse-like
    + */
    +function makeMouseEvent (event) {
    +    var touch = event.originalEvent.changedTouches[0];
    +
    +    return $.extend(event, {
    +        type:    mouseEvents[event.type],
    +        which:   1,
    +        pageX:   touch.pageX,
    +        pageY:   touch.pageY,
    +        screenX: touch.screenX,
    +        screenY: touch.screenY,
    +        clientX: touch.clientX,
    +        clientY: touch.clientY,
    +        isTouchEvent: true
    +    });
    +}
    +
    +var mouseProto = $.ui.mouse.prototype,
    +    _mouseInit = $.ui.mouse.prototype._mouseInit;
    +
    +mouseProto._mouseInit = function() {
    +    var self = this;
    +    self._touchActive = false;
    +
    +    this.element.bind( 'touchstart.' + this.widgetName, function(event) {
    +        self._touchActive = true;
    +        return self._mouseDown(makeMouseEvent(event));
    +    })
    +
    +    var self = this;
    +    // these delegates are required to keep context
    +    this._mouseMoveDelegate = function(event) {
    +        if (self._touchActive) {
    +            return self._mouseMove(makeMouseEvent(event));
    +        }
    +    };
    +    this._mouseUpDelegate = function(event) {
    +        if (self._touchActive) {
    +            self._touchActive = false;
    +            return self._mouseUp(makeMouseEvent(event));
    +        }
    +    };
    +
    +    $(document)
    +        .bind('touchmove.'+ this.widgetName, this._mouseMoveDelegate)
    +        .bind('touchend.' + this.widgetName, this._mouseUpDelegate);
    +
    +    _mouseInit.apply(this);
    +}
    +
    +/**
    + * Simple implementation of jQuery like getters/setters
    + * var val = something();
    + * something(val);
    + */
    +var setter = function(setter, getter) {
    +    return function(val) {
    +        if (arguments.length === 0) {
    +            return getter.apply(this);
    +        } else {
    +            setter.apply(this, arguments);
    +        }
    +    }
    +};
    +
    +/**
    + * Internet explorer rotates image relative left top corner, so we should
    + * shift image when it's rotated.
    + */
    +var ieTransforms = {
    +        '0': {
    +            marginLeft: 0,
    +            marginTop: 0,
    +            filter: 'progid:DXImageTransform.Microsoft.Matrix(M11=1, M12=0, M21=0, M22=1, SizingMethod="auto expand")'
    +        },
    +
    +        '90': {
    +            marginLeft: -1,
    +            marginTop: 1,
    +            filter: 'progid:DXImageTransform.Microsoft.Matrix(M11=0, M12=-1, M21=1, M22=0, SizingMethod="auto expand")'
    +        },
    +
    +        '180': {
    +            marginLeft: 0,
    +            marginTop: 0,
    +            filter: 'progid:DXImageTransform.Microsoft.Matrix(M11=-1, M12=0, M21=0, M22=-1, SizingMethod="auto expand")'
    +        },
    +
    +        '270': {
    +            marginLeft: -1,
    +            marginTop: 1,
    +            filter: 'progid:DXImageTransform.Microsoft.Matrix(M11=0, M12=1, M21=-1, M22=0, SizingMethod="auto expand")'
    +        }
    +    },
    +    useIeTransforms = (jQuery.browser.msie && parseInt(jQuery.browser.version, 10) <= 8);
    +
    +$.widget( "ui.iviewer", $.ui.mouse, {
    +    widgetEventPrefix: "iviewer",
    +    options : {
    +        /**
    +        * start zoom value for image, not used now
    +        * may be equal to "fit" to fit image into container or scale in %
    +        **/
    +        zoom: "fit",
    +        /**
    +        * base value to scale image
    +        **/
    +        zoom_base: 100,
    +        /**
    +        * maximum zoom
    +        **/
    +        zoom_max: 800,
    +        /**
    +        * minimum zoom
    +        **/
    +        zoom_min: 25,
    +        /**
    +        * base of rate multiplier.
    +        * zoom is calculated by formula: zoom_base * zoom_delta^rate
    +        **/
    +        zoom_delta: 1.4,
    +        /**
    +        * whether the zoom should be animated.
    +        */
    +        zoom_animation: true,
    +        /**
    +        * if true plugin doesn't add its own controls
    +        **/
    +        ui_disabled: false,
    +        /**
    +         * If false mousewheel will be disabled
    +         */
    +        mousewheel: true,
    +        /**
    +        * if false, plugin doesn't bind resize event on window and this must
    +        * be handled manually
    +        **/
    +        update_on_resize: true,
    +        /**
    +        * event is triggered when zoom value is changed
    +        * @param int new zoom value
    +        * @return boolean if false zoom action is aborted
    +        **/
    +        onZoom: jQuery.noop,
    +        /**
    +        * event is triggered when zoom value is changed after image is set to the new dimensions
    +        * @param int new zoom value
    +        * @return boolean if false zoom action is aborted
    +        **/
    +        onAfterZoom: jQuery.noop,
    +        /**
    +        * event is fired on drag begin
    +        * @param object coords mouse coordinates on the image
    +        * @return boolean if false is returned, drag action is aborted
    +        **/
    +        onStartDrag: jQuery.noop,
    +        /**
    +        * event is fired on drag action
    +        * @param object coords mouse coordinates on the image
    +        **/
    +        onDrag: jQuery.noop,
    +        /**
    +        * event is fired on drag stop
    +        * @param object coords mouse coordinates on the image
    +        **/
    +        onStopDrag: jQuery.noop,
    +        /**
    +        * event is fired when mouse moves over image
    +        * @param object coords mouse coordinates on the image
    +        **/
    +        onMouseMove: jQuery.noop,
    +        /**
    +        * mouse click event
    +        * @param object coords mouse coordinates on the image
    +        **/
    +        onClick: jQuery.noop,
    +        /**
    +        * event is fired when image starts to load
    +        */
    +        onStartLoad: null,
    +        /**
    +        * event is fired, when image is loaded and initially positioned
    +        */
    +        onFinishLoad: null
    +    },
    +
    +    _create: function() {
    +        var me = this;
    +
    +        //drag variables
    +        this.dx = 0;
    +        this.dy = 0;
    +
    +        /* object containing actual information about image
    +        *   @img_object.object - jquery img object
    +        *   @img_object.orig_{width|height} - original dimensions
    +        *   @img_object.display_{width|height} - actual dimensions
    +        */
    +        this.img_object = {};
    +
    +        this.zoom_object = {}; //object to show zoom status
    +
    +        this._angle = 0;
    +
    +        this.current_zoom = this.options.zoom;
    +
    +        if(this.options.src === null){
    +            return;
    +        }
    +
    +        this.container = this.element;
    +
    +        this._updateContainerInfo();
    +
    +        //init container
    +        this.container.css("overflow","hidden");
    +
    +        if(this.options.update_on_resize == true)
    +        {
    +            $(window).resize(function()
    +            {
    +                me._updateContainerInfo();
    +            });
    +        }
    +
    +        this.img_object = new $.ui.iviewer.ImageObject(this.options.zoom_animation);
    +
    +        if (this.options.mousewheel) {
    +            this.img_object.object()
    +                .mousewheel(function(ev, delta)
    +                {
    +                    //this event is there instead of containing div, because
    +                    //at opera it triggers many times on div
    +                    var zoom = (delta > 0)?1:-1;
    +                    me.zoom_by(zoom);
    +                    return false;
    +                });
    +        }
    +
    +        //init object
    +        this.img_object.object()
    +            //bind mouse events
    +            .click(function(e){return me._click(e)})
    +                .prependTo(this.container);
    +
    +        this.container.bind('mousemove', function(ev) { me._handleMouseMove(ev); });
    +
    +        this.loadImage(this.options.src);
    +
    +        if(!this.options.ui_disabled)
    +        {
    +            this.createui();
    +        }
    +
    +        this._mouseInit();
    +    },
    +
    +    destroy: function() {
    +        this._mouseDestroy();
    +    },
    +
    +    _updateContainerInfo: function()
    +    {
    +        this.options.height = this.container.height();
    +        this.options.width = this.container.width();
    +    },
    +
    +    loadImage: function( src )
    +    {
    +        this.current_zoom = this.options.zoom;
    +        var me = this;
    +
    +        this._trigger('onStartLoad', 0, src);
    +
    +        this.container.addClass("iviewer_loading");
    +        this.img_object.load(src, function() {
    +            me._imageLoaded(src);
    +        });
    +    },
    +
    +    _imageLoaded: function(src) {
    +        this.container.removeClass("iviewer_loading");
    +        this.container.addClass("iviewer_cursor");
    +
    +        if(this.options.zoom == "fit"){
    +            this.fit(true);
    +        }
    +        else {
    +            this.set_zoom(this.options.zoom, true);
    +        }
    +
    +        this._trigger('onFinishLoad', 0, src);
    +    },
    +
    +    /**
    +    * fits image in the container
    +    *
    +    * @param {boolean} skip_animation
    +    **/
    +    fit: function(skip_animation)
    +    {
    +        var aspect_ratio = this.img_object.orig_width() / this.img_object.orig_height();
    +        var window_ratio = this.options.width /  this.options.height;
    +        var choose_left = (aspect_ratio > window_ratio);
    +        var new_zoom = 0;
    +
    +        if(choose_left){
    +            new_zoom = this.options.width / this.img_object.orig_width() * 100;
    +        }
    +        else {
    +            new_zoom = this.options.height / this.img_object.orig_height() * 100;
    +        }
    +
    +      this.set_zoom(new_zoom, skip_animation);
    +    },
    +
    +    /**
    +    * center image in container
    +    **/
    +    center: function()
    +    {
    +        this.setCoords(-Math.round((this.img_object.display_width() - this.options.width)/2),
    +                -Math.round((this.img_object.display_height() - this.options.height)/2));
    +    },
    +
    +    /**
    +    *   move a point in container to the center of display area
    +    *   @param x a point in container
    +    *   @param y a point in container
    +    **/
    +    moveTo: function(x, y)
    +    {
    +        var dx = x-Math.round(this.options.width/2);
    +        var dy = y-Math.round(this.options.height/2);
    +
    +        var new_x = this.img_object.x() - dx;
    +        var new_y = this.img_object.y() - dy;
    +
    +        this.setCoords(new_x, new_y);
    +    },
    +
    +    /**
    +     * Get container offset object.
    +     */
    +    getContainerOffset: function() {
    +        return jQuery.extend({}, this.container.offset());
    +    },
    +
    +    /**
    +    * set coordinates of upper left corner of image object
    +    **/
    +    setCoords: function(x,y)
    +    {
    +        //do nothing while image is being loaded
    +        if(!this.img_object.loaded()) { return; }
    +
    +        var coords = this._correctCoords(x,y);
    +        this.img_object.x(coords.x);
    +        this.img_object.y(coords.y);
    +    },
    +
    +    _correctCoords: function( x, y )
    +    {
    +        x = parseInt(x, 10);
    +        y = parseInt(y, 10);
    +
    +        //check new coordinates to be correct (to be in rect)
    +        if(y > 0){
    +            y = 0;
    +        }
    +        if(x > 0){
    +            x = 0;
    +        }
    +        if(y + this.img_object.display_height() < this.options.height){
    +            y = this.options.height - this.img_object.display_height();
    +        }
    +        if(x + this.img_object.display_width() < this.options.width){
    +            x = this.options.width - this.img_object.display_width();
    +        }
    +        if(this.img_object.display_width() <= this.options.width){
    +            x = -(this.img_object.display_width() - this.options.width)/2;
    +        }
    +        if(this.img_object.display_height() <= this.options.height){
    +            y = -(this.img_object.display_height() - this.options.height)/2;
    +        }
    +
    +        return { x: x, y:y };
    +    },
    +
    +
    +    /**
    +    * convert coordinates on the container to the coordinates on the image (in original size)
    +    *
    +    * @return object with fields x,y according to coordinates or false
    +    * if initial coords are not inside image
    +    **/
    +    containerToImage : function (x,y)
    +    {
    +        var coords = { x : x - this.img_object.x(),
    +                 y :  y - this.img_object.y()
    +        };
    +
    +        coords = this.img_object.toOriginalCoords(coords);
    +
    +        return { x :  util.descaleValue(coords.x, this.current_zoom),
    +                 y :  util.descaleValue(coords.y, this.current_zoom)
    +        };
    +    },
    +
    +    /**
    +    * convert coordinates on the image (in original size, and zero angle) to the coordinates on the container
    +    *
    +    * @return object with fields x,y according to coordinates
    +    **/
    +    imageToContainer : function (x,y)
    +    {
    +        var coords = {
    +                x : util.scaleValue(x, this.current_zoom),
    +                y : util.scaleValue(y, this.current_zoom)
    +            };
    +
    +        return this.img_object.toRealCoords(coords);
    +    },
    +
    +    /**
    +    * get mouse coordinates on the image
    +    * @param e - object containing pageX and pageY fields, e.g. mouse event object
    +    *
    +    * @return object with fields x,y according to coordinates or false
    +    * if initial coords are not inside image
    +    **/
    +    _getMouseCoords : function(e)
    +    {
    +        var containerOffset = this.container.offset();
    +            coords = this.containerToImage(e.pageX - containerOffset.left, e.pageY - containerOffset.top);
    +
    +        return coords;
    +    },
    +
    +    /**
    +    * set image scale to the new_zoom
    +    *
    +    * @param {number} new_zoom image scale in %
    +    * @param {boolean} skip_animation
    +    **/
    +    set_zoom: function(new_zoom, skip_animation)
    +    {
    +        if (this._trigger('onZoom', 0, new_zoom) == false) {
    +            return;
    +        }
    +
    +        //do nothing while image is being loaded
    +        if(!this.img_object.loaded()) { return; }
    +
    +        if(new_zoom <  this.options.zoom_min)
    +        {
    +            new_zoom = this.options.zoom_min;
    +        }
    +        else if(new_zoom > this.options.zoom_max)
    +        {
    +            new_zoom = this.options.zoom_max;
    +        }
    +
    +        /* we fake these values to make fit zoom properly work */
    +        if(this.current_zoom == "fit")
    +        {
    +            var old_x = Math.round(this.options.width/2 + this.img_object.orig_width()/2);
    +            var old_y = Math.round(this.options.height/2 + this.img_object.orig_height()/2);
    +            this.current_zoom = 100;
    +        }
    +        else {
    +            var old_x = -this.img_object.x() + Math.round(this.options.width/2);
    +            var old_y = -this.img_object.y() + Math.round(this.options.height/2);
    +        }
    +
    +        var new_width = util.scaleValue(this.img_object.orig_width(), new_zoom);
    +        var new_height = util.scaleValue(this.img_object.orig_height(), new_zoom);
    +        var new_x = util.scaleValue( util.descaleValue(old_x, this.current_zoom), new_zoom);
    +        var new_y = util.scaleValue( util.descaleValue(old_y, this.current_zoom), new_zoom);
    +
    +        new_x = this.options.width/2 - new_x;
    +        new_y = this.options.height/2 - new_y;
    +
    +        this.img_object.display_width(new_width);
    +        this.img_object.display_height(new_height);
    +
    +        var coords = this._correctCoords( new_x, new_y ),
    +            self = this;
    +
    +        this.img_object.setImageProps(new_width, new_height, coords.x, coords.y,
    +                                        skip_animation, function() {
    +            self._trigger('onAfterZoom', 0, new_zoom );
    +        });
    +        this.current_zoom = new_zoom;
    +
    +        this.update_status();
    +    },
    +
    +    /**
    +    * changes zoom scale by delta
    +    * zoom is calculated by formula: zoom_base * zoom_delta^rate
    +    * @param Integer delta number to add to the current multiplier rate number
    +    **/
    +    zoom_by: function(delta)
    +    {
    +        var closest_rate = this.find_closest_zoom_rate(this.current_zoom);
    +
    +        var next_rate = closest_rate + delta;
    +        var next_zoom = this.options.zoom_base * Math.pow(this.options.zoom_delta, next_rate)
    +        if(delta > 0 && next_zoom < this.current_zoom)
    +        {
    +            next_zoom *= this.options.zoom_delta;
    +        }
    +
    +        if(delta < 0 && next_zoom > this.current_zoom)
    +        {
    +            next_zoom /= this.options.zoom_delta;
    +        }
    +
    +        this.set_zoom(next_zoom);
    +    },
    +
    +    /**
    +    * Rotate image
    +    * @param {num} deg Degrees amount to rotate. Positive values rotate image clockwise.
    +    *     Currently 0, 90, 180, 270 and -90, -180, -270 values are supported
    +    *
    +    * @param {boolean} abs If the flag is true if, the deg parameter will be considered as
    +    *     a absolute value and relative otherwise.
    +    * @return {num|null} Method will return current image angle if called without any arguments.
    +    **/
    +    angle: function(deg, abs) {
    +        if (arguments.length === 0) { return this.img_object.angle(); }
    +
    +        if (deg < -270 || deg > 270 || deg % 90 !== 0) { return; }
    +        if (!abs) { deg += this.img_object.angle(); }
    +        if (deg < 0) { deg += 360; }
    +        if (deg >= 360) { deg -= 360; }
    +
    +        if (deg === this.img_object.angle()) { return; }
    +
    +        this.img_object.angle(deg);
    +        //the rotate behavior is different in all editors. For now we  just center the
    +        //image. However, it will be better to try to keep the position.
    +        this.center();
    +        this._trigger('angle', 0, { angle: this.img_object.angle() });
    +    },
    +
    +    /**
    +    * finds closest multiplier rate for value
    +    * basing on zoom_base and zoom_delta values from settings
    +    * @param Number value zoom value to examine
    +    **/
    +    find_closest_zoom_rate: function(value)
    +    {
    +        if(value == this.options.zoom_base)
    +        {
    +            return 0;
    +        }
    +
    +        function div(val1,val2) { return val1 / val2 };
    +        function mul(val1,val2) { return val1 * val2 };
    +
    +        var func = (value > this.options.zoom_base)?mul:div;
    +        var sgn = (value > this.options.zoom_base)?1:-1;
    +
    +        var mltplr = this.options.zoom_delta;
    +        var rate = 1;
    +
    +        while(Math.abs(func(this.options.zoom_base, Math.pow(mltplr,rate)) - value) >
    +              Math.abs(func(this.options.zoom_base, Math.pow(mltplr,rate+1)) - value))
    +        {
    +            rate++;
    +        }
    +
    +        return sgn * rate;
    +    },
    +
    +    /* update scale info in the container */
    +    update_status: function()
    +    {
    +        if(!this.options.ui_disabled)
    +        {
    +            var percent = Math.round(100*this.img_object.display_height()/this.img_object.orig_height());
    +            if(percent)
    +            {
    +                this.zoom_object.html(percent + "%");
    +            }
    +        }
    +    },
    +
    +    /**
    +     * Get some information about the image.
    +     *     Currently orig_(width|height), display_(width|height), angle, zoom and src params are supported.
    +     *
    +     *  @param {string} parameter to check
    +     *  @param {boolean} withoutRotation if param is orig_width or orig_height and this flag is set to true,
    +     *      method will return original image width without considering rotation.
    +     *
    +     */
    +    info: function(param, withoutRotation) {
    +        if (!param) { return; }
    +
    +        switch (param) {
    +            case 'orig_width':
    +            case 'orig_height':
    +                if (withoutRotation) {
    +                    return (this.img_object.angle() % 180 === 0 ? this.img_object[param]() :
    +                            param === 'orig_width' ? this.img_object.orig_height() : 
    +                                                        this.img_object.orig_width());
    +                } else {
    +                    return this.img_object[param]();
    +                }
    +            case 'display_width':
    +            case 'display_height':
    +            case 'angle':
    +                return this.img_object[param]();
    +            case 'zoom':
    +                return this.current_zoom;
    +            case 'src':
    +                return this.img_object.object().attr('src');
    +            case 'coords':
    +                return {
    +                    x: this.img_object.x(),
    +                    y: this.img_object.y()
    +                };
    +        }
    +    },
    +
    +    /**
    +    *   callback for handling mousdown event to start dragging image
    +    **/
    +    _mouseStart: function( e )
    +    {
    +        $.ui.mouse.prototype._mouseStart.call(this, e);
    +        if (this._trigger('onStartDrag', 0, this._getMouseCoords(e)) === false) {
    +            return false;
    +        }
    +
    +        /* start drag event*/
    +        this.container.addClass("iviewer_drag_cursor");
    +
    +        this.dx = e.pageX - this.img_object.x();
    +        this.dy = e.pageY - this.img_object.y();
    +        return true;
    +    },
    +
    +    _mouseCapture: function( e ) {
    +        return true;
    +    },
    +
    +    /**
    +     * Handle mouse move if needed. User can avoid using this callback, because
    +     *    he can get the same information through public methods.
    +     *  @param {jQuery.Event} e
    +     */
    +    _handleMouseMove: function(e) {
    +        this._trigger('onMouseMove', e, this._getMouseCoords(e));
    +    },
    +
    +    /**
    +    *   callback for handling mousemove event to drag image
    +    **/
    +    _mouseDrag: function(e)
    +    {
    +        $.ui.mouse.prototype._mouseDrag.call(this, e);
    +        var ltop =  e.pageY - this.dy;
    +        var lleft = e.pageX - this.dx;
    +
    +        this.setCoords(lleft, ltop);
    +        this._trigger('onDrag', e, this._getMouseCoords(e));
    +        return false;
    +    },
    +
    +    /**
    +    *   callback for handling stop drag
    +    **/
    +    _mouseStop: function(e)
    +    {
    +        $.ui.mouse.prototype._mouseStop.call(this, e);
    +        this.container.removeClass("iviewer_drag_cursor");
    +        this._trigger('onStopDrag', 0, this._getMouseCoords(e));
    +    },
    +
    +    _click: function(e)
    +    {
    +        this._trigger('onClick', 0, this._getMouseCoords(e));
    +    },
    +
    +    /**
    +    *   create zoom buttons info box
    +    **/
    +    createui: function()
    +    {
    +        var me=this;
    +
    +        $("<div>", { 'class': "iviewer_zoom_in iviewer_common iviewer_button"})
    +                    .bind('mousedown touchstart',function(){me.zoom_by(1); return false;})
    +                    .appendTo(this.container);
    +
    +        $("<div>", { 'class': "iviewer_zoom_out iviewer_common iviewer_button"})
    +                    .bind('mousedown touchstart',function(){me.zoom_by(- 1); return false;})
    +                    .appendTo(this.container);
    +
    +        $("<div>", { 'class': "iviewer_zoom_zero iviewer_common iviewer_button"})
    +                    .bind('mousedown touchstart',function(){me.set_zoom(100); return false;})
    +                    .appendTo(this.container);
    +
    +        $("<div>", { 'class': "iviewer_zoom_fit iviewer_common iviewer_button"})
    +                    .bind('mousedown touchstart',function(){me.fit(this); return false;})
    +                    .appendTo(this.container);
    +
    +        this.zoom_object = $("<div>").addClass("iviewer_zoom_status iviewer_common")
    +                                    .appendTo(this.container);
    +
    +        $("<div>", { 'class': "iviewer_rotate_left iviewer_common iviewer_button"})
    +                    .bind('mousedown touchstart',function(){me.angle(-90); return false;})
    +                    .appendTo(this.container);
    +
    +        $("<div>", { 'class': "iviewer_rotate_right iviewer_common iviewer_button" })
    +                    .bind('mousedown touchstart',function(){me.angle(90); return false;})
    +                    .appendTo(this.container);
    +
    +        this.update_status(); //initial status update
    +    }
    +
    +} );
    +
    +/**
    + * @class $.ui.iviewer.ImageObject Class represents image and provides public api without
    + *     extending image prototype.
    + * @constructor
    + * @param {boolean} do_anim Do we want to animate image on dimension changes?
    + */
    +$.ui.iviewer.ImageObject = function(do_anim) {
    +    this._img = $("<img>")
    +            //this is needed, because chromium sets them auto otherwise
    +            .css({ position: "absolute", top :"0px", left: "0px"});
    +
    +    this._loaded = false;
    +    this._swapDimensions = false;
    +    this._do_anim = do_anim || false;
    +    this.x(0, true);
    +    this.y(0, true);
    +    this.angle(0);
    +};
    +
    +
    +/** @lends $.ui.iviewer.ImageObject.prototype */
    +(function() {
    +    /**
    +     * Restore initial object state.
    +     *
    +     * @param {number} w Image width.
    +     * @param {number} h Image height.
    +     */
    +    this._reset = function(w, h) {
    +        this._angle = 0;
    +        this._swapDimensions = false;
    +        this.x(0);
    +        this.y(0);
    +
    +        this.orig_width(w);
    +        this.orig_height(h);
    +        this.display_width(w);
    +        this.display_height(h);
    +    };
    +
    +    /**
    +     * Check if image is loaded.
    +     *
    +     * @return {boolean}
    +     */
    +    this.loaded = function() { return this._loaded; };
    +
    +    /**
    +     * Load image.
    +     *
    +     * @param {string} src Image url.
    +     * @param {Function=} loaded Function will be called on image load.
    +     */
    +    this.load = function(src, loaded) {
    +        var self = this;
    +
    +        loaded = loaded || jQuery.noop;
    +        this._loaded = false;
    +
    +        //If we assign new image url to the this._img IE9 fires onload event and image width and
    +        //height are set to zero. So, we create another image object and load image through it.
    +        var img = new Image();
    +        img.onload = function() {
    +            self._loaded = true;
    +            self._reset(this.width, this.height);
    +
    +            self._img
    +                .removeAttr("src")
    +                .removeAttr("width")
    +                .removeAttr("height")
    +                .removeAttr("style")
    +                .css({ position: "absolute", top :"0px", left: "0px"})
    +
    +            self._img[0].src = src;
    +            loaded();
    +        };
    +
    +        img.src = src;
    +        this.angle(0);
    +    };
    +
    +    this._dimension = function(prefix, name) {
    +        var horiz = '_' + prefix + '_' + name,
    +            vert = '_' + prefix + '_' + (name === 'height' ? 'width' : 'height');
    +        return setter(function(val) {
    +                this[this._swapDimensions ? horiz: vert] = val;
    +            },
    +            function() {
    +                return this[this._swapDimensions ? horiz: vert];
    +            });
    +    };
    +
    +    /**
    +     * Getters and setter for common image dimensions.
    +     *    display_ means real image tag dimensions
    +     *    orig_ means physical image dimensions.
    +     *  Note, that dimensions are swapped if image is rotated. It necessary,
    +     *  because as little as possible code should know about rotation.
    +     */
    +    this.display_width = this._dimension('display', 'width'),
    +    this.display_height = this._dimension('display', 'height'),
    +    this.display_diff = function() { return Math.floor( this.display_width() - this.display_height() ) };
    +    this.orig_width = this._dimension('orig', 'width'),
    +    this.orig_height = this._dimension('orig', 'height'),
    +
    +    /**
    +     * Setter for  X coordinate. If image is rotated we need to additionaly shift an
    +     *     image to map image coordinate to the visual position.
    +     *
    +     * @param {number} val Coordinate value.
    +     * @param {boolean} skipCss If true, we only set the value and do not touch the dom.
    +     */
    +    this.x = setter(function(val, skipCss) { 
    +            this._x = val;
    +            if (!skipCss) {
    +                this._img.css("left",this._x + (this._swapDimensions ? this.display_diff() / 2 : 0) + "px");
    +            }
    +        },
    +        function() {
    +            return this._x;
    +        });
    +
    +    /**
    +     * Setter for  Y coordinate. If image is rotated we need to additionaly shift an
    +     *     image to map image coordinate to the visual position.
    +     *
    +     * @param {number} val Coordinate value.
    +     * @param {boolean} skipCss If true, we only set the value and do not touch the dom.
    +     */
    +    this.y = setter(function(val, skipCss) {
    +            this._y = val;
    +            if (!skipCss) {
    +                this._img.css("top",this._y - (this._swapDimensions ? this.display_diff() / 2 : 0) + "px");
    +            }
    +        },
    +       function() {
    +            return this._y;
    +       });
    +
    +    /**
    +     * Perform image rotation.
    +     *
    +     * @param {number} deg Absolute image angle. The method will work with values 0, 90, 180, 270 degrees.
    +     */
    +    this.angle = setter(function(deg) {
    +            var prevSwap = this._swapDimensions;
    +            this._angle = deg;
    +            this._swapDimensions = deg % 180 !== 0;
    +            
    +            if (prevSwap !== this._swapDimensions) {
    +                var verticalMod = this._swapDimensions ? -1 : 1;
    +                this.x(this.x() - verticalMod * this.display_diff() / 2, true);
    +                this.y(this.y() + verticalMod * this.display_diff() / 2, true);
    +            };
    +
    +            var cssVal = 'rotate(' + deg + 'deg)',
    +                img = this._img;
    +
    +            jQuery.each(['', '-webkit-', '-moz-', '-o-', '-ms-'], function(i, prefix) {
    +                img.css(prefix + 'transform', cssVal);
    +            });
    +
    +            if (useIeTransforms) {
    +                jQuery.each(['-ms-', ''], function(i, prefix) {
    +                    img.css(prefix + 'filter', ieTransforms[deg].filter);
    +                });
    +
    +                img.css({
    +                    marginLeft: ieTransforms[deg].marginLeft * this.display_diff() / 2,
    +                    marginTop: ieTransforms[deg].marginTop * this.display_diff() / 2
    +                });
    +            }
    +        },
    +       function() { return this._angle; });
    +
    +    /**
    +     * Map point in the container coordinates to the point in image coordinates.
    +     *     You will get coordinates of point on image with respect to rotation,
    +     *     but will be set as if image was not rotated.
    +     *     So, if image was rotated 90 degrees, it's (0,0) point will be on the
    +     *     top right corner.
    +     *
    +     * @param {{x: number, y: number}} point Point in container coordinates.
    +     * @return  {{x: number, y: number}}
    +     */
    +    this.toOriginalCoords = function(point) {
    +        switch (this.angle()) {
    +            case 0: return { x: point.x, y: point.y }
    +            case 90: return { x: point.y, y: this.display_width() - point.x }
    +            case 180: return { x: this.display_width() - point.x, y: this.display_height() - point.y }
    +            case 270: return { x: this.display_height() - point.y, y: point.x }
    +        }
    +    };
    +
    +    /**
    +     * Map point in the image coordinates to the point in container coordinates.
    +     *     You will get coordinates of point on container with respect to rotation.
    +     *     Note, if image was rotated 90 degrees, it's (0,0) point will be on the
    +     *     top right corner.
    +     *
    +     * @param {{x: number, y: number}} point Point in container coordinates.
    +     * @return  {{x: number, y: number}}
    +     */
    +    this.toRealCoords = function(point) {
    +        switch (this.angle()) {
    +            case 0: return { x: this.x() + point.x, y: this.y() + point.y }
    +            case 90: return { x: this.x() + this.display_width() - point.y, y: this.y() + point.x}
    +            case 180: return { x: this.x() + this.display_width() - point.x, y: this.y() + this.display_height() - point.y}
    +            case 270: return { x: this.x() + point.y, y: this.y() + this.display_height() - point.x}
    +        }
    +    };
    +
    +    /**
    +     * @return {jQuery} Return image node. this is needed to add event handlers.
    +     */
    +    this.object = setter(jQuery.noop,
    +                           function() { return this._img; });
    +
    +    /**
    +     * Change image properties.
    +     *
    +     * @param {number} disp_w Display width;
    +     * @param {number} disp_h Display height;
    +     * @param {number} x
    +     * @param {number} y
    +     * @param {boolean} skip_animation If true, the animation will be skiped despite the
    +     *     value set in constructor.
    +     * @param {Function=} complete Call back will be fired when zoom will be complete.
    +     */
    +    this.setImageProps = function(disp_w, disp_h, x, y, skip_animation, complete) {
    +        complete = complete || jQuery.noop;
    +
    +        this.display_width(disp_w);
    +        this.display_height(disp_h);
    +        this.x(x, true);
    +        this.y(y, true);
    +
    +        var w = this._swapDimensions ? disp_h : disp_w;
    +        var h = this._swapDimensions ? disp_w : disp_h;
    +
    +        var params = {
    +            width: w,
    +            height: h,
    +            top: y - (this._swapDimensions ? this.display_diff() / 2 : 0) + "px",
    +            left: x + (this._swapDimensions ? this.display_diff() / 2 : 0) + "px" 
    +        };
    +
    +        if (useIeTransforms) {
    +            jQuery.extend(params, {
    +                marginLeft: ieTransforms[this.angle()].marginLeft * this.display_diff() / 2,
    +                marginTop: ieTransforms[this.angle()].marginTop * this.display_diff() / 2
    +            });
    +        }
    +
    +        var swapDims = this._swapDimensions,
    +            img = this._img;
    +
    +        //here we come: another IE oddness. If image is rotated 90 degrees with a filter, than
    +        //width and height getters return real width and height of rotated image. The bad news
    +        //is that to set height you need to set a width and vice versa. Fuck IE.
    +        //So, in this case we have to animate width and height manually.
    +        if(useIeTransforms && swapDims) {
    +            var ieh = this._img.width(),
    +                iew = this._img.height(),
    +                iedh = params.height - ieh;
    +                iedw = params.width - iew;
    +
    +            delete params.width;
    +            delete params.height;
    +        }
    +
    +        if (this._do_anim && !skip_animation) {
    +            this._img.stop(true)
    +                .animate(params, {
    +                    duration: 200, 
    +                    complete: complete,
    +                    step: function(now, fx) {
    +                        if(useIeTransforms && swapDims && (fx.prop === 'top')) {
    +                            var percent = (now - fx.start) / (fx.end - fx.start);
    +
    +                            img.height(ieh + iedh * percent);
    +                            img.width(iew + iedw * percent);
    +                            img.css('top', now);
    +                        }
    +                    }
    +                });
    +        } else {
    +            this._img.css(params);
    +            setTimeout(complete, 0); //both if branches should behave equally.
    +        }
    +    };
    +
    +}).apply($.ui.iviewer.ImageObject.prototype);
    +
    +
    +
    +var util = {
    +    scaleValue: function(value, toZoom)
    +    {
    +        return value * toZoom / 100;
    +    },
    +
    +    descaleValue: function(value, fromZoom)
    +    {
    +        return value * 100 / fromZoom;
    +    }
    +};
    +
    + } )( jQuery, undefined );
    diff --git a/src/main/webapp/plug-in/iviewer/jquery.iviewer.min.js b/src/main/webapp/plug-in/iviewer/jquery.iviewer.min.js
    new file mode 100644
    index 00000000..1022980e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/iviewer/jquery.iviewer.min.js
    @@ -0,0 +1,43 @@
    +/*
    + * iviewer Widget for jQuery UI
    + * https://github.com/can3p/iviewer
    + *
    + * Copyright (c) 2009 - 2012 Dmitry Petrov
    + * Dual licensed under the MIT and GPL licenses.
    + *  - http://www.opensource.org/licenses/mit-license.php
    + *  - http://www.gnu.org/copyleft/gpl.html
    + *
    + * Author: Dmitry Petrov
    + * Version: 0.7.1
    + */
    +(function($,undefined){var mouseEvents={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"};function makeMouseEvent(event){var touch=event.originalEvent.changedTouches[0];return $.extend(event,{type:mouseEvents[event.type],which:1,pageX:touch.pageX,pageY:touch.pageY,screenX:touch.screenX,screenY:touch.screenY,clientX:touch.clientX,clientY:touch.clientY,isTouchEvent:true})}var mouseProto=$.ui.mouse.prototype,_mouseInit=$.ui.mouse.prototype._mouseInit;mouseProto._mouseInit=function(){var self=
    +this;self._touchActive=false;this.element.bind("touchstart."+this.widgetName,function(event){self._touchActive=true;return self._mouseDown(makeMouseEvent(event))});var self=this;this._mouseMoveDelegate=function(event){if(self._touchActive)return self._mouseMove(makeMouseEvent(event))};this._mouseUpDelegate=function(event){if(self._touchActive){self._touchActive=false;return self._mouseUp(makeMouseEvent(event))}};$(document).bind("touchmove."+this.widgetName,this._mouseMoveDelegate).bind("touchend."+
    +this.widgetName,this._mouseUpDelegate);_mouseInit.apply(this)};var setter=function(setter,getter){return function(val){if(arguments.length===0)return getter.apply(this);else setter.apply(this,arguments)}};var ieTransforms={"0":{marginLeft:0,marginTop:0,filter:'progid:DXImageTransform.Microsoft.Matrix(M11=1, M12=0, M21=0, M22=1, SizingMethod="auto expand")'},"90":{marginLeft:-1,marginTop:1,filter:'progid:DXImageTransform.Microsoft.Matrix(M11=0, M12=-1, M21=1, M22=0, SizingMethod="auto expand")'},"180":{marginLeft:0,
    +marginTop:0,filter:'progid:DXImageTransform.Microsoft.Matrix(M11=-1, M12=0, M21=0, M22=-1, SizingMethod="auto expand")'},"270":{marginLeft:-1,marginTop:1,filter:'progid:DXImageTransform.Microsoft.Matrix(M11=0, M12=1, M21=-1, M22=0, SizingMethod="auto expand")'}},useIeTransforms=jQuery.browser.msie&&parseInt(jQuery.browser.version,10)<=8;$.widget("ui.iviewer",$.ui.mouse,{widgetEventPrefix:"iviewer",options:{zoom:"fit",zoom_base:100,zoom_max:800,zoom_min:25,zoom_delta:1.4,zoom_animation:true,ui_disabled:false,
    +update_on_resize:true,onZoom:jQuery.noop,onAfterZoom:jQuery.noop,onStartDrag:jQuery.noop,onDrag:jQuery.noop,onStopDrag:jQuery.noop,onMouseMove:jQuery.noop,onClick:jQuery.noop,onStartLoad:null,onFinishLoad:null},_create:function(){var me=this;this.dx=0;this.dy=0;this.img_object={};this.zoom_object={};this._angle=0;this.current_zoom=this.options.zoom;if(this.options.src===null)return;this.container=this.element;this._updateContainerInfo();this.container.css("overflow","hidden");if(this.options.update_on_resize==
    +true)$(window).resize(function(){me._updateContainerInfo()});this.img_object=new $.ui.iviewer.ImageObject(this.options.zoom_animation);this.img_object.object().click(function(e){return me._click(e)}).mousewheel(function(ev,delta){var zoom=delta>0?1:-1;me.zoom_by(zoom);return false}).prependTo(this.container);this.container.bind("mousemove",function(ev){me._handleMouseMove(ev)});this.loadImage(this.options.src);if(!this.options.ui_disabled)this.createui();this._mouseInit()},destroy:function(){this._mouseDestroy()},
    +_updateContainerInfo:function(){this.options.height=this.container.height();this.options.width=this.container.width()},loadImage:function(src){this.current_zoom=this.options.zoom;var me=this;this._trigger("onStartLoad",0,src);this.container.addClass("iviewer_loading");this.img_object.load(src,function(){me._imageLoaded(src)})},_imageLoaded:function(src){this.container.removeClass("iviewer_loading");this.container.addClass("iviewer_cursor");if(this.options.zoom=="fit")this.fit(true);else this.set_zoom(this.options.zoom,
    +true);this._trigger("onFinishLoad",0,src)},fit:function(skip_animation){var aspect_ratio=this.img_object.orig_width()/this.img_object.orig_height();var window_ratio=this.options.width/this.options.height;var choose_left=aspect_ratio>window_ratio;var new_zoom=0;if(choose_left)new_zoom=this.options.width/this.img_object.orig_width()*100;else new_zoom=this.options.height/this.img_object.orig_height()*100;this.set_zoom(new_zoom,skip_animation)},center:function(){this.setCoords(-Math.round((this.img_object.display_width()-
    +this.options.width)/2),-Math.round((this.img_object.display_height()-this.options.height)/2))},moveTo:function(x,y){var dx=x-Math.round(this.options.width/2);var dy=y-Math.round(this.options.height/2);var new_x=this.img_object.x()-dx;var new_y=this.img_object.y()-dy;this.setCoords(new_x,new_y)},getContainerOffset:function(){return jQuery.extend({},this.container.offset())},setCoords:function(x,y){if(!this.img_object.loaded())return;var coords=this._correctCoords(x,y);this.img_object.x(coords.x);this.img_object.y(coords.y)},
    +_correctCoords:function(x,y){x=parseInt(x,10);y=parseInt(y,10);if(y>0)y=0;if(x>0)x=0;if(y+this.img_object.display_height()<this.options.height)y=this.options.height-this.img_object.display_height();if(x+this.img_object.display_width()<this.options.width)x=this.options.width-this.img_object.display_width();if(this.img_object.display_width()<=this.options.width)x=-(this.img_object.display_width()-this.options.width)/2;if(this.img_object.display_height()<=this.options.height)y=-(this.img_object.display_height()-
    +this.options.height)/2;return{x:x,y:y}},containerToImage:function(x,y){var coords={x:x-this.img_object.x(),y:y-this.img_object.y()};coords=this.img_object.toOriginalCoords(coords);return{x:util.descaleValue(coords.x,this.current_zoom),y:util.descaleValue(coords.y,this.current_zoom)}},imageToContainer:function(x,y){var coords={x:util.scaleValue(x,this.current_zoom),y:util.scaleValue(y,this.current_zoom)};return this.img_object.toRealCoords(coords)},_getMouseCoords:function(e){var containerOffset=this.container.offset();
    +coords=this.containerToImage(e.pageX-containerOffset.left,e.pageY-containerOffset.top);return coords},set_zoom:function(new_zoom,skip_animation){if(this._trigger("onZoom",0,new_zoom)==false)return;if(!this.img_object.loaded())return;if(new_zoom<this.options.zoom_min)new_zoom=this.options.zoom_min;else if(new_zoom>this.options.zoom_max)new_zoom=this.options.zoom_max;if(this.current_zoom=="fit"){var old_x=Math.round(this.options.width/2+this.img_object.orig_width()/2);var old_y=Math.round(this.options.height/
    +2+this.img_object.orig_height()/2);this.current_zoom=100}else{var old_x=-this.img_object.x()+Math.round(this.options.width/2);var old_y=-this.img_object.y()+Math.round(this.options.height/2)}var new_width=util.scaleValue(this.img_object.orig_width(),new_zoom);var new_height=util.scaleValue(this.img_object.orig_height(),new_zoom);var new_x=util.scaleValue(util.descaleValue(old_x,this.current_zoom),new_zoom);var new_y=util.scaleValue(util.descaleValue(old_y,this.current_zoom),new_zoom);new_x=this.options.width/
    +2-new_x;new_y=this.options.height/2-new_y;this.img_object.display_width(new_width);this.img_object.display_height(new_height);var coords=this._correctCoords(new_x,new_y),self=this;this.img_object.setImageProps(new_width,new_height,coords.x,coords.y,skip_animation,function(){self._trigger("onAfterZoom",0,new_zoom)});this.current_zoom=new_zoom;this.update_status()},zoom_by:function(delta){var closest_rate=this.find_closest_zoom_rate(this.current_zoom);var next_rate=closest_rate+delta;var next_zoom=
    +this.options.zoom_base*Math.pow(this.options.zoom_delta,next_rate);if(delta>0&&next_zoom<this.current_zoom)next_zoom*=this.options.zoom_delta;if(delta<0&&next_zoom>this.current_zoom)next_zoom/=this.options.zoom_delta;this.set_zoom(next_zoom)},angle:function(deg,abs){if(arguments.length===0)return this.img_object.angle();if(deg<-270||deg>270||deg%90!==0)return;if(!abs)deg+=this.img_object.angle();if(deg<0)deg+=360;if(deg>=360)deg-=360;if(deg===this.img_object.angle())return;this.img_object.angle(deg);
    +this.center();this._trigger("angle",0,{angle:this.img_object.angle()})},find_closest_zoom_rate:function(value){if(value==this.options.zoom_base)return 0;function div(val1,val2){return val1/val2}function mul(val1,val2){return val1*val2}var func=value>this.options.zoom_base?mul:div;var sgn=value>this.options.zoom_base?1:-1;var mltplr=this.options.zoom_delta;var rate=1;while(Math.abs(func(this.options.zoom_base,Math.pow(mltplr,rate))-value)>Math.abs(func(this.options.zoom_base,Math.pow(mltplr,rate+1))-
    +value))rate++;return sgn*rate},update_status:function(){if(!this.options.ui_disabled){var percent=Math.round(100*this.img_object.display_height()/this.img_object.orig_height());if(percent)this.zoom_object.html(percent+"%")}},info:function(param,withoutRotation){if(!param)return;switch(param){case "orig_width":case "orig_height":if(withoutRotation)return this.img_object.angle()%180===0?this.img_object[param]():param==="orig_width"?this.img_object.orig_height():this.img_object.orig_width();else return this.img_object[param]();
    +case "display_width":case "display_height":case "angle":return this.img_object[param]();case "zoom":return this.current_zoom;case "src":return this.img_object.object().attr("src")}},_mouseStart:function(e){$.ui.mouse.prototype._mouseStart.call(this,e);if(this._trigger("onStartDrag",0,this._getMouseCoords(e))===false)return false;this.container.addClass("iviewer_drag_cursor");this.dx=e.pageX-this.img_object.x();this.dy=e.pageY-this.img_object.y();return true},_mouseCapture:function(e){return true},
    +_handleMouseMove:function(e){this._trigger("onMouseMove",e,this._getMouseCoords(e))},_mouseDrag:function(e){$.ui.mouse.prototype._mouseDrag.call(this,e);var ltop=e.pageY-this.dy;var lleft=e.pageX-this.dx;this.setCoords(lleft,ltop);this._trigger("onDrag",e,this._getMouseCoords(e));return false},_mouseStop:function(e){$.ui.mouse.prototype._mouseStop.call(this,e);this.container.removeClass("iviewer_drag_cursor");this._trigger("onStopDrag",0,this._getMouseCoords(e))},_click:function(e){this._trigger("onClick",
    +0,this._getMouseCoords(e))},createui:function(){var me=this;$("<div>",{"class":"iviewer_zoom_in iviewer_common iviewer_button"}).bind("mousedown touchstart",function(){me.zoom_by(1);return false}).appendTo(this.container);$("<div>",{"class":"iviewer_zoom_out iviewer_common iviewer_button"}).bind("mousedown touchstart",function(){me.zoom_by(-1);return false}).appendTo(this.container);$("<div>",{"class":"iviewer_zoom_zero iviewer_common iviewer_button"}).bind("mousedown touchstart",function(){me.set_zoom(100);
    +return false}).appendTo(this.container);$("<div>",{"class":"iviewer_zoom_fit iviewer_common iviewer_button"}).bind("mousedown touchstart",function(){me.fit(this);return false}).appendTo(this.container);this.zoom_object=$("<div>").addClass("iviewer_zoom_status iviewer_common").appendTo(this.container);$("<div>",{"class":"iviewer_rotate_left iviewer_common iviewer_button"}).bind("mousedown touchstart",function(){me.angle(-90);return false}).appendTo(this.container);$("<div>",{"class":"iviewer_rotate_right iviewer_common iviewer_button"}).bind("mousedown touchstart",
    +function(){me.angle(90);return false}).appendTo(this.container);this.update_status()}});$.ui.iviewer.ImageObject=function(do_anim){this._img=$("<img>").css({position:"absolute",top:"0px",left:"0px"});this._loaded=false;this._swapDimensions=false;this._do_anim=do_anim||false;this.x(0,true);this.y(0,true);this.angle(0)};(function(){this._reset=function(w,h){this._angle=0;this._swapDimensions=false;this.x(0);this.y(0);this.orig_width(w);this.orig_height(h);this.display_width(w);this.display_height(h)};
    +this.loaded=function(){return this._loaded};this.load=function(src,loaded){var self=this;loaded=loaded||jQuery.noop;this._loaded=false;var img=new Image;img.onload=function(){self._loaded=true;self._reset(this.width,this.height);self._img.removeAttr("src").removeAttr("width").removeAttr("height").removeAttr("style").css({position:"absolute",top:"0px",left:"0px"});self._img[0].src=src;loaded()};img.src=src;this.angle(0)};this._dimension=function(prefix,name){var horiz="_"+prefix+"_"+name,vert="_"+
    +prefix+"_"+(name==="height"?"width":"height");return setter(function(val){this[this._swapDimensions?horiz:vert]=val},function(){return this[this._swapDimensions?horiz:vert]})};this.display_width=this._dimension("display","width"),this.display_height=this._dimension("display","height"),this.display_diff=function(){return Math.floor(this.display_width()-this.display_height())};this.orig_width=this._dimension("orig","width"),this.orig_height=this._dimension("orig","height"),this.x=setter(function(val,
    +skipCss){this._x=val;if(!skipCss)this._img.css("left",this._x+(this._swapDimensions?this.display_diff()/2:0)+"px")},function(){return this._x});this.y=setter(function(val,skipCss){this._y=val;if(!skipCss)this._img.css("top",this._y-(this._swapDimensions?this.display_diff()/2:0)+"px")},function(){return this._y});this.angle=setter(function(deg){var prevSwap=this._swapDimensions;this._angle=deg;this._swapDimensions=deg%180!==0;if(prevSwap!==this._swapDimensions){var verticalMod=this._swapDimensions?
    +-1:1;this.x(this.x()-verticalMod*this.display_diff()/2,true);this.y(this.y()+verticalMod*this.display_diff()/2,true)}var cssVal="rotate("+deg+"deg)",img=this._img;jQuery.each(["","-webkit-","-moz-","-o-","-ms-"],function(i,prefix){img.css(prefix+"transform",cssVal)});if(useIeTransforms){jQuery.each(["-ms-",""],function(i,prefix){img.css(prefix+"filter",ieTransforms[deg].filter)});img.css({marginLeft:ieTransforms[deg].marginLeft*this.display_diff()/2,marginTop:ieTransforms[deg].marginTop*this.display_diff()/
    +2})}},function(){return this._angle});this.toOriginalCoords=function(point){switch(this.angle()){case 0:return{x:point.x,y:point.y};case 90:return{x:point.y,y:this.display_width()-point.x};case 180:return{x:this.display_width()-point.x,y:this.display_height()-point.y};case 270:return{x:this.display_height()-point.y,y:point.x}}};this.toRealCoords=function(point){switch(this.angle()){case 0:return{x:this.x()+point.x,y:this.y()+point.y};case 90:return{x:this.x()+this.display_width()-point.y,y:this.y()+
    +point.x};case 180:return{x:this.x()+this.display_width()-point.x,y:this.y()+this.display_height()-point.y};case 270:return{x:this.x()+point.y,y:this.y()+this.display_height()-point.x}}};this.object=setter(jQuery.noop,function(){return this._img});this.setImageProps=function(disp_w,disp_h,x,y,skip_animation,complete){complete=complete||jQuery.noop;this.display_width(disp_w);this.display_height(disp_h);this.x(x,true);this.y(y,true);var w=this._swapDimensions?disp_h:disp_w;var h=this._swapDimensions?
    +disp_w:disp_h;var params={width:w,height:h,top:y-(this._swapDimensions?this.display_diff()/2:0)+"px",left:x+(this._swapDimensions?this.display_diff()/2:0)+"px"};if(useIeTransforms)jQuery.extend(params,{marginLeft:ieTransforms[this.angle()].marginLeft*this.display_diff()/2,marginTop:ieTransforms[this.angle()].marginTop*this.display_diff()/2});var swapDims=this._swapDimensions,img=this._img;if(useIeTransforms&&swapDims){var ieh=this._img.width(),iew=this._img.height(),iedh=params.height-ieh;iedw=params.width-
    +iew;delete params.width;delete params.height}if(this._do_anim&&!skip_animation)this._img.animate(params,{duration:200,complete:complete,step:function(now,fx){if(useIeTransforms&&swapDims&&fx.prop==="top"){var percent=(now-fx.start)/(fx.end-fx.start);img.height(ieh+iedh*percent);img.width(iew+iedw*percent);img.css("top",now)}}});else{this._img.css(params);setTimeout(complete,0)}}}).apply($.ui.iviewer.ImageObject.prototype);var util={scaleValue:function(value,toZoom){return value*toZoom/100},descaleValue:function(value,
    +fromZoom){return value*100/fromZoom}}})(jQuery,undefined);
    diff --git a/src/main/webapp/plug-in/iviewer/jquery.mousewheel.min.js b/src/main/webapp/plug-in/iviewer/jquery.mousewheel.min.js
    new file mode 100644
    index 00000000..e39a83ad
    --- /dev/null
    +++ b/src/main/webapp/plug-in/iviewer/jquery.mousewheel.min.js
    @@ -0,0 +1,13 @@
    +/*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net)
    + * Licensed under the MIT License (LICENSE.txt).
    + *
    + * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
    + * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
    + * Thanks to: Seamus Leahy for adding deltaX and deltaY
    + *
    + * Version: 3.0.6
    + * 
    + * Requires: 1.2.2+
    + */
    +(function(d){function e(a){var b=a||window.event,c=[].slice.call(arguments,1),f=0,e=0,g=0,a=d.event.fix(b);a.type="mousewheel";b.wheelDelta&&(f=b.wheelDelta/120);b.detail&&(f=-b.detail/3);g=f;b.axis!==void 0&&b.axis===b.HORIZONTAL_AXIS&&(g=0,e=-1*f);b.wheelDeltaY!==void 0&&(g=b.wheelDeltaY/120);b.wheelDeltaX!==void 0&&(e=-1*b.wheelDeltaX/120);c.unshift(a,f,e,g);return(d.event.dispatch||d.event.handle).apply(this,c)}var c=["DOMMouseScroll","mousewheel"];if(d.event.fixHooks)for(var h=c.length;h;)d.event.fixHooks[c[--h]]=
    +d.event.mouseHooks;d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=c.length;a;)this.addEventListener(c[--a],e,false);else this.onmousewheel=e},teardown:function(){if(this.removeEventListener)for(var a=c.length;a;)this.removeEventListener(c[--a],e,false);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/iviewer/jqueryui.js b/src/main/webapp/plug-in/iviewer/jqueryui.js
    new file mode 100644
    index 00000000..17da2296
    --- /dev/null
    +++ b/src/main/webapp/plug-in/iviewer/jqueryui.js
    @@ -0,0 +1,50 @@
    +/*!
    + * jQuery UI 1.8.11
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI
    + */
    +(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.11",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
    +NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
    +"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
    +if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
    +"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
    +d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
    +c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
    +b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
    +;/*!
    + * jQuery UI Widget 1.8.11
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Widget
    + */
    +(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
    +a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
    +e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
    +this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
    +widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
    +enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
    +;/*!
    + * jQuery UI Mouse 1.8.11
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Mouse
    + *
    + * Depends:
    + *	jquery.ui.widget.js
    + */
    +(function(b){b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(c){return a._mouseDown(c)}).bind("click."+this.widgetName,function(c){if(true===b.data(c.target,a.widgetName+".preventClickEvent")){b.removeData(c.target,a.widgetName+".preventClickEvent");c.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=
    +a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var c=this,e=a.which==1,f=typeof this.options.cancel=="string"?b(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){c.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=
    +this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return true}}true===b.data(a.target,this.widgetName+".preventClickEvent")&&b.removeData(a.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(d){return c._mouseMove(d)};this._mouseUpDelegate=function(d){return c._mouseUp(d)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return a.originalEvent.mouseHandled=
    +true}},_mouseMove:function(a){if(b.browser.msie&&!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);
    +if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
    +;
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jmobile/css/jquery-ui.css b/src/main/webapp/plug-in/jmobile/css/jquery-ui.css
    new file mode 100644
    index 00000000..402f8301
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jmobile/css/jquery-ui.css
    @@ -0,0 +1,1311 @@
    +.ui-helper-hidden {
    +	DISPLAY: none
    +}
    +.ui-helper-hidden-accessible {
    +	CLIP: rect(0px 0px 0px 0px); BORDER-BOTTOM: 0px; POSITION: absolute; BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: -1px; PADDING-LEFT: 0px; WIDTH: 1px; PADDING-RIGHT: 0px; HEIGHT: 1px; OVERFLOW: hidden; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +.ui-helper-reset {
    +	BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.3; LIST-STYLE-TYPE: none; MARGIN: 0px; OUTLINE-STYLE: none; OUTLINE-COLOR: invert; PADDING-LEFT: 0px; OUTLINE-WIDTH: 0px; PADDING-RIGHT: 0px; FONT-SIZE: 100%; BORDER-TOP: 0px; LIST-STYLE-IMAGE: none; BORDER-RIGHT: 0px; TEXT-DECORATION: none; PADDING-TOP: 0px
    +}
    +.ui-helper-clearfix:before {
    +	DISPLAY: table; CONTENT: ""
    +}
    +.ui-helper-clearfix:after {
    +	DISPLAY: table; CONTENT: ""
    +}
    +.ui-helper-clearfix:after {
    +	CLEAR: both
    +}
    +.ui-helper-clearfix {
    +	ZOOM: 1
    +}
    +.ui-helper-zfix {
    +	POSITION: absolute; FILTER: Alpha(Opacity=0); WIDTH: 100%; HEIGHT: 100%; TOP: 0px; LEFT: 0px; opacity: 0
    +}
    +.ui-state-disabled {
    +	CURSOR: default !important
    +}
    +.ui-icon {
    +	TEXT-INDENT: -99999px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; OVERFLOW: hidden
    +}
    +.ui-widget-overlay {
    +	POSITION: absolute; WIDTH: 100%; HEIGHT: 100%; TOP: 0px; LEFT: 0px
    +}
    +.ui-accordion .ui-accordion-header {
    +	POSITION: relative; PADDING-BOTTOM: 0.5em; MARGIN-TOP: 2px; PADDING-LEFT: 0.7em; PADDING-RIGHT: 0.5em; ZOOM: 1; DISPLAY: block; CURSOR: pointer; PADDING-TOP: 0.5em
    +}
    +.ui-accordion .ui-accordion-icons {
    +	PADDING-LEFT: 2.2em
    +}
    +.ui-accordion .ui-accordion-noicons {
    +	PADDING-LEFT: 0.7em
    +}
    +.ui-accordion .ui-accordion-icons .ui-accordion-icons {
    +	PADDING-LEFT: 2.2em
    +}
    +.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
    +	POSITION: absolute; MARGIN-TOP: -8px; TOP: 50%; LEFT: 0.5em
    +}
    +.ui-accordion .ui-accordion-content {
    +	PADDING-BOTTOM: 1em; PADDING-LEFT: 2.2em; PADDING-RIGHT: 2.2em; ZOOM: 1; OVERFLOW: auto; BORDER-TOP: 0px; PADDING-TOP: 1em
    +}
    +.ui-autocomplete {
    +	POSITION: absolute; TOP: 0px; CURSOR: default; LEFT: 0px
    +}
    +* HTML .ui-autocomplete {
    +	WIDTH: 1px
    +}
    +.ui-button {
    +	POSITION: relative; TEXT-ALIGN: center; PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; ZOOM: 1; DISPLAY: inline-block; OVERFLOW: visible; CURSOR: pointer; MARGIN-RIGHT: 0.1em; PADDING-TOP: 0px
    +}
    +.ui-button {
    +	TEXT-DECORATION: none
    +}
    +.ui-button:link {
    +	TEXT-DECORATION: none
    +}
    +.ui-button:visited {
    +	TEXT-DECORATION: none
    +}
    +.ui-button:hover {
    +	TEXT-DECORATION: none
    +}
    +.ui-button:active {
    +	TEXT-DECORATION: none
    +}
    +.ui-button-icon-only {
    +	WIDTH: 2.2em
    +}
    +BUTTON.ui-button-icon-only {
    +	WIDTH: 2.4em
    +}
    +.ui-button-icons-only {
    +	WIDTH: 3.4em
    +}
    +BUTTON.ui-button-icons-only {
    +	WIDTH: 3.7em
    +}
    +.ui-button .ui-button-text {
    +	LINE-HEIGHT: 1.4; DISPLAY: block
    +}
    +.ui-button-text-only .ui-button-text {
    +	PADDING-BOTTOM: 0.4em; PADDING-LEFT: 1em; PADDING-RIGHT: 1em; PADDING-TOP: 0.4em
    +}
    +.ui-button-icon-only .ui-button-text {
    +	PADDING-BOTTOM: 0.4em; TEXT-INDENT: -1342177.28px; PADDING-LEFT: 0.4em; PADDING-RIGHT: 0.4em; PADDING-TOP: 0.4em
    +}
    +.ui-button-icons-only .ui-button-text {
    +	PADDING-BOTTOM: 0.4em; TEXT-INDENT: -1342177.28px; PADDING-LEFT: 0.4em; PADDING-RIGHT: 0.4em; PADDING-TOP: 0.4em
    +}
    +.ui-button-text-icon-primary .ui-button-text {
    +	PADDING-BOTTOM: 0.4em; PADDING-LEFT: 2.1em; PADDING-RIGHT: 1em; PADDING-TOP: 0.4em
    +}
    +.ui-button-text-icons .ui-button-text {
    +	PADDING-BOTTOM: 0.4em; PADDING-LEFT: 2.1em; PADDING-RIGHT: 1em; PADDING-TOP: 0.4em
    +}
    +.ui-button-text-icon-secondary .ui-button-text {
    +	PADDING-BOTTOM: 0.4em; PADDING-LEFT: 1em; PADDING-RIGHT: 2.1em; PADDING-TOP: 0.4em
    +}
    +.ui-button-text-icons .ui-button-text {
    +	PADDING-BOTTOM: 0.4em; PADDING-LEFT: 1em; PADDING-RIGHT: 2.1em; PADDING-TOP: 0.4em
    +}
    +.ui-button-text-icons .ui-button-text {
    +	PADDING-LEFT: 2.1em; PADDING-RIGHT: 2.1em
    +}
    +INPUT.ui-button {
    +	PADDING-BOTTOM: 0.4em; PADDING-LEFT: 1em; PADDING-RIGHT: 1em; PADDING-TOP: 0.4em
    +}
    +.ui-button-icon-only .ui-icon {
    +	POSITION: absolute; MARGIN-TOP: -8px; TOP: 50%
    +}
    +.ui-button-text-icon-primary .ui-icon {
    +	POSITION: absolute; MARGIN-TOP: -8px; TOP: 50%
    +}
    +.ui-button-text-icon-secondary .ui-icon {
    +	POSITION: absolute; MARGIN-TOP: -8px; TOP: 50%
    +}
    +.ui-button-text-icons .ui-icon {
    +	POSITION: absolute; MARGIN-TOP: -8px; TOP: 50%
    +}
    +.ui-button-icons-only .ui-icon {
    +	POSITION: absolute; MARGIN-TOP: -8px; TOP: 50%
    +}
    +.ui-button-icon-only .ui-icon {
    +	MARGIN-LEFT: -8px; LEFT: 50%
    +}
    +.ui-button-text-icon-primary .ui-button-icon-primary {
    +	LEFT: 0.5em
    +}
    +.ui-button-text-icons .ui-button-icon-primary {
    +	LEFT: 0.5em
    +}
    +.ui-button-icons-only .ui-button-icon-primary {
    +	LEFT: 0.5em
    +}
    +.ui-button-text-icon-secondary .ui-button-icon-secondary {
    +	RIGHT: 0.5em
    +}
    +.ui-button-text-icons .ui-button-icon-secondary {
    +	RIGHT: 0.5em
    +}
    +.ui-button-icons-only .ui-button-icon-secondary {
    +	RIGHT: 0.5em
    +}
    +.ui-button-text-icons .ui-button-icon-secondary {
    +	RIGHT: 0.5em
    +}
    +.ui-button-icons-only .ui-button-icon-secondary {
    +	RIGHT: 0.5em
    +}
    +.ui-buttonset {
    +	MARGIN-RIGHT: 7px
    +}
    +.ui-buttonset .ui-button {
    +	MARGIN-LEFT: 0px; MARGIN-RIGHT: -0.3em
    +}
    +.ui-datepicker {
    +	PADDING-BOTTOM: 0px; PADDING-LEFT: 0.2em; WIDTH: 17em; PADDING-RIGHT: 0.2em; DISPLAY: none; PADDING-TOP: 0.2em
    +}
    +.ui-datepicker .ui-datepicker-header {
    +	POSITION: relative; PADDING-BOTTOM: 0.2em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0.2em
    +}
    +.ui-datepicker .ui-datepicker-prev {
    +	POSITION: absolute; WIDTH: 1.8em; HEIGHT: 1.8em; TOP: 2px
    +}
    +.ui-datepicker .ui-datepicker-next {
    +	POSITION: absolute; WIDTH: 1.8em; HEIGHT: 1.8em; TOP: 2px
    +}
    +.ui-datepicker .ui-datepicker-prev-hover {
    +	TOP: 1px
    +}
    +.ui-datepicker .ui-datepicker-next-hover {
    +	TOP: 1px
    +}
    +.ui-datepicker .ui-datepicker-prev {
    +	LEFT: 2px
    +}
    +.ui-datepicker .ui-datepicker-next {
    +	RIGHT: 2px
    +}
    +.ui-datepicker .ui-datepicker-prev-hover {
    +	LEFT: 1px
    +}
    +.ui-datepicker .ui-datepicker-next-hover {
    +	RIGHT: 1px
    +}
    +.ui-datepicker .ui-datepicker-prev SPAN {
    +	POSITION: absolute; MARGIN-TOP: -8px; DISPLAY: block; MARGIN-LEFT: -8px; TOP: 50%; LEFT: 50%
    +}
    +.ui-datepicker .ui-datepicker-next SPAN {
    +	POSITION: absolute; MARGIN-TOP: -8px; DISPLAY: block; MARGIN-LEFT: -8px; TOP: 50%; LEFT: 50%
    +}
    +.ui-datepicker .ui-datepicker-title {
    +	TEXT-ALIGN: center; LINE-HEIGHT: 1.8em; MARGIN: 0px 2.3em
    +}
    +.ui-datepicker .ui-datepicker-title SELECT {
    +	MARGIN: 1px 0px; FONT-SIZE: 1em
    +}
    +.ui-datepicker SELECT.ui-datepicker-month-year {
    +	WIDTH: 100%
    +}
    +.ui-datepicker SELECT.ui-datepicker-month {
    +	WIDTH: 49%
    +}
    +.ui-datepicker SELECT.ui-datepicker-year {
    +	WIDTH: 49%
    +}
    +.ui-datepicker TABLE {
    +	MARGIN: 0px 0px 0.4em; WIDTH: 100%; BORDER-COLLAPSE: collapse; FONT-SIZE: 0.9em
    +}
    +.ui-datepicker TH {
    +	BORDER-BOTTOM: 0px; TEXT-ALIGN: center; BORDER-LEFT: 0px; PADDING-BOTTOM: 0.7em; PADDING-LEFT: 0.3em; PADDING-RIGHT: 0.3em; BORDER-TOP: 0px; FONT-WEIGHT: bold; BORDER-RIGHT: 0px; PADDING-TOP: 0.7em
    +}
    +.ui-datepicker TD {
    +	BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-BOTTOM: 1px; PADDING-LEFT: 1px; PADDING-RIGHT: 1px; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 1px
    +}
    +.ui-datepicker TD SPAN {
    +	TEXT-ALIGN: right; PADDING-BOTTOM: 0.2em; PADDING-LEFT: 0.2em; PADDING-RIGHT: 0.2em; DISPLAY: block; TEXT-DECORATION: none; PADDING-TOP: 0.2em
    +}
    +.ui-datepicker TD A {
    +	TEXT-ALIGN: right; PADDING-BOTTOM: 0.2em; PADDING-LEFT: 0.2em; PADDING-RIGHT: 0.2em; DISPLAY: block; TEXT-DECORATION: none; PADDING-TOP: 0.2em
    +}
    +.ui-datepicker .ui-datepicker-buttonpane {
    +	BACKGROUND-IMAGE: none; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0.7em 0px 0px; PADDING-LEFT: 0.2em; PADDING-RIGHT: 0.2em; BORDER-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +.ui-datepicker .ui-datepicker-buttonpane BUTTON {
    +	PADDING-BOTTOM: 0.3em; MARGIN: 0.5em 0.2em 0.4em; PADDING-LEFT: 0.6em; WIDTH: auto; PADDING-RIGHT: 0.6em; FLOAT: right; OVERFLOW: visible; CURSOR: pointer; PADDING-TOP: 0.2em
    +}
    +.ui-datepicker .ui-datepicker-buttonpane BUTTON.ui-datepicker-current {
    +	FLOAT: left
    +}
    +.ui-datepicker-multi.ui-datepicker {
    +	WIDTH: auto
    +}
    +.ui-datepicker-multi .ui-datepicker-group {
    +	FLOAT: left
    +}
    +.ui-datepicker-multi .ui-datepicker-group TABLE {
    +	MARGIN: 0px auto 0.4em; WIDTH: 95%
    +}
    +.ui-datepicker-multi-2 .ui-datepicker-group {
    +	WIDTH: 50%
    +}
    +.ui-datepicker-multi-3 .ui-datepicker-group {
    +	WIDTH: 33.3%
    +}
    +.ui-datepicker-multi-4 .ui-datepicker-group {
    +	WIDTH: 25%
    +}
    +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header {
    +	BORDER-LEFT-WIDTH: 0px
    +}
    +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
    +	BORDER-LEFT-WIDTH: 0px
    +}
    +.ui-datepicker-multi .ui-datepicker-buttonpane {
    +	CLEAR: left
    +}
    +.ui-datepicker-row-break {
    +	WIDTH: 100%; CLEAR: both; FONT-SIZE: 0em
    +}
    +.ui-datepicker-rtl {
    +	DIRECTION: rtl
    +}
    +.ui-datepicker-rtl .ui-datepicker-prev {
    +	RIGHT: 2px; LEFT: auto
    +}
    +.ui-datepicker-rtl .ui-datepicker-next {
    +	RIGHT: auto; LEFT: 2px
    +}
    +.ui-datepicker-rtl .ui-datepicker-prev:hover {
    +	RIGHT: 1px; LEFT: auto
    +}
    +.ui-datepicker-rtl .ui-datepicker-next:hover {
    +	RIGHT: auto; LEFT: 1px
    +}
    +.ui-datepicker-rtl .ui-datepicker-buttonpane {
    +	CLEAR: right
    +}
    +.ui-datepicker-rtl .ui-datepicker-buttonpane BUTTON {
    +	FLOAT: left
    +}
    +.ui-datepicker-rtl .ui-datepicker-buttonpane BUTTON.ui-datepicker-current {
    +	FLOAT: right
    +}
    +.ui-datepicker-rtl .ui-datepicker-group {
    +	FLOAT: right
    +}
    +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header {
    +	BORDER-RIGHT-WIDTH: 0px; BORDER-LEFT-WIDTH: 1px
    +}
    +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
    +	BORDER-RIGHT-WIDTH: 0px; BORDER-LEFT-WIDTH: 1px
    +}
    +.ui-datepicker-cover {
    +	Z-INDEX: -1; POSITION: absolute; FILTER: mask(); WIDTH: 200px; HEIGHT: 200px; TOP: -4px; LEFT: -4px
    +}
    +.ui-dialog {
    +	POSITION: absolute; PADDING-BOTTOM: 0.2em; PADDING-LEFT: 0.2em; WIDTH: 300px; PADDING-RIGHT: 0.2em; OVERFLOW: hidden; TOP: 0px; PADDING-TOP: 0.2em; LEFT: 0px
    +}
    +.ui-dialog .ui-dialog-titlebar {
    +	POSITION: relative; PADDING-BOTTOM: 0.4em; PADDING-LEFT: 1em; PADDING-RIGHT: 1em; PADDING-TOP: 0.4em
    +}
    +.ui-dialog .ui-dialog-title {
    +	MARGIN: 0.1em 16px 0.1em 0px; FLOAT: left
    +}
    +.ui-dialog .ui-dialog-titlebar-close {
    +	POSITION: absolute; PADDING-BOTTOM: 1px; MARGIN: -10px 0px 0px; PADDING-LEFT: 1px; WIDTH: 19px; PADDING-RIGHT: 1px; HEIGHT: 18px; TOP: 50%; RIGHT: 0.3em; PADDING-TOP: 1px
    +}
    +.ui-dialog .ui-dialog-titlebar-close SPAN {
    +	MARGIN: 1px; DISPLAY: block
    +}
    +.ui-dialog .ui-dialog-titlebar-close:hover {
    +	PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +.ui-dialog .ui-dialog-titlebar-close:focus {
    +	PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +.ui-dialog .ui-dialog-content {
    +	BORDER-BOTTOM: 0px; POSITION: relative; BORDER-LEFT: 0px; PADDING-BOTTOM: 0.5em; PADDING-LEFT: 1em; PADDING-RIGHT: 1em; ZOOM: 1; BACKGROUND: none transparent scroll repeat 0% 0%; OVERFLOW: auto; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 0.5em
    +}
    +.ui-dialog .ui-dialog-buttonpane {
    +	BACKGROUND-IMAGE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0.5em; BORDER-RIGHT-WIDTH: 0px; MARGIN: 0.5em 0px 0px; PADDING-LEFT: 0.4em; PADDING-RIGHT: 1em; BORDER-TOP-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0.3em
    +}
    +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
    +	FLOAT: right
    +}
    +.ui-dialog .ui-dialog-buttonpane BUTTON {
    +	MARGIN: 0.5em 0.4em 0.5em 0px; CURSOR: pointer
    +}
    +.ui-dialog .ui-resizable-se {
    +	WIDTH: 14px; BOTTOM: 3px; HEIGHT: 14px; RIGHT: 3px
    +}
    +.ui-draggable .ui-dialog-titlebar {
    +	CURSOR: move
    +}
    +.ui-menu {
    +	PADDING-BOTTOM: 2px; LIST-STYLE-TYPE: none; MARGIN: 0px; OUTLINE-STYLE: none; OUTLINE-COLOR: invert; PADDING-LEFT: 2px; OUTLINE-WIDTH: medium; PADDING-RIGHT: 2px; DISPLAY: block; LIST-STYLE-IMAGE: none; PADDING-TOP: 2px
    +}
    +.ui-menu .ui-menu {
    +	POSITION: absolute; MARGIN-TOP: -3px
    +}
    +.ui-menu .ui-menu-item {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; ZOOM: 1; PADDING-TOP: 0px
    +}
    +.ui-menu .ui-menu-divider {
    +	LINE-HEIGHT: 0; BORDER-RIGHT-WIDTH: 0px; MARGIN: 5px -2px; BORDER-TOP-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 0px; HEIGHT: 0px; FONT-SIZE: 0px; BORDER-LEFT-WIDTH: 0px
    +}
    +.ui-menu .ui-menu-item A {
    +	PADDING-BOTTOM: 2px; LINE-HEIGHT: 1.5; PADDING-LEFT: 0.4em; PADDING-RIGHT: 0.4em; ZOOM: 1; DISPLAY: block; FONT-WEIGHT: normal; TEXT-DECORATION: none; PADDING-TOP: 2px
    +}
    +.ui-menu .ui-menu-item A.ui-state-focus {
    +	MARGIN: -1px; FONT-WEIGHT: normal
    +}
    +.ui-menu .ui-menu-item A.ui-state-active {
    +	MARGIN: -1px; FONT-WEIGHT: normal
    +}
    +.ui-menu .ui-state-disabled {
    +	LINE-HEIGHT: 1.5; MARGIN: 0.4em 0px 0.2em; FONT-WEIGHT: normal
    +}
    +.ui-menu .ui-state-disabled A {
    +	CURSOR: default
    +}
    +.ui-menu-icons {
    +	POSITION: relative
    +}
    +.ui-menu-icons .ui-menu-item A {
    +	POSITION: relative; PADDING-LEFT: 2em
    +}
    +.ui-menu .ui-icon {
    +	POSITION: absolute; TOP: 0.2em; LEFT: 0.2em
    +}
    +.ui-menu .ui-menu-icon {
    +	POSITION: static; FLOAT: right
    +}
    +.ui-progressbar {
    +	TEXT-ALIGN: left; HEIGHT: 2em; OVERFLOW: hidden
    +}
    +.ui-progressbar .ui-progressbar-value {
    +	MARGIN: -1px; HEIGHT: 100%
    +}
    +.ui-resizable {
    +	POSITION: relative
    +}
    +.ui-resizable-handle {
    +	POSITION: absolute; DISPLAY: block; FONT-SIZE: 0.1px
    +}
    +.ui-resizable-disabled .ui-resizable-handle {
    +	DISPLAY: none
    +}
    +.ui-resizable-autohide .ui-resizable-handle {
    +	DISPLAY: none
    +}
    +.ui-resizable-n {
    +	WIDTH: 100%; HEIGHT: 7px; TOP: -5px; CURSOR: n-resize; LEFT: 0px
    +}
    +.ui-resizable-s {
    +	WIDTH: 100%; BOTTOM: -5px; HEIGHT: 7px; CURSOR: s-resize; LEFT: 0px
    +}
    +.ui-resizable-e {
    +	WIDTH: 7px; HEIGHT: 100%; TOP: 0px; CURSOR: e-resize; RIGHT: -5px
    +}
    +.ui-resizable-w {
    +	WIDTH: 7px; HEIGHT: 100%; TOP: 0px; CURSOR: w-resize; LEFT: -5px
    +}
    +.ui-resizable-se {
    +	WIDTH: 12px; BOTTOM: 1px; HEIGHT: 12px; CURSOR: se-resize; RIGHT: 1px
    +}
    +.ui-resizable-sw {
    +	WIDTH: 9px; BOTTOM: -5px; HEIGHT: 9px; CURSOR: sw-resize; LEFT: -5px
    +}
    +.ui-resizable-nw {
    +	WIDTH: 9px; HEIGHT: 9px; TOP: -5px; CURSOR: nw-resize; LEFT: -5px
    +}
    +.ui-resizable-ne {
    +	WIDTH: 9px; HEIGHT: 9px; TOP: -5px; CURSOR: ne-resize; RIGHT: -5px
    +}
    +.ui-selectable-helper {
    +	Z-INDEX: 100; BORDER-BOTTOM: black 1px dotted; POSITION: absolute; BORDER-LEFT: black 1px dotted; BORDER-TOP: black 1px dotted; BORDER-RIGHT: black 1px dotted
    +}
    +.ui-slider {
    +	POSITION: relative; TEXT-ALIGN: left
    +}
    +.ui-slider .ui-slider-handle {
    +	Z-INDEX: 2; POSITION: absolute; WIDTH: 1.2em; HEIGHT: 1.2em; CURSOR: default
    +}
    +.ui-slider .ui-slider-range {
    +	Z-INDEX: 1; BORDER-BOTTOM: 0px; POSITION: absolute; BORDER-LEFT: 0px; DISPLAY: block; BACKGROUND-POSITION: 0px 0px; FONT-SIZE: 0.7em; BORDER-TOP: 0px; BORDER-RIGHT: 0px
    +}
    +.ui-slider-horizontal {
    +	HEIGHT: 0.8em
    +}
    +.ui-slider-horizontal .ui-slider-handle {
    +	MARGIN-LEFT: -0.6em; TOP: -0.3em
    +}
    +.ui-slider-horizontal .ui-slider-range {
    +	HEIGHT: 100%; TOP: 0px
    +}
    +.ui-slider-horizontal .ui-slider-range-min {
    +	LEFT: 0px
    +}
    +.ui-slider-horizontal .ui-slider-range-max {
    +	RIGHT: 0px
    +}
    +.ui-slider-vertical {
    +	WIDTH: 0.8em; HEIGHT: 100px
    +}
    +.ui-slider-vertical .ui-slider-handle {
    +	MARGIN-BOTTOM: -0.6em; MARGIN-LEFT: 0px; LEFT: -0.3em
    +}
    +.ui-slider-vertical .ui-slider-range {
    +	WIDTH: 100%; LEFT: 0px
    +}
    +.ui-slider-vertical .ui-slider-range-min {
    +	BOTTOM: 0px
    +}
    +.ui-slider-vertical .ui-slider-range-max {
    +	TOP: 0px
    +}
    +.ui-spinner {
    +	POSITION: relative; PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline-block; VERTICAL-ALIGN: middle; OVERFLOW: hidden; PADDING-TOP: 0px
    +}
    +.ui-spinner-input {
    +	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0px; MARGIN: 0.2em 22px 0.2em 0.4em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BACKGROUND: none transparent scroll repeat 0% 0%; VERTICAL-ALIGN: middle; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0px
    +}
    +.ui-spinner-button {
    +	POSITION: absolute; TEXT-ALIGN: center; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 16px; PADDING-RIGHT: 0px; DISPLAY: block; HEIGHT: 50%; FONT-SIZE: 0.5em; OVERFLOW: hidden; CURSOR: default; RIGHT: 0px; PADDING-TOP: 0px
    +}
    +.ui-spinner A.ui-spinner-button {
    +	BORDER-BOTTOM: medium none; BORDER-TOP: medium none; BORDER-RIGHT: medium none
    +}
    +.ui-spinner .ui-icon {
    +	POSITION: absolute; MARGIN-TOP: -8px; TOP: 50%; LEFT: 0px
    +}
    +.ui-spinner-up {
    +	TOP: 0px
    +}
    +.ui-spinner-down {
    +	BOTTOM: 0px
    +}
    +.ui-spinner .ui-icon-triangle-1-s {
    +	BACKGROUND-POSITION: -65px -16px
    +}
    +.ui-tabs {
    +	POSITION: relative; PADDING-BOTTOM: 0.2em; PADDING-LEFT: 0.2em; PADDING-RIGHT: 0.2em; ZOOM: 1; PADDING-TOP: 0.2em
    +}
    +.ui-tabs .ui-tabs-nav {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0.2em; PADDING-RIGHT: 0.2em; PADDING-TOP: 0.2em
    +}
    +.ui-tabs .ui-tabs-nav LI {
    +	BORDER-BOTTOM: 0px; POSITION: relative; PADDING-BOTTOM: 0px; LIST-STYLE-TYPE: none; MARGIN: 1px 0.2em 0px 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WHITE-SPACE: nowrap; FLOAT: left; TOP: 0px; LIST-STYLE-IMAGE: none; PADDING-TOP: 0px
    +}
    +.ui-tabs .ui-tabs-nav LI A {
    +	PADDING-BOTTOM: 0.5em; PADDING-LEFT: 1em; PADDING-RIGHT: 1em; FLOAT: left; TEXT-DECORATION: none; PADDING-TOP: 0.5em
    +}
    +.ui-tabs .ui-tabs-nav LI.ui-tabs-active {
    +	PADDING-BOTTOM: 1px; MARGIN-BOTTOM: -1px
    +}
    +.ui-tabs .ui-tabs-nav LI.ui-tabs-active A {
    +	CURSOR: text
    +}
    +.ui-tabs .ui-tabs-nav LI.ui-state-disabled A {
    +	CURSOR: text
    +}
    +.ui-tabs .ui-tabs-nav LI.ui-tabs-loading A {
    +	CURSOR: text
    +}
    +.ui-tabs .ui-tabs-nav LI A {
    +	CURSOR: pointer
    +}
    +.ui-tabs-collapsible .ui-tabs-nav LI.ui-tabs-active A {
    +	CURSOR: pointer
    +}
    +.ui-tabs .ui-tabs-panel {
    +	PADDING-BOTTOM: 1em; BORDER-RIGHT-WIDTH: 0px; PADDING-LEFT: 1.4em; PADDING-RIGHT: 1.4em; DISPLAY: block; BACKGROUND: none transparent scroll repeat 0% 0%; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 1em
    +}
    +.ui-tooltip {
    +	Z-INDEX: 9999; POSITION: absolute; PADDING-BOTTOM: 8px; PADDING-LEFT: 8px; PADDING-RIGHT: 8px; MAX-WIDTH: 300px; PADDING-TOP: 8px; -webkit-box-shadow: 0 0 5px #aaa; box-shadow: 0 0 5px #aaa
    +}
    +* HTML .ui-tooltip {
    +	BACKGROUND-IMAGE: none
    +}
    +BODY .ui-tooltip {
    +	BORDER-RIGHT-WIDTH: 2px; BORDER-TOP-WIDTH: 2px; BORDER-BOTTOM-WIDTH: 2px; BORDER-LEFT-WIDTH: 2px
    +}
    +.ui-widget {
    +	FONT-FAMILY: Verdana, Arial, sans-serif; FONT-SIZE: 1.1em
    +}
    +.ui-widget .ui-widget {
    +	FONT-SIZE: 1em
    +}
    +.ui-widget INPUT {
    +	FONT-FAMILY: Verdana, Arial, sans-serif; FONT-SIZE: 1em
    +}
    +.ui-widget SELECT {
    +	FONT-FAMILY: Verdana, Arial, sans-serif; FONT-SIZE: 1em
    +}
    +.ui-widget TEXTAREA {
    +	FONT-FAMILY: Verdana, Arial, sans-serif; FONT-SIZE: 1em
    +}
    +.ui-widget BUTTON {
    +	FONT-FAMILY: Verdana, Arial, sans-serif; FONT-SIZE: 1em
    +}
    +.ui-widget-content {
    +	BORDER-BOTTOM: #aaaaaa 1px solid; BORDER-LEFT: #aaaaaa 1px solid; BACKGROUND: url(images/ui-bg_flat_75_ffffff_40x100.png) #ffffff repeat-x 50% 50%; COLOR: #222222; BORDER-TOP: #aaaaaa 1px solid; BORDER-RIGHT: #aaaaaa 1px solid
    +}
    +.ui-widget-content A {
    +	COLOR: #222222
    +}
    +.ui-widget-header {
    +	BORDER-BOTTOM: #aaaaaa 1px solid; BORDER-LEFT: #aaaaaa 1px solid; BACKGROUND: url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) #cccccc repeat-x 50% 50%; COLOR: #222222; BORDER-TOP: #aaaaaa 1px solid; FONT-WEIGHT: bold; BORDER-RIGHT: #aaaaaa 1px solid
    +}
    +.ui-widget-header A {
    +	COLOR: #222222
    +}
    +.ui-state-default {
    +	BORDER-BOTTOM: #d3d3d3 1px solid; BORDER-LEFT: #d3d3d3 1px solid; BACKGROUND: url(images/ui-bg_glass_75_e6e6e6_1x400.png) #e6e6e6 repeat-x 50% 50%; COLOR: #555555; BORDER-TOP: #d3d3d3 1px solid; FONT-WEIGHT: normal; BORDER-RIGHT: #d3d3d3 1px solid
    +}
    +.ui-widget-content .ui-state-default {
    +	BORDER-BOTTOM: #d3d3d3 1px solid; BORDER-LEFT: #d3d3d3 1px solid; BACKGROUND: url(images/ui-bg_glass_75_e6e6e6_1x400.png) #e6e6e6 repeat-x 50% 50%; COLOR: #555555; BORDER-TOP: #d3d3d3 1px solid; FONT-WEIGHT: normal; BORDER-RIGHT: #d3d3d3 1px solid
    +}
    +.ui-widget-header .ui-state-default {
    +	BORDER-BOTTOM: #d3d3d3 1px solid; BORDER-LEFT: #d3d3d3 1px solid; BACKGROUND: url(images/ui-bg_glass_75_e6e6e6_1x400.png) #e6e6e6 repeat-x 50% 50%; COLOR: #555555; BORDER-TOP: #d3d3d3 1px solid; FONT-WEIGHT: normal; BORDER-RIGHT: #d3d3d3 1px solid
    +}
    +.ui-state-default A {
    +	COLOR: #555555; TEXT-DECORATION: none
    +}
    +.ui-state-default A:link {
    +	COLOR: #555555; TEXT-DECORATION: none
    +}
    +.ui-state-default A:visited {
    +	COLOR: #555555; TEXT-DECORATION: none
    +}
    +.ui-state-hover {
    +	BORDER-BOTTOM: #999999 1px solid; BORDER-LEFT: #999999 1px solid; BACKGROUND: url(images/ui-bg_glass_75_dadada_1x400.png) #dadada repeat-x 50% 50%; COLOR: #212121; BORDER-TOP: #999999 1px solid; FONT-WEIGHT: normal; BORDER-RIGHT: #999999 1px solid
    +}
    +.ui-widget-content .ui-state-hover {
    +	BORDER-BOTTOM: #999999 1px solid; BORDER-LEFT: #999999 1px solid; BACKGROUND: url(images/ui-bg_glass_75_dadada_1x400.png) #dadada repeat-x 50% 50%; COLOR: #212121; BORDER-TOP: #999999 1px solid; FONT-WEIGHT: normal; BORDER-RIGHT: #999999 1px solid
    +}
    +.ui-widget-header .ui-state-hover {
    +	BORDER-BOTTOM: #999999 1px solid; BORDER-LEFT: #999999 1px solid; BACKGROUND: url(images/ui-bg_glass_75_dadada_1x400.png) #dadada repeat-x 50% 50%; COLOR: #212121; BORDER-TOP: #999999 1px solid; FONT-WEIGHT: normal; BORDER-RIGHT: #999999 1px solid
    +}
    +.ui-state-focus {
    +	BORDER-BOTTOM: #999999 1px solid; BORDER-LEFT: #999999 1px solid; BACKGROUND: url(images/ui-bg_glass_75_dadada_1x400.png) #dadada repeat-x 50% 50%; COLOR: #212121; BORDER-TOP: #999999 1px solid; FONT-WEIGHT: normal; BORDER-RIGHT: #999999 1px solid
    +}
    +.ui-widget-content .ui-state-focus {
    +	BORDER-BOTTOM: #999999 1px solid; BORDER-LEFT: #999999 1px solid; BACKGROUND: url(images/ui-bg_glass_75_dadada_1x400.png) #dadada repeat-x 50% 50%; COLOR: #212121; BORDER-TOP: #999999 1px solid; FONT-WEIGHT: normal; BORDER-RIGHT: #999999 1px solid
    +}
    +.ui-widget-header .ui-state-focus {
    +	BORDER-BOTTOM: #999999 1px solid; BORDER-LEFT: #999999 1px solid; BACKGROUND: url(images/ui-bg_glass_75_dadada_1x400.png) #dadada repeat-x 50% 50%; COLOR: #212121; BORDER-TOP: #999999 1px solid; FONT-WEIGHT: normal; BORDER-RIGHT: #999999 1px solid
    +}
    +.ui-state-hover A {
    +	COLOR: #212121; TEXT-DECORATION: none
    +}
    +.ui-state-hover A:hover {
    +	COLOR: #212121; TEXT-DECORATION: none
    +}
    +.ui-state-hover A:link {
    +	COLOR: #212121; TEXT-DECORATION: none
    +}
    +.ui-state-hover A:visited {
    +	COLOR: #212121; TEXT-DECORATION: none
    +}
    +.ui-state-active {
    +	BORDER-BOTTOM: #aaaaaa 1px solid; BORDER-LEFT: #aaaaaa 1px solid; BACKGROUND: url(images/ui-bg_glass_65_ffffff_1x400.png) #ffffff repeat-x 50% 50%; COLOR: #212121; BORDER-TOP: #aaaaaa 1px solid; FONT-WEIGHT: normal; BORDER-RIGHT: #aaaaaa 1px solid
    +}
    +.ui-widget-content .ui-state-active {
    +	BORDER-BOTTOM: #aaaaaa 1px solid; BORDER-LEFT: #aaaaaa 1px solid; BACKGROUND: url(images/ui-bg_glass_65_ffffff_1x400.png) #ffffff repeat-x 50% 50%; COLOR: #212121; BORDER-TOP: #aaaaaa 1px solid; FONT-WEIGHT: normal; BORDER-RIGHT: #aaaaaa 1px solid
    +}
    +.ui-widget-header .ui-state-active {
    +	BORDER-BOTTOM: #aaaaaa 1px solid; BORDER-LEFT: #aaaaaa 1px solid; BACKGROUND: url(images/ui-bg_glass_65_ffffff_1x400.png) #ffffff repeat-x 50% 50%; COLOR: #212121; BORDER-TOP: #aaaaaa 1px solid; FONT-WEIGHT: normal; BORDER-RIGHT: #aaaaaa 1px solid
    +}
    +.ui-state-active A {
    +	COLOR: #212121; TEXT-DECORATION: none
    +}
    +.ui-state-active A:link {
    +	COLOR: #212121; TEXT-DECORATION: none
    +}
    +.ui-state-active A:visited {
    +	COLOR: #212121; TEXT-DECORATION: none
    +}
    +.ui-state-highlight {
    +	BORDER-BOTTOM: #fcefa1 1px solid; BORDER-LEFT: #fcefa1 1px solid; BACKGROUND: url(images/ui-bg_glass_55_fbf9ee_1x400.png) #fbf9ee repeat-x 50% 50%; COLOR: #363636; BORDER-TOP: #fcefa1 1px solid; BORDER-RIGHT: #fcefa1 1px solid
    +}
    +.ui-widget-content .ui-state-highlight {
    +	BORDER-BOTTOM: #fcefa1 1px solid; BORDER-LEFT: #fcefa1 1px solid; BACKGROUND: url(images/ui-bg_glass_55_fbf9ee_1x400.png) #fbf9ee repeat-x 50% 50%; COLOR: #363636; BORDER-TOP: #fcefa1 1px solid; BORDER-RIGHT: #fcefa1 1px solid
    +}
    +.ui-widget-header .ui-state-highlight {
    +	BORDER-BOTTOM: #fcefa1 1px solid; BORDER-LEFT: #fcefa1 1px solid; BACKGROUND: url(images/ui-bg_glass_55_fbf9ee_1x400.png) #fbf9ee repeat-x 50% 50%; COLOR: #363636; BORDER-TOP: #fcefa1 1px solid; BORDER-RIGHT: #fcefa1 1px solid
    +}
    +.ui-state-highlight A {
    +	COLOR: #363636
    +}
    +.ui-widget-content .ui-state-highlight A {
    +	COLOR: #363636
    +}
    +.ui-widget-header .ui-state-highlight A {
    +	COLOR: #363636
    +}
    +.ui-state-error {
    +	BORDER-BOTTOM: #cd0a0a 1px solid; BORDER-LEFT: #cd0a0a 1px solid; BACKGROUND: url(images/ui-bg_glass_95_fef1ec_1x400.png) #fef1ec repeat-x 50% 50%; COLOR: #cd0a0a; BORDER-TOP: #cd0a0a 1px solid; BORDER-RIGHT: #cd0a0a 1px solid
    +}
    +.ui-widget-content .ui-state-error {
    +	BORDER-BOTTOM: #cd0a0a 1px solid; BORDER-LEFT: #cd0a0a 1px solid; BACKGROUND: url(images/ui-bg_glass_95_fef1ec_1x400.png) #fef1ec repeat-x 50% 50%; COLOR: #cd0a0a; BORDER-TOP: #cd0a0a 1px solid; BORDER-RIGHT: #cd0a0a 1px solid
    +}
    +.ui-widget-header .ui-state-error {
    +	BORDER-BOTTOM: #cd0a0a 1px solid; BORDER-LEFT: #cd0a0a 1px solid; BACKGROUND: url(images/ui-bg_glass_95_fef1ec_1x400.png) #fef1ec repeat-x 50% 50%; COLOR: #cd0a0a; BORDER-TOP: #cd0a0a 1px solid; BORDER-RIGHT: #cd0a0a 1px solid
    +}
    +.ui-state-error A {
    +	COLOR: #cd0a0a
    +}
    +.ui-widget-content .ui-state-error A {
    +	COLOR: #cd0a0a
    +}
    +.ui-widget-header .ui-state-error A {
    +	COLOR: #cd0a0a
    +}
    +.ui-state-error-text {
    +	COLOR: #cd0a0a
    +}
    +.ui-widget-content .ui-state-error-text {
    +	COLOR: #cd0a0a
    +}
    +.ui-widget-header .ui-state-error-text {
    +	COLOR: #cd0a0a
    +}
    +.ui-priority-primary {
    +	FONT-WEIGHT: bold
    +}
    +.ui-widget-content .ui-priority-primary {
    +	FONT-WEIGHT: bold
    +}
    +.ui-widget-header .ui-priority-primary {
    +	FONT-WEIGHT: bold
    +}
    +.ui-priority-secondary {
    +	FILTER: Alpha(Opacity=70); FONT-WEIGHT: normal; opacity: .7
    +}
    +.ui-widget-content .ui-priority-secondary {
    +	FILTER: Alpha(Opacity=70); FONT-WEIGHT: normal; opacity: .7
    +}
    +.ui-widget-header .ui-priority-secondary {
    +	FILTER: Alpha(Opacity=70); FONT-WEIGHT: normal; opacity: .7
    +}
    +.ui-state-disabled {
    +	BACKGROUND-IMAGE: none; FILTER: Alpha(Opacity=35); opacity: .35
    +}
    +.ui-widget-content .ui-state-disabled {
    +	BACKGROUND-IMAGE: none; FILTER: Alpha(Opacity=35); opacity: .35
    +}
    +.ui-widget-header .ui-state-disabled {
    +	BACKGROUND-IMAGE: none; FILTER: Alpha(Opacity=35); opacity: .35
    +}
    +.ui-state-disabled .ui-icon {
    +	FILTER: Alpha(Opacity=35)
    +}
    +.ui-icon {
    +	BACKGROUND-IMAGE: url(../images/ui-icons_222222_256x240.png); WIDTH: 16px; HEIGHT: 16px
    +}
    +.ui-widget-content .ui-icon {
    +	BACKGROUND-IMAGE: url(../images/ui-icons_222222_256x240.png)
    +}
    +.ui-widget-header .ui-icon {
    +	BACKGROUND-IMAGE: url(../images/ui-icons_222222_256x240.png)
    +}
    +.ui-state-default .ui-icon {
    +	BACKGROUND-IMAGE: url(../images/ui-icons_888888_256x240.png)
    +}
    +.ui-state-hover .ui-icon {
    +	BACKGROUND-IMAGE: url(../images/ui-icons_454545_256x240.png)
    +}
    +.ui-state-focus .ui-icon {
    +	BACKGROUND-IMAGE: url(../images/ui-icons_454545_256x240.png)
    +}
    +.ui-state-active .ui-icon {
    +	BACKGROUND-IMAGE: url(../images/ui-icons_454545_256x240.png)
    +}
    +.ui-state-highlight .ui-icon {
    +	BACKGROUND-IMAGE: url(../images/ui-icons_2e83ff_256x240.png)
    +}
    +.ui-state-error .ui-icon {
    +	BACKGROUND-IMAGE: url(../images/ui-icons_cd0a0a_256x240.png)
    +}
    +.ui-state-error-text .ui-icon {
    +	BACKGROUND-IMAGE: url(../images/ui-icons_cd0a0a_256x240.png)
    +}
    +.ui-icon-carat-1-n {
    +	BACKGROUND-POSITION: 0px 0px
    +}
    +.ui-icon-carat-1-ne {
    +	BACKGROUND-POSITION: -16px 0px
    +}
    +.ui-icon-carat-1-e {
    +	BACKGROUND-POSITION: -32px 0px
    +}
    +.ui-icon-carat-1-se {
    +	BACKGROUND-POSITION: -48px 0px
    +}
    +.ui-icon-carat-1-s {
    +	BACKGROUND-POSITION: -64px 0px
    +}
    +.ui-icon-carat-1-sw {
    +	BACKGROUND-POSITION: -80px 0px
    +}
    +.ui-icon-carat-1-w {
    +	BACKGROUND-POSITION: -96px 0px
    +}
    +.ui-icon-carat-1-nw {
    +	BACKGROUND-POSITION: -112px 0px
    +}
    +.ui-icon-carat-2-n-s {
    +	BACKGROUND-POSITION: -128px 0px
    +}
    +.ui-icon-carat-2-e-w {
    +	BACKGROUND-POSITION: -144px 0px
    +}
    +.ui-icon-triangle-1-n {
    +	BACKGROUND-POSITION: 0px -16px
    +}
    +.ui-icon-triangle-1-ne {
    +	BACKGROUND-POSITION: -16px -16px
    +}
    +.ui-icon-triangle-1-e {
    +	BACKGROUND-POSITION: -32px -16px
    +}
    +.ui-icon-triangle-1-se {
    +	BACKGROUND-POSITION: -48px -16px
    +}
    +.ui-icon-triangle-1-s {
    +	BACKGROUND-POSITION: -64px -16px
    +}
    +.ui-icon-triangle-1-sw {
    +	BACKGROUND-POSITION: -80px -16px
    +}
    +.ui-icon-triangle-1-w {
    +	BACKGROUND-POSITION: -96px -16px
    +}
    +.ui-icon-triangle-1-nw {
    +	BACKGROUND-POSITION: -112px -16px
    +}
    +.ui-icon-triangle-2-n-s {
    +	BACKGROUND-POSITION: -128px -16px
    +}
    +.ui-icon-triangle-2-e-w {
    +	BACKGROUND-POSITION: -144px -16px
    +}
    +.ui-icon-arrow-1-n {
    +	BACKGROUND-POSITION: 0px -32px
    +}
    +.ui-icon-arrow-1-ne {
    +	BACKGROUND-POSITION: -16px -32px
    +}
    +.ui-icon-arrow-1-e {
    +	BACKGROUND-POSITION: -32px -32px
    +}
    +.ui-icon-arrow-1-se {
    +	BACKGROUND-POSITION: -48px -32px
    +}
    +.ui-icon-arrow-1-s {
    +	BACKGROUND-POSITION: -64px -32px
    +}
    +.ui-icon-arrow-1-sw {
    +	BACKGROUND-POSITION: -80px -32px
    +}
    +.ui-icon-arrow-1-w {
    +	BACKGROUND-POSITION: -96px -32px
    +}
    +.ui-icon-arrow-1-nw {
    +	BACKGROUND-POSITION: -112px -32px
    +}
    +.ui-icon-arrow-2-n-s {
    +	BACKGROUND-POSITION: -128px -32px
    +}
    +.ui-icon-arrow-2-ne-sw {
    +	BACKGROUND-POSITION: -144px -32px
    +}
    +.ui-icon-arrow-2-e-w {
    +	BACKGROUND-POSITION: -160px -32px
    +}
    +.ui-icon-arrow-2-se-nw {
    +	BACKGROUND-POSITION: -176px -32px
    +}
    +.ui-icon-arrowstop-1-n {
    +	BACKGROUND-POSITION: -192px -32px
    +}
    +.ui-icon-arrowstop-1-e {
    +	BACKGROUND-POSITION: -208px -32px
    +}
    +.ui-icon-arrowstop-1-s {
    +	BACKGROUND-POSITION: -224px -32px
    +}
    +.ui-icon-arrowstop-1-w {
    +	BACKGROUND-POSITION: -240px -32px
    +}
    +.ui-icon-arrowthick-1-n {
    +	BACKGROUND-POSITION: 0px -48px
    +}
    +.ui-icon-arrowthick-1-ne {
    +	BACKGROUND-POSITION: -16px -48px
    +}
    +.ui-icon-arrowthick-1-e {
    +	BACKGROUND-POSITION: -32px -48px
    +}
    +.ui-icon-arrowthick-1-se {
    +	BACKGROUND-POSITION: -48px -48px
    +}
    +.ui-icon-arrowthick-1-s {
    +	BACKGROUND-POSITION: -64px -48px
    +}
    +.ui-icon-arrowthick-1-sw {
    +	BACKGROUND-POSITION: -80px -48px
    +}
    +.ui-icon-arrowthick-1-w {
    +	BACKGROUND-POSITION: -96px -48px
    +}
    +.ui-icon-arrowthick-1-nw {
    +	BACKGROUND-POSITION: -112px -48px
    +}
    +.ui-icon-arrowthick-2-n-s {
    +	BACKGROUND-POSITION: -128px -48px
    +}
    +.ui-icon-arrowthick-2-ne-sw {
    +	BACKGROUND-POSITION: -144px -48px
    +}
    +.ui-icon-arrowthick-2-e-w {
    +	BACKGROUND-POSITION: -160px -48px
    +}
    +.ui-icon-arrowthick-2-se-nw {
    +	BACKGROUND-POSITION: -176px -48px
    +}
    +.ui-icon-arrowthickstop-1-n {
    +	BACKGROUND-POSITION: -192px -48px
    +}
    +.ui-icon-arrowthickstop-1-e {
    +	BACKGROUND-POSITION: -208px -48px
    +}
    +.ui-icon-arrowthickstop-1-s {
    +	BACKGROUND-POSITION: -224px -48px
    +}
    +.ui-icon-arrowthickstop-1-w {
    +	BACKGROUND-POSITION: -240px -48px
    +}
    +.ui-icon-arrowreturnthick-1-w {
    +	BACKGROUND-POSITION: 0px -64px
    +}
    +.ui-icon-arrowreturnthick-1-n {
    +	BACKGROUND-POSITION: -16px -64px
    +}
    +.ui-icon-arrowreturnthick-1-e {
    +	BACKGROUND-POSITION: -32px -64px
    +}
    +.ui-icon-arrowreturnthick-1-s {
    +	BACKGROUND-POSITION: -48px -64px
    +}
    +.ui-icon-arrowreturn-1-w {
    +	BACKGROUND-POSITION: -64px -64px
    +}
    +.ui-icon-arrowreturn-1-n {
    +	BACKGROUND-POSITION: -80px -64px
    +}
    +.ui-icon-arrowreturn-1-e {
    +	BACKGROUND-POSITION: -96px -64px
    +}
    +.ui-icon-arrowreturn-1-s {
    +	BACKGROUND-POSITION: -112px -64px
    +}
    +.ui-icon-arrowrefresh-1-w {
    +	BACKGROUND-POSITION: -128px -64px
    +}
    +.ui-icon-arrowrefresh-1-n {
    +	BACKGROUND-POSITION: -144px -64px
    +}
    +.ui-icon-arrowrefresh-1-e {
    +	BACKGROUND-POSITION: -160px -64px
    +}
    +.ui-icon-arrowrefresh-1-s {
    +	BACKGROUND-POSITION: -176px -64px
    +}
    +.ui-icon-arrow-4 {
    +	BACKGROUND-POSITION: 0px -80px
    +}
    +.ui-icon-arrow-4-diag {
    +	BACKGROUND-POSITION: -16px -80px
    +}
    +.ui-icon-extlink {
    +	BACKGROUND-POSITION: -32px -80px
    +}
    +.ui-icon-newwin {
    +	BACKGROUND-POSITION: -48px -80px
    +}
    +.ui-icon-refresh {
    +	BACKGROUND-POSITION: -64px -80px
    +}
    +.ui-icon-shuffle {
    +	BACKGROUND-POSITION: -80px -80px
    +}
    +.ui-icon-transfer-e-w {
    +	BACKGROUND-POSITION: -96px -80px
    +}
    +.ui-icon-transferthick-e-w {
    +	BACKGROUND-POSITION: -112px -80px
    +}
    +.ui-icon-folder-collapsed {
    +	BACKGROUND-POSITION: 0px -96px
    +}
    +.ui-icon-folder-open {
    +	BACKGROUND-POSITION: -16px -96px
    +}
    +.ui-icon-document {
    +	BACKGROUND-POSITION: -32px -96px
    +}
    +.ui-icon-document-b {
    +	BACKGROUND-POSITION: -48px -96px
    +}
    +.ui-icon-note {
    +	BACKGROUND-POSITION: -64px -96px
    +}
    +.ui-icon-mail-closed {
    +	BACKGROUND-POSITION: -80px -96px
    +}
    +.ui-icon-mail-open {
    +	BACKGROUND-POSITION: -96px -96px
    +}
    +.ui-icon-suitcase {
    +	BACKGROUND-POSITION: -112px -96px
    +}
    +.ui-icon-comment {
    +	BACKGROUND-POSITION: -128px -96px
    +}
    +.ui-icon-person {
    +	BACKGROUND-POSITION: -144px -96px
    +}
    +.ui-icon-print {
    +	BACKGROUND-POSITION: -160px -96px
    +}
    +.ui-icon-trash {
    +	BACKGROUND-POSITION: -176px -96px
    +}
    +.ui-icon-locked {
    +	BACKGROUND-POSITION: -192px -96px
    +}
    +.ui-icon-unlocked {
    +	BACKGROUND-POSITION: -208px -96px
    +}
    +.ui-icon-bookmark {
    +	BACKGROUND-POSITION: -224px -96px
    +}
    +.ui-icon-tag {
    +	BACKGROUND-POSITION: -240px -96px
    +}
    +.ui-icon-home {
    +	BACKGROUND-POSITION: 0px -112px
    +}
    +.ui-icon-flag {
    +	BACKGROUND-POSITION: -16px -112px
    +}
    +.ui-icon-calendar {
    +	BACKGROUND-POSITION: -32px -112px
    +}
    +.ui-icon-cart {
    +	BACKGROUND-POSITION: -48px -112px
    +}
    +.ui-icon-pencil {
    +	BACKGROUND-POSITION: -64px -112px
    +}
    +.ui-icon-clock {
    +	BACKGROUND-POSITION: -80px -112px
    +}
    +.ui-icon-disk {
    +	BACKGROUND-POSITION: -96px -112px
    +}
    +.ui-icon-calculator {
    +	BACKGROUND-POSITION: -112px -112px
    +}
    +.ui-icon-zoomin {
    +	BACKGROUND-POSITION: -128px -112px
    +}
    +.ui-icon-zoomout {
    +	BACKGROUND-POSITION: -144px -112px
    +}
    +.ui-icon-search {
    +	BACKGROUND-POSITION: -160px -112px
    +}
    +.ui-icon-wrench {
    +	BACKGROUND-POSITION: -176px -112px
    +}
    +.ui-icon-gear {
    +	BACKGROUND-POSITION: -192px -112px
    +}
    +.ui-icon-heart {
    +	BACKGROUND-POSITION: -208px -112px
    +}
    +.ui-icon-star {
    +	BACKGROUND-POSITION: -224px -112px
    +}
    +.ui-icon-link {
    +	BACKGROUND-POSITION: -240px -112px
    +}
    +.ui-icon-cancel {
    +	BACKGROUND-POSITION: 0px -128px
    +}
    +.ui-icon-plus {
    +	BACKGROUND-POSITION: -16px -128px
    +}
    +.ui-icon-plusthick {
    +	BACKGROUND-POSITION: -32px -128px
    +}
    +.ui-icon-minus {
    +	BACKGROUND-POSITION: -48px -128px
    +}
    +.ui-icon-minusthick {
    +	BACKGROUND-POSITION: -64px -128px
    +}
    +.ui-icon-close {
    +	BACKGROUND-POSITION: -80px -128px
    +}
    +.ui-icon-closethick {
    +	BACKGROUND-POSITION: -96px -128px
    +}
    +.ui-icon-key {
    +	BACKGROUND-POSITION: -112px -128px
    +}
    +.ui-icon-lightbulb {
    +	BACKGROUND-POSITION: -128px -128px
    +}
    +.ui-icon-scissors {
    +	BACKGROUND-POSITION: -144px -128px
    +}
    +.ui-icon-clipboard {
    +	BACKGROUND-POSITION: -160px -128px
    +}
    +.ui-icon-copy {
    +	BACKGROUND-POSITION: -176px -128px
    +}
    +.ui-icon-contact {
    +	BACKGROUND-POSITION: -192px -128px
    +}
    +.ui-icon-image {
    +	BACKGROUND-POSITION: -208px -128px
    +}
    +.ui-icon-video {
    +	BACKGROUND-POSITION: -224px -128px
    +}
    +.ui-icon-script {
    +	BACKGROUND-POSITION: -240px -128px
    +}
    +.ui-icon-alert {
    +	BACKGROUND-POSITION: 0px -144px
    +}
    +.ui-icon-info {
    +	BACKGROUND-POSITION: -16px -144px
    +}
    +.ui-icon-notice {
    +	BACKGROUND-POSITION: -32px -144px
    +}
    +.ui-icon-help {
    +	BACKGROUND-POSITION: -48px -144px
    +}
    +.ui-icon-check {
    +	BACKGROUND-POSITION: -64px -144px
    +}
    +.ui-icon-bullet {
    +	BACKGROUND-POSITION: -80px -144px
    +}
    +.ui-icon-radio-on {
    +	BACKGROUND-POSITION: -96px -144px
    +}
    +.ui-icon-radio-off {
    +	BACKGROUND-POSITION: -112px -144px
    +}
    +.ui-icon-pin-w {
    +	BACKGROUND-POSITION: -128px -144px
    +}
    +.ui-icon-pin-s {
    +	BACKGROUND-POSITION: -144px -144px
    +}
    +.ui-icon-play {
    +	BACKGROUND-POSITION: 0px -160px
    +}
    +.ui-icon-pause {
    +	BACKGROUND-POSITION: -16px -160px
    +}
    +.ui-icon-seek-next {
    +	BACKGROUND-POSITION: -32px -160px
    +}
    +.ui-icon-seek-prev {
    +	BACKGROUND-POSITION: -48px -160px
    +}
    +.ui-icon-seek-end {
    +	BACKGROUND-POSITION: -64px -160px
    +}
    +.ui-icon-seek-start {
    +	BACKGROUND-POSITION: -80px -160px
    +}
    +.ui-icon-seek-first {
    +	BACKGROUND-POSITION: -80px -160px
    +}
    +.ui-icon-stop {
    +	BACKGROUND-POSITION: -96px -160px
    +}
    +.ui-icon-eject {
    +	BACKGROUND-POSITION: -112px -160px
    +}
    +.ui-icon-volume-off {
    +	BACKGROUND-POSITION: -128px -160px
    +}
    +.ui-icon-volume-on {
    +	BACKGROUND-POSITION: -144px -160px
    +}
    +.ui-icon-power {
    +	BACKGROUND-POSITION: 0px -176px
    +}
    +.ui-icon-signal-diag {
    +	BACKGROUND-POSITION: -16px -176px
    +}
    +.ui-icon-signal {
    +	BACKGROUND-POSITION: -32px -176px
    +}
    +.ui-icon-battery-0 {
    +	BACKGROUND-POSITION: -48px -176px
    +}
    +.ui-icon-battery-1 {
    +	BACKGROUND-POSITION: -64px -176px
    +}
    +.ui-icon-battery-2 {
    +	BACKGROUND-POSITION: -80px -176px
    +}
    +.ui-icon-battery-3 {
    +	BACKGROUND-POSITION: -96px -176px
    +}
    +.ui-icon-circle-plus {
    +	BACKGROUND-POSITION: 0px -192px
    +}
    +.ui-icon-circle-minus {
    +	BACKGROUND-POSITION: -16px -192px
    +}
    +.ui-icon-circle-close {
    +	BACKGROUND-POSITION: -32px -192px
    +}
    +.ui-icon-circle-triangle-e {
    +	BACKGROUND-POSITION: -48px -192px
    +}
    +.ui-icon-circle-triangle-s {
    +	BACKGROUND-POSITION: -64px -192px
    +}
    +.ui-icon-circle-triangle-w {
    +	BACKGROUND-POSITION: -80px -192px
    +}
    +.ui-icon-circle-triangle-n {
    +	BACKGROUND-POSITION: -96px -192px
    +}
    +.ui-icon-circle-arrow-e {
    +	BACKGROUND-POSITION: -112px -192px
    +}
    +.ui-icon-circle-arrow-s {
    +	BACKGROUND-POSITION: -128px -192px
    +}
    +.ui-icon-circle-arrow-w {
    +	BACKGROUND-POSITION: -144px -192px
    +}
    +.ui-icon-circle-arrow-n {
    +	BACKGROUND-POSITION: -160px -192px
    +}
    +.ui-icon-circle-zoomin {
    +	BACKGROUND-POSITION: -176px -192px
    +}
    +.ui-icon-circle-zoomout {
    +	BACKGROUND-POSITION: -192px -192px
    +}
    +.ui-icon-circle-check {
    +	BACKGROUND-POSITION: -208px -192px
    +}
    +.ui-icon-circlesmall-plus {
    +	BACKGROUND-POSITION: 0px -208px
    +}
    +.ui-icon-circlesmall-minus {
    +	BACKGROUND-POSITION: -16px -208px
    +}
    +.ui-icon-circlesmall-close {
    +	BACKGROUND-POSITION: -32px -208px
    +}
    +.ui-icon-squaresmall-plus {
    +	BACKGROUND-POSITION: -48px -208px
    +}
    +.ui-icon-squaresmall-minus {
    +	BACKGROUND-POSITION: -64px -208px
    +}
    +.ui-icon-squaresmall-close {
    +	BACKGROUND-POSITION: -80px -208px
    +}
    +.ui-icon-grip-dotted-vertical {
    +	BACKGROUND-POSITION: 0px -224px
    +}
    +.ui-icon-grip-dotted-horizontal {
    +	BACKGROUND-POSITION: -16px -224px
    +}
    +.ui-icon-grip-solid-vertical {
    +	BACKGROUND-POSITION: -32px -224px
    +}
    +.ui-icon-grip-solid-horizontal {
    +	BACKGROUND-POSITION: -48px -224px
    +}
    +.ui-icon-gripsmall-diagonal-se {
    +	BACKGROUND-POSITION: -64px -224px
    +}
    +.ui-icon-grip-diagonal-se {
    +	BACKGROUND-POSITION: -80px -224px
    +}
    +.ui-corner-all {
    +	border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px
    +}
    +.ui-corner-top {
    +	border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px
    +}
    +.ui-corner-left {
    +	border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px
    +}
    +.ui-corner-tl {
    +	border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px
    +}
    +.ui-corner-all {
    +	border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px
    +}
    +.ui-corner-top {
    +	border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px
    +}
    +.ui-corner-right {
    +	border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px
    +}
    +.ui-corner-tr {
    +	border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px
    +}
    +.ui-corner-all {
    +	border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px
    +}
    +.ui-corner-bottom {
    +	border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px
    +}
    +.ui-corner-left {
    +	border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px
    +}
    +.ui-corner-bl {
    +	border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px
    +}
    +.ui-corner-all {
    +	border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px
    +}
    +.ui-corner-bottom {
    +	border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px
    +}
    +.ui-corner-right {
    +	border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px
    +}
    +.ui-corner-br {
    +	border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px
    +}
    +.ui-widget-overlay {
    +	FILTER: Alpha(Opacity=30)/*{opacityOverlay}*/; BACKGROUND: url(images/ui-bg_flat_0_aaaaaa_40x100.png) #aaaaaa repeat-x 50% 50%; opacity: .3
    +}
    +.ui-widget-shadow {
    +	FILTER: Alpha(Opacity=30)/*{opacityShadow}*/; PADDING-BOTTOM: 8px; MARGIN: -8px 0px 0px -8px; PADDING-LEFT: 8px; PADDING-RIGHT: 8px; BACKGROUND: url(images/ui-bg_flat_0_aaaaaa_40x100.png) #aaaaaa repeat-x 50% 50%; PADDING-TOP: 8px; border-radius: 8px; opacity: .3; -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px
    +}
    diff --git a/src/main/webapp/plug-in/jmobile/css/style.css b/src/main/webapp/plug-in/jmobile/css/style.css
    new file mode 100644
    index 00000000..b66a4b97
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jmobile/css/style.css
    @@ -0,0 +1,942 @@
    +BODY {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +DIV {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +P {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +UL {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +OL {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +LI {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +TEXTAREA {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +FORM {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +INPUT {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +H1 {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +H2 {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +H3 {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +H4 {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +H5 {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +DL {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +DT {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +DD {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +IMG {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +section {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +article {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +aside {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +header {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +footer {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +nav {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +figure {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +hgroup {
    +	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +HTML {
    +	HEIGHT: 100%
    +}
    +BODY {
    +	HEIGHT: 100%
    +}
    +BODY {
    +	MIN-WIDTH: 320px; OVERFLOW-X: hidden; BACKGROUND-COLOR: #f2f1f0; FONT-FAMILY: "微软雅黑", Helvetica, serif; WORD-WRAP: break-word; COLOR: #5b5b5b; FONT-SIZE: 13px; WORD-BREAK: break-all; -webkit-text-size-adjust: none
    +}
    +INPUT {
    +	FONT-FAMILY: "微软雅黑", Helvetica, serif; COLOR: #383838; FONT-SIZE: 15px
    +}
    +BUTTON {
    +	FONT-FAMILY: "微软雅黑", Helvetica, serif; COLOR: #383838; FONT-SIZE: 15px
    +}
    +SELECT {
    +	FONT-FAMILY: "微软雅黑", Helvetica, serif; COLOR: #383838; FONT-SIZE: 15px
    +}
    +TEXTAREA {
    +	FONT-FAMILY: "微软雅黑", Helvetica, serif; COLOR: #383838; FONT-SIZE: 15px
    +}
    +UL {
    +	LIST-STYLE-TYPE: none; LIST-STYLE-IMAGE: none
    +}
    +OL {
    +	LIST-STYLE-TYPE: none; LIST-STYLE-IMAGE: none
    +}
    +LI {
    +	LIST-STYLE-TYPE: none; LIST-STYLE-IMAGE: none
    +}
    +A {
    +	COLOR: #5b5b5b; TEXT-DECORATION: none
    +}
    +IMG {
    +	BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px
    +}
    +section {
    +	DISPLAY: block
    +}
    +article {
    +	DISPLAY: block
    +}
    +aside {
    +	DISPLAY: block
    +}
    +header {
    +	DISPLAY: block
    +}
    +footer {
    +	DISPLAY: block
    +}
    +nav {
    +	DISPLAY: block
    +}
    +figure {
    +	DISPLAY: block
    +}
    +hgroup {
    +	DISPLAY: block
    +}
    +I {
    +	FONT-STYLE: normal
    +}
    +CITE {
    +	FONT-STYLE: normal
    +}
    +EM {
    +	FONT-STYLE: normal
    +}
    +VAR {
    +	FONT-STYLE: normal
    +}
    +ADDRESS {
    +	FONT-STYLE: normal
    +}
    +TABLE {
    +	BORDER-SPACING: 0; BORDER-COLLAPSE: collapse
    +}
    +.wrapper {
    +	POSITION: relative; PADDING-BOTTOM: 10px
    +}
    +.hot {
    +	COLOR: #ff4800
    +}
    +.link {
    +	COLOR: #74a3a5
    +}
    +.gray {
    +	COLOR: #787878
    +}
    +.weak {
    +	COLOR: #c3c3c3
    +}
    +.clear_fix {
    +	
    +}
    +.clear_fix:after {
    +	DISPLAY: block; HEIGHT: 0px; VISIBILITY: hidden; CLEAR: both; CONTENT: "\0020"
    +}
    +.pop_tips {
    +	Z-INDEX: 300; POSITION: fixed; TEXT-ALIGN: center; BACKGROUND-COLOR: #fbfbfb; WIDTH: 255px; MARGIN-LEFT: -122px; FONT-SIZE: 14px; OVERFLOW: hidden; TOP: 20%; LEFT: 50%; border-radius: 5px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3)
    +}
    +.pop_show H4 {
    +	BORDER-BOTTOM: #ededed 1px solid; LINE-HEIGHT: 34px; HEIGHT: 34px; COLOR: #252e32; FONT-SIZE: 16px
    +}
    +.pop_show .pop_info {
    +	PADDING-BOTTOM: 20px; BACKGROUND-COLOR: #fff; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; FONT-SIZE: 16px; PADDING-TOP: 20px
    +}
    +.pop_show .pop_btns {
    +	TEXT-ALIGN: center
    +}
    +.pop_show .pop_btns A {
    +	LINE-HEIGHT: 40px; DISPLAY: block; HEIGHT: 40px; BORDER-TOP: #e2e1e0 1px solid; FONT-WEIGHT: 700; -webkit-box-shadow: 0 1px 1px #fff inset; -webkit-box-flex: 1
    +}
    +.pop_photo {
    +	Z-INDEX: 300; POSITION: fixed; TEXT-ALIGN: center; WIDTH: 100%
    +}
    +.pop_photo .photo {
    +	TEXT-ALIGN: center
    +}
    +.pop_photo .info {
    +	Z-INDEX: 300; POSITION: fixed; TEXT-ALIGN: center; LINE-HEIGHT: 30px; WIDTH: 100%; BOTTOM: 0px; COLOR: #fff; LEFT: 0px
    +}
    +.pop_photo .info .con {
    +	TEXT-ALIGN: left; PADDING-BOTTOM: 5px; MARGIN: 0px auto; PADDING-LEFT: 0px; WIDTH: 280px; PADDING-RIGHT: 0px; PADDING-TOP: 6px
    +}
    +.pop_photo .info H3 {
    +	LINE-HEIGHT: 16px; FONT-SIZE: 16px; FONT-WEIGHT: normal
    +}
    +.pop_photo .info P {
    +	LINE-HEIGHT: 16px; COLOR: #b8b8b8; FONT-SIZE: 12px
    +}
    +.btn_show_close {
    +	BACKGROUND-IMAGE: url(data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAGoAAABqCAYAAABUIcSXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkRGMTFCQjFBQUU1MTExRTI4RDQ0RDUxMEY0Qjc0RTg3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkRGMTFCQjFCQUU1MTExRTI4RDQ0RDUxMEY0Qjc0RTg3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6REYxMUJCMThBRTUxMTFFMjhENDRENTEwRjRCNzRFODciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6REYxMUJCMTlBRTUxMTFFMjhENDRENTEwRjRCNzRFODciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7nka/iAAAKLElEQVR42uydW48UxxXHq6d7Zm/MgIOwHVjHjnGM7xfhoKA4WLHZFSskSzwQKW9JPgePvEX5BlGE7cR+sDEyloAVi0JiOQ9rSCJHNij4IhtsmVsMuyy7zM5055ydU+zZQ3XvzNDTXb1bJR310DvTXdRv/qdOVZ3qCaIoUh4UpVQZbACsCrYO7Adgv6/Van1TU1PfKVdyLSU6esxKzGoAct41kz2gJCyf/lYNw7DumskuUEqoCYH1NaG4ZrLT9XEXOAiKcq7PYtenFaUAlGslC12fBFZBVq6Z7FWUtsD1UfYqipcGhOcl10x2BRMmZdVhLOxAWagoT77B933PNZP9ru8muL7ANZP9oOqgKN81k32gIvHvG9BHlV0z2QMqErC0TZVKpT7XTPa7PqcoC0FFBpt2oOxVFAd1KQzDAddM9ioqpONFCM8dKMuCCZNdbDabRQKFQ4lHwYZ6eI8huoefl6IUKYnbJQDVVzBIa8G29AjWEF17bdaw4lxfk0DdhD7qezj2FwHSunXrqsePH69u3769rwewFiDhtfEeeK8sYZUS+id9PB8EQa0IkMbHx6s7d+4sHzt2LG1YtyHhtfEeeK8sYZkUFTJFoX1lMShsoC0a0rZt2xbmJWu1mpcirCWQ8Np4Eu/FYG3pNSw5MxEa7GuwNZaCegQaag2HpEtKsIyQdGGwsH0eyUpRoVCUVtUXEFBUbaS0fv367yYmJu6AlBKsREgcFtYB65Jl1GcCdX5+fh6P1s1QHDly5Cdbt25NXIbpElZbkHTBOmBdsuyjQgFKwzrn+/49toHat2/fuZmZmcZy7+sQVkeQsGAdsC55jaMaDNZZCCisAwVh8vU9e/acShFWV5CwDliXvKI+rqizURRZByplWNZCigOlATWYqs7W6/Wajf1USrCshhQXTEQCFBqmNf+rVCpZqaoUYFkNCYtH+6M4OMyO1fukcI8UwkE1vVqpVEZBWZ/YPJc0MjKy9tChQy8MDQ0tm5QzNTUV7dq1axpf2wzJBEpvaOtXSze04STkjyDy+wOMqf5m+bxfx7C0ymyFZHJ9PEzXLm+eXuNM+jcEzerSqRu0HVLSgDdk/dQ8Cyomy+XyD1UBSiewbIeUpKhmDKh/hGF4nypISQMWfnbv3r2n84TUievTsHDF92sKMFY8LA3p6NGj1/L+f8Sli0lYdTouqArc30ZVoAKwGqOjo9M6cGin4HvHxsZuACQrdlwmKaoZo6oPQVXo/oqS6rwwmIXotuP6NhqNkurdsn4qilIMFgK6xUBdh35qEga/9xcFUieD2Tanm6xzfU2mpjqDdQJADa9USDbCagdUgyDdoiP++1NwC9doxmJFQrIN1nK5500RUPCgYsL3/YdXMiSbYCWBku6vLvqqkxBU3KvsSiXraha8B4uPmYOKDKBusX7rbVDVQ0WGhOMkNNthLef6+HiqLvoqBDUOESAGFX1FhYSDWTTbYbULiofpXFU3YHzyHkSADxcVkj5nO6x2Hk0QiehvTkSA7wOs4Zz6qlQgFQFWu6BCEabPMVXNAqh3c1LVcFqQUoA1bAOoSLi/OeECD1NflWlG7cjIyKXx8fE1aUHqFhbWAeuSNyiT+0NAswwUnvszqGpLlqD279+/uVqtltKE1A0srAPWxRZQXFVzzDSsY6AqXAHekBWo3bt3//vMmTPX04bUKSysA9bFBlBxQcUsHXVgMQGqerzD63Zdrly50tixY8epOFhprCctBwvvjXXAutgEytRXacNzp0FVH6ge72xoB1aai35xsLKCpLr45ptAzTIXiBU+CPagamUx5QKrFyuzElaWkLoFJfuqWeECp8BeAxf4lDI8razXsCYnJ6/2avlcw8J7ZAkJi8zra+szBFjn/+FAby2zIZpS+i0p6wvlSuaKihsAzzLTLvAw2GZVgDzAlQpKwtKgbpJpF3gZ7E+g1mdUcfIrVhwoU2AhYeH5v4JrPQmwnnBNfXcluEtQGpYeVwXUd5XpNSrpLYCFfdkDYOddk2evKO4CTariU0wnwB5TrU0HruQIqskCC4Q0w2Dh+S/B/ggu8DnV2tbjSoauL84F+nRd7fr0L+f8HVzgvQDrl3D8iN7vSoagZGChfy3HZ9A0rHewvwJY2+B4Wrmfk8gFlGKq4qB8tfSnjv5Cv07wNNjHDkE2fdRyUaDur3SfpYOLN8DOgLmwPQdQSi19RoWOAhHSDTrymYsDYPgQjR87DNmDkv0VV5WEhX9/H+wCjbFcyQGUHF9pUNMMFrrHizTGwsXGYYcjvnQze972temLEKjFRyJg8gtuLKjSazyHM+2YwbQTbJNys+2ZKUoOhvnS/QypSioL4RxSrSmmxx2WbEGZYM0a3KCOBnG2/XWwz8CeVRnlXThQd/ZZEpZUls4TPEDjq63KLY+kPuBtJ2xXBCsOZMQGzm9Q5PhzsH8SQAcqR1gcDoeFAcab2K9BoDMGAQ/mzF13oPKDJR/jHYpzBwHSVTj+jmYyLjhQdihLPnsd7STYV2CvgD1FwJoOVLaw5mMghUJhnxOsX4PtAPvPanOFef7QZEiD4oZhRoM/JB+P/TRoxn7rG3KFn6+mwXEvZyY6ncHAUFznCuKMxaBafIzoIJvFwC8XbkR4FeynYJ+sBnXZAIrD0omdfQQsDpZOnnkJ7GVS23/JlTpQGcDy1OKqcIWgDDJgGpZ2hXr1eC/YLoJ1wYHKDpaezJXqGhSwuLo2U2SICZ+f0qyHA9XjUmLqKjN1DTBQ3BVW6H0+ucLfUNCBwcasA5WdK/QZrH6msAGhrgpT4hjYr8C+Va10tRkHqvewuLrKDNaAMK4uDWyUVBYRsGkHKjt1SXcoYXF1BeRKX6Y+bJDGYNccqGzUFTBgXGH9zCpMhRryLwjaBnKL+LtPdQeqt5EhD+VlH9Yv+i6pMNxn/CKp7DJBu6wsTQotIijTINkX4XzFAEv2XwH73POktGdIYd/a5hqLDEq6Qz4NFTAwfQZYJpeIhok3P1OtBUvMivqeVIbHOQeqt8C4W+TwKgaFBezz61Ur0QZ3oDxKQchVMgR3y4FKF1ggAg9pcvwVKHPePD5C/EnVWhN7jN6Hob7eD6bzP5oO1N0Bk9DKQlVxCuPAfHZNfEj/Q2D3E8QH6LWnlmYHN9Vi4o5qAybeQz9STnsBf6WC4sD4lBRXmS8GxhxeWSgsTmX8uvqLcQ8Bwz5uE10Pz+ndlhtV8ma+Ok1/KQpo/oeQVzqoJJWZlBYI1QVtAvPFdfm9lHhtKnFJPrdXuQO1egpvDL66XBKuzTcA9GPcoXSLcSqToDxWFwmH54zcXu1eTaBM0Dy1uNzvCZeWBLAUA8k3XCMOVhIkbgspCasVFG8kZVCaJ1RR6tCSFOXF3D9JUaseVJJ79JjSvBiAJqDy7yoGUtyXxQQrcqDaV5tKaHxvmQDCMwQ2UcL97lCaA9W94kzDAM9wTiWoSRm+DMoQaLQGvK7YX9wepIKU/wswAC1kRk5DL/lGAAAAAElFTkSuQmCC); Z-INDEX: 300; POSITION: fixed; WIDTH: 53px; DISPLAY: block; HEIGHT: 53px; TOP: 0px; RIGHT: 0px; -webkit-background-size: 53px auto
    +}
    +.btn_show_close SPAN {
    +	DISPLAY: none
    +}
    +.pop_mask {
    +	Z-INDEX: 200; POSITION: fixed; WIDTH: 100%; HEIGHT: 100%; TOP: 0px; LEFT: 0px
    +}
    +.pop_fail {
    +	BORDER-BOTTOM: #000 1px solid; POSITION: fixed; BORDER-LEFT: #000 1px solid; PADDING-BOTTOM: 25px; PADDING-LEFT: 0px; WIDTH: 260px; PADDING-RIGHT: 0px; COLOR: #fff; MARGIN-LEFT: -130px; BORDER-TOP: #000 1px solid; BORDER-RIGHT: #000 1px solid; PADDING-TOP: 25px; LEFT: 50%; border-radius: 20px; -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8) inset
    +}
    +.fail_info {
    +	POSITION: relative; MARGIN: 0px 0px 0px 70px; FONT-SIZE: 15px; text-shadow: -1px -1px 0 #000
    +}
    +.fail_info H4 {
    +	FONT-SIZE: 22px; FONT-WEIGHT: normal
    +}
    +#popFail {
    +	WIDTH: 146px; HEIGHT: 146px
    +}
    +#popFail .bk {
    +	WIDTH: 146px; HEIGHT: 146px
    +}
    +#popFail .cont {
    +	WIDTH: 146px; HEIGHT: 146px
    +}
    +#popFail {
    +	Z-INDEX: 99; POSITION: fixed; TOP: 50%; LEFT: 50%
    +}
    +#popFail .bk {
    +	Z-INDEX: 0; BACKGROUND-COLOR: #000; MARGIN: -73px 0px 0px -73px; border-radius: 10px; opacity: .5
    +}
    +#popFail .bk {
    +	POSITION: relative
    +}
    +#popFail .cont {
    +	POSITION: relative
    +}
    +#popFail {
    +	WIDTH: 146px; HEIGHT: 146px
    +}
    +#popFail .bk {
    +	WIDTH: 146px; HEIGHT: 146px
    +}
    +#popFail .cont {
    +	WIDTH: 146px; HEIGHT: 146px
    +}
    +#popFail .cont {
    +	Z-INDEX: 1; TEXT-ALIGN: center; LINE-HEIGHT: 35px; MARGIN: -146px 0px 0px -73px; COLOR: #f5f5f5; FONT-SIZE: 14px
    +}
    +#popFail .bk {
    +	POSITION: relative
    +}
    +#popFail .cont {
    +	POSITION: relative
    +}
    +#popFail {
    +	WIDTH: 146px; HEIGHT: 146px
    +}
    +#popFail .bk {
    +	WIDTH: 146px; HEIGHT: 146px
    +}
    +#popFail .cont {
    +	WIDTH: 146px; HEIGHT: 146px
    +}
    +#popFail IMG {
    +	MARGIN: 30px auto; WIDTH: 35px; DISPLAY: block; HEIGHT: 35px
    +}
    +.pop_up {
    +	Z-INDEX: 999; POSITION: fixed; WIDTH: 100%; HEIGHT: 100%; TOP: 0px; LEFT: 0px
    +}
    +.pop_up .box {
    +	MARGIN: 100px 20px 0px
    +}
    +.scroller {
    +	BACKGROUND-COLOR: #000
    +}
    +.scroll_show {
    +	POSITION: relative; MIN-WIDTH: 320px; MARGIN: 0px auto; MAX-WIDTH: 720px; HEIGHT: 175px; OVERFLOW: hidden
    +}
    +.scroll_pic {
    +	POSITION: absolute; TOP: 0px
    +}
    +.scroll_pic LI {
    +	FLOAT: left
    +}
    +.scroll_bg {
    +	POSITION: absolute; WIDTH: 100%; BOTTOM: 0px; HEIGHT: 30px; LEFT: 0px
    +}
    +.scroll_txt {
    +	POSITION: absolute; BOTTOM: 8px; COLOR: #fff; FONT-SIZE: 16px; LEFT: 8px; text-shadow: 0 0 5px #000
    +}
    +.scroll_nav {
    +	POSITION: absolute; BOTTOM: 8px; RIGHT: 8px
    +}
    +.scroll_nav A {
    +	LINE-HEIGHT: 0; BACKGROUND-COLOR: #fff; WIDTH: 8px; DISPLAY: inline; FLOAT: left; HEIGHT: 8px; MARGIN-LEFT: 8px; FONT-SIZE: 0px; border-radius: 4px; opacity: .4
    +}
    +.scroll_nav A:hover {
    +	opacity: 1
    +}
    +.scroll_nav A.current {
    +	opacity: 1
    +}
    +.scroll_nav A SPAN {
    +	DISPLAY: none
    +}
    +.scroll_video {
    +	POSITION: absolute; WIDTH: 100%; TOP: 0px; LEFT: 0px
    +}
    +.scroll_video A {
    +	TEXT-ALIGN: center; WIDTH: 100%; DISPLAY: block; HEIGHT: 175px
    +}
    +.scroll_video A SPAN {
    +	DISPLAY: block; HEIGHT: 60px; VISIBILITY: hidden
    +}
    +.join {
    +	BORDER-BOTTOM: #d7cbbc 1px solid; PADDING-BOTTOM: 0px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; HEIGHT: 59px; PADDING-TOP: 0px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1)
    +}
    +.join_info {
    +	PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 10px; PADDING-TOP: 5px; -webkit-box-flex: 1
    +}
    +.join_info STRONG {
    +	FONT-SIZE: 16px
    +}
    +.join_info .hot {
    +	FONT-SIZE: 20px; FONT-WEIGHT: 700
    +}
    +.join_info .gray {
    +	TEXT-OVERFLOW: ellipsis; WHITE-SPACE: nowrap; OVERFLOW: hidden
    +}
    +.join .btn_strong {
    +	TEXT-ALIGN: center; PADDING-BOTTOM: 0px; MARGIN-TOP: 10px; PADDING-LEFT: 0px; WIDTH: 108px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +.join .btn_end {
    +	TEXT-ALIGN: center; PADDING-BOTTOM: 0px; MARGIN-TOP: 10px; PADDING-LEFT: 0px; WIDTH: 108px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +.join_up {
    +	Z-INDEX: 100; POSITION: fixed; MIN-WIDTH: 320px; WIDTH: 100%; TOP: 0px; LEFT: 0px
    +}
    +.join_up .btn_strong {
    +	MARGIN-RIGHT: 20px
    +}
    +.btn_strong {
    +	BORDER-BOTTOM: #f25d35 1px solid; BORDER-LEFT: #f25d35 1px solid; PADDING-BOTTOM: 0px; LINE-HEIGHT: 35px; PADDING-LEFT: 15px; PADDING-RIGHT: 15px; DISPLAY: inline-block; HEIGHT: 35px; COLOR: #fff; FONT-SIZE: 16px; BORDER-TOP: #f25d35 1px solid; FONT-WEIGHT: 700; BORDER-RIGHT: #f25d35 1px solid; PADDING-TOP: 0px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 1px 1px 1px rgba(0, 0, 0, 0.2); text-shadow: 0 1px 1px rgba(0, 0, 0, 0.3)
    +}
    +.btn_end {
    +	BORDER-BOTTOM: #c8bba9 1px solid; BORDER-LEFT: #c8bba9 1px solid; PADDING-BOTTOM: 0px; LINE-HEIGHT: 35px; BACKGROUND-COLOR: #d7cbbc; PADDING-LEFT: 15px; PADDING-RIGHT: 15px; DISPLAY: inline-block; HEIGHT: 35px; COLOR: #6a5f57; FONT-SIZE: 16px; BORDER-TOP: #c8bba9 1px solid; FONT-WEIGHT: 700; BORDER-RIGHT: #c8bba9 1px solid; PADDING-TOP: 0px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 1px 1px 1px rgba(0, 0, 0, 0.2); text-shadow: -1px -1px 1px rgba(255, 255, 255, 0.8)
    +}
    +.btn_off {
    +	BORDER-BOTTOM: #b9b9b9 1px solid; BORDER-LEFT: #b9b9b9 1px solid; PADDING-BOTTOM: 0px; LINE-HEIGHT: 35px; PADDING-LEFT: 15px; PADDING-RIGHT: 15px; DISPLAY: inline-block; HEIGHT: 35px; COLOR: #fff; FONT-SIZE: 16px; BORDER-TOP: #b9b9b9 1px solid; FONT-WEIGHT: 700; BORDER-RIGHT: #b9b9b9 1px solid; PADDING-TOP: 0px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 1px 1px 1px rgba(0, 0, 0, 0.2); text-shadow: 0 1px 1px rgba(0, 0, 0, 0.3)
    +}
    +.btn_normal {
    +	BORDER-BOTTOM: #e1e1e1 1px solid; BORDER-LEFT: #e1e1e1 1px solid; PADDING-BOTTOM: 0px; LINE-HEIGHT: 35px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; DISPLAY: inline-block; HEIGHT: 35px; COLOR: #6a5f57; FONT-SIZE: 14px; BORDER-TOP: #e1e1e1 1px solid; FONT-WEIGHT: 700; BORDER-RIGHT: #e1e1e1 1px solid; PADDING-TOP: 0px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 1px 1px 1px rgba(0, 0, 0, 0.2); text-shadow: -1px -1px 1px rgba(255, 255, 255, 0.8)
    +}
    +.box {
    +	BACKGROUND-COLOR: #fff; MARGIN: 15px 10px; border-radius: 5px; -webkit-box-shadow: 0 2px 1px rgba(0, 0, 0, 0.1)
    +}
    +.box H3 {
    +	BORDER-BOTTOM: #ededed 1px solid; LINE-HEIGHT: 34px; BACKGROUND-COLOR: #fbfbfb; PADDING-LEFT: 10px; MARGIN-BOTTOM: 10px; HEIGHT: 34px; COLOR: #252e32; FONT-SIZE: 15px; border-top-left-radius: 5px; border-top-right-radius: 5px
    +}
    +.box H3 EM {
    +	FONT-SIZE: 13px; FONT-WEIGHT: normal
    +}
    +.box_info {
    +	PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 0px
    +}
    +.box_up .box_time {
    +	HEIGHT: 92px; OVERFLOW: hidden
    +}
    +.box_up .box_info {
    +	HEIGHT: 84px; OVERFLOW: hidden
    +}
    +.box_up .box_type {
    +	HEIGHT: 240px; OVERFLOW: hidden
    +}
    +.box .btn_more {
    +	TEXT-ALIGN: center; LINE-HEIGHT: 40px; BACKGROUND-COLOR: #f9f9f9; MARGIN-TOP: -1px; DISPLAY: block; HEIGHT: 40px; BORDER-TOP: #ededed 1px solid; FONT-WEIGHT: 700; -webkit-box-shadow: 0 1px 0 #fff inset, 0 -3px 1px rgba(0, 0, 0, 0.05) inset; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.3); border-bottom-left-radius: 5px; border-bottom-right-radius: 5px
    +}
    +.box_up1 .box_type {
    +	MARGIN-BOTTOM: 0px; HEIGHT: 63px; OVERFLOW: hidden
    +}
    +.box_up2 .box_type {
    +	MARGIN-BOTTOM: 0px; HEIGHT: 126px; OVERFLOW: hidden
    +}
    +.box_up3 .box_type {
    +	MARGIN-BOTTOM: 0px; HEIGHT: 189px; OVERFLOW: hidden
    +}
    +.box_up4 .box_type {
    +	MARGIN-BOTTOM: 0px; HEIGHT: 252px; OVERFLOW: hidden
    +}
    +.box_up1 .btn_more {
    +	DISPLAY: none
    +}
    +.box_up2 .btn_more {
    +	DISPLAY: none
    +}
    +.box_up3 .btn_more {
    +	DISPLAY: none
    +}
    +.box_up4 .btn_more {
    +	DISPLAY: none
    +}
    +.box_time {
    +	PADDING-BOTTOM: 0px; LINE-HEIGHT: 23px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 0px
    +}
    +.box_map {
    +	PADDING-BOTTOM: 10px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 0px
    +}
    +.map_area {
    +	WIDTH: 100%; MARGIN-BOTTOM: 5px; HEIGHT: 75px; OVERFLOW: hidden
    +}
    +.box_map P {
    +	POSITION: relative; PADDING-LEFT: 13px
    +}
    +.box_type {
    +	MARGIN: -10px 0px
    +}
    +.house_type LI {
    +	BORDER-BOTTOM: #e2e1e0 1px solid
    +}
    +.house_type LI A {
    +	POSITION: relative; PADDING-BOTTOM: 0px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; DISPLAY: block; HEIGHT: 52px; OVERFLOW: hidden; PADDING-TOP: 10px
    +}
    +.house_type LI A EM {
    +	DISPLAY: block
    +}
    +.house_type LI A STRONG {
    +	LINE-HEIGHT: 23px; COLOR: #252e32
    +}
    +.house_type LI A SPAN {
    +	LINE-HEIGHT: 23px; COLOR: #74a3a5
    +}
    +.house_photo {
    +	BACKGROUND-COLOR: #f8f7f7; HEIGHT: 52px; box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.1) inset, 0 1px 1px rgba(0, 0, 0, 0.1) inset
    +}
    +.house_photo A {
    +	TEXT-ALIGN: center; LINE-HEIGHT: 52px; FONT-SIZE: 14px; -webkit-box-flex: 1
    +}
    +.house_type LI .house_photo A {
    +	PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +.house_arrow {
    +	POSITION: relative
    +}
    +.btn_commend {
    +	TEXT-ALIGN: center; PADDING-BOTTOM: 0px; LINE-HEIGHT: 15px; BACKGROUND-COLOR: #ff5603; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; DISPLAY: inline-block; HEIGHT: 15px; COLOR: #fff; PADDING-TOP: 0px; border-radius: 10px
    +}
    +.type_show {
    +	WIDTH: 100%; HEIGHT: 100%
    +}
    +.btn_show_close {
    +	BACKGROUND-IMAGE: url(data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAGoAAABqCAYAAABUIcSXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkRGMTFCQjFBQUU1MTExRTI4RDQ0RDUxMEY0Qjc0RTg3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkRGMTFCQjFCQUU1MTExRTI4RDQ0RDUxMEY0Qjc0RTg3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6REYxMUJCMThBRTUxMTFFMjhENDRENTEwRjRCNzRFODciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6REYxMUJCMTlBRTUxMTFFMjhENDRENTEwRjRCNzRFODciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7nka/iAAAKLElEQVR42uydW48UxxXHq6d7Zm/MgIOwHVjHjnGM7xfhoKA4WLHZFSskSzwQKW9JPgePvEX5BlGE7cR+sDEyloAVi0JiOQ9rSCJHNij4IhtsmVsMuyy7zM5055ydU+zZQ3XvzNDTXb1bJR310DvTXdRv/qdOVZ3qCaIoUh4UpVQZbACsCrYO7Adgv6/Van1TU1PfKVdyLSU6esxKzGoAct41kz2gJCyf/lYNw7DumskuUEqoCYH1NaG4ZrLT9XEXOAiKcq7PYtenFaUAlGslC12fBFZBVq6Z7FWUtsD1UfYqipcGhOcl10x2BRMmZdVhLOxAWagoT77B933PNZP9ru8muL7ANZP9oOqgKN81k32gIvHvG9BHlV0z2QMqErC0TZVKpT7XTPa7PqcoC0FFBpt2oOxVFAd1KQzDAddM9ioqpONFCM8dKMuCCZNdbDabRQKFQ4lHwYZ6eI8huoefl6IUKYnbJQDVVzBIa8G29AjWEF17bdaw4lxfk0DdhD7qezj2FwHSunXrqsePH69u3769rwewFiDhtfEeeK8sYZUS+id9PB8EQa0IkMbHx6s7d+4sHzt2LG1YtyHhtfEeeK8sYZkUFTJFoX1lMShsoC0a0rZt2xbmJWu1mpcirCWQ8Np4Eu/FYG3pNSw5MxEa7GuwNZaCegQaag2HpEtKsIyQdGGwsH0eyUpRoVCUVtUXEFBUbaS0fv367yYmJu6AlBKsREgcFtYB65Jl1GcCdX5+fh6P1s1QHDly5Cdbt25NXIbpElZbkHTBOmBdsuyjQgFKwzrn+/49toHat2/fuZmZmcZy7+sQVkeQsGAdsC55jaMaDNZZCCisAwVh8vU9e/acShFWV5CwDliXvKI+rqizURRZByplWNZCigOlATWYqs7W6/Wajf1USrCshhQXTEQCFBqmNf+rVCpZqaoUYFkNCYtH+6M4OMyO1fukcI8UwkE1vVqpVEZBWZ/YPJc0MjKy9tChQy8MDQ0tm5QzNTUV7dq1axpf2wzJBEpvaOtXSze04STkjyDy+wOMqf5m+bxfx7C0ymyFZHJ9PEzXLm+eXuNM+jcEzerSqRu0HVLSgDdk/dQ8Cyomy+XyD1UBSiewbIeUpKhmDKh/hGF4nypISQMWfnbv3r2n84TUievTsHDF92sKMFY8LA3p6NGj1/L+f8Sli0lYdTouqArc30ZVoAKwGqOjo9M6cGin4HvHxsZuACQrdlwmKaoZo6oPQVXo/oqS6rwwmIXotuP6NhqNkurdsn4qilIMFgK6xUBdh35qEga/9xcFUieD2Tanm6xzfU2mpjqDdQJADa9USDbCagdUgyDdoiP++1NwC9doxmJFQrIN1nK5500RUPCgYsL3/YdXMiSbYCWBku6vLvqqkxBU3KvsSiXraha8B4uPmYOKDKBusX7rbVDVQ0WGhOMkNNthLef6+HiqLvoqBDUOESAGFX1FhYSDWTTbYbULiofpXFU3YHzyHkSADxcVkj5nO6x2Hk0QiehvTkSA7wOs4Zz6qlQgFQFWu6BCEabPMVXNAqh3c1LVcFqQUoA1bAOoSLi/OeECD1NflWlG7cjIyKXx8fE1aUHqFhbWAeuSNyiT+0NAswwUnvszqGpLlqD279+/uVqtltKE1A0srAPWxRZQXFVzzDSsY6AqXAHekBWo3bt3//vMmTPX04bUKSysA9bFBlBxQcUsHXVgMQGqerzD63Zdrly50tixY8epOFhprCctBwvvjXXAutgEytRXacNzp0FVH6ge72xoB1aai35xsLKCpLr45ptAzTIXiBU+CPagamUx5QKrFyuzElaWkLoFJfuqWeECp8BeAxf4lDI8razXsCYnJ6/2avlcw8J7ZAkJi8zra+szBFjn/+FAby2zIZpS+i0p6wvlSuaKihsAzzLTLvAw2GZVgDzAlQpKwtKgbpJpF3gZ7E+g1mdUcfIrVhwoU2AhYeH5v4JrPQmwnnBNfXcluEtQGpYeVwXUd5XpNSrpLYCFfdkDYOddk2evKO4CTariU0wnwB5TrU0HruQIqskCC4Q0w2Dh+S/B/ggu8DnV2tbjSoauL84F+nRd7fr0L+f8HVzgvQDrl3D8iN7vSoagZGChfy3HZ9A0rHewvwJY2+B4Wrmfk8gFlGKq4qB8tfSnjv5Cv07wNNjHDkE2fdRyUaDur3SfpYOLN8DOgLmwPQdQSi19RoWOAhHSDTrymYsDYPgQjR87DNmDkv0VV5WEhX9/H+wCjbFcyQGUHF9pUNMMFrrHizTGwsXGYYcjvnQze972temLEKjFRyJg8gtuLKjSazyHM+2YwbQTbJNys+2ZKUoOhvnS/QypSioL4RxSrSmmxx2WbEGZYM0a3KCOBnG2/XWwz8CeVRnlXThQd/ZZEpZUls4TPEDjq63KLY+kPuBtJ2xXBCsOZMQGzm9Q5PhzsH8SQAcqR1gcDoeFAcab2K9BoDMGAQ/mzF13oPKDJR/jHYpzBwHSVTj+jmYyLjhQdihLPnsd7STYV2CvgD1FwJoOVLaw5mMghUJhnxOsX4PtAPvPanOFef7QZEiD4oZhRoM/JB+P/TRoxn7rG3KFn6+mwXEvZyY6ncHAUFznCuKMxaBafIzoIJvFwC8XbkR4FeynYJ+sBnXZAIrD0omdfQQsDpZOnnkJ7GVS23/JlTpQGcDy1OKqcIWgDDJgGpZ2hXr1eC/YLoJ1wYHKDpaezJXqGhSwuLo2U2SICZ+f0qyHA9XjUmLqKjN1DTBQ3BVW6H0+ucLfUNCBwcasA5WdK/QZrH6msAGhrgpT4hjYr8C+Va10tRkHqvewuLrKDNaAMK4uDWyUVBYRsGkHKjt1SXcoYXF1BeRKX6Y+bJDGYNccqGzUFTBgXGH9zCpMhRryLwjaBnKL+LtPdQeqt5EhD+VlH9Yv+i6pMNxn/CKp7DJBu6wsTQotIijTINkX4XzFAEv2XwH73POktGdIYd/a5hqLDEq6Qz4NFTAwfQZYJpeIhok3P1OtBUvMivqeVIbHOQeqt8C4W+TwKgaFBezz61Ur0QZ3oDxKQchVMgR3y4FKF1ggAg9pcvwVKHPePD5C/EnVWhN7jN6Hob7eD6bzP5oO1N0Bk9DKQlVxCuPAfHZNfEj/Q2D3E8QH6LWnlmYHN9Vi4o5qAybeQz9STnsBf6WC4sD4lBRXmS8GxhxeWSgsTmX8uvqLcQ8Bwz5uE10Pz+ndlhtV8ma+Ok1/KQpo/oeQVzqoJJWZlBYI1QVtAvPFdfm9lHhtKnFJPrdXuQO1egpvDL66XBKuzTcA9GPcoXSLcSqToDxWFwmH54zcXu1eTaBM0Dy1uNzvCZeWBLAUA8k3XCMOVhIkbgspCasVFG8kZVCaJ1RR6tCSFOXF3D9JUaseVJJ79JjSvBiAJqDy7yoGUtyXxQQrcqDaV5tKaHxvmQDCMwQ2UcL97lCaA9W94kzDAM9wTiWoSRm+DMoQaLQGvK7YX9wepIKU/wswAC1kRk5DL/lGAAAAAElFTkSuQmCC); Z-INDEX: 300; POSITION: fixed; WIDTH: 53px; DISPLAY: block; HEIGHT: 53px; TOP: 0px; RIGHT: 0px; -webkit-background-size: 53px auto
    +}
    +.btn_show_close SPAN {
    +	DISPLAY: none
    +}
    +.btn_down {
    +	Z-INDEX: 300; POSITION: fixed; WIDTH: 45px; DISPLAY: block; BACKGROUND: url(../images/sprite_map.png) no-repeat; HEIGHT: 45px; -webkit-background-size: 55px auto
    +}
    +.btn_zoom_in {
    +	Z-INDEX: 300; POSITION: fixed; WIDTH: 45px; DISPLAY: block; BACKGROUND: url(../images/sprite_map.png) no-repeat; HEIGHT: 45px; -webkit-background-size: 55px auto
    +}
    +.btn_zoom_out {
    +	Z-INDEX: 300; POSITION: fixed; WIDTH: 45px; DISPLAY: block; BACKGROUND: url(../images/sprite_map.png) no-repeat; HEIGHT: 45px; -webkit-background-size: 55px auto
    +}
    +.btn_down {
    +	BOTTOM: 110px; BACKGROUND-POSITION: 0px 0px; LEFT: 10px
    +}
    +.btn_zoom_in {
    +	BOTTOM: 110px; BACKGROUND-POSITION: 0px -120px; RIGHT: 10px
    +}
    +.btn_zoom_out {
    +	BOTTOM: 110px; BACKGROUND-POSITION: 0px -60px; RIGHT: 10px
    +}
    +.btn_down SPAN {
    +	DISPLAY: none
    +}
    +.btn_zoom_in SPAN {
    +	DISPLAY: none
    +}
    +.btn_zoom_out SPAN {
    +	DISPLAY: none
    +}
    +.type_info {
    +	POSITION: fixed; WIDTH: 100%; BOTTOM: 0px; LEFT: 0px
    +}
    +.type_up {
    +	PADDING-BOTTOM: 0px; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; DISPLAY: block; HEIGHT: 50px; COLOR: #fff; BORDER-TOP: #000 1px solid; PADDING-TOP: 10px; -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset
    +}
    +.type_up EM {
    +	DISPLAY: block
    +}
    +.type_up STRONG {
    +	PADDING-RIGHT: 5px; FONT-SIZE: 15px
    +}
    +.type_up .btn_more {
    +	POSITION: absolute; TOP: 45px; RIGHT: 25px
    +}
    +.type_num {
    +	TEXT-ALIGN: center; LINE-HEIGHT: 23px; COLOR: #fff; text-shadow: -1px -1px 0 #000
    +}
    +.type_detail {
    +	DISPLAY: none
    +}
    +.type_full .btn_show_close {
    +	DISPLAY: none
    +}
    +.type_full .type_num {
    +	DISPLAY: none
    +}
    +.type_full .type_info {
    +	HEIGHT: 100%; TOP: 0px
    +}
    +.type_full .type_detail {
    +	PADDING-BOTTOM: 0px; LINE-HEIGHT: 25px; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; DISPLAY: block; COLOR: #fff; FONT-SIZE: 15px; BORDER-TOP: #000 2px solid; PADDING-TOP: 15px; -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset
    +}
    +.type_detail UL {
    +	PADDING-TOP: 15px
    +}
    +.map_info {
    +	POSITION: absolute; WIDTH: 250px; HEIGHT: 50px; MARGIN-LEFT: -125px; LEFT: 50%; border-radius: 10px; -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.6)
    +}
    +.map_info .info {
    +	WIDTH: 200px; FLOAT: left
    +}
    +.map_info H4 {
    +	PADDING-BOTTOM: 0px; PADDING-LEFT: 10px; PADDING-RIGHT: 0px; FONT-SIZE: 15px; PADDING-TOP: 7px; text-shadow: -1px -1px 0 #fff
    +}
    +.map_info P {
    +	PADDING-LEFT: 10px; TEXT-OVERFLOW: ellipsis; WHITE-SPACE: nowrap; OVERFLOW: hidden
    +}
    +.btn_map_road {
    +	BORDER-LEFT: #bebeb7 1px solid; WIDTH: 48px; FLOAT: right; HEIGHT: 50px; -webkit-box-shadow: 1px 0 0 #fbfcf8 inset
    +}
    +.btn_map_road SPAN {
    +	DISPLAY: none
    +}
    +.btn_map_place {
    +	BORDER-BOTTOM: #000 1px solid; POSITION: fixed; BORDER-LEFT: #000 1px solid; WIDTH: 46px; BOTTOM: 25px; DISPLAY: block; HEIGHT: 27px; BORDER-TOP: #000 1px solid; BORDER-RIGHT: #000 1px solid; LEFT: 10px; border-radius: 5px; -webkit-box-shadow: 0 0 2px rgba(255, 255, 255, 0.8) inset, 0 1px 0 rgba(255, 255, 255, 0.3) inset
    +}
    +.btn_on.btn_map_place {
    +	
    +}
    +.btn_map_place SPAN {
    +	DISPLAY: none
    +}
    +.act_top {
    +	WIDTH: 100%; OVERFLOW: hidden
    +}
    +.act_top_show {
    +	POSITION: relative; MIN-WIDTH: 320px; MARGIN: 0px auto; MAX-WIDTH: 720px; BACKGROUND: url(data:image/gif;base64,R0lGODlhGAAYAMQAAP////v7+/Pz8+fn59/f39fX187OzsbGxr6+vra2tq6urqqqqp6eno6OjoaGhnV1dWlpaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBwAAACwAAAAAGAAYAAAFriAgjiSQJGVaBgXpOGSgksSDjBA0CoQ8i44HQZQTBQjDnwjxYABhgAFBoDqSGg/qSUQYxEaERuNgXHhHgTOA1xsdxAzfTzotDRYNhVI6kJcEVEqCgyoGCgwMCgaDAnQDAoaIioyOgYSXAX6XIgMICmRzXZoFCgoImil0lgOlLSIGlgBpO0g+s26nUWddXyoECIsABa5SsTMICIEGwUdJPwIIzsu0qHYkw72bA2ozIQAh+QQFBwAAACwAAAAAEwAYAAAFfCAgjiSAIGUKEGTTkEY6NMf4PGMCFalr44ACBFg6NBYiH6ABSYwGJMbLhBJAHNFFTAUYMEoGBkPBLScYqLIqEFC71QWEQoHgvePz+nvP7wsMCFtvBCc1fCcsIgRtagIkBVsCjm4DBnYDUG4GggSJagaZK55lkyKYfSKSKSEAIfkEBQcAAAAsAAAAABcAFwAABYAgII4kcBxlqo4MQxYra4xNMyIPEQMLM4g1EeHh2AEMjISotXwgjACFy4QCPGwjGGCgAGgBCEFpMUo8IDOvQvE0OiAQJQmhqK4YkMYXShKI+XwEBwgIBzqAQoOFh4iNjo4FBoyIAwYGe4AClj8inI9bk40CBJ6OBAQBnwEEf6qNIQAh+QQFBwAAACwAAAAAGAATAAAFeCAgjiRgGGWaDqSikIRaKsXIMOPRsPL4irdRo9EbFRQIkUu0aBxkAhJCETChAA3cKDZCILiAZw/heNREBK+42Hg8kiSBAXGVLR4McHHP74sGBScFPEUJDhAQDgmAgoQ9hoiKfpOUKQEDBI6TAgSZlSIBnVGfoKQiIQAh+QQFBwAAACwAAAAAGAATAAAFdSAgjiRQFGWqkgiyrgJCjIoyGsw7toJYiwPGQiciIAyilijBQBIBB5cJBWDYVAKDYXArxUaHRmMG1FJ1DPEhVTCQX40F90mvEwUDAmHQIyIaDw8NCHh6fE9/gYN2jDoCfY0jDBANZ5EOEBAJkSMJDxBOnCYiIQAh+QQFBwAAACwAAAAAGAAXAAAFhSAgjiRAEGWaCuRxkINaGrGIIGOhyKRhjLfRjjcaGAoil02BVAVIhZ8JFVDgiqPAiSUiPFsjw4JBEpxqRAWDIc0OCGgVgpEg2gNfu37POzAaDQwvfCN+gIKEiYqKCw8MKIsiDQ8PV3wDZDYOD017AhAOJJCEDRB1kQAFEA+oIgkQnZFtIyEAIfkEBQcAAAAsBQAAABMAGAAABXwgII7DMJ5ocBYF6gaEMBrGSCAyShAqQIsCBMIFEBBMAJbIgCAQAQMnFIk4PEXIU03UUmSvIoRC0QKPDoqhec1uaxUMhmJrNsDldLd+31jsGQ0NVmZ+IgeBUigJCSIPDSdfJw4OIgwPamAQECIED5RmmiMID4lPkytri2YhACH5BAUHAAAALAUAAAATABgAAAV8ICCOgjCeKDoMp5miBDEOxgvLolHbMwsUBh8PUMoVWkNAAAcgIBDJ0+HJTBoQBld0y90WEAoF4hj9hsfdtFqEYCSEWwWDsRsx4CjDgnFyQExPIg18LwkQDYKIAAsNBy8PEGQPDyIDDYonBRAJI5MjBw14AHUAlydVNoFDIQAh+QQFBwAAACwAAAEAGAAXAAAFhCAgjmQpBmaqAgKBrnBAEHA9EEINE4MO96KBwZDzlQpDoHFEMBSW0KiURDggEAdatHrNTmGCoirwMhUaEAbsoECYEhCIQ4dQKJ4iA+SRGC1KAm4iTwpKeCINDyIHBwABDAo+CA9qAAyVCQwGOg4PWg0NIwx/Ow+CAKAjBpUwh5asU4w1IQAh+QQFBwAAACwAAAUAGAATAAAFdCAgjmRpBmaqCgSBqjAwtEIMz8Nr7zyfOBCII7EbFAyGwuAXHBaPyUFvSjURGI9FzIAw1EiIx6OxOyAQhFHh4UDEDiPCmZQeMcgApEjhHn1NBw1aAAoKIggKBTsNDVIADAwjhjYDDXAikGqTMXV7mzJVejEhACH5BAUHAAAALAAABQAYABMAAAV1IAAUYmmeqGhAT5K+aAJBDmyLRQMx9y0IvaBQhGg8Hg1ETzAgEAaC4jG5bD6Bw6y2tGjcCAbS6dBo8G4Fg2FQIpQPJQS2ZCgN1HN2ScEIjMQIcD0GDC4ACEoABggEPQtnAAoKIlGJNgx1IpJtclmIWyYFYjAhACH5BAkHAAAALAAAAAAYABgAAAWAICCOZGmeooGuZQElbAw8UCGvCdTcJEE6EAEPUHg4ECPGYAhAPB47Zo/xWEiv2NiB0WgwDtdt95stm02DBAO5GhAGgZKBwVDI3ARhcqESgUkBPiICBARxJwh2AIUpNiOHJgUKbAd/BQZLMopNbAAGfSwKjpwjA6BtJJUkekOMLCEAOw==) no-repeat center center; COLOR: #fff
    +}
    +.act_top_show IMG {
    +	DISPLAY: block
    +}
    +.act_title {
    +	DISPLAY: none
    +}
    +.act_top_time {
    +	POSITION: absolute; MIN-WIDTH: 200px; TEXT-ALIGN: left; COLOR: #fff; FONT-SIZE: 12px; TOP: 62px; LEFT: 0px
    +}
    +.act_top_time P {
    +	PADDING-BOTTOM: 0px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 0px
    +}
    +.act_time {
    +	BORDER-BOTTOM: #d7cbbc 1px solid; TEXT-ALIGN: center; PADDING-BOTTOM: 0px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; HEIGHT: 52px; PADDING-TOP: 0px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1)
    +}
    +.act_time P {
    +	LINE-HEIGHT: 36px; COLOR: #252e32; FONT-SIZE: 15px; FONT-WEIGHT: 700; PADDING-TOP: 8px
    +}
    +.act_time EM {
    +	TEXT-ALIGN: center; MARGIN: 0px 5px 0px 15px; WIDTH: 36px; DISPLAY: inline-block; BACKGROUND: url(../images/sprite.png) no-repeat -110px -25px; HEIGHT: 35px; COLOR: #fff; FONT-SIZE: 18px; -webkit-background-size: 160px auto; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.3)
    +}
    +.act_time EM:first-child {
    +	MARGIN-LEFT: 0px
    +}
    +.act_time_end {
    +	BORDER-BOTTOM-COLOR: #dfdedd; BACKGROUND: #f3f2f1
    +}
    +.act_time_end P {
    +	COLOR: #dcdbda
    +}
    +.act_time_end EM {
    +	BACKGROUND-POSITION: 0px -100px; COLOR: #eee; -webkit-background-size: 160px auto; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1)
    +}
    +.act_join {
    +	PADDING-BOTTOM: 15px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 0px
    +}
    +.act_join LI {
    +	LINE-HEIGHT: 35px; PADDING-LEFT: 40px; MARGIN-BOTTOM: 8px; CLEAR: left
    +}
    +.act_join LI EM {
    +	WIDTH: 40px; DISPLAY: inline-block; MARGIN-LEFT: -40px
    +}
    +.act_join INPUT[type=text] {
    +	BORDER-BOTTOM: #bfbfbf 1px solid; BORDER-LEFT: #bfbfbf 1px solid; DISPLAY: block; HEIGHT: 35px; FONT-SIZE: 15px; BORDER-TOP: #bfbfbf 1px solid; BORDER-RIGHT: #bfbfbf 1px solid; border-radius: 3px; -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3) inset; -webkit-box-flex: 1
    +}
    +.act_join INPUT[type=number] {
    +	BORDER-BOTTOM: #bfbfbf 1px solid; BORDER-LEFT: #bfbfbf 1px solid; DISPLAY: block; HEIGHT: 35px; FONT-SIZE: 15px; BORDER-TOP: #bfbfbf 1px solid; BORDER-RIGHT: #bfbfbf 1px solid; border-radius: 3px; -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3) inset; -webkit-box-flex: 1
    +}
    +.act_join INPUT[type=tel] {
    +	BORDER-BOTTOM: #bfbfbf 1px solid; BORDER-LEFT: #bfbfbf 1px solid; DISPLAY: block; HEIGHT: 35px; FONT-SIZE: 15px; BORDER-TOP: #bfbfbf 1px solid; BORDER-RIGHT: #bfbfbf 1px solid; border-radius: 3px; -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3) inset; -webkit-box-flex: 1
    +}
    +.act_join SELECT {
    +	BORDER-BOTTOM: #bfbfbf 1px solid; BORDER-LEFT: #bfbfbf 1px solid; DISPLAY: block; HEIGHT: 35px; FONT-SIZE: 15px; BORDER-TOP: #bfbfbf 1px solid; BORDER-RIGHT: #bfbfbf 1px solid; border-radius: 3px; -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3) inset; -webkit-box-flex: 1
    +}
    +.act_join INPUT[type=text] {
    +	TEXT-INDENT: 5px
    +}
    +.act_join INPUT[type=number] {
    +	TEXT-INDENT: 5px
    +}
    +.act_join INPUT[type=checkbox] {
    +	MARGIN-RIGHT: 5px
    +}
    +.act_join SELECT {
    +	POSITION: relative; MIN-WIDTH: 40px; MARGIN: 0px; PADDING-RIGHT: 25px; BACKGROUND: url(../images/sprite.png) no-repeat right -358px; -webkit-background-size: 160px auto; -webkit-appearance: none
    +}
    +.act_join .btn_strong {
    +	TEXT-ALIGN: center; DISPLAY: block; -webkit-box-flex: 1
    +}
    +.act_join_btn .btn_strong {
    +	TEXT-ALIGN: center; MARGIN: 10px 10px 0px; DISPLAY: block
    +}
    +.join_date {
    +	PADDING-BOTTOM: 10px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px
    +}
    +.join_date LI {
    +	PADDING-LEFT: 70px
    +}
    +.join_date LI EM {
    +	TEXT-ALIGN: right; WIDTH: 70px; MARGIN-LEFT: -70px
    +}
    +.join_date INPUT[type=number] {
    +	WIDTH: 60px
    +}
    +.ico_date {
    +	POSITION: relative
    +}
    +.date_list {
    +	MARGIN: -10px 10px 20px
    +}
    +.date_month {
    +	BORDER-BOTTOM: 0px; TEXT-ALIGN: center; BORDER-LEFT: #e0e0e0 1px solid; PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BACKGROUND: #efefef; FONT-SIZE: 15px; BORDER-TOP: #e0e0e0 1px solid; FONT-WEIGHT: 700; BORDER-RIGHT: #e0e0e0 1px solid; PADDING-TOP: 10px; border-radius: 5px 5px 0 0; -webkit-box-shadow: 0 1px 0 #fff inset
    +}
    +.date_month .pre {
    +	PADDING-BOTTOM: 0px; PADDING-LEFT: 20px; PADDING-RIGHT: 20px; DISPLAY: inline-block; PADDING-TOP: 0px
    +}
    +.date_month .next {
    +	PADDING-BOTTOM: 0px; PADDING-LEFT: 20px; PADDING-RIGHT: 20px; DISPLAY: inline-block; PADDING-TOP: 0px
    +}
    +.date_month .pre SPAN {
    +	BORDER-BOTTOM: 7px solid; BORDER-LEFT: 7px solid; DISPLAY: inline-block; FONT: 0px/0 SimSun; VERTICAL-ALIGN: top; BORDER-TOP: 7px solid; CURSOR: pointer; BORDER-RIGHT: 7px solid
    +}
    +.date_month .next SPAN {
    +	BORDER-BOTTOM: 7px solid; BORDER-LEFT: 7px solid; DISPLAY: inline-block; FONT: 0px/0 SimSun; VERTICAL-ALIGN: top; BORDER-TOP: 7px solid; CURSOR: pointer; BORDER-RIGHT: 7px solid
    +}
    +.date_month .pre {
    +	MARGIN-RIGHT: 30px
    +}
    +.date_month .pre SPAN {
    +	BORDER-BOTTOM-COLOR: transparent; BORDER-TOP-COLOR: transparent; BORDER-RIGHT-COLOR: #848484; BORDER-LEFT-COLOR: transparent
    +}
    +.date_month .next {
    +	MARGIN-LEFT: 30px
    +}
    +.date_month .next SPAN {
    +	BORDER-BOTTOM-COLOR: transparent; BORDER-TOP-COLOR: transparent; BORDER-RIGHT-COLOR: transparent; BORDER-LEFT-COLOR: #848484
    +}
    +.date_list TABLE {
    +	BORDER-BOTTOM: #e0e0e0 1px solid; BORDER-LEFT: #e0e0e0 1px solid; WIDTH: 100%; BORDER-TOP: 0px; BORDER-RIGHT: #e0e0e0 1px solid
    +}
    +.date_list TABLE THEAD {
    +	BACKGROUND: #efefef
    +}
    +.date_list TABLE TH {
    +	BORDER-BOTTOM: #e0e0e0 1px solid; TEXT-ALIGN: center; LINE-HEIGHT: 26px; HEIGHT: 26px; COLOR: #7e7e7e; FONT-WEIGHT: normal
    +}
    +.date_list TABLE TD {
    +	BORDER-BOTTOM: #e0e0e0 1px solid; TEXT-ALIGN: center; BORDER-LEFT: #e0e0e0 1px solid; PADDING-BOTTOM: 0px; LINE-HEIGHT: 30px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; HEIGHT: 30px; BORDER-TOP: #e0e0e0 1px solid; BORDER-RIGHT: #e0e0e0 1px solid; PADDING-TOP: 0px; text-shadow: 0 0 1px rgba(255, 255, 255, 0.7)
    +}
    +.date_list TABLE TD A {
    +	LINE-HEIGHT: 30px; DISPLAY: block
    +}
    +.date_list TABLE .dis A {
    +	COLOR: #c3c3c3
    +}
    +.date_list TABLE .current A {
    +	COLOR: #ff7148; FONT-WEIGHT: bold
    +}
    +.date_list TABLE .here A {
    +	BACKGROUND: #5ea4e5; COLOR: #fff; box-shadow: 0 0 6px rgba(0, 0, 0, 0.3) inset
    +}
    +.join_confirm {
    +	TEXT-ALIGN: center; PADDING-BOTTOM: 15px; MARGIN-TOP: -10px
    +}
    +.join_confirm .btn_strong {
    +	MARGIN: 10px auto 0px; WIDTH: 230px
    +}
    +.join_chips LI {
    +	PADDING-LEFT: 60px
    +}
    +.join_chips LI EM {
    +	TEXT-ALIGN: right; WIDTH: 55px; MARGIN-LEFT: -60px
    +}
    +.join_chips .gray {
    +	LINE-HEIGHT: normal; MARGIN-BOTTOM: 0px; COLOR: #9a9a9a; FONT-SIZE: 12px
    +}
    +.join_chips LI .hot {
    +	FONT-SIZE: 16px
    +}
    +.act_rule {
    +	MARGIN-TOP: -10px
    +}
    +.act_rule DT {
    +	PADDING-BOTTOM: 5px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; COLOR: #252e32; FONT-SIZE: 14px; FONT-WEIGHT: 700; PADDING-TOP: 10px
    +}
    +.act_rule DD {
    +	BORDER-BOTTOM: #e2e1e0 1px solid; PADDING-BOTTOM: 10px; LINE-HEIGHT: 21px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 0px
    +}
    +.result {
    +	TEXT-ALIGN: center; PADDING-BOTTOM: 25px; PADDING-LEFT: 25px; PADDING-RIGHT: 25px; PADDING-TOP: 25px
    +}
    +.result H4 {
    +	MARGIN-BOTTOM: 10px; COLOR: #77c15e; FONT-SIZE: 18px
    +}
    +.result .btn_strong {
    +	MARGIN-TOP: 10px
    +}
    +.fail {
    +	FONT-SIZE: 15px; PADDING-TOP: 100px
    +}
    +.rule_title {
    +	POSITION: relative; TEXT-ALIGN: center; BACKGROUND-COLOR: #fbfbfb; HEIGHT: 42px; -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.6) inset, 0 1px 3px rgba(0, 0, 0, 0.3)
    +}
    +.rule_title H3 {
    +	LINE-HEIGHT: 42px; FONT-SIZE: 17px
    +}
    +.btn_back {
    +	POSITION: absolute; WIDTH: 28px; DISPLAY: block; BACKGROUND: url(../images/sprite.png) no-repeat -110px -300px; HEIGHT: 28px; TOP: 7px; LEFT: 15px; -webkit-background-size: 160px auto
    +}
    +.btn_back SPAN {
    +	DISPLAY: none
    +}
    +.rule_list {
    +	PADDING-BOTTOM: 20px; PADDING-LEFT: 15px; PADDING-RIGHT: 15px; PADDING-TOP: 20px
    +}
    +.rule_list LI {
    +	MARGIN-BOTTOM: 15px; FONT-SIZE: 13px
    +}
    +.coming {
    +	WIDTH: 100%; BACKGROUND: url(../images/coming.jpg) #f5f4f2 no-repeat 50% 50%; HEIGHT: 100%; -webkit-background-size: 320px auto
    +}
    +.coming P {
    +	DISPLAY: none
    +}
    +.picwrap {
    +	WIDTH: 100%; OVERFLOW: hidden; -webkit-overflow-scrolling: touch
    +}
    +.picwrap IMG {
    +	DISPLAY: table-cell; BACKGROUND: url(data:image/gif;base64,R0lGODlhgACAAKIAAP///93d3bu7u5mZmQAA/wAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBQAEACwCAAIAfAB8AAAD/0i63P4wygYqmDjrzbtflvWNZGliYXiubKuloivPLlzReD7al+7/Eh5wSFQIi8hHYBkwHUmD6CD5YTJLz49USuVYraRsZ7vtar7XnQ1Kjpoz6LRHvGlz35O4nEPP2O94EnpNc2sef1OBGIOFMId/inB6jSmPdpGScR19EoiYmZobnBCIiZ95k6KGGp6ni4wvqxilrqBfqo6skLW2YBmjDa28r6Eosp27w8Rov8ekycqoqUHODrTRvXsQwArC2NLF29UM19/LtxO5yJd4Au4CK7DUNxPebG4e7+8n8iv2WmQ66BtoYpo/dvfacBjIkITBE9DGlMvAsOIIZjIUAixliv9ixYZVtLUos5GjwI8gzc3iCGghypQqrbFsme8lwZgLZtIcYfNmTJ34WPTUZw5oRxdD9w0z6iOpO15MgTh1BTTJUKos39jE+o/KS64IFVmsFfYT0aU7capdy7at27dw48qdS7eu3bt480I02vUbX2F/JxYNDImw4GiGE/P9qbhxVpWOI/eFKtlNZbWXuzlmG1mv58+gQ4seTbq06dOoU6vGQZJy0FNlMcV+czhQ7SQmYd8eMhPs5BxVdfcGEtV3buDBXQ+fURxx8oM6MT9P+Fh6dOrH2zavc13u9JXVJb520Vp8dvC76wXMuN5Sepm/1WtkEZHDefnzR9Qvsd9+/wi8+en3X0ntYVcSdAE+UN4zs7ln24CaLagghIxBaGF8kFGoIYV+Ybghh841GIyI5ICIFoklJsigihmimJOLEbLYIYwxSgigiZ+8l2KB+Ml4oo/w8dijjcrouCORKwIpnJIjMnkkksalNeR4fuBIm5UEYImhIlsGCeWNNJphpJdSTlkml1jWeOY6TnaRpppUctcmFW9mGSaZceYopH9zkjnjUe59iR5pdapWaGqHopboaYua1qije67GJ6CuJAAAIfkEBQUABAAsCgACAFcAMAAAA/9Iutz+ML5Ag7w46z0r5WAoSp43nihXVmnrdusrv+s332dt4Tyo9yOBUJD6oQBIQGs4RBlHySSKyczVTtHoidocPUNZaZAr9F5FYbGI3PWdQWn1mi36buLKFJvojsHjLnshdhl4L4IqbxqGh4gahBJ4eY1kiX6LgDN7fBmQEJI4jhieD4yhdJ2KkZk8oiSqEaatqBekDLKztBG2CqBACq4wJRi4PZu1sA2+v8C6EJexrBAD1AOBzsLE0g/V1UvYR9sN3eR6lTLi4+TlY1wz6Qzr8u1t6FkY8vNzZTxaGfn6mAkEGFDgL4LrDDJDyE4hEIbdHB6ESE1iD4oVLfLAqPETIsOODwmCDJlv5MSGJklaS6khAQAh+QQFBQAEACwfAAIAVwAwAAAD/0i63P5LSAGrvTjrNuf+YKh1nWieIumhbFupkivPBEzR+GnnfLj3ooFwwPqdAshAazhEGUXJJIrJ1MGOUamJ2jQ9QVltkCv0XqFh5IncBX01afGYnDqD40u2z76JK/N0bnxweC5sRB9vF34zh4gjg4uMjXobihWTlJUZlw9+fzSHlpGYhTminKSepqebF50NmTyor6qxrLO0L7YLn0ALuhCwCrJAjrUqkrjGrsIkGMW/BMEPJcphLgDaABjUKNEh29vdgTLLIOLpF80s5xrp8ORVONgi8PcZ8zlRJvf40tL8/QPYQ+BAgjgMxkPIQ6E6hgkdjoNIQ+JEijMsasNY0RQix4gKP+YIKXKkwJIFF6JMudFEAgAh+QQFBQAEACw8AAIAQgBCAAAD/kg0PPowykmrna3dzXvNmSeOFqiRaGoyaTuujitv8Gx/661HtSv8gt2jlwIChYtc0XjcEUnMpu4pikpv1I71astytkGh9wJGJk3QrXlcKa+VWjeSPZHP4Rtw+I2OW81DeBZ2fCB+UYCBfWRqiQp0CnqOj4J1jZOQkpOUIYx/m4oxg5cuAaYBO4Qop6c6pKusrDevIrG2rkwptrupXB67vKAbwMHCFcTFxhLIt8oUzLHOE9Cy0hHUrdbX2KjaENzey9Dh08jkz8Tnx83q66bt8PHy8/T19vf4+fr6AP3+/wADAjQmsKDBf6AOKjS4aaHDgZMeSgTQcKLDhBYPEswoA1BBAgAh+QQFBQAEACxOAAoAMABXAAAD7Ei6vPOjyUkrhdDqfXHm4OZ9YSmNpKmiqVqykbuysgvX5o2HcLxzup8oKLQQix0UcqhcVo5ORi+aHFEn02sDeuWqBGCBkbYLh5/NmnldxajX7LbPBK+PH7K6narfO/t+SIBwfINmUYaHf4lghYyOhlqJWgqDlAuAlwyBmpVnnaChoqOkpaanqKmqKgGtrq+wsbA1srW2ry63urasu764Jr/CAb3Du7nGt7TJsqvOz9DR0tPU1TIA2ACl2dyi3N/aneDf4uPklObj6OngWuzt7u/d8fLY9PXr9eFX+vv8+PnYlUsXiqC3c6PmUUgAACH5BAUFAAQALE4AHwAwAFcAAAPpSLrc/m7IAau9bU7MO9GgJ0ZgOI5leoqpumKt+1axPJO1dtO5vuM9yi8TlAyBvSMxqES2mo8cFFKb8kzWqzDL7Xq/4LB4TC6bz1yBes1uu9uzt3zOXtHv8xN+Dx/x/wJ6gHt2g3Rxhm9oi4yNjo+QkZKTCgGWAWaXmmOanZhgnp2goaJdpKGmp55cqqusrZuvsJays6mzn1m4uRAAvgAvuBW/v8GwvcTFxqfIycA3zA/OytCl0tPPO7HD2GLYvt7dYd/ZX99j5+Pi6tPh6+bvXuTuzujxXens9fr7YPn+7egRI9PPHrgpCQAAIfkEBQUABAAsPAA8AEIAQgAAA/lIutz+UI1Jq7026h2x/xUncmD5jehjrlnqSmz8vrE8u7V5z/m5/8CgcEgsGo/IpHLJbDqf0Kh0ShBYBdTXdZsdbb/Yrgb8FUfIYLMDTVYz2G13FV6Wz+lX+x0fdvPzdn9WeoJGAYcBN39EiIiKeEONjTt0kZKHQGyWl4mZdREAoQAcnJhBXBqioqSlT6qqG6WmTK+rsa1NtaGsuEu6o7yXubojsrTEIsa+yMm9SL8osp3PzM2cStDRykfZ2tfUtS/bRd3ewtzV5pLo4eLjQuUp70Hx8t9E9eqO5Oku5/ztdkxi90qPg3x2EMpR6IahGocPCxp8AGtigwQAIfkEBQUABAAsHwBOAFcAMAAAA/9Iutz+MMo36pg4682J/V0ojs1nXmSqSqe5vrDXunEdzq2ta3i+/5DeCUh0CGnF5BGULC4tTeUTFQVONYAs4CfoCkZPjFar83rBx8l4XDObSUL1Ott2d1U4yZwcs5/xSBB7dBMBhgEYfncrTBGDW4WHhomKUY+QEZKSE4qLRY8YmoeUfkmXoaKInJ2fgxmpqqulQKCvqRqsP7WooriVO7u8mhu5NacasMTFMMHCm8qzzM2RvdDRK9PUwxzLKdnaz9y/Kt8SyR3dIuXmtyHpHMcd5+jvWK4i8/TXHff47SLjQvQLkU+fG29rUhQ06IkEG4X/Rryp4mwUxSgLL/7IqFETB8eONT6ChCFy5ItqJomES6kgAQAh+QQFBQAEACwKAE4AVwAwAAAD/0i63A4QuEmrvTi3yLX/4MeNUmieITmibEuppCu3sDrfYG3jPKbHveDktxIaF8TOcZmMLI9NyBPanFKJp4A2IBx4B5lkdqvtfb8+HYpMxp3Pl1qLvXW/vWkli16/3dFxTi58ZRcChwIYf3hWBIRchoiHiotWj5AVkpIXi4xLjxiaiJR/T5ehoomcnZ+EGamqq6VGoK+pGqxCtaiiuJVBu7yaHrk4pxqwxMUzwcKbyrPMzZG90NGDrh/JH8t72dq3IN1jfCHb3L/e5ebh4ukmxyDn6O8g08jt7tf26ybz+m/W9GNXzUQ9fm1Q/APoSWAhhfkMAmpEbRhFKwsvCsmosRIHx444PoKcIXKkjIImjTzjkQAAIfkEBQUABAAsAgA8AEIAQgAAA/VIBNz+8KlJq72Yxs1d/uDVjVxogmQqnaylvkArT7A63/V47/m2/8CgcEgsGo/IpHLJbDqf0Kh0Sj0FroGqDMvVmrjgrDcTBo8v5fCZki6vCW33Oq4+0832O/at3+f7fICBdzsChgJGeoWHhkV0P4yMRG1BkYeOeECWl5hXQ5uNIAOjA1KgiKKko1CnqBmqqk+nIbCkTq20taVNs7m1vKAnurtLvb6wTMbHsUq4wrrFwSzDzcrLtknW16tI2tvERt6pv0fi48jh5h/U6Zs77EXSN/BE8jP09ZFA+PmhP/xvJgAMSGBgQINvEK5ReIZhQ3QEMTBLAAAh+QQFBQAEACwCAB8AMABXAAAD50i6DA4syklre87qTbHn4OaNYSmNqKmiqVqyrcvBsazRpH3jmC7yD98OCBF2iEXjBKmsAJsWHDQKmw571l8my+16v+CweEwum8+hgHrNbrvbtrd8znbR73MVfg838f8BeoB7doN0cYZvaIuMjY6PkJGSk2gClgJml5pjmp2YYJ6dX6GeXaShWaeoVqqlU62ir7CXqbOWrLafsrNctjIDwAMWvC7BwRWtNsbGFKc+y8fNsTrQ0dK3QtXAYtrCYd3eYN3c49/a5NVj5eLn5u3s6e7x8NDo9fbL+Mzy9/T5+tvUzdN3Zp+GBAAh+QQJBQAEACwCAAIAfAB8AAAD/0i63P4wykmrvTjrzbv/YCiOZGmeaKqubOu+cCzPdArcQK2TOL7/nl4PSMwIfcUk5YhUOh3M5nNKiOaoWCuWqt1Ou16l9RpOgsvEMdocXbOZ7nQ7DjzTaeq7zq6P5fszfIASAYUBIYKDDoaGIImKC4ySH3OQEJKYHZWWi5iZG0ecEZ6eHEOio6SfqCaqpaytrpOwJLKztCO2jLi1uoW8Ir6/wCHCxMG2x7muysukzb230M6H09bX2Nna29zd3t/g4cAC5OXm5+jn3Ons7eba7vHt2fL16tj2+QL0+vXw/e7WAUwnrqDBgwgTKlzIsKHDh2gGSBwAccHEixAvaqTYcFCjRoYeNyoM6REhyZIHT4o0qPIjy5YTTcKUmHImx5cwE85cmJPnSYckK66sSAAj0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gwxZJAAA7) no-repeat 50% 45%; FLOAT: left; VERTICAL-ALIGN: middle; border-radius: 5px; background-size: 30px 30px
    +}
    +.type_full .btn_down {
    +	DISPLAY: none
    +}
    +.type_full .btn_zoom_out {
    +	DISPLAY: none
    +}
    +.type_full .btn_zoom_in {
    +	DISPLAY: none
    +}
    +.btn_control {
    +	TEXT-ALIGN: center; PADDING-BOTTOM: 15px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: #e2e1e0 1px solid; PADDING-TOP: 10px
    +}
    +.btn_control .btn_strong {
    +	MARGIN-TOP: 10px; WIDTH: 240px
    +}
    +.btn_control .btn_off {
    +	MARGIN-TOP: 10px; WIDTH: 240px
    +}
    +.btn_control P A {
    +	COLOR: #4dbfaf
    +}
    +.tips_out {
    +	TEXT-ALIGN: center; PADDING-BOTTOM: 25px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 25px
    +}
    +.btn_out {
    +	PADDING-BOTTOM: 5px; BACKGROUND-COLOR: #e1e1e1; PADDING-LEFT: 15px; PADDING-RIGHT: 15px; COLOR: #f3f2f1; FONT-SIZE: 15px; FONT-WEIGHT: 700; PADDING-TOP: 5px; border-radius: 15px; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.3)
    +}
    +.tips_out .gray {
    +	COLOR: #d7d7d7; FONT-SIZE: 18px
    +}
    +.my_list {
    +	MARGIN-TOP: -10px
    +}
    +.my_detail {
    +	MARGIN-TOP: -10px
    +}
    +.my_list LI {
    +	BORDER-BOTTOM: #e2e1e0 1px solid
    +}
    +.my_list LI A {
    +	POSITION: relative; PADDING-BOTTOM: 0px; PADDING-LEFT: 10px; TEXT-OVERFLOW: ellipsis; PADDING-RIGHT: 30px; DISPLAY: block; WHITE-SPACE: nowrap; HEIGHT: 52px; COLOR: #333; FONT-SIZE: 14px; OVERFLOW: hidden; PADDING-TOP: 10px
    +}
    +.my_list LI A EM {
    +	DISPLAY: block; COLOR: #5b5b5b; FONT-SIZE: 12px
    +}
    +.my_detail LI {
    +	BORDER-BOTTOM: #e2e1e0 1px solid; PADDING-BOTTOM: 10px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; COLOR: #333; PADDING-TOP: 10px
    +}
    +.my_detail LI .hot {
    +	FONT-SIZE: 15px
    +}
    +.my_detail LI .gray {
    +	COLOR: #999
    +}
    +.my_detail LI P {
    +	LINE-HEIGHT: 21px
    +}
    +.my_detail .comment_time {
    +	PADDING-TOP: 5px
    +}
    +.my_detail .comment_time A {
    +	FLOAT: right
    +}
    +.act_control {
    +	POSITION: fixed; TEXT-ALIGN: center; PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #fff; PADDING-LEFT: 0px; WIDTH: 100%; BOTTOM: 0px; PADDING-RIGHT: 0px; COLOR: #fff; PADDING-TOP: 10px; LEFT: 0px; -webkit-box-shadow: 0 -2px 2px rgba(0, 0, 0, 0.3)
    +}
    +.act_control .btn_strong {
    +	MARGIN: 0px auto; WIDTH: 240px; DISPLAY: block
    +}
    +.photo_area {
    +	BACKGROUND-COLOR: #1d3357; WIDTH: 100%; OVERFLOW: hidden
    +}
    +.photo_show {
    +	POSITION: relative; MIN-WIDTH: 320px; TEXT-ALIGN: center; MARGIN: 0px auto; MAX-WIDTH: 720px; COLOR: #fff
    +}
    +.photo_show IMG {
    +	DISPLAY: block
    +}
    +.photo_title {
    +	POSITION: absolute; TEXT-ALIGN: left; PADDING-BOTTOM: 15px; PADDING-LEFT: 10px; WIDTH: 120px; PADDING-RIGHT: 10px; HEIGHT: 170px; TOP: 0px; PADDING-TOP: 15px; LEFT: 0px
    +}
    +.photo_title H3 {
    +	TEXT-OVERFLOW: ellipsis; WHITE-SPACE: nowrap; FONT-SIZE: 20px; OVERFLOW: hidden; FONT-WEIGHT: normal
    +}
    +.photo_title P {
    +	HEIGHT: 36px; FONT-SIZE: 13px; OVERFLOW: hidden
    +}
    +.praise {
    +	POSITION: absolute; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; DISPLAY: block; HEIGHT: 20px; COLOR: #fff; TOP: 10px; RIGHT: 10px; PADDING-TOP: 0px; border-radius: 10px
    +}
    +.ico_praise {
    +	MARGIN: 0px 2px 0px 0px; WIDTH: 18px; DISPLAY: inline-block; BACKGROUND: url(../images/act.png) no-repeat -25px -25px; HEIGHT: 18px; VERTICAL-ALIGN: text-bottom; -webkit-background-size: 100px auto
    +}
    +.praise_on .ico_praise {
    +	BACKGROUND: url(../images/act.png) no-repeat 0px -25px; -webkit-background-size: 100px auto
    +}
    +.box_list LI {
    +	BORDER-BOTTOM: #e9e9eb 1px solid; POSITION: relative; PADDING-BOTTOM: 10px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px
    +}
    +.box_list LI:after {
    +	DISPLAY: block; HEIGHT: 0px; VISIBILITY: hidden; CLEAR: both; CONTENT: "\0020"
    +}
    +.box_list LI IMG {
    +	FLOAT: left; MARGIN-RIGHT: 10px
    +}
    +.box_list LI H4 {
    +	TEXT-OVERFLOW: ellipsis; PADDING-RIGHT: 50px; WHITE-SPACE: nowrap; FONT-SIZE: 14px; OVERFLOW: hidden
    +}
    +.box_list LI .name {
    +	TEXT-OVERFLOW: ellipsis; PADDING-RIGHT: 50px; WHITE-SPACE: nowrap; COLOR: #5e5e5e; OVERFLOW: hidden
    +}
    +.box_list LI EM {
    +	POSITION: absolute; WIDTH: 4em; COLOR: #999; FONT-SIZE: 12px; TOP: 30px; RIGHT: 10px
    +}
    +.box_list LI.end {
    +	opacity: .6
    +}
    +.box_list LI.end A {
    +	CURSOR: default
    +}
    +.ico_hot {
    +	WIDTH: 26px; DISPLAY: inline-block; BACKGROUND: url(../images/act.png) no-repeat; HEIGHT: 13px; MARGIN-LEFT: 3px; -webkit-background-size: 100px auto
    +}
    +.submit_comment {
    +	BORDER-BOTTOM: #e2e1e0 1px solid; POSITION: relative; PADDING-BOTTOM: 10px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; MARGIN-BOTTOM: 10px; PADDING-TOP: 0px
    +}
    +.submit_comment TEXTAREA {
    +	BORDER-BOTTOM: #bfbfbf 1px solid; BORDER-LEFT: #bfbfbf 1px solid; PADDING-BOTTOM: 8px; PADDING-LEFT: 5px; PADDING-RIGHT: 0px; DISPLAY: block; FONT-SIZE: 15px; BORDER-TOP: #bfbfbf 1px solid; MARGIN-RIGHT: 10px; BORDER-RIGHT: #bfbfbf 1px solid; PADDING-TOP: 8px; border-radius: 3px; -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3) inset; -webkit-box-flex: 1
    +}
    +.ico_error {
    +	WIDTH: 40px; DISPLAY: inline-block; BACKGROUND: url(../images/act.png) no-repeat -75px -25px; HEIGHT: 40px; -webkit-background-size: 100px auto
    +}
    +.submit_comment .ico_error {
    +	POSITION: absolute; TOP: 0px; RIGHT: 70px
    +}
    +#videoDiv {
    +	MARGIN: 0px auto
    +}
    +#videoDiv_logo {
    +	DISPLAY: none
    +}
    +.form-control {
    +	BACKGROUND-IMAGE: none; BORDER-BOTTOM: #d5d5d5 1px solid; BORDER-LEFT: #d5d5d5 1px solid; PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.4285; BACKGROUND-COLOR: #ffffff; PADDING-LEFT: 6px; WIDTH: 100%; PADDING-RIGHT: 6px; DISPLAY: block; MARGIN-BOTTOM: 8px; HEIGHT: 31px; COLOR: #646464; MARGIN-LEFT: -6px; FONT-SIZE: 12px; VERTICAL-ALIGN: middle; BORDER-TOP: #d5d5d5 1px solid; MARGIN-RIGHT: -6px; BORDER-RIGHT: #d5d5d5 1px solid; PADDING-TOP: 0px; border-radius: 5px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s
    +}
    +.form-control:focus {
    +	BORDER-BOTTOM-COLOR: #66afe9; BORDER-TOP-COLOR: #66afe9; OUTLINE-STYLE: none; OUTLINE-COLOR: invert; OUTLINE-WIDTH: 0px; BORDER-RIGHT-COLOR: #66afe9; BORDER-LEFT-COLOR: #66afe9; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6)
    +}
    +SELECT.form-control {
    +	PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; WIDTH: 103%; PADDING-RIGHT: 0px; PADDING-TOP: 0px
    +}
    +.btn_wrap {
    +	TEXT-ALIGN: center; MARGIN-TOP: 12px; MARGIN-BOTTOM: 24px
    +}
    +.btn_wrap BUTTON {
    +	PADDING-BOTTOM: 0px; PADDING-LEFT: 24px; PADDING-RIGHT: 24px; CURSOR: pointer; PADDING-TOP: 0px
    +}
    +.order_wrap {
    +	PADDING-BOTTOM: 10px; PADDING-LEFT: 18px; PADDING-RIGHT: 18px; PADDING-TOP: 0px
    +}
    +.calc_result {
    +	PADDING-BOTTOM: 24px
    +}
    +.calc_result TABLE {
    +	TEXT-ALIGN: center; BORDER-COLLAPSE: collapse
    +}
    +.calc_result TABLE TD {
    +	BORDER-BOTTOM: #999999 1px solid; LINE-HEIGHT: 2
    +}
    diff --git a/src/main/webapp/plug-in/jmobile/js/jquery-ui.js b/src/main/webapp/plug-in/jmobile/js/jquery-ui.js
    new file mode 100644
    index 00000000..5945b000
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jmobile/js/jquery-ui.js
    @@ -0,0 +1,14912 @@
    +/*! jQuery UI - v1.9.2 - 2012-11-23
    +* http://jqueryui.com
    +* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.effect.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js
    +* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */
    +
    +(function( $, undefined ) {
    +
    +var uuid = 0,
    +	runiqueId = /^ui-id-\d+$/;
    +
    +// prevent duplicate loading
    +// this is only a problem because we proxy existing functions
    +// and we don't want to double proxy them
    +$.ui = $.ui || {};
    +if ( $.ui.version ) {
    +	return;
    +}
    +
    +$.extend( $.ui, {
    +	version: "1.9.2",
    +
    +	keyCode: {
    +		BACKSPACE: 8,
    +		COMMA: 188,
    +		DELETE: 46,
    +		DOWN: 40,
    +		END: 35,
    +		ENTER: 13,
    +		ESCAPE: 27,
    +		HOME: 36,
    +		LEFT: 37,
    +		NUMPAD_ADD: 107,
    +		NUMPAD_DECIMAL: 110,
    +		NUMPAD_DIVIDE: 111,
    +		NUMPAD_ENTER: 108,
    +		NUMPAD_MULTIPLY: 106,
    +		NUMPAD_SUBTRACT: 109,
    +		PAGE_DOWN: 34,
    +		PAGE_UP: 33,
    +		PERIOD: 190,
    +		RIGHT: 39,
    +		SPACE: 32,
    +		TAB: 9,
    +		UP: 38
    +	}
    +});
    +
    +// plugins
    +$.fn.extend({
    +	_focus: $.fn.focus,
    +	focus: function( delay, fn ) {
    +		return typeof delay === "number" ?
    +			this.each(function() {
    +				var elem = this;
    +				setTimeout(function() {
    +					$( elem ).focus();
    +					if ( fn ) {
    +						fn.call( elem );
    +					}
    +				}, delay );
    +			}) :
    +			this._focus.apply( this, arguments );
    +	},
    +
    +	scrollParent: function() {
    +		var scrollParent;
    +		if (($.ui.ie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
    +			scrollParent = this.parents().filter(function() {
    +				return (/(relative|absolute|fixed)/).test($.css(this,'position')) && (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
    +			}).eq(0);
    +		} else {
    +			scrollParent = this.parents().filter(function() {
    +				return (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
    +			}).eq(0);
    +		}
    +
    +		return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
    +	},
    +
    +	zIndex: function( zIndex ) {
    +		if ( zIndex !== undefined ) {
    +			return this.css( "zIndex", zIndex );
    +		}
    +
    +		if ( this.length ) {
    +			var elem = $( this[ 0 ] ), position, value;
    +			while ( elem.length && elem[ 0 ] !== document ) {
    +				// Ignore z-index if position is set to a value where z-index is ignored by the browser
    +				// This makes behavior of this function consistent across browsers
    +				// WebKit always returns auto if the element is positioned
    +				position = elem.css( "position" );
    +				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
    +					// IE returns 0 when zIndex is not specified
    +					// other browsers return a string
    +					// we ignore the case of nested elements with an explicit value of 0
    +					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
    +					value = parseInt( elem.css( "zIndex" ), 10 );
    +					if ( !isNaN( value ) && value !== 0 ) {
    +						return value;
    +					}
    +				}
    +				elem = elem.parent();
    +			}
    +		}
    +
    +		return 0;
    +	},
    +
    +	uniqueId: function() {
    +		return this.each(function() {
    +			if ( !this.id ) {
    +				this.id = "ui-id-" + (++uuid);
    +			}
    +		});
    +	},
    +
    +	removeUniqueId: function() {
    +		return this.each(function() {
    +			if ( runiqueId.test( this.id ) ) {
    +				$( this ).removeAttr( "id" );
    +			}
    +		});
    +	}
    +});
    +
    +// selectors
    +function focusable( element, isTabIndexNotNaN ) {
    +	var map, mapName, img,
    +		nodeName = element.nodeName.toLowerCase();
    +	if ( "area" === nodeName ) {
    +		map = element.parentNode;
    +		mapName = map.name;
    +		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
    +			return false;
    +		}
    +		img = $( "img[usemap=#" + mapName + "]" )[0];
    +		return !!img && visible( img );
    +	}
    +	return ( /input|select|textarea|button|object/.test( nodeName ) ?
    +		!element.disabled :
    +		"a" === nodeName ?
    +			element.href || isTabIndexNotNaN :
    +			isTabIndexNotNaN) &&
    +		// the element and all of its ancestors must be visible
    +		visible( element );
    +}
    +
    +function visible( element ) {
    +	return $.expr.filters.visible( element ) &&
    +		!$( element ).parents().andSelf().filter(function() {
    +			return $.css( this, "visibility" ) === "hidden";
    +		}).length;
    +}
    +
    +$.extend( $.expr[ ":" ], {
    +	data: $.expr.createPseudo ?
    +		$.expr.createPseudo(function( dataName ) {
    +			return function( elem ) {
    +				return !!$.data( elem, dataName );
    +			};
    +		}) :
    +		// support: jQuery <1.8
    +		function( elem, i, match ) {
    +			return !!$.data( elem, match[ 3 ] );
    +		},
    +
    +	focusable: function( element ) {
    +		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
    +	},
    +
    +	tabbable: function( element ) {
    +		var tabIndex = $.attr( element, "tabindex" ),
    +			isTabIndexNaN = isNaN( tabIndex );
    +		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
    +	}
    +});
    +
    +// support
    +$(function() {
    +	var body = document.body,
    +		div = body.appendChild( div = document.createElement( "div" ) );
    +
    +	// access offsetHeight before setting the style to prevent a layout bug
    +	// in IE 9 which causes the element to continue to take up space even
    +	// after it is removed from the DOM (#8026)
    +	div.offsetHeight;
    +
    +	$.extend( div.style, {
    +		minHeight: "100px",
    +		height: "auto",
    +		padding: 0,
    +		borderWidth: 0
    +	});
    +
    +	$.support.minHeight = div.offsetHeight === 100;
    +	$.support.selectstart = "onselectstart" in div;
    +
    +	// set display to none to avoid a layout bug in IE
    +	// http://dev.jquery.com/ticket/4014
    +	body.removeChild( div ).style.display = "none";
    +});
    +
    +// support: jQuery <1.8
    +if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
    +	$.each( [ "Width", "Height" ], function( i, name ) {
    +		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
    +			type = name.toLowerCase(),
    +			orig = {
    +				innerWidth: $.fn.innerWidth,
    +				innerHeight: $.fn.innerHeight,
    +				outerWidth: $.fn.outerWidth,
    +				outerHeight: $.fn.outerHeight
    +			};
    +
    +		function reduce( elem, size, border, margin ) {
    +			$.each( side, function() {
    +				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
    +				if ( border ) {
    +					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
    +				}
    +				if ( margin ) {
    +					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
    +				}
    +			});
    +			return size;
    +		}
    +
    +		$.fn[ "inner" + name ] = function( size ) {
    +			if ( size === undefined ) {
    +				return orig[ "inner" + name ].call( this );
    +			}
    +
    +			return this.each(function() {
    +				$( this ).css( type, reduce( this, size ) + "px" );
    +			});
    +		};
    +
    +		$.fn[ "outer" + name] = function( size, margin ) {
    +			if ( typeof size !== "number" ) {
    +				return orig[ "outer" + name ].call( this, size );
    +			}
    +
    +			return this.each(function() {
    +				$( this).css( type, reduce( this, size, true, margin ) + "px" );
    +			});
    +		};
    +	});
    +}
    +
    +// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
    +if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
    +	$.fn.removeData = (function( removeData ) {
    +		return function( key ) {
    +			if ( arguments.length ) {
    +				return removeData.call( this, $.camelCase( key ) );
    +			} else {
    +				return removeData.call( this );
    +			}
    +		};
    +	})( $.fn.removeData );
    +}
    +
    +
    +
    +
    +
    +// deprecated
    +
    +(function() {
    +	var uaMatch = /msie ([\w.]+)/.exec( navigator.userAgent.toLowerCase() ) || [];
    +	$.ui.ie = uaMatch.length ? true : false;
    +	$.ui.ie6 = parseFloat( uaMatch[ 1 ], 10 ) === 6;
    +})();
    +
    +$.fn.extend({
    +	disableSelection: function() {
    +		return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
    +			".ui-disableSelection", function( event ) {
    +				event.preventDefault();
    +			});
    +	},
    +
    +	enableSelection: function() {
    +		return this.unbind( ".ui-disableSelection" );
    +	}
    +});
    +
    +$.extend( $.ui, {
    +	// $.ui.plugin is deprecated.  Use the proxy pattern instead.
    +	plugin: {
    +		add: function( module, option, set ) {
    +			var i,
    +				proto = $.ui[ module ].prototype;
    +			for ( i in set ) {
    +				proto.plugins[ i ] = proto.plugins[ i ] || [];
    +				proto.plugins[ i ].push( [ option, set[ i ] ] );
    +			}
    +		},
    +		call: function( instance, name, args ) {
    +			var i,
    +				set = instance.plugins[ name ];
    +			if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
    +				return;
    +			}
    +
    +			for ( i = 0; i < set.length; i++ ) {
    +				if ( instance.options[ set[ i ][ 0 ] ] ) {
    +					set[ i ][ 1 ].apply( instance.element, args );
    +				}
    +			}
    +		}
    +	},
    +
    +	contains: $.contains,
    +
    +	// only used by resizable
    +	hasScroll: function( el, a ) {
    +
    +		//If overflow is hidden, the element might have extra content, but the user wants to hide it
    +		if ( $( el ).css( "overflow" ) === "hidden") {
    +			return false;
    +		}
    +
    +		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
    +			has = false;
    +
    +		if ( el[ scroll ] > 0 ) {
    +			return true;
    +		}
    +
    +		// TODO: determine which cases actually cause this to happen
    +		// if the element doesn't have the scroll set, see if it's possible to
    +		// set the scroll
    +		el[ scroll ] = 1;
    +		has = ( el[ scroll ] > 0 );
    +		el[ scroll ] = 0;
    +		return has;
    +	},
    +
    +	// these are odd functions, fix the API or move into individual plugins
    +	isOverAxis: function( x, reference, size ) {
    +		//Determines when x coordinate is over "b" element axis
    +		return ( x > reference ) && ( x < ( reference + size ) );
    +	},
    +	isOver: function( y, x, top, left, height, width ) {
    +		//Determines when x, y coordinates is over "b" element
    +		return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
    +	}
    +});
    +
    +})( jQuery );
    +
    +(function( $, undefined ) {
    +
    +var uuid = 0,
    +	slice = Array.prototype.slice,
    +	_cleanData = $.cleanData;
    +$.cleanData = function( elems ) {
    +	for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
    +		try {
    +			$( elem ).triggerHandler( "remove" );
    +		// http://bugs.jquery.com/ticket/8235
    +		} catch( e ) {}
    +	}
    +	_cleanData( elems );
    +};
    +
    +$.widget = function( name, base, prototype ) {
    +	var fullName, existingConstructor, constructor, basePrototype,
    +		namespace = name.split( "." )[ 0 ];
    +
    +	name = name.split( "." )[ 1 ];
    +	fullName = namespace + "-" + name;
    +
    +	if ( !prototype ) {
    +		prototype = base;
    +		base = $.Widget;
    +	}
    +
    +	// create selector for plugin
    +	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
    +		return !!$.data( elem, fullName );
    +	};
    +
    +	$[ namespace ] = $[ namespace ] || {};
    +	existingConstructor = $[ namespace ][ name ];
    +	constructor = $[ namespace ][ name ] = function( options, element ) {
    +		// allow instantiation without "new" keyword
    +		if ( !this._createWidget ) {
    +			return new constructor( options, element );
    +		}
    +
    +		// allow instantiation without initializing for simple inheritance
    +		// must use "new" keyword (the code above always passes args)
    +		if ( arguments.length ) {
    +			this._createWidget( options, element );
    +		}
    +	};
    +	// extend with the existing constructor to carry over any static properties
    +	$.extend( constructor, existingConstructor, {
    +		version: prototype.version,
    +		// copy the object used to create the prototype in case we need to
    +		// redefine the widget later
    +		_proto: $.extend( {}, prototype ),
    +		// track widgets that inherit from this widget in case this widget is
    +		// redefined after a widget inherits from it
    +		_childConstructors: []
    +	});
    +
    +	basePrototype = new base();
    +	// we need to make the options hash a property directly on the new instance
    +	// otherwise we'll modify the options hash on the prototype that we're
    +	// inheriting from
    +	basePrototype.options = $.widget.extend( {}, basePrototype.options );
    +	$.each( prototype, function( prop, value ) {
    +		if ( $.isFunction( value ) ) {
    +			prototype[ prop ] = (function() {
    +				var _super = function() {
    +						return base.prototype[ prop ].apply( this, arguments );
    +					},
    +					_superApply = function( args ) {
    +						return base.prototype[ prop ].apply( this, args );
    +					};
    +				return function() {
    +					var __super = this._super,
    +						__superApply = this._superApply,
    +						returnValue;
    +
    +					this._super = _super;
    +					this._superApply = _superApply;
    +
    +					returnValue = value.apply( this, arguments );
    +
    +					this._super = __super;
    +					this._superApply = __superApply;
    +
    +					return returnValue;
    +				};
    +			})();
    +		}
    +	});
    +	constructor.prototype = $.widget.extend( basePrototype, {
    +		// TODO: remove support for widgetEventPrefix
    +		// always use the name + a colon as the prefix, e.g., draggable:start
    +		// don't prefix for widgets that aren't DOM-based
    +		widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
    +	}, prototype, {
    +		constructor: constructor,
    +		namespace: namespace,
    +		widgetName: name,
    +		// TODO remove widgetBaseClass, see #8155
    +		widgetBaseClass: fullName,
    +		widgetFullName: fullName
    +	});
    +
    +	// If this widget is being redefined then we need to find all widgets that
    +	// are inheriting from it and redefine all of them so that they inherit from
    +	// the new version of this widget. We're essentially trying to replace one
    +	// level in the prototype chain.
    +	if ( existingConstructor ) {
    +		$.each( existingConstructor._childConstructors, function( i, child ) {
    +			var childPrototype = child.prototype;
    +
    +			// redefine the child widget using the same prototype that was
    +			// originally used, but inherit from the new version of the base
    +			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
    +		});
    +		// remove the list of existing child constructors from the old constructor
    +		// so the old child constructors can be garbage collected
    +		delete existingConstructor._childConstructors;
    +	} else {
    +		base._childConstructors.push( constructor );
    +	}
    +
    +	$.widget.bridge( name, constructor );
    +};
    +
    +$.widget.extend = function( target ) {
    +	var input = slice.call( arguments, 1 ),
    +		inputIndex = 0,
    +		inputLength = input.length,
    +		key,
    +		value;
    +	for ( ; inputIndex < inputLength; inputIndex++ ) {
    +		for ( key in input[ inputIndex ] ) {
    +			value = input[ inputIndex ][ key ];
    +			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
    +				// Clone objects
    +				if ( $.isPlainObject( value ) ) {
    +					target[ key ] = $.isPlainObject( target[ key ] ) ?
    +						$.widget.extend( {}, target[ key ], value ) :
    +						// Don't extend strings, arrays, etc. with objects
    +						$.widget.extend( {}, value );
    +				// Copy everything else by reference
    +				} else {
    +					target[ key ] = value;
    +				}
    +			}
    +		}
    +	}
    +	return target;
    +};
    +
    +$.widget.bridge = function( name, object ) {
    +	var fullName = object.prototype.widgetFullName || name;
    +	$.fn[ name ] = function( options ) {
    +		var isMethodCall = typeof options === "string",
    +			args = slice.call( arguments, 1 ),
    +			returnValue = this;
    +
    +		// allow multiple hashes to be passed on init
    +		options = !isMethodCall && args.length ?
    +			$.widget.extend.apply( null, [ options ].concat(args) ) :
    +			options;
    +
    +		if ( isMethodCall ) {
    +			this.each(function() {
    +				var methodValue,
    +					instance = $.data( this, fullName );
    +				if ( !instance ) {
    +					return $.error( "cannot call methods on " + name + " prior to initialization; " +
    +						"attempted to call method '" + options + "'" );
    +				}
    +				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
    +					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
    +				}
    +				methodValue = instance[ options ].apply( instance, args );
    +				if ( methodValue !== instance && methodValue !== undefined ) {
    +					returnValue = methodValue && methodValue.jquery ?
    +						returnValue.pushStack( methodValue.get() ) :
    +						methodValue;
    +					return false;
    +				}
    +			});
    +		} else {
    +			this.each(function() {
    +				var instance = $.data( this, fullName );
    +				if ( instance ) {
    +					instance.option( options || {} )._init();
    +				} else {
    +					$.data( this, fullName, new object( options, this ) );
    +				}
    +			});
    +		}
    +
    +		return returnValue;
    +	};
    +};
    +
    +$.Widget = function( /* options, element */ ) {};
    +$.Widget._childConstructors = [];
    +
    +$.Widget.prototype = {
    +	widgetName: "widget",
    +	widgetEventPrefix: "",
    +	defaultElement: "<div>",
    +	options: {
    +		disabled: false,
    +
    +		// callbacks
    +		create: null
    +	},
    +	_createWidget: function( options, element ) {
    +		element = $( element || this.defaultElement || this )[ 0 ];
    +		this.element = $( element );
    +		this.uuid = uuid++;
    +		this.eventNamespace = "." + this.widgetName + this.uuid;
    +		this.options = $.widget.extend( {},
    +			this.options,
    +			this._getCreateOptions(),
    +			options );
    +
    +		this.bindings = $();
    +		this.hoverable = $();
    +		this.focusable = $();
    +
    +		if ( element !== this ) {
    +			// 1.9 BC for #7810
    +			// TODO remove dual storage
    +			$.data( element, this.widgetName, this );
    +			$.data( element, this.widgetFullName, this );
    +			this._on( true, this.element, {
    +				remove: function( event ) {
    +					if ( event.target === element ) {
    +						this.destroy();
    +					}
    +				}
    +			});
    +			this.document = $( element.style ?
    +				// element within the document
    +				element.ownerDocument :
    +				// element is window or document
    +				element.document || element );
    +			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
    +		}
    +
    +		this._create();
    +		this._trigger( "create", null, this._getCreateEventData() );
    +		this._init();
    +	},
    +	_getCreateOptions: $.noop,
    +	_getCreateEventData: $.noop,
    +	_create: $.noop,
    +	_init: $.noop,
    +
    +	destroy: function() {
    +		this._destroy();
    +		// we can probably remove the unbind calls in 2.0
    +		// all event bindings should go through this._on()
    +		this.element
    +			.unbind( this.eventNamespace )
    +			// 1.9 BC for #7810
    +			// TODO remove dual storage
    +			.removeData( this.widgetName )
    +			.removeData( this.widgetFullName )
    +			// support: jquery <1.6.3
    +			// http://bugs.jquery.com/ticket/9413
    +			.removeData( $.camelCase( this.widgetFullName ) );
    +		this.widget()
    +			.unbind( this.eventNamespace )
    +			.removeAttr( "aria-disabled" )
    +			.removeClass(
    +				this.widgetFullName + "-disabled " +
    +				"ui-state-disabled" );
    +
    +		// clean up events and states
    +		this.bindings.unbind( this.eventNamespace );
    +		this.hoverable.removeClass( "ui-state-hover" );
    +		this.focusable.removeClass( "ui-state-focus" );
    +	},
    +	_destroy: $.noop,
    +
    +	widget: function() {
    +		return this.element;
    +	},
    +
    +	option: function( key, value ) {
    +		var options = key,
    +			parts,
    +			curOption,
    +			i;
    +
    +		if ( arguments.length === 0 ) {
    +			// don't return a reference to the internal hash
    +			return $.widget.extend( {}, this.options );
    +		}
    +
    +		if ( typeof key === "string" ) {
    +			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
    +			options = {};
    +			parts = key.split( "." );
    +			key = parts.shift();
    +			if ( parts.length ) {
    +				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
    +				for ( i = 0; i < parts.length - 1; i++ ) {
    +					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
    +					curOption = curOption[ parts[ i ] ];
    +				}
    +				key = parts.pop();
    +				if ( value === undefined ) {
    +					return curOption[ key ] === undefined ? null : curOption[ key ];
    +				}
    +				curOption[ key ] = value;
    +			} else {
    +				if ( value === undefined ) {
    +					return this.options[ key ] === undefined ? null : this.options[ key ];
    +				}
    +				options[ key ] = value;
    +			}
    +		}
    +
    +		this._setOptions( options );
    +
    +		return this;
    +	},
    +	_setOptions: function( options ) {
    +		var key;
    +
    +		for ( key in options ) {
    +			this._setOption( key, options[ key ] );
    +		}
    +
    +		return this;
    +	},
    +	_setOption: function( key, value ) {
    +		this.options[ key ] = value;
    +
    +		if ( key === "disabled" ) {
    +			this.widget()
    +				.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
    +				.attr( "aria-disabled", value );
    +			this.hoverable.removeClass( "ui-state-hover" );
    +			this.focusable.removeClass( "ui-state-focus" );
    +		}
    +
    +		return this;
    +	},
    +
    +	enable: function() {
    +		return this._setOption( "disabled", false );
    +	},
    +	disable: function() {
    +		return this._setOption( "disabled", true );
    +	},
    +
    +	_on: function( suppressDisabledCheck, element, handlers ) {
    +		var delegateElement,
    +			instance = this;
    +
    +		// no suppressDisabledCheck flag, shuffle arguments
    +		if ( typeof suppressDisabledCheck !== "boolean" ) {
    +			handlers = element;
    +			element = suppressDisabledCheck;
    +			suppressDisabledCheck = false;
    +		}
    +
    +		// no element argument, shuffle and use this.element
    +		if ( !handlers ) {
    +			handlers = element;
    +			element = this.element;
    +			delegateElement = this.widget();
    +		} else {
    +			// accept selectors, DOM elements
    +			element = delegateElement = $( element );
    +			this.bindings = this.bindings.add( element );
    +		}
    +
    +		$.each( handlers, function( event, handler ) {
    +			function handlerProxy() {
    +				// allow widgets to customize the disabled handling
    +				// - disabled as an array instead of boolean
    +				// - disabled class as method for disabling individual parts
    +				if ( !suppressDisabledCheck &&
    +						( instance.options.disabled === true ||
    +							$( this ).hasClass( "ui-state-disabled" ) ) ) {
    +					return;
    +				}
    +				return ( typeof handler === "string" ? instance[ handler ] : handler )
    +					.apply( instance, arguments );
    +			}
    +
    +			// copy the guid so direct unbinding works
    +			if ( typeof handler !== "string" ) {
    +				handlerProxy.guid = handler.guid =
    +					handler.guid || handlerProxy.guid || $.guid++;
    +			}
    +
    +			var match = event.match( /^(\w+)\s*(.*)$/ ),
    +				eventName = match[1] + instance.eventNamespace,
    +				selector = match[2];
    +			if ( selector ) {
    +				delegateElement.delegate( selector, eventName, handlerProxy );
    +			} else {
    +				element.bind( eventName, handlerProxy );
    +			}
    +		});
    +	},
    +
    +	_off: function( element, eventName ) {
    +		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
    +		element.unbind( eventName ).undelegate( eventName );
    +	},
    +
    +	_delay: function( handler, delay ) {
    +		function handlerProxy() {
    +			return ( typeof handler === "string" ? instance[ handler ] : handler )
    +				.apply( instance, arguments );
    +		}
    +		var instance = this;
    +		return setTimeout( handlerProxy, delay || 0 );
    +	},
    +
    +	_hoverable: function( element ) {
    +		this.hoverable = this.hoverable.add( element );
    +		this._on( element, {
    +			mouseenter: function( event ) {
    +				$( event.currentTarget ).addClass( "ui-state-hover" );
    +			},
    +			mouseleave: function( event ) {
    +				$( event.currentTarget ).removeClass( "ui-state-hover" );
    +			}
    +		});
    +	},
    +
    +	_focusable: function( element ) {
    +		this.focusable = this.focusable.add( element );
    +		this._on( element, {
    +			focusin: function( event ) {
    +				$( event.currentTarget ).addClass( "ui-state-focus" );
    +			},
    +			focusout: function( event ) {
    +				$( event.currentTarget ).removeClass( "ui-state-focus" );
    +			}
    +		});
    +	},
    +
    +	_trigger: function( type, event, data ) {
    +		var prop, orig,
    +			callback = this.options[ type ];
    +
    +		data = data || {};
    +		event = $.Event( event );
    +		event.type = ( type === this.widgetEventPrefix ?
    +			type :
    +			this.widgetEventPrefix + type ).toLowerCase();
    +		// the original event may come from any element
    +		// so we need to reset the target on the new event
    +		event.target = this.element[ 0 ];
    +
    +		// copy original event properties over to the new event
    +		orig = event.originalEvent;
    +		if ( orig ) {
    +			for ( prop in orig ) {
    +				if ( !( prop in event ) ) {
    +					event[ prop ] = orig[ prop ];
    +				}
    +			}
    +		}
    +
    +		this.element.trigger( event, data );
    +		return !( $.isFunction( callback ) &&
    +			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
    +			event.isDefaultPrevented() );
    +	}
    +};
    +
    +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
    +	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
    +		if ( typeof options === "string" ) {
    +			options = { effect: options };
    +		}
    +		var hasOptions,
    +			effectName = !options ?
    +				method :
    +				options === true || typeof options === "number" ?
    +					defaultEffect :
    +					options.effect || defaultEffect;
    +		options = options || {};
    +		if ( typeof options === "number" ) {
    +			options = { duration: options };
    +		}
    +		hasOptions = !$.isEmptyObject( options );
    +		options.complete = callback;
    +		if ( options.delay ) {
    +			element.delay( options.delay );
    +		}
    +		if ( hasOptions && $.effects && ( $.effects.effect[ effectName ] || $.uiBackCompat !== false && $.effects[ effectName ] ) ) {
    +			element[ method ]( options );
    +		} else if ( effectName !== method && element[ effectName ] ) {
    +			element[ effectName ]( options.duration, options.easing, callback );
    +		} else {
    +			element.queue(function( next ) {
    +				$( this )[ method ]();
    +				if ( callback ) {
    +					callback.call( element[ 0 ] );
    +				}
    +				next();
    +			});
    +		}
    +	};
    +});
    +
    +// DEPRECATED
    +if ( $.uiBackCompat !== false ) {
    +	$.Widget.prototype._getCreateOptions = function() {
    +		return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
    +	};
    +}
    +
    +})( jQuery );
    +
    +(function( $, undefined ) {
    +
    +var mouseHandled = false;
    +$( document ).mouseup( function( e ) {
    +	mouseHandled = false;
    +});
    +
    +$.widget("ui.mouse", {
    +	version: "1.9.2",
    +	options: {
    +		cancel: 'input,textarea,button,select,option',
    +		distance: 1,
    +		delay: 0
    +	},
    +	_mouseInit: function() {
    +		var that = this;
    +
    +		this.element
    +			.bind('mousedown.'+this.widgetName, function(event) {
    +				return that._mouseDown(event);
    +			})
    +			.bind('click.'+this.widgetName, function(event) {
    +				if (true === $.data(event.target, that.widgetName + '.preventClickEvent')) {
    +					$.removeData(event.target, that.widgetName + '.preventClickEvent');
    +					event.stopImmediatePropagation();
    +					return false;
    +				}
    +			});
    +
    +		this.started = false;
    +	},
    +
    +	// TODO: make sure destroying one instance of mouse doesn't mess with
    +	// other instances of mouse
    +	_mouseDestroy: function() {
    +		this.element.unbind('.'+this.widgetName);
    +		if ( this._mouseMoveDelegate ) {
    +			$(document)
    +				.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
    +				.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
    +		}
    +	},
    +
    +	_mouseDown: function(event) {
    +		// don't let more than one widget handle mouseStart
    +		if( mouseHandled ) { return; }
    +
    +		// we may have missed mouseup (out of window)
    +		(this._mouseStarted && this._mouseUp(event));
    +
    +		this._mouseDownEvent = event;
    +
    +		var that = this,
    +			btnIsLeft = (event.which === 1),
    +			// event.target.nodeName works around a bug in IE 8 with
    +			// disabled inputs (#7620)
    +			elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
    +		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
    +			return true;
    +		}
    +
    +		this.mouseDelayMet = !this.options.delay;
    +		if (!this.mouseDelayMet) {
    +			this._mouseDelayTimer = setTimeout(function() {
    +				that.mouseDelayMet = true;
    +			}, this.options.delay);
    +		}
    +
    +		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
    +			this._mouseStarted = (this._mouseStart(event) !== false);
    +			if (!this._mouseStarted) {
    +				event.preventDefault();
    +				return true;
    +			}
    +		}
    +
    +		// Click event may never have fired (Gecko & Opera)
    +		if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
    +			$.removeData(event.target, this.widgetName + '.preventClickEvent');
    +		}
    +
    +		// these delegates are required to keep context
    +		this._mouseMoveDelegate = function(event) {
    +			return that._mouseMove(event);
    +		};
    +		this._mouseUpDelegate = function(event) {
    +			return that._mouseUp(event);
    +		};
    +		$(document)
    +			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
    +			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
    +
    +		event.preventDefault();
    +
    +		mouseHandled = true;
    +		return true;
    +	},
    +
    +	_mouseMove: function(event) {
    +		// IE mouseup check - mouseup happened when mouse was out of window
    +		if ($.ui.ie && !(document.documentMode >= 9) && !event.button) {
    +			return this._mouseUp(event);
    +		}
    +
    +		if (this._mouseStarted) {
    +			this._mouseDrag(event);
    +			return event.preventDefault();
    +		}
    +
    +		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
    +			this._mouseStarted =
    +				(this._mouseStart(this._mouseDownEvent, event) !== false);
    +			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
    +		}
    +
    +		return !this._mouseStarted;
    +	},
    +
    +	_mouseUp: function(event) {
    +		$(document)
    +			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
    +			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
    +
    +		if (this._mouseStarted) {
    +			this._mouseStarted = false;
    +
    +			if (event.target === this._mouseDownEvent.target) {
    +				$.data(event.target, this.widgetName + '.preventClickEvent', true);
    +			}
    +
    +			this._mouseStop(event);
    +		}
    +
    +		return false;
    +	},
    +
    +	_mouseDistanceMet: function(event) {
    +		return (Math.max(
    +				Math.abs(this._mouseDownEvent.pageX - event.pageX),
    +				Math.abs(this._mouseDownEvent.pageY - event.pageY)
    +			) >= this.options.distance
    +		);
    +	},
    +
    +	_mouseDelayMet: function(event) {
    +		return this.mouseDelayMet;
    +	},
    +
    +	// These are placeholder methods, to be overriden by extending plugin
    +	_mouseStart: function(event) {},
    +	_mouseDrag: function(event) {},
    +	_mouseStop: function(event) {},
    +	_mouseCapture: function(event) { return true; }
    +});
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.widget("ui.draggable", $.ui.mouse, {
    +	version: "1.9.2",
    +	widgetEventPrefix: "drag",
    +	options: {
    +		addClasses: true,
    +		appendTo: "parent",
    +		axis: false,
    +		connectToSortable: false,
    +		containment: false,
    +		cursor: "auto",
    +		cursorAt: false,
    +		grid: false,
    +		handle: false,
    +		helper: "original",
    +		iframeFix: false,
    +		opacity: false,
    +		refreshPositions: false,
    +		revert: false,
    +		revertDuration: 500,
    +		scope: "default",
    +		scroll: true,
    +		scrollSensitivity: 20,
    +		scrollSpeed: 20,
    +		snap: false,
    +		snapMode: "both",
    +		snapTolerance: 20,
    +		stack: false,
    +		zIndex: false
    +	},
    +	_create: function() {
    +
    +		if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
    +			this.element[0].style.position = 'relative';
    +
    +		(this.options.addClasses && this.element.addClass("ui-draggable"));
    +		(this.options.disabled && this.element.addClass("ui-draggable-disabled"));
    +
    +		this._mouseInit();
    +
    +	},
    +
    +	_destroy: function() {
    +		this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
    +		this._mouseDestroy();
    +	},
    +
    +	_mouseCapture: function(event) {
    +
    +		var o = this.options;
    +
    +		// among others, prevent a drag on a resizable-handle
    +		if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
    +			return false;
    +
    +		//Quit if we're not on a valid handle
    +		this.handle = this._getHandle(event);
    +		if (!this.handle)
    +			return false;
    +
    +		$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
    +			$('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
    +			.css({
    +				width: this.offsetWidth+"px", height: this.offsetHeight+"px",
    +				position: "absolute", opacity: "0.001", zIndex: 1000
    +			})
    +			.css($(this).offset())
    +			.appendTo("body");
    +		});
    +
    +		return true;
    +
    +	},
    +
    +	_mouseStart: function(event) {
    +
    +		var o = this.options;
    +
    +		//Create and append the visible helper
    +		this.helper = this._createHelper(event);
    +
    +		this.helper.addClass("ui-draggable-dragging");
    +
    +		//Cache the helper size
    +		this._cacheHelperProportions();
    +
    +		//If ddmanager is used for droppables, set the global draggable
    +		if($.ui.ddmanager)
    +			$.ui.ddmanager.current = this;
    +
    +		/*
    +		 * - Position generation -
    +		 * This block generates everything position related - it's the core of draggables.
    +		 */
    +
    +		//Cache the margins of the original element
    +		this._cacheMargins();
    +
    +		//Store the helper's css position
    +		this.cssPosition = this.helper.css("position");
    +		this.scrollParent = this.helper.scrollParent();
    +
    +		//The element's absolute position on the page minus margins
    +		this.offset = this.positionAbs = this.element.offset();
    +		this.offset = {
    +			top: this.offset.top - this.margins.top,
    +			left: this.offset.left - this.margins.left
    +		};
    +
    +		$.extend(this.offset, {
    +			click: { //Where the click happened, relative to the element
    +				left: event.pageX - this.offset.left,
    +				top: event.pageY - this.offset.top
    +			},
    +			parent: this._getParentOffset(),
    +			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
    +		});
    +
    +		//Generate the original position
    +		this.originalPosition = this.position = this._generatePosition(event);
    +		this.originalPageX = event.pageX;
    +		this.originalPageY = event.pageY;
    +
    +		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
    +		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
    +
    +		//Set a containment if given in the options
    +		if(o.containment)
    +			this._setContainment();
    +
    +		//Trigger event + callbacks
    +		if(this._trigger("start", event) === false) {
    +			this._clear();
    +			return false;
    +		}
    +
    +		//Recache the helper size
    +		this._cacheHelperProportions();
    +
    +		//Prepare the droppable offsets
    +		if ($.ui.ddmanager && !o.dropBehaviour)
    +			$.ui.ddmanager.prepareOffsets(this, event);
    +
    +
    +		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
    +
    +		//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
    +		if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
    +
    +		return true;
    +	},
    +
    +	_mouseDrag: function(event, noPropagation) {
    +
    +		//Compute the helpers position
    +		this.position = this._generatePosition(event);
    +		this.positionAbs = this._convertPositionTo("absolute");
    +
    +		//Call plugins and callbacks and use the resulting position if something is returned
    +		if (!noPropagation) {
    +			var ui = this._uiHash();
    +			if(this._trigger('drag', event, ui) === false) {
    +				this._mouseUp({});
    +				return false;
    +			}
    +			this.position = ui.position;
    +		}
    +
    +		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
    +		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
    +		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
    +
    +		return false;
    +	},
    +
    +	_mouseStop: function(event) {
    +
    +		//If we are using droppables, inform the manager about the drop
    +		var dropped = false;
    +		if ($.ui.ddmanager && !this.options.dropBehaviour)
    +			dropped = $.ui.ddmanager.drop(this, event);
    +
    +		//if a drop comes from outside (a sortable)
    +		if(this.dropped) {
    +			dropped = this.dropped;
    +			this.dropped = false;
    +		}
    +
    +		//if the original element is no longer in the DOM don't bother to continue (see #8269)
    +		var element = this.element[0], elementInDom = false;
    +		while ( element && (element = element.parentNode) ) {
    +			if (element == document ) {
    +				elementInDom = true;
    +			}
    +		}
    +		if ( !elementInDom && this.options.helper === "original" )
    +			return false;
    +
    +		if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
    +			var that = this;
    +			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
    +				if(that._trigger("stop", event) !== false) {
    +					that._clear();
    +				}
    +			});
    +		} else {
    +			if(this._trigger("stop", event) !== false) {
    +				this._clear();
    +			}
    +		}
    +
    +		return false;
    +	},
    +
    +	_mouseUp: function(event) {
    +		//Remove frame helpers
    +		$("div.ui-draggable-iframeFix").each(function() {
    +			this.parentNode.removeChild(this);
    +		});
    +
    +		//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
    +		if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
    +
    +		return $.ui.mouse.prototype._mouseUp.call(this, event);
    +	},
    +
    +	cancel: function() {
    +
    +		if(this.helper.is(".ui-draggable-dragging")) {
    +			this._mouseUp({});
    +		} else {
    +			this._clear();
    +		}
    +
    +		return this;
    +
    +	},
    +
    +	_getHandle: function(event) {
    +
    +		var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
    +		$(this.options.handle, this.element)
    +			.find("*")
    +			.andSelf()
    +			.each(function() {
    +				if(this == event.target) handle = true;
    +			});
    +
    +		return handle;
    +
    +	},
    +
    +	_createHelper: function(event) {
    +
    +		var o = this.options;
    +		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);
    +
    +		if(!helper.parents('body').length)
    +			helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
    +
    +		if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
    +			helper.css("position", "absolute");
    +
    +		return helper;
    +
    +	},
    +
    +	_adjustOffsetFromHelper: function(obj) {
    +		if (typeof obj == 'string') {
    +			obj = obj.split(' ');
    +		}
    +		if ($.isArray(obj)) {
    +			obj = {left: +obj[0], top: +obj[1] || 0};
    +		}
    +		if ('left' in obj) {
    +			this.offset.click.left = obj.left + this.margins.left;
    +		}
    +		if ('right' in obj) {
    +			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
    +		}
    +		if ('top' in obj) {
    +			this.offset.click.top = obj.top + this.margins.top;
    +		}
    +		if ('bottom' in obj) {
    +			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
    +		}
    +	},
    +
    +	_getParentOffset: function() {
    +
    +		//Get the offsetParent and cache its position
    +		this.offsetParent = this.helper.offsetParent();
    +		var po = this.offsetParent.offset();
    +
    +		// This is a special case where we need to modify a offset calculated on start, since the following happened:
    +		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
    +		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
    +		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
    +		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
    +			po.left += this.scrollParent.scrollLeft();
    +			po.top += this.scrollParent.scrollTop();
    +		}
    +
    +		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
    +		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
    +			po = { top: 0, left: 0 };
    +
    +		return {
    +			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
    +			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
    +		};
    +
    +	},
    +
    +	_getRelativeOffset: function() {
    +
    +		if(this.cssPosition == "relative") {
    +			var p = this.element.position();
    +			return {
    +				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
    +				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
    +			};
    +		} else {
    +			return { top: 0, left: 0 };
    +		}
    +
    +	},
    +
    +	_cacheMargins: function() {
    +		this.margins = {
    +			left: (parseInt(this.element.css("marginLeft"),10) || 0),
    +			top: (parseInt(this.element.css("marginTop"),10) || 0),
    +			right: (parseInt(this.element.css("marginRight"),10) || 0),
    +			bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
    +		};
    +	},
    +
    +	_cacheHelperProportions: function() {
    +		this.helperProportions = {
    +			width: this.helper.outerWidth(),
    +			height: this.helper.outerHeight()
    +		};
    +	},
    +
    +	_setContainment: function() {
    +
    +		var o = this.options;
    +		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
    +		if(o.containment == 'document' || o.containment == 'window') this.containment = [
    +			o.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
    +			o.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
    +			(o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
    +			(o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
    +		];
    +
    +		if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
    +			var c = $(o.containment);
    +			var ce = c[0]; if(!ce) return;
    +			var co = c.offset();
    +			var over = ($(ce).css("overflow") != 'hidden');
    +
    +			this.containment = [
    +				(parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
    +				(parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
    +				(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
    +				(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top  - this.margins.bottom
    +			];
    +			this.relative_container = c;
    +
    +		} else if(o.containment.constructor == Array) {
    +			this.containment = o.containment;
    +		}
    +
    +	},
    +
    +	_convertPositionTo: function(d, pos) {
    +
    +		if(!pos) pos = this.position;
    +		var mod = d == "absolute" ? 1 : -1;
    +		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
    +
    +		return {
    +			top: (
    +				pos.top																	// The absolute mouse position
    +				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
    +				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
    +				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
    +			),
    +			left: (
    +				pos.left																// The absolute mouse position
    +				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
    +				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
    +				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
    +			)
    +		};
    +
    +	},
    +
    +	_generatePosition: function(event) {
    +
    +		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
    +		var pageX = event.pageX;
    +		var pageY = event.pageY;
    +
    +		/*
    +		 * - Position constraining -
    +		 * Constrain the position to a mix of grid, containment.
    +		 */
    +
    +		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
    +			var containment;
    +			if(this.containment) {
    +			if (this.relative_container){
    +				var co = this.relative_container.offset();
    +				containment = [ this.containment[0] + co.left,
    +					this.containment[1] + co.top,
    +					this.containment[2] + co.left,
    +					this.containment[3] + co.top ];
    +			}
    +			else {
    +				containment = this.containment;
    +			}
    +
    +				if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
    +				if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
    +				if(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;
    +				if(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;
    +			}
    +
    +			if(o.grid) {
    +				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
    +				var top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
    +				pageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
    +
    +				var left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
    +				pageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
    +			}
    +
    +		}
    +
    +		return {
    +			top: (
    +				pageY																// The absolute mouse position
    +				- this.offset.click.top													// Click offset (relative to the element)
    +				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
    +				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
    +				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
    +			),
    +			left: (
    +				pageX																// The absolute mouse position
    +				- this.offset.click.left												// Click offset (relative to the element)
    +				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
    +				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
    +				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
    +			)
    +		};
    +
    +	},
    +
    +	_clear: function() {
    +		this.helper.removeClass("ui-draggable-dragging");
    +		if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
    +		//if($.ui.ddmanager) $.ui.ddmanager.current = null;
    +		this.helper = null;
    +		this.cancelHelperRemoval = false;
    +	},
    +
    +	// From now on bulk stuff - mainly helpers
    +
    +	_trigger: function(type, event, ui) {
    +		ui = ui || this._uiHash();
    +		$.ui.plugin.call(this, type, [event, ui]);
    +		if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
    +		return $.Widget.prototype._trigger.call(this, type, event, ui);
    +	},
    +
    +	plugins: {},
    +
    +	_uiHash: function(event) {
    +		return {
    +			helper: this.helper,
    +			position: this.position,
    +			originalPosition: this.originalPosition,
    +			offset: this.positionAbs
    +		};
    +	}
    +
    +});
    +
    +$.ui.plugin.add("draggable", "connectToSortable", {
    +	start: function(event, ui) {
    +
    +		var inst = $(this).data("draggable"), o = inst.options,
    +			uiSortable = $.extend({}, ui, { item: inst.element });
    +		inst.sortables = [];
    +		$(o.connectToSortable).each(function() {
    +			var sortable = $.data(this, 'sortable');
    +			if (sortable && !sortable.options.disabled) {
    +				inst.sortables.push({
    +					instance: sortable,
    +					shouldRevert: sortable.options.revert
    +				});
    +				sortable.refreshPositions();	// Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
    +				sortable._trigger("activate", event, uiSortable);
    +			}
    +		});
    +
    +	},
    +	stop: function(event, ui) {
    +
    +		//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
    +		var inst = $(this).data("draggable"),
    +			uiSortable = $.extend({}, ui, { item: inst.element });
    +
    +		$.each(inst.sortables, function() {
    +			if(this.instance.isOver) {
    +
    +				this.instance.isOver = 0;
    +
    +				inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
    +				this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
    +
    +				//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
    +				if(this.shouldRevert) this.instance.options.revert = true;
    +
    +				//Trigger the stop of the sortable
    +				this.instance._mouseStop(event);
    +
    +				this.instance.options.helper = this.instance.options._helper;
    +
    +				//If the helper has been the original item, restore properties in the sortable
    +				if(inst.options.helper == 'original')
    +					this.instance.currentItem.css({ top: 'auto', left: 'auto' });
    +
    +			} else {
    +				this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
    +				this.instance._trigger("deactivate", event, uiSortable);
    +			}
    +
    +		});
    +
    +	},
    +	drag: function(event, ui) {
    +
    +		var inst = $(this).data("draggable"), that = this;
    +
    +		var checkPos = function(o) {
    +			var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
    +			var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
    +			var itemHeight = o.height, itemWidth = o.width;
    +			var itemTop = o.top, itemLeft = o.left;
    +
    +			return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
    +		};
    +
    +		$.each(inst.sortables, function(i) {
    +
    +			var innermostIntersecting = false;
    +			var thisSortable = this;
    +			//Copy over some variables to allow calling the sortable's native _intersectsWith
    +			this.instance.positionAbs = inst.positionAbs;
    +			this.instance.helperProportions = inst.helperProportions;
    +			this.instance.offset.click = inst.offset.click;
    +
    +			if(this.instance._intersectsWith(this.instance.containerCache)) {
    +				innermostIntersecting = true;
    +				$.each(inst.sortables, function () {
    +					this.instance.positionAbs = inst.positionAbs;
    +					this.instance.helperProportions = inst.helperProportions;
    +					this.instance.offset.click = inst.offset.click;
    +					if  (this != thisSortable
    +						&& this.instance._intersectsWith(this.instance.containerCache)
    +						&& $.ui.contains(thisSortable.instance.element[0], this.instance.element[0]))
    +						innermostIntersecting = false;
    +						return innermostIntersecting;
    +				});
    +			}
    +
    +
    +			if(innermostIntersecting) {
    +				//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
    +				if(!this.instance.isOver) {
    +
    +					this.instance.isOver = 1;
    +					//Now we fake the start of dragging for the sortable instance,
    +					//by cloning the list group item, appending it to the sortable and using it as inst.currentItem
    +					//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
    +					this.instance.currentItem = $(that).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
    +					this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
    +					this.instance.options.helper = function() { return ui.helper[0]; };
    +
    +					event.target = this.instance.currentItem[0];
    +					this.instance._mouseCapture(event, true);
    +					this.instance._mouseStart(event, true, true);
    +
    +					//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
    +					this.instance.offset.click.top = inst.offset.click.top;
    +					this.instance.offset.click.left = inst.offset.click.left;
    +					this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
    +					this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
    +
    +					inst._trigger("toSortable", event);
    +					inst.dropped = this.instance.element; //draggable revert needs that
    +					//hack so receive/update callbacks work (mostly)
    +					inst.currentItem = inst.element;
    +					this.instance.fromOutside = inst;
    +
    +				}
    +
    +				//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
    +				if(this.instance.currentItem) this.instance._mouseDrag(event);
    +
    +			} else {
    +
    +				//If it doesn't intersect with the sortable, and it intersected before,
    +				//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
    +				if(this.instance.isOver) {
    +
    +					this.instance.isOver = 0;
    +					this.instance.cancelHelperRemoval = true;
    +
    +					//Prevent reverting on this forced stop
    +					this.instance.options.revert = false;
    +
    +					// The out event needs to be triggered independently
    +					this.instance._trigger('out', event, this.instance._uiHash(this.instance));
    +
    +					this.instance._mouseStop(event, true);
    +					this.instance.options.helper = this.instance.options._helper;
    +
    +					//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
    +					this.instance.currentItem.remove();
    +					if(this.instance.placeholder) this.instance.placeholder.remove();
    +
    +					inst._trigger("fromSortable", event);
    +					inst.dropped = false; //draggable revert needs that
    +				}
    +
    +			};
    +
    +		});
    +
    +	}
    +});
    +
    +$.ui.plugin.add("draggable", "cursor", {
    +	start: function(event, ui) {
    +		var t = $('body'), o = $(this).data('draggable').options;
    +		if (t.css("cursor")) o._cursor = t.css("cursor");
    +		t.css("cursor", o.cursor);
    +	},
    +	stop: function(event, ui) {
    +		var o = $(this).data('draggable').options;
    +		if (o._cursor) $('body').css("cursor", o._cursor);
    +	}
    +});
    +
    +$.ui.plugin.add("draggable", "opacity", {
    +	start: function(event, ui) {
    +		var t = $(ui.helper), o = $(this).data('draggable').options;
    +		if(t.css("opacity")) o._opacity = t.css("opacity");
    +		t.css('opacity', o.opacity);
    +	},
    +	stop: function(event, ui) {
    +		var o = $(this).data('draggable').options;
    +		if(o._opacity) $(ui.helper).css('opacity', o._opacity);
    +	}
    +});
    +
    +$.ui.plugin.add("draggable", "scroll", {
    +	start: function(event, ui) {
    +		var i = $(this).data("draggable");
    +		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
    +	},
    +	drag: function(event, ui) {
    +
    +		var i = $(this).data("draggable"), o = i.options, scrolled = false;
    +
    +		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
    +
    +			if(!o.axis || o.axis != 'x') {
    +				if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
    +					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
    +				else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
    +					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
    +			}
    +
    +			if(!o.axis || o.axis != 'y') {
    +				if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
    +					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
    +				else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
    +					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
    +			}
    +
    +		} else {
    +
    +			if(!o.axis || o.axis != 'x') {
    +				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
    +					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
    +				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
    +					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
    +			}
    +
    +			if(!o.axis || o.axis != 'y') {
    +				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
    +					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
    +				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
    +					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
    +			}
    +
    +		}
    +
    +		if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
    +			$.ui.ddmanager.prepareOffsets(i, event);
    +
    +	}
    +});
    +
    +$.ui.plugin.add("draggable", "snap", {
    +	start: function(event, ui) {
    +
    +		var i = $(this).data("draggable"), o = i.options;
    +		i.snapElements = [];
    +
    +		$(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
    +			var $t = $(this); var $o = $t.offset();
    +			if(this != i.element[0]) i.snapElements.push({
    +				item: this,
    +				width: $t.outerWidth(), height: $t.outerHeight(),
    +				top: $o.top, left: $o.left
    +			});
    +		});
    +
    +	},
    +	drag: function(event, ui) {
    +
    +		var inst = $(this).data("draggable"), o = inst.options;
    +		var d = o.snapTolerance;
    +
    +		var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
    +			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
    +
    +		for (var i = inst.snapElements.length - 1; i >= 0; i--){
    +
    +			var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
    +				t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
    +
    +			//Yes, I know, this is insane ;)
    +			if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
    +				if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
    +				inst.snapElements[i].snapping = false;
    +				continue;
    +			}
    +
    +			if(o.snapMode != 'inner') {
    +				var ts = Math.abs(t - y2) <= d;
    +				var bs = Math.abs(b - y1) <= d;
    +				var ls = Math.abs(l - x2) <= d;
    +				var rs = Math.abs(r - x1) <= d;
    +				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
    +				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
    +				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
    +				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
    +			}
    +
    +			var first = (ts || bs || ls || rs);
    +
    +			if(o.snapMode != 'outer') {
    +				var ts = Math.abs(t - y1) <= d;
    +				var bs = Math.abs(b - y2) <= d;
    +				var ls = Math.abs(l - x1) <= d;
    +				var rs = Math.abs(r - x2) <= d;
    +				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
    +				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
    +				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
    +				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
    +			}
    +
    +			if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
    +				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
    +			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
    +
    +		};
    +
    +	}
    +});
    +
    +$.ui.plugin.add("draggable", "stack", {
    +	start: function(event, ui) {
    +
    +		var o = $(this).data("draggable").options;
    +
    +		var group = $.makeArray($(o.stack)).sort(function(a,b) {
    +			return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
    +		});
    +		if (!group.length) { return; }
    +
    +		var min = parseInt(group[0].style.zIndex) || 0;
    +		$(group).each(function(i) {
    +			this.style.zIndex = min + i;
    +		});
    +
    +		this[0].style.zIndex = min + group.length;
    +
    +	}
    +});
    +
    +$.ui.plugin.add("draggable", "zIndex", {
    +	start: function(event, ui) {
    +		var t = $(ui.helper), o = $(this).data("draggable").options;
    +		if(t.css("zIndex")) o._zIndex = t.css("zIndex");
    +		t.css('zIndex', o.zIndex);
    +	},
    +	stop: function(event, ui) {
    +		var o = $(this).data("draggable").options;
    +		if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
    +	}
    +});
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.widget("ui.droppable", {
    +	version: "1.9.2",
    +	widgetEventPrefix: "drop",
    +	options: {
    +		accept: '*',
    +		activeClass: false,
    +		addClasses: true,
    +		greedy: false,
    +		hoverClass: false,
    +		scope: 'default',
    +		tolerance: 'intersect'
    +	},
    +	_create: function() {
    +
    +		var o = this.options, accept = o.accept;
    +		this.isover = 0; this.isout = 1;
    +
    +		this.accept = $.isFunction(accept) ? accept : function(d) {
    +			return d.is(accept);
    +		};
    +
    +		//Store the droppable's proportions
    +		this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
    +
    +		// Add the reference and positions to the manager
    +		$.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
    +		$.ui.ddmanager.droppables[o.scope].push(this);
    +
    +		(o.addClasses && this.element.addClass("ui-droppable"));
    +
    +	},
    +
    +	_destroy: function() {
    +		var drop = $.ui.ddmanager.droppables[this.options.scope];
    +		for ( var i = 0; i < drop.length; i++ )
    +			if ( drop[i] == this )
    +				drop.splice(i, 1);
    +
    +		this.element.removeClass("ui-droppable ui-droppable-disabled");
    +	},
    +
    +	_setOption: function(key, value) {
    +
    +		if(key == 'accept') {
    +			this.accept = $.isFunction(value) ? value : function(d) {
    +				return d.is(value);
    +			};
    +		}
    +		$.Widget.prototype._setOption.apply(this, arguments);
    +	},
    +
    +	_activate: function(event) {
    +		var draggable = $.ui.ddmanager.current;
    +		if(this.options.activeClass) this.element.addClass(this.options.activeClass);
    +		(draggable && this._trigger('activate', event, this.ui(draggable)));
    +	},
    +
    +	_deactivate: function(event) {
    +		var draggable = $.ui.ddmanager.current;
    +		if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
    +		(draggable && this._trigger('deactivate', event, this.ui(draggable)));
    +	},
    +
    +	_over: function(event) {
    +
    +		var draggable = $.ui.ddmanager.current;
    +		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
    +
    +		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
    +			if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
    +			this._trigger('over', event, this.ui(draggable));
    +		}
    +
    +	},
    +
    +	_out: function(event) {
    +
    +		var draggable = $.ui.ddmanager.current;
    +		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
    +
    +		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
    +			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
    +			this._trigger('out', event, this.ui(draggable));
    +		}
    +
    +	},
    +
    +	_drop: function(event,custom) {
    +
    +		var draggable = custom || $.ui.ddmanager.current;
    +		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
    +
    +		var childrenIntersection = false;
    +		this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
    +			var inst = $.data(this, 'droppable');
    +			if(
    +				inst.options.greedy
    +				&& !inst.options.disabled
    +				&& inst.options.scope == draggable.options.scope
    +				&& inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
    +				&& $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
    +			) { childrenIntersection = true; return false; }
    +		});
    +		if(childrenIntersection) return false;
    +
    +		if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
    +			if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
    +			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
    +			this._trigger('drop', event, this.ui(draggable));
    +			return this.element;
    +		}
    +
    +		return false;
    +
    +	},
    +
    +	ui: function(c) {
    +		return {
    +			draggable: (c.currentItem || c.element),
    +			helper: c.helper,
    +			position: c.position,
    +			offset: c.positionAbs
    +		};
    +	}
    +
    +});
    +
    +$.ui.intersect = function(draggable, droppable, toleranceMode) {
    +
    +	if (!droppable.offset) return false;
    +
    +	var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
    +		y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
    +	var l = droppable.offset.left, r = l + droppable.proportions.width,
    +		t = droppable.offset.top, b = t + droppable.proportions.height;
    +
    +	switch (toleranceMode) {
    +		case 'fit':
    +			return (l <= x1 && x2 <= r
    +				&& t <= y1 && y2 <= b);
    +			break;
    +		case 'intersect':
    +			return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
    +				&& x2 - (draggable.helperProportions.width / 2) < r // Left Half
    +				&& t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
    +				&& y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
    +			break;
    +		case 'pointer':
    +			var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
    +				draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
    +				isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
    +			return isOver;
    +			break;
    +		case 'touch':
    +			return (
    +					(y1 >= t && y1 <= b) ||	// Top edge touching
    +					(y2 >= t && y2 <= b) ||	// Bottom edge touching
    +					(y1 < t && y2 > b)		// Surrounded vertically
    +				) && (
    +					(x1 >= l && x1 <= r) ||	// Left edge touching
    +					(x2 >= l && x2 <= r) ||	// Right edge touching
    +					(x1 < l && x2 > r)		// Surrounded horizontally
    +				);
    +			break;
    +		default:
    +			return false;
    +			break;
    +		}
    +
    +};
    +
    +/*
    +	This manager tracks offsets of draggables and droppables
    +*/
    +$.ui.ddmanager = {
    +	current: null,
    +	droppables: { 'default': [] },
    +	prepareOffsets: function(t, event) {
    +
    +		var m = $.ui.ddmanager.droppables[t.options.scope] || [];
    +		var type = event ? event.type : null; // workaround for #2317
    +		var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
    +
    +		droppablesLoop: for (var i = 0; i < m.length; i++) {
    +
    +			if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue;	//No disabled and non-accepted
    +			for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
    +			m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; 									//If the element is not visible, continue
    +
    +			if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
    +
    +			m[i].offset = m[i].element.offset();
    +			m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
    +
    +		}
    +
    +	},
    +	drop: function(draggable, event) {
    +
    +		var dropped = false;
    +		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
    +
    +			if(!this.options) return;
    +			if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
    +				dropped = this._drop.call(this, event) || dropped;
    +
    +			if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
    +				this.isout = 1; this.isover = 0;
    +				this._deactivate.call(this, event);
    +			}
    +
    +		});
    +		return dropped;
    +
    +	},
    +	dragStart: function( draggable, event ) {
    +		//Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
    +		draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
    +			if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
    +		});
    +	},
    +	drag: function(draggable, event) {
    +
    +		//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
    +		if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
    +
    +		//Run through all droppables and check their positions based on specific tolerance options
    +		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
    +
    +			if(this.options.disabled || this.greedyChild || !this.visible) return;
    +			var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
    +
    +			var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
    +			if(!c) return;
    +
    +			var parentInstance;
    +			if (this.options.greedy) {
    +				// find droppable parents with same scope
    +				var scope = this.options.scope;
    +				var parent = this.element.parents(':data(droppable)').filter(function () {
    +					return $.data(this, 'droppable').options.scope === scope;
    +				});
    +
    +				if (parent.length) {
    +					parentInstance = $.data(parent[0], 'droppable');
    +					parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
    +				}
    +			}
    +
    +			// we just moved into a greedy child
    +			if (parentInstance && c == 'isover') {
    +				parentInstance['isover'] = 0;
    +				parentInstance['isout'] = 1;
    +				parentInstance._out.call(parentInstance, event);
    +			}
    +
    +			this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
    +			this[c == "isover" ? "_over" : "_out"].call(this, event);
    +
    +			// we just moved out of a greedy child
    +			if (parentInstance && c == 'isout') {
    +				parentInstance['isout'] = 0;
    +				parentInstance['isover'] = 1;
    +				parentInstance._over.call(parentInstance, event);
    +			}
    +		});
    +
    +	},
    +	dragStop: function( draggable, event ) {
    +		draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
    +		//Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
    +		if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
    +	}
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.widget("ui.resizable", $.ui.mouse, {
    +	version: "1.9.2",
    +	widgetEventPrefix: "resize",
    +	options: {
    +		alsoResize: false,
    +		animate: false,
    +		animateDuration: "slow",
    +		animateEasing: "swing",
    +		aspectRatio: false,
    +		autoHide: false,
    +		containment: false,
    +		ghost: false,
    +		grid: false,
    +		handles: "e,s,se",
    +		helper: false,
    +		maxHeight: null,
    +		maxWidth: null,
    +		minHeight: 10,
    +		minWidth: 10,
    +		zIndex: 1000
    +	},
    +	_create: function() {
    +
    +		var that = this, o = this.options;
    +		this.element.addClass("ui-resizable");
    +
    +		$.extend(this, {
    +			_aspectRatio: !!(o.aspectRatio),
    +			aspectRatio: o.aspectRatio,
    +			originalElement: this.element,
    +			_proportionallyResizeElements: [],
    +			_helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
    +		});
    +
    +		//Wrap the element if it cannot hold child nodes
    +		if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
    +
    +			//Create a wrapper element and set the wrapper to the new current internal element
    +			this.element.wrap(
    +				$('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
    +					position: this.element.css('position'),
    +					width: this.element.outerWidth(),
    +					height: this.element.outerHeight(),
    +					top: this.element.css('top'),
    +					left: this.element.css('left')
    +				})
    +			);
    +
    +			//Overwrite the original this.element
    +			this.element = this.element.parent().data(
    +				"resizable", this.element.data('resizable')
    +			);
    +
    +			this.elementIsWrapper = true;
    +
    +			//Move margins to the wrapper
    +			this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
    +			this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
    +
    +			//Prevent Safari textarea resize
    +			this.originalResizeStyle = this.originalElement.css('resize');
    +			this.originalElement.css('resize', 'none');
    +
    +			//Push the actual element to our proportionallyResize internal array
    +			this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
    +
    +			// avoid IE jump (hard set the margin)
    +			this.originalElement.css({ margin: this.originalElement.css('margin') });
    +
    +			// fix handlers offset
    +			this._proportionallyResize();
    +
    +		}
    +
    +		this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
    +		if(this.handles.constructor == String) {
    +
    +			if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
    +			var n = this.handles.split(","); this.handles = {};
    +
    +			for(var i = 0; i < n.length; i++) {
    +
    +				var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
    +				var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
    +
    +				// Apply zIndex to all handles - see #7960
    +				axis.css({ zIndex: o.zIndex });
    +
    +				//TODO : What's going on here?
    +				if ('se' == handle) {
    +					axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
    +				};
    +
    +				//Insert into internal handles object and append to element
    +				this.handles[handle] = '.ui-resizable-'+handle;
    +				this.element.append(axis);
    +			}
    +
    +		}
    +
    +		this._renderAxis = function(target) {
    +
    +			target = target || this.element;
    +
    +			for(var i in this.handles) {
    +
    +				if(this.handles[i].constructor == String)
    +					this.handles[i] = $(this.handles[i], this.element).show();
    +
    +				//Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
    +				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
    +
    +					var axis = $(this.handles[i], this.element), padWrapper = 0;
    +
    +					//Checking the correct pad and border
    +					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
    +
    +					//The padding type i have to apply...
    +					var padPos = [ 'padding',
    +						/ne|nw|n/.test(i) ? 'Top' :
    +						/se|sw|s/.test(i) ? 'Bottom' :
    +						/^e$/.test(i) ? 'Right' : 'Left' ].join("");
    +
    +					target.css(padPos, padWrapper);
    +
    +					this._proportionallyResize();
    +
    +				}
    +
    +				//TODO: What's that good for? There's not anything to be executed left
    +				if(!$(this.handles[i]).length)
    +					continue;
    +
    +			}
    +		};
    +
    +		//TODO: make renderAxis a prototype function
    +		this._renderAxis(this.element);
    +
    +		this._handles = $('.ui-resizable-handle', this.element)
    +			.disableSelection();
    +
    +		//Matching axis name
    +		this._handles.mouseover(function() {
    +			if (!that.resizing) {
    +				if (this.className)
    +					var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
    +				//Axis, default = se
    +				that.axis = axis && axis[1] ? axis[1] : 'se';
    +			}
    +		});
    +
    +		//If we want to auto hide the elements
    +		if (o.autoHide) {
    +			this._handles.hide();
    +			$(this.element)
    +				.addClass("ui-resizable-autohide")
    +				.mouseenter(function() {
    +					if (o.disabled) return;
    +					$(this).removeClass("ui-resizable-autohide");
    +					that._handles.show();
    +				})
    +				.mouseleave(function(){
    +					if (o.disabled) return;
    +					if (!that.resizing) {
    +						$(this).addClass("ui-resizable-autohide");
    +						that._handles.hide();
    +					}
    +				});
    +		}
    +
    +		//Initialize the mouse interaction
    +		this._mouseInit();
    +
    +	},
    +
    +	_destroy: function() {
    +
    +		this._mouseDestroy();
    +
    +		var _destroy = function(exp) {
    +			$(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
    +				.removeData("resizable").removeData("ui-resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
    +		};
    +
    +		//TODO: Unwrap at same DOM position
    +		if (this.elementIsWrapper) {
    +			_destroy(this.element);
    +			var wrapper = this.element;
    +			this.originalElement.css({
    +				position: wrapper.css('position'),
    +				width: wrapper.outerWidth(),
    +				height: wrapper.outerHeight(),
    +				top: wrapper.css('top'),
    +				left: wrapper.css('left')
    +			}).insertAfter( wrapper );
    +			wrapper.remove();
    +		}
    +
    +		this.originalElement.css('resize', this.originalResizeStyle);
    +		_destroy(this.originalElement);
    +
    +		return this;
    +	},
    +
    +	_mouseCapture: function(event) {
    +		var handle = false;
    +		for (var i in this.handles) {
    +			if ($(this.handles[i])[0] == event.target) {
    +				handle = true;
    +			}
    +		}
    +
    +		return !this.options.disabled && handle;
    +	},
    +
    +	_mouseStart: function(event) {
    +
    +		var o = this.options, iniPos = this.element.position(), el = this.element;
    +
    +		this.resizing = true;
    +		this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
    +
    +		// bugfix for http://dev.jquery.com/ticket/1749
    +		if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
    +			el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
    +		}
    +
    +		this._renderProxy();
    +
    +		var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
    +
    +		if (o.containment) {
    +			curleft += $(o.containment).scrollLeft() || 0;
    +			curtop += $(o.containment).scrollTop() || 0;
    +		}
    +
    +		//Store needed variables
    +		this.offset = this.helper.offset();
    +		this.position = { left: curleft, top: curtop };
    +		this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
    +		this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
    +		this.originalPosition = { left: curleft, top: curtop };
    +		this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
    +		this.originalMousePosition = { left: event.pageX, top: event.pageY };
    +
    +		//Aspect Ratio
    +		this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
    +
    +		var cursor = $('.ui-resizable-' + this.axis).css('cursor');
    +		$('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
    +
    +		el.addClass("ui-resizable-resizing");
    +		this._propagate("start", event);
    +		return true;
    +	},
    +
    +	_mouseDrag: function(event) {
    +
    +		//Increase performance, avoid regex
    +		var el = this.helper, o = this.options, props = {},
    +			that = this, smp = this.originalMousePosition, a = this.axis;
    +
    +		var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
    +		var trigger = this._change[a];
    +		if (!trigger) return false;
    +
    +		// Calculate the attrs that will be change
    +		var data = trigger.apply(this, [event, dx, dy]);
    +
    +		// Put this in the mouseDrag handler since the user can start pressing shift while resizing
    +		this._updateVirtualBoundaries(event.shiftKey);
    +		if (this._aspectRatio || event.shiftKey)
    +			data = this._updateRatio(data, event);
    +
    +		data = this._respectSize(data, event);
    +
    +		// plugins callbacks need to be called first
    +		this._propagate("resize", event);
    +
    +		el.css({
    +			top: this.position.top + "px", left: this.position.left + "px",
    +			width: this.size.width + "px", height: this.size.height + "px"
    +		});
    +
    +		if (!this._helper && this._proportionallyResizeElements.length)
    +			this._proportionallyResize();
    +
    +		this._updateCache(data);
    +
    +		// calling the user callback at the end
    +		this._trigger('resize', event, this.ui());
    +
    +		return false;
    +	},
    +
    +	_mouseStop: function(event) {
    +
    +		this.resizing = false;
    +		var o = this.options, that = this;
    +
    +		if(this._helper) {
    +			var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
    +				soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : that.sizeDiff.height,
    +				soffsetw = ista ? 0 : that.sizeDiff.width;
    +
    +			var s = { width: (that.helper.width()  - soffsetw), height: (that.helper.height() - soffseth) },
    +				left = (parseInt(that.element.css('left'), 10) + (that.position.left - that.originalPosition.left)) || null,
    +				top = (parseInt(that.element.css('top'), 10) + (that.position.top - that.originalPosition.top)) || null;
    +
    +			if (!o.animate)
    +				this.element.css($.extend(s, { top: top, left: left }));
    +
    +			that.helper.height(that.size.height);
    +			that.helper.width(that.size.width);
    +
    +			if (this._helper && !o.animate) this._proportionallyResize();
    +		}
    +
    +		$('body').css('cursor', 'auto');
    +
    +		this.element.removeClass("ui-resizable-resizing");
    +
    +		this._propagate("stop", event);
    +
    +		if (this._helper) this.helper.remove();
    +		return false;
    +
    +	},
    +
    +	_updateVirtualBoundaries: function(forceAspectRatio) {
    +		var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
    +
    +		b = {
    +			minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
    +			maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
    +			minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
    +			maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
    +		};
    +
    +		if(this._aspectRatio || forceAspectRatio) {
    +			// We want to create an enclosing box whose aspect ration is the requested one
    +			// First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
    +			pMinWidth = b.minHeight * this.aspectRatio;
    +			pMinHeight = b.minWidth / this.aspectRatio;
    +			pMaxWidth = b.maxHeight * this.aspectRatio;
    +			pMaxHeight = b.maxWidth / this.aspectRatio;
    +
    +			if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
    +			if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
    +			if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
    +			if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
    +		}
    +		this._vBoundaries = b;
    +	},
    +
    +	_updateCache: function(data) {
    +		var o = this.options;
    +		this.offset = this.helper.offset();
    +		if (isNumber(data.left)) this.position.left = data.left;
    +		if (isNumber(data.top)) this.position.top = data.top;
    +		if (isNumber(data.height)) this.size.height = data.height;
    +		if (isNumber(data.width)) this.size.width = data.width;
    +	},
    +
    +	_updateRatio: function(data, event) {
    +
    +		var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
    +
    +		if (isNumber(data.height)) data.width = (data.height * this.aspectRatio);
    +		else if (isNumber(data.width)) data.height = (data.width / this.aspectRatio);
    +
    +		if (a == 'sw') {
    +			data.left = cpos.left + (csize.width - data.width);
    +			data.top = null;
    +		}
    +		if (a == 'nw') {
    +			data.top = cpos.top + (csize.height - data.height);
    +			data.left = cpos.left + (csize.width - data.width);
    +		}
    +
    +		return data;
    +	},
    +
    +	_respectSize: function(data, event) {
    +
    +		var el = this.helper, o = this._vBoundaries, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
    +				ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
    +					isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
    +
    +		if (isminw) data.width = o.minWidth;
    +		if (isminh) data.height = o.minHeight;
    +		if (ismaxw) data.width = o.maxWidth;
    +		if (ismaxh) data.height = o.maxHeight;
    +
    +		var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
    +		var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
    +
    +		if (isminw && cw) data.left = dw - o.minWidth;
    +		if (ismaxw && cw) data.left = dw - o.maxWidth;
    +		if (isminh && ch)	data.top = dh - o.minHeight;
    +		if (ismaxh && ch)	data.top = dh - o.maxHeight;
    +
    +		// fixing jump error on top/left - bug #2330
    +		var isNotwh = !data.width && !data.height;
    +		if (isNotwh && !data.left && data.top) data.top = null;
    +		else if (isNotwh && !data.top && data.left) data.left = null;
    +
    +		return data;
    +	},
    +
    +	_proportionallyResize: function() {
    +
    +		var o = this.options;
    +		if (!this._proportionallyResizeElements.length) return;
    +		var element = this.helper || this.element;
    +
    +		for (var i=0; i < this._proportionallyResizeElements.length; i++) {
    +
    +			var prel = this._proportionallyResizeElements[i];
    +
    +			if (!this.borderDif) {
    +				var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
    +					p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
    +
    +				this.borderDif = $.map(b, function(v, i) {
    +					var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
    +					return border + padding;
    +				});
    +			}
    +
    +			prel.css({
    +				height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
    +				width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
    +			});
    +
    +		};
    +
    +	},
    +
    +	_renderProxy: function() {
    +
    +		var el = this.element, o = this.options;
    +		this.elementOffset = el.offset();
    +
    +		if(this._helper) {
    +
    +			this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
    +
    +			// fix ie6 offset TODO: This seems broken
    +			var ie6offset = ($.ui.ie6 ? 1 : 0),
    +			pxyoffset = ( $.ui.ie6 ? 2 : -1 );
    +
    +			this.helper.addClass(this._helper).css({
    +				width: this.element.outerWidth() + pxyoffset,
    +				height: this.element.outerHeight() + pxyoffset,
    +				position: 'absolute',
    +				left: this.elementOffset.left - ie6offset +'px',
    +				top: this.elementOffset.top - ie6offset +'px',
    +				zIndex: ++o.zIndex //TODO: Don't modify option
    +			});
    +
    +			this.helper
    +				.appendTo("body")
    +				.disableSelection();
    +
    +		} else {
    +			this.helper = this.element;
    +		}
    +
    +	},
    +
    +	_change: {
    +		e: function(event, dx, dy) {
    +			return { width: this.originalSize.width + dx };
    +		},
    +		w: function(event, dx, dy) {
    +			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
    +			return { left: sp.left + dx, width: cs.width - dx };
    +		},
    +		n: function(event, dx, dy) {
    +			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
    +			return { top: sp.top + dy, height: cs.height - dy };
    +		},
    +		s: function(event, dx, dy) {
    +			return { height: this.originalSize.height + dy };
    +		},
    +		se: function(event, dx, dy) {
    +			return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
    +		},
    +		sw: function(event, dx, dy) {
    +			return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
    +		},
    +		ne: function(event, dx, dy) {
    +			return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
    +		},
    +		nw: function(event, dx, dy) {
    +			return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
    +		}
    +	},
    +
    +	_propagate: function(n, event) {
    +		$.ui.plugin.call(this, n, [event, this.ui()]);
    +		(n != "resize" && this._trigger(n, event, this.ui()));
    +	},
    +
    +	plugins: {},
    +
    +	ui: function() {
    +		return {
    +			originalElement: this.originalElement,
    +			element: this.element,
    +			helper: this.helper,
    +			position: this.position,
    +			size: this.size,
    +			originalSize: this.originalSize,
    +			originalPosition: this.originalPosition
    +		};
    +	}
    +
    +});
    +
    +/*
    + * Resizable Extensions
    + */
    +
    +$.ui.plugin.add("resizable", "alsoResize", {
    +
    +	start: function (event, ui) {
    +		var that = $(this).data("resizable"), o = that.options;
    +
    +		var _store = function (exp) {
    +			$(exp).each(function() {
    +				var el = $(this);
    +				el.data("resizable-alsoresize", {
    +					width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
    +					left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10)
    +				});
    +			});
    +		};
    +
    +		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
    +			if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
    +			else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
    +		}else{
    +			_store(o.alsoResize);
    +		}
    +	},
    +
    +	resize: function (event, ui) {
    +		var that = $(this).data("resizable"), o = that.options, os = that.originalSize, op = that.originalPosition;
    +
    +		var delta = {
    +			height: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0,
    +			top: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0
    +		},
    +
    +		_alsoResize = function (exp, c) {
    +			$(exp).each(function() {
    +				var el = $(this), start = $(this).data("resizable-alsoresize"), style = {},
    +					css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
    +
    +				$.each(css, function (i, prop) {
    +					var sum = (start[prop]||0) + (delta[prop]||0);
    +					if (sum && sum >= 0)
    +						style[prop] = sum || null;
    +				});
    +
    +				el.css(style);
    +			});
    +		};
    +
    +		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
    +			$.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
    +		}else{
    +			_alsoResize(o.alsoResize);
    +		}
    +	},
    +
    +	stop: function (event, ui) {
    +		$(this).removeData("resizable-alsoresize");
    +	}
    +});
    +
    +$.ui.plugin.add("resizable", "animate", {
    +
    +	stop: function(event, ui) {
    +		var that = $(this).data("resizable"), o = that.options;
    +
    +		var pr = that._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
    +					soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : that.sizeDiff.height,
    +						soffsetw = ista ? 0 : that.sizeDiff.width;
    +
    +		var style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
    +					left = (parseInt(that.element.css('left'), 10) + (that.position.left - that.originalPosition.left)) || null,
    +						top = (parseInt(that.element.css('top'), 10) + (that.position.top - that.originalPosition.top)) || null;
    +
    +		that.element.animate(
    +			$.extend(style, top && left ? { top: top, left: left } : {}), {
    +				duration: o.animateDuration,
    +				easing: o.animateEasing,
    +				step: function() {
    +
    +					var data = {
    +						width: parseInt(that.element.css('width'), 10),
    +						height: parseInt(that.element.css('height'), 10),
    +						top: parseInt(that.element.css('top'), 10),
    +						left: parseInt(that.element.css('left'), 10)
    +					};
    +
    +					if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
    +
    +					// propagating resize, and updating values for each animation step
    +					that._updateCache(data);
    +					that._propagate("resize", event);
    +
    +				}
    +			}
    +		);
    +	}
    +
    +});
    +
    +$.ui.plugin.add("resizable", "containment", {
    +
    +	start: function(event, ui) {
    +		var that = $(this).data("resizable"), o = that.options, el = that.element;
    +		var oc = o.containment,	ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
    +		if (!ce) return;
    +
    +		that.containerElement = $(ce);
    +
    +		if (/document/.test(oc) || oc == document) {
    +			that.containerOffset = { left: 0, top: 0 };
    +			that.containerPosition = { left: 0, top: 0 };
    +
    +			that.parentData = {
    +				element: $(document), left: 0, top: 0,
    +				width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
    +			};
    +		}
    +
    +		// i'm a node, so compute top, left, right, bottom
    +		else {
    +			var element = $(ce), p = [];
    +			$([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
    +
    +			that.containerOffset = element.offset();
    +			that.containerPosition = element.position();
    +			that.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
    +
    +			var co = that.containerOffset, ch = that.containerSize.height,	cw = that.containerSize.width,
    +						width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
    +
    +			that.parentData = {
    +				element: ce, left: co.left, top: co.top, width: width, height: height
    +			};
    +		}
    +	},
    +
    +	resize: function(event, ui) {
    +		var that = $(this).data("resizable"), o = that.options,
    +				ps = that.containerSize, co = that.containerOffset, cs = that.size, cp = that.position,
    +				pRatio = that._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = that.containerElement;
    +
    +		if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
    +
    +		if (cp.left < (that._helper ? co.left : 0)) {
    +			that.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left));
    +			if (pRatio) that.size.height = that.size.width / that.aspectRatio;
    +			that.position.left = o.helper ? co.left : 0;
    +		}
    +
    +		if (cp.top < (that._helper ? co.top : 0)) {
    +			that.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top);
    +			if (pRatio) that.size.width = that.size.height * that.aspectRatio;
    +			that.position.top = that._helper ? co.top : 0;
    +		}
    +
    +		that.offset.left = that.parentData.left+that.position.left;
    +		that.offset.top = that.parentData.top+that.position.top;
    +
    +		var woset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width ),
    +					hoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height );
    +
    +		var isParent = that.containerElement.get(0) == that.element.parent().get(0),
    +			isOffsetRelative = /relative|absolute/.test(that.containerElement.css('position'));
    +
    +		if(isParent && isOffsetRelative) woset -= that.parentData.left;
    +
    +		if (woset + that.size.width >= that.parentData.width) {
    +			that.size.width = that.parentData.width - woset;
    +			if (pRatio) that.size.height = that.size.width / that.aspectRatio;
    +		}
    +
    +		if (hoset + that.size.height >= that.parentData.height) {
    +			that.size.height = that.parentData.height - hoset;
    +			if (pRatio) that.size.width = that.size.height * that.aspectRatio;
    +		}
    +	},
    +
    +	stop: function(event, ui){
    +		var that = $(this).data("resizable"), o = that.options, cp = that.position,
    +				co = that.containerOffset, cop = that.containerPosition, ce = that.containerElement;
    +
    +		var helper = $(that.helper), ho = helper.offset(), w = helper.outerWidth() - that.sizeDiff.width, h = helper.outerHeight() - that.sizeDiff.height;
    +
    +		if (that._helper && !o.animate && (/relative/).test(ce.css('position')))
    +			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
    +
    +		if (that._helper && !o.animate && (/static/).test(ce.css('position')))
    +			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
    +
    +	}
    +});
    +
    +$.ui.plugin.add("resizable", "ghost", {
    +
    +	start: function(event, ui) {
    +
    +		var that = $(this).data("resizable"), o = that.options, cs = that.size;
    +
    +		that.ghost = that.originalElement.clone();
    +		that.ghost
    +			.css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
    +			.addClass('ui-resizable-ghost')
    +			.addClass(typeof o.ghost == 'string' ? o.ghost : '');
    +
    +		that.ghost.appendTo(that.helper);
    +
    +	},
    +
    +	resize: function(event, ui){
    +		var that = $(this).data("resizable"), o = that.options;
    +		if (that.ghost) that.ghost.css({ position: 'relative', height: that.size.height, width: that.size.width });
    +	},
    +
    +	stop: function(event, ui){
    +		var that = $(this).data("resizable"), o = that.options;
    +		if (that.ghost && that.helper) that.helper.get(0).removeChild(that.ghost.get(0));
    +	}
    +
    +});
    +
    +$.ui.plugin.add("resizable", "grid", {
    +
    +	resize: function(event, ui) {
    +		var that = $(this).data("resizable"), o = that.options, cs = that.size, os = that.originalSize, op = that.originalPosition, a = that.axis, ratio = o._aspectRatio || event.shiftKey;
    +		o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
    +		var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
    +
    +		if (/^(se|s|e)$/.test(a)) {
    +			that.size.width = os.width + ox;
    +			that.size.height = os.height + oy;
    +		}
    +		else if (/^(ne)$/.test(a)) {
    +			that.size.width = os.width + ox;
    +			that.size.height = os.height + oy;
    +			that.position.top = op.top - oy;
    +		}
    +		else if (/^(sw)$/.test(a)) {
    +			that.size.width = os.width + ox;
    +			that.size.height = os.height + oy;
    +			that.position.left = op.left - ox;
    +		}
    +		else {
    +			that.size.width = os.width + ox;
    +			that.size.height = os.height + oy;
    +			that.position.top = op.top - oy;
    +			that.position.left = op.left - ox;
    +		}
    +	}
    +
    +});
    +
    +var num = function(v) {
    +	return parseInt(v, 10) || 0;
    +};
    +
    +var isNumber = function(value) {
    +	return !isNaN(parseInt(value, 10));
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.widget("ui.selectable", $.ui.mouse, {
    +	version: "1.9.2",
    +	options: {
    +		appendTo: 'body',
    +		autoRefresh: true,
    +		distance: 0,
    +		filter: '*',
    +		tolerance: 'touch'
    +	},
    +	_create: function() {
    +		var that = this;
    +
    +		this.element.addClass("ui-selectable");
    +
    +		this.dragged = false;
    +
    +		// cache selectee children based on filter
    +		var selectees;
    +		this.refresh = function() {
    +			selectees = $(that.options.filter, that.element[0]);
    +			selectees.addClass("ui-selectee");
    +			selectees.each(function() {
    +				var $this = $(this);
    +				var pos = $this.offset();
    +				$.data(this, "selectable-item", {
    +					element: this,
    +					$element: $this,
    +					left: pos.left,
    +					top: pos.top,
    +					right: pos.left + $this.outerWidth(),
    +					bottom: pos.top + $this.outerHeight(),
    +					startselected: false,
    +					selected: $this.hasClass('ui-selected'),
    +					selecting: $this.hasClass('ui-selecting'),
    +					unselecting: $this.hasClass('ui-unselecting')
    +				});
    +			});
    +		};
    +		this.refresh();
    +
    +		this.selectees = selectees.addClass("ui-selectee");
    +
    +		this._mouseInit();
    +
    +		this.helper = $("<div class='ui-selectable-helper'></div>");
    +	},
    +
    +	_destroy: function() {
    +		this.selectees
    +			.removeClass("ui-selectee")
    +			.removeData("selectable-item");
    +		this.element
    +			.removeClass("ui-selectable ui-selectable-disabled");
    +		this._mouseDestroy();
    +	},
    +
    +	_mouseStart: function(event) {
    +		var that = this;
    +
    +		this.opos = [event.pageX, event.pageY];
    +
    +		if (this.options.disabled)
    +			return;
    +
    +		var options = this.options;
    +
    +		this.selectees = $(options.filter, this.element[0]);
    +
    +		this._trigger("start", event);
    +
    +		$(options.appendTo).append(this.helper);
    +		// position helper (lasso)
    +		this.helper.css({
    +			"left": event.clientX,
    +			"top": event.clientY,
    +			"width": 0,
    +			"height": 0
    +		});
    +
    +		if (options.autoRefresh) {
    +			this.refresh();
    +		}
    +
    +		this.selectees.filter('.ui-selected').each(function() {
    +			var selectee = $.data(this, "selectable-item");
    +			selectee.startselected = true;
    +			if (!event.metaKey && !event.ctrlKey) {
    +				selectee.$element.removeClass('ui-selected');
    +				selectee.selected = false;
    +				selectee.$element.addClass('ui-unselecting');
    +				selectee.unselecting = true;
    +				// selectable UNSELECTING callback
    +				that._trigger("unselecting", event, {
    +					unselecting: selectee.element
    +				});
    +			}
    +		});
    +
    +		$(event.target).parents().andSelf().each(function() {
    +			var selectee = $.data(this, "selectable-item");
    +			if (selectee) {
    +				var doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass('ui-selected');
    +				selectee.$element
    +					.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
    +					.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
    +				selectee.unselecting = !doSelect;
    +				selectee.selecting = doSelect;
    +				selectee.selected = doSelect;
    +				// selectable (UN)SELECTING callback
    +				if (doSelect) {
    +					that._trigger("selecting", event, {
    +						selecting: selectee.element
    +					});
    +				} else {
    +					that._trigger("unselecting", event, {
    +						unselecting: selectee.element
    +					});
    +				}
    +				return false;
    +			}
    +		});
    +
    +	},
    +
    +	_mouseDrag: function(event) {
    +		var that = this;
    +		this.dragged = true;
    +
    +		if (this.options.disabled)
    +			return;
    +
    +		var options = this.options;
    +
    +		var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
    +		if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
    +		if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
    +		this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
    +
    +		this.selectees.each(function() {
    +			var selectee = $.data(this, "selectable-item");
    +			//prevent helper from being selected if appendTo: selectable
    +			if (!selectee || selectee.element == that.element[0])
    +				return;
    +			var hit = false;
    +			if (options.tolerance == 'touch') {
    +				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
    +			} else if (options.tolerance == 'fit') {
    +				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
    +			}
    +
    +			if (hit) {
    +				// SELECT
    +				if (selectee.selected) {
    +					selectee.$element.removeClass('ui-selected');
    +					selectee.selected = false;
    +				}
    +				if (selectee.unselecting) {
    +					selectee.$element.removeClass('ui-unselecting');
    +					selectee.unselecting = false;
    +				}
    +				if (!selectee.selecting) {
    +					selectee.$element.addClass('ui-selecting');
    +					selectee.selecting = true;
    +					// selectable SELECTING callback
    +					that._trigger("selecting", event, {
    +						selecting: selectee.element
    +					});
    +				}
    +			} else {
    +				// UNSELECT
    +				if (selectee.selecting) {
    +					if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
    +						selectee.$element.removeClass('ui-selecting');
    +						selectee.selecting = false;
    +						selectee.$element.addClass('ui-selected');
    +						selectee.selected = true;
    +					} else {
    +						selectee.$element.removeClass('ui-selecting');
    +						selectee.selecting = false;
    +						if (selectee.startselected) {
    +							selectee.$element.addClass('ui-unselecting');
    +							selectee.unselecting = true;
    +						}
    +						// selectable UNSELECTING callback
    +						that._trigger("unselecting", event, {
    +							unselecting: selectee.element
    +						});
    +					}
    +				}
    +				if (selectee.selected) {
    +					if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
    +						selectee.$element.removeClass('ui-selected');
    +						selectee.selected = false;
    +
    +						selectee.$element.addClass('ui-unselecting');
    +						selectee.unselecting = true;
    +						// selectable UNSELECTING callback
    +						that._trigger("unselecting", event, {
    +							unselecting: selectee.element
    +						});
    +					}
    +				}
    +			}
    +		});
    +
    +		return false;
    +	},
    +
    +	_mouseStop: function(event) {
    +		var that = this;
    +
    +		this.dragged = false;
    +
    +		var options = this.options;
    +
    +		$('.ui-unselecting', this.element[0]).each(function() {
    +			var selectee = $.data(this, "selectable-item");
    +			selectee.$element.removeClass('ui-unselecting');
    +			selectee.unselecting = false;
    +			selectee.startselected = false;
    +			that._trigger("unselected", event, {
    +				unselected: selectee.element
    +			});
    +		});
    +		$('.ui-selecting', this.element[0]).each(function() {
    +			var selectee = $.data(this, "selectable-item");
    +			selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
    +			selectee.selecting = false;
    +			selectee.selected = true;
    +			selectee.startselected = true;
    +			that._trigger("selected", event, {
    +				selected: selectee.element
    +			});
    +		});
    +		this._trigger("stop", event);
    +
    +		this.helper.remove();
    +
    +		return false;
    +	}
    +
    +});
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.widget("ui.sortable", $.ui.mouse, {
    +	version: "1.9.2",
    +	widgetEventPrefix: "sort",
    +	ready: false,
    +	options: {
    +		appendTo: "parent",
    +		axis: false,
    +		connectWith: false,
    +		containment: false,
    +		cursor: 'auto',
    +		cursorAt: false,
    +		dropOnEmpty: true,
    +		forcePlaceholderSize: false,
    +		forceHelperSize: false,
    +		grid: false,
    +		handle: false,
    +		helper: "original",
    +		items: '> *',
    +		opacity: false,
    +		placeholder: false,
    +		revert: false,
    +		scroll: true,
    +		scrollSensitivity: 20,
    +		scrollSpeed: 20,
    +		scope: "default",
    +		tolerance: "intersect",
    +		zIndex: 1000
    +	},
    +	_create: function() {
    +
    +		var o = this.options;
    +		this.containerCache = {};
    +		this.element.addClass("ui-sortable");
    +
    +		//Get the items
    +		this.refresh();
    +
    +		//Let's determine if the items are being displayed horizontally
    +		this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
    +
    +		//Let's determine the parent's offset
    +		this.offset = this.element.offset();
    +
    +		//Initialize mouse events for interaction
    +		this._mouseInit();
    +
    +		//We're ready to go
    +		this.ready = true
    +
    +	},
    +
    +	_destroy: function() {
    +		this.element
    +			.removeClass("ui-sortable ui-sortable-disabled");
    +		this._mouseDestroy();
    +
    +		for ( var i = this.items.length - 1; i >= 0; i-- )
    +			this.items[i].item.removeData(this.widgetName + "-item");
    +
    +		return this;
    +	},
    +
    +	_setOption: function(key, value){
    +		if ( key === "disabled" ) {
    +			this.options[ key ] = value;
    +
    +			this.widget().toggleClass( "ui-sortable-disabled", !!value );
    +		} else {
    +			// Don't call widget base _setOption for disable as it adds ui-state-disabled class
    +			$.Widget.prototype._setOption.apply(this, arguments);
    +		}
    +	},
    +
    +	_mouseCapture: function(event, overrideHandle) {
    +		var that = this;
    +
    +		if (this.reverting) {
    +			return false;
    +		}
    +
    +		if(this.options.disabled || this.options.type == 'static') return false;
    +
    +		//We have to refresh the items data once first
    +		this._refreshItems(event);
    +
    +		//Find out if the clicked node (or one of its parents) is a actual item in this.items
    +		var currentItem = null, nodes = $(event.target).parents().each(function() {
    +			if($.data(this, that.widgetName + '-item') == that) {
    +				currentItem = $(this);
    +				return false;
    +			}
    +		});
    +		if($.data(event.target, that.widgetName + '-item') == that) currentItem = $(event.target);
    +
    +		if(!currentItem) return false;
    +		if(this.options.handle && !overrideHandle) {
    +			var validHandle = false;
    +
    +			$(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
    +			if(!validHandle) return false;
    +		}
    +
    +		this.currentItem = currentItem;
    +		this._removeCurrentsFromItems();
    +		return true;
    +
    +	},
    +
    +	_mouseStart: function(event, overrideHandle, noActivation) {
    +
    +		var o = this.options;
    +		this.currentContainer = this;
    +
    +		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
    +		this.refreshPositions();
    +
    +		//Create and append the visible helper
    +		this.helper = this._createHelper(event);
    +
    +		//Cache the helper size
    +		this._cacheHelperProportions();
    +
    +		/*
    +		 * - Position generation -
    +		 * This block generates everything position related - it's the core of draggables.
    +		 */
    +
    +		//Cache the margins of the original element
    +		this._cacheMargins();
    +
    +		//Get the next scrolling parent
    +		this.scrollParent = this.helper.scrollParent();
    +
    +		//The element's absolute position on the page minus margins
    +		this.offset = this.currentItem.offset();
    +		this.offset = {
    +			top: this.offset.top - this.margins.top,
    +			left: this.offset.left - this.margins.left
    +		};
    +
    +		$.extend(this.offset, {
    +			click: { //Where the click happened, relative to the element
    +				left: event.pageX - this.offset.left,
    +				top: event.pageY - this.offset.top
    +			},
    +			parent: this._getParentOffset(),
    +			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
    +		});
    +
    +		// Only after we got the offset, we can change the helper's position to absolute
    +		// TODO: Still need to figure out a way to make relative sorting possible
    +		this.helper.css("position", "absolute");
    +		this.cssPosition = this.helper.css("position");
    +
    +		//Generate the original position
    +		this.originalPosition = this._generatePosition(event);
    +		this.originalPageX = event.pageX;
    +		this.originalPageY = event.pageY;
    +
    +		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
    +		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
    +
    +		//Cache the former DOM position
    +		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
    +
    +		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
    +		if(this.helper[0] != this.currentItem[0]) {
    +			this.currentItem.hide();
    +		}
    +
    +		//Create the placeholder
    +		this._createPlaceholder();
    +
    +		//Set a containment if given in the options
    +		if(o.containment)
    +			this._setContainment();
    +
    +		if(o.cursor) { // cursor option
    +			if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
    +			$('body').css("cursor", o.cursor);
    +		}
    +
    +		if(o.opacity) { // opacity option
    +			if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
    +			this.helper.css("opacity", o.opacity);
    +		}
    +
    +		if(o.zIndex) { // zIndex option
    +			if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
    +			this.helper.css("zIndex", o.zIndex);
    +		}
    +
    +		//Prepare scrolling
    +		if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
    +			this.overflowOffset = this.scrollParent.offset();
    +
    +		//Call callbacks
    +		this._trigger("start", event, this._uiHash());
    +
    +		//Recache the helper size
    +		if(!this._preserveHelperProportions)
    +			this._cacheHelperProportions();
    +
    +
    +		//Post 'activate' events to possible containers
    +		if(!noActivation) {
    +			 for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, this._uiHash(this)); }
    +		}
    +
    +		//Prepare possible droppables
    +		if($.ui.ddmanager)
    +			$.ui.ddmanager.current = this;
    +
    +		if ($.ui.ddmanager && !o.dropBehaviour)
    +			$.ui.ddmanager.prepareOffsets(this, event);
    +
    +		this.dragging = true;
    +
    +		this.helper.addClass("ui-sortable-helper");
    +		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
    +		return true;
    +
    +	},
    +
    +	_mouseDrag: function(event) {
    +
    +		//Compute the helpers position
    +		this.position = this._generatePosition(event);
    +		this.positionAbs = this._convertPositionTo("absolute");
    +
    +		if (!this.lastPositionAbs) {
    +			this.lastPositionAbs = this.positionAbs;
    +		}
    +
    +		//Do scrolling
    +		if(this.options.scroll) {
    +			var o = this.options, scrolled = false;
    +			if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
    +
    +				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
    +					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
    +				else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
    +					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
    +
    +				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
    +					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
    +				else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
    +					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
    +
    +			} else {
    +
    +				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
    +					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
    +				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
    +					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
    +
    +				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
    +					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
    +				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
    +					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
    +
    +			}
    +
    +			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
    +				$.ui.ddmanager.prepareOffsets(this, event);
    +		}
    +
    +		//Regenerate the absolute position used for position checks
    +		this.positionAbs = this._convertPositionTo("absolute");
    +
    +		//Set the helper position
    +		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
    +		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
    +
    +		//Rearrange
    +		for (var i = this.items.length - 1; i >= 0; i--) {
    +
    +			//Cache variables and intersection, continue if no intersection
    +			var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
    +			if (!intersection) continue;
    +
    +			// Only put the placeholder inside the current Container, skip all
    +			// items form other containers. This works because when moving
    +			// an item from one container to another the
    +			// currentContainer is switched before the placeholder is moved.
    +			//
    +			// Without this moving items in "sub-sortables" can cause the placeholder to jitter
    +			// beetween the outer and inner container.
    +			if (item.instance !== this.currentContainer) continue;
    +
    +			if (itemElement != this.currentItem[0] //cannot intersect with itself
    +				&&	this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
    +				&&	!$.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
    +				&& (this.options.type == 'semi-dynamic' ? !$.contains(this.element[0], itemElement) : true)
    +				//&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
    +			) {
    +
    +				this.direction = intersection == 1 ? "down" : "up";
    +
    +				if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
    +					this._rearrange(event, item);
    +				} else {
    +					break;
    +				}
    +
    +				this._trigger("change", event, this._uiHash());
    +				break;
    +			}
    +		}
    +
    +		//Post events to containers
    +		this._contactContainers(event);
    +
    +		//Interconnect with droppables
    +		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
    +
    +		//Call callbacks
    +		this._trigger('sort', event, this._uiHash());
    +
    +		this.lastPositionAbs = this.positionAbs;
    +		return false;
    +
    +	},
    +
    +	_mouseStop: function(event, noPropagation) {
    +
    +		if(!event) return;
    +
    +		//If we are using droppables, inform the manager about the drop
    +		if ($.ui.ddmanager && !this.options.dropBehaviour)
    +			$.ui.ddmanager.drop(this, event);
    +
    +		if(this.options.revert) {
    +			var that = this;
    +			var cur = this.placeholder.offset();
    +
    +			this.reverting = true;
    +
    +			$(this.helper).animate({
    +				left: cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
    +				top: cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
    +			}, parseInt(this.options.revert, 10) || 500, function() {
    +				that._clear(event);
    +			});
    +		} else {
    +			this._clear(event, noPropagation);
    +		}
    +
    +		return false;
    +
    +	},
    +
    +	cancel: function() {
    +
    +		if(this.dragging) {
    +
    +			this._mouseUp({ target: null });
    +
    +			if(this.options.helper == "original")
    +				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
    +			else
    +				this.currentItem.show();
    +
    +			//Post deactivating events to containers
    +			for (var i = this.containers.length - 1; i >= 0; i--){
    +				this.containers[i]._trigger("deactivate", null, this._uiHash(this));
    +				if(this.containers[i].containerCache.over) {
    +					this.containers[i]._trigger("out", null, this._uiHash(this));
    +					this.containers[i].containerCache.over = 0;
    +				}
    +			}
    +
    +		}
    +
    +		if (this.placeholder) {
    +			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
    +			if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
    +			if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
    +
    +			$.extend(this, {
    +				helper: null,
    +				dragging: false,
    +				reverting: false,
    +				_noFinalSort: null
    +			});
    +
    +			if(this.domPosition.prev) {
    +				$(this.domPosition.prev).after(this.currentItem);
    +			} else {
    +				$(this.domPosition.parent).prepend(this.currentItem);
    +			}
    +		}
    +
    +		return this;
    +
    +	},
    +
    +	serialize: function(o) {
    +
    +		var items = this._getItemsAsjQuery(o && o.connected);
    +		var str = []; o = o || {};
    +
    +		$(items).each(function() {
    +			var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
    +			if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
    +		});
    +
    +		if(!str.length && o.key) {
    +			str.push(o.key + '=');
    +		}
    +
    +		return str.join('&');
    +
    +	},
    +
    +	toArray: function(o) {
    +
    +		var items = this._getItemsAsjQuery(o && o.connected);
    +		var ret = []; o = o || {};
    +
    +		items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
    +		return ret;
    +
    +	},
    +
    +	/* Be careful with the following core functions */
    +	_intersectsWith: function(item) {
    +
    +		var x1 = this.positionAbs.left,
    +			x2 = x1 + this.helperProportions.width,
    +			y1 = this.positionAbs.top,
    +			y2 = y1 + this.helperProportions.height;
    +
    +		var l = item.left,
    +			r = l + item.width,
    +			t = item.top,
    +			b = t + item.height;
    +
    +		var dyClick = this.offset.click.top,
    +			dxClick = this.offset.click.left;
    +
    +		var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
    +
    +		if(	   this.options.tolerance == "pointer"
    +			|| this.options.forcePointerForContainers
    +			|| (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
    +		) {
    +			return isOverElement;
    +		} else {
    +
    +			return (l < x1 + (this.helperProportions.width / 2) // Right Half
    +				&& x2 - (this.helperProportions.width / 2) < r // Left Half
    +				&& t < y1 + (this.helperProportions.height / 2) // Bottom Half
    +				&& y2 - (this.helperProportions.height / 2) < b ); // Top Half
    +
    +		}
    +	},
    +
    +	_intersectsWithPointer: function(item) {
    +
    +		var isOverElementHeight = (this.options.axis === 'x') || $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
    +			isOverElementWidth = (this.options.axis === 'y') || $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
    +			isOverElement = isOverElementHeight && isOverElementWidth,
    +			verticalDirection = this._getDragVerticalDirection(),
    +			horizontalDirection = this._getDragHorizontalDirection();
    +
    +		if (!isOverElement)
    +			return false;
    +
    +		return this.floating ?
    +			( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
    +			: ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
    +
    +	},
    +
    +	_intersectsWithSides: function(item) {
    +
    +		var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
    +			isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
    +			verticalDirection = this._getDragVerticalDirection(),
    +			horizontalDirection = this._getDragHorizontalDirection();
    +
    +		if (this.floating && horizontalDirection) {
    +			return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
    +		} else {
    +			return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
    +		}
    +
    +	},
    +
    +	_getDragVerticalDirection: function() {
    +		var delta = this.positionAbs.top - this.lastPositionAbs.top;
    +		return delta != 0 && (delta > 0 ? "down" : "up");
    +	},
    +
    +	_getDragHorizontalDirection: function() {
    +		var delta = this.positionAbs.left - this.lastPositionAbs.left;
    +		return delta != 0 && (delta > 0 ? "right" : "left");
    +	},
    +
    +	refresh: function(event) {
    +		this._refreshItems(event);
    +		this.refreshPositions();
    +		return this;
    +	},
    +
    +	_connectWith: function() {
    +		var options = this.options;
    +		return options.connectWith.constructor == String
    +			? [options.connectWith]
    +			: options.connectWith;
    +	},
    +
    +	_getItemsAsjQuery: function(connected) {
    +
    +		var items = [];
    +		var queries = [];
    +		var connectWith = this._connectWith();
    +
    +		if(connectWith && connected) {
    +			for (var i = connectWith.length - 1; i >= 0; i--){
    +				var cur = $(connectWith[i]);
    +				for (var j = cur.length - 1; j >= 0; j--){
    +					var inst = $.data(cur[j], this.widgetName);
    +					if(inst && inst != this && !inst.options.disabled) {
    +						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
    +					}
    +				};
    +			};
    +		}
    +
    +		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
    +
    +		for (var i = queries.length - 1; i >= 0; i--){
    +			queries[i][0].each(function() {
    +				items.push(this);
    +			});
    +		};
    +
    +		return $(items);
    +
    +	},
    +
    +	_removeCurrentsFromItems: function() {
    +
    +		var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
    +
    +		this.items = $.grep(this.items, function (item) {
    +			for (var j=0; j < list.length; j++) {
    +				if(list[j] == item.item[0])
    +					return false;
    +			};
    +			return true;
    +		});
    +
    +	},
    +
    +	_refreshItems: function(event) {
    +
    +		this.items = [];
    +		this.containers = [this];
    +		var items = this.items;
    +		var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
    +		var connectWith = this._connectWith();
    +
    +		if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
    +			for (var i = connectWith.length - 1; i >= 0; i--){
    +				var cur = $(connectWith[i]);
    +				for (var j = cur.length - 1; j >= 0; j--){
    +					var inst = $.data(cur[j], this.widgetName);
    +					if(inst && inst != this && !inst.options.disabled) {
    +						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
    +						this.containers.push(inst);
    +					}
    +				};
    +			};
    +		}
    +
    +		for (var i = queries.length - 1; i >= 0; i--) {
    +			var targetData = queries[i][1];
    +			var _queries = queries[i][0];
    +
    +			for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
    +				var item = $(_queries[j]);
    +
    +				item.data(this.widgetName + '-item', targetData); // Data for target checking (mouse manager)
    +
    +				items.push({
    +					item: item,
    +					instance: targetData,
    +					width: 0, height: 0,
    +					left: 0, top: 0
    +				});
    +			};
    +		};
    +
    +	},
    +
    +	refreshPositions: function(fast) {
    +
    +		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
    +		if(this.offsetParent && this.helper) {
    +			this.offset.parent = this._getParentOffset();
    +		}
    +
    +		for (var i = this.items.length - 1; i >= 0; i--){
    +			var item = this.items[i];
    +
    +			//We ignore calculating positions of all connected containers when we're not over them
    +			if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
    +				continue;
    +
    +			var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
    +
    +			if (!fast) {
    +				item.width = t.outerWidth();
    +				item.height = t.outerHeight();
    +			}
    +
    +			var p = t.offset();
    +			item.left = p.left;
    +			item.top = p.top;
    +		};
    +
    +		if(this.options.custom && this.options.custom.refreshContainers) {
    +			this.options.custom.refreshContainers.call(this);
    +		} else {
    +			for (var i = this.containers.length - 1; i >= 0; i--){
    +				var p = this.containers[i].element.offset();
    +				this.containers[i].containerCache.left = p.left;
    +				this.containers[i].containerCache.top = p.top;
    +				this.containers[i].containerCache.width	= this.containers[i].element.outerWidth();
    +				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
    +			};
    +		}
    +
    +		return this;
    +	},
    +
    +	_createPlaceholder: function(that) {
    +		that = that || this;
    +		var o = that.options;
    +
    +		if(!o.placeholder || o.placeholder.constructor == String) {
    +			var className = o.placeholder;
    +			o.placeholder = {
    +				element: function() {
    +
    +					var el = $(document.createElement(that.currentItem[0].nodeName))
    +						.addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
    +						.removeClass("ui-sortable-helper")[0];
    +
    +					if(!className)
    +						el.style.visibility = "hidden";
    +
    +					return el;
    +				},
    +				update: function(container, p) {
    +
    +					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
    +					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
    +					if(className && !o.forcePlaceholderSize) return;
    +
    +					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
    +					if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css('paddingTop')||0, 10) - parseInt(that.currentItem.css('paddingBottom')||0, 10)); };
    +					if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css('paddingLeft')||0, 10) - parseInt(that.currentItem.css('paddingRight')||0, 10)); };
    +				}
    +			};
    +		}
    +
    +		//Create the placeholder
    +		that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
    +
    +		//Append it after the actual current item
    +		that.currentItem.after(that.placeholder);
    +
    +		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
    +		o.placeholder.update(that, that.placeholder);
    +
    +	},
    +
    +	_contactContainers: function(event) {
    +
    +		// get innermost container that intersects with item
    +		var innermostContainer = null, innermostIndex = null;
    +
    +
    +		for (var i = this.containers.length - 1; i >= 0; i--){
    +
    +			// never consider a container that's located within the item itself
    +			if($.contains(this.currentItem[0], this.containers[i].element[0]))
    +				continue;
    +
    +			if(this._intersectsWith(this.containers[i].containerCache)) {
    +
    +				// if we've already found a container and it's more "inner" than this, then continue
    +				if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0]))
    +					continue;
    +
    +				innermostContainer = this.containers[i];
    +				innermostIndex = i;
    +
    +			} else {
    +				// container doesn't intersect. trigger "out" event if necessary
    +				if(this.containers[i].containerCache.over) {
    +					this.containers[i]._trigger("out", event, this._uiHash(this));
    +					this.containers[i].containerCache.over = 0;
    +				}
    +			}
    +
    +		}
    +
    +		// if no intersecting containers found, return
    +		if(!innermostContainer) return;
    +
    +		// move the item into the container if it's not there already
    +		if(this.containers.length === 1) {
    +			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
    +			this.containers[innermostIndex].containerCache.over = 1;
    +		} else {
    +
    +			//When entering a new container, we will find the item with the least distance and append our item near it
    +			var dist = 10000; var itemWithLeastDistance = null;
    +			var posProperty = this.containers[innermostIndex].floating ? 'left' : 'top';
    +			var sizeProperty = this.containers[innermostIndex].floating ? 'width' : 'height';
    +			var base = this.positionAbs[posProperty] + this.offset.click[posProperty];
    +			for (var j = this.items.length - 1; j >= 0; j--) {
    +				if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
    +				if(this.items[j].item[0] == this.currentItem[0]) continue;
    +				var cur = this.items[j].item.offset()[posProperty];
    +				var nearBottom = false;
    +				if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
    +					nearBottom = true;
    +					cur += this.items[j][sizeProperty];
    +				}
    +
    +				if(Math.abs(cur - base) < dist) {
    +					dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
    +					this.direction = nearBottom ? "up": "down";
    +				}
    +			}
    +
    +			if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
    +				return;
    +
    +			this.currentContainer = this.containers[innermostIndex];
    +			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
    +			this._trigger("change", event, this._uiHash());
    +			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
    +
    +			//Update the placeholder
    +			this.options.placeholder.update(this.currentContainer, this.placeholder);
    +
    +			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
    +			this.containers[innermostIndex].containerCache.over = 1;
    +		}
    +
    +
    +	},
    +
    +	_createHelper: function(event) {
    +
    +		var o = this.options;
    +		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
    +
    +		if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
    +			$(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
    +
    +		if(helper[0] == this.currentItem[0])
    +			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
    +
    +		if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
    +		if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
    +
    +		return helper;
    +
    +	},
    +
    +	_adjustOffsetFromHelper: function(obj) {
    +		if (typeof obj == 'string') {
    +			obj = obj.split(' ');
    +		}
    +		if ($.isArray(obj)) {
    +			obj = {left: +obj[0], top: +obj[1] || 0};
    +		}
    +		if ('left' in obj) {
    +			this.offset.click.left = obj.left + this.margins.left;
    +		}
    +		if ('right' in obj) {
    +			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
    +		}
    +		if ('top' in obj) {
    +			this.offset.click.top = obj.top + this.margins.top;
    +		}
    +		if ('bottom' in obj) {
    +			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
    +		}
    +	},
    +
    +	_getParentOffset: function() {
    +
    +
    +		//Get the offsetParent and cache its position
    +		this.offsetParent = this.helper.offsetParent();
    +		var po = this.offsetParent.offset();
    +
    +		// This is a special case where we need to modify a offset calculated on start, since the following happened:
    +		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
    +		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
    +		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
    +		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
    +			po.left += this.scrollParent.scrollLeft();
    +			po.top += this.scrollParent.scrollTop();
    +		}
    +
    +		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
    +		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
    +			po = { top: 0, left: 0 };
    +
    +		return {
    +			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
    +			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
    +		};
    +
    +	},
    +
    +	_getRelativeOffset: function() {
    +
    +		if(this.cssPosition == "relative") {
    +			var p = this.currentItem.position();
    +			return {
    +				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
    +				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
    +			};
    +		} else {
    +			return { top: 0, left: 0 };
    +		}
    +
    +	},
    +
    +	_cacheMargins: function() {
    +		this.margins = {
    +			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
    +			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
    +		};
    +	},
    +
    +	_cacheHelperProportions: function() {
    +		this.helperProportions = {
    +			width: this.helper.outerWidth(),
    +			height: this.helper.outerHeight()
    +		};
    +	},
    +
    +	_setContainment: function() {
    +
    +		var o = this.options;
    +		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
    +		if(o.containment == 'document' || o.containment == 'window') this.containment = [
    +			0 - this.offset.relative.left - this.offset.parent.left,
    +			0 - this.offset.relative.top - this.offset.parent.top,
    +			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
    +			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
    +		];
    +
    +		if(!(/^(document|window|parent)$/).test(o.containment)) {
    +			var ce = $(o.containment)[0];
    +			var co = $(o.containment).offset();
    +			var over = ($(ce).css("overflow") != 'hidden');
    +
    +			this.containment = [
    +				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
    +				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
    +				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
    +				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
    +			];
    +		}
    +
    +	},
    +
    +	_convertPositionTo: function(d, pos) {
    +
    +		if(!pos) pos = this.position;
    +		var mod = d == "absolute" ? 1 : -1;
    +		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
    +
    +		return {
    +			top: (
    +				pos.top																	// The absolute mouse position
    +				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
    +				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
    +				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
    +			),
    +			left: (
    +				pos.left																// The absolute mouse position
    +				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
    +				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
    +				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
    +			)
    +		};
    +
    +	},
    +
    +	_generatePosition: function(event) {
    +
    +		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
    +
    +		// This is another very weird special case that only happens for relative elements:
    +		// 1. If the css position is relative
    +		// 2. and the scroll parent is the document or similar to the offset parent
    +		// we have to refresh the relative offset during the scroll so there are no jumps
    +		if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
    +			this.offset.relative = this._getRelativeOffset();
    +		}
    +
    +		var pageX = event.pageX;
    +		var pageY = event.pageY;
    +
    +		/*
    +		 * - Position constraining -
    +		 * Constrain the position to a mix of grid, containment.
    +		 */
    +
    +		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
    +
    +			if(this.containment) {
    +				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
    +				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
    +				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
    +				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
    +			}
    +
    +			if(o.grid) {
    +				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
    +				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
    +
    +				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
    +				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
    +			}
    +
    +		}
    +
    +		return {
    +			top: (
    +				pageY																// The absolute mouse position
    +				- this.offset.click.top													// Click offset (relative to the element)
    +				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
    +				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
    +				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
    +			),
    +			left: (
    +				pageX																// The absolute mouse position
    +				- this.offset.click.left												// Click offset (relative to the element)
    +				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
    +				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
    +				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
    +			)
    +		};
    +
    +	},
    +
    +	_rearrange: function(event, i, a, hardRefresh) {
    +
    +		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
    +
    +		//Various things done here to improve the performance:
    +		// 1. we create a setTimeout, that calls refreshPositions
    +		// 2. on the instance, we have a counter variable, that get's higher after every append
    +		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
    +		// 4. this lets only the last addition to the timeout stack through
    +		this.counter = this.counter ? ++this.counter : 1;
    +		var counter = this.counter;
    +
    +		this._delay(function() {
    +			if(counter == this.counter) this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
    +		});
    +
    +	},
    +
    +	_clear: function(event, noPropagation) {
    +
    +		this.reverting = false;
    +		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
    +		// everything else normalized again
    +		var delayedTriggers = [];
    +
    +		// We first have to update the dom position of the actual currentItem
    +		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
    +		if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
    +		this._noFinalSort = null;
    +
    +		if(this.helper[0] == this.currentItem[0]) {
    +			for(var i in this._storedCSS) {
    +				if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
    +			}
    +			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
    +		} else {
    +			this.currentItem.show();
    +		}
    +
    +		if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
    +		if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
    +
    +		// Check if the items Container has Changed and trigger appropriate
    +		// events.
    +		if (this !== this.currentContainer) {
    +			if(!noPropagation) {
    +				delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
    +				delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
    +				delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
    +			}
    +		}
    +
    +
    +		//Post events to containers
    +		for (var i = this.containers.length - 1; i >= 0; i--){
    +			if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
    +			if(this.containers[i].containerCache.over) {
    +				delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
    +				this.containers[i].containerCache.over = 0;
    +			}
    +		}
    +
    +		//Do what was originally in plugins
    +		if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
    +		if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
    +		if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
    +
    +		this.dragging = false;
    +		if(this.cancelHelperRemoval) {
    +			if(!noPropagation) {
    +				this._trigger("beforeStop", event, this._uiHash());
    +				for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
    +				this._trigger("stop", event, this._uiHash());
    +			}
    +
    +			this.fromOutside = false;
    +			return false;
    +		}
    +
    +		if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
    +
    +		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
    +		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
    +
    +		if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
    +
    +		if(!noPropagation) {
    +			for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
    +			this._trigger("stop", event, this._uiHash());
    +		}
    +
    +		this.fromOutside = false;
    +		return true;
    +
    +	},
    +
    +	_trigger: function() {
    +		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
    +			this.cancel();
    +		}
    +	},
    +
    +	_uiHash: function(_inst) {
    +		var inst = _inst || this;
    +		return {
    +			helper: inst.helper,
    +			placeholder: inst.placeholder || $([]),
    +			position: inst.position,
    +			originalPosition: inst.originalPosition,
    +			offset: inst.positionAbs,
    +			item: inst.currentItem,
    +			sender: _inst ? _inst.element : null
    +		};
    +	}
    +
    +});
    +
    +})(jQuery);
    +
    +;(jQuery.effects || (function($, undefined) {
    +
    +var backCompat = $.uiBackCompat !== false,
    +	// prefix used for storing data on .data()
    +	dataSpace = "ui-effects-";
    +
    +$.effects = {
    +	effect: {}
    +};
    +
    +/*!
    + * jQuery Color Animations v2.0.0
    + * http://jquery.com/
    + *
    + * Copyright 2012 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * Date: Mon Aug 13 13:41:02 2012 -0500
    + */
    +(function( jQuery, undefined ) {
    +
    +	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor".split(" "),
    +
    +	// plusequals test for += 100 -= 100
    +	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
    +	// a set of RE's that can match strings and generate color tuples.
    +	stringParsers = [{
    +			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
    +			parse: function( execResult ) {
    +				return [
    +					execResult[ 1 ],
    +					execResult[ 2 ],
    +					execResult[ 3 ],
    +					execResult[ 4 ]
    +				];
    +			}
    +		}, {
    +			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
    +			parse: function( execResult ) {
    +				return [
    +					execResult[ 1 ] * 2.55,
    +					execResult[ 2 ] * 2.55,
    +					execResult[ 3 ] * 2.55,
    +					execResult[ 4 ]
    +				];
    +			}
    +		}, {
    +			// this regex ignores A-F because it's compared against an already lowercased string
    +			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
    +			parse: function( execResult ) {
    +				return [
    +					parseInt( execResult[ 1 ], 16 ),
    +					parseInt( execResult[ 2 ], 16 ),
    +					parseInt( execResult[ 3 ], 16 )
    +				];
    +			}
    +		}, {
    +			// this regex ignores A-F because it's compared against an already lowercased string
    +			re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
    +			parse: function( execResult ) {
    +				return [
    +					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
    +					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
    +					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
    +				];
    +			}
    +		}, {
    +			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
    +			space: "hsla",
    +			parse: function( execResult ) {
    +				return [
    +					execResult[ 1 ],
    +					execResult[ 2 ] / 100,
    +					execResult[ 3 ] / 100,
    +					execResult[ 4 ]
    +				];
    +			}
    +		}],
    +
    +	// jQuery.Color( )
    +	color = jQuery.Color = function( color, green, blue, alpha ) {
    +		return new jQuery.Color.fn.parse( color, green, blue, alpha );
    +	},
    +	spaces = {
    +		rgba: {
    +			props: {
    +				red: {
    +					idx: 0,
    +					type: "byte"
    +				},
    +				green: {
    +					idx: 1,
    +					type: "byte"
    +				},
    +				blue: {
    +					idx: 2,
    +					type: "byte"
    +				}
    +			}
    +		},
    +
    +		hsla: {
    +			props: {
    +				hue: {
    +					idx: 0,
    +					type: "degrees"
    +				},
    +				saturation: {
    +					idx: 1,
    +					type: "percent"
    +				},
    +				lightness: {
    +					idx: 2,
    +					type: "percent"
    +				}
    +			}
    +		}
    +	},
    +	propTypes = {
    +		"byte": {
    +			floor: true,
    +			max: 255
    +		},
    +		"percent": {
    +			max: 1
    +		},
    +		"degrees": {
    +			mod: 360,
    +			floor: true
    +		}
    +	},
    +	support = color.support = {},
    +
    +	// element for support tests
    +	supportElem = jQuery( "<p>" )[ 0 ],
    +
    +	// colors = jQuery.Color.names
    +	colors,
    +
    +	// local aliases of functions called often
    +	each = jQuery.each;
    +
    +// determine rgba support immediately
    +supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
    +support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
    +
    +// define cache name and alpha properties
    +// for rgba and hsla spaces
    +each( spaces, function( spaceName, space ) {
    +	space.cache = "_" + spaceName;
    +	space.props.alpha = {
    +		idx: 3,
    +		type: "percent",
    +		def: 1
    +	};
    +});
    +
    +function clamp( value, prop, allowEmpty ) {
    +	var type = propTypes[ prop.type ] || {};
    +
    +	if ( value == null ) {
    +		return (allowEmpty || !prop.def) ? null : prop.def;
    +	}
    +
    +	// ~~ is an short way of doing floor for positive numbers
    +	value = type.floor ? ~~value : parseFloat( value );
    +
    +	// IE will pass in empty strings as value for alpha,
    +	// which will hit this case
    +	if ( isNaN( value ) ) {
    +		return prop.def;
    +	}
    +
    +	if ( type.mod ) {
    +		// we add mod before modding to make sure that negatives values
    +		// get converted properly: -10 -> 350
    +		return (value + type.mod) % type.mod;
    +	}
    +
    +	// for now all property types without mod have min and max
    +	return 0 > value ? 0 : type.max < value ? type.max : value;
    +}
    +
    +function stringParse( string ) {
    +	var inst = color(),
    +		rgba = inst._rgba = [];
    +
    +	string = string.toLowerCase();
    +
    +	each( stringParsers, function( i, parser ) {
    +		var parsed,
    +			match = parser.re.exec( string ),
    +			values = match && parser.parse( match ),
    +			spaceName = parser.space || "rgba";
    +
    +		if ( values ) {
    +			parsed = inst[ spaceName ]( values );
    +
    +			// if this was an rgba parse the assignment might happen twice
    +			// oh well....
    +			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
    +			rgba = inst._rgba = parsed._rgba;
    +
    +			// exit each( stringParsers ) here because we matched
    +			return false;
    +		}
    +	});
    +
    +	// Found a stringParser that handled it
    +	if ( rgba.length ) {
    +
    +		// if this came from a parsed string, force "transparent" when alpha is 0
    +		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
    +		if ( rgba.join() === "0,0,0,0" ) {
    +			jQuery.extend( rgba, colors.transparent );
    +		}
    +		return inst;
    +	}
    +
    +	// named colors
    +	return colors[ string ];
    +}
    +
    +color.fn = jQuery.extend( color.prototype, {
    +	parse: function( red, green, blue, alpha ) {
    +		if ( red === undefined ) {
    +			this._rgba = [ null, null, null, null ];
    +			return this;
    +		}
    +		if ( red.jquery || red.nodeType ) {
    +			red = jQuery( red ).css( green );
    +			green = undefined;
    +		}
    +
    +		var inst = this,
    +			type = jQuery.type( red ),
    +			rgba = this._rgba = [];
    +
    +		// more than 1 argument specified - assume ( red, green, blue, alpha )
    +		if ( green !== undefined ) {
    +			red = [ red, green, blue, alpha ];
    +			type = "array";
    +		}
    +
    +		if ( type === "string" ) {
    +			return this.parse( stringParse( red ) || colors._default );
    +		}
    +
    +		if ( type === "array" ) {
    +			each( spaces.rgba.props, function( key, prop ) {
    +				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
    +			});
    +			return this;
    +		}
    +
    +		if ( type === "object" ) {
    +			if ( red instanceof color ) {
    +				each( spaces, function( spaceName, space ) {
    +					if ( red[ space.cache ] ) {
    +						inst[ space.cache ] = red[ space.cache ].slice();
    +					}
    +				});
    +			} else {
    +				each( spaces, function( spaceName, space ) {
    +					var cache = space.cache;
    +					each( space.props, function( key, prop ) {
    +
    +						// if the cache doesn't exist, and we know how to convert
    +						if ( !inst[ cache ] && space.to ) {
    +
    +							// if the value was null, we don't need to copy it
    +							// if the key was alpha, we don't need to copy it either
    +							if ( key === "alpha" || red[ key ] == null ) {
    +								return;
    +							}
    +							inst[ cache ] = space.to( inst._rgba );
    +						}
    +
    +						// this is the only case where we allow nulls for ALL properties.
    +						// call clamp with alwaysAllowEmpty
    +						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
    +					});
    +
    +					// everything defined but alpha?
    +					if ( inst[ cache ] && $.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
    +						// use the default of 1
    +						inst[ cache ][ 3 ] = 1;
    +						if ( space.from ) {
    +							inst._rgba = space.from( inst[ cache ] );
    +						}
    +					}
    +				});
    +			}
    +			return this;
    +		}
    +	},
    +	is: function( compare ) {
    +		var is = color( compare ),
    +			same = true,
    +			inst = this;
    +
    +		each( spaces, function( _, space ) {
    +			var localCache,
    +				isCache = is[ space.cache ];
    +			if (isCache) {
    +				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
    +				each( space.props, function( _, prop ) {
    +					if ( isCache[ prop.idx ] != null ) {
    +						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
    +						return same;
    +					}
    +				});
    +			}
    +			return same;
    +		});
    +		return same;
    +	},
    +	_space: function() {
    +		var used = [],
    +			inst = this;
    +		each( spaces, function( spaceName, space ) {
    +			if ( inst[ space.cache ] ) {
    +				used.push( spaceName );
    +			}
    +		});
    +		return used.pop();
    +	},
    +	transition: function( other, distance ) {
    +		var end = color( other ),
    +			spaceName = end._space(),
    +			space = spaces[ spaceName ],
    +			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
    +			start = startColor[ space.cache ] || space.to( startColor._rgba ),
    +			result = start.slice();
    +
    +		end = end[ space.cache ];
    +		each( space.props, function( key, prop ) {
    +			var index = prop.idx,
    +				startValue = start[ index ],
    +				endValue = end[ index ],
    +				type = propTypes[ prop.type ] || {};
    +
    +			// if null, don't override start value
    +			if ( endValue === null ) {
    +				return;
    +			}
    +			// if null - use end
    +			if ( startValue === null ) {
    +				result[ index ] = endValue;
    +			} else {
    +				if ( type.mod ) {
    +					if ( endValue - startValue > type.mod / 2 ) {
    +						startValue += type.mod;
    +					} else if ( startValue - endValue > type.mod / 2 ) {
    +						startValue -= type.mod;
    +					}
    +				}
    +				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
    +			}
    +		});
    +		return this[ spaceName ]( result );
    +	},
    +	blend: function( opaque ) {
    +		// if we are already opaque - return ourself
    +		if ( this._rgba[ 3 ] === 1 ) {
    +			return this;
    +		}
    +
    +		var rgb = this._rgba.slice(),
    +			a = rgb.pop(),
    +			blend = color( opaque )._rgba;
    +
    +		return color( jQuery.map( rgb, function( v, i ) {
    +			return ( 1 - a ) * blend[ i ] + a * v;
    +		}));
    +	},
    +	toRgbaString: function() {
    +		var prefix = "rgba(",
    +			rgba = jQuery.map( this._rgba, function( v, i ) {
    +				return v == null ? ( i > 2 ? 1 : 0 ) : v;
    +			});
    +
    +		if ( rgba[ 3 ] === 1 ) {
    +			rgba.pop();
    +			prefix = "rgb(";
    +		}
    +
    +		return prefix + rgba.join() + ")";
    +	},
    +	toHslaString: function() {
    +		var prefix = "hsla(",
    +			hsla = jQuery.map( this.hsla(), function( v, i ) {
    +				if ( v == null ) {
    +					v = i > 2 ? 1 : 0;
    +				}
    +
    +				// catch 1 and 2
    +				if ( i && i < 3 ) {
    +					v = Math.round( v * 100 ) + "%";
    +				}
    +				return v;
    +			});
    +
    +		if ( hsla[ 3 ] === 1 ) {
    +			hsla.pop();
    +			prefix = "hsl(";
    +		}
    +		return prefix + hsla.join() + ")";
    +	},
    +	toHexString: function( includeAlpha ) {
    +		var rgba = this._rgba.slice(),
    +			alpha = rgba.pop();
    +
    +		if ( includeAlpha ) {
    +			rgba.push( ~~( alpha * 255 ) );
    +		}
    +
    +		return "#" + jQuery.map( rgba, function( v ) {
    +
    +			// default to 0 when nulls exist
    +			v = ( v || 0 ).toString( 16 );
    +			return v.length === 1 ? "0" + v : v;
    +		}).join("");
    +	},
    +	toString: function() {
    +		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
    +	}
    +});
    +color.fn.parse.prototype = color.fn;
    +
    +// hsla conversions adapted from:
    +// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
    +
    +function hue2rgb( p, q, h ) {
    +	h = ( h + 1 ) % 1;
    +	if ( h * 6 < 1 ) {
    +		return p + (q - p) * h * 6;
    +	}
    +	if ( h * 2 < 1) {
    +		return q;
    +	}
    +	if ( h * 3 < 2 ) {
    +		return p + (q - p) * ((2/3) - h) * 6;
    +	}
    +	return p;
    +}
    +
    +spaces.hsla.to = function ( rgba ) {
    +	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
    +		return [ null, null, null, rgba[ 3 ] ];
    +	}
    +	var r = rgba[ 0 ] / 255,
    +		g = rgba[ 1 ] / 255,
    +		b = rgba[ 2 ] / 255,
    +		a = rgba[ 3 ],
    +		max = Math.max( r, g, b ),
    +		min = Math.min( r, g, b ),
    +		diff = max - min,
    +		add = max + min,
    +		l = add * 0.5,
    +		h, s;
    +
    +	if ( min === max ) {
    +		h = 0;
    +	} else if ( r === max ) {
    +		h = ( 60 * ( g - b ) / diff ) + 360;
    +	} else if ( g === max ) {
    +		h = ( 60 * ( b - r ) / diff ) + 120;
    +	} else {
    +		h = ( 60 * ( r - g ) / diff ) + 240;
    +	}
    +
    +	if ( l === 0 || l === 1 ) {
    +		s = l;
    +	} else if ( l <= 0.5 ) {
    +		s = diff / add;
    +	} else {
    +		s = diff / ( 2 - add );
    +	}
    +	return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
    +};
    +
    +spaces.hsla.from = function ( hsla ) {
    +	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
    +		return [ null, null, null, hsla[ 3 ] ];
    +	}
    +	var h = hsla[ 0 ] / 360,
    +		s = hsla[ 1 ],
    +		l = hsla[ 2 ],
    +		a = hsla[ 3 ],
    +		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
    +		p = 2 * l - q;
    +
    +	return [
    +		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
    +		Math.round( hue2rgb( p, q, h ) * 255 ),
    +		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
    +		a
    +	];
    +};
    +
    +
    +each( spaces, function( spaceName, space ) {
    +	var props = space.props,
    +		cache = space.cache,
    +		to = space.to,
    +		from = space.from;
    +
    +	// makes rgba() and hsla()
    +	color.fn[ spaceName ] = function( value ) {
    +
    +		// generate a cache for this space if it doesn't exist
    +		if ( to && !this[ cache ] ) {
    +			this[ cache ] = to( this._rgba );
    +		}
    +		if ( value === undefined ) {
    +			return this[ cache ].slice();
    +		}
    +
    +		var ret,
    +			type = jQuery.type( value ),
    +			arr = ( type === "array" || type === "object" ) ? value : arguments,
    +			local = this[ cache ].slice();
    +
    +		each( props, function( key, prop ) {
    +			var val = arr[ type === "object" ? key : prop.idx ];
    +			if ( val == null ) {
    +				val = local[ prop.idx ];
    +			}
    +			local[ prop.idx ] = clamp( val, prop );
    +		});
    +
    +		if ( from ) {
    +			ret = color( from( local ) );
    +			ret[ cache ] = local;
    +			return ret;
    +		} else {
    +			return color( local );
    +		}
    +	};
    +
    +	// makes red() green() blue() alpha() hue() saturation() lightness()
    +	each( props, function( key, prop ) {
    +		// alpha is included in more than one space
    +		if ( color.fn[ key ] ) {
    +			return;
    +		}
    +		color.fn[ key ] = function( value ) {
    +			var vtype = jQuery.type( value ),
    +				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
    +				local = this[ fn ](),
    +				cur = local[ prop.idx ],
    +				match;
    +
    +			if ( vtype === "undefined" ) {
    +				return cur;
    +			}
    +
    +			if ( vtype === "function" ) {
    +				value = value.call( this, cur );
    +				vtype = jQuery.type( value );
    +			}
    +			if ( value == null && prop.empty ) {
    +				return this;
    +			}
    +			if ( vtype === "string" ) {
    +				match = rplusequals.exec( value );
    +				if ( match ) {
    +					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
    +				}
    +			}
    +			local[ prop.idx ] = value;
    +			return this[ fn ]( local );
    +		};
    +	});
    +});
    +
    +// add .fx.step functions
    +each( stepHooks, function( i, hook ) {
    +	jQuery.cssHooks[ hook ] = {
    +		set: function( elem, value ) {
    +			var parsed, curElem,
    +				backgroundColor = "";
    +
    +			if ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) {
    +				value = color( parsed || value );
    +				if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
    +					curElem = hook === "backgroundColor" ? elem.parentNode : elem;
    +					while (
    +						(backgroundColor === "" || backgroundColor === "transparent") &&
    +						curElem && curElem.style
    +					) {
    +						try {
    +							backgroundColor = jQuery.css( curElem, "backgroundColor" );
    +							curElem = curElem.parentNode;
    +						} catch ( e ) {
    +						}
    +					}
    +
    +					value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
    +						backgroundColor :
    +						"_default" );
    +				}
    +
    +				value = value.toRgbaString();
    +			}
    +			try {
    +				elem.style[ hook ] = value;
    +			} catch( error ) {
    +				// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
    +			}
    +		}
    +	};
    +	jQuery.fx.step[ hook ] = function( fx ) {
    +		if ( !fx.colorInit ) {
    +			fx.start = color( fx.elem, hook );
    +			fx.end = color( fx.end );
    +			fx.colorInit = true;
    +		}
    +		jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
    +	};
    +});
    +
    +jQuery.cssHooks.borderColor = {
    +	expand: function( value ) {
    +		var expanded = {};
    +
    +		each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
    +			expanded[ "border" + part + "Color" ] = value;
    +		});
    +		return expanded;
    +	}
    +};
    +
    +// Basic color names only.
    +// Usage of any of the other color names requires adding yourself or including
    +// jquery.color.svg-names.js.
    +colors = jQuery.Color.names = {
    +	// 4.1. Basic color keywords
    +	aqua: "#00ffff",
    +	black: "#000000",
    +	blue: "#0000ff",
    +	fuchsia: "#ff00ff",
    +	gray: "#808080",
    +	green: "#008000",
    +	lime: "#00ff00",
    +	maroon: "#800000",
    +	navy: "#000080",
    +	olive: "#808000",
    +	purple: "#800080",
    +	red: "#ff0000",
    +	silver: "#c0c0c0",
    +	teal: "#008080",
    +	white: "#ffffff",
    +	yellow: "#ffff00",
    +
    +	// 4.2.3. "transparent" color keyword
    +	transparent: [ null, null, null, 0 ],
    +
    +	_default: "#ffffff"
    +};
    +
    +})( jQuery );
    +
    +
    +
    +/******************************************************************************/
    +/****************************** CLASS ANIMATIONS ******************************/
    +/******************************************************************************/
    +(function() {
    +
    +var classAnimationActions = [ "add", "remove", "toggle" ],
    +	shorthandStyles = {
    +		border: 1,
    +		borderBottom: 1,
    +		borderColor: 1,
    +		borderLeft: 1,
    +		borderRight: 1,
    +		borderTop: 1,
    +		borderWidth: 1,
    +		margin: 1,
    +		padding: 1
    +	};
    +
    +$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
    +	$.fx.step[ prop ] = function( fx ) {
    +		if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
    +			jQuery.style( fx.elem, prop, fx.end );
    +			fx.setAttr = true;
    +		}
    +	};
    +});
    +
    +function getElementStyles() {
    +	var style = this.ownerDocument.defaultView ?
    +			this.ownerDocument.defaultView.getComputedStyle( this, null ) :
    +			this.currentStyle,
    +		newStyle = {},
    +		key,
    +		len;
    +
    +	// webkit enumerates style porperties
    +	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
    +		len = style.length;
    +		while ( len-- ) {
    +			key = style[ len ];
    +			if ( typeof style[ key ] === "string" ) {
    +				newStyle[ $.camelCase( key ) ] = style[ key ];
    +			}
    +		}
    +	} else {
    +		for ( key in style ) {
    +			if ( typeof style[ key ] === "string" ) {
    +				newStyle[ key ] = style[ key ];
    +			}
    +		}
    +	}
    +
    +	return newStyle;
    +}
    +
    +
    +function styleDifference( oldStyle, newStyle ) {
    +	var diff = {},
    +		name, value;
    +
    +	for ( name in newStyle ) {
    +		value = newStyle[ name ];
    +		if ( oldStyle[ name ] !== value ) {
    +			if ( !shorthandStyles[ name ] ) {
    +				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
    +					diff[ name ] = value;
    +				}
    +			}
    +		}
    +	}
    +
    +	return diff;
    +}
    +
    +$.effects.animateClass = function( value, duration, easing, callback ) {
    +	var o = $.speed( duration, easing, callback );
    +
    +	return this.queue( function() {
    +		var animated = $( this ),
    +			baseClass = animated.attr( "class" ) || "",
    +			applyClassChange,
    +			allAnimations = o.children ? animated.find( "*" ).andSelf() : animated;
    +
    +		// map the animated objects to store the original styles.
    +		allAnimations = allAnimations.map(function() {
    +			var el = $( this );
    +			return {
    +				el: el,
    +				start: getElementStyles.call( this )
    +			};
    +		});
    +
    +		// apply class change
    +		applyClassChange = function() {
    +			$.each( classAnimationActions, function(i, action) {
    +				if ( value[ action ] ) {
    +					animated[ action + "Class" ]( value[ action ] );
    +				}
    +			});
    +		};
    +		applyClassChange();
    +
    +		// map all animated objects again - calculate new styles and diff
    +		allAnimations = allAnimations.map(function() {
    +			this.end = getElementStyles.call( this.el[ 0 ] );
    +			this.diff = styleDifference( this.start, this.end );
    +			return this;
    +		});
    +
    +		// apply original class
    +		animated.attr( "class", baseClass );
    +
    +		// map all animated objects again - this time collecting a promise
    +		allAnimations = allAnimations.map(function() {
    +			var styleInfo = this,
    +				dfd = $.Deferred(),
    +				opts = jQuery.extend({}, o, {
    +					queue: false,
    +					complete: function() {
    +						dfd.resolve( styleInfo );
    +					}
    +				});
    +
    +			this.el.animate( this.diff, opts );
    +			return dfd.promise();
    +		});
    +
    +		// once all animations have completed:
    +		$.when.apply( $, allAnimations.get() ).done(function() {
    +
    +			// set the final class
    +			applyClassChange();
    +
    +			// for each animated element,
    +			// clear all css properties that were animated
    +			$.each( arguments, function() {
    +				var el = this.el;
    +				$.each( this.diff, function(key) {
    +					el.css( key, '' );
    +				});
    +			});
    +
    +			// this is guarnteed to be there if you use jQuery.speed()
    +			// it also handles dequeuing the next anim...
    +			o.complete.call( animated[ 0 ] );
    +		});
    +	});
    +};
    +
    +$.fn.extend({
    +	_addClass: $.fn.addClass,
    +	addClass: function( classNames, speed, easing, callback ) {
    +		return speed ?
    +			$.effects.animateClass.call( this,
    +				{ add: classNames }, speed, easing, callback ) :
    +			this._addClass( classNames );
    +	},
    +
    +	_removeClass: $.fn.removeClass,
    +	removeClass: function( classNames, speed, easing, callback ) {
    +		return speed ?
    +			$.effects.animateClass.call( this,
    +				{ remove: classNames }, speed, easing, callback ) :
    +			this._removeClass( classNames );
    +	},
    +
    +	_toggleClass: $.fn.toggleClass,
    +	toggleClass: function( classNames, force, speed, easing, callback ) {
    +		if ( typeof force === "boolean" || force === undefined ) {
    +			if ( !speed ) {
    +				// without speed parameter
    +				return this._toggleClass( classNames, force );
    +			} else {
    +				return $.effects.animateClass.call( this,
    +					(force ? { add: classNames } : { remove: classNames }),
    +					speed, easing, callback );
    +			}
    +		} else {
    +			// without force parameter
    +			return $.effects.animateClass.call( this,
    +				{ toggle: classNames }, force, speed, easing );
    +		}
    +	},
    +
    +	switchClass: function( remove, add, speed, easing, callback) {
    +		return $.effects.animateClass.call( this, {
    +			add: add,
    +			remove: remove
    +		}, speed, easing, callback );
    +	}
    +});
    +
    +})();
    +
    +/******************************************************************************/
    +/*********************************** EFFECTS **********************************/
    +/******************************************************************************/
    +
    +(function() {
    +
    +$.extend( $.effects, {
    +	version: "1.9.2",
    +
    +	// Saves a set of properties in a data storage
    +	save: function( element, set ) {
    +		for( var i=0; i < set.length; i++ ) {
    +			if ( set[ i ] !== null ) {
    +				element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
    +			}
    +		}
    +	},
    +
    +	// Restores a set of previously saved properties from a data storage
    +	restore: function( element, set ) {
    +		var val, i;
    +		for( i=0; i < set.length; i++ ) {
    +			if ( set[ i ] !== null ) {
    +				val = element.data( dataSpace + set[ i ] );
    +				// support: jQuery 1.6.2
    +				// http://bugs.jquery.com/ticket/9917
    +				// jQuery 1.6.2 incorrectly returns undefined for any falsy value.
    +				// We can't differentiate between "" and 0 here, so we just assume
    +				// empty string since it's likely to be a more common value...
    +				if ( val === undefined ) {
    +					val = "";
    +				}
    +				element.css( set[ i ], val );
    +			}
    +		}
    +	},
    +
    +	setMode: function( el, mode ) {
    +		if (mode === "toggle") {
    +			mode = el.is( ":hidden" ) ? "show" : "hide";
    +		}
    +		return mode;
    +	},
    +
    +	// Translates a [top,left] array into a baseline value
    +	// this should be a little more flexible in the future to handle a string & hash
    +	getBaseline: function( origin, original ) {
    +		var y, x;
    +		switch ( origin[ 0 ] ) {
    +			case "top": y = 0; break;
    +			case "middle": y = 0.5; break;
    +			case "bottom": y = 1; break;
    +			default: y = origin[ 0 ] / original.height;
    +		}
    +		switch ( origin[ 1 ] ) {
    +			case "left": x = 0; break;
    +			case "center": x = 0.5; break;
    +			case "right": x = 1; break;
    +			default: x = origin[ 1 ] / original.width;
    +		}
    +		return {
    +			x: x,
    +			y: y
    +		};
    +	},
    +
    +	// Wraps the element around a wrapper that copies position properties
    +	createWrapper: function( element ) {
    +
    +		// if the element is already wrapped, return it
    +		if ( element.parent().is( ".ui-effects-wrapper" )) {
    +			return element.parent();
    +		}
    +
    +		// wrap the element
    +		var props = {
    +				width: element.outerWidth(true),
    +				height: element.outerHeight(true),
    +				"float": element.css( "float" )
    +			},
    +			wrapper = $( "<div></div>" )
    +				.addClass( "ui-effects-wrapper" )
    +				.css({
    +					fontSize: "100%",
    +					background: "transparent",
    +					border: "none",
    +					margin: 0,
    +					padding: 0
    +				}),
    +			// Store the size in case width/height are defined in % - Fixes #5245
    +			size = {
    +				width: element.width(),
    +				height: element.height()
    +			},
    +			active = document.activeElement;
    +
    +		// support: Firefox
    +		// Firefox incorrectly exposes anonymous content
    +		// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
    +		try {
    +			active.id;
    +		} catch( e ) {
    +			active = document.body;
    +		}
    +
    +		element.wrap( wrapper );
    +
    +		// Fixes #7595 - Elements lose focus when wrapped.
    +		if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
    +			$( active ).focus();
    +		}
    +
    +		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
    +
    +		// transfer positioning properties to the wrapper
    +		if ( element.css( "position" ) === "static" ) {
    +			wrapper.css({ position: "relative" });
    +			element.css({ position: "relative" });
    +		} else {
    +			$.extend( props, {
    +				position: element.css( "position" ),
    +				zIndex: element.css( "z-index" )
    +			});
    +			$.each([ "top", "left", "bottom", "right" ], function(i, pos) {
    +				props[ pos ] = element.css( pos );
    +				if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
    +					props[ pos ] = "auto";
    +				}
    +			});
    +			element.css({
    +				position: "relative",
    +				top: 0,
    +				left: 0,
    +				right: "auto",
    +				bottom: "auto"
    +			});
    +		}
    +		element.css(size);
    +
    +		return wrapper.css( props ).show();
    +	},
    +
    +	removeWrapper: function( element ) {
    +		var active = document.activeElement;
    +
    +		if ( element.parent().is( ".ui-effects-wrapper" ) ) {
    +			element.parent().replaceWith( element );
    +
    +			// Fixes #7595 - Elements lose focus when wrapped.
    +			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
    +				$( active ).focus();
    +			}
    +		}
    +
    +
    +		return element;
    +	},
    +
    +	setTransition: function( element, list, factor, value ) {
    +		value = value || {};
    +		$.each( list, function( i, x ) {
    +			var unit = element.cssUnit( x );
    +			if ( unit[ 0 ] > 0 ) {
    +				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
    +			}
    +		});
    +		return value;
    +	}
    +});
    +
    +// return an effect options object for the given parameters:
    +function _normalizeArguments( effect, options, speed, callback ) {
    +
    +	// allow passing all options as the first parameter
    +	if ( $.isPlainObject( effect ) ) {
    +		options = effect;
    +		effect = effect.effect;
    +	}
    +
    +	// convert to an object
    +	effect = { effect: effect };
    +
    +	// catch (effect, null, ...)
    +	if ( options == null ) {
    +		options = {};
    +	}
    +
    +	// catch (effect, callback)
    +	if ( $.isFunction( options ) ) {
    +		callback = options;
    +		speed = null;
    +		options = {};
    +	}
    +
    +	// catch (effect, speed, ?)
    +	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
    +		callback = speed;
    +		speed = options;
    +		options = {};
    +	}
    +
    +	// catch (effect, options, callback)
    +	if ( $.isFunction( speed ) ) {
    +		callback = speed;
    +		speed = null;
    +	}
    +
    +	// add options to effect
    +	if ( options ) {
    +		$.extend( effect, options );
    +	}
    +
    +	speed = speed || options.duration;
    +	effect.duration = $.fx.off ? 0 :
    +		typeof speed === "number" ? speed :
    +		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
    +		$.fx.speeds._default;
    +
    +	effect.complete = callback || options.complete;
    +
    +	return effect;
    +}
    +
    +function standardSpeed( speed ) {
    +	// valid standard speeds
    +	if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
    +		return true;
    +	}
    +
    +	// invalid strings - treat as "normal" speed
    +	if ( typeof speed === "string" && !$.effects.effect[ speed ] ) {
    +		// TODO: remove in 2.0 (#7115)
    +		if ( backCompat && $.effects[ speed ] ) {
    +			return false;
    +		}
    +		return true;
    +	}
    +
    +	return false;
    +}
    +
    +$.fn.extend({
    +	effect: function( /* effect, options, speed, callback */ ) {
    +		var args = _normalizeArguments.apply( this, arguments ),
    +			mode = args.mode,
    +			queue = args.queue,
    +			effectMethod = $.effects.effect[ args.effect ],
    +
    +			// DEPRECATED: remove in 2.0 (#7115)
    +			oldEffectMethod = !effectMethod && backCompat && $.effects[ args.effect ];
    +
    +		if ( $.fx.off || !( effectMethod || oldEffectMethod ) ) {
    +			// delegate to the original method (e.g., .show()) if possible
    +			if ( mode ) {
    +				return this[ mode ]( args.duration, args.complete );
    +			} else {
    +				return this.each( function() {
    +					if ( args.complete ) {
    +						args.complete.call( this );
    +					}
    +				});
    +			}
    +		}
    +
    +		function run( next ) {
    +			var elem = $( this ),
    +				complete = args.complete,
    +				mode = args.mode;
    +
    +			function done() {
    +				if ( $.isFunction( complete ) ) {
    +					complete.call( elem[0] );
    +				}
    +				if ( $.isFunction( next ) ) {
    +					next();
    +				}
    +			}
    +
    +			// if the element is hiddden and mode is hide,
    +			// or element is visible and mode is show
    +			if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
    +				done();
    +			} else {
    +				effectMethod.call( elem[0], args, done );
    +			}
    +		}
    +
    +		// TODO: remove this check in 2.0, effectMethod will always be true
    +		if ( effectMethod ) {
    +			return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
    +		} else {
    +			// DEPRECATED: remove in 2.0 (#7115)
    +			return oldEffectMethod.call(this, {
    +				options: args,
    +				duration: args.duration,
    +				callback: args.complete,
    +				mode: args.mode
    +			});
    +		}
    +	},
    +
    +	_show: $.fn.show,
    +	show: function( speed ) {
    +		if ( standardSpeed( speed ) ) {
    +			return this._show.apply( this, arguments );
    +		} else {
    +			var args = _normalizeArguments.apply( this, arguments );
    +			args.mode = "show";
    +			return this.effect.call( this, args );
    +		}
    +	},
    +
    +	_hide: $.fn.hide,
    +	hide: function( speed ) {
    +		if ( standardSpeed( speed ) ) {
    +			return this._hide.apply( this, arguments );
    +		} else {
    +			var args = _normalizeArguments.apply( this, arguments );
    +			args.mode = "hide";
    +			return this.effect.call( this, args );
    +		}
    +	},
    +
    +	// jQuery core overloads toggle and creates _toggle
    +	__toggle: $.fn.toggle,
    +	toggle: function( speed ) {
    +		if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
    +			return this.__toggle.apply( this, arguments );
    +		} else {
    +			var args = _normalizeArguments.apply( this, arguments );
    +			args.mode = "toggle";
    +			return this.effect.call( this, args );
    +		}
    +	},
    +
    +	// helper functions
    +	cssUnit: function(key) {
    +		var style = this.css( key ),
    +			val = [];
    +
    +		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
    +			if ( style.indexOf( unit ) > 0 ) {
    +				val = [ parseFloat( style ), unit ];
    +			}
    +		});
    +		return val;
    +	}
    +});
    +
    +})();
    +
    +/******************************************************************************/
    +/*********************************** EASING ***********************************/
    +/******************************************************************************/
    +
    +(function() {
    +
    +// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
    +
    +var baseEasings = {};
    +
    +$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
    +	baseEasings[ name ] = function( p ) {
    +		return Math.pow( p, i + 2 );
    +	};
    +});
    +
    +$.extend( baseEasings, {
    +	Sine: function ( p ) {
    +		return 1 - Math.cos( p * Math.PI / 2 );
    +	},
    +	Circ: function ( p ) {
    +		return 1 - Math.sqrt( 1 - p * p );
    +	},
    +	Elastic: function( p ) {
    +		return p === 0 || p === 1 ? p :
    +			-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
    +	},
    +	Back: function( p ) {
    +		return p * p * ( 3 * p - 2 );
    +	},
    +	Bounce: function ( p ) {
    +		var pow2,
    +			bounce = 4;
    +
    +		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
    +		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
    +	}
    +});
    +
    +$.each( baseEasings, function( name, easeIn ) {
    +	$.easing[ "easeIn" + name ] = easeIn;
    +	$.easing[ "easeOut" + name ] = function( p ) {
    +		return 1 - easeIn( 1 - p );
    +	};
    +	$.easing[ "easeInOut" + name ] = function( p ) {
    +		return p < 0.5 ?
    +			easeIn( p * 2 ) / 2 :
    +			1 - easeIn( p * -2 + 2 ) / 2;
    +	};
    +});
    +
    +})();
    +
    +})(jQuery));
    +
    +(function( $, undefined ) {
    +
    +var uid = 0,
    +	hideProps = {},
    +	showProps = {};
    +
    +hideProps.height = hideProps.paddingTop = hideProps.paddingBottom =
    +	hideProps.borderTopWidth = hideProps.borderBottomWidth = "hide";
    +showProps.height = showProps.paddingTop = showProps.paddingBottom =
    +	showProps.borderTopWidth = showProps.borderBottomWidth = "show";
    +
    +$.widget( "ui.accordion", {
    +	version: "1.9.2",
    +	options: {
    +		active: 0,
    +		animate: {},
    +		collapsible: false,
    +		event: "click",
    +		header: "> li > :first-child,> :not(li):even",
    +		heightStyle: "auto",
    +		icons: {
    +			activeHeader: "ui-icon-triangle-1-s",
    +			header: "ui-icon-triangle-1-e"
    +		},
    +
    +		// callbacks
    +		activate: null,
    +		beforeActivate: null
    +	},
    +
    +	_create: function() {
    +		var accordionId = this.accordionId = "ui-accordion-" +
    +				(this.element.attr( "id" ) || ++uid),
    +			options = this.options;
    +
    +		this.prevShow = this.prevHide = $();
    +		this.element.addClass( "ui-accordion ui-widget ui-helper-reset" );
    +
    +		this.headers = this.element.find( options.header )
    +			.addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" );
    +		this._hoverable( this.headers );
    +		this._focusable( this.headers );
    +
    +		this.headers.next()
    +			.addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
    +			.hide();
    +
    +		// don't allow collapsible: false and active: false / null
    +		if ( !options.collapsible && (options.active === false || options.active == null) ) {
    +			options.active = 0;
    +		}
    +		// handle negative values
    +		if ( options.active < 0 ) {
    +			options.active += this.headers.length;
    +		}
    +		this.active = this._findActive( options.active )
    +			.addClass( "ui-accordion-header-active ui-state-active" )
    +			.toggleClass( "ui-corner-all ui-corner-top" );
    +		this.active.next()
    +			.addClass( "ui-accordion-content-active" )
    +			.show();
    +
    +		this._createIcons();
    +		this.refresh();
    +
    +		// ARIA
    +		this.element.attr( "role", "tablist" );
    +
    +		this.headers
    +			.attr( "role", "tab" )
    +			.each(function( i ) {
    +				var header = $( this ),
    +					headerId = header.attr( "id" ),
    +					panel = header.next(),
    +					panelId = panel.attr( "id" );
    +				if ( !headerId ) {
    +					headerId = accordionId + "-header-" + i;
    +					header.attr( "id", headerId );
    +				}
    +				if ( !panelId ) {
    +					panelId = accordionId + "-panel-" + i;
    +					panel.attr( "id", panelId );
    +				}
    +				header.attr( "aria-controls", panelId );
    +				panel.attr( "aria-labelledby", headerId );
    +			})
    +			.next()
    +				.attr( "role", "tabpanel" );
    +
    +		this.headers
    +			.not( this.active )
    +			.attr({
    +				"aria-selected": "false",
    +				tabIndex: -1
    +			})
    +			.next()
    +				.attr({
    +					"aria-expanded": "false",
    +					"aria-hidden": "true"
    +				})
    +				.hide();
    +
    +		// make sure at least one header is in the tab order
    +		if ( !this.active.length ) {
    +			this.headers.eq( 0 ).attr( "tabIndex", 0 );
    +		} else {
    +			this.active.attr({
    +				"aria-selected": "true",
    +				tabIndex: 0
    +			})
    +			.next()
    +				.attr({
    +					"aria-expanded": "true",
    +					"aria-hidden": "false"
    +				});
    +		}
    +
    +		this._on( this.headers, { keydown: "_keydown" });
    +		this._on( this.headers.next(), { keydown: "_panelKeyDown" });
    +		this._setupEvents( options.event );
    +	},
    +
    +	_getCreateEventData: function() {
    +		return {
    +			header: this.active,
    +			content: !this.active.length ? $() : this.active.next()
    +		};
    +	},
    +
    +	_createIcons: function() {
    +		var icons = this.options.icons;
    +		if ( icons ) {
    +			$( "<span>" )
    +				.addClass( "ui-accordion-header-icon ui-icon " + icons.header )
    +				.prependTo( this.headers );
    +			this.active.children( ".ui-accordion-header-icon" )
    +				.removeClass( icons.header )
    +				.addClass( icons.activeHeader );
    +			this.headers.addClass( "ui-accordion-icons" );
    +		}
    +	},
    +
    +	_destroyIcons: function() {
    +		this.headers
    +			.removeClass( "ui-accordion-icons" )
    +			.children( ".ui-accordion-header-icon" )
    +				.remove();
    +	},
    +
    +	_destroy: function() {
    +		var contents;
    +
    +		// clean up main element
    +		this.element
    +			.removeClass( "ui-accordion ui-widget ui-helper-reset" )
    +			.removeAttr( "role" );
    +
    +		// clean up headers
    +		this.headers
    +			.removeClass( "ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
    +			.removeAttr( "role" )
    +			.removeAttr( "aria-selected" )
    +			.removeAttr( "aria-controls" )
    +			.removeAttr( "tabIndex" )
    +			.each(function() {
    +				if ( /^ui-accordion/.test( this.id ) ) {
    +					this.removeAttribute( "id" );
    +				}
    +			});
    +		this._destroyIcons();
    +
    +		// clean up content panels
    +		contents = this.headers.next()
    +			.css( "display", "" )
    +			.removeAttr( "role" )
    +			.removeAttr( "aria-expanded" )
    +			.removeAttr( "aria-hidden" )
    +			.removeAttr( "aria-labelledby" )
    +			.removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled" )
    +			.each(function() {
    +				if ( /^ui-accordion/.test( this.id ) ) {
    +					this.removeAttribute( "id" );
    +				}
    +			});
    +		if ( this.options.heightStyle !== "content" ) {
    +			contents.css( "height", "" );
    +		}
    +	},
    +
    +	_setOption: function( key, value ) {
    +		if ( key === "active" ) {
    +			// _activate() will handle invalid values and update this.options
    +			this._activate( value );
    +			return;
    +		}
    +
    +		if ( key === "event" ) {
    +			if ( this.options.event ) {
    +				this._off( this.headers, this.options.event );
    +			}
    +			this._setupEvents( value );
    +		}
    +
    +		this._super( key, value );
    +
    +		// setting collapsible: false while collapsed; open first panel
    +		if ( key === "collapsible" && !value && this.options.active === false ) {
    +			this._activate( 0 );
    +		}
    +
    +		if ( key === "icons" ) {
    +			this._destroyIcons();
    +			if ( value ) {
    +				this._createIcons();
    +			}
    +		}
    +
    +		// #5332 - opacity doesn't cascade to positioned elements in IE
    +		// so we need to add the disabled class to the headers and panels
    +		if ( key === "disabled" ) {
    +			this.headers.add( this.headers.next() )
    +				.toggleClass( "ui-state-disabled", !!value );
    +		}
    +	},
    +
    +	_keydown: function( event ) {
    +		if ( event.altKey || event.ctrlKey ) {
    +			return;
    +		}
    +
    +		var keyCode = $.ui.keyCode,
    +			length = this.headers.length,
    +			currentIndex = this.headers.index( event.target ),
    +			toFocus = false;
    +
    +		switch ( event.keyCode ) {
    +			case keyCode.RIGHT:
    +			case keyCode.DOWN:
    +				toFocus = this.headers[ ( currentIndex + 1 ) % length ];
    +				break;
    +			case keyCode.LEFT:
    +			case keyCode.UP:
    +				toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
    +				break;
    +			case keyCode.SPACE:
    +			case keyCode.ENTER:
    +				this._eventHandler( event );
    +				break;
    +			case keyCode.HOME:
    +				toFocus = this.headers[ 0 ];
    +				break;
    +			case keyCode.END:
    +				toFocus = this.headers[ length - 1 ];
    +				break;
    +		}
    +
    +		if ( toFocus ) {
    +			$( event.target ).attr( "tabIndex", -1 );
    +			$( toFocus ).attr( "tabIndex", 0 );
    +			toFocus.focus();
    +			event.preventDefault();
    +		}
    +	},
    +
    +	_panelKeyDown : function( event ) {
    +		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
    +			$( event.currentTarget ).prev().focus();
    +		}
    +	},
    +
    +	refresh: function() {
    +		var maxHeight, overflow,
    +			heightStyle = this.options.heightStyle,
    +			parent = this.element.parent();
    +
    +
    +		if ( heightStyle === "fill" ) {
    +			// IE 6 treats height like minHeight, so we need to turn off overflow
    +			// in order to get a reliable height
    +			// we use the minHeight support test because we assume that only
    +			// browsers that don't support minHeight will treat height as minHeight
    +			if ( !$.support.minHeight ) {
    +				overflow = parent.css( "overflow" );
    +				parent.css( "overflow", "hidden");
    +			}
    +			maxHeight = parent.height();
    +			this.element.siblings( ":visible" ).each(function() {
    +				var elem = $( this ),
    +					position = elem.css( "position" );
    +
    +				if ( position === "absolute" || position === "fixed" ) {
    +					return;
    +				}
    +				maxHeight -= elem.outerHeight( true );
    +			});
    +			if ( overflow ) {
    +				parent.css( "overflow", overflow );
    +			}
    +
    +			this.headers.each(function() {
    +				maxHeight -= $( this ).outerHeight( true );
    +			});
    +
    +			this.headers.next()
    +				.each(function() {
    +					$( this ).height( Math.max( 0, maxHeight -
    +						$( this ).innerHeight() + $( this ).height() ) );
    +				})
    +				.css( "overflow", "auto" );
    +		} else if ( heightStyle === "auto" ) {
    +			maxHeight = 0;
    +			this.headers.next()
    +				.each(function() {
    +					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
    +				})
    +				.height( maxHeight );
    +		}
    +	},
    +
    +	_activate: function( index ) {
    +		var active = this._findActive( index )[ 0 ];
    +
    +		// trying to activate the already active panel
    +		if ( active === this.active[ 0 ] ) {
    +			return;
    +		}
    +
    +		// trying to collapse, simulate a click on the currently active header
    +		active = active || this.active[ 0 ];
    +
    +		this._eventHandler({
    +			target: active,
    +			currentTarget: active,
    +			preventDefault: $.noop
    +		});
    +	},
    +
    +	_findActive: function( selector ) {
    +		return typeof selector === "number" ? this.headers.eq( selector ) : $();
    +	},
    +
    +	_setupEvents: function( event ) {
    +		var events = {};
    +		if ( !event ) {
    +			return;
    +		}
    +		$.each( event.split(" "), function( index, eventName ) {
    +			events[ eventName ] = "_eventHandler";
    +		});
    +		this._on( this.headers, events );
    +	},
    +
    +	_eventHandler: function( event ) {
    +		var options = this.options,
    +			active = this.active,
    +			clicked = $( event.currentTarget ),
    +			clickedIsActive = clicked[ 0 ] === active[ 0 ],
    +			collapsing = clickedIsActive && options.collapsible,
    +			toShow = collapsing ? $() : clicked.next(),
    +			toHide = active.next(),
    +			eventData = {
    +				oldHeader: active,
    +				oldPanel: toHide,
    +				newHeader: collapsing ? $() : clicked,
    +				newPanel: toShow
    +			};
    +
    +		event.preventDefault();
    +
    +		if (
    +				// click on active header, but not collapsible
    +				( clickedIsActive && !options.collapsible ) ||
    +				// allow canceling activation
    +				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
    +			return;
    +		}
    +
    +		options.active = collapsing ? false : this.headers.index( clicked );
    +
    +		// when the call to ._toggle() comes after the class changes
    +		// it causes a very odd bug in IE 8 (see #6720)
    +		this.active = clickedIsActive ? $() : clicked;
    +		this._toggle( eventData );
    +
    +		// switch classes
    +		// corner classes on the previously active header stay after the animation
    +		active.removeClass( "ui-accordion-header-active ui-state-active" );
    +		if ( options.icons ) {
    +			active.children( ".ui-accordion-header-icon" )
    +				.removeClass( options.icons.activeHeader )
    +				.addClass( options.icons.header );
    +		}
    +
    +		if ( !clickedIsActive ) {
    +			clicked
    +				.removeClass( "ui-corner-all" )
    +				.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
    +			if ( options.icons ) {
    +				clicked.children( ".ui-accordion-header-icon" )
    +					.removeClass( options.icons.header )
    +					.addClass( options.icons.activeHeader );
    +			}
    +
    +			clicked
    +				.next()
    +				.addClass( "ui-accordion-content-active" );
    +		}
    +	},
    +
    +	_toggle: function( data ) {
    +		var toShow = data.newPanel,
    +			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
    +
    +		// handle activating a panel during the animation for another activation
    +		this.prevShow.add( this.prevHide ).stop( true, true );
    +		this.prevShow = toShow;
    +		this.prevHide = toHide;
    +
    +		if ( this.options.animate ) {
    +			this._animate( toShow, toHide, data );
    +		} else {
    +			toHide.hide();
    +			toShow.show();
    +			this._toggleComplete( data );
    +		}
    +
    +		toHide.attr({
    +			"aria-expanded": "false",
    +			"aria-hidden": "true"
    +		});
    +		toHide.prev().attr( "aria-selected", "false" );
    +		// if we're switching panels, remove the old header from the tab order
    +		// if we're opening from collapsed state, remove the previous header from the tab order
    +		// if we're collapsing, then keep the collapsing header in the tab order
    +		if ( toShow.length && toHide.length ) {
    +			toHide.prev().attr( "tabIndex", -1 );
    +		} else if ( toShow.length ) {
    +			this.headers.filter(function() {
    +				return $( this ).attr( "tabIndex" ) === 0;
    +			})
    +			.attr( "tabIndex", -1 );
    +		}
    +
    +		toShow
    +			.attr({
    +				"aria-expanded": "true",
    +				"aria-hidden": "false"
    +			})
    +			.prev()
    +				.attr({
    +					"aria-selected": "true",
    +					tabIndex: 0
    +				});
    +	},
    +
    +	_animate: function( toShow, toHide, data ) {
    +		var total, easing, duration,
    +			that = this,
    +			adjust = 0,
    +			down = toShow.length &&
    +				( !toHide.length || ( toShow.index() < toHide.index() ) ),
    +			animate = this.options.animate || {},
    +			options = down && animate.down || animate,
    +			complete = function() {
    +				that._toggleComplete( data );
    +			};
    +
    +		if ( typeof options === "number" ) {
    +			duration = options;
    +		}
    +		if ( typeof options === "string" ) {
    +			easing = options;
    +		}
    +		// fall back from options to animation in case of partial down settings
    +		easing = easing || options.easing || animate.easing;
    +		duration = duration || options.duration || animate.duration;
    +
    +		if ( !toHide.length ) {
    +			return toShow.animate( showProps, duration, easing, complete );
    +		}
    +		if ( !toShow.length ) {
    +			return toHide.animate( hideProps, duration, easing, complete );
    +		}
    +
    +		total = toShow.show().outerHeight();
    +		toHide.animate( hideProps, {
    +			duration: duration,
    +			easing: easing,
    +			step: function( now, fx ) {
    +				fx.now = Math.round( now );
    +			}
    +		});
    +		toShow
    +			.hide()
    +			.animate( showProps, {
    +				duration: duration,
    +				easing: easing,
    +				complete: complete,
    +				step: function( now, fx ) {
    +					fx.now = Math.round( now );
    +					if ( fx.prop !== "height" ) {
    +						adjust += fx.now;
    +					} else if ( that.options.heightStyle !== "content" ) {
    +						fx.now = Math.round( total - toHide.outerHeight() - adjust );
    +						adjust = 0;
    +					}
    +				}
    +			});
    +	},
    +
    +	_toggleComplete: function( data ) {
    +		var toHide = data.oldPanel;
    +
    +		toHide
    +			.removeClass( "ui-accordion-content-active" )
    +			.prev()
    +				.removeClass( "ui-corner-top" )
    +				.addClass( "ui-corner-all" );
    +
    +		// Work around for rendering bug in IE (#5421)
    +		if ( toHide.length ) {
    +			toHide.parent()[0].className = toHide.parent()[0].className;
    +		}
    +
    +		this._trigger( "activate", null, data );
    +	}
    +});
    +
    +
    +
    +// DEPRECATED
    +if ( $.uiBackCompat !== false ) {
    +	// navigation options
    +	(function( $, prototype ) {
    +		$.extend( prototype.options, {
    +			navigation: false,
    +			navigationFilter: function() {
    +				return this.href.toLowerCase() === location.href.toLowerCase();
    +			}
    +		});
    +
    +		var _create = prototype._create;
    +		prototype._create = function() {
    +			if ( this.options.navigation ) {
    +				var that = this,
    +					headers = this.element.find( this.options.header ),
    +					content = headers.next(),
    +					current = headers.add( content )
    +						.find( "a" )
    +						.filter( this.options.navigationFilter )
    +						[ 0 ];
    +				if ( current ) {
    +					headers.add( content ).each( function( index ) {
    +						if ( $.contains( this, current ) ) {
    +							that.options.active = Math.floor( index / 2 );
    +							return false;
    +						}
    +					});
    +				}
    +			}
    +			_create.call( this );
    +		};
    +	}( jQuery, jQuery.ui.accordion.prototype ) );
    +
    +	// height options
    +	(function( $, prototype ) {
    +		$.extend( prototype.options, {
    +			heightStyle: null, // remove default so we fall back to old values
    +			autoHeight: true, // use heightStyle: "auto"
    +			clearStyle: false, // use heightStyle: "content"
    +			fillSpace: false // use heightStyle: "fill"
    +		});
    +
    +		var _create = prototype._create,
    +			_setOption = prototype._setOption;
    +
    +		$.extend( prototype, {
    +			_create: function() {
    +				this.options.heightStyle = this.options.heightStyle ||
    +					this._mergeHeightStyle();
    +
    +				_create.call( this );
    +			},
    +
    +			_setOption: function( key ) {
    +				if ( key === "autoHeight" || key === "clearStyle" || key === "fillSpace" ) {
    +					this.options.heightStyle = this._mergeHeightStyle();
    +				}
    +				_setOption.apply( this, arguments );
    +			},
    +
    +			_mergeHeightStyle: function() {
    +				var options = this.options;
    +
    +				if ( options.fillSpace ) {
    +					return "fill";
    +				}
    +
    +				if ( options.clearStyle ) {
    +					return "content";
    +				}
    +
    +				if ( options.autoHeight ) {
    +					return "auto";
    +				}
    +			}
    +		});
    +	}( jQuery, jQuery.ui.accordion.prototype ) );
    +
    +	// icon options
    +	(function( $, prototype ) {
    +		$.extend( prototype.options.icons, {
    +			activeHeader: null, // remove default so we fall back to old values
    +			headerSelected: "ui-icon-triangle-1-s"
    +		});
    +
    +		var _createIcons = prototype._createIcons;
    +		prototype._createIcons = function() {
    +			if ( this.options.icons ) {
    +				this.options.icons.activeHeader = this.options.icons.activeHeader ||
    +					this.options.icons.headerSelected;
    +			}
    +			_createIcons.call( this );
    +		};
    +	}( jQuery, jQuery.ui.accordion.prototype ) );
    +
    +	// expanded active option, activate method
    +	(function( $, prototype ) {
    +		prototype.activate = prototype._activate;
    +
    +		var _findActive = prototype._findActive;
    +		prototype._findActive = function( index ) {
    +			if ( index === -1 ) {
    +				index = false;
    +			}
    +			if ( index && typeof index !== "number" ) {
    +				index = this.headers.index( this.headers.filter( index ) );
    +				if ( index === -1 ) {
    +					index = false;
    +				}
    +			}
    +			return _findActive.call( this, index );
    +		};
    +	}( jQuery, jQuery.ui.accordion.prototype ) );
    +
    +	// resize method
    +	jQuery.ui.accordion.prototype.resize = jQuery.ui.accordion.prototype.refresh;
    +
    +	// change events
    +	(function( $, prototype ) {
    +		$.extend( prototype.options, {
    +			change: null,
    +			changestart: null
    +		});
    +
    +		var _trigger = prototype._trigger;
    +		prototype._trigger = function( type, event, data ) {
    +			var ret = _trigger.apply( this, arguments );
    +			if ( !ret ) {
    +				return false;
    +			}
    +
    +			if ( type === "beforeActivate" ) {
    +				ret = _trigger.call( this, "changestart", event, {
    +					oldHeader: data.oldHeader,
    +					oldContent: data.oldPanel,
    +					newHeader: data.newHeader,
    +					newContent: data.newPanel
    +				});
    +			} else if ( type === "activate" ) {
    +				ret = _trigger.call( this, "change", event, {
    +					oldHeader: data.oldHeader,
    +					oldContent: data.oldPanel,
    +					newHeader: data.newHeader,
    +					newContent: data.newPanel
    +				});
    +			}
    +			return ret;
    +		};
    +	}( jQuery, jQuery.ui.accordion.prototype ) );
    +
    +	// animated option
    +	// NOTE: this only provides support for "slide", "bounceslide", and easings
    +	// not the full $.ui.accordion.animations API
    +	(function( $, prototype ) {
    +		$.extend( prototype.options, {
    +			animate: null,
    +			animated: "slide"
    +		});
    +
    +		var _create = prototype._create;
    +		prototype._create = function() {
    +			var options = this.options;
    +			if ( options.animate === null ) {
    +				if ( !options.animated ) {
    +					options.animate = false;
    +				} else if ( options.animated === "slide" ) {
    +					options.animate = 300;
    +				} else if ( options.animated === "bounceslide" ) {
    +					options.animate = {
    +						duration: 200,
    +						down: {
    +							easing: "easeOutBounce",
    +							duration: 1000
    +						}
    +					};
    +				} else {
    +					options.animate = options.animated;
    +				}
    +			}
    +
    +			_create.call( this );
    +		};
    +	}( jQuery, jQuery.ui.accordion.prototype ) );
    +}
    +
    +})( jQuery );
    +
    +(function( $, undefined ) {
    +
    +// used to prevent race conditions with remote data sources
    +var requestIndex = 0;
    +
    +$.widget( "ui.autocomplete", {
    +	version: "1.9.2",
    +	defaultElement: "<input>",
    +	options: {
    +		appendTo: "body",
    +		autoFocus: false,
    +		delay: 300,
    +		minLength: 1,
    +		position: {
    +			my: "left top",
    +			at: "left bottom",
    +			collision: "none"
    +		},
    +		source: null,
    +
    +		// callbacks
    +		change: null,
    +		close: null,
    +		focus: null,
    +		open: null,
    +		response: null,
    +		search: null,
    +		select: null
    +	},
    +
    +	pending: 0,
    +
    +	_create: function() {
    +		// Some browsers only repeat keydown events, not keypress events,
    +		// so we use the suppressKeyPress flag to determine if we've already
    +		// handled the keydown event. #7269
    +		// Unfortunately the code for & in keypress is the same as the up arrow,
    +		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
    +		// events when we know the keydown event was used to modify the
    +		// search term. #7799
    +		var suppressKeyPress, suppressKeyPressRepeat, suppressInput;
    +
    +		this.isMultiLine = this._isMultiLine();
    +		this.valueMethod = this.element[ this.element.is( "input,textarea" ) ? "val" : "text" ];
    +		this.isNewMenu = true;
    +
    +		this.element
    +			.addClass( "ui-autocomplete-input" )
    +			.attr( "autocomplete", "off" );
    +
    +		this._on( this.element, {
    +			keydown: function( event ) {
    +				if ( this.element.prop( "readOnly" ) ) {
    +					suppressKeyPress = true;
    +					suppressInput = true;
    +					suppressKeyPressRepeat = true;
    +					return;
    +				}
    +
    +				suppressKeyPress = false;
    +				suppressInput = false;
    +				suppressKeyPressRepeat = false;
    +				var keyCode = $.ui.keyCode;
    +				switch( event.keyCode ) {
    +				case keyCode.PAGE_UP:
    +					suppressKeyPress = true;
    +					this._move( "previousPage", event );
    +					break;
    +				case keyCode.PAGE_DOWN:
    +					suppressKeyPress = true;
    +					this._move( "nextPage", event );
    +					break;
    +				case keyCode.UP:
    +					suppressKeyPress = true;
    +					this._keyEvent( "previous", event );
    +					break;
    +				case keyCode.DOWN:
    +					suppressKeyPress = true;
    +					this._keyEvent( "next", event );
    +					break;
    +				case keyCode.ENTER:
    +				case keyCode.NUMPAD_ENTER:
    +					// when menu is open and has focus
    +					if ( this.menu.active ) {
    +						// #6055 - Opera still allows the keypress to occur
    +						// which causes forms to submit
    +						suppressKeyPress = true;
    +						event.preventDefault();
    +						this.menu.select( event );
    +					}
    +					break;
    +				case keyCode.TAB:
    +					if ( this.menu.active ) {
    +						this.menu.select( event );
    +					}
    +					break;
    +				case keyCode.ESCAPE:
    +					if ( this.menu.element.is( ":visible" ) ) {
    +						this._value( this.term );
    +						this.close( event );
    +						// Different browsers have different default behavior for escape
    +						// Single press can mean undo or clear
    +						// Double press in IE means clear the whole form
    +						event.preventDefault();
    +					}
    +					break;
    +				default:
    +					suppressKeyPressRepeat = true;
    +					// search timeout should be triggered before the input value is changed
    +					this._searchTimeout( event );
    +					break;
    +				}
    +			},
    +			keypress: function( event ) {
    +				if ( suppressKeyPress ) {
    +					suppressKeyPress = false;
    +					event.preventDefault();
    +					return;
    +				}
    +				if ( suppressKeyPressRepeat ) {
    +					return;
    +				}
    +
    +				// replicate some key handlers to allow them to repeat in Firefox and Opera
    +				var keyCode = $.ui.keyCode;
    +				switch( event.keyCode ) {
    +				case keyCode.PAGE_UP:
    +					this._move( "previousPage", event );
    +					break;
    +				case keyCode.PAGE_DOWN:
    +					this._move( "nextPage", event );
    +					break;
    +				case keyCode.UP:
    +					this._keyEvent( "previous", event );
    +					break;
    +				case keyCode.DOWN:
    +					this._keyEvent( "next", event );
    +					break;
    +				}
    +			},
    +			input: function( event ) {
    +				if ( suppressInput ) {
    +					suppressInput = false;
    +					event.preventDefault();
    +					return;
    +				}
    +				this._searchTimeout( event );
    +			},
    +			focus: function() {
    +				this.selectedItem = null;
    +				this.previous = this._value();
    +			},
    +			blur: function( event ) {
    +				if ( this.cancelBlur ) {
    +					delete this.cancelBlur;
    +					return;
    +				}
    +
    +				clearTimeout( this.searching );
    +				this.close( event );
    +				this._change( event );
    +			}
    +		});
    +
    +		this._initSource();
    +		this.menu = $( "<ul>" )
    +			.addClass( "ui-autocomplete" )
    +			.appendTo( this.document.find( this.options.appendTo || "body" )[ 0 ] )
    +			.menu({
    +				// custom key handling for now
    +				input: $(),
    +				// disable ARIA support, the live region takes care of that
    +				role: null
    +			})
    +			.zIndex( this.element.zIndex() + 1 )
    +			.hide()
    +			.data( "menu" );
    +
    +		this._on( this.menu.element, {
    +			mousedown: function( event ) {
    +				// prevent moving focus out of the text field
    +				event.preventDefault();
    +
    +				// IE doesn't prevent moving focus even with event.preventDefault()
    +				// so we set a flag to know when we should ignore the blur event
    +				this.cancelBlur = true;
    +				this._delay(function() {
    +					delete this.cancelBlur;
    +				});
    +
    +				// clicking on the scrollbar causes focus to shift to the body
    +				// but we can't detect a mouseup or a click immediately afterward
    +				// so we have to track the next mousedown and close the menu if
    +				// the user clicks somewhere outside of the autocomplete
    +				var menuElement = this.menu.element[ 0 ];
    +				if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
    +					this._delay(function() {
    +						var that = this;
    +						this.document.one( "mousedown", function( event ) {
    +							if ( event.target !== that.element[ 0 ] &&
    +									event.target !== menuElement &&
    +									!$.contains( menuElement, event.target ) ) {
    +								that.close();
    +							}
    +						});
    +					});
    +				}
    +			},
    +			menufocus: function( event, ui ) {
    +				// #7024 - Prevent accidental activation of menu items in Firefox
    +				if ( this.isNewMenu ) {
    +					this.isNewMenu = false;
    +					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
    +						this.menu.blur();
    +
    +						this.document.one( "mousemove", function() {
    +							$( event.target ).trigger( event.originalEvent );
    +						});
    +
    +						return;
    +					}
    +				}
    +
    +				// back compat for _renderItem using item.autocomplete, via #7810
    +				// TODO remove the fallback, see #8156
    +				var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" );
    +				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
    +					// use value to match what will end up in the input, if it was a key event
    +					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
    +						this._value( item.value );
    +					}
    +				} else {
    +					// Normally the input is populated with the item's value as the
    +					// menu is navigated, causing screen readers to notice a change and
    +					// announce the item. Since the focus event was canceled, this doesn't
    +					// happen, so we update the live region so that screen readers can
    +					// still notice the change and announce it.
    +					this.liveRegion.text( item.value );
    +				}
    +			},
    +			menuselect: function( event, ui ) {
    +				// back compat for _renderItem using item.autocomplete, via #7810
    +				// TODO remove the fallback, see #8156
    +				var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" ),
    +					previous = this.previous;
    +
    +				// only trigger when focus was lost (click on menu)
    +				if ( this.element[0] !== this.document[0].activeElement ) {
    +					this.element.focus();
    +					this.previous = previous;
    +					// #6109 - IE triggers two focus events and the second
    +					// is asynchronous, so we need to reset the previous
    +					// term synchronously and asynchronously :-(
    +					this._delay(function() {
    +						this.previous = previous;
    +						this.selectedItem = item;
    +					});
    +				}
    +
    +				if ( false !== this._trigger( "select", event, { item: item } ) ) {
    +					this._value( item.value );
    +				}
    +				// reset the term after the select event
    +				// this allows custom select handling to work properly
    +				this.term = this._value();
    +
    +				this.close( event );
    +				this.selectedItem = item;
    +			}
    +		});
    +
    +		this.liveRegion = $( "<span>", {
    +				role: "status",
    +				"aria-live": "polite"
    +			})
    +			.addClass( "ui-helper-hidden-accessible" )
    +			.insertAfter( this.element );
    +
    +		if ( $.fn.bgiframe ) {
    +			this.menu.element.bgiframe();
    +		}
    +
    +		// turning off autocomplete prevents the browser from remembering the
    +		// value when navigating through history, so we re-enable autocomplete
    +		// if the page is unloaded before the widget is destroyed. #7790
    +		this._on( this.window, {
    +			beforeunload: function() {
    +				this.element.removeAttr( "autocomplete" );
    +			}
    +		});
    +	},
    +
    +	_destroy: function() {
    +		clearTimeout( this.searching );
    +		this.element
    +			.removeClass( "ui-autocomplete-input" )
    +			.removeAttr( "autocomplete" );
    +		this.menu.element.remove();
    +		this.liveRegion.remove();
    +	},
    +
    +	_setOption: function( key, value ) {
    +		this._super( key, value );
    +		if ( key === "source" ) {
    +			this._initSource();
    +		}
    +		if ( key === "appendTo" ) {
    +			this.menu.element.appendTo( this.document.find( value || "body" )[0] );
    +		}
    +		if ( key === "disabled" && value && this.xhr ) {
    +			this.xhr.abort();
    +		}
    +	},
    +
    +	_isMultiLine: function() {
    +		// Textareas are always multi-line
    +		if ( this.element.is( "textarea" ) ) {
    +			return true;
    +		}
    +		// Inputs are always single-line, even if inside a contentEditable element
    +		// IE also treats inputs as contentEditable
    +		if ( this.element.is( "input" ) ) {
    +			return false;
    +		}
    +		// All other element types are determined by whether or not they're contentEditable
    +		return this.element.prop( "isContentEditable" );
    +	},
    +
    +	_initSource: function() {
    +		var array, url,
    +			that = this;
    +		if ( $.isArray(this.options.source) ) {
    +			array = this.options.source;
    +			this.source = function( request, response ) {
    +				response( $.ui.autocomplete.filter( array, request.term ) );
    +			};
    +		} else if ( typeof this.options.source === "string" ) {
    +			url = this.options.source;
    +			this.source = function( request, response ) {
    +				if ( that.xhr ) {
    +					that.xhr.abort();
    +				}
    +				that.xhr = $.ajax({
    +					url: url,
    +					data: request,
    +					dataType: "json",
    +					success: function( data ) {
    +						response( data );
    +					},
    +					error: function() {
    +						response( [] );
    +					}
    +				});
    +			};
    +		} else {
    +			this.source = this.options.source;
    +		}
    +	},
    +
    +	_searchTimeout: function( event ) {
    +		clearTimeout( this.searching );
    +		this.searching = this._delay(function() {
    +			// only search if the value has changed
    +			if ( this.term !== this._value() ) {
    +				this.selectedItem = null;
    +				this.search( null, event );
    +			}
    +		}, this.options.delay );
    +	},
    +
    +	search: function( value, event ) {
    +		value = value != null ? value : this._value();
    +
    +		// always save the actual value, not the one passed as an argument
    +		this.term = this._value();
    +
    +		if ( value.length < this.options.minLength ) {
    +			return this.close( event );
    +		}
    +
    +		if ( this._trigger( "search", event ) === false ) {
    +			return;
    +		}
    +
    +		return this._search( value );
    +	},
    +
    +	_search: function( value ) {
    +		this.pending++;
    +		this.element.addClass( "ui-autocomplete-loading" );
    +		this.cancelSearch = false;
    +
    +		this.source( { term: value }, this._response() );
    +	},
    +
    +	_response: function() {
    +		var that = this,
    +			index = ++requestIndex;
    +
    +		return function( content ) {
    +			if ( index === requestIndex ) {
    +				that.__response( content );
    +			}
    +
    +			that.pending--;
    +			if ( !that.pending ) {
    +				that.element.removeClass( "ui-autocomplete-loading" );
    +			}
    +		};
    +	},
    +
    +	__response: function( content ) {
    +		if ( content ) {
    +			content = this._normalize( content );
    +		}
    +		this._trigger( "response", null, { content: content } );
    +		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
    +			this._suggest( content );
    +			this._trigger( "open" );
    +		} else {
    +			// use ._close() instead of .close() so we don't cancel future searches
    +			this._close();
    +		}
    +	},
    +
    +	close: function( event ) {
    +		this.cancelSearch = true;
    +		this._close( event );
    +	},
    +
    +	_close: function( event ) {
    +		if ( this.menu.element.is( ":visible" ) ) {
    +			this.menu.element.hide();
    +			this.menu.blur();
    +			this.isNewMenu = true;
    +			this._trigger( "close", event );
    +		}
    +	},
    +
    +	_change: function( event ) {
    +		if ( this.previous !== this._value() ) {
    +			this._trigger( "change", event, { item: this.selectedItem } );
    +		}
    +	},
    +
    +	_normalize: function( items ) {
    +		// assume all items have the right format when the first item is complete
    +		if ( items.length && items[0].label && items[0].value ) {
    +			return items;
    +		}
    +		return $.map( items, function( item ) {
    +			if ( typeof item === "string" ) {
    +				return {
    +					label: item,
    +					value: item
    +				};
    +			}
    +			return $.extend({
    +				label: item.label || item.value,
    +				value: item.value || item.label
    +			}, item );
    +		});
    +	},
    +
    +	_suggest: function( items ) {
    +		var ul = this.menu.element
    +			.empty()
    +			.zIndex( this.element.zIndex() + 1 );
    +		this._renderMenu( ul, items );
    +		this.menu.refresh();
    +
    +		// size and position menu
    +		ul.show();
    +		this._resizeMenu();
    +		ul.position( $.extend({
    +			of: this.element
    +		}, this.options.position ));
    +
    +		if ( this.options.autoFocus ) {
    +			this.menu.next();
    +		}
    +	},
    +
    +	_resizeMenu: function() {
    +		var ul = this.menu.element;
    +		ul.outerWidth( Math.max(
    +			// Firefox wraps long text (possibly a rounding bug)
    +			// so we add 1px to avoid the wrapping (#7513)
    +			ul.width( "" ).outerWidth() + 1,
    +			this.element.outerWidth()
    +		) );
    +	},
    +
    +	_renderMenu: function( ul, items ) {
    +		var that = this;
    +		$.each( items, function( index, item ) {
    +			that._renderItemData( ul, item );
    +		});
    +	},
    +
    +	_renderItemData: function( ul, item ) {
    +		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
    +	},
    +
    +	_renderItem: function( ul, item ) {
    +		return $( "<li>" )
    +			.append( $( "<a>" ).text( item.label ) )
    +			.appendTo( ul );
    +	},
    +
    +	_move: function( direction, event ) {
    +		if ( !this.menu.element.is( ":visible" ) ) {
    +			this.search( null, event );
    +			return;
    +		}
    +		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
    +				this.menu.isLastItem() && /^next/.test( direction ) ) {
    +			this._value( this.term );
    +			this.menu.blur();
    +			return;
    +		}
    +		this.menu[ direction ]( event );
    +	},
    +
    +	widget: function() {
    +		return this.menu.element;
    +	},
    +
    +	_value: function() {
    +		return this.valueMethod.apply( this.element, arguments );
    +	},
    +
    +	_keyEvent: function( keyEvent, event ) {
    +		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
    +			this._move( keyEvent, event );
    +
    +			// prevents moving cursor to beginning/end of the text field in some browsers
    +			event.preventDefault();
    +		}
    +	}
    +});
    +
    +$.extend( $.ui.autocomplete, {
    +	escapeRegex: function( value ) {
    +		return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
    +	},
    +	filter: function(array, term) {
    +		var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
    +		return $.grep( array, function(value) {
    +			return matcher.test( value.label || value.value || value );
    +		});
    +	}
    +});
    +
    +
    +// live region extension, adding a `messages` option
    +// NOTE: This is an experimental API. We are still investigating
    +// a full solution for string manipulation and internationalization.
    +$.widget( "ui.autocomplete", $.ui.autocomplete, {
    +	options: {
    +		messages: {
    +			noResults: "No search results.",
    +			results: function( amount ) {
    +				return amount + ( amount > 1 ? " results are" : " result is" ) +
    +					" available, use up and down arrow keys to navigate.";
    +			}
    +		}
    +	},
    +
    +	__response: function( content ) {
    +		var message;
    +		this._superApply( arguments );
    +		if ( this.options.disabled || this.cancelSearch ) {
    +			return;
    +		}
    +		if ( content && content.length ) {
    +			message = this.options.messages.results( content.length );
    +		} else {
    +			message = this.options.messages.noResults;
    +		}
    +		this.liveRegion.text( message );
    +	}
    +});
    +
    +
    +}( jQuery ));
    +
    +(function( $, undefined ) {
    +
    +var lastActive, startXPos, startYPos, clickDragged,
    +	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
    +	stateClasses = "ui-state-hover ui-state-active ",
    +	typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
    +	formResetHandler = function() {
    +		var buttons = $( this ).find( ":ui-button" );
    +		setTimeout(function() {
    +			buttons.button( "refresh" );
    +		}, 1 );
    +	},
    +	radioGroup = function( radio ) {
    +		var name = radio.name,
    +			form = radio.form,
    +			radios = $( [] );
    +		if ( name ) {
    +			if ( form ) {
    +				radios = $( form ).find( "[name='" + name + "']" );
    +			} else {
    +				radios = $( "[name='" + name + "']", radio.ownerDocument )
    +					.filter(function() {
    +						return !this.form;
    +					});
    +			}
    +		}
    +		return radios;
    +	};
    +
    +$.widget( "ui.button", {
    +	version: "1.9.2",
    +	defaultElement: "<button>",
    +	options: {
    +		disabled: null,
    +		text: true,
    +		label: null,
    +		icons: {
    +			primary: null,
    +			secondary: null
    +		}
    +	},
    +	_create: function() {
    +		this.element.closest( "form" )
    +			.unbind( "reset" + this.eventNamespace )
    +			.bind( "reset" + this.eventNamespace, formResetHandler );
    +
    +		if ( typeof this.options.disabled !== "boolean" ) {
    +			this.options.disabled = !!this.element.prop( "disabled" );
    +		} else {
    +			this.element.prop( "disabled", this.options.disabled );
    +		}
    +
    +		this._determineButtonType();
    +		this.hasTitle = !!this.buttonElement.attr( "title" );
    +
    +		var that = this,
    +			options = this.options,
    +			toggleButton = this.type === "checkbox" || this.type === "radio",
    +			activeClass = !toggleButton ? "ui-state-active" : "",
    +			focusClass = "ui-state-focus";
    +
    +		if ( options.label === null ) {
    +			options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
    +		}
    +
    +		this._hoverable( this.buttonElement );
    +
    +		this.buttonElement
    +			.addClass( baseClasses )
    +			.attr( "role", "button" )
    +			.bind( "mouseenter" + this.eventNamespace, function() {
    +				if ( options.disabled ) {
    +					return;
    +				}
    +				if ( this === lastActive ) {
    +					$( this ).addClass( "ui-state-active" );
    +				}
    +			})
    +			.bind( "mouseleave" + this.eventNamespace, function() {
    +				if ( options.disabled ) {
    +					return;
    +				}
    +				$( this ).removeClass( activeClass );
    +			})
    +			.bind( "click" + this.eventNamespace, function( event ) {
    +				if ( options.disabled ) {
    +					event.preventDefault();
    +					event.stopImmediatePropagation();
    +				}
    +			});
    +
    +		this.element
    +			.bind( "focus" + this.eventNamespace, function() {
    +				// no need to check disabled, focus won't be triggered anyway
    +				that.buttonElement.addClass( focusClass );
    +			})
    +			.bind( "blur" + this.eventNamespace, function() {
    +				that.buttonElement.removeClass( focusClass );
    +			});
    +
    +		if ( toggleButton ) {
    +			this.element.bind( "change" + this.eventNamespace, function() {
    +				if ( clickDragged ) {
    +					return;
    +				}
    +				that.refresh();
    +			});
    +			// if mouse moves between mousedown and mouseup (drag) set clickDragged flag
    +			// prevents issue where button state changes but checkbox/radio checked state
    +			// does not in Firefox (see ticket #6970)
    +			this.buttonElement
    +				.bind( "mousedown" + this.eventNamespace, function( event ) {
    +					if ( options.disabled ) {
    +						return;
    +					}
    +					clickDragged = false;
    +					startXPos = event.pageX;
    +					startYPos = event.pageY;
    +				})
    +				.bind( "mouseup" + this.eventNamespace, function( event ) {
    +					if ( options.disabled ) {
    +						return;
    +					}
    +					if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
    +						clickDragged = true;
    +					}
    +			});
    +		}
    +
    +		if ( this.type === "checkbox" ) {
    +			this.buttonElement.bind( "click" + this.eventNamespace, function() {
    +				if ( options.disabled || clickDragged ) {
    +					return false;
    +				}
    +				$( this ).toggleClass( "ui-state-active" );
    +				that.buttonElement.attr( "aria-pressed", that.element[0].checked );
    +			});
    +		} else if ( this.type === "radio" ) {
    +			this.buttonElement.bind( "click" + this.eventNamespace, function() {
    +				if ( options.disabled || clickDragged ) {
    +					return false;
    +				}
    +				$( this ).addClass( "ui-state-active" );
    +				that.buttonElement.attr( "aria-pressed", "true" );
    +
    +				var radio = that.element[ 0 ];
    +				radioGroup( radio )
    +					.not( radio )
    +					.map(function() {
    +						return $( this ).button( "widget" )[ 0 ];
    +					})
    +					.removeClass( "ui-state-active" )
    +					.attr( "aria-pressed", "false" );
    +			});
    +		} else {
    +			this.buttonElement
    +				.bind( "mousedown" + this.eventNamespace, function() {
    +					if ( options.disabled ) {
    +						return false;
    +					}
    +					$( this ).addClass( "ui-state-active" );
    +					lastActive = this;
    +					that.document.one( "mouseup", function() {
    +						lastActive = null;
    +					});
    +				})
    +				.bind( "mouseup" + this.eventNamespace, function() {
    +					if ( options.disabled ) {
    +						return false;
    +					}
    +					$( this ).removeClass( "ui-state-active" );
    +				})
    +				.bind( "keydown" + this.eventNamespace, function(event) {
    +					if ( options.disabled ) {
    +						return false;
    +					}
    +					if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
    +						$( this ).addClass( "ui-state-active" );
    +					}
    +				})
    +				.bind( "keyup" + this.eventNamespace, function() {
    +					$( this ).removeClass( "ui-state-active" );
    +				});
    +
    +			if ( this.buttonElement.is("a") ) {
    +				this.buttonElement.keyup(function(event) {
    +					if ( event.keyCode === $.ui.keyCode.SPACE ) {
    +						// TODO pass through original event correctly (just as 2nd argument doesn't work)
    +						$( this ).click();
    +					}
    +				});
    +			}
    +		}
    +
    +		// TODO: pull out $.Widget's handling for the disabled option into
    +		// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
    +		// be overridden by individual plugins
    +		this._setOption( "disabled", options.disabled );
    +		this._resetButton();
    +	},
    +
    +	_determineButtonType: function() {
    +		var ancestor, labelSelector, checked;
    +
    +		if ( this.element.is("[type=checkbox]") ) {
    +			this.type = "checkbox";
    +		} else if ( this.element.is("[type=radio]") ) {
    +			this.type = "radio";
    +		} else if ( this.element.is("input") ) {
    +			this.type = "input";
    +		} else {
    +			this.type = "button";
    +		}
    +
    +		if ( this.type === "checkbox" || this.type === "radio" ) {
    +			// we don't search against the document in case the element
    +			// is disconnected from the DOM
    +			ancestor = this.element.parents().last();
    +			labelSelector = "label[for='" + this.element.attr("id") + "']";
    +			this.buttonElement = ancestor.find( labelSelector );
    +			if ( !this.buttonElement.length ) {
    +				ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
    +				this.buttonElement = ancestor.filter( labelSelector );
    +				if ( !this.buttonElement.length ) {
    +					this.buttonElement = ancestor.find( labelSelector );
    +				}
    +			}
    +			this.element.addClass( "ui-helper-hidden-accessible" );
    +
    +			checked = this.element.is( ":checked" );
    +			if ( checked ) {
    +				this.buttonElement.addClass( "ui-state-active" );
    +			}
    +			this.buttonElement.prop( "aria-pressed", checked );
    +		} else {
    +			this.buttonElement = this.element;
    +		}
    +	},
    +
    +	widget: function() {
    +		return this.buttonElement;
    +	},
    +
    +	_destroy: function() {
    +		this.element
    +			.removeClass( "ui-helper-hidden-accessible" );
    +		this.buttonElement
    +			.removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
    +			.removeAttr( "role" )
    +			.removeAttr( "aria-pressed" )
    +			.html( this.buttonElement.find(".ui-button-text").html() );
    +
    +		if ( !this.hasTitle ) {
    +			this.buttonElement.removeAttr( "title" );
    +		}
    +	},
    +
    +	_setOption: function( key, value ) {
    +		this._super( key, value );
    +		if ( key === "disabled" ) {
    +			if ( value ) {
    +				this.element.prop( "disabled", true );
    +			} else {
    +				this.element.prop( "disabled", false );
    +			}
    +			return;
    +		}
    +		this._resetButton();
    +	},
    +
    +	refresh: function() {
    +		//See #8237 & #8828
    +		var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
    +
    +		if ( isDisabled !== this.options.disabled ) {
    +			this._setOption( "disabled", isDisabled );
    +		}
    +		if ( this.type === "radio" ) {
    +			radioGroup( this.element[0] ).each(function() {
    +				if ( $( this ).is( ":checked" ) ) {
    +					$( this ).button( "widget" )
    +						.addClass( "ui-state-active" )
    +						.attr( "aria-pressed", "true" );
    +				} else {
    +					$( this ).button( "widget" )
    +						.removeClass( "ui-state-active" )
    +						.attr( "aria-pressed", "false" );
    +				}
    +			});
    +		} else if ( this.type === "checkbox" ) {
    +			if ( this.element.is( ":checked" ) ) {
    +				this.buttonElement
    +					.addClass( "ui-state-active" )
    +					.attr( "aria-pressed", "true" );
    +			} else {
    +				this.buttonElement
    +					.removeClass( "ui-state-active" )
    +					.attr( "aria-pressed", "false" );
    +			}
    +		}
    +	},
    +
    +	_resetButton: function() {
    +		if ( this.type === "input" ) {
    +			if ( this.options.label ) {
    +				this.element.val( this.options.label );
    +			}
    +			return;
    +		}
    +		var buttonElement = this.buttonElement.removeClass( typeClasses ),
    +			buttonText = $( "<span></span>", this.document[0] )
    +				.addClass( "ui-button-text" )
    +				.html( this.options.label )
    +				.appendTo( buttonElement.empty() )
    +				.text(),
    +			icons = this.options.icons,
    +			multipleIcons = icons.primary && icons.secondary,
    +			buttonClasses = [];
    +
    +		if ( icons.primary || icons.secondary ) {
    +			if ( this.options.text ) {
    +				buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
    +			}
    +
    +			if ( icons.primary ) {
    +				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
    +			}
    +
    +			if ( icons.secondary ) {
    +				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
    +			}
    +
    +			if ( !this.options.text ) {
    +				buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
    +
    +				if ( !this.hasTitle ) {
    +					buttonElement.attr( "title", $.trim( buttonText ) );
    +				}
    +			}
    +		} else {
    +			buttonClasses.push( "ui-button-text-only" );
    +		}
    +		buttonElement.addClass( buttonClasses.join( " " ) );
    +	}
    +});
    +
    +$.widget( "ui.buttonset", {
    +	version: "1.9.2",
    +	options: {
    +		items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(button)"
    +	},
    +
    +	_create: function() {
    +		this.element.addClass( "ui-buttonset" );
    +	},
    +
    +	_init: function() {
    +		this.refresh();
    +	},
    +
    +	_setOption: function( key, value ) {
    +		if ( key === "disabled" ) {
    +			this.buttons.button( "option", key, value );
    +		}
    +
    +		this._super( key, value );
    +	},
    +
    +	refresh: function() {
    +		var rtl = this.element.css( "direction" ) === "rtl";
    +
    +		this.buttons = this.element.find( this.options.items )
    +			.filter( ":ui-button" )
    +				.button( "refresh" )
    +			.end()
    +			.not( ":ui-button" )
    +				.button()
    +			.end()
    +			.map(function() {
    +				return $( this ).button( "widget" )[ 0 ];
    +			})
    +				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
    +				.filter( ":first" )
    +					.addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
    +				.end()
    +				.filter( ":last" )
    +					.addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
    +				.end()
    +			.end();
    +	},
    +
    +	_destroy: function() {
    +		this.element.removeClass( "ui-buttonset" );
    +		this.buttons
    +			.map(function() {
    +				return $( this ).button( "widget" )[ 0 ];
    +			})
    +				.removeClass( "ui-corner-left ui-corner-right" )
    +			.end()
    +			.button( "destroy" );
    +	}
    +});
    +
    +}( jQuery ) );
    +
    +(function( $, undefined ) {
    +
    +$.extend($.ui, { datepicker: { version: "1.9.2" } });
    +
    +var PROP_NAME = 'datepicker';
    +var dpuuid = new Date().getTime();
    +var instActive;
    +
    +/* Date picker manager.
    +   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
    +   Settings for (groups of) date pickers are maintained in an instance object,
    +   allowing multiple different settings on the same page. */
    +
    +function Datepicker() {
    +	this.debug = false; // Change this to true to start debugging
    +	this._curInst = null; // The current instance in use
    +	this._keyEvent = false; // If the last event was a key event
    +	this._disabledInputs = []; // List of date picker inputs that have been disabled
    +	this._datepickerShowing = false; // True if the popup picker is showing , false if not
    +	this._inDialog = false; // True if showing within a "dialog", false if not
    +	this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
    +	this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
    +	this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
    +	this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
    +	this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
    +	this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
    +	this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
    +	this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
    +	this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
    +	this.regional = []; // Available regional settings, indexed by language code
    +	this.regional[''] = { // Default regional settings
    +		closeText: 'Done', // Display text for close link
    +		prevText: 'Prev', // Display text for previous month link
    +		nextText: 'Next', // Display text for next month link
    +		currentText: 'Today', // Display text for current month link
    +		monthNames: ['January','February','March','April','May','June',
    +			'July','August','September','October','November','December'], // Names of months for drop-down and formatting
    +		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
    +		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
    +		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
    +		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
    +		weekHeader: 'Wk', // Column header for week of the year
    +		dateFormat: 'yy-mm-dd', // See format options on parseDate
    +		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
    +		isRTL: false, // True if right-to-left language, false if left-to-right
    +		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
    +		yearSuffix: '' // Additional text to append to the year in the month headers
    +	};
    +	this._defaults = { // Global defaults for all the date picker instances
    +		showOn: 'focus', // 'focus' for popup on focus,
    +			// 'button' for trigger button, or 'both' for either
    +		showAnim: 'fadeIn', // Name of jQuery animation for popup
    +		showOptions: {}, // Options for enhanced animations
    +		defaultDate: null, // Used when field is blank: actual date,
    +			// +/-number for offset from today, null for today
    +		appendText: '', // Display text following the input box, e.g. showing the format
    +		buttonText: '...', // Text for trigger button
    +		buttonImage: '', // URL for trigger button image
    +		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
    +		hideIfNoPrevNext: false, // True to hide next/previous month links
    +			// if not applicable, false to just disable them
    +		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
    +		gotoCurrent: false, // True if today link goes back to current selection instead
    +		changeMonth: false, // True if month can be selected directly, false if only prev/next
    +		changeYear: false, // True if year can be selected directly, false if only prev/next
    +		yearRange: 'c-10:c+10', // Range of years to display in drop-down,
    +			// either relative to today's year (-nn:+nn), relative to currently displayed year
    +			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
    +		showOtherMonths: false, // True to show dates in other months, false to leave blank
    +		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
    +		showWeek: false, // True to show week of the year, false to not show it
    +		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
    +			// takes a Date and returns the number of the week for it
    +		shortYearCutoff: '+10', // Short year values < this are in the current century,
    +			// > this are in the previous century,
    +			// string value starting with '+' for current year + value
    +		minDate: null, // The earliest selectable date, or null for no limit
    +		maxDate: null, // The latest selectable date, or null for no limit
    +		duration: 'fast', // Duration of display/closure
    +		beforeShowDay: null, // Function that takes a date and returns an array with
    +			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
    +			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
    +		beforeShow: null, // Function that takes an input field and
    +			// returns a set of custom settings for the date picker
    +		onSelect: null, // Define a callback function when a date is selected
    +		onChangeMonthYear: null, // Define a callback function when the month or year is changed
    +		onClose: null, // Define a callback function when the datepicker is closed
    +		numberOfMonths: 1, // Number of months to show at a time
    +		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
    +		stepMonths: 1, // Number of months to step back/forward
    +		stepBigMonths: 12, // Number of months to step back/forward for the big links
    +		altField: '', // Selector for an alternate field to store selected dates into
    +		altFormat: '', // The date format to use for the alternate field
    +		constrainInput: true, // The input is constrained by the current date format
    +		showButtonPanel: false, // True to show button panel, false to not show it
    +		autoSize: false, // True to size the input for the date format, false to leave as is
    +		disabled: false // The initial disabled state
    +	};
    +	$.extend(this._defaults, this.regional['']);
    +	this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'));
    +}
    +
    +$.extend(Datepicker.prototype, {
    +	/* Class name added to elements to indicate already configured with a date picker. */
    +	markerClassName: 'hasDatepicker',
    +
    +	//Keep track of the maximum number of rows displayed (see #7043)
    +	maxRows: 4,
    +
    +	/* Debug logging (if enabled). */
    +	log: function () {
    +		if (this.debug)
    +			console.log.apply('', arguments);
    +	},
    +
    +	// TODO rename to "widget" when switching to widget factory
    +	_widgetDatepicker: function() {
    +		return this.dpDiv;
    +	},
    +
    +	/* Override the default settings for all instances of the date picker.
    +	   @param  settings  object - the new settings to use as defaults (anonymous object)
    +	   @return the manager object */
    +	setDefaults: function(settings) {
    +		extendRemove(this._defaults, settings || {});
    +		return this;
    +	},
    +
    +	/* Attach the date picker to a jQuery selection.
    +	   @param  target    element - the target input field or division or span
    +	   @param  settings  object - the new settings to use for this date picker instance (anonymous) */
    +	_attachDatepicker: function(target, settings) {
    +		// check for settings on the control itself - in namespace 'date:'
    +		var inlineSettings = null;
    +		for (var attrName in this._defaults) {
    +			var attrValue = target.getAttribute('date:' + attrName);
    +			if (attrValue) {
    +				inlineSettings = inlineSettings || {};
    +				try {
    +					inlineSettings[attrName] = eval(attrValue);
    +				} catch (err) {
    +					inlineSettings[attrName] = attrValue;
    +				}
    +			}
    +		}
    +		var nodeName = target.nodeName.toLowerCase();
    +		var inline = (nodeName == 'div' || nodeName == 'span');
    +		if (!target.id) {
    +			this.uuid += 1;
    +			target.id = 'dp' + this.uuid;
    +		}
    +		var inst = this._newInst($(target), inline);
    +		inst.settings = $.extend({}, settings || {}, inlineSettings || {});
    +		if (nodeName == 'input') {
    +			this._connectDatepicker(target, inst);
    +		} else if (inline) {
    +			this._inlineDatepicker(target, inst);
    +		}
    +	},
    +
    +	/* Create a new instance object. */
    +	_newInst: function(target, inline) {
    +		var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
    +		return {id: id, input: target, // associated target
    +			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
    +			drawMonth: 0, drawYear: 0, // month being drawn
    +			inline: inline, // is datepicker inline or not
    +			dpDiv: (!inline ? this.dpDiv : // presentation div
    +			bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))};
    +	},
    +
    +	/* Attach the date picker to an input field. */
    +	_connectDatepicker: function(target, inst) {
    +		var input = $(target);
    +		inst.append = $([]);
    +		inst.trigger = $([]);
    +		if (input.hasClass(this.markerClassName))
    +			return;
    +		this._attachments(input, inst);
    +		input.addClass(this.markerClassName).keydown(this._doKeyDown).
    +			keypress(this._doKeyPress).keyup(this._doKeyUp).
    +			bind("setData.datepicker", function(event, key, value) {
    +				inst.settings[key] = value;
    +			}).bind("getData.datepicker", function(event, key) {
    +				return this._get(inst, key);
    +			});
    +		this._autoSize(inst);
    +		$.data(target, PROP_NAME, inst);
    +		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
    +		if( inst.settings.disabled ) {
    +			this._disableDatepicker( target );
    +		}
    +	},
    +
    +	/* Make attachments based on settings. */
    +	_attachments: function(input, inst) {
    +		var appendText = this._get(inst, 'appendText');
    +		var isRTL = this._get(inst, 'isRTL');
    +		if (inst.append)
    +			inst.append.remove();
    +		if (appendText) {
    +			inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
    +			input[isRTL ? 'before' : 'after'](inst.append);
    +		}
    +		input.unbind('focus', this._showDatepicker);
    +		if (inst.trigger)
    +			inst.trigger.remove();
    +		var showOn = this._get(inst, 'showOn');
    +		if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
    +			input.focus(this._showDatepicker);
    +		if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
    +			var buttonText = this._get(inst, 'buttonText');
    +			var buttonImage = this._get(inst, 'buttonImage');
    +			inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
    +				$('<img/>').addClass(this._triggerClass).
    +					attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
    +				$('<button type="button"></button>').addClass(this._triggerClass).
    +					html(buttonImage == '' ? buttonText : $('<img/>').attr(
    +					{ src:buttonImage, alt:buttonText, title:buttonText })));
    +			input[isRTL ? 'before' : 'after'](inst.trigger);
    +			inst.trigger.click(function() {
    +				if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
    +					$.datepicker._hideDatepicker();
    +				else if ($.datepicker._datepickerShowing && $.datepicker._lastInput != input[0]) {
    +					$.datepicker._hideDatepicker();
    +					$.datepicker._showDatepicker(input[0]);
    +				} else
    +					$.datepicker._showDatepicker(input[0]);
    +				return false;
    +			});
    +		}
    +	},
    +
    +	/* Apply the maximum length for the date format. */
    +	_autoSize: function(inst) {
    +		if (this._get(inst, 'autoSize') && !inst.inline) {
    +			var date = new Date(2009, 12 - 1, 20); // Ensure double digits
    +			var dateFormat = this._get(inst, 'dateFormat');
    +			if (dateFormat.match(/[DM]/)) {
    +				var findMax = function(names) {
    +					var max = 0;
    +					var maxI = 0;
    +					for (var i = 0; i < names.length; i++) {
    +						if (names[i].length > max) {
    +							max = names[i].length;
    +							maxI = i;
    +						}
    +					}
    +					return maxI;
    +				};
    +				date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
    +					'monthNames' : 'monthNamesShort'))));
    +				date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
    +					'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
    +			}
    +			inst.input.attr('size', this._formatDate(inst, date).length);
    +		}
    +	},
    +
    +	/* Attach an inline date picker to a div. */
    +	_inlineDatepicker: function(target, inst) {
    +		var divSpan = $(target);
    +		if (divSpan.hasClass(this.markerClassName))
    +			return;
    +		divSpan.addClass(this.markerClassName).append(inst.dpDiv).
    +			bind("setData.datepicker", function(event, key, value){
    +				inst.settings[key] = value;
    +			}).bind("getData.datepicker", function(event, key){
    +				return this._get(inst, key);
    +			});
    +		$.data(target, PROP_NAME, inst);
    +		this._setDate(inst, this._getDefaultDate(inst), true);
    +		this._updateDatepicker(inst);
    +		this._updateAlternate(inst);
    +		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
    +		if( inst.settings.disabled ) {
    +			this._disableDatepicker( target );
    +		}
    +		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
    +		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
    +		inst.dpDiv.css( "display", "block" );
    +	},
    +
    +	/* Pop-up the date picker in a "dialog" box.
    +	   @param  input     element - ignored
    +	   @param  date      string or Date - the initial date to display
    +	   @param  onSelect  function - the function to call when a date is selected
    +	   @param  settings  object - update the dialog date picker instance's settings (anonymous object)
    +	   @param  pos       int[2] - coordinates for the dialog's position within the screen or
    +	                     event - with x/y coordinates or
    +	                     leave empty for default (screen centre)
    +	   @return the manager object */
    +	_dialogDatepicker: function(input, date, onSelect, settings, pos) {
    +		var inst = this._dialogInst; // internal instance
    +		if (!inst) {
    +			this.uuid += 1;
    +			var id = 'dp' + this.uuid;
    +			this._dialogInput = $('<input type="text" id="' + id +
    +				'" style="position: absolute; top: -100px; width: 0px;"/>');
    +			this._dialogInput.keydown(this._doKeyDown);
    +			$('body').append(this._dialogInput);
    +			inst = this._dialogInst = this._newInst(this._dialogInput, false);
    +			inst.settings = {};
    +			$.data(this._dialogInput[0], PROP_NAME, inst);
    +		}
    +		extendRemove(inst.settings, settings || {});
    +		date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
    +		this._dialogInput.val(date);
    +
    +		this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
    +		if (!this._pos) {
    +			var browserWidth = document.documentElement.clientWidth;
    +			var browserHeight = document.documentElement.clientHeight;
    +			var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
    +			var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
    +			this._pos = // should use actual width/height below
    +				[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
    +		}
    +
    +		// move input on screen for focus, but hidden behind dialog
    +		this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
    +		inst.settings.onSelect = onSelect;
    +		this._inDialog = true;
    +		this.dpDiv.addClass(this._dialogClass);
    +		this._showDatepicker(this._dialogInput[0]);
    +		if ($.blockUI)
    +			$.blockUI(this.dpDiv);
    +		$.data(this._dialogInput[0], PROP_NAME, inst);
    +		return this;
    +	},
    +
    +	/* Detach a datepicker from its control.
    +	   @param  target    element - the target input field or division or span */
    +	_destroyDatepicker: function(target) {
    +		var $target = $(target);
    +		var inst = $.data(target, PROP_NAME);
    +		if (!$target.hasClass(this.markerClassName)) {
    +			return;
    +		}
    +		var nodeName = target.nodeName.toLowerCase();
    +		$.removeData(target, PROP_NAME);
    +		if (nodeName == 'input') {
    +			inst.append.remove();
    +			inst.trigger.remove();
    +			$target.removeClass(this.markerClassName).
    +				unbind('focus', this._showDatepicker).
    +				unbind('keydown', this._doKeyDown).
    +				unbind('keypress', this._doKeyPress).
    +				unbind('keyup', this._doKeyUp);
    +		} else if (nodeName == 'div' || nodeName == 'span')
    +			$target.removeClass(this.markerClassName).empty();
    +	},
    +
    +	/* Enable the date picker to a jQuery selection.
    +	   @param  target    element - the target input field or division or span */
    +	_enableDatepicker: function(target) {
    +		var $target = $(target);
    +		var inst = $.data(target, PROP_NAME);
    +		if (!$target.hasClass(this.markerClassName)) {
    +			return;
    +		}
    +		var nodeName = target.nodeName.toLowerCase();
    +		if (nodeName == 'input') {
    +			target.disabled = false;
    +			inst.trigger.filter('button').
    +				each(function() { this.disabled = false; }).end().
    +				filter('img').css({opacity: '1.0', cursor: ''});
    +		}
    +		else if (nodeName == 'div' || nodeName == 'span') {
    +			var inline = $target.children('.' + this._inlineClass);
    +			inline.children().removeClass('ui-state-disabled');
    +			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
    +				prop("disabled", false);
    +		}
    +		this._disabledInputs = $.map(this._disabledInputs,
    +			function(value) { return (value == target ? null : value); }); // delete entry
    +	},
    +
    +	/* Disable the date picker to a jQuery selection.
    +	   @param  target    element - the target input field or division or span */
    +	_disableDatepicker: function(target) {
    +		var $target = $(target);
    +		var inst = $.data(target, PROP_NAME);
    +		if (!$target.hasClass(this.markerClassName)) {
    +			return;
    +		}
    +		var nodeName = target.nodeName.toLowerCase();
    +		if (nodeName == 'input') {
    +			target.disabled = true;
    +			inst.trigger.filter('button').
    +				each(function() { this.disabled = true; }).end().
    +				filter('img').css({opacity: '0.5', cursor: 'default'});
    +		}
    +		else if (nodeName == 'div' || nodeName == 'span') {
    +			var inline = $target.children('.' + this._inlineClass);
    +			inline.children().addClass('ui-state-disabled');
    +			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
    +				prop("disabled", true);
    +		}
    +		this._disabledInputs = $.map(this._disabledInputs,
    +			function(value) { return (value == target ? null : value); }); // delete entry
    +		this._disabledInputs[this._disabledInputs.length] = target;
    +	},
    +
    +	/* Is the first field in a jQuery collection disabled as a datepicker?
    +	   @param  target    element - the target input field or division or span
    +	   @return boolean - true if disabled, false if enabled */
    +	_isDisabledDatepicker: function(target) {
    +		if (!target) {
    +			return false;
    +		}
    +		for (var i = 0; i < this._disabledInputs.length; i++) {
    +			if (this._disabledInputs[i] == target)
    +				return true;
    +		}
    +		return false;
    +	},
    +
    +	/* Retrieve the instance data for the target control.
    +	   @param  target  element - the target input field or division or span
    +	   @return  object - the associated instance data
    +	   @throws  error if a jQuery problem getting data */
    +	_getInst: function(target) {
    +		try {
    +			return $.data(target, PROP_NAME);
    +		}
    +		catch (err) {
    +			throw 'Missing instance data for this datepicker';
    +		}
    +	},
    +
    +	/* Update or retrieve the settings for a date picker attached to an input field or division.
    +	   @param  target  element - the target input field or division or span
    +	   @param  name    object - the new settings to update or
    +	                   string - the name of the setting to change or retrieve,
    +	                   when retrieving also 'all' for all instance settings or
    +	                   'defaults' for all global defaults
    +	   @param  value   any - the new value for the setting
    +	                   (omit if above is an object or to retrieve a value) */
    +	_optionDatepicker: function(target, name, value) {
    +		var inst = this._getInst(target);
    +		if (arguments.length == 2 && typeof name == 'string') {
    +			return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
    +				(inst ? (name == 'all' ? $.extend({}, inst.settings) :
    +				this._get(inst, name)) : null));
    +		}
    +		var settings = name || {};
    +		if (typeof name == 'string') {
    +			settings = {};
    +			settings[name] = value;
    +		}
    +		if (inst) {
    +			if (this._curInst == inst) {
    +				this._hideDatepicker();
    +			}
    +			var date = this._getDateDatepicker(target, true);
    +			var minDate = this._getMinMaxDate(inst, 'min');
    +			var maxDate = this._getMinMaxDate(inst, 'max');
    +			extendRemove(inst.settings, settings);
    +			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
    +			if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined)
    +				inst.settings.minDate = this._formatDate(inst, minDate);
    +			if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined)
    +				inst.settings.maxDate = this._formatDate(inst, maxDate);
    +			this._attachments($(target), inst);
    +			this._autoSize(inst);
    +			this._setDate(inst, date);
    +			this._updateAlternate(inst);
    +			this._updateDatepicker(inst);
    +		}
    +	},
    +
    +	// change method deprecated
    +	_changeDatepicker: function(target, name, value) {
    +		this._optionDatepicker(target, name, value);
    +	},
    +
    +	/* Redraw the date picker attached to an input field or division.
    +	   @param  target  element - the target input field or division or span */
    +	_refreshDatepicker: function(target) {
    +		var inst = this._getInst(target);
    +		if (inst) {
    +			this._updateDatepicker(inst);
    +		}
    +	},
    +
    +	/* Set the dates for a jQuery selection.
    +	   @param  target   element - the target input field or division or span
    +	   @param  date     Date - the new date */
    +	_setDateDatepicker: function(target, date) {
    +		var inst = this._getInst(target);
    +		if (inst) {
    +			this._setDate(inst, date);
    +			this._updateDatepicker(inst);
    +			this._updateAlternate(inst);
    +		}
    +	},
    +
    +	/* Get the date(s) for the first entry in a jQuery selection.
    +	   @param  target     element - the target input field or division or span
    +	   @param  noDefault  boolean - true if no default date is to be used
    +	   @return Date - the current date */
    +	_getDateDatepicker: function(target, noDefault) {
    +		var inst = this._getInst(target);
    +		if (inst && !inst.inline)
    +			this._setDateFromField(inst, noDefault);
    +		return (inst ? this._getDate(inst) : null);
    +	},
    +
    +	/* Handle keystrokes. */
    +	_doKeyDown: function(event) {
    +		var inst = $.datepicker._getInst(event.target);
    +		var handled = true;
    +		var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
    +		inst._keyEvent = true;
    +		if ($.datepicker._datepickerShowing)
    +			switch (event.keyCode) {
    +				case 9: $.datepicker._hideDatepicker();
    +						handled = false;
    +						break; // hide on tab out
    +				case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' +
    +									$.datepicker._currentClass + ')', inst.dpDiv);
    +						if (sel[0])
    +							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
    +							var onSelect = $.datepicker._get(inst, 'onSelect');
    +							if (onSelect) {
    +								var dateStr = $.datepicker._formatDate(inst);
    +
    +								// trigger custom callback
    +								onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
    +							}
    +						else
    +							$.datepicker._hideDatepicker();
    +						return false; // don't submit the form
    +						break; // select the value on enter
    +				case 27: $.datepicker._hideDatepicker();
    +						break; // hide on escape
    +				case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
    +							-$.datepicker._get(inst, 'stepBigMonths') :
    +							-$.datepicker._get(inst, 'stepMonths')), 'M');
    +						break; // previous month/year on page up/+ ctrl
    +				case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
    +							+$.datepicker._get(inst, 'stepBigMonths') :
    +							+$.datepicker._get(inst, 'stepMonths')), 'M');
    +						break; // next month/year on page down/+ ctrl
    +				case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
    +						handled = event.ctrlKey || event.metaKey;
    +						break; // clear on ctrl or command +end
    +				case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
    +						handled = event.ctrlKey || event.metaKey;
    +						break; // current on ctrl or command +home
    +				case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
    +						handled = event.ctrlKey || event.metaKey;
    +						// -1 day on ctrl or command +left
    +						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
    +									-$.datepicker._get(inst, 'stepBigMonths') :
    +									-$.datepicker._get(inst, 'stepMonths')), 'M');
    +						// next month/year on alt +left on Mac
    +						break;
    +				case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
    +						handled = event.ctrlKey || event.metaKey;
    +						break; // -1 week on ctrl or command +up
    +				case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
    +						handled = event.ctrlKey || event.metaKey;
    +						// +1 day on ctrl or command +right
    +						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
    +									+$.datepicker._get(inst, 'stepBigMonths') :
    +									+$.datepicker._get(inst, 'stepMonths')), 'M');
    +						// next month/year on alt +right
    +						break;
    +				case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
    +						handled = event.ctrlKey || event.metaKey;
    +						break; // +1 week on ctrl or command +down
    +				default: handled = false;
    +			}
    +		else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
    +			$.datepicker._showDatepicker(this);
    +		else {
    +			handled = false;
    +		}
    +		if (handled) {
    +			event.preventDefault();
    +			event.stopPropagation();
    +		}
    +	},
    +
    +	/* Filter entered characters - based on date format. */
    +	_doKeyPress: function(event) {
    +		var inst = $.datepicker._getInst(event.target);
    +		if ($.datepicker._get(inst, 'constrainInput')) {
    +			var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
    +			var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
    +			return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
    +		}
    +	},
    +
    +	/* Synchronise manual entry and field/alternate field. */
    +	_doKeyUp: function(event) {
    +		var inst = $.datepicker._getInst(event.target);
    +		if (inst.input.val() != inst.lastVal) {
    +			try {
    +				var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
    +					(inst.input ? inst.input.val() : null),
    +					$.datepicker._getFormatConfig(inst));
    +				if (date) { // only if valid
    +					$.datepicker._setDateFromField(inst);
    +					$.datepicker._updateAlternate(inst);
    +					$.datepicker._updateDatepicker(inst);
    +				}
    +			}
    +			catch (err) {
    +				$.datepicker.log(err);
    +			}
    +		}
    +		return true;
    +	},
    +
    +	/* Pop-up the date picker for a given input field.
    +	   If false returned from beforeShow event handler do not show.
    +	   @param  input  element - the input field attached to the date picker or
    +	                  event - if triggered by focus */
    +	_showDatepicker: function(input) {
    +		input = input.target || input;
    +		if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
    +			input = $('input', input.parentNode)[0];
    +		if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
    +			return;
    +		var inst = $.datepicker._getInst(input);
    +		if ($.datepicker._curInst && $.datepicker._curInst != inst) {
    +			$.datepicker._curInst.dpDiv.stop(true, true);
    +			if ( inst && $.datepicker._datepickerShowing ) {
    +				$.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
    +			}
    +		}
    +		var beforeShow = $.datepicker._get(inst, 'beforeShow');
    +		var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
    +		if(beforeShowSettings === false){
    +			//false
    +			return;
    +		}
    +		extendRemove(inst.settings, beforeShowSettings);
    +		inst.lastVal = null;
    +		$.datepicker._lastInput = input;
    +		$.datepicker._setDateFromField(inst);
    +		if ($.datepicker._inDialog) // hide cursor
    +			input.value = '';
    +		if (!$.datepicker._pos) { // position below input
    +			$.datepicker._pos = $.datepicker._findPos(input);
    +			$.datepicker._pos[1] += input.offsetHeight; // add the height
    +		}
    +		var isFixed = false;
    +		$(input).parents().each(function() {
    +			isFixed |= $(this).css('position') == 'fixed';
    +			return !isFixed;
    +		});
    +		var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
    +		$.datepicker._pos = null;
    +		//to avoid flashes on Firefox
    +		inst.dpDiv.empty();
    +		// determine sizing offscreen
    +		inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
    +		$.datepicker._updateDatepicker(inst);
    +		// fix width for dynamic number of date pickers
    +		// and adjust position before showing
    +		offset = $.datepicker._checkOffset(inst, offset, isFixed);
    +		inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
    +			'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
    +			left: offset.left + 'px', top: offset.top + 'px'});
    +		if (!inst.inline) {
    +			var showAnim = $.datepicker._get(inst, 'showAnim');
    +			var duration = $.datepicker._get(inst, 'duration');
    +			var postProcess = function() {
    +				var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
    +				if( !! cover.length ){
    +					var borders = $.datepicker._getBorders(inst.dpDiv);
    +					cover.css({left: -borders[0], top: -borders[1],
    +						width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
    +				}
    +			};
    +			inst.dpDiv.zIndex($(input).zIndex()+1);
    +			$.datepicker._datepickerShowing = true;
    +
    +			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
    +			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
    +				inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
    +			else
    +				inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
    +			if (!showAnim || !duration)
    +				postProcess();
    +			if (inst.input.is(':visible') && !inst.input.is(':disabled'))
    +				inst.input.focus();
    +			$.datepicker._curInst = inst;
    +		}
    +	},
    +
    +	/* Generate the date picker content. */
    +	_updateDatepicker: function(inst) {
    +		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
    +		var borders = $.datepicker._getBorders(inst.dpDiv);
    +		instActive = inst; // for delegate hover events
    +		inst.dpDiv.empty().append(this._generateHTML(inst));
    +		this._attachHandlers(inst);
    +		var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
    +		if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
    +			cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
    +		}
    +		inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover();
    +		var numMonths = this._getNumberOfMonths(inst);
    +		var cols = numMonths[1];
    +		var width = 17;
    +		inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
    +		if (cols > 1)
    +			inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
    +		inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
    +			'Class']('ui-datepicker-multi');
    +		inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
    +			'Class']('ui-datepicker-rtl');
    +		if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
    +				// #6694 - don't focus the input if it's already focused
    +				// this breaks the change event in IE
    +				inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
    +			inst.input.focus();
    +		// deffered render of the years select (to avoid flashes on Firefox)
    +		if( inst.yearshtml ){
    +			var origyearshtml = inst.yearshtml;
    +			setTimeout(function(){
    +				//assure that inst.yearshtml didn't change.
    +				if( origyearshtml === inst.yearshtml && inst.yearshtml ){
    +					inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
    +				}
    +				origyearshtml = inst.yearshtml = null;
    +			}, 0);
    +		}
    +	},
    +
    +	/* Retrieve the size of left and top borders for an element.
    +	   @param  elem  (jQuery object) the element of interest
    +	   @return  (number[2]) the left and top borders */
    +	_getBorders: function(elem) {
    +		var convert = function(value) {
    +			return {thin: 1, medium: 2, thick: 3}[value] || value;
    +		};
    +		return [parseFloat(convert(elem.css('border-left-width'))),
    +			parseFloat(convert(elem.css('border-top-width')))];
    +	},
    +
    +	/* Check positioning to remain on screen. */
    +	_checkOffset: function(inst, offset, isFixed) {
    +		var dpWidth = inst.dpDiv.outerWidth();
    +		var dpHeight = inst.dpDiv.outerHeight();
    +		var inputWidth = inst.input ? inst.input.outerWidth() : 0;
    +		var inputHeight = inst.input ? inst.input.outerHeight() : 0;
    +		var viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft());
    +		var viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
    +
    +		offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
    +		offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
    +		offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
    +
    +		// now check if datepicker is showing outside window viewport - move to a better place if so.
    +		offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
    +			Math.abs(offset.left + dpWidth - viewWidth) : 0);
    +		offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
    +			Math.abs(dpHeight + inputHeight) : 0);
    +
    +		return offset;
    +	},
    +
    +	/* Find an object's position on the screen. */
    +	_findPos: function(obj) {
    +		var inst = this._getInst(obj);
    +		var isRTL = this._get(inst, 'isRTL');
    +		while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
    +			obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
    +		}
    +		var position = $(obj).offset();
    +		return [position.left, position.top];
    +	},
    +
    +	/* Hide the date picker from view.
    +	   @param  input  element - the input field attached to the date picker */
    +	_hideDatepicker: function(input) {
    +		var inst = this._curInst;
    +		if (!inst || (input && inst != $.data(input, PROP_NAME)))
    +			return;
    +		if (this._datepickerShowing) {
    +			var showAnim = this._get(inst, 'showAnim');
    +			var duration = this._get(inst, 'duration');
    +			var postProcess = function() {
    +				$.datepicker._tidyDialog(inst);
    +			};
    +
    +			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
    +			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
    +				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
    +			else
    +				inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
    +					(showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
    +			if (!showAnim)
    +				postProcess();
    +			this._datepickerShowing = false;
    +			var onClose = this._get(inst, 'onClose');
    +			if (onClose)
    +				onClose.apply((inst.input ? inst.input[0] : null),
    +					[(inst.input ? inst.input.val() : ''), inst]);
    +			this._lastInput = null;
    +			if (this._inDialog) {
    +				this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
    +				if ($.blockUI) {
    +					$.unblockUI();
    +					$('body').append(this.dpDiv);
    +				}
    +			}
    +			this._inDialog = false;
    +		}
    +	},
    +
    +	/* Tidy up after a dialog display. */
    +	_tidyDialog: function(inst) {
    +		inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
    +	},
    +
    +	/* Close date picker if clicked elsewhere. */
    +	_checkExternalClick: function(event) {
    +		if (!$.datepicker._curInst)
    +			return;
    +
    +		var $target = $(event.target),
    +			inst = $.datepicker._getInst($target[0]);
    +
    +		if ( ( ( $target[0].id != $.datepicker._mainDivId &&
    +				$target.parents('#' + $.datepicker._mainDivId).length == 0 &&
    +				!$target.hasClass($.datepicker.markerClassName) &&
    +				!$target.closest("." + $.datepicker._triggerClass).length &&
    +				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
    +			( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst != inst ) )
    +			$.datepicker._hideDatepicker();
    +	},
    +
    +	/* Adjust one of the date sub-fields. */
    +	_adjustDate: function(id, offset, period) {
    +		var target = $(id);
    +		var inst = this._getInst(target[0]);
    +		if (this._isDisabledDatepicker(target[0])) {
    +			return;
    +		}
    +		this._adjustInstDate(inst, offset +
    +			(period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
    +			period);
    +		this._updateDatepicker(inst);
    +	},
    +
    +	/* Action for current link. */
    +	_gotoToday: function(id) {
    +		var target = $(id);
    +		var inst = this._getInst(target[0]);
    +		if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
    +			inst.selectedDay = inst.currentDay;
    +			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
    +			inst.drawYear = inst.selectedYear = inst.currentYear;
    +		}
    +		else {
    +			var date = new Date();
    +			inst.selectedDay = date.getDate();
    +			inst.drawMonth = inst.selectedMonth = date.getMonth();
    +			inst.drawYear = inst.selectedYear = date.getFullYear();
    +		}
    +		this._notifyChange(inst);
    +		this._adjustDate(target);
    +	},
    +
    +	/* Action for selecting a new month/year. */
    +	_selectMonthYear: function(id, select, period) {
    +		var target = $(id);
    +		var inst = this._getInst(target[0]);
    +		inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
    +		inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
    +			parseInt(select.options[select.selectedIndex].value,10);
    +		this._notifyChange(inst);
    +		this._adjustDate(target);
    +	},
    +
    +	/* Action for selecting a day. */
    +	_selectDay: function(id, month, year, td) {
    +		var target = $(id);
    +		if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
    +			return;
    +		}
    +		var inst = this._getInst(target[0]);
    +		inst.selectedDay = inst.currentDay = $('a', td).html();
    +		inst.selectedMonth = inst.currentMonth = month;
    +		inst.selectedYear = inst.currentYear = year;
    +		this._selectDate(id, this._formatDate(inst,
    +			inst.currentDay, inst.currentMonth, inst.currentYear));
    +	},
    +
    +	/* Erase the input field and hide the date picker. */
    +	_clearDate: function(id) {
    +		var target = $(id);
    +		var inst = this._getInst(target[0]);
    +		this._selectDate(target, '');
    +	},
    +
    +	/* Update the input field with the selected date. */
    +	_selectDate: function(id, dateStr) {
    +		var target = $(id);
    +		var inst = this._getInst(target[0]);
    +		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
    +		if (inst.input)
    +			inst.input.val(dateStr);
    +		this._updateAlternate(inst);
    +		var onSelect = this._get(inst, 'onSelect');
    +		if (onSelect)
    +			onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
    +		else if (inst.input)
    +			inst.input.trigger('change'); // fire the change event
    +		if (inst.inline)
    +			this._updateDatepicker(inst);
    +		else {
    +			this._hideDatepicker();
    +			this._lastInput = inst.input[0];
    +			if (typeof(inst.input[0]) != 'object')
    +				inst.input.focus(); // restore focus
    +			this._lastInput = null;
    +		}
    +	},
    +
    +	/* Update any alternate field to synchronise with the main field. */
    +	_updateAlternate: function(inst) {
    +		var altField = this._get(inst, 'altField');
    +		if (altField) { // update alternate field too
    +			var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
    +			var date = this._getDate(inst);
    +			var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
    +			$(altField).each(function() { $(this).val(dateStr); });
    +		}
    +	},
    +
    +	/* Set as beforeShowDay function to prevent selection of weekends.
    +	   @param  date  Date - the date to customise
    +	   @return [boolean, string] - is this date selectable?, what is its CSS class? */
    +	noWeekends: function(date) {
    +		var day = date.getDay();
    +		return [(day > 0 && day < 6), ''];
    +	},
    +
    +	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
    +	   @param  date  Date - the date to get the week for
    +	   @return  number - the number of the week within the year that contains this date */
    +	iso8601Week: function(date) {
    +		var checkDate = new Date(date.getTime());
    +		// Find Thursday of this week starting on Monday
    +		checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
    +		var time = checkDate.getTime();
    +		checkDate.setMonth(0); // Compare with Jan 1
    +		checkDate.setDate(1);
    +		return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
    +	},
    +
    +	/* Parse a string value into a date object.
    +	   See formatDate below for the possible formats.
    +
    +	   @param  format    string - the expected format of the date
    +	   @param  value     string - the date in the above format
    +	   @param  settings  Object - attributes include:
    +	                     shortYearCutoff  number - the cutoff year for determining the century (optional)
    +	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
    +	                     dayNames         string[7] - names of the days from Sunday (optional)
    +	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
    +	                     monthNames       string[12] - names of the months (optional)
    +	   @return  Date - the extracted date value or null if value is blank */
    +	parseDate: function (format, value, settings) {
    +		if (format == null || value == null)
    +			throw 'Invalid arguments';
    +		value = (typeof value == 'object' ? value.toString() : value + '');
    +		if (value == '')
    +			return null;
    +		var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
    +		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
    +				new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
    +		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
    +		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
    +		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
    +		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
    +		var year = -1;
    +		var month = -1;
    +		var day = -1;
    +		var doy = -1;
    +		var literal = false;
    +		// Check whether a format character is doubled
    +		var lookAhead = function(match) {
    +			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
    +			if (matches)
    +				iFormat++;
    +			return matches;
    +		};
    +		// Extract a number from the string value
    +		var getNumber = function(match) {
    +			var isDoubled = lookAhead(match);
    +			var size = (match == '@' ? 14 : (match == '!' ? 20 :
    +				(match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
    +			var digits = new RegExp('^\\d{1,' + size + '}');
    +			var num = value.substring(iValue).match(digits);
    +			if (!num)
    +				throw 'Missing number at position ' + iValue;
    +			iValue += num[0].length;
    +			return parseInt(num[0], 10);
    +		};
    +		// Extract a name from the string value and convert to an index
    +		var getName = function(match, shortNames, longNames) {
    +			var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
    +				return [ [k, v] ];
    +			}).sort(function (a, b) {
    +				return -(a[1].length - b[1].length);
    +			});
    +			var index = -1;
    +			$.each(names, function (i, pair) {
    +				var name = pair[1];
    +				if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) {
    +					index = pair[0];
    +					iValue += name.length;
    +					return false;
    +				}
    +			});
    +			if (index != -1)
    +				return index + 1;
    +			else
    +				throw 'Unknown name at position ' + iValue;
    +		};
    +		// Confirm that a literal character matches the string value
    +		var checkLiteral = function() {
    +			if (value.charAt(iValue) != format.charAt(iFormat))
    +				throw 'Unexpected literal at position ' + iValue;
    +			iValue++;
    +		};
    +		var iValue = 0;
    +		for (var iFormat = 0; iFormat < format.length; iFormat++) {
    +			if (literal)
    +				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
    +					literal = false;
    +				else
    +					checkLiteral();
    +			else
    +				switch (format.charAt(iFormat)) {
    +					case 'd':
    +						day = getNumber('d');
    +						break;
    +					case 'D':
    +						getName('D', dayNamesShort, dayNames);
    +						break;
    +					case 'o':
    +						doy = getNumber('o');
    +						break;
    +					case 'm':
    +						month = getNumber('m');
    +						break;
    +					case 'M':
    +						month = getName('M', monthNamesShort, monthNames);
    +						break;
    +					case 'y':
    +						year = getNumber('y');
    +						break;
    +					case '@':
    +						var date = new Date(getNumber('@'));
    +						year = date.getFullYear();
    +						month = date.getMonth() + 1;
    +						day = date.getDate();
    +						break;
    +					case '!':
    +						var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
    +						year = date.getFullYear();
    +						month = date.getMonth() + 1;
    +						day = date.getDate();
    +						break;
    +					case "'":
    +						if (lookAhead("'"))
    +							checkLiteral();
    +						else
    +							literal = true;
    +						break;
    +					default:
    +						checkLiteral();
    +				}
    +		}
    +		if (iValue < value.length){
    +			var extra = value.substr(iValue);
    +			if (!/^\s+/.test(extra)) {
    +				throw "Extra/unparsed characters found in date: " + extra;
    +			}
    +		}
    +		if (year == -1)
    +			year = new Date().getFullYear();
    +		else if (year < 100)
    +			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
    +				(year <= shortYearCutoff ? 0 : -100);
    +		if (doy > -1) {
    +			month = 1;
    +			day = doy;
    +			do {
    +				var dim = this._getDaysInMonth(year, month - 1);
    +				if (day <= dim)
    +					break;
    +				month++;
    +				day -= dim;
    +			} while (true);
    +		}
    +		var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
    +		if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
    +			throw 'Invalid date'; // E.g. 31/02/00
    +		return date;
    +	},
    +
    +	/* Standard date formats. */
    +	ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
    +	COOKIE: 'D, dd M yy',
    +	ISO_8601: 'yy-mm-dd',
    +	RFC_822: 'D, d M y',
    +	RFC_850: 'DD, dd-M-y',
    +	RFC_1036: 'D, d M y',
    +	RFC_1123: 'D, d M yy',
    +	RFC_2822: 'D, d M yy',
    +	RSS: 'D, d M y', // RFC 822
    +	TICKS: '!',
    +	TIMESTAMP: '@',
    +	W3C: 'yy-mm-dd', // ISO 8601
    +
    +	_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
    +		Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
    +
    +	/* Format a date object into a string value.
    +	   The format can be combinations of the following:
    +	   d  - day of month (no leading zero)
    +	   dd - day of month (two digit)
    +	   o  - day of year (no leading zeros)
    +	   oo - day of year (three digit)
    +	   D  - day name short
    +	   DD - day name long
    +	   m  - month of year (no leading zero)
    +	   mm - month of year (two digit)
    +	   M  - month name short
    +	   MM - month name long
    +	   y  - year (two digit)
    +	   yy - year (four digit)
    +	   @ - Unix timestamp (ms since 01/01/1970)
    +	   ! - Windows ticks (100ns since 01/01/0001)
    +	   '...' - literal text
    +	   '' - single quote
    +
    +	   @param  format    string - the desired format of the date
    +	   @param  date      Date - the date value to format
    +	   @param  settings  Object - attributes include:
    +	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
    +	                     dayNames         string[7] - names of the days from Sunday (optional)
    +	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
    +	                     monthNames       string[12] - names of the months (optional)
    +	   @return  string - the date in the above format */
    +	formatDate: function (format, date, settings) {
    +		if (!date)
    +			return '';
    +		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
    +		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
    +		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
    +		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
    +		// Check whether a format character is doubled
    +		var lookAhead = function(match) {
    +			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
    +			if (matches)
    +				iFormat++;
    +			return matches;
    +		};
    +		// Format a number, with leading zero if necessary
    +		var formatNumber = function(match, value, len) {
    +			var num = '' + value;
    +			if (lookAhead(match))
    +				while (num.length < len)
    +					num = '0' + num;
    +			return num;
    +		};
    +		// Format a name, short or long as requested
    +		var formatName = function(match, value, shortNames, longNames) {
    +			return (lookAhead(match) ? longNames[value] : shortNames[value]);
    +		};
    +		var output = '';
    +		var literal = false;
    +		if (date)
    +			for (var iFormat = 0; iFormat < format.length; iFormat++) {
    +				if (literal)
    +					if (format.charAt(iFormat) == "'" && !lookAhead("'"))
    +						literal = false;
    +					else
    +						output += format.charAt(iFormat);
    +				else
    +					switch (format.charAt(iFormat)) {
    +						case 'd':
    +							output += formatNumber('d', date.getDate(), 2);
    +							break;
    +						case 'D':
    +							output += formatName('D', date.getDay(), dayNamesShort, dayNames);
    +							break;
    +						case 'o':
    +							output += formatNumber('o',
    +								Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
    +							break;
    +						case 'm':
    +							output += formatNumber('m', date.getMonth() + 1, 2);
    +							break;
    +						case 'M':
    +							output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
    +							break;
    +						case 'y':
    +							output += (lookAhead('y') ? date.getFullYear() :
    +								(date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
    +							break;
    +						case '@':
    +							output += date.getTime();
    +							break;
    +						case '!':
    +							output += date.getTime() * 10000 + this._ticksTo1970;
    +							break;
    +						case "'":
    +							if (lookAhead("'"))
    +								output += "'";
    +							else
    +								literal = true;
    +							break;
    +						default:
    +							output += format.charAt(iFormat);
    +					}
    +			}
    +		return output;
    +	},
    +
    +	/* Extract all possible characters from the date format. */
    +	_possibleChars: function (format) {
    +		var chars = '';
    +		var literal = false;
    +		// Check whether a format character is doubled
    +		var lookAhead = function(match) {
    +			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
    +			if (matches)
    +				iFormat++;
    +			return matches;
    +		};
    +		for (var iFormat = 0; iFormat < format.length; iFormat++)
    +			if (literal)
    +				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
    +					literal = false;
    +				else
    +					chars += format.charAt(iFormat);
    +			else
    +				switch (format.charAt(iFormat)) {
    +					case 'd': case 'm': case 'y': case '@':
    +						chars += '0123456789';
    +						break;
    +					case 'D': case 'M':
    +						return null; // Accept anything
    +					case "'":
    +						if (lookAhead("'"))
    +							chars += "'";
    +						else
    +							literal = true;
    +						break;
    +					default:
    +						chars += format.charAt(iFormat);
    +				}
    +		return chars;
    +	},
    +
    +	/* Get a setting value, defaulting if necessary. */
    +	_get: function(inst, name) {
    +		return inst.settings[name] !== undefined ?
    +			inst.settings[name] : this._defaults[name];
    +	},
    +
    +	/* Parse existing date and initialise date picker. */
    +	_setDateFromField: function(inst, noDefault) {
    +		if (inst.input.val() == inst.lastVal) {
    +			return;
    +		}
    +		var dateFormat = this._get(inst, 'dateFormat');
    +		var dates = inst.lastVal = inst.input ? inst.input.val() : null;
    +		var date, defaultDate;
    +		date = defaultDate = this._getDefaultDate(inst);
    +		var settings = this._getFormatConfig(inst);
    +		try {
    +			date = this.parseDate(dateFormat, dates, settings) || defaultDate;
    +		} catch (event) {
    +			this.log(event);
    +			dates = (noDefault ? '' : dates);
    +		}
    +		inst.selectedDay = date.getDate();
    +		inst.drawMonth = inst.selectedMonth = date.getMonth();
    +		inst.drawYear = inst.selectedYear = date.getFullYear();
    +		inst.currentDay = (dates ? date.getDate() : 0);
    +		inst.currentMonth = (dates ? date.getMonth() : 0);
    +		inst.currentYear = (dates ? date.getFullYear() : 0);
    +		this._adjustInstDate(inst);
    +	},
    +
    +	/* Retrieve the default date shown on opening. */
    +	_getDefaultDate: function(inst) {
    +		return this._restrictMinMax(inst,
    +			this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
    +	},
    +
    +	/* A date may be specified as an exact value or a relative one. */
    +	_determineDate: function(inst, date, defaultDate) {
    +		var offsetNumeric = function(offset) {
    +			var date = new Date();
    +			date.setDate(date.getDate() + offset);
    +			return date;
    +		};
    +		var offsetString = function(offset) {
    +			try {
    +				return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
    +					offset, $.datepicker._getFormatConfig(inst));
    +			}
    +			catch (e) {
    +				// Ignore
    +			}
    +			var date = (offset.toLowerCase().match(/^c/) ?
    +				$.datepicker._getDate(inst) : null) || new Date();
    +			var year = date.getFullYear();
    +			var month = date.getMonth();
    +			var day = date.getDate();
    +			var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
    +			var matches = pattern.exec(offset);
    +			while (matches) {
    +				switch (matches[2] || 'd') {
    +					case 'd' : case 'D' :
    +						day += parseInt(matches[1],10); break;
    +					case 'w' : case 'W' :
    +						day += parseInt(matches[1],10) * 7; break;
    +					case 'm' : case 'M' :
    +						month += parseInt(matches[1],10);
    +						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
    +						break;
    +					case 'y': case 'Y' :
    +						year += parseInt(matches[1],10);
    +						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
    +						break;
    +				}
    +				matches = pattern.exec(offset);
    +			}
    +			return new Date(year, month, day);
    +		};
    +		var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
    +			(typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
    +		newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
    +		if (newDate) {
    +			newDate.setHours(0);
    +			newDate.setMinutes(0);
    +			newDate.setSeconds(0);
    +			newDate.setMilliseconds(0);
    +		}
    +		return this._daylightSavingAdjust(newDate);
    +	},
    +
    +	/* Handle switch to/from daylight saving.
    +	   Hours may be non-zero on daylight saving cut-over:
    +	   > 12 when midnight changeover, but then cannot generate
    +	   midnight datetime, so jump to 1AM, otherwise reset.
    +	   @param  date  (Date) the date to check
    +	   @return  (Date) the corrected date */
    +	_daylightSavingAdjust: function(date) {
    +		if (!date) return null;
    +		date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
    +		return date;
    +	},
    +
    +	/* Set the date(s) directly. */
    +	_setDate: function(inst, date, noChange) {
    +		var clear = !date;
    +		var origMonth = inst.selectedMonth;
    +		var origYear = inst.selectedYear;
    +		var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
    +		inst.selectedDay = inst.currentDay = newDate.getDate();
    +		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
    +		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
    +		if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
    +			this._notifyChange(inst);
    +		this._adjustInstDate(inst);
    +		if (inst.input) {
    +			inst.input.val(clear ? '' : this._formatDate(inst));
    +		}
    +	},
    +
    +	/* Retrieve the date(s) directly. */
    +	_getDate: function(inst) {
    +		var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
    +			this._daylightSavingAdjust(new Date(
    +			inst.currentYear, inst.currentMonth, inst.currentDay)));
    +			return startDate;
    +	},
    +
    +	/* Attach the onxxx handlers.  These are declared statically so
    +	 * they work with static code transformers like Caja.
    +	 */
    +	_attachHandlers: function(inst) {
    +		var stepMonths = this._get(inst, 'stepMonths');
    +		var id = '#' + inst.id.replace( /\\\\/g, "\\" );
    +		inst.dpDiv.find('[data-handler]').map(function () {
    +			var handler = {
    +				prev: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, -stepMonths, 'M');
    +				},
    +				next: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, +stepMonths, 'M');
    +				},
    +				hide: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._hideDatepicker();
    +				},
    +				today: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._gotoToday(id);
    +				},
    +				selectDay: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._selectDay(id, +this.getAttribute('data-month'), +this.getAttribute('data-year'), this);
    +					return false;
    +				},
    +				selectMonth: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'M');
    +					return false;
    +				},
    +				selectYear: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'Y');
    +					return false;
    +				}
    +			};
    +			$(this).bind(this.getAttribute('data-event'), handler[this.getAttribute('data-handler')]);
    +		});
    +	},
    +
    +	/* Generate the HTML for the current state of the date picker. */
    +	_generateHTML: function(inst) {
    +		var today = new Date();
    +		today = this._daylightSavingAdjust(
    +			new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
    +		var isRTL = this._get(inst, 'isRTL');
    +		var showButtonPanel = this._get(inst, 'showButtonPanel');
    +		var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
    +		var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
    +		var numMonths = this._getNumberOfMonths(inst);
    +		var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
    +		var stepMonths = this._get(inst, 'stepMonths');
    +		var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
    +		var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
    +			new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
    +		var minDate = this._getMinMaxDate(inst, 'min');
    +		var maxDate = this._getMinMaxDate(inst, 'max');
    +		var drawMonth = inst.drawMonth - showCurrentAtPos;
    +		var drawYear = inst.drawYear;
    +		if (drawMonth < 0) {
    +			drawMonth += 12;
    +			drawYear--;
    +		}
    +		if (maxDate) {
    +			var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
    +				maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
    +			maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
    +			while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
    +				drawMonth--;
    +				if (drawMonth < 0) {
    +					drawMonth = 11;
    +					drawYear--;
    +				}
    +			}
    +		}
    +		inst.drawMonth = drawMonth;
    +		inst.drawYear = drawYear;
    +		var prevText = this._get(inst, 'prevText');
    +		prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
    +			this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
    +			this._getFormatConfig(inst)));
    +		var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
    +			'<a class="ui-datepicker-prev ui-corner-all" data-handler="prev" data-event="click"' +
    +			' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
    +			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
    +		var nextText = this._get(inst, 'nextText');
    +		nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
    +			this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
    +			this._getFormatConfig(inst)));
    +		var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
    +			'<a class="ui-datepicker-next ui-corner-all" data-handler="next" data-event="click"' +
    +			' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
    +			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
    +		var currentText = this._get(inst, 'currentText');
    +		var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
    +		currentText = (!navigationAsDateFormat ? currentText :
    +			this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
    +		var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" data-handler="hide" data-event="click">' +
    +			this._get(inst, 'closeText') + '</button>' : '');
    +		var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
    +			(this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" data-handler="today" data-event="click"' +
    +			'>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
    +		var firstDay = parseInt(this._get(inst, 'firstDay'),10);
    +		firstDay = (isNaN(firstDay) ? 0 : firstDay);
    +		var showWeek = this._get(inst, 'showWeek');
    +		var dayNames = this._get(inst, 'dayNames');
    +		var dayNamesShort = this._get(inst, 'dayNamesShort');
    +		var dayNamesMin = this._get(inst, 'dayNamesMin');
    +		var monthNames = this._get(inst, 'monthNames');
    +		var monthNamesShort = this._get(inst, 'monthNamesShort');
    +		var beforeShowDay = this._get(inst, 'beforeShowDay');
    +		var showOtherMonths = this._get(inst, 'showOtherMonths');
    +		var selectOtherMonths = this._get(inst, 'selectOtherMonths');
    +		var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
    +		var defaultDate = this._getDefaultDate(inst);
    +		var html = '';
    +		for (var row = 0; row < numMonths[0]; row++) {
    +			var group = '';
    +			this.maxRows = 4;
    +			for (var col = 0; col < numMonths[1]; col++) {
    +				var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
    +				var cornerClass = ' ui-corner-all';
    +				var calender = '';
    +				if (isMultiMonth) {
    +					calender += '<div class="ui-datepicker-group';
    +					if (numMonths[1] > 1)
    +						switch (col) {
    +							case 0: calender += ' ui-datepicker-group-first';
    +								cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
    +							case numMonths[1]-1: calender += ' ui-datepicker-group-last';
    +								cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
    +							default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
    +						}
    +					calender += '">';
    +				}
    +				calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
    +					(/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
    +					(/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
    +					this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
    +					row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
    +					'</div><table class="ui-datepicker-calendar"><thead>' +
    +					'<tr>';
    +				var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
    +				for (var dow = 0; dow < 7; dow++) { // days of the week
    +					var day = (dow + firstDay) % 7;
    +					thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
    +						'<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
    +				}
    +				calender += thead + '</tr></thead><tbody>';
    +				var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
    +				if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
    +					inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
    +				var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
    +				var curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
    +				var numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
    +				this.maxRows = numRows;
    +				var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
    +				for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
    +					calender += '<tr>';
    +					var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
    +						this._get(inst, 'calculateWeek')(printDate) + '</td>');
    +					for (var dow = 0; dow < 7; dow++) { // create date picker days
    +						var daySettings = (beforeShowDay ?
    +							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
    +						var otherMonth = (printDate.getMonth() != drawMonth);
    +						var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
    +							(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
    +						tbody += '<td class="' +
    +							((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
    +							(otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
    +							((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
    +							(defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
    +							// or defaultDate is current printedDate and defaultDate is selectedDate
    +							' ' + this._dayOverClass : '') + // highlight selected day
    +							(unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') +  // highlight unselectable days
    +							(otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
    +							(printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
    +							(printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
    +							((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
    +							(unselectable ? '' : ' data-handler="selectDay" data-event="click" data-month="' + printDate.getMonth() + '" data-year="' + printDate.getFullYear() + '"') + '>' + // actions
    +							(otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
    +							(unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
    +							(printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
    +							(printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
    +							(otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
    +							'" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
    +						printDate.setDate(printDate.getDate() + 1);
    +						printDate = this._daylightSavingAdjust(printDate);
    +					}
    +					calender += tbody + '</tr>';
    +				}
    +				drawMonth++;
    +				if (drawMonth > 11) {
    +					drawMonth = 0;
    +					drawYear++;
    +				}
    +				calender += '</tbody></table>' + (isMultiMonth ? '</div>' +
    +							((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
    +				group += calender;
    +			}
    +			html += group;
    +		}
    +		html += buttonPanel + ($.ui.ie6 && !inst.inline ?
    +			'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
    +		inst._keyEvent = false;
    +		return html;
    +	},
    +
    +	/* Generate the month and year header. */
    +	_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
    +			secondary, monthNames, monthNamesShort) {
    +		var changeMonth = this._get(inst, 'changeMonth');
    +		var changeYear = this._get(inst, 'changeYear');
    +		var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
    +		var html = '<div class="ui-datepicker-title">';
    +		var monthHtml = '';
    +		// month selection
    +		if (secondary || !changeMonth)
    +			monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
    +		else {
    +			var inMinYear = (minDate && minDate.getFullYear() == drawYear);
    +			var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
    +			monthHtml += '<select class="ui-datepicker-month" data-handler="selectMonth" data-event="change">';
    +			for (var month = 0; month < 12; month++) {
    +				if ((!inMinYear || month >= minDate.getMonth()) &&
    +						(!inMaxYear || month <= maxDate.getMonth()))
    +					monthHtml += '<option value="' + month + '"' +
    +						(month == drawMonth ? ' selected="selected"' : '') +
    +						'>' + monthNamesShort[month] + '</option>';
    +			}
    +			monthHtml += '</select>';
    +		}
    +		if (!showMonthAfterYear)
    +			html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
    +		// year selection
    +		if ( !inst.yearshtml ) {
    +			inst.yearshtml = '';
    +			if (secondary || !changeYear)
    +				html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
    +			else {
    +				// determine range of years to display
    +				var years = this._get(inst, 'yearRange').split(':');
    +				var thisYear = new Date().getFullYear();
    +				var determineYear = function(value) {
    +					var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
    +						(value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
    +						parseInt(value, 10)));
    +					return (isNaN(year) ? thisYear : year);
    +				};
    +				var year = determineYear(years[0]);
    +				var endYear = Math.max(year, determineYear(years[1] || ''));
    +				year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
    +				endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
    +				inst.yearshtml += '<select class="ui-datepicker-year" data-handler="selectYear" data-event="change">';
    +				for (; year <= endYear; year++) {
    +					inst.yearshtml += '<option value="' + year + '"' +
    +						(year == drawYear ? ' selected="selected"' : '') +
    +						'>' + year + '</option>';
    +				}
    +				inst.yearshtml += '</select>';
    +
    +				html += inst.yearshtml;
    +				inst.yearshtml = null;
    +			}
    +		}
    +		html += this._get(inst, 'yearSuffix');
    +		if (showMonthAfterYear)
    +			html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml;
    +		html += '</div>'; // Close datepicker_header
    +		return html;
    +	},
    +
    +	/* Adjust one of the date sub-fields. */
    +	_adjustInstDate: function(inst, offset, period) {
    +		var year = inst.drawYear + (period == 'Y' ? offset : 0);
    +		var month = inst.drawMonth + (period == 'M' ? offset : 0);
    +		var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
    +			(period == 'D' ? offset : 0);
    +		var date = this._restrictMinMax(inst,
    +			this._daylightSavingAdjust(new Date(year, month, day)));
    +		inst.selectedDay = date.getDate();
    +		inst.drawMonth = inst.selectedMonth = date.getMonth();
    +		inst.drawYear = inst.selectedYear = date.getFullYear();
    +		if (period == 'M' || period == 'Y')
    +			this._notifyChange(inst);
    +	},
    +
    +	/* Ensure a date is within any min/max bounds. */
    +	_restrictMinMax: function(inst, date) {
    +		var minDate = this._getMinMaxDate(inst, 'min');
    +		var maxDate = this._getMinMaxDate(inst, 'max');
    +		var newDate = (minDate && date < minDate ? minDate : date);
    +		newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
    +		return newDate;
    +	},
    +
    +	/* Notify change of month/year. */
    +	_notifyChange: function(inst) {
    +		var onChange = this._get(inst, 'onChangeMonthYear');
    +		if (onChange)
    +			onChange.apply((inst.input ? inst.input[0] : null),
    +				[inst.selectedYear, inst.selectedMonth + 1, inst]);
    +	},
    +
    +	/* Determine the number of months to show. */
    +	_getNumberOfMonths: function(inst) {
    +		var numMonths = this._get(inst, 'numberOfMonths');
    +		return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
    +	},
    +
    +	/* Determine the current maximum date - ensure no time components are set. */
    +	_getMinMaxDate: function(inst, minMax) {
    +		return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
    +	},
    +
    +	/* Find the number of days in a given month. */
    +	_getDaysInMonth: function(year, month) {
    +		return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
    +	},
    +
    +	/* Find the day of the week of the first of a month. */
    +	_getFirstDayOfMonth: function(year, month) {
    +		return new Date(year, month, 1).getDay();
    +	},
    +
    +	/* Determines if we should allow a "next/prev" month display change. */
    +	_canAdjustMonth: function(inst, offset, curYear, curMonth) {
    +		var numMonths = this._getNumberOfMonths(inst);
    +		var date = this._daylightSavingAdjust(new Date(curYear,
    +			curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
    +		if (offset < 0)
    +			date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
    +		return this._isInRange(inst, date);
    +	},
    +
    +	/* Is the given date in the accepted range? */
    +	_isInRange: function(inst, date) {
    +		var minDate = this._getMinMaxDate(inst, 'min');
    +		var maxDate = this._getMinMaxDate(inst, 'max');
    +		return ((!minDate || date.getTime() >= minDate.getTime()) &&
    +			(!maxDate || date.getTime() <= maxDate.getTime()));
    +	},
    +
    +	/* Provide the configuration settings for formatting/parsing. */
    +	_getFormatConfig: function(inst) {
    +		var shortYearCutoff = this._get(inst, 'shortYearCutoff');
    +		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
    +			new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
    +		return {shortYearCutoff: shortYearCutoff,
    +			dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
    +			monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
    +	},
    +
    +	/* Format the given date for display. */
    +	_formatDate: function(inst, day, month, year) {
    +		if (!day) {
    +			inst.currentDay = inst.selectedDay;
    +			inst.currentMonth = inst.selectedMonth;
    +			inst.currentYear = inst.selectedYear;
    +		}
    +		var date = (day ? (typeof day == 'object' ? day :
    +			this._daylightSavingAdjust(new Date(year, month, day))) :
    +			this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
    +		return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
    +	}
    +});
    +
    +/*
    + * Bind hover events for datepicker elements.
    + * Done via delegate so the binding only occurs once in the lifetime of the parent div.
    + * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
    + */
    +function bindHover(dpDiv) {
    +	var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
    +	return dpDiv.delegate(selector, 'mouseout', function() {
    +			$(this).removeClass('ui-state-hover');
    +			if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
    +			if (this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
    +		})
    +		.delegate(selector, 'mouseover', function(){
    +			if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) {
    +				$(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
    +				$(this).addClass('ui-state-hover');
    +				if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
    +				if (this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
    +			}
    +		});
    +}
    +
    +/* jQuery extend now ignores nulls! */
    +function extendRemove(target, props) {
    +	$.extend(target, props);
    +	for (var name in props)
    +		if (props[name] == null || props[name] == undefined)
    +			target[name] = props[name];
    +	return target;
    +};
    +
    +/* Invoke the datepicker functionality.
    +   @param  options  string - a command, optionally followed by additional parameters or
    +	                Object - settings for attaching new datepicker functionality
    +   @return  jQuery object */
    +$.fn.datepicker = function(options){
    +
    +	/* Verify an empty collection wasn't passed - Fixes #6976 */
    +	if ( !this.length ) {
    +		return this;
    +	}
    +
    +	/* Initialise the date picker. */
    +	if (!$.datepicker.initialized) {
    +		$(document).mousedown($.datepicker._checkExternalClick).
    +			find(document.body).append($.datepicker.dpDiv);
    +		$.datepicker.initialized = true;
    +	}
    +
    +	var otherArgs = Array.prototype.slice.call(arguments, 1);
    +	if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
    +		return $.datepicker['_' + options + 'Datepicker'].
    +			apply($.datepicker, [this[0]].concat(otherArgs));
    +	if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
    +		return $.datepicker['_' + options + 'Datepicker'].
    +			apply($.datepicker, [this[0]].concat(otherArgs));
    +	return this.each(function() {
    +		typeof options == 'string' ?
    +			$.datepicker['_' + options + 'Datepicker'].
    +				apply($.datepicker, [this].concat(otherArgs)) :
    +			$.datepicker._attachDatepicker(this, options);
    +	});
    +};
    +
    +$.datepicker = new Datepicker(); // singleton instance
    +$.datepicker.initialized = false;
    +$.datepicker.uuid = new Date().getTime();
    +$.datepicker.version = "1.9.2";
    +
    +// Workaround for #4055
    +// Add another global to avoid noConflict issues with inline event handlers
    +window['DP_jQuery_' + dpuuid] = $;
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +var uiDialogClasses = "ui-dialog ui-widget ui-widget-content ui-corner-all ",
    +	sizeRelatedOptions = {
    +		buttons: true,
    +		height: true,
    +		maxHeight: true,
    +		maxWidth: true,
    +		minHeight: true,
    +		minWidth: true,
    +		width: true
    +	},
    +	resizableRelatedOptions = {
    +		maxHeight: true,
    +		maxWidth: true,
    +		minHeight: true,
    +		minWidth: true
    +	};
    +
    +$.widget("ui.dialog", {
    +	version: "1.9.2",
    +	options: {
    +		autoOpen: true,
    +		buttons: {},
    +		closeOnEscape: true,
    +		closeText: "close",
    +		dialogClass: "",
    +		draggable: true,
    +		hide: null,
    +		height: "auto",
    +		maxHeight: false,
    +		maxWidth: false,
    +		minHeight: 150,
    +		minWidth: 150,
    +		modal: false,
    +		position: {
    +			my: "center",
    +			at: "center",
    +			of: window,
    +			collision: "fit",
    +			// ensure that the titlebar is never outside the document
    +			using: function( pos ) {
    +				var topOffset = $( this ).css( pos ).offset().top;
    +				if ( topOffset < 0 ) {
    +					$( this ).css( "top", pos.top - topOffset );
    +				}
    +			}
    +		},
    +		resizable: true,
    +		show: null,
    +		stack: true,
    +		title: "",
    +		width: 300,
    +		zIndex: 1000
    +	},
    +
    +	_create: function() {
    +		this.originalTitle = this.element.attr( "title" );
    +		// #5742 - .attr() might return a DOMElement
    +		if ( typeof this.originalTitle !== "string" ) {
    +			this.originalTitle = "";
    +		}
    +		this.oldPosition = {
    +			parent: this.element.parent(),
    +			index: this.element.parent().children().index( this.element )
    +		};
    +		this.options.title = this.options.title || this.originalTitle;
    +		var that = this,
    +			options = this.options,
    +
    +			title = options.title || "&#160;",
    +			uiDialog,
    +			uiDialogTitlebar,
    +			uiDialogTitlebarClose,
    +			uiDialogTitle,
    +			uiDialogButtonPane;
    +
    +			uiDialog = ( this.uiDialog = $( "<div>" ) )
    +				.addClass( uiDialogClasses + options.dialogClass )
    +				.css({
    +					display: "none",
    +					outline: 0, // TODO: move to stylesheet
    +					zIndex: options.zIndex
    +				})
    +				// setting tabIndex makes the div focusable
    +				.attr( "tabIndex", -1)
    +				.keydown(function( event ) {
    +					if ( options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
    +							event.keyCode === $.ui.keyCode.ESCAPE ) {
    +						that.close( event );
    +						event.preventDefault();
    +					}
    +				})
    +				.mousedown(function( event ) {
    +					that.moveToTop( false, event );
    +				})
    +				.appendTo( "body" );
    +
    +			this.element
    +				.show()
    +				.removeAttr( "title" )
    +				.addClass( "ui-dialog-content ui-widget-content" )
    +				.appendTo( uiDialog );
    +
    +			uiDialogTitlebar = ( this.uiDialogTitlebar = $( "<div>" ) )
    +				.addClass( "ui-dialog-titlebar  ui-widget-header  " +
    +					"ui-corner-all  ui-helper-clearfix" )
    +				.bind( "mousedown", function() {
    +					// Dialog isn't getting focus when dragging (#8063)
    +					uiDialog.focus();
    +				})
    +				.prependTo( uiDialog );
    +
    +			uiDialogTitlebarClose = $( "<a href='#'></a>" )
    +				.addClass( "ui-dialog-titlebar-close  ui-corner-all" )
    +				.attr( "role", "button" )
    +				.click(function( event ) {
    +					event.preventDefault();
    +					that.close( event );
    +				})
    +				.appendTo( uiDialogTitlebar );
    +
    +			( this.uiDialogTitlebarCloseText = $( "<span>" ) )
    +				.addClass( "ui-icon ui-icon-closethick" )
    +				.text( options.closeText )
    +				.appendTo( uiDialogTitlebarClose );
    +
    +			uiDialogTitle = $( "<span>" )
    +				.uniqueId()
    +				.addClass( "ui-dialog-title" )
    +				.html( title )
    +				.prependTo( uiDialogTitlebar );
    +
    +			uiDialogButtonPane = ( this.uiDialogButtonPane = $( "<div>" ) )
    +				.addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
    +
    +			( this.uiButtonSet = $( "<div>" ) )
    +				.addClass( "ui-dialog-buttonset" )
    +				.appendTo( uiDialogButtonPane );
    +
    +		uiDialog.attr({
    +			role: "dialog",
    +			"aria-labelledby": uiDialogTitle.attr( "id" )
    +		});
    +
    +		uiDialogTitlebar.find( "*" ).add( uiDialogTitlebar ).disableSelection();
    +		this._hoverable( uiDialogTitlebarClose );
    +		this._focusable( uiDialogTitlebarClose );
    +
    +		if ( options.draggable && $.fn.draggable ) {
    +			this._makeDraggable();
    +		}
    +		if ( options.resizable && $.fn.resizable ) {
    +			this._makeResizable();
    +		}
    +
    +		this._createButtons( options.buttons );
    +		this._isOpen = false;
    +
    +		if ( $.fn.bgiframe ) {
    +			uiDialog.bgiframe();
    +		}
    +
    +		// prevent tabbing out of modal dialogs
    +		this._on( uiDialog, { keydown: function( event ) {
    +			if ( !options.modal || event.keyCode !== $.ui.keyCode.TAB ) {
    +				return;
    +			}
    +
    +			var tabbables = $( ":tabbable", uiDialog ),
    +				first = tabbables.filter( ":first" ),
    +				last  = tabbables.filter( ":last" );
    +
    +			if ( event.target === last[0] && !event.shiftKey ) {
    +				first.focus( 1 );
    +				return false;
    +			} else if ( event.target === first[0] && event.shiftKey ) {
    +				last.focus( 1 );
    +				return false;
    +			}
    +		}});
    +	},
    +
    +	_init: function() {
    +		if ( this.options.autoOpen ) {
    +			this.open();
    +		}
    +	},
    +
    +	_destroy: function() {
    +		var next,
    +			oldPosition = this.oldPosition;
    +
    +		if ( this.overlay ) {
    +			this.overlay.destroy();
    +		}
    +		this.uiDialog.hide();
    +		this.element
    +			.removeClass( "ui-dialog-content ui-widget-content" )
    +			.hide()
    +			.appendTo( "body" );
    +		this.uiDialog.remove();
    +
    +		if ( this.originalTitle ) {
    +			this.element.attr( "title", this.originalTitle );
    +		}
    +
    +		next = oldPosition.parent.children().eq( oldPosition.index );
    +		// Don't try to place the dialog next to itself (#8613)
    +		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
    +			next.before( this.element );
    +		} else {
    +			oldPosition.parent.append( this.element );
    +		}
    +	},
    +
    +	widget: function() {
    +		return this.uiDialog;
    +	},
    +
    +	close: function( event ) {
    +		var that = this,
    +			maxZ, thisZ;
    +
    +		if ( !this._isOpen ) {
    +			return;
    +		}
    +
    +		if ( false === this._trigger( "beforeClose", event ) ) {
    +			return;
    +		}
    +
    +		this._isOpen = false;
    +
    +		if ( this.overlay ) {
    +			this.overlay.destroy();
    +		}
    +
    +		if ( this.options.hide ) {
    +			this._hide( this.uiDialog, this.options.hide, function() {
    +				that._trigger( "close", event );
    +			});
    +		} else {
    +			this.uiDialog.hide();
    +			this._trigger( "close", event );
    +		}
    +
    +		$.ui.dialog.overlay.resize();
    +
    +		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
    +		if ( this.options.modal ) {
    +			maxZ = 0;
    +			$( ".ui-dialog" ).each(function() {
    +				if ( this !== that.uiDialog[0] ) {
    +					thisZ = $( this ).css( "z-index" );
    +					if ( !isNaN( thisZ ) ) {
    +						maxZ = Math.max( maxZ, thisZ );
    +					}
    +				}
    +			});
    +			$.ui.dialog.maxZ = maxZ;
    +		}
    +
    +		return this;
    +	},
    +
    +	isOpen: function() {
    +		return this._isOpen;
    +	},
    +
    +	// the force parameter allows us to move modal dialogs to their correct
    +	// position on open
    +	moveToTop: function( force, event ) {
    +		var options = this.options,
    +			saveScroll;
    +
    +		if ( ( options.modal && !force ) ||
    +				( !options.stack && !options.modal ) ) {
    +			return this._trigger( "focus", event );
    +		}
    +
    +		if ( options.zIndex > $.ui.dialog.maxZ ) {
    +			$.ui.dialog.maxZ = options.zIndex;
    +		}
    +		if ( this.overlay ) {
    +			$.ui.dialog.maxZ += 1;
    +			$.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ;
    +			this.overlay.$el.css( "z-index", $.ui.dialog.overlay.maxZ );
    +		}
    +
    +		// Save and then restore scroll
    +		// Opera 9.5+ resets when parent z-index is changed.
    +		// http://bugs.jqueryui.com/ticket/3193
    +		saveScroll = {
    +			scrollTop: this.element.scrollTop(),
    +			scrollLeft: this.element.scrollLeft()
    +		};
    +		$.ui.dialog.maxZ += 1;
    +		this.uiDialog.css( "z-index", $.ui.dialog.maxZ );
    +		this.element.attr( saveScroll );
    +		this._trigger( "focus", event );
    +
    +		return this;
    +	},
    +
    +	open: function() {
    +		if ( this._isOpen ) {
    +			return;
    +		}
    +
    +		var hasFocus,
    +			options = this.options,
    +			uiDialog = this.uiDialog;
    +
    +		this._size();
    +		this._position( options.position );
    +		uiDialog.show( options.show );
    +		this.overlay = options.modal ? new $.ui.dialog.overlay( this ) : null;
    +		this.moveToTop( true );
    +
    +		// set focus to the first tabbable element in the content area or the first button
    +		// if there are no tabbable elements, set focus on the dialog itself
    +		hasFocus = this.element.find( ":tabbable" );
    +		if ( !hasFocus.length ) {
    +			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
    +			if ( !hasFocus.length ) {
    +				hasFocus = uiDialog;
    +			}
    +		}
    +		hasFocus.eq( 0 ).focus();
    +
    +		this._isOpen = true;
    +		this._trigger( "open" );
    +
    +		return this;
    +	},
    +
    +	_createButtons: function( buttons ) {
    +		var that = this,
    +			hasButtons = false;
    +
    +		// if we already have a button pane, remove it
    +		this.uiDialogButtonPane.remove();
    +		this.uiButtonSet.empty();
    +
    +		if ( typeof buttons === "object" && buttons !== null ) {
    +			$.each( buttons, function() {
    +				return !(hasButtons = true);
    +			});
    +		}
    +		if ( hasButtons ) {
    +			$.each( buttons, function( name, props ) {
    +				var button, click;
    +				props = $.isFunction( props ) ?
    +					{ click: props, text: name } :
    +					props;
    +				// Default to a non-submitting button
    +				props = $.extend( { type: "button" }, props );
    +				// Change the context for the click callback to be the main element
    +				click = props.click;
    +				props.click = function() {
    +					click.apply( that.element[0], arguments );
    +				};
    +				button = $( "<button></button>", props )
    +					.appendTo( that.uiButtonSet );
    +				if ( $.fn.button ) {
    +					button.button();
    +				}
    +			});
    +			this.uiDialog.addClass( "ui-dialog-buttons" );
    +			this.uiDialogButtonPane.appendTo( this.uiDialog );
    +		} else {
    +			this.uiDialog.removeClass( "ui-dialog-buttons" );
    +		}
    +	},
    +
    +	_makeDraggable: function() {
    +		var that = this,
    +			options = this.options;
    +
    +		function filteredUi( ui ) {
    +			return {
    +				position: ui.position,
    +				offset: ui.offset
    +			};
    +		}
    +
    +		this.uiDialog.draggable({
    +			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
    +			handle: ".ui-dialog-titlebar",
    +			containment: "document",
    +			start: function( event, ui ) {
    +				$( this )
    +					.addClass( "ui-dialog-dragging" );
    +				that._trigger( "dragStart", event, filteredUi( ui ) );
    +			},
    +			drag: function( event, ui ) {
    +				that._trigger( "drag", event, filteredUi( ui ) );
    +			},
    +			stop: function( event, ui ) {
    +				options.position = [
    +					ui.position.left - that.document.scrollLeft(),
    +					ui.position.top - that.document.scrollTop()
    +				];
    +				$( this )
    +					.removeClass( "ui-dialog-dragging" );
    +				that._trigger( "dragStop", event, filteredUi( ui ) );
    +				$.ui.dialog.overlay.resize();
    +			}
    +		});
    +	},
    +
    +	_makeResizable: function( handles ) {
    +		handles = (handles === undefined ? this.options.resizable : handles);
    +		var that = this,
    +			options = this.options,
    +			// .ui-resizable has position: relative defined in the stylesheet
    +			// but dialogs have to use absolute or fixed positioning
    +			position = this.uiDialog.css( "position" ),
    +			resizeHandles = typeof handles === 'string' ?
    +				handles	:
    +				"n,e,s,w,se,sw,ne,nw";
    +
    +		function filteredUi( ui ) {
    +			return {
    +				originalPosition: ui.originalPosition,
    +				originalSize: ui.originalSize,
    +				position: ui.position,
    +				size: ui.size
    +			};
    +		}
    +
    +		this.uiDialog.resizable({
    +			cancel: ".ui-dialog-content",
    +			containment: "document",
    +			alsoResize: this.element,
    +			maxWidth: options.maxWidth,
    +			maxHeight: options.maxHeight,
    +			minWidth: options.minWidth,
    +			minHeight: this._minHeight(),
    +			handles: resizeHandles,
    +			start: function( event, ui ) {
    +				$( this ).addClass( "ui-dialog-resizing" );
    +				that._trigger( "resizeStart", event, filteredUi( ui ) );
    +			},
    +			resize: function( event, ui ) {
    +				that._trigger( "resize", event, filteredUi( ui ) );
    +			},
    +			stop: function( event, ui ) {
    +				$( this ).removeClass( "ui-dialog-resizing" );
    +				options.height = $( this ).height();
    +				options.width = $( this ).width();
    +				that._trigger( "resizeStop", event, filteredUi( ui ) );
    +				$.ui.dialog.overlay.resize();
    +			}
    +		})
    +		.css( "position", position )
    +		.find( ".ui-resizable-se" )
    +			.addClass( "ui-icon ui-icon-grip-diagonal-se" );
    +	},
    +
    +	_minHeight: function() {
    +		var options = this.options;
    +
    +		if ( options.height === "auto" ) {
    +			return options.minHeight;
    +		} else {
    +			return Math.min( options.minHeight, options.height );
    +		}
    +	},
    +
    +	_position: function( position ) {
    +		var myAt = [],
    +			offset = [ 0, 0 ],
    +			isVisible;
    +
    +		if ( position ) {
    +			// deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
    +	//		if (typeof position == 'string' || $.isArray(position)) {
    +	//			myAt = $.isArray(position) ? position : position.split(' ');
    +
    +			if ( typeof position === "string" || (typeof position === "object" && "0" in position ) ) {
    +				myAt = position.split ? position.split( " " ) : [ position[ 0 ], position[ 1 ] ];
    +				if ( myAt.length === 1 ) {
    +					myAt[ 1 ] = myAt[ 0 ];
    +				}
    +
    +				$.each( [ "left", "top" ], function( i, offsetPosition ) {
    +					if ( +myAt[ i ] === myAt[ i ] ) {
    +						offset[ i ] = myAt[ i ];
    +						myAt[ i ] = offsetPosition;
    +					}
    +				});
    +
    +				position = {
    +					my: myAt[0] + (offset[0] < 0 ? offset[0] : "+" + offset[0]) + " " +
    +						myAt[1] + (offset[1] < 0 ? offset[1] : "+" + offset[1]),
    +					at: myAt.join( " " )
    +				};
    +			}
    +
    +			position = $.extend( {}, $.ui.dialog.prototype.options.position, position );
    +		} else {
    +			position = $.ui.dialog.prototype.options.position;
    +		}
    +
    +		// need to show the dialog to get the actual offset in the position plugin
    +		isVisible = this.uiDialog.is( ":visible" );
    +		if ( !isVisible ) {
    +			this.uiDialog.show();
    +		}
    +		this.uiDialog.position( position );
    +		if ( !isVisible ) {
    +			this.uiDialog.hide();
    +		}
    +	},
    +
    +	_setOptions: function( options ) {
    +		var that = this,
    +			resizableOptions = {},
    +			resize = false;
    +
    +		$.each( options, function( key, value ) {
    +			that._setOption( key, value );
    +
    +			if ( key in sizeRelatedOptions ) {
    +				resize = true;
    +			}
    +			if ( key in resizableRelatedOptions ) {
    +				resizableOptions[ key ] = value;
    +			}
    +		});
    +
    +		if ( resize ) {
    +			this._size();
    +		}
    +		if ( this.uiDialog.is( ":data(resizable)" ) ) {
    +			this.uiDialog.resizable( "option", resizableOptions );
    +		}
    +	},
    +
    +	_setOption: function( key, value ) {
    +		var isDraggable, isResizable,
    +			uiDialog = this.uiDialog;
    +
    +		switch ( key ) {
    +			case "buttons":
    +				this._createButtons( value );
    +				break;
    +			case "closeText":
    +				// ensure that we always pass a string
    +				this.uiDialogTitlebarCloseText.text( "" + value );
    +				break;
    +			case "dialogClass":
    +				uiDialog
    +					.removeClass( this.options.dialogClass )
    +					.addClass( uiDialogClasses + value );
    +				break;
    +			case "disabled":
    +				if ( value ) {
    +					uiDialog.addClass( "ui-dialog-disabled" );
    +				} else {
    +					uiDialog.removeClass( "ui-dialog-disabled" );
    +				}
    +				break;
    +			case "draggable":
    +				isDraggable = uiDialog.is( ":data(draggable)" );
    +				if ( isDraggable && !value ) {
    +					uiDialog.draggable( "destroy" );
    +				}
    +
    +				if ( !isDraggable && value ) {
    +					this._makeDraggable();
    +				}
    +				break;
    +			case "position":
    +				this._position( value );
    +				break;
    +			case "resizable":
    +				// currently resizable, becoming non-resizable
    +				isResizable = uiDialog.is( ":data(resizable)" );
    +				if ( isResizable && !value ) {
    +					uiDialog.resizable( "destroy" );
    +				}
    +
    +				// currently resizable, changing handles
    +				if ( isResizable && typeof value === "string" ) {
    +					uiDialog.resizable( "option", "handles", value );
    +				}
    +
    +				// currently non-resizable, becoming resizable
    +				if ( !isResizable && value !== false ) {
    +					this._makeResizable( value );
    +				}
    +				break;
    +			case "title":
    +				// convert whatever was passed in o a string, for html() to not throw up
    +				$( ".ui-dialog-title", this.uiDialogTitlebar )
    +					.html( "" + ( value || "&#160;" ) );
    +				break;
    +		}
    +
    +		this._super( key, value );
    +	},
    +
    +	_size: function() {
    +		/* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
    +		 * divs will both have width and height set, so we need to reset them
    +		 */
    +		var nonContentHeight, minContentHeight, autoHeight,
    +			options = this.options,
    +			isVisible = this.uiDialog.is( ":visible" );
    +
    +		// reset content sizing
    +		this.element.show().css({
    +			width: "auto",
    +			minHeight: 0,
    +			height: 0
    +		});
    +
    +		if ( options.minWidth > options.width ) {
    +			options.width = options.minWidth;
    +		}
    +
    +		// reset wrapper sizing
    +		// determine the height of all the non-content elements
    +		nonContentHeight = this.uiDialog.css({
    +				height: "auto",
    +				width: options.width
    +			})
    +			.outerHeight();
    +		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
    +
    +		if ( options.height === "auto" ) {
    +			// only needed for IE6 support
    +			if ( $.support.minHeight ) {
    +				this.element.css({
    +					minHeight: minContentHeight,
    +					height: "auto"
    +				});
    +			} else {
    +				this.uiDialog.show();
    +				autoHeight = this.element.css( "height", "auto" ).height();
    +				if ( !isVisible ) {
    +					this.uiDialog.hide();
    +				}
    +				this.element.height( Math.max( autoHeight, minContentHeight ) );
    +			}
    +		} else {
    +			this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
    +		}
    +
    +		if (this.uiDialog.is( ":data(resizable)" ) ) {
    +			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
    +		}
    +	}
    +});
    +
    +$.extend($.ui.dialog, {
    +	uuid: 0,
    +	maxZ: 0,
    +
    +	getTitleId: function($el) {
    +		var id = $el.attr( "id" );
    +		if ( !id ) {
    +			this.uuid += 1;
    +			id = this.uuid;
    +		}
    +		return "ui-dialog-title-" + id;
    +	},
    +
    +	overlay: function( dialog ) {
    +		this.$el = $.ui.dialog.overlay.create( dialog );
    +	}
    +});
    +
    +$.extend( $.ui.dialog.overlay, {
    +	instances: [],
    +	// reuse old instances due to IE memory leak with alpha transparency (see #5185)
    +	oldInstances: [],
    +	maxZ: 0,
    +	events: $.map(
    +		"focus,mousedown,mouseup,keydown,keypress,click".split( "," ),
    +		function( event ) {
    +			return event + ".dialog-overlay";
    +		}
    +	).join( " " ),
    +	create: function( dialog ) {
    +		if ( this.instances.length === 0 ) {
    +			// prevent use of anchors and inputs
    +			// we use a setTimeout in case the overlay is created from an
    +			// event that we're going to be cancelling (see #2804)
    +			setTimeout(function() {
    +				// handle $(el).dialog().dialog('close') (see #4065)
    +				if ( $.ui.dialog.overlay.instances.length ) {
    +					$( document ).bind( $.ui.dialog.overlay.events, function( event ) {
    +						// stop events if the z-index of the target is < the z-index of the overlay
    +						// we cannot return true when we don't want to cancel the event (#3523)
    +						if ( $( event.target ).zIndex() < $.ui.dialog.overlay.maxZ ) {
    +							return false;
    +						}
    +					});
    +				}
    +			}, 1 );
    +
    +			// handle window resize
    +			$( window ).bind( "resize.dialog-overlay", $.ui.dialog.overlay.resize );
    +		}
    +
    +		var $el = ( this.oldInstances.pop() || $( "<div>" ).addClass( "ui-widget-overlay" ) );
    +
    +		// allow closing by pressing the escape key
    +		$( document ).bind( "keydown.dialog-overlay", function( event ) {
    +			var instances = $.ui.dialog.overlay.instances;
    +			// only react to the event if we're the top overlay
    +			if ( instances.length !== 0 && instances[ instances.length - 1 ] === $el &&
    +				dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
    +				event.keyCode === $.ui.keyCode.ESCAPE ) {
    +
    +				dialog.close( event );
    +				event.preventDefault();
    +			}
    +		});
    +
    +		$el.appendTo( document.body ).css({
    +			width: this.width(),
    +			height: this.height()
    +		});
    +
    +		if ( $.fn.bgiframe ) {
    +			$el.bgiframe();
    +		}
    +
    +		this.instances.push( $el );
    +		return $el;
    +	},
    +
    +	destroy: function( $el ) {
    +		var indexOf = $.inArray( $el, this.instances ),
    +			maxZ = 0;
    +
    +		if ( indexOf !== -1 ) {
    +			this.oldInstances.push( this.instances.splice( indexOf, 1 )[ 0 ] );
    +		}
    +
    +		if ( this.instances.length === 0 ) {
    +			$( [ document, window ] ).unbind( ".dialog-overlay" );
    +		}
    +
    +		$el.height( 0 ).width( 0 ).remove();
    +
    +		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
    +		$.each( this.instances, function() {
    +			maxZ = Math.max( maxZ, this.css( "z-index" ) );
    +		});
    +		this.maxZ = maxZ;
    +	},
    +
    +	height: function() {
    +		var scrollHeight,
    +			offsetHeight;
    +		// handle IE
    +		if ( $.ui.ie ) {
    +			scrollHeight = Math.max(
    +				document.documentElement.scrollHeight,
    +				document.body.scrollHeight
    +			);
    +			offsetHeight = Math.max(
    +				document.documentElement.offsetHeight,
    +				document.body.offsetHeight
    +			);
    +
    +			if ( scrollHeight < offsetHeight ) {
    +				return $( window ).height() + "px";
    +			} else {
    +				return scrollHeight + "px";
    +			}
    +		// handle "good" browsers
    +		} else {
    +			return $( document ).height() + "px";
    +		}
    +	},
    +
    +	width: function() {
    +		var scrollWidth,
    +			offsetWidth;
    +		// handle IE
    +		if ( $.ui.ie ) {
    +			scrollWidth = Math.max(
    +				document.documentElement.scrollWidth,
    +				document.body.scrollWidth
    +			);
    +			offsetWidth = Math.max(
    +				document.documentElement.offsetWidth,
    +				document.body.offsetWidth
    +			);
    +
    +			if ( scrollWidth < offsetWidth ) {
    +				return $( window ).width() + "px";
    +			} else {
    +				return scrollWidth + "px";
    +			}
    +		// handle "good" browsers
    +		} else {
    +			return $( document ).width() + "px";
    +		}
    +	},
    +
    +	resize: function() {
    +		/* If the dialog is draggable and the user drags it past the
    +		 * right edge of the window, the document becomes wider so we
    +		 * need to stretch the overlay. If the user then drags the
    +		 * dialog back to the left, the document will become narrower,
    +		 * so we need to shrink the overlay to the appropriate size.
    +		 * This is handled by shrinking the overlay before setting it
    +		 * to the full document size.
    +		 */
    +		var $overlays = $( [] );
    +		$.each( $.ui.dialog.overlay.instances, function() {
    +			$overlays = $overlays.add( this );
    +		});
    +
    +		$overlays.css({
    +			width: 0,
    +			height: 0
    +		}).css({
    +			width: $.ui.dialog.overlay.width(),
    +			height: $.ui.dialog.overlay.height()
    +		});
    +	}
    +});
    +
    +$.extend( $.ui.dialog.overlay.prototype, {
    +	destroy: function() {
    +		$.ui.dialog.overlay.destroy( this.$el );
    +	}
    +});
    +
    +}( jQuery ) );
    +
    +(function( $, undefined ) {
    +
    +var rvertical = /up|down|vertical/,
    +	rpositivemotion = /up|left|vertical|horizontal/;
    +
    +$.effects.effect.blind = function( o, done ) {
    +	// Create element
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
    +		mode = $.effects.setMode( el, o.mode || "hide" ),
    +		direction = o.direction || "up",
    +		vertical = rvertical.test( direction ),
    +		ref = vertical ? "height" : "width",
    +		ref2 = vertical ? "top" : "left",
    +		motion = rpositivemotion.test( direction ),
    +		animation = {},
    +		show = mode === "show",
    +		wrapper, distance, margin;
    +
    +	// if already wrapped, the wrapper's properties are my property. #6245
    +	if ( el.parent().is( ".ui-effects-wrapper" ) ) {
    +		$.effects.save( el.parent(), props );
    +	} else {
    +		$.effects.save( el, props );
    +	}
    +	el.show();
    +	wrapper = $.effects.createWrapper( el ).css({
    +		overflow: "hidden"
    +	});
    +
    +	distance = wrapper[ ref ]();
    +	margin = parseFloat( wrapper.css( ref2 ) ) || 0;
    +
    +	animation[ ref ] = show ? distance : 0;
    +	if ( !motion ) {
    +		el
    +			.css( vertical ? "bottom" : "right", 0 )
    +			.css( vertical ? "top" : "left", "auto" )
    +			.css({ position: "absolute" });
    +
    +		animation[ ref2 ] = show ? margin : distance + margin;
    +	}
    +
    +	// start at 0 if we are showing
    +	if ( show ) {
    +		wrapper.css( ref, 0 );
    +		if ( ! motion ) {
    +			wrapper.css( ref2, margin + distance );
    +		}
    +	}
    +
    +	// Animate
    +	wrapper.animate( animation, {
    +		duration: o.duration,
    +		easing: o.easing,
    +		queue: false,
    +		complete: function() {
    +			if ( mode === "hide" ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			$.effects.removeWrapper( el );
    +			done();
    +		}
    +	});
    +
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.effects.effect.bounce = function( o, done ) {
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
    +
    +		// defaults:
    +		mode = $.effects.setMode( el, o.mode || "effect" ),
    +		hide = mode === "hide",
    +		show = mode === "show",
    +		direction = o.direction || "up",
    +		distance = o.distance,
    +		times = o.times || 5,
    +
    +		// number of internal animations
    +		anims = times * 2 + ( show || hide ? 1 : 0 ),
    +		speed = o.duration / anims,
    +		easing = o.easing,
    +
    +		// utility:
    +		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
    +		motion = ( direction === "up" || direction === "left" ),
    +		i,
    +		upAnim,
    +		downAnim,
    +
    +		// we will need to re-assemble the queue to stack our animations in place
    +		queue = el.queue(),
    +		queuelen = queue.length;
    +
    +	// Avoid touching opacity to prevent clearType and PNG issues in IE
    +	if ( show || hide ) {
    +		props.push( "opacity" );
    +	}
    +
    +	$.effects.save( el, props );
    +	el.show();
    +	$.effects.createWrapper( el ); // Create Wrapper
    +
    +	// default distance for the BIGGEST bounce is the outer Distance / 3
    +	if ( !distance ) {
    +		distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
    +	}
    +
    +	if ( show ) {
    +		downAnim = { opacity: 1 };
    +		downAnim[ ref ] = 0;
    +
    +		// if we are showing, force opacity 0 and set the initial position
    +		// then do the "first" animation
    +		el.css( "opacity", 0 )
    +			.css( ref, motion ? -distance * 2 : distance * 2 )
    +			.animate( downAnim, speed, easing );
    +	}
    +
    +	// start at the smallest distance if we are hiding
    +	if ( hide ) {
    +		distance = distance / Math.pow( 2, times - 1 );
    +	}
    +
    +	downAnim = {};
    +	downAnim[ ref ] = 0;
    +	// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
    +	for ( i = 0; i < times; i++ ) {
    +		upAnim = {};
    +		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
    +
    +		el.animate( upAnim, speed, easing )
    +			.animate( downAnim, speed, easing );
    +
    +		distance = hide ? distance * 2 : distance / 2;
    +	}
    +
    +	// Last Bounce when Hiding
    +	if ( hide ) {
    +		upAnim = { opacity: 0 };
    +		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
    +
    +		el.animate( upAnim, speed, easing );
    +	}
    +
    +	el.queue(function() {
    +		if ( hide ) {
    +			el.hide();
    +		}
    +		$.effects.restore( el, props );
    +		$.effects.removeWrapper( el );
    +		done();
    +	});
    +
    +	// inject all the animations we just queued to be first in line (after "inprogress")
    +	if ( queuelen > 1) {
    +		queue.splice.apply( queue,
    +			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
    +	}
    +	el.dequeue();
    +
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.effects.effect.clip = function( o, done ) {
    +	// Create element
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
    +		mode = $.effects.setMode( el, o.mode || "hide" ),
    +		show = mode === "show",
    +		direction = o.direction || "vertical",
    +		vert = direction === "vertical",
    +		size = vert ? "height" : "width",
    +		position = vert ? "top" : "left",
    +		animation = {},
    +		wrapper, animate, distance;
    +
    +	// Save & Show
    +	$.effects.save( el, props );
    +	el.show();
    +
    +	// Create Wrapper
    +	wrapper = $.effects.createWrapper( el ).css({
    +		overflow: "hidden"
    +	});
    +	animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
    +	distance = animate[ size ]();
    +
    +	// Shift
    +	if ( show ) {
    +		animate.css( size, 0 );
    +		animate.css( position, distance / 2 );
    +	}
    +
    +	// Create Animation Object:
    +	animation[ size ] = show ? distance : 0;
    +	animation[ position ] = show ? 0 : distance / 2;
    +
    +	// Animate
    +	animate.animate( animation, {
    +		queue: false,
    +		duration: o.duration,
    +		easing: o.easing,
    +		complete: function() {
    +			if ( !show ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			$.effects.removeWrapper( el );
    +			done();
    +		}
    +	});
    +
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.effects.effect.drop = function( o, done ) {
    +
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
    +		mode = $.effects.setMode( el, o.mode || "hide" ),
    +		show = mode === "show",
    +		direction = o.direction || "left",
    +		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
    +		motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
    +		animation = {
    +			opacity: show ? 1 : 0
    +		},
    +		distance;
    +
    +	// Adjust
    +	$.effects.save( el, props );
    +	el.show();
    +	$.effects.createWrapper( el );
    +
    +	distance = o.distance || el[ ref === "top" ? "outerHeight": "outerWidth" ]( true ) / 2;
    +
    +	if ( show ) {
    +		el
    +			.css( "opacity", 0 )
    +			.css( ref, motion === "pos" ? -distance : distance );
    +	}
    +
    +	// Animation
    +	animation[ ref ] = ( show ?
    +		( motion === "pos" ? "+=" : "-=" ) :
    +		( motion === "pos" ? "-=" : "+=" ) ) +
    +		distance;
    +
    +	// Animate
    +	el.animate( animation, {
    +		queue: false,
    +		duration: o.duration,
    +		easing: o.easing,
    +		complete: function() {
    +			if ( mode === "hide" ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			$.effects.removeWrapper( el );
    +			done();
    +		}
    +	});
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.effects.effect.explode = function( o, done ) {
    +
    +	var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
    +		cells = rows,
    +		el = $( this ),
    +		mode = $.effects.setMode( el, o.mode || "hide" ),
    +		show = mode === "show",
    +
    +		// show and then visibility:hidden the element before calculating offset
    +		offset = el.show().css( "visibility", "hidden" ).offset(),
    +
    +		// width and height of a piece
    +		width = Math.ceil( el.outerWidth() / cells ),
    +		height = Math.ceil( el.outerHeight() / rows ),
    +		pieces = [],
    +
    +		// loop
    +		i, j, left, top, mx, my;
    +
    +	// children animate complete:
    +	function childComplete() {
    +		pieces.push( this );
    +		if ( pieces.length === rows * cells ) {
    +			animComplete();
    +		}
    +	}
    +
    +	// clone the element for each row and cell.
    +	for( i = 0; i < rows ; i++ ) { // ===>
    +		top = offset.top + i * height;
    +		my = i - ( rows - 1 ) / 2 ;
    +
    +		for( j = 0; j < cells ; j++ ) { // |||
    +			left = offset.left + j * width;
    +			mx = j - ( cells - 1 ) / 2 ;
    +
    +			// Create a clone of the now hidden main element that will be absolute positioned
    +			// within a wrapper div off the -left and -top equal to size of our pieces
    +			el
    +				.clone()
    +				.appendTo( "body" )
    +				.wrap( "<div></div>" )
    +				.css({
    +					position: "absolute",
    +					visibility: "visible",
    +					left: -j * width,
    +					top: -i * height
    +				})
    +
    +			// select the wrapper - make it overflow: hidden and absolute positioned based on
    +			// where the original was located +left and +top equal to the size of pieces
    +				.parent()
    +				.addClass( "ui-effects-explode" )
    +				.css({
    +					position: "absolute",
    +					overflow: "hidden",
    +					width: width,
    +					height: height,
    +					left: left + ( show ? mx * width : 0 ),
    +					top: top + ( show ? my * height : 0 ),
    +					opacity: show ? 0 : 1
    +				}).animate({
    +					left: left + ( show ? 0 : mx * width ),
    +					top: top + ( show ? 0 : my * height ),
    +					opacity: show ? 1 : 0
    +				}, o.duration || 500, o.easing, childComplete );
    +		}
    +	}
    +
    +	function animComplete() {
    +		el.css({
    +			visibility: "visible"
    +		});
    +		$( pieces ).remove();
    +		if ( !show ) {
    +			el.hide();
    +		}
    +		done();
    +	}
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.effects.effect.fade = function( o, done ) {
    +	var el = $( this ),
    +		mode = $.effects.setMode( el, o.mode || "toggle" );
    +
    +	el.animate({
    +		opacity: mode
    +	}, {
    +		queue: false,
    +		duration: o.duration,
    +		easing: o.easing,
    +		complete: done
    +	});
    +};
    +
    +})( jQuery );
    +
    +(function( $, undefined ) {
    +
    +$.effects.effect.fold = function( o, done ) {
    +
    +	// Create element
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
    +		mode = $.effects.setMode( el, o.mode || "hide" ),
    +		show = mode === "show",
    +		hide = mode === "hide",
    +		size = o.size || 15,
    +		percent = /([0-9]+)%/.exec( size ),
    +		horizFirst = !!o.horizFirst,
    +		widthFirst = show !== horizFirst,
    +		ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
    +		duration = o.duration / 2,
    +		wrapper, distance,
    +		animation1 = {},
    +		animation2 = {};
    +
    +	$.effects.save( el, props );
    +	el.show();
    +
    +	// Create Wrapper
    +	wrapper = $.effects.createWrapper( el ).css({
    +		overflow: "hidden"
    +	});
    +	distance = widthFirst ?
    +		[ wrapper.width(), wrapper.height() ] :
    +		[ wrapper.height(), wrapper.width() ];
    +
    +	if ( percent ) {
    +		size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
    +	}
    +	if ( show ) {
    +		wrapper.css( horizFirst ? {
    +			height: 0,
    +			width: size
    +		} : {
    +			height: size,
    +			width: 0
    +		});
    +	}
    +
    +	// Animation
    +	animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
    +	animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
    +
    +	// Animate
    +	wrapper
    +		.animate( animation1, duration, o.easing )
    +		.animate( animation2, duration, o.easing, function() {
    +			if ( hide ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			$.effects.removeWrapper( el );
    +			done();
    +		});
    +
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.effects.effect.highlight = function( o, done ) {
    +	var elem = $( this ),
    +		props = [ "backgroundImage", "backgroundColor", "opacity" ],
    +		mode = $.effects.setMode( elem, o.mode || "show" ),
    +		animation = {
    +			backgroundColor: elem.css( "backgroundColor" )
    +		};
    +
    +	if (mode === "hide") {
    +		animation.opacity = 0;
    +	}
    +
    +	$.effects.save( elem, props );
    +
    +	elem
    +		.show()
    +		.css({
    +			backgroundImage: "none",
    +			backgroundColor: o.color || "#ffff99"
    +		})
    +		.animate( animation, {
    +			queue: false,
    +			duration: o.duration,
    +			easing: o.easing,
    +			complete: function() {
    +				if ( mode === "hide" ) {
    +					elem.hide();
    +				}
    +				$.effects.restore( elem, props );
    +				done();
    +			}
    +		});
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.effects.effect.pulsate = function( o, done ) {
    +	var elem = $( this ),
    +		mode = $.effects.setMode( elem, o.mode || "show" ),
    +		show = mode === "show",
    +		hide = mode === "hide",
    +		showhide = ( show || mode === "hide" ),
    +
    +		// showing or hiding leaves of the "last" animation
    +		anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
    +		duration = o.duration / anims,
    +		animateTo = 0,
    +		queue = elem.queue(),
    +		queuelen = queue.length,
    +		i;
    +
    +	if ( show || !elem.is(":visible")) {
    +		elem.css( "opacity", 0 ).show();
    +		animateTo = 1;
    +	}
    +
    +	// anims - 1 opacity "toggles"
    +	for ( i = 1; i < anims; i++ ) {
    +		elem.animate({
    +			opacity: animateTo
    +		}, duration, o.easing );
    +		animateTo = 1 - animateTo;
    +	}
    +
    +	elem.animate({
    +		opacity: animateTo
    +	}, duration, o.easing);
    +
    +	elem.queue(function() {
    +		if ( hide ) {
    +			elem.hide();
    +		}
    +		done();
    +	});
    +
    +	// We just queued up "anims" animations, we need to put them next in the queue
    +	if ( queuelen > 1 ) {
    +		queue.splice.apply( queue,
    +			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
    +	}
    +	elem.dequeue();
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.effects.effect.puff = function( o, done ) {
    +	var elem = $( this ),
    +		mode = $.effects.setMode( elem, o.mode || "hide" ),
    +		hide = mode === "hide",
    +		percent = parseInt( o.percent, 10 ) || 150,
    +		factor = percent / 100,
    +		original = {
    +			height: elem.height(),
    +			width: elem.width(),
    +			outerHeight: elem.outerHeight(),
    +			outerWidth: elem.outerWidth()
    +		};
    +
    +	$.extend( o, {
    +		effect: "scale",
    +		queue: false,
    +		fade: true,
    +		mode: mode,
    +		complete: done,
    +		percent: hide ? percent : 100,
    +		from: hide ?
    +			original :
    +			{
    +				height: original.height * factor,
    +				width: original.width * factor,
    +				outerHeight: original.outerHeight * factor,
    +				outerWidth: original.outerWidth * factor
    +			}
    +	});
    +
    +	elem.effect( o );
    +};
    +
    +$.effects.effect.scale = function( o, done ) {
    +
    +	// Create element
    +	var el = $( this ),
    +		options = $.extend( true, {}, o ),
    +		mode = $.effects.setMode( el, o.mode || "effect" ),
    +		percent = parseInt( o.percent, 10 ) ||
    +			( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
    +		direction = o.direction || "both",
    +		origin = o.origin,
    +		original = {
    +			height: el.height(),
    +			width: el.width(),
    +			outerHeight: el.outerHeight(),
    +			outerWidth: el.outerWidth()
    +		},
    +		factor = {
    +			y: direction !== "horizontal" ? (percent / 100) : 1,
    +			x: direction !== "vertical" ? (percent / 100) : 1
    +		};
    +
    +	// We are going to pass this effect to the size effect:
    +	options.effect = "size";
    +	options.queue = false;
    +	options.complete = done;
    +
    +	// Set default origin and restore for show/hide
    +	if ( mode !== "effect" ) {
    +		options.origin = origin || ["middle","center"];
    +		options.restore = true;
    +	}
    +
    +	options.from = o.from || ( mode === "show" ? {
    +		height: 0,
    +		width: 0,
    +		outerHeight: 0,
    +		outerWidth: 0
    +	} : original );
    +	options.to = {
    +		height: original.height * factor.y,
    +		width: original.width * factor.x,
    +		outerHeight: original.outerHeight * factor.y,
    +		outerWidth: original.outerWidth * factor.x
    +	};
    +
    +	// Fade option to support puff
    +	if ( options.fade ) {
    +		if ( mode === "show" ) {
    +			options.from.opacity = 0;
    +			options.to.opacity = 1;
    +		}
    +		if ( mode === "hide" ) {
    +			options.from.opacity = 1;
    +			options.to.opacity = 0;
    +		}
    +	}
    +
    +	// Animate
    +	el.effect( options );
    +
    +};
    +
    +$.effects.effect.size = function( o, done ) {
    +
    +	// Create element
    +	var original, baseline, factor,
    +		el = $( this ),
    +		props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
    +
    +		// Always restore
    +		props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
    +
    +		// Copy for children
    +		props2 = [ "width", "height", "overflow" ],
    +		cProps = [ "fontSize" ],
    +		vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
    +		hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
    +
    +		// Set options
    +		mode = $.effects.setMode( el, o.mode || "effect" ),
    +		restore = o.restore || mode !== "effect",
    +		scale = o.scale || "both",
    +		origin = o.origin || [ "middle", "center" ],
    +		position = el.css( "position" ),
    +		props = restore ? props0 : props1,
    +		zero = {
    +			height: 0,
    +			width: 0,
    +			outerHeight: 0,
    +			outerWidth: 0
    +		};
    +
    +	if ( mode === "show" ) {
    +		el.show();
    +	}
    +	original = {
    +		height: el.height(),
    +		width: el.width(),
    +		outerHeight: el.outerHeight(),
    +		outerWidth: el.outerWidth()
    +	};
    +
    +	if ( o.mode === "toggle" && mode === "show" ) {
    +		el.from = o.to || zero;
    +		el.to = o.from || original;
    +	} else {
    +		el.from = o.from || ( mode === "show" ? zero : original );
    +		el.to = o.to || ( mode === "hide" ? zero : original );
    +	}
    +
    +	// Set scaling factor
    +	factor = {
    +		from: {
    +			y: el.from.height / original.height,
    +			x: el.from.width / original.width
    +		},
    +		to: {
    +			y: el.to.height / original.height,
    +			x: el.to.width / original.width
    +		}
    +	};
    +
    +	// Scale the css box
    +	if ( scale === "box" || scale === "both" ) {
    +
    +		// Vertical props scaling
    +		if ( factor.from.y !== factor.to.y ) {
    +			props = props.concat( vProps );
    +			el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
    +			el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
    +		}
    +
    +		// Horizontal props scaling
    +		if ( factor.from.x !== factor.to.x ) {
    +			props = props.concat( hProps );
    +			el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
    +			el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
    +		}
    +	}
    +
    +	// Scale the content
    +	if ( scale === "content" || scale === "both" ) {
    +
    +		// Vertical props scaling
    +		if ( factor.from.y !== factor.to.y ) {
    +			props = props.concat( cProps ).concat( props2 );
    +			el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
    +			el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
    +		}
    +	}
    +
    +	$.effects.save( el, props );
    +	el.show();
    +	$.effects.createWrapper( el );
    +	el.css( "overflow", "hidden" ).css( el.from );
    +
    +	// Adjust
    +	if (origin) { // Calculate baseline shifts
    +		baseline = $.effects.getBaseline( origin, original );
    +		el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
    +		el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
    +		el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
    +		el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
    +	}
    +	el.css( el.from ); // set top & left
    +
    +	// Animate
    +	if ( scale === "content" || scale === "both" ) { // Scale the children
    +
    +		// Add margins/font-size
    +		vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
    +		hProps = hProps.concat([ "marginLeft", "marginRight" ]);
    +		props2 = props0.concat(vProps).concat(hProps);
    +
    +		el.find( "*[width]" ).each( function(){
    +			var child = $( this ),
    +				c_original = {
    +					height: child.height(),
    +					width: child.width(),
    +					outerHeight: child.outerHeight(),
    +					outerWidth: child.outerWidth()
    +				};
    +			if (restore) {
    +				$.effects.save(child, props2);
    +			}
    +
    +			child.from = {
    +				height: c_original.height * factor.from.y,
    +				width: c_original.width * factor.from.x,
    +				outerHeight: c_original.outerHeight * factor.from.y,
    +				outerWidth: c_original.outerWidth * factor.from.x
    +			};
    +			child.to = {
    +				height: c_original.height * factor.to.y,
    +				width: c_original.width * factor.to.x,
    +				outerHeight: c_original.height * factor.to.y,
    +				outerWidth: c_original.width * factor.to.x
    +			};
    +
    +			// Vertical props scaling
    +			if ( factor.from.y !== factor.to.y ) {
    +				child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
    +				child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
    +			}
    +
    +			// Horizontal props scaling
    +			if ( factor.from.x !== factor.to.x ) {
    +				child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
    +				child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
    +			}
    +
    +			// Animate children
    +			child.css( child.from );
    +			child.animate( child.to, o.duration, o.easing, function() {
    +
    +				// Restore children
    +				if ( restore ) {
    +					$.effects.restore( child, props2 );
    +				}
    +			});
    +		});
    +	}
    +
    +	// Animate
    +	el.animate( el.to, {
    +		queue: false,
    +		duration: o.duration,
    +		easing: o.easing,
    +		complete: function() {
    +			if ( el.to.opacity === 0 ) {
    +				el.css( "opacity", el.from.opacity );
    +			}
    +			if( mode === "hide" ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			if ( !restore ) {
    +
    +				// we need to calculate our new positioning based on the scaling
    +				if ( position === "static" ) {
    +					el.css({
    +						position: "relative",
    +						top: el.to.top,
    +						left: el.to.left
    +					});
    +				} else {
    +					$.each([ "top", "left" ], function( idx, pos ) {
    +						el.css( pos, function( _, str ) {
    +							var val = parseInt( str, 10 ),
    +								toRef = idx ? el.to.left : el.to.top;
    +
    +							// if original was "auto", recalculate the new value from wrapper
    +							if ( str === "auto" ) {
    +								return toRef + "px";
    +							}
    +
    +							return val + toRef + "px";
    +						});
    +					});
    +				}
    +			}
    +
    +			$.effects.removeWrapper( el );
    +			done();
    +		}
    +	});
    +
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.effects.effect.shake = function( o, done ) {
    +
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
    +		mode = $.effects.setMode( el, o.mode || "effect" ),
    +		direction = o.direction || "left",
    +		distance = o.distance || 20,
    +		times = o.times || 3,
    +		anims = times * 2 + 1,
    +		speed = Math.round(o.duration/anims),
    +		ref = (direction === "up" || direction === "down") ? "top" : "left",
    +		positiveMotion = (direction === "up" || direction === "left"),
    +		animation = {},
    +		animation1 = {},
    +		animation2 = {},
    +		i,
    +
    +		// we will need to re-assemble the queue to stack our animations in place
    +		queue = el.queue(),
    +		queuelen = queue.length;
    +
    +	$.effects.save( el, props );
    +	el.show();
    +	$.effects.createWrapper( el );
    +
    +	// Animation
    +	animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
    +	animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
    +	animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
    +
    +	// Animate
    +	el.animate( animation, speed, o.easing );
    +
    +	// Shakes
    +	for ( i = 1; i < times; i++ ) {
    +		el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
    +	}
    +	el
    +		.animate( animation1, speed, o.easing )
    +		.animate( animation, speed / 2, o.easing )
    +		.queue(function() {
    +			if ( mode === "hide" ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			$.effects.removeWrapper( el );
    +			done();
    +		});
    +
    +	// inject all the animations we just queued to be first in line (after "inprogress")
    +	if ( queuelen > 1) {
    +		queue.splice.apply( queue,
    +			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
    +	}
    +	el.dequeue();
    +
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.effects.effect.slide = function( o, done ) {
    +
    +	// Create element
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
    +		mode = $.effects.setMode( el, o.mode || "show" ),
    +		show = mode === "show",
    +		direction = o.direction || "left",
    +		ref = (direction === "up" || direction === "down") ? "top" : "left",
    +		positiveMotion = (direction === "up" || direction === "left"),
    +		distance,
    +		animation = {};
    +
    +	// Adjust
    +	$.effects.save( el, props );
    +	el.show();
    +	distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
    +
    +	$.effects.createWrapper( el ).css({
    +		overflow: "hidden"
    +	});
    +
    +	if ( show ) {
    +		el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
    +	}
    +
    +	// Animation
    +	animation[ ref ] = ( show ?
    +		( positiveMotion ? "+=" : "-=") :
    +		( positiveMotion ? "-=" : "+=")) +
    +		distance;
    +
    +	// Animate
    +	el.animate( animation, {
    +		queue: false,
    +		duration: o.duration,
    +		easing: o.easing,
    +		complete: function() {
    +			if ( mode === "hide" ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			$.effects.removeWrapper( el );
    +			done();
    +		}
    +	});
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +$.effects.effect.transfer = function( o, done ) {
    +	var elem = $( this ),
    +		target = $( o.to ),
    +		targetFixed = target.css( "position" ) === "fixed",
    +		body = $("body"),
    +		fixTop = targetFixed ? body.scrollTop() : 0,
    +		fixLeft = targetFixed ? body.scrollLeft() : 0,
    +		endPosition = target.offset(),
    +		animation = {
    +			top: endPosition.top - fixTop ,
    +			left: endPosition.left - fixLeft ,
    +			height: target.innerHeight(),
    +			width: target.innerWidth()
    +		},
    +		startPosition = elem.offset(),
    +		transfer = $( '<div class="ui-effects-transfer"></div>' )
    +			.appendTo( document.body )
    +			.addClass( o.className )
    +			.css({
    +				top: startPosition.top - fixTop ,
    +				left: startPosition.left - fixLeft ,
    +				height: elem.innerHeight(),
    +				width: elem.innerWidth(),
    +				position: targetFixed ? "fixed" : "absolute"
    +			})
    +			.animate( animation, o.duration, o.easing, function() {
    +				transfer.remove();
    +				done();
    +			});
    +};
    +
    +})(jQuery);
    +
    +(function( $, undefined ) {
    +
    +var mouseHandled = false;
    +
    +$.widget( "ui.menu", {
    +	version: "1.9.2",
    +	defaultElement: "<ul>",
    +	delay: 300,
    +	options: {
    +		icons: {
    +			submenu: "ui-icon-carat-1-e"
    +		},
    +		menus: "ul",
    +		position: {
    +			my: "left top",
    +			at: "right top"
    +		},
    +		role: "menu",
    +
    +		// callbacks
    +		blur: null,
    +		focus: null,
    +		select: null
    +	},
    +
    +	_create: function() {
    +		this.activeMenu = this.element;
    +		this.element
    +			.uniqueId()
    +			.addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
    +			.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
    +			.attr({
    +				role: this.options.role,
    +				tabIndex: 0
    +			})
    +			// need to catch all clicks on disabled menu
    +			// not possible through _on
    +			.bind( "click" + this.eventNamespace, $.proxy(function( event ) {
    +				if ( this.options.disabled ) {
    +					event.preventDefault();
    +				}
    +			}, this ));
    +
    +		if ( this.options.disabled ) {
    +			this.element
    +				.addClass( "ui-state-disabled" )
    +				.attr( "aria-disabled", "true" );
    +		}
    +
    +		this._on({
    +			// Prevent focus from sticking to links inside menu after clicking
    +			// them (focus should always stay on UL during navigation).
    +			"mousedown .ui-menu-item > a": function( event ) {
    +				event.preventDefault();
    +			},
    +			"click .ui-state-disabled > a": function( event ) {
    +				event.preventDefault();
    +			},
    +			"click .ui-menu-item:has(a)": function( event ) {
    +				var target = $( event.target ).closest( ".ui-menu-item" );
    +				if ( !mouseHandled && target.not( ".ui-state-disabled" ).length ) {
    +					mouseHandled = true;
    +
    +					this.select( event );
    +					// Open submenu on click
    +					if ( target.has( ".ui-menu" ).length ) {
    +						this.expand( event );
    +					} else if ( !this.element.is( ":focus" ) ) {
    +						// Redirect focus to the menu
    +						this.element.trigger( "focus", [ true ] );
    +
    +						// If the active item is on the top level, let it stay active.
    +						// Otherwise, blur the active item since it is no longer visible.
    +						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
    +							clearTimeout( this.timer );
    +						}
    +					}
    +				}
    +			},
    +			"mouseenter .ui-menu-item": function( event ) {
    +				var target = $( event.currentTarget );
    +				// Remove ui-state-active class from siblings of the newly focused menu item
    +				// to avoid a jump caused by adjacent elements both having a class with a border
    +				target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" );
    +				this.focus( event, target );
    +			},
    +			mouseleave: "collapseAll",
    +			"mouseleave .ui-menu": "collapseAll",
    +			focus: function( event, keepActiveItem ) {
    +				// If there's already an active item, keep it active
    +				// If not, activate the first item
    +				var item = this.active || this.element.children( ".ui-menu-item" ).eq( 0 );
    +
    +				if ( !keepActiveItem ) {
    +					this.focus( event, item );
    +				}
    +			},
    +			blur: function( event ) {
    +				this._delay(function() {
    +					if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
    +						this.collapseAll( event );
    +					}
    +				});
    +			},
    +			keydown: "_keydown"
    +		});
    +
    +		this.refresh();
    +
    +		// Clicks outside of a menu collapse any open menus
    +		this._on( this.document, {
    +			click: function( event ) {
    +				if ( !$( event.target ).closest( ".ui-menu" ).length ) {
    +					this.collapseAll( event );
    +				}
    +
    +				// Reset the mouseHandled flag
    +				mouseHandled = false;
    +			}
    +		});
    +	},
    +
    +	_destroy: function() {
    +		// Destroy (sub)menus
    +		this.element
    +			.removeAttr( "aria-activedescendant" )
    +			.find( ".ui-menu" ).andSelf()
    +				.removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" )
    +				.removeAttr( "role" )
    +				.removeAttr( "tabIndex" )
    +				.removeAttr( "aria-labelledby" )
    +				.removeAttr( "aria-expanded" )
    +				.removeAttr( "aria-hidden" )
    +				.removeAttr( "aria-disabled" )
    +				.removeUniqueId()
    +				.show();
    +
    +		// Destroy menu items
    +		this.element.find( ".ui-menu-item" )
    +			.removeClass( "ui-menu-item" )
    +			.removeAttr( "role" )
    +			.removeAttr( "aria-disabled" )
    +			.children( "a" )
    +				.removeUniqueId()
    +				.removeClass( "ui-corner-all ui-state-hover" )
    +				.removeAttr( "tabIndex" )
    +				.removeAttr( "role" )
    +				.removeAttr( "aria-haspopup" )
    +				.children().each( function() {
    +					var elem = $( this );
    +					if ( elem.data( "ui-menu-submenu-carat" ) ) {
    +						elem.remove();
    +					}
    +				});
    +
    +		// Destroy menu dividers
    +		this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
    +	},
    +
    +	_keydown: function( event ) {
    +		var match, prev, character, skip, regex,
    +			preventDefault = true;
    +
    +		function escape( value ) {
    +			return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
    +		}
    +
    +		switch ( event.keyCode ) {
    +		case $.ui.keyCode.PAGE_UP:
    +			this.previousPage( event );
    +			break;
    +		case $.ui.keyCode.PAGE_DOWN:
    +			this.nextPage( event );
    +			break;
    +		case $.ui.keyCode.HOME:
    +			this._move( "first", "first", event );
    +			break;
    +		case $.ui.keyCode.END:
    +			this._move( "last", "last", event );
    +			break;
    +		case $.ui.keyCode.UP:
    +			this.previous( event );
    +			break;
    +		case $.ui.keyCode.DOWN:
    +			this.next( event );
    +			break;
    +		case $.ui.keyCode.LEFT:
    +			this.collapse( event );
    +			break;
    +		case $.ui.keyCode.RIGHT:
    +			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
    +				this.expand( event );
    +			}
    +			break;
    +		case $.ui.keyCode.ENTER:
    +		case $.ui.keyCode.SPACE:
    +			this._activate( event );
    +			break;
    +		case $.ui.keyCode.ESCAPE:
    +			this.collapse( event );
    +			break;
    +		default:
    +			preventDefault = false;
    +			prev = this.previousFilter || "";
    +			character = String.fromCharCode( event.keyCode );
    +			skip = false;
    +
    +			clearTimeout( this.filterTimer );
    +
    +			if ( character === prev ) {
    +				skip = true;
    +			} else {
    +				character = prev + character;
    +			}
    +
    +			regex = new RegExp( "^" + escape( character ), "i" );
    +			match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
    +				return regex.test( $( this ).children( "a" ).text() );
    +			});
    +			match = skip && match.index( this.active.next() ) !== -1 ?
    +				this.active.nextAll( ".ui-menu-item" ) :
    +				match;
    +
    +			// If no matches on the current filter, reset to the last character pressed
    +			// to move down the menu to the first item that starts with that character
    +			if ( !match.length ) {
    +				character = String.fromCharCode( event.keyCode );
    +				regex = new RegExp( "^" + escape( character ), "i" );
    +				match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
    +					return regex.test( $( this ).children( "a" ).text() );
    +				});
    +			}
    +
    +			if ( match.length ) {
    +				this.focus( event, match );
    +				if ( match.length > 1 ) {
    +					this.previousFilter = character;
    +					this.filterTimer = this._delay(function() {
    +						delete this.previousFilter;
    +					}, 1000 );
    +				} else {
    +					delete this.previousFilter;
    +				}
    +			} else {
    +				delete this.previousFilter;
    +			}
    +		}
    +
    +		if ( preventDefault ) {
    +			event.preventDefault();
    +		}
    +	},
    +
    +	_activate: function( event ) {
    +		if ( !this.active.is( ".ui-state-disabled" ) ) {
    +			if ( this.active.children( "a[aria-haspopup='true']" ).length ) {
    +				this.expand( event );
    +			} else {
    +				this.select( event );
    +			}
    +		}
    +	},
    +
    +	refresh: function() {
    +		var menus,
    +			icon = this.options.icons.submenu,
    +			submenus = this.element.find( this.options.menus );
    +
    +		// Initialize nested menus
    +		submenus.filter( ":not(.ui-menu)" )
    +			.addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
    +			.hide()
    +			.attr({
    +				role: this.options.role,
    +				"aria-hidden": "true",
    +				"aria-expanded": "false"
    +			})
    +			.each(function() {
    +				var menu = $( this ),
    +					item = menu.prev( "a" ),
    +					submenuCarat = $( "<span>" )
    +						.addClass( "ui-menu-icon ui-icon " + icon )
    +						.data( "ui-menu-submenu-carat", true );
    +
    +				item
    +					.attr( "aria-haspopup", "true" )
    +					.prepend( submenuCarat );
    +				menu.attr( "aria-labelledby", item.attr( "id" ) );
    +			});
    +
    +		menus = submenus.add( this.element );
    +
    +		// Don't refresh list items that are already adapted
    +		menus.children( ":not(.ui-menu-item):has(a)" )
    +			.addClass( "ui-menu-item" )
    +			.attr( "role", "presentation" )
    +			.children( "a" )
    +				.uniqueId()
    +				.addClass( "ui-corner-all" )
    +				.attr({
    +					tabIndex: -1,
    +					role: this._itemRole()
    +				});
    +
    +		// Initialize unlinked menu-items containing spaces and/or dashes only as dividers
    +		menus.children( ":not(.ui-menu-item)" ).each(function() {
    +			var item = $( this );
    +			// hyphen, em dash, en dash
    +			if ( !/[^\-鈥斺揬s]/.test( item.text() ) ) {
    +				item.addClass( "ui-widget-content ui-menu-divider" );
    +			}
    +		});
    +
    +		// Add aria-disabled attribute to any disabled menu item
    +		menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
    +
    +		// If the active item has been removed, blur the menu
    +		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
    +			this.blur();
    +		}
    +	},
    +
    +	_itemRole: function() {
    +		return {
    +			menu: "menuitem",
    +			listbox: "option"
    +		}[ this.options.role ];
    +	},
    +
    +	focus: function( event, item ) {
    +		var nested, focused;
    +		this.blur( event, event && event.type === "focus" );
    +
    +		this._scrollIntoView( item );
    +
    +		this.active = item.first();
    +		focused = this.active.children( "a" ).addClass( "ui-state-focus" );
    +		// Only update aria-activedescendant if there's a role
    +		// otherwise we assume focus is managed elsewhere
    +		if ( this.options.role ) {
    +			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
    +		}
    +
    +		// Highlight active parent menu item, if any
    +		this.active
    +			.parent()
    +			.closest( ".ui-menu-item" )
    +			.children( "a:first" )
    +			.addClass( "ui-state-active" );
    +
    +		if ( event && event.type === "keydown" ) {
    +			this._close();
    +		} else {
    +			this.timer = this._delay(function() {
    +				this._close();
    +			}, this.delay );
    +		}
    +
    +		nested = item.children( ".ui-menu" );
    +		if ( nested.length && ( /^mouse/.test( event.type ) ) ) {
    +			this._startOpening(nested);
    +		}
    +		this.activeMenu = item.parent();
    +
    +		this._trigger( "focus", event, { item: item } );
    +	},
    +
    +	_scrollIntoView: function( item ) {
    +		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
    +		if ( this._hasScroll() ) {
    +			borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
    +			paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
    +			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
    +			scroll = this.activeMenu.scrollTop();
    +			elementHeight = this.activeMenu.height();
    +			itemHeight = item.height();
    +
    +			if ( offset < 0 ) {
    +				this.activeMenu.scrollTop( scroll + offset );
    +			} else if ( offset + itemHeight > elementHeight ) {
    +				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
    +			}
    +		}
    +	},
    +
    +	blur: function( event, fromFocus ) {
    +		if ( !fromFocus ) {
    +			clearTimeout( this.timer );
    +		}
    +
    +		if ( !this.active ) {
    +			return;
    +		}
    +
    +		this.active.children( "a" ).removeClass( "ui-state-focus" );
    +		this.active = null;
    +
    +		this._trigger( "blur", event, { item: this.active } );
    +	},
    +
    +	_startOpening: function( submenu ) {
    +		clearTimeout( this.timer );
    +
    +		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
    +		// shift in the submenu position when mousing over the carat icon
    +		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
    +			return;
    +		}
    +
    +		this.timer = this._delay(function() {
    +			this._close();
    +			this._open( submenu );
    +		}, this.delay );
    +	},
    +
    +	_open: function( submenu ) {
    +		var position = $.extend({
    +			of: this.active
    +		}, this.options.position );
    +
    +		clearTimeout( this.timer );
    +		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
    +			.hide()
    +			.attr( "aria-hidden", "true" );
    +
    +		submenu
    +			.show()
    +			.removeAttr( "aria-hidden" )
    +			.attr( "aria-expanded", "true" )
    +			.position( position );
    +	},
    +
    +	collapseAll: function( event, all ) {
    +		clearTimeout( this.timer );
    +		this.timer = this._delay(function() {
    +			// If we were passed an event, look for the submenu that contains the event
    +			var currentMenu = all ? this.element :
    +				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
    +
    +			// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
    +			if ( !currentMenu.length ) {
    +				currentMenu = this.element;
    +			}
    +
    +			this._close( currentMenu );
    +
    +			this.blur( event );
    +			this.activeMenu = currentMenu;
    +		}, this.delay );
    +	},
    +
    +	// With no arguments, closes the currently active menu - if nothing is active
    +	// it closes all menus.  If passed an argument, it will search for menus BELOW
    +	_close: function( startMenu ) {
    +		if ( !startMenu ) {
    +			startMenu = this.active ? this.active.parent() : this.element;
    +		}
    +
    +		startMenu
    +			.find( ".ui-menu" )
    +				.hide()
    +				.attr( "aria-hidden", "true" )
    +				.attr( "aria-expanded", "false" )
    +			.end()
    +			.find( "a.ui-state-active" )
    +				.removeClass( "ui-state-active" );
    +	},
    +
    +	collapse: function( event ) {
    +		var newItem = this.active &&
    +			this.active.parent().closest( ".ui-menu-item", this.element );
    +		if ( newItem && newItem.length ) {
    +			this._close();
    +			this.focus( event, newItem );
    +		}
    +	},
    +
    +	expand: function( event ) {
    +		var newItem = this.active &&
    +			this.active
    +				.children( ".ui-menu " )
    +				.children( ".ui-menu-item" )
    +				.first();
    +
    +		if ( newItem && newItem.length ) {
    +			this._open( newItem.parent() );
    +
    +			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
    +			this._delay(function() {
    +				this.focus( event, newItem );
    +			});
    +		}
    +	},
    +
    +	next: function( event ) {
    +		this._move( "next", "first", event );
    +	},
    +
    +	previous: function( event ) {
    +		this._move( "prev", "last", event );
    +	},
    +
    +	isFirstItem: function() {
    +		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
    +	},
    +
    +	isLastItem: function() {
    +		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
    +	},
    +
    +	_move: function( direction, filter, event ) {
    +		var next;
    +		if ( this.active ) {
    +			if ( direction === "first" || direction === "last" ) {
    +				next = this.active
    +					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
    +					.eq( -1 );
    +			} else {
    +				next = this.active
    +					[ direction + "All" ]( ".ui-menu-item" )
    +					.eq( 0 );
    +			}
    +		}
    +		if ( !next || !next.length || !this.active ) {
    +			next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();
    +		}
    +
    +		this.focus( event, next );
    +	},
    +
    +	nextPage: function( event ) {
    +		var item, base, height;
    +
    +		if ( !this.active ) {
    +			this.next( event );
    +			return;
    +		}
    +		if ( this.isLastItem() ) {
    +			return;
    +		}
    +		if ( this._hasScroll() ) {
    +			base = this.active.offset().top;
    +			height = this.element.height();
    +			this.active.nextAll( ".ui-menu-item" ).each(function() {
    +				item = $( this );
    +				return item.offset().top - base - height < 0;
    +			});
    +
    +			this.focus( event, item );
    +		} else {
    +			this.focus( event, this.activeMenu.children( ".ui-menu-item" )
    +				[ !this.active ? "first" : "last" ]() );
    +		}
    +	},
    +
    +	previousPage: function( event ) {
    +		var item, base, height;
    +		if ( !this.active ) {
    +			this.next( event );
    +			return;
    +		}
    +		if ( this.isFirstItem() ) {
    +			return;
    +		}
    +		if ( this._hasScroll() ) {
    +			base = this.active.offset().top;
    +			height = this.element.height();
    +			this.active.prevAll( ".ui-menu-item" ).each(function() {
    +				item = $( this );
    +				return item.offset().top - base + height > 0;
    +			});
    +
    +			this.focus( event, item );
    +		} else {
    +			this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
    +		}
    +	},
    +
    +	_hasScroll: function() {
    +		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
    +	},
    +
    +	select: function( event ) {
    +		// TODO: It should never be possible to not have an active item at this
    +		// point, but the tests don't trigger mouseenter before click.
    +		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
    +		var ui = { item: this.active };
    +		if ( !this.active.has( ".ui-menu" ).length ) {
    +			this.collapseAll( event, true );
    +		}
    +		this._trigger( "select", event, ui );
    +	}
    +});
    +
    +}( jQuery ));
    +
    +(function( $, undefined ) {
    +
    +$.ui = $.ui || {};
    +
    +var cachedScrollbarWidth,
    +	max = Math.max,
    +	abs = Math.abs,
    +	round = Math.round,
    +	rhorizontal = /left|center|right/,
    +	rvertical = /top|center|bottom/,
    +	roffset = /[\+\-]\d+%?/,
    +	rposition = /^\w+/,
    +	rpercent = /%$/,
    +	_position = $.fn.position;
    +
    +function getOffsets( offsets, width, height ) {
    +	return [
    +		parseInt( offsets[ 0 ], 10 ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
    +		parseInt( offsets[ 1 ], 10 ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
    +	];
    +}
    +function parseCss( element, property ) {
    +	return parseInt( $.css( element, property ), 10 ) || 0;
    +}
    +
    +$.position = {
    +	scrollbarWidth: function() {
    +		if ( cachedScrollbarWidth !== undefined ) {
    +			return cachedScrollbarWidth;
    +		}
    +		var w1, w2,
    +			div = $( "<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
    +			innerDiv = div.children()[0];
    +
    +		$( "body" ).append( div );
    +		w1 = innerDiv.offsetWidth;
    +		div.css( "overflow", "scroll" );
    +
    +		w2 = innerDiv.offsetWidth;
    +
    +		if ( w1 === w2 ) {
    +			w2 = div[0].clientWidth;
    +		}
    +
    +		div.remove();
    +
    +		return (cachedScrollbarWidth = w1 - w2);
    +	},
    +	getScrollInfo: function( within ) {
    +		var overflowX = within.isWindow ? "" : within.element.css( "overflow-x" ),
    +			overflowY = within.isWindow ? "" : within.element.css( "overflow-y" ),
    +			hasOverflowX = overflowX === "scroll" ||
    +				( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
    +			hasOverflowY = overflowY === "scroll" ||
    +				( overflowY === "auto" && within.height < within.element[0].scrollHeight );
    +		return {
    +			width: hasOverflowX ? $.position.scrollbarWidth() : 0,
    +			height: hasOverflowY ? $.position.scrollbarWidth() : 0
    +		};
    +	},
    +	getWithinInfo: function( element ) {
    +		var withinElement = $( element || window ),
    +			isWindow = $.isWindow( withinElement[0] );
    +		return {
    +			element: withinElement,
    +			isWindow: isWindow,
    +			offset: withinElement.offset() || { left: 0, top: 0 },
    +			scrollLeft: withinElement.scrollLeft(),
    +			scrollTop: withinElement.scrollTop(),
    +			width: isWindow ? withinElement.width() : withinElement.outerWidth(),
    +			height: isWindow ? withinElement.height() : withinElement.outerHeight()
    +		};
    +	}
    +};
    +
    +$.fn.position = function( options ) {
    +	if ( !options || !options.of ) {
    +		return _position.apply( this, arguments );
    +	}
    +
    +	// make a copy, we don't want to modify arguments
    +	options = $.extend( {}, options );
    +
    +	var atOffset, targetWidth, targetHeight, targetOffset, basePosition,
    +		target = $( options.of ),
    +		within = $.position.getWithinInfo( options.within ),
    +		scrollInfo = $.position.getScrollInfo( within ),
    +		targetElem = target[0],
    +		collision = ( options.collision || "flip" ).split( " " ),
    +		offsets = {};
    +
    +	if ( targetElem.nodeType === 9 ) {
    +		targetWidth = target.width();
    +		targetHeight = target.height();
    +		targetOffset = { top: 0, left: 0 };
    +	} else if ( $.isWindow( targetElem ) ) {
    +		targetWidth = target.width();
    +		targetHeight = target.height();
    +		targetOffset = { top: target.scrollTop(), left: target.scrollLeft() };
    +	} else if ( targetElem.preventDefault ) {
    +		// force left top to allow flipping
    +		options.at = "left top";
    +		targetWidth = targetHeight = 0;
    +		targetOffset = { top: targetElem.pageY, left: targetElem.pageX };
    +	} else {
    +		targetWidth = target.outerWidth();
    +		targetHeight = target.outerHeight();
    +		targetOffset = target.offset();
    +	}
    +	// clone to reuse original targetOffset later
    +	basePosition = $.extend( {}, targetOffset );
    +
    +	// force my and at to have valid horizontal and vertical positions
    +	// if a value is missing or invalid, it will be converted to center
    +	$.each( [ "my", "at" ], function() {
    +		var pos = ( options[ this ] || "" ).split( " " ),
    +			horizontalOffset,
    +			verticalOffset;
    +
    +		if ( pos.length === 1) {
    +			pos = rhorizontal.test( pos[ 0 ] ) ?
    +				pos.concat( [ "center" ] ) :
    +				rvertical.test( pos[ 0 ] ) ?
    +					[ "center" ].concat( pos ) :
    +					[ "center", "center" ];
    +		}
    +		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
    +		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
    +
    +		// calculate offsets
    +		horizontalOffset = roffset.exec( pos[ 0 ] );
    +		verticalOffset = roffset.exec( pos[ 1 ] );
    +		offsets[ this ] = [
    +			horizontalOffset ? horizontalOffset[ 0 ] : 0,
    +			verticalOffset ? verticalOffset[ 0 ] : 0
    +		];
    +
    +		// reduce to just the positions without the offsets
    +		options[ this ] = [
    +			rposition.exec( pos[ 0 ] )[ 0 ],
    +			rposition.exec( pos[ 1 ] )[ 0 ]
    +		];
    +	});
    +
    +	// normalize collision option
    +	if ( collision.length === 1 ) {
    +		collision[ 1 ] = collision[ 0 ];
    +	}
    +
    +	if ( options.at[ 0 ] === "right" ) {
    +		basePosition.left += targetWidth;
    +	} else if ( options.at[ 0 ] === "center" ) {
    +		basePosition.left += targetWidth / 2;
    +	}
    +
    +	if ( options.at[ 1 ] === "bottom" ) {
    +		basePosition.top += targetHeight;
    +	} else if ( options.at[ 1 ] === "center" ) {
    +		basePosition.top += targetHeight / 2;
    +	}
    +
    +	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
    +	basePosition.left += atOffset[ 0 ];
    +	basePosition.top += atOffset[ 1 ];
    +
    +	return this.each(function() {
    +		var collisionPosition, using,
    +			elem = $( this ),
    +			elemWidth = elem.outerWidth(),
    +			elemHeight = elem.outerHeight(),
    +			marginLeft = parseCss( this, "marginLeft" ),
    +			marginTop = parseCss( this, "marginTop" ),
    +			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
    +			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
    +			position = $.extend( {}, basePosition ),
    +			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
    +
    +		if ( options.my[ 0 ] === "right" ) {
    +			position.left -= elemWidth;
    +		} else if ( options.my[ 0 ] === "center" ) {
    +			position.left -= elemWidth / 2;
    +		}
    +
    +		if ( options.my[ 1 ] === "bottom" ) {
    +			position.top -= elemHeight;
    +		} else if ( options.my[ 1 ] === "center" ) {
    +			position.top -= elemHeight / 2;
    +		}
    +
    +		position.left += myOffset[ 0 ];
    +		position.top += myOffset[ 1 ];
    +
    +		// if the browser doesn't support fractions, then round for consistent results
    +		if ( !$.support.offsetFractions ) {
    +			position.left = round( position.left );
    +			position.top = round( position.top );
    +		}
    +
    +		collisionPosition = {
    +			marginLeft: marginLeft,
    +			marginTop: marginTop
    +		};
    +
    +		$.each( [ "left", "top" ], function( i, dir ) {
    +			if ( $.ui.position[ collision[ i ] ] ) {
    +				$.ui.position[ collision[ i ] ][ dir ]( position, {
    +					targetWidth: targetWidth,
    +					targetHeight: targetHeight,
    +					elemWidth: elemWidth,
    +					elemHeight: elemHeight,
    +					collisionPosition: collisionPosition,
    +					collisionWidth: collisionWidth,
    +					collisionHeight: collisionHeight,
    +					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
    +					my: options.my,
    +					at: options.at,
    +					within: within,
    +					elem : elem
    +				});
    +			}
    +		});
    +
    +		if ( $.fn.bgiframe ) {
    +			elem.bgiframe();
    +		}
    +
    +		if ( options.using ) {
    +			// adds feedback as second argument to using callback, if present
    +			using = function( props ) {
    +				var left = targetOffset.left - position.left,
    +					right = left + targetWidth - elemWidth,
    +					top = targetOffset.top - position.top,
    +					bottom = top + targetHeight - elemHeight,
    +					feedback = {
    +						target: {
    +							element: target,
    +							left: targetOffset.left,
    +							top: targetOffset.top,
    +							width: targetWidth,
    +							height: targetHeight
    +						},
    +						element: {
    +							element: elem,
    +							left: position.left,
    +							top: position.top,
    +							width: elemWidth,
    +							height: elemHeight
    +						},
    +						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
    +						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
    +					};
    +				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
    +					feedback.horizontal = "center";
    +				}
    +				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
    +					feedback.vertical = "middle";
    +				}
    +				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
    +					feedback.important = "horizontal";
    +				} else {
    +					feedback.important = "vertical";
    +				}
    +				options.using.call( this, props, feedback );
    +			};
    +		}
    +
    +		elem.offset( $.extend( position, { using: using } ) );
    +	});
    +};
    +
    +$.ui.position = {
    +	fit: {
    +		left: function( position, data ) {
    +			var within = data.within,
    +				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
    +				outerWidth = within.width,
    +				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
    +				overLeft = withinOffset - collisionPosLeft,
    +				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
    +				newOverRight;
    +
    +			// element is wider than within
    +			if ( data.collisionWidth > outerWidth ) {
    +				// element is initially over the left side of within
    +				if ( overLeft > 0 && overRight <= 0 ) {
    +					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
    +					position.left += overLeft - newOverRight;
    +				// element is initially over right side of within
    +				} else if ( overRight > 0 && overLeft <= 0 ) {
    +					position.left = withinOffset;
    +				// element is initially over both left and right sides of within
    +				} else {
    +					if ( overLeft > overRight ) {
    +						position.left = withinOffset + outerWidth - data.collisionWidth;
    +					} else {
    +						position.left = withinOffset;
    +					}
    +				}
    +			// too far left -> align with left edge
    +			} else if ( overLeft > 0 ) {
    +				position.left += overLeft;
    +			// too far right -> align with right edge
    +			} else if ( overRight > 0 ) {
    +				position.left -= overRight;
    +			// adjust based on position and margin
    +			} else {
    +				position.left = max( position.left - collisionPosLeft, position.left );
    +			}
    +		},
    +		top: function( position, data ) {
    +			var within = data.within,
    +				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
    +				outerHeight = data.within.height,
    +				collisionPosTop = position.top - data.collisionPosition.marginTop,
    +				overTop = withinOffset - collisionPosTop,
    +				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
    +				newOverBottom;
    +
    +			// element is taller than within
    +			if ( data.collisionHeight > outerHeight ) {
    +				// element is initially over the top of within
    +				if ( overTop > 0 && overBottom <= 0 ) {
    +					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
    +					position.top += overTop - newOverBottom;
    +				// element is initially over bottom of within
    +				} else if ( overBottom > 0 && overTop <= 0 ) {
    +					position.top = withinOffset;
    +				// element is initially over both top and bottom of within
    +				} else {
    +					if ( overTop > overBottom ) {
    +						position.top = withinOffset + outerHeight - data.collisionHeight;
    +					} else {
    +						position.top = withinOffset;
    +					}
    +				}
    +			// too far up -> align with top
    +			} else if ( overTop > 0 ) {
    +				position.top += overTop;
    +			// too far down -> align with bottom edge
    +			} else if ( overBottom > 0 ) {
    +				position.top -= overBottom;
    +			// adjust based on position and margin
    +			} else {
    +				position.top = max( position.top - collisionPosTop, position.top );
    +			}
    +		}
    +	},
    +	flip: {
    +		left: function( position, data ) {
    +			var within = data.within,
    +				withinOffset = within.offset.left + within.scrollLeft,
    +				outerWidth = within.width,
    +				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
    +				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
    +				overLeft = collisionPosLeft - offsetLeft,
    +				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
    +				myOffset = data.my[ 0 ] === "left" ?
    +					-data.elemWidth :
    +					data.my[ 0 ] === "right" ?
    +						data.elemWidth :
    +						0,
    +				atOffset = data.at[ 0 ] === "left" ?
    +					data.targetWidth :
    +					data.at[ 0 ] === "right" ?
    +						-data.targetWidth :
    +						0,
    +				offset = -2 * data.offset[ 0 ],
    +				newOverRight,
    +				newOverLeft;
    +
    +			if ( overLeft < 0 ) {
    +				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
    +				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
    +					position.left += myOffset + atOffset + offset;
    +				}
    +			}
    +			else if ( overRight > 0 ) {
    +				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
    +				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
    +					position.left += myOffset + atOffset + offset;
    +				}
    +			}
    +		},
    +		top: function( position, data ) {
    +			var within = data.within,
    +				withinOffset = within.offset.top + within.scrollTop,
    +				outerHeight = within.height,
    +				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
    +				collisionPosTop = position.top - data.collisionPosition.marginTop,
    +				overTop = collisionPosTop - offsetTop,
    +				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
    +				top = data.my[ 1 ] === "top",
    +				myOffset = top ?
    +					-data.elemHeight :
    +					data.my[ 1 ] === "bottom" ?
    +						data.elemHeight :
    +						0,
    +				atOffset = data.at[ 1 ] === "top" ?
    +					data.targetHeight :
    +					data.at[ 1 ] === "bottom" ?
    +						-data.targetHeight :
    +						0,
    +				offset = -2 * data.offset[ 1 ],
    +				newOverTop,
    +				newOverBottom;
    +			if ( overTop < 0 ) {
    +				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
    +				if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
    +					position.top += myOffset + atOffset + offset;
    +				}
    +			}
    +			else if ( overBottom > 0 ) {
    +				newOverTop = position.top -  data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
    +				if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
    +					position.top += myOffset + atOffset + offset;
    +				}
    +			}
    +		}
    +	},
    +	flipfit: {
    +		left: function() {
    +			$.ui.position.flip.left.apply( this, arguments );
    +			$.ui.position.fit.left.apply( this, arguments );
    +		},
    +		top: function() {
    +			$.ui.position.flip.top.apply( this, arguments );
    +			$.ui.position.fit.top.apply( this, arguments );
    +		}
    +	}
    +};
    +
    +// fraction support test
    +(function () {
    +	var testElement, testElementParent, testElementStyle, offsetLeft, i,
    +		body = document.getElementsByTagName( "body" )[ 0 ],
    +		div = document.createElement( "div" );
    +
    +	//Create a "fake body" for testing based on method used in jQuery.support
    +	testElement = document.createElement( body ? "div" : "body" );
    +	testElementStyle = {
    +		visibility: "hidden",
    +		width: 0,
    +		height: 0,
    +		border: 0,
    +		margin: 0,
    +		background: "none"
    +	};
    +	if ( body ) {
    +		$.extend( testElementStyle, {
    +			position: "absolute",
    +			left: "-1000px",
    +			top: "-1000px"
    +		});
    +	}
    +	for ( i in testElementStyle ) {
    +		testElement.style[ i ] = testElementStyle[ i ];
    +	}
    +	testElement.appendChild( div );
    +	testElementParent = body || document.documentElement;
    +	testElementParent.insertBefore( testElement, testElementParent.firstChild );
    +
    +	div.style.cssText = "position: absolute; left: 10.7432222px;";
    +
    +	offsetLeft = $( div ).offset().left;
    +	$.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
    +
    +	testElement.innerHTML = "";
    +	testElementParent.removeChild( testElement );
    +})();
    +
    +// DEPRECATED
    +if ( $.uiBackCompat !== false ) {
    +	// offset option
    +	(function( $ ) {
    +		var _position = $.fn.position;
    +		$.fn.position = function( options ) {
    +			if ( !options || !options.offset ) {
    +				return _position.call( this, options );
    +			}
    +			var offset = options.offset.split( " " ),
    +				at = options.at.split( " " );
    +			if ( offset.length === 1 ) {
    +				offset[ 1 ] = offset[ 0 ];
    +			}
    +			if ( /^\d/.test( offset[ 0 ] ) ) {
    +				offset[ 0 ] = "+" + offset[ 0 ];
    +			}
    +			if ( /^\d/.test( offset[ 1 ] ) ) {
    +				offset[ 1 ] = "+" + offset[ 1 ];
    +			}
    +			if ( at.length === 1 ) {
    +				if ( /left|center|right/.test( at[ 0 ] ) ) {
    +					at[ 1 ] = "center";
    +				} else {
    +					at[ 1 ] = at[ 0 ];
    +					at[ 0 ] = "center";
    +				}
    +			}
    +			return _position.call( this, $.extend( options, {
    +				at: at[ 0 ] + offset[ 0 ] + " " + at[ 1 ] + offset[ 1 ],
    +				offset: undefined
    +			} ) );
    +		};
    +	}( jQuery ) );
    +}
    +
    +}( jQuery ) );
    +
    +(function( $, undefined ) {
    +
    +$.widget( "ui.progressbar", {
    +	version: "1.9.2",
    +	options: {
    +		value: 0,
    +		max: 100
    +	},
    +
    +	min: 0,
    +
    +	_create: function() {
    +		this.element
    +			.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
    +			.attr({
    +				role: "progressbar",
    +				"aria-valuemin": this.min,
    +				"aria-valuemax": this.options.max,
    +				"aria-valuenow": this._value()
    +			});
    +
    +		this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
    +			.appendTo( this.element );
    +
    +		this.oldValue = this._value();
    +		this._refreshValue();
    +	},
    +
    +	_destroy: function() {
    +		this.element
    +			.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
    +			.removeAttr( "role" )
    +			.removeAttr( "aria-valuemin" )
    +			.removeAttr( "aria-valuemax" )
    +			.removeAttr( "aria-valuenow" );
    +
    +		this.valueDiv.remove();
    +	},
    +
    +	value: function( newValue ) {
    +		if ( newValue === undefined ) {
    +			return this._value();
    +		}
    +
    +		this._setOption( "value", newValue );
    +		return this;
    +	},
    +
    +	_setOption: function( key, value ) {
    +		if ( key === "value" ) {
    +			this.options.value = value;
    +			this._refreshValue();
    +			if ( this._value() === this.options.max ) {
    +				this._trigger( "complete" );
    +			}
    +		}
    +
    +		this._super( key, value );
    +	},
    +
    +	_value: function() {
    +		var val = this.options.value;
    +		// normalize invalid value
    +		if ( typeof val !== "number" ) {
    +			val = 0;
    +		}
    +		return Math.min( this.options.max, Math.max( this.min, val ) );
    +	},
    +
    +	_percentage: function() {
    +		return 100 * this._value() / this.options.max;
    +	},
    +
    +	_refreshValue: function() {
    +		var value = this.value(),
    +			percentage = this._percentage();
    +
    +		if ( this.oldValue !== value ) {
    +			this.oldValue = value;
    +			this._trigger( "change" );
    +		}
    +
    +		this.valueDiv
    +			.toggle( value > this.min )
    +			.toggleClass( "ui-corner-right", value === this.options.max )
    +			.width( percentage.toFixed(0) + "%" );
    +		this.element.attr( "aria-valuenow", value );
    +	}
    +});
    +
    +})( jQuery );
    +
    +(function( $, undefined ) {
    +
    +// number of pages in a slider
    +// (how many times can you page up/down to go through the whole range)
    +var numPages = 5;
    +
    +$.widget( "ui.slider", $.ui.mouse, {
    +	version: "1.9.2",
    +	widgetEventPrefix: "slide",
    +
    +	options: {
    +		animate: false,
    +		distance: 0,
    +		max: 100,
    +		min: 0,
    +		orientation: "horizontal",
    +		range: false,
    +		step: 1,
    +		value: 0,
    +		values: null
    +	},
    +
    +	_create: function() {
    +		var i, handleCount,
    +			o = this.options,
    +			existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
    +			handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
    +			handles = [];
    +
    +		this._keySliding = false;
    +		this._mouseSliding = false;
    +		this._animateOff = true;
    +		this._handleIndex = null;
    +		this._detectOrientation();
    +		this._mouseInit();
    +
    +		this.element
    +			.addClass( "ui-slider" +
    +				" ui-slider-" + this.orientation +
    +				" ui-widget" +
    +				" ui-widget-content" +
    +				" ui-corner-all" +
    +				( o.disabled ? " ui-slider-disabled ui-disabled" : "" ) );
    +
    +		this.range = $([]);
    +
    +		if ( o.range ) {
    +			if ( o.range === true ) {
    +				if ( !o.values ) {
    +					o.values = [ this._valueMin(), this._valueMin() ];
    +				}
    +				if ( o.values.length && o.values.length !== 2 ) {
    +					o.values = [ o.values[0], o.values[0] ];
    +				}
    +			}
    +
    +			this.range = $( "<div></div>" )
    +				.appendTo( this.element )
    +				.addClass( "ui-slider-range" +
    +				// note: this isn't the most fittingly semantic framework class for this element,
    +				// but worked best visually with a variety of themes
    +				" ui-widget-header" +
    +				( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) );
    +		}
    +
    +		handleCount = ( o.values && o.values.length ) || 1;
    +
    +		for ( i = existingHandles.length; i < handleCount; i++ ) {
    +			handles.push( handle );
    +		}
    +
    +		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
    +
    +		this.handle = this.handles.eq( 0 );
    +
    +		this.handles.add( this.range ).filter( "a" )
    +			.click(function( event ) {
    +				event.preventDefault();
    +			})
    +			.mouseenter(function() {
    +				if ( !o.disabled ) {
    +					$( this ).addClass( "ui-state-hover" );
    +				}
    +			})
    +			.mouseleave(function() {
    +				$( this ).removeClass( "ui-state-hover" );
    +			})
    +			.focus(function() {
    +				if ( !o.disabled ) {
    +					$( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
    +					$( this ).addClass( "ui-state-focus" );
    +				} else {
    +					$( this ).blur();
    +				}
    +			})
    +			.blur(function() {
    +				$( this ).removeClass( "ui-state-focus" );
    +			});
    +
    +		this.handles.each(function( i ) {
    +			$( this ).data( "ui-slider-handle-index", i );
    +		});
    +
    +		this._on( this.handles, {
    +			keydown: function( event ) {
    +				var allowed, curVal, newVal, step,
    +					index = $( event.target ).data( "ui-slider-handle-index" );
    +
    +				switch ( event.keyCode ) {
    +					case $.ui.keyCode.HOME:
    +					case $.ui.keyCode.END:
    +					case $.ui.keyCode.PAGE_UP:
    +					case $.ui.keyCode.PAGE_DOWN:
    +					case $.ui.keyCode.UP:
    +					case $.ui.keyCode.RIGHT:
    +					case $.ui.keyCode.DOWN:
    +					case $.ui.keyCode.LEFT:
    +						event.preventDefault();
    +						if ( !this._keySliding ) {
    +							this._keySliding = true;
    +							$( event.target ).addClass( "ui-state-active" );
    +							allowed = this._start( event, index );
    +							if ( allowed === false ) {
    +								return;
    +							}
    +						}
    +						break;
    +				}
    +
    +				step = this.options.step;
    +				if ( this.options.values && this.options.values.length ) {
    +					curVal = newVal = this.values( index );
    +				} else {
    +					curVal = newVal = this.value();
    +				}
    +
    +				switch ( event.keyCode ) {
    +					case $.ui.keyCode.HOME:
    +						newVal = this._valueMin();
    +						break;
    +					case $.ui.keyCode.END:
    +						newVal = this._valueMax();
    +						break;
    +					case $.ui.keyCode.PAGE_UP:
    +						newVal = this._trimAlignValue( curVal + ( (this._valueMax() - this._valueMin()) / numPages ) );
    +						break;
    +					case $.ui.keyCode.PAGE_DOWN:
    +						newVal = this._trimAlignValue( curVal - ( (this._valueMax() - this._valueMin()) / numPages ) );
    +						break;
    +					case $.ui.keyCode.UP:
    +					case $.ui.keyCode.RIGHT:
    +						if ( curVal === this._valueMax() ) {
    +							return;
    +						}
    +						newVal = this._trimAlignValue( curVal + step );
    +						break;
    +					case $.ui.keyCode.DOWN:
    +					case $.ui.keyCode.LEFT:
    +						if ( curVal === this._valueMin() ) {
    +							return;
    +						}
    +						newVal = this._trimAlignValue( curVal - step );
    +						break;
    +				}
    +
    +				this._slide( event, index, newVal );
    +			},
    +			keyup: function( event ) {
    +				var index = $( event.target ).data( "ui-slider-handle-index" );
    +
    +				if ( this._keySliding ) {
    +					this._keySliding = false;
    +					this._stop( event, index );
    +					this._change( event, index );
    +					$( event.target ).removeClass( "ui-state-active" );
    +				}
    +			}
    +		});
    +
    +		this._refreshValue();
    +
    +		this._animateOff = false;
    +	},
    +
    +	_destroy: function() {
    +		this.handles.remove();
    +		this.range.remove();
    +
    +		this.element
    +			.removeClass( "ui-slider" +
    +				" ui-slider-horizontal" +
    +				" ui-slider-vertical" +
    +				" ui-slider-disabled" +
    +				" ui-widget" +
    +				" ui-widget-content" +
    +				" ui-corner-all" );
    +
    +		this._mouseDestroy();
    +	},
    +
    +	_mouseCapture: function( event ) {
    +		var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
    +			that = this,
    +			o = this.options;
    +
    +		if ( o.disabled ) {
    +			return false;
    +		}
    +
    +		this.elementSize = {
    +			width: this.element.outerWidth(),
    +			height: this.element.outerHeight()
    +		};
    +		this.elementOffset = this.element.offset();
    +
    +		position = { x: event.pageX, y: event.pageY };
    +		normValue = this._normValueFromMouse( position );
    +		distance = this._valueMax() - this._valueMin() + 1;
    +		this.handles.each(function( i ) {
    +			var thisDistance = Math.abs( normValue - that.values(i) );
    +			if ( distance > thisDistance ) {
    +				distance = thisDistance;
    +				closestHandle = $( this );
    +				index = i;
    +			}
    +		});
    +
    +		// workaround for bug #3736 (if both handles of a range are at 0,
    +		// the first is always used as the one with least distance,
    +		// and moving it is obviously prevented by preventing negative ranges)
    +		if( o.range === true && this.values(1) === o.min ) {
    +			index += 1;
    +			closestHandle = $( this.handles[index] );
    +		}
    +
    +		allowed = this._start( event, index );
    +		if ( allowed === false ) {
    +			return false;
    +		}
    +		this._mouseSliding = true;
    +
    +		this._handleIndex = index;
    +
    +		closestHandle
    +			.addClass( "ui-state-active" )
    +			.focus();
    +
    +		offset = closestHandle.offset();
    +		mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
    +		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
    +			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
    +			top: event.pageY - offset.top -
    +				( closestHandle.height() / 2 ) -
    +				( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
    +				( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
    +				( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
    +		};
    +
    +		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
    +			this._slide( event, index, normValue );
    +		}
    +		this._animateOff = true;
    +		return true;
    +	},
    +
    +	_mouseStart: function() {
    +		return true;
    +	},
    +
    +	_mouseDrag: function( event ) {
    +		var position = { x: event.pageX, y: event.pageY },
    +			normValue = this._normValueFromMouse( position );
    +
    +		this._slide( event, this._handleIndex, normValue );
    +
    +		return false;
    +	},
    +
    +	_mouseStop: function( event ) {
    +		this.handles.removeClass( "ui-state-active" );
    +		this._mouseSliding = false;
    +
    +		this._stop( event, this._handleIndex );
    +		this._change( event, this._handleIndex );
    +
    +		this._handleIndex = null;
    +		this._clickOffset = null;
    +		this._animateOff = false;
    +
    +		return false;
    +	},
    +
    +	_detectOrientation: function() {
    +		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
    +	},
    +
    +	_normValueFromMouse: function( position ) {
    +		var pixelTotal,
    +			pixelMouse,
    +			percentMouse,
    +			valueTotal,
    +			valueMouse;
    +
    +		if ( this.orientation === "horizontal" ) {
    +			pixelTotal = this.elementSize.width;
    +			pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
    +		} else {
    +			pixelTotal = this.elementSize.height;
    +			pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
    +		}
    +
    +		percentMouse = ( pixelMouse / pixelTotal );
    +		if ( percentMouse > 1 ) {
    +			percentMouse = 1;
    +		}
    +		if ( percentMouse < 0 ) {
    +			percentMouse = 0;
    +		}
    +		if ( this.orientation === "vertical" ) {
    +			percentMouse = 1 - percentMouse;
    +		}
    +
    +		valueTotal = this._valueMax() - this._valueMin();
    +		valueMouse = this._valueMin() + percentMouse * valueTotal;
    +
    +		return this._trimAlignValue( valueMouse );
    +	},
    +
    +	_start: function( event, index ) {
    +		var uiHash = {
    +			handle: this.handles[ index ],
    +			value: this.value()
    +		};
    +		if ( this.options.values && this.options.values.length ) {
    +			uiHash.value = this.values( index );
    +			uiHash.values = this.values();
    +		}
    +		return this._trigger( "start", event, uiHash );
    +	},
    +
    +	_slide: function( event, index, newVal ) {
    +		var otherVal,
    +			newValues,
    +			allowed;
    +
    +		if ( this.options.values && this.options.values.length ) {
    +			otherVal = this.values( index ? 0 : 1 );
    +
    +			if ( ( this.options.values.length === 2 && this.options.range === true ) &&
    +					( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
    +				) {
    +				newVal = otherVal;
    +			}
    +
    +			if ( newVal !== this.values( index ) ) {
    +				newValues = this.values();
    +				newValues[ index ] = newVal;
    +				// A slide can be canceled by returning false from the slide callback
    +				allowed = this._trigger( "slide", event, {
    +					handle: this.handles[ index ],
    +					value: newVal,
    +					values: newValues
    +				} );
    +				otherVal = this.values( index ? 0 : 1 );
    +				if ( allowed !== false ) {
    +					this.values( index, newVal, true );
    +				}
    +			}
    +		} else {
    +			if ( newVal !== this.value() ) {
    +				// A slide can be canceled by returning false from the slide callback
    +				allowed = this._trigger( "slide", event, {
    +					handle: this.handles[ index ],
    +					value: newVal
    +				} );
    +				if ( allowed !== false ) {
    +					this.value( newVal );
    +				}
    +			}
    +		}
    +	},
    +
    +	_stop: function( event, index ) {
    +		var uiHash = {
    +			handle: this.handles[ index ],
    +			value: this.value()
    +		};
    +		if ( this.options.values && this.options.values.length ) {
    +			uiHash.value = this.values( index );
    +			uiHash.values = this.values();
    +		}
    +
    +		this._trigger( "stop", event, uiHash );
    +	},
    +
    +	_change: function( event, index ) {
    +		if ( !this._keySliding && !this._mouseSliding ) {
    +			var uiHash = {
    +				handle: this.handles[ index ],
    +				value: this.value()
    +			};
    +			if ( this.options.values && this.options.values.length ) {
    +				uiHash.value = this.values( index );
    +				uiHash.values = this.values();
    +			}
    +
    +			this._trigger( "change", event, uiHash );
    +		}
    +	},
    +
    +	value: function( newValue ) {
    +		if ( arguments.length ) {
    +			this.options.value = this._trimAlignValue( newValue );
    +			this._refreshValue();
    +			this._change( null, 0 );
    +			return;
    +		}
    +
    +		return this._value();
    +	},
    +
    +	values: function( index, newValue ) {
    +		var vals,
    +			newValues,
    +			i;
    +
    +		if ( arguments.length > 1 ) {
    +			this.options.values[ index ] = this._trimAlignValue( newValue );
    +			this._refreshValue();
    +			this._change( null, index );
    +			return;
    +		}
    +
    +		if ( arguments.length ) {
    +			if ( $.isArray( arguments[ 0 ] ) ) {
    +				vals = this.options.values;
    +				newValues = arguments[ 0 ];
    +				for ( i = 0; i < vals.length; i += 1 ) {
    +					vals[ i ] = this._trimAlignValue( newValues[ i ] );
    +					this._change( null, i );
    +				}
    +				this._refreshValue();
    +			} else {
    +				if ( this.options.values && this.options.values.length ) {
    +					return this._values( index );
    +				} else {
    +					return this.value();
    +				}
    +			}
    +		} else {
    +			return this._values();
    +		}
    +	},
    +
    +	_setOption: function( key, value ) {
    +		var i,
    +			valsLength = 0;
    +
    +		if ( $.isArray( this.options.values ) ) {
    +			valsLength = this.options.values.length;
    +		}
    +
    +		$.Widget.prototype._setOption.apply( this, arguments );
    +
    +		switch ( key ) {
    +			case "disabled":
    +				if ( value ) {
    +					this.handles.filter( ".ui-state-focus" ).blur();
    +					this.handles.removeClass( "ui-state-hover" );
    +					this.handles.prop( "disabled", true );
    +					this.element.addClass( "ui-disabled" );
    +				} else {
    +					this.handles.prop( "disabled", false );
    +					this.element.removeClass( "ui-disabled" );
    +				}
    +				break;
    +			case "orientation":
    +				this._detectOrientation();
    +				this.element
    +					.removeClass( "ui-slider-horizontal ui-slider-vertical" )
    +					.addClass( "ui-slider-" + this.orientation );
    +				this._refreshValue();
    +				break;
    +			case "value":
    +				this._animateOff = true;
    +				this._refreshValue();
    +				this._change( null, 0 );
    +				this._animateOff = false;
    +				break;
    +			case "values":
    +				this._animateOff = true;
    +				this._refreshValue();
    +				for ( i = 0; i < valsLength; i += 1 ) {
    +					this._change( null, i );
    +				}
    +				this._animateOff = false;
    +				break;
    +			case "min":
    +			case "max":
    +				this._animateOff = true;
    +				this._refreshValue();
    +				this._animateOff = false;
    +				break;
    +		}
    +	},
    +
    +	//internal value getter
    +	// _value() returns value trimmed by min and max, aligned by step
    +	_value: function() {
    +		var val = this.options.value;
    +		val = this._trimAlignValue( val );
    +
    +		return val;
    +	},
    +
    +	//internal values getter
    +	// _values() returns array of values trimmed by min and max, aligned by step
    +	// _values( index ) returns single value trimmed by min and max, aligned by step
    +	_values: function( index ) {
    +		var val,
    +			vals,
    +			i;
    +
    +		if ( arguments.length ) {
    +			val = this.options.values[ index ];
    +			val = this._trimAlignValue( val );
    +
    +			return val;
    +		} else {
    +			// .slice() creates a copy of the array
    +			// this copy gets trimmed by min and max and then returned
    +			vals = this.options.values.slice();
    +			for ( i = 0; i < vals.length; i+= 1) {
    +				vals[ i ] = this._trimAlignValue( vals[ i ] );
    +			}
    +
    +			return vals;
    +		}
    +	},
    +
    +	// returns the step-aligned value that val is closest to, between (inclusive) min and max
    +	_trimAlignValue: function( val ) {
    +		if ( val <= this._valueMin() ) {
    +			return this._valueMin();
    +		}
    +		if ( val >= this._valueMax() ) {
    +			return this._valueMax();
    +		}
    +		var step = ( this.options.step > 0 ) ? this.options.step : 1,
    +			valModStep = (val - this._valueMin()) % step,
    +			alignValue = val - valModStep;
    +
    +		if ( Math.abs(valModStep) * 2 >= step ) {
    +			alignValue += ( valModStep > 0 ) ? step : ( -step );
    +		}
    +
    +		// Since JavaScript has problems with large floats, round
    +		// the final value to 5 digits after the decimal point (see #4124)
    +		return parseFloat( alignValue.toFixed(5) );
    +	},
    +
    +	_valueMin: function() {
    +		return this.options.min;
    +	},
    +
    +	_valueMax: function() {
    +		return this.options.max;
    +	},
    +
    +	_refreshValue: function() {
    +		var lastValPercent, valPercent, value, valueMin, valueMax,
    +			oRange = this.options.range,
    +			o = this.options,
    +			that = this,
    +			animate = ( !this._animateOff ) ? o.animate : false,
    +			_set = {};
    +
    +		if ( this.options.values && this.options.values.length ) {
    +			this.handles.each(function( i ) {
    +				valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
    +				_set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
    +				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
    +				if ( that.options.range === true ) {
    +					if ( that.orientation === "horizontal" ) {
    +						if ( i === 0 ) {
    +							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
    +						}
    +						if ( i === 1 ) {
    +							that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
    +						}
    +					} else {
    +						if ( i === 0 ) {
    +							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
    +						}
    +						if ( i === 1 ) {
    +							that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
    +						}
    +					}
    +				}
    +				lastValPercent = valPercent;
    +			});
    +		} else {
    +			value = this.value();
    +			valueMin = this._valueMin();
    +			valueMax = this._valueMax();
    +			valPercent = ( valueMax !== valueMin ) ?
    +					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
    +					0;
    +			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
    +			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
    +
    +			if ( oRange === "min" && this.orientation === "horizontal" ) {
    +				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
    +			}
    +			if ( oRange === "max" && this.orientation === "horizontal" ) {
    +				this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
    +			}
    +			if ( oRange === "min" && this.orientation === "vertical" ) {
    +				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
    +			}
    +			if ( oRange === "max" && this.orientation === "vertical" ) {
    +				this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
    +			}
    +		}
    +	}
    +
    +});
    +
    +}(jQuery));
    +
    +(function( $ ) {
    +
    +function modifier( fn ) {
    +	return function() {
    +		var previous = this.element.val();
    +		fn.apply( this, arguments );
    +		this._refresh();
    +		if ( previous !== this.element.val() ) {
    +			this._trigger( "change" );
    +		}
    +	};
    +}
    +
    +$.widget( "ui.spinner", {
    +	version: "1.9.2",
    +	defaultElement: "<input>",
    +	widgetEventPrefix: "spin",
    +	options: {
    +		culture: null,
    +		icons: {
    +			down: "ui-icon-triangle-1-s",
    +			up: "ui-icon-triangle-1-n"
    +		},
    +		incremental: true,
    +		max: null,
    +		min: null,
    +		numberFormat: null,
    +		page: 10,
    +		step: 1,
    +
    +		change: null,
    +		spin: null,
    +		start: null,
    +		stop: null
    +	},
    +
    +	_create: function() {
    +		// handle string values that need to be parsed
    +		this._setOption( "max", this.options.max );
    +		this._setOption( "min", this.options.min );
    +		this._setOption( "step", this.options.step );
    +
    +		// format the value, but don't constrain
    +		this._value( this.element.val(), true );
    +
    +		this._draw();
    +		this._on( this._events );
    +		this._refresh();
    +
    +		// turning off autocomplete prevents the browser from remembering the
    +		// value when navigating through history, so we re-enable autocomplete
    +		// if the page is unloaded before the widget is destroyed. #7790
    +		this._on( this.window, {
    +			beforeunload: function() {
    +				this.element.removeAttr( "autocomplete" );
    +			}
    +		});
    +	},
    +
    +	_getCreateOptions: function() {
    +		var options = {},
    +			element = this.element;
    +
    +		$.each( [ "min", "max", "step" ], function( i, option ) {
    +			var value = element.attr( option );
    +			if ( value !== undefined && value.length ) {
    +				options[ option ] = value;
    +			}
    +		});
    +
    +		return options;
    +	},
    +
    +	_events: {
    +		keydown: function( event ) {
    +			if ( this._start( event ) && this._keydown( event ) ) {
    +				event.preventDefault();
    +			}
    +		},
    +		keyup: "_stop",
    +		focus: function() {
    +			this.previous = this.element.val();
    +		},
    +		blur: function( event ) {
    +			if ( this.cancelBlur ) {
    +				delete this.cancelBlur;
    +				return;
    +			}
    +
    +			this._refresh();
    +			if ( this.previous !== this.element.val() ) {
    +				this._trigger( "change", event );
    +			}
    +		},
    +		mousewheel: function( event, delta ) {
    +			if ( !delta ) {
    +				return;
    +			}
    +			if ( !this.spinning && !this._start( event ) ) {
    +				return false;
    +			}
    +
    +			this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
    +			clearTimeout( this.mousewheelTimer );
    +			this.mousewheelTimer = this._delay(function() {
    +				if ( this.spinning ) {
    +					this._stop( event );
    +				}
    +			}, 100 );
    +			event.preventDefault();
    +		},
    +		"mousedown .ui-spinner-button": function( event ) {
    +			var previous;
    +
    +			// We never want the buttons to have focus; whenever the user is
    +			// interacting with the spinner, the focus should be on the input.
    +			// If the input is focused then this.previous is properly set from
    +			// when the input first received focus. If the input is not focused
    +			// then we need to set this.previous based on the value before spinning.
    +			previous = this.element[0] === this.document[0].activeElement ?
    +				this.previous : this.element.val();
    +			function checkFocus() {
    +				var isActive = this.element[0] === this.document[0].activeElement;
    +				if ( !isActive ) {
    +					this.element.focus();
    +					this.previous = previous;
    +					// support: IE
    +					// IE sets focus asynchronously, so we need to check if focus
    +					// moved off of the input because the user clicked on the button.
    +					this._delay(function() {
    +						this.previous = previous;
    +					});
    +				}
    +			}
    +
    +			// ensure focus is on (or stays on) the text field
    +			event.preventDefault();
    +			checkFocus.call( this );
    +
    +			// support: IE
    +			// IE doesn't prevent moving focus even with event.preventDefault()
    +			// so we set a flag to know when we should ignore the blur event
    +			// and check (again) if focus moved off of the input.
    +			this.cancelBlur = true;
    +			this._delay(function() {
    +				delete this.cancelBlur;
    +				checkFocus.call( this );
    +			});
    +
    +			if ( this._start( event ) === false ) {
    +				return;
    +			}
    +
    +			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
    +		},
    +		"mouseup .ui-spinner-button": "_stop",
    +		"mouseenter .ui-spinner-button": function( event ) {
    +			// button will add ui-state-active if mouse was down while mouseleave and kept down
    +			if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
    +				return;
    +			}
    +
    +			if ( this._start( event ) === false ) {
    +				return false;
    +			}
    +			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
    +		},
    +		// TODO: do we really want to consider this a stop?
    +		// shouldn't we just stop the repeater and wait until mouseup before
    +		// we trigger the stop event?
    +		"mouseleave .ui-spinner-button": "_stop"
    +	},
    +
    +	_draw: function() {
    +		var uiSpinner = this.uiSpinner = this.element
    +			.addClass( "ui-spinner-input" )
    +			.attr( "autocomplete", "off" )
    +			.wrap( this._uiSpinnerHtml() )
    +			.parent()
    +				// add buttons
    +				.append( this._buttonHtml() );
    +
    +		this.element.attr( "role", "spinbutton" );
    +
    +		// button bindings
    +		this.buttons = uiSpinner.find( ".ui-spinner-button" )
    +			.attr( "tabIndex", -1 )
    +			.button()
    +			.removeClass( "ui-corner-all" );
    +
    +		// IE 6 doesn't understand height: 50% for the buttons
    +		// unless the wrapper has an explicit height
    +		if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
    +				uiSpinner.height() > 0 ) {
    +			uiSpinner.height( uiSpinner.height() );
    +		}
    +
    +		// disable spinner if element was already disabled
    +		if ( this.options.disabled ) {
    +			this.disable();
    +		}
    +	},
    +
    +	_keydown: function( event ) {
    +		var options = this.options,
    +			keyCode = $.ui.keyCode;
    +
    +		switch ( event.keyCode ) {
    +		case keyCode.UP:
    +			this._repeat( null, 1, event );
    +			return true;
    +		case keyCode.DOWN:
    +			this._repeat( null, -1, event );
    +			return true;
    +		case keyCode.PAGE_UP:
    +			this._repeat( null, options.page, event );
    +			return true;
    +		case keyCode.PAGE_DOWN:
    +			this._repeat( null, -options.page, event );
    +			return true;
    +		}
    +
    +		return false;
    +	},
    +
    +	_uiSpinnerHtml: function() {
    +		return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
    +	},
    +
    +	_buttonHtml: function() {
    +		return "" +
    +			"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
    +				"<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
    +			"</a>" +
    +			"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
    +				"<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
    +			"</a>";
    +	},
    +
    +	_start: function( event ) {
    +		if ( !this.spinning && this._trigger( "start", event ) === false ) {
    +			return false;
    +		}
    +
    +		if ( !this.counter ) {
    +			this.counter = 1;
    +		}
    +		this.spinning = true;
    +		return true;
    +	},
    +
    +	_repeat: function( i, steps, event ) {
    +		i = i || 500;
    +
    +		clearTimeout( this.timer );
    +		this.timer = this._delay(function() {
    +			this._repeat( 40, steps, event );
    +		}, i );
    +
    +		this._spin( steps * this.options.step, event );
    +	},
    +
    +	_spin: function( step, event ) {
    +		var value = this.value() || 0;
    +
    +		if ( !this.counter ) {
    +			this.counter = 1;
    +		}
    +
    +		value = this._adjustValue( value + step * this._increment( this.counter ) );
    +
    +		if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
    +			this._value( value );
    +			this.counter++;
    +		}
    +	},
    +
    +	_increment: function( i ) {
    +		var incremental = this.options.incremental;
    +
    +		if ( incremental ) {
    +			return $.isFunction( incremental ) ?
    +				incremental( i ) :
    +				Math.floor( i*i*i/50000 - i*i/500 + 17*i/200 + 1 );
    +		}
    +
    +		return 1;
    +	},
    +
    +	_precision: function() {
    +		var precision = this._precisionOf( this.options.step );
    +		if ( this.options.min !== null ) {
    +			precision = Math.max( precision, this._precisionOf( this.options.min ) );
    +		}
    +		return precision;
    +	},
    +
    +	_precisionOf: function( num ) {
    +		var str = num.toString(),
    +			decimal = str.indexOf( "." );
    +		return decimal === -1 ? 0 : str.length - decimal - 1;
    +	},
    +
    +	_adjustValue: function( value ) {
    +		var base, aboveMin,
    +			options = this.options;
    +
    +		// make sure we're at a valid step
    +		// - find out where we are relative to the base (min or 0)
    +		base = options.min !== null ? options.min : 0;
    +		aboveMin = value - base;
    +		// - round to the nearest step
    +		aboveMin = Math.round(aboveMin / options.step) * options.step;
    +		// - rounding is based on 0, so adjust back to our base
    +		value = base + aboveMin;
    +
    +		// fix precision from bad JS floating point math
    +		value = parseFloat( value.toFixed( this._precision() ) );
    +
    +		// clamp the value
    +		if ( options.max !== null && value > options.max) {
    +			return options.max;
    +		}
    +		if ( options.min !== null && value < options.min ) {
    +			return options.min;
    +		}
    +
    +		return value;
    +	},
    +
    +	_stop: function( event ) {
    +		if ( !this.spinning ) {
    +			return;
    +		}
    +
    +		clearTimeout( this.timer );
    +		clearTimeout( this.mousewheelTimer );
    +		this.counter = 0;
    +		this.spinning = false;
    +		this._trigger( "stop", event );
    +	},
    +
    +	_setOption: function( key, value ) {
    +		if ( key === "culture" || key === "numberFormat" ) {
    +			var prevValue = this._parse( this.element.val() );
    +			this.options[ key ] = value;
    +			this.element.val( this._format( prevValue ) );
    +			return;
    +		}
    +
    +		if ( key === "max" || key === "min" || key === "step" ) {
    +			if ( typeof value === "string" ) {
    +				value = this._parse( value );
    +			}
    +		}
    +
    +		this._super( key, value );
    +
    +		if ( key === "disabled" ) {
    +			if ( value ) {
    +				this.element.prop( "disabled", true );
    +				this.buttons.button( "disable" );
    +			} else {
    +				this.element.prop( "disabled", false );
    +				this.buttons.button( "enable" );
    +			}
    +		}
    +	},
    +
    +	_setOptions: modifier(function( options ) {
    +		this._super( options );
    +		this._value( this.element.val() );
    +	}),
    +
    +	_parse: function( val ) {
    +		if ( typeof val === "string" && val !== "" ) {
    +			val = window.Globalize && this.options.numberFormat ?
    +				Globalize.parseFloat( val, 10, this.options.culture ) : +val;
    +		}
    +		return val === "" || isNaN( val ) ? null : val;
    +	},
    +
    +	_format: function( value ) {
    +		if ( value === "" ) {
    +			return "";
    +		}
    +		return window.Globalize && this.options.numberFormat ?
    +			Globalize.format( value, this.options.numberFormat, this.options.culture ) :
    +			value;
    +	},
    +
    +	_refresh: function() {
    +		this.element.attr({
    +			"aria-valuemin": this.options.min,
    +			"aria-valuemax": this.options.max,
    +			// TODO: what should we do with values that can't be parsed?
    +			"aria-valuenow": this._parse( this.element.val() )
    +		});
    +	},
    +
    +	// update the value without triggering change
    +	_value: function( value, allowAny ) {
    +		var parsed;
    +		if ( value !== "" ) {
    +			parsed = this._parse( value );
    +			if ( parsed !== null ) {
    +				if ( !allowAny ) {
    +					parsed = this._adjustValue( parsed );
    +				}
    +				value = this._format( parsed );
    +			}
    +		}
    +		this.element.val( value );
    +		this._refresh();
    +	},
    +
    +	_destroy: function() {
    +		this.element
    +			.removeClass( "ui-spinner-input" )
    +			.prop( "disabled", false )
    +			.removeAttr( "autocomplete" )
    +			.removeAttr( "role" )
    +			.removeAttr( "aria-valuemin" )
    +			.removeAttr( "aria-valuemax" )
    +			.removeAttr( "aria-valuenow" );
    +		this.uiSpinner.replaceWith( this.element );
    +	},
    +
    +	stepUp: modifier(function( steps ) {
    +		this._stepUp( steps );
    +	}),
    +	_stepUp: function( steps ) {
    +		this._spin( (steps || 1) * this.options.step );
    +	},
    +
    +	stepDown: modifier(function( steps ) {
    +		this._stepDown( steps );
    +	}),
    +	_stepDown: function( steps ) {
    +		this._spin( (steps || 1) * -this.options.step );
    +	},
    +
    +	pageUp: modifier(function( pages ) {
    +		this._stepUp( (pages || 1) * this.options.page );
    +	}),
    +
    +	pageDown: modifier(function( pages ) {
    +		this._stepDown( (pages || 1) * this.options.page );
    +	}),
    +
    +	value: function( newVal ) {
    +		if ( !arguments.length ) {
    +			return this._parse( this.element.val() );
    +		}
    +		modifier( this._value ).call( this, newVal );
    +	},
    +
    +	widget: function() {
    +		return this.uiSpinner;
    +	}
    +});
    +
    +}( jQuery ) );
    +
    +(function( $, undefined ) {
    +
    +var tabId = 0,
    +	rhash = /#.*$/;
    +
    +function getNextTabId() {
    +	return ++tabId;
    +}
    +
    +function isLocal( anchor ) {
    +	return anchor.hash.length > 1 &&
    +		anchor.href.replace( rhash, "" ) ===
    +			location.href.replace( rhash, "" )
    +				// support: Safari 5.1
    +				// Safari 5.1 doesn't encode spaces in window.location
    +				// but it does encode spaces from anchors (#8777)
    +				.replace( /\s/g, "%20" );
    +}
    +
    +$.widget( "ui.tabs", {
    +	version: "1.9.2",
    +	delay: 300,
    +	options: {
    +		active: null,
    +		collapsible: false,
    +		event: "click",
    +		heightStyle: "content",
    +		hide: null,
    +		show: null,
    +
    +		// callbacks
    +		activate: null,
    +		beforeActivate: null,
    +		beforeLoad: null,
    +		load: null
    +	},
    +
    +	_create: function() {
    +		var that = this,
    +			options = this.options,
    +			active = options.active,
    +			locationHash = location.hash.substring( 1 );
    +
    +		this.running = false;
    +
    +		this.element
    +			.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
    +			.toggleClass( "ui-tabs-collapsible", options.collapsible )
    +			// Prevent users from focusing disabled tabs via click
    +			.delegate( ".ui-tabs-nav > li", "mousedown" + this.eventNamespace, function( event ) {
    +				if ( $( this ).is( ".ui-state-disabled" ) ) {
    +					event.preventDefault();
    +				}
    +			})
    +			// support: IE <9
    +			// Preventing the default action in mousedown doesn't prevent IE
    +			// from focusing the element, so if the anchor gets focused, blur.
    +			// We don't have to worry about focusing the previously focused
    +			// element since clicking on a non-focusable element should focus
    +			// the body anyway.
    +			.delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
    +				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
    +					this.blur();
    +				}
    +			});
    +
    +		this._processTabs();
    +
    +		if ( active === null ) {
    +			// check the fragment identifier in the URL
    +			if ( locationHash ) {
    +				this.tabs.each(function( i, tab ) {
    +					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
    +						active = i;
    +						return false;
    +					}
    +				});
    +			}
    +
    +			// check for a tab marked active via a class
    +			if ( active === null ) {
    +				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
    +			}
    +
    +			// no active tab, set to false
    +			if ( active === null || active === -1 ) {
    +				active = this.tabs.length ? 0 : false;
    +			}
    +		}
    +
    +		// handle numbers: negative, out of range
    +		if ( active !== false ) {
    +			active = this.tabs.index( this.tabs.eq( active ) );
    +			if ( active === -1 ) {
    +				active = options.collapsible ? false : 0;
    +			}
    +		}
    +		options.active = active;
    +
    +		// don't allow collapsible: false and active: false
    +		if ( !options.collapsible && options.active === false && this.anchors.length ) {
    +			options.active = 0;
    +		}
    +
    +		// Take disabling tabs via class attribute from HTML
    +		// into account and update option properly.
    +		if ( $.isArray( options.disabled ) ) {
    +			options.disabled = $.unique( options.disabled.concat(
    +				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
    +					return that.tabs.index( li );
    +				})
    +			) ).sort();
    +		}
    +
    +		// check for length avoids error when initializing empty list
    +		if ( this.options.active !== false && this.anchors.length ) {
    +			this.active = this._findActive( this.options.active );
    +		} else {
    +			this.active = $();
    +		}
    +
    +		this._refresh();
    +
    +		if ( this.active.length ) {
    +			this.load( options.active );
    +		}
    +	},
    +
    +	_getCreateEventData: function() {
    +		return {
    +			tab: this.active,
    +			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
    +		};
    +	},
    +
    +	_tabKeydown: function( event ) {
    +		var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
    +			selectedIndex = this.tabs.index( focusedTab ),
    +			goingForward = true;
    +
    +		if ( this._handlePageNav( event ) ) {
    +			return;
    +		}
    +
    +		switch ( event.keyCode ) {
    +			case $.ui.keyCode.RIGHT:
    +			case $.ui.keyCode.DOWN:
    +				selectedIndex++;
    +				break;
    +			case $.ui.keyCode.UP:
    +			case $.ui.keyCode.LEFT:
    +				goingForward = false;
    +				selectedIndex--;
    +				break;
    +			case $.ui.keyCode.END:
    +				selectedIndex = this.anchors.length - 1;
    +				break;
    +			case $.ui.keyCode.HOME:
    +				selectedIndex = 0;
    +				break;
    +			case $.ui.keyCode.SPACE:
    +				// Activate only, no collapsing
    +				event.preventDefault();
    +				clearTimeout( this.activating );
    +				this._activate( selectedIndex );
    +				return;
    +			case $.ui.keyCode.ENTER:
    +				// Toggle (cancel delayed activation, allow collapsing)
    +				event.preventDefault();
    +				clearTimeout( this.activating );
    +				// Determine if we should collapse or activate
    +				this._activate( selectedIndex === this.options.active ? false : selectedIndex );
    +				return;
    +			default:
    +				return;
    +		}
    +
    +		// Focus the appropriate tab, based on which key was pressed
    +		event.preventDefault();
    +		clearTimeout( this.activating );
    +		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
    +
    +		// Navigating with control key will prevent automatic activation
    +		if ( !event.ctrlKey ) {
    +			// Update aria-selected immediately so that AT think the tab is already selected.
    +			// Otherwise AT may confuse the user by stating that they need to activate the tab,
    +			// but the tab will already be activated by the time the announcement finishes.
    +			focusedTab.attr( "aria-selected", "false" );
    +			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
    +
    +			this.activating = this._delay(function() {
    +				this.option( "active", selectedIndex );
    +			}, this.delay );
    +		}
    +	},
    +
    +	_panelKeydown: function( event ) {
    +		if ( this._handlePageNav( event ) ) {
    +			return;
    +		}
    +
    +		// Ctrl+up moves focus to the current tab
    +		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
    +			event.preventDefault();
    +			this.active.focus();
    +		}
    +	},
    +
    +	// Alt+page up/down moves focus to the previous/next tab (and activates)
    +	_handlePageNav: function( event ) {
    +		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
    +			this._activate( this._focusNextTab( this.options.active - 1, false ) );
    +			return true;
    +		}
    +		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
    +			this._activate( this._focusNextTab( this.options.active + 1, true ) );
    +			return true;
    +		}
    +	},
    +
    +	_findNextTab: function( index, goingForward ) {
    +		var lastTabIndex = this.tabs.length - 1;
    +
    +		function constrain() {
    +			if ( index > lastTabIndex ) {
    +				index = 0;
    +			}
    +			if ( index < 0 ) {
    +				index = lastTabIndex;
    +			}
    +			return index;
    +		}
    +
    +		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
    +			index = goingForward ? index + 1 : index - 1;
    +		}
    +
    +		return index;
    +	},
    +
    +	_focusNextTab: function( index, goingForward ) {
    +		index = this._findNextTab( index, goingForward );
    +		this.tabs.eq( index ).focus();
    +		return index;
    +	},
    +
    +	_setOption: function( key, value ) {
    +		if ( key === "active" ) {
    +			// _activate() will handle invalid values and update this.options
    +			this._activate( value );
    +			return;
    +		}
    +
    +		if ( key === "disabled" ) {
    +			// don't use the widget factory's disabled handling
    +			this._setupDisabled( value );
    +			return;
    +		}
    +
    +		this._super( key, value);
    +
    +		if ( key === "collapsible" ) {
    +			this.element.toggleClass( "ui-tabs-collapsible", value );
    +			// Setting collapsible: false while collapsed; open first panel
    +			if ( !value && this.options.active === false ) {
    +				this._activate( 0 );
    +			}
    +		}
    +
    +		if ( key === "event" ) {
    +			this._setupEvents( value );
    +		}
    +
    +		if ( key === "heightStyle" ) {
    +			this._setupHeightStyle( value );
    +		}
    +	},
    +
    +	_tabId: function( tab ) {
    +		return tab.attr( "aria-controls" ) || "ui-tabs-" + getNextTabId();
    +	},
    +
    +	_sanitizeSelector: function( hash ) {
    +		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
    +	},
    +
    +	refresh: function() {
    +		var options = this.options,
    +			lis = this.tablist.children( ":has(a[href])" );
    +
    +		// get disabled tabs from class attribute from HTML
    +		// this will get converted to a boolean if needed in _refresh()
    +		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
    +			return lis.index( tab );
    +		});
    +
    +		this._processTabs();
    +
    +		// was collapsed or no tabs
    +		if ( options.active === false || !this.anchors.length ) {
    +			options.active = false;
    +			this.active = $();
    +		// was active, but active tab is gone
    +		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
    +			// all remaining tabs are disabled
    +			if ( this.tabs.length === options.disabled.length ) {
    +				options.active = false;
    +				this.active = $();
    +			// activate previous tab
    +			} else {
    +				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
    +			}
    +		// was active, active tab still exists
    +		} else {
    +			// make sure active index is correct
    +			options.active = this.tabs.index( this.active );
    +		}
    +
    +		this._refresh();
    +	},
    +
    +	_refresh: function() {
    +		this._setupDisabled( this.options.disabled );
    +		this._setupEvents( this.options.event );
    +		this._setupHeightStyle( this.options.heightStyle );
    +
    +		this.tabs.not( this.active ).attr({
    +			"aria-selected": "false",
    +			tabIndex: -1
    +		});
    +		this.panels.not( this._getPanelForTab( this.active ) )
    +			.hide()
    +			.attr({
    +				"aria-expanded": "false",
    +				"aria-hidden": "true"
    +			});
    +
    +		// Make sure one tab is in the tab order
    +		if ( !this.active.length ) {
    +			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
    +		} else {
    +			this.active
    +				.addClass( "ui-tabs-active ui-state-active" )
    +				.attr({
    +					"aria-selected": "true",
    +					tabIndex: 0
    +				});
    +			this._getPanelForTab( this.active )
    +				.show()
    +				.attr({
    +					"aria-expanded": "true",
    +					"aria-hidden": "false"
    +				});
    +		}
    +	},
    +
    +	_processTabs: function() {
    +		var that = this;
    +
    +		this.tablist = this._getList()
    +			.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
    +			.attr( "role", "tablist" );
    +
    +		this.tabs = this.tablist.find( "> li:has(a[href])" )
    +			.addClass( "ui-state-default ui-corner-top" )
    +			.attr({
    +				role: "tab",
    +				tabIndex: -1
    +			});
    +
    +		this.anchors = this.tabs.map(function() {
    +				return $( "a", this )[ 0 ];
    +			})
    +			.addClass( "ui-tabs-anchor" )
    +			.attr({
    +				role: "presentation",
    +				tabIndex: -1
    +			});
    +
    +		this.panels = $();
    +
    +		this.anchors.each(function( i, anchor ) {
    +			var selector, panel, panelId,
    +				anchorId = $( anchor ).uniqueId().attr( "id" ),
    +				tab = $( anchor ).closest( "li" ),
    +				originalAriaControls = tab.attr( "aria-controls" );
    +
    +			// inline tab
    +			if ( isLocal( anchor ) ) {
    +				selector = anchor.hash;
    +				panel = that.element.find( that._sanitizeSelector( selector ) );
    +			// remote tab
    +			} else {
    +				panelId = that._tabId( tab );
    +				selector = "#" + panelId;
    +				panel = that.element.find( selector );
    +				if ( !panel.length ) {
    +					panel = that._createPanel( panelId );
    +					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
    +				}
    +				panel.attr( "aria-live", "polite" );
    +			}
    +
    +			if ( panel.length) {
    +				that.panels = that.panels.add( panel );
    +			}
    +			if ( originalAriaControls ) {
    +				tab.data( "ui-tabs-aria-controls", originalAriaControls );
    +			}
    +			tab.attr({
    +				"aria-controls": selector.substring( 1 ),
    +				"aria-labelledby": anchorId
    +			});
    +			panel.attr( "aria-labelledby", anchorId );
    +		});
    +
    +		this.panels
    +			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
    +			.attr( "role", "tabpanel" );
    +	},
    +
    +	// allow overriding how to find the list for rare usage scenarios (#7715)
    +	_getList: function() {
    +		return this.element.find( "ol,ul" ).eq( 0 );
    +	},
    +
    +	_createPanel: function( id ) {
    +		return $( "<div>" )
    +			.attr( "id", id )
    +			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
    +			.data( "ui-tabs-destroy", true );
    +	},
    +
    +	_setupDisabled: function( disabled ) {
    +		if ( $.isArray( disabled ) ) {
    +			if ( !disabled.length ) {
    +				disabled = false;
    +			} else if ( disabled.length === this.anchors.length ) {
    +				disabled = true;
    +			}
    +		}
    +
    +		// disable tabs
    +		for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
    +			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
    +				$( li )
    +					.addClass( "ui-state-disabled" )
    +					.attr( "aria-disabled", "true" );
    +			} else {
    +				$( li )
    +					.removeClass( "ui-state-disabled" )
    +					.removeAttr( "aria-disabled" );
    +			}
    +		}
    +
    +		this.options.disabled = disabled;
    +	},
    +
    +	_setupEvents: function( event ) {
    +		var events = {
    +			click: function( event ) {
    +				event.preventDefault();
    +			}
    +		};
    +		if ( event ) {
    +			$.each( event.split(" "), function( index, eventName ) {
    +				events[ eventName ] = "_eventHandler";
    +			});
    +		}
    +
    +		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
    +		this._on( this.anchors, events );
    +		this._on( this.tabs, { keydown: "_tabKeydown" } );
    +		this._on( this.panels, { keydown: "_panelKeydown" } );
    +
    +		this._focusable( this.tabs );
    +		this._hoverable( this.tabs );
    +	},
    +
    +	_setupHeightStyle: function( heightStyle ) {
    +		var maxHeight, overflow,
    +			parent = this.element.parent();
    +
    +		if ( heightStyle === "fill" ) {
    +			// IE 6 treats height like minHeight, so we need to turn off overflow
    +			// in order to get a reliable height
    +			// we use the minHeight support test because we assume that only
    +			// browsers that don't support minHeight will treat height as minHeight
    +			if ( !$.support.minHeight ) {
    +				overflow = parent.css( "overflow" );
    +				parent.css( "overflow", "hidden");
    +			}
    +			maxHeight = parent.height();
    +			this.element.siblings( ":visible" ).each(function() {
    +				var elem = $( this ),
    +					position = elem.css( "position" );
    +
    +				if ( position === "absolute" || position === "fixed" ) {
    +					return;
    +				}
    +				maxHeight -= elem.outerHeight( true );
    +			});
    +			if ( overflow ) {
    +				parent.css( "overflow", overflow );
    +			}
    +
    +			this.element.children().not( this.panels ).each(function() {
    +				maxHeight -= $( this ).outerHeight( true );
    +			});
    +
    +			this.panels.each(function() {
    +				$( this ).height( Math.max( 0, maxHeight -
    +					$( this ).innerHeight() + $( this ).height() ) );
    +			})
    +			.css( "overflow", "auto" );
    +		} else if ( heightStyle === "auto" ) {
    +			maxHeight = 0;
    +			this.panels.each(function() {
    +				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
    +			}).height( maxHeight );
    +		}
    +	},
    +
    +	_eventHandler: function( event ) {
    +		var options = this.options,
    +			active = this.active,
    +			anchor = $( event.currentTarget ),
    +			tab = anchor.closest( "li" ),
    +			clickedIsActive = tab[ 0 ] === active[ 0 ],
    +			collapsing = clickedIsActive && options.collapsible,
    +			toShow = collapsing ? $() : this._getPanelForTab( tab ),
    +			toHide = !active.length ? $() : this._getPanelForTab( active ),
    +			eventData = {
    +				oldTab: active,
    +				oldPanel: toHide,
    +				newTab: collapsing ? $() : tab,
    +				newPanel: toShow
    +			};
    +
    +		event.preventDefault();
    +
    +		if ( tab.hasClass( "ui-state-disabled" ) ||
    +				// tab is already loading
    +				tab.hasClass( "ui-tabs-loading" ) ||
    +				// can't switch durning an animation
    +				this.running ||
    +				// click on active header, but not collapsible
    +				( clickedIsActive && !options.collapsible ) ||
    +				// allow canceling activation
    +				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
    +			return;
    +		}
    +
    +		options.active = collapsing ? false : this.tabs.index( tab );
    +
    +		this.active = clickedIsActive ? $() : tab;
    +		if ( this.xhr ) {
    +			this.xhr.abort();
    +		}
    +
    +		if ( !toHide.length && !toShow.length ) {
    +			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
    +		}
    +
    +		if ( toShow.length ) {
    +			this.load( this.tabs.index( tab ), event );
    +		}
    +		this._toggle( event, eventData );
    +	},
    +
    +	// handles show/hide for selecting tabs
    +	_toggle: function( event, eventData ) {
    +		var that = this,
    +			toShow = eventData.newPanel,
    +			toHide = eventData.oldPanel;
    +
    +		this.running = true;
    +
    +		function complete() {
    +			that.running = false;
    +			that._trigger( "activate", event, eventData );
    +		}
    +
    +		function show() {
    +			eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
    +
    +			if ( toShow.length && that.options.show ) {
    +				that._show( toShow, that.options.show, complete );
    +			} else {
    +				toShow.show();
    +				complete();
    +			}
    +		}
    +
    +		// start out by hiding, then showing, then completing
    +		if ( toHide.length && this.options.hide ) {
    +			this._hide( toHide, this.options.hide, function() {
    +				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
    +				show();
    +			});
    +		} else {
    +			eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
    +			toHide.hide();
    +			show();
    +		}
    +
    +		toHide.attr({
    +			"aria-expanded": "false",
    +			"aria-hidden": "true"
    +		});
    +		eventData.oldTab.attr( "aria-selected", "false" );
    +		// If we're switching tabs, remove the old tab from the tab order.
    +		// If we're opening from collapsed state, remove the previous tab from the tab order.
    +		// If we're collapsing, then keep the collapsing tab in the tab order.
    +		if ( toShow.length && toHide.length ) {
    +			eventData.oldTab.attr( "tabIndex", -1 );
    +		} else if ( toShow.length ) {
    +			this.tabs.filter(function() {
    +				return $( this ).attr( "tabIndex" ) === 0;
    +			})
    +			.attr( "tabIndex", -1 );
    +		}
    +
    +		toShow.attr({
    +			"aria-expanded": "true",
    +			"aria-hidden": "false"
    +		});
    +		eventData.newTab.attr({
    +			"aria-selected": "true",
    +			tabIndex: 0
    +		});
    +	},
    +
    +	_activate: function( index ) {
    +		var anchor,
    +			active = this._findActive( index );
    +
    +		// trying to activate the already active panel
    +		if ( active[ 0 ] === this.active[ 0 ] ) {
    +			return;
    +		}
    +
    +		// trying to collapse, simulate a click on the current active header
    +		if ( !active.length ) {
    +			active = this.active;
    +		}
    +
    +		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
    +		this._eventHandler({
    +			target: anchor,
    +			currentTarget: anchor,
    +			preventDefault: $.noop
    +		});
    +	},
    +
    +	_findActive: function( index ) {
    +		return index === false ? $() : this.tabs.eq( index );
    +	},
    +
    +	_getIndex: function( index ) {
    +		// meta-function to give users option to provide a href string instead of a numerical index.
    +		if ( typeof index === "string" ) {
    +			index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
    +		}
    +
    +		return index;
    +	},
    +
    +	_destroy: function() {
    +		if ( this.xhr ) {
    +			this.xhr.abort();
    +		}
    +
    +		this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
    +
    +		this.tablist
    +			.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
    +			.removeAttr( "role" );
    +
    +		this.anchors
    +			.removeClass( "ui-tabs-anchor" )
    +			.removeAttr( "role" )
    +			.removeAttr( "tabIndex" )
    +			.removeData( "href.tabs" )
    +			.removeData( "load.tabs" )
    +			.removeUniqueId();
    +
    +		this.tabs.add( this.panels ).each(function() {
    +			if ( $.data( this, "ui-tabs-destroy" ) ) {
    +				$( this ).remove();
    +			} else {
    +				$( this )
    +					.removeClass( "ui-state-default ui-state-active ui-state-disabled " +
    +						"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
    +					.removeAttr( "tabIndex" )
    +					.removeAttr( "aria-live" )
    +					.removeAttr( "aria-busy" )
    +					.removeAttr( "aria-selected" )
    +					.removeAttr( "aria-labelledby" )
    +					.removeAttr( "aria-hidden" )
    +					.removeAttr( "aria-expanded" )
    +					.removeAttr( "role" );
    +			}
    +		});
    +
    +		this.tabs.each(function() {
    +			var li = $( this ),
    +				prev = li.data( "ui-tabs-aria-controls" );
    +			if ( prev ) {
    +				li.attr( "aria-controls", prev );
    +			} else {
    +				li.removeAttr( "aria-controls" );
    +			}
    +		});
    +
    +		this.panels.show();
    +
    +		if ( this.options.heightStyle !== "content" ) {
    +			this.panels.css( "height", "" );
    +		}
    +	},
    +
    +	enable: function( index ) {
    +		var disabled = this.options.disabled;
    +		if ( disabled === false ) {
    +			return;
    +		}
    +
    +		if ( index === undefined ) {
    +			disabled = false;
    +		} else {
    +			index = this._getIndex( index );
    +			if ( $.isArray( disabled ) ) {
    +				disabled = $.map( disabled, function( num ) {
    +					return num !== index ? num : null;
    +				});
    +			} else {
    +				disabled = $.map( this.tabs, function( li, num ) {
    +					return num !== index ? num : null;
    +				});
    +			}
    +		}
    +		this._setupDisabled( disabled );
    +	},
    +
    +	disable: function( index ) {
    +		var disabled = this.options.disabled;
    +		if ( disabled === true ) {
    +			return;
    +		}
    +
    +		if ( index === undefined ) {
    +			disabled = true;
    +		} else {
    +			index = this._getIndex( index );
    +			if ( $.inArray( index, disabled ) !== -1 ) {
    +				return;
    +			}
    +			if ( $.isArray( disabled ) ) {
    +				disabled = $.merge( [ index ], disabled ).sort();
    +			} else {
    +				disabled = [ index ];
    +			}
    +		}
    +		this._setupDisabled( disabled );
    +	},
    +
    +	load: function( index, event ) {
    +		index = this._getIndex( index );
    +		var that = this,
    +			tab = this.tabs.eq( index ),
    +			anchor = tab.find( ".ui-tabs-anchor" ),
    +			panel = this._getPanelForTab( tab ),
    +			eventData = {
    +				tab: tab,
    +				panel: panel
    +			};
    +
    +		// not remote
    +		if ( isLocal( anchor[ 0 ] ) ) {
    +			return;
    +		}
    +
    +		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
    +
    +		// support: jQuery <1.8
    +		// jQuery <1.8 returns false if the request is canceled in beforeSend,
    +		// but as of 1.8, $.ajax() always returns a jqXHR object.
    +		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
    +			tab.addClass( "ui-tabs-loading" );
    +			panel.attr( "aria-busy", "true" );
    +
    +			this.xhr
    +				.success(function( response ) {
    +					// support: jQuery <1.8
    +					// http://bugs.jquery.com/ticket/11778
    +					setTimeout(function() {
    +						panel.html( response );
    +						that._trigger( "load", event, eventData );
    +					}, 1 );
    +				})
    +				.complete(function( jqXHR, status ) {
    +					// support: jQuery <1.8
    +					// http://bugs.jquery.com/ticket/11778
    +					setTimeout(function() {
    +						if ( status === "abort" ) {
    +							that.panels.stop( false, true );
    +						}
    +
    +						tab.removeClass( "ui-tabs-loading" );
    +						panel.removeAttr( "aria-busy" );
    +
    +						if ( jqXHR === that.xhr ) {
    +							delete that.xhr;
    +						}
    +					}, 1 );
    +				});
    +		}
    +	},
    +
    +	// TODO: Remove this function in 1.10 when ajaxOptions is removed
    +	_ajaxSettings: function( anchor, event, eventData ) {
    +		var that = this;
    +		return {
    +			url: anchor.attr( "href" ),
    +			beforeSend: function( jqXHR, settings ) {
    +				return that._trigger( "beforeLoad", event,
    +					$.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) );
    +			}
    +		};
    +	},
    +
    +	_getPanelForTab: function( tab ) {
    +		var id = $( tab ).attr( "aria-controls" );
    +		return this.element.find( this._sanitizeSelector( "#" + id ) );
    +	}
    +});
    +
    +// DEPRECATED
    +if ( $.uiBackCompat !== false ) {
    +
    +	// helper method for a lot of the back compat extensions
    +	$.ui.tabs.prototype._ui = function( tab, panel ) {
    +		return {
    +			tab: tab,
    +			panel: panel,
    +			index: this.anchors.index( tab )
    +		};
    +	};
    +
    +	// url method
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		url: function( index, url ) {
    +			this.anchors.eq( index ).attr( "href", url );
    +		}
    +	});
    +
    +	// TODO: Remove _ajaxSettings() method when removing this extension
    +	// ajaxOptions and cache options
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			ajaxOptions: null,
    +			cache: false
    +		},
    +
    +		_create: function() {
    +			this._super();
    +
    +			var that = this;
    +
    +			this._on({ tabsbeforeload: function( event, ui ) {
    +				// tab is already cached
    +				if ( $.data( ui.tab[ 0 ], "cache.tabs" ) ) {
    +					event.preventDefault();
    +					return;
    +				}
    +
    +				ui.jqXHR.success(function() {
    +					if ( that.options.cache ) {
    +						$.data( ui.tab[ 0 ], "cache.tabs", true );
    +					}
    +				});
    +			}});
    +		},
    +
    +		_ajaxSettings: function( anchor, event, ui ) {
    +			var ajaxOptions = this.options.ajaxOptions;
    +			return $.extend( {}, ajaxOptions, {
    +				error: function( xhr, status ) {
    +					try {
    +						// Passing index avoid a race condition when this method is
    +						// called after the user has selected another tab.
    +						// Pass the anchor that initiated this request allows
    +						// loadError to manipulate the tab content panel via $(a.hash)
    +						ajaxOptions.error(
    +							xhr, status, ui.tab.closest( "li" ).index(), ui.tab[ 0 ] );
    +					}
    +					catch ( error ) {}
    +				}
    +			}, this._superApply( arguments ) );
    +		},
    +
    +		_setOption: function( key, value ) {
    +			// reset cache if switching from cached to not cached
    +			if ( key === "cache" && value === false ) {
    +				this.anchors.removeData( "cache.tabs" );
    +			}
    +			this._super( key, value );
    +		},
    +
    +		_destroy: function() {
    +			this.anchors.removeData( "cache.tabs" );
    +			this._super();
    +		},
    +
    +		url: function( index ){
    +			this.anchors.eq( index ).removeData( "cache.tabs" );
    +			this._superApply( arguments );
    +		}
    +	});
    +
    +	// abort method
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		abort: function() {
    +			if ( this.xhr ) {
    +				this.xhr.abort();
    +			}
    +		}
    +	});
    +
    +	// spinner
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			spinner: "<em>Loading&#8230;</em>"
    +		},
    +		_create: function() {
    +			this._super();
    +			this._on({
    +				tabsbeforeload: function( event, ui ) {
    +					// Don't react to nested tabs or tabs that don't use a spinner
    +					if ( event.target !== this.element[ 0 ] ||
    +							!this.options.spinner ) {
    +						return;
    +					}
    +
    +					var span = ui.tab.find( "span" ),
    +						html = span.html();
    +					span.html( this.options.spinner );
    +					ui.jqXHR.complete(function() {
    +						span.html( html );
    +					});
    +				}
    +			});
    +		}
    +	});
    +
    +	// enable/disable events
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			enable: null,
    +			disable: null
    +		},
    +
    +		enable: function( index ) {
    +			var options = this.options,
    +				trigger;
    +
    +			if ( index && options.disabled === true ||
    +					( $.isArray( options.disabled ) && $.inArray( index, options.disabled ) !== -1 ) ) {
    +				trigger = true;
    +			}
    +
    +			this._superApply( arguments );
    +
    +			if ( trigger ) {
    +				this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
    +			}
    +		},
    +
    +		disable: function( index ) {
    +			var options = this.options,
    +				trigger;
    +
    +			if ( index && options.disabled === false ||
    +					( $.isArray( options.disabled ) && $.inArray( index, options.disabled ) === -1 ) ) {
    +				trigger = true;
    +			}
    +
    +			this._superApply( arguments );
    +
    +			if ( trigger ) {
    +				this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
    +			}
    +		}
    +	});
    +
    +	// add/remove methods and events
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			add: null,
    +			remove: null,
    +			tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
    +		},
    +
    +		add: function( url, label, index ) {
    +			if ( index === undefined ) {
    +				index = this.anchors.length;
    +			}
    +
    +			var doInsertAfter, panel,
    +				options = this.options,
    +				li = $( options.tabTemplate
    +					.replace( /#\{href\}/g, url )
    +					.replace( /#\{label\}/g, label ) ),
    +				id = !url.indexOf( "#" ) ?
    +					url.replace( "#", "" ) :
    +					this._tabId( li );
    +
    +			li.addClass( "ui-state-default ui-corner-top" ).data( "ui-tabs-destroy", true );
    +			li.attr( "aria-controls", id );
    +
    +			doInsertAfter = index >= this.tabs.length;
    +
    +			// try to find an existing element before creating a new one
    +			panel = this.element.find( "#" + id );
    +			if ( !panel.length ) {
    +				panel = this._createPanel( id );
    +				if ( doInsertAfter ) {
    +					if ( index > 0 ) {
    +						panel.insertAfter( this.panels.eq( -1 ) );
    +					} else {
    +						panel.appendTo( this.element );
    +					}
    +				} else {
    +					panel.insertBefore( this.panels[ index ] );
    +				}
    +			}
    +			panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ).hide();
    +
    +			if ( doInsertAfter ) {
    +				li.appendTo( this.tablist );
    +			} else {
    +				li.insertBefore( this.tabs[ index ] );
    +			}
    +
    +			options.disabled = $.map( options.disabled, function( n ) {
    +				return n >= index ? ++n : n;
    +			});
    +
    +			this.refresh();
    +			if ( this.tabs.length === 1 && options.active === false ) {
    +				this.option( "active", 0 );
    +			}
    +
    +			this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
    +			return this;
    +		},
    +
    +		remove: function( index ) {
    +			index = this._getIndex( index );
    +			var options = this.options,
    +				tab = this.tabs.eq( index ).remove(),
    +				panel = this._getPanelForTab( tab ).remove();
    +
    +			// If selected tab was removed focus tab to the right or
    +			// in case the last tab was removed the tab to the left.
    +			// We check for more than 2 tabs, because if there are only 2,
    +			// then when we remove this tab, there will only be one tab left
    +			// so we don't need to detect which tab to activate.
    +			if ( tab.hasClass( "ui-tabs-active" ) && this.anchors.length > 2 ) {
    +				this._activate( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
    +			}
    +
    +			options.disabled = $.map(
    +				$.grep( options.disabled, function( n ) {
    +					return n !== index;
    +				}),
    +				function( n ) {
    +					return n >= index ? --n : n;
    +				});
    +
    +			this.refresh();
    +
    +			this._trigger( "remove", null, this._ui( tab.find( "a" )[ 0 ], panel[ 0 ] ) );
    +			return this;
    +		}
    +	});
    +
    +	// length method
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		length: function() {
    +			return this.anchors.length;
    +		}
    +	});
    +
    +	// panel ids (idPrefix option + title attribute)
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			idPrefix: "ui-tabs-"
    +		},
    +
    +		_tabId: function( tab ) {
    +			var a = tab.is( "li" ) ? tab.find( "a[href]" ) : tab;
    +			a = a[0];
    +			return $( a ).closest( "li" ).attr( "aria-controls" ) ||
    +				a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF\-]/g, "" ) ||
    +				this.options.idPrefix + getNextTabId();
    +		}
    +	});
    +
    +	// _createPanel method
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			panelTemplate: "<div></div>"
    +		},
    +
    +		_createPanel: function( id ) {
    +			return $( this.options.panelTemplate )
    +				.attr( "id", id )
    +				.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
    +				.data( "ui-tabs-destroy", true );
    +		}
    +	});
    +
    +	// selected option
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		_create: function() {
    +			var options = this.options;
    +			if ( options.active === null && options.selected !== undefined ) {
    +				options.active = options.selected === -1 ? false : options.selected;
    +			}
    +			this._super();
    +			options.selected = options.active;
    +			if ( options.selected === false ) {
    +				options.selected = -1;
    +			}
    +		},
    +
    +		_setOption: function( key, value ) {
    +			if ( key !== "selected" ) {
    +				return this._super( key, value );
    +			}
    +
    +			var options = this.options;
    +			this._super( "active", value === -1 ? false : value );
    +			options.selected = options.active;
    +			if ( options.selected === false ) {
    +				options.selected = -1;
    +			}
    +		},
    +
    +		_eventHandler: function() {
    +			this._superApply( arguments );
    +			this.options.selected = this.options.active;
    +			if ( this.options.selected === false ) {
    +				this.options.selected = -1;
    +			}
    +		}
    +	});
    +
    +	// show and select event
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			show: null,
    +			select: null
    +		},
    +		_create: function() {
    +			this._super();
    +			if ( this.options.active !== false ) {
    +				this._trigger( "show", null, this._ui(
    +					this.active.find( ".ui-tabs-anchor" )[ 0 ],
    +					this._getPanelForTab( this.active )[ 0 ] ) );
    +			}
    +		},
    +		_trigger: function( type, event, data ) {
    +			var tab, panel,
    +				ret = this._superApply( arguments );
    +
    +			if ( !ret ) {
    +				return false;
    +			}
    +
    +			if ( type === "beforeActivate" ) {
    +				tab = data.newTab.length ? data.newTab : data.oldTab;
    +				panel = data.newPanel.length ? data.newPanel : data.oldPanel;
    +				ret = this._super( "select", event, {
    +					tab: tab.find( ".ui-tabs-anchor" )[ 0],
    +					panel: panel[ 0 ],
    +					index: tab.closest( "li" ).index()
    +				});
    +			} else if ( type === "activate" && data.newTab.length ) {
    +				ret = this._super( "show", event, {
    +					tab: data.newTab.find( ".ui-tabs-anchor" )[ 0 ],
    +					panel: data.newPanel[ 0 ],
    +					index: data.newTab.closest( "li" ).index()
    +				});
    +			}
    +			return ret;
    +		}
    +	});
    +
    +	// select method
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		select: function( index ) {
    +			index = this._getIndex( index );
    +			if ( index === -1 ) {
    +				if ( this.options.collapsible && this.options.selected !== -1 ) {
    +					index = this.options.selected;
    +				} else {
    +					return;
    +				}
    +			}
    +			this.anchors.eq( index ).trigger( this.options.event + this.eventNamespace );
    +		}
    +	});
    +
    +	// cookie option
    +	(function() {
    +
    +	var listId = 0;
    +
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			cookie: null // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
    +		},
    +		_create: function() {
    +			var options = this.options,
    +				active;
    +			if ( options.active == null && options.cookie ) {
    +				active = parseInt( this._cookie(), 10 );
    +				if ( active === -1 ) {
    +					active = false;
    +				}
    +				options.active = active;
    +			}
    +			this._super();
    +		},
    +		_cookie: function( active ) {
    +			var cookie = [ this.cookie ||
    +				( this.cookie = this.options.cookie.name || "ui-tabs-" + (++listId) ) ];
    +			if ( arguments.length ) {
    +				cookie.push( active === false ? -1 : active );
    +				cookie.push( this.options.cookie );
    +			}
    +			return $.cookie.apply( null, cookie );
    +		},
    +		_refresh: function() {
    +			this._super();
    +			if ( this.options.cookie ) {
    +				this._cookie( this.options.active, this.options.cookie );
    +			}
    +		},
    +		_eventHandler: function() {
    +			this._superApply( arguments );
    +			if ( this.options.cookie ) {
    +				this._cookie( this.options.active, this.options.cookie );
    +			}
    +		},
    +		_destroy: function() {
    +			this._super();
    +			if ( this.options.cookie ) {
    +				this._cookie( null, this.options.cookie );
    +			}
    +		}
    +	});
    +
    +	})();
    +
    +	// load event
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		_trigger: function( type, event, data ) {
    +			var _data = $.extend( {}, data );
    +			if ( type === "load" ) {
    +				_data.panel = _data.panel[ 0 ];
    +				_data.tab = _data.tab.find( ".ui-tabs-anchor" )[ 0 ];
    +			}
    +			return this._super( type, event, _data );
    +		}
    +	});
    +
    +	// fx option
    +	// The new animation options (show, hide) conflict with the old show callback.
    +	// The old fx option wins over show/hide anyway (always favor back-compat).
    +	// If a user wants to use the new animation API, they must give up the old API.
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			fx: null // e.g. { height: "toggle", opacity: "toggle", duration: 200 }
    +		},
    +
    +		_getFx: function() {
    +			var hide, show,
    +				fx = this.options.fx;
    +
    +			if ( fx ) {
    +				if ( $.isArray( fx ) ) {
    +					hide = fx[ 0 ];
    +					show = fx[ 1 ];
    +				} else {
    +					hide = show = fx;
    +				}
    +			}
    +
    +			return fx ? { show: show, hide: hide } : null;
    +		},
    +
    +		_toggle: function( event, eventData ) {
    +			var that = this,
    +				toShow = eventData.newPanel,
    +				toHide = eventData.oldPanel,
    +				fx = this._getFx();
    +
    +			if ( !fx ) {
    +				return this._super( event, eventData );
    +			}
    +
    +			that.running = true;
    +
    +			function complete() {
    +				that.running = false;
    +				that._trigger( "activate", event, eventData );
    +			}
    +
    +			function show() {
    +				eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
    +
    +				if ( toShow.length && fx.show ) {
    +					toShow
    +						.animate( fx.show, fx.show.duration, function() {
    +							complete();
    +						});
    +				} else {
    +					toShow.show();
    +					complete();
    +				}
    +			}
    +
    +			// start out by hiding, then showing, then completing
    +			if ( toHide.length && fx.hide ) {
    +				toHide.animate( fx.hide, fx.hide.duration, function() {
    +					eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
    +					show();
    +				});
    +			} else {
    +				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
    +				toHide.hide();
    +				show();
    +			}
    +		}
    +	});
    +}
    +
    +})( jQuery );
    +
    +(function( $ ) {
    +
    +var increments = 0;
    +
    +function addDescribedBy( elem, id ) {
    +	var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
    +	describedby.push( id );
    +	elem
    +		.data( "ui-tooltip-id", id )
    +		.attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
    +}
    +
    +function removeDescribedBy( elem ) {
    +	var id = elem.data( "ui-tooltip-id" ),
    +		describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
    +		index = $.inArray( id, describedby );
    +	if ( index !== -1 ) {
    +		describedby.splice( index, 1 );
    +	}
    +
    +	elem.removeData( "ui-tooltip-id" );
    +	describedby = $.trim( describedby.join( " " ) );
    +	if ( describedby ) {
    +		elem.attr( "aria-describedby", describedby );
    +	} else {
    +		elem.removeAttr( "aria-describedby" );
    +	}
    +}
    +
    +$.widget( "ui.tooltip", {
    +	version: "1.9.2",
    +	options: {
    +		content: function() {
    +			return $( this ).attr( "title" );
    +		},
    +		hide: true,
    +		// Disabled elements have inconsistent behavior across browsers (#8661)
    +		items: "[title]:not([disabled])",
    +		position: {
    +			my: "left top+15",
    +			at: "left bottom",
    +			collision: "flipfit flip"
    +		},
    +		show: true,
    +		tooltipClass: null,
    +		track: false,
    +
    +		// callbacks
    +		close: null,
    +		open: null
    +	},
    +
    +	_create: function() {
    +		this._on({
    +			mouseover: "open",
    +			focusin: "open"
    +		});
    +
    +		// IDs of generated tooltips, needed for destroy
    +		this.tooltips = {};
    +		// IDs of parent tooltips where we removed the title attribute
    +		this.parents = {};
    +
    +		if ( this.options.disabled ) {
    +			this._disable();
    +		}
    +	},
    +
    +	_setOption: function( key, value ) {
    +		var that = this;
    +
    +		if ( key === "disabled" ) {
    +			this[ value ? "_disable" : "_enable" ]();
    +			this.options[ key ] = value;
    +			// disable element style changes
    +			return;
    +		}
    +
    +		this._super( key, value );
    +
    +		if ( key === "content" ) {
    +			$.each( this.tooltips, function( id, element ) {
    +				that._updateContent( element );
    +			});
    +		}
    +	},
    +
    +	_disable: function() {
    +		var that = this;
    +
    +		// close open tooltips
    +		$.each( this.tooltips, function( id, element ) {
    +			var event = $.Event( "blur" );
    +			event.target = event.currentTarget = element[0];
    +			that.close( event, true );
    +		});
    +
    +		// remove title attributes to prevent native tooltips
    +		this.element.find( this.options.items ).andSelf().each(function() {
    +			var element = $( this );
    +			if ( element.is( "[title]" ) ) {
    +				element
    +					.data( "ui-tooltip-title", element.attr( "title" ) )
    +					.attr( "title", "" );
    +			}
    +		});
    +	},
    +
    +	_enable: function() {
    +		// restore title attributes
    +		this.element.find( this.options.items ).andSelf().each(function() {
    +			var element = $( this );
    +			if ( element.data( "ui-tooltip-title" ) ) {
    +				element.attr( "title", element.data( "ui-tooltip-title" ) );
    +			}
    +		});
    +	},
    +
    +	open: function( event ) {
    +		var that = this,
    +			target = $( event ? event.target : this.element )
    +				// we need closest here due to mouseover bubbling,
    +				// but always pointing at the same event target
    +				.closest( this.options.items );
    +
    +		// No element to show a tooltip for or the tooltip is already open
    +		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
    +			return;
    +		}
    +
    +		if ( target.attr( "title" ) ) {
    +			target.data( "ui-tooltip-title", target.attr( "title" ) );
    +		}
    +
    +		target.data( "ui-tooltip-open", true );
    +
    +		// kill parent tooltips, custom or native, for hover
    +		if ( event && event.type === "mouseover" ) {
    +			target.parents().each(function() {
    +				var parent = $( this ),
    +					blurEvent;
    +				if ( parent.data( "ui-tooltip-open" ) ) {
    +					blurEvent = $.Event( "blur" );
    +					blurEvent.target = blurEvent.currentTarget = this;
    +					that.close( blurEvent, true );
    +				}
    +				if ( parent.attr( "title" ) ) {
    +					parent.uniqueId();
    +					that.parents[ this.id ] = {
    +						element: this,
    +						title: parent.attr( "title" )
    +					};
    +					parent.attr( "title", "" );
    +				}
    +			});
    +		}
    +
    +		this._updateContent( target, event );
    +	},
    +
    +	_updateContent: function( target, event ) {
    +		var content,
    +			contentOption = this.options.content,
    +			that = this,
    +			eventType = event ? event.type : null;
    +
    +		if ( typeof contentOption === "string" ) {
    +			return this._open( event, target, contentOption );
    +		}
    +
    +		content = contentOption.call( target[0], function( response ) {
    +			// ignore async response if tooltip was closed already
    +			if ( !target.data( "ui-tooltip-open" ) ) {
    +				return;
    +			}
    +			// IE may instantly serve a cached response for ajax requests
    +			// delay this call to _open so the other call to _open runs first
    +			that._delay(function() {
    +				// jQuery creates a special event for focusin when it doesn't
    +				// exist natively. To improve performance, the native event
    +				// object is reused and the type is changed. Therefore, we can't
    +				// rely on the type being correct after the event finished
    +				// bubbling, so we set it back to the previous value. (#8740)
    +				if ( event ) {
    +					event.type = eventType;
    +				}
    +				this._open( event, target, response );
    +			});
    +		});
    +		if ( content ) {
    +			this._open( event, target, content );
    +		}
    +	},
    +
    +	_open: function( event, target, content ) {
    +		var tooltip, events, delayedShow,
    +			positionOption = $.extend( {}, this.options.position );
    +
    +		if ( !content ) {
    +			return;
    +		}
    +
    +		// Content can be updated multiple times. If the tooltip already
    +		// exists, then just update the content and bail.
    +		tooltip = this._find( target );
    +		if ( tooltip.length ) {
    +			tooltip.find( ".ui-tooltip-content" ).html( content );
    +			return;
    +		}
    +
    +		// if we have a title, clear it to prevent the native tooltip
    +		// we have to check first to avoid defining a title if none exists
    +		// (we don't want to cause an element to start matching [title])
    +		//
    +		// We use removeAttr only for key events, to allow IE to export the correct
    +		// accessible attributes. For mouse events, set to empty string to avoid
    +		// native tooltip showing up (happens only when removing inside mouseover).
    +		if ( target.is( "[title]" ) ) {
    +			if ( event && event.type === "mouseover" ) {
    +				target.attr( "title", "" );
    +			} else {
    +				target.removeAttr( "title" );
    +			}
    +		}
    +
    +		tooltip = this._tooltip( target );
    +		addDescribedBy( target, tooltip.attr( "id" ) );
    +		tooltip.find( ".ui-tooltip-content" ).html( content );
    +
    +		function position( event ) {
    +			positionOption.of = event;
    +			if ( tooltip.is( ":hidden" ) ) {
    +				return;
    +			}
    +			tooltip.position( positionOption );
    +		}
    +		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
    +			this._on( this.document, {
    +				mousemove: position
    +			});
    +			// trigger once to override element-relative positioning
    +			position( event );
    +		} else {
    +			tooltip.position( $.extend({
    +				of: target
    +			}, this.options.position ) );
    +		}
    +
    +		tooltip.hide();
    +
    +		this._show( tooltip, this.options.show );
    +		// Handle tracking tooltips that are shown with a delay (#8644). As soon
    +		// as the tooltip is visible, position the tooltip using the most recent
    +		// event.
    +		if ( this.options.show && this.options.show.delay ) {
    +			delayedShow = setInterval(function() {
    +				if ( tooltip.is( ":visible" ) ) {
    +					position( positionOption.of );
    +					clearInterval( delayedShow );
    +				}
    +			}, $.fx.interval );
    +		}
    +
    +		this._trigger( "open", event, { tooltip: tooltip } );
    +
    +		events = {
    +			keyup: function( event ) {
    +				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
    +					var fakeEvent = $.Event(event);
    +					fakeEvent.currentTarget = target[0];
    +					this.close( fakeEvent, true );
    +				}
    +			},
    +			remove: function() {
    +				this._removeTooltip( tooltip );
    +			}
    +		};
    +		if ( !event || event.type === "mouseover" ) {
    +			events.mouseleave = "close";
    +		}
    +		if ( !event || event.type === "focusin" ) {
    +			events.focusout = "close";
    +		}
    +		this._on( true, target, events );
    +	},
    +
    +	close: function( event ) {
    +		var that = this,
    +			target = $( event ? event.currentTarget : this.element ),
    +			tooltip = this._find( target );
    +
    +		// disabling closes the tooltip, so we need to track when we're closing
    +		// to avoid an infinite loop in case the tooltip becomes disabled on close
    +		if ( this.closing ) {
    +			return;
    +		}
    +
    +		// only set title if we had one before (see comment in _open())
    +		if ( target.data( "ui-tooltip-title" ) ) {
    +			target.attr( "title", target.data( "ui-tooltip-title" ) );
    +		}
    +
    +		removeDescribedBy( target );
    +
    +		tooltip.stop( true );
    +		this._hide( tooltip, this.options.hide, function() {
    +			that._removeTooltip( $( this ) );
    +		});
    +
    +		target.removeData( "ui-tooltip-open" );
    +		this._off( target, "mouseleave focusout keyup" );
    +		// Remove 'remove' binding only on delegated targets
    +		if ( target[0] !== this.element[0] ) {
    +			this._off( target, "remove" );
    +		}
    +		this._off( this.document, "mousemove" );
    +
    +		if ( event && event.type === "mouseleave" ) {
    +			$.each( this.parents, function( id, parent ) {
    +				$( parent.element ).attr( "title", parent.title );
    +				delete that.parents[ id ];
    +			});
    +		}
    +
    +		this.closing = true;
    +		this._trigger( "close", event, { tooltip: tooltip } );
    +		this.closing = false;
    +	},
    +
    +	_tooltip: function( element ) {
    +		var id = "ui-tooltip-" + increments++,
    +			tooltip = $( "<div>" )
    +				.attr({
    +					id: id,
    +					role: "tooltip"
    +				})
    +				.addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
    +					( this.options.tooltipClass || "" ) );
    +		$( "<div>" )
    +			.addClass( "ui-tooltip-content" )
    +			.appendTo( tooltip );
    +		tooltip.appendTo( this.document[0].body );
    +		if ( $.fn.bgiframe ) {
    +			tooltip.bgiframe();
    +		}
    +		this.tooltips[ id ] = element;
    +		return tooltip;
    +	},
    +
    +	_find: function( target ) {
    +		var id = target.data( "ui-tooltip-id" );
    +		return id ? $( "#" + id ) : $();
    +	},
    +
    +	_removeTooltip: function( tooltip ) {
    +		tooltip.remove();
    +		delete this.tooltips[ tooltip.attr( "id" ) ];
    +	},
    +
    +	_destroy: function() {
    +		var that = this;
    +
    +		// close open tooltips
    +		$.each( this.tooltips, function( id, element ) {
    +			// Delegate to close method to handle common cleanup
    +			var event = $.Event( "blur" );
    +			event.target = event.currentTarget = element[0];
    +			that.close( event, true );
    +
    +			// Remove immediately; destroying an open tooltip doesn't use the
    +			// hide animation
    +			$( "#" + id ).remove();
    +
    +			// Restore the title
    +			if ( element.data( "ui-tooltip-title" ) ) {
    +				element.attr( "title", element.data( "ui-tooltip-title" ) );
    +				element.removeData( "ui-tooltip-title" );
    +			}
    +		});
    +	}
    +});
    +
    +}( jQuery ) );
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/css/colorpicker.css b/src/main/webapp/plug-in/jquery-plugs/colorpicker/css/colorpicker.css
    new file mode 100644
    index 00000000..45be88cb
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/colorpicker/css/colorpicker.css
    @@ -0,0 +1,161 @@
    +.colorpicker {
    +	width: 356px;
    +	height: 176px;
    +	overflow: hidden;
    +	position: absolute;
    +	background: url(../img/colorpicker_background.png);
    +	font-family: Arial, Helvetica, sans-serif;
    +	display: none;
    +}
    +.colorpicker_color {
    +	width: 150px;
    +	height: 150px;
    +	left: 14px;
    +	top: 13px;
    +	position: absolute;
    +	background: #f00;
    +	overflow: hidden;
    +	cursor: crosshair;
    +}
    +.colorpicker_color div {
    +	position: absolute;
    +	top: 0;
    +	left: 0;
    +	width: 150px;
    +	height: 150px;
    +	background: url(../img/colorpicker_overlay.png);
    +}
    +.colorpicker_color div div {
    +	position: absolute;
    +	top: 0;
    +	left: 0;
    +	width: 11px;
    +	height: 11px;
    +	overflow: hidden;
    +	background: url(../img/colorpicker_select.gif);
    +	margin: -5px 0 0 -5px;
    +}
    +.colorpicker_hue {
    +	position: absolute;
    +	top: 13px;
    +	left: 171px;
    +	width: 35px;
    +	height: 150px;
    +	cursor: n-resize;
    +}
    +.colorpicker_hue div {
    +	position: absolute;
    +	width: 35px;
    +	height: 9px;
    +	overflow: hidden;
    +	background: url(../img/colorpicker_indic.gif) left top;
    +	margin: -4px 0 0 0;
    +	left: 0px;
    +}
    +.colorpicker_new_color {
    +	position: absolute;
    +	width: 60px;
    +	height: 30px;
    +	left: 213px;
    +	top: 13px;
    +	background: #f00;
    +}
    +.colorpicker_current_color {
    +	position: absolute;
    +	width: 60px;
    +	height: 30px;
    +	left: 283px;
    +	top: 13px;
    +	background: #f00;
    +}
    +.colorpicker input {
    +	background-color: transparent;
    +	border: 1px solid transparent;
    +	position: absolute;
    +	font-size: 10px;
    +	font-family: Arial, Helvetica, sans-serif;
    +	color: #898989;
    +	top: 4px;
    +	right: 11px;
    +	text-align: right;
    +	margin: 0;
    +	padding: 0;
    +	height: 11px;
    +}
    +.colorpicker_hex {
    +	position: absolute;
    +	width: 72px;
    +	height: 22px;
    +	background: url(../img/colorpicker_hex.png) top;
    +	left: 212px;
    +	top: 142px;
    +}
    +.colorpicker_hex input {
    +	right: 6px;
    +}
    +.colorpicker_field {
    +	height: 22px;
    +	width: 62px;
    +	background-position: top;
    +	position: absolute;
    +}
    +.colorpicker_field span {
    +	position: absolute;
    +	width: 12px;
    +	height: 22px;
    +	overflow: hidden;
    +	top: 0;
    +	right: 0;
    +	cursor: n-resize;
    +}
    +.colorpicker_rgb_r {
    +	background-image: url(../img/colorpicker_rgb_r.png);
    +	top: 52px;
    +	left: 212px;
    +}
    +.colorpicker_rgb_g {
    +	background-image: url(../img/colorpicker_rgb_g.png);
    +	top: 82px;
    +	left: 212px;
    +}
    +.colorpicker_rgb_b {
    +	background-image: url(../img/colorpicker_rgb_b.png);
    +	top: 112px;
    +	left: 212px;
    +}
    +.colorpicker_hsb_h {
    +	background-image: url(../img/colorpicker_hsb_h.png);
    +	top: 52px;
    +	left: 282px;
    +}
    +.colorpicker_hsb_s {
    +	background-image: url(../img/colorpicker_hsb_s.png);
    +	top: 82px;
    +	left: 282px;
    +}
    +.colorpicker_hsb_b {
    +	background-image: url(../img/colorpicker_hsb_b.png);
    +	top: 112px;
    +	left: 282px;
    +}
    +.colorpicker_submit {
    +	position: absolute;
    +	width: 22px;
    +	height: 22px;
    +	background: url(../img/colorpicker_submit.png) top;
    +	left: 322px;
    +	top: 142px;
    +	overflow: hidden;
    +}
    +.colorpicker_focus {
    +	background-position: center;
    +}
    +.colorpicker_hex.colorpicker_focus {
    +	background-position: bottom;
    +}
    +.colorpicker_submit.colorpicker_focus {
    +	background-position: bottom;
    +}
    +.colorpicker_slider {
    +	background-position: bottom;
    +}
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_background.png b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_background.png
    new file mode 100644
    index 00000000..8401572f
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_background.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_hex.png b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_hex.png
    new file mode 100644
    index 00000000..4e532d7c
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_hex.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_hsb_b.png b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_hsb_b.png
    new file mode 100644
    index 00000000..dfac595d
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_hsb_b.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_hsb_h.png b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_hsb_h.png
    new file mode 100644
    index 00000000..3977ed9f
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_hsb_h.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_hsb_s.png b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_hsb_s.png
    new file mode 100644
    index 00000000..a2a69973
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_hsb_s.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_indic.gif b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_indic.gif
    new file mode 100644
    index 00000000..f9fa95e2
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_indic.gif differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_overlay.png b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_overlay.png
    new file mode 100644
    index 00000000..561cdd9c
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_overlay.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_rgb_b.png b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_rgb_b.png
    new file mode 100644
    index 00000000..dfac595d
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_rgb_b.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_rgb_g.png b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_rgb_g.png
    new file mode 100644
    index 00000000..72b32760
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_rgb_g.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_rgb_r.png b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_rgb_r.png
    new file mode 100644
    index 00000000..4855fe03
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_rgb_r.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_submit.png b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_submit.png
    new file mode 100644
    index 00000000..7f4c0825
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/colorpicker_submit.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/untitled.png b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/untitled.png
    new file mode 100644
    index 00000000..b1346a45
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorpicker/img/untitled.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/js/colorpicker.js b/src/main/webapp/plug-in/jquery-plugs/colorpicker/js/colorpicker.js
    new file mode 100644
    index 00000000..45f56ced
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/colorpicker/js/colorpicker.js
    @@ -0,0 +1,484 @@
    +/**
    + *
    + * Color picker
    + * Author: Stefan Petre www.eyecon.ro
    + * 
    + * Dual licensed under the MIT and GPL licenses
    + * 
    + */
    +(function ($) {
    +	var ColorPicker = function () {
    +		var
    +			ids = {},
    +			inAction,
    +			charMin = 65,
    +			visible,
    +			tpl = '<div class="colorpicker"><div class="colorpicker_color"><div><div></div></div></div><div class="colorpicker_hue"><div></div></div><div class="colorpicker_new_color"></div><div class="colorpicker_current_color"></div><div class="colorpicker_hex"><input type="text" maxlength="6" size="6" /></div><div class="colorpicker_rgb_r colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_g colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_h colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_s colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_submit"></div></div>',
    +			defaults = {
    +				eventName: 'click',
    +				onShow: function () {},
    +				onBeforeShow: function(){},
    +				onHide: function () {},
    +				onChange: function () {},
    +				onSubmit: function () {},
    +				color: 'ff0000',
    +				livePreview: true,
    +				flat: false
    +			},
    +			fillRGBFields = function  (hsb, cal) {
    +				var rgb = HSBToRGB(hsb);
    +				$(cal).data('colorpicker').fields
    +					.eq(1).val(rgb.r).end()
    +					.eq(2).val(rgb.g).end()
    +					.eq(3).val(rgb.b).end();
    +			},
    +			fillHSBFields = function  (hsb, cal) {
    +				$(cal).data('colorpicker').fields
    +					.eq(4).val(hsb.h).end()
    +					.eq(5).val(hsb.s).end()
    +					.eq(6).val(hsb.b).end();
    +			},
    +			fillHexFields = function (hsb, cal) {
    +				$(cal).data('colorpicker').fields
    +					.eq(0).val(HSBToHex(hsb)).end();
    +			},
    +			setSelector = function (hsb, cal) {
    +				$(cal).data('colorpicker').selector.css('backgroundColor', '#' + HSBToHex({h: hsb.h, s: 100, b: 100}));
    +				$(cal).data('colorpicker').selectorIndic.css({
    +					left: parseInt(150 * hsb.s/100, 10),
    +					top: parseInt(150 * (100-hsb.b)/100, 10)
    +				});
    +			},
    +			setHue = function (hsb, cal) {
    +				$(cal).data('colorpicker').hue.css('top', parseInt(150 - 150 * hsb.h/360, 10));
    +			},
    +			setCurrentColor = function (hsb, cal) {
    +				$(cal).data('colorpicker').currentColor.css('backgroundColor', '#' + HSBToHex(hsb));
    +			},
    +			setNewColor = function (hsb, cal) {
    +				$(cal).data('colorpicker').newColor.css('backgroundColor', '#' + HSBToHex(hsb));
    +			},
    +			keyDown = function (ev) {
    +				var pressedKey = ev.charCode || ev.keyCode || -1;
    +				if ((pressedKey > charMin && pressedKey <= 90) || pressedKey == 32) {
    +					return false;
    +				}
    +				var cal = $(this).parent().parent();
    +				if (cal.data('colorpicker').livePreview === true) {
    +					change.apply(this);
    +				}
    +			},
    +			change = function (ev) {
    +				var cal = $(this).parent().parent(), col;
    +				if (this.parentNode.className.indexOf('_hex') > 0) {
    +					cal.data('colorpicker').color = col = HexToHSB(fixHex(this.value));
    +				} else if (this.parentNode.className.indexOf('_hsb') > 0) {
    +					cal.data('colorpicker').color = col = fixHSB({
    +						h: parseInt(cal.data('colorpicker').fields.eq(4).val(), 10),
    +						s: parseInt(cal.data('colorpicker').fields.eq(5).val(), 10),
    +						b: parseInt(cal.data('colorpicker').fields.eq(6).val(), 10)
    +					});
    +				} else {
    +					cal.data('colorpicker').color = col = RGBToHSB(fixRGB({
    +						r: parseInt(cal.data('colorpicker').fields.eq(1).val(), 10),
    +						g: parseInt(cal.data('colorpicker').fields.eq(2).val(), 10),
    +						b: parseInt(cal.data('colorpicker').fields.eq(3).val(), 10)
    +					}));
    +				}
    +				if (ev) {
    +					fillRGBFields(col, cal.get(0));
    +					fillHexFields(col, cal.get(0));
    +					fillHSBFields(col, cal.get(0));
    +				}
    +				setSelector(col, cal.get(0));
    +				setHue(col, cal.get(0));
    +				setNewColor(col, cal.get(0));
    +				cal.data('colorpicker').onChange.apply(cal, [col, HSBToHex(col), HSBToRGB(col)]);
    +			},
    +			blur = function (ev) {
    +				var cal = $(this).parent().parent();
    +				cal.data('colorpicker').fields.parent().removeClass('colorpicker_focus');
    +			},
    +			focus = function () {
    +				charMin = this.parentNode.className.indexOf('_hex') > 0 ? 70 : 65;
    +				$(this).parent().parent().data('colorpicker').fields.parent().removeClass('colorpicker_focus');
    +				$(this).parent().addClass('colorpicker_focus');
    +			},
    +			downIncrement = function (ev) {
    +				var field = $(this).parent().find('input').focus();
    +				var current = {
    +					el: $(this).parent().addClass('colorpicker_slider'),
    +					max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255),
    +					y: ev.pageY,
    +					field: field,
    +					val: parseInt(field.val(), 10),
    +					preview: $(this).parent().parent().data('colorpicker').livePreview					
    +				};
    +				$(document).bind('mouseup', current, upIncrement);
    +				$(document).bind('mousemove', current, moveIncrement);
    +			},
    +			moveIncrement = function (ev) {
    +				ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val + ev.pageY - ev.data.y, 10))));
    +				if (ev.data.preview) {
    +					change.apply(ev.data.field.get(0), [true]);
    +				}
    +				return false;
    +			},
    +			upIncrement = function (ev) {
    +				change.apply(ev.data.field.get(0), [true]);
    +				ev.data.el.removeClass('colorpicker_slider').find('input').focus();
    +				$(document).unbind('mouseup', upIncrement);
    +				$(document).unbind('mousemove', moveIncrement);
    +				return false;
    +			},
    +			downHue = function (ev) {
    +				var current = {
    +					cal: $(this).parent(),
    +					y: $(this).offset().top
    +				};
    +				current.preview = current.cal.data('colorpicker').livePreview;
    +				$(document).bind('mouseup', current, upHue);
    +				$(document).bind('mousemove', current, moveHue);
    +			},
    +			moveHue = function (ev) {
    +				change.apply(
    +					ev.data.cal.data('colorpicker')
    +						.fields
    +						.eq(4)
    +						.val(parseInt(360*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.y))))/150, 10))
    +						.get(0),
    +					[ev.data.preview]
    +				);
    +				return false;
    +			},
    +			upHue = function (ev) {
    +				fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
    +				fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
    +				$(document).unbind('mouseup', upHue);
    +				$(document).unbind('mousemove', moveHue);
    +				return false;
    +			},
    +			downSelector = function (ev) {
    +				var current = {
    +					cal: $(this).parent(),
    +					pos: $(this).offset()
    +				};
    +				current.preview = current.cal.data('colorpicker').livePreview;
    +				$(document).bind('mouseup', current, upSelector);
    +				$(document).bind('mousemove', current, moveSelector);
    +			},
    +			moveSelector = function (ev) {
    +				change.apply(
    +					ev.data.cal.data('colorpicker')
    +						.fields
    +						.eq(6)
    +						.val(parseInt(100*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.pos.top))))/150, 10))
    +						.end()
    +						.eq(5)
    +						.val(parseInt(100*(Math.max(0,Math.min(150,(ev.pageX - ev.data.pos.left))))/150, 10))
    +						.get(0),
    +					[ev.data.preview]
    +				);
    +				return false;
    +			},
    +			upSelector = function (ev) {
    +				fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
    +				fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
    +				$(document).unbind('mouseup', upSelector);
    +				$(document).unbind('mousemove', moveSelector);
    +				return false;
    +			},
    +			enterSubmit = function (ev) {
    +				$(this).addClass('colorpicker_focus');
    +			},
    +			leaveSubmit = function (ev) {
    +				$(this).removeClass('colorpicker_focus');
    +			},
    +			clickSubmit = function (ev) {
    +				var cal = $(this).parent();
    +				var col = cal.data('colorpicker').color;
    +				cal.data('colorpicker').origColor = col;
    +				setCurrentColor(col, cal.get(0));
    +				cal.data('colorpicker').onSubmit(col, HSBToHex(col), HSBToRGB(col), cal.data('colorpicker').el);
    +			},
    +			show = function (ev) {
    +				var cal = $('#' + $(this).data('colorpickerId'));
    +				cal.data('colorpicker').onBeforeShow.apply(this, [cal.get(0)]);
    +				var pos = $(this).offset();
    +				var viewPort = getViewport();
    +				var top = pos.top + this.offsetHeight;
    +				var left = pos.left;
    +				if (top + 176 > viewPort.t + viewPort.h) {
    +					top -= this.offsetHeight + 176;
    +				}
    +				if (left + 356 > viewPort.l + viewPort.w) {
    +					left -= 356;
    +				}
    +				cal.css({left: left + 'px', top: top + 'px'});
    +				if (cal.data('colorpicker').onShow.apply(this, [cal.get(0)]) != false) {
    +					cal.show();
    +				}
    +				$(document).bind('mousedown', {cal: cal}, hide);
    +				return false;
    +			},
    +			hide = function (ev) {
    +				if (!isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {
    +					if (ev.data.cal.data('colorpicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
    +						ev.data.cal.hide();
    +					}
    +					$(document).unbind('mousedown', hide);
    +				}
    +			},
    +			isChildOf = function(parentEl, el, container) {
    +				if (parentEl == el) {
    +					return true;
    +				}
    +				if (parentEl.contains) {
    +					return parentEl.contains(el);
    +				}
    +				if ( parentEl.compareDocumentPosition ) {
    +					return !!(parentEl.compareDocumentPosition(el) & 16);
    +				}
    +				var prEl = el.parentNode;
    +				while(prEl && prEl != container) {
    +					if (prEl == parentEl)
    +						return true;
    +					prEl = prEl.parentNode;
    +				}
    +				return false;
    +			},
    +			getViewport = function () {
    +				var m = document.compatMode == 'CSS1Compat';
    +				return {
    +					l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
    +					t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),
    +					w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),
    +					h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)
    +				};
    +			},
    +			fixHSB = function (hsb) {
    +				return {
    +					h: Math.min(360, Math.max(0, hsb.h)),
    +					s: Math.min(100, Math.max(0, hsb.s)),
    +					b: Math.min(100, Math.max(0, hsb.b))
    +				};
    +			}, 
    +			fixRGB = function (rgb) {
    +				return {
    +					r: Math.min(255, Math.max(0, rgb.r)),
    +					g: Math.min(255, Math.max(0, rgb.g)),
    +					b: Math.min(255, Math.max(0, rgb.b))
    +				};
    +			},
    +			fixHex = function (hex) {
    +				var len = 6 - hex.length;
    +				if (len > 0) {
    +					var o = [];
    +					for (var i=0; i<len; i++) {
    +						o.push('0');
    +					}
    +					o.push(hex);
    +					hex = o.join('');
    +				}
    +				return hex;
    +			}, 
    +			HexToRGB = function (hex) {
    +				var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
    +				return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)};
    +			},
    +			HexToHSB = function (hex) {
    +				return RGBToHSB(HexToRGB(hex));
    +			},
    +			RGBToHSB = function (rgb) {
    +				var hsb = {
    +					h: 0,
    +					s: 0,
    +					b: 0
    +				};
    +				var min = Math.min(rgb.r, rgb.g, rgb.b);
    +				var max = Math.max(rgb.r, rgb.g, rgb.b);
    +				var delta = max - min;
    +				hsb.b = max;
    +				if (max != 0) {
    +					
    +				}
    +				hsb.s = max != 0 ? 255 * delta / max : 0;
    +				if (hsb.s != 0) {
    +					if (rgb.r == max) {
    +						hsb.h = (rgb.g - rgb.b) / delta;
    +					} else if (rgb.g == max) {
    +						hsb.h = 2 + (rgb.b - rgb.r) / delta;
    +					} else {
    +						hsb.h = 4 + (rgb.r - rgb.g) / delta;
    +					}
    +				} else {
    +					hsb.h = -1;
    +				}
    +				hsb.h *= 60;
    +				if (hsb.h < 0) {
    +					hsb.h += 360;
    +				}
    +				hsb.s *= 100/255;
    +				hsb.b *= 100/255;
    +				return hsb;
    +			},
    +			HSBToRGB = function (hsb) {
    +				var rgb = {};
    +				var h = Math.round(hsb.h);
    +				var s = Math.round(hsb.s*255/100);
    +				var v = Math.round(hsb.b*255/100);
    +				if(s == 0) {
    +					rgb.r = rgb.g = rgb.b = v;
    +				} else {
    +					var t1 = v;
    +					var t2 = (255-s)*v/255;
    +					var t3 = (t1-t2)*(h%60)/60;
    +					if(h==360) h = 0;
    +					if(h<60) {rgb.r=t1;	rgb.b=t2; rgb.g=t2+t3}
    +					else if(h<120) {rgb.g=t1; rgb.b=t2;	rgb.r=t1-t3}
    +					else if(h<180) {rgb.g=t1; rgb.r=t2;	rgb.b=t2+t3}
    +					else if(h<240) {rgb.b=t1; rgb.r=t2;	rgb.g=t1-t3}
    +					else if(h<300) {rgb.b=t1; rgb.g=t2;	rgb.r=t2+t3}
    +					else if(h<360) {rgb.r=t1; rgb.g=t2;	rgb.b=t1-t3}
    +					else {rgb.r=0; rgb.g=0;	rgb.b=0}
    +				}
    +				return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)};
    +			},
    +			RGBToHex = function (rgb) {
    +				var hex = [
    +					rgb.r.toString(16),
    +					rgb.g.toString(16),
    +					rgb.b.toString(16)
    +				];
    +				$.each(hex, function (nr, val) {
    +					if (val.length == 1) {
    +						hex[nr] = '0' + val;
    +					}
    +				});
    +				return hex.join('');
    +			},
    +			HSBToHex = function (hsb) {
    +				return RGBToHex(HSBToRGB(hsb));
    +			},
    +			restoreOriginal = function () {
    +				var cal = $(this).parent();
    +				var col = cal.data('colorpicker').origColor;
    +				cal.data('colorpicker').color = col;
    +				fillRGBFields(col, cal.get(0));
    +				fillHexFields(col, cal.get(0));
    +				fillHSBFields(col, cal.get(0));
    +				setSelector(col, cal.get(0));
    +				setHue(col, cal.get(0));
    +				setNewColor(col, cal.get(0));
    +			};
    +		return {
    +			init: function (opt) {
    +				opt = $.extend({}, defaults, opt||{});
    +				if (typeof opt.color == 'string') {
    +					opt.color = HexToHSB(opt.color);
    +				} else if (opt.color.r != undefined && opt.color.g != undefined && opt.color.b != undefined) {
    +					opt.color = RGBToHSB(opt.color);
    +				} else if (opt.color.h != undefined && opt.color.s != undefined && opt.color.b != undefined) {
    +					opt.color = fixHSB(opt.color);
    +				} else {
    +					return this;
    +				}
    +				return this.each(function () {
    +					if (!$(this).data('colorpickerId')) {
    +						var options = $.extend({}, opt);
    +						options.origColor = opt.color;
    +						var id = 'collorpicker_' + parseInt(Math.random() * 1000);
    +						$(this).data('colorpickerId', id);
    +						var cal = $(tpl).attr('id', id);
    +						if (options.flat) {
    +							cal.appendTo(this).show();
    +						} else {
    +							cal.appendTo(document.body);
    +						}
    +						options.fields = cal
    +											.find('input')
    +												.bind('keyup', keyDown)
    +												.bind('change', change)
    +												.bind('blur', blur)
    +												.bind('focus', focus);
    +						cal
    +							.find('span').bind('mousedown', downIncrement).end()
    +							.find('>div.colorpicker_current_color').bind('click', restoreOriginal);
    +						options.selector = cal.find('div.colorpicker_color').bind('mousedown', downSelector);
    +						options.selectorIndic = options.selector.find('div div');
    +						options.el = this;
    +						options.hue = cal.find('div.colorpicker_hue div');
    +						cal.find('div.colorpicker_hue').bind('mousedown', downHue);
    +						options.newColor = cal.find('div.colorpicker_new_color');
    +						options.currentColor = cal.find('div.colorpicker_current_color');
    +						cal.data('colorpicker', options);
    +						cal.find('div.colorpicker_submit')
    +							.bind('mouseenter', enterSubmit)
    +							.bind('mouseleave', leaveSubmit)
    +							.bind('click', clickSubmit);
    +						fillRGBFields(options.color, cal.get(0));
    +						fillHSBFields(options.color, cal.get(0));
    +						fillHexFields(options.color, cal.get(0));
    +						setHue(options.color, cal.get(0));
    +						setSelector(options.color, cal.get(0));
    +						setCurrentColor(options.color, cal.get(0));
    +						setNewColor(options.color, cal.get(0));
    +						if (options.flat) {
    +							cal.css({
    +								position: 'relative',
    +								display: 'block'
    +							});
    +						} else {
    +							$(this).bind(options.eventName, show);
    +						}
    +					}
    +				});
    +			},
    +			showPicker: function() {
    +				return this.each( function () {
    +					if ($(this).data('colorpickerId')) {
    +						show.apply(this);
    +					}
    +				});
    +			},
    +			hidePicker: function() {
    +				return this.each( function () {
    +					if ($(this).data('colorpickerId')) {
    +						$('#' + $(this).data('colorpickerId')).hide();
    +					}
    +				});
    +			},
    +			setColor: function(col) {
    +				if (typeof col == 'string') {
    +					col = HexToHSB(col);
    +				} else if (col.r != undefined && col.g != undefined && col.b != undefined) {
    +					col = RGBToHSB(col);
    +				} else if (col.h != undefined && col.s != undefined && col.b != undefined) {
    +					col = fixHSB(col);
    +				} else {
    +					return this;
    +				}
    +				return this.each(function(){
    +					if ($(this).data('colorpickerId')) {
    +						var cal = $('#' + $(this).data('colorpickerId'));
    +						cal.data('colorpicker').color = col;
    +						cal.data('colorpicker').origColor = col;
    +						fillRGBFields(col, cal.get(0));
    +						fillHSBFields(col, cal.get(0));
    +						fillHexFields(col, cal.get(0));
    +						setHue(col, cal.get(0));
    +						setSelector(col, cal.get(0));
    +						setCurrentColor(col, cal.get(0));
    +						setNewColor(col, cal.get(0));
    +					}
    +				});
    +			}
    +		};
    +	}();
    +	$.fn.extend({
    +		ColorPicker: ColorPicker.init,
    +		ColorPickerHide: ColorPicker.hidePicker,
    +		ColorPickerShow: ColorPicker.showPicker,
    +		ColorPickerSetColor: ColorPicker.setColor
    +	});
    +})(jQuery)
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorpicker/js/styler.js b/src/main/webapp/plug-in/jquery-plugs/colorpicker/js/styler.js
    new file mode 100644
    index 00000000..4e6ef933
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/colorpicker/js/styler.js
    @@ -0,0 +1,42 @@
    +$(document).ready(function () {
    +
    +    $('.styler').click(function() {
    +    $(".styler").toggleClass("styler-active");
    +    $('.styler-show').slideToggle('slow');     
    +  }); /* to show the styler */
    +  
    +  $('#colorSelector-top-bar').tipTip({content: "鏀瑰彉鑿滃崟棰滆壊", defaultPosition: "right"});
    +  $('#colorSelector-box-head').tipTip({content: "鏀瑰彉瀹瑰櫒棰滆壊", defaultPosition: "right"});
    +  /* for the tooltips describing what each colorpicker changes */
    +
    +  $('#colorSelector-top-bar').ColorPicker({
    +          color: '#292929',
    +          onShow: function (colpkr) {
    +            $(colpkr).fadeIn(500);
    +            return false;
    +          },
    +          onHide: function (colpkr) {
    +            $(colpkr).fadeOut(500);
    +            return false;
    +          },
    +          onChange: function (hsb, hex, rgb) {
    +            $('.top-bar, #colorSelector-top-bar').css('backgroundColor', '#' + hex);
    +          }
    +  });
    +  $('#colorSelector-box-head').ColorPicker({
    +          color: '#292929',
    +          onShow: function (colpkr) {
    +            $(colpkr).fadeIn(500);
    +            return false;
    +          },
    +          onHide: function (colpkr) {
    +            $(colpkr).fadeOut(500);
    +            return false;
    +          },
    +          onChange: function (hsb, hex, rgb) {
    +            $('.box-head, #colorSelector-box-head').css('backgroundColor', '#' + hex);
    +          }
    +  });
    +
    +  
    +});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorselect/css/colorselect.css b/src/main/webapp/plug-in/jquery-plugs/colorselect/css/colorselect.css
    new file mode 100644
    index 00000000..ddf4277f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/colorselect/css/colorselect.css
    @@ -0,0 +1,61 @@
    +/*  STYLER */
    +.styler {
    +	width: 40px;
    +	height: 42px;
    +	background: url(../img/styler-icon.png) no-repeat #444;
    +	background-position: 3px 5px;
    +	position: absolute;
    +	top: 0px;
    +	left: 240px;
    +	border-radius: 0 0 20px 20px;
    +	border-bottom: 1px solid #000;
    +}
    +.styler-active {
    +    border-radius: 0 0 0 20px;
    +}
    +.styler-show {
    +	width: 200px;
    +	height: 42px;
    +	background: #444;
    +	position: relative;
    +	top: 0;
    +	left: 40px;
    +	border-radius: 0 0 20px 0;
    +    display: none;
    +    border-bottom: 1px solid #000;
    +}
    +.styler-show li {
    +    padding: 12px 0 0 12px;
    +    display: inline-block;
    +}
    +.styler-show li div {
    +	border-radius: 2px;
    +	box-shadow: inset 0px 0px 1px 0px #000;
    +}
    +#colorSelector-top-bar {
    +	width: 20px;
    +	height: 20px;
    +	background: #292929;
    +}
    +#colorSelector-box-head {
    +	width: 20px;
    +	height: 20px;
    +	background: #292929;
    +}
    +/* For screens smaller than 1280px */
    +
    +@media only screen and (min-width: 600px) and (max-width: 1249px){
    +
    +    .styler {
    +    	position: absolute;
    +    	left: -100px !important;
    +    }
    +	.header {
    +		position: absolute;
    +		top: 0;
    +		right: 20px;
    +	}
    +	.content {
    +		margin-top: 45px;
    +	}
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-plugs/colorselect/img/styler-icon.png b/src/main/webapp/plug-in/jquery-plugs/colorselect/img/styler-icon.png
    new file mode 100644
    index 00000000..079cff59
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/colorselect/img/styler-icon.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/fileupload/bootstrap/css/bootstrap.css b/src/main/webapp/plug-in/jquery-plugs/fileupload/bootstrap/css/bootstrap.css
    new file mode 100644
    index 00000000..7325fff8
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/fileupload/bootstrap/css/bootstrap.css
    @@ -0,0 +1,6158 @@
    +/*!
    + * Bootstrap v2.3.1
    + *
    + * Copyright 2012 Twitter, Inc
    + * Licensed under the Apache License v2.0
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Designed and built with all the love in the world @twitter by @mdo and @fat.
    + */
    +
    +.clearfix {
    +  *zoom: 1;
    +}
    +
    +.clearfix:before,
    +.clearfix:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.clearfix:after {
    +  clear: both;
    +}
    +
    +.hide-text {
    +  font: 0/0 a;
    +  color: transparent;
    +  text-shadow: none;
    +  background-color: transparent;
    +  border: 0;
    +}
    +
    +.input-block-level {
    +  display: block;
    +  width: 100%;
    +  min-height: 30px;
    +  -webkit-box-sizing: border-box;
    +     -moz-box-sizing: border-box;
    +          box-sizing: border-box;
    +}
    +
    +article,
    +aside,
    +details,
    +figcaption,
    +figure,
    +footer,
    +header,
    +hgroup,
    +nav,
    +section {
    +  display: block;
    +}
    +
    +audio,
    +canvas,
    +video {
    +  display: inline-block;
    +  *display: inline;
    +  *zoom: 1;
    +}
    +
    +audio:not([controls]) {
    +  display: none;
    +}
    +
    +html {
    +  font-size: 100%;
    +  -webkit-text-size-adjust: 100%;
    +      -ms-text-size-adjust: 100%;
    +}
    +
    +a:focus {
    +  outline: thin dotted #333;
    +  outline: 5px auto -webkit-focus-ring-color;
    +  outline-offset: -2px;
    +}
    +
    +a:hover,
    +a:active {
    +  outline: 0;
    +}
    +
    +sub,
    +sup {
    +  position: relative;
    +  font-size: 75%;
    +  line-height: 0;
    +  vertical-align: baseline;
    +}
    +
    +sup {
    +  top: -0.5em;
    +}
    +
    +sub {
    +  bottom: -0.25em;
    +}
    +
    +img {
    +  width: auto\9;
    +  height: auto;
    +  max-width: 100%;
    +  vertical-align: middle;
    +  border: 0;
    +  -ms-interpolation-mode: bicubic;
    +}
    +
    +#map_canvas img,
    +.google-maps img {
    +  max-width: none;
    +}
    +
    +button,
    +input,
    +select,
    +textarea {
    +  margin: 0;
    +  font-size: 100%;
    +  vertical-align: middle;
    +}
    +
    +button,
    +input {
    +  *overflow: visible;
    +  line-height: normal;
    +}
    +
    +button::-moz-focus-inner,
    +input::-moz-focus-inner {
    +  padding: 0;
    +  border: 0;
    +}
    +
    +button,
    +html input[type="button"],
    +input[type="reset"],
    +input[type="submit"] {
    +  cursor: pointer;
    +  -webkit-appearance: button;
    +}
    +
    +label,
    +select,
    +button,
    +input[type="button"],
    +input[type="reset"],
    +input[type="submit"],
    +input[type="radio"],
    +input[type="checkbox"] {
    +  cursor: pointer;
    +}
    +
    +input[type="search"] {
    +  -webkit-box-sizing: content-box;
    +     -moz-box-sizing: content-box;
    +          box-sizing: content-box;
    +  -webkit-appearance: textfield;
    +}
    +
    +input[type="search"]::-webkit-search-decoration,
    +input[type="search"]::-webkit-search-cancel-button {
    +  -webkit-appearance: none;
    +}
    +
    +textarea {
    +  overflow: auto;
    +  vertical-align: top;
    +}
    +
    +@media print {
    +  * {
    +    color: #000 !important;
    +    text-shadow: none !important;
    +    background: transparent !important;
    +    box-shadow: none !important;
    +  }
    +  a,
    +  a:visited {
    +    text-decoration: underline;
    +  }
    +  a[href]:after {
    +    content: " (" attr(href) ")";
    +  }
    +  abbr[title]:after {
    +    content: " (" attr(title) ")";
    +  }
    +  .ir a:after,
    +  a[href^="javascript:"]:after,
    +  a[href^="#"]:after {
    +    content: "";
    +  }
    +  pre,
    +  blockquote {
    +    border: 1px solid #999;
    +    page-break-inside: avoid;
    +  }
    +  thead {
    +    display: table-header-group;
    +  }
    +  tr,
    +  img {
    +    page-break-inside: avoid;
    +  }
    +  img {
    +    max-width: 100% !important;
    +  }
    +  @page  {
    +    margin: 0.5cm;
    +  }
    +  p,
    +  h2,
    +  h3 {
    +    orphans: 3;
    +    widows: 3;
    +  }
    +  h2,
    +  h3 {
    +    page-break-after: avoid;
    +  }
    +}
    +
    +body {
    +  margin: 0;
    +  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    +  font-size: 14px;
    +  line-height: 20px;
    +  color: #333333;
    +  background-color: #ffffff;
    +}
    +
    +a {
    +  color: #0088cc;
    +  text-decoration: none;
    +}
    +
    +a:hover,
    +a:focus {
    +  color: #005580;
    +  text-decoration: underline;
    +}
    +
    +.img-rounded {
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +}
    +
    +.img-polaroid {
    +  padding: 4px;
    +  background-color: #fff;
    +  border: 1px solid #ccc;
    +  border: 1px solid rgba(0, 0, 0, 0.2);
    +  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
    +     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
    +          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
    +}
    +
    +.img-circle {
    +  -webkit-border-radius: 500px;
    +     -moz-border-radius: 500px;
    +          border-radius: 500px;
    +}
    +
    +.row {
    +  margin-left: -20px;
    +  *zoom: 1;
    +}
    +
    +.row:before,
    +.row:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.row:after {
    +  clear: both;
    +}
    +
    +[class*="span"] {
    +  float: left;
    +  min-height: 1px;
    +  margin-left: 20px;
    +}
    +
    +.container,
    +.navbar-static-top .container,
    +.navbar-fixed-top .container,
    +.navbar-fixed-bottom .container {
    +  width: 940px;
    +}
    +
    +.span12 {
    +  width: 940px;
    +}
    +
    +.span11 {
    +  width: 860px;
    +}
    +
    +.span10 {
    +  width: 780px;
    +}
    +
    +.span9 {
    +  width: 700px;
    +}
    +
    +.span8 {
    +  width: 620px;
    +}
    +
    +.span7 {
    +  width: 540px;
    +}
    +
    +.span6 {
    +  width: 460px;
    +}
    +
    +.span5 {
    +  width: 380px;
    +}
    +
    +.span4 {
    +  width: 300px;
    +}
    +
    +.span3 {
    +  width: 220px;
    +}
    +
    +.span2 {
    +  width: 140px;
    +}
    +
    +.span1 {
    +  width: 60px;
    +}
    +
    +.offset12 {
    +  margin-left: 980px;
    +}
    +
    +.offset11 {
    +  margin-left: 900px;
    +}
    +
    +.offset10 {
    +  margin-left: 820px;
    +}
    +
    +.offset9 {
    +  margin-left: 740px;
    +}
    +
    +.offset8 {
    +  margin-left: 660px;
    +}
    +
    +.offset7 {
    +  margin-left: 580px;
    +}
    +
    +.offset6 {
    +  margin-left: 500px;
    +}
    +
    +.offset5 {
    +  margin-left: 420px;
    +}
    +
    +.offset4 {
    +  margin-left: 340px;
    +}
    +
    +.offset3 {
    +  margin-left: 260px;
    +}
    +
    +.offset2 {
    +  margin-left: 180px;
    +}
    +
    +.offset1 {
    +  margin-left: 100px;
    +}
    +
    +.row-fluid {
    +  width: 100%;
    +  *zoom: 1;
    +}
    +
    +.row-fluid:before,
    +.row-fluid:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.row-fluid:after {
    +  clear: both;
    +}
    +
    +.row-fluid [class*="span"] {
    +  display: block;
    +  float: left;
    +  width: 100%;
    +  min-height: 30px;
    +  margin-left: 2.127659574468085%;
    +  *margin-left: 2.074468085106383%;
    +  -webkit-box-sizing: border-box;
    +     -moz-box-sizing: border-box;
    +          box-sizing: border-box;
    +}
    +
    +.row-fluid [class*="span"]:first-child {
    +  margin-left: 0;
    +}
    +
    +.row-fluid .controls-row [class*="span"] + [class*="span"] {
    +  margin-left: 2.127659574468085%;
    +}
    +
    +.row-fluid .span12 {
    +  width: 100%;
    +  *width: 99.94680851063829%;
    +}
    +
    +.row-fluid .span11 {
    +  width: 91.48936170212765%;
    +  *width: 91.43617021276594%;
    +}
    +
    +.row-fluid .span10 {
    +  width: 82.97872340425532%;
    +  *width: 82.92553191489361%;
    +}
    +
    +.row-fluid .span9 {
    +  width: 74.46808510638297%;
    +  *width: 74.41489361702126%;
    +}
    +
    +.row-fluid .span8 {
    +  width: 65.95744680851064%;
    +  *width: 65.90425531914893%;
    +}
    +
    +.row-fluid .span7 {
    +  width: 57.44680851063829%;
    +  *width: 57.39361702127659%;
    +}
    +
    +.row-fluid .span6 {
    +  width: 48.93617021276595%;
    +  *width: 48.88297872340425%;
    +}
    +
    +.row-fluid .span5 {
    +  width: 40.42553191489362%;
    +  *width: 40.37234042553192%;
    +}
    +
    +.row-fluid .span4 {
    +  width: 31.914893617021278%;
    +  *width: 31.861702127659576%;
    +}
    +
    +.row-fluid .span3 {
    +  width: 23.404255319148934%;
    +  *width: 23.351063829787233%;
    +}
    +
    +.row-fluid .span2 {
    +  width: 14.893617021276595%;
    +  *width: 14.840425531914894%;
    +}
    +
    +.row-fluid .span1 {
    +  width: 6.382978723404255%;
    +  *width: 6.329787234042553%;
    +}
    +
    +.row-fluid .offset12 {
    +  margin-left: 104.25531914893617%;
    +  *margin-left: 104.14893617021275%;
    +}
    +
    +.row-fluid .offset12:first-child {
    +  margin-left: 102.12765957446808%;
    +  *margin-left: 102.02127659574467%;
    +}
    +
    +.row-fluid .offset11 {
    +  margin-left: 95.74468085106382%;
    +  *margin-left: 95.6382978723404%;
    +}
    +
    +.row-fluid .offset11:first-child {
    +  margin-left: 93.61702127659574%;
    +  *margin-left: 93.51063829787232%;
    +}
    +
    +.row-fluid .offset10 {
    +  margin-left: 87.23404255319149%;
    +  *margin-left: 87.12765957446807%;
    +}
    +
    +.row-fluid .offset10:first-child {
    +  margin-left: 85.1063829787234%;
    +  *margin-left: 84.99999999999999%;
    +}
    +
    +.row-fluid .offset9 {
    +  margin-left: 78.72340425531914%;
    +  *margin-left: 78.61702127659572%;
    +}
    +
    +.row-fluid .offset9:first-child {
    +  margin-left: 76.59574468085106%;
    +  *margin-left: 76.48936170212764%;
    +}
    +
    +.row-fluid .offset8 {
    +  margin-left: 70.2127659574468%;
    +  *margin-left: 70.10638297872339%;
    +}
    +
    +.row-fluid .offset8:first-child {
    +  margin-left: 68.08510638297872%;
    +  *margin-left: 67.9787234042553%;
    +}
    +
    +.row-fluid .offset7 {
    +  margin-left: 61.70212765957446%;
    +  *margin-left: 61.59574468085106%;
    +}
    +
    +.row-fluid .offset7:first-child {
    +  margin-left: 59.574468085106375%;
    +  *margin-left: 59.46808510638297%;
    +}
    +
    +.row-fluid .offset6 {
    +  margin-left: 53.191489361702125%;
    +  *margin-left: 53.085106382978715%;
    +}
    +
    +.row-fluid .offset6:first-child {
    +  margin-left: 51.063829787234035%;
    +  *margin-left: 50.95744680851063%;
    +}
    +
    +.row-fluid .offset5 {
    +  margin-left: 44.68085106382979%;
    +  *margin-left: 44.57446808510638%;
    +}
    +
    +.row-fluid .offset5:first-child {
    +  margin-left: 42.5531914893617%;
    +  *margin-left: 42.4468085106383%;
    +}
    +
    +.row-fluid .offset4 {
    +  margin-left: 36.170212765957444%;
    +  *margin-left: 36.06382978723405%;
    +}
    +
    +.row-fluid .offset4:first-child {
    +  margin-left: 34.04255319148936%;
    +  *margin-left: 33.93617021276596%;
    +}
    +
    +.row-fluid .offset3 {
    +  margin-left: 27.659574468085104%;
    +  *margin-left: 27.5531914893617%;
    +}
    +
    +.row-fluid .offset3:first-child {
    +  margin-left: 25.53191489361702%;
    +  *margin-left: 25.425531914893618%;
    +}
    +
    +.row-fluid .offset2 {
    +  margin-left: 19.148936170212764%;
    +  *margin-left: 19.04255319148936%;
    +}
    +
    +.row-fluid .offset2:first-child {
    +  margin-left: 17.02127659574468%;
    +  *margin-left: 16.914893617021278%;
    +}
    +
    +.row-fluid .offset1 {
    +  margin-left: 10.638297872340425%;
    +  *margin-left: 10.53191489361702%;
    +}
    +
    +.row-fluid .offset1:first-child {
    +  margin-left: 8.51063829787234%;
    +  *margin-left: 8.404255319148938%;
    +}
    +
    +[class*="span"].hide,
    +.row-fluid [class*="span"].hide {
    +  display: none;
    +}
    +
    +[class*="span"].pull-right,
    +.row-fluid [class*="span"].pull-right {
    +  float: right;
    +}
    +
    +.container {
    +  margin-right: auto;
    +  margin-left: auto;
    +  *zoom: 1;
    +}
    +
    +.container:before,
    +.container:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.container:after {
    +  clear: both;
    +}
    +
    +.container-fluid {
    +  padding-right: 20px;
    +  padding-left: 20px;
    +  *zoom: 1;
    +}
    +
    +.container-fluid:before,
    +.container-fluid:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.container-fluid:after {
    +  clear: both;
    +}
    +
    +p {
    +  margin: 0 0 10px;
    +}
    +
    +.lead {
    +  margin-bottom: 20px;
    +  font-size: 21px;
    +  font-weight: 200;
    +  line-height: 30px;
    +}
    +
    +small {
    +  font-size: 85%;
    +}
    +
    +strong {
    +  font-weight: bold;
    +}
    +
    +em {
    +  font-style: italic;
    +}
    +
    +cite {
    +  font-style: normal;
    +}
    +
    +.muted {
    +  color: #999999;
    +}
    +
    +a.muted:hover,
    +a.muted:focus {
    +  color: #808080;
    +}
    +
    +.text-warning {
    +  color: #c09853;
    +}
    +
    +a.text-warning:hover,
    +a.text-warning:focus {
    +  color: #a47e3c;
    +}
    +
    +.text-error {
    +  color: #b94a48;
    +}
    +
    +a.text-error:hover,
    +a.text-error:focus {
    +  color: #953b39;
    +}
    +
    +.text-info {
    +  color: #3a87ad;
    +}
    +
    +a.text-info:hover,
    +a.text-info:focus {
    +  color: #2d6987;
    +}
    +
    +.text-success {
    +  color: #468847;
    +}
    +
    +a.text-success:hover,
    +a.text-success:focus {
    +  color: #356635;
    +}
    +
    +.text-left {
    +  text-align: left;
    +}
    +
    +.text-right {
    +  text-align: right;
    +}
    +
    +.text-center {
    +  text-align: center;
    +}
    +
    +h1,
    +h2,
    +h3,
    +h4,
    +h5,
    +h6 {
    +  margin: 10px 0;
    +  font-family: inherit;
    +  font-weight: bold;
    +  line-height: 20px;
    +  color: inherit;
    +  text-rendering: optimizelegibility;
    +}
    +
    +h1 small,
    +h2 small,
    +h3 small,
    +h4 small,
    +h5 small,
    +h6 small {
    +  font-weight: normal;
    +  line-height: 1;
    +  color: #999999;
    +}
    +
    +h1,
    +h2,
    +h3 {
    +  line-height: 40px;
    +}
    +
    +h1 {
    +  font-size: 38.5px;
    +}
    +
    +h2 {
    +  font-size: 31.5px;
    +}
    +
    +h3 {
    +  font-size: 24.5px;
    +}
    +
    +h4 {
    +  font-size: 17.5px;
    +}
    +
    +h5 {
    +  font-size: 14px;
    +}
    +
    +h6 {
    +  font-size: 11.9px;
    +}
    +
    +h1 small {
    +  font-size: 24.5px;
    +}
    +
    +h2 small {
    +  font-size: 17.5px;
    +}
    +
    +h3 small {
    +  font-size: 14px;
    +}
    +
    +h4 small {
    +  font-size: 14px;
    +}
    +
    +.page-header {
    +  padding-bottom: 9px;
    +  margin: 20px 0 30px;
    +  border-bottom: 1px solid #eeeeee;
    +}
    +
    +ul,
    +ol {
    +  padding: 0;
    +  margin: 0 0 10px 25px;
    +}
    +
    +ul ul,
    +ul ol,
    +ol ol,
    +ol ul {
    +  margin-bottom: 0;
    +}
    +
    +li {
    +  line-height: 20px;
    +}
    +
    +ul.unstyled,
    +ol.unstyled {
    +  margin-left: 0;
    +  list-style: none;
    +}
    +
    +ul.inline,
    +ol.inline {
    +  margin-left: 0;
    +  list-style: none;
    +}
    +
    +ul.inline > li,
    +ol.inline > li {
    +  display: inline-block;
    +  *display: inline;
    +  padding-right: 5px;
    +  padding-left: 5px;
    +  *zoom: 1;
    +}
    +
    +dl {
    +  margin-bottom: 20px;
    +}
    +
    +dt,
    +dd {
    +  line-height: 20px;
    +}
    +
    +dt {
    +  font-weight: bold;
    +}
    +
    +dd {
    +  margin-left: 10px;
    +}
    +
    +.dl-horizontal {
    +  *zoom: 1;
    +}
    +
    +.dl-horizontal:before,
    +.dl-horizontal:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.dl-horizontal:after {
    +  clear: both;
    +}
    +
    +.dl-horizontal dt {
    +  float: left;
    +  width: 160px;
    +  overflow: hidden;
    +  clear: left;
    +  text-align: right;
    +  text-overflow: ellipsis;
    +  white-space: nowrap;
    +}
    +
    +.dl-horizontal dd {
    +  margin-left: 180px;
    +}
    +
    +hr {
    +  margin: 20px 0;
    +  border: 0;
    +  border-top: 1px solid #eeeeee;
    +  border-bottom: 1px solid #ffffff;
    +}
    +
    +abbr[title],
    +abbr[data-original-title] {
    +  cursor: help;
    +  border-bottom: 1px dotted #999999;
    +}
    +
    +abbr.initialism {
    +  font-size: 90%;
    +  text-transform: uppercase;
    +}
    +
    +blockquote {
    +  padding: 0 0 0 15px;
    +  margin: 0 0 20px;
    +  border-left: 5px solid #eeeeee;
    +}
    +
    +blockquote p {
    +  margin-bottom: 0;
    +  font-size: 17.5px;
    +  font-weight: 300;
    +  line-height: 1.25;
    +}
    +
    +blockquote small {
    +  display: block;
    +  line-height: 20px;
    +  color: #999999;
    +}
    +
    +blockquote small:before {
    +  content: '\2014 \00A0';
    +}
    +
    +blockquote.pull-right {
    +  float: right;
    +  padding-right: 15px;
    +  padding-left: 0;
    +  border-right: 5px solid #eeeeee;
    +  border-left: 0;
    +}
    +
    +blockquote.pull-right p,
    +blockquote.pull-right small {
    +  text-align: right;
    +}
    +
    +blockquote.pull-right small:before {
    +  content: '';
    +}
    +
    +blockquote.pull-right small:after {
    +  content: '\00A0 \2014';
    +}
    +
    +q:before,
    +q:after,
    +blockquote:before,
    +blockquote:after {
    +  content: "";
    +}
    +
    +address {
    +  display: block;
    +  margin-bottom: 20px;
    +  font-style: normal;
    +  line-height: 20px;
    +}
    +
    +code,
    +pre {
    +  padding: 0 3px 2px;
    +  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
    +  font-size: 12px;
    +  color: #333333;
    +  -webkit-border-radius: 3px;
    +     -moz-border-radius: 3px;
    +          border-radius: 3px;
    +}
    +
    +code {
    +  padding: 2px 4px;
    +  color: #d14;
    +  white-space: nowrap;
    +  background-color: #f7f7f9;
    +  border: 1px solid #e1e1e8;
    +}
    +
    +pre {
    +  display: block;
    +  padding: 9.5px;
    +  margin: 0 0 10px;
    +  font-size: 13px;
    +  line-height: 20px;
    +  word-break: break-all;
    +  word-wrap: break-word;
    +  white-space: pre;
    +  white-space: pre-wrap;
    +  background-color: #f5f5f5;
    +  border: 1px solid #ccc;
    +  border: 1px solid rgba(0, 0, 0, 0.15);
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +pre.prettyprint {
    +  margin-bottom: 20px;
    +}
    +
    +pre code {
    +  padding: 0;
    +  color: inherit;
    +  white-space: pre;
    +  white-space: pre-wrap;
    +  background-color: transparent;
    +  border: 0;
    +}
    +
    +.pre-scrollable {
    +  max-height: 340px;
    +  overflow-y: scroll;
    +}
    +
    +form {
    +  margin: 0 0 20px;
    +}
    +
    +fieldset {
    +  padding: 0;
    +  margin: 0;
    +  border: 0;
    +}
    +
    +legend {
    +  display: block;
    +  width: 100%;
    +  padding: 0;
    +  margin-bottom: 20px;
    +  font-size: 21px;
    +  line-height: 40px;
    +  color: #333333;
    +  border: 0;
    +  border-bottom: 1px solid #e5e5e5;
    +}
    +
    +legend small {
    +  font-size: 15px;
    +  color: #999999;
    +}
    +
    +label,
    +input,
    +button,
    +select,
    +textarea {
    +  font-size: 14px;
    +  font-weight: normal;
    +  line-height: 20px;
    +}
    +
    +input,
    +button,
    +select,
    +textarea {
    +  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    +}
    +
    +label {
    +  display: block;
    +  margin-bottom: 5px;
    +}
    +
    +select,
    +textarea,
    +input[type="text"],
    +input[type="password"],
    +input[type="datetime"],
    +input[type="datetime-local"],
    +input[type="date"],
    +input[type="month"],
    +input[type="time"],
    +input[type="week"],
    +input[type="number"],
    +input[type="email"],
    +input[type="url"],
    +input[type="search"],
    +input[type="tel"],
    +input[type="color"],
    +.uneditable-input {
    +  display: inline-block;
    +  height: 20px;
    +  padding: 4px 6px;
    +  margin-bottom: 10px;
    +  font-size: 14px;
    +  line-height: 20px;
    +  color: #555555;
    +  vertical-align: middle;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +input,
    +textarea,
    +.uneditable-input {
    +  width: 206px;
    +}
    +
    +textarea {
    +  height: auto;
    +}
    +
    +textarea,
    +input[type="text"],
    +input[type="password"],
    +input[type="datetime"],
    +input[type="datetime-local"],
    +input[type="date"],
    +input[type="month"],
    +input[type="time"],
    +input[type="week"],
    +input[type="number"],
    +input[type="email"],
    +input[type="url"],
    +input[type="search"],
    +input[type="tel"],
    +input[type="color"],
    +.uneditable-input {
    +  background-color: #ffffff;
    +  border: 1px solid #cccccc;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
    +     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
    +       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
    +          transition: border linear 0.2s, box-shadow linear 0.2s;
    +}
    +
    +textarea:focus,
    +input[type="text"]:focus,
    +input[type="password"]:focus,
    +input[type="datetime"]:focus,
    +input[type="datetime-local"]:focus,
    +input[type="date"]:focus,
    +input[type="month"]:focus,
    +input[type="time"]:focus,
    +input[type="week"]:focus,
    +input[type="number"]:focus,
    +input[type="email"]:focus,
    +input[type="url"]:focus,
    +input[type="search"]:focus,
    +input[type="tel"]:focus,
    +input[type="color"]:focus,
    +.uneditable-input:focus {
    +  border-color: rgba(82, 168, 236, 0.8);
    +  outline: 0;
    +  outline: thin dotted \9;
    +  /* IE6-9 */
    +
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
    +}
    +
    +input[type="radio"],
    +input[type="checkbox"] {
    +  margin: 4px 0 0;
    +  margin-top: 1px \9;
    +  *margin-top: 0;
    +  line-height: normal;
    +}
    +
    +input[type="file"],
    +input[type="image"],
    +input[type="submit"],
    +input[type="reset"],
    +input[type="button"],
    +input[type="radio"],
    +input[type="checkbox"] {
    +  width: auto;
    +}
    +
    +select,
    +input[type="file"] {
    +  height: 30px;
    +  /* In IE7, the height of the select element cannot be changed by height, only font-size */
    +
    +  *margin-top: 4px;
    +  /* For IE7, add top margin to align select with labels */
    +
    +  line-height: 30px;
    +}
    +
    +select {
    +  width: 220px;
    +  background-color: #ffffff;
    +  border: 1px solid #cccccc;
    +}
    +
    +select[multiple],
    +select[size] {
    +  height: auto;
    +}
    +
    +select:focus,
    +input[type="file"]:focus,
    +input[type="radio"]:focus,
    +input[type="checkbox"]:focus {
    +  outline: thin dotted #333;
    +  outline: 5px auto -webkit-focus-ring-color;
    +  outline-offset: -2px;
    +}
    +
    +.uneditable-input,
    +.uneditable-textarea {
    +  color: #999999;
    +  cursor: not-allowed;
    +  background-color: #fcfcfc;
    +  border-color: #cccccc;
    +  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
    +     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
    +          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
    +}
    +
    +.uneditable-input {
    +  overflow: hidden;
    +  white-space: nowrap;
    +}
    +
    +.uneditable-textarea {
    +  width: auto;
    +  height: auto;
    +}
    +
    +input:-moz-placeholder,
    +textarea:-moz-placeholder {
    +  color: #999999;
    +}
    +
    +input:-ms-input-placeholder,
    +textarea:-ms-input-placeholder {
    +  color: #999999;
    +}
    +
    +input::-webkit-input-placeholder,
    +textarea::-webkit-input-placeholder {
    +  color: #999999;
    +}
    +
    +.radio,
    +.checkbox {
    +  min-height: 20px;
    +  padding-left: 20px;
    +}
    +
    +.radio input[type="radio"],
    +.checkbox input[type="checkbox"] {
    +  float: left;
    +  margin-left: -20px;
    +}
    +
    +.controls > .radio:first-child,
    +.controls > .checkbox:first-child {
    +  padding-top: 5px;
    +}
    +
    +.radio.inline,
    +.checkbox.inline {
    +  display: inline-block;
    +  padding-top: 5px;
    +  margin-bottom: 0;
    +  vertical-align: middle;
    +}
    +
    +.radio.inline + .radio.inline,
    +.checkbox.inline + .checkbox.inline {
    +  margin-left: 10px;
    +}
    +
    +.input-mini {
    +  width: 60px;
    +}
    +
    +.input-small {
    +  width: 90px;
    +}
    +
    +.input-medium {
    +  width: 150px;
    +}
    +
    +.input-large {
    +  width: 210px;
    +}
    +
    +.input-xlarge {
    +  width: 270px;
    +}
    +
    +.input-xxlarge {
    +  width: 530px;
    +}
    +
    +input[class*="span"],
    +select[class*="span"],
    +textarea[class*="span"],
    +.uneditable-input[class*="span"],
    +.row-fluid input[class*="span"],
    +.row-fluid select[class*="span"],
    +.row-fluid textarea[class*="span"],
    +.row-fluid .uneditable-input[class*="span"] {
    +  float: none;
    +  margin-left: 0;
    +}
    +
    +.input-append input[class*="span"],
    +.input-append .uneditable-input[class*="span"],
    +.input-prepend input[class*="span"],
    +.input-prepend .uneditable-input[class*="span"],
    +.row-fluid input[class*="span"],
    +.row-fluid select[class*="span"],
    +.row-fluid textarea[class*="span"],
    +.row-fluid .uneditable-input[class*="span"],
    +.row-fluid .input-prepend [class*="span"],
    +.row-fluid .input-append [class*="span"] {
    +  display: inline-block;
    +}
    +
    +input,
    +textarea,
    +.uneditable-input {
    +  margin-left: 0;
    +}
    +
    +.controls-row [class*="span"] + [class*="span"] {
    +  margin-left: 20px;
    +}
    +
    +input.span12,
    +textarea.span12,
    +.uneditable-input.span12 {
    +  width: 926px;
    +}
    +
    +input.span11,
    +textarea.span11,
    +.uneditable-input.span11 {
    +  width: 846px;
    +}
    +
    +input.span10,
    +textarea.span10,
    +.uneditable-input.span10 {
    +  width: 766px;
    +}
    +
    +input.span9,
    +textarea.span9,
    +.uneditable-input.span9 {
    +  width: 686px;
    +}
    +
    +input.span8,
    +textarea.span8,
    +.uneditable-input.span8 {
    +  width: 606px;
    +}
    +
    +input.span7,
    +textarea.span7,
    +.uneditable-input.span7 {
    +  width: 526px;
    +}
    +
    +input.span6,
    +textarea.span6,
    +.uneditable-input.span6 {
    +  width: 446px;
    +}
    +
    +input.span5,
    +textarea.span5,
    +.uneditable-input.span5 {
    +  width: 366px;
    +}
    +
    +input.span4,
    +textarea.span4,
    +.uneditable-input.span4 {
    +  width: 286px;
    +}
    +
    +input.span3,
    +textarea.span3,
    +.uneditable-input.span3 {
    +  width: 206px;
    +}
    +
    +input.span2,
    +textarea.span2,
    +.uneditable-input.span2 {
    +  width: 126px;
    +}
    +
    +input.span1,
    +textarea.span1,
    +.uneditable-input.span1 {
    +  width: 46px;
    +}
    +
    +.controls-row {
    +  *zoom: 1;
    +}
    +
    +.controls-row:before,
    +.controls-row:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.controls-row:after {
    +  clear: both;
    +}
    +
    +.controls-row [class*="span"],
    +.row-fluid .controls-row [class*="span"] {
    +  float: left;
    +}
    +
    +.controls-row .checkbox[class*="span"],
    +.controls-row .radio[class*="span"] {
    +  padding-top: 5px;
    +}
    +
    +input[disabled],
    +select[disabled],
    +textarea[disabled],
    +input[readonly],
    +select[readonly],
    +textarea[readonly] {
    +  cursor: not-allowed;
    +  background-color: #eeeeee;
    +}
    +
    +input[type="radio"][disabled],
    +input[type="checkbox"][disabled],
    +input[type="radio"][readonly],
    +input[type="checkbox"][readonly] {
    +  background-color: transparent;
    +}
    +
    +.control-group.warning .control-label,
    +.control-group.warning .help-block,
    +.control-group.warning .help-inline {
    +  color: #c09853;
    +}
    +
    +.control-group.warning .checkbox,
    +.control-group.warning .radio,
    +.control-group.warning input,
    +.control-group.warning select,
    +.control-group.warning textarea {
    +  color: #c09853;
    +}
    +
    +.control-group.warning input,
    +.control-group.warning select,
    +.control-group.warning textarea {
    +  border-color: #c09853;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +}
    +
    +.control-group.warning input:focus,
    +.control-group.warning select:focus,
    +.control-group.warning textarea:focus {
    +  border-color: #a47e3c;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
    +}
    +
    +.control-group.warning .input-prepend .add-on,
    +.control-group.warning .input-append .add-on {
    +  color: #c09853;
    +  background-color: #fcf8e3;
    +  border-color: #c09853;
    +}
    +
    +.control-group.error .control-label,
    +.control-group.error .help-block,
    +.control-group.error .help-inline {
    +  color: #b94a48;
    +}
    +
    +.control-group.error .checkbox,
    +.control-group.error .radio,
    +.control-group.error input,
    +.control-group.error select,
    +.control-group.error textarea {
    +  color: #b94a48;
    +}
    +
    +.control-group.error input,
    +.control-group.error select,
    +.control-group.error textarea {
    +  border-color: #b94a48;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +}
    +
    +.control-group.error input:focus,
    +.control-group.error select:focus,
    +.control-group.error textarea:focus {
    +  border-color: #953b39;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
    +}
    +
    +.control-group.error .input-prepend .add-on,
    +.control-group.error .input-append .add-on {
    +  color: #b94a48;
    +  background-color: #f2dede;
    +  border-color: #b94a48;
    +}
    +
    +.control-group.success .control-label,
    +.control-group.success .help-block,
    +.control-group.success .help-inline {
    +  color: #468847;
    +}
    +
    +.control-group.success .checkbox,
    +.control-group.success .radio,
    +.control-group.success input,
    +.control-group.success select,
    +.control-group.success textarea {
    +  color: #468847;
    +}
    +
    +.control-group.success input,
    +.control-group.success select,
    +.control-group.success textarea {
    +  border-color: #468847;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +}
    +
    +.control-group.success input:focus,
    +.control-group.success select:focus,
    +.control-group.success textarea:focus {
    +  border-color: #356635;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
    +}
    +
    +.control-group.success .input-prepend .add-on,
    +.control-group.success .input-append .add-on {
    +  color: #468847;
    +  background-color: #dff0d8;
    +  border-color: #468847;
    +}
    +
    +.control-group.info .control-label,
    +.control-group.info .help-block,
    +.control-group.info .help-inline {
    +  color: #3a87ad;
    +}
    +
    +.control-group.info .checkbox,
    +.control-group.info .radio,
    +.control-group.info input,
    +.control-group.info select,
    +.control-group.info textarea {
    +  color: #3a87ad;
    +}
    +
    +.control-group.info input,
    +.control-group.info select,
    +.control-group.info textarea {
    +  border-color: #3a87ad;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    +}
    +
    +.control-group.info input:focus,
    +.control-group.info select:focus,
    +.control-group.info textarea:focus {
    +  border-color: #2d6987;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
    +}
    +
    +.control-group.info .input-prepend .add-on,
    +.control-group.info .input-append .add-on {
    +  color: #3a87ad;
    +  background-color: #d9edf7;
    +  border-color: #3a87ad;
    +}
    +
    +input:focus:invalid,
    +textarea:focus:invalid,
    +select:focus:invalid {
    +  color: #b94a48;
    +  border-color: #ee5f5b;
    +}
    +
    +input:focus:invalid:focus,
    +textarea:focus:invalid:focus,
    +select:focus:invalid:focus {
    +  border-color: #e9322d;
    +  -webkit-box-shadow: 0 0 6px #f8b9b7;
    +     -moz-box-shadow: 0 0 6px #f8b9b7;
    +          box-shadow: 0 0 6px #f8b9b7;
    +}
    +
    +.form-actions {
    +  padding: 19px 20px 20px;
    +  margin-top: 20px;
    +  margin-bottom: 20px;
    +  background-color: #f5f5f5;
    +  border-top: 1px solid #e5e5e5;
    +  *zoom: 1;
    +}
    +
    +.form-actions:before,
    +.form-actions:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.form-actions:after {
    +  clear: both;
    +}
    +
    +.help-block,
    +.help-inline {
    +  color: #595959;
    +}
    +
    +.help-block {
    +  display: block;
    +  margin-bottom: 10px;
    +}
    +
    +.help-inline {
    +  display: inline-block;
    +  *display: inline;
    +  padding-left: 5px;
    +  vertical-align: middle;
    +  *zoom: 1;
    +}
    +
    +.input-append,
    +.input-prepend {
    +  display: inline-block;
    +  margin-bottom: 10px;
    +  font-size: 0;
    +  white-space: nowrap;
    +  vertical-align: middle;
    +}
    +
    +.input-append input,
    +.input-prepend input,
    +.input-append select,
    +.input-prepend select,
    +.input-append .uneditable-input,
    +.input-prepend .uneditable-input,
    +.input-append .dropdown-menu,
    +.input-prepend .dropdown-menu,
    +.input-append .popover,
    +.input-prepend .popover {
    +  font-size: 14px;
    +}
    +
    +.input-append input,
    +.input-prepend input,
    +.input-append select,
    +.input-prepend select,
    +.input-append .uneditable-input,
    +.input-prepend .uneditable-input {
    +  position: relative;
    +  margin-bottom: 0;
    +  *margin-left: 0;
    +  vertical-align: top;
    +  -webkit-border-radius: 0 4px 4px 0;
    +     -moz-border-radius: 0 4px 4px 0;
    +          border-radius: 0 4px 4px 0;
    +}
    +
    +.input-append input:focus,
    +.input-prepend input:focus,
    +.input-append select:focus,
    +.input-prepend select:focus,
    +.input-append .uneditable-input:focus,
    +.input-prepend .uneditable-input:focus {
    +  z-index: 2;
    +}
    +
    +.input-append .add-on,
    +.input-prepend .add-on {
    +  display: inline-block;
    +  width: auto;
    +  height: 20px;
    +  min-width: 16px;
    +  padding: 4px 5px;
    +  font-size: 14px;
    +  font-weight: normal;
    +  line-height: 20px;
    +  text-align: center;
    +  text-shadow: 0 1px 0 #ffffff;
    +  background-color: #eeeeee;
    +  border: 1px solid #ccc;
    +}
    +
    +.input-append .add-on,
    +.input-prepend .add-on,
    +.input-append .btn,
    +.input-prepend .btn,
    +.input-append .btn-group > .dropdown-toggle,
    +.input-prepend .btn-group > .dropdown-toggle {
    +  vertical-align: top;
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.input-append .active,
    +.input-prepend .active {
    +  background-color: #a9dba9;
    +  border-color: #46a546;
    +}
    +
    +.input-prepend .add-on,
    +.input-prepend .btn {
    +  margin-right: -1px;
    +}
    +
    +.input-prepend .add-on:first-child,
    +.input-prepend .btn:first-child {
    +  -webkit-border-radius: 4px 0 0 4px;
    +     -moz-border-radius: 4px 0 0 4px;
    +          border-radius: 4px 0 0 4px;
    +}
    +
    +.input-append input,
    +.input-append select,
    +.input-append .uneditable-input {
    +  -webkit-border-radius: 4px 0 0 4px;
    +     -moz-border-radius: 4px 0 0 4px;
    +          border-radius: 4px 0 0 4px;
    +}
    +
    +.input-append input + .btn-group .btn:last-child,
    +.input-append select + .btn-group .btn:last-child,
    +.input-append .uneditable-input + .btn-group .btn:last-child {
    +  -webkit-border-radius: 0 4px 4px 0;
    +     -moz-border-radius: 0 4px 4px 0;
    +          border-radius: 0 4px 4px 0;
    +}
    +
    +.input-append .add-on,
    +.input-append .btn,
    +.input-append .btn-group {
    +  margin-left: -1px;
    +}
    +
    +.input-append .add-on:last-child,
    +.input-append .btn:last-child,
    +.input-append .btn-group:last-child > .dropdown-toggle {
    +  -webkit-border-radius: 0 4px 4px 0;
    +     -moz-border-radius: 0 4px 4px 0;
    +          border-radius: 0 4px 4px 0;
    +}
    +
    +.input-prepend.input-append input,
    +.input-prepend.input-append select,
    +.input-prepend.input-append .uneditable-input {
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.input-prepend.input-append input + .btn-group .btn,
    +.input-prepend.input-append select + .btn-group .btn,
    +.input-prepend.input-append .uneditable-input + .btn-group .btn {
    +  -webkit-border-radius: 0 4px 4px 0;
    +     -moz-border-radius: 0 4px 4px 0;
    +          border-radius: 0 4px 4px 0;
    +}
    +
    +.input-prepend.input-append .add-on:first-child,
    +.input-prepend.input-append .btn:first-child {
    +  margin-right: -1px;
    +  -webkit-border-radius: 4px 0 0 4px;
    +     -moz-border-radius: 4px 0 0 4px;
    +          border-radius: 4px 0 0 4px;
    +}
    +
    +.input-prepend.input-append .add-on:last-child,
    +.input-prepend.input-append .btn:last-child {
    +  margin-left: -1px;
    +  -webkit-border-radius: 0 4px 4px 0;
    +     -moz-border-radius: 0 4px 4px 0;
    +          border-radius: 0 4px 4px 0;
    +}
    +
    +.input-prepend.input-append .btn-group:first-child {
    +  margin-left: 0;
    +}
    +
    +input.search-query {
    +  padding-right: 14px;
    +  padding-right: 4px \9;
    +  padding-left: 14px;
    +  padding-left: 4px \9;
    +  /* IE7-8 doesn't have border-radius, so don't indent the padding */
    +
    +  margin-bottom: 0;
    +  -webkit-border-radius: 15px;
    +     -moz-border-radius: 15px;
    +          border-radius: 15px;
    +}
    +
    +/* Allow for input prepend/append in search forms */
    +
    +.form-search .input-append .search-query,
    +.form-search .input-prepend .search-query {
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.form-search .input-append .search-query {
    +  -webkit-border-radius: 14px 0 0 14px;
    +     -moz-border-radius: 14px 0 0 14px;
    +          border-radius: 14px 0 0 14px;
    +}
    +
    +.form-search .input-append .btn {
    +  -webkit-border-radius: 0 14px 14px 0;
    +     -moz-border-radius: 0 14px 14px 0;
    +          border-radius: 0 14px 14px 0;
    +}
    +
    +.form-search .input-prepend .search-query {
    +  -webkit-border-radius: 0 14px 14px 0;
    +     -moz-border-radius: 0 14px 14px 0;
    +          border-radius: 0 14px 14px 0;
    +}
    +
    +.form-search .input-prepend .btn {
    +  -webkit-border-radius: 14px 0 0 14px;
    +     -moz-border-radius: 14px 0 0 14px;
    +          border-radius: 14px 0 0 14px;
    +}
    +
    +.form-search input,
    +.form-inline input,
    +.form-horizontal input,
    +.form-search textarea,
    +.form-inline textarea,
    +.form-horizontal textarea,
    +.form-search select,
    +.form-inline select,
    +.form-horizontal select,
    +.form-search .help-inline,
    +.form-inline .help-inline,
    +.form-horizontal .help-inline,
    +.form-search .uneditable-input,
    +.form-inline .uneditable-input,
    +.form-horizontal .uneditable-input,
    +.form-search .input-prepend,
    +.form-inline .input-prepend,
    +.form-horizontal .input-prepend,
    +.form-search .input-append,
    +.form-inline .input-append,
    +.form-horizontal .input-append {
    +  display: inline-block;
    +  *display: inline;
    +  margin-bottom: 0;
    +  vertical-align: middle;
    +  *zoom: 1;
    +}
    +
    +.form-search .hide,
    +.form-inline .hide,
    +.form-horizontal .hide {
    +  display: none;
    +}
    +
    +.form-search label,
    +.form-inline label,
    +.form-search .btn-group,
    +.form-inline .btn-group {
    +  display: inline-block;
    +}
    +
    +.form-search .input-append,
    +.form-inline .input-append,
    +.form-search .input-prepend,
    +.form-inline .input-prepend {
    +  margin-bottom: 0;
    +}
    +
    +.form-search .radio,
    +.form-search .checkbox,
    +.form-inline .radio,
    +.form-inline .checkbox {
    +  padding-left: 0;
    +  margin-bottom: 0;
    +  vertical-align: middle;
    +}
    +
    +.form-search .radio input[type="radio"],
    +.form-search .checkbox input[type="checkbox"],
    +.form-inline .radio input[type="radio"],
    +.form-inline .checkbox input[type="checkbox"] {
    +  float: left;
    +  margin-right: 3px;
    +  margin-left: 0;
    +}
    +
    +.control-group {
    +  margin-bottom: 10px;
    +}
    +
    +legend + .control-group {
    +  margin-top: 20px;
    +  -webkit-margin-top-collapse: separate;
    +}
    +
    +.form-horizontal .control-group {
    +  margin-bottom: 20px;
    +  *zoom: 1;
    +}
    +
    +.form-horizontal .control-group:before,
    +.form-horizontal .control-group:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.form-horizontal .control-group:after {
    +  clear: both;
    +}
    +
    +.form-horizontal .control-label {
    +  float: left;
    +  width: 160px;
    +  padding-top: 5px;
    +  text-align: right;
    +}
    +
    +.form-horizontal .controls {
    +  *display: inline-block;
    +  *padding-left: 20px;
    +  margin-left: 180px;
    +  *margin-left: 0;
    +}
    +
    +.form-horizontal .controls:first-child {
    +  *padding-left: 180px;
    +}
    +
    +.form-horizontal .help-block {
    +  margin-bottom: 0;
    +}
    +
    +.form-horizontal input + .help-block,
    +.form-horizontal select + .help-block,
    +.form-horizontal textarea + .help-block,
    +.form-horizontal .uneditable-input + .help-block,
    +.form-horizontal .input-prepend + .help-block,
    +.form-horizontal .input-append + .help-block {
    +  margin-top: 10px;
    +}
    +
    +.form-horizontal .form-actions {
    +  padding-left: 180px;
    +}
    +
    +table {
    +  max-width: 100%;
    +  background-color: transparent;
    +  border-collapse: collapse;
    +  border-left:1px solid #d3d3d3; border-top:1px solid #d3d3d3;
    +}
    +
    +.table {
    +  width: 100%;
    +  margin-bottom: 20px;
    +}
    +
    +.table th,
    +.table td {
    +  padding: 8px;
    +  line-height: 20px;
    +  text-align: left;
    +  vertical-align: top;
    +  border: 1px solid #dddddd;
    +}
    +
    +.table th {
    +  font-weight: bold;
    +}
    +
    +.table thead th {
    +  vertical-align: bottom;
    +}
    +
    +.table caption + thead tr:first-child th,
    +.table caption + thead tr:first-child td,
    +.table colgroup + thead tr:first-child th,
    +.table colgroup + thead tr:first-child td,
    +.table thead:first-child tr:first-child th,
    +.table thead:first-child tr:first-child td {
    +  border-top: 0;
    +}
    +
    +.table tbody + tbody {
    +  border-top: 2px solid #dddddd;
    +}
    +
    +.table .table {
    +  background-color: #ffffff;
    +}
    +
    +.table-condensed th,
    +.table-condensed td {
    +  padding: 4px 5px;
    +}
    +
    +.table-bordered {
    +  border: 1px solid #dddddd;
    +  border-collapse: separate;
    +  *border-collapse: collapse;
    +  border-left: 0;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +.table-bordered th,
    +.table-bordered td {
    +  border-left: 1px solid #dddddd;
    +}
    +
    +.table-bordered caption + thead tr:first-child th,
    +.table-bordered caption + tbody tr:first-child th,
    +.table-bordered caption + tbody tr:first-child td,
    +.table-bordered colgroup + thead tr:first-child th,
    +.table-bordered colgroup + tbody tr:first-child th,
    +.table-bordered colgroup + tbody tr:first-child td,
    +.table-bordered thead:first-child tr:first-child th,
    +.table-bordered tbody:first-child tr:first-child th,
    +.table-bordered tbody:first-child tr:first-child td {
    +  border-top: 0;
    +}
    +
    +.table-bordered thead:first-child tr:first-child > th:first-child,
    +.table-bordered tbody:first-child tr:first-child > td:first-child,
    +.table-bordered tbody:first-child tr:first-child > th:first-child {
    +  -webkit-border-top-left-radius: 4px;
    +          border-top-left-radius: 4px;
    +  -moz-border-radius-topleft: 4px;
    +}
    +
    +.table-bordered thead:first-child tr:first-child > th:last-child,
    +.table-bordered tbody:first-child tr:first-child > td:last-child,
    +.table-bordered tbody:first-child tr:first-child > th:last-child {
    +  -webkit-border-top-right-radius: 4px;
    +          border-top-right-radius: 4px;
    +  -moz-border-radius-topright: 4px;
    +}
    +
    +.table-bordered thead:last-child tr:last-child > th:first-child,
    +.table-bordered tbody:last-child tr:last-child > td:first-child,
    +.table-bordered tbody:last-child tr:last-child > th:first-child,
    +.table-bordered tfoot:last-child tr:last-child > td:first-child,
    +.table-bordered tfoot:last-child tr:last-child > th:first-child {
    +  -webkit-border-bottom-left-radius: 4px;
    +          border-bottom-left-radius: 4px;
    +  -moz-border-radius-bottomleft: 4px;
    +}
    +
    +.table-bordered thead:last-child tr:last-child > th:last-child,
    +.table-bordered tbody:last-child tr:last-child > td:last-child,
    +.table-bordered tbody:last-child tr:last-child > th:last-child,
    +.table-bordered tfoot:last-child tr:last-child > td:last-child,
    +.table-bordered tfoot:last-child tr:last-child > th:last-child {
    +  -webkit-border-bottom-right-radius: 4px;
    +          border-bottom-right-radius: 4px;
    +  -moz-border-radius-bottomright: 4px;
    +}
    +
    +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
    +  -webkit-border-bottom-left-radius: 0;
    +          border-bottom-left-radius: 0;
    +  -moz-border-radius-bottomleft: 0;
    +}
    +
    +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
    +  -webkit-border-bottom-right-radius: 0;
    +          border-bottom-right-radius: 0;
    +  -moz-border-radius-bottomright: 0;
    +}
    +
    +.table-bordered caption + thead tr:first-child th:first-child,
    +.table-bordered caption + tbody tr:first-child td:first-child,
    +.table-bordered colgroup + thead tr:first-child th:first-child,
    +.table-bordered colgroup + tbody tr:first-child td:first-child {
    +  -webkit-border-top-left-radius: 4px;
    +          border-top-left-radius: 4px;
    +  -moz-border-radius-topleft: 4px;
    +}
    +
    +.table-bordered caption + thead tr:first-child th:last-child,
    +.table-bordered caption + tbody tr:first-child td:last-child,
    +.table-bordered colgroup + thead tr:first-child th:last-child,
    +.table-bordered colgroup + tbody tr:first-child td:last-child {
    +  -webkit-border-top-right-radius: 4px;
    +          border-top-right-radius: 4px;
    +  -moz-border-radius-topright: 4px;
    +}
    +
    +.table-striped tbody > tr:nth-child(odd) > td,
    +.table-striped tbody > tr:nth-child(odd) > th {
    +  background-color: #f9f9f9;
    +}
    +
    +.table-hover tbody tr:hover > td,
    +.table-hover tbody tr:hover > th {
    +  background-color: #f5f5f5;
    +}
    +
    +table td[class*="span"],
    +table th[class*="span"],
    +.row-fluid table td[class*="span"],
    +.row-fluid table th[class*="span"] {
    +  display: table-cell;
    +  float: none;
    +  margin-left: 0;
    +}
    +
    +.table td.span1,
    +.table th.span1 {
    +  float: none;
    +  width: 44px;
    +  margin-left: 0;
    +}
    +
    +.table td.span2,
    +.table th.span2 {
    +  float: none;
    +  width: 124px;
    +  margin-left: 0;
    +}
    +
    +.table td.span3,
    +.table th.span3 {
    +  float: none;
    +  width: 204px;
    +  margin-left: 0;
    +}
    +
    +.table td.span4,
    +.table th.span4 {
    +  float: none;
    +  width: 284px;
    +  margin-left: 0;
    +}
    +
    +.table td.span5,
    +.table th.span5 {
    +  float: none;
    +  width: 364px;
    +  margin-left: 0;
    +}
    +
    +.table td.span6,
    +.table th.span6 {
    +  float: none;
    +  width: 444px;
    +  margin-left: 0;
    +}
    +
    +.table td.span7,
    +.table th.span7 {
    +  float: none;
    +  width: 524px;
    +  margin-left: 0;
    +}
    +
    +.table td.span8,
    +.table th.span8 {
    +  float: none;
    +  width: 604px;
    +  margin-left: 0;
    +}
    +
    +.table td.span9,
    +.table th.span9 {
    +  float: none;
    +  width: 684px;
    +  margin-left: 0;
    +}
    +
    +.table td.span10,
    +.table th.span10 {
    +  float: none;
    +  width: 764px;
    +  margin-left: 0;
    +}
    +
    +.table td.span11,
    +.table th.span11 {
    +  float: none;
    +  width: 844px;
    +  margin-left: 0;
    +}
    +
    +.table td.span12,
    +.table th.span12 {
    +  float: none;
    +  width: 924px;
    +  margin-left: 0;
    +}
    +
    +.table tbody tr.success > td {
    +  background-color: #dff0d8;
    +}
    +
    +.table tbody tr.error > td {
    +  background-color: #f2dede;
    +}
    +
    +.table tbody tr.warning > td {
    +  background-color: #fcf8e3;
    +}
    +
    +.table tbody tr.info > td {
    +  background-color: #d9edf7;
    +}
    +
    +.table-hover tbody tr.success:hover > td {
    +  background-color: #d0e9c6;
    +}
    +
    +.table-hover tbody tr.error:hover > td {
    +  background-color: #ebcccc;
    +}
    +
    +.table-hover tbody tr.warning:hover > td {
    +  background-color: #faf2cc;
    +}
    +
    +.table-hover tbody tr.info:hover > td {
    +  background-color: #c4e3f3;
    +}
    +
    +[class^="icon-"],
    +[class*=" icon-"] {
    +  display: inline-block;
    +  width: 14px;
    +  height: 14px;
    +  margin-top: 1px;
    +  *margin-right: .3em;
    +  line-height: 14px;
    +  vertical-align: text-top;
    +  background-image: url("../img/glyphicons-halflings.png");
    +  background-position: 14px 14px;
    +  background-repeat: no-repeat;
    +}
    +
    +/* White icons with optional class, or on hover/focus/active states of certain elements */
    +
    +.icon-white,
    +.nav-pills > .active > a > [class^="icon-"],
    +.nav-pills > .active > a > [class*=" icon-"],
    +.nav-list > .active > a > [class^="icon-"],
    +.nav-list > .active > a > [class*=" icon-"],
    +.navbar-inverse .nav > .active > a > [class^="icon-"],
    +.navbar-inverse .nav > .active > a > [class*=" icon-"],
    +.dropdown-menu > li > a:hover > [class^="icon-"],
    +.dropdown-menu > li > a:focus > [class^="icon-"],
    +.dropdown-menu > li > a:hover > [class*=" icon-"],
    +.dropdown-menu > li > a:focus > [class*=" icon-"],
    +.dropdown-menu > .active > a > [class^="icon-"],
    +.dropdown-menu > .active > a > [class*=" icon-"],
    +.dropdown-submenu:hover > a > [class^="icon-"],
    +.dropdown-submenu:focus > a > [class^="icon-"],
    +.dropdown-submenu:hover > a > [class*=" icon-"],
    +.dropdown-submenu:focus > a > [class*=" icon-"] {
    +  background-image: url("../img/glyphicons-halflings-white.png");
    +}
    +
    +.icon-glass {
    +  background-position: 0      0;
    +}
    +
    +.icon-music {
    +  background-position: -24px 0;
    +}
    +
    +.icon-search {
    +  background-position: -48px 0;
    +}
    +
    +.icon-envelope {
    +  background-position: -72px 0;
    +}
    +
    +.icon-heart {
    +  background-position: -96px 0;
    +}
    +
    +.icon-star {
    +  background-position: -120px 0;
    +}
    +
    +.icon-star-empty {
    +  background-position: -144px 0;
    +}
    +
    +.icon-user {
    +  background-position: -168px 0;
    +}
    +
    +.icon-film {
    +  background-position: -192px 0;
    +}
    +
    +.icon-th-large {
    +  background-position: -216px 0;
    +}
    +
    +.icon-th {
    +  background-position: -240px 0;
    +}
    +
    +.icon-th-list {
    +  background-position: -264px 0;
    +}
    +
    +.icon-ok {
    +  background-position: -288px 0;
    +}
    +
    +.icon-remove {
    +  background-position: -312px 0;
    +}
    +
    +.icon-zoom-in {
    +  background-position: -336px 0;
    +}
    +
    +.icon-zoom-out {
    +  background-position: -360px 0;
    +}
    +
    +.icon-off {
    +  background-position: -384px 0;
    +}
    +
    +.icon-signal {
    +  background-position: -408px 0;
    +}
    +
    +.icon-cog {
    +  background-position: -432px 0;
    +}
    +
    +.icon-trash {
    +  background-position: -456px 0;
    +}
    +
    +.icon-home {
    +  background-position: 0 -24px;
    +}
    +
    +.icon-file {
    +  background-position: -24px -24px;
    +}
    +
    +.icon-time {
    +  background-position: -48px -24px;
    +}
    +
    +.icon-road {
    +  background-position: -72px -24px;
    +}
    +
    +.icon-download-alt {
    +  background-position: -96px -24px;
    +}
    +
    +.icon-download {
    +  background-position: -120px -24px;
    +}
    +
    +.icon-upload {
    +  background-position: -144px -24px;
    +}
    +
    +.icon-inbox {
    +  background-position: -168px -24px;
    +}
    +
    +.icon-play-circle {
    +  background-position: -192px -24px;
    +}
    +
    +.icon-repeat {
    +  background-position: -216px -24px;
    +}
    +
    +.icon-refresh {
    +  background-position: -240px -24px;
    +}
    +
    +.icon-list-alt {
    +  background-position: -264px -24px;
    +}
    +
    +.icon-lock {
    +  background-position: -287px -24px;
    +}
    +
    +.icon-flag {
    +  background-position: -312px -24px;
    +}
    +
    +.icon-headphones {
    +  background-position: -336px -24px;
    +}
    +
    +.icon-volume-off {
    +  background-position: -360px -24px;
    +}
    +
    +.icon-volume-down {
    +  background-position: -384px -24px;
    +}
    +
    +.icon-volume-up {
    +  background-position: -408px -24px;
    +}
    +
    +.icon-qrcode {
    +  background-position: -432px -24px;
    +}
    +
    +.icon-barcode {
    +  background-position: -456px -24px;
    +}
    +
    +.icon-tag {
    +  background-position: 0 -48px;
    +}
    +
    +.icon-tags {
    +  background-position: -25px -48px;
    +}
    +
    +.icon-book {
    +  background-position: -48px -48px;
    +}
    +
    +.icon-bookmark {
    +  background-position: -72px -48px;
    +}
    +
    +.icon-print {
    +  background-position: -96px -48px;
    +}
    +
    +.icon-camera {
    +  background-position: -120px -48px;
    +}
    +
    +.icon-font {
    +  background-position: -144px -48px;
    +}
    +
    +.icon-bold {
    +  background-position: -167px -48px;
    +}
    +
    +.icon-italic {
    +  background-position: -192px -48px;
    +}
    +
    +.icon-text-height {
    +  background-position: -216px -48px;
    +}
    +
    +.icon-text-width {
    +  background-position: -240px -48px;
    +}
    +
    +.icon-align-left {
    +  background-position: -264px -48px;
    +}
    +
    +.icon-align-center {
    +  background-position: -288px -48px;
    +}
    +
    +.icon-align-right {
    +  background-position: -312px -48px;
    +}
    +
    +.icon-align-justify {
    +  background-position: -336px -48px;
    +}
    +
    +.icon-list {
    +  background-position: -360px -48px;
    +}
    +
    +.icon-indent-left {
    +  background-position: -384px -48px;
    +}
    +
    +.icon-indent-right {
    +  background-position: -408px -48px;
    +}
    +
    +.icon-facetime-video {
    +  background-position: -432px -48px;
    +}
    +
    +.icon-picture {
    +  background-position: -456px -48px;
    +}
    +
    +.icon-pencil {
    +  background-position: 0 -72px;
    +}
    +
    +.icon-map-marker {
    +  background-position: -24px -72px;
    +}
    +
    +.icon-adjust {
    +  background-position: -48px -72px;
    +}
    +
    +.icon-tint {
    +  background-position: -72px -72px;
    +}
    +
    +.icon-edit {
    +  background-position: -96px -72px;
    +}
    +
    +.icon-share {
    +  background-position: -120px -72px;
    +}
    +
    +.icon-check {
    +  background-position: -144px -72px;
    +}
    +
    +.icon-move {
    +  background-position: -168px -72px;
    +}
    +
    +.icon-step-backward {
    +  background-position: -192px -72px;
    +}
    +
    +.icon-fast-backward {
    +  background-position: -216px -72px;
    +}
    +
    +.icon-backward {
    +  background-position: -240px -72px;
    +}
    +
    +.icon-play {
    +  background-position: -264px -72px;
    +}
    +
    +.icon-pause {
    +  background-position: -288px -72px;
    +}
    +
    +.icon-stop {
    +  background-position: -312px -72px;
    +}
    +
    +.icon-forward {
    +  background-position: -336px -72px;
    +}
    +
    +.icon-fast-forward {
    +  background-position: -360px -72px;
    +}
    +
    +.icon-step-forward {
    +  background-position: -384px -72px;
    +}
    +
    +.icon-eject {
    +  background-position: -408px -72px;
    +}
    +
    +.icon-chevron-left {
    +  background-position: -432px -72px;
    +}
    +
    +.icon-chevron-right {
    +  background-position: -456px -72px;
    +}
    +
    +.icon-plus-sign {
    +  background-position: 0 -96px;
    +}
    +
    +.icon-minus-sign {
    +  background-position: -24px -96px;
    +}
    +
    +.icon-remove-sign {
    +  background-position: -48px -96px;
    +}
    +
    +.icon-ok-sign {
    +  background-position: -72px -96px;
    +}
    +
    +.icon-question-sign {
    +  background-position: -96px -96px;
    +}
    +
    +.icon-info-sign {
    +  background-position: -120px -96px;
    +}
    +
    +.icon-screenshot {
    +  background-position: -144px -96px;
    +}
    +
    +.icon-remove-circle {
    +  background-position: -168px -96px;
    +}
    +
    +.icon-ok-circle {
    +  background-position: -192px -96px;
    +}
    +
    +.icon-ban-circle {
    +  background-position: -216px -96px;
    +}
    +
    +.icon-arrow-left {
    +  background-position: -240px -96px;
    +}
    +
    +.icon-arrow-right {
    +  background-position: -264px -96px;
    +}
    +
    +.icon-arrow-up {
    +  background-position: -289px -96px;
    +}
    +
    +.icon-arrow-down {
    +  background-position: -312px -96px;
    +}
    +
    +.icon-share-alt {
    +  background-position: -336px -96px;
    +}
    +
    +.icon-resize-full {
    +  background-position: -360px -96px;
    +}
    +
    +.icon-resize-small {
    +  background-position: -384px -96px;
    +}
    +
    +.icon-plus {
    +  background-position: -408px -96px;
    +}
    +
    +.icon-minus {
    +  background-position: -433px -96px;
    +}
    +
    +.icon-asterisk {
    +  background-position: -456px -96px;
    +}
    +
    +.icon-exclamation-sign {
    +  background-position: 0 -120px;
    +}
    +
    +.icon-gift {
    +  background-position: -24px -120px;
    +}
    +
    +.icon-leaf {
    +  background-position: -48px -120px;
    +}
    +
    +.icon-fire {
    +  background-position: -72px -120px;
    +}
    +
    +.icon-eye-open {
    +  background-position: -96px -120px;
    +}
    +
    +.icon-eye-close {
    +  background-position: -120px -120px;
    +}
    +
    +.icon-warning-sign {
    +  background-position: -144px -120px;
    +}
    +
    +.icon-plane {
    +  background-position: -168px -120px;
    +}
    +
    +.icon-calendar {
    +  background-position: -192px -120px;
    +}
    +
    +.icon-random {
    +  width: 16px;
    +  background-position: -216px -120px;
    +}
    +
    +.icon-comment {
    +  background-position: -240px -120px;
    +}
    +
    +.icon-magnet {
    +  background-position: -264px -120px;
    +}
    +
    +.icon-chevron-up {
    +  background-position: -288px -120px;
    +}
    +
    +.icon-chevron-down {
    +  background-position: -313px -119px;
    +}
    +
    +.icon-retweet {
    +  background-position: -336px -120px;
    +}
    +
    +.icon-shopping-cart {
    +  background-position: -360px -120px;
    +}
    +
    +.icon-folder-close {
    +  width: 16px;
    +  background-position: -384px -120px;
    +}
    +
    +.icon-folder-open {
    +  width: 16px;
    +  background-position: -408px -120px;
    +}
    +
    +.icon-resize-vertical {
    +  background-position: -432px -119px;
    +}
    +
    +.icon-resize-horizontal {
    +  background-position: -456px -118px;
    +}
    +
    +.icon-hdd {
    +  background-position: 0 -144px;
    +}
    +
    +.icon-bullhorn {
    +  background-position: -24px -144px;
    +}
    +
    +.icon-bell {
    +  background-position: -48px -144px;
    +}
    +
    +.icon-certificate {
    +  background-position: -72px -144px;
    +}
    +
    +.icon-thumbs-up {
    +  background-position: -96px -144px;
    +}
    +
    +.icon-thumbs-down {
    +  background-position: -120px -144px;
    +}
    +
    +.icon-hand-right {
    +  background-position: -144px -144px;
    +}
    +
    +.icon-hand-left {
    +  background-position: -168px -144px;
    +}
    +
    +.icon-hand-up {
    +  background-position: -192px -144px;
    +}
    +
    +.icon-hand-down {
    +  background-position: -216px -144px;
    +}
    +
    +.icon-circle-arrow-right {
    +  background-position: -240px -144px;
    +}
    +
    +.icon-circle-arrow-left {
    +  background-position: -264px -144px;
    +}
    +
    +.icon-circle-arrow-up {
    +  background-position: -288px -144px;
    +}
    +
    +.icon-circle-arrow-down {
    +  background-position: -312px -144px;
    +}
    +
    +.icon-globe {
    +  background-position: -336px -144px;
    +}
    +
    +.icon-wrench {
    +  background-position: -360px -144px;
    +}
    +
    +.icon-tasks {
    +  background-position: -384px -144px;
    +}
    +
    +.icon-filter {
    +  background-position: -408px -144px;
    +}
    +
    +.icon-briefcase {
    +  background-position: -432px -144px;
    +}
    +
    +.icon-fullscreen {
    +  background-position: -456px -144px;
    +}
    +
    +.dropup,
    +.dropdown {
    +  position: relative;
    +}
    +
    +.dropdown-toggle {
    +  *margin-bottom: -3px;
    +}
    +
    +.dropdown-toggle:active,
    +.open .dropdown-toggle {
    +  outline: 0;
    +}
    +
    +.caret {
    +  display: inline-block;
    +  width: 0;
    +  height: 0;
    +  vertical-align: top;
    +  border-top: 4px solid #000000;
    +  border-right: 4px solid transparent;
    +  border-left: 4px solid transparent;
    +  content: "";
    +}
    +
    +.dropdown .caret {
    +  margin-top: 8px;
    +  margin-left: 2px;
    +}
    +
    +.dropdown-menu {
    +  position: absolute;
    +  top: 100%;
    +  left: 0;
    +  z-index: 1000;
    +  display: none;
    +  float: left;
    +  min-width: 160px;
    +  padding: 5px 0;
    +  margin: 2px 0 0;
    +  list-style: none;
    +  background-color: #ffffff;
    +  border: 1px solid #ccc;
    +  border: 1px solid rgba(0, 0, 0, 0.2);
    +  *border-right-width: 2px;
    +  *border-bottom-width: 2px;
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    +     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    +          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    +  -webkit-background-clip: padding-box;
    +     -moz-background-clip: padding;
    +          background-clip: padding-box;
    +}
    +
    +.dropdown-menu.pull-right {
    +  right: 0;
    +  left: auto;
    +}
    +
    +.dropdown-menu .divider {
    +  *width: 100%;
    +  height: 1px;
    +  margin: 9px 1px;
    +  *margin: -5px 0 5px;
    +  overflow: hidden;
    +  background-color: #e5e5e5;
    +  border-bottom: 1px solid #ffffff;
    +}
    +
    +.dropdown-menu > li > a {
    +  display: block;
    +  padding: 3px 20px;
    +  clear: both;
    +  font-weight: normal;
    +  line-height: 20px;
    +  color: #333333;
    +  white-space: nowrap;
    +}
    +
    +.dropdown-menu > li > a:hover,
    +.dropdown-menu > li > a:focus,
    +.dropdown-submenu:hover > a,
    +.dropdown-submenu:focus > a {
    +  color: #ffffff;
    +  text-decoration: none;
    +  background-color: #0081c2;
    +  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
    +  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
    +  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
    +  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
    +}
    +
    +.dropdown-menu > .active > a,
    +.dropdown-menu > .active > a:hover,
    +.dropdown-menu > .active > a:focus {
    +  color: #ffffff;
    +  text-decoration: none;
    +  background-color: #0081c2;
    +  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
    +  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
    +  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
    +  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
    +  background-repeat: repeat-x;
    +  outline: 0;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
    +}
    +
    +.dropdown-menu > .disabled > a,
    +.dropdown-menu > .disabled > a:hover,
    +.dropdown-menu > .disabled > a:focus {
    +  color: #999999;
    +}
    +
    +.dropdown-menu > .disabled > a:hover,
    +.dropdown-menu > .disabled > a:focus {
    +  text-decoration: none;
    +  cursor: default;
    +  background-color: transparent;
    +  background-image: none;
    +  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
    +}
    +
    +.open {
    +  *z-index: 1000;
    +}
    +
    +.open > .dropdown-menu {
    +  display: block;
    +}
    +
    +.pull-right > .dropdown-menu {
    +  right: 0;
    +  left: auto;
    +}
    +
    +.dropup .caret,
    +.navbar-fixed-bottom .dropdown .caret {
    +  border-top: 0;
    +  border-bottom: 4px solid #000000;
    +  content: "";
    +}
    +
    +.dropup .dropdown-menu,
    +.navbar-fixed-bottom .dropdown .dropdown-menu {
    +  top: auto;
    +  bottom: 100%;
    +  margin-bottom: 1px;
    +}
    +
    +.dropdown-submenu {
    +  position: relative;
    +}
    +
    +.dropdown-submenu > .dropdown-menu {
    +  top: 0;
    +  left: 100%;
    +  margin-top: -6px;
    +  margin-left: -1px;
    +  -webkit-border-radius: 0 6px 6px 6px;
    +     -moz-border-radius: 0 6px 6px 6px;
    +          border-radius: 0 6px 6px 6px;
    +}
    +
    +.dropdown-submenu:hover > .dropdown-menu {
    +  display: block;
    +}
    +
    +.dropup .dropdown-submenu > .dropdown-menu {
    +  top: auto;
    +  bottom: 0;
    +  margin-top: 0;
    +  margin-bottom: -2px;
    +  -webkit-border-radius: 5px 5px 5px 0;
    +     -moz-border-radius: 5px 5px 5px 0;
    +          border-radius: 5px 5px 5px 0;
    +}
    +
    +.dropdown-submenu > a:after {
    +  display: block;
    +  float: right;
    +  width: 0;
    +  height: 0;
    +  margin-top: 5px;
    +  margin-right: -10px;
    +  border-color: transparent;
    +  border-left-color: #cccccc;
    +  border-style: solid;
    +  border-width: 5px 0 5px 5px;
    +  content: " ";
    +}
    +
    +.dropdown-submenu:hover > a:after {
    +  border-left-color: #ffffff;
    +}
    +
    +.dropdown-submenu.pull-left {
    +  float: none;
    +}
    +
    +.dropdown-submenu.pull-left > .dropdown-menu {
    +  left: -100%;
    +  margin-left: 10px;
    +  -webkit-border-radius: 6px 0 6px 6px;
    +     -moz-border-radius: 6px 0 6px 6px;
    +          border-radius: 6px 0 6px 6px;
    +}
    +
    +.dropdown .dropdown-menu .nav-header {
    +  padding-right: 20px;
    +  padding-left: 20px;
    +}
    +
    +.typeahead {
    +  z-index: 1051;
    +  margin-top: 2px;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +.well {
    +  min-height: 20px;
    +  padding: 19px;
    +  margin-bottom: 20px;
    +  background-color: #f5f5f5;
    +  border: 1px solid #e3e3e3;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
    +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
    +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
    +}
    +
    +.well blockquote {
    +  border-color: #ddd;
    +  border-color: rgba(0, 0, 0, 0.15);
    +}
    +
    +.well-large {
    +  padding: 24px;
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +}
    +
    +.well-small {
    +  padding: 9px;
    +  -webkit-border-radius: 3px;
    +     -moz-border-radius: 3px;
    +          border-radius: 3px;
    +}
    +
    +.fade {
    +  opacity: 0;
    +  -webkit-transition: opacity 0.15s linear;
    +     -moz-transition: opacity 0.15s linear;
    +       -o-transition: opacity 0.15s linear;
    +          transition: opacity 0.15s linear;
    +}
    +
    +.fade.in {
    +  opacity: 1;
    +}
    +
    +.collapse {
    +  position: relative;
    +  height: 0;
    +  overflow: hidden;
    +  -webkit-transition: height 0.35s ease;
    +     -moz-transition: height 0.35s ease;
    +       -o-transition: height 0.35s ease;
    +          transition: height 0.35s ease;
    +}
    +
    +.collapse.in {
    +  height: auto;
    +}
    +
    +.close {
    +  float: right;
    +  font-size: 20px;
    +  font-weight: bold;
    +  line-height: 20px;
    +  color: #000000;
    +  text-shadow: 0 1px 0 #ffffff;
    +  opacity: 0.2;
    +  filter: alpha(opacity=20);
    +}
    +
    +.close:hover,
    +.close:focus {
    +  color: #000000;
    +  text-decoration: none;
    +  cursor: pointer;
    +  opacity: 0.4;
    +  filter: alpha(opacity=40);
    +}
    +
    +button.close {
    +  padding: 0;
    +  cursor: pointer;
    +  background: transparent;
    +  border: 0;
    +  -webkit-appearance: none;
    +}
    +
    +.btn {
    +  display: inline-block;
    +  *display: inline;
    +  padding: 4px 12px;
    +  margin-bottom: 0;
    +  *margin-left: .3em;
    +  font-size: 14px;
    +  line-height: 20px;
    +  color: #333333;
    +  text-align: center;
    +  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
    +  vertical-align: middle;
    +  cursor: pointer;
    +  background-color: #f5f5f5;
    +  *background-color: #e6e6e6;
    +  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
    +  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
    +  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
    +  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
    +  background-repeat: repeat-x;
    +  border: 1px solid #cccccc;
    +  *border: 0;
    +  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  border-bottom-color: #b3b3b3;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
    +  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
    +  *zoom: 1;
    +  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    +     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    +          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    +}
    +
    +.btn:hover,
    +.btn:focus,
    +.btn:active,
    +.btn.active,
    +.btn.disabled,
    +.btn[disabled] {
    +  color: #333333;
    +  background-color: #e6e6e6;
    +  *background-color: #d9d9d9;
    +}
    +
    +.btn:active,
    +.btn.active {
    +  background-color: #cccccc \9;
    +}
    +
    +.btn:first-child {
    +  *margin-left: 0;
    +}
    +
    +.btn:hover,
    +.btn:focus {
    +  color: #333333;
    +  text-decoration: none;
    +  background-position: 0 -15px;
    +  -webkit-transition: background-position 0.1s linear;
    +     -moz-transition: background-position 0.1s linear;
    +       -o-transition: background-position 0.1s linear;
    +          transition: background-position 0.1s linear;
    +}
    +
    +.btn:focus {
    +  outline: thin dotted #333;
    +  outline: 5px auto -webkit-focus-ring-color;
    +  outline-offset: -2px;
    +}
    +
    +.btn.active,
    +.btn:active {
    +  background-image: none;
    +  outline: 0;
    +  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    +     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    +          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    +}
    +
    +.btn.disabled,
    +.btn[disabled] {
    +  cursor: default;
    +  background-image: none;
    +  opacity: 0.65;
    +  filter: alpha(opacity=65);
    +  -webkit-box-shadow: none;
    +     -moz-box-shadow: none;
    +          box-shadow: none;
    +}
    +
    +.btn-large {
    +  padding: 11px 19px;
    +  font-size: 17.5px;
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +}
    +
    +.btn-large [class^="icon-"],
    +.btn-large [class*=" icon-"] {
    +  margin-top: 4px;
    +}
    +
    +.btn-small {
    +  padding: 2px 10px;
    +  font-size: 11.9px;
    +  -webkit-border-radius: 3px;
    +     -moz-border-radius: 3px;
    +          border-radius: 3px;
    +}
    +
    +.btn-small [class^="icon-"],
    +.btn-small [class*=" icon-"] {
    +  margin-top: 0;
    +}
    +
    +.btn-mini [class^="icon-"],
    +.btn-mini [class*=" icon-"] {
    +  margin-top: -1px;
    +}
    +
    +.btn-mini {
    +  padding: 0 6px;
    +  font-size: 10.5px;
    +  -webkit-border-radius: 3px;
    +     -moz-border-radius: 3px;
    +          border-radius: 3px;
    +}
    +
    +.btn-block {
    +  display: block;
    +  width: 100%;
    +  padding-right: 0;
    +  padding-left: 0;
    +  -webkit-box-sizing: border-box;
    +     -moz-box-sizing: border-box;
    +          box-sizing: border-box;
    +}
    +
    +.btn-block + .btn-block {
    +  margin-top: 5px;
    +}
    +
    +input[type="submit"].btn-block,
    +input[type="reset"].btn-block,
    +input[type="button"].btn-block {
    +  width: 100%;
    +}
    +
    +.btn-primary.active,
    +.btn-warning.active,
    +.btn-danger.active,
    +.btn-success.active,
    +.btn-info.active,
    +.btn-inverse.active {
    +  color: rgba(255, 255, 255, 0.75);
    +}
    +
    +.btn-primary {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #006dcc;
    +  *background-color: #0044cc;
    +  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
    +  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
    +  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
    +  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
    +  background-repeat: repeat-x;
    +  border-color: #0044cc #0044cc #002a80;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
    +  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
    +}
    +
    +.btn-primary:hover,
    +.btn-primary:focus,
    +.btn-primary:active,
    +.btn-primary.active,
    +.btn-primary.disabled,
    +.btn-primary[disabled] {
    +  color: #ffffff;
    +  background-color: #0044cc;
    +  *background-color: #003bb3;
    +}
    +
    +.btn-primary:active,
    +.btn-primary.active {
    +  background-color: #003399 \9;
    +}
    +
    +.btn-warning {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #faa732;
    +  *background-color: #f89406;
    +  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
    +  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
    +  background-image: -o-linear-gradient(top, #fbb450, #f89406);
    +  background-image: linear-gradient(to bottom, #fbb450, #f89406);
    +  background-repeat: repeat-x;
    +  border-color: #f89406 #f89406 #ad6704;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
    +  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
    +}
    +
    +.btn-warning:hover,
    +.btn-warning:focus,
    +.btn-warning:active,
    +.btn-warning.active,
    +.btn-warning.disabled,
    +.btn-warning[disabled] {
    +  color: #ffffff;
    +  background-color: #f89406;
    +  *background-color: #df8505;
    +}
    +
    +.btn-warning:active,
    +.btn-warning.active {
    +  background-color: #c67605 \9;
    +}
    +
    +.btn-danger {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #da4f49;
    +  *background-color: #bd362f;
    +  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
    +  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
    +  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
    +  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
    +  background-repeat: repeat-x;
    +  border-color: #bd362f #bd362f #802420;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
    +  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
    +}
    +
    +.btn-danger:hover,
    +.btn-danger:focus,
    +.btn-danger:active,
    +.btn-danger.active,
    +.btn-danger.disabled,
    +.btn-danger[disabled] {
    +  color: #ffffff;
    +  background-color: #bd362f;
    +  *background-color: #a9302a;
    +}
    +
    +.btn-danger:active,
    +.btn-danger.active {
    +  background-color: #942a25 \9;
    +}
    +
    +.btn-success {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #5bb75b;
    +  *background-color: #51a351;
    +  background-image: -moz-linear-gradient(top, #62c462, #51a351);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
    +  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
    +  background-image: -o-linear-gradient(top, #62c462, #51a351);
    +  background-image: linear-gradient(to bottom, #62c462, #51a351);
    +  background-repeat: repeat-x;
    +  border-color: #51a351 #51a351 #387038;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
    +  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
    +}
    +
    +.btn-success:hover,
    +.btn-success:focus,
    +.btn-success:active,
    +.btn-success.active,
    +.btn-success.disabled,
    +.btn-success[disabled] {
    +  color: #ffffff;
    +  background-color: #51a351;
    +  *background-color: #499249;
    +}
    +
    +.btn-success:active,
    +.btn-success.active {
    +  background-color: #408140 \9;
    +}
    +
    +.btn-info {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #49afcd;
    +  *background-color: #2f96b4;
    +  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
    +  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
    +  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
    +  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
    +  background-repeat: repeat-x;
    +  border-color: #2f96b4 #2f96b4 #1f6377;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
    +  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
    +}
    +
    +.btn-info:hover,
    +.btn-info:focus,
    +.btn-info:active,
    +.btn-info.active,
    +.btn-info.disabled,
    +.btn-info[disabled] {
    +  color: #ffffff;
    +  background-color: #2f96b4;
    +  *background-color: #2a85a0;
    +}
    +
    +.btn-info:active,
    +.btn-info.active {
    +  background-color: #24748c \9;
    +}
    +
    +.btn-inverse {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #363636;
    +  *background-color: #222222;
    +  background-image: -moz-linear-gradient(top, #444444, #222222);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
    +  background-image: -webkit-linear-gradient(top, #444444, #222222);
    +  background-image: -o-linear-gradient(top, #444444, #222222);
    +  background-image: linear-gradient(to bottom, #444444, #222222);
    +  background-repeat: repeat-x;
    +  border-color: #222222 #222222 #000000;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
    +  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
    +}
    +
    +.btn-inverse:hover,
    +.btn-inverse:focus,
    +.btn-inverse:active,
    +.btn-inverse.active,
    +.btn-inverse.disabled,
    +.btn-inverse[disabled] {
    +  color: #ffffff;
    +  background-color: #222222;
    +  *background-color: #151515;
    +}
    +
    +.btn-inverse:active,
    +.btn-inverse.active {
    +  background-color: #080808 \9;
    +}
    +
    +button.btn,
    +input[type="submit"].btn {
    +  *padding-top: 3px;
    +  *padding-bottom: 3px;
    +}
    +
    +button.btn::-moz-focus-inner,
    +input[type="submit"].btn::-moz-focus-inner {
    +  padding: 0;
    +  border: 0;
    +}
    +
    +button.btn.btn-large,
    +input[type="submit"].btn.btn-large {
    +  *padding-top: 7px;
    +  *padding-bottom: 7px;
    +}
    +
    +button.btn.btn-small,
    +input[type="submit"].btn.btn-small {
    +  *padding-top: 3px;
    +  *padding-bottom: 3px;
    +}
    +
    +button.btn.btn-mini,
    +input[type="submit"].btn.btn-mini {
    +  *padding-top: 1px;
    +  *padding-bottom: 1px;
    +}
    +
    +.btn-link,
    +.btn-link:active,
    +.btn-link[disabled] {
    +  background-color: transparent;
    +  background-image: none;
    +  -webkit-box-shadow: none;
    +     -moz-box-shadow: none;
    +          box-shadow: none;
    +}
    +
    +.btn-link {
    +  color: #0088cc;
    +  cursor: pointer;
    +  border-color: transparent;
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.btn-link:hover,
    +.btn-link:focus {
    +  color: #005580;
    +  text-decoration: underline;
    +  background-color: transparent;
    +}
    +
    +.btn-link[disabled]:hover,
    +.btn-link[disabled]:focus {
    +  color: #333333;
    +  text-decoration: none;
    +}
    +
    +.btn-group {
    +  position: relative;
    +  display: inline-block;
    +  *display: inline;
    +  *margin-left: .3em;
    +  font-size: 0;
    +  white-space: nowrap;
    +  vertical-align: middle;
    +  *zoom: 1;
    +}
    +
    +.btn-group:first-child {
    +  *margin-left: 0;
    +}
    +
    +.btn-group + .btn-group {
    +  margin-left: 5px;
    +}
    +
    +.btn-toolbar {
    +  margin-top: 10px;
    +  margin-bottom: 10px;
    +  font-size: 0;
    +}
    +
    +.btn-toolbar > .btn + .btn,
    +.btn-toolbar > .btn-group + .btn,
    +.btn-toolbar > .btn + .btn-group {
    +  margin-left: 5px;
    +}
    +
    +.btn-group > .btn {
    +  position: relative;
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.btn-group > .btn + .btn {
    +  margin-left: -1px;
    +}
    +
    +.btn-group > .btn,
    +.btn-group > .dropdown-menu,
    +.btn-group > .popover {
    +  font-size: 14px;
    +}
    +
    +.btn-group > .btn-mini {
    +  font-size: 10.5px;
    +}
    +
    +.btn-group > .btn-small {
    +  font-size: 11.9px;
    +}
    +
    +.btn-group > .btn-large {
    +  font-size: 17.5px;
    +}
    +
    +.btn-group > .btn:first-child {
    +  margin-left: 0;
    +  -webkit-border-bottom-left-radius: 4px;
    +          border-bottom-left-radius: 4px;
    +  -webkit-border-top-left-radius: 4px;
    +          border-top-left-radius: 4px;
    +  -moz-border-radius-bottomleft: 4px;
    +  -moz-border-radius-topleft: 4px;
    +}
    +
    +.btn-group > .btn:last-child,
    +.btn-group > .dropdown-toggle {
    +  -webkit-border-top-right-radius: 4px;
    +          border-top-right-radius: 4px;
    +  -webkit-border-bottom-right-radius: 4px;
    +          border-bottom-right-radius: 4px;
    +  -moz-border-radius-topright: 4px;
    +  -moz-border-radius-bottomright: 4px;
    +}
    +
    +.btn-group > .btn.large:first-child {
    +  margin-left: 0;
    +  -webkit-border-bottom-left-radius: 6px;
    +          border-bottom-left-radius: 6px;
    +  -webkit-border-top-left-radius: 6px;
    +          border-top-left-radius: 6px;
    +  -moz-border-radius-bottomleft: 6px;
    +  -moz-border-radius-topleft: 6px;
    +}
    +
    +.btn-group > .btn.large:last-child,
    +.btn-group > .large.dropdown-toggle {
    +  -webkit-border-top-right-radius: 6px;
    +          border-top-right-radius: 6px;
    +  -webkit-border-bottom-right-radius: 6px;
    +          border-bottom-right-radius: 6px;
    +  -moz-border-radius-topright: 6px;
    +  -moz-border-radius-bottomright: 6px;
    +}
    +
    +.btn-group > .btn:hover,
    +.btn-group > .btn:focus,
    +.btn-group > .btn:active,
    +.btn-group > .btn.active {
    +  z-index: 2;
    +}
    +
    +.btn-group .dropdown-toggle:active,
    +.btn-group.open .dropdown-toggle {
    +  outline: 0;
    +}
    +
    +.btn-group > .btn + .dropdown-toggle {
    +  *padding-top: 5px;
    +  padding-right: 8px;
    +  *padding-bottom: 5px;
    +  padding-left: 8px;
    +  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    +     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    +          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    +}
    +
    +.btn-group > .btn-mini + .dropdown-toggle {
    +  *padding-top: 2px;
    +  padding-right: 5px;
    +  *padding-bottom: 2px;
    +  padding-left: 5px;
    +}
    +
    +.btn-group > .btn-small + .dropdown-toggle {
    +  *padding-top: 5px;
    +  *padding-bottom: 4px;
    +}
    +
    +.btn-group > .btn-large + .dropdown-toggle {
    +  *padding-top: 7px;
    +  padding-right: 12px;
    +  *padding-bottom: 7px;
    +  padding-left: 12px;
    +}
    +
    +.btn-group.open .dropdown-toggle {
    +  background-image: none;
    +  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    +     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    +          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    +}
    +
    +.btn-group.open .btn.dropdown-toggle {
    +  background-color: #e6e6e6;
    +}
    +
    +.btn-group.open .btn-primary.dropdown-toggle {
    +  background-color: #0044cc;
    +}
    +
    +.btn-group.open .btn-warning.dropdown-toggle {
    +  background-color: #f89406;
    +}
    +
    +.btn-group.open .btn-danger.dropdown-toggle {
    +  background-color: #bd362f;
    +}
    +
    +.btn-group.open .btn-success.dropdown-toggle {
    +  background-color: #51a351;
    +}
    +
    +.btn-group.open .btn-info.dropdown-toggle {
    +  background-color: #2f96b4;
    +}
    +
    +.btn-group.open .btn-inverse.dropdown-toggle {
    +  background-color: #222222;
    +}
    +
    +.btn .caret {
    +  margin-top: 8px;
    +  margin-left: 0;
    +}
    +
    +.btn-large .caret {
    +  margin-top: 6px;
    +}
    +
    +.btn-large .caret {
    +  border-top-width: 5px;
    +  border-right-width: 5px;
    +  border-left-width: 5px;
    +}
    +
    +.btn-mini .caret,
    +.btn-small .caret {
    +  margin-top: 8px;
    +}
    +
    +.dropup .btn-large .caret {
    +  border-bottom-width: 5px;
    +}
    +
    +.btn-primary .caret,
    +.btn-warning .caret,
    +.btn-danger .caret,
    +.btn-info .caret,
    +.btn-success .caret,
    +.btn-inverse .caret {
    +  border-top-color: #ffffff;
    +  border-bottom-color: #ffffff;
    +}
    +
    +.btn-group-vertical {
    +  display: inline-block;
    +  *display: inline;
    +  /* IE7 inline-block hack */
    +
    +  *zoom: 1;
    +}
    +
    +.btn-group-vertical > .btn {
    +  display: block;
    +  float: none;
    +  max-width: 100%;
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.btn-group-vertical > .btn + .btn {
    +  margin-top: -1px;
    +  margin-left: 0;
    +}
    +
    +.btn-group-vertical > .btn:first-child {
    +  -webkit-border-radius: 4px 4px 0 0;
    +     -moz-border-radius: 4px 4px 0 0;
    +          border-radius: 4px 4px 0 0;
    +}
    +
    +.btn-group-vertical > .btn:last-child {
    +  -webkit-border-radius: 0 0 4px 4px;
    +     -moz-border-radius: 0 0 4px 4px;
    +          border-radius: 0 0 4px 4px;
    +}
    +
    +.btn-group-vertical > .btn-large:first-child {
    +  -webkit-border-radius: 6px 6px 0 0;
    +     -moz-border-radius: 6px 6px 0 0;
    +          border-radius: 6px 6px 0 0;
    +}
    +
    +.btn-group-vertical > .btn-large:last-child {
    +  -webkit-border-radius: 0 0 6px 6px;
    +     -moz-border-radius: 0 0 6px 6px;
    +          border-radius: 0 0 6px 6px;
    +}
    +
    +.alert {
    +  padding: 8px 35px 8px 14px;
    +  margin-bottom: 20px;
    +  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
    +  background-color: #fcf8e3;
    +  border: 1px solid #fbeed5;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +.alert,
    +.alert h4 {
    +  color: #c09853;
    +}
    +
    +.alert h4 {
    +  margin: 0;
    +}
    +
    +.alert .close {
    +  position: relative;
    +  top: -2px;
    +  right: -21px;
    +  line-height: 20px;
    +}
    +
    +.alert-success {
    +  color: #468847;
    +  background-color: #dff0d8;
    +  border-color: #d6e9c6;
    +}
    +
    +.alert-success h4 {
    +  color: #468847;
    +}
    +
    +.alert-danger,
    +.alert-error {
    +  color: #b94a48;
    +  background-color: #f2dede;
    +  border-color: #eed3d7;
    +}
    +
    +.alert-danger h4,
    +.alert-error h4 {
    +  color: #b94a48;
    +}
    +
    +.alert-info {
    +  color: #3a87ad;
    +  background-color: #d9edf7;
    +  border-color: #bce8f1;
    +}
    +
    +.alert-info h4 {
    +  color: #3a87ad;
    +}
    +
    +.alert-block {
    +  padding-top: 14px;
    +  padding-bottom: 14px;
    +}
    +
    +.alert-block > p,
    +.alert-block > ul {
    +  margin-bottom: 0;
    +}
    +
    +.alert-block p + p {
    +  margin-top: 5px;
    +}
    +
    +.nav {
    +  margin-bottom: 20px;
    +  margin-left: 0;
    +  list-style: none;
    +}
    +
    +.nav > li > a {
    +  display: block;
    +}
    +
    +.nav > li > a:hover,
    +.nav > li > a:focus {
    +  text-decoration: none;
    +  background-color: #eeeeee;
    +}
    +
    +.nav > li > a > img {
    +  max-width: none;
    +}
    +
    +.nav > .pull-right {
    +  float: right;
    +}
    +
    +.nav-header {
    +  display: block;
    +  padding: 3px 15px;
    +  font-size: 11px;
    +  font-weight: bold;
    +  line-height: 20px;
    +  color: #999999;
    +  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
    +  text-transform: uppercase;
    +}
    +
    +.nav li + .nav-header {
    +  margin-top: 9px;
    +}
    +
    +.nav-list {
    +  padding-right: 15px;
    +  padding-left: 15px;
    +  margin-bottom: 0;
    +}
    +
    +.nav-list > li > a,
    +.nav-list .nav-header {
    +  margin-right: -15px;
    +  margin-left: -15px;
    +  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
    +}
    +
    +.nav-list > li > a {
    +  padding: 3px 15px;
    +}
    +
    +.nav-list > .active > a,
    +.nav-list > .active > a:hover,
    +.nav-list > .active > a:focus {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
    +  background-color: #0088cc;
    +}
    +
    +.nav-list [class^="icon-"],
    +.nav-list [class*=" icon-"] {
    +  margin-right: 2px;
    +}
    +
    +.nav-list .divider {
    +  *width: 100%;
    +  height: 1px;
    +  margin: 9px 1px;
    +  *margin: -5px 0 5px;
    +  overflow: hidden;
    +  background-color: #e5e5e5;
    +  border-bottom: 1px solid #ffffff;
    +}
    +
    +.nav-tabs,
    +.nav-pills {
    +  *zoom: 1;
    +}
    +
    +.nav-tabs:before,
    +.nav-pills:before,
    +.nav-tabs:after,
    +.nav-pills:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.nav-tabs:after,
    +.nav-pills:after {
    +  clear: both;
    +}
    +
    +.nav-tabs > li,
    +.nav-pills > li {
    +  float: left;
    +}
    +
    +.nav-tabs > li > a,
    +.nav-pills > li > a {
    +  padding-right: 12px;
    +  padding-left: 12px;
    +  margin-right: 2px;
    +  line-height: 14px;
    +}
    +
    +.nav-tabs {
    +  border-bottom: 1px solid #ddd;
    +}
    +
    +.nav-tabs > li {
    +  margin-bottom: -1px;
    +}
    +
    +.nav-tabs > li > a {
    +  padding-top: 8px;
    +  padding-bottom: 8px;
    +  line-height: 20px;
    +  border: 1px solid transparent;
    +  -webkit-border-radius: 4px 4px 0 0;
    +     -moz-border-radius: 4px 4px 0 0;
    +          border-radius: 4px 4px 0 0;
    +}
    +
    +.nav-tabs > li > a:hover,
    +.nav-tabs > li > a:focus {
    +  border-color: #eeeeee #eeeeee #dddddd;
    +}
    +
    +.nav-tabs > .active > a,
    +.nav-tabs > .active > a:hover,
    +.nav-tabs > .active > a:focus {
    +  color: #555555;
    +  cursor: default;
    +  background-color: #ffffff;
    +  border: 1px solid #ddd;
    +  border-bottom-color: transparent;
    +}
    +
    +.nav-pills > li > a {
    +  padding-top: 8px;
    +  padding-bottom: 8px;
    +  margin-top: 2px;
    +  margin-bottom: 2px;
    +  -webkit-border-radius: 5px;
    +     -moz-border-radius: 5px;
    +          border-radius: 5px;
    +}
    +
    +.nav-pills > .active > a,
    +.nav-pills > .active > a:hover,
    +.nav-pills > .active > a:focus {
    +  color: #ffffff;
    +  background-color: #0088cc;
    +}
    +
    +.nav-stacked > li {
    +  float: none;
    +}
    +
    +.nav-stacked > li > a {
    +  margin-right: 0;
    +}
    +
    +.nav-tabs.nav-stacked {
    +  border-bottom: 0;
    +}
    +
    +.nav-tabs.nav-stacked > li > a {
    +  border: 1px solid #ddd;
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.nav-tabs.nav-stacked > li:first-child > a {
    +  -webkit-border-top-right-radius: 4px;
    +          border-top-right-radius: 4px;
    +  -webkit-border-top-left-radius: 4px;
    +          border-top-left-radius: 4px;
    +  -moz-border-radius-topright: 4px;
    +  -moz-border-radius-topleft: 4px;
    +}
    +
    +.nav-tabs.nav-stacked > li:last-child > a {
    +  -webkit-border-bottom-right-radius: 4px;
    +          border-bottom-right-radius: 4px;
    +  -webkit-border-bottom-left-radius: 4px;
    +          border-bottom-left-radius: 4px;
    +  -moz-border-radius-bottomright: 4px;
    +  -moz-border-radius-bottomleft: 4px;
    +}
    +
    +.nav-tabs.nav-stacked > li > a:hover,
    +.nav-tabs.nav-stacked > li > a:focus {
    +  z-index: 2;
    +  border-color: #ddd;
    +}
    +
    +.nav-pills.nav-stacked > li > a {
    +  margin-bottom: 3px;
    +}
    +
    +.nav-pills.nav-stacked > li:last-child > a {
    +  margin-bottom: 1px;
    +}
    +
    +.nav-tabs .dropdown-menu {
    +  -webkit-border-radius: 0 0 6px 6px;
    +     -moz-border-radius: 0 0 6px 6px;
    +          border-radius: 0 0 6px 6px;
    +}
    +
    +.nav-pills .dropdown-menu {
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +}
    +
    +.nav .dropdown-toggle .caret {
    +  margin-top: 6px;
    +  border-top-color: #0088cc;
    +  border-bottom-color: #0088cc;
    +}
    +
    +.nav .dropdown-toggle:hover .caret,
    +.nav .dropdown-toggle:focus .caret {
    +  border-top-color: #005580;
    +  border-bottom-color: #005580;
    +}
    +
    +/* move down carets for tabs */
    +
    +.nav-tabs .dropdown-toggle .caret {
    +  margin-top: 8px;
    +}
    +
    +.nav .active .dropdown-toggle .caret {
    +  border-top-color: #fff;
    +  border-bottom-color: #fff;
    +}
    +
    +.nav-tabs .active .dropdown-toggle .caret {
    +  border-top-color: #555555;
    +  border-bottom-color: #555555;
    +}
    +
    +.nav > .dropdown.active > a:hover,
    +.nav > .dropdown.active > a:focus {
    +  cursor: pointer;
    +}
    +
    +.nav-tabs .open .dropdown-toggle,
    +.nav-pills .open .dropdown-toggle,
    +.nav > li.dropdown.open.active > a:hover,
    +.nav > li.dropdown.open.active > a:focus {
    +  color: #ffffff;
    +  background-color: #999999;
    +  border-color: #999999;
    +}
    +
    +.nav li.dropdown.open .caret,
    +.nav li.dropdown.open.active .caret,
    +.nav li.dropdown.open a:hover .caret,
    +.nav li.dropdown.open a:focus .caret {
    +  border-top-color: #ffffff;
    +  border-bottom-color: #ffffff;
    +  opacity: 1;
    +  filter: alpha(opacity=100);
    +}
    +
    +.tabs-stacked .open > a:hover,
    +.tabs-stacked .open > a:focus {
    +  border-color: #999999;
    +}
    +
    +.tabbable {
    +  *zoom: 1;
    +}
    +
    +.tabbable:before,
    +.tabbable:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.tabbable:after {
    +  clear: both;
    +}
    +
    +.tab-content {
    +  overflow: auto;
    +}
    +
    +.tabs-below > .nav-tabs,
    +.tabs-right > .nav-tabs,
    +.tabs-left > .nav-tabs {
    +  border-bottom: 0;
    +}
    +
    +.tab-content > .tab-pane,
    +.pill-content > .pill-pane {
    +  display: none;
    +}
    +
    +.tab-content > .active,
    +.pill-content > .active {
    +  display: block;
    +}
    +
    +.tabs-below > .nav-tabs {
    +  border-top: 1px solid #ddd;
    +}
    +
    +.tabs-below > .nav-tabs > li {
    +  margin-top: -1px;
    +  margin-bottom: 0;
    +}
    +
    +.tabs-below > .nav-tabs > li > a {
    +  -webkit-border-radius: 0 0 4px 4px;
    +     -moz-border-radius: 0 0 4px 4px;
    +          border-radius: 0 0 4px 4px;
    +}
    +
    +.tabs-below > .nav-tabs > li > a:hover,
    +.tabs-below > .nav-tabs > li > a:focus {
    +  border-top-color: #ddd;
    +  border-bottom-color: transparent;
    +}
    +
    +.tabs-below > .nav-tabs > .active > a,
    +.tabs-below > .nav-tabs > .active > a:hover,
    +.tabs-below > .nav-tabs > .active > a:focus {
    +  border-color: transparent #ddd #ddd #ddd;
    +}
    +
    +.tabs-left > .nav-tabs > li,
    +.tabs-right > .nav-tabs > li {
    +  float: none;
    +}
    +
    +.tabs-left > .nav-tabs > li > a,
    +.tabs-right > .nav-tabs > li > a {
    +  min-width: 74px;
    +  margin-right: 0;
    +  margin-bottom: 3px;
    +}
    +
    +.tabs-left > .nav-tabs {
    +  float: left;
    +  margin-right: 19px;
    +  border-right: 1px solid #ddd;
    +}
    +
    +.tabs-left > .nav-tabs > li > a {
    +  margin-right: -1px;
    +  -webkit-border-radius: 4px 0 0 4px;
    +     -moz-border-radius: 4px 0 0 4px;
    +          border-radius: 4px 0 0 4px;
    +}
    +
    +.tabs-left > .nav-tabs > li > a:hover,
    +.tabs-left > .nav-tabs > li > a:focus {
    +  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
    +}
    +
    +.tabs-left > .nav-tabs .active > a,
    +.tabs-left > .nav-tabs .active > a:hover,
    +.tabs-left > .nav-tabs .active > a:focus {
    +  border-color: #ddd transparent #ddd #ddd;
    +  *border-right-color: #ffffff;
    +}
    +
    +.tabs-right > .nav-tabs {
    +  float: right;
    +  margin-left: 19px;
    +  border-left: 1px solid #ddd;
    +}
    +
    +.tabs-right > .nav-tabs > li > a {
    +  margin-left: -1px;
    +  -webkit-border-radius: 0 4px 4px 0;
    +     -moz-border-radius: 0 4px 4px 0;
    +          border-radius: 0 4px 4px 0;
    +}
    +
    +.tabs-right > .nav-tabs > li > a:hover,
    +.tabs-right > .nav-tabs > li > a:focus {
    +  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
    +}
    +
    +.tabs-right > .nav-tabs .active > a,
    +.tabs-right > .nav-tabs .active > a:hover,
    +.tabs-right > .nav-tabs .active > a:focus {
    +  border-color: #ddd #ddd #ddd transparent;
    +  *border-left-color: #ffffff;
    +}
    +
    +.nav > .disabled > a {
    +  color: #999999;
    +}
    +
    +.nav > .disabled > a:hover,
    +.nav > .disabled > a:focus {
    +  text-decoration: none;
    +  cursor: default;
    +  background-color: transparent;
    +}
    +
    +.navbar {
    +  *position: relative;
    +  *z-index: 2;
    +  margin-bottom: 20px;
    +  overflow: visible;
    +}
    +
    +.navbar-inner {
    +  min-height: 40px;
    +  padding-right: 20px;
    +  padding-left: 20px;
    +  background-color: #fafafa;
    +  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
    +  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
    +  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
    +  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
    +  background-repeat: repeat-x;
    +  border: 1px solid #d4d4d4;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
    +  *zoom: 1;
    +  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
    +     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
    +          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
    +}
    +
    +.navbar-inner:before,
    +.navbar-inner:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.navbar-inner:after {
    +  clear: both;
    +}
    +
    +.navbar .container {
    +  width: auto;
    +}
    +
    +.nav-collapse.collapse {
    +  height: auto;
    +  overflow: visible;
    +}
    +
    +.navbar .brand {
    +  display: block;
    +  float: left;
    +  padding: 10px 20px 10px;
    +  margin-left: -20px;
    +  font-size: 20px;
    +  font-weight: 200;
    +  color: #777777;
    +  text-shadow: 0 1px 0 #ffffff;
    +}
    +
    +.navbar .brand:hover,
    +.navbar .brand:focus {
    +  text-decoration: none;
    +}
    +
    +.navbar-text {
    +  margin-bottom: 0;
    +  line-height: 40px;
    +  color: #777777;
    +}
    +
    +.navbar-link {
    +  color: #777777;
    +}
    +
    +.navbar-link:hover,
    +.navbar-link:focus {
    +  color: #333333;
    +}
    +
    +.navbar .divider-vertical {
    +  height: 40px;
    +  margin: 0 9px;
    +  border-right: 1px solid #ffffff;
    +  border-left: 1px solid #f2f2f2;
    +}
    +
    +.navbar .btn,
    +.navbar .btn-group {
    +  margin-top: 5px;
    +}
    +
    +.navbar .btn-group .btn,
    +.navbar .input-prepend .btn,
    +.navbar .input-append .btn,
    +.navbar .input-prepend .btn-group,
    +.navbar .input-append .btn-group {
    +  margin-top: 0;
    +}
    +
    +.navbar-form {
    +  margin-bottom: 0;
    +  *zoom: 1;
    +}
    +
    +.navbar-form:before,
    +.navbar-form:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.navbar-form:after {
    +  clear: both;
    +}
    +
    +.navbar-form input,
    +.navbar-form select,
    +.navbar-form .radio,
    +.navbar-form .checkbox {
    +  margin-top: 5px;
    +}
    +
    +.navbar-form input,
    +.navbar-form select,
    +.navbar-form .btn {
    +  display: inline-block;
    +  margin-bottom: 0;
    +}
    +
    +.navbar-form input[type="image"],
    +.navbar-form input[type="checkbox"],
    +.navbar-form input[type="radio"] {
    +  margin-top: 3px;
    +}
    +
    +.navbar-form .input-append,
    +.navbar-form .input-prepend {
    +  margin-top: 5px;
    +  white-space: nowrap;
    +}
    +
    +.navbar-form .input-append input,
    +.navbar-form .input-prepend input {
    +  margin-top: 0;
    +}
    +
    +.navbar-search {
    +  position: relative;
    +  float: left;
    +  margin-top: 5px;
    +  margin-bottom: 0;
    +}
    +
    +.navbar-search .search-query {
    +  padding: 4px 14px;
    +  margin-bottom: 0;
    +  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    +  font-size: 13px;
    +  font-weight: normal;
    +  line-height: 1;
    +  -webkit-border-radius: 15px;
    +     -moz-border-radius: 15px;
    +          border-radius: 15px;
    +}
    +
    +.navbar-static-top {
    +  position: static;
    +  margin-bottom: 0;
    +}
    +
    +.navbar-static-top .navbar-inner {
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.navbar-fixed-top,
    +.navbar-fixed-bottom {
    +  position: fixed;
    +  right: 0;
    +  left: 0;
    +  z-index: 1030;
    +  margin-bottom: 0;
    +}
    +
    +.navbar-fixed-top .navbar-inner,
    +.navbar-static-top .navbar-inner {
    +  border-width: 0 0 1px;
    +}
    +
    +.navbar-fixed-bottom .navbar-inner {
    +  border-width: 1px 0 0;
    +}
    +
    +.navbar-fixed-top .navbar-inner,
    +.navbar-fixed-bottom .navbar-inner {
    +  padding-right: 0;
    +  padding-left: 0;
    +  -webkit-border-radius: 0;
    +     -moz-border-radius: 0;
    +          border-radius: 0;
    +}
    +
    +.navbar-static-top .container,
    +.navbar-fixed-top .container,
    +.navbar-fixed-bottom .container {
    +  width: 940px;
    +}
    +
    +.navbar-fixed-top {
    +  top: 0;
    +}
    +
    +.navbar-fixed-top .navbar-inner,
    +.navbar-static-top .navbar-inner {
    +  -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
    +     -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
    +          box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
    +}
    +
    +.navbar-fixed-bottom {
    +  bottom: 0;
    +}
    +
    +.navbar-fixed-bottom .navbar-inner {
    +  -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
    +     -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
    +          box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
    +}
    +
    +.navbar .nav {
    +  position: relative;
    +  left: 0;
    +  display: block;
    +  float: left;
    +  margin: 0 10px 0 0;
    +}
    +
    +.navbar .nav.pull-right {
    +  float: right;
    +  margin-right: 0;
    +}
    +
    +.navbar .nav > li {
    +  float: left;
    +}
    +
    +.navbar .nav > li > a {
    +  float: none;
    +  padding: 10px 15px 10px;
    +  color: #777777;
    +  text-decoration: none;
    +  text-shadow: 0 1px 0 #ffffff;
    +}
    +
    +.navbar .nav .dropdown-toggle .caret {
    +  margin-top: 8px;
    +}
    +
    +.navbar .nav > li > a:focus,
    +.navbar .nav > li > a:hover {
    +  color: #333333;
    +  text-decoration: none;
    +  background-color: transparent;
    +}
    +
    +.navbar .nav > .active > a,
    +.navbar .nav > .active > a:hover,
    +.navbar .nav > .active > a:focus {
    +  color: #555555;
    +  text-decoration: none;
    +  background-color: #e5e5e5;
    +  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
    +     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
    +          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
    +}
    +
    +.navbar .btn-navbar {
    +  display: none;
    +  float: right;
    +  padding: 7px 10px;
    +  margin-right: 5px;
    +  margin-left: 5px;
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #ededed;
    +  *background-color: #e5e5e5;
    +  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
    +  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
    +  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
    +  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
    +  background-repeat: repeat-x;
    +  border-color: #e5e5e5 #e5e5e5 #bfbfbf;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
    +  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
    +  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
    +     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
    +          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
    +}
    +
    +.navbar .btn-navbar:hover,
    +.navbar .btn-navbar:focus,
    +.navbar .btn-navbar:active,
    +.navbar .btn-navbar.active,
    +.navbar .btn-navbar.disabled,
    +.navbar .btn-navbar[disabled] {
    +  color: #ffffff;
    +  background-color: #e5e5e5;
    +  *background-color: #d9d9d9;
    +}
    +
    +.navbar .btn-navbar:active,
    +.navbar .btn-navbar.active {
    +  background-color: #cccccc \9;
    +}
    +
    +.navbar .btn-navbar .icon-bar {
    +  display: block;
    +  width: 18px;
    +  height: 2px;
    +  background-color: #f5f5f5;
    +  -webkit-border-radius: 1px;
    +     -moz-border-radius: 1px;
    +          border-radius: 1px;
    +  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
    +     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
    +          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
    +}
    +
    +.btn-navbar .icon-bar + .icon-bar {
    +  margin-top: 3px;
    +}
    +
    +.navbar .nav > li > .dropdown-menu:before {
    +  position: absolute;
    +  top: -7px;
    +  left: 9px;
    +  display: inline-block;
    +  border-right: 7px solid transparent;
    +  border-bottom: 7px solid #ccc;
    +  border-left: 7px solid transparent;
    +  border-bottom-color: rgba(0, 0, 0, 0.2);
    +  content: '';
    +}
    +
    +.navbar .nav > li > .dropdown-menu:after {
    +  position: absolute;
    +  top: -6px;
    +  left: 10px;
    +  display: inline-block;
    +  border-right: 6px solid transparent;
    +  border-bottom: 6px solid #ffffff;
    +  border-left: 6px solid transparent;
    +  content: '';
    +}
    +
    +.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
    +  top: auto;
    +  bottom: -7px;
    +  border-top: 7px solid #ccc;
    +  border-bottom: 0;
    +  border-top-color: rgba(0, 0, 0, 0.2);
    +}
    +
    +.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
    +  top: auto;
    +  bottom: -6px;
    +  border-top: 6px solid #ffffff;
    +  border-bottom: 0;
    +}
    +
    +.navbar .nav li.dropdown > a:hover .caret,
    +.navbar .nav li.dropdown > a:focus .caret {
    +  border-top-color: #333333;
    +  border-bottom-color: #333333;
    +}
    +
    +.navbar .nav li.dropdown.open > .dropdown-toggle,
    +.navbar .nav li.dropdown.active > .dropdown-toggle,
    +.navbar .nav li.dropdown.open.active > .dropdown-toggle {
    +  color: #555555;
    +  background-color: #e5e5e5;
    +}
    +
    +.navbar .nav li.dropdown > .dropdown-toggle .caret {
    +  border-top-color: #777777;
    +  border-bottom-color: #777777;
    +}
    +
    +.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
    +.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
    +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
    +  border-top-color: #555555;
    +  border-bottom-color: #555555;
    +}
    +
    +.navbar .pull-right > li > .dropdown-menu,
    +.navbar .nav > li > .dropdown-menu.pull-right {
    +  right: 0;
    +  left: auto;
    +}
    +
    +.navbar .pull-right > li > .dropdown-menu:before,
    +.navbar .nav > li > .dropdown-menu.pull-right:before {
    +  right: 12px;
    +  left: auto;
    +}
    +
    +.navbar .pull-right > li > .dropdown-menu:after,
    +.navbar .nav > li > .dropdown-menu.pull-right:after {
    +  right: 13px;
    +  left: auto;
    +}
    +
    +.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
    +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
    +  right: 100%;
    +  left: auto;
    +  margin-right: -1px;
    +  margin-left: 0;
    +  -webkit-border-radius: 6px 0 6px 6px;
    +     -moz-border-radius: 6px 0 6px 6px;
    +          border-radius: 6px 0 6px 6px;
    +}
    +
    +.navbar-inverse .navbar-inner {
    +  background-color: #1b1b1b;
    +  background-image: -moz-linear-gradient(top, #222222, #111111);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
    +  background-image: -webkit-linear-gradient(top, #222222, #111111);
    +  background-image: -o-linear-gradient(top, #222222, #111111);
    +  background-image: linear-gradient(to bottom, #222222, #111111);
    +  background-repeat: repeat-x;
    +  border-color: #252525;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
    +}
    +
    +.navbar-inverse .brand,
    +.navbar-inverse .nav > li > a {
    +  color: #999999;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +}
    +
    +.navbar-inverse .brand:hover,
    +.navbar-inverse .nav > li > a:hover,
    +.navbar-inverse .brand:focus,
    +.navbar-inverse .nav > li > a:focus {
    +  color: #ffffff;
    +}
    +
    +.navbar-inverse .brand {
    +  color: #999999;
    +}
    +
    +.navbar-inverse .navbar-text {
    +  color: #999999;
    +}
    +
    +.navbar-inverse .nav > li > a:focus,
    +.navbar-inverse .nav > li > a:hover {
    +  color: #ffffff;
    +  background-color: transparent;
    +}
    +
    +.navbar-inverse .nav .active > a,
    +.navbar-inverse .nav .active > a:hover,
    +.navbar-inverse .nav .active > a:focus {
    +  color: #ffffff;
    +  background-color: #111111;
    +}
    +
    +.navbar-inverse .navbar-link {
    +  color: #999999;
    +}
    +
    +.navbar-inverse .navbar-link:hover,
    +.navbar-inverse .navbar-link:focus {
    +  color: #ffffff;
    +}
    +
    +.navbar-inverse .divider-vertical {
    +  border-right-color: #222222;
    +  border-left-color: #111111;
    +}
    +
    +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
    +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
    +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
    +  color: #ffffff;
    +  background-color: #111111;
    +}
    +
    +.navbar-inverse .nav li.dropdown > a:hover .caret,
    +.navbar-inverse .nav li.dropdown > a:focus .caret {
    +  border-top-color: #ffffff;
    +  border-bottom-color: #ffffff;
    +}
    +
    +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
    +  border-top-color: #999999;
    +  border-bottom-color: #999999;
    +}
    +
    +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
    +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
    +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
    +  border-top-color: #ffffff;
    +  border-bottom-color: #ffffff;
    +}
    +
    +.navbar-inverse .navbar-search .search-query {
    +  color: #ffffff;
    +  background-color: #515151;
    +  border-color: #111111;
    +  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
    +     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
    +          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
    +  -webkit-transition: none;
    +     -moz-transition: none;
    +       -o-transition: none;
    +          transition: none;
    +}
    +
    +.navbar-inverse .navbar-search .search-query:-moz-placeholder {
    +  color: #cccccc;
    +}
    +
    +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
    +  color: #cccccc;
    +}
    +
    +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
    +  color: #cccccc;
    +}
    +
    +.navbar-inverse .navbar-search .search-query:focus,
    +.navbar-inverse .navbar-search .search-query.focused {
    +  padding: 5px 15px;
    +  color: #333333;
    +  text-shadow: 0 1px 0 #ffffff;
    +  background-color: #ffffff;
    +  border: 0;
    +  outline: 0;
    +  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
    +     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
    +          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
    +}
    +
    +.navbar-inverse .btn-navbar {
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #0e0e0e;
    +  *background-color: #040404;
    +  background-image: -moz-linear-gradient(top, #151515, #040404);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
    +  background-image: -webkit-linear-gradient(top, #151515, #040404);
    +  background-image: -o-linear-gradient(top, #151515, #040404);
    +  background-image: linear-gradient(to bottom, #151515, #040404);
    +  background-repeat: repeat-x;
    +  border-color: #040404 #040404 #000000;
    +  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
    +  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
    +}
    +
    +.navbar-inverse .btn-navbar:hover,
    +.navbar-inverse .btn-navbar:focus,
    +.navbar-inverse .btn-navbar:active,
    +.navbar-inverse .btn-navbar.active,
    +.navbar-inverse .btn-navbar.disabled,
    +.navbar-inverse .btn-navbar[disabled] {
    +  color: #ffffff;
    +  background-color: #040404;
    +  *background-color: #000000;
    +}
    +
    +.navbar-inverse .btn-navbar:active,
    +.navbar-inverse .btn-navbar.active {
    +  background-color: #000000 \9;
    +}
    +
    +.breadcrumb {
    +  padding: 8px 15px;
    +  margin: 0 0 20px;
    +  list-style: none;
    +  background-color: #f5f5f5;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +.breadcrumb > li {
    +  display: inline-block;
    +  *display: inline;
    +  text-shadow: 0 1px 0 #ffffff;
    +  *zoom: 1;
    +}
    +
    +.breadcrumb > li > .divider {
    +  padding: 0 5px;
    +  color: #ccc;
    +}
    +
    +.breadcrumb > .active {
    +  color: #999999;
    +}
    +
    +.pagination {
    +  margin: 20px 0;
    +}
    +
    +.pagination ul {
    +  display: inline-block;
    +  *display: inline;
    +  margin-bottom: 0;
    +  margin-left: 0;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +  *zoom: 1;
    +  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
    +     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
    +          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
    +}
    +
    +.pagination ul > li {
    +  display: inline;
    +}
    +
    +.pagination ul > li > a,
    +.pagination ul > li > span {
    +  float: left;
    +  padding: 4px 12px;
    +  line-height: 20px;
    +  text-decoration: none;
    +  background-color: #ffffff;
    +  border: 1px solid #dddddd;
    +  border-left-width: 0;
    +}
    +
    +.pagination ul > li > a:hover,
    +.pagination ul > li > a:focus,
    +.pagination ul > .active > a,
    +.pagination ul > .active > span {
    +  background-color: #f5f5f5;
    +}
    +
    +.pagination ul > .active > a,
    +.pagination ul > .active > span {
    +  color: #999999;
    +  cursor: default;
    +}
    +
    +.pagination ul > .disabled > span,
    +.pagination ul > .disabled > a,
    +.pagination ul > .disabled > a:hover,
    +.pagination ul > .disabled > a:focus {
    +  color: #999999;
    +  cursor: default;
    +  background-color: transparent;
    +}
    +
    +.pagination ul > li:first-child > a,
    +.pagination ul > li:first-child > span {
    +  border-left-width: 1px;
    +  -webkit-border-bottom-left-radius: 4px;
    +          border-bottom-left-radius: 4px;
    +  -webkit-border-top-left-radius: 4px;
    +          border-top-left-radius: 4px;
    +  -moz-border-radius-bottomleft: 4px;
    +  -moz-border-radius-topleft: 4px;
    +}
    +
    +.pagination ul > li:last-child > a,
    +.pagination ul > li:last-child > span {
    +  -webkit-border-top-right-radius: 4px;
    +          border-top-right-radius: 4px;
    +  -webkit-border-bottom-right-radius: 4px;
    +          border-bottom-right-radius: 4px;
    +  -moz-border-radius-topright: 4px;
    +  -moz-border-radius-bottomright: 4px;
    +}
    +
    +.pagination-centered {
    +  text-align: center;
    +}
    +
    +.pagination-right {
    +  text-align: right;
    +}
    +
    +.pagination-large ul > li > a,
    +.pagination-large ul > li > span {
    +  padding: 11px 19px;
    +  font-size: 17.5px;
    +}
    +
    +.pagination-large ul > li:first-child > a,
    +.pagination-large ul > li:first-child > span {
    +  -webkit-border-bottom-left-radius: 6px;
    +          border-bottom-left-radius: 6px;
    +  -webkit-border-top-left-radius: 6px;
    +          border-top-left-radius: 6px;
    +  -moz-border-radius-bottomleft: 6px;
    +  -moz-border-radius-topleft: 6px;
    +}
    +
    +.pagination-large ul > li:last-child > a,
    +.pagination-large ul > li:last-child > span {
    +  -webkit-border-top-right-radius: 6px;
    +          border-top-right-radius: 6px;
    +  -webkit-border-bottom-right-radius: 6px;
    +          border-bottom-right-radius: 6px;
    +  -moz-border-radius-topright: 6px;
    +  -moz-border-radius-bottomright: 6px;
    +}
    +
    +.pagination-mini ul > li:first-child > a,
    +.pagination-small ul > li:first-child > a,
    +.pagination-mini ul > li:first-child > span,
    +.pagination-small ul > li:first-child > span {
    +  -webkit-border-bottom-left-radius: 3px;
    +          border-bottom-left-radius: 3px;
    +  -webkit-border-top-left-radius: 3px;
    +          border-top-left-radius: 3px;
    +  -moz-border-radius-bottomleft: 3px;
    +  -moz-border-radius-topleft: 3px;
    +}
    +
    +.pagination-mini ul > li:last-child > a,
    +.pagination-small ul > li:last-child > a,
    +.pagination-mini ul > li:last-child > span,
    +.pagination-small ul > li:last-child > span {
    +  -webkit-border-top-right-radius: 3px;
    +          border-top-right-radius: 3px;
    +  -webkit-border-bottom-right-radius: 3px;
    +          border-bottom-right-radius: 3px;
    +  -moz-border-radius-topright: 3px;
    +  -moz-border-radius-bottomright: 3px;
    +}
    +
    +.pagination-small ul > li > a,
    +.pagination-small ul > li > span {
    +  padding: 2px 10px;
    +  font-size: 11.9px;
    +}
    +
    +.pagination-mini ul > li > a,
    +.pagination-mini ul > li > span {
    +  padding: 0 6px;
    +  font-size: 10.5px;
    +}
    +
    +.pager {
    +  margin: 20px 0;
    +  text-align: center;
    +  list-style: none;
    +  *zoom: 1;
    +}
    +
    +.pager:before,
    +.pager:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.pager:after {
    +  clear: both;
    +}
    +
    +.pager li {
    +  display: inline;
    +}
    +
    +.pager li > a,
    +.pager li > span {
    +  display: inline-block;
    +  padding: 5px 14px;
    +  background-color: #fff;
    +  border: 1px solid #ddd;
    +  -webkit-border-radius: 15px;
    +     -moz-border-radius: 15px;
    +          border-radius: 15px;
    +}
    +
    +.pager li > a:hover,
    +.pager li > a:focus {
    +  text-decoration: none;
    +  background-color: #f5f5f5;
    +}
    +
    +.pager .next > a,
    +.pager .next > span {
    +  float: right;
    +}
    +
    +.pager .previous > a,
    +.pager .previous > span {
    +  float: left;
    +}
    +
    +.pager .disabled > a,
    +.pager .disabled > a:hover,
    +.pager .disabled > a:focus,
    +.pager .disabled > span {
    +  color: #999999;
    +  cursor: default;
    +  background-color: #fff;
    +}
    +
    +.modal-backdrop {
    +  position: fixed;
    +  top: 0;
    +  right: 0;
    +  bottom: 0;
    +  left: 0;
    +  z-index: 1040;
    +  background-color: #000000;
    +}
    +
    +.modal-backdrop.fade {
    +  opacity: 0;
    +}
    +
    +.modal-backdrop,
    +.modal-backdrop.fade.in {
    +  opacity: 0.8;
    +  filter: alpha(opacity=80);
    +}
    +
    +.modal {
    +  position: fixed;
    +  top: 10%;
    +  left: 50%;
    +  z-index: 1050;
    +  width: 560px;
    +  margin-left: -280px;
    +  background-color: #ffffff;
    +  border: 1px solid #999;
    +  border: 1px solid rgba(0, 0, 0, 0.3);
    +  *border: 1px solid #999;
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +  outline: none;
    +  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
    +     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
    +          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
    +  -webkit-background-clip: padding-box;
    +     -moz-background-clip: padding-box;
    +          background-clip: padding-box;
    +}
    +
    +.modal.fade {
    +  top: -25%;
    +  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
    +     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
    +       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
    +          transition: opacity 0.3s linear, top 0.3s ease-out;
    +}
    +
    +.modal.fade.in {
    +  top: 10%;
    +}
    +
    +.modal-header {
    +  padding: 9px 15px;
    +  border-bottom: 1px solid #eee;
    +}
    +
    +.modal-header .close {
    +  margin-top: 2px;
    +}
    +
    +.modal-header h3 {
    +  margin: 0;
    +  line-height: 30px;
    +}
    +
    +.modal-body {
    +  position: relative;
    +  max-height: 400px;
    +  padding: 15px;
    +  overflow-y: auto;
    +}
    +
    +.modal-form {
    +  margin-bottom: 0;
    +}
    +
    +.modal-footer {
    +  padding: 14px 15px 15px;
    +  margin-bottom: 0;
    +  text-align: right;
    +  background-color: #f5f5f5;
    +  border-top: 1px solid #ddd;
    +  -webkit-border-radius: 0 0 6px 6px;
    +     -moz-border-radius: 0 0 6px 6px;
    +          border-radius: 0 0 6px 6px;
    +  *zoom: 1;
    +  -webkit-box-shadow: inset 0 1px 0 #ffffff;
    +     -moz-box-shadow: inset 0 1px 0 #ffffff;
    +          box-shadow: inset 0 1px 0 #ffffff;
    +}
    +
    +.modal-footer:before,
    +.modal-footer:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.modal-footer:after {
    +  clear: both;
    +}
    +
    +.modal-footer .btn + .btn {
    +  margin-bottom: 0;
    +  margin-left: 5px;
    +}
    +
    +.modal-footer .btn-group .btn + .btn {
    +  margin-left: -1px;
    +}
    +
    +.modal-footer .btn-block + .btn-block {
    +  margin-left: 0;
    +}
    +
    +.tooltip {
    +  position: absolute;
    +  z-index: 1030;
    +  display: block;
    +  font-size: 11px;
    +  line-height: 1.4;
    +  opacity: 0;
    +  filter: alpha(opacity=0);
    +  visibility: visible;
    +}
    +
    +.tooltip.in {
    +  opacity: 0.8;
    +  filter: alpha(opacity=80);
    +}
    +
    +.tooltip.top {
    +  padding: 5px 0;
    +  margin-top: -3px;
    +}
    +
    +.tooltip.right {
    +  padding: 0 5px;
    +  margin-left: 3px;
    +}
    +
    +.tooltip.bottom {
    +  padding: 5px 0;
    +  margin-top: 3px;
    +}
    +
    +.tooltip.left {
    +  padding: 0 5px;
    +  margin-left: -3px;
    +}
    +
    +.tooltip-inner {
    +  max-width: 200px;
    +  padding: 8px;
    +  color: #ffffff;
    +  text-align: center;
    +  text-decoration: none;
    +  background-color: #000000;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +.tooltip-arrow {
    +  position: absolute;
    +  width: 0;
    +  height: 0;
    +  border-color: transparent;
    +  border-style: solid;
    +}
    +
    +.tooltip.top .tooltip-arrow {
    +  bottom: 0;
    +  left: 50%;
    +  margin-left: -5px;
    +  border-top-color: #000000;
    +  border-width: 5px 5px 0;
    +}
    +
    +.tooltip.right .tooltip-arrow {
    +  top: 50%;
    +  left: 0;
    +  margin-top: -5px;
    +  border-right-color: #000000;
    +  border-width: 5px 5px 5px 0;
    +}
    +
    +.tooltip.left .tooltip-arrow {
    +  top: 50%;
    +  right: 0;
    +  margin-top: -5px;
    +  border-left-color: #000000;
    +  border-width: 5px 0 5px 5px;
    +}
    +
    +.tooltip.bottom .tooltip-arrow {
    +  top: 0;
    +  left: 50%;
    +  margin-left: -5px;
    +  border-bottom-color: #000000;
    +  border-width: 0 5px 5px;
    +}
    +
    +.popover {
    +  position: absolute;
    +  top: 0;
    +  left: 0;
    +  z-index: 1010;
    +  display: none;
    +  max-width: 276px;
    +  padding: 1px;
    +  text-align: left;
    +  white-space: normal;
    +  background-color: #ffffff;
    +  border: 1px solid #ccc;
    +  border: 1px solid rgba(0, 0, 0, 0.2);
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    +     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    +          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    +  -webkit-background-clip: padding-box;
    +     -moz-background-clip: padding;
    +          background-clip: padding-box;
    +}
    +
    +.popover.top {
    +  margin-top: -10px;
    +}
    +
    +.popover.right {
    +  margin-left: 10px;
    +}
    +
    +.popover.bottom {
    +  margin-top: 10px;
    +}
    +
    +.popover.left {
    +  margin-left: -10px;
    +}
    +
    +.popover-title {
    +  padding: 8px 14px;
    +  margin: 0;
    +  font-size: 14px;
    +  font-weight: normal;
    +  line-height: 18px;
    +  background-color: #f7f7f7;
    +  border-bottom: 1px solid #ebebeb;
    +  -webkit-border-radius: 5px 5px 0 0;
    +     -moz-border-radius: 5px 5px 0 0;
    +          border-radius: 5px 5px 0 0;
    +}
    +
    +.popover-title:empty {
    +  display: none;
    +}
    +
    +.popover-content {
    +  padding: 9px 14px;
    +}
    +
    +.popover .arrow,
    +.popover .arrow:after {
    +  position: absolute;
    +  display: block;
    +  width: 0;
    +  height: 0;
    +  border-color: transparent;
    +  border-style: solid;
    +}
    +
    +.popover .arrow {
    +  border-width: 11px;
    +}
    +
    +.popover .arrow:after {
    +  border-width: 10px;
    +  content: "";
    +}
    +
    +.popover.top .arrow {
    +  bottom: -11px;
    +  left: 50%;
    +  margin-left: -11px;
    +  border-top-color: #999;
    +  border-top-color: rgba(0, 0, 0, 0.25);
    +  border-bottom-width: 0;
    +}
    +
    +.popover.top .arrow:after {
    +  bottom: 1px;
    +  margin-left: -10px;
    +  border-top-color: #ffffff;
    +  border-bottom-width: 0;
    +}
    +
    +.popover.right .arrow {
    +  top: 50%;
    +  left: -11px;
    +  margin-top: -11px;
    +  border-right-color: #999;
    +  border-right-color: rgba(0, 0, 0, 0.25);
    +  border-left-width: 0;
    +}
    +
    +.popover.right .arrow:after {
    +  bottom: -10px;
    +  left: 1px;
    +  border-right-color: #ffffff;
    +  border-left-width: 0;
    +}
    +
    +.popover.bottom .arrow {
    +  top: -11px;
    +  left: 50%;
    +  margin-left: -11px;
    +  border-bottom-color: #999;
    +  border-bottom-color: rgba(0, 0, 0, 0.25);
    +  border-top-width: 0;
    +}
    +
    +.popover.bottom .arrow:after {
    +  top: 1px;
    +  margin-left: -10px;
    +  border-bottom-color: #ffffff;
    +  border-top-width: 0;
    +}
    +
    +.popover.left .arrow {
    +  top: 50%;
    +  right: -11px;
    +  margin-top: -11px;
    +  border-left-color: #999;
    +  border-left-color: rgba(0, 0, 0, 0.25);
    +  border-right-width: 0;
    +}
    +
    +.popover.left .arrow:after {
    +  right: 1px;
    +  bottom: -10px;
    +  border-left-color: #ffffff;
    +  border-right-width: 0;
    +}
    +
    +.thumbnails {
    +  margin-left: -20px;
    +  list-style: none;
    +  *zoom: 1;
    +}
    +
    +.thumbnails:before,
    +.thumbnails:after {
    +  display: table;
    +  line-height: 0;
    +  content: "";
    +}
    +
    +.thumbnails:after {
    +  clear: both;
    +}
    +
    +.row-fluid .thumbnails {
    +  margin-left: 0;
    +}
    +
    +.thumbnails > li {
    +  float: left;
    +  margin-bottom: 20px;
    +  margin-left: 20px;
    +}
    +
    +.thumbnail {
    +  display: block;
    +  padding: 4px;
    +  line-height: 20px;
    +  border: 1px solid #ddd;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
    +     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
    +          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
    +  -webkit-transition: all 0.2s ease-in-out;
    +     -moz-transition: all 0.2s ease-in-out;
    +       -o-transition: all 0.2s ease-in-out;
    +          transition: all 0.2s ease-in-out;
    +}
    +
    +a.thumbnail:hover,
    +a.thumbnail:focus {
    +  border-color: #0088cc;
    +  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
    +     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
    +          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
    +}
    +
    +.thumbnail > img {
    +  display: block;
    +  max-width: 100%;
    +  margin-right: auto;
    +  margin-left: auto;
    +}
    +
    +.thumbnail .caption {
    +  padding: 9px;
    +  color: #555555;
    +}
    +
    +.media,
    +.media-body {
    +  overflow: hidden;
    +  *overflow: visible;
    +  zoom: 1;
    +}
    +
    +.media,
    +.media .media {
    +  margin-top: 15px;
    +}
    +
    +.media:first-child {
    +  margin-top: 0;
    +}
    +
    +.media-object {
    +  display: block;
    +}
    +
    +.media-heading {
    +  margin: 0 0 5px;
    +}
    +
    +.media > .pull-left {
    +  margin-right: 10px;
    +}
    +
    +.media > .pull-right {
    +  margin-left: 10px;
    +}
    +
    +.media-list {
    +  margin-left: 0;
    +  list-style: none;
    +}
    +
    +.label,
    +.badge {
    +  display: inline-block;
    +  padding: 2px 4px;
    +  font-size: 11.844px;
    +  font-weight: bold;
    +  line-height: 14px;
    +  color: #ffffff;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  white-space: nowrap;
    +  vertical-align: baseline;
    +  background-color: #999999;
    +}
    +
    +.label {
    +  -webkit-border-radius: 3px;
    +     -moz-border-radius: 3px;
    +          border-radius: 3px;
    +}
    +
    +.badge {
    +  padding-right: 9px;
    +  padding-left: 9px;
    +  -webkit-border-radius: 9px;
    +     -moz-border-radius: 9px;
    +          border-radius: 9px;
    +}
    +
    +.label:empty,
    +.badge:empty {
    +  display: none;
    +}
    +
    +a.label:hover,
    +a.label:focus,
    +a.badge:hover,
    +a.badge:focus {
    +  color: #ffffff;
    +  text-decoration: none;
    +  cursor: pointer;
    +}
    +
    +.label-important,
    +.badge-important {
    +  background-color: #b94a48;
    +}
    +
    +.label-important[href],
    +.badge-important[href] {
    +  background-color: #953b39;
    +}
    +
    +.label-warning,
    +.badge-warning {
    +  background-color: #f89406;
    +}
    +
    +.label-warning[href],
    +.badge-warning[href] {
    +  background-color: #c67605;
    +}
    +
    +.label-success,
    +.badge-success {
    +  background-color: #468847;
    +}
    +
    +.label-success[href],
    +.badge-success[href] {
    +  background-color: #356635;
    +}
    +
    +.label-info,
    +.badge-info {
    +  background-color: #3a87ad;
    +}
    +
    +.label-info[href],
    +.badge-info[href] {
    +  background-color: #2d6987;
    +}
    +
    +.label-inverse,
    +.badge-inverse {
    +  background-color: #333333;
    +}
    +
    +.label-inverse[href],
    +.badge-inverse[href] {
    +  background-color: #1a1a1a;
    +}
    +
    +.btn .label,
    +.btn .badge {
    +  position: relative;
    +  top: -1px;
    +}
    +
    +.btn-mini .label,
    +.btn-mini .badge {
    +  top: 0;
    +}
    +
    +@-webkit-keyframes progress-bar-stripes {
    +  from {
    +    background-position: 40px 0;
    +  }
    +  to {
    +    background-position: 0 0;
    +  }
    +}
    +
    +@-moz-keyframes progress-bar-stripes {
    +  from {
    +    background-position: 40px 0;
    +  }
    +  to {
    +    background-position: 0 0;
    +  }
    +}
    +
    +@-ms-keyframes progress-bar-stripes {
    +  from {
    +    background-position: 40px 0;
    +  }
    +  to {
    +    background-position: 0 0;
    +  }
    +}
    +
    +@-o-keyframes progress-bar-stripes {
    +  from {
    +    background-position: 0 0;
    +  }
    +  to {
    +    background-position: 40px 0;
    +  }
    +}
    +
    +@keyframes progress-bar-stripes {
    +  from {
    +    background-position: 40px 0;
    +  }
    +  to {
    +    background-position: 0 0;
    +  }
    +}
    +
    +.progress {
    +  height: 20px;
    +  margin-bottom: 20px;
    +  overflow: hidden;
    +  background-color: #f7f7f7;
    +  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
    +  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
    +  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
    +  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
    +  background-repeat: repeat-x;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
    +  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
    +     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
    +          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
    +}
    +
    +.progress .bar {
    +  float: left;
    +  width: 0;
    +  height: 100%;
    +  font-size: 12px;
    +  color: #ffffff;
    +  text-align: center;
    +  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
    +  background-color: #0e90d2;
    +  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
    +  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
    +  background-image: -o-linear-gradient(top, #149bdf, #0480be);
    +  background-image: linear-gradient(to bottom, #149bdf, #0480be);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
    +  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
    +     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
    +          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
    +  -webkit-box-sizing: border-box;
    +     -moz-box-sizing: border-box;
    +          box-sizing: border-box;
    +  -webkit-transition: width 0.6s ease;
    +     -moz-transition: width 0.6s ease;
    +       -o-transition: width 0.6s ease;
    +          transition: width 0.6s ease;
    +}
    +
    +.progress .bar + .bar {
    +  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
    +     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
    +          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
    +}
    +
    +.progress-striped .bar {
    +  background-color: #149bdf;
    +  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
    +  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  -webkit-background-size: 40px 40px;
    +     -moz-background-size: 40px 40px;
    +       -o-background-size: 40px 40px;
    +          background-size: 40px 40px;
    +}
    +
    +.progress.active .bar {
    +  -webkit-animation: progress-bar-stripes 2s linear infinite;
    +     -moz-animation: progress-bar-stripes 2s linear infinite;
    +      -ms-animation: progress-bar-stripes 2s linear infinite;
    +       -o-animation: progress-bar-stripes 2s linear infinite;
    +          animation: progress-bar-stripes 2s linear infinite;
    +}
    +
    +.progress-danger .bar,
    +.progress .bar-danger {
    +  background-color: #dd514c;
    +  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
    +  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
    +  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
    +  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
    +}
    +
    +.progress-danger.progress-striped .bar,
    +.progress-striped .bar-danger {
    +  background-color: #ee5f5b;
    +  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
    +  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +}
    +
    +.progress-success .bar,
    +.progress .bar-success {
    +  background-color: #5eb95e;
    +  background-image: -moz-linear-gradient(top, #62c462, #57a957);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
    +  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
    +  background-image: -o-linear-gradient(top, #62c462, #57a957);
    +  background-image: linear-gradient(to bottom, #62c462, #57a957);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
    +}
    +
    +.progress-success.progress-striped .bar,
    +.progress-striped .bar-success {
    +  background-color: #62c462;
    +  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
    +  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +}
    +
    +.progress-info .bar,
    +.progress .bar-info {
    +  background-color: #4bb1cf;
    +  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
    +  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
    +  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
    +  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
    +}
    +
    +.progress-info.progress-striped .bar,
    +.progress-striped .bar-info {
    +  background-color: #5bc0de;
    +  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
    +  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +}
    +
    +.progress-warning .bar,
    +.progress .bar-warning {
    +  background-color: #faa732;
    +  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
    +  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
    +  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
    +  background-image: -o-linear-gradient(top, #fbb450, #f89406);
    +  background-image: linear-gradient(to bottom, #fbb450, #f89406);
    +  background-repeat: repeat-x;
    +  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
    +}
    +
    +.progress-warning.progress-striped .bar,
    +.progress-striped .bar-warning {
    +  background-color: #fbb450;
    +  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
    +  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    +}
    +
    +.accordion {
    +  margin-bottom: 20px;
    +}
    +
    +.accordion-group {
    +  margin-bottom: 2px;
    +  border: 1px solid #e5e5e5;
    +  -webkit-border-radius: 4px;
    +     -moz-border-radius: 4px;
    +          border-radius: 4px;
    +}
    +
    +.accordion-heading {
    +  border-bottom: 0;
    +}
    +
    +.accordion-heading .accordion-toggle {
    +  display: block;
    +  padding: 8px 15px;
    +}
    +
    +.accordion-toggle {
    +  cursor: pointer;
    +}
    +
    +.accordion-inner {
    +  padding: 9px 15px;
    +  border-top: 1px solid #e5e5e5;
    +}
    +
    +.carousel {
    +  position: relative;
    +  margin-bottom: 20px;
    +  line-height: 1;
    +}
    +
    +.carousel-inner {
    +  position: relative;
    +  width: 100%;
    +  overflow: hidden;
    +}
    +
    +.carousel-inner > .item {
    +  position: relative;
    +  display: none;
    +  -webkit-transition: 0.6s ease-in-out left;
    +     -moz-transition: 0.6s ease-in-out left;
    +       -o-transition: 0.6s ease-in-out left;
    +          transition: 0.6s ease-in-out left;
    +}
    +
    +.carousel-inner > .item > img,
    +.carousel-inner > .item > a > img {
    +  display: block;
    +  line-height: 1;
    +}
    +
    +.carousel-inner > .active,
    +.carousel-inner > .next,
    +.carousel-inner > .prev {
    +  display: block;
    +}
    +
    +.carousel-inner > .active {
    +  left: 0;
    +}
    +
    +.carousel-inner > .next,
    +.carousel-inner > .prev {
    +  position: absolute;
    +  top: 0;
    +  width: 100%;
    +}
    +
    +.carousel-inner > .next {
    +  left: 100%;
    +}
    +
    +.carousel-inner > .prev {
    +  left: -100%;
    +}
    +
    +.carousel-inner > .next.left,
    +.carousel-inner > .prev.right {
    +  left: 0;
    +}
    +
    +.carousel-inner > .active.left {
    +  left: -100%;
    +}
    +
    +.carousel-inner > .active.right {
    +  left: 100%;
    +}
    +
    +.carousel-control {
    +  position: absolute;
    +  top: 40%;
    +  left: 15px;
    +  width: 40px;
    +  height: 40px;
    +  margin-top: -20px;
    +  font-size: 60px;
    +  font-weight: 100;
    +  line-height: 30px;
    +  color: #ffffff;
    +  text-align: center;
    +  background: #222222;
    +  border: 3px solid #ffffff;
    +  -webkit-border-radius: 23px;
    +     -moz-border-radius: 23px;
    +          border-radius: 23px;
    +  opacity: 0.5;
    +  filter: alpha(opacity=50);
    +}
    +
    +.carousel-control.right {
    +  right: 15px;
    +  left: auto;
    +}
    +
    +.carousel-control:hover,
    +.carousel-control:focus {
    +  color: #ffffff;
    +  text-decoration: none;
    +  opacity: 0.9;
    +  filter: alpha(opacity=90);
    +}
    +
    +.carousel-indicators {
    +  position: absolute;
    +  top: 15px;
    +  right: 15px;
    +  z-index: 5;
    +  margin: 0;
    +  list-style: none;
    +}
    +
    +.carousel-indicators li {
    +  display: block;
    +  float: left;
    +  width: 10px;
    +  height: 10px;
    +  margin-left: 5px;
    +  text-indent: -999px;
    +  background-color: #ccc;
    +  background-color: rgba(255, 255, 255, 0.25);
    +  border-radius: 5px;
    +}
    +
    +.carousel-indicators .active {
    +  background-color: #fff;
    +}
    +
    +.carousel-caption {
    +  position: absolute;
    +  right: 0;
    +  bottom: 0;
    +  left: 0;
    +  padding: 15px;
    +  background: #333333;
    +  background: rgba(0, 0, 0, 0.75);
    +}
    +
    +.carousel-caption h4,
    +.carousel-caption p {
    +  line-height: 20px;
    +  color: #ffffff;
    +}
    +
    +.carousel-caption h4 {
    +  margin: 0 0 5px;
    +}
    +
    +.carousel-caption p {
    +  margin-bottom: 0;
    +}
    +
    +.hero-unit {
    +  padding: 60px;
    +  margin-bottom: 30px;
    +  font-size: 18px;
    +  font-weight: 200;
    +  line-height: 30px;
    +  color: inherit;
    +  background-color: #eeeeee;
    +  -webkit-border-radius: 6px;
    +     -moz-border-radius: 6px;
    +          border-radius: 6px;
    +}
    +
    +.hero-unit h1 {
    +  margin-bottom: 0;
    +  font-size: 60px;
    +  line-height: 1;
    +  letter-spacing: -1px;
    +  color: inherit;
    +}
    +
    +.hero-unit li {
    +  line-height: 30px;
    +}
    +
    +.pull-right {
    +  float: right;
    +}
    +
    +.pull-left {
    +  float: left;
    +}
    +
    +.hide {
    +  display: none;
    +}
    +
    +.show {
    +  display: block;
    +}
    +
    +.invisible {
    +  visibility: hidden;
    +}
    +
    +.affix {
    +  position: fixed;
    +}
    diff --git a/src/main/webapp/plug-in/jquery-plugs/fileupload/bootstrap/img/glyphicons-halflings-white.png b/src/main/webapp/plug-in/jquery-plugs/fileupload/bootstrap/img/glyphicons-halflings-white.png
    new file mode 100644
    index 00000000..3bf6484a
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/fileupload/bootstrap/img/glyphicons-halflings-white.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/fileupload/bootstrap/img/glyphicons-halflings.png b/src/main/webapp/plug-in/jquery-plugs/fileupload/bootstrap/img/glyphicons-halflings.png
    new file mode 100644
    index 00000000..a9969993
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-plugs/fileupload/bootstrap/img/glyphicons-halflings.png differ
    diff --git a/src/main/webapp/plug-in/jquery-plugs/fileupload/bootstrap/js/bootstrap.min.js b/src/main/webapp/plug-in/jquery-plugs/fileupload/bootstrap/js/bootstrap.min.js
    new file mode 100644
    index 00000000..95c5ac5e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/fileupload/bootstrap/js/bootstrap.min.js
    @@ -0,0 +1,6 @@
    +/*!
    +* Bootstrap.js by @fat & @mdo
    +* Copyright 2012 Twitter, Inc.
    +* http://www.apache.org/licenses/LICENSE-2.0.txt
    +*/
    +!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||s.toggleClass("open"),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown-menu",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-plugs/fileupload/css/dropzone.css b/src/main/webapp/plug-in/jquery-plugs/fileupload/css/dropzone.css
    new file mode 100644
    index 00000000..e0d82b02
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/fileupload/css/dropzone.css
    @@ -0,0 +1,25 @@
    +#dropzone {
    +    background: #ccccc;
    +    width: 150px;
    +    height: 50px;
    +    line-height: 50px;
    +    text-align: center;
    +    font-weight: bold;
    +}
    +#dropzone.in {
    +    width: 600px;
    +    height: 200px;
    +    line-height: 200px;
    +    font-size: larger;
    +}
    +#dropzone.hover {
    +    background: lawngreen;
    +}
    +#dropzone.fade {
    +    -webkit-transition: all 0.3s ease-out;
    +    -moz-transition: all 0.3s ease-out;
    +    -ms-transition: all 0.3s ease-out;
    +    -o-transition: all 0.3s ease-out;
    +    transition: all 0.3s ease-out;
    +    opacity: 1;
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-plugs/fileupload/js/jquery.1.9.1.min.js b/src/main/webapp/plug-in/jquery-plugs/fileupload/js/jquery.1.9.1.min.js
    new file mode 100644
    index 00000000..006e9531
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/fileupload/js/jquery.1.9.1.min.js
    @@ -0,0 +1,5 @@
    +/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
    +//@ sourceMappingURL=jquery.min.map
    +*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
    +return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
    +}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-plugs/fileupload/js/jquery.fileupload.js b/src/main/webapp/plug-in/jquery-plugs/fileupload/js/jquery.fileupload.js
    new file mode 100644
    index 00000000..79a6c3ff
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/fileupload/js/jquery.fileupload.js
    @@ -0,0 +1,1301 @@
    +/*
    + * jQuery File Upload Plugin 5.31
    + * https://github.com/blueimp/jQuery-File-Upload
    + *
    + * Copyright 2010, Sebastian Tschan
    + * https://blueimp.net
    + *
    + * Licensed under the MIT license:
    + * http://www.opensource.org/licenses/MIT
    + */
    +
    +/*jslint nomen: true, unparam: true, regexp: true */
    +/*global define, window, document, File, Blob, FormData, location */
    +
    +(function (factory) {
    +    'use strict';
    +    if (typeof define === 'function' && define.amd) {
    +        // Register as an anonymous AMD module:
    +        define([
    +            'jquery',
    +            'jquery.ui.widget'
    +        ], factory);
    +    } else {
    +        // Browser globals:
    +        factory(window.jQuery);
    +    }
    +}(function ($) {
    +    'use strict';
    +
    +    // The FileReader API is not actually used, but works as feature detection,
    +    // as e.g. Safari supports XHR file uploads via the FormData API,
    +    // but not non-multipart XHR file uploads:
    +    $.support.xhrFileUpload = !!(window.XMLHttpRequestUpload && window.FileReader);
    +    $.support.xhrFormDataFileUpload = !!window.FormData;
    +
    +    // The fileupload widget listens for change events on file input fields defined
    +    // via fileInput setting and paste or drop events of the given dropZone.
    +    // In addition to the default jQuery Widget methods, the fileupload widget
    +    // exposes the "add" and "send" methods, to add or directly send files using
    +    // the fileupload API.
    +    // By default, files added via file input selection, paste, drag & drop or
    +    // "add" method are uploaded immediately, but it is possible to override
    +    // the "add" callback option to queue file uploads.
    +    $.widget('blueimp.fileupload', {
    +
    +        options: {
    +            // The drop target element(s), by the default the complete document.
    +            // Set to null to disable drag & drop support:
    +            dropZone: $(document),
    +            // The paste target element(s), by the default the complete document.
    +            // Set to null to disable paste support:
    +            pasteZone: $(document),
    +            // The file input field(s), that are listened to for change events.
    +            // If undefined, it is set to the file input fields inside
    +            // of the widget element on plugin initialization.
    +            // Set to null to disable the change listener.
    +            fileInput: undefined,
    +            // By default, the file input field is replaced with a clone after
    +            // each input field change event. This is required for iframe transport
    +            // queues and allows change events to be fired for the same file
    +            // selection, but can be disabled by setting the following option to false:
    +            replaceFileInput: true,
    +            // The parameter name for the file form data (the request argument name).
    +            // If undefined or empty, the name property of the file input field is
    +            // used, or "files[]" if the file input name property is also empty,
    +            // can be a string or an array of strings:
    +            paramName: undefined,
    +            // By default, each file of a selection is uploaded using an individual
    +            // request for XHR type uploads. Set to false to upload file
    +            // selections in one request each:
    +            singleFileUploads: true,
    +            // To limit the number of files uploaded with one XHR request,
    +            // set the following option to an integer greater than 0:
    +            limitMultiFileUploads: undefined,
    +            // Set the following option to true to issue all file upload requests
    +            // in a sequential order:
    +            sequentialUploads: false,
    +            // To limit the number of concurrent uploads,
    +            // set the following option to an integer greater than 0:
    +            limitConcurrentUploads: undefined,
    +            // Set the following option to true to force iframe transport uploads:
    +            forceIframeTransport: false,
    +            // Set the following option to the location of a redirect url on the
    +            // origin server, for cross-domain iframe transport uploads:
    +            redirect: undefined,
    +            // The parameter name for the redirect url, sent as part of the form
    +            // data and set to 'redirect' if this option is empty:
    +            redirectParamName: undefined,
    +            // Set the following option to the location of a postMessage window,
    +            // to enable postMessage transport uploads:
    +            postMessage: undefined,
    +            // By default, XHR file uploads are sent as multipart/form-data.
    +            // The iframe transport is always using multipart/form-data.
    +            // Set to false to enable non-multipart XHR uploads:
    +            multipart: true,
    +            // To upload large files in smaller chunks, set the following option
    +            // to a preferred maximum chunk size. If set to 0, null or undefined,
    +            // or the browser does not support the required Blob API, files will
    +            // be uploaded as a whole.
    +            maxChunkSize: undefined,
    +            // When a non-multipart upload or a chunked multipart upload has been
    +            // aborted, this option can be used to resume the upload by setting
    +            // it to the size of the already uploaded bytes. This option is most
    +            // useful when modifying the options object inside of the "add" or
    +            // "send" callbacks, as the options are cloned for each file upload.
    +            uploadedBytes: undefined,
    +            // By default, failed (abort or error) file uploads are removed from the
    +            // global progress calculation. Set the following option to false to
    +            // prevent recalculating the global progress data:
    +            recalculateProgress: true,
    +            // Interval in milliseconds to calculate and trigger progress events:
    +            progressInterval: 100,
    +            // Interval in milliseconds to calculate progress bitrate:
    +            bitrateInterval: 500,
    +            // By default, uploads are started automatically when adding files:
    +            autoUpload: true,
    +
    +            // Error and info messages:
    +            messages: {
    +                uploadedBytes: 'Uploaded bytes exceed file size'
    +            },
    +
    +            // Translation function, gets the message key to be translated
    +            // and an object with context specific data as arguments:
    +            i18n: function (message, context) {
    +                message = this.messages[message] || message.toString();
    +                if (context) {
    +                    $.each(context, function (key, value) {
    +                        message = message.replace('{' + key + '}', value);
    +                    });
    +                }
    +                return message;
    +            },
    +
    +            // Additional form data to be sent along with the file uploads can be set
    +            // using this option, which accepts an array of objects with name and
    +            // value properties, a function returning such an array, a FormData
    +            // object (for XHR file uploads), or a simple object.
    +            // The form of the first fileInput is given as parameter to the function:
    +            formData: function (form) {
    +                return form.serializeArray();
    +            },
    +
    +            // The add callback is invoked as soon as files are added to the fileupload
    +            // widget (via file input selection, drag & drop, paste or add API call).
    +            // If the singleFileUploads option is enabled, this callback will be
    +            // called once for each file in the selection for XHR file uplaods, else
    +            // once for each file selection.
    +            // The upload starts when the submit method is invoked on the data parameter.
    +            // The data object contains a files property holding the added files
    +            // and allows to override plugin options as well as define ajax settings.
    +            // Listeners for this callback can also be bound the following way:
    +            // .bind('fileuploadadd', func);
    +            // data.submit() returns a Promise object and allows to attach additional
    +            // handlers using jQuery's Deferred callbacks:
    +            // data.submit().done(func).fail(func).always(func);
    +            add: function (e, data) {
    +                if (data.autoUpload || (data.autoUpload !== false &&
    +                        $(this).fileupload('option', 'autoUpload'))) {
    +                    data.process().done(function () {
    +                        data.submit();
    +                    });
    +                }
    +            },
    +
    +            // Other callbacks:
    +
    +            // Callback for the submit event of each file upload:
    +            // submit: function (e, data) {}, // .bind('fileuploadsubmit', func);
    +
    +            // Callback for the start of each file upload request:
    +            // send: function (e, data) {}, // .bind('fileuploadsend', func);
    +
    +            // Callback for successful uploads:
    +            // done: function (e, data) {}, // .bind('fileuploaddone', func);
    +
    +            // Callback for failed (abort or error) uploads:
    +            // fail: function (e, data) {}, // .bind('fileuploadfail', func);
    +
    +            // Callback for completed (success, abort or error) requests:
    +            // always: function (e, data) {}, // .bind('fileuploadalways', func);
    +
    +            // Callback for upload progress events:
    +            // progress: function (e, data) {}, // .bind('fileuploadprogress', func);
    +
    +            // Callback for global upload progress events:
    +            // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func);
    +
    +            // Callback for uploads start, equivalent to the global ajaxStart event:
    +            // start: function (e) {}, // .bind('fileuploadstart', func);
    +
    +            // Callback for uploads stop, equivalent to the global ajaxStop event:
    +            // stop: function (e) {}, // .bind('fileuploadstop', func);
    +
    +            // Callback for change events of the fileInput(s):
    +            // change: function (e, data) {}, // .bind('fileuploadchange', func);
    +
    +            // Callback for paste events to the pasteZone(s):
    +            // paste: function (e, data) {}, // .bind('fileuploadpaste', func);
    +
    +            // Callback for drop events of the dropZone(s):
    +            // drop: function (e, data) {}, // .bind('fileuploaddrop', func);
    +
    +            // Callback for dragover events of the dropZone(s):
    +            // dragover: function (e) {}, // .bind('fileuploaddragover', func);
    +
    +            // Callback for the start of each chunk upload request:
    +            // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);
    +
    +            // Callback for successful chunk uploads:
    +            // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func);
    +
    +            // Callback for failed (abort or error) chunk uploads:
    +            // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func);
    +
    +            // Callback for completed (success, abort or error) chunk upload requests:
    +            // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func);
    +
    +            // The plugin options are used as settings object for the ajax calls.
    +            // The following are jQuery ajax settings required for the file uploads:
    +            processData: false,
    +            contentType: false,
    +            cache: false
    +        },
    +
    +        // A list of options that require reinitializing event listeners and/or
    +        // special initialization code:
    +        _specialOptions: [
    +            'fileInput',
    +            'dropZone',
    +            'pasteZone',
    +            'multipart',
    +            'forceIframeTransport'
    +        ],
    +
    +        _BitrateTimer: function () {
    +            this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime());
    +            this.loaded = 0;
    +            this.bitrate = 0;
    +            this.getBitrate = function (now, loaded, interval) {
    +                var timeDiff = now - this.timestamp;
    +                if (!this.bitrate || !interval || timeDiff > interval) {
    +                    this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;
    +                    this.loaded = loaded;
    +                    this.timestamp = now;
    +                }
    +                return this.bitrate;
    +            };
    +        },
    +
    +        _isXHRUpload: function (options) {
    +            return !options.forceIframeTransport &&
    +                ((!options.multipart && $.support.xhrFileUpload) ||
    +                $.support.xhrFormDataFileUpload);
    +        },
    +
    +        _getFormData: function (options) {
    +            var formData;
    +            if (typeof options.formData === 'function') {
    +                return options.formData(options.form);
    +            }
    +            if ($.isArray(options.formData)) {
    +                return options.formData;
    +            }
    +            if ($.type(options.formData) === 'object') {
    +                formData = [];
    +                $.each(options.formData, function (name, value) {
    +                    formData.push({name: name, value: value});
    +                });
    +                return formData;
    +            }
    +            return [];
    +        },
    +
    +        _getTotal: function (files) {
    +            var total = 0;
    +            $.each(files, function (index, file) {
    +                total += file.size || 1;
    +            });
    +            return total;
    +        },
    +
    +        _initProgressObject: function (obj) {
    +            var progress = {
    +                loaded: 0,
    +                total: 0,
    +                bitrate: 0
    +            };
    +            if (obj._progress) {
    +                $.extend(obj._progress, progress);
    +            } else {
    +                obj._progress = progress;
    +            }
    +        },
    +
    +        _initResponseObject: function (obj) {
    +            var prop;
    +            if (obj._response) {
    +                for (prop in obj._response) {
    +                    if (obj._response.hasOwnProperty(prop)) {
    +                        delete obj._response[prop];
    +                    }
    +                }
    +            } else {
    +                obj._response = {};
    +            }
    +        },
    +
    +        _onProgress: function (e, data) {
    +            if (e.lengthComputable) {
    +                var now = ((Date.now) ? Date.now() : (new Date()).getTime()),
    +                    loaded;
    +                if (data._time && data.progressInterval &&
    +                        (now - data._time < data.progressInterval) &&
    +                        e.loaded !== e.total) {
    +                    return;
    +                }
    +                data._time = now;
    +                loaded = Math.floor(
    +                    e.loaded / e.total * (data.chunkSize || data._progress.total)
    +                ) + (data.uploadedBytes || 0);
    +                // Add the difference from the previously loaded state
    +                // to the global loaded counter:
    +                this._progress.loaded += (loaded - data._progress.loaded);
    +                this._progress.bitrate = this._bitrateTimer.getBitrate(
    +                    now,
    +                    this._progress.loaded,
    +                    data.bitrateInterval
    +                );
    +                data._progress.loaded = data.loaded = loaded;
    +                data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(
    +                    now,
    +                    loaded,
    +                    data.bitrateInterval
    +                );
    +                // Trigger a custom progress event with a total data property set
    +                // to the file size(s) of the current upload and a loaded data
    +                // property calculated accordingly:
    +                this._trigger('progress', e, data);
    +                // Trigger a global progress event for all current file uploads,
    +                // including ajax calls queued for sequential file uploads:
    +                this._trigger('progressall', e, this._progress);
    +            }
    +        },
    +
    +        _initProgressListener: function (options) {
    +            var that = this,
    +                xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr();
    +            // Accesss to the native XHR object is required to add event listeners
    +            // for the upload progress event:
    +            if (xhr.upload) {
    +                $(xhr.upload).bind('progress', function (e) {
    +                    var oe = e.originalEvent;
    +                    // Make sure the progress event properties get copied over:
    +                    e.lengthComputable = oe.lengthComputable;
    +                    e.loaded = oe.loaded;
    +                    e.total = oe.total;
    +                    that._onProgress(e, options);
    +                });
    +                options.xhr = function () {
    +                    return xhr;
    +                };
    +            }
    +        },
    +
    +        _isInstanceOf: function (type, obj) {
    +            // Cross-frame instanceof check
    +            return Object.prototype.toString.call(obj) === '[object ' + type + ']';
    +        },
    +
    +        _initXHRData: function (options) {
    +            var that = this,
    +                formData,
    +                file = options.files[0],
    +                // Ignore non-multipart setting if not supported:
    +                multipart = options.multipart || !$.support.xhrFileUpload,
    +                paramName = options.paramName[0];
    +            options.headers = options.headers || {};
    +            if (options.contentRange) {
    +                options.headers['Content-Range'] = options.contentRange;
    +            }
    +            if (!multipart) {
    +                options.headers['Content-Disposition'] = 'attachment; filename="' +
    +                    encodeURI(file.name) + '"';
    +                options.contentType = file.type;
    +                options.data = options.blob || file;
    +            } else if ($.support.xhrFormDataFileUpload) {
    +                if (options.postMessage) {
    +                    // window.postMessage does not allow sending FormData
    +                    // objects, so we just add the File/Blob objects to
    +                    // the formData array and let the postMessage window
    +                    // create the FormData object out of this array:
    +                    formData = this._getFormData(options);
    +                    if (options.blob) {
    +                        formData.push({
    +                            name: paramName,
    +                            value: options.blob
    +                        });
    +                    } else {
    +                        $.each(options.files, function (index, file) {
    +                            formData.push({
    +                                name: options.paramName[index] || paramName,
    +                                value: file
    +                            });
    +                        });
    +                    }
    +                } else {
    +                    if (that._isInstanceOf('FormData', options.formData)) {
    +                        formData = options.formData;
    +                    } else {
    +                        formData = new FormData();
    +                        $.each(this._getFormData(options), function (index, field) {
    +                            formData.append(field.name, field.value);
    +                        });
    +                    }
    +                    if (options.blob) {
    +                        options.headers['Content-Disposition'] = 'attachment; filename="' +
    +                            encodeURI(file.name) + '"';
    +                        formData.append(paramName, options.blob, file.name);
    +                    } else {
    +                        $.each(options.files, function (index, file) {
    +                            // This check allows the tests to run with
    +                            // dummy objects:
    +                            if (that._isInstanceOf('File', file) ||
    +                                    that._isInstanceOf('Blob', file)) {
    +                                formData.append(
    +                                    options.paramName[index] || paramName,
    +                                    file,
    +                                    file.name
    +                                );
    +                            }
    +                        });
    +                    }
    +                }
    +                options.data = formData;
    +            }
    +            // Blob reference is not needed anymore, free memory:
    +            options.blob = null;
    +        },
    +
    +        _initIframeSettings: function (options) {
    +            // Setting the dataType to iframe enables the iframe transport:
    +            options.dataType = 'iframe ' + (options.dataType || '');
    +            // The iframe transport accepts a serialized array as form data:
    +            options.formData = this._getFormData(options);
    +            // Add redirect url to form data on cross-domain uploads:
    +            if (options.redirect && $('<a></a>').prop('href', options.url)
    +                    .prop('host') !== location.host) {
    +                options.formData.push({
    +                    name: options.redirectParamName || 'redirect',
    +                    value: options.redirect
    +                });
    +            }
    +        },
    +
    +        _initDataSettings: function (options) {
    +            if (this._isXHRUpload(options)) {
    +                if (!this._chunkedUpload(options, true)) {
    +                    if (!options.data) {
    +                        this._initXHRData(options);
    +                    }
    +                    this._initProgressListener(options);
    +                }
    +                if (options.postMessage) {
    +                    // Setting the dataType to postmessage enables the
    +                    // postMessage transport:
    +                    options.dataType = 'postmessage ' + (options.dataType || '');
    +                }
    +            } else {
    +                this._initIframeSettings(options);
    +            }
    +        },
    +
    +        _getParamName: function (options) {
    +            var fileInput = $(options.fileInput),
    +                paramName = options.paramName;
    +            if (!paramName) {
    +                paramName = [];
    +                fileInput.each(function () {
    +                    var input = $(this),
    +                        name = input.prop('name') || 'files[]',
    +                        i = (input.prop('files') || [1]).length;
    +                    while (i) {
    +                        paramName.push(name);
    +                        i -= 1;
    +                    }
    +                });
    +                if (!paramName.length) {
    +                    paramName = [fileInput.prop('name') || 'files[]'];
    +                }
    +            } else if (!$.isArray(paramName)) {
    +                paramName = [paramName];
    +            }
    +            return paramName;
    +        },
    +
    +        _initFormSettings: function (options) {
    +            // Retrieve missing options from the input field and the
    +            // associated form, if available:
    +            if (!options.form || !options.form.length) {
    +                options.form = $(options.fileInput.prop('form'));
    +                // If the given file input doesn't have an associated form,
    +                // use the default widget file input's form:
    +                if (!options.form.length) {
    +                    options.form = $(this.options.fileInput.prop('form'));
    +                }
    +            }
    +            options.paramName = this._getParamName(options);
    +            if (!options.url) {
    +                options.url = options.form.prop('action') || location.href;
    +            }
    +            // The HTTP request method must be "POST" or "PUT":
    +            options.type = (options.type || options.form.prop('method') || '')
    +                .toUpperCase();
    +            if (options.type !== 'POST' && options.type !== 'PUT' &&
    +                    options.type !== 'PATCH') {
    +                options.type = 'POST';
    +            }
    +            if (!options.formAcceptCharset) {
    +                options.formAcceptCharset = options.form.attr('accept-charset');
    +            }
    +        },
    +
    +        _getAJAXSettings: function (data) {
    +            var options = $.extend({}, this.options, data);
    +            this._initFormSettings(options);
    +            this._initDataSettings(options);
    +            return options;
    +        },
    +
    +        // jQuery 1.6 doesn't provide .state(),
    +        // while jQuery 1.8+ removed .isRejected() and .isResolved():
    +        _getDeferredState: function (deferred) {
    +            if (deferred.state) {
    +                return deferred.state();
    +            }
    +            if (deferred.isResolved()) {
    +                return 'resolved';
    +            }
    +            if (deferred.isRejected()) {
    +                return 'rejected';
    +            }
    +            return 'pending';
    +        },
    +
    +        // Maps jqXHR callbacks to the equivalent
    +        // methods of the given Promise object:
    +        _enhancePromise: function (promise) {
    +            promise.success = promise.done;
    +            promise.error = promise.fail;
    +            promise.complete = promise.always;
    +            return promise;
    +        },
    +
    +        // Creates and returns a Promise object enhanced with
    +        // the jqXHR methods abort, success, error and complete:
    +        _getXHRPromise: function (resolveOrReject, context, args) {
    +            var dfd = $.Deferred(),
    +                promise = dfd.promise();
    +            context = context || this.options.context || promise;
    +            if (resolveOrReject === true) {
    +                dfd.resolveWith(context, args);
    +            } else if (resolveOrReject === false) {
    +                dfd.rejectWith(context, args);
    +            }
    +            promise.abort = dfd.promise;
    +            return this._enhancePromise(promise);
    +        },
    +
    +        // Adds convenience methods to the data callback argument:
    +        _addConvenienceMethods: function (e, data) {
    +            var that = this,
    +                getPromise = function (data) {
    +                    return $.Deferred().resolveWith(that, [data]).promise();
    +                };
    +            data.process = function (resolveFunc, rejectFunc) {
    +                if (resolveFunc || rejectFunc) {
    +                    data._processQueue = this._processQueue =
    +                        (this._processQueue || getPromise(this))
    +                            .pipe(resolveFunc, rejectFunc);
    +                }
    +                return this._processQueue || getPromise(this);
    +            };
    +            data.submit = function () {
    +                if (this.state() !== 'pending') {
    +                    data.jqXHR = this.jqXHR =
    +                        (that._trigger('submit', e, this) !== false) &&
    +                        that._onSend(e, this);
    +                }
    +                return this.jqXHR || that._getXHRPromise();
    +            };
    +            data.abort = function () {
    +                if (this.jqXHR) {
    +                    return this.jqXHR.abort();
    +                }
    +                return that._getXHRPromise();
    +            };
    +            data.state = function () {
    +                if (this.jqXHR) {
    +                    return that._getDeferredState(this.jqXHR);
    +                }
    +                if (this._processQueue) {
    +                    return that._getDeferredState(this._processQueue);
    +                }
    +            };
    +            data.progress = function () {
    +                return this._progress;
    +            };
    +            data.response = function () {
    +                return this._response;
    +            };
    +        },
    +
    +        // Parses the Range header from the server response
    +        // and returns the uploaded bytes:
    +        _getUploadedBytes: function (jqXHR) {
    +            var range = jqXHR.getResponseHeader('Range'),
    +                parts = range && range.split('-'),
    +                upperBytesPos = parts && parts.length > 1 &&
    +                    parseInt(parts[1], 10);
    +            return upperBytesPos && upperBytesPos + 1;
    +        },
    +
    +        // Uploads a file in multiple, sequential requests
    +        // by splitting the file up in multiple blob chunks.
    +        // If the second parameter is true, only tests if the file
    +        // should be uploaded in chunks, but does not invoke any
    +        // upload requests:
    +        _chunkedUpload: function (options, testOnly) {
    +            var that = this,
    +                file = options.files[0],
    +                fs = file.size,
    +                ub = options.uploadedBytes = options.uploadedBytes || 0,
    +                mcs = options.maxChunkSize || fs,
    +                slice = file.slice || file.webkitSlice || file.mozSlice,
    +                dfd = $.Deferred(),
    +                promise = dfd.promise(),
    +                jqXHR,
    +                upload;
    +            if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) ||
    +                    options.data) {
    +                return false;
    +            }
    +            if (testOnly) {
    +                return true;
    +            }
    +            if (ub >= fs) {
    +                file.error = options.i18n('uploadedBytes');
    +                return this._getXHRPromise(
    +                    false,
    +                    options.context,
    +                    [null, 'error', file.error]
    +                );
    +            }
    +            // The chunk upload method:
    +            upload = function () {
    +                // Clone the options object for each chunk upload:
    +                var o = $.extend({}, options),
    +                    currentLoaded = o._progress.loaded;
    +                o.blob = slice.call(
    +                    file,
    +                    ub,
    +                    ub + mcs,
    +                    file.type
    +                );
    +                // Store the current chunk size, as the blob itself
    +                // will be dereferenced after data processing:
    +                o.chunkSize = o.blob.size;
    +                // Expose the chunk bytes position range:
    +                o.contentRange = 'bytes ' + ub + '-' +
    +                    (ub + o.chunkSize - 1) + '/' + fs;
    +                // Process the upload data (the blob and potential form data):
    +                that._initXHRData(o);
    +                // Add progress listeners for this chunk upload:
    +                that._initProgressListener(o);
    +                jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) ||
    +                        that._getXHRPromise(false, o.context))
    +                    .done(function (result, textStatus, jqXHR) {
    +                        ub = that._getUploadedBytes(jqXHR) ||
    +                            (ub + o.chunkSize);
    +                        // Create a progress event if no final progress event
    +                        // with loaded equaling total has been triggered
    +                        // for this chunk:
    +                        if (o._progress.loaded === currentLoaded) {
    +                            that._onProgress($.Event('progress', {
    +                                lengthComputable: true,
    +                                loaded: ub - o.uploadedBytes,
    +                                total: ub - o.uploadedBytes
    +                            }), o);
    +                        }
    +                        options.uploadedBytes = o.uploadedBytes = ub;
    +                        o.result = result;
    +                        o.textStatus = textStatus;
    +                        o.jqXHR = jqXHR;
    +                        that._trigger('chunkdone', null, o);
    +                        that._trigger('chunkalways', null, o);
    +                        if (ub < fs) {
    +                            // File upload not yet complete,
    +                            // continue with the next chunk:
    +                            upload();
    +                        } else {
    +                            dfd.resolveWith(
    +                                o.context,
    +                                [result, textStatus, jqXHR]
    +                            );
    +                        }
    +                    })
    +                    .fail(function (jqXHR, textStatus, errorThrown) {
    +                        o.jqXHR = jqXHR;
    +                        o.textStatus = textStatus;
    +                        o.errorThrown = errorThrown;
    +                        that._trigger('chunkfail', null, o);
    +                        that._trigger('chunkalways', null, o);
    +                        dfd.rejectWith(
    +                            o.context,
    +                            [jqXHR, textStatus, errorThrown]
    +                        );
    +                    });
    +            };
    +            this._enhancePromise(promise);
    +            promise.abort = function () {
    +                return jqXHR.abort();
    +            };
    +            upload();
    +            return promise;
    +        },
    +
    +        _beforeSend: function (e, data) {
    +            if (this._active === 0) {
    +                // the start callback is triggered when an upload starts
    +                // and no other uploads are currently running,
    +                // equivalent to the global ajaxStart event:
    +                this._trigger('start');
    +                // Set timer for global bitrate progress calculation:
    +                this._bitrateTimer = new this._BitrateTimer();
    +                // Reset the global progress values:
    +                this._progress.loaded = this._progress.total = 0;
    +                this._progress.bitrate = 0;
    +            }
    +            // Make sure the container objects for the .response() and
    +            // .progress() methods on the data object are available
    +            // and reset to their initial state:
    +            this._initResponseObject(data);
    +            this._initProgressObject(data);
    +            data._progress.loaded = data.loaded = data.uploadedBytes || 0;
    +            data._progress.total = data.total = this._getTotal(data.files) || 1;
    +            data._progress.bitrate = data.bitrate = 0;
    +            this._active += 1;
    +            // Initialize the global progress values:
    +            this._progress.loaded += data.loaded;
    +            this._progress.total += data.total;
    +        },
    +
    +        _onDone: function (result, textStatus, jqXHR, options) {
    +            var total = options._progress.total,
    +                response = options._response;
    +            if (options._progress.loaded < total) {
    +                // Create a progress event if no final progress event
    +                // with loaded equaling total has been triggered:
    +                this._onProgress($.Event('progress', {
    +                    lengthComputable: true,
    +                    loaded: total,
    +                    total: total
    +                }), options);
    +            }
    +            response.result = options.result = result;
    +            response.textStatus = options.textStatus = textStatus;
    +            response.jqXHR = options.jqXHR = jqXHR;
    +            this._trigger('done', null, options);
    +        },
    +
    +        _onFail: function (jqXHR, textStatus, errorThrown, options) {
    +            var response = options._response;
    +            if (options.recalculateProgress) {
    +                // Remove the failed (error or abort) file upload from
    +                // the global progress calculation:
    +                this._progress.loaded -= options._progress.loaded;
    +                this._progress.total -= options._progress.total;
    +            }
    +            response.jqXHR = options.jqXHR = jqXHR;
    +            response.textStatus = options.textStatus = textStatus;
    +            response.errorThrown = options.errorThrown = errorThrown;
    +            this._trigger('fail', null, options);
    +        },
    +
    +        _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) {
    +            // jqXHRorResult, textStatus and jqXHRorError are added to the
    +            // options object via done and fail callbacks
    +            this._trigger('always', null, options);
    +        },
    +
    +        _onSend: function (e, data) {
    +            if (!data.submit) {
    +                this._addConvenienceMethods(e, data);
    +            }
    +            var that = this,
    +                jqXHR,
    +                aborted,
    +                slot,
    +                pipe,
    +                options = that._getAJAXSettings(data),
    +                send = function () {
    +                    that._sending += 1;
    +                    // Set timer for bitrate progress calculation:
    +                    options._bitrateTimer = new that._BitrateTimer();
    +                    jqXHR = jqXHR || (
    +                        ((aborted || that._trigger('send', e, options) === false) &&
    +                        that._getXHRPromise(false, options.context, aborted)) ||
    +                        that._chunkedUpload(options) || $.ajax(options)
    +                    ).done(function (result, textStatus, jqXHR) {
    +                        that._onDone(result, textStatus, jqXHR, options);
    +                    }).fail(function (jqXHR, textStatus, errorThrown) {
    +                        that._onFail(jqXHR, textStatus, errorThrown, options);
    +                    }).always(function (jqXHRorResult, textStatus, jqXHRorError) {
    +                        that._onAlways(
    +                            jqXHRorResult,
    +                            textStatus,
    +                            jqXHRorError,
    +                            options
    +                        );
    +                        that._sending -= 1;
    +                        that._active -= 1;
    +                        if (options.limitConcurrentUploads &&
    +                                options.limitConcurrentUploads > that._sending) {
    +                            // Start the next queued upload,
    +                            // that has not been aborted:
    +                            var nextSlot = that._slots.shift();
    +                            while (nextSlot) {
    +                                if (that._getDeferredState(nextSlot) === 'pending') {
    +                                    nextSlot.resolve();
    +                                    break;
    +                                }
    +                                nextSlot = that._slots.shift();
    +                            }
    +                        }
    +                        if (that._active === 0) {
    +                            // The stop callback is triggered when all uploads have
    +                            // been completed, equivalent to the global ajaxStop event:
    +                            that._trigger('stop');
    +                        }
    +                    });
    +                    return jqXHR;
    +                };
    +            this._beforeSend(e, options);
    +            if (this.options.sequentialUploads ||
    +                    (this.options.limitConcurrentUploads &&
    +                    this.options.limitConcurrentUploads <= this._sending)) {
    +                if (this.options.limitConcurrentUploads > 1) {
    +                    slot = $.Deferred();
    +                    this._slots.push(slot);
    +                    pipe = slot.pipe(send);
    +                } else {
    +                    pipe = (this._sequence = this._sequence.pipe(send, send));
    +                }
    +                // Return the piped Promise object, enhanced with an abort method,
    +                // which is delegated to the jqXHR object of the current upload,
    +                // and jqXHR callbacks mapped to the equivalent Promise methods:
    +                pipe.abort = function () {
    +                    aborted = [undefined, 'abort', 'abort'];
    +                    if (!jqXHR) {
    +                        if (slot) {
    +                            slot.rejectWith(options.context, aborted);
    +                        }
    +                        return send();
    +                    }
    +                    return jqXHR.abort();
    +                };
    +                return this._enhancePromise(pipe);
    +            }
    +            return send();
    +        },
    +
    +        _onAdd: function (e, data) {
    +            var that = this,
    +                result = true,
    +                options = $.extend({}, this.options, data),
    +                limit = options.limitMultiFileUploads,
    +                paramName = this._getParamName(options),
    +                paramNameSet,
    +                paramNameSlice,
    +                fileSet,
    +                i;
    +            if (!(options.singleFileUploads || limit) ||
    +                    !this._isXHRUpload(options)) {
    +                fileSet = [data.files];
    +                paramNameSet = [paramName];
    +            } else if (!options.singleFileUploads && limit) {
    +                fileSet = [];
    +                paramNameSet = [];
    +                for (i = 0; i < data.files.length; i += limit) {
    +                    fileSet.push(data.files.slice(i, i + limit));
    +                    paramNameSlice = paramName.slice(i, i + limit);
    +                    if (!paramNameSlice.length) {
    +                        paramNameSlice = paramName;
    +                    }
    +                    paramNameSet.push(paramNameSlice);
    +                }
    +            } else {
    +                paramNameSet = paramName;
    +            }
    +            data.originalFiles = data.files;
    +            $.each(fileSet || data.files, function (index, element) {
    +                var newData = $.extend({}, data);
    +                newData.files = fileSet ? element : [element];
    +                newData.paramName = paramNameSet[index];
    +                that._initResponseObject(newData);
    +                that._initProgressObject(newData);
    +                that._addConvenienceMethods(e, newData);
    +                result = that._trigger('add', e, newData);
    +                return result;
    +            });
    +            return result;
    +        },
    +
    +        _replaceFileInput: function (input) {
    +            var inputClone = input.clone(true);
    +            $('<form></form>').append(inputClone)[0].reset();
    +            // Detaching allows to insert the fileInput on another form
    +            // without loosing the file input value:
    +            input.after(inputClone).detach();
    +            // Avoid memory leaks with the detached file input:
    +            $.cleanData(input.unbind('remove'));
    +            // Replace the original file input element in the fileInput
    +            // elements set with the clone, which has been copied including
    +            // event handlers:
    +            this.options.fileInput = this.options.fileInput.map(function (i, el) {
    +                if (el === input[0]) {
    +                    return inputClone[0];
    +                }
    +                return el;
    +            });
    +            // If the widget has been initialized on the file input itself,
    +            // override this.element with the file input clone:
    +            if (input[0] === this.element[0]) {
    +                this.element = inputClone;
    +            }
    +        },
    +
    +        _handleFileTreeEntry: function (entry, path) {
    +            var that = this,
    +                dfd = $.Deferred(),
    +                errorHandler = function (e) {
    +                    if (e && !e.entry) {
    +                        e.entry = entry;
    +                    }
    +                    // Since $.when returns immediately if one
    +                    // Deferred is rejected, we use resolve instead.
    +                    // This allows valid files and invalid items
    +                    // to be returned together in one set:
    +                    dfd.resolve([e]);
    +                },
    +                dirReader;
    +            path = path || '';
    +            if (entry.isFile) {
    +                if (entry._file) {
    +                    // Workaround for Chrome bug #149735
    +                    entry._file.relativePath = path;
    +                    dfd.resolve(entry._file);
    +                } else {
    +                    entry.file(function (file) {
    +                        file.relativePath = path;
    +                        dfd.resolve(file);
    +                    }, errorHandler);
    +                }
    +            } else if (entry.isDirectory) {
    +                dirReader = entry.createReader();
    +                dirReader.readEntries(function (entries) {
    +                    that._handleFileTreeEntries(
    +                        entries,
    +                        path + entry.name + '/'
    +                    ).done(function (files) {
    +                        dfd.resolve(files);
    +                    }).fail(errorHandler);
    +                }, errorHandler);
    +            } else {
    +                // Return an empy list for file system items
    +                // other than files or directories:
    +                dfd.resolve([]);
    +            }
    +            return dfd.promise();
    +        },
    +
    +        _handleFileTreeEntries: function (entries, path) {
    +            var that = this;
    +            return $.when.apply(
    +                $,
    +                $.map(entries, function (entry) {
    +                    return that._handleFileTreeEntry(entry, path);
    +                })
    +            ).pipe(function () {
    +                return Array.prototype.concat.apply(
    +                    [],
    +                    arguments
    +                );
    +            });
    +        },
    +
    +        _getDroppedFiles: function (dataTransfer) {
    +            dataTransfer = dataTransfer || {};
    +            var items = dataTransfer.items;
    +            if (items && items.length && (items[0].webkitGetAsEntry ||
    +                    items[0].getAsEntry)) {
    +                return this._handleFileTreeEntries(
    +                    $.map(items, function (item) {
    +                        var entry;
    +                        if (item.webkitGetAsEntry) {
    +                            entry = item.webkitGetAsEntry();
    +                            if (entry) {
    +                                // Workaround for Chrome bug #149735:
    +                                entry._file = item.getAsFile();
    +                            }
    +                            return entry;
    +                        }
    +                        return item.getAsEntry();
    +                    })
    +                );
    +            }
    +            return $.Deferred().resolve(
    +                $.makeArray(dataTransfer.files)
    +            ).promise();
    +        },
    +
    +        _getSingleFileInputFiles: function (fileInput) {
    +            fileInput = $(fileInput);
    +            var entries = fileInput.prop('webkitEntries') ||
    +                    fileInput.prop('entries'),
    +                files,
    +                value;
    +            if (entries && entries.length) {
    +                return this._handleFileTreeEntries(entries);
    +            }
    +            files = $.makeArray(fileInput.prop('files'));
    +            if (!files.length) {
    +                value = fileInput.prop('value');
    +                if (!value) {
    +                    return $.Deferred().resolve([]).promise();
    +                }
    +                // If the files property is not available, the browser does not
    +                // support the File API and we add a pseudo File object with
    +                // the input value as name with path information removed:
    +                files = [{name: value.replace(/^.*\\/, '')}];
    +            } else if (files[0].name === undefined && files[0].fileName) {
    +                // File normalization for Safari 4 and Firefox 3:
    +                $.each(files, function (index, file) {
    +                    file.name = file.fileName;
    +                    file.size = file.fileSize;
    +                });
    +            }
    +            return $.Deferred().resolve(files).promise();
    +        },
    +
    +        _getFileInputFiles: function (fileInput) {
    +            if (!(fileInput instanceof $) || fileInput.length === 1) {
    +                return this._getSingleFileInputFiles(fileInput);
    +            }
    +            return $.when.apply(
    +                $,
    +                $.map(fileInput, this._getSingleFileInputFiles)
    +            ).pipe(function () {
    +                return Array.prototype.concat.apply(
    +                    [],
    +                    arguments
    +                );
    +            });
    +        },
    +
    +        _onChange: function (e) {
    +            var that = this,
    +                data = {
    +                    fileInput: $(e.target),
    +                    form: $(e.target.form)
    +                };
    +            this._getFileInputFiles(data.fileInput).always(function (files) {
    +                data.files = files;
    +                if (that.options.replaceFileInput) {
    +                    that._replaceFileInput(data.fileInput);
    +                }
    +                if (that._trigger('change', e, data) !== false) {
    +                    that._onAdd(e, data);
    +                }
    +            });
    +        },
    +
    +        _onPaste: function (e) {
    +            var items = e.originalEvent && e.originalEvent.clipboardData &&
    +                    e.originalEvent.clipboardData.items,
    +                data = {files: []};
    +            if (items && items.length) {
    +                $.each(items, function (index, item) {
    +                    var file = item.getAsFile && item.getAsFile();
    +                    if (file) {
    +                        data.files.push(file);
    +                    }
    +                });
    +                if (this._trigger('paste', e, data) === false ||
    +                        this._onAdd(e, data) === false) {
    +                    return false;
    +                }
    +            }
    +        },
    +
    +        _onDrop: function (e) {
    +            var that = this,
    +                dataTransfer = e.dataTransfer = e.originalEvent &&
    +                    e.originalEvent.dataTransfer,
    +                data = {};
    +            if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
    +                e.preventDefault();
    +                this._getDroppedFiles(dataTransfer).always(function (files) {
    +                    data.files = files;
    +                    if (that._trigger('drop', e, data) !== false) {
    +                        that._onAdd(e, data);
    +                    }
    +                });
    +            }
    +        },
    +
    +        _onDragOver: function (e) {
    +            var dataTransfer = e.dataTransfer = e.originalEvent &&
    +                e.originalEvent.dataTransfer;
    +            if (dataTransfer) {
    +                if (this._trigger('dragover', e) === false) {
    +                    return false;
    +                }
    +                if ($.inArray('Files', dataTransfer.types) !== -1) {
    +                    dataTransfer.dropEffect = 'copy';
    +                    e.preventDefault();
    +                }
    +            }
    +        },
    +
    +        _initEventHandlers: function () {
    +            if (this._isXHRUpload(this.options)) {
    +                this._on(this.options.dropZone, {
    +                    dragover: this._onDragOver,
    +                    drop: this._onDrop
    +                });
    +                this._on(this.options.pasteZone, {
    +                    paste: this._onPaste
    +                });
    +            }
    +            this._on(this.options.fileInput, {
    +                change: this._onChange
    +            });
    +        },
    +
    +        _destroyEventHandlers: function () {
    +            this._off(this.options.dropZone, 'dragover drop');
    +            this._off(this.options.pasteZone, 'paste');
    +            this._off(this.options.fileInput, 'change');
    +        },
    +
    +        _setOption: function (key, value) {
    +            var reinit = $.inArray(key, this._specialOptions) !== -1;
    +            if (reinit) {
    +                this._destroyEventHandlers();
    +            }
    +            this._super(key, value);
    +            if (reinit) {
    +                this._initSpecialOptions();
    +                this._initEventHandlers();
    +            }
    +        },
    +
    +        _initSpecialOptions: function () {
    +            var options = this.options;
    +            if (options.fileInput === undefined) {
    +                options.fileInput = this.element.is('input[type="file"]') ?
    +                        this.element : this.element.find('input[type="file"]');
    +            } else if (!(options.fileInput instanceof $)) {
    +                options.fileInput = $(options.fileInput);
    +            }
    +            if (!(options.dropZone instanceof $)) {
    +                options.dropZone = $(options.dropZone);
    +            }
    +            if (!(options.pasteZone instanceof $)) {
    +                options.pasteZone = $(options.pasteZone);
    +            }
    +        },
    +
    +        _getRegExp: function (str) {
    +            var parts = str.split('/'),
    +                modifiers = parts.pop();
    +            parts.shift();
    +            return new RegExp(parts.join('/'), modifiers);
    +        },
    +
    +        _isRegExpOption: function (key, value) {
    +            return key !== 'url' && $.type(value) === 'string' &&
    +                /^\/.*\/[igm]{0,3}$/.test(value);
    +        },
    +
    +        _initDataAttributes: function () {
    +            var that = this,
    +                options = this.options;
    +            // Initialize options set via HTML5 data-attributes:
    +            $.each(
    +                $(this.element[0].cloneNode(false)).data(),
    +                function (key, value) {
    +                    if (that._isRegExpOption(key, value)) {
    +                        value = that._getRegExp(value);
    +                    }
    +                    options[key] = value;
    +                }
    +            );
    +        },
    +
    +        _create: function () {
    +            this._initDataAttributes();
    +            this._initSpecialOptions();
    +            this._slots = [];
    +            this._sequence = this._getXHRPromise(true);
    +            this._sending = this._active = 0;
    +            this._initProgressObject(this);
    +            this._initEventHandlers();
    +        },
    +
    +        // This method is exposed to the widget API and allows to query
    +        // the number of active uploads:
    +        active: function () {
    +            return this._active;
    +        },
    +
    +        // This method is exposed to the widget API and allows to query
    +        // the widget upload progress.
    +        // It returns an object with loaded, total and bitrate properties
    +        // for the running uploads:
    +        progress: function () {
    +            return this._progress;
    +        },
    +
    +        // This method is exposed to the widget API and allows adding files
    +        // using the fileupload API. The data parameter accepts an object which
    +        // must have a files property and can contain additional options:
    +        // .fileupload('add', {files: filesList});
    +        add: function (data) {
    +            var that = this;
    +            if (!data || this.options.disabled) {
    +                return;
    +            }
    +            if (data.fileInput && !data.files) {
    +                this._getFileInputFiles(data.fileInput).always(function (files) {
    +                    data.files = files;
    +                    that._onAdd(null, data);
    +                });
    +            } else {
    +                data.files = $.makeArray(data.files);
    +                this._onAdd(null, data);
    +            }
    +        },
    +
    +        // This method is exposed to the widget API and allows sending files
    +        // using the fileupload API. The data parameter accepts an object which
    +        // must have a files or fileInput property and can contain additional options:
    +        // .fileupload('send', {files: filesList});
    +        // The method returns a Promise object for the file upload call.
    +        send: function (data) {
    +            if (data && !this.options.disabled) {
    +                if (data.fileInput && !data.files) {
    +                    var that = this,
    +                        dfd = $.Deferred(),
    +                        promise = dfd.promise(),
    +                        jqXHR,
    +                        aborted;
    +                    promise.abort = function () {
    +                        aborted = true;
    +                        if (jqXHR) {
    +                            return jqXHR.abort();
    +                        }
    +                        dfd.reject(null, 'abort', 'abort');
    +                        return promise;
    +                    };
    +                    this._getFileInputFiles(data.fileInput).always(
    +                        function (files) {
    +                            if (aborted) {
    +                                return;
    +                            }
    +                            data.files = files;
    +                            jqXHR = that._onSend(null, data).then(
    +                                function (result, textStatus, jqXHR) {
    +                                    dfd.resolve(result, textStatus, jqXHR);
    +                                },
    +                                function (jqXHR, textStatus, errorThrown) {
    +                                    dfd.reject(jqXHR, textStatus, errorThrown);
    +                                }
    +                            );
    +                        }
    +                    );
    +                    return this._enhancePromise(promise);
    +                }
    +                data.files = $.makeArray(data.files);
    +                if (data.files.length) {
    +                    return this._onSend(null, data);
    +                }
    +            }
    +            return this._getXHRPromise(false, data && data.context);
    +        }
    +
    +    });
    +
    +}));
    diff --git a/src/main/webapp/plug-in/jquery-plugs/fileupload/js/jquery.iframe-transport.js b/src/main/webapp/plug-in/jquery-plugs/fileupload/js/jquery.iframe-transport.js
    new file mode 100644
    index 00000000..ed258950
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/fileupload/js/jquery.iframe-transport.js
    @@ -0,0 +1,185 @@
    +/*
    + * jQuery Iframe Transport Plugin 1.6.1
    + * https://github.com/blueimp/jQuery-File-Upload
    + *
    + * Copyright 2011, Sebastian Tschan
    + * https://blueimp.net
    + *
    + * Licensed under the MIT license:
    + * http://www.opensource.org/licenses/MIT
    + */
    +
    +/*jslint unparam: true, nomen: true */
    +/*global define, window, document */
    +
    +(function (factory) {
    +    'use strict';
    +    if (typeof define === 'function' && define.amd) {
    +        // Register as an anonymous AMD module:
    +        define(['jquery'], factory);
    +    } else {
    +        // Browser globals:
    +        factory(window.jQuery);
    +    }
    +}(function ($) {
    +    'use strict';
    +
    +    // Helper variable to create unique names for the transport iframes:
    +    var counter = 0;
    +
    +    // The iframe transport accepts three additional options:
    +    // options.fileInput: a jQuery collection of file input fields
    +    // options.paramName: the parameter name for the file form data,
    +    //  overrides the name property of the file input field(s),
    +    //  can be a string or an array of strings.
    +    // options.formData: an array of objects with name and value properties,
    +    //  equivalent to the return data of .serializeArray(), e.g.:
    +    //  [{name: 'a', value: 1}, {name: 'b', value: 2}]
    +    $.ajaxTransport('iframe', function (options) {
    +        if (options.async) {
    +            var form,
    +                iframe,
    +                addParamChar;
    +            return {
    +                send: function (_, completeCallback) {
    +                    form = $('<form style="display:none;"></form>');
    +                    form.attr('accept-charset', options.formAcceptCharset);
    +                    addParamChar = /\?/.test(options.url) ? '&' : '?';
    +                    // XDomainRequest only supports GET and POST:
    +                    if (options.type === 'DELETE') {
    +                        options.url = options.url + addParamChar + '_method=DELETE';
    +                        options.type = 'POST';
    +                    } else if (options.type === 'PUT') {
    +                        options.url = options.url + addParamChar + '_method=PUT';
    +                        options.type = 'POST';
    +                    } else if (options.type === 'PATCH') {
    +                        options.url = options.url + addParamChar + '_method=PATCH';
    +                        options.type = 'POST';
    +                    }
    +                    // javascript:false as initial iframe src
    +                    // prevents warning popups on HTTPS in IE6.
    +                    // IE versions below IE8 cannot set the name property of
    +                    // elements that have already been added to the DOM,
    +                    // so we set the name along with the iframe HTML markup:
    +                    iframe = $(
    +                        '<iframe src="javascript:false;" name="iframe-transport-' +
    +                            (counter += 1) + '"></iframe>'
    +                    ).bind('load', function () {
    +                        var fileInputClones,
    +                            paramNames = $.isArray(options.paramName) ?
    +                                    options.paramName : [options.paramName];
    +                        iframe
    +                            .unbind('load')
    +                            .bind('load', function () {
    +                                var response;
    +                                // Wrap in a try/catch block to catch exceptions thrown
    +                                // when trying to access cross-domain iframe contents:
    +                                try {
    +                                    response = iframe.contents();
    +                                    // Google Chrome and Firefox do not throw an
    +                                    // exception when calling iframe.contents() on
    +                                    // cross-domain requests, so we unify the response:
    +                                    if (!response.length || !response[0].firstChild) {
    +                                        throw new Error();
    +                                    }
    +                                } catch (e) {
    +                                    response = undefined;
    +                                }
    +                                // The complete callback returns the
    +                                // iframe content document as response object:
    +                                completeCallback(
    +                                    200,
    +                                    'success',
    +                                    {'iframe': response}
    +                                );
    +                                // Fix for IE endless progress bar activity bug
    +                                // (happens on form submits to iframe targets):
    +                                $('<iframe src="javascript:false;"></iframe>')
    +                                    .appendTo(form);
    +                                form.remove();
    +                            });
    +                        form
    +                            .prop('target', iframe.prop('name'))
    +                            .prop('action', options.url)
    +                            .prop('method', options.type);
    +                        if (options.formData) {
    +                            $.each(options.formData, function (index, field) {
    +                                $('<input type="hidden"/>')
    +                                    .prop('name', field.name)
    +                                    .val(field.value)
    +                                    .appendTo(form);
    +                            });
    +                        }
    +                        if (options.fileInput && options.fileInput.length &&
    +                                options.type === 'POST') {
    +                            fileInputClones = options.fileInput.clone();
    +                            // Insert a clone for each file input field:
    +                            options.fileInput.after(function (index) {
    +                                return fileInputClones[index];
    +                            });
    +                            if (options.paramName) {
    +                                options.fileInput.each(function (index) {
    +                                    $(this).prop(
    +                                        'name',
    +                                        paramNames[index] || options.paramName
    +                                    );
    +                                });
    +                            }
    +                            // Appending the file input fields to the hidden form
    +                            // removes them from their original location:
    +                            form
    +                                .append(options.fileInput)
    +                                .prop('enctype', 'multipart/form-data')
    +                                // enctype must be set as encoding for IE:
    +                                .prop('encoding', 'multipart/form-data');
    +                        }
    +                        form.submit();
    +                        // Insert the file input fields at their original location
    +                        // by replacing the clones with the originals:
    +                        if (fileInputClones && fileInputClones.length) {
    +                            options.fileInput.each(function (index, input) {
    +                                var clone = $(fileInputClones[index]);
    +                                $(input).prop('name', clone.prop('name'));
    +                                clone.replaceWith(input);
    +                            });
    +                        }
    +                    });
    +                    form.append(iframe).appendTo(document.body);
    +                },
    +                abort: function () {
    +                    if (iframe) {
    +                        // javascript:false as iframe src aborts the request
    +                        // and prevents warning popups on HTTPS in IE6.
    +                        // concat is used to avoid the "Script URL" JSLint error:
    +                        iframe
    +                            .unbind('load')
    +                            .prop('src', 'javascript'.concat(':false;'));
    +                    }
    +                    if (form) {
    +                        form.remove();
    +                    }
    +                }
    +            };
    +        }
    +    });
    +
    +    // The iframe transport returns the iframe content document as response.
    +    // The following adds converters from iframe to text, json, html, and script:
    +    $.ajaxSetup({
    +        converters: {
    +            'iframe text': function (iframe) {
    +                return iframe && $(iframe[0].body).text();
    +            },
    +            'iframe json': function (iframe) {
    +                return iframe && $.parseJSON($(iframe[0].body).text());
    +            },
    +            'iframe html': function (iframe) {
    +                return iframe && $(iframe[0].body).html();
    +            },
    +            'iframe script': function (iframe) {
    +                return iframe && $.globalEval($(iframe[0].body).text());
    +            }
    +        }
    +    });
    +
    +}));
    diff --git a/src/main/webapp/plug-in/jquery-plugs/fileupload/js/myuploadfunction.js b/src/main/webapp/plug-in/jquery-plugs/fileupload/js/myuploadfunction.js
    new file mode 100644
    index 00000000..acf5add4
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/fileupload/js/myuploadfunction.js
    @@ -0,0 +1,28 @@
    +$(function () {
    +    $('#fileupload').fileupload({
    +        dataType: 'json',
    +        
    +        done: function (e, data) {
    +        	$("tr:has(td)").remove();
    +            $.each(data.result, function (index, file) {
    +                $("#uploaded-files").append(
    +                		$('<tr/>')
    +                		.append($('<td/>').text(file.fileName))
    +                		.append($('<td/>').text(file.fileSize))
    +                		.append($('<td/>').text(file.fileType))
    +                		.append($('<td/>').html("<a href='fileUploadController.do?view&index="+index+"'>涓嬭浇</a>"))
    +                		)//end $("#uploaded-files").append()
    +            }); 
    +        },
    +        
    +        progressall: function (e, data) {
    +	        var progress = parseInt(data.loaded / data.total * 100, 10);
    +	        $('#progress .bar').css(
    +	            'width',
    +	            progress + '%'
    +	        );
    +   		},
    +   		
    +		dropZone: $('#dropzone')
    +    });
    +});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-plugs/fileupload/js/vendor/jquery.ui.widget.js b/src/main/webapp/plug-in/jquery-plugs/fileupload/js/vendor/jquery.ui.widget.js
    new file mode 100644
    index 00000000..fd2948f5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/fileupload/js/vendor/jquery.ui.widget.js
    @@ -0,0 +1,530 @@
    +/*
    + * jQuery UI Widget 1.10.1+amd
    + * https://github.com/blueimp/jQuery-File-Upload
    + *
    + * Copyright 2013 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/jQuery.widget/
    + */
    +
    +(function (factory) {
    +    if (typeof define === "function" && define.amd) {
    +        // Register as an anonymous AMD module:
    +        define(["jquery"], factory);
    +    } else {
    +        // Browser globals:
    +        factory(jQuery);
    +    }
    +}(function( $, undefined ) {
    +
    +var uuid = 0,
    +	slice = Array.prototype.slice,
    +	_cleanData = $.cleanData;
    +$.cleanData = function( elems ) {
    +	for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
    +		try {
    +			$( elem ).triggerHandler( "remove" );
    +		// http://bugs.jquery.com/ticket/8235
    +		} catch( e ) {}
    +	}
    +	_cleanData( elems );
    +};
    +
    +$.widget = function( name, base, prototype ) {
    +	var fullName, existingConstructor, constructor, basePrototype,
    +		// proxiedPrototype allows the provided prototype to remain unmodified
    +		// so that it can be used as a mixin for multiple widgets (#8876)
    +		proxiedPrototype = {},
    +		namespace = name.split( "." )[ 0 ];
    +
    +	name = name.split( "." )[ 1 ];
    +	fullName = namespace + "-" + name;
    +
    +	if ( !prototype ) {
    +		prototype = base;
    +		base = $.Widget;
    +	}
    +
    +	// create selector for plugin
    +	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
    +		return !!$.data( elem, fullName );
    +	};
    +
    +	$[ namespace ] = $[ namespace ] || {};
    +	existingConstructor = $[ namespace ][ name ];
    +	constructor = $[ namespace ][ name ] = function( options, element ) {
    +		// allow instantiation without "new" keyword
    +		if ( !this._createWidget ) {
    +			return new constructor( options, element );
    +		}
    +
    +		// allow instantiation without initializing for simple inheritance
    +		// must use "new" keyword (the code above always passes args)
    +		if ( arguments.length ) {
    +			this._createWidget( options, element );
    +		}
    +	};
    +	// extend with the existing constructor to carry over any static properties
    +	$.extend( constructor, existingConstructor, {
    +		version: prototype.version,
    +		// copy the object used to create the prototype in case we need to
    +		// redefine the widget later
    +		_proto: $.extend( {}, prototype ),
    +		// track widgets that inherit from this widget in case this widget is
    +		// redefined after a widget inherits from it
    +		_childConstructors: []
    +	});
    +
    +	basePrototype = new base();
    +	// we need to make the options hash a property directly on the new instance
    +	// otherwise we'll modify the options hash on the prototype that we're
    +	// inheriting from
    +	basePrototype.options = $.widget.extend( {}, basePrototype.options );
    +	$.each( prototype, function( prop, value ) {
    +		if ( !$.isFunction( value ) ) {
    +			proxiedPrototype[ prop ] = value;
    +			return;
    +		}
    +		proxiedPrototype[ prop ] = (function() {
    +			var _super = function() {
    +					return base.prototype[ prop ].apply( this, arguments );
    +				},
    +				_superApply = function( args ) {
    +					return base.prototype[ prop ].apply( this, args );
    +				};
    +			return function() {
    +				var __super = this._super,
    +					__superApply = this._superApply,
    +					returnValue;
    +
    +				this._super = _super;
    +				this._superApply = _superApply;
    +
    +				returnValue = value.apply( this, arguments );
    +
    +				this._super = __super;
    +				this._superApply = __superApply;
    +
    +				return returnValue;
    +			};
    +		})();
    +	});
    +	constructor.prototype = $.widget.extend( basePrototype, {
    +		// TODO: remove support for widgetEventPrefix
    +		// always use the name + a colon as the prefix, e.g., draggable:start
    +		// don't prefix for widgets that aren't DOM-based
    +		widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
    +	}, proxiedPrototype, {
    +		constructor: constructor,
    +		namespace: namespace,
    +		widgetName: name,
    +		widgetFullName: fullName
    +	});
    +
    +	// If this widget is being redefined then we need to find all widgets that
    +	// are inheriting from it and redefine all of them so that they inherit from
    +	// the new version of this widget. We're essentially trying to replace one
    +	// level in the prototype chain.
    +	if ( existingConstructor ) {
    +		$.each( existingConstructor._childConstructors, function( i, child ) {
    +			var childPrototype = child.prototype;
    +
    +			// redefine the child widget using the same prototype that was
    +			// originally used, but inherit from the new version of the base
    +			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
    +		});
    +		// remove the list of existing child constructors from the old constructor
    +		// so the old child constructors can be garbage collected
    +		delete existingConstructor._childConstructors;
    +	} else {
    +		base._childConstructors.push( constructor );
    +	}
    +
    +	$.widget.bridge( name, constructor );
    +};
    +
    +$.widget.extend = function( target ) {
    +	var input = slice.call( arguments, 1 ),
    +		inputIndex = 0,
    +		inputLength = input.length,
    +		key,
    +		value;
    +	for ( ; inputIndex < inputLength; inputIndex++ ) {
    +		for ( key in input[ inputIndex ] ) {
    +			value = input[ inputIndex ][ key ];
    +			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
    +				// Clone objects
    +				if ( $.isPlainObject( value ) ) {
    +					target[ key ] = $.isPlainObject( target[ key ] ) ?
    +						$.widget.extend( {}, target[ key ], value ) :
    +						// Don't extend strings, arrays, etc. with objects
    +						$.widget.extend( {}, value );
    +				// Copy everything else by reference
    +				} else {
    +					target[ key ] = value;
    +				}
    +			}
    +		}
    +	}
    +	return target;
    +};
    +
    +$.widget.bridge = function( name, object ) {
    +	var fullName = object.prototype.widgetFullName || name;
    +	$.fn[ name ] = function( options ) {
    +		var isMethodCall = typeof options === "string",
    +			args = slice.call( arguments, 1 ),
    +			returnValue = this;
    +
    +		// allow multiple hashes to be passed on init
    +		options = !isMethodCall && args.length ?
    +			$.widget.extend.apply( null, [ options ].concat(args) ) :
    +			options;
    +
    +		if ( isMethodCall ) {
    +			this.each(function() {
    +				var methodValue,
    +					instance = $.data( this, fullName );
    +				if ( !instance ) {
    +					return $.error( "cannot call methods on " + name + " prior to initialization; " +
    +						"attempted to call method '" + options + "'" );
    +				}
    +				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
    +					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
    +				}
    +				methodValue = instance[ options ].apply( instance, args );
    +				if ( methodValue !== instance && methodValue !== undefined ) {
    +					returnValue = methodValue && methodValue.jquery ?
    +						returnValue.pushStack( methodValue.get() ) :
    +						methodValue;
    +					return false;
    +				}
    +			});
    +		} else {
    +			this.each(function() {
    +				var instance = $.data( this, fullName );
    +				if ( instance ) {
    +					instance.option( options || {} )._init();
    +				} else {
    +					$.data( this, fullName, new object( options, this ) );
    +				}
    +			});
    +		}
    +
    +		return returnValue;
    +	};
    +};
    +
    +$.Widget = function( /* options, element */ ) {};
    +$.Widget._childConstructors = [];
    +
    +$.Widget.prototype = {
    +	widgetName: "widget",
    +	widgetEventPrefix: "",
    +	defaultElement: "<div>",
    +	options: {
    +		disabled: false,
    +
    +		// callbacks
    +		create: null
    +	},
    +	_createWidget: function( options, element ) {
    +		element = $( element || this.defaultElement || this )[ 0 ];
    +		this.element = $( element );
    +		this.uuid = uuid++;
    +		this.eventNamespace = "." + this.widgetName + this.uuid;
    +		this.options = $.widget.extend( {},
    +			this.options,
    +			this._getCreateOptions(),
    +			options );
    +
    +		this.bindings = $();
    +		this.hoverable = $();
    +		this.focusable = $();
    +
    +		if ( element !== this ) {
    +			$.data( element, this.widgetFullName, this );
    +			this._on( true, this.element, {
    +				remove: function( event ) {
    +					if ( event.target === element ) {
    +						this.destroy();
    +					}
    +				}
    +			});
    +			this.document = $( element.style ?
    +				// element within the document
    +				element.ownerDocument :
    +				// element is window or document
    +				element.document || element );
    +			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
    +		}
    +
    +		this._create();
    +		this._trigger( "create", null, this._getCreateEventData() );
    +		this._init();
    +	},
    +	_getCreateOptions: $.noop,
    +	_getCreateEventData: $.noop,
    +	_create: $.noop,
    +	_init: $.noop,
    +
    +	destroy: function() {
    +		this._destroy();
    +		// we can probably remove the unbind calls in 2.0
    +		// all event bindings should go through this._on()
    +		this.element
    +			.unbind( this.eventNamespace )
    +			// 1.9 BC for #7810
    +			// TODO remove dual storage
    +			.removeData( this.widgetName )
    +			.removeData( this.widgetFullName )
    +			// support: jquery <1.6.3
    +			// http://bugs.jquery.com/ticket/9413
    +			.removeData( $.camelCase( this.widgetFullName ) );
    +		this.widget()
    +			.unbind( this.eventNamespace )
    +			.removeAttr( "aria-disabled" )
    +			.removeClass(
    +				this.widgetFullName + "-disabled " +
    +				"ui-state-disabled" );
    +
    +		// clean up events and states
    +		this.bindings.unbind( this.eventNamespace );
    +		this.hoverable.removeClass( "ui-state-hover" );
    +		this.focusable.removeClass( "ui-state-focus" );
    +	},
    +	_destroy: $.noop,
    +
    +	widget: function() {
    +		return this.element;
    +	},
    +
    +	option: function( key, value ) {
    +		var options = key,
    +			parts,
    +			curOption,
    +			i;
    +
    +		if ( arguments.length === 0 ) {
    +			// don't return a reference to the internal hash
    +			return $.widget.extend( {}, this.options );
    +		}
    +
    +		if ( typeof key === "string" ) {
    +			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
    +			options = {};
    +			parts = key.split( "." );
    +			key = parts.shift();
    +			if ( parts.length ) {
    +				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
    +				for ( i = 0; i < parts.length - 1; i++ ) {
    +					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
    +					curOption = curOption[ parts[ i ] ];
    +				}
    +				key = parts.pop();
    +				if ( value === undefined ) {
    +					return curOption[ key ] === undefined ? null : curOption[ key ];
    +				}
    +				curOption[ key ] = value;
    +			} else {
    +				if ( value === undefined ) {
    +					return this.options[ key ] === undefined ? null : this.options[ key ];
    +				}
    +				options[ key ] = value;
    +			}
    +		}
    +
    +		this._setOptions( options );
    +
    +		return this;
    +	},
    +	_setOptions: function( options ) {
    +		var key;
    +
    +		for ( key in options ) {
    +			this._setOption( key, options[ key ] );
    +		}
    +
    +		return this;
    +	},
    +	_setOption: function( key, value ) {
    +		this.options[ key ] = value;
    +
    +		if ( key === "disabled" ) {
    +			this.widget()
    +				.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
    +				.attr( "aria-disabled", value );
    +			this.hoverable.removeClass( "ui-state-hover" );
    +			this.focusable.removeClass( "ui-state-focus" );
    +		}
    +
    +		return this;
    +	},
    +
    +	enable: function() {
    +		return this._setOption( "disabled", false );
    +	},
    +	disable: function() {
    +		return this._setOption( "disabled", true );
    +	},
    +
    +	_on: function( suppressDisabledCheck, element, handlers ) {
    +		var delegateElement,
    +			instance = this;
    +
    +		// no suppressDisabledCheck flag, shuffle arguments
    +		if ( typeof suppressDisabledCheck !== "boolean" ) {
    +			handlers = element;
    +			element = suppressDisabledCheck;
    +			suppressDisabledCheck = false;
    +		}
    +
    +		// no element argument, shuffle and use this.element
    +		if ( !handlers ) {
    +			handlers = element;
    +			element = this.element;
    +			delegateElement = this.widget();
    +		} else {
    +			// accept selectors, DOM elements
    +			element = delegateElement = $( element );
    +			this.bindings = this.bindings.add( element );
    +		}
    +
    +		$.each( handlers, function( event, handler ) {
    +			function handlerProxy() {
    +				// allow widgets to customize the disabled handling
    +				// - disabled as an array instead of boolean
    +				// - disabled class as method for disabling individual parts
    +				if ( !suppressDisabledCheck &&
    +						( instance.options.disabled === true ||
    +							$( this ).hasClass( "ui-state-disabled" ) ) ) {
    +					return;
    +				}
    +				return ( typeof handler === "string" ? instance[ handler ] : handler )
    +					.apply( instance, arguments );
    +			}
    +
    +			// copy the guid so direct unbinding works
    +			if ( typeof handler !== "string" ) {
    +				handlerProxy.guid = handler.guid =
    +					handler.guid || handlerProxy.guid || $.guid++;
    +			}
    +
    +			var match = event.match( /^(\w+)\s*(.*)$/ ),
    +				eventName = match[1] + instance.eventNamespace,
    +				selector = match[2];
    +			if ( selector ) {
    +				delegateElement.delegate( selector, eventName, handlerProxy );
    +			} else {
    +				element.bind( eventName, handlerProxy );
    +			}
    +		});
    +	},
    +
    +	_off: function( element, eventName ) {
    +		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
    +		element.unbind( eventName ).undelegate( eventName );
    +	},
    +
    +	_delay: function( handler, delay ) {
    +		function handlerProxy() {
    +			return ( typeof handler === "string" ? instance[ handler ] : handler )
    +				.apply( instance, arguments );
    +		}
    +		var instance = this;
    +		return setTimeout( handlerProxy, delay || 0 );
    +	},
    +
    +	_hoverable: function( element ) {
    +		this.hoverable = this.hoverable.add( element );
    +		this._on( element, {
    +			mouseenter: function( event ) {
    +				$( event.currentTarget ).addClass( "ui-state-hover" );
    +			},
    +			mouseleave: function( event ) {
    +				$( event.currentTarget ).removeClass( "ui-state-hover" );
    +			}
    +		});
    +	},
    +
    +	_focusable: function( element ) {
    +		this.focusable = this.focusable.add( element );
    +		this._on( element, {
    +			focusin: function( event ) {
    +				$( event.currentTarget ).addClass( "ui-state-focus" );
    +			},
    +			focusout: function( event ) {
    +				$( event.currentTarget ).removeClass( "ui-state-focus" );
    +			}
    +		});
    +	},
    +
    +	_trigger: function( type, event, data ) {
    +		var prop, orig,
    +			callback = this.options[ type ];
    +
    +		data = data || {};
    +		event = $.Event( event );
    +		event.type = ( type === this.widgetEventPrefix ?
    +			type :
    +			this.widgetEventPrefix + type ).toLowerCase();
    +		// the original event may come from any element
    +		// so we need to reset the target on the new event
    +		event.target = this.element[ 0 ];
    +
    +		// copy original event properties over to the new event
    +		orig = event.originalEvent;
    +		if ( orig ) {
    +			for ( prop in orig ) {
    +				if ( !( prop in event ) ) {
    +					event[ prop ] = orig[ prop ];
    +				}
    +			}
    +		}
    +
    +		this.element.trigger( event, data );
    +		return !( $.isFunction( callback ) &&
    +			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
    +			event.isDefaultPrevented() );
    +	}
    +};
    +
    +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
    +	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
    +		if ( typeof options === "string" ) {
    +			options = { effect: options };
    +		}
    +		var hasOptions,
    +			effectName = !options ?
    +				method :
    +				options === true || typeof options === "number" ?
    +					defaultEffect :
    +					options.effect || defaultEffect;
    +		options = options || {};
    +		if ( typeof options === "number" ) {
    +			options = { duration: options };
    +		}
    +		hasOptions = !$.isEmptyObject( options );
    +		options.complete = callback;
    +		if ( options.delay ) {
    +			element.delay( options.delay );
    +		}
    +		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
    +			element[ method ]( options );
    +		} else if ( effectName !== method && element[ effectName ] ) {
    +			element[ effectName ]( options.duration, options.easing, callback );
    +		} else {
    +			element.queue(function( next ) {
    +				$( this )[ method ]();
    +				if ( callback ) {
    +					callback.call( element[ 0 ] );
    +				}
    +				next();
    +			});
    +		}
    +	};
    +});
    +
    +}));
    diff --git a/src/main/webapp/plug-in/jquery-plugs/form/jquery.form.js b/src/main/webapp/plug-in/jquery-plugs/form/jquery.form.js
    new file mode 100644
    index 00000000..d759914f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/form/jquery.form.js
    @@ -0,0 +1,1117 @@
    +/*!
    + * jQuery Form Plugin
    + * version: 3.18 (28-SEP-2012)
    + * @requires jQuery v1.5 or later
    + *
    + * Examples and documentation at: http://malsup.com/jquery/form/
    + * Project repository: https://github.com/malsup/form
    + * Dual licensed under the MIT and GPL licenses:
    + *    http://malsup.github.com/mit-license.txt
    + *    http://malsup.github.com/gpl-license-v2.txt
    + */
    +/*global ActiveXObject alert */
    +;(function($) {
    +"use strict";
    +
    +/*
    +    Usage Note:
    +    -----------
    +    Do not use both ajaxSubmit and ajaxForm on the same form.  These
    +    functions are mutually exclusive.  Use ajaxSubmit if you want
    +    to bind your own submit handler to the form.  For example,
    +
    +    $(document).ready(function() {
    +        $('#myForm').on('submit', function(e) {
    +            e.preventDefault(); // <-- important
    +            $(this).ajaxSubmit({
    +                target: '#output'
    +            });
    +        });
    +    });
    +
    +    Use ajaxForm when you want the plugin to manage all the event binding
    +    for you.  For example,
    +
    +    $(document).ready(function() {
    +        $('#myForm').ajaxForm({
    +            target: '#output'
    +        });
    +    });
    +    
    +    You can also use ajaxForm with delegation (requires jQuery v1.7+), so the
    +    form does not have to exist when you invoke ajaxForm:
    +
    +    $('#myForm').ajaxForm({
    +        delegation: true,
    +        target: '#output'
    +    });
    +    
    +    When using ajaxForm, the ajaxSubmit function will be invoked for you
    +    at the appropriate time.
    +*/
    +
    +/**
    + * Feature detection
    + */
    +var feature = {};
    +feature.fileapi = $("<input type='file'/>").get(0).files !== undefined;
    +feature.formdata = window.FormData !== undefined;
    +
    +/**
    + * ajaxSubmit() provides a mechanism for immediately submitting
    + * an HTML form using AJAX.
    + */
    +$.fn.ajaxSubmit = function(options) {
    +    /*jshint scripturl:true */
    +
    +    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
    +    if (!this.length) {
    +        log('ajaxSubmit: skipping submit process - no element selected');
    +        return this;
    +    }
    +    
    +    var method, action, url, $form = this;
    +
    +    if (typeof options == 'function') {
    +        options = { success: options };
    +    }
    +
    +    method = this.attr('method');
    +    action = this.attr('action');
    +    url = (typeof action === 'string') ? $.trim(action) : '';
    +    url = url || window.location.href || '';
    +    if (url) {
    +        // clean url (don't include hash vaue)
    +        url = (url.match(/^([^#]+)/)||[])[1];
    +    }
    +
    +    options = $.extend(true, {
    +        url:  url,
    +        success: $.ajaxSettings.success,
    +        type: method || 'GET',
    +        iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
    +    }, options);
    +
    +    // hook for manipulating the form data before it is extracted;
    +    // convenient for use with rich editors like tinyMCE or FCKEditor
    +    var veto = {};
    +    this.trigger('form-pre-serialize', [this, options, veto]);
    +    if (veto.veto) {
    +        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
    +        return this;
    +    }
    +
    +    // provide opportunity to alter form data before it is serialized
    +    if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
    +        log('ajaxSubmit: submit aborted via beforeSerialize callback');
    +        return this;
    +    }
    +
    +    var traditional = options.traditional;
    +    if ( traditional === undefined ) {
    +        traditional = $.ajaxSettings.traditional;
    +    }
    +    
    +    var elements = [];
    +    var qx, a = this.formToArray(options.semantic, elements);
    +    if (options.data) {
    +        options.extraData = options.data;
    +        qx = $.param(options.data, traditional);
    +    }
    +
    +    // give pre-submit callback an opportunity to abort the submit
    +    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
    +        log('ajaxSubmit: submit aborted via beforeSubmit callback');
    +        return this;
    +    }
    +
    +    // fire vetoable 'validate' event
    +    this.trigger('form-submit-validate', [a, this, options, veto]);
    +    if (veto.veto) {
    +        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
    +        return this;
    +    }
    +
    +    var q = $.param(a, traditional);
    +    if (qx) {
    +        q = ( q ? (q + '&' + qx) : qx );
    +    }    
    +    if (options.type.toUpperCase() == 'GET') {
    +        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
    +        options.data = null;  // data is null for 'get'
    +    }
    +    else {
    +        options.data = q; // data is the query string for 'post'
    +    }
    +
    +    var callbacks = [];
    +    if (options.resetForm) {
    +        callbacks.push(function() { $form.resetForm(); });
    +    }
    +    if (options.clearForm) {
    +        callbacks.push(function() { $form.clearForm(options.includeHidden); });
    +    }
    +
    +    // perform a load on the target only if dataType is not provided
    +    if (!options.dataType && options.target) {
    +        var oldSuccess = options.success || function(){};
    +        callbacks.push(function(data) {
    +            var fn = options.replaceTarget ? 'replaceWith' : 'html';
    +            $(options.target)[fn](data).each(oldSuccess, arguments);
    +        });
    +    }
    +    else if (options.success) {
    +        callbacks.push(options.success);
    +    }
    +
    +    options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
    +        var context = options.context || this ;    // jQuery 1.4+ supports scope context 
    +        for (var i=0, max=callbacks.length; i < max; i++) {
    +            callbacks[i].apply(context, [data, status, xhr || $form, $form]);
    +        }
    +    };
    +
    +    // are there files to upload?
    +    var fileInputs = $('input:file:enabled[value]', this); // [value] (issue #113)
    +    var hasFileInputs = fileInputs.length > 0;
    +    var mp = 'multipart/form-data';
    +    var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
    +
    +    var fileAPI = feature.fileapi && feature.formdata;
    +    log("fileAPI :" + fileAPI);
    +    var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;
    +
    +    var jqxhr;
    +
    +    // options.iframe allows user to force iframe mode
    +    // 06-NOV-09: now defaulting to iframe mode if file input is detected
    +    if (options.iframe !== false && (options.iframe || shouldUseFrame)) {
    +        // hack to fix Safari hang (thanks to Tim Molendijk for this)
    +        // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
    +        if (options.closeKeepAlive) {
    +            $.get(options.closeKeepAlive, function() {
    +                jqxhr = fileUploadIframe(a);
    +            });
    +        }
    +        else {
    +            jqxhr = fileUploadIframe(a);
    +        }
    +    }
    +    else if ((hasFileInputs || multipart) && fileAPI) {
    +        jqxhr = fileUploadXhr(a);
    +    }
    +    else {
    +        jqxhr = $.ajax(options);
    +    }
    +
    +    $form.removeData('jqxhr').data('jqxhr', jqxhr);
    +
    +    // clear element array
    +    for (var k=0; k < elements.length; k++)
    +        elements[k] = null;
    +
    +    // fire 'notify' event
    +    this.trigger('form-submit-notify', [this, options]);
    +    return this;
    +
    +    // utility fn for deep serialization
    +    function deepSerialize(extraData){
    +        var serialized = $.param(extraData).split('&');
    +        var len = serialized.length;
    +        var result = {};
    +        var i, part;
    +        for (i=0; i < len; i++) {
    +            part = serialized[i].split('=');
    +            result[decodeURIComponent(part[0])] = decodeURIComponent(part[1]);
    +        }
    +        return result;
    +    }
    +
    +     // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
    +    function fileUploadXhr(a) {
    +        var formdata = new FormData();
    +
    +        for (var i=0; i < a.length; i++) {
    +            formdata.append(a[i].name, a[i].value);
    +        }
    +
    +        if (options.extraData) {
    +            var serializedData = deepSerialize(options.extraData);
    +            for (var p in serializedData)
    +                if (serializedData.hasOwnProperty(p))
    +                    formdata.append(p, serializedData[p]);
    +        }
    +
    +        options.data = null;
    +
    +        var s = $.extend(true, {}, $.ajaxSettings, options, {
    +            contentType: false,
    +            processData: false,
    +            cache: false,
    +            type: method || 'POST'
    +        });
    +        
    +        if (options.uploadProgress) {
    +            // workaround because jqXHR does not expose upload property
    +            s.xhr = function() {
    +                var xhr = jQuery.ajaxSettings.xhr();
    +                if (xhr.upload) {
    +                    xhr.upload.onprogress = function(event) {
    +                        var percent = 0;
    +                        var position = event.loaded || event.position; /*event.position is deprecated*/
    +                        var total = event.total;
    +                        if (event.lengthComputable) {
    +                            percent = Math.ceil(position / total * 100);
    +                        }
    +                        options.uploadProgress(event, position, total, percent);
    +                    };
    +                }
    +                return xhr;
    +            };
    +        }
    +
    +        s.data = null;
    +            var beforeSend = s.beforeSend;
    +            s.beforeSend = function(xhr, o) {
    +                o.data = formdata;
    +                if(beforeSend)
    +                    beforeSend.call(this, xhr, o);
    +        };
    +        return $.ajax(s);
    +    }
    +
    +    // private function for handling file uploads (hat tip to YAHOO!)
    +    function fileUploadIframe(a) {
    +        var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
    +        var useProp = !!$.fn.prop;
    +        var deferred = $.Deferred();
    +
    +        if ($(':input[name=submit],:input[id=submit]', form).length) {
    +            // if there is an input with a name or id of 'submit' then we won't be
    +            // able to invoke the submit fn on the form (at least not x-browser)
    +            alert('Error: Form elements must not have name or id of "submit".');
    +            deferred.reject();
    +            return deferred;
    +        }
    +        
    +        if (a) {
    +            // ensure that every serialized input is still enabled
    +            for (i=0; i < elements.length; i++) {
    +                el = $(elements[i]);
    +                if ( useProp )
    +                    el.prop('disabled', false);
    +                else
    +                    el.removeAttr('disabled');
    +            }
    +        }
    +
    +        s = $.extend(true, {}, $.ajaxSettings, options);
    +        s.context = s.context || s;
    +        id = 'jqFormIO' + (new Date().getTime());
    +        if (s.iframeTarget) {
    +            $io = $(s.iframeTarget);
    +            n = $io.attr('name');
    +            if (!n)
    +                 $io.attr('name', id);
    +            else
    +                id = n;
    +        }
    +        else {
    +            $io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />');
    +            $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
    +        }
    +        io = $io[0];
    +
    +
    +        xhr = { // mock object
    +            aborted: 0,
    +            responseText: null,
    +            responseXML: null,
    +            status: 0,
    +            statusText: 'n/a',
    +            getAllResponseHeaders: function() {},
    +            getResponseHeader: function() {},
    +            setRequestHeader: function() {},
    +            abort: function(status) {
    +                var e = (status === 'timeout' ? 'timeout' : 'aborted');
    +                log('aborting upload... ' + e);
    +                this.aborted = 1;
    +                // #214
    +                if (io.contentWindow.document.execCommand) {
    +                    try { // #214
    +                        io.contentWindow.document.execCommand('Stop');
    +                    } catch(ignore) {}
    +                }
    +                $io.attr('src', s.iframeSrc); // abort op in progress
    +                xhr.error = e;
    +                if (s.error)
    +                    s.error.call(s.context, xhr, e, status);
    +                if (g)
    +                    $.event.trigger("ajaxError", [xhr, s, e]);
    +                if (s.complete)
    +                    s.complete.call(s.context, xhr, e);
    +            }
    +        };
    +
    +        g = s.global;
    +        // trigger ajax global events so that activity/block indicators work like normal
    +        if (g && 0 === $.active++) {
    +            $.event.trigger("ajaxStart");
    +        }
    +        if (g) {
    +            $.event.trigger("ajaxSend", [xhr, s]);
    +        }
    +
    +        if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
    +            if (s.global) {
    +                $.active--;
    +            }
    +            deferred.reject();
    +            return deferred;
    +        }
    +        if (xhr.aborted) {
    +            deferred.reject();
    +            return deferred;
    +        }
    +
    +        // add submitting element to data if we know it
    +        sub = form.clk;
    +        if (sub) {
    +            n = sub.name;
    +            if (n && !sub.disabled) {
    +                s.extraData = s.extraData || {};
    +                s.extraData[n] = sub.value;
    +                if (sub.type == "image") {
    +                    s.extraData[n+'.x'] = form.clk_x;
    +                    s.extraData[n+'.y'] = form.clk_y;
    +                }
    +            }
    +        }
    +        
    +        var CLIENT_TIMEOUT_ABORT = 1;
    +        var SERVER_ABORT = 2;
    +
    +        function getDoc(frame) {
    +            var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;
    +            return doc;
    +        }
    +        
    +        // Rails CSRF hack (thanks to Yvan Barthelemy)
    +        var csrf_token = $('meta[name=csrf-token]').attr('content');
    +        var csrf_param = $('meta[name=csrf-param]').attr('content');
    +        if (csrf_param && csrf_token) {
    +            s.extraData = s.extraData || {};
    +            s.extraData[csrf_param] = csrf_token;
    +        }
    +
    +        // take a breath so that pending repaints get some cpu time before the upload starts
    +        function doSubmit() {
    +            // make sure form attrs are set
    +            var t = $form.attr('target'), a = $form.attr('action');
    +
    +            // update form attrs in IE friendly way
    +            form.setAttribute('target',id);
    +            if (!method) {
    +                form.setAttribute('method', 'POST');
    +            }
    +            if (a != s.url) {
    +                form.setAttribute('action', s.url);
    +            }
    +
    +            // ie borks in some cases when setting encoding
    +            if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {
    +                $form.attr({
    +                    encoding: 'multipart/form-data',
    +                    enctype:  'multipart/form-data'
    +                });
    +            }
    +
    +            // support timout
    +            if (s.timeout) {
    +                timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
    +            }
    +            
    +            // look for server aborts
    +            function checkState() {
    +                try {
    +                    var state = getDoc(io).readyState;
    +                    log('state = ' + state);
    +                    if (state && state.toLowerCase() == 'uninitialized')
    +                        setTimeout(checkState,50);
    +                }
    +                catch(e) {
    +                    log('Server abort: ' , e, ' (', e.name, ')');
    +                    cb(SERVER_ABORT);
    +                    if (timeoutHandle)
    +                        clearTimeout(timeoutHandle);
    +                    timeoutHandle = undefined;
    +                }
    +            }
    +
    +            // add "extra" data to form if provided in options
    +            var extraInputs = [];
    +            try {
    +                if (s.extraData) {
    +                    for (var n in s.extraData) {
    +                        if (s.extraData.hasOwnProperty(n)) {
    +                           // if using the $.param format that allows for multiple values with the same name
    +                           if($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) {
    +                               extraInputs.push(
    +                               $('<input type="hidden" name="'+s.extraData[n].name+'">').attr('value',s.extraData[n].value)
    +                                   .appendTo(form)[0]);
    +                           } else {
    +                               extraInputs.push(
    +                               $('<input type="hidden" name="'+n+'">').attr('value',s.extraData[n])
    +                                   .appendTo(form)[0]);
    +                           }
    +                        }
    +                    }
    +                }
    +
    +                if (!s.iframeTarget) {
    +                    // add iframe to doc and submit the form
    +                    $io.appendTo('body');
    +                    if (io.attachEvent)
    +                        io.attachEvent('onload', cb);
    +                    else
    +                        io.addEventListener('load', cb, false);
    +                }
    +                setTimeout(checkState,15);
    +                form.submit();
    +            }
    +            finally {
    +                // reset attrs and remove "extra" input elements
    +                form.setAttribute('action',a);
    +                if(t) {
    +                    form.setAttribute('target', t);
    +                } else {
    +                    $form.removeAttr('target');
    +                }
    +                $(extraInputs).remove();
    +            }
    +        }
    +
    +        if (s.forceSync) {
    +            doSubmit();
    +        }
    +        else {
    +            setTimeout(doSubmit, 10); // this lets dom updates render
    +        }
    +
    +        var data, doc, domCheckCount = 50, callbackProcessed;
    +
    +        function cb(e) {
    +            if (xhr.aborted || callbackProcessed) {
    +                return;
    +            }
    +            try {
    +                doc = getDoc(io);
    +            }
    +            catch(ex) {
    +                log('cannot access response document: ', ex);
    +                e = SERVER_ABORT;
    +            }
    +            if (e === CLIENT_TIMEOUT_ABORT && xhr) {
    +                xhr.abort('timeout');
    +                deferred.reject(xhr, 'timeout');
    +                return;
    +            }
    +            else if (e == SERVER_ABORT && xhr) {
    +                xhr.abort('server abort');
    +                deferred.reject(xhr, 'error', 'server abort');
    +                return;
    +            }
    +
    +            if (!doc || doc.location.href == s.iframeSrc) {
    +                // response not received yet
    +                if (!timedOut)
    +                    return;
    +            }
    +            if (io.detachEvent)
    +                io.detachEvent('onload', cb);
    +            else    
    +                io.removeEventListener('load', cb, false);
    +
    +            var status = 'success', errMsg;
    +            try {
    +                if (timedOut) {
    +                    throw 'timeout';
    +                }
    +
    +                var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
    +                log('isXml='+isXml);
    +                if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {
    +                    if (--domCheckCount) {
    +                        // in some browsers (Opera) the iframe DOM is not always traversable when
    +                        // the onload callback fires, so we loop a bit to accommodate
    +                        log('requeing onLoad callback, DOM not available');
    +                        setTimeout(cb, 250);
    +                        return;
    +                    }
    +                    // let this fall through because server response could be an empty document
    +                    //log('Could not access iframe DOM after mutiple tries.');
    +                    //throw 'DOMException: not available';
    +                }
    +
    +                //log('response detected');
    +                var docRoot = doc.body ? doc.body : doc.documentElement;
    +                xhr.responseText = docRoot ? docRoot.innerHTML : null;
    +                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
    +                if (isXml)
    +                    s.dataType = 'xml';
    +                xhr.getResponseHeader = function(header){
    +                    var headers = {'content-type': s.dataType};
    +                    return headers[header];
    +                };
    +                // support for XHR 'status' & 'statusText' emulation :
    +                if (docRoot) {
    +                    xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;
    +                    xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
    +                }
    +
    +                var dt = (s.dataType || '').toLowerCase();
    +                var scr = /(json|script|text)/.test(dt);
    +                if (scr || s.textarea) {
    +                    // see if user embedded response in textarea
    +                    var ta = doc.getElementsByTagName('textarea')[0];
    +                    if (ta) {
    +                        xhr.responseText = ta.value;
    +                        // support for XHR 'status' & 'statusText' emulation :
    +                        xhr.status = Number( ta.getAttribute('status') ) || xhr.status;
    +                        xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
    +                    }
    +                    else if (scr) {
    +                        // account for browsers injecting pre around json response
    +                        var pre = doc.getElementsByTagName('pre')[0];
    +                        var b = doc.getElementsByTagName('body')[0];
    +                        if (pre) {
    +                            xhr.responseText = pre.textContent ? pre.textContent : pre.innerText;
    +                        }
    +                        else if (b) {
    +                            xhr.responseText = b.textContent ? b.textContent : b.innerText;
    +                        }
    +                    }
    +                }
    +                else if (dt == 'xml' && !xhr.responseXML && xhr.responseText) {
    +                    xhr.responseXML = toXml(xhr.responseText);
    +                }
    +
    +                try {
    +                    data = httpData(xhr, dt, s);
    +                }
    +                catch (e) {
    +                    status = 'parsererror';
    +                    xhr.error = errMsg = (e || status);
    +                }
    +            }
    +            catch (e) {
    +                log('error caught: ',e);
    +                status = 'error';
    +                xhr.error = errMsg = (e || status);
    +            }
    +
    +            if (xhr.aborted) {
    +                log('upload aborted');
    +                status = null;
    +            }
    +
    +            if (xhr.status) { // we've set xhr.status
    +                status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';
    +            }
    +
    +            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
    +            if (status === 'success') {
    +                if (s.success)
    +                    s.success.call(s.context, data, 'success', xhr);
    +                deferred.resolve(xhr.responseText, 'success', xhr);
    +                if (g)
    +                    $.event.trigger("ajaxSuccess", [xhr, s]);
    +            }
    +            else if (status) {
    +                if (errMsg === undefined)
    +                    errMsg = xhr.statusText;
    +                if (s.error)
    +                    s.error.call(s.context, xhr, status, errMsg);
    +                deferred.reject(xhr, 'error', errMsg);
    +                if (g)
    +                    $.event.trigger("ajaxError", [xhr, s, errMsg]);
    +            }
    +
    +            if (g)
    +                $.event.trigger("ajaxComplete", [xhr, s]);
    +
    +            if (g && ! --$.active) {
    +                $.event.trigger("ajaxStop");
    +            }
    +
    +            if (s.complete)
    +                s.complete.call(s.context, xhr, status);
    +
    +            callbackProcessed = true;
    +            if (s.timeout)
    +                clearTimeout(timeoutHandle);
    +
    +            // clean up
    +            setTimeout(function() {
    +                if (!s.iframeTarget)
    +                    $io.remove();
    +                xhr.responseXML = null;
    +            }, 100);
    +        }
    +
    +        var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
    +            if (window.ActiveXObject) {
    +                doc = new ActiveXObject('Microsoft.XMLDOM');
    +                doc.async = 'false';
    +                doc.loadXML(s);
    +            }
    +            else {
    +                doc = (new DOMParser()).parseFromString(s, 'text/xml');
    +            }
    +            return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
    +        };
    +        var parseJSON = $.parseJSON || function(s) {
    +            /*jslint evil:true */
    +            return window['eval']('(' + s + ')');
    +        };
    +
    +        var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
    +
    +            var ct = xhr.getResponseHeader('content-type') || '',
    +                xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
    +                data = xml ? xhr.responseXML : xhr.responseText;
    +
    +            if (xml && data.documentElement.nodeName === 'parsererror') {
    +                if ($.error)
    +                    $.error('parsererror');
    +            }
    +            if (s && s.dataFilter) {
    +                data = s.dataFilter(data, type);
    +            }
    +            if (typeof data === 'string') {
    +                if (type === 'json' || !type && ct.indexOf('json') >= 0) {
    +                    data = parseJSON(data);
    +                } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
    +                    $.globalEval(data);
    +                }
    +            }
    +            return data;
    +        };
    +
    +        return deferred;
    +    }
    +};
    +
    +/**
    + * ajaxForm() provides a mechanism for fully automating form submission.
    + *
    + * The advantages of using this method instead of ajaxSubmit() are:
    + *
    + * 1: This method will include coordinates for <input type="image" /> elements (if the element
    + *    is used to submit the form).
    + * 2. This method will include the submit element's name/value data (for the element that was
    + *    used to submit the form).
    + * 3. This method binds the submit() method to the form for you.
    + *
    + * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
    + * passes the options argument along after properly binding events for submit elements and
    + * the form itself.
    + */
    +$.fn.ajaxForm = function(options) {
    +    options = options || {};
    +    options.delegation = options.delegation && $.isFunction($.fn.on);
    +    
    +    // in jQuery 1.3+ we can fix mistakes with the ready state
    +    if (!options.delegation && this.length === 0) {
    +        var o = { s: this.selector, c: this.context };
    +        if (!$.isReady && o.s) {
    +            log('DOM not ready, queuing ajaxForm');
    +            $(function() {
    +                $(o.s,o.c).ajaxForm(options);
    +            });
    +            return this;
    +        }
    +        // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
    +        log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
    +        return this;
    +    }
    +
    +    if ( options.delegation ) {
    +        $(document)
    +            .off('submit.form-plugin', this.selector, doAjaxSubmit)
    +            .off('click.form-plugin', this.selector, captureSubmittingElement)
    +            .on('submit.form-plugin', this.selector, options, doAjaxSubmit)
    +            .on('click.form-plugin', this.selector, options, captureSubmittingElement);
    +        return this;
    +    }
    +
    +    return this.ajaxFormUnbind()
    +        .bind('submit.form-plugin', options, doAjaxSubmit)
    +        .bind('click.form-plugin', options, captureSubmittingElement);
    +};
    +
    +// private event handlers    
    +function doAjaxSubmit(e) {
    +    /*jshint validthis:true */
    +    var options = e.data;
    +    if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
    +        e.preventDefault();
    +        $(this).ajaxSubmit(options);
    +    }
    +}
    +    
    +function captureSubmittingElement(e) {
    +    /*jshint validthis:true */
    +    var target = e.target;
    +    var $el = $(target);
    +    if (!($el.is(":submit,input:image"))) {
    +        // is this a child element of the submit el?  (ex: a span within a button)
    +        var t = $el.closest(':submit');
    +        if (t.length === 0) {
    +            return;
    +        }
    +        target = t[0];
    +    }
    +    var form = this;
    +    form.clk = target;
    +    if (target.type == 'image') {
    +        if (e.offsetX !== undefined) {
    +            form.clk_x = e.offsetX;
    +            form.clk_y = e.offsetY;
    +        } else if (typeof $.fn.offset == 'function') {
    +            var offset = $el.offset();
    +            form.clk_x = e.pageX - offset.left;
    +            form.clk_y = e.pageY - offset.top;
    +        } else {
    +            form.clk_x = e.pageX - target.offsetLeft;
    +            form.clk_y = e.pageY - target.offsetTop;
    +        }
    +    }
    +    // clear form vars
    +    setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
    +}
    +
    +
    +// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
    +$.fn.ajaxFormUnbind = function() {
    +    return this.unbind('submit.form-plugin click.form-plugin');
    +};
    +
    +/**
    + * formToArray() gathers form element data into an array of objects that can
    + * be passed to any of the following ajax functions: $.get, $.post, or load.
    + * Each object in the array has both a 'name' and 'value' property.  An example of
    + * an array for a simple login form might be:
    + *
    + * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
    + *
    + * It is this array that is passed to pre-submit callback functions provided to the
    + * ajaxSubmit() and ajaxForm() methods.
    + */
    +$.fn.formToArray = function(semantic, elements) {
    +    var a = [];
    +    if (this.length === 0) {
    +        return a;
    +    }
    +
    +    var form = this[0];
    +    var els = semantic ? form.getElementsByTagName('*') : form.elements;
    +    if (!els) {
    +        return a;
    +    }
    +
    +    var i,j,n,v,el,max,jmax;
    +    for(i=0, max=els.length; i < max; i++) {
    +        el = els[i];
    +        n = el.name;
    +        if (!n) {
    +            continue;
    +        }
    +
    +        if (semantic && form.clk && el.type == "image") {
    +            // handle image inputs on the fly when semantic == true
    +            if(!el.disabled && form.clk == el) {
    +                a.push({name: n, value: $(el).val(), type: el.type });
    +                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
    +            }
    +            continue;
    +        }
    +
    +        v = $.fieldValue(el, true);
    +        if (v && v.constructor == Array) {
    +            if (elements) 
    +                elements.push(el);
    +            for(j=0, jmax=v.length; j < jmax; j++) {
    +                a.push({name: n, value: v[j]});
    +            }
    +        }
    +        else if (feature.fileapi && el.type == 'file' && !el.disabled) {
    +            if (elements) 
    +                elements.push(el);
    +            var files = el.files;
    +            if (files.length) {
    +                for (j=0; j < files.length; j++) {
    +                    a.push({name: n, value: files[j], type: el.type});
    +                }
    +            }
    +            else {
    +                // #180
    +                a.push({ name: n, value: '', type: el.type });
    +            }
    +        }
    +        else if (v !== null && typeof v != 'undefined') {
    +            if (elements) 
    +                elements.push(el);
    +            a.push({name: n, value: v, type: el.type, required: el.required});
    +        }
    +    }
    +
    +    if (!semantic && form.clk) {
    +        // input type=='image' are not found in elements array! handle it here
    +        var $input = $(form.clk), input = $input[0];
    +        n = input.name;
    +        if (n && !input.disabled && input.type == 'image') {
    +            a.push({name: n, value: $input.val()});
    +            a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
    +        }
    +    }
    +    return a;
    +};
    +
    +/**
    + * Serializes form data into a 'submittable' string. This method will return a string
    + * in the format: name1=value1&amp;name2=value2
    + */
    +$.fn.formSerialize = function(semantic) {
    +    //hand off to jQuery.param for proper encoding
    +    return $.param(this.formToArray(semantic));
    +};
    +
    +/**
    + * Serializes all field elements in the jQuery object into a query string.
    + * This method will return a string in the format: name1=value1&amp;name2=value2
    + */
    +$.fn.fieldSerialize = function(successful) {
    +    var a = [];
    +    this.each(function() {
    +        var n = this.name;
    +        if (!n) {
    +            return;
    +        }
    +        var v = $.fieldValue(this, successful);
    +        if (v && v.constructor == Array) {
    +            for (var i=0,max=v.length; i < max; i++) {
    +                a.push({name: n, value: v[i]});
    +            }
    +        }
    +        else if (v !== null && typeof v != 'undefined') {
    +            a.push({name: this.name, value: v});
    +        }
    +    });
    +    //hand off to jQuery.param for proper encoding
    +    return $.param(a);
    +};
    +
    +/**
    + * Returns the value(s) of the element in the matched set.  For example, consider the following form:
    + *
    + *  <form><fieldset>
    + *      <input name="A" type="text" />
    + *      <input name="A" type="text" />
    + *      <input name="B" type="checkbox" value="B1" />
    + *      <input name="B" type="checkbox" value="B2"/>
    + *      <input name="C" type="radio" value="C1" />
    + *      <input name="C" type="radio" value="C2" />
    + *  </fieldset></form>
    + *
    + *  var v = $(':text').fieldValue();
    + *  // if no values are entered into the text inputs
    + *  v == ['','']
    + *  // if values entered into the text inputs are 'foo' and 'bar'
    + *  v == ['foo','bar']
    + *
    + *  var v = $(':checkbox').fieldValue();
    + *  // if neither checkbox is checked
    + *  v === undefined
    + *  // if both checkboxes are checked
    + *  v == ['B1', 'B2']
    + *
    + *  var v = $(':radio').fieldValue();
    + *  // if neither radio is checked
    + *  v === undefined
    + *  // if first radio is checked
    + *  v == ['C1']
    + *
    + * The successful argument controls whether or not the field element must be 'successful'
    + * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
    + * The default value of the successful argument is true.  If this value is false the value(s)
    + * for each element is returned.
    + *
    + * Note: This method *always* returns an array.  If no valid value can be determined the
    + *    array will be empty, otherwise it will contain one or more values.
    + */
    +$.fn.fieldValue = function(successful) {
    +    for (var val=[], i=0, max=this.length; i < max; i++) {
    +        var el = this[i];
    +        var v = $.fieldValue(el, successful);
    +        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
    +            continue;
    +        }
    +        if (v.constructor == Array)
    +            $.merge(val, v);
    +        else
    +            val.push(v);
    +    }
    +    return val;
    +};
    +
    +/**
    + * Returns the value of the field element.
    + */
    +$.fieldValue = function(el, successful) {
    +    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
    +    if (successful === undefined) {
    +        successful = true;
    +    }
    +
    +    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
    +        (t == 'checkbox' || t == 'radio') && !el.checked ||
    +        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
    +        tag == 'select' && el.selectedIndex == -1)) {
    +            return null;
    +    }
    +
    +    if (tag == 'select') {
    +        var index = el.selectedIndex;
    +        if (index < 0) {
    +            return null;
    +        }
    +        var a = [], ops = el.options;
    +        var one = (t == 'select-one');
    +        var max = (one ? index+1 : ops.length);
    +        for(var i=(one ? index : 0); i < max; i++) {
    +            var op = ops[i];
    +            if (op.selected) {
    +                var v = op.value;
    +                if (!v) { // extra pain for IE...
    +                    v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
    +                }
    +                if (one) {
    +                    return v;
    +                }
    +                a.push(v);
    +            }
    +        }
    +        return a;
    +    }
    +    return $(el).val();
    +};
    +
    +/**
    + * Clears the form data.  Takes the following actions on the form's input fields:
    + *  - input text fields will have their 'value' property set to the empty string
    + *  - select elements will have their 'selectedIndex' property set to -1
    + *  - checkbox and radio inputs will have their 'checked' property set to false
    + *  - inputs of type submit, button, reset, and hidden will *not* be effected
    + *  - button elements will *not* be effected
    + */
    +$.fn.clearForm = function(includeHidden) {
    +    return this.each(function() {
    +        $('input,select,textarea', this).clearFields(includeHidden);
    +    });
    +};
    +
    +/**
    + * Clears the selected form elements.
    + */
    +$.fn.clearFields = $.fn.clearInputs = function(includeHidden) {
    +    var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
    +    return this.each(function() {
    +        var t = this.type, tag = this.tagName.toLowerCase();
    +        if (re.test(t) || tag == 'textarea') {
    +            this.value = '';
    +        }
    +        else if (t == 'checkbox' || t == 'radio') {
    +            this.checked = false;
    +        }
    +        else if (tag == 'select') {
    +            this.selectedIndex = -1;
    +        }
    +        else if (includeHidden) {
    +            // includeHidden can be the value true, or it can be a selector string
    +            // indicating a special test; for example:
    +            //  $('#myForm').clearForm('.special:hidden')
    +            // the above would clean hidden inputs that have the class of 'special'
    +            if ( (includeHidden === true && /hidden/.test(t)) ||
    +                 (typeof includeHidden == 'string' && $(this).is(includeHidden)) )
    +                this.value = '';
    +        }
    +    });
    +};
    +
    +/**
    + * Resets the form data.  Causes all form elements to be reset to their original value.
    + */
    +$.fn.resetForm = function() {
    +    return this.each(function() {
    +        // guard against an input with the name of 'reset'
    +        // note that IE reports the reset function as an 'object'
    +        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
    +            this.reset();
    +        }
    +    });
    +};
    +
    +/**
    + * Enables or disables any matching elements.
    + */
    +$.fn.enable = function(b) {
    +    if (b === undefined) {
    +        b = true;
    +    }
    +    return this.each(function() {
    +        this.disabled = !b;
    +    });
    +};
    +
    +/**
    + * Checks/unchecks any matching checkboxes or radio buttons and
    + * selects/deselects and matching option elements.
    + */
    +$.fn.selected = function(select) {
    +    if (select === undefined) {
    +        select = true;
    +    }
    +    return this.each(function() {
    +        var t = this.type;
    +        if (t == 'checkbox' || t == 'radio') {
    +            this.checked = select;
    +        }
    +        else if (this.tagName.toLowerCase() == 'option') {
    +            var $sel = $(this).parent('select');
    +            if (select && $sel[0] && $sel[0].type == 'select-one') {
    +                // deselect all other options
    +                $sel.find('option').selected(false);
    +            }
    +            this.selected = select;
    +        }
    +    });
    +};
    +
    +// expose debug var
    +$.fn.ajaxSubmit.debug = false;
    +
    +// helper fn for console logging
    +function log() {
    +    if (!$.fn.ajaxSubmit.debug) 
    +        return;
    +    var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
    +    if (window.console && window.console.log) {
    +        window.console.log(msg);
    +    }
    +    else if (window.opera && window.opera.postError) {
    +        window.opera.postError(msg);
    +    }
    +}
    +
    +})(jQuery);
    diff --git a/src/main/webapp/plug-in/jquery-plugs/hftable/jquery-hftable.js b/src/main/webapp/plug-in/jquery-plugs/hftable/jquery-hftable.js
    new file mode 100644
    index 00000000..ea4e03a6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/hftable/jquery-hftable.js
    @@ -0,0 +1,85 @@
    +/* 
    +* hftable 0.1 
    +* Copyright (c) 2014 璧典繆澶 http://zjfhw.iteye.com
    +* Date: 2014-02-23
    +涓昏鍔熻兘锛氬皢鏅氱殑Table鐨勮〃澶/琛ㄥ熬鍥哄畾
    +鐗圭偣锛
    +	1.璇ョ増鏈害瀹氬皢琛ㄦ牸绗竴琛屼綔涓鸿〃澶,鎵浠ヤ笉闇瑕佺壒鍒缃<thead>涔嬬被鐨勬爣绛炬爣璇嗚〃澶,鏅氱粨鏋勭殑table鍗冲彲銆
    +	2.鍚屼笂,濡傛灉璁剧疆浜嗚〃灏惧浐瀹,鍒欑害瀹氳〃鏍肩殑鏈鍚庝竴琛屼负琛ㄥ熬銆
    +鍏ュ弬锛
    +options{
    +	fixHeader:true/fales	//鏄惁鍥哄畾琛ㄥご,榛樿true
    +	fixFooter:true/false	//鏄惁鍥哄畾琛ㄥ熬,榛樿false
    +	width					//Table鐨勫搴
    +	height					//Table鐨勯珮搴
    +}
    +*/ 
    +(function($) {       
    +	$.fn.createhftable = function(options) {   
    +		 var defaultOptions = {
    +			fixHeader:true,
    +			fixFooter:false,
    +			width:'100%',
    +			height:'400px'
    +		 };
    +		 if(!options){
    +			options = {};
    +		 }
    +		 $.extend(defaultOptions,options);
    +		 //1.灏嗗師濮媡able鍒嗙
    +		 var $trHead = this.find("tr:first").clone();
    +		 var $trFoot = this.find("tr:last").clone();
    +		 var $tableHead = this.clone();
    +		 var $tableFoot = this.clone();
    +		 this.find("tr:first").remove();
    +		 if(defaultOptions.fixFooter){
    +			this.find("tr:last").remove();
    +		 }
    +		 //2.鍒涘缓涓涓狣iv鍖呰9Table,璁剧疆鎴愬彲婊氬姩
    +		 var tableId = this.attr("id");
    +		 var divId = tableId+"scrolldiv";
    +		 var headId = tableId+"scrolldivHead";
    +		 var footId = tableId+"scrolldivFoot";
    +		 $tableHead.attr("id",headId);
    +		 $tableFoot.attr("id",footId);
    +		 var divStyle = "overflow: auto;width:"+defaultOptions.width+";height:"+defaultOptions.height;
    +		 var divtp = "<div id='"+divId+"' style=\""+divStyle+"\">"+getOuterHtml(this)+"</div>";
    +		 this.before(divtp);
    +		 this.remove();
    +		 //3.灏員able鐨勮〃澶/琛ㄥ熬澶嶅埗鎴愬崟鐙殑Table鏀惧湪hftable鐨勪笂涓嬫柟
    +		 //3.1 娣诲姞琛ㄥご
    +		 $tableHead.html('');
    +		 $tableHead.append(getOuterHtml($trHead));
    +		 $("#"+divId).before(getOuterHtml($tableHead));
    +		 fix(headId,tableId);
    +		 //3.2 娣诲姞琛ㄥ熬
    +		 if(defaultOptions.fixFooter){
    +			$tableFoot.html('');
    +			$tableFoot.append(getOuterHtml($trFoot));
    +			$("#"+divId).after(getOuterHtml($tableFoot));
    +			fix(footId,tableId);
    +		 }
    +		 //4.缁戝畾婊氬姩浜嬩欢
    +		 bindScrollEvent(headId,footId,divId,defaultOptions.fixFooter);
    +	}; 
    +	function getOuterHtml(obj) {
    +		var box = $('<div></div>');
    +		box.append(obj.clone());
    +		return box.html();
    +	}
    +	function fix(headid,contentid){
    +		for(var i=0;i<=$('#'+contentid+' tr:last').find('td:last').index();i++){
    +				$('#'+headid+' td').eq(i).css('width',
    +					$('#'+contentid+' tr:last').find('td').eq(i).width());
    +		}
    +		$('#'+headid).css('width',$('#'+contentid+' tr:last').width());
    +	}
    +	function bindScrollEvent(headId,footId,divId,fixFooter){
    +		$('#'+divId).scroll(function(){
    +			$('#'+headId).css('margin-left',-($('#'+divId).scrollLeft()));
    +			if(fixFooter){
    +				$('#'+footId).css('margin-left',-($('#'+divId).scrollLeft()));
    +			}
    +		});
    +	}
    +})(jQuery);  
    diff --git a/src/main/webapp/plug-in/jquery-plugs/storage/jquery.storageapi.min.js b/src/main/webapp/plug-in/jquery-plugs/storage/jquery.storageapi.min.js
    new file mode 100644
    index 00000000..e196b067
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/storage/jquery.storageapi.min.js
    @@ -0,0 +1,2 @@
    +/* jQuery Storage API Plugin 1.7.3 https://github.com/julien-maurel/jQuery-Storage-API */
    +!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){function t(t){var r,i,n,o=arguments.length,s=window[t],a=arguments,u=a[1];if(2>o)throw Error("Minimum 2 arguments must be given");if(e.isArray(u)){i={};for(var f in u){r=u[f];try{i[r]=JSON.parse(s.getItem(r))}catch(c){i[r]=s.getItem(r)}}return i}if(2!=o){try{i=JSON.parse(s.getItem(u))}catch(c){throw new ReferenceError(u+" is not defined in this storage")}for(var f=2;o-1>f;f++)if(i=i[a[f]],void 0===i)throw new ReferenceError([].slice.call(a,1,f+1).join(".")+" is not defined in this storage");if(e.isArray(a[f])){n=i,i={};for(var m in a[f])i[a[f][m]]=n[a[f][m]];return i}return i[a[f]]}try{return JSON.parse(s.getItem(u))}catch(c){return s.getItem(u)}}function r(t){var r,i,n=arguments.length,o=window[t],s=arguments,a=s[1],u=s[2],f={};if(2>n||!e.isPlainObject(a)&&3>n)throw Error("Minimum 3 arguments must be given or second parameter must be an object");if(e.isPlainObject(a)){for(var c in a)r=a[c],e.isPlainObject(r)?o.setItem(c,JSON.stringify(r)):o.setItem(c,r);return a}if(3==n)return"object"==typeof u?o.setItem(a,JSON.stringify(u)):o.setItem(a,u),u;try{i=o.getItem(a),null!=i&&(f=JSON.parse(i))}catch(m){}i=f;for(var c=2;n-2>c;c++)r=s[c],i[r]&&e.isPlainObject(i[r])||(i[r]={}),i=i[r];return i[s[c]]=s[c+1],o.setItem(a,JSON.stringify(f)),f}function i(t){var r,i,n=arguments.length,o=window[t],s=arguments,a=s[1];if(2>n)throw Error("Minimum 2 arguments must be given");if(e.isArray(a)){for(var u in a)o.removeItem(a[u]);return!0}if(2==n)return o.removeItem(a),!0;try{r=i=JSON.parse(o.getItem(a))}catch(f){throw new ReferenceError(a+" is not defined in this storage")}for(var u=2;n-1>u;u++)if(i=i[s[u]],void 0===i)throw new ReferenceError([].slice.call(s,1,u).join(".")+" is not defined in this storage");if(e.isArray(s[u]))for(var c in s[u])delete i[s[u][c]];else delete i[s[u]];return o.setItem(a,JSON.stringify(r)),!0}function n(t,r){var n=a(t);for(var o in n)i(t,n[o]);if(r)for(var o in e.namespaceStorages)u(o)}function o(r){var i=arguments.length,n=arguments,s=(window[r],n[1]);if(1==i)return 0==a(r).length;if(e.isArray(s)){for(var u=0;u<s.length;u++)if(!o(r,s[u]))return!1;return!0}try{var f=t.apply(this,arguments);e.isArray(n[i-1])||(f={totest:f});for(var u in f)if(!(e.isPlainObject(f[u])&&e.isEmptyObject(f[u])||e.isArray(f[u])&&!f[u].length)&&f[u])return!1;return!0}catch(c){return!0}}function s(r){var i=arguments.length,n=arguments,o=(window[r],n[1]);if(2>i)throw Error("Minimum 2 arguments must be given");if(e.isArray(o)){for(var a=0;a<o.length;a++)if(!s(r,o[a]))return!1;return!0}try{var u=t.apply(this,arguments);e.isArray(n[i-1])||(u={totest:u});for(var a in u)if(void 0===u[a]||null===u[a])return!1;return!0}catch(f){return!1}}function a(r){var i=arguments.length,n=window[r],o=arguments,s=(o[1],[]),a={};if(a=i>1?t.apply(this,o):n,a._cookie)for(var u in e.cookie())""!=u&&s.push(u.replace(a._prefix,""));else for(var f in a)s.push(f);return s}function u(t){if(!t||"string"!=typeof t)throw Error("First parameter must be a string");g?(window.localStorage.getItem(t)||window.localStorage.setItem(t,"{}"),window.sessionStorage.getItem(t)||window.sessionStorage.setItem(t,"{}")):(window.localCookieStorage.getItem(t)||window.localCookieStorage.setItem(t,"{}"),window.sessionCookieStorage.getItem(t)||window.sessionCookieStorage.setItem(t,"{}"));var r={localStorage:e.extend({},e.localStorage,{_ns:t}),sessionStorage:e.extend({},e.sessionStorage,{_ns:t})};return e.cookie&&(window.cookieStorage.getItem(t)||window.cookieStorage.setItem(t,"{}"),r.cookieStorage=e.extend({},e.cookieStorage,{_ns:t})),e.namespaceStorages[t]=r,r}function f(e){if(!window[e])return!1;var t="jsapi";try{return window[e].setItem(t,t),window[e].removeItem(t),!0}catch(r){return!1}}var c="ls_",m="ss_",g=f("localStorage"),h={_type:"",_ns:"",_callMethod:function(e,t){var r=[this._type],t=Array.prototype.slice.call(t),i=t[0];return this._ns&&r.push(this._ns),"string"==typeof i&&-1!==i.indexOf(".")&&(t.shift(),[].unshift.apply(t,i.split("."))),[].push.apply(r,t),e.apply(this,r)},get:function(){return this._callMethod(t,arguments)},set:function(){var t=arguments.length,i=arguments,n=i[0];if(1>t||!e.isPlainObject(n)&&2>t)throw Error("Minimum 2 arguments must be given or first parameter must be an object");if(e.isPlainObject(n)&&this._ns){for(var o in n)r(this._type,this._ns,o,n[o]);return n}var s=this._callMethod(r,i);return this._ns?s[n.split(".")[0]]:s},remove:function(){if(arguments.length<1)throw Error("Minimum 1 argument must be given");return this._callMethod(i,arguments)},removeAll:function(e){return this._ns?(r(this._type,this._ns,{}),!0):n(this._type,e)},isEmpty:function(){return this._callMethod(o,arguments)},isSet:function(){if(arguments.length<1)throw Error("Minimum 1 argument must be given");return this._callMethod(s,arguments)},keys:function(){return this._callMethod(a,arguments)}};if(e.cookie){window.name||(window.name=Math.floor(1e8*Math.random()));var l={_cookie:!0,_prefix:"",_expires:null,_path:null,_domain:null,setItem:function(t,r){e.cookie(this._prefix+t,r,{expires:this._expires,path:this._path,domain:this._domain})},getItem:function(t){return e.cookie(this._prefix+t)},removeItem:function(t){return e.removeCookie(this._prefix+t)},clear:function(){for(var t in e.cookie())""!=t&&(!this._prefix&&-1===t.indexOf(c)&&-1===t.indexOf(m)||this._prefix&&0===t.indexOf(this._prefix))&&e.removeCookie(t)},setExpires:function(e){return this._expires=e,this},setPath:function(e){return this._path=e,this},setDomain:function(e){return this._domain=e,this},setConf:function(e){return e.path&&(this._path=e.path),e.domain&&(this._domain=e.domain),e.expires&&(this._expires=e.expires),this},setDefaultConf:function(){this._path=this._domain=this._expires=null}};g||(window.localCookieStorage=e.extend({},l,{_prefix:c,_expires:3650}),window.sessionCookieStorage=e.extend({},l,{_prefix:m+window.name+"_"})),window.cookieStorage=e.extend({},l),e.cookieStorage=e.extend({},h,{_type:"cookieStorage",setExpires:function(e){return window.cookieStorage.setExpires(e),this},setPath:function(e){return window.cookieStorage.setPath(e),this},setDomain:function(e){return window.cookieStorage.setDomain(e),this},setConf:function(e){return window.cookieStorage.setConf(e),this},setDefaultConf:function(){return window.cookieStorage.setDefaultConf(),this}})}e.initNamespaceStorage=function(e){return u(e)},g?(e.localStorage=e.extend({},h,{_type:"localStorage"}),e.sessionStorage=e.extend({},h,{_type:"sessionStorage"})):(e.localStorage=e.extend({},h,{_type:"localCookieStorage"}),e.sessionStorage=e.extend({},h,{_type:"sessionCookieStorage"})),e.namespaceStorages={},e.removeAllStorages=function(t){e.localStorage.removeAll(t),e.sessionStorage.removeAll(t),e.cookieStorage&&e.cookieStorage.removeAll(t),t||(e.namespaceStorages={})}});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-plugs/tipTip/css/tipTip.css b/src/main/webapp/plug-in/jquery-plugs/tipTip/css/tipTip.css
    new file mode 100644
    index 00000000..7d7b4fa2
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/tipTip/css/tipTip.css
    @@ -0,0 +1,87 @@
    +/* TipTip CSS - Version 1.2 */
    +
    +#tiptip_holder {
    +	display: none;
    +	position: absolute;
    +	top: 0;
    +	left: 0;
    +	z-index: 99999;
    +}
    +
    +#tiptip_holder.tip_top {
    +	padding-bottom: 5px;
    +}
    +
    +#tiptip_holder.tip_bottom {
    +	padding-top: 5px;
    +}
    +
    +#tiptip_holder.tip_right {
    +	padding-left: 5px;
    +}
    +
    +#tiptip_holder.tip_left {
    +	padding-right: 5px;
    +}
    +
    +#tiptip_content {
    +	font-size: 10px;
    +	color: #fff;
    +	text-shadow: 0 0 2px #000;
    +	padding: 4px 8px;
    +	background-color: rgb(25,25,25);
    +	background-color: rgba(25,25,25,0.8);
    +	background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));
    +	border-radius: 2px;
    +}
    +
    +#tiptip_arrow, #tiptip_arrow_inner {
    +	position: absolute;
    +	border-color: transparent;
    +	border-style: solid;
    +	border-width: 6px;
    +	height: 0;
    +	width: 0;
    +}
    +
    +#tiptip_holder.tip_top #tiptip_arrow_inner {
    +	margin-top: -7px;
    +	margin-left: -6px;
    +	border-top-color: rgb(25,25,25);
    +	border-top-color: rgba(25,25,25,0.92);
    +}
    +
    +#tiptip_holder.tip_bottom #tiptip_arrow_inner {
    +	margin-top: -5px;
    +	margin-left: -6px;
    +	border-bottom-color: rgb(25,25,25);
    +	border-bottom-color: rgba(25,25,25,0.92);
    +}
    +
    +#tiptip_holder.tip_right #tiptip_arrow_inner {
    +	margin-top: -6px;
    +	margin-left: -5px;
    +	border-right-color: rgb(25,25,25);
    +	border-right-color: rgba(25,25,25,0.92);
    +}
    +
    +#tiptip_holder.tip_left #tiptip_arrow_inner {
    +	margin-top: -6px;
    +	margin-left: -7px;
    +	border-left-color: rgb(25,25,25);
    +	border-left-color: rgba(25,25,25,0.92);
    +}
    +
    +/* Webkit Hacks  */
    +@media screen and (-webkit-min-device-pixel-ratio:0) {	
    +	#tiptip_content {
    +		padding: 4px 8px 5px 8px;
    +		background-color: rgba(45,45,45,0.88);
    +	}
    +	#tiptip_holder.tip_bottom #tiptip_arrow_inner { 
    +		border-bottom-color: rgba(45,45,45,0.88);
    +	}
    +	#tiptip_holder.tip_top #tiptip_arrow_inner { 
    +		border-top-color: rgba(20,20,20,0.92);
    +	}
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-plugs/tipTip/js/jquery.tipTip.js b/src/main/webapp/plug-in/jquery-plugs/tipTip/js/jquery.tipTip.js
    new file mode 100644
    index 00000000..9fb6a19c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-plugs/tipTip/js/jquery.tipTip.js
    @@ -0,0 +1,191 @@
    + /*
    + * TipTip
    + * Copyright 2010 Drew Wilson
    + * www.drewwilson.com
    + * code.drewwilson.com/entry/tiptip-jquery-plugin
    + *
    + * Version 1.3   -   Updated: Mar. 23, 2010
    + *
    + * This Plug-In will create a custom tooltip to replace the default
    + * browser tooltip. It is extremely lightweight and very smart in
    + * that it detects the edges of the browser window and will make sure
    + * the tooltip stays within the current window size. As a result the
    + * tooltip will adjust itself to be displayed above, below, to the left 
    + * or to the right depending on what is necessary to stay within the
    + * browser window. It is completely customizable as well via CSS.
    + *
    + * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses:
    + *   http://www.opensource.org/licenses/mit-license.php
    + *   http://www.gnu.org/licenses/gpl.html
    + */
    +
    +(function($){
    +	$.fn.tipTip = function(options) {
    +		var defaults = { 
    +			activation: "hover",
    +			keepAlive: false,
    +			maxWidth: "200px",
    +			edgeOffset: 3,
    +			defaultPosition: "bottom",
    +			delay: 400,
    +			fadeIn: 200,
    +			fadeOut: 200,
    +			attribute: "title",
    +			content: false, // HTML or String to fill TipTIp with
    +		  	enter: function(){},
    +		  	exit: function(){}
    +	  	};
    +	 	var opts = $.extend(defaults, options);
    +	 	
    +	 	// Setup tip tip elements and render them to the DOM
    +	 	if($("#tiptip_holder").length <= 0){
    +	 		var tiptip_holder = $('<div id="tiptip_holder" style="max-width:'+ opts.maxWidth +';"></div>');
    +			var tiptip_content = $('<div id="tiptip_content"></div>');
    +			var tiptip_arrow = $('<div id="tiptip_arrow"></div>');
    +			$("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id="tiptip_arrow_inner"></div>')));
    +		} else {
    +			var tiptip_holder = $("#tiptip_holder");
    +			var tiptip_content = $("#tiptip_content");
    +			var tiptip_arrow = $("#tiptip_arrow");
    +		}
    +		
    +		return this.each(function(){
    +			var org_elem = $(this);
    +			if(opts.content){
    +				var org_title = opts.content;
    +			} else {
    +				var org_title = org_elem.attr(opts.attribute);
    +			}
    +			if(org_title != ""){
    +				if(!opts.content){
    +					//org_elem.removeAttr(opts.attribute); //remove original Attribute
    +				}
    +				var timeout = false;
    +				
    +				if(opts.activation == "hover"){
    +					org_elem.hover(function(){
    +						active_tiptip();
    +					}, function(){
    +						if(!opts.keepAlive){
    +							deactive_tiptip();
    +						}
    +					});
    +					if(opts.keepAlive){
    +						tiptip_holder.hover(function(){}, function(){
    +							deactive_tiptip();
    +						});
    +					}
    +				} else if(opts.activation == "focus"){
    +					org_elem.focus(function(){
    +						active_tiptip();
    +					}).blur(function(){
    +						deactive_tiptip();
    +					});
    +				} else if(opts.activation == "click"){
    +					org_elem.click(function(){
    +						active_tiptip();
    +						return false;
    +					}).hover(function(){},function(){
    +						if(!opts.keepAlive){
    +							deactive_tiptip();
    +						}
    +					});
    +					if(opts.keepAlive){
    +						tiptip_holder.hover(function(){}, function(){
    +							deactive_tiptip();
    +						});
    +					}
    +				}
    +			
    +				function active_tiptip(){
    +					opts.enter.call(this);
    +					tiptip_content.html(org_title);
    +					tiptip_holder.hide().removeAttr("class").css("margin","0");
    +					tiptip_arrow.removeAttr("style");
    +					
    +					var top = parseInt(org_elem.offset()['top']);
    +					var left = parseInt(org_elem.offset()['left']);
    +					var org_width = parseInt(org_elem.outerWidth());
    +					var org_height = parseInt(org_elem.outerHeight());
    +					var tip_w = tiptip_holder.outerWidth();
    +					var tip_h = tiptip_holder.outerHeight();
    +					var w_compare = Math.round((org_width - tip_w) / 2);
    +					var h_compare = Math.round((org_height - tip_h) / 2);
    +					var marg_left = Math.round(left + w_compare);
    +					var marg_top = Math.round(top + org_height + opts.edgeOffset);
    +					var t_class = "";
    +					var arrow_top = "";
    +					var arrow_left = Math.round(tip_w - 12) / 2;
    +
    +                    if(opts.defaultPosition == "bottom"){
    +                    	t_class = "_bottom";
    +                   	} else if(opts.defaultPosition == "top"){ 
    +                   		t_class = "_top";
    +                   	} else if(opts.defaultPosition == "left"){
    +                   		t_class = "_left";
    +                   	} else if(opts.defaultPosition == "right"){
    +                   		t_class = "_right";
    +                   	}
    +					
    +					var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());
    +					var left_compare = (tip_w + left) > parseInt($(window).width());
    +					
    +					if((right_compare && w_compare < 0) || (t_class == "_right" && !left_compare) || (t_class == "_left" && left < (tip_w + opts.edgeOffset + 5))){
    +						t_class = "_right";
    +						arrow_top = Math.round(tip_h - 13) / 2;
    +						arrow_left = -12;
    +						marg_left = Math.round(left + org_width + opts.edgeOffset);
    +						marg_top = Math.round(top + h_compare);
    +					} else if((left_compare && w_compare < 0) || (t_class == "_left" && !right_compare)){
    +						t_class = "_left";
    +						arrow_top = Math.round(tip_h - 13) / 2;
    +						arrow_left =  Math.round(tip_w);
    +						marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));
    +						marg_top = Math.round(top + h_compare);
    +					}
    +
    +					var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());
    +					var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;
    +					
    +					if(top_compare || (t_class == "_bottom" && top_compare) || (t_class == "_top" && !bottom_compare)){
    +						if(t_class == "_top" || t_class == "_bottom"){
    +							t_class = "_top";
    +						} else {
    +							t_class = t_class+"_top";
    +						}
    +						arrow_top = tip_h;
    +						marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));
    +					} else if(bottom_compare | (t_class == "_top" && bottom_compare) || (t_class == "_bottom" && !top_compare)){
    +						if(t_class == "_top" || t_class == "_bottom"){
    +							t_class = "_bottom";
    +						} else {
    +							t_class = t_class+"_bottom";
    +						}
    +						arrow_top = -12;						
    +						marg_top = Math.round(top + org_height + opts.edgeOffset);
    +					}
    +				
    +					if(t_class == "_right_top" || t_class == "_left_top"){
    +						marg_top = marg_top + 5;
    +					} else if(t_class == "_right_bottom" || t_class == "_left_bottom"){		
    +						marg_top = marg_top - 5;
    +					}
    +					if(t_class == "_left_top" || t_class == "_left_bottom"){	
    +						marg_left = marg_left + 5;
    +					}
    +					tiptip_arrow.css({"margin-left": arrow_left+"px", "margin-top": arrow_top+"px"});
    +					tiptip_holder.css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class);
    +					
    +					if (timeout){ clearTimeout(timeout); }
    +					timeout = setTimeout(function(){ tiptip_holder.stop(true,true).fadeIn(opts.fadeIn); }, opts.delay);	
    +				}
    +				
    +				function deactive_tiptip(){
    +					opts.exit.call(this);
    +					if (timeout){ clearTimeout(timeout); }
    +					tiptip_holder.fadeOut(opts.fadeOut);
    +				}
    +			}				
    +		});
    +	}
    +})(jQuery);  	
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
    new file mode 100644
    index 00000000..954e22db
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
    new file mode 100644
    index 00000000..64ece570
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
    new file mode 100644
    index 00000000..abdc0108
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
    new file mode 100644
    index 00000000..9b383f4d
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
    new file mode 100644
    index 00000000..a23baad2
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
    new file mode 100644
    index 00000000..42ccba26
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
    new file mode 100644
    index 00000000..1b1972b5
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
    new file mode 100644
    index 00000000..f1273672
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
    new file mode 100644
    index 00000000..32f86222
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png
    new file mode 100644
    index 00000000..b273ff11
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png
    new file mode 100644
    index 00000000..a641a371
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png
    new file mode 100644
    index 00000000..85e63e9f
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png
    new file mode 100644
    index 00000000..e117effa
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png
    new file mode 100644
    index 00000000..42f8f992
    Binary files /dev/null and b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png differ
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/jquery-ui-1.9.2.custom.css b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/jquery-ui-1.9.2.custom.css
    new file mode 100644
    index 00000000..91f00e2e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/jquery-ui-1.9.2.custom.css
    @@ -0,0 +1,462 @@
    +/*! jQuery UI - v1.9.2 - 2012-11-27
    +* http://jqueryui.com
    +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css
    +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
    +* Copyright (c) 2012 jQuery Foundation and other contributors Licensed MIT */
    +
    +/* Layout helpers
    +----------------------------------*/
    +.ui-helper-hidden { display: none; }
    +.ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
    +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
    +.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
    +.ui-helper-clearfix:after { clear: both; }
    +.ui-helper-clearfix { zoom: 1; }
    +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
    +
    +
    +/* Interaction Cues
    +----------------------------------*/
    +.ui-state-disabled { cursor: default !important; }
    +
    +
    +/* Icons
    +----------------------------------*/
    +
    +/* states and images */
    +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
    +
    +
    +/* Misc visuals
    +----------------------------------*/
    +
    +/* Overlays */
    +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
    +.ui-resizable { position: relative;}
    +.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; }
    +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
    +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
    +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
    +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
    +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
    +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
    +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
    +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
    +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
    +.ui-accordion .ui-accordion-header { display: block; cursor: pointer; position: relative; margin-top: 2px; padding: .5em .5em .5em .7em; zoom: 1; }
    +.ui-accordion .ui-accordion-icons { padding-left: 2.2em; }
    +.ui-accordion .ui-accordion-noicons { padding-left: .7em; }
    +.ui-accordion .ui-accordion-icons .ui-accordion-icons { padding-left: 2.2em; }
    +.ui-accordion .ui-accordion-header .ui-accordion-header-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
    +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; overflow: auto; zoom: 1; }
    +.ui-autocomplete {
    +	position: absolute;
    +	top: 0;
    +	left: 0;
    +	cursor: default;
    +}
    +
    +/* workarounds */
    +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
    +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
    +.ui-button, .ui-button:link, .ui-button:visited, .ui-button:hover, .ui-button:active { text-decoration: none; }
    +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
    +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
    +.ui-button-icons-only { width: 3.4em; } 
    +button.ui-button-icons-only { width: 3.7em; } 
    +
    +/*button text element */
    +.ui-button .ui-button-text { display: block; line-height: 1.4;  }
    +.ui-button-text-only .ui-button-text { padding: .4em 1em; }
    +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
    +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
    +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
    +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
    +/* no icon support for input elements, provide padding by default */
    +input.ui-button { padding: .4em 1em; }
    +
    +/*button icon element(s) */
    +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
    +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
    +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
    +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
    +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
    +
    +/*button sets*/
    +.ui-buttonset { margin-right: 7px; }
    +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
    +
    +/* workarounds */
    +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
    +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
    +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
    +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
    +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
    +.ui-datepicker .ui-datepicker-prev { left:2px; }
    +.ui-datepicker .ui-datepicker-next { right:2px; }
    +.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
    +.ui-datepicker .ui-datepicker-next-hover { right:1px; }
    +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
    +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
    +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
    +.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
    +.ui-datepicker select.ui-datepicker-month, 
    +.ui-datepicker select.ui-datepicker-year { width: 49%;}
    +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
    +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
    +.ui-datepicker td { border: 0; padding: 1px; }
    +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
    +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
    +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
    +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
    +
    +/* with multiple calendars */
    +.ui-datepicker.ui-datepicker-multi { width:auto; }
    +.ui-datepicker-multi .ui-datepicker-group { float:left; }
    +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
    +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
    +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
    +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
    +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
    +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
    +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
    +.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
    +
    +/* RTL support */
    +.ui-datepicker-rtl { direction: rtl; }
    +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
    +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
    +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
    +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
    +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
    +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
    +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
    +.ui-datepicker-rtl .ui-datepicker-group { float:right; }
    +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
    +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
    +
    +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
    +.ui-datepicker-cover {
    +    position: absolute; /*must have*/
    +    z-index: -1; /*must have*/
    +    filter: mask(); /*must have*/
    +    top: -4px; /*must have*/
    +    left: -4px; /*must have*/
    +    width: 200px; /*must have*/
    +    height: 200px; /*must have*/
    +}.ui-dialog { position: absolute; top: 0; left: 0; padding: .2em; width: 300px; overflow: hidden; }
    +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
    +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
    +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
    +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
    +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
    +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
    +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
    +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
    +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
    +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
    +.ui-draggable .ui-dialog-titlebar { cursor: move; }
    +.ui-menu { list-style:none; padding: 2px; margin: 0; display:block; outline: none; }
    +.ui-menu .ui-menu { margin-top: -3px; position: absolute; }
    +.ui-menu .ui-menu-item { margin: 0; padding: 0; zoom: 1; width: 100%; }
    +.ui-menu .ui-menu-divider { margin: 5px -2px 5px -2px; height: 0; font-size: 0; line-height: 0; border-width: 1px 0 0 0; }
    +.ui-menu .ui-menu-item a { text-decoration: none; display: block; padding: 2px .4em; line-height: 1.5; zoom: 1; font-weight: normal; }
    +.ui-menu .ui-menu-item a.ui-state-focus,
    +.ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; }
    +
    +.ui-menu .ui-state-disabled { font-weight: normal; margin: .4em 0 .2em; line-height: 1.5; }
    +.ui-menu .ui-state-disabled a { cursor: default; }
    +
    +/* icon support */
    +.ui-menu-icons { position: relative; }
    +.ui-menu-icons .ui-menu-item a { position: relative; padding-left: 2em; }
    +
    +/* left-aligned */
    +.ui-menu .ui-icon { position: absolute; top: .2em; left: .2em; }
    +
    +/* right-aligned */
    +.ui-menu .ui-menu-icon { position: static; float: right; }
    +.ui-progressbar { height:2em; text-align: left; overflow: hidden; }
    +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }.ui-slider { position: relative; text-align: left; }
    +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
    +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
    +
    +.ui-slider-horizontal { height: .8em; }
    +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
    +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
    +.ui-slider-horizontal .ui-slider-range-min { left: 0; }
    +.ui-slider-horizontal .ui-slider-range-max { right: 0; }
    +
    +.ui-slider-vertical { width: .8em; height: 100px; }
    +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
    +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
    +.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
    +.ui-slider-vertical .ui-slider-range-max { top: 0; }.ui-spinner { position:relative; display: inline-block; overflow: hidden; padding: 0; vertical-align: middle; }
    +.ui-spinner-input { border: none; background: none; padding: 0; margin: .2em 0; vertical-align: middle; margin-left: .4em; margin-right: 22px; }
    +.ui-spinner-button { width: 16px; height: 50%; font-size: .5em; padding: 0; margin: 0; text-align: center; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; }
    +.ui-spinner a.ui-spinner-button { border-top: none; border-bottom: none; border-right: none; } /* more specificity required here to overide default borders */
    +.ui-spinner .ui-icon { position: absolute; margin-top: -8px; top: 50%; left: 0; } /* vertical centre icon */
    +.ui-spinner-up { top: 0; }
    +.ui-spinner-down { bottom: 0; }
    +
    +/* TR overrides */
    +.ui-spinner .ui-icon-triangle-1-s {
    +	/* need to fix icons sprite */
    +	background-position:-65px -16px;
    +}
    +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
    +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
    +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 0; margin: 1px .2em 0 0; border-bottom: 0; padding: 0; white-space: nowrap; }
    +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
    +.ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; }
    +.ui-tabs .ui-tabs-nav li.ui-tabs-active a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-tabs-loading a { cursor: text; }
    +.ui-tabs .ui-tabs-nav li a, .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
    +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
    +.ui-tooltip {
    +	padding: 8px;
    +	position: absolute;
    +	z-index: 9999;
    +	max-width: 300px;
    +	-webkit-box-shadow: 0 0 5px #aaa;
    +	box-shadow: 0 0 5px #aaa;
    +}
    +/* Fades and background-images don't work well together in IE6, drop the image */
    +* html .ui-tooltip {
    +	background-image: none;
    +}
    +body .ui-tooltip { border-width: 2px; }
    +
    +/* Component containers
    +----------------------------------*/
    +.ui-widget { font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; font-size: 1.1em; }
    +.ui-widget .ui-widget { font-size: 1em; }
    +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; font-size: 1em; }
    +.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
    +.ui-widget-content a { color: #333333; }
    +.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
    +.ui-widget-header a { color: #ffffff; }
    +
    +/* Interaction states
    +----------------------------------*/
    +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
    +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
    +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
    +.ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #c77405; text-decoration: none; }
    +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
    +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
    +
    +/* Interaction Cues
    +----------------------------------*/
    +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
    +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
    +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
    +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
    +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
    +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
    +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
    +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
    +.ui-state-disabled .ui-icon { filter:Alpha(Opacity=35); } /* For IE8 - See #6059 */
    +
    +/* Icons
    +----------------------------------*/
    +
    +/* states and images */
    +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
    +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
    +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
    +.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }
    +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
    +.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
    +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }
    +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }
    +
    +/* positioning */
    +.ui-icon-carat-1-n { background-position: 0 0; }
    +.ui-icon-carat-1-ne { background-position: -16px 0; }
    +.ui-icon-carat-1-e { background-position: -32px 0; }
    +.ui-icon-carat-1-se { background-position: -48px 0; }
    +.ui-icon-carat-1-s { background-position: -64px 0; }
    +.ui-icon-carat-1-sw { background-position: -80px 0; }
    +.ui-icon-carat-1-w { background-position: -96px 0; }
    +.ui-icon-carat-1-nw { background-position: -112px 0; }
    +.ui-icon-carat-2-n-s { background-position: -128px 0; }
    +.ui-icon-carat-2-e-w { background-position: -144px 0; }
    +.ui-icon-triangle-1-n { background-position: 0 -16px; }
    +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
    +.ui-icon-triangle-1-e { background-position: -32px -16px; }
    +.ui-icon-triangle-1-se { background-position: -48px -16px; }
    +.ui-icon-triangle-1-s { background-position: -64px -16px; }
    +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
    +.ui-icon-triangle-1-w { background-position: -96px -16px; }
    +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
    +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
    +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
    +.ui-icon-arrow-1-n { background-position: 0 -32px; }
    +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
    +.ui-icon-arrow-1-e { background-position: -32px -32px; }
    +.ui-icon-arrow-1-se { background-position: -48px -32px; }
    +.ui-icon-arrow-1-s { background-position: -64px -32px; }
    +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
    +.ui-icon-arrow-1-w { background-position: -96px -32px; }
    +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
    +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
    +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
    +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
    +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
    +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
    +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
    +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
    +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
    +.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
    +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
    +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
    +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
    +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
    +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
    +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
    +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
    +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
    +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
    +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
    +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
    +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
    +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
    +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
    +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
    +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
    +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
    +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
    +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
    +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
    +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
    +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
    +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
    +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
    +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
    +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
    +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
    +.ui-icon-arrow-4 { background-position: 0 -80px; }
    +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
    +.ui-icon-extlink { background-position: -32px -80px; }
    +.ui-icon-newwin { background-position: -48px -80px; }
    +.ui-icon-refresh { background-position: -64px -80px; }
    +.ui-icon-shuffle { background-position: -80px -80px; }
    +.ui-icon-transfer-e-w { background-position: -96px -80px; }
    +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
    +.ui-icon-folder-collapsed { background-position: 0 -96px; }
    +.ui-icon-folder-open { background-position: -16px -96px; }
    +.ui-icon-document { background-position: -32px -96px; }
    +.ui-icon-document-b { background-position: -48px -96px; }
    +.ui-icon-note { background-position: -64px -96px; }
    +.ui-icon-mail-closed { background-position: -80px -96px; }
    +.ui-icon-mail-open { background-position: -96px -96px; }
    +.ui-icon-suitcase { background-position: -112px -96px; }
    +.ui-icon-comment { background-position: -128px -96px; }
    +.ui-icon-person { background-position: -144px -96px; }
    +.ui-icon-print { background-position: -160px -96px; }
    +.ui-icon-trash { background-position: -176px -96px; }
    +.ui-icon-locked { background-position: -192px -96px; }
    +.ui-icon-unlocked { background-position: -208px -96px; }
    +.ui-icon-bookmark { background-position: -224px -96px; }
    +.ui-icon-tag { background-position: -240px -96px; }
    +.ui-icon-home { background-position: 0 -112px; }
    +.ui-icon-flag { background-position: -16px -112px; }
    +.ui-icon-calendar { background-position: -32px -112px; }
    +.ui-icon-cart { background-position: -48px -112px; }
    +.ui-icon-pencil { background-position: -64px -112px; }
    +.ui-icon-clock { background-position: -80px -112px; }
    +.ui-icon-disk { background-position: -96px -112px; }
    +.ui-icon-calculator { background-position: -112px -112px; }
    +.ui-icon-zoomin { background-position: -128px -112px; }
    +.ui-icon-zoomout { background-position: -144px -112px; }
    +.ui-icon-search { background-position: -160px -112px; }
    +.ui-icon-wrench { background-position: -176px -112px; }
    +.ui-icon-gear { background-position: -192px -112px; }
    +.ui-icon-heart { background-position: -208px -112px; }
    +.ui-icon-star { background-position: -224px -112px; }
    +.ui-icon-link { background-position: -240px -112px; }
    +.ui-icon-cancel { background-position: 0 -128px; }
    +.ui-icon-plus { background-position: -16px -128px; }
    +.ui-icon-plusthick { background-position: -32px -128px; }
    +.ui-icon-minus { background-position: -48px -128px; }
    +.ui-icon-minusthick { background-position: -64px -128px; }
    +.ui-icon-close { background-position: -80px -128px; }
    +.ui-icon-closethick { background-position: -96px -128px; }
    +.ui-icon-key { background-position: -112px -128px; }
    +.ui-icon-lightbulb { background-position: -128px -128px; }
    +.ui-icon-scissors { background-position: -144px -128px; }
    +.ui-icon-clipboard { background-position: -160px -128px; }
    +.ui-icon-copy { background-position: -176px -128px; }
    +.ui-icon-contact { background-position: -192px -128px; }
    +.ui-icon-image { background-position: -208px -128px; }
    +.ui-icon-video { background-position: -224px -128px; }
    +.ui-icon-script { background-position: -240px -128px; }
    +.ui-icon-alert { background-position: 0 -144px; }
    +.ui-icon-info { background-position: -16px -144px; }
    +.ui-icon-notice { background-position: -32px -144px; }
    +.ui-icon-help { background-position: -48px -144px; }
    +.ui-icon-check { background-position: -64px -144px; }
    +.ui-icon-bullet { background-position: -80px -144px; }
    +.ui-icon-radio-on { background-position: -96px -144px; }
    +.ui-icon-radio-off { background-position: -112px -144px; }
    +.ui-icon-pin-w { background-position: -128px -144px; }
    +.ui-icon-pin-s { background-position: -144px -144px; }
    +.ui-icon-play { background-position: 0 -160px; }
    +.ui-icon-pause { background-position: -16px -160px; }
    +.ui-icon-seek-next { background-position: -32px -160px; }
    +.ui-icon-seek-prev { background-position: -48px -160px; }
    +.ui-icon-seek-end { background-position: -64px -160px; }
    +.ui-icon-seek-start { background-position: -80px -160px; }
    +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
    +.ui-icon-seek-first { background-position: -80px -160px; }
    +.ui-icon-stop { background-position: -96px -160px; }
    +.ui-icon-eject { background-position: -112px -160px; }
    +.ui-icon-volume-off { background-position: -128px -160px; }
    +.ui-icon-volume-on { background-position: -144px -160px; }
    +.ui-icon-power { background-position: 0 -176px; }
    +.ui-icon-signal-diag { background-position: -16px -176px; }
    +.ui-icon-signal { background-position: -32px -176px; }
    +.ui-icon-battery-0 { background-position: -48px -176px; }
    +.ui-icon-battery-1 { background-position: -64px -176px; }
    +.ui-icon-battery-2 { background-position: -80px -176px; }
    +.ui-icon-battery-3 { background-position: -96px -176px; }
    +.ui-icon-circle-plus { background-position: 0 -192px; }
    +.ui-icon-circle-minus { background-position: -16px -192px; }
    +.ui-icon-circle-close { background-position: -32px -192px; }
    +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
    +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
    +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
    +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
    +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
    +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
    +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
    +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
    +.ui-icon-circle-zoomin { background-position: -176px -192px; }
    +.ui-icon-circle-zoomout { background-position: -192px -192px; }
    +.ui-icon-circle-check { background-position: -208px -192px; }
    +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
    +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
    +.ui-icon-circlesmall-close { background-position: -32px -208px; }
    +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
    +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
    +.ui-icon-squaresmall-close { background-position: -80px -208px; }
    +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
    +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
    +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
    +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
    +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
    +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
    +
    +
    +/* Misc visuals
    +----------------------------------*/
    +
    +/* Corner radius */
    +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
    +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
    +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
    +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
    +
    +/* Overlays */
    +.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .5;filter:Alpha(Opacity=50); }
    +.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .2;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/jquery-ui-1.9.2.custom.min.css b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/jquery-ui-1.9.2.custom.min.css
    new file mode 100644
    index 00000000..3c1cafbf
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-ui/css/ui-lightness/jquery-ui-1.9.2.custom.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.9.2 - 2012-11-27
    +* http://jqueryui.com
    +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css
    +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
    +* Copyright (c) 2012 jQuery Foundation and other contributors Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;zoom:1}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto;zoom:1}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}* html .ui-autocomplete{width:1px}.ui-button{display:inline-block;position:relative;padding:0;margin-right:.1em;cursor:pointer;text-align:center;zoom:1;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:1.4}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0em}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right}.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-cover{position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;width:300px;overflow:hidden}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 16px .1em 0}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:19px;margin:-10px 0 0 0;padding:1px;height:18px}.ui-dialog .ui-dialog-titlebar-close span{display:block;margin:1px}.ui-dialog .ui-dialog-titlebar-close:hover,.ui-dialog .ui-dialog-titlebar-close:focus{padding:0}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto;zoom:1}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin:.5em 0 0 0;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;width:100%}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;zoom:1;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em;zoom:1}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}* html .ui-tooltip{background-image:none}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px;background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_ffffff_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_228ef1_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_ffd27a_256x240.png)}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);-moz-border-radius:5px;-khtml-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-ui/js/jquery-ui-1.9.2.custom.js b/src/main/webapp/plug-in/jquery-ui/js/jquery-ui-1.9.2.custom.js
    new file mode 100644
    index 00000000..1dd5ec1b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-ui/js/jquery-ui-1.9.2.custom.js
    @@ -0,0 +1,14879 @@
    +/*! jQuery UI - v1.9.2 - 2012-11-27
    +* http://jqueryui.com
    +* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.menu.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js, jquery.ui.effect.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js
    +* Copyright (c) 2012 jQuery Foundation and other contributors Licensed MIT */
    +
    +(function( $, undefined ) {
    +
    +var uuid = 0,
    +	runiqueId = /^ui-id-\d+$/;
    +
    +// prevent duplicate loading
    +// this is only a problem because we proxy existing functions
    +// and we don't want to double proxy them
    +$.ui = $.ui || {};
    +if ( $.ui.version ) {
    +	return;
    +}
    +
    +$.extend( $.ui, {
    +	version: "1.9.2",
    +
    +	keyCode: {
    +		BACKSPACE: 8,
    +		COMMA: 188,
    +		DELETE: 46,
    +		DOWN: 40,
    +		END: 35,
    +		ENTER: 13,
    +		ESCAPE: 27,
    +		HOME: 36,
    +		LEFT: 37,
    +		NUMPAD_ADD: 107,
    +		NUMPAD_DECIMAL: 110,
    +		NUMPAD_DIVIDE: 111,
    +		NUMPAD_ENTER: 108,
    +		NUMPAD_MULTIPLY: 106,
    +		NUMPAD_SUBTRACT: 109,
    +		PAGE_DOWN: 34,
    +		PAGE_UP: 33,
    +		PERIOD: 190,
    +		RIGHT: 39,
    +		SPACE: 32,
    +		TAB: 9,
    +		UP: 38
    +	}
    +});
    +
    +// plugins
    +$.fn.extend({
    +	_focus: $.fn.focus,
    +	focus: function( delay, fn ) {
    +		return typeof delay === "number" ?
    +			this.each(function() {
    +				var elem = this;
    +				setTimeout(function() {
    +					$( elem ).focus();
    +					if ( fn ) {
    +						fn.call( elem );
    +					}
    +				}, delay );
    +			}) :
    +			this._focus.apply( this, arguments );
    +	},
    +
    +	scrollParent: function() {
    +		var scrollParent;
    +		if (($.ui.ie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
    +			scrollParent = this.parents().filter(function() {
    +				return (/(relative|absolute|fixed)/).test($.css(this,'position')) && (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
    +			}).eq(0);
    +		} else {
    +			scrollParent = this.parents().filter(function() {
    +				return (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
    +			}).eq(0);
    +		}
    +
    +		return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
    +	},
    +
    +	zIndex: function( zIndex ) {
    +		if ( zIndex !== undefined ) {
    +			return this.css( "zIndex", zIndex );
    +		}
    +
    +		if ( this.length ) {
    +			var elem = $( this[ 0 ] ), position, value;
    +			while ( elem.length && elem[ 0 ] !== document ) {
    +				// Ignore z-index if position is set to a value where z-index is ignored by the browser
    +				// This makes behavior of this function consistent across browsers
    +				// WebKit always returns auto if the element is positioned
    +				position = elem.css( "position" );
    +				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
    +					// IE returns 0 when zIndex is not specified
    +					// other browsers return a string
    +					// we ignore the case of nested elements with an explicit value of 0
    +					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
    +					value = parseInt( elem.css( "zIndex" ), 10 );
    +					if ( !isNaN( value ) && value !== 0 ) {
    +						return value;
    +					}
    +				}
    +				elem = elem.parent();
    +			}
    +		}
    +
    +		return 0;
    +	},
    +
    +	uniqueId: function() {
    +		return this.each(function() {
    +			if ( !this.id ) {
    +				this.id = "ui-id-" + (++uuid);
    +			}
    +		});
    +	},
    +
    +	removeUniqueId: function() {
    +		return this.each(function() {
    +			if ( runiqueId.test( this.id ) ) {
    +				$( this ).removeAttr( "id" );
    +			}
    +		});
    +	}
    +});
    +
    +// selectors
    +function focusable( element, isTabIndexNotNaN ) {
    +	var map, mapName, img,
    +		nodeName = element.nodeName.toLowerCase();
    +	if ( "area" === nodeName ) {
    +		map = element.parentNode;
    +		mapName = map.name;
    +		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
    +			return false;
    +		}
    +		img = $( "img[usemap=#" + mapName + "]" )[0];
    +		return !!img && visible( img );
    +	}
    +	return ( /input|select|textarea|button|object/.test( nodeName ) ?
    +		!element.disabled :
    +		"a" === nodeName ?
    +			element.href || isTabIndexNotNaN :
    +			isTabIndexNotNaN) &&
    +		// the element and all of its ancestors must be visible
    +		visible( element );
    +}
    +
    +function visible( element ) {
    +	return $.expr.filters.visible( element ) &&
    +		!$( element ).parents().andSelf().filter(function() {
    +			return $.css( this, "visibility" ) === "hidden";
    +		}).length;
    +}
    +
    +$.extend( $.expr[ ":" ], {
    +	data: $.expr.createPseudo ?
    +		$.expr.createPseudo(function( dataName ) {
    +			return function( elem ) {
    +				return !!$.data( elem, dataName );
    +			};
    +		}) :
    +		// support: jQuery <1.8
    +		function( elem, i, match ) {
    +			return !!$.data( elem, match[ 3 ] );
    +		},
    +
    +	focusable: function( element ) {
    +		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
    +	},
    +
    +	tabbable: function( element ) {
    +		var tabIndex = $.attr( element, "tabindex" ),
    +			isTabIndexNaN = isNaN( tabIndex );
    +		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
    +	}
    +});
    +
    +// support
    +$(function() {
    +	var body = document.body,
    +		div = body.appendChild( div = document.createElement( "div" ) );
    +
    +	// access offsetHeight before setting the style to prevent a layout bug
    +	// in IE 9 which causes the element to continue to take up space even
    +	// after it is removed from the DOM (#8026)
    +	div.offsetHeight;
    +
    +	$.extend( div.style, {
    +		minHeight: "100px",
    +		height: "auto",
    +		padding: 0,
    +		borderWidth: 0
    +	});
    +
    +	$.support.minHeight = div.offsetHeight === 100;
    +	$.support.selectstart = "onselectstart" in div;
    +
    +	// set display to none to avoid a layout bug in IE
    +	// http://dev.jquery.com/ticket/4014
    +	body.removeChild( div ).style.display = "none";
    +});
    +
    +// support: jQuery <1.8
    +if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
    +	$.each( [ "Width", "Height" ], function( i, name ) {
    +		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
    +			type = name.toLowerCase(),
    +			orig = {
    +				innerWidth: $.fn.innerWidth,
    +				innerHeight: $.fn.innerHeight,
    +				outerWidth: $.fn.outerWidth,
    +				outerHeight: $.fn.outerHeight
    +			};
    +
    +		function reduce( elem, size, border, margin ) {
    +			$.each( side, function() {
    +				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
    +				if ( border ) {
    +					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
    +				}
    +				if ( margin ) {
    +					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
    +				}
    +			});
    +			return size;
    +		}
    +
    +		$.fn[ "inner" + name ] = function( size ) {
    +			if ( size === undefined ) {
    +				return orig[ "inner" + name ].call( this );
    +			}
    +
    +			return this.each(function() {
    +				$( this ).css( type, reduce( this, size ) + "px" );
    +			});
    +		};
    +
    +		$.fn[ "outer" + name] = function( size, margin ) {
    +			if ( typeof size !== "number" ) {
    +				return orig[ "outer" + name ].call( this, size );
    +			}
    +
    +			return this.each(function() {
    +				$( this).css( type, reduce( this, size, true, margin ) + "px" );
    +			});
    +		};
    +	});
    +}
    +
    +// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
    +if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
    +	$.fn.removeData = (function( removeData ) {
    +		return function( key ) {
    +			if ( arguments.length ) {
    +				return removeData.call( this, $.camelCase( key ) );
    +			} else {
    +				return removeData.call( this );
    +			}
    +		};
    +	})( $.fn.removeData );
    +}
    +
    +
    +
    +
    +
    +// deprecated
    +
    +(function() {
    +	var uaMatch = /msie ([\w.]+)/.exec( navigator.userAgent.toLowerCase() ) || [];
    +	$.ui.ie = uaMatch.length ? true : false;
    +	$.ui.ie6 = parseFloat( uaMatch[ 1 ], 10 ) === 6;
    +})();
    +
    +$.fn.extend({
    +	disableSelection: function() {
    +		return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
    +			".ui-disableSelection", function( event ) {
    +				event.preventDefault();
    +			});
    +	},
    +
    +	enableSelection: function() {
    +		return this.unbind( ".ui-disableSelection" );
    +	}
    +});
    +
    +$.extend( $.ui, {
    +	// $.ui.plugin is deprecated.  Use the proxy pattern instead.
    +	plugin: {
    +		add: function( module, option, set ) {
    +			var i,
    +				proto = $.ui[ module ].prototype;
    +			for ( i in set ) {
    +				proto.plugins[ i ] = proto.plugins[ i ] || [];
    +				proto.plugins[ i ].push( [ option, set[ i ] ] );
    +			}
    +		},
    +		call: function( instance, name, args ) {
    +			var i,
    +				set = instance.plugins[ name ];
    +			if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
    +				return;
    +			}
    +
    +			for ( i = 0; i < set.length; i++ ) {
    +				if ( instance.options[ set[ i ][ 0 ] ] ) {
    +					set[ i ][ 1 ].apply( instance.element, args );
    +				}
    +			}
    +		}
    +	},
    +
    +	contains: $.contains,
    +
    +	// only used by resizable
    +	hasScroll: function( el, a ) {
    +
    +		//If overflow is hidden, the element might have extra content, but the user wants to hide it
    +		if ( $( el ).css( "overflow" ) === "hidden") {
    +			return false;
    +		}
    +
    +		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
    +			has = false;
    +
    +		if ( el[ scroll ] > 0 ) {
    +			return true;
    +		}
    +
    +		// TODO: determine which cases actually cause this to happen
    +		// if the element doesn't have the scroll set, see if it's possible to
    +		// set the scroll
    +		el[ scroll ] = 1;
    +		has = ( el[ scroll ] > 0 );
    +		el[ scroll ] = 0;
    +		return has;
    +	},
    +
    +	// these are odd functions, fix the API or move into individual plugins
    +	isOverAxis: function( x, reference, size ) {
    +		//Determines when x coordinate is over "b" element axis
    +		return ( x > reference ) && ( x < ( reference + size ) );
    +	},
    +	isOver: function( y, x, top, left, height, width ) {
    +		//Determines when x, y coordinates is over "b" element
    +		return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
    +	}
    +});
    +
    +})( jQuery );
    +(function( $, undefined ) {
    +
    +var uuid = 0,
    +	slice = Array.prototype.slice,
    +	_cleanData = $.cleanData;
    +$.cleanData = function( elems ) {
    +	for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
    +		try {
    +			$( elem ).triggerHandler( "remove" );
    +		// http://bugs.jquery.com/ticket/8235
    +		} catch( e ) {}
    +	}
    +	_cleanData( elems );
    +};
    +
    +$.widget = function( name, base, prototype ) {
    +	var fullName, existingConstructor, constructor, basePrototype,
    +		namespace = name.split( "." )[ 0 ];
    +
    +	name = name.split( "." )[ 1 ];
    +	fullName = namespace + "-" + name;
    +
    +	if ( !prototype ) {
    +		prototype = base;
    +		base = $.Widget;
    +	}
    +
    +	// create selector for plugin
    +	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
    +		return !!$.data( elem, fullName );
    +	};
    +
    +	$[ namespace ] = $[ namespace ] || {};
    +	existingConstructor = $[ namespace ][ name ];
    +	constructor = $[ namespace ][ name ] = function( options, element ) {
    +		// allow instantiation without "new" keyword
    +		if ( !this._createWidget ) {
    +			return new constructor( options, element );
    +		}
    +
    +		// allow instantiation without initializing for simple inheritance
    +		// must use "new" keyword (the code above always passes args)
    +		if ( arguments.length ) {
    +			this._createWidget( options, element );
    +		}
    +	};
    +	// extend with the existing constructor to carry over any static properties
    +	$.extend( constructor, existingConstructor, {
    +		version: prototype.version,
    +		// copy the object used to create the prototype in case we need to
    +		// redefine the widget later
    +		_proto: $.extend( {}, prototype ),
    +		// track widgets that inherit from this widget in case this widget is
    +		// redefined after a widget inherits from it
    +		_childConstructors: []
    +	});
    +
    +	basePrototype = new base();
    +	// we need to make the options hash a property directly on the new instance
    +	// otherwise we'll modify the options hash on the prototype that we're
    +	// inheriting from
    +	basePrototype.options = $.widget.extend( {}, basePrototype.options );
    +	$.each( prototype, function( prop, value ) {
    +		if ( $.isFunction( value ) ) {
    +			prototype[ prop ] = (function() {
    +				var _super = function() {
    +						return base.prototype[ prop ].apply( this, arguments );
    +					},
    +					_superApply = function( args ) {
    +						return base.prototype[ prop ].apply( this, args );
    +					};
    +				return function() {
    +					var __super = this._super,
    +						__superApply = this._superApply,
    +						returnValue;
    +
    +					this._super = _super;
    +					this._superApply = _superApply;
    +
    +					returnValue = value.apply( this, arguments );
    +
    +					this._super = __super;
    +					this._superApply = __superApply;
    +
    +					return returnValue;
    +				};
    +			})();
    +		}
    +	});
    +	constructor.prototype = $.widget.extend( basePrototype, {
    +		// TODO: remove support for widgetEventPrefix
    +		// always use the name + a colon as the prefix, e.g., draggable:start
    +		// don't prefix for widgets that aren't DOM-based
    +		widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
    +	}, prototype, {
    +		constructor: constructor,
    +		namespace: namespace,
    +		widgetName: name,
    +		// TODO remove widgetBaseClass, see #8155
    +		widgetBaseClass: fullName,
    +		widgetFullName: fullName
    +	});
    +
    +	// If this widget is being redefined then we need to find all widgets that
    +	// are inheriting from it and redefine all of them so that they inherit from
    +	// the new version of this widget. We're essentially trying to replace one
    +	// level in the prototype chain.
    +	if ( existingConstructor ) {
    +		$.each( existingConstructor._childConstructors, function( i, child ) {
    +			var childPrototype = child.prototype;
    +
    +			// redefine the child widget using the same prototype that was
    +			// originally used, but inherit from the new version of the base
    +			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
    +		});
    +		// remove the list of existing child constructors from the old constructor
    +		// so the old child constructors can be garbage collected
    +		delete existingConstructor._childConstructors;
    +	} else {
    +		base._childConstructors.push( constructor );
    +	}
    +
    +	$.widget.bridge( name, constructor );
    +};
    +
    +$.widget.extend = function( target ) {
    +	var input = slice.call( arguments, 1 ),
    +		inputIndex = 0,
    +		inputLength = input.length,
    +		key,
    +		value;
    +	for ( ; inputIndex < inputLength; inputIndex++ ) {
    +		for ( key in input[ inputIndex ] ) {
    +			value = input[ inputIndex ][ key ];
    +			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
    +				// Clone objects
    +				if ( $.isPlainObject( value ) ) {
    +					target[ key ] = $.isPlainObject( target[ key ] ) ?
    +						$.widget.extend( {}, target[ key ], value ) :
    +						// Don't extend strings, arrays, etc. with objects
    +						$.widget.extend( {}, value );
    +				// Copy everything else by reference
    +				} else {
    +					target[ key ] = value;
    +				}
    +			}
    +		}
    +	}
    +	return target;
    +};
    +
    +$.widget.bridge = function( name, object ) {
    +	var fullName = object.prototype.widgetFullName || name;
    +	$.fn[ name ] = function( options ) {
    +		var isMethodCall = typeof options === "string",
    +			args = slice.call( arguments, 1 ),
    +			returnValue = this;
    +
    +		// allow multiple hashes to be passed on init
    +		options = !isMethodCall && args.length ?
    +			$.widget.extend.apply( null, [ options ].concat(args) ) :
    +			options;
    +
    +		if ( isMethodCall ) {
    +			this.each(function() {
    +				var methodValue,
    +					instance = $.data( this, fullName );
    +				if ( !instance ) {
    +					return $.error( "cannot call methods on " + name + " prior to initialization; " +
    +						"attempted to call method '" + options + "'" );
    +				}
    +				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
    +					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
    +				}
    +				methodValue = instance[ options ].apply( instance, args );
    +				if ( methodValue !== instance && methodValue !== undefined ) {
    +					returnValue = methodValue && methodValue.jquery ?
    +						returnValue.pushStack( methodValue.get() ) :
    +						methodValue;
    +					return false;
    +				}
    +			});
    +		} else {
    +			this.each(function() {
    +				var instance = $.data( this, fullName );
    +				if ( instance ) {
    +					instance.option( options || {} )._init();
    +				} else {
    +					$.data( this, fullName, new object( options, this ) );
    +				}
    +			});
    +		}
    +
    +		return returnValue;
    +	};
    +};
    +
    +$.Widget = function( /* options, element */ ) {};
    +$.Widget._childConstructors = [];
    +
    +$.Widget.prototype = {
    +	widgetName: "widget",
    +	widgetEventPrefix: "",
    +	defaultElement: "<div>",
    +	options: {
    +		disabled: false,
    +
    +		// callbacks
    +		create: null
    +	},
    +	_createWidget: function( options, element ) {
    +		element = $( element || this.defaultElement || this )[ 0 ];
    +		this.element = $( element );
    +		this.uuid = uuid++;
    +		this.eventNamespace = "." + this.widgetName + this.uuid;
    +		this.options = $.widget.extend( {},
    +			this.options,
    +			this._getCreateOptions(),
    +			options );
    +
    +		this.bindings = $();
    +		this.hoverable = $();
    +		this.focusable = $();
    +
    +		if ( element !== this ) {
    +			// 1.9 BC for #7810
    +			// TODO remove dual storage
    +			$.data( element, this.widgetName, this );
    +			$.data( element, this.widgetFullName, this );
    +			this._on( true, this.element, {
    +				remove: function( event ) {
    +					if ( event.target === element ) {
    +						this.destroy();
    +					}
    +				}
    +			});
    +			this.document = $( element.style ?
    +				// element within the document
    +				element.ownerDocument :
    +				// element is window or document
    +				element.document || element );
    +			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
    +		}
    +
    +		this._create();
    +		this._trigger( "create", null, this._getCreateEventData() );
    +		this._init();
    +	},
    +	_getCreateOptions: $.noop,
    +	_getCreateEventData: $.noop,
    +	_create: $.noop,
    +	_init: $.noop,
    +
    +	destroy: function() {
    +		this._destroy();
    +		// we can probably remove the unbind calls in 2.0
    +		// all event bindings should go through this._on()
    +		this.element
    +			.unbind( this.eventNamespace )
    +			// 1.9 BC for #7810
    +			// TODO remove dual storage
    +			.removeData( this.widgetName )
    +			.removeData( this.widgetFullName )
    +			// support: jquery <1.6.3
    +			// http://bugs.jquery.com/ticket/9413
    +			.removeData( $.camelCase( this.widgetFullName ) );
    +		this.widget()
    +			.unbind( this.eventNamespace )
    +			.removeAttr( "aria-disabled" )
    +			.removeClass(
    +				this.widgetFullName + "-disabled " +
    +				"ui-state-disabled" );
    +
    +		// clean up events and states
    +		this.bindings.unbind( this.eventNamespace );
    +		this.hoverable.removeClass( "ui-state-hover" );
    +		this.focusable.removeClass( "ui-state-focus" );
    +	},
    +	_destroy: $.noop,
    +
    +	widget: function() {
    +		return this.element;
    +	},
    +
    +	option: function( key, value ) {
    +		var options = key,
    +			parts,
    +			curOption,
    +			i;
    +
    +		if ( arguments.length === 0 ) {
    +			// don't return a reference to the internal hash
    +			return $.widget.extend( {}, this.options );
    +		}
    +
    +		if ( typeof key === "string" ) {
    +			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
    +			options = {};
    +			parts = key.split( "." );
    +			key = parts.shift();
    +			if ( parts.length ) {
    +				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
    +				for ( i = 0; i < parts.length - 1; i++ ) {
    +					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
    +					curOption = curOption[ parts[ i ] ];
    +				}
    +				key = parts.pop();
    +				if ( value === undefined ) {
    +					return curOption[ key ] === undefined ? null : curOption[ key ];
    +				}
    +				curOption[ key ] = value;
    +			} else {
    +				if ( value === undefined ) {
    +					return this.options[ key ] === undefined ? null : this.options[ key ];
    +				}
    +				options[ key ] = value;
    +			}
    +		}
    +
    +		this._setOptions( options );
    +
    +		return this;
    +	},
    +	_setOptions: function( options ) {
    +		var key;
    +
    +		for ( key in options ) {
    +			this._setOption( key, options[ key ] );
    +		}
    +
    +		return this;
    +	},
    +	_setOption: function( key, value ) {
    +		this.options[ key ] = value;
    +
    +		if ( key === "disabled" ) {
    +			this.widget()
    +				.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
    +				.attr( "aria-disabled", value );
    +			this.hoverable.removeClass( "ui-state-hover" );
    +			this.focusable.removeClass( "ui-state-focus" );
    +		}
    +
    +		return this;
    +	},
    +
    +	enable: function() {
    +		return this._setOption( "disabled", false );
    +	},
    +	disable: function() {
    +		return this._setOption( "disabled", true );
    +	},
    +
    +	_on: function( suppressDisabledCheck, element, handlers ) {
    +		var delegateElement,
    +			instance = this;
    +
    +		// no suppressDisabledCheck flag, shuffle arguments
    +		if ( typeof suppressDisabledCheck !== "boolean" ) {
    +			handlers = element;
    +			element = suppressDisabledCheck;
    +			suppressDisabledCheck = false;
    +		}
    +
    +		// no element argument, shuffle and use this.element
    +		if ( !handlers ) {
    +			handlers = element;
    +			element = this.element;
    +			delegateElement = this.widget();
    +		} else {
    +			// accept selectors, DOM elements
    +			element = delegateElement = $( element );
    +			this.bindings = this.bindings.add( element );
    +		}
    +
    +		$.each( handlers, function( event, handler ) {
    +			function handlerProxy() {
    +				// allow widgets to customize the disabled handling
    +				// - disabled as an array instead of boolean
    +				// - disabled class as method for disabling individual parts
    +				if ( !suppressDisabledCheck &&
    +						( instance.options.disabled === true ||
    +							$( this ).hasClass( "ui-state-disabled" ) ) ) {
    +					return;
    +				}
    +				return ( typeof handler === "string" ? instance[ handler ] : handler )
    +					.apply( instance, arguments );
    +			}
    +
    +			// copy the guid so direct unbinding works
    +			if ( typeof handler !== "string" ) {
    +				handlerProxy.guid = handler.guid =
    +					handler.guid || handlerProxy.guid || $.guid++;
    +			}
    +
    +			var match = event.match( /^(\w+)\s*(.*)$/ ),
    +				eventName = match[1] + instance.eventNamespace,
    +				selector = match[2];
    +			if ( selector ) {
    +				delegateElement.delegate( selector, eventName, handlerProxy );
    +			} else {
    +				element.bind( eventName, handlerProxy );
    +			}
    +		});
    +	},
    +
    +	_off: function( element, eventName ) {
    +		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
    +		element.unbind( eventName ).undelegate( eventName );
    +	},
    +
    +	_delay: function( handler, delay ) {
    +		function handlerProxy() {
    +			return ( typeof handler === "string" ? instance[ handler ] : handler )
    +				.apply( instance, arguments );
    +		}
    +		var instance = this;
    +		return setTimeout( handlerProxy, delay || 0 );
    +	},
    +
    +	_hoverable: function( element ) {
    +		this.hoverable = this.hoverable.add( element );
    +		this._on( element, {
    +			mouseenter: function( event ) {
    +				$( event.currentTarget ).addClass( "ui-state-hover" );
    +			},
    +			mouseleave: function( event ) {
    +				$( event.currentTarget ).removeClass( "ui-state-hover" );
    +			}
    +		});
    +	},
    +
    +	_focusable: function( element ) {
    +		this.focusable = this.focusable.add( element );
    +		this._on( element, {
    +			focusin: function( event ) {
    +				$( event.currentTarget ).addClass( "ui-state-focus" );
    +			},
    +			focusout: function( event ) {
    +				$( event.currentTarget ).removeClass( "ui-state-focus" );
    +			}
    +		});
    +	},
    +
    +	_trigger: function( type, event, data ) {
    +		var prop, orig,
    +			callback = this.options[ type ];
    +
    +		data = data || {};
    +		event = $.Event( event );
    +		event.type = ( type === this.widgetEventPrefix ?
    +			type :
    +			this.widgetEventPrefix + type ).toLowerCase();
    +		// the original event may come from any element
    +		// so we need to reset the target on the new event
    +		event.target = this.element[ 0 ];
    +
    +		// copy original event properties over to the new event
    +		orig = event.originalEvent;
    +		if ( orig ) {
    +			for ( prop in orig ) {
    +				if ( !( prop in event ) ) {
    +					event[ prop ] = orig[ prop ];
    +				}
    +			}
    +		}
    +
    +		this.element.trigger( event, data );
    +		return !( $.isFunction( callback ) &&
    +			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
    +			event.isDefaultPrevented() );
    +	}
    +};
    +
    +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
    +	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
    +		if ( typeof options === "string" ) {
    +			options = { effect: options };
    +		}
    +		var hasOptions,
    +			effectName = !options ?
    +				method :
    +				options === true || typeof options === "number" ?
    +					defaultEffect :
    +					options.effect || defaultEffect;
    +		options = options || {};
    +		if ( typeof options === "number" ) {
    +			options = { duration: options };
    +		}
    +		hasOptions = !$.isEmptyObject( options );
    +		options.complete = callback;
    +		if ( options.delay ) {
    +			element.delay( options.delay );
    +		}
    +		if ( hasOptions && $.effects && ( $.effects.effect[ effectName ] || $.uiBackCompat !== false && $.effects[ effectName ] ) ) {
    +			element[ method ]( options );
    +		} else if ( effectName !== method && element[ effectName ] ) {
    +			element[ effectName ]( options.duration, options.easing, callback );
    +		} else {
    +			element.queue(function( next ) {
    +				$( this )[ method ]();
    +				if ( callback ) {
    +					callback.call( element[ 0 ] );
    +				}
    +				next();
    +			});
    +		}
    +	};
    +});
    +
    +// DEPRECATED
    +if ( $.uiBackCompat !== false ) {
    +	$.Widget.prototype._getCreateOptions = function() {
    +		return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
    +	};
    +}
    +
    +})( jQuery );
    +(function( $, undefined ) {
    +
    +var mouseHandled = false;
    +$( document ).mouseup( function( e ) {
    +	mouseHandled = false;
    +});
    +
    +$.widget("ui.mouse", {
    +	version: "1.9.2",
    +	options: {
    +		cancel: 'input,textarea,button,select,option',
    +		distance: 1,
    +		delay: 0
    +	},
    +	_mouseInit: function() {
    +		var that = this;
    +
    +		this.element
    +			.bind('mousedown.'+this.widgetName, function(event) {
    +				return that._mouseDown(event);
    +			})
    +			.bind('click.'+this.widgetName, function(event) {
    +				if (true === $.data(event.target, that.widgetName + '.preventClickEvent')) {
    +					$.removeData(event.target, that.widgetName + '.preventClickEvent');
    +					event.stopImmediatePropagation();
    +					return false;
    +				}
    +			});
    +
    +		this.started = false;
    +	},
    +
    +	// TODO: make sure destroying one instance of mouse doesn't mess with
    +	// other instances of mouse
    +	_mouseDestroy: function() {
    +		this.element.unbind('.'+this.widgetName);
    +		if ( this._mouseMoveDelegate ) {
    +			$(document)
    +				.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
    +				.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
    +		}
    +	},
    +
    +	_mouseDown: function(event) {
    +		// don't let more than one widget handle mouseStart
    +		if( mouseHandled ) { return; }
    +
    +		// we may have missed mouseup (out of window)
    +		(this._mouseStarted && this._mouseUp(event));
    +
    +		this._mouseDownEvent = event;
    +
    +		var that = this,
    +			btnIsLeft = (event.which === 1),
    +			// event.target.nodeName works around a bug in IE 8 with
    +			// disabled inputs (#7620)
    +			elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
    +		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
    +			return true;
    +		}
    +
    +		this.mouseDelayMet = !this.options.delay;
    +		if (!this.mouseDelayMet) {
    +			this._mouseDelayTimer = setTimeout(function() {
    +				that.mouseDelayMet = true;
    +			}, this.options.delay);
    +		}
    +
    +		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
    +			this._mouseStarted = (this._mouseStart(event) !== false);
    +			if (!this._mouseStarted) {
    +				event.preventDefault();
    +				return true;
    +			}
    +		}
    +
    +		// Click event may never have fired (Gecko & Opera)
    +		if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
    +			$.removeData(event.target, this.widgetName + '.preventClickEvent');
    +		}
    +
    +		// these delegates are required to keep context
    +		this._mouseMoveDelegate = function(event) {
    +			return that._mouseMove(event);
    +		};
    +		this._mouseUpDelegate = function(event) {
    +			return that._mouseUp(event);
    +		};
    +		$(document)
    +			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
    +			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
    +
    +		event.preventDefault();
    +
    +		mouseHandled = true;
    +		return true;
    +	},
    +
    +	_mouseMove: function(event) {
    +		// IE mouseup check - mouseup happened when mouse was out of window
    +		if ($.ui.ie && !(document.documentMode >= 9) && !event.button) {
    +			return this._mouseUp(event);
    +		}
    +
    +		if (this._mouseStarted) {
    +			this._mouseDrag(event);
    +			return event.preventDefault();
    +		}
    +
    +		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
    +			this._mouseStarted =
    +				(this._mouseStart(this._mouseDownEvent, event) !== false);
    +			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
    +		}
    +
    +		return !this._mouseStarted;
    +	},
    +
    +	_mouseUp: function(event) {
    +		$(document)
    +			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
    +			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
    +
    +		if (this._mouseStarted) {
    +			this._mouseStarted = false;
    +
    +			if (event.target === this._mouseDownEvent.target) {
    +				$.data(event.target, this.widgetName + '.preventClickEvent', true);
    +			}
    +
    +			this._mouseStop(event);
    +		}
    +
    +		return false;
    +	},
    +
    +	_mouseDistanceMet: function(event) {
    +		return (Math.max(
    +				Math.abs(this._mouseDownEvent.pageX - event.pageX),
    +				Math.abs(this._mouseDownEvent.pageY - event.pageY)
    +			) >= this.options.distance
    +		);
    +	},
    +
    +	_mouseDelayMet: function(event) {
    +		return this.mouseDelayMet;
    +	},
    +
    +	// These are placeholder methods, to be overriden by extending plugin
    +	_mouseStart: function(event) {},
    +	_mouseDrag: function(event) {},
    +	_mouseStop: function(event) {},
    +	_mouseCapture: function(event) { return true; }
    +});
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.ui = $.ui || {};
    +
    +var cachedScrollbarWidth,
    +	max = Math.max,
    +	abs = Math.abs,
    +	round = Math.round,
    +	rhorizontal = /left|center|right/,
    +	rvertical = /top|center|bottom/,
    +	roffset = /[\+\-]\d+%?/,
    +	rposition = /^\w+/,
    +	rpercent = /%$/,
    +	_position = $.fn.position;
    +
    +function getOffsets( offsets, width, height ) {
    +	return [
    +		parseInt( offsets[ 0 ], 10 ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
    +		parseInt( offsets[ 1 ], 10 ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
    +	];
    +}
    +function parseCss( element, property ) {
    +	return parseInt( $.css( element, property ), 10 ) || 0;
    +}
    +
    +$.position = {
    +	scrollbarWidth: function() {
    +		if ( cachedScrollbarWidth !== undefined ) {
    +			return cachedScrollbarWidth;
    +		}
    +		var w1, w2,
    +			div = $( "<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
    +			innerDiv = div.children()[0];
    +
    +		$( "body" ).append( div );
    +		w1 = innerDiv.offsetWidth;
    +		div.css( "overflow", "scroll" );
    +
    +		w2 = innerDiv.offsetWidth;
    +
    +		if ( w1 === w2 ) {
    +			w2 = div[0].clientWidth;
    +		}
    +
    +		div.remove();
    +
    +		return (cachedScrollbarWidth = w1 - w2);
    +	},
    +	getScrollInfo: function( within ) {
    +		var overflowX = within.isWindow ? "" : within.element.css( "overflow-x" ),
    +			overflowY = within.isWindow ? "" : within.element.css( "overflow-y" ),
    +			hasOverflowX = overflowX === "scroll" ||
    +				( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
    +			hasOverflowY = overflowY === "scroll" ||
    +				( overflowY === "auto" && within.height < within.element[0].scrollHeight );
    +		return {
    +			width: hasOverflowX ? $.position.scrollbarWidth() : 0,
    +			height: hasOverflowY ? $.position.scrollbarWidth() : 0
    +		};
    +	},
    +	getWithinInfo: function( element ) {
    +		var withinElement = $( element || window ),
    +			isWindow = $.isWindow( withinElement[0] );
    +		return {
    +			element: withinElement,
    +			isWindow: isWindow,
    +			offset: withinElement.offset() || { left: 0, top: 0 },
    +			scrollLeft: withinElement.scrollLeft(),
    +			scrollTop: withinElement.scrollTop(),
    +			width: isWindow ? withinElement.width() : withinElement.outerWidth(),
    +			height: isWindow ? withinElement.height() : withinElement.outerHeight()
    +		};
    +	}
    +};
    +
    +$.fn.position = function( options ) {
    +	if ( !options || !options.of ) {
    +		return _position.apply( this, arguments );
    +	}
    +
    +	// make a copy, we don't want to modify arguments
    +	options = $.extend( {}, options );
    +
    +	var atOffset, targetWidth, targetHeight, targetOffset, basePosition,
    +		target = $( options.of ),
    +		within = $.position.getWithinInfo( options.within ),
    +		scrollInfo = $.position.getScrollInfo( within ),
    +		targetElem = target[0],
    +		collision = ( options.collision || "flip" ).split( " " ),
    +		offsets = {};
    +
    +	if ( targetElem.nodeType === 9 ) {
    +		targetWidth = target.width();
    +		targetHeight = target.height();
    +		targetOffset = { top: 0, left: 0 };
    +	} else if ( $.isWindow( targetElem ) ) {
    +		targetWidth = target.width();
    +		targetHeight = target.height();
    +		targetOffset = { top: target.scrollTop(), left: target.scrollLeft() };
    +	} else if ( targetElem.preventDefault ) {
    +		// force left top to allow flipping
    +		options.at = "left top";
    +		targetWidth = targetHeight = 0;
    +		targetOffset = { top: targetElem.pageY, left: targetElem.pageX };
    +	} else {
    +		targetWidth = target.outerWidth();
    +		targetHeight = target.outerHeight();
    +		targetOffset = target.offset();
    +	}
    +	// clone to reuse original targetOffset later
    +	basePosition = $.extend( {}, targetOffset );
    +
    +	// force my and at to have valid horizontal and vertical positions
    +	// if a value is missing or invalid, it will be converted to center
    +	$.each( [ "my", "at" ], function() {
    +		var pos = ( options[ this ] || "" ).split( " " ),
    +			horizontalOffset,
    +			verticalOffset;
    +
    +		if ( pos.length === 1) {
    +			pos = rhorizontal.test( pos[ 0 ] ) ?
    +				pos.concat( [ "center" ] ) :
    +				rvertical.test( pos[ 0 ] ) ?
    +					[ "center" ].concat( pos ) :
    +					[ "center", "center" ];
    +		}
    +		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
    +		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
    +
    +		// calculate offsets
    +		horizontalOffset = roffset.exec( pos[ 0 ] );
    +		verticalOffset = roffset.exec( pos[ 1 ] );
    +		offsets[ this ] = [
    +			horizontalOffset ? horizontalOffset[ 0 ] : 0,
    +			verticalOffset ? verticalOffset[ 0 ] : 0
    +		];
    +
    +		// reduce to just the positions without the offsets
    +		options[ this ] = [
    +			rposition.exec( pos[ 0 ] )[ 0 ],
    +			rposition.exec( pos[ 1 ] )[ 0 ]
    +		];
    +	});
    +
    +	// normalize collision option
    +	if ( collision.length === 1 ) {
    +		collision[ 1 ] = collision[ 0 ];
    +	}
    +
    +	if ( options.at[ 0 ] === "right" ) {
    +		basePosition.left += targetWidth;
    +	} else if ( options.at[ 0 ] === "center" ) {
    +		basePosition.left += targetWidth / 2;
    +	}
    +
    +	if ( options.at[ 1 ] === "bottom" ) {
    +		basePosition.top += targetHeight;
    +	} else if ( options.at[ 1 ] === "center" ) {
    +		basePosition.top += targetHeight / 2;
    +	}
    +
    +	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
    +	basePosition.left += atOffset[ 0 ];
    +	basePosition.top += atOffset[ 1 ];
    +
    +	return this.each(function() {
    +		var collisionPosition, using,
    +			elem = $( this ),
    +			elemWidth = elem.outerWidth(),
    +			elemHeight = elem.outerHeight(),
    +			marginLeft = parseCss( this, "marginLeft" ),
    +			marginTop = parseCss( this, "marginTop" ),
    +			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
    +			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
    +			position = $.extend( {}, basePosition ),
    +			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
    +
    +		if ( options.my[ 0 ] === "right" ) {
    +			position.left -= elemWidth;
    +		} else if ( options.my[ 0 ] === "center" ) {
    +			position.left -= elemWidth / 2;
    +		}
    +
    +		if ( options.my[ 1 ] === "bottom" ) {
    +			position.top -= elemHeight;
    +		} else if ( options.my[ 1 ] === "center" ) {
    +			position.top -= elemHeight / 2;
    +		}
    +
    +		position.left += myOffset[ 0 ];
    +		position.top += myOffset[ 1 ];
    +
    +		// if the browser doesn't support fractions, then round for consistent results
    +		if ( !$.support.offsetFractions ) {
    +			position.left = round( position.left );
    +			position.top = round( position.top );
    +		}
    +
    +		collisionPosition = {
    +			marginLeft: marginLeft,
    +			marginTop: marginTop
    +		};
    +
    +		$.each( [ "left", "top" ], function( i, dir ) {
    +			if ( $.ui.position[ collision[ i ] ] ) {
    +				$.ui.position[ collision[ i ] ][ dir ]( position, {
    +					targetWidth: targetWidth,
    +					targetHeight: targetHeight,
    +					elemWidth: elemWidth,
    +					elemHeight: elemHeight,
    +					collisionPosition: collisionPosition,
    +					collisionWidth: collisionWidth,
    +					collisionHeight: collisionHeight,
    +					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
    +					my: options.my,
    +					at: options.at,
    +					within: within,
    +					elem : elem
    +				});
    +			}
    +		});
    +
    +		if ( $.fn.bgiframe ) {
    +			elem.bgiframe();
    +		}
    +
    +		if ( options.using ) {
    +			// adds feedback as second argument to using callback, if present
    +			using = function( props ) {
    +				var left = targetOffset.left - position.left,
    +					right = left + targetWidth - elemWidth,
    +					top = targetOffset.top - position.top,
    +					bottom = top + targetHeight - elemHeight,
    +					feedback = {
    +						target: {
    +							element: target,
    +							left: targetOffset.left,
    +							top: targetOffset.top,
    +							width: targetWidth,
    +							height: targetHeight
    +						},
    +						element: {
    +							element: elem,
    +							left: position.left,
    +							top: position.top,
    +							width: elemWidth,
    +							height: elemHeight
    +						},
    +						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
    +						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
    +					};
    +				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
    +					feedback.horizontal = "center";
    +				}
    +				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
    +					feedback.vertical = "middle";
    +				}
    +				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
    +					feedback.important = "horizontal";
    +				} else {
    +					feedback.important = "vertical";
    +				}
    +				options.using.call( this, props, feedback );
    +			};
    +		}
    +
    +		elem.offset( $.extend( position, { using: using } ) );
    +	});
    +};
    +
    +$.ui.position = {
    +	fit: {
    +		left: function( position, data ) {
    +			var within = data.within,
    +				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
    +				outerWidth = within.width,
    +				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
    +				overLeft = withinOffset - collisionPosLeft,
    +				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
    +				newOverRight;
    +
    +			// element is wider than within
    +			if ( data.collisionWidth > outerWidth ) {
    +				// element is initially over the left side of within
    +				if ( overLeft > 0 && overRight <= 0 ) {
    +					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
    +					position.left += overLeft - newOverRight;
    +				// element is initially over right side of within
    +				} else if ( overRight > 0 && overLeft <= 0 ) {
    +					position.left = withinOffset;
    +				// element is initially over both left and right sides of within
    +				} else {
    +					if ( overLeft > overRight ) {
    +						position.left = withinOffset + outerWidth - data.collisionWidth;
    +					} else {
    +						position.left = withinOffset;
    +					}
    +				}
    +			// too far left -> align with left edge
    +			} else if ( overLeft > 0 ) {
    +				position.left += overLeft;
    +			// too far right -> align with right edge
    +			} else if ( overRight > 0 ) {
    +				position.left -= overRight;
    +			// adjust based on position and margin
    +			} else {
    +				position.left = max( position.left - collisionPosLeft, position.left );
    +			}
    +		},
    +		top: function( position, data ) {
    +			var within = data.within,
    +				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
    +				outerHeight = data.within.height,
    +				collisionPosTop = position.top - data.collisionPosition.marginTop,
    +				overTop = withinOffset - collisionPosTop,
    +				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
    +				newOverBottom;
    +
    +			// element is taller than within
    +			if ( data.collisionHeight > outerHeight ) {
    +				// element is initially over the top of within
    +				if ( overTop > 0 && overBottom <= 0 ) {
    +					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
    +					position.top += overTop - newOverBottom;
    +				// element is initially over bottom of within
    +				} else if ( overBottom > 0 && overTop <= 0 ) {
    +					position.top = withinOffset;
    +				// element is initially over both top and bottom of within
    +				} else {
    +					if ( overTop > overBottom ) {
    +						position.top = withinOffset + outerHeight - data.collisionHeight;
    +					} else {
    +						position.top = withinOffset;
    +					}
    +				}
    +			// too far up -> align with top
    +			} else if ( overTop > 0 ) {
    +				position.top += overTop;
    +			// too far down -> align with bottom edge
    +			} else if ( overBottom > 0 ) {
    +				position.top -= overBottom;
    +			// adjust based on position and margin
    +			} else {
    +				position.top = max( position.top - collisionPosTop, position.top );
    +			}
    +		}
    +	},
    +	flip: {
    +		left: function( position, data ) {
    +			var within = data.within,
    +				withinOffset = within.offset.left + within.scrollLeft,
    +				outerWidth = within.width,
    +				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
    +				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
    +				overLeft = collisionPosLeft - offsetLeft,
    +				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
    +				myOffset = data.my[ 0 ] === "left" ?
    +					-data.elemWidth :
    +					data.my[ 0 ] === "right" ?
    +						data.elemWidth :
    +						0,
    +				atOffset = data.at[ 0 ] === "left" ?
    +					data.targetWidth :
    +					data.at[ 0 ] === "right" ?
    +						-data.targetWidth :
    +						0,
    +				offset = -2 * data.offset[ 0 ],
    +				newOverRight,
    +				newOverLeft;
    +
    +			if ( overLeft < 0 ) {
    +				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
    +				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
    +					position.left += myOffset + atOffset + offset;
    +				}
    +			}
    +			else if ( overRight > 0 ) {
    +				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
    +				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
    +					position.left += myOffset + atOffset + offset;
    +				}
    +			}
    +		},
    +		top: function( position, data ) {
    +			var within = data.within,
    +				withinOffset = within.offset.top + within.scrollTop,
    +				outerHeight = within.height,
    +				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
    +				collisionPosTop = position.top - data.collisionPosition.marginTop,
    +				overTop = collisionPosTop - offsetTop,
    +				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
    +				top = data.my[ 1 ] === "top",
    +				myOffset = top ?
    +					-data.elemHeight :
    +					data.my[ 1 ] === "bottom" ?
    +						data.elemHeight :
    +						0,
    +				atOffset = data.at[ 1 ] === "top" ?
    +					data.targetHeight :
    +					data.at[ 1 ] === "bottom" ?
    +						-data.targetHeight :
    +						0,
    +				offset = -2 * data.offset[ 1 ],
    +				newOverTop,
    +				newOverBottom;
    +			if ( overTop < 0 ) {
    +				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
    +				if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
    +					position.top += myOffset + atOffset + offset;
    +				}
    +			}
    +			else if ( overBottom > 0 ) {
    +				newOverTop = position.top -  data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
    +				if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
    +					position.top += myOffset + atOffset + offset;
    +				}
    +			}
    +		}
    +	},
    +	flipfit: {
    +		left: function() {
    +			$.ui.position.flip.left.apply( this, arguments );
    +			$.ui.position.fit.left.apply( this, arguments );
    +		},
    +		top: function() {
    +			$.ui.position.flip.top.apply( this, arguments );
    +			$.ui.position.fit.top.apply( this, arguments );
    +		}
    +	}
    +};
    +
    +// fraction support test
    +(function () {
    +	var testElement, testElementParent, testElementStyle, offsetLeft, i,
    +		body = document.getElementsByTagName( "body" )[ 0 ],
    +		div = document.createElement( "div" );
    +
    +	//Create a "fake body" for testing based on method used in jQuery.support
    +	testElement = document.createElement( body ? "div" : "body" );
    +	testElementStyle = {
    +		visibility: "hidden",
    +		width: 0,
    +		height: 0,
    +		border: 0,
    +		margin: 0,
    +		background: "none"
    +	};
    +	if ( body ) {
    +		$.extend( testElementStyle, {
    +			position: "absolute",
    +			left: "-1000px",
    +			top: "-1000px"
    +		});
    +	}
    +	for ( i in testElementStyle ) {
    +		testElement.style[ i ] = testElementStyle[ i ];
    +	}
    +	testElement.appendChild( div );
    +	testElementParent = body || document.documentElement;
    +	testElementParent.insertBefore( testElement, testElementParent.firstChild );
    +
    +	div.style.cssText = "position: absolute; left: 10.7432222px;";
    +
    +	offsetLeft = $( div ).offset().left;
    +	$.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
    +
    +	testElement.innerHTML = "";
    +	testElementParent.removeChild( testElement );
    +})();
    +
    +// DEPRECATED
    +if ( $.uiBackCompat !== false ) {
    +	// offset option
    +	(function( $ ) {
    +		var _position = $.fn.position;
    +		$.fn.position = function( options ) {
    +			if ( !options || !options.offset ) {
    +				return _position.call( this, options );
    +			}
    +			var offset = options.offset.split( " " ),
    +				at = options.at.split( " " );
    +			if ( offset.length === 1 ) {
    +				offset[ 1 ] = offset[ 0 ];
    +			}
    +			if ( /^\d/.test( offset[ 0 ] ) ) {
    +				offset[ 0 ] = "+" + offset[ 0 ];
    +			}
    +			if ( /^\d/.test( offset[ 1 ] ) ) {
    +				offset[ 1 ] = "+" + offset[ 1 ];
    +			}
    +			if ( at.length === 1 ) {
    +				if ( /left|center|right/.test( at[ 0 ] ) ) {
    +					at[ 1 ] = "center";
    +				} else {
    +					at[ 1 ] = at[ 0 ];
    +					at[ 0 ] = "center";
    +				}
    +			}
    +			return _position.call( this, $.extend( options, {
    +				at: at[ 0 ] + offset[ 0 ] + " " + at[ 1 ] + offset[ 1 ],
    +				offset: undefined
    +			} ) );
    +		};
    +	}( jQuery ) );
    +}
    +
    +}( jQuery ) );
    +(function( $, undefined ) {
    +
    +$.widget("ui.draggable", $.ui.mouse, {
    +	version: "1.9.2",
    +	widgetEventPrefix: "drag",
    +	options: {
    +		addClasses: true,
    +		appendTo: "parent",
    +		axis: false,
    +		connectToSortable: false,
    +		containment: false,
    +		cursor: "auto",
    +		cursorAt: false,
    +		grid: false,
    +		handle: false,
    +		helper: "original",
    +		iframeFix: false,
    +		opacity: false,
    +		refreshPositions: false,
    +		revert: false,
    +		revertDuration: 500,
    +		scope: "default",
    +		scroll: true,
    +		scrollSensitivity: 20,
    +		scrollSpeed: 20,
    +		snap: false,
    +		snapMode: "both",
    +		snapTolerance: 20,
    +		stack: false,
    +		zIndex: false
    +	},
    +	_create: function() {
    +
    +		if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
    +			this.element[0].style.position = 'relative';
    +
    +		(this.options.addClasses && this.element.addClass("ui-draggable"));
    +		(this.options.disabled && this.element.addClass("ui-draggable-disabled"));
    +
    +		this._mouseInit();
    +
    +	},
    +
    +	_destroy: function() {
    +		this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
    +		this._mouseDestroy();
    +	},
    +
    +	_mouseCapture: function(event) {
    +
    +		var o = this.options;
    +
    +		// among others, prevent a drag on a resizable-handle
    +		if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
    +			return false;
    +
    +		//Quit if we're not on a valid handle
    +		this.handle = this._getHandle(event);
    +		if (!this.handle)
    +			return false;
    +
    +		$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
    +			$('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
    +			.css({
    +				width: this.offsetWidth+"px", height: this.offsetHeight+"px",
    +				position: "absolute", opacity: "0.001", zIndex: 1000
    +			})
    +			.css($(this).offset())
    +			.appendTo("body");
    +		});
    +
    +		return true;
    +
    +	},
    +
    +	_mouseStart: function(event) {
    +
    +		var o = this.options;
    +
    +		//Create and append the visible helper
    +		this.helper = this._createHelper(event);
    +
    +		this.helper.addClass("ui-draggable-dragging");
    +
    +		//Cache the helper size
    +		this._cacheHelperProportions();
    +
    +		//If ddmanager is used for droppables, set the global draggable
    +		if($.ui.ddmanager)
    +			$.ui.ddmanager.current = this;
    +
    +		/*
    +		 * - Position generation -
    +		 * This block generates everything position related - it's the core of draggables.
    +		 */
    +
    +		//Cache the margins of the original element
    +		this._cacheMargins();
    +
    +		//Store the helper's css position
    +		this.cssPosition = this.helper.css("position");
    +		this.scrollParent = this.helper.scrollParent();
    +
    +		//The element's absolute position on the page minus margins
    +		this.offset = this.positionAbs = this.element.offset();
    +		this.offset = {
    +			top: this.offset.top - this.margins.top,
    +			left: this.offset.left - this.margins.left
    +		};
    +
    +		$.extend(this.offset, {
    +			click: { //Where the click happened, relative to the element
    +				left: event.pageX - this.offset.left,
    +				top: event.pageY - this.offset.top
    +			},
    +			parent: this._getParentOffset(),
    +			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
    +		});
    +
    +		//Generate the original position
    +		this.originalPosition = this.position = this._generatePosition(event);
    +		this.originalPageX = event.pageX;
    +		this.originalPageY = event.pageY;
    +
    +		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
    +		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
    +
    +		//Set a containment if given in the options
    +		if(o.containment)
    +			this._setContainment();
    +
    +		//Trigger event + callbacks
    +		if(this._trigger("start", event) === false) {
    +			this._clear();
    +			return false;
    +		}
    +
    +		//Recache the helper size
    +		this._cacheHelperProportions();
    +
    +		//Prepare the droppable offsets
    +		if ($.ui.ddmanager && !o.dropBehaviour)
    +			$.ui.ddmanager.prepareOffsets(this, event);
    +
    +
    +		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
    +
    +		//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
    +		if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
    +
    +		return true;
    +	},
    +
    +	_mouseDrag: function(event, noPropagation) {
    +
    +		//Compute the helpers position
    +		this.position = this._generatePosition(event);
    +		this.positionAbs = this._convertPositionTo("absolute");
    +
    +		//Call plugins and callbacks and use the resulting position if something is returned
    +		if (!noPropagation) {
    +			var ui = this._uiHash();
    +			if(this._trigger('drag', event, ui) === false) {
    +				this._mouseUp({});
    +				return false;
    +			}
    +			this.position = ui.position;
    +		}
    +
    +		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
    +		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
    +		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
    +
    +		return false;
    +	},
    +
    +	_mouseStop: function(event) {
    +
    +		//If we are using droppables, inform the manager about the drop
    +		var dropped = false;
    +		if ($.ui.ddmanager && !this.options.dropBehaviour)
    +			dropped = $.ui.ddmanager.drop(this, event);
    +
    +		//if a drop comes from outside (a sortable)
    +		if(this.dropped) {
    +			dropped = this.dropped;
    +			this.dropped = false;
    +		}
    +
    +		//if the original element is no longer in the DOM don't bother to continue (see #8269)
    +		var element = this.element[0], elementInDom = false;
    +		while ( element && (element = element.parentNode) ) {
    +			if (element == document ) {
    +				elementInDom = true;
    +			}
    +		}
    +		if ( !elementInDom && this.options.helper === "original" )
    +			return false;
    +
    +		if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
    +			var that = this;
    +			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
    +				if(that._trigger("stop", event) !== false) {
    +					that._clear();
    +				}
    +			});
    +		} else {
    +			if(this._trigger("stop", event) !== false) {
    +				this._clear();
    +			}
    +		}
    +
    +		return false;
    +	},
    +
    +	_mouseUp: function(event) {
    +		//Remove frame helpers
    +		$("div.ui-draggable-iframeFix").each(function() {
    +			this.parentNode.removeChild(this);
    +		});
    +
    +		//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
    +		if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
    +
    +		return $.ui.mouse.prototype._mouseUp.call(this, event);
    +	},
    +
    +	cancel: function() {
    +
    +		if(this.helper.is(".ui-draggable-dragging")) {
    +			this._mouseUp({});
    +		} else {
    +			this._clear();
    +		}
    +
    +		return this;
    +
    +	},
    +
    +	_getHandle: function(event) {
    +
    +		var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
    +		$(this.options.handle, this.element)
    +			.find("*")
    +			.andSelf()
    +			.each(function() {
    +				if(this == event.target) handle = true;
    +			});
    +
    +		return handle;
    +
    +	},
    +
    +	_createHelper: function(event) {
    +
    +		var o = this.options;
    +		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);
    +
    +		if(!helper.parents('body').length)
    +			helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
    +
    +		if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
    +			helper.css("position", "absolute");
    +
    +		return helper;
    +
    +	},
    +
    +	_adjustOffsetFromHelper: function(obj) {
    +		if (typeof obj == 'string') {
    +			obj = obj.split(' ');
    +		}
    +		if ($.isArray(obj)) {
    +			obj = {left: +obj[0], top: +obj[1] || 0};
    +		}
    +		if ('left' in obj) {
    +			this.offset.click.left = obj.left + this.margins.left;
    +		}
    +		if ('right' in obj) {
    +			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
    +		}
    +		if ('top' in obj) {
    +			this.offset.click.top = obj.top + this.margins.top;
    +		}
    +		if ('bottom' in obj) {
    +			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
    +		}
    +	},
    +
    +	_getParentOffset: function() {
    +
    +		//Get the offsetParent and cache its position
    +		this.offsetParent = this.helper.offsetParent();
    +		var po = this.offsetParent.offset();
    +
    +		// This is a special case where we need to modify a offset calculated on start, since the following happened:
    +		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
    +		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
    +		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
    +		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
    +			po.left += this.scrollParent.scrollLeft();
    +			po.top += this.scrollParent.scrollTop();
    +		}
    +
    +		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
    +		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
    +			po = { top: 0, left: 0 };
    +
    +		return {
    +			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
    +			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
    +		};
    +
    +	},
    +
    +	_getRelativeOffset: function() {
    +
    +		if(this.cssPosition == "relative") {
    +			var p = this.element.position();
    +			return {
    +				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
    +				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
    +			};
    +		} else {
    +			return { top: 0, left: 0 };
    +		}
    +
    +	},
    +
    +	_cacheMargins: function() {
    +		this.margins = {
    +			left: (parseInt(this.element.css("marginLeft"),10) || 0),
    +			top: (parseInt(this.element.css("marginTop"),10) || 0),
    +			right: (parseInt(this.element.css("marginRight"),10) || 0),
    +			bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
    +		};
    +	},
    +
    +	_cacheHelperProportions: function() {
    +		this.helperProportions = {
    +			width: this.helper.outerWidth(),
    +			height: this.helper.outerHeight()
    +		};
    +	},
    +
    +	_setContainment: function() {
    +
    +		var o = this.options;
    +		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
    +		if(o.containment == 'document' || o.containment == 'window') this.containment = [
    +			o.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
    +			o.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
    +			(o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
    +			(o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
    +		];
    +
    +		if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
    +			var c = $(o.containment);
    +			var ce = c[0]; if(!ce) return;
    +			var co = c.offset();
    +			var over = ($(ce).css("overflow") != 'hidden');
    +
    +			this.containment = [
    +				(parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
    +				(parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
    +				(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
    +				(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top  - this.margins.bottom
    +			];
    +			this.relative_container = c;
    +
    +		} else if(o.containment.constructor == Array) {
    +			this.containment = o.containment;
    +		}
    +
    +	},
    +
    +	_convertPositionTo: function(d, pos) {
    +
    +		if(!pos) pos = this.position;
    +		var mod = d == "absolute" ? 1 : -1;
    +		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
    +
    +		return {
    +			top: (
    +				pos.top																	// The absolute mouse position
    +				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
    +				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
    +				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
    +			),
    +			left: (
    +				pos.left																// The absolute mouse position
    +				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
    +				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
    +				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
    +			)
    +		};
    +
    +	},
    +
    +	_generatePosition: function(event) {
    +
    +		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
    +		var pageX = event.pageX;
    +		var pageY = event.pageY;
    +
    +		/*
    +		 * - Position constraining -
    +		 * Constrain the position to a mix of grid, containment.
    +		 */
    +
    +		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
    +			var containment;
    +			if(this.containment) {
    +			if (this.relative_container){
    +				var co = this.relative_container.offset();
    +				containment = [ this.containment[0] + co.left,
    +					this.containment[1] + co.top,
    +					this.containment[2] + co.left,
    +					this.containment[3] + co.top ];
    +			}
    +			else {
    +				containment = this.containment;
    +			}
    +
    +				if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
    +				if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
    +				if(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;
    +				if(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;
    +			}
    +
    +			if(o.grid) {
    +				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
    +				var top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
    +				pageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
    +
    +				var left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
    +				pageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
    +			}
    +
    +		}
    +
    +		return {
    +			top: (
    +				pageY																// The absolute mouse position
    +				- this.offset.click.top													// Click offset (relative to the element)
    +				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
    +				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
    +				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
    +			),
    +			left: (
    +				pageX																// The absolute mouse position
    +				- this.offset.click.left												// Click offset (relative to the element)
    +				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
    +				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
    +				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
    +			)
    +		};
    +
    +	},
    +
    +	_clear: function() {
    +		this.helper.removeClass("ui-draggable-dragging");
    +		if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
    +		//if($.ui.ddmanager) $.ui.ddmanager.current = null;
    +		this.helper = null;
    +		this.cancelHelperRemoval = false;
    +	},
    +
    +	// From now on bulk stuff - mainly helpers
    +
    +	_trigger: function(type, event, ui) {
    +		ui = ui || this._uiHash();
    +		$.ui.plugin.call(this, type, [event, ui]);
    +		if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
    +		return $.Widget.prototype._trigger.call(this, type, event, ui);
    +	},
    +
    +	plugins: {},
    +
    +	_uiHash: function(event) {
    +		return {
    +			helper: this.helper,
    +			position: this.position,
    +			originalPosition: this.originalPosition,
    +			offset: this.positionAbs
    +		};
    +	}
    +
    +});
    +
    +$.ui.plugin.add("draggable", "connectToSortable", {
    +	start: function(event, ui) {
    +
    +		var inst = $(this).data("draggable"), o = inst.options,
    +			uiSortable = $.extend({}, ui, { item: inst.element });
    +		inst.sortables = [];
    +		$(o.connectToSortable).each(function() {
    +			var sortable = $.data(this, 'sortable');
    +			if (sortable && !sortable.options.disabled) {
    +				inst.sortables.push({
    +					instance: sortable,
    +					shouldRevert: sortable.options.revert
    +				});
    +				sortable.refreshPositions();	// Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
    +				sortable._trigger("activate", event, uiSortable);
    +			}
    +		});
    +
    +	},
    +	stop: function(event, ui) {
    +
    +		//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
    +		var inst = $(this).data("draggable"),
    +			uiSortable = $.extend({}, ui, { item: inst.element });
    +
    +		$.each(inst.sortables, function() {
    +			if(this.instance.isOver) {
    +
    +				this.instance.isOver = 0;
    +
    +				inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
    +				this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
    +
    +				//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
    +				if(this.shouldRevert) this.instance.options.revert = true;
    +
    +				//Trigger the stop of the sortable
    +				this.instance._mouseStop(event);
    +
    +				this.instance.options.helper = this.instance.options._helper;
    +
    +				//If the helper has been the original item, restore properties in the sortable
    +				if(inst.options.helper == 'original')
    +					this.instance.currentItem.css({ top: 'auto', left: 'auto' });
    +
    +			} else {
    +				this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
    +				this.instance._trigger("deactivate", event, uiSortable);
    +			}
    +
    +		});
    +
    +	},
    +	drag: function(event, ui) {
    +
    +		var inst = $(this).data("draggable"), that = this;
    +
    +		var checkPos = function(o) {
    +			var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
    +			var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
    +			var itemHeight = o.height, itemWidth = o.width;
    +			var itemTop = o.top, itemLeft = o.left;
    +
    +			return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
    +		};
    +
    +		$.each(inst.sortables, function(i) {
    +
    +			var innermostIntersecting = false;
    +			var thisSortable = this;
    +			//Copy over some variables to allow calling the sortable's native _intersectsWith
    +			this.instance.positionAbs = inst.positionAbs;
    +			this.instance.helperProportions = inst.helperProportions;
    +			this.instance.offset.click = inst.offset.click;
    +
    +			if(this.instance._intersectsWith(this.instance.containerCache)) {
    +				innermostIntersecting = true;
    +				$.each(inst.sortables, function () {
    +					this.instance.positionAbs = inst.positionAbs;
    +					this.instance.helperProportions = inst.helperProportions;
    +					this.instance.offset.click = inst.offset.click;
    +					if  (this != thisSortable
    +						&& this.instance._intersectsWith(this.instance.containerCache)
    +						&& $.ui.contains(thisSortable.instance.element[0], this.instance.element[0]))
    +						innermostIntersecting = false;
    +						return innermostIntersecting;
    +				});
    +			}
    +
    +
    +			if(innermostIntersecting) {
    +				//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
    +				if(!this.instance.isOver) {
    +
    +					this.instance.isOver = 1;
    +					//Now we fake the start of dragging for the sortable instance,
    +					//by cloning the list group item, appending it to the sortable and using it as inst.currentItem
    +					//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
    +					this.instance.currentItem = $(that).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
    +					this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
    +					this.instance.options.helper = function() { return ui.helper[0]; };
    +
    +					event.target = this.instance.currentItem[0];
    +					this.instance._mouseCapture(event, true);
    +					this.instance._mouseStart(event, true, true);
    +
    +					//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
    +					this.instance.offset.click.top = inst.offset.click.top;
    +					this.instance.offset.click.left = inst.offset.click.left;
    +					this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
    +					this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
    +
    +					inst._trigger("toSortable", event);
    +					inst.dropped = this.instance.element; //draggable revert needs that
    +					//hack so receive/update callbacks work (mostly)
    +					inst.currentItem = inst.element;
    +					this.instance.fromOutside = inst;
    +
    +				}
    +
    +				//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
    +				if(this.instance.currentItem) this.instance._mouseDrag(event);
    +
    +			} else {
    +
    +				//If it doesn't intersect with the sortable, and it intersected before,
    +				//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
    +				if(this.instance.isOver) {
    +
    +					this.instance.isOver = 0;
    +					this.instance.cancelHelperRemoval = true;
    +
    +					//Prevent reverting on this forced stop
    +					this.instance.options.revert = false;
    +
    +					// The out event needs to be triggered independently
    +					this.instance._trigger('out', event, this.instance._uiHash(this.instance));
    +
    +					this.instance._mouseStop(event, true);
    +					this.instance.options.helper = this.instance.options._helper;
    +
    +					//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
    +					this.instance.currentItem.remove();
    +					if(this.instance.placeholder) this.instance.placeholder.remove();
    +
    +					inst._trigger("fromSortable", event);
    +					inst.dropped = false; //draggable revert needs that
    +				}
    +
    +			};
    +
    +		});
    +
    +	}
    +});
    +
    +$.ui.plugin.add("draggable", "cursor", {
    +	start: function(event, ui) {
    +		var t = $('body'), o = $(this).data('draggable').options;
    +		if (t.css("cursor")) o._cursor = t.css("cursor");
    +		t.css("cursor", o.cursor);
    +	},
    +	stop: function(event, ui) {
    +		var o = $(this).data('draggable').options;
    +		if (o._cursor) $('body').css("cursor", o._cursor);
    +	}
    +});
    +
    +$.ui.plugin.add("draggable", "opacity", {
    +	start: function(event, ui) {
    +		var t = $(ui.helper), o = $(this).data('draggable').options;
    +		if(t.css("opacity")) o._opacity = t.css("opacity");
    +		t.css('opacity', o.opacity);
    +	},
    +	stop: function(event, ui) {
    +		var o = $(this).data('draggable').options;
    +		if(o._opacity) $(ui.helper).css('opacity', o._opacity);
    +	}
    +});
    +
    +$.ui.plugin.add("draggable", "scroll", {
    +	start: function(event, ui) {
    +		var i = $(this).data("draggable");
    +		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
    +	},
    +	drag: function(event, ui) {
    +
    +		var i = $(this).data("draggable"), o = i.options, scrolled = false;
    +
    +		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
    +
    +			if(!o.axis || o.axis != 'x') {
    +				if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
    +					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
    +				else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
    +					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
    +			}
    +
    +			if(!o.axis || o.axis != 'y') {
    +				if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
    +					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
    +				else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
    +					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
    +			}
    +
    +		} else {
    +
    +			if(!o.axis || o.axis != 'x') {
    +				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
    +					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
    +				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
    +					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
    +			}
    +
    +			if(!o.axis || o.axis != 'y') {
    +				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
    +					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
    +				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
    +					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
    +			}
    +
    +		}
    +
    +		if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
    +			$.ui.ddmanager.prepareOffsets(i, event);
    +
    +	}
    +});
    +
    +$.ui.plugin.add("draggable", "snap", {
    +	start: function(event, ui) {
    +
    +		var i = $(this).data("draggable"), o = i.options;
    +		i.snapElements = [];
    +
    +		$(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
    +			var $t = $(this); var $o = $t.offset();
    +			if(this != i.element[0]) i.snapElements.push({
    +				item: this,
    +				width: $t.outerWidth(), height: $t.outerHeight(),
    +				top: $o.top, left: $o.left
    +			});
    +		});
    +
    +	},
    +	drag: function(event, ui) {
    +
    +		var inst = $(this).data("draggable"), o = inst.options;
    +		var d = o.snapTolerance;
    +
    +		var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
    +			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
    +
    +		for (var i = inst.snapElements.length - 1; i >= 0; i--){
    +
    +			var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
    +				t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
    +
    +			//Yes, I know, this is insane ;)
    +			if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
    +				if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
    +				inst.snapElements[i].snapping = false;
    +				continue;
    +			}
    +
    +			if(o.snapMode != 'inner') {
    +				var ts = Math.abs(t - y2) <= d;
    +				var bs = Math.abs(b - y1) <= d;
    +				var ls = Math.abs(l - x2) <= d;
    +				var rs = Math.abs(r - x1) <= d;
    +				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
    +				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
    +				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
    +				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
    +			}
    +
    +			var first = (ts || bs || ls || rs);
    +
    +			if(o.snapMode != 'outer') {
    +				var ts = Math.abs(t - y1) <= d;
    +				var bs = Math.abs(b - y2) <= d;
    +				var ls = Math.abs(l - x1) <= d;
    +				var rs = Math.abs(r - x2) <= d;
    +				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
    +				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
    +				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
    +				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
    +			}
    +
    +			if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
    +				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
    +			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
    +
    +		};
    +
    +	}
    +});
    +
    +$.ui.plugin.add("draggable", "stack", {
    +	start: function(event, ui) {
    +
    +		var o = $(this).data("draggable").options;
    +
    +		var group = $.makeArray($(o.stack)).sort(function(a,b) {
    +			return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
    +		});
    +		if (!group.length) { return; }
    +
    +		var min = parseInt(group[0].style.zIndex) || 0;
    +		$(group).each(function(i) {
    +			this.style.zIndex = min + i;
    +		});
    +
    +		this[0].style.zIndex = min + group.length;
    +
    +	}
    +});
    +
    +$.ui.plugin.add("draggable", "zIndex", {
    +	start: function(event, ui) {
    +		var t = $(ui.helper), o = $(this).data("draggable").options;
    +		if(t.css("zIndex")) o._zIndex = t.css("zIndex");
    +		t.css('zIndex', o.zIndex);
    +	},
    +	stop: function(event, ui) {
    +		var o = $(this).data("draggable").options;
    +		if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
    +	}
    +});
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.widget("ui.droppable", {
    +	version: "1.9.2",
    +	widgetEventPrefix: "drop",
    +	options: {
    +		accept: '*',
    +		activeClass: false,
    +		addClasses: true,
    +		greedy: false,
    +		hoverClass: false,
    +		scope: 'default',
    +		tolerance: 'intersect'
    +	},
    +	_create: function() {
    +
    +		var o = this.options, accept = o.accept;
    +		this.isover = 0; this.isout = 1;
    +
    +		this.accept = $.isFunction(accept) ? accept : function(d) {
    +			return d.is(accept);
    +		};
    +
    +		//Store the droppable's proportions
    +		this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
    +
    +		// Add the reference and positions to the manager
    +		$.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
    +		$.ui.ddmanager.droppables[o.scope].push(this);
    +
    +		(o.addClasses && this.element.addClass("ui-droppable"));
    +
    +	},
    +
    +	_destroy: function() {
    +		var drop = $.ui.ddmanager.droppables[this.options.scope];
    +		for ( var i = 0; i < drop.length; i++ )
    +			if ( drop[i] == this )
    +				drop.splice(i, 1);
    +
    +		this.element.removeClass("ui-droppable ui-droppable-disabled");
    +	},
    +
    +	_setOption: function(key, value) {
    +
    +		if(key == 'accept') {
    +			this.accept = $.isFunction(value) ? value : function(d) {
    +				return d.is(value);
    +			};
    +		}
    +		$.Widget.prototype._setOption.apply(this, arguments);
    +	},
    +
    +	_activate: function(event) {
    +		var draggable = $.ui.ddmanager.current;
    +		if(this.options.activeClass) this.element.addClass(this.options.activeClass);
    +		(draggable && this._trigger('activate', event, this.ui(draggable)));
    +	},
    +
    +	_deactivate: function(event) {
    +		var draggable = $.ui.ddmanager.current;
    +		if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
    +		(draggable && this._trigger('deactivate', event, this.ui(draggable)));
    +	},
    +
    +	_over: function(event) {
    +
    +		var draggable = $.ui.ddmanager.current;
    +		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
    +
    +		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
    +			if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
    +			this._trigger('over', event, this.ui(draggable));
    +		}
    +
    +	},
    +
    +	_out: function(event) {
    +
    +		var draggable = $.ui.ddmanager.current;
    +		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
    +
    +		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
    +			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
    +			this._trigger('out', event, this.ui(draggable));
    +		}
    +
    +	},
    +
    +	_drop: function(event,custom) {
    +
    +		var draggable = custom || $.ui.ddmanager.current;
    +		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
    +
    +		var childrenIntersection = false;
    +		this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
    +			var inst = $.data(this, 'droppable');
    +			if(
    +				inst.options.greedy
    +				&& !inst.options.disabled
    +				&& inst.options.scope == draggable.options.scope
    +				&& inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
    +				&& $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
    +			) { childrenIntersection = true; return false; }
    +		});
    +		if(childrenIntersection) return false;
    +
    +		if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
    +			if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
    +			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
    +			this._trigger('drop', event, this.ui(draggable));
    +			return this.element;
    +		}
    +
    +		return false;
    +
    +	},
    +
    +	ui: function(c) {
    +		return {
    +			draggable: (c.currentItem || c.element),
    +			helper: c.helper,
    +			position: c.position,
    +			offset: c.positionAbs
    +		};
    +	}
    +
    +});
    +
    +$.ui.intersect = function(draggable, droppable, toleranceMode) {
    +
    +	if (!droppable.offset) return false;
    +
    +	var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
    +		y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
    +	var l = droppable.offset.left, r = l + droppable.proportions.width,
    +		t = droppable.offset.top, b = t + droppable.proportions.height;
    +
    +	switch (toleranceMode) {
    +		case 'fit':
    +			return (l <= x1 && x2 <= r
    +				&& t <= y1 && y2 <= b);
    +			break;
    +		case 'intersect':
    +			return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
    +				&& x2 - (draggable.helperProportions.width / 2) < r // Left Half
    +				&& t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
    +				&& y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
    +			break;
    +		case 'pointer':
    +			var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
    +				draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
    +				isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
    +			return isOver;
    +			break;
    +		case 'touch':
    +			return (
    +					(y1 >= t && y1 <= b) ||	// Top edge touching
    +					(y2 >= t && y2 <= b) ||	// Bottom edge touching
    +					(y1 < t && y2 > b)		// Surrounded vertically
    +				) && (
    +					(x1 >= l && x1 <= r) ||	// Left edge touching
    +					(x2 >= l && x2 <= r) ||	// Right edge touching
    +					(x1 < l && x2 > r)		// Surrounded horizontally
    +				);
    +			break;
    +		default:
    +			return false;
    +			break;
    +		}
    +
    +};
    +
    +/*
    +	This manager tracks offsets of draggables and droppables
    +*/
    +$.ui.ddmanager = {
    +	current: null,
    +	droppables: { 'default': [] },
    +	prepareOffsets: function(t, event) {
    +
    +		var m = $.ui.ddmanager.droppables[t.options.scope] || [];
    +		var type = event ? event.type : null; // workaround for #2317
    +		var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
    +
    +		droppablesLoop: for (var i = 0; i < m.length; i++) {
    +
    +			if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue;	//No disabled and non-accepted
    +			for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
    +			m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; 									//If the element is not visible, continue
    +
    +			if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
    +
    +			m[i].offset = m[i].element.offset();
    +			m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
    +
    +		}
    +
    +	},
    +	drop: function(draggable, event) {
    +
    +		var dropped = false;
    +		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
    +
    +			if(!this.options) return;
    +			if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
    +				dropped = this._drop.call(this, event) || dropped;
    +
    +			if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
    +				this.isout = 1; this.isover = 0;
    +				this._deactivate.call(this, event);
    +			}
    +
    +		});
    +		return dropped;
    +
    +	},
    +	dragStart: function( draggable, event ) {
    +		//Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
    +		draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
    +			if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
    +		});
    +	},
    +	drag: function(draggable, event) {
    +
    +		//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
    +		if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
    +
    +		//Run through all droppables and check their positions based on specific tolerance options
    +		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
    +
    +			if(this.options.disabled || this.greedyChild || !this.visible) return;
    +			var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
    +
    +			var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
    +			if(!c) return;
    +
    +			var parentInstance;
    +			if (this.options.greedy) {
    +				// find droppable parents with same scope
    +				var scope = this.options.scope;
    +				var parent = this.element.parents(':data(droppable)').filter(function () {
    +					return $.data(this, 'droppable').options.scope === scope;
    +				});
    +
    +				if (parent.length) {
    +					parentInstance = $.data(parent[0], 'droppable');
    +					parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
    +				}
    +			}
    +
    +			// we just moved into a greedy child
    +			if (parentInstance && c == 'isover') {
    +				parentInstance['isover'] = 0;
    +				parentInstance['isout'] = 1;
    +				parentInstance._out.call(parentInstance, event);
    +			}
    +
    +			this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
    +			this[c == "isover" ? "_over" : "_out"].call(this, event);
    +
    +			// we just moved out of a greedy child
    +			if (parentInstance && c == 'isout') {
    +				parentInstance['isout'] = 0;
    +				parentInstance['isover'] = 1;
    +				parentInstance._over.call(parentInstance, event);
    +			}
    +		});
    +
    +	},
    +	dragStop: function( draggable, event ) {
    +		draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
    +		//Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
    +		if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
    +	}
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.widget("ui.resizable", $.ui.mouse, {
    +	version: "1.9.2",
    +	widgetEventPrefix: "resize",
    +	options: {
    +		alsoResize: false,
    +		animate: false,
    +		animateDuration: "slow",
    +		animateEasing: "swing",
    +		aspectRatio: false,
    +		autoHide: false,
    +		containment: false,
    +		ghost: false,
    +		grid: false,
    +		handles: "e,s,se",
    +		helper: false,
    +		maxHeight: null,
    +		maxWidth: null,
    +		minHeight: 10,
    +		minWidth: 10,
    +		zIndex: 1000
    +	},
    +	_create: function() {
    +
    +		var that = this, o = this.options;
    +		this.element.addClass("ui-resizable");
    +
    +		$.extend(this, {
    +			_aspectRatio: !!(o.aspectRatio),
    +			aspectRatio: o.aspectRatio,
    +			originalElement: this.element,
    +			_proportionallyResizeElements: [],
    +			_helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
    +		});
    +
    +		//Wrap the element if it cannot hold child nodes
    +		if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
    +
    +			//Create a wrapper element and set the wrapper to the new current internal element
    +			this.element.wrap(
    +				$('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
    +					position: this.element.css('position'),
    +					width: this.element.outerWidth(),
    +					height: this.element.outerHeight(),
    +					top: this.element.css('top'),
    +					left: this.element.css('left')
    +				})
    +			);
    +
    +			//Overwrite the original this.element
    +			this.element = this.element.parent().data(
    +				"resizable", this.element.data('resizable')
    +			);
    +
    +			this.elementIsWrapper = true;
    +
    +			//Move margins to the wrapper
    +			this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
    +			this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
    +
    +			//Prevent Safari textarea resize
    +			this.originalResizeStyle = this.originalElement.css('resize');
    +			this.originalElement.css('resize', 'none');
    +
    +			//Push the actual element to our proportionallyResize internal array
    +			this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
    +
    +			// avoid IE jump (hard set the margin)
    +			this.originalElement.css({ margin: this.originalElement.css('margin') });
    +
    +			// fix handlers offset
    +			this._proportionallyResize();
    +
    +		}
    +
    +		this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
    +		if(this.handles.constructor == String) {
    +
    +			if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
    +			var n = this.handles.split(","); this.handles = {};
    +
    +			for(var i = 0; i < n.length; i++) {
    +
    +				var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
    +				var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
    +
    +				// Apply zIndex to all handles - see #7960
    +				axis.css({ zIndex: o.zIndex });
    +
    +				//TODO : What's going on here?
    +				if ('se' == handle) {
    +					axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
    +				};
    +
    +				//Insert into internal handles object and append to element
    +				this.handles[handle] = '.ui-resizable-'+handle;
    +				this.element.append(axis);
    +			}
    +
    +		}
    +
    +		this._renderAxis = function(target) {
    +
    +			target = target || this.element;
    +
    +			for(var i in this.handles) {
    +
    +				if(this.handles[i].constructor == String)
    +					this.handles[i] = $(this.handles[i], this.element).show();
    +
    +				//Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
    +				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
    +
    +					var axis = $(this.handles[i], this.element), padWrapper = 0;
    +
    +					//Checking the correct pad and border
    +					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
    +
    +					//The padding type i have to apply...
    +					var padPos = [ 'padding',
    +						/ne|nw|n/.test(i) ? 'Top' :
    +						/se|sw|s/.test(i) ? 'Bottom' :
    +						/^e$/.test(i) ? 'Right' : 'Left' ].join("");
    +
    +					target.css(padPos, padWrapper);
    +
    +					this._proportionallyResize();
    +
    +				}
    +
    +				//TODO: What's that good for? There's not anything to be executed left
    +				if(!$(this.handles[i]).length)
    +					continue;
    +
    +			}
    +		};
    +
    +		//TODO: make renderAxis a prototype function
    +		this._renderAxis(this.element);
    +
    +		this._handles = $('.ui-resizable-handle', this.element)
    +			.disableSelection();
    +
    +		//Matching axis name
    +		this._handles.mouseover(function() {
    +			if (!that.resizing) {
    +				if (this.className)
    +					var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
    +				//Axis, default = se
    +				that.axis = axis && axis[1] ? axis[1] : 'se';
    +			}
    +		});
    +
    +		//If we want to auto hide the elements
    +		if (o.autoHide) {
    +			this._handles.hide();
    +			$(this.element)
    +				.addClass("ui-resizable-autohide")
    +				.mouseenter(function() {
    +					if (o.disabled) return;
    +					$(this).removeClass("ui-resizable-autohide");
    +					that._handles.show();
    +				})
    +				.mouseleave(function(){
    +					if (o.disabled) return;
    +					if (!that.resizing) {
    +						$(this).addClass("ui-resizable-autohide");
    +						that._handles.hide();
    +					}
    +				});
    +		}
    +
    +		//Initialize the mouse interaction
    +		this._mouseInit();
    +
    +	},
    +
    +	_destroy: function() {
    +
    +		this._mouseDestroy();
    +
    +		var _destroy = function(exp) {
    +			$(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
    +				.removeData("resizable").removeData("ui-resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
    +		};
    +
    +		//TODO: Unwrap at same DOM position
    +		if (this.elementIsWrapper) {
    +			_destroy(this.element);
    +			var wrapper = this.element;
    +			this.originalElement.css({
    +				position: wrapper.css('position'),
    +				width: wrapper.outerWidth(),
    +				height: wrapper.outerHeight(),
    +				top: wrapper.css('top'),
    +				left: wrapper.css('left')
    +			}).insertAfter( wrapper );
    +			wrapper.remove();
    +		}
    +
    +		this.originalElement.css('resize', this.originalResizeStyle);
    +		_destroy(this.originalElement);
    +
    +		return this;
    +	},
    +
    +	_mouseCapture: function(event) {
    +		var handle = false;
    +		for (var i in this.handles) {
    +			if ($(this.handles[i])[0] == event.target) {
    +				handle = true;
    +			}
    +		}
    +
    +		return !this.options.disabled && handle;
    +	},
    +
    +	_mouseStart: function(event) {
    +
    +		var o = this.options, iniPos = this.element.position(), el = this.element;
    +
    +		this.resizing = true;
    +		this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
    +
    +		// bugfix for http://dev.jquery.com/ticket/1749
    +		if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
    +			el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
    +		}
    +
    +		this._renderProxy();
    +
    +		var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
    +
    +		if (o.containment) {
    +			curleft += $(o.containment).scrollLeft() || 0;
    +			curtop += $(o.containment).scrollTop() || 0;
    +		}
    +
    +		//Store needed variables
    +		this.offset = this.helper.offset();
    +		this.position = { left: curleft, top: curtop };
    +		this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
    +		this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
    +		this.originalPosition = { left: curleft, top: curtop };
    +		this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
    +		this.originalMousePosition = { left: event.pageX, top: event.pageY };
    +
    +		//Aspect Ratio
    +		this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
    +
    +		var cursor = $('.ui-resizable-' + this.axis).css('cursor');
    +		$('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
    +
    +		el.addClass("ui-resizable-resizing");
    +		this._propagate("start", event);
    +		return true;
    +	},
    +
    +	_mouseDrag: function(event) {
    +
    +		//Increase performance, avoid regex
    +		var el = this.helper, o = this.options, props = {},
    +			that = this, smp = this.originalMousePosition, a = this.axis;
    +
    +		var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
    +		var trigger = this._change[a];
    +		if (!trigger) return false;
    +
    +		// Calculate the attrs that will be change
    +		var data = trigger.apply(this, [event, dx, dy]);
    +
    +		// Put this in the mouseDrag handler since the user can start pressing shift while resizing
    +		this._updateVirtualBoundaries(event.shiftKey);
    +		if (this._aspectRatio || event.shiftKey)
    +			data = this._updateRatio(data, event);
    +
    +		data = this._respectSize(data, event);
    +
    +		// plugins callbacks need to be called first
    +		this._propagate("resize", event);
    +
    +		el.css({
    +			top: this.position.top + "px", left: this.position.left + "px",
    +			width: this.size.width + "px", height: this.size.height + "px"
    +		});
    +
    +		if (!this._helper && this._proportionallyResizeElements.length)
    +			this._proportionallyResize();
    +
    +		this._updateCache(data);
    +
    +		// calling the user callback at the end
    +		this._trigger('resize', event, this.ui());
    +
    +		return false;
    +	},
    +
    +	_mouseStop: function(event) {
    +
    +		this.resizing = false;
    +		var o = this.options, that = this;
    +
    +		if(this._helper) {
    +			var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
    +				soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : that.sizeDiff.height,
    +				soffsetw = ista ? 0 : that.sizeDiff.width;
    +
    +			var s = { width: (that.helper.width()  - soffsetw), height: (that.helper.height() - soffseth) },
    +				left = (parseInt(that.element.css('left'), 10) + (that.position.left - that.originalPosition.left)) || null,
    +				top = (parseInt(that.element.css('top'), 10) + (that.position.top - that.originalPosition.top)) || null;
    +
    +			if (!o.animate)
    +				this.element.css($.extend(s, { top: top, left: left }));
    +
    +			that.helper.height(that.size.height);
    +			that.helper.width(that.size.width);
    +
    +			if (this._helper && !o.animate) this._proportionallyResize();
    +		}
    +
    +		$('body').css('cursor', 'auto');
    +
    +		this.element.removeClass("ui-resizable-resizing");
    +
    +		this._propagate("stop", event);
    +
    +		if (this._helper) this.helper.remove();
    +		return false;
    +
    +	},
    +
    +	_updateVirtualBoundaries: function(forceAspectRatio) {
    +		var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
    +
    +		b = {
    +			minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
    +			maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
    +			minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
    +			maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
    +		};
    +
    +		if(this._aspectRatio || forceAspectRatio) {
    +			// We want to create an enclosing box whose aspect ration is the requested one
    +			// First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
    +			pMinWidth = b.minHeight * this.aspectRatio;
    +			pMinHeight = b.minWidth / this.aspectRatio;
    +			pMaxWidth = b.maxHeight * this.aspectRatio;
    +			pMaxHeight = b.maxWidth / this.aspectRatio;
    +
    +			if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
    +			if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
    +			if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
    +			if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
    +		}
    +		this._vBoundaries = b;
    +	},
    +
    +	_updateCache: function(data) {
    +		var o = this.options;
    +		this.offset = this.helper.offset();
    +		if (isNumber(data.left)) this.position.left = data.left;
    +		if (isNumber(data.top)) this.position.top = data.top;
    +		if (isNumber(data.height)) this.size.height = data.height;
    +		if (isNumber(data.width)) this.size.width = data.width;
    +	},
    +
    +	_updateRatio: function(data, event) {
    +
    +		var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
    +
    +		if (isNumber(data.height)) data.width = (data.height * this.aspectRatio);
    +		else if (isNumber(data.width)) data.height = (data.width / this.aspectRatio);
    +
    +		if (a == 'sw') {
    +			data.left = cpos.left + (csize.width - data.width);
    +			data.top = null;
    +		}
    +		if (a == 'nw') {
    +			data.top = cpos.top + (csize.height - data.height);
    +			data.left = cpos.left + (csize.width - data.width);
    +		}
    +
    +		return data;
    +	},
    +
    +	_respectSize: function(data, event) {
    +
    +		var el = this.helper, o = this._vBoundaries, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
    +				ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
    +					isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
    +
    +		if (isminw) data.width = o.minWidth;
    +		if (isminh) data.height = o.minHeight;
    +		if (ismaxw) data.width = o.maxWidth;
    +		if (ismaxh) data.height = o.maxHeight;
    +
    +		var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
    +		var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
    +
    +		if (isminw && cw) data.left = dw - o.minWidth;
    +		if (ismaxw && cw) data.left = dw - o.maxWidth;
    +		if (isminh && ch)	data.top = dh - o.minHeight;
    +		if (ismaxh && ch)	data.top = dh - o.maxHeight;
    +
    +		// fixing jump error on top/left - bug #2330
    +		var isNotwh = !data.width && !data.height;
    +		if (isNotwh && !data.left && data.top) data.top = null;
    +		else if (isNotwh && !data.top && data.left) data.left = null;
    +
    +		return data;
    +	},
    +
    +	_proportionallyResize: function() {
    +
    +		var o = this.options;
    +		if (!this._proportionallyResizeElements.length) return;
    +		var element = this.helper || this.element;
    +
    +		for (var i=0; i < this._proportionallyResizeElements.length; i++) {
    +
    +			var prel = this._proportionallyResizeElements[i];
    +
    +			if (!this.borderDif) {
    +				var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
    +					p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
    +
    +				this.borderDif = $.map(b, function(v, i) {
    +					var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
    +					return border + padding;
    +				});
    +			}
    +
    +			prel.css({
    +				height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
    +				width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
    +			});
    +
    +		};
    +
    +	},
    +
    +	_renderProxy: function() {
    +
    +		var el = this.element, o = this.options;
    +		this.elementOffset = el.offset();
    +
    +		if(this._helper) {
    +
    +			this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
    +
    +			// fix ie6 offset TODO: This seems broken
    +			var ie6offset = ($.ui.ie6 ? 1 : 0),
    +			pxyoffset = ( $.ui.ie6 ? 2 : -1 );
    +
    +			this.helper.addClass(this._helper).css({
    +				width: this.element.outerWidth() + pxyoffset,
    +				height: this.element.outerHeight() + pxyoffset,
    +				position: 'absolute',
    +				left: this.elementOffset.left - ie6offset +'px',
    +				top: this.elementOffset.top - ie6offset +'px',
    +				zIndex: ++o.zIndex //TODO: Don't modify option
    +			});
    +
    +			this.helper
    +				.appendTo("body")
    +				.disableSelection();
    +
    +		} else {
    +			this.helper = this.element;
    +		}
    +
    +	},
    +
    +	_change: {
    +		e: function(event, dx, dy) {
    +			return { width: this.originalSize.width + dx };
    +		},
    +		w: function(event, dx, dy) {
    +			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
    +			return { left: sp.left + dx, width: cs.width - dx };
    +		},
    +		n: function(event, dx, dy) {
    +			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
    +			return { top: sp.top + dy, height: cs.height - dy };
    +		},
    +		s: function(event, dx, dy) {
    +			return { height: this.originalSize.height + dy };
    +		},
    +		se: function(event, dx, dy) {
    +			return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
    +		},
    +		sw: function(event, dx, dy) {
    +			return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
    +		},
    +		ne: function(event, dx, dy) {
    +			return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
    +		},
    +		nw: function(event, dx, dy) {
    +			return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
    +		}
    +	},
    +
    +	_propagate: function(n, event) {
    +		$.ui.plugin.call(this, n, [event, this.ui()]);
    +		(n != "resize" && this._trigger(n, event, this.ui()));
    +	},
    +
    +	plugins: {},
    +
    +	ui: function() {
    +		return {
    +			originalElement: this.originalElement,
    +			element: this.element,
    +			helper: this.helper,
    +			position: this.position,
    +			size: this.size,
    +			originalSize: this.originalSize,
    +			originalPosition: this.originalPosition
    +		};
    +	}
    +
    +});
    +
    +/*
    + * Resizable Extensions
    + */
    +
    +$.ui.plugin.add("resizable", "alsoResize", {
    +
    +	start: function (event, ui) {
    +		var that = $(this).data("resizable"), o = that.options;
    +
    +		var _store = function (exp) {
    +			$(exp).each(function() {
    +				var el = $(this);
    +				el.data("resizable-alsoresize", {
    +					width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
    +					left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10)
    +				});
    +			});
    +		};
    +
    +		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
    +			if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
    +			else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
    +		}else{
    +			_store(o.alsoResize);
    +		}
    +	},
    +
    +	resize: function (event, ui) {
    +		var that = $(this).data("resizable"), o = that.options, os = that.originalSize, op = that.originalPosition;
    +
    +		var delta = {
    +			height: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0,
    +			top: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0
    +		},
    +
    +		_alsoResize = function (exp, c) {
    +			$(exp).each(function() {
    +				var el = $(this), start = $(this).data("resizable-alsoresize"), style = {},
    +					css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
    +
    +				$.each(css, function (i, prop) {
    +					var sum = (start[prop]||0) + (delta[prop]||0);
    +					if (sum && sum >= 0)
    +						style[prop] = sum || null;
    +				});
    +
    +				el.css(style);
    +			});
    +		};
    +
    +		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
    +			$.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
    +		}else{
    +			_alsoResize(o.alsoResize);
    +		}
    +	},
    +
    +	stop: function (event, ui) {
    +		$(this).removeData("resizable-alsoresize");
    +	}
    +});
    +
    +$.ui.plugin.add("resizable", "animate", {
    +
    +	stop: function(event, ui) {
    +		var that = $(this).data("resizable"), o = that.options;
    +
    +		var pr = that._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
    +					soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : that.sizeDiff.height,
    +						soffsetw = ista ? 0 : that.sizeDiff.width;
    +
    +		var style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
    +					left = (parseInt(that.element.css('left'), 10) + (that.position.left - that.originalPosition.left)) || null,
    +						top = (parseInt(that.element.css('top'), 10) + (that.position.top - that.originalPosition.top)) || null;
    +
    +		that.element.animate(
    +			$.extend(style, top && left ? { top: top, left: left } : {}), {
    +				duration: o.animateDuration,
    +				easing: o.animateEasing,
    +				step: function() {
    +
    +					var data = {
    +						width: parseInt(that.element.css('width'), 10),
    +						height: parseInt(that.element.css('height'), 10),
    +						top: parseInt(that.element.css('top'), 10),
    +						left: parseInt(that.element.css('left'), 10)
    +					};
    +
    +					if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
    +
    +					// propagating resize, and updating values for each animation step
    +					that._updateCache(data);
    +					that._propagate("resize", event);
    +
    +				}
    +			}
    +		);
    +	}
    +
    +});
    +
    +$.ui.plugin.add("resizable", "containment", {
    +
    +	start: function(event, ui) {
    +		var that = $(this).data("resizable"), o = that.options, el = that.element;
    +		var oc = o.containment,	ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
    +		if (!ce) return;
    +
    +		that.containerElement = $(ce);
    +
    +		if (/document/.test(oc) || oc == document) {
    +			that.containerOffset = { left: 0, top: 0 };
    +			that.containerPosition = { left: 0, top: 0 };
    +
    +			that.parentData = {
    +				element: $(document), left: 0, top: 0,
    +				width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
    +			};
    +		}
    +
    +		// i'm a node, so compute top, left, right, bottom
    +		else {
    +			var element = $(ce), p = [];
    +			$([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
    +
    +			that.containerOffset = element.offset();
    +			that.containerPosition = element.position();
    +			that.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
    +
    +			var co = that.containerOffset, ch = that.containerSize.height,	cw = that.containerSize.width,
    +						width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
    +
    +			that.parentData = {
    +				element: ce, left: co.left, top: co.top, width: width, height: height
    +			};
    +		}
    +	},
    +
    +	resize: function(event, ui) {
    +		var that = $(this).data("resizable"), o = that.options,
    +				ps = that.containerSize, co = that.containerOffset, cs = that.size, cp = that.position,
    +				pRatio = that._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = that.containerElement;
    +
    +		if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
    +
    +		if (cp.left < (that._helper ? co.left : 0)) {
    +			that.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left));
    +			if (pRatio) that.size.height = that.size.width / that.aspectRatio;
    +			that.position.left = o.helper ? co.left : 0;
    +		}
    +
    +		if (cp.top < (that._helper ? co.top : 0)) {
    +			that.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top);
    +			if (pRatio) that.size.width = that.size.height * that.aspectRatio;
    +			that.position.top = that._helper ? co.top : 0;
    +		}
    +
    +		that.offset.left = that.parentData.left+that.position.left;
    +		that.offset.top = that.parentData.top+that.position.top;
    +
    +		var woset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width ),
    +					hoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height );
    +
    +		var isParent = that.containerElement.get(0) == that.element.parent().get(0),
    +			isOffsetRelative = /relative|absolute/.test(that.containerElement.css('position'));
    +
    +		if(isParent && isOffsetRelative) woset -= that.parentData.left;
    +
    +		if (woset + that.size.width >= that.parentData.width) {
    +			that.size.width = that.parentData.width - woset;
    +			if (pRatio) that.size.height = that.size.width / that.aspectRatio;
    +		}
    +
    +		if (hoset + that.size.height >= that.parentData.height) {
    +			that.size.height = that.parentData.height - hoset;
    +			if (pRatio) that.size.width = that.size.height * that.aspectRatio;
    +		}
    +	},
    +
    +	stop: function(event, ui){
    +		var that = $(this).data("resizable"), o = that.options, cp = that.position,
    +				co = that.containerOffset, cop = that.containerPosition, ce = that.containerElement;
    +
    +		var helper = $(that.helper), ho = helper.offset(), w = helper.outerWidth() - that.sizeDiff.width, h = helper.outerHeight() - that.sizeDiff.height;
    +
    +		if (that._helper && !o.animate && (/relative/).test(ce.css('position')))
    +			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
    +
    +		if (that._helper && !o.animate && (/static/).test(ce.css('position')))
    +			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
    +
    +	}
    +});
    +
    +$.ui.plugin.add("resizable", "ghost", {
    +
    +	start: function(event, ui) {
    +
    +		var that = $(this).data("resizable"), o = that.options, cs = that.size;
    +
    +		that.ghost = that.originalElement.clone();
    +		that.ghost
    +			.css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
    +			.addClass('ui-resizable-ghost')
    +			.addClass(typeof o.ghost == 'string' ? o.ghost : '');
    +
    +		that.ghost.appendTo(that.helper);
    +
    +	},
    +
    +	resize: function(event, ui){
    +		var that = $(this).data("resizable"), o = that.options;
    +		if (that.ghost) that.ghost.css({ position: 'relative', height: that.size.height, width: that.size.width });
    +	},
    +
    +	stop: function(event, ui){
    +		var that = $(this).data("resizable"), o = that.options;
    +		if (that.ghost && that.helper) that.helper.get(0).removeChild(that.ghost.get(0));
    +	}
    +
    +});
    +
    +$.ui.plugin.add("resizable", "grid", {
    +
    +	resize: function(event, ui) {
    +		var that = $(this).data("resizable"), o = that.options, cs = that.size, os = that.originalSize, op = that.originalPosition, a = that.axis, ratio = o._aspectRatio || event.shiftKey;
    +		o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
    +		var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
    +
    +		if (/^(se|s|e)$/.test(a)) {
    +			that.size.width = os.width + ox;
    +			that.size.height = os.height + oy;
    +		}
    +		else if (/^(ne)$/.test(a)) {
    +			that.size.width = os.width + ox;
    +			that.size.height = os.height + oy;
    +			that.position.top = op.top - oy;
    +		}
    +		else if (/^(sw)$/.test(a)) {
    +			that.size.width = os.width + ox;
    +			that.size.height = os.height + oy;
    +			that.position.left = op.left - ox;
    +		}
    +		else {
    +			that.size.width = os.width + ox;
    +			that.size.height = os.height + oy;
    +			that.position.top = op.top - oy;
    +			that.position.left = op.left - ox;
    +		}
    +	}
    +
    +});
    +
    +var num = function(v) {
    +	return parseInt(v, 10) || 0;
    +};
    +
    +var isNumber = function(value) {
    +	return !isNaN(parseInt(value, 10));
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.widget("ui.selectable", $.ui.mouse, {
    +	version: "1.9.2",
    +	options: {
    +		appendTo: 'body',
    +		autoRefresh: true,
    +		distance: 0,
    +		filter: '*',
    +		tolerance: 'touch'
    +	},
    +	_create: function() {
    +		var that = this;
    +
    +		this.element.addClass("ui-selectable");
    +
    +		this.dragged = false;
    +
    +		// cache selectee children based on filter
    +		var selectees;
    +		this.refresh = function() {
    +			selectees = $(that.options.filter, that.element[0]);
    +			selectees.addClass("ui-selectee");
    +			selectees.each(function() {
    +				var $this = $(this);
    +				var pos = $this.offset();
    +				$.data(this, "selectable-item", {
    +					element: this,
    +					$element: $this,
    +					left: pos.left,
    +					top: pos.top,
    +					right: pos.left + $this.outerWidth(),
    +					bottom: pos.top + $this.outerHeight(),
    +					startselected: false,
    +					selected: $this.hasClass('ui-selected'),
    +					selecting: $this.hasClass('ui-selecting'),
    +					unselecting: $this.hasClass('ui-unselecting')
    +				});
    +			});
    +		};
    +		this.refresh();
    +
    +		this.selectees = selectees.addClass("ui-selectee");
    +
    +		this._mouseInit();
    +
    +		this.helper = $("<div class='ui-selectable-helper'></div>");
    +	},
    +
    +	_destroy: function() {
    +		this.selectees
    +			.removeClass("ui-selectee")
    +			.removeData("selectable-item");
    +		this.element
    +			.removeClass("ui-selectable ui-selectable-disabled");
    +		this._mouseDestroy();
    +	},
    +
    +	_mouseStart: function(event) {
    +		var that = this;
    +
    +		this.opos = [event.pageX, event.pageY];
    +
    +		if (this.options.disabled)
    +			return;
    +
    +		var options = this.options;
    +
    +		this.selectees = $(options.filter, this.element[0]);
    +
    +		this._trigger("start", event);
    +
    +		$(options.appendTo).append(this.helper);
    +		// position helper (lasso)
    +		this.helper.css({
    +			"left": event.clientX,
    +			"top": event.clientY,
    +			"width": 0,
    +			"height": 0
    +		});
    +
    +		if (options.autoRefresh) {
    +			this.refresh();
    +		}
    +
    +		this.selectees.filter('.ui-selected').each(function() {
    +			var selectee = $.data(this, "selectable-item");
    +			selectee.startselected = true;
    +			if (!event.metaKey && !event.ctrlKey) {
    +				selectee.$element.removeClass('ui-selected');
    +				selectee.selected = false;
    +				selectee.$element.addClass('ui-unselecting');
    +				selectee.unselecting = true;
    +				// selectable UNSELECTING callback
    +				that._trigger("unselecting", event, {
    +					unselecting: selectee.element
    +				});
    +			}
    +		});
    +
    +		$(event.target).parents().andSelf().each(function() {
    +			var selectee = $.data(this, "selectable-item");
    +			if (selectee) {
    +				var doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass('ui-selected');
    +				selectee.$element
    +					.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
    +					.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
    +				selectee.unselecting = !doSelect;
    +				selectee.selecting = doSelect;
    +				selectee.selected = doSelect;
    +				// selectable (UN)SELECTING callback
    +				if (doSelect) {
    +					that._trigger("selecting", event, {
    +						selecting: selectee.element
    +					});
    +				} else {
    +					that._trigger("unselecting", event, {
    +						unselecting: selectee.element
    +					});
    +				}
    +				return false;
    +			}
    +		});
    +
    +	},
    +
    +	_mouseDrag: function(event) {
    +		var that = this;
    +		this.dragged = true;
    +
    +		if (this.options.disabled)
    +			return;
    +
    +		var options = this.options;
    +
    +		var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
    +		if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
    +		if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
    +		this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
    +
    +		this.selectees.each(function() {
    +			var selectee = $.data(this, "selectable-item");
    +			//prevent helper from being selected if appendTo: selectable
    +			if (!selectee || selectee.element == that.element[0])
    +				return;
    +			var hit = false;
    +			if (options.tolerance == 'touch') {
    +				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
    +			} else if (options.tolerance == 'fit') {
    +				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
    +			}
    +
    +			if (hit) {
    +				// SELECT
    +				if (selectee.selected) {
    +					selectee.$element.removeClass('ui-selected');
    +					selectee.selected = false;
    +				}
    +				if (selectee.unselecting) {
    +					selectee.$element.removeClass('ui-unselecting');
    +					selectee.unselecting = false;
    +				}
    +				if (!selectee.selecting) {
    +					selectee.$element.addClass('ui-selecting');
    +					selectee.selecting = true;
    +					// selectable SELECTING callback
    +					that._trigger("selecting", event, {
    +						selecting: selectee.element
    +					});
    +				}
    +			} else {
    +				// UNSELECT
    +				if (selectee.selecting) {
    +					if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
    +						selectee.$element.removeClass('ui-selecting');
    +						selectee.selecting = false;
    +						selectee.$element.addClass('ui-selected');
    +						selectee.selected = true;
    +					} else {
    +						selectee.$element.removeClass('ui-selecting');
    +						selectee.selecting = false;
    +						if (selectee.startselected) {
    +							selectee.$element.addClass('ui-unselecting');
    +							selectee.unselecting = true;
    +						}
    +						// selectable UNSELECTING callback
    +						that._trigger("unselecting", event, {
    +							unselecting: selectee.element
    +						});
    +					}
    +				}
    +				if (selectee.selected) {
    +					if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
    +						selectee.$element.removeClass('ui-selected');
    +						selectee.selected = false;
    +
    +						selectee.$element.addClass('ui-unselecting');
    +						selectee.unselecting = true;
    +						// selectable UNSELECTING callback
    +						that._trigger("unselecting", event, {
    +							unselecting: selectee.element
    +						});
    +					}
    +				}
    +			}
    +		});
    +
    +		return false;
    +	},
    +
    +	_mouseStop: function(event) {
    +		var that = this;
    +
    +		this.dragged = false;
    +
    +		var options = this.options;
    +
    +		$('.ui-unselecting', this.element[0]).each(function() {
    +			var selectee = $.data(this, "selectable-item");
    +			selectee.$element.removeClass('ui-unselecting');
    +			selectee.unselecting = false;
    +			selectee.startselected = false;
    +			that._trigger("unselected", event, {
    +				unselected: selectee.element
    +			});
    +		});
    +		$('.ui-selecting', this.element[0]).each(function() {
    +			var selectee = $.data(this, "selectable-item");
    +			selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
    +			selectee.selecting = false;
    +			selectee.selected = true;
    +			selectee.startselected = true;
    +			that._trigger("selected", event, {
    +				selected: selectee.element
    +			});
    +		});
    +		this._trigger("stop", event);
    +
    +		this.helper.remove();
    +
    +		return false;
    +	}
    +
    +});
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.widget("ui.sortable", $.ui.mouse, {
    +	version: "1.9.2",
    +	widgetEventPrefix: "sort",
    +	ready: false,
    +	options: {
    +		appendTo: "parent",
    +		axis: false,
    +		connectWith: false,
    +		containment: false,
    +		cursor: 'auto',
    +		cursorAt: false,
    +		dropOnEmpty: true,
    +		forcePlaceholderSize: false,
    +		forceHelperSize: false,
    +		grid: false,
    +		handle: false,
    +		helper: "original",
    +		items: '> *',
    +		opacity: false,
    +		placeholder: false,
    +		revert: false,
    +		scroll: true,
    +		scrollSensitivity: 20,
    +		scrollSpeed: 20,
    +		scope: "default",
    +		tolerance: "intersect",
    +		zIndex: 1000
    +	},
    +	_create: function() {
    +
    +		var o = this.options;
    +		this.containerCache = {};
    +		this.element.addClass("ui-sortable");
    +
    +		//Get the items
    +		this.refresh();
    +
    +		//Let's determine if the items are being displayed horizontally
    +		this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
    +
    +		//Let's determine the parent's offset
    +		this.offset = this.element.offset();
    +
    +		//Initialize mouse events for interaction
    +		this._mouseInit();
    +
    +		//We're ready to go
    +		this.ready = true
    +
    +	},
    +
    +	_destroy: function() {
    +		this.element
    +			.removeClass("ui-sortable ui-sortable-disabled");
    +		this._mouseDestroy();
    +
    +		for ( var i = this.items.length - 1; i >= 0; i-- )
    +			this.items[i].item.removeData(this.widgetName + "-item");
    +
    +		return this;
    +	},
    +
    +	_setOption: function(key, value){
    +		if ( key === "disabled" ) {
    +			this.options[ key ] = value;
    +
    +			this.widget().toggleClass( "ui-sortable-disabled", !!value );
    +		} else {
    +			// Don't call widget base _setOption for disable as it adds ui-state-disabled class
    +			$.Widget.prototype._setOption.apply(this, arguments);
    +		}
    +	},
    +
    +	_mouseCapture: function(event, overrideHandle) {
    +		var that = this;
    +
    +		if (this.reverting) {
    +			return false;
    +		}
    +
    +		if(this.options.disabled || this.options.type == 'static') return false;
    +
    +		//We have to refresh the items data once first
    +		this._refreshItems(event);
    +
    +		//Find out if the clicked node (or one of its parents) is a actual item in this.items
    +		var currentItem = null, nodes = $(event.target).parents().each(function() {
    +			if($.data(this, that.widgetName + '-item') == that) {
    +				currentItem = $(this);
    +				return false;
    +			}
    +		});
    +		if($.data(event.target, that.widgetName + '-item') == that) currentItem = $(event.target);
    +
    +		if(!currentItem) return false;
    +		if(this.options.handle && !overrideHandle) {
    +			var validHandle = false;
    +
    +			$(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
    +			if(!validHandle) return false;
    +		}
    +
    +		this.currentItem = currentItem;
    +		this._removeCurrentsFromItems();
    +		return true;
    +
    +	},
    +
    +	_mouseStart: function(event, overrideHandle, noActivation) {
    +
    +		var o = this.options;
    +		this.currentContainer = this;
    +
    +		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
    +		this.refreshPositions();
    +
    +		//Create and append the visible helper
    +		this.helper = this._createHelper(event);
    +
    +		//Cache the helper size
    +		this._cacheHelperProportions();
    +
    +		/*
    +		 * - Position generation -
    +		 * This block generates everything position related - it's the core of draggables.
    +		 */
    +
    +		//Cache the margins of the original element
    +		this._cacheMargins();
    +
    +		//Get the next scrolling parent
    +		this.scrollParent = this.helper.scrollParent();
    +
    +		//The element's absolute position on the page minus margins
    +		this.offset = this.currentItem.offset();
    +		this.offset = {
    +			top: this.offset.top - this.margins.top,
    +			left: this.offset.left - this.margins.left
    +		};
    +
    +		$.extend(this.offset, {
    +			click: { //Where the click happened, relative to the element
    +				left: event.pageX - this.offset.left,
    +				top: event.pageY - this.offset.top
    +			},
    +			parent: this._getParentOffset(),
    +			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
    +		});
    +
    +		// Only after we got the offset, we can change the helper's position to absolute
    +		// TODO: Still need to figure out a way to make relative sorting possible
    +		this.helper.css("position", "absolute");
    +		this.cssPosition = this.helper.css("position");
    +
    +		//Generate the original position
    +		this.originalPosition = this._generatePosition(event);
    +		this.originalPageX = event.pageX;
    +		this.originalPageY = event.pageY;
    +
    +		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
    +		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
    +
    +		//Cache the former DOM position
    +		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
    +
    +		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
    +		if(this.helper[0] != this.currentItem[0]) {
    +			this.currentItem.hide();
    +		}
    +
    +		//Create the placeholder
    +		this._createPlaceholder();
    +
    +		//Set a containment if given in the options
    +		if(o.containment)
    +			this._setContainment();
    +
    +		if(o.cursor) { // cursor option
    +			if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
    +			$('body').css("cursor", o.cursor);
    +		}
    +
    +		if(o.opacity) { // opacity option
    +			if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
    +			this.helper.css("opacity", o.opacity);
    +		}
    +
    +		if(o.zIndex) { // zIndex option
    +			if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
    +			this.helper.css("zIndex", o.zIndex);
    +		}
    +
    +		//Prepare scrolling
    +		if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
    +			this.overflowOffset = this.scrollParent.offset();
    +
    +		//Call callbacks
    +		this._trigger("start", event, this._uiHash());
    +
    +		//Recache the helper size
    +		if(!this._preserveHelperProportions)
    +			this._cacheHelperProportions();
    +
    +
    +		//Post 'activate' events to possible containers
    +		if(!noActivation) {
    +			 for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, this._uiHash(this)); }
    +		}
    +
    +		//Prepare possible droppables
    +		if($.ui.ddmanager)
    +			$.ui.ddmanager.current = this;
    +
    +		if ($.ui.ddmanager && !o.dropBehaviour)
    +			$.ui.ddmanager.prepareOffsets(this, event);
    +
    +		this.dragging = true;
    +
    +		this.helper.addClass("ui-sortable-helper");
    +		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
    +		return true;
    +
    +	},
    +
    +	_mouseDrag: function(event) {
    +
    +		//Compute the helpers position
    +		this.position = this._generatePosition(event);
    +		this.positionAbs = this._convertPositionTo("absolute");
    +
    +		if (!this.lastPositionAbs) {
    +			this.lastPositionAbs = this.positionAbs;
    +		}
    +
    +		//Do scrolling
    +		if(this.options.scroll) {
    +			var o = this.options, scrolled = false;
    +			if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
    +
    +				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
    +					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
    +				else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
    +					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
    +
    +				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
    +					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
    +				else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
    +					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
    +
    +			} else {
    +
    +				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
    +					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
    +				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
    +					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
    +
    +				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
    +					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
    +				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
    +					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
    +
    +			}
    +
    +			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
    +				$.ui.ddmanager.prepareOffsets(this, event);
    +		}
    +
    +		//Regenerate the absolute position used for position checks
    +		this.positionAbs = this._convertPositionTo("absolute");
    +
    +		//Set the helper position
    +		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
    +		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
    +
    +		//Rearrange
    +		for (var i = this.items.length - 1; i >= 0; i--) {
    +
    +			//Cache variables and intersection, continue if no intersection
    +			var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
    +			if (!intersection) continue;
    +
    +			// Only put the placeholder inside the current Container, skip all
    +			// items form other containers. This works because when moving
    +			// an item from one container to another the
    +			// currentContainer is switched before the placeholder is moved.
    +			//
    +			// Without this moving items in "sub-sortables" can cause the placeholder to jitter
    +			// beetween the outer and inner container.
    +			if (item.instance !== this.currentContainer) continue;
    +
    +			if (itemElement != this.currentItem[0] //cannot intersect with itself
    +				&&	this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
    +				&&	!$.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
    +				&& (this.options.type == 'semi-dynamic' ? !$.contains(this.element[0], itemElement) : true)
    +				//&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
    +			) {
    +
    +				this.direction = intersection == 1 ? "down" : "up";
    +
    +				if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
    +					this._rearrange(event, item);
    +				} else {
    +					break;
    +				}
    +
    +				this._trigger("change", event, this._uiHash());
    +				break;
    +			}
    +		}
    +
    +		//Post events to containers
    +		this._contactContainers(event);
    +
    +		//Interconnect with droppables
    +		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
    +
    +		//Call callbacks
    +		this._trigger('sort', event, this._uiHash());
    +
    +		this.lastPositionAbs = this.positionAbs;
    +		return false;
    +
    +	},
    +
    +	_mouseStop: function(event, noPropagation) {
    +
    +		if(!event) return;
    +
    +		//If we are using droppables, inform the manager about the drop
    +		if ($.ui.ddmanager && !this.options.dropBehaviour)
    +			$.ui.ddmanager.drop(this, event);
    +
    +		if(this.options.revert) {
    +			var that = this;
    +			var cur = this.placeholder.offset();
    +
    +			this.reverting = true;
    +
    +			$(this.helper).animate({
    +				left: cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
    +				top: cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
    +			}, parseInt(this.options.revert, 10) || 500, function() {
    +				that._clear(event);
    +			});
    +		} else {
    +			this._clear(event, noPropagation);
    +		}
    +
    +		return false;
    +
    +	},
    +
    +	cancel: function() {
    +
    +		if(this.dragging) {
    +
    +			this._mouseUp({ target: null });
    +
    +			if(this.options.helper == "original")
    +				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
    +			else
    +				this.currentItem.show();
    +
    +			//Post deactivating events to containers
    +			for (var i = this.containers.length - 1; i >= 0; i--){
    +				this.containers[i]._trigger("deactivate", null, this._uiHash(this));
    +				if(this.containers[i].containerCache.over) {
    +					this.containers[i]._trigger("out", null, this._uiHash(this));
    +					this.containers[i].containerCache.over = 0;
    +				}
    +			}
    +
    +		}
    +
    +		if (this.placeholder) {
    +			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
    +			if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
    +			if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
    +
    +			$.extend(this, {
    +				helper: null,
    +				dragging: false,
    +				reverting: false,
    +				_noFinalSort: null
    +			});
    +
    +			if(this.domPosition.prev) {
    +				$(this.domPosition.prev).after(this.currentItem);
    +			} else {
    +				$(this.domPosition.parent).prepend(this.currentItem);
    +			}
    +		}
    +
    +		return this;
    +
    +	},
    +
    +	serialize: function(o) {
    +
    +		var items = this._getItemsAsjQuery(o && o.connected);
    +		var str = []; o = o || {};
    +
    +		$(items).each(function() {
    +			var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
    +			if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
    +		});
    +
    +		if(!str.length && o.key) {
    +			str.push(o.key + '=');
    +		}
    +
    +		return str.join('&');
    +
    +	},
    +
    +	toArray: function(o) {
    +
    +		var items = this._getItemsAsjQuery(o && o.connected);
    +		var ret = []; o = o || {};
    +
    +		items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
    +		return ret;
    +
    +	},
    +
    +	/* Be careful with the following core functions */
    +	_intersectsWith: function(item) {
    +
    +		var x1 = this.positionAbs.left,
    +			x2 = x1 + this.helperProportions.width,
    +			y1 = this.positionAbs.top,
    +			y2 = y1 + this.helperProportions.height;
    +
    +		var l = item.left,
    +			r = l + item.width,
    +			t = item.top,
    +			b = t + item.height;
    +
    +		var dyClick = this.offset.click.top,
    +			dxClick = this.offset.click.left;
    +
    +		var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
    +
    +		if(	   this.options.tolerance == "pointer"
    +			|| this.options.forcePointerForContainers
    +			|| (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
    +		) {
    +			return isOverElement;
    +		} else {
    +
    +			return (l < x1 + (this.helperProportions.width / 2) // Right Half
    +				&& x2 - (this.helperProportions.width / 2) < r // Left Half
    +				&& t < y1 + (this.helperProportions.height / 2) // Bottom Half
    +				&& y2 - (this.helperProportions.height / 2) < b ); // Top Half
    +
    +		}
    +	},
    +
    +	_intersectsWithPointer: function(item) {
    +
    +		var isOverElementHeight = (this.options.axis === 'x') || $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
    +			isOverElementWidth = (this.options.axis === 'y') || $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
    +			isOverElement = isOverElementHeight && isOverElementWidth,
    +			verticalDirection = this._getDragVerticalDirection(),
    +			horizontalDirection = this._getDragHorizontalDirection();
    +
    +		if (!isOverElement)
    +			return false;
    +
    +		return this.floating ?
    +			( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
    +			: ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
    +
    +	},
    +
    +	_intersectsWithSides: function(item) {
    +
    +		var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
    +			isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
    +			verticalDirection = this._getDragVerticalDirection(),
    +			horizontalDirection = this._getDragHorizontalDirection();
    +
    +		if (this.floating && horizontalDirection) {
    +			return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
    +		} else {
    +			return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
    +		}
    +
    +	},
    +
    +	_getDragVerticalDirection: function() {
    +		var delta = this.positionAbs.top - this.lastPositionAbs.top;
    +		return delta != 0 && (delta > 0 ? "down" : "up");
    +	},
    +
    +	_getDragHorizontalDirection: function() {
    +		var delta = this.positionAbs.left - this.lastPositionAbs.left;
    +		return delta != 0 && (delta > 0 ? "right" : "left");
    +	},
    +
    +	refresh: function(event) {
    +		this._refreshItems(event);
    +		this.refreshPositions();
    +		return this;
    +	},
    +
    +	_connectWith: function() {
    +		var options = this.options;
    +		return options.connectWith.constructor == String
    +			? [options.connectWith]
    +			: options.connectWith;
    +	},
    +
    +	_getItemsAsjQuery: function(connected) {
    +
    +		var items = [];
    +		var queries = [];
    +		var connectWith = this._connectWith();
    +
    +		if(connectWith && connected) {
    +			for (var i = connectWith.length - 1; i >= 0; i--){
    +				var cur = $(connectWith[i]);
    +				for (var j = cur.length - 1; j >= 0; j--){
    +					var inst = $.data(cur[j], this.widgetName);
    +					if(inst && inst != this && !inst.options.disabled) {
    +						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
    +					}
    +				};
    +			};
    +		}
    +
    +		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
    +
    +		for (var i = queries.length - 1; i >= 0; i--){
    +			queries[i][0].each(function() {
    +				items.push(this);
    +			});
    +		};
    +
    +		return $(items);
    +
    +	},
    +
    +	_removeCurrentsFromItems: function() {
    +
    +		var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
    +
    +		this.items = $.grep(this.items, function (item) {
    +			for (var j=0; j < list.length; j++) {
    +				if(list[j] == item.item[0])
    +					return false;
    +			};
    +			return true;
    +		});
    +
    +	},
    +
    +	_refreshItems: function(event) {
    +
    +		this.items = [];
    +		this.containers = [this];
    +		var items = this.items;
    +		var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
    +		var connectWith = this._connectWith();
    +
    +		if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
    +			for (var i = connectWith.length - 1; i >= 0; i--){
    +				var cur = $(connectWith[i]);
    +				for (var j = cur.length - 1; j >= 0; j--){
    +					var inst = $.data(cur[j], this.widgetName);
    +					if(inst && inst != this && !inst.options.disabled) {
    +						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
    +						this.containers.push(inst);
    +					}
    +				};
    +			};
    +		}
    +
    +		for (var i = queries.length - 1; i >= 0; i--) {
    +			var targetData = queries[i][1];
    +			var _queries = queries[i][0];
    +
    +			for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
    +				var item = $(_queries[j]);
    +
    +				item.data(this.widgetName + '-item', targetData); // Data for target checking (mouse manager)
    +
    +				items.push({
    +					item: item,
    +					instance: targetData,
    +					width: 0, height: 0,
    +					left: 0, top: 0
    +				});
    +			};
    +		};
    +
    +	},
    +
    +	refreshPositions: function(fast) {
    +
    +		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
    +		if(this.offsetParent && this.helper) {
    +			this.offset.parent = this._getParentOffset();
    +		}
    +
    +		for (var i = this.items.length - 1; i >= 0; i--){
    +			var item = this.items[i];
    +
    +			//We ignore calculating positions of all connected containers when we're not over them
    +			if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
    +				continue;
    +
    +			var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
    +
    +			if (!fast) {
    +				item.width = t.outerWidth();
    +				item.height = t.outerHeight();
    +			}
    +
    +			var p = t.offset();
    +			item.left = p.left;
    +			item.top = p.top;
    +		};
    +
    +		if(this.options.custom && this.options.custom.refreshContainers) {
    +			this.options.custom.refreshContainers.call(this);
    +		} else {
    +			for (var i = this.containers.length - 1; i >= 0; i--){
    +				var p = this.containers[i].element.offset();
    +				this.containers[i].containerCache.left = p.left;
    +				this.containers[i].containerCache.top = p.top;
    +				this.containers[i].containerCache.width	= this.containers[i].element.outerWidth();
    +				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
    +			};
    +		}
    +
    +		return this;
    +	},
    +
    +	_createPlaceholder: function(that) {
    +		that = that || this;
    +		var o = that.options;
    +
    +		if(!o.placeholder || o.placeholder.constructor == String) {
    +			var className = o.placeholder;
    +			o.placeholder = {
    +				element: function() {
    +
    +					var el = $(document.createElement(that.currentItem[0].nodeName))
    +						.addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
    +						.removeClass("ui-sortable-helper")[0];
    +
    +					if(!className)
    +						el.style.visibility = "hidden";
    +
    +					return el;
    +				},
    +				update: function(container, p) {
    +
    +					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
    +					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
    +					if(className && !o.forcePlaceholderSize) return;
    +
    +					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
    +					if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css('paddingTop')||0, 10) - parseInt(that.currentItem.css('paddingBottom')||0, 10)); };
    +					if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css('paddingLeft')||0, 10) - parseInt(that.currentItem.css('paddingRight')||0, 10)); };
    +				}
    +			};
    +		}
    +
    +		//Create the placeholder
    +		that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
    +
    +		//Append it after the actual current item
    +		that.currentItem.after(that.placeholder);
    +
    +		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
    +		o.placeholder.update(that, that.placeholder);
    +
    +	},
    +
    +	_contactContainers: function(event) {
    +
    +		// get innermost container that intersects with item
    +		var innermostContainer = null, innermostIndex = null;
    +
    +
    +		for (var i = this.containers.length - 1; i >= 0; i--){
    +
    +			// never consider a container that's located within the item itself
    +			if($.contains(this.currentItem[0], this.containers[i].element[0]))
    +				continue;
    +
    +			if(this._intersectsWith(this.containers[i].containerCache)) {
    +
    +				// if we've already found a container and it's more "inner" than this, then continue
    +				if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0]))
    +					continue;
    +
    +				innermostContainer = this.containers[i];
    +				innermostIndex = i;
    +
    +			} else {
    +				// container doesn't intersect. trigger "out" event if necessary
    +				if(this.containers[i].containerCache.over) {
    +					this.containers[i]._trigger("out", event, this._uiHash(this));
    +					this.containers[i].containerCache.over = 0;
    +				}
    +			}
    +
    +		}
    +
    +		// if no intersecting containers found, return
    +		if(!innermostContainer) return;
    +
    +		// move the item into the container if it's not there already
    +		if(this.containers.length === 1) {
    +			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
    +			this.containers[innermostIndex].containerCache.over = 1;
    +		} else {
    +
    +			//When entering a new container, we will find the item with the least distance and append our item near it
    +			var dist = 10000; var itemWithLeastDistance = null;
    +			var posProperty = this.containers[innermostIndex].floating ? 'left' : 'top';
    +			var sizeProperty = this.containers[innermostIndex].floating ? 'width' : 'height';
    +			var base = this.positionAbs[posProperty] + this.offset.click[posProperty];
    +			for (var j = this.items.length - 1; j >= 0; j--) {
    +				if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
    +				if(this.items[j].item[0] == this.currentItem[0]) continue;
    +				var cur = this.items[j].item.offset()[posProperty];
    +				var nearBottom = false;
    +				if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
    +					nearBottom = true;
    +					cur += this.items[j][sizeProperty];
    +				}
    +
    +				if(Math.abs(cur - base) < dist) {
    +					dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
    +					this.direction = nearBottom ? "up": "down";
    +				}
    +			}
    +
    +			if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
    +				return;
    +
    +			this.currentContainer = this.containers[innermostIndex];
    +			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
    +			this._trigger("change", event, this._uiHash());
    +			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
    +
    +			//Update the placeholder
    +			this.options.placeholder.update(this.currentContainer, this.placeholder);
    +
    +			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
    +			this.containers[innermostIndex].containerCache.over = 1;
    +		}
    +
    +
    +	},
    +
    +	_createHelper: function(event) {
    +
    +		var o = this.options;
    +		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
    +
    +		if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
    +			$(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
    +
    +		if(helper[0] == this.currentItem[0])
    +			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
    +
    +		if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
    +		if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
    +
    +		return helper;
    +
    +	},
    +
    +	_adjustOffsetFromHelper: function(obj) {
    +		if (typeof obj == 'string') {
    +			obj = obj.split(' ');
    +		}
    +		if ($.isArray(obj)) {
    +			obj = {left: +obj[0], top: +obj[1] || 0};
    +		}
    +		if ('left' in obj) {
    +			this.offset.click.left = obj.left + this.margins.left;
    +		}
    +		if ('right' in obj) {
    +			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
    +		}
    +		if ('top' in obj) {
    +			this.offset.click.top = obj.top + this.margins.top;
    +		}
    +		if ('bottom' in obj) {
    +			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
    +		}
    +	},
    +
    +	_getParentOffset: function() {
    +
    +
    +		//Get the offsetParent and cache its position
    +		this.offsetParent = this.helper.offsetParent();
    +		var po = this.offsetParent.offset();
    +
    +		// This is a special case where we need to modify a offset calculated on start, since the following happened:
    +		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
    +		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
    +		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
    +		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
    +			po.left += this.scrollParent.scrollLeft();
    +			po.top += this.scrollParent.scrollTop();
    +		}
    +
    +		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
    +		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
    +			po = { top: 0, left: 0 };
    +
    +		return {
    +			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
    +			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
    +		};
    +
    +	},
    +
    +	_getRelativeOffset: function() {
    +
    +		if(this.cssPosition == "relative") {
    +			var p = this.currentItem.position();
    +			return {
    +				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
    +				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
    +			};
    +		} else {
    +			return { top: 0, left: 0 };
    +		}
    +
    +	},
    +
    +	_cacheMargins: function() {
    +		this.margins = {
    +			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
    +			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
    +		};
    +	},
    +
    +	_cacheHelperProportions: function() {
    +		this.helperProportions = {
    +			width: this.helper.outerWidth(),
    +			height: this.helper.outerHeight()
    +		};
    +	},
    +
    +	_setContainment: function() {
    +
    +		var o = this.options;
    +		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
    +		if(o.containment == 'document' || o.containment == 'window') this.containment = [
    +			0 - this.offset.relative.left - this.offset.parent.left,
    +			0 - this.offset.relative.top - this.offset.parent.top,
    +			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
    +			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
    +		];
    +
    +		if(!(/^(document|window|parent)$/).test(o.containment)) {
    +			var ce = $(o.containment)[0];
    +			var co = $(o.containment).offset();
    +			var over = ($(ce).css("overflow") != 'hidden');
    +
    +			this.containment = [
    +				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
    +				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
    +				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
    +				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
    +			];
    +		}
    +
    +	},
    +
    +	_convertPositionTo: function(d, pos) {
    +
    +		if(!pos) pos = this.position;
    +		var mod = d == "absolute" ? 1 : -1;
    +		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
    +
    +		return {
    +			top: (
    +				pos.top																	// The absolute mouse position
    +				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
    +				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
    +				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
    +			),
    +			left: (
    +				pos.left																// The absolute mouse position
    +				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
    +				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
    +				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
    +			)
    +		};
    +
    +	},
    +
    +	_generatePosition: function(event) {
    +
    +		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
    +
    +		// This is another very weird special case that only happens for relative elements:
    +		// 1. If the css position is relative
    +		// 2. and the scroll parent is the document or similar to the offset parent
    +		// we have to refresh the relative offset during the scroll so there are no jumps
    +		if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
    +			this.offset.relative = this._getRelativeOffset();
    +		}
    +
    +		var pageX = event.pageX;
    +		var pageY = event.pageY;
    +
    +		/*
    +		 * - Position constraining -
    +		 * Constrain the position to a mix of grid, containment.
    +		 */
    +
    +		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
    +
    +			if(this.containment) {
    +				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
    +				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
    +				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
    +				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
    +			}
    +
    +			if(o.grid) {
    +				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
    +				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
    +
    +				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
    +				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
    +			}
    +
    +		}
    +
    +		return {
    +			top: (
    +				pageY																// The absolute mouse position
    +				- this.offset.click.top													// Click offset (relative to the element)
    +				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
    +				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
    +				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
    +			),
    +			left: (
    +				pageX																// The absolute mouse position
    +				- this.offset.click.left												// Click offset (relative to the element)
    +				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
    +				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
    +				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
    +			)
    +		};
    +
    +	},
    +
    +	_rearrange: function(event, i, a, hardRefresh) {
    +
    +		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
    +
    +		//Various things done here to improve the performance:
    +		// 1. we create a setTimeout, that calls refreshPositions
    +		// 2. on the instance, we have a counter variable, that get's higher after every append
    +		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
    +		// 4. this lets only the last addition to the timeout stack through
    +		this.counter = this.counter ? ++this.counter : 1;
    +		var counter = this.counter;
    +
    +		this._delay(function() {
    +			if(counter == this.counter) this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
    +		});
    +
    +	},
    +
    +	_clear: function(event, noPropagation) {
    +
    +		this.reverting = false;
    +		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
    +		// everything else normalized again
    +		var delayedTriggers = [];
    +
    +		// We first have to update the dom position of the actual currentItem
    +		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
    +		if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
    +		this._noFinalSort = null;
    +
    +		if(this.helper[0] == this.currentItem[0]) {
    +			for(var i in this._storedCSS) {
    +				if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
    +			}
    +			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
    +		} else {
    +			this.currentItem.show();
    +		}
    +
    +		if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
    +		if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
    +
    +		// Check if the items Container has Changed and trigger appropriate
    +		// events.
    +		if (this !== this.currentContainer) {
    +			if(!noPropagation) {
    +				delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
    +				delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
    +				delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
    +			}
    +		}
    +
    +
    +		//Post events to containers
    +		for (var i = this.containers.length - 1; i >= 0; i--){
    +			if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
    +			if(this.containers[i].containerCache.over) {
    +				delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
    +				this.containers[i].containerCache.over = 0;
    +			}
    +		}
    +
    +		//Do what was originally in plugins
    +		if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
    +		if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
    +		if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
    +
    +		this.dragging = false;
    +		if(this.cancelHelperRemoval) {
    +			if(!noPropagation) {
    +				this._trigger("beforeStop", event, this._uiHash());
    +				for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
    +				this._trigger("stop", event, this._uiHash());
    +			}
    +
    +			this.fromOutside = false;
    +			return false;
    +		}
    +
    +		if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
    +
    +		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
    +		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
    +
    +		if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
    +
    +		if(!noPropagation) {
    +			for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
    +			this._trigger("stop", event, this._uiHash());
    +		}
    +
    +		this.fromOutside = false;
    +		return true;
    +
    +	},
    +
    +	_trigger: function() {
    +		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
    +			this.cancel();
    +		}
    +	},
    +
    +	_uiHash: function(_inst) {
    +		var inst = _inst || this;
    +		return {
    +			helper: inst.helper,
    +			placeholder: inst.placeholder || $([]),
    +			position: inst.position,
    +			originalPosition: inst.originalPosition,
    +			offset: inst.positionAbs,
    +			item: inst.currentItem,
    +			sender: _inst ? _inst.element : null
    +		};
    +	}
    +
    +});
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +var uid = 0,
    +	hideProps = {},
    +	showProps = {};
    +
    +hideProps.height = hideProps.paddingTop = hideProps.paddingBottom =
    +	hideProps.borderTopWidth = hideProps.borderBottomWidth = "hide";
    +showProps.height = showProps.paddingTop = showProps.paddingBottom =
    +	showProps.borderTopWidth = showProps.borderBottomWidth = "show";
    +
    +$.widget( "ui.accordion", {
    +	version: "1.9.2",
    +	options: {
    +		active: 0,
    +		animate: {},
    +		collapsible: false,
    +		event: "click",
    +		header: "> li > :first-child,> :not(li):even",
    +		heightStyle: "auto",
    +		icons: {
    +			activeHeader: "ui-icon-triangle-1-s",
    +			header: "ui-icon-triangle-1-e"
    +		},
    +
    +		// callbacks
    +		activate: null,
    +		beforeActivate: null
    +	},
    +
    +	_create: function() {
    +		var accordionId = this.accordionId = "ui-accordion-" +
    +				(this.element.attr( "id" ) || ++uid),
    +			options = this.options;
    +
    +		this.prevShow = this.prevHide = $();
    +		this.element.addClass( "ui-accordion ui-widget ui-helper-reset" );
    +
    +		this.headers = this.element.find( options.header )
    +			.addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" );
    +		this._hoverable( this.headers );
    +		this._focusable( this.headers );
    +
    +		this.headers.next()
    +			.addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
    +			.hide();
    +
    +		// don't allow collapsible: false and active: false / null
    +		if ( !options.collapsible && (options.active === false || options.active == null) ) {
    +			options.active = 0;
    +		}
    +		// handle negative values
    +		if ( options.active < 0 ) {
    +			options.active += this.headers.length;
    +		}
    +		this.active = this._findActive( options.active )
    +			.addClass( "ui-accordion-header-active ui-state-active" )
    +			.toggleClass( "ui-corner-all ui-corner-top" );
    +		this.active.next()
    +			.addClass( "ui-accordion-content-active" )
    +			.show();
    +
    +		this._createIcons();
    +		this.refresh();
    +
    +		// ARIA
    +		this.element.attr( "role", "tablist" );
    +
    +		this.headers
    +			.attr( "role", "tab" )
    +			.each(function( i ) {
    +				var header = $( this ),
    +					headerId = header.attr( "id" ),
    +					panel = header.next(),
    +					panelId = panel.attr( "id" );
    +				if ( !headerId ) {
    +					headerId = accordionId + "-header-" + i;
    +					header.attr( "id", headerId );
    +				}
    +				if ( !panelId ) {
    +					panelId = accordionId + "-panel-" + i;
    +					panel.attr( "id", panelId );
    +				}
    +				header.attr( "aria-controls", panelId );
    +				panel.attr( "aria-labelledby", headerId );
    +			})
    +			.next()
    +				.attr( "role", "tabpanel" );
    +
    +		this.headers
    +			.not( this.active )
    +			.attr({
    +				"aria-selected": "false",
    +				tabIndex: -1
    +			})
    +			.next()
    +				.attr({
    +					"aria-expanded": "false",
    +					"aria-hidden": "true"
    +				})
    +				.hide();
    +
    +		// make sure at least one header is in the tab order
    +		if ( !this.active.length ) {
    +			this.headers.eq( 0 ).attr( "tabIndex", 0 );
    +		} else {
    +			this.active.attr({
    +				"aria-selected": "true",
    +				tabIndex: 0
    +			})
    +			.next()
    +				.attr({
    +					"aria-expanded": "true",
    +					"aria-hidden": "false"
    +				});
    +		}
    +
    +		this._on( this.headers, { keydown: "_keydown" });
    +		this._on( this.headers.next(), { keydown: "_panelKeyDown" });
    +		this._setupEvents( options.event );
    +	},
    +
    +	_getCreateEventData: function() {
    +		return {
    +			header: this.active,
    +			content: !this.active.length ? $() : this.active.next()
    +		};
    +	},
    +
    +	_createIcons: function() {
    +		var icons = this.options.icons;
    +		if ( icons ) {
    +			$( "<span>" )
    +				.addClass( "ui-accordion-header-icon ui-icon " + icons.header )
    +				.prependTo( this.headers );
    +			this.active.children( ".ui-accordion-header-icon" )
    +				.removeClass( icons.header )
    +				.addClass( icons.activeHeader );
    +			this.headers.addClass( "ui-accordion-icons" );
    +		}
    +	},
    +
    +	_destroyIcons: function() {
    +		this.headers
    +			.removeClass( "ui-accordion-icons" )
    +			.children( ".ui-accordion-header-icon" )
    +				.remove();
    +	},
    +
    +	_destroy: function() {
    +		var contents;
    +
    +		// clean up main element
    +		this.element
    +			.removeClass( "ui-accordion ui-widget ui-helper-reset" )
    +			.removeAttr( "role" );
    +
    +		// clean up headers
    +		this.headers
    +			.removeClass( "ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
    +			.removeAttr( "role" )
    +			.removeAttr( "aria-selected" )
    +			.removeAttr( "aria-controls" )
    +			.removeAttr( "tabIndex" )
    +			.each(function() {
    +				if ( /^ui-accordion/.test( this.id ) ) {
    +					this.removeAttribute( "id" );
    +				}
    +			});
    +		this._destroyIcons();
    +
    +		// clean up content panels
    +		contents = this.headers.next()
    +			.css( "display", "" )
    +			.removeAttr( "role" )
    +			.removeAttr( "aria-expanded" )
    +			.removeAttr( "aria-hidden" )
    +			.removeAttr( "aria-labelledby" )
    +			.removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled" )
    +			.each(function() {
    +				if ( /^ui-accordion/.test( this.id ) ) {
    +					this.removeAttribute( "id" );
    +				}
    +			});
    +		if ( this.options.heightStyle !== "content" ) {
    +			contents.css( "height", "" );
    +		}
    +	},
    +
    +	_setOption: function( key, value ) {
    +		if ( key === "active" ) {
    +			// _activate() will handle invalid values and update this.options
    +			this._activate( value );
    +			return;
    +		}
    +
    +		if ( key === "event" ) {
    +			if ( this.options.event ) {
    +				this._off( this.headers, this.options.event );
    +			}
    +			this._setupEvents( value );
    +		}
    +
    +		this._super( key, value );
    +
    +		// setting collapsible: false while collapsed; open first panel
    +		if ( key === "collapsible" && !value && this.options.active === false ) {
    +			this._activate( 0 );
    +		}
    +
    +		if ( key === "icons" ) {
    +			this._destroyIcons();
    +			if ( value ) {
    +				this._createIcons();
    +			}
    +		}
    +
    +		// #5332 - opacity doesn't cascade to positioned elements in IE
    +		// so we need to add the disabled class to the headers and panels
    +		if ( key === "disabled" ) {
    +			this.headers.add( this.headers.next() )
    +				.toggleClass( "ui-state-disabled", !!value );
    +		}
    +	},
    +
    +	_keydown: function( event ) {
    +		if ( event.altKey || event.ctrlKey ) {
    +			return;
    +		}
    +
    +		var keyCode = $.ui.keyCode,
    +			length = this.headers.length,
    +			currentIndex = this.headers.index( event.target ),
    +			toFocus = false;
    +
    +		switch ( event.keyCode ) {
    +			case keyCode.RIGHT:
    +			case keyCode.DOWN:
    +				toFocus = this.headers[ ( currentIndex + 1 ) % length ];
    +				break;
    +			case keyCode.LEFT:
    +			case keyCode.UP:
    +				toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
    +				break;
    +			case keyCode.SPACE:
    +			case keyCode.ENTER:
    +				this._eventHandler( event );
    +				break;
    +			case keyCode.HOME:
    +				toFocus = this.headers[ 0 ];
    +				break;
    +			case keyCode.END:
    +				toFocus = this.headers[ length - 1 ];
    +				break;
    +		}
    +
    +		if ( toFocus ) {
    +			$( event.target ).attr( "tabIndex", -1 );
    +			$( toFocus ).attr( "tabIndex", 0 );
    +			toFocus.focus();
    +			event.preventDefault();
    +		}
    +	},
    +
    +	_panelKeyDown : function( event ) {
    +		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
    +			$( event.currentTarget ).prev().focus();
    +		}
    +	},
    +
    +	refresh: function() {
    +		var maxHeight, overflow,
    +			heightStyle = this.options.heightStyle,
    +			parent = this.element.parent();
    +
    +
    +		if ( heightStyle === "fill" ) {
    +			// IE 6 treats height like minHeight, so we need to turn off overflow
    +			// in order to get a reliable height
    +			// we use the minHeight support test because we assume that only
    +			// browsers that don't support minHeight will treat height as minHeight
    +			if ( !$.support.minHeight ) {
    +				overflow = parent.css( "overflow" );
    +				parent.css( "overflow", "hidden");
    +			}
    +			maxHeight = parent.height();
    +			this.element.siblings( ":visible" ).each(function() {
    +				var elem = $( this ),
    +					position = elem.css( "position" );
    +
    +				if ( position === "absolute" || position === "fixed" ) {
    +					return;
    +				}
    +				maxHeight -= elem.outerHeight( true );
    +			});
    +			if ( overflow ) {
    +				parent.css( "overflow", overflow );
    +			}
    +
    +			this.headers.each(function() {
    +				maxHeight -= $( this ).outerHeight( true );
    +			});
    +
    +			this.headers.next()
    +				.each(function() {
    +					$( this ).height( Math.max( 0, maxHeight -
    +						$( this ).innerHeight() + $( this ).height() ) );
    +				})
    +				.css( "overflow", "auto" );
    +		} else if ( heightStyle === "auto" ) {
    +			maxHeight = 0;
    +			this.headers.next()
    +				.each(function() {
    +					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
    +				})
    +				.height( maxHeight );
    +		}
    +	},
    +
    +	_activate: function( index ) {
    +		var active = this._findActive( index )[ 0 ];
    +
    +		// trying to activate the already active panel
    +		if ( active === this.active[ 0 ] ) {
    +			return;
    +		}
    +
    +		// trying to collapse, simulate a click on the currently active header
    +		active = active || this.active[ 0 ];
    +
    +		this._eventHandler({
    +			target: active,
    +			currentTarget: active,
    +			preventDefault: $.noop
    +		});
    +	},
    +
    +	_findActive: function( selector ) {
    +		return typeof selector === "number" ? this.headers.eq( selector ) : $();
    +	},
    +
    +	_setupEvents: function( event ) {
    +		var events = {};
    +		if ( !event ) {
    +			return;
    +		}
    +		$.each( event.split(" "), function( index, eventName ) {
    +			events[ eventName ] = "_eventHandler";
    +		});
    +		this._on( this.headers, events );
    +	},
    +
    +	_eventHandler: function( event ) {
    +		var options = this.options,
    +			active = this.active,
    +			clicked = $( event.currentTarget ),
    +			clickedIsActive = clicked[ 0 ] === active[ 0 ],
    +			collapsing = clickedIsActive && options.collapsible,
    +			toShow = collapsing ? $() : clicked.next(),
    +			toHide = active.next(),
    +			eventData = {
    +				oldHeader: active,
    +				oldPanel: toHide,
    +				newHeader: collapsing ? $() : clicked,
    +				newPanel: toShow
    +			};
    +
    +		event.preventDefault();
    +
    +		if (
    +				// click on active header, but not collapsible
    +				( clickedIsActive && !options.collapsible ) ||
    +				// allow canceling activation
    +				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
    +			return;
    +		}
    +
    +		options.active = collapsing ? false : this.headers.index( clicked );
    +
    +		// when the call to ._toggle() comes after the class changes
    +		// it causes a very odd bug in IE 8 (see #6720)
    +		this.active = clickedIsActive ? $() : clicked;
    +		this._toggle( eventData );
    +
    +		// switch classes
    +		// corner classes on the previously active header stay after the animation
    +		active.removeClass( "ui-accordion-header-active ui-state-active" );
    +		if ( options.icons ) {
    +			active.children( ".ui-accordion-header-icon" )
    +				.removeClass( options.icons.activeHeader )
    +				.addClass( options.icons.header );
    +		}
    +
    +		if ( !clickedIsActive ) {
    +			clicked
    +				.removeClass( "ui-corner-all" )
    +				.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
    +			if ( options.icons ) {
    +				clicked.children( ".ui-accordion-header-icon" )
    +					.removeClass( options.icons.header )
    +					.addClass( options.icons.activeHeader );
    +			}
    +
    +			clicked
    +				.next()
    +				.addClass( "ui-accordion-content-active" );
    +		}
    +	},
    +
    +	_toggle: function( data ) {
    +		var toShow = data.newPanel,
    +			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
    +
    +		// handle activating a panel during the animation for another activation
    +		this.prevShow.add( this.prevHide ).stop( true, true );
    +		this.prevShow = toShow;
    +		this.prevHide = toHide;
    +
    +		if ( this.options.animate ) {
    +			this._animate( toShow, toHide, data );
    +		} else {
    +			toHide.hide();
    +			toShow.show();
    +			this._toggleComplete( data );
    +		}
    +
    +		toHide.attr({
    +			"aria-expanded": "false",
    +			"aria-hidden": "true"
    +		});
    +		toHide.prev().attr( "aria-selected", "false" );
    +		// if we're switching panels, remove the old header from the tab order
    +		// if we're opening from collapsed state, remove the previous header from the tab order
    +		// if we're collapsing, then keep the collapsing header in the tab order
    +		if ( toShow.length && toHide.length ) {
    +			toHide.prev().attr( "tabIndex", -1 );
    +		} else if ( toShow.length ) {
    +			this.headers.filter(function() {
    +				return $( this ).attr( "tabIndex" ) === 0;
    +			})
    +			.attr( "tabIndex", -1 );
    +		}
    +
    +		toShow
    +			.attr({
    +				"aria-expanded": "true",
    +				"aria-hidden": "false"
    +			})
    +			.prev()
    +				.attr({
    +					"aria-selected": "true",
    +					tabIndex: 0
    +				});
    +	},
    +
    +	_animate: function( toShow, toHide, data ) {
    +		var total, easing, duration,
    +			that = this,
    +			adjust = 0,
    +			down = toShow.length &&
    +				( !toHide.length || ( toShow.index() < toHide.index() ) ),
    +			animate = this.options.animate || {},
    +			options = down && animate.down || animate,
    +			complete = function() {
    +				that._toggleComplete( data );
    +			};
    +
    +		if ( typeof options === "number" ) {
    +			duration = options;
    +		}
    +		if ( typeof options === "string" ) {
    +			easing = options;
    +		}
    +		// fall back from options to animation in case of partial down settings
    +		easing = easing || options.easing || animate.easing;
    +		duration = duration || options.duration || animate.duration;
    +
    +		if ( !toHide.length ) {
    +			return toShow.animate( showProps, duration, easing, complete );
    +		}
    +		if ( !toShow.length ) {
    +			return toHide.animate( hideProps, duration, easing, complete );
    +		}
    +
    +		total = toShow.show().outerHeight();
    +		toHide.animate( hideProps, {
    +			duration: duration,
    +			easing: easing,
    +			step: function( now, fx ) {
    +				fx.now = Math.round( now );
    +			}
    +		});
    +		toShow
    +			.hide()
    +			.animate( showProps, {
    +				duration: duration,
    +				easing: easing,
    +				complete: complete,
    +				step: function( now, fx ) {
    +					fx.now = Math.round( now );
    +					if ( fx.prop !== "height" ) {
    +						adjust += fx.now;
    +					} else if ( that.options.heightStyle !== "content" ) {
    +						fx.now = Math.round( total - toHide.outerHeight() - adjust );
    +						adjust = 0;
    +					}
    +				}
    +			});
    +	},
    +
    +	_toggleComplete: function( data ) {
    +		var toHide = data.oldPanel;
    +
    +		toHide
    +			.removeClass( "ui-accordion-content-active" )
    +			.prev()
    +				.removeClass( "ui-corner-top" )
    +				.addClass( "ui-corner-all" );
    +
    +		// Work around for rendering bug in IE (#5421)
    +		if ( toHide.length ) {
    +			toHide.parent()[0].className = toHide.parent()[0].className;
    +		}
    +
    +		this._trigger( "activate", null, data );
    +	}
    +});
    +
    +
    +
    +// DEPRECATED
    +if ( $.uiBackCompat !== false ) {
    +	// navigation options
    +	(function( $, prototype ) {
    +		$.extend( prototype.options, {
    +			navigation: false,
    +			navigationFilter: function() {
    +				return this.href.toLowerCase() === location.href.toLowerCase();
    +			}
    +		});
    +
    +		var _create = prototype._create;
    +		prototype._create = function() {
    +			if ( this.options.navigation ) {
    +				var that = this,
    +					headers = this.element.find( this.options.header ),
    +					content = headers.next(),
    +					current = headers.add( content )
    +						.find( "a" )
    +						.filter( this.options.navigationFilter )
    +						[ 0 ];
    +				if ( current ) {
    +					headers.add( content ).each( function( index ) {
    +						if ( $.contains( this, current ) ) {
    +							that.options.active = Math.floor( index / 2 );
    +							return false;
    +						}
    +					});
    +				}
    +			}
    +			_create.call( this );
    +		};
    +	}( jQuery, jQuery.ui.accordion.prototype ) );
    +
    +	// height options
    +	(function( $, prototype ) {
    +		$.extend( prototype.options, {
    +			heightStyle: null, // remove default so we fall back to old values
    +			autoHeight: true, // use heightStyle: "auto"
    +			clearStyle: false, // use heightStyle: "content"
    +			fillSpace: false // use heightStyle: "fill"
    +		});
    +
    +		var _create = prototype._create,
    +			_setOption = prototype._setOption;
    +
    +		$.extend( prototype, {
    +			_create: function() {
    +				this.options.heightStyle = this.options.heightStyle ||
    +					this._mergeHeightStyle();
    +
    +				_create.call( this );
    +			},
    +
    +			_setOption: function( key ) {
    +				if ( key === "autoHeight" || key === "clearStyle" || key === "fillSpace" ) {
    +					this.options.heightStyle = this._mergeHeightStyle();
    +				}
    +				_setOption.apply( this, arguments );
    +			},
    +
    +			_mergeHeightStyle: function() {
    +				var options = this.options;
    +
    +				if ( options.fillSpace ) {
    +					return "fill";
    +				}
    +
    +				if ( options.clearStyle ) {
    +					return "content";
    +				}
    +
    +				if ( options.autoHeight ) {
    +					return "auto";
    +				}
    +			}
    +		});
    +	}( jQuery, jQuery.ui.accordion.prototype ) );
    +
    +	// icon options
    +	(function( $, prototype ) {
    +		$.extend( prototype.options.icons, {
    +			activeHeader: null, // remove default so we fall back to old values
    +			headerSelected: "ui-icon-triangle-1-s"
    +		});
    +
    +		var _createIcons = prototype._createIcons;
    +		prototype._createIcons = function() {
    +			if ( this.options.icons ) {
    +				this.options.icons.activeHeader = this.options.icons.activeHeader ||
    +					this.options.icons.headerSelected;
    +			}
    +			_createIcons.call( this );
    +		};
    +	}( jQuery, jQuery.ui.accordion.prototype ) );
    +
    +	// expanded active option, activate method
    +	(function( $, prototype ) {
    +		prototype.activate = prototype._activate;
    +
    +		var _findActive = prototype._findActive;
    +		prototype._findActive = function( index ) {
    +			if ( index === -1 ) {
    +				index = false;
    +			}
    +			if ( index && typeof index !== "number" ) {
    +				index = this.headers.index( this.headers.filter( index ) );
    +				if ( index === -1 ) {
    +					index = false;
    +				}
    +			}
    +			return _findActive.call( this, index );
    +		};
    +	}( jQuery, jQuery.ui.accordion.prototype ) );
    +
    +	// resize method
    +	jQuery.ui.accordion.prototype.resize = jQuery.ui.accordion.prototype.refresh;
    +
    +	// change events
    +	(function( $, prototype ) {
    +		$.extend( prototype.options, {
    +			change: null,
    +			changestart: null
    +		});
    +
    +		var _trigger = prototype._trigger;
    +		prototype._trigger = function( type, event, data ) {
    +			var ret = _trigger.apply( this, arguments );
    +			if ( !ret ) {
    +				return false;
    +			}
    +
    +			if ( type === "beforeActivate" ) {
    +				ret = _trigger.call( this, "changestart", event, {
    +					oldHeader: data.oldHeader,
    +					oldContent: data.oldPanel,
    +					newHeader: data.newHeader,
    +					newContent: data.newPanel
    +				});
    +			} else if ( type === "activate" ) {
    +				ret = _trigger.call( this, "change", event, {
    +					oldHeader: data.oldHeader,
    +					oldContent: data.oldPanel,
    +					newHeader: data.newHeader,
    +					newContent: data.newPanel
    +				});
    +			}
    +			return ret;
    +		};
    +	}( jQuery, jQuery.ui.accordion.prototype ) );
    +
    +	// animated option
    +	// NOTE: this only provides support for "slide", "bounceslide", and easings
    +	// not the full $.ui.accordion.animations API
    +	(function( $, prototype ) {
    +		$.extend( prototype.options, {
    +			animate: null,
    +			animated: "slide"
    +		});
    +
    +		var _create = prototype._create;
    +		prototype._create = function() {
    +			var options = this.options;
    +			if ( options.animate === null ) {
    +				if ( !options.animated ) {
    +					options.animate = false;
    +				} else if ( options.animated === "slide" ) {
    +					options.animate = 300;
    +				} else if ( options.animated === "bounceslide" ) {
    +					options.animate = {
    +						duration: 200,
    +						down: {
    +							easing: "easeOutBounce",
    +							duration: 1000
    +						}
    +					};
    +				} else {
    +					options.animate = options.animated;
    +				}
    +			}
    +
    +			_create.call( this );
    +		};
    +	}( jQuery, jQuery.ui.accordion.prototype ) );
    +}
    +
    +})( jQuery );
    +(function( $, undefined ) {
    +
    +// used to prevent race conditions with remote data sources
    +var requestIndex = 0;
    +
    +$.widget( "ui.autocomplete", {
    +	version: "1.9.2",
    +	defaultElement: "<input>",
    +	options: {
    +		appendTo: "body",
    +		autoFocus: false,
    +		delay: 300,
    +		minLength: 1,
    +		position: {
    +			my: "left top",
    +			at: "left bottom",
    +			collision: "none"
    +		},
    +		source: null,
    +
    +		// callbacks
    +		change: null,
    +		close: null,
    +		focus: null,
    +		open: null,
    +		response: null,
    +		search: null,
    +		select: null
    +	},
    +
    +	pending: 0,
    +
    +	_create: function() {
    +		// Some browsers only repeat keydown events, not keypress events,
    +		// so we use the suppressKeyPress flag to determine if we've already
    +		// handled the keydown event. #7269
    +		// Unfortunately the code for & in keypress is the same as the up arrow,
    +		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
    +		// events when we know the keydown event was used to modify the
    +		// search term. #7799
    +		var suppressKeyPress, suppressKeyPressRepeat, suppressInput;
    +
    +		this.isMultiLine = this._isMultiLine();
    +		this.valueMethod = this.element[ this.element.is( "input,textarea" ) ? "val" : "text" ];
    +		this.isNewMenu = true;
    +
    +		this.element
    +			.addClass( "ui-autocomplete-input" )
    +			.attr( "autocomplete", "off" );
    +
    +		this._on( this.element, {
    +			keydown: function( event ) {
    +				if ( this.element.prop( "readOnly" ) ) {
    +					suppressKeyPress = true;
    +					suppressInput = true;
    +					suppressKeyPressRepeat = true;
    +					return;
    +				}
    +
    +				suppressKeyPress = false;
    +				suppressInput = false;
    +				suppressKeyPressRepeat = false;
    +				var keyCode = $.ui.keyCode;
    +				switch( event.keyCode ) {
    +				case keyCode.PAGE_UP:
    +					suppressKeyPress = true;
    +					this._move( "previousPage", event );
    +					break;
    +				case keyCode.PAGE_DOWN:
    +					suppressKeyPress = true;
    +					this._move( "nextPage", event );
    +					break;
    +				case keyCode.UP:
    +					suppressKeyPress = true;
    +					this._keyEvent( "previous", event );
    +					break;
    +				case keyCode.DOWN:
    +					suppressKeyPress = true;
    +					this._keyEvent( "next", event );
    +					break;
    +				case keyCode.ENTER:
    +				case keyCode.NUMPAD_ENTER:
    +					// when menu is open and has focus
    +					if ( this.menu.active ) {
    +						// #6055 - Opera still allows the keypress to occur
    +						// which causes forms to submit
    +						suppressKeyPress = true;
    +						event.preventDefault();
    +						this.menu.select( event );
    +					}
    +					break;
    +				case keyCode.TAB:
    +					if ( this.menu.active ) {
    +						this.menu.select( event );
    +					}
    +					break;
    +				case keyCode.ESCAPE:
    +					if ( this.menu.element.is( ":visible" ) ) {
    +						this._value( this.term );
    +						this.close( event );
    +						// Different browsers have different default behavior for escape
    +						// Single press can mean undo or clear
    +						// Double press in IE means clear the whole form
    +						event.preventDefault();
    +					}
    +					break;
    +				default:
    +					suppressKeyPressRepeat = true;
    +					// search timeout should be triggered before the input value is changed
    +					this._searchTimeout( event );
    +					break;
    +				}
    +			},
    +			keypress: function( event ) {
    +				if ( suppressKeyPress ) {
    +					suppressKeyPress = false;
    +					event.preventDefault();
    +					return;
    +				}
    +				if ( suppressKeyPressRepeat ) {
    +					return;
    +				}
    +
    +				// replicate some key handlers to allow them to repeat in Firefox and Opera
    +				var keyCode = $.ui.keyCode;
    +				switch( event.keyCode ) {
    +				case keyCode.PAGE_UP:
    +					this._move( "previousPage", event );
    +					break;
    +				case keyCode.PAGE_DOWN:
    +					this._move( "nextPage", event );
    +					break;
    +				case keyCode.UP:
    +					this._keyEvent( "previous", event );
    +					break;
    +				case keyCode.DOWN:
    +					this._keyEvent( "next", event );
    +					break;
    +				}
    +			},
    +			input: function( event ) {
    +				if ( suppressInput ) {
    +					suppressInput = false;
    +					event.preventDefault();
    +					return;
    +				}
    +				this._searchTimeout( event );
    +			},
    +			focus: function() {
    +				this.selectedItem = null;
    +				this.previous = this._value();
    +			},
    +			blur: function( event ) {
    +				if ( this.cancelBlur ) {
    +					delete this.cancelBlur;
    +					return;
    +				}
    +
    +				clearTimeout( this.searching );
    +				this.close( event );
    +				this._change( event );
    +			}
    +		});
    +
    +		this._initSource();
    +		this.menu = $( "<ul>" )
    +			.addClass( "ui-autocomplete" )
    +			.appendTo( this.document.find( this.options.appendTo || "body" )[ 0 ] )
    +			.menu({
    +				// custom key handling for now
    +				input: $(),
    +				// disable ARIA support, the live region takes care of that
    +				role: null
    +			})
    +			.zIndex( this.element.zIndex() + 1 )
    +			.hide()
    +			.data( "menu" );
    +
    +		this._on( this.menu.element, {
    +			mousedown: function( event ) {
    +				// prevent moving focus out of the text field
    +				event.preventDefault();
    +
    +				// IE doesn't prevent moving focus even with event.preventDefault()
    +				// so we set a flag to know when we should ignore the blur event
    +				this.cancelBlur = true;
    +				this._delay(function() {
    +					delete this.cancelBlur;
    +				});
    +
    +				// clicking on the scrollbar causes focus to shift to the body
    +				// but we can't detect a mouseup or a click immediately afterward
    +				// so we have to track the next mousedown and close the menu if
    +				// the user clicks somewhere outside of the autocomplete
    +				var menuElement = this.menu.element[ 0 ];
    +				if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
    +					this._delay(function() {
    +						var that = this;
    +						this.document.one( "mousedown", function( event ) {
    +							if ( event.target !== that.element[ 0 ] &&
    +									event.target !== menuElement &&
    +									!$.contains( menuElement, event.target ) ) {
    +								that.close();
    +							}
    +						});
    +					});
    +				}
    +			},
    +			menufocus: function( event, ui ) {
    +				// #7024 - Prevent accidental activation of menu items in Firefox
    +				if ( this.isNewMenu ) {
    +					this.isNewMenu = false;
    +					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
    +						this.menu.blur();
    +
    +						this.document.one( "mousemove", function() {
    +							$( event.target ).trigger( event.originalEvent );
    +						});
    +
    +						return;
    +					}
    +				}
    +
    +				// back compat for _renderItem using item.autocomplete, via #7810
    +				// TODO remove the fallback, see #8156
    +				var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" );
    +				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
    +					// use value to match what will end up in the input, if it was a key event
    +					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
    +						this._value( item.value );
    +					}
    +				} else {
    +					// Normally the input is populated with the item's value as the
    +					// menu is navigated, causing screen readers to notice a change and
    +					// announce the item. Since the focus event was canceled, this doesn't
    +					// happen, so we update the live region so that screen readers can
    +					// still notice the change and announce it.
    +					this.liveRegion.text( item.value );
    +				}
    +			},
    +			menuselect: function( event, ui ) {
    +				// back compat for _renderItem using item.autocomplete, via #7810
    +				// TODO remove the fallback, see #8156
    +				var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" ),
    +					previous = this.previous;
    +
    +				// only trigger when focus was lost (click on menu)
    +				if ( this.element[0] !== this.document[0].activeElement ) {
    +					this.element.focus();
    +					this.previous = previous;
    +					// #6109 - IE triggers two focus events and the second
    +					// is asynchronous, so we need to reset the previous
    +					// term synchronously and asynchronously :-(
    +					this._delay(function() {
    +						this.previous = previous;
    +						this.selectedItem = item;
    +					});
    +				}
    +
    +				if ( false !== this._trigger( "select", event, { item: item } ) ) {
    +					this._value( item.value );
    +				}
    +				// reset the term after the select event
    +				// this allows custom select handling to work properly
    +				this.term = this._value();
    +
    +				this.close( event );
    +				this.selectedItem = item;
    +			}
    +		});
    +
    +		this.liveRegion = $( "<span>", {
    +				role: "status",
    +				"aria-live": "polite"
    +			})
    +			.addClass( "ui-helper-hidden-accessible" )
    +			.insertAfter( this.element );
    +
    +		if ( $.fn.bgiframe ) {
    +			this.menu.element.bgiframe();
    +		}
    +
    +		// turning off autocomplete prevents the browser from remembering the
    +		// value when navigating through history, so we re-enable autocomplete
    +		// if the page is unloaded before the widget is destroyed. #7790
    +		this._on( this.window, {
    +			beforeunload: function() {
    +				this.element.removeAttr( "autocomplete" );
    +			}
    +		});
    +	},
    +
    +	_destroy: function() {
    +		clearTimeout( this.searching );
    +		this.element
    +			.removeClass( "ui-autocomplete-input" )
    +			.removeAttr( "autocomplete" );
    +		this.menu.element.remove();
    +		this.liveRegion.remove();
    +	},
    +
    +	_setOption: function( key, value ) {
    +		this._super( key, value );
    +		if ( key === "source" ) {
    +			this._initSource();
    +		}
    +		if ( key === "appendTo" ) {
    +			this.menu.element.appendTo( this.document.find( value || "body" )[0] );
    +		}
    +		if ( key === "disabled" && value && this.xhr ) {
    +			this.xhr.abort();
    +		}
    +	},
    +
    +	_isMultiLine: function() {
    +		// Textareas are always multi-line
    +		if ( this.element.is( "textarea" ) ) {
    +			return true;
    +		}
    +		// Inputs are always single-line, even if inside a contentEditable element
    +		// IE also treats inputs as contentEditable
    +		if ( this.element.is( "input" ) ) {
    +			return false;
    +		}
    +		// All other element types are determined by whether or not they're contentEditable
    +		return this.element.prop( "isContentEditable" );
    +	},
    +
    +	_initSource: function() {
    +		var array, url,
    +			that = this;
    +		if ( $.isArray(this.options.source) ) {
    +			array = this.options.source;
    +			this.source = function( request, response ) {
    +				response( $.ui.autocomplete.filter( array, request.term ) );
    +			};
    +		} else if ( typeof this.options.source === "string" ) {
    +			url = this.options.source;
    +			this.source = function( request, response ) {
    +				if ( that.xhr ) {
    +					that.xhr.abort();
    +				}
    +				that.xhr = $.ajax({
    +					url: url,
    +					data: request,
    +					dataType: "json",
    +					success: function( data ) {
    +						response( data );
    +					},
    +					error: function() {
    +						response( [] );
    +					}
    +				});
    +			};
    +		} else {
    +			this.source = this.options.source;
    +		}
    +	},
    +
    +	_searchTimeout: function( event ) {
    +		clearTimeout( this.searching );
    +		this.searching = this._delay(function() {
    +			// only search if the value has changed
    +			if ( this.term !== this._value() ) {
    +				this.selectedItem = null;
    +				this.search( null, event );
    +			}
    +		}, this.options.delay );
    +	},
    +
    +	search: function( value, event ) {
    +		value = value != null ? value : this._value();
    +
    +		// always save the actual value, not the one passed as an argument
    +		this.term = this._value();
    +
    +		if ( value.length < this.options.minLength ) {
    +			return this.close( event );
    +		}
    +
    +		if ( this._trigger( "search", event ) === false ) {
    +			return;
    +		}
    +
    +		return this._search( value );
    +	},
    +
    +	_search: function( value ) {
    +		this.pending++;
    +		this.element.addClass( "ui-autocomplete-loading" );
    +		this.cancelSearch = false;
    +
    +		this.source( { term: value }, this._response() );
    +	},
    +
    +	_response: function() {
    +		var that = this,
    +			index = ++requestIndex;
    +
    +		return function( content ) {
    +			if ( index === requestIndex ) {
    +				that.__response( content );
    +			}
    +
    +			that.pending--;
    +			if ( !that.pending ) {
    +				that.element.removeClass( "ui-autocomplete-loading" );
    +			}
    +		};
    +	},
    +
    +	__response: function( content ) {
    +		if ( content ) {
    +			content = this._normalize( content );
    +		}
    +		this._trigger( "response", null, { content: content } );
    +		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
    +			this._suggest( content );
    +			this._trigger( "open" );
    +		} else {
    +			// use ._close() instead of .close() so we don't cancel future searches
    +			this._close();
    +		}
    +	},
    +
    +	close: function( event ) {
    +		this.cancelSearch = true;
    +		this._close( event );
    +	},
    +
    +	_close: function( event ) {
    +		if ( this.menu.element.is( ":visible" ) ) {
    +			this.menu.element.hide();
    +			this.menu.blur();
    +			this.isNewMenu = true;
    +			this._trigger( "close", event );
    +		}
    +	},
    +
    +	_change: function( event ) {
    +		if ( this.previous !== this._value() ) {
    +			this._trigger( "change", event, { item: this.selectedItem } );
    +		}
    +	},
    +
    +	_normalize: function( items ) {
    +		// assume all items have the right format when the first item is complete
    +		if ( items.length && items[0].label && items[0].value ) {
    +			return items;
    +		}
    +		return $.map( items, function( item ) {
    +			if ( typeof item === "string" ) {
    +				return {
    +					label: item,
    +					value: item
    +				};
    +			}
    +			return $.extend({
    +				label: item.label || item.value,
    +				value: item.value || item.label
    +			}, item );
    +		});
    +	},
    +
    +	_suggest: function( items ) {
    +		var ul = this.menu.element
    +			.empty()
    +			.zIndex( this.element.zIndex() + 1 );
    +		this._renderMenu( ul, items );
    +		this.menu.refresh();
    +
    +		// size and position menu
    +		ul.show();
    +		this._resizeMenu();
    +		ul.position( $.extend({
    +			of: this.element
    +		}, this.options.position ));
    +
    +		if ( this.options.autoFocus ) {
    +			this.menu.next();
    +		}
    +	},
    +
    +	_resizeMenu: function() {
    +		var ul = this.menu.element;
    +		ul.outerWidth( Math.max(
    +			// Firefox wraps long text (possibly a rounding bug)
    +			// so we add 1px to avoid the wrapping (#7513)
    +			ul.width( "" ).outerWidth() + 1,
    +			this.element.outerWidth()
    +		) );
    +	},
    +
    +	_renderMenu: function( ul, items ) {
    +		var that = this;
    +		$.each( items, function( index, item ) {
    +			that._renderItemData( ul, item );
    +		});
    +	},
    +
    +	_renderItemData: function( ul, item ) {
    +		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
    +	},
    +
    +	_renderItem: function( ul, item ) {
    +		return $( "<li>" )
    +			.append( $( "<a>" ).text( item.label ) )
    +			.appendTo( ul );
    +	},
    +
    +	_move: function( direction, event ) {
    +		if ( !this.menu.element.is( ":visible" ) ) {
    +			this.search( null, event );
    +			return;
    +		}
    +		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
    +				this.menu.isLastItem() && /^next/.test( direction ) ) {
    +			this._value( this.term );
    +			this.menu.blur();
    +			return;
    +		}
    +		this.menu[ direction ]( event );
    +	},
    +
    +	widget: function() {
    +		return this.menu.element;
    +	},
    +
    +	_value: function() {
    +		return this.valueMethod.apply( this.element, arguments );
    +	},
    +
    +	_keyEvent: function( keyEvent, event ) {
    +		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
    +			this._move( keyEvent, event );
    +
    +			// prevents moving cursor to beginning/end of the text field in some browsers
    +			event.preventDefault();
    +		}
    +	}
    +});
    +
    +$.extend( $.ui.autocomplete, {
    +	escapeRegex: function( value ) {
    +		return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
    +	},
    +	filter: function(array, term) {
    +		var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
    +		return $.grep( array, function(value) {
    +			return matcher.test( value.label || value.value || value );
    +		});
    +	}
    +});
    +
    +
    +// live region extension, adding a `messages` option
    +// NOTE: This is an experimental API. We are still investigating
    +// a full solution for string manipulation and internationalization.
    +$.widget( "ui.autocomplete", $.ui.autocomplete, {
    +	options: {
    +		messages: {
    +			noResults: "No search results.",
    +			results: function( amount ) {
    +				return amount + ( amount > 1 ? " results are" : " result is" ) +
    +					" available, use up and down arrow keys to navigate.";
    +			}
    +		}
    +	},
    +
    +	__response: function( content ) {
    +		var message;
    +		this._superApply( arguments );
    +		if ( this.options.disabled || this.cancelSearch ) {
    +			return;
    +		}
    +		if ( content && content.length ) {
    +			message = this.options.messages.results( content.length );
    +		} else {
    +			message = this.options.messages.noResults;
    +		}
    +		this.liveRegion.text( message );
    +	}
    +});
    +
    +
    +}( jQuery ));
    +(function( $, undefined ) {
    +
    +var lastActive, startXPos, startYPos, clickDragged,
    +	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
    +	stateClasses = "ui-state-hover ui-state-active ",
    +	typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
    +	formResetHandler = function() {
    +		var buttons = $( this ).find( ":ui-button" );
    +		setTimeout(function() {
    +			buttons.button( "refresh" );
    +		}, 1 );
    +	},
    +	radioGroup = function( radio ) {
    +		var name = radio.name,
    +			form = radio.form,
    +			radios = $( [] );
    +		if ( name ) {
    +			if ( form ) {
    +				radios = $( form ).find( "[name='" + name + "']" );
    +			} else {
    +				radios = $( "[name='" + name + "']", radio.ownerDocument )
    +					.filter(function() {
    +						return !this.form;
    +					});
    +			}
    +		}
    +		return radios;
    +	};
    +
    +$.widget( "ui.button", {
    +	version: "1.9.2",
    +	defaultElement: "<button>",
    +	options: {
    +		disabled: null,
    +		text: true,
    +		label: null,
    +		icons: {
    +			primary: null,
    +			secondary: null
    +		}
    +	},
    +	_create: function() {
    +		this.element.closest( "form" )
    +			.unbind( "reset" + this.eventNamespace )
    +			.bind( "reset" + this.eventNamespace, formResetHandler );
    +
    +		if ( typeof this.options.disabled !== "boolean" ) {
    +			this.options.disabled = !!this.element.prop( "disabled" );
    +		} else {
    +			this.element.prop( "disabled", this.options.disabled );
    +		}
    +
    +		this._determineButtonType();
    +		this.hasTitle = !!this.buttonElement.attr( "title" );
    +
    +		var that = this,
    +			options = this.options,
    +			toggleButton = this.type === "checkbox" || this.type === "radio",
    +			activeClass = !toggleButton ? "ui-state-active" : "",
    +			focusClass = "ui-state-focus";
    +
    +		if ( options.label === null ) {
    +			options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
    +		}
    +
    +		this._hoverable( this.buttonElement );
    +
    +		this.buttonElement
    +			.addClass( baseClasses )
    +			.attr( "role", "button" )
    +			.bind( "mouseenter" + this.eventNamespace, function() {
    +				if ( options.disabled ) {
    +					return;
    +				}
    +				if ( this === lastActive ) {
    +					$( this ).addClass( "ui-state-active" );
    +				}
    +			})
    +			.bind( "mouseleave" + this.eventNamespace, function() {
    +				if ( options.disabled ) {
    +					return;
    +				}
    +				$( this ).removeClass( activeClass );
    +			})
    +			.bind( "click" + this.eventNamespace, function( event ) {
    +				if ( options.disabled ) {
    +					event.preventDefault();
    +					event.stopImmediatePropagation();
    +				}
    +			});
    +
    +		this.element
    +			.bind( "focus" + this.eventNamespace, function() {
    +				// no need to check disabled, focus won't be triggered anyway
    +				that.buttonElement.addClass( focusClass );
    +			})
    +			.bind( "blur" + this.eventNamespace, function() {
    +				that.buttonElement.removeClass( focusClass );
    +			});
    +
    +		if ( toggleButton ) {
    +			this.element.bind( "change" + this.eventNamespace, function() {
    +				if ( clickDragged ) {
    +					return;
    +				}
    +				that.refresh();
    +			});
    +			// if mouse moves between mousedown and mouseup (drag) set clickDragged flag
    +			// prevents issue where button state changes but checkbox/radio checked state
    +			// does not in Firefox (see ticket #6970)
    +			this.buttonElement
    +				.bind( "mousedown" + this.eventNamespace, function( event ) {
    +					if ( options.disabled ) {
    +						return;
    +					}
    +					clickDragged = false;
    +					startXPos = event.pageX;
    +					startYPos = event.pageY;
    +				})
    +				.bind( "mouseup" + this.eventNamespace, function( event ) {
    +					if ( options.disabled ) {
    +						return;
    +					}
    +					if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
    +						clickDragged = true;
    +					}
    +			});
    +		}
    +
    +		if ( this.type === "checkbox" ) {
    +			this.buttonElement.bind( "click" + this.eventNamespace, function() {
    +				if ( options.disabled || clickDragged ) {
    +					return false;
    +				}
    +				$( this ).toggleClass( "ui-state-active" );
    +				that.buttonElement.attr( "aria-pressed", that.element[0].checked );
    +			});
    +		} else if ( this.type === "radio" ) {
    +			this.buttonElement.bind( "click" + this.eventNamespace, function() {
    +				if ( options.disabled || clickDragged ) {
    +					return false;
    +				}
    +				$( this ).addClass( "ui-state-active" );
    +				that.buttonElement.attr( "aria-pressed", "true" );
    +
    +				var radio = that.element[ 0 ];
    +				radioGroup( radio )
    +					.not( radio )
    +					.map(function() {
    +						return $( this ).button( "widget" )[ 0 ];
    +					})
    +					.removeClass( "ui-state-active" )
    +					.attr( "aria-pressed", "false" );
    +			});
    +		} else {
    +			this.buttonElement
    +				.bind( "mousedown" + this.eventNamespace, function() {
    +					if ( options.disabled ) {
    +						return false;
    +					}
    +					$( this ).addClass( "ui-state-active" );
    +					lastActive = this;
    +					that.document.one( "mouseup", function() {
    +						lastActive = null;
    +					});
    +				})
    +				.bind( "mouseup" + this.eventNamespace, function() {
    +					if ( options.disabled ) {
    +						return false;
    +					}
    +					$( this ).removeClass( "ui-state-active" );
    +				})
    +				.bind( "keydown" + this.eventNamespace, function(event) {
    +					if ( options.disabled ) {
    +						return false;
    +					}
    +					if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
    +						$( this ).addClass( "ui-state-active" );
    +					}
    +				})
    +				.bind( "keyup" + this.eventNamespace, function() {
    +					$( this ).removeClass( "ui-state-active" );
    +				});
    +
    +			if ( this.buttonElement.is("a") ) {
    +				this.buttonElement.keyup(function(event) {
    +					if ( event.keyCode === $.ui.keyCode.SPACE ) {
    +						// TODO pass through original event correctly (just as 2nd argument doesn't work)
    +						$( this ).click();
    +					}
    +				});
    +			}
    +		}
    +
    +		// TODO: pull out $.Widget's handling for the disabled option into
    +		// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
    +		// be overridden by individual plugins
    +		this._setOption( "disabled", options.disabled );
    +		this._resetButton();
    +	},
    +
    +	_determineButtonType: function() {
    +		var ancestor, labelSelector, checked;
    +
    +		if ( this.element.is("[type=checkbox]") ) {
    +			this.type = "checkbox";
    +		} else if ( this.element.is("[type=radio]") ) {
    +			this.type = "radio";
    +		} else if ( this.element.is("input") ) {
    +			this.type = "input";
    +		} else {
    +			this.type = "button";
    +		}
    +
    +		if ( this.type === "checkbox" || this.type === "radio" ) {
    +			// we don't search against the document in case the element
    +			// is disconnected from the DOM
    +			ancestor = this.element.parents().last();
    +			labelSelector = "label[for='" + this.element.attr("id") + "']";
    +			this.buttonElement = ancestor.find( labelSelector );
    +			if ( !this.buttonElement.length ) {
    +				ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
    +				this.buttonElement = ancestor.filter( labelSelector );
    +				if ( !this.buttonElement.length ) {
    +					this.buttonElement = ancestor.find( labelSelector );
    +				}
    +			}
    +			this.element.addClass( "ui-helper-hidden-accessible" );
    +
    +			checked = this.element.is( ":checked" );
    +			if ( checked ) {
    +				this.buttonElement.addClass( "ui-state-active" );
    +			}
    +			this.buttonElement.prop( "aria-pressed", checked );
    +		} else {
    +			this.buttonElement = this.element;
    +		}
    +	},
    +
    +	widget: function() {
    +		return this.buttonElement;
    +	},
    +
    +	_destroy: function() {
    +		this.element
    +			.removeClass( "ui-helper-hidden-accessible" );
    +		this.buttonElement
    +			.removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
    +			.removeAttr( "role" )
    +			.removeAttr( "aria-pressed" )
    +			.html( this.buttonElement.find(".ui-button-text").html() );
    +
    +		if ( !this.hasTitle ) {
    +			this.buttonElement.removeAttr( "title" );
    +		}
    +	},
    +
    +	_setOption: function( key, value ) {
    +		this._super( key, value );
    +		if ( key === "disabled" ) {
    +			if ( value ) {
    +				this.element.prop( "disabled", true );
    +			} else {
    +				this.element.prop( "disabled", false );
    +			}
    +			return;
    +		}
    +		this._resetButton();
    +	},
    +
    +	refresh: function() {
    +		//See #8237 & #8828
    +		var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
    +
    +		if ( isDisabled !== this.options.disabled ) {
    +			this._setOption( "disabled", isDisabled );
    +		}
    +		if ( this.type === "radio" ) {
    +			radioGroup( this.element[0] ).each(function() {
    +				if ( $( this ).is( ":checked" ) ) {
    +					$( this ).button( "widget" )
    +						.addClass( "ui-state-active" )
    +						.attr( "aria-pressed", "true" );
    +				} else {
    +					$( this ).button( "widget" )
    +						.removeClass( "ui-state-active" )
    +						.attr( "aria-pressed", "false" );
    +				}
    +			});
    +		} else if ( this.type === "checkbox" ) {
    +			if ( this.element.is( ":checked" ) ) {
    +				this.buttonElement
    +					.addClass( "ui-state-active" )
    +					.attr( "aria-pressed", "true" );
    +			} else {
    +				this.buttonElement
    +					.removeClass( "ui-state-active" )
    +					.attr( "aria-pressed", "false" );
    +			}
    +		}
    +	},
    +
    +	_resetButton: function() {
    +		if ( this.type === "input" ) {
    +			if ( this.options.label ) {
    +				this.element.val( this.options.label );
    +			}
    +			return;
    +		}
    +		var buttonElement = this.buttonElement.removeClass( typeClasses ),
    +			buttonText = $( "<span></span>", this.document[0] )
    +				.addClass( "ui-button-text" )
    +				.html( this.options.label )
    +				.appendTo( buttonElement.empty() )
    +				.text(),
    +			icons = this.options.icons,
    +			multipleIcons = icons.primary && icons.secondary,
    +			buttonClasses = [];
    +
    +		if ( icons.primary || icons.secondary ) {
    +			if ( this.options.text ) {
    +				buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
    +			}
    +
    +			if ( icons.primary ) {
    +				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
    +			}
    +
    +			if ( icons.secondary ) {
    +				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
    +			}
    +
    +			if ( !this.options.text ) {
    +				buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
    +
    +				if ( !this.hasTitle ) {
    +					buttonElement.attr( "title", $.trim( buttonText ) );
    +				}
    +			}
    +		} else {
    +			buttonClasses.push( "ui-button-text-only" );
    +		}
    +		buttonElement.addClass( buttonClasses.join( " " ) );
    +	}
    +});
    +
    +$.widget( "ui.buttonset", {
    +	version: "1.9.2",
    +	options: {
    +		items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(button)"
    +	},
    +
    +	_create: function() {
    +		this.element.addClass( "ui-buttonset" );
    +	},
    +
    +	_init: function() {
    +		this.refresh();
    +	},
    +
    +	_setOption: function( key, value ) {
    +		if ( key === "disabled" ) {
    +			this.buttons.button( "option", key, value );
    +		}
    +
    +		this._super( key, value );
    +	},
    +
    +	refresh: function() {
    +		var rtl = this.element.css( "direction" ) === "rtl";
    +
    +		this.buttons = this.element.find( this.options.items )
    +			.filter( ":ui-button" )
    +				.button( "refresh" )
    +			.end()
    +			.not( ":ui-button" )
    +				.button()
    +			.end()
    +			.map(function() {
    +				return $( this ).button( "widget" )[ 0 ];
    +			})
    +				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
    +				.filter( ":first" )
    +					.addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
    +				.end()
    +				.filter( ":last" )
    +					.addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
    +				.end()
    +			.end();
    +	},
    +
    +	_destroy: function() {
    +		this.element.removeClass( "ui-buttonset" );
    +		this.buttons
    +			.map(function() {
    +				return $( this ).button( "widget" )[ 0 ];
    +			})
    +				.removeClass( "ui-corner-left ui-corner-right" )
    +			.end()
    +			.button( "destroy" );
    +	}
    +});
    +
    +}( jQuery ) );
    +(function( $, undefined ) {
    +
    +$.extend($.ui, { datepicker: { version: "1.9.2" } });
    +
    +var PROP_NAME = 'datepicker';
    +var dpuuid = new Date().getTime();
    +var instActive;
    +
    +/* Date picker manager.
    +   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
    +   Settings for (groups of) date pickers are maintained in an instance object,
    +   allowing multiple different settings on the same page. */
    +
    +function Datepicker() {
    +	this.debug = false; // Change this to true to start debugging
    +	this._curInst = null; // The current instance in use
    +	this._keyEvent = false; // If the last event was a key event
    +	this._disabledInputs = []; // List of date picker inputs that have been disabled
    +	this._datepickerShowing = false; // True if the popup picker is showing , false if not
    +	this._inDialog = false; // True if showing within a "dialog", false if not
    +	this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
    +	this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
    +	this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
    +	this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
    +	this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
    +	this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
    +	this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
    +	this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
    +	this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
    +	this.regional = []; // Available regional settings, indexed by language code
    +	this.regional[''] = { // Default regional settings
    +		closeText: 'Done', // Display text for close link
    +		prevText: 'Prev', // Display text for previous month link
    +		nextText: 'Next', // Display text for next month link
    +		currentText: 'Today', // Display text for current month link
    +		monthNames: ['January','February','March','April','May','June',
    +			'July','August','September','October','November','December'], // Names of months for drop-down and formatting
    +		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
    +		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
    +		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
    +		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
    +		weekHeader: 'Wk', // Column header for week of the year
    +		dateFormat: 'mm/dd/yy', // See format options on parseDate
    +		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
    +		isRTL: false, // True if right-to-left language, false if left-to-right
    +		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
    +		yearSuffix: '' // Additional text to append to the year in the month headers
    +	};
    +	this._defaults = { // Global defaults for all the date picker instances
    +		showOn: 'focus', // 'focus' for popup on focus,
    +			// 'button' for trigger button, or 'both' for either
    +		showAnim: 'fadeIn', // Name of jQuery animation for popup
    +		showOptions: {}, // Options for enhanced animations
    +		defaultDate: null, // Used when field is blank: actual date,
    +			// +/-number for offset from today, null for today
    +		appendText: '', // Display text following the input box, e.g. showing the format
    +		buttonText: '...', // Text for trigger button
    +		buttonImage: '', // URL for trigger button image
    +		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
    +		hideIfNoPrevNext: false, // True to hide next/previous month links
    +			// if not applicable, false to just disable them
    +		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
    +		gotoCurrent: false, // True if today link goes back to current selection instead
    +		changeMonth: false, // True if month can be selected directly, false if only prev/next
    +		changeYear: false, // True if year can be selected directly, false if only prev/next
    +		yearRange: 'c-10:c+10', // Range of years to display in drop-down,
    +			// either relative to today's year (-nn:+nn), relative to currently displayed year
    +			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
    +		showOtherMonths: false, // True to show dates in other months, false to leave blank
    +		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
    +		showWeek: false, // True to show week of the year, false to not show it
    +		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
    +			// takes a Date and returns the number of the week for it
    +		shortYearCutoff: '+10', // Short year values < this are in the current century,
    +			// > this are in the previous century,
    +			// string value starting with '+' for current year + value
    +		minDate: null, // The earliest selectable date, or null for no limit
    +		maxDate: null, // The latest selectable date, or null for no limit
    +		duration: 'fast', // Duration of display/closure
    +		beforeShowDay: null, // Function that takes a date and returns an array with
    +			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
    +			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
    +		beforeShow: null, // Function that takes an input field and
    +			// returns a set of custom settings for the date picker
    +		onSelect: null, // Define a callback function when a date is selected
    +		onChangeMonthYear: null, // Define a callback function when the month or year is changed
    +		onClose: null, // Define a callback function when the datepicker is closed
    +		numberOfMonths: 1, // Number of months to show at a time
    +		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
    +		stepMonths: 1, // Number of months to step back/forward
    +		stepBigMonths: 12, // Number of months to step back/forward for the big links
    +		altField: '', // Selector for an alternate field to store selected dates into
    +		altFormat: '', // The date format to use for the alternate field
    +		constrainInput: true, // The input is constrained by the current date format
    +		showButtonPanel: false, // True to show button panel, false to not show it
    +		autoSize: false, // True to size the input for the date format, false to leave as is
    +		disabled: false // The initial disabled state
    +	};
    +	$.extend(this._defaults, this.regional['']);
    +	this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'));
    +}
    +
    +$.extend(Datepicker.prototype, {
    +	/* Class name added to elements to indicate already configured with a date picker. */
    +	markerClassName: 'hasDatepicker',
    +
    +	//Keep track of the maximum number of rows displayed (see #7043)
    +	maxRows: 4,
    +
    +	/* Debug logging (if enabled). */
    +	log: function () {
    +		if (this.debug)
    +			console.log.apply('', arguments);
    +	},
    +
    +	// TODO rename to "widget" when switching to widget factory
    +	_widgetDatepicker: function() {
    +		return this.dpDiv;
    +	},
    +
    +	/* Override the default settings for all instances of the date picker.
    +	   @param  settings  object - the new settings to use as defaults (anonymous object)
    +	   @return the manager object */
    +	setDefaults: function(settings) {
    +		extendRemove(this._defaults, settings || {});
    +		return this;
    +	},
    +
    +	/* Attach the date picker to a jQuery selection.
    +	   @param  target    element - the target input field or division or span
    +	   @param  settings  object - the new settings to use for this date picker instance (anonymous) */
    +	_attachDatepicker: function(target, settings) {
    +		// check for settings on the control itself - in namespace 'date:'
    +		var inlineSettings = null;
    +		for (var attrName in this._defaults) {
    +			var attrValue = target.getAttribute('date:' + attrName);
    +			if (attrValue) {
    +				inlineSettings = inlineSettings || {};
    +				try {
    +					inlineSettings[attrName] = eval(attrValue);
    +				} catch (err) {
    +					inlineSettings[attrName] = attrValue;
    +				}
    +			}
    +		}
    +		var nodeName = target.nodeName.toLowerCase();
    +		var inline = (nodeName == 'div' || nodeName == 'span');
    +		if (!target.id) {
    +			this.uuid += 1;
    +			target.id = 'dp' + this.uuid;
    +		}
    +		var inst = this._newInst($(target), inline);
    +		inst.settings = $.extend({}, settings || {}, inlineSettings || {});
    +		if (nodeName == 'input') {
    +			this._connectDatepicker(target, inst);
    +		} else if (inline) {
    +			this._inlineDatepicker(target, inst);
    +		}
    +	},
    +
    +	/* Create a new instance object. */
    +	_newInst: function(target, inline) {
    +		var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
    +		return {id: id, input: target, // associated target
    +			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
    +			drawMonth: 0, drawYear: 0, // month being drawn
    +			inline: inline, // is datepicker inline or not
    +			dpDiv: (!inline ? this.dpDiv : // presentation div
    +			bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))};
    +	},
    +
    +	/* Attach the date picker to an input field. */
    +	_connectDatepicker: function(target, inst) {
    +		var input = $(target);
    +		inst.append = $([]);
    +		inst.trigger = $([]);
    +		if (input.hasClass(this.markerClassName))
    +			return;
    +		this._attachments(input, inst);
    +		input.addClass(this.markerClassName).keydown(this._doKeyDown).
    +			keypress(this._doKeyPress).keyup(this._doKeyUp).
    +			bind("setData.datepicker", function(event, key, value) {
    +				inst.settings[key] = value;
    +			}).bind("getData.datepicker", function(event, key) {
    +				return this._get(inst, key);
    +			});
    +		this._autoSize(inst);
    +		$.data(target, PROP_NAME, inst);
    +		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
    +		if( inst.settings.disabled ) {
    +			this._disableDatepicker( target );
    +		}
    +	},
    +
    +	/* Make attachments based on settings. */
    +	_attachments: function(input, inst) {
    +		var appendText = this._get(inst, 'appendText');
    +		var isRTL = this._get(inst, 'isRTL');
    +		if (inst.append)
    +			inst.append.remove();
    +		if (appendText) {
    +			inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
    +			input[isRTL ? 'before' : 'after'](inst.append);
    +		}
    +		input.unbind('focus', this._showDatepicker);
    +		if (inst.trigger)
    +			inst.trigger.remove();
    +		var showOn = this._get(inst, 'showOn');
    +		if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
    +			input.focus(this._showDatepicker);
    +		if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
    +			var buttonText = this._get(inst, 'buttonText');
    +			var buttonImage = this._get(inst, 'buttonImage');
    +			inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
    +				$('<img/>').addClass(this._triggerClass).
    +					attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
    +				$('<button type="button"></button>').addClass(this._triggerClass).
    +					html(buttonImage == '' ? buttonText : $('<img/>').attr(
    +					{ src:buttonImage, alt:buttonText, title:buttonText })));
    +			input[isRTL ? 'before' : 'after'](inst.trigger);
    +			inst.trigger.click(function() {
    +				if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
    +					$.datepicker._hideDatepicker();
    +				else if ($.datepicker._datepickerShowing && $.datepicker._lastInput != input[0]) {
    +					$.datepicker._hideDatepicker();
    +					$.datepicker._showDatepicker(input[0]);
    +				} else
    +					$.datepicker._showDatepicker(input[0]);
    +				return false;
    +			});
    +		}
    +	},
    +
    +	/* Apply the maximum length for the date format. */
    +	_autoSize: function(inst) {
    +		if (this._get(inst, 'autoSize') && !inst.inline) {
    +			var date = new Date(2009, 12 - 1, 20); // Ensure double digits
    +			var dateFormat = this._get(inst, 'dateFormat');
    +			if (dateFormat.match(/[DM]/)) {
    +				var findMax = function(names) {
    +					var max = 0;
    +					var maxI = 0;
    +					for (var i = 0; i < names.length; i++) {
    +						if (names[i].length > max) {
    +							max = names[i].length;
    +							maxI = i;
    +						}
    +					}
    +					return maxI;
    +				};
    +				date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
    +					'monthNames' : 'monthNamesShort'))));
    +				date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
    +					'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
    +			}
    +			inst.input.attr('size', this._formatDate(inst, date).length);
    +		}
    +	},
    +
    +	/* Attach an inline date picker to a div. */
    +	_inlineDatepicker: function(target, inst) {
    +		var divSpan = $(target);
    +		if (divSpan.hasClass(this.markerClassName))
    +			return;
    +		divSpan.addClass(this.markerClassName).append(inst.dpDiv).
    +			bind("setData.datepicker", function(event, key, value){
    +				inst.settings[key] = value;
    +			}).bind("getData.datepicker", function(event, key){
    +				return this._get(inst, key);
    +			});
    +		$.data(target, PROP_NAME, inst);
    +		this._setDate(inst, this._getDefaultDate(inst), true);
    +		this._updateDatepicker(inst);
    +		this._updateAlternate(inst);
    +		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
    +		if( inst.settings.disabled ) {
    +			this._disableDatepicker( target );
    +		}
    +		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
    +		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
    +		inst.dpDiv.css( "display", "block" );
    +	},
    +
    +	/* Pop-up the date picker in a "dialog" box.
    +	   @param  input     element - ignored
    +	   @param  date      string or Date - the initial date to display
    +	   @param  onSelect  function - the function to call when a date is selected
    +	   @param  settings  object - update the dialog date picker instance's settings (anonymous object)
    +	   @param  pos       int[2] - coordinates for the dialog's position within the screen or
    +	                     event - with x/y coordinates or
    +	                     leave empty for default (screen centre)
    +	   @return the manager object */
    +	_dialogDatepicker: function(input, date, onSelect, settings, pos) {
    +		var inst = this._dialogInst; // internal instance
    +		if (!inst) {
    +			this.uuid += 1;
    +			var id = 'dp' + this.uuid;
    +			this._dialogInput = $('<input type="text" id="' + id +
    +				'" style="position: absolute; top: -100px; width: 0px;"/>');
    +			this._dialogInput.keydown(this._doKeyDown);
    +			$('body').append(this._dialogInput);
    +			inst = this._dialogInst = this._newInst(this._dialogInput, false);
    +			inst.settings = {};
    +			$.data(this._dialogInput[0], PROP_NAME, inst);
    +		}
    +		extendRemove(inst.settings, settings || {});
    +		date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
    +		this._dialogInput.val(date);
    +
    +		this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
    +		if (!this._pos) {
    +			var browserWidth = document.documentElement.clientWidth;
    +			var browserHeight = document.documentElement.clientHeight;
    +			var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
    +			var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
    +			this._pos = // should use actual width/height below
    +				[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
    +		}
    +
    +		// move input on screen for focus, but hidden behind dialog
    +		this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
    +		inst.settings.onSelect = onSelect;
    +		this._inDialog = true;
    +		this.dpDiv.addClass(this._dialogClass);
    +		this._showDatepicker(this._dialogInput[0]);
    +		if ($.blockUI)
    +			$.blockUI(this.dpDiv);
    +		$.data(this._dialogInput[0], PROP_NAME, inst);
    +		return this;
    +	},
    +
    +	/* Detach a datepicker from its control.
    +	   @param  target    element - the target input field or division or span */
    +	_destroyDatepicker: function(target) {
    +		var $target = $(target);
    +		var inst = $.data(target, PROP_NAME);
    +		if (!$target.hasClass(this.markerClassName)) {
    +			return;
    +		}
    +		var nodeName = target.nodeName.toLowerCase();
    +		$.removeData(target, PROP_NAME);
    +		if (nodeName == 'input') {
    +			inst.append.remove();
    +			inst.trigger.remove();
    +			$target.removeClass(this.markerClassName).
    +				unbind('focus', this._showDatepicker).
    +				unbind('keydown', this._doKeyDown).
    +				unbind('keypress', this._doKeyPress).
    +				unbind('keyup', this._doKeyUp);
    +		} else if (nodeName == 'div' || nodeName == 'span')
    +			$target.removeClass(this.markerClassName).empty();
    +	},
    +
    +	/* Enable the date picker to a jQuery selection.
    +	   @param  target    element - the target input field or division or span */
    +	_enableDatepicker: function(target) {
    +		var $target = $(target);
    +		var inst = $.data(target, PROP_NAME);
    +		if (!$target.hasClass(this.markerClassName)) {
    +			return;
    +		}
    +		var nodeName = target.nodeName.toLowerCase();
    +		if (nodeName == 'input') {
    +			target.disabled = false;
    +			inst.trigger.filter('button').
    +				each(function() { this.disabled = false; }).end().
    +				filter('img').css({opacity: '1.0', cursor: ''});
    +		}
    +		else if (nodeName == 'div' || nodeName == 'span') {
    +			var inline = $target.children('.' + this._inlineClass);
    +			inline.children().removeClass('ui-state-disabled');
    +			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
    +				prop("disabled", false);
    +		}
    +		this._disabledInputs = $.map(this._disabledInputs,
    +			function(value) { return (value == target ? null : value); }); // delete entry
    +	},
    +
    +	/* Disable the date picker to a jQuery selection.
    +	   @param  target    element - the target input field or division or span */
    +	_disableDatepicker: function(target) {
    +		var $target = $(target);
    +		var inst = $.data(target, PROP_NAME);
    +		if (!$target.hasClass(this.markerClassName)) {
    +			return;
    +		}
    +		var nodeName = target.nodeName.toLowerCase();
    +		if (nodeName == 'input') {
    +			target.disabled = true;
    +			inst.trigger.filter('button').
    +				each(function() { this.disabled = true; }).end().
    +				filter('img').css({opacity: '0.5', cursor: 'default'});
    +		}
    +		else if (nodeName == 'div' || nodeName == 'span') {
    +			var inline = $target.children('.' + this._inlineClass);
    +			inline.children().addClass('ui-state-disabled');
    +			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
    +				prop("disabled", true);
    +		}
    +		this._disabledInputs = $.map(this._disabledInputs,
    +			function(value) { return (value == target ? null : value); }); // delete entry
    +		this._disabledInputs[this._disabledInputs.length] = target;
    +	},
    +
    +	/* Is the first field in a jQuery collection disabled as a datepicker?
    +	   @param  target    element - the target input field or division or span
    +	   @return boolean - true if disabled, false if enabled */
    +	_isDisabledDatepicker: function(target) {
    +		if (!target) {
    +			return false;
    +		}
    +		for (var i = 0; i < this._disabledInputs.length; i++) {
    +			if (this._disabledInputs[i] == target)
    +				return true;
    +		}
    +		return false;
    +	},
    +
    +	/* Retrieve the instance data for the target control.
    +	   @param  target  element - the target input field or division or span
    +	   @return  object - the associated instance data
    +	   @throws  error if a jQuery problem getting data */
    +	_getInst: function(target) {
    +		try {
    +			return $.data(target, PROP_NAME);
    +		}
    +		catch (err) {
    +			throw 'Missing instance data for this datepicker';
    +		}
    +	},
    +
    +	/* Update or retrieve the settings for a date picker attached to an input field or division.
    +	   @param  target  element - the target input field or division or span
    +	   @param  name    object - the new settings to update or
    +	                   string - the name of the setting to change or retrieve,
    +	                   when retrieving also 'all' for all instance settings or
    +	                   'defaults' for all global defaults
    +	   @param  value   any - the new value for the setting
    +	                   (omit if above is an object or to retrieve a value) */
    +	_optionDatepicker: function(target, name, value) {
    +		var inst = this._getInst(target);
    +		if (arguments.length == 2 && typeof name == 'string') {
    +			return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
    +				(inst ? (name == 'all' ? $.extend({}, inst.settings) :
    +				this._get(inst, name)) : null));
    +		}
    +		var settings = name || {};
    +		if (typeof name == 'string') {
    +			settings = {};
    +			settings[name] = value;
    +		}
    +		if (inst) {
    +			if (this._curInst == inst) {
    +				this._hideDatepicker();
    +			}
    +			var date = this._getDateDatepicker(target, true);
    +			var minDate = this._getMinMaxDate(inst, 'min');
    +			var maxDate = this._getMinMaxDate(inst, 'max');
    +			extendRemove(inst.settings, settings);
    +			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
    +			if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined)
    +				inst.settings.minDate = this._formatDate(inst, minDate);
    +			if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined)
    +				inst.settings.maxDate = this._formatDate(inst, maxDate);
    +			this._attachments($(target), inst);
    +			this._autoSize(inst);
    +			this._setDate(inst, date);
    +			this._updateAlternate(inst);
    +			this._updateDatepicker(inst);
    +		}
    +	},
    +
    +	// change method deprecated
    +	_changeDatepicker: function(target, name, value) {
    +		this._optionDatepicker(target, name, value);
    +	},
    +
    +	/* Redraw the date picker attached to an input field or division.
    +	   @param  target  element - the target input field or division or span */
    +	_refreshDatepicker: function(target) {
    +		var inst = this._getInst(target);
    +		if (inst) {
    +			this._updateDatepicker(inst);
    +		}
    +	},
    +
    +	/* Set the dates for a jQuery selection.
    +	   @param  target   element - the target input field or division or span
    +	   @param  date     Date - the new date */
    +	_setDateDatepicker: function(target, date) {
    +		var inst = this._getInst(target);
    +		if (inst) {
    +			this._setDate(inst, date);
    +			this._updateDatepicker(inst);
    +			this._updateAlternate(inst);
    +		}
    +	},
    +
    +	/* Get the date(s) for the first entry in a jQuery selection.
    +	   @param  target     element - the target input field or division or span
    +	   @param  noDefault  boolean - true if no default date is to be used
    +	   @return Date - the current date */
    +	_getDateDatepicker: function(target, noDefault) {
    +		var inst = this._getInst(target);
    +		if (inst && !inst.inline)
    +			this._setDateFromField(inst, noDefault);
    +		return (inst ? this._getDate(inst) : null);
    +	},
    +
    +	/* Handle keystrokes. */
    +	_doKeyDown: function(event) {
    +		var inst = $.datepicker._getInst(event.target);
    +		var handled = true;
    +		var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
    +		inst._keyEvent = true;
    +		if ($.datepicker._datepickerShowing)
    +			switch (event.keyCode) {
    +				case 9: $.datepicker._hideDatepicker();
    +						handled = false;
    +						break; // hide on tab out
    +				case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' +
    +									$.datepicker._currentClass + ')', inst.dpDiv);
    +						if (sel[0])
    +							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
    +							var onSelect = $.datepicker._get(inst, 'onSelect');
    +							if (onSelect) {
    +								var dateStr = $.datepicker._formatDate(inst);
    +
    +								// trigger custom callback
    +								onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
    +							}
    +						else
    +							$.datepicker._hideDatepicker();
    +						return false; // don't submit the form
    +						break; // select the value on enter
    +				case 27: $.datepicker._hideDatepicker();
    +						break; // hide on escape
    +				case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
    +							-$.datepicker._get(inst, 'stepBigMonths') :
    +							-$.datepicker._get(inst, 'stepMonths')), 'M');
    +						break; // previous month/year on page up/+ ctrl
    +				case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
    +							+$.datepicker._get(inst, 'stepBigMonths') :
    +							+$.datepicker._get(inst, 'stepMonths')), 'M');
    +						break; // next month/year on page down/+ ctrl
    +				case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
    +						handled = event.ctrlKey || event.metaKey;
    +						break; // clear on ctrl or command +end
    +				case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
    +						handled = event.ctrlKey || event.metaKey;
    +						break; // current on ctrl or command +home
    +				case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
    +						handled = event.ctrlKey || event.metaKey;
    +						// -1 day on ctrl or command +left
    +						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
    +									-$.datepicker._get(inst, 'stepBigMonths') :
    +									-$.datepicker._get(inst, 'stepMonths')), 'M');
    +						// next month/year on alt +left on Mac
    +						break;
    +				case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
    +						handled = event.ctrlKey || event.metaKey;
    +						break; // -1 week on ctrl or command +up
    +				case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
    +						handled = event.ctrlKey || event.metaKey;
    +						// +1 day on ctrl or command +right
    +						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
    +									+$.datepicker._get(inst, 'stepBigMonths') :
    +									+$.datepicker._get(inst, 'stepMonths')), 'M');
    +						// next month/year on alt +right
    +						break;
    +				case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
    +						handled = event.ctrlKey || event.metaKey;
    +						break; // +1 week on ctrl or command +down
    +				default: handled = false;
    +			}
    +		else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
    +			$.datepicker._showDatepicker(this);
    +		else {
    +			handled = false;
    +		}
    +		if (handled) {
    +			event.preventDefault();
    +			event.stopPropagation();
    +		}
    +	},
    +
    +	/* Filter entered characters - based on date format. */
    +	_doKeyPress: function(event) {
    +		var inst = $.datepicker._getInst(event.target);
    +		if ($.datepicker._get(inst, 'constrainInput')) {
    +			var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
    +			var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
    +			return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
    +		}
    +	},
    +
    +	/* Synchronise manual entry and field/alternate field. */
    +	_doKeyUp: function(event) {
    +		var inst = $.datepicker._getInst(event.target);
    +		if (inst.input.val() != inst.lastVal) {
    +			try {
    +				var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
    +					(inst.input ? inst.input.val() : null),
    +					$.datepicker._getFormatConfig(inst));
    +				if (date) { // only if valid
    +					$.datepicker._setDateFromField(inst);
    +					$.datepicker._updateAlternate(inst);
    +					$.datepicker._updateDatepicker(inst);
    +				}
    +			}
    +			catch (err) {
    +				$.datepicker.log(err);
    +			}
    +		}
    +		return true;
    +	},
    +
    +	/* Pop-up the date picker for a given input field.
    +	   If false returned from beforeShow event handler do not show.
    +	   @param  input  element - the input field attached to the date picker or
    +	                  event - if triggered by focus */
    +	_showDatepicker: function(input) {
    +		input = input.target || input;
    +		if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
    +			input = $('input', input.parentNode)[0];
    +		if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
    +			return;
    +		var inst = $.datepicker._getInst(input);
    +		if ($.datepicker._curInst && $.datepicker._curInst != inst) {
    +			$.datepicker._curInst.dpDiv.stop(true, true);
    +			if ( inst && $.datepicker._datepickerShowing ) {
    +				$.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
    +			}
    +		}
    +		var beforeShow = $.datepicker._get(inst, 'beforeShow');
    +		var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
    +		if(beforeShowSettings === false){
    +			//false
    +			return;
    +		}
    +		extendRemove(inst.settings, beforeShowSettings);
    +		inst.lastVal = null;
    +		$.datepicker._lastInput = input;
    +		$.datepicker._setDateFromField(inst);
    +		if ($.datepicker._inDialog) // hide cursor
    +			input.value = '';
    +		if (!$.datepicker._pos) { // position below input
    +			$.datepicker._pos = $.datepicker._findPos(input);
    +			$.datepicker._pos[1] += input.offsetHeight; // add the height
    +		}
    +		var isFixed = false;
    +		$(input).parents().each(function() {
    +			isFixed |= $(this).css('position') == 'fixed';
    +			return !isFixed;
    +		});
    +		var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
    +		$.datepicker._pos = null;
    +		//to avoid flashes on Firefox
    +		inst.dpDiv.empty();
    +		// determine sizing offscreen
    +		inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
    +		$.datepicker._updateDatepicker(inst);
    +		// fix width for dynamic number of date pickers
    +		// and adjust position before showing
    +		offset = $.datepicker._checkOffset(inst, offset, isFixed);
    +		inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
    +			'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
    +			left: offset.left + 'px', top: offset.top + 'px'});
    +		if (!inst.inline) {
    +			var showAnim = $.datepicker._get(inst, 'showAnim');
    +			var duration = $.datepicker._get(inst, 'duration');
    +			var postProcess = function() {
    +				var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
    +				if( !! cover.length ){
    +					var borders = $.datepicker._getBorders(inst.dpDiv);
    +					cover.css({left: -borders[0], top: -borders[1],
    +						width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
    +				}
    +			};
    +			inst.dpDiv.zIndex($(input).zIndex()+1);
    +			$.datepicker._datepickerShowing = true;
    +
    +			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
    +			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
    +				inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
    +			else
    +				inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
    +			if (!showAnim || !duration)
    +				postProcess();
    +			if (inst.input.is(':visible') && !inst.input.is(':disabled'))
    +				inst.input.focus();
    +			$.datepicker._curInst = inst;
    +		}
    +	},
    +
    +	/* Generate the date picker content. */
    +	_updateDatepicker: function(inst) {
    +		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
    +		var borders = $.datepicker._getBorders(inst.dpDiv);
    +		instActive = inst; // for delegate hover events
    +		inst.dpDiv.empty().append(this._generateHTML(inst));
    +		this._attachHandlers(inst);
    +		var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
    +		if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
    +			cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
    +		}
    +		inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover();
    +		var numMonths = this._getNumberOfMonths(inst);
    +		var cols = numMonths[1];
    +		var width = 17;
    +		inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
    +		if (cols > 1)
    +			inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
    +		inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
    +			'Class']('ui-datepicker-multi');
    +		inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
    +			'Class']('ui-datepicker-rtl');
    +		if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
    +				// #6694 - don't focus the input if it's already focused
    +				// this breaks the change event in IE
    +				inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
    +			inst.input.focus();
    +		// deffered render of the years select (to avoid flashes on Firefox)
    +		if( inst.yearshtml ){
    +			var origyearshtml = inst.yearshtml;
    +			setTimeout(function(){
    +				//assure that inst.yearshtml didn't change.
    +				if( origyearshtml === inst.yearshtml && inst.yearshtml ){
    +					inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
    +				}
    +				origyearshtml = inst.yearshtml = null;
    +			}, 0);
    +		}
    +	},
    +
    +	/* Retrieve the size of left and top borders for an element.
    +	   @param  elem  (jQuery object) the element of interest
    +	   @return  (number[2]) the left and top borders */
    +	_getBorders: function(elem) {
    +		var convert = function(value) {
    +			return {thin: 1, medium: 2, thick: 3}[value] || value;
    +		};
    +		return [parseFloat(convert(elem.css('border-left-width'))),
    +			parseFloat(convert(elem.css('border-top-width')))];
    +	},
    +
    +	/* Check positioning to remain on screen. */
    +	_checkOffset: function(inst, offset, isFixed) {
    +		var dpWidth = inst.dpDiv.outerWidth();
    +		var dpHeight = inst.dpDiv.outerHeight();
    +		var inputWidth = inst.input ? inst.input.outerWidth() : 0;
    +		var inputHeight = inst.input ? inst.input.outerHeight() : 0;
    +		var viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft());
    +		var viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
    +
    +		offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
    +		offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
    +		offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
    +
    +		// now check if datepicker is showing outside window viewport - move to a better place if so.
    +		offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
    +			Math.abs(offset.left + dpWidth - viewWidth) : 0);
    +		offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
    +			Math.abs(dpHeight + inputHeight) : 0);
    +
    +		return offset;
    +	},
    +
    +	/* Find an object's position on the screen. */
    +	_findPos: function(obj) {
    +		var inst = this._getInst(obj);
    +		var isRTL = this._get(inst, 'isRTL');
    +		while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
    +			obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
    +		}
    +		var position = $(obj).offset();
    +		return [position.left, position.top];
    +	},
    +
    +	/* Hide the date picker from view.
    +	   @param  input  element - the input field attached to the date picker */
    +	_hideDatepicker: function(input) {
    +		var inst = this._curInst;
    +		if (!inst || (input && inst != $.data(input, PROP_NAME)))
    +			return;
    +		if (this._datepickerShowing) {
    +			var showAnim = this._get(inst, 'showAnim');
    +			var duration = this._get(inst, 'duration');
    +			var postProcess = function() {
    +				$.datepicker._tidyDialog(inst);
    +			};
    +
    +			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
    +			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
    +				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
    +			else
    +				inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
    +					(showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
    +			if (!showAnim)
    +				postProcess();
    +			this._datepickerShowing = false;
    +			var onClose = this._get(inst, 'onClose');
    +			if (onClose)
    +				onClose.apply((inst.input ? inst.input[0] : null),
    +					[(inst.input ? inst.input.val() : ''), inst]);
    +			this._lastInput = null;
    +			if (this._inDialog) {
    +				this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
    +				if ($.blockUI) {
    +					$.unblockUI();
    +					$('body').append(this.dpDiv);
    +				}
    +			}
    +			this._inDialog = false;
    +		}
    +	},
    +
    +	/* Tidy up after a dialog display. */
    +	_tidyDialog: function(inst) {
    +		inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
    +	},
    +
    +	/* Close date picker if clicked elsewhere. */
    +	_checkExternalClick: function(event) {
    +		if (!$.datepicker._curInst)
    +			return;
    +
    +		var $target = $(event.target),
    +			inst = $.datepicker._getInst($target[0]);
    +
    +		if ( ( ( $target[0].id != $.datepicker._mainDivId &&
    +				$target.parents('#' + $.datepicker._mainDivId).length == 0 &&
    +				!$target.hasClass($.datepicker.markerClassName) &&
    +				!$target.closest("." + $.datepicker._triggerClass).length &&
    +				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
    +			( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst != inst ) )
    +			$.datepicker._hideDatepicker();
    +	},
    +
    +	/* Adjust one of the date sub-fields. */
    +	_adjustDate: function(id, offset, period) {
    +		var target = $(id);
    +		var inst = this._getInst(target[0]);
    +		if (this._isDisabledDatepicker(target[0])) {
    +			return;
    +		}
    +		this._adjustInstDate(inst, offset +
    +			(period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
    +			period);
    +		this._updateDatepicker(inst);
    +	},
    +
    +	/* Action for current link. */
    +	_gotoToday: function(id) {
    +		var target = $(id);
    +		var inst = this._getInst(target[0]);
    +		if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
    +			inst.selectedDay = inst.currentDay;
    +			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
    +			inst.drawYear = inst.selectedYear = inst.currentYear;
    +		}
    +		else {
    +			var date = new Date();
    +			inst.selectedDay = date.getDate();
    +			inst.drawMonth = inst.selectedMonth = date.getMonth();
    +			inst.drawYear = inst.selectedYear = date.getFullYear();
    +		}
    +		this._notifyChange(inst);
    +		this._adjustDate(target);
    +	},
    +
    +	/* Action for selecting a new month/year. */
    +	_selectMonthYear: function(id, select, period) {
    +		var target = $(id);
    +		var inst = this._getInst(target[0]);
    +		inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
    +		inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
    +			parseInt(select.options[select.selectedIndex].value,10);
    +		this._notifyChange(inst);
    +		this._adjustDate(target);
    +	},
    +
    +	/* Action for selecting a day. */
    +	_selectDay: function(id, month, year, td) {
    +		var target = $(id);
    +		if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
    +			return;
    +		}
    +		var inst = this._getInst(target[0]);
    +		inst.selectedDay = inst.currentDay = $('a', td).html();
    +		inst.selectedMonth = inst.currentMonth = month;
    +		inst.selectedYear = inst.currentYear = year;
    +		this._selectDate(id, this._formatDate(inst,
    +			inst.currentDay, inst.currentMonth, inst.currentYear));
    +	},
    +
    +	/* Erase the input field and hide the date picker. */
    +	_clearDate: function(id) {
    +		var target = $(id);
    +		var inst = this._getInst(target[0]);
    +		this._selectDate(target, '');
    +	},
    +
    +	/* Update the input field with the selected date. */
    +	_selectDate: function(id, dateStr) {
    +		var target = $(id);
    +		var inst = this._getInst(target[0]);
    +		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
    +		if (inst.input)
    +			inst.input.val(dateStr);
    +		this._updateAlternate(inst);
    +		var onSelect = this._get(inst, 'onSelect');
    +		if (onSelect)
    +			onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
    +		else if (inst.input)
    +			inst.input.trigger('change'); // fire the change event
    +		if (inst.inline)
    +			this._updateDatepicker(inst);
    +		else {
    +			this._hideDatepicker();
    +			this._lastInput = inst.input[0];
    +			if (typeof(inst.input[0]) != 'object')
    +				inst.input.focus(); // restore focus
    +			this._lastInput = null;
    +		}
    +	},
    +
    +	/* Update any alternate field to synchronise with the main field. */
    +	_updateAlternate: function(inst) {
    +		var altField = this._get(inst, 'altField');
    +		if (altField) { // update alternate field too
    +			var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
    +			var date = this._getDate(inst);
    +			var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
    +			$(altField).each(function() { $(this).val(dateStr); });
    +		}
    +	},
    +
    +	/* Set as beforeShowDay function to prevent selection of weekends.
    +	   @param  date  Date - the date to customise
    +	   @return [boolean, string] - is this date selectable?, what is its CSS class? */
    +	noWeekends: function(date) {
    +		var day = date.getDay();
    +		return [(day > 0 && day < 6), ''];
    +	},
    +
    +	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
    +	   @param  date  Date - the date to get the week for
    +	   @return  number - the number of the week within the year that contains this date */
    +	iso8601Week: function(date) {
    +		var checkDate = new Date(date.getTime());
    +		// Find Thursday of this week starting on Monday
    +		checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
    +		var time = checkDate.getTime();
    +		checkDate.setMonth(0); // Compare with Jan 1
    +		checkDate.setDate(1);
    +		return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
    +	},
    +
    +	/* Parse a string value into a date object.
    +	   See formatDate below for the possible formats.
    +
    +	   @param  format    string - the expected format of the date
    +	   @param  value     string - the date in the above format
    +	   @param  settings  Object - attributes include:
    +	                     shortYearCutoff  number - the cutoff year for determining the century (optional)
    +	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
    +	                     dayNames         string[7] - names of the days from Sunday (optional)
    +	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
    +	                     monthNames       string[12] - names of the months (optional)
    +	   @return  Date - the extracted date value or null if value is blank */
    +	parseDate: function (format, value, settings) {
    +		if (format == null || value == null)
    +			throw 'Invalid arguments';
    +		value = (typeof value == 'object' ? value.toString() : value + '');
    +		if (value == '')
    +			return null;
    +		var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
    +		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
    +				new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
    +		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
    +		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
    +		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
    +		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
    +		var year = -1;
    +		var month = -1;
    +		var day = -1;
    +		var doy = -1;
    +		var literal = false;
    +		// Check whether a format character is doubled
    +		var lookAhead = function(match) {
    +			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
    +			if (matches)
    +				iFormat++;
    +			return matches;
    +		};
    +		// Extract a number from the string value
    +		var getNumber = function(match) {
    +			var isDoubled = lookAhead(match);
    +			var size = (match == '@' ? 14 : (match == '!' ? 20 :
    +				(match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
    +			var digits = new RegExp('^\\d{1,' + size + '}');
    +			var num = value.substring(iValue).match(digits);
    +			if (!num)
    +				throw 'Missing number at position ' + iValue;
    +			iValue += num[0].length;
    +			return parseInt(num[0], 10);
    +		};
    +		// Extract a name from the string value and convert to an index
    +		var getName = function(match, shortNames, longNames) {
    +			var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
    +				return [ [k, v] ];
    +			}).sort(function (a, b) {
    +				return -(a[1].length - b[1].length);
    +			});
    +			var index = -1;
    +			$.each(names, function (i, pair) {
    +				var name = pair[1];
    +				if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) {
    +					index = pair[0];
    +					iValue += name.length;
    +					return false;
    +				}
    +			});
    +			if (index != -1)
    +				return index + 1;
    +			else
    +				throw 'Unknown name at position ' + iValue;
    +		};
    +		// Confirm that a literal character matches the string value
    +		var checkLiteral = function() {
    +			if (value.charAt(iValue) != format.charAt(iFormat))
    +				throw 'Unexpected literal at position ' + iValue;
    +			iValue++;
    +		};
    +		var iValue = 0;
    +		for (var iFormat = 0; iFormat < format.length; iFormat++) {
    +			if (literal)
    +				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
    +					literal = false;
    +				else
    +					checkLiteral();
    +			else
    +				switch (format.charAt(iFormat)) {
    +					case 'd':
    +						day = getNumber('d');
    +						break;
    +					case 'D':
    +						getName('D', dayNamesShort, dayNames);
    +						break;
    +					case 'o':
    +						doy = getNumber('o');
    +						break;
    +					case 'm':
    +						month = getNumber('m');
    +						break;
    +					case 'M':
    +						month = getName('M', monthNamesShort, monthNames);
    +						break;
    +					case 'y':
    +						year = getNumber('y');
    +						break;
    +					case '@':
    +						var date = new Date(getNumber('@'));
    +						year = date.getFullYear();
    +						month = date.getMonth() + 1;
    +						day = date.getDate();
    +						break;
    +					case '!':
    +						var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
    +						year = date.getFullYear();
    +						month = date.getMonth() + 1;
    +						day = date.getDate();
    +						break;
    +					case "'":
    +						if (lookAhead("'"))
    +							checkLiteral();
    +						else
    +							literal = true;
    +						break;
    +					default:
    +						checkLiteral();
    +				}
    +		}
    +		if (iValue < value.length){
    +			var extra = value.substr(iValue);
    +			if (!/^\s+/.test(extra)) {
    +				throw "Extra/unparsed characters found in date: " + extra;
    +			}
    +		}
    +		if (year == -1)
    +			year = new Date().getFullYear();
    +		else if (year < 100)
    +			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
    +				(year <= shortYearCutoff ? 0 : -100);
    +		if (doy > -1) {
    +			month = 1;
    +			day = doy;
    +			do {
    +				var dim = this._getDaysInMonth(year, month - 1);
    +				if (day <= dim)
    +					break;
    +				month++;
    +				day -= dim;
    +			} while (true);
    +		}
    +		var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
    +		if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
    +			throw 'Invalid date'; // E.g. 31/02/00
    +		return date;
    +	},
    +
    +	/* Standard date formats. */
    +	ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
    +	COOKIE: 'D, dd M yy',
    +	ISO_8601: 'yy-mm-dd',
    +	RFC_822: 'D, d M y',
    +	RFC_850: 'DD, dd-M-y',
    +	RFC_1036: 'D, d M y',
    +	RFC_1123: 'D, d M yy',
    +	RFC_2822: 'D, d M yy',
    +	RSS: 'D, d M y', // RFC 822
    +	TICKS: '!',
    +	TIMESTAMP: '@',
    +	W3C: 'yy-mm-dd', // ISO 8601
    +
    +	_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
    +		Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
    +
    +	/* Format a date object into a string value.
    +	   The format can be combinations of the following:
    +	   d  - day of month (no leading zero)
    +	   dd - day of month (two digit)
    +	   o  - day of year (no leading zeros)
    +	   oo - day of year (three digit)
    +	   D  - day name short
    +	   DD - day name long
    +	   m  - month of year (no leading zero)
    +	   mm - month of year (two digit)
    +	   M  - month name short
    +	   MM - month name long
    +	   y  - year (two digit)
    +	   yy - year (four digit)
    +	   @ - Unix timestamp (ms since 01/01/1970)
    +	   ! - Windows ticks (100ns since 01/01/0001)
    +	   '...' - literal text
    +	   '' - single quote
    +
    +	   @param  format    string - the desired format of the date
    +	   @param  date      Date - the date value to format
    +	   @param  settings  Object - attributes include:
    +	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
    +	                     dayNames         string[7] - names of the days from Sunday (optional)
    +	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
    +	                     monthNames       string[12] - names of the months (optional)
    +	   @return  string - the date in the above format */
    +	formatDate: function (format, date, settings) {
    +		if (!date)
    +			return '';
    +		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
    +		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
    +		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
    +		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
    +		// Check whether a format character is doubled
    +		var lookAhead = function(match) {
    +			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
    +			if (matches)
    +				iFormat++;
    +			return matches;
    +		};
    +		// Format a number, with leading zero if necessary
    +		var formatNumber = function(match, value, len) {
    +			var num = '' + value;
    +			if (lookAhead(match))
    +				while (num.length < len)
    +					num = '0' + num;
    +			return num;
    +		};
    +		// Format a name, short or long as requested
    +		var formatName = function(match, value, shortNames, longNames) {
    +			return (lookAhead(match) ? longNames[value] : shortNames[value]);
    +		};
    +		var output = '';
    +		var literal = false;
    +		if (date)
    +			for (var iFormat = 0; iFormat < format.length; iFormat++) {
    +				if (literal)
    +					if (format.charAt(iFormat) == "'" && !lookAhead("'"))
    +						literal = false;
    +					else
    +						output += format.charAt(iFormat);
    +				else
    +					switch (format.charAt(iFormat)) {
    +						case 'd':
    +							output += formatNumber('d', date.getDate(), 2);
    +							break;
    +						case 'D':
    +							output += formatName('D', date.getDay(), dayNamesShort, dayNames);
    +							break;
    +						case 'o':
    +							output += formatNumber('o',
    +								Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
    +							break;
    +						case 'm':
    +							output += formatNumber('m', date.getMonth() + 1, 2);
    +							break;
    +						case 'M':
    +							output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
    +							break;
    +						case 'y':
    +							output += (lookAhead('y') ? date.getFullYear() :
    +								(date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
    +							break;
    +						case '@':
    +							output += date.getTime();
    +							break;
    +						case '!':
    +							output += date.getTime() * 10000 + this._ticksTo1970;
    +							break;
    +						case "'":
    +							if (lookAhead("'"))
    +								output += "'";
    +							else
    +								literal = true;
    +							break;
    +						default:
    +							output += format.charAt(iFormat);
    +					}
    +			}
    +		return output;
    +	},
    +
    +	/* Extract all possible characters from the date format. */
    +	_possibleChars: function (format) {
    +		var chars = '';
    +		var literal = false;
    +		// Check whether a format character is doubled
    +		var lookAhead = function(match) {
    +			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
    +			if (matches)
    +				iFormat++;
    +			return matches;
    +		};
    +		for (var iFormat = 0; iFormat < format.length; iFormat++)
    +			if (literal)
    +				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
    +					literal = false;
    +				else
    +					chars += format.charAt(iFormat);
    +			else
    +				switch (format.charAt(iFormat)) {
    +					case 'd': case 'm': case 'y': case '@':
    +						chars += '0123456789';
    +						break;
    +					case 'D': case 'M':
    +						return null; // Accept anything
    +					case "'":
    +						if (lookAhead("'"))
    +							chars += "'";
    +						else
    +							literal = true;
    +						break;
    +					default:
    +						chars += format.charAt(iFormat);
    +				}
    +		return chars;
    +	},
    +
    +	/* Get a setting value, defaulting if necessary. */
    +	_get: function(inst, name) {
    +		return inst.settings[name] !== undefined ?
    +			inst.settings[name] : this._defaults[name];
    +	},
    +
    +	/* Parse existing date and initialise date picker. */
    +	_setDateFromField: function(inst, noDefault) {
    +		if (inst.input.val() == inst.lastVal) {
    +			return;
    +		}
    +		var dateFormat = this._get(inst, 'dateFormat');
    +		var dates = inst.lastVal = inst.input ? inst.input.val() : null;
    +		var date, defaultDate;
    +		date = defaultDate = this._getDefaultDate(inst);
    +		var settings = this._getFormatConfig(inst);
    +		try {
    +			date = this.parseDate(dateFormat, dates, settings) || defaultDate;
    +		} catch (event) {
    +			this.log(event);
    +			dates = (noDefault ? '' : dates);
    +		}
    +		inst.selectedDay = date.getDate();
    +		inst.drawMonth = inst.selectedMonth = date.getMonth();
    +		inst.drawYear = inst.selectedYear = date.getFullYear();
    +		inst.currentDay = (dates ? date.getDate() : 0);
    +		inst.currentMonth = (dates ? date.getMonth() : 0);
    +		inst.currentYear = (dates ? date.getFullYear() : 0);
    +		this._adjustInstDate(inst);
    +	},
    +
    +	/* Retrieve the default date shown on opening. */
    +	_getDefaultDate: function(inst) {
    +		return this._restrictMinMax(inst,
    +			this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
    +	},
    +
    +	/* A date may be specified as an exact value or a relative one. */
    +	_determineDate: function(inst, date, defaultDate) {
    +		var offsetNumeric = function(offset) {
    +			var date = new Date();
    +			date.setDate(date.getDate() + offset);
    +			return date;
    +		};
    +		var offsetString = function(offset) {
    +			try {
    +				return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
    +					offset, $.datepicker._getFormatConfig(inst));
    +			}
    +			catch (e) {
    +				// Ignore
    +			}
    +			var date = (offset.toLowerCase().match(/^c/) ?
    +				$.datepicker._getDate(inst) : null) || new Date();
    +			var year = date.getFullYear();
    +			var month = date.getMonth();
    +			var day = date.getDate();
    +			var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
    +			var matches = pattern.exec(offset);
    +			while (matches) {
    +				switch (matches[2] || 'd') {
    +					case 'd' : case 'D' :
    +						day += parseInt(matches[1],10); break;
    +					case 'w' : case 'W' :
    +						day += parseInt(matches[1],10) * 7; break;
    +					case 'm' : case 'M' :
    +						month += parseInt(matches[1],10);
    +						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
    +						break;
    +					case 'y': case 'Y' :
    +						year += parseInt(matches[1],10);
    +						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
    +						break;
    +				}
    +				matches = pattern.exec(offset);
    +			}
    +			return new Date(year, month, day);
    +		};
    +		var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
    +			(typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
    +		newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
    +		if (newDate) {
    +			newDate.setHours(0);
    +			newDate.setMinutes(0);
    +			newDate.setSeconds(0);
    +			newDate.setMilliseconds(0);
    +		}
    +		return this._daylightSavingAdjust(newDate);
    +	},
    +
    +	/* Handle switch to/from daylight saving.
    +	   Hours may be non-zero on daylight saving cut-over:
    +	   > 12 when midnight changeover, but then cannot generate
    +	   midnight datetime, so jump to 1AM, otherwise reset.
    +	   @param  date  (Date) the date to check
    +	   @return  (Date) the corrected date */
    +	_daylightSavingAdjust: function(date) {
    +		if (!date) return null;
    +		date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
    +		return date;
    +	},
    +
    +	/* Set the date(s) directly. */
    +	_setDate: function(inst, date, noChange) {
    +		var clear = !date;
    +		var origMonth = inst.selectedMonth;
    +		var origYear = inst.selectedYear;
    +		var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
    +		inst.selectedDay = inst.currentDay = newDate.getDate();
    +		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
    +		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
    +		if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
    +			this._notifyChange(inst);
    +		this._adjustInstDate(inst);
    +		if (inst.input) {
    +			inst.input.val(clear ? '' : this._formatDate(inst));
    +		}
    +	},
    +
    +	/* Retrieve the date(s) directly. */
    +	_getDate: function(inst) {
    +		var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
    +			this._daylightSavingAdjust(new Date(
    +			inst.currentYear, inst.currentMonth, inst.currentDay)));
    +			return startDate;
    +	},
    +
    +	/* Attach the onxxx handlers.  These are declared statically so
    +	 * they work with static code transformers like Caja.
    +	 */
    +	_attachHandlers: function(inst) {
    +		var stepMonths = this._get(inst, 'stepMonths');
    +		var id = '#' + inst.id.replace( /\\\\/g, "\\" );
    +		inst.dpDiv.find('[data-handler]').map(function () {
    +			var handler = {
    +				prev: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, -stepMonths, 'M');
    +				},
    +				next: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, +stepMonths, 'M');
    +				},
    +				hide: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._hideDatepicker();
    +				},
    +				today: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._gotoToday(id);
    +				},
    +				selectDay: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._selectDay(id, +this.getAttribute('data-month'), +this.getAttribute('data-year'), this);
    +					return false;
    +				},
    +				selectMonth: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'M');
    +					return false;
    +				},
    +				selectYear: function () {
    +					window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'Y');
    +					return false;
    +				}
    +			};
    +			$(this).bind(this.getAttribute('data-event'), handler[this.getAttribute('data-handler')]);
    +		});
    +	},
    +
    +	/* Generate the HTML for the current state of the date picker. */
    +	_generateHTML: function(inst) {
    +		var today = new Date();
    +		today = this._daylightSavingAdjust(
    +			new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
    +		var isRTL = this._get(inst, 'isRTL');
    +		var showButtonPanel = this._get(inst, 'showButtonPanel');
    +		var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
    +		var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
    +		var numMonths = this._getNumberOfMonths(inst);
    +		var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
    +		var stepMonths = this._get(inst, 'stepMonths');
    +		var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
    +		var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
    +			new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
    +		var minDate = this._getMinMaxDate(inst, 'min');
    +		var maxDate = this._getMinMaxDate(inst, 'max');
    +		var drawMonth = inst.drawMonth - showCurrentAtPos;
    +		var drawYear = inst.drawYear;
    +		if (drawMonth < 0) {
    +			drawMonth += 12;
    +			drawYear--;
    +		}
    +		if (maxDate) {
    +			var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
    +				maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
    +			maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
    +			while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
    +				drawMonth--;
    +				if (drawMonth < 0) {
    +					drawMonth = 11;
    +					drawYear--;
    +				}
    +			}
    +		}
    +		inst.drawMonth = drawMonth;
    +		inst.drawYear = drawYear;
    +		var prevText = this._get(inst, 'prevText');
    +		prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
    +			this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
    +			this._getFormatConfig(inst)));
    +		var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
    +			'<a class="ui-datepicker-prev ui-corner-all" data-handler="prev" data-event="click"' +
    +			' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
    +			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
    +		var nextText = this._get(inst, 'nextText');
    +		nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
    +			this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
    +			this._getFormatConfig(inst)));
    +		var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
    +			'<a class="ui-datepicker-next ui-corner-all" data-handler="next" data-event="click"' +
    +			' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
    +			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
    +		var currentText = this._get(inst, 'currentText');
    +		var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
    +		currentText = (!navigationAsDateFormat ? currentText :
    +			this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
    +		var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" data-handler="hide" data-event="click">' +
    +			this._get(inst, 'closeText') + '</button>' : '');
    +		var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
    +			(this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" data-handler="today" data-event="click"' +
    +			'>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
    +		var firstDay = parseInt(this._get(inst, 'firstDay'),10);
    +		firstDay = (isNaN(firstDay) ? 0 : firstDay);
    +		var showWeek = this._get(inst, 'showWeek');
    +		var dayNames = this._get(inst, 'dayNames');
    +		var dayNamesShort = this._get(inst, 'dayNamesShort');
    +		var dayNamesMin = this._get(inst, 'dayNamesMin');
    +		var monthNames = this._get(inst, 'monthNames');
    +		var monthNamesShort = this._get(inst, 'monthNamesShort');
    +		var beforeShowDay = this._get(inst, 'beforeShowDay');
    +		var showOtherMonths = this._get(inst, 'showOtherMonths');
    +		var selectOtherMonths = this._get(inst, 'selectOtherMonths');
    +		var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
    +		var defaultDate = this._getDefaultDate(inst);
    +		var html = '';
    +		for (var row = 0; row < numMonths[0]; row++) {
    +			var group = '';
    +			this.maxRows = 4;
    +			for (var col = 0; col < numMonths[1]; col++) {
    +				var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
    +				var cornerClass = ' ui-corner-all';
    +				var calender = '';
    +				if (isMultiMonth) {
    +					calender += '<div class="ui-datepicker-group';
    +					if (numMonths[1] > 1)
    +						switch (col) {
    +							case 0: calender += ' ui-datepicker-group-first';
    +								cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
    +							case numMonths[1]-1: calender += ' ui-datepicker-group-last';
    +								cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
    +							default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
    +						}
    +					calender += '">';
    +				}
    +				calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
    +					(/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
    +					(/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
    +					this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
    +					row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
    +					'</div><table class="ui-datepicker-calendar"><thead>' +
    +					'<tr>';
    +				var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
    +				for (var dow = 0; dow < 7; dow++) { // days of the week
    +					var day = (dow + firstDay) % 7;
    +					thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
    +						'<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
    +				}
    +				calender += thead + '</tr></thead><tbody>';
    +				var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
    +				if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
    +					inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
    +				var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
    +				var curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
    +				var numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
    +				this.maxRows = numRows;
    +				var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
    +				for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
    +					calender += '<tr>';
    +					var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
    +						this._get(inst, 'calculateWeek')(printDate) + '</td>');
    +					for (var dow = 0; dow < 7; dow++) { // create date picker days
    +						var daySettings = (beforeShowDay ?
    +							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
    +						var otherMonth = (printDate.getMonth() != drawMonth);
    +						var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
    +							(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
    +						tbody += '<td class="' +
    +							((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
    +							(otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
    +							((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
    +							(defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
    +							// or defaultDate is current printedDate and defaultDate is selectedDate
    +							' ' + this._dayOverClass : '') + // highlight selected day
    +							(unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') +  // highlight unselectable days
    +							(otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
    +							(printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
    +							(printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
    +							((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
    +							(unselectable ? '' : ' data-handler="selectDay" data-event="click" data-month="' + printDate.getMonth() + '" data-year="' + printDate.getFullYear() + '"') + '>' + // actions
    +							(otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
    +							(unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
    +							(printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
    +							(printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
    +							(otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
    +							'" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
    +						printDate.setDate(printDate.getDate() + 1);
    +						printDate = this._daylightSavingAdjust(printDate);
    +					}
    +					calender += tbody + '</tr>';
    +				}
    +				drawMonth++;
    +				if (drawMonth > 11) {
    +					drawMonth = 0;
    +					drawYear++;
    +				}
    +				calender += '</tbody></table>' + (isMultiMonth ? '</div>' +
    +							((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
    +				group += calender;
    +			}
    +			html += group;
    +		}
    +		html += buttonPanel + ($.ui.ie6 && !inst.inline ?
    +			'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
    +		inst._keyEvent = false;
    +		return html;
    +	},
    +
    +	/* Generate the month and year header. */
    +	_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
    +			secondary, monthNames, monthNamesShort) {
    +		var changeMonth = this._get(inst, 'changeMonth');
    +		var changeYear = this._get(inst, 'changeYear');
    +		var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
    +		var html = '<div class="ui-datepicker-title">';
    +		var monthHtml = '';
    +		// month selection
    +		if (secondary || !changeMonth)
    +			monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
    +		else {
    +			var inMinYear = (minDate && minDate.getFullYear() == drawYear);
    +			var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
    +			monthHtml += '<select class="ui-datepicker-month" data-handler="selectMonth" data-event="change">';
    +			for (var month = 0; month < 12; month++) {
    +				if ((!inMinYear || month >= minDate.getMonth()) &&
    +						(!inMaxYear || month <= maxDate.getMonth()))
    +					monthHtml += '<option value="' + month + '"' +
    +						(month == drawMonth ? ' selected="selected"' : '') +
    +						'>' + monthNamesShort[month] + '</option>';
    +			}
    +			monthHtml += '</select>';
    +		}
    +		if (!showMonthAfterYear)
    +			html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
    +		// year selection
    +		if ( !inst.yearshtml ) {
    +			inst.yearshtml = '';
    +			if (secondary || !changeYear)
    +				html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
    +			else {
    +				// determine range of years to display
    +				var years = this._get(inst, 'yearRange').split(':');
    +				var thisYear = new Date().getFullYear();
    +				var determineYear = function(value) {
    +					var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
    +						(value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
    +						parseInt(value, 10)));
    +					return (isNaN(year) ? thisYear : year);
    +				};
    +				var year = determineYear(years[0]);
    +				var endYear = Math.max(year, determineYear(years[1] || ''));
    +				year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
    +				endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
    +				inst.yearshtml += '<select class="ui-datepicker-year" data-handler="selectYear" data-event="change">';
    +				for (; year <= endYear; year++) {
    +					inst.yearshtml += '<option value="' + year + '"' +
    +						(year == drawYear ? ' selected="selected"' : '') +
    +						'>' + year + '</option>';
    +				}
    +				inst.yearshtml += '</select>';
    +
    +				html += inst.yearshtml;
    +				inst.yearshtml = null;
    +			}
    +		}
    +		html += this._get(inst, 'yearSuffix');
    +		if (showMonthAfterYear)
    +			html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml;
    +		html += '</div>'; // Close datepicker_header
    +		return html;
    +	},
    +
    +	/* Adjust one of the date sub-fields. */
    +	_adjustInstDate: function(inst, offset, period) {
    +		var year = inst.drawYear + (period == 'Y' ? offset : 0);
    +		var month = inst.drawMonth + (period == 'M' ? offset : 0);
    +		var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
    +			(period == 'D' ? offset : 0);
    +		var date = this._restrictMinMax(inst,
    +			this._daylightSavingAdjust(new Date(year, month, day)));
    +		inst.selectedDay = date.getDate();
    +		inst.drawMonth = inst.selectedMonth = date.getMonth();
    +		inst.drawYear = inst.selectedYear = date.getFullYear();
    +		if (period == 'M' || period == 'Y')
    +			this._notifyChange(inst);
    +	},
    +
    +	/* Ensure a date is within any min/max bounds. */
    +	_restrictMinMax: function(inst, date) {
    +		var minDate = this._getMinMaxDate(inst, 'min');
    +		var maxDate = this._getMinMaxDate(inst, 'max');
    +		var newDate = (minDate && date < minDate ? minDate : date);
    +		newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
    +		return newDate;
    +	},
    +
    +	/* Notify change of month/year. */
    +	_notifyChange: function(inst) {
    +		var onChange = this._get(inst, 'onChangeMonthYear');
    +		if (onChange)
    +			onChange.apply((inst.input ? inst.input[0] : null),
    +				[inst.selectedYear, inst.selectedMonth + 1, inst]);
    +	},
    +
    +	/* Determine the number of months to show. */
    +	_getNumberOfMonths: function(inst) {
    +		var numMonths = this._get(inst, 'numberOfMonths');
    +		return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
    +	},
    +
    +	/* Determine the current maximum date - ensure no time components are set. */
    +	_getMinMaxDate: function(inst, minMax) {
    +		return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
    +	},
    +
    +	/* Find the number of days in a given month. */
    +	_getDaysInMonth: function(year, month) {
    +		return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
    +	},
    +
    +	/* Find the day of the week of the first of a month. */
    +	_getFirstDayOfMonth: function(year, month) {
    +		return new Date(year, month, 1).getDay();
    +	},
    +
    +	/* Determines if we should allow a "next/prev" month display change. */
    +	_canAdjustMonth: function(inst, offset, curYear, curMonth) {
    +		var numMonths = this._getNumberOfMonths(inst);
    +		var date = this._daylightSavingAdjust(new Date(curYear,
    +			curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
    +		if (offset < 0)
    +			date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
    +		return this._isInRange(inst, date);
    +	},
    +
    +	/* Is the given date in the accepted range? */
    +	_isInRange: function(inst, date) {
    +		var minDate = this._getMinMaxDate(inst, 'min');
    +		var maxDate = this._getMinMaxDate(inst, 'max');
    +		return ((!minDate || date.getTime() >= minDate.getTime()) &&
    +			(!maxDate || date.getTime() <= maxDate.getTime()));
    +	},
    +
    +	/* Provide the configuration settings for formatting/parsing. */
    +	_getFormatConfig: function(inst) {
    +		var shortYearCutoff = this._get(inst, 'shortYearCutoff');
    +		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
    +			new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
    +		return {shortYearCutoff: shortYearCutoff,
    +			dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
    +			monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
    +	},
    +
    +	/* Format the given date for display. */
    +	_formatDate: function(inst, day, month, year) {
    +		if (!day) {
    +			inst.currentDay = inst.selectedDay;
    +			inst.currentMonth = inst.selectedMonth;
    +			inst.currentYear = inst.selectedYear;
    +		}
    +		var date = (day ? (typeof day == 'object' ? day :
    +			this._daylightSavingAdjust(new Date(year, month, day))) :
    +			this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
    +		return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
    +	}
    +});
    +
    +/*
    + * Bind hover events for datepicker elements.
    + * Done via delegate so the binding only occurs once in the lifetime of the parent div.
    + * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
    + */
    +function bindHover(dpDiv) {
    +	var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
    +	return dpDiv.delegate(selector, 'mouseout', function() {
    +			$(this).removeClass('ui-state-hover');
    +			if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
    +			if (this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
    +		})
    +		.delegate(selector, 'mouseover', function(){
    +			if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) {
    +				$(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
    +				$(this).addClass('ui-state-hover');
    +				if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
    +				if (this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
    +			}
    +		});
    +}
    +
    +/* jQuery extend now ignores nulls! */
    +function extendRemove(target, props) {
    +	$.extend(target, props);
    +	for (var name in props)
    +		if (props[name] == null || props[name] == undefined)
    +			target[name] = props[name];
    +	return target;
    +};
    +
    +/* Invoke the datepicker functionality.
    +   @param  options  string - a command, optionally followed by additional parameters or
    +	                Object - settings for attaching new datepicker functionality
    +   @return  jQuery object */
    +$.fn.datepicker = function(options){
    +
    +	/* Verify an empty collection wasn't passed - Fixes #6976 */
    +	if ( !this.length ) {
    +		return this;
    +	}
    +
    +	/* Initialise the date picker. */
    +	if (!$.datepicker.initialized) {
    +		$(document).mousedown($.datepicker._checkExternalClick).
    +			find(document.body).append($.datepicker.dpDiv);
    +		$.datepicker.initialized = true;
    +	}
    +
    +	var otherArgs = Array.prototype.slice.call(arguments, 1);
    +	if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
    +		return $.datepicker['_' + options + 'Datepicker'].
    +			apply($.datepicker, [this[0]].concat(otherArgs));
    +	if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
    +		return $.datepicker['_' + options + 'Datepicker'].
    +			apply($.datepicker, [this[0]].concat(otherArgs));
    +	return this.each(function() {
    +		typeof options == 'string' ?
    +			$.datepicker['_' + options + 'Datepicker'].
    +				apply($.datepicker, [this].concat(otherArgs)) :
    +			$.datepicker._attachDatepicker(this, options);
    +	});
    +};
    +
    +$.datepicker = new Datepicker(); // singleton instance
    +$.datepicker.initialized = false;
    +$.datepicker.uuid = new Date().getTime();
    +$.datepicker.version = "1.9.2";
    +
    +// Workaround for #4055
    +// Add another global to avoid noConflict issues with inline event handlers
    +window['DP_jQuery_' + dpuuid] = $;
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +var uiDialogClasses = "ui-dialog ui-widget ui-widget-content ui-corner-all ",
    +	sizeRelatedOptions = {
    +		buttons: true,
    +		height: true,
    +		maxHeight: true,
    +		maxWidth: true,
    +		minHeight: true,
    +		minWidth: true,
    +		width: true
    +	},
    +	resizableRelatedOptions = {
    +		maxHeight: true,
    +		maxWidth: true,
    +		minHeight: true,
    +		minWidth: true
    +	};
    +
    +$.widget("ui.dialog", {
    +	version: "1.9.2",
    +	options: {
    +		autoOpen: true,
    +		buttons: {},
    +		closeOnEscape: true,
    +		closeText: "close",
    +		dialogClass: "",
    +		draggable: true,
    +		hide: null,
    +		height: "auto",
    +		maxHeight: false,
    +		maxWidth: false,
    +		minHeight: 150,
    +		minWidth: 150,
    +		modal: false,
    +		position: {
    +			my: "center",
    +			at: "center",
    +			of: window,
    +			collision: "fit",
    +			// ensure that the titlebar is never outside the document
    +			using: function( pos ) {
    +				var topOffset = $( this ).css( pos ).offset().top;
    +				if ( topOffset < 0 ) {
    +					$( this ).css( "top", pos.top - topOffset );
    +				}
    +			}
    +		},
    +		resizable: true,
    +		show: null,
    +		stack: true,
    +		title: "",
    +		width: 300,
    +		zIndex: 1000
    +	},
    +
    +	_create: function() {
    +		this.originalTitle = this.element.attr( "title" );
    +		// #5742 - .attr() might return a DOMElement
    +		if ( typeof this.originalTitle !== "string" ) {
    +			this.originalTitle = "";
    +		}
    +		this.oldPosition = {
    +			parent: this.element.parent(),
    +			index: this.element.parent().children().index( this.element )
    +		};
    +		this.options.title = this.options.title || this.originalTitle;
    +		var that = this,
    +			options = this.options,
    +
    +			title = options.title || "&#160;",
    +			uiDialog,
    +			uiDialogTitlebar,
    +			uiDialogTitlebarClose,
    +			uiDialogTitle,
    +			uiDialogButtonPane;
    +
    +			uiDialog = ( this.uiDialog = $( "<div>" ) )
    +				.addClass( uiDialogClasses + options.dialogClass )
    +				.css({
    +					display: "none",
    +					outline: 0, // TODO: move to stylesheet
    +					zIndex: options.zIndex
    +				})
    +				// setting tabIndex makes the div focusable
    +				.attr( "tabIndex", -1)
    +				.keydown(function( event ) {
    +					if ( options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
    +							event.keyCode === $.ui.keyCode.ESCAPE ) {
    +						that.close( event );
    +						event.preventDefault();
    +					}
    +				})
    +				.mousedown(function( event ) {
    +					that.moveToTop( false, event );
    +				})
    +				.appendTo( "body" );
    +
    +			this.element
    +				.show()
    +				.removeAttr( "title" )
    +				.addClass( "ui-dialog-content ui-widget-content" )
    +				.appendTo( uiDialog );
    +
    +			uiDialogTitlebar = ( this.uiDialogTitlebar = $( "<div>" ) )
    +				.addClass( "ui-dialog-titlebar  ui-widget-header  " +
    +					"ui-corner-all  ui-helper-clearfix" )
    +				.bind( "mousedown", function() {
    +					// Dialog isn't getting focus when dragging (#8063)
    +					uiDialog.focus();
    +				})
    +				.prependTo( uiDialog );
    +
    +			uiDialogTitlebarClose = $( "<a href='#'></a>" )
    +				.addClass( "ui-dialog-titlebar-close  ui-corner-all" )
    +				.attr( "role", "button" )
    +				.click(function( event ) {
    +					event.preventDefault();
    +					that.close( event );
    +				})
    +				.appendTo( uiDialogTitlebar );
    +
    +			( this.uiDialogTitlebarCloseText = $( "<span>" ) )
    +				.addClass( "ui-icon ui-icon-closethick" )
    +				.text( options.closeText )
    +				.appendTo( uiDialogTitlebarClose );
    +
    +			uiDialogTitle = $( "<span>" )
    +				.uniqueId()
    +				.addClass( "ui-dialog-title" )
    +				.html( title )
    +				.prependTo( uiDialogTitlebar );
    +
    +			uiDialogButtonPane = ( this.uiDialogButtonPane = $( "<div>" ) )
    +				.addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
    +
    +			( this.uiButtonSet = $( "<div>" ) )
    +				.addClass( "ui-dialog-buttonset" )
    +				.appendTo( uiDialogButtonPane );
    +
    +		uiDialog.attr({
    +			role: "dialog",
    +			"aria-labelledby": uiDialogTitle.attr( "id" )
    +		});
    +
    +		uiDialogTitlebar.find( "*" ).add( uiDialogTitlebar ).disableSelection();
    +		this._hoverable( uiDialogTitlebarClose );
    +		this._focusable( uiDialogTitlebarClose );
    +
    +		if ( options.draggable && $.fn.draggable ) {
    +			this._makeDraggable();
    +		}
    +		if ( options.resizable && $.fn.resizable ) {
    +			this._makeResizable();
    +		}
    +
    +		this._createButtons( options.buttons );
    +		this._isOpen = false;
    +
    +		if ( $.fn.bgiframe ) {
    +			uiDialog.bgiframe();
    +		}
    +
    +		// prevent tabbing out of modal dialogs
    +		this._on( uiDialog, { keydown: function( event ) {
    +			if ( !options.modal || event.keyCode !== $.ui.keyCode.TAB ) {
    +				return;
    +			}
    +
    +			var tabbables = $( ":tabbable", uiDialog ),
    +				first = tabbables.filter( ":first" ),
    +				last  = tabbables.filter( ":last" );
    +
    +			if ( event.target === last[0] && !event.shiftKey ) {
    +				first.focus( 1 );
    +				return false;
    +			} else if ( event.target === first[0] && event.shiftKey ) {
    +				last.focus( 1 );
    +				return false;
    +			}
    +		}});
    +	},
    +
    +	_init: function() {
    +		if ( this.options.autoOpen ) {
    +			this.open();
    +		}
    +	},
    +
    +	_destroy: function() {
    +		var next,
    +			oldPosition = this.oldPosition;
    +
    +		if ( this.overlay ) {
    +			this.overlay.destroy();
    +		}
    +		this.uiDialog.hide();
    +		this.element
    +			.removeClass( "ui-dialog-content ui-widget-content" )
    +			.hide()
    +			.appendTo( "body" );
    +		this.uiDialog.remove();
    +
    +		if ( this.originalTitle ) {
    +			this.element.attr( "title", this.originalTitle );
    +		}
    +
    +		next = oldPosition.parent.children().eq( oldPosition.index );
    +		// Don't try to place the dialog next to itself (#8613)
    +		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
    +			next.before( this.element );
    +		} else {
    +			oldPosition.parent.append( this.element );
    +		}
    +	},
    +
    +	widget: function() {
    +		return this.uiDialog;
    +	},
    +
    +	close: function( event ) {
    +		var that = this,
    +			maxZ, thisZ;
    +
    +		if ( !this._isOpen ) {
    +			return;
    +		}
    +
    +		if ( false === this._trigger( "beforeClose", event ) ) {
    +			return;
    +		}
    +
    +		this._isOpen = false;
    +
    +		if ( this.overlay ) {
    +			this.overlay.destroy();
    +		}
    +
    +		if ( this.options.hide ) {
    +			this._hide( this.uiDialog, this.options.hide, function() {
    +				that._trigger( "close", event );
    +			});
    +		} else {
    +			this.uiDialog.hide();
    +			this._trigger( "close", event );
    +		}
    +
    +		$.ui.dialog.overlay.resize();
    +
    +		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
    +		if ( this.options.modal ) {
    +			maxZ = 0;
    +			$( ".ui-dialog" ).each(function() {
    +				if ( this !== that.uiDialog[0] ) {
    +					thisZ = $( this ).css( "z-index" );
    +					if ( !isNaN( thisZ ) ) {
    +						maxZ = Math.max( maxZ, thisZ );
    +					}
    +				}
    +			});
    +			$.ui.dialog.maxZ = maxZ;
    +		}
    +
    +		return this;
    +	},
    +
    +	isOpen: function() {
    +		return this._isOpen;
    +	},
    +
    +	// the force parameter allows us to move modal dialogs to their correct
    +	// position on open
    +	moveToTop: function( force, event ) {
    +		var options = this.options,
    +			saveScroll;
    +
    +		if ( ( options.modal && !force ) ||
    +				( !options.stack && !options.modal ) ) {
    +			return this._trigger( "focus", event );
    +		}
    +
    +		if ( options.zIndex > $.ui.dialog.maxZ ) {
    +			$.ui.dialog.maxZ = options.zIndex;
    +		}
    +		if ( this.overlay ) {
    +			$.ui.dialog.maxZ += 1;
    +			$.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ;
    +			this.overlay.$el.css( "z-index", $.ui.dialog.overlay.maxZ );
    +		}
    +
    +		// Save and then restore scroll
    +		// Opera 9.5+ resets when parent z-index is changed.
    +		// http://bugs.jqueryui.com/ticket/3193
    +		saveScroll = {
    +			scrollTop: this.element.scrollTop(),
    +			scrollLeft: this.element.scrollLeft()
    +		};
    +		$.ui.dialog.maxZ += 1;
    +		this.uiDialog.css( "z-index", $.ui.dialog.maxZ );
    +		this.element.attr( saveScroll );
    +		this._trigger( "focus", event );
    +
    +		return this;
    +	},
    +
    +	open: function() {
    +		if ( this._isOpen ) {
    +			return;
    +		}
    +
    +		var hasFocus,
    +			options = this.options,
    +			uiDialog = this.uiDialog;
    +
    +		this._size();
    +		this._position( options.position );
    +		uiDialog.show( options.show );
    +		this.overlay = options.modal ? new $.ui.dialog.overlay( this ) : null;
    +		this.moveToTop( true );
    +
    +		// set focus to the first tabbable element in the content area or the first button
    +		// if there are no tabbable elements, set focus on the dialog itself
    +		hasFocus = this.element.find( ":tabbable" );
    +		if ( !hasFocus.length ) {
    +			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
    +			if ( !hasFocus.length ) {
    +				hasFocus = uiDialog;
    +			}
    +		}
    +		hasFocus.eq( 0 ).focus();
    +
    +		this._isOpen = true;
    +		this._trigger( "open" );
    +
    +		return this;
    +	},
    +
    +	_createButtons: function( buttons ) {
    +		var that = this,
    +			hasButtons = false;
    +
    +		// if we already have a button pane, remove it
    +		this.uiDialogButtonPane.remove();
    +		this.uiButtonSet.empty();
    +
    +		if ( typeof buttons === "object" && buttons !== null ) {
    +			$.each( buttons, function() {
    +				return !(hasButtons = true);
    +			});
    +		}
    +		if ( hasButtons ) {
    +			$.each( buttons, function( name, props ) {
    +				var button, click;
    +				props = $.isFunction( props ) ?
    +					{ click: props, text: name } :
    +					props;
    +				// Default to a non-submitting button
    +				props = $.extend( { type: "button" }, props );
    +				// Change the context for the click callback to be the main element
    +				click = props.click;
    +				props.click = function() {
    +					click.apply( that.element[0], arguments );
    +				};
    +				button = $( "<button></button>", props )
    +					.appendTo( that.uiButtonSet );
    +				if ( $.fn.button ) {
    +					button.button();
    +				}
    +			});
    +			this.uiDialog.addClass( "ui-dialog-buttons" );
    +			this.uiDialogButtonPane.appendTo( this.uiDialog );
    +		} else {
    +			this.uiDialog.removeClass( "ui-dialog-buttons" );
    +		}
    +	},
    +
    +	_makeDraggable: function() {
    +		var that = this,
    +			options = this.options;
    +
    +		function filteredUi( ui ) {
    +			return {
    +				position: ui.position,
    +				offset: ui.offset
    +			};
    +		}
    +
    +		this.uiDialog.draggable({
    +			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
    +			handle: ".ui-dialog-titlebar",
    +			containment: "document",
    +			start: function( event, ui ) {
    +				$( this )
    +					.addClass( "ui-dialog-dragging" );
    +				that._trigger( "dragStart", event, filteredUi( ui ) );
    +			},
    +			drag: function( event, ui ) {
    +				that._trigger( "drag", event, filteredUi( ui ) );
    +			},
    +			stop: function( event, ui ) {
    +				options.position = [
    +					ui.position.left - that.document.scrollLeft(),
    +					ui.position.top - that.document.scrollTop()
    +				];
    +				$( this )
    +					.removeClass( "ui-dialog-dragging" );
    +				that._trigger( "dragStop", event, filteredUi( ui ) );
    +				$.ui.dialog.overlay.resize();
    +			}
    +		});
    +	},
    +
    +	_makeResizable: function( handles ) {
    +		handles = (handles === undefined ? this.options.resizable : handles);
    +		var that = this,
    +			options = this.options,
    +			// .ui-resizable has position: relative defined in the stylesheet
    +			// but dialogs have to use absolute or fixed positioning
    +			position = this.uiDialog.css( "position" ),
    +			resizeHandles = typeof handles === 'string' ?
    +				handles	:
    +				"n,e,s,w,se,sw,ne,nw";
    +
    +		function filteredUi( ui ) {
    +			return {
    +				originalPosition: ui.originalPosition,
    +				originalSize: ui.originalSize,
    +				position: ui.position,
    +				size: ui.size
    +			};
    +		}
    +
    +		this.uiDialog.resizable({
    +			cancel: ".ui-dialog-content",
    +			containment: "document",
    +			alsoResize: this.element,
    +			maxWidth: options.maxWidth,
    +			maxHeight: options.maxHeight,
    +			minWidth: options.minWidth,
    +			minHeight: this._minHeight(),
    +			handles: resizeHandles,
    +			start: function( event, ui ) {
    +				$( this ).addClass( "ui-dialog-resizing" );
    +				that._trigger( "resizeStart", event, filteredUi( ui ) );
    +			},
    +			resize: function( event, ui ) {
    +				that._trigger( "resize", event, filteredUi( ui ) );
    +			},
    +			stop: function( event, ui ) {
    +				$( this ).removeClass( "ui-dialog-resizing" );
    +				options.height = $( this ).height();
    +				options.width = $( this ).width();
    +				that._trigger( "resizeStop", event, filteredUi( ui ) );
    +				$.ui.dialog.overlay.resize();
    +			}
    +		})
    +		.css( "position", position )
    +		.find( ".ui-resizable-se" )
    +			.addClass( "ui-icon ui-icon-grip-diagonal-se" );
    +	},
    +
    +	_minHeight: function() {
    +		var options = this.options;
    +
    +		if ( options.height === "auto" ) {
    +			return options.minHeight;
    +		} else {
    +			return Math.min( options.minHeight, options.height );
    +		}
    +	},
    +
    +	_position: function( position ) {
    +		var myAt = [],
    +			offset = [ 0, 0 ],
    +			isVisible;
    +
    +		if ( position ) {
    +			// deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
    +	//		if (typeof position == 'string' || $.isArray(position)) {
    +	//			myAt = $.isArray(position) ? position : position.split(' ');
    +
    +			if ( typeof position === "string" || (typeof position === "object" && "0" in position ) ) {
    +				myAt = position.split ? position.split( " " ) : [ position[ 0 ], position[ 1 ] ];
    +				if ( myAt.length === 1 ) {
    +					myAt[ 1 ] = myAt[ 0 ];
    +				}
    +
    +				$.each( [ "left", "top" ], function( i, offsetPosition ) {
    +					if ( +myAt[ i ] === myAt[ i ] ) {
    +						offset[ i ] = myAt[ i ];
    +						myAt[ i ] = offsetPosition;
    +					}
    +				});
    +
    +				position = {
    +					my: myAt[0] + (offset[0] < 0 ? offset[0] : "+" + offset[0]) + " " +
    +						myAt[1] + (offset[1] < 0 ? offset[1] : "+" + offset[1]),
    +					at: myAt.join( " " )
    +				};
    +			}
    +
    +			position = $.extend( {}, $.ui.dialog.prototype.options.position, position );
    +		} else {
    +			position = $.ui.dialog.prototype.options.position;
    +		}
    +
    +		// need to show the dialog to get the actual offset in the position plugin
    +		isVisible = this.uiDialog.is( ":visible" );
    +		if ( !isVisible ) {
    +			this.uiDialog.show();
    +		}
    +		this.uiDialog.position( position );
    +		if ( !isVisible ) {
    +			this.uiDialog.hide();
    +		}
    +	},
    +
    +	_setOptions: function( options ) {
    +		var that = this,
    +			resizableOptions = {},
    +			resize = false;
    +
    +		$.each( options, function( key, value ) {
    +			that._setOption( key, value );
    +
    +			if ( key in sizeRelatedOptions ) {
    +				resize = true;
    +			}
    +			if ( key in resizableRelatedOptions ) {
    +				resizableOptions[ key ] = value;
    +			}
    +		});
    +
    +		if ( resize ) {
    +			this._size();
    +		}
    +		if ( this.uiDialog.is( ":data(resizable)" ) ) {
    +			this.uiDialog.resizable( "option", resizableOptions );
    +		}
    +	},
    +
    +	_setOption: function( key, value ) {
    +		var isDraggable, isResizable,
    +			uiDialog = this.uiDialog;
    +
    +		switch ( key ) {
    +			case "buttons":
    +				this._createButtons( value );
    +				break;
    +			case "closeText":
    +				// ensure that we always pass a string
    +				this.uiDialogTitlebarCloseText.text( "" + value );
    +				break;
    +			case "dialogClass":
    +				uiDialog
    +					.removeClass( this.options.dialogClass )
    +					.addClass( uiDialogClasses + value );
    +				break;
    +			case "disabled":
    +				if ( value ) {
    +					uiDialog.addClass( "ui-dialog-disabled" );
    +				} else {
    +					uiDialog.removeClass( "ui-dialog-disabled" );
    +				}
    +				break;
    +			case "draggable":
    +				isDraggable = uiDialog.is( ":data(draggable)" );
    +				if ( isDraggable && !value ) {
    +					uiDialog.draggable( "destroy" );
    +				}
    +
    +				if ( !isDraggable && value ) {
    +					this._makeDraggable();
    +				}
    +				break;
    +			case "position":
    +				this._position( value );
    +				break;
    +			case "resizable":
    +				// currently resizable, becoming non-resizable
    +				isResizable = uiDialog.is( ":data(resizable)" );
    +				if ( isResizable && !value ) {
    +					uiDialog.resizable( "destroy" );
    +				}
    +
    +				// currently resizable, changing handles
    +				if ( isResizable && typeof value === "string" ) {
    +					uiDialog.resizable( "option", "handles", value );
    +				}
    +
    +				// currently non-resizable, becoming resizable
    +				if ( !isResizable && value !== false ) {
    +					this._makeResizable( value );
    +				}
    +				break;
    +			case "title":
    +				// convert whatever was passed in o a string, for html() to not throw up
    +				$( ".ui-dialog-title", this.uiDialogTitlebar )
    +					.html( "" + ( value || "&#160;" ) );
    +				break;
    +		}
    +
    +		this._super( key, value );
    +	},
    +
    +	_size: function() {
    +		/* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
    +		 * divs will both have width and height set, so we need to reset them
    +		 */
    +		var nonContentHeight, minContentHeight, autoHeight,
    +			options = this.options,
    +			isVisible = this.uiDialog.is( ":visible" );
    +
    +		// reset content sizing
    +		this.element.show().css({
    +			width: "auto",
    +			minHeight: 0,
    +			height: 0
    +		});
    +
    +		if ( options.minWidth > options.width ) {
    +			options.width = options.minWidth;
    +		}
    +
    +		// reset wrapper sizing
    +		// determine the height of all the non-content elements
    +		nonContentHeight = this.uiDialog.css({
    +				height: "auto",
    +				width: options.width
    +			})
    +			.outerHeight();
    +		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
    +
    +		if ( options.height === "auto" ) {
    +			// only needed for IE6 support
    +			if ( $.support.minHeight ) {
    +				this.element.css({
    +					minHeight: minContentHeight,
    +					height: "auto"
    +				});
    +			} else {
    +				this.uiDialog.show();
    +				autoHeight = this.element.css( "height", "auto" ).height();
    +				if ( !isVisible ) {
    +					this.uiDialog.hide();
    +				}
    +				this.element.height( Math.max( autoHeight, minContentHeight ) );
    +			}
    +		} else {
    +			this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
    +		}
    +
    +		if (this.uiDialog.is( ":data(resizable)" ) ) {
    +			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
    +		}
    +	}
    +});
    +
    +$.extend($.ui.dialog, {
    +	uuid: 0,
    +	maxZ: 0,
    +
    +	getTitleId: function($el) {
    +		var id = $el.attr( "id" );
    +		if ( !id ) {
    +			this.uuid += 1;
    +			id = this.uuid;
    +		}
    +		return "ui-dialog-title-" + id;
    +	},
    +
    +	overlay: function( dialog ) {
    +		this.$el = $.ui.dialog.overlay.create( dialog );
    +	}
    +});
    +
    +$.extend( $.ui.dialog.overlay, {
    +	instances: [],
    +	// reuse old instances due to IE memory leak with alpha transparency (see #5185)
    +	oldInstances: [],
    +	maxZ: 0,
    +	events: $.map(
    +		"focus,mousedown,mouseup,keydown,keypress,click".split( "," ),
    +		function( event ) {
    +			return event + ".dialog-overlay";
    +		}
    +	).join( " " ),
    +	create: function( dialog ) {
    +		if ( this.instances.length === 0 ) {
    +			// prevent use of anchors and inputs
    +			// we use a setTimeout in case the overlay is created from an
    +			// event that we're going to be cancelling (see #2804)
    +			setTimeout(function() {
    +				// handle $(el).dialog().dialog('close') (see #4065)
    +				if ( $.ui.dialog.overlay.instances.length ) {
    +					$( document ).bind( $.ui.dialog.overlay.events, function( event ) {
    +						// stop events if the z-index of the target is < the z-index of the overlay
    +						// we cannot return true when we don't want to cancel the event (#3523)
    +						if ( $( event.target ).zIndex() < $.ui.dialog.overlay.maxZ ) {
    +							return false;
    +						}
    +					});
    +				}
    +			}, 1 );
    +
    +			// handle window resize
    +			$( window ).bind( "resize.dialog-overlay", $.ui.dialog.overlay.resize );
    +		}
    +
    +		var $el = ( this.oldInstances.pop() || $( "<div>" ).addClass( "ui-widget-overlay" ) );
    +
    +		// allow closing by pressing the escape key
    +		$( document ).bind( "keydown.dialog-overlay", function( event ) {
    +			var instances = $.ui.dialog.overlay.instances;
    +			// only react to the event if we're the top overlay
    +			if ( instances.length !== 0 && instances[ instances.length - 1 ] === $el &&
    +				dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
    +				event.keyCode === $.ui.keyCode.ESCAPE ) {
    +
    +				dialog.close( event );
    +				event.preventDefault();
    +			}
    +		});
    +
    +		$el.appendTo( document.body ).css({
    +			width: this.width(),
    +			height: this.height()
    +		});
    +
    +		if ( $.fn.bgiframe ) {
    +			$el.bgiframe();
    +		}
    +
    +		this.instances.push( $el );
    +		return $el;
    +	},
    +
    +	destroy: function( $el ) {
    +		var indexOf = $.inArray( $el, this.instances ),
    +			maxZ = 0;
    +
    +		if ( indexOf !== -1 ) {
    +			this.oldInstances.push( this.instances.splice( indexOf, 1 )[ 0 ] );
    +		}
    +
    +		if ( this.instances.length === 0 ) {
    +			$( [ document, window ] ).unbind( ".dialog-overlay" );
    +		}
    +
    +		$el.height( 0 ).width( 0 ).remove();
    +
    +		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
    +		$.each( this.instances, function() {
    +			maxZ = Math.max( maxZ, this.css( "z-index" ) );
    +		});
    +		this.maxZ = maxZ;
    +	},
    +
    +	height: function() {
    +		var scrollHeight,
    +			offsetHeight;
    +		// handle IE
    +		if ( $.ui.ie ) {
    +			scrollHeight = Math.max(
    +				document.documentElement.scrollHeight,
    +				document.body.scrollHeight
    +			);
    +			offsetHeight = Math.max(
    +				document.documentElement.offsetHeight,
    +				document.body.offsetHeight
    +			);
    +
    +			if ( scrollHeight < offsetHeight ) {
    +				return $( window ).height() + "px";
    +			} else {
    +				return scrollHeight + "px";
    +			}
    +		// handle "good" browsers
    +		} else {
    +			return $( document ).height() + "px";
    +		}
    +	},
    +
    +	width: function() {
    +		var scrollWidth,
    +			offsetWidth;
    +		// handle IE
    +		if ( $.ui.ie ) {
    +			scrollWidth = Math.max(
    +				document.documentElement.scrollWidth,
    +				document.body.scrollWidth
    +			);
    +			offsetWidth = Math.max(
    +				document.documentElement.offsetWidth,
    +				document.body.offsetWidth
    +			);
    +
    +			if ( scrollWidth < offsetWidth ) {
    +				return $( window ).width() + "px";
    +			} else {
    +				return scrollWidth + "px";
    +			}
    +		// handle "good" browsers
    +		} else {
    +			return $( document ).width() + "px";
    +		}
    +	},
    +
    +	resize: function() {
    +		/* If the dialog is draggable and the user drags it past the
    +		 * right edge of the window, the document becomes wider so we
    +		 * need to stretch the overlay. If the user then drags the
    +		 * dialog back to the left, the document will become narrower,
    +		 * so we need to shrink the overlay to the appropriate size.
    +		 * This is handled by shrinking the overlay before setting it
    +		 * to the full document size.
    +		 */
    +		var $overlays = $( [] );
    +		$.each( $.ui.dialog.overlay.instances, function() {
    +			$overlays = $overlays.add( this );
    +		});
    +
    +		$overlays.css({
    +			width: 0,
    +			height: 0
    +		}).css({
    +			width: $.ui.dialog.overlay.width(),
    +			height: $.ui.dialog.overlay.height()
    +		});
    +	}
    +});
    +
    +$.extend( $.ui.dialog.overlay.prototype, {
    +	destroy: function() {
    +		$.ui.dialog.overlay.destroy( this.$el );
    +	}
    +});
    +
    +}( jQuery ) );
    +(function( $, undefined ) {
    +
    +var mouseHandled = false;
    +
    +$.widget( "ui.menu", {
    +	version: "1.9.2",
    +	defaultElement: "<ul>",
    +	delay: 300,
    +	options: {
    +		icons: {
    +			submenu: "ui-icon-carat-1-e"
    +		},
    +		menus: "ul",
    +		position: {
    +			my: "left top",
    +			at: "right top"
    +		},
    +		role: "menu",
    +
    +		// callbacks
    +		blur: null,
    +		focus: null,
    +		select: null
    +	},
    +
    +	_create: function() {
    +		this.activeMenu = this.element;
    +		this.element
    +			.uniqueId()
    +			.addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
    +			.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
    +			.attr({
    +				role: this.options.role,
    +				tabIndex: 0
    +			})
    +			// need to catch all clicks on disabled menu
    +			// not possible through _on
    +			.bind( "click" + this.eventNamespace, $.proxy(function( event ) {
    +				if ( this.options.disabled ) {
    +					event.preventDefault();
    +				}
    +			}, this ));
    +
    +		if ( this.options.disabled ) {
    +			this.element
    +				.addClass( "ui-state-disabled" )
    +				.attr( "aria-disabled", "true" );
    +		}
    +
    +		this._on({
    +			// Prevent focus from sticking to links inside menu after clicking
    +			// them (focus should always stay on UL during navigation).
    +			"mousedown .ui-menu-item > a": function( event ) {
    +				event.preventDefault();
    +			},
    +			"click .ui-state-disabled > a": function( event ) {
    +				event.preventDefault();
    +			},
    +			"click .ui-menu-item:has(a)": function( event ) {
    +				var target = $( event.target ).closest( ".ui-menu-item" );
    +				if ( !mouseHandled && target.not( ".ui-state-disabled" ).length ) {
    +					mouseHandled = true;
    +
    +					this.select( event );
    +					// Open submenu on click
    +					if ( target.has( ".ui-menu" ).length ) {
    +						this.expand( event );
    +					} else if ( !this.element.is( ":focus" ) ) {
    +						// Redirect focus to the menu
    +						this.element.trigger( "focus", [ true ] );
    +
    +						// If the active item is on the top level, let it stay active.
    +						// Otherwise, blur the active item since it is no longer visible.
    +						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
    +							clearTimeout( this.timer );
    +						}
    +					}
    +				}
    +			},
    +			"mouseenter .ui-menu-item": function( event ) {
    +				var target = $( event.currentTarget );
    +				// Remove ui-state-active class from siblings of the newly focused menu item
    +				// to avoid a jump caused by adjacent elements both having a class with a border
    +				target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" );
    +				this.focus( event, target );
    +			},
    +			mouseleave: "collapseAll",
    +			"mouseleave .ui-menu": "collapseAll",
    +			focus: function( event, keepActiveItem ) {
    +				// If there's already an active item, keep it active
    +				// If not, activate the first item
    +				var item = this.active || this.element.children( ".ui-menu-item" ).eq( 0 );
    +
    +				if ( !keepActiveItem ) {
    +					this.focus( event, item );
    +				}
    +			},
    +			blur: function( event ) {
    +				this._delay(function() {
    +					if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
    +						this.collapseAll( event );
    +					}
    +				});
    +			},
    +			keydown: "_keydown"
    +		});
    +
    +		this.refresh();
    +
    +		// Clicks outside of a menu collapse any open menus
    +		this._on( this.document, {
    +			click: function( event ) {
    +				if ( !$( event.target ).closest( ".ui-menu" ).length ) {
    +					this.collapseAll( event );
    +				}
    +
    +				// Reset the mouseHandled flag
    +				mouseHandled = false;
    +			}
    +		});
    +	},
    +
    +	_destroy: function() {
    +		// Destroy (sub)menus
    +		this.element
    +			.removeAttr( "aria-activedescendant" )
    +			.find( ".ui-menu" ).andSelf()
    +				.removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" )
    +				.removeAttr( "role" )
    +				.removeAttr( "tabIndex" )
    +				.removeAttr( "aria-labelledby" )
    +				.removeAttr( "aria-expanded" )
    +				.removeAttr( "aria-hidden" )
    +				.removeAttr( "aria-disabled" )
    +				.removeUniqueId()
    +				.show();
    +
    +		// Destroy menu items
    +		this.element.find( ".ui-menu-item" )
    +			.removeClass( "ui-menu-item" )
    +			.removeAttr( "role" )
    +			.removeAttr( "aria-disabled" )
    +			.children( "a" )
    +				.removeUniqueId()
    +				.removeClass( "ui-corner-all ui-state-hover" )
    +				.removeAttr( "tabIndex" )
    +				.removeAttr( "role" )
    +				.removeAttr( "aria-haspopup" )
    +				.children().each( function() {
    +					var elem = $( this );
    +					if ( elem.data( "ui-menu-submenu-carat" ) ) {
    +						elem.remove();
    +					}
    +				});
    +
    +		// Destroy menu dividers
    +		this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
    +	},
    +
    +	_keydown: function( event ) {
    +		var match, prev, character, skip, regex,
    +			preventDefault = true;
    +
    +		function escape( value ) {
    +			return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
    +		}
    +
    +		switch ( event.keyCode ) {
    +		case $.ui.keyCode.PAGE_UP:
    +			this.previousPage( event );
    +			break;
    +		case $.ui.keyCode.PAGE_DOWN:
    +			this.nextPage( event );
    +			break;
    +		case $.ui.keyCode.HOME:
    +			this._move( "first", "first", event );
    +			break;
    +		case $.ui.keyCode.END:
    +			this._move( "last", "last", event );
    +			break;
    +		case $.ui.keyCode.UP:
    +			this.previous( event );
    +			break;
    +		case $.ui.keyCode.DOWN:
    +			this.next( event );
    +			break;
    +		case $.ui.keyCode.LEFT:
    +			this.collapse( event );
    +			break;
    +		case $.ui.keyCode.RIGHT:
    +			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
    +				this.expand( event );
    +			}
    +			break;
    +		case $.ui.keyCode.ENTER:
    +		case $.ui.keyCode.SPACE:
    +			this._activate( event );
    +			break;
    +		case $.ui.keyCode.ESCAPE:
    +			this.collapse( event );
    +			break;
    +		default:
    +			preventDefault = false;
    +			prev = this.previousFilter || "";
    +			character = String.fromCharCode( event.keyCode );
    +			skip = false;
    +
    +			clearTimeout( this.filterTimer );
    +
    +			if ( character === prev ) {
    +				skip = true;
    +			} else {
    +				character = prev + character;
    +			}
    +
    +			regex = new RegExp( "^" + escape( character ), "i" );
    +			match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
    +				return regex.test( $( this ).children( "a" ).text() );
    +			});
    +			match = skip && match.index( this.active.next() ) !== -1 ?
    +				this.active.nextAll( ".ui-menu-item" ) :
    +				match;
    +
    +			// If no matches on the current filter, reset to the last character pressed
    +			// to move down the menu to the first item that starts with that character
    +			if ( !match.length ) {
    +				character = String.fromCharCode( event.keyCode );
    +				regex = new RegExp( "^" + escape( character ), "i" );
    +				match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
    +					return regex.test( $( this ).children( "a" ).text() );
    +				});
    +			}
    +
    +			if ( match.length ) {
    +				this.focus( event, match );
    +				if ( match.length > 1 ) {
    +					this.previousFilter = character;
    +					this.filterTimer = this._delay(function() {
    +						delete this.previousFilter;
    +					}, 1000 );
    +				} else {
    +					delete this.previousFilter;
    +				}
    +			} else {
    +				delete this.previousFilter;
    +			}
    +		}
    +
    +		if ( preventDefault ) {
    +			event.preventDefault();
    +		}
    +	},
    +
    +	_activate: function( event ) {
    +		if ( !this.active.is( ".ui-state-disabled" ) ) {
    +			if ( this.active.children( "a[aria-haspopup='true']" ).length ) {
    +				this.expand( event );
    +			} else {
    +				this.select( event );
    +			}
    +		}
    +	},
    +
    +	refresh: function() {
    +		var menus,
    +			icon = this.options.icons.submenu,
    +			submenus = this.element.find( this.options.menus );
    +
    +		// Initialize nested menus
    +		submenus.filter( ":not(.ui-menu)" )
    +			.addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
    +			.hide()
    +			.attr({
    +				role: this.options.role,
    +				"aria-hidden": "true",
    +				"aria-expanded": "false"
    +			})
    +			.each(function() {
    +				var menu = $( this ),
    +					item = menu.prev( "a" ),
    +					submenuCarat = $( "<span>" )
    +						.addClass( "ui-menu-icon ui-icon " + icon )
    +						.data( "ui-menu-submenu-carat", true );
    +
    +				item
    +					.attr( "aria-haspopup", "true" )
    +					.prepend( submenuCarat );
    +				menu.attr( "aria-labelledby", item.attr( "id" ) );
    +			});
    +
    +		menus = submenus.add( this.element );
    +
    +		// Don't refresh list items that are already adapted
    +		menus.children( ":not(.ui-menu-item):has(a)" )
    +			.addClass( "ui-menu-item" )
    +			.attr( "role", "presentation" )
    +			.children( "a" )
    +				.uniqueId()
    +				.addClass( "ui-corner-all" )
    +				.attr({
    +					tabIndex: -1,
    +					role: this._itemRole()
    +				});
    +
    +		// Initialize unlinked menu-items containing spaces and/or dashes only as dividers
    +		menus.children( ":not(.ui-menu-item)" ).each(function() {
    +			var item = $( this );
    +			// hyphen, em dash, en dash
    +			if ( !/[^\-鈥斺揬s]/.test( item.text() ) ) {
    +				item.addClass( "ui-widget-content ui-menu-divider" );
    +			}
    +		});
    +
    +		// Add aria-disabled attribute to any disabled menu item
    +		menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
    +
    +		// If the active item has been removed, blur the menu
    +		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
    +			this.blur();
    +		}
    +	},
    +
    +	_itemRole: function() {
    +		return {
    +			menu: "menuitem",
    +			listbox: "option"
    +		}[ this.options.role ];
    +	},
    +
    +	focus: function( event, item ) {
    +		var nested, focused;
    +		this.blur( event, event && event.type === "focus" );
    +
    +		this._scrollIntoView( item );
    +
    +		this.active = item.first();
    +		focused = this.active.children( "a" ).addClass( "ui-state-focus" );
    +		// Only update aria-activedescendant if there's a role
    +		// otherwise we assume focus is managed elsewhere
    +		if ( this.options.role ) {
    +			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
    +		}
    +
    +		// Highlight active parent menu item, if any
    +		this.active
    +			.parent()
    +			.closest( ".ui-menu-item" )
    +			.children( "a:first" )
    +			.addClass( "ui-state-active" );
    +
    +		if ( event && event.type === "keydown" ) {
    +			this._close();
    +		} else {
    +			this.timer = this._delay(function() {
    +				this._close();
    +			}, this.delay );
    +		}
    +
    +		nested = item.children( ".ui-menu" );
    +		if ( nested.length && ( /^mouse/.test( event.type ) ) ) {
    +			this._startOpening(nested);
    +		}
    +		this.activeMenu = item.parent();
    +
    +		this._trigger( "focus", event, { item: item } );
    +	},
    +
    +	_scrollIntoView: function( item ) {
    +		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
    +		if ( this._hasScroll() ) {
    +			borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
    +			paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
    +			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
    +			scroll = this.activeMenu.scrollTop();
    +			elementHeight = this.activeMenu.height();
    +			itemHeight = item.height();
    +
    +			if ( offset < 0 ) {
    +				this.activeMenu.scrollTop( scroll + offset );
    +			} else if ( offset + itemHeight > elementHeight ) {
    +				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
    +			}
    +		}
    +	},
    +
    +	blur: function( event, fromFocus ) {
    +		if ( !fromFocus ) {
    +			clearTimeout( this.timer );
    +		}
    +
    +		if ( !this.active ) {
    +			return;
    +		}
    +
    +		this.active.children( "a" ).removeClass( "ui-state-focus" );
    +		this.active = null;
    +
    +		this._trigger( "blur", event, { item: this.active } );
    +	},
    +
    +	_startOpening: function( submenu ) {
    +		clearTimeout( this.timer );
    +
    +		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
    +		// shift in the submenu position when mousing over the carat icon
    +		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
    +			return;
    +		}
    +
    +		this.timer = this._delay(function() {
    +			this._close();
    +			this._open( submenu );
    +		}, this.delay );
    +	},
    +
    +	_open: function( submenu ) {
    +		var position = $.extend({
    +			of: this.active
    +		}, this.options.position );
    +
    +		clearTimeout( this.timer );
    +		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
    +			.hide()
    +			.attr( "aria-hidden", "true" );
    +
    +		submenu
    +			.show()
    +			.removeAttr( "aria-hidden" )
    +			.attr( "aria-expanded", "true" )
    +			.position( position );
    +	},
    +
    +	collapseAll: function( event, all ) {
    +		clearTimeout( this.timer );
    +		this.timer = this._delay(function() {
    +			// If we were passed an event, look for the submenu that contains the event
    +			var currentMenu = all ? this.element :
    +				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
    +
    +			// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
    +			if ( !currentMenu.length ) {
    +				currentMenu = this.element;
    +			}
    +
    +			this._close( currentMenu );
    +
    +			this.blur( event );
    +			this.activeMenu = currentMenu;
    +		}, this.delay );
    +	},
    +
    +	// With no arguments, closes the currently active menu - if nothing is active
    +	// it closes all menus.  If passed an argument, it will search for menus BELOW
    +	_close: function( startMenu ) {
    +		if ( !startMenu ) {
    +			startMenu = this.active ? this.active.parent() : this.element;
    +		}
    +
    +		startMenu
    +			.find( ".ui-menu" )
    +				.hide()
    +				.attr( "aria-hidden", "true" )
    +				.attr( "aria-expanded", "false" )
    +			.end()
    +			.find( "a.ui-state-active" )
    +				.removeClass( "ui-state-active" );
    +	},
    +
    +	collapse: function( event ) {
    +		var newItem = this.active &&
    +			this.active.parent().closest( ".ui-menu-item", this.element );
    +		if ( newItem && newItem.length ) {
    +			this._close();
    +			this.focus( event, newItem );
    +		}
    +	},
    +
    +	expand: function( event ) {
    +		var newItem = this.active &&
    +			this.active
    +				.children( ".ui-menu " )
    +				.children( ".ui-menu-item" )
    +				.first();
    +
    +		if ( newItem && newItem.length ) {
    +			this._open( newItem.parent() );
    +
    +			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
    +			this._delay(function() {
    +				this.focus( event, newItem );
    +			});
    +		}
    +	},
    +
    +	next: function( event ) {
    +		this._move( "next", "first", event );
    +	},
    +
    +	previous: function( event ) {
    +		this._move( "prev", "last", event );
    +	},
    +
    +	isFirstItem: function() {
    +		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
    +	},
    +
    +	isLastItem: function() {
    +		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
    +	},
    +
    +	_move: function( direction, filter, event ) {
    +		var next;
    +		if ( this.active ) {
    +			if ( direction === "first" || direction === "last" ) {
    +				next = this.active
    +					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
    +					.eq( -1 );
    +			} else {
    +				next = this.active
    +					[ direction + "All" ]( ".ui-menu-item" )
    +					.eq( 0 );
    +			}
    +		}
    +		if ( !next || !next.length || !this.active ) {
    +			next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();
    +		}
    +
    +		this.focus( event, next );
    +	},
    +
    +	nextPage: function( event ) {
    +		var item, base, height;
    +
    +		if ( !this.active ) {
    +			this.next( event );
    +			return;
    +		}
    +		if ( this.isLastItem() ) {
    +			return;
    +		}
    +		if ( this._hasScroll() ) {
    +			base = this.active.offset().top;
    +			height = this.element.height();
    +			this.active.nextAll( ".ui-menu-item" ).each(function() {
    +				item = $( this );
    +				return item.offset().top - base - height < 0;
    +			});
    +
    +			this.focus( event, item );
    +		} else {
    +			this.focus( event, this.activeMenu.children( ".ui-menu-item" )
    +				[ !this.active ? "first" : "last" ]() );
    +		}
    +	},
    +
    +	previousPage: function( event ) {
    +		var item, base, height;
    +		if ( !this.active ) {
    +			this.next( event );
    +			return;
    +		}
    +		if ( this.isFirstItem() ) {
    +			return;
    +		}
    +		if ( this._hasScroll() ) {
    +			base = this.active.offset().top;
    +			height = this.element.height();
    +			this.active.prevAll( ".ui-menu-item" ).each(function() {
    +				item = $( this );
    +				return item.offset().top - base + height > 0;
    +			});
    +
    +			this.focus( event, item );
    +		} else {
    +			this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
    +		}
    +	},
    +
    +	_hasScroll: function() {
    +		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
    +	},
    +
    +	select: function( event ) {
    +		// TODO: It should never be possible to not have an active item at this
    +		// point, but the tests don't trigger mouseenter before click.
    +		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
    +		var ui = { item: this.active };
    +		if ( !this.active.has( ".ui-menu" ).length ) {
    +			this.collapseAll( event, true );
    +		}
    +		this._trigger( "select", event, ui );
    +	}
    +});
    +
    +}( jQuery ));
    +(function( $, undefined ) {
    +
    +$.widget( "ui.progressbar", {
    +	version: "1.9.2",
    +	options: {
    +		value: 0,
    +		max: 100
    +	},
    +
    +	min: 0,
    +
    +	_create: function() {
    +		this.element
    +			.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
    +			.attr({
    +				role: "progressbar",
    +				"aria-valuemin": this.min,
    +				"aria-valuemax": this.options.max,
    +				"aria-valuenow": this._value()
    +			});
    +
    +		this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
    +			.appendTo( this.element );
    +
    +		this.oldValue = this._value();
    +		this._refreshValue();
    +	},
    +
    +	_destroy: function() {
    +		this.element
    +			.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
    +			.removeAttr( "role" )
    +			.removeAttr( "aria-valuemin" )
    +			.removeAttr( "aria-valuemax" )
    +			.removeAttr( "aria-valuenow" );
    +
    +		this.valueDiv.remove();
    +	},
    +
    +	value: function( newValue ) {
    +		if ( newValue === undefined ) {
    +			return this._value();
    +		}
    +
    +		this._setOption( "value", newValue );
    +		return this;
    +	},
    +
    +	_setOption: function( key, value ) {
    +		if ( key === "value" ) {
    +			this.options.value = value;
    +			this._refreshValue();
    +			if ( this._value() === this.options.max ) {
    +				this._trigger( "complete" );
    +			}
    +		}
    +
    +		this._super( key, value );
    +	},
    +
    +	_value: function() {
    +		var val = this.options.value;
    +		// normalize invalid value
    +		if ( typeof val !== "number" ) {
    +			val = 0;
    +		}
    +		return Math.min( this.options.max, Math.max( this.min, val ) );
    +	},
    +
    +	_percentage: function() {
    +		return 100 * this._value() / this.options.max;
    +	},
    +
    +	_refreshValue: function() {
    +		var value = this.value(),
    +			percentage = this._percentage();
    +
    +		if ( this.oldValue !== value ) {
    +			this.oldValue = value;
    +			this._trigger( "change" );
    +		}
    +
    +		this.valueDiv
    +			.toggle( value > this.min )
    +			.toggleClass( "ui-corner-right", value === this.options.max )
    +			.width( percentage.toFixed(0) + "%" );
    +		this.element.attr( "aria-valuenow", value );
    +	}
    +});
    +
    +})( jQuery );
    +(function( $, undefined ) {
    +
    +// number of pages in a slider
    +// (how many times can you page up/down to go through the whole range)
    +var numPages = 5;
    +
    +$.widget( "ui.slider", $.ui.mouse, {
    +	version: "1.9.2",
    +	widgetEventPrefix: "slide",
    +
    +	options: {
    +		animate: false,
    +		distance: 0,
    +		max: 100,
    +		min: 0,
    +		orientation: "horizontal",
    +		range: false,
    +		step: 1,
    +		value: 0,
    +		values: null
    +	},
    +
    +	_create: function() {
    +		var i, handleCount,
    +			o = this.options,
    +			existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
    +			handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
    +			handles = [];
    +
    +		this._keySliding = false;
    +		this._mouseSliding = false;
    +		this._animateOff = true;
    +		this._handleIndex = null;
    +		this._detectOrientation();
    +		this._mouseInit();
    +
    +		this.element
    +			.addClass( "ui-slider" +
    +				" ui-slider-" + this.orientation +
    +				" ui-widget" +
    +				" ui-widget-content" +
    +				" ui-corner-all" +
    +				( o.disabled ? " ui-slider-disabled ui-disabled" : "" ) );
    +
    +		this.range = $([]);
    +
    +		if ( o.range ) {
    +			if ( o.range === true ) {
    +				if ( !o.values ) {
    +					o.values = [ this._valueMin(), this._valueMin() ];
    +				}
    +				if ( o.values.length && o.values.length !== 2 ) {
    +					o.values = [ o.values[0], o.values[0] ];
    +				}
    +			}
    +
    +			this.range = $( "<div></div>" )
    +				.appendTo( this.element )
    +				.addClass( "ui-slider-range" +
    +				// note: this isn't the most fittingly semantic framework class for this element,
    +				// but worked best visually with a variety of themes
    +				" ui-widget-header" +
    +				( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) );
    +		}
    +
    +		handleCount = ( o.values && o.values.length ) || 1;
    +
    +		for ( i = existingHandles.length; i < handleCount; i++ ) {
    +			handles.push( handle );
    +		}
    +
    +		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
    +
    +		this.handle = this.handles.eq( 0 );
    +
    +		this.handles.add( this.range ).filter( "a" )
    +			.click(function( event ) {
    +				event.preventDefault();
    +			})
    +			.mouseenter(function() {
    +				if ( !o.disabled ) {
    +					$( this ).addClass( "ui-state-hover" );
    +				}
    +			})
    +			.mouseleave(function() {
    +				$( this ).removeClass( "ui-state-hover" );
    +			})
    +			.focus(function() {
    +				if ( !o.disabled ) {
    +					$( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
    +					$( this ).addClass( "ui-state-focus" );
    +				} else {
    +					$( this ).blur();
    +				}
    +			})
    +			.blur(function() {
    +				$( this ).removeClass( "ui-state-focus" );
    +			});
    +
    +		this.handles.each(function( i ) {
    +			$( this ).data( "ui-slider-handle-index", i );
    +		});
    +
    +		this._on( this.handles, {
    +			keydown: function( event ) {
    +				var allowed, curVal, newVal, step,
    +					index = $( event.target ).data( "ui-slider-handle-index" );
    +
    +				switch ( event.keyCode ) {
    +					case $.ui.keyCode.HOME:
    +					case $.ui.keyCode.END:
    +					case $.ui.keyCode.PAGE_UP:
    +					case $.ui.keyCode.PAGE_DOWN:
    +					case $.ui.keyCode.UP:
    +					case $.ui.keyCode.RIGHT:
    +					case $.ui.keyCode.DOWN:
    +					case $.ui.keyCode.LEFT:
    +						event.preventDefault();
    +						if ( !this._keySliding ) {
    +							this._keySliding = true;
    +							$( event.target ).addClass( "ui-state-active" );
    +							allowed = this._start( event, index );
    +							if ( allowed === false ) {
    +								return;
    +							}
    +						}
    +						break;
    +				}
    +
    +				step = this.options.step;
    +				if ( this.options.values && this.options.values.length ) {
    +					curVal = newVal = this.values( index );
    +				} else {
    +					curVal = newVal = this.value();
    +				}
    +
    +				switch ( event.keyCode ) {
    +					case $.ui.keyCode.HOME:
    +						newVal = this._valueMin();
    +						break;
    +					case $.ui.keyCode.END:
    +						newVal = this._valueMax();
    +						break;
    +					case $.ui.keyCode.PAGE_UP:
    +						newVal = this._trimAlignValue( curVal + ( (this._valueMax() - this._valueMin()) / numPages ) );
    +						break;
    +					case $.ui.keyCode.PAGE_DOWN:
    +						newVal = this._trimAlignValue( curVal - ( (this._valueMax() - this._valueMin()) / numPages ) );
    +						break;
    +					case $.ui.keyCode.UP:
    +					case $.ui.keyCode.RIGHT:
    +						if ( curVal === this._valueMax() ) {
    +							return;
    +						}
    +						newVal = this._trimAlignValue( curVal + step );
    +						break;
    +					case $.ui.keyCode.DOWN:
    +					case $.ui.keyCode.LEFT:
    +						if ( curVal === this._valueMin() ) {
    +							return;
    +						}
    +						newVal = this._trimAlignValue( curVal - step );
    +						break;
    +				}
    +
    +				this._slide( event, index, newVal );
    +			},
    +			keyup: function( event ) {
    +				var index = $( event.target ).data( "ui-slider-handle-index" );
    +
    +				if ( this._keySliding ) {
    +					this._keySliding = false;
    +					this._stop( event, index );
    +					this._change( event, index );
    +					$( event.target ).removeClass( "ui-state-active" );
    +				}
    +			}
    +		});
    +
    +		this._refreshValue();
    +
    +		this._animateOff = false;
    +	},
    +
    +	_destroy: function() {
    +		this.handles.remove();
    +		this.range.remove();
    +
    +		this.element
    +			.removeClass( "ui-slider" +
    +				" ui-slider-horizontal" +
    +				" ui-slider-vertical" +
    +				" ui-slider-disabled" +
    +				" ui-widget" +
    +				" ui-widget-content" +
    +				" ui-corner-all" );
    +
    +		this._mouseDestroy();
    +	},
    +
    +	_mouseCapture: function( event ) {
    +		var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
    +			that = this,
    +			o = this.options;
    +
    +		if ( o.disabled ) {
    +			return false;
    +		}
    +
    +		this.elementSize = {
    +			width: this.element.outerWidth(),
    +			height: this.element.outerHeight()
    +		};
    +		this.elementOffset = this.element.offset();
    +
    +		position = { x: event.pageX, y: event.pageY };
    +		normValue = this._normValueFromMouse( position );
    +		distance = this._valueMax() - this._valueMin() + 1;
    +		this.handles.each(function( i ) {
    +			var thisDistance = Math.abs( normValue - that.values(i) );
    +			if ( distance > thisDistance ) {
    +				distance = thisDistance;
    +				closestHandle = $( this );
    +				index = i;
    +			}
    +		});
    +
    +		// workaround for bug #3736 (if both handles of a range are at 0,
    +		// the first is always used as the one with least distance,
    +		// and moving it is obviously prevented by preventing negative ranges)
    +		if( o.range === true && this.values(1) === o.min ) {
    +			index += 1;
    +			closestHandle = $( this.handles[index] );
    +		}
    +
    +		allowed = this._start( event, index );
    +		if ( allowed === false ) {
    +			return false;
    +		}
    +		this._mouseSliding = true;
    +
    +		this._handleIndex = index;
    +
    +		closestHandle
    +			.addClass( "ui-state-active" )
    +			.focus();
    +
    +		offset = closestHandle.offset();
    +		mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
    +		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
    +			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
    +			top: event.pageY - offset.top -
    +				( closestHandle.height() / 2 ) -
    +				( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
    +				( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
    +				( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
    +		};
    +
    +		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
    +			this._slide( event, index, normValue );
    +		}
    +		this._animateOff = true;
    +		return true;
    +	},
    +
    +	_mouseStart: function() {
    +		return true;
    +	},
    +
    +	_mouseDrag: function( event ) {
    +		var position = { x: event.pageX, y: event.pageY },
    +			normValue = this._normValueFromMouse( position );
    +
    +		this._slide( event, this._handleIndex, normValue );
    +
    +		return false;
    +	},
    +
    +	_mouseStop: function( event ) {
    +		this.handles.removeClass( "ui-state-active" );
    +		this._mouseSliding = false;
    +
    +		this._stop( event, this._handleIndex );
    +		this._change( event, this._handleIndex );
    +
    +		this._handleIndex = null;
    +		this._clickOffset = null;
    +		this._animateOff = false;
    +
    +		return false;
    +	},
    +
    +	_detectOrientation: function() {
    +		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
    +	},
    +
    +	_normValueFromMouse: function( position ) {
    +		var pixelTotal,
    +			pixelMouse,
    +			percentMouse,
    +			valueTotal,
    +			valueMouse;
    +
    +		if ( this.orientation === "horizontal" ) {
    +			pixelTotal = this.elementSize.width;
    +			pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
    +		} else {
    +			pixelTotal = this.elementSize.height;
    +			pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
    +		}
    +
    +		percentMouse = ( pixelMouse / pixelTotal );
    +		if ( percentMouse > 1 ) {
    +			percentMouse = 1;
    +		}
    +		if ( percentMouse < 0 ) {
    +			percentMouse = 0;
    +		}
    +		if ( this.orientation === "vertical" ) {
    +			percentMouse = 1 - percentMouse;
    +		}
    +
    +		valueTotal = this._valueMax() - this._valueMin();
    +		valueMouse = this._valueMin() + percentMouse * valueTotal;
    +
    +		return this._trimAlignValue( valueMouse );
    +	},
    +
    +	_start: function( event, index ) {
    +		var uiHash = {
    +			handle: this.handles[ index ],
    +			value: this.value()
    +		};
    +		if ( this.options.values && this.options.values.length ) {
    +			uiHash.value = this.values( index );
    +			uiHash.values = this.values();
    +		}
    +		return this._trigger( "start", event, uiHash );
    +	},
    +
    +	_slide: function( event, index, newVal ) {
    +		var otherVal,
    +			newValues,
    +			allowed;
    +
    +		if ( this.options.values && this.options.values.length ) {
    +			otherVal = this.values( index ? 0 : 1 );
    +
    +			if ( ( this.options.values.length === 2 && this.options.range === true ) &&
    +					( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
    +				) {
    +				newVal = otherVal;
    +			}
    +
    +			if ( newVal !== this.values( index ) ) {
    +				newValues = this.values();
    +				newValues[ index ] = newVal;
    +				// A slide can be canceled by returning false from the slide callback
    +				allowed = this._trigger( "slide", event, {
    +					handle: this.handles[ index ],
    +					value: newVal,
    +					values: newValues
    +				} );
    +				otherVal = this.values( index ? 0 : 1 );
    +				if ( allowed !== false ) {
    +					this.values( index, newVal, true );
    +				}
    +			}
    +		} else {
    +			if ( newVal !== this.value() ) {
    +				// A slide can be canceled by returning false from the slide callback
    +				allowed = this._trigger( "slide", event, {
    +					handle: this.handles[ index ],
    +					value: newVal
    +				} );
    +				if ( allowed !== false ) {
    +					this.value( newVal );
    +				}
    +			}
    +		}
    +	},
    +
    +	_stop: function( event, index ) {
    +		var uiHash = {
    +			handle: this.handles[ index ],
    +			value: this.value()
    +		};
    +		if ( this.options.values && this.options.values.length ) {
    +			uiHash.value = this.values( index );
    +			uiHash.values = this.values();
    +		}
    +
    +		this._trigger( "stop", event, uiHash );
    +	},
    +
    +	_change: function( event, index ) {
    +		if ( !this._keySliding && !this._mouseSliding ) {
    +			var uiHash = {
    +				handle: this.handles[ index ],
    +				value: this.value()
    +			};
    +			if ( this.options.values && this.options.values.length ) {
    +				uiHash.value = this.values( index );
    +				uiHash.values = this.values();
    +			}
    +
    +			this._trigger( "change", event, uiHash );
    +		}
    +	},
    +
    +	value: function( newValue ) {
    +		if ( arguments.length ) {
    +			this.options.value = this._trimAlignValue( newValue );
    +			this._refreshValue();
    +			this._change( null, 0 );
    +			return;
    +		}
    +
    +		return this._value();
    +	},
    +
    +	values: function( index, newValue ) {
    +		var vals,
    +			newValues,
    +			i;
    +
    +		if ( arguments.length > 1 ) {
    +			this.options.values[ index ] = this._trimAlignValue( newValue );
    +			this._refreshValue();
    +			this._change( null, index );
    +			return;
    +		}
    +
    +		if ( arguments.length ) {
    +			if ( $.isArray( arguments[ 0 ] ) ) {
    +				vals = this.options.values;
    +				newValues = arguments[ 0 ];
    +				for ( i = 0; i < vals.length; i += 1 ) {
    +					vals[ i ] = this._trimAlignValue( newValues[ i ] );
    +					this._change( null, i );
    +				}
    +				this._refreshValue();
    +			} else {
    +				if ( this.options.values && this.options.values.length ) {
    +					return this._values( index );
    +				} else {
    +					return this.value();
    +				}
    +			}
    +		} else {
    +			return this._values();
    +		}
    +	},
    +
    +	_setOption: function( key, value ) {
    +		var i,
    +			valsLength = 0;
    +
    +		if ( $.isArray( this.options.values ) ) {
    +			valsLength = this.options.values.length;
    +		}
    +
    +		$.Widget.prototype._setOption.apply( this, arguments );
    +
    +		switch ( key ) {
    +			case "disabled":
    +				if ( value ) {
    +					this.handles.filter( ".ui-state-focus" ).blur();
    +					this.handles.removeClass( "ui-state-hover" );
    +					this.handles.prop( "disabled", true );
    +					this.element.addClass( "ui-disabled" );
    +				} else {
    +					this.handles.prop( "disabled", false );
    +					this.element.removeClass( "ui-disabled" );
    +				}
    +				break;
    +			case "orientation":
    +				this._detectOrientation();
    +				this.element
    +					.removeClass( "ui-slider-horizontal ui-slider-vertical" )
    +					.addClass( "ui-slider-" + this.orientation );
    +				this._refreshValue();
    +				break;
    +			case "value":
    +				this._animateOff = true;
    +				this._refreshValue();
    +				this._change( null, 0 );
    +				this._animateOff = false;
    +				break;
    +			case "values":
    +				this._animateOff = true;
    +				this._refreshValue();
    +				for ( i = 0; i < valsLength; i += 1 ) {
    +					this._change( null, i );
    +				}
    +				this._animateOff = false;
    +				break;
    +			case "min":
    +			case "max":
    +				this._animateOff = true;
    +				this._refreshValue();
    +				this._animateOff = false;
    +				break;
    +		}
    +	},
    +
    +	//internal value getter
    +	// _value() returns value trimmed by min and max, aligned by step
    +	_value: function() {
    +		var val = this.options.value;
    +		val = this._trimAlignValue( val );
    +
    +		return val;
    +	},
    +
    +	//internal values getter
    +	// _values() returns array of values trimmed by min and max, aligned by step
    +	// _values( index ) returns single value trimmed by min and max, aligned by step
    +	_values: function( index ) {
    +		var val,
    +			vals,
    +			i;
    +
    +		if ( arguments.length ) {
    +			val = this.options.values[ index ];
    +			val = this._trimAlignValue( val );
    +
    +			return val;
    +		} else {
    +			// .slice() creates a copy of the array
    +			// this copy gets trimmed by min and max and then returned
    +			vals = this.options.values.slice();
    +			for ( i = 0; i < vals.length; i+= 1) {
    +				vals[ i ] = this._trimAlignValue( vals[ i ] );
    +			}
    +
    +			return vals;
    +		}
    +	},
    +
    +	// returns the step-aligned value that val is closest to, between (inclusive) min and max
    +	_trimAlignValue: function( val ) {
    +		if ( val <= this._valueMin() ) {
    +			return this._valueMin();
    +		}
    +		if ( val >= this._valueMax() ) {
    +			return this._valueMax();
    +		}
    +		var step = ( this.options.step > 0 ) ? this.options.step : 1,
    +			valModStep = (val - this._valueMin()) % step,
    +			alignValue = val - valModStep;
    +
    +		if ( Math.abs(valModStep) * 2 >= step ) {
    +			alignValue += ( valModStep > 0 ) ? step : ( -step );
    +		}
    +
    +		// Since JavaScript has problems with large floats, round
    +		// the final value to 5 digits after the decimal point (see #4124)
    +		return parseFloat( alignValue.toFixed(5) );
    +	},
    +
    +	_valueMin: function() {
    +		return this.options.min;
    +	},
    +
    +	_valueMax: function() {
    +		return this.options.max;
    +	},
    +
    +	_refreshValue: function() {
    +		var lastValPercent, valPercent, value, valueMin, valueMax,
    +			oRange = this.options.range,
    +			o = this.options,
    +			that = this,
    +			animate = ( !this._animateOff ) ? o.animate : false,
    +			_set = {};
    +
    +		if ( this.options.values && this.options.values.length ) {
    +			this.handles.each(function( i ) {
    +				valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
    +				_set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
    +				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
    +				if ( that.options.range === true ) {
    +					if ( that.orientation === "horizontal" ) {
    +						if ( i === 0 ) {
    +							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
    +						}
    +						if ( i === 1 ) {
    +							that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
    +						}
    +					} else {
    +						if ( i === 0 ) {
    +							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
    +						}
    +						if ( i === 1 ) {
    +							that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
    +						}
    +					}
    +				}
    +				lastValPercent = valPercent;
    +			});
    +		} else {
    +			value = this.value();
    +			valueMin = this._valueMin();
    +			valueMax = this._valueMax();
    +			valPercent = ( valueMax !== valueMin ) ?
    +					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
    +					0;
    +			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
    +			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
    +
    +			if ( oRange === "min" && this.orientation === "horizontal" ) {
    +				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
    +			}
    +			if ( oRange === "max" && this.orientation === "horizontal" ) {
    +				this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
    +			}
    +			if ( oRange === "min" && this.orientation === "vertical" ) {
    +				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
    +			}
    +			if ( oRange === "max" && this.orientation === "vertical" ) {
    +				this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
    +			}
    +		}
    +	}
    +
    +});
    +
    +}(jQuery));
    +(function( $ ) {
    +
    +function modifier( fn ) {
    +	return function() {
    +		var previous = this.element.val();
    +		fn.apply( this, arguments );
    +		this._refresh();
    +		if ( previous !== this.element.val() ) {
    +			this._trigger( "change" );
    +		}
    +	};
    +}
    +
    +$.widget( "ui.spinner", {
    +	version: "1.9.2",
    +	defaultElement: "<input>",
    +	widgetEventPrefix: "spin",
    +	options: {
    +		culture: null,
    +		icons: {
    +			down: "ui-icon-triangle-1-s",
    +			up: "ui-icon-triangle-1-n"
    +		},
    +		incremental: true,
    +		max: null,
    +		min: null,
    +		numberFormat: null,
    +		page: 10,
    +		step: 1,
    +
    +		change: null,
    +		spin: null,
    +		start: null,
    +		stop: null
    +	},
    +
    +	_create: function() {
    +		// handle string values that need to be parsed
    +		this._setOption( "max", this.options.max );
    +		this._setOption( "min", this.options.min );
    +		this._setOption( "step", this.options.step );
    +
    +		// format the value, but don't constrain
    +		this._value( this.element.val(), true );
    +
    +		this._draw();
    +		this._on( this._events );
    +		this._refresh();
    +
    +		// turning off autocomplete prevents the browser from remembering the
    +		// value when navigating through history, so we re-enable autocomplete
    +		// if the page is unloaded before the widget is destroyed. #7790
    +		this._on( this.window, {
    +			beforeunload: function() {
    +				this.element.removeAttr( "autocomplete" );
    +			}
    +		});
    +	},
    +
    +	_getCreateOptions: function() {
    +		var options = {},
    +			element = this.element;
    +
    +		$.each( [ "min", "max", "step" ], function( i, option ) {
    +			var value = element.attr( option );
    +			if ( value !== undefined && value.length ) {
    +				options[ option ] = value;
    +			}
    +		});
    +
    +		return options;
    +	},
    +
    +	_events: {
    +		keydown: function( event ) {
    +			if ( this._start( event ) && this._keydown( event ) ) {
    +				event.preventDefault();
    +			}
    +		},
    +		keyup: "_stop",
    +		focus: function() {
    +			this.previous = this.element.val();
    +		},
    +		blur: function( event ) {
    +			if ( this.cancelBlur ) {
    +				delete this.cancelBlur;
    +				return;
    +			}
    +
    +			this._refresh();
    +			if ( this.previous !== this.element.val() ) {
    +				this._trigger( "change", event );
    +			}
    +		},
    +		mousewheel: function( event, delta ) {
    +			if ( !delta ) {
    +				return;
    +			}
    +			if ( !this.spinning && !this._start( event ) ) {
    +				return false;
    +			}
    +
    +			this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
    +			clearTimeout( this.mousewheelTimer );
    +			this.mousewheelTimer = this._delay(function() {
    +				if ( this.spinning ) {
    +					this._stop( event );
    +				}
    +			}, 100 );
    +			event.preventDefault();
    +		},
    +		"mousedown .ui-spinner-button": function( event ) {
    +			var previous;
    +
    +			// We never want the buttons to have focus; whenever the user is
    +			// interacting with the spinner, the focus should be on the input.
    +			// If the input is focused then this.previous is properly set from
    +			// when the input first received focus. If the input is not focused
    +			// then we need to set this.previous based on the value before spinning.
    +			previous = this.element[0] === this.document[0].activeElement ?
    +				this.previous : this.element.val();
    +			function checkFocus() {
    +				var isActive = this.element[0] === this.document[0].activeElement;
    +				if ( !isActive ) {
    +					this.element.focus();
    +					this.previous = previous;
    +					// support: IE
    +					// IE sets focus asynchronously, so we need to check if focus
    +					// moved off of the input because the user clicked on the button.
    +					this._delay(function() {
    +						this.previous = previous;
    +					});
    +				}
    +			}
    +
    +			// ensure focus is on (or stays on) the text field
    +			event.preventDefault();
    +			checkFocus.call( this );
    +
    +			// support: IE
    +			// IE doesn't prevent moving focus even with event.preventDefault()
    +			// so we set a flag to know when we should ignore the blur event
    +			// and check (again) if focus moved off of the input.
    +			this.cancelBlur = true;
    +			this._delay(function() {
    +				delete this.cancelBlur;
    +				checkFocus.call( this );
    +			});
    +
    +			if ( this._start( event ) === false ) {
    +				return;
    +			}
    +
    +			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
    +		},
    +		"mouseup .ui-spinner-button": "_stop",
    +		"mouseenter .ui-spinner-button": function( event ) {
    +			// button will add ui-state-active if mouse was down while mouseleave and kept down
    +			if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
    +				return;
    +			}
    +
    +			if ( this._start( event ) === false ) {
    +				return false;
    +			}
    +			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
    +		},
    +		// TODO: do we really want to consider this a stop?
    +		// shouldn't we just stop the repeater and wait until mouseup before
    +		// we trigger the stop event?
    +		"mouseleave .ui-spinner-button": "_stop"
    +	},
    +
    +	_draw: function() {
    +		var uiSpinner = this.uiSpinner = this.element
    +			.addClass( "ui-spinner-input" )
    +			.attr( "autocomplete", "off" )
    +			.wrap( this._uiSpinnerHtml() )
    +			.parent()
    +				// add buttons
    +				.append( this._buttonHtml() );
    +
    +		this.element.attr( "role", "spinbutton" );
    +
    +		// button bindings
    +		this.buttons = uiSpinner.find( ".ui-spinner-button" )
    +			.attr( "tabIndex", -1 )
    +			.button()
    +			.removeClass( "ui-corner-all" );
    +
    +		// IE 6 doesn't understand height: 50% for the buttons
    +		// unless the wrapper has an explicit height
    +		if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
    +				uiSpinner.height() > 0 ) {
    +			uiSpinner.height( uiSpinner.height() );
    +		}
    +
    +		// disable spinner if element was already disabled
    +		if ( this.options.disabled ) {
    +			this.disable();
    +		}
    +	},
    +
    +	_keydown: function( event ) {
    +		var options = this.options,
    +			keyCode = $.ui.keyCode;
    +
    +		switch ( event.keyCode ) {
    +		case keyCode.UP:
    +			this._repeat( null, 1, event );
    +			return true;
    +		case keyCode.DOWN:
    +			this._repeat( null, -1, event );
    +			return true;
    +		case keyCode.PAGE_UP:
    +			this._repeat( null, options.page, event );
    +			return true;
    +		case keyCode.PAGE_DOWN:
    +			this._repeat( null, -options.page, event );
    +			return true;
    +		}
    +
    +		return false;
    +	},
    +
    +	_uiSpinnerHtml: function() {
    +		return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
    +	},
    +
    +	_buttonHtml: function() {
    +		return "" +
    +			"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
    +				"<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
    +			"</a>" +
    +			"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
    +				"<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
    +			"</a>";
    +	},
    +
    +	_start: function( event ) {
    +		if ( !this.spinning && this._trigger( "start", event ) === false ) {
    +			return false;
    +		}
    +
    +		if ( !this.counter ) {
    +			this.counter = 1;
    +		}
    +		this.spinning = true;
    +		return true;
    +	},
    +
    +	_repeat: function( i, steps, event ) {
    +		i = i || 500;
    +
    +		clearTimeout( this.timer );
    +		this.timer = this._delay(function() {
    +			this._repeat( 40, steps, event );
    +		}, i );
    +
    +		this._spin( steps * this.options.step, event );
    +	},
    +
    +	_spin: function( step, event ) {
    +		var value = this.value() || 0;
    +
    +		if ( !this.counter ) {
    +			this.counter = 1;
    +		}
    +
    +		value = this._adjustValue( value + step * this._increment( this.counter ) );
    +
    +		if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
    +			this._value( value );
    +			this.counter++;
    +		}
    +	},
    +
    +	_increment: function( i ) {
    +		var incremental = this.options.incremental;
    +
    +		if ( incremental ) {
    +			return $.isFunction( incremental ) ?
    +				incremental( i ) :
    +				Math.floor( i*i*i/50000 - i*i/500 + 17*i/200 + 1 );
    +		}
    +
    +		return 1;
    +	},
    +
    +	_precision: function() {
    +		var precision = this._precisionOf( this.options.step );
    +		if ( this.options.min !== null ) {
    +			precision = Math.max( precision, this._precisionOf( this.options.min ) );
    +		}
    +		return precision;
    +	},
    +
    +	_precisionOf: function( num ) {
    +		var str = num.toString(),
    +			decimal = str.indexOf( "." );
    +		return decimal === -1 ? 0 : str.length - decimal - 1;
    +	},
    +
    +	_adjustValue: function( value ) {
    +		var base, aboveMin,
    +			options = this.options;
    +
    +		// make sure we're at a valid step
    +		// - find out where we are relative to the base (min or 0)
    +		base = options.min !== null ? options.min : 0;
    +		aboveMin = value - base;
    +		// - round to the nearest step
    +		aboveMin = Math.round(aboveMin / options.step) * options.step;
    +		// - rounding is based on 0, so adjust back to our base
    +		value = base + aboveMin;
    +
    +		// fix precision from bad JS floating point math
    +		value = parseFloat( value.toFixed( this._precision() ) );
    +
    +		// clamp the value
    +		if ( options.max !== null && value > options.max) {
    +			return options.max;
    +		}
    +		if ( options.min !== null && value < options.min ) {
    +			return options.min;
    +		}
    +
    +		return value;
    +	},
    +
    +	_stop: function( event ) {
    +		if ( !this.spinning ) {
    +			return;
    +		}
    +
    +		clearTimeout( this.timer );
    +		clearTimeout( this.mousewheelTimer );
    +		this.counter = 0;
    +		this.spinning = false;
    +		this._trigger( "stop", event );
    +	},
    +
    +	_setOption: function( key, value ) {
    +		if ( key === "culture" || key === "numberFormat" ) {
    +			var prevValue = this._parse( this.element.val() );
    +			this.options[ key ] = value;
    +			this.element.val( this._format( prevValue ) );
    +			return;
    +		}
    +
    +		if ( key === "max" || key === "min" || key === "step" ) {
    +			if ( typeof value === "string" ) {
    +				value = this._parse( value );
    +			}
    +		}
    +
    +		this._super( key, value );
    +
    +		if ( key === "disabled" ) {
    +			if ( value ) {
    +				this.element.prop( "disabled", true );
    +				this.buttons.button( "disable" );
    +			} else {
    +				this.element.prop( "disabled", false );
    +				this.buttons.button( "enable" );
    +			}
    +		}
    +	},
    +
    +	_setOptions: modifier(function( options ) {
    +		this._super( options );
    +		this._value( this.element.val() );
    +	}),
    +
    +	_parse: function( val ) {
    +		if ( typeof val === "string" && val !== "" ) {
    +			val = window.Globalize && this.options.numberFormat ?
    +				Globalize.parseFloat( val, 10, this.options.culture ) : +val;
    +		}
    +		return val === "" || isNaN( val ) ? null : val;
    +	},
    +
    +	_format: function( value ) {
    +		if ( value === "" ) {
    +			return "";
    +		}
    +		return window.Globalize && this.options.numberFormat ?
    +			Globalize.format( value, this.options.numberFormat, this.options.culture ) :
    +			value;
    +	},
    +
    +	_refresh: function() {
    +		this.element.attr({
    +			"aria-valuemin": this.options.min,
    +			"aria-valuemax": this.options.max,
    +			// TODO: what should we do with values that can't be parsed?
    +			"aria-valuenow": this._parse( this.element.val() )
    +		});
    +	},
    +
    +	// update the value without triggering change
    +	_value: function( value, allowAny ) {
    +		var parsed;
    +		if ( value !== "" ) {
    +			parsed = this._parse( value );
    +			if ( parsed !== null ) {
    +				if ( !allowAny ) {
    +					parsed = this._adjustValue( parsed );
    +				}
    +				value = this._format( parsed );
    +			}
    +		}
    +		this.element.val( value );
    +		this._refresh();
    +	},
    +
    +	_destroy: function() {
    +		this.element
    +			.removeClass( "ui-spinner-input" )
    +			.prop( "disabled", false )
    +			.removeAttr( "autocomplete" )
    +			.removeAttr( "role" )
    +			.removeAttr( "aria-valuemin" )
    +			.removeAttr( "aria-valuemax" )
    +			.removeAttr( "aria-valuenow" );
    +		this.uiSpinner.replaceWith( this.element );
    +	},
    +
    +	stepUp: modifier(function( steps ) {
    +		this._stepUp( steps );
    +	}),
    +	_stepUp: function( steps ) {
    +		this._spin( (steps || 1) * this.options.step );
    +	},
    +
    +	stepDown: modifier(function( steps ) {
    +		this._stepDown( steps );
    +	}),
    +	_stepDown: function( steps ) {
    +		this._spin( (steps || 1) * -this.options.step );
    +	},
    +
    +	pageUp: modifier(function( pages ) {
    +		this._stepUp( (pages || 1) * this.options.page );
    +	}),
    +
    +	pageDown: modifier(function( pages ) {
    +		this._stepDown( (pages || 1) * this.options.page );
    +	}),
    +
    +	value: function( newVal ) {
    +		if ( !arguments.length ) {
    +			return this._parse( this.element.val() );
    +		}
    +		modifier( this._value ).call( this, newVal );
    +	},
    +
    +	widget: function() {
    +		return this.uiSpinner;
    +	}
    +});
    +
    +}( jQuery ) );
    +(function( $, undefined ) {
    +
    +var tabId = 0,
    +	rhash = /#.*$/;
    +
    +function getNextTabId() {
    +	return ++tabId;
    +}
    +
    +function isLocal( anchor ) {
    +	return anchor.hash.length > 1 &&
    +		anchor.href.replace( rhash, "" ) ===
    +			location.href.replace( rhash, "" )
    +				// support: Safari 5.1
    +				// Safari 5.1 doesn't encode spaces in window.location
    +				// but it does encode spaces from anchors (#8777)
    +				.replace( /\s/g, "%20" );
    +}
    +
    +$.widget( "ui.tabs", {
    +	version: "1.9.2",
    +	delay: 300,
    +	options: {
    +		active: null,
    +		collapsible: false,
    +		event: "click",
    +		heightStyle: "content",
    +		hide: null,
    +		show: null,
    +
    +		// callbacks
    +		activate: null,
    +		beforeActivate: null,
    +		beforeLoad: null,
    +		load: null
    +	},
    +
    +	_create: function() {
    +		var that = this,
    +			options = this.options,
    +			active = options.active,
    +			locationHash = location.hash.substring( 1 );
    +
    +		this.running = false;
    +
    +		this.element
    +			.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
    +			.toggleClass( "ui-tabs-collapsible", options.collapsible )
    +			// Prevent users from focusing disabled tabs via click
    +			.delegate( ".ui-tabs-nav > li", "mousedown" + this.eventNamespace, function( event ) {
    +				if ( $( this ).is( ".ui-state-disabled" ) ) {
    +					event.preventDefault();
    +				}
    +			})
    +			// support: IE <9
    +			// Preventing the default action in mousedown doesn't prevent IE
    +			// from focusing the element, so if the anchor gets focused, blur.
    +			// We don't have to worry about focusing the previously focused
    +			// element since clicking on a non-focusable element should focus
    +			// the body anyway.
    +			.delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
    +				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
    +					this.blur();
    +				}
    +			});
    +
    +		this._processTabs();
    +
    +		if ( active === null ) {
    +			// check the fragment identifier in the URL
    +			if ( locationHash ) {
    +				this.tabs.each(function( i, tab ) {
    +					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
    +						active = i;
    +						return false;
    +					}
    +				});
    +			}
    +
    +			// check for a tab marked active via a class
    +			if ( active === null ) {
    +				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
    +			}
    +
    +			// no active tab, set to false
    +			if ( active === null || active === -1 ) {
    +				active = this.tabs.length ? 0 : false;
    +			}
    +		}
    +
    +		// handle numbers: negative, out of range
    +		if ( active !== false ) {
    +			active = this.tabs.index( this.tabs.eq( active ) );
    +			if ( active === -1 ) {
    +				active = options.collapsible ? false : 0;
    +			}
    +		}
    +		options.active = active;
    +
    +		// don't allow collapsible: false and active: false
    +		if ( !options.collapsible && options.active === false && this.anchors.length ) {
    +			options.active = 0;
    +		}
    +
    +		// Take disabling tabs via class attribute from HTML
    +		// into account and update option properly.
    +		if ( $.isArray( options.disabled ) ) {
    +			options.disabled = $.unique( options.disabled.concat(
    +				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
    +					return that.tabs.index( li );
    +				})
    +			) ).sort();
    +		}
    +
    +		// check for length avoids error when initializing empty list
    +		if ( this.options.active !== false && this.anchors.length ) {
    +			this.active = this._findActive( this.options.active );
    +		} else {
    +			this.active = $();
    +		}
    +
    +		this._refresh();
    +
    +		if ( this.active.length ) {
    +			this.load( options.active );
    +		}
    +	},
    +
    +	_getCreateEventData: function() {
    +		return {
    +			tab: this.active,
    +			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
    +		};
    +	},
    +
    +	_tabKeydown: function( event ) {
    +		var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
    +			selectedIndex = this.tabs.index( focusedTab ),
    +			goingForward = true;
    +
    +		if ( this._handlePageNav( event ) ) {
    +			return;
    +		}
    +
    +		switch ( event.keyCode ) {
    +			case $.ui.keyCode.RIGHT:
    +			case $.ui.keyCode.DOWN:
    +				selectedIndex++;
    +				break;
    +			case $.ui.keyCode.UP:
    +			case $.ui.keyCode.LEFT:
    +				goingForward = false;
    +				selectedIndex--;
    +				break;
    +			case $.ui.keyCode.END:
    +				selectedIndex = this.anchors.length - 1;
    +				break;
    +			case $.ui.keyCode.HOME:
    +				selectedIndex = 0;
    +				break;
    +			case $.ui.keyCode.SPACE:
    +				// Activate only, no collapsing
    +				event.preventDefault();
    +				clearTimeout( this.activating );
    +				this._activate( selectedIndex );
    +				return;
    +			case $.ui.keyCode.ENTER:
    +				// Toggle (cancel delayed activation, allow collapsing)
    +				event.preventDefault();
    +				clearTimeout( this.activating );
    +				// Determine if we should collapse or activate
    +				this._activate( selectedIndex === this.options.active ? false : selectedIndex );
    +				return;
    +			default:
    +				return;
    +		}
    +
    +		// Focus the appropriate tab, based on which key was pressed
    +		event.preventDefault();
    +		clearTimeout( this.activating );
    +		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
    +
    +		// Navigating with control key will prevent automatic activation
    +		if ( !event.ctrlKey ) {
    +			// Update aria-selected immediately so that AT think the tab is already selected.
    +			// Otherwise AT may confuse the user by stating that they need to activate the tab,
    +			// but the tab will already be activated by the time the announcement finishes.
    +			focusedTab.attr( "aria-selected", "false" );
    +			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
    +
    +			this.activating = this._delay(function() {
    +				this.option( "active", selectedIndex );
    +			}, this.delay );
    +		}
    +	},
    +
    +	_panelKeydown: function( event ) {
    +		if ( this._handlePageNav( event ) ) {
    +			return;
    +		}
    +
    +		// Ctrl+up moves focus to the current tab
    +		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
    +			event.preventDefault();
    +			this.active.focus();
    +		}
    +	},
    +
    +	// Alt+page up/down moves focus to the previous/next tab (and activates)
    +	_handlePageNav: function( event ) {
    +		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
    +			this._activate( this._focusNextTab( this.options.active - 1, false ) );
    +			return true;
    +		}
    +		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
    +			this._activate( this._focusNextTab( this.options.active + 1, true ) );
    +			return true;
    +		}
    +	},
    +
    +	_findNextTab: function( index, goingForward ) {
    +		var lastTabIndex = this.tabs.length - 1;
    +
    +		function constrain() {
    +			if ( index > lastTabIndex ) {
    +				index = 0;
    +			}
    +			if ( index < 0 ) {
    +				index = lastTabIndex;
    +			}
    +			return index;
    +		}
    +
    +		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
    +			index = goingForward ? index + 1 : index - 1;
    +		}
    +
    +		return index;
    +	},
    +
    +	_focusNextTab: function( index, goingForward ) {
    +		index = this._findNextTab( index, goingForward );
    +		this.tabs.eq( index ).focus();
    +		return index;
    +	},
    +
    +	_setOption: function( key, value ) {
    +		if ( key === "active" ) {
    +			// _activate() will handle invalid values and update this.options
    +			this._activate( value );
    +			return;
    +		}
    +
    +		if ( key === "disabled" ) {
    +			// don't use the widget factory's disabled handling
    +			this._setupDisabled( value );
    +			return;
    +		}
    +
    +		this._super( key, value);
    +
    +		if ( key === "collapsible" ) {
    +			this.element.toggleClass( "ui-tabs-collapsible", value );
    +			// Setting collapsible: false while collapsed; open first panel
    +			if ( !value && this.options.active === false ) {
    +				this._activate( 0 );
    +			}
    +		}
    +
    +		if ( key === "event" ) {
    +			this._setupEvents( value );
    +		}
    +
    +		if ( key === "heightStyle" ) {
    +			this._setupHeightStyle( value );
    +		}
    +	},
    +
    +	_tabId: function( tab ) {
    +		return tab.attr( "aria-controls" ) || "ui-tabs-" + getNextTabId();
    +	},
    +
    +	_sanitizeSelector: function( hash ) {
    +		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
    +	},
    +
    +	refresh: function() {
    +		var options = this.options,
    +			lis = this.tablist.children( ":has(a[href])" );
    +
    +		// get disabled tabs from class attribute from HTML
    +		// this will get converted to a boolean if needed in _refresh()
    +		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
    +			return lis.index( tab );
    +		});
    +
    +		this._processTabs();
    +
    +		// was collapsed or no tabs
    +		if ( options.active === false || !this.anchors.length ) {
    +			options.active = false;
    +			this.active = $();
    +		// was active, but active tab is gone
    +		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
    +			// all remaining tabs are disabled
    +			if ( this.tabs.length === options.disabled.length ) {
    +				options.active = false;
    +				this.active = $();
    +			// activate previous tab
    +			} else {
    +				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
    +			}
    +		// was active, active tab still exists
    +		} else {
    +			// make sure active index is correct
    +			options.active = this.tabs.index( this.active );
    +		}
    +
    +		this._refresh();
    +	},
    +
    +	_refresh: function() {
    +		this._setupDisabled( this.options.disabled );
    +		this._setupEvents( this.options.event );
    +		this._setupHeightStyle( this.options.heightStyle );
    +
    +		this.tabs.not( this.active ).attr({
    +			"aria-selected": "false",
    +			tabIndex: -1
    +		});
    +		this.panels.not( this._getPanelForTab( this.active ) )
    +			.hide()
    +			.attr({
    +				"aria-expanded": "false",
    +				"aria-hidden": "true"
    +			});
    +
    +		// Make sure one tab is in the tab order
    +		if ( !this.active.length ) {
    +			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
    +		} else {
    +			this.active
    +				.addClass( "ui-tabs-active ui-state-active" )
    +				.attr({
    +					"aria-selected": "true",
    +					tabIndex: 0
    +				});
    +			this._getPanelForTab( this.active )
    +				.show()
    +				.attr({
    +					"aria-expanded": "true",
    +					"aria-hidden": "false"
    +				});
    +		}
    +	},
    +
    +	_processTabs: function() {
    +		var that = this;
    +
    +		this.tablist = this._getList()
    +			.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
    +			.attr( "role", "tablist" );
    +
    +		this.tabs = this.tablist.find( "> li:has(a[href])" )
    +			.addClass( "ui-state-default ui-corner-top" )
    +			.attr({
    +				role: "tab",
    +				tabIndex: -1
    +			});
    +
    +		this.anchors = this.tabs.map(function() {
    +				return $( "a", this )[ 0 ];
    +			})
    +			.addClass( "ui-tabs-anchor" )
    +			.attr({
    +				role: "presentation",
    +				tabIndex: -1
    +			});
    +
    +		this.panels = $();
    +
    +		this.anchors.each(function( i, anchor ) {
    +			var selector, panel, panelId,
    +				anchorId = $( anchor ).uniqueId().attr( "id" ),
    +				tab = $( anchor ).closest( "li" ),
    +				originalAriaControls = tab.attr( "aria-controls" );
    +
    +			// inline tab
    +			if ( isLocal( anchor ) ) {
    +				selector = anchor.hash;
    +				panel = that.element.find( that._sanitizeSelector( selector ) );
    +			// remote tab
    +			} else {
    +				panelId = that._tabId( tab );
    +				selector = "#" + panelId;
    +				panel = that.element.find( selector );
    +				if ( !panel.length ) {
    +					panel = that._createPanel( panelId );
    +					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
    +				}
    +				panel.attr( "aria-live", "polite" );
    +			}
    +
    +			if ( panel.length) {
    +				that.panels = that.panels.add( panel );
    +			}
    +			if ( originalAriaControls ) {
    +				tab.data( "ui-tabs-aria-controls", originalAriaControls );
    +			}
    +			tab.attr({
    +				"aria-controls": selector.substring( 1 ),
    +				"aria-labelledby": anchorId
    +			});
    +			panel.attr( "aria-labelledby", anchorId );
    +		});
    +
    +		this.panels
    +			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
    +			.attr( "role", "tabpanel" );
    +	},
    +
    +	// allow overriding how to find the list for rare usage scenarios (#7715)
    +	_getList: function() {
    +		return this.element.find( "ol,ul" ).eq( 0 );
    +	},
    +
    +	_createPanel: function( id ) {
    +		return $( "<div>" )
    +			.attr( "id", id )
    +			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
    +			.data( "ui-tabs-destroy", true );
    +	},
    +
    +	_setupDisabled: function( disabled ) {
    +		if ( $.isArray( disabled ) ) {
    +			if ( !disabled.length ) {
    +				disabled = false;
    +			} else if ( disabled.length === this.anchors.length ) {
    +				disabled = true;
    +			}
    +		}
    +
    +		// disable tabs
    +		for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
    +			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
    +				$( li )
    +					.addClass( "ui-state-disabled" )
    +					.attr( "aria-disabled", "true" );
    +			} else {
    +				$( li )
    +					.removeClass( "ui-state-disabled" )
    +					.removeAttr( "aria-disabled" );
    +			}
    +		}
    +
    +		this.options.disabled = disabled;
    +	},
    +
    +	_setupEvents: function( event ) {
    +		var events = {
    +			click: function( event ) {
    +				event.preventDefault();
    +			}
    +		};
    +		if ( event ) {
    +			$.each( event.split(" "), function( index, eventName ) {
    +				events[ eventName ] = "_eventHandler";
    +			});
    +		}
    +
    +		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
    +		this._on( this.anchors, events );
    +		this._on( this.tabs, { keydown: "_tabKeydown" } );
    +		this._on( this.panels, { keydown: "_panelKeydown" } );
    +
    +		this._focusable( this.tabs );
    +		this._hoverable( this.tabs );
    +	},
    +
    +	_setupHeightStyle: function( heightStyle ) {
    +		var maxHeight, overflow,
    +			parent = this.element.parent();
    +
    +		if ( heightStyle === "fill" ) {
    +			// IE 6 treats height like minHeight, so we need to turn off overflow
    +			// in order to get a reliable height
    +			// we use the minHeight support test because we assume that only
    +			// browsers that don't support minHeight will treat height as minHeight
    +			if ( !$.support.minHeight ) {
    +				overflow = parent.css( "overflow" );
    +				parent.css( "overflow", "hidden");
    +			}
    +			maxHeight = parent.height();
    +			this.element.siblings( ":visible" ).each(function() {
    +				var elem = $( this ),
    +					position = elem.css( "position" );
    +
    +				if ( position === "absolute" || position === "fixed" ) {
    +					return;
    +				}
    +				maxHeight -= elem.outerHeight( true );
    +			});
    +			if ( overflow ) {
    +				parent.css( "overflow", overflow );
    +			}
    +
    +			this.element.children().not( this.panels ).each(function() {
    +				maxHeight -= $( this ).outerHeight( true );
    +			});
    +
    +			this.panels.each(function() {
    +				$( this ).height( Math.max( 0, maxHeight -
    +					$( this ).innerHeight() + $( this ).height() ) );
    +			})
    +			.css( "overflow", "auto" );
    +		} else if ( heightStyle === "auto" ) {
    +			maxHeight = 0;
    +			this.panels.each(function() {
    +				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
    +			}).height( maxHeight );
    +		}
    +	},
    +
    +	_eventHandler: function( event ) {
    +		var options = this.options,
    +			active = this.active,
    +			anchor = $( event.currentTarget ),
    +			tab = anchor.closest( "li" ),
    +			clickedIsActive = tab[ 0 ] === active[ 0 ],
    +			collapsing = clickedIsActive && options.collapsible,
    +			toShow = collapsing ? $() : this._getPanelForTab( tab ),
    +			toHide = !active.length ? $() : this._getPanelForTab( active ),
    +			eventData = {
    +				oldTab: active,
    +				oldPanel: toHide,
    +				newTab: collapsing ? $() : tab,
    +				newPanel: toShow
    +			};
    +
    +		event.preventDefault();
    +
    +		if ( tab.hasClass( "ui-state-disabled" ) ||
    +				// tab is already loading
    +				tab.hasClass( "ui-tabs-loading" ) ||
    +				// can't switch durning an animation
    +				this.running ||
    +				// click on active header, but not collapsible
    +				( clickedIsActive && !options.collapsible ) ||
    +				// allow canceling activation
    +				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
    +			return;
    +		}
    +
    +		options.active = collapsing ? false : this.tabs.index( tab );
    +
    +		this.active = clickedIsActive ? $() : tab;
    +		if ( this.xhr ) {
    +			this.xhr.abort();
    +		}
    +
    +		if ( !toHide.length && !toShow.length ) {
    +			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
    +		}
    +
    +		if ( toShow.length ) {
    +			this.load( this.tabs.index( tab ), event );
    +		}
    +		this._toggle( event, eventData );
    +	},
    +
    +	// handles show/hide for selecting tabs
    +	_toggle: function( event, eventData ) {
    +		var that = this,
    +			toShow = eventData.newPanel,
    +			toHide = eventData.oldPanel;
    +
    +		this.running = true;
    +
    +		function complete() {
    +			that.running = false;
    +			that._trigger( "activate", event, eventData );
    +		}
    +
    +		function show() {
    +			eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
    +
    +			if ( toShow.length && that.options.show ) {
    +				that._show( toShow, that.options.show, complete );
    +			} else {
    +				toShow.show();
    +				complete();
    +			}
    +		}
    +
    +		// start out by hiding, then showing, then completing
    +		if ( toHide.length && this.options.hide ) {
    +			this._hide( toHide, this.options.hide, function() {
    +				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
    +				show();
    +			});
    +		} else {
    +			eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
    +			toHide.hide();
    +			show();
    +		}
    +
    +		toHide.attr({
    +			"aria-expanded": "false",
    +			"aria-hidden": "true"
    +		});
    +		eventData.oldTab.attr( "aria-selected", "false" );
    +		// If we're switching tabs, remove the old tab from the tab order.
    +		// If we're opening from collapsed state, remove the previous tab from the tab order.
    +		// If we're collapsing, then keep the collapsing tab in the tab order.
    +		if ( toShow.length && toHide.length ) {
    +			eventData.oldTab.attr( "tabIndex", -1 );
    +		} else if ( toShow.length ) {
    +			this.tabs.filter(function() {
    +				return $( this ).attr( "tabIndex" ) === 0;
    +			})
    +			.attr( "tabIndex", -1 );
    +		}
    +
    +		toShow.attr({
    +			"aria-expanded": "true",
    +			"aria-hidden": "false"
    +		});
    +		eventData.newTab.attr({
    +			"aria-selected": "true",
    +			tabIndex: 0
    +		});
    +	},
    +
    +	_activate: function( index ) {
    +		var anchor,
    +			active = this._findActive( index );
    +
    +		// trying to activate the already active panel
    +		if ( active[ 0 ] === this.active[ 0 ] ) {
    +			return;
    +		}
    +
    +		// trying to collapse, simulate a click on the current active header
    +		if ( !active.length ) {
    +			active = this.active;
    +		}
    +
    +		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
    +		this._eventHandler({
    +			target: anchor,
    +			currentTarget: anchor,
    +			preventDefault: $.noop
    +		});
    +	},
    +
    +	_findActive: function( index ) {
    +		return index === false ? $() : this.tabs.eq( index );
    +	},
    +
    +	_getIndex: function( index ) {
    +		// meta-function to give users option to provide a href string instead of a numerical index.
    +		if ( typeof index === "string" ) {
    +			index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
    +		}
    +
    +		return index;
    +	},
    +
    +	_destroy: function() {
    +		if ( this.xhr ) {
    +			this.xhr.abort();
    +		}
    +
    +		this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
    +
    +		this.tablist
    +			.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
    +			.removeAttr( "role" );
    +
    +		this.anchors
    +			.removeClass( "ui-tabs-anchor" )
    +			.removeAttr( "role" )
    +			.removeAttr( "tabIndex" )
    +			.removeData( "href.tabs" )
    +			.removeData( "load.tabs" )
    +			.removeUniqueId();
    +
    +		this.tabs.add( this.panels ).each(function() {
    +			if ( $.data( this, "ui-tabs-destroy" ) ) {
    +				$( this ).remove();
    +			} else {
    +				$( this )
    +					.removeClass( "ui-state-default ui-state-active ui-state-disabled " +
    +						"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
    +					.removeAttr( "tabIndex" )
    +					.removeAttr( "aria-live" )
    +					.removeAttr( "aria-busy" )
    +					.removeAttr( "aria-selected" )
    +					.removeAttr( "aria-labelledby" )
    +					.removeAttr( "aria-hidden" )
    +					.removeAttr( "aria-expanded" )
    +					.removeAttr( "role" );
    +			}
    +		});
    +
    +		this.tabs.each(function() {
    +			var li = $( this ),
    +				prev = li.data( "ui-tabs-aria-controls" );
    +			if ( prev ) {
    +				li.attr( "aria-controls", prev );
    +			} else {
    +				li.removeAttr( "aria-controls" );
    +			}
    +		});
    +
    +		this.panels.show();
    +
    +		if ( this.options.heightStyle !== "content" ) {
    +			this.panels.css( "height", "" );
    +		}
    +	},
    +
    +	enable: function( index ) {
    +		var disabled = this.options.disabled;
    +		if ( disabled === false ) {
    +			return;
    +		}
    +
    +		if ( index === undefined ) {
    +			disabled = false;
    +		} else {
    +			index = this._getIndex( index );
    +			if ( $.isArray( disabled ) ) {
    +				disabled = $.map( disabled, function( num ) {
    +					return num !== index ? num : null;
    +				});
    +			} else {
    +				disabled = $.map( this.tabs, function( li, num ) {
    +					return num !== index ? num : null;
    +				});
    +			}
    +		}
    +		this._setupDisabled( disabled );
    +	},
    +
    +	disable: function( index ) {
    +		var disabled = this.options.disabled;
    +		if ( disabled === true ) {
    +			return;
    +		}
    +
    +		if ( index === undefined ) {
    +			disabled = true;
    +		} else {
    +			index = this._getIndex( index );
    +			if ( $.inArray( index, disabled ) !== -1 ) {
    +				return;
    +			}
    +			if ( $.isArray( disabled ) ) {
    +				disabled = $.merge( [ index ], disabled ).sort();
    +			} else {
    +				disabled = [ index ];
    +			}
    +		}
    +		this._setupDisabled( disabled );
    +	},
    +
    +	load: function( index, event ) {
    +		index = this._getIndex( index );
    +		var that = this,
    +			tab = this.tabs.eq( index ),
    +			anchor = tab.find( ".ui-tabs-anchor" ),
    +			panel = this._getPanelForTab( tab ),
    +			eventData = {
    +				tab: tab,
    +				panel: panel
    +			};
    +
    +		// not remote
    +		if ( isLocal( anchor[ 0 ] ) ) {
    +			return;
    +		}
    +
    +		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
    +
    +		// support: jQuery <1.8
    +		// jQuery <1.8 returns false if the request is canceled in beforeSend,
    +		// but as of 1.8, $.ajax() always returns a jqXHR object.
    +		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
    +			tab.addClass( "ui-tabs-loading" );
    +			panel.attr( "aria-busy", "true" );
    +
    +			this.xhr
    +				.success(function( response ) {
    +					// support: jQuery <1.8
    +					// http://bugs.jquery.com/ticket/11778
    +					setTimeout(function() {
    +						panel.html( response );
    +						that._trigger( "load", event, eventData );
    +					}, 1 );
    +				})
    +				.complete(function( jqXHR, status ) {
    +					// support: jQuery <1.8
    +					// http://bugs.jquery.com/ticket/11778
    +					setTimeout(function() {
    +						if ( status === "abort" ) {
    +							that.panels.stop( false, true );
    +						}
    +
    +						tab.removeClass( "ui-tabs-loading" );
    +						panel.removeAttr( "aria-busy" );
    +
    +						if ( jqXHR === that.xhr ) {
    +							delete that.xhr;
    +						}
    +					}, 1 );
    +				});
    +		}
    +	},
    +
    +	// TODO: Remove this function in 1.10 when ajaxOptions is removed
    +	_ajaxSettings: function( anchor, event, eventData ) {
    +		var that = this;
    +		return {
    +			url: anchor.attr( "href" ),
    +			beforeSend: function( jqXHR, settings ) {
    +				return that._trigger( "beforeLoad", event,
    +					$.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) );
    +			}
    +		};
    +	},
    +
    +	_getPanelForTab: function( tab ) {
    +		var id = $( tab ).attr( "aria-controls" );
    +		return this.element.find( this._sanitizeSelector( "#" + id ) );
    +	}
    +});
    +
    +// DEPRECATED
    +if ( $.uiBackCompat !== false ) {
    +
    +	// helper method for a lot of the back compat extensions
    +	$.ui.tabs.prototype._ui = function( tab, panel ) {
    +		return {
    +			tab: tab,
    +			panel: panel,
    +			index: this.anchors.index( tab )
    +		};
    +	};
    +
    +	// url method
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		url: function( index, url ) {
    +			this.anchors.eq( index ).attr( "href", url );
    +		}
    +	});
    +
    +	// TODO: Remove _ajaxSettings() method when removing this extension
    +	// ajaxOptions and cache options
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			ajaxOptions: null,
    +			cache: false
    +		},
    +
    +		_create: function() {
    +			this._super();
    +
    +			var that = this;
    +
    +			this._on({ tabsbeforeload: function( event, ui ) {
    +				// tab is already cached
    +				if ( $.data( ui.tab[ 0 ], "cache.tabs" ) ) {
    +					event.preventDefault();
    +					return;
    +				}
    +
    +				ui.jqXHR.success(function() {
    +					if ( that.options.cache ) {
    +						$.data( ui.tab[ 0 ], "cache.tabs", true );
    +					}
    +				});
    +			}});
    +		},
    +
    +		_ajaxSettings: function( anchor, event, ui ) {
    +			var ajaxOptions = this.options.ajaxOptions;
    +			return $.extend( {}, ajaxOptions, {
    +				error: function( xhr, status ) {
    +					try {
    +						// Passing index avoid a race condition when this method is
    +						// called after the user has selected another tab.
    +						// Pass the anchor that initiated this request allows
    +						// loadError to manipulate the tab content panel via $(a.hash)
    +						ajaxOptions.error(
    +							xhr, status, ui.tab.closest( "li" ).index(), ui.tab[ 0 ] );
    +					}
    +					catch ( error ) {}
    +				}
    +			}, this._superApply( arguments ) );
    +		},
    +
    +		_setOption: function( key, value ) {
    +			// reset cache if switching from cached to not cached
    +			if ( key === "cache" && value === false ) {
    +				this.anchors.removeData( "cache.tabs" );
    +			}
    +			this._super( key, value );
    +		},
    +
    +		_destroy: function() {
    +			this.anchors.removeData( "cache.tabs" );
    +			this._super();
    +		},
    +
    +		url: function( index ){
    +			this.anchors.eq( index ).removeData( "cache.tabs" );
    +			this._superApply( arguments );
    +		}
    +	});
    +
    +	// abort method
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		abort: function() {
    +			if ( this.xhr ) {
    +				this.xhr.abort();
    +			}
    +		}
    +	});
    +
    +	// spinner
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			spinner: "<em>Loading&#8230;</em>"
    +		},
    +		_create: function() {
    +			this._super();
    +			this._on({
    +				tabsbeforeload: function( event, ui ) {
    +					// Don't react to nested tabs or tabs that don't use a spinner
    +					if ( event.target !== this.element[ 0 ] ||
    +							!this.options.spinner ) {
    +						return;
    +					}
    +
    +					var span = ui.tab.find( "span" ),
    +						html = span.html();
    +					span.html( this.options.spinner );
    +					ui.jqXHR.complete(function() {
    +						span.html( html );
    +					});
    +				}
    +			});
    +		}
    +	});
    +
    +	// enable/disable events
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			enable: null,
    +			disable: null
    +		},
    +
    +		enable: function( index ) {
    +			var options = this.options,
    +				trigger;
    +
    +			if ( index && options.disabled === true ||
    +					( $.isArray( options.disabled ) && $.inArray( index, options.disabled ) !== -1 ) ) {
    +				trigger = true;
    +			}
    +
    +			this._superApply( arguments );
    +
    +			if ( trigger ) {
    +				this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
    +			}
    +		},
    +
    +		disable: function( index ) {
    +			var options = this.options,
    +				trigger;
    +
    +			if ( index && options.disabled === false ||
    +					( $.isArray( options.disabled ) && $.inArray( index, options.disabled ) === -1 ) ) {
    +				trigger = true;
    +			}
    +
    +			this._superApply( arguments );
    +
    +			if ( trigger ) {
    +				this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
    +			}
    +		}
    +	});
    +
    +	// add/remove methods and events
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			add: null,
    +			remove: null,
    +			tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
    +		},
    +
    +		add: function( url, label, index ) {
    +			if ( index === undefined ) {
    +				index = this.anchors.length;
    +			}
    +
    +			var doInsertAfter, panel,
    +				options = this.options,
    +				li = $( options.tabTemplate
    +					.replace( /#\{href\}/g, url )
    +					.replace( /#\{label\}/g, label ) ),
    +				id = !url.indexOf( "#" ) ?
    +					url.replace( "#", "" ) :
    +					this._tabId( li );
    +
    +			li.addClass( "ui-state-default ui-corner-top" ).data( "ui-tabs-destroy", true );
    +			li.attr( "aria-controls", id );
    +
    +			doInsertAfter = index >= this.tabs.length;
    +
    +			// try to find an existing element before creating a new one
    +			panel = this.element.find( "#" + id );
    +			if ( !panel.length ) {
    +				panel = this._createPanel( id );
    +				if ( doInsertAfter ) {
    +					if ( index > 0 ) {
    +						panel.insertAfter( this.panels.eq( -1 ) );
    +					} else {
    +						panel.appendTo( this.element );
    +					}
    +				} else {
    +					panel.insertBefore( this.panels[ index ] );
    +				}
    +			}
    +			panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ).hide();
    +
    +			if ( doInsertAfter ) {
    +				li.appendTo( this.tablist );
    +			} else {
    +				li.insertBefore( this.tabs[ index ] );
    +			}
    +
    +			options.disabled = $.map( options.disabled, function( n ) {
    +				return n >= index ? ++n : n;
    +			});
    +
    +			this.refresh();
    +			if ( this.tabs.length === 1 && options.active === false ) {
    +				this.option( "active", 0 );
    +			}
    +
    +			this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
    +			return this;
    +		},
    +
    +		remove: function( index ) {
    +			index = this._getIndex( index );
    +			var options = this.options,
    +				tab = this.tabs.eq( index ).remove(),
    +				panel = this._getPanelForTab( tab ).remove();
    +
    +			// If selected tab was removed focus tab to the right or
    +			// in case the last tab was removed the tab to the left.
    +			// We check for more than 2 tabs, because if there are only 2,
    +			// then when we remove this tab, there will only be one tab left
    +			// so we don't need to detect which tab to activate.
    +			if ( tab.hasClass( "ui-tabs-active" ) && this.anchors.length > 2 ) {
    +				this._activate( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
    +			}
    +
    +			options.disabled = $.map(
    +				$.grep( options.disabled, function( n ) {
    +					return n !== index;
    +				}),
    +				function( n ) {
    +					return n >= index ? --n : n;
    +				});
    +
    +			this.refresh();
    +
    +			this._trigger( "remove", null, this._ui( tab.find( "a" )[ 0 ], panel[ 0 ] ) );
    +			return this;
    +		}
    +	});
    +
    +	// length method
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		length: function() {
    +			return this.anchors.length;
    +		}
    +	});
    +
    +	// panel ids (idPrefix option + title attribute)
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			idPrefix: "ui-tabs-"
    +		},
    +
    +		_tabId: function( tab ) {
    +			var a = tab.is( "li" ) ? tab.find( "a[href]" ) : tab;
    +			a = a[0];
    +			return $( a ).closest( "li" ).attr( "aria-controls" ) ||
    +				a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF\-]/g, "" ) ||
    +				this.options.idPrefix + getNextTabId();
    +		}
    +	});
    +
    +	// _createPanel method
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			panelTemplate: "<div></div>"
    +		},
    +
    +		_createPanel: function( id ) {
    +			return $( this.options.panelTemplate )
    +				.attr( "id", id )
    +				.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
    +				.data( "ui-tabs-destroy", true );
    +		}
    +	});
    +
    +	// selected option
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		_create: function() {
    +			var options = this.options;
    +			if ( options.active === null && options.selected !== undefined ) {
    +				options.active = options.selected === -1 ? false : options.selected;
    +			}
    +			this._super();
    +			options.selected = options.active;
    +			if ( options.selected === false ) {
    +				options.selected = -1;
    +			}
    +		},
    +
    +		_setOption: function( key, value ) {
    +			if ( key !== "selected" ) {
    +				return this._super( key, value );
    +			}
    +
    +			var options = this.options;
    +			this._super( "active", value === -1 ? false : value );
    +			options.selected = options.active;
    +			if ( options.selected === false ) {
    +				options.selected = -1;
    +			}
    +		},
    +
    +		_eventHandler: function() {
    +			this._superApply( arguments );
    +			this.options.selected = this.options.active;
    +			if ( this.options.selected === false ) {
    +				this.options.selected = -1;
    +			}
    +		}
    +	});
    +
    +	// show and select event
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			show: null,
    +			select: null
    +		},
    +		_create: function() {
    +			this._super();
    +			if ( this.options.active !== false ) {
    +				this._trigger( "show", null, this._ui(
    +					this.active.find( ".ui-tabs-anchor" )[ 0 ],
    +					this._getPanelForTab( this.active )[ 0 ] ) );
    +			}
    +		},
    +		_trigger: function( type, event, data ) {
    +			var tab, panel,
    +				ret = this._superApply( arguments );
    +
    +			if ( !ret ) {
    +				return false;
    +			}
    +
    +			if ( type === "beforeActivate" ) {
    +				tab = data.newTab.length ? data.newTab : data.oldTab;
    +				panel = data.newPanel.length ? data.newPanel : data.oldPanel;
    +				ret = this._super( "select", event, {
    +					tab: tab.find( ".ui-tabs-anchor" )[ 0],
    +					panel: panel[ 0 ],
    +					index: tab.closest( "li" ).index()
    +				});
    +			} else if ( type === "activate" && data.newTab.length ) {
    +				ret = this._super( "show", event, {
    +					tab: data.newTab.find( ".ui-tabs-anchor" )[ 0 ],
    +					panel: data.newPanel[ 0 ],
    +					index: data.newTab.closest( "li" ).index()
    +				});
    +			}
    +			return ret;
    +		}
    +	});
    +
    +	// select method
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		select: function( index ) {
    +			index = this._getIndex( index );
    +			if ( index === -1 ) {
    +				if ( this.options.collapsible && this.options.selected !== -1 ) {
    +					index = this.options.selected;
    +				} else {
    +					return;
    +				}
    +			}
    +			this.anchors.eq( index ).trigger( this.options.event + this.eventNamespace );
    +		}
    +	});
    +
    +	// cookie option
    +	(function() {
    +
    +	var listId = 0;
    +
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			cookie: null // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
    +		},
    +		_create: function() {
    +			var options = this.options,
    +				active;
    +			if ( options.active == null && options.cookie ) {
    +				active = parseInt( this._cookie(), 10 );
    +				if ( active === -1 ) {
    +					active = false;
    +				}
    +				options.active = active;
    +			}
    +			this._super();
    +		},
    +		_cookie: function( active ) {
    +			var cookie = [ this.cookie ||
    +				( this.cookie = this.options.cookie.name || "ui-tabs-" + (++listId) ) ];
    +			if ( arguments.length ) {
    +				cookie.push( active === false ? -1 : active );
    +				cookie.push( this.options.cookie );
    +			}
    +			return $.cookie.apply( null, cookie );
    +		},
    +		_refresh: function() {
    +			this._super();
    +			if ( this.options.cookie ) {
    +				this._cookie( this.options.active, this.options.cookie );
    +			}
    +		},
    +		_eventHandler: function() {
    +			this._superApply( arguments );
    +			if ( this.options.cookie ) {
    +				this._cookie( this.options.active, this.options.cookie );
    +			}
    +		},
    +		_destroy: function() {
    +			this._super();
    +			if ( this.options.cookie ) {
    +				this._cookie( null, this.options.cookie );
    +			}
    +		}
    +	});
    +
    +	})();
    +
    +	// load event
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		_trigger: function( type, event, data ) {
    +			var _data = $.extend( {}, data );
    +			if ( type === "load" ) {
    +				_data.panel = _data.panel[ 0 ];
    +				_data.tab = _data.tab.find( ".ui-tabs-anchor" )[ 0 ];
    +			}
    +			return this._super( type, event, _data );
    +		}
    +	});
    +
    +	// fx option
    +	// The new animation options (show, hide) conflict with the old show callback.
    +	// The old fx option wins over show/hide anyway (always favor back-compat).
    +	// If a user wants to use the new animation API, they must give up the old API.
    +	$.widget( "ui.tabs", $.ui.tabs, {
    +		options: {
    +			fx: null // e.g. { height: "toggle", opacity: "toggle", duration: 200 }
    +		},
    +
    +		_getFx: function() {
    +			var hide, show,
    +				fx = this.options.fx;
    +
    +			if ( fx ) {
    +				if ( $.isArray( fx ) ) {
    +					hide = fx[ 0 ];
    +					show = fx[ 1 ];
    +				} else {
    +					hide = show = fx;
    +				}
    +			}
    +
    +			return fx ? { show: show, hide: hide } : null;
    +		},
    +
    +		_toggle: function( event, eventData ) {
    +			var that = this,
    +				toShow = eventData.newPanel,
    +				toHide = eventData.oldPanel,
    +				fx = this._getFx();
    +
    +			if ( !fx ) {
    +				return this._super( event, eventData );
    +			}
    +
    +			that.running = true;
    +
    +			function complete() {
    +				that.running = false;
    +				that._trigger( "activate", event, eventData );
    +			}
    +
    +			function show() {
    +				eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
    +
    +				if ( toShow.length && fx.show ) {
    +					toShow
    +						.animate( fx.show, fx.show.duration, function() {
    +							complete();
    +						});
    +				} else {
    +					toShow.show();
    +					complete();
    +				}
    +			}
    +
    +			// start out by hiding, then showing, then completing
    +			if ( toHide.length && fx.hide ) {
    +				toHide.animate( fx.hide, fx.hide.duration, function() {
    +					eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
    +					show();
    +				});
    +			} else {
    +				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
    +				toHide.hide();
    +				show();
    +			}
    +		}
    +	});
    +}
    +
    +})( jQuery );
    +(function( $ ) {
    +
    +var increments = 0;
    +
    +function addDescribedBy( elem, id ) {
    +	var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
    +	describedby.push( id );
    +	elem
    +		.data( "ui-tooltip-id", id )
    +		.attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
    +}
    +
    +function removeDescribedBy( elem ) {
    +	var id = elem.data( "ui-tooltip-id" ),
    +		describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
    +		index = $.inArray( id, describedby );
    +	if ( index !== -1 ) {
    +		describedby.splice( index, 1 );
    +	}
    +
    +	elem.removeData( "ui-tooltip-id" );
    +	describedby = $.trim( describedby.join( " " ) );
    +	if ( describedby ) {
    +		elem.attr( "aria-describedby", describedby );
    +	} else {
    +		elem.removeAttr( "aria-describedby" );
    +	}
    +}
    +
    +$.widget( "ui.tooltip", {
    +	version: "1.9.2",
    +	options: {
    +		content: function() {
    +			return $( this ).attr( "title" );
    +		},
    +		hide: true,
    +		// Disabled elements have inconsistent behavior across browsers (#8661)
    +		items: "[title]:not([disabled])",
    +		position: {
    +			my: "left top+15",
    +			at: "left bottom",
    +			collision: "flipfit flip"
    +		},
    +		show: true,
    +		tooltipClass: null,
    +		track: false,
    +
    +		// callbacks
    +		close: null,
    +		open: null
    +	},
    +
    +	_create: function() {
    +		this._on({
    +			mouseover: "open",
    +			focusin: "open"
    +		});
    +
    +		// IDs of generated tooltips, needed for destroy
    +		this.tooltips = {};
    +		// IDs of parent tooltips where we removed the title attribute
    +		this.parents = {};
    +
    +		if ( this.options.disabled ) {
    +			this._disable();
    +		}
    +	},
    +
    +	_setOption: function( key, value ) {
    +		var that = this;
    +
    +		if ( key === "disabled" ) {
    +			this[ value ? "_disable" : "_enable" ]();
    +			this.options[ key ] = value;
    +			// disable element style changes
    +			return;
    +		}
    +
    +		this._super( key, value );
    +
    +		if ( key === "content" ) {
    +			$.each( this.tooltips, function( id, element ) {
    +				that._updateContent( element );
    +			});
    +		}
    +	},
    +
    +	_disable: function() {
    +		var that = this;
    +
    +		// close open tooltips
    +		$.each( this.tooltips, function( id, element ) {
    +			var event = $.Event( "blur" );
    +			event.target = event.currentTarget = element[0];
    +			that.close( event, true );
    +		});
    +
    +		// remove title attributes to prevent native tooltips
    +		this.element.find( this.options.items ).andSelf().each(function() {
    +			var element = $( this );
    +			if ( element.is( "[title]" ) ) {
    +				element
    +					.data( "ui-tooltip-title", element.attr( "title" ) )
    +					.attr( "title", "" );
    +			}
    +		});
    +	},
    +
    +	_enable: function() {
    +		// restore title attributes
    +		this.element.find( this.options.items ).andSelf().each(function() {
    +			var element = $( this );
    +			if ( element.data( "ui-tooltip-title" ) ) {
    +				element.attr( "title", element.data( "ui-tooltip-title" ) );
    +			}
    +		});
    +	},
    +
    +	open: function( event ) {
    +		var that = this,
    +			target = $( event ? event.target : this.element )
    +				// we need closest here due to mouseover bubbling,
    +				// but always pointing at the same event target
    +				.closest( this.options.items );
    +
    +		// No element to show a tooltip for or the tooltip is already open
    +		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
    +			return;
    +		}
    +
    +		if ( target.attr( "title" ) ) {
    +			target.data( "ui-tooltip-title", target.attr( "title" ) );
    +		}
    +
    +		target.data( "ui-tooltip-open", true );
    +
    +		// kill parent tooltips, custom or native, for hover
    +		if ( event && event.type === "mouseover" ) {
    +			target.parents().each(function() {
    +				var parent = $( this ),
    +					blurEvent;
    +				if ( parent.data( "ui-tooltip-open" ) ) {
    +					blurEvent = $.Event( "blur" );
    +					blurEvent.target = blurEvent.currentTarget = this;
    +					that.close( blurEvent, true );
    +				}
    +				if ( parent.attr( "title" ) ) {
    +					parent.uniqueId();
    +					that.parents[ this.id ] = {
    +						element: this,
    +						title: parent.attr( "title" )
    +					};
    +					parent.attr( "title", "" );
    +				}
    +			});
    +		}
    +
    +		this._updateContent( target, event );
    +	},
    +
    +	_updateContent: function( target, event ) {
    +		var content,
    +			contentOption = this.options.content,
    +			that = this,
    +			eventType = event ? event.type : null;
    +
    +		if ( typeof contentOption === "string" ) {
    +			return this._open( event, target, contentOption );
    +		}
    +
    +		content = contentOption.call( target[0], function( response ) {
    +			// ignore async response if tooltip was closed already
    +			if ( !target.data( "ui-tooltip-open" ) ) {
    +				return;
    +			}
    +			// IE may instantly serve a cached response for ajax requests
    +			// delay this call to _open so the other call to _open runs first
    +			that._delay(function() {
    +				// jQuery creates a special event for focusin when it doesn't
    +				// exist natively. To improve performance, the native event
    +				// object is reused and the type is changed. Therefore, we can't
    +				// rely on the type being correct after the event finished
    +				// bubbling, so we set it back to the previous value. (#8740)
    +				if ( event ) {
    +					event.type = eventType;
    +				}
    +				this._open( event, target, response );
    +			});
    +		});
    +		if ( content ) {
    +			this._open( event, target, content );
    +		}
    +	},
    +
    +	_open: function( event, target, content ) {
    +		var tooltip, events, delayedShow,
    +			positionOption = $.extend( {}, this.options.position );
    +
    +		if ( !content ) {
    +			return;
    +		}
    +
    +		// Content can be updated multiple times. If the tooltip already
    +		// exists, then just update the content and bail.
    +		tooltip = this._find( target );
    +		if ( tooltip.length ) {
    +			tooltip.find( ".ui-tooltip-content" ).html( content );
    +			return;
    +		}
    +
    +		// if we have a title, clear it to prevent the native tooltip
    +		// we have to check first to avoid defining a title if none exists
    +		// (we don't want to cause an element to start matching [title])
    +		//
    +		// We use removeAttr only for key events, to allow IE to export the correct
    +		// accessible attributes. For mouse events, set to empty string to avoid
    +		// native tooltip showing up (happens only when removing inside mouseover).
    +		if ( target.is( "[title]" ) ) {
    +			if ( event && event.type === "mouseover" ) {
    +				target.attr( "title", "" );
    +			} else {
    +				target.removeAttr( "title" );
    +			}
    +		}
    +
    +		tooltip = this._tooltip( target );
    +		addDescribedBy( target, tooltip.attr( "id" ) );
    +		tooltip.find( ".ui-tooltip-content" ).html( content );
    +
    +		function position( event ) {
    +			positionOption.of = event;
    +			if ( tooltip.is( ":hidden" ) ) {
    +				return;
    +			}
    +			tooltip.position( positionOption );
    +		}
    +		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
    +			this._on( this.document, {
    +				mousemove: position
    +			});
    +			// trigger once to override element-relative positioning
    +			position( event );
    +		} else {
    +			tooltip.position( $.extend({
    +				of: target
    +			}, this.options.position ) );
    +		}
    +
    +		tooltip.hide();
    +
    +		this._show( tooltip, this.options.show );
    +		// Handle tracking tooltips that are shown with a delay (#8644). As soon
    +		// as the tooltip is visible, position the tooltip using the most recent
    +		// event.
    +		if ( this.options.show && this.options.show.delay ) {
    +			delayedShow = setInterval(function() {
    +				if ( tooltip.is( ":visible" ) ) {
    +					position( positionOption.of );
    +					clearInterval( delayedShow );
    +				}
    +			}, $.fx.interval );
    +		}
    +
    +		this._trigger( "open", event, { tooltip: tooltip } );
    +
    +		events = {
    +			keyup: function( event ) {
    +				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
    +					var fakeEvent = $.Event(event);
    +					fakeEvent.currentTarget = target[0];
    +					this.close( fakeEvent, true );
    +				}
    +			},
    +			remove: function() {
    +				this._removeTooltip( tooltip );
    +			}
    +		};
    +		if ( !event || event.type === "mouseover" ) {
    +			events.mouseleave = "close";
    +		}
    +		if ( !event || event.type === "focusin" ) {
    +			events.focusout = "close";
    +		}
    +		this._on( true, target, events );
    +	},
    +
    +	close: function( event ) {
    +		var that = this,
    +			target = $( event ? event.currentTarget : this.element ),
    +			tooltip = this._find( target );
    +
    +		// disabling closes the tooltip, so we need to track when we're closing
    +		// to avoid an infinite loop in case the tooltip becomes disabled on close
    +		if ( this.closing ) {
    +			return;
    +		}
    +
    +		// only set title if we had one before (see comment in _open())
    +		if ( target.data( "ui-tooltip-title" ) ) {
    +			target.attr( "title", target.data( "ui-tooltip-title" ) );
    +		}
    +
    +		removeDescribedBy( target );
    +
    +		tooltip.stop( true );
    +		this._hide( tooltip, this.options.hide, function() {
    +			that._removeTooltip( $( this ) );
    +		});
    +
    +		target.removeData( "ui-tooltip-open" );
    +		this._off( target, "mouseleave focusout keyup" );
    +		// Remove 'remove' binding only on delegated targets
    +		if ( target[0] !== this.element[0] ) {
    +			this._off( target, "remove" );
    +		}
    +		this._off( this.document, "mousemove" );
    +
    +		if ( event && event.type === "mouseleave" ) {
    +			$.each( this.parents, function( id, parent ) {
    +				$( parent.element ).attr( "title", parent.title );
    +				delete that.parents[ id ];
    +			});
    +		}
    +
    +		this.closing = true;
    +		this._trigger( "close", event, { tooltip: tooltip } );
    +		this.closing = false;
    +	},
    +
    +	_tooltip: function( element ) {
    +		var id = "ui-tooltip-" + increments++,
    +			tooltip = $( "<div>" )
    +				.attr({
    +					id: id,
    +					role: "tooltip"
    +				})
    +				.addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
    +					( this.options.tooltipClass || "" ) );
    +		$( "<div>" )
    +			.addClass( "ui-tooltip-content" )
    +			.appendTo( tooltip );
    +		tooltip.appendTo( this.document[0].body );
    +		if ( $.fn.bgiframe ) {
    +			tooltip.bgiframe();
    +		}
    +		this.tooltips[ id ] = element;
    +		return tooltip;
    +	},
    +
    +	_find: function( target ) {
    +		var id = target.data( "ui-tooltip-id" );
    +		return id ? $( "#" + id ) : $();
    +	},
    +
    +	_removeTooltip: function( tooltip ) {
    +		tooltip.remove();
    +		delete this.tooltips[ tooltip.attr( "id" ) ];
    +	},
    +
    +	_destroy: function() {
    +		var that = this;
    +
    +		// close open tooltips
    +		$.each( this.tooltips, function( id, element ) {
    +			// Delegate to close method to handle common cleanup
    +			var event = $.Event( "blur" );
    +			event.target = event.currentTarget = element[0];
    +			that.close( event, true );
    +
    +			// Remove immediately; destroying an open tooltip doesn't use the
    +			// hide animation
    +			$( "#" + id ).remove();
    +
    +			// Restore the title
    +			if ( element.data( "ui-tooltip-title" ) ) {
    +				element.attr( "title", element.data( "ui-tooltip-title" ) );
    +				element.removeData( "ui-tooltip-title" );
    +			}
    +		});
    +	}
    +});
    +
    +}( jQuery ) );
    +;(jQuery.effects || (function($, undefined) {
    +
    +var backCompat = $.uiBackCompat !== false,
    +	// prefix used for storing data on .data()
    +	dataSpace = "ui-effects-";
    +
    +$.effects = {
    +	effect: {}
    +};
    +
    +/*!
    + * jQuery Color Animations v2.0.0
    + * http://jquery.com/
    + *
    + * Copyright 2012 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * Date: Mon Aug 13 13:41:02 2012 -0500
    + */
    +(function( jQuery, undefined ) {
    +
    +	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor".split(" "),
    +
    +	// plusequals test for += 100 -= 100
    +	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
    +	// a set of RE's that can match strings and generate color tuples.
    +	stringParsers = [{
    +			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
    +			parse: function( execResult ) {
    +				return [
    +					execResult[ 1 ],
    +					execResult[ 2 ],
    +					execResult[ 3 ],
    +					execResult[ 4 ]
    +				];
    +			}
    +		}, {
    +			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
    +			parse: function( execResult ) {
    +				return [
    +					execResult[ 1 ] * 2.55,
    +					execResult[ 2 ] * 2.55,
    +					execResult[ 3 ] * 2.55,
    +					execResult[ 4 ]
    +				];
    +			}
    +		}, {
    +			// this regex ignores A-F because it's compared against an already lowercased string
    +			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
    +			parse: function( execResult ) {
    +				return [
    +					parseInt( execResult[ 1 ], 16 ),
    +					parseInt( execResult[ 2 ], 16 ),
    +					parseInt( execResult[ 3 ], 16 )
    +				];
    +			}
    +		}, {
    +			// this regex ignores A-F because it's compared against an already lowercased string
    +			re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
    +			parse: function( execResult ) {
    +				return [
    +					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
    +					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
    +					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
    +				];
    +			}
    +		}, {
    +			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
    +			space: "hsla",
    +			parse: function( execResult ) {
    +				return [
    +					execResult[ 1 ],
    +					execResult[ 2 ] / 100,
    +					execResult[ 3 ] / 100,
    +					execResult[ 4 ]
    +				];
    +			}
    +		}],
    +
    +	// jQuery.Color( )
    +	color = jQuery.Color = function( color, green, blue, alpha ) {
    +		return new jQuery.Color.fn.parse( color, green, blue, alpha );
    +	},
    +	spaces = {
    +		rgba: {
    +			props: {
    +				red: {
    +					idx: 0,
    +					type: "byte"
    +				},
    +				green: {
    +					idx: 1,
    +					type: "byte"
    +				},
    +				blue: {
    +					idx: 2,
    +					type: "byte"
    +				}
    +			}
    +		},
    +
    +		hsla: {
    +			props: {
    +				hue: {
    +					idx: 0,
    +					type: "degrees"
    +				},
    +				saturation: {
    +					idx: 1,
    +					type: "percent"
    +				},
    +				lightness: {
    +					idx: 2,
    +					type: "percent"
    +				}
    +			}
    +		}
    +	},
    +	propTypes = {
    +		"byte": {
    +			floor: true,
    +			max: 255
    +		},
    +		"percent": {
    +			max: 1
    +		},
    +		"degrees": {
    +			mod: 360,
    +			floor: true
    +		}
    +	},
    +	support = color.support = {},
    +
    +	// element for support tests
    +	supportElem = jQuery( "<p>" )[ 0 ],
    +
    +	// colors = jQuery.Color.names
    +	colors,
    +
    +	// local aliases of functions called often
    +	each = jQuery.each;
    +
    +// determine rgba support immediately
    +supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
    +support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
    +
    +// define cache name and alpha properties
    +// for rgba and hsla spaces
    +each( spaces, function( spaceName, space ) {
    +	space.cache = "_" + spaceName;
    +	space.props.alpha = {
    +		idx: 3,
    +		type: "percent",
    +		def: 1
    +	};
    +});
    +
    +function clamp( value, prop, allowEmpty ) {
    +	var type = propTypes[ prop.type ] || {};
    +
    +	if ( value == null ) {
    +		return (allowEmpty || !prop.def) ? null : prop.def;
    +	}
    +
    +	// ~~ is an short way of doing floor for positive numbers
    +	value = type.floor ? ~~value : parseFloat( value );
    +
    +	// IE will pass in empty strings as value for alpha,
    +	// which will hit this case
    +	if ( isNaN( value ) ) {
    +		return prop.def;
    +	}
    +
    +	if ( type.mod ) {
    +		// we add mod before modding to make sure that negatives values
    +		// get converted properly: -10 -> 350
    +		return (value + type.mod) % type.mod;
    +	}
    +
    +	// for now all property types without mod have min and max
    +	return 0 > value ? 0 : type.max < value ? type.max : value;
    +}
    +
    +function stringParse( string ) {
    +	var inst = color(),
    +		rgba = inst._rgba = [];
    +
    +	string = string.toLowerCase();
    +
    +	each( stringParsers, function( i, parser ) {
    +		var parsed,
    +			match = parser.re.exec( string ),
    +			values = match && parser.parse( match ),
    +			spaceName = parser.space || "rgba";
    +
    +		if ( values ) {
    +			parsed = inst[ spaceName ]( values );
    +
    +			// if this was an rgba parse the assignment might happen twice
    +			// oh well....
    +			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
    +			rgba = inst._rgba = parsed._rgba;
    +
    +			// exit each( stringParsers ) here because we matched
    +			return false;
    +		}
    +	});
    +
    +	// Found a stringParser that handled it
    +	if ( rgba.length ) {
    +
    +		// if this came from a parsed string, force "transparent" when alpha is 0
    +		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
    +		if ( rgba.join() === "0,0,0,0" ) {
    +			jQuery.extend( rgba, colors.transparent );
    +		}
    +		return inst;
    +	}
    +
    +	// named colors
    +	return colors[ string ];
    +}
    +
    +color.fn = jQuery.extend( color.prototype, {
    +	parse: function( red, green, blue, alpha ) {
    +		if ( red === undefined ) {
    +			this._rgba = [ null, null, null, null ];
    +			return this;
    +		}
    +		if ( red.jquery || red.nodeType ) {
    +			red = jQuery( red ).css( green );
    +			green = undefined;
    +		}
    +
    +		var inst = this,
    +			type = jQuery.type( red ),
    +			rgba = this._rgba = [];
    +
    +		// more than 1 argument specified - assume ( red, green, blue, alpha )
    +		if ( green !== undefined ) {
    +			red = [ red, green, blue, alpha ];
    +			type = "array";
    +		}
    +
    +		if ( type === "string" ) {
    +			return this.parse( stringParse( red ) || colors._default );
    +		}
    +
    +		if ( type === "array" ) {
    +			each( spaces.rgba.props, function( key, prop ) {
    +				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
    +			});
    +			return this;
    +		}
    +
    +		if ( type === "object" ) {
    +			if ( red instanceof color ) {
    +				each( spaces, function( spaceName, space ) {
    +					if ( red[ space.cache ] ) {
    +						inst[ space.cache ] = red[ space.cache ].slice();
    +					}
    +				});
    +			} else {
    +				each( spaces, function( spaceName, space ) {
    +					var cache = space.cache;
    +					each( space.props, function( key, prop ) {
    +
    +						// if the cache doesn't exist, and we know how to convert
    +						if ( !inst[ cache ] && space.to ) {
    +
    +							// if the value was null, we don't need to copy it
    +							// if the key was alpha, we don't need to copy it either
    +							if ( key === "alpha" || red[ key ] == null ) {
    +								return;
    +							}
    +							inst[ cache ] = space.to( inst._rgba );
    +						}
    +
    +						// this is the only case where we allow nulls for ALL properties.
    +						// call clamp with alwaysAllowEmpty
    +						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
    +					});
    +
    +					// everything defined but alpha?
    +					if ( inst[ cache ] && $.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
    +						// use the default of 1
    +						inst[ cache ][ 3 ] = 1;
    +						if ( space.from ) {
    +							inst._rgba = space.from( inst[ cache ] );
    +						}
    +					}
    +				});
    +			}
    +			return this;
    +		}
    +	},
    +	is: function( compare ) {
    +		var is = color( compare ),
    +			same = true,
    +			inst = this;
    +
    +		each( spaces, function( _, space ) {
    +			var localCache,
    +				isCache = is[ space.cache ];
    +			if (isCache) {
    +				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
    +				each( space.props, function( _, prop ) {
    +					if ( isCache[ prop.idx ] != null ) {
    +						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
    +						return same;
    +					}
    +				});
    +			}
    +			return same;
    +		});
    +		return same;
    +	},
    +	_space: function() {
    +		var used = [],
    +			inst = this;
    +		each( spaces, function( spaceName, space ) {
    +			if ( inst[ space.cache ] ) {
    +				used.push( spaceName );
    +			}
    +		});
    +		return used.pop();
    +	},
    +	transition: function( other, distance ) {
    +		var end = color( other ),
    +			spaceName = end._space(),
    +			space = spaces[ spaceName ],
    +			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
    +			start = startColor[ space.cache ] || space.to( startColor._rgba ),
    +			result = start.slice();
    +
    +		end = end[ space.cache ];
    +		each( space.props, function( key, prop ) {
    +			var index = prop.idx,
    +				startValue = start[ index ],
    +				endValue = end[ index ],
    +				type = propTypes[ prop.type ] || {};
    +
    +			// if null, don't override start value
    +			if ( endValue === null ) {
    +				return;
    +			}
    +			// if null - use end
    +			if ( startValue === null ) {
    +				result[ index ] = endValue;
    +			} else {
    +				if ( type.mod ) {
    +					if ( endValue - startValue > type.mod / 2 ) {
    +						startValue += type.mod;
    +					} else if ( startValue - endValue > type.mod / 2 ) {
    +						startValue -= type.mod;
    +					}
    +				}
    +				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
    +			}
    +		});
    +		return this[ spaceName ]( result );
    +	},
    +	blend: function( opaque ) {
    +		// if we are already opaque - return ourself
    +		if ( this._rgba[ 3 ] === 1 ) {
    +			return this;
    +		}
    +
    +		var rgb = this._rgba.slice(),
    +			a = rgb.pop(),
    +			blend = color( opaque )._rgba;
    +
    +		return color( jQuery.map( rgb, function( v, i ) {
    +			return ( 1 - a ) * blend[ i ] + a * v;
    +		}));
    +	},
    +	toRgbaString: function() {
    +		var prefix = "rgba(",
    +			rgba = jQuery.map( this._rgba, function( v, i ) {
    +				return v == null ? ( i > 2 ? 1 : 0 ) : v;
    +			});
    +
    +		if ( rgba[ 3 ] === 1 ) {
    +			rgba.pop();
    +			prefix = "rgb(";
    +		}
    +
    +		return prefix + rgba.join() + ")";
    +	},
    +	toHslaString: function() {
    +		var prefix = "hsla(",
    +			hsla = jQuery.map( this.hsla(), function( v, i ) {
    +				if ( v == null ) {
    +					v = i > 2 ? 1 : 0;
    +				}
    +
    +				// catch 1 and 2
    +				if ( i && i < 3 ) {
    +					v = Math.round( v * 100 ) + "%";
    +				}
    +				return v;
    +			});
    +
    +		if ( hsla[ 3 ] === 1 ) {
    +			hsla.pop();
    +			prefix = "hsl(";
    +		}
    +		return prefix + hsla.join() + ")";
    +	},
    +	toHexString: function( includeAlpha ) {
    +		var rgba = this._rgba.slice(),
    +			alpha = rgba.pop();
    +
    +		if ( includeAlpha ) {
    +			rgba.push( ~~( alpha * 255 ) );
    +		}
    +
    +		return "#" + jQuery.map( rgba, function( v ) {
    +
    +			// default to 0 when nulls exist
    +			v = ( v || 0 ).toString( 16 );
    +			return v.length === 1 ? "0" + v : v;
    +		}).join("");
    +	},
    +	toString: function() {
    +		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
    +	}
    +});
    +color.fn.parse.prototype = color.fn;
    +
    +// hsla conversions adapted from:
    +// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
    +
    +function hue2rgb( p, q, h ) {
    +	h = ( h + 1 ) % 1;
    +	if ( h * 6 < 1 ) {
    +		return p + (q - p) * h * 6;
    +	}
    +	if ( h * 2 < 1) {
    +		return q;
    +	}
    +	if ( h * 3 < 2 ) {
    +		return p + (q - p) * ((2/3) - h) * 6;
    +	}
    +	return p;
    +}
    +
    +spaces.hsla.to = function ( rgba ) {
    +	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
    +		return [ null, null, null, rgba[ 3 ] ];
    +	}
    +	var r = rgba[ 0 ] / 255,
    +		g = rgba[ 1 ] / 255,
    +		b = rgba[ 2 ] / 255,
    +		a = rgba[ 3 ],
    +		max = Math.max( r, g, b ),
    +		min = Math.min( r, g, b ),
    +		diff = max - min,
    +		add = max + min,
    +		l = add * 0.5,
    +		h, s;
    +
    +	if ( min === max ) {
    +		h = 0;
    +	} else if ( r === max ) {
    +		h = ( 60 * ( g - b ) / diff ) + 360;
    +	} else if ( g === max ) {
    +		h = ( 60 * ( b - r ) / diff ) + 120;
    +	} else {
    +		h = ( 60 * ( r - g ) / diff ) + 240;
    +	}
    +
    +	if ( l === 0 || l === 1 ) {
    +		s = l;
    +	} else if ( l <= 0.5 ) {
    +		s = diff / add;
    +	} else {
    +		s = diff / ( 2 - add );
    +	}
    +	return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
    +};
    +
    +spaces.hsla.from = function ( hsla ) {
    +	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
    +		return [ null, null, null, hsla[ 3 ] ];
    +	}
    +	var h = hsla[ 0 ] / 360,
    +		s = hsla[ 1 ],
    +		l = hsla[ 2 ],
    +		a = hsla[ 3 ],
    +		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
    +		p = 2 * l - q;
    +
    +	return [
    +		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
    +		Math.round( hue2rgb( p, q, h ) * 255 ),
    +		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
    +		a
    +	];
    +};
    +
    +
    +each( spaces, function( spaceName, space ) {
    +	var props = space.props,
    +		cache = space.cache,
    +		to = space.to,
    +		from = space.from;
    +
    +	// makes rgba() and hsla()
    +	color.fn[ spaceName ] = function( value ) {
    +
    +		// generate a cache for this space if it doesn't exist
    +		if ( to && !this[ cache ] ) {
    +			this[ cache ] = to( this._rgba );
    +		}
    +		if ( value === undefined ) {
    +			return this[ cache ].slice();
    +		}
    +
    +		var ret,
    +			type = jQuery.type( value ),
    +			arr = ( type === "array" || type === "object" ) ? value : arguments,
    +			local = this[ cache ].slice();
    +
    +		each( props, function( key, prop ) {
    +			var val = arr[ type === "object" ? key : prop.idx ];
    +			if ( val == null ) {
    +				val = local[ prop.idx ];
    +			}
    +			local[ prop.idx ] = clamp( val, prop );
    +		});
    +
    +		if ( from ) {
    +			ret = color( from( local ) );
    +			ret[ cache ] = local;
    +			return ret;
    +		} else {
    +			return color( local );
    +		}
    +	};
    +
    +	// makes red() green() blue() alpha() hue() saturation() lightness()
    +	each( props, function( key, prop ) {
    +		// alpha is included in more than one space
    +		if ( color.fn[ key ] ) {
    +			return;
    +		}
    +		color.fn[ key ] = function( value ) {
    +			var vtype = jQuery.type( value ),
    +				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
    +				local = this[ fn ](),
    +				cur = local[ prop.idx ],
    +				match;
    +
    +			if ( vtype === "undefined" ) {
    +				return cur;
    +			}
    +
    +			if ( vtype === "function" ) {
    +				value = value.call( this, cur );
    +				vtype = jQuery.type( value );
    +			}
    +			if ( value == null && prop.empty ) {
    +				return this;
    +			}
    +			if ( vtype === "string" ) {
    +				match = rplusequals.exec( value );
    +				if ( match ) {
    +					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
    +				}
    +			}
    +			local[ prop.idx ] = value;
    +			return this[ fn ]( local );
    +		};
    +	});
    +});
    +
    +// add .fx.step functions
    +each( stepHooks, function( i, hook ) {
    +	jQuery.cssHooks[ hook ] = {
    +		set: function( elem, value ) {
    +			var parsed, curElem,
    +				backgroundColor = "";
    +
    +			if ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) {
    +				value = color( parsed || value );
    +				if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
    +					curElem = hook === "backgroundColor" ? elem.parentNode : elem;
    +					while (
    +						(backgroundColor === "" || backgroundColor === "transparent") &&
    +						curElem && curElem.style
    +					) {
    +						try {
    +							backgroundColor = jQuery.css( curElem, "backgroundColor" );
    +							curElem = curElem.parentNode;
    +						} catch ( e ) {
    +						}
    +					}
    +
    +					value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
    +						backgroundColor :
    +						"_default" );
    +				}
    +
    +				value = value.toRgbaString();
    +			}
    +			try {
    +				elem.style[ hook ] = value;
    +			} catch( error ) {
    +				// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
    +			}
    +		}
    +	};
    +	jQuery.fx.step[ hook ] = function( fx ) {
    +		if ( !fx.colorInit ) {
    +			fx.start = color( fx.elem, hook );
    +			fx.end = color( fx.end );
    +			fx.colorInit = true;
    +		}
    +		jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
    +	};
    +});
    +
    +jQuery.cssHooks.borderColor = {
    +	expand: function( value ) {
    +		var expanded = {};
    +
    +		each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
    +			expanded[ "border" + part + "Color" ] = value;
    +		});
    +		return expanded;
    +	}
    +};
    +
    +// Basic color names only.
    +// Usage of any of the other color names requires adding yourself or including
    +// jquery.color.svg-names.js.
    +colors = jQuery.Color.names = {
    +	// 4.1. Basic color keywords
    +	aqua: "#00ffff",
    +	black: "#000000",
    +	blue: "#0000ff",
    +	fuchsia: "#ff00ff",
    +	gray: "#808080",
    +	green: "#008000",
    +	lime: "#00ff00",
    +	maroon: "#800000",
    +	navy: "#000080",
    +	olive: "#808000",
    +	purple: "#800080",
    +	red: "#ff0000",
    +	silver: "#c0c0c0",
    +	teal: "#008080",
    +	white: "#ffffff",
    +	yellow: "#ffff00",
    +
    +	// 4.2.3. "transparent" color keyword
    +	transparent: [ null, null, null, 0 ],
    +
    +	_default: "#ffffff"
    +};
    +
    +})( jQuery );
    +
    +
    +
    +/******************************************************************************/
    +/****************************** CLASS ANIMATIONS ******************************/
    +/******************************************************************************/
    +(function() {
    +
    +var classAnimationActions = [ "add", "remove", "toggle" ],
    +	shorthandStyles = {
    +		border: 1,
    +		borderBottom: 1,
    +		borderColor: 1,
    +		borderLeft: 1,
    +		borderRight: 1,
    +		borderTop: 1,
    +		borderWidth: 1,
    +		margin: 1,
    +		padding: 1
    +	};
    +
    +$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
    +	$.fx.step[ prop ] = function( fx ) {
    +		if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
    +			jQuery.style( fx.elem, prop, fx.end );
    +			fx.setAttr = true;
    +		}
    +	};
    +});
    +
    +function getElementStyles() {
    +	var style = this.ownerDocument.defaultView ?
    +			this.ownerDocument.defaultView.getComputedStyle( this, null ) :
    +			this.currentStyle,
    +		newStyle = {},
    +		key,
    +		len;
    +
    +	// webkit enumerates style porperties
    +	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
    +		len = style.length;
    +		while ( len-- ) {
    +			key = style[ len ];
    +			if ( typeof style[ key ] === "string" ) {
    +				newStyle[ $.camelCase( key ) ] = style[ key ];
    +			}
    +		}
    +	} else {
    +		for ( key in style ) {
    +			if ( typeof style[ key ] === "string" ) {
    +				newStyle[ key ] = style[ key ];
    +			}
    +		}
    +	}
    +
    +	return newStyle;
    +}
    +
    +
    +function styleDifference( oldStyle, newStyle ) {
    +	var diff = {},
    +		name, value;
    +
    +	for ( name in newStyle ) {
    +		value = newStyle[ name ];
    +		if ( oldStyle[ name ] !== value ) {
    +			if ( !shorthandStyles[ name ] ) {
    +				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
    +					diff[ name ] = value;
    +				}
    +			}
    +		}
    +	}
    +
    +	return diff;
    +}
    +
    +$.effects.animateClass = function( value, duration, easing, callback ) {
    +	var o = $.speed( duration, easing, callback );
    +
    +	return this.queue( function() {
    +		var animated = $( this ),
    +			baseClass = animated.attr( "class" ) || "",
    +			applyClassChange,
    +			allAnimations = o.children ? animated.find( "*" ).andSelf() : animated;
    +
    +		// map the animated objects to store the original styles.
    +		allAnimations = allAnimations.map(function() {
    +			var el = $( this );
    +			return {
    +				el: el,
    +				start: getElementStyles.call( this )
    +			};
    +		});
    +
    +		// apply class change
    +		applyClassChange = function() {
    +			$.each( classAnimationActions, function(i, action) {
    +				if ( value[ action ] ) {
    +					animated[ action + "Class" ]( value[ action ] );
    +				}
    +			});
    +		};
    +		applyClassChange();
    +
    +		// map all animated objects again - calculate new styles and diff
    +		allAnimations = allAnimations.map(function() {
    +			this.end = getElementStyles.call( this.el[ 0 ] );
    +			this.diff = styleDifference( this.start, this.end );
    +			return this;
    +		});
    +
    +		// apply original class
    +		animated.attr( "class", baseClass );
    +
    +		// map all animated objects again - this time collecting a promise
    +		allAnimations = allAnimations.map(function() {
    +			var styleInfo = this,
    +				dfd = $.Deferred(),
    +				opts = jQuery.extend({}, o, {
    +					queue: false,
    +					complete: function() {
    +						dfd.resolve( styleInfo );
    +					}
    +				});
    +
    +			this.el.animate( this.diff, opts );
    +			return dfd.promise();
    +		});
    +
    +		// once all animations have completed:
    +		$.when.apply( $, allAnimations.get() ).done(function() {
    +
    +			// set the final class
    +			applyClassChange();
    +
    +			// for each animated element,
    +			// clear all css properties that were animated
    +			$.each( arguments, function() {
    +				var el = this.el;
    +				$.each( this.diff, function(key) {
    +					el.css( key, '' );
    +				});
    +			});
    +
    +			// this is guarnteed to be there if you use jQuery.speed()
    +			// it also handles dequeuing the next anim...
    +			o.complete.call( animated[ 0 ] );
    +		});
    +	});
    +};
    +
    +$.fn.extend({
    +	_addClass: $.fn.addClass,
    +	addClass: function( classNames, speed, easing, callback ) {
    +		return speed ?
    +			$.effects.animateClass.call( this,
    +				{ add: classNames }, speed, easing, callback ) :
    +			this._addClass( classNames );
    +	},
    +
    +	_removeClass: $.fn.removeClass,
    +	removeClass: function( classNames, speed, easing, callback ) {
    +		return speed ?
    +			$.effects.animateClass.call( this,
    +				{ remove: classNames }, speed, easing, callback ) :
    +			this._removeClass( classNames );
    +	},
    +
    +	_toggleClass: $.fn.toggleClass,
    +	toggleClass: function( classNames, force, speed, easing, callback ) {
    +		if ( typeof force === "boolean" || force === undefined ) {
    +			if ( !speed ) {
    +				// without speed parameter
    +				return this._toggleClass( classNames, force );
    +			} else {
    +				return $.effects.animateClass.call( this,
    +					(force ? { add: classNames } : { remove: classNames }),
    +					speed, easing, callback );
    +			}
    +		} else {
    +			// without force parameter
    +			return $.effects.animateClass.call( this,
    +				{ toggle: classNames }, force, speed, easing );
    +		}
    +	},
    +
    +	switchClass: function( remove, add, speed, easing, callback) {
    +		return $.effects.animateClass.call( this, {
    +			add: add,
    +			remove: remove
    +		}, speed, easing, callback );
    +	}
    +});
    +
    +})();
    +
    +/******************************************************************************/
    +/*********************************** EFFECTS **********************************/
    +/******************************************************************************/
    +
    +(function() {
    +
    +$.extend( $.effects, {
    +	version: "1.9.2",
    +
    +	// Saves a set of properties in a data storage
    +	save: function( element, set ) {
    +		for( var i=0; i < set.length; i++ ) {
    +			if ( set[ i ] !== null ) {
    +				element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
    +			}
    +		}
    +	},
    +
    +	// Restores a set of previously saved properties from a data storage
    +	restore: function( element, set ) {
    +		var val, i;
    +		for( i=0; i < set.length; i++ ) {
    +			if ( set[ i ] !== null ) {
    +				val = element.data( dataSpace + set[ i ] );
    +				// support: jQuery 1.6.2
    +				// http://bugs.jquery.com/ticket/9917
    +				// jQuery 1.6.2 incorrectly returns undefined for any falsy value.
    +				// We can't differentiate between "" and 0 here, so we just assume
    +				// empty string since it's likely to be a more common value...
    +				if ( val === undefined ) {
    +					val = "";
    +				}
    +				element.css( set[ i ], val );
    +			}
    +		}
    +	},
    +
    +	setMode: function( el, mode ) {
    +		if (mode === "toggle") {
    +			mode = el.is( ":hidden" ) ? "show" : "hide";
    +		}
    +		return mode;
    +	},
    +
    +	// Translates a [top,left] array into a baseline value
    +	// this should be a little more flexible in the future to handle a string & hash
    +	getBaseline: function( origin, original ) {
    +		var y, x;
    +		switch ( origin[ 0 ] ) {
    +			case "top": y = 0; break;
    +			case "middle": y = 0.5; break;
    +			case "bottom": y = 1; break;
    +			default: y = origin[ 0 ] / original.height;
    +		}
    +		switch ( origin[ 1 ] ) {
    +			case "left": x = 0; break;
    +			case "center": x = 0.5; break;
    +			case "right": x = 1; break;
    +			default: x = origin[ 1 ] / original.width;
    +		}
    +		return {
    +			x: x,
    +			y: y
    +		};
    +	},
    +
    +	// Wraps the element around a wrapper that copies position properties
    +	createWrapper: function( element ) {
    +
    +		// if the element is already wrapped, return it
    +		if ( element.parent().is( ".ui-effects-wrapper" )) {
    +			return element.parent();
    +		}
    +
    +		// wrap the element
    +		var props = {
    +				width: element.outerWidth(true),
    +				height: element.outerHeight(true),
    +				"float": element.css( "float" )
    +			},
    +			wrapper = $( "<div></div>" )
    +				.addClass( "ui-effects-wrapper" )
    +				.css({
    +					fontSize: "100%",
    +					background: "transparent",
    +					border: "none",
    +					margin: 0,
    +					padding: 0
    +				}),
    +			// Store the size in case width/height are defined in % - Fixes #5245
    +			size = {
    +				width: element.width(),
    +				height: element.height()
    +			},
    +			active = document.activeElement;
    +
    +		// support: Firefox
    +		// Firefox incorrectly exposes anonymous content
    +		// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
    +		try {
    +			active.id;
    +		} catch( e ) {
    +			active = document.body;
    +		}
    +
    +		element.wrap( wrapper );
    +
    +		// Fixes #7595 - Elements lose focus when wrapped.
    +		if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
    +			$( active ).focus();
    +		}
    +
    +		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
    +
    +		// transfer positioning properties to the wrapper
    +		if ( element.css( "position" ) === "static" ) {
    +			wrapper.css({ position: "relative" });
    +			element.css({ position: "relative" });
    +		} else {
    +			$.extend( props, {
    +				position: element.css( "position" ),
    +				zIndex: element.css( "z-index" )
    +			});
    +			$.each([ "top", "left", "bottom", "right" ], function(i, pos) {
    +				props[ pos ] = element.css( pos );
    +				if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
    +					props[ pos ] = "auto";
    +				}
    +			});
    +			element.css({
    +				position: "relative",
    +				top: 0,
    +				left: 0,
    +				right: "auto",
    +				bottom: "auto"
    +			});
    +		}
    +		element.css(size);
    +
    +		return wrapper.css( props ).show();
    +	},
    +
    +	removeWrapper: function( element ) {
    +		var active = document.activeElement;
    +
    +		if ( element.parent().is( ".ui-effects-wrapper" ) ) {
    +			element.parent().replaceWith( element );
    +
    +			// Fixes #7595 - Elements lose focus when wrapped.
    +			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
    +				$( active ).focus();
    +			}
    +		}
    +
    +
    +		return element;
    +	},
    +
    +	setTransition: function( element, list, factor, value ) {
    +		value = value || {};
    +		$.each( list, function( i, x ) {
    +			var unit = element.cssUnit( x );
    +			if ( unit[ 0 ] > 0 ) {
    +				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
    +			}
    +		});
    +		return value;
    +	}
    +});
    +
    +// return an effect options object for the given parameters:
    +function _normalizeArguments( effect, options, speed, callback ) {
    +
    +	// allow passing all options as the first parameter
    +	if ( $.isPlainObject( effect ) ) {
    +		options = effect;
    +		effect = effect.effect;
    +	}
    +
    +	// convert to an object
    +	effect = { effect: effect };
    +
    +	// catch (effect, null, ...)
    +	if ( options == null ) {
    +		options = {};
    +	}
    +
    +	// catch (effect, callback)
    +	if ( $.isFunction( options ) ) {
    +		callback = options;
    +		speed = null;
    +		options = {};
    +	}
    +
    +	// catch (effect, speed, ?)
    +	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
    +		callback = speed;
    +		speed = options;
    +		options = {};
    +	}
    +
    +	// catch (effect, options, callback)
    +	if ( $.isFunction( speed ) ) {
    +		callback = speed;
    +		speed = null;
    +	}
    +
    +	// add options to effect
    +	if ( options ) {
    +		$.extend( effect, options );
    +	}
    +
    +	speed = speed || options.duration;
    +	effect.duration = $.fx.off ? 0 :
    +		typeof speed === "number" ? speed :
    +		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
    +		$.fx.speeds._default;
    +
    +	effect.complete = callback || options.complete;
    +
    +	return effect;
    +}
    +
    +function standardSpeed( speed ) {
    +	// valid standard speeds
    +	if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
    +		return true;
    +	}
    +
    +	// invalid strings - treat as "normal" speed
    +	if ( typeof speed === "string" && !$.effects.effect[ speed ] ) {
    +		// TODO: remove in 2.0 (#7115)
    +		if ( backCompat && $.effects[ speed ] ) {
    +			return false;
    +		}
    +		return true;
    +	}
    +
    +	return false;
    +}
    +
    +$.fn.extend({
    +	effect: function( /* effect, options, speed, callback */ ) {
    +		var args = _normalizeArguments.apply( this, arguments ),
    +			mode = args.mode,
    +			queue = args.queue,
    +			effectMethod = $.effects.effect[ args.effect ],
    +
    +			// DEPRECATED: remove in 2.0 (#7115)
    +			oldEffectMethod = !effectMethod && backCompat && $.effects[ args.effect ];
    +
    +		if ( $.fx.off || !( effectMethod || oldEffectMethod ) ) {
    +			// delegate to the original method (e.g., .show()) if possible
    +			if ( mode ) {
    +				return this[ mode ]( args.duration, args.complete );
    +			} else {
    +				return this.each( function() {
    +					if ( args.complete ) {
    +						args.complete.call( this );
    +					}
    +				});
    +			}
    +		}
    +
    +		function run( next ) {
    +			var elem = $( this ),
    +				complete = args.complete,
    +				mode = args.mode;
    +
    +			function done() {
    +				if ( $.isFunction( complete ) ) {
    +					complete.call( elem[0] );
    +				}
    +				if ( $.isFunction( next ) ) {
    +					next();
    +				}
    +			}
    +
    +			// if the element is hiddden and mode is hide,
    +			// or element is visible and mode is show
    +			if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
    +				done();
    +			} else {
    +				effectMethod.call( elem[0], args, done );
    +			}
    +		}
    +
    +		// TODO: remove this check in 2.0, effectMethod will always be true
    +		if ( effectMethod ) {
    +			return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
    +		} else {
    +			// DEPRECATED: remove in 2.0 (#7115)
    +			return oldEffectMethod.call(this, {
    +				options: args,
    +				duration: args.duration,
    +				callback: args.complete,
    +				mode: args.mode
    +			});
    +		}
    +	},
    +
    +	_show: $.fn.show,
    +	show: function( speed ) {
    +		if ( standardSpeed( speed ) ) {
    +			return this._show.apply( this, arguments );
    +		} else {
    +			var args = _normalizeArguments.apply( this, arguments );
    +			args.mode = "show";
    +			return this.effect.call( this, args );
    +		}
    +	},
    +
    +	_hide: $.fn.hide,
    +	hide: function( speed ) {
    +		if ( standardSpeed( speed ) ) {
    +			return this._hide.apply( this, arguments );
    +		} else {
    +			var args = _normalizeArguments.apply( this, arguments );
    +			args.mode = "hide";
    +			return this.effect.call( this, args );
    +		}
    +	},
    +
    +	// jQuery core overloads toggle and creates _toggle
    +	__toggle: $.fn.toggle,
    +	toggle: function( speed ) {
    +		if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
    +			return this.__toggle.apply( this, arguments );
    +		} else {
    +			var args = _normalizeArguments.apply( this, arguments );
    +			args.mode = "toggle";
    +			return this.effect.call( this, args );
    +		}
    +	},
    +
    +	// helper functions
    +	cssUnit: function(key) {
    +		var style = this.css( key ),
    +			val = [];
    +
    +		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
    +			if ( style.indexOf( unit ) > 0 ) {
    +				val = [ parseFloat( style ), unit ];
    +			}
    +		});
    +		return val;
    +	}
    +});
    +
    +})();
    +
    +/******************************************************************************/
    +/*********************************** EASING ***********************************/
    +/******************************************************************************/
    +
    +(function() {
    +
    +// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
    +
    +var baseEasings = {};
    +
    +$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
    +	baseEasings[ name ] = function( p ) {
    +		return Math.pow( p, i + 2 );
    +	};
    +});
    +
    +$.extend( baseEasings, {
    +	Sine: function ( p ) {
    +		return 1 - Math.cos( p * Math.PI / 2 );
    +	},
    +	Circ: function ( p ) {
    +		return 1 - Math.sqrt( 1 - p * p );
    +	},
    +	Elastic: function( p ) {
    +		return p === 0 || p === 1 ? p :
    +			-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
    +	},
    +	Back: function( p ) {
    +		return p * p * ( 3 * p - 2 );
    +	},
    +	Bounce: function ( p ) {
    +		var pow2,
    +			bounce = 4;
    +
    +		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
    +		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
    +	}
    +});
    +
    +$.each( baseEasings, function( name, easeIn ) {
    +	$.easing[ "easeIn" + name ] = easeIn;
    +	$.easing[ "easeOut" + name ] = function( p ) {
    +		return 1 - easeIn( 1 - p );
    +	};
    +	$.easing[ "easeInOut" + name ] = function( p ) {
    +		return p < 0.5 ?
    +			easeIn( p * 2 ) / 2 :
    +			1 - easeIn( p * -2 + 2 ) / 2;
    +	};
    +});
    +
    +})();
    +
    +})(jQuery));
    +(function( $, undefined ) {
    +
    +var rvertical = /up|down|vertical/,
    +	rpositivemotion = /up|left|vertical|horizontal/;
    +
    +$.effects.effect.blind = function( o, done ) {
    +	// Create element
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
    +		mode = $.effects.setMode( el, o.mode || "hide" ),
    +		direction = o.direction || "up",
    +		vertical = rvertical.test( direction ),
    +		ref = vertical ? "height" : "width",
    +		ref2 = vertical ? "top" : "left",
    +		motion = rpositivemotion.test( direction ),
    +		animation = {},
    +		show = mode === "show",
    +		wrapper, distance, margin;
    +
    +	// if already wrapped, the wrapper's properties are my property. #6245
    +	if ( el.parent().is( ".ui-effects-wrapper" ) ) {
    +		$.effects.save( el.parent(), props );
    +	} else {
    +		$.effects.save( el, props );
    +	}
    +	el.show();
    +	wrapper = $.effects.createWrapper( el ).css({
    +		overflow: "hidden"
    +	});
    +
    +	distance = wrapper[ ref ]();
    +	margin = parseFloat( wrapper.css( ref2 ) ) || 0;
    +
    +	animation[ ref ] = show ? distance : 0;
    +	if ( !motion ) {
    +		el
    +			.css( vertical ? "bottom" : "right", 0 )
    +			.css( vertical ? "top" : "left", "auto" )
    +			.css({ position: "absolute" });
    +
    +		animation[ ref2 ] = show ? margin : distance + margin;
    +	}
    +
    +	// start at 0 if we are showing
    +	if ( show ) {
    +		wrapper.css( ref, 0 );
    +		if ( ! motion ) {
    +			wrapper.css( ref2, margin + distance );
    +		}
    +	}
    +
    +	// Animate
    +	wrapper.animate( animation, {
    +		duration: o.duration,
    +		easing: o.easing,
    +		queue: false,
    +		complete: function() {
    +			if ( mode === "hide" ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			$.effects.removeWrapper( el );
    +			done();
    +		}
    +	});
    +
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.effects.effect.bounce = function( o, done ) {
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
    +
    +		// defaults:
    +		mode = $.effects.setMode( el, o.mode || "effect" ),
    +		hide = mode === "hide",
    +		show = mode === "show",
    +		direction = o.direction || "up",
    +		distance = o.distance,
    +		times = o.times || 5,
    +
    +		// number of internal animations
    +		anims = times * 2 + ( show || hide ? 1 : 0 ),
    +		speed = o.duration / anims,
    +		easing = o.easing,
    +
    +		// utility:
    +		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
    +		motion = ( direction === "up" || direction === "left" ),
    +		i,
    +		upAnim,
    +		downAnim,
    +
    +		// we will need to re-assemble the queue to stack our animations in place
    +		queue = el.queue(),
    +		queuelen = queue.length;
    +
    +	// Avoid touching opacity to prevent clearType and PNG issues in IE
    +	if ( show || hide ) {
    +		props.push( "opacity" );
    +	}
    +
    +	$.effects.save( el, props );
    +	el.show();
    +	$.effects.createWrapper( el ); // Create Wrapper
    +
    +	// default distance for the BIGGEST bounce is the outer Distance / 3
    +	if ( !distance ) {
    +		distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
    +	}
    +
    +	if ( show ) {
    +		downAnim = { opacity: 1 };
    +		downAnim[ ref ] = 0;
    +
    +		// if we are showing, force opacity 0 and set the initial position
    +		// then do the "first" animation
    +		el.css( "opacity", 0 )
    +			.css( ref, motion ? -distance * 2 : distance * 2 )
    +			.animate( downAnim, speed, easing );
    +	}
    +
    +	// start at the smallest distance if we are hiding
    +	if ( hide ) {
    +		distance = distance / Math.pow( 2, times - 1 );
    +	}
    +
    +	downAnim = {};
    +	downAnim[ ref ] = 0;
    +	// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
    +	for ( i = 0; i < times; i++ ) {
    +		upAnim = {};
    +		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
    +
    +		el.animate( upAnim, speed, easing )
    +			.animate( downAnim, speed, easing );
    +
    +		distance = hide ? distance * 2 : distance / 2;
    +	}
    +
    +	// Last Bounce when Hiding
    +	if ( hide ) {
    +		upAnim = { opacity: 0 };
    +		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
    +
    +		el.animate( upAnim, speed, easing );
    +	}
    +
    +	el.queue(function() {
    +		if ( hide ) {
    +			el.hide();
    +		}
    +		$.effects.restore( el, props );
    +		$.effects.removeWrapper( el );
    +		done();
    +	});
    +
    +	// inject all the animations we just queued to be first in line (after "inprogress")
    +	if ( queuelen > 1) {
    +		queue.splice.apply( queue,
    +			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
    +	}
    +	el.dequeue();
    +
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.effects.effect.clip = function( o, done ) {
    +	// Create element
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
    +		mode = $.effects.setMode( el, o.mode || "hide" ),
    +		show = mode === "show",
    +		direction = o.direction || "vertical",
    +		vert = direction === "vertical",
    +		size = vert ? "height" : "width",
    +		position = vert ? "top" : "left",
    +		animation = {},
    +		wrapper, animate, distance;
    +
    +	// Save & Show
    +	$.effects.save( el, props );
    +	el.show();
    +
    +	// Create Wrapper
    +	wrapper = $.effects.createWrapper( el ).css({
    +		overflow: "hidden"
    +	});
    +	animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
    +	distance = animate[ size ]();
    +
    +	// Shift
    +	if ( show ) {
    +		animate.css( size, 0 );
    +		animate.css( position, distance / 2 );
    +	}
    +
    +	// Create Animation Object:
    +	animation[ size ] = show ? distance : 0;
    +	animation[ position ] = show ? 0 : distance / 2;
    +
    +	// Animate
    +	animate.animate( animation, {
    +		queue: false,
    +		duration: o.duration,
    +		easing: o.easing,
    +		complete: function() {
    +			if ( !show ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			$.effects.removeWrapper( el );
    +			done();
    +		}
    +	});
    +
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.effects.effect.drop = function( o, done ) {
    +
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
    +		mode = $.effects.setMode( el, o.mode || "hide" ),
    +		show = mode === "show",
    +		direction = o.direction || "left",
    +		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
    +		motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
    +		animation = {
    +			opacity: show ? 1 : 0
    +		},
    +		distance;
    +
    +	// Adjust
    +	$.effects.save( el, props );
    +	el.show();
    +	$.effects.createWrapper( el );
    +
    +	distance = o.distance || el[ ref === "top" ? "outerHeight": "outerWidth" ]( true ) / 2;
    +
    +	if ( show ) {
    +		el
    +			.css( "opacity", 0 )
    +			.css( ref, motion === "pos" ? -distance : distance );
    +	}
    +
    +	// Animation
    +	animation[ ref ] = ( show ?
    +		( motion === "pos" ? "+=" : "-=" ) :
    +		( motion === "pos" ? "-=" : "+=" ) ) +
    +		distance;
    +
    +	// Animate
    +	el.animate( animation, {
    +		queue: false,
    +		duration: o.duration,
    +		easing: o.easing,
    +		complete: function() {
    +			if ( mode === "hide" ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			$.effects.removeWrapper( el );
    +			done();
    +		}
    +	});
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.effects.effect.explode = function( o, done ) {
    +
    +	var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
    +		cells = rows,
    +		el = $( this ),
    +		mode = $.effects.setMode( el, o.mode || "hide" ),
    +		show = mode === "show",
    +
    +		// show and then visibility:hidden the element before calculating offset
    +		offset = el.show().css( "visibility", "hidden" ).offset(),
    +
    +		// width and height of a piece
    +		width = Math.ceil( el.outerWidth() / cells ),
    +		height = Math.ceil( el.outerHeight() / rows ),
    +		pieces = [],
    +
    +		// loop
    +		i, j, left, top, mx, my;
    +
    +	// children animate complete:
    +	function childComplete() {
    +		pieces.push( this );
    +		if ( pieces.length === rows * cells ) {
    +			animComplete();
    +		}
    +	}
    +
    +	// clone the element for each row and cell.
    +	for( i = 0; i < rows ; i++ ) { // ===>
    +		top = offset.top + i * height;
    +		my = i - ( rows - 1 ) / 2 ;
    +
    +		for( j = 0; j < cells ; j++ ) { // |||
    +			left = offset.left + j * width;
    +			mx = j - ( cells - 1 ) / 2 ;
    +
    +			// Create a clone of the now hidden main element that will be absolute positioned
    +			// within a wrapper div off the -left and -top equal to size of our pieces
    +			el
    +				.clone()
    +				.appendTo( "body" )
    +				.wrap( "<div></div>" )
    +				.css({
    +					position: "absolute",
    +					visibility: "visible",
    +					left: -j * width,
    +					top: -i * height
    +				})
    +
    +			// select the wrapper - make it overflow: hidden and absolute positioned based on
    +			// where the original was located +left and +top equal to the size of pieces
    +				.parent()
    +				.addClass( "ui-effects-explode" )
    +				.css({
    +					position: "absolute",
    +					overflow: "hidden",
    +					width: width,
    +					height: height,
    +					left: left + ( show ? mx * width : 0 ),
    +					top: top + ( show ? my * height : 0 ),
    +					opacity: show ? 0 : 1
    +				}).animate({
    +					left: left + ( show ? 0 : mx * width ),
    +					top: top + ( show ? 0 : my * height ),
    +					opacity: show ? 1 : 0
    +				}, o.duration || 500, o.easing, childComplete );
    +		}
    +	}
    +
    +	function animComplete() {
    +		el.css({
    +			visibility: "visible"
    +		});
    +		$( pieces ).remove();
    +		if ( !show ) {
    +			el.hide();
    +		}
    +		done();
    +	}
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.effects.effect.fade = function( o, done ) {
    +	var el = $( this ),
    +		mode = $.effects.setMode( el, o.mode || "toggle" );
    +
    +	el.animate({
    +		opacity: mode
    +	}, {
    +		queue: false,
    +		duration: o.duration,
    +		easing: o.easing,
    +		complete: done
    +	});
    +};
    +
    +})( jQuery );
    +(function( $, undefined ) {
    +
    +$.effects.effect.fold = function( o, done ) {
    +
    +	// Create element
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
    +		mode = $.effects.setMode( el, o.mode || "hide" ),
    +		show = mode === "show",
    +		hide = mode === "hide",
    +		size = o.size || 15,
    +		percent = /([0-9]+)%/.exec( size ),
    +		horizFirst = !!o.horizFirst,
    +		widthFirst = show !== horizFirst,
    +		ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
    +		duration = o.duration / 2,
    +		wrapper, distance,
    +		animation1 = {},
    +		animation2 = {};
    +
    +	$.effects.save( el, props );
    +	el.show();
    +
    +	// Create Wrapper
    +	wrapper = $.effects.createWrapper( el ).css({
    +		overflow: "hidden"
    +	});
    +	distance = widthFirst ?
    +		[ wrapper.width(), wrapper.height() ] :
    +		[ wrapper.height(), wrapper.width() ];
    +
    +	if ( percent ) {
    +		size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
    +	}
    +	if ( show ) {
    +		wrapper.css( horizFirst ? {
    +			height: 0,
    +			width: size
    +		} : {
    +			height: size,
    +			width: 0
    +		});
    +	}
    +
    +	// Animation
    +	animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
    +	animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
    +
    +	// Animate
    +	wrapper
    +		.animate( animation1, duration, o.easing )
    +		.animate( animation2, duration, o.easing, function() {
    +			if ( hide ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			$.effects.removeWrapper( el );
    +			done();
    +		});
    +
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.effects.effect.highlight = function( o, done ) {
    +	var elem = $( this ),
    +		props = [ "backgroundImage", "backgroundColor", "opacity" ],
    +		mode = $.effects.setMode( elem, o.mode || "show" ),
    +		animation = {
    +			backgroundColor: elem.css( "backgroundColor" )
    +		};
    +
    +	if (mode === "hide") {
    +		animation.opacity = 0;
    +	}
    +
    +	$.effects.save( elem, props );
    +
    +	elem
    +		.show()
    +		.css({
    +			backgroundImage: "none",
    +			backgroundColor: o.color || "#ffff99"
    +		})
    +		.animate( animation, {
    +			queue: false,
    +			duration: o.duration,
    +			easing: o.easing,
    +			complete: function() {
    +				if ( mode === "hide" ) {
    +					elem.hide();
    +				}
    +				$.effects.restore( elem, props );
    +				done();
    +			}
    +		});
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.effects.effect.pulsate = function( o, done ) {
    +	var elem = $( this ),
    +		mode = $.effects.setMode( elem, o.mode || "show" ),
    +		show = mode === "show",
    +		hide = mode === "hide",
    +		showhide = ( show || mode === "hide" ),
    +
    +		// showing or hiding leaves of the "last" animation
    +		anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
    +		duration = o.duration / anims,
    +		animateTo = 0,
    +		queue = elem.queue(),
    +		queuelen = queue.length,
    +		i;
    +
    +	if ( show || !elem.is(":visible")) {
    +		elem.css( "opacity", 0 ).show();
    +		animateTo = 1;
    +	}
    +
    +	// anims - 1 opacity "toggles"
    +	for ( i = 1; i < anims; i++ ) {
    +		elem.animate({
    +			opacity: animateTo
    +		}, duration, o.easing );
    +		animateTo = 1 - animateTo;
    +	}
    +
    +	elem.animate({
    +		opacity: animateTo
    +	}, duration, o.easing);
    +
    +	elem.queue(function() {
    +		if ( hide ) {
    +			elem.hide();
    +		}
    +		done();
    +	});
    +
    +	// We just queued up "anims" animations, we need to put them next in the queue
    +	if ( queuelen > 1 ) {
    +		queue.splice.apply( queue,
    +			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
    +	}
    +	elem.dequeue();
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.effects.effect.puff = function( o, done ) {
    +	var elem = $( this ),
    +		mode = $.effects.setMode( elem, o.mode || "hide" ),
    +		hide = mode === "hide",
    +		percent = parseInt( o.percent, 10 ) || 150,
    +		factor = percent / 100,
    +		original = {
    +			height: elem.height(),
    +			width: elem.width(),
    +			outerHeight: elem.outerHeight(),
    +			outerWidth: elem.outerWidth()
    +		};
    +
    +	$.extend( o, {
    +		effect: "scale",
    +		queue: false,
    +		fade: true,
    +		mode: mode,
    +		complete: done,
    +		percent: hide ? percent : 100,
    +		from: hide ?
    +			original :
    +			{
    +				height: original.height * factor,
    +				width: original.width * factor,
    +				outerHeight: original.outerHeight * factor,
    +				outerWidth: original.outerWidth * factor
    +			}
    +	});
    +
    +	elem.effect( o );
    +};
    +
    +$.effects.effect.scale = function( o, done ) {
    +
    +	// Create element
    +	var el = $( this ),
    +		options = $.extend( true, {}, o ),
    +		mode = $.effects.setMode( el, o.mode || "effect" ),
    +		percent = parseInt( o.percent, 10 ) ||
    +			( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
    +		direction = o.direction || "both",
    +		origin = o.origin,
    +		original = {
    +			height: el.height(),
    +			width: el.width(),
    +			outerHeight: el.outerHeight(),
    +			outerWidth: el.outerWidth()
    +		},
    +		factor = {
    +			y: direction !== "horizontal" ? (percent / 100) : 1,
    +			x: direction !== "vertical" ? (percent / 100) : 1
    +		};
    +
    +	// We are going to pass this effect to the size effect:
    +	options.effect = "size";
    +	options.queue = false;
    +	options.complete = done;
    +
    +	// Set default origin and restore for show/hide
    +	if ( mode !== "effect" ) {
    +		options.origin = origin || ["middle","center"];
    +		options.restore = true;
    +	}
    +
    +	options.from = o.from || ( mode === "show" ? {
    +		height: 0,
    +		width: 0,
    +		outerHeight: 0,
    +		outerWidth: 0
    +	} : original );
    +	options.to = {
    +		height: original.height * factor.y,
    +		width: original.width * factor.x,
    +		outerHeight: original.outerHeight * factor.y,
    +		outerWidth: original.outerWidth * factor.x
    +	};
    +
    +	// Fade option to support puff
    +	if ( options.fade ) {
    +		if ( mode === "show" ) {
    +			options.from.opacity = 0;
    +			options.to.opacity = 1;
    +		}
    +		if ( mode === "hide" ) {
    +			options.from.opacity = 1;
    +			options.to.opacity = 0;
    +		}
    +	}
    +
    +	// Animate
    +	el.effect( options );
    +
    +};
    +
    +$.effects.effect.size = function( o, done ) {
    +
    +	// Create element
    +	var original, baseline, factor,
    +		el = $( this ),
    +		props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
    +
    +		// Always restore
    +		props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
    +
    +		// Copy for children
    +		props2 = [ "width", "height", "overflow" ],
    +		cProps = [ "fontSize" ],
    +		vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
    +		hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
    +
    +		// Set options
    +		mode = $.effects.setMode( el, o.mode || "effect" ),
    +		restore = o.restore || mode !== "effect",
    +		scale = o.scale || "both",
    +		origin = o.origin || [ "middle", "center" ],
    +		position = el.css( "position" ),
    +		props = restore ? props0 : props1,
    +		zero = {
    +			height: 0,
    +			width: 0,
    +			outerHeight: 0,
    +			outerWidth: 0
    +		};
    +
    +	if ( mode === "show" ) {
    +		el.show();
    +	}
    +	original = {
    +		height: el.height(),
    +		width: el.width(),
    +		outerHeight: el.outerHeight(),
    +		outerWidth: el.outerWidth()
    +	};
    +
    +	if ( o.mode === "toggle" && mode === "show" ) {
    +		el.from = o.to || zero;
    +		el.to = o.from || original;
    +	} else {
    +		el.from = o.from || ( mode === "show" ? zero : original );
    +		el.to = o.to || ( mode === "hide" ? zero : original );
    +	}
    +
    +	// Set scaling factor
    +	factor = {
    +		from: {
    +			y: el.from.height / original.height,
    +			x: el.from.width / original.width
    +		},
    +		to: {
    +			y: el.to.height / original.height,
    +			x: el.to.width / original.width
    +		}
    +	};
    +
    +	// Scale the css box
    +	if ( scale === "box" || scale === "both" ) {
    +
    +		// Vertical props scaling
    +		if ( factor.from.y !== factor.to.y ) {
    +			props = props.concat( vProps );
    +			el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
    +			el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
    +		}
    +
    +		// Horizontal props scaling
    +		if ( factor.from.x !== factor.to.x ) {
    +			props = props.concat( hProps );
    +			el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
    +			el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
    +		}
    +	}
    +
    +	// Scale the content
    +	if ( scale === "content" || scale === "both" ) {
    +
    +		// Vertical props scaling
    +		if ( factor.from.y !== factor.to.y ) {
    +			props = props.concat( cProps ).concat( props2 );
    +			el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
    +			el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
    +		}
    +	}
    +
    +	$.effects.save( el, props );
    +	el.show();
    +	$.effects.createWrapper( el );
    +	el.css( "overflow", "hidden" ).css( el.from );
    +
    +	// Adjust
    +	if (origin) { // Calculate baseline shifts
    +		baseline = $.effects.getBaseline( origin, original );
    +		el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
    +		el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
    +		el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
    +		el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
    +	}
    +	el.css( el.from ); // set top & left
    +
    +	// Animate
    +	if ( scale === "content" || scale === "both" ) { // Scale the children
    +
    +		// Add margins/font-size
    +		vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
    +		hProps = hProps.concat([ "marginLeft", "marginRight" ]);
    +		props2 = props0.concat(vProps).concat(hProps);
    +
    +		el.find( "*[width]" ).each( function(){
    +			var child = $( this ),
    +				c_original = {
    +					height: child.height(),
    +					width: child.width(),
    +					outerHeight: child.outerHeight(),
    +					outerWidth: child.outerWidth()
    +				};
    +			if (restore) {
    +				$.effects.save(child, props2);
    +			}
    +
    +			child.from = {
    +				height: c_original.height * factor.from.y,
    +				width: c_original.width * factor.from.x,
    +				outerHeight: c_original.outerHeight * factor.from.y,
    +				outerWidth: c_original.outerWidth * factor.from.x
    +			};
    +			child.to = {
    +				height: c_original.height * factor.to.y,
    +				width: c_original.width * factor.to.x,
    +				outerHeight: c_original.height * factor.to.y,
    +				outerWidth: c_original.width * factor.to.x
    +			};
    +
    +			// Vertical props scaling
    +			if ( factor.from.y !== factor.to.y ) {
    +				child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
    +				child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
    +			}
    +
    +			// Horizontal props scaling
    +			if ( factor.from.x !== factor.to.x ) {
    +				child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
    +				child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
    +			}
    +
    +			// Animate children
    +			child.css( child.from );
    +			child.animate( child.to, o.duration, o.easing, function() {
    +
    +				// Restore children
    +				if ( restore ) {
    +					$.effects.restore( child, props2 );
    +				}
    +			});
    +		});
    +	}
    +
    +	// Animate
    +	el.animate( el.to, {
    +		queue: false,
    +		duration: o.duration,
    +		easing: o.easing,
    +		complete: function() {
    +			if ( el.to.opacity === 0 ) {
    +				el.css( "opacity", el.from.opacity );
    +			}
    +			if( mode === "hide" ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			if ( !restore ) {
    +
    +				// we need to calculate our new positioning based on the scaling
    +				if ( position === "static" ) {
    +					el.css({
    +						position: "relative",
    +						top: el.to.top,
    +						left: el.to.left
    +					});
    +				} else {
    +					$.each([ "top", "left" ], function( idx, pos ) {
    +						el.css( pos, function( _, str ) {
    +							var val = parseInt( str, 10 ),
    +								toRef = idx ? el.to.left : el.to.top;
    +
    +							// if original was "auto", recalculate the new value from wrapper
    +							if ( str === "auto" ) {
    +								return toRef + "px";
    +							}
    +
    +							return val + toRef + "px";
    +						});
    +					});
    +				}
    +			}
    +
    +			$.effects.removeWrapper( el );
    +			done();
    +		}
    +	});
    +
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.effects.effect.shake = function( o, done ) {
    +
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
    +		mode = $.effects.setMode( el, o.mode || "effect" ),
    +		direction = o.direction || "left",
    +		distance = o.distance || 20,
    +		times = o.times || 3,
    +		anims = times * 2 + 1,
    +		speed = Math.round(o.duration/anims),
    +		ref = (direction === "up" || direction === "down") ? "top" : "left",
    +		positiveMotion = (direction === "up" || direction === "left"),
    +		animation = {},
    +		animation1 = {},
    +		animation2 = {},
    +		i,
    +
    +		// we will need to re-assemble the queue to stack our animations in place
    +		queue = el.queue(),
    +		queuelen = queue.length;
    +
    +	$.effects.save( el, props );
    +	el.show();
    +	$.effects.createWrapper( el );
    +
    +	// Animation
    +	animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
    +	animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
    +	animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
    +
    +	// Animate
    +	el.animate( animation, speed, o.easing );
    +
    +	// Shakes
    +	for ( i = 1; i < times; i++ ) {
    +		el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
    +	}
    +	el
    +		.animate( animation1, speed, o.easing )
    +		.animate( animation, speed / 2, o.easing )
    +		.queue(function() {
    +			if ( mode === "hide" ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			$.effects.removeWrapper( el );
    +			done();
    +		});
    +
    +	// inject all the animations we just queued to be first in line (after "inprogress")
    +	if ( queuelen > 1) {
    +		queue.splice.apply( queue,
    +			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
    +	}
    +	el.dequeue();
    +
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.effects.effect.slide = function( o, done ) {
    +
    +	// Create element
    +	var el = $( this ),
    +		props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
    +		mode = $.effects.setMode( el, o.mode || "show" ),
    +		show = mode === "show",
    +		direction = o.direction || "left",
    +		ref = (direction === "up" || direction === "down") ? "top" : "left",
    +		positiveMotion = (direction === "up" || direction === "left"),
    +		distance,
    +		animation = {};
    +
    +	// Adjust
    +	$.effects.save( el, props );
    +	el.show();
    +	distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
    +
    +	$.effects.createWrapper( el ).css({
    +		overflow: "hidden"
    +	});
    +
    +	if ( show ) {
    +		el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
    +	}
    +
    +	// Animation
    +	animation[ ref ] = ( show ?
    +		( positiveMotion ? "+=" : "-=") :
    +		( positiveMotion ? "-=" : "+=")) +
    +		distance;
    +
    +	// Animate
    +	el.animate( animation, {
    +		queue: false,
    +		duration: o.duration,
    +		easing: o.easing,
    +		complete: function() {
    +			if ( mode === "hide" ) {
    +				el.hide();
    +			}
    +			$.effects.restore( el, props );
    +			$.effects.removeWrapper( el );
    +			done();
    +		}
    +	});
    +};
    +
    +})(jQuery);
    +(function( $, undefined ) {
    +
    +$.effects.effect.transfer = function( o, done ) {
    +	var elem = $( this ),
    +		target = $( o.to ),
    +		targetFixed = target.css( "position" ) === "fixed",
    +		body = $("body"),
    +		fixTop = targetFixed ? body.scrollTop() : 0,
    +		fixLeft = targetFixed ? body.scrollLeft() : 0,
    +		endPosition = target.offset(),
    +		animation = {
    +			top: endPosition.top - fixTop ,
    +			left: endPosition.left - fixLeft ,
    +			height: target.innerHeight(),
    +			width: target.innerWidth()
    +		},
    +		startPosition = elem.offset(),
    +		transfer = $( '<div class="ui-effects-transfer"></div>' )
    +			.appendTo( document.body )
    +			.addClass( o.className )
    +			.css({
    +				top: startPosition.top - fixTop ,
    +				left: startPosition.left - fixLeft ,
    +				height: elem.innerHeight(),
    +				width: elem.innerWidth(),
    +				position: targetFixed ? "fixed" : "absolute"
    +			})
    +			.animate( animation, o.duration, o.easing, function() {
    +				transfer.remove();
    +				done();
    +			});
    +};
    +
    +})(jQuery);
    diff --git a/src/main/webapp/plug-in/jquery-ui/js/jquery-ui-1.9.2.custom.min.js b/src/main/webapp/plug-in/jquery-ui/js/jquery-ui-1.9.2.custom.min.js
    new file mode 100644
    index 00000000..c7c2b715
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-ui/js/jquery-ui-1.9.2.custom.min.js
    @@ -0,0 +1,6 @@
    +/*! jQuery UI - v1.9.2 - 2013-04-23
    +* http://jqueryui.com
    +* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.menu.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js, jquery.ui.effect.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js
    +* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */
    +
    +(function(e,t){function i(t,n){var r,i,o,u=t.nodeName.toLowerCase();return"area"===u?(r=t.parentNode,i=r.name,!t.href||!i||r.nodeName.toLowerCase()!=="map"?!1:(o=e("img[usemap=#"+i+"]")[0],!!o&&s(o))):(/input|select|textarea|button|object/.test(u)?!t.disabled:"a"===u?t.href||n:n)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().andSelf().filter(function(){return e.css(this,"visibility")==="hidden"}).length}var n=0,r=/^ui-id-\d+$/;e.ui=e.ui||{};if(e.ui.version)return;e.extend(e.ui,{version:"1.9.2",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({_focus:e.fn.focus,focus:function(t,n){return typeof t=="number"?this.each(function(){var r=this;setTimeout(function(){e(r).focus(),n&&n.call(r)},t)}):this._focus.apply(this,arguments)},scrollParent:function(){var t;return e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?t=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):t=this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(n){if(n!==t)return this.css("zIndex",n);if(this.length){var r=e(this[0]),i,s;while(r.length&&r[0]!==document){i=r.css("position");if(i==="absolute"||i==="relative"||i==="fixed"){s=parseInt(r.css("zIndex"),10);if(!isNaN(s)&&s!==0)return s}r=r.parent()}}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++n)})},removeUniqueId:function(){return this.each(function(){r.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(n){return!!e.data(n,t)}}):function(t,n,r){return!!e.data(t,r[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),r=isNaN(n);return(r||n>=0)&&i(t,!r)}}),e(function(){var t=document.body,n=t.appendChild(n=document.createElement("div"));n.offsetHeight,e.extend(n.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),e.support.minHeight=n.offsetHeight===100,e.support.selectstart="onselectstart"in n,t.removeChild(n).style.display="none"}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(n,r){function u(t,n,r,s){return e.each(i,function(){n-=parseFloat(e.css(t,"padding"+this))||0,r&&(n-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(n-=parseFloat(e.css(t,"margin"+this))||0)}),n}var i=r==="Width"?["Left","Right"]:["Top","Bottom"],s=r.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+r]=function(n){return n===t?o["inner"+r].call(this):this.each(function(){e(this).css(s,u(this,n)+"px")})},e.fn["outer"+r]=function(t,n){return typeof t!="number"?o["outer"+r].call(this,t):this.each(function(){e(this).css(s,u(this,t,!0,n)+"px")})}}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(n){return arguments.length?t.call(this,e.camelCase(n)):t.call(this)}}(e.fn.removeData)),function(){var t=/msie ([\w.]+)/.exec(navigator.userAgent.toLowerCase())||[];e.ui.ie=t.length?!0:!1,e.ui.ie6=parseFloat(t[1],10)===6}(),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,n,r){var i,s=e.ui[t].prototype;for(i in r)s.plugins[i]=s.plugins[i]||[],s.plugins[i].push([n,r[i]])},call:function(e,t,n){var r,i=e.plugins[t];if(!i||!e.element[0].parentNode||e.element[0].parentNode.nodeType===11)return;for(r=0;r<i.length;r++)e.options[i[r][0]]&&i[r][1].apply(e.element,n)}},contains:e.contains,hasScroll:function(t,n){if(e(t).css("overflow")==="hidden")return!1;var r=n&&n==="left"?"scrollLeft":"scrollTop",i=!1;return t[r]>0?!0:(t[r]=1,i=t[r]>0,t[r]=0,i)},isOverAxis:function(e,t,n){return e>t&&e<t+n},isOver:function(t,n,r,i,s,o){return e.ui.isOverAxis(t,r,s)&&e.ui.isOverAxis(n,i,o)}})})(jQuery);(function(e,t){var n=0,r=Array.prototype.slice,i=e.cleanData;e.cleanData=function(t){for(var n=0,r;(r=t[n])!=null;n++)try{e(r).triggerHandler("remove")}catch(s){}i(t)},e.widget=function(t,n,r){var i,s,o,u,a=t.split(".")[0];t=t.split(".")[1],i=a+"-"+t,r||(r=n,n=e.Widget),e.expr[":"][i.toLowerCase()]=function(t){return!!e.data(t,i)},e[a]=e[a]||{},s=e[a][t],o=e[a][t]=function(e,t){if(!this._createWidget)return new o(e,t);arguments.length&&this._createWidget(e,t)},e.extend(o,s,{version:r.version,_proto:e.extend({},r),_childConstructors:[]}),u=new n,u.options=e.widget.extend({},u.options),e.each(r,function(t,i){e.isFunction(i)&&(r[t]=function(){var e=function(){return n.prototype[t].apply(this,arguments)},r=function(e){return n.prototype[t].apply(this,e)};return function(){var t=this._super,n=this._superApply,s;return this._super=e,this._superApply=r,s=i.apply(this,arguments),this._super=t,this._superApply=n,s}}())}),o.prototype=e.widget.extend(u,{widgetEventPrefix:s?u.widgetEventPrefix:t},r,{constructor:o,namespace:a,widgetName:t,widgetBaseClass:i,widgetFullName:i}),s?(e.each(s._childConstructors,function(t,n){var r=n.prototype;e.widget(r.namespace+"."+r.widgetName,o,n._proto)}),delete s._childConstructors):n._childConstructors.push(o),e.widget.bridge(t,o)},e.widget.extend=function(n){var i=r.call(arguments,1),s=0,o=i.length,u,a;for(;s<o;s++)for(u in i[s])a=i[s][u],i[s].hasOwnProperty(u)&&a!==t&&(e.isPlainObject(a)?n[u]=e.isPlainObject(n[u])?e.widget.extend({},n[u],a):e.widget.extend({},a):n[u]=a);return n},e.widget.bridge=function(n,i){var s=i.prototype.widgetFullName||n;e.fn[n]=function(o){var u=typeof o=="string",a=r.call(arguments,1),f=this;return o=!u&&a.length?e.widget.extend.apply(null,[o].concat(a)):o,u?this.each(function(){var r,i=e.data(this,s);if(!i)return e.error("cannot call methods on "+n+" prior to initialization; "+"attempted to call method '"+o+"'");if(!e.isFunction(i[o])||o.charAt(0)==="_")return e.error("no such method '"+o+"' for "+n+" widget instance");r=i[o].apply(i,a);if(r!==i&&r!==t)return f=r&&r.jquery?f.pushStack(r.get()):r,!1}):this.each(function(){var t=e.data(this,s);t?t.option(o||{})._init():e.data(this,s,new i(o,this))}),f}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,r){r=e(r||this.defaultElement||this)[0],this.element=e(r),this.uuid=n++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),r!==this&&(e.data(r,this.widgetName,this),e.data(r,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===r&&this.destroy()}}),this.document=e(r.style?r.ownerDocument:r.document||r),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(n,r){var i=n,s,o,u;if(arguments.length===0)return e.widget.extend({},this.options);if(typeof n=="string"){i={},s=n.split("."),n=s.shift();if(s.length){o=i[n]=e.widget.extend({},this.options[n]);for(u=0;u<s.length-1;u++)o[s[u]]=o[s[u]]||{},o=o[s[u]];n=s.pop();if(r===t)return o[n]===t?null:o[n];o[n]=r}else{if(r===t)return this.options[n]===t?null:this.options[n];i[n]=r}}return this._setOptions(i),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,e==="disabled"&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!t).attr("aria-disabled",t),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(t,n,r){var i,s=this;typeof t!="boolean"&&(r=n,n=t,t=!1),r?(n=i=e(n),this.bindings=this.bindings.add(n)):(r=n,n=this.element,i=this.widget()),e.each(r,function(r,o){function u(){if(!t&&(s.options.disabled===!0||e(this).hasClass("ui-state-disabled")))return;return(typeof o=="string"?s[o]:o).apply(s,arguments)}typeof o!="string"&&(u.guid=o.guid=o.guid||u.guid||e.guid++);var a=r.match(/^(\w+)\s*(.*)$/),f=a[1]+s.eventNamespace,l=a[2];l?i.delegate(l,f,u):n.bind(f,u)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function n(){return(typeof e=="string"?r[e]:e).apply(r,arguments)}var r=this;return setTimeout(n,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,n,r){var i,s,o=this.options[t];r=r||{},n=e.Event(n),n.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),n.target=this.element[0],s=n.originalEvent;if(s)for(i in s)i in n||(n[i]=s[i]);return this.element.trigger(n,r),!(e.isFunction(o)&&o.apply(this.element[0],[n].concat(r))===!1||n.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,n){e.Widget.prototype["_"+t]=function(r,i,s){typeof i=="string"&&(i={effect:i});var o,u=i?i===!0||typeof i=="number"?n:i.effect||n:t;i=i||{},typeof i=="number"&&(i={duration:i}),o=!e.isEmptyObject(i),i.complete=s,i.delay&&r.delay(i.delay),o&&e.effects&&(e.effects.effect[u]||e.uiBackCompat!==!1&&e.effects[u])?r[t](i):u!==t&&r[u]?r[u](i.duration,i.easing,s):r.queue(function(n){e(this)[t](),s&&s.call(r[0]),n()})}}),e.uiBackCompat!==!1&&(e.Widget.prototype._getCreateOptions=function(){return e.metadata&&e.metadata.get(this.element[0])[this.widgetName]})})(jQuery);(function(e,t){var n=!1;e(document).mouseup(function(e){n=!1}),e.widget("ui.mouse",{version:"1.9.2",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(n){if(!0===e.data(n.target,t.widgetName+".preventClickEvent"))return e.removeData(n.target,t.widgetName+".preventClickEvent"),n.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(n)return;this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var r=this,i=t.which===1,s=typeof this.options.cancel=="string"&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;if(!i||s||!this._mouseCapture(t))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){r.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)){this._mouseStarted=this._mouseStart(t)!==!1;if(!this._mouseStarted)return t.preventDefault(),!0}return!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return r._mouseMove(e)},this._mouseUpDelegate=function(e){return r._mouseUp(e)},e(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),n=!0,!0},_mouseMove:function(t){return!e.ui.ie||document.documentMode>=9||!!t.button?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(e){return this.mouseDelayMet},_mouseStart:function(e){},_mouseDrag:function(e){},_mouseStop:function(e){},_mouseCapture:function(e){return!0}})})(jQuery);(function(e,t){function h(e,t,n){return[parseInt(e[0],10)*(l.test(e[0])?t/100:1),parseInt(e[1],10)*(l.test(e[1])?n/100:1)]}function p(t,n){return parseInt(e.css(t,n),10)||0}e.ui=e.ui||{};var n,r=Math.max,i=Math.abs,s=Math.round,o=/left|center|right/,u=/top|center|bottom/,a=/[\+\-]\d+%?/,f=/^\w+/,l=/%$/,c=e.fn.position;e.position={scrollbarWidth:function(){if(n!==t)return n;var r,i,s=e("<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return e("body").append(s),r=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,r===i&&(i=s[0].clientWidth),s.remove(),n=r-i},getScrollInfo:function(t){var n=t.isWindow?"":t.element.css("overflow-x"),r=t.isWindow?"":t.element.css("overflow-y"),i=n==="scroll"||n==="auto"&&t.width<t.element[0].scrollWidth,s=r==="scroll"||r==="auto"&&t.height<t.element[0].scrollHeight;return{width:i?e.position.scrollbarWidth():0,height:s?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var n=e(t||window),r=e.isWindow(n[0]);return{element:n,isWindow:r,offset:n.offset()||{left:0,top:0},scrollLeft:n.scrollLeft(),scrollTop:n.scrollTop(),width:r?n.width():n.outerWidth(),height:r?n.height():n.outerHeight()}}},e.fn.position=function(t){if(!t||!t.of)return c.apply(this,arguments);t=e.extend({},t);var n,l,d,v,m,g=e(t.of),y=e.position.getWithinInfo(t.within),b=e.position.getScrollInfo(y),w=g[0],E=(t.collision||"flip").split(" "),S={};return w.nodeType===9?(l=g.width(),d=g.height(),v={top:0,left:0}):e.isWindow(w)?(l=g.width(),d=g.height(),v={top:g.scrollTop(),left:g.scrollLeft()}):w.preventDefault?(t.at="left top",l=d=0,v={top:w.pageY,left:w.pageX}):(l=g.outerWidth(),d=g.outerHeight(),v=g.offset()),m=e.extend({},v),e.each(["my","at"],function(){var e=(t[this]||"").split(" "),n,r;e.length===1&&(e=o.test(e[0])?e.concat(["center"]):u.test(e[0])?["center"].concat(e):["center","center"]),e[0]=o.test(e[0])?e[0]:"center",e[1]=u.test(e[1])?e[1]:"center",n=a.exec(e[0]),r=a.exec(e[1]),S[this]=[n?n[0]:0,r?r[0]:0],t[this]=[f.exec(e[0])[0],f.exec(e[1])[0]]}),E.length===1&&(E[1]=E[0]),t.at[0]==="right"?m.left+=l:t.at[0]==="center"&&(m.left+=l/2),t.at[1]==="bottom"?m.top+=d:t.at[1]==="center"&&(m.top+=d/2),n=h(S.at,l,d),m.left+=n[0],m.top+=n[1],this.each(function(){var o,u,a=e(this),f=a.outerWidth(),c=a.outerHeight(),w=p(this,"marginLeft"),x=p(this,"marginTop"),T=f+w+p(this,"marginRight")+b.width,N=c+x+p(this,"marginBottom")+b.height,C=e.extend({},m),k=h(S.my,a.outerWidth(),a.outerHeight());t.my[0]==="right"?C.left-=f:t.my[0]==="center"&&(C.left-=f/2),t.my[1]==="bottom"?C.top-=c:t.my[1]==="center"&&(C.top-=c/2),C.left+=k[0],C.top+=k[1],e.support.offsetFractions||(C.left=s(C.left),C.top=s(C.top)),o={marginLeft:w,marginTop:x},e.each(["left","top"],function(r,i){e.ui.position[E[r]]&&e.ui.position[E[r]][i](C,{targetWidth:l,targetHeight:d,elemWidth:f,elemHeight:c,collisionPosition:o,collisionWidth:T,collisionHeight:N,offset:[n[0]+k[0],n[1]+k[1]],my:t.my,at:t.at,within:y,elem:a})}),e.fn.bgiframe&&a.bgiframe(),t.using&&(u=function(e){var n=v.left-C.left,s=n+l-f,o=v.top-C.top,u=o+d-c,h={target:{element:g,left:v.left,top:v.top,width:l,height:d},element:{element:a,left:C.left,top:C.top,width:f,height:c},horizontal:s<0?"left":n>0?"right":"center",vertical:u<0?"top":o>0?"bottom":"middle"};l<f&&i(n+s)<l&&(h.horizontal="center"),d<c&&i(o+u)<d&&(h.vertical="middle"),r(i(n),i(s))>r(i(o),i(u))?h.important="horizontal":h.important="vertical",t.using.call(this,e,h)}),a.offset(e.extend(C,{using:u}))})},e.ui.position={fit:{left:function(e,t){var n=t.within,i=n.isWindow?n.scrollLeft:n.offset.left,s=n.width,o=e.left-t.collisionPosition.marginLeft,u=i-o,a=o+t.collisionWidth-s-i,f;t.collisionWidth>s?u>0&&a<=0?(f=e.left+u+t.collisionWidth-s-i,e.left+=u-f):a>0&&u<=0?e.left=i:u>a?e.left=i+s-t.collisionWidth:e.left=i:u>0?e.left+=u:a>0?e.left-=a:e.left=r(e.left-o,e.left)},top:function(e,t){var n=t.within,i=n.isWindow?n.scrollTop:n.offset.top,s=t.within.height,o=e.top-t.collisionPosition.marginTop,u=i-o,a=o+t.collisionHeight-s-i,f;t.collisionHeight>s?u>0&&a<=0?(f=e.top+u+t.collisionHeight-s-i,e.top+=u-f):a>0&&u<=0?e.top=i:u>a?e.top=i+s-t.collisionHeight:e.top=i:u>0?e.top+=u:a>0?e.top-=a:e.top=r(e.top-o,e.top)}},flip:{left:function(e,t){var n=t.within,r=n.offset.left+n.scrollLeft,s=n.width,o=n.isWindow?n.scrollLeft:n.offset.left,u=e.left-t.collisionPosition.marginLeft,a=u-o,f=u+t.collisionWidth-s-o,l=t.my[0]==="left"?-t.elemWidth:t.my[0]==="right"?t.elemWidth:0,c=t.at[0]==="left"?t.targetWidth:t.at[0]==="right"?-t.targetWidth:0,h=-2*t.offset[0],p,d;if(a<0){p=e.left+l+c+h+t.collisionWidth-s-r;if(p<0||p<i(a))e.left+=l+c+h}else if(f>0){d=e.left-t.collisionPosition.marginLeft+l+c+h-o;if(d>0||i(d)<f)e.left+=l+c+h}},top:function(e,t){var n=t.within,r=n.offset.top+n.scrollTop,s=n.height,o=n.isWindow?n.scrollTop:n.offset.top,u=e.top-t.collisionPosition.marginTop,a=u-o,f=u+t.collisionHeight-s-o,l=t.my[1]==="top",c=l?-t.elemHeight:t.my[1]==="bottom"?t.elemHeight:0,h=t.at[1]==="top"?t.targetHeight:t.at[1]==="bottom"?-t.targetHeight:0,p=-2*t.offset[1],d,v;a<0?(v=e.top+c+h+p+t.collisionHeight-s-r,e.top+c+h+p>a&&(v<0||v<i(a))&&(e.top+=c+h+p)):f>0&&(d=e.top-t.collisionPosition.marginTop+c+h+p-o,e.top+c+h+p>f&&(d>0||i(d)<f)&&(e.top+=c+h+p))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,n,r,i,s,o=document.getElementsByTagName("body")[0],u=document.createElement("div");t=document.createElement(o?"div":"body"),r={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},o&&e.extend(r,{position:"absolute",left:"-1000px",top:"-1000px"});for(s in r)t.style[s]=r[s];t.appendChild(u),n=o||document.documentElement,n.insertBefore(t,n.firstChild),u.style.cssText="position: absolute; left: 10.7432222px;",i=e(u).offset().left,e.support.offsetFractions=i>10&&i<11,t.innerHTML="",n.removeChild(t)}(),e.uiBackCompat!==!1&&function(e){var n=e.fn.position;e.fn.position=function(r){if(!r||!r.offset)return n.call(this,r);var i=r.offset.split(" "),s=r.at.split(" ");return i.length===1&&(i[1]=i[0]),/^\d/.test(i[0])&&(i[0]="+"+i[0]),/^\d/.test(i[1])&&(i[1]="+"+i[1]),s.length===1&&(/left|center|right/.test(s[0])?s[1]="center":(s[1]=s[0],s[0]="center")),n.call(this,e.extend(r,{at:s[0]+i[0]+" "+s[1]+i[1],offset:t}))}}(jQuery)})(jQuery);(function(e,t){e.widget("ui.draggable",e.ui.mouse,{version:"1.9.2",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},_destroy:function(){this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy()},_mouseCapture:function(t){var n=this.options;return this.helper||n.disabled||e(t.target).is(".ui-resizable-handle")?!1:(this.handle=this._getHandle(t),this.handle?(e(n.iframeFix===!0?"iframe":n.iframeFix).each(function(){e('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(e(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(t){var n=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,n.cursorAt&&this._adjustOffsetFromHelper(n.cursorAt),n.containment&&this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_mouseDrag:function(t,n){this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute");if(!n){var r=this._uiHash();if(this._trigger("drag",t,r)===!1)return this._mouseUp({}),!1;this.position=r.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";return e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var n=!1;e.ui.ddmanager&&!this.options.dropBehaviour&&(n=e.ui.ddmanager.drop(this,t)),this.dropped&&(n=this.dropped,this.dropped=!1);var r=this.element[0],i=!1;while(r&&(r=r.parentNode))r==document&&(i=!0);if(!i&&this.options.helper==="original")return!1;if(this.options.revert=="invalid"&&!n||this.options.revert=="valid"&&n||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,n)){var s=this;e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){s._trigger("stop",t)!==!1&&s._clear()})}else this._trigger("stop",t)!==!1&&this._clear();return!1},_mouseUp:function(t){return e("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){var n=!this.options.handle||!e(this.options.handle,this.element).length?!0:!1;return e(this.options.handle,this.element).find("*").andSelf().each(function(){this==t.target&&(n=!0)}),n},_createHelper:function(t){var n=this.options,r=e.isFunction(n.helper)?e(n.helper.apply(this.element[0],[t])):n.helper=="clone"?this.element.clone().removeAttr("id"):this.element;return r.parents("body").length||r.appendTo(n.appendTo=="parent"?this.element[0].parentNode:n.appendTo),r[0]!=this.element[0]&&!/(fixed|absolute)/.test(r.css("position"))&&r.css("position","absolute"),r},_adjustOffsetFromHelper:function(t){typeof t=="string"&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&e.ui.ie)t={top:0,left:0};return{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var e=this.element.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t=this.options;t.containment=="parent"&&(t.containment=this.helper[0].parentNode);if(t.containment=="document"||t.containment=="window")this.containment=[t.containment=="document"?0:e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t.containment=="document"?0:e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(t.containment=="document"?0:e(window).scrollLeft())+e(t.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(t.containment=="document"?0:e(window).scrollTop())+(e(t.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(t.containment)&&t.containment.constructor!=Array){var n=e(t.containment),r=n[0];if(!r)return;var i=n.offset(),s=e(r).css("overflow")!="hidden";this.containment=[(parseInt(e(r).css("borderLeftWidth"),10)||0)+(parseInt(e(r).css("paddingLeft"),10)||0),(parseInt(e(r).css("borderTopWidth"),10)||0)+(parseInt(e(r).css("paddingTop"),10)||0),(s?Math.max(r.scrollWidth,r.offsetWidth):r.offsetWidth)-(parseInt(e(r).css("borderLeftWidth"),10)||0)-(parseInt(e(r).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(s?Math.max(r.scrollHeight,r.offsetHeight):r.offsetHeight)-(parseInt(e(r).css("borderTopWidth"),10)||0)-(parseInt(e(r).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=n}else t.containment.constructor==Array&&(this.containment=t.containment)},_convertPositionTo:function(t,n){n||(n=this.position);var r=t=="absolute"?1:-1,i=this.options,s=this.cssPosition!="absolute"||this.scrollParent[0]!=document&&!!e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(s[0].tagName);return{top:n.top+this.offset.relative.top*r+this.offset.parent.top*r-(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():o?0:s.scrollTop())*r,left:n.left+this.offset.relative.left*r+this.offset.parent.left*r-(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():o?0:s.scrollLeft())*r}},_generatePosition:function(t){var n=this.options,r=this.cssPosition!="absolute"||this.scrollParent[0]!=document&&!!e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,i=/(html|body)/i.test(r[0].tagName),s=t.pageX,o=t.pageY;if(this.originalPosition){var u;if(this.containment){if(this.relative_container){var a=this.relative_container.offset();u=[this.containment[0]+a.left,this.containment[1]+a.top,this.containment[2]+a.left,this.containment[3]+a.top]}else u=this.containment;t.pageX-this.offset.click.left<u[0]&&(s=u[0]+this.offset.click.left),t.pageY-this.offset.click.top<u[1]&&(o=u[1]+this.offset.click.top),t.pageX-this.offset.click.left>u[2]&&(s=u[2]+this.offset.click.left),t.pageY-this.offset.click.top>u[3]&&(o=u[3]+this.offset.click.top)}if(n.grid){var f=n.grid[1]?this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1]:this.originalPageY;o=u?f-this.offset.click.top<u[1]||f-this.offset.click.top>u[3]?f-this.offset.click.top<u[1]?f+n.grid[1]:f-n.grid[1]:f:f;var l=n.grid[0]?this.originalPageX+Math.round((s-this.originalPageX)/n.grid[0])*n.grid[0]:this.originalPageX;s=u?l-this.offset.click.left<u[0]||l-this.offset.click.left>u[2]?l-this.offset.click.left<u[0]?l+n.grid[0]:l-n.grid[0]:l:l}}return{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():i?0:r.scrollTop()),left:s-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:r.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(t,n,r){return r=r||this._uiHash(),e.ui.plugin.call(this,t,[n,r]),t=="drag"&&(this.positionAbs=this._convertPositionTo("absolute")),e.Widget.prototype._trigger.call(this,t,n,r)},plugins:{},_uiHash:function(e){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,n){var r=e(this).data("draggable"),i=r.options,s=e.extend({},n,{item:r.element});r.sortables=[],e(i.connectToSortable).each(function(){var n=e.data(this,"sortable");n&&!n.options.disabled&&(r.sortables.push({instance:n,shouldRevert:n.options.revert}),n.refreshPositions(),n._trigger("activate",t,s))})},stop:function(t,n){var r=e(this).data("draggable"),i=e.extend({},n,{item:r.element});e.each(r.sortables,function(){this.instance.isOver?(this.instance.isOver=0,r.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=!0),this.instance._mouseStop(t),this.instance.options.helper=this.instance.options._helper,r.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",t,i))})},drag:function(t,n){var r=e(this).data("draggable"),i=this,s=function(t){var n=this.offset.click.top,r=this.offset.click.left,i=this.positionAbs.top,s=this.positionAbs.left,o=t.height,u=t.width,a=t.top,f=t.left;return e.ui.isOver(i+n,s+r,a,f,o,u)};e.each(r.sortables,function(s){var o=!1,u=this;this.instance.positionAbs=r.positionAbs,this.instance.helperProportions=r.helperProportions,this.instance.offset.click=r.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(o=!0,e.each(r.sortables,function(){return this.instance.positionAbs=r.positionAbs,this.instance.helperProportions=r.helperProportions,this.instance.offset.click=r.offset.click,this!=u&&this.instance._intersectsWith(this.instance.containerCache)&&e.ui.contains(u.instance.element[0],this.instance.element[0])&&(o=!1),o})),o?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=e(i).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return n.helper[0]},t.target=this.instance.currentItem[0],this.instance._mouseCapture(t,!0),this.instance._mouseStart(t,!0,!0),this.instance.offset.click.top=r.offset.click.top,this.instance.offset.click.left=r.offset.click.left,this.instance.offset.parent.left-=r.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=r.offset.parent.top-this.instance.offset.parent.top,r._trigger("toSortable",t),r.dropped=this.instance.element,r.currentItem=r.element,this.instance.fromOutside=r),this.instance.currentItem&&this.instance._mouseDrag(t)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",t,this.instance._uiHash(this.instance)),this.instance._mouseStop(t,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),r._trigger("fromSortable",t),r.dropped=!1)})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,n){var r=e("body"),i=e(this).data("draggable").options;r.css("cursor")&&(i._cursor=r.css("cursor")),r.css("cursor",i.cursor)},stop:function(t,n){var r=e(this).data("draggable").options;r._cursor&&e("body").css("cursor",r._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,n){var r=e(n.helper),i=e(this).data("draggable").options;r.css("opacity")&&(i._opacity=r.css("opacity")),r.css("opacity",i.opacity)},stop:function(t,n){var r=e(this).data("draggable").options;r._opacity&&e(n.helper).css("opacity",r._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(t,n){var r=e(this).data("draggable");r.scrollParent[0]!=document&&r.scrollParent[0].tagName!="HTML"&&(r.overflowOffset=r.scrollParent.offset())},drag:function(t,n){var r=e(this).data("draggable"),i=r.options,s=!1;if(r.scrollParent[0]!=document&&r.scrollParent[0].tagName!="HTML"){if(!i.axis||i.axis!="x")r.overflowOffset.top+r.scrollParent[0].offsetHeight-t.pageY<i.scrollSensitivity?r.scrollParent[0].scrollTop=s=r.scrollParent[0].scrollTop+i.scrollSpeed:t.pageY-r.overflowOffset.top<i.scrollSensitivity&&(r.scrollParent[0].scrollTop=s=r.scrollParent[0].scrollTop-i.scrollSpeed);if(!i.axis||i.axis!="y")r.overflowOffset.left+r.scrollParent[0].offsetWidth-t.pageX<i.scrollSensitivity?r.scrollParent[0].scrollLeft=s=r.scrollParent[0].scrollLeft+i.scrollSpeed:t.pageX-r.overflowOffset.left<i.scrollSensitivity&&(r.scrollParent[0].scrollLeft=s=r.scrollParent[0].scrollLeft-i.scrollSpeed)}else{if(!i.axis||i.axis!="x")t.pageY-e(document).scrollTop()<i.scrollSensitivity?s=e(document).scrollTop(e(document).scrollTop()-i.scrollSpeed):e(window).height()-(t.pageY-e(document).scrollTop())<i.scrollSensitivity&&(s=e(document).scrollTop(e(document).scrollTop()+i.scrollSpeed));if(!i.axis||i.axis!="y")t.pageX-e(document).scrollLeft()<i.scrollSensitivity?s=e(document).scrollLeft(e(document).scrollLeft()-i.scrollSpeed):e(window).width()-(t.pageX-e(document).scrollLeft())<i.scrollSensitivity&&(s=e(document).scrollLeft(e(document).scrollLeft()+i.scrollSpeed))}s!==!1&&e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(r,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,n){var r=e(this).data("draggable"),i=r.options;r.snapElements=[],e(i.snap.constructor!=String?i.snap.items||":data(draggable)":i.snap).each(function(){var t=e(this),n=t.offset();this!=r.element[0]&&r.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:n.top,left:n.left})})},drag:function(t,n){var r=e(this).data("draggable"),i=r.options,s=i.snapTolerance,o=n.offset.left,u=o+r.helperProportions.width,a=n.offset.top,f=a+r.helperProportions.height;for(var l=r.snapElements.length-1;l>=0;l--){var c=r.snapElements[l].left,h=c+r.snapElements[l].width,p=r.snapElements[l].top,d=p+r.snapElements[l].height;if(!(c-s<o&&o<h+s&&p-s<a&&a<d+s||c-s<o&&o<h+s&&p-s<f&&f<d+s||c-s<u&&u<h+s&&p-s<a&&a<d+s||c-s<u&&u<h+s&&p-s<f&&f<d+s)){r.snapElements[l].snapping&&r.options.snap.release&&r.options.snap.release.call(r.element,t,e.extend(r._uiHash(),{snapItem:r.snapElements[l].item})),r.snapElements[l].snapping=!1;continue}if(i.snapMode!="inner"){var v=Math.abs(p-f)<=s,m=Math.abs(d-a)<=s,g=Math.abs(c-u)<=s,y=Math.abs(h-o)<=s;v&&(n.position.top=r._convertPositionTo("relative",{top:p-r.helperProportions.height,left:0}).top-r.margins.top),m&&(n.position.top=r._convertPositionTo("relative",{top:d,left:0}).top-r.margins.top),g&&(n.position.left=r._convertPositionTo("relative",{top:0,left:c-r.helperProportions.width}).left-r.margins.left),y&&(n.position.left=r._convertPositionTo("relative",{top:0,left:h}).left-r.margins.left)}var b=v||m||g||y;if(i.snapMode!="outer"){var v=Math.abs(p-a)<=s,m=Math.abs(d-f)<=s,g=Math.abs(c-o)<=s,y=Math.abs(h-u)<=s;v&&(n.position.top=r._convertPositionTo("relative",{top:p,left:0}).top-r.margins.top),m&&(n.position.top=r._convertPositionTo("relative",{top:d-r.helperProportions.height,left:0}).top-r.margins.top),g&&(n.position.left=r._convertPositionTo("relative",{top:0,left:c}).left-r.margins.left),y&&(n.position.left=r._convertPositionTo("relative",{top:0,left:h-r.helperProportions.width}).left-r.margins.left)}!r.snapElements[l].snapping&&(v||m||g||y||b)&&r.options.snap.snap&&r.options.snap.snap.call(r.element,t,e.extend(r._uiHash(),{snapItem:r.snapElements[l].item})),r.snapElements[l].snapping=v||m||g||y||b}}}),e.ui.plugin.add("draggable","stack",{start:function(t,n){var r=e(this).data("draggable").options,i=e.makeArray(e(r.stack)).sort(function(t,n){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(n).css("zIndex"),10)||0)});if(!i.length)return;var s=parseInt(i[0].style.zIndex)||0;e(i).each(function(e){this.style.zIndex=s+e}),this[0].style.zIndex=s+i.length}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,n){var r=e(n.helper),i=e(this).data("draggable").options;r.css("zIndex")&&(i._zIndex=r.css("zIndex")),r.css("zIndex",i.zIndex)},stop:function(t,n){var r=e(this).data("draggable").options;r._zIndex&&e(n.helper).css("zIndex",r._zIndex)}})})(jQuery);(function(e,t){e.widget("ui.droppable",{version:"1.9.2",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect"},_create:function(){var t=this.options,n=t.accept;this.isover=0,this.isout=1,this.accept=e.isFunction(n)?n:function(e){return e.is(n)},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},e.ui.ddmanager.droppables[t.scope]=e.ui.ddmanager.droppables[t.scope]||[],e.ui.ddmanager.droppables[t.scope].push(this),t.addClasses&&this.element.addClass("ui-droppable")},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];for(var n=0;n<t.length;n++)t[n]==this&&t.splice(n,1);this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,n){t=="accept"&&(this.accept=e.isFunction(n)?n:function(e){return e.is(n)}),e.Widget.prototype._setOption.apply(this,arguments)},_activate:function(t){var n=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),n&&this._trigger("activate",t,this.ui(n))},_deactivate:function(t){var n=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),n&&this._trigger("deactivate",t,this.ui(n))},_over:function(t){var n=e.ui.ddmanager.current;if(!n||(n.currentItem||n.element)[0]==this.element[0])return;this.accept.call(this.element[0],n.currentItem||n.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(n)))},_out:function(t){var n=e.ui.ddmanager.current;if(!n||(n.currentItem||n.element)[0]==this.element[0])return;this.accept.call(this.element[0],n.currentItem||n.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(n)))},_drop:function(t,n){var r=n||e.ui.ddmanager.current;if(!r||(r.currentItem||r.element)[0]==this.element[0])return!1;var i=!1;return this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var t=e.data(this,"droppable");if(t.options.greedy&&!t.options.disabled&&t.options.scope==r.options.scope&&t.accept.call(t.element[0],r.currentItem||r.element)&&e.ui.intersect(r,e.extend(t,{offset:t.element.offset()}),t.options.tolerance))return i=!0,!1}),i?!1:this.accept.call(this.element[0],r.currentItem||r.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(r)),this.element):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(t,n,r){if(!n.offset)return!1;var i=(t.positionAbs||t.position.absolute).left,s=i+t.helperProportions.width,o=(t.positionAbs||t.position.absolute).top,u=o+t.helperProportions.height,a=n.offset.left,f=a+n.proportions.width,l=n.offset.top,c=l+n.proportions.height;switch(r){case"fit":return a<=i&&s<=f&&l<=o&&u<=c;case"intersect":return a<i+t.helperProportions.width/2&&s-t.helperProportions.width/2<f&&l<o+t.helperProportions.height/2&&u-t.helperProportions.height/2<c;case"pointer":var h=(t.positionAbs||t.position.absolute).left+(t.clickOffset||t.offset.click).left,p=(t.positionAbs||t.position.absolute).top+(t.clickOffset||t.offset.click).top,d=e.ui.isOver(p,h,l,a,n.proportions.height,n.proportions.width);return d;case"touch":return(o>=l&&o<=c||u>=l&&u<=c||o<l&&u>c)&&(i>=a&&i<=f||s>=a&&s<=f||i<a&&s>f);default:return!1}},e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,n){var r=e.ui.ddmanager.droppables[t.options.scope]||[],i=n?n.type:null,s=(t.currentItem||t.element).find(":data(droppable)").andSelf();e:for(var o=0;o<r.length;o++){if(r[o].options.disabled||t&&!r[o].accept.call(r[o].element[0],t.currentItem||t.element))continue;for(var u=0;u<s.length;u++)if(s[u]==r[o].element[0]){r[o].proportions.height=0;continue e}r[o].visible=r[o].element.css("display")!="none";if(!r[o].visible)continue;i=="mousedown"&&r[o]._activate.call(r[o],n),r[o].offset=r[o].element.offset(),r[o].proportions={width:r[o].element[0].offsetWidth,height:r[o].element[0].offsetHeight}}},drop:function(t,n){var r=!1;return e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options)return;!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance)&&(r=this._drop.call(this,n)||r),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=1,this.isover=0,this._deactivate.call(this,n))}),r},dragStart:function(t,n){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,n)})},drag:function(t,n){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,n),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(this.options.disabled||this.greedyChild||!this.visible)return;var r=e.ui.intersect(t,this,this.options.tolerance),i=!r&&this.isover==1?"isout":r&&this.isover==0?"isover":null;if(!i)return;var s;if(this.options.greedy){var o=this.options.scope,u=this.element.parents(":data(droppable)").filter(function(){return e.data(this,"droppable").options.scope===o});u.length&&(s=e.data(u[0],"droppable"),s.greedyChild=i=="isover"?1:0)}s&&i=="isover"&&(s.isover=0,s.isout=1,s._out.call(s,n)),this[i]=1,this[i=="isout"?"isover":"isout"]=0,this[i=="isover"?"_over":"_out"].call(this,n),s&&i=="isout"&&(s.isout=0,s.isover=1,s._over.call(s,n))})},dragStop:function(t,n){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,n)}}})(jQuery);(function(e,t){e.widget("ui.resizable",e.ui.mouse,{version:"1.9.2",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var t=this,n=this.options;this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!n.aspectRatio,aspectRatio:n.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:n.helper||n.ghost||n.animate?n.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=n.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var r=this.handles.split(",");this.handles={};for(var i=0;i<r.length;i++){var s=e.trim(r[i]),o="ui-resizable-"+s,u=e('<div class="ui-resizable-handle '+o+'"></div>');u.css({zIndex:n.zIndex}),"se"==s&&u.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(u)}}this._renderAxis=function(t){t=t||this.element;for(var n in this.handles){this.handles[n].constructor==String&&(this.handles[n]=e(this.handles[n],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var r=e(this.handles[n],this.element),i=0;i=/sw|ne|nw|se|n|s/.test(n)?r.outerHeight():r.outerWidth();var s=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");t.css(s,i),this._proportionallyResize()}if(!e(this.handles[n]).length)continue}},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!t.resizing){if(this.className)var e=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);t.axis=e&&e[1]?e[1]:"se"}}),n.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){if(n.disabled)return;e(this).removeClass("ui-resizable-autohide"),t._handles.show()}).mouseleave(function(){if(n.disabled)return;t.resizing||(e(this).addClass("ui-resizable-autohide"),t._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){t(this.element);var n=this.element;this.originalElement.css({position:n.css("position"),width:n.outerWidth(),height:n.outerHeight(),top:n.css("top"),left:n.css("left")}).insertAfter(n),n.remove()}return this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_mouseCapture:function(t){var n=!1;for(var r in this.handles)e(this.handles[r])[0]==t.target&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var r=this.options,i=this.element.position(),s=this.element;this.resizing=!0,this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()},(s.is(".ui-draggable")||/absolute/.test(s.css("position")))&&s.css({position:"absolute",top:i.top,left:i.left}),this._renderProxy();var o=n(this.helper.css("left")),u=n(this.helper.css("top"));r.containment&&(o+=e(r.containment).scrollLeft()||0,u+=e(r.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:o,top:u},this.size=this._helper?{width:s.outerWidth(),height:s.outerHeight()}:{width:s.width(),height:s.height()},this.originalSize=this._helper?{width:s.outerWidth(),height:s.outerHeight()}:{width:s.width(),height:s.height()},this.originalPosition={left:o,top:u},this.sizeDiff={width:s.outerWidth()-s.width(),height:s.outerHeight()-s.height()},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio=typeof r.aspectRatio=="number"?r.aspectRatio:this.originalSize.width/this.originalSize.height||1;var a=e(".ui-resizable-"+this.axis).css("cursor");return e("body").css("cursor",a=="auto"?this.axis+"-resize":a),s.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(e){var t=this.helper,n=this.options,r={},i=this,s=this.originalMousePosition,o=this.axis,u=e.pageX-s.left||0,a=e.pageY-s.top||0,f=this._change[o];if(!f)return!1;var l=f.apply(this,[e,u,a]);this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey)l=this._updateRatio(l,e);return l=this._respectSize(l,e),this._propagate("resize",e),t.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",e,this.ui()),!1},_mouseStop:function(t){this.resizing=!1;var n=this.options,r=this;if(this._helper){var i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),o=s&&e.ui.hasScroll(i[0],"left")?0:r.sizeDiff.height,u=s?0:r.sizeDiff.width,a={width:r.helper.width()-u,height:r.helper.height()-o},f=parseInt(r.element.css("left"),10)+(r.position.left-r.originalPosition.left)||null,l=parseInt(r.element.css("top"),10)+(r.position.top-r.originalPosition.top)||null;n.animate||this.element.css(e.extend(a,{top:l,left:f})),r.helper.height(r.size.height),r.helper.width(r.size.width),this._helper&&!n.animate&&this._proportionallyResize()}return e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(e){var t=this.options,n,i,s,o,u;u={minWidth:r(t.minWidth)?t.minWidth:0,maxWidth:r(t.maxWidth)?t.maxWidth:Infinity,minHeight:r(t.minHeight)?t.minHeight:0,maxHeight:r(t.maxHeight)?t.maxHeight:Infinity};if(this._aspectRatio||e)n=u.minHeight*this.aspectRatio,s=u.minWidth/this.aspectRatio,i=u.maxHeight*this.aspectRatio,o=u.maxWidth/this.aspectRatio,n>u.minWidth&&(u.minWidth=n),s>u.minHeight&&(u.minHeight=s),i<u.maxWidth&&(u.maxWidth=i),o<u.maxHeight&&(u.maxHeight=o);this._vBoundaries=u},_updateCache:function(e){var t=this.options;this.offset=this.helper.offset(),r(e.left)&&(this.position.left=e.left),r(e.top)&&(this.position.top=e.top),r(e.height)&&(this.size.height=e.height),r(e.width)&&(this.size.width=e.width)},_updateRatio:function(e,t){var n=this.options,i=this.position,s=this.size,o=this.axis;return r(e.height)?e.width=e.height*this.aspectRatio:r(e.width)&&(e.height=e.width/this.aspectRatio),o=="sw"&&(e.left=i.left+(s.width-e.width),e.top=null),o=="nw"&&(e.top=i.top+(s.height-e.height),e.left=i.left+(s.width-e.width)),e},_respectSize:function(e,t){var n=this.helper,i=this._vBoundaries,s=this._aspectRatio||t.shiftKey,o=this.axis,u=r(e.width)&&i.maxWidth&&i.maxWidth<e.width,a=r(e.height)&&i.maxHeight&&i.maxHeight<e.height,f=r(e.width)&&i.minWidth&&i.minWidth>e.width,l=r(e.height)&&i.minHeight&&i.minHeight>e.height;f&&(e.width=i.minWidth),l&&(e.height=i.minHeight),u&&(e.width=i.maxWidth),a&&(e.height=i.maxHeight);var c=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,p=/sw|nw|w/.test(o),d=/nw|ne|n/.test(o);f&&p&&(e.left=c-i.minWidth),u&&p&&(e.left=c-i.maxWidth),l&&d&&(e.top=h-i.minHeight),a&&d&&(e.top=h-i.maxHeight);var v=!e.width&&!e.height;return v&&!e.left&&e.top?e.top=null:v&&!e.top&&e.left&&(e.left=null),e},_proportionallyResize:function(){var t=this.options;if(!this._proportionallyResizeElements.length)return;var n=this.helper||this.element;for(var r=0;r<this._proportionallyResizeElements.length;r++){var i=this._proportionallyResizeElements[r];if(!this.borderDif){var s=[i.css("borderTopWidth"),i.css("borderRightWidth"),i.css("borderBottomWidth"),i.css("borderLeftWidth")],o=[i.css("paddingTop"),i.css("paddingRight"),i.css("paddingBottom"),i.css("paddingLeft")];this.borderDif=e.map(s,function(e,t){var n=parseInt(e,10)||0,r=parseInt(o[t],10)||0;return n+r})}i.css({height:n.height()-this.borderDif[0]-this.borderDif[2]||0,width:n.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var t=this.element,n=this.options;this.elementOffset=t.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var r=e.ui.ie6?1:0,i=e.ui.ie6?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+i,height:this.element.outerHeight()+i,position:"absolute",left:this.elementOffset.left-r+"px",top:this.elementOffset.top-r+"px",zIndex:++n.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(e,t,n){return{width:this.originalSize.width+t}},w:function(e,t,n){var r=this.options,i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,n){var r=this.options,i=this.originalSize,s=this.originalPosition;return{top:s.top+n,height:i.height-n}},s:function(e,t,n){return{height:this.originalSize.height+n}},se:function(t,n,r){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,n,r]))},sw:function(t,n,r){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,n,r]))},ne:function(t,n,r){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,n,r]))},nw:function(t,n,r){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,n,r]))}},_propagate:function(t,n){e.ui.plugin.call(this,t,[n,this.ui()]),t!="resize"&&this._trigger(t,n,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","alsoResize",{start:function(t,n){var r=e(this).data("resizable"),i=r.options,s=function(t){e(t).each(function(){var t=e(this);t.data("resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};typeof i.alsoResize=="object"&&!i.alsoResize.parentNode?i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)}):s(i.alsoResize)},resize:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.originalSize,o=r.originalPosition,u={height:r.size.height-s.height||0,width:r.size.width-s.width||0,top:r.position.top-o.top||0,left:r.position.left-o.left||0},a=function(t,r){e(t).each(function(){var t=e(this),i=e(this).data("resizable-alsoresize"),s={},o=r&&r.length?r:t.parents(n.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var n=(i[t]||0)+(u[t]||0);n&&n>=0&&(s[t]=n||null)}),t.css(s)})};typeof i.alsoResize=="object"&&!i.alsoResize.nodeType?e.each(i.alsoResize,function(e,t){a(e,t)}):a(i.alsoResize)},stop:function(t,n){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","animate",{stop:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r._proportionallyResizeElements,o=s.length&&/textarea/i.test(s[0].nodeName),u=o&&e.ui.hasScroll(s[0],"left")?0:r.sizeDiff.height,a=o?0:r.sizeDiff.width,f={width:r.size.width-a,height:r.size.height-u},l=parseInt(r.element.css("left"),10)+(r.position.left-r.originalPosition.left)||null,c=parseInt(r.element.css("top"),10)+(r.position.top-r.originalPosition.top)||null;r.element.animate(e.extend(f,c&&l?{top:c,left:l}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var n={width:parseInt(r.element.css("width"),10),height:parseInt(r.element.css("height"),10),top:parseInt(r.element.css("top"),10),left:parseInt(r.element.css("left"),10)};s&&s.length&&e(s[0]).css({width:n.width,height:n.height}),r._updateCache(n),r._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(t,r){var i=e(this).data("resizable"),s=i.options,o=i.element,u=s.containment,a=u instanceof e?u.get(0):/parent/.test(u)?o.parent().get(0):u;if(!a)return;i.containerElement=e(a);if(/document/.test(u)||u==document)i.containerOffset={left:0,top:0},i.containerPosition={left:0,top:0},i.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight};else{var f=e(a),l=[];e(["Top","Right","Left","Bottom"]).each(function(e,t){l[e]=n(f.css("padding"+t))}),i.containerOffset=f.offset(),i.containerPosition=f.position(),i.containerSize={height:f.innerHeight()-l[3],width:f.innerWidth()-l[1]};var c=i.containerOffset,h=i.containerSize.height,p=i.containerSize.width,d=e.ui.hasScroll(a,"left")?a.scrollWidth:p,v=e.ui.hasScroll(a)?a.scrollHeight:h;i.parentData={element:a,left:c.left,top:c.top,width:d,height:v}}},resize:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.containerSize,o=r.containerOffset,u=r.size,a=r.position,f=r._aspectRatio||t.shiftKey,l={top:0,left:0},c=r.containerElement;c[0]!=document&&/static/.test(c.css("position"))&&(l=o),a.left<(r._helper?o.left:0)&&(r.size.width=r.size.width+(r._helper?r.position.left-o.left:r.position.left-l.left),f&&(r.size.height=r.size.width/r.aspectRatio),r.position.left=i.helper?o.left:0),a.top<(r._helper?o.top:0)&&(r.size.height=r.size.height+(r._helper?r.position.top-o.top:r.position.top),f&&(r.size.width=r.size.height*r.aspectRatio),r.position.top=r._helper?o.top:0),r.offset.left=r.parentData.left+r.position.left,r.offset.top=r.parentData.top+r.position.top;var h=Math.abs((r._helper?r.offset.left-l.left:r.offset.left-l.left)+r.sizeDiff.width),p=Math.abs((r._helper?r.offset.top-l.top:r.offset.top-o.top)+r.sizeDiff.height),d=r.containerElement.get(0)==r.element.parent().get(0),v=/relative|absolute/.test(r.containerElement.css("position"));d&&v&&(h-=r.parentData.left),h+r.size.width>=r.parentData.width&&(r.size.width=r.parentData.width-h,f&&(r.size.height=r.size.width/r.aspectRatio)),p+r.size.height>=r.parentData.height&&(r.size.height=r.parentData.height-p,f&&(r.size.width=r.size.height*r.aspectRatio))},stop:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.position,o=r.containerOffset,u=r.containerPosition,a=r.containerElement,f=e(r.helper),l=f.offset(),c=f.outerWidth()-r.sizeDiff.width,h=f.outerHeight()-r.sizeDiff.height;r._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:l.left-u.left-o.left,width:c,height:h}),r._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:l.left-u.left-o.left,width:c,height:h})}}),e.ui.plugin.add("resizable","ghost",{start:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.size;r.ghost=r.originalElement.clone(),r.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:""),r.ghost.appendTo(r.helper)},resize:function(t,n){var r=e(this).data("resizable"),i=r.options;r.ghost&&r.ghost.css({position:"relative",height:r.size.height,width:r.size.width})},stop:function(t,n){var r=e(this).data("resizable"),i=r.options;r.ghost&&r.helper&&r.helper.get(0).removeChild(r.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.size,o=r.originalSize,u=r.originalPosition,a=r.axis,f=i._aspectRatio||t.shiftKey;i.grid=typeof i.grid=="number"?[i.grid,i.grid]:i.grid;var l=Math.round((s.width-o.width)/(i.grid[0]||1))*(i.grid[0]||1),c=Math.round((s.height-o.height)/(i.grid[1]||1))*(i.grid[1]||1);/^(se|s|e)$/.test(a)?(r.size.width=o.width+l,r.size.height=o.height+c):/^(ne)$/.test(a)?(r.size.width=o.width+l,r.size.height=o.height+c,r.position.top=u.top-c):/^(sw)$/.test(a)?(r.size.width=o.width+l,r.size.height=o.height+c,r.position.left=u.left-l):(r.size.width=o.width+l,r.size.height=o.height+c,r.position.top=u.top-c,r.position.left=u.left-l)}});var n=function(e){return parseInt(e,10)||0},r=function(e){return!isNaN(parseInt(e,10))}})(jQuery);(function(e,t){e.widget("ui.selectable",e.ui.mouse,{version:"1.9.2",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var t=this;this.element.addClass("ui-selectable"),this.dragged=!1;var n;this.refresh=function(){n=e(t.options.filter,t.element[0]),n.addClass("ui-selectee"),n.each(function(){var t=e(this),n=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:n.left,top:n.top,right:n.left+t.outerWidth(),bottom:n.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=n.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var n=this;this.opos=[t.pageX,t.pageY];if(this.options.disabled)return;var r=this.options;this.selectees=e(r.filter,this.element[0]),this._trigger("start",t),e(r.appendTo).append(this.helper),this.helper.css({left:t.clientX,top:t.clientY,width:0,height:0}),r.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var r=e.data(this,"selectable-item");r.startselected=!0,!t.metaKey&&!t.ctrlKey&&(r.$element.removeClass("ui-selected"),r.selected=!1,r.$element.addClass("ui-unselecting"),r.unselecting=!0,n._trigger("unselecting",t,{unselecting:r.element}))}),e(t.target).parents().andSelf().each(function(){var r=e.data(this,"selectable-item");if(r){var i=!t.metaKey&&!t.ctrlKey||!r.$element.hasClass("ui-selected");return r.$element.removeClass(i?"ui-unselecting":"ui-selected").addClass(i?"ui-selecting":"ui-unselecting"),r.unselecting=!i,r.selecting=i,r.selected=i,i?n._trigger("selecting",t,{selecting:r.element}):n._trigger("unselecting",t,{unselecting:r.element}),!1}})},_mouseDrag:function(t){var n=this;this.dragged=!0;if(this.options.disabled)return;var r=this.options,i=this.opos[0],s=this.opos[1],o=t.pageX,u=t.pageY;if(i>o){var a=o;o=i,i=a}if(s>u){var a=u;u=s,s=a}return this.helper.css({left:i,top:s,width:o-i,height:u-s}),this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!a||a.element==n.element[0])return;var f=!1;r.tolerance=="touch"?f=!(a.left>o||a.right<i||a.top>u||a.bottom<s):r.tolerance=="fit"&&(f=a.left>i&&a.right<o&&a.top>s&&a.bottom<u),f?(a.selected&&(a.$element.removeClass("ui-selected"),a.selected=!1),a.unselecting&&(a.$element.removeClass("ui-unselecting"),a.unselecting=!1),a.selecting||(a.$element.addClass("ui-selecting"),a.selecting=!0,n._trigger("selecting",t,{selecting:a.element}))):(a.selecting&&((t.metaKey||t.ctrlKey)&&a.startselected?(a.$element.removeClass("ui-selecting"),a.selecting=!1,a.$element.addClass("ui-selected"),a.selected=!0):(a.$element.removeClass("ui-selecting"),a.selecting=!1,a.startselected&&(a.$element.addClass("ui-unselecting"),a.unselecting=!0),n._trigger("unselecting",t,{unselecting:a.element}))),a.selected&&!t.metaKey&&!t.ctrlKey&&!a.startselected&&(a.$element.removeClass("ui-selected"),a.selected=!1,a.$element.addClass("ui-unselecting"),a.unselecting=!0,n._trigger("unselecting",t,{unselecting:a.element})))}),!1},_mouseStop:function(t){var n=this;this.dragged=!1;var r=this.options;return e(".ui-unselecting",this.element[0]).each(function(){var r=e.data(this,"selectable-item");r.$element.removeClass("ui-unselecting"),r.unselecting=!1,r.startselected=!1,n._trigger("unselected",t,{unselected:r.element})}),e(".ui-selecting",this.element[0]).each(function(){var r=e.data(this,"selectable-item");r.$element.removeClass("ui-selecting").addClass("ui-selected"),r.selecting=!1,r.selected=!0,r.startselected=!0,n._trigger("selected",t,{selected:r.element})}),this._trigger("stop",t),this.helper.remove(),!1}})})(jQuery);(function(e,t){e.widget("ui.sortable",e.ui.mouse,{version:"1.9.2",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var e=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?e.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_setOption:function(t,n){t==="disabled"?(this.options[t]=n,this.widget().toggleClass("ui-sortable-disabled",!!n)):e.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(t,n){var r=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(t);var i=null,s=e(t.target).parents().each(function(){if(e.data(this,r.widgetName+"-item")==r)return i=e(this),!1});e.data(t.target,r.widgetName+"-item")==r&&(i=e(t.target));if(!i)return!1;if(this.options.handle&&!n){var o=!1;e(this.options.handle,i).find("*").andSelf().each(function(){this==t.target&&(o=!0)});if(!o)return!1}return this.currentItem=i,this._removeCurrentsFromItems(),!0},_mouseStart:function(t,n,r){var i=this.options;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),i.containment&&this._setContainment(),i.cursor&&(e("body").css("cursor")&&(this._storedCursor=e("body").css("cursor")),e("body").css("cursor",i.cursor)),i.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",i.opacity)),i.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",i.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!r)for(var s=this.containers.length-1;s>=0;s--)this.containers[s]._trigger("activate",t,this._uiHash(this));return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var n=this.options,r=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<n.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+n.scrollSpeed:t.pageY-this.overflowOffset.top<n.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-n.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<n.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+n.scrollSpeed:t.pageX-this.overflowOffset.left<n.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-n.scrollSpeed)):(t.pageY-e(document).scrollTop()<n.scrollSensitivity?r=e(document).scrollTop(e(document).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(document).scrollTop())<n.scrollSensitivity&&(r=e(document).scrollTop(e(document).scrollTop()+n.scrollSpeed)),t.pageX-e(document).scrollLeft()<n.scrollSensitivity?r=e(document).scrollLeft(e(document).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(document).scrollLeft())<n.scrollSensitivity&&(r=e(document).scrollLeft(e(document).scrollLeft()+n.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(var i=this.items.length-1;i>=0;i--){var s=this.items[i],o=s.item[0],u=this._intersectsWithPointer(s);if(!u)continue;if(s.instance!==this.currentContainer)continue;if(o!=this.currentItem[0]&&this.placeholder[u==1?"next":"prev"]()[0]!=o&&!e.contains(this.placeholder[0],o)&&(this.options.type=="semi-dynamic"?!e.contains(this.element[0],o):!0)){this.direction=u==1?"down":"up";if(this.options.tolerance!="pointer"&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,n){if(!t)return;e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t);if(this.options.revert){var r=this,i=this.placeholder.offset();this.reverting=!0,e(this.helper).animate({left:i.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:i.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){r._clear(t)})}else this._clear(t,n);return!1},cancel:function(){if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var n=this._getItemsAsjQuery(t&&t.connected),r=[];return t=t||{},e(n).each(function(){var n=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[-=_](.+)/);n&&r.push((t.key||n[1]+"[]")+"="+(t.key&&t.expression?n[1]:n[2]))}),!r.length&&t.key&&r.push(t.key+"="),r.join("&")},toArray:function(t){var n=this._getItemsAsjQuery(t&&t.connected),r=[];return t=t||{},n.each(function(){r.push(e(t.item||this).attr(t.attribute||"id")||"")}),r},_intersectsWith:function(e){var t=this.positionAbs.left,n=t+this.helperProportions.width,r=this.positionAbs.top,i=r+this.helperProportions.height,s=e.left,o=s+e.width,u=e.top,a=u+e.height,f=this.offset.click.top,l=this.offset.click.left,c=r+f>u&&r+f<a&&t+l>s&&t+l<o;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?c:s<t+this.helperProportions.width/2&&n-this.helperProportions.width/2<o&&u<r+this.helperProportions.height/2&&i-this.helperProportions.height/2<a},_intersectsWithPointer:function(t){var n=this.options.axis==="x"||e.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),r=this.options.axis==="y"||e.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),i=n&&r,s=this._getDragVerticalDirection(),o=this._getDragHorizontalDirection();return i?this.floating?o&&o=="right"||s=="down"?2:1:s&&(s=="down"?2:1):!1},_intersectsWithSides:function(t){var n=e.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),r=e.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),i=this._getDragVerticalDirection(),s=this._getDragHorizontalDirection();return this.floating&&s?s=="right"&&r||s=="left"&&!r:i&&(i=="down"&&n||i=="up"&&!n)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return e!=0&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return e!=0&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor==String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){var n=[],r=[],i=this._connectWith();if(i&&t)for(var s=i.length-1;s>=0;s--){var o=e(i[s]);for(var u=o.length-1;u>=0;u--){var a=e.data(o[u],this.widgetName);a&&a!=this&&!a.options.disabled&&r.push([e.isFunction(a.options.items)?a.options.items.call(a.element):e(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a])}}r.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var s=r.length-1;s>=0;s--)r[s][0].each(function(){n.push(this)});return e(n)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var n=0;n<t.length;n++)if(t[n]==e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var n=this.items,r=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],i=this._connectWith();if(i&&this.ready)for(var s=i.length-1;s>=0;s--){var o=e(i[s]);for(var u=o.length-1;u>=0;u--){var a=e.data(o[u],this.widgetName);a&&a!=this&&!a.options.disabled&&(r.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a))}}for(var s=r.length-1;s>=0;s--){var f=r[s][1],l=r[s][0];for(var u=0,c=l.length;u<c;u++){var h=e(l[u]);h.data(this.widgetName+"-item",f),n.push({item:h,instance:f,width:0,height:0,left:0,top:0})}}},refreshPositions:function(t){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());for(var n=this.items.length-1;n>=0;n--){var r=this.items[n];if(r.instance!=this.currentContainer&&this.currentContainer&&r.item[0]!=this.currentItem[0])continue;var i=this.options.toleranceElement?e(this.options.toleranceElement,r.item):r.item;t||(r.width=i.outerWidth(),r.height=i.outerHeight());var s=i.offset();r.left=s.left,r.top=s.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var n=this.containers.length-1;n>=0;n--){var s=this.containers[n].element.offset();this.containers[n].containerCache.left=s.left,this.containers[n].containerCache.top=s.top,this.containers[n].containerCache.width=this.containers[n].element.outerWidth(),this.containers[n].containerCache.height=this.containers[n].element.outerHeight()}return this},_createPlaceholder:function(t){t=t||this;var n=t.options;if(!n.placeholder||n.placeholder.constructor==String){var r=n.placeholder;n.placeholder={element:function(){var n=e(document.createElement(t.currentItem[0].nodeName)).addClass(r||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return r||(n.style.visibility="hidden"),n},update:function(e,i){if(r&&!n.forcePlaceholderSize)return;i.height()||i.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),i.width()||i.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10))}}}t.placeholder=e(n.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),n.placeholder.update(t,t.placeholder)},_contactContainers:function(t){var n=null,r=null;for(var i=this.containers.length-1;i>=0;i--){if(e.contains(this.currentItem[0],this.containers[i].element[0]))continue;if(this._intersectsWith(this.containers[i].containerCache)){if(n&&e.contains(this.containers[i].element[0],n.element[0]))continue;n=this.containers[i],r=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0)}if(!n)return;if(this.containers.length===1)this.containers[r]._trigger("over",t,this._uiHash(this)),this.containers[r].containerCache.over=1;else{var s=1e4,o=null,u=this.containers[r].floating?"left":"top",a=this.containers[r].floating?"width":"height",f=this.positionAbs[u]+this.offset.click[u];for(var l=this.items.length-1;l>=0;l--){if(!e.contains(this.containers[r].element[0],this.items[l].item[0]))continue;if(this.items[l].item[0]==this.currentItem[0])continue;var c=this.items[l].item.offset()[u],h=!1;Math.abs(c-f)>Math.abs(c+this.items[l][a]-f)&&(h=!0,c+=this.items[l][a]),Math.abs(c-f)<s&&(s=Math.abs(c-f),o=this.items[l],this.direction=h?"up":"down")}if(!o&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[r],o?this._rearrange(t,o,null,!0):this._rearrange(t,null,this.containers[r].element,!0),this._trigger("change",t,this._uiHash()),this.containers[r]._trigger("change",t,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[r]._trigger("over",t,this._uiHash(this)),this.containers[r].containerCache.over=1}},_createHelper:function(t){var n=this.options,r=e.isFunction(n.helper)?e(n.helper.apply(this.element[0],[t,this.currentItem])):n.helper=="clone"?this.currentItem.clone():this.currentItem;return r.parents("body").length||e(n.appendTo!="parent"?n.appendTo:this.currentItem[0].parentNode)[0].appendChild(r[0]),r[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(r[0].style.width==""||n.forceHelperSize)&&r.width(this.currentItem.width()),(r[0].style.height==""||n.forceHelperSize)&&r.height(this.currentItem.height()),r},_adjustOffsetFromHelper:function(t){typeof t=="string"&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&e.ui.ie)t={top:0,left:0};return{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t=this.options;t.containment=="parent"&&(t.containment=this.helper[0].parentNode);if(t.containment=="document"||t.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,e(t.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(e(t.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(t.containment)){var n=e(t.containment)[0],r=e(t.containment).offset(),i=e(n).css("overflow")!="hidden";this.containment=[r.left+(parseInt(e(n).css("borderLeftWidth"),10)||0)+(parseInt(e(n).css("paddingLeft"),10)||0)-this.margins.left,r.top+(parseInt(e(n).css("borderTopWidth"),10)||0)+(parseInt(e(n).css("paddingTop"),10)||0)-this.margins.top,r.left+(i?Math.max(n.scrollWidth,n.offsetWidth):n.offsetWidth)-(parseInt(e(n).css("borderLeftWidth"),10)||0)-(parseInt(e(n).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,r.top+(i?Math.max(n.scrollHeight,n.offsetHeight):n.offsetHeight)-(parseInt(e(n).css("borderTopWidth"),10)||0)-(parseInt(e(n).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(t,n){n||(n=this.position);var r=t=="absolute"?1:-1,i=this.options,s=this.cssPosition!="absolute"||this.scrollParent[0]!=document&&!!e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(s[0].tagName);return{top:n.top+this.offset.relative.top*r+this.offset.parent.top*r-(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():o?0:s.scrollTop())*r,left:n.left+this.offset.relative.left*r+this.offset.parent.left*r-(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():o?0:s.scrollLeft())*r}},_generatePosition:function(t){var n=this.options,r=this.cssPosition!="absolute"||this.scrollParent[0]!=document&&!!e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,i=/(html|body)/i.test(r[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var s=t.pageX,o=t.pageY;if(this.originalPosition){this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(s=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(s=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top));if(n.grid){var u=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1];o=this.containment?u-this.offset.click.top<this.containment[1]||u-this.offset.click.top>this.containment[3]?u-this.offset.click.top<this.containment[1]?u+n.grid[1]:u-n.grid[1]:u:u;var a=this.originalPageX+Math.round((s-this.originalPageX)/n.grid[0])*n.grid[0];s=this.containment?a-this.offset.click.left<this.containment[0]||a-this.offset.click.left>this.containment[2]?a-this.offset.click.left<this.containment[0]?a+n.grid[0]:a-n.grid[0]:a:a}}return{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():i?0:r.scrollTop()),left:s-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:r.scrollLeft())}},_rearrange:function(e,t,n,r){n?n[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var i=this.counter;this._delay(function(){i==this.counter&&this.refreshPositions(!r)})},_clear:function(t,n){this.reverting=!1;var r=[];!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var i in this._storedCSS)if(this._storedCSS[i]=="auto"||this._storedCSS[i]=="static")this._storedCSS[i]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!n&&r.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),(this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!n&&r.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(n||(r.push(function(e){this._trigger("remove",e,this._uiHash())}),r.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),r.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer))));for(var i=this.containers.length-1;i>=0;i--)n||r.push(function(e){return function(t){e._trigger("deactivate",t,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over&&(r.push(function(e){return function(t){e._trigger("out",t,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over=0);this._storedCursor&&e("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!n){this._trigger("beforeStop",t,this._uiHash());for(var i=0;i<r.length;i++)r[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!1}n||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!=this.currentItem[0]&&this.helper.remove(),this.helper=null;if(!n){for(var i=0;i<r.length;i++)r[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var n=t||this;return{helper:n.helper,placeholder:n.placeholder||e([]),position:n.position,originalPosition:n.originalPosition,offset:n.positionAbs,item:n.currentItem,sender:t?t.element:null}}})})(jQuery);(function(e,t){var n=0,r={},i={};r.height=r.paddingTop=r.paddingBottom=r.borderTopWidth=r.borderBottomWidth="hide",i.height=i.paddingTop=i.paddingBottom=i.borderTopWidth=i.borderBottomWidth="show",e.widget("ui.accordion",{version:"1.9.2",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},_create:function(){var t=this.accordionId="ui-accordion-"+(this.element.attr("id")||++n),r=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset"),this.headers=this.element.find(r.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all"),this._hoverable(this.headers),this._focusable(this.headers),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").hide(),!r.collapsible&&(r.active===!1||r.active==null)&&(r.active=0),r.active<0&&(r.active+=this.headers.length),this.active=this._findActive(r.active).addClass("ui-accordion-header-active ui-state-active").toggleClass("ui-corner-all ui-corner-top"),this.active.next().addClass("ui-accordion-content-active").show(),this._createIcons(),this.refresh(),this.element.attr("role","tablist"),this.headers.attr("role","tab").each(function(n){var r=e(this),i=r.attr("id"),s=r.next(),o=s.attr("id");i||(i=t+"-header-"+n,r.attr("id",i)),o||(o=t+"-panel-"+n,s.attr("id",o)),r.attr("aria-controls",o),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false",tabIndex:-1}).next().attr({"aria-expanded":"false","aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true",tabIndex:0}).next().attr({"aria-expanded":"true","aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._on(this.headers,{keydown:"_keydown"}),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._setupEvents(r.event)},_getCreateEventData:function(){return{header:this.active,content:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this._destroyIcons(),e=this.headers.next().css("display","").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this.options.heightStyle!=="content"&&e.css("height","")},_setOption:function(e,t){if(e==="active"){this._activate(t);return}e==="event"&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),e==="collapsible"&&!t&&this.options.active===!1&&this._activate(0),e==="icons"&&(this._destroyIcons(),t&&this._createIcons()),e==="disabled"&&this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)},_keydown:function(t){if(t.altKey||t.ctrlKey)return;var n=e.ui.keyCode,r=this.headers.length,i=this.headers.index(t.target),s=!1;switch(t.keyCode){case n.RIGHT:case n.DOWN:s=this.headers[(i+1)%r];break;case n.LEFT:case n.UP:s=this.headers[(i-1+r)%r];break;case n.SPACE:case n.ENTER:this._eventHandler(t);break;case n.HOME:s=this.headers[0];break;case n.END:s=this.headers[r-1]}s&&(e(t.target).attr("tabIndex",-1),e(s).attr("tabIndex",0),s.focus(),t.preventDefault())},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t,n,r=this.options.heightStyle,i=this.element.parent();r==="fill"?(e.support.minHeight||(n=i.css("overflow"),i.css("overflow","hidden")),t=i.height(),this.element.siblings(":visible").each(function(){var n=e(this),r=n.css("position");if(r==="absolute"||r==="fixed")return;t-=n.outerHeight(!0)}),n&&i.css("overflow",n),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):r==="auto"&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var n=this._findActive(t)[0];if(n===this.active[0])return;n=n||this.active[0],this._eventHandler({target:n,currentTarget:n,preventDefault:e.noop})},_findActive:function(t){return typeof t=="number"?this.headers.eq(t):e()},_setupEvents:function(t){var n={};if(!t)return;e.each(t.split(" "),function(e,t){n[t]="_eventHandler"}),this._on(this.headers,n)},_eventHandler:function(t){var n=this.options,r=this.active,i=e(t.currentTarget),s=i[0]===r[0],o=s&&n.collapsible,u=o?e():i.next(),a=r.next(),f={oldHeader:r,oldPanel:a,newHeader:o?e():i,newPanel:u};t.preventDefault();if(s&&!n.collapsible||this._trigger("beforeActivate",t,f)===!1)return;n.active=o?!1:this.headers.index(i),this.active=s?e():i,this._toggle(f),r.removeClass("ui-accordion-header-active ui-state-active"),n.icons&&r.children(".ui-accordion-header-icon").removeClass(n.icons.activeHeader).addClass(n.icons.header),s||(i.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),n.icons&&i.children(".ui-accordion-header-icon").removeClass(n.icons.header).addClass(n.icons.activeHeader),i.next().addClass("ui-accordion-content-active"))},_toggle:function(t){var n=t.newPanel,r=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=n,this.prevHide=r,this.options.animate?this._animate(n,r,t):(r.hide(),n.show(),this._toggleComplete(t)),r.attr({"aria-expanded":"false","aria-hidden":"true"}),r.prev().attr("aria-selected","false"),n.length&&r.length?r.prev().attr("tabIndex",-1):n.length&&this.headers.filter(function(){return e(this).attr("tabIndex")===0}).attr("tabIndex",-1),n.attr({"aria-expanded":"true","aria-hidden":"false"}).prev().attr({"aria-selected":"true",tabIndex:0})},_animate:function(e,t,n){var s,o,u,a=this,f=0,l=e.length&&(!t.length||e.index()<t.index()),c=this.options.animate||{},h=l&&c.down||c,p=function(){a._toggleComplete(n)};typeof h=="number"&&(u=h),typeof h=="string"&&(o=h),o=o||h.easing||c.easing,u=u||h.duration||c.duration;if(!t.length)return e.animate(i,u,o,p);if(!e.length)return t.animate(r,u,o,p);s=e.show().outerHeight(),t.animate(r,{duration:u,easing:o,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(i,{duration:u,easing:o,complete:p,step:function(e,n){n.now=Math.round(e),n.prop!=="height"?f+=n.now:a.options.heightStyle!=="content"&&(n.now=Math.round(s-t.outerHeight()-f),f=0)}})},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.uiBackCompat!==!1&&(function(e,t){e.extend(t.options,{navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}});var n=t._create;t._create=function(){if(this.options.navigation){var t=this,r=this.element.find(this.options.header),i=r.next(),s=r.add(i).find("a").filter(this.options.navigationFilter)[0];s&&r.add(i).each(function(n){if(e.contains(this,s))return t.options.active=Math.floor(n/2),!1})}n.call(this)}}(jQuery,jQuery.ui.accordion.prototype),function(e,t){e.extend(t.options,{heightStyle:null,autoHeight:!0,clearStyle:!1,fillSpace:!1});var n=t._create,r=t._setOption;e.extend(t,{_create:function(){this.options.heightStyle=this.options.heightStyle||this._mergeHeightStyle(),n.call(this)},_setOption:function(e){if(e==="autoHeight"||e==="clearStyle"||e==="fillSpace")this.options.heightStyle=this._mergeHeightStyle();r.apply(this,arguments)},_mergeHeightStyle:function(){var e=this.options;if(e.fillSpace)return"fill";if(e.clearStyle)return"content";if(e.autoHeight)return"auto"}})}(jQuery,jQuery.ui.accordion.prototype),function(e,t){e.extend(t.options.icons,{activeHeader:null,headerSelected:"ui-icon-triangle-1-s"});var n=t._createIcons;t._createIcons=function(){this.options.icons&&(this.options.icons.activeHeader=this.options.icons.activeHeader||this.options.icons.headerSelected),n.call(this)}}(jQuery,jQuery.ui.accordion.prototype),function(e,t){t.activate=t._activate;var n=t._findActive;t._findActive=function(e){return e===-1&&(e=!1),e&&typeof e!="number"&&(e=this.headers.index(this.headers.filter(e)),e===-1&&(e=!1)),n.call(this,e)}}(jQuery,jQuery.ui.accordion.prototype),jQuery.ui.accordion.prototype.resize=jQuery.ui.accordion.prototype.refresh,function(e,t){e.extend(t.options,{change:null,changestart:null});var n=t._trigger;t._trigger=function(e,t,r){var i=n.apply(this,arguments);return i?(e==="beforeActivate"?i=n.call(this,"changestart",t,{oldHeader:r.oldHeader,oldContent:r.oldPanel,newHeader:r.newHeader,newContent:r.newPanel}):e==="activate"&&(i=n.call(this,"change",t,{oldHeader:r.oldHeader,oldContent:r.oldPanel,newHeader:r.newHeader,newContent:r.newPanel})),i):!1}}(jQuery,jQuery.ui.accordion.prototype),function(e,t){e.extend(t.options,{animate:null,animated:"slide"});var n=t._create;t._create=function(){var e=this.options;e.animate===null&&(e.animated?e.animated==="slide"?e.animate=300:e.animated==="bounceslide"?e.animate={duration:200,down:{easing:"easeOutBounce",duration:1e3}}:e.animate=e.animated:e.animate=!1),n.call(this)}}(jQuery,jQuery.ui.accordion.prototype))})(jQuery);(function(e,t){var n=0;e.widget("ui.autocomplete",{version:"1.9.2",defaultElement:"<input>",options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var t,n,r;this.isMultiLine=this._isMultiLine(),this.valueMethod=this.element[this.element.is("input,textarea")?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(i){if(this.element.prop("readOnly")){t=!0,r=!0,n=!0;return}t=!1,r=!1,n=!1;var s=e.ui.keyCode;switch(i.keyCode){case s.PAGE_UP:t=!0,this._move("previousPage",i);break;case s.PAGE_DOWN:t=!0,this._move("nextPage",i);break;case s.UP:t=!0,this._keyEvent("previous",i);break;case s.DOWN:t=!0,this._keyEvent("next",i);break;case s.ENTER:case s.NUMPAD_ENTER:this.menu.active&&(t=!0,i.preventDefault(),this.menu.select(i));break;case s.TAB:this.menu.active&&this.menu.select(i);break;case s.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(i),i.preventDefault());break;default:n=!0,this._searchTimeout(i)}},keypress:function(r){if(t){t=!1,r.preventDefault();return}if(n)return;var i=e.ui.keyCode;switch(r.keyCode){case i.PAGE_UP:this._move("previousPage",r);break;case i.PAGE_DOWN:this._move("nextPage",r);break;case i.UP:this._keyEvent("previous",r);break;case i.DOWN:this._keyEvent("next",r)}},input:function(e){if(r){r=!1,e.preventDefault();return}this._searchTimeout(e)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){if(this.cancelBlur){delete this.cancelBlur;return}clearTimeout(this.searching),this.close(e),this._change(e)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete").appendTo(this.document.find(this.options.appendTo||"body")[0]).menu({input:e(),role:null}).zIndex(this.element.zIndex()+1).hide().data("menu"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var n=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(r){r.target!==t.element[0]&&r.target!==n&&!e.contains(n,r.target)&&t.close()})})},menufocus:function(t,n){if(this.isNewMenu){this.isNewMenu=!1;if(t.originalEvent&&/^mouse/.test(t.originalEvent.type)){this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)});return}}var r=n.item.data("ui-autocomplete-item")||n.item.data("item.autocomplete");!1!==this._trigger("focus",t,{item:r})?t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(r.value):this.liveRegion.text(r.value)},menuselect:function(e,t){var n=t.item.data("ui-autocomplete-item")||t.item.data("item.autocomplete"),r=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=r,this._delay(function(){this.previous=r,this.selectedItem=n})),!1!==this._trigger("select",e,{item:n})&&this._value(n.value),this.term=this._value(),this.close(e),this.selectedItem=n}}),this.liveRegion=e("<span>",{role:"status","aria-live":"polite"}).addClass("ui-helper-hidden-accessible").insertAfter(this.element),e.fn.bgiframe&&this.menu.element.bgiframe(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),e==="source"&&this._initSource(),e==="appendTo"&&this.menu.element.appendTo(this.document.find(t||"body")[0]),e==="disabled"&&t&&this.xhr&&this.xhr.abort()},_isMultiLine:function(){return this.element.is("textarea")?!0:this.element.is("input")?!1:this.element.prop("isContentEditable")},_initSource:function(){var t,n,r=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(n,r){r(e.ui.autocomplete.filter(t,n.term))}):typeof this.options.source=="string"?(n=this.options.source,this.source=function(t,i){r.xhr&&r.xhr.abort(),r.xhr=e.ajax({url:n,data:t,dataType:"json",success:function(e){i(e)},error:function(){i([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){e=e!=null?e:this._value(),this.term=this._value();if(e.length<this.options.minLength)return this.close(t);if(this._trigger("search",t)===!1)return;return this._search(e)},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var e=this,t=++n;return function(r){t===n&&e.__response(r),e.pending--,e.pending||e.element.removeClass("ui-autocomplete-loading")}},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return typeof t=="string"?{label:t,value:t}:e.extend({label:t.label||t.value,value:t.value||t.label},t)})},_suggest:function(t){var n=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(n,t),this.menu.refresh(),n.show(),this._resizeMenu(),n.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,n){var r=this;e.each(n,function(e,n){r._renderItemData(t,n)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,n){return e("<li>").append(e("<a>").text(n.label)).appendTo(t)},_move:function(e,t){if(!this.menu.element.is(":visible")){this.search(null,t);return}if(this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)){this._value(this.term),this.menu.blur();return}this.menu[e](t)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){if(!this.isMultiLine||this.menu.element.is(":visible"))this._move(e,t),t.preventDefault()}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,n){var r=new RegExp(e.ui.autocomplete.escapeRegex(n),"i");return e.grep(t,function(e){return r.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var t;this._superApply(arguments);if(this.options.disabled||this.cancelSearch)return;e&&e.length?t=this.options.messages.results(e.length):t=this.options.messages.noResults,this.liveRegion.text(t)}})})(jQuery);(function(e,t){var n,r,i,s,o="ui-button ui-widget ui-state-default ui-corner-all",u="ui-state-hover ui-state-active ",a="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",f=function(){var t=e(this).find(":ui-button");setTimeout(function(){t.button("refresh")},1)},l=function(t){var n=t.name,r=t.form,i=e([]);return n&&(r?i=e(r).find("[name='"+n+"']"):i=e("[name='"+n+"']",t.ownerDocument).filter(function(){return!this.form})),i};e.widget("ui.button",{version:"1.9.2",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,f),typeof this.options.disabled!="boolean"?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,u=this.options,a=this.type==="checkbox"||this.type==="radio",c=a?"":"ui-state-active",h="ui-state-focus";u.label===null&&(u.label=this.type==="input"?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(o).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){if(u.disabled)return;this===n&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){if(u.disabled)return;e(this).removeClass(c)}).bind("click"+this.eventNamespace,function(e){u.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this.element.bind("focus"+this.eventNamespace,function(){t.buttonElement.addClass(h)}).bind("blur"+this.eventNamespace,function(){t.buttonElement.removeClass(h)}),a&&(this.element.bind("change"+this.eventNamespace,function(){if(s)return;t.refresh()}),this.buttonElement.bind("mousedown"+this.eventNamespace,function(e){if(u.disabled)return;s=!1,r=e.pageX,i=e.pageY}).bind("mouseup"+this.eventNamespace,function(e){if(u.disabled)return;if(r!==e.pageX||i!==e.pageY)s=!0})),this.type==="checkbox"?this.buttonElement.bind("click"+this.eventNamespace,function(){if(u.disabled||s)return!1;e(this).toggleClass("ui-state-active"),t.buttonElement.attr("aria-pressed",t.element[0].checked)}):this.type==="radio"?this.buttonElement.bind("click"+this.eventNamespace,function(){if(u.disabled||s)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var n=t.element[0];l(n).not(n).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){if(u.disabled)return!1;e(this).addClass("ui-state-active"),n=this,t.document.one("mouseup",function(){n=null})}).bind("mouseup"+this.eventNamespace,function(){if(u.disabled)return!1;e(this).removeClass("ui-state-active")}).bind("keydown"+this.eventNamespace,function(t){if(u.disabled)return!1;(t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active")}).bind("keyup"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",u.disabled),this._resetButton()},_determineButtonType:function(){var e,t,n;this.element.is("[type=checkbox]")?this.type="checkbox":this.element.is("[type=radio]")?this.type="radio":this.element.is("input")?this.type="input":this.type="button",this.type==="checkbox"||this.type==="radio"?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),n=this.element.is(":checked"),n&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",n)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(o+" "+u+" "+a).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){this._super(e,t);if(e==="disabled"){t?this.element.prop("disabled",!0):this.element.prop("disabled",!1);return}this._resetButton()},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),this.type==="radio"?l(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):this.type==="checkbox"&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if(this.type==="input"){this.options.label&&this.element.val(this.options.label);return}var t=this.buttonElement.removeClass(a),n=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),r=this.options.icons,i=r.primary&&r.secondary,s=[];r.primary||r.secondary?(this.options.text&&s.push("ui-button-text-icon"+(i?"s":r.primary?"-primary":"-secondary")),r.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+r.primary+"'></span>"),r.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+r.secondary+"'></span>"),this.options.text||(s.push(i?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(n)))):s.push("ui-button-text-only"),t.addClass(s.join(" "))}}),e.widget("ui.buttonset",{version:"1.9.2",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){e==="disabled"&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}})})(jQuery);(function($,undefined){function Datepicker(){this.debug=!1,this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},$.extend(this._defaults,this.regional[""]),this.dpDiv=bindHover($('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}function bindHover(e){var t="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.delegate(t,"mouseout",function(){$(this).removeClass("ui-state-hover"),this.className.indexOf("ui-datepicker-prev")!=-1&&$(this).removeClass("ui-datepicker-prev-hover"),this.className.indexOf("ui-datepicker-next")!=-1&&$(this).removeClass("ui-datepicker-next-hover")}).delegate(t,"mouseover",function(){$.datepicker._isDisabledDatepicker(instActive.inline?e.parent()[0]:instActive.input[0])||($(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),$(this).addClass("ui-state-hover"),this.className.indexOf("ui-datepicker-prev")!=-1&&$(this).addClass("ui-datepicker-prev-hover"),this.className.indexOf("ui-datepicker-next")!=-1&&$(this).addClass("ui-datepicker-next-hover"))})}function extendRemove(e,t){$.extend(e,t);for(var n in t)if(t[n]==null||t[n]==undefined)e[n]=t[n];return e}$.extend($.ui,{datepicker:{version:"1.9.2"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return extendRemove(this._defaults,e||{}),this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(e,t){var n=e[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:n,input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:t,dpDiv:t?bindHover($('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')):this.dpDiv}},_connectDatepicker:function(e,t){var n=$(e);t.append=$([]),t.trigger=$([]);if(n.hasClass(this.markerClassName))return;this._attachments(n,t),n.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,n,r){t.settings[n]=r}).bind("getData.datepicker",function(e,n){return this._get(t,n)}),this._autoSize(t),$.data(e,PROP_NAME,t),t.settings.disabled&&this._disableDatepicker(e)},_attachments:function(e,t){var n=this._get(t,"appendText"),r=this._get(t,"isRTL");t.append&&t.append.remove(),n&&(t.append=$('<span class="'+this._appendClass+'">'+n+"</span>"),e[r?"before":"after"](t.append)),e.unbind("focus",this._showDatepicker),t.trigger&&t.trigger.remove();var i=this._get(t,"showOn");(i=="focus"||i=="both")&&e.focus(this._showDatepicker);if(i=="button"||i=="both"){var s=this._get(t,"buttonText"),o=this._get(t,"buttonImage");t.trigger=$(this._get(t,"buttonImageOnly")?$("<img/>").addClass(this._triggerClass).attr({src:o,alt:s,title:s}):$('<button type="button"></button>').addClass(this._triggerClass).html(o==""?s:$("<img/>").attr({src:o,alt:s,title:s}))),e[r?"before":"after"](t.trigger),t.trigger.click(function(){return $.datepicker._datepickerShowing&&$.datepicker._lastInput==e[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=e[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(e[0])):$.datepicker._showDatepicker(e[0]),!1})}},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t=new Date(2009,11,20),n=this._get(e,"dateFormat");if(n.match(/[DM]/)){var r=function(e){var t=0,n=0;for(var r=0;r<e.length;r++)e[r].length>t&&(t=e[r].length,n=r);return n};t.setMonth(r(this._get(e,n.match(/MM/)?"monthNames":"monthNamesShort"))),t.setDate(r(this._get(e,n.match(/DD/)?"dayNames":"dayNamesShort"))+20-t.getDay())}e.input.attr("size",this._formatDate(e,t).length)}},_inlineDatepicker:function(e,t){var n=$(e);if(n.hasClass(this.markerClassName))return;n.addClass(this.markerClassName).append(t.dpDiv).bind("setData.datepicker",function(e,n,r){t.settings[n]=r}).bind("getData.datepicker",function(e,n){return this._get(t,n)}),$.data(e,PROP_NAME,t),this._setDate(t,this._getDefaultDate(t),!0),this._updateDatepicker(t),this._updateAlternate(t),t.settings.disabled&&this._disableDatepicker(e),t.dpDiv.css("display","block")},_dialogDatepicker:function(e,t,n,r,i){var s=this._dialogInst;if(!s){this.uuid+=1;var o="dp"+this.uuid;this._dialogInput=$('<input type="text" id="'+o+'" style="position: absolute; top: -100px; width: 0px;"/>'),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),s=this._dialogInst=this._newInst(this._dialogInput,!1),s.settings={},$.data(this._dialogInput[0],PROP_NAME,s)}extendRemove(s.settings,r||{}),t=t&&t.constructor==Date?this._formatDate(s,t):t,this._dialogInput.val(t),this._pos=i?i.length?i:[i.pageX,i.pageY]:null;if(!this._pos){var u=document.documentElement.clientWidth,a=document.documentElement.clientHeight,f=document.documentElement.scrollLeft||document.body.scrollLeft,l=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[u/2-100+f,a/2-150+l]}return this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),s.settings.onSelect=n,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,s),this},_destroyDatepicker:function(e){var t=$(e),n=$.data(e,PROP_NAME);if(!t.hasClass(this.markerClassName))return;var r=e.nodeName.toLowerCase();$.removeData(e,PROP_NAME),r=="input"?(n.append.remove(),n.trigger.remove(),t.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(r=="div"||r=="span")&&t.removeClass(this.markerClassName).empty()},_enableDatepicker:function(e){var t=$(e),n=$.data(e,PROP_NAME);if(!t.hasClass(this.markerClassName))return;var r=e.nodeName.toLowerCase();if(r=="input")e.disabled=!1,n.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(r=="div"||r=="span"){var i=t.children("."+this._inlineClass);i.children().removeClass("ui-state-disabled"),i.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)}this._disabledInputs=$.map(this._disabledInputs,function(t){return t==e?null:t})},_disableDatepicker:function(e){var t=$(e),n=$.data(e,PROP_NAME);if(!t.hasClass(this.markerClassName))return;var r=e.nodeName.toLowerCase();if(r=="input")e.disabled=!0,n.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(r=="div"||r=="span"){var i=t.children("."+this._inlineClass);i.children().addClass("ui-state-disabled"),i.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)}this._disabledInputs=$.map(this._disabledInputs,function(t){return t==e?null:t}),this._disabledInputs[this._disabledInputs.length]=e},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;t<this._disabledInputs.length;t++)if(this._disabledInputs[t]==e)return!0;return!1},_getInst:function(e){try{return $.data(e,PROP_NAME)}catch(t){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(e,t,n){var r=this._getInst(e);if(arguments.length==2&&typeof t=="string")return t=="defaults"?$.extend({},$.datepicker._defaults):r?t=="all"?$.extend({},r.settings):this._get(r,t):null;var i=t||{};typeof t=="string"&&(i={},i[t]=n);if(r){this._curInst==r&&this._hideDatepicker();var s=this._getDateDatepicker(e,!0),o=this._getMinMaxDate(r,"min"),u=this._getMinMaxDate(r,"max");extendRemove(r.settings,i),o!==null&&i.dateFormat!==undefined&&i.minDate===undefined&&(r.settings.minDate=this._formatDate(r,o)),u!==null&&i.dateFormat!==undefined&&i.maxDate===undefined&&(r.settings.maxDate=this._formatDate(r,u)),this._attachments($(e),r),this._autoSize(r),this._setDate(r,s),this._updateAlternate(r),this._updateDatepicker(r)}},_changeDatepicker:function(e,t,n){this._optionDatepicker(e,t,n)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var n=this._getInst(e);n&&(this._setDate(n,t),this._updateDatepicker(n),this._updateAlternate(n))},_getDateDatepicker:function(e,t){var n=this._getInst(e);return n&&!n.inline&&this._setDateFromField(n,t),n?this._getDate(n):null},_doKeyDown:function(e){var t=$.datepicker._getInst(e.target),n=!0,r=t.dpDiv.is(".ui-datepicker-rtl");t._keyEvent=!0;if($.datepicker._datepickerShowing)switch(e.keyCode){case 9:$.datepicker._hideDatepicker(),n=!1;break;case 13:var i=$("td."+$.datepicker._dayOverClass+":not(."+$.datepicker._currentClass+")",t.dpDiv);i[0]&&$.datepicker._selectDay(e.target,t.selectedMonth,t.selectedYear,i[0]);var s=$.datepicker._get(t,"onSelect");if(s){var o=$.datepicker._formatDate(t);s.apply(t.input?t.input[0]:null,[o,t])}else $.datepicker._hideDatepicker();return!1;case 27:$.datepicker._hideDatepicker();break;case 33:$.datepicker._adjustDate(e.target,e.ctrlKey?-$.datepicker._get(t,"stepBigMonths"):-$.datepicker._get(t,"stepMonths"),"M");break;case 34:$.datepicker._adjustDate(e.target,e.ctrlKey?+$.datepicker._get(t,"stepBigMonths"):+$.datepicker._get(t,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&$.datepicker._clearDate(e.target),n=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&$.datepicker._gotoToday(e.target),n=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&$.datepicker._adjustDate(e.target,r?1:-1,"D"),n=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&$.datepicker._adjustDate(e.target,e.ctrlKey?-$.datepicker._get(t,"stepBigMonths"):-$.datepicker._get(t,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&$.datepicker._adjustDate(e.target,-7,"D"),n=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&$.datepicker._adjustDate(e.target,r?-1:1,"D"),n=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&$.datepicker._adjustDate(e.target,e.ctrlKey?+$.datepicker._get(t,"stepBigMonths"):+$.datepicker._get(t,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&$.datepicker._adjustDate(e.target,7,"D"),n=e.ctrlKey||e.metaKey;break;default:n=!1}else e.keyCode==36&&e.ctrlKey?$.datepicker._showDatepicker(this):n=!1;n&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(e){var t=$.datepicker._getInst(e.target);if($.datepicker._get(t,"constrainInput")){var n=$.datepicker._possibleChars($.datepicker._get(t,"dateFormat")),r=String.fromCharCode(e.charCode==undefined?e.keyCode:e.charCode);return e.ctrlKey||e.metaKey||r<" "||!n||n.indexOf(r)>-1}},_doKeyUp:function(e){var t=$.datepicker._getInst(e.target);if(t.input.val()!=t.lastVal)try{var n=$.datepicker.parseDate($.datepicker._get(t,"dateFormat"),t.input?t.input.val():null,$.datepicker._getFormatConfig(t));n&&($.datepicker._setDateFromField(t),$.datepicker._updateAlternate(t),$.datepicker._updateDatepicker(t))}catch(r){$.datepicker.log(r)}return!0},_showDatepicker:function(e){e=e.target||e,e.nodeName.toLowerCase()!="input"&&(e=$("input",e.parentNode)[0]);if($.datepicker._isDisabledDatepicker(e)||$.datepicker._lastInput==e)return;var t=$.datepicker._getInst(e);$.datepicker._curInst&&$.datepicker._curInst!=t&&($.datepicker._curInst.dpDiv.stop(!0,!0),t&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var n=$.datepicker._get(t,"beforeShow"),r=n?n.apply(e,[e,t]):{};if(r===!1)return;extendRemove(t.settings,r),t.lastVal=null,$.datepicker._lastInput=e,$.datepicker._setDateFromField(t),$.datepicker._inDialog&&(e.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(e),$.datepicker._pos[1]+=e.offsetHeight);var i=!1;$(e).parents().each(function(){return i|=$(this).css("position")=="fixed",!i});var s={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,t.dpDiv.empty(),t.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(t),s=$.datepicker._checkOffset(t,s,i),t.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":i?"fixed":"absolute",display:"none",left:s.left+"px",top:s.top+"px"});if(!t.inline){var o=$.datepicker._get(t,"showAnim"),u=$.datepicker._get(t,"duration"),a=function(){var e=t.dpDiv.find("iframe.ui-datepicker-cover");if(!!e.length){var n=$.datepicker._getBorders(t.dpDiv);e.css({left:-n[0],top:-n[1],width:t.dpDiv.outerWidth(),height:t.dpDiv.outerHeight()})}};t.dpDiv.zIndex($(e).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&($.effects.effect[o]||$.effects[o])?t.dpDiv.show(o,$.datepicker._get(t,"showOptions"),u,a):t.dpDiv[o||"show"](o?u:null,a),(!o||!u)&&a(),t.input.is(":visible")&&!t.input.is(":disabled")&&t.input.focus(),$.datepicker._curInst=t}},_updateDatepicker:function(e){this.maxRows=4;var t=$.datepicker._getBorders(e.dpDiv);instActive=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e);var n=e.dpDiv.find("iframe.ui-datepicker-cover");!n.length||n.css({left:-t[0],top:-t[1],width:e.dpDiv.outerWidth(),height:e.dpDiv.outerHeight()}),e.dpDiv.find("."+this._dayOverClass+" a").mouseover();var r=this._getNumberOfMonths(e),i=r[1],s=17;e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),i>1&&e.dpDiv.addClass("ui-datepicker-multi-"+i).css("width",s*i+"em"),e.dpDiv[(r[0]!=1||r[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e==$.datepicker._curInst&&$.datepicker._datepickerShowing&&e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&e.input[0]!=document.activeElement&&e.input.focus();if(e.yearshtml){var o=e.yearshtml;setTimeout(function(){o===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),o=e.yearshtml=null},0)}},_getBorders:function(e){var t=function(e){return{thin:1,medium:2,thick:3}[e]||e};return[parseFloat(t(e.css("border-left-width"))),parseFloat(t(e.css("border-top-width")))]},_checkOffset:function(e,t,n){var r=e.dpDiv.outerWidth(),i=e.dpDiv.outerHeight(),s=e.input?e.input.outerWidth():0,o=e.input?e.input.outerHeight():0,u=document.documentElement.clientWidth+(n?0:$(document).scrollLeft()),a=document.documentElement.clientHeight+(n?0:$(document).scrollTop());return t.left-=this._get(e,"isRTL")?r-s:0,t.left-=n&&t.left==e.input.offset().left?$(document).scrollLeft():0,t.top-=n&&t.top==e.input.offset().top+o?$(document).scrollTop():0,t.left-=Math.min(t.left,t.left+r>u&&u>r?Math.abs(t.left+r-u):0),t.top-=Math.min(t.top,t.top+i>a&&a>i?Math.abs(i+o):0),t},_findPos:function(e){var t=this._getInst(e),n=this._get(t,"isRTL");while(e&&(e.type=="hidden"||e.nodeType!=1||$.expr.filters.hidden(e)))e=e[n?"previousSibling":"nextSibling"];var r=$(e).offset();return[r.left,r.top]},_hideDatepicker:function(e){var t=this._curInst;if(!t||e&&t!=$.data(e,PROP_NAME))return;if(this._datepickerShowing){var n=this._get(t,"showAnim"),r=this._get(t,"duration"),i=function(){$.datepicker._tidyDialog(t)};$.effects&&($.effects.effect[n]||$.effects[n])?t.dpDiv.hide(n,$.datepicker._get(t,"showOptions"),r,i):t.dpDiv[n=="slideDown"?"slideUp":n=="fadeIn"?"fadeOut":"hide"](n?r:null,i),n||i(),this._datepickerShowing=!1;var s=this._get(t,"onClose");s&&s.apply(t.input?t.input[0]:null,[t.input?t.input.val():"",t]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(!$.datepicker._curInst)return;var t=$(e.target),n=$.datepicker._getInst(t[0]);(t[0].id!=$.datepicker._mainDivId&&t.parents("#"+$.datepicker._mainDivId).length==0&&!t.hasClass($.datepicker.markerClassName)&&!t.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||t.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=n)&&$.datepicker._hideDatepicker()},_adjustDate:function(e,t,n){var r=$(e),i=this._getInst(r[0]);if(this._isDisabledDatepicker(r[0]))return;this._adjustInstDate(i,t+(n=="M"?this._get(i,"showCurrentAtPos"):0),n),this._updateDatepicker(i)},_gotoToday:function(e){var t=$(e),n=this._getInst(t[0]);if(this._get(n,"gotoCurrent")&&n.currentDay)n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear;else{var r=new Date;n.selectedDay=r.getDate(),n.drawMonth=n.selectedMonth=r.getMonth(),n.drawYear=n.selectedYear=r.getFullYear()}this._notifyChange(n),this._adjustDate(t)},_selectMonthYear:function(e,t,n){var r=$(e),i=this._getInst(r[0]);i["selected"+(n=="M"?"Month":"Year")]=i["draw"+(n=="M"?"Month":"Year")]=parseInt(t.options[t.selectedIndex].value,10),this._notifyChange(i),this._adjustDate(r)},_selectDay:function(e,t,n,r){var i=$(e);if($(r).hasClass(this._unselectableClass)||this._isDisabledDatepicker(i[0]))return;var s=this._getInst(i[0]);s.selectedDay=s.currentDay=$("a",r).html(),s.selectedMonth=s.currentMonth=t,s.selectedYear=s.currentYear=n,this._selectDate(e,this._formatDate(s,s.currentDay,s.currentMonth,s.currentYear))},_clearDate:function(e){var t=$(e),n=this._getInst(t[0]);this._selectDate(t,"")},_selectDate:function(e,t){var n=$(e),r=this._getInst(n[0]);t=t!=null?t:this._formatDate(r),r.input&&r.input.val(t),this._updateAlternate(r);var i=this._get(r,"onSelect");i?i.apply(r.input?r.input[0]:null,[t,r]):r.input&&r.input.trigger("change"),r.inline?this._updateDatepicker(r):(this._hideDatepicker(),this._lastInput=r.input[0],typeof r.input[0]!="object"&&r.input.focus(),this._lastInput=null)},_updateAlternate:function(e){var t=this._get(e,"altField");if(t){var n=this._get(e,"altFormat")||this._get(e,"dateFormat"),r=this._getDate(e),i=this.formatDate(n,r,this._getFormatConfig(e));$(t).each(function(){$(this).val(i)})}},noWeekends:function(e){var t=e.getDay();return[t>0&&t<6,""]},iso8601Week:function(e){var t=new Date(e.getTime());t.setDate(t.getDate()+4-(t.getDay()||7));var n=t.getTime();return t.setMonth(0),t.setDate(1),Math.floor(Math.round((n-t)/864e5)/7)+1},parseDate:function(e,t,n){if(e==null||t==null)throw"Invalid arguments";t=typeof t=="object"?t.toString():t+"";if(t=="")return null;var r=(n?n.shortYearCutoff:null)||this._defaults.shortYearCutoff;r=typeof r!="string"?r:(new Date).getFullYear()%100+parseInt(r,10);var i=(n?n.dayNamesShort:null)||this._defaults.dayNamesShort,s=(n?n.dayNames:null)||this._defaults.dayNames,o=(n?n.monthNamesShort:null)||this._defaults.monthNamesShort,u=(n?n.monthNames:null)||this._defaults.monthNames,a=-1,f=-1,l=-1,c=-1,h=!1,p=function(t){var n=y+1<e.length&&e.charAt(y+1)==t;return n&&y++,n},d=function(e){var n=p(e),r=e=="@"?14:e=="!"?20:e=="y"&&n?4:e=="o"?3:2,i=new RegExp("^\\d{1,"+r+"}"),s=t.substring(g).match(i);if(!s)throw"Missing number at position "+g;return g+=s[0].length,parseInt(s[0],10)},v=function(e,n,r){var i=$.map(p(e)?r:n,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)}),s=-1;$.each(i,function(e,n){var r=n[1];if(t.substr(g,r.length).toLowerCase()==r.toLowerCase())return s=n[0],g+=r.length,!1});if(s!=-1)return s+1;throw"Unknown name at position "+g},m=function(){if(t.charAt(g)!=e.charAt(y))throw"Unexpected literal at position "+g;g++},g=0;for(var y=0;y<e.length;y++)if(h)e.charAt(y)=="'"&&!p("'")?h=!1:m();else switch(e.charAt(y)){case"d":l=d("d");break;case"D":v("D",i,s);break;case"o":c=d("o");break;case"m":f=d("m");break;case"M":f=v("M",o,u);break;case"y":a=d("y");break;case"@":var b=new Date(d("@"));a=b.getFullYear(),f=b.getMonth()+1,l=b.getDate();break;case"!":var b=new Date((d("!")-this._ticksTo1970)/1e4);a=b.getFullYear(),f=b.getMonth()+1,l=b.getDate();break;case"'":p("'")?m():h=!0;break;default:m()}if(g<t.length){var w=t.substr(g);if(!/^\s+/.test(w))throw"Extra/unparsed characters found in date: "+w}a==-1?a=(new Date).getFullYear():a<100&&(a+=(new Date).getFullYear()-(new Date).getFullYear()%100+(a<=r?0:-100));if(c>-1){f=1,l=c;do{var E=this._getDaysInMonth(a,f-1);if(l<=E)break;f++,l-=E}while(!0)}var b=this._daylightSavingAdjust(new Date(a,f-1,l));if(b.getFullYear()!=a||b.getMonth()+1!=f||b.getDate()!=l)throw"Invalid date";return b},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(e,t,n){if(!t)return"";var r=(n?n.dayNamesShort:null)||this._defaults.dayNamesShort,i=(n?n.dayNames:null)||this._defaults.dayNames,s=(n?n.monthNamesShort:null)||this._defaults.monthNamesShort,o=(n?n.monthNames:null)||this._defaults.monthNames,u=function(t){var n=h+1<e.length&&e.charAt(h+1)==t;return n&&h++,n},a=function(e,t,n){var r=""+t;if(u(e))while(r.length<n)r="0"+r;return r},f=function(e,t,n,r){return u(e)?r[t]:n[t]},l="",c=!1;if(t)for(var h=0;h<e.length;h++)if(c)e.charAt(h)=="'"&&!u("'")?c=!1:l+=e.charAt(h);else switch(e.charAt(h)){case"d":l+=a("d",t.getDate(),2);break;case"D":l+=f("D",t.getDay(),r,i);break;case"o":l+=a("o",Math.round(((new Date(t.getFullYear(),t.getMonth(),t.getDate())).getTime()-(new Date(t.getFullYear(),0,0)).getTime())/864e5),3);break;case"m":l+=a("m",t.getMonth()+1,2);break;case"M":l+=f("M",t.getMonth(),s,o);break;case"y":l+=u("y")?t.getFullYear():(t.getYear()%100<10?"0":"")+t.getYear()%100;break;case"@":l+=t.getTime();break;case"!":l+=t.getTime()*1e4+this._ticksTo1970;break;case"'":u("'")?l+="'":c=!0;break;default:l+=e.charAt(h)}return l},_possibleChars:function(e){var t="",n=!1,r=function(t){var n=i+1<e.length&&e.charAt(i+1)==t;return n&&i++,n};for(var i=0;i<e.length;i++)if(n)e.charAt(i)=="'"&&!r("'")?n=!1:t+=e.charAt(i);else switch(e.charAt(i)){case"d":case"m":case"y":case"@":t+="0123456789";break;case"D":case"M":return null;case"'":r("'")?t+="'":n=!0;break;default:t+=e.charAt(i)}return t},_get:function(e,t){return e.settings[t]!==undefined?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()==e.lastVal)return;var n=this._get(e,"dateFormat"),r=e.lastVal=e.input?e.input.val():null,i,s;i=s=this._getDefaultDate(e);var o=this._getFormatConfig(e);try{i=this.parseDate(n,r,o)||s}catch(u){this.log(u),r=t?"":r}e.selectedDay=i.getDate(),e.drawMonth=e.selectedMonth=i.getMonth(),e.drawYear=e.selectedYear=i.getFullYear(),e.currentDay=r?i.getDate():0,e.currentMonth=r?i.getMonth():0,e.currentYear=r?i.getFullYear():0,this._adjustInstDate(e)},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(e,t,n){var r=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},i=function(t){try{return $.datepicker.parseDate($.datepicker._get(e,"dateFormat"),t,$.datepicker._getFormatConfig(e))}catch(n){}var r=(t.toLowerCase().match(/^c/)?$.datepicker._getDate(e):null)||new Date,i=r.getFullYear(),s=r.getMonth(),o=r.getDate(),u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,a=u.exec(t);while(a){switch(a[2]||"d"){case"d":case"D":o+=parseInt(a[1],10);break;case"w":case"W":o+=parseInt(a[1],10)*7;break;case"m":case"M":s+=parseInt(a[1],10),o=Math.min(o,$.datepicker._getDaysInMonth(i,s));break;case"y":case"Y":i+=parseInt(a[1],10),o=Math.min(o,$.datepicker._getDaysInMonth(i,s))}a=u.exec(t)}return new Date(i,s,o)},s=t==null||t===""?n:typeof t=="string"?i(t):typeof t=="number"?isNaN(t)?n:r(t):new Date(t.getTime());return s=s&&s.toString()=="Invalid Date"?n:s,s&&(s.setHours(0),s.setMinutes(0),s.setSeconds(0),s.setMilliseconds(0)),this._daylightSavingAdjust(s)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,n){var r=!t,i=e.selectedMonth,s=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),(i!=e.selectedMonth||s!=e.selectedYear)&&!n&&this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(r?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&e.input.val()==""?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(e){var t=this._get(e,"stepMonths"),n="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(n,-t,"M")},next:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(n,+t,"M")},hide:function(){window["DP_jQuery_"+dpuuid].datepicker._hideDatepicker()},today:function(){window["DP_jQuery_"+dpuuid].datepicker._gotoToday(n)},selectDay:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectDay(n,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(n,this,"M"),!1},selectYear:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(n,this,"Y"),!1}};$(this).bind(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t=new Date;t=this._daylightSavingAdjust(new Date(t.getFullYear(),t.getMonth(),t.getDate()));var n=this._get(e,"isRTL"),r=this._get(e,"showButtonPanel"),i=this._get(e,"hideIfNoPrevNext"),s=this._get(e,"navigationAsDateFormat"),o=this._getNumberOfMonths(e),u=this._get(e,"showCurrentAtPos"),a=this._get(e,"stepMonths"),f=o[0]!=1||o[1]!=1,l=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),c=this._getMinMaxDate(e,"min"),h=this._getMinMaxDate(e,"max"),p=e.drawMonth-u,d=e.drawYear;p<0&&(p+=12,d--);if(h){var v=this._daylightSavingAdjust(new Date(h.getFullYear(),h.getMonth()-o[0]*o[1]+1,h.getDate()));v=c&&v<c?c:v;while(this._daylightSavingAdjust(new Date(d,p,1))>v)p--,p<0&&(p=11,d--)}e.drawMonth=p,e.drawYear=d;var m=this._get(e,"prevText");m=s?this.formatDate(m,this._daylightSavingAdjust(new Date(d,p-a,1)),this._getFormatConfig(e)):m;var g=this._canAdjustMonth(e,-1,d,p)?'<a class="ui-datepicker-prev ui-corner-all" data-handler="prev" data-event="click" title="'+m+'"><span class="ui-icon ui-icon-circle-triangle-'+(n?"e":"w")+'">'+m+"</span></a>":i?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+m+'"><span class="ui-icon ui-icon-circle-triangle-'+(n?"e":"w")+'">'+m+"</span></a>",y=this._get(e,"nextText");y=s?this.formatDate(y,this._daylightSavingAdjust(new Date(d,p+a,1)),this._getFormatConfig(e)):y;var b=this._canAdjustMonth(e,1,d,p)?'<a class="ui-datepicker-next ui-corner-all" data-handler="next" data-event="click" title="'+y+'"><span class="ui-icon ui-icon-circle-triangle-'+(n?"w":"e")+'">'+y+"</span></a>":i?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+y+'"><span class="ui-icon ui-icon-circle-triangle-'+(n?"w":"e")+'">'+y+"</span></a>",w=this._get(e,"currentText"),E=this._get(e,"gotoCurrent")&&e.currentDay?l:t;w=s?this.formatDate(w,E,this._getFormatConfig(e)):w;var S=e.inline?"":'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" data-handler="hide" data-event="click">'+this._get(e,"closeText")+"</button>",x=r?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(n?S:"")+(this._isInRange(e,E)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" data-handler="today" data-event="click">'+w+"</button>":"")+(n?"":S)+"</div>":"",T=parseInt(this._get(e,"firstDay"),10);T=isNaN(T)?0:T;var N=this._get(e,"showWeek"),C=this._get(e,"dayNames"),k=this._get(e,"dayNamesShort"),L=this._get(e,"dayNamesMin"),A=this._get(e,"monthNames"),O=this._get(e,"monthNamesShort"),M=this._get(e,"beforeShowDay"),_=this._get(e,"showOtherMonths"),D=this._get(e,"selectOtherMonths"),P=this._get(e,"calculateWeek")||this.iso8601Week,H=this._getDefaultDate(e),B="";for(var j=0;j<o[0];j++){var F="";this.maxRows=4;for(var I=0;I<o[1];I++){var q=this._daylightSavingAdjust(new Date(d,p,e.selectedDay)),R=" ui-corner-all",U="";if(f){U+='<div class="ui-datepicker-group';if(o[1]>1)switch(I){case 0:U+=" ui-datepicker-group-first",R=" ui-corner-"+(n?"right":"left");break;case o[1]-1:U+=" ui-datepicker-group-last",R=" ui-corner-"+(n?"left":"right");break;default:U+=" ui-datepicker-group-middle",R=""}U+='">'}U+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+R+'">'+(/all|left/.test(R)&&j==0?n?b:g:"")+(/all|right/.test(R)&&j==0?n?g:b:"")+this._generateMonthYearHeader(e,p,d,c,h,j>0||I>0,A,O)+'</div><table class="ui-datepicker-calendar"><thead>'+"<tr>";var z=N?'<th class="ui-datepicker-week-col">'+this._get(e,"weekHeader")+"</th>":"";for(var W=0;W<7;W++){var X=(W+T)%7;z+="<th"+((W+T+6)%7>=5?' class="ui-datepicker-week-end"':"")+">"+'<span title="'+C[X]+'">'+L[X]+"</span></th>"}U+=z+"</tr></thead><tbody>";var V=this._getDaysInMonth(d,p);d==e.selectedYear&&p==e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,V));var J=(this._getFirstDayOfMonth(d,p)-T+7)%7,K=Math.ceil((J+V)/7),Q=f?this.maxRows>K?this.maxRows:K:K;this.maxRows=Q;var G=this._daylightSavingAdjust(new Date(d,p,1-J));for(var Y=0;Y<Q;Y++){U+="<tr>";var Z=N?'<td class="ui-datepicker-week-col">'+this._get(e,"calculateWeek")(G)+"</td>":"";for(var W=0;W<7;W++){var et=M?M.apply(e.input?e.input[0]:null,[G]):[!0,""],tt=G.getMonth()!=p,nt=tt&&!D||!et[0]||c&&G<c||h&&G>h;Z+='<td class="'+((W+T+6)%7>=5?" ui-datepicker-week-end":"")+(tt?" ui-datepicker-other-month":"")+(G.getTime()==q.getTime()&&p==e.selectedMonth&&e._keyEvent||H.getTime()==G.getTime()&&H.getTime()==q.getTime()?" "+this._dayOverClass:"")+(nt?" "+this._unselectableClass+" ui-state-disabled":"")+(tt&&!_?"":" "+et[1]+(G.getTime()==l.getTime()?" "+this._currentClass:"")+(G.getTime()==t.getTime()?" ui-datepicker-today":""))+'"'+((!tt||_)&&et[2]?' title="'+et[2]+'"':"")+(nt?"":' data-handler="selectDay" data-event="click" data-month="'+G.getMonth()+'" data-year="'+G.getFullYear()+'"')+">"+(tt&&!_?"&#xa0;":nt?'<span class="ui-state-default">'+G.getDate()+"</span>":'<a class="ui-state-default'+(G.getTime()==t.getTime()?" ui-state-highlight":"")+(G.getTime()==l.getTime()?" ui-state-active":"")+(tt?" ui-priority-secondary":"")+'" href="#">'+G.getDate()+"</a>")+"</td>",G.setDate(G.getDate()+1),G=this._daylightSavingAdjust(G)}U+=Z+"</tr>"}p++,p>11&&(p=0,d++),U+="</tbody></table>"+(f?"</div>"+(o[0]>0&&I==o[1]-1?'<div class="ui-datepicker-row-break"></div>':""):""),F+=U}B+=F}return B+=x+($.ui.ie6&&!e.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':""),e._keyEvent=!1,B},_generateMonthYearHeader:function(e,t,n,r,i,s,o,u){var a=this._get(e,"changeMonth"),f=this._get(e,"changeYear"),l=this._get(e,"showMonthAfterYear"),c='<div class="ui-datepicker-title">',h="";if(s||!a)h+='<span class="ui-datepicker-month">'+o[t]+"</span>";else{var p=r&&r.getFullYear()==n,d=i&&i.getFullYear()==n;h+='<select class="ui-datepicker-month" data-handler="selectMonth" data-event="change">';for(var v=0;v<12;v++)(!p||v>=r.getMonth())&&(!d||v<=i.getMonth())&&(h+='<option value="'+v+'"'+(v==t?' selected="selected"':"")+">"+u[v]+"</option>");h+="</select>"}l||(c+=h+(s||!a||!f?"&#xa0;":""));if(!e.yearshtml){e.yearshtml="";if(s||!f)c+='<span class="ui-datepicker-year">'+n+"</span>";else{var m=this._get(e,"yearRange").split(":"),g=(new Date).getFullYear(),y=function(e){var t=e.match(/c[+-].*/)?n+parseInt(e.substring(1),10):e.match(/[+-].*/)?g+parseInt(e,10):parseInt(e,10);return isNaN(t)?g:t},b=y(m[0]),w=Math.max(b,y(m[1]||""));b=r?Math.max(b,r.getFullYear()):b,w=i?Math.min(w,i.getFullYear()):w,e.yearshtml+='<select class="ui-datepicker-year" data-handler="selectYear" data-event="change">';for(;b<=w;b++)e.yearshtml+='<option value="'+b+'"'+(b==n?' selected="selected"':"")+">"+b+"</option>";e.yearshtml+="</select>",c+=e.yearshtml,e.yearshtml=null}}return c+=this._get(e,"yearSuffix"),l&&(c+=(s||!a||!f?"&#xa0;":"")+h),c+="</div>",c},_adjustInstDate:function(e,t,n){var r=e.drawYear+(n=="Y"?t:0),i=e.drawMonth+(n=="M"?t:0),s=Math.min(e.selectedDay,this._getDaysInMonth(r,i))+(n=="D"?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(r,i,s)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),(n=="M"||n=="Y")&&this._notifyChange(e)},_restrictMinMax:function(e,t){var n=this._getMinMaxDate(e,"min"),r=this._getMinMaxDate(e,"max"),i=n&&t<n?n:t;return i=r&&i>r?r:i,i},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return t==null?[1,1]:typeof t=="number"?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return(new Date(e,t,1)).getDay()},_canAdjustMonth:function(e,t,n,r){var i=this._getNumberOfMonths(e),s=this._daylightSavingAdjust(new Date(n,r+(t<0?t:i[0]*i[1]),1));return t<0&&s.setDate(this._getDaysInMonth(s.getFullYear(),s.getMonth())),this._isInRange(e,s)},_isInRange:function(e,t){var n=this._getMinMaxDate(e,"min"),r=this._getMinMaxDate(e,"max");return(!n||t.getTime()>=n.getTime())&&(!r||t.getTime()<=r.getTime())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t=typeof t!="string"?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,n,r){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var i=t?typeof t=="object"?t:this._daylightSavingAdjust(new Date(r,n,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),i,this._getFormatConfig(e))}}),$.fn.datepicker=function(e){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find(document.body).append($.datepicker.dpDiv),$.datepicker.initialized=!0);var t=Array.prototype.slice.call(arguments,1);return typeof e!="string"||e!="isDisabled"&&e!="getDate"&&e!="widget"?e=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+e+"Datepicker"].apply($.datepicker,[this[0]].concat(t)):this.each(function(){typeof e=="string"?$.datepicker["_"+e+"Datepicker"].apply($.datepicker,[this].concat(t)):$.datepicker._attachDatepicker(this,e)}):$.datepicker["_"+e+"Datepicker"].apply($.datepicker,[this[0]].concat(t))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.9.2",window["DP_jQuery_"+dpuuid]=$})(jQuery);(function(e,t){var n="ui-dialog ui-widget ui-widget-content ui-corner-all ",r={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},i={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0};e.widget("ui.dialog",{version:"1.9.2",options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var n=e(this).css(t).offset().top;n<0&&e(this).css("top",t.top-n)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.oldPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.options.title=this.options.title||this.originalTitle;var t=this,r=this.options,i=r.title||"&#160;",s,o,u,a,f;s=(this.uiDialog=e("<div>")).addClass(n+r.dialogClass).css({display:"none",outline:0,zIndex:r.zIndex}).attr("tabIndex",-1).keydown(function(n){r.closeOnEscape&&!n.isDefaultPrevented()&&n.keyCode&&n.keyCode===e.ui.keyCode.ESCAPE&&(t.close(n),n.preventDefault())}).mousedown(function(e){t.moveToTop(!1,e)}).appendTo("body"),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(s),o=(this.uiDialogTitlebar=e("<div>")).addClass("ui-dialog-titlebar  ui-widget-header  ui-corner-all  ui-helper-clearfix").bind("mousedown",function(){s.focus()}).prependTo(s),u=e("<a href='#'></a>").addClass("ui-dialog-titlebar-close  ui-corner-all").attr("role","button").click(function(e){e.preventDefault(),t.close(e)}).appendTo(o),(this.uiDialogTitlebarCloseText=e("<span>")).addClass("ui-icon ui-icon-closethick").text(r.closeText).appendTo(u),a=e("<span>").uniqueId().addClass("ui-dialog-title").html(i).prependTo(o),f=(this.uiDialogButtonPane=e("<div>")).addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),(this.uiButtonSet=e("<div>")).addClass("ui-dialog-buttonset").appendTo(f),s.attr({role:"dialog","aria-labelledby":a.attr("id")}),o.find("*").add(o).disableSelection(),this._hoverable(u),this._focusable(u),r.draggable&&e.fn.draggable&&this._makeDraggable(),r.resizable&&e.fn.resizable&&this._makeResizable(),this._createButtons(r.buttons),this._isOpen=!1,e.fn.bgiframe&&s.bgiframe(),this._on(s,{keydown:function(t){if(!r.modal||t.keyCode!==e.ui.keyCode.TAB)return;var n=e(":tabbable",s),i=n.filter(":first"),o=n.filter(":last");if(t.target===o[0]&&!t.shiftKey)return i.focus(1),!1;if(t.target===i[0]&&t.shiftKey)return o.focus(1),!1}})},_init:function(){this.options.autoOpen&&this.open()},_destroy:function(){var e,t=this.oldPosition;this.overlay&&this.overlay.destroy(),this.uiDialog.hide(),this.element.removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),this.uiDialog.remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},close:function(t){var n=this,r,i;if(!this._isOpen)return;if(!1===this._trigger("beforeClose",t))return;return this._isOpen=!1,this.overlay&&this.overlay.destroy(),this.options.hide?this._hide(this.uiDialog,this.options.hide,function(){n._trigger("close",t)}):(this.uiDialog.hide(),this._trigger("close",t)),e.ui.dialog.overlay.resize(),this.options.modal&&(r=0,e(".ui-dialog").each(function(){this!==n.uiDialog[0]&&(i=e(this).css("z-index"),isNaN(i)||(r=Math.max(r,i)))}),e.ui.dialog.maxZ=r),this},isOpen:function(){return this._isOpen},moveToTop:function(t,n){var r=this.options,i;return r.modal&&!t||!r.stack&&!r.modal?this._trigger("focus",n):(r.zIndex>e.ui.dialog.maxZ&&(e.ui.dialog.maxZ=r.zIndex),this.overlay&&(e.ui.dialog.maxZ+=1,e.ui.dialog.overlay.maxZ=e.ui.dialog.maxZ,this.overlay.$el.css("z-index",e.ui.dialog.overlay.maxZ)),i={scrollTop:this.element.scrollTop(),scrollLeft:this.element.scrollLeft()},e.ui.dialog.maxZ+=1,this.uiDialog.css("z-index",e.ui.dialog.maxZ),this.element.attr(i),this._trigger("focus",n),this)},open:function(){if(this._isOpen)return;var t,n=this.options,r=this.uiDialog;return this._size(),this._position(n.position),r.show(n.show),this.overlay=n.modal?new e.ui.dialog.overlay(this):null,this.moveToTop(!0),t=this.element.find(":tabbable"),t.length||(t=this.uiDialogButtonPane.find(":tabbable"),t.length||(t=r)),t.eq(0).focus(),this._isOpen=!0,this._trigger("open"),this},_createButtons:function(t){var n=this,r=!1;this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),typeof t=="object"&&t!==null&&e.each(t,function(){return!(r=!0)}),r?(e.each(t,function(t,r){var i,s;r=e.isFunction(r)?{click:r,text:t}:r,r=e.extend({type:"button"},r),s=r.click,r.click=function(){s.apply(n.element[0],arguments)},i=e("<button></button>",r).appendTo(n.uiButtonSet),e.fn.button&&i.button()}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog)):this.uiDialog.removeClass("ui-dialog-buttons")},_makeDraggable:function(){function r(e){return{position:e.position,offset:e.offset}}var t=this,n=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(n,i){e(this).addClass("ui-dialog-dragging"),t._trigger("dragStart",n,r(i))},drag:function(e,n){t._trigger("drag",e,r(n))},stop:function(i,s){n.position=[s.position.left-t.document.scrollLeft(),s.position.top-t.document.scrollTop()],e(this).removeClass("ui-dialog-dragging"),t._trigger("dragStop",i,r(s)),e.ui.dialog.overlay.resize()}})},_makeResizable:function(n){function u(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}n=n===t?this.options.resizable:n;var r=this,i=this.options,s=this.uiDialog.css("position"),o=typeof n=="string"?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:i.maxWidth,maxHeight:i.maxHeight,minWidth:i.minWidth,minHeight:this._minHeight(),handles:o,start:function(t,n){e(this).addClass("ui-dialog-resizing"),r._trigger("resizeStart",t,u(n))},resize:function(e,t){r._trigger("resize",e,u(t))},stop:function(t,n){e(this).removeClass("ui-dialog-resizing"),i.height=e(this).height(),i.width=e(this).width(),r._trigger("resizeStop",t,u(n)),e.ui.dialog.overlay.resize()}}).css("position",s).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var e=this.options;return e.height==="auto"?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(t){var n=[],r=[0,0],i;if(t){if(typeof t=="string"||typeof t=="object"&&"0"in t)n=t.split?t.split(" "):[t[0],t[1]],n.length===1&&(n[1]=n[0]),e.each(["left","top"],function(e,t){+n[e]===n[e]&&(r[e]=n[e],n[e]=t)}),t={my:n[0]+(r[0]<0?r[0]:"+"+r[0])+" "+n[1]+(r[1]<0?r[1]:"+"+r[1]),at:n.join(" ")};t=e.extend({},e.ui.dialog.prototype.options.position,t)}else t=e.ui.dialog.prototype.options.position;i=this.uiDialog.is(":visible"),i||this.uiDialog.show(),this.uiDialog.position(t),i||this.uiDialog.hide()},_setOptions:function(t){var n=this,s={},o=!1;e.each(t,function(e,t){n._setOption(e,t),e in r&&(o=!0),e in i&&(s[e]=t)}),o&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",s)},_setOption:function(t,r){var i,s,o=this.uiDialog;switch(t){case"buttons":this._createButtons(r);break;case"closeText":this.uiDialogTitlebarCloseText.text(""+r);break;case"dialogClass":o.removeClass(this.options.dialogClass).addClass(n+r);break;case"disabled":r?o.addClass("ui-dialog-disabled"):o.removeClass("ui-dialog-disabled");break;case"draggable":i=o.is(":data(draggable)"),i&&!r&&o.draggable("destroy"),!i&&r&&this._makeDraggable();break;case"position":this._position(r);break;case"resizable":s=o.is(":data(resizable)"),s&&!r&&o.resizable("destroy"),s&&typeof r=="string"&&o.resizable("option","handles",r),!s&&r!==!1&&this._makeResizable(r);break;case"title":e(".ui-dialog-title",this.uiDialogTitlebar).html(""+(r||"&#160;"))}this._super(t,r)},_size:function(){var t,n,r,i=this.options,s=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),i.minWidth>i.width&&(i.width=i.minWidth),t=this.uiDialog.css({height:"auto",width:i.width}).outerHeight(),n=Math.max(0,i.minHeight-t),i.height==="auto"?e.support.minHeight?this.element.css({minHeight:n,height:"auto"}):(this.uiDialog.show(),r=this.element.css("height","auto").height(),s||this.uiDialog.hide(),this.element.height(Math.max(r,n))):this.element.height(Math.max(i.height-t,0)),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),e.extend(e.ui.dialog,{uuid:0,maxZ:0,getTitleId:function(e){var t=e.attr("id");return t||(this.uuid+=1,t=this.uuid),"ui-dialog-title-"+t},overlay:function(t){this.$el=e.ui.dialog.overlay.create(t)}}),e.extend(e.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:e.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(e){return e+".dialog-overlay"}).join(" "),create:function(t){this.instances.length===0&&(setTimeout(function(){e.ui.dialog.overlay.instances.length&&e(document).bind(e.ui.dialog.overlay.events,function(t){if(e(t.target).zIndex()<e.ui.dialog.overlay.maxZ)return!1})},1),e(window).bind("resize.dialog-overlay",e.ui.dialog.overlay.resize));var n=this.oldInstances.pop()||e("<div>").addClass("ui-widget-overlay");return e(document).bind("keydown.dialog-overlay",function(r){var i=e.ui.dialog.overlay.instances;i.length!==0&&i[i.length-1]===n&&t.options.closeOnEscape&&!r.isDefaultPrevented()&&r.keyCode&&r.keyCode===e.ui.keyCode.ESCAPE&&(t.close(r),r.preventDefault())}),n.appendTo(document.body).css({width:this.width(),height:this.height()}),e.fn.bgiframe&&n.bgiframe(),this.instances.push(n),n},destroy:function(t){var n=e.inArray(t,this.instances),r=0;n!==-1&&this.oldInstances.push(this.instances.splice(n,1)[0]),this.instances.length===0&&e([document,window]).unbind(".dialog-overlay"),t.height(0).width(0).remove(),e.each(this.instances,function(){r=Math.max(r,this.css("z-index"))}),this.maxZ=r},height:function(){var t,n;return e.ui.ie?(t=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),n=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight),t<n?e(window).height()+"px":t+"px"):e(document).height()+"px"},width:function(){var t,n;return e.ui.ie?(t=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth),n=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth),t<n?e(window).width()+"px":t+"px"):e(document).width()+"px"},resize:function(){var t=e([]);e.each(e.ui.dialog.overlay.instances,function(){t=t.add(this)}),t.css({width:0,height:0}).css({width:e.ui.dialog.overlay.width(),height:e.ui.dialog.overlay.height()})}}),e.extend(e.ui.dialog.overlay.prototype,{destroy:function(){e.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);(function(e,t){var n=!1;e.widget("ui.menu",{version:"1.9.2",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content ui-corner-all").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}).bind("click"+this.eventNamespace,e.proxy(function(e){this.options.disabled&&e.preventDefault()},this)),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item > a":function(e){e.preventDefault()},"click .ui-state-disabled > a":function(e){e.preventDefault()},"click .ui-menu-item:has(a)":function(t){var r=e(t.target).closest(".ui-menu-item");!n&&r.not(".ui-state-disabled").length&&(n=!0,this.select(t),r.has(".ui-menu").length?this.expand(t):this.element.is(":focus")||(this.element.trigger("focus",[!0]),this.active&&this.active.parents(".ui-menu").length===1&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){var n=e(t.currentTarget);n.siblings().children(".ui-state-active").removeClass("ui-state-active"),this.focus(t,n)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var n=this.active||this.element.children(".ui-menu-item").eq(0);t||this.focus(e,n)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){e(t.target).closest(".ui-menu").length||this.collapseAll(t),n=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").andSelf().removeClass("ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").children("a").removeUniqueId().removeClass("ui-corner-all ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){function a(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var n,r,i,s,o,u=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:u=!1,r=this.previousFilter||"",i=String.fromCharCode(t.keyCode),s=!1,clearTimeout(this.filterTimer),i===r?s=!0:i=r+i,o=new RegExp("^"+a(i),"i"),n=this.activeMenu.children(".ui-menu-item").filter(function(){return o.test(e(this).children("a").text())}),n=s&&n.index(this.active.next())!==-1?this.active.nextAll(".ui-menu-item"):n,n.length||(i=String.fromCharCode(t.keyCode),o=new RegExp("^"+a(i),"i"),n=this.activeMenu.children(".ui-menu-item").filter(function(){return o.test(e(this).children("a").text())})),n.length?(this.focus(t,n),n.length>1?(this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}u&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.children("a[aria-haspopup='true']").length?this.expand(e):this.select(e))},refresh:function(){var t,n=this.options.icons.submenu,r=this.element.find(this.options.menus);r.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-corner-all").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),r=t.prev("a"),i=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);r.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",r.attr("id"))}),t=r.add(this.element),t.children(":not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","presentation").children("a").uniqueId().addClass("ui-corner-all").attr({tabIndex:-1,role:this._itemRole()}),t.children(":not(.ui-menu-item)").each(function(){var t=e(this);/[^\-鈥斺揬s]/.test(t.text())||t.addClass("ui-widget-content ui-menu-divider")}),t.children(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},focus:function(e,t){var n,r;this.blur(e,e&&e.type==="focus"),this._scrollIntoView(t),this.active=t.first(),r=this.active.children("a").addClass("ui-state-focus"),this.options.role&&this.element.attr("aria-activedescendant",r.attr("id")),this.active.parent().closest(".ui-menu-item").children("a:first").addClass("ui-state-active"),e&&e.type==="keydown"?this._close():this.timer=this._delay(function(){this._close()},this.delay),n=t.children(".ui-menu"),n.length&&/^mouse/.test(e.type)&&this._startOpening(n),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var n,r,i,s,o,u;this._hasScroll()&&(n=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,r=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,i=t.offset().top-this.activeMenu.offset().top-n-r,s=this.activeMenu.scrollTop(),o=this.activeMenu.height(),u=t.height(),i<0?this.activeMenu.scrollTop(s+i):i+u>o&&this.activeMenu.scrollTop(s+i-o+u))},blur:function(e,t){t||clearTimeout(this.timer);if(!this.active)return;this.active.children("a").removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active})},_startOpening:function(e){clearTimeout(this.timer);if(e.attr("aria-hidden")!=="true")return;this.timer=this._delay(function(){this._close(),this._open(e)},this.delay)},_open:function(t){var n=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(n)},collapseAll:function(t,n){clearTimeout(this.timer),this.timer=this._delay(function(){var r=n?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));r.length||(r=this.element),this._close(r),this.blur(t),this.activeMenu=r},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find("a.ui-state-active").removeClass("ui-state-active")},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").children(".ui-menu-item").first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,n){var r;this.active&&(e==="first"||e==="last"?r=this.active[e==="first"?"prevAll":"nextAll"](".ui-menu-item").eq(-1):r=this.active[e+"All"](".ui-menu-item").eq(0));if(!r||!r.length||!this.active)r=this.activeMenu.children(".ui-menu-item")[t]();this.focus(n,r)},nextPage:function(t){var n,r,i;if(!this.active){this.next(t);return}if(this.isLastItem())return;this._hasScroll()?(r=this.active.offset().top,i=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return n=e(this),n.offset().top-r-i<0}),this.focus(t,n)):this.focus(t,this.activeMenu.children(".ui-menu-item")[this.active?"last":"first"]())},previousPage:function(t){var n,r,i;if(!this.active){this.next(t);return}if(this.isFirstItem())return;this._hasScroll()?(r=this.active.offset().top,i=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return n=e(this),n.offset().top-r+i>0}),this.focus(t,n)):this.focus(t,this.activeMenu.children(".ui-menu-item").first())},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var n={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,n)}})})(jQuery);(function(e,t){e.widget("ui.progressbar",{version:"1.9.2",options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return e===t?this._value():(this._setOption("value",e),this)},_setOption:function(e,t){e==="value"&&(this.options.value=t,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),this._super(e,t)},_value:function(){var e=this.options.value;return typeof e!="number"&&(e=0),Math.min(this.options.max,Math.max(this.min,e))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var e=this.value(),t=this._percentage();this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),this.valueDiv.toggle(e>this.min).toggleClass("ui-corner-right",e===this.options.max).width(t.toFixed(0)+"%"),this.element.attr("aria-valuenow",e)}})})(jQuery);(function(e,t){var n=5;e.widget("ui.slider",e.ui.mouse,{version:"1.9.2",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null},_create:function(){var t,r,i=this.options,s=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),o="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",u=[];this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"+(i.disabled?" ui-slider-disabled ui-disabled":"")),this.range=e([]),i.range&&(i.range===!0&&(i.values||(i.values=[this._valueMin(),this._valueMin()]),i.values.length&&i.values.length!==2&&(i.values=[i.values[0],i.values[0]])),this.range=e("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(i.range==="min"||i.range==="max"?" ui-slider-range-"+i.range:""))),r=i.values&&i.values.length||1;for(t=s.length;t<r;t++)u.push(o);this.handles=s.add(e(u.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.add(this.range).filter("a").click(function(e){e.preventDefault()}).mouseenter(function(){i.disabled||e(this).addClass("ui-state-hover")}).mouseleave(function(){e(this).removeClass("ui-state-hover")}).focus(function(){i.disabled?e(this).blur():(e(".ui-slider .ui-state-focus").removeClass("ui-state-focus"),e(this).addClass("ui-state-focus"))}).blur(function(){e(this).removeClass("ui-state-focus")}),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)}),this._on(this.handles,{keydown:function(t){var r,i,s,o,u=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:t.preventDefault();if(!this._keySliding){this._keySliding=!0,e(t.target).addClass("ui-state-active"),r=this._start(t,u);if(r===!1)return}}o=this.options.step,this.options.values&&this.options.values.length?i=s=this.values(u):i=s=this.value();switch(t.keyCode){case e.ui.keyCode.HOME:s=this._valueMin();break;case e.ui.keyCode.END:s=this._valueMax();break;case e.ui.keyCode.PAGE_UP:s=this._trimAlignValue(i+(this._valueMax()-this._valueMin())/n);break;case e.ui.keyCode.PAGE_DOWN:s=this._trimAlignValue(i-(this._valueMax()-this._valueMin())/n);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(i===this._valueMax())return;s=this._trimAlignValue(i+o);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(i===this._valueMin())return;s=this._trimAlignValue(i-o)}this._slide(t,u,s)},keyup:function(t){var n=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,n),this._change(t,n),e(t.target).removeClass("ui-state-active"))}}),this._refreshValue(),this._animateOff=!1},_destroy:function(){this.handles.remove(),this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var n,r,i,s,o,u,a,f,l=this,c=this.options;return c.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),n={x:t.pageX,y:t.pageY},r=this._normValueFromMouse(n),i=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var n=Math.abs(r-l.values(t));i>n&&(i=n,s=e(this),o=t)}),c.range===!0&&this.values(1)===c.min&&(o+=1,s=e(this.handles[o])),u=this._start(t,o),u===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,s.addClass("ui-state-active").focus(),a=s.offset(),f=!e(t.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=f?{left:0,top:0}:{left:t.pageX-a.left-s.width()/2,top:t.pageY-a.top-s.height()/2-(parseInt(s.css("borderTopWidth"),10)||0)-(parseInt(s.css("borderBottomWidth"),10)||0)+(parseInt(s.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,r),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},n=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,n),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,n,r,i,s;return this.orientation==="horizontal"?(t=this.elementSize.width,n=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,n=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),r=n/t,r>1&&(r=1),r<0&&(r=0),this.orientation==="vertical"&&(r=1-r),i=this._valueMax()-this._valueMin(),s=this._valueMin()+r*i,this._trimAlignValue(s)},_start:function(e,t){var n={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(n.value=this.values(t),n.values=this.values()),this._trigger("start",e,n)},_slide:function(e,t,n){var r,i,s;this.options.values&&this.options.values.length?(r=this.values(t?0:1),this.options.values.length===2&&this.options.range===!0&&(t===0&&n>r||t===1&&n<r)&&(n=r),n!==this.values(t)&&(i=this.values(),i[t]=n,s=this._trigger("slide",e,{handle:this.handles[t],value:n,values:i}),r=this.values(t?0:1),s!==!1&&this.values(t,n,!0))):n!==this.value()&&(s=this._trigger("slide",e,{handle:this.handles[t],value:n}),s!==!1&&this.value(n))},_stop:function(e,t){var n={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(n.value=this.values(t),n.values=this.values()),this._trigger("stop",e,n)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var n={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(n.value=this.values(t),n.values=this.values()),this._trigger("change",e,n)}},value:function(e){if(arguments.length){this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0);return}return this._value()},values:function(t,n){var r,i,s;if(arguments.length>1){this.options.values[t]=this._trimAlignValue(n),this._refreshValue(),this._change(null,t);return}if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();r=this.options.values,i=arguments[0];for(s=0;s<r.length;s+=1)r[s]=this._trimAlignValue(i[s]),this._change(null,s);this._refreshValue()},_setOption:function(t,n){var r,i=0;e.isArray(this.options.values)&&(i=this.options.values.length),e.Widget.prototype._setOption.apply(this,arguments);switch(t){case"disabled":n?(this.handles.filter(".ui-state-focus").blur(),this.handles.removeClass("ui-state-hover"),this.handles.prop("disabled",!0),this.element.addClass("ui-disabled")):(this.handles.prop("disabled",!1),this.element.removeClass("ui-disabled"));break;case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":this._animateOff=!0,this._refreshValue();for(r=0;r<i;r+=1)this._change(null,r);this._animateOff=!1;break;case"min":case"max":this._animateOff=!0,this._refreshValue(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e),e},_values:function(e){var t,n,r;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t),t;n=this.options.values.slice();for(r=0;r<n.length;r+=1)n[r]=this._trimAlignValue(n[r]);return n},_trimAlignValue:function(e){if(e<=this._valueMin())return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,n=(e-this._valueMin())%t,r=e-n;return Math.abs(n)*2>=t&&(r+=n>0?t:-t),parseFloat(r.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var t,n,r,i,s,o=this.options.range,u=this.options,a=this,f=this._animateOff?!1:u.animate,l={};this.options.values&&this.options.values.length?this.handles.each(function(r){n=(a.values(r)-a._valueMin())/(a._valueMax()-a._valueMin())*100,l[a.orientation==="horizontal"?"left":"bottom"]=n+"%",e(this).stop(1,1)[f?"animate":"css"](l,u.animate),a.options.range===!0&&(a.orientation==="horizontal"?(r===0&&a.range.stop(1,1)[f?"animate":"css"]({left:n+"%"},u.animate),r===1&&a.range[f?"animate":"css"]({width:n-t+"%"},{queue:!1,duration:u.animate})):(r===0&&a.range.stop(1,1)[f?"animate":"css"]({bottom:n+"%"},u.animate),r===1&&a.range[f?"animate":"css"]({height:n-t+"%"},{queue:!1,duration:u.animate}))),t=n}):(r=this.value(),i=this._valueMin(),s=this._valueMax(),n=s!==i?(r-i)/(s-i)*100:0,l[this.orientation==="horizontal"?"left":"bottom"]=n+"%",this.handle.stop(1,1)[f?"animate":"css"](l,u.animate),o==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[f?"animate":"css"]({width:n+"%"},u.animate),o==="max"&&this.orientation==="horizontal"&&this.range[f?"animate":"css"]({width:100-n+"%"},{queue:!1,duration:u.animate}),o==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[f?"animate":"css"]({height:n+"%"},u.animate),o==="max"&&this.orientation==="vertical"&&this.range[f?"animate":"css"]({height:100-n+"%"},{queue:!1,duration:u.animate}))}})})(jQuery);(function(e){function t(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.widget("ui.spinner",{version:"1.9.2",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},n=this.element;return e.each(["min","max","step"],function(e,r){var i=n.attr(r);i!==undefined&&i.length&&(t[r]=i)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){if(this.cancelBlur){delete this.cancelBlur;return}this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e)},mousewheel:function(e,t){if(!t)return;if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()},"mousedown .ui-spinner-button":function(t){function r(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=n,this._delay(function(){this.previous=n}))}var n;n=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),r.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,r.call(this)});if(this._start(t)===!1)return;this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){if(!e(t.currentTarget).hasClass("ui-state-active"))return;if(this._start(t)===!1)return!1;this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(e.height()*.5)&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var n=this.options,r=e.ui.keyCode;switch(t.keyCode){case r.UP:return this._repeat(null,1,t),!0;case r.DOWN:return this._repeat(null,-1,t),!0;case r.PAGE_UP:return this._repeat(null,n.page,t),!0;case r.PAGE_DOWN:return this._repeat(null,-n.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return!this.spinning&&this._trigger("start",e)===!1?!1:(this.counter||(this.counter=1),this.spinning=!0,!0)},_repeat:function(e,t,n){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,n)},e),this._spin(t*this.options.step,n)},_spin:function(e,t){var n=this.value()||0;this.counter||(this.counter=1),n=this._adjustValue(n+e*this._increment(this.counter));if(!this.spinning||this._trigger("spin",t,{value:n})!==!1)this._value(n),this.counter++},_increment:function(t){var n=this.options.incremental;return n?e.isFunction(n)?n(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return this.options.min!==null&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=e.toString(),n=t.indexOf(".");return n===-1?0:t.length-n-1},_adjustValue:function(e){var t,n,r=this.options;return t=r.min!==null?r.min:0,n=e-t,n=Math.round(n/r.step)*r.step,e=t+n,e=parseFloat(e.toFixed(this._precision())),r.max!==null&&e>r.max?r.max:r.min!==null&&e<r.min?r.min:e},_stop:function(e){if(!this.spinning)return;clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e)},_setOption:function(e,t){if(e==="culture"||e==="numberFormat"){var n=this._parse(this.element.val());this.options[e]=t,this.element.val(this._format(n));return}(e==="max"||e==="min"||e==="step")&&typeof t=="string"&&(t=this._parse(t)),this._super(e,t),e==="disabled"&&(t?(this.element.prop("disabled",!0),this.buttons.button("disable")):(this.element.prop("disabled",!1),this.buttons.button("enable")))},_setOptions:t(function(e){this._super(e),this._value(this.element.val())}),_parse:function(e){return typeof e=="string"&&e!==""&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),e===""||isNaN(e)?null:e},_format:function(e){return e===""?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},_value:function(e,t){var n;e!==""&&(n=this._parse(e),n!==null&&(t||(n=this._adjustValue(n)),e=this._format(n))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:t(function(e){this._stepUp(e)}),_stepUp:function(e){this._spin((e||1)*this.options.step)},stepDown:t(function(e){this._stepDown(e)}),_stepDown:function(e){this._spin((e||1)*-this.options.step)},pageUp:t(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:t(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){if(!arguments.length)return this._parse(this.element.val());t(this._value).call(this,e)},widget:function(){return this.uiSpinner}})})(jQuery);(function(e,t){function i(){return++n}function s(e){return e.hash.length>1&&e.href.replace(r,"")===location.href.replace(r,"").replace(/\s/g,"%20")}var n=0,r=/#.*$/;e.widget("ui.tabs",{version:"1.9.2",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_create:function(){var t=this,n=this.options,r=n.active,i=location.hash.substring(1);this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",n.collapsible).delegate(".ui-tabs-nav > li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this._processTabs();if(r===null){i&&this.tabs.each(function(t,n){if(e(n).attr("aria-controls")===i)return r=t,!1}),r===null&&(r=this.tabs.index(this.tabs.filter(".ui-tabs-active")));if(r===null||r===-1)r=this.tabs.length?0:!1}r!==!1&&(r=this.tabs.index(this.tabs.eq(r)),r===-1&&(r=n.collapsible?!1:0)),n.active=r,!n.collapsible&&n.active===!1&&this.anchors.length&&(n.active=0),e.isArray(n.disabled)&&(n.disabled=e.unique(n.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.options.active!==!1&&this.anchors.length?this.active=this._findActive(this.options.active):this.active=e(),this._refresh(),this.active.length&&this.load(n.active)},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var n=e(this.document[0].activeElement).closest("li"),r=this.tabs.index(n),i=!0;if(this._handlePageNav(t))return;switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:r++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:i=!1,r--;break;case e.ui.keyCode.END:r=this.anchors.length-1;break;case e.ui.keyCode.HOME:r=0;break;case e.ui.keyCode.SPACE:t.preventDefault(),clearTimeout(this.activating),this._activate(r);return;case e.ui.keyCode.ENTER:t.preventDefault(),clearTimeout(this.activating),this._activate(r===this.options.active?!1:r);return;default:return}t.preventDefault(),clearTimeout(this.activating),r=this._focusNextTab(r,i),t.ctrlKey||(n.attr("aria-selected","false"),this.tabs.eq(r).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",r)},this.delay))},_panelKeydown:function(t){if(this._handlePageNav(t))return;t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){if(t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP)return this._activate(this._focusNextTab(this.options.active-1,!1)),!0;if(t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN)return this._activate(this._focusNextTab(this.options.active+1,!0)),!0},_findNextTab:function(t,n){function i(){return t>r&&(t=0),t<0&&(t=r),t}var r=this.tabs.length-1;while(e.inArray(i(),this.options.disabled)!==-1)t=n?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){if(e==="active"){this._activate(t);return}if(e==="disabled"){this._setupDisabled(t);return}this._super(e,t),e==="collapsible"&&(this.element.toggleClass("ui-tabs-collapsible",t),!t&&this.options.active===!1&&this._activate(0)),e==="event"&&this._setupEvents(t),e==="heightStyle"&&this._setupHeightStyle(t)},_tabId:function(e){return e.attr("aria-controls")||"ui-tabs-"+i()},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,n=this.tablist.children(":has(a[href])");t.disabled=e.map(n.filter(".ui-state-disabled"),function(e){return n.index(e)}),this._processTabs(),t.active===!1||!this.anchors.length?(t.active=!1,this.active=e()):this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-expanded":"false","aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-expanded":"true","aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist"),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(n,r){var i,o,u,a=e(r).uniqueId().attr("id"),f=e(r).closest("li"),l=f.attr("aria-controls");s(r)?(i=r.hash,o=t.element.find(t._sanitizeSelector(i))):(u=t._tabId(f),i="#"+u,o=t.element.find(i),o.length||(o=t._createPanel(u),o.insertAfter(t.panels[n-1]||t.tablist)),o.attr("aria-live","polite")),o.length&&(t.panels=t.panels.add(o)),l&&f.data("ui-tabs-aria-controls",l),f.attr({"aria-controls":i.substring(1),"aria-labelledby":a}),o.attr("aria-labelledby",a)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var n=0,r;r=this.tabs[n];n++)t===!0||e.inArray(n,t)!==-1?e(r).addClass("ui-state-disabled").attr("aria-disabled","true"):e(r).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var n={click:function(e){e.preventDefault()}};t&&e.each(t.split(" "),function(e,t){n[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(this.anchors,n),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var n,r,i=this.element.parent();t==="fill"?(e.support.minHeight||(r=i.css("overflow"),i.css("overflow","hidden")),n=i.height(),this.element.siblings(":visible").each(function(){var t=e(this),r=t.css("position");if(r==="absolute"||r==="fixed")return;n-=t.outerHeight(!0)}),r&&i.css("overflow",r),this.element.children().not(this.panels).each(function(){n-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,n-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):t==="auto"&&(n=0,this.panels.each(function(){n=Math.max(n,e(this).height("").height())}).height(n))},_eventHandler:function(t){var n=this.options,r=this.active,i=e(t.currentTarget),s=i.closest("li"),o=s[0]===r[0],u=o&&n.collapsible,a=u?e():this._getPanelForTab(s),f=r.length?this._getPanelForTab(r):e(),l={oldTab:r,oldPanel:f,newTab:u?e():s,newPanel:a};t.preventDefault();if(s.hasClass("ui-state-disabled")||s.hasClass("ui-tabs-loading")||this.running||o&&!n.collapsible||this._trigger("beforeActivate",t,l)===!1)return;n.active=u?!1:this.tabs.index(s),this.active=o?e():s,this.xhr&&this.xhr.abort(),!f.length&&!a.length&&e.error("jQuery UI Tabs: Mismatching fragment identifier."),a.length&&this.load(this.tabs.index(s),t),this._toggle(t,l)},_toggle:function(t,n){function o(){r.running=!1,r._trigger("activate",t,n)}function u(){n.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),i.length&&r.options.show?r._show(i,r.options.show,o):(i.show(),o())}var r=this,i=n.newPanel,s=n.oldPanel;this.running=!0,s.length&&this.options.hide?this._hide(s,this.options.hide,function(){n.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),u()}):(n.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),s.hide(),u()),s.attr({"aria-expanded":"false","aria-hidden":"true"}),n.oldTab.attr("aria-selected","false"),i.length&&s.length?n.oldTab.attr("tabIndex",-1):i.length&&this.tabs.filter(function(){return e(this).attr("tabIndex")===0}).attr("tabIndex",-1),i.attr({"aria-expanded":"true","aria-hidden":"false"}),n.newTab.attr({"aria-selected":"true",tabIndex:0})},_activate:function(t){var n,r=this._findActive(t);if(r[0]===this.active[0])return;r.length||(r=this.active),n=r.find(".ui-tabs-anchor")[0],this._eventHandler({target:n,currentTarget:n,preventDefault:e.noop})},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return typeof e=="string"&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeData("href.tabs").removeData("load.tabs").removeUniqueId(),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),n=t.data("ui-tabs-aria-controls");n?t.attr("aria-controls",n):t.removeAttr("aria-controls")}),this.panels.show(),this.options.heightStyle!=="content"&&this.panels.css("height","")},enable:function(n){var r=this.options.disabled;if(r===!1)return;n===t?r=!1:(n=this._getIndex(n),e.isArray(r)?r=e.map(r,function(e){return e!==n?e:null}):r=e.map(this.tabs,function(e,t){return t!==n?t:null})),this._setupDisabled(r)},disable:function(n){var r=this.options.disabled;if(r===!0)return;if(n===t)r=!0;else{n=this._getIndex(n);if(e.inArray(n,r)!==-1)return;e.isArray(r)?r=e.merge([n],r).sort():r=[n]}this._setupDisabled(r)},load:function(t,n){t=this._getIndex(t);var r=this,i=this.tabs.eq(t),o=i.find(".ui-tabs-anchor"),u=this._getPanelForTab(i),a={tab:i,panel:u};if(s(o[0]))return;this.xhr=e.ajax(this._ajaxSettings(o,n,a)),this.xhr&&this.xhr.statusText!=="canceled"&&(i.addClass("ui-tabs-loading"),u.attr("aria-busy","true"),this.xhr.success(function(e){setTimeout(function(){u.html(e),r._trigger("load",n,a)},1)}).complete(function(e,t){setTimeout(function(){t==="abort"&&r.panels.stop(!1,!0),i.removeClass("ui-tabs-loading"),u.removeAttr("aria-busy"),e===r.xhr&&delete r.xhr},1)}))},_ajaxSettings:function(t,n,r){var i=this;return{url:t.attr("href"),beforeSend:function(t,s){return i._trigger("beforeLoad",n,e.extend({jqXHR:t,ajaxSettings:s},r))}}},_getPanelForTab:function(t){var n=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+n))}}),e.uiBackCompat!==!1&&(e.ui.tabs.prototype._ui=function(e,t){return{tab:e,panel:t,index:this.anchors.index(e)}},e.widget("ui.tabs",e.ui.tabs,{url:function(e,t){this.anchors.eq(e).attr("href",t)}}),e.widget("ui.tabs",e.ui.tabs,{options:{ajaxOptions:null,cache:!1},_create:function(){this._super();var t=this;this._on({tabsbeforeload:function(n,r){if(e.data(r.tab[0],"cache.tabs")){n.preventDefault();return}r.jqXHR.success(function(){t.options.cache&&e.data(r.tab[0],"cache.tabs",!0)})}})},_ajaxSettings:function(t,n,r){var i=this.options.ajaxOptions;return e.extend({},i,{error:function(e,t){try{i.error(e,t,r.tab.closest("li").index(),r.tab[0])}catch(n){}}},this._superApply(arguments))},_setOption:function(e,t){e==="cache"&&t===!1&&this.anchors.removeData("cache.tabs"),this._super(e,t)},_destroy:function(){this.anchors.removeData("cache.tabs"),this._super()},url:function(e){this.anchors.eq(e).removeData("cache.tabs"),this._superApply(arguments)}}),e.widget("ui.tabs",e.ui.tabs,{abort:function(){this.xhr&&this.xhr.abort()}}),e.widget("ui.tabs",e.ui.tabs,{options:{spinner:"<em>Loading&#8230;</em>"},_create:function(){this._super(),this._on({tabsbeforeload:function(e,t){if(e.target!==this.element[0]||!this.options.spinner)return;var n=t.tab.find("span"),r=n.html();n.html(this.options.spinner),t.jqXHR.complete(function(){n.html(r)})}})}}),e.widget("ui.tabs",e.ui.tabs,{options:{enable:null,disable:null},enable:function(t){var n=this.options,r;if(t&&n.disabled===!0||e.isArray(n.disabled)&&e.inArray(t,n.disabled)!==-1)r=!0;this._superApply(arguments),r&&this._trigger("enable",null,this._ui(this.anchors[t],this.panels[t]))},disable:function(t){var n=this.options,r;if(t&&n.disabled===!1||e.isArray(n.disabled)&&e.inArray(t,n.disabled)===-1)r=!0;this._superApply(arguments),r&&this._trigger("disable",null,this._ui(this.anchors[t],this.panels[t]))}}),e.widget("ui.tabs",e.ui.tabs,{options:{add:null,remove:null,tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},add:function(n,r,i){i===t&&(i=this.anchors.length);var s,o,u=this.options,a=e(u.tabTemplate.replace(/#\{href\}/g,n).replace(/#\{label\}/g,r)),f=n.indexOf("#")?this._tabId(a):n.replace("#","");return a.addClass("ui-state-default ui-corner-top").data("ui-tabs-destroy",!0),a.attr("aria-controls",f),s=i>=this.tabs.length,o=this.element.find("#"+f),o.length||(o=this._createPanel(f),s?i>0?o.insertAfter(this.panels.eq(-1)):o.appendTo(this.element):o.insertBefore(this.panels[i])),o.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").hide(),s?a.appendTo(this.tablist):a.insertBefore(this.tabs[i]),u.disabled=e.map(u.disabled,function(e){return e>=i?++e:e}),this.refresh(),this.tabs.length===1&&u.active===!1&&this.option("active",0),this._trigger("add",null,this._ui(this.anchors[i],this.panels[i])),this},remove:function(t){t=this._getIndex(t);var n=this.options,r=this.tabs.eq(t).remove(),i=this._getPanelForTab(r).remove();return r.hasClass("ui-tabs-active")&&this.anchors.length>2&&this._activate(t+(t+1<this.anchors.length?1:-1)),n.disabled=e.map(e.grep(n.disabled,function(e){return e!==t}),function(e){return e>=t?--e:e}),this.refresh(),this._trigger("remove",null,this._ui(r.find("a")[0],i[0])),this}}),e.widget("ui.tabs",e.ui.tabs,{length:function(){return this.anchors.length}}),e.widget("ui.tabs",e.ui.tabs,{options:{idPrefix:"ui-tabs-"},_tabId:function(t){var n=t.is("li")?t.find("a[href]"):t;return n=n[0],e(n).closest("li").attr("aria-controls")||n.title&&n.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF\-]/g,"")||this.options.idPrefix+i()}}),e.widget("ui.tabs",e.ui.tabs,{options:{panelTemplate:"<div></div>"},_createPanel:function(t){return e(this.options.panelTemplate).attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)}}),e.widget("ui.tabs",e.ui.tabs,{_create:function(){var e=this.options;e.active===null&&e.selected!==t&&(e.active=e.selected===-1?!1:e.selected),this._super(),e.selected=e.active,e.selected===!1&&(e.selected=-1)},_setOption:function(e,t){if(e!=="selected")return this._super(e,t);var n=this.options;this._super("active",t===-1?!1:t),n.selected=n.active,n.selected===!1&&(n.selected=-1)},_eventHandler:function(){this._superApply(arguments),this.options.selected=this.options.active,this.options.selected===!1&&(this.options.selected=-1)}}),e.widget("ui.tabs",e.ui.tabs,{options:{show:null,select:null},_create:function(){this._super(),this.options.active!==!1&&this._trigger("show",null,this._ui(this.active.find(".ui-tabs-anchor")[0],this._getPanelForTab(this.active)[0]))},_trigger:function(e,t,n){var r,i,s=this._superApply(arguments);return s?(e==="beforeActivate"?(r=n.newTab.length?n.newTab:n.oldTab,i=n.newPanel.length?n.newPanel:n.oldPanel,s=this._super("select",t,{tab:r.find(".ui-tabs-anchor")[0],panel:i[0],index:r.closest("li").index()})):e==="activate"&&n.newTab.length&&(s=this._super("show",t,{tab:n.newTab.find(".ui-tabs-anchor")[0],panel:n.newPanel[0],index:n.newTab.closest("li").index()})),s):!1}}),e.widget("ui.tabs",e.ui.tabs,{select:function(e){e=this._getIndex(e);if(e===-1){if(!this.options.collapsible||this.options.selected===-1)return;e=this.options.selected}this.anchors.eq(e).trigger(this.options.event+this.eventNamespace)}}),function(){var t=0;e.widget("ui.tabs",e.ui.tabs,{options:{cookie:null},_create:function(){var e=this.options,t;e.active==null&&e.cookie&&(t=parseInt(this._cookie(),10),t===-1&&(t=!1),e.active=t),this._super()},_cookie:function(n){var r=[this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+ ++t)];return arguments.length&&(r.push(n===!1?-1:n),r.push(this.options.cookie)),e.cookie.apply(null,r)},_refresh:function(){this._super(),this.options.cookie&&this._cookie(this.options.active,this.options.cookie)},_eventHandler:function(){this._superApply(arguments),this.options.cookie&&this._cookie(this.options.active,this.options.cookie)},_destroy:function(){this._super(),this.options.cookie&&this._cookie(null,this.options.cookie)}})}(),e.widget("ui.tabs",e.ui.tabs,{_trigger:function(t,n,r){var i=e.extend({},r);return t==="load"&&(i.panel=i.panel[0],i.tab=i.tab.find(".ui-tabs-anchor")[0]),this._super(t,n,i)}}),e.widget("ui.tabs",e.ui.tabs,{options:{fx:null},_getFx:function(){var t,n,r=this.options.fx;return r&&(e.isArray(r)?(t=r[0],n=r[1]):t=n=r),r?{show:n,hide:t}:null},_toggle:function(e,t){function o(){n.running=!1,n._trigger("activate",e,t)}function u(){t.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),r.length&&s.show?r.animate(s.show,s.show.duration,function(){o()}):(r.show(),o())}var n=this,r=t.newPanel,i=t.oldPanel,s=this._getFx();if(!s)return this._super(e,t);n.running=!0,i.length&&s.hide?i.animate(s.hide,s.hide.duration,function(){t.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),u()}):(t.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),i.hide(),u())}}))})(jQuery);(function(e){function n(t,n){var r=(t.attr("aria-describedby")||"").split(/\s+/);r.push(n),t.data("ui-tooltip-id",n).attr("aria-describedby",e.trim(r.join(" ")))}function r(t){var n=t.data("ui-tooltip-id"),r=(t.attr("aria-describedby")||"").split(/\s+/),i=e.inArray(n,r);i!==-1&&r.splice(i,1),t.removeData("ui-tooltip-id"),r=e.trim(r.join(" ")),r?t.attr("aria-describedby",r):t.removeAttr("aria-describedby")}var t=0;e.widget("ui.tooltip",{version:"1.9.2",options:{content:function(){return e(this).attr("title")},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable()},_setOption:function(t,n){var r=this;if(t==="disabled"){this[n?"_disable":"_enable"](),this.options[t]=n;return}this._super(t,n),t==="content"&&e.each(this.tooltips,function(e,t){r._updateContent(t)})},_disable:function(){var t=this;e.each(this.tooltips,function(n,r){var i=e.Event("blur");i.target=i.currentTarget=r[0],t.close(i,!0)}),this.element.find(this.options.items).andSelf().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).attr("title","")})},_enable:function(){this.element.find(this.options.items).andSelf().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var n=this,r=e(t?t.target:this.element).closest(this.options.items);if(!r.length||r.data("ui-tooltip-id"))return;r.attr("title")&&r.data("ui-tooltip-title",r.attr("title")),r.data("ui-tooltip-open",!0),t&&t.type==="mouseover"&&r.parents().each(function(){var t=e(this),r;t.data("ui-tooltip-open")&&(r=e.Event("blur"),r.target=r.currentTarget=this,n.close(r,!0)),t.attr("title")&&(t.uniqueId(),n.parents[this.id]={element:this,title:t.attr("title")},t.attr("title",""))}),this._updateContent(r,t)},_updateContent:function(e,t){var n,r=this.options.content,i=this,s=t?t.type:null;if(typeof r=="string")return this._open(t,e,r);n=r.call(e[0],function(n){if(!e.data("ui-tooltip-open"))return;i._delay(function(){t&&(t.type=s),this._open(t,e,n)})}),n&&this._open(t,e,n)},_open:function(t,r,i){function f(e){a.of=e;if(s.is(":hidden"))return;s.position(a)}var s,o,u,a=e.extend({},this.options.position);if(!i)return;s=this._find(r);if(s.length){s.find(".ui-tooltip-content").html(i);return}r.is("[title]")&&(t&&t.type==="mouseover"?r.attr("title",""):r.removeAttr("title")),s=this._tooltip(r),n(r,s.attr("id")),s.find(".ui-tooltip-content").html(i),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:f}),f(t)):s.position(e.extend({of:r},this.options.position)),s.hide(),this._show(s,this.options.show),this.options.show&&this.options.show.delay&&(u=setInterval(function(){s.is(":visible")&&(f(a.of),clearInterval(u))},e.fx.interval)),this._trigger("open",t,{tooltip:s}),o={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var n=e.Event(t);n.currentTarget=r[0],this.close(n,!0)}},remove:function(){this._removeTooltip(s)}};if(!t||t.type==="mouseover")o.mouseleave="close";if(!t||t.type==="focusin")o.focusout="close";this._on(!0,r,o)},close:function(t){var n=this,i=e(t?t.currentTarget:this.element),s=this._find(i);if(this.closing)return;i.data("ui-tooltip-title")&&i.attr("title",i.data("ui-tooltip-title")),r(i),s.stop(!0),this._hide(s,this.options.hide,function(){n._removeTooltip(e(this))}),i.removeData("ui-tooltip-open"),this._off(i,"mouseleave focusout keyup"),i[0]!==this.element[0]&&this._off(i,"remove"),this._off(this.document,"mousemove"),t&&t.type==="mouseleave"&&e.each(this.parents,function(t,r){e(r.element).attr("title",r.title),delete n.parents[t]}),this.closing=!0,this._trigger("close",t,{tooltip:s}),this.closing=!1},_tooltip:function(n){var r="ui-tooltip-"+t++,i=e("<div>").attr({id:r,role:"tooltip"}).addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||""));return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),e.fn.bgiframe&&i.bgiframe(),this.tooltips[r]=n,i},_find:function(t){var n=t.data("ui-tooltip-id");return n?e("#"+n):e()},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(n,r){var i=e.Event("blur");i.target=i.currentTarget=r[0],t.close(i,!0),e("#"+n).remove(),r.data("ui-tooltip-title")&&(r.attr("title",r.data("ui-tooltip-title")),r.removeData("ui-tooltip-title"))})}})})(jQuery);jQuery.effects||function(e,t){var n=e.uiBackCompat!==!1,r="ui-effects-";e.effects={effect:{}},function(t,n){function p(e,t,n){var r=a[t.type]||{};return e==null?n||!t.def?null:t.def:(e=r.floor?~~e:parseFloat(e),isNaN(e)?t.def:r.mod?(e+r.mod)%r.mod:0>e?0:r.max<e?r.max:e)}function d(e){var n=o(),r=n._rgba=[];return e=e.toLowerCase(),h(s,function(t,i){var s,o=i.re.exec(e),a=o&&i.parse(o),f=i.space||"rgba";if(a)return s=n[f](a),n[u[f].cache]=s[u[f].cache],r=n._rgba=s._rgba,!1}),r.length?(r.join()==="0,0,0,0"&&t.extend(r,c.transparent),n):c[e]}function v(e,t,n){return n=(n+1)%1,n*6<1?e+(t-e)*n*6:n*2<1?t:n*3<2?e+(t-e)*(2/3-n)*6:e}var r="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor".split(" "),i=/^([\-+])=\s*(\d+\.?\d*)/,s=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1]*2.55,e[2]*2.55,e[3]*2.55,e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],o=t.Color=function(e,n,r,i){return new t.Color.fn.parse(e,n,r,i)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},a={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},f=o.support={},l=t("<p>")[0],c,h=t.each;l.style.cssText="background-color:rgba(1,1,1,.5)",f.rgba=l.style.backgroundColor.indexOf("rgba")>-1,h(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),o.fn=t.extend(o.prototype,{parse:function(r,i,s,a){if(r===n)return this._rgba=[null,null,null,null],this;if(r.jquery||r.nodeType)r=t(r).css(i),i=n;var f=this,l=t.type(r),v=this._rgba=[];i!==n&&(r=[r,i,s,a],l="array");if(l==="string")return this.parse(d(r)||c._default);if(l==="array")return h(u.rgba.props,function(e,t){v[t.idx]=p(r[t.idx],t)}),this;if(l==="object")return r instanceof o?h(u,function(e,t){r[t.cache]&&(f[t.cache]=r[t.cache].slice())}):h(u,function(t,n){var i=n.cache;h(n.props,function(e,t){if(!f[i]&&n.to){if(e==="alpha"||r[e]==null)return;f[i]=n.to(f._rgba)}f[i][t.idx]=p(r[e],t,!0)}),f[i]&&e.inArray(null,f[i].slice(0,3))<0&&(f[i][3]=1,n.from&&(f._rgba=n.from(f[i])))}),this},is:function(e){var t=o(e),n=!0,r=this;return h(u,function(e,i){var s,o=t[i.cache];return o&&(s=r[i.cache]||i.to&&i.to(r._rgba)||[],h(i.props,function(e,t){if(o[t.idx]!=null)return n=o[t.idx]===s[t.idx],n})),n}),n},_space:function(){var e=[],t=this;return h(u,function(n,r){t[r.cache]&&e.push(n)}),e.pop()},transition:function(e,t){var n=o(e),r=n._space(),i=u[r],s=this.alpha()===0?o("transparent"):this,f=s[i.cache]||i.to(s._rgba),l=f.slice();return n=n[i.cache],h(i.props,function(e,r){var i=r.idx,s=f[i],o=n[i],u=a[r.type]||{};if(o===null)return;s===null?l[i]=o:(u.mod&&(o-s>u.mod/2?s+=u.mod:s-o>u.mod/2&&(s-=u.mod)),l[i]=p((o-s)*t+s,r))}),this[r](l)},blend:function(e){if(this._rgba[3]===1)return this;var n=this._rgba.slice(),r=n.pop(),i=o(e)._rgba;return o(t.map(n,function(e,t){return(1-r)*i[t]+r*e}))},toRgbaString:function(){var e="rgba(",n=t.map(this._rgba,function(e,t){return e==null?t>2?1:0:e});return n[3]===1&&(n.pop(),e="rgb("),e+n.join()+")"},toHslaString:function(){var e="hsla(",n=t.map(this.hsla(),function(e,t){return e==null&&(e=t>2?1:0),t&&t<3&&(e=Math.round(e*100)+"%"),e});return n[3]===1&&(n.pop(),e="hsl("),e+n.join()+")"},toHexString:function(e){var n=this._rgba.slice(),r=n.pop();return e&&n.push(~~(r*255)),"#"+t.map(n,function(e){return e=(e||0).toString(16),e.length===1?"0"+e:e}).join("")},toString:function(){return this._rgba[3]===0?"transparent":this.toRgbaString()}}),o.fn.parse.prototype=o.fn,u.hsla.to=function(e){if(e[0]==null||e[1]==null||e[2]==null)return[null,null,null,e[3]];var t=e[0]/255,n=e[1]/255,r=e[2]/255,i=e[3],s=Math.max(t,n,r),o=Math.min(t,n,r),u=s-o,a=s+o,f=a*.5,l,c;return o===s?l=0:t===s?l=60*(n-r)/u+360:n===s?l=60*(r-t)/u+120:l=60*(t-n)/u+240,f===0||f===1?c=f:f<=.5?c=u/a:c=u/(2-a),[Math.round(l)%360,c,f,i==null?1:i]},u.hsla.from=function(e){if(e[0]==null||e[1]==null||e[2]==null)return[null,null,null,e[3]];var t=e[0]/360,n=e[1],r=e[2],i=e[3],s=r<=.5?r*(1+n):r+n-r*n,o=2*r-s;return[Math.round(v(o,s,t+1/3)*255),Math.round(v(o,s,t)*255),Math.round(v(o,s,t-1/3)*255),i]},h(u,function(e,r){var s=r.props,u=r.cache,a=r.to,f=r.from;o.fn[e]=function(e){a&&!this[u]&&(this[u]=a(this._rgba));if(e===n)return this[u].slice();var r,i=t.type(e),l=i==="array"||i==="object"?e:arguments,c=this[u].slice();return h(s,function(e,t){var n=l[i==="object"?e:t.idx];n==null&&(n=c[t.idx]),c[t.idx]=p(n,t)}),f?(r=o(f(c)),r[u]=c,r):o(c)},h(s,function(n,r){if(o.fn[n])return;o.fn[n]=function(s){var o=t.type(s),u=n==="alpha"?this._hsla?"hsla":"rgba":e,a=this[u](),f=a[r.idx],l;return o==="undefined"?f:(o==="function"&&(s=s.call(this,f),o=t.type(s)),s==null&&r.empty?this:(o==="string"&&(l=i.exec(s),l&&(s=f+parseFloat(l[2])*(l[1]==="+"?1:-1))),a[r.idx]=s,this[u](a)))}})}),h(r,function(e,n){t.cssHooks[n]={set:function(e,r){var i,s,u="";if(t.type(r)!=="string"||(i=d(r))){r=o(i||r);if(!f.rgba&&r._rgba[3]!==1){s=n==="backgroundColor"?e.parentNode:e;while((u===""||u==="transparent")&&s&&s.style)try{u=t.css(s,"backgroundColor"),s=s.parentNode}catch(a){}r=r.blend(u&&u!=="transparent"?u:"_default")}r=r.toRgbaString()}try{e.style[n]=r}catch(l){}}},t.fx.step[n]=function(e){e.colorInit||(e.start=o(e.elem,n),e.end=o(e.end),e.colorInit=!0),t.cssHooks[n].set(e.elem,e.start.transition(e.end,e.pos))}}),t.cssHooks.borderColor={expand:function(e){var t={};return h(["Top","Right","Bottom","Left"],function(n,r){t["border"+r+"Color"]=e}),t}},c=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(jQuery),function(){function i(){var t=this.ownerDocument.defaultView?this.ownerDocument.defaultView.getComputedStyle(this,null):this.currentStyle,n={},r,i;if(t&&t.length&&t[0]&&t[t[0]]){i=t.length;while(i--)r=t[i],typeof t[r]=="string"&&(n[e.camelCase(r)]=t[r])}else for(r in t)typeof t[r]=="string"&&(n[r]=t[r]);return n}function s(t,n){var i={},s,o;for(s in n)o=n[s],t[s]!==o&&!r[s]&&(e.fx.step[s]||!isNaN(parseFloat(o)))&&(i[s]=o);return i}var n=["add","remove","toggle"],r={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,n){e.fx.step[n]=function(e){if(e.end!=="none"&&!e.setAttr||e.pos===1&&!e.setAttr)jQuery.style(e.elem,n,e.end),e.setAttr=!0}}),e.effects.animateClass=function(t,r,o,u){var a=e.speed(r,o,u);return this.queue(function(){var r=e(this),o=r.attr("class")||"",u,f=a.children?r.find("*").andSelf():r;f=f.map(function(){var t=e(this);return{el:t,start:i.call(this)}}),u=function(){e.each(n,function(e,n){t[n]&&r[n+"Class"](t[n])})},u(),f=f.map(function(){return this.end=i.call(this.el[0]),this.diff=s(this.start,this.end),this}),r.attr("class",o),f=f.map(function(){var t=this,n=e.Deferred(),r=jQuery.extend({},a,{queue:!1,complete:function(){n.resolve(t)}});return this.el.animate(this.diff,r),n.promise()}),e.when.apply(e,f.get()).done(function(){u(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),a.complete.call(r[0])})})},e.fn.extend({_addClass:e.fn.addClass,addClass:function(t,n,r,i){return n?e.effects.animateClass.call(this,{add:t},n,r,i):this._addClass(t)},_removeClass:e.fn.removeClass,removeClass:function(t,n,r,i){return n?e.effects.animateClass.call(this,{remove:t},n,r,i):this._removeClass(t)},_toggleClass:e.fn.toggleClass,toggleClass:function(n,r,i,s,o){return typeof r=="boolean"||r===t?i?e.effects.animateClass.call(this,r?{add:n}:{remove:n},i,s,o):this._toggleClass(n,r):e.effects.animateClass.call(this,{toggle:n},r,i,s)},switchClass:function(t,n,r,i,s){return e.effects.animateClass.call(this,{add:n,remove:t},r,i,s)}})}(),function(){function i(t,n,r,i){e.isPlainObject(t)&&(n=t,t=t.effect),t={effect:t},n==null&&(n={}),e.isFunction(n)&&(i=n,r=null,n={});if(typeof n=="number"||e.fx.speeds[n])i=r,r=n,n={};return e.isFunction(r)&&(i=r,r=null),n&&e.extend(t,n),r=r||n.duration,t.duration=e.fx.off?0:typeof r=="number"?r:r in e.fx.speeds?e.fx.speeds[r]:e.fx.speeds._default,t.complete=i||n.complete,t}function s(t){return!t||typeof t=="number"||e.fx.speeds[t]?!0:typeof t=="string"&&!e.effects.effect[t]?n&&e.effects[t]?!1:!0:!1}e.extend(e.effects,{version:"1.9.2",save:function(e,t){for(var n=0;n<t.length;n++)t[n]!==null&&e.data(r+t[n],e[0].style[t[n]])},restore:function(e,n){var i,s;for(s=0;s<n.length;s++)n[s]!==null&&(i=e.data(r+n[s]),i===t&&(i=""),e.css(n[s],i))},setMode:function(e,t){return t==="toggle"&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var n,r;switch(e[0]){case"top":n=0;break;case"middle":n=.5;break;case"bottom":n=1;break;default:n=e[0]/t.height}switch(e[1]){case"left":r=0;break;case"center":r=.5;break;case"right":r=1;break;default:r=e[1]/t.width}return{x:r,y:n}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var n={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},r=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),i={width:t.width(),height:t.height()},s=document.activeElement;try{s.id}catch(o){s=document.body}return t.wrap(r),(t[0]===s||e.contains(t[0],s))&&e(s).focus(),r=t.parent(),t.css("position")==="static"?(r.css({position:"relative"}),t.css({position:"relative"})):(e.extend(n,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,r){n[r]=t.css(r),isNaN(parseInt(n[r],10))&&(n[r]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(i),r.css(n).show()},removeWrapper:function(t){var n=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===n||e.contains(t[0],n))&&e(n).focus()),t},setTransition:function(t,n,r,i){return i=i||{},e.each(n,function(e,n){var s=t.cssUnit(n);s[0]>0&&(i[n]=s[0]*r+s[1])}),i}}),e.fn.extend({effect:function(){function a(n){function u(){e.isFunction(i)&&i.call(r[0]),e.isFunction(n)&&n()}var r=e(this),i=t.complete,s=t.mode;(r.is(":hidden")?s==="hide":s==="show")?u():o.call(r[0],t,u)}var t=i.apply(this,arguments),r=t.mode,s=t.queue,o=e.effects.effect[t.effect],u=!o&&n&&e.effects[t.effect];return e.fx.off||!o&&!u?r?this[r](t.duration,t.complete):this.each(function(){t.complete&&t.complete.call(this)}):o?s===!1?this.each(a):this.queue(s||"fx",a):u.call(this,{options:t,duration:t.duration,callback:t.complete,mode:t.mode})},_show:e.fn.show,show:function(e){if(s(e))return this._show.apply(this,arguments);var t=i.apply(this,arguments);return t.mode="show",this.effect.call(this,t)},_hide:e.fn.hide,hide:function(e){if(s(e))return this._hide.apply(this,arguments);var t=i.apply(this,arguments);return t.mode="hide",this.effect.call(this,t)},__toggle:e.fn.toggle,toggle:function(t){if(s(t)||typeof t=="boolean"||e.isFunction(t))return this.__toggle.apply(this,arguments);var n=i.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)},cssUnit:function(t){var n=this.css(t),r=[];return e.each(["em","px","%","pt"],function(e,t){n.indexOf(t)>0&&(r=[parseFloat(n),t])}),r}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,n){t[n]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return e===0||e===1?e:-Math.pow(2,8*(e-1))*Math.sin(((e-1)*80-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){var t,n=4;while(e<((t=Math.pow(2,--n))-1)/11);return 1/Math.pow(4,3-n)-7.5625*Math.pow((t*3-2)/22-e,2)}}),e.each(t,function(t,n){e.easing["easeIn"+t]=n,e.easing["easeOut"+t]=function(e){return 1-n(1-e)},e.easing["easeInOut"+t]=function(e){return e<.5?n(e*2)/2:1-n(e*-2+2)/2}})}()}(jQuery);(function(e,t){var n=/up|down|vertical/,r=/up|left|vertical|horizontal/;e.effects.effect.blind=function(t,i){var s=e(this),o=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(s,t.mode||"hide"),a=t.direction||"up",f=n.test(a),l=f?"height":"width",c=f?"top":"left",h=r.test(a),p={},d=u==="show",v,m,g;s.parent().is(".ui-effects-wrapper")?e.effects.save(s.parent(),o):e.effects.save(s,o),s.show(),v=e.effects.createWrapper(s).css({overflow:"hidden"}),m=v[l](),g=parseFloat(v.css(c))||0,p[l]=d?m:0,h||(s.css(f?"bottom":"right",0).css(f?"top":"left","auto").css({position:"absolute"}),p[c]=d?g:m+g),d&&(v.css(l,0),h||v.css(c,g+m)),v.animate(p,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){u==="hide"&&s.hide(),e.effects.restore(s,o),e.effects.removeWrapper(s),i()}})}})(jQuery);(function(e,t){e.effects.effect.bounce=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"effect"),o=s==="hide",u=s==="show",a=t.direction||"up",f=t.distance,l=t.times||5,c=l*2+(u||o?1:0),h=t.duration/c,p=t.easing,d=a==="up"||a==="down"?"top":"left",v=a==="up"||a==="left",m,g,y,b=r.queue(),w=b.length;(u||o)&&i.push("opacity"),e.effects.save(r,i),r.show(),e.effects.createWrapper(r),f||(f=r[d==="top"?"outerHeight":"outerWidth"]()/3),u&&(y={opacity:1},y[d]=0,r.css("opacity",0).css(d,v?-f*2:f*2).animate(y,h,p)),o&&(f/=Math.pow(2,l-1)),y={},y[d]=0;for(m=0;m<l;m++)g={},g[d]=(v?"-=":"+=")+f,r.animate(g,h,p).animate(y,h,p),f=o?f*2:f/2;o&&(g={opacity:0},g[d]=(v?"-=":"+=")+f,r.animate(g,h,p)),r.queue(function(){o&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}),w>1&&b.splice.apply(b,[1,0].concat(b.splice(w,c+1))),r.dequeue()}})(jQuery);(function(e,t){e.effects.effect.clip=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"hide"),o=s==="show",u=t.direction||"vertical",a=u==="vertical",f=a?"height":"width",l=a?"top":"left",c={},h,p,d;e.effects.save(r,i),r.show(),h=e.effects.createWrapper(r).css({overflow:"hidden"}),p=r[0].tagName==="IMG"?h:r,d=p[f](),o&&(p.css(f,0),p.css(l,d/2)),c[f]=o?d:0,c[l]=o?0:d/2,p.animate(c,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){o||r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}})}})(jQuery);(function(e,t){e.effects.effect.drop=function(t,n){var r=e(this),i=["position","top","bottom","left","right","opacity","height","width"],s=e.effects.setMode(r,t.mode||"hide"),o=s==="show",u=t.direction||"left",a=u==="up"||u==="down"?"top":"left",f=u==="up"||u==="left"?"pos":"neg",l={opacity:o?1:0},c;e.effects.save(r,i),r.show(),e.effects.createWrapper(r),c=t.distance||r[a==="top"?"outerHeight":"outerWidth"](!0)/2,o&&r.css("opacity",0).css(a,f==="pos"?-c:c),l[a]=(o?f==="pos"?"+=":"-=":f==="pos"?"-=":"+=")+c,r.animate(l,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){s==="hide"&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}})}})(jQuery);(function(e,t){e.effects.effect.explode=function(t,n){function y(){c.push(this),c.length===r*i&&b()}function b(){s.css({visibility:"visible"}),e(c).remove(),u||s.hide(),n()}var r=t.pieces?Math.round(Math.sqrt(t.pieces)):3,i=r,s=e(this),o=e.effects.setMode(s,t.mode||"hide"),u=o==="show",a=s.show().css("visibility","hidden").offset(),f=Math.ceil(s.outerWidth()/i),l=Math.ceil(s.outerHeight()/r),c=[],h,p,d,v,m,g;for(h=0;h<r;h++){v=a.top+h*l,g=h-(r-1)/2;for(p=0;p<i;p++)d=a.left+p*f,m=p-(i-1)/2,s.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-p*f,top:-h*l}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:f,height:l,left:d+(u?m*f:0),top:v+(u?g*l:0),opacity:u?0:1}).animate({left:d+(u?0:m*f),top:v+(u?0:g*l),opacity:u?1:0},t.duration||500,t.easing,y)}}})(jQuery);(function(e,t){e.effects.effect.fade=function(t,n){var r=e(this),i=e.effects.setMode(r,t.mode||"toggle");r.animate({opacity:i},{queue:!1,duration:t.duration,easing:t.easing,complete:n})}})(jQuery);(function(e,t){e.effects.effect.fold=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"hide"),o=s==="show",u=s==="hide",a=t.size||15,f=/([0-9]+)%/.exec(a),l=!!t.horizFirst,c=o!==l,h=c?["width","height"]:["height","width"],p=t.duration/2,d,v,m={},g={};e.effects.save(r,i),r.show(),d=e.effects.createWrapper(r).css({overflow:"hidden"}),v=c?[d.width(),d.height()]:[d.height(),d.width()],f&&(a=parseInt(f[1],10)/100*v[u?0:1]),o&&d.css(l?{height:0,width:a}:{height:a,width:0}),m[h[0]]=o?v[0]:a,g[h[1]]=o?v[1]:0,d.animate(m,p,t.easing).animate(g,p,t.easing,function(){u&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()})}})(jQuery);(function(e,t){e.effects.effect.highlight=function(t,n){var r=e(this),i=["backgroundImage","backgroundColor","opacity"],s=e.effects.setMode(r,t.mode||"show"),o={backgroundColor:r.css("backgroundColor")};s==="hide"&&(o.opacity=0),e.effects.save(r,i),r.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){s==="hide"&&r.hide(),e.effects.restore(r,i),n()}})}})(jQuery);(function(e,t){e.effects.effect.pulsate=function(t,n){var r=e(this),i=e.effects.setMode(r,t.mode||"show"),s=i==="show",o=i==="hide",u=s||i==="hide",a=(t.times||5)*2+(u?1:0),f=t.duration/a,l=0,c=r.queue(),h=c.length,p;if(s||!r.is(":visible"))r.css("opacity",0).show(),l=1;for(p=1;p<a;p++)r.animate({opacity:l},f,t.easing),l=1-l;r.animate({opacity:l},f,t.easing),r.queue(function(){o&&r.hide(),n()}),h>1&&c.splice.apply(c,[1,0].concat(c.splice(h,a+1))),r.dequeue()}})(jQuery);(function(e,t){e.effects.effect.puff=function(t,n){var r=e(this),i=e.effects.setMode(r,t.mode||"hide"),s=i==="hide",o=parseInt(t.percent,10)||150,u=o/100,a={height:r.height(),width:r.width(),outerHeight:r.outerHeight(),outerWidth:r.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:i,complete:n,percent:s?o:100,from:s?a:{height:a.height*u,width:a.width*u,outerHeight:a.outerHeight*u,outerWidth:a.outerWidth*u}}),r.effect(t)},e.effects.effect.scale=function(t,n){var r=e(this),i=e.extend(!0,{},t),s=e.effects.setMode(r,t.mode||"effect"),o=parseInt(t.percent,10)||(parseInt(t.percent,10)===0?0:s==="hide"?0:100),u=t.direction||"both",a=t.origin,f={height:r.height(),width:r.width(),outerHeight:r.outerHeight(),outerWidth:r.outerWidth()},l={y:u!=="horizontal"?o/100:1,x:u!=="vertical"?o/100:1};i.effect="size",i.queue=!1,i.complete=n,s!=="effect"&&(i.origin=a||["middle","center"],i.restore=!0),i.from=t.from||(s==="show"?{height:0,width:0,outerHeight:0,outerWidth:0}:f),i.to={height:f.height*l.y,width:f.width*l.x,outerHeight:f.outerHeight*l.y,outerWidth:f.outerWidth*l.x},i.fade&&(s==="show"&&(i.from.opacity=0,i.to.opacity=1),s==="hide"&&(i.from.opacity=1,i.to.opacity=0)),r.effect(i)},e.effects.effect.size=function(t,n){var r,i,s,o=e(this),u=["position","top","bottom","left","right","width","height","overflow","opacity"],a=["position","top","bottom","left","right","overflow","opacity"],f=["width","height","overflow"],l=["fontSize"],c=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],h=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),d=t.restore||p!=="effect",v=t.scale||"both",m=t.origin||["middle","center"],g=o.css("position"),y=d?u:a,b={height:0,width:0,outerHeight:0,outerWidth:0};p==="show"&&o.show(),r={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},t.mode==="toggle"&&p==="show"?(o.from=t.to||b,o.to=t.from||r):(o.from=t.from||(p==="show"?b:r),o.to=t.to||(p==="hide"?b:r)),s={from:{y:o.from.height/r.height,x:o.from.width/r.width},to:{y:o.to.height/r.height,x:o.to.width/r.width}};if(v==="box"||v==="both")s.from.y!==s.to.y&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,s.from.y,o.from),o.to=e.effects.setTransition(o,c,s.to.y,o.to)),s.from.x!==s.to.x&&(y=y.concat(h),o.from=e.effects.setTransition(o,h,s.from.x,o.from),o.to=e.effects.setTransition(o,h,s.to.x,o.to));(v==="content"||v==="both")&&s.from.y!==s.to.y&&(y=y.concat(l).concat(f),o.from=e.effects.setTransition(o,l,s.from.y,o.from),o.to=e.effects.setTransition(o,l,s.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),m&&(i=e.effects.getBaseline(m,r),o.from.top=(r.outerHeight-o.outerHeight())*i.y,o.from.left=(r.outerWidth-o.outerWidth())*i.x,o.to.top=(r.outerHeight-o.to.outerHeight)*i.y,o.to.left=(r.outerWidth-o.to.outerWidth)*i.x),o.css(o.from);if(v==="content"||v==="both")c=c.concat(["marginTop","marginBottom"]).concat(l),h=h.concat(["marginLeft","marginRight"]),f=u.concat(c).concat(h),o.find("*[width]").each(function(){var n=e(this),r={height:n.height(),width:n.width(),outerHeight:n.outerHeight(),outerWidth:n.outerWidth()};d&&e.effects.save(n,f),n.from={height:r.height*s.from.y,width:r.width*s.from.x,outerHeight:r.outerHeight*s.from.y,outerWidth:r.outerWidth*s.from.x},n.to={height:r.height*s.to.y,width:r.width*s.to.x,outerHeight:r.height*s.to.y,outerWidth:r.width*s.to.x},s.from.y!==s.to.y&&(n.from=e.effects.setTransition(n,c,s.from.y,n.from),n.to=e.effects.setTransition(n,c,s.to.y,n.to)),s.from.x!==s.to.x&&(n.from=e.effects.setTransition(n,h,s.from.x,n.from),n.to=e.effects.setTransition(n,h,s.to.x,n.to)),n.css(n.from),n.animate(n.to,t.duration,t.easing,function(){d&&e.effects.restore(n,f)})});o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){o.to.opacity===0&&o.css("opacity",o.from.opacity),p==="hide"&&o.hide(),e.effects.restore(o,y),d||(g==="static"?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,n){var r=parseInt(n,10),i=e?o.to.left:o.to.top;return n==="auto"?i+"px":r+i+"px"})})),e.effects.removeWrapper(o),n()}})}})(jQuery);(function(e,t){e.effects.effect.shake=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"effect"),o=t.direction||"left",u=t.distance||20,a=t.times||3,f=a*2+1,l=Math.round(t.duration/f),c=o==="up"||o==="down"?"top":"left",h=o==="up"||o==="left",p={},d={},v={},m,g=r.queue(),y=g.length;e.effects.save(r,i),r.show(),e.effects.createWrapper(r),p[c]=(h?"-=":"+=")+u,d[c]=(h?"+=":"-=")+u*2,v[c]=(h?"-=":"+=")+u*2,r.animate(p,l,t.easing);for(m=1;m<a;m++)r.animate(d,l,t.easing).animate(v,l,t.easing);r.animate(d,l,t.easing).animate(p,l/2,t.easing).queue(function(){s==="hide"&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}),y>1&&g.splice.apply(g,[1,0].concat(g.splice(y,f+1))),r.dequeue()}})(jQuery);(function(e,t){e.effects.effect.slide=function(t,n){var r=e(this),i=["position","top","bottom","left","right","width","height"],s=e.effects.setMode(r,t.mode||"show"),o=s==="show",u=t.direction||"left",a=u==="up"||u==="down"?"top":"left",f=u==="up"||u==="left",l,c={};e.effects.save(r,i),r.show(),l=t.distance||r[a==="top"?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(r).css({overflow:"hidden"}),o&&r.css(a,f?isNaN(l)?"-"+l:-l:l),c[a]=(o?f?"+=":"-=":f?"-=":"+=")+l,r.animate(c,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){s==="hide"&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}})}})(jQuery);(function(e,t){e.effects.effect.transfer=function(t,n){var r=e(this),i=e(t.to),s=i.css("position")==="fixed",o=e("body"),u=s?o.scrollTop():0,a=s?o.scrollLeft():0,f=i.offset(),l={top:f.top-u,left:f.left-a,height:i.innerHeight(),width:i.innerWidth()},c=r.offset(),h=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(t.className).css({top:c.top-u,left:c.left-a,height:r.innerHeight(),width:r.innerWidth(),position:s?"fixed":"absolute"}).animate(l,t.duration,t.easing,function(){h.remove(),n()})}})(jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery-ui/js/ui/jquery.ui.core.js b/src/main/webapp/plug-in/jquery-ui/js/ui/jquery.ui.core.js
    new file mode 100644
    index 00000000..4ef4b761
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-ui/js/ui/jquery.ui.core.js
    @@ -0,0 +1,356 @@
    +/*!
    + * jQuery UI Core 1.9.2
    + * http://jqueryui.com
    + *
    + * Copyright 2012 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/category/ui-core/
    + */
    +(function( $, undefined ) {
    +
    +var uuid = 0,
    +	runiqueId = /^ui-id-\d+$/;
    +
    +// prevent duplicate loading
    +// this is only a problem because we proxy existing functions
    +// and we don't want to double proxy them
    +$.ui = $.ui || {};
    +if ( $.ui.version ) {
    +	return;
    +}
    +
    +$.extend( $.ui, {
    +	version: "1.9.2",
    +
    +	keyCode: {
    +		BACKSPACE: 8,
    +		COMMA: 188,
    +		DELETE: 46,
    +		DOWN: 40,
    +		END: 35,
    +		ENTER: 13,
    +		ESCAPE: 27,
    +		HOME: 36,
    +		LEFT: 37,
    +		NUMPAD_ADD: 107,
    +		NUMPAD_DECIMAL: 110,
    +		NUMPAD_DIVIDE: 111,
    +		NUMPAD_ENTER: 108,
    +		NUMPAD_MULTIPLY: 106,
    +		NUMPAD_SUBTRACT: 109,
    +		PAGE_DOWN: 34,
    +		PAGE_UP: 33,
    +		PERIOD: 190,
    +		RIGHT: 39,
    +		SPACE: 32,
    +		TAB: 9,
    +		UP: 38
    +	}
    +});
    +
    +// plugins
    +$.fn.extend({
    +	_focus: $.fn.focus,
    +	focus: function( delay, fn ) {
    +		return typeof delay === "number" ?
    +			this.each(function() {
    +				var elem = this;
    +				setTimeout(function() {
    +					$( elem ).focus();
    +					if ( fn ) {
    +						fn.call( elem );
    +					}
    +				}, delay );
    +			}) :
    +			this._focus.apply( this, arguments );
    +	},
    +
    +	scrollParent: function() {
    +		var scrollParent;
    +		if (($.ui.ie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
    +			scrollParent = this.parents().filter(function() {
    +				return (/(relative|absolute|fixed)/).test($.css(this,'position')) && (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
    +			}).eq(0);
    +		} else {
    +			scrollParent = this.parents().filter(function() {
    +				return (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
    +			}).eq(0);
    +		}
    +
    +		return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
    +	},
    +
    +	zIndex: function( zIndex ) {
    +		if ( zIndex !== undefined ) {
    +			return this.css( "zIndex", zIndex );
    +		}
    +
    +		if ( this.length ) {
    +			var elem = $( this[ 0 ] ), position, value;
    +			while ( elem.length && elem[ 0 ] !== document ) {
    +				// Ignore z-index if position is set to a value where z-index is ignored by the browser
    +				// This makes behavior of this function consistent across browsers
    +				// WebKit always returns auto if the element is positioned
    +				position = elem.css( "position" );
    +				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
    +					// IE returns 0 when zIndex is not specified
    +					// other browsers return a string
    +					// we ignore the case of nested elements with an explicit value of 0
    +					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
    +					value = parseInt( elem.css( "zIndex" ), 10 );
    +					if ( !isNaN( value ) && value !== 0 ) {
    +						return value;
    +					}
    +				}
    +				elem = elem.parent();
    +			}
    +		}
    +
    +		return 0;
    +	},
    +
    +	uniqueId: function() {
    +		return this.each(function() {
    +			if ( !this.id ) {
    +				this.id = "ui-id-" + (++uuid);
    +			}
    +		});
    +	},
    +
    +	removeUniqueId: function() {
    +		return this.each(function() {
    +			if ( runiqueId.test( this.id ) ) {
    +				$( this ).removeAttr( "id" );
    +			}
    +		});
    +	}
    +});
    +
    +// selectors
    +function focusable( element, isTabIndexNotNaN ) {
    +	var map, mapName, img,
    +		nodeName = element.nodeName.toLowerCase();
    +	if ( "area" === nodeName ) {
    +		map = element.parentNode;
    +		mapName = map.name;
    +		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
    +			return false;
    +		}
    +		img = $( "img[usemap=#" + mapName + "]" )[0];
    +		return !!img && visible( img );
    +	}
    +	return ( /input|select|textarea|button|object/.test( nodeName ) ?
    +		!element.disabled :
    +		"a" === nodeName ?
    +			element.href || isTabIndexNotNaN :
    +			isTabIndexNotNaN) &&
    +		// the element and all of its ancestors must be visible
    +		visible( element );
    +}
    +
    +function visible( element ) {
    +	return $.expr.filters.visible( element ) &&
    +		!$( element ).parents().andSelf().filter(function() {
    +			return $.css( this, "visibility" ) === "hidden";
    +		}).length;
    +}
    +
    +$.extend( $.expr[ ":" ], {
    +	data: $.expr.createPseudo ?
    +		$.expr.createPseudo(function( dataName ) {
    +			return function( elem ) {
    +				return !!$.data( elem, dataName );
    +			};
    +		}) :
    +		// support: jQuery <1.8
    +		function( elem, i, match ) {
    +			return !!$.data( elem, match[ 3 ] );
    +		},
    +
    +	focusable: function( element ) {
    +		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
    +	},
    +
    +	tabbable: function( element ) {
    +		var tabIndex = $.attr( element, "tabindex" ),
    +			isTabIndexNaN = isNaN( tabIndex );
    +		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
    +	}
    +});
    +
    +// support
    +$(function() {
    +	var body = document.body,
    +		div = body.appendChild( div = document.createElement( "div" ) );
    +
    +	// access offsetHeight before setting the style to prevent a layout bug
    +	// in IE 9 which causes the element to continue to take up space even
    +	// after it is removed from the DOM (#8026)
    +	div.offsetHeight;
    +
    +	$.extend( div.style, {
    +		minHeight: "100px",
    +		height: "auto",
    +		padding: 0,
    +		borderWidth: 0
    +	});
    +
    +	$.support.minHeight = div.offsetHeight === 100;
    +	$.support.selectstart = "onselectstart" in div;
    +
    +	// set display to none to avoid a layout bug in IE
    +	// http://dev.jquery.com/ticket/4014
    +	body.removeChild( div ).style.display = "none";
    +});
    +
    +// support: jQuery <1.8
    +if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
    +	$.each( [ "Width", "Height" ], function( i, name ) {
    +		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
    +			type = name.toLowerCase(),
    +			orig = {
    +				innerWidth: $.fn.innerWidth,
    +				innerHeight: $.fn.innerHeight,
    +				outerWidth: $.fn.outerWidth,
    +				outerHeight: $.fn.outerHeight
    +			};
    +
    +		function reduce( elem, size, border, margin ) {
    +			$.each( side, function() {
    +				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
    +				if ( border ) {
    +					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
    +				}
    +				if ( margin ) {
    +					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
    +				}
    +			});
    +			return size;
    +		}
    +
    +		$.fn[ "inner" + name ] = function( size ) {
    +			if ( size === undefined ) {
    +				return orig[ "inner" + name ].call( this );
    +			}
    +
    +			return this.each(function() {
    +				$( this ).css( type, reduce( this, size ) + "px" );
    +			});
    +		};
    +
    +		$.fn[ "outer" + name] = function( size, margin ) {
    +			if ( typeof size !== "number" ) {
    +				return orig[ "outer" + name ].call( this, size );
    +			}
    +
    +			return this.each(function() {
    +				$( this).css( type, reduce( this, size, true, margin ) + "px" );
    +			});
    +		};
    +	});
    +}
    +
    +// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
    +if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
    +	$.fn.removeData = (function( removeData ) {
    +		return function( key ) {
    +			if ( arguments.length ) {
    +				return removeData.call( this, $.camelCase( key ) );
    +			} else {
    +				return removeData.call( this );
    +			}
    +		};
    +	})( $.fn.removeData );
    +}
    +
    +
    +
    +
    +
    +// deprecated
    +
    +(function() {
    +	var uaMatch = /msie ([\w.]+)/.exec( navigator.userAgent.toLowerCase() ) || [];
    +	$.ui.ie = uaMatch.length ? true : false;
    +	$.ui.ie6 = parseFloat( uaMatch[ 1 ], 10 ) === 6;
    +})();
    +
    +$.fn.extend({
    +	disableSelection: function() {
    +		return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
    +			".ui-disableSelection", function( event ) {
    +				event.preventDefault();
    +			});
    +	},
    +
    +	enableSelection: function() {
    +		return this.unbind( ".ui-disableSelection" );
    +	}
    +});
    +
    +$.extend( $.ui, {
    +	// $.ui.plugin is deprecated.  Use the proxy pattern instead.
    +	plugin: {
    +		add: function( module, option, set ) {
    +			var i,
    +				proto = $.ui[ module ].prototype;
    +			for ( i in set ) {
    +				proto.plugins[ i ] = proto.plugins[ i ] || [];
    +				proto.plugins[ i ].push( [ option, set[ i ] ] );
    +			}
    +		},
    +		call: function( instance, name, args ) {
    +			var i,
    +				set = instance.plugins[ name ];
    +			if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
    +				return;
    +			}
    +
    +			for ( i = 0; i < set.length; i++ ) {
    +				if ( instance.options[ set[ i ][ 0 ] ] ) {
    +					set[ i ][ 1 ].apply( instance.element, args );
    +				}
    +			}
    +		}
    +	},
    +
    +	contains: $.contains,
    +
    +	// only used by resizable
    +	hasScroll: function( el, a ) {
    +
    +		//If overflow is hidden, the element might have extra content, but the user wants to hide it
    +		if ( $( el ).css( "overflow" ) === "hidden") {
    +			return false;
    +		}
    +
    +		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
    +			has = false;
    +
    +		if ( el[ scroll ] > 0 ) {
    +			return true;
    +		}
    +
    +		// TODO: determine which cases actually cause this to happen
    +		// if the element doesn't have the scroll set, see if it's possible to
    +		// set the scroll
    +		el[ scroll ] = 1;
    +		has = ( el[ scroll ] > 0 );
    +		el[ scroll ] = 0;
    +		return has;
    +	},
    +
    +	// these are odd functions, fix the API or move into individual plugins
    +	isOverAxis: function( x, reference, size ) {
    +		//Determines when x coordinate is over "b" element axis
    +		return ( x > reference ) && ( x < ( reference + size ) );
    +	},
    +	isOver: function( y, x, top, left, height, width ) {
    +		//Determines when x, y coordinates is over "b" element
    +		return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
    +	}
    +});
    +
    +})( jQuery );
    diff --git a/src/main/webapp/plug-in/jquery-ui/js/ui/jquery.ui.mouse.js b/src/main/webapp/plug-in/jquery-ui/js/ui/jquery.ui.mouse.js
    new file mode 100644
    index 00000000..250365fe
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-ui/js/ui/jquery.ui.mouse.js
    @@ -0,0 +1,169 @@
    +/*!
    + * jQuery UI Mouse 1.9.2
    + * http://jqueryui.com
    + *
    + * Copyright 2012 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/mouse/
    + *
    + * Depends:
    + *	jquery.ui.widget.js
    + */
    +(function( $, undefined ) {
    +
    +var mouseHandled = false;
    +$( document ).mouseup( function( e ) {
    +	mouseHandled = false;
    +});
    +
    +$.widget("ui.mouse", {
    +	version: "1.9.2",
    +	options: {
    +		cancel: 'input,textarea,button,select,option',
    +		distance: 1,
    +		delay: 0
    +	},
    +	_mouseInit: function() {
    +		var that = this;
    +
    +		this.element
    +			.bind('mousedown.'+this.widgetName, function(event) {
    +				return that._mouseDown(event);
    +			})
    +			.bind('click.'+this.widgetName, function(event) {
    +				if (true === $.data(event.target, that.widgetName + '.preventClickEvent')) {
    +					$.removeData(event.target, that.widgetName + '.preventClickEvent');
    +					event.stopImmediatePropagation();
    +					return false;
    +				}
    +			});
    +
    +		this.started = false;
    +	},
    +
    +	// TODO: make sure destroying one instance of mouse doesn't mess with
    +	// other instances of mouse
    +	_mouseDestroy: function() {
    +		this.element.unbind('.'+this.widgetName);
    +		if ( this._mouseMoveDelegate ) {
    +			$(document)
    +				.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
    +				.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
    +		}
    +	},
    +
    +	_mouseDown: function(event) {
    +		// don't let more than one widget handle mouseStart
    +		if( mouseHandled ) { return; }
    +
    +		// we may have missed mouseup (out of window)
    +		(this._mouseStarted && this._mouseUp(event));
    +
    +		this._mouseDownEvent = event;
    +
    +		var that = this,
    +			btnIsLeft = (event.which === 1),
    +			// event.target.nodeName works around a bug in IE 8 with
    +			// disabled inputs (#7620)
    +			elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
    +		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
    +			return true;
    +		}
    +
    +		this.mouseDelayMet = !this.options.delay;
    +		if (!this.mouseDelayMet) {
    +			this._mouseDelayTimer = setTimeout(function() {
    +				that.mouseDelayMet = true;
    +			}, this.options.delay);
    +		}
    +
    +		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
    +			this._mouseStarted = (this._mouseStart(event) !== false);
    +			if (!this._mouseStarted) {
    +				event.preventDefault();
    +				return true;
    +			}
    +		}
    +
    +		// Click event may never have fired (Gecko & Opera)
    +		if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
    +			$.removeData(event.target, this.widgetName + '.preventClickEvent');
    +		}
    +
    +		// these delegates are required to keep context
    +		this._mouseMoveDelegate = function(event) {
    +			return that._mouseMove(event);
    +		};
    +		this._mouseUpDelegate = function(event) {
    +			return that._mouseUp(event);
    +		};
    +		$(document)
    +			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
    +			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
    +
    +		event.preventDefault();
    +
    +		mouseHandled = true;
    +		return true;
    +	},
    +
    +	_mouseMove: function(event) {
    +		// IE mouseup check - mouseup happened when mouse was out of window
    +		if ($.ui.ie && !(document.documentMode >= 9) && !event.button) {
    +			return this._mouseUp(event);
    +		}
    +
    +		if (this._mouseStarted) {
    +			this._mouseDrag(event);
    +			return event.preventDefault();
    +		}
    +
    +		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
    +			this._mouseStarted =
    +				(this._mouseStart(this._mouseDownEvent, event) !== false);
    +			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
    +		}
    +
    +		return !this._mouseStarted;
    +	},
    +
    +	_mouseUp: function(event) {
    +		$(document)
    +			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
    +			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
    +
    +		if (this._mouseStarted) {
    +			this._mouseStarted = false;
    +
    +			if (event.target === this._mouseDownEvent.target) {
    +				$.data(event.target, this.widgetName + '.preventClickEvent', true);
    +			}
    +
    +			this._mouseStop(event);
    +		}
    +
    +		return false;
    +	},
    +
    +	_mouseDistanceMet: function(event) {
    +		return (Math.max(
    +				Math.abs(this._mouseDownEvent.pageX - event.pageX),
    +				Math.abs(this._mouseDownEvent.pageY - event.pageY)
    +			) >= this.options.distance
    +		);
    +	},
    +
    +	_mouseDelayMet: function(event) {
    +		return this.mouseDelayMet;
    +	},
    +
    +	// These are placeholder methods, to be overriden by extending plugin
    +	_mouseStart: function(event) {},
    +	_mouseDrag: function(event) {},
    +	_mouseStop: function(event) {},
    +	_mouseCapture: function(event) { return true; }
    +});
    +
    +})(jQuery);
    diff --git a/src/main/webapp/plug-in/jquery-ui/js/ui/jquery.ui.sortable.js b/src/main/webapp/plug-in/jquery-ui/js/ui/jquery.ui.sortable.js
    new file mode 100644
    index 00000000..bd960df3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-ui/js/ui/jquery.ui.sortable.js
    @@ -0,0 +1,1096 @@
    +/*!
    + * jQuery UI Sortable 1.9.2
    + * http://jqueryui.com
    + *
    + * Copyright 2012 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/sortable/
    + *
    + * Depends:
    + *	jquery.ui.core.js
    + *	jquery.ui.mouse.js
    + *	jquery.ui.widget.js
    + */
    +(function( $, undefined ) {
    +
    +$.widget("ui.sortable", $.ui.mouse, {
    +	version: "1.9.2",
    +	widgetEventPrefix: "sort",
    +	ready: false,
    +	options: {
    +		appendTo: "parent",
    +		axis: false,
    +		connectWith: false,
    +		containment: false,
    +		cursor: 'auto',
    +		cursorAt: false,
    +		dropOnEmpty: true,
    +		forcePlaceholderSize: false,
    +		forceHelperSize: false,
    +		grid: false,
    +		handle: false,
    +		helper: "original",
    +		items: '> *',
    +		opacity: false,
    +		placeholder: false,
    +		revert: false,
    +		scroll: true,
    +		scrollSensitivity: 20,
    +		scrollSpeed: 20,
    +		scope: "default",
    +		tolerance: "intersect",
    +		zIndex: 1000
    +	},
    +	_create: function() {
    +
    +		var o = this.options;
    +		this.containerCache = {};
    +		this.element.addClass("ui-sortable");
    +
    +		//Get the items
    +		this.refresh();
    +
    +		//Let's determine if the items are being displayed horizontally
    +		this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
    +
    +		//Let's determine the parent's offset
    +		this.offset = this.element.offset();
    +
    +		//Initialize mouse events for interaction
    +		this._mouseInit();
    +
    +		//We're ready to go
    +		this.ready = true
    +
    +	},
    +
    +	_destroy: function() {
    +		this.element
    +			.removeClass("ui-sortable ui-sortable-disabled");
    +		this._mouseDestroy();
    +
    +		for ( var i = this.items.length - 1; i >= 0; i-- )
    +			this.items[i].item.removeData(this.widgetName + "-item");
    +
    +		return this;
    +	},
    +
    +	_setOption: function(key, value){
    +		if ( key === "disabled" ) {
    +			this.options[ key ] = value;
    +
    +			this.widget().toggleClass( "ui-sortable-disabled", !!value );
    +		} else {
    +			// Don't call widget base _setOption for disable as it adds ui-state-disabled class
    +			$.Widget.prototype._setOption.apply(this, arguments);
    +		}
    +	},
    +
    +	_mouseCapture: function(event, overrideHandle) {
    +		var that = this;
    +
    +		if (this.reverting) {
    +			return false;
    +		}
    +
    +		if(this.options.disabled || this.options.type == 'static') return false;
    +
    +		//We have to refresh the items data once first
    +		this._refreshItems(event);
    +
    +		//Find out if the clicked node (or one of its parents) is a actual item in this.items
    +		var currentItem = null, nodes = $(event.target).parents().each(function() {
    +			if($.data(this, that.widgetName + '-item') == that) {
    +				currentItem = $(this);
    +				return false;
    +			}
    +		});
    +		if($.data(event.target, that.widgetName + '-item') == that) currentItem = $(event.target);
    +
    +		if(!currentItem) return false;
    +		if(this.options.handle && !overrideHandle) {
    +			var validHandle = false;
    +
    +			$(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
    +			if(!validHandle) return false;
    +		}
    +
    +		this.currentItem = currentItem;
    +		this._removeCurrentsFromItems();
    +		return true;
    +
    +	},
    +
    +	_mouseStart: function(event, overrideHandle, noActivation) {
    +
    +		var o = this.options;
    +		this.currentContainer = this;
    +
    +		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
    +		this.refreshPositions();
    +
    +		//Create and append the visible helper
    +		this.helper = this._createHelper(event);
    +
    +		//Cache the helper size
    +		this._cacheHelperProportions();
    +
    +		/*
    +		 * - Position generation -
    +		 * This block generates everything position related - it's the core of draggables.
    +		 */
    +
    +		//Cache the margins of the original element
    +		this._cacheMargins();
    +
    +		//Get the next scrolling parent
    +		this.scrollParent = this.helper.scrollParent();
    +
    +		//The element's absolute position on the page minus margins
    +		this.offset = this.currentItem.offset();
    +		this.offset = {
    +			top: this.offset.top - this.margins.top,
    +			left: this.offset.left - this.margins.left
    +		};
    +
    +		$.extend(this.offset, {
    +			click: { //Where the click happened, relative to the element
    +				left: event.pageX - this.offset.left,
    +				top: event.pageY - this.offset.top
    +			},
    +			parent: this._getParentOffset(),
    +			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
    +		});
    +
    +		// Only after we got the offset, we can change the helper's position to absolute
    +		// TODO: Still need to figure out a way to make relative sorting possible
    +		this.helper.css("position", "absolute");
    +		this.cssPosition = this.helper.css("position");
    +
    +		//Generate the original position
    +		this.originalPosition = this._generatePosition(event);
    +		this.originalPageX = event.pageX;
    +		this.originalPageY = event.pageY;
    +
    +		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
    +		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
    +
    +		//Cache the former DOM position
    +		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
    +
    +		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
    +		if(this.helper[0] != this.currentItem[0]) {
    +			this.currentItem.hide();
    +		}
    +
    +		//Create the placeholder
    +		this._createPlaceholder();
    +
    +		//Set a containment if given in the options
    +		if(o.containment)
    +			this._setContainment();
    +
    +		if(o.cursor) { // cursor option
    +			if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
    +			$('body').css("cursor", o.cursor);
    +		}
    +
    +		if(o.opacity) { // opacity option
    +			if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
    +			this.helper.css("opacity", o.opacity);
    +		}
    +
    +		if(o.zIndex) { // zIndex option
    +			if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
    +			this.helper.css("zIndex", o.zIndex);
    +		}
    +
    +		//Prepare scrolling
    +		if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
    +			this.overflowOffset = this.scrollParent.offset();
    +
    +		//Call callbacks
    +		this._trigger("start", event, this._uiHash());
    +
    +		//Recache the helper size
    +		if(!this._preserveHelperProportions)
    +			this._cacheHelperProportions();
    +
    +
    +		//Post 'activate' events to possible containers
    +		if(!noActivation) {
    +			 for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, this._uiHash(this)); }
    +		}
    +
    +		//Prepare possible droppables
    +		if($.ui.ddmanager)
    +			$.ui.ddmanager.current = this;
    +
    +		if ($.ui.ddmanager && !o.dropBehaviour)
    +			$.ui.ddmanager.prepareOffsets(this, event);
    +
    +		this.dragging = true;
    +
    +		this.helper.addClass("ui-sortable-helper");
    +		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
    +		return true;
    +
    +	},
    +
    +	_mouseDrag: function(event) {
    +
    +		//Compute the helpers position
    +		this.position = this._generatePosition(event);
    +		this.positionAbs = this._convertPositionTo("absolute");
    +
    +		if (!this.lastPositionAbs) {
    +			this.lastPositionAbs = this.positionAbs;
    +		}
    +
    +		//Do scrolling
    +		if(this.options.scroll) {
    +			var o = this.options, scrolled = false;
    +			if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
    +
    +				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
    +					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
    +				else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
    +					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
    +
    +				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
    +					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
    +				else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
    +					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
    +
    +			} else {
    +
    +				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
    +					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
    +				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
    +					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
    +
    +				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
    +					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
    +				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
    +					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
    +
    +			}
    +
    +			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
    +				$.ui.ddmanager.prepareOffsets(this, event);
    +		}
    +
    +		//Regenerate the absolute position used for position checks
    +		this.positionAbs = this._convertPositionTo("absolute");
    +
    +		//Set the helper position
    +		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
    +		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
    +
    +		//Rearrange
    +		for (var i = this.items.length - 1; i >= 0; i--) {
    +
    +			//Cache variables and intersection, continue if no intersection
    +			var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
    +			if (!intersection) continue;
    +
    +			// Only put the placeholder inside the current Container, skip all
    +			// items form other containers. This works because when moving
    +			// an item from one container to another the
    +			// currentContainer is switched before the placeholder is moved.
    +			//
    +			// Without this moving items in "sub-sortables" can cause the placeholder to jitter
    +			// beetween the outer and inner container.
    +			if (item.instance !== this.currentContainer) continue;
    +
    +			if (itemElement != this.currentItem[0] //cannot intersect with itself
    +				&&	this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
    +				&&	!$.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
    +				&& (this.options.type == 'semi-dynamic' ? !$.contains(this.element[0], itemElement) : true)
    +				//&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
    +			) {
    +
    +				this.direction = intersection == 1 ? "down" : "up";
    +
    +				if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
    +					this._rearrange(event, item);
    +				} else {
    +					break;
    +				}
    +
    +				this._trigger("change", event, this._uiHash());
    +				break;
    +			}
    +		}
    +
    +		//Post events to containers
    +		this._contactContainers(event);
    +
    +		//Interconnect with droppables
    +		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
    +
    +		//Call callbacks
    +		this._trigger('sort', event, this._uiHash());
    +
    +		this.lastPositionAbs = this.positionAbs;
    +		return false;
    +
    +	},
    +
    +	_mouseStop: function(event, noPropagation) {
    +
    +		if(!event) return;
    +
    +		//If we are using droppables, inform the manager about the drop
    +		if ($.ui.ddmanager && !this.options.dropBehaviour)
    +			$.ui.ddmanager.drop(this, event);
    +
    +		if(this.options.revert) {
    +			var that = this;
    +			var cur = this.placeholder.offset();
    +
    +			this.reverting = true;
    +
    +			$(this.helper).animate({
    +				left: cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
    +				top: cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
    +			}, parseInt(this.options.revert, 10) || 500, function() {
    +				that._clear(event);
    +			});
    +		} else {
    +			this._clear(event, noPropagation);
    +		}
    +
    +		return false;
    +
    +	},
    +
    +	cancel: function() {
    +
    +		if(this.dragging) {
    +
    +			this._mouseUp({ target: null });
    +
    +			if(this.options.helper == "original")
    +				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
    +			else
    +				this.currentItem.show();
    +
    +			//Post deactivating events to containers
    +			for (var i = this.containers.length - 1; i >= 0; i--){
    +				this.containers[i]._trigger("deactivate", null, this._uiHash(this));
    +				if(this.containers[i].containerCache.over) {
    +					this.containers[i]._trigger("out", null, this._uiHash(this));
    +					this.containers[i].containerCache.over = 0;
    +				}
    +			}
    +
    +		}
    +
    +		if (this.placeholder) {
    +			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
    +			if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
    +			if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
    +
    +			$.extend(this, {
    +				helper: null,
    +				dragging: false,
    +				reverting: false,
    +				_noFinalSort: null
    +			});
    +
    +			if(this.domPosition.prev) {
    +				$(this.domPosition.prev).after(this.currentItem);
    +			} else {
    +				$(this.domPosition.parent).prepend(this.currentItem);
    +			}
    +		}
    +
    +		return this;
    +
    +	},
    +
    +	serialize: function(o) {
    +
    +		var items = this._getItemsAsjQuery(o && o.connected);
    +		var str = []; o = o || {};
    +
    +		$(items).each(function() {
    +			var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
    +			if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
    +		});
    +
    +		if(!str.length && o.key) {
    +			str.push(o.key + '=');
    +		}
    +
    +		return str.join('&');
    +
    +	},
    +
    +	toArray: function(o) {
    +
    +		var items = this._getItemsAsjQuery(o && o.connected);
    +		var ret = []; o = o || {};
    +
    +		items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
    +		return ret;
    +
    +	},
    +
    +	/* Be careful with the following core functions */
    +	_intersectsWith: function(item) {
    +
    +		var x1 = this.positionAbs.left,
    +			x2 = x1 + this.helperProportions.width,
    +			y1 = this.positionAbs.top,
    +			y2 = y1 + this.helperProportions.height;
    +
    +		var l = item.left,
    +			r = l + item.width,
    +			t = item.top,
    +			b = t + item.height;
    +
    +		var dyClick = this.offset.click.top,
    +			dxClick = this.offset.click.left;
    +
    +		var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
    +
    +		if(	   this.options.tolerance == "pointer"
    +			|| this.options.forcePointerForContainers
    +			|| (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
    +		) {
    +			return isOverElement;
    +		} else {
    +
    +			return (l < x1 + (this.helperProportions.width / 2) // Right Half
    +				&& x2 - (this.helperProportions.width / 2) < r // Left Half
    +				&& t < y1 + (this.helperProportions.height / 2) // Bottom Half
    +				&& y2 - (this.helperProportions.height / 2) < b ); // Top Half
    +
    +		}
    +	},
    +
    +	_intersectsWithPointer: function(item) {
    +
    +		var isOverElementHeight = (this.options.axis === 'x') || $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
    +			isOverElementWidth = (this.options.axis === 'y') || $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
    +			isOverElement = isOverElementHeight && isOverElementWidth,
    +			verticalDirection = this._getDragVerticalDirection(),
    +			horizontalDirection = this._getDragHorizontalDirection();
    +
    +		if (!isOverElement)
    +			return false;
    +
    +		return this.floating ?
    +			( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
    +			: ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
    +
    +	},
    +
    +	_intersectsWithSides: function(item) {
    +
    +		var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
    +			isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
    +			verticalDirection = this._getDragVerticalDirection(),
    +			horizontalDirection = this._getDragHorizontalDirection();
    +
    +		if (this.floating && horizontalDirection) {
    +			return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
    +		} else {
    +			return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
    +		}
    +
    +	},
    +
    +	_getDragVerticalDirection: function() {
    +		var delta = this.positionAbs.top - this.lastPositionAbs.top;
    +		return delta != 0 && (delta > 0 ? "down" : "up");
    +	},
    +
    +	_getDragHorizontalDirection: function() {
    +		var delta = this.positionAbs.left - this.lastPositionAbs.left;
    +		return delta != 0 && (delta > 0 ? "right" : "left");
    +	},
    +
    +	refresh: function(event) {
    +		this._refreshItems(event);
    +		this.refreshPositions();
    +		return this;
    +	},
    +
    +	_connectWith: function() {
    +		var options = this.options;
    +		return options.connectWith.constructor == String
    +			? [options.connectWith]
    +			: options.connectWith;
    +	},
    +
    +	_getItemsAsjQuery: function(connected) {
    +
    +		var items = [];
    +		var queries = [];
    +		var connectWith = this._connectWith();
    +
    +		if(connectWith && connected) {
    +			for (var i = connectWith.length - 1; i >= 0; i--){
    +				var cur = $(connectWith[i]);
    +				for (var j = cur.length - 1; j >= 0; j--){
    +					var inst = $.data(cur[j], this.widgetName);
    +					if(inst && inst != this && !inst.options.disabled) {
    +						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
    +					}
    +				};
    +			};
    +		}
    +
    +		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
    +
    +		for (var i = queries.length - 1; i >= 0; i--){
    +			queries[i][0].each(function() {
    +				items.push(this);
    +			});
    +		};
    +
    +		return $(items);
    +
    +	},
    +
    +	_removeCurrentsFromItems: function() {
    +
    +		var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
    +
    +		this.items = $.grep(this.items, function (item) {
    +			for (var j=0; j < list.length; j++) {
    +				if(list[j] == item.item[0])
    +					return false;
    +			};
    +			return true;
    +		});
    +
    +	},
    +
    +	_refreshItems: function(event) {
    +
    +		this.items = [];
    +		this.containers = [this];
    +		var items = this.items;
    +		var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
    +		var connectWith = this._connectWith();
    +
    +		if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
    +			for (var i = connectWith.length - 1; i >= 0; i--){
    +				var cur = $(connectWith[i]);
    +				for (var j = cur.length - 1; j >= 0; j--){
    +					var inst = $.data(cur[j], this.widgetName);
    +					if(inst && inst != this && !inst.options.disabled) {
    +						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
    +						this.containers.push(inst);
    +					}
    +				};
    +			};
    +		}
    +
    +		for (var i = queries.length - 1; i >= 0; i--) {
    +			var targetData = queries[i][1];
    +			var _queries = queries[i][0];
    +
    +			for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
    +				var item = $(_queries[j]);
    +
    +				item.data(this.widgetName + '-item', targetData); // Data for target checking (mouse manager)
    +
    +				items.push({
    +					item: item,
    +					instance: targetData,
    +					width: 0, height: 0,
    +					left: 0, top: 0
    +				});
    +			};
    +		};
    +
    +	},
    +
    +	refreshPositions: function(fast) {
    +
    +		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
    +		if(this.offsetParent && this.helper) {
    +			this.offset.parent = this._getParentOffset();
    +		}
    +
    +		for (var i = this.items.length - 1; i >= 0; i--){
    +			var item = this.items[i];
    +
    +			//We ignore calculating positions of all connected containers when we're not over them
    +			if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
    +				continue;
    +
    +			var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
    +
    +			if (!fast) {
    +				item.width = t.outerWidth();
    +				item.height = t.outerHeight();
    +			}
    +
    +			var p = t.offset();
    +			item.left = p.left;
    +			item.top = p.top;
    +		};
    +
    +		if(this.options.custom && this.options.custom.refreshContainers) {
    +			this.options.custom.refreshContainers.call(this);
    +		} else {
    +			for (var i = this.containers.length - 1; i >= 0; i--){
    +				var p = this.containers[i].element.offset();
    +				this.containers[i].containerCache.left = p.left;
    +				this.containers[i].containerCache.top = p.top;
    +				this.containers[i].containerCache.width	= this.containers[i].element.outerWidth();
    +				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
    +			};
    +		}
    +
    +		return this;
    +	},
    +
    +	_createPlaceholder: function(that) {
    +		that = that || this;
    +		var o = that.options;
    +
    +		if(!o.placeholder || o.placeholder.constructor == String) {
    +			var className = o.placeholder;
    +			o.placeholder = {
    +				element: function() {
    +
    +					var el = $(document.createElement(that.currentItem[0].nodeName))
    +						.addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
    +						.removeClass("ui-sortable-helper")[0];
    +
    +					if(!className)
    +						el.style.visibility = "hidden";
    +
    +					return el;
    +				},
    +				update: function(container, p) {
    +
    +					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
    +					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
    +					if(className && !o.forcePlaceholderSize) return;
    +
    +					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
    +					if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css('paddingTop')||0, 10) - parseInt(that.currentItem.css('paddingBottom')||0, 10)); };
    +					if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css('paddingLeft')||0, 10) - parseInt(that.currentItem.css('paddingRight')||0, 10)); };
    +				}
    +			};
    +		}
    +
    +		//Create the placeholder
    +		that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
    +
    +		//Append it after the actual current item
    +		that.currentItem.after(that.placeholder);
    +
    +		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
    +		o.placeholder.update(that, that.placeholder);
    +
    +	},
    +
    +	_contactContainers: function(event) {
    +
    +		// get innermost container that intersects with item
    +		var innermostContainer = null, innermostIndex = null;
    +
    +
    +		for (var i = this.containers.length - 1; i >= 0; i--){
    +
    +			// never consider a container that's located within the item itself
    +			if($.contains(this.currentItem[0], this.containers[i].element[0]))
    +				continue;
    +
    +			if(this._intersectsWith(this.containers[i].containerCache)) {
    +
    +				// if we've already found a container and it's more "inner" than this, then continue
    +				if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0]))
    +					continue;
    +
    +				innermostContainer = this.containers[i];
    +				innermostIndex = i;
    +
    +			} else {
    +				// container doesn't intersect. trigger "out" event if necessary
    +				if(this.containers[i].containerCache.over) {
    +					this.containers[i]._trigger("out", event, this._uiHash(this));
    +					this.containers[i].containerCache.over = 0;
    +				}
    +			}
    +
    +		}
    +
    +		// if no intersecting containers found, return
    +		if(!innermostContainer) return;
    +
    +		// move the item into the container if it's not there already
    +		if(this.containers.length === 1) {
    +			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
    +			this.containers[innermostIndex].containerCache.over = 1;
    +		} else {
    +
    +			//When entering a new container, we will find the item with the least distance and append our item near it
    +			var dist = 10000; var itemWithLeastDistance = null;
    +			var posProperty = this.containers[innermostIndex].floating ? 'left' : 'top';
    +			var sizeProperty = this.containers[innermostIndex].floating ? 'width' : 'height';
    +			var base = this.positionAbs[posProperty] + this.offset.click[posProperty];
    +			for (var j = this.items.length - 1; j >= 0; j--) {
    +				if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
    +				if(this.items[j].item[0] == this.currentItem[0]) continue;
    +				var cur = this.items[j].item.offset()[posProperty];
    +				var nearBottom = false;
    +				if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
    +					nearBottom = true;
    +					cur += this.items[j][sizeProperty];
    +				}
    +
    +				if(Math.abs(cur - base) < dist) {
    +					dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
    +					this.direction = nearBottom ? "up": "down";
    +				}
    +			}
    +
    +			if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
    +				return;
    +
    +			this.currentContainer = this.containers[innermostIndex];
    +			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
    +			this._trigger("change", event, this._uiHash());
    +			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
    +
    +			//Update the placeholder
    +			this.options.placeholder.update(this.currentContainer, this.placeholder);
    +
    +			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
    +			this.containers[innermostIndex].containerCache.over = 1;
    +		}
    +
    +
    +	},
    +
    +	_createHelper: function(event) {
    +
    +		var o = this.options;
    +		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
    +
    +		if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
    +			$(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
    +
    +		if(helper[0] == this.currentItem[0])
    +			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
    +
    +		if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
    +		if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
    +
    +		return helper;
    +
    +	},
    +
    +	_adjustOffsetFromHelper: function(obj) {
    +		if (typeof obj == 'string') {
    +			obj = obj.split(' ');
    +		}
    +		if ($.isArray(obj)) {
    +			obj = {left: +obj[0], top: +obj[1] || 0};
    +		}
    +		if ('left' in obj) {
    +			this.offset.click.left = obj.left + this.margins.left;
    +		}
    +		if ('right' in obj) {
    +			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
    +		}
    +		if ('top' in obj) {
    +			this.offset.click.top = obj.top + this.margins.top;
    +		}
    +		if ('bottom' in obj) {
    +			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
    +		}
    +	},
    +
    +	_getParentOffset: function() {
    +
    +
    +		//Get the offsetParent and cache its position
    +		this.offsetParent = this.helper.offsetParent();
    +		var po = this.offsetParent.offset();
    +
    +		// This is a special case where we need to modify a offset calculated on start, since the following happened:
    +		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
    +		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
    +		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
    +		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
    +			po.left += this.scrollParent.scrollLeft();
    +			po.top += this.scrollParent.scrollTop();
    +		}
    +
    +		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
    +		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
    +			po = { top: 0, left: 0 };
    +
    +		return {
    +			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
    +			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
    +		};
    +
    +	},
    +
    +	_getRelativeOffset: function() {
    +
    +		if(this.cssPosition == "relative") {
    +			var p = this.currentItem.position();
    +			return {
    +				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
    +				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
    +			};
    +		} else {
    +			return { top: 0, left: 0 };
    +		}
    +
    +	},
    +
    +	_cacheMargins: function() {
    +		this.margins = {
    +			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
    +			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
    +		};
    +	},
    +
    +	_cacheHelperProportions: function() {
    +		this.helperProportions = {
    +			width: this.helper.outerWidth(),
    +			height: this.helper.outerHeight()
    +		};
    +	},
    +
    +	_setContainment: function() {
    +
    +		var o = this.options;
    +		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
    +		if(o.containment == 'document' || o.containment == 'window') this.containment = [
    +			0 - this.offset.relative.left - this.offset.parent.left,
    +			0 - this.offset.relative.top - this.offset.parent.top,
    +			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
    +			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
    +		];
    +
    +		if(!(/^(document|window|parent)$/).test(o.containment)) {
    +			var ce = $(o.containment)[0];
    +			var co = $(o.containment).offset();
    +			var over = ($(ce).css("overflow") != 'hidden');
    +
    +			this.containment = [
    +				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
    +				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
    +				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
    +				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
    +			];
    +		}
    +
    +	},
    +
    +	_convertPositionTo: function(d, pos) {
    +
    +		if(!pos) pos = this.position;
    +		var mod = d == "absolute" ? 1 : -1;
    +		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
    +
    +		return {
    +			top: (
    +				pos.top																	// The absolute mouse position
    +				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
    +				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
    +				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
    +			),
    +			left: (
    +				pos.left																// The absolute mouse position
    +				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
    +				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
    +				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
    +			)
    +		};
    +
    +	},
    +
    +	_generatePosition: function(event) {
    +
    +		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
    +
    +		// This is another very weird special case that only happens for relative elements:
    +		// 1. If the css position is relative
    +		// 2. and the scroll parent is the document or similar to the offset parent
    +		// we have to refresh the relative offset during the scroll so there are no jumps
    +		if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
    +			this.offset.relative = this._getRelativeOffset();
    +		}
    +
    +		var pageX = event.pageX;
    +		var pageY = event.pageY;
    +
    +		/*
    +		 * - Position constraining -
    +		 * Constrain the position to a mix of grid, containment.
    +		 */
    +
    +		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
    +
    +			if(this.containment) {
    +				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
    +				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
    +				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
    +				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
    +			}
    +
    +			if(o.grid) {
    +				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
    +				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
    +
    +				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
    +				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
    +			}
    +
    +		}
    +
    +		return {
    +			top: (
    +				pageY																// The absolute mouse position
    +				- this.offset.click.top													// Click offset (relative to the element)
    +				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
    +				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
    +				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
    +			),
    +			left: (
    +				pageX																// The absolute mouse position
    +				- this.offset.click.left												// Click offset (relative to the element)
    +				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
    +				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
    +				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
    +			)
    +		};
    +
    +	},
    +
    +	_rearrange: function(event, i, a, hardRefresh) {
    +
    +		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
    +
    +		//Various things done here to improve the performance:
    +		// 1. we create a setTimeout, that calls refreshPositions
    +		// 2. on the instance, we have a counter variable, that get's higher after every append
    +		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
    +		// 4. this lets only the last addition to the timeout stack through
    +		this.counter = this.counter ? ++this.counter : 1;
    +		var counter = this.counter;
    +
    +		this._delay(function() {
    +			if(counter == this.counter) this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
    +		});
    +
    +	},
    +
    +	_clear: function(event, noPropagation) {
    +
    +		this.reverting = false;
    +		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
    +		// everything else normalized again
    +		var delayedTriggers = [];
    +
    +		// We first have to update the dom position of the actual currentItem
    +		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
    +		if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
    +		this._noFinalSort = null;
    +
    +		if(this.helper[0] == this.currentItem[0]) {
    +			for(var i in this._storedCSS) {
    +				if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
    +			}
    +			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
    +		} else {
    +			this.currentItem.show();
    +		}
    +
    +		if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
    +		if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
    +
    +		// Check if the items Container has Changed and trigger appropriate
    +		// events.
    +		if (this !== this.currentContainer) {
    +			if(!noPropagation) {
    +				delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
    +				delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
    +				delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
    +			}
    +		}
    +
    +
    +		//Post events to containers
    +		for (var i = this.containers.length - 1; i >= 0; i--){
    +			if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
    +			if(this.containers[i].containerCache.over) {
    +				delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
    +				this.containers[i].containerCache.over = 0;
    +			}
    +		}
    +
    +		//Do what was originally in plugins
    +		if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
    +		if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
    +		if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
    +
    +		this.dragging = false;
    +		if(this.cancelHelperRemoval) {
    +			if(!noPropagation) {
    +				this._trigger("beforeStop", event, this._uiHash());
    +				for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
    +				this._trigger("stop", event, this._uiHash());
    +			}
    +
    +			this.fromOutside = false;
    +			return false;
    +		}
    +
    +		if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
    +
    +		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
    +		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
    +
    +		if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
    +
    +		if(!noPropagation) {
    +			for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
    +			this._trigger("stop", event, this._uiHash());
    +		}
    +
    +		this.fromOutside = false;
    +		return true;
    +
    +	},
    +
    +	_trigger: function() {
    +		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
    +			this.cancel();
    +		}
    +	},
    +
    +	_uiHash: function(_inst) {
    +		var inst = _inst || this;
    +		return {
    +			helper: inst.helper,
    +			placeholder: inst.placeholder || $([]),
    +			position: inst.position,
    +			originalPosition: inst.originalPosition,
    +			offset: inst.positionAbs,
    +			item: inst.currentItem,
    +			sender: _inst ? _inst.element : null
    +		};
    +	}
    +
    +});
    +
    +})(jQuery);
    diff --git a/src/main/webapp/plug-in/jquery-ui/js/ui/jquery.ui.widget.js b/src/main/webapp/plug-in/jquery-ui/js/ui/jquery.ui.widget.js
    new file mode 100644
    index 00000000..067476d9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery-ui/js/ui/jquery.ui.widget.js
    @@ -0,0 +1,528 @@
    +/*!
    + * jQuery UI Widget 1.9.2
    + * http://jqueryui.com
    + *
    + * Copyright 2012 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/jQuery.widget/
    + */
    +(function( $, undefined ) {
    +
    +var uuid = 0,
    +	slice = Array.prototype.slice,
    +	_cleanData = $.cleanData;
    +$.cleanData = function( elems ) {
    +	for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
    +		try {
    +			$( elem ).triggerHandler( "remove" );
    +		// http://bugs.jquery.com/ticket/8235
    +		} catch( e ) {}
    +	}
    +	_cleanData( elems );
    +};
    +
    +$.widget = function( name, base, prototype ) {
    +	var fullName, existingConstructor, constructor, basePrototype,
    +		namespace = name.split( "." )[ 0 ];
    +
    +	name = name.split( "." )[ 1 ];
    +	fullName = namespace + "-" + name;
    +
    +	if ( !prototype ) {
    +		prototype = base;
    +		base = $.Widget;
    +	}
    +
    +	// create selector for plugin
    +	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
    +		return !!$.data( elem, fullName );
    +	};
    +
    +	$[ namespace ] = $[ namespace ] || {};
    +	existingConstructor = $[ namespace ][ name ];
    +	constructor = $[ namespace ][ name ] = function( options, element ) {
    +		// allow instantiation without "new" keyword
    +		if ( !this._createWidget ) {
    +			return new constructor( options, element );
    +		}
    +
    +		// allow instantiation without initializing for simple inheritance
    +		// must use "new" keyword (the code above always passes args)
    +		if ( arguments.length ) {
    +			this._createWidget( options, element );
    +		}
    +	};
    +	// extend with the existing constructor to carry over any static properties
    +	$.extend( constructor, existingConstructor, {
    +		version: prototype.version,
    +		// copy the object used to create the prototype in case we need to
    +		// redefine the widget later
    +		_proto: $.extend( {}, prototype ),
    +		// track widgets that inherit from this widget in case this widget is
    +		// redefined after a widget inherits from it
    +		_childConstructors: []
    +	});
    +
    +	basePrototype = new base();
    +	// we need to make the options hash a property directly on the new instance
    +	// otherwise we'll modify the options hash on the prototype that we're
    +	// inheriting from
    +	basePrototype.options = $.widget.extend( {}, basePrototype.options );
    +	$.each( prototype, function( prop, value ) {
    +		if ( $.isFunction( value ) ) {
    +			prototype[ prop ] = (function() {
    +				var _super = function() {
    +						return base.prototype[ prop ].apply( this, arguments );
    +					},
    +					_superApply = function( args ) {
    +						return base.prototype[ prop ].apply( this, args );
    +					};
    +				return function() {
    +					var __super = this._super,
    +						__superApply = this._superApply,
    +						returnValue;
    +
    +					this._super = _super;
    +					this._superApply = _superApply;
    +
    +					returnValue = value.apply( this, arguments );
    +
    +					this._super = __super;
    +					this._superApply = __superApply;
    +
    +					return returnValue;
    +				};
    +			})();
    +		}
    +	});
    +	constructor.prototype = $.widget.extend( basePrototype, {
    +		// TODO: remove support for widgetEventPrefix
    +		// always use the name + a colon as the prefix, e.g., draggable:start
    +		// don't prefix for widgets that aren't DOM-based
    +		widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
    +	}, prototype, {
    +		constructor: constructor,
    +		namespace: namespace,
    +		widgetName: name,
    +		// TODO remove widgetBaseClass, see #8155
    +		widgetBaseClass: fullName,
    +		widgetFullName: fullName
    +	});
    +
    +	// If this widget is being redefined then we need to find all widgets that
    +	// are inheriting from it and redefine all of them so that they inherit from
    +	// the new version of this widget. We're essentially trying to replace one
    +	// level in the prototype chain.
    +	if ( existingConstructor ) {
    +		$.each( existingConstructor._childConstructors, function( i, child ) {
    +			var childPrototype = child.prototype;
    +
    +			// redefine the child widget using the same prototype that was
    +			// originally used, but inherit from the new version of the base
    +			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
    +		});
    +		// remove the list of existing child constructors from the old constructor
    +		// so the old child constructors can be garbage collected
    +		delete existingConstructor._childConstructors;
    +	} else {
    +		base._childConstructors.push( constructor );
    +	}
    +
    +	$.widget.bridge( name, constructor );
    +};
    +
    +$.widget.extend = function( target ) {
    +	var input = slice.call( arguments, 1 ),
    +		inputIndex = 0,
    +		inputLength = input.length,
    +		key,
    +		value;
    +	for ( ; inputIndex < inputLength; inputIndex++ ) {
    +		for ( key in input[ inputIndex ] ) {
    +			value = input[ inputIndex ][ key ];
    +			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
    +				// Clone objects
    +				if ( $.isPlainObject( value ) ) {
    +					target[ key ] = $.isPlainObject( target[ key ] ) ?
    +						$.widget.extend( {}, target[ key ], value ) :
    +						// Don't extend strings, arrays, etc. with objects
    +						$.widget.extend( {}, value );
    +				// Copy everything else by reference
    +				} else {
    +					target[ key ] = value;
    +				}
    +			}
    +		}
    +	}
    +	return target;
    +};
    +
    +$.widget.bridge = function( name, object ) {
    +	var fullName = object.prototype.widgetFullName || name;
    +	$.fn[ name ] = function( options ) {
    +		var isMethodCall = typeof options === "string",
    +			args = slice.call( arguments, 1 ),
    +			returnValue = this;
    +
    +		// allow multiple hashes to be passed on init
    +		options = !isMethodCall && args.length ?
    +			$.widget.extend.apply( null, [ options ].concat(args) ) :
    +			options;
    +
    +		if ( isMethodCall ) {
    +			this.each(function() {
    +				var methodValue,
    +					instance = $.data( this, fullName );
    +				if ( !instance ) {
    +					return $.error( "cannot call methods on " + name + " prior to initialization; " +
    +						"attempted to call method '" + options + "'" );
    +				}
    +				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
    +					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
    +				}
    +				methodValue = instance[ options ].apply( instance, args );
    +				if ( methodValue !== instance && methodValue !== undefined ) {
    +					returnValue = methodValue && methodValue.jquery ?
    +						returnValue.pushStack( methodValue.get() ) :
    +						methodValue;
    +					return false;
    +				}
    +			});
    +		} else {
    +			this.each(function() {
    +				var instance = $.data( this, fullName );
    +				if ( instance ) {
    +					instance.option( options || {} )._init();
    +				} else {
    +					$.data( this, fullName, new object( options, this ) );
    +				}
    +			});
    +		}
    +
    +		return returnValue;
    +	};
    +};
    +
    +$.Widget = function( /* options, element */ ) {};
    +$.Widget._childConstructors = [];
    +
    +$.Widget.prototype = {
    +	widgetName: "widget",
    +	widgetEventPrefix: "",
    +	defaultElement: "<div>",
    +	options: {
    +		disabled: false,
    +
    +		// callbacks
    +		create: null
    +	},
    +	_createWidget: function( options, element ) {
    +		element = $( element || this.defaultElement || this )[ 0 ];
    +		this.element = $( element );
    +		this.uuid = uuid++;
    +		this.eventNamespace = "." + this.widgetName + this.uuid;
    +		this.options = $.widget.extend( {},
    +			this.options,
    +			this._getCreateOptions(),
    +			options );
    +
    +		this.bindings = $();
    +		this.hoverable = $();
    +		this.focusable = $();
    +
    +		if ( element !== this ) {
    +			// 1.9 BC for #7810
    +			// TODO remove dual storage
    +			$.data( element, this.widgetName, this );
    +			$.data( element, this.widgetFullName, this );
    +			this._on( true, this.element, {
    +				remove: function( event ) {
    +					if ( event.target === element ) {
    +						this.destroy();
    +					}
    +				}
    +			});
    +			this.document = $( element.style ?
    +				// element within the document
    +				element.ownerDocument :
    +				// element is window or document
    +				element.document || element );
    +			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
    +		}
    +
    +		this._create();
    +		this._trigger( "create", null, this._getCreateEventData() );
    +		this._init();
    +	},
    +	_getCreateOptions: $.noop,
    +	_getCreateEventData: $.noop,
    +	_create: $.noop,
    +	_init: $.noop,
    +
    +	destroy: function() {
    +		this._destroy();
    +		// we can probably remove the unbind calls in 2.0
    +		// all event bindings should go through this._on()
    +		this.element
    +			.unbind( this.eventNamespace )
    +			// 1.9 BC for #7810
    +			// TODO remove dual storage
    +			.removeData( this.widgetName )
    +			.removeData( this.widgetFullName )
    +			// support: jquery <1.6.3
    +			// http://bugs.jquery.com/ticket/9413
    +			.removeData( $.camelCase( this.widgetFullName ) );
    +		this.widget()
    +			.unbind( this.eventNamespace )
    +			.removeAttr( "aria-disabled" )
    +			.removeClass(
    +				this.widgetFullName + "-disabled " +
    +				"ui-state-disabled" );
    +
    +		// clean up events and states
    +		this.bindings.unbind( this.eventNamespace );
    +		this.hoverable.removeClass( "ui-state-hover" );
    +		this.focusable.removeClass( "ui-state-focus" );
    +	},
    +	_destroy: $.noop,
    +
    +	widget: function() {
    +		return this.element;
    +	},
    +
    +	option: function( key, value ) {
    +		var options = key,
    +			parts,
    +			curOption,
    +			i;
    +
    +		if ( arguments.length === 0 ) {
    +			// don't return a reference to the internal hash
    +			return $.widget.extend( {}, this.options );
    +		}
    +
    +		if ( typeof key === "string" ) {
    +			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
    +			options = {};
    +			parts = key.split( "." );
    +			key = parts.shift();
    +			if ( parts.length ) {
    +				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
    +				for ( i = 0; i < parts.length - 1; i++ ) {
    +					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
    +					curOption = curOption[ parts[ i ] ];
    +				}
    +				key = parts.pop();
    +				if ( value === undefined ) {
    +					return curOption[ key ] === undefined ? null : curOption[ key ];
    +				}
    +				curOption[ key ] = value;
    +			} else {
    +				if ( value === undefined ) {
    +					return this.options[ key ] === undefined ? null : this.options[ key ];
    +				}
    +				options[ key ] = value;
    +			}
    +		}
    +
    +		this._setOptions( options );
    +
    +		return this;
    +	},
    +	_setOptions: function( options ) {
    +		var key;
    +
    +		for ( key in options ) {
    +			this._setOption( key, options[ key ] );
    +		}
    +
    +		return this;
    +	},
    +	_setOption: function( key, value ) {
    +		this.options[ key ] = value;
    +
    +		if ( key === "disabled" ) {
    +			this.widget()
    +				.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
    +				.attr( "aria-disabled", value );
    +			this.hoverable.removeClass( "ui-state-hover" );
    +			this.focusable.removeClass( "ui-state-focus" );
    +		}
    +
    +		return this;
    +	},
    +
    +	enable: function() {
    +		return this._setOption( "disabled", false );
    +	},
    +	disable: function() {
    +		return this._setOption( "disabled", true );
    +	},
    +
    +	_on: function( suppressDisabledCheck, element, handlers ) {
    +		var delegateElement,
    +			instance = this;
    +
    +		// no suppressDisabledCheck flag, shuffle arguments
    +		if ( typeof suppressDisabledCheck !== "boolean" ) {
    +			handlers = element;
    +			element = suppressDisabledCheck;
    +			suppressDisabledCheck = false;
    +		}
    +
    +		// no element argument, shuffle and use this.element
    +		if ( !handlers ) {
    +			handlers = element;
    +			element = this.element;
    +			delegateElement = this.widget();
    +		} else {
    +			// accept selectors, DOM elements
    +			element = delegateElement = $( element );
    +			this.bindings = this.bindings.add( element );
    +		}
    +
    +		$.each( handlers, function( event, handler ) {
    +			function handlerProxy() {
    +				// allow widgets to customize the disabled handling
    +				// - disabled as an array instead of boolean
    +				// - disabled class as method for disabling individual parts
    +				if ( !suppressDisabledCheck &&
    +						( instance.options.disabled === true ||
    +							$( this ).hasClass( "ui-state-disabled" ) ) ) {
    +					return;
    +				}
    +				return ( typeof handler === "string" ? instance[ handler ] : handler )
    +					.apply( instance, arguments );
    +			}
    +
    +			// copy the guid so direct unbinding works
    +			if ( typeof handler !== "string" ) {
    +				handlerProxy.guid = handler.guid =
    +					handler.guid || handlerProxy.guid || $.guid++;
    +			}
    +
    +			var match = event.match( /^(\w+)\s*(.*)$/ ),
    +				eventName = match[1] + instance.eventNamespace,
    +				selector = match[2];
    +			if ( selector ) {
    +				delegateElement.delegate( selector, eventName, handlerProxy );
    +			} else {
    +				element.bind( eventName, handlerProxy );
    +			}
    +		});
    +	},
    +
    +	_off: function( element, eventName ) {
    +		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
    +		element.unbind( eventName ).undelegate( eventName );
    +	},
    +
    +	_delay: function( handler, delay ) {
    +		function handlerProxy() {
    +			return ( typeof handler === "string" ? instance[ handler ] : handler )
    +				.apply( instance, arguments );
    +		}
    +		var instance = this;
    +		return setTimeout( handlerProxy, delay || 0 );
    +	},
    +
    +	_hoverable: function( element ) {
    +		this.hoverable = this.hoverable.add( element );
    +		this._on( element, {
    +			mouseenter: function( event ) {
    +				$( event.currentTarget ).addClass( "ui-state-hover" );
    +			},
    +			mouseleave: function( event ) {
    +				$( event.currentTarget ).removeClass( "ui-state-hover" );
    +			}
    +		});
    +	},
    +
    +	_focusable: function( element ) {
    +		this.focusable = this.focusable.add( element );
    +		this._on( element, {
    +			focusin: function( event ) {
    +				$( event.currentTarget ).addClass( "ui-state-focus" );
    +			},
    +			focusout: function( event ) {
    +				$( event.currentTarget ).removeClass( "ui-state-focus" );
    +			}
    +		});
    +	},
    +
    +	_trigger: function( type, event, data ) {
    +		var prop, orig,
    +			callback = this.options[ type ];
    +
    +		data = data || {};
    +		event = $.Event( event );
    +		event.type = ( type === this.widgetEventPrefix ?
    +			type :
    +			this.widgetEventPrefix + type ).toLowerCase();
    +		// the original event may come from any element
    +		// so we need to reset the target on the new event
    +		event.target = this.element[ 0 ];
    +
    +		// copy original event properties over to the new event
    +		orig = event.originalEvent;
    +		if ( orig ) {
    +			for ( prop in orig ) {
    +				if ( !( prop in event ) ) {
    +					event[ prop ] = orig[ prop ];
    +				}
    +			}
    +		}
    +
    +		this.element.trigger( event, data );
    +		return !( $.isFunction( callback ) &&
    +			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
    +			event.isDefaultPrevented() );
    +	}
    +};
    +
    +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
    +	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
    +		if ( typeof options === "string" ) {
    +			options = { effect: options };
    +		}
    +		var hasOptions,
    +			effectName = !options ?
    +				method :
    +				options === true || typeof options === "number" ?
    +					defaultEffect :
    +					options.effect || defaultEffect;
    +		options = options || {};
    +		if ( typeof options === "number" ) {
    +			options = { duration: options };
    +		}
    +		hasOptions = !$.isEmptyObject( options );
    +		options.complete = callback;
    +		if ( options.delay ) {
    +			element.delay( options.delay );
    +		}
    +		if ( hasOptions && $.effects && ( $.effects.effect[ effectName ] || $.uiBackCompat !== false && $.effects[ effectName ] ) ) {
    +			element[ method ]( options );
    +		} else if ( effectName !== method && element[ effectName ] ) {
    +			element[ effectName ]( options.duration, options.easing, callback );
    +		} else {
    +			element.queue(function( next ) {
    +				$( this )[ method ]();
    +				if ( callback ) {
    +					callback.call( element[ 0 ] );
    +				}
    +				next();
    +			});
    +		}
    +	};
    +});
    +
    +// DEPRECATED
    +if ( $.uiBackCompat !== false ) {
    +	$.Widget.prototype._getCreateOptions = function() {
    +		return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
    +	};
    +}
    +
    +})( jQuery );
    diff --git a/src/main/webapp/plug-in/jquery/jquery-1.8.0.min.js b/src/main/webapp/plug-in/jquery/jquery-1.8.0.min.js
    new file mode 100644
    index 00000000..066d72c7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery-1.8.0.min.js
    @@ -0,0 +1,2 @@
    +/*! jQuery v@1.8.0 jquery.com | jquery.org/license */
    +(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bX(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bV.length;while(e--){b=bV[e]+c;if(b in a)return b}return d}function bY(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function bZ(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bY(c)&&(e[f]=p._data(c,"olddisplay",cb(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b$(a,b,c){var d=bO.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function b_(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bU[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bU[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bU[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bU[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bU[e]+"Width"))||0));return f}function ca(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bP.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+b_(a,b,c||(f?"border":"content"),e)+"px"}function cb(a){if(bR[a])return bR[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bR[a]=c,c}function ch(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||cd.test(a)?d(a,e):ch(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ch(a+"["+e+"]",b[e],c,d);else d(a,b)}function cy(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cz(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cu;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cz(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cz(a,c,d,e,"*",g)),h}function cA(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cB(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cC(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cK(){try{return new a.XMLHttpRequest}catch(b){}}function cL(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cT(){return setTimeout(function(){cM=b},0),cM=p.now()}function cU(a,b){p.each(b,function(b,c){var d=(cS[b]||[]).concat(cS["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cV(a,b,c){var d,e=0,f=0,g=cR.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cM||cT(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cM||cT(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cW(k,j.opts.specialEasing);for(;e<g;e++){d=cR[e].call(j,a,k,j.opts);if(d)return d}return cU(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cW(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cX(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bY(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cb(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cO.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cY(a,b,c,d,e){return new cY.prototype.init(a,b,c,d,e)}function cZ(a,b){var c,d={height:a},e=0;for(;e<4;e+=2-b)c=bU[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function c_(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=r.test("聽")?/^[\s\xA0]+|[\s\xA0]+$/g:/^\s+|\s+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.0",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":a.toString().replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||f.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete"||e.readyState!=="loading"&&e.addEventListener)setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){p.isFunction(c)&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return typeof a=="object"?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length||!d)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/^(?:\{.*\}|\[.*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||++p.uuid:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")===0&&(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.shift(),e=p._queueHooks(a,b),f=function(){p.dequeue(a,b)};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),delete e.stop,d.call(a,f,e)),!c.length&&e&&e.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)(d=p._data(g[h],a+"queueHooks"))&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)~f.indexOf(" "+b[g]+" ")||(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>-1)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,""+d),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,k,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=[].slice.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click")){g=p(this),g.context=this;for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){i={},k=[],g[0]=f;for(d=0;d<q;d++)l=o[d],m=l.selector,i[m]===b&&(i[m]=g.is(m)),i[m]&&k.push(l);k.length&&u.push({elem:f,matches:k})}}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){j=u[d],c.currentTarget=j.elem;for(e=0;e<j.matches.length&&!c.isImmediatePropagationStopped();e++){l=j.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,h=((p.event.special[l.origType]||{}).handle||l.handler).apply(j.elem,r),h!==b&&(c.result=h,h===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{ready:{setup:p.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bd(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)Z(a,b[e],c,d)}function be(a,b,c,d,e,f){var g,h=$.setFilters[b.toLowerCase()];return h||Z.error(b),(a||!(g=e))&&bd(a||"*",d,g=[],e),g.length>0?h(g,c,f):[]}function bf(a,c,d,e,f){var g,h,i,j,k,l,m,n,p=0,q=f.length,s=L.POS,t=new RegExp("^"+s.source+"(?!"+r+")","i"),u=function(){var a=1,c=arguments.length-2;for(;a<c;a++)arguments[a]===b&&(g[a]=b)};for(;p<q;p++){s.exec(""),a=f[p],j=[],i=0,k=e;while(g=s.exec(a)){n=s.lastIndex=g.index+g[0].length;if(n>i){m=a.slice(i,g.index),i=n,l=[c],B.test(m)&&(k&&(l=k),k=e);if(h=H.test(m))m=m.slice(0,-5).replace(B,"$&*");g.length>1&&g[0].replace(t,u),k=be(m,g[1],g[2],l,k,h)}}k?(j=j.concat(k),(m=a.slice(i))&&m!==")"?B.test(m)?bd(m,j,d,e):Z(m,c,d,e?e.concat(k):k):o.apply(d,j)):Z(a,c,d,e)}return q===1?d:Z.uniqueSort(d)}function bg(a,b,c){var d,e,f,g=[],i=0,j=D.exec(a),k=!j.pop()&&!j.pop(),l=k&&a.match(C)||[""],m=$.preFilter,n=$.filter,o=!c&&b!==h;for(;(e=l[i])!=null&&k;i++){g.push(d=[]),o&&(e=" "+e);while(e){k=!1;if(j=B.exec(e))e=e.slice(j[0].length),k=d.push({part:j.pop().replace(A," "),captures:j});for(f in n)(j=L[f].exec(e))&&(!m[f]||(j=m[f](j,b,c)))&&(e=e.slice(j.shift().length),k=d.push({part:f,captures:j}));if(!k)break}}return k||Z.error(a),g}function bh(a,b,e){var f=b.dir,g=m++;return a||(a=function(a){return a===e}),b.first?function(b,c){while(b=b[f])if(b.nodeType===1)return a(b,c)&&b}:function(b,e){var h,i=g+"."+d,j=i+"."+c;while(b=b[f])if(b.nodeType===1){if((h=b[q])===j)return b.sizset;if(typeof h=="string"&&h.indexOf(i)===0){if(b.sizset)return b}else{b[q]=j;if(a(b,e))return b.sizset=!0,b;b.sizset=!1}}}}function bi(a,b){return a?function(c,d){var e=b(c,d);return e&&a(e===!0?c:e,d)}:b}function bj(a,b,c){var d,e,f=0;for(;d=a[f];f++)$.relative[d.part]?e=bh(e,$.relative[d.part],b):(d.captures.push(b,c),e=bi(e,$.filter[d.part].apply(null,d.captures)));return e}function bk(a){return function(b,c){var d,e=0;for(;d=a[e];e++)if(d(b,c))return!0;return!1}}var c,d,e,f,g,h=a.document,i=h.documentElement,j="undefined",k=!1,l=!0,m=0,n=[].slice,o=[].push,q=("sizcache"+Math.random()).replace(".",""),r="[\\x20\\t\\r\\n\\f]",s="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",t=s.replace("w","w#"),u="([*^$|!~]?=)",v="\\["+r+"*("+s+")"+r+"*(?:"+u+r+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+t+")|)|)"+r+"*\\]",w=":("+s+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",x=":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",y=r+"*([\\x20\\t\\r\\n\\f>+~])"+r+"*",z="(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|"+v+"|"+w.replace(2,7)+"|[^\\\\(),])+",A=new RegExp("^"+r+"+|((?:^|[^\\\\])(?:\\\\.)*)"+r+"+$","g"),B=new RegExp("^"+y),C=new RegExp(z+"?(?="+r+"*,|$)","g"),D=new RegExp("^(?:(?!,)(?:(?:^|,)"+r+"*"+z+")*?|"+r+"*(.*?))(\\)|$)"),E=new RegExp(z.slice(19,-6)+"\\x20\\t\\r\\n\\f>+~])+|"+y,"g"),F=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,G=/[\x20\t\r\n\f]*[+~]/,H=/:not\($/,I=/h\d/i,J=/input|select|textarea|button/i,K=/\\(?!\\)/g,L={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),NAME:new RegExp("^\\[name=['\"]?("+s+")['\"]?\\]"),TAG:new RegExp("^("+s.replace("[-","[-\\*")+")"),ATTR:new RegExp("^"+v),PSEUDO:new RegExp("^"+w),CHILD:new RegExp("^:(only|nth|last|first)-child(?:\\("+r+"*(even|odd|(([+-]|)(\\d*)n|)"+r+"*(?:([+-]|)"+r+"*(\\d+)|))"+r+"*\\)|)","i"),POS:new RegExp(x,"ig"),needsContext:new RegExp("^"+r+"*[>+~]|"+x,"i")},M={},N=[],O={},P=[],Q=function(a){return a.sizzleFilter=!0,a},R=function(a){return function(b){return b.nodeName.toLowerCase()==="input"&&b.type===a}},S=function(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}},T=function(a){var b=!1,c=h.createElement("div");try{b=a(c)}catch(d){}return c=null,b},U=T(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),V=T(function(a){a.id=q+0,a.innerHTML="<a name='"+q+"'></a><div name='"+q+"'></div>",i.insertBefore(a,i.firstChild);var b=h.getElementsByName&&h.getElementsByName(q).length===2+h.getElementsByName(q+0).length;return g=!h.getElementById(q),i.removeChild(a),b}),W=T(function(a){return a.appendChild(h.createComment("")),a.getElementsByTagName("*").length===0}),X=T(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==j&&a.firstChild.getAttribute("href")==="#"}),Y=T(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||a.getElementsByClassName("e").length===0?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length!==1)}),Z=function(a,b,c,d){c=c||[],b=b||h;var e,f,g,i,j=b.nodeType;if(j!==1&&j!==9)return[];if(!a||typeof a!="string")return c;g=ba(b);if(!g&&!d)if(e=F.exec(a))if(i=e[1]){if(j===9){f=b.getElementById(i);if(!f||!f.parentNode)return c;if(f.id===i)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(i))&&bb(b,f)&&f.id===i)return c.push(f),c}else{if(e[2])return o.apply(c,n.call(b.getElementsByTagName(a),0)),c;if((i=e[3])&&Y&&b.getElementsByClassName)return o.apply(c,n.call(b.getElementsByClassName(i),0)),c}return bm(a,b,c,d,g)},$=Z.selectors={cacheLength:50,match:L,order:["ID","TAG"],attrHandle:{},createPseudo:Q,find:{ID:g?function(a,b,c){if(typeof b.getElementById!==j&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==j&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==j&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:W?function(a,b){if(typeof b.getElementsByTagName!==j)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(K,""),a[3]=(a[4]||a[5]||"").replace(K,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||Z.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&Z.error(a[0]),a},PSEUDO:function(a){var b,c=a[4];return L.CHILD.test(a[0])?null:(c&&(b=D.exec(c))&&b.pop()&&(a[0]=a[0].slice(0,b[0].length-c.length-1),c=b[0].slice(0,-1)),a.splice(2,3,c||a[3]),a)}},filter:{ID:g?function(a){return a=a.replace(K,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(K,""),function(b){var c=typeof b.getAttributeNode!==j&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(K,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=M[a];return b||(b=M[a]=new RegExp("(^|"+r+")"+a+"("+r+"|$)"),N.push(a),N.length>$.cacheLength&&delete M[N.shift()]),function(a){return b.test(a.className||typeof a.getAttribute!==j&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return b?function(d){var e=Z.attr(d,a),f=e+"";if(e==null)return b==="!=";switch(b){case"=":return f===c;case"!=":return f!==c;case"^=":return c&&f.indexOf(c)===0;case"*=":return c&&f.indexOf(c)>-1;case"$=":return c&&f.substr(f.length-c.length)===c;case"~=":return(" "+f+" ").indexOf(c)>-1;case"|=":return f===c||f.substr(0,c.length+1)===c+"-"}}:function(b){return Z.attr(b,a)!=null}},CHILD:function(a,b,c,d){if(a==="nth"){var e=m++;return function(a){var b,f,g=0,h=a;if(c===1&&d===0)return!0;b=a.parentNode;if(b&&(b[q]!==e||!a.sizset)){for(h=b.firstChild;h;h=h.nextSibling)if(h.nodeType===1){h.sizset=++g;if(h===a)break}b[q]=e}return f=a.sizset-d,c===0?f===0:f%c===0&&f/c>=0}}return function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b,c,d){var e=$.pseudos[a]||$.pseudos[a.toLowerCase()];return e||Z.error("unsupported pseudo: "+a),e.sizzleFilter?e(b,c,d):e}},pseudos:{not:Q(function(a,b,c){var d=bl(a.replace(A,"$1"),b,c);return function(a){return!d(a)}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!$.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},contains:Q(function(a){return function(b){return(b.textContent||b.innerText||bc(b)).indexOf(a)>-1}}),has:Q(function(a){return function(b){return Z(a,b).length>0}}),header:function(a){return I.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:R("radio"),checkbox:R("checkbox"),file:R("file"),password:R("password"),image:R("image"),submit:S("submit"),reset:S("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return J.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b,c){return c?a.slice(1):[a[0]]},last:function(a,b,c){var d=a.pop();return c?a:[d]},even:function(a,b,c){var d=[],e=c?1:0,f=a.length;for(;e<f;e=e+2)d.push(a[e]);return d},odd:function(a,b,c){var d=[],e=c?0:1,f=a.length;for(;e<f;e=e+2)d.push(a[e]);return d},lt:function(a,b,c){return c?a.slice(+b):a.slice(0,+b)},gt:function(a,b,c){return c?a.slice(0,+b+1):a.slice(+b+1)},eq:function(a,b,c){var d=a.splice(+b,1);return c?a:d}}};$.setFilters.nth=$.setFilters.eq,$.filters=$.pseudos,X||($.attrHandle={href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}}),V&&($.order.push("NAME"),$.find.NAME=function(a,b){if(typeof b.getElementsByName!==j)return b.getElementsByName(a)}),Y&&($.order.splice(1,0,"CLASS"),$.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!==j&&!c)return b.getElementsByClassName(a)});try{n.call(i.childNodes,0)[0].nodeType}catch(_){n=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}var ba=Z.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},bb=Z.contains=i.compareDocumentPosition?function(a,b){return!!(a.compareDocumentPosition(b)&16)}:i.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc=Z.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=bc(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=bc(b);return c};Z.attr=function(a,b){var c,d=ba(a);return d||(b=b.toLowerCase()),$.attrHandle[b]?$.attrHandle[b](a):U||d?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},Z.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},[0,0].sort(function(){return l=0}),i.compareDocumentPosition?e=function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:(e=function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],g=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return f(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)g.unshift(j),j=j.parentNode;c=e.length,d=g.length;for(var l=0;l<c&&l<d;l++)if(e[l]!==g[l])return f(e[l],g[l]);return l===c?f(a,g[l],-1):f(e[l],b,1)},f=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),Z.uniqueSort=function(a){var b,c=1;if(e){k=l,a.sort(e);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1)}return a};var bl=Z.compile=function(a,b,c){var d,e,f,g=O[a];if(g&&g.context===b)return g;e=bg(a,b,c);for(f=0;d=e[f];f++)e[f]=bj(d,b,c);return g=O[a]=bk(e),g.context=b,g.runs=g.dirruns=0,P.push(a),P.length>$.cacheLength&&delete O[P.shift()],g};Z.matches=function(a,b){return Z(a,null,null,b)},Z.matchesSelector=function(a,b){return Z(b,null,null,[a]).length>0};var bm=function(a,b,e,f,g){a=a.replace(A,"$1");var h,i,j,k,l,m,p,q,r,s=a.match(C),t=a.match(E),u=b.nodeType;if(L.POS.test(a))return bf(a,b,e,f,s);if(f)h=n.call(f,0);else if(s&&s.length===1){if(t.length>1&&u===9&&!g&&(s=L.ID.exec(t[0]))){b=$.find.ID(s[1],b,g)[0];if(!b)return e;a=a.slice(t.shift().length)}q=(s=G.exec(t[0]))&&!s.index&&b.parentNode||b,r=t.pop(),m=r.split(":not")[0];for(j=0,k=$.order.length;j<k;j++){p=$.order[j];if(s=L[p].exec(m)){h=$.find[p]((s[1]||"").replace(K,""),q,g);if(h==null)continue;m===r&&(a=a.slice(0,a.length-r.length)+m.replace(L[p],""),a||o.apply(e,n.call(h,0)));break}}}if(a){i=bl(a,b,g),d=i.dirruns++,h==null&&(h=$.find.TAG("*",G.test(a)&&b.parentNode||b));for(j=0;l=h[j];j++)c=i.runs++,i(l,b)&&e.push(l)}return e};h.querySelectorAll&&function(){var a,b=bm,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[],f=[":active"],g=i.matchesSelector||i.mozMatchesSelector||i.webkitMatchesSelector||i.oMatchesSelector||i.msMatchesSelector;T(function(a){a.innerHTML="<select><option selected></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+r+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),T(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+r+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=e.length&&new RegExp(e.join("|")),bm=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a)))if(d.nodeType===9)try{return o.apply(f,n.call(d.querySelectorAll(a),0)),f}catch(i){}else if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){var j=d.getAttribute("id"),k=j||q,l=G.test(a)&&d.parentNode||d;j?k=k.replace(c,"\\$&"):d.setAttribute("id",k);try{return o.apply(f,n.call(l.querySelectorAll(a.replace(C,"[id='"+k+"'] $&")),0)),f}catch(i){}finally{j||d.removeAttribute("id")}}return b(a,d,f,g,h)},g&&(T(function(b){a=g.call(b,"div");try{g.call(b,"[test!='']:sizzle"),f.push($.match.PSEUDO)}catch(c){}}),f=new RegExp(f.join("|")),Z.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!ba(b)&&!f.test(c)&&(!e||!e.test(c)))try{var h=g.call(b,c);if(h||a||b.document&&b.document.nodeType!==11)return h}catch(i){}return Z(c,null,null,[b]).length>0})}(),Z.attr=p.attr,p.find=Z,p.expr=Z.selectors,p.expr[":"]=p.expr.pseudos,p.unique=Z.uniqueSort,p.text=Z.getText,p.isXMLDoc=Z.isXML,p.contains=Z.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=(c[0]||c).ownerDocument||c[0]||c,typeof c.createDocumentFragment=="undefined"&&(c=e),a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=0,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(g=b===e&&bA;(h=a[s])!=null;s++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{g=g||bk(b),l=l||g.appendChild(b.createElement("div")),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(f=n.length-1;f>=0;--f)p.nodeName(n[f],"tbody")&&!n[f].childNodes.length&&n[f].parentNode.removeChild(n[f])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l=g.lastChild}h.nodeType?t.push(h):t=p.merge(t,h)}l&&(g.removeChild(l),h=l=g=null);if(!p.support.appendChecked)for(s=0;(h=t[s])!=null;s++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(s=0;(h=t[s])!=null;s++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[s+1,0].concat(r)),s+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^margin/,bO=new RegExp("^("+q+")(.*)$","i"),bP=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bQ=new RegExp("^([-+])=("+q+")","i"),bR={},bS={position:"absolute",visibility:"hidden",display:"block"},bT={letterSpacing:0,fontWeight:400,lineHeight:1},bU=["Top","Right","Bottom","Left"],bV=["Webkit","O","Moz","ms"],bW=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return bZ(this,!0)},hide:function(){return bZ(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bW.apply(this,arguments):this.each(function(){(c?a:bY(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bX(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bQ.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bX(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bT&&(f=bT[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(a,b){var c,d,e,f,g=getComputedStyle(a,null),h=a.style;return g&&(c=g[b],c===""&&!p.contains(a.ownerDocument.documentElement,a)&&(c=p.style(a,b)),bP.test(c)&&bN.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=c,c=g.width,h.width=d,h.minWidth=e,h.maxWidth=f)),c}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bP.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0||bH(a,"display")!=="none"?ca(a,b,d):p.swap(a,bS,function(){return ca(a,b,d)})},set:function(a,c,d){return b$(a,c,d?b_(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bP.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bU[d]+b]=e[d]||e[d-2]||e[0];return f}},bN.test(a)||(p.cssHooks[a+b].set=b$)});var cc=/%20/g,cd=/\[\]$/,ce=/\r?\n/g,cf=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,cg=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||cg.test(this.nodeName)||cf.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(ce,"\r\n")}}):{name:b.name,value:c.replace(ce,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ch(d,a[d],c,f);return e.join("&").replace(cc,"+")};var ci,cj,ck=/#.*$/,cl=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cm=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,cn=/^(?:GET|HEAD)$/,co=/^\/\//,cp=/\?/,cq=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cr=/([?&])_=[^&]*/,cs=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,ct=p.fn.load,cu={},cv={},cw=["*/"]+["*"];try{ci=f.href}catch(cx){ci=e.createElement("a"),ci.href="",ci=ci.href}cj=cs.exec(ci.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&ct)return ct.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cq,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cA(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cA(a,b),a},ajaxSettings:{url:ci,isLocal:cm.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cw},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cy(cu),ajaxTransport:cy(cv),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cB(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cC(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=""+(c||y),k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cl.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(ck,"").replace(co,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=cs.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]==cj[1]&&i[2]==cj[2]&&(i[3]||(i[1]==="http:"?80:443))==(cj[3]||(cj[1]==="http:"?80:443)))),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cz(cu,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!cn.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cp.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cr,"$1_="+z);l.url=A+(A===l.url?(cp.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cw+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cz(cv,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cD=[],cE=/\?/,cF=/(=)\?(?=&|$)|\?\?/,cG=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cD.pop()||p.expando+"_"+cG++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cF.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cF.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cF,"$1"+f):m?c.data=i.replace(cF,"$1"+f):k&&(c.url+=(cE.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cD.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cH,cI=a.ActiveXObject?function(){for(var a in cH)cH[a](0,1)}:!1,cJ=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cK()||cL()}:cK,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cI&&delete cH[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cJ,cI&&(cH||(cH={},p(a).unload(cI)),cH[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cM,cN,cO=/^(?:toggle|show|hide)$/,cP=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cQ=/queueHooks$/,cR=[cX],cS={"*":[function(a,b){var c,d,e,f=this.createTween(a,b),g=cP.exec(b),h=f.cur(),i=+h||0,j=1;if(g){c=+g[2],d=g[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&i){i=p.css(f.elem,a,!0)||c||1;do e=j=j||".5",i=i/j,p.style(f.elem,a,i+d),j=f.cur()/h;while(j!==1&&j!==e)}f.unit=d,f.start=i,f.end=g[1]?i+(g[1]+1)*c:c}return f}]};p.Animation=p.extend(cV,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cS[c]=cS[c]||[],cS[c].unshift(b)},prefilter:function(a,b){b?cR.unshift(a):cR.push(a)}}),p.Tween=cY,cY.prototype={constructor:cY,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cY.propHooks[this.prop];return a&&a.get?a.get(this):cY.propHooks._default.get(this)},run:function(a){var b,c=cY.propHooks[this.prop];return this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration),this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cY.propHooks._default.set(this),this}},cY.prototype.init.prototype=cY.prototype,cY.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cY.propHooks.scrollTop=cY.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(cZ(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bY).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cV(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cQ.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:cZ("show"),slideUp:cZ("hide"),slideToggle:cZ("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cY.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cN&&(cN=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cN),cN=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c$=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j,k,l,m=this[0],n=m&&m.ownerDocument;if(!n)return;return(e=n.body)===m?p.offset.bodyOffset(m):(d=n.documentElement,p.contains(d,m)?(c=m.getBoundingClientRect(),f=c_(n),g=d.clientTop||e.clientTop||0,h=d.clientLeft||e.clientLeft||0,i=f.pageYOffset||d.scrollTop,j=f.pageXOffset||d.scrollLeft,k=c.top+i-g,l=c.left+j-h,{top:k,left:l}):{top:0,left:0})},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c$.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c$.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=c_(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery/jquery-1.8.3.js b/src/main/webapp/plug-in/jquery/jquery-1.8.3.js
    new file mode 100644
    index 00000000..8c24ffc6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery-1.8.3.js
    @@ -0,0 +1,9472 @@
    +/*!
    + * jQuery JavaScript Library v1.8.3
    + * http://jquery.com/
    + *
    + * Includes Sizzle.js
    + * http://sizzlejs.com/
    + *
    + * Copyright 2012 jQuery Foundation and other contributors
    + * Released under the MIT license
    + * http://jquery.org/license
    + *
    + * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
    + */
    +(function( window, undefined ) {
    +var
    +	// A central reference to the root jQuery(document)
    +	rootjQuery,
    +
    +	// The deferred used on DOM ready
    +	readyList,
    +
    +	// Use the correct document accordingly with window argument (sandbox)
    +	document = window.document,
    +	location = window.location,
    +	navigator = window.navigator,
    +
    +	// Map over jQuery in case of overwrite
    +	_jQuery = window.jQuery,
    +
    +	// Map over the $ in case of overwrite
    +	_$ = window.$,
    +
    +	// Save a reference to some core methods
    +	core_push = Array.prototype.push,
    +	core_slice = Array.prototype.slice,
    +	core_indexOf = Array.prototype.indexOf,
    +	core_toString = Object.prototype.toString,
    +	core_hasOwn = Object.prototype.hasOwnProperty,
    +	core_trim = String.prototype.trim,
    +
    +	// Define a local copy of jQuery
    +	jQuery = function( selector, context ) {
    +		// The jQuery object is actually just the init constructor 'enhanced'
    +		return new jQuery.fn.init( selector, context, rootjQuery );
    +	},
    +
    +	// Used for matching numbers
    +	core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
    +
    +	// Used for detecting and trimming whitespace
    +	core_rnotwhite = /\S/,
    +	core_rspace = /\s+/,
    +
    +	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
    +	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
    +
    +	// A simple way to check for HTML strings
    +	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
    +	rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
    +
    +	// Match a standalone tag
    +	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
    +
    +	// JSON RegExp
    +	rvalidchars = /^[\],:{}\s]*$/,
    +	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
    +	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
    +	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
    +
    +	// Matches dashed string for camelizing
    +	rmsPrefix = /^-ms-/,
    +	rdashAlpha = /-([\da-z])/gi,
    +
    +	// Used by jQuery.camelCase as callback to replace()
    +	fcamelCase = function( all, letter ) {
    +		return ( letter + "" ).toUpperCase();
    +	},
    +
    +	// The ready event handler and self cleanup method
    +	DOMContentLoaded = function() {
    +		if ( document.addEventListener ) {
    +			document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
    +			jQuery.ready();
    +		} else if ( document.readyState === "complete" ) {
    +			// we're here because readyState === "complete" in oldIE
    +			// which is good enough for us to call the dom ready!
    +			document.detachEvent( "onreadystatechange", DOMContentLoaded );
    +			jQuery.ready();
    +		}
    +	},
    +
    +	// [[Class]] -> type pairs
    +	class2type = {};
    +
    +jQuery.fn = jQuery.prototype = {
    +	constructor: jQuery,
    +	init: function( selector, context, rootjQuery ) {
    +		var match, elem, ret, doc;
    +
    +		// Handle $(""), $(null), $(undefined), $(false)
    +		if ( !selector ) {
    +			return this;
    +		}
    +
    +		// Handle $(DOMElement)
    +		if ( selector.nodeType ) {
    +			this.context = this[0] = selector;
    +			this.length = 1;
    +			return this;
    +		}
    +
    +		// Handle HTML strings
    +		if ( typeof selector === "string" ) {
    +			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
    +				// Assume that strings that start and end with <> are HTML and skip the regex check
    +				match = [ null, selector, null ];
    +
    +			} else {
    +				match = rquickExpr.exec( selector );
    +			}
    +
    +			// Match html or make sure no context is specified for #id
    +			if ( match && (match[1] || !context) ) {
    +
    +				// HANDLE: $(html) -> $(array)
    +				if ( match[1] ) {
    +					context = context instanceof jQuery ? context[0] : context;
    +					doc = ( context && context.nodeType ? context.ownerDocument || context : document );
    +
    +					// scripts is true for back-compat
    +					selector = jQuery.parseHTML( match[1], doc, true );
    +					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
    +						this.attr.call( selector, context, true );
    +					}
    +
    +					return jQuery.merge( this, selector );
    +
    +				// HANDLE: $(#id)
    +				} else {
    +					elem = document.getElementById( match[2] );
    +
    +					// Check parentNode to catch when Blackberry 4.6 returns
    +					// nodes that are no longer in the document #6963
    +					if ( elem && elem.parentNode ) {
    +						// Handle the case where IE and Opera return items
    +						// by name instead of ID
    +						if ( elem.id !== match[2] ) {
    +							return rootjQuery.find( selector );
    +						}
    +
    +						// Otherwise, we inject the element directly into the jQuery object
    +						this.length = 1;
    +						this[0] = elem;
    +					}
    +
    +					this.context = document;
    +					this.selector = selector;
    +					return this;
    +				}
    +
    +			// HANDLE: $(expr, $(...))
    +			} else if ( !context || context.jquery ) {
    +				return ( context || rootjQuery ).find( selector );
    +
    +			// HANDLE: $(expr, context)
    +			// (which is just equivalent to: $(context).find(expr)
    +			} else {
    +				return this.constructor( context ).find( selector );
    +			}
    +
    +		// HANDLE: $(function)
    +		// Shortcut for document ready
    +		} else if ( jQuery.isFunction( selector ) ) {
    +			return rootjQuery.ready( selector );
    +		}
    +
    +		if ( selector.selector !== undefined ) {
    +			this.selector = selector.selector;
    +			this.context = selector.context;
    +		}
    +
    +		return jQuery.makeArray( selector, this );
    +	},
    +
    +	// Start with an empty selector
    +	selector: "",
    +
    +	// The current version of jQuery being used
    +	jquery: "1.8.3",
    +
    +	// The default length of a jQuery object is 0
    +	length: 0,
    +
    +	// The number of elements contained in the matched element set
    +	size: function() {
    +		return this.length;
    +	},
    +
    +	toArray: function() {
    +		return core_slice.call( this );
    +	},
    +
    +	// Get the Nth element in the matched element set OR
    +	// Get the whole matched element set as a clean array
    +	get: function( num ) {
    +		return num == null ?
    +
    +			// Return a 'clean' array
    +			this.toArray() :
    +
    +			// Return just the object
    +			( num < 0 ? this[ this.length + num ] : this[ num ] );
    +	},
    +
    +	// Take an array of elements and push it onto the stack
    +	// (returning the new matched element set)
    +	pushStack: function( elems, name, selector ) {
    +
    +		// Build a new jQuery matched element set
    +		var ret = jQuery.merge( this.constructor(), elems );
    +
    +		// Add the old object onto the stack (as a reference)
    +		ret.prevObject = this;
    +
    +		ret.context = this.context;
    +
    +		if ( name === "find" ) {
    +			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
    +		} else if ( name ) {
    +			ret.selector = this.selector + "." + name + "(" + selector + ")";
    +		}
    +
    +		// Return the newly-formed element set
    +		return ret;
    +	},
    +
    +	// Execute a callback for every element in the matched set.
    +	// (You can seed the arguments with an array of args, but this is
    +	// only used internally.)
    +	each: function( callback, args ) {
    +		return jQuery.each( this, callback, args );
    +	},
    +
    +	ready: function( fn ) {
    +		// Add the callback
    +		jQuery.ready.promise().done( fn );
    +
    +		return this;
    +	},
    +
    +	eq: function( i ) {
    +		i = +i;
    +		return i === -1 ?
    +			this.slice( i ) :
    +			this.slice( i, i + 1 );
    +	},
    +
    +	first: function() {
    +		return this.eq( 0 );
    +	},
    +
    +	last: function() {
    +		return this.eq( -1 );
    +	},
    +
    +	slice: function() {
    +		return this.pushStack( core_slice.apply( this, arguments ),
    +			"slice", core_slice.call(arguments).join(",") );
    +	},
    +
    +	map: function( callback ) {
    +		return this.pushStack( jQuery.map(this, function( elem, i ) {
    +			return callback.call( elem, i, elem );
    +		}));
    +	},
    +
    +	end: function() {
    +		return this.prevObject || this.constructor(null);
    +	},
    +
    +	// For internal use only.
    +	// Behaves like an Array's method, not like a jQuery method.
    +	push: core_push,
    +	sort: [].sort,
    +	splice: [].splice
    +};
    +
    +// Give the init function the jQuery prototype for later instantiation
    +jQuery.fn.init.prototype = jQuery.fn;
    +
    +jQuery.extend = jQuery.fn.extend = function() {
    +	var options, name, src, copy, copyIsArray, clone,
    +		target = arguments[0] || {},
    +		i = 1,
    +		length = arguments.length,
    +		deep = false;
    +
    +	// Handle a deep copy situation
    +	if ( typeof target === "boolean" ) {
    +		deep = target;
    +		target = arguments[1] || {};
    +		// skip the boolean and the target
    +		i = 2;
    +	}
    +
    +	// Handle case when target is a string or something (possible in deep copy)
    +	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
    +		target = {};
    +	}
    +
    +	// extend jQuery itself if only one argument is passed
    +	if ( length === i ) {
    +		target = this;
    +		--i;
    +	}
    +
    +	for ( ; i < length; i++ ) {
    +		// Only deal with non-null/undefined values
    +		if ( (options = arguments[ i ]) != null ) {
    +			// Extend the base object
    +			for ( name in options ) {
    +				src = target[ name ];
    +				copy = options[ name ];
    +
    +				// Prevent never-ending loop
    +				if ( target === copy ) {
    +					continue;
    +				}
    +
    +				// Recurse if we're merging plain objects or arrays
    +				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
    +					if ( copyIsArray ) {
    +						copyIsArray = false;
    +						clone = src && jQuery.isArray(src) ? src : [];
    +
    +					} else {
    +						clone = src && jQuery.isPlainObject(src) ? src : {};
    +					}
    +
    +					// Never move original objects, clone them
    +					target[ name ] = jQuery.extend( deep, clone, copy );
    +
    +				// Don't bring in undefined values
    +				} else if ( copy !== undefined ) {
    +					target[ name ] = copy;
    +				}
    +			}
    +		}
    +	}
    +
    +	// Return the modified object
    +	return target;
    +};
    +
    +jQuery.extend({
    +	noConflict: function( deep ) {
    +		if ( window.$ === jQuery ) {
    +			window.$ = _$;
    +		}
    +
    +		if ( deep && window.jQuery === jQuery ) {
    +			window.jQuery = _jQuery;
    +		}
    +
    +		return jQuery;
    +	},
    +
    +	// Is the DOM ready to be used? Set to true once it occurs.
    +	isReady: false,
    +
    +	// A counter to track how many items to wait for before
    +	// the ready event fires. See #6781
    +	readyWait: 1,
    +
    +	// Hold (or release) the ready event
    +	holdReady: function( hold ) {
    +		if ( hold ) {
    +			jQuery.readyWait++;
    +		} else {
    +			jQuery.ready( true );
    +		}
    +	},
    +
    +	// Handle when the DOM is ready
    +	ready: function( wait ) {
    +
    +		// Abort if there are pending holds or we're already ready
    +		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
    +			return;
    +		}
    +
    +		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
    +		if ( !document.body ) {
    +			return setTimeout( jQuery.ready, 1 );
    +		}
    +
    +		// Remember that the DOM is ready
    +		jQuery.isReady = true;
    +
    +		// If a normal DOM Ready event fired, decrement, and wait if need be
    +		if ( wait !== true && --jQuery.readyWait > 0 ) {
    +			return;
    +		}
    +
    +		// If there are functions bound, to execute
    +		readyList.resolveWith( document, [ jQuery ] );
    +
    +		// Trigger any bound ready events
    +		if ( jQuery.fn.trigger ) {
    +			jQuery( document ).trigger("ready").off("ready");
    +		}
    +	},
    +
    +	// See test/unit/core.js for details concerning isFunction.
    +	// Since version 1.3, DOM methods and functions like alert
    +	// aren't supported. They return false on IE (#2968).
    +	isFunction: function( obj ) {
    +		return jQuery.type(obj) === "function";
    +	},
    +
    +	isArray: Array.isArray || function( obj ) {
    +		return jQuery.type(obj) === "array";
    +	},
    +
    +	isWindow: function( obj ) {
    +		return obj != null && obj == obj.window;
    +	},
    +
    +	isNumeric: function( obj ) {
    +		return !isNaN( parseFloat(obj) ) && isFinite( obj );
    +	},
    +
    +	type: function( obj ) {
    +		return obj == null ?
    +			String( obj ) :
    +			class2type[ core_toString.call(obj) ] || "object";
    +	},
    +
    +	isPlainObject: function( obj ) {
    +		// Must be an Object.
    +		// Because of IE, we also have to check the presence of the constructor property.
    +		// Make sure that DOM nodes and window objects don't pass through, as well
    +		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
    +			return false;
    +		}
    +
    +		try {
    +			// Not own constructor property must be Object
    +			if ( obj.constructor &&
    +				!core_hasOwn.call(obj, "constructor") &&
    +				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
    +				return false;
    +			}
    +		} catch ( e ) {
    +			// IE8,9 Will throw exceptions on certain host objects #9897
    +			return false;
    +		}
    +
    +		// Own properties are enumerated firstly, so to speed up,
    +		// if last one is own, then all properties are own.
    +
    +		var key;
    +		for ( key in obj ) {}
    +
    +		return key === undefined || core_hasOwn.call( obj, key );
    +	},
    +
    +	isEmptyObject: function( obj ) {
    +		var name;
    +		for ( name in obj ) {
    +			return false;
    +		}
    +		return true;
    +	},
    +
    +	error: function( msg ) {
    +		throw new Error( msg );
    +	},
    +
    +	// data: string of html
    +	// context (optional): If specified, the fragment will be created in this context, defaults to document
    +	// scripts (optional): If true, will include scripts passed in the html string
    +	parseHTML: function( data, context, scripts ) {
    +		var parsed;
    +		if ( !data || typeof data !== "string" ) {
    +			return null;
    +		}
    +		if ( typeof context === "boolean" ) {
    +			scripts = context;
    +			context = 0;
    +		}
    +		context = context || document;
    +
    +		// Single tag
    +		if ( (parsed = rsingleTag.exec( data )) ) {
    +			return [ context.createElement( parsed[1] ) ];
    +		}
    +
    +		parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
    +		return jQuery.merge( [],
    +			(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
    +	},
    +
    +	parseJSON: function( data ) {
    +		if ( !data || typeof data !== "string") {
    +			return null;
    +		}
    +
    +		// Make sure leading/trailing whitespace is removed (IE can't handle it)
    +		data = jQuery.trim( data );
    +
    +		// Attempt to parse using the native JSON parser first
    +		if ( window.JSON && window.JSON.parse ) {
    +			return window.JSON.parse( data );
    +		}
    +
    +		// Make sure the incoming data is actual JSON
    +		// Logic borrowed from http://json.org/json2.js
    +		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
    +			.replace( rvalidtokens, "]" )
    +			.replace( rvalidbraces, "")) ) {
    +
    +			return ( new Function( "return " + data ) )();
    +
    +		}
    +		jQuery.error( "Invalid JSON: " + data );
    +	},
    +
    +	// Cross-browser xml parsing
    +	parseXML: function( data ) {
    +		var xml, tmp;
    +		if ( !data || typeof data !== "string" ) {
    +			return null;
    +		}
    +		try {
    +			if ( window.DOMParser ) { // Standard
    +				tmp = new DOMParser();
    +				xml = tmp.parseFromString( data , "text/xml" );
    +			} else { // IE
    +				xml = new ActiveXObject( "Microsoft.XMLDOM" );
    +				xml.async = "false";
    +				xml.loadXML( data );
    +			}
    +		} catch( e ) {
    +			xml = undefined;
    +		}
    +		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
    +			jQuery.error( "Invalid XML: " + data );
    +		}
    +		return xml;
    +	},
    +
    +	noop: function() {},
    +
    +	// Evaluates a script in a global context
    +	// Workarounds based on findings by Jim Driscoll
    +	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
    +	globalEval: function( data ) {
    +		if ( data && core_rnotwhite.test( data ) ) {
    +			// We use execScript on Internet Explorer
    +			// We use an anonymous function so that context is window
    +			// rather than jQuery in Firefox
    +			( window.execScript || function( data ) {
    +				window[ "eval" ].call( window, data );
    +			} )( data );
    +		}
    +	},
    +
    +	// Convert dashed to camelCase; used by the css and data modules
    +	// Microsoft forgot to hump their vendor prefix (#9572)
    +	camelCase: function( string ) {
    +		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
    +	},
    +
    +	nodeName: function( elem, name ) {
    +		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
    +	},
    +
    +	// args is for internal usage only
    +	each: function( obj, callback, args ) {
    +		var name,
    +			i = 0,
    +			length = obj.length,
    +			isObj = length === undefined || jQuery.isFunction( obj );
    +
    +		if ( args ) {
    +			if ( isObj ) {
    +				for ( name in obj ) {
    +					if ( callback.apply( obj[ name ], args ) === false ) {
    +						break;
    +					}
    +				}
    +			} else {
    +				for ( ; i < length; ) {
    +					if ( callback.apply( obj[ i++ ], args ) === false ) {
    +						break;
    +					}
    +				}
    +			}
    +
    +		// A special, fast, case for the most common use of each
    +		} else {
    +			if ( isObj ) {
    +				for ( name in obj ) {
    +					if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
    +						break;
    +					}
    +				}
    +			} else {
    +				for ( ; i < length; ) {
    +					if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
    +						break;
    +					}
    +				}
    +			}
    +		}
    +
    +		return obj;
    +	},
    +
    +	// Use native String.trim function wherever possible
    +	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
    +		function( text ) {
    +			return text == null ?
    +				"" :
    +				core_trim.call( text );
    +		} :
    +
    +		// Otherwise use our own trimming functionality
    +		function( text ) {
    +			return text == null ?
    +				"" :
    +				( text + "" ).replace( rtrim, "" );
    +		},
    +
    +	// results is for internal usage only
    +	makeArray: function( arr, results ) {
    +		var type,
    +			ret = results || [];
    +
    +		if ( arr != null ) {
    +			// The window, strings (and functions) also have 'length'
    +			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
    +			type = jQuery.type( arr );
    +
    +			if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
    +				core_push.call( ret, arr );
    +			} else {
    +				jQuery.merge( ret, arr );
    +			}
    +		}
    +
    +		return ret;
    +	},
    +
    +	inArray: function( elem, arr, i ) {
    +		var len;
    +
    +		if ( arr ) {
    +			if ( core_indexOf ) {
    +				return core_indexOf.call( arr, elem, i );
    +			}
    +
    +			len = arr.length;
    +			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
    +
    +			for ( ; i < len; i++ ) {
    +				// Skip accessing in sparse arrays
    +				if ( i in arr && arr[ i ] === elem ) {
    +					return i;
    +				}
    +			}
    +		}
    +
    +		return -1;
    +	},
    +
    +	merge: function( first, second ) {
    +		var l = second.length,
    +			i = first.length,
    +			j = 0;
    +
    +		if ( typeof l === "number" ) {
    +			for ( ; j < l; j++ ) {
    +				first[ i++ ] = second[ j ];
    +			}
    +
    +		} else {
    +			while ( second[j] !== undefined ) {
    +				first[ i++ ] = second[ j++ ];
    +			}
    +		}
    +
    +		first.length = i;
    +
    +		return first;
    +	},
    +
    +	grep: function( elems, callback, inv ) {
    +		var retVal,
    +			ret = [],
    +			i = 0,
    +			length = elems.length;
    +		inv = !!inv;
    +
    +		// Go through the array, only saving the items
    +		// that pass the validator function
    +		for ( ; i < length; i++ ) {
    +			retVal = !!callback( elems[ i ], i );
    +			if ( inv !== retVal ) {
    +				ret.push( elems[ i ] );
    +			}
    +		}
    +
    +		return ret;
    +	},
    +
    +	// arg is for internal usage only
    +	map: function( elems, callback, arg ) {
    +		var value, key,
    +			ret = [],
    +			i = 0,
    +			length = elems.length,
    +			// jquery objects are treated as arrays
    +			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
    +
    +		// Go through the array, translating each of the items to their
    +		if ( isArray ) {
    +			for ( ; i < length; i++ ) {
    +				value = callback( elems[ i ], i, arg );
    +
    +				if ( value != null ) {
    +					ret[ ret.length ] = value;
    +				}
    +			}
    +
    +		// Go through every key on the object,
    +		} else {
    +			for ( key in elems ) {
    +				value = callback( elems[ key ], key, arg );
    +
    +				if ( value != null ) {
    +					ret[ ret.length ] = value;
    +				}
    +			}
    +		}
    +
    +		// Flatten any nested arrays
    +		return ret.concat.apply( [], ret );
    +	},
    +
    +	// A global GUID counter for objects
    +	guid: 1,
    +
    +	// Bind a function to a context, optionally partially applying any
    +	// arguments.
    +	proxy: function( fn, context ) {
    +		var tmp, args, proxy;
    +
    +		if ( typeof context === "string" ) {
    +			tmp = fn[ context ];
    +			context = fn;
    +			fn = tmp;
    +		}
    +
    +		// Quick check to determine if target is callable, in the spec
    +		// this throws a TypeError, but we will just return undefined.
    +		if ( !jQuery.isFunction( fn ) ) {
    +			return undefined;
    +		}
    +
    +		// Simulated bind
    +		args = core_slice.call( arguments, 2 );
    +		proxy = function() {
    +			return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
    +		};
    +
    +		// Set the guid of unique handler to the same of original handler, so it can be removed
    +		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
    +
    +		return proxy;
    +	},
    +
    +	// Multifunctional method to get and set values of a collection
    +	// The value/s can optionally be executed if it's a function
    +	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
    +		var exec,
    +			bulk = key == null,
    +			i = 0,
    +			length = elems.length;
    +
    +		// Sets many values
    +		if ( key && typeof key === "object" ) {
    +			for ( i in key ) {
    +				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
    +			}
    +			chainable = 1;
    +
    +		// Sets one value
    +		} else if ( value !== undefined ) {
    +			// Optionally, function values get executed if exec is true
    +			exec = pass === undefined && jQuery.isFunction( value );
    +
    +			if ( bulk ) {
    +				// Bulk operations only iterate when executing function values
    +				if ( exec ) {
    +					exec = fn;
    +					fn = function( elem, key, value ) {
    +						return exec.call( jQuery( elem ), value );
    +					};
    +
    +				// Otherwise they run against the entire set
    +				} else {
    +					fn.call( elems, value );
    +					fn = null;
    +				}
    +			}
    +
    +			if ( fn ) {
    +				for (; i < length; i++ ) {
    +					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
    +				}
    +			}
    +
    +			chainable = 1;
    +		}
    +
    +		return chainable ?
    +			elems :
    +
    +			// Gets
    +			bulk ?
    +				fn.call( elems ) :
    +				length ? fn( elems[0], key ) : emptyGet;
    +	},
    +
    +	now: function() {
    +		return ( new Date() ).getTime();
    +	}
    +});
    +
    +jQuery.ready.promise = function( obj ) {
    +	if ( !readyList ) {
    +
    +		readyList = jQuery.Deferred();
    +
    +		// Catch cases where $(document).ready() is called after the browser event has already occurred.
    +		// we once tried to use readyState "interactive" here, but it caused issues like the one
    +		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
    +		if ( document.readyState === "complete" ) {
    +			// Handle it asynchronously to allow scripts the opportunity to delay ready
    +			setTimeout( jQuery.ready, 1 );
    +
    +		// Standards-based browsers support DOMContentLoaded
    +		} else if ( document.addEventListener ) {
    +			// Use the handy event callback
    +			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
    +
    +			// A fallback to window.onload, that will always work
    +			window.addEventListener( "load", jQuery.ready, false );
    +
    +		// If IE event model is used
    +		} else {
    +			// Ensure firing before onload, maybe late but safe also for iframes
    +			document.attachEvent( "onreadystatechange", DOMContentLoaded );
    +
    +			// A fallback to window.onload, that will always work
    +			window.attachEvent( "onload", jQuery.ready );
    +
    +			// If IE and not a frame
    +			// continually check to see if the document is ready
    +			var top = false;
    +
    +			try {
    +				top = window.frameElement == null && document.documentElement;
    +			} catch(e) {}
    +
    +			if ( top && top.doScroll ) {
    +				(function doScrollCheck() {
    +					if ( !jQuery.isReady ) {
    +
    +						try {
    +							// Use the trick by Diego Perini
    +							// http://javascript.nwbox.com/IEContentLoaded/
    +							top.doScroll("left");
    +						} catch(e) {
    +							return setTimeout( doScrollCheck, 50 );
    +						}
    +
    +						// and execute any waiting functions
    +						jQuery.ready();
    +					}
    +				})();
    +			}
    +		}
    +	}
    +	return readyList.promise( obj );
    +};
    +
    +// Populate the class2type map
    +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
    +	class2type[ "[object " + name + "]" ] = name.toLowerCase();
    +});
    +
    +// All jQuery objects should point back to these
    +rootjQuery = jQuery(document);
    +// String to Object options format cache
    +var optionsCache = {};
    +
    +// Convert String-formatted options into Object-formatted ones and store in cache
    +function createOptions( options ) {
    +	var object = optionsCache[ options ] = {};
    +	jQuery.each( options.split( core_rspace ), function( _, flag ) {
    +		object[ flag ] = true;
    +	});
    +	return object;
    +}
    +
    +/*
    + * Create a callback list using the following parameters:
    + *
    + *	options: an optional list of space-separated options that will change how
    + *			the callback list behaves or a more traditional option object
    + *
    + * By default a callback list will act like an event callback list and can be
    + * "fired" multiple times.
    + *
    + * Possible options:
    + *
    + *	once:			will ensure the callback list can only be fired once (like a Deferred)
    + *
    + *	memory:			will keep track of previous values and will call any callback added
    + *					after the list has been fired right away with the latest "memorized"
    + *					values (like a Deferred)
    + *
    + *	unique:			will ensure a callback can only be added once (no duplicate in the list)
    + *
    + *	stopOnFalse:	interrupt callings when a callback returns false
    + *
    + */
    +jQuery.Callbacks = function( options ) {
    +
    +	// Convert options from String-formatted to Object-formatted if needed
    +	// (we check in cache first)
    +	options = typeof options === "string" ?
    +		( optionsCache[ options ] || createOptions( options ) ) :
    +		jQuery.extend( {}, options );
    +
    +	var // Last fire value (for non-forgettable lists)
    +		memory,
    +		// Flag to know if list was already fired
    +		fired,
    +		// Flag to know if list is currently firing
    +		firing,
    +		// First callback to fire (used internally by add and fireWith)
    +		firingStart,
    +		// End of the loop when firing
    +		firingLength,
    +		// Index of currently firing callback (modified by remove if needed)
    +		firingIndex,
    +		// Actual callback list
    +		list = [],
    +		// Stack of fire calls for repeatable lists
    +		stack = !options.once && [],
    +		// Fire callbacks
    +		fire = function( data ) {
    +			memory = options.memory && data;
    +			fired = true;
    +			firingIndex = firingStart || 0;
    +			firingStart = 0;
    +			firingLength = list.length;
    +			firing = true;
    +			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
    +				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
    +					memory = false; // To prevent further calls using add
    +					break;
    +				}
    +			}
    +			firing = false;
    +			if ( list ) {
    +				if ( stack ) {
    +					if ( stack.length ) {
    +						fire( stack.shift() );
    +					}
    +				} else if ( memory ) {
    +					list = [];
    +				} else {
    +					self.disable();
    +				}
    +			}
    +		},
    +		// Actual Callbacks object
    +		self = {
    +			// Add a callback or a collection of callbacks to the list
    +			add: function() {
    +				if ( list ) {
    +					// First, we save the current length
    +					var start = list.length;
    +					(function add( args ) {
    +						jQuery.each( args, function( _, arg ) {
    +							var type = jQuery.type( arg );
    +							if ( type === "function" ) {
    +								if ( !options.unique || !self.has( arg ) ) {
    +									list.push( arg );
    +								}
    +							} else if ( arg && arg.length && type !== "string" ) {
    +								// Inspect recursively
    +								add( arg );
    +							}
    +						});
    +					})( arguments );
    +					// Do we need to add the callbacks to the
    +					// current firing batch?
    +					if ( firing ) {
    +						firingLength = list.length;
    +					// With memory, if we're not firing then
    +					// we should call right away
    +					} else if ( memory ) {
    +						firingStart = start;
    +						fire( memory );
    +					}
    +				}
    +				return this;
    +			},
    +			// Remove a callback from the list
    +			remove: function() {
    +				if ( list ) {
    +					jQuery.each( arguments, function( _, arg ) {
    +						var index;
    +						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
    +							list.splice( index, 1 );
    +							// Handle firing indexes
    +							if ( firing ) {
    +								if ( index <= firingLength ) {
    +									firingLength--;
    +								}
    +								if ( index <= firingIndex ) {
    +									firingIndex--;
    +								}
    +							}
    +						}
    +					});
    +				}
    +				return this;
    +			},
    +			// Control if a given callback is in the list
    +			has: function( fn ) {
    +				return jQuery.inArray( fn, list ) > -1;
    +			},
    +			// Remove all callbacks from the list
    +			empty: function() {
    +				list = [];
    +				return this;
    +			},
    +			// Have the list do nothing anymore
    +			disable: function() {
    +				list = stack = memory = undefined;
    +				return this;
    +			},
    +			// Is it disabled?
    +			disabled: function() {
    +				return !list;
    +			},
    +			// Lock the list in its current state
    +			lock: function() {
    +				stack = undefined;
    +				if ( !memory ) {
    +					self.disable();
    +				}
    +				return this;
    +			},
    +			// Is it locked?
    +			locked: function() {
    +				return !stack;
    +			},
    +			// Call all callbacks with the given context and arguments
    +			fireWith: function( context, args ) {
    +				args = args || [];
    +				args = [ context, args.slice ? args.slice() : args ];
    +				if ( list && ( !fired || stack ) ) {
    +					if ( firing ) {
    +						stack.push( args );
    +					} else {
    +						fire( args );
    +					}
    +				}
    +				return this;
    +			},
    +			// Call all the callbacks with the given arguments
    +			fire: function() {
    +				self.fireWith( this, arguments );
    +				return this;
    +			},
    +			// To know if the callbacks have already been called at least once
    +			fired: function() {
    +				return !!fired;
    +			}
    +		};
    +
    +	return self;
    +};
    +jQuery.extend({
    +
    +	Deferred: function( func ) {
    +		var tuples = [
    +				// action, add listener, listener list, final state
    +				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
    +				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
    +				[ "notify", "progress", jQuery.Callbacks("memory") ]
    +			],
    +			state = "pending",
    +			promise = {
    +				state: function() {
    +					return state;
    +				},
    +				always: function() {
    +					deferred.done( arguments ).fail( arguments );
    +					return this;
    +				},
    +				then: function( /* fnDone, fnFail, fnProgress */ ) {
    +					var fns = arguments;
    +					return jQuery.Deferred(function( newDefer ) {
    +						jQuery.each( tuples, function( i, tuple ) {
    +							var action = tuple[ 0 ],
    +								fn = fns[ i ];
    +							// deferred[ done | fail | progress ] for forwarding actions to newDefer
    +							deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
    +								function() {
    +									var returned = fn.apply( this, arguments );
    +									if ( returned && jQuery.isFunction( returned.promise ) ) {
    +										returned.promise()
    +											.done( newDefer.resolve )
    +											.fail( newDefer.reject )
    +											.progress( newDefer.notify );
    +									} else {
    +										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
    +									}
    +								} :
    +								newDefer[ action ]
    +							);
    +						});
    +						fns = null;
    +					}).promise();
    +				},
    +				// Get a promise for this deferred
    +				// If obj is provided, the promise aspect is added to the object
    +				promise: function( obj ) {
    +					return obj != null ? jQuery.extend( obj, promise ) : promise;
    +				}
    +			},
    +			deferred = {};
    +
    +		// Keep pipe for back-compat
    +		promise.pipe = promise.then;
    +
    +		// Add list-specific methods
    +		jQuery.each( tuples, function( i, tuple ) {
    +			var list = tuple[ 2 ],
    +				stateString = tuple[ 3 ];
    +
    +			// promise[ done | fail | progress ] = list.add
    +			promise[ tuple[1] ] = list.add;
    +
    +			// Handle state
    +			if ( stateString ) {
    +				list.add(function() {
    +					// state = [ resolved | rejected ]
    +					state = stateString;
    +
    +				// [ reject_list | resolve_list ].disable; progress_list.lock
    +				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
    +			}
    +
    +			// deferred[ resolve | reject | notify ] = list.fire
    +			deferred[ tuple[0] ] = list.fire;
    +			deferred[ tuple[0] + "With" ] = list.fireWith;
    +		});
    +
    +		// Make the deferred a promise
    +		promise.promise( deferred );
    +
    +		// Call given func if any
    +		if ( func ) {
    +			func.call( deferred, deferred );
    +		}
    +
    +		// All done!
    +		return deferred;
    +	},
    +
    +	// Deferred helper
    +	when: function( subordinate /* , ..., subordinateN */ ) {
    +		var i = 0,
    +			resolveValues = core_slice.call( arguments ),
    +			length = resolveValues.length,
    +
    +			// the count of uncompleted subordinates
    +			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
    +
    +			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
    +			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
    +
    +			// Update function for both resolve and progress values
    +			updateFunc = function( i, contexts, values ) {
    +				return function( value ) {
    +					contexts[ i ] = this;
    +					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
    +					if( values === progressValues ) {
    +						deferred.notifyWith( contexts, values );
    +					} else if ( !( --remaining ) ) {
    +						deferred.resolveWith( contexts, values );
    +					}
    +				};
    +			},
    +
    +			progressValues, progressContexts, resolveContexts;
    +
    +		// add listeners to Deferred subordinates; treat others as resolved
    +		if ( length > 1 ) {
    +			progressValues = new Array( length );
    +			progressContexts = new Array( length );
    +			resolveContexts = new Array( length );
    +			for ( ; i < length; i++ ) {
    +				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
    +					resolveValues[ i ].promise()
    +						.done( updateFunc( i, resolveContexts, resolveValues ) )
    +						.fail( deferred.reject )
    +						.progress( updateFunc( i, progressContexts, progressValues ) );
    +				} else {
    +					--remaining;
    +				}
    +			}
    +		}
    +
    +		// if we're not waiting on anything, resolve the master
    +		if ( !remaining ) {
    +			deferred.resolveWith( resolveContexts, resolveValues );
    +		}
    +
    +		return deferred.promise();
    +	}
    +});
    +jQuery.support = (function() {
    +
    +	var support,
    +		all,
    +		a,
    +		select,
    +		opt,
    +		input,
    +		fragment,
    +		eventName,
    +		i,
    +		isSupported,
    +		clickFn,
    +		div = document.createElement("div");
    +
    +	// Setup
    +	div.setAttribute( "className", "t" );
    +	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
    +
    +	// Support tests won't run in some limited or non-browser environments
    +	all = div.getElementsByTagName("*");
    +	a = div.getElementsByTagName("a")[ 0 ];
    +	if ( !all || !a || !all.length ) {
    +		return {};
    +	}
    +
    +	// First batch of tests
    +	select = document.createElement("select");
    +	opt = select.appendChild( document.createElement("option") );
    +	input = div.getElementsByTagName("input")[ 0 ];
    +
    +	a.style.cssText = "top:1px;float:left;opacity:.5";
    +	support = {
    +		// IE strips leading whitespace when .innerHTML is used
    +		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
    +
    +		// Make sure that tbody elements aren't automatically inserted
    +		// IE will insert them into empty tables
    +		tbody: !div.getElementsByTagName("tbody").length,
    +
    +		// Make sure that link elements get serialized correctly by innerHTML
    +		// This requires a wrapper element in IE
    +		htmlSerialize: !!div.getElementsByTagName("link").length,
    +
    +		// Get the style information from getAttribute
    +		// (IE uses .cssText instead)
    +		style: /top/.test( a.getAttribute("style") ),
    +
    +		// Make sure that URLs aren't manipulated
    +		// (IE normalizes it by default)
    +		hrefNormalized: ( a.getAttribute("href") === "/a" ),
    +
    +		// Make sure that element opacity exists
    +		// (IE uses filter instead)
    +		// Use a regex to work around a WebKit issue. See #5145
    +		opacity: /^0.5/.test( a.style.opacity ),
    +
    +		// Verify style float existence
    +		// (IE uses styleFloat instead of cssFloat)
    +		cssFloat: !!a.style.cssFloat,
    +
    +		// Make sure that if no value is specified for a checkbox
    +		// that it defaults to "on".
    +		// (WebKit defaults to "" instead)
    +		checkOn: ( input.value === "on" ),
    +
    +		// Make sure that a selected-by-default option has a working selected property.
    +		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
    +		optSelected: opt.selected,
    +
    +		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
    +		getSetAttribute: div.className !== "t",
    +
    +		// Tests for enctype support on a form (#6743)
    +		enctype: !!document.createElement("form").enctype,
    +
    +		// Makes sure cloning an html5 element does not cause problems
    +		// Where outerHTML is undefined, this still works
    +		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
    +
    +		// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
    +		boxModel: ( document.compatMode === "CSS1Compat" ),
    +
    +		// Will be defined later
    +		submitBubbles: true,
    +		changeBubbles: true,
    +		focusinBubbles: false,
    +		deleteExpando: true,
    +		noCloneEvent: true,
    +		inlineBlockNeedsLayout: false,
    +		shrinkWrapBlocks: false,
    +		reliableMarginRight: true,
    +		boxSizingReliable: true,
    +		pixelPosition: false
    +	};
    +
    +	// Make sure checked status is properly cloned
    +	input.checked = true;
    +	support.noCloneChecked = input.cloneNode( true ).checked;
    +
    +	// Make sure that the options inside disabled selects aren't marked as disabled
    +	// (WebKit marks them as disabled)
    +	select.disabled = true;
    +	support.optDisabled = !opt.disabled;
    +
    +	// Test to see if it's possible to delete an expando from an element
    +	// Fails in Internet Explorer
    +	try {
    +		delete div.test;
    +	} catch( e ) {
    +		support.deleteExpando = false;
    +	}
    +
    +	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
    +		div.attachEvent( "onclick", clickFn = function() {
    +			// Cloning a node shouldn't copy over any
    +			// bound event handlers (IE does this)
    +			support.noCloneEvent = false;
    +		});
    +		div.cloneNode( true ).fireEvent("onclick");
    +		div.detachEvent( "onclick", clickFn );
    +	}
    +
    +	// Check if a radio maintains its value
    +	// after being appended to the DOM
    +	input = document.createElement("input");
    +	input.value = "t";
    +	input.setAttribute( "type", "radio" );
    +	support.radioValue = input.value === "t";
    +
    +	input.setAttribute( "checked", "checked" );
    +
    +	// #11217 - WebKit loses check when the name is after the checked attribute
    +	input.setAttribute( "name", "t" );
    +
    +	div.appendChild( input );
    +	fragment = document.createDocumentFragment();
    +	fragment.appendChild( div.lastChild );
    +
    +	// WebKit doesn't clone checked state correctly in fragments
    +	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
    +
    +	// Check if a disconnected checkbox will retain its checked
    +	// value of true after appended to the DOM (IE6/7)
    +	support.appendChecked = input.checked;
    +
    +	fragment.removeChild( input );
    +	fragment.appendChild( div );
    +
    +	// Technique from Juriy Zaytsev
    +	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
    +	// We only care about the case where non-standard event systems
    +	// are used, namely in IE. Short-circuiting here helps us to
    +	// avoid an eval call (in setAttribute) which can cause CSP
    +	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
    +	if ( div.attachEvent ) {
    +		for ( i in {
    +			submit: true,
    +			change: true,
    +			focusin: true
    +		}) {
    +			eventName = "on" + i;
    +			isSupported = ( eventName in div );
    +			if ( !isSupported ) {
    +				div.setAttribute( eventName, "return;" );
    +				isSupported = ( typeof div[ eventName ] === "function" );
    +			}
    +			support[ i + "Bubbles" ] = isSupported;
    +		}
    +	}
    +
    +	// Run tests that need a body at doc ready
    +	jQuery(function() {
    +		var container, div, tds, marginDiv,
    +			divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
    +			body = document.getElementsByTagName("body")[0];
    +
    +		if ( !body ) {
    +			// Return for frameset docs that don't have a body
    +			return;
    +		}
    +
    +		container = document.createElement("div");
    +		container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
    +		body.insertBefore( container, body.firstChild );
    +
    +		// Construct the test element
    +		div = document.createElement("div");
    +		container.appendChild( div );
    +
    +		// Check if table cells still have offsetWidth/Height when they are set
    +		// to display:none and there are still other visible table cells in a
    +		// table row; if so, offsetWidth/Height are not reliable for use when
    +		// determining if an element has been hidden directly using
    +		// display:none (it is still safe to use offsets if a parent element is
    +		// hidden; don safety goggles and see bug #4512 for more information).
    +		// (only IE 8 fails this test)
    +		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
    +		tds = div.getElementsByTagName("td");
    +		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
    +		isSupported = ( tds[ 0 ].offsetHeight === 0 );
    +
    +		tds[ 0 ].style.display = "";
    +		tds[ 1 ].style.display = "none";
    +
    +		// Check if empty table cells still have offsetWidth/Height
    +		// (IE <= 8 fail this test)
    +		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
    +
    +		// Check box-sizing and margin behavior
    +		div.innerHTML = "";
    +		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
    +		support.boxSizing = ( div.offsetWidth === 4 );
    +		support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
    +
    +		// NOTE: To any future maintainer, we've window.getComputedStyle
    +		// because jsdom on node.js will break without it.
    +		if ( window.getComputedStyle ) {
    +			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
    +			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
    +
    +			// Check if div with explicit width and no margin-right incorrectly
    +			// gets computed margin-right based on width of container. For more
    +			// info see bug #3333
    +			// Fails in WebKit before Feb 2011 nightlies
    +			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
    +			marginDiv = document.createElement("div");
    +			marginDiv.style.cssText = div.style.cssText = divReset;
    +			marginDiv.style.marginRight = marginDiv.style.width = "0";
    +			div.style.width = "1px";
    +			div.appendChild( marginDiv );
    +			support.reliableMarginRight =
    +				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
    +		}
    +
    +		if ( typeof div.style.zoom !== "undefined" ) {
    +			// Check if natively block-level elements act like inline-block
    +			// elements when setting their display to 'inline' and giving
    +			// them layout
    +			// (IE < 8 does this)
    +			div.innerHTML = "";
    +			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
    +			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
    +
    +			// Check if elements with layout shrink-wrap their children
    +			// (IE 6 does this)
    +			div.style.display = "block";
    +			div.style.overflow = "visible";
    +			div.innerHTML = "<div></div>";
    +			div.firstChild.style.width = "5px";
    +			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
    +
    +			container.style.zoom = 1;
    +		}
    +
    +		// Null elements to avoid leaks in IE
    +		body.removeChild( container );
    +		container = div = tds = marginDiv = null;
    +	});
    +
    +	// Null elements to avoid leaks in IE
    +	fragment.removeChild( div );
    +	all = a = select = opt = input = fragment = div = null;
    +
    +	return support;
    +})();
    +var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
    +	rmultiDash = /([A-Z])/g;
    +
    +jQuery.extend({
    +	cache: {},
    +
    +	deletedIds: [],
    +
    +	// Remove at next major release (1.9/2.0)
    +	uuid: 0,
    +
    +	// Unique for each copy of jQuery on the page
    +	// Non-digits removed to match rinlinejQuery
    +	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
    +
    +	// The following elements throw uncatchable exceptions if you
    +	// attempt to add expando properties to them.
    +	noData: {
    +		"embed": true,
    +		// Ban all objects except for Flash (which handle expandos)
    +		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
    +		"applet": true
    +	},
    +
    +	hasData: function( elem ) {
    +		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
    +		return !!elem && !isEmptyDataObject( elem );
    +	},
    +
    +	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
    +		if ( !jQuery.acceptData( elem ) ) {
    +			return;
    +		}
    +
    +		var thisCache, ret,
    +			internalKey = jQuery.expando,
    +			getByName = typeof name === "string",
    +
    +			// We have to handle DOM nodes and JS objects differently because IE6-7
    +			// can't GC object references properly across the DOM-JS boundary
    +			isNode = elem.nodeType,
    +
    +			// Only DOM nodes need the global jQuery cache; JS object data is
    +			// attached directly to the object so GC can occur automatically
    +			cache = isNode ? jQuery.cache : elem,
    +
    +			// Only defining an ID for JS objects if its cache already exists allows
    +			// the code to shortcut on the same path as a DOM node with no cache
    +			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
    +
    +		// Avoid doing any more work than we need to when trying to get data on an
    +		// object that has no data at all
    +		if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
    +			return;
    +		}
    +
    +		if ( !id ) {
    +			// Only DOM nodes need a new unique ID for each element since their data
    +			// ends up in the global cache
    +			if ( isNode ) {
    +				elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
    +			} else {
    +				id = internalKey;
    +			}
    +		}
    +
    +		if ( !cache[ id ] ) {
    +			cache[ id ] = {};
    +
    +			// Avoids exposing jQuery metadata on plain JS objects when the object
    +			// is serialized using JSON.stringify
    +			if ( !isNode ) {
    +				cache[ id ].toJSON = jQuery.noop;
    +			}
    +		}
    +
    +		// An object can be passed to jQuery.data instead of a key/value pair; this gets
    +		// shallow copied over onto the existing cache
    +		if ( typeof name === "object" || typeof name === "function" ) {
    +			if ( pvt ) {
    +				cache[ id ] = jQuery.extend( cache[ id ], name );
    +			} else {
    +				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
    +			}
    +		}
    +
    +		thisCache = cache[ id ];
    +
    +		// jQuery data() is stored in a separate object inside the object's internal data
    +		// cache in order to avoid key collisions between internal data and user-defined
    +		// data.
    +		if ( !pvt ) {
    +			if ( !thisCache.data ) {
    +				thisCache.data = {};
    +			}
    +
    +			thisCache = thisCache.data;
    +		}
    +
    +		if ( data !== undefined ) {
    +			thisCache[ jQuery.camelCase( name ) ] = data;
    +		}
    +
    +		// Check for both converted-to-camel and non-converted data property names
    +		// If a data property was specified
    +		if ( getByName ) {
    +
    +			// First Try to find as-is property data
    +			ret = thisCache[ name ];
    +
    +			// Test for null|undefined property data
    +			if ( ret == null ) {
    +
    +				// Try to find the camelCased property
    +				ret = thisCache[ jQuery.camelCase( name ) ];
    +			}
    +		} else {
    +			ret = thisCache;
    +		}
    +
    +		return ret;
    +	},
    +
    +	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
    +		if ( !jQuery.acceptData( elem ) ) {
    +			return;
    +		}
    +
    +		var thisCache, i, l,
    +
    +			isNode = elem.nodeType,
    +
    +			// See jQuery.data for more information
    +			cache = isNode ? jQuery.cache : elem,
    +			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
    +
    +		// If there is already no cache entry for this object, there is no
    +		// purpose in continuing
    +		if ( !cache[ id ] ) {
    +			return;
    +		}
    +
    +		if ( name ) {
    +
    +			thisCache = pvt ? cache[ id ] : cache[ id ].data;
    +
    +			if ( thisCache ) {
    +
    +				// Support array or space separated string names for data keys
    +				if ( !jQuery.isArray( name ) ) {
    +
    +					// try the string as a key before any manipulation
    +					if ( name in thisCache ) {
    +						name = [ name ];
    +					} else {
    +
    +						// split the camel cased version by spaces unless a key with the spaces exists
    +						name = jQuery.camelCase( name );
    +						if ( name in thisCache ) {
    +							name = [ name ];
    +						} else {
    +							name = name.split(" ");
    +						}
    +					}
    +				}
    +
    +				for ( i = 0, l = name.length; i < l; i++ ) {
    +					delete thisCache[ name[i] ];
    +				}
    +
    +				// If there is no data left in the cache, we want to continue
    +				// and let the cache object itself get destroyed
    +				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
    +					return;
    +				}
    +			}
    +		}
    +
    +		// See jQuery.data for more information
    +		if ( !pvt ) {
    +			delete cache[ id ].data;
    +
    +			// Don't destroy the parent cache unless the internal data object
    +			// had been the only thing left in it
    +			if ( !isEmptyDataObject( cache[ id ] ) ) {
    +				return;
    +			}
    +		}
    +
    +		// Destroy the cache
    +		if ( isNode ) {
    +			jQuery.cleanData( [ elem ], true );
    +
    +		// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
    +		} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
    +			delete cache[ id ];
    +
    +		// When all else fails, null
    +		} else {
    +			cache[ id ] = null;
    +		}
    +	},
    +
    +	// For internal use only.
    +	_data: function( elem, name, data ) {
    +		return jQuery.data( elem, name, data, true );
    +	},
    +
    +	// A method for determining if a DOM node can handle the data expando
    +	acceptData: function( elem ) {
    +		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
    +
    +		// nodes accept data unless otherwise specified; rejection can be conditional
    +		return !noData || noData !== true && elem.getAttribute("classid") === noData;
    +	}
    +});
    +
    +jQuery.fn.extend({
    +	data: function( key, value ) {
    +		var parts, part, attr, name, l,
    +			elem = this[0],
    +			i = 0,
    +			data = null;
    +
    +		// Gets all values
    +		if ( key === undefined ) {
    +			if ( this.length ) {
    +				data = jQuery.data( elem );
    +
    +				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
    +					attr = elem.attributes;
    +					for ( l = attr.length; i < l; i++ ) {
    +						name = attr[i].name;
    +
    +						if ( !name.indexOf( "data-" ) ) {
    +							name = jQuery.camelCase( name.substring(5) );
    +
    +							dataAttr( elem, name, data[ name ] );
    +						}
    +					}
    +					jQuery._data( elem, "parsedAttrs", true );
    +				}
    +			}
    +
    +			return data;
    +		}
    +
    +		// Sets multiple values
    +		if ( typeof key === "object" ) {
    +			return this.each(function() {
    +				jQuery.data( this, key );
    +			});
    +		}
    +
    +		parts = key.split( ".", 2 );
    +		parts[1] = parts[1] ? "." + parts[1] : "";
    +		part = parts[1] + "!";
    +
    +		return jQuery.access( this, function( value ) {
    +
    +			if ( value === undefined ) {
    +				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
    +
    +				// Try to fetch any internally stored data first
    +				if ( data === undefined && elem ) {
    +					data = jQuery.data( elem, key );
    +					data = dataAttr( elem, key, data );
    +				}
    +
    +				return data === undefined && parts[1] ?
    +					this.data( parts[0] ) :
    +					data;
    +			}
    +
    +			parts[1] = value;
    +			this.each(function() {
    +				var self = jQuery( this );
    +
    +				self.triggerHandler( "setData" + part, parts );
    +				jQuery.data( this, key, value );
    +				self.triggerHandler( "changeData" + part, parts );
    +			});
    +		}, null, value, arguments.length > 1, null, false );
    +	},
    +
    +	removeData: function( key ) {
    +		return this.each(function() {
    +			jQuery.removeData( this, key );
    +		});
    +	}
    +});
    +
    +function dataAttr( elem, key, data ) {
    +	// If nothing was found internally, try to fetch any
    +	// data from the HTML5 data-* attribute
    +	if ( data === undefined && elem.nodeType === 1 ) {
    +
    +		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
    +
    +		data = elem.getAttribute( name );
    +
    +		if ( typeof data === "string" ) {
    +			try {
    +				data = data === "true" ? true :
    +				data === "false" ? false :
    +				data === "null" ? null :
    +				// Only convert to a number if it doesn't change the string
    +				+data + "" === data ? +data :
    +				rbrace.test( data ) ? jQuery.parseJSON( data ) :
    +					data;
    +			} catch( e ) {}
    +
    +			// Make sure we set the data so it isn't changed later
    +			jQuery.data( elem, key, data );
    +
    +		} else {
    +			data = undefined;
    +		}
    +	}
    +
    +	return data;
    +}
    +
    +// checks a cache object for emptiness
    +function isEmptyDataObject( obj ) {
    +	var name;
    +	for ( name in obj ) {
    +
    +		// if the public data object is empty, the private is still empty
    +		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
    +			continue;
    +		}
    +		if ( name !== "toJSON" ) {
    +			return false;
    +		}
    +	}
    +
    +	return true;
    +}
    +jQuery.extend({
    +	queue: function( elem, type, data ) {
    +		var queue;
    +
    +		if ( elem ) {
    +			type = ( type || "fx" ) + "queue";
    +			queue = jQuery._data( elem, type );
    +
    +			// Speed up dequeue by getting out quickly if this is just a lookup
    +			if ( data ) {
    +				if ( !queue || jQuery.isArray(data) ) {
    +					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
    +				} else {
    +					queue.push( data );
    +				}
    +			}
    +			return queue || [];
    +		}
    +	},
    +
    +	dequeue: function( elem, type ) {
    +		type = type || "fx";
    +
    +		var queue = jQuery.queue( elem, type ),
    +			startLength = queue.length,
    +			fn = queue.shift(),
    +			hooks = jQuery._queueHooks( elem, type ),
    +			next = function() {
    +				jQuery.dequeue( elem, type );
    +			};
    +
    +		// If the fx queue is dequeued, always remove the progress sentinel
    +		if ( fn === "inprogress" ) {
    +			fn = queue.shift();
    +			startLength--;
    +		}
    +
    +		if ( fn ) {
    +
    +			// Add a progress sentinel to prevent the fx queue from being
    +			// automatically dequeued
    +			if ( type === "fx" ) {
    +				queue.unshift( "inprogress" );
    +			}
    +
    +			// clear up the last queue stop function
    +			delete hooks.stop;
    +			fn.call( elem, next, hooks );
    +		}
    +
    +		if ( !startLength && hooks ) {
    +			hooks.empty.fire();
    +		}
    +	},
    +
    +	// not intended for public consumption - generates a queueHooks object, or returns the current one
    +	_queueHooks: function( elem, type ) {
    +		var key = type + "queueHooks";
    +		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
    +			empty: jQuery.Callbacks("once memory").add(function() {
    +				jQuery.removeData( elem, type + "queue", true );
    +				jQuery.removeData( elem, key, true );
    +			})
    +		});
    +	}
    +});
    +
    +jQuery.fn.extend({
    +	queue: function( type, data ) {
    +		var setter = 2;
    +
    +		if ( typeof type !== "string" ) {
    +			data = type;
    +			type = "fx";
    +			setter--;
    +		}
    +
    +		if ( arguments.length < setter ) {
    +			return jQuery.queue( this[0], type );
    +		}
    +
    +		return data === undefined ?
    +			this :
    +			this.each(function() {
    +				var queue = jQuery.queue( this, type, data );
    +
    +				// ensure a hooks for this queue
    +				jQuery._queueHooks( this, type );
    +
    +				if ( type === "fx" && queue[0] !== "inprogress" ) {
    +					jQuery.dequeue( this, type );
    +				}
    +			});
    +	},
    +	dequeue: function( type ) {
    +		return this.each(function() {
    +			jQuery.dequeue( this, type );
    +		});
    +	},
    +	// Based off of the plugin by Clint Helfers, with permission.
    +	// http://blindsignals.com/index.php/2009/07/jquery-delay/
    +	delay: function( time, type ) {
    +		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
    +		type = type || "fx";
    +
    +		return this.queue( type, function( next, hooks ) {
    +			var timeout = setTimeout( next, time );
    +			hooks.stop = function() {
    +				clearTimeout( timeout );
    +			};
    +		});
    +	},
    +	clearQueue: function( type ) {
    +		return this.queue( type || "fx", [] );
    +	},
    +	// Get a promise resolved when queues of a certain type
    +	// are emptied (fx is the type by default)
    +	promise: function( type, obj ) {
    +		var tmp,
    +			count = 1,
    +			defer = jQuery.Deferred(),
    +			elements = this,
    +			i = this.length,
    +			resolve = function() {
    +				if ( !( --count ) ) {
    +					defer.resolveWith( elements, [ elements ] );
    +				}
    +			};
    +
    +		if ( typeof type !== "string" ) {
    +			obj = type;
    +			type = undefined;
    +		}
    +		type = type || "fx";
    +
    +		while( i-- ) {
    +			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
    +			if ( tmp && tmp.empty ) {
    +				count++;
    +				tmp.empty.add( resolve );
    +			}
    +		}
    +		resolve();
    +		return defer.promise( obj );
    +	}
    +});
    +var nodeHook, boolHook, fixSpecified,
    +	rclass = /[\t\r\n]/g,
    +	rreturn = /\r/g,
    +	rtype = /^(?:button|input)$/i,
    +	rfocusable = /^(?:button|input|object|select|textarea)$/i,
    +	rclickable = /^a(?:rea|)$/i,
    +	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
    +	getSetAttribute = jQuery.support.getSetAttribute;
    +
    +jQuery.fn.extend({
    +	attr: function( name, value ) {
    +		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
    +	},
    +
    +	removeAttr: function( name ) {
    +		return this.each(function() {
    +			jQuery.removeAttr( this, name );
    +		});
    +	},
    +
    +	prop: function( name, value ) {
    +		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
    +	},
    +
    +	removeProp: function( name ) {
    +		name = jQuery.propFix[ name ] || name;
    +		return this.each(function() {
    +			// try/catch handles cases where IE balks (such as removing a property on window)
    +			try {
    +				this[ name ] = undefined;
    +				delete this[ name ];
    +			} catch( e ) {}
    +		});
    +	},
    +
    +	addClass: function( value ) {
    +		var classNames, i, l, elem,
    +			setClass, c, cl;
    +
    +		if ( jQuery.isFunction( value ) ) {
    +			return this.each(function( j ) {
    +				jQuery( this ).addClass( value.call(this, j, this.className) );
    +			});
    +		}
    +
    +		if ( value && typeof value === "string" ) {
    +			classNames = value.split( core_rspace );
    +
    +			for ( i = 0, l = this.length; i < l; i++ ) {
    +				elem = this[ i ];
    +
    +				if ( elem.nodeType === 1 ) {
    +					if ( !elem.className && classNames.length === 1 ) {
    +						elem.className = value;
    +
    +					} else {
    +						setClass = " " + elem.className + " ";
    +
    +						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
    +							if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
    +								setClass += classNames[ c ] + " ";
    +							}
    +						}
    +						elem.className = jQuery.trim( setClass );
    +					}
    +				}
    +			}
    +		}
    +
    +		return this;
    +	},
    +
    +	removeClass: function( value ) {
    +		var removes, className, elem, c, cl, i, l;
    +
    +		if ( jQuery.isFunction( value ) ) {
    +			return this.each(function( j ) {
    +				jQuery( this ).removeClass( value.call(this, j, this.className) );
    +			});
    +		}
    +		if ( (value && typeof value === "string") || value === undefined ) {
    +			removes = ( value || "" ).split( core_rspace );
    +
    +			for ( i = 0, l = this.length; i < l; i++ ) {
    +				elem = this[ i ];
    +				if ( elem.nodeType === 1 && elem.className ) {
    +
    +					className = (" " + elem.className + " ").replace( rclass, " " );
    +
    +					// loop over each item in the removal list
    +					for ( c = 0, cl = removes.length; c < cl; c++ ) {
    +						// Remove until there is nothing to remove,
    +						while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
    +							className = className.replace( " " + removes[ c ] + " " , " " );
    +						}
    +					}
    +					elem.className = value ? jQuery.trim( className ) : "";
    +				}
    +			}
    +		}
    +
    +		return this;
    +	},
    +
    +	toggleClass: function( value, stateVal ) {
    +		var type = typeof value,
    +			isBool = typeof stateVal === "boolean";
    +
    +		if ( jQuery.isFunction( value ) ) {
    +			return this.each(function( i ) {
    +				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
    +			});
    +		}
    +
    +		return this.each(function() {
    +			if ( type === "string" ) {
    +				// toggle individual class names
    +				var className,
    +					i = 0,
    +					self = jQuery( this ),
    +					state = stateVal,
    +					classNames = value.split( core_rspace );
    +
    +				while ( (className = classNames[ i++ ]) ) {
    +					// check each className given, space separated list
    +					state = isBool ? state : !self.hasClass( className );
    +					self[ state ? "addClass" : "removeClass" ]( className );
    +				}
    +
    +			} else if ( type === "undefined" || type === "boolean" ) {
    +				if ( this.className ) {
    +					// store className if set
    +					jQuery._data( this, "__className__", this.className );
    +				}
    +
    +				// toggle whole className
    +				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
    +			}
    +		});
    +	},
    +
    +	hasClass: function( selector ) {
    +		var className = " " + selector + " ",
    +			i = 0,
    +			l = this.length;
    +		for ( ; i < l; i++ ) {
    +			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
    +				return true;
    +			}
    +		}
    +
    +		return false;
    +	},
    +
    +	val: function( value ) {
    +		var hooks, ret, isFunction,
    +			elem = this[0];
    +
    +		if ( !arguments.length ) {
    +			if ( elem ) {
    +				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
    +
    +				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
    +					return ret;
    +				}
    +
    +				ret = elem.value;
    +
    +				return typeof ret === "string" ?
    +					// handle most common string cases
    +					ret.replace(rreturn, "") :
    +					// handle cases where value is null/undef or number
    +					ret == null ? "" : ret;
    +			}
    +
    +			return;
    +		}
    +
    +		isFunction = jQuery.isFunction( value );
    +
    +		return this.each(function( i ) {
    +			var val,
    +				self = jQuery(this);
    +
    +			if ( this.nodeType !== 1 ) {
    +				return;
    +			}
    +
    +			if ( isFunction ) {
    +				val = value.call( this, i, self.val() );
    +			} else {
    +				val = value;
    +			}
    +
    +			// Treat null/undefined as ""; convert numbers to string
    +			if ( val == null ) {
    +				val = "";
    +			} else if ( typeof val === "number" ) {
    +				val += "";
    +			} else if ( jQuery.isArray( val ) ) {
    +				val = jQuery.map(val, function ( value ) {
    +					return value == null ? "" : value + "";
    +				});
    +			}
    +
    +			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
    +
    +			// If set returns undefined, fall back to normal setting
    +			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
    +				this.value = val;
    +			}
    +		});
    +	}
    +});
    +
    +jQuery.extend({
    +	valHooks: {
    +		option: {
    +			get: function( elem ) {
    +				// attributes.value is undefined in Blackberry 4.7 but
    +				// uses .value. See #6932
    +				var val = elem.attributes.value;
    +				return !val || val.specified ? elem.value : elem.text;
    +			}
    +		},
    +		select: {
    +			get: function( elem ) {
    +				var value, option,
    +					options = elem.options,
    +					index = elem.selectedIndex,
    +					one = elem.type === "select-one" || index < 0,
    +					values = one ? null : [],
    +					max = one ? index + 1 : options.length,
    +					i = index < 0 ?
    +						max :
    +						one ? index : 0;
    +
    +				// Loop through all the selected options
    +				for ( ; i < max; i++ ) {
    +					option = options[ i ];
    +
    +					// oldIE doesn't update selected after form reset (#2551)
    +					if ( ( option.selected || i === index ) &&
    +							// Don't return options that are disabled or in a disabled optgroup
    +							( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
    +							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
    +
    +						// Get the specific value for the option
    +						value = jQuery( option ).val();
    +
    +						// We don't need an array for one selects
    +						if ( one ) {
    +							return value;
    +						}
    +
    +						// Multi-Selects return an array
    +						values.push( value );
    +					}
    +				}
    +
    +				return values;
    +			},
    +
    +			set: function( elem, value ) {
    +				var values = jQuery.makeArray( value );
    +
    +				jQuery(elem).find("option").each(function() {
    +					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
    +				});
    +
    +				if ( !values.length ) {
    +					elem.selectedIndex = -1;
    +				}
    +				return values;
    +			}
    +		}
    +	},
    +
    +	// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
    +	attrFn: {},
    +
    +	attr: function( elem, name, value, pass ) {
    +		var ret, hooks, notxml,
    +			nType = elem.nodeType;
    +
    +		// don't get/set attributes on text, comment and attribute nodes
    +		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
    +			return;
    +		}
    +
    +		if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
    +			return jQuery( elem )[ name ]( value );
    +		}
    +
    +		// Fallback to prop when attributes are not supported
    +		if ( typeof elem.getAttribute === "undefined" ) {
    +			return jQuery.prop( elem, name, value );
    +		}
    +
    +		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
    +
    +		// All attributes are lowercase
    +		// Grab necessary hook if one is defined
    +		if ( notxml ) {
    +			name = name.toLowerCase();
    +			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
    +		}
    +
    +		if ( value !== undefined ) {
    +
    +			if ( value === null ) {
    +				jQuery.removeAttr( elem, name );
    +				return;
    +
    +			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
    +				return ret;
    +
    +			} else {
    +				elem.setAttribute( name, value + "" );
    +				return value;
    +			}
    +
    +		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
    +			return ret;
    +
    +		} else {
    +
    +			ret = elem.getAttribute( name );
    +
    +			// Non-existent attributes return null, we normalize to undefined
    +			return ret === null ?
    +				undefined :
    +				ret;
    +		}
    +	},
    +
    +	removeAttr: function( elem, value ) {
    +		var propName, attrNames, name, isBool,
    +			i = 0;
    +
    +		if ( value && elem.nodeType === 1 ) {
    +
    +			attrNames = value.split( core_rspace );
    +
    +			for ( ; i < attrNames.length; i++ ) {
    +				name = attrNames[ i ];
    +
    +				if ( name ) {
    +					propName = jQuery.propFix[ name ] || name;
    +					isBool = rboolean.test( name );
    +
    +					// See #9699 for explanation of this approach (setting first, then removal)
    +					// Do not do this for boolean attributes (see #10870)
    +					if ( !isBool ) {
    +						jQuery.attr( elem, name, "" );
    +					}
    +					elem.removeAttribute( getSetAttribute ? name : propName );
    +
    +					// Set corresponding property to false for boolean attributes
    +					if ( isBool && propName in elem ) {
    +						elem[ propName ] = false;
    +					}
    +				}
    +			}
    +		}
    +	},
    +
    +	attrHooks: {
    +		type: {
    +			set: function( elem, value ) {
    +				// We can't allow the type property to be changed (since it causes problems in IE)
    +				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
    +					jQuery.error( "type property can't be changed" );
    +				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
    +					// Setting the type on a radio button after the value resets the value in IE6-9
    +					// Reset value to it's default in case type is set after value
    +					// This is for element creation
    +					var val = elem.value;
    +					elem.setAttribute( "type", value );
    +					if ( val ) {
    +						elem.value = val;
    +					}
    +					return value;
    +				}
    +			}
    +		},
    +		// Use the value property for back compat
    +		// Use the nodeHook for button elements in IE6/7 (#1954)
    +		value: {
    +			get: function( elem, name ) {
    +				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
    +					return nodeHook.get( elem, name );
    +				}
    +				return name in elem ?
    +					elem.value :
    +					null;
    +			},
    +			set: function( elem, value, name ) {
    +				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
    +					return nodeHook.set( elem, value, name );
    +				}
    +				// Does not return so that setAttribute is also used
    +				elem.value = value;
    +			}
    +		}
    +	},
    +
    +	propFix: {
    +		tabindex: "tabIndex",
    +		readonly: "readOnly",
    +		"for": "htmlFor",
    +		"class": "className",
    +		maxlength: "maxLength",
    +		cellspacing: "cellSpacing",
    +		cellpadding: "cellPadding",
    +		rowspan: "rowSpan",
    +		colspan: "colSpan",
    +		usemap: "useMap",
    +		frameborder: "frameBorder",
    +		contenteditable: "contentEditable"
    +	},
    +
    +	prop: function( elem, name, value ) {
    +		var ret, hooks, notxml,
    +			nType = elem.nodeType;
    +
    +		// don't get/set properties on text, comment and attribute nodes
    +		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
    +			return;
    +		}
    +
    +		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
    +
    +		if ( notxml ) {
    +			// Fix name and attach hooks
    +			name = jQuery.propFix[ name ] || name;
    +			hooks = jQuery.propHooks[ name ];
    +		}
    +
    +		if ( value !== undefined ) {
    +			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
    +				return ret;
    +
    +			} else {
    +				return ( elem[ name ] = value );
    +			}
    +
    +		} else {
    +			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
    +				return ret;
    +
    +			} else {
    +				return elem[ name ];
    +			}
    +		}
    +	},
    +
    +	propHooks: {
    +		tabIndex: {
    +			get: function( elem ) {
    +				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
    +				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
    +				var attributeNode = elem.getAttributeNode("tabindex");
    +
    +				return attributeNode && attributeNode.specified ?
    +					parseInt( attributeNode.value, 10 ) :
    +					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
    +						0 :
    +						undefined;
    +			}
    +		}
    +	}
    +});
    +
    +// Hook for boolean attributes
    +boolHook = {
    +	get: function( elem, name ) {
    +		// Align boolean attributes with corresponding properties
    +		// Fall back to attribute presence where some booleans are not supported
    +		var attrNode,
    +			property = jQuery.prop( elem, name );
    +		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
    +			name.toLowerCase() :
    +			undefined;
    +	},
    +	set: function( elem, value, name ) {
    +		var propName;
    +		if ( value === false ) {
    +			// Remove boolean attributes when set to false
    +			jQuery.removeAttr( elem, name );
    +		} else {
    +			// value is true since we know at this point it's type boolean and not false
    +			// Set boolean attributes to the same name and set the DOM property
    +			propName = jQuery.propFix[ name ] || name;
    +			if ( propName in elem ) {
    +				// Only set the IDL specifically if it already exists on the element
    +				elem[ propName ] = true;
    +			}
    +
    +			elem.setAttribute( name, name.toLowerCase() );
    +		}
    +		return name;
    +	}
    +};
    +
    +// IE6/7 do not support getting/setting some attributes with get/setAttribute
    +if ( !getSetAttribute ) {
    +
    +	fixSpecified = {
    +		name: true,
    +		id: true,
    +		coords: true
    +	};
    +
    +	// Use this for any attribute in IE6/7
    +	// This fixes almost every IE6/7 issue
    +	nodeHook = jQuery.valHooks.button = {
    +		get: function( elem, name ) {
    +			var ret;
    +			ret = elem.getAttributeNode( name );
    +			return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
    +				ret.value :
    +				undefined;
    +		},
    +		set: function( elem, value, name ) {
    +			// Set the existing or create a new attribute node
    +			var ret = elem.getAttributeNode( name );
    +			if ( !ret ) {
    +				ret = document.createAttribute( name );
    +				elem.setAttributeNode( ret );
    +			}
    +			return ( ret.value = value + "" );
    +		}
    +	};
    +
    +	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
    +	// This is for removals
    +	jQuery.each([ "width", "height" ], function( i, name ) {
    +		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
    +			set: function( elem, value ) {
    +				if ( value === "" ) {
    +					elem.setAttribute( name, "auto" );
    +					return value;
    +				}
    +			}
    +		});
    +	});
    +
    +	// Set contenteditable to false on removals(#10429)
    +	// Setting to empty string throws an error as an invalid value
    +	jQuery.attrHooks.contenteditable = {
    +		get: nodeHook.get,
    +		set: function( elem, value, name ) {
    +			if ( value === "" ) {
    +				value = "false";
    +			}
    +			nodeHook.set( elem, value, name );
    +		}
    +	};
    +}
    +
    +
    +// Some attributes require a special call on IE
    +if ( !jQuery.support.hrefNormalized ) {
    +	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
    +		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
    +			get: function( elem ) {
    +				var ret = elem.getAttribute( name, 2 );
    +				return ret === null ? undefined : ret;
    +			}
    +		});
    +	});
    +}
    +
    +if ( !jQuery.support.style ) {
    +	jQuery.attrHooks.style = {
    +		get: function( elem ) {
    +			// Return undefined in the case of empty string
    +			// Normalize to lowercase since IE uppercases css property names
    +			return elem.style.cssText.toLowerCase() || undefined;
    +		},
    +		set: function( elem, value ) {
    +			return ( elem.style.cssText = value + "" );
    +		}
    +	};
    +}
    +
    +// Safari mis-reports the default selected property of an option
    +// Accessing the parent's selectedIndex property fixes it
    +if ( !jQuery.support.optSelected ) {
    +	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
    +		get: function( elem ) {
    +			var parent = elem.parentNode;
    +
    +			if ( parent ) {
    +				parent.selectedIndex;
    +
    +				// Make sure that it also works with optgroups, see #5701
    +				if ( parent.parentNode ) {
    +					parent.parentNode.selectedIndex;
    +				}
    +			}
    +			return null;
    +		}
    +	});
    +}
    +
    +// IE6/7 call enctype encoding
    +if ( !jQuery.support.enctype ) {
    +	jQuery.propFix.enctype = "encoding";
    +}
    +
    +// Radios and checkboxes getter/setter
    +if ( !jQuery.support.checkOn ) {
    +	jQuery.each([ "radio", "checkbox" ], function() {
    +		jQuery.valHooks[ this ] = {
    +			get: function( elem ) {
    +				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
    +				return elem.getAttribute("value") === null ? "on" : elem.value;
    +			}
    +		};
    +	});
    +}
    +jQuery.each([ "radio", "checkbox" ], function() {
    +	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
    +		set: function( elem, value ) {
    +			if ( jQuery.isArray( value ) ) {
    +				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
    +			}
    +		}
    +	});
    +});
    +var rformElems = /^(?:textarea|input|select)$/i,
    +	rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
    +	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
    +	rkeyEvent = /^key/,
    +	rmouseEvent = /^(?:mouse|contextmenu)|click/,
    +	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
    +	hoverHack = function( events ) {
    +		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
    +	};
    +
    +/*
    + * Helper functions for managing events -- not part of the public interface.
    + * Props to Dean Edwards' addEvent library for many of the ideas.
    + */
    +jQuery.event = {
    +
    +	add: function( elem, types, handler, data, selector ) {
    +
    +		var elemData, eventHandle, events,
    +			t, tns, type, namespaces, handleObj,
    +			handleObjIn, handlers, special;
    +
    +		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
    +		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
    +			return;
    +		}
    +
    +		// Caller can pass in an object of custom data in lieu of the handler
    +		if ( handler.handler ) {
    +			handleObjIn = handler;
    +			handler = handleObjIn.handler;
    +			selector = handleObjIn.selector;
    +		}
    +
    +		// Make sure that the handler has a unique ID, used to find/remove it later
    +		if ( !handler.guid ) {
    +			handler.guid = jQuery.guid++;
    +		}
    +
    +		// Init the element's event structure and main handler, if this is the first
    +		events = elemData.events;
    +		if ( !events ) {
    +			elemData.events = events = {};
    +		}
    +		eventHandle = elemData.handle;
    +		if ( !eventHandle ) {
    +			elemData.handle = eventHandle = function( e ) {
    +				// Discard the second event of a jQuery.event.trigger() and
    +				// when an event is called after a page has unloaded
    +				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
    +					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
    +					undefined;
    +			};
    +			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
    +			eventHandle.elem = elem;
    +		}
    +
    +		// Handle multiple events separated by a space
    +		// jQuery(...).bind("mouseover mouseout", fn);
    +		types = jQuery.trim( hoverHack(types) ).split( " " );
    +		for ( t = 0; t < types.length; t++ ) {
    +
    +			tns = rtypenamespace.exec( types[t] ) || [];
    +			type = tns[1];
    +			namespaces = ( tns[2] || "" ).split( "." ).sort();
    +
    +			// If event changes its type, use the special event handlers for the changed type
    +			special = jQuery.event.special[ type ] || {};
    +
    +			// If selector defined, determine special event api type, otherwise given type
    +			type = ( selector ? special.delegateType : special.bindType ) || type;
    +
    +			// Update special based on newly reset type
    +			special = jQuery.event.special[ type ] || {};
    +
    +			// handleObj is passed to all event handlers
    +			handleObj = jQuery.extend({
    +				type: type,
    +				origType: tns[1],
    +				data: data,
    +				handler: handler,
    +				guid: handler.guid,
    +				selector: selector,
    +				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
    +				namespace: namespaces.join(".")
    +			}, handleObjIn );
    +
    +			// Init the event handler queue if we're the first
    +			handlers = events[ type ];
    +			if ( !handlers ) {
    +				handlers = events[ type ] = [];
    +				handlers.delegateCount = 0;
    +
    +				// Only use addEventListener/attachEvent if the special events handler returns false
    +				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
    +					// Bind the global event handler to the element
    +					if ( elem.addEventListener ) {
    +						elem.addEventListener( type, eventHandle, false );
    +
    +					} else if ( elem.attachEvent ) {
    +						elem.attachEvent( "on" + type, eventHandle );
    +					}
    +				}
    +			}
    +
    +			if ( special.add ) {
    +				special.add.call( elem, handleObj );
    +
    +				if ( !handleObj.handler.guid ) {
    +					handleObj.handler.guid = handler.guid;
    +				}
    +			}
    +
    +			// Add to the element's handler list, delegates in front
    +			if ( selector ) {
    +				handlers.splice( handlers.delegateCount++, 0, handleObj );
    +			} else {
    +				handlers.push( handleObj );
    +			}
    +
    +			// Keep track of which events have ever been used, for event optimization
    +			jQuery.event.global[ type ] = true;
    +		}
    +
    +		// Nullify elem to prevent memory leaks in IE
    +		elem = null;
    +	},
    +
    +	global: {},
    +
    +	// Detach an event or set of events from an element
    +	remove: function( elem, types, handler, selector, mappedTypes ) {
    +
    +		var t, tns, type, origType, namespaces, origCount,
    +			j, events, special, eventType, handleObj,
    +			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
    +
    +		if ( !elemData || !(events = elemData.events) ) {
    +			return;
    +		}
    +
    +		// Once for each type.namespace in types; type may be omitted
    +		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
    +		for ( t = 0; t < types.length; t++ ) {
    +			tns = rtypenamespace.exec( types[t] ) || [];
    +			type = origType = tns[1];
    +			namespaces = tns[2];
    +
    +			// Unbind all events (on this namespace, if provided) for the element
    +			if ( !type ) {
    +				for ( type in events ) {
    +					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
    +				}
    +				continue;
    +			}
    +
    +			special = jQuery.event.special[ type ] || {};
    +			type = ( selector? special.delegateType : special.bindType ) || type;
    +			eventType = events[ type ] || [];
    +			origCount = eventType.length;
    +			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
    +
    +			// Remove matching events
    +			for ( j = 0; j < eventType.length; j++ ) {
    +				handleObj = eventType[ j ];
    +
    +				if ( ( mappedTypes || origType === handleObj.origType ) &&
    +					 ( !handler || handler.guid === handleObj.guid ) &&
    +					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
    +					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
    +					eventType.splice( j--, 1 );
    +
    +					if ( handleObj.selector ) {
    +						eventType.delegateCount--;
    +					}
    +					if ( special.remove ) {
    +						special.remove.call( elem, handleObj );
    +					}
    +				}
    +			}
    +
    +			// Remove generic event handler if we removed something and no more handlers exist
    +			// (avoids potential for endless recursion during removal of special event handlers)
    +			if ( eventType.length === 0 && origCount !== eventType.length ) {
    +				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
    +					jQuery.removeEvent( elem, type, elemData.handle );
    +				}
    +
    +				delete events[ type ];
    +			}
    +		}
    +
    +		// Remove the expando if it's no longer used
    +		if ( jQuery.isEmptyObject( events ) ) {
    +			delete elemData.handle;
    +
    +			// removeData also checks for emptiness and clears the expando if empty
    +			// so use it instead of delete
    +			jQuery.removeData( elem, "events", true );
    +		}
    +	},
    +
    +	// Events that are safe to short-circuit if no handlers are attached.
    +	// Native DOM events should not be added, they may have inline handlers.
    +	customEvent: {
    +		"getData": true,
    +		"setData": true,
    +		"changeData": true
    +	},
    +
    +	trigger: function( event, data, elem, onlyHandlers ) {
    +		// Don't do events on text and comment nodes
    +		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
    +			return;
    +		}
    +
    +		// Event object or event type
    +		var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
    +			type = event.type || event,
    +			namespaces = [];
    +
    +		// focus/blur morphs to focusin/out; ensure we're not firing them right now
    +		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
    +			return;
    +		}
    +
    +		if ( type.indexOf( "!" ) >= 0 ) {
    +			// Exclusive events trigger only for the exact event (no namespaces)
    +			type = type.slice(0, -1);
    +			exclusive = true;
    +		}
    +
    +		if ( type.indexOf( "." ) >= 0 ) {
    +			// Namespaced trigger; create a regexp to match event type in handle()
    +			namespaces = type.split(".");
    +			type = namespaces.shift();
    +			namespaces.sort();
    +		}
    +
    +		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
    +			// No jQuery handlers for this event type, and it can't have inline handlers
    +			return;
    +		}
    +
    +		// Caller can pass in an Event, Object, or just an event type string
    +		event = typeof event === "object" ?
    +			// jQuery.Event object
    +			event[ jQuery.expando ] ? event :
    +			// Object literal
    +			new jQuery.Event( type, event ) :
    +			// Just the event type (string)
    +			new jQuery.Event( type );
    +
    +		event.type = type;
    +		event.isTrigger = true;
    +		event.exclusive = exclusive;
    +		event.namespace = namespaces.join( "." );
    +		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
    +		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
    +
    +		// Handle a global trigger
    +		if ( !elem ) {
    +
    +			// TODO: Stop taunting the data cache; remove global events and always attach to document
    +			cache = jQuery.cache;
    +			for ( i in cache ) {
    +				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
    +					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
    +				}
    +			}
    +			return;
    +		}
    +
    +		// Clean up the event in case it is being reused
    +		event.result = undefined;
    +		if ( !event.target ) {
    +			event.target = elem;
    +		}
    +
    +		// Clone any incoming data and prepend the event, creating the handler arg list
    +		data = data != null ? jQuery.makeArray( data ) : [];
    +		data.unshift( event );
    +
    +		// Allow special events to draw outside the lines
    +		special = jQuery.event.special[ type ] || {};
    +		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
    +			return;
    +		}
    +
    +		// Determine event propagation path in advance, per W3C events spec (#9951)
    +		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
    +		eventPath = [[ elem, special.bindType || type ]];
    +		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
    +
    +			bubbleType = special.delegateType || type;
    +			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
    +			for ( old = elem; cur; cur = cur.parentNode ) {
    +				eventPath.push([ cur, bubbleType ]);
    +				old = cur;
    +			}
    +
    +			// Only add window if we got to document (e.g., not plain obj or detached DOM)
    +			if ( old === (elem.ownerDocument || document) ) {
    +				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
    +			}
    +		}
    +
    +		// Fire handlers on the event path
    +		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
    +
    +			cur = eventPath[i][0];
    +			event.type = eventPath[i][1];
    +
    +			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
    +			if ( handle ) {
    +				handle.apply( cur, data );
    +			}
    +			// Note that this is a bare JS function and not a jQuery handler
    +			handle = ontype && cur[ ontype ];
    +			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
    +				event.preventDefault();
    +			}
    +		}
    +		event.type = type;
    +
    +		// If nobody prevented the default action, do it now
    +		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
    +
    +			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
    +				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
    +
    +				// Call a native DOM method on the target with the same name name as the event.
    +				// Can't use an .isFunction() check here because IE6/7 fails that test.
    +				// Don't do default actions on window, that's where global variables be (#6170)
    +				// IE<9 dies on focus/blur to hidden element (#1486)
    +				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
    +
    +					// Don't re-trigger an onFOO event when we call its FOO() method
    +					old = elem[ ontype ];
    +
    +					if ( old ) {
    +						elem[ ontype ] = null;
    +					}
    +
    +					// Prevent re-triggering of the same event, since we already bubbled it above
    +					jQuery.event.triggered = type;
    +					elem[ type ]();
    +					jQuery.event.triggered = undefined;
    +
    +					if ( old ) {
    +						elem[ ontype ] = old;
    +					}
    +				}
    +			}
    +		}
    +
    +		return event.result;
    +	},
    +
    +	dispatch: function( event ) {
    +
    +		// Make a writable jQuery.Event from the native event object
    +		event = jQuery.event.fix( event || window.event );
    +
    +		var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
    +			handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
    +			delegateCount = handlers.delegateCount,
    +			args = core_slice.call( arguments ),
    +			run_all = !event.exclusive && !event.namespace,
    +			special = jQuery.event.special[ event.type ] || {},
    +			handlerQueue = [];
    +
    +		// Use the fix-ed jQuery.Event rather than the (read-only) native event
    +		args[0] = event;
    +		event.delegateTarget = this;
    +
    +		// Call the preDispatch hook for the mapped type, and let it bail if desired
    +		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
    +			return;
    +		}
    +
    +		// Determine handlers that should run if there are delegated events
    +		// Avoid non-left-click bubbling in Firefox (#3861)
    +		if ( delegateCount && !(event.button && event.type === "click") ) {
    +
    +			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
    +
    +				// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
    +				if ( cur.disabled !== true || event.type !== "click" ) {
    +					selMatch = {};
    +					matches = [];
    +					for ( i = 0; i < delegateCount; i++ ) {
    +						handleObj = handlers[ i ];
    +						sel = handleObj.selector;
    +
    +						if ( selMatch[ sel ] === undefined ) {
    +							selMatch[ sel ] = handleObj.needsContext ?
    +								jQuery( sel, this ).index( cur ) >= 0 :
    +								jQuery.find( sel, this, null, [ cur ] ).length;
    +						}
    +						if ( selMatch[ sel ] ) {
    +							matches.push( handleObj );
    +						}
    +					}
    +					if ( matches.length ) {
    +						handlerQueue.push({ elem: cur, matches: matches });
    +					}
    +				}
    +			}
    +		}
    +
    +		// Add the remaining (directly-bound) handlers
    +		if ( handlers.length > delegateCount ) {
    +			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
    +		}
    +
    +		// Run delegates first; they may want to stop propagation beneath us
    +		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
    +			matched = handlerQueue[ i ];
    +			event.currentTarget = matched.elem;
    +
    +			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
    +				handleObj = matched.matches[ j ];
    +
    +				// Triggered event must either 1) be non-exclusive and have no namespace, or
    +				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
    +				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
    +
    +					event.data = handleObj.data;
    +					event.handleObj = handleObj;
    +
    +					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
    +							.apply( matched.elem, args );
    +
    +					if ( ret !== undefined ) {
    +						event.result = ret;
    +						if ( ret === false ) {
    +							event.preventDefault();
    +							event.stopPropagation();
    +						}
    +					}
    +				}
    +			}
    +		}
    +
    +		// Call the postDispatch hook for the mapped type
    +		if ( special.postDispatch ) {
    +			special.postDispatch.call( this, event );
    +		}
    +
    +		return event.result;
    +	},
    +
    +	// Includes some event props shared by KeyEvent and MouseEvent
    +	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
    +	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
    +
    +	fixHooks: {},
    +
    +	keyHooks: {
    +		props: "char charCode key keyCode".split(" "),
    +		filter: function( event, original ) {
    +
    +			// Add which for key events
    +			if ( event.which == null ) {
    +				event.which = original.charCode != null ? original.charCode : original.keyCode;
    +			}
    +
    +			return event;
    +		}
    +	},
    +
    +	mouseHooks: {
    +		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
    +		filter: function( event, original ) {
    +			var eventDoc, doc, body,
    +				button = original.button,
    +				fromElement = original.fromElement;
    +
    +			// Calculate pageX/Y if missing and clientX/Y available
    +			if ( event.pageX == null && original.clientX != null ) {
    +				eventDoc = event.target.ownerDocument || document;
    +				doc = eventDoc.documentElement;
    +				body = eventDoc.body;
    +
    +				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
    +				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
    +			}
    +
    +			// Add relatedTarget, if necessary
    +			if ( !event.relatedTarget && fromElement ) {
    +				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
    +			}
    +
    +			// Add which for click: 1 === left; 2 === middle; 3 === right
    +			// Note: button is not normalized, so don't use it
    +			if ( !event.which && button !== undefined ) {
    +				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
    +			}
    +
    +			return event;
    +		}
    +	},
    +
    +	fix: function( event ) {
    +		if ( event[ jQuery.expando ] ) {
    +			return event;
    +		}
    +
    +		// Create a writable copy of the event object and normalize some properties
    +		var i, prop,
    +			originalEvent = event,
    +			fixHook = jQuery.event.fixHooks[ event.type ] || {},
    +			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
    +
    +		event = jQuery.Event( originalEvent );
    +
    +		for ( i = copy.length; i; ) {
    +			prop = copy[ --i ];
    +			event[ prop ] = originalEvent[ prop ];
    +		}
    +
    +		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
    +		if ( !event.target ) {
    +			event.target = originalEvent.srcElement || document;
    +		}
    +
    +		// Target should not be a text node (#504, Safari)
    +		if ( event.target.nodeType === 3 ) {
    +			event.target = event.target.parentNode;
    +		}
    +
    +		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
    +		event.metaKey = !!event.metaKey;
    +
    +		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
    +	},
    +
    +	special: {
    +		load: {
    +			// Prevent triggered image.load events from bubbling to window.load
    +			noBubble: true
    +		},
    +
    +		focus: {
    +			delegateType: "focusin"
    +		},
    +		blur: {
    +			delegateType: "focusout"
    +		},
    +
    +		beforeunload: {
    +			setup: function( data, namespaces, eventHandle ) {
    +				// We only want to do this special case on windows
    +				if ( jQuery.isWindow( this ) ) {
    +					this.onbeforeunload = eventHandle;
    +				}
    +			},
    +
    +			teardown: function( namespaces, eventHandle ) {
    +				if ( this.onbeforeunload === eventHandle ) {
    +					this.onbeforeunload = null;
    +				}
    +			}
    +		}
    +	},
    +
    +	simulate: function( type, elem, event, bubble ) {
    +		// Piggyback on a donor event to simulate a different one.
    +		// Fake originalEvent to avoid donor's stopPropagation, but if the
    +		// simulated event prevents default then we do the same on the donor.
    +		var e = jQuery.extend(
    +			new jQuery.Event(),
    +			event,
    +			{ type: type,
    +				isSimulated: true,
    +				originalEvent: {}
    +			}
    +		);
    +		if ( bubble ) {
    +			jQuery.event.trigger( e, null, elem );
    +		} else {
    +			jQuery.event.dispatch.call( elem, e );
    +		}
    +		if ( e.isDefaultPrevented() ) {
    +			event.preventDefault();
    +		}
    +	}
    +};
    +
    +// Some plugins are using, but it's undocumented/deprecated and will be removed.
    +// The 1.7 special event interface should provide all the hooks needed now.
    +jQuery.event.handle = jQuery.event.dispatch;
    +
    +jQuery.removeEvent = document.removeEventListener ?
    +	function( elem, type, handle ) {
    +		if ( elem.removeEventListener ) {
    +			elem.removeEventListener( type, handle, false );
    +		}
    +	} :
    +	function( elem, type, handle ) {
    +		var name = "on" + type;
    +
    +		if ( elem.detachEvent ) {
    +
    +			// #8545, #7054, preventing memory leaks for custom events in IE6-8
    +			// detachEvent needed property on element, by name of that event, to properly expose it to GC
    +			if ( typeof elem[ name ] === "undefined" ) {
    +				elem[ name ] = null;
    +			}
    +
    +			elem.detachEvent( name, handle );
    +		}
    +	};
    +
    +jQuery.Event = function( src, props ) {
    +	// Allow instantiation without the 'new' keyword
    +	if ( !(this instanceof jQuery.Event) ) {
    +		return new jQuery.Event( src, props );
    +	}
    +
    +	// Event object
    +	if ( src && src.type ) {
    +		this.originalEvent = src;
    +		this.type = src.type;
    +
    +		// Events bubbling up the document may have been marked as prevented
    +		// by a handler lower down the tree; reflect the correct value.
    +		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
    +			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
    +
    +	// Event type
    +	} else {
    +		this.type = src;
    +	}
    +
    +	// Put explicitly provided properties onto the event object
    +	if ( props ) {
    +		jQuery.extend( this, props );
    +	}
    +
    +	// Create a timestamp if incoming event doesn't have one
    +	this.timeStamp = src && src.timeStamp || jQuery.now();
    +
    +	// Mark it as fixed
    +	this[ jQuery.expando ] = true;
    +};
    +
    +function returnFalse() {
    +	return false;
    +}
    +function returnTrue() {
    +	return true;
    +}
    +
    +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
    +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
    +jQuery.Event.prototype = {
    +	preventDefault: function() {
    +		this.isDefaultPrevented = returnTrue;
    +
    +		var e = this.originalEvent;
    +		if ( !e ) {
    +			return;
    +		}
    +
    +		// if preventDefault exists run it on the original event
    +		if ( e.preventDefault ) {
    +			e.preventDefault();
    +
    +		// otherwise set the returnValue property of the original event to false (IE)
    +		} else {
    +			e.returnValue = false;
    +		}
    +	},
    +	stopPropagation: function() {
    +		this.isPropagationStopped = returnTrue;
    +
    +		var e = this.originalEvent;
    +		if ( !e ) {
    +			return;
    +		}
    +		// if stopPropagation exists run it on the original event
    +		if ( e.stopPropagation ) {
    +			e.stopPropagation();
    +		}
    +		// otherwise set the cancelBubble property of the original event to true (IE)
    +		e.cancelBubble = true;
    +	},
    +	stopImmediatePropagation: function() {
    +		this.isImmediatePropagationStopped = returnTrue;
    +		this.stopPropagation();
    +	},
    +	isDefaultPrevented: returnFalse,
    +	isPropagationStopped: returnFalse,
    +	isImmediatePropagationStopped: returnFalse
    +};
    +
    +// Create mouseenter/leave events using mouseover/out and event-time checks
    +jQuery.each({
    +	mouseenter: "mouseover",
    +	mouseleave: "mouseout"
    +}, function( orig, fix ) {
    +	jQuery.event.special[ orig ] = {
    +		delegateType: fix,
    +		bindType: fix,
    +
    +		handle: function( event ) {
    +			var ret,
    +				target = this,
    +				related = event.relatedTarget,
    +				handleObj = event.handleObj,
    +				selector = handleObj.selector;
    +
    +			// For mousenter/leave call the handler if related is outside the target.
    +			// NB: No relatedTarget if the mouse left/entered the browser window
    +			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
    +				event.type = handleObj.origType;
    +				ret = handleObj.handler.apply( this, arguments );
    +				event.type = fix;
    +			}
    +			return ret;
    +		}
    +	};
    +});
    +
    +// IE submit delegation
    +if ( !jQuery.support.submitBubbles ) {
    +
    +	jQuery.event.special.submit = {
    +		setup: function() {
    +			// Only need this for delegated form submit events
    +			if ( jQuery.nodeName( this, "form" ) ) {
    +				return false;
    +			}
    +
    +			// Lazy-add a submit handler when a descendant form may potentially be submitted
    +			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
    +				// Node name check avoids a VML-related crash in IE (#9807)
    +				var elem = e.target,
    +					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
    +				if ( form && !jQuery._data( form, "_submit_attached" ) ) {
    +					jQuery.event.add( form, "submit._submit", function( event ) {
    +						event._submit_bubble = true;
    +					});
    +					jQuery._data( form, "_submit_attached", true );
    +				}
    +			});
    +			// return undefined since we don't need an event listener
    +		},
    +
    +		postDispatch: function( event ) {
    +			// If form was submitted by the user, bubble the event up the tree
    +			if ( event._submit_bubble ) {
    +				delete event._submit_bubble;
    +				if ( this.parentNode && !event.isTrigger ) {
    +					jQuery.event.simulate( "submit", this.parentNode, event, true );
    +				}
    +			}
    +		},
    +
    +		teardown: function() {
    +			// Only need this for delegated form submit events
    +			if ( jQuery.nodeName( this, "form" ) ) {
    +				return false;
    +			}
    +
    +			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
    +			jQuery.event.remove( this, "._submit" );
    +		}
    +	};
    +}
    +
    +// IE change delegation and checkbox/radio fix
    +if ( !jQuery.support.changeBubbles ) {
    +
    +	jQuery.event.special.change = {
    +
    +		setup: function() {
    +
    +			if ( rformElems.test( this.nodeName ) ) {
    +				// IE doesn't fire change on a check/radio until blur; trigger it on click
    +				// after a propertychange. Eat the blur-change in special.change.handle.
    +				// This still fires onchange a second time for check/radio after blur.
    +				if ( this.type === "checkbox" || this.type === "radio" ) {
    +					jQuery.event.add( this, "propertychange._change", function( event ) {
    +						if ( event.originalEvent.propertyName === "checked" ) {
    +							this._just_changed = true;
    +						}
    +					});
    +					jQuery.event.add( this, "click._change", function( event ) {
    +						if ( this._just_changed && !event.isTrigger ) {
    +							this._just_changed = false;
    +						}
    +						// Allow triggered, simulated change events (#11500)
    +						jQuery.event.simulate( "change", this, event, true );
    +					});
    +				}
    +				return false;
    +			}
    +			// Delegated event; lazy-add a change handler on descendant inputs
    +			jQuery.event.add( this, "beforeactivate._change", function( e ) {
    +				var elem = e.target;
    +
    +				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
    +					jQuery.event.add( elem, "change._change", function( event ) {
    +						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
    +							jQuery.event.simulate( "change", this.parentNode, event, true );
    +						}
    +					});
    +					jQuery._data( elem, "_change_attached", true );
    +				}
    +			});
    +		},
    +
    +		handle: function( event ) {
    +			var elem = event.target;
    +
    +			// Swallow native change events from checkbox/radio, we already triggered them above
    +			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
    +				return event.handleObj.handler.apply( this, arguments );
    +			}
    +		},
    +
    +		teardown: function() {
    +			jQuery.event.remove( this, "._change" );
    +
    +			return !rformElems.test( this.nodeName );
    +		}
    +	};
    +}
    +
    +// Create "bubbling" focus and blur events
    +if ( !jQuery.support.focusinBubbles ) {
    +	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
    +
    +		// Attach a single capturing handler while someone wants focusin/focusout
    +		var attaches = 0,
    +			handler = function( event ) {
    +				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
    +			};
    +
    +		jQuery.event.special[ fix ] = {
    +			setup: function() {
    +				if ( attaches++ === 0 ) {
    +					document.addEventListener( orig, handler, true );
    +				}
    +			},
    +			teardown: function() {
    +				if ( --attaches === 0 ) {
    +					document.removeEventListener( orig, handler, true );
    +				}
    +			}
    +		};
    +	});
    +}
    +
    +jQuery.fn.extend({
    +
    +	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
    +		var origFn, type;
    +
    +		// Types can be a map of types/handlers
    +		if ( typeof types === "object" ) {
    +			// ( types-Object, selector, data )
    +			if ( typeof selector !== "string" ) { // && selector != null
    +				// ( types-Object, data )
    +				data = data || selector;
    +				selector = undefined;
    +			}
    +			for ( type in types ) {
    +				this.on( type, selector, data, types[ type ], one );
    +			}
    +			return this;
    +		}
    +
    +		if ( data == null && fn == null ) {
    +			// ( types, fn )
    +			fn = selector;
    +			data = selector = undefined;
    +		} else if ( fn == null ) {
    +			if ( typeof selector === "string" ) {
    +				// ( types, selector, fn )
    +				fn = data;
    +				data = undefined;
    +			} else {
    +				// ( types, data, fn )
    +				fn = data;
    +				data = selector;
    +				selector = undefined;
    +			}
    +		}
    +		if ( fn === false ) {
    +			fn = returnFalse;
    +		} else if ( !fn ) {
    +			return this;
    +		}
    +
    +		if ( one === 1 ) {
    +			origFn = fn;
    +			fn = function( event ) {
    +				// Can use an empty set, since event contains the info
    +				jQuery().off( event );
    +				return origFn.apply( this, arguments );
    +			};
    +			// Use same guid so caller can remove using origFn
    +			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
    +		}
    +		return this.each( function() {
    +			jQuery.event.add( this, types, fn, data, selector );
    +		});
    +	},
    +	one: function( types, selector, data, fn ) {
    +		return this.on( types, selector, data, fn, 1 );
    +	},
    +	off: function( types, selector, fn ) {
    +		var handleObj, type;
    +		if ( types && types.preventDefault && types.handleObj ) {
    +			// ( event )  dispatched jQuery.Event
    +			handleObj = types.handleObj;
    +			jQuery( types.delegateTarget ).off(
    +				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
    +				handleObj.selector,
    +				handleObj.handler
    +			);
    +			return this;
    +		}
    +		if ( typeof types === "object" ) {
    +			// ( types-object [, selector] )
    +			for ( type in types ) {
    +				this.off( type, selector, types[ type ] );
    +			}
    +			return this;
    +		}
    +		if ( selector === false || typeof selector === "function" ) {
    +			// ( types [, fn] )
    +			fn = selector;
    +			selector = undefined;
    +		}
    +		if ( fn === false ) {
    +			fn = returnFalse;
    +		}
    +		return this.each(function() {
    +			jQuery.event.remove( this, types, fn, selector );
    +		});
    +	},
    +
    +	bind: function( types, data, fn ) {
    +		return this.on( types, null, data, fn );
    +	},
    +	unbind: function( types, fn ) {
    +		return this.off( types, null, fn );
    +	},
    +
    +	live: function( types, data, fn ) {
    +		jQuery( this.context ).on( types, this.selector, data, fn );
    +		return this;
    +	},
    +	die: function( types, fn ) {
    +		jQuery( this.context ).off( types, this.selector || "**", fn );
    +		return this;
    +	},
    +
    +	delegate: function( selector, types, data, fn ) {
    +		return this.on( types, selector, data, fn );
    +	},
    +	undelegate: function( selector, types, fn ) {
    +		// ( namespace ) or ( selector, types [, fn] )
    +		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
    +	},
    +
    +	trigger: function( type, data ) {
    +		return this.each(function() {
    +			jQuery.event.trigger( type, data, this );
    +		});
    +	},
    +	triggerHandler: function( type, data ) {
    +		if ( this[0] ) {
    +			return jQuery.event.trigger( type, data, this[0], true );
    +		}
    +	},
    +
    +	toggle: function( fn ) {
    +		// Save reference to arguments for access in closure
    +		var args = arguments,
    +			guid = fn.guid || jQuery.guid++,
    +			i = 0,
    +			toggler = function( event ) {
    +				// Figure out which function to execute
    +				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
    +				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
    +
    +				// Make sure that clicks stop
    +				event.preventDefault();
    +
    +				// and execute the function
    +				return args[ lastToggle ].apply( this, arguments ) || false;
    +			};
    +
    +		// link all the functions, so any of them can unbind this click handler
    +		toggler.guid = guid;
    +		while ( i < args.length ) {
    +			args[ i++ ].guid = guid;
    +		}
    +
    +		return this.click( toggler );
    +	},
    +
    +	hover: function( fnOver, fnOut ) {
    +		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
    +	}
    +});
    +
    +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
    +	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
    +	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
    +
    +	// Handle event binding
    +	jQuery.fn[ name ] = function( data, fn ) {
    +		if ( fn == null ) {
    +			fn = data;
    +			data = null;
    +		}
    +
    +		return arguments.length > 0 ?
    +			this.on( name, null, data, fn ) :
    +			this.trigger( name );
    +	};
    +
    +	if ( rkeyEvent.test( name ) ) {
    +		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
    +	}
    +
    +	if ( rmouseEvent.test( name ) ) {
    +		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
    +	}
    +});
    +/*!
    + * Sizzle CSS Selector Engine
    + * Copyright 2012 jQuery Foundation and other contributors
    + * Released under the MIT license
    + * http://sizzlejs.com/
    + */
    +(function( window, undefined ) {
    +
    +var cachedruns,
    +	assertGetIdNotName,
    +	Expr,
    +	getText,
    +	isXML,
    +	contains,
    +	compile,
    +	sortOrder,
    +	hasDuplicate,
    +	outermostContext,
    +
    +	baseHasDuplicate = true,
    +	strundefined = "undefined",
    +
    +	expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
    +
    +	Token = String,
    +	document = window.document,
    +	docElem = document.documentElement,
    +	dirruns = 0,
    +	done = 0,
    +	pop = [].pop,
    +	push = [].push,
    +	slice = [].slice,
    +	// Use a stripped-down indexOf if a native one is unavailable
    +	indexOf = [].indexOf || function( elem ) {
    +		var i = 0,
    +			len = this.length;
    +		for ( ; i < len; i++ ) {
    +			if ( this[i] === elem ) {
    +				return i;
    +			}
    +		}
    +		return -1;
    +	},
    +
    +	// Augment a function for special use by Sizzle
    +	markFunction = function( fn, value ) {
    +		fn[ expando ] = value == null || value;
    +		return fn;
    +	},
    +
    +	createCache = function() {
    +		var cache = {},
    +			keys = [];
    +
    +		return markFunction(function( key, value ) {
    +			// Only keep the most recent entries
    +			if ( keys.push( key ) > Expr.cacheLength ) {
    +				delete cache[ keys.shift() ];
    +			}
    +
    +			// Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)
    +			return (cache[ key + " " ] = value);
    +		}, cache );
    +	},
    +
    +	classCache = createCache(),
    +	tokenCache = createCache(),
    +	compilerCache = createCache(),
    +
    +	// Regex
    +
    +	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
    +	whitespace = "[\\x20\\t\\r\\n\\f]",
    +	// http://www.w3.org/TR/css3-syntax/#characters
    +	characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
    +
    +	// Loosely modeled on CSS identifier characters
    +	// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
    +	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
    +	identifier = characterEncoding.replace( "w", "w#" ),
    +
    +	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
    +	operators = "([*^$|!~]?=)",
    +	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
    +		"*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
    +
    +	// Prefer arguments not in parens/brackets,
    +	//   then attribute selectors and non-pseudos (denoted by :),
    +	//   then anything else
    +	// These preferences are here to reduce the number of selectors
    +	//   needing tokenize in the PSEUDO preFilter
    +	pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
    +
    +	// For matchExpr.POS and matchExpr.needsContext
    +	pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
    +		"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
    +
    +	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
    +	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
    +
    +	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
    +	rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
    +	rpseudo = new RegExp( pseudos ),
    +
    +	// Easily-parseable/retrievable ID or TAG or CLASS selectors
    +	rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
    +
    +	rnot = /^:not/,
    +	rsibling = /[\x20\t\r\n\f]*[+~]/,
    +	rendsWithNot = /:not\($/,
    +
    +	rheader = /h\d/i,
    +	rinputs = /input|select|textarea|button/i,
    +
    +	rbackslash = /\\(?!\\)/g,
    +
    +	matchExpr = {
    +		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
    +		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
    +		"NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
    +		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
    +		"ATTR": new RegExp( "^" + attributes ),
    +		"PSEUDO": new RegExp( "^" + pseudos ),
    +		"POS": new RegExp( pos, "i" ),
    +		"CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +
    +			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
    +			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
    +		// For use in libraries implementing .is()
    +		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
    +	},
    +
    +	// Support
    +
    +	// Used for testing something on an element
    +	assert = function( fn ) {
    +		var div = document.createElement("div");
    +
    +		try {
    +			return fn( div );
    +		} catch (e) {
    +			return false;
    +		} finally {
    +			// release memory in IE
    +			div = null;
    +		}
    +	},
    +
    +	// Check if getElementsByTagName("*") returns only elements
    +	assertTagNameNoComments = assert(function( div ) {
    +		div.appendChild( document.createComment("") );
    +		return !div.getElementsByTagName("*").length;
    +	}),
    +
    +	// Check if getAttribute returns normalized href attributes
    +	assertHrefNotNormalized = assert(function( div ) {
    +		div.innerHTML = "<a href='#'></a>";
    +		return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
    +			div.firstChild.getAttribute("href") === "#";
    +	}),
    +
    +	// Check if attributes should be retrieved by attribute nodes
    +	assertAttributes = assert(function( div ) {
    +		div.innerHTML = "<select></select>";
    +		var type = typeof div.lastChild.getAttribute("multiple");
    +		// IE8 returns a string for some attributes even when not present
    +		return type !== "boolean" && type !== "string";
    +	}),
    +
    +	// Check if getElementsByClassName can be trusted
    +	assertUsableClassName = assert(function( div ) {
    +		// Opera can't find a second classname (in 9.6)
    +		div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
    +		if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
    +			return false;
    +		}
    +
    +		// Safari 3.2 caches class attributes and doesn't catch changes
    +		div.lastChild.className = "e";
    +		return div.getElementsByClassName("e").length === 2;
    +	}),
    +
    +	// Check if getElementById returns elements by name
    +	// Check if getElementsByName privileges form controls or returns elements by ID
    +	assertUsableName = assert(function( div ) {
    +		// Inject content
    +		div.id = expando + 0;
    +		div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
    +		docElem.insertBefore( div, docElem.firstChild );
    +
    +		// Test
    +		var pass = document.getElementsByName &&
    +			// buggy browsers will return fewer than the correct 2
    +			document.getElementsByName( expando ).length === 2 +
    +			// buggy browsers will return more than the correct 0
    +			document.getElementsByName( expando + 0 ).length;
    +		assertGetIdNotName = !document.getElementById( expando );
    +
    +		// Cleanup
    +		docElem.removeChild( div );
    +
    +		return pass;
    +	});
    +
    +// If slice is not available, provide a backup
    +try {
    +	slice.call( docElem.childNodes, 0 )[0].nodeType;
    +} catch ( e ) {
    +	slice = function( i ) {
    +		var elem,
    +			results = [];
    +		for ( ; (elem = this[i]); i++ ) {
    +			results.push( elem );
    +		}
    +		return results;
    +	};
    +}
    +
    +function Sizzle( selector, context, results, seed ) {
    +	results = results || [];
    +	context = context || document;
    +	var match, elem, xml, m,
    +		nodeType = context.nodeType;
    +
    +	if ( !selector || typeof selector !== "string" ) {
    +		return results;
    +	}
    +
    +	if ( nodeType !== 1 && nodeType !== 9 ) {
    +		return [];
    +	}
    +
    +	xml = isXML( context );
    +
    +	if ( !xml && !seed ) {
    +		if ( (match = rquickExpr.exec( selector )) ) {
    +			// Speed-up: Sizzle("#ID")
    +			if ( (m = match[1]) ) {
    +				if ( nodeType === 9 ) {
    +					elem = context.getElementById( m );
    +					// Check parentNode to catch when Blackberry 4.6 returns
    +					// nodes that are no longer in the document #6963
    +					if ( elem && elem.parentNode ) {
    +						// Handle the case where IE, Opera, and Webkit return items
    +						// by name instead of ID
    +						if ( elem.id === m ) {
    +							results.push( elem );
    +							return results;
    +						}
    +					} else {
    +						return results;
    +					}
    +				} else {
    +					// Context is not a document
    +					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
    +						contains( context, elem ) && elem.id === m ) {
    +						results.push( elem );
    +						return results;
    +					}
    +				}
    +
    +			// Speed-up: Sizzle("TAG")
    +			} else if ( match[2] ) {
    +				push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
    +				return results;
    +
    +			// Speed-up: Sizzle(".CLASS")
    +			} else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
    +				push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
    +				return results;
    +			}
    +		}
    +	}
    +
    +	// All others
    +	return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );
    +}
    +
    +Sizzle.matches = function( expr, elements ) {
    +	return Sizzle( expr, null, null, elements );
    +};
    +
    +Sizzle.matchesSelector = function( elem, expr ) {
    +	return Sizzle( expr, null, null, [ elem ] ).length > 0;
    +};
    +
    +// Returns a function to use in pseudos for input types
    +function createInputPseudo( type ) {
    +	return function( elem ) {
    +		var name = elem.nodeName.toLowerCase();
    +		return name === "input" && elem.type === type;
    +	};
    +}
    +
    +// Returns a function to use in pseudos for buttons
    +function createButtonPseudo( type ) {
    +	return function( elem ) {
    +		var name = elem.nodeName.toLowerCase();
    +		return (name === "input" || name === "button") && elem.type === type;
    +	};
    +}
    +
    +// Returns a function to use in pseudos for positionals
    +function createPositionalPseudo( fn ) {
    +	return markFunction(function( argument ) {
    +		argument = +argument;
    +		return markFunction(function( seed, matches ) {
    +			var j,
    +				matchIndexes = fn( [], seed.length, argument ),
    +				i = matchIndexes.length;
    +
    +			// Match elements found at the specified indexes
    +			while ( i-- ) {
    +				if ( seed[ (j = matchIndexes[i]) ] ) {
    +					seed[j] = !(matches[j] = seed[j]);
    +				}
    +			}
    +		});
    +	});
    +}
    +
    +/**
    + * Utility function for retrieving the text value of an array of DOM nodes
    + * @param {Array|Element} elem
    + */
    +getText = Sizzle.getText = function( elem ) {
    +	var node,
    +		ret = "",
    +		i = 0,
    +		nodeType = elem.nodeType;
    +
    +	if ( nodeType ) {
    +		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
    +			// Use textContent for elements
    +			// innerText usage removed for consistency of new lines (see #11153)
    +			if ( typeof elem.textContent === "string" ) {
    +				return elem.textContent;
    +			} else {
    +				// Traverse its children
    +				for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
    +					ret += getText( elem );
    +				}
    +			}
    +		} else if ( nodeType === 3 || nodeType === 4 ) {
    +			return elem.nodeValue;
    +		}
    +		// Do not include comment or processing instruction nodes
    +	} else {
    +
    +		// If no nodeType, this is expected to be an array
    +		for ( ; (node = elem[i]); i++ ) {
    +			// Do not traverse comment nodes
    +			ret += getText( node );
    +		}
    +	}
    +	return ret;
    +};
    +
    +isXML = Sizzle.isXML = function( elem ) {
    +	// documentElement is verified for cases where it doesn't yet exist
    +	// (such as loading iframes in IE - #4833)
    +	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
    +	return documentElement ? documentElement.nodeName !== "HTML" : false;
    +};
    +
    +// Element contains another
    +contains = Sizzle.contains = docElem.contains ?
    +	function( a, b ) {
    +		var adown = a.nodeType === 9 ? a.documentElement : a,
    +			bup = b && b.parentNode;
    +		return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
    +	} :
    +	docElem.compareDocumentPosition ?
    +	function( a, b ) {
    +		return b && !!( a.compareDocumentPosition( b ) & 16 );
    +	} :
    +	function( a, b ) {
    +		while ( (b = b.parentNode) ) {
    +			if ( b === a ) {
    +				return true;
    +			}
    +		}
    +		return false;
    +	};
    +
    +Sizzle.attr = function( elem, name ) {
    +	var val,
    +		xml = isXML( elem );
    +
    +	if ( !xml ) {
    +		name = name.toLowerCase();
    +	}
    +	if ( (val = Expr.attrHandle[ name ]) ) {
    +		return val( elem );
    +	}
    +	if ( xml || assertAttributes ) {
    +		return elem.getAttribute( name );
    +	}
    +	val = elem.getAttributeNode( name );
    +	return val ?
    +		typeof elem[ name ] === "boolean" ?
    +			elem[ name ] ? name : null :
    +			val.specified ? val.value : null :
    +		null;
    +};
    +
    +Expr = Sizzle.selectors = {
    +
    +	// Can be adjusted by the user
    +	cacheLength: 50,
    +
    +	createPseudo: markFunction,
    +
    +	match: matchExpr,
    +
    +	// IE6/7 return a modified href
    +	attrHandle: assertHrefNotNormalized ?
    +		{} :
    +		{
    +			"href": function( elem ) {
    +				return elem.getAttribute( "href", 2 );
    +			},
    +			"type": function( elem ) {
    +				return elem.getAttribute("type");
    +			}
    +		},
    +
    +	find: {
    +		"ID": assertGetIdNotName ?
    +			function( id, context, xml ) {
    +				if ( typeof context.getElementById !== strundefined && !xml ) {
    +					var m = context.getElementById( id );
    +					// Check parentNode to catch when Blackberry 4.6 returns
    +					// nodes that are no longer in the document #6963
    +					return m && m.parentNode ? [m] : [];
    +				}
    +			} :
    +			function( id, context, xml ) {
    +				if ( typeof context.getElementById !== strundefined && !xml ) {
    +					var m = context.getElementById( id );
    +
    +					return m ?
    +						m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
    +							[m] :
    +							undefined :
    +						[];
    +				}
    +			},
    +
    +		"TAG": assertTagNameNoComments ?
    +			function( tag, context ) {
    +				if ( typeof context.getElementsByTagName !== strundefined ) {
    +					return context.getElementsByTagName( tag );
    +				}
    +			} :
    +			function( tag, context ) {
    +				var results = context.getElementsByTagName( tag );
    +
    +				// Filter out possible comments
    +				if ( tag === "*" ) {
    +					var elem,
    +						tmp = [],
    +						i = 0;
    +
    +					for ( ; (elem = results[i]); i++ ) {
    +						if ( elem.nodeType === 1 ) {
    +							tmp.push( elem );
    +						}
    +					}
    +
    +					return tmp;
    +				}
    +				return results;
    +			},
    +
    +		"NAME": assertUsableName && function( tag, context ) {
    +			if ( typeof context.getElementsByName !== strundefined ) {
    +				return context.getElementsByName( name );
    +			}
    +		},
    +
    +		"CLASS": assertUsableClassName && function( className, context, xml ) {
    +			if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
    +				return context.getElementsByClassName( className );
    +			}
    +		}
    +	},
    +
    +	relative: {
    +		">": { dir: "parentNode", first: true },
    +		" ": { dir: "parentNode" },
    +		"+": { dir: "previousSibling", first: true },
    +		"~": { dir: "previousSibling" }
    +	},
    +
    +	preFilter: {
    +		"ATTR": function( match ) {
    +			match[1] = match[1].replace( rbackslash, "" );
    +
    +			// Move the given value to match[3] whether quoted or unquoted
    +			match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
    +
    +			if ( match[2] === "~=" ) {
    +				match[3] = " " + match[3] + " ";
    +			}
    +
    +			return match.slice( 0, 4 );
    +		},
    +
    +		"CHILD": function( match ) {
    +			/* matches from matchExpr["CHILD"]
    +				1 type (only|nth|...)
    +				2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
    +				3 xn-component of xn+y argument ([+-]?\d*n|)
    +				4 sign of xn-component
    +				5 x of xn-component
    +				6 sign of y-component
    +				7 y of y-component
    +			*/
    +			match[1] = match[1].toLowerCase();
    +
    +			if ( match[1] === "nth" ) {
    +				// nth-child requires argument
    +				if ( !match[2] ) {
    +					Sizzle.error( match[0] );
    +				}
    +
    +				// numeric x and y parameters for Expr.filter.CHILD
    +				// remember that false/true cast respectively to 0/1
    +				match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
    +				match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
    +
    +			// other types prohibit arguments
    +			} else if ( match[2] ) {
    +				Sizzle.error( match[0] );
    +			}
    +
    +			return match;
    +		},
    +
    +		"PSEUDO": function( match ) {
    +			var unquoted, excess;
    +			if ( matchExpr["CHILD"].test( match[0] ) ) {
    +				return null;
    +			}
    +
    +			if ( match[3] ) {
    +				match[2] = match[3];
    +			} else if ( (unquoted = match[4]) ) {
    +				// Only check arguments that contain a pseudo
    +				if ( rpseudo.test(unquoted) &&
    +					// Get excess from tokenize (recursively)
    +					(excess = tokenize( unquoted, true )) &&
    +					// advance to the next closing parenthesis
    +					(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
    +
    +					// excess is a negative index
    +					unquoted = unquoted.slice( 0, excess );
    +					match[0] = match[0].slice( 0, excess );
    +				}
    +				match[2] = unquoted;
    +			}
    +
    +			// Return only captures needed by the pseudo filter method (type and argument)
    +			return match.slice( 0, 3 );
    +		}
    +	},
    +
    +	filter: {
    +		"ID": assertGetIdNotName ?
    +			function( id ) {
    +				id = id.replace( rbackslash, "" );
    +				return function( elem ) {
    +					return elem.getAttribute("id") === id;
    +				};
    +			} :
    +			function( id ) {
    +				id = id.replace( rbackslash, "" );
    +				return function( elem ) {
    +					var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
    +					return node && node.value === id;
    +				};
    +			},
    +
    +		"TAG": function( nodeName ) {
    +			if ( nodeName === "*" ) {
    +				return function() { return true; };
    +			}
    +			nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
    +
    +			return function( elem ) {
    +				return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
    +			};
    +		},
    +
    +		"CLASS": function( className ) {
    +			var pattern = classCache[ expando ][ className + " " ];
    +
    +			return pattern ||
    +				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
    +				classCache( className, function( elem ) {
    +					return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
    +				});
    +		},
    +
    +		"ATTR": function( name, operator, check ) {
    +			return function( elem, context ) {
    +				var result = Sizzle.attr( elem, name );
    +
    +				if ( result == null ) {
    +					return operator === "!=";
    +				}
    +				if ( !operator ) {
    +					return true;
    +				}
    +
    +				result += "";
    +
    +				return operator === "=" ? result === check :
    +					operator === "!=" ? result !== check :
    +					operator === "^=" ? check && result.indexOf( check ) === 0 :
    +					operator === "*=" ? check && result.indexOf( check ) > -1 :
    +					operator === "$=" ? check && result.substr( result.length - check.length ) === check :
    +					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
    +					operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
    +					false;
    +			};
    +		},
    +
    +		"CHILD": function( type, argument, first, last ) {
    +
    +			if ( type === "nth" ) {
    +				return function( elem ) {
    +					var node, diff,
    +						parent = elem.parentNode;
    +
    +					if ( first === 1 && last === 0 ) {
    +						return true;
    +					}
    +
    +					if ( parent ) {
    +						diff = 0;
    +						for ( node = parent.firstChild; node; node = node.nextSibling ) {
    +							if ( node.nodeType === 1 ) {
    +								diff++;
    +								if ( elem === node ) {
    +									break;
    +								}
    +							}
    +						}
    +					}
    +
    +					// Incorporate the offset (or cast to NaN), then check against cycle size
    +					diff -= last;
    +					return diff === first || ( diff % first === 0 && diff / first >= 0 );
    +				};
    +			}
    +
    +			return function( elem ) {
    +				var node = elem;
    +
    +				switch ( type ) {
    +					case "only":
    +					case "first":
    +						while ( (node = node.previousSibling) ) {
    +							if ( node.nodeType === 1 ) {
    +								return false;
    +							}
    +						}
    +
    +						if ( type === "first" ) {
    +							return true;
    +						}
    +
    +						node = elem;
    +
    +						/* falls through */
    +					case "last":
    +						while ( (node = node.nextSibling) ) {
    +							if ( node.nodeType === 1 ) {
    +								return false;
    +							}
    +						}
    +
    +						return true;
    +				}
    +			};
    +		},
    +
    +		"PSEUDO": function( pseudo, argument ) {
    +			// pseudo-class names are case-insensitive
    +			// http://www.w3.org/TR/selectors/#pseudo-classes
    +			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
    +			// Remember that setFilters inherits from pseudos
    +			var args,
    +				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
    +					Sizzle.error( "unsupported pseudo: " + pseudo );
    +
    +			// The user may use createPseudo to indicate that
    +			// arguments are needed to create the filter function
    +			// just as Sizzle does
    +			if ( fn[ expando ] ) {
    +				return fn( argument );
    +			}
    +
    +			// But maintain support for old signatures
    +			if ( fn.length > 1 ) {
    +				args = [ pseudo, pseudo, "", argument ];
    +				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
    +					markFunction(function( seed, matches ) {
    +						var idx,
    +							matched = fn( seed, argument ),
    +							i = matched.length;
    +						while ( i-- ) {
    +							idx = indexOf.call( seed, matched[i] );
    +							seed[ idx ] = !( matches[ idx ] = matched[i] );
    +						}
    +					}) :
    +					function( elem ) {
    +						return fn( elem, 0, args );
    +					};
    +			}
    +
    +			return fn;
    +		}
    +	},
    +
    +	pseudos: {
    +		"not": markFunction(function( selector ) {
    +			// Trim the selector passed to compile
    +			// to avoid treating leading and trailing
    +			// spaces as combinators
    +			var input = [],
    +				results = [],
    +				matcher = compile( selector.replace( rtrim, "$1" ) );
    +
    +			return matcher[ expando ] ?
    +				markFunction(function( seed, matches, context, xml ) {
    +					var elem,
    +						unmatched = matcher( seed, null, xml, [] ),
    +						i = seed.length;
    +
    +					// Match elements unmatched by `matcher`
    +					while ( i-- ) {
    +						if ( (elem = unmatched[i]) ) {
    +							seed[i] = !(matches[i] = elem);
    +						}
    +					}
    +				}) :
    +				function( elem, context, xml ) {
    +					input[0] = elem;
    +					matcher( input, null, xml, results );
    +					return !results.pop();
    +				};
    +		}),
    +
    +		"has": markFunction(function( selector ) {
    +			return function( elem ) {
    +				return Sizzle( selector, elem ).length > 0;
    +			};
    +		}),
    +
    +		"contains": markFunction(function( text ) {
    +			return function( elem ) {
    +				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
    +			};
    +		}),
    +
    +		"enabled": function( elem ) {
    +			return elem.disabled === false;
    +		},
    +
    +		"disabled": function( elem ) {
    +			return elem.disabled === true;
    +		},
    +
    +		"checked": function( elem ) {
    +			// In CSS3, :checked should return both checked and selected elements
    +			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
    +			var nodeName = elem.nodeName.toLowerCase();
    +			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
    +		},
    +
    +		"selected": function( elem ) {
    +			// Accessing this property makes selected-by-default
    +			// options in Safari work properly
    +			if ( elem.parentNode ) {
    +				elem.parentNode.selectedIndex;
    +			}
    +
    +			return elem.selected === true;
    +		},
    +
    +		"parent": function( elem ) {
    +			return !Expr.pseudos["empty"]( elem );
    +		},
    +
    +		"empty": function( elem ) {
    +			// http://www.w3.org/TR/selectors/#empty-pseudo
    +			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
    +			//   not comment, processing instructions, or others
    +			// Thanks to Diego Perini for the nodeName shortcut
    +			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
    +			var nodeType;
    +			elem = elem.firstChild;
    +			while ( elem ) {
    +				if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
    +					return false;
    +				}
    +				elem = elem.nextSibling;
    +			}
    +			return true;
    +		},
    +
    +		"header": function( elem ) {
    +			return rheader.test( elem.nodeName );
    +		},
    +
    +		"text": function( elem ) {
    +			var type, attr;
    +			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
    +			// use getAttribute instead to test this case
    +			return elem.nodeName.toLowerCase() === "input" &&
    +				(type = elem.type) === "text" &&
    +				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
    +		},
    +
    +		// Input types
    +		"radio": createInputPseudo("radio"),
    +		"checkbox": createInputPseudo("checkbox"),
    +		"file": createInputPseudo("file"),
    +		"password": createInputPseudo("password"),
    +		"image": createInputPseudo("image"),
    +
    +		"submit": createButtonPseudo("submit"),
    +		"reset": createButtonPseudo("reset"),
    +
    +		"button": function( elem ) {
    +			var name = elem.nodeName.toLowerCase();
    +			return name === "input" && elem.type === "button" || name === "button";
    +		},
    +
    +		"input": function( elem ) {
    +			return rinputs.test( elem.nodeName );
    +		},
    +
    +		"focus": function( elem ) {
    +			var doc = elem.ownerDocument;
    +			return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
    +		},
    +
    +		"active": function( elem ) {
    +			return elem === elem.ownerDocument.activeElement;
    +		},
    +
    +		// Positional types
    +		"first": createPositionalPseudo(function() {
    +			return [ 0 ];
    +		}),
    +
    +		"last": createPositionalPseudo(function( matchIndexes, length ) {
    +			return [ length - 1 ];
    +		}),
    +
    +		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
    +			return [ argument < 0 ? argument + length : argument ];
    +		}),
    +
    +		"even": createPositionalPseudo(function( matchIndexes, length ) {
    +			for ( var i = 0; i < length; i += 2 ) {
    +				matchIndexes.push( i );
    +			}
    +			return matchIndexes;
    +		}),
    +
    +		"odd": createPositionalPseudo(function( matchIndexes, length ) {
    +			for ( var i = 1; i < length; i += 2 ) {
    +				matchIndexes.push( i );
    +			}
    +			return matchIndexes;
    +		}),
    +
    +		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
    +			for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {
    +				matchIndexes.push( i );
    +			}
    +			return matchIndexes;
    +		}),
    +
    +		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
    +			for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {
    +				matchIndexes.push( i );
    +			}
    +			return matchIndexes;
    +		})
    +	}
    +};
    +
    +function siblingCheck( a, b, ret ) {
    +	if ( a === b ) {
    +		return ret;
    +	}
    +
    +	var cur = a.nextSibling;
    +
    +	while ( cur ) {
    +		if ( cur === b ) {
    +			return -1;
    +		}
    +
    +		cur = cur.nextSibling;
    +	}
    +
    +	return 1;
    +}
    +
    +sortOrder = docElem.compareDocumentPosition ?
    +	function( a, b ) {
    +		if ( a === b ) {
    +			hasDuplicate = true;
    +			return 0;
    +		}
    +
    +		return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
    +			a.compareDocumentPosition :
    +			a.compareDocumentPosition(b) & 4
    +		) ? -1 : 1;
    +	} :
    +	function( a, b ) {
    +		// The nodes are identical, we can exit early
    +		if ( a === b ) {
    +			hasDuplicate = true;
    +			return 0;
    +
    +		// Fallback to using sourceIndex (in IE) if it's available on both nodes
    +		} else if ( a.sourceIndex && b.sourceIndex ) {
    +			return a.sourceIndex - b.sourceIndex;
    +		}
    +
    +		var al, bl,
    +			ap = [],
    +			bp = [],
    +			aup = a.parentNode,
    +			bup = b.parentNode,
    +			cur = aup;
    +
    +		// If the nodes are siblings (or identical) we can do a quick check
    +		if ( aup === bup ) {
    +			return siblingCheck( a, b );
    +
    +		// If no parents were found then the nodes are disconnected
    +		} else if ( !aup ) {
    +			return -1;
    +
    +		} else if ( !bup ) {
    +			return 1;
    +		}
    +
    +		// Otherwise they're somewhere else in the tree so we need
    +		// to build up a full list of the parentNodes for comparison
    +		while ( cur ) {
    +			ap.unshift( cur );
    +			cur = cur.parentNode;
    +		}
    +
    +		cur = bup;
    +
    +		while ( cur ) {
    +			bp.unshift( cur );
    +			cur = cur.parentNode;
    +		}
    +
    +		al = ap.length;
    +		bl = bp.length;
    +
    +		// Start walking down the tree looking for a discrepancy
    +		for ( var i = 0; i < al && i < bl; i++ ) {
    +			if ( ap[i] !== bp[i] ) {
    +				return siblingCheck( ap[i], bp[i] );
    +			}
    +		}
    +
    +		// We ended someplace up the tree so do a sibling check
    +		return i === al ?
    +			siblingCheck( a, bp[i], -1 ) :
    +			siblingCheck( ap[i], b, 1 );
    +	};
    +
    +// Always assume the presence of duplicates if sort doesn't
    +// pass them to our comparison function (as in Google Chrome).
    +[0, 0].sort( sortOrder );
    +baseHasDuplicate = !hasDuplicate;
    +
    +// Document sorting and removing duplicates
    +Sizzle.uniqueSort = function( results ) {
    +	var elem,
    +		duplicates = [],
    +		i = 1,
    +		j = 0;
    +
    +	hasDuplicate = baseHasDuplicate;
    +	results.sort( sortOrder );
    +
    +	if ( hasDuplicate ) {
    +		for ( ; (elem = results[i]); i++ ) {
    +			if ( elem === results[ i - 1 ] ) {
    +				j = duplicates.push( i );
    +			}
    +		}
    +		while ( j-- ) {
    +			results.splice( duplicates[ j ], 1 );
    +		}
    +	}
    +
    +	return results;
    +};
    +
    +Sizzle.error = function( msg ) {
    +	throw new Error( "Syntax error, unrecognized expression: " + msg );
    +};
    +
    +function tokenize( selector, parseOnly ) {
    +	var matched, match, tokens, type,
    +		soFar, groups, preFilters,
    +		cached = tokenCache[ expando ][ selector + " " ];
    +
    +	if ( cached ) {
    +		return parseOnly ? 0 : cached.slice( 0 );
    +	}
    +
    +	soFar = selector;
    +	groups = [];
    +	preFilters = Expr.preFilter;
    +
    +	while ( soFar ) {
    +
    +		// Comma and first run
    +		if ( !matched || (match = rcomma.exec( soFar )) ) {
    +			if ( match ) {
    +				// Don't consume trailing commas as valid
    +				soFar = soFar.slice( match[0].length ) || soFar;
    +			}
    +			groups.push( tokens = [] );
    +		}
    +
    +		matched = false;
    +
    +		// Combinators
    +		if ( (match = rcombinators.exec( soFar )) ) {
    +			tokens.push( matched = new Token( match.shift() ) );
    +			soFar = soFar.slice( matched.length );
    +
    +			// Cast descendant combinators to space
    +			matched.type = match[0].replace( rtrim, " " );
    +		}
    +
    +		// Filters
    +		for ( type in Expr.filter ) {
    +			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
    +				(match = preFilters[ type ]( match ))) ) {
    +
    +				tokens.push( matched = new Token( match.shift() ) );
    +				soFar = soFar.slice( matched.length );
    +				matched.type = type;
    +				matched.matches = match;
    +			}
    +		}
    +
    +		if ( !matched ) {
    +			break;
    +		}
    +	}
    +
    +	// Return the length of the invalid excess
    +	// if we're just parsing
    +	// Otherwise, throw an error or return tokens
    +	return parseOnly ?
    +		soFar.length :
    +		soFar ?
    +			Sizzle.error( selector ) :
    +			// Cache the tokens
    +			tokenCache( selector, groups ).slice( 0 );
    +}
    +
    +function addCombinator( matcher, combinator, base ) {
    +	var dir = combinator.dir,
    +		checkNonElements = base && combinator.dir === "parentNode",
    +		doneName = done++;
    +
    +	return combinator.first ?
    +		// Check against closest ancestor/preceding element
    +		function( elem, context, xml ) {
    +			while ( (elem = elem[ dir ]) ) {
    +				if ( checkNonElements || elem.nodeType === 1  ) {
    +					return matcher( elem, context, xml );
    +				}
    +			}
    +		} :
    +
    +		// Check against all ancestor/preceding elements
    +		function( elem, context, xml ) {
    +			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
    +			if ( !xml ) {
    +				var cache,
    +					dirkey = dirruns + " " + doneName + " ",
    +					cachedkey = dirkey + cachedruns;
    +				while ( (elem = elem[ dir ]) ) {
    +					if ( checkNonElements || elem.nodeType === 1 ) {
    +						if ( (cache = elem[ expando ]) === cachedkey ) {
    +							return elem.sizset;
    +						} else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
    +							if ( elem.sizset ) {
    +								return elem;
    +							}
    +						} else {
    +							elem[ expando ] = cachedkey;
    +							if ( matcher( elem, context, xml ) ) {
    +								elem.sizset = true;
    +								return elem;
    +							}
    +							elem.sizset = false;
    +						}
    +					}
    +				}
    +			} else {
    +				while ( (elem = elem[ dir ]) ) {
    +					if ( checkNonElements || elem.nodeType === 1 ) {
    +						if ( matcher( elem, context, xml ) ) {
    +							return elem;
    +						}
    +					}
    +				}
    +			}
    +		};
    +}
    +
    +function elementMatcher( matchers ) {
    +	return matchers.length > 1 ?
    +		function( elem, context, xml ) {
    +			var i = matchers.length;
    +			while ( i-- ) {
    +				if ( !matchers[i]( elem, context, xml ) ) {
    +					return false;
    +				}
    +			}
    +			return true;
    +		} :
    +		matchers[0];
    +}
    +
    +function condense( unmatched, map, filter, context, xml ) {
    +	var elem,
    +		newUnmatched = [],
    +		i = 0,
    +		len = unmatched.length,
    +		mapped = map != null;
    +
    +	for ( ; i < len; i++ ) {
    +		if ( (elem = unmatched[i]) ) {
    +			if ( !filter || filter( elem, context, xml ) ) {
    +				newUnmatched.push( elem );
    +				if ( mapped ) {
    +					map.push( i );
    +				}
    +			}
    +		}
    +	}
    +
    +	return newUnmatched;
    +}
    +
    +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
    +	if ( postFilter && !postFilter[ expando ] ) {
    +		postFilter = setMatcher( postFilter );
    +	}
    +	if ( postFinder && !postFinder[ expando ] ) {
    +		postFinder = setMatcher( postFinder, postSelector );
    +	}
    +	return markFunction(function( seed, results, context, xml ) {
    +		var temp, i, elem,
    +			preMap = [],
    +			postMap = [],
    +			preexisting = results.length,
    +
    +			// Get initial elements from seed or context
    +			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
    +
    +			// Prefilter to get matcher input, preserving a map for seed-results synchronization
    +			matcherIn = preFilter && ( seed || !selector ) ?
    +				condense( elems, preMap, preFilter, context, xml ) :
    +				elems,
    +
    +			matcherOut = matcher ?
    +				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
    +				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
    +
    +					// ...intermediate processing is necessary
    +					[] :
    +
    +					// ...otherwise use results directly
    +					results :
    +				matcherIn;
    +
    +		// Find primary matches
    +		if ( matcher ) {
    +			matcher( matcherIn, matcherOut, context, xml );
    +		}
    +
    +		// Apply postFilter
    +		if ( postFilter ) {
    +			temp = condense( matcherOut, postMap );
    +			postFilter( temp, [], context, xml );
    +
    +			// Un-match failing elements by moving them back to matcherIn
    +			i = temp.length;
    +			while ( i-- ) {
    +				if ( (elem = temp[i]) ) {
    +					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
    +				}
    +			}
    +		}
    +
    +		if ( seed ) {
    +			if ( postFinder || preFilter ) {
    +				if ( postFinder ) {
    +					// Get the final matcherOut by condensing this intermediate into postFinder contexts
    +					temp = [];
    +					i = matcherOut.length;
    +					while ( i-- ) {
    +						if ( (elem = matcherOut[i]) ) {
    +							// Restore matcherIn since elem is not yet a final match
    +							temp.push( (matcherIn[i] = elem) );
    +						}
    +					}
    +					postFinder( null, (matcherOut = []), temp, xml );
    +				}
    +
    +				// Move matched elements from seed to results to keep them synchronized
    +				i = matcherOut.length;
    +				while ( i-- ) {
    +					if ( (elem = matcherOut[i]) &&
    +						(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
    +
    +						seed[temp] = !(results[temp] = elem);
    +					}
    +				}
    +			}
    +
    +		// Add elements to results, through postFinder if defined
    +		} else {
    +			matcherOut = condense(
    +				matcherOut === results ?
    +					matcherOut.splice( preexisting, matcherOut.length ) :
    +					matcherOut
    +			);
    +			if ( postFinder ) {
    +				postFinder( null, results, matcherOut, xml );
    +			} else {
    +				push.apply( results, matcherOut );
    +			}
    +		}
    +	});
    +}
    +
    +function matcherFromTokens( tokens ) {
    +	var checkContext, matcher, j,
    +		len = tokens.length,
    +		leadingRelative = Expr.relative[ tokens[0].type ],
    +		implicitRelative = leadingRelative || Expr.relative[" "],
    +		i = leadingRelative ? 1 : 0,
    +
    +		// The foundational matcher ensures that elements are reachable from top-level context(s)
    +		matchContext = addCombinator( function( elem ) {
    +			return elem === checkContext;
    +		}, implicitRelative, true ),
    +		matchAnyContext = addCombinator( function( elem ) {
    +			return indexOf.call( checkContext, elem ) > -1;
    +		}, implicitRelative, true ),
    +		matchers = [ function( elem, context, xml ) {
    +			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
    +				(checkContext = context).nodeType ?
    +					matchContext( elem, context, xml ) :
    +					matchAnyContext( elem, context, xml ) );
    +		} ];
    +
    +	for ( ; i < len; i++ ) {
    +		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
    +			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
    +		} else {
    +			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
    +
    +			// Return special upon seeing a positional matcher
    +			if ( matcher[ expando ] ) {
    +				// Find the next relative operator (if any) for proper handling
    +				j = ++i;
    +				for ( ; j < len; j++ ) {
    +					if ( Expr.relative[ tokens[j].type ] ) {
    +						break;
    +					}
    +				}
    +				return setMatcher(
    +					i > 1 && elementMatcher( matchers ),
    +					i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
    +					matcher,
    +					i < j && matcherFromTokens( tokens.slice( i, j ) ),
    +					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
    +					j < len && tokens.join("")
    +				);
    +			}
    +			matchers.push( matcher );
    +		}
    +	}
    +
    +	return elementMatcher( matchers );
    +}
    +
    +function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
    +	var bySet = setMatchers.length > 0,
    +		byElement = elementMatchers.length > 0,
    +		superMatcher = function( seed, context, xml, results, expandContext ) {
    +			var elem, j, matcher,
    +				setMatched = [],
    +				matchedCount = 0,
    +				i = "0",
    +				unmatched = seed && [],
    +				outermost = expandContext != null,
    +				contextBackup = outermostContext,
    +				// We must always have either seed elements or context
    +				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
    +				// Nested matchers should use non-integer dirruns
    +				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
    +
    +			if ( outermost ) {
    +				outermostContext = context !== document && context;
    +				cachedruns = superMatcher.el;
    +			}
    +
    +			// Add elements passing elementMatchers directly to results
    +			for ( ; (elem = elems[i]) != null; i++ ) {
    +				if ( byElement && elem ) {
    +					for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
    +						if ( matcher( elem, context, xml ) ) {
    +							results.push( elem );
    +							break;
    +						}
    +					}
    +					if ( outermost ) {
    +						dirruns = dirrunsUnique;
    +						cachedruns = ++superMatcher.el;
    +					}
    +				}
    +
    +				// Track unmatched elements for set filters
    +				if ( bySet ) {
    +					// They will have gone through all possible matchers
    +					if ( (elem = !matcher && elem) ) {
    +						matchedCount--;
    +					}
    +
    +					// Lengthen the array for every element, matched or not
    +					if ( seed ) {
    +						unmatched.push( elem );
    +					}
    +				}
    +			}
    +
    +			// Apply set filters to unmatched elements
    +			matchedCount += i;
    +			if ( bySet && i !== matchedCount ) {
    +				for ( j = 0; (matcher = setMatchers[j]); j++ ) {
    +					matcher( unmatched, setMatched, context, xml );
    +				}
    +
    +				if ( seed ) {
    +					// Reintegrate element matches to eliminate the need for sorting
    +					if ( matchedCount > 0 ) {
    +						while ( i-- ) {
    +							if ( !(unmatched[i] || setMatched[i]) ) {
    +								setMatched[i] = pop.call( results );
    +							}
    +						}
    +					}
    +
    +					// Discard index placeholder values to get only actual matches
    +					setMatched = condense( setMatched );
    +				}
    +
    +				// Add matches to results
    +				push.apply( results, setMatched );
    +
    +				// Seedless set matches succeeding multiple successful matchers stipulate sorting
    +				if ( outermost && !seed && setMatched.length > 0 &&
    +					( matchedCount + setMatchers.length ) > 1 ) {
    +
    +					Sizzle.uniqueSort( results );
    +				}
    +			}
    +
    +			// Override manipulation of globals by nested matchers
    +			if ( outermost ) {
    +				dirruns = dirrunsUnique;
    +				outermostContext = contextBackup;
    +			}
    +
    +			return unmatched;
    +		};
    +
    +	superMatcher.el = 0;
    +	return bySet ?
    +		markFunction( superMatcher ) :
    +		superMatcher;
    +}
    +
    +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
    +	var i,
    +		setMatchers = [],
    +		elementMatchers = [],
    +		cached = compilerCache[ expando ][ selector + " " ];
    +
    +	if ( !cached ) {
    +		// Generate a function of recursive functions that can be used to check each element
    +		if ( !group ) {
    +			group = tokenize( selector );
    +		}
    +		i = group.length;
    +		while ( i-- ) {
    +			cached = matcherFromTokens( group[i] );
    +			if ( cached[ expando ] ) {
    +				setMatchers.push( cached );
    +			} else {
    +				elementMatchers.push( cached );
    +			}
    +		}
    +
    +		// Cache the compiled function
    +		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
    +	}
    +	return cached;
    +};
    +
    +function multipleContexts( selector, contexts, results ) {
    +	var i = 0,
    +		len = contexts.length;
    +	for ( ; i < len; i++ ) {
    +		Sizzle( selector, contexts[i], results );
    +	}
    +	return results;
    +}
    +
    +function select( selector, context, results, seed, xml ) {
    +	var i, tokens, token, type, find,
    +		match = tokenize( selector ),
    +		j = match.length;
    +
    +	if ( !seed ) {
    +		// Try to minimize operations if there is only one group
    +		if ( match.length === 1 ) {
    +
    +			// Take a shortcut and set the context if the root selector is an ID
    +			tokens = match[0] = match[0].slice( 0 );
    +			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
    +					context.nodeType === 9 && !xml &&
    +					Expr.relative[ tokens[1].type ] ) {
    +
    +				context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];
    +				if ( !context ) {
    +					return results;
    +				}
    +
    +				selector = selector.slice( tokens.shift().length );
    +			}
    +
    +			// Fetch a seed set for right-to-left matching
    +			for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
    +				token = tokens[i];
    +
    +				// Abort if we hit a combinator
    +				if ( Expr.relative[ (type = token.type) ] ) {
    +					break;
    +				}
    +				if ( (find = Expr.find[ type ]) ) {
    +					// Search, expanding context for leading sibling combinators
    +					if ( (seed = find(
    +						token.matches[0].replace( rbackslash, "" ),
    +						rsibling.test( tokens[0].type ) && context.parentNode || context,
    +						xml
    +					)) ) {
    +
    +						// If seed is empty or no tokens remain, we can return early
    +						tokens.splice( i, 1 );
    +						selector = seed.length && tokens.join("");
    +						if ( !selector ) {
    +							push.apply( results, slice.call( seed, 0 ) );
    +							return results;
    +						}
    +
    +						break;
    +					}
    +				}
    +			}
    +		}
    +	}
    +
    +	// Compile and execute a filtering function
    +	// Provide `match` to avoid retokenization if we modified the selector above
    +	compile( selector, match )(
    +		seed,
    +		context,
    +		xml,
    +		results,
    +		rsibling.test( selector )
    +	);
    +	return results;
    +}
    +
    +if ( document.querySelectorAll ) {
    +	(function() {
    +		var disconnectedMatch,
    +			oldSelect = select,
    +			rescape = /'|\\/g,
    +			rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
    +
    +			// qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA
    +			// A support test would require too much code (would include document ready)
    +			rbuggyQSA = [ ":focus" ],
    +
    +			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
    +			// A support test would require too much code (would include document ready)
    +			// just skip matchesSelector for :active
    +			rbuggyMatches = [ ":active" ],
    +			matches = docElem.matchesSelector ||
    +				docElem.mozMatchesSelector ||
    +				docElem.webkitMatchesSelector ||
    +				docElem.oMatchesSelector ||
    +				docElem.msMatchesSelector;
    +
    +		// Build QSA regex
    +		// Regex strategy adopted from Diego Perini
    +		assert(function( div ) {
    +			// Select is set to empty string on purpose
    +			// This is to test IE's treatment of not explictly
    +			// setting a boolean content attribute,
    +			// since its presence should be enough
    +			// http://bugs.jquery.com/ticket/12359
    +			div.innerHTML = "<select><option selected=''></option></select>";
    +
    +			// IE8 - Some boolean attributes are not treated correctly
    +			if ( !div.querySelectorAll("[selected]").length ) {
    +				rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
    +			}
    +
    +			// Webkit/Opera - :checked should return selected option elements
    +			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
    +			// IE8 throws error here (do not put tests after this one)
    +			if ( !div.querySelectorAll(":checked").length ) {
    +				rbuggyQSA.push(":checked");
    +			}
    +		});
    +
    +		assert(function( div ) {
    +
    +			// Opera 10-12/IE9 - ^= $= *= and empty values
    +			// Should not select anything
    +			div.innerHTML = "<p test=''></p>";
    +			if ( div.querySelectorAll("[test^='']").length ) {
    +				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
    +			}
    +
    +			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
    +			// IE8 throws error here (do not put tests after this one)
    +			div.innerHTML = "<input type='hidden'/>";
    +			if ( !div.querySelectorAll(":enabled").length ) {
    +				rbuggyQSA.push(":enabled", ":disabled");
    +			}
    +		});
    +
    +		// rbuggyQSA always contains :focus, so no need for a length check
    +		rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );
    +
    +		select = function( selector, context, results, seed, xml ) {
    +			// Only use querySelectorAll when not filtering,
    +			// when this is not xml,
    +			// and when no QSA bugs apply
    +			if ( !seed && !xml && !rbuggyQSA.test( selector ) ) {
    +				var groups, i,
    +					old = true,
    +					nid = expando,
    +					newContext = context,
    +					newSelector = context.nodeType === 9 && selector;
    +
    +				// qSA works strangely on Element-rooted queries
    +				// We can work around this by specifying an extra ID on the root
    +				// and working up from there (Thanks to Andrew Dupont for the technique)
    +				// IE 8 doesn't work on object elements
    +				if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
    +					groups = tokenize( selector );
    +
    +					if ( (old = context.getAttribute("id")) ) {
    +						nid = old.replace( rescape, "\\$&" );
    +					} else {
    +						context.setAttribute( "id", nid );
    +					}
    +					nid = "[id='" + nid + "'] ";
    +
    +					i = groups.length;
    +					while ( i-- ) {
    +						groups[i] = nid + groups[i].join("");
    +					}
    +					newContext = rsibling.test( selector ) && context.parentNode || context;
    +					newSelector = groups.join(",");
    +				}
    +
    +				if ( newSelector ) {
    +					try {
    +						push.apply( results, slice.call( newContext.querySelectorAll(
    +							newSelector
    +						), 0 ) );
    +						return results;
    +					} catch(qsaError) {
    +					} finally {
    +						if ( !old ) {
    +							context.removeAttribute("id");
    +						}
    +					}
    +				}
    +			}
    +
    +			return oldSelect( selector, context, results, seed, xml );
    +		};
    +
    +		if ( matches ) {
    +			assert(function( div ) {
    +				// Check to see if it's possible to do matchesSelector
    +				// on a disconnected node (IE 9)
    +				disconnectedMatch = matches.call( div, "div" );
    +
    +				// This should fail with an exception
    +				// Gecko does not error, returns false instead
    +				try {
    +					matches.call( div, "[test!='']:sizzle" );
    +					rbuggyMatches.push( "!=", pseudos );
    +				} catch ( e ) {}
    +			});
    +
    +			// rbuggyMatches always contains :active and :focus, so no need for a length check
    +			rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
    +
    +			Sizzle.matchesSelector = function( elem, expr ) {
    +				// Make sure that attribute selectors are quoted
    +				expr = expr.replace( rattributeQuotes, "='$1']" );
    +
    +				// rbuggyMatches always contains :active, so no need for an existence check
    +				if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {
    +					try {
    +						var ret = matches.call( elem, expr );
    +
    +						// IE 9's matchesSelector returns false on disconnected nodes
    +						if ( ret || disconnectedMatch ||
    +								// As well, disconnected nodes are said to be in a document
    +								// fragment in IE 9
    +								elem.document && elem.document.nodeType !== 11 ) {
    +							return ret;
    +						}
    +					} catch(e) {}
    +				}
    +
    +				return Sizzle( expr, null, null, [ elem ] ).length > 0;
    +			};
    +		}
    +	})();
    +}
    +
    +// Deprecated
    +Expr.pseudos["nth"] = Expr.pseudos["eq"];
    +
    +// Back-compat
    +function setFilters() {}
    +Expr.filters = setFilters.prototype = Expr.pseudos;
    +Expr.setFilters = new setFilters();
    +
    +// Override sizzle attribute retrieval
    +Sizzle.attr = jQuery.attr;
    +jQuery.find = Sizzle;
    +jQuery.expr = Sizzle.selectors;
    +jQuery.expr[":"] = jQuery.expr.pseudos;
    +jQuery.unique = Sizzle.uniqueSort;
    +jQuery.text = Sizzle.getText;
    +jQuery.isXMLDoc = Sizzle.isXML;
    +jQuery.contains = Sizzle.contains;
    +
    +
    +})( window );
    +var runtil = /Until$/,
    +	rparentsprev = /^(?:parents|prev(?:Until|All))/,
    +	isSimple = /^.[^:#\[\.,]*$/,
    +	rneedsContext = jQuery.expr.match.needsContext,
    +	// methods guaranteed to produce a unique set when starting from a unique set
    +	guaranteedUnique = {
    +		children: true,
    +		contents: true,
    +		next: true,
    +		prev: true
    +	};
    +
    +jQuery.fn.extend({
    +	find: function( selector ) {
    +		var i, l, length, n, r, ret,
    +			self = this;
    +
    +		if ( typeof selector !== "string" ) {
    +			return jQuery( selector ).filter(function() {
    +				for ( i = 0, l = self.length; i < l; i++ ) {
    +					if ( jQuery.contains( self[ i ], this ) ) {
    +						return true;
    +					}
    +				}
    +			});
    +		}
    +
    +		ret = this.pushStack( "", "find", selector );
    +
    +		for ( i = 0, l = this.length; i < l; i++ ) {
    +			length = ret.length;
    +			jQuery.find( selector, this[i], ret );
    +
    +			if ( i > 0 ) {
    +				// Make sure that the results are unique
    +				for ( n = length; n < ret.length; n++ ) {
    +					for ( r = 0; r < length; r++ ) {
    +						if ( ret[r] === ret[n] ) {
    +							ret.splice(n--, 1);
    +							break;
    +						}
    +					}
    +				}
    +			}
    +		}
    +
    +		return ret;
    +	},
    +
    +	has: function( target ) {
    +		var i,
    +			targets = jQuery( target, this ),
    +			len = targets.length;
    +
    +		return this.filter(function() {
    +			for ( i = 0; i < len; i++ ) {
    +				if ( jQuery.contains( this, targets[i] ) ) {
    +					return true;
    +				}
    +			}
    +		});
    +	},
    +
    +	not: function( selector ) {
    +		return this.pushStack( winnow(this, selector, false), "not", selector);
    +	},
    +
    +	filter: function( selector ) {
    +		return this.pushStack( winnow(this, selector, true), "filter", selector );
    +	},
    +
    +	is: function( selector ) {
    +		return !!selector && (
    +			typeof selector === "string" ?
    +				// If this is a positional/relative selector, check membership in the returned set
    +				// so $("p:first").is("p:last") won't return true for a doc with two "p".
    +				rneedsContext.test( selector ) ?
    +					jQuery( selector, this.context ).index( this[0] ) >= 0 :
    +					jQuery.filter( selector, this ).length > 0 :
    +				this.filter( selector ).length > 0 );
    +	},
    +
    +	closest: function( selectors, context ) {
    +		var cur,
    +			i = 0,
    +			l = this.length,
    +			ret = [],
    +			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
    +				jQuery( selectors, context || this.context ) :
    +				0;
    +
    +		for ( ; i < l; i++ ) {
    +			cur = this[i];
    +
    +			while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
    +				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
    +					ret.push( cur );
    +					break;
    +				}
    +				cur = cur.parentNode;
    +			}
    +		}
    +
    +		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
    +
    +		return this.pushStack( ret, "closest", selectors );
    +	},
    +
    +	// Determine the position of an element within
    +	// the matched set of elements
    +	index: function( elem ) {
    +
    +		// No argument, return index in parent
    +		if ( !elem ) {
    +			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
    +		}
    +
    +		// index in selector
    +		if ( typeof elem === "string" ) {
    +			return jQuery.inArray( this[0], jQuery( elem ) );
    +		}
    +
    +		// Locate the position of the desired element
    +		return jQuery.inArray(
    +			// If it receives a jQuery object, the first element is used
    +			elem.jquery ? elem[0] : elem, this );
    +	},
    +
    +	add: function( selector, context ) {
    +		var set = typeof selector === "string" ?
    +				jQuery( selector, context ) :
    +				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
    +			all = jQuery.merge( this.get(), set );
    +
    +		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
    +			all :
    +			jQuery.unique( all ) );
    +	},
    +
    +	addBack: function( selector ) {
    +		return this.add( selector == null ?
    +			this.prevObject : this.prevObject.filter(selector)
    +		);
    +	}
    +});
    +
    +jQuery.fn.andSelf = jQuery.fn.addBack;
    +
    +// A painfully simple check to see if an element is disconnected
    +// from a document (should be improved, where feasible).
    +function isDisconnected( node ) {
    +	return !node || !node.parentNode || node.parentNode.nodeType === 11;
    +}
    +
    +function sibling( cur, dir ) {
    +	do {
    +		cur = cur[ dir ];
    +	} while ( cur && cur.nodeType !== 1 );
    +
    +	return cur;
    +}
    +
    +jQuery.each({
    +	parent: function( elem ) {
    +		var parent = elem.parentNode;
    +		return parent && parent.nodeType !== 11 ? parent : null;
    +	},
    +	parents: function( elem ) {
    +		return jQuery.dir( elem, "parentNode" );
    +	},
    +	parentsUntil: function( elem, i, until ) {
    +		return jQuery.dir( elem, "parentNode", until );
    +	},
    +	next: function( elem ) {
    +		return sibling( elem, "nextSibling" );
    +	},
    +	prev: function( elem ) {
    +		return sibling( elem, "previousSibling" );
    +	},
    +	nextAll: function( elem ) {
    +		return jQuery.dir( elem, "nextSibling" );
    +	},
    +	prevAll: function( elem ) {
    +		return jQuery.dir( elem, "previousSibling" );
    +	},
    +	nextUntil: function( elem, i, until ) {
    +		return jQuery.dir( elem, "nextSibling", until );
    +	},
    +	prevUntil: function( elem, i, until ) {
    +		return jQuery.dir( elem, "previousSibling", until );
    +	},
    +	siblings: function( elem ) {
    +		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
    +	},
    +	children: function( elem ) {
    +		return jQuery.sibling( elem.firstChild );
    +	},
    +	contents: function( elem ) {
    +		return jQuery.nodeName( elem, "iframe" ) ?
    +			elem.contentDocument || elem.contentWindow.document :
    +			jQuery.merge( [], elem.childNodes );
    +	}
    +}, function( name, fn ) {
    +	jQuery.fn[ name ] = function( until, selector ) {
    +		var ret = jQuery.map( this, fn, until );
    +
    +		if ( !runtil.test( name ) ) {
    +			selector = until;
    +		}
    +
    +		if ( selector && typeof selector === "string" ) {
    +			ret = jQuery.filter( selector, ret );
    +		}
    +
    +		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
    +
    +		if ( this.length > 1 && rparentsprev.test( name ) ) {
    +			ret = ret.reverse();
    +		}
    +
    +		return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
    +	};
    +});
    +
    +jQuery.extend({
    +	filter: function( expr, elems, not ) {
    +		if ( not ) {
    +			expr = ":not(" + expr + ")";
    +		}
    +
    +		return elems.length === 1 ?
    +			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
    +			jQuery.find.matches(expr, elems);
    +	},
    +
    +	dir: function( elem, dir, until ) {
    +		var matched = [],
    +			cur = elem[ dir ];
    +
    +		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
    +			if ( cur.nodeType === 1 ) {
    +				matched.push( cur );
    +			}
    +			cur = cur[dir];
    +		}
    +		return matched;
    +	},
    +
    +	sibling: function( n, elem ) {
    +		var r = [];
    +
    +		for ( ; n; n = n.nextSibling ) {
    +			if ( n.nodeType === 1 && n !== elem ) {
    +				r.push( n );
    +			}
    +		}
    +
    +		return r;
    +	}
    +});
    +
    +// Implement the identical functionality for filter and not
    +function winnow( elements, qualifier, keep ) {
    +
    +	// Can't pass null or undefined to indexOf in Firefox 4
    +	// Set to 0 to skip string check
    +	qualifier = qualifier || 0;
    +
    +	if ( jQuery.isFunction( qualifier ) ) {
    +		return jQuery.grep(elements, function( elem, i ) {
    +			var retVal = !!qualifier.call( elem, i, elem );
    +			return retVal === keep;
    +		});
    +
    +	} else if ( qualifier.nodeType ) {
    +		return jQuery.grep(elements, function( elem, i ) {
    +			return ( elem === qualifier ) === keep;
    +		});
    +
    +	} else if ( typeof qualifier === "string" ) {
    +		var filtered = jQuery.grep(elements, function( elem ) {
    +			return elem.nodeType === 1;
    +		});
    +
    +		if ( isSimple.test( qualifier ) ) {
    +			return jQuery.filter(qualifier, filtered, !keep);
    +		} else {
    +			qualifier = jQuery.filter( qualifier, filtered );
    +		}
    +	}
    +
    +	return jQuery.grep(elements, function( elem, i ) {
    +		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
    +	});
    +}
    +function createSafeFragment( document ) {
    +	var list = nodeNames.split( "|" ),
    +	safeFrag = document.createDocumentFragment();
    +
    +	if ( safeFrag.createElement ) {
    +		while ( list.length ) {
    +			safeFrag.createElement(
    +				list.pop()
    +			);
    +		}
    +	}
    +	return safeFrag;
    +}
    +
    +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
    +		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
    +	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
    +	rleadingWhitespace = /^\s+/,
    +	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
    +	rtagName = /<([\w:]+)/,
    +	rtbody = /<tbody/i,
    +	rhtml = /<|&#?\w+;/,
    +	rnoInnerhtml = /<(?:script|style|link)/i,
    +	rnocache = /<(?:script|object|embed|option|style)/i,
    +	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
    +	rcheckableType = /^(?:checkbox|radio)$/,
    +	// checked="checked" or checked
    +	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
    +	rscriptType = /\/(java|ecma)script/i,
    +	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
    +	wrapMap = {
    +		option: [ 1, "<select multiple='multiple'>", "</select>" ],
    +		legend: [ 1, "<fieldset>", "</fieldset>" ],
    +		thead: [ 1, "<table>", "</table>" ],
    +		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
    +		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
    +		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
    +		area: [ 1, "<map>", "</map>" ],
    +		_default: [ 0, "", "" ]
    +	},
    +	safeFragment = createSafeFragment( document ),
    +	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
    +
    +wrapMap.optgroup = wrapMap.option;
    +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
    +wrapMap.th = wrapMap.td;
    +
    +// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
    +// unless wrapped in a div with non-breaking characters in front of it.
    +if ( !jQuery.support.htmlSerialize ) {
    +	wrapMap._default = [ 1, "X<div>", "</div>" ];
    +}
    +
    +jQuery.fn.extend({
    +	text: function( value ) {
    +		return jQuery.access( this, function( value ) {
    +			return value === undefined ?
    +				jQuery.text( this ) :
    +				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
    +		}, null, value, arguments.length );
    +	},
    +
    +	wrapAll: function( html ) {
    +		if ( jQuery.isFunction( html ) ) {
    +			return this.each(function(i) {
    +				jQuery(this).wrapAll( html.call(this, i) );
    +			});
    +		}
    +
    +		if ( this[0] ) {
    +			// The elements to wrap the target around
    +			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
    +
    +			if ( this[0].parentNode ) {
    +				wrap.insertBefore( this[0] );
    +			}
    +
    +			wrap.map(function() {
    +				var elem = this;
    +
    +				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
    +					elem = elem.firstChild;
    +				}
    +
    +				return elem;
    +			}).append( this );
    +		}
    +
    +		return this;
    +	},
    +
    +	wrapInner: function( html ) {
    +		if ( jQuery.isFunction( html ) ) {
    +			return this.each(function(i) {
    +				jQuery(this).wrapInner( html.call(this, i) );
    +			});
    +		}
    +
    +		return this.each(function() {
    +			var self = jQuery( this ),
    +				contents = self.contents();
    +
    +			if ( contents.length ) {
    +				contents.wrapAll( html );
    +
    +			} else {
    +				self.append( html );
    +			}
    +		});
    +	},
    +
    +	wrap: function( html ) {
    +		var isFunction = jQuery.isFunction( html );
    +
    +		return this.each(function(i) {
    +			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
    +		});
    +	},
    +
    +	unwrap: function() {
    +		return this.parent().each(function() {
    +			if ( !jQuery.nodeName( this, "body" ) ) {
    +				jQuery( this ).replaceWith( this.childNodes );
    +			}
    +		}).end();
    +	},
    +
    +	append: function() {
    +		return this.domManip(arguments, true, function( elem ) {
    +			if ( this.nodeType === 1 || this.nodeType === 11 ) {
    +				this.appendChild( elem );
    +			}
    +		});
    +	},
    +
    +	prepend: function() {
    +		return this.domManip(arguments, true, function( elem ) {
    +			if ( this.nodeType === 1 || this.nodeType === 11 ) {
    +				this.insertBefore( elem, this.firstChild );
    +			}
    +		});
    +	},
    +
    +	before: function() {
    +		if ( !isDisconnected( this[0] ) ) {
    +			return this.domManip(arguments, false, function( elem ) {
    +				this.parentNode.insertBefore( elem, this );
    +			});
    +		}
    +
    +		if ( arguments.length ) {
    +			var set = jQuery.clean( arguments );
    +			return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
    +		}
    +	},
    +
    +	after: function() {
    +		if ( !isDisconnected( this[0] ) ) {
    +			return this.domManip(arguments, false, function( elem ) {
    +				this.parentNode.insertBefore( elem, this.nextSibling );
    +			});
    +		}
    +
    +		if ( arguments.length ) {
    +			var set = jQuery.clean( arguments );
    +			return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
    +		}
    +	},
    +
    +	// keepData is for internal use only--do not document
    +	remove: function( selector, keepData ) {
    +		var elem,
    +			i = 0;
    +
    +		for ( ; (elem = this[i]) != null; i++ ) {
    +			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
    +				if ( !keepData && elem.nodeType === 1 ) {
    +					jQuery.cleanData( elem.getElementsByTagName("*") );
    +					jQuery.cleanData( [ elem ] );
    +				}
    +
    +				if ( elem.parentNode ) {
    +					elem.parentNode.removeChild( elem );
    +				}
    +			}
    +		}
    +
    +		return this;
    +	},
    +
    +	empty: function() {
    +		var elem,
    +			i = 0;
    +
    +		for ( ; (elem = this[i]) != null; i++ ) {
    +			// Remove element nodes and prevent memory leaks
    +			if ( elem.nodeType === 1 ) {
    +				jQuery.cleanData( elem.getElementsByTagName("*") );
    +			}
    +
    +			// Remove any remaining nodes
    +			while ( elem.firstChild ) {
    +				elem.removeChild( elem.firstChild );
    +			}
    +		}
    +
    +		return this;
    +	},
    +
    +	clone: function( dataAndEvents, deepDataAndEvents ) {
    +		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
    +		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
    +
    +		return this.map( function () {
    +			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
    +		});
    +	},
    +
    +	html: function( value ) {
    +		return jQuery.access( this, function( value ) {
    +			var elem = this[0] || {},
    +				i = 0,
    +				l = this.length;
    +
    +			if ( value === undefined ) {
    +				return elem.nodeType === 1 ?
    +					elem.innerHTML.replace( rinlinejQuery, "" ) :
    +					undefined;
    +			}
    +
    +			// See if we can take a shortcut and just use innerHTML
    +			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
    +				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
    +				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
    +				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
    +
    +				value = value.replace( rxhtmlTag, "<$1></$2>" );
    +
    +				try {
    +					for (; i < l; i++ ) {
    +						// Remove element nodes and prevent memory leaks
    +						elem = this[i] || {};
    +						if ( elem.nodeType === 1 ) {
    +							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
    +							elem.innerHTML = value;
    +						}
    +					}
    +
    +					elem = 0;
    +
    +				// If using innerHTML throws an exception, use the fallback method
    +				} catch(e) {}
    +			}
    +
    +			if ( elem ) {
    +				this.empty().append( value );
    +			}
    +		}, null, value, arguments.length );
    +	},
    +
    +	replaceWith: function( value ) {
    +		if ( !isDisconnected( this[0] ) ) {
    +			// Make sure that the elements are removed from the DOM before they are inserted
    +			// this can help fix replacing a parent with child elements
    +			if ( jQuery.isFunction( value ) ) {
    +				return this.each(function(i) {
    +					var self = jQuery(this), old = self.html();
    +					self.replaceWith( value.call( this, i, old ) );
    +				});
    +			}
    +
    +			if ( typeof value !== "string" ) {
    +				value = jQuery( value ).detach();
    +			}
    +
    +			return this.each(function() {
    +				var next = this.nextSibling,
    +					parent = this.parentNode;
    +
    +				jQuery( this ).remove();
    +
    +				if ( next ) {
    +					jQuery(next).before( value );
    +				} else {
    +					jQuery(parent).append( value );
    +				}
    +			});
    +		}
    +
    +		return this.length ?
    +			this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
    +			this;
    +	},
    +
    +	detach: function( selector ) {
    +		return this.remove( selector, true );
    +	},
    +
    +	domManip: function( args, table, callback ) {
    +
    +		// Flatten any nested arrays
    +		args = [].concat.apply( [], args );
    +
    +		var results, first, fragment, iNoClone,
    +			i = 0,
    +			value = args[0],
    +			scripts = [],
    +			l = this.length;
    +
    +		// We can't cloneNode fragments that contain checked, in WebKit
    +		if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
    +			return this.each(function() {
    +				jQuery(this).domManip( args, table, callback );
    +			});
    +		}
    +
    +		if ( jQuery.isFunction(value) ) {
    +			return this.each(function(i) {
    +				var self = jQuery(this);
    +				args[0] = value.call( this, i, table ? self.html() : undefined );
    +				self.domManip( args, table, callback );
    +			});
    +		}
    +
    +		if ( this[0] ) {
    +			results = jQuery.buildFragment( args, this, scripts );
    +			fragment = results.fragment;
    +			first = fragment.firstChild;
    +
    +			if ( fragment.childNodes.length === 1 ) {
    +				fragment = first;
    +			}
    +
    +			if ( first ) {
    +				table = table && jQuery.nodeName( first, "tr" );
    +
    +				// Use the original fragment for the last item instead of the first because it can end up
    +				// being emptied incorrectly in certain situations (#8070).
    +				// Fragments from the fragment cache must always be cloned and never used in place.
    +				for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
    +					callback.call(
    +						table && jQuery.nodeName( this[i], "table" ) ?
    +							findOrAppend( this[i], "tbody" ) :
    +							this[i],
    +						i === iNoClone ?
    +							fragment :
    +							jQuery.clone( fragment, true, true )
    +					);
    +				}
    +			}
    +
    +			// Fix #11809: Avoid leaking memory
    +			fragment = first = null;
    +
    +			if ( scripts.length ) {
    +				jQuery.each( scripts, function( i, elem ) {
    +					if ( elem.src ) {
    +						if ( jQuery.ajax ) {
    +							jQuery.ajax({
    +								url: elem.src,
    +								type: "GET",
    +								dataType: "script",
    +								async: false,
    +								global: false,
    +								"throws": true
    +							});
    +						} else {
    +							jQuery.error("no ajax");
    +						}
    +					} else {
    +						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
    +					}
    +
    +					if ( elem.parentNode ) {
    +						elem.parentNode.removeChild( elem );
    +					}
    +				});
    +			}
    +		}
    +
    +		return this;
    +	}
    +});
    +
    +function findOrAppend( elem, tag ) {
    +	return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
    +}
    +
    +function cloneCopyEvent( src, dest ) {
    +
    +	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
    +		return;
    +	}
    +
    +	var type, i, l,
    +		oldData = jQuery._data( src ),
    +		curData = jQuery._data( dest, oldData ),
    +		events = oldData.events;
    +
    +	if ( events ) {
    +		delete curData.handle;
    +		curData.events = {};
    +
    +		for ( type in events ) {
    +			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
    +				jQuery.event.add( dest, type, events[ type ][ i ] );
    +			}
    +		}
    +	}
    +
    +	// make the cloned public data object a copy from the original
    +	if ( curData.data ) {
    +		curData.data = jQuery.extend( {}, curData.data );
    +	}
    +}
    +
    +function cloneFixAttributes( src, dest ) {
    +	var nodeName;
    +
    +	// We do not need to do anything for non-Elements
    +	if ( dest.nodeType !== 1 ) {
    +		return;
    +	}
    +
    +	// clearAttributes removes the attributes, which we don't want,
    +	// but also removes the attachEvent events, which we *do* want
    +	if ( dest.clearAttributes ) {
    +		dest.clearAttributes();
    +	}
    +
    +	// mergeAttributes, in contrast, only merges back on the
    +	// original attributes, not the events
    +	if ( dest.mergeAttributes ) {
    +		dest.mergeAttributes( src );
    +	}
    +
    +	nodeName = dest.nodeName.toLowerCase();
    +
    +	if ( nodeName === "object" ) {
    +		// IE6-10 improperly clones children of object elements using classid.
    +		// IE10 throws NoModificationAllowedError if parent is null, #12132.
    +		if ( dest.parentNode ) {
    +			dest.outerHTML = src.outerHTML;
    +		}
    +
    +		// This path appears unavoidable for IE9. When cloning an object
    +		// element in IE9, the outerHTML strategy above is not sufficient.
    +		// If the src has innerHTML and the destination does not,
    +		// copy the src.innerHTML into the dest.innerHTML. #10324
    +		if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
    +			dest.innerHTML = src.innerHTML;
    +		}
    +
    +	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
    +		// IE6-8 fails to persist the checked state of a cloned checkbox
    +		// or radio button. Worse, IE6-7 fail to give the cloned element
    +		// a checked appearance if the defaultChecked value isn't also set
    +
    +		dest.defaultChecked = dest.checked = src.checked;
    +
    +		// IE6-7 get confused and end up setting the value of a cloned
    +		// checkbox/radio button to an empty string instead of "on"
    +		if ( dest.value !== src.value ) {
    +			dest.value = src.value;
    +		}
    +
    +	// IE6-8 fails to return the selected option to the default selected
    +	// state when cloning options
    +	} else if ( nodeName === "option" ) {
    +		dest.selected = src.defaultSelected;
    +
    +	// IE6-8 fails to set the defaultValue to the correct value when
    +	// cloning other types of input fields
    +	} else if ( nodeName === "input" || nodeName === "textarea" ) {
    +		dest.defaultValue = src.defaultValue;
    +
    +	// IE blanks contents when cloning scripts
    +	} else if ( nodeName === "script" && dest.text !== src.text ) {
    +		dest.text = src.text;
    +	}
    +
    +	// Event data gets referenced instead of copied if the expando
    +	// gets copied too
    +	dest.removeAttribute( jQuery.expando );
    +}
    +
    +jQuery.buildFragment = function( args, context, scripts ) {
    +	var fragment, cacheable, cachehit,
    +		first = args[ 0 ];
    +
    +	// Set context from what may come in as undefined or a jQuery collection or a node
    +	// Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
    +	// also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
    +	context = context || document;
    +	context = !context.nodeType && context[0] || context;
    +	context = context.ownerDocument || context;
    +
    +	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
    +	// Cloning options loses the selected state, so don't cache them
    +	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
    +	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
    +	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
    +	if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
    +		first.charAt(0) === "<" && !rnocache.test( first ) &&
    +		(jQuery.support.checkClone || !rchecked.test( first )) &&
    +		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
    +
    +		// Mark cacheable and look for a hit
    +		cacheable = true;
    +		fragment = jQuery.fragments[ first ];
    +		cachehit = fragment !== undefined;
    +	}
    +
    +	if ( !fragment ) {
    +		fragment = context.createDocumentFragment();
    +		jQuery.clean( args, context, fragment, scripts );
    +
    +		// Update the cache, but only store false
    +		// unless this is a second parsing of the same content
    +		if ( cacheable ) {
    +			jQuery.fragments[ first ] = cachehit && fragment;
    +		}
    +	}
    +
    +	return { fragment: fragment, cacheable: cacheable };
    +};
    +
    +jQuery.fragments = {};
    +
    +jQuery.each({
    +	appendTo: "append",
    +	prependTo: "prepend",
    +	insertBefore: "before",
    +	insertAfter: "after",
    +	replaceAll: "replaceWith"
    +}, function( name, original ) {
    +	jQuery.fn[ name ] = function( selector ) {
    +		var elems,
    +			i = 0,
    +			ret = [],
    +			insert = jQuery( selector ),
    +			l = insert.length,
    +			parent = this.length === 1 && this[0].parentNode;
    +
    +		if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
    +			insert[ original ]( this[0] );
    +			return this;
    +		} else {
    +			for ( ; i < l; i++ ) {
    +				elems = ( i > 0 ? this.clone(true) : this ).get();
    +				jQuery( insert[i] )[ original ]( elems );
    +				ret = ret.concat( elems );
    +			}
    +
    +			return this.pushStack( ret, name, insert.selector );
    +		}
    +	};
    +});
    +
    +function getAll( elem ) {
    +	if ( typeof elem.getElementsByTagName !== "undefined" ) {
    +		return elem.getElementsByTagName( "*" );
    +
    +	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
    +		return elem.querySelectorAll( "*" );
    +
    +	} else {
    +		return [];
    +	}
    +}
    +
    +// Used in clean, fixes the defaultChecked property
    +function fixDefaultChecked( elem ) {
    +	if ( rcheckableType.test( elem.type ) ) {
    +		elem.defaultChecked = elem.checked;
    +	}
    +}
    +
    +jQuery.extend({
    +	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
    +		var srcElements,
    +			destElements,
    +			i,
    +			clone;
    +
    +		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
    +			clone = elem.cloneNode( true );
    +
    +		// IE<=8 does not properly clone detached, unknown element nodes
    +		} else {
    +			fragmentDiv.innerHTML = elem.outerHTML;
    +			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
    +		}
    +
    +		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
    +				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
    +			// IE copies events bound via attachEvent when using cloneNode.
    +			// Calling detachEvent on the clone will also remove the events
    +			// from the original. In order to get around this, we use some
    +			// proprietary methods to clear the events. Thanks to MooTools
    +			// guys for this hotness.
    +
    +			cloneFixAttributes( elem, clone );
    +
    +			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
    +			srcElements = getAll( elem );
    +			destElements = getAll( clone );
    +
    +			// Weird iteration because IE will replace the length property
    +			// with an element if you are cloning the body and one of the
    +			// elements on the page has a name or id of "length"
    +			for ( i = 0; srcElements[i]; ++i ) {
    +				// Ensure that the destination node is not null; Fixes #9587
    +				if ( destElements[i] ) {
    +					cloneFixAttributes( srcElements[i], destElements[i] );
    +				}
    +			}
    +		}
    +
    +		// Copy the events from the original to the clone
    +		if ( dataAndEvents ) {
    +			cloneCopyEvent( elem, clone );
    +
    +			if ( deepDataAndEvents ) {
    +				srcElements = getAll( elem );
    +				destElements = getAll( clone );
    +
    +				for ( i = 0; srcElements[i]; ++i ) {
    +					cloneCopyEvent( srcElements[i], destElements[i] );
    +				}
    +			}
    +		}
    +
    +		srcElements = destElements = null;
    +
    +		// Return the cloned set
    +		return clone;
    +	},
    +
    +	clean: function( elems, context, fragment, scripts ) {
    +		var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
    +			safe = context === document && safeFragment,
    +			ret = [];
    +
    +		// Ensure that context is a document
    +		if ( !context || typeof context.createDocumentFragment === "undefined" ) {
    +			context = document;
    +		}
    +
    +		// Use the already-created safe fragment if context permits
    +		for ( i = 0; (elem = elems[i]) != null; i++ ) {
    +			if ( typeof elem === "number" ) {
    +				elem += "";
    +			}
    +
    +			if ( !elem ) {
    +				continue;
    +			}
    +
    +			// Convert html string into DOM nodes
    +			if ( typeof elem === "string" ) {
    +				if ( !rhtml.test( elem ) ) {
    +					elem = context.createTextNode( elem );
    +				} else {
    +					// Ensure a safe container in which to render the html
    +					safe = safe || createSafeFragment( context );
    +					div = context.createElement("div");
    +					safe.appendChild( div );
    +
    +					// Fix "XHTML"-style tags in all browsers
    +					elem = elem.replace(rxhtmlTag, "<$1></$2>");
    +
    +					// Go to html and back, then peel off extra wrappers
    +					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
    +					wrap = wrapMap[ tag ] || wrapMap._default;
    +					depth = wrap[0];
    +					div.innerHTML = wrap[1] + elem + wrap[2];
    +
    +					// Move to the right depth
    +					while ( depth-- ) {
    +						div = div.lastChild;
    +					}
    +
    +					// Remove IE's autoinserted <tbody> from table fragments
    +					if ( !jQuery.support.tbody ) {
    +
    +						// String was a <table>, *may* have spurious <tbody>
    +						hasBody = rtbody.test(elem);
    +							tbody = tag === "table" && !hasBody ?
    +								div.firstChild && div.firstChild.childNodes :
    +
    +								// String was a bare <thead> or <tfoot>
    +								wrap[1] === "<table>" && !hasBody ?
    +									div.childNodes :
    +									[];
    +
    +						for ( j = tbody.length - 1; j >= 0 ; --j ) {
    +							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
    +								tbody[ j ].parentNode.removeChild( tbody[ j ] );
    +							}
    +						}
    +					}
    +
    +					// IE completely kills leading whitespace when innerHTML is used
    +					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
    +						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
    +					}
    +
    +					elem = div.childNodes;
    +
    +					// Take out of fragment container (we need a fresh div each time)
    +					div.parentNode.removeChild( div );
    +				}
    +			}
    +
    +			if ( elem.nodeType ) {
    +				ret.push( elem );
    +			} else {
    +				jQuery.merge( ret, elem );
    +			}
    +		}
    +
    +		// Fix #11356: Clear elements from safeFragment
    +		if ( div ) {
    +			elem = div = safe = null;
    +		}
    +
    +		// Reset defaultChecked for any radios and checkboxes
    +		// about to be appended to the DOM in IE 6/7 (#8060)
    +		if ( !jQuery.support.appendChecked ) {
    +			for ( i = 0; (elem = ret[i]) != null; i++ ) {
    +				if ( jQuery.nodeName( elem, "input" ) ) {
    +					fixDefaultChecked( elem );
    +				} else if ( typeof elem.getElementsByTagName !== "undefined" ) {
    +					jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
    +				}
    +			}
    +		}
    +
    +		// Append elements to a provided document fragment
    +		if ( fragment ) {
    +			// Special handling of each script element
    +			handleScript = function( elem ) {
    +				// Check if we consider it executable
    +				if ( !elem.type || rscriptType.test( elem.type ) ) {
    +					// Detach the script and store it in the scripts array (if provided) or the fragment
    +					// Return truthy to indicate that it has been handled
    +					return scripts ?
    +						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
    +						fragment.appendChild( elem );
    +				}
    +			};
    +
    +			for ( i = 0; (elem = ret[i]) != null; i++ ) {
    +				// Check if we're done after handling an executable script
    +				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
    +					// Append to fragment and handle embedded scripts
    +					fragment.appendChild( elem );
    +					if ( typeof elem.getElementsByTagName !== "undefined" ) {
    +						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
    +						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
    +
    +						// Splice the scripts into ret after their former ancestor and advance our index beyond them
    +						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
    +						i += jsTags.length;
    +					}
    +				}
    +			}
    +		}
    +
    +		return ret;
    +	},
    +
    +	cleanData: function( elems, /* internal */ acceptData ) {
    +		var data, id, elem, type,
    +			i = 0,
    +			internalKey = jQuery.expando,
    +			cache = jQuery.cache,
    +			deleteExpando = jQuery.support.deleteExpando,
    +			special = jQuery.event.special;
    +
    +		for ( ; (elem = elems[i]) != null; i++ ) {
    +
    +			if ( acceptData || jQuery.acceptData( elem ) ) {
    +
    +				id = elem[ internalKey ];
    +				data = id && cache[ id ];
    +
    +				if ( data ) {
    +					if ( data.events ) {
    +						for ( type in data.events ) {
    +							if ( special[ type ] ) {
    +								jQuery.event.remove( elem, type );
    +
    +							// This is a shortcut to avoid jQuery.event.remove's overhead
    +							} else {
    +								jQuery.removeEvent( elem, type, data.handle );
    +							}
    +						}
    +					}
    +
    +					// Remove cache only if it was not already removed by jQuery.event.remove
    +					if ( cache[ id ] ) {
    +
    +						delete cache[ id ];
    +
    +						// IE does not allow us to delete expando properties from nodes,
    +						// nor does it have a removeAttribute function on Document nodes;
    +						// we must handle all of these cases
    +						if ( deleteExpando ) {
    +							delete elem[ internalKey ];
    +
    +						} else if ( elem.removeAttribute ) {
    +							elem.removeAttribute( internalKey );
    +
    +						} else {
    +							elem[ internalKey ] = null;
    +						}
    +
    +						jQuery.deletedIds.push( id );
    +					}
    +				}
    +			}
    +		}
    +	}
    +});
    +// Limit scope pollution from any deprecated API
    +(function() {
    +
    +var matched, browser;
    +
    +// Use of jQuery.browser is frowned upon.
    +// More details: http://api.jquery.com/jQuery.browser
    +// jQuery.uaMatch maintained for back-compat
    +jQuery.uaMatch = function( ua ) {
    +	ua = ua.toLowerCase();
    +
    +	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
    +		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
    +		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
    +		/(msie) ([\w.]+)/.exec( ua ) ||
    +		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
    +		[];
    +
    +	return {
    +		browser: match[ 1 ] || "",
    +		version: match[ 2 ] || "0"
    +	};
    +};
    +
    +matched = jQuery.uaMatch( navigator.userAgent );
    +browser = {};
    +
    +if ( matched.browser ) {
    +	browser[ matched.browser ] = true;
    +	browser.version = matched.version;
    +}
    +
    +// Chrome is Webkit, but Webkit is also Safari.
    +if ( browser.chrome ) {
    +	browser.webkit = true;
    +} else if ( browser.webkit ) {
    +	browser.safari = true;
    +}
    +
    +jQuery.browser = browser;
    +
    +jQuery.sub = function() {
    +	function jQuerySub( selector, context ) {
    +		return new jQuerySub.fn.init( selector, context );
    +	}
    +	jQuery.extend( true, jQuerySub, this );
    +	jQuerySub.superclass = this;
    +	jQuerySub.fn = jQuerySub.prototype = this();
    +	jQuerySub.fn.constructor = jQuerySub;
    +	jQuerySub.sub = this.sub;
    +	jQuerySub.fn.init = function init( selector, context ) {
    +		if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
    +			context = jQuerySub( context );
    +		}
    +
    +		return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
    +	};
    +	jQuerySub.fn.init.prototype = jQuerySub.fn;
    +	var rootjQuerySub = jQuerySub(document);
    +	return jQuerySub;
    +};
    +
    +})();
    +var curCSS, iframe, iframeDoc,
    +	ralpha = /alpha\([^)]*\)/i,
    +	ropacity = /opacity=([^)]*)/,
    +	rposition = /^(top|right|bottom|left)$/,
    +	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
    +	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
    +	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
    +	rmargin = /^margin/,
    +	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
    +	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
    +	rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
    +	elemdisplay = { BODY: "block" },
    +
    +	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
    +	cssNormalTransform = {
    +		letterSpacing: 0,
    +		fontWeight: 400
    +	},
    +
    +	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
    +	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
    +
    +	eventsToggle = jQuery.fn.toggle;
    +
    +// return a css property mapped to a potentially vendor prefixed property
    +function vendorPropName( style, name ) {
    +
    +	// shortcut for names that are not vendor prefixed
    +	if ( name in style ) {
    +		return name;
    +	}
    +
    +	// check for vendor prefixed names
    +	var capName = name.charAt(0).toUpperCase() + name.slice(1),
    +		origName = name,
    +		i = cssPrefixes.length;
    +
    +	while ( i-- ) {
    +		name = cssPrefixes[ i ] + capName;
    +		if ( name in style ) {
    +			return name;
    +		}
    +	}
    +
    +	return origName;
    +}
    +
    +function isHidden( elem, el ) {
    +	elem = el || elem;
    +	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
    +}
    +
    +function showHide( elements, show ) {
    +	var elem, display,
    +		values = [],
    +		index = 0,
    +		length = elements.length;
    +
    +	for ( ; index < length; index++ ) {
    +		elem = elements[ index ];
    +		if ( !elem.style ) {
    +			continue;
    +		}
    +		values[ index ] = jQuery._data( elem, "olddisplay" );
    +		if ( show ) {
    +			// Reset the inline display of this element to learn if it is
    +			// being hidden by cascaded rules or not
    +			if ( !values[ index ] && elem.style.display === "none" ) {
    +				elem.style.display = "";
    +			}
    +
    +			// Set elements which have been overridden with display: none
    +			// in a stylesheet to whatever the default browser style is
    +			// for such an element
    +			if ( elem.style.display === "" && isHidden( elem ) ) {
    +				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
    +			}
    +		} else {
    +			display = curCSS( elem, "display" );
    +
    +			if ( !values[ index ] && display !== "none" ) {
    +				jQuery._data( elem, "olddisplay", display );
    +			}
    +		}
    +	}
    +
    +	// Set the display of most of the elements in a second loop
    +	// to avoid the constant reflow
    +	for ( index = 0; index < length; index++ ) {
    +		elem = elements[ index ];
    +		if ( !elem.style ) {
    +			continue;
    +		}
    +		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
    +			elem.style.display = show ? values[ index ] || "" : "none";
    +		}
    +	}
    +
    +	return elements;
    +}
    +
    +jQuery.fn.extend({
    +	css: function( name, value ) {
    +		return jQuery.access( this, function( elem, name, value ) {
    +			return value !== undefined ?
    +				jQuery.style( elem, name, value ) :
    +				jQuery.css( elem, name );
    +		}, name, value, arguments.length > 1 );
    +	},
    +	show: function() {
    +		return showHide( this, true );
    +	},
    +	hide: function() {
    +		return showHide( this );
    +	},
    +	toggle: function( state, fn2 ) {
    +		var bool = typeof state === "boolean";
    +
    +		if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
    +			return eventsToggle.apply( this, arguments );
    +		}
    +
    +		return this.each(function() {
    +			if ( bool ? state : isHidden( this ) ) {
    +				jQuery( this ).show();
    +			} else {
    +				jQuery( this ).hide();
    +			}
    +		});
    +	}
    +});
    +
    +jQuery.extend({
    +	// Add in style property hooks for overriding the default
    +	// behavior of getting and setting a style property
    +	cssHooks: {
    +		opacity: {
    +			get: function( elem, computed ) {
    +				if ( computed ) {
    +					// We should always get a number back from opacity
    +					var ret = curCSS( elem, "opacity" );
    +					return ret === "" ? "1" : ret;
    +
    +				}
    +			}
    +		}
    +	},
    +
    +	// Exclude the following css properties to add px
    +	cssNumber: {
    +		"fillOpacity": true,
    +		"fontWeight": true,
    +		"lineHeight": true,
    +		"opacity": true,
    +		"orphans": true,
    +		"widows": true,
    +		"zIndex": true,
    +		"zoom": true
    +	},
    +
    +	// Add in properties whose names you wish to fix before
    +	// setting or getting the value
    +	cssProps: {
    +		// normalize float css property
    +		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
    +	},
    +
    +	// Get and set the style property on a DOM Node
    +	style: function( elem, name, value, extra ) {
    +		// Don't set styles on text and comment nodes
    +		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
    +			return;
    +		}
    +
    +		// Make sure that we're working with the right name
    +		var ret, type, hooks,
    +			origName = jQuery.camelCase( name ),
    +			style = elem.style;
    +
    +		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
    +
    +		// gets hook for the prefixed version
    +		// followed by the unprefixed version
    +		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
    +
    +		// Check if we're setting a value
    +		if ( value !== undefined ) {
    +			type = typeof value;
    +
    +			// convert relative number strings (+= or -=) to relative numbers. #7345
    +			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
    +				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
    +				// Fixes bug #9237
    +				type = "number";
    +			}
    +
    +			// Make sure that NaN and null values aren't set. See: #7116
    +			if ( value == null || type === "number" && isNaN( value ) ) {
    +				return;
    +			}
    +
    +			// If a number was passed in, add 'px' to the (except for certain CSS properties)
    +			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
    +				value += "px";
    +			}
    +
    +			// If a hook was provided, use that value, otherwise just set the specified value
    +			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
    +				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
    +				// Fixes bug #5509
    +				try {
    +					style[ name ] = value;
    +				} catch(e) {}
    +			}
    +
    +		} else {
    +			// If a hook was provided get the non-computed value from there
    +			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
    +				return ret;
    +			}
    +
    +			// Otherwise just get the value from the style object
    +			return style[ name ];
    +		}
    +	},
    +
    +	css: function( elem, name, numeric, extra ) {
    +		var val, num, hooks,
    +			origName = jQuery.camelCase( name );
    +
    +		// Make sure that we're working with the right name
    +		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
    +
    +		// gets hook for the prefixed version
    +		// followed by the unprefixed version
    +		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
    +
    +		// If a hook was provided get the computed value from there
    +		if ( hooks && "get" in hooks ) {
    +			val = hooks.get( elem, true, extra );
    +		}
    +
    +		// Otherwise, if a way to get the computed value exists, use that
    +		if ( val === undefined ) {
    +			val = curCSS( elem, name );
    +		}
    +
    +		//convert "normal" to computed value
    +		if ( val === "normal" && name in cssNormalTransform ) {
    +			val = cssNormalTransform[ name ];
    +		}
    +
    +		// Return, converting to number if forced or a qualifier was provided and val looks numeric
    +		if ( numeric || extra !== undefined ) {
    +			num = parseFloat( val );
    +			return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
    +		}
    +		return val;
    +	},
    +
    +	// A method for quickly swapping in/out CSS properties to get correct calculations
    +	swap: function( elem, options, callback ) {
    +		var ret, name,
    +			old = {};
    +
    +		// Remember the old values, and insert the new ones
    +		for ( name in options ) {
    +			old[ name ] = elem.style[ name ];
    +			elem.style[ name ] = options[ name ];
    +		}
    +
    +		ret = callback.call( elem );
    +
    +		// Revert the old values
    +		for ( name in options ) {
    +			elem.style[ name ] = old[ name ];
    +		}
    +
    +		return ret;
    +	}
    +});
    +
    +// NOTE: To any future maintainer, we've window.getComputedStyle
    +// because jsdom on node.js will break without it.
    +if ( window.getComputedStyle ) {
    +	curCSS = function( elem, name ) {
    +		var ret, width, minWidth, maxWidth,
    +			computed = window.getComputedStyle( elem, null ),
    +			style = elem.style;
    +
    +		if ( computed ) {
    +
    +			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
    +			ret = computed.getPropertyValue( name ) || computed[ name ];
    +
    +			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
    +				ret = jQuery.style( elem, name );
    +			}
    +
    +			// A tribute to the "awesome hack by Dean Edwards"
    +			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
    +			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
    +			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
    +			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
    +				width = style.width;
    +				minWidth = style.minWidth;
    +				maxWidth = style.maxWidth;
    +
    +				style.minWidth = style.maxWidth = style.width = ret;
    +				ret = computed.width;
    +
    +				style.width = width;
    +				style.minWidth = minWidth;
    +				style.maxWidth = maxWidth;
    +			}
    +		}
    +
    +		return ret;
    +	};
    +} else if ( document.documentElement.currentStyle ) {
    +	curCSS = function( elem, name ) {
    +		var left, rsLeft,
    +			ret = elem.currentStyle && elem.currentStyle[ name ],
    +			style = elem.style;
    +
    +		// Avoid setting ret to empty string here
    +		// so we don't default to auto
    +		if ( ret == null && style && style[ name ] ) {
    +			ret = style[ name ];
    +		}
    +
    +		// From the awesome hack by Dean Edwards
    +		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
    +
    +		// If we're not dealing with a regular pixel number
    +		// but a number that has a weird ending, we need to convert it to pixels
    +		// but not position css attributes, as those are proportional to the parent element instead
    +		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
    +		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
    +
    +			// Remember the original values
    +			left = style.left;
    +			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
    +
    +			// Put in the new values to get a computed value out
    +			if ( rsLeft ) {
    +				elem.runtimeStyle.left = elem.currentStyle.left;
    +			}
    +			style.left = name === "fontSize" ? "1em" : ret;
    +			ret = style.pixelLeft + "px";
    +
    +			// Revert the changed values
    +			style.left = left;
    +			if ( rsLeft ) {
    +				elem.runtimeStyle.left = rsLeft;
    +			}
    +		}
    +
    +		return ret === "" ? "auto" : ret;
    +	};
    +}
    +
    +function setPositiveNumber( elem, value, subtract ) {
    +	var matches = rnumsplit.exec( value );
    +	return matches ?
    +			Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
    +			value;
    +}
    +
    +function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
    +	var i = extra === ( isBorderBox ? "border" : "content" ) ?
    +		// If we already have the right measurement, avoid augmentation
    +		4 :
    +		// Otherwise initialize for horizontal or vertical properties
    +		name === "width" ? 1 : 0,
    +
    +		val = 0;
    +
    +	for ( ; i < 4; i += 2 ) {
    +		// both box models exclude margin, so add it if we want it
    +		if ( extra === "margin" ) {
    +			// we use jQuery.css instead of curCSS here
    +			// because of the reliableMarginRight CSS hook!
    +			val += jQuery.css( elem, extra + cssExpand[ i ], true );
    +		}
    +
    +		// From this point on we use curCSS for maximum performance (relevant in animations)
    +		if ( isBorderBox ) {
    +			// border-box includes padding, so remove it if we want content
    +			if ( extra === "content" ) {
    +				val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
    +			}
    +
    +			// at this point, extra isn't border nor margin, so remove border
    +			if ( extra !== "margin" ) {
    +				val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
    +			}
    +		} else {
    +			// at this point, extra isn't content, so add padding
    +			val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
    +
    +			// at this point, extra isn't content nor padding, so add border
    +			if ( extra !== "padding" ) {
    +				val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
    +			}
    +		}
    +	}
    +
    +	return val;
    +}
    +
    +function getWidthOrHeight( elem, name, extra ) {
    +
    +	// Start with offset property, which is equivalent to the border-box value
    +	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
    +		valueIsBorderBox = true,
    +		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
    +
    +	// some non-html elements return undefined for offsetWidth, so check for null/undefined
    +	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
    +	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
    +	if ( val <= 0 || val == null ) {
    +		// Fall back to computed then uncomputed css if necessary
    +		val = curCSS( elem, name );
    +		if ( val < 0 || val == null ) {
    +			val = elem.style[ name ];
    +		}
    +
    +		// Computed unit is not pixels. Stop here and return.
    +		if ( rnumnonpx.test(val) ) {
    +			return val;
    +		}
    +
    +		// we need the check for style in case a browser which returns unreliable values
    +		// for getComputedStyle silently falls back to the reliable elem.style
    +		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
    +
    +		// Normalize "", auto, and prepare for extra
    +		val = parseFloat( val ) || 0;
    +	}
    +
    +	// use the active box-sizing model to add/subtract irrelevant styles
    +	return ( val +
    +		augmentWidthOrHeight(
    +			elem,
    +			name,
    +			extra || ( isBorderBox ? "border" : "content" ),
    +			valueIsBorderBox
    +		)
    +	) + "px";
    +}
    +
    +
    +// Try to determine the default display value of an element
    +function css_defaultDisplay( nodeName ) {
    +	if ( elemdisplay[ nodeName ] ) {
    +		return elemdisplay[ nodeName ];
    +	}
    +
    +	var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
    +		display = elem.css("display");
    +	elem.remove();
    +
    +	// If the simple way fails,
    +	// get element's real default display by attaching it to a temp iframe
    +	if ( display === "none" || display === "" ) {
    +		// Use the already-created iframe if possible
    +		iframe = document.body.appendChild(
    +			iframe || jQuery.extend( document.createElement("iframe"), {
    +				frameBorder: 0,
    +				width: 0,
    +				height: 0
    +			})
    +		);
    +
    +		// Create a cacheable copy of the iframe document on first call.
    +		// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
    +		// document to it; WebKit & Firefox won't allow reusing the iframe document.
    +		if ( !iframeDoc || !iframe.createElement ) {
    +			iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
    +			iframeDoc.write("<!doctype html><html><body>");
    +			iframeDoc.close();
    +		}
    +
    +		elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
    +
    +		display = curCSS( elem, "display" );
    +		document.body.removeChild( iframe );
    +	}
    +
    +	// Store the correct default display
    +	elemdisplay[ nodeName ] = display;
    +
    +	return display;
    +}
    +
    +jQuery.each([ "height", "width" ], function( i, name ) {
    +	jQuery.cssHooks[ name ] = {
    +		get: function( elem, computed, extra ) {
    +			if ( computed ) {
    +				// certain elements can have dimension info if we invisibly show them
    +				// however, it must have a current display style that would benefit from this
    +				if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
    +					return jQuery.swap( elem, cssShow, function() {
    +						return getWidthOrHeight( elem, name, extra );
    +					});
    +				} else {
    +					return getWidthOrHeight( elem, name, extra );
    +				}
    +			}
    +		},
    +
    +		set: function( elem, value, extra ) {
    +			return setPositiveNumber( elem, value, extra ?
    +				augmentWidthOrHeight(
    +					elem,
    +					name,
    +					extra,
    +					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
    +				) : 0
    +			);
    +		}
    +	};
    +});
    +
    +if ( !jQuery.support.opacity ) {
    +	jQuery.cssHooks.opacity = {
    +		get: function( elem, computed ) {
    +			// IE uses filters for opacity
    +			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
    +				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
    +				computed ? "1" : "";
    +		},
    +
    +		set: function( elem, value ) {
    +			var style = elem.style,
    +				currentStyle = elem.currentStyle,
    +				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
    +				filter = currentStyle && currentStyle.filter || style.filter || "";
    +
    +			// IE has trouble with opacity if it does not have layout
    +			// Force it by setting the zoom level
    +			style.zoom = 1;
    +
    +			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
    +			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
    +				style.removeAttribute ) {
    +
    +				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
    +				// if "filter:" is present at all, clearType is disabled, we want to avoid this
    +				// style.removeAttribute is IE Only, but so apparently is this code path...
    +				style.removeAttribute( "filter" );
    +
    +				// if there there is no filter style applied in a css rule, we are done
    +				if ( currentStyle && !currentStyle.filter ) {
    +					return;
    +				}
    +			}
    +
    +			// otherwise, set new filter values
    +			style.filter = ralpha.test( filter ) ?
    +				filter.replace( ralpha, opacity ) :
    +				filter + " " + opacity;
    +		}
    +	};
    +}
    +
    +// These hooks cannot be added until DOM ready because the support test
    +// for it is not run until after DOM ready
    +jQuery(function() {
    +	if ( !jQuery.support.reliableMarginRight ) {
    +		jQuery.cssHooks.marginRight = {
    +			get: function( elem, computed ) {
    +				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
    +				// Work around by temporarily setting element display to inline-block
    +				return jQuery.swap( elem, { "display": "inline-block" }, function() {
    +					if ( computed ) {
    +						return curCSS( elem, "marginRight" );
    +					}
    +				});
    +			}
    +		};
    +	}
    +
    +	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
    +	// getComputedStyle returns percent when specified for top/left/bottom/right
    +	// rather than make the css module depend on the offset module, we just check for it here
    +	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
    +		jQuery.each( [ "top", "left" ], function( i, prop ) {
    +			jQuery.cssHooks[ prop ] = {
    +				get: function( elem, computed ) {
    +					if ( computed ) {
    +						var ret = curCSS( elem, prop );
    +						// if curCSS returns percentage, fallback to offset
    +						return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
    +					}
    +				}
    +			};
    +		});
    +	}
    +
    +});
    +
    +if ( jQuery.expr && jQuery.expr.filters ) {
    +	jQuery.expr.filters.hidden = function( elem ) {
    +		return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
    +	};
    +
    +	jQuery.expr.filters.visible = function( elem ) {
    +		return !jQuery.expr.filters.hidden( elem );
    +	};
    +}
    +
    +// These hooks are used by animate to expand properties
    +jQuery.each({
    +	margin: "",
    +	padding: "",
    +	border: "Width"
    +}, function( prefix, suffix ) {
    +	jQuery.cssHooks[ prefix + suffix ] = {
    +		expand: function( value ) {
    +			var i,
    +
    +				// assumes a single number if not a string
    +				parts = typeof value === "string" ? value.split(" ") : [ value ],
    +				expanded = {};
    +
    +			for ( i = 0; i < 4; i++ ) {
    +				expanded[ prefix + cssExpand[ i ] + suffix ] =
    +					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
    +			}
    +
    +			return expanded;
    +		}
    +	};
    +
    +	if ( !rmargin.test( prefix ) ) {
    +		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
    +	}
    +});
    +var r20 = /%20/g,
    +	rbracket = /\[\]$/,
    +	rCRLF = /\r?\n/g,
    +	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
    +	rselectTextarea = /^(?:select|textarea)/i;
    +
    +jQuery.fn.extend({
    +	serialize: function() {
    +		return jQuery.param( this.serializeArray() );
    +	},
    +	serializeArray: function() {
    +		return this.map(function(){
    +			return this.elements ? jQuery.makeArray( this.elements ) : this;
    +		})
    +		.filter(function(){
    +			return this.name && !this.disabled &&
    +				( this.checked || rselectTextarea.test( this.nodeName ) ||
    +					rinput.test( this.type ) );
    +		})
    +		.map(function( i, elem ){
    +			var val = jQuery( this ).val();
    +
    +			return val == null ?
    +				null :
    +				jQuery.isArray( val ) ?
    +					jQuery.map( val, function( val, i ){
    +						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
    +					}) :
    +					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
    +		}).get();
    +	}
    +});
    +
    +//Serialize an array of form elements or a set of
    +//key/values into a query string
    +jQuery.param = function( a, traditional ) {
    +	var prefix,
    +		s = [],
    +		add = function( key, value ) {
    +			// If value is a function, invoke it and return its value
    +			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
    +			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
    +		};
    +
    +	// Set traditional to true for jQuery <= 1.3.2 behavior.
    +	if ( traditional === undefined ) {
    +		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
    +	}
    +
    +	// If an array was passed in, assume that it is an array of form elements.
    +	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
    +		// Serialize the form elements
    +		jQuery.each( a, function() {
    +			add( this.name, this.value );
    +		});
    +
    +	} else {
    +		// If traditional, encode the "old" way (the way 1.3.2 or older
    +		// did it), otherwise encode params recursively.
    +		for ( prefix in a ) {
    +			buildParams( prefix, a[ prefix ], traditional, add );
    +		}
    +	}
    +
    +	// Return the resulting serialization
    +	return s.join( "&" ).replace( r20, "+" );
    +};
    +
    +function buildParams( prefix, obj, traditional, add ) {
    +	var name;
    +
    +	if ( jQuery.isArray( obj ) ) {
    +		// Serialize array item.
    +		jQuery.each( obj, function( i, v ) {
    +			if ( traditional || rbracket.test( prefix ) ) {
    +				// Treat each array item as a scalar.
    +				add( prefix, v );
    +
    +			} else {
    +				// If array item is non-scalar (array or object), encode its
    +				// numeric index to resolve deserialization ambiguity issues.
    +				// Note that rack (as of 1.0.0) can't currently deserialize
    +				// nested arrays properly, and attempting to do so may cause
    +				// a server error. Possible fixes are to modify rack's
    +				// deserialization algorithm or to provide an option or flag
    +				// to force array serialization to be shallow.
    +				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
    +			}
    +		});
    +
    +	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
    +		// Serialize object item.
    +		for ( name in obj ) {
    +			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
    +		}
    +
    +	} else {
    +		// Serialize scalar item.
    +		add( prefix, obj );
    +	}
    +}
    +var
    +	// Document location
    +	ajaxLocParts,
    +	ajaxLocation,
    +
    +	rhash = /#.*$/,
    +	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
    +	// #7653, #8125, #8152: local protocol detection
    +	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
    +	rnoContent = /^(?:GET|HEAD)$/,
    +	rprotocol = /^\/\//,
    +	rquery = /\?/,
    +	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
    +	rts = /([?&])_=[^&]*/,
    +	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
    +
    +	// Keep a copy of the old load method
    +	_load = jQuery.fn.load,
    +
    +	/* Prefilters
    +	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
    +	 * 2) These are called:
    +	 *    - BEFORE asking for a transport
    +	 *    - AFTER param serialization (s.data is a string if s.processData is true)
    +	 * 3) key is the dataType
    +	 * 4) the catchall symbol "*" can be used
    +	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
    +	 */
    +	prefilters = {},
    +
    +	/* Transports bindings
    +	 * 1) key is the dataType
    +	 * 2) the catchall symbol "*" can be used
    +	 * 3) selection will start with transport dataType and THEN go to "*" if needed
    +	 */
    +	transports = {},
    +
    +	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
    +	allTypes = ["*/"] + ["*"];
    +
    +// #8138, IE may throw an exception when accessing
    +// a field from window.location if document.domain has been set
    +try {
    +	ajaxLocation = location.href;
    +} catch( e ) {
    +	// Use the href attribute of an A element
    +	// since IE will modify it given document.location
    +	ajaxLocation = document.createElement( "a" );
    +	ajaxLocation.href = "";
    +	ajaxLocation = ajaxLocation.href;
    +}
    +
    +// Segment location into parts
    +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
    +
    +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
    +function addToPrefiltersOrTransports( structure ) {
    +
    +	// dataTypeExpression is optional and defaults to "*"
    +	return function( dataTypeExpression, func ) {
    +
    +		if ( typeof dataTypeExpression !== "string" ) {
    +			func = dataTypeExpression;
    +			dataTypeExpression = "*";
    +		}
    +
    +		var dataType, list, placeBefore,
    +			dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
    +			i = 0,
    +			length = dataTypes.length;
    +
    +		if ( jQuery.isFunction( func ) ) {
    +			// For each dataType in the dataTypeExpression
    +			for ( ; i < length; i++ ) {
    +				dataType = dataTypes[ i ];
    +				// We control if we're asked to add before
    +				// any existing element
    +				placeBefore = /^\+/.test( dataType );
    +				if ( placeBefore ) {
    +					dataType = dataType.substr( 1 ) || "*";
    +				}
    +				list = structure[ dataType ] = structure[ dataType ] || [];
    +				// then we add to the structure accordingly
    +				list[ placeBefore ? "unshift" : "push" ]( func );
    +			}
    +		}
    +	};
    +}
    +
    +// Base inspection function for prefilters and transports
    +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
    +		dataType /* internal */, inspected /* internal */ ) {
    +
    +	dataType = dataType || options.dataTypes[ 0 ];
    +	inspected = inspected || {};
    +
    +	inspected[ dataType ] = true;
    +
    +	var selection,
    +		list = structure[ dataType ],
    +		i = 0,
    +		length = list ? list.length : 0,
    +		executeOnly = ( structure === prefilters );
    +
    +	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
    +		selection = list[ i ]( options, originalOptions, jqXHR );
    +		// If we got redirected to another dataType
    +		// we try there if executing only and not done already
    +		if ( typeof selection === "string" ) {
    +			if ( !executeOnly || inspected[ selection ] ) {
    +				selection = undefined;
    +			} else {
    +				options.dataTypes.unshift( selection );
    +				selection = inspectPrefiltersOrTransports(
    +						structure, options, originalOptions, jqXHR, selection, inspected );
    +			}
    +		}
    +	}
    +	// If we're only executing or nothing was selected
    +	// we try the catchall dataType if not done already
    +	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
    +		selection = inspectPrefiltersOrTransports(
    +				structure, options, originalOptions, jqXHR, "*", inspected );
    +	}
    +	// unnecessary when only executing (prefilters)
    +	// but it'll be ignored by the caller in that case
    +	return selection;
    +}
    +
    +// A special extend for ajax options
    +// that takes "flat" options (not to be deep extended)
    +// Fixes #9887
    +function ajaxExtend( target, src ) {
    +	var key, deep,
    +		flatOptions = jQuery.ajaxSettings.flatOptions || {};
    +	for ( key in src ) {
    +		if ( src[ key ] !== undefined ) {
    +			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
    +		}
    +	}
    +	if ( deep ) {
    +		jQuery.extend( true, target, deep );
    +	}
    +}
    +
    +jQuery.fn.load = function( url, params, callback ) {
    +	if ( typeof url !== "string" && _load ) {
    +		return _load.apply( this, arguments );
    +	}
    +
    +	// Don't do a request if no elements are being requested
    +	if ( !this.length ) {
    +		return this;
    +	}
    +
    +	var selector, type, response,
    +		self = this,
    +		off = url.indexOf(" ");
    +
    +	if ( off >= 0 ) {
    +		selector = url.slice( off, url.length );
    +		url = url.slice( 0, off );
    +	}
    +
    +	// If it's a function
    +	if ( jQuery.isFunction( params ) ) {
    +
    +		// We assume that it's the callback
    +		callback = params;
    +		params = undefined;
    +
    +	// Otherwise, build a param string
    +	} else if ( params && typeof params === "object" ) {
    +		type = "POST";
    +	}
    +
    +	// Request the remote document
    +	jQuery.ajax({
    +		url: url,
    +
    +		// if "type" variable is undefined, then "GET" method will be used
    +		type: type,
    +		dataType: "html",
    +		data: params,
    +		complete: function( jqXHR, status ) {
    +			if ( callback ) {
    +				self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
    +			}
    +		}
    +	}).done(function( responseText ) {
    +
    +		// Save response for use in complete callback
    +		response = arguments;
    +
    +		// See if a selector was specified
    +		self.html( selector ?
    +
    +			// Create a dummy div to hold the results
    +			jQuery("<div>")
    +
    +				// inject the contents of the document in, removing the scripts
    +				// to avoid any 'Permission Denied' errors in IE
    +				.append( responseText.replace( rscript, "" ) )
    +
    +				// Locate the specified elements
    +				.find( selector ) :
    +
    +			// If not, just inject the full result
    +			responseText );
    +
    +	});
    +
    +	return this;
    +};
    +
    +// Attach a bunch of functions for handling common AJAX events
    +jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
    +	jQuery.fn[ o ] = function( f ){
    +		return this.on( o, f );
    +	};
    +});
    +
    +jQuery.each( [ "get", "post" ], function( i, method ) {
    +	jQuery[ method ] = function( url, data, callback, type ) {
    +		// shift arguments if data argument was omitted
    +		if ( jQuery.isFunction( data ) ) {
    +			type = type || callback;
    +			callback = data;
    +			data = undefined;
    +		}
    +
    +		return jQuery.ajax({
    +			type: method,
    +			url: url,
    +			data: data,
    +			success: callback,
    +			dataType: type
    +		});
    +	};
    +});
    +
    +jQuery.extend({
    +
    +	getScript: function( url, callback ) {
    +		return jQuery.get( url, undefined, callback, "script" );
    +	},
    +
    +	getJSON: function( url, data, callback ) {
    +		return jQuery.get( url, data, callback, "json" );
    +	},
    +
    +	// Creates a full fledged settings object into target
    +	// with both ajaxSettings and settings fields.
    +	// If target is omitted, writes into ajaxSettings.
    +	ajaxSetup: function( target, settings ) {
    +		if ( settings ) {
    +			// Building a settings object
    +			ajaxExtend( target, jQuery.ajaxSettings );
    +		} else {
    +			// Extending ajaxSettings
    +			settings = target;
    +			target = jQuery.ajaxSettings;
    +		}
    +		ajaxExtend( target, settings );
    +		return target;
    +	},
    +
    +	ajaxSettings: {
    +		url: ajaxLocation,
    +		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
    +		global: true,
    +		type: "GET",
    +		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
    +		processData: true,
    +		async: true,
    +		/*
    +		timeout: 0,
    +		data: null,
    +		dataType: null,
    +		username: null,
    +		password: null,
    +		cache: null,
    +		throws: false,
    +		traditional: false,
    +		headers: {},
    +		*/
    +
    +		accepts: {
    +			xml: "application/xml, text/xml",
    +			html: "text/html",
    +			text: "text/plain",
    +			json: "application/json, text/javascript",
    +			"*": allTypes
    +		},
    +
    +		contents: {
    +			xml: /xml/,
    +			html: /html/,
    +			json: /json/
    +		},
    +
    +		responseFields: {
    +			xml: "responseXML",
    +			text: "responseText"
    +		},
    +
    +		// List of data converters
    +		// 1) key format is "source_type destination_type" (a single space in-between)
    +		// 2) the catchall symbol "*" can be used for source_type
    +		converters: {
    +
    +			// Convert anything to text
    +			"* text": window.String,
    +
    +			// Text to html (true = no transformation)
    +			"text html": true,
    +
    +			// Evaluate text as a json expression
    +			"text json": jQuery.parseJSON,
    +
    +			// Parse text as xml
    +			"text xml": jQuery.parseXML
    +		},
    +
    +		// For options that shouldn't be deep extended:
    +		// you can add your own custom options here if
    +		// and when you create one that shouldn't be
    +		// deep extended (see ajaxExtend)
    +		flatOptions: {
    +			context: true,
    +			url: true
    +		}
    +	},
    +
    +	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
    +	ajaxTransport: addToPrefiltersOrTransports( transports ),
    +
    +	// Main method
    +	ajax: function( url, options ) {
    +
    +		// If url is an object, simulate pre-1.5 signature
    +		if ( typeof url === "object" ) {
    +			options = url;
    +			url = undefined;
    +		}
    +
    +		// Force options to be an object
    +		options = options || {};
    +
    +		var // ifModified key
    +			ifModifiedKey,
    +			// Response headers
    +			responseHeadersString,
    +			responseHeaders,
    +			// transport
    +			transport,
    +			// timeout handle
    +			timeoutTimer,
    +			// Cross-domain detection vars
    +			parts,
    +			// To know if global events are to be dispatched
    +			fireGlobals,
    +			// Loop variable
    +			i,
    +			// Create the final options object
    +			s = jQuery.ajaxSetup( {}, options ),
    +			// Callbacks context
    +			callbackContext = s.context || s,
    +			// Context for global events
    +			// It's the callbackContext if one was provided in the options
    +			// and if it's a DOM node or a jQuery collection
    +			globalEventContext = callbackContext !== s &&
    +				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
    +						jQuery( callbackContext ) : jQuery.event,
    +			// Deferreds
    +			deferred = jQuery.Deferred(),
    +			completeDeferred = jQuery.Callbacks( "once memory" ),
    +			// Status-dependent callbacks
    +			statusCode = s.statusCode || {},
    +			// Headers (they are sent all at once)
    +			requestHeaders = {},
    +			requestHeadersNames = {},
    +			// The jqXHR state
    +			state = 0,
    +			// Default abort message
    +			strAbort = "canceled",
    +			// Fake xhr
    +			jqXHR = {
    +
    +				readyState: 0,
    +
    +				// Caches the header
    +				setRequestHeader: function( name, value ) {
    +					if ( !state ) {
    +						var lname = name.toLowerCase();
    +						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
    +						requestHeaders[ name ] = value;
    +					}
    +					return this;
    +				},
    +
    +				// Raw string
    +				getAllResponseHeaders: function() {
    +					return state === 2 ? responseHeadersString : null;
    +				},
    +
    +				// Builds headers hashtable if needed
    +				getResponseHeader: function( key ) {
    +					var match;
    +					if ( state === 2 ) {
    +						if ( !responseHeaders ) {
    +							responseHeaders = {};
    +							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
    +								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
    +							}
    +						}
    +						match = responseHeaders[ key.toLowerCase() ];
    +					}
    +					return match === undefined ? null : match;
    +				},
    +
    +				// Overrides response content-type header
    +				overrideMimeType: function( type ) {
    +					if ( !state ) {
    +						s.mimeType = type;
    +					}
    +					return this;
    +				},
    +
    +				// Cancel the request
    +				abort: function( statusText ) {
    +					statusText = statusText || strAbort;
    +					if ( transport ) {
    +						transport.abort( statusText );
    +					}
    +					done( 0, statusText );
    +					return this;
    +				}
    +			};
    +
    +		// Callback for when everything is done
    +		// It is defined here because jslint complains if it is declared
    +		// at the end of the function (which would be more logical and readable)
    +		function done( status, nativeStatusText, responses, headers ) {
    +			var isSuccess, success, error, response, modified,
    +				statusText = nativeStatusText;
    +
    +			// Called once
    +			if ( state === 2 ) {
    +				return;
    +			}
    +
    +			// State is "done" now
    +			state = 2;
    +
    +			// Clear timeout if it exists
    +			if ( timeoutTimer ) {
    +				clearTimeout( timeoutTimer );
    +			}
    +
    +			// Dereference transport for early garbage collection
    +			// (no matter how long the jqXHR object will be used)
    +			transport = undefined;
    +
    +			// Cache response headers
    +			responseHeadersString = headers || "";
    +
    +			// Set readyState
    +			jqXHR.readyState = status > 0 ? 4 : 0;
    +
    +			// Get response data
    +			if ( responses ) {
    +				response = ajaxHandleResponses( s, jqXHR, responses );
    +			}
    +
    +			// If successful, handle type chaining
    +			if ( status >= 200 && status < 300 || status === 304 ) {
    +
    +				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
    +				if ( s.ifModified ) {
    +
    +					modified = jqXHR.getResponseHeader("Last-Modified");
    +					if ( modified ) {
    +						jQuery.lastModified[ ifModifiedKey ] = modified;
    +					}
    +					modified = jqXHR.getResponseHeader("Etag");
    +					if ( modified ) {
    +						jQuery.etag[ ifModifiedKey ] = modified;
    +					}
    +				}
    +
    +				// If not modified
    +				if ( status === 304 ) {
    +
    +					statusText = "notmodified";
    +					isSuccess = true;
    +
    +				// If we have data
    +				} else {
    +
    +					isSuccess = ajaxConvert( s, response );
    +					statusText = isSuccess.state;
    +					success = isSuccess.data;
    +					error = isSuccess.error;
    +					isSuccess = !error;
    +				}
    +			} else {
    +				// We extract error from statusText
    +				// then normalize statusText and status for non-aborts
    +				error = statusText;
    +				if ( !statusText || status ) {
    +					statusText = "error";
    +					if ( status < 0 ) {
    +						status = 0;
    +					}
    +				}
    +			}
    +
    +			// Set data for the fake xhr object
    +			jqXHR.status = status;
    +			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
    +
    +			// Success/Error
    +			if ( isSuccess ) {
    +				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
    +			} else {
    +				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
    +			}
    +
    +			// Status-dependent callbacks
    +			jqXHR.statusCode( statusCode );
    +			statusCode = undefined;
    +
    +			if ( fireGlobals ) {
    +				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
    +						[ jqXHR, s, isSuccess ? success : error ] );
    +			}
    +
    +			// Complete
    +			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
    +
    +			if ( fireGlobals ) {
    +				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
    +				// Handle the global AJAX counter
    +				if ( !( --jQuery.active ) ) {
    +					jQuery.event.trigger( "ajaxStop" );
    +				}
    +			}
    +		}
    +
    +		// Attach deferreds
    +		deferred.promise( jqXHR );
    +		jqXHR.success = jqXHR.done;
    +		jqXHR.error = jqXHR.fail;
    +		jqXHR.complete = completeDeferred.add;
    +
    +		// Status-dependent callbacks
    +		jqXHR.statusCode = function( map ) {
    +			if ( map ) {
    +				var tmp;
    +				if ( state < 2 ) {
    +					for ( tmp in map ) {
    +						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
    +					}
    +				} else {
    +					tmp = map[ jqXHR.status ];
    +					jqXHR.always( tmp );
    +				}
    +			}
    +			return this;
    +		};
    +
    +		// Remove hash character (#7531: and string promotion)
    +		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
    +		// We also use the url parameter if available
    +		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
    +
    +		// Extract dataTypes list
    +		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
    +
    +		// A cross-domain request is in order when we have a protocol:host:port mismatch
    +		if ( s.crossDomain == null ) {
    +			parts = rurl.exec( s.url.toLowerCase() );
    +			s.crossDomain = !!( parts &&
    +				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
    +					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
    +						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
    +			);
    +		}
    +
    +		// Convert data if not already a string
    +		if ( s.data && s.processData && typeof s.data !== "string" ) {
    +			s.data = jQuery.param( s.data, s.traditional );
    +		}
    +
    +		// Apply prefilters
    +		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
    +
    +		// If request was aborted inside a prefilter, stop there
    +		if ( state === 2 ) {
    +			return jqXHR;
    +		}
    +
    +		// We can fire global events as of now if asked to
    +		fireGlobals = s.global;
    +
    +		// Uppercase the type
    +		s.type = s.type.toUpperCase();
    +
    +		// Determine if request has content
    +		s.hasContent = !rnoContent.test( s.type );
    +
    +		// Watch for a new set of requests
    +		if ( fireGlobals && jQuery.active++ === 0 ) {
    +			jQuery.event.trigger( "ajaxStart" );
    +		}
    +
    +		// More options handling for requests with no content
    +		if ( !s.hasContent ) {
    +
    +			// If data is available, append data to url
    +			if ( s.data ) {
    +				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
    +				// #9682: remove data so that it's not used in an eventual retry
    +				delete s.data;
    +			}
    +
    +			// Get ifModifiedKey before adding the anti-cache parameter
    +			ifModifiedKey = s.url;
    +
    +			// Add anti-cache in url if needed
    +			if ( s.cache === false ) {
    +
    +				var ts = jQuery.now(),
    +					// try replacing _= if it is there
    +					ret = s.url.replace( rts, "$1_=" + ts );
    +
    +				// if nothing was replaced, add timestamp to the end
    +				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
    +			}
    +		}
    +
    +		// Set the correct header, if data is being sent
    +		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
    +			jqXHR.setRequestHeader( "Content-Type", s.contentType );
    +		}
    +
    +		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
    +		if ( s.ifModified ) {
    +			ifModifiedKey = ifModifiedKey || s.url;
    +			if ( jQuery.lastModified[ ifModifiedKey ] ) {
    +				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
    +			}
    +			if ( jQuery.etag[ ifModifiedKey ] ) {
    +				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
    +			}
    +		}
    +
    +		// Set the Accepts header for the server, depending on the dataType
    +		jqXHR.setRequestHeader(
    +			"Accept",
    +			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
    +				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
    +				s.accepts[ "*" ]
    +		);
    +
    +		// Check for headers option
    +		for ( i in s.headers ) {
    +			jqXHR.setRequestHeader( i, s.headers[ i ] );
    +		}
    +
    +		// Allow custom headers/mimetypes and early abort
    +		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
    +				// Abort if not done already and return
    +				return jqXHR.abort();
    +
    +		}
    +
    +		// aborting is no longer a cancellation
    +		strAbort = "abort";
    +
    +		// Install callbacks on deferreds
    +		for ( i in { success: 1, error: 1, complete: 1 } ) {
    +			jqXHR[ i ]( s[ i ] );
    +		}
    +
    +		// Get transport
    +		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
    +
    +		// If no transport, we auto-abort
    +		if ( !transport ) {
    +			done( -1, "No Transport" );
    +		} else {
    +			jqXHR.readyState = 1;
    +			// Send global event
    +			if ( fireGlobals ) {
    +				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
    +			}
    +			// Timeout
    +			if ( s.async && s.timeout > 0 ) {
    +				timeoutTimer = setTimeout( function(){
    +					jqXHR.abort( "timeout" );
    +				}, s.timeout );
    +			}
    +
    +			try {
    +				state = 1;
    +				transport.send( requestHeaders, done );
    +			} catch (e) {
    +				// Propagate exception as error if not done
    +				if ( state < 2 ) {
    +					done( -1, e );
    +				// Simply rethrow otherwise
    +				} else {
    +					throw e;
    +				}
    +			}
    +		}
    +
    +		return jqXHR;
    +	},
    +
    +	// Counter for holding the number of active queries
    +	active: 0,
    +
    +	// Last-Modified header cache for next request
    +	lastModified: {},
    +	etag: {}
    +
    +});
    +
    +/* Handles responses to an ajax request:
    + * - sets all responseXXX fields accordingly
    + * - finds the right dataType (mediates between content-type and expected dataType)
    + * - returns the corresponding response
    + */
    +function ajaxHandleResponses( s, jqXHR, responses ) {
    +
    +	var ct, type, finalDataType, firstDataType,
    +		contents = s.contents,
    +		dataTypes = s.dataTypes,
    +		responseFields = s.responseFields;
    +
    +	// Fill responseXXX fields
    +	for ( type in responseFields ) {
    +		if ( type in responses ) {
    +			jqXHR[ responseFields[type] ] = responses[ type ];
    +		}
    +	}
    +
    +	// Remove auto dataType and get content-type in the process
    +	while( dataTypes[ 0 ] === "*" ) {
    +		dataTypes.shift();
    +		if ( ct === undefined ) {
    +			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
    +		}
    +	}
    +
    +	// Check if we're dealing with a known content-type
    +	if ( ct ) {
    +		for ( type in contents ) {
    +			if ( contents[ type ] && contents[ type ].test( ct ) ) {
    +				dataTypes.unshift( type );
    +				break;
    +			}
    +		}
    +	}
    +
    +	// Check to see if we have a response for the expected dataType
    +	if ( dataTypes[ 0 ] in responses ) {
    +		finalDataType = dataTypes[ 0 ];
    +	} else {
    +		// Try convertible dataTypes
    +		for ( type in responses ) {
    +			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
    +				finalDataType = type;
    +				break;
    +			}
    +			if ( !firstDataType ) {
    +				firstDataType = type;
    +			}
    +		}
    +		// Or just use first one
    +		finalDataType = finalDataType || firstDataType;
    +	}
    +
    +	// If we found a dataType
    +	// We add the dataType to the list if needed
    +	// and return the corresponding response
    +	if ( finalDataType ) {
    +		if ( finalDataType !== dataTypes[ 0 ] ) {
    +			dataTypes.unshift( finalDataType );
    +		}
    +		return responses[ finalDataType ];
    +	}
    +}
    +
    +// Chain conversions given the request and the original response
    +function ajaxConvert( s, response ) {
    +
    +	var conv, conv2, current, tmp,
    +		// Work with a copy of dataTypes in case we need to modify it for conversion
    +		dataTypes = s.dataTypes.slice(),
    +		prev = dataTypes[ 0 ],
    +		converters = {},
    +		i = 0;
    +
    +	// Apply the dataFilter if provided
    +	if ( s.dataFilter ) {
    +		response = s.dataFilter( response, s.dataType );
    +	}
    +
    +	// Create converters map with lowercased keys
    +	if ( dataTypes[ 1 ] ) {
    +		for ( conv in s.converters ) {
    +			converters[ conv.toLowerCase() ] = s.converters[ conv ];
    +		}
    +	}
    +
    +	// Convert to each sequential dataType, tolerating list modification
    +	for ( ; (current = dataTypes[++i]); ) {
    +
    +		// There's only work to do if current dataType is non-auto
    +		if ( current !== "*" ) {
    +
    +			// Convert response if prev dataType is non-auto and differs from current
    +			if ( prev !== "*" && prev !== current ) {
    +
    +				// Seek a direct converter
    +				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
    +
    +				// If none found, seek a pair
    +				if ( !conv ) {
    +					for ( conv2 in converters ) {
    +
    +						// If conv2 outputs current
    +						tmp = conv2.split(" ");
    +						if ( tmp[ 1 ] === current ) {
    +
    +							// If prev can be converted to accepted input
    +							conv = converters[ prev + " " + tmp[ 0 ] ] ||
    +								converters[ "* " + tmp[ 0 ] ];
    +							if ( conv ) {
    +								// Condense equivalence converters
    +								if ( conv === true ) {
    +									conv = converters[ conv2 ];
    +
    +								// Otherwise, insert the intermediate dataType
    +								} else if ( converters[ conv2 ] !== true ) {
    +									current = tmp[ 0 ];
    +									dataTypes.splice( i--, 0, current );
    +								}
    +
    +								break;
    +							}
    +						}
    +					}
    +				}
    +
    +				// Apply converter (if not an equivalence)
    +				if ( conv !== true ) {
    +
    +					// Unless errors are allowed to bubble, catch and return them
    +					if ( conv && s["throws"] ) {
    +						response = conv( response );
    +					} else {
    +						try {
    +							response = conv( response );
    +						} catch ( e ) {
    +							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
    +						}
    +					}
    +				}
    +			}
    +
    +			// Update prev for next iteration
    +			prev = current;
    +		}
    +	}
    +
    +	return { state: "success", data: response };
    +}
    +var oldCallbacks = [],
    +	rquestion = /\?/,
    +	rjsonp = /(=)\?(?=&|$)|\?\?/,
    +	nonce = jQuery.now();
    +
    +// Default jsonp settings
    +jQuery.ajaxSetup({
    +	jsonp: "callback",
    +	jsonpCallback: function() {
    +		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
    +		this[ callback ] = true;
    +		return callback;
    +	}
    +});
    +
    +// Detect, normalize options and install callbacks for jsonp requests
    +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
    +
    +	var callbackName, overwritten, responseContainer,
    +		data = s.data,
    +		url = s.url,
    +		hasCallback = s.jsonp !== false,
    +		replaceInUrl = hasCallback && rjsonp.test( url ),
    +		replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
    +			!( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
    +			rjsonp.test( data );
    +
    +	// Handle iff the expected data type is "jsonp" or we have a parameter to set
    +	if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
    +
    +		// Get callback name, remembering preexisting value associated with it
    +		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
    +			s.jsonpCallback() :
    +			s.jsonpCallback;
    +		overwritten = window[ callbackName ];
    +
    +		// Insert callback into url or form data
    +		if ( replaceInUrl ) {
    +			s.url = url.replace( rjsonp, "$1" + callbackName );
    +		} else if ( replaceInData ) {
    +			s.data = data.replace( rjsonp, "$1" + callbackName );
    +		} else if ( hasCallback ) {
    +			s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
    +		}
    +
    +		// Use data converter to retrieve json after script execution
    +		s.converters["script json"] = function() {
    +			if ( !responseContainer ) {
    +				jQuery.error( callbackName + " was not called" );
    +			}
    +			return responseContainer[ 0 ];
    +		};
    +
    +		// force json dataType
    +		s.dataTypes[ 0 ] = "json";
    +
    +		// Install callback
    +		window[ callbackName ] = function() {
    +			responseContainer = arguments;
    +		};
    +
    +		// Clean-up function (fires after converters)
    +		jqXHR.always(function() {
    +			// Restore preexisting value
    +			window[ callbackName ] = overwritten;
    +
    +			// Save back as free
    +			if ( s[ callbackName ] ) {
    +				// make sure that re-using the options doesn't screw things around
    +				s.jsonpCallback = originalSettings.jsonpCallback;
    +
    +				// save the callback name for future use
    +				oldCallbacks.push( callbackName );
    +			}
    +
    +			// Call if it was a function and we have a response
    +			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
    +				overwritten( responseContainer[ 0 ] );
    +			}
    +
    +			responseContainer = overwritten = undefined;
    +		});
    +
    +		// Delegate to script
    +		return "script";
    +	}
    +});
    +// Install script dataType
    +jQuery.ajaxSetup({
    +	accepts: {
    +		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
    +	},
    +	contents: {
    +		script: /javascript|ecmascript/
    +	},
    +	converters: {
    +		"text script": function( text ) {
    +			jQuery.globalEval( text );
    +			return text;
    +		}
    +	}
    +});
    +
    +// Handle cache's special case and global
    +jQuery.ajaxPrefilter( "script", function( s ) {
    +	if ( s.cache === undefined ) {
    +		s.cache = false;
    +	}
    +	if ( s.crossDomain ) {
    +		s.type = "GET";
    +		s.global = false;
    +	}
    +});
    +
    +// Bind script tag hack transport
    +jQuery.ajaxTransport( "script", function(s) {
    +
    +	// This transport only deals with cross domain requests
    +	if ( s.crossDomain ) {
    +
    +		var script,
    +			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
    +
    +		return {
    +
    +			send: function( _, callback ) {
    +
    +				script = document.createElement( "script" );
    +
    +				script.async = "async";
    +
    +				if ( s.scriptCharset ) {
    +					script.charset = s.scriptCharset;
    +				}
    +
    +				script.src = s.url;
    +
    +				// Attach handlers for all browsers
    +				script.onload = script.onreadystatechange = function( _, isAbort ) {
    +
    +					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
    +
    +						// Handle memory leak in IE
    +						script.onload = script.onreadystatechange = null;
    +
    +						// Remove the script
    +						if ( head && script.parentNode ) {
    +							head.removeChild( script );
    +						}
    +
    +						// Dereference the script
    +						script = undefined;
    +
    +						// Callback if not abort
    +						if ( !isAbort ) {
    +							callback( 200, "success" );
    +						}
    +					}
    +				};
    +				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
    +				// This arises when a base node is used (#2709 and #4378).
    +				head.insertBefore( script, head.firstChild );
    +			},
    +
    +			abort: function() {
    +				if ( script ) {
    +					script.onload( 0, 1 );
    +				}
    +			}
    +		};
    +	}
    +});
    +var xhrCallbacks,
    +	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
    +	xhrOnUnloadAbort = window.ActiveXObject ? function() {
    +		// Abort all pending requests
    +		for ( var key in xhrCallbacks ) {
    +			xhrCallbacks[ key ]( 0, 1 );
    +		}
    +	} : false,
    +	xhrId = 0;
    +
    +// Functions to create xhrs
    +function createStandardXHR() {
    +	try {
    +		return new window.XMLHttpRequest();
    +	} catch( e ) {}
    +}
    +
    +function createActiveXHR() {
    +	try {
    +		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
    +	} catch( e ) {}
    +}
    +
    +// Create the request object
    +// (This is still attached to ajaxSettings for backward compatibility)
    +jQuery.ajaxSettings.xhr = window.ActiveXObject ?
    +	/* Microsoft failed to properly
    +	 * implement the XMLHttpRequest in IE7 (can't request local files),
    +	 * so we use the ActiveXObject when it is available
    +	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
    +	 * we need a fallback.
    +	 */
    +	function() {
    +		return !this.isLocal && createStandardXHR() || createActiveXHR();
    +	} :
    +	// For all other browsers, use the standard XMLHttpRequest object
    +	createStandardXHR;
    +
    +// Determine support properties
    +(function( xhr ) {
    +	jQuery.extend( jQuery.support, {
    +		ajax: !!xhr,
    +		cors: !!xhr && ( "withCredentials" in xhr )
    +	});
    +})( jQuery.ajaxSettings.xhr() );
    +
    +// Create transport if the browser can provide an xhr
    +if ( jQuery.support.ajax ) {
    +
    +	jQuery.ajaxTransport(function( s ) {
    +		// Cross domain only allowed if supported through XMLHttpRequest
    +		if ( !s.crossDomain || jQuery.support.cors ) {
    +
    +			var callback;
    +
    +			return {
    +				send: function( headers, complete ) {
    +
    +					// Get a new xhr
    +					var handle, i,
    +						xhr = s.xhr();
    +
    +					// Open the socket
    +					// Passing null username, generates a login popup on Opera (#2865)
    +					if ( s.username ) {
    +						xhr.open( s.type, s.url, s.async, s.username, s.password );
    +					} else {
    +						xhr.open( s.type, s.url, s.async );
    +					}
    +
    +					// Apply custom fields if provided
    +					if ( s.xhrFields ) {
    +						for ( i in s.xhrFields ) {
    +							xhr[ i ] = s.xhrFields[ i ];
    +						}
    +					}
    +
    +					// Override mime type if needed
    +					if ( s.mimeType && xhr.overrideMimeType ) {
    +						xhr.overrideMimeType( s.mimeType );
    +					}
    +
    +					// X-Requested-With header
    +					// For cross-domain requests, seeing as conditions for a preflight are
    +					// akin to a jigsaw puzzle, we simply never set it to be sure.
    +					// (it can always be set on a per-request basis or even using ajaxSetup)
    +					// For same-domain requests, won't change header if already provided.
    +					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
    +						headers[ "X-Requested-With" ] = "XMLHttpRequest";
    +					}
    +
    +					// Need an extra try/catch for cross domain requests in Firefox 3
    +					try {
    +						for ( i in headers ) {
    +							xhr.setRequestHeader( i, headers[ i ] );
    +						}
    +					} catch( _ ) {}
    +
    +					// Do send the request
    +					// This may raise an exception which is actually
    +					// handled in jQuery.ajax (so no try/catch here)
    +					xhr.send( ( s.hasContent && s.data ) || null );
    +
    +					// Listener
    +					callback = function( _, isAbort ) {
    +
    +						var status,
    +							statusText,
    +							responseHeaders,
    +							responses,
    +							xml;
    +
    +						// Firefox throws exceptions when accessing properties
    +						// of an xhr when a network error occurred
    +						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
    +						try {
    +
    +							// Was never called and is aborted or complete
    +							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
    +
    +								// Only called once
    +								callback = undefined;
    +
    +								// Do not keep as active anymore
    +								if ( handle ) {
    +									xhr.onreadystatechange = jQuery.noop;
    +									if ( xhrOnUnloadAbort ) {
    +										delete xhrCallbacks[ handle ];
    +									}
    +								}
    +
    +								// If it's an abort
    +								if ( isAbort ) {
    +									// Abort it manually if needed
    +									if ( xhr.readyState !== 4 ) {
    +										xhr.abort();
    +									}
    +								} else {
    +									status = xhr.status;
    +									responseHeaders = xhr.getAllResponseHeaders();
    +									responses = {};
    +									xml = xhr.responseXML;
    +
    +									// Construct response list
    +									if ( xml && xml.documentElement /* #4958 */ ) {
    +										responses.xml = xml;
    +									}
    +
    +									// When requesting binary data, IE6-9 will throw an exception
    +									// on any attempt to access responseText (#11426)
    +									try {
    +										responses.text = xhr.responseText;
    +									} catch( e ) {
    +									}
    +
    +									// Firefox throws an exception when accessing
    +									// statusText for faulty cross-domain requests
    +									try {
    +										statusText = xhr.statusText;
    +									} catch( e ) {
    +										// We normalize with Webkit giving an empty statusText
    +										statusText = "";
    +									}
    +
    +									// Filter status for non standard behaviors
    +
    +									// If the request is local and we have data: assume a success
    +									// (success with no data won't get notified, that's the best we
    +									// can do given current implementations)
    +									if ( !status && s.isLocal && !s.crossDomain ) {
    +										status = responses.text ? 200 : 404;
    +									// IE - #1450: sometimes returns 1223 when it should be 204
    +									} else if ( status === 1223 ) {
    +										status = 204;
    +									}
    +								}
    +							}
    +						} catch( firefoxAccessException ) {
    +							if ( !isAbort ) {
    +								complete( -1, firefoxAccessException );
    +							}
    +						}
    +
    +						// Call complete if needed
    +						if ( responses ) {
    +							complete( status, statusText, responses, responseHeaders );
    +						}
    +					};
    +
    +					if ( !s.async ) {
    +						// if we're in sync mode we fire the callback
    +						callback();
    +					} else if ( xhr.readyState === 4 ) {
    +						// (IE6 & IE7) if it's in cache and has been
    +						// retrieved directly we need to fire the callback
    +						setTimeout( callback, 0 );
    +					} else {
    +						handle = ++xhrId;
    +						if ( xhrOnUnloadAbort ) {
    +							// Create the active xhrs callbacks list if needed
    +							// and attach the unload handler
    +							if ( !xhrCallbacks ) {
    +								xhrCallbacks = {};
    +								jQuery( window ).unload( xhrOnUnloadAbort );
    +							}
    +							// Add to list of active xhrs callbacks
    +							xhrCallbacks[ handle ] = callback;
    +						}
    +						xhr.onreadystatechange = callback;
    +					}
    +				},
    +
    +				abort: function() {
    +					if ( callback ) {
    +						callback(0,1);
    +					}
    +				}
    +			};
    +		}
    +	});
    +}
    +var fxNow, timerId,
    +	rfxtypes = /^(?:toggle|show|hide)$/,
    +	rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
    +	rrun = /queueHooks$/,
    +	animationPrefilters = [ defaultPrefilter ],
    +	tweeners = {
    +		"*": [function( prop, value ) {
    +			var end, unit,
    +				tween = this.createTween( prop, value ),
    +				parts = rfxnum.exec( value ),
    +				target = tween.cur(),
    +				start = +target || 0,
    +				scale = 1,
    +				maxIterations = 20;
    +
    +			if ( parts ) {
    +				end = +parts[2];
    +				unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
    +
    +				// We need to compute starting value
    +				if ( unit !== "px" && start ) {
    +					// Iteratively approximate from a nonzero starting point
    +					// Prefer the current property, because this process will be trivial if it uses the same units
    +					// Fallback to end or a simple constant
    +					start = jQuery.css( tween.elem, prop, true ) || end || 1;
    +
    +					do {
    +						// If previous iteration zeroed out, double until we get *something*
    +						// Use a string for doubling factor so we don't accidentally see scale as unchanged below
    +						scale = scale || ".5";
    +
    +						// Adjust and apply
    +						start = start / scale;
    +						jQuery.style( tween.elem, prop, start + unit );
    +
    +					// Update scale, tolerating zero or NaN from tween.cur()
    +					// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
    +					} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
    +				}
    +
    +				tween.unit = unit;
    +				tween.start = start;
    +				// If a +=/-= token was provided, we're doing a relative animation
    +				tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
    +			}
    +			return tween;
    +		}]
    +	};
    +
    +// Animations created synchronously will run synchronously
    +function createFxNow() {
    +	setTimeout(function() {
    +		fxNow = undefined;
    +	}, 0 );
    +	return ( fxNow = jQuery.now() );
    +}
    +
    +function createTweens( animation, props ) {
    +	jQuery.each( props, function( prop, value ) {
    +		var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
    +			index = 0,
    +			length = collection.length;
    +		for ( ; index < length; index++ ) {
    +			if ( collection[ index ].call( animation, prop, value ) ) {
    +
    +				// we're done with this property
    +				return;
    +			}
    +		}
    +	});
    +}
    +
    +function Animation( elem, properties, options ) {
    +	var result,
    +		index = 0,
    +		tweenerIndex = 0,
    +		length = animationPrefilters.length,
    +		deferred = jQuery.Deferred().always( function() {
    +			// don't match elem in the :animated selector
    +			delete tick.elem;
    +		}),
    +		tick = function() {
    +			var currentTime = fxNow || createFxNow(),
    +				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
    +				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
    +				temp = remaining / animation.duration || 0,
    +				percent = 1 - temp,
    +				index = 0,
    +				length = animation.tweens.length;
    +
    +			for ( ; index < length ; index++ ) {
    +				animation.tweens[ index ].run( percent );
    +			}
    +
    +			deferred.notifyWith( elem, [ animation, percent, remaining ]);
    +
    +			if ( percent < 1 && length ) {
    +				return remaining;
    +			} else {
    +				deferred.resolveWith( elem, [ animation ] );
    +				return false;
    +			}
    +		},
    +		animation = deferred.promise({
    +			elem: elem,
    +			props: jQuery.extend( {}, properties ),
    +			opts: jQuery.extend( true, { specialEasing: {} }, options ),
    +			originalProperties: properties,
    +			originalOptions: options,
    +			startTime: fxNow || createFxNow(),
    +			duration: options.duration,
    +			tweens: [],
    +			createTween: function( prop, end, easing ) {
    +				var tween = jQuery.Tween( elem, animation.opts, prop, end,
    +						animation.opts.specialEasing[ prop ] || animation.opts.easing );
    +				animation.tweens.push( tween );
    +				return tween;
    +			},
    +			stop: function( gotoEnd ) {
    +				var index = 0,
    +					// if we are going to the end, we want to run all the tweens
    +					// otherwise we skip this part
    +					length = gotoEnd ? animation.tweens.length : 0;
    +
    +				for ( ; index < length ; index++ ) {
    +					animation.tweens[ index ].run( 1 );
    +				}
    +
    +				// resolve when we played the last frame
    +				// otherwise, reject
    +				if ( gotoEnd ) {
    +					deferred.resolveWith( elem, [ animation, gotoEnd ] );
    +				} else {
    +					deferred.rejectWith( elem, [ animation, gotoEnd ] );
    +				}
    +				return this;
    +			}
    +		}),
    +		props = animation.props;
    +
    +	propFilter( props, animation.opts.specialEasing );
    +
    +	for ( ; index < length ; index++ ) {
    +		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
    +		if ( result ) {
    +			return result;
    +		}
    +	}
    +
    +	createTweens( animation, props );
    +
    +	if ( jQuery.isFunction( animation.opts.start ) ) {
    +		animation.opts.start.call( elem, animation );
    +	}
    +
    +	jQuery.fx.timer(
    +		jQuery.extend( tick, {
    +			anim: animation,
    +			queue: animation.opts.queue,
    +			elem: elem
    +		})
    +	);
    +
    +	// attach callbacks from options
    +	return animation.progress( animation.opts.progress )
    +		.done( animation.opts.done, animation.opts.complete )
    +		.fail( animation.opts.fail )
    +		.always( animation.opts.always );
    +}
    +
    +function propFilter( props, specialEasing ) {
    +	var index, name, easing, value, hooks;
    +
    +	// camelCase, specialEasing and expand cssHook pass
    +	for ( index in props ) {
    +		name = jQuery.camelCase( index );
    +		easing = specialEasing[ name ];
    +		value = props[ index ];
    +		if ( jQuery.isArray( value ) ) {
    +			easing = value[ 1 ];
    +			value = props[ index ] = value[ 0 ];
    +		}
    +
    +		if ( index !== name ) {
    +			props[ name ] = value;
    +			delete props[ index ];
    +		}
    +
    +		hooks = jQuery.cssHooks[ name ];
    +		if ( hooks && "expand" in hooks ) {
    +			value = hooks.expand( value );
    +			delete props[ name ];
    +
    +			// not quite $.extend, this wont overwrite keys already present.
    +			// also - reusing 'index' from above because we have the correct "name"
    +			for ( index in value ) {
    +				if ( !( index in props ) ) {
    +					props[ index ] = value[ index ];
    +					specialEasing[ index ] = easing;
    +				}
    +			}
    +		} else {
    +			specialEasing[ name ] = easing;
    +		}
    +	}
    +}
    +
    +jQuery.Animation = jQuery.extend( Animation, {
    +
    +	tweener: function( props, callback ) {
    +		if ( jQuery.isFunction( props ) ) {
    +			callback = props;
    +			props = [ "*" ];
    +		} else {
    +			props = props.split(" ");
    +		}
    +
    +		var prop,
    +			index = 0,
    +			length = props.length;
    +
    +		for ( ; index < length ; index++ ) {
    +			prop = props[ index ];
    +			tweeners[ prop ] = tweeners[ prop ] || [];
    +			tweeners[ prop ].unshift( callback );
    +		}
    +	},
    +
    +	prefilter: function( callback, prepend ) {
    +		if ( prepend ) {
    +			animationPrefilters.unshift( callback );
    +		} else {
    +			animationPrefilters.push( callback );
    +		}
    +	}
    +});
    +
    +function defaultPrefilter( elem, props, opts ) {
    +	var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
    +		anim = this,
    +		style = elem.style,
    +		orig = {},
    +		handled = [],
    +		hidden = elem.nodeType && isHidden( elem );
    +
    +	// handle queue: false promises
    +	if ( !opts.queue ) {
    +		hooks = jQuery._queueHooks( elem, "fx" );
    +		if ( hooks.unqueued == null ) {
    +			hooks.unqueued = 0;
    +			oldfire = hooks.empty.fire;
    +			hooks.empty.fire = function() {
    +				if ( !hooks.unqueued ) {
    +					oldfire();
    +				}
    +			};
    +		}
    +		hooks.unqueued++;
    +
    +		anim.always(function() {
    +			// doing this makes sure that the complete handler will be called
    +			// before this completes
    +			anim.always(function() {
    +				hooks.unqueued--;
    +				if ( !jQuery.queue( elem, "fx" ).length ) {
    +					hooks.empty.fire();
    +				}
    +			});
    +		});
    +	}
    +
    +	// height/width overflow pass
    +	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
    +		// Make sure that nothing sneaks out
    +		// Record all 3 overflow attributes because IE does not
    +		// change the overflow attribute when overflowX and
    +		// overflowY are set to the same value
    +		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
    +
    +		// Set display property to inline-block for height/width
    +		// animations on inline elements that are having width/height animated
    +		if ( jQuery.css( elem, "display" ) === "inline" &&
    +				jQuery.css( elem, "float" ) === "none" ) {
    +
    +			// inline-level elements accept inline-block;
    +			// block-level elements need to be inline with layout
    +			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
    +				style.display = "inline-block";
    +
    +			} else {
    +				style.zoom = 1;
    +			}
    +		}
    +	}
    +
    +	if ( opts.overflow ) {
    +		style.overflow = "hidden";
    +		if ( !jQuery.support.shrinkWrapBlocks ) {
    +			anim.done(function() {
    +				style.overflow = opts.overflow[ 0 ];
    +				style.overflowX = opts.overflow[ 1 ];
    +				style.overflowY = opts.overflow[ 2 ];
    +			});
    +		}
    +	}
    +
    +
    +	// show/hide pass
    +	for ( index in props ) {
    +		value = props[ index ];
    +		if ( rfxtypes.exec( value ) ) {
    +			delete props[ index ];
    +			toggle = toggle || value === "toggle";
    +			if ( value === ( hidden ? "hide" : "show" ) ) {
    +				continue;
    +			}
    +			handled.push( index );
    +		}
    +	}
    +
    +	length = handled.length;
    +	if ( length ) {
    +		dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
    +		if ( "hidden" in dataShow ) {
    +			hidden = dataShow.hidden;
    +		}
    +
    +		// store state if its toggle - enables .stop().toggle() to "reverse"
    +		if ( toggle ) {
    +			dataShow.hidden = !hidden;
    +		}
    +		if ( hidden ) {
    +			jQuery( elem ).show();
    +		} else {
    +			anim.done(function() {
    +				jQuery( elem ).hide();
    +			});
    +		}
    +		anim.done(function() {
    +			var prop;
    +			jQuery.removeData( elem, "fxshow", true );
    +			for ( prop in orig ) {
    +				jQuery.style( elem, prop, orig[ prop ] );
    +			}
    +		});
    +		for ( index = 0 ; index < length ; index++ ) {
    +			prop = handled[ index ];
    +			tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
    +			orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
    +
    +			if ( !( prop in dataShow ) ) {
    +				dataShow[ prop ] = tween.start;
    +				if ( hidden ) {
    +					tween.end = tween.start;
    +					tween.start = prop === "width" || prop === "height" ? 1 : 0;
    +				}
    +			}
    +		}
    +	}
    +}
    +
    +function Tween( elem, options, prop, end, easing ) {
    +	return new Tween.prototype.init( elem, options, prop, end, easing );
    +}
    +jQuery.Tween = Tween;
    +
    +Tween.prototype = {
    +	constructor: Tween,
    +	init: function( elem, options, prop, end, easing, unit ) {
    +		this.elem = elem;
    +		this.prop = prop;
    +		this.easing = easing || "swing";
    +		this.options = options;
    +		this.start = this.now = this.cur();
    +		this.end = end;
    +		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
    +	},
    +	cur: function() {
    +		var hooks = Tween.propHooks[ this.prop ];
    +
    +		return hooks && hooks.get ?
    +			hooks.get( this ) :
    +			Tween.propHooks._default.get( this );
    +	},
    +	run: function( percent ) {
    +		var eased,
    +			hooks = Tween.propHooks[ this.prop ];
    +
    +		if ( this.options.duration ) {
    +			this.pos = eased = jQuery.easing[ this.easing ](
    +				percent, this.options.duration * percent, 0, 1, this.options.duration
    +			);
    +		} else {
    +			this.pos = eased = percent;
    +		}
    +		this.now = ( this.end - this.start ) * eased + this.start;
    +
    +		if ( this.options.step ) {
    +			this.options.step.call( this.elem, this.now, this );
    +		}
    +
    +		if ( hooks && hooks.set ) {
    +			hooks.set( this );
    +		} else {
    +			Tween.propHooks._default.set( this );
    +		}
    +		return this;
    +	}
    +};
    +
    +Tween.prototype.init.prototype = Tween.prototype;
    +
    +Tween.propHooks = {
    +	_default: {
    +		get: function( tween ) {
    +			var result;
    +
    +			if ( tween.elem[ tween.prop ] != null &&
    +				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
    +				return tween.elem[ tween.prop ];
    +			}
    +
    +			// passing any value as a 4th parameter to .css will automatically
    +			// attempt a parseFloat and fallback to a string if the parse fails
    +			// so, simple values such as "10px" are parsed to Float.
    +			// complex values such as "rotate(1rad)" are returned as is.
    +			result = jQuery.css( tween.elem, tween.prop, false, "" );
    +			// Empty strings, null, undefined and "auto" are converted to 0.
    +			return !result || result === "auto" ? 0 : result;
    +		},
    +		set: function( tween ) {
    +			// use step hook for back compat - use cssHook if its there - use .style if its
    +			// available and use plain properties where available
    +			if ( jQuery.fx.step[ tween.prop ] ) {
    +				jQuery.fx.step[ tween.prop ]( tween );
    +			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
    +				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
    +			} else {
    +				tween.elem[ tween.prop ] = tween.now;
    +			}
    +		}
    +	}
    +};
    +
    +// Remove in 2.0 - this supports IE8's panic based approach
    +// to setting things on disconnected nodes
    +
    +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
    +	set: function( tween ) {
    +		if ( tween.elem.nodeType && tween.elem.parentNode ) {
    +			tween.elem[ tween.prop ] = tween.now;
    +		}
    +	}
    +};
    +
    +jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
    +	var cssFn = jQuery.fn[ name ];
    +	jQuery.fn[ name ] = function( speed, easing, callback ) {
    +		return speed == null || typeof speed === "boolean" ||
    +			// special check for .toggle( handler, handler, ... )
    +			( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
    +			cssFn.apply( this, arguments ) :
    +			this.animate( genFx( name, true ), speed, easing, callback );
    +	};
    +});
    +
    +jQuery.fn.extend({
    +	fadeTo: function( speed, to, easing, callback ) {
    +
    +		// show any hidden elements after setting opacity to 0
    +		return this.filter( isHidden ).css( "opacity", 0 ).show()
    +
    +			// animate to the value specified
    +			.end().animate({ opacity: to }, speed, easing, callback );
    +	},
    +	animate: function( prop, speed, easing, callback ) {
    +		var empty = jQuery.isEmptyObject( prop ),
    +			optall = jQuery.speed( speed, easing, callback ),
    +			doAnimation = function() {
    +				// Operate on a copy of prop so per-property easing won't be lost
    +				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
    +
    +				// Empty animations resolve immediately
    +				if ( empty ) {
    +					anim.stop( true );
    +				}
    +			};
    +
    +		return empty || optall.queue === false ?
    +			this.each( doAnimation ) :
    +			this.queue( optall.queue, doAnimation );
    +	},
    +	stop: function( type, clearQueue, gotoEnd ) {
    +		var stopQueue = function( hooks ) {
    +			var stop = hooks.stop;
    +			delete hooks.stop;
    +			stop( gotoEnd );
    +		};
    +
    +		if ( typeof type !== "string" ) {
    +			gotoEnd = clearQueue;
    +			clearQueue = type;
    +			type = undefined;
    +		}
    +		if ( clearQueue && type !== false ) {
    +			this.queue( type || "fx", [] );
    +		}
    +
    +		return this.each(function() {
    +			var dequeue = true,
    +				index = type != null && type + "queueHooks",
    +				timers = jQuery.timers,
    +				data = jQuery._data( this );
    +
    +			if ( index ) {
    +				if ( data[ index ] && data[ index ].stop ) {
    +					stopQueue( data[ index ] );
    +				}
    +			} else {
    +				for ( index in data ) {
    +					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
    +						stopQueue( data[ index ] );
    +					}
    +				}
    +			}
    +
    +			for ( index = timers.length; index--; ) {
    +				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
    +					timers[ index ].anim.stop( gotoEnd );
    +					dequeue = false;
    +					timers.splice( index, 1 );
    +				}
    +			}
    +
    +			// start the next in the queue if the last step wasn't forced
    +			// timers currently will call their complete callbacks, which will dequeue
    +			// but only if they were gotoEnd
    +			if ( dequeue || !gotoEnd ) {
    +				jQuery.dequeue( this, type );
    +			}
    +		});
    +	}
    +});
    +
    +// Generate parameters to create a standard animation
    +function genFx( type, includeWidth ) {
    +	var which,
    +		attrs = { height: type },
    +		i = 0;
    +
    +	// if we include width, step value is 1 to do all cssExpand values,
    +	// if we don't include width, step value is 2 to skip over Left and Right
    +	includeWidth = includeWidth? 1 : 0;
    +	for( ; i < 4 ; i += 2 - includeWidth ) {
    +		which = cssExpand[ i ];
    +		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
    +	}
    +
    +	if ( includeWidth ) {
    +		attrs.opacity = attrs.width = type;
    +	}
    +
    +	return attrs;
    +}
    +
    +// Generate shortcuts for custom animations
    +jQuery.each({
    +	slideDown: genFx("show"),
    +	slideUp: genFx("hide"),
    +	slideToggle: genFx("toggle"),
    +	fadeIn: { opacity: "show" },
    +	fadeOut: { opacity: "hide" },
    +	fadeToggle: { opacity: "toggle" }
    +}, function( name, props ) {
    +	jQuery.fn[ name ] = function( speed, easing, callback ) {
    +		return this.animate( props, speed, easing, callback );
    +	};
    +});
    +
    +jQuery.speed = function( speed, easing, fn ) {
    +	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
    +		complete: fn || !fn && easing ||
    +			jQuery.isFunction( speed ) && speed,
    +		duration: speed,
    +		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
    +	};
    +
    +	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
    +		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
    +
    +	// normalize opt.queue - true/undefined/null -> "fx"
    +	if ( opt.queue == null || opt.queue === true ) {
    +		opt.queue = "fx";
    +	}
    +
    +	// Queueing
    +	opt.old = opt.complete;
    +
    +	opt.complete = function() {
    +		if ( jQuery.isFunction( opt.old ) ) {
    +			opt.old.call( this );
    +		}
    +
    +		if ( opt.queue ) {
    +			jQuery.dequeue( this, opt.queue );
    +		}
    +	};
    +
    +	return opt;
    +};
    +
    +jQuery.easing = {
    +	linear: function( p ) {
    +		return p;
    +	},
    +	swing: function( p ) {
    +		return 0.5 - Math.cos( p*Math.PI ) / 2;
    +	}
    +};
    +
    +jQuery.timers = [];
    +jQuery.fx = Tween.prototype.init;
    +jQuery.fx.tick = function() {
    +	var timer,
    +		timers = jQuery.timers,
    +		i = 0;
    +
    +	fxNow = jQuery.now();
    +
    +	for ( ; i < timers.length; i++ ) {
    +		timer = timers[ i ];
    +		// Checks the timer has not already been removed
    +		if ( !timer() && timers[ i ] === timer ) {
    +			timers.splice( i--, 1 );
    +		}
    +	}
    +
    +	if ( !timers.length ) {
    +		jQuery.fx.stop();
    +	}
    +	fxNow = undefined;
    +};
    +
    +jQuery.fx.timer = function( timer ) {
    +	if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
    +		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
    +	}
    +};
    +
    +jQuery.fx.interval = 13;
    +
    +jQuery.fx.stop = function() {
    +	clearInterval( timerId );
    +	timerId = null;
    +};
    +
    +jQuery.fx.speeds = {
    +	slow: 600,
    +	fast: 200,
    +	// Default speed
    +	_default: 400
    +};
    +
    +// Back Compat <1.8 extension point
    +jQuery.fx.step = {};
    +
    +if ( jQuery.expr && jQuery.expr.filters ) {
    +	jQuery.expr.filters.animated = function( elem ) {
    +		return jQuery.grep(jQuery.timers, function( fn ) {
    +			return elem === fn.elem;
    +		}).length;
    +	};
    +}
    +var rroot = /^(?:body|html)$/i;
    +
    +jQuery.fn.offset = function( options ) {
    +	if ( arguments.length ) {
    +		return options === undefined ?
    +			this :
    +			this.each(function( i ) {
    +				jQuery.offset.setOffset( this, options, i );
    +			});
    +	}
    +
    +	var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
    +		box = { top: 0, left: 0 },
    +		elem = this[ 0 ],
    +		doc = elem && elem.ownerDocument;
    +
    +	if ( !doc ) {
    +		return;
    +	}
    +
    +	if ( (body = doc.body) === elem ) {
    +		return jQuery.offset.bodyOffset( elem );
    +	}
    +
    +	docElem = doc.documentElement;
    +
    +	// Make sure it's not a disconnected DOM node
    +	if ( !jQuery.contains( docElem, elem ) ) {
    +		return box;
    +	}
    +
    +	// If we don't have gBCR, just use 0,0 rather than error
    +	// BlackBerry 5, iOS 3 (original iPhone)
    +	if ( typeof elem.getBoundingClientRect !== "undefined" ) {
    +		box = elem.getBoundingClientRect();
    +	}
    +	win = getWindow( doc );
    +	clientTop  = docElem.clientTop  || body.clientTop  || 0;
    +	clientLeft = docElem.clientLeft || body.clientLeft || 0;
    +	scrollTop  = win.pageYOffset || docElem.scrollTop;
    +	scrollLeft = win.pageXOffset || docElem.scrollLeft;
    +	return {
    +		top: box.top  + scrollTop  - clientTop,
    +		left: box.left + scrollLeft - clientLeft
    +	};
    +};
    +
    +jQuery.offset = {
    +
    +	bodyOffset: function( body ) {
    +		var top = body.offsetTop,
    +			left = body.offsetLeft;
    +
    +		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
    +			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
    +			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
    +		}
    +
    +		return { top: top, left: left };
    +	},
    +
    +	setOffset: function( elem, options, i ) {
    +		var position = jQuery.css( elem, "position" );
    +
    +		// set position first, in-case top/left are set even on static elem
    +		if ( position === "static" ) {
    +			elem.style.position = "relative";
    +		}
    +
    +		var curElem = jQuery( elem ),
    +			curOffset = curElem.offset(),
    +			curCSSTop = jQuery.css( elem, "top" ),
    +			curCSSLeft = jQuery.css( elem, "left" ),
    +			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
    +			props = {}, curPosition = {}, curTop, curLeft;
    +
    +		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
    +		if ( calculatePosition ) {
    +			curPosition = curElem.position();
    +			curTop = curPosition.top;
    +			curLeft = curPosition.left;
    +		} else {
    +			curTop = parseFloat( curCSSTop ) || 0;
    +			curLeft = parseFloat( curCSSLeft ) || 0;
    +		}
    +
    +		if ( jQuery.isFunction( options ) ) {
    +			options = options.call( elem, i, curOffset );
    +		}
    +
    +		if ( options.top != null ) {
    +			props.top = ( options.top - curOffset.top ) + curTop;
    +		}
    +		if ( options.left != null ) {
    +			props.left = ( options.left - curOffset.left ) + curLeft;
    +		}
    +
    +		if ( "using" in options ) {
    +			options.using.call( elem, props );
    +		} else {
    +			curElem.css( props );
    +		}
    +	}
    +};
    +
    +
    +jQuery.fn.extend({
    +
    +	position: function() {
    +		if ( !this[0] ) {
    +			return;
    +		}
    +
    +		var elem = this[0],
    +
    +		// Get *real* offsetParent
    +		offsetParent = this.offsetParent(),
    +
    +		// Get correct offsets
    +		offset       = this.offset(),
    +		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
    +
    +		// Subtract element margins
    +		// note: when an element has margin: auto the offsetLeft and marginLeft
    +		// are the same in Safari causing offset.left to incorrectly be 0
    +		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
    +		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
    +
    +		// Add offsetParent borders
    +		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
    +		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
    +
    +		// Subtract the two offsets
    +		return {
    +			top:  offset.top  - parentOffset.top,
    +			left: offset.left - parentOffset.left
    +		};
    +	},
    +
    +	offsetParent: function() {
    +		return this.map(function() {
    +			var offsetParent = this.offsetParent || document.body;
    +			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
    +				offsetParent = offsetParent.offsetParent;
    +			}
    +			return offsetParent || document.body;
    +		});
    +	}
    +});
    +
    +
    +// Create scrollLeft and scrollTop methods
    +jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
    +	var top = /Y/.test( prop );
    +
    +	jQuery.fn[ method ] = function( val ) {
    +		return jQuery.access( this, function( elem, method, val ) {
    +			var win = getWindow( elem );
    +
    +			if ( val === undefined ) {
    +				return win ? (prop in win) ? win[ prop ] :
    +					win.document.documentElement[ method ] :
    +					elem[ method ];
    +			}
    +
    +			if ( win ) {
    +				win.scrollTo(
    +					!top ? val : jQuery( win ).scrollLeft(),
    +					 top ? val : jQuery( win ).scrollTop()
    +				);
    +
    +			} else {
    +				elem[ method ] = val;
    +			}
    +		}, method, val, arguments.length, null );
    +	};
    +});
    +
    +function getWindow( elem ) {
    +	return jQuery.isWindow( elem ) ?
    +		elem :
    +		elem.nodeType === 9 ?
    +			elem.defaultView || elem.parentWindow :
    +			false;
    +}
    +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
    +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
    +	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
    +		// margin is only for outerHeight, outerWidth
    +		jQuery.fn[ funcName ] = function( margin, value ) {
    +			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
    +				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
    +
    +			return jQuery.access( this, function( elem, type, value ) {
    +				var doc;
    +
    +				if ( jQuery.isWindow( elem ) ) {
    +					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
    +					// isn't a whole lot we can do. See pull request at this URL for discussion:
    +					// https://github.com/jquery/jquery/pull/764
    +					return elem.document.documentElement[ "client" + name ];
    +				}
    +
    +				// Get document width or height
    +				if ( elem.nodeType === 9 ) {
    +					doc = elem.documentElement;
    +
    +					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
    +					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
    +					return Math.max(
    +						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
    +						elem.body[ "offset" + name ], doc[ "offset" + name ],
    +						doc[ "client" + name ]
    +					);
    +				}
    +
    +				return value === undefined ?
    +					// Get width or height on the element, requesting but not forcing parseFloat
    +					jQuery.css( elem, type, value, extra ) :
    +
    +					// Set width or height on the element
    +					jQuery.style( elem, type, value, extra );
    +			}, type, chainable ? margin : undefined, chainable, null );
    +		};
    +	});
    +});
    +// Expose jQuery to the global object
    +window.jQuery = window.$ = jQuery;
    +
    +// Expose jQuery as an AMD module, but only for AMD loaders that
    +// understand the issues with loading multiple versions of jQuery
    +// in a page that all might call define(). The loader will indicate
    +// they have special allowances for multiple jQuery versions by
    +// specifying define.amd.jQuery = true. Register as a named module,
    +// since jQuery can be concatenated with other files that may use define,
    +// but not use a proper concatenation script that understands anonymous
    +// AMD modules. A named AMD is safest and most robust way to register.
    +// Lowercase jquery is used because AMD module names are derived from
    +// file names, and jQuery is normally delivered in a lowercase file name.
    +// Do this after creating the global so that if an AMD module wants to call
    +// noConflict to hide this version of jQuery, it will work.
    +if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
    +	define( "jquery", [], function () { return jQuery; } );
    +}
    +
    +})( window );
    diff --git a/src/main/webapp/plug-in/jquery/jquery-1.8.3.min.js b/src/main/webapp/plug-in/jquery/jquery-1.8.3.min.js
    new file mode 100644
    index 00000000..38837795
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery-1.8.3.min.js
    @@ -0,0 +1,2 @@
    +/*! jQuery v1.8.3 jquery.com | jquery.org/license */
    +(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery/jquery-autocomplete/jquery.autocomplete.css b/src/main/webapp/plug-in/jquery/jquery-autocomplete/jquery.autocomplete.css
    new file mode 100644
    index 00000000..91b62283
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery-autocomplete/jquery.autocomplete.css
    @@ -0,0 +1,48 @@
    +.ac_results {
    +	padding: 0px;
    +	border: 1px solid black;
    +	background-color: white;
    +	overflow: hidden;
    +	z-index: 99999;
    +}
    +
    +.ac_results ul {
    +	width: 100%;
    +	list-style-position: outside;
    +	list-style: none;
    +	padding: 0;
    +	margin: 0;
    +}
    +
    +.ac_results li {
    +	margin: 0px;
    +	padding: 2px 5px;
    +	cursor: default;
    +	display: block;
    +	/* 
    +	if width will be 100% horizontal scrollbar will apear 
    +	when scroll mode will be used
    +	*/
    +	/*width: 100%;*/
    +	font: menu;
    +	font-size: 12px;
    +	/* 
    +	it is very important, if line-height not setted or setted 
    +	in relative units scroll will be broken in firefox
    +	*/
    +	line-height: 16px;
    +	overflow: hidden;
    +}
    +
    +.ac_loading {
    +	background: white url('indicator.gif') right center no-repeat;
    +}
    +
    +.ac_odd {
    +	background-color: #eee;
    +}
    +
    +.ac_over {
    +	background-color: #0A246A;
    +	color: white;
    +}
    diff --git a/src/main/webapp/plug-in/jquery/jquery-autocomplete/jquery.autocomplete.js b/src/main/webapp/plug-in/jquery/jquery-autocomplete/jquery.autocomplete.js
    new file mode 100644
    index 00000000..1c793c27
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery-autocomplete/jquery.autocomplete.js
    @@ -0,0 +1,809 @@
    +/*
    + * jQuery Autocomplete plugin 1.1
    + *
    + * Copyright (c) 2009 J枚rn Zaefferer
    + *
    + * Dual licensed under the MIT and GPL licenses:
    + *   http://www.opensource.org/licenses/mit-license.php
    + *   http://www.gnu.org/licenses/gpl.html
    + *
    + * Revision: $Id: jquery.autocomplete.js,v 1.1 2012/12/05 01:39:35 ghp Exp $
    + */
    +(function($) {
    +	
    +$.fn.extend({
    +	autocomplete: function(urlOrData, options) {
    +		var isUrl = typeof urlOrData == "string";
    +		options = $.extend({}, $.Autocompleter.defaults, {
    +			url: isUrl ? urlOrData : null,
    +			data: isUrl ? null : urlOrData,
    +			delay: isUrl ? $.Autocompleter.defaults.delay : 10,
    +			max: options && !options.scroll ? 10 : 150
    +		}, options);
    +		
    +		// if highlight is set to false, replace it with a do-nothing function
    +		options.highlight = options.highlight || function(value) { return value; };
    +		
    +		// if the formatMatch option is not specified, then use formatItem for backwards compatibility
    +		options.formatMatch = options.formatMatch || options.formatItem;
    +		
    +		return this.each(function() {
    +			new $.Autocompleter(this, options);
    +		});
    +	},
    +	result: function(handler) {
    +		return this.bind("result", handler);
    +	},
    +	search: function(handler) {
    +		return this.trigger("search", [handler]);
    +	},
    +	flushCache: function() {
    +		return this.trigger("flushCache");
    +	},
    +	setOptions: function(options){
    +		return this.trigger("setOptions", [options]);
    +	},
    +	unautocomplete: function() {
    +		return this.trigger("unautocomplete");
    +	}
    +});
    +
    +$.Autocompleter = function(input, options) {
    +
    +	var KEY = {
    +		UP: 38,
    +		DOWN: 40,
    +		DEL: 46,
    +		TAB: 9,
    +		RETURN: 13,
    +		ESC: 27,
    +		COMMA: 188,
    +		PAGEUP: 33,
    +		PAGEDOWN: 34,
    +		BACKSPACE: 8
    +	};
    +
    +	// Create $ object for input element
    +	var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
    +
    +	var timeout;
    +	var previousValue = "";
    +	var cache = $.Autocompleter.Cache(options);
    +	var hasFocus = 0;
    +	var lastKeyPressCode;
    +	var config = {
    +		mouseDownOnSelect: false
    +	};
    +	var select = $.Autocompleter.Select(options, input, selectCurrent, config);
    +	
    +	var blockSubmit;
    +	
    +	// prevent form submit in opera when selecting with return key
    +	$.browser.opera && $(input.form).bind("submit.autocomplete", function() {
    +		if (blockSubmit) {
    +			blockSubmit = false;
    +			return false;
    +		}
    +	});
    +	
    +	// only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
    +	$input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
    +		// a keypress means the input has focus
    +		// avoids issue where input had focus before the autocomplete was applied
    +		hasFocus = 1;
    +		// track last key pressed
    +		lastKeyPressCode = event.keyCode;
    +		switch(event.keyCode) {
    +		
    +			case KEY.UP:
    +				event.preventDefault();
    +				if ( select.visible() ) {
    +					select.prev();
    +				} else {
    +					onChange(0, true);
    +				}
    +				break;
    +				
    +			case KEY.DOWN:
    +				event.preventDefault();
    +				if ( select.visible() ) {
    +					select.next();
    +				} else {
    +					onChange(0, true);
    +				}
    +				break;
    +				
    +			case KEY.PAGEUP:
    +				event.preventDefault();
    +				if ( select.visible() ) {
    +					select.pageUp();
    +				} else {
    +					onChange(0, true);
    +				}
    +				break;
    +				
    +			case KEY.PAGEDOWN:
    +				event.preventDefault();
    +				if ( select.visible() ) {
    +					select.pageDown();
    +				} else {
    +					onChange(0, true);
    +				}
    +				break;
    +			
    +			// matches also semicolon
    +			case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
    +			case KEY.TAB:
    +			case KEY.RETURN:
    +				if( selectCurrent() ) {
    +					// stop default to prevent a form submit, Opera needs special handling
    +					event.preventDefault();
    +					blockSubmit = true;
    +					return false;
    +				}
    +				break;
    +				
    +			case KEY.ESC:
    +				select.hide();
    +				break;
    +				
    +			default:
    +				clearTimeout(timeout);
    +				timeout = setTimeout(onChange, options.delay);
    +				break;
    +		}
    +	}).focus(function(){
    +		// track whether the field has focus, we shouldn't process any
    +		// results if the field no longer has focus
    +		hasFocus++;
    +	}).blur(function() {
    +		hasFocus = 0;
    +		if (!config.mouseDownOnSelect) {
    +			hideResults();
    +		}
    +	}).click(function() {
    +		// show select when clicking in a focused field
    +		if ( hasFocus++ > 1 && !select.visible() ) {
    +			onChange(0, true);
    +		}
    +	}).bind("search", function() {
    +		// TODO why not just specifying both arguments?
    +		var fn = (arguments.length > 1) ? arguments[1] : null;
    +		function findValueCallback(q, data) {
    +			var result;
    +			if( data && data.length ) {
    +				for (var i=0; i < data.length; i++) {
    +					if( data[i].result.toLowerCase() == q.toLowerCase() ) {
    +						result = data[i];
    +						break;
    +					}
    +				}
    +			}
    +			if( typeof fn == "function" ) fn(result);
    +			else $input.trigger("result", result && [result.data, result.value]);
    +		}
    +		$.each(trimWords($input.val()), function(i, value) {
    +			request(value, findValueCallback, findValueCallback);
    +		});
    +	}).bind("flushCache", function() {
    +		cache.flush();
    +	}).bind("setOptions", function() {
    +		$.extend(options, arguments[1]);
    +		// if we've updated the data, repopulate
    +		if ( "data" in arguments[1] )
    +			cache.populate();
    +	}).bind("unautocomplete", function() {
    +		select.unbind();
    +		$input.unbind();
    +		$(input.form).unbind(".autocomplete");
    +	}).bind("input", function() {
    +		onChange(0, true);		
    +	});
    +	
    +	
    +	function selectCurrent() {
    +		var selected = select.selected();
    +		if( !selected )
    +			return false;
    +		
    +		var v = selected.result;
    +		previousValue = v;
    +		
    +		if ( options.multiple ) {
    +			var words = trimWords($input.val());
    +			if ( words.length > 1 ) {
    +				var seperator = options.multipleSeparator.length;
    +				var cursorAt = $(input).selection().start;
    +				var wordAt, progress = 0;
    +				$.each(words, function(i, word) {
    +					progress += word.length;
    +					if (cursorAt <= progress) {
    +						wordAt = i;
    +						return false;
    +					}
    +					progress += seperator;
    +				});
    +				words[wordAt] = v;
    +				// TODO this should set the cursor to the right position, but it gets overriden somewhere
    +				//$.Autocompleter.Selection(input, progress + seperator, progress + seperator);
    +				v = words.join( options.multipleSeparator );
    +			}
    +			v += options.multipleSeparator;
    +		}
    +		
    +		$input.val(v);
    +		hideResultsNow();
    +		$input.trigger("result", [selected.data, selected.value]);
    +		return true;
    +	}
    +	
    +	function onChange(crap, skipPrevCheck) {
    +		if( lastKeyPressCode == KEY.DEL ) {
    +			select.hide();
    +			return;
    +		}
    +		
    +		var currentValue = $input.val();
    +		
    +		if ( !skipPrevCheck && currentValue == previousValue )
    +			return;
    +		
    +		previousValue = currentValue;
    +		
    +		currentValue = lastWord(currentValue);
    +		if ( currentValue.length >= options.minChars) {
    +			$input.addClass(options.loadingClass);
    +			if (!options.matchCase)
    +				currentValue = currentValue.toLowerCase();
    +			request(currentValue, receiveData, hideResultsNow);
    +		} else {
    +			stopLoading();
    +			select.hide();
    +		}
    +	};
    +	
    +	function trimWords(value) {
    +		if (!value)
    +			return [""];
    +		if (!options.multiple)
    +			return [$.trim(value)];
    +		return $.map(value.split(options.multipleSeparator), function(word) {
    +			return $.trim(value).length ? $.trim(word) : null;
    +		});
    +	}
    +	
    +	function lastWord(value) {
    +		if ( !options.multiple )
    +			return value;
    +		var words = trimWords(value);
    +		if (words.length == 1) 
    +			return words[0];
    +		var cursorAt = $(input).selection().start;
    +		if (cursorAt == value.length) {
    +			words = trimWords(value)
    +		} else {
    +			words = trimWords(value.replace(value.substring(cursorAt), ""));
    +		}
    +		return words[words.length - 1];
    +	}
    +	
    +	// fills in the input box w/the first match (assumed to be the best match)
    +	// q: the term entered
    +	// sValue: the first matching result
    +	function autoFill(q, sValue){
    +		// autofill in the complete box w/the first match as long as the user hasn't entered in more data
    +		// if the last user key pressed was backspace, don't autofill
    +		if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
    +			// fill in the value (keep the case the user has typed)
    +			$input.val($input.val() + sValue.substring(lastWord(previousValue).length));
    +			// select the portion of the value not typed by the user (so the next character will erase)
    +			$(input).selection(previousValue.length, previousValue.length + sValue.length);
    +		}
    +	};
    +
    +	function hideResults() {
    +		clearTimeout(timeout);
    +		timeout = setTimeout(hideResultsNow, 200);
    +	};
    +
    +	function hideResultsNow() {
    +		var wasVisible = select.visible();
    +		select.hide();
    +		clearTimeout(timeout);
    +		stopLoading();
    +		if (options.mustMatch) {
    +			// call search and run callback
    +			$input.search(
    +				function (result){
    +					// if no value found, clear the input box
    +					if( !result ) {
    +						if (options.multiple) {
    +							var words = trimWords($input.val()).slice(0, -1);
    +							$input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
    +						}
    +						else {
    +							$input.val( "" );
    +							$input.trigger("result", null);
    +						}
    +					}
    +				}
    +			);
    +		}
    +	};
    +
    +	function receiveData(q, data) {
    +		if ( data && data.length && hasFocus ) {
    +			stopLoading();
    +			select.display(data, q);
    +			autoFill(q, data[0].value);
    +			select.show();
    +		} else {
    +			hideResultsNow();
    +		}
    +	};
    +
    +	function request(term, success, failure) {
    +		if (!options.matchCase)
    +			term = term.toLowerCase();
    +		var data = cache.load(term);
    +		// recieve the cached data
    +		if (data && data.length) {
    +			success(term, data);
    +		// if an AJAX url has been supplied, try loading the data now
    +		} else if( (typeof options.url == "string") && (options.url.length > 0) ){
    +			
    +			var extraParams = {
    +				timestamp: +new Date()
    +			};
    +			$.each(options.extraParams, function(key, param) {
    +				extraParams[key] = typeof param == "function" ? param() : param;
    +			});
    +			
    +			$.ajax({
    +				// try to leverage ajaxQueue plugin to abort previous requests
    +				mode: "abort",
    +				// limit abortion to this input
    +				port: "autocomplete" + input.name,
    +				dataType: options.dataType,
    +				url: options.url,
    +				data: $.extend({
    +					q: lastWord(term),
    +					limit: options.max
    +				}, extraParams),
    +				success: function(data) {
    +					var parsed = options.parse && options.parse(data) || parse(data);
    +					cache.add(term, parsed);
    +					success(term, parsed);
    +				}
    +			});
    +		} else {
    +			// if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
    +			select.emptyList();
    +			failure(term);
    +		}
    +	};
    +	
    +	function parse(data) {
    +		var parsed = [];
    +		var rows = data.split("\n");
    +		for (var i=0; i < rows.length; i++) {
    +			var row = $.trim(rows[i]);
    +			if (row) {
    +				row = row.split("|");
    +				parsed[parsed.length] = {
    +					data: row,
    +					value: row[0],
    +					result: options.formatResult && options.formatResult(row, row[0]) || row[0]
    +				};
    +			}
    +		}
    +		return parsed;
    +	};
    +
    +	function stopLoading() {
    +		$input.removeClass(options.loadingClass);
    +	};
    +
    +};
    +
    +$.Autocompleter.defaults = {
    +	inputClass: "ac_input",
    +	resultsClass: "ac_results",
    +	loadingClass: "ac_loading",
    +	minChars: 1,
    +	delay: 400,
    +	matchCase: false,
    +	matchSubset: true,
    +	matchContains: false,
    +	cacheLength: 10,
    +	max: 100,
    +	mustMatch: false,
    +	extraParams: {},
    +	selectFirst: true,
    +	formatItem: function(row) { return row[0]; },
    +	formatMatch: null,
    +	autoFill: false,
    +	width: 0,
    +	multiple: false,
    +	multipleSeparator: ", ",
    +	highlight: function(value, term) {
    +		return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
    +	},
    +    scroll: true,
    +    scrollHeight: 180
    +};
    +
    +$.Autocompleter.Cache = function(options) {
    +
    +	var data = {};
    +	var length = 0;
    +	
    +	function matchSubset(s, sub) {
    +		if (!options.matchCase) 
    +			s = s.toLowerCase();
    +		var i = s.indexOf(sub);
    +		if (options.matchContains == "word"){
    +			i = s.toLowerCase().search("\\b" + sub.toLowerCase());
    +		}
    +		if (i == -1) return false;
    +		return i == 0 || options.matchContains;
    +	};
    +	
    +	function add(q, value) {
    +		if (length > options.cacheLength){
    +			flush();
    +		}
    +		if (!data[q]){ 
    +			length++;
    +		}
    +		data[q] = value;
    +	}
    +	
    +	function populate(){
    +		if( !options.data ) return false;
    +		// track the matches
    +		var stMatchSets = {},
    +			nullData = 0;
    +
    +		// no url was specified, we need to adjust the cache length to make sure it fits the local data store
    +		if( !options.url ) options.cacheLength = 1;
    +		
    +		// track all options for minChars = 0
    +		stMatchSets[""] = [];
    +		
    +		// loop through the array and create a lookup structure
    +		for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
    +			var rawValue = options.data[i];
    +			// if rawValue is a string, make an array otherwise just reference the array
    +			rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;
    +			
    +			var value = options.formatMatch(rawValue, i+1, options.data.length);
    +			if ( value === false )
    +				continue;
    +				
    +			var firstChar = value.charAt(0).toLowerCase();
    +			// if no lookup array for this character exists, look it up now
    +			if( !stMatchSets[firstChar] ) 
    +				stMatchSets[firstChar] = [];
    +
    +			// if the match is a string
    +			var row = {
    +				value: value,
    +				data: rawValue,
    +				result: options.formatResult && options.formatResult(rawValue) || value
    +			};
    +			
    +			// push the current match into the set list
    +			stMatchSets[firstChar].push(row);
    +
    +			// keep track of minChars zero items
    +			if ( nullData++ < options.max ) {
    +				stMatchSets[""].push(row);
    +			}
    +		};
    +
    +		// add the data items to the cache
    +		$.each(stMatchSets, function(i, value) {
    +			// increase the cache size
    +			options.cacheLength++;
    +			// add to the cache
    +			add(i, value);
    +		});
    +	}
    +	
    +	// populate any existing data
    +	setTimeout(populate, 25);
    +	
    +	function flush(){
    +		data = {};
    +		length = 0;
    +	}
    +	
    +	return {
    +		flush: flush,
    +		add: add,
    +		populate: populate,
    +		load: function(q) {
    +			if (!options.cacheLength || !length)
    +				return null;
    +			/* 
    +			 * if dealing w/local data and matchContains than we must make sure
    +			 * to loop through all the data collections looking for matches
    +			 */
    +			if( !options.url && options.matchContains ){
    +				// track all matches
    +				var csub = [];
    +				// loop through all the data grids for matches
    +				for( var k in data ){
    +					// don't search through the stMatchSets[""] (minChars: 0) cache
    +					// this prevents duplicates
    +					if( k.length > 0 ){
    +						var c = data[k];
    +						$.each(c, function(i, x) {
    +							// if we've got a match, add it to the array
    +							if (matchSubset(x.value, q)) {
    +								csub.push(x);
    +							}
    +						});
    +					}
    +				}				
    +				return csub;
    +			} else 
    +			// if the exact item exists, use it
    +			if (data[q]){
    +				return data[q];
    +			} else
    +			if (options.matchSubset) {
    +				for (var i = q.length - 1; i >= options.minChars; i--) {
    +					var c = data[q.substr(0, i)];
    +					if (c) {
    +						var csub = [];
    +						$.each(c, function(i, x) {
    +							if (matchSubset(x.value, q)) {
    +								csub[csub.length] = x;
    +							}
    +						});
    +						return csub;
    +					}
    +				}
    +			}
    +			return null;
    +		}
    +	};
    +};
    +
    +$.Autocompleter.Select = function (options, input, select, config) {
    +	var CLASSES = {
    +		ACTIVE: "ac_over"
    +	};
    +	
    +	var listItems,
    +		active = -1,
    +		data,
    +		term = "",
    +		needsInit = true,
    +		element,
    +		list;
    +	
    +	// Create results
    +	function init() {
    +		if (!needsInit)
    +			return;
    +		element = $("<div/>")
    +		.hide()
    +		.addClass(options.resultsClass)
    +		.css("position", "absolute")
    +		.appendTo(document.body);
    +	
    +		list = $("<ul/>").appendTo(element).mouseover( function(event) {
    +			if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
    +	            active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
    +			    $(target(event)).addClass(CLASSES.ACTIVE);            
    +	        }
    +		}).click(function(event) {
    +			$(target(event)).addClass(CLASSES.ACTIVE);
    +			select();
    +			// TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
    +			input.focus();
    +			return false;
    +		}).mousedown(function() {
    +			config.mouseDownOnSelect = true;
    +		}).mouseup(function() {
    +			config.mouseDownOnSelect = false;
    +		});
    +		
    +		if( options.width > 0 )
    +			element.css("width", options.width);
    +			
    +		needsInit = false;
    +	} 
    +	
    +	function target(event) {
    +		var element = event.target;
    +		while(element && element.tagName != "LI")
    +			element = element.parentNode;
    +		// more fun with IE, sometimes event.target is empty, just ignore it then
    +		if(!element)
    +			return [];
    +		return element;
    +	}
    +
    +	function moveSelect(step) {
    +		listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
    +		movePosition(step);
    +        var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
    +        if(options.scroll) {
    +            var offset = 0;
    +            listItems.slice(0, active).each(function() {
    +				offset += this.offsetHeight;
    +			});
    +            if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
    +                list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
    +            } else if(offset < list.scrollTop()) {
    +                list.scrollTop(offset);
    +            }
    +        }
    +	};
    +	
    +	function movePosition(step) {
    +		active += step;
    +		if (active < 0) {
    +			active = listItems.size() - 1;
    +		} else if (active >= listItems.size()) {
    +			active = 0;
    +		}
    +	}
    +	
    +	function limitNumberOfItems(available) {
    +		return options.max && options.max < available
    +			? options.max
    +			: available;
    +	}
    +	
    +	function fillList() {
    +		list.empty();
    +		var max = limitNumberOfItems(data.length);
    +		for (var i=0; i < max; i++) {
    +			if (!data[i])
    +				continue;
    +			var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
    +			if ( formatted === false )
    +				continue;
    +			var li = $("<li/>").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
    +			$.data(li, "ac_data", data[i]);
    +		}
    +		listItems = list.find("li");
    +		if ( options.selectFirst ) {
    +			listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
    +			active = 0;
    +		}
    +		// apply bgiframe if available
    +		if ( $.fn.bgiframe )
    +			list.bgiframe();
    +	}
    +	
    +	return {
    +		display: function(d, q) {
    +			init();
    +			data = d;
    +			term = q;
    +			fillList();
    +		},
    +		next: function() {
    +			moveSelect(1);
    +		},
    +		prev: function() {
    +			moveSelect(-1);
    +		},
    +		pageUp: function() {
    +			if (active != 0 && active - 8 < 0) {
    +				moveSelect( -active );
    +			} else {
    +				moveSelect(-8);
    +			}
    +		},
    +		pageDown: function() {
    +			if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
    +				moveSelect( listItems.size() - 1 - active );
    +			} else {
    +				moveSelect(8);
    +			}
    +		},
    +		hide: function() {
    +			element && element.hide();
    +			listItems && listItems.removeClass(CLASSES.ACTIVE);
    +			active = -1;
    +		},
    +		visible : function() {
    +			return element && element.is(":visible");
    +		},
    +		current: function() {
    +			return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
    +		},
    +		show: function() {
    +			var offset = $(input).offset();
    +			element.css({
    +				width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
    +				top: offset.top + input.offsetHeight,
    +				left: offset.left
    +			}).show();
    +            if(options.scroll) {
    +                list.scrollTop(0);
    +                list.css({
    +					maxHeight: options.scrollHeight,
    +					overflow: 'auto'
    +				});
    +				
    +                if($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
    +					var listHeight = 0;
    +					listItems.each(function() {
    +						listHeight += this.offsetHeight;
    +					});
    +					var scrollbarsVisible = listHeight > options.scrollHeight;
    +                    list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
    +					if (!scrollbarsVisible) {
    +						// IE doesn't recalculate width when scrollbar disappears
    +						listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
    +					}
    +                }
    +                
    +            }
    +		},
    +		selected: function() {
    +			var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
    +			return selected && selected.length && $.data(selected[0], "ac_data");
    +		},
    +		emptyList: function (){
    +			list && list.empty();
    +		},
    +		unbind: function() {
    +			element && element.remove();
    +		}
    +	};
    +};
    +
    +$.fn.selection = function(start, end) {
    +	if (start !== undefined) {
    +		return this.each(function() {
    +			if( this.createTextRange ){
    +				var selRange = this.createTextRange();
    +				if (end === undefined || start == end) {
    +					selRange.move("character", start);
    +					selRange.select();
    +				} else {
    +					selRange.collapse(true);
    +					selRange.moveStart("character", start);
    +					selRange.moveEnd("character", end);
    +					selRange.select();
    +				}
    +			} else if( this.setSelectionRange ){
    +				this.setSelectionRange(start, end);
    +			} else if( this.selectionStart ){
    +				this.selectionStart = start;
    +				this.selectionEnd = end;
    +			}
    +		});
    +	}
    +	var field = this[0];
    +	if ( field.createTextRange ) {
    +		var range = document.selection.createRange(),
    +			orig = field.value,
    +			teststring = "<->",
    +			textLength = range.text.length;
    +		range.text = teststring;
    +		var caretAt = field.value.indexOf(teststring);
    +		field.value = orig;
    +		this.selection(caretAt, caretAt + textLength);
    +		return {
    +			start: caretAt,
    +			end: caretAt + textLength
    +		}
    +	} else if( field.selectionStart !== undefined ){
    +		return {
    +			start: field.selectionStart,
    +			end: field.selectionEnd
    +		}
    +	}
    +};
    +
    +})(jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery/jquery-autocomplete/jquery.autocomplete.min.js b/src/main/webapp/plug-in/jquery/jquery-autocomplete/jquery.autocomplete.min.js
    new file mode 100644
    index 00000000..abc18636
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery-autocomplete/jquery.autocomplete.min.js
    @@ -0,0 +1,13 @@
    +/*
    + * jQuery Autocomplete plugin 1.1
    + *
    + * Copyright (c) 2009 J枚rn Zaefferer
    + *
    + * Dual licensed under the MIT and GPL licenses:
    + *   http://www.opensource.org/licenses/mit-license.php
    + *   http://www.gnu.org/licenses/gpl.html
    + *
    + * Revision: $Id: jquery.autocomplete.min.js,v 1.1 2012/12/05 01:39:35 ghp Exp $
    + */(function($){$.fn.extend({autocomplete:function(urlOrData,options){var isUrl=typeof urlOrData=="string";options=$.extend({},$.Autocompleter.defaults,{url:isUrl?urlOrData:null,data:isUrl?null:urlOrData,delay:isUrl?$.Autocompleter.defaults.delay:10,max:options&&!options.scroll?10:150},options);options.highlight=options.highlight||function(value){return value;};options.formatMatch=options.formatMatch||options.formatItem;return this.each(function(){new $.Autocompleter(this,options);});},result:function(handler){return this.bind("result",handler);},search:function(handler){return this.trigger("search",[handler]);},flushCache:function(){return this.trigger("flushCache");},setOptions:function(options){return this.trigger("setOptions",[options]);},unautocomplete:function(){return this.trigger("unautocomplete");}});$.Autocompleter=function(input,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var $input=$(input).attr("autocomplete","off").addClass(options.inputClass);var timeout;var previousValue="";var cache=$.Autocompleter.Cache(options);var hasFocus=0;var lastKeyPressCode;var config={mouseDownOnSelect:false};var select=$.Autocompleter.Select(options,input,selectCurrent,config);var blockSubmit;$.browser.opera&&$(input.form).bind("submit.autocomplete",function(){if(blockSubmit){blockSubmit=false;return false;}});$input.bind(($.browser.opera?"keypress":"keydown")+".autocomplete",function(event){hasFocus=1;lastKeyPressCode=event.keyCode;switch(event.keyCode){case KEY.UP:event.preventDefault();if(select.visible()){select.prev();}else{onChange(0,true);}break;case KEY.DOWN:event.preventDefault();if(select.visible()){select.next();}else{onChange(0,true);}break;case KEY.PAGEUP:event.preventDefault();if(select.visible()){select.pageUp();}else{onChange(0,true);}break;case KEY.PAGEDOWN:event.preventDefault();if(select.visible()){select.pageDown();}else{onChange(0,true);}break;case options.multiple&&$.trim(options.multipleSeparator)==","&&KEY.COMMA:case KEY.TAB:case KEY.RETURN:if(selectCurrent()){event.preventDefault();blockSubmit=true;return false;}break;case KEY.ESC:select.hide();break;default:clearTimeout(timeout);timeout=setTimeout(onChange,options.delay);break;}}).focus(function(){hasFocus++;}).blur(function(){hasFocus=0;if(!config.mouseDownOnSelect){hideResults();}}).click(function(){if(hasFocus++>1&&!select.visible()){onChange(0,true);}}).bind("search",function(){var fn=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,data){var result;if(data&&data.length){for(var i=0;i<data.length;i++){if(data[i].result.toLowerCase()==q.toLowerCase()){result=data[i];break;}}}if(typeof fn=="function")fn(result);else $input.trigger("result",result&&[result.data,result.value]);}$.each(trimWords($input.val()),function(i,value){request(value,findValueCallback,findValueCallback);});}).bind("flushCache",function(){cache.flush();}).bind("setOptions",function(){$.extend(options,arguments[1]);if("data"in arguments[1])cache.populate();}).bind("unautocomplete",function(){select.unbind();$input.unbind();$(input.form).unbind(".autocomplete");});function selectCurrent(){var selected=select.selected();if(!selected)return false;var v=selected.result;previousValue=v;if(options.multiple){var words=trimWords($input.val());if(words.length>1){var seperator=options.multipleSeparator.length;var cursorAt=$(input).selection().start;var wordAt,progress=0;$.each(words,function(i,word){progress+=word.length;if(cursorAt<=progress){wordAt=i;return false;}progress+=seperator;});words[wordAt]=v;v=words.join(options.multipleSeparator);}v+=options.multipleSeparator;}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true;}function onChange(crap,skipPrevCheck){if(lastKeyPressCode==KEY.DEL){select.hide();return;}var currentValue=$input.val();if(!skipPrevCheck&&currentValue==previousValue)return;previousValue=currentValue;currentValue=lastWord(currentValue);if(currentValue.length>=options.minChars){$input.addClass(options.loadingClass);if(!options.matchCase)currentValue=currentValue.toLowerCase();request(currentValue,receiveData,hideResultsNow);}else{stopLoading();select.hide();}};function trimWords(value){if(!value)return[""];if(!options.multiple)return[$.trim(value)];return $.map(value.split(options.multipleSeparator),function(word){return $.trim(value).length?$.trim(word):null;});}function lastWord(value){if(!options.multiple)return value;var words=trimWords(value);if(words.length==1)return words[0];var cursorAt=$(input).selection().start;if(cursorAt==value.length){words=trimWords(value)}else{words=trimWords(value.replace(value.substring(cursorAt),""));}return words[words.length-1];}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=KEY.BACKSPACE){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));$(input).selection(previousValue.length,previousValue.length+sValue.length);}};function hideResults(){clearTimeout(timeout);timeout=setTimeout(hideResultsNow,200);};function hideResultsNow(){var wasVisible=select.visible();select.hide();clearTimeout(timeout);stopLoading();if(options.mustMatch){$input.search(function(result){if(!result){if(options.multiple){var words=trimWords($input.val()).slice(0,-1);$input.val(words.join(options.multipleSeparator)+(words.length?options.multipleSeparator:""));}else{$input.val("");$input.trigger("result",null);}}});}};function receiveData(q,data){if(data&&data.length&&hasFocus){stopLoading();select.display(data,q);autoFill(q,data[0].value);select.show();}else{hideResultsNow();}};function request(term,success,failure){if(!options.matchCase)term=term.toLowerCase();var data=cache.load(term);if(data&&data.length){success(term,data);}else if((typeof options.url=="string")&&(options.url.length>0)){var extraParams={timestamp:+new Date()};$.each(options.extraParams,function(key,param){extraParams[key]=typeof param=="function"?param():param;});$.ajax({mode:"abort",port:"autocomplete"+input.name,dataType:options.dataType,url:options.url,data:$.extend({q:lastWord(term),limit:options.max},extraParams),success:function(data){var parsed=options.parse&&options.parse(data)||parse(data);cache.add(term,parsed);success(term,parsed);}});}else{select.emptyList();failure(term);}};function parse(data){var parsed=[];var rows=data.split("\n");for(var i=0;i<rows.length;i++){var row=$.trim(rows[i]);if(row){row=row.split("|");parsed[parsed.length]={data:row,value:row[0],result:options.formatResult&&options.formatResult(row,row[0])||row[0]};}}return parsed;};function stopLoading(){$input.removeClass(options.loadingClass);};};$.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:400,matchCase:false,matchSubset:true,matchContains:false,cacheLength:10,max:100,mustMatch:false,extraParams:{},selectFirst:true,formatItem:function(row){return row[0];},formatMatch:null,autoFill:false,width:0,multiple:false,multipleSeparator:", ",highlight:function(value,term){return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>");},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(options){var data={};var length=0;function matchSubset(s,sub){if(!options.matchCase)s=s.toLowerCase();var i=s.indexOf(sub);if(options.matchContains=="word"){i=s.toLowerCase().search("\\b"+sub.toLowerCase());}if(i==-1)return false;return i==0||options.matchContains;};function add(q,value){if(length>options.cacheLength){flush();}if(!data[q]){length++;}data[q]=value;}function populate(){if(!options.data)return false;var stMatchSets={},nullData=0;if(!options.url)options.cacheLength=1;stMatchSets[""]=[];for(var i=0,ol=options.data.length;i<ol;i++){var rawValue=options.data[i];rawValue=(typeof rawValue=="string")?[rawValue]:rawValue;var value=options.formatMatch(rawValue,i+1,options.data.length);if(value===false)continue;var firstChar=value.charAt(0).toLowerCase();if(!stMatchSets[firstChar])stMatchSets[firstChar]=[];var row={value:value,data:rawValue,result:options.formatResult&&options.formatResult(rawValue)||value};stMatchSets[firstChar].push(row);if(nullData++<options.max){stMatchSets[""].push(row);}};$.each(stMatchSets,function(i,value){options.cacheLength++;add(i,value);});}setTimeout(populate,25);function flush(){data={};length=0;}return{flush:flush,add:add,populate:populate,load:function(q){if(!options.cacheLength||!length)return null;if(!options.url&&options.matchContains){var csub=[];for(var k in data){if(k.length>0){var c=data[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub.push(x);}});}}return csub;}else
    +if(data[q]){return data[q];}else
    +if(options.matchSubset){for(var i=q.length-1;i>=options.minChars;i--){var c=data[q.substr(0,i)];if(c){var csub=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub[csub.length]=x;}});return csub;}}}return null;}};};$.Autocompleter.Select=function(options,input,select,config){var CLASSES={ACTIVE:"ac_over"};var listItems,active=-1,data,term="",needsInit=true,element,list;function init(){if(!needsInit)return;element=$("<div/>").hide().addClass(options.resultsClass).css("position","absolute").appendTo(document.body);list=$("<ul/>").appendTo(element).mouseover(function(event){if(target(event).nodeName&&target(event).nodeName.toUpperCase()=='LI'){active=$("li",list).removeClass(CLASSES.ACTIVE).index(target(event));$(target(event)).addClass(CLASSES.ACTIVE);}}).click(function(event){$(target(event)).addClass(CLASSES.ACTIVE);select();input.focus();return false;}).mousedown(function(){config.mouseDownOnSelect=true;}).mouseup(function(){config.mouseDownOnSelect=false;});if(options.width>0)element.css("width",options.width);needsInit=false;}function target(event){var element=event.target;while(element&&element.tagName!="LI")element=element.parentNode;if(!element)return[];return element;}function moveSelect(step){listItems.slice(active,active+1).removeClass(CLASSES.ACTIVE);movePosition(step);var activeItem=listItems.slice(active,active+1).addClass(CLASSES.ACTIVE);if(options.scroll){var offset=0;listItems.slice(0,active).each(function(){offset+=this.offsetHeight;});if((offset+activeItem[0].offsetHeight-list.scrollTop())>list[0].clientHeight){list.scrollTop(offset+activeItem[0].offsetHeight-list.innerHeight());}else if(offset<list.scrollTop()){list.scrollTop(offset);}}};function movePosition(step){active+=step;if(active<0){active=listItems.size()-1;}else if(active>=listItems.size()){active=0;}}function limitNumberOfItems(available){return options.max&&options.max<available?options.max:available;}function fillList(){list.empty();var max=limitNumberOfItems(data.length);for(var i=0;i<max;i++){if(!data[i])continue;var formatted=options.formatItem(data[i].data,i+1,max,data[i].value,term);if(formatted===false)continue;var li=$("<li/>").html(options.highlight(formatted,term)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(list)[0];$.data(li,"ac_data",data[i]);}listItems=list.find("li");if(options.selectFirst){listItems.slice(0,1).addClass(CLASSES.ACTIVE);active=0;}if($.fn.bgiframe)list.bgiframe();}return{display:function(d,q){init();data=d;term=q;fillList();},next:function(){moveSelect(1);},prev:function(){moveSelect(-1);},pageUp:function(){if(active!=0&&active-8<0){moveSelect(-active);}else{moveSelect(-8);}},pageDown:function(){if(active!=listItems.size()-1&&active+8>listItems.size()){moveSelect(listItems.size()-1-active);}else{moveSelect(8);}},hide:function(){element&&element.hide();listItems&&listItems.removeClass(CLASSES.ACTIVE);active=-1;},visible:function(){return element&&element.is(":visible");},current:function(){return this.visible()&&(listItems.filter("."+CLASSES.ACTIVE)[0]||options.selectFirst&&listItems[0]);},show:function(){var offset=$(input).offset();element.css({width:typeof options.width=="string"||options.width>0?options.width:$(input).width(),top:offset.top+input.offsetHeight,left:offset.left}).show();if(options.scroll){list.scrollTop(0);list.css({maxHeight:options.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var listHeight=0;listItems.each(function(){listHeight+=this.offsetHeight;});var scrollbarsVisible=listHeight>options.scrollHeight;list.css('height',scrollbarsVisible?options.scrollHeight:listHeight);if(!scrollbarsVisible){listItems.width(list.width()-parseInt(listItems.css("padding-left"))-parseInt(listItems.css("padding-right")));}}}},selected:function(){var selected=listItems&&listItems.filter("."+CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);return selected&&selected.length&&$.data(selected[0],"ac_data");},emptyList:function(){list&&list.empty();},unbind:function(){element&&element.remove();}};};$.fn.selection=function(start,end){if(start!==undefined){return this.each(function(){if(this.createTextRange){var selRange=this.createTextRange();if(end===undefined||start==end){selRange.move("character",start);selRange.select();}else{selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}}else if(this.setSelectionRange){this.setSelectionRange(start,end);}else if(this.selectionStart){this.selectionStart=start;this.selectionEnd=end;}});}var field=this[0];if(field.createTextRange){var range=document.selection.createRange(),orig=field.value,teststring="<->",textLength=range.text.length;range.text=teststring;var caretAt=field.value.indexOf(teststring);field.value=orig;this.selection(caretAt,caretAt+textLength);return{start:caretAt,end:caretAt+textLength}}else if(field.selectionStart!==undefined){return{start:field.selectionStart,end:field.selectionEnd}}};})(jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery/jquery-autocomplete/jquery.autocomplete.pack.js b/src/main/webapp/plug-in/jquery/jquery-autocomplete/jquery.autocomplete.pack.js
    new file mode 100644
    index 00000000..32286fe8
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery-autocomplete/jquery.autocomplete.pack.js
    @@ -0,0 +1,12 @@
    +/*
    + * jQuery Autocomplete plugin 1.1
    + *
    + * Copyright (c) 2009 J枚rn Zaefferer
    + *
    + * Dual licensed under the MIT and GPL licenses:
    + *   http://www.opensource.org/licenses/mit-license.php
    + *   http://www.gnu.org/licenses/gpl.html
    + *
    + * Revision: $Id: jquery.autocomplete.pack.js,v 1.1 2012/12/05 01:39:35 ghp Exp $
    + */
    +eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';(3($){$.2e.1u({19:3(b,d){5 c=W b=="1B";d=$.1u({},$.M.1T,{Y:c?b:P,y:c?P:b,1J:c?$.M.1T.1J:10,X:d&&!d.1D?10:48},d);d.1y=d.1y||3(a){6 a};d.1v=d.1v||d.1R;6 A.I(3(){1M $.M(A,d)})},L:3(a){6 A.11("L",a)},1k:3(a){6 A.14("1k",[a])},2b:3(){6 A.14("2b")},28:3(a){6 A.14("28",[a])},24:3(){6 A.14("24")}});$.M=3(o,r){5 t={2Y:38,2S:40,2N:46,2I:9,2E:13,2B:27,2x:3I,2v:33,2p:34,2n:8};5 u=$(o).3r("19","3o").Q(r.2Q);5 p;5 m="";5 n=$.M.3c(r);5 s=0;5 k;5 h={1F:C};5 l=$.M.32(r,o,1Z,h);5 j;$.1Y.2X&&$(o.2U).11("45.19",3(){4(j){j=C;6 C}});u.11(($.1Y.2X?"43":"42")+".19",3(a){s=1;k=a.2M;3V(a.2M){O t.2Y:a.1d();4(l.N()){l.30()}w{12(0,D)}R;O t.2S:a.1d();4(l.N()){l.2D()}w{12(0,D)}R;O t.2v:a.1d();4(l.N()){l.2C()}w{12(0,D)}R;O t.2p:a.1d();4(l.N()){l.2A()}w{12(0,D)}R;O r.17&&$.1c(r.S)==","&&t.2x:O t.2I:O t.2E:4(1Z()){a.1d();j=D;6 C}R;O t.2B:l.Z();R;3J:1P(p);p=1O(12,r.1J);R}}).2t(3(){s++}).3E(3(){s=0;4(!h.1F){2r()}}).2q(3(){4(s++>1&&!l.N()){12(0,D)}}).11("1k",3(){5 c=(1r.7>1)?1r[1]:P;3 1N(q,a){5 b;4(a&&a.7){16(5 i=0;i<a.7;i++){4(a[i].L.J()==q.J()){b=a[i];R}}}4(W c=="3")c(b);w u.14("L",b&&[b.y,b.F])}$.I(15(u.K()),3(i,a){21(a,1N,1N)})}).11("2b",3(){n.1o()}).11("28",3(){$.1u(r,1r[1]);4("y"2h 1r[1])n.1e()}).11("24",3(){l.1p();u.1p();$(o.2U).1p(".19")});3 1Z(){5 e=l.2g();4(!e)6 C;5 v=e.L;m=v;4(r.17){5 b=15(u.K());4(b.7>1){5 f=r.S.7;5 c=$(o).18().1I;5 d,1H=0;$.I(b,3(i,a){1H+=a.7;4(c<=1H){d=i;6 C}1H+=f});b[d]=v;v=b.3f(r.S)}v+=r.S}u.K(v);1l();u.14("L",[e.y,e.F]);6 D}3 12(b,c){4(k==t.2N){l.Z();6}5 a=u.K();4(!c&&a==m)6;m=a;a=1m(a);4(a.7>=r.29){u.Q(r.26);4(!r.1s)a=a.J();21(a,3a,1l)}w{1q();l.Z()}};3 15(b){4(!b)6[""];4(!r.17)6[$.1c(b)];6 $.4h(b.23(r.S),3(a){6 $.1c(b).7?$.1c(a):P})}3 1m(a){4(!r.17)6 a;5 c=15(a);4(c.7==1)6 c[0];5 b=$(o).18().1I;4(b==a.7){c=15(a)}w{c=15(a.22(a.37(b),""))}6 c[c.7-1]}3 1G(q,a){4(r.1G&&(1m(u.K()).J()==q.J())&&k!=t.2n){u.K(u.K()+a.37(1m(m).7));$(o).18(m.7,m.7+a.7)}};3 2r(){1P(p);p=1O(1l,4g)};3 1l(){5 c=l.N();l.Z();1P(p);1q();4(r.36){u.1k(3(a){4(!a){4(r.17){5 b=15(u.K()).1n(0,-1);u.K(b.3f(r.S)+(b.7?r.S:""))}w{u.K("");u.14("L",P)}}})}};3 3a(q,a){4(a&&a.7&&s){1q();l.35(a,q);1G(q,a[0].F);l.20()}w{1l()}};3 21(f,d,g){4(!r.1s)f=f.J();5 e=n.31(f);4(e&&e.7){d(f,e)}w 4((W r.Y=="1B")&&(r.Y.7>0)){5 c={4f:+1M 4e()};$.I(r.2Z,3(a,b){c[a]=W b=="3"?b():b});$.4d({4c:"4b",4a:"19"+o.49,2V:r.2V,Y:r.Y,y:$.1u({q:1m(f),47:r.X},c),44:3(a){5 b=r.1A&&r.1A(a)||1A(a);n.1i(f,b);d(f,b)}})}w{l.2T();g(f)}};3 1A(c){5 d=[];5 b=c.23("\\n");16(5 i=0;i<b.7;i++){5 a=$.1c(b[i]);4(a){a=a.23("|");d[d.7]={y:a,F:a[0],L:r.1z&&r.1z(a,a[0])||a[0]}}}6 d};3 1q(){u.1h(r.26)}};$.M.1T={2Q:"41",2P:"3Z",26:"3Y",29:1,1J:3W,1s:C,1f:D,1w:C,1g:10,X:3U,36:C,2Z:{},1X:D,1R:3(a){6 a[0]},1v:P,1G:C,E:0,17:C,S:", ",1y:3(b,a){6 b.22(1M 3T("(?![^&;]+;)(?!<[^<>]*)("+a.22(/([\\^\\$\\(\\)\\[\\]\\{\\}\\*\\.\\+\\?\\|\\\\])/2K,"\\\\$1")+")(?![^<>]*>)(?![^&;]+;)","2K"),"<2J>$1</2J>")},1D:D,1E:3S};$.M.3c=3(g){5 h={};5 j=0;3 1f(s,a){4(!g.1s)s=s.J();5 i=s.2H(a);4(g.1w=="3R"){i=s.J().1k("\\\\b"+a.J())}4(i==-1)6 C;6 i==0||g.1w};3 1i(q,a){4(j>g.1g){1o()}4(!h[q]){j++}h[q]=a}3 1e(){4(!g.y)6 C;5 f={},2G=0;4(!g.Y)g.1g=1;f[""]=[];16(5 i=0,2F=g.y.7;i<2F;i++){5 c=g.y[i];c=(W c=="1B")?[c]:c;5 d=g.1v(c,i+1,g.y.7);4(d===C)1V;5 e=d.3Q(0).J();4(!f[e])f[e]=[];5 b={F:d,y:c,L:g.1z&&g.1z(c)||d};f[e].1U(b);4(2G++<g.X){f[""].1U(b)}};$.I(f,3(i,a){g.1g++;1i(i,a)})}1O(1e,25);3 1o(){h={};j=0}6{1o:1o,1i:1i,1e:1e,31:3(q){4(!g.1g||!j)6 P;4(!g.Y&&g.1w){5 a=[];16(5 k 2h h){4(k.7>0){5 c=h[k];$.I(c,3(i,x){4(1f(x.F,q)){a.1U(x)}})}}6 a}w 4(h[q]){6 h[q]}w 4(g.1f){16(5 i=q.7-1;i>=g.29;i--){5 c=h[q.3O(0,i)];4(c){5 a=[];$.I(c,3(i,x){4(1f(x.F,q)){a[a.7]=x}});6 a}}}6 P}}};$.M.32=3(e,g,f,k){5 h={H:"3N"};5 j,z=-1,y,1t="",1S=D,G,B;3 2y(){4(!1S)6;G=$("<3M/>").Z().Q(e.2P).T("3L","3K").1Q(1K.2w);B=$("<3H/>").1Q(G).3G(3(a){4(U(a).2u&&U(a).2u.3F()==\'2s\'){z=$("1L",B).1h(h.H).3D(U(a));$(U(a)).Q(h.H)}}).2q(3(a){$(U(a)).Q(h.H);f();g.2t();6 C}).3C(3(){k.1F=D}).3B(3(){k.1F=C});4(e.E>0)G.T("E",e.E);1S=C}3 U(a){5 b=a.U;3A(b&&b.3z!="2s")b=b.3y;4(!b)6[];6 b}3 V(b){j.1n(z,z+1).1h(h.H);2o(b);5 a=j.1n(z,z+1).Q(h.H);4(e.1D){5 c=0;j.1n(0,z).I(3(){c+=A.1a});4((c+a[0].1a-B.1b())>B[0].3x){B.1b(c+a[0].1a-B.3w())}w 4(c<B.1b()){B.1b(c)}}};3 2o(a){z+=a;4(z<0){z=j.1j()-1}w 4(z>=j.1j()){z=0}}3 2m(a){6 e.X&&e.X<a?e.X:a}3 2l(){B.2z();5 b=2m(y.7);16(5 i=0;i<b;i++){4(!y[i])1V;5 a=e.1R(y[i].y,i+1,b,y[i].F,1t);4(a===C)1V;5 c=$("<1L/>").3v(e.1y(a,1t)).Q(i%2==0?"3u":"3P").1Q(B)[0];$.y(c,"2k",y[i])}j=B.3t("1L");4(e.1X){j.1n(0,1).Q(h.H);z=0}4($.2e.2W)B.2W()}6{35:3(d,q){2y();y=d;1t=q;2l()},2D:3(){V(1)},30:3(){V(-1)},2C:3(){4(z!=0&&z-8<0){V(-z)}w{V(-8)}},2A:3(){4(z!=j.1j()-1&&z+8>j.1j()){V(j.1j()-1-z)}w{V(8)}},Z:3(){G&&G.Z();j&&j.1h(h.H);z=-1},N:3(){6 G&&G.3s(":N")},3q:3(){6 A.N()&&(j.2j("."+h.H)[0]||e.1X&&j[0])},20:3(){5 a=$(g).3p();G.T({E:W e.E=="1B"||e.E>0?e.E:$(g).E(),2i:a.2i+g.1a,1W:a.1W}).20();4(e.1D){B.1b(0);B.T({2L:e.1E,3n:\'3X\'});4($.1Y.3m&&W 1K.2w.3l.2L==="1x"){5 c=0;j.I(3(){c+=A.1a});5 b=c>e.1E;B.T(\'3k\',b?e.1E:c);4(!b){j.E(B.E()-2R(j.T("2O-1W"))-2R(j.T("2O-3j")))}}}},2g:3(){5 a=j&&j.2j("."+h.H).1h(h.H);6 a&&a.7&&$.y(a[0],"2k")},2T:3(){B&&B.2z()},1p:3(){G&&G.3i()}}};$.2e.18=3(b,f){4(b!==1x){6 A.I(3(){4(A.2d){5 a=A.2d();4(f===1x||b==f){a.4n("2c",b);a.3h()}w{a.4m(D);a.4l("2c",b);a.4k("2c",f);a.3h()}}w 4(A.3g){A.3g(b,f)}w 4(A.1C){A.1C=b;A.3e=f}})}5 c=A[0];4(c.2d){5 e=1K.18.4j(),3d=c.F,2a="<->",2f=e.3b.7;e.3b=2a;5 d=c.F.2H(2a);c.F=3d;A.18(d,d+2f);6{1I:d,39:d+2f}}w 4(c.1C!==1x){6{1I:c.1C,39:c.3e}}}})(4i);',62,272,'|||function|if|var|return|length|||||||||||||||||||||||||else||data|active|this|list|false|true|width|value|element|ACTIVE|each|toLowerCase|val|result|Autocompleter|visible|case|null|addClass|break|multipleSeparator|css|target|moveSelect|typeof|max|url|hide||bind|onChange||trigger|trimWords|for|multiple|selection|autocomplete|offsetHeight|scrollTop|trim|preventDefault|populate|matchSubset|cacheLength|removeClass|add|size|search|hideResultsNow|lastWord|slice|flush|unbind|stopLoading|arguments|matchCase|term|extend|formatMatch|matchContains|undefined|highlight|formatResult|parse|string|selectionStart|scroll|scrollHeight|mouseDownOnSelect|autoFill|progress|start|delay|document|li|new|findValueCallback|setTimeout|clearTimeout|appendTo|formatItem|needsInit|defaults|push|continue|left|selectFirst|browser|selectCurrent|show|request|replace|split|unautocomplete||loadingClass||setOptions|minChars|teststring|flushCache|character|createTextRange|fn|textLength|selected|in|top|filter|ac_data|fillList|limitNumberOfItems|BACKSPACE|movePosition|PAGEDOWN|click|hideResults|LI|focus|nodeName|PAGEUP|body|COMMA|init|empty|pageDown|ESC|pageUp|next|RETURN|ol|nullData|indexOf|TAB|strong|gi|maxHeight|keyCode|DEL|padding|resultsClass|inputClass|parseInt|DOWN|emptyList|form|dataType|bgiframe|opera|UP|extraParams|prev|load|Select|||display|mustMatch|substring||end|receiveData|text|Cache|orig|selectionEnd|join|setSelectionRange|select|remove|right|height|style|msie|overflow|off|offset|current|attr|is|find|ac_even|html|innerHeight|clientHeight|parentNode|tagName|while|mouseup|mousedown|index|blur|toUpperCase|mouseover|ul|188|default|absolute|position|div|ac_over|substr|ac_odd|charAt|word|180|RegExp|100|switch|400|auto|ac_loading|ac_results||ac_input|keydown|keypress|success|submit||limit|150|name|port|abort|mode|ajax|Date|timestamp|200|map|jQuery|createRange|moveEnd|moveStart|collapse|move'.split('|'),0,{}))
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery/jquery-autocomplete/lib/jquery.ajaxQueue.js b/src/main/webapp/plug-in/jquery/jquery-autocomplete/lib/jquery.ajaxQueue.js
    new file mode 100644
    index 00000000..ca42082a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery-autocomplete/lib/jquery.ajaxQueue.js
    @@ -0,0 +1,116 @@
    +/**
    + * Ajax Queue Plugin
    + * 
    + * Homepage: http://jquery.com/plugins/project/ajaxqueue
    + * Documentation: http://docs.jquery.com/AjaxQueue
    + */
    +
    +/**
    +
    +<script>
    +$(function(){
    +	jQuery.ajaxQueue({
    +		url: "test.php",
    +		success: function(html){ jQuery("ul").append(html); }
    +	});
    +	jQuery.ajaxQueue({
    +		url: "test.php",
    +		success: function(html){ jQuery("ul").append(html); }
    +	});
    +	jQuery.ajaxSync({
    +		url: "test.php",
    +		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
    +	});
    +	jQuery.ajaxSync({
    +		url: "test.php",
    +		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
    +	});
    +});
    +</script>
    +<ul style="position: absolute; top: 5px; right: 5px;"></ul>
    +
    + */
    +/*
    + * Queued Ajax requests.
    + * A new Ajax request won't be started until the previous queued 
    + * request has finished.
    + */
    +
    +/*
    + * Synced Ajax requests.
    + * The Ajax request will happen as soon as you call this method, but
    + * the callbacks (success/error/complete) won't fire until all previous
    + * synced requests have been completed.
    + */
    +
    +
    +(function($) {
    +	
    +	var ajax = $.ajax;
    +	
    +	var pendingRequests = {};
    +	
    +	var synced = [];
    +	var syncedData = [];
    +	
    +	$.ajax = function(settings) {
    +		// create settings for compatibility with ajaxSetup
    +		settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings));
    +		
    +		var port = settings.port;
    +		
    +		switch(settings.mode) {
    +		case "abort": 
    +			if ( pendingRequests[port] ) {
    +				pendingRequests[port].abort();
    +			}
    +			return pendingRequests[port] = ajax.apply(this, arguments);
    +		case "queue": 
    +			var _old = settings.complete;
    +			settings.complete = function(){
    +				if ( _old )
    +					_old.apply( this, arguments );
    +				jQuery([ajax]).dequeue("ajax" + port );;
    +			};
    +		
    +			jQuery([ ajax ]).queue("ajax" + port, function(){
    +				ajax( settings );
    +			});
    +			return;
    +		case "sync":
    +			var pos = synced.length;
    +	
    +			synced[ pos ] = {
    +				error: settings.error,
    +				success: settings.success,
    +				complete: settings.complete,
    +				done: false
    +			};
    +		
    +			syncedData[ pos ] = {
    +				error: [],
    +				success: [],
    +				complete: []
    +			};
    +		
    +			settings.error = function(){ syncedData[ pos ].error = arguments; };
    +			settings.success = function(){ syncedData[ pos ].success = arguments; };
    +			settings.complete = function(){
    +				syncedData[ pos ].complete = arguments;
    +				synced[ pos ].done = true;
    +		
    +				if ( pos == 0 || !synced[ pos-1 ] )
    +					for ( var i = pos; i < synced.length && synced[i].done; i++ ) {
    +						if ( synced[i].error ) synced[i].error.apply( jQuery, syncedData[i].error );
    +						if ( synced[i].success ) synced[i].success.apply( jQuery, syncedData[i].success );
    +						if ( synced[i].complete ) synced[i].complete.apply( jQuery, syncedData[i].complete );
    +		
    +						synced[i] = null;
    +						syncedData[i] = null;
    +					}
    +			};
    +		}
    +		return ajax.apply(this, arguments);
    +	};
    +	
    +})(jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery/jquery-autocomplete/lib/jquery.bgiframe.min.js b/src/main/webapp/plug-in/jquery/jquery-autocomplete/lib/jquery.bgiframe.min.js
    new file mode 100644
    index 00000000..7faef4b3
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery-autocomplete/lib/jquery.bgiframe.min.js
    @@ -0,0 +1,10 @@
    +/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
    + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
    + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
    + *
    + * $LastChangedDate: 2007-07-22 01:45:56 +0200 (Son, 22 Jul 2007) $
    + * $Rev: 2447 $
    + *
    + * Version 2.1.1
    + */
    +(function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+'style="display:block;position:absolute;z-index:-1;'+(s.opacity!==false?'filter:Alpha(Opacity=\'0\');':'')+'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+'"/>';return this.each(function(){if($('> iframe.bgiframe',this).length==0)this.insertBefore(document.createElement(html),this.firstChild);});}return this;};})(jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery/jquery-autocomplete/lib/thickbox-compressed.js b/src/main/webapp/plug-in/jquery/jquery-autocomplete/lib/thickbox-compressed.js
    new file mode 100644
    index 00000000..28364be7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery-autocomplete/lib/thickbox-compressed.js
    @@ -0,0 +1,10 @@
    +/*
    + * Thickbox 3 - One Box To Rule Them All.
    + * By Cody Lindley (http://www.codylindley.com)
    + * Copyright (c) 2007 cody lindley
    + * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
    +*/
    +
    +var tb_pathToImage = "images/loadingAnimation.gif";
    +
    +eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('$(o).2S(9(){1u(\'a.18, 3n.18, 3i.18\');1w=1p 1t();1w.L=2H});9 1u(b){$(b).s(9(){6 t=X.Q||X.1v||M;6 a=X.u||X.23;6 g=X.1N||P;19(t,a,g);X.2E();H P})}9 19(d,f,g){3m{3(2t o.v.J.2i==="2g"){$("v","11").r({A:"28%",z:"28%"});$("11").r("22","2Z");3(o.1Y("1F")===M){$("v").q("<U 5=\'1F\'></U><4 5=\'B\'></4><4 5=\'8\'></4>");$("#B").s(G)}}n{3(o.1Y("B")===M){$("v").q("<4 5=\'B\'></4><4 5=\'8\'></4>");$("#B").s(G)}}3(1K()){$("#B").1J("2B")}n{$("#B").1J("2z")}3(d===M){d=""}$("v").q("<4 5=\'K\'><1I L=\'"+1w.L+"\' /></4>");$(\'#K\').2y();6 h;3(f.O("?")!==-1){h=f.3l(0,f.O("?"))}n{h=f}6 i=/\\.2s$|\\.2q$|\\.2m$|\\.2l$|\\.2k$/;6 j=h.1C().2h(i);3(j==\'.2s\'||j==\'.2q\'||j==\'.2m\'||j==\'.2l\'||j==\'.2k\'){1D="";1G="";14="";1z="";1x="";R="";1n="";1r=P;3(g){E=$("a[@1N="+g+"]").36();25(D=0;((D<E.1c)&&(R===""));D++){6 k=E[D].u.1C().2h(i);3(!(E[D].u==f)){3(1r){1z=E[D].Q;1x=E[D].u;R="<1e 5=\'1X\'>&1d;&1d;<a u=\'#\'>2T &2R;</a></1e>"}n{1D=E[D].Q;1G=E[D].u;14="<1e 5=\'1U\'>&1d;&1d;<a u=\'#\'>&2O; 2N</a></1e>"}}n{1r=1b;1n="1t "+(D+1)+" 2L "+(E.1c)}}}S=1p 1t();S.1g=9(){S.1g=M;6 a=2x();6 x=a[0]-1M;6 y=a[1]-1M;6 b=S.z;6 c=S.A;3(b>x){c=c*(x/b);b=x;3(c>y){b=b*(y/c);c=y}}n 3(c>y){b=b*(y/c);c=y;3(b>x){c=c*(x/b);b=x}}13=b+30;1a=c+2G;$("#8").q("<a u=\'\' 5=\'1L\' Q=\'1o\'><1I 5=\'2F\' L=\'"+f+"\' z=\'"+b+"\' A=\'"+c+"\' 23=\'"+d+"\'/></a>"+"<4 5=\'2D\'>"+d+"<4 5=\'2C\'>"+1n+14+R+"</4></4><4 5=\'2A\'><a u=\'#\' 5=\'Z\' Q=\'1o\'>1l</a> 1k 1j 1s</4>");$("#Z").s(G);3(!(14==="")){9 12(){3($(o).N("s",12)){$(o).N("s",12)}$("#8").C();$("v").q("<4 5=\'8\'></4>");19(1D,1G,g);H P}$("#1U").s(12)}3(!(R==="")){9 1i(){$("#8").C();$("v").q("<4 5=\'8\'></4>");19(1z,1x,g);H P}$("#1X").s(1i)}o.1h=9(e){3(e==M){I=2w.2v}n{I=e.2u}3(I==27){G()}n 3(I==3k){3(!(R=="")){o.1h="";1i()}}n 3(I==3j){3(!(14=="")){o.1h="";12()}}};16();$("#K").C();$("#1L").s(G);$("#8").r({Y:"T"})};S.L=f}n{6 l=f.2r(/^[^\\?]+\\??/,\'\');6 m=2p(l);13=(m[\'z\']*1)+30||3h;1a=(m[\'A\']*1)+3g||3f;W=13-30;V=1a-3e;3(f.O(\'2j\')!=-1){1E=f.1B(\'3d\');$("#15").C();3(m[\'1A\']!="1b"){$("#8").q("<4 5=\'2f\'><4 5=\'1H\'>"+d+"</4><4 5=\'2e\'><a u=\'#\' 5=\'Z\' Q=\'1o\'>1l</a> 1k 1j 1s</4></4><U 1W=\'0\' 2d=\'0\' L=\'"+1E[0]+"\' 5=\'15\' 1v=\'15"+1f.2c(1f.1y()*2b)+"\' 1g=\'1m()\' J=\'z:"+(W+29)+"p;A:"+(V+17)+"p;\' > </U>")}n{$("#B").N();$("#8").q("<U 1W=\'0\' 2d=\'0\' L=\'"+1E[0]+"\' 5=\'15\' 1v=\'15"+1f.2c(1f.1y()*2b)+"\' 1g=\'1m()\' J=\'z:"+(W+29)+"p;A:"+(V+17)+"p;\'> </U>")}}n{3($("#8").r("Y")!="T"){3(m[\'1A\']!="1b"){$("#8").q("<4 5=\'2f\'><4 5=\'1H\'>"+d+"</4><4 5=\'2e\'><a u=\'#\' 5=\'Z\'>1l</a> 1k 1j 1s</4></4><4 5=\'F\' J=\'z:"+W+"p;A:"+V+"p\'></4>")}n{$("#B").N();$("#8").q("<4 5=\'F\' 3c=\'3b\' J=\'z:"+W+"p;A:"+V+"p;\'></4>")}}n{$("#F")[0].J.z=W+"p";$("#F")[0].J.A=V+"p";$("#F")[0].3a=0;$("#1H").11(d)}}$("#Z").s(G);3(f.O(\'37\')!=-1){$("#F").q($(\'#\'+m[\'26\']).1T());$("#8").24(9(){$(\'#\'+m[\'26\']).q($("#F").1T())});16();$("#K").C();$("#8").r({Y:"T"})}n 3(f.O(\'2j\')!=-1){16();3($.1q.35){$("#K").C();$("#8").r({Y:"T"})}}n{$("#F").34(f+="&1y="+(1p 33().32()),9(){16();$("#K").C();1u("#F a.18");$("#8").r({Y:"T"})})}}3(!m[\'1A\']){o.21=9(e){3(e==M){I=2w.2v}n{I=e.2u}3(I==27){G()}}}}31(e){}}9 1m(){$("#K").C();$("#8").r({Y:"T"})}9 G(){$("#2Y").N("s");$("#Z").N("s");$("#8").2X("2W",9(){$(\'#8,#B,#1F\').2V("24").N().C()});$("#K").C();3(2t o.v.J.2i=="2g"){$("v","11").r({A:"1Z",z:"1Z"});$("11").r("22","")}o.1h="";o.21="";H P}9 16(){$("#8").r({2U:\'-\'+20((13/2),10)+\'p\',z:13+\'p\'});3(!(1V.1q.2Q&&1V.1q.2P<7)){$("#8").r({38:\'-\'+20((1a/2),10)+\'p\'})}}9 2p(a){6 b={};3(!a){H b}6 c=a.1B(/[;&]/);25(6 i=0;i<c.1c;i++){6 d=c[i].1B(\'=\');3(!d||d.1c!=2){39}6 e=2a(d[0]);6 f=2a(d[1]);f=f.2r(/\\+/g,\' \');b[e]=f}H b}9 2x(){6 a=o.2M;6 w=1S.2o||1R.2o||(a&&a.1Q)||o.v.1Q;6 h=1S.1P||1R.1P||(a&&a.2n)||o.v.2n;1O=[w,h];H 1O}9 1K(){6 a=2K.2J.1C();3(a.O(\'2I\')!=-1&&a.O(\'3o\')!=-1){H 1b}}',62,211,'|||if|div|id|var||TB_window|function||||||||||||||else|document|px|append|css|click||href|body||||width|height|TB_overlay|remove|TB_Counter|TB_TempArray|TB_ajaxContent|tb_remove|return|keycode|style|TB_load|src|null|unbind|indexOf|false|title|TB_NextHTML|imgPreloader|block|iframe|ajaxContentH|ajaxContentW|this|display|TB_closeWindowButton||html|goPrev|TB_WIDTH|TB_PrevHTML|TB_iframeContent|tb_position||thickbox|tb_show|TB_HEIGHT|true|length|nbsp|span|Math|onload|onkeydown|goNext|Esc|or|close|tb_showIframe|TB_imageCount|Close|new|browser|TB_FoundURL|Key|Image|tb_init|name|imgLoader|TB_NextURL|random|TB_NextCaption|modal|split|toLowerCase|TB_PrevCaption|urlNoQuery|TB_HideSelect|TB_PrevURL|TB_ajaxWindowTitle|img|addClass|tb_detectMacXFF|TB_ImageOff|150|rel|arrayPageSize|innerHeight|clientWidth|self|window|children|TB_prev|jQuery|frameborder|TB_next|getElementById|auto|parseInt|onkeyup|overflow|alt|unload|for|inlineId||100||unescape|1000|round|hspace|TB_closeAjaxWindow|TB_title|undefined|match|maxHeight|TB_iframe|bmp|gif|png|clientHeight|innerWidth|tb_parseQuery|jpeg|replace|jpg|typeof|which|keyCode|event|tb_getPageSize|show|TB_overlayBG|TB_closeWindow|TB_overlayMacFFBGHack|TB_secondLine|TB_caption|blur|TB_Image|60|tb_pathToImage|mac|userAgent|navigator|of|documentElement|Prev|lt|version|msie|gt|ready|Next|marginLeft|trigger|fast|fadeOut|TB_imageOff|hidden||catch|getTime|Date|load|safari|get|TB_inline|marginTop|continue|scrollTop|TB_modal|class|TB_|45|440|40|630|input|188|190|substr|try|area|firefox'.split('|'),0,{}))
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/jquery/jquery-autocomplete/lib/thickbox.css b/src/main/webapp/plug-in/jquery/jquery-autocomplete/lib/thickbox.css
    new file mode 100644
    index 00000000..d24b9bed
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery-autocomplete/lib/thickbox.css
    @@ -0,0 +1,163 @@
    +/* ----------------------------------------------------------------------------------------------------------------*/
    +/* ---------->>> global settings needed for thickbox <<<-----------------------------------------------------------*/
    +/* ----------------------------------------------------------------------------------------------------------------*/
    +*{padding: 0; margin: 0;}
    +
    +/* ----------------------------------------------------------------------------------------------------------------*/
    +/* ---------->>> thickbox specific link and font settings <<<------------------------------------------------------*/
    +/* ----------------------------------------------------------------------------------------------------------------*/
    +#TB_window {
    +	font: 12px Arial, Helvetica, sans-serif;
    +	color: #333333;
    +}
    +
    +#TB_secondLine {
    +	font: 10px Arial, Helvetica, sans-serif;
    +	color:#666666;
    +}
    +
    +#TB_window a:link {color: #666666;}
    +#TB_window a:visited {color: #666666;}
    +#TB_window a:hover {color: #000;}
    +#TB_window a:active {color: #666666;}
    +#TB_window a:focus{color: #666666;}
    +
    +/* ----------------------------------------------------------------------------------------------------------------*/
    +/* ---------->>> thickbox settings <<<-----------------------------------------------------------------------------*/
    +/* ----------------------------------------------------------------------------------------------------------------*/
    +#TB_overlay {
    +	position: fixed;
    +	z-index:100;
    +	top: 0px;
    +	left: 0px;
    +	height:100%;
    +	width:100%;
    +}
    +
    +.TB_overlayMacFFBGHack {background: url(macFFBgHack.png) repeat;}
    +.TB_overlayBG {
    +	background-color:#000;
    +	filter:alpha(opacity=75);
    +	-moz-opacity: 0.75;
    +	opacity: 0.75;
    +}
    +
    +* html #TB_overlay { /* ie6 hack */
    +     position: absolute;
    +     height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px');
    +}
    +
    +#TB_window {
    +	position: fixed;
    +	background: #ffffff;
    +	z-index: 102;
    +	color:#000000;
    +	display:none;
    +	border: 4px solid #525252;
    +	text-align:left;
    +	top:50%;
    +	left:50%;
    +}
    +
    +* html #TB_window { /* ie6 hack */
    +position: absolute;
    +margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px');
    +}
    +
    +#TB_window img#TB_Image {
    +	display:block;
    +	margin: 15px 0 0 15px;
    +	border-right: 1px solid #ccc;
    +	border-bottom: 1px solid #ccc;
    +	border-top: 1px solid #666;
    +	border-left: 1px solid #666;
    +}
    +
    +#TB_caption{
    +	height:25px;
    +	padding:7px 30px 10px 25px;
    +	float:left;
    +}
    +
    +#TB_closeWindow{
    +	height:25px;
    +	padding:11px 25px 10px 0;
    +	float:right;
    +}
    +
    +#TB_closeAjaxWindow{
    +	padding:7px 10px 5px 0;
    +	margin-bottom:1px;
    +	text-align:right;
    +	float:right;
    +}
    +
    +#TB_ajaxWindowTitle{
    +	float:left;
    +	padding:7px 0 5px 10px;
    +	margin-bottom:1px;
    +}
    +
    +#TB_title{
    +	background-color:#e8e8e8;
    +	height:27px;
    +}
    +
    +#TB_ajaxContent{
    +	clear:both;
    +	padding:2px 15px 15px 15px;
    +	overflow:auto;
    +	text-align:left;
    +	line-height:1.4em;
    +}
    +
    +#TB_ajaxContent.TB_modal{
    +	padding:15px;
    +}
    +
    +#TB_ajaxContent p{
    +	padding:5px 0px 5px 0px;
    +}
    +
    +#TB_load{
    +	position: fixed;
    +	display:none;
    +	height:13px;
    +	width:208px;
    +	z-index:103;
    +	top: 50%;
    +	left: 50%;
    +	margin: -6px 0 0 -104px; /* -height/2 0 0 -width/2 */
    +}
    +
    +* html #TB_load { /* ie6 hack */
    +position: absolute;
    +margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px');
    +}
    +
    +#TB_HideSelect{
    +	z-index:99;
    +	position:fixed;
    +	top: 0;
    +	left: 0;
    +	background-color:#fff;
    +	border:none;
    +	filter:alpha(opacity=0);
    +	-moz-opacity: 0;
    +	opacity: 0;
    +	height:100%;
    +	width:100%;
    +}
    +
    +* html #TB_HideSelect { /* ie6 hack */
    +     position: absolute;
    +     height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px');
    +}
    +
    +#TB_iframeContent{
    +	clear:both;
    +	border:none;
    +	margin-bottom:-1px;
    +	margin-top:1px;
    +	_margin-bottom:1px;
    +}
    diff --git a/src/main/webapp/plug-in/jquery/jquery.cookie.js b/src/main/webapp/plug-in/jquery/jquery.cookie.js
    new file mode 100644
    index 00000000..2d4c05a8
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery.cookie.js
    @@ -0,0 +1,72 @@
    +/*!
    + * jQuery Cookie Plugin v1.3
    + * https://github.com/carhartl/jquery-cookie
    + *
    + * Copyright 2011, Klaus Hartl
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://www.opensource.org/licenses/mit-license.php
    + * http://www.opensource.org/licenses/GPL-2.0
    + */
    +(function ($, document, undefined) {
    +
    +	var pluses = /\+/g;
    +
    +	function raw(s) {
    +		return s;
    +	}
    +
    +	function decoded(s) {
    +		return decodeURIComponent(s.replace(pluses, ' '));
    +	}
    +
    +	var config = $.cookie = function (key, value, options) {
    +
    +		// write
    +		if (value !== undefined) {
    +			options = $.extend({}, config.defaults, options);
    +
    +			if (value === null) {
    +				options.expires = -1;
    +			}
    +
    +			if (typeof options.expires === 'number') {
    +				var days = options.expires, t = options.expires = new Date();
    +				t.setDate(t.getDate() + days);
    +			}
    +
    +			value = config.json ? JSON.stringify(value) : String(value);
    +
    +			return (document.cookie = [
    +				encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value),
    +				options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
    +				options.path    ? '; path=' + options.path : '',
    +				options.domain  ? '; domain=' + options.domain : '',
    +				options.secure  ? '; secure' : ''
    +			].join(''));
    +		}
    +
    +		// read
    +		var decode = config.raw ? raw : decoded;
    +		var cookies = document.cookie.split('; ');
    +		for (var i = 0, l = cookies.length; i < l; i++) {
    +			var parts = cookies[i].split('=');
    +			if (decode(parts.shift()) === key) {
    +				var cookie = decode(parts.join('='));
    +				return config.json ? JSON.parse(cookie) : cookie;
    +			}
    +		}
    +
    +		return null;
    +	};
    +
    +	config.defaults = {};
    +
    +	$.removeCookie = function (key, options) {
    +		if ($.cookie(key) !== null) {
    +			$.cookie(key, null, options);
    +			return true;
    +		}
    +		return false;
    +	};
    +
    +})(jQuery, document);
    diff --git a/src/main/webapp/plug-in/jquery/jquery.jqprint.js b/src/main/webapp/plug-in/jquery/jquery.jqprint.js
    new file mode 100644
    index 00000000..3b01c473
    --- /dev/null
    +++ b/src/main/webapp/plug-in/jquery/jquery.jqprint.js
    @@ -0,0 +1,75 @@
    +锘// -----------------------------------------------------------------------
    +// Eros Fratini - eros@recoding.it
    +// jqprint 0.3
    +//
    +// - 19/06/2009 - some new implementations, added Opera support
    +// - 11/05/2009 - first sketch
    +//
    +// Printing plug-in for jQuery, evolution of jPrintArea: http://plugins.jquery.com/project/jPrintArea
    +// requires jQuery 1.3.x
    +//
    +// Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
    +//------------------------------------------------------------------------
    +
    +(function($) {
    +    var opt;
    +
    +    $.fn.jqprint = function (options) {
    +        opt = $.extend({}, $.fn.jqprint.defaults, options);
    +
    +        var $element = (this instanceof jQuery) ? this : $(this);
    +        
    +        if (opt.operaSupport && $.browser.opera) 
    +        { 
    +            var tab = window.open("","jqPrint-preview");
    +            tab.document.open();
    +
    +            var doc = tab.document;
    +        }
    +        else 
    +        {
    +            var $iframe = $("<iframe  />");
    +        
    +            if (!opt.debug) { $iframe.css({ position: "absolute", width: "0px", height: "0px", left: "-600px", top: "-600px" }); }
    +
    +            $iframe.appendTo("body");
    +            var doc = $iframe[0].contentWindow.document;
    +        }
    +        
    +        if (opt.importCSS)
    +        {
    +            if ($("link[media=print]").length > 0) 
    +            {
    +                $("link[media=print]").each( function() {
    +                    doc.write("<link type='text/css' rel='stylesheet' href='" + $(this).attr("href") + "' media='print' />");
    +                });
    +            }
    +            else 
    +            {
    +                $("link").each( function() {
    +                    doc.write("<link type='text/css' rel='stylesheet' href='" + $(this).attr("href") + "' />");
    +                });
    +            }
    +        }
    +        
    +        if (opt.printContainer) { doc.write($element.outer()); }
    +        else { $element.each( function() { doc.write($(this).html()); }); }
    +        
    +        doc.close();
    +        
    +        (opt.operaSupport && $.browser.opera ? tab : $iframe[0].contentWindow).focus();
    +        setTimeout( function() { (opt.operaSupport && $.browser.opera ? tab : $iframe[0].contentWindow).print(); if (tab) { tab.close(); } }, 1000);
    +    }
    +    
    +    $.fn.jqprint.defaults = {
    +		debug: false,
    +		importCSS: true, 
    +		printContainer: true,
    +		operaSupport: true
    +	};
    +
    +    // Thanks to 9__, found at http://users.livejournal.com/9__/380664.html
    +    jQuery.fn.outer = function() {
    +      return $($('<div></div>').html(this.clone())).html();
    +    } 
    +})(jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/kindeditor/kindeditor-min.js b/src/main/webapp/plug-in/kindeditor/kindeditor-min.js
    new file mode 100644
    index 00000000..d8cd0b6e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/kindeditor-min.js
    @@ -0,0 +1,176 @@
    +/* KindEditor 4.1.1 (2012-06-10), Copyright (C) kindsoft.net, Licence: http://www.kindsoft.net/license.php */(function(z,k){function V(a){if(!a)return!1;return Object.prototype.toString.call(a)==="[object Array]"}function bb(a){if(!a)return!1;return Object.prototype.toString.call(a)==="[object Function]"}function L(a,b){for(var c=0,d=b.length;c<d;c++)if(a===b[c])return c;return-1}function n(a,b){if(V(a))for(var c=0,d=a.length;c<d;c++){if(b.call(a[c],c,a[c])===!1)break}else for(c in a)if(a.hasOwnProperty(c)&&b.call(a[c],c,a[c])===!1)break}function A(a){return a.replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,
    +"")}function ma(a,b,c){c=c===k?",":c;return(c+b+c).indexOf(c+a+c)>=0}function q(a){return a&&/^\d+$/.test(a)?a+"px":a}function t(a){var b;return a&&(b=/(\d+)/.exec(a))?parseInt(b[1],10):0}function C(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Ea(a){return a.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&amp;/g,"&")}function ca(a){var b=a.split("-"),a="";n(b,function(b,d){a+=b>0?d.charAt(0).toUpperCase()+d.substr(1):
    +d});return a}function na(a){function b(a){a=parseInt(a,10).toString(16).toUpperCase();return a.length>1?a:"0"+a}return a.replace(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/ig,function(a,d,e,g){return"#"+b(d)+b(e)+b(g)})}function u(a,b){var b=b===k?",":b,c={},d=V(a)?a:a.split(b),e;n(d,function(a,b){if(e=/^(\d+)\.\.(\d+)$/.exec(b))for(var d=parseInt(e[1],10);d<=parseInt(e[2],10);d++)c[d.toString()]=!0;else c[b]=!0});return c}function Fa(a,b){return Array.prototype.slice.call(a,b||0)}function l(a,
    +b){return a===k?b:a}function F(a,b,c){c||(c=b,b=null);var d;if(b){var e=function(){};e.prototype=b.prototype;d=new e;n(c,function(a,b){d[a]=b})}else d=c;d.constructor=a;a.prototype=d;a.parent=b?b.prototype:null}function cb(a){var b;if(b=/\{[\s\S]*\}|\[[\s\S]*\]/.exec(a))a=b[0];b=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;b.lastIndex=0;b.test(a)&&(a=a.replace(b,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));
    +if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return eval("("+a+")");throw"JSON parse error";}function Qb(a,b,c){a.addEventListener?a.addEventListener(b,c,db):a.attachEvent&&a.attachEvent("on"+b,c)}function oa(a,b,c){a.removeEventListener?a.removeEventListener(b,c,db):a.detachEvent&&a.detachEvent("on"+b,c)}function eb(a,b){this.init(a,b)}function fb(a){try{delete a[W]}catch(b){a.removeAttribute&&
    +a.removeAttribute(W)}}function X(a,b,c){if(b.indexOf(",")>=0)n(b.split(","),function(){X(a,this,c)});else{var d=a[W]||null;d||(a[W]=++gb,d=gb);v[d]===k&&(v[d]={});var e=v[d][b];e&&e.length>0?oa(a,b,e[0]):(v[d][b]=[],v[d].el=a);e=v[d][b];e.length===0&&(e[0]=function(b){var c=b?new eb(a,b):k;n(e,function(b,d){b>0&&d&&d.call(a,c)})});L(c,e)<0&&e.push(c);Qb(a,b,e[0])}}function da(a,b,c){if(b&&b.indexOf(",")>=0)n(b.split(","),function(){da(a,this,c)});else{var d=a[W]||null;if(d)if(b===k)d in v&&(n(v[d],
    +function(b,c){b!="el"&&c.length>0&&oa(a,b,c[0])}),delete v[d],fb(a));else if(v[d]){var e=v[d][b];if(e&&e.length>0){c===k?(oa(a,b,e[0]),delete v[d][b]):(n(e,function(a,b){a>0&&b===c&&e.splice(a,1)}),e.length==1&&(oa(a,b,e[0]),delete v[d][b]));var g=0;n(v[d],function(){g++});g<2&&(delete v[d],fb(a))}}}}function hb(a,b){if(b.indexOf(",")>=0)n(b.split(","),function(){hb(a,this)});else{var c=a[W]||null;if(c){var d=v[c][b];if(v[c]&&d&&d.length>0)d[0]()}}}function Ga(a,b,c){b=/^\d{2,}$/.test(b)?b:b.toUpperCase().charCodeAt(0);
    +X(a,"keydown",function(d){d.ctrlKey&&d.which==b&&!d.shiftKey&&!d.altKey&&(c.call(a),d.stop())})}function ea(a){for(var b={},c=/\s*([\w\-]+)\s*:([^;]*)(;|$)/g,d;d=c.exec(a);){var e=A(d[1].toLowerCase());d=A(na(d[2]));b[e]=d}return b}function J(a){for(var b={},c=/\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([^\s"'<>]+))|(?:([\w\-:"]+)="([^"]*)")|(?:([\w\-:"]+)='([^']*)'))(?=(?:\s|\/|>)+)/g,d;d=c.exec(a);){var e=(d[1]||d[2]||d[4]||d[6]).toLowerCase();b[e]=(d[2]?d[3]:d[4]?d[5]:d[7])||""}return b}function Rb(a,b){return a=
    +/\s+class\s*=/.test(a)?a.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/,function(a,d,e,g){return(" "+e+" ").indexOf(" "+b+" ")<0?e===""?d+b+g:d+e+" "+b+g:a}):a.substr(0,a.length-1)+' class="'+b+'">'}function Sb(a){var b="";n(ea(a),function(a,d){b+=a+":"+d+";"});return b}function pa(a,b,c,d){function e(a){for(var a=a.split("/"),b=[],c=0,d=a.length;c<d;c++){var e=a[c];e==".."?b.length>0&&b.pop():e!==""&&e!="."&&b.push(e)}return"/"+b.join("/")}function g(b,c){if(a.substr(0,b.length)===b){for(var e=[],
    +h=0;h<c;h++)e.push("..");h=".";e.length>0&&(h+="/"+e.join("/"));d=="/"&&(h+="/");return h+a.substr(b.length)}else if(f=/^(.*)\//.exec(b))return g(f[1],++c)}b=l(b,"").toLowerCase();a=a.replace(/([^:])\/\//g,"$1/");if(L(b,["absolute","relative","domain"])<0)return a;c=c||location.protocol+"//"+location.host;if(d===k)var h=location.pathname.match(/^(\/.*)\//),d=h?h[1]:"";var f;if(f=/^(\w+:\/\/[^\/]*)/.exec(a)){if(f[1]!==c)return a}else if(/^\w+:/.test(a))return a;/^\//.test(a)?a=c+e(a.substr(1)):/^\w+:\/\//.test(a)||
    +(a=c+e(d+"/"+a));b==="relative"?a=g(c+d,0).substr(2):b==="absolute"&&a.substr(0,c.length)===c&&(a=a.substr(c.length));return a}function Q(a,b,c,d,e){var c=c||"",d=l(d,!1),e=l(e,"\t"),g="xx-small,x-small,small,medium,large,x-large,xx-large".split(","),a=a.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig,function(a,b,c,d){return b+c.replace(/<(?:br|br\s[^>]*)>/ig,"\n")+d}),a=a.replace(/<(?:br|br\s[^>]*)\s*\/?>\s*<\/p>/ig,"</p>"),a=a.replace(/(<(?:p|p\s[^>]*)>)\s*(<\/p>)/ig,"$1<br />$2"),a=a.replace(/\u200B/g,
    +""),h={};b&&(n(b,function(a,b){for(var c=a.split(","),d=0,e=c.length;d<e;d++)h[c[d]]=u(b)}),h.script||(a=a.replace(/(<(?:script|script\s[^>]*)>)([\s\S]*?)(<\/script>)/ig,"")),h.style||(a=a.replace(/(<(?:style|style\s[^>]*)>)([\s\S]*?)(<\/style>)/ig,"")));var f=[],a=a.replace(/([ \t\n\r]*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[^\s"'<>]+)|(?:\s+[\w\-:"]+="[^"]*")|(?:\s+[\w\-:"]+='[^']*'))*)(\/)?>([ \t\n\r]*)/g,function(a,m,r,s,qa,D,G){var m=m||"",r=r||"",k=s.toLowerCase(),l=qa||"",
    +s=D?" "+D:"",G=G||"";if(b&&!h[k])return"";s===""&&ib[k]&&(s=" /");jb[k]&&(m&&(m=" "),G&&(G=" "));Ha[k]&&(r?G="\n":m="\n");d&&k=="br"&&(G="\n");if(kb[k]&&!Ha[k])if(d){r&&f.length>0&&f[f.length-1]===k?f.pop():f.push(k);G=m="\n";qa=0;for(D=r?f.length:f.length-1;qa<D;qa++)m+=e,r||(G+=e);s?f.pop():r||(G+=e)}else m=G="";if(l!==""){var w=J(a);if(k==="font"){var o={},H="";n(w,function(a,b){if(a==="color")o.color=b,delete w[a];a==="size"&&(o["font-size"]=g[parseInt(b,10)-1]||"",delete w[a]);a==="face"&&(o["font-family"]=
    +b,delete w[a]);a==="style"&&(H=b)});H&&!/;$/.test(H)&&(H+=";");n(o,function(a,b){b!==""&&(/\s/.test(b)&&(b="'"+b+"'"),H+=a+":"+b+";")});w.style=H}n(w,function(a,d){Tb[a]&&(w[a]=a);L(a,["src","href"])>=0&&(w[a]=pa(d,c));(b&&a!=="style"&&!h[k]["*"]&&!h[k][a]||k==="body"&&a==="contenteditable"||/^kindeditor_\d+$/.test(a))&&delete w[a];if(a==="style"&&d!==""){var e=ea(d);n(e,function(a){b&&!h[k].style&&!h[k]["."+a]&&delete e[a]});var g="";n(e,function(a,b){g+=a+":"+b+";"});w.style=g}});l="";n(w,function(a,
    +b){a==="style"&&b===""||(b=b.replace(/"/g,"&quot;"),l+=" "+a+'="'+b+'"')})}k==="font"&&(k="span");return m+"<"+r+k+l+s+">"+G}),a=a.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig,function(a,b,c,d){return b+c.replace(/\n/g,'<span id="__kindeditor_pre_newline__">\n')+d}),a=a.replace(/\n\s*\n/g,"\n"),a=a.replace(/<span id="__kindeditor_pre_newline__">\n/g,"\n");return A(a)}function lb(a,b){a=a.replace(/<meta[\s\S]*?>/ig,"").replace(/<![\s\S]*?>/ig,"").replace(/<style[^>]*>[\s\S]*?<\/style>/ig,
    +"").replace(/<script[^>]*>[\s\S]*?<\/script>/ig,"").replace(/<w:[^>]+>[\s\S]*?<\/w:[^>]+>/ig,"").replace(/<o:[^>]+>[\s\S]*?<\/o:[^>]+>/ig,"").replace(/<xml>[\s\S]*?<\/xml>/ig,"").replace(/<(?:table|td)[^>]*>/ig,function(a){return a.replace(/border-bottom:([#\w\s]+)/ig,"border:$1")});return Q(a,b)}function mb(a){if(/\.(rm|rmvb)(\?|$)/i.test(a))return"audio/x-pn-realaudio-plugin";if(/\.(swf|flv)(\?|$)/i.test(a))return"application/x-shockwave-flash";return"video/x-ms-asf-plugin"}function nb(a){return J(unescape(a))}
    +function Ia(a){var b="<embed ";n(a,function(a,d){b+=a+'="'+d+'" '});b+="/>";return b}function ob(a,b){var c=b.width,d=b.height,e=b.type||mb(b.src),g=Ia(b),h="";c>0&&(h+="width:"+c+"px;");d>0&&(h+="height:"+d+"px;");c=/realaudio/i.test(e)?"ke-rm":/flash/i.test(e)?"ke-flash":"ke-media";c='<img class="'+c+'" src="'+a+'" ';h!==""&&(c+='style="'+h+'" ');c+='data-ke-tag="'+escape(g)+'" alt="" />';return c}function sa(a,b){if(a.nodeType==9&&b.nodeType!=9)return!0;for(;b=b.parentNode;)if(b==a)return!0;return!1}
    +function ta(a,b){var b=b.toLowerCase(),c=null;if(!Ub&&a.nodeName.toLowerCase()!="script"){var d=a.ownerDocument.createElement("div");d.appendChild(a.cloneNode(!1));d=J(Ea(d.innerHTML));b in d&&(c=d[b])}else try{c=a.getAttribute(b,2)}catch(e){c=a.getAttribute(b,1)}b==="style"&&c!==null&&(c=Sb(c));return c}function ua(a,b){function c(a){if(typeof a!="string")return a;return a.replace(/([^\w\-])/g,"\\$1")}function d(a,b){return a==="*"||a.toLowerCase()===c(b.toLowerCase())}function e(a,b,c){var e=[];
    +(a=(c.ownerDocument||c).getElementById(a.replace(/\\/g,"")))&&d(b,a.nodeName)&&sa(c,a)&&e.push(a);return e}function g(a,b,c){var e=c.ownerDocument||c,g=[],h,f,i;if(c.getElementsByClassName){e=c.getElementsByClassName(a.replace(/\\/g,""));h=0;for(f=e.length;h<f;h++)i=e[h],d(b,i.nodeName)&&g.push(i)}else if(e.querySelectorAll){e=e.querySelectorAll((c.nodeName!=="#document"?c.nodeName+" ":"")+b+"."+a);h=0;for(f=e.length;h<f;h++)i=e[h],sa(c,i)&&g.push(i)}else{e=c.getElementsByTagName(b);a=" "+a+" ";h=
    +0;for(f=e.length;h<f;h++)if(i=e[h],i.nodeType==1)(b=i.className)&&(" "+b+" ").indexOf(a)>-1&&g.push(i)}return g}function h(a,b,d,e){for(var g=[],d=e.getElementsByTagName(d),h=0,f=d.length;h<f;h++)e=d[h],e.nodeType==1&&(b===null?ta(e,a)!==null&&g.push(e):b===c(ta(e,a))&&g.push(e));return g}function f(a,b){var c=[],i,j=(i=/^((?:\\.|[^.#\s\[<>])+)/.exec(a))?i[1]:"*";if(i=/#((?:[\w\-]|\\.)+)$/.exec(a))c=e(i[1],j,b);else if(i=/\.((?:[\w\-]|\\.)+)$/.exec(a))c=g(i[1],j,b);else if(i=/\[((?:[\w\-]|\\.)+)\]/.exec(a))c=
    +h(i[1].toLowerCase(),null,j,b);else if(i=/\[((?:[\w\-]|\\.)+)\s*=\s*['"]?((?:\\.|[^'"]+)+)['"]?\]/.exec(a)){c=i[1].toLowerCase();i=i[2];if(c==="id")j=e(i,j,b);else if(c==="class")j=g(i,j,b);else if(c==="name"){c=[];i=(b.ownerDocument||b).getElementsByName(i.replace(/\\/g,""));for(var m,s=0,r=i.length;s<r;s++)m=i[s],d(j,m.nodeName)&&sa(b,m)&&m.getAttributeNode("name")&&c.push(m);j=c}else j=h(c,i,j,b);c=j}else{j=b.getElementsByTagName(j);m=0;for(s=j.length;m<s;m++)i=j[m],i.nodeType==1&&c.push(i)}return c}
    +var j=a.split(",");if(j.length>1){var m=[];n(j,function(){n(ua(this,b),function(){L(this,m)<0&&m.push(this)})});return m}for(var b=b||document,j=[],r,s=/((?:\\.|[^\s>])+|[\s>])/g;r=s.exec(a);)r[1]!==" "&&j.push(r[1]);r=[];if(j.length==1)return f(j[0],b);var s=!1,k,D,l,o,p,w,ra,H,q,t;w=0;for(lenth=j.length;w<lenth;w++)if(k=j[w],k===">")s=!0;else{if(w>0){D=[];ra=0;for(q=r.length;ra<q;ra++){o=r[ra];l=f(k,o);H=0;for(t=l.length;H<t;H++)p=l[H],s?o===p.parentNode&&D.push(p):D.push(p)}r=D}else r=f(k,b);if(r.length===
    +0)return[]}return r}function Y(a){if(!a)return document;return a.ownerDocument||a.document||a}function R(a){if(!a)return z;a=Y(a);return a.parentWindow||a.defaultView}function Vb(a,b){if(a.nodeType==1){var c=Y(a);try{a.innerHTML='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+b;var d=c.getElementById("__kindeditor_temp_tag__");d.parentNode.removeChild(d)}catch(e){f(a).empty(),f("@"+b,c).each(function(){a.appendChild(this)})}}}function Ja(a,b,c){o&&B<8&&b.toLowerCase()==
    +"class"&&(b="className");a.setAttribute(b,""+c)}function Ka(a){if(!a||!a.nodeName)return"";return a.nodeName.toLowerCase()}function Wb(a,b){var c=R(a),d=ca(b),e="";c.getComputedStyle?(c=c.getComputedStyle(a,null),e=c[d]||c.getPropertyValue(b)||a.style[d]):a.currentStyle&&(e=a.currentStyle[d]||a.style[d]);return e}function I(a){a=a||document;return S?a.body:a.documentElement}function Z(a){var a=a||document,b;o||La?(b=I(a).scrollLeft,a=I(a).scrollTop):(b=R(a).scrollX,a=R(a).scrollY);return{x:b,y:a}}
    +function E(a){this.init(a)}function pb(a){a.collapsed=a.startContainer===a.endContainer&&a.startOffset===a.endOffset;return a}function Ma(a,b,c){function d(d,e,g){var h=d.nodeValue.length,j;b&&(j=d.cloneNode(!0),j=e>0?j.splitText(e):j,g<h&&j.splitText(g-e));if(c){var m=d;e>0&&(m=d.splitText(e),a.setStart(d,e));g<h&&(d=m.splitText(g-e),a.setEnd(d,0));f.push(m)}return j}function e(){c&&a.up().collapse(!0);for(var b=0,d=f.length;b<d;b++){var e=f[b];e.parentNode&&e.parentNode.removeChild(e)}}function g(e,
    +k){for(var l=e.firstChild,o;l;){o=(new M(h)).selectNode(l);m=o.compareBoundaryPoints(fa,a);m>=0&&r<=0&&(r=o.compareBoundaryPoints(ga,a));r>=0&&s<=0&&(s=o.compareBoundaryPoints($,a));s>=0&&n<=0&&(n=o.compareBoundaryPoints(ha,a));if(n>=0)return!1;o=l.nextSibling;if(m>0)if(l.nodeType==1)if(r>=0&&s<=0)b&&k.appendChild(l.cloneNode(!0)),c&&f.push(l);else{var D;b&&(D=l.cloneNode(!1),k.appendChild(D));if(g(l,D)===!1)return!1}else if(l.nodeType==3&&(l=l==j.startContainer?d(l,j.startOffset,l.nodeValue.length):
    +l==j.endContainer?d(l,0,j.endOffset):d(l,0,l.nodeValue.length),b))try{k.appendChild(l)}catch(G){}l=o}}var h=a.doc,f=[],j=a.cloneRange().down(),m=-1,r=-1,s=-1,n=-1,k=a.commonAncestor(),l=h.createDocumentFragment();if(k.nodeType==3)return k=d(k,a.startOffset,a.endOffset),b&&l.appendChild(k),e(),b?l:a;g(k,l);c&&a.up().collapse(!0);for(var k=0,o=f.length;k<o;k++){var p=f[k];p.parentNode&&p.parentNode.removeChild(p)}return b?l:a}function ia(a,b){for(var c=b;c;){var d=f(c);if(d.name=="marquee"||d.name==
    +"select")return;c=c.parentNode}try{a.moveToElementText(b)}catch(e){}}function qb(a,b){var c=a.parentElement().ownerDocument,d=a.duplicate();d.collapse(b);var e=d.parentElement(),g=e.childNodes;if(g.length===0)return{node:e.parentNode,offset:f(e).index()};var h=c,i=0,j=-1,m=a.duplicate();ia(m,e);for(var k=0,s=g.length;k<s;k++){var l=g[k],j=m.compareEndPoints("StartToStart",d);if(j===0)return{node:l.parentNode,offset:k};if(l.nodeType==1){var n=a.duplicate(),o,p=f(l),q=l;p.isControl()&&(o=c.createElement("span"),
    +p.after(o),q=o,i+=p.text().replace(/\r\n|\n|\r/g,"").length);ia(n,q);m.setEndPoint("StartToEnd",n);j>0?i+=n.text.replace(/\r\n|\n|\r/g,"").length:i=0;o&&f(o).remove()}else l.nodeType==3&&(m.moveStart("character",l.nodeValue.length),i+=l.nodeValue.length);j<0&&(h=l)}if(j<0&&h.nodeType==1)return{node:e,offset:f(e.lastChild).index()+1};if(j>0)for(;h.nextSibling&&h.nodeType==1;)h=h.nextSibling;m=a.duplicate();ia(m,e);m.setEndPoint("StartToEnd",d);i-=m.text.replace(/\r\n|\n|\r/g,"").length;if(j>0&&h.nodeType==
    +3)for(c=h.previousSibling;c&&c.nodeType==3;)i-=c.nodeValue.length,c=c.previousSibling;return{node:h,offset:i}}function rb(a,b){var c=a.ownerDocument||a,d=c.body.createTextRange();if(c==a)return d.collapse(!0),d;if(a.nodeType==1&&a.childNodes.length>0){var e=a.childNodes,g;b===0?(g=e[0],e=!0):(g=e[b-1],e=!1);if(!g)return d;if(f(g).name==="head")return b===1&&(e=!0),b===2&&(e=!1),d.collapse(e),d;if(g.nodeType==1){var h=f(g),i;h.isControl()&&(i=c.createElement("span"),e?h.before(i):h.after(i),g=i);ia(d,
    +g);d.collapse(e);i&&f(i).remove();return d}a=g;b=e?0:g.nodeValue.length}c=c.createElement("span");f(a).before(c);ia(d,c);d.moveStart("character",b);f(c).remove();return d}function sb(a){function b(a){if(f(a.node).name=="tr")a.node=a.node.cells[a.offset],a.offset=0}var c;if(o){if(a.item)return c=Y(a.item(0)),c=new M(c),c.selectNode(a.item(0)),c;c=a.parentElement().ownerDocument;var d=qb(a,!0),a=qb(a,!1);b(d);b(a);c=new M(c);c.setStart(d.node,d.offset);c.setEnd(a.node,a.offset);return c}d=a.startContainer;
    +c=d.ownerDocument||d;c=new M(c);c.setStart(d,a.startOffset);c.setEnd(a.endContainer,a.endOffset);return c}function M(a){this.init(a)}function Na(a){if(!a.nodeName)return a.constructor===M?a:sb(a);return new M(a)}function N(a,b,c){try{a.execCommand(b,!1,c)}catch(d){}}function tb(a,b){var c="";try{c=a.queryCommandValue(b)}catch(d){}typeof c!=="string"&&(c="");return c}function Oa(a){var b=R(a);return a.selection||b.getSelection()}function ub(a){var b={},c,d;n(a,function(a,g){c=a.split(",");for(var h=
    +0,f=c.length;h<f;h++)d=c[h],b[d]=g});return b}function Pa(a,b){return vb(a,b,"*")||vb(a,b)}function vb(a,b,c){c=c||a.name;if(a.type!==1)return!1;b=ub(b);if(!b[c])return!1;for(var c=b[c].split(","),b=0,d=c.length;b<d;b++){var e=c[b];if(e==="*")return!0;var g=/^(\.?)([^=]+)(?:=([^=]*))?$/.exec(e),h=g[1]?"css":"attr",e=g[2],g=g[3]||"";if(g===""&&a[h](e)!=="")return!0;if(g!==""&&a[h](e)===g)return!0}return!1}function Qa(a,b){a.type==1&&(wb(a,b,"*"),wb(a,b))}function wb(a,b,c){c=c||a.name;if(a.type===
    +1&&(b=ub(b),b[c])){for(var c=b[c].split(","),b=!1,d=0,e=c.length;d<e;d++){var g=c[d];if(g==="*"){b=!0;break}var h=/^(\.?)([^=]+)(?:=([^=]*))?$/.exec(g),g=h[2];h[1]?(g=ca(g),a[0].style[g]&&(a[0].style[g]="")):a.removeAttr(g)}b&&a.remove(!0)}}function Ra(a){for(;a.first();)a=a.first();return a}function aa(a){return a.type==1&&a.html().replace(/<[^>]+>/g,"")===""}function Xb(a,b,c){n(b,function(b,c){b!=="style"&&a.attr(b,c)});n(c,function(b,c){a.css(b,c)})}function xb(a){for(;a&&a.name!="body";){if(Ha[a.name]||
    +a.name=="div"&&a.hasClass("ke-script"))return!0;a=a.parent()}return!1}function va(a){this.init(a)}function yb(a){a.nodeName&&(a=Y(a),a=Na(a).selectNodeContents(a.body).collapse(!1));return new va(a)}function Sa(a){var b=a.moveEl,c=a.moveFn,d=a.clickEl||b,e=a.beforeDrag,g=[document],h=[{x:0,y:0}],i=[];(a.iframeFix===k||a.iframeFix)&&f("iframe").each(function(){var a;try{a=Ta(this),f(a)}catch(b){a=null}a&&(g.push(a),h.push(f(this).pos()))});d.mousedown(function(a){var m=d.get(),k=t(b.css("left")),s=
    +t(b.css("top")),l=b.width(),o=b.height(),p=a.pageX,q=a.pageY,u=!0;e&&e();n(g,function(a,b){function e(b){if(u){var g=O(h[a].x+b.pageX-p),f=O(h[a].y+b.pageY-q);c.call(d,k,s,l,o,g,f)}b.stop()}function g(a){a.stop()}function j(a){u=!1;m.releaseCapture&&m.releaseCapture();n(i,function(){f(this.doc).unbind("mousemove",this.move).unbind("mouseup",this.up).unbind("selectstart",this.select)});a.stop()}f(b).mousemove(e).mouseup(j).bind("selectstart",g);i.push({doc:b,move:e,up:j,select:g})});m.setCapture&&
    +m.setCapture()})}function P(a){this.init(a)}function Ua(a){return new P(a)}function Ta(a){a=f(a)[0];return a.contentDocument||a.contentWindow.document}function Yb(a,b,c,d){var e=[Va===""?"<html>":'<html dir="'+Va+'">','<head><meta charset="utf-8" /><title></title>',"<style>","html {margin:0;padding:0;}","body {margin:0;padding:5px;}",'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',"body, p, div {word-wrap: break-word;}","p {margin:5px 0;}","table {border-collapse:collapse;}","img {border:0;}",
    +"noscript {display:none;}","table.ke-zeroborder td {border:1px dotted #AAA;}","img.ke-flash {","\tborder:1px solid #AAA;","\tbackground-image:url("+a+"common/flash.gif);","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-rm {","\tborder:1px solid #AAA;","\tbackground-image:url("+a+"common/rm.gif);","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-media {","\tborder:1px solid #AAA;",
    +"\tbackground-image:url("+a+"common/media.gif);","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-anchor {","\tborder:1px dashed #666;","\twidth:16px;","\theight:16px;","}",".ke-script, .ke-noscript {","\tdisplay:none;","\tfont-size:0;","\twidth:0;","\theight:0;","}",".ke-pagebreak {","\tborder:1px dotted #AAA;","\tfont-size:0;","\theight:2px;","}","</style>"];V(c)||(c=[c]);n(c,function(a,b){b&&e.push('<link href="'+b+'" rel="stylesheet" />')});
    +d&&e.push("<style>"+d+"</style>");e.push("</head><body "+(b?'class="'+b+'"':"")+"></body></html>");return e.join("\n")}function ja(a,b){return a.hasVal()?a.val(b):a.html(b)}function wa(a){this.init(a)}function zb(a){return new wa(a)}function Ab(a,b){var c=this.get(a);c&&!c.hasClass("ke-disabled")&&b(c)}function Wa(a){this.init(a)}function Bb(a){return new Wa(a)}function xa(a){this.init(a)}function Xa(a){return new xa(a)}function ya(a){this.init(a)}function Cb(a){return new ya(a)}function Db(a){this.init(a)}
    +function za(a){this.init(a)}function Eb(a){return new za(a)}function Ya(a,b){var c=document.getElementsByTagName("head")[0]||(S?document.body:document.documentElement),d=document.createElement("script");c.appendChild(d);d.src=a;d.charset="utf-8";d.onload=d.onreadystatechange=function(){if(!this.readyState||this.readyState==="loaded")b&&b(),d.onload=d.onreadystatechange=null,c.removeChild(d)}}function Fb(a){var b=a.indexOf("?");return b>0?a.substr(0,b):a}function Za(a){for(var b=document.getElementsByTagName("head")[0]||
    +(S?document.body:document.documentElement),c=document.createElement("link"),d=Fb(pa(a,"absolute")),e=f('link[rel="stylesheet"]',b),g=0,h=e.length;g<h;g++)if(Fb(pa(e[g].href,"absolute"))===d)return;b.appendChild(c);c.href=a;c.rel="stylesheet"}function Gb(a,b){if(a===k)return T;if(!b)return T[a];T[a]=b}function Hb(a){var b,c="core";if(b=/^(\w+)\.(\w+)$/.exec(a))c=b[1],a=b[2];return{ns:c,key:a}}function Ib(a,b){b=b===k?f.options.langType:b;if(typeof a==="string"){if(!K[b])return"no language";var c=a.length-
    +1;if(a.substr(c)===".")return K[b][a.substr(0,c)];c=Hb(a);return K[b][c.ns][c.key]}n(a,function(a,c){var g=Hb(a);K[b]||(K[b]={});K[b][g.ns]||(K[b][g.ns]={});K[b][g.ns][g.key]=c})}function Aa(a,b){if(!a.collapsed){var a=a.cloneRange().up(),c=a.startContainer,d=a.startOffset;if(ba||a.isControl())if((c=f(c.childNodes[d]))&&c.name=="img"&&b(c))return c}}function Zb(){var a=this;f(a.edit.doc).contextmenu(function(b){a.menu&&a.hideMenu();if(a.useContextmenu){if(a._contextmenus.length!==0){var c=0,d=[];
    +for(n(a._contextmenus,function(){if(this.title=="-")d.push(this);else if(this.cond&&this.cond()&&(d.push(this),this.width&&this.width>c))c=this.width});d.length>0&&d[0].title=="-";)d.shift();for(;d.length>0&&d[d.length-1].title=="-";)d.pop();var e=null;n(d,function(a){this.title=="-"&&e.title=="-"&&delete d[a];e=this});if(d.length>0){b.preventDefault();var g=f(a.edit.iframe).pos(),h=Xa({x:g.x+b.clientX,y:g.y+b.clientY,width:c,css:{visibility:"hidden"},shadowMode:a.shadowMode});n(d,function(){this.title&&
    +h.addItem(this)});var g=I(h.doc),i=h.div.height();b.clientY+i>=g.clientHeight-100&&h.pos(h.x,t(h.y)-i);h.div.css("visibility","visible");a.menu=h}}}else b.preventDefault()})}function $b(){function a(a){for(a=f(a.commonAncestor());a;){if(a.type==1&&!a.isStyle())break;a=a.parent()}return a.name}var b=this,c=b.edit.doc,d=b.newlineTag;if(!(o&&d!=="br")&&(!ka||!(B<3&&d!=="p"))&&!(La&&B<9)){var e=u("h1,h2,h3,h4,h5,h6,pre,li"),g=u("p,h1,h2,h3,h4,h5,h6,pre,li,blockquote");f(c).keydown(function(f){if(!(f.which!=
    +13||f.shiftKey||f.ctrlKey||f.altKey)){b.cmd.selection();var i=a(b.cmd.range);i=="marquee"||i=="select"||(d==="br"&&!e[i]?(f.preventDefault(),b.insertHtml("<br />"+(o&&B<9?"":"\u200b"))):g[i]||N(c,"formatblock","<p>"))}});f(c).keyup(function(e){if(!(e.which!=13||e.shiftKey||e.ctrlKey||e.altKey)&&d!="br")if(b.cmd.selection(),e=a(b.cmd.range),!(e=="marquee"||e=="select"))if(g[e]||N(c,"formatblock","<p>"),e=b.cmd.commonAncestor("div")){for(var i=f("<p></p>"),j=e[0].firstChild;j;){var m=j.nextSibling;
    +i.append(j);j=m}e.before(i);e.remove();b.cmd.range.selectNodeContents(i[0]);b.cmd.select()}})}}function ac(){var a=this,b=a.edit.doc;f(b).keydown(function(c){if(c.which==9)if(c.preventDefault(),a.afterTab)a.afterTab.call(a,c);else{var c=a.cmd,d=c.range;d.shrink();d.collapsed&&d.startContainer.nodeType==1&&(d.insertNode(f("@&nbsp;",b)[0]),c.select());a.insertHtml("&nbsp;&nbsp;&nbsp;&nbsp;")}})}function bc(){var a=this;f(a.edit.textarea[0],a.edit.win).focus(function(b){a.afterFocus&&a.afterFocus.call(a,
    +b)}).blur(function(b){a.afterBlur&&a.afterBlur.call(a,b)})}function U(a){return A(a.replace(/<span [^>]*id="?__kindeditor_bookmark_\w+_\d+__"?[^>]*><\/span>/ig,""))}function $a(a){return a.replace(/<div[^>]+class="?__kindeditor_paste__"?[^>]*>[\s\S]*?<\/div>/ig,"")}function Jb(a,b){if(a.length===0)a.push(b);else{var c=a[a.length-1];U(b.html)!==U(c.html)&&a.push(b)}}function Kb(a,b){var c=this.edit,d=c.doc.body,e,g;if(a.length===0)return this;c.designMode?(e=this.cmd.range,g=e.createBookmark(!0),g.html=
    +d.innerHTML):g={html:d.innerHTML};Jb(b,g);var h=a.pop();U(g.html)===U(h.html)&&a.length>0&&(h=a.pop());c.designMode?(c.html(h.html),h.start&&(e.moveToBookmark(h),this.select())):f(d).html(U(h.html));return this}function la(a){function b(a,b){la.prototype[a]===k&&(c[a]=b);c.options[a]=b}var c=this;c.options={};n(a,function(c){b(c,a[c])});n(f.options,function(a,d){c[a]===k&&b(a,d)});var d=f(c.srcElement||"<textarea/>");if(!c.width)c.width=d[0].style.width||d.width();if(!c.height)c.height=d[0].style.height||
    +d.height();b("width",l(c.width,c.minWidth));b("height",l(c.height,c.minHeight));b("width",q(c.width));b("height",q(c.height));if(cc&&(!dc||B<534))c.designMode=!1;c.srcElement=d;c.initContent="";c.plugin={};c.isCreated=!1;c.isLoading=!1;c._handlers={};c._contextmenus=[];c._undoStack=[];c._redoStack=[];c._calledPlugins={};c._firstAddBookmark=!0;c.menu=c.contextmenu=null;c.dialogs=[]}function Lb(a,b){function c(a){n(T,function(b,c){c.call(a,KindEditor)});return a.create()}b=b||{};b.basePath=l(b.basePath,
    +f.basePath);b.themesPath=l(b.themesPath,b.basePath+"themes/");b.langPath=l(b.langPath,b.basePath+"lang/");b.pluginsPath=l(b.pluginsPath,b.basePath+"plugins/");if(l(b.loadStyleMode,f.options.loadStyleMode)){var d=l(b.themeType,f.options.themeType);Za(b.themesPath+"default/default.css");Za(b.themesPath+d+"/"+d+".css")}if(d=f(a)){if(d.length>1)return d.each(function(){Lb(this,b)}),_instances[0];b.srcElement=d[0];var e=new la(b);_instances.push(e);if(K[e.langType])return c(e);Ya(e.langPath+e.langType+
    +".js?ver="+encodeURIComponent(f.DEBUG?Ba:Ca),function(){c(e)});return e}}if(!z.KindEditor){if(!z.console)z.console={};if(!console.log)console.log=function(){};var Ca="4.1.1 (2012-06-10)",p=navigator.userAgent.toLowerCase(),o=p.indexOf("msie")>-1&&p.indexOf("opera")==-1,ka=p.indexOf("gecko")>-1&&p.indexOf("khtml")==-1,ba=p.indexOf("applewebkit")>-1,La=p.indexOf("opera")>-1,cc=p.indexOf("mobile")>-1,dc=/ipad|iphone|ipod/.test(p),S=document.compatMode!="CSS1Compat",B=(p=/(?:msie|firefox|webkit|opera)[\/:\s](\d+)/.exec(p))?
    +p[1]:"0",Ba=(new Date).getTime(),O=Math.round,f={DEBUG:!1,VERSION:Ca,IE:o,GECKO:ka,WEBKIT:ba,OPERA:La,V:B,TIME:Ba,each:n,isArray:V,isFunction:bb,inArray:L,inString:ma,trim:A,addUnit:q,removeUnit:t,escape:C,unescape:Ea,toCamel:ca,toHex:na,toMap:u,toArray:Fa,undef:l,invalidUrl:function(a){return!a||/[<>"]/.test(a)},addParam:function(a,b){return a.indexOf("?")>=0?a+"&"+b:a+"?"+b},extend:F,json:cb},jb=u("a,abbr,acronym,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,img,input,ins,kbd,label,map,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"),
    +kb=u("address,applet,blockquote,body,center,dd,dir,div,dl,dt,fieldset,form,frameset,h1,h2,h3,h4,h5,h6,head,hr,html,iframe,ins,isindex,li,map,menu,meta,noframes,noscript,object,ol,p,pre,script,style,table,tbody,td,tfoot,th,thead,title,tr,ul"),ib=u("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed"),Mb=u("b,basefont,big,del,em,font,i,s,small,span,strike,strong,sub,sup,u"),ec=u("img,table,input,textarea,button"),Ha=u("pre,style,script"),Da=u("html,head,body,td,tr,table,ol,ul,li");
    +u("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");var Tb=u("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),Nb=u("input,button,textarea,select");f.basePath=function(){for(var a=document.getElementsByTagName("script"),b,c=0,d=a.length;c<d;c++)if(b=a[c].src||"",/kindeditor[\w\-\.]*\.js/.test(b))return b.substring(0,b.lastIndexOf("/")+1);return""}();f.options={designMode:!0,fullscreenMode:!1,filterMode:!0,wellFormatMode:!0,shadowMode:!0,loadStyleMode:!0,
    +basePath:f.basePath,themesPath:f.basePath+"themes/",langPath:f.basePath+"lang/",pluginsPath:f.basePath+"plugins/",themeType:"default",langType:"zh_CN",urlType:"",newlineTag:"p",resizeType:2,syncType:"form",pasteType:2,dialogAlignType:"page",useContextmenu:!0,fullscreenShortcut:!0,bodyClass:"ke-content",indentChar:"\t",cssPath:"",cssData:"",minWidth:650,minHeight:100,minChangeSize:5,items:["source","|","undo","redo","|","preview","print","template","code","cut","copy","paste","plainpaste","wordpaste",
    +"|","justifyleft","justifycenter","justifyright","justifyfull","insertorderedlist","insertunorderedlist","indent","outdent","subscript","superscript","clearhtml","quickformat","selectall","|","fullscreen","/","formatblock","fontname","fontsize","|","forecolor","hilitecolor","bold","italic","underline","strikethrough","lineheight","removeformat","|","image","multiimage","flash","media","insertfile","table","hr","emoticons","baidumap","pagebreak","anchor","link","unlink","|","about"],noDisableItems:["source",
    +"fullscreen"],colorTable:[["#E53333","#E56600","#FF9900","#64451D","#DFC5A4","#FFE500"],["#009900","#006600","#99BB00","#B8D100","#60D978","#00D5FF"],["#337FE5","#003399","#4C33E5","#9933E5","#CC33E5","#EE33EE"],["#FFFFFF","#CCCCCC","#999999","#666666","#333333","#000000"]],fontSizeTable:["9px","10px","12px","14px","16px","18px","24px","32px"],htmlTags:{font:["color","size","face",".background-color"],span:[".color",".background-color",".font-size",".font-family",".background",".font-weight",".font-style",
    +".text-decoration",".vertical-align",".line-height"],div:["align",".border",".margin",".padding",".text-align",".color",".background-color",".font-size",".font-family",".font-weight",".background",".font-style",".text-decoration",".vertical-align",".margin-left"],table:["border","cellspacing","cellpadding","width","height","align","bordercolor",".padding",".margin",".border","bgcolor",".text-align",".color",".background-color",".font-size",".font-family",".font-weight",".font-style",".text-decoration",
    +".background",".width",".height",".border-collapse"],"td,th":["align","valign","width","height","colspan","rowspan","bgcolor",".text-align",".color",".background-color",".font-size",".font-family",".font-weight",".font-style",".text-decoration",".vertical-align",".background",".border"],a:["href","target","name"],embed:["src","width","height","type","loop","autostart","quality",".width",".height","align","allowscriptaccess"],img:["src","width","height","border","alt","title","align",".width",".height",
    +".border"],"p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6":["align",".text-align",".color",".background-color",".font-size",".font-family",".background",".font-weight",".font-style",".text-decoration",".vertical-align",".text-indent",".margin-left"],pre:["class"],hr:["class",".page-break-after"],"br,tbody,tr,strong,b,sub,sup,em,i,u,strike,s,del":[]},layout:'<div class="container"><div class="toolbar"></div><div class="edit"></div><div class="statusbar"></div></div>'};var db=!1,Ob=u("8,9,13,32,46,48..57,59,61,65..90,106,109..111,188,190..192,219..222"),
    +p=u("33..40"),ab={};n(Ob,function(a,b){ab[a]=b});n(p,function(a,b){ab[a]=b});var fc="altKey,attrChange,attrName,bubbles,button,cancelable,charCode,clientX,clientY,ctrlKey,currentTarget,data,detail,eventPhase,fromElement,handler,keyCode,metaKey,newValue,offsetX,offsetY,originalTarget,pageX,pageY,prevValue,relatedNode,relatedTarget,screenX,screenY,shiftKey,srcElement,target,toElement,view,wheelDelta,which".split(",");F(eb,{init:function(a,b){var c=this,d=a.ownerDocument||a.document||a;c.event=b;n(fc,
    +function(a,d){c[d]=b[d]});if(!c.target)c.target=c.srcElement||d;if(c.target.nodeType===3)c.target=c.target.parentNode;if(!c.relatedTarget&&c.fromElement)c.relatedTarget=c.fromElement===c.target?c.toElement:c.fromElement;if(c.pageX==null&&c.clientX!=null){var e=d.documentElement,d=d.body;c.pageX=c.clientX+(e&&e.scrollLeft||d&&d.scrollLeft||0)-(e&&e.clientLeft||d&&d.clientLeft||0);c.pageY=c.clientY+(e&&e.scrollTop||d&&d.scrollTop||0)-(e&&e.clientTop||d&&d.clientTop||0)}if(!c.which&&(c.charCode||c.charCode===
    +0?c.charCode:c.keyCode))c.which=c.charCode||c.keyCode;if(!c.metaKey&&c.ctrlKey)c.metaKey=c.ctrlKey;if(!c.which&&c.button!==k)c.which=c.button&1?1:c.button&2?3:c.button&4?2:0;switch(c.which){case 186:c.which=59;break;case 187:case 107:case 43:c.which=61;break;case 189:case 45:c.which=109;break;case 42:c.which=106;break;case 47:c.which=111;break;case 78:c.which=110}c.which>=96&&c.which<=105&&(c.which-=48)},preventDefault:function(){var a=this.event;a.preventDefault&&a.preventDefault();a.returnValue=
    +!1},stopPropagation:function(){var a=this.event;a.stopPropagation&&a.stopPropagation();a.cancelBubble=!0},stop:function(){this.preventDefault();this.stopPropagation()}});var W="kindeditor_"+Ba,gb=0,v={};o&&z.attachEvent("onunload",function(){n(v,function(a,b){b.el&&da(b.el)})});f.ctrl=Ga;f.ready=function(a){function b(){e||(e=!0,a(KindEditor))}function c(){if(!e){try{document.documentElement.doScroll("left")}catch(a){setTimeout(c,100);return}b()}}function d(){document.readyState==="complete"&&b()}
    +var e=!1;if(document.addEventListener)X(document,"DOMContentLoaded",b);else if(document.attachEvent){X(document,"readystatechange",d);var g=!1;try{g=z.frameElement==null}catch(f){}document.documentElement.doScroll&&g&&c()}X(z,"load",b)};f.formatUrl=pa;f.formatHtml=Q;f.getCssList=ea;f.getAttrList=J;f.mediaType=mb;f.mediaAttrs=nb;f.mediaEmbed=Ia;f.mediaImg=ob;f.clearMsWord=lb;f.tmpl=function(a,b){var c=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g,
    +" ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');");return b?c(b):c};p=document.createElement("div");p.setAttribute("className","t");var Ub=p.className!=="t";f.query=function(a,b){var c=ua(a,b);return c.length>0?c[0]:null};f.queryAll=ua;F(E,{init:function(a){for(var a=V(a)?a:[a],b=0,c=0,d=a.length;c<d;c++)a[c]&&(this[c]=a[c].constructor===E?a[c][0]:a[c],
    +b++);this.length=b;this.doc=Y(this[0]);this.name=Ka(this[0]);this.type=this.length>0?this[0].nodeType:null;this.win=R(this[0]);this._data={}},each:function(a){for(var b=0;b<this.length;b++)if(a.call(this[b],b,this[b])===!1)break;return this},bind:function(a,b){this.each(function(){X(this,a,b)});return this},unbind:function(a,b){this.each(function(){da(this,a,b)});return this},fire:function(a){if(this.length<1)return this;hb(this[0],a);return this},hasAttr:function(a){if(this.length<1)return!1;return!!ta(this[0],
    +a)},attr:function(a,b){var c=this;if(a===k)return J(c.outer());if(typeof a==="object")return n(a,function(a,b){c.attr(a,b)}),c;if(b===k)return b=c.length<1?null:ta(c[0],a),b===null?"":b;c.each(function(){Ja(this,a,b)});return c},removeAttr:function(a){this.each(function(){var b=a;o&&B<8&&b.toLowerCase()=="class"&&(b="className");Ja(this,b,"");this.removeAttribute(b)});return this},get:function(a){if(this.length<1)return null;return this[a||0]},eq:function(a){if(this.length<1)return null;return this[a]?
    +new E(this[a]):null},hasClass:function(a){if(this.length<1)return!1;return ma(a,this[0].className," ")},addClass:function(a){this.each(function(){if(!ma(a,this.className," "))this.className=A(this.className+" "+a)});return this},removeClass:function(a){this.each(function(){if(ma(a,this.className," "))this.className=A(this.className.replace(RegExp("(^|\\s)"+a+"(\\s|$)")," "))});return this},html:function(a){if(a===k){if(this.length<1||this.type!=1)return"";return Q(this[0].innerHTML)}this.each(function(){Vb(this,
    +a)});return this},text:function(){if(this.length<1)return"";return o?this[0].innerText:this[0].textContent},hasVal:function(){if(this.length<1)return!1;return!!Nb[Ka(this[0])]},val:function(a){if(a===k){if(this.length<1)return"";return this.hasVal()?this[0].value:this.attr("value")}else return this.each(function(){Nb[Ka(this)]?this.value=a:Ja(this,"value",a)}),this},css:function(a,b){var c=this;if(a===k)return ea(c.attr("style"));if(typeof a==="object")return n(a,function(a,b){c.css(a,b)}),c;if(b===
    +k){if(c.length<1)return"";return c[0].style[ca(a)]||Wb(c[0],a)||""}c.each(function(){this.style[ca(a)]=b});return c},width:function(a){if(a===k){if(this.length<1)return 0;return this[0].offsetWidth}return this.css("width",q(a))},height:function(a){if(a===k){if(this.length<1)return 0;return this[0].offsetHeight}return this.css("height",q(a))},opacity:function(a){this.each(function(){this.style.opacity===k?this.style.filter=a==1?"":"alpha(opacity="+a*100+")":this.style.opacity=a==1?"":a});return this},
    +data:function(a,b){if(b===k)return this._data[a];this._data[a]=b;return this},pos:function(){var a=this[0],b=0,c=0;if(a)if(a.getBoundingClientRect)a=a.getBoundingClientRect(),c=Z(this.doc),b=a.left+c.x,c=a.top+c.y;else for(;a;)b+=a.offsetLeft,c+=a.offsetTop,a=a.offsetParent;return{x:O(b),y:O(c)}},clone:function(a){if(this.length<1)return new E([]);return new E(this[0].cloneNode(a))},append:function(a){this.each(function(){this.appendChild&&this.appendChild(f(a)[0])});return this},appendTo:function(a){this.each(function(){f(a)[0].appendChild(this)});
    +return this},before:function(a){this.each(function(){this.parentNode.insertBefore(f(a)[0],this)});return this},after:function(a){this.each(function(){this.nextSibling?this.parentNode.insertBefore(f(a)[0],this.nextSibling):this.parentNode.appendChild(f(a)[0])});return this},replaceWith:function(a){var b=[];this.each(function(c,d){da(d);var e=f(a)[0];d.parentNode.replaceChild(e,d);b.push(e)});return f(b)},empty:function(){this.each(function(a,b){for(var c=b.firstChild;c;){if(!b.parentNode)break;var d=
    +c.nextSibling;c.parentNode.removeChild(c);c=d}});return this},remove:function(a){var b=this;b.each(function(c,d){if(d.parentNode){da(d);if(a)for(var e=d.firstChild;e;){var g=e.nextSibling;d.parentNode.insertBefore(e,d);e=g}d.parentNode.removeChild(d);delete b[c]}});b.length=0;b._data={};return b},show:function(a){return this.css("display",a===k?"block":a)},hide:function(){return this.css("display","none")},outer:function(){if(this.length<1)return"";var a=this.doc.createElement("div");a.appendChild(this[0].cloneNode(!0));
    +return Q(a.innerHTML)},isSingle:function(){return!!ib[this.name]},isInline:function(){return!!jb[this.name]},isBlock:function(){return!!kb[this.name]},isStyle:function(){return!!Mb[this.name]},isControl:function(){return!!ec[this.name]},contains:function(a){if(this.length<1)return!1;return sa(this[0],f(a)[0])},parent:function(){if(this.length<1)return null;var a=this[0].parentNode;return a?new E(a):null},children:function(){if(this.length<1)return new E([]);for(var a=[],b=this[0].firstChild;b;)(b.nodeType!=
    +3||A(b.nodeValue)!=="")&&a.push(b),b=b.nextSibling;return new E(a)},first:function(){var a=this.children();return a.length>0?a.eq(0):null},last:function(){var a=this.children();return a.length>0?a.eq(a.length-1):null},index:function(){if(this.length<1)return-1;for(var a=-1,b=this[0];b;)a++,b=b.previousSibling;return a},prev:function(){if(this.length<1)return null;var a=this[0].previousSibling;return a?new E(a):null},next:function(){if(this.length<1)return null;var a=this[0].nextSibling;return a?new E(a):
    +null},scan:function(a,b){function c(d){for(d=b?d.firstChild:d.lastChild;d;){var e=b?d.nextSibling:d.previousSibling;if(a(d)===!1)return!1;if(c(d)===!1)return!1;d=e}}if(!(this.length<1))return b=b===k?!0:b,c(this[0]),this}});n("blur,focus,focusin,focusout,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error,contextmenu".split(","),function(a,b){E.prototype[b]=function(a){return a?this.bind(b,
    +a):this.fire(b)}});p=f;f=function(a,b){function c(a){a[0]||(a=[]);return new E(a)}if(!(a===k||a===null)){if(typeof a==="string"){b&&(b=f(b)[0]);var d=a.length;a.charAt(0)==="@"&&(a=a.substr(1));if(a.length!==d||/<.+>/.test(a)){var d=(b?b.ownerDocument||b:document).createElement("div"),e=[];d.innerHTML='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+a;for(var g=0,h=d.childNodes.length;g<h;g++){var i=d.childNodes[g];i.id!="__kindeditor_temp_tag__"&&e.push(i)}return c(e)}return c(ua(a,
    +b))}if(a&&a.constructor===E)return a;if(V(a))return c(a);return c(Fa(arguments))}};n(p,function(a,b){f[a]=b});z.KindEditor=f;var ga=0,fa=1,$=2,ha=3,Pb=0;F(M,{init:function(a){this.startContainer=a;this.startOffset=0;this.endContainer=a;this.endOffset=0;this.collapsed=!0;this.doc=a},commonAncestor:function(){function a(a){for(var b=[];a;)b.push(a),a=a.parentNode;return b}for(var b=a(this.startContainer),c=a(this.endContainer),d=0,e=b.length,g=c.length,f,i;++d;)if(f=b[e-d],i=c[g-d],!f||!i||f!==i)break;
    +return b[e-d+1]},setStart:function(a,b){var c=this.doc;this.startContainer=a;this.startOffset=b;if(this.endContainer===c)this.endContainer=a,this.endOffset=b;return pb(this)},setEnd:function(a,b){var c=this.doc;this.endContainer=a;this.endOffset=b;if(this.startContainer===c)this.startContainer=a,this.startOffset=b;return pb(this)},setStartBefore:function(a){return this.setStart(a.parentNode||this.doc,f(a).index())},setStartAfter:function(a){return this.setStart(a.parentNode||this.doc,f(a).index()+
    +1)},setEndBefore:function(a){return this.setEnd(a.parentNode||this.doc,f(a).index())},setEndAfter:function(a){return this.setEnd(a.parentNode||this.doc,f(a).index()+1)},selectNode:function(a){return this.setStartBefore(a).setEndAfter(a)},selectNodeContents:function(a){var b=f(a);if(b.type==3||b.isSingle())return this.selectNode(a);b=b.children();if(b.length>0)return this.setStartBefore(b[0]).setEndAfter(b[b.length-1]);return this.setStart(a,0).setEnd(a,0)},collapse:function(a){if(a)return this.setEnd(this.startContainer,
    +this.startOffset);return this.setStart(this.endContainer,this.endOffset)},compareBoundaryPoints:function(a,b){var c=this.get(),d=b.get();if(o){var e={};e[ga]="StartToStart";e[fa]="EndToStart";e[$]="EndToEnd";e[ha]="StartToEnd";c=c.compareEndPoints(e[a],d);if(c!==0)return c;var g,h,i,j;if(a===ga||a===ha)g=this.startContainer,i=this.startOffset;if(a===fa||a===$)g=this.endContainer,i=this.endOffset;if(a===ga||a===fa)h=b.startContainer,j=b.startOffset;if(a===$||a===ha)h=b.endContainer,j=b.endOffset;if(g===
    +h)return g=i-j,g>0?1:g<0?-1:0;for(c=h;c&&c.parentNode!==g;)c=c.parentNode;if(c)return f(c).index()>=i?-1:1;for(c=g;c&&c.parentNode!==h;)c=c.parentNode;if(c)return f(c).index()>=j?1:-1;if((c=f(h).next())&&c.contains(g))return 1;if((c=f(g).next())&&c.contains(h))return-1}else return c.compareBoundaryPoints(a,d)},cloneRange:function(){return(new M(this.doc)).setStart(this.startContainer,this.startOffset).setEnd(this.endContainer,this.endOffset)},toString:function(){var a=this.get();return(o?a.text:a.toString()).replace(/\r\n|\n|\r/g,
    +"")},cloneContents:function(){return Ma(this,!0,!1)},deleteContents:function(){return Ma(this,!1,!0)},extractContents:function(){return Ma(this,!0,!0)},insertNode:function(a){var b=this.startContainer,c=this.startOffset,d=this.endContainer,e=this.endOffset,g,f,i,j=1;if(a.nodeName.toLowerCase()==="#document-fragment")g=a.firstChild,f=a.lastChild,j=a.childNodes.length;b.nodeType==1?(i=b.childNodes[c])?(b.insertBefore(a,i),b===d&&(e+=j)):b.appendChild(a):b.nodeType==3&&(c===0?(b.parentNode.insertBefore(a,
    +b),b.parentNode===d&&(e+=j)):c>=b.nodeValue.length?b.nextSibling?b.parentNode.insertBefore(a,b.nextSibling):b.parentNode.appendChild(a):(i=c>0?b.splitText(c):b,b.parentNode.insertBefore(a,i),b===d&&(d=i,e-=c)));g?this.setStartBefore(g).setEndAfter(f):this.selectNode(a);if(this.compareBoundaryPoints($,this.cloneRange().setEnd(d,e))>=1)return this;return this.setEnd(d,e)},surroundContents:function(a){a.appendChild(this.extractContents());return this.insertNode(a).selectNode(a)},isControl:function(){var a=
    +this.startContainer,b=this.startOffset,c=this.endContainer,d=this.endOffset;return a.nodeType==1&&a===c&&b+1===d&&f(a.childNodes[b]).isControl()},get:function(a){var b=this.doc;if(!o){b=b.createRange();try{b.setStart(this.startContainer,this.startOffset),b.setEnd(this.endContainer,this.endOffset)}catch(c){}return b}if(a&&this.isControl())return b=b.body.createControlRange(),b.addElement(this.startContainer.childNodes[this.startOffset]),b;a=this.cloneRange().down();b=b.body.createTextRange();b.setEndPoint("StartToStart",
    +rb(a.startContainer,a.startOffset));b.setEndPoint("EndToStart",rb(a.endContainer,a.endOffset));return b},html:function(){return f(this.cloneContents()).outer()},down:function(){function a(a,d,e){if(a.nodeType==1&&(a=f(a).children(),a.length!==0)){var g,h,i,j;d>0&&(g=a.eq(d-1));d<a.length&&(h=a.eq(d));if(g&&g.type==3)i=g[0],j=i.nodeValue.length;h&&h.type==3&&(i=h[0],j=0);i&&(e?b.setStart(i,j):b.setEnd(i,j))}}var b=this;a(b.startContainer,b.startOffset,!0);a(b.endContainer,b.endOffset,!1);return b},
    +up:function(){function a(a,d,e){a.nodeType==3&&(d===0?e?b.setStartBefore(a):b.setEndBefore(a):d==a.nodeValue.length&&(e?b.setStartAfter(a):b.setEndAfter(a)))}var b=this;a(b.startContainer,b.startOffset,!0);a(b.endContainer,b.endOffset,!1);return b},enlarge:function(a){function b(b,e,g){b=f(b);if(!(b.type==3||Da[b.name]||!a&&b.isBlock()))if(e===0){for(;!b.prev();){e=b.parent();if(!e||Da[e.name]||!a&&e.isBlock())break;b=e}g?c.setStartBefore(b[0]):c.setEndBefore(b[0])}else if(e==b.children().length){for(;!b.next();){e=
    +b.parent();if(!e||Da[e.name]||!a&&e.isBlock())break;b=e}g?c.setStartAfter(b[0]):c.setEndAfter(b[0])}}var c=this;c.up();b(c.startContainer,c.startOffset,!0);b(c.endContainer,c.endOffset,!1);return c},shrink:function(){for(var a,b=this.collapsed;this.startContainer.nodeType==1&&(a=this.startContainer.childNodes[this.startOffset])&&a.nodeType==1&&!f(a).isSingle();)this.setStart(a,0);if(b)return this.collapse(b);for(;this.endContainer.nodeType==1&&this.endOffset>0&&(a=this.endContainer.childNodes[this.endOffset-
    +1])&&a.nodeType==1&&!f(a).isSingle();)this.setEnd(a,a.childNodes.length);return this},createBookmark:function(a){var b,c=f('<span style="display:none;"></span>',this.doc)[0];c.id="__kindeditor_bookmark_start_"+Pb++ +"__";if(!this.collapsed)b=c.cloneNode(!0),b.id="__kindeditor_bookmark_end_"+Pb++ +"__";b&&this.cloneRange().collapse(!1).insertNode(b).setEndBefore(b);this.insertNode(c).setStartAfter(c);return{start:a?"#"+c.id:c,end:b?a?"#"+b.id:b:null}},moveToBookmark:function(a){var b=this.doc,c=f(a.start,
    +b),a=a.end?f(a.end,b):null;if(!c||c.length<1)return this;this.setStartBefore(c[0]);c.remove();a&&a.length>0?(this.setEndBefore(a[0]),a.remove()):this.collapse(!0);return this},dump:function(){console.log("--------------------");console.log(this.startContainer.nodeType==3?this.startContainer.nodeValue:this.startContainer,this.startOffset);console.log(this.endContainer.nodeType==3?this.endContainer.nodeValue:this.endContainer,this.endOffset)}});f.range=Na;f.START_TO_START=ga;f.START_TO_END=fa;f.END_TO_END=
    +$;f.END_TO_START=ha;F(va,{init:function(a){var b=a.doc;this.doc=b;this.win=R(b);this.sel=Oa(b);this.range=a},selection:function(a){var b=this.doc,c;c=Oa(b);var d;try{d=c.rangeCount>0?c.getRangeAt(0):c.createRange()}catch(e){}c=o&&(!d||!d.item&&d.parentElement().ownerDocument!==b)?null:d;this.sel=Oa(b);if(c)return this.range=Na(c),f(this.range.startContainer).name=="html"&&this.range.selectNodeContents(b.body).collapse(!1),this;a&&this.range.selectNodeContents(b.body).collapse(!1);return this},select:function(a){var a=
    +l(a,!0),b=this.sel,c=this.range.cloneRange().shrink(),d=c.startContainer,e=c.startOffset,g=Y(d),h=this.win,i,j=!1;if(a&&d.nodeType==1&&c.collapsed){if(o){b=f("<span>&nbsp;</span>",g);c.insertNode(b[0]);i=g.body.createTextRange();try{i.moveToElementText(b[0])}catch(m){}i.collapse(!1);i.select();b.remove();h.focus();return this}if(ba&&(a=d.childNodes,f(d).isInline()||e>0&&f(a[e-1]).isInline()||a[e]&&f(a[e]).isInline()))c.insertNode(g.createTextNode("\u200b")),j=!0}if(o)try{i=c.get(!0),i.select()}catch(k){}else j&&
    +c.collapse(!1),i=c.get(!0),b.removeAllRanges(),b.addRange(i);h.focus();return this},wrap:function(a){var b=this.range,c;c=f(a,this.doc);if(b.collapsed)return b.shrink(),b.insertNode(c[0]).selectNodeContents(c[0]),this;if(c.isBlock()){for(var d=a=c.clone(!0);d.first();)d=d.first();d.append(b.extractContents());b.insertNode(a[0]).selectNode(a[0]);return this}b.enlarge();var e=b.createBookmark(),a=b.commonAncestor(),g=!1;f(a).scan(function(a){if(!g&&a==e.start)g=!0;else if(g){if(a==e.end)return!1;var b=
    +f(a);if(!xb(b)&&b.type==3&&A(a.nodeValue).length>0){for(var d;(d=b.parent())&&d.isStyle()&&d.children().length==1;)b=d;d=c;d=d.clone(!0);if(b.type==3)Ra(d).append(b.clone(!1)),b.replaceWith(d);else{for(var a=b,m;(m=b.first())&&m.children().length==1;)b=m;m=b.first();for(b=b.doc.createDocumentFragment();m;)b.appendChild(m[0]),m=m.next();m=a.clone(!0);for(var k=Ra(m),l=m,n=!1;d;){for(;l;)l.name===d.name&&(Xb(l,d.attr(),d.css()),n=!0),l=l.first();n||k.append(d.clone(!1));n=!1;d=d.first()}d=m;b.firstChild&&
    +Ra(d).append(b);a.replaceWith(d)}}}});b.moveToBookmark(e);return this},split:function(a,b){for(var c=this.range,d=c.doc,e=c.cloneRange().collapse(a),g=e.startContainer,h=e.startOffset,i=g.nodeType==3?g.parentNode:g,j=!1,m;i&&i.parentNode;){m=f(i);if(b){if(!m.isStyle())break;if(!Pa(m,b))break}else if(Da[m.name])break;j=!0;i=i.parentNode}if(j)d=d.createElement("span"),c.cloneRange().collapse(!a).insertNode(d),a?e.setStartBefore(i.firstChild).setEnd(g,h):e.setStart(g,h).setEndAfter(i.lastChild),g=e.extractContents(),
    +h=g.firstChild,j=g.lastChild,a?(e.insertNode(g),c.setStartAfter(j).setEndBefore(d)):(i.appendChild(g),c.setStartBefore(d).setEndBefore(h)),e=d.parentNode,e==c.endContainer&&(i=f(d).prev(),g=f(d).next(),i&&g&&i.type==3&&g.type==3?c.setEnd(i[0],i[0].nodeValue.length):a||c.setEnd(c.endContainer,c.endOffset-1)),e.removeChild(d);return this},remove:function(a){var b=this.doc,c=this.range;c.enlarge();if(c.startOffset===0){for(var d=f(c.startContainer),e;(e=d.parent())&&e.isStyle()&&e.children().length==
    +1;)d=e;c.setStart(d[0],0);d=f(c.startContainer);d.isBlock()&&Qa(d,a);(d=d.parent())&&d.isBlock()&&Qa(d,a)}if(c.collapsed){this.split(!0,a);b=c.startContainer;d=c.startOffset;if(d>0&&(e=f(b.childNodes[d-1]))&&aa(e))e.remove(),c.setStart(b,d-1);(d=f(b.childNodes[d]))&&aa(d)&&d.remove();aa(b)&&(c.startBefore(b),b.remove());c.collapse(!0);return this}this.split(!0,a);this.split(!1,a);var g=b.createElement("span"),h=b.createElement("span");c.cloneRange().collapse(!1).insertNode(h);c.cloneRange().collapse(!0).insertNode(g);
    +var i=[],j=!1;f(c.commonAncestor()).scan(function(a){if(!j&&a==g)j=!0;else{if(a==h)return!1;j&&i.push(a)}});f(g).remove();f(h).remove();b=c.startContainer;d=c.startOffset;e=c.endContainer;var m=c.endOffset;if(d>0){var l=f(b.childNodes[d-1]);l&&aa(l)&&(l.remove(),c.setStart(b,d-1),b==e&&c.setEnd(e,m-1));if((d=f(b.childNodes[d]))&&aa(d))d.remove(),b==e&&c.setEnd(e,m-1)}(b=f(e.childNodes[c.endOffset]))&&aa(b)&&b.remove();b=c.createBookmark(!0);n(i,function(b,c){Qa(f(c),a)});c.moveToBookmark(b);return this},
    +commonNode:function(a){function b(b){for(var c=b;b;){if(Pa(f(b),a))return f(b);b=b.parentNode}for(;c&&(c=c.lastChild);)if(Pa(f(c),a))return f(c);return null}var c=this.range,d=c.endContainer,c=c.endOffset,e=d.nodeType==3||c===0?d:d.childNodes[c-1],g=b(e);if(g)return g;if(e.nodeType==1||d.nodeType==3&&c===0)if(d=f(e).prev())return b(d);return null},commonAncestor:function(a){function b(b){for(;b;){if(b.nodeType==1&&b.tagName.toLowerCase()===a)return b;b=b.parentNode}return null}var c=this.range,d=
    +c.startContainer,e=c.startOffset,g=c.endContainer,c=c.endOffset,g=g.nodeType==3||c===0?g:g.childNodes[c-1],d=b(d.nodeType==3||e===0?d:d.childNodes[e-1]),e=b(g);if(d&&e&&d===e)return f(d);return null},state:function(a){var b=this.doc,c=!1;try{c=b.queryCommandState(a)}catch(d){}return c},val:function(a){var b=this.doc,a=a.toLowerCase(),c="";if(a==="fontfamily"||a==="fontname")return c=tb(b,"fontname"),c=c.replace(/['"]/g,""),c.toLowerCase();if(a==="formatblock"){c=tb(b,a);if(c===""&&(a=this.commonNode({"h1,h2,h3,h4,h5,h6,p,div,pre,address":"*"})))c=
    +a.name;c==="Normal"&&(c="p");return c.toLowerCase()}if(a==="fontsize")return(a=this.commonNode({"*":".font-size"}))&&(c=a.css("font-size")),c.toLowerCase();if(a==="forecolor")return(a=this.commonNode({"*":".color"}))&&(c=a.css("color")),c=na(c),c===""&&(c="default"),c.toLowerCase();if(a==="hilitecolor")return(a=this.commonNode({"*":".background-color"}))&&(c=a.css("background-color")),c=na(c),c===""&&(c="default"),c.toLowerCase();return c},toggle:function(a,b){this.commonNode(b)?this.remove(b):this.wrap(a);
    +return this.select()},bold:function(){return this.toggle("<strong></strong>",{span:".font-weight=bold",strong:"*",b:"*"})},italic:function(){return this.toggle("<em></em>",{span:".font-style=italic",em:"*",i:"*"})},underline:function(){return this.toggle("<u></u>",{span:".text-decoration=underline",u:"*"})},strikethrough:function(){return this.toggle("<s></s>",{span:".text-decoration=line-through",s:"*"})},forecolor:function(a){return this.toggle('<span style="color:'+a+';"></span>',{span:".color="+
    +a,font:"color"})},hilitecolor:function(a){return this.toggle('<span style="background-color:'+a+';"></span>',{span:".background-color="+a})},fontsize:function(a){return this.toggle('<span style="font-size:'+a+';"></span>',{span:".font-size="+a,font:"size"})},fontname:function(a){return this.fontfamily(a)},fontfamily:function(a){return this.toggle('<span style="font-family:'+a+';"></span>',{span:".font-family="+a,font:"face"})},removeformat:function(){var a={"*":".font-weight,.font-style,.text-decoration,.color,.background-color,.font-size,.font-family,.text-indent"};
    +n(Mb,function(b){a[b]="*"});this.remove(a);return this.select()},inserthtml:function(a,b){function c(a,b){var b='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+b,c=a.get();c.item?c.item(0).outerHTML=b:c.pasteHTML(b);var d=a.doc.getElementById("__kindeditor_temp_tag__");d.parentNode.removeChild(d);c=sb(c);a.setEnd(c.endContainer,c.endOffset);a.collapse(!1);e.select(!1)}function d(a,b){var c=a.doc,d=c.createDocumentFragment();f("@"+b,c).each(function(){d.appendChild(this)});
    +a.deleteContents();a.insertNode(d);a.collapse(!1);e.select(!1)}var e=this,g=e.range;if(a==="")return e;if(xb(f(g.startContainer)))return e;if(o&&b){try{c(g,a)}catch(h){d(g,a)}return e}d(g,a);return e},hr:function(){return this.inserthtml("<hr />")},print:function(){this.win.print();return this},insertimage:function(a,b,c,d,e,g){b=l(b,"");l(e,0);a='<img src="'+C(a)+'" data-ke-src="'+C(a)+'" ';c&&(a+='width="'+C(c)+'" ');d&&(a+='height="'+C(d)+'" ');b&&(a+='title="'+C(b)+'" ');g&&(a+='align="'+C(g)+
    +'" ');a+='alt="'+C(b)+'" ';a+="/>";return this.inserthtml(a)},createlink:function(a,b){var c=this.doc,d=this.range;this.select();var e=this.commonNode({a:"*"});e&&!d.isControl()&&(d.selectNode(e.get()),this.select());e='<a href="'+C(a)+'" data-ke-src="'+C(a)+'" ';b&&(e+=' target="'+C(b)+'"');if(d.collapsed)return e+=">"+C(a)+"</a>",this.inserthtml(e);if(d.isControl()){var g=f(d.startContainer.childNodes[d.startOffset]);e+="></a>";g.after(f(e,c));g.next().append(g);d.selectNode(g[0]);return this.select()}N(c,
    +"createlink","__kindeditor_temp_url__");f('a[href="__kindeditor_temp_url__"]',c).each(function(){f(this).attr("href",a).attr("data-ke-src",a);b?f(this).attr("target",b):f(this).removeAttr("target")});return this},unlink:function(){var a=this.doc,b=this.range;this.select();if(b.collapsed){var c=this.commonNode({a:"*"});c&&(b.selectNode(c.get()),this.select());N(a,"unlink",null);ba&&f(b.startContainer).name==="img"&&(a=f(b.startContainer).parent(),a.name==="a"&&a.remove(!0))}else N(a,"unlink",null);
    +return this}});n("formatblock,selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,indent,outdent,subscript,superscript".split(","),function(a,b){va.prototype[b]=function(a){this.select();N(this.doc,b,a);(!o||L(b,"formatblock,selectall,insertorderedlist,insertunorderedlist".split(","))>=0)&&this.selection();return this}});n("cut,copy,paste".split(","),function(a,b){va.prototype[b]=function(){if(!this.doc.queryCommandSupported(b))throw"not supported";this.select();
    +N(this.doc,b,null);return this}});f.cmd=yb;F(P,{init:function(a){var b=this;b.name=a.name||"";b.doc=a.doc||document;b.win=R(b.doc);b.x=q(a.x);b.y=q(a.y);b.z=a.z;b.width=q(a.width);b.height=q(a.height);b.div=f('<div style="display:block;"></div>');b.options=a;b._alignEl=a.alignEl;b.width&&b.div.css("width",b.width);b.height&&b.div.css("height",b.height);b.z&&b.div.css({position:"absolute",left:b.x,top:b.y,"z-index":b.z});b.z&&(b.x===k||b.y===k)&&b.autoPos(b.width,b.height);a.cls&&b.div.addClass(a.cls);
    +a.shadowMode&&b.div.addClass("ke-shadow");a.css&&b.div.css(a.css);a.src?f(a.src).replaceWith(b.div):f(b.doc.body).append(b.div);a.html&&b.div.html(a.html);if(a.autoScroll)if(o&&B<7||S){var c=Z();f(b.win).bind("scroll",function(){var a=Z(),e=a.x-c.x,a=a.y-c.y;b.pos(t(b.x)+e,t(b.y)+a,!1)})}else b.div.css("position","fixed")},pos:function(a,b,c){c=l(c,!0);if(a!==null&&(a=a<0?0:q(a),this.div.css("left",a),c))this.x=a;if(b!==null&&(b=b<0?0:q(b),this.div.css("top",b),c))this.y=b;return this},autoPos:function(a,
    +b){var c=t(a)||0,d=t(b)||0,e=Z();if(this._alignEl){var g=f(this._alignEl),h=g.pos(),c=O(g[0].clientWidth/2-c/2),d=O(g[0].clientHeight/2-d/2);x=c<0?h.x:h.x+c;y=d<0?h.y:h.y+d}else h=I(this.doc),x=O(e.x+(h.clientWidth-c)/2),y=O(e.y+(h.clientHeight-d)/2);o&&B<7||S||(x-=e.x,y-=e.y);return this.pos(x,y)},remove:function(){var a=this;o&&B<7&&f(a.win).unbind("scroll");a.div.remove();n(a,function(b){a[b]=null});return this},show:function(){this.div.show();return this},hide:function(){this.div.hide();return this},
    +draggable:function(a){var b=this,a=a||{};a.moveEl=b.div;a.moveFn=function(a,d,e,g,f,i){if((a+=f)<0)a=0;if((d+=i)<0)d=0;b.pos(a,d)};Sa(a);return b}});f.WidgetClass=P;f.widget=Ua;var Va="";if(p=document.getElementsByTagName("html"))Va=p[0].dir;F(wa,P,{init:function(a){function b(){var b=Ta(c.iframe);b.open();if(i)b.domain=document.domain;b.write(Yb(d,e,g,h));b.close();c.win=c.iframe[0].contentWindow;c.doc=b;var j=yb(b);c.afterChange(function(){j.selection()});ba&&f(b).click(function(a){f(a.target).name===
    +"img"&&(j.selection(!0),j.range.selectNode(a.target),j.select())});o&&f(b).keydown(function(a){if(a.which==8){j.selection();var b=j.range;b.isControl()&&(b.collapse(!0),f(b.startContainer.childNodes[b.startOffset]).remove(),a.preventDefault())}});c.cmd=j;c.html(ja(c.srcElement));o?(b.body.disabled=!0,b.body.contentEditable=!0,b.body.removeAttribute("disabled")):b.designMode="on";a.afterCreate&&a.afterCreate.call(c)}var c=this;wa.parent.init.call(c,a);c.srcElement=f(a.srcElement);c.div.addClass("ke-edit");
    +c.designMode=l(a.designMode,!0);c.beforeGetHtml=a.beforeGetHtml;c.beforeSetHtml=a.beforeSetHtml;c.afterSetHtml=a.afterSetHtml;var d=l(a.themesPath,""),e=a.bodyClass,g=a.cssPath,h=a.cssData,i=location.host.replace(/:\d+/,"")!==document.domain,j="document.open();"+(i?'document.domain="'+document.domain+'";':"")+"document.close();",j=o?' src="javascript:void(function(){'+encodeURIComponent(j)+'}())"':"";c.iframe=f('<iframe class="ke-edit-iframe" hidefocus="true" frameborder="0"'+j+"></iframe>").css("width",
    +"100%");c.textarea=f('<textarea class="ke-edit-textarea" hidefocus="true"></textarea>').css("width","100%");c.width&&c.setWidth(c.width);c.height&&c.setHeight(c.height);c.designMode?c.textarea.hide():c.iframe.hide();i&&c.iframe.bind("load",function(){c.iframe.unbind("load");o?b():setTimeout(b,0)});c.div.append(c.iframe);c.div.append(c.textarea);c.srcElement.hide();!i&&b()},setWidth:function(a){this.div.css("width",q(a));return this},setHeight:function(a){a=q(a);this.div.css("height",a);this.iframe.css("height",
    +a);if(o&&B<8||S)a=q(t(a)-2);this.textarea.css("height",a);return this},remove:function(){var a=this.doc;f(a.body).unbind();f(a).unbind();f(this.win).unbind();ja(this.srcElement,this.html());this.srcElement.show();a.write("");this.iframe.unbind();this.textarea.unbind();wa.parent.remove.call(this)},html:function(a,b){var c=this.doc;if(this.designMode){c=c.body;if(a===k)return a=b?"<!doctype html><html>"+c.parentNode.innerHTML+"</html>":c.innerHTML,this.beforeGetHtml&&(a=this.beforeGetHtml(a)),ka&&a==
    +"<br />"&&(a=""),a;this.beforeSetHtml&&(a=this.beforeSetHtml(a));f(c).html(a);this.afterSetHtml&&this.afterSetHtml();return this}if(a===k)return this.textarea.val();this.textarea.val(a);return this},design:function(a){if(a===k?!this.designMode:a){if(!this.designMode)a=this.html(),this.designMode=!0,this.html(a),this.textarea.hide(),this.iframe.show()}else if(this.designMode)a=this.html(),this.designMode=!1,this.html(a),this.iframe.hide(),this.textarea.show();return this.focus()},focus:function(){this.designMode?
    +this.win.focus():this.textarea[0].focus();return this},blur:function(){if(o){var a=f('<input type="text" style="float:left;width:0;height:0;padding:0;margin:0;border:0;" value="" />',this.div);this.div.append(a);a[0].focus();a.remove()}else this.designMode?this.win.blur():this.textarea[0].blur();return this},afterChange:function(a){function b(b){setTimeout(function(){a(b)},1)}var c=this.doc,d=c.body;f(c).keyup(function(b){!b.ctrlKey&&!b.altKey&&ab[b.which]&&a(b)});f(c).mouseup(a).contextmenu(a);f(this.win).blur(a);
    +f(d).bind("paste",b);f(d).bind("cut",b);return this}});f.edit=zb;f.iframeDoc=Ta;F(Wa,P,{init:function(a){function b(a){a=f(a);if(a.hasClass("ke-outline"))return a;if(a.hasClass("ke-toolbar-icon"))return a.parent()}function c(a,c){var d=b(a.target);if(d&&!d.hasClass("ke-disabled")&&!d.hasClass("ke-selected"))d[c]("ke-on")}var d=this;Wa.parent.init.call(d,a);d.disableMode=l(a.disableMode,!1);d.noDisableItemMap=u(l(a.noDisableItems,[]));d._itemMap={};d.div.addClass("ke-toolbar").bind("contextmenu,mousedown,mousemove",
    +function(a){a.preventDefault()}).attr("unselectable","on");d.div.mouseover(function(a){c(a,"addClass")}).mouseout(function(a){c(a,"removeClass")}).click(function(a){var c=b(a.target);c&&!c.hasClass("ke-disabled")&&d.options.click.call(this,a,c.attr("data-name"))})},get:function(a){if(this._itemMap[a])return this._itemMap[a];return this._itemMap[a]=f("span.ke-icon-"+a,this.div).parent()},select:function(a){Ab.call(this,a,function(a){a.addClass("ke-selected")});return self},unselect:function(a){Ab.call(this,
    +a,function(a){a.removeClass("ke-selected").removeClass("ke-on")});return self},enable:function(a){if(a=a.get?a:this.get(a))a.removeClass("ke-disabled"),a.opacity(1);return this},disable:function(a){if(a=a.get?a:this.get(a))a.removeClass("ke-selected").addClass("ke-disabled"),a.opacity(0.5);return this},disableAll:function(a,b){var c=this,d=c.noDisableItemMap;b&&(d=u(b));(a===k?!c.disableMode:a)?(f("span.ke-outline",c.div).each(function(){var a=f(this),b=a[0].getAttribute("data-name",2);d[b]||c.disable(a)}),
    +c.disableMode=!0):(f("span.ke-outline",c.div).each(function(){var a=f(this),b=a[0].getAttribute("data-name",2);d[b]||c.enable(a)}),c.disableMode=!1);return c}});f.toolbar=Bb;F(xa,P,{init:function(a){a.z=a.z||811213;xa.parent.init.call(this,a);this.centerLineMode=l(a.centerLineMode,!0);this.div.addClass("ke-menu").bind("click,mousedown",function(a){a.stopPropagation()}).attr("unselectable","on")},addItem:function(a){if(a.title==="-")this.div.append(f('<div class="ke-menu-separator"></div>'));else{var b=
    +f('<div class="ke-menu-item" unselectable="on"></div>'),c=f('<div class="ke-inline-block ke-menu-item-left"></div>'),d=f('<div class="ke-inline-block ke-menu-item-right"></div>'),e=q(a.height),g=l(a.iconClass,"");this.div.append(b);e&&(b.css("height",e),d.css("line-height",e));var h;this.centerLineMode&&(h=f('<div class="ke-inline-block ke-menu-item-center"></div>'),e&&h.css("height",e));b.mouseover(function(){f(this).addClass("ke-menu-item-on");h&&h.addClass("ke-menu-item-center-on")}).mouseout(function(){f(this).removeClass("ke-menu-item-on");
    +h&&h.removeClass("ke-menu-item-center-on")}).click(function(b){a.click.call(f(this));b.stopPropagation()}).append(c);h&&b.append(h);b.append(d);a.checked&&(g="ke-icon-checked");g!==""&&c.html('<span class="ke-inline-block ke-toolbar-icon ke-toolbar-icon-url '+g+'"></span>');d.html(a.title);return this}},remove:function(){this.options.beforeRemove&&this.options.beforeRemove.call(this);f(".ke-menu-item",this.div[0]).unbind();xa.parent.remove.call(this);return this}});f.menu=Xa;F(ya,P,{init:function(a){a.z=
    +a.z||811213;ya.parent.init.call(this,a);var b=a.colors||[["#E53333","#E56600","#FF9900","#64451D","#DFC5A4","#FFE500"],["#009900","#006600","#99BB00","#B8D100","#60D978","#00D5FF"],["#337FE5","#003399","#4C33E5","#9933E5","#CC33E5","#EE33EE"],["#FFFFFF","#CCCCCC","#999999","#666666","#333333","#000000"]];this.selectedColor=(a.selectedColor||"").toLowerCase();this._cells=[];this.div.addClass("ke-colorpicker").bind("click,mousedown",function(a){a.stopPropagation()}).attr("unselectable","on");a=this.doc.createElement("table");
    +this.div.append(a);a.className="ke-colorpicker-table";a.cellPadding=0;a.cellSpacing=0;a.border=0;var c=a.insertRow(0),d=c.insertCell(0);d.colSpan=b[0].length;this._addAttr(d,"","ke-colorpicker-cell-top");for(var e=0;e<b.length;e++)for(var c=a.insertRow(e+1),g=0;g<b[e].length;g++)d=c.insertCell(g),this._addAttr(d,b[e][g],"ke-colorpicker-cell")},_addAttr:function(a,b,c){var d=this,a=f(a).addClass(c);d.selectedColor===b.toLowerCase()&&a.addClass("ke-colorpicker-cell-selected");a.attr("title",b||d.options.noColor);
    +a.mouseover(function(){f(this).addClass("ke-colorpicker-cell-on")});a.mouseout(function(){f(this).removeClass("ke-colorpicker-cell-on")});a.click(function(a){a.stop();d.options.click.call(f(this),b)});b?a.append(f('<div class="ke-colorpicker-cell-color" unselectable="on"></div>').css("background-color",b)):a.html(d.options.noColor);f(a).attr("unselectable","on");d._cells.push(a)},remove:function(){n(this._cells,function(){this.unbind()});ya.parent.remove.call(this);return this}});f.colorpicker=Cb;
    +F(Db,{init:function(a){var b=f(a.button),c=a.fieldName||"file",d=a.url||"",e=b.val(),g=a.extraParams||{},h=b[0].className||"",i=a.target||"kindeditor_upload_iframe_"+(new Date).getTime();a.afterError=a.afterError||function(a){alert(a)};var j=[],m;for(m in g)j.push('<input type="hidden" name="'+m+'" value="'+g[m]+'" />');c=['<div class="ke-inline-block '+h+'">',a.target?"":'<iframe name="'+i+'" style="display:none;"></iframe>',a.form?'<div class="ke-upload-area">':'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="'+
    +i+'" action="'+d+'">','<span class="ke-button-common">',j.join(""),'<input type="button" class="ke-button-common ke-button" value="'+e+'" />',"</span>",'<input type="file" class="ke-upload-file" name="'+c+'" tabindex="-1" />',a.form?"</div>":"</form>","</div>"].join("");c=f(c,b.doc);b.hide();b.before(c);this.div=c;this.button=b;this.iframe=a.target?f('iframe[name="'+i+'"]'):f("iframe",c);this.form=a.form?f(a.form):f("form",c);b=a.width||f(".ke-button-common",c).width();this.fileBox=f(".ke-upload-file",
    +c).width(b);this.options=a},submit:function(){var a=this,b=a.iframe;b.bind("load",function(){b.unbind();var c=document.createElement("form");a.fileBox.before(c);f(c).append(a.fileBox);c.reset();f(c).remove(!0);var c=f.iframeDoc(b),d=c.getElementsByTagName("pre")[0],e="",g,e=d?d.innerHTML:c.body.innerHTML;b[0].src="javascript:false";try{g=f.json(e)}catch(h){a.options.afterError.call(a,"<!doctype html><html>"+c.body.parentNode.innerHTML+"</html>")}g&&a.options.afterUpload.call(a,g)});a.form[0].submit();
    +return a},remove:function(){this.fileBox&&this.fileBox.unbind();this.iframe.remove();this.div.remove();this.button.show();return this}});f.uploadbutton=function(a){return new Db(a)};F(za,P,{init:function(a){var b=l(a.shadowMode,!0);a.z=a.z||811213;a.shadowMode=!1;za.parent.init.call(this,a);var c=a.title,d=f(a.body,this.doc),e=a.previewBtn,g=a.yesBtn,h=a.noBtn,i=a.closeBtn,j=l(a.showMask,!0);this.div.addClass("ke-dialog").bind("click,mousedown",function(a){a.stopPropagation()});var m=f('<div class="ke-dialog-content"></div>').appendTo(this.div);
    +o&&B<7?this.iframeMask=f('<iframe src="about:blank" class="ke-dialog-shadow"></iframe>').appendTo(this.div):b&&f('<div class="ke-dialog-shadow"></div>').appendTo(this.div);b=f('<div class="ke-dialog-header"></div>');m.append(b);b.html(c);this.closeIcon=f('<span class="ke-dialog-icon-close" title="'+i.name+'"></span>').click(i.click);b.append(this.closeIcon);this.draggable({clickEl:b,beforeDrag:a.beforeDrag});a=f('<div class="ke-dialog-body"></div>');m.append(a);a.append(d);var k=f('<div class="ke-dialog-footer"></div>');
    +(e||g||h)&&m.append(k);n([{btn:e,name:"preview"},{btn:g,name:"yes"},{btn:h,name:"no"}],function(){if(this.btn){var a=this.btn,a=a||{},b=a.name||"",c=f('<span class="ke-button-common ke-button-outer" title="'+b+'"></span>'),b=f('<input class="ke-button-common ke-button" type="button" value="'+b+'" />');a.click&&b.click(a.click);c.append(b);c.addClass("ke-dialog-"+this.name);k.append(c)}});this.height&&a.height(t(this.height)-b.height()-k.height());this.div.width(this.div.width());this.div.height(this.div.height());
    +this.mask=null;if(j)d=I(this.doc),this.mask=Ua({x:0,y:0,z:this.z-1,cls:"ke-dialog-mask",width:Math.max(d.scrollWidth,d.clientWidth),height:Math.max(d.scrollHeight,d.clientHeight)});this.autoPos(this.div.width(),this.div.height());this.footerDiv=k;this.bodyDiv=a;this.headerDiv=b;this.isLoading=!1},setMaskIndex:function(a){this.mask.div.css("z-index",a)},showLoading:function(a){var a=l(a,""),b=this.bodyDiv;this.loading=f('<div class="ke-dialog-loading"><div class="ke-inline-block ke-dialog-loading-content" style="margin-top:'+
    +Math.round(b.height()/3)+'px;">'+a+"</div></div>").width(b.width()).height(b.height()).css("top",this.headerDiv.height()+"px");b.css("visibility","hidden").after(this.loading);this.isLoading=!0;return this},hideLoading:function(){this.loading&&this.loading.remove();this.bodyDiv.css("visibility","visible");this.isLoading=!1;return this},remove:function(){this.options.beforeRemove&&this.options.beforeRemove.call(this);this.mask&&this.mask.remove();this.iframeMask&&this.iframeMask.remove();this.closeIcon.unbind();
    +f("input",this.div).unbind();f("button",this.div).unbind();this.footerDiv.unbind();this.bodyDiv.unbind();this.headerDiv.unbind();f("iframe",this.div).each(function(){f(this).remove()});za.parent.remove.call(this);return this}});f.dialog=Eb;f.tabs=function(a){var b=Ua(a),c=b.remove,d=a.afterSelect,a=b.div,e=[];a.addClass("ke-tabs").bind("contextmenu,mousedown,mousemove",function(a){a.preventDefault()});var g=f('<ul class="ke-tabs-ul ke-clearfix"></ul>');a.append(g);b.add=function(a){var b=f('<li class="ke-tabs-li">'+
    +a.title+"</li>");b.data("tab",a);e.push(b);g.append(b)};b.selectedIndex=0;b.select=function(a){b.selectedIndex=a;n(e,function(c,d){d.unbind();c===a?(d.addClass("ke-tabs-li-selected"),f(d.data("tab").panel).show("")):(d.removeClass("ke-tabs-li-selected").removeClass("ke-tabs-li-on").mouseover(function(){f(this).addClass("ke-tabs-li-on")}).mouseout(function(){f(this).removeClass("ke-tabs-li-on")}).click(function(){b.select(c)}),f(d.data("tab").panel).hide())});d&&d.call(b,a)};b.remove=function(){n(e,
    +function(){this.remove()});g.remove();c.call(b)};return b};f.loadScript=Ya;f.loadStyle=Za;f.ajax=function(a,b,c,d,e){var c=c||"GET",e=e||"json",g=z.XMLHttpRequest?new z.XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");g.open(c,a,!0);g.onreadystatechange=function(){if(g.readyState==4&&g.status==200&&b){var a=A(g.responseText);e=="json"&&(a=cb(a));b(a)}};if(c=="POST"){var f=[];n(d,function(a,b){f.push(encodeURIComponent(a)+"="+encodeURIComponent(b))});try{g.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}catch(i){}g.send(f.join("&"))}else g.send(null)};
    +var T={},K={};la.prototype={lang:function(a){return Ib(a,this.langType)},loadPlugin:function(a,b){var c=this;if(T[a]){if(c._calledPlugins[a])return b&&b.call(c),c;T[a].call(c,KindEditor);b&&b.call(c);c._calledPlugins[a]=!0;return c}if(c.isLoading)return c;c.isLoading=!0;Ya(c.pluginsPath+a+"/"+a+".js?ver="+encodeURIComponent(f.DEBUG?Ba:Ca),function(){c.isLoading=!1;T[a]&&c.loadPlugin(a,b)});return c},handler:function(a,b){var c=this;c._handlers[a]||(c._handlers[a]=[]);if(bb(b))return c._handlers[a].push(b),
    +c;n(c._handlers[a],function(){b=this.call(c,b)});return b},clickToolbar:function(a,b){var c=this,d="clickToolbar"+a;if(b===k){if(c._handlers[d])return c.handler(d);c.loadPlugin(a,function(){c.handler(d)});return c}return c.handler(d,b)},updateState:function(){var a=this;n("justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,subscript,superscript,bold,italic,underline,strikethrough".split(","),function(b,c){a.cmd.state(c)?a.toolbar.select(c):a.toolbar.unselect(c)});
    +return a},addContextmenu:function(a){this._contextmenus.push(a);return this},afterCreate:function(a){return this.handler("afterCreate",a)},beforeRemove:function(a){return this.handler("beforeRemove",a)},beforeGetHtml:function(a){return this.handler("beforeGetHtml",a)},beforeSetHtml:function(a){return this.handler("beforeSetHtml",a)},afterSetHtml:function(a){return this.handler("afterSetHtml",a)},create:function(){function a(){m.height()===0?setTimeout(a,100):c.resize(e,g)}function b(a,b,d){d=l(d,
    +!0);if(a&&a>=c.minWidth&&(c.resize(a,null),d))c.width=q(a);if(b&&b>=c.minHeight&&(c.resize(null,b),d))c.height=q(b)}var c=this,d=c.fullscreenMode;if(c.isCreated)return c;d?I().style.overflow="hidden":I().style.overflow="";var e=d?I().clientWidth+"px":c.width,g=d?I().clientHeight+"px":c.height;if(o&&B<8||S)g=q(t(g)+2);var h=c.container=f(c.layout);d?f(document.body).append(h):c.srcElement.before(h);var i=f(".toolbar",h),j=f(".edit",h),m=c.statusbar=f(".statusbar",h);h.removeClass("container").addClass("ke-container ke-container-"+
    +c.themeType).css("width",e);if(d){h.css({position:"absolute",left:0,top:0,"z-index":811211});if(!ka)c._scrollPos=Z();z.scrollTo(0,0);f(document.body).css({height:"1px",overflow:"hidden"});f(document.body.parentNode).css("overflow","hidden");c._fullscreenExecuted=!0}else c._fullscreenExecuted&&(f(document.body).css({height:"",overflow:""}),f(document.body.parentNode).css("overflow","")),c._scrollPos&&z.scrollTo(c._scrollPos.x,c._scrollPos.y);var k=[];f.each(c.items,function(a,b){b=="|"?k.push('<span class="ke-inline-block ke-separator"></span>'):
    +b=="/"?k.push('<div class="ke-hr"></div>'):(k.push('<span class="ke-outline" data-name="'+b+'" title="'+c.lang(b)+'" unselectable="on">'),k.push('<span class="ke-toolbar-icon ke-toolbar-icon-url ke-icon-'+b+'" unselectable="on"></span></span>'))});var i=c.toolbar=Bb({src:i,html:k.join(""),noDisableItems:c.noDisableItems,click:function(a,b){a.stop();if(c.menu){var d=c.menu.name;c.hideMenu();if(d===b)return}c.clickToolbar(b)}}),n=t(g)-i.div.height(),p=c.edit=zb({height:n>0&&t(g)>c.minHeight?n:c.minHeight,
    +src:j,srcElement:c.srcElement,designMode:c.designMode,themesPath:c.themesPath,bodyClass:c.bodyClass,cssPath:c.cssPath,cssData:c.cssData,beforeGetHtml:function(a){a=c.beforeGetHtml(a);return Q(a,c.filterMode?c.htmlTags:null,c.urlType,c.wellFormatMode,c.indentChar)},beforeSetHtml:function(a){a=Q(a,c.filterMode?c.htmlTags:null,"",!1);return c.beforeSetHtml(a)},afterSetHtml:function(){c.edit=p=this;c.afterSetHtml()},afterCreate:function(){c.edit=p=this;c.cmd=p.cmd;c._docMousedownFn=function(){c.menu&&
    +c.hideMenu()};f(p.doc,document).mousedown(c._docMousedownFn);Zb.call(c);$b.call(c);ac.call(c);bc.call(c);p.afterChange(function(){p.designMode&&(c.updateState(),c.addBookmark(),c.options.afterChange&&c.options.afterChange.call(c))});p.textarea.keyup(function(a){!a.ctrlKey&&!a.altKey&&Ob[a.which]&&c.options.afterChange&&c.options.afterChange.call(c)});c.readonlyMode&&c.readonly();c.isCreated=!0;if(c.initContent==="")c.initContent=c.html();c.afterCreate();c.options.afterCreate&&c.options.afterCreate.call(c)}});
    +m.removeClass("statusbar").addClass("ke-statusbar").append('<span class="ke-inline-block ke-statusbar-center-icon"></span>').append('<span class="ke-inline-block ke-statusbar-right-icon"></span>');f(z).unbind("resize");a();d?(f(z).bind("resize",function(){c.isCreated&&b(I().clientWidth,I().clientHeight,!1)}),i.select("fullscreen"),m.first().css("visibility","hidden"),m.last().css("visibility","hidden")):(ka&&f(z).bind("scroll",function(){c._scrollPos=Z()}),c.resizeType>0?Sa({moveEl:h,clickEl:m,moveFn:function(a,
    +c,d,e,g,f){e+=f;b(null,e)}}):m.first().css("visibility","hidden"),c.resizeType===2?Sa({moveEl:h,clickEl:m.last(),moveFn:function(a,c,d,e,g,f){d+=g;e+=f;b(d,e)}}):m.last().css("visibility","hidden"));return c},remove:function(){var a=this;if(!a.isCreated)return a;a.beforeRemove();a.menu&&a.hideMenu();n(a.dialogs,function(){a.hideDialog()});f(document).unbind("mousedown",a._docMousedownFn);a.toolbar.remove();a.edit.remove();a.statusbar.last().unbind();a.statusbar.unbind();a.container.remove();a.container=
    +a.toolbar=a.edit=a.menu=null;a.dialogs=[];a.isCreated=!1;return a},resize:function(a,b){a!==null&&t(a)>this.minWidth&&this.container.css("width",q(a));b!==null&&(b=t(b)-this.toolbar.div.height()-this.statusbar.height(),b>0&&t(b)>this.minHeight&&this.edit.setHeight(b));return this},select:function(){this.isCreated&&this.cmd.select();return this},html:function(a){if(a===k)return this.isCreated?this.edit.html():ja(this.srcElement);this.isCreated?this.edit.html(a):ja(this.srcElement,a);return this},fullHtml:function(){return this.isCreated?
    +this.edit.html(k,!0):""},text:function(a){return a===k?A(this.html().replace(/<(?!img|embed).*?>/ig,"").replace(/&nbsp;/ig," ")):this.html(C(a))},isEmpty:function(){return A(this.text().replace(/\r\n|\n|\r/,""))===""},isDirty:function(){return A(this.initContent.replace(/\r\n|\n|\r|t/g,""))!==A(this.html().replace(/\r\n|\n|\r|t/g,""))},selectedHtml:function(){return this.isCreated?this.cmd.range.html():""},count:function(a){a=(a||"html").toLowerCase();if(a==="html")return U($a(this.html())).length;
    +if(a==="text")return this.text().replace(/<(?:img|embed).*?>/ig,"K").replace(/\r\n|\n|\r/g,"").length;return 0},exec:function(a){var a=a.toLowerCase(),b=this.cmd,c=L(a,"selectall,copy,paste,print".split(","))<0;c&&this.addBookmark(!1);b[a].apply(b,Fa(arguments,1));c&&(this.updateState(),this.addBookmark(!1),this.options.afterChange&&this.options.afterChange.call(this));return this},insertHtml:function(a){if(!this.isCreated)return this;a=this.beforeSetHtml(a);this.exec("inserthtml",a);return this},
    +appendHtml:function(a){this.html(this.html()+a);if(this.isCreated)a=this.cmd,a.range.selectNodeContents(a.doc.body).collapse(!1),a.select();return this},sync:function(){ja(this.srcElement,this.html());return this},focus:function(){this.isCreated?this.edit.focus():this.srcElement[0].focus();return this},blur:function(){this.isCreated?this.edit.blur():this.srcElement[0].blur();return this},addBookmark:function(a){var a=l(a,!0),b=this.edit,c=b.doc.body,d=$a(c.innerHTML);if(a&&this._undoStack.length>
    +0&&Math.abs(d.length-U(this._undoStack[this._undoStack.length-1].html).length)<this.minChangeSize)return this;b.designMode&&!this._firstAddBookmark?(b=this.cmd.range,a=b.createBookmark(!0),a.html=$a(c.innerHTML),b.moveToBookmark(a)):a={html:d};this._firstAddBookmark=!1;Jb(this._undoStack,a);return this},undo:function(){return Kb.call(this,this._undoStack,this._redoStack)},redo:function(){return Kb.call(this,this._redoStack,this._undoStack)},fullscreen:function(a){this.fullscreenMode=a===k?!this.fullscreenMode:
    +a;return this.remove().create()},readonly:function(a){var a=l(a,!0),b=this,c=b.edit,d=c.doc;b.designMode?b.toolbar.disableAll(a,[]):n(b.noDisableItems,function(){b.toolbar[a?"disable":"enable"](this)});o?d.body.contentEditable=!a:d.designMode=a?"off":"on";c.textarea[0].disabled=a},createMenu:function(a){var b=this.toolbar.get(a.name),c=b.pos();a.x=c.x;a.y=c.y+b.height();a.shadowMode=l(a.shadowMode,this.shadowMode);a.selectedColor!==k?(a.cls="ke-colorpicker-"+this.themeType,a.noColor=this.lang("noColor"),
    +this.menu=Cb(a)):(a.cls="ke-menu-"+this.themeType,a.centerLineMode=!1,this.menu=Xa(a));return this.menu},hideMenu:function(){this.menu.remove();this.menu=null;return this},hideContextmenu:function(){this.contextmenu.remove();this.contextmenu=null;return this},createDialog:function(a){var b=this;a.autoScroll=l(a.autoScroll,!0);a.shadowMode=l(a.shadowMode,b.shadowMode);a.closeBtn=l(a.closeBtn,{name:b.lang("close"),click:function(){b.hideDialog();o&&b.cmd&&b.cmd.select()}});a.noBtn=l(a.noBtn,{name:b.lang(a.yesBtn?
    +"no":"close"),click:function(){b.hideDialog();o&&b.cmd&&b.cmd.select()}});if(b.dialogAlignType!="page")a.alignEl=b.container;a.cls="ke-dialog-"+b.themeType;if(b.dialogs.length>0){var c=b.dialogs[b.dialogs.length-1];b.dialogs[0].setMaskIndex(c.z+2);a.z=c.z+3;a.showMask=!1}a=Eb(a);b.dialogs.push(a);return a},hideDialog:function(){this.dialogs.length>0&&this.dialogs.pop().remove();this.dialogs.length>0&&this.dialogs[0].setMaskIndex(this.dialogs[this.dialogs.length-1].z-1);return this},errorDialog:function(a){var b=
    +this.createDialog({width:750,title:this.lang("uploadError"),body:'<div style="padding:10px 20px;"><iframe frameborder="0" style="width:708px;height:400px;"></iframe></div>'}),b=f("iframe",b.div),c=f.iframeDoc(b);c.open();c.write(a);c.close();f(c.body).css("background-color","#FFF");b[0].contentWindow.focus();return this}};_instances=[];o&&B<7&&N(document,"BackgroundImageCache",!0);f.EditorClass=la;f.editor=function(a){return new la(a)};f.create=Lb;f.instances=_instances;f.plugin=Gb;f.lang=Ib;Gb("core",
    +function(a){var b=this,c={undo:"Z",redo:"Y",bold:"B",italic:"I",underline:"U",print:"P",selectall:"A"};b.afterSetHtml(function(){b.options.afterChange&&b.options.afterChange.call(b)});b.afterCreate(function(){if(b.syncType=="form"){for(var c=a(b.srcElement),d=!1;c=c.parent();)if(c.name=="form"){d=!0;break}if(d){c.bind("submit",function(){b.sync();a(z).bind("unload",function(){b.edit.textarea.remove()})});var f=a('[type="reset"]',c);f.click(function(){b.html(b.initContent);b.cmd.selection()});b.beforeRemove(function(){c.unbind();
    +f.unbind()})}}});b.clickToolbar("source",function(){b.edit.designMode?(b.toolbar.disableAll(!0),b.edit.design(!1),b.toolbar.select("source")):(b.toolbar.disableAll(!1),b.edit.design(!0),b.toolbar.unselect("source"));b.designMode=b.edit.designMode});b.afterCreate(function(){b.designMode||b.toolbar.disableAll(!0).select("source")});b.clickToolbar("fullscreen",function(){b.fullscreen()});if(b.fullscreenShortcut){var d=!1;b.afterCreate(function(){a(b.edit.doc,b.edit.textarea).keyup(function(a){a.which==
    +27&&setTimeout(function(){b.fullscreen()},0)});if(d){if(o&&!b.designMode)return;b.focus()}d||(d=!0)})}n("undo,redo".split(","),function(a,d){c[d]&&b.afterCreate(function(){Ga(this.edit.doc,c[d],function(){b.clickToolbar(d)})});b.clickToolbar(d,function(){b[d]()})});b.clickToolbar("formatblock",function(){var a=b.lang("formatblock.formatBlock"),c={h1:28,h2:24,h3:18,H4:14,p:12},d=b.cmd.val("formatblock"),f=b.createMenu({name:"formatblock",width:b.langType=="en"?200:150});n(a,function(a,e){var k="font-size:"+
    +c[a]+"px;";a.charAt(0)==="h"&&(k+="font-weight:bold;");f.addItem({title:'<span style="'+k+'" unselectable="on">'+e+"</span>",height:c[a]+12,checked:d===a||d===e,click:function(){b.select().exec("formatblock","<"+a+">").hideMenu()}})})});b.clickToolbar("fontname",function(){var a=b.cmd.val("fontname"),c=b.createMenu({name:"fontname",width:150});n(b.lang("fontname.fontName"),function(d,f){c.addItem({title:'<span style="font-family: '+d+';" unselectable="on">'+f+"</span>",checked:a===d.toLowerCase()||
    +a===f.toLowerCase(),click:function(){b.exec("fontname",d).hideMenu()}})})});b.clickToolbar("fontsize",function(){var a=b.cmd.val("fontsize"),c=b.createMenu({name:"fontsize",width:150});n(b.fontSizeTable,function(d,f){c.addItem({title:'<span style="font-size:'+f+';" unselectable="on">'+f+"</span>",height:t(f)+12,checked:a===f,click:function(){b.exec("fontsize",f).hideMenu()}})})});n("forecolor,hilitecolor".split(","),function(a,c){b.clickToolbar(c,function(){b.createMenu({name:c,selectedColor:b.cmd.val(c)||
    +"default",colors:b.colorTable,click:function(a){b.exec(c,a).hideMenu()}})})});n("cut,copy,paste".split(","),function(a,c){b.clickToolbar(c,function(){b.focus();try{b.exec(c,null)}catch(a){alert(b.lang(c+"Error"))}})});b.clickToolbar("about",function(){var a='<div style="margin:20px;"><div>KindEditor '+Ca+'</div><div>Copyright &copy; <a href="http://www.kindsoft.net/" target="_blank">kindsoft.net</a> All rights reserved.</div></div>';b.createDialog({name:"about",width:300,title:b.lang("about"),body:a})});
    +b.plugin.getSelectedLink=function(){return b.cmd.commonAncestor("a")};b.plugin.getSelectedImage=function(){return Aa(b.edit.cmd.range,function(a){return!/^ke-\w+$/i.test(a[0].className)})};b.plugin.getSelectedFlash=function(){return Aa(b.edit.cmd.range,function(a){return a[0].className=="ke-flash"})};b.plugin.getSelectedMedia=function(){return Aa(b.edit.cmd.range,function(a){return a[0].className=="ke-media"||a[0].className=="ke-rm"})};b.plugin.getSelectedAnchor=function(){return Aa(b.edit.cmd.range,
    +function(a){return a[0].className=="ke-anchor"})};n("link,image,flash,media,anchor".split(","),function(a,c){var d=c.charAt(0).toUpperCase()+c.substr(1);n("edit,delete".split(","),function(a,e){b.addContextmenu({title:b.lang(e+d),click:function(){b.loadPlugin(c,function(){b.plugin[c][e]();b.hideMenu()})},cond:b.plugin["getSelected"+d],width:150,iconClass:e=="edit"?"ke-icon-"+c:k})});b.addContextmenu({title:"-"})});b.plugin.getSelectedTable=function(){return b.cmd.commonAncestor("table")};b.plugin.getSelectedRow=
    +function(){return b.cmd.commonAncestor("tr")};b.plugin.getSelectedCell=function(){return b.cmd.commonAncestor("td")};n("prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,rowmerge,colmerge,rowsplit,colsplit,coldelete,rowdelete,insert,delete".split(","),function(a,c){var d=L(c,["prop","delete"])<0?b.plugin.getSelectedCell:b.plugin.getSelectedTable;b.addContextmenu({title:b.lang("table"+c),click:function(){b.loadPlugin("table",function(){b.plugin.table[c]();b.hideMenu()})},cond:d,
    +width:170,iconClass:"ke-icon-table"+c})});b.addContextmenu({title:"-"});n("selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,indent,outdent,subscript,superscript,hr,print,bold,italic,underline,strikethrough,removeformat,unlink".split(","),function(a,d){c[d]&&b.afterCreate(function(){Ga(this.edit.doc,c[d],function(){b.cmd.selection();b.clickToolbar(d)})});b.clickToolbar(d,function(){b.focus().exec(d,null)})});b.afterCreate(function(){function c(){f.range.moveToBookmark(i);
    +f.select();ba&&(a("div."+k,j).each(function(){a(this).after("<br />").remove(!0)}),a("span.Apple-style-span",j).remove(!0),a("span.Apple-tab-span",j).remove(!0),a("span[style]",j).each(function(){a(this).css("white-space")=="nowrap"&&a(this).remove(!0)}),a("meta",j).remove());var d=j[0].innerHTML;j.remove();d!==""&&(b.pasteType===2&&(/schemas-microsoft-com|worddocument|mso-\w+/i.test(d)?d=lb(d,b.filterMode?b.htmlTags:a.options.htmlTags):(d=Q(d,b.filterMode?b.htmlTags:null),d=b.beforeSetHtml(d))),
    +b.pasteType===1&&(d=d.replace(/<br[^>]*>/ig,"\n"),d=d.replace(/<\/p><p[^>]*>/ig,"\n"),d=d.replace(/<[^>]+>/g,""),d=d.replace(/&nbsp;/ig," "),d=d.replace(/\n\s*\n/g,"\n"),d=d.replace(/ {2}/g," &nbsp;"),b.newlineTag=="p"?/\n/.test(d)&&(d=d.replace(/^/,"<p>").replace(/$/,"</p>").replace(/\n/g,"</p><p>")):d=d.replace(/\n/g,"<br />$&")),b.insertHtml(d,!0))}var d=b.edit.doc,f,i,j,k="__kindeditor_paste__",l=!1;a(d.body).bind("paste",function(n){if(b.pasteType===0)n.stop();else if(!l){l=!0;a("div."+k,d).remove();
    +f=b.cmd.selection();i=f.range.createBookmark();j=a('<div class="'+k+'"></div>',d).css({position:"absolute",width:"1px",height:"1px",overflow:"hidden",left:"-1981px",top:a(i.start).pos().y+"px","white-space":"nowrap"});a(d.body).append(j);if(o){var p=f.range.get(!0);p.moveToElementText(j[0]);p.select();p.execCommand("paste");n.preventDefault()}else f.range.selectNodeContents(j[0]),f.select();setTimeout(function(){c();l=!1},0)}})});b.beforeGetHtml(function(a){return a.replace(/(<(?:noscript|noscript\s[^>]*)>)([\s\S]*?)(<\/noscript>)/ig,
    +function(a,b,c,d){return b+Ea(c).replace(/\s+/g," ")+d}).replace(/<img[^>]*class="?ke-(flash|rm|media)"?[^>]*>/ig,function(a){var a=J(a),b=ea(a.style||""),c=nb(a["data-ke-tag"]);c.width=l(a.width,t(l(b.width,"")));c.height=l(a.height,t(l(b.height,"")));return Ia(c)}).replace(/<img[^>]*class="?ke-anchor"?[^>]*>/ig,function(a){a=J(a);return'<a name="'+unescape(a["data-ke-name"])+'"></a>'}).replace(/<div\s+[^>]*data-ke-script-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig,function(a,b,c){return"<script"+unescape(b)+
    +">"+unescape(c)+"<\/script>"}).replace(/<div\s+[^>]*data-ke-noscript-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig,function(a,b,c){return"<noscript"+unescape(b)+">"+unescape(c)+"</noscript>"}).replace(/(<[^>]*)data-ke-src="([^"]*)"([^>]*>)/ig,function(a,b,c){a=a.replace(/(\s+(?:href|src)=")[^"]*(")/i,"$1"+c+"$2");return a=a.replace(/\s+data-ke-src="[^"]*"/i,"")}).replace(/(<[^>]+\s)data-ke-(on\w+="[^"]*"[^>]*>)/ig,function(a,b,c){return b+c})});b.beforeSetHtml(function(a){return a.replace(/<embed[^>]*type="([^"]+)"[^>]*>(?:<\/embed>)?/ig,
    +function(a){a=J(a);a.src=l(a.src,"");a.width=l(a.width,0);a.height=l(a.height,0);return ob(b.themesPath+"common/blank.gif",a)}).replace(/<a[^>]*name="([^"]+)"[^>]*>(?:<\/a>)?/ig,function(a){var c=J(a);if(c.href!==k)return a;return'<img class="ke-anchor" src="'+b.themesPath+'common/anchor.gif" data-ke-name="'+escape(c.name)+'" />'}).replace(/<script([^>]*)>([\s\S]*?)<\/script>/ig,function(a,b,c){return'<div class="ke-script" data-ke-script-attr="'+escape(b)+'">'+escape(c)+"</div>"}).replace(/<noscript([^>]*)>([\s\S]*?)<\/noscript>/ig,
    +function(a,b,c){return'<div class="ke-noscript" data-ke-noscript-attr="'+escape(b)+'">'+escape(c)+"</div>"}).replace(/(<[^>]*)(href|src)="([^"]*)"([^>]*>)/ig,function(a,b,c,d,e){if(a.match(/\sdata-ke-src="[^"]*"/i))return a;return b+c+'="'+d+'" data-ke-src="'+d+'"'+e}).replace(/(<[^>]+\s)(on\w+="[^"]*"[^>]*>)/ig,function(a,b,c){return b+"data-ke-"+c}).replace(/<table[^>]*\s+border="0"[^>]*>/ig,function(a){if(a.indexOf("ke-zeroborder")>=0)return a;return Rb(a,"ke-zeroborder")})})})}})(window);
    diff --git a/src/main/webapp/plug-in/kindeditor/kindeditor.js b/src/main/webapp/plug-in/kindeditor/kindeditor.js
    new file mode 100644
    index 00000000..a3a9b8fb
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/kindeditor.js
    @@ -0,0 +1,5771 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2012 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @website http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +* @version 4.1.1 (2012-06-10)
    +*******************************************************************************/
    +(function (window, undefined) {
    +	if (window.KindEditor) {
    +		return;
    +	}
    +if (!window.console) {
    +	window.console = {};
    +}
    +if (!console.log) {
    +	console.log = function () {};
    +}
    +var _VERSION = '4.1.1 (2012-06-10)',
    +	_ua = navigator.userAgent.toLowerCase(),
    +	_IE = _ua.indexOf('msie') > -1 && _ua.indexOf('opera') == -1,
    +	_GECKO = _ua.indexOf('gecko') > -1 && _ua.indexOf('khtml') == -1,
    +	_WEBKIT = _ua.indexOf('applewebkit') > -1,
    +	_OPERA = _ua.indexOf('opera') > -1,
    +	_MOBILE = _ua.indexOf('mobile') > -1,
    +	_IOS = /ipad|iphone|ipod/.test(_ua),
    +	_QUIRKS = document.compatMode != 'CSS1Compat',
    +	_matches = /(?:msie|firefox|webkit|opera)[\/:\s](\d+)/.exec(_ua),
    +	_V = _matches ? _matches[1] : '0',
    +	_TIME = new Date().getTime();
    +function _isArray(val) {
    +	if (!val) {
    +		return false;
    +	}
    +	return Object.prototype.toString.call(val) === '[object Array]';
    +}
    +function _isFunction(val) {
    +	if (!val) {
    +		return false;
    +	}
    +	return Object.prototype.toString.call(val) === '[object Function]';
    +}
    +function _inArray(val, arr) {
    +	for (var i = 0, len = arr.length; i < len; i++) {
    +		if (val === arr[i]) {
    +			return i;
    +		}
    +	}
    +	return -1;
    +}
    +function _each(obj, fn) {
    +	if (_isArray(obj)) {
    +		for (var i = 0, len = obj.length; i < len; i++) {
    +			if (fn.call(obj[i], i, obj[i]) === false) {
    +				break;
    +			}
    +		}
    +	} else {
    +		for (var key in obj) {
    +			if (obj.hasOwnProperty(key)) {
    +				if (fn.call(obj[key], key, obj[key]) === false) {
    +					break;
    +				}
    +			}
    +		}
    +	}
    +}
    +function _trim(str) {
    +	return str.replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g, '');
    +}
    +function _inString(val, str, delimiter) {
    +	delimiter = delimiter === undefined ? ',' : delimiter;
    +	return (delimiter + str + delimiter).indexOf(delimiter + val + delimiter) >= 0;
    +}
    +function _addUnit(val, unit) {
    +	unit = unit || 'px';
    +	return val && /^\d+$/.test(val) ? val + 'px' : val;
    +}
    +function _removeUnit(val) {
    +	var match;
    +	return val && (match = /(\d+)/.exec(val)) ? parseInt(match[1], 10) : 0;
    +}
    +function _escape(val) {
    +	return val.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
    +}
    +function _unescape(val) {
    +	return val.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&amp;/g, '&');
    +}
    +function _toCamel(str) {
    +	var arr = str.split('-');
    +	str = '';
    +	_each(arr, function(key, val) {
    +		str += (key > 0) ? val.charAt(0).toUpperCase() + val.substr(1) : val;
    +	});
    +	return str;
    +}
    +function _toHex(val) {
    +	function hex(d) {
    +		var s = parseInt(d, 10).toString(16).toUpperCase();
    +		return s.length > 1 ? s : '0' + s;
    +	}
    +	return val.replace(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/ig,
    +		function($0, $1, $2, $3) {
    +			return '#' + hex($1) + hex($2) + hex($3);
    +		}
    +	);
    +}
    +function _toMap(val, delimiter) {
    +	delimiter = delimiter === undefined ? ',' : delimiter;
    +	var map = {}, arr = _isArray(val) ? val : val.split(delimiter), match;
    +	_each(arr, function(key, val) {
    +		if ((match = /^(\d+)\.\.(\d+)$/.exec(val))) {
    +			for (var i = parseInt(match[1], 10); i <= parseInt(match[2], 10); i++) {
    +				map[i.toString()] = true;
    +			}
    +		} else {
    +			map[val] = true;
    +		}
    +	});
    +	return map;
    +}
    +function _toArray(obj, offset) {
    +	return Array.prototype.slice.call(obj, offset || 0);
    +}
    +function _undef(val, defaultVal) {
    +	return val === undefined ? defaultVal : val;
    +}
    +function _invalidUrl(url) {
    +	return !url || /[<>"]/.test(url);
    +}
    +function _addParam(url, param) {
    +	return url.indexOf('?') >= 0 ? url + '&' + param : url + '?' + param;
    +}
    +function _extend(child, parent, proto) {
    +	if (!proto) {
    +		proto = parent;
    +		parent = null;
    +	}
    +	var childProto;
    +	if (parent) {
    +		var fn = function () {};
    +		fn.prototype = parent.prototype;
    +		childProto = new fn();
    +		_each(proto, function(key, val) {
    +			childProto[key] = val;
    +		});
    +	} else {
    +		childProto = proto;
    +	}
    +	childProto.constructor = child;
    +	child.prototype = childProto;
    +	child.parent = parent ? parent.prototype : null;
    +}
    +function _json(text) {
    +	var match;
    +	if ((match = /\{[\s\S]*\}|\[[\s\S]*\]/.exec(text))) {
    +		text = match[0];
    +	}
    +	var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
    +	cx.lastIndex = 0;
    +	if (cx.test(text)) {
    +		text = text.replace(cx, function (a) {
    +			return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
    +		});
    +	}
    +	if (/^[\],:{}\s]*$/.
    +	test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
    +	replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
    +	replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
    +		return eval('(' + text + ')');
    +	}
    +	throw 'JSON parse error';
    +}
    +var _round = Math.round;
    +var K = {
    +	DEBUG : false,
    +	VERSION : _VERSION,
    +	IE : _IE,
    +	GECKO : _GECKO,
    +	WEBKIT : _WEBKIT,
    +	OPERA : _OPERA,
    +	V : _V,
    +	TIME : _TIME,
    +	each : _each,
    +	isArray : _isArray,
    +	isFunction : _isFunction,
    +	inArray : _inArray,
    +	inString : _inString,
    +	trim : _trim,
    +	addUnit : _addUnit,
    +	removeUnit : _removeUnit,
    +	escape : _escape,
    +	unescape : _unescape,
    +	toCamel : _toCamel,
    +	toHex : _toHex,
    +	toMap : _toMap,
    +	toArray : _toArray,
    +	undef : _undef,
    +	invalidUrl : _invalidUrl,
    +	addParam : _addParam,
    +	extend : _extend,
    +	json : _json
    +};
    +var _INLINE_TAG_MAP = _toMap('a,abbr,acronym,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,img,input,ins,kbd,label,map,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'),
    +	_BLOCK_TAG_MAP = _toMap('address,applet,blockquote,body,center,dd,dir,div,dl,dt,fieldset,form,frameset,h1,h2,h3,h4,h5,h6,head,hr,html,iframe,ins,isindex,li,map,menu,meta,noframes,noscript,object,ol,p,pre,script,style,table,tbody,td,tfoot,th,thead,title,tr,ul'),
    +	_SINGLE_TAG_MAP = _toMap('area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed'),
    +	_STYLE_TAG_MAP = _toMap('b,basefont,big,del,em,font,i,s,small,span,strike,strong,sub,sup,u'),
    +	_CONTROL_TAG_MAP = _toMap('img,table,input,textarea,button'),
    +	_PRE_TAG_MAP = _toMap('pre,style,script'),
    +	_NOSPLIT_TAG_MAP = _toMap('html,head,body,td,tr,table,ol,ul,li'),
    +	_AUTOCLOSE_TAG_MAP = _toMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'),
    +	_FILL_ATTR_MAP = _toMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'),
    +	_VALUE_TAG_MAP = _toMap('input,button,textarea,select');
    +function _getBasePath() {
    +	var els = document.getElementsByTagName('script'), src;
    +	for (var i = 0, len = els.length; i < len; i++) {
    +		src = els[i].src || '';
    +		if (/kindeditor[\w\-\.]*\.js/.test(src)) {
    +			return src.substring(0, src.lastIndexOf('/') + 1);
    +		}
    +	}
    +	return '';
    +}
    +K.basePath = _getBasePath();
    +K.options = {
    +	designMode : true,
    +	fullscreenMode : false,
    +	filterMode : true,
    +	wellFormatMode : true,
    +	shadowMode : true,
    +	loadStyleMode : true,
    +	basePath : K.basePath,
    +	themesPath : K.basePath + 'themes/',
    +	langPath : K.basePath + 'lang/',
    +	pluginsPath : K.basePath + 'plugins/',
    +	themeType : 'default',
    +	langType : 'zh_CN',
    +	urlType : '',
    +	newlineTag : 'p',
    +	resizeType : 2,
    +	syncType : 'form',
    +	pasteType : 2,
    +	dialogAlignType : 'page',
    +	useContextmenu : true,
    +	fullscreenShortcut : true,
    +	bodyClass : 'ke-content',
    +	indentChar : '\t',
    +	cssPath : '',
    +	cssData : '',
    +	minWidth : 650,
    +	minHeight : 100,
    +	minChangeSize : 5,
    +	items : [
    +		'source', '|', 'undo', 'redo', '|', 'preview', 'print', 'template', 'code', 'cut', 'copy', 'paste','|', 'justifyleft', 'justifycenter', 'justifyright',
    +		'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
    +		'superscript', 'clearhtml', 'quickformat', 'selectall', '|', 'fullscreen', 
    +		'formatblock', 'fontname','/', 'fontsize', '|', 'forecolor', 'hilitecolor', 'bold',
    +		'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', '|',
    +		'table', 'hr', 'emoticons', 'pagebreak'
    +	],
    +	noDisableItems : ['source', 'fullscreen'],
    +	colorTable : [
    +		['#E53333', '#E56600', '#FF9900', '#64451D', '#DFC5A4', '#FFE500'],
    +		['#009900', '#006600', '#99BB00', '#B8D100', '#60D978', '#00D5FF'],
    +		['#337FE5', '#003399', '#4C33E5', '#9933E5', '#CC33E5', '#EE33EE'],
    +		['#FFFFFF', '#CCCCCC', '#999999', '#666666', '#333333', '#000000']
    +	],
    +	fontSizeTable : ['9px', '10px', '12px', '14px', '16px', '18px', '24px', '32px'],
    +	htmlTags : {
    +		font : ['color', 'size', 'face', '.background-color'],
    +		span : [
    +			'.color', '.background-color', '.font-size', '.font-family', '.background',
    +			'.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.line-height'
    +		],
    +		div : [
    +			'align', '.border', '.margin', '.padding', '.text-align', '.color',
    +			'.background-color', '.font-size', '.font-family', '.font-weight', '.background',
    +			'.font-style', '.text-decoration', '.vertical-align', '.margin-left'
    +		],
    +		table: [
    +			'border', 'cellspacing', 'cellpadding', 'width', 'height', 'align', 'bordercolor',
    +			'.padding', '.margin', '.border', 'bgcolor', '.text-align', '.color', '.background-color',
    +			'.font-size', '.font-family', '.font-weight', '.font-style', '.text-decoration', '.background',
    +			'.width', '.height', '.border-collapse'
    +		],
    +		'td,th': [
    +			'align', 'valign', 'width', 'height', 'colspan', 'rowspan', 'bgcolor',
    +			'.text-align', '.color', '.background-color', '.font-size', '.font-family', '.font-weight',
    +			'.font-style', '.text-decoration', '.vertical-align', '.background', '.border'
    +		],
    +		a : ['href', 'target', 'name'],
    +		embed : ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess'],
    +		img : ['src', 'width', 'height', 'border', 'alt', 'title', 'align', '.width', '.height', '.border'],
    +		'p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : [
    +			'align', '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.background',
    +			'.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.text-indent', '.margin-left'
    +		],
    +		pre : ['class'],
    +		hr : ['class', '.page-break-after'],
    +		'br,tbody,tr,strong,b,sub,sup,em,i,u,strike,s,del' : []
    +	},
    +	layout : '<div class="container"><div class="toolbar"></div><div class="edit"></div><div class="statusbar"></div></div>'
    +};
    +var _useCapture = false;
    +var _INPUT_KEY_MAP = _toMap('8,9,13,32,46,48..57,59,61,65..90,106,109..111,188,190..192,219..222');
    +var _CURSORMOVE_KEY_MAP = _toMap('33..40');
    +var _CHANGE_KEY_MAP = {};
    +_each(_INPUT_KEY_MAP, function(key, val) {
    +	_CHANGE_KEY_MAP[key] = val;
    +});
    +_each(_CURSORMOVE_KEY_MAP, function(key, val) {
    +	_CHANGE_KEY_MAP[key] = val;
    +});
    +function _bindEvent(el, type, fn) {
    +	if (el.addEventListener){
    +		el.addEventListener(type, fn, _useCapture);
    +	} else if (el.attachEvent){
    +		el.attachEvent('on' + type, fn);
    +	}
    +}
    +function _unbindEvent(el, type, fn) {
    +	if (el.removeEventListener){
    +		el.removeEventListener(type, fn, _useCapture);
    +	} else if (el.detachEvent){
    +		el.detachEvent('on' + type, fn);
    +	}
    +}
    +var _EVENT_PROPS = ('altKey,attrChange,attrName,bubbles,button,cancelable,charCode,clientX,clientY,ctrlKey,currentTarget,' +
    +	'data,detail,eventPhase,fromElement,handler,keyCode,metaKey,newValue,offsetX,offsetY,originalTarget,pageX,' +
    +	'pageY,prevValue,relatedNode,relatedTarget,screenX,screenY,shiftKey,srcElement,target,toElement,view,wheelDelta,which').split(',');
    +function KEvent(el, event) {
    +	this.init(el, event);
    +}
    +_extend(KEvent, {
    +	init : function(el, event) {
    +		var self = this, doc = el.ownerDocument || el.document || el;
    +		self.event = event;
    +		_each(_EVENT_PROPS, function(key, val) {
    +			self[val] = event[val];
    +		});
    +		if (!self.target) {
    +			self.target = self.srcElement || doc;
    +		}
    +		if (self.target.nodeType === 3) {
    +			self.target = self.target.parentNode;
    +		}
    +		if (!self.relatedTarget && self.fromElement) {
    +			self.relatedTarget = self.fromElement === self.target ? self.toElement : self.fromElement;
    +		}
    +		if (self.pageX == null && self.clientX != null) {
    +			var d = doc.documentElement, body = doc.body;
    +			self.pageX = self.clientX + (d && d.scrollLeft || body && body.scrollLeft || 0) - (d && d.clientLeft || body && body.clientLeft || 0);
    +			self.pageY = self.clientY + (d && d.scrollTop  || body && body.scrollTop  || 0) - (d && d.clientTop  || body && body.clientTop  || 0);
    +		}
    +		if (!self.which && ((self.charCode || self.charCode === 0) ? self.charCode : self.keyCode)) {
    +			self.which = self.charCode || self.keyCode;
    +		}
    +		if (!self.metaKey && self.ctrlKey) {
    +			self.metaKey = self.ctrlKey;
    +		}
    +		if (!self.which && self.button !== undefined) {
    +			self.which = (self.button & 1 ? 1 : (self.button & 2 ? 3 : (self.button & 4 ? 2 : 0)));
    +		}
    +		switch (self.which) {
    +		case 186 :
    +			self.which = 59;
    +			break;
    +		case 187 :
    +		case 107 :
    +		case 43 :
    +			self.which = 61;
    +			break;
    +		case 189 :
    +		case 45 :
    +			self.which = 109;
    +			break;
    +		case 42 :
    +			self.which = 106;
    +			break;
    +		case 47 :
    +			self.which = 111;
    +			break;
    +		case 78 :
    +			self.which = 110;
    +			break;
    +		}
    +		if (self.which >= 96 && self.which <= 105) {
    +			self.which -= 48;
    +		}
    +	},
    +	preventDefault : function() {
    +		var ev = this.event;
    +		if (ev.preventDefault) {
    +			ev.preventDefault();
    +		}
    +		ev.returnValue = false;
    +	},
    +	stopPropagation : function() {
    +		var ev = this.event;
    +		if (ev.stopPropagation) {
    +			ev.stopPropagation();
    +		}
    +		ev.cancelBubble = true;
    +	},
    +	stop : function() {
    +		this.preventDefault();
    +		this.stopPropagation();
    +	}
    +});
    +var _eventExpendo = 'kindeditor_' + _TIME, _eventId = 0, _eventData = {};
    +function _getId(el) {
    +	return el[_eventExpendo] || null;
    +}
    +function _setId(el) {
    +	el[_eventExpendo] = ++_eventId;
    +	return _eventId;
    +}
    +function _removeId(el) {
    +	try {
    +		delete el[_eventExpendo];
    +	} catch(e) {
    +		if (el.removeAttribute) {
    +			el.removeAttribute(_eventExpendo);
    +		}
    +	}
    +}
    +function _bind(el, type, fn) {
    +	if (type.indexOf(',') >= 0) {
    +		_each(type.split(','), function() {
    +			_bind(el, this, fn);
    +		});
    +		return;
    +	}
    +	var id = _getId(el);
    +	if (!id) {
    +		id = _setId(el);
    +	}
    +	if (_eventData[id] === undefined) {
    +		_eventData[id] = {};
    +	}
    +	var events = _eventData[id][type];
    +	if (events && events.length > 0) {
    +		_unbindEvent(el, type, events[0]);
    +	} else {
    +		_eventData[id][type] = [];
    +		_eventData[id].el = el;
    +	}
    +	events = _eventData[id][type];
    +	if (events.length === 0) {
    +		events[0] = function(e) {
    +			var kevent = e ? new KEvent(el, e) : undefined;
    +			_each(events, function(i, event) {
    +				if (i > 0 && event) {
    +					event.call(el, kevent);
    +				}
    +			});
    +		};
    +	}
    +	if (_inArray(fn, events) < 0) {
    +		events.push(fn);
    +	}
    +	_bindEvent(el, type, events[0]);
    +}
    +function _unbind(el, type, fn) {
    +	if (type && type.indexOf(',') >= 0) {
    +		_each(type.split(','), function() {
    +			_unbind(el, this, fn);
    +		});
    +		return;
    +	}
    +	var id = _getId(el);
    +	if (!id) {
    +		return;
    +	}
    +	if (type === undefined) {
    +		if (id in _eventData) {
    +			_each(_eventData[id], function(key, events) {
    +				if (key != 'el' && events.length > 0) {
    +					_unbindEvent(el, key, events[0]);
    +				}
    +			});
    +			delete _eventData[id];
    +			_removeId(el);
    +		}
    +		return;
    +	}
    +	if (!_eventData[id]) {
    +		return;
    +	}
    +	var events = _eventData[id][type];
    +	if (events && events.length > 0) {
    +		if (fn === undefined) {
    +			_unbindEvent(el, type, events[0]);
    +			delete _eventData[id][type];
    +		} else {
    +			_each(events, function(i, event) {
    +				if (i > 0 && event === fn) {
    +					events.splice(i, 1);
    +				}
    +			});
    +			if (events.length == 1) {
    +				_unbindEvent(el, type, events[0]);
    +				delete _eventData[id][type];
    +			}
    +		}
    +		var count = 0;
    +		_each(_eventData[id], function() {
    +			count++;
    +		});
    +		if (count < 2) {
    +			delete _eventData[id];
    +			_removeId(el);
    +		}
    +	}
    +}
    +function _fire(el, type) {
    +	if (type.indexOf(',') >= 0) {
    +		_each(type.split(','), function() {
    +			_fire(el, this);
    +		});
    +		return;
    +	}
    +	var id = _getId(el);
    +	if (!id) {
    +		return;
    +	}
    +	var events = _eventData[id][type];
    +	if (_eventData[id] && events && events.length > 0) {
    +		events[0]();
    +	}
    +}
    +function _ctrl(el, key, fn) {
    +	var self = this;
    +	key = /^\d{2,}$/.test(key) ? key : key.toUpperCase().charCodeAt(0);
    +	_bind(el, 'keydown', function(e) {
    +		if (e.ctrlKey && e.which == key && !e.shiftKey && !e.altKey) {
    +			fn.call(el);
    +			e.stop();
    +		}
    +	});
    +}
    +function _ready(fn) {
    +	var loaded = false;
    +	function readyFunc() {
    +		if (!loaded) {
    +			loaded = true;
    +			fn(KindEditor);
    +		}
    +	}
    +	function ieReadyFunc() {
    +		if (!loaded) {
    +			try {
    +				document.documentElement.doScroll('left');
    +			} catch(e) {
    +				setTimeout(ieReadyFunc, 100);
    +				return;
    +			}
    +			readyFunc();
    +		}
    +	}
    +	function ieReadyStateFunc() {
    +		if (document.readyState === 'complete') {
    +			readyFunc();
    +		}
    +	}
    +	if (document.addEventListener) {
    +		_bind(document, 'DOMContentLoaded', readyFunc);
    +	} else if (document.attachEvent) {
    +		_bind(document, 'readystatechange', ieReadyStateFunc);
    +		var toplevel = false;
    +		try {
    +			toplevel = window.frameElement == null;
    +		} catch(e) {}
    +		if (document.documentElement.doScroll && toplevel) {
    +			ieReadyFunc();
    +		}
    +	}
    +	_bind(window, 'load', readyFunc);
    +}
    +if (_IE) {
    +	window.attachEvent('onunload', function() {
    +		_each(_eventData, function(key, events) {
    +			if (events.el) {
    +				_unbind(events.el);
    +			}
    +		});
    +	});
    +}
    +K.ctrl = _ctrl;
    +K.ready = _ready;
    +function _getCssList(css) {
    +	var list = {},
    +		reg = /\s*([\w\-]+)\s*:([^;]*)(;|$)/g,
    +		match;
    +	while ((match = reg.exec(css))) {
    +		var key = _trim(match[1].toLowerCase()),
    +			val = _trim(_toHex(match[2]));
    +		list[key] = val;
    +	}
    +	return list;
    +}
    +function _getAttrList(tag) {
    +	var list = {},
    +		reg = /\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([^\s"'<>]+))|(?:([\w\-:"]+)="([^"]*)")|(?:([\w\-:"]+)='([^']*)'))(?=(?:\s|\/|>)+)/g,
    +		match;
    +	while ((match = reg.exec(tag))) {
    +		var key = (match[1] || match[2] || match[4] || match[6]).toLowerCase(),
    +			val = (match[2] ? match[3] : (match[4] ? match[5] : match[7])) || '';
    +		list[key] = val;
    +	}
    +	return list;
    +}
    +function _addClassToTag(tag, className) {
    +	if (/\s+class\s*=/.test(tag)) {
    +		tag = tag.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/, function($0, $1, $2, $3) {
    +			if ((' ' + $2 + ' ').indexOf(' ' + className + ' ') < 0) {
    +				return $2 === '' ? $1 + className + $3 : $1 + $2 + ' ' + className + $3;
    +			} else {
    +				return $0;
    +			}
    +		});
    +	} else {
    +		tag = tag.substr(0, tag.length - 1) + ' class="' + className + '">';
    +	}
    +	return tag;
    +}
    +function _formatCss(css) {
    +	var str = '';
    +	_each(_getCssList(css), function(key, val) {
    +		str += key + ':' + val + ';';
    +	});
    +	return str;
    +}
    +function _formatUrl(url, mode, host, pathname) {
    +	mode = _undef(mode, '').toLowerCase();
    +	url = url.replace(/([^:])\/\//g, '$1/');
    +	if (_inArray(mode, ['absolute', 'relative', 'domain']) < 0) {
    +		return url;
    +	}
    +	host = host || location.protocol + '//' + location.host;
    +	if (pathname === undefined) {
    +		var m = location.pathname.match(/^(\/.*)\//);
    +		pathname = m ? m[1] : '';
    +	}
    +	var match;
    +	if ((match = /^(\w+:\/\/[^\/]*)/.exec(url))) {
    +		if (match[1] !== host) {
    +			return url;
    +		}
    +	} else if (/^\w+:/.test(url)) {
    +		return url;
    +	}
    +	function getRealPath(path) {
    +		var parts = path.split('/'), paths = [];
    +		for (var i = 0, len = parts.length; i < len; i++) {
    +			var part = parts[i];
    +			if (part == '..') {
    +				if (paths.length > 0) {
    +					paths.pop();
    +				}
    +			} else if (part !== '' && part != '.') {
    +				paths.push(part);
    +			}
    +		}
    +		return '/' + paths.join('/');
    +	}
    +	if (/^\//.test(url)) {
    +		url = host + getRealPath(url.substr(1));
    +	} else if (!/^\w+:\/\//.test(url)) {
    +		url = host + getRealPath(pathname + '/' + url);
    +	}
    +	function getRelativePath(path, depth) {
    +		if (url.substr(0, path.length) === path) {
    +			var arr = [];
    +			for (var i = 0; i < depth; i++) {
    +				arr.push('..');
    +			}
    +			var prefix = '.';
    +			if (arr.length > 0) {
    +				prefix += '/' + arr.join('/');
    +			}
    +			if (pathname == '/') {
    +				prefix += '/';
    +			}
    +			return prefix + url.substr(path.length);
    +		} else {
    +			if ((match = /^(.*)\//.exec(path))) {
    +				return getRelativePath(match[1], ++depth);
    +			}
    +		}
    +	}
    +	if (mode === 'relative') {
    +		url = getRelativePath(host + pathname, 0).substr(2);
    +	} else if (mode === 'absolute') {
    +		if (url.substr(0, host.length) === host) {
    +			url = url.substr(host.length);
    +		}
    +	}
    +	return url;
    +}
    +function _formatHtml(html, htmlTags, urlType, wellFormatted, indentChar) {
    +	urlType = urlType || '';
    +	wellFormatted = _undef(wellFormatted, false);
    +	indentChar = _undef(indentChar, '\t');
    +	var fontSizeList = 'xx-small,x-small,small,medium,large,x-large,xx-large'.split(',');
    +	html = html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig, function($0, $1, $2, $3) {
    +		return $1 + $2.replace(/<(?:br|br\s[^>]*)>/ig, '\n') + $3;
    +	});
    +	html = html.replace(/<(?:br|br\s[^>]*)\s*\/?>\s*<\/p>/ig, '</p>');
    +	html = html.replace(/(<(?:p|p\s[^>]*)>)\s*(<\/p>)/ig, '$1<br />$2');
    +	html = html.replace(/\u200B/g, '');
    +	var htmlTagMap = {};
    +	if (htmlTags) {
    +		_each(htmlTags, function(key, val) {
    +			var arr = key.split(',');
    +			for (var i = 0, len = arr.length; i < len; i++) {
    +				htmlTagMap[arr[i]] = _toMap(val);
    +			}
    +		});
    +		if (!htmlTagMap.script) {
    +			html = html.replace(/(<(?:script|script\s[^>]*)>)([\s\S]*?)(<\/script>)/ig, '');
    +		}
    +		if (!htmlTagMap.style) {
    +			html = html.replace(/(<(?:style|style\s[^>]*)>)([\s\S]*?)(<\/style>)/ig, '');
    +		}
    +	}
    +	var re = /([ \t\n\r]*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[^\s"'<>]+)|(?:\s+[\w\-:"]+="[^"]*")|(?:\s+[\w\-:"]+='[^']*'))*)(\/)?>([ \t\n\r]*)/g;
    +	var tagStack = [];
    +	html = html.replace(re, function($0, $1, $2, $3, $4, $5, $6) {
    +		var full = $0,
    +			startNewline = $1 || '',
    +			startSlash = $2 || '',
    +			tagName = $3.toLowerCase(),
    +			attr = $4 || '',
    +			endSlash = $5 ? ' ' + $5 : '',
    +			endNewline = $6 || '';
    +		if (htmlTags && !htmlTagMap[tagName]) {
    +			return '';
    +		}
    +		if (endSlash === '' && _SINGLE_TAG_MAP[tagName]) {
    +			endSlash = ' /';
    +		}
    +		if (_INLINE_TAG_MAP[tagName]) {
    +			if (startNewline) {
    +				startNewline = ' ';
    +			}
    +			if (endNewline) {
    +				endNewline = ' ';
    +			}
    +		}
    +		if (_PRE_TAG_MAP[tagName]) {
    +			if (startSlash) {
    +				endNewline = '\n';
    +			} else {
    +				startNewline = '\n';
    +			}
    +		}
    +		if (wellFormatted && tagName == 'br') {
    +			endNewline = '\n';
    +		}
    +		if (_BLOCK_TAG_MAP[tagName] && !_PRE_TAG_MAP[tagName]) {
    +			if (wellFormatted) {
    +				if (startSlash && tagStack.length > 0 && tagStack[tagStack.length - 1] === tagName) {
    +					tagStack.pop();
    +				} else {
    +					tagStack.push(tagName);
    +				}
    +				startNewline = '\n';
    +				endNewline = '\n';
    +				for (var i = 0, len = startSlash ? tagStack.length : tagStack.length - 1; i < len; i++) {
    +					startNewline += indentChar;
    +					if (!startSlash) {
    +						endNewline += indentChar;
    +					}
    +				}
    +				if (endSlash) {
    +					tagStack.pop();
    +				} else if (!startSlash) {
    +					endNewline += indentChar;
    +				}
    +			} else {
    +				startNewline = endNewline = '';
    +			}
    +		}
    +		if (attr !== '') {
    +			var attrMap = _getAttrList(full);
    +			if (tagName === 'font') {
    +				var fontStyleMap = {}, fontStyle = '';
    +				_each(attrMap, function(key, val) {
    +					if (key === 'color') {
    +						fontStyleMap.color = val;
    +						delete attrMap[key];
    +					}
    +					if (key === 'size') {
    +						fontStyleMap['font-size'] = fontSizeList[parseInt(val, 10) - 1] || '';
    +						delete attrMap[key];
    +					}
    +					if (key === 'face') {
    +						fontStyleMap['font-family'] = val;
    +						delete attrMap[key];
    +					}
    +					if (key === 'style') {
    +						fontStyle = val;
    +					}
    +				});
    +				if (fontStyle && !/;$/.test(fontStyle)) {
    +					fontStyle += ';';
    +				}
    +				_each(fontStyleMap, function(key, val) {
    +					if (val === '') {
    +						return;
    +					}
    +					if (/\s/.test(val)) {
    +						val = "'" + val + "'";
    +					}
    +					fontStyle += key + ':' + val + ';';
    +				});
    +				attrMap.style = fontStyle;
    +			}
    +			_each(attrMap, function(key, val) {
    +				if (_FILL_ATTR_MAP[key]) {
    +					attrMap[key] = key;
    +				}
    +				if (_inArray(key, ['src', 'href']) >= 0) {
    +					attrMap[key] = _formatUrl(val, urlType);
    +				}
    +				if (htmlTags && key !== 'style' && !htmlTagMap[tagName]['*'] && !htmlTagMap[tagName][key] ||
    +					tagName === 'body' && key === 'contenteditable' ||
    +					/^kindeditor_\d+$/.test(key)) {
    +					delete attrMap[key];
    +				}
    +				if (key === 'style' && val !== '') {
    +					var styleMap = _getCssList(val);
    +					_each(styleMap, function(k, v) {
    +						if (htmlTags && !htmlTagMap[tagName].style && !htmlTagMap[tagName]['.' + k]) {
    +							delete styleMap[k];
    +						}
    +					});
    +					var style = '';
    +					_each(styleMap, function(k, v) {
    +						style += k + ':' + v + ';';
    +					});
    +					attrMap.style = style;
    +				}
    +			});
    +			attr = '';
    +			_each(attrMap, function(key, val) {
    +				if (key === 'style' && val === '') {
    +					return;
    +				}
    +				val = val.replace(/"/g, '&quot;');
    +				attr += ' ' + key + '="' + val + '"';
    +			});
    +		}
    +		if (tagName === 'font') {
    +			tagName = 'span';
    +		}
    +		return startNewline + '<' + startSlash + tagName + attr + endSlash + '>' + endNewline;
    +	});
    +	html = html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig, function($0, $1, $2, $3) {
    +		return $1 + $2.replace(/\n/g, '<span id="__kindeditor_pre_newline__">\n') + $3;
    +	});
    +	html = html.replace(/\n\s*\n/g, '\n');
    +	html = html.replace(/<span id="__kindeditor_pre_newline__">\n/g, '\n');
    +	return _trim(html);
    +}
    +function _clearMsWord(html, htmlTags) {
    +	html = html.replace(/<meta[\s\S]*?>/ig, '')
    +		.replace(/<![\s\S]*?>/ig, '')
    +		.replace(/<style[^>]*>[\s\S]*?<\/style>/ig, '')
    +		.replace(/<script[^>]*>[\s\S]*?<\/script>/ig, '')
    +		.replace(/<w:[^>]+>[\s\S]*?<\/w:[^>]+>/ig, '')
    +		.replace(/<o:[^>]+>[\s\S]*?<\/o:[^>]+>/ig, '')
    +		.replace(/<xml>[\s\S]*?<\/xml>/ig, '')
    +		.replace(/<(?:table|td)[^>]*>/ig, function(full) {
    +			return full.replace(/border-bottom:([#\w\s]+)/ig, 'border:$1');
    +		});
    +	return _formatHtml(html, htmlTags);
    +}
    +function _mediaType(src) {
    +	if (/\.(rm|rmvb)(\?|$)/i.test(src)) {
    +		return 'audio/x-pn-realaudio-plugin';
    +	}
    +	if (/\.(swf|flv)(\?|$)/i.test(src)) {
    +		return 'application/x-shockwave-flash';
    +	}
    +	return 'video/x-ms-asf-plugin';
    +}
    +function _mediaClass(type) {
    +	if (/realaudio/i.test(type)) {
    +		return 'ke-rm';
    +	}
    +	if (/flash/i.test(type)) {
    +		return 'ke-flash';
    +	}
    +	return 'ke-media';
    +}
    +function _mediaAttrs(srcTag) {
    +	return _getAttrList(unescape(srcTag));
    +}
    +function _mediaEmbed(attrs) {
    +	var html = '<embed ';
    +	_each(attrs, function(key, val) {
    +		html += key + '="' + val + '" ';
    +	});
    +	html += '/>';
    +	return html;
    +}
    +function _mediaImg(blankPath, attrs) {
    +	var width = attrs.width,
    +		height = attrs.height,
    +		type = attrs.type || _mediaType(attrs.src),
    +		srcTag = _mediaEmbed(attrs),
    +		style = '';
    +	if (width > 0) {
    +		style += 'width:' + width + 'px;';
    +	}
    +	if (height > 0) {
    +		style += 'height:' + height + 'px;';
    +	}
    +	var html = '<img class="' + _mediaClass(type) + '" src="' + blankPath + '" ';
    +	if (style !== '') {
    +		html += 'style="' + style + '" ';
    +	}
    +	html += 'data-ke-tag="' + escape(srcTag) + '" alt="" />';
    +	return html;
    +}
    +function _tmpl(str, data) {
    +	var fn = new Function("obj",
    +		"var p=[],print=function(){p.push.apply(p,arguments);};" +
    +		"with(obj){p.push('" +
    +		str.replace(/[\r\t\n]/g, " ")
    +			.split("<%").join("\t")
    +			.replace(/((^|%>)[^\t]*)'/g, "$1\r")
    +			.replace(/\t=(.*?)%>/g, "',$1,'")
    +			.split("\t").join("');")
    +			.split("%>").join("p.push('")
    +			.split("\r").join("\\'") + "');}return p.join('');");
    +	return data ? fn(data) : fn;
    +}
    +K.formatUrl = _formatUrl;
    +K.formatHtml = _formatHtml;
    +K.getCssList = _getCssList;
    +K.getAttrList = _getAttrList;
    +K.mediaType = _mediaType;
    +K.mediaAttrs = _mediaAttrs;
    +K.mediaEmbed = _mediaEmbed;
    +K.mediaImg = _mediaImg;
    +K.clearMsWord = _clearMsWord;
    +K.tmpl = _tmpl;
    +function _contains(nodeA, nodeB) {
    +	if (nodeA.nodeType == 9 && nodeB.nodeType != 9) {
    +		return true;
    +	}
    +	while ((nodeB = nodeB.parentNode)) {
    +		if (nodeB == nodeA) {
    +			return true;
    +		}
    +	}
    +	return false;
    +}
    +var _getSetAttrDiv = document.createElement('div');
    +_getSetAttrDiv.setAttribute('className', 't');
    +var _GET_SET_ATTRIBUTE = _getSetAttrDiv.className !== 't';
    +function _getAttr(el, key) {
    +	key = key.toLowerCase();
    +	var val = null;
    +	if (!_GET_SET_ATTRIBUTE && el.nodeName.toLowerCase() != 'script') {
    +		var div = el.ownerDocument.createElement('div');
    +		div.appendChild(el.cloneNode(false));
    +		var list = _getAttrList(_unescape(div.innerHTML));
    +		if (key in list) {
    +			val = list[key];
    +		}
    +	} else {
    +		try {
    +			val = el.getAttribute(key, 2);
    +		} catch(e) {
    +			val = el.getAttribute(key, 1);
    +		}
    +	}
    +	if (key === 'style' && val !== null) {
    +		val = _formatCss(val);
    +	}
    +	return val;
    +}
    +function _queryAll(expr, root) {
    +	var exprList = expr.split(',');
    +	if (exprList.length > 1) {
    +		var mergedResults = [];
    +		_each(exprList, function() {
    +			_each(_queryAll(this, root), function() {
    +				if (_inArray(this, mergedResults) < 0) {
    +					mergedResults.push(this);
    +				}
    +			});
    +		});
    +		return mergedResults;
    +	}
    +	root = root || document;
    +	function escape(str) {
    +		if (typeof str != 'string') {
    +			return str;
    +		}
    +		return str.replace(/([^\w\-])/g, '\\$1');
    +	}
    +	function stripslashes(str) {
    +		return str.replace(/\\/g, '');
    +	}
    +	function cmpTag(tagA, tagB) {
    +		return tagA === '*' || tagA.toLowerCase() === escape(tagB.toLowerCase());
    +	}
    +	function byId(id, tag, root) {
    +		var arr = [],
    +			doc = root.ownerDocument || root,
    +			el = doc.getElementById(stripslashes(id));
    +		if (el) {
    +			if (cmpTag(tag, el.nodeName) && _contains(root, el)) {
    +				arr.push(el);
    +			}
    +		}
    +		return arr;
    +	}
    +	function byClass(className, tag, root) {
    +		var doc = root.ownerDocument || root, arr = [], els, i, len, el;
    +		if (root.getElementsByClassName) {
    +			els = root.getElementsByClassName(stripslashes(className));
    +			for (i = 0, len = els.length; i < len; i++) {
    +				el = els[i];
    +				if (cmpTag(tag, el.nodeName)) {
    +					arr.push(el);
    +				}
    +			}
    +		} else if (doc.querySelectorAll) {
    +			els = doc.querySelectorAll((root.nodeName !== '#document' ? root.nodeName + ' ' : '') + tag + '.' + className);
    +			for (i = 0, len = els.length; i < len; i++) {
    +				el = els[i];
    +				if (_contains(root, el)) {
    +					arr.push(el);
    +				}
    +			}
    +		} else {
    +			els = root.getElementsByTagName(tag);
    +			className = ' ' + className + ' ';
    +			for (i = 0, len = els.length; i < len; i++) {
    +				el = els[i];
    +				if (el.nodeType == 1) {
    +					var cls = el.className;
    +					if (cls && (' ' + cls + ' ').indexOf(className) > -1) {
    +						arr.push(el);
    +					}
    +				}
    +			}
    +		}
    +		return arr;
    +	}
    +	function byName(name, tag, root) {
    +		var arr = [], doc = root.ownerDocument || root,
    +			els = doc.getElementsByName(stripslashes(name)), el;
    +		for (var i = 0, len = els.length; i < len; i++) {
    +			el = els[i];
    +			if (cmpTag(tag, el.nodeName) && _contains(root, el)) {
    +				if (el.getAttributeNode('name')) {
    +					arr.push(el);
    +				}
    +			}
    +		}
    +		return arr;
    +	}
    +	function byAttr(key, val, tag, root) {
    +		var arr = [], els = root.getElementsByTagName(tag), el;
    +		for (var i = 0, len = els.length; i < len; i++) {
    +			el = els[i];
    +			if (el.nodeType == 1) {
    +				if (val === null) {
    +					if (_getAttr(el, key) !== null) {
    +						arr.push(el);
    +					}
    +				} else {
    +					if (val === escape(_getAttr(el, key))) {
    +						arr.push(el);
    +					}
    +				}
    +			}
    +		}
    +		return arr;
    +	}
    +	function select(expr, root) {
    +		var arr = [], matches;
    +		matches = /^((?:\\.|[^.#\s\[<>])+)/.exec(expr);
    +		var tag = matches ? matches[1] : '*';
    +		if ((matches = /#((?:[\w\-]|\\.)+)$/.exec(expr))) {
    +			arr = byId(matches[1], tag, root);
    +		} else if ((matches = /\.((?:[\w\-]|\\.)+)$/.exec(expr))) {
    +			arr = byClass(matches[1], tag, root);
    +		} else if ((matches = /\[((?:[\w\-]|\\.)+)\]/.exec(expr))) {
    +			arr = byAttr(matches[1].toLowerCase(), null, tag, root);
    +		} else if ((matches = /\[((?:[\w\-]|\\.)+)\s*=\s*['"]?((?:\\.|[^'"]+)+)['"]?\]/.exec(expr))) {
    +			var key = matches[1].toLowerCase(), val = matches[2];
    +			if (key === 'id') {
    +				arr = byId(val, tag, root);
    +			} else if (key === 'class') {
    +				arr = byClass(val, tag, root);
    +			} else if (key === 'name') {
    +				arr = byName(val, tag, root);
    +			} else {
    +				arr = byAttr(key, val, tag, root);
    +			}
    +		} else {
    +			var els = root.getElementsByTagName(tag), el;
    +			for (var i = 0, len = els.length; i < len; i++) {
    +				el = els[i];
    +				if (el.nodeType == 1) {
    +					arr.push(el);
    +				}
    +			}
    +		}
    +		return arr;
    +	}
    +	var parts = [], arr, re = /((?:\\.|[^\s>])+|[\s>])/g;
    +	while ((arr = re.exec(expr))) {
    +		if (arr[1] !== ' ') {
    +			parts.push(arr[1]);
    +		}
    +	}
    +	var results = [];
    +	if (parts.length == 1) {
    +		return select(parts[0], root);
    +	}
    +	var isChild = false, part, els, subResults, val, v, i, j, k, length, len, l;
    +	for (i = 0, lenth = parts.length; i < lenth; i++) {
    +		part = parts[i];
    +		if (part === '>') {
    +			isChild = true;
    +			continue;
    +		}
    +		if (i > 0) {
    +			els = [];
    +			for (j = 0, len = results.length; j < len; j++) {
    +				val = results[j];
    +				subResults = select(part, val);
    +				for (k = 0, l = subResults.length; k < l; k++) {
    +					v = subResults[k];
    +					if (isChild) {
    +						if (val === v.parentNode) {
    +							els.push(v);
    +						}
    +					} else {
    +						els.push(v);
    +					}
    +				}
    +			}
    +			results = els;
    +		} else {
    +			results = select(part, root);
    +		}
    +		if (results.length === 0) {
    +			return [];
    +		}
    +	}
    +	return results;
    +}
    +function _query(expr, root) {
    +	var arr = _queryAll(expr, root);
    +	return arr.length > 0 ? arr[0] : null;
    +}
    +K.query = _query;
    +K.queryAll = _queryAll;
    +function _get(val) {
    +	return K(val)[0];
    +}
    +function _getDoc(node) {
    +	if (!node) {
    +		return document;
    +	}
    +	return node.ownerDocument || node.document || node;
    +}
    +function _getWin(node) {
    +	if (!node) {
    +		return window;
    +	}
    +	var doc = _getDoc(node);
    +	return doc.parentWindow || doc.defaultView;
    +}
    +function _setHtml(el, html) {
    +	if (el.nodeType != 1) {
    +		return;
    +	}
    +	var doc = _getDoc(el);
    +	try {
    +		el.innerHTML = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + html;
    +		var temp = doc.getElementById('__kindeditor_temp_tag__');
    +		temp.parentNode.removeChild(temp);
    +	} catch(e) {
    +		K(el).empty();
    +		K('@' + html, doc).each(function() {
    +			el.appendChild(this);
    +		});
    +	}
    +}
    +function _hasClass(el, cls) {
    +	return _inString(cls, el.className, ' ');
    +}
    +function _setAttr(el, key, val) {
    +	if (_IE && _V < 8 && key.toLowerCase() == 'class') {
    +		key = 'className';
    +	}
    +	el.setAttribute(key, '' + val);
    +}
    +function _removeAttr(el, key) {
    +	if (_IE && _V < 8 && key.toLowerCase() == 'class') {
    +		key = 'className';
    +	}
    +	_setAttr(el, key, '');
    +	el.removeAttribute(key);
    +}
    +function _getNodeName(node) {
    +	if (!node || !node.nodeName) {
    +		return '';
    +	}
    +	return node.nodeName.toLowerCase();
    +}
    +function _computedCss(el, key) {
    +	var self = this, win = _getWin(el), camelKey = _toCamel(key), val = '';
    +	if (win.getComputedStyle) {
    +		var style = win.getComputedStyle(el, null);
    +		val = style[camelKey] || style.getPropertyValue(key) || el.style[camelKey];
    +	} else if (el.currentStyle) {
    +		val = el.currentStyle[camelKey] || el.style[camelKey];
    +	}
    +	return val;
    +}
    +function _hasVal(node) {
    +	return !!_VALUE_TAG_MAP[_getNodeName(node)];
    +}
    +function _docElement(doc) {
    +	doc = doc || document;
    +	return _QUIRKS ? doc.body : doc.documentElement;
    +}
    +function _docHeight(doc) {
    +	var el = _docElement(doc);
    +	return Math.max(el.scrollHeight, el.clientHeight);
    +}
    +function _docWidth(doc) {
    +	var el = _docElement(doc);
    +	return Math.max(el.scrollWidth, el.clientWidth);
    +}
    +function _getScrollPos(doc) {
    +	doc = doc || document;
    +	var x, y;
    +	if (_IE || _OPERA) {
    +		x = _docElement(doc).scrollLeft;
    +		y = _docElement(doc).scrollTop;
    +	} else {
    +		x = _getWin(doc).scrollX;
    +		y = _getWin(doc).scrollY;
    +	}
    +	return {x : x, y : y};
    +}
    +function KNode(node) {
    +	this.init(node);
    +}
    +_extend(KNode, {
    +	init : function(node) {
    +		var self = this;
    +		node = _isArray(node) ? node : [node];
    +		var length = 0;
    +		for (var i = 0, len = node.length; i < len; i++) {
    +			if (node[i]) {
    +				self[i] = node[i].constructor === KNode ? node[i][0] : node[i];
    +				length++;
    +			}
    +		}
    +		self.length = length;
    +		self.doc = _getDoc(self[0]);
    +		self.name = _getNodeName(self[0]);
    +		self.type = self.length > 0 ? self[0].nodeType : null;
    +		self.win = _getWin(self[0]);
    +		self._data = {};
    +	},
    +	each : function(fn) {
    +		var self = this;
    +		for (var i = 0; i < self.length; i++) {
    +			if (fn.call(self[i], i, self[i]) === false) {
    +				return self;
    +			}
    +		}
    +		return self;
    +	},
    +	bind : function(type, fn) {
    +		this.each(function() {
    +			_bind(this, type, fn);
    +		});
    +		return this;
    +	},
    +	unbind : function(type, fn) {
    +		this.each(function() {
    +			_unbind(this, type, fn);
    +		});
    +		return this;
    +	},
    +	fire : function(type) {
    +		if (this.length < 1) {
    +			return this;
    +		}
    +		_fire(this[0], type);
    +		return this;
    +	},
    +	hasAttr : function(key) {
    +		if (this.length < 1) {
    +			return false;
    +		}
    +		return !!_getAttr(this[0], key);
    +	},
    +	attr : function(key, val) {
    +		var self = this;
    +		if (key === undefined) {
    +			return _getAttrList(self.outer());
    +		}
    +		if (typeof key === 'object') {
    +			_each(key, function(k, v) {
    +				self.attr(k, v);
    +			});
    +			return self;
    +		}
    +		if (val === undefined) {
    +			val = self.length < 1 ? null : _getAttr(self[0], key);
    +			return val === null ? '' : val;
    +		}
    +		self.each(function() {
    +			_setAttr(this, key, val);
    +		});
    +		return self;
    +	},
    +	removeAttr : function(key) {
    +		this.each(function() {
    +			_removeAttr(this, key);
    +		});
    +		return this;
    +	},
    +	get : function(i) {
    +		if (this.length < 1) {
    +			return null;
    +		}
    +		return this[i || 0];
    +	},
    +	eq : function(i) {
    +		if (this.length < 1) {
    +			return null;
    +		}
    +		return this[i] ? new KNode(this[i]) : null;
    +	},
    +	hasClass : function(cls) {
    +		if (this.length < 1) {
    +			return false;
    +		}
    +		return _hasClass(this[0], cls);
    +	},
    +	addClass : function(cls) {
    +		this.each(function() {
    +			if (!_hasClass(this, cls)) {
    +				this.className = _trim(this.className + ' ' + cls);
    +			}
    +		});
    +		return this;
    +	},
    +	removeClass : function(cls) {
    +		this.each(function() {
    +			if (_hasClass(this, cls)) {
    +				this.className = _trim(this.className.replace(new RegExp('(^|\\s)' + cls + '(\\s|$)'), ' '));
    +			}
    +		});
    +		return this;
    +	},
    +	html : function(val) {
    +		var self = this;
    +		if (val === undefined) {
    +			if (self.length < 1 || self.type != 1) {
    +				return '';
    +			}
    +			return _formatHtml(self[0].innerHTML);
    +		}
    +		self.each(function() {
    +			_setHtml(this, val);
    +		});
    +		return self;
    +	},
    +	text : function() {
    +		var self = this;
    +		if (self.length < 1) {
    +			return '';
    +		}
    +		return _IE ? self[0].innerText : self[0].textContent;
    +	},
    +	hasVal : function() {
    +		if (this.length < 1) {
    +			return false;
    +		}
    +		return _hasVal(this[0]);
    +	},
    +	val : function(val) {
    +		var self = this;
    +		if (val === undefined) {
    +			if (self.length < 1) {
    +				return '';
    +			}
    +			return self.hasVal() ? self[0].value : self.attr('value');
    +		} else {
    +			self.each(function() {
    +				if (_hasVal(this)) {
    +					this.value = val;
    +				} else {
    +					_setAttr(this, 'value' , val);
    +				}
    +			});
    +			return self;
    +		}
    +	},
    +	css : function(key, val) {
    +		var self = this;
    +		if (key === undefined) {
    +			return _getCssList(self.attr('style'));
    +		}
    +		if (typeof key === 'object') {
    +			_each(key, function(k, v) {
    +				self.css(k, v);
    +			});
    +			return self;
    +		}
    +		if (val === undefined) {
    +			if (self.length < 1) {
    +				return '';
    +			}
    +			return self[0].style[_toCamel(key)] || _computedCss(self[0], key) || '';
    +		}
    +		self.each(function() {
    +			this.style[_toCamel(key)] = val;
    +		});
    +		return self;
    +	},
    +	width : function(val) {
    +		var self = this;
    +		if (val === undefined) {
    +			if (self.length < 1) {
    +				return 0;
    +			}
    +			return self[0].offsetWidth;
    +		}
    +		return self.css('width', _addUnit(val));
    +	},
    +	height : function(val) {
    +		var self = this;
    +		if (val === undefined) {
    +			if (self.length < 1) {
    +				return 0;
    +			}
    +			return self[0].offsetHeight;
    +		}
    +		return self.css('height', _addUnit(val));
    +	},
    +	opacity : function(val) {
    +		this.each(function() {
    +			if (this.style.opacity === undefined) {
    +				this.style.filter = val == 1 ? '' : 'alpha(opacity=' + (val * 100) + ')';
    +			} else {
    +				this.style.opacity = val == 1 ? '' : val;
    +			}
    +		});
    +		return this;
    +	},
    +	data : function(key, val) {
    +		var self = this;
    +		if (val === undefined) {
    +			return self._data[key];
    +		}
    +		self._data[key] = val;
    +		return self;
    +	},
    +	pos : function() {
    +		var self = this, node = self[0], x = 0, y = 0;
    +		if (node) {
    +			if (node.getBoundingClientRect) {
    +				var box = node.getBoundingClientRect(),
    +					pos = _getScrollPos(self.doc);
    +				x = box.left + pos.x;
    +				y = box.top + pos.y;
    +			} else {
    +				while (node) {
    +					x += node.offsetLeft;
    +					y += node.offsetTop;
    +					node = node.offsetParent;
    +				}
    +			}
    +		}
    +		return {x : _round(x), y : _round(y)};
    +	},
    +	clone : function(bool) {
    +		if (this.length < 1) {
    +			return new KNode([]);
    +		}
    +		return new KNode(this[0].cloneNode(bool));
    +	},
    +	append : function(expr) {
    +		this.each(function() {
    +			if (this.appendChild) {
    +				this.appendChild(_get(expr));
    +			}
    +		});
    +		return this;
    +	},
    +	appendTo : function(expr) {
    +		this.each(function() {
    +			_get(expr).appendChild(this);
    +		});
    +		return this;
    +	},
    +	before : function(expr) {
    +		this.each(function() {
    +			this.parentNode.insertBefore(_get(expr), this);
    +		});
    +		return this;
    +	},
    +	after : function(expr) {
    +		this.each(function() {
    +			if (this.nextSibling) {
    +				this.parentNode.insertBefore(_get(expr), this.nextSibling);
    +			} else {
    +				this.parentNode.appendChild(_get(expr));
    +			}
    +		});
    +		return this;
    +	},
    +	replaceWith : function(expr) {
    +		var nodes = [];
    +		this.each(function(i, node) {
    +			_unbind(node);
    +			var newNode = _get(expr);
    +			node.parentNode.replaceChild(newNode, node);
    +			nodes.push(newNode);
    +		});
    +		return K(nodes);
    +	},
    +	empty : function() {
    +		var self = this;
    +		self.each(function(i, node) {
    +			var child = node.firstChild;
    +			while (child) {
    +				if (!node.parentNode) {
    +					return;
    +				}
    +				var next = child.nextSibling;
    +				child.parentNode.removeChild(child);
    +				child = next;
    +			}
    +		});
    +		return self;
    +	},
    +	remove : function(keepChilds) {
    +		var self = this;
    +		self.each(function(i, node) {
    +			if (!node.parentNode) {
    +				return;
    +			}
    +			_unbind(node);
    +			if (keepChilds) {
    +				var child = node.firstChild;
    +				while (child) {
    +					var next = child.nextSibling;
    +					node.parentNode.insertBefore(child, node);
    +					child = next;
    +				}
    +			}
    +			node.parentNode.removeChild(node);
    +			delete self[i];
    +		});
    +		self.length = 0;
    +		self._data = {};
    +		return self;
    +	},
    +	show : function(val) {
    +		return this.css('display', val === undefined ? 'block' : val);
    +	},
    +	hide : function() {
    +		return this.css('display', 'none');
    +	},
    +	outer : function() {
    +		var self = this;
    +		if (self.length < 1) {
    +			return '';
    +		}
    +		var div = self.doc.createElement('div'), html;
    +		div.appendChild(self[0].cloneNode(true));
    +		html = _formatHtml(div.innerHTML);
    +		div = null;
    +		return html;
    +	},
    +	isSingle : function() {
    +		return !!_SINGLE_TAG_MAP[this.name];
    +	},
    +	isInline : function() {
    +		return !!_INLINE_TAG_MAP[this.name];
    +	},
    +	isBlock : function() {
    +		return !!_BLOCK_TAG_MAP[this.name];
    +	},
    +	isStyle : function() {
    +		return !!_STYLE_TAG_MAP[this.name];
    +	},
    +	isControl : function() {
    +		return !!_CONTROL_TAG_MAP[this.name];
    +	},
    +	contains : function(otherNode) {
    +		if (this.length < 1) {
    +			return false;
    +		}
    +		return _contains(this[0], _get(otherNode));
    +	},
    +	parent : function() {
    +		if (this.length < 1) {
    +			return null;
    +		}
    +		var node = this[0].parentNode;
    +		return node ? new KNode(node) : null;
    +	},
    +	children : function() {
    +		if (this.length < 1) {
    +			return new KNode([]);
    +		}
    +		var list = [], child = this[0].firstChild;
    +		while (child) {
    +			if (child.nodeType != 3 || _trim(child.nodeValue) !== '') {
    +				list.push(child);
    +			}
    +			child = child.nextSibling;
    +		}
    +		return new KNode(list);
    +	},
    +	first : function() {
    +		var list = this.children();
    +		return list.length > 0 ? list.eq(0) : null;
    +	},
    +	last : function() {
    +		var list = this.children();
    +		return list.length > 0 ? list.eq(list.length - 1) : null;
    +	},
    +	index : function() {
    +		if (this.length < 1) {
    +			return -1;
    +		}
    +		var i = -1, sibling = this[0];
    +		while (sibling) {
    +			i++;
    +			sibling = sibling.previousSibling;
    +		}
    +		return i;
    +	},
    +	prev : function() {
    +		if (this.length < 1) {
    +			return null;
    +		}
    +		var node = this[0].previousSibling;
    +		return node ? new KNode(node) : null;
    +	},
    +	next : function() {
    +		if (this.length < 1) {
    +			return null;
    +		}
    +		var node = this[0].nextSibling;
    +		return node ? new KNode(node) : null;
    +	},
    +	scan : function(fn, order) {
    +		if (this.length < 1) {
    +			return;
    +		}
    +		order = (order === undefined) ? true : order;
    +		function walk(node) {
    +			var n = order ? node.firstChild : node.lastChild;
    +			while (n) {
    +				var next = order ? n.nextSibling : n.previousSibling;
    +				if (fn(n) === false) {
    +					return false;
    +				}
    +				if (walk(n) === false) {
    +					return false;
    +				}
    +				n = next;
    +			}
    +		}
    +		walk(this[0]);
    +		return this;
    +	}
    +});
    +_each(('blur,focus,focusin,focusout,load,resize,scroll,unload,click,dblclick,' +
    +	'mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,' +
    +	'change,select,submit,keydown,keypress,keyup,error,contextmenu').split(','), function(i, type) {
    +	KNode.prototype[type] = function(fn) {
    +		return fn ? this.bind(type, fn) : this.fire(type);
    +	};
    +});
    +var _K = K;
    +K = function(expr, root) {
    +	if (expr === undefined || expr === null) {
    +		return;
    +	}
    +	function newNode(node) {
    +		if (!node[0]) {
    +			node = [];
    +		}
    +		return new KNode(node);
    +	}
    +	if (typeof expr === 'string') {
    +		if (root) {
    +			root = _get(root);
    +		}
    +		var length = expr.length;
    +		if (expr.charAt(0) === '@') {
    +			expr = expr.substr(1);
    +		}
    +		if (expr.length !== length || /<.+>/.test(expr)) {
    +			var doc = root ? root.ownerDocument || root : document,
    +				div = doc.createElement('div'), list = [];
    +			div.innerHTML = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + expr;
    +			for (var i = 0, len = div.childNodes.length; i < len; i++) {
    +				var child = div.childNodes[i];
    +				if (child.id == '__kindeditor_temp_tag__') {
    +					continue;
    +				}
    +				list.push(child);
    +			}
    +			return newNode(list);
    +		}
    +		return newNode(_queryAll(expr, root));
    +	}
    +	if (expr && expr.constructor === KNode) {
    +		return expr;
    +	}
    +	if (_isArray(expr)) {
    +		return newNode(expr);
    +	}
    +	return newNode(_toArray(arguments));
    +};
    +_each(_K, function(key, val) {
    +	K[key] = val;
    +});
    +window.KindEditor = K;
    +var _START_TO_START = 0,
    +	_START_TO_END = 1,
    +	_END_TO_END = 2,
    +	_END_TO_START = 3,
    +	_BOOKMARK_ID = 0;
    +function _updateCollapsed(range) {
    +	range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);
    +	return range;
    +}
    +function _copyAndDelete(range, isCopy, isDelete) {
    +	var doc = range.doc, nodeList = [];
    +	function splitTextNode(node, startOffset, endOffset) {
    +		var length = node.nodeValue.length, centerNode;
    +		if (isCopy) {
    +			var cloneNode = node.cloneNode(true);
    +			if (startOffset > 0) {
    +				centerNode = cloneNode.splitText(startOffset);
    +			} else {
    +				centerNode = cloneNode;
    +			}
    +			if (endOffset < length) {
    +				centerNode.splitText(endOffset - startOffset);
    +			}
    +		}
    +		if (isDelete) {
    +			var center = node;
    +			if (startOffset > 0) {
    +				center = node.splitText(startOffset);
    +				range.setStart(node, startOffset);
    +			}
    +			if (endOffset < length) {
    +				var right = center.splitText(endOffset - startOffset);
    +				range.setEnd(right, 0);
    +			}
    +			nodeList.push(center);
    +		}
    +		return centerNode;
    +	}
    +	function removeNodes() {
    +		if (isDelete) {
    +			range.up().collapse(true);
    +		}
    +		for (var i = 0, len = nodeList.length; i < len; i++) {
    +			var node = nodeList[i];
    +			if (node.parentNode) {
    +				node.parentNode.removeChild(node);
    +			}
    +		}
    +	}
    +	var copyRange = range.cloneRange().down();
    +	var start = -1, incStart = -1, incEnd = -1, end = -1,
    +		ancestor = range.commonAncestor(), frag = doc.createDocumentFragment();
    +	if (ancestor.nodeType == 3) {
    +		var textNode = splitTextNode(ancestor, range.startOffset, range.endOffset);
    +		if (isCopy) {
    +			frag.appendChild(textNode);
    +		}
    +		removeNodes();
    +		return isCopy ? frag : range;
    +	}
    +	function extractNodes(parent, frag) {
    +		var node = parent.firstChild, nextNode;
    +		while (node) {
    +			var testRange = new KRange(doc).selectNode(node);
    +			start = testRange.compareBoundaryPoints(_START_TO_END, range);
    +			if (start >= 0 && incStart <= 0) {
    +				incStart = testRange.compareBoundaryPoints(_START_TO_START, range);
    +			}
    +			if (incStart >= 0 && incEnd <= 0) {
    +				incEnd = testRange.compareBoundaryPoints(_END_TO_END, range);
    +			}
    +			if (incEnd >= 0 && end <= 0) {
    +				end = testRange.compareBoundaryPoints(_END_TO_START, range);
    +			}
    +			if (end >= 0) {
    +				return false;
    +			}
    +			nextNode = node.nextSibling;
    +			if (start > 0) {
    +				if (node.nodeType == 1) {
    +					if (incStart >= 0 && incEnd <= 0) {
    +						if (isCopy) {
    +							frag.appendChild(node.cloneNode(true));
    +						}
    +						if (isDelete) {
    +							nodeList.push(node);
    +						}
    +					} else {
    +						var childFlag;
    +						if (isCopy) {
    +							childFlag = node.cloneNode(false);
    +							frag.appendChild(childFlag);
    +						}
    +						if (extractNodes(node, childFlag) === false) {
    +							return false;
    +						}
    +					}
    +				} else if (node.nodeType == 3) {
    +					var textNode;
    +					if (node == copyRange.startContainer) {
    +						textNode = splitTextNode(node, copyRange.startOffset, node.nodeValue.length);
    +					} else if (node == copyRange.endContainer) {
    +						textNode = splitTextNode(node, 0, copyRange.endOffset);
    +					} else {
    +						textNode = splitTextNode(node, 0, node.nodeValue.length);
    +					}
    +					if (isCopy) {
    +						try {
    +							frag.appendChild(textNode);
    +						} catch(e) {}
    +					}
    +				}
    +			}
    +			node = nextNode;
    +		}
    +	}
    +	extractNodes(ancestor, frag);
    +	if (isDelete) {
    +		range.up().collapse(true);
    +	}
    +	for (var i = 0, len = nodeList.length; i < len; i++) {
    +		var node = nodeList[i];
    +		if (node.parentNode) {
    +			node.parentNode.removeChild(node);
    +		}
    +	}
    +	return isCopy ? frag : range;
    +}
    +function _moveToElementText(range, el) {
    +	var node = el;
    +	while (node) {
    +		var knode = K(node);
    +		if (knode.name == 'marquee' || knode.name == 'select') {
    +			return;
    +		}
    +		node = node.parentNode;
    +	}
    +	try {
    +		range.moveToElementText(el);
    +	} catch(e) {}
    +}
    +function _getStartEnd(rng, isStart) {
    +	var doc = rng.parentElement().ownerDocument,
    +		pointRange = rng.duplicate();
    +	pointRange.collapse(isStart);
    +	var parent = pointRange.parentElement(),
    +		nodes = parent.childNodes;
    +	if (nodes.length === 0) {
    +		return {node: parent.parentNode, offset: K(parent).index()};
    +	}
    +	var startNode = doc, startPos = 0, cmp = -1;
    +	var testRange = rng.duplicate();
    +	_moveToElementText(testRange, parent);
    +	for (var i = 0, len = nodes.length; i < len; i++) {
    +		var node = nodes[i];
    +		cmp = testRange.compareEndPoints('StartToStart', pointRange);
    +		if (cmp === 0) {
    +			return {node: node.parentNode, offset: i};
    +		}
    +		if (node.nodeType == 1) {
    +			var nodeRange = rng.duplicate(), dummy, knode = K(node), newNode = node;
    +			if (knode.isControl()) {
    +				dummy = doc.createElement('span');
    +				knode.after(dummy);
    +				newNode = dummy;
    +				startPos += knode.text().replace(/\r\n|\n|\r/g, '').length;
    +			}
    +			_moveToElementText(nodeRange, newNode);
    +			testRange.setEndPoint('StartToEnd', nodeRange);
    +			if (cmp > 0) {
    +				startPos += nodeRange.text.replace(/\r\n|\n|\r/g, '').length;
    +			} else {
    +				startPos = 0;
    +			}
    +			if (dummy) {
    +				K(dummy).remove();
    +			}
    +		} else if (node.nodeType == 3) {
    +			testRange.moveStart('character', node.nodeValue.length);
    +			startPos += node.nodeValue.length;
    +		}
    +		if (cmp < 0) {
    +			startNode = node;
    +		}
    +	}
    +	if (cmp < 0 && startNode.nodeType == 1) {
    +		return {node: parent, offset: K(parent.lastChild).index() + 1};
    +	}
    +	if (cmp > 0) {
    +		while (startNode.nextSibling && startNode.nodeType == 1) {
    +			startNode = startNode.nextSibling;
    +		}
    +	}
    +	testRange = rng.duplicate();
    +	_moveToElementText(testRange, parent);
    +	testRange.setEndPoint('StartToEnd', pointRange);
    +	startPos -= testRange.text.replace(/\r\n|\n|\r/g, '').length;
    +	if (cmp > 0 && startNode.nodeType == 3) {
    +		var prevNode = startNode.previousSibling;
    +		while (prevNode && prevNode.nodeType == 3) {
    +			startPos -= prevNode.nodeValue.length;
    +			prevNode = prevNode.previousSibling;
    +		}
    +	}
    +	return {node: startNode, offset: startPos};
    +}
    +function _getEndRange(node, offset) {
    +	var doc = node.ownerDocument || node,
    +		range = doc.body.createTextRange();
    +	if (doc == node) {
    +		range.collapse(true);
    +		return range;
    +	}
    +	if (node.nodeType == 1 && node.childNodes.length > 0) {
    +		var children = node.childNodes, isStart, child;
    +		if (offset === 0) {
    +			child = children[0];
    +			isStart = true;
    +		} else {
    +			child = children[offset - 1];
    +			isStart = false;
    +		}
    +		if (!child) {
    +			return range;
    +		}
    +		if (K(child).name === 'head') {
    +			if (offset === 1) {
    +				isStart = true;
    +			}
    +			if (offset === 2) {
    +				isStart = false;
    +			}
    +			range.collapse(isStart);
    +			return range;
    +		}
    +		if (child.nodeType == 1) {
    +			var kchild = K(child), span;
    +			if (kchild.isControl()) {
    +				span = doc.createElement('span');
    +				if (isStart) {
    +					kchild.before(span);
    +				} else {
    +					kchild.after(span);
    +				}
    +				child = span;
    +			}
    +			_moveToElementText(range, child);
    +			range.collapse(isStart);
    +			if (span) {
    +				K(span).remove();
    +			}
    +			return range;
    +		}
    +		node = child;
    +		offset = isStart ? 0 : child.nodeValue.length;
    +	}
    +	var dummy = doc.createElement('span');
    +	K(node).before(dummy);
    +	_moveToElementText(range, dummy);
    +	range.moveStart('character', offset);
    +	K(dummy).remove();
    +	return range;
    +}
    +function _toRange(rng) {
    +	var doc, range;
    +	function tr2td(start) {
    +		if (K(start.node).name == 'tr') {
    +			start.node = start.node.cells[start.offset];
    +			start.offset = 0;
    +		}
    +	}
    +	if (_IE) {
    +		if (rng.item) {
    +			doc = _getDoc(rng.item(0));
    +			range = new KRange(doc);
    +			range.selectNode(rng.item(0));
    +			return range;
    +		}
    +		doc = rng.parentElement().ownerDocument;
    +		var start = _getStartEnd(rng, true),
    +			end = _getStartEnd(rng, false);
    +		tr2td(start);
    +		tr2td(end);
    +		range = new KRange(doc);
    +		range.setStart(start.node, start.offset);
    +		range.setEnd(end.node, end.offset);
    +		return range;
    +	}
    +	var startContainer = rng.startContainer;
    +	doc = startContainer.ownerDocument || startContainer;
    +	range = new KRange(doc);
    +	range.setStart(startContainer, rng.startOffset);
    +	range.setEnd(rng.endContainer, rng.endOffset);
    +	return range;
    +}
    +function KRange(doc) {
    +	this.init(doc);
    +}
    +_extend(KRange, {
    +	init : function(doc) {
    +		var self = this;
    +		self.startContainer = doc;
    +		self.startOffset = 0;
    +		self.endContainer = doc;
    +		self.endOffset = 0;
    +		self.collapsed = true;
    +		self.doc = doc;
    +	},
    +	commonAncestor : function() {
    +		function getParents(node) {
    +			var parents = [];
    +			while (node) {
    +				parents.push(node);
    +				node = node.parentNode;
    +			}
    +			return parents;
    +		}
    +		var parentsA = getParents(this.startContainer),
    +			parentsB = getParents(this.endContainer),
    +			i = 0, lenA = parentsA.length, lenB = parentsB.length, parentA, parentB;
    +		while (++i) {
    +			parentA = parentsA[lenA - i];
    +			parentB = parentsB[lenB - i];
    +			if (!parentA || !parentB || parentA !== parentB) {
    +				break;
    +			}
    +		}
    +		return parentsA[lenA - i + 1];
    +	},
    +	setStart : function(node, offset) {
    +		var self = this, doc = self.doc;
    +		self.startContainer = node;
    +		self.startOffset = offset;
    +		if (self.endContainer === doc) {
    +			self.endContainer = node;
    +			self.endOffset = offset;
    +		}
    +		return _updateCollapsed(this);
    +	},
    +	setEnd : function(node, offset) {
    +		var self = this, doc = self.doc;
    +		self.endContainer = node;
    +		self.endOffset = offset;
    +		if (self.startContainer === doc) {
    +			self.startContainer = node;
    +			self.startOffset = offset;
    +		}
    +		return _updateCollapsed(this);
    +	},
    +	setStartBefore : function(node) {
    +		return this.setStart(node.parentNode || this.doc, K(node).index());
    +	},
    +	setStartAfter : function(node) {
    +		return this.setStart(node.parentNode || this.doc, K(node).index() + 1);
    +	},
    +	setEndBefore : function(node) {
    +		return this.setEnd(node.parentNode || this.doc, K(node).index());
    +	},
    +	setEndAfter : function(node) {
    +		return this.setEnd(node.parentNode || this.doc, K(node).index() + 1);
    +	},
    +	selectNode : function(node) {
    +		return this.setStartBefore(node).setEndAfter(node);
    +	},
    +	selectNodeContents : function(node) {
    +		var knode = K(node);
    +		if (knode.type == 3 || knode.isSingle()) {
    +			return this.selectNode(node);
    +		}
    +		var children = knode.children();
    +		if (children.length > 0) {
    +			return this.setStartBefore(children[0]).setEndAfter(children[children.length - 1]);
    +		}
    +		return this.setStart(node, 0).setEnd(node, 0);
    +	},
    +	collapse : function(toStart) {
    +		if (toStart) {
    +			return this.setEnd(this.startContainer, this.startOffset);
    +		}
    +		return this.setStart(this.endContainer, this.endOffset);
    +	},
    +	compareBoundaryPoints : function(how, range) {
    +		var rangeA = this.get(), rangeB = range.get();
    +		if (_IE) {
    +			var arr = {};
    +			arr[_START_TO_START] = 'StartToStart';
    +			arr[_START_TO_END] = 'EndToStart';
    +			arr[_END_TO_END] = 'EndToEnd';
    +			arr[_END_TO_START] = 'StartToEnd';
    +			var cmp = rangeA.compareEndPoints(arr[how], rangeB);
    +			if (cmp !== 0) {
    +				return cmp;
    +			}
    +			var nodeA, nodeB, nodeC, posA, posB;
    +			if (how === _START_TO_START || how === _END_TO_START) {
    +				nodeA = this.startContainer;
    +				posA = this.startOffset;
    +			}
    +			if (how === _START_TO_END || how === _END_TO_END) {
    +				nodeA = this.endContainer;
    +				posA = this.endOffset;
    +			}
    +			if (how === _START_TO_START || how === _START_TO_END) {
    +				nodeB = range.startContainer;
    +				posB = range.startOffset;
    +			}
    +			if (how === _END_TO_END || how === _END_TO_START) {
    +				nodeB = range.endContainer;
    +				posB = range.endOffset;
    +			}
    +			if (nodeA === nodeB) {
    +				var diff = posA - posB;
    +				return diff > 0 ? 1 : (diff < 0 ? -1 : 0);
    +			}
    +			nodeC = nodeB;
    +			while (nodeC && nodeC.parentNode !== nodeA) {
    +				nodeC = nodeC.parentNode;
    +			}
    +			if (nodeC) {
    +				return K(nodeC).index() >= posA ? -1 : 1;
    +			}
    +			nodeC = nodeA;
    +			while (nodeC && nodeC.parentNode !== nodeB) {
    +				nodeC = nodeC.parentNode;
    +			}
    +			if (nodeC) {
    +				return K(nodeC).index() >= posB ? 1 : -1;
    +			}
    +			nodeC = K(nodeB).next();
    +			if (nodeC && nodeC.contains(nodeA)) {
    +				return 1;
    +			}
    +			nodeC = K(nodeA).next();
    +			if (nodeC && nodeC.contains(nodeB)) {
    +				return -1;
    +			}
    +		} else {
    +			return rangeA.compareBoundaryPoints(how, rangeB);
    +		}
    +	},
    +	cloneRange : function() {
    +		return new KRange(this.doc).setStart(this.startContainer, this.startOffset).setEnd(this.endContainer, this.endOffset);
    +	},
    +	toString : function() {
    +		var rng = this.get(), str = _IE ? rng.text : rng.toString();
    +		return str.replace(/\r\n|\n|\r/g, '');
    +	},
    +	cloneContents : function() {
    +		return _copyAndDelete(this, true, false);
    +	},
    +	deleteContents : function() {
    +		return _copyAndDelete(this, false, true);
    +	},
    +	extractContents : function() {
    +		return _copyAndDelete(this, true, true);
    +	},
    +	insertNode : function(node) {
    +		var self = this,
    +			sc = self.startContainer, so = self.startOffset,
    +			ec = self.endContainer, eo = self.endOffset,
    +			firstChild, lastChild, c, nodeCount = 1;
    +		if (node.nodeName.toLowerCase() === '#document-fragment') {
    +			firstChild = node.firstChild;
    +			lastChild = node.lastChild;
    +			nodeCount = node.childNodes.length;
    +		}
    +		if (sc.nodeType == 1) {
    +			c = sc.childNodes[so];
    +			if (c) {
    +				sc.insertBefore(node, c);
    +				if (sc === ec) {
    +					eo += nodeCount;
    +				}
    +			} else {
    +				sc.appendChild(node);
    +			}
    +		} else if (sc.nodeType == 3) {
    +			if (so === 0) {
    +				sc.parentNode.insertBefore(node, sc);
    +				if (sc.parentNode === ec) {
    +					eo += nodeCount;
    +				}
    +			} else if (so >= sc.nodeValue.length) {
    +				if (sc.nextSibling) {
    +					sc.parentNode.insertBefore(node, sc.nextSibling);
    +				} else {
    +					sc.parentNode.appendChild(node);
    +				}
    +			} else {
    +				if (so > 0) {
    +					c = sc.splitText(so);
    +				} else {
    +					c = sc;
    +				}
    +				sc.parentNode.insertBefore(node, c);
    +				if (sc === ec) {
    +					ec = c;
    +					eo -= so;
    +				}
    +			}
    +		}
    +		if (firstChild) {
    +			self.setStartBefore(firstChild).setEndAfter(lastChild);
    +		} else {
    +			self.selectNode(node);
    +		}
    +		if (self.compareBoundaryPoints(_END_TO_END, self.cloneRange().setEnd(ec, eo)) >= 1) {
    +			return self;
    +		}
    +		return self.setEnd(ec, eo);
    +	},
    +	surroundContents : function(node) {
    +		node.appendChild(this.extractContents());
    +		return this.insertNode(node).selectNode(node);
    +	},
    +	isControl : function() {
    +		var self = this,
    +			sc = self.startContainer, so = self.startOffset,
    +			ec = self.endContainer, eo = self.endOffset, rng;
    +		return sc.nodeType == 1 && sc === ec && so + 1 === eo && K(sc.childNodes[so]).isControl();
    +	},
    +	get : function(hasControlRange) {
    +		var self = this, doc = self.doc, node, rng;
    +		if (!_IE) {
    +			rng = doc.createRange();
    +			try {
    +				rng.setStart(self.startContainer, self.startOffset);
    +				rng.setEnd(self.endContainer, self.endOffset);
    +			} catch (e) {}
    +			return rng;
    +		}
    +		if (hasControlRange && self.isControl()) {
    +			rng = doc.body.createControlRange();
    +			rng.addElement(self.startContainer.childNodes[self.startOffset]);
    +			return rng;
    +		}
    +		var range = self.cloneRange().down();
    +		rng = doc.body.createTextRange();
    +		rng.setEndPoint('StartToStart', _getEndRange(range.startContainer, range.startOffset));
    +		rng.setEndPoint('EndToStart', _getEndRange(range.endContainer, range.endOffset));
    +		return rng;
    +	},
    +	html : function() {
    +		return K(this.cloneContents()).outer();
    +	},
    +	down : function() {
    +		var self = this;
    +		function downPos(node, pos, isStart) {
    +			if (node.nodeType != 1) {
    +				return;
    +			}
    +			var children = K(node).children();
    +			if (children.length === 0) {
    +				return;
    +			}
    +			var left, right, child, offset;
    +			if (pos > 0) {
    +				left = children.eq(pos - 1);
    +			}
    +			if (pos < children.length) {
    +				right = children.eq(pos);
    +			}
    +			if (left && left.type == 3) {
    +				child = left[0];
    +				offset = child.nodeValue.length;
    +			}
    +			if (right && right.type == 3) {
    +				child = right[0];
    +				offset = 0;
    +			}
    +			if (!child) {
    +				return;
    +			}
    +			if (isStart) {
    +				self.setStart(child, offset);
    +			} else {
    +				self.setEnd(child, offset);
    +			}
    +		}
    +		downPos(self.startContainer, self.startOffset, true);
    +		downPos(self.endContainer, self.endOffset, false);
    +		return self;
    +	},
    +	up : function() {
    +		var self = this;
    +		function upPos(node, pos, isStart) {
    +			if (node.nodeType != 3) {
    +				return;
    +			}
    +			if (pos === 0) {
    +				if (isStart) {
    +					self.setStartBefore(node);
    +				} else {
    +					self.setEndBefore(node);
    +				}
    +			} else if (pos == node.nodeValue.length) {
    +				if (isStart) {
    +					self.setStartAfter(node);
    +				} else {
    +					self.setEndAfter(node);
    +				}
    +			}
    +		}
    +		upPos(self.startContainer, self.startOffset, true);
    +		upPos(self.endContainer, self.endOffset, false);
    +		return self;
    +	},
    +	enlarge : function(toBlock) {
    +		var self = this;
    +		self.up();
    +		function enlargePos(node, pos, isStart) {
    +			var knode = K(node), parent;
    +			if (knode.type == 3 || _NOSPLIT_TAG_MAP[knode.name] || !toBlock && knode.isBlock()) {
    +				return;
    +			}
    +			if (pos === 0) {
    +				while (!knode.prev()) {
    +					parent = knode.parent();
    +					if (!parent || _NOSPLIT_TAG_MAP[parent.name] || !toBlock && parent.isBlock()) {
    +						break;
    +					}
    +					knode = parent;
    +				}
    +				if (isStart) {
    +					self.setStartBefore(knode[0]);
    +				} else {
    +					self.setEndBefore(knode[0]);
    +				}
    +			} else if (pos == knode.children().length) {
    +				while (!knode.next()) {
    +					parent = knode.parent();
    +					if (!parent || _NOSPLIT_TAG_MAP[parent.name] || !toBlock && parent.isBlock()) {
    +						break;
    +					}
    +					knode = parent;
    +				}
    +				if (isStart) {
    +					self.setStartAfter(knode[0]);
    +				} else {
    +					self.setEndAfter(knode[0]);
    +				}
    +			}
    +		}
    +		enlargePos(self.startContainer, self.startOffset, true);
    +		enlargePos(self.endContainer, self.endOffset, false);
    +		return self;
    +	},
    +	shrink : function() {
    +		var self = this, child, collapsed = self.collapsed;
    +		while (self.startContainer.nodeType == 1 && (child = self.startContainer.childNodes[self.startOffset]) && child.nodeType == 1 && !K(child).isSingle()) {
    +			self.setStart(child, 0);
    +		}
    +		if (collapsed) {
    +			return self.collapse(collapsed);
    +		}
    +		while (self.endContainer.nodeType == 1 && self.endOffset > 0 && (child = self.endContainer.childNodes[self.endOffset - 1]) && child.nodeType == 1 && !K(child).isSingle()) {
    +			self.setEnd(child, child.childNodes.length);
    +		}
    +		return self;
    +	},
    +	createBookmark : function(serialize) {
    +		var self = this, doc = self.doc, endNode,
    +			startNode = K('<span style="display:none;"></span>', doc)[0];
    +		startNode.id = '__kindeditor_bookmark_start_' + (_BOOKMARK_ID++) + '__';
    +		if (!self.collapsed) {
    +			endNode = startNode.cloneNode(true);
    +			endNode.id = '__kindeditor_bookmark_end_' + (_BOOKMARK_ID++) + '__';
    +		}
    +		if (endNode) {
    +			self.cloneRange().collapse(false).insertNode(endNode).setEndBefore(endNode);
    +		}
    +		self.insertNode(startNode).setStartAfter(startNode);
    +		return {
    +			start : serialize ? '#' + startNode.id : startNode,
    +			end : endNode ? (serialize ? '#' + endNode.id : endNode) : null
    +		};
    +	},
    +	moveToBookmark : function(bookmark) {
    +		var self = this, doc = self.doc,
    +			start = K(bookmark.start, doc), end = bookmark.end ? K(bookmark.end, doc) : null;
    +		if (!start || start.length < 1) {
    +			return self;
    +		}
    +		self.setStartBefore(start[0]);
    +		start.remove();
    +		if (end && end.length > 0) {
    +			self.setEndBefore(end[0]);
    +			end.remove();
    +		} else {
    +			self.collapse(true);
    +		}
    +		return self;
    +	},
    +	dump : function() {
    +		console.log('--------------------');
    +		console.log(this.startContainer.nodeType == 3 ? this.startContainer.nodeValue : this.startContainer, this.startOffset);
    +		console.log(this.endContainer.nodeType == 3 ? this.endContainer.nodeValue : this.endContainer, this.endOffset);
    +	}
    +});
    +function _range(mixed) {
    +	if (!mixed.nodeName) {
    +		return mixed.constructor === KRange ? mixed : _toRange(mixed);
    +	}
    +	return new KRange(mixed);
    +}
    +K.range = _range;
    +K.START_TO_START = _START_TO_START;
    +K.START_TO_END = _START_TO_END;
    +K.END_TO_END = _END_TO_END;
    +K.END_TO_START = _END_TO_START;
    +function _nativeCommand(doc, key, val) {
    +	try {
    +		doc.execCommand(key, false, val);
    +	} catch(e) {}
    +}
    +function _nativeCommandValue(doc, key) {
    +	var val = '';
    +	try {
    +		val = doc.queryCommandValue(key);
    +	} catch (e) {}
    +	if (typeof val !== 'string') {
    +		val = '';
    +	}
    +	return val;
    +}
    +function _getSel(doc) {
    +	var win = _getWin(doc);
    +	return doc.selection || win.getSelection();
    +}
    +function _getRng(doc) {
    +	var sel = _getSel(doc), rng;
    +	try {
    +		if (sel.rangeCount > 0) {
    +			rng = sel.getRangeAt(0);
    +		} else {
    +			rng = sel.createRange();
    +		}
    +	} catch(e) {}
    +	if (_IE && (!rng || (!rng.item && rng.parentElement().ownerDocument !== doc))) {
    +		return null;
    +	}
    +	return rng;
    +}
    +function _singleKeyMap(map) {
    +	var newMap = {}, arr, v;
    +	_each(map, function(key, val) {
    +		arr = key.split(',');
    +		for (var i = 0, len = arr.length; i < len; i++) {
    +			v = arr[i];
    +			newMap[v] = val;
    +		}
    +	});
    +	return newMap;
    +}
    +function _hasAttrOrCss(knode, map) {
    +	return _hasAttrOrCssByKey(knode, map, '*') || _hasAttrOrCssByKey(knode, map);
    +}
    +function _hasAttrOrCssByKey(knode, map, mapKey) {
    +	mapKey = mapKey || knode.name;
    +	if (knode.type !== 1) {
    +		return false;
    +	}
    +	var newMap = _singleKeyMap(map);
    +	if (!newMap[mapKey]) {
    +		return false;
    +	}
    +	var arr = newMap[mapKey].split(',');
    +	for (var i = 0, len = arr.length; i < len; i++) {
    +		var key = arr[i];
    +		if (key === '*') {
    +			return true;
    +		}
    +		var match = /^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);
    +		var method = match[1] ? 'css' : 'attr';
    +		key = match[2];
    +		var val = match[3] || '';
    +		if (val === '' && knode[method](key) !== '') {
    +			return true;
    +		}
    +		if (val !== '' && knode[method](key) === val) {
    +			return true;
    +		}
    +	}
    +	return false;
    +}
    +function _removeAttrOrCss(knode, map) {
    +	if (knode.type != 1) {
    +		return;
    +	}
    +	_removeAttrOrCssByKey(knode, map, '*');
    +	_removeAttrOrCssByKey(knode, map);
    +}
    +function _removeAttrOrCssByKey(knode, map, mapKey) {
    +	mapKey = mapKey || knode.name;
    +	if (knode.type !== 1) {
    +		return;
    +	}
    +	var newMap = _singleKeyMap(map);
    +	if (!newMap[mapKey]) {
    +		return;
    +	}
    +	var arr = newMap[mapKey].split(','), allFlag = false;
    +	for (var i = 0, len = arr.length; i < len; i++) {
    +		var key = arr[i];
    +		if (key === '*') {
    +			allFlag = true;
    +			break;
    +		}
    +		var match = /^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);
    +		key = match[2];
    +		if (match[1]) {
    +			key = _toCamel(key);
    +			if (knode[0].style[key]) {
    +				knode[0].style[key] = '';
    +			}
    +		} else {
    +			knode.removeAttr(key);
    +		}
    +	}
    +	if (allFlag) {
    +		knode.remove(true);
    +	}
    +}
    +function _getInnerNode(knode) {
    +	var inner = knode;
    +	while (inner.first()) {
    +		inner = inner.first();
    +	}
    +	return inner;
    +}
    +function _isEmptyNode(knode) {
    +	return knode.type == 1 && knode.html().replace(/<[^>]+>/g, '') === '';
    +}
    +function _mergeWrapper(a, b) {
    +	a = a.clone(true);
    +	var lastA = _getInnerNode(a), childA = a, merged = false;
    +	while (b) {
    +		while (childA) {
    +			if (childA.name === b.name) {
    +				_mergeAttrs(childA, b.attr(), b.css());
    +				merged = true;
    +			}
    +			childA = childA.first();
    +		}
    +		if (!merged) {
    +			lastA.append(b.clone(false));
    +		}
    +		merged = false;
    +		b = b.first();
    +	}
    +	return a;
    +}
    +function _wrapNode(knode, wrapper) {
    +	wrapper = wrapper.clone(true);
    +	if (knode.type == 3) {
    +		_getInnerNode(wrapper).append(knode.clone(false));
    +		knode.replaceWith(wrapper);
    +		return wrapper;
    +	}
    +	var nodeWrapper = knode, child;
    +	while ((child = knode.first()) && child.children().length == 1) {
    +		knode = child;
    +	}
    +	child = knode.first();
    +	var frag = knode.doc.createDocumentFragment();
    +	while (child) {
    +		frag.appendChild(child[0]);
    +		child = child.next();
    +	}
    +	wrapper = _mergeWrapper(nodeWrapper, wrapper);
    +	if (frag.firstChild) {
    +		_getInnerNode(wrapper).append(frag);
    +	}
    +	nodeWrapper.replaceWith(wrapper);
    +	return wrapper;
    +}
    +function _mergeAttrs(knode, attrs, styles) {
    +	_each(attrs, function(key, val) {
    +		if (key !== 'style') {
    +			knode.attr(key, val);
    +		}
    +	});
    +	_each(styles, function(key, val) {
    +		knode.css(key, val);
    +	});
    +}
    +function _inPreElement(knode) {
    +	while (knode && knode.name != 'body') {
    +		if (_PRE_TAG_MAP[knode.name] || knode.name == 'div' && knode.hasClass('ke-script')) {
    +			return true;
    +		}
    +		knode = knode.parent();
    +	}
    +	return false;
    +}
    +function KCmd(range) {
    +	this.init(range);
    +}
    +_extend(KCmd, {
    +	init : function(range) {
    +		var self = this, doc = range.doc;
    +		self.doc = doc;
    +		self.win = _getWin(doc);
    +		self.sel = _getSel(doc);
    +		self.range = range;
    +	},
    +	selection : function(forceReset) {
    +		var self = this, doc = self.doc, rng = _getRng(doc);
    +		self.sel = _getSel(doc);
    +		if (rng) {
    +			self.range = _range(rng);
    +			if (K(self.range.startContainer).name == 'html') {
    +				self.range.selectNodeContents(doc.body).collapse(false);
    +			}
    +			return self;
    +		}
    +		if (forceReset) {
    +			self.range.selectNodeContents(doc.body).collapse(false);
    +		}
    +		return self;
    +	},
    +	select : function(hasDummy) {
    +		hasDummy = _undef(hasDummy, true);
    +		var self = this, sel = self.sel, range = self.range.cloneRange().shrink(),
    +			sc = range.startContainer, so = range.startOffset,
    +			ec = range.endContainer, eo = range.endOffset,
    +			doc = _getDoc(sc), win = self.win, rng, hasU200b = false;
    +		if (hasDummy && sc.nodeType == 1 && range.collapsed) {
    +			if (_IE) {
    +				var dummy = K('<span>&nbsp;</span>', doc);
    +				range.insertNode(dummy[0]);
    +				rng = doc.body.createTextRange();
    +				try {
    +					rng.moveToElementText(dummy[0]);
    +				} catch(ex) {}
    +				rng.collapse(false);
    +				rng.select();
    +				dummy.remove();
    +				win.focus();
    +				return self;
    +			}
    +			if (_WEBKIT) {
    +				var children = sc.childNodes;
    +				if (K(sc).isInline() || so > 0 && K(children[so - 1]).isInline() || children[so] && K(children[so]).isInline()) {
    +					range.insertNode(doc.createTextNode('\u200B'));
    +					hasU200b = true;
    +				}
    +			}
    +		}
    +		if (_IE) {
    +			try {
    +				rng = range.get(true);
    +				rng.select();
    +			} catch(e) {}
    +		} else {
    +			if (hasU200b) {
    +				range.collapse(false);
    +			}
    +			rng = range.get(true);
    +			sel.removeAllRanges();
    +			sel.addRange(rng);
    +		}
    +		win.focus();
    +		return self;
    +	},
    +	wrap : function(val) {
    +		var self = this, doc = self.doc, range = self.range, wrapper;
    +		wrapper = K(val, doc);
    +		if (range.collapsed) {
    +			range.shrink();
    +			range.insertNode(wrapper[0]).selectNodeContents(wrapper[0]);
    +			return self;
    +		}
    +		if (wrapper.isBlock()) {
    +			var copyWrapper = wrapper.clone(true), child = copyWrapper;
    +			while (child.first()) {
    +				child = child.first();
    +			}
    +			child.append(range.extractContents());
    +			range.insertNode(copyWrapper[0]).selectNode(copyWrapper[0]);
    +			return self;
    +		}
    +		range.enlarge();
    +		var bookmark = range.createBookmark(), ancestor = range.commonAncestor(), isStart = false;
    +		K(ancestor).scan(function(node) {
    +			if (!isStart && node == bookmark.start) {
    +				isStart = true;
    +				return;
    +			}
    +			if (isStart) {
    +				if (node == bookmark.end) {
    +					return false;
    +				}
    +				var knode = K(node);
    +				if (_inPreElement(knode)) {
    +					return;
    +				}
    +				if (knode.type == 3 && _trim(node.nodeValue).length > 0) {
    +					var parent;
    +					while ((parent = knode.parent()) && parent.isStyle() && parent.children().length == 1) {
    +						knode = parent;
    +					}
    +					_wrapNode(knode, wrapper);
    +				}
    +			}
    +		});
    +		range.moveToBookmark(bookmark);
    +		return self;
    +	},
    +	split : function(isStart, map) {
    +		var range = this.range, doc = range.doc;
    +		var tempRange = range.cloneRange().collapse(isStart);
    +		var node = tempRange.startContainer, pos = tempRange.startOffset,
    +			parent = node.nodeType == 3 ? node.parentNode : node,
    +			needSplit = false, knode;
    +		while (parent && parent.parentNode) {
    +			knode = K(parent);
    +			if (map) {
    +				if (!knode.isStyle()) {
    +					break;
    +				}
    +				if (!_hasAttrOrCss(knode, map)) {
    +					break;
    +				}
    +			} else {
    +				if (_NOSPLIT_TAG_MAP[knode.name]) {
    +					break;
    +				}
    +			}
    +			needSplit = true;
    +			parent = parent.parentNode;
    +		}
    +		if (needSplit) {
    +			var dummy = doc.createElement('span');
    +			range.cloneRange().collapse(!isStart).insertNode(dummy);
    +			if (isStart) {
    +				tempRange.setStartBefore(parent.firstChild).setEnd(node, pos);
    +			} else {
    +				tempRange.setStart(node, pos).setEndAfter(parent.lastChild);
    +			}
    +			var frag = tempRange.extractContents(),
    +				first = frag.firstChild, last = frag.lastChild;
    +			if (isStart) {
    +				tempRange.insertNode(frag);
    +				range.setStartAfter(last).setEndBefore(dummy);
    +			} else {
    +				parent.appendChild(frag);
    +				range.setStartBefore(dummy).setEndBefore(first);
    +			}
    +			var dummyParent = dummy.parentNode;
    +			if (dummyParent == range.endContainer) {
    +				var prev = K(dummy).prev(), next = K(dummy).next();
    +				if (prev && next && prev.type == 3 && next.type == 3) {
    +					range.setEnd(prev[0], prev[0].nodeValue.length);
    +				} else if (!isStart) {
    +					range.setEnd(range.endContainer, range.endOffset - 1);
    +				}
    +			}
    +			dummyParent.removeChild(dummy);
    +		}
    +		return this;
    +	},
    +	remove : function(map) {
    +		var self = this, doc = self.doc, range = self.range;
    +		range.enlarge();
    +		if (range.startOffset === 0) {
    +			var ksc = K(range.startContainer), parent;
    +			while ((parent = ksc.parent()) && parent.isStyle() && parent.children().length == 1) {
    +				ksc = parent;
    +			}
    +			range.setStart(ksc[0], 0);
    +			ksc = K(range.startContainer);
    +			if (ksc.isBlock()) {
    +				_removeAttrOrCss(ksc, map);
    +			}
    +			var kscp = ksc.parent();
    +			if (kscp && kscp.isBlock()) {
    +				_removeAttrOrCss(kscp, map);
    +			}
    +		}
    +		var sc, so;
    +		if (range.collapsed) {
    +			self.split(true, map);
    +			sc = range.startContainer;
    +			so = range.startOffset;
    +			if (so > 0) {
    +				var sb = K(sc.childNodes[so - 1]);
    +				if (sb && _isEmptyNode(sb)) {
    +					sb.remove();
    +					range.setStart(sc, so - 1);
    +				}
    +			}
    +			var sa = K(sc.childNodes[so]);
    +			if (sa && _isEmptyNode(sa)) {
    +				sa.remove();
    +			}
    +			if (_isEmptyNode(sc)) {
    +				range.startBefore(sc);
    +				sc.remove();
    +			}
    +			range.collapse(true);
    +			return self;
    +		}
    +		self.split(true, map);
    +		self.split(false, map);
    +		var startDummy = doc.createElement('span'), endDummy = doc.createElement('span');
    +		range.cloneRange().collapse(false).insertNode(endDummy);
    +		range.cloneRange().collapse(true).insertNode(startDummy);
    +		var nodeList = [], cmpStart = false;
    +		K(range.commonAncestor()).scan(function(node) {
    +			if (!cmpStart && node == startDummy) {
    +				cmpStart = true;
    +				return;
    +			}
    +			if (node == endDummy) {
    +				return false;
    +			}
    +			if (cmpStart) {
    +				nodeList.push(node);
    +			}
    +		});
    +		K(startDummy).remove();
    +		K(endDummy).remove();
    +		sc = range.startContainer;
    +		so = range.startOffset;
    +		var ec = range.endContainer, eo = range.endOffset;
    +		if (so > 0) {
    +			var startBefore = K(sc.childNodes[so - 1]);
    +			if (startBefore && _isEmptyNode(startBefore)) {
    +				startBefore.remove();
    +				range.setStart(sc, so - 1);
    +				if (sc == ec) {
    +					range.setEnd(ec, eo - 1);
    +				}
    +			}
    +			var startAfter = K(sc.childNodes[so]);
    +			if (startAfter && _isEmptyNode(startAfter)) {
    +				startAfter.remove();
    +				if (sc == ec) {
    +					range.setEnd(ec, eo - 1);
    +				}
    +			}
    +		}
    +		var endAfter = K(ec.childNodes[range.endOffset]);
    +		if (endAfter && _isEmptyNode(endAfter)) {
    +			endAfter.remove();
    +		}
    +		var bookmark = range.createBookmark(true);
    +		_each(nodeList, function(i, node) {
    +			_removeAttrOrCss(K(node), map);
    +		});
    +		range.moveToBookmark(bookmark);
    +		return self;
    +	},
    +	commonNode : function(map) {
    +		var range = this.range;
    +		var ec = range.endContainer, eo = range.endOffset,
    +			node = (ec.nodeType == 3 || eo === 0) ? ec : ec.childNodes[eo - 1];
    +		function find(node) {
    +			var child = node, parent = node;
    +			while (parent) {
    +				if (_hasAttrOrCss(K(parent), map)) {
    +					return K(parent);
    +				}
    +				parent = parent.parentNode;
    +			}
    +			while (child && (child = child.lastChild)) {
    +				if (_hasAttrOrCss(K(child), map)) {
    +					return K(child);
    +				}
    +			}
    +			return null;
    +		}
    +		var cNode = find(node);
    +		if (cNode) {
    +			return cNode;
    +		}
    +		if (node.nodeType == 1 || (ec.nodeType == 3 && eo === 0)) {
    +			var prev = K(node).prev();
    +			if (prev) {
    +				return find(prev);
    +			}
    +		}
    +		return null;
    +	},
    +	commonAncestor : function(tagName) {
    +		var range = this.range,
    +			sc = range.startContainer, so = range.startOffset,
    +			ec = range.endContainer, eo = range.endOffset,
    +			startNode = (sc.nodeType == 3 || so === 0) ? sc : sc.childNodes[so - 1],
    +			endNode = (ec.nodeType == 3 || eo === 0) ? ec : ec.childNodes[eo - 1];
    +		function find(node) {
    +			while (node) {
    +				if (node.nodeType == 1) {
    +					if (node.tagName.toLowerCase() === tagName) {
    +						return node;
    +					}
    +				}
    +				node = node.parentNode;
    +			}
    +			return null;
    +		}
    +		var start = find(startNode), end = find(endNode);
    +		if (start && end && start === end) {
    +			return K(start);
    +		}
    +		return null;
    +	},
    +	state : function(key) {
    +		var self = this, doc = self.doc, bool = false;
    +		try {
    +			bool = doc.queryCommandState(key);
    +		} catch (e) {}
    +		return bool;
    +	},
    +	val : function(key) {
    +		var self = this, doc = self.doc, range = self.range;
    +		function lc(val) {
    +			return val.toLowerCase();
    +		}
    +		key = lc(key);
    +		var val = '', knode;
    +		if (key === 'fontfamily' || key === 'fontname') {
    +			val = _nativeCommandValue(doc, 'fontname');
    +			val = val.replace(/['"]/g, '');
    +			return lc(val);
    +		}
    +		if (key === 'formatblock') {
    +			val = _nativeCommandValue(doc, key);
    +			if (val === '') {
    +				knode = self.commonNode({'h1,h2,h3,h4,h5,h6,p,div,pre,address' : '*'});
    +				if (knode) {
    +					val = knode.name;
    +				}
    +			}
    +			if (val === 'Normal') {
    +				val = 'p';
    +			}
    +			return lc(val);
    +		}
    +		if (key === 'fontsize') {
    +			knode = self.commonNode({'*' : '.font-size'});
    +			if (knode) {
    +				val = knode.css('font-size');
    +			}
    +			return lc(val);
    +		}
    +		if (key === 'forecolor') {
    +			knode = self.commonNode({'*' : '.color'});
    +			if (knode) {
    +				val = knode.css('color');
    +			}
    +			val = _toHex(val);
    +			if (val === '') {
    +				val = 'default';
    +			}
    +			return lc(val);
    +		}
    +		if (key === 'hilitecolor') {
    +			knode = self.commonNode({'*' : '.background-color'});
    +			if (knode) {
    +				val = knode.css('background-color');
    +			}
    +			val = _toHex(val);
    +			if (val === '') {
    +				val = 'default';
    +			}
    +			return lc(val);
    +		}
    +		return val;
    +	},
    +	toggle : function(wrapper, map) {
    +		var self = this;
    +		if (self.commonNode(map)) {
    +			self.remove(map);
    +		} else {
    +			self.wrap(wrapper);
    +		}
    +		return self.select();
    +	},
    +	bold : function() {
    +		return this.toggle('<strong></strong>', {
    +			span : '.font-weight=bold',
    +			strong : '*',
    +			b : '*'
    +		});
    +	},
    +	italic : function() {
    +		return this.toggle('<em></em>', {
    +			span : '.font-style=italic',
    +			em : '*',
    +			i : '*'
    +		});
    +	},
    +	underline : function() {
    +		return this.toggle('<u></u>', {
    +			span : '.text-decoration=underline',
    +			u : '*'
    +		});
    +	},
    +	strikethrough : function() {
    +		return this.toggle('<s></s>', {
    +			span : '.text-decoration=line-through',
    +			s : '*'
    +		});
    +	},
    +	forecolor : function(val) {
    +		return this.toggle('<span style="color:' + val + ';"></span>', {
    +			span : '.color=' + val,
    +			font : 'color'
    +		});
    +	},
    +	hilitecolor : function(val) {
    +		return this.toggle('<span style="background-color:' + val + ';"></span>', {
    +			span : '.background-color=' + val
    +		});
    +	},
    +	fontsize : function(val) {
    +		return this.toggle('<span style="font-size:' + val + ';"></span>', {
    +			span : '.font-size=' + val,
    +			font : 'size'
    +		});
    +	},
    +	fontname : function(val) {
    +		return this.fontfamily(val);
    +	},
    +	fontfamily : function(val) {
    +		return this.toggle('<span style="font-family:' + val + ';"></span>', {
    +			span : '.font-family=' + val,
    +			font : 'face'
    +		});
    +	},
    +	removeformat : function() {
    +		var map = {
    +			'*' : '.font-weight,.font-style,.text-decoration,.color,.background-color,.font-size,.font-family,.text-indent'
    +		},
    +		tags = _STYLE_TAG_MAP;
    +		_each(tags, function(key, val) {
    +			map[key] = '*';
    +		});
    +		this.remove(map);
    +		return this.select();
    +	},
    +	inserthtml : function(val, quickMode) {
    +		var self = this, range = self.range;
    +		if (val === '') {
    +			return self;
    +		}
    +		if (_inPreElement(K(range.startContainer))) {
    +			return self;
    +		}
    +		function pasteHtml(range, val) {
    +			val = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + val;
    +			var rng = range.get();
    +			if (rng.item) {
    +				rng.item(0).outerHTML = val;
    +			} else {
    +				rng.pasteHTML(val);
    +			}
    +			var temp = range.doc.getElementById('__kindeditor_temp_tag__');
    +			temp.parentNode.removeChild(temp);
    +			var newRange = _toRange(rng);
    +			range.setEnd(newRange.endContainer, newRange.endOffset);
    +			range.collapse(false);
    +			self.select(false);
    +		}
    +		function insertHtml(range, val) {
    +			var doc = range.doc,
    +				frag = doc.createDocumentFragment();
    +			K('@' + val, doc).each(function() {
    +				frag.appendChild(this);
    +			});
    +			range.deleteContents();
    +			range.insertNode(frag);
    +			range.collapse(false);
    +			self.select(false);
    +		}
    +		if (_IE && quickMode) {
    +			try {
    +				pasteHtml(range, val);
    +			} catch(e) {
    +				insertHtml(range, val);
    +			}
    +			return self;
    +		}
    +		insertHtml(range, val);
    +		return self;
    +	},
    +	hr : function() {
    +		return this.inserthtml('<hr />');
    +	},
    +	print : function() {
    +		this.win.print();
    +		return this;
    +	},
    +	insertimage : function(url, title, width, height, border, align) {
    +		title = _undef(title, '');
    +		border = _undef(border, 0);
    +		var html = '<img src="' + _escape(url) + '" data-ke-src="' + _escape(url) + '" ';
    +		if (width) {
    +			html += 'width="' + _escape(width) + '" ';
    +		}
    +		if (height) {
    +			html += 'height="' + _escape(height) + '" ';
    +		}
    +		if (title) {
    +			html += 'title="' + _escape(title) + '" ';
    +		}
    +		if (align) {
    +			html += 'align="' + _escape(align) + '" ';
    +		}
    +		html += 'alt="' + _escape(title) + '" ';
    +		html += '/>';
    +		return this.inserthtml(html);
    +	},
    +	createlink : function(url, type) {
    +		var self = this, doc = self.doc, range = self.range;
    +		self.select();
    +		var a = self.commonNode({ a : '*' });
    +		if (a && !range.isControl()) {
    +			range.selectNode(a.get());
    +			self.select();
    +		}
    +		var html = '<a href="' + _escape(url) + '" data-ke-src="' + _escape(url) + '" ';
    +		if (type) {
    +			html += ' target="' + _escape(type) + '"';
    +		}
    +		if (range.collapsed) {
    +			html += '>' + _escape(url) + '</a>';
    +			return self.inserthtml(html);
    +		}
    +		if (range.isControl()) {
    +			var node = K(range.startContainer.childNodes[range.startOffset]);
    +			html += '></a>';
    +			node.after(K(html, doc));
    +			node.next().append(node);
    +			range.selectNode(node[0]);
    +			return self.select();
    +		}
    +		_nativeCommand(doc, 'createlink', '__kindeditor_temp_url__');
    +		K('a[href="__kindeditor_temp_url__"]', doc).each(function() {
    +			K(this).attr('href', url).attr('data-ke-src', url);
    +			if (type) {
    +				K(this).attr('target', type);
    +			} else {
    +				K(this).removeAttr('target');
    +			}
    +		});
    +		return self;
    +	},
    +	unlink : function() {
    +		var self = this, doc = self.doc, range = self.range;
    +		self.select();
    +		if (range.collapsed) {
    +			var a = self.commonNode({ a : '*' });
    +			if (a) {
    +				range.selectNode(a.get());
    +				self.select();
    +			}
    +			_nativeCommand(doc, 'unlink', null);
    +			if (_WEBKIT && K(range.startContainer).name === 'img') {
    +				var parent = K(range.startContainer).parent();
    +				if (parent.name === 'a') {
    +					parent.remove(true);
    +				}
    +			}
    +		} else {
    +			_nativeCommand(doc, 'unlink', null);
    +		}
    +		return self;
    +	}
    +});
    +_each(('formatblock,selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,' +
    +	'insertunorderedlist,indent,outdent,subscript,superscript').split(','), function(i, name) {
    +	KCmd.prototype[name] = function(val) {
    +		var self = this;
    +		self.select();
    +		_nativeCommand(self.doc, name, val);
    +		if (!_IE || _inArray(name, 'formatblock,selectall,insertorderedlist,insertunorderedlist'.split(',')) >= 0) {
    +			self.selection();
    +		}
    +		return self;
    +	};
    +});
    +_each('cut,copy,paste'.split(','), function(i, name) {
    +	KCmd.prototype[name] = function() {
    +		var self = this;
    +		if (!self.doc.queryCommandSupported(name)) {
    +			throw 'not supported';
    +		}
    +		self.select();
    +		_nativeCommand(self.doc, name, null);
    +		return self;
    +	};
    +});
    +function _cmd(mixed) {
    +	if (mixed.nodeName) {
    +		var doc = _getDoc(mixed);
    +		mixed = _range(doc).selectNodeContents(doc.body).collapse(false);
    +	}
    +	return new KCmd(mixed);
    +}
    +K.cmd = _cmd;
    +function _drag(options) {
    +	var moveEl = options.moveEl,
    +		moveFn = options.moveFn,
    +		clickEl = options.clickEl || moveEl,
    +		beforeDrag = options.beforeDrag,
    +		iframeFix = options.iframeFix === undefined ? true : options.iframeFix;
    +	var docs = [document],
    +		poss = [{ x : 0, y : 0}],
    +		listeners = [];
    +	if (iframeFix) {
    +		K('iframe').each(function() {
    +			var doc;
    +			try {
    +				doc = _iframeDoc(this);
    +				K(doc);
    +			} catch(e) {
    +				doc = null;
    +			}
    +			if (doc) {
    +				docs.push(doc);
    +				poss.push(K(this).pos());
    +			}
    +		});
    +	}
    +	clickEl.mousedown(function(e) {
    +		var self = clickEl.get(),
    +			x = _removeUnit(moveEl.css('left')),
    +			y = _removeUnit(moveEl.css('top')),
    +			width = moveEl.width(),
    +			height = moveEl.height(),
    +			pageX = e.pageX,
    +			pageY = e.pageY,
    +			dragging = true;
    +		if (beforeDrag) {
    +			beforeDrag();
    +		}
    +		_each(docs, function(i, doc) {
    +			function moveListener(e) {
    +				if (dragging) {
    +					var diffX = _round(poss[i].x + e.pageX - pageX),
    +						diffY = _round(poss[i].y + e.pageY - pageY);
    +					moveFn.call(clickEl, x, y, width, height, diffX, diffY);
    +				}
    +				e.stop();
    +			}
    +			function selectListener(e) {
    +				e.stop();
    +			}
    +			function upListener(e) {
    +				dragging = false;
    +				if (self.releaseCapture) {
    +					self.releaseCapture();
    +				}
    +				_each(listeners, function() {
    +					K(this.doc).unbind('mousemove', this.move)
    +						.unbind('mouseup', this.up)
    +						.unbind('selectstart', this.select);
    +				});
    +				e.stop();
    +			}
    +			K(doc).mousemove(moveListener)
    +				.mouseup(upListener)
    +				.bind('selectstart', selectListener);
    +			listeners.push({
    +				doc : doc,
    +				move : moveListener,
    +				up : upListener,
    +				select : selectListener
    +			});
    +		});
    +		if (self.setCapture) {
    +			self.setCapture();
    +		}
    +	});
    +}
    +function KWidget(options) {
    +	this.init(options);
    +}
    +_extend(KWidget, {
    +	init : function(options) {
    +		var self = this;
    +		self.name = options.name || '';
    +		self.doc = options.doc || document;
    +		self.win = _getWin(self.doc);
    +		self.x = _addUnit(options.x);
    +		self.y = _addUnit(options.y);
    +		self.z = options.z;
    +		self.width = _addUnit(options.width);
    +		self.height = _addUnit(options.height);
    +		self.div = K('<div style="display:block;"></div>');
    +		self.options = options;
    +		self._alignEl = options.alignEl;
    +		if (self.width) {
    +			self.div.css('width', self.width);
    +		}
    +		if (self.height) {
    +			self.div.css('height', self.height);
    +		}
    +		if (self.z) {
    +			self.div.css({
    +				position : 'absolute',
    +				left : self.x,
    +				top : self.y,
    +				'z-index' : self.z
    +			});
    +		}
    +		if (self.z && (self.x === undefined || self.y === undefined)) {
    +			self.autoPos(self.width, self.height);
    +		}
    +		if (options.cls) {
    +			self.div.addClass(options.cls);
    +		}
    +		if (options.shadowMode) {
    +			self.div.addClass('ke-shadow');
    +		}
    +		if (options.css) {
    +			self.div.css(options.css);
    +		}
    +		if (options.src) {
    +			K(options.src).replaceWith(self.div);
    +		} else {
    +			K(self.doc.body).append(self.div);
    +		}
    +		if (options.html) {
    +			self.div.html(options.html);
    +		}
    +		if (options.autoScroll) {
    +			if (_IE && _V < 7 || _QUIRKS) {
    +				var scrollPos = _getScrollPos();
    +				K(self.win).bind('scroll', function(e) {
    +					var pos = _getScrollPos(),
    +						diffX = pos.x - scrollPos.x,
    +						diffY = pos.y - scrollPos.y;
    +					self.pos(_removeUnit(self.x) + diffX, _removeUnit(self.y) + diffY, false);
    +				});
    +			} else {
    +				self.div.css('position', 'fixed');
    +			}
    +		}
    +	},
    +	pos : function(x, y, updateProp) {
    +		var self = this;
    +		updateProp = _undef(updateProp, true);
    +		if (x !== null) {
    +			x = x < 0 ? 0 : _addUnit(x);
    +			self.div.css('left', x);
    +			if (updateProp) {
    +				self.x = x;
    +			}
    +		}
    +		if (y !== null) {
    +			y = y < 0 ? 0 : _addUnit(y);
    +			self.div.css('top', y);
    +			if (updateProp) {
    +				self.y = y;
    +			}
    +		}
    +		return self;
    +	},
    +	autoPos : function(width, height) {
    +		var self = this,
    +			w = _removeUnit(width) || 0,
    +			h = _removeUnit(height) || 0,
    +			scrollPos = _getScrollPos();
    +		if (self._alignEl) {
    +			var knode = K(self._alignEl),
    +				pos = knode.pos(),
    +				diffX = _round(knode[0].clientWidth / 2 - w / 2),
    +				diffY = _round(knode[0].clientHeight / 2 - h / 2);
    +			x = diffX < 0 ? pos.x : pos.x + diffX;
    +			y = diffY < 0 ? pos.y : pos.y + diffY;
    +		} else {
    +			var docEl = _docElement(self.doc);
    +			x = _round(scrollPos.x + (docEl.clientWidth - w) / 2);
    +			y = _round(scrollPos.y + (docEl.clientHeight - h) / 2);
    +		}
    +		if (!(_IE && _V < 7 || _QUIRKS)) {
    +			x -= scrollPos.x;
    +			y -= scrollPos.y;
    +		}
    +		return self.pos(x, y);
    +	},
    +	remove : function() {
    +		var self = this;
    +		if (_IE && _V < 7) {
    +			K(self.win).unbind('scroll');
    +		}
    +		self.div.remove();
    +		_each(self, function(i) {
    +			self[i] = null;
    +		});
    +		return this;
    +	},
    +	show : function() {
    +		this.div.show();
    +		return this;
    +	},
    +	hide : function() {
    +		this.div.hide();
    +		return this;
    +	},
    +	draggable : function(options) {
    +		var self = this;
    +		options = options || {};
    +		options.moveEl = self.div;
    +		options.moveFn = function(x, y, width, height, diffX, diffY) {
    +			if ((x = x + diffX) < 0) {
    +				x = 0;
    +			}
    +			if ((y = y + diffY) < 0) {
    +				y = 0;
    +			}
    +			self.pos(x, y);
    +		};
    +		_drag(options);
    +		return self;
    +	}
    +});
    +function _widget(options) {
    +	return new KWidget(options);
    +}
    +K.WidgetClass = KWidget;
    +K.widget = _widget;
    +function _iframeDoc(iframe) {
    +	iframe = _get(iframe);
    +	return iframe.contentDocument || iframe.contentWindow.document;
    +}
    +var html, _direction = '';
    +if ((html = document.getElementsByTagName('html'))) {
    +	_direction = html[0].dir;
    +}
    +function _getInitHtml(themesPath, bodyClass, cssPath, cssData) {
    +	var arr = [
    +		(_direction === '' ? '<html>' : '<html dir="' + _direction + '">'),
    +		'<head><meta charset="utf-8" /><title></title>',
    +		'<style>',
    +		'html {margin:0;padding:0;}',
    +		'body {margin:0;padding:5px;}',
    +		'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',
    +		'body, p, div {word-wrap: break-word;}',
    +		'p {margin:5px 0;}',
    +		'table {border-collapse:collapse;}',
    +		'img {border:0;}',
    +		'noscript {display:none;}',
    +		'table.ke-zeroborder td {border:1px dotted #AAA;}',
    +		'img.ke-flash {',
    +		'	border:1px solid #AAA;',
    +		'	background-image:url(' + themesPath + 'common/flash.gif);',
    +		'	background-position:center center;',
    +		'	background-repeat:no-repeat;',
    +		'	width:100px;',
    +		'	height:100px;',
    +		'}',
    +		'img.ke-rm {',
    +		'	border:1px solid #AAA;',
    +		'	background-image:url(' + themesPath + 'common/rm.gif);',
    +		'	background-position:center center;',
    +		'	background-repeat:no-repeat;',
    +		'	width:100px;',
    +		'	height:100px;',
    +		'}',
    +		'img.ke-media {',
    +		'	border:1px solid #AAA;',
    +		'	background-image:url(' + themesPath + 'common/media.gif);',
    +		'	background-position:center center;',
    +		'	background-repeat:no-repeat;',
    +		'	width:100px;',
    +		'	height:100px;',
    +		'}',
    +		'img.ke-anchor {',
    +		'	border:1px dashed #666;',
    +		'	width:16px;',
    +		'	height:16px;',
    +		'}',
    +		'.ke-script, .ke-noscript {',
    +		'	display:none;',
    +		'	font-size:0;',
    +		'	width:0;',
    +		'	height:0;',
    +		'}',
    +		'.ke-pagebreak {',
    +		'	border:1px dotted #AAA;',
    +		'	font-size:0;',
    +		'	height:2px;',
    +		'}',
    +		'</style>'
    +	];
    +	if (!_isArray(cssPath)) {
    +		cssPath = [cssPath];
    +	}
    +	_each(cssPath, function(i, path) {
    +		if (path) {
    +			arr.push('<link href="' + path + '" rel="stylesheet" />');
    +		}
    +	});
    +	if (cssData) {
    +		arr.push('<style>' + cssData + '</style>');
    +	}
    +	arr.push('</head><body ' + (bodyClass ? 'class="' + bodyClass + '"' : '') + '></body></html>');
    +	return arr.join('\n');
    +}
    +function _elementVal(knode, val) {
    +	return knode.hasVal() ? knode.val(val) : knode.html(val);
    +}
    +function KEdit(options) {
    +	this.init(options);
    +}
    +_extend(KEdit, KWidget, {
    +	init : function(options) {
    +		var self = this;
    +		KEdit.parent.init.call(self, options);
    +		self.srcElement = K(options.srcElement);
    +		self.div.addClass('ke-edit');
    +		self.designMode = _undef(options.designMode, true);
    +		self.beforeGetHtml = options.beforeGetHtml;
    +		self.beforeSetHtml = options.beforeSetHtml;
    +		self.afterSetHtml = options.afterSetHtml;
    +		var themesPath = _undef(options.themesPath, ''),
    +			bodyClass = options.bodyClass,
    +			cssPath = options.cssPath,
    +			cssData = options.cssData,
    +			isDocumentDomain = location.host.replace(/:\d+/, '') !== document.domain,
    +			srcScript = ('document.open();' +
    +				(isDocumentDomain ? 'document.domain="' + document.domain + '";' : '') +
    +				'document.close();'),
    +			iframeSrc = _IE ? ' src="javascript:void(function(){' + encodeURIComponent(srcScript) + '}())"' : '';
    +		self.iframe = K('<iframe class="ke-edit-iframe" hidefocus="true" frameborder="0"' + iframeSrc + '></iframe>').css('width', '100%');
    +		self.textarea = K('<textarea class="ke-edit-textarea" hidefocus="true"></textarea>').css('width', '100%');
    +		if (self.width) {
    +			self.setWidth(self.width);
    +		}
    +		if (self.height) {
    +			self.setHeight(self.height);
    +		}
    +		if (self.designMode) {
    +			self.textarea.hide();
    +		} else {
    +			self.iframe.hide();
    +		}
    +		function ready() {
    +			var doc = _iframeDoc(self.iframe);
    +			doc.open();
    +			if (isDocumentDomain) {
    +				doc.domain = document.domain;
    +			}
    +			doc.write(_getInitHtml(themesPath, bodyClass, cssPath, cssData));
    +			doc.close();
    +			self.win = self.iframe[0].contentWindow;
    +			self.doc = doc;
    +			var cmd = _cmd(doc);
    +			self.afterChange(function(e) {
    +				cmd.selection();
    +			});
    +			if (_WEBKIT) {
    +				K(doc).click(function(e) {
    +					if (K(e.target).name === 'img') {
    +						cmd.selection(true);
    +						cmd.range.selectNode(e.target);
    +						cmd.select();
    +					}
    +				});
    +			}
    +			if (_IE) {
    +				K(doc).keydown(function(e) {
    +					if (e.which == 8) {
    +						cmd.selection();
    +						var rng = cmd.range;
    +						if (rng.isControl()) {
    +							rng.collapse(true);
    +							K(rng.startContainer.childNodes[rng.startOffset]).remove();
    +							e.preventDefault();
    +						}
    +					}
    +				});
    +			}
    +			self.cmd = cmd;
    +			self.html(_elementVal(self.srcElement));
    +			if (_IE) {
    +				doc.body.disabled = true;
    +				doc.body.contentEditable = true;
    +				doc.body.removeAttribute('disabled');
    +			} else {
    +				doc.designMode = 'on';
    +			}
    +			if (options.afterCreate) {
    +				options.afterCreate.call(self);
    +			}
    +		}
    +		if (isDocumentDomain) {
    +			self.iframe.bind('load', function(e) {
    +				self.iframe.unbind('load');
    +				if (_IE) {
    +					ready();
    +				} else {
    +					setTimeout(ready, 0);
    +				}
    +			});
    +		}
    +		self.div.append(self.iframe);
    +		self.div.append(self.textarea);
    +		self.srcElement.hide();
    +		!isDocumentDomain && ready();
    +	},
    +	setWidth : function(val) {
    +		this.div.css('width', _addUnit(val));
    +		return this;
    +	},
    +	setHeight : function(val) {
    +		var self = this;
    +		val = _addUnit(val);
    +		self.div.css('height', val);
    +		self.iframe.css('height', val);
    +		if ((_IE && _V < 8) || _QUIRKS) {
    +			val = _addUnit(_removeUnit(val) - 2);
    +		}
    +		self.textarea.css('height', val);
    +		return self;
    +	},
    +	remove : function() {
    +		var self = this, doc = self.doc;
    +		K(doc.body).unbind();
    +		K(doc).unbind();
    +		K(self.win).unbind();
    +		_elementVal(self.srcElement, self.html());
    +		self.srcElement.show();
    +		doc.write('');
    +		self.iframe.unbind();
    +		self.textarea.unbind();
    +		KEdit.parent.remove.call(self);
    +	},
    +	html : function(val, isFull) {
    +		var self = this, doc = self.doc;
    +		if (self.designMode) {
    +			var body = doc.body;
    +			if (val === undefined) {
    +				if (isFull) {
    +					val = '<!doctype html><html>' + body.parentNode.innerHTML + '</html>';
    +				} else {
    +					val = body.innerHTML;
    +				}
    +				if (self.beforeGetHtml) {
    +					val = self.beforeGetHtml(val);
    +				}
    +				if (_GECKO && val == '<br />') {
    +					val = '';
    +				}
    +				return val;
    +			}
    +			if (self.beforeSetHtml) {
    +				val = self.beforeSetHtml(val);
    +			}
    +			K(body).html(val);
    +			if (self.afterSetHtml) {
    +				self.afterSetHtml();
    +			}
    +			return self;
    +		}
    +		if (val === undefined) {
    +			return self.textarea.val();
    +		}
    +		self.textarea.val(val);
    +		return self;
    +	},
    +	design : function(bool) {
    +		var self = this, val;
    +		if (bool === undefined ? !self.designMode : bool) {
    +			if (!self.designMode) {
    +				val = self.html();
    +				self.designMode = true;
    +				self.html(val);
    +				self.textarea.hide();
    +				self.iframe.show();
    +			}
    +		} else {
    +			if (self.designMode) {
    +				val = self.html();
    +				self.designMode = false;
    +				self.html(val);
    +				self.iframe.hide();
    +				self.textarea.show();
    +			}
    +		}
    +		return self.focus();
    +	},
    +	focus : function() {
    +		var self = this;
    +		self.designMode ? self.win.focus() : self.textarea[0].focus();
    +		return self;
    +	},
    +	blur : function() {
    +		var self = this;
    +		if (_IE) {
    +			var input = K('<input type="text" style="float:left;width:0;height:0;padding:0;margin:0;border:0;" value="" />', self.div);
    +			self.div.append(input);
    +			input[0].focus();
    +			input.remove();
    +		} else {
    +			self.designMode ? self.win.blur() : self.textarea[0].blur();
    +		}
    +		return self;
    +	},
    +	afterChange : function(fn) {
    +		var self = this, doc = self.doc, body = doc.body;
    +		K(doc).keyup(function(e) {
    +			if (!e.ctrlKey && !e.altKey && _CHANGE_KEY_MAP[e.which]) {
    +				fn(e);
    +			}
    +		});
    +		K(doc).mouseup(fn).contextmenu(fn);
    +		K(self.win).blur(fn);
    +		function timeoutHandler(e) {
    +			setTimeout(function() {
    +				fn(e);
    +			}, 1);
    +		}
    +		K(body).bind('paste', timeoutHandler);
    +		K(body).bind('cut', timeoutHandler);
    +		return self;
    +	}
    +});
    +function _edit(options) {
    +	return new KEdit(options);
    +}
    +K.edit = _edit;
    +K.iframeDoc = _iframeDoc;
    +function _selectToolbar(name, fn) {
    +	var self = this,
    +		knode = self.get(name);
    +	if (knode) {
    +		if (knode.hasClass('ke-disabled')) {
    +			return;
    +		}
    +		fn(knode);
    +	}
    +}
    +function KToolbar(options) {
    +	this.init(options);
    +}
    +_extend(KToolbar, KWidget, {
    +	init : function(options) {
    +		var self = this;
    +		KToolbar.parent.init.call(self, options);
    +		self.disableMode = _undef(options.disableMode, false);
    +		self.noDisableItemMap = _toMap(_undef(options.noDisableItems, []));
    +		self._itemMap = {};
    +		self.div.addClass('ke-toolbar').bind('contextmenu,mousedown,mousemove', function(e) {
    +			e.preventDefault();
    +		}).attr('unselectable', 'on');
    +		function find(target) {
    +			var knode = K(target);
    +			if (knode.hasClass('ke-outline')) {
    +				return knode;
    +			}
    +			if (knode.hasClass('ke-toolbar-icon')) {
    +				return knode.parent();
    +			}
    +		}
    +		function hover(e, method) {
    +			var knode = find(e.target);
    +			if (knode) {
    +				if (knode.hasClass('ke-disabled')) {
    +					return;
    +				}
    +				if (knode.hasClass('ke-selected')) {
    +					return;
    +				}
    +				knode[method]('ke-on');
    +			}
    +		}
    +		self.div.mouseover(function(e) {
    +			hover(e, 'addClass');
    +		})
    +		.mouseout(function(e) {
    +			hover(e, 'removeClass');
    +		})
    +		.click(function(e) {
    +			var knode = find(e.target);
    +			if (knode) {
    +				if (knode.hasClass('ke-disabled')) {
    +					return;
    +				}
    +				self.options.click.call(this, e, knode.attr('data-name'));
    +			}
    +		});
    +	},
    +	get : function(name) {
    +		if (this._itemMap[name]) {
    +			return this._itemMap[name];
    +		}
    +		return (this._itemMap[name] = K('span.ke-icon-' + name, this.div).parent());
    +	},
    +	select : function(name) {
    +		_selectToolbar.call(this, name, function(knode) {
    +			knode.addClass('ke-selected');
    +		});
    +		return self;
    +	},
    +	unselect : function(name) {
    +		_selectToolbar.call(this, name, function(knode) {
    +			knode.removeClass('ke-selected').removeClass('ke-on');
    +		});
    +		return self;
    +	},
    +	enable : function(name) {
    +		var self = this,
    +			knode = name.get ? name : self.get(name);
    +		if (knode) {
    +			knode.removeClass('ke-disabled');
    +			knode.opacity(1);
    +		}
    +		return self;
    +	},
    +	disable : function(name) {
    +		var self = this,
    +			knode = name.get ? name : self.get(name);
    +		if (knode) {
    +			knode.removeClass('ke-selected').addClass('ke-disabled');
    +			knode.opacity(0.5);
    +		}
    +		return self;
    +	},
    +	disableAll : function(bool, noDisableItems) {
    +		var self = this, map = self.noDisableItemMap, item;
    +		if (noDisableItems) {
    +			map = _toMap(noDisableItems);
    +		}
    +		if (bool === undefined ? !self.disableMode : bool) {
    +			K('span.ke-outline', self.div).each(function() {
    +				var knode = K(this),
    +					name = knode[0].getAttribute('data-name', 2);
    +				if (!map[name]) {
    +					self.disable(knode);
    +				}
    +			});
    +			self.disableMode = true;
    +		} else {
    +			K('span.ke-outline', self.div).each(function() {
    +				var knode = K(this),
    +					name = knode[0].getAttribute('data-name', 2);
    +				if (!map[name]) {
    +					self.enable(knode);
    +				}
    +			});
    +			self.disableMode = false;
    +		}
    +		return self;
    +	}
    +});
    +function _toolbar(options) {
    +	return new KToolbar(options);
    +}
    +K.toolbar = _toolbar;
    +function KMenu(options) {
    +	this.init(options);
    +}
    +_extend(KMenu, KWidget, {
    +	init : function(options) {
    +		var self = this;
    +		options.z = options.z || 811213;
    +		KMenu.parent.init.call(self, options);
    +		self.centerLineMode = _undef(options.centerLineMode, true);
    +		self.div.addClass('ke-menu').bind('click,mousedown', function(e){
    +			e.stopPropagation();
    +		}).attr('unselectable', 'on');
    +	},
    +	addItem : function(item) {
    +		var self = this;
    +		if (item.title === '-') {
    +			self.div.append(K('<div class="ke-menu-separator"></div>'));
    +			return;
    +		}
    +		var itemDiv = K('<div class="ke-menu-item" unselectable="on"></div>'),
    +			leftDiv = K('<div class="ke-inline-block ke-menu-item-left"></div>'),
    +			rightDiv = K('<div class="ke-inline-block ke-menu-item-right"></div>'),
    +			height = _addUnit(item.height),
    +			iconClass = _undef(item.iconClass, '');
    +		self.div.append(itemDiv);
    +		if (height) {
    +			itemDiv.css('height', height);
    +			rightDiv.css('line-height', height);
    +		}
    +		var centerDiv;
    +		if (self.centerLineMode) {
    +			centerDiv = K('<div class="ke-inline-block ke-menu-item-center"></div>');
    +			if (height) {
    +				centerDiv.css('height', height);
    +			}
    +		}
    +		itemDiv.mouseover(function(e) {
    +			K(this).addClass('ke-menu-item-on');
    +			if (centerDiv) {
    +				centerDiv.addClass('ke-menu-item-center-on');
    +			}
    +		})
    +		.mouseout(function(e) {
    +			K(this).removeClass('ke-menu-item-on');
    +			if (centerDiv) {
    +				centerDiv.removeClass('ke-menu-item-center-on');
    +			}
    +		})
    +		.click(function(e) {
    +			item.click.call(K(this));
    +			e.stopPropagation();
    +		})
    +		.append(leftDiv);
    +		if (centerDiv) {
    +			itemDiv.append(centerDiv);
    +		}
    +		itemDiv.append(rightDiv);
    +		if (item.checked) {
    +			iconClass = 'ke-icon-checked';
    +		}
    +		if (iconClass !== '') {
    +			leftDiv.html('<span class="ke-inline-block ke-toolbar-icon ke-toolbar-icon-url ' + iconClass + '"></span>');
    +		}
    +		rightDiv.html(item.title);
    +		return self;
    +	},
    +	remove : function() {
    +		var self = this;
    +		if (self.options.beforeRemove) {
    +			self.options.beforeRemove.call(self);
    +		}
    +		K('.ke-menu-item', self.div[0]).unbind();
    +		KMenu.parent.remove.call(self);
    +		return self;
    +	}
    +});
    +function _menu(options) {
    +	return new KMenu(options);
    +}
    +K.menu = _menu;
    +function KColorPicker(options) {
    +	this.init(options);
    +}
    +_extend(KColorPicker, KWidget, {
    +	init : function(options) {
    +		var self = this;
    +		options.z = options.z || 811213;
    +		KColorPicker.parent.init.call(self, options);
    +		var colors = options.colors || [
    +			['#E53333', '#E56600', '#FF9900', '#64451D', '#DFC5A4', '#FFE500'],
    +			['#009900', '#006600', '#99BB00', '#B8D100', '#60D978', '#00D5FF'],
    +			['#337FE5', '#003399', '#4C33E5', '#9933E5', '#CC33E5', '#EE33EE'],
    +			['#FFFFFF', '#CCCCCC', '#999999', '#666666', '#333333', '#000000']
    +		];
    +		self.selectedColor = (options.selectedColor || '').toLowerCase();
    +		self._cells = [];
    +		self.div.addClass('ke-colorpicker').bind('click,mousedown', function(e){
    +			e.stopPropagation();
    +		}).attr('unselectable', 'on');
    +		var table = self.doc.createElement('table');
    +		self.div.append(table);
    +		table.className = 'ke-colorpicker-table';
    +		table.cellPadding = 0;
    +		table.cellSpacing = 0;
    +		table.border = 0;
    +		var row = table.insertRow(0), cell = row.insertCell(0);
    +		cell.colSpan = colors[0].length;
    +		self._addAttr(cell, '', 'ke-colorpicker-cell-top');
    +		for (var i = 0; i < colors.length; i++) {
    +			row = table.insertRow(i + 1);
    +			for (var j = 0; j < colors[i].length; j++) {
    +				cell = row.insertCell(j);
    +				self._addAttr(cell, colors[i][j], 'ke-colorpicker-cell');
    +			}
    +		}
    +	},
    +	_addAttr : function(cell, color, cls) {
    +		var self = this;
    +		cell = K(cell).addClass(cls);
    +		if (self.selectedColor === color.toLowerCase()) {
    +			cell.addClass('ke-colorpicker-cell-selected');
    +		}
    +		cell.attr('title', color || self.options.noColor);
    +		cell.mouseover(function(e) {
    +			K(this).addClass('ke-colorpicker-cell-on');
    +		});
    +		cell.mouseout(function(e) {
    +			K(this).removeClass('ke-colorpicker-cell-on');
    +		});
    +		cell.click(function(e) {
    +			e.stop();
    +			self.options.click.call(K(this), color);
    +		});
    +		if (color) {
    +			cell.append(K('<div class="ke-colorpicker-cell-color" unselectable="on"></div>').css('background-color', color));
    +		} else {
    +			cell.html(self.options.noColor);
    +		}
    +		K(cell).attr('unselectable', 'on');
    +		self._cells.push(cell);
    +	},
    +	remove : function() {
    +		var self = this;
    +		_each(self._cells, function() {
    +			this.unbind();
    +		});
    +		KColorPicker.parent.remove.call(self);
    +		return self;
    +	}
    +});
    +function _colorpicker(options) {
    +	return new KColorPicker(options);
    +}
    +K.colorpicker = _colorpicker;
    +function KUploadButton(options) {
    +	this.init(options);
    +}
    +_extend(KUploadButton, {
    +	init : function(options) {
    +		var self = this,
    +			button = K(options.button),
    +			fieldName = options.fieldName || 'file',
    +			url = options.url || '',
    +			title = button.val(),
    +			extraParams = options.extraParams || {},
    +			cls = button[0].className || '',
    +			target = options.target || 'kindeditor_upload_iframe_' + new Date().getTime();
    +		options.afterError = options.afterError || function(str) {
    +			alert(str);
    +		};
    +		var hiddenElements = [];
    +		for(var k in extraParams){
    +			hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
    +		}
    +		var html = [
    +			'<div class="ke-inline-block ' + cls + '">',
    +			(options.target ? '' : '<iframe name="' + target + '" style="display:none;"></iframe>'),
    +			(options.form ? '<div class="ke-upload-area">' : '<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + url + '">'),
    +			'<span class="ke-button-common">',
    +			hiddenElements.join(''),
    +			'<input type="button" class="ke-button-common ke-button" value="' + title + '" />',
    +			'</span>',
    +			'<input type="file" class="ke-upload-file" name="' + fieldName + '" tabindex="-1" />',
    +			(options.form ? '</div>' : '</form>'),
    +			'</div>'].join('');
    +		var div = K(html, button.doc);
    +		button.hide();
    +		button.before(div);
    +		self.div = div;
    +		self.button = button;
    +		self.iframe = options.target ? K('iframe[name="' + target + '"]') : K('iframe', div);
    +		self.form = options.form ? K(options.form) : K('form', div);
    +		var width = options.width || K('.ke-button-common', div).width();
    +		self.fileBox = K('.ke-upload-file', div).width(width);
    +		self.options = options;
    +	},
    +	submit : function() {
    +		var self = this,
    +			iframe = self.iframe;
    +		iframe.bind('load', function() {
    +			iframe.unbind();
    +			var tempForm = document.createElement('form');
    +			self.fileBox.before(tempForm);
    +			K(tempForm).append(self.fileBox);
    +			tempForm.reset();
    +			K(tempForm).remove(true);
    +			var doc = K.iframeDoc(iframe),
    +				pre = doc.getElementsByTagName('pre')[0],
    +				str = '', data;
    +			if (pre) {
    +				str = pre.innerHTML;
    +			} else {
    +				str = doc.body.innerHTML;
    +			}
    +			iframe[0].src = 'javascript:false';
    +			try {
    +				data = K.json(str);
    +			} catch (e) {
    +				self.options.afterError.call(self, '<!doctype html><html>' + doc.body.parentNode.innerHTML + '</html>');
    +			}
    +			if (data) {
    +				self.options.afterUpload.call(self, data);
    +			}
    +		});
    +		self.form[0].submit();
    +		return self;
    +	},
    +	remove : function() {
    +		var self = this;
    +		if (self.fileBox) {
    +			self.fileBox.unbind();
    +		}
    +		self.iframe.remove();
    +		self.div.remove();
    +		self.button.show();
    +		return self;
    +	}
    +});
    +function _uploadbutton(options) {
    +	return new KUploadButton(options);
    +}
    +K.uploadbutton = _uploadbutton;
    +function _createButton(arg) {
    +	arg = arg || {};
    +	var name = arg.name || '',
    +		span = K('<span class="ke-button-common ke-button-outer" title="' + name + '"></span>'),
    +		btn = K('<input class="ke-button-common ke-button" type="button" value="' + name + '" />');
    +	if (arg.click) {
    +		btn.click(arg.click);
    +	}
    +	span.append(btn);
    +	return span;
    +}
    +function KDialog(options) {
    +	this.init(options);
    +}
    +_extend(KDialog, KWidget, {
    +	init : function(options) {
    +		var self = this;
    +		var shadowMode = _undef(options.shadowMode, true);
    +		options.z = options.z || 811213;
    +		options.shadowMode = false;
    +		KDialog.parent.init.call(self, options);
    +		var title = options.title,
    +			body = K(options.body, self.doc),
    +			previewBtn = options.previewBtn,
    +			yesBtn = options.yesBtn,
    +			noBtn = options.noBtn,
    +			closeBtn = options.closeBtn,
    +			showMask = _undef(options.showMask, true);
    +		self.div.addClass('ke-dialog').bind('click,mousedown', function(e){
    +			e.stopPropagation();
    +		});
    +		var contentDiv = K('<div class="ke-dialog-content"></div>').appendTo(self.div);
    +		if (_IE && _V < 7) {
    +			self.iframeMask = K('<iframe src="about:blank" class="ke-dialog-shadow"></iframe>').appendTo(self.div);
    +		} else if (shadowMode) {
    +			K('<div class="ke-dialog-shadow"></div>').appendTo(self.div);
    +		}
    +		var headerDiv = K('<div class="ke-dialog-header"></div>');
    +		contentDiv.append(headerDiv);
    +		headerDiv.html(title);
    +		self.closeIcon = K('<span class="ke-dialog-icon-close" title="' + closeBtn.name + '"></span>').click(closeBtn.click);
    +		headerDiv.append(self.closeIcon);
    +		self.draggable({
    +			clickEl : headerDiv,
    +			beforeDrag : options.beforeDrag
    +		});
    +		var bodyDiv = K('<div class="ke-dialog-body"></div>');
    +		contentDiv.append(bodyDiv);
    +		bodyDiv.append(body);
    +		var footerDiv = K('<div class="ke-dialog-footer"></div>');
    +		if (previewBtn || yesBtn || noBtn) {
    +			contentDiv.append(footerDiv);
    +		}
    +		_each([
    +			{ btn : previewBtn, name : 'preview' },
    +			{ btn : yesBtn, name : 'yes' },
    +			{ btn : noBtn, name : 'no' }
    +		], function() {
    +			if (this.btn) {
    +				var button = _createButton(this.btn);
    +				button.addClass('ke-dialog-' + this.name);
    +				footerDiv.append(button);
    +			}
    +		});
    +		if (self.height) {
    +			bodyDiv.height(_removeUnit(self.height) - headerDiv.height() - footerDiv.height());
    +		}
    +		self.div.width(self.div.width());
    +		self.div.height(self.div.height());
    +		self.mask = null;
    +		if (showMask) {
    +			var docEl = _docElement(self.doc),
    +				docWidth = Math.max(docEl.scrollWidth, docEl.clientWidth),
    +				docHeight = Math.max(docEl.scrollHeight, docEl.clientHeight);
    +			self.mask = _widget({
    +				x : 0,
    +				y : 0,
    +				z : self.z - 1,
    +				cls : 'ke-dialog-mask',
    +				width : docWidth,
    +				height : docHeight
    +			});
    +		}
    +		self.autoPos(self.div.width(), self.div.height());
    +		self.footerDiv = footerDiv;
    +		self.bodyDiv = bodyDiv;
    +		self.headerDiv = headerDiv;
    +		self.isLoading = false;
    +	},
    +	setMaskIndex : function(z) {
    +		var self = this;
    +		self.mask.div.css('z-index', z);
    +	},
    +	showLoading : function(msg) {
    +		msg = _undef(msg, '');
    +		var self = this, body = self.bodyDiv;
    +		self.loading = K('<div class="ke-dialog-loading"><div class="ke-inline-block ke-dialog-loading-content" style="margin-top:' + Math.round(body.height() / 3) + 'px;">' + msg + '</div></div>')
    +			.width(body.width()).height(body.height())
    +			.css('top', self.headerDiv.height() + 'px');
    +		body.css('visibility', 'hidden').after(self.loading);
    +		self.isLoading = true;
    +		return self;
    +	},
    +	hideLoading : function() {
    +		this.loading && this.loading.remove();
    +		this.bodyDiv.css('visibility', 'visible');
    +		this.isLoading = false;
    +		return this;
    +	},
    +	remove : function() {
    +		var self = this;
    +		if (self.options.beforeRemove) {
    +			self.options.beforeRemove.call(self);
    +		}
    +		self.mask && self.mask.remove();
    +		self.iframeMask && self.iframeMask.remove();
    +		self.closeIcon.unbind();
    +		K('input', self.div).unbind();
    +		K('button', self.div).unbind();
    +		self.footerDiv.unbind();
    +		self.bodyDiv.unbind();
    +		self.headerDiv.unbind();
    +		K('iframe', self.div).each(function() {
    +			K(this).remove();
    +		});
    +		KDialog.parent.remove.call(self);
    +		return self;
    +	}
    +});
    +function _dialog(options) {
    +	return new KDialog(options);
    +}
    +K.dialog = _dialog;
    +function _tabs(options) {
    +	var self = _widget(options),
    +		remove = self.remove,
    +		afterSelect = options.afterSelect,
    +		div = self.div,
    +		liList = [];
    +	div.addClass('ke-tabs')
    +		.bind('contextmenu,mousedown,mousemove', function(e) {
    +			e.preventDefault();
    +		});
    +	var ul = K('<ul class="ke-tabs-ul ke-clearfix"></ul>');
    +	div.append(ul);
    +	self.add = function(tab) {
    +		var li = K('<li class="ke-tabs-li">' + tab.title + '</li>');
    +		li.data('tab', tab);
    +		liList.push(li);
    +		ul.append(li);
    +	};
    +	self.selectedIndex = 0;
    +	self.select = function(index) {
    +		self.selectedIndex = index;
    +		_each(liList, function(i, li) {
    +			li.unbind();
    +			if (i === index) {
    +				li.addClass('ke-tabs-li-selected');
    +				K(li.data('tab').panel).show('');
    +			} else {
    +				li.removeClass('ke-tabs-li-selected').removeClass('ke-tabs-li-on')
    +				.mouseover(function() {
    +					K(this).addClass('ke-tabs-li-on');
    +				})
    +				.mouseout(function() {
    +					K(this).removeClass('ke-tabs-li-on');
    +				})
    +				.click(function() {
    +					self.select(i);
    +				});
    +				K(li.data('tab').panel).hide();
    +			}
    +		});
    +		if (afterSelect) {
    +			afterSelect.call(self, index);
    +		}
    +	};
    +	self.remove = function() {
    +		_each(liList, function() {
    +			this.remove();
    +		});
    +		ul.remove();
    +		remove.call(self);
    +	};
    +	return self;
    +}
    +K.tabs = _tabs;
    +function _loadScript(url, fn) {
    +	var head = document.getElementsByTagName('head')[0] || (_QUIRKS ? document.body : document.documentElement),
    +		script = document.createElement('script');
    +	head.appendChild(script);
    +	script.src = url;
    +	script.charset = 'utf-8';
    +	script.onload = script.onreadystatechange = function() {
    +		if (!this.readyState || this.readyState === 'loaded') {
    +			if (fn) {
    +				fn();
    +			}
    +			script.onload = script.onreadystatechange = null;
    +			head.removeChild(script);
    +		}
    +	};
    +}
    +function _chopQuery(url) {
    +	var index = url.indexOf('?');
    +	return index > 0 ? url.substr(0, index) : url;
    +}
    +function _loadStyle(url) {
    +	var head = document.getElementsByTagName('head')[0] || (_QUIRKS ? document.body : document.documentElement),
    +		link = document.createElement('link'),
    +		absoluteUrl = _chopQuery(_formatUrl(url, 'absolute'));
    +	var links = K('link[rel="stylesheet"]', head);
    +	for (var i = 0, len = links.length; i < len; i++) {
    +		if (_chopQuery(_formatUrl(links[i].href, 'absolute')) === absoluteUrl) {
    +			return;
    +		}
    +	}
    +	head.appendChild(link);
    +	link.href = url;
    +	link.rel = 'stylesheet';
    +}
    +function _ajax(url, fn, method, param, dataType) {
    +	method = method || 'GET';
    +	dataType = dataType || 'json';
    +	var xhr = window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
    +	xhr.open(method, url, true);
    +	xhr.onreadystatechange = function () {
    +		if (xhr.readyState == 4 && xhr.status == 200) {
    +			if (fn) {
    +				var data = _trim(xhr.responseText);
    +				if (dataType == 'json') {
    +					data = _json(data);
    +				}
    +				fn(data);
    +			}
    +		}
    +	};
    +	if (method == 'POST') {
    +		var params = [];
    +		_each(param, function(key, val) {
    +			params.push(encodeURIComponent(key) + '=' + encodeURIComponent(val));
    +		});
    +		try {
    +			xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    +		} catch (e) {}
    +		xhr.send(params.join('&'));
    +	} else {
    +		xhr.send(null);
    +	}
    +}
    +K.loadScript = _loadScript;
    +K.loadStyle = _loadStyle;
    +K.ajax = _ajax;
    +var _plugins = {};
    +function _plugin(name, fn) {
    +	if (name === undefined) {
    +		return _plugins;
    +	}
    +	if (!fn) {
    +		return _plugins[name];
    +	}
    +	_plugins[name] = fn;
    +}
    +var _language = {};
    +function _parseLangKey(key) {
    +	var match, ns = 'core';
    +	if ((match = /^(\w+)\.(\w+)$/.exec(key))) {
    +		ns = match[1];
    +		key = match[2];
    +	}
    +	return { ns : ns, key : key };
    +}
    +function _lang(mixed, langType) {
    +	langType = langType === undefined ? K.options.langType : langType;
    +	if (typeof mixed === 'string') {
    +		if (!_language[langType]) {
    +			return 'no language';
    +		}
    +		var pos = mixed.length - 1;
    +		if (mixed.substr(pos) === '.') {
    +			return _language[langType][mixed.substr(0, pos)];
    +		}
    +		var obj = _parseLangKey(mixed);
    +		return _language[langType][obj.ns][obj.key];
    +	}
    +	_each(mixed, function(key, val) {
    +		var obj = _parseLangKey(key);
    +		if (!_language[langType]) {
    +			_language[langType] = {};
    +		}
    +		if (!_language[langType][obj.ns]) {
    +			_language[langType][obj.ns] = {};
    +		}
    +		_language[langType][obj.ns][obj.key] = val;
    +	});
    +}
    +function _getImageFromRange(range, fn) {
    +	if (range.collapsed) {
    +		return;
    +	}
    +	range = range.cloneRange().up();
    +	var sc = range.startContainer, so = range.startOffset;
    +	if (!_WEBKIT && !range.isControl()) {
    +		return;
    +	}
    +	var img = K(sc.childNodes[so]);
    +	if (!img || img.name != 'img') {
    +		return;
    +	}
    +	if (fn(img)) {
    +		return img;
    +	}
    +}
    +function _bindContextmenuEvent() {
    +	var self = this, doc = self.edit.doc;
    +	K(doc).contextmenu(function(e) {
    +		if (self.menu) {
    +			self.hideMenu();
    +		}
    +		if (!self.useContextmenu) {
    +			e.preventDefault();
    +			return;
    +		}
    +		if (self._contextmenus.length === 0) {
    +			return;
    +		}
    +		var maxWidth = 0, items = [];
    +		_each(self._contextmenus, function() {
    +			if (this.title == '-') {
    +				items.push(this);
    +				return;
    +			}
    +			if (this.cond && this.cond()) {
    +				items.push(this);
    +				if (this.width && this.width > maxWidth) {
    +					maxWidth = this.width;
    +				}
    +			}
    +		});
    +		while (items.length > 0 && items[0].title == '-') {
    +			items.shift();
    +		}
    +		while (items.length > 0 && items[items.length - 1].title == '-') {
    +			items.pop();
    +		}
    +		var prevItem = null;
    +		_each(items, function(i) {
    +			if (this.title == '-' && prevItem.title == '-') {
    +				delete items[i];
    +			}
    +			prevItem = this;
    +		});
    +		if (items.length > 0) {
    +			e.preventDefault();
    +			var pos = K(self.edit.iframe).pos(),
    +				menu = _menu({
    +					x : pos.x + e.clientX,
    +					y : pos.y + e.clientY,
    +					width : maxWidth,
    +					css : { visibility: 'hidden' },
    +					shadowMode : self.shadowMode
    +				});
    +			_each(items, function() {
    +				if (this.title) {
    +					menu.addItem(this);
    +				}
    +			});
    +			var docEl = _docElement(menu.doc),
    +				menuHeight = menu.div.height();
    +			if (e.clientY + menuHeight >= docEl.clientHeight - 100) {
    +				menu.pos(menu.x, _removeUnit(menu.y) - menuHeight);
    +			}
    +			menu.div.css('visibility', 'visible');
    +			self.menu = menu;
    +		}
    +	});
    +}
    +function _bindNewlineEvent() {
    +	var self = this, doc = self.edit.doc, newlineTag = self.newlineTag;
    +	if (_IE && newlineTag !== 'br') {
    +		return;
    +	}
    +	if (_GECKO && _V < 3 && newlineTag !== 'p') {
    +		return;
    +	}
    +	if (_OPERA && _V < 9) {
    +		return;
    +	}
    +	var brSkipTagMap = _toMap('h1,h2,h3,h4,h5,h6,pre,li'),
    +		pSkipTagMap = _toMap('p,h1,h2,h3,h4,h5,h6,pre,li,blockquote');
    +	function getAncestorTagName(range) {
    +		var ancestor = K(range.commonAncestor());
    +		while (ancestor) {
    +			if (ancestor.type == 1 && !ancestor.isStyle()) {
    +				break;
    +			}
    +			ancestor = ancestor.parent();
    +		}
    +		return ancestor.name;
    +	}
    +	K(doc).keydown(function(e) {
    +		if (e.which != 13 || e.shiftKey || e.ctrlKey || e.altKey) {
    +			return;
    +		}
    +		self.cmd.selection();
    +		var tagName = getAncestorTagName(self.cmd.range);
    +		if (tagName == 'marquee' || tagName == 'select') {
    +			return;
    +		}
    +		if (newlineTag === 'br' && !brSkipTagMap[tagName]) {
    +			e.preventDefault();
    +			self.insertHtml('<br />' + (_IE && _V < 9 ? '' : '\u200B'));
    +			return;
    +		}
    +		if (!pSkipTagMap[tagName]) {
    +			_nativeCommand(doc, 'formatblock', '<p>');
    +		}
    +	});
    +	K(doc).keyup(function(e) {
    +		if (e.which != 13 || e.shiftKey || e.ctrlKey || e.altKey) {
    +			return;
    +		}
    +		if (newlineTag == 'br') {
    +			return;
    +		}
    +		self.cmd.selection();
    +		var tagName = getAncestorTagName(self.cmd.range);
    +		if (tagName == 'marquee' || tagName == 'select') {
    +			return;
    +		}
    +		if (!pSkipTagMap[tagName]) {
    +			_nativeCommand(doc, 'formatblock', '<p>');
    +		}
    +		var div = self.cmd.commonAncestor('div');
    +		if (div) {
    +			var p = K('<p></p>'),
    +				child = div[0].firstChild;
    +			while (child) {
    +				var next = child.nextSibling;
    +				p.append(child);
    +				child = next;
    +			}
    +			div.before(p);
    +			div.remove();
    +			self.cmd.range.selectNodeContents(p[0]);
    +			self.cmd.select();
    +		}
    +	});
    +}
    +function _bindTabEvent() {
    +	var self = this, doc = self.edit.doc;
    +	K(doc).keydown(function(e) {
    +		if (e.which == 9) {
    +			e.preventDefault();
    +			if (self.afterTab) {
    +				self.afterTab.call(self, e);
    +				return;
    +			}
    +			var cmd = self.cmd, range = cmd.range;
    +			range.shrink();
    +			if (range.collapsed && range.startContainer.nodeType == 1) {
    +				range.insertNode(K('@&nbsp;', doc)[0]);
    +				cmd.select();
    +			}
    +			self.insertHtml('&nbsp;&nbsp;&nbsp;&nbsp;');
    +		}
    +	});
    +}
    +function _bindFocusEvent() {
    +	var self = this;
    +	K(self.edit.textarea[0], self.edit.win).focus(function(e) {
    +		if (self.afterFocus) {
    +			self.afterFocus.call(self, e);
    +		}
    +	}).blur(function(e) {
    +		if (self.afterBlur) {
    +			self.afterBlur.call(self, e);
    +		}
    +	});
    +}
    +function _removeBookmarkTag(html) {
    +	return _trim(html.replace(/<span [^>]*id="?__kindeditor_bookmark_\w+_\d+__"?[^>]*><\/span>/ig, ''));
    +}
    +function _removeTempTag(html) {
    +	return html.replace(/<div[^>]+class="?__kindeditor_paste__"?[^>]*>[\s\S]*?<\/div>/ig, '');
    +}
    +function _addBookmarkToStack(stack, bookmark) {
    +	if (stack.length === 0) {
    +		stack.push(bookmark);
    +		return;
    +	}
    +	var prev = stack[stack.length - 1];
    +	if (_removeBookmarkTag(bookmark.html) !== _removeBookmarkTag(prev.html)) {
    +		stack.push(bookmark);
    +	}
    +}
    +function _undoToRedo(fromStack, toStack) {
    +	var self = this, edit = self.edit,
    +		body = edit.doc.body,
    +		range, bookmark;
    +	if (fromStack.length === 0) {
    +		return self;
    +	}
    +	if (edit.designMode) {
    +		range = self.cmd.range;
    +		bookmark = range.createBookmark(true);
    +		bookmark.html = body.innerHTML;
    +	} else {
    +		bookmark = {
    +			html : body.innerHTML
    +		};
    +	}
    +	_addBookmarkToStack(toStack, bookmark);
    +	var prev = fromStack.pop();
    +	if (_removeBookmarkTag(bookmark.html) === _removeBookmarkTag(prev.html) && fromStack.length > 0) {
    +		prev = fromStack.pop();
    +	}
    +	if (edit.designMode) {
    +		edit.html(prev.html);
    +		if (prev.start) {
    +			range.moveToBookmark(prev);
    +			self.select();
    +		}
    +	} else {
    +		K(body).html(_removeBookmarkTag(prev.html));
    +	}
    +	return self;
    +}
    +function KEditor(options) {
    +	var self = this;
    +	self.options = {};
    +	function setOption(key, val) {
    +		if (KEditor.prototype[key] === undefined) {
    +			self[key] = val;
    +		}
    +		self.options[key] = val;
    +	}
    +	_each(options, function(key, val) {
    +		setOption(key, options[key]);
    +	});
    +	_each(K.options, function(key, val) {
    +		if (self[key] === undefined) {
    +			setOption(key, val);
    +		}
    +	});
    +	var se = K(self.srcElement || '<textarea/>');
    +	if (!self.width) {
    +		self.width = se[0].style.width || se.width();
    +	}
    +	if (!self.height) {
    +		self.height = se[0].style.height || se.height();
    +	}
    +	setOption('width', _undef(self.width, self.minWidth));
    +	setOption('height', _undef(self.height, self.minHeight));
    +	setOption('width', _addUnit(self.width));
    +	setOption('height', _addUnit(self.height));
    +	if (_MOBILE && (!_IOS || _V < 534)) {
    +		self.designMode = false;
    +	}
    +	self.srcElement = se;
    +	self.initContent = '';
    +	self.plugin = {};
    +	self.isCreated = false;
    +	self.isLoading = false;
    +	self._handlers = {};
    +	self._contextmenus = [];
    +	self._undoStack = [];
    +	self._redoStack = [];
    +	self._calledPlugins = {};
    +	self._firstAddBookmark = true;
    +	self.menu = self.contextmenu = null;
    +	self.dialogs = [];
    +}
    +KEditor.prototype = {
    +	lang : function(mixed) {
    +		return _lang(mixed, this.langType);
    +	},
    +	loadPlugin : function(name, fn) {
    +		var self = this;
    +		if (_plugins[name]) {
    +			if (self._calledPlugins[name]) {
    +				if (fn) {
    +					fn.call(self);
    +				}
    +				return self;
    +			}
    +			_plugins[name].call(self, KindEditor);
    +			if (fn) {
    +				fn.call(self);
    +			}
    +			self._calledPlugins[name] = true;
    +			return self;
    +		}
    +		if (self.isLoading) {
    +			return self;
    +		}
    +		self.isLoading = true;
    +		_loadScript(self.pluginsPath + name + '/' + name + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function() {
    +			self.isLoading = false;
    +			if (_plugins[name]) {
    +				self.loadPlugin(name, fn);
    +			}
    +		});
    +		return self;
    +	},
    +	handler : function(key, fn) {
    +		var self = this;
    +		if (!self._handlers[key]) {
    +			self._handlers[key] = [];
    +		}
    +		if (_isFunction(fn)) {
    +			self._handlers[key].push(fn);
    +			return self;
    +		}
    +		_each(self._handlers[key], function() {
    +			fn = this.call(self, fn);
    +		});
    +		return fn;
    +	},
    +	clickToolbar : function(name, fn) {
    +		var self = this, key = 'clickToolbar' + name;
    +		if (fn === undefined) {
    +			if (self._handlers[key]) {
    +				return self.handler(key);
    +			}
    +			self.loadPlugin(name, function() {
    +				self.handler(key);
    +			});
    +			return self;
    +		}
    +		return self.handler(key, fn);
    +	},
    +	updateState : function() {
    +		var self = this;
    +		_each(('justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,' +
    +			'subscript,superscript,bold,italic,underline,strikethrough').split(','), function(i, name) {
    +			self.cmd.state(name) ? self.toolbar.select(name) : self.toolbar.unselect(name);
    +		});
    +		return self;
    +	},
    +	addContextmenu : function(item) {
    +		this._contextmenus.push(item);
    +		return this;
    +	},
    +	afterCreate : function(fn) {
    +		return this.handler('afterCreate', fn);
    +	},
    +	beforeRemove : function(fn) {
    +		return this.handler('beforeRemove', fn);
    +	},
    +	beforeGetHtml : function(fn) {
    +		return this.handler('beforeGetHtml', fn);
    +	},
    +	beforeSetHtml : function(fn) {
    +		return this.handler('beforeSetHtml', fn);
    +	},
    +	afterSetHtml : function(fn) {
    +		return this.handler('afterSetHtml', fn);
    +	},
    +	create : function() {
    +		var self = this, fullscreenMode = self.fullscreenMode;
    +		if (self.isCreated) {
    +			return self;
    +		}
    +		if (fullscreenMode) {
    +			_docElement().style.overflow = 'hidden';
    +		} else {
    +			_docElement().style.overflow = '';
    +		}
    +		var width = fullscreenMode ? _docElement().clientWidth + 'px' : self.width,
    +			height = fullscreenMode ? _docElement().clientHeight + 'px' : self.height;
    +		if ((_IE && _V < 8) || _QUIRKS) {
    +			height = _addUnit(_removeUnit(height) + 2);
    +		}
    +		var container = self.container = K(self.layout);
    +		if (fullscreenMode) {
    +			K(document.body).append(container);
    +		} else {
    +			self.srcElement.before(container);
    +		}
    +		var toolbarDiv = K('.toolbar', container),
    +			editDiv = K('.edit', container),
    +			statusbar = self.statusbar = K('.statusbar', container);
    +		container.removeClass('container')
    +			.addClass('ke-container ke-container-' + self.themeType).css('width', width);
    +		if (fullscreenMode) {
    +			container.css({
    +				position : 'absolute',
    +				left : 0,
    +				top : 0,
    +				'z-index' : 811211
    +			});
    +			if (!_GECKO) {
    +				self._scrollPos = _getScrollPos();
    +			}
    +			window.scrollTo(0, 0);
    +			K(document.body).css({
    +				'height' : '1px',
    +				'overflow' : 'hidden'
    +			});
    +			K(document.body.parentNode).css('overflow', 'hidden');
    +			self._fullscreenExecuted = true;
    +		} else {
    +			if (self._fullscreenExecuted) {
    +				K(document.body).css({
    +					'height' : '',
    +					'overflow' : ''
    +				});
    +				K(document.body.parentNode).css('overflow', '');
    +			}
    +			if (self._scrollPos) {
    +				window.scrollTo(self._scrollPos.x, self._scrollPos.y);
    +			}
    +		}
    +		var htmlList = [];
    +		K.each(self.items, function(i, name) {
    +			if (name == '|') {
    +				htmlList.push('<span class="ke-inline-block ke-separator"></span>');
    +			} else if (name == '/') {
    +				htmlList.push('<div class="ke-hr"></div>');
    +			} else {
    +				htmlList.push('<span class="ke-outline" data-name="' + name + '" title="' + self.lang(name) + '" unselectable="on">');
    +				htmlList.push('<span class="ke-toolbar-icon ke-toolbar-icon-url ke-icon-' + name + '" unselectable="on"></span></span>');
    +			}
    +		});
    +		var toolbar = self.toolbar = _toolbar({
    +			src : toolbarDiv,
    +			html : htmlList.join(''),
    +			noDisableItems : self.noDisableItems,
    +			click : function(e, name) {
    +				e.stop();
    +				if (self.menu) {
    +					var menuName = self.menu.name;
    +					self.hideMenu();
    +					if (menuName === name) {
    +						return;
    +					}
    +				}
    +				self.clickToolbar(name);
    +			}
    +		});
    +		var editHeight = _removeUnit(height) - toolbar.div.height();
    +		var edit = self.edit = _edit({
    +			height : editHeight > 0 && _removeUnit(height) > self.minHeight ? editHeight : self.minHeight,
    +			src : editDiv,
    +			srcElement : self.srcElement,
    +			designMode : self.designMode,
    +			themesPath : self.themesPath,
    +			bodyClass : self.bodyClass,
    +			cssPath : self.cssPath,
    +			cssData : self.cssData,
    +			beforeGetHtml : function(html) {
    +				html = self.beforeGetHtml(html);
    +				return _formatHtml(html, self.filterMode ? self.htmlTags : null, self.urlType, self.wellFormatMode, self.indentChar);
    +			},
    +			beforeSetHtml : function(html) {
    +				html = _formatHtml(html, self.filterMode ? self.htmlTags : null, '', false);
    +				return self.beforeSetHtml(html);
    +			},
    +			afterSetHtml : function() {
    +				self.edit = edit = this;
    +				self.afterSetHtml();
    +			},
    +			afterCreate : function() {
    +				self.edit = edit = this;
    +				self.cmd = edit.cmd;
    +				self._docMousedownFn = function(e) {
    +					if (self.menu) {
    +						self.hideMenu();
    +					}
    +				};
    +				K(edit.doc, document).mousedown(self._docMousedownFn);
    +				_bindContextmenuEvent.call(self);
    +				_bindNewlineEvent.call(self);
    +				_bindTabEvent.call(self);
    +				_bindFocusEvent.call(self);
    +				edit.afterChange(function(e) {
    +					if (!edit.designMode) {
    +						return;
    +					}
    +					self.updateState();
    +					self.addBookmark();
    +					if (self.options.afterChange) {
    +						self.options.afterChange.call(self);
    +					}
    +				});
    +				edit.textarea.keyup(function(e) {
    +					if (!e.ctrlKey && !e.altKey && _INPUT_KEY_MAP[e.which]) {
    +						if (self.options.afterChange) {
    +							self.options.afterChange.call(self);
    +						}
    +					}
    +				});
    +				if (self.readonlyMode) {
    +					self.readonly();
    +				}
    +				self.isCreated = true;
    +				if (self.initContent === '') {
    +					self.initContent = self.html();
    +				}
    +				self.afterCreate();
    +				if (self.options.afterCreate) {
    +					self.options.afterCreate.call(self);
    +				}
    +			}
    +		});
    +		statusbar.removeClass('statusbar').addClass('ke-statusbar')
    +			.append('<span class="ke-inline-block ke-statusbar-center-icon"></span>')
    +			.append('<span class="ke-inline-block ke-statusbar-right-icon"></span>');
    +		K(window).unbind('resize');
    +		function initResize() {
    +			if (statusbar.height() === 0) {
    +				setTimeout(initResize, 100);
    +				return;
    +			}
    +			self.resize(width, height);
    +		}
    +		initResize();
    +		function newResize(width, height, updateProp) {
    +			updateProp = _undef(updateProp, true);
    +			if (width && width >= self.minWidth) {
    +				self.resize(width, null);
    +				if (updateProp) {
    +					self.width = _addUnit(width);
    +				}
    +			}
    +			if (height && height >= self.minHeight) {
    +				self.resize(null, height);
    +				if (updateProp) {
    +					self.height = _addUnit(height);
    +				}
    +			}
    +		}
    +		if (fullscreenMode) {
    +			K(window).bind('resize', function(e) {
    +				if (self.isCreated) {
    +					newResize(_docElement().clientWidth, _docElement().clientHeight, false);
    +				}
    +			});
    +			toolbar.select('fullscreen');
    +			statusbar.first().css('visibility', 'hidden');
    +			statusbar.last().css('visibility', 'hidden');
    +		} else {
    +			if (_GECKO) {
    +				K(window).bind('scroll', function(e) {
    +					self._scrollPos = _getScrollPos();
    +				});
    +			}
    +			if (self.resizeType > 0) {
    +				_drag({
    +					moveEl : container,
    +					clickEl : statusbar,
    +					moveFn : function(x, y, width, height, diffX, diffY) {
    +						height += diffY;
    +						newResize(null, height);
    +					}
    +				});
    +			} else {
    +				statusbar.first().css('visibility', 'hidden');
    +			}
    +			if (self.resizeType === 2) {
    +				_drag({
    +					moveEl : container,
    +					clickEl : statusbar.last(),
    +					moveFn : function(x, y, width, height, diffX, diffY) {
    +						width += diffX;
    +						height += diffY;
    +						newResize(width, height);
    +					}
    +				});
    +			} else {
    +				statusbar.last().css('visibility', 'hidden');
    +			}
    +		}
    +		return self;
    +	},
    +	remove : function() {
    +		var self = this;
    +		if (!self.isCreated) {
    +			return self;
    +		}
    +		self.beforeRemove();
    +		if (self.menu) {
    +			self.hideMenu();
    +		}
    +		_each(self.dialogs, function() {
    +			self.hideDialog();
    +		});
    +		K(document).unbind('mousedown', self._docMousedownFn);
    +		self.toolbar.remove();
    +		self.edit.remove();
    +		self.statusbar.last().unbind();
    +		self.statusbar.unbind();
    +		self.container.remove();
    +		self.container = self.toolbar = self.edit = self.menu = null;
    +		self.dialogs = [];
    +		self.isCreated = false;
    +		return self;
    +	},
    +	resize : function(width, height) {
    +		var self = this;
    +		if (width !== null) {
    +			if (_removeUnit(width) > self.minWidth) {
    +				self.container.css('width', _addUnit(width));
    +			}
    +		}
    +		if (height !== null) {
    +			height = _removeUnit(height) - self.toolbar.div.height() - self.statusbar.height();
    +			if (height > 0 && _removeUnit(height) > self.minHeight) {
    +				self.edit.setHeight(height);
    +			}
    +		}
    +		return self;
    +	},
    +	select : function() {
    +		this.isCreated && this.cmd.select();
    +		return this;
    +	},
    +	html : function(val) {
    +		var self = this;
    +		if (val === undefined) {
    +			return self.isCreated ? self.edit.html() : _elementVal(self.srcElement);
    +		}
    +		self.isCreated ? self.edit.html(val) : _elementVal(self.srcElement, val);
    +		return self;
    +	},
    +	fullHtml : function() {
    +		return this.isCreated ? this.edit.html(undefined, true) : '';
    +	},
    +	text : function(val) {
    +		var self = this;
    +		if (val === undefined) {
    +			return _trim(self.html().replace(/<(?!img|embed).*?>/ig, '').replace(/&nbsp;/ig, ' '));
    +		} else {
    +			return self.html(_escape(val));
    +		}
    +	},
    +	isEmpty : function() {
    +		return _trim(this.text().replace(/\r\n|\n|\r/, '')) === '';
    +	},
    +	isDirty : function() {
    +		return _trim(this.initContent.replace(/\r\n|\n|\r|t/g, '')) !== _trim(this.html().replace(/\r\n|\n|\r|t/g, ''));
    +	},
    +	selectedHtml : function() {
    +		return this.isCreated ? this.cmd.range.html() : '';
    +	},
    +	count : function(mode) {
    +		var self = this;
    +		mode = (mode || 'html').toLowerCase();
    +		if (mode === 'html') {
    +			return _removeBookmarkTag(_removeTempTag(self.html())).length;
    +		}
    +		if (mode === 'text') {
    +			return self.text().replace(/<(?:img|embed).*?>/ig, 'K').replace(/\r\n|\n|\r/g, '').length;
    +		}
    +		return 0;
    +	},
    +	exec : function(key) {
    +		key = key.toLowerCase();
    +		var self = this, cmd = self.cmd,
    +			changeFlag = _inArray(key, 'selectall,copy,paste,print'.split(',')) < 0;
    +		if (changeFlag) {
    +			self.addBookmark(false);
    +		}
    +		cmd[key].apply(cmd, _toArray(arguments, 1));
    +		if (changeFlag) {
    +			self.updateState();
    +			self.addBookmark(false);
    +			if (self.options.afterChange) {
    +				self.options.afterChange.call(self);
    +			}
    +		}
    +		return self;
    +	},
    +	insertHtml : function(val) {
    +		if (!this.isCreated) {
    +			return this;
    +		}
    +		val = this.beforeSetHtml(val);
    +		this.exec('inserthtml', val);
    +		return this;
    +	},
    +	appendHtml : function(val) {
    +		this.html(this.html() + val);
    +		if (this.isCreated) {
    +			var cmd = this.cmd;
    +			cmd.range.selectNodeContents(cmd.doc.body).collapse(false);
    +			cmd.select();
    +		}
    +		return this;
    +	},
    +	sync : function() {
    +		_elementVal(this.srcElement, this.html());
    +		return this;
    +	},
    +	focus : function() {
    +		this.isCreated ? this.edit.focus() : this.srcElement[0].focus();
    +		return this;
    +	},
    +	blur : function() {
    +		this.isCreated ? this.edit.blur() : this.srcElement[0].blur();
    +		return this;
    +	},
    +	addBookmark : function(checkSize) {
    +		checkSize = _undef(checkSize, true);
    +		var self = this, edit = self.edit,
    +			body = edit.doc.body,
    +			html = _removeTempTag(body.innerHTML), bookmark;
    +		if (checkSize && self._undoStack.length > 0) {
    +			var prev = self._undoStack[self._undoStack.length - 1];
    +			if (Math.abs(html.length -  _removeBookmarkTag(prev.html).length) < self.minChangeSize) {
    +				return self;
    +			}
    +		}
    +		if (edit.designMode && !self._firstAddBookmark) {
    +			var range = self.cmd.range;
    +			bookmark = range.createBookmark(true);
    +			bookmark.html = _removeTempTag(body.innerHTML);
    +			range.moveToBookmark(bookmark);
    +		} else {
    +			bookmark = {
    +				html : html
    +			};
    +		}
    +		self._firstAddBookmark = false;
    +		_addBookmarkToStack(self._undoStack, bookmark);
    +		return self;
    +	},
    +	undo : function() {
    +		return _undoToRedo.call(this, this._undoStack, this._redoStack);
    +	},
    +	redo : function() {
    +		return _undoToRedo.call(this, this._redoStack, this._undoStack);
    +	},
    +	fullscreen : function(bool) {
    +		this.fullscreenMode = (bool === undefined ? !this.fullscreenMode : bool);
    +		return this.remove().create();
    +	},
    +	readonly : function(isReadonly) {
    +		isReadonly = _undef(isReadonly, true);
    +		var self = this, edit = self.edit, doc = edit.doc;
    +		if (self.designMode) {
    +			self.toolbar.disableAll(isReadonly, []);
    +		} else {
    +			_each(self.noDisableItems, function() {
    +				self.toolbar[isReadonly ? 'disable' : 'enable'](this);
    +			});
    +		}
    +		if (_IE) {
    +			doc.body.contentEditable = !isReadonly;
    +		} else {
    +			doc.designMode = isReadonly ? 'off' : 'on';
    +		}
    +		edit.textarea[0].disabled = isReadonly;
    +	},
    +	createMenu : function(options) {
    +		var self = this,
    +			name = options.name,
    +			knode = self.toolbar.get(name),
    +			pos = knode.pos();
    +		options.x = pos.x;
    +		options.y = pos.y + knode.height();
    +		options.shadowMode = _undef(options.shadowMode, self.shadowMode);
    +		if (options.selectedColor !== undefined) {
    +			options.cls = 'ke-colorpicker-' + self.themeType;
    +			options.noColor = self.lang('noColor');
    +			self.menu = _colorpicker(options);
    +		} else {
    +			options.cls = 'ke-menu-' + self.themeType;
    +			options.centerLineMode = false;
    +			self.menu = _menu(options);
    +		}
    +		return self.menu;
    +	},
    +	hideMenu : function() {
    +		this.menu.remove();
    +		this.menu = null;
    +		return this;
    +	},
    +	hideContextmenu : function() {
    +		this.contextmenu.remove();
    +		this.contextmenu = null;
    +		return this;
    +	},
    +	createDialog : function(options) {
    +		var self = this, name = options.name;
    +		options.autoScroll = _undef(options.autoScroll, true);
    +		options.shadowMode = _undef(options.shadowMode, self.shadowMode);
    +		options.closeBtn = _undef(options.closeBtn, {
    +			name : self.lang('close'),
    +			click : function(e) {
    +				self.hideDialog();
    +				if (_IE && self.cmd) {
    +					self.cmd.select();
    +				}
    +			}
    +		});
    +		options.noBtn = _undef(options.noBtn, {
    +			name : self.lang(options.yesBtn ? 'no' : 'close'),
    +			click : function(e) {
    +				self.hideDialog();
    +				if (_IE && self.cmd) {
    +					self.cmd.select();
    +				}
    +			}
    +		});
    +		if (self.dialogAlignType != 'page') {
    +			options.alignEl = self.container;
    +		}
    +		options.cls = 'ke-dialog-' + self.themeType;
    +		if (self.dialogs.length > 0) {
    +			var firstDialog = self.dialogs[0],
    +				parentDialog = self.dialogs[self.dialogs.length - 1];
    +			firstDialog.setMaskIndex(parentDialog.z + 2);
    +			options.z = parentDialog.z + 3;
    +			options.showMask = false;
    +		}
    +		var dialog = _dialog(options);
    +		self.dialogs.push(dialog);
    +		return dialog;
    +	},
    +	hideDialog : function() {
    +		var self = this;
    +		if (self.dialogs.length > 0) {
    +			self.dialogs.pop().remove();
    +		}
    +		if (self.dialogs.length > 0) {
    +			var firstDialog = self.dialogs[0],
    +				parentDialog = self.dialogs[self.dialogs.length - 1];
    +			firstDialog.setMaskIndex(parentDialog.z - 1);
    +		}
    +		return self;
    +	},
    +	errorDialog : function(html) {
    +		var self = this;
    +		var dialog = self.createDialog({
    +			width : 750,
    +			title : self.lang('uploadError'),
    +			body : '<div style="padding:10px 20px;"><iframe frameborder="0" style="width:708px;height:400px;"></iframe></div>'
    +		});
    +		var iframe = K('iframe', dialog.div), doc = K.iframeDoc(iframe);
    +		doc.open();
    +		doc.write(html);
    +		doc.close();
    +		K(doc.body).css('background-color', '#FFF');
    +		iframe[0].contentWindow.focus();
    +		return self;
    +	}
    +};
    +function _editor(options) {
    +	return new KEditor(options);
    +}
    +_instances = [];
    +function _create(expr, options) {
    +	options = options || {};
    +	options.basePath = _undef(options.basePath, K.basePath);
    +	options.themesPath = _undef(options.themesPath, options.basePath + 'themes/');
    +	options.langPath = _undef(options.langPath, options.basePath + 'lang/');
    +	options.pluginsPath = _undef(options.pluginsPath, options.basePath + 'plugins/');
    +	if (_undef(options.loadStyleMode, K.options.loadStyleMode)) {
    +		var themeType = _undef(options.themeType, K.options.themeType);
    +		_loadStyle(options.themesPath + 'default/default.css');
    +		_loadStyle(options.themesPath + themeType + '/' + themeType + '.css');
    +	}
    +	function create(editor) {
    +		_each(_plugins, function(name, fn) {
    +			fn.call(editor, KindEditor);
    +		});
    +		return editor.create();
    +	}
    +	var knode = K(expr);
    +	if (!knode) {
    +		return;
    +	}
    +	if (knode.length > 1) {
    +		knode.each(function() {
    +			_create(this, options);
    +		});
    +		return _instances[0];
    +	}
    +	options.srcElement = knode[0];
    +	var editor = new KEditor(options);
    +	_instances.push(editor);
    +	if (_language[editor.langType]) {
    +		return create(editor);
    +	}
    +	_loadScript(editor.langPath + editor.langType + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function() {
    +		create(editor);
    +	});
    +	return editor;
    +}
    +if (_IE && _V < 7) {
    +	_nativeCommand(document, 'BackgroundImageCache', true);
    +}
    +K.EditorClass = KEditor;
    +K.editor = _editor;
    +K.create = _create;
    +K.instances = _instances;
    +K.plugin = _plugin;
    +K.lang = _lang;
    +_plugin('core', function(K) {
    +	var self = this,
    +		shortcutKeys = {
    +			undo : 'Z', redo : 'Y', bold : 'B', italic : 'I', underline : 'U', print : 'P', selectall : 'A'
    +		};
    +	self.afterSetHtml(function() {
    +		if (self.options.afterChange) {
    +			self.options.afterChange.call(self);
    +		}
    +	});
    +	self.afterCreate(function() {
    +		if (self.syncType != 'form') {
    +			return;
    +		}
    +		var el = K(self.srcElement), hasForm = false;
    +		while ((el = el.parent())) {
    +			if (el.name == 'form') {
    +				hasForm = true;
    +				break;
    +			}
    +		}
    +		if (hasForm) {
    +			el.bind('submit', function(e) {
    +				self.sync();
    +				K(window).bind('unload', function() {
    +					self.edit.textarea.remove();
    +				});
    +			});
    +			var resetBtn = K('[type="reset"]', el);
    +			resetBtn.click(function() {
    +				self.html(self.initContent);
    +				self.cmd.selection();
    +			});
    +			self.beforeRemove(function() {
    +				el.unbind();
    +				resetBtn.unbind();
    +			});
    +		}
    +	});
    +	self.clickToolbar('source', function() {
    +		if (self.edit.designMode) {
    +			self.toolbar.disableAll(true);
    +			self.edit.design(false);
    +			self.toolbar.select('source');
    +		} else {
    +			self.toolbar.disableAll(false);
    +			self.edit.design(true);
    +			self.toolbar.unselect('source');
    +		}
    +		self.designMode = self.edit.designMode;
    +	});
    +	self.afterCreate(function() {
    +		if (!self.designMode) {
    +			self.toolbar.disableAll(true).select('source');
    +		}
    +	});
    +	self.clickToolbar('fullscreen', function() {
    +		self.fullscreen();
    +	});
    +	if (self.fullscreenShortcut) {
    +		var loaded = false;
    +		self.afterCreate(function() {
    +			K(self.edit.doc, self.edit.textarea).keyup(function(e) {
    +				if (e.which == 27) {
    +					setTimeout(function() {
    +						self.fullscreen();
    +					}, 0);
    +				}
    +			});
    +			if (loaded) {
    +				if (_IE && !self.designMode) {
    +					return;
    +				}
    +				self.focus();
    +			}
    +			if (!loaded) {
    +				loaded = true;
    +			}
    +		});
    +	}
    +	_each('undo,redo'.split(','), function(i, name) {
    +		if (shortcutKeys[name]) {
    +			self.afterCreate(function() {
    +				_ctrl(this.edit.doc, shortcutKeys[name], function() {
    +					self.clickToolbar(name);
    +				});
    +			});
    +		}
    +		self.clickToolbar(name, function() {
    +			self[name]();
    +		});
    +	});
    +	self.clickToolbar('formatblock', function() {
    +		var blocks = self.lang('formatblock.formatBlock'),
    +			heights = {
    +				h1 : 28,
    +				h2 : 24,
    +				h3 : 18,
    +				H4 : 14,
    +				p : 12
    +			},
    +			curVal = self.cmd.val('formatblock'),
    +			menu = self.createMenu({
    +				name : 'formatblock',
    +				width : self.langType == 'en' ? 200 : 150
    +			});
    +		_each(blocks, function(key, val) {
    +			var style = 'font-size:' + heights[key] + 'px;';
    +			if (key.charAt(0) === 'h') {
    +				style += 'font-weight:bold;';
    +			}
    +			menu.addItem({
    +				title : '<span style="' + style + '" unselectable="on">' + val + '</span>',
    +				height : heights[key] + 12,
    +				checked : (curVal === key || curVal === val),
    +				click : function() {
    +					self.select().exec('formatblock', '<' + key + '>').hideMenu();
    +				}
    +			});
    +		});
    +	});
    +	self.clickToolbar('fontname', function() {
    +		var curVal = self.cmd.val('fontname'),
    +			menu = self.createMenu({
    +				name : 'fontname',
    +				width : 150
    +			});
    +		_each(self.lang('fontname.fontName'), function(key, val) {
    +			menu.addItem({
    +				title : '<span style="font-family: ' + key + ';" unselectable="on">' + val + '</span>',
    +				checked : (curVal === key.toLowerCase() || curVal === val.toLowerCase()),
    +				click : function() {
    +					self.exec('fontname', key).hideMenu();
    +				}
    +			});
    +		});
    +	});
    +	self.clickToolbar('fontsize', function() {
    +		var curVal = self.cmd.val('fontsize'),
    +			menu = self.createMenu({
    +				name : 'fontsize',
    +				width : 150
    +			});
    +		_each(self.fontSizeTable, function(i, val) {
    +			menu.addItem({
    +				title : '<span style="font-size:' + val + ';" unselectable="on">' + val + '</span>',
    +				height : _removeUnit(val) + 12,
    +				checked : curVal === val,
    +				click : function() {
    +					self.exec('fontsize', val).hideMenu();
    +				}
    +			});
    +		});
    +	});
    +	_each('forecolor,hilitecolor'.split(','), function(i, name) {
    +		self.clickToolbar(name, function() {
    +			self.createMenu({
    +				name : name,
    +				selectedColor : self.cmd.val(name) || 'default',
    +				colors : self.colorTable,
    +				click : function(color) {
    +					self.exec(name, color).hideMenu();
    +				}
    +			});
    +		});
    +	});
    +	_each(('cut,copy,paste').split(','), function(i, name) {
    +		self.clickToolbar(name, function() {
    +			self.focus();
    +			try {
    +				self.exec(name, null);
    +			} catch(e) {
    +				alert(self.lang(name + 'Error'));
    +			}
    +		});
    +	});
    +	self.clickToolbar('about', function() {
    +		var html = '<div style="margin:20px;">' +
    +			'<div>KindEditor ' + _VERSION + '</div>' +
    +			'<div>Copyright &copy; <a href="http://www.kindsoft.net/" target="_blank">kindsoft.net</a> All rights reserved.</div>' +
    +			'</div>';
    +		self.createDialog({
    +			name : 'about',
    +			width : 300,
    +			title : self.lang('about'),
    +			body : html
    +		});
    +	});
    +	self.plugin.getSelectedLink = function() {
    +		return self.cmd.commonAncestor('a');
    +	};
    +	self.plugin.getSelectedImage = function() {
    +		return _getImageFromRange(self.edit.cmd.range, function(img) {
    +			return !/^ke-\w+$/i.test(img[0].className);
    +		});
    +	};
    +	self.plugin.getSelectedFlash = function() {
    +		return _getImageFromRange(self.edit.cmd.range, function(img) {
    +			return img[0].className == 'ke-flash';
    +		});
    +	};
    +	self.plugin.getSelectedMedia = function() {
    +		return _getImageFromRange(self.edit.cmd.range, function(img) {
    +			return img[0].className == 'ke-media' || img[0].className == 'ke-rm';
    +		});
    +	};
    +	self.plugin.getSelectedAnchor = function() {
    +		return _getImageFromRange(self.edit.cmd.range, function(img) {
    +			return img[0].className == 'ke-anchor';
    +		});
    +	};
    +	_each('link,image,flash,media,anchor'.split(','), function(i, name) {
    +		var uName = name.charAt(0).toUpperCase() + name.substr(1);
    +		_each('edit,delete'.split(','), function(j, val) {
    +			self.addContextmenu({
    +				title : self.lang(val + uName),
    +				click : function() {
    +					self.loadPlugin(name, function() {
    +						self.plugin[name][val]();
    +						self.hideMenu();
    +					});
    +				},
    +				cond : self.plugin['getSelected' + uName],
    +				width : 150,
    +				iconClass : val == 'edit' ? 'ke-icon-' + name : undefined
    +			});
    +		});
    +		self.addContextmenu({ title : '-' });
    +	});
    +	self.plugin.getSelectedTable = function() {
    +		return self.cmd.commonAncestor('table');
    +	};
    +	self.plugin.getSelectedRow = function() {
    +		return self.cmd.commonAncestor('tr');
    +	};
    +	self.plugin.getSelectedCell = function() {
    +		return self.cmd.commonAncestor('td');
    +	};
    +	_each(('prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,rowmerge,colmerge,' +
    +	'rowsplit,colsplit,coldelete,rowdelete,insert,delete').split(','), function(i, val) {
    +		var cond = _inArray(val, ['prop', 'delete']) < 0 ? self.plugin.getSelectedCell : self.plugin.getSelectedTable;
    +		self.addContextmenu({
    +			title : self.lang('table' + val),
    +			click : function() {
    +				self.loadPlugin('table', function() {
    +					self.plugin.table[val]();
    +					self.hideMenu();
    +				});
    +			},
    +			cond : cond,
    +			width : 170,
    +			iconClass : 'ke-icon-table' + val
    +		});
    +	});
    +	self.addContextmenu({ title : '-' });
    +	_each(('selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,' +
    +		'insertunorderedlist,indent,outdent,subscript,superscript,hr,print,' +
    +		'bold,italic,underline,strikethrough,removeformat,unlink').split(','), function(i, name) {
    +		if (shortcutKeys[name]) {
    +			self.afterCreate(function() {
    +				_ctrl(this.edit.doc, shortcutKeys[name], function() {
    +					self.cmd.selection();
    +					self.clickToolbar(name);
    +				});
    +			});
    +		}
    +		self.clickToolbar(name, function() {
    +			self.focus().exec(name, null);
    +		});
    +	});
    +	self.afterCreate(function() {
    +		var doc = self.edit.doc, cmd, bookmark, div,
    +			cls = '__kindeditor_paste__', pasting = false;
    +		function movePastedData() {
    +			cmd.range.moveToBookmark(bookmark);
    +			cmd.select();
    +			if (_WEBKIT) {
    +				K('div.' + cls, div).each(function() {
    +					K(this).after('<br />').remove(true);
    +				});
    +				K('span.Apple-style-span', div).remove(true);
    +				K('span.Apple-tab-span', div).remove(true);
    +				K('span[style]', div).each(function() {
    +					if (K(this).css('white-space') == 'nowrap') {
    +						K(this).remove(true);
    +					}
    +				});
    +				K('meta', div).remove();
    +			}
    +			var html = div[0].innerHTML;
    +			div.remove();
    +			if (html === '') {
    +				return;
    +			}
    +			if (self.pasteType === 2) {
    +				if (/schemas-microsoft-com|worddocument|mso-\w+/i.test(html)) {
    +					html = _clearMsWord(html, self.filterMode ? self.htmlTags : K.options.htmlTags);
    +				} else {
    +					html = _formatHtml(html, self.filterMode ? self.htmlTags : null);
    +					html = self.beforeSetHtml(html);
    +				}
    +			}
    +			if (self.pasteType === 1) {
    +				html = html.replace(/<br[^>]*>/ig, '\n');
    +				html = html.replace(/<\/p><p[^>]*>/ig, '\n');
    +				html = html.replace(/<[^>]+>/g, '');
    +				html = html.replace(/&nbsp;/ig, ' ');
    +				html = html.replace(/\n\s*\n/g, '\n');
    +				html = html.replace(/ {2}/g, ' &nbsp;');
    +				if (self.newlineTag == 'p') {
    +					if (/\n/.test(html)) {
    +						html = html.replace(/^/, '<p>').replace(/$/, '</p>').replace(/\n/g, '</p><p>');
    +					}
    +				} else {
    +					html = html.replace(/\n/g, '<br />$&');
    +				}
    +			}
    +			self.insertHtml(html, true);
    +		}
    +		K(doc.body).bind('paste', function(e){
    +			if (self.pasteType === 0) {
    +				e.stop();
    +				return;
    +			}
    +			if (pasting) {
    +				return;
    +			}
    +			pasting = true;
    +			K('div.' + cls, doc).remove();
    +			cmd = self.cmd.selection();
    +			bookmark = cmd.range.createBookmark();
    +			div = K('<div class="' + cls + '"></div>', doc).css({
    +				position : 'absolute',
    +				width : '1px',
    +				height : '1px',
    +				overflow : 'hidden',
    +				left : '-1981px',
    +				top : K(bookmark.start).pos().y + 'px',
    +				'white-space' : 'nowrap'
    +			});
    +			K(doc.body).append(div);
    +			if (_IE) {
    +				var rng = cmd.range.get(true);
    +				rng.moveToElementText(div[0]);
    +				rng.select();
    +				rng.execCommand('paste');
    +				e.preventDefault();
    +			} else {
    +				cmd.range.selectNodeContents(div[0]);
    +				cmd.select();
    +			}
    +			setTimeout(function() {
    +				movePastedData();
    +				pasting = false;
    +			}, 0);
    +		});
    +	});
    +	self.beforeGetHtml(function(html) {
    +		return html.replace(/(<(?:noscript|noscript\s[^>]*)>)([\s\S]*?)(<\/noscript>)/ig, function($0, $1, $2, $3) {
    +			return $1 + _unescape($2).replace(/\s+/g, ' ') + $3;
    +		})
    +		.replace(/<img[^>]*class="?ke-(flash|rm|media)"?[^>]*>/ig, function(full) {
    +			var imgAttrs = _getAttrList(full),
    +				styles = _getCssList(imgAttrs.style || ''),
    +				attrs = _mediaAttrs(imgAttrs['data-ke-tag']);
    +			attrs.width = _undef(imgAttrs.width, _removeUnit(_undef(styles.width, '')));
    +			attrs.height = _undef(imgAttrs.height, _removeUnit(_undef(styles.height, '')));
    +			return _mediaEmbed(attrs);
    +		})
    +		.replace(/<img[^>]*class="?ke-anchor"?[^>]*>/ig, function(full) {
    +			var imgAttrs = _getAttrList(full);
    +			return '<a name="' + unescape(imgAttrs['data-ke-name']) + '"></a>';
    +		})
    +		.replace(/<div\s+[^>]*data-ke-script-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function(full, attr, code) {
    +			return '<script' + unescape(attr) + '>' + unescape(code) + '</script>';
    +		})
    +		.replace(/<div\s+[^>]*data-ke-noscript-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function(full, attr, code) {
    +			return '<noscript' + unescape(attr) + '>' + unescape(code) + '</noscript>';
    +		})
    +		.replace(/(<[^>]*)data-ke-src="([^"]*)"([^>]*>)/ig, function(full, start, src, end) {
    +			full = full.replace(/(\s+(?:href|src)=")[^"]*(")/i, '$1' + src + '$2');
    +			full = full.replace(/\s+data-ke-src="[^"]*"/i, '');
    +			return full;
    +		})
    +		.replace(/(<[^>]+\s)data-ke-(on\w+="[^"]*"[^>]*>)/ig, function(full, start, end) {
    +			return start + end;
    +		});
    +	});
    +	self.beforeSetHtml(function(html) {
    +		return html.replace(/<embed[^>]*type="([^"]+)"[^>]*>(?:<\/embed>)?/ig, function(full) {
    +			var attrs = _getAttrList(full);
    +			attrs.src = _undef(attrs.src, '');
    +			attrs.width = _undef(attrs.width, 0);
    +			attrs.height = _undef(attrs.height, 0);
    +			return _mediaImg(self.themesPath + 'common/blank.gif', attrs);
    +		})
    +		.replace(/<a[^>]*name="([^"]+)"[^>]*>(?:<\/a>)?/ig, function(full) {
    +			var attrs = _getAttrList(full);
    +			if (attrs.href !== undefined) {
    +				return full;
    +			}
    +			return '<img class="ke-anchor" src="' + self.themesPath + 'common/anchor.gif" data-ke-name="' + escape(attrs.name) + '" />';
    +		})
    +		.replace(/<script([^>]*)>([\s\S]*?)<\/script>/ig, function(full, attr, code) {
    +			return '<div class="ke-script" data-ke-script-attr="' + escape(attr) + '">' + escape(code) + '</div>';
    +		})
    +		.replace(/<noscript([^>]*)>([\s\S]*?)<\/noscript>/ig, function(full, attr, code) {
    +			return '<div class="ke-noscript" data-ke-noscript-attr="' + escape(attr) + '">' + escape(code) + '</div>';
    +		})
    +		.replace(/(<[^>]*)(href|src)="([^"]*)"([^>]*>)/ig, function(full, start, key, src, end) {
    +			if (full.match(/\sdata-ke-src="[^"]*"/i)) {
    +				return full;
    +			}
    +			full = start + key + '="' + src + '"' + ' data-ke-src="' + src + '"' + end;
    +			return full;
    +		})
    +		.replace(/(<[^>]+\s)(on\w+="[^"]*"[^>]*>)/ig, function(full, start, end) {
    +			return start + 'data-ke-' + end;
    +		})
    +		.replace(/<table[^>]*\s+border="0"[^>]*>/ig, function(full) {
    +			if (full.indexOf('ke-zeroborder') >= 0) {
    +				return full;
    +			}
    +			return _addClassToTag(full, 'ke-zeroborder');
    +		});
    +	});
    +});
    +})(window);
    diff --git a/src/main/webapp/plug-in/kindeditor/lang/en.js b/src/main/webapp/plug-in/kindeditor/lang/en.js
    new file mode 100644
    index 00000000..99fdc02b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/lang/en.js
    @@ -0,0 +1,230 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.lang({
    +	source : 'Source',
    +	preview : 'Preview',
    +	undo : 'Undo(Ctrl+Z)',
    +	redo : 'Redo(Ctrl+Y)',
    +	cut : 'Cut(Ctrl+X)',
    +	copy : 'Copy(Ctrl+C)',
    +	paste : 'Paste(Ctrl+V)',
    +	plainpaste : 'Paste as plain text',
    +	wordpaste : 'Paste from Word',
    +	selectall : 'Select all',
    +	justifyleft : 'Align left',
    +	justifycenter : 'Align center',
    +	justifyright : 'Align right',
    +	justifyfull : 'Align full',
    +	insertorderedlist : 'Ordered list',
    +	insertunorderedlist : 'Unordered list',
    +	indent : 'Increase indent',
    +	outdent : 'Decrease indent',
    +	subscript : 'Subscript',
    +	superscript : 'Superscript',
    +	formatblock : 'Paragraph format',
    +	fontname : 'Font family',
    +	fontsize : 'Font size',
    +	forecolor : 'Text color',
    +	hilitecolor : 'Highlight color',
    +	bold : 'Bold(Ctrl+B)',
    +	italic : 'Italic(Ctrl+I)',
    +	underline : 'Underline(Ctrl+U)',
    +	strikethrough : 'Strikethrough',
    +	removeformat : 'Remove format',
    +	image : 'Image',
    +	multiimage : 'Multi image',
    +	flash : 'Flash',
    +	media : 'Embeded media',
    +	table : 'Table',
    +	tablecell : 'Cell',
    +	hr : 'Insert horizontal line',
    +	emoticons : 'Insert emoticon',
    +	link : 'Link',
    +	unlink : 'Unlink',
    +	fullscreen : 'Toggle fullscreen mode(Esc)',
    +	about : 'About',
    +	print : 'Print',
    +	filemanager : 'File Manager',
    +	code : 'Insert code',
    +	map : 'Google Maps',
    +	baidumap : 'Baidu Maps',
    +	lineheight : 'Line height',
    +	clearhtml : 'Clear HTML code',
    +	pagebreak : 'Insert Page Break',
    +	quickformat : 'Quick Format',
    +	insertfile : 'Insert file',
    +	template : 'Insert Template',
    +	anchor : 'Anchor',
    +	yes : 'OK',
    +	no : 'Cancel',
    +	close : 'Close',
    +	editImage : 'Image properties',
    +	deleteImage : 'Delete image',
    +	editFlash : 'Flash properties',
    +	deleteFlash : 'Delete flash',
    +	editMedia : 'Media properties',
    +	deleteMedia : 'Delete media',
    +	editLink : 'Link properties',
    +	deleteLink : 'Unlink',
    +	tableprop : 'Table properties',
    +	tablecellprop : 'Cell properties',
    +	tableinsert : 'Insert table',
    +	tabledelete : 'Delete table',
    +	tablecolinsertleft : 'Insert column left',
    +	tablecolinsertright : 'Insert column right',
    +	tablerowinsertabove : 'Insert row above',
    +	tablerowinsertbelow : 'Insert row below',
    +	tablerowmerge : 'Merge down',
    +	tablecolmerge : 'Merge right',
    +	tablerowsplit : 'Split row',
    +	tablecolsplit : 'Split column',
    +	tablecoldelete : 'Delete column',
    +	tablerowdelete : 'Delete row',
    +	noColor : 'Default',
    +	pleaseSelectFile : 'Please select file.',
    +	invalidImg : "Please type valid URL.\nAllowed file extension: jpg,gif,bmp,png",
    +	invalidMedia : "Please type valid URL.\nAllowed file extension: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
    +	invalidWidth : "The width must be number.",
    +	invalidHeight : "The height must be number.",
    +	invalidBorder : "The border must be number.",
    +	invalidUrl : "Please type valid URL.",
    +	invalidRows : 'Invalid rows.',
    +	invalidCols : 'Invalid columns.',
    +	invalidPadding : 'The padding must be number.',
    +	invalidSpacing : 'The spacing must be number.',
    +	invalidJson : 'Invalid JSON string.',
    +	uploadSuccess : 'Upload success.',
    +	cutError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+X) instead.',
    +	copyError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+C) instead.',
    +	pasteError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+V) instead.',
    +	ajaxLoading : 'Loading ...',
    +	uploadLoading : 'Uploading ...',
    +	uploadError : 'Upload Error',
    +	'plainpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.',
    +	'wordpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.',
    +	'link.url' : 'URL',
    +	'link.linkType' : 'Target',
    +	'link.newWindow' : 'New window',
    +	'link.selfWindow' : 'Same window',
    +	'flash.url' : 'URL',
    +	'flash.width' : 'Width',
    +	'flash.height' : 'Height',
    +	'flash.upload' : 'Upload',
    +	'flash.viewServer' : 'Browse',
    +	'media.url' : 'URL',
    +	'media.width' : 'Width',
    +	'media.height' : 'Height',
    +	'media.autostart' : 'Auto start',
    +	'media.upload' : 'Upload',
    +	'media.viewServer' : 'Browse',
    +	'image.remoteImage' : 'Insert URL',
    +	'image.localImage' : 'Upload',
    +	'image.remoteUrl' : 'URL',
    +	'image.localUrl' : 'File',
    +	'image.size' : 'Size',
    +	'image.width' : 'Width',
    +	'image.height' : 'Height',
    +	'image.resetSize' : 'Reset dimensions',
    +	'image.align' : 'Align',
    +	'image.defaultAlign' : 'Default',
    +	'image.leftAlign' : 'Left',
    +	'image.rightAlign' : 'Right',
    +	'image.imgTitle' : 'Title',
    +	'image.upload' : 'Browse',
    +	'image.viewServer' : 'Browse',
    +	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
    +	'multiimage.startUpload' : 'Start upload',
    +	'multiimage.clearAll' : 'Clear all',
    +	'multiimage.insertAll' : 'Insert all',
    +	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
    +	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
    +	'multiimage.zeroByteFile' : 'Zero byte file.',
    +	'multiimage.invalidFiletype' : 'Invalid file type.',
    +	'multiimage.unknownError' : 'Unknown upload error.',
    +	'multiimage.pending' : 'Pending ...',
    +	'multiimage.uploadError' : 'Upload error',
    +	'filemanager.emptyFolder' : 'Blank',
    +	'filemanager.moveup' : 'Parent folder',
    +	'filemanager.viewType' : 'Display: ',
    +	'filemanager.viewImage' : 'Thumbnails',
    +	'filemanager.listImage' : 'List',
    +	'filemanager.orderType' : 'Sorting: ',
    +	'filemanager.fileName' : 'By name',
    +	'filemanager.fileSize' : 'By size',
    +	'filemanager.fileType' : 'By type',
    +	'insertfile.url' : 'URL',
    +	'insertfile.title' : 'Title',
    +	'insertfile.upload' : 'Upload',
    +	'insertfile.viewServer' : 'Browse',
    +	'table.cells' : 'Cells',
    +	'table.rows' : 'Rows',
    +	'table.cols' : 'Columns',
    +	'table.size' : 'Dimensions',
    +	'table.width' : 'Width',
    +	'table.height' : 'Height',
    +	'table.percent' : '%',
    +	'table.px' : 'px',
    +	'table.space' : 'Space',
    +	'table.padding' : 'Padding',
    +	'table.spacing' : 'Spacing',
    +	'table.align' : 'Align',
    +	'table.textAlign' : 'Horizontal',
    +	'table.verticalAlign' : 'Vertical',
    +	'table.alignDefault' : 'Default',
    +	'table.alignLeft' : 'Left',
    +	'table.alignCenter' : 'Center',
    +	'table.alignRight' : 'Right',
    +	'table.alignTop' : 'Top',
    +	'table.alignMiddle' : 'Middle',
    +	'table.alignBottom' : 'Bottom',
    +	'table.alignBaseline' : 'Baseline',
    +	'table.border' : 'Border',
    +	'table.borderWidth' : 'Width',
    +	'table.borderColor' : 'Color',
    +	'table.backgroundColor' : 'Background',
    +	'map.address' : 'Address: ',
    +	'map.search' : 'Search',
    +	'baidumap.address' : 'Address: ',
    +	'baidumap.search' : 'Search',
    +	'anchor.name' : 'Anchor name',
    +	'formatblock.formatBlock' : {
    +		h1 : 'Heading 1',
    +		h2 : 'Heading 2',
    +		h3 : 'Heading 3',
    +		h4 : 'Heading 4',
    +		p : 'Normal'
    +	},
    +	'fontname.fontName' : {
    +		'Arial' : 'Arial',
    +		'Arial Black' : 'Arial Black',
    +		'Comic Sans MS' : 'Comic Sans MS',
    +		'Courier New' : 'Courier New',
    +		'Garamond' : 'Garamond',
    +		'Georgia' : 'Georgia',
    +		'Tahoma' : 'Tahoma',
    +		'Times New Roman' : 'Times New Roman',
    +		'Trebuchet MS' : 'Trebuchet MS',
    +		'Verdana' : 'Verdana'
    +	},
    +	'lineheight.lineHeight' : [
    +		{'1' : 'Line height 1'},
    +		{'1.5' : 'Line height 1.5'},
    +		{'2' : 'Line height 2'},
    +		{'2.5' : 'Line height 2.5'},
    +		{'3' : 'Line height 3'}
    +	],
    +	'template.selectTemplate' : 'Template',
    +	'template.replaceContent' : 'Replace current content',
    +	'template.fileList' : {
    +		'1.html' : 'Image and Text',
    +		'2.html' : 'Table',
    +		'3.html' : 'List'
    +	}
    +}, 'en');
    diff --git a/src/main/webapp/plug-in/kindeditor/lang/zh_CN.js b/src/main/webapp/plug-in/kindeditor/lang/zh_CN.js
    new file mode 100644
    index 00000000..63ddd879
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/lang/zh_CN.js
    @@ -0,0 +1,234 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.lang({
    +	source : 'HTML浠g爜',
    +	preview : '棰勮',
    +	undo : '鍚庨(Ctrl+Z)',
    +	redo : '鍓嶈繘(Ctrl+Y)',
    +	cut : '鍓垏(Ctrl+X)',
    +	copy : '澶嶅埗(Ctrl+C)',
    +	paste : '绮樿创(Ctrl+V)',
    +	plainpaste : '绮樿创涓烘棤鏍煎紡鏂囨湰',
    +	wordpaste : '浠嶹ord绮樿创',
    +	selectall : '鍏ㄩ(Ctrl+A)',
    +	justifyleft : '宸﹀榻',
    +	justifycenter : '灞呬腑',
    +	justifyright : '鍙冲榻',
    +	justifyfull : '涓ょ瀵归綈',
    +	insertorderedlist : '缂栧彿',
    +	insertunorderedlist : '椤圭洰绗﹀彿',
    +	indent : '澧炲姞缂╄繘',
    +	outdent : '鍑忓皯缂╄繘',
    +	subscript : '涓嬫爣',
    +	superscript : '涓婃爣',
    +	formatblock : '娈佃惤',
    +	fontname : '瀛椾綋',
    +	fontsize : '鏂囧瓧澶у皬',
    +	forecolor : '鏂囧瓧棰滆壊',
    +	hilitecolor : '鏂囧瓧鑳屾櫙',
    +	bold : '绮椾綋(Ctrl+B)',
    +	italic : '鏂滀綋(Ctrl+I)',
    +	underline : '涓嬪垝绾(Ctrl+U)',
    +	strikethrough : '鍒犻櫎绾',
    +	removeformat : '鍒犻櫎鏍煎紡',
    +	image : '鍥剧墖',
    +	multiimage : '鎵归噺鍥剧墖涓婁紶',
    +	flash : 'Flash',
    +	media : '瑙嗛煶棰',
    +	table : '琛ㄦ牸',
    +	tablecell : '鍗曞厓鏍',
    +	hr : '鎻掑叆妯嚎',
    +	emoticons : '鎻掑叆琛ㄦ儏',
    +	link : '瓒呯骇閾炬帴',
    +	unlink : '鍙栨秷瓒呯骇閾炬帴',
    +	fullscreen : '鍏ㄥ睆鏄剧ず(Esc)',
    +	about : '鍏充簬',
    +	print : '鎵撳嵃(Ctrl+P)',
    +	filemanager : '鏂囦欢绌洪棿',
    +	code : '鎻掑叆绋嬪簭浠g爜',
    +	map : 'Google鍦板浘',
    +	baidumap : '鐧惧害鍦板浘',
    +	lineheight : '琛岃窛',
    +	clearhtml : '娓呯悊HTML浠g爜',
    +	pagebreak : '鎻掑叆鍒嗛〉绗',
    +	quickformat : '涓閿帓鐗',
    +	insertfile : '鎻掑叆鏂囦欢',
    +	template : '鎻掑叆妯℃澘',
    +	anchor : '閿氱偣',
    +	yes : '纭畾',
    +	no : '鍙栨秷',
    +	close : '鍏抽棴',
    +	editImage : '鍥剧墖灞炴',
    +	deleteImage : '鍒犻櫎鍥剧墖',
    +	editFlash : 'Flash灞炴',
    +	deleteFlash : '鍒犻櫎Flash',
    +	editMedia : '瑙嗛煶棰戝睘鎬',
    +	deleteMedia : '鍒犻櫎瑙嗛煶棰',
    +	editLink : '瓒呯骇閾炬帴灞炴',
    +	deleteLink : '鍙栨秷瓒呯骇閾炬帴',
    +	editAnchor : '閿氱偣灞炴',
    +	deleteAnchor : '鍒犻櫎閿氱偣',
    +	tableprop : '琛ㄦ牸灞炴',
    +	tablecellprop : '鍗曞厓鏍煎睘鎬',
    +	tableinsert : '鎻掑叆琛ㄦ牸',
    +	tabledelete : '鍒犻櫎琛ㄦ牸',
    +	tablecolinsertleft : '宸︿晶鎻掑叆鍒',
    +	tablecolinsertright : '鍙充晶鎻掑叆鍒',
    +	tablerowinsertabove : '涓婃柟鎻掑叆琛',
    +	tablerowinsertbelow : '涓嬫柟鎻掑叆琛',
    +	tablerowmerge : '鍚戜笅鍚堝苟鍗曞厓鏍',
    +	tablecolmerge : '鍚戝彸鍚堝苟鍗曞厓鏍',
    +	tablerowsplit : '鎷嗗垎琛',
    +	tablecolsplit : '鎷嗗垎鍒',
    +	tablecoldelete : '鍒犻櫎鍒',
    +	tablerowdelete : '鍒犻櫎琛',
    +	noColor : '鏃犻鑹',
    +	pleaseSelectFile : '璇烽夋嫨鏂囦欢銆',
    +	invalidImg : "璇疯緭鍏ユ湁鏁堢殑URL鍦板潃銆俓n鍙厑璁竕pg,gif,bmp,png鏍煎紡銆",
    +	invalidMedia : "璇疯緭鍏ユ湁鏁堢殑URL鍦板潃銆俓n鍙厑璁竤wf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb鏍煎紡銆",
    +	invalidWidth : "瀹藉害蹇呴』涓烘暟瀛椼",
    +	invalidHeight : "楂樺害蹇呴』涓烘暟瀛椼",
    +	invalidBorder : "杈规蹇呴』涓烘暟瀛椼",
    +	invalidUrl : "璇疯緭鍏ユ湁鏁堢殑URL鍦板潃銆",
    +	invalidRows : '琛屾暟涓哄繀閫夐」锛屽彧鍏佽杈撳叆澶т簬0鐨勬暟瀛椼',
    +	invalidCols : '鍒楁暟涓哄繀閫夐」锛屽彧鍏佽杈撳叆澶т簬0鐨勬暟瀛椼',
    +	invalidPadding : '杈硅窛蹇呴』涓烘暟瀛椼',
    +	invalidSpacing : '闂磋窛蹇呴』涓烘暟瀛椼',
    +	invalidJson : '鏈嶅姟鍣ㄥ彂鐢熸晠闅溿',
    +	uploadSuccess : '涓婁紶鎴愬姛銆',
    +	cutError : '鎮ㄧ殑娴忚鍣ㄥ畨鍏ㄨ缃笉鍏佽浣跨敤鍓垏鎿嶄綔锛岃浣跨敤蹇嵎閿(Ctrl+X)鏉ュ畬鎴愩',
    +	copyError : '鎮ㄧ殑娴忚鍣ㄥ畨鍏ㄨ缃笉鍏佽浣跨敤澶嶅埗鎿嶄綔锛岃浣跨敤蹇嵎閿(Ctrl+C)鏉ュ畬鎴愩',
    +	pasteError : '鎮ㄧ殑娴忚鍣ㄥ畨鍏ㄨ缃笉鍏佽浣跨敤绮樿创鎿嶄綔锛岃浣跨敤蹇嵎閿(Ctrl+V)鏉ュ畬鎴愩',
    +	ajaxLoading : '鍔犺浇涓紝璇风◢鍊 ...',
    +	uploadLoading : '涓婁紶涓紝璇风◢鍊 ...',
    +	uploadError : '涓婁紶閿欒',
    +	'plainpaste.comment' : '璇蜂娇鐢ㄥ揩鎹烽敭(Ctrl+V)鎶婂唴瀹圭矘璐村埌涓嬮潰鐨勬柟妗嗛噷銆',
    +	'wordpaste.comment' : '璇蜂娇鐢ㄥ揩鎹烽敭(Ctrl+V)鎶婂唴瀹圭矘璐村埌涓嬮潰鐨勬柟妗嗛噷銆',
    +	'link.url' : 'URL',
    +	'link.linkType' : '鎵撳紑绫诲瀷',
    +	'link.newWindow' : '鏂扮獥鍙',
    +	'link.selfWindow' : '褰撳墠绐楀彛',
    +	'flash.url' : 'URL',
    +	'flash.width' : '瀹藉害',
    +	'flash.height' : '楂樺害',
    +	'flash.upload' : '涓婁紶',
    +	'flash.viewServer' : '鏂囦欢绌洪棿',
    +	'media.url' : 'URL',
    +	'media.width' : '瀹藉害',
    +	'media.height' : '楂樺害',
    +	'media.autostart' : '鑷姩鎾斁',
    +	'media.upload' : '涓婁紶',
    +	'media.viewServer' : '鏂囦欢绌洪棿',
    +	'image.remoteImage' : '缃戠粶鍥剧墖',
    +	'image.localImage' : '鏈湴涓婁紶',
    +	'image.remoteUrl' : '鍥剧墖鍦板潃',
    +	'image.localUrl' : '涓婁紶鏂囦欢',
    +	'image.size' : '鍥剧墖澶у皬',
    +	'image.width' : '瀹',
    +	'image.height' : '楂',
    +	'image.resetSize' : '閲嶇疆澶у皬',
    +	'image.align' : '瀵归綈鏂瑰紡',
    +	'image.defaultAlign' : '榛樿鏂瑰紡',
    +	'image.leftAlign' : '宸﹀榻',
    +	'image.rightAlign' : '鍙冲榻',
    +	'image.imgTitle' : '鍥剧墖璇存槑',
    +	'image.upload' : '娴忚...',
    +	'image.viewServer' : '鍥剧墖绌洪棿',
    +	'multiimage.uploadDesc' : '鍏佽鐢ㄦ埛鍚屾椂涓婁紶<%=uploadLimit%>寮犲浘鐗囷紝鍗曞紶鍥剧墖瀹归噺涓嶈秴杩<%=sizeLimit%>',
    +	'multiimage.startUpload' : '寮濮嬩笂浼',
    +	'multiimage.clearAll' : '鍏ㄩ儴娓呯┖',
    +	'multiimage.insertAll' : '鍏ㄩ儴鎻掑叆',
    +	'multiimage.queueLimitExceeded' : '鏂囦欢鏁伴噺瓒呰繃闄愬埗銆',
    +	'multiimage.fileExceedsSizeLimit' : '鏂囦欢澶у皬瓒呰繃闄愬埗銆',
    +	'multiimage.zeroByteFile' : '鏃犳硶涓婁紶绌烘枃浠躲',
    +	'multiimage.invalidFiletype' : '鏂囦欢绫诲瀷涓嶆纭',
    +	'multiimage.unknownError' : '鍙戠敓寮傚父锛屾棤娉曚笂浼犮',
    +	'multiimage.pending' : '绛夊緟涓婁紶',
    +	'multiimage.uploadError' : '涓婁紶澶辫触',
    +	'filemanager.emptyFolder' : '绌烘枃浠跺す',
    +	'filemanager.moveup' : '绉诲埌涓婁竴绾ф枃浠跺す',
    +	'filemanager.viewType' : '鏄剧ず鏂瑰紡锛',
    +	'filemanager.viewImage' : '缂╃暐鍥',
    +	'filemanager.listImage' : '璇︾粏淇℃伅',
    +	'filemanager.orderType' : '鎺掑簭鏂瑰紡锛',
    +	'filemanager.fileName' : '鍚嶇О',
    +	'filemanager.fileSize' : '澶у皬',
    +	'filemanager.fileType' : '绫诲瀷',
    +	'insertfile.url' : 'URL',
    +	'insertfile.title' : '鏂囦欢璇存槑',
    +	'insertfile.upload' : '涓婁紶',
    +	'insertfile.viewServer' : '鏂囦欢绌洪棿',
    +	'table.cells' : '鍗曞厓鏍兼暟',
    +	'table.rows' : '琛屾暟',
    +	'table.cols' : '鍒楁暟',
    +	'table.size' : '澶у皬',
    +	'table.width' : '瀹藉害',
    +	'table.height' : '楂樺害',
    +	'table.percent' : '%',
    +	'table.px' : 'px',
    +	'table.space' : '杈硅窛闂磋窛',
    +	'table.padding' : '杈硅窛',
    +	'table.spacing' : '闂磋窛',
    +	'table.align' : '瀵归綈鏂瑰紡',
    +	'table.textAlign' : '姘村钩瀵归綈',
    +	'table.verticalAlign' : '鍨傜洿瀵归綈',
    +	'table.alignDefault' : '榛樿',
    +	'table.alignLeft' : '宸﹀榻',
    +	'table.alignCenter' : '灞呬腑',
    +	'table.alignRight' : '鍙冲榻',
    +	'table.alignTop' : '椤堕儴',
    +	'table.alignMiddle' : '涓儴',
    +	'table.alignBottom' : '搴曢儴',
    +	'table.alignBaseline' : '鍩虹嚎',
    +	'table.border' : '杈规',
    +	'table.borderWidth' : '杈规',
    +	'table.borderColor' : '棰滆壊',
    +	'table.backgroundColor' : '鑳屾櫙棰滆壊',
    +	'map.address' : '鍦板潃: ',
    +	'map.search' : '鎼滅储',
    +	'baidumap.address' : '鍦板潃: ',
    +	'baidumap.search' : '鎼滅储',
    +	'anchor.name' : '閿氱偣鍚嶇О',
    +	'formatblock.formatBlock' : {
    +		h1 : '鏍囬 1',
    +		h2 : '鏍囬 2',
    +		h3 : '鏍囬 3',
    +		h4 : '鏍囬 4',
    +		p : '姝 鏂'
    +	},
    +	'fontname.fontName' : {
    +		'SimSun' : '瀹嬩綋',
    +		'NSimSun' : '鏂板畫浣',
    +		'FangSong_GB2312' : '浠垮畫_GB2312',
    +		'KaiTi_GB2312' : '妤蜂綋_GB2312',
    +		'SimHei' : '榛戜綋',
    +		'Microsoft YaHei' : '寰蒋闆呴粦',
    +		'Arial' : 'Arial',
    +		'Arial Black' : 'Arial Black',
    +		'Times New Roman' : 'Times New Roman',
    +		'Courier New' : 'Courier New',
    +		'Tahoma' : 'Tahoma',
    +		'Verdana' : 'Verdana'
    +	},
    +	'lineheight.lineHeight' : [
    +		{'1' : '鍗曞嶈璺'},
    +		{'1.5' : '1.5鍊嶈璺'},
    +		{'2' : '2鍊嶈璺'},
    +		{'2.5' : '2.5鍊嶈璺'},
    +		{'3' : '3鍊嶈璺'}
    +	],
    +	'template.selectTemplate' : '鍙夋ā鏉',
    +	'template.replaceContent' : '鏇挎崲褰撳墠鍐呭',
    +	'template.fileList' : {
    +		'1.html' : '鍥剧墖鍜屾枃瀛',
    +		'2.html' : '琛ㄦ牸',
    +		'3.html' : '椤圭洰缂栧彿'
    +	}
    +}, 'zh_CN');
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/anchor/anchor.js b/src/main/webapp/plug-in/kindeditor/plugins/anchor/anchor.js
    new file mode 100644
    index 00000000..55ab8946
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/anchor/anchor.js
    @@ -0,0 +1,46 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('anchor', function(K) {
    +	var self = this, name = 'anchor', lang = self.lang(name + '.');
    +	self.plugin.anchor = {
    +		edit : function() {
    +			var html = ['<div style="padding:20px;">',
    +					'<div class="ke-dialog-row">',
    +					'<label for="keName">' + lang.name + '</label>',
    +					'<input class="ke-input-text" type="text" id="keName" name="name" value="" style="width:100px;" />',
    +					'</div>',
    +					'</div>'].join('');
    +			var dialog = self.createDialog({
    +				name : name,
    +				width : 300,
    +				title : self.lang(name),
    +				body : html,
    +				yesBtn : {
    +					name : self.lang('yes'),
    +					click : function(e) {
    +						self.insertHtml('<a name="' + nameBox.val() + '">').hideDialog().focus();
    +					}
    +				}
    +			});
    +			var div = dialog.div,
    +				nameBox = K('input[name="name"]', div);
    +			var img = self.plugin.getSelectedAnchor();
    +			if (img) {
    +				nameBox.val(unescape(img.attr('data-ke-name')));
    +			}
    +			nameBox[0].focus();
    +			nameBox[0].select();
    +		},
    +		'delete' : function() {
    +			self.plugin.getSelectedAnchor().remove();
    +		}
    +	};
    +	self.clickToolbar(name, self.plugin.anchor.edit);
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/baidumap/baidumap.js b/src/main/webapp/plug-in/kindeditor/plugins/baidumap/baidumap.js
    new file mode 100644
    index 00000000..4b164c37
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/baidumap/baidumap.js
    @@ -0,0 +1,77 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +// Baidu Maps: http://dev.baidu.com/wiki/map/index.php?title=%E9%A6%96%E9%A1%B5
    +
    +KindEditor.plugin('baidumap', function(K) {
    +	var self = this, name = 'baidumap', lang = self.lang(name + '.');
    +	self.clickToolbar(name, function() {
    +		var html = ['<div style="padding:10px 20px;">',
    +			'<div class="ke-dialog-row">',
    +			lang.address + ' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
    +			'<span class="ke-button-common ke-button-outer">',
    +			'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" />',
    +			'</span>',
    +			'</div>',
    +			'<div class="ke-map" style="width:558px;height:360px;"></div>',
    +			'</div>'].join('');
    +		var dialog = self.createDialog({
    +			name : name,
    +			width : 600,
    +			title : self.lang(name),
    +			body : html,
    +			yesBtn : {
    +				name : self.lang('yes'),
    +				click : function(e) {
    +					var map = win.map;
    +					var centerObj = map.getCenter();
    +					var center = centerObj.lng + ',' + centerObj.lat;
    +					var zoom = map.getZoom();
    +					var url = ['http://api.map.baidu.com/staticimage',
    +						'?center=' + encodeURIComponent(center),
    +						'&zoom=' + encodeURIComponent(zoom),
    +						'&width=558',
    +						'&height=360',
    +						'&markers=' + encodeURIComponent(center),
    +						'&markerStyles=' + encodeURIComponent('l,A')].join('');
    +					self.exec('insertimage', url).hideDialog().focus();
    +				}
    +			},
    +			beforeRemove : function() {
    +				searchBtn.remove();
    +				if (doc) {
    +					doc.write('');
    +				}
    +				iframe.remove();
    +			}
    +		});
    +		var div = dialog.div,
    +			addressBox = K('[name="address"]', div),
    +			searchBtn = K('[name="searchBtn"]', div),
    +			win, doc;
    +		var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'baidumap/map.html" style="width:558px;height:360px;"></iframe>');
    +		function ready() {
    +			win = iframe[0].contentWindow;
    +			doc = K.iframeDoc(iframe);
    +		}
    +		iframe.bind('load', function() {
    +			iframe.unbind('load');
    +			if (K.IE) {
    +				ready();
    +			} else {
    +				setTimeout(ready, 0);
    +			}
    +		});
    +		K('.ke-map', div).replaceWith(iframe);
    +		// search map
    +		searchBtn.click(function() {
    +			win.search(addressBox.val());
    +		});
    +	});
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/baidumap/map.html b/src/main/webapp/plug-in/kindeditor/plugins/baidumap/map.html
    new file mode 100644
    index 00000000..b65ea1d6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/baidumap/map.html
    @@ -0,0 +1,43 @@
    +<!doctype html>
    +<html>
    +	<head>
    +		<meta charset="utf-8" />
    +		<title>Baidu Maps</title>
    +		<style>
    +			html { height: 100% }
    +			body { height: 100%; margin: 0; padding: 0; background-color: #FFF }
    +		</style>
    +		<script charset="utf-8" src="http://api.map.baidu.com/api?v=1.3"></script>
    +		<script>
    +			var map, geocoder;
    +			function initialize() {
    +				map = new BMap.Map('map_canvas');
    +				var point = new BMap.Point(121.473704, 31.230393);
    +				map.centerAndZoom(point, 11);
    +				map.addControl(new BMap.NavigationControl());
    +				map.enableScrollWheelZoom();
    +
    +				var gc = new BMap.Geocoder();
    +				gc.getLocation(point, function(rs){
    +					var addComp = rs.addressComponents;
    +					var address = [addComp.city].join('');
    +					parent.document.getElementById("kindeditor_plugin_map_address").value = address;
    +				});
    +			}
    +			function search(address) {
    +				if (!map) return;
    +				var local = new BMap.LocalSearch(map, {
    +					renderOptions: {
    +						map: map,
    +						autoViewport: true,
    +						selectFirstResult: false
    +					}
    +				});
    +				local.search(address);
    +			}
    +		</script>
    +	</head>
    +	<body onload="initialize();">
    +		<div id="map_canvas" style="width:100%; height:100%"></div>
    +	</body>
    +</html>
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/clearhtml/clearhtml.js b/src/main/webapp/plug-in/kindeditor/plugins/clearhtml/clearhtml.js
    new file mode 100644
    index 00000000..1bf0e5dc
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/clearhtml/clearhtml.js
    @@ -0,0 +1,29 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('clearhtml', function(K) {
    +	var self = this, name = 'clearhtml';
    +	self.clickToolbar(name, function() {
    +		self.focus();
    +		var html = self.html();
    +		html = html.replace(/(<script[^>]*>)([\s\S]*?)(<\/script>)/ig, '');
    +		html = html.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/ig, '');
    +		html = K.formatHtml(html, {
    +			a : ['href', 'target'],
    +			embed : ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess'],
    +			img : ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height'],
    +			table : ['border'],
    +			'td,th' : ['rowspan', 'colspan'],
    +			'div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : []
    +		});
    +		self.html(html);
    +		self.cmd.selection(true);
    +		self.addBookmark();
    +	});
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/code/code.js b/src/main/webapp/plug-in/kindeditor/plugins/code/code.js
    new file mode 100644
    index 00000000..a083cc2c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/code/code.js
    @@ -0,0 +1,57 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +// google code prettify: http://google-code-prettify.googlecode.com/
    +// http://google-code-prettify.googlecode.com/
    +
    +KindEditor.plugin('code', function(K) {
    +	var self = this, name = 'code';
    +	self.clickToolbar(name, function() {
    +		var lang = self.lang(name + '.'),
    +			html = ['<div style="padding:10px 20px;">',
    +				'<div class="ke-dialog-row">',
    +				'<select class="ke-code-type">',
    +				'<option value="js">JavaScript</option>',
    +				'<option value="html">HTML</option>',
    +				'<option value="css">CSS</option>',
    +				'<option value="php">PHP</option>',
    +				'<option value="pl">Perl</option>',
    +				'<option value="py">Python</option>',
    +				'<option value="rb">Ruby</option>',
    +				'<option value="java">Java</option>',
    +				'<option value="vb">ASP/VB</option>',
    +				'<option value="cpp">C/C++</option>',
    +				'<option value="cs">C#</option>',
    +				'<option value="xml">XML</option>',
    +				'<option value="bsh">Shell</option>',
    +				'<option value="">Other</option>',
    +				'</select>',
    +				'</div>',
    +				'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>',
    +				'</div>'].join(''),
    +			dialog = self.createDialog({
    +				name : name,
    +				width : 450,
    +				title : self.lang(name),
    +				body : html,
    +				yesBtn : {
    +					name : self.lang('yes'),
    +					click : function(e) {
    +						var type = K('.ke-code-type', dialog.div).val(),
    +							code = textarea.val(),
    +							cls = type === '' ? '' :  ' lang-' + type,
    +							html = '<pre class="prettyprint' + cls + '">\n' + K.escape(code) + '</pre> ';
    +						self.insertHtml(html).hideDialog().focus();
    +					}
    +				}
    +			}),
    +			textarea = K('textarea', dialog.div);
    +		textarea[0].focus();
    +	});
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/code/prettify.css b/src/main/webapp/plug-in/kindeditor/plugins/code/prettify.css
    new file mode 100644
    index 00000000..b8287e5f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/code/prettify.css
    @@ -0,0 +1,13 @@
    +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
    +
    +pre.prettyprint {
    +	border: 0;
    +	border-left: 3px solid rgb(204, 204, 204);
    +	margin-left: 2em;
    +	padding: 0.5em;
    +	font-size: 110%;
    +	display: block;
    +	font-family: "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
    +	margin: 1em 0px;
    +	white-space: pre;
    +}
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/code/prettify.js b/src/main/webapp/plug-in/kindeditor/plugins/code/prettify.js
    new file mode 100644
    index 00000000..eef5ad7e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/code/prettify.js
    @@ -0,0 +1,28 @@
    +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
    +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
    +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
    +f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
    +(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
    +{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
    +t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
    +"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
    +l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
    +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
    +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
    +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
    +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
    +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
    +m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
    +a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
    +j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
    +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
    +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
    +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
    +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
    +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
    +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
    +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
    +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
    +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
    +250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
    +PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/emoticons.js b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/emoticons.js
    new file mode 100644
    index 00000000..794679db
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/emoticons.js
    @@ -0,0 +1,129 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('emoticons', function(K) {
    +	var self = this, name = 'emoticons',
    +		path = (self.emoticonsPath || self.pluginsPath + 'emoticons/images/'),
    +		allowPreview = self.allowPreviewEmoticons === undefined ? true : self.allowPreviewEmoticons,
    +		currentPageNum = 1;
    +	self.clickToolbar(name, function() {
    +		var rows = 5, cols = 9, total = 135, startNum = 0,
    +			cells = rows * cols, pages = Math.ceil(total / cells),
    +			colsHalf = Math.floor(cols / 2),
    +			wrapperDiv = K('<div class="ke-plugin-emoticons"></div>'),
    +			elements = [],
    +			menu = self.createMenu({
    +				name : name,
    +				beforeRemove : function() {
    +					removeEvent();
    +				}
    +			});
    +		menu.div.append(wrapperDiv);
    +		var previewDiv, previewImg;
    +		if (allowPreview) {
    +			previewDiv = K('<div class="ke-preview"></div>').css('right', 0);
    +			previewImg = K('<img class="ke-preview-img" src="' + path + startNum + '.gif" />');
    +			wrapperDiv.append(previewDiv);
    +			previewDiv.append(previewImg);
    +		}
    +		function bindCellEvent(cell, j, num) {
    +			if (previewDiv) {
    +				cell.mouseover(function() {
    +					if (j > colsHalf) {
    +						previewDiv.css('left', 0);
    +						previewDiv.css('right', '');
    +					} else {
    +						previewDiv.css('left', '');
    +						previewDiv.css('right', 0);
    +					}
    +					previewImg.attr('src', path + num + '.gif');
    +					K(this).addClass('ke-on');
    +				});
    +			} else {
    +				cell.mouseover(function() {
    +					K(this).addClass('ke-on');
    +				});
    +			}
    +			cell.mouseout(function() {
    +				K(this).removeClass('ke-on');
    +			});
    +			cell.click(function(e) {
    +				self.insertHtml('<img src="' + path + num + '.gif" border="0" alt="" />').hideMenu().focus();
    +				e.stop();
    +			});
    +		}
    +		function createEmoticonsTable(pageNum, parentDiv) {
    +			var table = document.createElement('table');
    +			parentDiv.append(table);
    +			if (previewDiv) {
    +				K(table).mouseover(function() {
    +					previewDiv.show();
    +				});
    +				K(table).mouseout(function() {
    +					previewDiv.hide();
    +				});
    +				elements.push(K(table));
    +			}
    +			table.className = 'ke-table';
    +			table.cellPadding = 0;
    +			table.cellSpacing = 0;
    +			table.border = 0;
    +			var num = (pageNum - 1) * cells + startNum;
    +			for (var i = 0; i < rows; i++) {
    +				var row = table.insertRow(i);
    +				for (var j = 0; j < cols; j++) {
    +					var cell = K(row.insertCell(j));
    +					cell.addClass('ke-cell');
    +					bindCellEvent(cell, j, num);
    +					var span = K('<span class="ke-img"></span>')
    +						.css('background-position', '-' + (24 * num) + 'px 0px')
    +						.css('background-image', 'url(' + path + 'static.gif)');
    +					cell.append(span);
    +					elements.push(cell);
    +					num++;
    +				}
    +			}
    +			return table;
    +		}
    +		var table = createEmoticonsTable(currentPageNum, wrapperDiv);
    +		function removeEvent() {
    +			K.each(elements, function() {
    +				this.unbind();
    +			});
    +		}
    +		var pageDiv;
    +		function bindPageEvent(el, pageNum) {
    +			el.click(function(e) {
    +				removeEvent();
    +				table.parentNode.removeChild(table);
    +				pageDiv.remove();
    +				table = createEmoticonsTable(pageNum, wrapperDiv);
    +				createPageTable(pageNum);
    +				currentPageNum = pageNum;
    +				e.stop();
    +			});
    +		}
    +		function createPageTable(currentPageNum) {
    +			pageDiv = K('<div class="ke-page"></div>');
    +			wrapperDiv.append(pageDiv);
    +			for (var pageNum = 1; pageNum <= pages; pageNum++) {
    +				if (currentPageNum !== pageNum) {
    +					var a = K('<a href="javascript:;">[' + pageNum + ']</a>');
    +					bindPageEvent(a, pageNum);
    +					pageDiv.append(a);
    +					elements.push(a);
    +				} else {
    +					pageDiv.append(K('@[' + pageNum + ']'));
    +				}
    +				pageDiv.append(K('@&nbsp;'));
    +			}
    +		}
    +		createPageTable(currentPageNum);
    +	});
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/0.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/0.gif
    new file mode 100644
    index 00000000..5be27cb0
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/0.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/1.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/1.gif
    new file mode 100644
    index 00000000..a2644a9e
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/1.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/10.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/10.gif
    new file mode 100644
    index 00000000..905c15be
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/10.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/100.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/100.gif
    new file mode 100644
    index 00000000..92ad35d2
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/100.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/101.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/101.gif
    new file mode 100644
    index 00000000..1f27663a
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/101.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/102.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/102.gif
    new file mode 100644
    index 00000000..748ded1a
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/102.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/103.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/103.gif
    new file mode 100644
    index 00000000..be9eaa05
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/103.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/104.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/104.gif
    new file mode 100644
    index 00000000..d7c20663
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/104.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/105.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/105.gif
    new file mode 100644
    index 00000000..2f353cad
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/105.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/106.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/106.gif
    new file mode 100644
    index 00000000..51935349
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/106.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/107.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/107.gif
    new file mode 100644
    index 00000000..70d38d3b
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/107.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/108.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/108.gif
    new file mode 100644
    index 00000000..749d5008
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/108.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/109.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/109.gif
    new file mode 100644
    index 00000000..6f57d564
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/109.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/11.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/11.gif
    new file mode 100644
    index 00000000..b512dd5d
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/11.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/110.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/110.gif
    new file mode 100644
    index 00000000..e253abcf
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/110.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/111.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/111.gif
    new file mode 100644
    index 00000000..0c567233
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/111.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/112.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/112.gif
    new file mode 100644
    index 00000000..c8ddce88
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/112.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/113.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/113.gif
    new file mode 100644
    index 00000000..27271045
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/113.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/114.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/114.gif
    new file mode 100644
    index 00000000..53918e2a
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/114.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/115.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/115.gif
    new file mode 100644
    index 00000000..4db33697
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/115.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/116.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/116.gif
    new file mode 100644
    index 00000000..57326bd2
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/116.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/117.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/117.gif
    new file mode 100644
    index 00000000..14611b6e
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/117.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/118.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/118.gif
    new file mode 100644
    index 00000000..8c255004
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/118.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/119.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/119.gif
    new file mode 100644
    index 00000000..65bb468b
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/119.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/12.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/12.gif
    new file mode 100644
    index 00000000..547529ca
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/12.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/120.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/120.gif
    new file mode 100644
    index 00000000..5ce77c05
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/120.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/121.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/121.gif
    new file mode 100644
    index 00000000..a021abaa
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/121.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/122.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/122.gif
    new file mode 100644
    index 00000000..9a79e111
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/122.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/123.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/123.gif
    new file mode 100644
    index 00000000..b9480be2
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/123.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/124.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/124.gif
    new file mode 100644
    index 00000000..7fed4772
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/124.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/125.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/125.gif
    new file mode 100644
    index 00000000..e2c3c11c
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/125.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/126.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/126.gif
    new file mode 100644
    index 00000000..24105c98
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/126.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/127.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/127.gif
    new file mode 100644
    index 00000000..0cead364
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/127.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/128.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/128.gif
    new file mode 100644
    index 00000000..31858618
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/128.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/129.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/129.gif
    new file mode 100644
    index 00000000..ffd7c6ba
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/129.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/13.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/13.gif
    new file mode 100644
    index 00000000..34753001
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/13.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/130.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/130.gif
    new file mode 100644
    index 00000000..d828e3da
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/130.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/131.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/131.gif
    new file mode 100644
    index 00000000..dcb096f0
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/131.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/132.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/132.gif
    new file mode 100644
    index 00000000..1b272a69
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/132.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/133.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/133.gif
    new file mode 100644
    index 00000000..0d0e8642
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/133.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/134.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/134.gif
    new file mode 100644
    index 00000000..cf48356e
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/134.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/14.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/14.gif
    new file mode 100644
    index 00000000..6a788f8b
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/14.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/15.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/15.gif
    new file mode 100644
    index 00000000..debab8ed
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/15.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/16.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/16.gif
    new file mode 100644
    index 00000000..ed5d29f4
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/16.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/17.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/17.gif
    new file mode 100644
    index 00000000..85886fef
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/17.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/18.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/18.gif
    new file mode 100644
    index 00000000..b6af2189
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/18.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/19.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/19.gif
    new file mode 100644
    index 00000000..e045ff2a
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/19.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/2.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/2.gif
    new file mode 100644
    index 00000000..40cfda43
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/2.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/20.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/20.gif
    new file mode 100644
    index 00000000..efd650f5
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/20.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/21.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/21.gif
    new file mode 100644
    index 00000000..cb8cf6d2
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/21.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/22.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/22.gif
    new file mode 100644
    index 00000000..96b04df8
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/22.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/23.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/23.gif
    new file mode 100644
    index 00000000..96516b8d
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/23.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/24.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/24.gif
    new file mode 100644
    index 00000000..5f925c7b
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/24.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/25.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/25.gif
    new file mode 100644
    index 00000000..97f8b1af
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/25.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/26.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/26.gif
    new file mode 100644
    index 00000000..a7cded73
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/26.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/27.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/27.gif
    new file mode 100644
    index 00000000..bb468901
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/27.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/28.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/28.gif
    new file mode 100644
    index 00000000..f59dd582
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/28.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/29.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/29.gif
    new file mode 100644
    index 00000000..3c5227e8
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/29.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/3.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/3.gif
    new file mode 100644
    index 00000000..6d6f7629
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/3.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/30.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/30.gif
    new file mode 100644
    index 00000000..e24a1801
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/30.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/31.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/31.gif
    new file mode 100644
    index 00000000..073e743c
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/31.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/32.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/32.gif
    new file mode 100644
    index 00000000..772eff23
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/32.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/33.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/33.gif
    new file mode 100644
    index 00000000..217c1c58
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/33.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/34.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/34.gif
    new file mode 100644
    index 00000000..e9d42131
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/34.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/35.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/35.gif
    new file mode 100644
    index 00000000..d6da2c33
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/35.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/36.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/36.gif
    new file mode 100644
    index 00000000..c1e6ac91
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/36.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/37.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/37.gif
    new file mode 100644
    index 00000000..92efec6a
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/37.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/38.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/38.gif
    new file mode 100644
    index 00000000..489f0f94
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/38.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/39.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/39.gif
    new file mode 100644
    index 00000000..734f6d82
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/39.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/4.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/4.gif
    new file mode 100644
    index 00000000..6ccdaa2c
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/4.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/40.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/40.gif
    new file mode 100644
    index 00000000..24a8eb69
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/40.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/41.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/41.gif
    new file mode 100644
    index 00000000..99139e1d
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/41.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/42.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/42.gif
    new file mode 100644
    index 00000000..f60897e4
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/42.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/43.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/43.gif
    new file mode 100644
    index 00000000..43504910
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/43.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/44.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/44.gif
    new file mode 100644
    index 00000000..650d3dd8
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/44.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/45.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/45.gif
    new file mode 100644
    index 00000000..5c8e0718
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/45.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/46.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/46.gif
    new file mode 100644
    index 00000000..f3cb0742
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/46.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/47.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/47.gif
    new file mode 100644
    index 00000000..5b3057ab
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/47.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/48.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/48.gif
    new file mode 100644
    index 00000000..27a30c15
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/48.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/49.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/49.gif
    new file mode 100644
    index 00000000..dcfa48af
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/49.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/5.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/5.gif
    new file mode 100644
    index 00000000..ab0b81ba
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/5.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/50.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/50.gif
    new file mode 100644
    index 00000000..029cf0fe
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/50.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/51.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/51.gif
    new file mode 100644
    index 00000000..69f183f0
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/51.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/52.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/52.gif
    new file mode 100644
    index 00000000..d41e8aab
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/52.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/53.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/53.gif
    new file mode 100644
    index 00000000..56352dde
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/53.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/54.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/54.gif
    new file mode 100644
    index 00000000..b28d8481
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/54.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/55.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/55.gif
    new file mode 100644
    index 00000000..e18da84c
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/55.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/56.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/56.gif
    new file mode 100644
    index 00000000..edf96f0a
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/56.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/57.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/57.gif
    new file mode 100644
    index 00000000..3f0e2b9a
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/57.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/58.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/58.gif
    new file mode 100644
    index 00000000..47b1aaa3
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/58.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/59.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/59.gif
    new file mode 100644
    index 00000000..918288b0
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/59.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/6.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/6.gif
    new file mode 100644
    index 00000000..ceab1224
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/6.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/60.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/60.gif
    new file mode 100644
    index 00000000..66d21136
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/60.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/61.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/61.gif
    new file mode 100644
    index 00000000..034933ec
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/61.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/62.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/62.gif
    new file mode 100644
    index 00000000..8d5c4fd3
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/62.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/63.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/63.gif
    new file mode 100644
    index 00000000..d58fcf67
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/63.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/64.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/64.gif
    new file mode 100644
    index 00000000..c4e00bdf
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/64.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/65.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/65.gif
    new file mode 100644
    index 00000000..da23bfaa
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/65.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/66.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/66.gif
    new file mode 100644
    index 00000000..310ec65f
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/66.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/67.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/67.gif
    new file mode 100644
    index 00000000..51761ba4
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/67.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/68.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/68.gif
    new file mode 100644
    index 00000000..345cb439
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/68.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/69.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/69.gif
    new file mode 100644
    index 00000000..e0f28a07
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/69.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/7.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/7.gif
    new file mode 100644
    index 00000000..2f453999
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/7.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/70.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/70.gif
    new file mode 100644
    index 00000000..24284cf3
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/70.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/71.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/71.gif
    new file mode 100644
    index 00000000..a0ccf2ed
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/71.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/72.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/72.gif
    new file mode 100644
    index 00000000..7e113eea
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/72.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/73.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/73.gif
    new file mode 100644
    index 00000000..c0293c3a
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/73.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/74.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/74.gif
    new file mode 100644
    index 00000000..1c52bde9
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/74.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/75.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/75.gif
    new file mode 100644
    index 00000000..9cb9aa79
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/75.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/76.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/76.gif
    new file mode 100644
    index 00000000..27019f8f
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/76.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/77.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/77.gif
    new file mode 100644
    index 00000000..8f882f53
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/77.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/78.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/78.gif
    new file mode 100644
    index 00000000..d0d08560
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/78.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/79.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/79.gif
    new file mode 100644
    index 00000000..61652a71
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/79.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/8.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/8.gif
    new file mode 100644
    index 00000000..f6c88344
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/8.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/80.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/80.gif
    new file mode 100644
    index 00000000..9a779364
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/80.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/81.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/81.gif
    new file mode 100644
    index 00000000..2329101a
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/81.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/82.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/82.gif
    new file mode 100644
    index 00000000..644748a9
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/82.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/83.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/83.gif
    new file mode 100644
    index 00000000..fbf275ba
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/83.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/84.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/84.gif
    new file mode 100644
    index 00000000..076f0c65
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/84.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/85.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/85.gif
    new file mode 100644
    index 00000000..d254af44
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/85.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/86.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/86.gif
    new file mode 100644
    index 00000000..8f09d336
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/86.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/87.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/87.gif
    new file mode 100644
    index 00000000..df70756f
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/87.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/88.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/88.gif
    new file mode 100644
    index 00000000..4d8b15e7
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/88.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/89.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/89.gif
    new file mode 100644
    index 00000000..05726dc4
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/89.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/9.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/9.gif
    new file mode 100644
    index 00000000..c2d84507
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/9.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/90.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/90.gif
    new file mode 100644
    index 00000000..adaf20e8
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/90.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/91.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/91.gif
    new file mode 100644
    index 00000000..608d0ad8
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/91.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/92.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/92.gif
    new file mode 100644
    index 00000000..b909e16a
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/92.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/93.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/93.gif
    new file mode 100644
    index 00000000..7f71a8c9
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/93.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/94.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/94.gif
    new file mode 100644
    index 00000000..4f26d7d7
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/94.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/95.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/95.gif
    new file mode 100644
    index 00000000..5ef6d382
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/95.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/96.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/96.gif
    new file mode 100644
    index 00000000..2b709e15
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/96.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/97.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/97.gif
    new file mode 100644
    index 00000000..cf29be87
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/97.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/98.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/98.gif
    new file mode 100644
    index 00000000..c70e7d33
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/98.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/99.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/99.gif
    new file mode 100644
    index 00000000..05c18635
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/99.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/static.gif b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/static.gif
    new file mode 100644
    index 00000000..b8c444b5
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/emoticons/images/static.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/filemanager/filemanager.js b/src/main/webapp/plug-in/kindeditor/plugins/filemanager/filemanager.js
    new file mode 100644
    index 00000000..fd899af5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/filemanager/filemanager.js
    @@ -0,0 +1,189 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('filemanager', function(K) {
    +	var self = this, name = 'filemanager',
    +		fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php'),
    +		imgPath = self.pluginsPath + name + '/images/',
    +		lang = self.lang(name + '.');
    +	function makeFileTitle(filename, filesize, datetime) {
    +		return filename + ' (' + Math.ceil(filesize / 1024) + 'KB, ' + datetime + ')';
    +	}
    +	function bindTitle(el, data) {
    +		if (data.is_dir) {
    +			el.attr('title', data.filename);
    +		} else {
    +			el.attr('title', makeFileTitle(data.filename, data.filesize, data.datetime));
    +		}
    +	}
    +	self.plugin.filemanagerDialog = function(options) {
    +		var width = K.undef(options.width, 650),
    +			height = K.undef(options.height, 510),
    +			dirName = K.undef(options.dirName, ''),
    +			viewType = K.undef(options.viewType, 'VIEW').toUpperCase(), // "LIST" or "VIEW"
    +			clickFn = options.clickFn;
    +		var html = [
    +			'<div style="padding:10px 20px;">',
    +			// header start
    +			'<div class="ke-plugin-filemanager-header">',
    +			// left start
    +			'<div class="ke-left">',
    +			'<img class="ke-inline-block" name="moveupImg" src="' + imgPath + 'go-up.gif" width="16" height="16" border="0" alt="" /> ',
    +			'<a class="ke-inline-block" name="moveupLink" href="javascript:;">' + lang.moveup + '</a>',
    +			'</div>',
    +			// right start
    +			'<div class="ke-right">',
    +			lang.viewType + ' <select class="ke-inline-block" name="viewType">',
    +			'<option value="VIEW">' + lang.viewImage + '</option>',
    +			'<option value="LIST">' + lang.listImage + '</option>',
    +			'</select> ',
    +			lang.orderType + ' <select class="ke-inline-block" name="orderType">',
    +			'<option value="NAME">' + lang.fileName + '</option>',
    +			'<option value="SIZE">' + lang.fileSize + '</option>',
    +			'<option value="TYPE">' + lang.fileType + '</option>',
    +			'</select>',
    +			'</div>',
    +			'<div class="ke-clearfix"></div>',
    +			'</div>',
    +			// body start
    +			'<div class="ke-plugin-filemanager-body"></div>',
    +			'</div>'
    +		].join('');
    +		var dialog = self.createDialog({
    +			name : name,
    +			width : width,
    +			height : height,
    +			title : self.lang(name),
    +			body : html
    +		}),
    +		div = dialog.div,
    +		bodyDiv = K('.ke-plugin-filemanager-body', div),
    +		moveupImg = K('[name="moveupImg"]', div),
    +		moveupLink = K('[name="moveupLink"]', div),
    +		viewServerBtn = K('[name="viewServer"]', div),
    +		viewTypeBox = K('[name="viewType"]', div),
    +		orderTypeBox = K('[name="orderType"]', div);
    +		function reloadPage(path, order, func) {
    +			var param = 'path=' + path + '&order=' + order + '&dir=' + dirName;
    +			dialog.showLoading(self.lang('ajaxLoading'));
    +			K.ajax(K.addParam(fileManagerJson, param + '&' + new Date().getTime()), function(data) {
    +				dialog.hideLoading();
    +				func(data);
    +			});
    +		}
    +		var elList = [];
    +		function bindEvent(el, result, data, createFunc) {
    +			var fileUrl = K.formatUrl(result.current_url + data.filename, 'absolute'),
    +				dirPath = encodeURIComponent(result.current_dir_path + data.filename + '/');
    +			if (data.is_dir) {
    +				el.click(function(e) {
    +					reloadPage(dirPath, orderTypeBox.val(), createFunc);
    +				});
    +			} else if (data.is_photo) {
    +				el.click(function(e) {
    +					clickFn.call(this, fileUrl, data.filename);
    +				});
    +			} else {
    +				el.click(function(e) {
    +					clickFn.call(this, fileUrl, data.filename);
    +				});
    +			}
    +			elList.push(el);
    +		}
    +		function createCommon(result, createFunc) {
    +			// remove events
    +			K.each(elList, function() {
    +				this.unbind();
    +			});
    +			moveupLink.unbind();
    +			viewTypeBox.unbind();
    +			orderTypeBox.unbind();
    +			// add events
    +			if (result.current_dir_path) {
    +				moveupLink.click(function(e) {
    +					reloadPage(result.moveup_dir_path, orderTypeBox.val(), createFunc);
    +				});
    +			}
    +			function changeFunc() {
    +				if (viewTypeBox.val() == 'VIEW') {
    +					reloadPage(result.current_dir_path, orderTypeBox.val(), createView);
    +				} else {
    +					reloadPage(result.current_dir_path, orderTypeBox.val(), createList);
    +				}
    +			}
    +			viewTypeBox.change(changeFunc);
    +			orderTypeBox.change(changeFunc);
    +			bodyDiv.html('');
    +		}
    +		function createList(result) {
    +			createCommon(result, createList);
    +			var table = document.createElement('table');
    +			table.className = 'ke-table';
    +			table.cellPadding = 0;
    +			table.cellSpacing = 0;
    +			table.border = 0;
    +			bodyDiv.append(table);
    +			var fileList = result.file_list;
    +			for (var i = 0, len = fileList.length; i < len; i++) {
    +				var data = fileList[i], row = K(table.insertRow(i));
    +				row.mouseover(function(e) {
    +					K(this).addClass('ke-on');
    +				})
    +				.mouseout(function(e) {
    +					K(this).removeClass('ke-on');
    +				});
    +				var iconUrl = imgPath + (data.is_dir ? 'folder-16.gif' : 'file-16.gif'),
    +					img = K('<img src="' + iconUrl + '" width="16" height="16" alt="' + data.filename + '" align="absmiddle" />'),
    +					cell0 = K(row[0].insertCell(0)).addClass('ke-cell ke-name').append(img).append(document.createTextNode(' ' + data.filename));
    +				if (!data.is_dir || data.has_file) {
    +					row.css('cursor', 'pointer');
    +					cell0.attr('title', data.filename);
    +					bindEvent(cell0, result, data, createList);
    +				} else {
    +					cell0.attr('title', lang.emptyFolder);
    +				}
    +				K(row[0].insertCell(1)).addClass('ke-cell ke-size').html(data.is_dir ? '-' : Math.ceil(data.filesize / 1024) + 'KB');
    +				K(row[0].insertCell(2)).addClass('ke-cell ke-datetime').html(data.datetime);
    +			}
    +		}
    +		function createView(result) {
    +			createCommon(result, createView);
    +			var fileList = result.file_list;
    +			for (var i = 0, len = fileList.length; i < len; i++) {
    +				var data = fileList[i],
    +					div = K('<div class="ke-inline-block ke-item"></div>');
    +				bodyDiv.append(div);
    +				var photoDiv = K('<div class="ke-inline-block ke-photo"></div>')
    +					.mouseover(function(e) {
    +						K(this).addClass('ke-on');
    +					})
    +					.mouseout(function(e) {
    +						K(this).removeClass('ke-on');
    +					});
    +				div.append(photoDiv);
    +				var fileUrl = result.current_url + data.filename,
    +					iconUrl = data.is_dir ? imgPath + 'folder-64.gif' : (data.is_photo ? fileUrl : imgPath + 'file-64.gif');
    +				var img = K('<img src="' + iconUrl + '" width="80" height="80" alt="' + data.filename + '" />');
    +				if (!data.is_dir || data.has_file) {
    +					photoDiv.css('cursor', 'pointer');
    +					bindTitle(photoDiv, data);
    +					bindEvent(photoDiv, result, data, createView);
    +				} else {
    +					photoDiv.attr('title', lang.emptyFolder);
    +				}
    +				photoDiv.append(img);
    +				div.append('<div class="ke-name" title="' + data.filename + '">' + data.filename + '</div>');
    +			}
    +		}
    +		viewTypeBox.val(viewType);
    +		reloadPage('', orderTypeBox.val(), viewType == 'VIEW' ? createView : createList);
    +		return dialog;
    +	}
    +
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/file-16.gif b/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/file-16.gif
    new file mode 100644
    index 00000000..2cf6e47e
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/file-16.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/file-64.gif b/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/file-64.gif
    new file mode 100644
    index 00000000..2e211da0
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/file-64.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/folder-16.gif b/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/folder-16.gif
    new file mode 100644
    index 00000000..850b5a35
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/folder-16.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/folder-64.gif b/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/folder-64.gif
    new file mode 100644
    index 00000000..e8a1b09c
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/folder-64.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/go-up.gif b/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/go-up.gif
    new file mode 100644
    index 00000000..92ae23d7
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/filemanager/images/go-up.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/flash/flash.js b/src/main/webapp/plug-in/kindeditor/plugins/flash/flash.js
    new file mode 100644
    index 00000000..2dbcb933
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/flash/flash.js
    @@ -0,0 +1,155 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('flash', function(K) {
    +	var self = this, name = 'flash', lang = self.lang(name + '.'),
    +		allowFlashUpload = K.undef(self.allowFlashUpload, true),
    +		allowFileManager = K.undef(self.allowFileManager, false),
    +		formatUploadUrl = K.undef(self.formatUploadUrl, true),
    +		extraParams = K.undef(self.extraFileUploadParams, {}),
    +		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
    +	self.plugin.flash = {
    +		edit : function() {
    +			var html = [
    +				'<div style="padding:20px;">',
    +				//url
    +				'<div class="ke-dialog-row">',
    +				'<label for="keUrl" style="width:60px;">' + lang.url + '</label>',
    +				'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;',
    +				'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
    +				'<span class="ke-button-common ke-button-outer">',
    +				'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
    +				'</span>',
    +				'</div>',
    +				//width
    +				'<div class="ke-dialog-row">',
    +				'<label for="keWidth" style="width:60px;">' + lang.width + '</label>',
    +				'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /> ',
    +				'</div>',
    +				//height
    +				'<div class="ke-dialog-row">',
    +				'<label for="keHeight" style="width:60px;">' + lang.height + '</label>',
    +				'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /> ',
    +				'</div>',
    +				'</div>'
    +			].join('');
    +			var dialog = self.createDialog({
    +				name : name,
    +				width : 450,
    +				title : self.lang(name),
    +				body : html,
    +				yesBtn : {
    +					name : self.lang('yes'),
    +					click : function(e) {
    +						var url = K.trim(urlBox.val()),
    +							width = widthBox.val(),
    +							height = heightBox.val();
    +						if (url == 'http://' || K.invalidUrl(url)) {
    +							alert(self.lang('invalidUrl'));
    +							urlBox[0].focus();
    +							return;
    +						}
    +						if (!/^\d*$/.test(width)) {
    +							alert(self.lang('invalidWidth'));
    +							widthBox[0].focus();
    +							return;
    +						}
    +						if (!/^\d*$/.test(height)) {
    +							alert(self.lang('invalidHeight'));
    +							heightBox[0].focus();
    +							return;
    +						}
    +						var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
    +								src : url,
    +								type : K.mediaType('.swf'),
    +								width : width,
    +								height : height,
    +								quality : 'high'
    +							});
    +						self.insertHtml(html).hideDialog().focus();
    +					}
    +				}
    +			}),
    +			div = dialog.div,
    +			urlBox = K('[name="url"]', div),
    +			viewServerBtn = K('[name="viewServer"]', div),
    +			widthBox = K('[name="width"]', div),
    +			heightBox = K('[name="height"]', div);
    +			urlBox.val('http://');
    +
    +			if (allowFlashUpload) {
    +				var uploadbutton = K.uploadbutton({
    +					button : K('.ke-upload-button', div)[0],
    +					fieldName : 'imgFile',
    +					extraParams : extraParams,
    +					url : K.addParam(uploadJson, 'dir=flash'),
    +					afterUpload : function(data) {
    +						dialog.hideLoading();
    +						if (data.error === 0) {
    +							var url = data.url;
    +							if (formatUploadUrl) {
    +								url = K.formatUrl(url, 'absolute');
    +							}
    +							urlBox.val(url);
    +							if (self.afterUpload) {
    +								self.afterUpload.call(self, url);
    +							}
    +							alert(self.lang('uploadSuccess'));
    +						} else {
    +							alert(data.message);
    +						}
    +					},
    +					afterError : function(html) {
    +						dialog.hideLoading();
    +						self.errorDialog(html);
    +					}
    +				});
    +				uploadbutton.fileBox.change(function(e) {
    +					dialog.showLoading(self.lang('uploadLoading'));
    +					uploadbutton.submit();
    +				});
    +			} else {
    +				K('.ke-upload-button', div).hide();
    +			}
    +
    +			if (allowFileManager) {
    +				viewServerBtn.click(function(e) {
    +					self.loadPlugin('filemanager', function() {
    +						self.plugin.filemanagerDialog({
    +							viewType : 'LIST',
    +							dirName : 'flash',
    +							clickFn : function(url, title) {
    +								if (self.dialogs.length > 1) {
    +									K('[name="url"]', div).val(url);
    +									self.hideDialog();
    +								}
    +							}
    +						});
    +					});
    +				});
    +			} else {
    +				viewServerBtn.hide();
    +			}
    +
    +			var img = self.plugin.getSelectedFlash();
    +			if (img) {
    +				var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
    +				urlBox.val(attrs.src);
    +				widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
    +				heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
    +			}
    +			urlBox[0].focus();
    +			urlBox[0].select();
    +		},
    +		'delete' : function() {
    +			self.plugin.getSelectedFlash().remove();
    +		}
    +	};
    +	self.clickToolbar(name, self.plugin.flash.edit);
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/image/image.js b/src/main/webapp/plug-in/kindeditor/plugins/image/image.js
    new file mode 100644
    index 00000000..a4e3853a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/image/image.js
    @@ -0,0 +1,299 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('image', function(K) {
    +	var self = this, name = 'image',
    +		allowImageUpload = K.undef(self.allowImageUpload, true),
    +		formatUploadUrl = K.undef(self.formatUploadUrl, true),
    +		allowFileManager = K.undef(self.allowFileManager, false),
    +		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
    +		imageTabIndex = K.undef(self.imageTabIndex, 0),
    +		imgPath = self.pluginsPath + 'image/images/',
    +		extraParams = K.undef(self.extraFileUploadParams, {}),
    +		lang = self.lang(name + '.');
    +
    +	self.plugin.imageDialog = function(options) {
    +		var imageUrl = options.imageUrl,
    +			imageWidth = K.undef(options.imageWidth, ''),
    +			imageHeight = K.undef(options.imageHeight, ''),
    +			imageTitle = K.undef(options.imageTitle, ''),
    +			imageAlign = K.undef(options.imageAlign, ''),
    +			tabIndex = K.undef(options.tabIndex, 0),
    +			clickFn = options.clickFn;
    +		var target = 'kindeditor_upload_iframe_' + new Date().getTime();
    +		var hiddenElements = [];
    +		for(var k in extraParams){
    +			hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
    +		}
    +		var html = [
    +			'<div style="padding:20px;">',
    +			//tabs
    +			'<div class="tabs"></div>',
    +			//remote image - start
    +			'<div class="tab1" style="display:none;">',
    +			//url
    +			'<div class="ke-dialog-row">',
    +			'<label for="remoteUrl" style="width:60px;">' + lang.remoteUrl + '</label>',
    +			'<input type="text" id="remoteUrl" class="ke-input-text" name="url" value="" style="width:200px;" /> &nbsp;',
    +			'<span class="ke-button-common ke-button-outer">',
    +			'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
    +			'</span>',
    +			'</div>',
    +			//size
    +			'<div class="ke-dialog-row">',
    +			'<label for="remoteWidth" style="width:60px;">' + lang.size + '</label>',
    +			lang.width + ' <input type="text" id="remoteWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ',
    +			lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ',
    +			'<img class="ke-refresh-btn" src="' + imgPath + 'refresh.png" width="16" height="16" alt="" style="cursor:pointer;" title="' + lang.resetSize + '" />',
    +			'</div>',
    +			//align
    +			'<div class="ke-dialog-row">',
    +			'<label style="width:60px;">' + lang.align + '</label>',
    +			'<input type="radio" name="align" class="ke-inline-block" value="" checked="checked" /> <img name="defaultImg" src="' + imgPath + 'align_top.gif" width="23" height="25" alt="" />',
    +			' <input type="radio" name="align" class="ke-inline-block" value="left" /> <img name="leftImg" src="' + imgPath + 'align_left.gif" width="23" height="25" alt="" />',
    +			' <input type="radio" name="align" class="ke-inline-block" value="right" /> <img name="rightImg" src="' + imgPath + 'align_right.gif" width="23" height="25" alt="" />',
    +			'</div>',
    +			//title
    +			'<div class="ke-dialog-row">',
    +			'<label for="remoteTitle" style="width:60px;">' + lang.imgTitle + '</label>',
    +			'<input type="text" id="remoteTitle" class="ke-input-text" name="title" value="" style="width:200px;" />',
    +			'</div>',
    +			'</div>',
    +			//remote image - end
    +			//local upload - start
    +			'<div class="tab2" style="display:none;">',
    +			'<iframe name="' + target + '" style="display:none;"></iframe>',
    +			'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + K.addParam(uploadJson, 'dir=image') + '">',
    +			//file
    +			'<div class="ke-dialog-row">',
    +			hiddenElements.join(''),
    +			'<label style="width:60px;">' + lang.localUrl + '</label>',
    +			'<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:200px;" readonly="true" /> &nbsp;',
    +			'<input type="button" class="ke-upload-button" value="' + lang.upload + '" />',
    +			'</div>',
    +			'</form>',
    +			'</div>',
    +			//local upload - end
    +			'</div>'
    +		].join('');
    +		var dialogWidth = allowImageUpload ? 450 : 400,
    +			dialogHeight = allowImageUpload ? 300 : 250;
    +		var dialog = self.createDialog({
    +			name : name,
    +			width : dialogWidth,
    +			height : dialogHeight,
    +			title : self.lang(name),
    +			body : html,
    +			yesBtn : {
    +				name : self.lang('yes'),
    +				click : function(e) {
    +					// Bugfix: http://code.google.com/p/kindeditor/issues/detail?id=319
    +					if (dialog.isLoading) {
    +						return;
    +					}
    +					// insert local image
    +					if (tabs && tabs.selectedIndex === 1) {
    +						if (uploadbutton.fileBox.val() == '') {
    +							alert(self.lang('pleaseSelectFile'));
    +							return;
    +						}
    +						dialog.showLoading(self.lang('uploadLoading'));
    +						uploadbutton.submit();
    +						localUrlBox.val('');
    +						return;
    +					}
    +					// insert remote image
    +					var url = K.trim(urlBox.val()),
    +						width = widthBox.val(),
    +						height = heightBox.val(),
    +						title = titleBox.val(),
    +						align = '';
    +					alignBox.each(function() {
    +						if (this.checked) {
    +							align = this.value;
    +							return false;
    +						}
    +					});
    +					if (url == 'http://' || K.invalidUrl(url)) {
    +						alert(self.lang('invalidUrl'));
    +						urlBox[0].focus();
    +						return;
    +					}
    +					if (!/^\d*$/.test(width)) {
    +						alert(self.lang('invalidWidth'));
    +						widthBox[0].focus();
    +						return;
    +					}
    +					if (!/^\d*$/.test(height)) {
    +						alert(self.lang('invalidHeight'));
    +						heightBox[0].focus();
    +						return;
    +					}
    +					clickFn.call(self, url, title, width, height, 0, align);
    +				}
    +			},
    +			beforeRemove : function() {
    +				viewServerBtn.unbind();
    +				widthBox.unbind();
    +				heightBox.unbind();
    +				refreshBtn.unbind();
    +			}
    +		}),
    +		div = dialog.div;
    +
    +		var urlBox = K('[name="url"]', div),
    +			localUrlBox = K('[name="localUrl"]', div),
    +			viewServerBtn = K('[name="viewServer"]', div),
    +			widthBox = K('.tab1 [name="width"]', div),
    +			heightBox = K('.tab1 [name="height"]', div),
    +			refreshBtn = K('.ke-refresh-btn', div),
    +			titleBox = K('.tab1 [name="title"]', div),
    +			alignBox = K('.tab1 [name="align"]', div);
    +
    +		var tabs;
    +		if (allowImageUpload) {
    +			tabs = K.tabs({
    +				src : K('.tabs', div),
    +				afterSelect : function(i) {}
    +			});
    +			tabs.add({
    +				title : lang.remoteImage,
    +				panel : K('.tab1', div)
    +			});
    +			tabs.add({
    +				title : lang.localImage,
    +				panel : K('.tab2', div)
    +			});
    +			tabs.select(tabIndex);
    +		} else {
    +			K('.tab1', div).show();
    +		}
    +
    +		var uploadbutton = K.uploadbutton({
    +			button : K('.ke-upload-button', div)[0],
    +			fieldName : 'imgFile',
    +			url : K.addParam(uploadJson, 'dir=image'),
    +			form : K('.ke-form', div),
    +			target : target,
    +			width: 60,
    +			afterUpload : function(data) {
    +				dialog.hideLoading();
    +				if (data.error === 0) {
    +					var url = data.url;
    +					if (formatUploadUrl) {
    +						url = K.formatUrl(url, 'absolute');
    +					}
    +					clickFn.call(self, url, '', '', '', 0, '');
    +					if (self.afterUpload) {
    +						self.afterUpload.call(self, url);
    +					}
    +				} else {
    +					alert(data.message);
    +				}
    +			},
    +			afterError : function(html) {
    +				dialog.hideLoading();
    +				self.errorDialog(html);
    +			}
    +		});
    +		uploadbutton.fileBox.change(function(e) {
    +			localUrlBox.val(uploadbutton.fileBox.val());
    +		});
    +		if (allowFileManager) {
    +			viewServerBtn.click(function(e) {
    +				self.loadPlugin('filemanager', function() {
    +					self.plugin.filemanagerDialog({
    +						viewType : 'VIEW',
    +						dirName : 'image',
    +						clickFn : function(url, title) {
    +							if (self.dialogs.length > 1) {
    +								K('[name="url"]', div).val(url);
    +								self.hideDialog();
    +							}
    +						}
    +					});
    +				});
    +			});
    +		} else {
    +			viewServerBtn.hide();
    +		}
    +		var originalWidth = 0, originalHeight = 0;
    +		function setSize(width, height) {
    +			widthBox.val(width);
    +			heightBox.val(height);
    +			originalWidth = width;
    +			originalHeight = height;
    +		}
    +		refreshBtn.click(function(e) {
    +			var tempImg = K('<img src="' + urlBox.val() + '" />', document).css({
    +				position : 'absolute',
    +				visibility : 'hidden',
    +				top : 0,
    +				left : '-1000px'
    +			});
    +			tempImg.bind('load', function() {
    +				setSize(tempImg.width(), tempImg.height());
    +				tempImg.remove();
    +			});
    +			K(document.body).append(tempImg);
    +		});
    +		widthBox.change(function(e) {
    +			if (originalWidth > 0) {
    +				heightBox.val(Math.round(originalHeight / originalWidth * parseInt(this.value, 10)));
    +			}
    +		});
    +		heightBox.change(function(e) {
    +			if (originalHeight > 0) {
    +				widthBox.val(Math.round(originalWidth / originalHeight * parseInt(this.value, 10)));
    +			}
    +		});
    +		urlBox.val(options.imageUrl);
    +		setSize(options.imageWidth, options.imageHeight);
    +		titleBox.val(options.imageTitle);
    +		alignBox.each(function() {
    +			if (this.value === options.imageAlign) {
    +				this.checked = true;
    +				return false;
    +			}
    +		});
    +		if (tabIndex === 0) {
    +			urlBox[0].focus();
    +			urlBox[0].select();
    +		}
    +		return dialog;
    +	};
    +	self.plugin.image = {
    +		edit : function() {
    +			var img = self.plugin.getSelectedImage();
    +			self.plugin.imageDialog({
    +				imageUrl : img ? img.attr('data-ke-src') : 'http://',
    +				imageWidth : img ? img.width() : '',
    +				imageHeight : img ? img.height() : '',
    +				imageTitle : img ? img.attr('title') : '',
    +				imageAlign : img ? img.attr('align') : '',
    +				tabIndex: img ? 0 : imageTabIndex,
    +				clickFn : function(url, title, width, height, border, align) {
    +					self.exec('insertimage', url, title, width, height, border, align);
    +					// Bugfix: [Firefox] 涓婁紶鍥剧墖鍚庯紝鎬绘槸鍑虹幇姝e湪鍔犺浇鐨勬牱寮忥紝闇瑕佸欢杩熸墽琛宧ideDialog
    +					setTimeout(function() {
    +						self.hideDialog().focus();
    +					}, 0);
    +				}
    +			});
    +		},
    +		'delete' : function() {
    +			var target = self.plugin.getSelectedImage();
    +			if (target.parent().name == 'a') {
    +				target = target.parent();
    +			}
    +			target.remove();
    +		}
    +	};
    +	self.clickToolbar(name, self.plugin.image.edit);
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/image/images/align_left.gif b/src/main/webapp/plug-in/kindeditor/plugins/image/images/align_left.gif
    new file mode 100644
    index 00000000..ab17f567
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/image/images/align_left.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/image/images/align_right.gif b/src/main/webapp/plug-in/kindeditor/plugins/image/images/align_right.gif
    new file mode 100644
    index 00000000..e8ebe6a6
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/image/images/align_right.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/image/images/align_top.gif b/src/main/webapp/plug-in/kindeditor/plugins/image/images/align_top.gif
    new file mode 100644
    index 00000000..d8826a5b
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/image/images/align_top.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/image/images/refresh.png b/src/main/webapp/plug-in/kindeditor/plugins/image/images/refresh.png
    new file mode 100644
    index 00000000..77e12d1c
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/image/images/refresh.png differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/insertfile/insertfile.js b/src/main/webapp/plug-in/kindeditor/plugins/insertfile/insertfile.js
    new file mode 100644
    index 00000000..cd5b0038
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/insertfile/insertfile.js
    @@ -0,0 +1,134 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('insertfile', function(K) {
    +	var self = this, name = 'insertfile',
    +		allowFileUpload = K.undef(self.allowFileUpload, true),
    +		allowFileManager = K.undef(self.allowFileManager, false),
    +		formatUploadUrl = K.undef(self.formatUploadUrl, true),
    +		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
    +		extraParams = K.undef(self.extraFileUploadParams, {}),
    +		lang = self.lang(name + '.');
    +	self.plugin.fileDialog = function(options) {
    +		var fileUrl = K.undef(options.fileUrl, 'http://'),
    +			fileTitle = K.undef(options.fileTitle, ''),
    +			clickFn = options.clickFn;
    +		var html = [
    +			'<div style="padding:20px;">',
    +			'<div class="ke-dialog-row">',
    +			'<label for="keUrl" style="width:60px;">' + lang.url + '</label>',
    +			'<input type="text" id="keUrl" name="url" class="ke-input-text" style="width:160px;" /> &nbsp;',
    +			'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
    +			'<span class="ke-button-common ke-button-outer">',
    +			'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
    +			'</span>',
    +			'</div>',
    +			//title
    +			'<div class="ke-dialog-row">',
    +			'<label for="keTitle" style="width:60px;">' + lang.title + '</label>',
    +			'<input type="text" id="keTitle" class="ke-input-text" name="title" value="" style="width:160px;" /></div>',
    +			'</div>',
    +			//form end
    +			'</form>',
    +			'</div>'
    +			].join('');
    +		var dialog = self.createDialog({
    +			name : name,
    +			width : 450,
    +			title : self.lang(name),
    +			body : html,
    +			yesBtn : {
    +				name : self.lang('yes'),
    +				click : function(e) {
    +					var url = K.trim(urlBox.val()),
    +						title = titleBox.val();
    +					if (url == 'http://' || K.invalidUrl(url)) {
    +						alert(self.lang('invalidUrl'));
    +						urlBox[0].focus();
    +						return;
    +					}
    +					if (K.trim(title) === '') {
    +						title = url;
    +					}
    +					clickFn.call(self, url, title);
    +				}
    +			}
    +		}),
    +		div = dialog.div;
    +
    +		var urlBox = K('[name="url"]', div),
    +			viewServerBtn = K('[name="viewServer"]', div),
    +			titleBox = K('[name="title"]', div);
    +
    +		if (allowFileUpload) {
    +			var uploadbutton = K.uploadbutton({
    +				button : K('.ke-upload-button', div)[0],
    +				fieldName : 'imgFile',
    +				url : K.addParam(uploadJson, 'dir=file'),
    +				extraParams : extraParams,
    +				afterUpload : function(data) {
    +					dialog.hideLoading();
    +					if (data.error === 0) {
    +						var url = data.url;
    +						if (formatUploadUrl) {
    +							url = K.formatUrl(url, 'absolute');
    +						}
    +						urlBox.val(url);
    +						if (self.afterUpload) {
    +							self.afterUpload.call(self, url);
    +						}
    +						alert(self.lang('uploadSuccess'));
    +					} else {
    +						alert(data.message);
    +					}
    +				},
    +				afterError : function(html) {
    +					dialog.hideLoading();
    +					self.errorDialog(html);
    +				}
    +			});
    +			uploadbutton.fileBox.change(function(e) {
    +				dialog.showLoading(self.lang('uploadLoading'));
    +				uploadbutton.submit();
    +			});
    +		} else {
    +			K('.ke-upload-button', div).hide();
    +		}
    +		if (allowFileManager) {
    +			viewServerBtn.click(function(e) {
    +				self.loadPlugin('filemanager', function() {
    +					self.plugin.filemanagerDialog({
    +						viewType : 'LIST',
    +						dirName : 'file',
    +						clickFn : function(url, title) {
    +							if (self.dialogs.length > 1) {
    +								K('[name="url"]', div).val(url);
    +								self.hideDialog();
    +							}
    +						}
    +					});
    +				});
    +			});
    +		} else {
    +			viewServerBtn.hide();
    +		}
    +		urlBox.val(fileUrl);
    +		titleBox.val(fileTitle);
    +		urlBox[0].focus();
    +		urlBox[0].select();
    +	};
    +	self.clickToolbar(name, function() {
    +		self.plugin.fileDialog({
    +			clickFn : function(url, title) {
    +				var html = '<a href="' + url + '" data-ke-src="' + url + '" target="_blank">' + title + '</a>';
    +				self.insertHtml(html).hideDialog().focus();
    +			}
    +		});
    +	});
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/lineheight/lineheight.js b/src/main/webapp/plug-in/kindeditor/plugins/lineheight/lineheight.js
    new file mode 100644
    index 00000000..ae679d78
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/lineheight/lineheight.js
    @@ -0,0 +1,38 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('lineheight', function(K) {
    +	var self = this, name = 'lineheight', lang = self.lang(name + '.');
    +	self.clickToolbar(name, function() {
    +		var curVal = '', commonNode = self.cmd.commonNode({'*' : '.line-height'});
    +		if (commonNode) {
    +			curVal = commonNode.css('line-height');
    +		}
    +		var menu = self.createMenu({
    +			name : name,
    +			width : 150
    +		});
    +		K.each(lang.lineHeight, function(i, row) {
    +			K.each(row, function(key, val) {
    +				menu.addItem({
    +					title : val,
    +					checked : curVal === key,
    +					click : function() {
    +						self.cmd.toggle('<span style="line-height:' + key + ';"></span>', {
    +							span : '.line-height=' + key
    +						});
    +						self.updateState();
    +						self.addBookmark();
    +						self.hideMenu();
    +					}
    +				});
    +			});
    +		});
    +	});
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/link/link.js b/src/main/webapp/plug-in/kindeditor/plugins/link/link.js
    new file mode 100644
    index 00000000..352fa3c6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/link/link.js
    @@ -0,0 +1,66 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('link', function(K) {
    +	var self = this, name = 'link';
    +	self.plugin.link = {
    +		edit : function() {
    +			var lang = self.lang(name + '.'),
    +				html = '<div style="padding:20px;">' +
    +					//url
    +					'<div class="ke-dialog-row">' +
    +					'<label for="keUrl" style="width:60px;">' + lang.url + '</label>' +
    +					'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:260px;" /></div>' +
    +					//type
    +					'<div class="ke-dialog-row"">' +
    +					'<label for="keType" style="width:60px;">' + lang.linkType + '</label>' +
    +					'<select id="keType" name="type"></select>' +
    +					'</div>' +
    +					'</div>',
    +				dialog = self.createDialog({
    +					name : name,
    +					width : 450,
    +					title : self.lang(name),
    +					body : html,
    +					yesBtn : {
    +						name : self.lang('yes'),
    +						click : function(e) {
    +							var url = K.trim(urlBox.val());
    +							if (url == 'http://' || K.invalidUrl(url)) {
    +								alert(self.lang('invalidUrl'));
    +								urlBox[0].focus();
    +								return;
    +							}
    +							self.exec('createlink', url, typeBox.val()).hideDialog().focus();
    +						}
    +					}
    +				}),
    +				div = dialog.div,
    +				urlBox = K('input[name="url"]', div),
    +				typeBox = K('select[name="type"]', div);
    +			urlBox.val('http://');
    +			typeBox[0].options[0] = new Option(lang.newWindow, '_blank');
    +			typeBox[0].options[1] = new Option(lang.selfWindow, '');
    +			self.cmd.selection();
    +			var a = self.plugin.getSelectedLink();
    +			if (a) {
    +				self.cmd.range.selectNode(a[0]);
    +				self.cmd.select();
    +				urlBox.val(a.attr('data-ke-src'));
    +				typeBox.val(a.attr('target'));
    +			}
    +			urlBox[0].focus();
    +			urlBox[0].select();
    +		},
    +		'delete' : function() {
    +			self.exec('unlink', null);
    +		}
    +	};
    +	self.clickToolbar(name, self.plugin.link.edit);
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/map/map.html b/src/main/webapp/plug-in/kindeditor/plugins/map/map.html
    new file mode 100644
    index 00000000..1a9ad7d7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/map/map.html
    @@ -0,0 +1,57 @@
    +<!doctype html>
    +<html>
    +	<head>
    +	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    +	<style>
    +		html { height: 100% }
    +		body { height: 100%; margin: 0; padding: 0; background-color: #FFF }
    +		#map_canvas { height: 100% }
    +	</style>
    +	<script src="http://maps.googleapis.com/maps/api/js?sensor=false&language=zh_CN"></script>
    +	<script>
    +		var map, geocoder;
    +		function initialize() {
    +			var latlng = new google.maps.LatLng(31.230393, 121.473704);
    +			var options = {
    +				zoom: 11,
    +				center: latlng,
    +				disableDefaultUI: true,
    +				panControl: true,
    +				zoomControl: true,
    +				mapTypeControl: true,
    +				scaleControl: true,
    +				streetViewControl: false,
    +				overviewMapControl: true,
    +				mapTypeId: google.maps.MapTypeId.ROADMAP
    +			};
    +			map = new google.maps.Map(document.getElementById("map_canvas"), options);
    +			geocoder = new google.maps.Geocoder();
    +			geocoder.geocode({latLng: latlng}, function(results, status) {
    +				if (status == google.maps.GeocoderStatus.OK) {
    +					if (results[3]) {
    +						parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;
    +					}
    +				}
    +			});
    +		}
    +		function search(address) {
    +			if (!map) return;
    +			geocoder.geocode({address : address}, function(results, status) {
    +				if (status == google.maps.GeocoderStatus.OK) {
    +					map.setZoom(11);
    +					map.setCenter(results[0].geometry.location);
    +					var marker = new google.maps.Marker({
    +						map: map,
    +						position: results[0].geometry.location
    +					});
    +				} else {
    +					alert("Invalid address: " + address);
    +				}
    +			});
    +		}
    +	</script>
    +	</head>
    +	<body onload="initialize();">
    +		<div id="map_canvas" style="width:100%; height:100%"></div>
    +	</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/map/map.js b/src/main/webapp/plug-in/kindeditor/plugins/map/map.js
    new file mode 100644
    index 00000000..52908752
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/map/map.js
    @@ -0,0 +1,137 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +// Google Maps: http://code.google.com/apis/maps/index.html
    +
    +KindEditor.plugin('map', function(K) {
    +	var self = this, name = 'map', lang = self.lang(name + '.');
    +	self.clickToolbar(name, function() {
    +		var html = ['<div style="padding:10px 20px;">',
    +			'<div class="ke-dialog-row">',
    +			lang.address + ' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
    +			'<span class="ke-button-common ke-button-outer">',
    +			'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" />',
    +			'</span>',
    +			'</div>',
    +			'<div class="ke-map" style="width:558px;height:360px;"></div>',
    +			'</div>'].join('');
    +		var dialog = self.createDialog({
    +			name : name,
    +			width : 600,
    +			title : self.lang(name),
    +			body : html,
    +			yesBtn : {
    +				name : self.lang('yes'),
    +				click : function(e) {
    +					var geocoder = win.geocoder,
    +						map = win.map,
    +						center = map.getCenter().lat() + ',' + map.getCenter().lng(),
    +						zoom = map.getZoom(),
    +						maptype = map.getMapTypeId(),
    +						url = 'http://maps.googleapis.com/maps/api/staticmap';
    +						url += '?center=' + encodeURIComponent(center);
    +						url += '&zoom=' + encodeURIComponent(zoom);
    +						url += '&size=558x360';
    +						url += '&maptype=' + encodeURIComponent(maptype);
    +						url += '&markers=' + encodeURIComponent(center);
    +						url += '&language=' + self.langType;
    +						url += '&sensor=false';
    +					self.exec('insertimage', url).hideDialog().focus();
    +				}
    +			},
    +			beforeRemove : function() {
    +				searchBtn.remove();
    +				if (doc) {
    +					doc.write('');
    +				}
    +				iframe.remove();
    +			}
    +		});
    +		var div = dialog.div,
    +			addressBox = K('[name="address"]', div),
    +			searchBtn = K('[name="searchBtn"]', div),
    +			win, doc;
    +		var iframeHtml = ['<!doctype html><html><head>',
    +			'<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />',
    +			'<style>',
    +			'	html { height: 100% }',
    +			'	body { height: 100%; margin: 0; padding: 0; background-color: #FFF }',
    +			'	#map_canvas { height: 100% }',
    +			'</style>',
    +			'<script src="http://maps.googleapis.com/maps/api/js?sensor=false&language=' + self.langType + '"></script>',
    +			'<script>',
    +			'var map, geocoder;',
    +			'function initialize() {',
    +			'	var latlng = new google.maps.LatLng(31.230393, 121.473704);',
    +			'	var options = {',
    +			'		zoom: 11,',
    +			'		center: latlng,',
    +			'		disableDefaultUI: true,',
    +			'		panControl: true,',
    +			'		zoomControl: true,',
    +			'		mapTypeControl: true,',
    +			'		scaleControl: true,',
    +			'		streetViewControl: false,',
    +			'		overviewMapControl: true,',
    +			'		mapTypeId: google.maps.MapTypeId.ROADMAP',
    +			'	};',
    +			'	map = new google.maps.Map(document.getElementById("map_canvas"), options);',
    +			'	geocoder = new google.maps.Geocoder();',
    +			'	geocoder.geocode({latLng: latlng}, function(results, status) {',
    +			'		if (status == google.maps.GeocoderStatus.OK) {',
    +			'			if (results[3]) {',
    +			'				parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;',
    +			'			}',
    +			'		}',
    +			'	});',
    +			'}',
    +			'function search(address) {',
    +			'	if (!map) return;',
    +			'	geocoder.geocode({address : address}, function(results, status) {',
    +			'		if (status == google.maps.GeocoderStatus.OK) {',
    +			'			map.setZoom(11);',
    +			'			map.setCenter(results[0].geometry.location);',
    +			'			var marker = new google.maps.Marker({',
    +			'				map: map,',
    +			'				position: results[0].geometry.location',
    +			'			});',
    +			'		} else {',
    +			'			alert("Invalid address: " + address);',
    +			'		}',
    +			'	});',
    +			'}',
    +			'</script>',
    +			'</head>',
    +			'<body onload="initialize();">',
    +			'<div id="map_canvas" style="width:100%; height:100%"></div>',
    +			'</body></html>'].join('\n');
    +		// TODO锛氱敤doc.write(iframeHtml)鏂瑰紡鍔犺浇鏃讹紝鍦↖E6涓婄涓娆″姞杞芥姤閿欙紝鏆傛椂浣跨敤src鏂瑰紡
    +		var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'map/map.html" style="width:558px;height:360px;"></iframe>');
    +		function ready() {
    +			win = iframe[0].contentWindow;
    +			doc = K.iframeDoc(iframe);
    +			//doc.open();
    +			//doc.write(iframeHtml);
    +			//doc.close();
    +		}
    +		iframe.bind('load', function() {
    +			iframe.unbind('load');
    +			if (K.IE) {
    +				ready();
    +			} else {
    +				setTimeout(ready, 0);
    +			}
    +		});
    +		K('.ke-map', div).replaceWith(iframe);
    +		// search map
    +		searchBtn.click(function() {
    +			win.search(addressBox.val());
    +		});
    +	});
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/media/media.js b/src/main/webapp/plug-in/kindeditor/plugins/media/media.js
    new file mode 100644
    index 00000000..e1d1aba8
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/media/media.js
    @@ -0,0 +1,164 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('media', function(K) {
    +	var self = this, name = 'media', lang = self.lang(name + '.'),
    +		allowMediaUpload = K.undef(self.allowMediaUpload, true),
    +		allowFileManager = K.undef(self.allowFileManager, false),
    +		formatUploadUrl = K.undef(self.formatUploadUrl, true),
    +		extraParams = K.undef(self.extraFileUploadParams, {}),
    +		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
    +	self.plugin.media = {
    +		edit : function() {
    +			var html = [
    +				'<div style="padding:20px;">',
    +				//url
    +				'<div class="ke-dialog-row">',
    +				'<label for="keUrl" style="width:60px;">' + lang.url + '</label>',
    +				'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;',
    +				'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
    +				'<span class="ke-button-common ke-button-outer">',
    +				'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
    +				'</span>',
    +				'</div>',
    +				//width
    +				'<div class="ke-dialog-row">',
    +				'<label for="keWidth" style="width:60px;">' + lang.width + '</label>',
    +				'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" />',
    +				'</div>',
    +				//height
    +				'<div class="ke-dialog-row">',
    +				'<label for="keHeight" style="width:60px;">' + lang.height + '</label>',
    +				'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" />',
    +				'</div>',
    +				//autostart
    +				'<div class="ke-dialog-row">',
    +				'<label for="keAutostart">' + lang.autostart + '</label>',
    +				'<input type="checkbox" id="keAutostart" name="autostart" value="" /> ',
    +				'</div>',
    +				'</div>'
    +			].join('');
    +			var dialog = self.createDialog({
    +				name : name,
    +				width : 450,
    +				height : 230,
    +				title : self.lang(name),
    +				body : html,
    +				yesBtn : {
    +					name : self.lang('yes'),
    +					click : function(e) {
    +						var url = K.trim(urlBox.val()),
    +							width = widthBox.val(),
    +							height = heightBox.val();
    +						if (url == 'http://' || K.invalidUrl(url)) {
    +							alert(self.lang('invalidUrl'));
    +							urlBox[0].focus();
    +							return;
    +						}
    +						if (!/^\d*$/.test(width)) {
    +							alert(self.lang('invalidWidth'));
    +							widthBox[0].focus();
    +							return;
    +						}
    +						if (!/^\d*$/.test(height)) {
    +							alert(self.lang('invalidHeight'));
    +							heightBox[0].focus();
    +							return;
    +						}
    +						var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
    +								src : url,
    +								type : K.mediaType(url),
    +								width : width,
    +								height : height,
    +								autostart : autostartBox[0].checked ? 'true' : 'false',
    +								loop : 'true'
    +							});
    +						self.insertHtml(html).hideDialog().focus();
    +					}
    +				}
    +			}),
    +			div = dialog.div,
    +			urlBox = K('[name="url"]', div),
    +			viewServerBtn = K('[name="viewServer"]', div),
    +			widthBox = K('[name="width"]', div),
    +			heightBox = K('[name="height"]', div),
    +			autostartBox = K('[name="autostart"]', div);
    +			urlBox.val('http://');
    +
    +			if (allowMediaUpload) {
    +				var uploadbutton = K.uploadbutton({
    +					button : K('.ke-upload-button', div)[0],
    +					fieldName : 'imgFile',
    +					extraParams : extraParams,
    +					url : K.addParam(uploadJson, 'dir=media'),
    +					afterUpload : function(data) {
    +						dialog.hideLoading();
    +						if (data.error === 0) {
    +							var url = data.url;
    +							if (formatUploadUrl) {
    +								url = K.formatUrl(url, 'absolute');
    +							}
    +							urlBox.val(url);
    +							if (self.afterUpload) {
    +								self.afterUpload.call(self, url);
    +							}
    +							alert(self.lang('uploadSuccess'));
    +						} else {
    +							alert(data.message);
    +						}
    +					},
    +					afterError : function(html) {
    +						dialog.hideLoading();
    +						self.errorDialog(html);
    +					}
    +				});
    +				uploadbutton.fileBox.change(function(e) {
    +					dialog.showLoading(self.lang('uploadLoading'));
    +					uploadbutton.submit();
    +				});
    +			} else {
    +				K('.ke-upload-button', div).hide();
    +			}
    +
    +			if (allowFileManager) {
    +				viewServerBtn.click(function(e) {
    +					self.loadPlugin('filemanager', function() {
    +						self.plugin.filemanagerDialog({
    +							viewType : 'LIST',
    +							dirName : 'media',
    +							clickFn : function(url, title) {
    +								if (self.dialogs.length > 1) {
    +									K('[name="url"]', div).val(url);
    +									self.hideDialog();
    +								}
    +							}
    +						});
    +					});
    +				});
    +			} else {
    +				viewServerBtn.hide();
    +			}
    +
    +			var img = self.plugin.getSelectedMedia();
    +			if (img) {
    +				var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
    +				urlBox.val(attrs.src);
    +				widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
    +				heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
    +				autostartBox[0].checked = (attrs.autostart === 'true');
    +			}
    +			urlBox[0].focus();
    +			urlBox[0].select();
    +		},
    +		'delete' : function() {
    +			self.plugin.getSelectedMedia().remove();
    +		}
    +	};
    +	self.clickToolbar(name, self.plugin.media.edit);
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/multiimage/images/image.png b/src/main/webapp/plug-in/kindeditor/plugins/multiimage/images/image.png
    new file mode 100644
    index 00000000..fe79cf0a
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/multiimage/images/image.png differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/multiimage/images/select-files-en.png b/src/main/webapp/plug-in/kindeditor/plugins/multiimage/images/select-files-en.png
    new file mode 100644
    index 00000000..a926a6e3
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/multiimage/images/select-files-en.png differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/multiimage/images/select-files-zh_CN.png b/src/main/webapp/plug-in/kindeditor/plugins/multiimage/images/select-files-zh_CN.png
    new file mode 100644
    index 00000000..5a31d364
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/multiimage/images/select-files-zh_CN.png differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/multiimage/images/swfupload.swf b/src/main/webapp/plug-in/kindeditor/plugins/multiimage/images/swfupload.swf
    new file mode 100644
    index 00000000..e3f76703
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/plugins/multiimage/images/swfupload.swf differ
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/multiimage/multiimage.js b/src/main/webapp/plug-in/kindeditor/plugins/multiimage/multiimage.js
    new file mode 100644
    index 00000000..3994c35e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/multiimage/multiimage.js
    @@ -0,0 +1,1368 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +
    +(function(K) {
    +
    +function KSWFUpload(options) {
    +	this.init(options);
    +}
    +K.extend(KSWFUpload, {
    +	init : function(options) {
    +		var self = this;
    +		options.afterError = options.afterError || function(str) {
    +			alert(str);
    +		};
    +		self.options = options;
    +		self.progressbars = {};
    +		// template
    +		self.div = K(options.container).html([
    +			'<div class="ke-swfupload">',
    +			'<div class="ke-swfupload-top">',
    +			'<div class="ke-inline-block ke-swfupload-button">',
    +			'<input type="button" value="Browse" />',
    +			'</div>',
    +			'<div class="ke-inline-block ke-swfupload-desc">' + options.uploadDesc + '</div>',
    +			'<span class="ke-button-common ke-button-outer ke-swfupload-startupload">',
    +			'<input type="button" class="ke-button-common ke-button" value="' + options.startButtonValue + '" />',
    +			'</span>',
    +			'</div>',
    +			'<div class="ke-swfupload-body"></div>',
    +			'</div>'
    +		].join(''));
    +		self.bodyDiv = K('.ke-swfupload-body', self.div);
    +
    +		function showError(itemDiv, msg) {
    +			K('.ke-status > div', itemDiv).hide();
    +			K('.ke-message', itemDiv).addClass('ke-error').show().html(K.escape(msg));
    +		}
    +
    +		var settings = {
    +			debug : false,
    +			upload_url : options.uploadUrl,
    +			flash_url : options.flashUrl,
    +			file_post_name : options.filePostName,
    +			button_placeholder : K('.ke-swfupload-button > input', self.div)[0],
    +			button_image_url: options.buttonImageUrl,
    +			button_width: options.buttonWidth,
    +			button_height: options.buttonHeight,
    +			button_cursor : SWFUpload.CURSOR.HAND,
    +			file_types : options.fileTypes,
    +			file_types_description : options.fileTypesDesc,
    +			file_upload_limit : options.fileUploadLimit,
    +			file_size_limit : options.fileSizeLimit,
    +			file_queued_handler : function(file) {
    +				file.url = self.options.fileIconUrl;
    +				self.appendFile(file);
    +			},
    +			file_queue_error_handler : function(file, errorCode, message) {
    +				var errorName = '';
    +				switch (errorCode) {
    +					case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:
    +						errorName = options.queueLimitExceeded;
    +						break;
    +					case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
    +						errorName = options.fileExceedsSizeLimit;
    +						break;
    +					case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
    +						errorName = options.zeroByteFile;
    +						break;
    +					case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
    +						errorName = options.invalidFiletype;
    +						break;
    +					default:
    +						errorName = options.unknownError;
    +						break;
    +				}
    +				K.DEBUG && alert(errorName);
    +			},
    +			upload_start_handler : function(file) {
    +				var self = this;
    +				var itemDiv = K('div[data-id="' + file.id + '"]', self.bodyDiv);
    +				K('.ke-status > div', itemDiv).hide();
    +				K('.ke-progressbar', itemDiv).show();
    +			},
    +			upload_progress_handler : function(file, bytesLoaded, bytesTotal) {
    +				var percent = Math.round(bytesLoaded * 100 / bytesTotal);
    +				var progressbar = self.progressbars[file.id];
    +				progressbar.bar.css('width', Math.round(percent * 80 / 100) + 'px');
    +				progressbar.percent.html(percent + '%');
    +			},
    +			upload_error_handler : function(file, errorCode, message) {
    +				if (file && file.filestatus == SWFUpload.FILE_STATUS.ERROR) {
    +					var itemDiv = K('div[data-id="' + file.id + '"]', self.bodyDiv).eq(0);
    +					showError(itemDiv, self.options.errorMessage);
    +				}
    +			},
    +			upload_success_handler : function(file, serverData) {
    +				var itemDiv = K('div[data-id="' + file.id + '"]', self.bodyDiv).eq(0);
    +				var data = {};
    +				try {
    +					data = K.json(serverData);
    +				} catch (e) {
    +					self.options.afterError.call(this, '<!doctype html><html>' + serverData + '</html>');
    +				}
    +				if (data.error !== 0) {
    +					showError(itemDiv, K.DEBUG ? data.message : self.options.errorMessage);
    +					return;
    +				}
    +				file.url = data.url;
    +				K('.ke-img', itemDiv).attr('src', file.url).attr('data-status', file.filestatus);
    +				K('.ke-status > div', itemDiv).hide();
    +			}
    +		};
    +		self.swfu = new SWFUpload(settings);
    +
    +		K('.ke-swfupload-startupload input', self.div).click(function() {
    +			self.swfu.startUpload();
    +		});
    +	},
    +	getUrlList : function() {
    +		var list = [];
    +		K('.ke-img', self.bodyDiv).each(function() {
    +			var img = K(this);
    +			var url = img.attr('src');
    +			var status = img.attr('data-status');
    +			if (status == SWFUpload.FILE_STATUS.COMPLETE) {
    +				list.push(url);
    +			}
    +		});
    +		return list;
    +	},
    +	removeFile : function(fileId) {
    +		var self = this;
    +		self.swfu.cancelUpload(fileId);
    +		var itemDiv = K('div[data-id="' + fileId + '"]', self.bodyDiv);
    +		K('.ke-photo', itemDiv).unbind();
    +		K('.ke-delete', itemDiv).unbind();
    +		itemDiv.remove();
    +	},
    +	removeFiles : function() {
    +		var self = this;
    +		K('.ke-item', self.bodyDiv).each(function() {
    +			self.removeFile(K(this).attr('data-id'));
    +		});
    +	},
    +	appendFile : function(file) {
    +		var self = this;
    +		var itemDiv = K('<div class="ke-inline-block ke-item" data-id="' + file.id + '"></div>');
    +		self.bodyDiv.append(itemDiv);
    +		var photoDiv = K('<div class="ke-inline-block ke-photo"></div>')
    +			.mouseover(function(e) {
    +				K(this).addClass('ke-on');
    +			})
    +			.mouseout(function(e) {
    +				K(this).removeClass('ke-on');
    +			});
    +		itemDiv.append(photoDiv);
    +
    +		var img = K('<img src="' + file.url + '" class="ke-img" data-status="' + file.filestatus + '" width="80" height="80" alt="' + file.name + '" />');
    +		photoDiv.append(img);
    +		K('<span class="ke-delete"></span>').appendTo(photoDiv).click(function() {
    +			self.removeFile(file.id);
    +		});
    +		var statusDiv = K('<div class="ke-status"></div>').appendTo(photoDiv);
    +		// progressbar
    +		K(['<div class="ke-progressbar">',
    +			'<div class="ke-progressbar-bar"><div class="ke-progressbar-bar-inner"></div></div>',
    +			'<div class="ke-progressbar-percent">0%</div></div>'].join('')).hide().appendTo(statusDiv);
    +		// message
    +		K('<div class="ke-message">' + self.options.pendingMessage + '</div>').appendTo(statusDiv);
    +
    +		itemDiv.append('<div class="ke-name">' + file.name + '</div>');
    +
    +		self.progressbars[file.id] = {
    +			bar : K('.ke-progressbar-bar-inner', photoDiv),
    +			percent : K('.ke-progressbar-percent', photoDiv)
    +		};
    +	},
    +	remove : function() {
    +		this.removeFiles();
    +		this.swfu.destroy();
    +		this.div.html('');
    +	}
    +});
    +
    +K.swfupload = function(element, options) {
    +	return new KSWFUpload(element, options);
    +};
    +
    +})(KindEditor);
    +
    +KindEditor.plugin('multiimage', function(K) {
    +	var self = this, name = 'multiimage',
    +		formatUploadUrl = K.undef(self.formatUploadUrl, true),
    +		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
    +		imgPath = self.pluginsPath + 'multiimage/images/',
    +		imageSizeLimit = K.undef(self.imageSizeLimit, '1MB'),
    +		imageFileTypes = K.undef(self.imageFileTypes, '*.jpg;*.gif;*.png'),
    +		imageUploadLimit = K.undef(self.imageUploadLimit, 20),
    +		lang = self.lang(name + '.');
    +
    +	self.plugin.multiImageDialog = function(options) {
    +		var clickFn = options.clickFn,
    +			uploadDesc = K.tmpl(lang.uploadDesc, {uploadLimit : imageUploadLimit, sizeLimit : imageSizeLimit});
    +		var html = [
    +			'<div style="padding:20px;">',
    +			'<div class="swfupload">',
    +			'</div>',
    +			'</div>'
    +		].join('');
    +		var dialog = self.createDialog({
    +			name : name,
    +			width : 650,
    +			height : 510,
    +			title : self.lang(name),
    +			body : html,
    +			previewBtn : {
    +				name : lang.insertAll,
    +				click : function(e) {
    +					clickFn.call(self, swfupload.getUrlList());
    +				}
    +			},
    +			yesBtn : {
    +				name : lang.clearAll,
    +				click : function(e) {
    +					swfupload.removeFiles();
    +				}
    +			},
    +			beforeRemove : function() {
    +				swfupload.remove();
    +			}
    +		}),
    +		div = dialog.div;
    +
    +		var swfupload = K.swfupload({
    +			container : K('.swfupload', div),
    +			buttonImageUrl : imgPath + (self.langType == 'zh_CN' ? 'select-files-zh_CN.png' : 'select-files-en.png'),
    +			buttonWidth : self.langType == 'zh_CN' ? 72 : 88,
    +			buttonHeight : 23,
    +			fileIconUrl : imgPath + 'image.png',
    +			uploadDesc : uploadDesc,
    +			startButtonValue : lang.startUpload,
    +			uploadUrl : K.addParam(uploadJson, 'dir=image'),
    +			flashUrl : imgPath + 'swfupload.swf',
    +			filePostName : 'imgFile',
    +			fileTypes : '*.jpg;*.jpeg;*.gif;*.png;*.bmp',
    +			fileTypesDesc : 'Image Files',
    +			fileUploadLimit : imageUploadLimit,
    +			fileSizeLimit : imageSizeLimit,
    +			queueLimitExceeded : lang.queueLimitExceeded,
    +			fileExceedsSizeLimit : lang.fileExceedsSizeLimit,
    +			zeroByteFile : lang.zeroByteFile,
    +			invalidFiletype : lang.invalidFiletype,
    +			unknownError : lang.unknownError,
    +			pendingMessage : lang.pending,
    +			errorMessage : lang.uploadError,
    +			afterError : function(html) {
    +				self.errorDialog(html);
    +			}
    +		});
    +
    +		return dialog;
    +	};
    +	self.clickToolbar(name, function() {
    +		self.plugin.multiImageDialog({
    +			clickFn : function (urlList) {
    +				if (urlList.length === 0) {
    +					return;
    +				}
    +				var html = '';
    +				K.each(urlList, function(i, url) {
    +					html += '<img src="' + K.escape(url) + '" data-ke-src="' + K.escape(url) + '" alt="" /><br />';
    +				});
    +				self.insertHtml(html);
    +				// Bugfix: [Firefox] 涓婁紶鍥剧墖鍚庯紝鎬绘槸鍑虹幇姝e湪鍔犺浇鐨勬牱寮忥紝闇瑕佸欢杩熸墽琛宧ideDialog
    +				setTimeout(function() {
    +					self.hideDialog().focus();
    +				}, 0);
    +			}
    +		});
    +	});
    +});
    +
    +
    +/**
    + * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
    + *
    + * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,  http://www.vinterwebb.se/
    + *
    + * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilz闁 and Mammon Media and is released under the MIT License:
    + * http://www.opensource.org/licenses/mit-license.php
    + *
    + * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
    + * http://www.opensource.org/licenses/mit-license.php
    + *
    + */
    +
    +
    +/* ******************* */
    +/* Constructor & Init  */
    +/* ******************* */
    +var SWFUpload;
    +
    +if (SWFUpload == undefined) {
    +	SWFUpload = function (settings) {
    +		this.initSWFUpload(settings);
    +	};
    +}
    +
    +SWFUpload.prototype.initSWFUpload = function (settings) {
    +	try {
    +		this.customSettings = {};	// A container where developers can place their own settings associated with this instance.
    +		this.settings = settings;
    +		this.eventQueue = [];
    +		this.movieName = "SWFUpload_" + SWFUpload.movieCount++;
    +		this.movieElement = null;
    +
    +
    +		// Setup global control tracking
    +		SWFUpload.instances[this.movieName] = this;
    +
    +		// Load the settings.  Load the Flash movie.
    +		this.initSettings();
    +		this.loadFlash();
    +		this.displayDebugInfo();
    +	} catch (ex) {
    +		delete SWFUpload.instances[this.movieName];
    +		throw ex;
    +	}
    +};
    +
    +/* *************** */
    +/* Static Members  */
    +/* *************** */
    +SWFUpload.instances = {};
    +SWFUpload.movieCount = 0;
    +SWFUpload.version = "2.2.0 2009-03-25";
    +SWFUpload.QUEUE_ERROR = {
    +	QUEUE_LIMIT_EXCEEDED	  		: -100,
    +	FILE_EXCEEDS_SIZE_LIMIT  		: -110,
    +	ZERO_BYTE_FILE			  		: -120,
    +	INVALID_FILETYPE		  		: -130
    +};
    +SWFUpload.UPLOAD_ERROR = {
    +	HTTP_ERROR				  		: -200,
    +	MISSING_UPLOAD_URL	      		: -210,
    +	IO_ERROR				  		: -220,
    +	SECURITY_ERROR			  		: -230,
    +	UPLOAD_LIMIT_EXCEEDED	  		: -240,
    +	UPLOAD_FAILED			  		: -250,
    +	SPECIFIED_FILE_ID_NOT_FOUND		: -260,
    +	FILE_VALIDATION_FAILED	  		: -270,
    +	FILE_CANCELLED			  		: -280,
    +	UPLOAD_STOPPED					: -290
    +};
    +SWFUpload.FILE_STATUS = {
    +	QUEUED		 : -1,
    +	IN_PROGRESS	 : -2,
    +	ERROR		 : -3,
    +	COMPLETE	 : -4,
    +	CANCELLED	 : -5
    +};
    +SWFUpload.BUTTON_ACTION = {
    +	SELECT_FILE  : -100,
    +	SELECT_FILES : -110,
    +	START_UPLOAD : -120
    +};
    +SWFUpload.CURSOR = {
    +	ARROW : -1,
    +	HAND : -2
    +};
    +SWFUpload.WINDOW_MODE = {
    +	WINDOW : "window",
    +	TRANSPARENT : "transparent",
    +	OPAQUE : "opaque"
    +};
    +
    +// Private: takes a URL, determines if it is relative and converts to an absolute URL
    +// using the current site. Only processes the URL if it can, otherwise returns the URL untouched
    +SWFUpload.completeURL = function(url) {
    +	if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//)) {
    +		return url;
    +	}
    +
    +	var currentURL = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : "");
    +
    +	var indexSlash = window.location.pathname.lastIndexOf("/");
    +	if (indexSlash <= 0) {
    +		path = "/";
    +	} else {
    +		path = window.location.pathname.substr(0, indexSlash) + "/";
    +	}
    +
    +	return /*currentURL +*/ path + url;
    +
    +};
    +
    +
    +/* ******************** */
    +/* Instance Members  */
    +/* ******************** */
    +
    +// Private: initSettings ensures that all the
    +// settings are set, getting a default value if one was not assigned.
    +SWFUpload.prototype.initSettings = function () {
    +	this.ensureDefault = function (settingName, defaultValue) {
    +		this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];
    +	};
    +
    +	// Upload backend settings
    +	this.ensureDefault("upload_url", "");
    +	this.ensureDefault("preserve_relative_urls", false);
    +	this.ensureDefault("file_post_name", "Filedata");
    +	this.ensureDefault("post_params", {});
    +	this.ensureDefault("use_query_string", false);
    +	this.ensureDefault("requeue_on_error", false);
    +	this.ensureDefault("http_success", []);
    +	this.ensureDefault("assume_success_timeout", 0);
    +
    +	// File Settings
    +	this.ensureDefault("file_types", "*.*");
    +	this.ensureDefault("file_types_description", "All Files");
    +	this.ensureDefault("file_size_limit", 0);	// Default zero means "unlimited"
    +	this.ensureDefault("file_upload_limit", 0);
    +	this.ensureDefault("file_queue_limit", 0);
    +
    +	// Flash Settings
    +	this.ensureDefault("flash_url", "swfupload.swf");
    +	this.ensureDefault("prevent_swf_caching", true);
    +
    +	// Button Settings
    +	this.ensureDefault("button_image_url", "");
    +	this.ensureDefault("button_width", 1);
    +	this.ensureDefault("button_height", 1);
    +	this.ensureDefault("button_text", "");
    +	this.ensureDefault("button_text_style", "color: #000000; font-size: 16pt;");
    +	this.ensureDefault("button_text_top_padding", 0);
    +	this.ensureDefault("button_text_left_padding", 0);
    +	this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES);
    +	this.ensureDefault("button_disabled", false);
    +	this.ensureDefault("button_placeholder_id", "");
    +	this.ensureDefault("button_placeholder", null);
    +	this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW);
    +	this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW);
    +
    +	// Debug Settings
    +	this.ensureDefault("debug", false);
    +	this.settings.debug_enabled = this.settings.debug;	// Here to maintain v2 API
    +
    +	// Event Handlers
    +	this.settings.return_upload_start_handler = this.returnUploadStart;
    +	this.ensureDefault("swfupload_loaded_handler", null);
    +	this.ensureDefault("file_dialog_start_handler", null);
    +	this.ensureDefault("file_queued_handler", null);
    +	this.ensureDefault("file_queue_error_handler", null);
    +	this.ensureDefault("file_dialog_complete_handler", null);
    +
    +	this.ensureDefault("upload_start_handler", null);
    +	this.ensureDefault("upload_progress_handler", null);
    +	this.ensureDefault("upload_error_handler", null);
    +	this.ensureDefault("upload_success_handler", null);
    +	this.ensureDefault("upload_complete_handler", null);
    +
    +	this.ensureDefault("debug_handler", this.debugMessage);
    +
    +	this.ensureDefault("custom_settings", {});
    +
    +	// Other settings
    +	this.customSettings = this.settings.custom_settings;
    +
    +	// Update the flash url if needed
    +	if (!!this.settings.prevent_swf_caching) {
    +		this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime();
    +	}
    +
    +	if (!this.settings.preserve_relative_urls) {
    +		//this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url);	// Don't need to do this one since flash doesn't look at it
    +		this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url);
    +		this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url);
    +	}
    +
    +	delete this.ensureDefault;
    +};
    +
    +// Private: loadFlash replaces the button_placeholder element with the flash movie.
    +SWFUpload.prototype.loadFlash = function () {
    +	var targetElement, tempParent;
    +
    +	// Make sure an element with the ID we are going to use doesn't already exist
    +	if (document.getElementById(this.movieName) !== null) {
    +		throw "ID " + this.movieName + " is already in use. The Flash Object could not be added";
    +	}
    +
    +	// Get the element where we will be placing the flash movie
    +	targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder;
    +
    +	if (targetElement == undefined) {
    +		throw "Could not find the placeholder element: " + this.settings.button_placeholder_id;
    +	}
    +
    +	// Append the container and load the flash
    +	tempParent = document.createElement("div");
    +	tempParent.innerHTML = this.getFlashHTML();	// Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)
    +	targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement);
    +
    +	// Fix IE Flash/Form bug
    +	if (window[this.movieName] == undefined) {
    +		window[this.movieName] = this.getMovieElement();
    +	}
    +
    +};
    +
    +// Private: getFlashHTML generates the object tag needed to embed the flash in to the document
    +SWFUpload.prototype.getFlashHTML = function () {
    +	// Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay
    +	return ['<object id="', this.movieName, '" type="application/x-shockwave-flash" data="', this.settings.flash_url, '" width="', this.settings.button_width, '" height="', this.settings.button_height, '" class="swfupload">',
    +				'<param name="wmode" value="', this.settings.button_window_mode, '" />',
    +				'<param name="movie" value="', this.settings.flash_url, '" />',
    +				'<param name="quality" value="high" />',
    +				'<param name="menu" value="false" />',
    +				'<param name="allowScriptAccess" value="always" />',
    +				'<param name="flashvars" value="' + this.getFlashVars() + '" />',
    +				'</object>'].join("");
    +};
    +
    +// Private: getFlashVars builds the parameter string that will be passed
    +// to flash in the flashvars param.
    +SWFUpload.prototype.getFlashVars = function () {
    +	// Build a string from the post param object
    +	var paramString = this.buildParamString();
    +	var httpSuccessString = this.settings.http_success.join(",");
    +
    +	// Build the parameter string
    +	return ["movieName=", encodeURIComponent(this.movieName),
    +			"&amp;uploadURL=", encodeURIComponent(this.settings.upload_url),
    +			"&amp;useQueryString=", encodeURIComponent(this.settings.use_query_string),
    +			"&amp;requeueOnError=", encodeURIComponent(this.settings.requeue_on_error),
    +			"&amp;httpSuccess=", encodeURIComponent(httpSuccessString),
    +			"&amp;assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout),
    +			"&amp;params=", encodeURIComponent(paramString),
    +			"&amp;filePostName=", encodeURIComponent(this.settings.file_post_name),
    +			"&amp;fileTypes=", encodeURIComponent(this.settings.file_types),
    +			"&amp;fileTypesDescription=", encodeURIComponent(this.settings.file_types_description),
    +			"&amp;fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit),
    +			"&amp;fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit),
    +			"&amp;fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit),
    +			"&amp;debugEnabled=", encodeURIComponent(this.settings.debug_enabled),
    +			"&amp;buttonImageURL=", encodeURIComponent(this.settings.button_image_url),
    +			"&amp;buttonWidth=", encodeURIComponent(this.settings.button_width),
    +			"&amp;buttonHeight=", encodeURIComponent(this.settings.button_height),
    +			"&amp;buttonText=", encodeURIComponent(this.settings.button_text),
    +			"&amp;buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding),
    +			"&amp;buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding),
    +			"&amp;buttonTextStyle=", encodeURIComponent(this.settings.button_text_style),
    +			"&amp;buttonAction=", encodeURIComponent(this.settings.button_action),
    +			"&amp;buttonDisabled=", encodeURIComponent(this.settings.button_disabled),
    +			"&amp;buttonCursor=", encodeURIComponent(this.settings.button_cursor)
    +		].join("");
    +};
    +
    +// Public: getMovieElement retrieves the DOM reference to the Flash element added by SWFUpload
    +// The element is cached after the first lookup
    +SWFUpload.prototype.getMovieElement = function () {
    +	if (this.movieElement == undefined) {
    +		this.movieElement = document.getElementById(this.movieName);
    +	}
    +
    +	if (this.movieElement === null) {
    +		throw "Could not find Flash element";
    +	}
    +
    +	return this.movieElement;
    +};
    +
    +// Private: buildParamString takes the name/value pairs in the post_params setting object
    +// and joins them up in to a string formatted "name=value&amp;name=value"
    +SWFUpload.prototype.buildParamString = function () {
    +	var postParams = this.settings.post_params;
    +	var paramStringPairs = [];
    +
    +	if (typeof(postParams) === "object") {
    +		for (var name in postParams) {
    +			if (postParams.hasOwnProperty(name)) {
    +				paramStringPairs.push(encodeURIComponent(name.toString()) + "=" + encodeURIComponent(postParams[name].toString()));
    +			}
    +		}
    +	}
    +
    +	return paramStringPairs.join("&amp;");
    +};
    +
    +// Public: Used to remove a SWFUpload instance from the page. This method strives to remove
    +// all references to the SWF, and other objects so memory is properly freed.
    +// Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state.
    +// Credits: Major improvements provided by steffen
    +SWFUpload.prototype.destroy = function () {
    +	try {
    +		// Make sure Flash is done before we try to remove it
    +		this.cancelUpload(null, false);
    +
    +
    +		// Remove the SWFUpload DOM nodes
    +		var movieElement = null;
    +		movieElement = this.getMovieElement();
    +
    +		if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
    +			// Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround)
    +			for (var i in movieElement) {
    +				try {
    +					if (typeof(movieElement[i]) === "function") {
    +						movieElement[i] = null;
    +					}
    +				} catch (ex1) {}
    +			}
    +
    +			// Remove the Movie Element from the page
    +			try {
    +				movieElement.parentNode.removeChild(movieElement);
    +			} catch (ex) {}
    +		}
    +
    +		// Remove IE form fix reference
    +		window[this.movieName] = null;
    +
    +		// Destroy other references
    +		SWFUpload.instances[this.movieName] = null;
    +		delete SWFUpload.instances[this.movieName];
    +
    +		this.movieElement = null;
    +		this.settings = null;
    +		this.customSettings = null;
    +		this.eventQueue = null;
    +		this.movieName = null;
    +
    +
    +		return true;
    +	} catch (ex2) {
    +		return false;
    +	}
    +};
    +
    +
    +// Public: displayDebugInfo prints out settings and configuration
    +// information about this SWFUpload instance.
    +// This function (and any references to it) can be deleted when placing
    +// SWFUpload in production.
    +SWFUpload.prototype.displayDebugInfo = function () {
    +	this.debug(
    +		[
    +			"---SWFUpload Instance Info---\n",
    +			"Version: ", SWFUpload.version, "\n",
    +			"Movie Name: ", this.movieName, "\n",
    +			"Settings:\n",
    +			"\t", "upload_url:               ", this.settings.upload_url, "\n",
    +			"\t", "flash_url:                ", this.settings.flash_url, "\n",
    +			"\t", "use_query_string:         ", this.settings.use_query_string.toString(), "\n",
    +			"\t", "requeue_on_error:         ", this.settings.requeue_on_error.toString(), "\n",
    +			"\t", "http_success:             ", this.settings.http_success.join(", "), "\n",
    +			"\t", "assume_success_timeout:   ", this.settings.assume_success_timeout, "\n",
    +			"\t", "file_post_name:           ", this.settings.file_post_name, "\n",
    +			"\t", "post_params:              ", this.settings.post_params.toString(), "\n",
    +			"\t", "file_types:               ", this.settings.file_types, "\n",
    +			"\t", "file_types_description:   ", this.settings.file_types_description, "\n",
    +			"\t", "file_size_limit:          ", this.settings.file_size_limit, "\n",
    +			"\t", "file_upload_limit:        ", this.settings.file_upload_limit, "\n",
    +			"\t", "file_queue_limit:         ", this.settings.file_queue_limit, "\n",
    +			"\t", "debug:                    ", this.settings.debug.toString(), "\n",
    +
    +			"\t", "prevent_swf_caching:      ", this.settings.prevent_swf_caching.toString(), "\n",
    +
    +			"\t", "button_placeholder_id:    ", this.settings.button_placeholder_id.toString(), "\n",
    +			"\t", "button_placeholder:       ", (this.settings.button_placeholder ? "Set" : "Not Set"), "\n",
    +			"\t", "button_image_url:         ", this.settings.button_image_url.toString(), "\n",
    +			"\t", "button_width:             ", this.settings.button_width.toString(), "\n",
    +			"\t", "button_height:            ", this.settings.button_height.toString(), "\n",
    +			"\t", "button_text:              ", this.settings.button_text.toString(), "\n",
    +			"\t", "button_text_style:        ", this.settings.button_text_style.toString(), "\n",
    +			"\t", "button_text_top_padding:  ", this.settings.button_text_top_padding.toString(), "\n",
    +			"\t", "button_text_left_padding: ", this.settings.button_text_left_padding.toString(), "\n",
    +			"\t", "button_action:            ", this.settings.button_action.toString(), "\n",
    +			"\t", "button_disabled:          ", this.settings.button_disabled.toString(), "\n",
    +
    +			"\t", "custom_settings:          ", this.settings.custom_settings.toString(), "\n",
    +			"Event Handlers:\n",
    +			"\t", "swfupload_loaded_handler assigned:  ", (typeof this.settings.swfupload_loaded_handler === "function").toString(), "\n",
    +			"\t", "file_dialog_start_handler assigned: ", (typeof this.settings.file_dialog_start_handler === "function").toString(), "\n",
    +			"\t", "file_queued_handler assigned:       ", (typeof this.settings.file_queued_handler === "function").toString(), "\n",
    +			"\t", "file_queue_error_handler assigned:  ", (typeof this.settings.file_queue_error_handler === "function").toString(), "\n",
    +			"\t", "upload_start_handler assigned:      ", (typeof this.settings.upload_start_handler === "function").toString(), "\n",
    +			"\t", "upload_progress_handler assigned:   ", (typeof this.settings.upload_progress_handler === "function").toString(), "\n",
    +			"\t", "upload_error_handler assigned:      ", (typeof this.settings.upload_error_handler === "function").toString(), "\n",
    +			"\t", "upload_success_handler assigned:    ", (typeof this.settings.upload_success_handler === "function").toString(), "\n",
    +			"\t", "upload_complete_handler assigned:   ", (typeof this.settings.upload_complete_handler === "function").toString(), "\n",
    +			"\t", "debug_handler assigned:             ", (typeof this.settings.debug_handler === "function").toString(), "\n"
    +		].join("")
    +	);
    +};
    +
    +/* Note: addSetting and getSetting are no longer used by SWFUpload but are included
    +	the maintain v2 API compatibility
    +*/
    +// Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used.
    +SWFUpload.prototype.addSetting = function (name, value, default_value) {
    +    if (value == undefined) {
    +        return (this.settings[name] = default_value);
    +    } else {
    +        return (this.settings[name] = value);
    +	}
    +};
    +
    +// Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found.
    +SWFUpload.prototype.getSetting = function (name) {
    +    if (this.settings[name] != undefined) {
    +        return this.settings[name];
    +	}
    +
    +    return "";
    +};
    +
    +
    +
    +// Private: callFlash handles function calls made to the Flash element.
    +// Calls are made with a setTimeout for some functions to work around
    +// bugs in the ExternalInterface library.
    +SWFUpload.prototype.callFlash = function (functionName, argumentArray) {
    +	argumentArray = argumentArray || [];
    +
    +	var movieElement = this.getMovieElement();
    +	var returnValue, returnString;
    +
    +	// Flash's method if calling ExternalInterface methods (code adapted from MooTools).
    +	try {
    +		returnString = movieElement.CallFunction('<invoke name="' + functionName + '" returntype="javascript">' + __flash__argumentsToXML(argumentArray, 0) + '</invoke>');
    +		returnValue = eval(returnString);
    +	} catch (ex) {
    +		throw "Call to " + functionName + " failed";
    +	}
    +
    +	// Unescape file post param values
    +	if (returnValue != undefined && typeof returnValue.post === "object") {
    +		returnValue = this.unescapeFilePostParams(returnValue);
    +	}
    +
    +	return returnValue;
    +};
    +
    +/* *****************************
    +	-- Flash control methods --
    +	Your UI should use these
    +	to operate SWFUpload
    +   ***************************** */
    +
    +// WARNING: this function does not work in Flash Player 10
    +// Public: selectFile causes a File Selection Dialog window to appear.  This
    +// dialog only allows 1 file to be selected.
    +SWFUpload.prototype.selectFile = function () {
    +	this.callFlash("SelectFile");
    +};
    +
    +// WARNING: this function does not work in Flash Player 10
    +// Public: selectFiles causes a File Selection Dialog window to appear/ This
    +// dialog allows the user to select any number of files
    +// Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names.
    +// If the selection name length is too long the dialog will fail in an unpredictable manner.  There is no work-around
    +// for this bug.
    +SWFUpload.prototype.selectFiles = function () {
    +	this.callFlash("SelectFiles");
    +};
    +
    +
    +// Public: startUpload starts uploading the first file in the queue unless
    +// the optional parameter 'fileID' specifies the ID
    +SWFUpload.prototype.startUpload = function (fileID) {
    +	this.callFlash("StartUpload", [fileID]);
    +};
    +
    +// Public: cancelUpload cancels any queued file.  The fileID parameter may be the file ID or index.
    +// If you do not specify a fileID the current uploading file or first file in the queue is cancelled.
    +// If you do not want the uploadError event to trigger you can specify false for the triggerErrorEvent parameter.
    +SWFUpload.prototype.cancelUpload = function (fileID, triggerErrorEvent) {
    +	if (triggerErrorEvent !== false) {
    +		triggerErrorEvent = true;
    +	}
    +	this.callFlash("CancelUpload", [fileID, triggerErrorEvent]);
    +};
    +
    +// Public: stopUpload stops the current upload and requeues the file at the beginning of the queue.
    +// If nothing is currently uploading then nothing happens.
    +SWFUpload.prototype.stopUpload = function () {
    +	this.callFlash("StopUpload");
    +};
    +
    +/* ************************
    + * Settings methods
    + *   These methods change the SWFUpload settings.
    + *   SWFUpload settings should not be changed directly on the settings object
    + *   since many of the settings need to be passed to Flash in order to take
    + *   effect.
    + * *********************** */
    +
    +// Public: getStats gets the file statistics object.
    +SWFUpload.prototype.getStats = function () {
    +	return this.callFlash("GetStats");
    +};
    +
    +// Public: setStats changes the SWFUpload statistics.  You shouldn't need to
    +// change the statistics but you can.  Changing the statistics does not
    +// affect SWFUpload accept for the successful_uploads count which is used
    +// by the upload_limit setting to determine how many files the user may upload.
    +SWFUpload.prototype.setStats = function (statsObject) {
    +	this.callFlash("SetStats", [statsObject]);
    +};
    +
    +// Public: getFile retrieves a File object by ID or Index.  If the file is
    +// not found then 'null' is returned.
    +SWFUpload.prototype.getFile = function (fileID) {
    +	if (typeof(fileID) === "number") {
    +		return this.callFlash("GetFileByIndex", [fileID]);
    +	} else {
    +		return this.callFlash("GetFile", [fileID]);
    +	}
    +};
    +
    +// Public: addFileParam sets a name/value pair that will be posted with the
    +// file specified by the Files ID.  If the name already exists then the
    +// exiting value will be overwritten.
    +SWFUpload.prototype.addFileParam = function (fileID, name, value) {
    +	return this.callFlash("AddFileParam", [fileID, name, value]);
    +};
    +
    +// Public: removeFileParam removes a previously set (by addFileParam) name/value
    +// pair from the specified file.
    +SWFUpload.prototype.removeFileParam = function (fileID, name) {
    +	this.callFlash("RemoveFileParam", [fileID, name]);
    +};
    +
    +// Public: setUploadUrl changes the upload_url setting.
    +SWFUpload.prototype.setUploadURL = function (url) {
    +	this.settings.upload_url = url.toString();
    +	this.callFlash("SetUploadURL", [url]);
    +};
    +
    +// Public: setPostParams changes the post_params setting
    +SWFUpload.prototype.setPostParams = function (paramsObject) {
    +	this.settings.post_params = paramsObject;
    +	this.callFlash("SetPostParams", [paramsObject]);
    +};
    +
    +// Public: addPostParam adds post name/value pair.  Each name can have only one value.
    +SWFUpload.prototype.addPostParam = function (name, value) {
    +	this.settings.post_params[name] = value;
    +	this.callFlash("SetPostParams", [this.settings.post_params]);
    +};
    +
    +// Public: removePostParam deletes post name/value pair.
    +SWFUpload.prototype.removePostParam = function (name) {
    +	delete this.settings.post_params[name];
    +	this.callFlash("SetPostParams", [this.settings.post_params]);
    +};
    +
    +// Public: setFileTypes changes the file_types setting and the file_types_description setting
    +SWFUpload.prototype.setFileTypes = function (types, description) {
    +	this.settings.file_types = types;
    +	this.settings.file_types_description = description;
    +	this.callFlash("SetFileTypes", [types, description]);
    +};
    +
    +// Public: setFileSizeLimit changes the file_size_limit setting
    +SWFUpload.prototype.setFileSizeLimit = function (fileSizeLimit) {
    +	this.settings.file_size_limit = fileSizeLimit;
    +	this.callFlash("SetFileSizeLimit", [fileSizeLimit]);
    +};
    +
    +// Public: setFileUploadLimit changes the file_upload_limit setting
    +SWFUpload.prototype.setFileUploadLimit = function (fileUploadLimit) {
    +	this.settings.file_upload_limit = fileUploadLimit;
    +	this.callFlash("SetFileUploadLimit", [fileUploadLimit]);
    +};
    +
    +// Public: setFileQueueLimit changes the file_queue_limit setting
    +SWFUpload.prototype.setFileQueueLimit = function (fileQueueLimit) {
    +	this.settings.file_queue_limit = fileQueueLimit;
    +	this.callFlash("SetFileQueueLimit", [fileQueueLimit]);
    +};
    +
    +// Public: setFilePostName changes the file_post_name setting
    +SWFUpload.prototype.setFilePostName = function (filePostName) {
    +	this.settings.file_post_name = filePostName;
    +	this.callFlash("SetFilePostName", [filePostName]);
    +};
    +
    +// Public: setUseQueryString changes the use_query_string setting
    +SWFUpload.prototype.setUseQueryString = function (useQueryString) {
    +	this.settings.use_query_string = useQueryString;
    +	this.callFlash("SetUseQueryString", [useQueryString]);
    +};
    +
    +// Public: setRequeueOnError changes the requeue_on_error setting
    +SWFUpload.prototype.setRequeueOnError = function (requeueOnError) {
    +	this.settings.requeue_on_error = requeueOnError;
    +	this.callFlash("SetRequeueOnError", [requeueOnError]);
    +};
    +
    +// Public: setHTTPSuccess changes the http_success setting
    +SWFUpload.prototype.setHTTPSuccess = function (http_status_codes) {
    +	if (typeof http_status_codes === "string") {
    +		http_status_codes = http_status_codes.replace(" ", "").split(",");
    +	}
    +
    +	this.settings.http_success = http_status_codes;
    +	this.callFlash("SetHTTPSuccess", [http_status_codes]);
    +};
    +
    +// Public: setHTTPSuccess changes the http_success setting
    +SWFUpload.prototype.setAssumeSuccessTimeout = function (timeout_seconds) {
    +	this.settings.assume_success_timeout = timeout_seconds;
    +	this.callFlash("SetAssumeSuccessTimeout", [timeout_seconds]);
    +};
    +
    +// Public: setDebugEnabled changes the debug_enabled setting
    +SWFUpload.prototype.setDebugEnabled = function (debugEnabled) {
    +	this.settings.debug_enabled = debugEnabled;
    +	this.callFlash("SetDebugEnabled", [debugEnabled]);
    +};
    +
    +// Public: setButtonImageURL loads a button image sprite
    +SWFUpload.prototype.setButtonImageURL = function (buttonImageURL) {
    +	if (buttonImageURL == undefined) {
    +		buttonImageURL = "";
    +	}
    +
    +	this.settings.button_image_url = buttonImageURL;
    +	this.callFlash("SetButtonImageURL", [buttonImageURL]);
    +};
    +
    +// Public: setButtonDimensions resizes the Flash Movie and button
    +SWFUpload.prototype.setButtonDimensions = function (width, height) {
    +	this.settings.button_width = width;
    +	this.settings.button_height = height;
    +
    +	var movie = this.getMovieElement();
    +	if (movie != undefined) {
    +		movie.style.width = width + "px";
    +		movie.style.height = height + "px";
    +	}
    +
    +	this.callFlash("SetButtonDimensions", [width, height]);
    +};
    +// Public: setButtonText Changes the text overlaid on the button
    +SWFUpload.prototype.setButtonText = function (html) {
    +	this.settings.button_text = html;
    +	this.callFlash("SetButtonText", [html]);
    +};
    +// Public: setButtonTextPadding changes the top and left padding of the text overlay
    +SWFUpload.prototype.setButtonTextPadding = function (left, top) {
    +	this.settings.button_text_top_padding = top;
    +	this.settings.button_text_left_padding = left;
    +	this.callFlash("SetButtonTextPadding", [left, top]);
    +};
    +
    +// Public: setButtonTextStyle changes the CSS used to style the HTML/Text overlaid on the button
    +SWFUpload.prototype.setButtonTextStyle = function (css) {
    +	this.settings.button_text_style = css;
    +	this.callFlash("SetButtonTextStyle", [css]);
    +};
    +// Public: setButtonDisabled disables/enables the button
    +SWFUpload.prototype.setButtonDisabled = function (isDisabled) {
    +	this.settings.button_disabled = isDisabled;
    +	this.callFlash("SetButtonDisabled", [isDisabled]);
    +};
    +// Public: setButtonAction sets the action that occurs when the button is clicked
    +SWFUpload.prototype.setButtonAction = function (buttonAction) {
    +	this.settings.button_action = buttonAction;
    +	this.callFlash("SetButtonAction", [buttonAction]);
    +};
    +
    +// Public: setButtonCursor changes the mouse cursor displayed when hovering over the button
    +SWFUpload.prototype.setButtonCursor = function (cursor) {
    +	this.settings.button_cursor = cursor;
    +	this.callFlash("SetButtonCursor", [cursor]);
    +};
    +
    +/* *******************************
    +	Flash Event Interfaces
    +	These functions are used by Flash to trigger the various
    +	events.
    +
    +	All these functions a Private.
    +
    +	Because the ExternalInterface library is buggy the event calls
    +	are added to a queue and the queue then executed by a setTimeout.
    +	This ensures that events are executed in a determinate order and that
    +	the ExternalInterface bugs are avoided.
    +******************************* */
    +
    +SWFUpload.prototype.queueEvent = function (handlerName, argumentArray) {
    +	// Warning: Don't call this.debug inside here or you'll create an infinite loop
    +
    +	if (argumentArray == undefined) {
    +		argumentArray = [];
    +	} else if (!(argumentArray instanceof Array)) {
    +		argumentArray = [argumentArray];
    +	}
    +
    +	var self = this;
    +	if (typeof this.settings[handlerName] === "function") {
    +		// Queue the event
    +		this.eventQueue.push(function () {
    +			this.settings[handlerName].apply(this, argumentArray);
    +		});
    +
    +		// Execute the next queued event
    +		setTimeout(function () {
    +			self.executeNextEvent();
    +		}, 0);
    +
    +	} else if (this.settings[handlerName] !== null) {
    +		throw "Event handler " + handlerName + " is unknown or is not a function";
    +	}
    +};
    +
    +// Private: Causes the next event in the queue to be executed.  Since events are queued using a setTimeout
    +// we must queue them in order to garentee that they are executed in order.
    +SWFUpload.prototype.executeNextEvent = function () {
    +	// Warning: Don't call this.debug inside here or you'll create an infinite loop
    +
    +	var  f = this.eventQueue ? this.eventQueue.shift() : null;
    +	if (typeof(f) === "function") {
    +		f.apply(this);
    +	}
    +};
    +
    +// Private: unescapeFileParams is part of a workaround for a flash bug where objects passed through ExternalInterface cannot have
    +// properties that contain characters that are not valid for JavaScript identifiers. To work around this
    +// the Flash Component escapes the parameter names and we must unescape again before passing them along.
    +SWFUpload.prototype.unescapeFilePostParams = function (file) {
    +	var reg = /[$]([0-9a-f]{4})/i;
    +	var unescapedPost = {};
    +	var uk;
    +
    +	if (file != undefined) {
    +		for (var k in file.post) {
    +			if (file.post.hasOwnProperty(k)) {
    +				uk = k;
    +				var match;
    +				while ((match = reg.exec(uk)) !== null) {
    +					uk = uk.replace(match[0], String.fromCharCode(parseInt("0x" + match[1], 16)));
    +				}
    +				unescapedPost[uk] = file.post[k];
    +			}
    +		}
    +
    +		file.post = unescapedPost;
    +	}
    +
    +	return file;
    +};
    +
    +// Private: Called by Flash to see if JS can call in to Flash (test if External Interface is working)
    +SWFUpload.prototype.testExternalInterface = function () {
    +	try {
    +		return this.callFlash("TestExternalInterface");
    +	} catch (ex) {
    +		return false;
    +	}
    +};
    +
    +// Private: This event is called by Flash when it has finished loading. Don't modify this.
    +// Use the swfupload_loaded_handler event setting to execute custom code when SWFUpload has loaded.
    +SWFUpload.prototype.flashReady = function () {
    +	// Check that the movie element is loaded correctly with its ExternalInterface methods defined
    +	var movieElement = this.getMovieElement();
    +
    +	if (!movieElement) {
    +		this.debug("Flash called back ready but the flash movie can't be found.");
    +		return;
    +	}
    +
    +	this.cleanUp(movieElement);
    +
    +	this.queueEvent("swfupload_loaded_handler");
    +};
    +
    +// Private: removes Flash added fuctions to the DOM node to prevent memory leaks in IE.
    +// This function is called by Flash each time the ExternalInterface functions are created.
    +SWFUpload.prototype.cleanUp = function (movieElement) {
    +	// Pro-actively unhook all the Flash functions
    +	try {
    +		if (this.movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
    +			this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");
    +			for (var key in movieElement) {
    +				try {
    +					if (typeof(movieElement[key]) === "function") {
    +						movieElement[key] = null;
    +					}
    +				} catch (ex) {
    +				}
    +			}
    +		}
    +	} catch (ex1) {
    +
    +	}
    +
    +	// Fix Flashes own cleanup code so if the SWFMovie was removed from the page
    +	// it doesn't display errors.
    +	window["__flash__removeCallback"] = function (instance, name) {
    +		try {
    +			if (instance) {
    +				instance[name] = null;
    +			}
    +		} catch (flashEx) {
    +
    +		}
    +	};
    +
    +};
    +
    +
    +/* This is a chance to do something before the browse window opens */
    +SWFUpload.prototype.fileDialogStart = function () {
    +	this.queueEvent("file_dialog_start_handler");
    +};
    +
    +
    +/* Called when a file is successfully added to the queue. */
    +SWFUpload.prototype.fileQueued = function (file) {
    +	file = this.unescapeFilePostParams(file);
    +	this.queueEvent("file_queued_handler", file);
    +};
    +
    +
    +/* Handle errors that occur when an attempt to queue a file fails. */
    +SWFUpload.prototype.fileQueueError = function (file, errorCode, message) {
    +	file = this.unescapeFilePostParams(file);
    +	this.queueEvent("file_queue_error_handler", [file, errorCode, message]);
    +};
    +
    +/* Called after the file dialog has closed and the selected files have been queued.
    +	You could call startUpload here if you want the queued files to begin uploading immediately. */
    +SWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued, numFilesInQueue) {
    +	this.queueEvent("file_dialog_complete_handler", [numFilesSelected, numFilesQueued, numFilesInQueue]);
    +};
    +
    +SWFUpload.prototype.uploadStart = function (file) {
    +	file = this.unescapeFilePostParams(file);
    +	this.queueEvent("return_upload_start_handler", file);
    +};
    +
    +SWFUpload.prototype.returnUploadStart = function (file) {
    +	var returnValue;
    +	if (typeof this.settings.upload_start_handler === "function") {
    +		file = this.unescapeFilePostParams(file);
    +		returnValue = this.settings.upload_start_handler.call(this, file);
    +	} else if (this.settings.upload_start_handler != undefined) {
    +		throw "upload_start_handler must be a function";
    +	}
    +
    +	// Convert undefined to true so if nothing is returned from the upload_start_handler it is
    +	// interpretted as 'true'.
    +	if (returnValue === undefined) {
    +		returnValue = true;
    +	}
    +
    +	returnValue = !!returnValue;
    +
    +	this.callFlash("ReturnUploadStart", [returnValue]);
    +};
    +
    +
    +
    +SWFUpload.prototype.uploadProgress = function (file, bytesComplete, bytesTotal) {
    +	file = this.unescapeFilePostParams(file);
    +	this.queueEvent("upload_progress_handler", [file, bytesComplete, bytesTotal]);
    +};
    +
    +SWFUpload.prototype.uploadError = function (file, errorCode, message) {
    +	file = this.unescapeFilePostParams(file);
    +	this.queueEvent("upload_error_handler", [file, errorCode, message]);
    +};
    +
    +SWFUpload.prototype.uploadSuccess = function (file, serverData, responseReceived) {
    +	file = this.unescapeFilePostParams(file);
    +	this.queueEvent("upload_success_handler", [file, serverData, responseReceived]);
    +};
    +
    +SWFUpload.prototype.uploadComplete = function (file) {
    +	file = this.unescapeFilePostParams(file);
    +	this.queueEvent("upload_complete_handler", file);
    +};
    +
    +/* Called by SWFUpload JavaScript and Flash functions when debug is enabled. By default it writes messages to the
    +   internal debug console.  You can override this event and have messages written where you want. */
    +SWFUpload.prototype.debug = function (message) {
    +	this.queueEvent("debug_handler", message);
    +};
    +
    +
    +/* **********************************
    +	Debug Console
    +	The debug console is a self contained, in page location
    +	for debug message to be sent.  The Debug Console adds
    +	itself to the body if necessary.
    +
    +	The console is automatically scrolled as messages appear.
    +
    +	If you are using your own debug handler or when you deploy to production and
    +	have debug disabled you can remove these functions to reduce the file size
    +	and complexity.
    +********************************** */
    +
    +// Private: debugMessage is the default debug_handler.  If you want to print debug messages
    +// call the debug() function.  When overriding the function your own function should
    +// check to see if the debug setting is true before outputting debug information.
    +SWFUpload.prototype.debugMessage = function (message) {
    +	if (this.settings.debug) {
    +		var exceptionMessage, exceptionValues = [];
    +
    +		// Check for an exception object and print it nicely
    +		if (typeof message === "object" && typeof message.name === "string" && typeof message.message === "string") {
    +			for (var key in message) {
    +				if (message.hasOwnProperty(key)) {
    +					exceptionValues.push(key + ": " + message[key]);
    +				}
    +			}
    +			exceptionMessage = exceptionValues.join("\n") || "";
    +			exceptionValues = exceptionMessage.split("\n");
    +			exceptionMessage = "EXCEPTION: " + exceptionValues.join("\nEXCEPTION: ");
    +			SWFUpload.Console.writeLine(exceptionMessage);
    +		} else {
    +			SWFUpload.Console.writeLine(message);
    +		}
    +	}
    +};
    +
    +SWFUpload.Console = {};
    +SWFUpload.Console.writeLine = function (message) {
    +	var console, documentForm;
    +
    +	try {
    +		console = document.getElementById("SWFUpload_Console");
    +
    +		if (!console) {
    +			documentForm = document.createElement("form");
    +			document.getElementsByTagName("body")[0].appendChild(documentForm);
    +
    +			console = document.createElement("textarea");
    +			console.id = "SWFUpload_Console";
    +			console.style.fontFamily = "monospace";
    +			console.setAttribute("wrap", "off");
    +			console.wrap = "off";
    +			console.style.overflow = "auto";
    +			console.style.width = "700px";
    +			console.style.height = "350px";
    +			console.style.margin = "5px";
    +			documentForm.appendChild(console);
    +		}
    +
    +		console.value += message + "\n";
    +
    +		console.scrollTop = console.scrollHeight - console.clientHeight;
    +	} catch (ex) {
    +		alert("Exception: " + ex.name + " Message: " + ex.message);
    +	}
    +};
    +
    +/*
    +	Queue Plug-in
    +
    +	Features:
    +		*Adds a cancelQueue() method for cancelling the entire queue.
    +		*All queued files are uploaded when startUpload() is called.
    +		*If false is returned from uploadComplete then the queue upload is stopped.
    +		 If false is not returned (strict comparison) then the queue upload is continued.
    +		*Adds a QueueComplete event that is fired when all the queued files have finished uploading.
    +		 Set the event handler with the queue_complete_handler setting.
    +
    +	*/
    +
    +if (typeof(SWFUpload) === "function") {
    +	SWFUpload.queue = {};
    +
    +	SWFUpload.prototype.initSettings = (function (oldInitSettings) {
    +		return function () {
    +			if (typeof(oldInitSettings) === "function") {
    +				oldInitSettings.call(this);
    +			}
    +
    +			this.queueSettings = {};
    +
    +			this.queueSettings.queue_cancelled_flag = false;
    +			this.queueSettings.queue_upload_count = 0;
    +
    +			this.queueSettings.user_upload_complete_handler = this.settings.upload_complete_handler;
    +			this.queueSettings.user_upload_start_handler = this.settings.upload_start_handler;
    +			this.settings.upload_complete_handler = SWFUpload.queue.uploadCompleteHandler;
    +			this.settings.upload_start_handler = SWFUpload.queue.uploadStartHandler;
    +
    +			this.settings.queue_complete_handler = this.settings.queue_complete_handler || null;
    +		};
    +	})(SWFUpload.prototype.initSettings);
    +
    +	SWFUpload.prototype.startUpload = function (fileID) {
    +		this.queueSettings.queue_cancelled_flag = false;
    +		this.callFlash("StartUpload", [fileID]);
    +	};
    +
    +	SWFUpload.prototype.cancelQueue = function () {
    +		this.queueSettings.queue_cancelled_flag = true;
    +		this.stopUpload();
    +
    +		var stats = this.getStats();
    +		while (stats.files_queued > 0) {
    +			this.cancelUpload();
    +			stats = this.getStats();
    +		}
    +	};
    +
    +	SWFUpload.queue.uploadStartHandler = function (file) {
    +		var returnValue;
    +		if (typeof(this.queueSettings.user_upload_start_handler) === "function") {
    +			returnValue = this.queueSettings.user_upload_start_handler.call(this, file);
    +		}
    +
    +		// To prevent upload a real "FALSE" value must be returned, otherwise default to a real "TRUE" value.
    +		returnValue = (returnValue === false) ? false : true;
    +
    +		this.queueSettings.queue_cancelled_flag = !returnValue;
    +
    +		return returnValue;
    +	};
    +
    +	SWFUpload.queue.uploadCompleteHandler = function (file) {
    +		var user_upload_complete_handler = this.queueSettings.user_upload_complete_handler;
    +		var continueUpload;
    +
    +		if (file.filestatus === SWFUpload.FILE_STATUS.COMPLETE) {
    +			this.queueSettings.queue_upload_count++;
    +		}
    +
    +		if (typeof(user_upload_complete_handler) === "function") {
    +			continueUpload = (user_upload_complete_handler.call(this, file) === false) ? false : true;
    +		} else if (file.filestatus === SWFUpload.FILE_STATUS.QUEUED) {
    +			// If the file was stopped and re-queued don't restart the upload
    +			continueUpload = false;
    +		} else {
    +			continueUpload = true;
    +		}
    +
    +		if (continueUpload) {
    +			var stats = this.getStats();
    +			if (stats.files_queued > 0 && this.queueSettings.queue_cancelled_flag === false) {
    +				this.startUpload();
    +			} else if (this.queueSettings.queue_cancelled_flag === false) {
    +				this.queueEvent("queue_complete_handler", [this.queueSettings.queue_upload_count]);
    +				this.queueSettings.queue_upload_count = 0;
    +			} else {
    +				this.queueSettings.queue_cancelled_flag = false;
    +				this.queueSettings.queue_upload_count = 0;
    +			}
    +		}
    +	};
    +}
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/pagebreak/pagebreak.js b/src/main/webapp/plug-in/kindeditor/plugins/pagebreak/pagebreak.js
    new file mode 100644
    index 00000000..5ba3adf0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/pagebreak/pagebreak.js
    @@ -0,0 +1,26 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('pagebreak', function(K) {
    +	var self = this, name = 'pagebreak';
    +	self.clickToolbar(name, function() {
    +		var cmd = self.cmd, range = cmd.range;
    +		self.focus();
    +		range.enlarge(true);
    +		cmd.split(true);
    +		var tail = self.newlineTag == 'br' || K.WEBKIT ? '' : '<p id="__kindeditor_tail_tag__"></p>';
    +		self.insertHtml('<hr style="page-break-after: always;" class="ke-pagebreak" />' + tail);
    +		if (tail !== '') {
    +			var p = K('#__kindeditor_tail_tag__', self.edit.doc);
    +			range.selectNodeContents(p[0]);
    +			p.removeAttr('id');
    +			cmd.select();
    +		}
    +	});
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/plainpaste/plainpaste.js b/src/main/webapp/plug-in/kindeditor/plugins/plainpaste/plainpaste.js
    new file mode 100644
    index 00000000..8f7bed80
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/plainpaste/plainpaste.js
    @@ -0,0 +1,41 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('plainpaste', function(K) {
    +	var self = this, name = 'plainpaste';
    +	self.clickToolbar(name, function() {
    +		var lang = self.lang(name + '.'),
    +			html = '<div style="padding:10px 20px;">' +
    +				'<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
    +				'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>' +
    +				'</div>',
    +			dialog = self.createDialog({
    +				name : name,
    +				width : 450,
    +				title : self.lang(name),
    +				body : html,
    +				yesBtn : {
    +					name : self.lang('yes'),
    +					click : function(e) {
    +						var html = textarea.val();
    +						html = K.escape(html);
    +						html = html.replace(/ {2}/g, ' &nbsp;');
    +						if (self.newlineTag == 'p') {
    +							html = html.replace(/^/, '<p>').replace(/$/, '</p>').replace(/\n/g, '</p><p>');
    +						} else {
    +							html = html.replace(/\n/g, '<br />$&');
    +						}
    +						self.insertHtml(html).hideDialog().focus();
    +					}
    +				}
    +			}),
    +			textarea = K('textarea', dialog.div);
    +		textarea[0].focus();
    +	});
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/preview/preview.js b/src/main/webapp/plug-in/kindeditor/plugins/preview/preview.js
    new file mode 100644
    index 00000000..ef6e2cf1
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/preview/preview.js
    @@ -0,0 +1,31 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('preview', function(K) {
    +	var self = this, name = 'preview', undefined;
    +	self.clickToolbar(name, function() {
    +		var lang = self.lang(name + '.'),
    +			html = '<div style="padding:10px 20px;">' +
    +				'<iframe class="ke-textarea" frameborder="0" style="width:708px;height:400px;"></iframe>' +
    +				'</div>',
    +			dialog = self.createDialog({
    +				name : name,
    +				width : 750,
    +				title : self.lang(name),
    +				body : html
    +			}),
    +			iframe = K('iframe', dialog.div),
    +			doc = K.iframeDoc(iframe);
    +		doc.open();
    +		doc.write(self.fullHtml());
    +		doc.close();
    +		K(doc.body).css('background-color', '#FFF');
    +		iframe[0].contentWindow.focus();
    +	});
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/quickformat/quickformat.js b/src/main/webapp/plug-in/kindeditor/plugins/quickformat/quickformat.js
    new file mode 100644
    index 00000000..5b98c722
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/quickformat/quickformat.js
    @@ -0,0 +1,81 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('quickformat', function(K) {
    +	var self = this, name = 'quickformat',
    +		blockMap = K.toMap('blockquote,center,div,h1,h2,h3,h4,h5,h6,p');
    +	function getFirstChild(knode) {
    +		var child = knode.first();
    +		while (child && child.first()) {
    +			child = child.first();
    +		}
    +		return child;
    +	}
    +	self.clickToolbar(name, function() {
    +		self.focus();
    +		var doc = self.edit.doc,
    +			range = self.cmd.range,
    +			child = K(doc.body).first(), next,
    +			nodeList = [], subList = [],
    +			bookmark = range.createBookmark(true);
    +		while(child) {
    +			next = child.next();
    +			var firstChild = getFirstChild(child);
    +			if (!firstChild || firstChild.name != 'img') {
    +				if (blockMap[child.name]) {
    +					child.html(child.html().replace(/^(\s|&nbsp;|銆)+/ig, ''));
    +					child.css('text-indent', '2em');
    +				} else {
    +					subList.push(child);
    +				}
    +				if (!next || (blockMap[next.name] || blockMap[child.name] && !blockMap[next.name])) {
    +					if (subList.length > 0) {
    +						nodeList.push(subList);
    +					}
    +					subList = [];
    +				}
    +			}
    +			child = next;
    +		}
    +		K.each(nodeList, function(i, subList) {
    +			var wrapper = K('<p style="text-indent:2em;"></p>', doc);
    +			subList[0].before(wrapper);
    +			K.each(subList, function(i, knode) {
    +				wrapper.append(knode);
    +			});
    +		});
    +		range.moveToBookmark(bookmark);
    +		self.addBookmark();
    +	});
    +});
    +
    +/**
    +--------------------------
    +abcd<br />
    +1234<br />
    +
    +to
    +
    +<p style="text-indent:2em;">
    +	abcd<br />
    +	1234<br />
    +</p>
    +
    +--------------------------
    +
    +&nbsp; abcd<img>1233
    +<p>1234</p>
    +
    +to
    +
    +<p style="text-indent:2em;">abcd<img>1233</p>
    +<p style="text-indent:2em;">1234</p>
    +
    +--------------------------
    +*/
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/table/table.js b/src/main/webapp/plug-in/kindeditor/plugins/table/table.js
    new file mode 100644
    index 00000000..9a50487e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/table/table.js
    @@ -0,0 +1,686 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('table', function(K) {
    +	var self = this, name = 'table', lang = self.lang(name + '.'), zeroborder = 'ke-zeroborder';
    +	// 璁剧疆棰滆壊
    +	function _setColor(box, color) {
    +		color = color.toUpperCase();
    +		box.css('background-color', color);
    +		box.css('color', color === '#000000' ? '#FFFFFF' : '#000000');
    +		box.html(color);
    +	}
    +	// 鍒濆鍖栧彇鑹插櫒
    +	var pickerList = [];
    +	function _initColorPicker(dialogDiv, colorBox) {
    +		colorBox.bind('click,mousedown', function(e){
    +			e.stopPropagation();
    +		});
    +		function removePicker() {
    +			K.each(pickerList, function() {
    +				this.remove();
    +			});
    +			pickerList = [];
    +			K(document).unbind('click,mousedown', removePicker);
    +			dialogDiv.unbind('click,mousedown', removePicker);
    +		}
    +		colorBox.click(function(e) {
    +			removePicker();
    +			var box = K(this),
    +				pos = box.pos();
    +			var picker = K.colorpicker({
    +				x : pos.x,
    +				y : pos.y + box.height(),
    +				z : 811214,
    +				selectedColor : K(this).html(),
    +				colors : self.colorTable,
    +				noColor : self.lang('noColor'),
    +				shadowMode : self.shadowMode,
    +				click : function(color) {
    +					_setColor(box, color);
    +					removePicker();
    +				}
    +			});
    +			pickerList.push(picker);
    +			K(document).bind('click,mousedown', removePicker);
    +			dialogDiv.bind('click,mousedown', removePicker);
    +		});
    +	}
    +	// 鍙栧緱涓嬩竴琛宑ell鐨刬ndex
    +	function _getCellIndex(table, row, cell) {
    +		var rowSpanCount = 0;
    +		for (var i = 0, len = row.cells.length; i < len; i++) {
    +			if (row.cells[i] == cell) {
    +				break;
    +			}
    +			rowSpanCount += row.cells[i].rowSpan - 1;
    +		}
    +		return cell.cellIndex - rowSpanCount;
    +	}
    +	self.plugin.table = {
    +		//insert or modify table
    +		prop : function(isInsert) {
    +			var html = [
    +				'<div style="padding:20px;">',
    +				//rows, cols
    +				'<div class="ke-dialog-row">',
    +				'<label for="keRows" style="width:90px;">' + lang.cells + '</label>',
    +				lang.rows + ' <input type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" /> &nbsp; ',
    +				lang.cols + ' <input type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />',
    +				'</div>',
    +				//width, height
    +				'<div class="ke-dialog-row">',
    +				'<label for="keWidth" style="width:90px;">' + lang.size + '</label>',
    +				lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
    +				'<select name="widthType">',
    +				'<option value="%">' + lang.percent + '</option>',
    +				'<option value="px">' + lang.px + '</option>',
    +				'</select> &nbsp; ',
    +				lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
    +				'<select name="heightType">',
    +				'<option value="%">' + lang.percent + '</option>',
    +				'<option value="px">' + lang.px + '</option>',
    +				'</select>',
    +				'</div>',
    +				//space, padding
    +				'<div class="ke-dialog-row">',
    +				'<label for="kePadding" style="width:90px;">' + lang.space + '</label>',
    +				lang.padding + ' <input type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" /> &nbsp; ',
    +				lang.spacing + ' <input type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />',
    +				'</div>',
    +				//align
    +				'<div class="ke-dialog-row">',
    +				'<label for="keAlign" style="width:90px;">' + lang.align + '</label>',
    +				'<select id="keAlign" name="align">',
    +				'<option value="">' + lang.alignDefault + '</option>',
    +				'<option value="left">' + lang.alignLeft + '</option>',
    +				'<option value="center">' + lang.alignCenter + '</option>',
    +				'<option value="right">' + lang.alignRight + '</option>',
    +				'</select>',
    +				'</div>',
    +				//border
    +				'<div class="ke-dialog-row">',
    +				'<label for="keBorder" style="width:90px;">' + lang.border + '</label>',
    +				lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
    +				lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
    +				'</div>',
    +				//background color
    +				'<div class="ke-dialog-row">',
    +				'<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>',
    +				'<span class="ke-inline-block ke-input-color"></span>',
    +				'</div>',
    +				'</div>'
    +			].join('');
    +			var dialog = self.createDialog({
    +				name : name,
    +				width : 500,
    +				title : self.lang(name),
    +				body : html,
    +				beforeRemove : function() {
    +					colorBox.unbind();
    +				},
    +				yesBtn : {
    +					name : self.lang('yes'),
    +					click : function(e) {
    +						var rows = rowsBox.val(),
    +							cols = colsBox.val(),
    +							width = widthBox.val(),
    +							height = heightBox.val(),
    +							widthType = widthTypeBox.val(),
    +							heightType = heightTypeBox.val(),
    +							padding = paddingBox.val(),
    +							spacing = spacingBox.val(),
    +							align = alignBox.val(),
    +							border = borderBox.val(),
    +							borderColor = K(colorBox[0]).html() || '',
    +							bgColor = K(colorBox[1]).html() || '';
    +						if (rows == 0 || !/^\d+$/.test(rows)) {
    +							alert(self.lang('invalidRows'));
    +							rowsBox[0].focus();
    +							return;
    +						}
    +						if (cols == 0 || !/^\d+$/.test(cols)) {
    +							alert(self.lang('invalidRows'));
    +							colsBox[0].focus();
    +							return;
    +						}
    +						if (!/^\d*$/.test(width)) {
    +							alert(self.lang('invalidWidth'));
    +							widthBox[0].focus();
    +							return;
    +						}
    +						if (!/^\d*$/.test(height)) {
    +							alert(self.lang('invalidHeight'));
    +							heightBox[0].focus();
    +							return;
    +						}
    +						if (!/^\d*$/.test(padding)) {
    +							alert(self.lang('invalidPadding'));
    +							paddingBox[0].focus();
    +							return;
    +						}
    +						if (!/^\d*$/.test(spacing)) {
    +							alert(self.lang('invalidSpacing'));
    +							spacingBox[0].focus();
    +							return;
    +						}
    +						if (!/^\d*$/.test(border)) {
    +							alert(self.lang('invalidBorder'));
    +							borderBox[0].focus();
    +							return;
    +						}
    +						//modify table
    +						if (table) {
    +							if (width !== '') {
    +								table.width(width + widthType);
    +							} else {
    +								table.css('width', '');
    +							}
    +							if (table[0].width !== undefined) {
    +								table.removeAttr('width');
    +							}
    +							if (height !== '') {
    +								table.height(height + heightType);
    +							} else {
    +								table.css('height', '');
    +							}
    +							if (table[0].height !== undefined) {
    +								table.removeAttr('height');
    +							}
    +							table.css('background-color', bgColor);
    +							if (table[0].bgColor !== undefined) {
    +								table.removeAttr('bgColor');
    +							}
    +							if (padding !== '') {
    +								table[0].cellPadding = padding;
    +							} else {
    +								table.removeAttr('cellPadding');
    +							}
    +							if (spacing !== '') {
    +								table[0].cellSpacing = spacing;
    +							} else {
    +								table.removeAttr('cellSpacing');
    +							}
    +							if (align !== '') {
    +								table[0].align = align;
    +							} else {
    +								table.removeAttr('align');
    +							}
    +							if (border !== '') {
    +								table.attr('border', border);
    +							} else {
    +								table.removeAttr('border');
    +							}
    +							if (border === '' || border === '0') {
    +								table.addClass(zeroborder);
    +							} else {
    +								table.removeClass(zeroborder);
    +							}
    +							if (borderColor !== '') {
    +								table.attr('borderColor', borderColor);
    +							} else {
    +								table.removeAttr('borderColor');
    +							}
    +							self.hideDialog().focus();
    +							return;
    +						}
    +						//insert new table
    +						var style = '';
    +						if (width !== '') {
    +							style += 'width:' + width + widthType + ';';
    +						}
    +						if (height !== '') {
    +							style += 'height:' + height + heightType + ';';
    +						}
    +						if (bgColor !== '') {
    +							style += 'background-color:' + bgColor + ';';
    +						}
    +						var html = '<table';
    +						if (style !== '') {
    +							html += ' style="' + style + '"';
    +						}
    +						if (padding !== '') {
    +							html += ' cellpadding="' + padding + '"';
    +						}
    +						if (spacing !== '') {
    +							html += ' cellspacing="' + spacing + '"';
    +						}
    +						if (align !== '') {
    +							html += ' align="' + align + '"';
    +						}
    +						if (border !== '') {
    +							html += ' border="' + border + '"';
    +						}
    +						if (border === '' || border === '0') {
    +							html += ' class="' + zeroborder + '"';
    +						}
    +						if (borderColor !== '') {
    +							html += ' bordercolor="' + borderColor + '"';
    +						}
    +						html += '>';
    +						for (var i = 0; i < rows; i++) {
    +							html += '<tr>';
    +							for (var j = 0; j < cols; j++) {
    +								html += '<td>' + (K.IE ? '&nbsp;' : '<br />') + '</td>';
    +							}
    +							html += '</tr>';
    +						}
    +						html += '</table>';
    +						if (!K.IE) {
    +							html += '<br />';
    +						}
    +						self.insertHtml(html);
    +						self.select().hideDialog().focus();
    +						self.addBookmark();
    +					}
    +				}
    +			}),
    +			div = dialog.div,
    +			rowsBox = K('[name="rows"]', div).val(3),
    +			colsBox = K('[name="cols"]', div).val(2),
    +			widthBox = K('[name="width"]', div).val(100),
    +			heightBox = K('[name="height"]', div),
    +			widthTypeBox = K('[name="widthType"]', div),
    +			heightTypeBox = K('[name="heightType"]', div),
    +			paddingBox = K('[name="padding"]', div).val(2),
    +			spacingBox = K('[name="spacing"]', div).val(0),
    +			alignBox = K('[name="align"]', div),
    +			borderBox = K('[name="border"]', div).val(1),
    +			colorBox = K('.ke-input-color', div);
    +			_initColorPicker(div, colorBox.eq(0));
    +			_initColorPicker(div, colorBox.eq(1));
    +			_setColor(colorBox.eq(0), '#000000');
    +			_setColor(colorBox.eq(1), '');
    +			// foucs and select
    +			rowsBox[0].focus();
    +			rowsBox[0].select();
    +			var table;
    +			if (isInsert) {
    +				return;
    +			}
    +			//get selected table node
    +			table = self.plugin.getSelectedTable();
    +			if (table) {
    +				rowsBox.val(table[0].rows.length);
    +				colsBox.val(table[0].rows.length > 0 ? table[0].rows[0].cells.length : 0);
    +				rowsBox.attr('disabled', true);
    +				colsBox.attr('disabled', true);
    +				var match,
    +					tableWidth = table[0].style.width || table[0].width,
    +					tableHeight = table[0].style.height || table[0].height;
    +				if (tableWidth !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableWidth))) {
    +					widthBox.val(match[1]);
    +					widthTypeBox.val(match[2]);
    +				} else {
    +					widthBox.val('');
    +				}
    +				if (tableHeight !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableHeight))) {
    +					heightBox.val(match[1]);
    +					heightTypeBox.val(match[2]);
    +				}
    +				paddingBox.val(table[0].cellPadding || '');
    +				spacingBox.val(table[0].cellSpacing || '');
    +				alignBox.val(table[0].align || '');
    +				borderBox.val(table[0].border === undefined ? '' : table[0].border);
    +				_setColor(colorBox.eq(0), K.toHex(table.attr('borderColor') || ''));
    +				_setColor(colorBox.eq(1), K.toHex(table[0].style.backgroundColor || table[0].bgColor || ''));
    +				widthBox[0].focus();
    +				widthBox[0].select();
    +			}
    +		},
    +		//modify cell
    +		cellprop : function() {
    +			var html = [
    +				'<div style="padding:20px;">',
    +				//width, height
    +				'<div class="ke-dialog-row">',
    +				'<label for="keWidth" style="width:90px;">' + lang.size + '</label>',
    +				lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
    +				'<select name="widthType">',
    +				'<option value="%">' + lang.percent + '</option>',
    +				'<option value="px">' + lang.px + '</option>',
    +				'</select> &nbsp; ',
    +				lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
    +				'<select name="heightType">',
    +				'<option value="%">' + lang.percent + '</option>',
    +				'<option value="px">' + lang.px + '</option>',
    +				'</select>',
    +				'</div>',
    +				//align
    +				'<div class="ke-dialog-row">',
    +				'<label for="keAlign" style="width:90px;">' + lang.align + '</label>',
    +				lang.textAlign + ' <select id="keAlign" name="textAlign">',
    +				'<option value="">' + lang.alignDefault + '</option>',
    +				'<option value="left">' + lang.alignLeft + '</option>',
    +				'<option value="center">' + lang.alignCenter + '</option>',
    +				'<option value="right">' + lang.alignRight + '</option>',
    +				'</select> ',
    +				lang.verticalAlign + ' <select name="verticalAlign">',
    +				'<option value="">' + lang.alignDefault + '</option>',
    +				'<option value="top">' + lang.alignTop + '</option>',
    +				'<option value="middle">' + lang.alignMiddle + '</option>',
    +				'<option value="bottom">' + lang.alignBottom + '</option>',
    +				'<option value="baseline">' + lang.alignBaseline + '</option>',
    +				'</select>',
    +				'</div>',
    +				//border
    +				'<div class="ke-dialog-row">',
    +				'<label for="keBorder" style="width:90px;">' + lang.border + '</label>',
    +				lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
    +				lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
    +				'</div>',
    +				//background color
    +				'<div class="ke-dialog-row">',
    +				'<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>',
    +				'<span class="ke-inline-block ke-input-color"></span>',
    +				'</div>',
    +				'</div>'
    +			].join('');
    +			var dialog = self.createDialog({
    +				name : name,
    +				width : 500,
    +				title : self.lang('tablecell'),
    +				body : html,
    +				beforeRemove : function() {
    +					colorBox.unbind();
    +				},
    +				yesBtn : {
    +					name : self.lang('yes'),
    +					click : function(e) {
    +						var width = widthBox.val(),
    +							height = heightBox.val(),
    +							widthType = widthTypeBox.val(),
    +							heightType = heightTypeBox.val(),
    +							padding = paddingBox.val(),
    +							spacing = spacingBox.val(),
    +							textAlign = textAlignBox.val(),
    +							verticalAlign = verticalAlignBox.val(),
    +							border = borderBox.val(),
    +							borderColor = K(colorBox[0]).html() || '',
    +							bgColor = K(colorBox[1]).html() || '';
    +						if (!/^\d*$/.test(width)) {
    +							alert(self.lang('invalidWidth'));
    +							widthBox[0].focus();
    +							return;
    +						}
    +						if (!/^\d*$/.test(height)) {
    +							alert(self.lang('invalidHeight'));
    +							heightBox[0].focus();
    +							return;
    +						}
    +						if (!/^\d*$/.test(border)) {
    +							alert(self.lang('invalidBorder'));
    +							borderBox[0].focus();
    +							return;
    +						}
    +						cell.css({
    +							width : width !== '' ? (width + widthType) : '',
    +							height : height !== '' ? (height + heightType) : '',
    +							'background-color' : bgColor,
    +							'text-align' : textAlign,
    +							'vertical-align' : verticalAlign,
    +							'border-width' : border,
    +							'border-style' : border !== '' ? 'solid' : '',
    +							'border-color' : borderColor
    +						});
    +						self.hideDialog().focus();
    +						self.addBookmark();
    +					}
    +				}
    +			}),
    +			div = dialog.div,
    +			widthBox = K('[name="width"]', div).val(100),
    +			heightBox = K('[name="height"]', div),
    +			widthTypeBox = K('[name="widthType"]', div),
    +			heightTypeBox = K('[name="heightType"]', div),
    +			paddingBox = K('[name="padding"]', div).val(2),
    +			spacingBox = K('[name="spacing"]', div).val(0),
    +			textAlignBox = K('[name="textAlign"]', div),
    +			verticalAlignBox = K('[name="verticalAlign"]', div),
    +			borderBox = K('[name="border"]', div).val(1),
    +			colorBox = K('.ke-input-color', div);
    +			_initColorPicker(div, colorBox.eq(0));
    +			_initColorPicker(div, colorBox.eq(1));
    +			_setColor(colorBox.eq(0), '#000000');
    +			_setColor(colorBox.eq(1), '');
    +			// foucs and select
    +			widthBox[0].focus();
    +			widthBox[0].select();
    +			// get selected cell
    +			var cell = self.plugin.getSelectedCell();
    +			var match,
    +				cellWidth = cell[0].style.width || cell[0].width || '',
    +				cellHeight = cell[0].style.height || cell[0].height || '';
    +			if ((match = /^(\d+)((?:px|%)*)$/.exec(cellWidth))) {
    +				widthBox.val(match[1]);
    +				widthTypeBox.val(match[2]);
    +			} else {
    +				widthBox.val('');
    +			}
    +			if ((match = /^(\d+)((?:px|%)*)$/.exec(cellHeight))) {
    +				heightBox.val(match[1]);
    +				heightTypeBox.val(match[2]);
    +			}
    +			textAlignBox.val(cell[0].style.textAlign || '');
    +			verticalAlignBox.val(cell[0].style.verticalAlign || '');
    +			var border = cell[0].style.borderWidth || '';
    +			if (border) {
    +				border = parseInt(border);
    +			}
    +			borderBox.val(border);
    +			_setColor(colorBox.eq(0), K.toHex(cell[0].style.borderColor || ''));
    +			_setColor(colorBox.eq(1), K.toHex(cell[0].style.backgroundColor || ''));
    +			widthBox[0].focus();
    +			widthBox[0].select();
    +		},
    +		insert : function() {
    +			this.prop(true);
    +		},
    +		'delete' : function() {
    +			var table = self.plugin.getSelectedTable();
    +			self.cmd.range.setStartBefore(table[0]).collapse(true);
    +			self.cmd.select();
    +			table.remove();
    +			self.addBookmark();
    +		},
    +		colinsert : function(offset) {
    +			var table = self.plugin.getSelectedTable()[0],
    +				row = self.plugin.getSelectedRow()[0],
    +				cell = self.plugin.getSelectedCell()[0],
    +				index = cell.cellIndex + offset;
    +			for (var i = 0, len = table.rows.length; i < len; i++) {
    +				var newRow = table.rows[i],
    +					newCell = newRow.insertCell(index);
    +				newCell.innerHTML = K.IE ? '' : '<br />';
    +				// 璋冩暣涓嬩竴琛岀殑鍗曞厓鏍糹ndex
    +				index = _getCellIndex(table, newRow, newCell);
    +			}
    +			self.cmd.range.selectNodeContents(cell).collapse(true);
    +			self.cmd.select();
    +			self.addBookmark();
    +		},
    +		colinsertleft : function() {
    +			this.colinsert(0);
    +		},
    +		colinsertright : function() {
    +			this.colinsert(1);
    +		},
    +		rowinsert : function(offset) {
    +			var table = self.plugin.getSelectedTable()[0],
    +				row = self.plugin.getSelectedRow()[0],
    +				cell = self.plugin.getSelectedCell()[0],
    +				newRow;
    +			if (offset === 1) {
    +				newRow = table.insertRow(row.rowIndex + (cell.rowSpan - 1) + offset);
    +			} else {
    +				newRow = table.insertRow(row.rowIndex);
    +			}
    +			for (var i = 0, len = row.cells.length; i < len; i++) {
    +				var newCell = newRow.insertCell(i);
    +				// copy colspan
    +				if (offset === 1 && row.cells[i].colSpan > 1) {
    +					newCell.colSpan = row.cells[i].colSpan;
    +				}
    +				newCell.innerHTML = K.IE ? '' : '<br />';
    +			}
    +			self.cmd.range.selectNodeContents(cell).collapse(true);
    +			self.cmd.select();
    +			self.addBookmark();
    +		},
    +		rowinsertabove : function() {
    +			this.rowinsert(0);
    +		},
    +		rowinsertbelow : function() {
    +			this.rowinsert(1);
    +		},
    +		rowmerge : function() {
    +			var table = self.plugin.getSelectedTable()[0],
    +				row = self.plugin.getSelectedRow()[0],
    +				cell = self.plugin.getSelectedCell()[0],
    +				rowIndex = row.rowIndex, // 褰撳墠琛岀殑index
    +				nextRowIndex = rowIndex + cell.rowSpan, // 涓嬩竴琛岀殑index
    +				nextRow = table.rows[nextRowIndex]; // 涓嬩竴琛
    +			// 鏈鍚庝竴琛屼笉鑳藉悎骞
    +			if (table.rows.length <= nextRowIndex) {
    +				return;
    +			}
    +			var cellIndex = _getCellIndex(table, row, cell); // 涓嬩竴琛屽崟鍏冩牸鐨刬ndex
    +			if (nextRow.cells.length <= cellIndex) {
    +				return;
    +			}
    +			var nextCell = nextRow.cells[cellIndex]; // 涓嬩竴琛屽崟鍏冩牸
    +			// 涓婁笅琛岀殑colspan涓嶄竴鑷存椂涓嶈兘鍚堝苟
    +			if (cell.colSpan !== nextCell.colSpan) {
    +				return;
    +			}
    +			cell.rowSpan += nextCell.rowSpan;
    +			nextRow.deleteCell(cellIndex);
    +			self.cmd.range.selectNodeContents(cell).collapse(true);
    +			self.cmd.select();
    +			self.addBookmark();
    +		},
    +		colmerge : function() {
    +			var table = self.plugin.getSelectedTable()[0],
    +				row = self.plugin.getSelectedRow()[0],
    +				cell = self.plugin.getSelectedCell()[0],
    +				rowIndex = row.rowIndex, // 褰撳墠琛岀殑index
    +				cellIndex = cell.cellIndex,
    +				nextCellIndex = cellIndex + 1;
    +			// 鏈鍚庝竴鍒椾笉鑳藉悎骞
    +			if (row.cells.length <= nextCellIndex) {
    +				return;
    +			}
    +			var nextCell = row.cells[nextCellIndex];
    +			// 宸﹀彸鍒楃殑rowspan涓嶄竴鑷存椂涓嶈兘鍚堝苟
    +			if (cell.rowSpan !== nextCell.rowSpan) {
    +				return;
    +			}
    +			cell.colSpan += nextCell.colSpan;
    +			row.deleteCell(nextCellIndex);
    +			self.cmd.range.selectNodeContents(cell).collapse(true);
    +			self.cmd.select();
    +			self.addBookmark();
    +		},
    +		rowsplit : function() {
    +			var table = self.plugin.getSelectedTable()[0],
    +				row = self.plugin.getSelectedRow()[0],
    +				cell = self.plugin.getSelectedCell()[0],
    +				rowIndex = row.rowIndex;
    +			// 涓嶆槸鍙垎鍓插崟鍏冩牸
    +			if (cell.rowSpan === 1) {
    +				return;
    +			}
    +			var cellIndex = _getCellIndex(table, row, cell);
    +			for (var i = 1, len = cell.rowSpan; i < len; i++) {
    +				var newRow = table.rows[rowIndex + i],
    +					newCell = newRow.insertCell(cellIndex);
    +				if (cell.colSpan > 1) {
    +					newCell.colSpan = cell.colSpan;
    +				}
    +				newCell.innerHTML = K.IE ? '' : '<br />';
    +				// 璋冩暣涓嬩竴琛岀殑鍗曞厓鏍糹ndex
    +				cellIndex = _getCellIndex(table, newRow, newCell);
    +			}
    +			K(cell).removeAttr('rowSpan');
    +			self.cmd.range.selectNodeContents(cell).collapse(true);
    +			self.cmd.select();
    +			self.addBookmark();
    +		},
    +		colsplit : function() {
    +			var table = self.plugin.getSelectedTable()[0],
    +				row = self.plugin.getSelectedRow()[0],
    +				cell = self.plugin.getSelectedCell()[0],
    +				cellIndex = cell.cellIndex;
    +			// 涓嶆槸鍙垎鍓插崟鍏冩牸
    +			if (cell.colSpan === 1) {
    +				return;
    +			}
    +			for (var i = 1, len = cell.colSpan; i < len; i++) {
    +				var newCell = row.insertCell(cellIndex + i);
    +				if (cell.rowSpan > 1) {
    +					newCell.rowSpan = cell.rowSpan;
    +				}
    +				newCell.innerHTML = K.IE ? '' : '<br />';
    +			}
    +			K(cell).removeAttr('colSpan');
    +			self.cmd.range.selectNodeContents(cell).collapse(true);
    +			self.cmd.select();
    +			self.addBookmark();
    +		},
    +		coldelete : function() {
    +			var table = self.plugin.getSelectedTable()[0],
    +				row = self.plugin.getSelectedRow()[0],
    +				cell = self.plugin.getSelectedCell()[0],
    +				index = cell.cellIndex;
    +			for (var i = 0, len = table.rows.length; i < len; i++) {
    +				var newRow = table.rows[i],
    +					newCell = newRow.cells[index];
    +				if (newCell.colSpan > 1) {
    +					newCell.colSpan -= 1;
    +					if (newCell.colSpan === 1) {
    +						K(newCell).removeAttr('colSpan');
    +					}
    +				} else {
    +					newRow.deleteCell(index);
    +				}
    +				// 璺宠繃涓嶉渶瑕佸垹闄ょ殑琛
    +				if (newCell.rowSpan > 1) {
    +					i += newCell.rowSpan - 1;
    +				}
    +			}
    +			if (row.cells.length === 0) {
    +				self.cmd.range.setStartBefore(table).collapse(true);
    +				self.cmd.select();
    +				K(table).remove();
    +			} else {
    +				self.cmd.selection(true);
    +			}
    +			self.addBookmark();
    +		},
    +		rowdelete : function() {
    +			var table = self.plugin.getSelectedTable()[0],
    +				row = self.plugin.getSelectedRow()[0],
    +				cell = self.plugin.getSelectedCell()[0],
    +				rowIndex = row.rowIndex;
    +			// 浠庝笅鍒颁笂鍒犻櫎
    +			for (var i = cell.rowSpan - 1; i >= 0; i--) {
    +				table.deleteRow(rowIndex + i);
    +			}
    +			if (table.rows.length === 0) {
    +				self.cmd.range.setStartBefore(table).collapse(true);
    +				self.cmd.select();
    +				K(table).remove();
    +			} else {
    +				self.cmd.selection(true);
    +			}
    +			self.addBookmark();
    +		}
    +	};
    +	self.clickToolbar(name, self.plugin.table.prop);
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/template/html/1.html b/src/main/webapp/plug-in/kindeditor/plugins/template/html/1.html
    new file mode 100644
    index 00000000..034126b7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/template/html/1.html
    @@ -0,0 +1,14 @@
    +<!doctype html>
    +<html>
    +<head>
    +	<meta charset="utf-8" />
    +</head>
    +<body>
    +	<h3>
    +		<img align="left" height="100" style="margin-right: 10px" width="100" />鍦ㄦ澶勮緭鍏ユ爣棰
    +	</h3>
    +	<p>
    +		鍦ㄦ澶勮緭鍏ュ唴瀹
    +	</p>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/template/html/2.html b/src/main/webapp/plug-in/kindeditor/plugins/template/html/2.html
    new file mode 100644
    index 00000000..dc2584a0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/template/html/2.html
    @@ -0,0 +1,42 @@
    +<!doctype html>
    +<html>
    +<head>
    +	<meta charset="utf-8" />
    +</head>
    +<body>
    +	<h3>
    +		鏍囬
    +	</h3>
    +	<table style="width:100%;" cellpadding="2" cellspacing="0" border="1">
    +		<tbody>
    +			<tr>
    +				<td>
    +					<h3>鏍囬1</h3>
    +				</td>
    +				<td>
    +					<h3>鏍囬1</h3>
    +				</td>
    +			</tr>
    +			<tr>
    +				<td>
    +					鍐呭1
    +				</td>
    +				<td>
    +					鍐呭2
    +				</td>
    +			</tr>
    +			<tr>
    +				<td>
    +					鍐呭3
    +				</td>
    +				<td>
    +					鍐呭4
    +				</td>
    +			</tr>
    +		</tbody>
    +	</table>
    +	<p>
    +		琛ㄦ牸璇存槑
    +	</p>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/template/html/3.html b/src/main/webapp/plug-in/kindeditor/plugins/template/html/3.html
    new file mode 100644
    index 00000000..873f0c65
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/template/html/3.html
    @@ -0,0 +1,36 @@
    +<!doctype html>
    +<html>
    +<head>
    +	<meta charset="utf-8" />
    +</head>
    +<body>
    +	<p>
    +		鍦ㄦ澶勮緭鍏ュ唴瀹
    +	</p>
    +	<ol>
    +		<li>
    +			鎻忚堪1
    +		</li>
    +		<li>
    +			鎻忚堪2
    +		</li>
    +		<li>
    +			鎻忚堪3
    +		</li>
    +	</ol>
    +	<p>
    +		鍦ㄦ澶勮緭鍏ュ唴瀹
    +	</p>
    +	<ul>
    +		<li>
    +			鎻忚堪1
    +		</li>
    +		<li>
    +			鎻忚堪2
    +		</li>
    +		<li>
    +			鎻忚堪3
    +		</li>
    +	</ul>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/template/template.js b/src/main/webapp/plug-in/kindeditor/plugins/template/template.js
    new file mode 100644
    index 00000000..9df2a57b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/template/template.js
    @@ -0,0 +1,58 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('template', function(K) {
    +	var self = this, name = 'template', lang = self.lang(name + '.'),
    +		htmlPath = self.pluginsPath + name + '/html/';
    +	function getFilePath(fileName) {
    +		return htmlPath + fileName + '?ver=' + encodeURIComponent(K.DEBUG ? K.TIME : K.VERSION);
    +	}
    +	self.clickToolbar(name, function() {
    +		var lang = self.lang(name + '.'),
    +			arr = ['<div class="ke-plugin-template" style="padding:10px 20px;">',
    +				'<div class="ke-header">',
    +				// left start
    +				'<div class="ke-left">',
    +				lang. selectTemplate + ' <select>'];
    +			K.each(lang.fileList, function(key, val) {
    +				arr.push('<option value="' + key + '">' + val + '</option>');
    +			});
    +			html = [arr.join(''),
    +				'</select></div>',
    +				// right start
    +				'<div class="ke-right">',
    +				'<input type="checkbox" id="keReplaceFlag" name="replaceFlag" value="1" /> <label for="keReplaceFlag">' + lang.replaceContent + '</label>',
    +				'</div>',
    +				'<div class="ke-clearfix"></div>',
    +				'</div>',
    +				'<iframe class="ke-textarea" frameborder="0" style="width:458px;height:260px;background-color:#FFF;"></iframe>',
    +				'</div>'].join('');
    +		var dialog = self.createDialog({
    +			name : name,
    +			width : 500,
    +			title : self.lang(name),
    +			body : html,
    +			yesBtn : {
    +				name : self.lang('yes'),
    +				click : function(e) {
    +					var doc = K.iframeDoc(iframe);
    +					self[checkbox[0].checked ? 'html' : 'insertHtml'](doc.body.innerHTML).hideDialog().focus();
    +				}
    +			}
    +		});
    +		var selectBox = K('select', dialog.div),
    +			checkbox = K('[name="replaceFlag"]', dialog.div),
    +			iframe = K('iframe', dialog.div);
    +		checkbox[0].checked = true;
    +		iframe.attr('src', getFilePath(selectBox.val()));
    +		selectBox.change(function() {
    +			iframe.attr('src', getFilePath(this.value));
    +		});
    +	});
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/plugins/wordpaste/wordpaste.js b/src/main/webapp/plug-in/kindeditor/plugins/wordpaste/wordpaste.js
    new file mode 100644
    index 00000000..22061e15
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/plugins/wordpaste/wordpaste.js
    @@ -0,0 +1,51 @@
    +/*******************************************************************************
    +* KindEditor - WYSIWYG HTML Editor for Internet
    +* Copyright (C) 2006-2011 kindsoft.net
    +*
    +* @author Roddy <luolonghao@gmail.com>
    +* @site http://www.kindsoft.net/
    +* @licence http://www.kindsoft.net/license.php
    +*******************************************************************************/
    +
    +KindEditor.plugin('wordpaste', function(K) {
    +	var self = this, name = 'wordpaste';
    +	self.clickToolbar(name, function() {
    +		var lang = self.lang(name + '.'),
    +			html = '<div style="padding:10px 20px;">' +
    +				'<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
    +				'<iframe class="ke-textarea" frameborder="0" style="width:408px;height:260px;"></iframe>' +
    +				'</div>',
    +			dialog = self.createDialog({
    +				name : name,
    +				width : 450,
    +				title : self.lang(name),
    +				body : html,
    +				yesBtn : {
    +					name : self.lang('yes'),
    +					click : function(e) {
    +						var str = doc.body.innerHTML;
    +						str = K.clearMsWord(str, self.filterMode ? self.htmlTags : K.options.htmlTags);
    +						self.insertHtml(str).hideDialog().focus();
    +					}
    +				}
    +			}),
    +			div = dialog.div,
    +			iframe = K('iframe', div),
    +			doc = K.iframeDoc(iframe);
    +		if (!K.IE) {
    +			doc.designMode = 'on';
    +		}
    +		doc.open();
    +		doc.write('<!doctype html><html><head><title>WordPaste</title></head>');
    +		doc.write('<body style="background-color:#FFF;font-size:12px;margin:2px;">');
    +		if (!K.IE) {
    +			doc.write('<br />');
    +		}
    +		doc.write('</body></html>');
    +		doc.close();
    +		if (K.IE) {
    +			doc.body.contentEditable = 'true';
    +		}
    +		iframe[0].contentWindow.focus();
    +	});
    +});
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/common/anchor.gif b/src/main/webapp/plug-in/kindeditor/themes/common/anchor.gif
    new file mode 100644
    index 00000000..61145ea7
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/themes/common/anchor.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/common/blank.gif b/src/main/webapp/plug-in/kindeditor/themes/common/blank.gif
    new file mode 100644
    index 00000000..5bfd67a2
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/themes/common/blank.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/common/flash.gif b/src/main/webapp/plug-in/kindeditor/themes/common/flash.gif
    new file mode 100644
    index 00000000..2cb12b28
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/themes/common/flash.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/common/loading.gif b/src/main/webapp/plug-in/kindeditor/themes/common/loading.gif
    new file mode 100644
    index 00000000..c69e9372
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/themes/common/loading.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/common/media.gif b/src/main/webapp/plug-in/kindeditor/themes/common/media.gif
    new file mode 100644
    index 00000000..e1c0e30a
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/themes/common/media.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/common/rm.gif b/src/main/webapp/plug-in/kindeditor/themes/common/rm.gif
    new file mode 100644
    index 00000000..d013d551
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/themes/common/rm.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/default/background.png b/src/main/webapp/plug-in/kindeditor/themes/default/background.png
    new file mode 100644
    index 00000000..bbfb056b
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/themes/default/background.png differ
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/default/default.css b/src/main/webapp/plug-in/kindeditor/themes/default/default.css
    new file mode 100644
    index 00000000..7b6b0bf0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/themes/default/default.css
    @@ -0,0 +1,1148 @@
    +/* common */
    +.ke-inline-block {
    +	display: -moz-inline-stack;
    +	display: inline-block;
    +	vertical-align: middle;
    +	zoom: 1;
    +	*display: inline;
    +}
    +.ke-clearfix {
    +	zoom: 1;
    +}
    +.ke-clearfix:after {
    +	content: ".";
    +	display: block;
    +	clear: both;
    +	font-size: 0;
    +	height: 0;
    +	line-height: 0;
    +	visibility: hidden;
    +}
    +.ke-shadow {
    +	box-shadow: 1px 1px 3px #A0A0A0;
    +	-moz-box-shadow: 1px 1px 3px #A0A0A0;
    +	-webkit-box-shadow: 1px 1px 3px #A0A0A0;
    +	filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
    +	background-color: #F0F0EE;
    +}
    +.ke-menu a,
    +.ke-menu a:hover,
    +.ke-dialog a,
    +.ke-dialog a:hover {
    +	color: #337FE5;
    +	text-decoration: none;
    +}
    +/* icons */
    +.ke-icon-source {
    +	background-position: 0px 0px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-preview {
    +	background-position: 0px -16px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-print {
    +	background-position: 0px -32px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-undo {
    +	background-position: 0px -48px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-redo {
    +	background-position: 0px -64px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-cut {
    +	background-position: 0px -80px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-copy {
    +	background-position: 0px -96px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-paste {
    +	background-position: 0px -112px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-selectall {
    +	background-position: 0px -128px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-justifyleft {
    +	background-position: 0px -144px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-justifycenter {
    +	background-position: 0px -160px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-justifyright {
    +	background-position: 0px -176px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-justifyfull {
    +	background-position: 0px -192px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-insertorderedlist {
    +	background-position: 0px -208px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-insertunorderedlist {
    +	background-position: 0px -224px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-indent {
    +	background-position: 0px -240px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-outdent {
    +	background-position: 0px -256px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-subscript {
    +	background-position: 0px -272px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-superscript {
    +	background-position: 0px -288px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-date {
    +	background-position: 0px -304px;
    +	width: 25px;
    +	height: 16px;
    +}
    +.ke-icon-time {
    +	background-position: 0px -320px;
    +	width: 25px;
    +	height: 16px;
    +}
    +.ke-icon-formatblock {
    +	background-position: 0px -336px;
    +	width: 25px;
    +	height: 16px;
    +}
    +.ke-icon-fontname {
    +	background-position: 0px -352px;
    +	width: 21px;
    +	height: 16px;
    +}
    +.ke-icon-fontsize {
    +	background-position: 0px -368px;
    +	width: 23px;
    +	height: 16px;
    +}
    +.ke-icon-forecolor {
    +	background-position: 0px -384px;
    +	width: 20px;
    +	height: 16px;
    +}
    +.ke-icon-hilitecolor {
    +	background-position: 0px -400px;
    +	width: 23px;
    +	height: 16px;
    +}
    +.ke-icon-bold {
    +	background-position: 0px -416px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-italic {
    +	background-position: 0px -432px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-underline {
    +	background-position: 0px -448px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-strikethrough {
    +	background-position: 0px -464px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-removeformat {
    +	background-position: 0px -480px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-image {
    +	background-position: 0px -496px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-flash {
    +	background-position: 0px -512px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-media {
    +	background-position: 0px -528px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-div {
    +	background-position: 0px -544px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-formula {
    +	background-position: 0px -576px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-hr {
    +	background-position: 0px -592px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-emoticons {
    +	background-position: 0px -608px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-link {
    +	background-position: 0px -624px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-unlink {
    +	background-position: 0px -640px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-fullscreen {
    +	background-position: 0px -656px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-about {
    +	background-position: 0px -672px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-plainpaste {
    +	background-position: 0px -704px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-wordpaste {
    +	background-position: 0px -720px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-table {
    +	background-position: 0px -784px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablemenu {
    +	background-position: 0px -768px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tableinsert {
    +	background-position: 0px -784px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tabledelete {
    +	background-position: 0px -800px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablecolinsertleft {
    +	background-position: 0px -816px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablecolinsertright {
    +	background-position: 0px -832px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablerowinsertabove {
    +	background-position: 0px -848px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablerowinsertbelow {
    +	background-position: 0px -864px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablecoldelete {
    +	background-position: 0px -880px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablerowdelete {
    +	background-position: 0px -896px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablecellprop {
    +	background-position: 0px -912px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tableprop {
    +	background-position: 0px -928px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-checked {
    +	background-position: 0px -944px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-code {
    +	background-position: 0px -960px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-map {
    +	background-position: 0px -976px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-baidumap {
    +	background-position: 0px -976px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-lineheight {
    +	background-position: 0px -992px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-clearhtml {
    +	background-position: 0px -1008px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-pagebreak {
    +	background-position: 0px -1024px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-insertfile {
    +	background-position: 0px -1040px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-quickformat {
    +	background-position: 0px -1056px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-template {
    +	background-position: 0px -1072px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablecellsplit {
    +	background-position: 0px -1088px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablerowmerge {
    +	background-position: 0px -1104px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablerowsplit {
    +	background-position: 0px -1120px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablecolmerge {
    +	background-position: 0px -1136px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-tablecolsplit {
    +	background-position: 0px -1152px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-anchor {
    +	background-position: 0px -1168px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-search {
    +	background-position: 0px -1184px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-new {
    +	background-position: 0px -1200px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-specialchar {
    +	background-position: 0px -1216px;
    +	width: 16px;
    +	height: 16px;
    +}
    +.ke-icon-multiimage {
    +	background-position: 0px -1232px;
    +	width: 16px;
    +	height: 16px;
    +}
    +/* container */
    +.ke-container {
    +	display: block;
    +	border: 1px solid #CCCCCC;
    +	background-color: #FFF;
    +	overflow: hidden;
    +	margin: 0;
    +	padding: 0;
    +}
    +/* toolbar */
    +.ke-toolbar {
    +	border-bottom: 1px solid #CCC;
    +	background-color: #F0F0EE;
    +	padding: 2px 5px;
    +	text-align: left;
    +	overflow: hidden;
    +	zoom: 1;
    +}
    +.ke-toolbar-icon {
    +	background-repeat: no-repeat;
    +	font-size: 0;
    +	line-height: 0;
    +	overflow: hidden;
    +	display: block;
    +}
    +.ke-toolbar-icon-url {
    +	background-image: url(default.png);
    +}
    +.ke-toolbar .ke-outline {
    +	border: 1px solid #F0F0EE;
    +	margin: 1px;
    +	padding: 1px 2px;
    +	font-size: 0;
    +	line-height: 0;
    +	overflow: hidden;
    +	cursor: pointer;
    +	display: block;
    +	float: left;
    +}
    +.ke-toolbar .ke-on {
    +	border: 1px solid #5690D2;
    +}
    +.ke-toolbar .ke-selected {
    +	border: 1px solid #5690D2;
    +	background-color: #E9EFF6;
    +}
    +.ke-toolbar .ke-disabled {
    +	cursor: default;
    +}
    +.ke-toolbar .ke-separator {
    +	height: 16px;
    +	margin: 2px 3px;
    +	border-left: 1px solid #A0A0A0;
    +	border-right: 1px solid #FFFFFF;
    +	border-top:0;
    +	border-bottom:0;
    +	width: 0;
    +	font-size: 0;
    +	line-height: 0;
    +	overflow: hidden;
    +	display: block;
    +	float: left;
    +}
    +.ke-toolbar .ke-hr {
    +	overflow: hidden;
    +	height: 1px;
    +	clear: both;
    +}
    +/* edit */
    +.ke-edit {
    +	padding: 0;
    +}
    +.ke-edit-iframe,
    +.ke-edit-textarea {
    +	border: 0;
    +	margin: 0;
    +	padding: 0;
    +	overflow: auto;
    +}
    +.ke-edit-textarea {
    +	font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
    +	color: #000;
    +	overflow: auto;
    +	resize: none;
    +}
    +.ke-edit-textarea:focus {
    +	outline: none;
    +}
    +/* statusbar */
    +.ke-statusbar {
    +	position: relative;
    +	background-color: #F0F0EE;
    +	border-top: 1px solid #CCCCCC;
    +	font-size: 0;
    +	line-height: 0;
    +	*height: 12px;
    +	overflow: hidden;
    +	text-align: center;
    +	cursor: s-resize;
    +}
    +.ke-statusbar-center-icon {
    +	background-position: -0px -754px;
    +	width: 15px;
    +	height: 11px;
    +	background-image: url(default.png);
    +}
    +.ke-statusbar-right-icon {
    +	position: absolute;
    +	right: 0;
    +	bottom: 0;
    +	cursor: se-resize;
    +	background-position: -5px -741px;
    +	width: 11px;
    +	height: 11px;
    +	background-image: url(default.png);
    +}
    +/* menu */
    +.ke-menu {
    +	border: 1px solid #A0A0A0;
    +	background-color: #F1F1F1;
    +	color: #222222;
    +	padding: 2px;
    +	font-family: "sans serif",tahoma,verdana,helvetica;
    +	font-size: 12px;
    +	text-align: left;
    +	overflow: hidden;
    +}
    +.ke-menu-item {
    +	border: 1px solid #F1F1F1;
    +	background-color: #F1F1F1;
    +	color: #222222;
    +	height: 24px;
    +	overflow: hidden;
    +	cursor: pointer;
    +}
    +.ke-menu-item-on {
    +	border: 1px solid #5690D2;
    +	background-color: #E9EFF6;
    +}
    +.ke-menu-item-left {
    +	width: 27px;
    +	text-align: center;
    +	overflow: hidden;
    +}
    +.ke-menu-item-center {
    +	width: 0;
    +	height: 24px;
    +	border-left: 1px solid #E3E3E3;
    +	border-right: 1px solid #FFFFFF;
    +	border-top: 0;
    +	border-bottom: 0;
    +}
    +.ke-menu-item-center-on {
    +	border-left: 1px solid #E9EFF6;
    +	border-right: 1px solid #E9EFF6;
    +}
    +.ke-menu-item-right {
    +	border: 0;
    +	padding: 0 0 0 5px;
    +	line-height: 24px;
    +	text-align: left;
    +	overflow: hidden;
    +}
    +.ke-menu-separator {
    +	margin: 2px 0;
    +	height: 0;
    +	overflow: hidden;
    +	border-top: 1px solid #CCCCCC;
    +	border-bottom: 1px solid #FFFFFF;
    +	border-left: 0;
    +	border-right: 0;
    +}
    +/* colorpicker */
    +.ke-colorpicker {
    +	border: 1px solid #A0A0A0;
    +	background-color: #F1F1F1;
    +	color: #222222;
    +	padding: 2px;
    +}
    +.ke-colorpicker-table {
    +	border:0;
    +	margin:0;
    +	padding:0;
    +	border-collapse: separate;
    +}
    +.ke-colorpicker-cell {
    +	font-size: 0;
    +	line-height: 0;
    +	border: 1px solid #F0F0EE;
    +	cursor: pointer;
    +	margin:3px;
    +	padding:0;
    +}
    +.ke-colorpicker-cell-top {
    +	font-family: "sans serif",tahoma,verdana,helvetica;
    +	font-size: 12px;
    +	line-height: 24px;
    +	border: 1px solid #F0F0EE;
    +	cursor: pointer;
    +	margin:0;
    +	padding:0;
    +	text-align: center;
    +}
    +.ke-colorpicker-cell-on {
    +	border: 1px solid #5690D2;
    +}
    +.ke-colorpicker-cell-selected {
    +	border: 1px solid #2446AB;
    +}
    +.ke-colorpicker-cell-color {
    +	width: 14px;
    +	height: 14px;
    +	margin: 3px;
    +	padding: 0;
    +	border: 0;
    +}
    +/* dialog */
    +.ke-dialog {
    +	position: absolute;
    +	margin: 0;
    +	padding: 0;
    +}
    +.ke-dialog-content {
    +	background-color: #FFF;
    +	width: 100%;
    +	height: 100%;
    +	color: #333;
    +	border: 1px solid #A0A0A0;
    +}
    +.ke-dialog-shadow {
    +	position: absolute;
    +	z-index: -1;
    +	top: 0;
    +	left: 0;
    +	width: 100%;
    +	height: 100%;
    +	box-shadow: 3px 3px 7px #999;
    +	-moz-box-shadow: 3px 3px 7px #999;
    +	-webkit-box-shadow: 3px 3px 7px #999;
    +	filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius='3', MakeShadow='true', ShadowOpacity='0.4');
    +	background-color: #F0F0EE;
    +}
    +.ke-dialog-header {
    +	border:0;
    +	margin:0;
    +	padding: 0 10px;
    +	background: url(background.png) repeat scroll 0 0 #F0F0EE;
    +	border-bottom: 1px solid #CFCFCF;
    +	height: 24px;
    +	font: 12px/24px "sans serif",tahoma,verdana,helvetica;
    +	text-align: left;
    +	color: #222;
    +	cursor: move;
    +}
    +.ke-dialog-icon-close {
    +	display: block;
    +	background: url(default.png) no-repeat scroll 0px -688px;
    +	width: 16px;
    +	height: 16px;
    +	position: absolute;
    +	right: 6px;
    +	top: 6px;
    +	cursor: pointer;
    +}
    +.ke-dialog-body {
    +	font: 12px/1.5 "sans serif",tahoma,verdana,helvetica;
    +	text-align: left;
    +	overflow: hidden;
    +	width: 100%;
    +}
    +.ke-dialog-body textarea {
    +	display: block;
    +	overflow: auto;
    +	padding: 0;
    +	resize: none;
    +}
    +.ke-dialog-body textarea:focus,
    +.ke-dialog-body input:focus,
    +.ke-dialog-body select:focus {
    +	outline: none;
    +}
    +.ke-dialog-body label {
    +	margin-right: 10px;
    +	cursor: pointer;
    +	display: -moz-inline-stack;
    +	display: inline-block;
    +	vertical-align: middle;
    +	zoom: 1;
    +	*display: inline;
    +}
    +.ke-dialog-body img {
    +	display: -moz-inline-stack;
    +	display: inline-block;
    +	vertical-align: middle;
    +	zoom: 1;
    +	*display: inline;
    +}
    +.ke-dialog-body select {
    +	display: -moz-inline-stack;
    +	display: inline-block;
    +	vertical-align: middle;
    +	zoom: 1;
    +	*display: inline;
    +	width: auto;
    +}
    +.ke-dialog-body .ke-textarea {
    +	display: block;
    +	width: 408px;
    +	height: 260px;
    +	font-family: "sans serif",tahoma,verdana,helvetica;
    +	font-size: 12px;
    +	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
    +	border-style: solid;
    +	border-width: 1px;
    +}
    +.ke-dialog-body .ke-form {
    +	margin: 0;
    +	padding: 0;
    +}
    +.ke-dialog-loading {
    +	position: absolute;
    +	top: 0;
    +	left: 1px;
    +	z-index: 1;
    +	text-align: center;
    +}
    +.ke-dialog-loading-content {
    +	background: url("../common/loading.gif") no-repeat;
    +    color: #666;
    +    font-size: 14px;
    +    font-weight: bold;
    +    height: 31px;
    +    line-height: 31px;
    +    padding-left: 36px;
    +}
    +.ke-dialog-row {
    +	margin-bottom: 10px;
    +}
    +.ke-dialog-footer {
    +	font: 12px/1 "sans serif",tahoma,verdana,helvetica;
    +	text-align: right;
    +	padding:0 0 5px 0;
    +	background-color: #FFF;
    +	width: 100%;
    +}
    +.ke-dialog-preview,
    +.ke-dialog-yes {
    +	margin: 5px;
    +}
    +.ke-dialog-no {
    +	margin: 5px 10px 5px 5px;
    +}
    +.ke-dialog-mask {
    +	background-color:#FFF;
    +	filter:alpha(opacity=50);
    +	opacity:0.5;
    +}
    +.ke-button-common {
    +	background: url(background.png) no-repeat scroll 0 -25px transparent;
    +	cursor: pointer;
    +	height: 23px;
    +	line-height: 23px;
    +	overflow: visible;
    +	display: inline-block;
    +	vertical-align: top;
    +	cursor: pointer;
    +}
    +.ke-button-outer {
    +	background-position: 0 -25px;
    +	padding: 0;
    +	position: relative;
    +	display: -moz-inline-stack;
    +	display: inline-block;
    +	vertical-align: middle;
    +	zoom: 1;
    +	*display: inline;
    +}
    +.ke-button {
    +	background-position: right -25px;
    +	padding: 0 12px;
    +	margin: 0;
    +	font-family: "sans serif",tahoma,verdana,helvetica;
    +	border: 0 none;
    +	color: #333;
    +	font-size: 12px;
    +	left: 2px;
    +	text-decoration: none;
    +}
    +/* inputbox */
    +.ke-input-text {
    +	background-color:#FFFFFF;
    +	font-family: "sans serif",tahoma,verdana,helvetica;
    +	font-size: 12px;
    +	line-height: 17px;
    +	height: 17px;
    +	padding: 2px 4px;
    +	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
    +	border-style: solid;
    +	border-width: 1px;
    +	display: -moz-inline-stack;
    +	display: inline-block;
    +	vertical-align: middle;
    +	zoom: 1;
    +	*display: inline;
    +}
    +.ke-input-number {
    +	width: 50px;
    +}
    +.ke-input-color {
    +	border: 1px solid #A0A0A0;
    +	background-color: #FFFFFF;
    +	font-size: 12px;
    +	width: 60px;
    +	height: 20px;
    +	line-height: 20px;
    +	padding-left: 5px;
    +	overflow: hidden;
    +	cursor: pointer;
    +	display: -moz-inline-stack;
    +	display: inline-block;
    +	vertical-align: middle;
    +	zoom: 1;
    +	*display: inline;
    +}
    +.ke-upload-button {
    +	position: relative;
    +}
    +.ke-upload-area {
    +	position: relative;
    +	overflow: hidden;
    +	margin: 0;
    +	padding: 0;
    +}
    +.ke-upload-area .ke-upload-file {
    +	position: absolute;
    +	top: 0;
    +	right: 0;
    +	height: 25px;
    +	padding: 0;
    +	margin: 0;
    +	z-index: 811212;
    +	border: 0 none;
    +	opacity: 0;
    +	filter: alpha(opacity=0);
    +}
    +/* tabs */
    +.ke-tabs {
    +	font: 12px/1 "sans serif",tahoma,verdana,helvetica;
    +	border-bottom:1px solid #A0A0A0;
    +	padding-left:5px;
    +	margin-bottom:20px;
    +}
    +.ke-tabs-ul  {
    +	list-style-image:none;
    +	list-style-position:outside;
    +	list-style-type:none;
    +	margin:0;
    +	padding:0;
    +}
    +.ke-tabs-li {
    +	position: relative;
    +	border: 1px solid #A0A0A0;
    +	background-color: #F0F0EE;
    +	margin: 0 2px -1px 0;
    +	padding: 0 20px;
    +	float: left;
    +	line-height: 25px;
    +	text-align: center;
    +	color: #555555;
    +	cursor: pointer;
    +}
    +.ke-tabs-li-selected {
    +	background-color: #FFF;
    +	border-bottom: 1px solid #FFF;
    +	color: #000;
    +	cursor: default;
    +}
    +.ke-tabs-li-on {
    +	background-color: #FFF;
    +	color: #000;
    +}
    +/* progressbar */
    +.ke-progressbar {
    +	position: relative;
    +	margin: 0;
    +	padding: 0;
    +}
    +.ke-progressbar-bar {
    +	border: 1px solid #6FA5DB;
    +	width: 80px;
    +	height: 5px;
    +	margin: 10px 10px 0 10px;
    +	padding: 0;
    +}
    +.ke-progressbar-bar-inner {
    +	width: 0;
    +	height: 5px;
    +	background-color: #6FA5DB;
    +	overflow: hidden;
    +	margin: 0;
    +	padding: 0;
    +}
    +.ke-progressbar-percent {
    +	position: absolute;
    +	top: 0;
    +	left: 40%;
    +	display: none;
    +}
    +/* swfupload */
    +.ke-swfupload-top {
    +	position: relative;
    +	margin-bottom: 10px;
    +	_width: 608px;
    +}
    +.ke-swfupload-button {
    +	height: 23px;
    +	line-height: 23px;
    +}
    +.ke-swfupload-desc {
    +	padding: 0 10px;
    +	height: 23px;
    +	line-height: 23px;
    +}
    +.ke-swfupload-startupload {
    +	position: absolute;
    +	top: 0;
    +	right: 0;
    +}
    +.ke-swfupload-body {
    +	overflow: scroll;
    +	background-color:#FFFFFF;
    +	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
    +	border-style: solid;
    +	border-width: 1px;
    +	width: auto;
    +	height: 370px;
    +	padding: 5px;
    +}
    +.ke-swfupload-body .ke-item {
    +	width: 100px;
    +	margin: 5px;
    +}
    +.ke-swfupload-body .ke-photo {
    +	position: relative;
    +	border: 1px solid #DDDDDD;
    +	background-color:#FFFFFF;
    +	padding: 10px;
    +}
    +.ke-swfupload-body .ke-delete {
    +	display: block;
    +	background: url(default.png) no-repeat scroll 0px -688px;
    +	width: 16px;
    +	height: 16px;
    +	position: absolute;
    +	right: 0;
    +	top: 0;
    +	cursor: pointer;
    +}
    +.ke-swfupload-body .ke-status  {
    +	position: absolute;
    +	left: 0;
    +	bottom: 5px;
    +	width: 100px;
    +	height: 17px;
    +}
    +.ke-swfupload-body .ke-message  {
    +	width: 100px;
    +	text-align: center;
    +	overflow: hidden;
    +	height:17px;
    +}
    +.ke-swfupload-body .ke-error  {
    +	color: red;
    +}
    +.ke-swfupload-body .ke-name {
    +	width: 100px;
    +	text-align: center;
    +	overflow: hidden;
    +	height:16px;
    +}
    +.ke-swfupload-body .ke-on {
    +	border: 1px solid #5690D2;
    +	background-color: #E9EFF6;
    +}
    +
    +/* emoticons */
    +.ke-plugin-emoticons {
    +	position: relative;
    +}
    +.ke-plugin-emoticons .ke-preview {
    +	position: absolute;
    +	text-align: center;
    +	margin: 2px;
    +	padding: 10px;
    +	top: 0;
    +	border: 1px solid #A0A0A0;
    +	background-color: #FFFFFF;
    +	display: none;
    +}
    +.ke-plugin-emoticons .ke-preview-img {
    +	border:0;
    +	margin:0;
    +	padding:0;
    +}
    +.ke-plugin-emoticons .ke-table {
    +	border:0;
    +	margin:0;
    +	padding:0;
    +	border-collapse:separate;
    +}
    +.ke-plugin-emoticons .ke-cell {
    +	margin:0;
    +	padding:1px;
    +	border:1px solid #F0F0EE;
    +	cursor:pointer;
    +}
    +.ke-plugin-emoticons .ke-on {
    +	border: 1px solid #5690D2;
    +	background-color: #E9EFF6;
    +}
    +.ke-plugin-emoticons .ke-img {
    +	display:block;
    +	background-repeat:no-repeat;
    +	overflow:hidden;
    +	margin:2px;
    +	width:24px;
    +	height:24px;
    +	margin: 0;
    +	padding: 0;
    +	border: 0;
    +}
    +.ke-plugin-emoticons .ke-page {
    +	text-align: right;
    +	margin: 5px;
    +	padding: 0;
    +	border: 0;
    +	font: 12px/1 "sans serif",tahoma,verdana,helvetica;
    +	color: #333;
    +	text-decoration: none;
    +}
    +.ke-plugin-plainpaste-textarea,
    +.ke-plugin-wordpaste-iframe {
    +	display: block;
    +	width: 408px;
    +	height: 260px;
    +	font-family: "sans serif",tahoma,verdana,helvetica;
    +	font-size: 12px;
    +	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
    +	border-style: solid;
    +	border-width: 1px;
    +}
    +/* filemanager */
    +.ke-plugin-filemanager-header {
    +	width: 100%;
    +	margin-bottom: 10px;
    +}
    +.ke-plugin-filemanager-header .ke-left {
    +	float: left;
    +}
    +.ke-plugin-filemanager-header .ke-right {
    +	float: right;
    +}
    +.ke-plugin-filemanager-body {
    +	overflow: scroll;
    +	background-color:#FFFFFF;
    +	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
    +	border-style: solid;
    +	border-width: 1px;
    +	width: auto;
    +	height: 370px;
    +	padding: 5px;
    +}
    +.ke-plugin-filemanager-body .ke-item {
    +	width: 100px;
    +	margin: 5px;
    +}
    +.ke-plugin-filemanager-body .ke-photo {
    +	border: 1px solid #DDDDDD;
    +	background-color:#FFFFFF;
    +	padding: 10px;
    +}
    +.ke-plugin-filemanager-body .ke-name {
    +	width: 100px;
    +	text-align: center;
    +	overflow: hidden;
    +	height:16px;
    +}
    +.ke-plugin-filemanager-body .ke-on {
    +	border: 1px solid #5690D2;
    +	background-color: #E9EFF6;
    +}
    +.ke-plugin-filemanager-body .ke-table {
    +	width: 95%;
    +	border: 0;
    +	margin: 0;
    +	padding: 0;
    +	border-collapse: separate;
    +}
    +.ke-plugin-filemanager-body .ke-table .ke-cell {
    +	margin: 0;
    +	padding: 0;
    +	border: 0;
    +}
    +.ke-plugin-filemanager-body .ke-table .ke-name {
    +	width: 55%;
    +	text-align: left;
    +}
    +.ke-plugin-filemanager-body .ke-table .ke-size {
    +	width: 15%;
    +	text-align: left;
    +}
    +.ke-plugin-filemanager-body .ke-table .ke-datetime {
    +	width: 30%;
    +	text-align: center;
    +}
    +/* template */
    +.ke-plugin-template .ke-header {
    +	width: 100%;
    +	margin-bottom: 10px;
    +}
    +.ke-plugin-template label {
    +	margin-right: 0;
    +	cursor: pointer;
    +	font-weight: normal;
    +	display: inline;
    +	vertical-align: top;
    +}
    +.ke-plugin-template .ke-left {
    +	float: left;
    +}
    +.ke-plugin-template .ke-right {
    +	float: right;
    +}
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/default/default.png b/src/main/webapp/plug-in/kindeditor/themes/default/default.png
    new file mode 100644
    index 00000000..cc9e72d2
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/themes/default/default.png differ
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/default/printer.png b/src/main/webapp/plug-in/kindeditor/themes/default/printer.png
    new file mode 100644
    index 00000000..a350d187
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/themes/default/printer.png differ
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/qq/editor.gif b/src/main/webapp/plug-in/kindeditor/themes/qq/editor.gif
    new file mode 100644
    index 00000000..b256841f
    Binary files /dev/null and b/src/main/webapp/plug-in/kindeditor/themes/qq/editor.gif differ
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/qq/qq.css b/src/main/webapp/plug-in/kindeditor/themes/qq/qq.css
    new file mode 100644
    index 00000000..a45e08c6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/themes/qq/qq.css
    @@ -0,0 +1,143 @@
    +/* container */
    +.ke-container-qq {
    +	display: block;
    +	border: 1px solid #c3c3c3;
    +	background-color: #FFF;
    +	overflow: hidden;
    +	margin: 0;
    +	padding: 0;
    +}
    +/* toolbar */
    +.ke-container-qq .ke-toolbar {
    +	border-bottom: 1px solid #c3c3c3;
    +	background-color: #FFFFFF;
    +	padding: 2px 5px;
    +	text-align: left;
    +	overflow: hidden;
    +	zoom: 1;
    +}
    +.ke-toolbar-icon-url {
    +	background-image: url(editor.gif);
    +	width:18px;
    +	*xwidth:20px;
    +	height:18px;
    +	*xheight:20px;
    +}
    +.ke-icon-checked{
    +	background-image: url(../default/default.png);
    +	width:16px;
    +	height:16px;
    +}
    +.ke-container-qq .ke-icon-bold{
    +	background-position: 4px 1px;
    +}
    +.ke-container-qq .ke-icon-italic{
    +	background-position: -27px 1px;
    +}
    +.ke-container-qq .ke-icon-italic{
    +	background-position: -28px 1px;
    +}
    +.ke-container-qq .ke-icon-underline{
    +	background-position: -60px 1px;
    +}
    +.ke-container-qq .ke-icon-fontname{
    +	background-position: -95px 1px;
    +}
    +.ke-container-qq .ke-icon-fontsize{
    +	background-position: -128px 1px;
    +}
    +.ke-container-qq .ke-icon-forecolor{
    +	background-position: -159px 1px;
    +}
    +.ke-container-qq .ke-icon-hilitecolor{
    +	background-position: -190px 1px;
    +}
    +.ke-container-qq .ke-icon-plug-align{
    +	background-position: -223px 1px;
    +}
    +.plug-align-justifyleft{
    +	background-position: -350px 1px;
    +}
    +.plug-align-justifycenter{
    +	background-position: -382px 1px;
    +}
    +.plug-align-justifyright{
    +	background-position: -414px 1px;
    +}
    +.plug-order-insertorderedlist{
    +	background-position: -446px 1px;
    +}
    +.plug-order-insertunorderedlist{
    +	background-position: -477px 1px;
    +}
    +.plug-indent-indent{
    +	background-position: -513px 1px;
    +}
    +.plug-indent-outdent{
    +	background-position: -545px 1px;
    +}
    +.ke-container-qq .ke-icon-plug-order{
    +	background-position: -255px 1px;
    +}
    +.ke-container-qq .ke-icon-plug-indent{
    +	background-position: -287px 1px;
    +}
    +.ke-container-qq .ke-icon-link{
    +	background-position: -319px 1px;
    +}
    +
    +.ke-container-qq .ke-toolbar .ke-outline {
    +	cursor: default;
    +	padding:0px;
    +	border:1px solid #fff;
    +}
    +.ke-container-qq .ke-toolbar .ke-on {
    +	border-left:1px solid white;
    +	border-top:1px solid white;
    +	border-right:1px solid gray;
    +	border-bottom:1px solid gray;
    +	background-color: #FFFFFF;
    +}
    +.ke-container-qq .ke-toolbar .ke-selected {
    +	border-left:1px solid gray;
    +	border-top:1px solid gray;
    +	border-right:1px solid white;
    +	border-bottom:1px solid white;
    +	background-color: #FFFFFF;
    +}
    +.ke-container-qq .ke-toolbar  .ke-disabled {
    +	cursor: default;
    +}
    +
    +.ke-colorpicker-qq{
    +	background:#fff;
    +}
    +/* statusbar */
    +.ke-container-qq .ke-statusbar {
    +	display:none;
    +}
    +/* menu */
    +.ke-menu-qq {
    +	border:1px solid #a6a6a6;
    +	position:absolute;
    +	background:#fff;
    +	-moz-box-shadow:2px 2px 4px #DDDDDD;
    +	z-index:999;
    +	left:-400px;
    +	top:-386px;
    +	right:218px;
    +	width:130px;
    +}
    +.ke-menu-qq .ke-menu-item {
    +	padding:0px;
    +	background:#fff;
    +}
    +.ke-menu-qq .ke-menu-item-on {
    +	border:1px solid #000080;background:#FFEEC2;color:#036;
    +}
    +.ke-menu-qq .ke-toolbar .ke-selected {
    +	border:1px solid #9a9afb;
    +}
    +.ke-menu-qq .ke-menu-item-left{
    +	width:auto;
    +}
    diff --git a/src/main/webapp/plug-in/kindeditor/themes/simple/simple.css b/src/main/webapp/plug-in/kindeditor/themes/simple/simple.css
    new file mode 100644
    index 00000000..4c76cf9d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/kindeditor/themes/simple/simple.css
    @@ -0,0 +1,100 @@
    +/* container */
    +.ke-container-simple {
    +	display: block;
    +	border: 1px solid #CCC;
    +	background-color: #FFF;
    +	overflow: hidden;
    +}
    +/* toolbar */
    +.ke-container-simple .ke-toolbar {
    +	border-bottom: 1px solid #CCC;
    +	background-color: #FFF;
    +	padding: 2px 5px;
    +	overflow: hidden;
    +}
    +.ke-container-simple .ke-toolbar .ke-outline {
    +	border: 1px solid #FFF;
    +	background-color: transparent;
    +	margin: 1px;
    +	padding: 1px 2px;
    +	font-size: 0;
    +	line-height: 0;
    +	overflow: hidden;
    +	cursor: pointer;
    +}
    +.ke-container-simple .ke-toolbar .ke-on {
    +	border: 1px solid #5690D2;
    +}
    +.ke-container-simple .ke-toolbar .ke-selected {
    +	border: 1px solid #5690D2;
    +	background-color: #E9EFF6;
    +}
    +.ke-container-simple .ke-toolbar  .ke-disabled {
    +	cursor: default;
    +}
    +/* statusbar */
    +.ke-container-simple .ke-statusbar {
    +	position: relative;
    +	background-color: #FFF;
    +	border-top: 1px solid #CCCCCC;
    +	font-size: 0;
    +	line-height: 0;
    +	*height: 12px;
    +	overflow: hidden;
    +	text-align: center;
    +	cursor: s-resize;
    +}
    +/* menu */
    +.ke-menu-simple {
    +	border: 1px solid #A0A0A0;
    +	background-color: #FFF;
    +	color: #222222;
    +	padding: 2px;
    +	font-family: "sans serif",tahoma,verdana,helvetica;
    +	font-size: 12px;
    +	text-align: left;
    +	overflow: hidden;
    +}
    +.ke-menu-simple .ke-menu-item {
    +	border: 1px solid #FFF;
    +	background-color: #FFF;
    +	color: #222222;
    +	height: 24px;
    +	overflow: hidden;
    +	cursor: pointer;
    +}
    +.ke-menu-simple .ke-menu-item-on {
    +	border: 1px solid #5690D2;
    +	background-color: #FFF;
    +}
    +/* colorpicker */
    +.ke-colorpicker-simple {
    +	border: 1px solid #A0A0A0;
    +	background-color: #FEFEFE;
    +	color: #222222;
    +	padding: 2px;
    +}
    +.ke-colorpicker-simple .ke-colorpicker-cell {
    +	font-size: 0;
    +	line-height: 0;
    +	border: 1px solid #FEFEFE;
    +	cursor: pointer;
    +	margin:3px;
    +	padding:0;
    +}
    +.ke-colorpicker-simple .ke-colorpicker-cell-top {
    +	font-family: "sans serif",tahoma,verdana,helvetica;
    +	font-size: 12px;
    +	line-height: 24px;
    +	border: 1px solid #FEFEFE;
    +	cursor: pointer;
    +	margin:0;
    +	padding:0;
    +	text-align: center;
    +}
    +.ke-colorpicker-simple .ke-colorpicker-cell-on {
    +	border: 1px solid #5690D2;
    +}
    +.ke-colorpicker-simple .ke-colorpicker-cell-selected {
    +	border: 1px solid #2446AB;
    +}
    diff --git a/src/main/webapp/plug-in/lhgDialog/lhgdialog.min.js b/src/main/webapp/plug-in/lhgDialog/lhgdialog.min.js
    new file mode 100644
    index 00000000..020f5ccc
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lhgDialog/lhgdialog.min.js
    @@ -0,0 +1,7 @@
    +锘/*!
    + * lhgcore Dialog Plugin v4.2.0
    + * Date: 2012-04-19 10:55:11 
    + * http://code.google.com/p/lhgdialog/
    + * Copyright 2009-2012 LiHuiGang
    + */
    +eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(6(a,b,c){A d=b.3i&&!b.4A,e=6(){},f=0,g=/^2O:/,h,i,j=b.1P,k="4B"+ +(2P 3j),l=\'<2o H="4C"><2p><16><K H="4D"></K><K H="4E"></K><K H="4F"></K></16><16><K H="4G"></K><K H="4H"><Q H="4I"><2o H="4J"><2p><16><K 3k="2"><Q H="4K"><Q H="4L" 4M="4N"></Q><Q H="4O"><a H="4P" 1D="1E:2q(0);" R="\\3l\\4Q\\3m"><b H="4R"></b></a><a H="4S" 1D="1E:2q(0);" R="\\3l\\4T\\3m"><b H="4U"></b></a><a H="4V" 1D="1E:2q(0);" R="\\4W\\4X"><b H="4Y"></b><b H="4Z"></b></a><a H="51" 1D="1E:2q(0);" R="\\52\\53(2Q\\54)">\\55</a></Q></Q></K></16><16><K H="56"></K><K H="57"><Q H="58"></Q></K></16><16><K 3k="2"><Q H="59"></Q></K></16></2p></2o></Q></K><K H="5a"></K></16><16><K H="5b"></K><K H="5c"></K><K H="5d"></K></16></2p></2o>\',m,n=6(a,b,c){A d=a.1F;1x(;b<d;b++){c=j.5e?a[b].1b:a[b].5f("1b",4);J(c.3n(c.3o("/")).2r("2R")!==-1)5g}B c=c.1Q("?"),m=c[1],c[0].3n(0,c[0].3o("/")+1)}(j.1y("5h"),0),o=6(a){J(m){A b=m.1Q("&"),c=0,d=b.1F,e;1x(;c<d;c++){e=b[c].1Q("=");J(a===e[0])B e[1]}}B T},p=o("2S")||"5i",q,r=6(a){1R{q=a.C.1P,q.1y}1S(b){B q=a.1P,a}B o("5j")==="5k"||q.1y("5l").1F>0?(q=a.1P,a):a.C}(b),s=q.3p,t=q.5m==="5n";D$1p=a(q),D$C=a(r),D$1q=a(q.1y("1q")[0]);1R{q.5o("5p",!1,!0)}1S(u){}(6(a){J(!a){A b=q.1y("5q")[0],c=q.1G("5r");c.1D=n+"2s/"+p+".1T",c.5s="5t",c.X="3q",b.3r(c,b.3s)}})(q.5u("3q")),d&&6(a){D$1q.1T(a)!=="Y"&&D$1q.1T({5v:1,3t:"2O(5w:5x)",3u:"Y"})}("3u");A v=6(a){a=a||{};A b,d=v.1h;1x(A e 1U d)a[e]===c&&(a[e]=d[e]);B a.X=a.X||k+f,b=v.1z[a.X],b?b.22().N():(a.1r=a.1r||[],a.1H&&a.1r.3v({X:"1H",2t:a.3w,1A:a.1H,N:a.N}),a.1c&&a.1r.3v({X:"1c",2t:a.2T,1A:a.1c}),v.1h.V=a.V,f++,v.1z[a.X]=h?h.2u(a):2P v.23.2u(a))};v.23=v.3x={5y:v,2u:6(a){A c=8,d,e=a.W,f=g.3y(e);B c.5z=b,c.U=a,c.F=d=c.F||c.3z(),c.3A=!1,c.2U=a.2U,a.13&&!f?(a.1i=!1,a.S=!1,d.13[0].7.G="",d.13[0].1j=\'<3B 1b="\'+a.2v+"2s/3C/"+a.13+\'" H="3D"/>\'):d.13[0].7.G="O",d.P.1s(a.2S),d.24[0].7.18=a.Z?"3E-Z":"11",d.R[0].7.18=a.1V?"25":"11",d.S[0].7.G=a.S?"26-1W":"O",d.1i[0].7.G=a.1i?"26-1W":"O",d.1d[0].7.G=a.1c===!1?"O":"26-1W",d.W[0].7.2w=a.2w,c.1r.2x(c,a.1r),c.R(a.R).W(e,!0,f).1I(a.E,a.I).12(a.L,a.C).1X(a.1X)[a.2y?"2y":"2V"](!0).22(),a.N&&c.N(),a.1t&&c.1t(),c.3F().3G(),h=T,!f&&a.1Y&&a.1Y.1e(c,b),c},1r:6(){A b=8,c=b.F,d=c.2z[0],e="5A",f=b.2A=b.2A||{},g=[].5B.1e(2B),h=0,i,j,l,m,n;1x(;h<g.1F;h++)i=g[h],j=i.2t,l=i.X||j,m=!f[l],n=m?q.1G("2W"):f[l].3H,n.5C="1r",f[l]||(f[l]={}),j&&(n.2X=j),i.1A&&(f[l].1A=i.1A),i.N&&(b.28&&b.28.1k(e),b.28=a(n).1s(e),b.N()),n[k+"1A"]=l,n.2Y=!!i.2Y,m&&(f[l].3H=n,d.29(n));B d.7.G=g.1F?"":"O",b.2a(),b},R:6(a){J(a===c)B 8;A b=8.F,d=b.19,e=b.R[0];B a===!1?(e.7.G="O",e.1j="",d.1s("3I")):(e.7.G="",e.1j=a,d.1k("3I")),8},W:6(a,b,d){J(a===c)B 8;A e=8,f=e.F,g=f.P[0],h=g.1a,i=g.1l,j=1J(g.7.L),k=1J(g.7.C),l=g.7.E,m=f.W,n=v.1h.W;B d?(m[0].1j=n,e.3J(a.1Q("2O:")[1])):m.1q(a),b||(h=g.1a-h,i=g.1l-i,j-=h/2,k-=i/2,g.7.L=1f.S(j,0)+"M",g.7.C=1f.S(k,0)+"M",l&&l!=="11"&&(g.7.E=g.1a+"M"),e.2b()),e.2a(),e},1I:6(a,b){A c=8,d=c.F,e=d.P[0],f=d.1u[0].7;B e.7.E="11",1B a=="2c"&&(a+="M"),1B b=="2c"&&(b+="M"),f.E=a,f.I=b,a!=="11"&&(e.7.E=e.1a+"M"),c.2a(),c},12:6(a,b){A e=8,f=e.U,g=e.F.P[0],h=g.7,i=d?!1:f.Y,j=d&&f.Y,k=D$C.1K(),l=D$C.1L(),m=i?0:k,n=i?0:l,o=D$C.E(),p=D$C.I(),q=g.1a,r=g.1l;J(a||a===0)e.3K=a.3L().2r("%")!==-1?a:T,a=e.2Z(a,o-q),1B a=="2c"&&(a=j?a+=k:a+m,a=1f.S(a,m)+"M"),h.L=a;J(b||b===0)e.3M=b.3L().2r("%")!==-1?b:T,b=e.2Z(b,p-r),1B b=="2c"&&(b=j?b+=l:b+n,b=1f.S(b,n)+"M"),h.C=b;B a!==c&&b!==c&&e.2b(),e},1X:6(a,b){A c=8,d=c.3N;B d&&30(d),b&&b.1e(c),a&&(c.3N=2d(6(){c.2e("1c")},5D*a)),c},2y:6(b){B 8.F.P[0].7.2f="3O",8.F.19.1s("3P"),!b&&8.1M&&(a("#1C",q)[0].7.G=""),8},2V:6(b){B 8.F.P[0].7.2f="2C",8.F.19.1k("3P"),!b&&8.1M&&(a("#1C",q)[0].7.G="O"),8},22:6(){A a=8,b=a.F,c=a.2g,d=v.N,e=v.1h.V++;B b.P[0].7.V=e,d&&d.F.19.1k("31"),v.N=a,b.19.1s("31"),c&&c.7.V&&(c.7.G="O"),d&&d!==a&&d.14&&(d.2g.7.G=""),a},N:6(){1R{32=8.28&&8.28[0]||8.F.1d[0],32&&32.N()}1S(a){}B 8},1t:6(){A b=8,c,e=v.1h.V-1,f=b.U,g=a("#1C",q)[0],h=g?g.7:"",i=d?"1m":"Y";B g||(c=\'<14 1b="1E:\\\'\\\'" 7="E:1v%;I:1v%;12:1m;C:0;L:0;z-33:-1;2h:2D(1Z=0)"></14>\',g=q.1G("Q"),g.X="1C",g.7.1w="12:"+i+";L:0;C:0;E:1v%;I:1v%;5E:2C;",h=g.7,d&&(g.1j=c),q.2i.29(g)),i==="1m"&&(h.E=D$C.E(),h.I=D$C.I(),h.C=D$C.1L(),h.L=D$C.1K(),b.34(g)),h.V=e,h.G="",b.22(),b.F.19.1s("3Q"),b.1M=!0,b},3R:6(){A b=8,c=b.U,d=a("#1C",q)[0];J(d&&b.1M){J(c.1N&&c.1N.1M){A e=c.1N.F.P[0].7.V;d.7.V=1J(e,10)-1}2j d.7.G="O";b.F.19.1k("3Q")}B b.1M=!1,b},1d:6(){A c=8,d=c.F,e=d.P,f=v.1z,g=c.U.1d;c.1X();J(c.14){J(1B g=="6"&&g.1e(c,c.14.3S,b)===!1)B c;a(c.14).1n("3T",c.3U).35("1b","1E:\'\'").2k(),d.W.1k("3V"),c.36&&30(c.36)}2j J(1B g=="6"&&g.1e(c,b)===!1)B c;c.3R(),c.1O&&(D$1q.1k("37"),d.2E[0].7.G="O"),v.N===c&&(v.N=T),c.3W(),2F f[c.U.X];J(h)e.2k();2j{h=c,c.2l&&(d.1u[0].7.G="",d.2z[0].7.G="",d.2G[0].7.E=""),d.P[0].7.1w="L:0;C:0;",d.P[0].3X="",d.19.1k("31"),d.R[0].1j="",d.W.1q(""),d.13[0].1j="",d.2z[0].1j="",c.2V(!0).2m();1x(A i 1U c)c.5F(i)&&i!=="F"&&2F c[i]}B c.3A=!0,c},S:6(){A a=8,b,c=a.F,e=c.P[0].7,f=c.1u[0].7,g=c.24[0].7,h=c.R[0].7,i=a.U,j=D$C.1L(),k=D$C.1K();B a.1O?(D$1q.1k("37"),e.C=a.1o.t,e.L=a.1o.l,a.1I(a.1o.w,a.1o.h).2b(),i.1V=a.1o.d,i.Z=a.1o.r,g.18=a.1o.3Y,h.18=a.1o.3Z,c.2E[0].7.G="O",c.S[0].7.G="26-1W",2F a.1o,a.1O=!1):(D$1q.1s("37"),a.2l&&a.1i(),a.1o={t:e.C,l:e.L,w:f.E,h:f.I,d:i.1V,r:i.Z,3Y:g.18,3Z:h.18},e.C=j+"M",e.L=k+"M",b=a.39(),a.1I(b.w,b.h).2m(),d&&t&&(e.E=D$C.E()+"M"),i.1V=!1,i.Z=!1,g.18="11",h.18="11",c.S[0].7.G="O",c.2E[0].7.G="26-1W",a.1O=!0),a},1i:6(){A a=8,b=a.F,c=b.1u[0].7,d=b.2z[0].7,e=b.2G[0].7,f=b.24[0].7.18,g=a.U.Z;B a.2l?(c.G="",d.G=a.2n.40,e.E="",g=a.2n,f.18=a.2n.41?"3E-Z":"11",2F a.2n,a.2l=!1):(a.1O&&a.S(),a.2n={41:g,40:d.G},c.G="O",d.G="O",e.E=c.E,f.18="11",g=!1,a.2l=!0),a.2a(),a},5G:6(a,b){B v.1z[a]?b===1?v.1z[a]:v.1z[a].W||T:T},5H:6(c,d,e){c=c||b;1R{c.42.1D=d?d:c.42.1D}1S(f){d=8.14.1b,a(8.14).35("1b",d)}B e&&e.1e(8),8},3J:6(b){A c=8,e,f,g,h,i,j,k,l=c.F.W,m=c.U,n=c.2g=a(".43",l[0])[0],o="12:1m;L:-44;19:O 0;3a:5I",p="E:1v%;I:1v%;19:O 0;";J(m.45===!1){A s=(2P 3j).5J(),t=b.5K(/([?&])D=[^&]*/,"$5L="+s);b=t+(t===b?(/\\?/.3y(b)?"&":"?")+"D="+s:"")}e=c.14=q.1G("14"),e.2t=m.X,e.7.1w=o,e.5M("5N",0,0),f=a(e),l[0].29(e),c.36=2d(6(){f.35("1b",b)},1);A u=c.3U=6(){l.1s("3V");A b=c.F,f,o=b.5O[0].1l,q=b.1u[0].7;n.7.1w="G:O;12:1m;3a:#46;1Z:0;2h:2D(1Z=0);z-33:1;E:"+q.E+";I:"+q.I+";";1R{g=c.W=e.3S,h=a(g.1P),i=a(g.1P.2i)}1S(s){e.7.1w=p;B}j=m.E==="11"?h.E()+(d?0:1J(i.1T("5P"))):m.E,k=m.I==="11"?h.I():m.I,2d(6(){e.7.1w=p},0),c.1O||c.1I(j,k).12(m.L,m.C),n.7.E=q.E,n.7.I=q.I,m.1Y&&m.1Y.1e(c,g,r)};c.14.5Q=c,f.15("3T",u)},3z:6(){A b=q.1G("Q"),c=q.2i;b.7.1w="12:1m;L:0;C:0;2f:2C;",b.1j=l;A d,e=0,f={P:a(b)},g=b.1y("*"),h=g.1F;1x(;e<h;e++)d=g[e].3X.1Q("5R")[1],d&&(f[d]=a(g[e]));B c.3r(b,c.3s),f},2Z:6(a,b){B 1B a=="2c"?a:(a.2r("%")!==-1&&(a=1J(b*a.1Q("%")[0]/1v)),a)},39:6(){A a=8,b=a.F,c=b.P[0],d=b.1u[0],e,f;B e=D$C.E()-c.1a+d.1a,f=D$C.I()-c.1l+d.1l,{w:e,h:f}},3F:6(){J(d){A a=0,b,c,e,f,g=v.1h.2v+"/2s/",h=8.F.P[0].1y("*");1x(;a<h.1F;a++)b=h[a],c=b.5S.5T,c&&(e=g+c,f=b.5U,f.3t="O",f.2h="5V:5W.5X.5Y(1b=\'"+e+"\',5Z=\'60\')")}B 8},2a:d?6(){A a=8.F.P,b=a[0],c=c+"61",d=a[c],e=b.1a,f=b.1l;e+="M",f+="M",d?(d.7.E=e,d.7.I=f):(d=b.29(q.1G("14")),a[c]=d,d.1b="1E:\'\'",d.7.1w="12:1m;z-33:-1;L:0;C:0;2h:2D(1Z=0);E:"+e+";I:"+f)}:e,2b:6(){8[8.U.Y?"34":"2m"]()},34:6(a){A b=a?a.7:8.F.P[0].7;J(d){A c=D$C.1K(),e=D$C.1L(),f=1J(b.L)-c,g=1J(b.C)-e,h=t?"8.47.2i":"8.47.3p";8.2m(),b.48("L",h+".1K +"+f),b.48("C",h+".1L +"+g)}2j b.12="Y"},2m:6(){A a=8.F.P[0].7;d&&(a.49("L"),a.49("C")),a.12="1m"},2e:6(a){A c=8,d=c.2A[a]&&c.2A[a].1A;B 1B d!="6"||d.1e(c,b)!==!1?c.1d():c},4a:6(){A c=!!b.3i,e,f=8,g=D$C.E(),h=D$C.I(),i=f.4b||g*h,j=f.4c||g,k=f.3K,l=f.3M;J(c){f.1M&&d&&a("#1C",q).1T({E:g+"M",I:h+17+"M"}),4d=f.4c=g,e=f.4b=g*h;J(i===e)B}J(f.1O){A m=f.39();f.1I(m.w,m.h)}J(c&&1f.62(j-4d)===17)B;(k||l)&&f.12(k,l)},3G:6(){A a,b=8,c=b.U,d=b.F;b.3b=6(){a&&30(a),a=2d(6(){b.4a()},63)},D$C.15("Z",b.3b),d.P.15("4e",6(a){A c=a.2H,e;J(c.2Y)B!1;J(c===d.1d[0])B b.2e("1c"),!1;J(c===d.S[0]||c===d.2E[0]||c===d.64[0]||c===d.65[0]||c===d.66[0])B b.S(),!1;J(c===d.1i[0]||c===d.67[0])B b.1i(),!1;e=c[k+"1A"],e&&b.2e(e)}).15("68",6(a){b.22();A e=a.2H;J(c.1V!==!1&&e===d.R[0]||c.Z!==!1&&e===d.24[0])B w(a),!1}),c.S&&d.R.15("3c",6(){B b.S(),!1})},3W:6(){A a=8,b=a.F;b.P.1n(),b.R.1n(),D$C.1n("Z",a.3b)}},v.23.2u.3x=v.23,v.N=T,v.1z={},i=6(a){A b=a.2H,c=v.N,d=a.69;J(!c||!c.U.2Q||c.U.1c===!1)B;d===27&&c.2e(c.U.2T)},D$1p.15("4f",i),r!=b&&a(b).15("6a",6(){A b=v.1z;1x(A c 1U b)b[c]&&b[c].1d();h&&h.F.P.2k(),D$1p.1n("4f",i),a("#1C",q)[0]&&a("#1C",q).2k(),a("#3d",q)[0]&&a("#3d",q).2k()}),v.1h={W:\'<Q H="43"><4g>6b...</4g></Q>\',R:"\\6c\\6d ",1r:T,1H:T,1c:T,1Y:T,1d:T,3w:"\\4h\\6e",2T:"\\6f\\6g",2S:"",2Q:!0,2y:!0,E:"11",I:"11",13:T,2v:n,1t:!1,N:!0,1N:T,2w:"6h",Y:!1,L:"50%",C:"38.2%",S:!0,1i:!0,V:6i,Z:!0,1V:!0,45:!0,2U:T,4i:!1};A w,x="4j"1U s,y="6j"1U s;v.21={3e:e,2I:6(a){A b=v.21;B D$1p.15("4k",b.25).15("4l",b.1g),b.4m=a.2J,b.4n=a.2K,b.3e(a.2J,a.2K),!1},3f:e,25:6(a){A b=v.21;B b.3f(a.2J-b.4m,a.2K-b.4n),!1},3g:e,1g:6(a){A b=v.21;B D$1p.1n("4k",b.25).1n("4l",b.1g),b.3g(a.2J,a.2K),!1}},w=6(b){A c,e,f,g,h,i,j=v.N,k=j.U,l=j.F,m=l.P[0],n=l.R,o=l.1u[0],p=v.21,s="4o"1U r?6(){r.4o().6k()}:6(){1R{q.6l.6m()}1S(a){}};p.3e=6(a,b){i?(e=o.1a,f=o.1l):(g=m.6n,h=m.6o),D$1p.15("3c",p.1g),!d&&y?n.15("4p",p.1g):D$C.15("4q",p.1g),x&&n[0].4j(),l.19.1s("4r"),j.N()},p.3f=6(b,d){J(i){A l=m.7,n=o.7,p=b+e,q=d+f;l.E="11",k.E=n.E=1f.S(0,p)+"M",l.E=m.1a+"M",k.I=n.I=1f.S(0,q)+"M",j.2g&&a(j.2g).1T({E:n.E,I:n.I})}2j{A n=m.7,r=b+g,t=d+h;k.L=1f.S(c.4s,1f.1i(c.2L,r)),k.C=1f.S(c.4t,1f.1i(c.2M,t)),n.L=k.L+"M",n.C=k.C+"M"}s()},p.3g=6(a,b){D$1p.1n("3c",p.1g),!d&&y?n.1n("4p",p.1g):D$C.1n("4q",p.1g),x&&n[0].6p(),d&&j.2b(),l.19.1k("4r")},i=b.2H===l.24[0]?!0:!1,c=6(a){A b=m.1a,c=n[0].1l||20,d=D$C.E(),e=D$C.I(),f=a?0:D$C.1K(),g=a?0:D$C.1L();B 2L=d-b+f,2M=e-c+g,{4s:f,4t:g,2L:2L,2M:2M}}(m.7.12==="Y"),p.2I(b)},a(6(){2d(6(){J(f)B;v({L:"-44",1X:9,Y:!1,1t:!1,N:!1})},6q),v.1h.4i&&6(a){A b=q.1G("Q"),c=b.7,e=d?"1m":"Y";b.X="3d",c.1w="G:O;12:"+e+";L:0;C:0;E:1v%;I:1v%;"+"18:25;2h:2D(1Z=0);1Z:0;3a:#46;6r-6s:O;",q.2i.29(b),a.4u=a.2I,a.4v=a.1g,a.2I=6(){A b=v.N,d=b.F.1u[0],f=b.14;a.4u.2x(8,2B),c.G="1W",c.V=v.1h.V+3,e==="1m"&&(c.E=D$C.E()+"M",c.I=D$C.I()+"M",c.L=D$1p.1K()+"M",c.C=D$1p.1L()+"M"),f&&d.1a*d.1l>6t&&(d.7.2f="2C")},a.1g=6(){A b=v.N;a.4v.2x(8,2B),c.G="O",b&&(b.F.1u[0].7.2f="3O")}}(v.21)}),a.23.2G=6(){A a=2B;B 8.15("4e",6(){B v.2x(8,a),!1}),8},b.2R=a.2G=v})(8.4w||8.4x,8),6(a,b,c){A d=6(){B b.1h.V};b.4y=6(a,c,e){B b({R:"\\6u\\6v",X:"6w",V:d(),13:"4y.2N",Y:!0,1t:!0,W:a,1H:!0,Z:!1,1d:c,1N:e||T})},b.3h=6(a,c,e,f){B b({R:"\\4h\\6x",X:"3h.2N",V:d(),13:"3h.2N",Y:!0,1t:!0,W:a,Z:!1,1N:f||T,1H:6(a){B c.1e(8,a)},1c:6(a){B e&&e.1e(8,a)}})},b.4z=6(a,c,e,f){e=e||"";A g;B b({R:"\\6y\\6z",X:"6A",V:d(),13:"4z.2N",Y:!0,1t:!0,1N:f||T,W:[\'<Q 7="6B-6C:6D;6E-1I:6F">\',a,"</Q>","<Q>",\'<2W 2X="\',e,\'" 7="E:6G;2w:6H 6I" />\',"</Q>"].6J(""),1Y:6(){g=8.F.W[0].1y("2W")[0],g.6K(),g.N()},1H:6(a){B c&&c.1e(8,g.2X,a)},1c:!0})},b.6L=6(a,c,e,f){A g=e?6(){8.F.13[0].1j=\'<3B 1b="\'+8.U.2v+"2s/3C/"+e+\'" H="3D"/>\',8.F.13[0].7.G="",f&&(8.U.1d=f)}:6(){8.F.13[0].7.G="O",f&&(8.U.1d=f)};B b({X:"6M",V:d(),R:!1,1c:!1,Y:!0,1t:!1,Z:!1}).W(a).1X(c||1.5,g)}}(8.4w||8.4x,8.2R)',62,421,'||||||function|style|this||||||||||||||||||||||||||||var|return|top|_|width|DOM|display|class|height|if|td|left|px|focus|none|wrap|div|title|max|null|config|zIndex|content|id|fixed|resize||auto|position|icon|iframe|bind|tr||cursor|border|offsetWidth|src|cancel|close|call|Math|end|setting|min|innerHTML|removeClass|offsetHeight|absolute|unbind|_or|doc|html|button|addClass|lock|main|100|cssText|for|getElementsByTagName|list|callback|typeof|ldg_lockmask|href|javascript|length|createElement|ok|size|parseInt|scrollLeft|scrollTop|_lock|parent|_maxState|document|split|try|catch|css|in|drag|block|time|init|opacity||dragEvent|zindex|fn|rb|move|inline||_focus|appendChild|_ie6SelectFix|_autoPositionType|number|setTimeout|_click|visibility|_load|filter|body|else|remove|_minState|_setAbsolute|_minRz|table|tbody|void|indexOf|skins|name|_init|path|padding|apply|show|buttons|_listeners|arguments|hidden|alpha|res|delete|dialog|target|start|clientX|clientY|maxX|maxY|gif|url|new|esc|lhgdialog|skin|cancelVal|data|hide|input|value|disabled|_toNumber|clearTimeout|ui_state_focus|elemFocus|index|_setFixed|attr|_frmTimer|ui_lock_scroll||_maxSize|background|_winResize|dblclick|ldg_dragmask|onstart|onmove|onend|confirm|ActiveXObject|Date|colspan|u6700|u5316|substr|lastIndexOf|documentElement|lhgdialoglink|insertBefore|firstChild|backgroundImage|backgroundAttachment|push|okVal|prototype|test|_getDOM|closed|img|icons|ui_icon_bg|se|_ie6PngFix|_addEvent|elem|ui_state_tips|_iframe|_left|toString|_top|_timer|visible|ui_state_visible|ui_state_lock|unlock|contentWindow|load|_fmLoad|ui_state_full|_removeEvent|className|rc|tc|btn|rzs|location|ui_loading|9999em|cache|FFF|ownerDocument|setExpression|removeExpression|_reset|_winSize|_lockDocW|newWidth|click|keydown|span|u786e|extendDrag|setCapture|mousemove|mouseup|_sClientX|_sClientY|getSelection|losecapture|blur|ui_state_drag|minX|minY|_start|_end|jQuery|lhgcore|alert|prompt|XMLHttpRequest|JDG|ui_border|ui_lt|ui_t|ui_rt|ui_l|ui_c|ui_inner|ui_dialog|ui_title_bar|ui_title|unselectable|on|ui_title_buttons|ui_min|u5c0f|ui_min_b|ui_max|u5927|ui_max_b|ui_res|u8fd8|u539f|ui_res_b|ui_res_t||ui_close|u5173|u95ed|u952e|u00d7|ui_icon|ui_main|ui_content|ui_buttons|ui_r|ui_lb|ui_b|ui_rb|querySelector|getAttribute|break|script|default|self|true|frameset|compatMode|BackCompat|execCommand|BackgroundImageCache|head|link|rel|stylesheet|getElementById|zoom|about|blank|constructor|opener|ui_state_highlight|slice|type|1e3|overflow|hasOwnProperty|get|reload|transparent|getTime|replace|1_|setAttribute|frameborder|lt|marginLeft|api|ui_|currentStyle|png|runtimeStyle|progid|DXImageTransform|Microsoft|AlphaImageLoader|sizingMethod|scale|iframeMask|abs|140|max_b|res_b|res_t|min_b|mousedown|keyCode|unload|loading|u89c6|u7a97|u5b9a|u53d6|u6d88|10px|1976|onlosecapture|removeAllRanges|selection|empty|offsetLeft|offsetTop|releaseCapture|150|pointer|events|307200|u8b66|u544a|Alert|u8ba4|u63d0|u95ee|Prompt|margin|bottom|5px|font|12px|18em|6px|4px|join|select|tips|Tips'.split('|'),0,{}));
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue.css b/src/main/webapp/plug-in/lhgDialog/skins/blue.css
    new file mode 100644
    index 00000000..28539b0a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lhgDialog/skins/blue.css
    @@ -0,0 +1,118 @@
    +锘緻charset utf-8;
    +/*
    + * lhgdialog blue鐨偆
    + * (C) 2009-2011銆愪竴涓濆啺鍑夈, http://t.qq.com/yisibl, QQ:50167214
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +/*==================鍒朵綔鏂扮毊鑲や粠杩欓噷寮濮嬪鍒==================*/
    +/*鍩烘湰閲嶇疆*/
    +body{ _margin:0; }/*IE6 BUG*/
    +.ui_lock_scroll{ *overflow:hidden; }
    +.ui_lock_scroll body{ overflow:hidden; }
    +
    +/*缁撴瀯灞*/
    +.ui_content,.ui_title,.ui_buttons input{ font:12px/1.333 tahoma,arial,\5b8b\4f53,sans-serif; }
    +table.ui_border,table.ui_dialog{ width:auto;border-spacing:0;*border-collapse:collapse; }
    +.ui_border td,.ui_dialog td{ padding:0; }
    +.ui_dialog{ background:#FFF; }
    +
    +/*鏍囬閮ㄥ垎寮濮*/
    +.ui_title{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;cursor:move;background:#DDD;-moz-user-select:none;-webkit-user-select:none;padding:0 100px 0 0; }
    +.ui_title_buttons{ position:absolute;cursor:pointer;font-size:0;letter-spacing:-.5em; }
    +
    +/*瀵归綈鑷傚簲*/
    +.ui_main{ min-width:6em;min-width:0\9;text-align:center; }
    +.ui_content{ display:inline-block;*display:inline;zoom:1;text-align:left; }
    +.ui_content.ui_state_full{ display:block;width:100%;height:100%;margin:0;padding:0!important; }
    +.ui_content.ui_state_full iframe{ border-radius:0 0 5px 5px; }
    +.ui_loading{ width:96px;height:32px;text-align:left;text-indent:-9999em;overflow:hidden;background:url(icons/loading.gif) no-repeat center center; }
    +.ui_icon_bg{ margin:20px 0 20px 15px; }
    +
    +/*鏍囬绾疌SS鎸夐挳寮濮 min 鏈灏忓寲锛宮ax鏈澶у寲锛宺es杩樺師锛宺ese鎭㈠锛宑lose鍏抽棴*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ position:relative;text-decoration:none;letter-spacing:normal;text-align:center;display:inline-block;*display:inline;zoom:1;vertical-align:top;font-family:tahoma,arial,\5b8b\4f53,sans-serif; }
    +.ui_min b,.ui_max b,.ui_res_t,.ui_res_b{ display:block;position:absolute;overflow:hidden;cursor:pointer; }
    +.ui_close{ font-weight:500;text-decoration:none;outline:0 none; }
    +.ui_close:hover{ text-decoration:none; }
    +
    +/*Tips閮ㄥ垎*/
    +.ui_state_tips .ui_main{ min-width:3em; }
    +.ui_state_tips .ui_content{ margin-top:-2px;padding:8px 10px!important; }
    +.ui_state_tips .ui_icon_bg{ margin:5px 0 6px 9px; }
    +.ui_state_tips .ui_title,.ui_state_tips .ui_title_buttons,.ui_res{ display:none; } /* 杩樺師鎸夐挳涔熷湪杩欓噷闅愯棌锛岃繖鏍峰彲鑺傜渷浠g爜锛屾敞闂磋繖娈典竴瀹氳鍐欏湪涓婇潰閭f浠g爜鐨勪笅闈*/
    +
    +#ldg_lockmask{ background:#DCE2F1;filter:alpha(opacity=60);opacity:.6; }
    +/*==================鍒朵綔鏂扮毊鑲ゅ埌杩欓噷缁撴潫澶嶅埗==================*/
    +
    +/*鏍峰紡灞傚紑濮*/
    +.ui_inner{ background:#FFF; }
    +.ui_title_bar{ width:100%;height:0;position:relative;bottom:24px;_bottom:0;_margin-top:-24px; }
    +.ui_title_buttons{ top:2px;right:0; }
    +.ui_title{ display:block;font-weight:bold;height:22px;line-height:22px;line-height:24px\9;color:#FFF;background:none;font-size:14px; }
    +
    +.ui_lt,.ui_rt,.ui_lb,.ui_rb,.ui_l,.ui_r{ background-image:url(blue/blue_s.png);background-repeat:no-repeat; }
    +.ui_lt{ width:13px;height:33px;background-position:-114px -2px;_png:blue/ie6/ui_lt.png; }
    +.ui_rt{ width:13px;height:33px;background-position:-129px -2px;_png:blue/ie6/ui_rt.png; }
    +.ui_lb{ width:13px;height:13px;background-position:-144px -22px;_png:blue/ie6/ui_lb.png; }
    +.ui_rb{ width:13px;height:13px;background-position:-144px -3px;_png:blue/ie6/ui_rb.png; }
    +
    +.ui_t,.ui_b{ background-image:url(blue/blue_s2.png);background-repeat:repeat-x; }
    +.ui_t{ background-position: 0 0;_png:blue/ie6/ui_t.png; }
    +.ui_b{ background-position: 0 -33px;_png:blue/ie6/ui_b.png; }
    +.ui_l,.ui_r{ background-repeat:repeat-y; }
    +.ui_l{ background-position:0 0;_png:blue/ie6/ui_l.png; }
    +.ui_r{ background-position:-15px 0;_png:blue/ie6/ui_r.png; }
    +
    +/*鏍囬绾疌SS鎸夐挳瀹氫綅閮ㄥ垎*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ background-image:url(blue/blue_s.png);background-repeat:no-repeat;margin-left:3px;color:#FFF;width:19px;height:18px;line-height:18px;_background-image:url(blue/ie6/blue_titbtn.gif); }
    +.ui_min{ background-position:-31px 0;_background-position:0 0; }
    +.ui_min:hover{ background-position:-31px -19px;_background-position:0 -19px; }
    +.ui_max{ background-position:-51px 0;_background-position:-20px 0; }
    +.ui_max:hover{ background-position:-51px -19px;_background-position:-20px -19px; }
    +.ui_res{ background-position:-91px 0;_background-position:-60px 0; }
    +.ui_res:hover{ background-position:-91px -19px;_background-position:-60px -19px; }
    +.ui_close{ background-position:-71px 0;_z-index:1;font-size:0;line-height:0;overflow:hidden;_background-position:-40px 0;*margin-left:0; }
    +.ui_close:hover,.ui_close:focus{ background-position:-71px -19px;_background-position:-40px -19px; }
    +
    +/*搴曢儴鎸夐挳鏍峰紡*/
    +.ui_buttons{ white-space:nowrap;padding:4px 8px;text-align:right;background-color:#F6F6F6;border-top:solid 1px #DADEE5; }
    +.ui_buttons input::-moz-focus-inner{ border:0;padding:0;margin:0; }
    +
    +.ui_buttons input{ padding:3px 10px 3px 12px;padding:5px 10px 2px 12px\0;*padding:4px 10px 2px 10px;margin-left:6px;cursor:pointer;display:inline-block; 
    +text-align:center;line-height:1;height:23px;letter-spacing:3px;overflow:visible;color:#333;border:solid 1px #999;border-radius:3px;border-radius:0\9;background:#DDD;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4');
    +text-shadow:0 1px 1px rgba(255,255,255,1);box-shadow:0 1px 0 rgba(255,255,255,.7),0 -1px 0 rgba(0,0,0,.09);
    +-moz-transition:-moz-box-shadow linear .2s;-webkit-transition:-webkit-box-shadow linear .2s;transition:box-shadow linear .2s; }
    +.ui_buttons input:focus{ outline:0 none;box-shadow:0 0 3px #0e78c9; }
    +.ui_buttons input:hover{ color:#000;border-color:#666;box-shadow:none; }
    +.ui_buttons input:active{ border-color:#666;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4'); }
    +.ui_buttons input[disabled]{ cursor:default;color:#666;background:#DDD;border:solid 1px #999;filter:alpha(opacity=50);opacity:.5;box-shadow:none; }
    +
    +input.ui_state_highlight{ color:#FFF;border:solid 1px #1c6a9e;text-shadow:0 -1px 1px #1c6a9e;background:#2288cc;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +input.ui_state_highlight:hover{ color:#FFF;border-color:#555; }
    +input.ui_state_highlight:active{ border-color:#1c6a9e;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +
    +/*Tips 閮ㄥ垎寮濮(鍙垹闄)*/
    +.ui_state_tips .ui_lt,.ui_state_tips .ui_rt{ height:13px;background-repeat:no-repeat;background-position: 0 0; }
    +.ui_state_tips .ui_lt{ background-image:url(blue/ie6/ui_lt2.png);_png:blue/ie6/ui_lt2.png; }
    +.ui_state_tips .ui_rt{ background-image:url(blue/ie6/ui_rt2.png);_png:blue/ie6/ui_rt2.png; }
    +.ui_state_tips .ui_t{ background-image:url(blue/ie6/ui_t2.png);background-repeat:repeat-x;background-position:0 0;_png:blue/ie6/ui_t2.png; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/blue_s.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/blue_s.png
    new file mode 100644
    index 00000000..8fc0ba64
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/blue_s.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/blue_s2.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/blue_s2.png
    new file mode 100644
    index 00000000..5291d75a
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/blue_s2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/blue_titbtn.gif b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/blue_titbtn.gif
    new file mode 100644
    index 00000000..cca08e6b
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/blue_titbtn.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_b.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_b.png
    new file mode 100644
    index 00000000..f8ff30c3
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_b.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_l.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_l.png
    new file mode 100644
    index 00000000..e1b41fa7
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_l.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_lb.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_lb.png
    new file mode 100644
    index 00000000..5f3230c3
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_lb.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_lt.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_lt.png
    new file mode 100644
    index 00000000..46aff8a3
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_lt.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_lt2.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_lt2.png
    new file mode 100644
    index 00000000..00dd531f
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_lt2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_r.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_r.png
    new file mode 100644
    index 00000000..ab1ea4c8
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_r.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_rb.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_rb.png
    new file mode 100644
    index 00000000..8c89e67e
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_rb.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_rt.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_rt.png
    new file mode 100644
    index 00000000..3f826f08
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_rt.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_rt2.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_rt2.png
    new file mode 100644
    index 00000000..6a84aa09
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_rt2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_t.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_t.png
    new file mode 100644
    index 00000000..833f2ad6
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_t.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_t2.png b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_t2.png
    new file mode 100644
    index 00000000..887b4533
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/blue/ie6/ui_t2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/chrome.css b/src/main/webapp/plug-in/lhgDialog/skins/chrome.css
    new file mode 100644
    index 00000000..61c69d76
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lhgDialog/skins/chrome.css
    @@ -0,0 +1,118 @@
    +锘緻charset utf-8;
    +/*
    + * lhgdialog chrome鐨偆
    + * (C) 2009-2011銆愪竴涓濆啺鍑夈, http://t.qq.com/yisibl, QQ:50167214
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +/*==================鍒朵綔鏂扮毊鑲や粠杩欓噷寮濮嬪鍒==================*/
    +/*鍩烘湰閲嶇疆*/
    +body{ _margin:0; }/*IE6 BUG*/
    +.ui_lock_scroll{ *overflow:hidden; }
    +.ui_lock_scroll body{ overflow:hidden; }
    +
    +/*缁撴瀯灞*/
    +.ui_content,.ui_title,.ui_buttons input{ font:12px/1.333 tahoma,arial,\5b8b\4f53,sans-serif; }
    +table.ui_border,table.ui_dialog{ width:auto;border-spacing:0;*border-collapse:collapse; }
    +.ui_border td,.ui_dialog td{ padding:0; }
    +.ui_dialog{ background:#FFF; }
    +
    +/*鏍囬閮ㄥ垎寮濮*/
    +.ui_title{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;cursor:move;background:#DDD;-moz-user-select:none;-webkit-user-select:none;padding:0 100px 0 0; }
    +.ui_title_buttons{ position:absolute;cursor:pointer;font-size:0;letter-spacing:-.5em; }
    +
    +/*瀵归綈鑷傚簲*/
    +.ui_main{ min-width:6em;min-width:0\9;text-align:center; }
    +.ui_content{ display:inline-block;*display:inline;zoom:1;text-align:left; }
    +.ui_content.ui_state_full{ display:block;width:100%;height:100%;margin:0;padding:0!important; }
    +.ui_content.ui_state_full iframe{ border-radius:0 0 5px 5px; }
    +.ui_loading{ width:96px;height:32px;text-align:left;text-indent:-9999em;overflow:hidden;background:url(icons/loading.gif) no-repeat center center; }
    +.ui_icon_bg{ margin:20px 0 20px 15px; }
    +
    +/*鏍囬绾疌SS鎸夐挳寮濮 min 鏈灏忓寲锛宮ax鏈澶у寲锛宺es杩樺師锛宺ese鎭㈠锛宑lose鍏抽棴*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ position:relative;text-decoration:none;letter-spacing:normal;text-align:center;display:inline-block;*display:inline;zoom:1;vertical-align:top;font-family:tahoma,arial,\5b8b\4f53,sans-serif; }
    +.ui_min b,.ui_max b,.ui_res_t,.ui_res_b{ display:block;position:absolute;overflow:hidden;cursor:pointer; }
    +.ui_close{ font-weight:500;text-decoration:none;outline:0 none; }
    +.ui_close:hover{ text-decoration:none; }
    +
    +/*Tips閮ㄥ垎*/
    +.ui_state_tips .ui_main{ min-width:3em; }
    +.ui_state_tips .ui_content{ margin-top:-2px;padding:8px 10px!important; }
    +.ui_state_tips .ui_icon_bg{ margin:5px 0 6px 9px; }
    +.ui_state_tips .ui_title,.ui_state_tips .ui_title_buttons,.ui_res{ display:none; } /* 杩樺師鎸夐挳涔熷湪杩欓噷闅愯棌锛岃繖鏍峰彲鑺傜渷浠g爜锛屾敞闂磋繖娈典竴瀹氳鍐欏湪涓婇潰閭f浠g爜鐨勪笅闈*/
    +
    +#ldg_lockmask{ background:#DCE2F1;filter:alpha(opacity=60);opacity:.6; }
    +/*==================鍒朵綔鏂扮毊鑲ゅ埌杩欓噷缁撴潫澶嶅埗==================*/
    +
    +/*鏍峰紡灞傚紑濮*/
    +.ui_inner{ background:#FFF; }
    +.ui_title_bar{ width:100%;height:0;position:relative;bottom:24px;_bottom:0;_margin-top:-24px; }
    +.ui_title_buttons{ top:-1px;*top:-2px;_top:-1px;right:0; }
    +.ui_title { display:block;font-weight:bold;height:22px;line-height:22px;color:#FFF;background:none;font-size:14px; }
    +
    +.ui_lt,.ui_rt,.ui_lb,.ui_rb,.ui_l,.ui_r{ background-image:url(chrome/chrome_s.gif);background-repeat:no-repeat; }
    +.ui_lt{ width:5px;height:26px;background-position:-121px -8px; }
    +.ui_rt{ width:5px;height:26px;background-position:-128px -8px; }
    +.ui_lb{ width:5px;height:5px;background-position:-121px -2px; }
    +.ui_rb{ width:5px;height:5px;background-position:-128px -2px; }
    +
    +.ui_t,.ui_b{ background-image:url(chrome/chrome_s2.gif);background-repeat:repeat-x; }
    +.ui_t{ background-position:0 0; }
    +.ui_b{ background-position:0 -26px; }
    +.ui_l,.ui_r{ background-repeat:repeat-y; }
    +.ui_l{ background-position:-135px 0; }
    +.ui_r{ background-position:-140px 0; }
    +
    +/*鏍囬绾疌SS鎸夐挳瀹氫綅閮ㄥ垎*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ background-image:url(chrome/chrome_s.gif);background-repeat:no-repeat;color:#FFF;width:25px;height:18px;line-height:18px; }
    +.ui_min{ background-position:0 0; }
    +.ui_min:hover{ background-position:0 -18px; }
    +.ui_max{ background-position:-25px 0; }
    +.ui_max:hover{ background-position:-25px -18px; }
    +.ui_res{ background-position:-50px 0; }
    +.ui_res:hover{ background-position:-50px -18px; }
    +.ui_close{ background-position:-75px 0;_z-index:1;font-size:0;line-height:0;overflow:hidden;_margin-left:0;width:44px; }
    +.ui_close:hover,.ui_close:focus{ background-position:-75px -18px; }
    +
    +/*搴曢儴鎸夐挳鏍峰紡*/
    +.ui_buttons{ white-space:nowrap;padding:4px 8px;text-align:right;background-color:#F6F6F6;border-top:solid 1px #DADEE5; }
    +.ui_buttons input::-moz-focus-inner{ border:0;padding:0;margin:0; }
    +
    +.ui_buttons input{ padding:3px 10px 3px 12px;padding:5px 10px 2px 12px\0;*padding:4px 10px 2px 10px;margin-left:6px;cursor:pointer;display:inline-block; 
    +text-align:center;line-height:1;height:23px;letter-spacing:3px;overflow:visible;color:#333;border:solid 1px #999;border-radius:3px;border-radius:0\9;background:#DDD;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4');
    +text-shadow:0 1px 1px rgba(255,255,255,1);box-shadow:0 1px 0 rgba(255,255,255,.7),0 -1px 0 rgba(0,0,0,.09);
    +-moz-transition:-moz-box-shadow linear .2s;-webkit-transition:-webkit-box-shadow linear .2s;transition:box-shadow linear .2s; }
    +.ui_buttons input:focus{ outline:0 none;box-shadow:0 0 3px #0e78c9; }
    +.ui_buttons input:hover{ color:#000;border-color:#666;box-shadow:none; }
    +.ui_buttons input:active{ border-color:#666;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4'); }
    +.ui_buttons input[disabled]{ cursor:default;color:#666;background:#DDD;border:solid 1px #999;filter:alpha(opacity=50);opacity:.5;box-shadow:none; }
    +
    +input.ui_state_highlight{ color:#FFF;border:solid 1px #1c6a9e;text-shadow:0 -1px 1px #1c6a9e;background:#2288cc;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +input.ui_state_highlight:hover{ color:#FFF;border-color:#555; }
    +input.ui_state_highlight:active{ border-color:#1c6a9e;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +
    +/*Tips 閮ㄥ垎寮濮(鍙垹闄)*/
    +.ui_state_tips .ui_lt,.ui_state_tips .ui_rt,.ui_state_tips .ui_t{ height:5px;background-image:url(chrome/chrome_s3.gif);background-repeat:no-repeat; }
    +.ui_state_tips .ui_lt{ background-position:0 -5px; }
    +.ui_state_tips .ui_rt{ background-position:0 -10px; }
    +.ui_state_tips .ui_t{ background-position:0 0; background-repeat:repeat-x; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/chrome/chrome_s.gif b/src/main/webapp/plug-in/lhgDialog/skins/chrome/chrome_s.gif
    new file mode 100644
    index 00000000..9d39deba
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/chrome/chrome_s.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/chrome/chrome_s2.gif b/src/main/webapp/plug-in/lhgDialog/skins/chrome/chrome_s2.gif
    new file mode 100644
    index 00000000..ce083574
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/chrome/chrome_s2.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/chrome/chrome_s3.gif b/src/main/webapp/plug-in/lhgDialog/skins/chrome/chrome_s3.gif
    new file mode 100644
    index 00000000..751c2125
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/chrome/chrome_s3.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/default.css b/src/main/webapp/plug-in/lhgDialog/skins/default.css
    new file mode 100644
    index 00000000..b3bdd884
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lhgDialog/skins/default.css
    @@ -0,0 +1,120 @@
    +锘緻charset utf-8;
    +/*
    + * lhgdialog iblue鐨偆
    + * (C) 2009-2011銆愪竴涓濆啺鍑夈, http://t.qq.com/yisibl, QQ:50167214
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +/*==================鍒朵綔鏂扮毊鑲や粠杩欓噷寮濮嬪鍒==================*/
    +/*鍩烘湰閲嶇疆*/
    +body{ _margin:0; }/*IE6 BUG*/
    +.ui_lock_scroll{ *overflow:hidden; }
    +.ui_lock_scroll body{ overflow:hidden; }
    +
    +/*缁撴瀯灞*/
    +.ui_content,.ui_title,.ui_buttons input{ font:12px/1.333 tahoma,arial,\5b8b\4f53,sans-serif; }
    +table.ui_border,table.ui_dialog{ width:auto;border-spacing:0;*border-collapse:collapse; }
    +.ui_border td,.ui_dialog td{ padding:0; }
    +.ui_dialog{ background:#FFF; }
    +
    +/*鏍囬閮ㄥ垎寮濮*/
    +.ui_title{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;cursor:move;background:#DDD;-moz-user-select:none;-webkit-user-select:none;padding:0 100px 0 0; }
    +.ui_title_buttons{ position:absolute;cursor:pointer;font-size:0;letter-spacing:-.5em; }
    +
    +/*瀵归綈鑷傚簲*/
    +.ui_main{ min-width:6em;min-width:0\9;text-align:center; }
    +.ui_content{ display:inline-block;*display:inline;zoom:1;text-align:left; }
    +.ui_content.ui_state_full{ display:block;width:100%;height:100%;margin:0;padding:0!important; }
    +.ui_content.ui_state_full iframe{ border-radius:0 0 5px 5px; }
    +.ui_loading{ width:96px;height:32px;text-align:left;text-indent:-9999em;overflow:hidden;background:url(icons/loading.gif) no-repeat center center; }
    +.ui_icon_bg{ margin:20px 0 20px 15px; }
    +
    +/*鏍囬绾疌SS鎸夐挳寮濮 min 鏈灏忓寲锛宮ax鏈澶у寲锛宺es杩樺師锛宺ese鎭㈠锛宑lose鍏抽棴*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ position:relative;text-decoration:none;letter-spacing:normal;text-align:center;display:inline-block;*display:inline;zoom:1;vertical-align:top;font-family:tahoma,arial,\5b8b\4f53,sans-serif; }
    +.ui_min b,.ui_max b,.ui_res_t,.ui_res_b{ display:block;position:absolute;overflow:hidden;cursor:pointer; }
    +.ui_close{ font-weight:500;text-decoration:none;outline:0 none; }
    +.ui_close:hover{ text-decoration:none; }
    +
    +/*Tips閮ㄥ垎*/
    +.ui_state_tips .ui_main{ min-width:3em; }
    +.ui_state_tips .ui_content{ margin-top:-2px;padding:8px 10px!important; }
    +.ui_state_tips .ui_icon_bg{ margin:5px 0 6px 9px; }
    +.ui_state_tips .ui_title,.ui_state_tips .ui_title_buttons,.ui_res{ display:none; } /* 杩樺師鎸夐挳涔熷湪杩欓噷闅愯棌锛岃繖鏍峰彲鑺傜渷浠g爜锛屾敞闂磋繖娈典竴瀹氳鍐欏湪涓婇潰閭f浠g爜鐨勪笅闈*/
    +
    +#ldg_lockmask{ background:#DCE2F1;filter:alpha(opacity=60);opacity:.6; }
    +/*==================鍒朵綔鏂扮毊鑲ゅ埌杩欓噷缁撴潫澶嶅埗==================*/
    +
    +/*鏍峰紡灞傚紑濮*/
    +.ui_inner{ background:#FFF; }
    +.ui_title_bar{ width:100%;height:0;position:relative;bottom:27px;_bottom:0;_margin-top:-27px; }
    +.ui_title{ display:block;font-weight:bold;height:22px;line-height:22px;line-height:24px\9;color:#FFF;background:none;font-size:14px;padding-left:7px; }
    +
    +
    +.ui_lt,.ui_rt,.ui_lb,.ui_rb,.ui_t,.ui_b{ background-image:url(iblue/iblue_s.png);background-repeat:no-repeat; }
    +.ui_lt{ width:13px;height:36px;background-position:0 0;_png:iblue/ie6/ui_lt.png; }
    +.ui_rt{ width:13px;height:36px;background-position:-13px 0;_png:iblue/ie6/ui_rt.png; }
    +.ui_lb{ width:13px;height:16px;background-position:0 -36px;_png:iblue/ie6/ui_lb.png; }
    +.ui_rb{ width:13px;height:16px;background-position:-13px -36px;_png:iblue/ie6/ui_rb.png; }
    +
    +.ui_t,.ui_b{ background-repeat:repeat-x; }
    +.ui_t{ background-position: 0 -52px;_png:iblue/ie6/ui_t.png; }
    +.ui_b{ background-position: 0 -88px;_png:iblue/ie6/ui_b.png; }
    +.ui_l,.ui_r{ background-image:url(iblue/iblue_s2.png);background-repeat:repeat-y; }
    +.ui_l{ background-position:0 0;_png:iblue/ie6/ui_l.png; }
    +.ui_r{ background-position:-13px 0;_png:iblue/ie6/ui_r.png; }
    +
    +/*鏍囬绾疌SS鎸夐挳瀹氫綅閮ㄥ垎*/
    +.ui_title_buttons{ top:2px;right:5px; }
    +.ui_min,.ui_max,.ui_close,.ui_res{ color:#FFF;font-size:22px;width:22px;height:22px;line-height:18px; }
    +.ui_min_b{ top:10px;left:5px;width:12px;height:2px;border-bottom:2px solid #FFF; }
    +.ui_max_b{ top:5px;left:5px;width:10px;height:7px; }
    +.ui_res_t,.ui_res_b{ top:8px;left:3px;width:10px;height:5px; }
    +.ui_res_b{ top:4px;left:6px; }
    +.ui_res_t,.ui_res_b,.ui_max_b{ border:1px solid #FFF;border-top-width:3px; }
    +.ui_res_t{ background:#3d8cce; }
    +.ui_min:hover b,.ui_max:hover b,.ui_res:hover b{ border-color:#555; }
    +.ui_close{ vertical-align:baseline;_line-height:22px; }
    +.ui_close:hover,.ui_close:focus{ color:#c93333; }
    +
    +/*搴曢儴鎸夐挳鏍峰紡*/
    +.ui_buttons{ white-space:nowrap;padding:4px 8px;text-align:right;background-color:#FFF; }
    +.ui_buttons input::-moz-focus-inner{ border:0;padding:0;margin:0; }
    +
    +.ui_buttons input{ padding:3px 10px 3px 12px;padding:5px 10px 2px 12px\0;*padding:4px 10px 2px 10px;margin-left:6px;cursor:pointer;display:inline-block; 
    +text-align:center;line-height:1;height:23px;letter-spacing:3px;overflow:visible;color:#333;border:solid 1px #999;border-radius:3px;border-radius:0\9;background:#DDD;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4');
    +text-shadow:0 1px 1px rgba(255,255,255,1);box-shadow:0 1px 0 rgba(255,255,255,.7),0 -1px 0 rgba(0,0,0,.09);
    +-moz-transition:-moz-box-shadow linear .2s;-webkit-transition:-webkit-box-shadow linear .2s;transition:box-shadow linear .2s; }
    +.ui_buttons input:focus{ outline:0 none;box-shadow:0 0 3px #0e78c9; }
    +.ui_buttons input:hover{ color:#000;border-color:#666;box-shadow:none; }
    +.ui_buttons input:active{ border-color:#666;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4'); }
    +.ui_buttons input[disabled]{ cursor:default;color:#666;background:#DDD;border:solid 1px #999;filter:alpha(opacity=50);opacity:.5;box-shadow:none; }
    +
    +input.ui_state_highlight{ color:#FFF;border:solid 1px #1c6a9e;text-shadow:0 -1px 1px #1c6a9e;background:#2288cc;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +input.ui_state_highlight:hover{ color:#FFF;border-color:#555; }
    +input.ui_state_highlight:active{ border-color:#1c6a9e;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +
    +/*Tips 閮ㄥ垎寮濮(鍙垹闄)*/
    +.ui_state_tips .ui_lt,.ui_state_tips .ui_rt{ height:16px;background-repeat:no-repeat;background-position:0 0; }
    +.ui_state_tips .ui_lt{ background-image:url(iblue/ie6/ui_lt2.png);_png:iblue/ie6/ui_lt2.png; }
    +.ui_state_tips .ui_rt{ background-image:url(iblue/ie6/ui_rt2.png);_png:iblue/ie6/ui_rt2.png; }
    +.ui_state_tips .ui_t{ background-image:url(iblue/ie6/ui_t2.png);background-repeat:repeat-x;background-position:0 0;_png:iblue/ie6/ui_t2.png; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/discuz.css b/src/main/webapp/plug-in/lhgDialog/skins/discuz.css
    new file mode 100644
    index 00000000..ae942bbd
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lhgDialog/skins/discuz.css
    @@ -0,0 +1,122 @@
    +@charset "utf-8";
    +/*
    + * lhgdialog discuz鐨偆
    + * (C) 2009-2011 銆愪竴涓濆啺鍑夈, http://t.qq.com/yisibl, QQ:50167214
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +/*==================鍒朵綔鏂扮毊鑲や粠杩欓噷寮濮嬪鍒==================*/
    +/*鍩烘湰閲嶇疆*/
    +body{ _margin:0; }/*IE6 BUG*/
    +.ui_lock_scroll{ *overflow:hidden; }
    +.ui_lock_scroll body{ overflow:hidden; }
    +
    +/*缁撴瀯灞*/
    +.ui_content,.ui_title,.ui_buttons input{ font:12px/1.333 tahoma,arial,\5b8b\4f53,sans-serif; }
    +table.ui_border,table.ui_dialog{ width:auto;border-spacing:0;*border-collapse:collapse; }
    +.ui_border td,.ui_dialog td{ padding:0; }
    +.ui_dialog{ background:#FFF; }
    +
    +/*鏍囬閮ㄥ垎寮濮*/
    +.ui_title{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;cursor:move;background:#DDD;-moz-user-select:none;-webkit-user-select:none;padding:0 100px 0 0; }
    +.ui_title_buttons{ position:absolute;cursor:pointer;font-size:0;letter-spacing:-.5em; }
    +
    +/*瀵归綈鑷傚簲*/
    +.ui_main{ min-width:6em;min-width:0\9;text-align:center; }
    +.ui_content{ display:inline-block;*display:inline;zoom:1;text-align:left; }
    +.ui_content.ui_state_full{ display:block;width:100%;height:100%;margin:0;padding:0!important; }
    +.ui_content.ui_state_full iframe{ border-radius:0 0 5px 5px; }
    +.ui_loading{ width:96px;height:32px;text-align:left;text-indent:-9999em;overflow:hidden;background:url(icons/loading.gif) no-repeat center center; }
    +.ui_icon_bg{ margin:20px 0 20px 15px; }
    +
    +/*鏍囬绾疌SS鎸夐挳寮濮 min 鏈灏忓寲锛宮ax鏈澶у寲锛宺es杩樺師锛宺ese鎭㈠锛宑lose鍏抽棴*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ position:relative;text-decoration:none;letter-spacing:normal;text-align:center;display:inline-block;*display:inline;zoom:1;vertical-align:top;font-family:tahoma,arial,\5b8b\4f53,sans-serif; }
    +.ui_min b,.ui_max b,.ui_res_t,.ui_res_b{ display:block;position:absolute;overflow:hidden;cursor:pointer; }
    +.ui_close{ font-weight:500;text-decoration:none;outline:0 none; }
    +.ui_close:hover{ text-decoration:none; }
    +
    +/*Tips閮ㄥ垎*/
    +.ui_state_tips .ui_main{ min-width:3em; }
    +.ui_state_tips .ui_content{ margin-top:-2px;padding:8px 10px!important; }
    +.ui_state_tips .ui_icon_bg{ margin:5px 0 6px 9px; }
    +.ui_state_tips .ui_title,.ui_state_tips .ui_title_buttons,.ui_res{ display:none; } /* 杩樺師鎸夐挳涔熷湪杩欓噷闅愯棌锛岃繖鏍峰彲鑺傜渷浠g爜锛屾敞闂磋繖娈典竴瀹氳鍐欏湪涓婇潰閭f浠g爜鐨勪笅闈*/
    +
    +#ldg_lockmask{ background:#DCE2F1;filter:alpha(opacity=60);opacity:.6; }
    +/*==================鍒朵綔鏂扮毊鑲ゅ埌杩欓噷缁撴潫澶嶅埗==================*/
    +
    +/*鏍峰紡灞傚紑濮*/
    +.ui_inner{ border:1px solid #888; }
    +.ui_border{ border-radius:4px; }
    +.ui_lt,.ui_rt,.ui_lb,.ui_rb{ width:7px;height:7px;display:block; }/*闃叉鏀瑰彉娴忚鍣ㄥぇ灏忔尋鍘嬬獥鍙h竟妗*/
    +.ui_lt{ border-radius:4px 0 0 0; }.ui_rt{ border-radius:0 4px 0 0; }.ui_rb{ border-radius:0 0 4px 0; }.ui_lb{ border-radius:0 0 0 4px; }
    +.ui_lt,.ui_rt,.ui_l,.ui_r,.ui_lb,.ui_b,.ui_t,.ui_rb{ background:rgba(0,0,0,.2);background:#000\9;filter:alpha(opacity=20); }
    +
    +/*鏍囬鏍忔牱寮*/
    +.ui_title_bar{ position:relative;height:100%; }
    +.ui_title{ height:30px;line-height:30px;font-size:14px;font-weight:bold;color:#888;border-bottom:1px solid #DDD\9;background:none;padding-left:7px; }
    +.ui_title:after{ content:"";display:block;height:8px;width:100%;position:absolute;top:26px;left:0;
    +background:-moz-radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%); /* FF3.6+ */
    +background:-webkit-radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%); /* Chrome10+,Safari5.1+ */
    +background:-o-radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%); /* Opera 12+ */
    +background:-ms-radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%); /* IE10+ */
    +background:radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%);/* W3C */display:none\9; }
    +.ui_title:before{ content:"";display:block;height:5px;width:100%;position:absolute;top:26px;left:0;background:#FFF;z-index:1;display:none\9; }
    +.ui_state_focus .ui_title { color:#336699; }
    +.ui_state_drag .ui_title { border-top-color:#4E84C0; }
    +
    +/*鏍囬绾疌SS鎸夐挳瀹氫綅閮ㄥ垎*/
    +.ui_title_buttons{ top:5px;right:5px; }
    +.ui_min,.ui_max,.ui_close,.ui_res{ margin-left:2px;color:#888;font-size:20px;width:20px;height:20px;line-height:18px;border-radius:2px; }
    +.ui_min_b{ top:10px;left:4px;width:12px;height:2px;border-bottom:2px solid #888; }
    +.ui_max_b{ top:5px;left:4px;width:10px;height:7px; }
    +.ui_res_t,.ui_res_b{ top:8px;left:2px;width:10px;height:5px; }
    +.ui_res_b{ top:4px;left:6px; }
    +.ui_res_t,.ui_res_b,.ui_max_b{ border:1px solid #888;border-top-width:3px; }
    +.ui_res_t{ background:#FFF; }/*杩樺師鎸夐挳搴曢儴妗嗚儗鏅笌鏍囬鑳屾櫙铻嶅悎*/
    +.ui_close{ vertical-align:baseline;_line-height:22px;margin-left:0; }
    +.ui_close:hover,.ui_close:focus { color:#FFF;outline:0 none;background:#c72327; }
    +.ui_min:hover b,.ui_max:hover b,.ui_res:hover b{ border-color:#FFF; }
    +.ui_res:hover b{ background:#039ed0;}
    +.ui_min:hover,.ui_max:hover,.ui_res:hover{ background:#039ed0; }
    +/*鏍囬鎸夐挳缁撴潫*/
    +
    +/*搴曢儴鎸夐挳鏍峰紡*/
    +.ui_buttons{ white-space:nowrap;padding:4px 8px;text-align:right;background-color:#F6F6F6;border-top:solid 1px #DADEE5; }
    +.ui_buttons input::-moz-focus-inner{ border:0;padding:0;margin:0; }
    +
    +.ui_buttons input{ padding:3px 10px 3px 12px;padding:5px 10px 2px 12px\0;*padding:4px 10px 2px 10px;margin-left:6px;cursor:pointer;display:inline-block; 
    +text-align:center;line-height:1;height:23px;letter-spacing:3px;overflow:visible;color:#333;border:solid 1px #999;border-radius:3px;border-radius:0\9;background:#DDD;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4');
    +text-shadow:0 1px 1px rgba(255,255,255,1);box-shadow:0 1px 0 rgba(255,255,255,.7),0 -1px 0 rgba(0,0,0,.09);
    +-moz-transition:-moz-box-shadow linear .2s;-webkit-transition:-webkit-box-shadow linear .2s;transition:box-shadow linear .2s; }
    +.ui_buttons input:focus{ outline:0 none;box-shadow:0 0 3px #0e78c9; }
    +.ui_buttons input:hover{ color:#000;border-color:#666;box-shadow:none; }
    +.ui_buttons input:active{ border-color:#666;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4'); }
    +.ui_buttons input[disabled]{ cursor:default;color:#666;background:#DDD;border:solid 1px #999;filter:alpha(opacity=50);opacity:.5;box-shadow:none; }
    +
    +input.ui_state_highlight{ color:#FFF;border:solid 1px #1c6a9e;text-shadow:0 -1px 1px #1c6a9e;background:#2288cc;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +input.ui_state_highlight:hover{ color:#FFF;border-color:#555; }
    +input.ui_state_highlight:active{ border-color:#1c6a9e;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +
    +/*Tips 閮ㄥ垎寮濮*/
    +.ui_state_tips,.ui_state_tips .ui_inner,.ui_state_tips .ui_title_bar{ border:0 none;box-shadow:none; }
    +.ui_state_tips .ui_lt,.ui_state_tips .ui_rt,.ui_state_tips .ui_lb,.ui_state_tips .ui_rb{ width:5px;height:5px; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack.css b/src/main/webapp/plug-in/lhgDialog/skins/iblack.css
    new file mode 100644
    index 00000000..72bd665c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lhgDialog/skins/iblack.css
    @@ -0,0 +1,120 @@
    +锘緻charset utf-8;
    +/*
    + * lhgdialog iblack鐨偆
    + * (C) 2009-2011銆愪竴涓濆啺鍑夈, http://t.qq.com/yisibl, QQ:50167214
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +/*==================鍒朵綔鏂扮毊鑲や粠杩欓噷寮濮嬪鍒==================*/
    +/*鍩烘湰閲嶇疆*/
    +body{ _margin:0; }/*IE6 BUG*/
    +.ui_lock_scroll{ *overflow:hidden; }
    +.ui_lock_scroll body{ overflow:hidden; }
    +
    +/*缁撴瀯灞*/
    +.ui_content,.ui_title,.ui_buttons input{ font:12px/1.333 tahoma,arial,\5b8b\4f53,sans-serif; }
    +table.ui_border,table.ui_dialog{ width:auto;border-spacing:0;*border-collapse:collapse; }
    +.ui_border td,.ui_dialog td{ padding:0; }
    +.ui_dialog{ background:#FFF; }
    +
    +/*鏍囬閮ㄥ垎寮濮*/
    +.ui_title{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;cursor:move;background:#DDD;-moz-user-select:none;-webkit-user-select:none;padding:0 100px 0 0; }
    +.ui_title_buttons{ position:absolute;cursor:pointer;font-size:0;letter-spacing:-.5em; }
    +
    +/*瀵归綈鑷傚簲*/
    +.ui_main{ min-width:6em;min-width:0\9;text-align:center; }
    +.ui_content{ display:inline-block;*display:inline;zoom:1;text-align:left; }
    +.ui_content.ui_state_full{ display:block;width:100%;height:100%;margin:0;padding:0!important; }
    +.ui_content.ui_state_full iframe{ border-radius:0 0 5px 5px; }
    +.ui_loading{ width:96px;height:32px;text-align:left;text-indent:-9999em;overflow:hidden;background:url(icons/loading.gif) no-repeat center center; }
    +.ui_icon_bg{ margin:20px 0 20px 15px; }
    +
    +/*鏍囬绾疌SS鎸夐挳寮濮 min 鏈灏忓寲锛宮ax鏈澶у寲锛宺es杩樺師锛宺ese鎭㈠锛宑lose鍏抽棴*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ position:relative;text-decoration:none;letter-spacing:normal;text-align:center;display:inline-block;*display:inline;zoom:1;vertical-align:top;font-family:tahoma,arial,\5b8b\4f53,sans-serif; }
    +.ui_min b,.ui_max b,.ui_res_t,.ui_res_b{ display:block;position:absolute;overflow:hidden;cursor:pointer; }
    +.ui_close{ font-weight:500;text-decoration:none;outline:0 none; }
    +.ui_close:hover{ text-decoration:none; }
    +
    +/*Tips閮ㄥ垎*/
    +.ui_state_tips .ui_main{ min-width:3em; }
    +.ui_state_tips .ui_content{ margin-top:-2px;padding:8px 10px!important; }
    +.ui_state_tips .ui_icon_bg{ margin:5px 0 6px 9px; }
    +.ui_state_tips .ui_title,.ui_state_tips .ui_title_buttons,.ui_res{ display:none; } /* 杩樺師鎸夐挳涔熷湪杩欓噷闅愯棌锛岃繖鏍峰彲鑺傜渷浠g爜锛屾敞闂磋繖娈典竴瀹氳鍐欏湪涓婇潰閭f浠g爜鐨勪笅闈*/
    +
    +#ldg_lockmask{ background:#DCE2F1;filter:alpha(opacity=60);opacity:.6; }
    +/*==================鍒朵綔鏂扮毊鑲ゅ埌杩欓噷缁撴潫澶嶅埗==================*/
    +
    +/*鏍峰紡灞傚紑濮*/
    +.ui_inner{ background:#FFF; }
    +.ui_title_bar{ width:100%;height:0;position:relative;bottom:27px;_bottom:0;_margin-top:-27px; }
    +.ui_title{ display:block;font-weight:bold;height:22px;line-height:22px;line-height:24px\9;color:#FFF;background:none;font-size:14px;padding-left:7px; }
    +
    +
    +.ui_lt,.ui_rt,.ui_lb,.ui_rb,.ui_t,.ui_b{ background-image:url(iblack/iblack_s.png);background-repeat:no-repeat; }
    +.ui_lt{ width:13px;height:36px;background-position:0 0;_png:iblack/ie6/ui_lt.png; }
    +.ui_rt{ width:13px;height:36px;background-position:-13px 0;_png:iblack/ie6/ui_rt.png; }
    +.ui_lb{ width:13px;height:16px;background-position:0 -36px;_png:iblack/ie6/ui_lb.png; }
    +.ui_rb{ width:13px;height:16px;background-position:-13px -36px;_png:iblack/ie6/ui_rb.png; }
    +
    +.ui_t,.ui_b{ background-repeat:repeat-x; }
    +.ui_t{ background-position: 0 -52px;_png:iblack/ie6/ui_t.png; }
    +.ui_b{ background-position: 0 -88px;_png:iblack/ie6/ui_b.png; }
    +.ui_l,.ui_r{ background-image:url(iblack/iblack_s2.png);background-repeat:repeat-y; }
    +.ui_l{ background-position:0 0;_png:iblack/ie6/ui_l.png; }
    +.ui_r{ background-position:-13px 0;_png:iblack/ie6/ui_r.png; }
    +
    +/*鏍囬绾疌SS鎸夐挳瀹氫綅閮ㄥ垎*/
    +.ui_title_buttons{ top:2px;right:5px; }
    +.ui_min,.ui_max,.ui_close,.ui_res{ color:#FFF;font-size:22px;width:22px;height:22px;line-height:18px; }
    +.ui_min_b{ top:10px;left:5px;width:12px;height:2px;border-bottom:2px solid #FFF; }
    +.ui_max_b{ top:5px;left:5px;width:10px;height:7px; }
    +.ui_res_t,.ui_res_b{ top:8px;left:3px;width:10px;height:5px; }
    +.ui_res_b{ top:4px;left:6px; }
    +.ui_res_t,.ui_res_b,.ui_max_b{ border:1px solid #FFF;border-top-width:3px; }
    +.ui_res_t{ background:#3d8cce; }
    +.ui_min:hover b,.ui_max:hover b,.ui_res:hover b{ border-color:#555; }
    +.ui_close{ vertical-align:baseline;_line-height:22px; }
    +.ui_close:hover,.ui_close:focus{ color:#c93333; }
    +
    +/*搴曢儴鎸夐挳鏍峰紡*/
    +.ui_buttons{ white-space:nowrap;padding:4px 8px;text-align:right;background-color:#FFF; }
    +.ui_buttons input::-moz-focus-inner{ border:0;padding:0;margin:0; }
    +
    +.ui_buttons input{ padding:3px 10px 3px 12px;padding:5px 10px 2px 12px\0;*padding:4px 10px 2px 10px;margin-left:6px;cursor:pointer;display:inline-block; 
    +text-align:center;line-height:1;height:23px;letter-spacing:3px;overflow:visible;color:#333;border:solid 1px #999;border-radius:3px;border-radius:0\9;background:#DDD;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4');
    +text-shadow:0 1px 1px rgba(255,255,255,1);box-shadow:0 1px 0 rgba(255,255,255,.7),0 -1px 0 rgba(0,0,0,.09);
    +-moz-transition:-moz-box-shadow linear .2s;-webkit-transition:-webkit-box-shadow linear .2s;transition:box-shadow linear .2s; }
    +.ui_buttons input:focus{ outline:0 none;box-shadow:0 0 3px #0e78c9; }
    +.ui_buttons input:hover{ color:#000;border-color:#666;box-shadow:none; }
    +.ui_buttons input:active{ border-color:#666;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4'); }
    +.ui_buttons input[disabled]{ cursor:default;color:#666;background:#DDD;border:solid 1px #999;filter:alpha(opacity=50);opacity:.5;box-shadow:none; }
    +
    +input.ui_state_highlight{ color:#FFF;border:solid 1px #1c6a9e;text-shadow:0 -1px 1px #1c6a9e;background:#2288cc;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +input.ui_state_highlight:hover{ color:#FFF;border-color:#555; }
    +input.ui_state_highlight:active{ border-color:#1c6a9e;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +
    +/*Tips 閮ㄥ垎寮濮(鍙垹闄)*/
    +.ui_state_tips .ui_lt,.ui_state_tips .ui_rt{ height:16px;background-repeat:no-repeat;background-position: 0 0; }
    +.ui_state_tips .ui_lt{ background-image:url(iblack/ie6/ui_lt2.png);_png:iblack/ie6/ui_lt2.png; }
    +.ui_state_tips .ui_rt{ background-image:url(iblack/ie6/ui_rt2.png);_png:iblack/ie6/ui_rt2.png; }
    +.ui_state_tips .ui_t{ background-image:url(iblack/ie6/ui_t2.png);background-repeat:repeat-x;background-position:0 0;_png:iblack/ie6/ui_t2.png; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/iblack_s.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/iblack_s.png
    new file mode 100644
    index 00000000..e0f78588
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/iblack_s.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/iblack_s2.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/iblack_s2.png
    new file mode 100644
    index 00000000..c4992243
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/iblack_s2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_b.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_b.png
    new file mode 100644
    index 00000000..d4f808f3
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_b.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_l.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_l.png
    new file mode 100644
    index 00000000..b740b954
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_l.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_lb.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_lb.png
    new file mode 100644
    index 00000000..2513def0
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_lb.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_lt.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_lt.png
    new file mode 100644
    index 00000000..d91f6da3
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_lt.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_lt2.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_lt2.png
    new file mode 100644
    index 00000000..aa8d4b64
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_lt2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_r.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_r.png
    new file mode 100644
    index 00000000..85161bff
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_r.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_rb.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_rb.png
    new file mode 100644
    index 00000000..e387f1cc
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_rb.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_rt.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_rt.png
    new file mode 100644
    index 00000000..8387155d
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_rt.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_rt2.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_rt2.png
    new file mode 100644
    index 00000000..feb586f3
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_rt2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_t.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_t.png
    new file mode 100644
    index 00000000..d9a9ee83
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_t.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_t2.png b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_t2.png
    new file mode 100644
    index 00000000..091c4a42
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblack/ie6/ui_t2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue.css b/src/main/webapp/plug-in/lhgDialog/skins/iblue.css
    new file mode 100644
    index 00000000..298f4428
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lhgDialog/skins/iblue.css
    @@ -0,0 +1,123 @@
    +锘緻charset "utf-8";
    +/*
    + * lhgdialog 榛樿鐨偆
    + * (C) 2009-2011 銆愪竴涓濆啺鍑夈, http://t.qq.com/yisibl, QQ:50167214
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +/*==================鍒朵綔鏂扮毊鑲や粠杩欓噷寮濮嬪鍒==================*/
    +/*鍩烘湰閲嶇疆*/
    +body{ _margin:0; }/*IE6 BUG*/
    +.ui_lock_scroll{ *overflow:hidden; }
    +.ui_lock_scroll body{ overflow:hidden; }
    +
    +/*缁撴瀯灞*/
    +.ui_content,.ui_title,.ui_buttons input{ font:12px/1.333 tahoma,arial,\5b8b\4f53,sans-serif; }
    +table.ui_border,table.ui_dialog{ width:auto;border-spacing:0;*border-collapse:collapse; }
    +.ui_border td,.ui_dialog td{ padding:0; }
    +.ui_dialog{ background:#FFF; }
    +
    +/*鏍囬閮ㄥ垎寮濮*/
    +.ui_title{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;cursor:move;background:#DDD;-moz-user-select:none;-webkit-user-select:none;padding:0 100px 0 0; }
    +.ui_title_buttons{ position:absolute;cursor:pointer;font-size:0;letter-spacing:-.5em; }
    +
    +/*瀵归綈鑷傚簲*/
    +.ui_main{ min-width:6em;min-width:0\9;text-align:center; }
    +.ui_content{ display:inline-block;*display:inline;zoom:1;text-align:left; }
    +.ui_content.ui_state_full{ display:block;width:100%;height:100%;margin:0;padding:0!important; }
    +.ui_content.ui_state_full iframe{ border-radius:0 0 5px 5px; }
    +.ui_loading{ width:96px;height:32px;text-align:left;text-indent:-9999em;overflow:hidden;background:url(icons/loading.gif) no-repeat center center; }
    +.ui_icon_bg{ margin:20px 0 20px 15px; }
    +
    +/*鏍囬绾疌SS鎸夐挳寮濮 min 鏈灏忓寲锛宮ax鏈澶у寲锛宺es杩樺師锛宺ese鎭㈠锛宑lose鍏抽棴*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ position:relative;text-decoration:none;letter-spacing:normal;text-align:center;display:inline-block;*display:inline;zoom:1;vertical-align:top;font-family:tahoma,arial,\5b8b\4f53,sans-serif; }
    +.ui_min b,.ui_max b,.ui_res_t,.ui_res_b{ display:block;position:absolute;overflow:hidden;cursor:pointer; }
    +.ui_close{ font-weight:500;text-decoration:none;outline:0 none; }
    +.ui_close:hover{ text-decoration:none; }
    +
    +/*Tips閮ㄥ垎*/
    +.ui_state_tips .ui_main{ min-width:3em; }
    +.ui_state_tips .ui_content{ margin-top:-2px;padding:8px 10px!important; }
    +.ui_state_tips .ui_icon_bg{ margin:5px 0 6px 9px; }
    +.ui_state_tips .ui_title,.ui_state_tips .ui_title_buttons,.ui_res{ display:none; } /* 杩樺師鎸夐挳涔熷湪杩欓噷闅愯棌锛岃繖鏍峰彲鑺傜渷浠g爜锛屾敞闂磋繖娈典竴瀹氳鍐欏湪涓婇潰閭f浠g爜鐨勪笅闈*/
    +
    +#ldg_lockmask{ background:#DCE2F1;filter:alpha(opacity=60);opacity:.6; }
    +/*==================鍒朵綔鏂扮毊鑲ゅ埌杩欓噷缁撴潫澶嶅埗==================*/
    +
    +/*鏍峰紡灞傚紑濮*/
    +.ui_inner{ border:1px solid #999; }
    +.ui_border{ border-radius:4px; }
    +
    +.ui_lt,.ui_rt,.ui_lb,.ui_rb{ width:6px;height:6px;display:block; }
    +.ui_lt{ border-radius:4px 0 0 0; }.ui_rt{ border-radius:0 4px 0 0; }.ui_rb{ border-radius:0 0 4px 0; }.ui_lb{ border-radius:0 0 0 4px; }
    +.ui_lt,.ui_rt,.ui_l,.ui_r,.ui_lb,.ui_b,.ui_t,.ui_rb{ background:rgba(102,102,102,.3);background:#666\9;filter:alpha(opacity=30); }
    +
    +/*鏍囬鏍忔牱寮*/
    +.ui_title_bar{ position:relative;height:100%;border-bottom:1px solid #317ebd; }
    +.ui_title{ height:26px;line-height:26px;font-size:14px;font-weight:bold;color:#DDD;padding-left:7px;border-bottom:1px solid #6da6e1;
    +background:linear-gradient(top,#46a0e1,#3280bf);
    +background:-webkit-gradient(linear,0% 0%, 0% 100%,from(#46a0e1),to(#3280bf)); 
    +background:-moz-linear-gradient(top,#46a0e1,#3280bf); 
    +background:-o-linear-gradient(top,#46a0e1,#3280bf);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#46a0e1',endColorstr='#3280bf');*background:#DDD; }
    + 
    +.ui_state_focus .ui_title{ color:#FFF;text-shadow:0 1px 0 #333; }
    +.ui_state_drag .ui_title { border-bottom:1px solid #82bee6;text-shadow: 0 -1px 0 #333;
    +background:linear-gradient(top,#3280bf,#46a0e1); 
    +background:-moz-linear-gradient(top,#3280bf,#46a0e1); 
    +background:-webkit-gradient(linear,0% 0%, 0% 100%,from(#3280bf),to(#46a0e1));
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#3280bf',endColorstr='#46a0e1'); }
    +
    +/*鏍囬绾疌SS鎸夐挳瀹氫綅閮ㄥ垎*/
    +.ui_title_buttons{ top:3px;right:5px; }
    +.ui_min,.ui_max,.ui_close,.ui_res{ color:#FFF;font-size:22px;width:22px;height:22px;line-height:18px; }
    +.ui_min_b{ top:10px;left:5px;width:12px;height:2px;border-bottom:2px solid #FFF; }
    +.ui_max_b{ top:5px;left:5px;width:10px;height:7px; }
    +.ui_res_t,.ui_res_b{ top:8px;left:3px;width:10px;height:5px; }
    +.ui_res_b{ top:4px;left:6px; }
    +.ui_res_t,.ui_res_b,.ui_max_b{ border:1px solid #FFF;border-top-width:3px; }
    +.ui_res_t{ background:#3d8cce; }
    +.ui_min:hover b,.ui_max:hover b,.ui_res:hover b{ border-color:#555; }
    +.ui_close{ vertical-align:baseline;_line-height:22px; }
    +.ui_close:hover,.ui_close:focus{ color:#c93333; }
    +
    +/*搴曢儴鎸夐挳鏍峰紡*/
    +.ui_buttons{ white-space:nowrap;padding:4px 8px;text-align:right;background-color:#F6F6F6;border-top:solid 1px #DADEE5; }
    +.ui_buttons input::-moz-focus-inner{ border:0;padding:0;margin:0; }
    +
    +.ui_buttons input{ padding:3px 10px 3px 12px;padding:5px 10px 2px 12px\0;*padding:4px 10px 2px 10px;margin-left:6px;cursor:pointer;display:inline-block; 
    +text-align:center;line-height:1;height:23px;letter-spacing:3px;overflow:visible;color:#333;border:solid 1px #999;border-radius:3px;border-radius:0\9;background:#DDD;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4');
    +text-shadow:0 1px 1px rgba(255,255,255,1);box-shadow:0 1px 0 rgba(255,255,255,.7),0 -1px 0 rgba(0,0,0,.09);
    +-moz-transition:-moz-box-shadow linear .2s;-webkit-transition:-webkit-box-shadow linear .2s;transition:box-shadow linear .2s; }
    +.ui_buttons input:focus{ outline:0 none;box-shadow:0 0 3px #0e78c9; }
    +.ui_buttons input:hover{ color:#000;border-color:#666;box-shadow:none; }
    +.ui_buttons input:active{ border-color:#666;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4'); }
    +.ui_buttons input[disabled]{ cursor:default;color:#666;background:#DDD;border:solid 1px #999;filter:alpha(opacity=50);opacity:.5;box-shadow:none; }
    +
    +input.ui_state_highlight{ color:#FFF;border:solid 1px #1c6a9e;text-shadow:0 -1px 1px #1c6a9e;background:#2288cc;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +input.ui_state_highlight:hover{ color:#FFF;border-color:#555; }
    +input.ui_state_highlight:active{ border-color:#1c6a9e;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +
    +/*Tips 閮ㄥ垎寮濮*/
    +.ui_state_tips,.ui_state_tips .ui_inner,.ui_state_tips .ui_title_bar{ border:0 none;box-shadow:none; }
    +.ui_state_tips .ui_lt,.ui_state_tips .ui_rt,.ui_state_tips .ui_lb,.ui_state_tips .ui_rb{ width:5px;height:5px; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/iblue_s.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/iblue_s.png
    new file mode 100644
    index 00000000..e6f9001a
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/iblue_s.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/iblue_s2.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/iblue_s2.png
    new file mode 100644
    index 00000000..c4992243
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/iblue_s2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_b.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_b.png
    new file mode 100644
    index 00000000..8d8765b8
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_b.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_l.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_l.png
    new file mode 100644
    index 00000000..b740b954
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_l.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_lb.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_lb.png
    new file mode 100644
    index 00000000..c2aa0580
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_lb.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_lt.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_lt.png
    new file mode 100644
    index 00000000..cf10eb92
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_lt.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_lt2.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_lt2.png
    new file mode 100644
    index 00000000..aa8d4b64
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_lt2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_r.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_r.png
    new file mode 100644
    index 00000000..85161bff
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_r.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_rb.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_rb.png
    new file mode 100644
    index 00000000..e42b580e
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_rb.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_rt.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_rt.png
    new file mode 100644
    index 00000000..4de45be5
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_rt.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_rt2.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_rt2.png
    new file mode 100644
    index 00000000..feb586f3
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_rt2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_t.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_t.png
    new file mode 100644
    index 00000000..a6e64122
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_t.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_t2.png b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_t2.png
    new file mode 100644
    index 00000000..091c4a42
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/iblue/ie6/ui_t2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/32X32/fail.png b/src/main/webapp/plug-in/lhgDialog/skins/icons/32X32/fail.png
    new file mode 100644
    index 00000000..af323ca0
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/32X32/fail.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/32X32/hits.png b/src/main/webapp/plug-in/lhgDialog/skins/icons/32X32/hits.png
    new file mode 100644
    index 00000000..9a0eab93
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/32X32/hits.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/32X32/i.png b/src/main/webapp/plug-in/lhgDialog/skins/icons/32X32/i.png
    new file mode 100644
    index 00000000..02975c8c
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/32X32/i.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/32X32/succ.png b/src/main/webapp/plug-in/lhgDialog/skins/icons/32X32/succ.png
    new file mode 100644
    index 00000000..43d50a77
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/32X32/succ.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/alert.gif b/src/main/webapp/plug-in/lhgDialog/skins/icons/alert.gif
    new file mode 100644
    index 00000000..929331f2
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/alert.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/confirm.gif b/src/main/webapp/plug-in/lhgDialog/skins/icons/confirm.gif
    new file mode 100644
    index 00000000..57f318d6
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/confirm.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/discuz_bg.gif b/src/main/webapp/plug-in/lhgDialog/skins/icons/discuz_bg.gif
    new file mode 100644
    index 00000000..3a210ba9
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/discuz_bg.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/error.gif b/src/main/webapp/plug-in/lhgDialog/skins/icons/error.gif
    new file mode 100644
    index 00000000..f81be9fe
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/error.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/face-sad.png b/src/main/webapp/plug-in/lhgDialog/skins/icons/face-sad.png
    new file mode 100644
    index 00000000..5d819d81
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/face-sad.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/face-smile.png b/src/main/webapp/plug-in/lhgDialog/skins/icons/face-smile.png
    new file mode 100644
    index 00000000..f952c13c
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/face-smile.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/gb_tip_layer.png b/src/main/webapp/plug-in/lhgDialog/skins/icons/gb_tip_layer.png
    new file mode 100644
    index 00000000..5619a3e3
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/gb_tip_layer.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/gb_tip_layer_ie6.png b/src/main/webapp/plug-in/lhgDialog/skins/icons/gb_tip_layer_ie6.png
    new file mode 100644
    index 00000000..7a84c122
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/gb_tip_layer_ie6.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/lhgcore.gif b/src/main/webapp/plug-in/lhgDialog/skins/icons/lhgcore.gif
    new file mode 100644
    index 00000000..1acd3a25
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/lhgcore.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/loading.gif b/src/main/webapp/plug-in/lhgDialog/skins/icons/loading.gif
    new file mode 100644
    index 00000000..229b7c0a
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/loading.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/prompt.gif b/src/main/webapp/plug-in/lhgDialog/skins/icons/prompt.gif
    new file mode 100644
    index 00000000..4d6dc460
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/prompt.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/success.gif b/src/main/webapp/plug-in/lhgDialog/skins/icons/success.gif
    new file mode 100644
    index 00000000..bc87cb56
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/success.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/icons/tips.gif b/src/main/webapp/plug-in/lhgDialog/skins/icons/tips.gif
    new file mode 100644
    index 00000000..4c3a9961
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/icons/tips.gif differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog.css b/src/main/webapp/plug-in/lhgDialog/skins/idialog.css
    new file mode 100644
    index 00000000..4572dfc6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lhgDialog/skins/idialog.css
    @@ -0,0 +1,137 @@
    +@charset "utf-8";
    +/*
    + * lhgdialog idialog鐨偆
    + * (C) 2009-2011 銆愪竴涓濆啺鍑夈, http://t.qq.com/yisibl, QQ:50167214
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +/*==================鍒朵綔鏂扮毊鑲や粠杩欓噷寮濮嬪鍒==================*/
    +/*鍩烘湰閲嶇疆*/
    +body{ _margin:0; }/*IE6 BUG*/
    +.ui_lock_scroll{ *overflow:hidden; }
    +.ui_lock_scroll body{ overflow:hidden; }
    +
    +/*缁撴瀯灞*/
    +.ui_content,.ui_title,.ui_buttons input{ font:12px/1.333 tahoma,arial,\5b8b\4f53,sans-serif; }
    +table.ui_border,table.ui_dialog{ width:auto;border-spacing:0;*border-collapse:collapse; }
    +.ui_border td,.ui_dialog td{ padding:0; }
    +.ui_dialog{ background:#FFF; }
    +
    +/*鏍囬閮ㄥ垎寮濮*/
    +.ui_title{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;cursor:move;background:#DDD;-moz-user-select:none;-webkit-user-select:none;padding:0 100px 0 0; }
    +.ui_title_buttons{ position:absolute;cursor:pointer;font-size:0;letter-spacing:-.5em; }
    +
    +/*瀵归綈鑷傚簲*/
    +.ui_main{ min-width:6em;min-width:0\9;text-align:center; }
    +.ui_content{ display:inline-block;*display:inline;zoom:1;text-align:left; }
    +.ui_content.ui_state_full{ display:block;width:100%;height:100%;margin:0;padding:0!important; }
    +.ui_content.ui_state_full iframe{ border-radius:0 0 5px 5px; }
    +.ui_loading{ width:96px;height:32px;text-align:left;text-indent:-9999em;overflow:hidden;background:url(icons/loading.gif) no-repeat center center; }
    +.ui_icon_bg{ margin:20px 0 20px 15px; }
    +
    +/*鏍囬绾疌SS鎸夐挳寮濮 min 鏈灏忓寲锛宮ax鏈澶у寲锛宺es杩樺師锛宺ese鎭㈠锛宑lose鍏抽棴*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ position:relative;text-decoration:none;letter-spacing:normal;text-align:center;display:inline-block;*display:inline;zoom:1;vertical-align:top;font-family:tahoma,arial,\5b8b\4f53,sans-serif; }
    +.ui_min b,.ui_max b,.ui_res_t,.ui_res_b{ display:block;position:absolute;overflow:hidden;cursor:pointer; }
    +.ui_close{ font-weight:500;text-decoration:none;outline:0 none; }
    +.ui_close:hover{ text-decoration:none; }
    +
    +/*Tips閮ㄥ垎*/
    +.ui_state_tips .ui_main{ min-width:3em; }
    +.ui_state_tips .ui_content{ margin-top:-2px;padding:8px 10px!important; }
    +.ui_state_tips .ui_icon_bg{ margin:5px 0 6px 9px; }
    +.ui_state_tips .ui_title,.ui_state_tips .ui_title_buttons,.ui_res{ display:none; } /* 杩樺師鎸夐挳涔熷湪杩欓噷闅愯棌锛岃繖鏍峰彲鑺傜渷浠g爜锛屾敞闂磋繖娈典竴瀹氳鍐欏湪涓婇潰閭f浠g爜鐨勪笅闈*/
    +
    +#ldg_lockmask{ background:#DCE2F1;filter:alpha(opacity=60);opacity:.6; }
    +/*==================鍒朵綔鏂扮毊鑲ゅ埌杩欓噷缁撴潫澶嶅埗==================*/
    +
    +/*鏍峰紡灞傚紑濮*/
    +.ui_inner{ background:#FFF; }
    +.ui_title_bar{ width:100%;position:relative; }
    +.ui_title{ display:block;height:26px;line-height:26px;border-bottom:1px solid #DDD\9;font-size:14px;font-weight:bold;color:#888;background:#FFF;background:none;padding-left:3px; }
    +.ui_state_focus .ui_title{ color:#505050; }
    +.ui_lt,.ui_rt,.ui_lb,.ui_rb,.ui_t,.ui_b,.ui_close { background-image:url(idialog/idialog_s.png);background-repeat:no-repeat; }
    +.ui_lt{ width:15px;height:15px;background-position:0 0;_png:idialog/ie6/ui_lt.png; }
    +.ui_rt{ width:15px;height:15px;background-position:-15px 0;_png:idialog/ie6/ui_rt.png; }
    +.ui_lb{ width:15px;height:15px;background-position:0 -15px; _png:idialog/ie6/ui_lb.png; }
    +.ui_rb{ width:15px;height:15px;background-position:-15px -15px;_png:idialog/ie6/ui_rb.png; }
    +.ui_t,.ui_b{ background-repeat:repeat-x; }
    +.ui_t{ background-position:0 -30px;_png:idialog/ie6/ui_t.png; }
    +.ui_b{ background-position:0 -45px;_png:idialog/ie6/ui_b.png; }
    +.ui_l,.ui_r{ background-image:url(idialog/idialog_s2.png);background-repeat:repeat-y; }
    +.ui_l{ background-position:left top;_png:idialog/ie6/ui_l.png; }
    +.ui_r{ background-position:right bottom;_png:idialog/ie6/ui_r.png; }
    +
    +/*鏍囬绾疌SS鎸夐挳瀹氫綅閮ㄥ垎*/
    +.ui_title_buttons{ top:0;right:5px; }
    +.ui_max,.ui_res{ margin-right:10px; }
    +.ui_min,.ui_max,.ui_close,.ui_res{ margin-left:3px;color:#888;font-size:20px;width:22px;height:22px;line-height:18px; }
    +.ui_min{ margin-left:0;}
    +.ui_min_b{ top:10px;left:5px;width:12px;height:2px;border-bottom:2px solid #888; }
    +.ui_max_b{ top:5px;left:5px;width:10px;height:7px; }
    +.ui_res_t,.ui_res_b{ top:8px;left:3px;width:10px;height:5px; }
    +.ui_res_b{ top:4px;left:6px; }
    +.ui_res_t,.ui_res_b,.ui_max_b{ border:1px solid #888;border-top-width:3px; }
    +.ui_res_t{ background:#FFF; }/*杩樺師鎸夐挳搴曢儴妗嗚儗鏅笌鏍囬鑳屾櫙铻嶅悎*/
    +.ui_min:hover b,.ui_max:hover b,.ui_res:hover b,.ui_rese:hover b{ border-color:#2492FF; }
    +.ui_close { position:absolute;right:-26px;top:-21px;_z-index:1;width:34px;height:34px;font-size:0;line-height:0;overflow:hidden;background-position:0 -60px;_png:idialog/ie6/ui_close.png; }
    +.ui_close:hover,.ui_close:focus{ background-position:0 -94px;_png:idialog/ie6/ui_close.hover.png;cursor:pointer; }
    +/*鏍囬鎸夐挳缁撴潫*/
    +
    +@media screen and (min-width:0){/* css3 */
    +	.ui_lt, .ui_rt, .ui_lb, .ui_rb{ width:5px; height:5px; }
    +	.ui_lt, .ui_t, .ui_rt, .ui_l, .ui_r, .ui_lb, .ui_b, .ui_rb { background:none;}
    +	.ui_lb, .ui_b, .ui_rb { background:url(idialog/idialog_s.png) repeat-x 0 -45px; }
    +	.ui_lb { border-radius:0 0 0 5px; }
    +	.ui_rb { border-radius:0 0 5px 0; }
    +	.ui_border {border-radius:5px; background:#FFF;  border:1px solid #929292; border-radius:5px; box-shadow:0 1px 6px rgba(0, 0, 0, .3); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +	.ui_state_drag .ui_border,.ui_state_drag.ui_state_lock .ui_border  { box-shadow:none; }
    +	.ui_state_lock .ui_border { box-shadow:0 3px 18px rgba(0, 0, 0, .6); }
    +	.ui_state_tips:active {border-radius:5px;  box-shadow:0 1px 8px rgba(0, 0, 0, .5)}
    +.ui_title:after{ content:"";display:block;height:8px;width:100%;position:absolute;top:26px;left:0;
    +background:-moz-radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%); /* FF3.6+ */
    +background:-webkit-radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%); /* Chrome10+,Safari5.1+ */
    +background:-o-radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%); /* Opera 12+ */
    +background:-ms-radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%); /* IE10+ */
    +background:radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%);/* W3C */display:none\9; }
    +.ui_title:before{ content:"";display:block;height:5px;width:100%;position:absolute;top:26px;left:0;background:#FFF;z-index:1;display:none\9; }
    +}
    +
    +/*搴曢儴鎸夐挳鏍峰紡*/
    +.ui_buttons{ white-space:nowrap; padding:4px 8px; text-align:right; }
    +.ui_buttons input::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +
    +.ui_buttons input{ padding:2px 10px 2px 12px; padding:4px 10px 1px 12px\0; *padding:3px 10px 1px 10px; margin-left:6px; cursor:pointer; display:inline-block; 
    +text-align:center; line-height:1; height:23px; letter-spacing:3px; overflow:visible; color:#333; border:solid 1px #999; border-radius:3px; border-radius:0\9; background:#DDD;
    +background:linear-gradient(top, #FAFAFA, #E4E4E4);
    +background:-moz-linear-gradient(top, #FAFAFA, #E4E4E4);
    +background:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#FAFAFA), to(#E4E4E4));
    +background:-o-linear-gradient(top, #FAFAFA, #E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E4E4E4');
    +text-shadow:0 1px 1px rgba(255, 255, 255, 1); box-shadow:0 1px 0 rgba(255, 255, 255, .7), 0 -1px 0 rgba(0, 0, 0, .09);
    +-moz-transition:-moz-box-shadow linear .2s; -webkit-transition:-webkit-box-shadow linear .2s; transition:box-shadow linear .2s; }
    +.ui_buttons input:focus{ outline:0 none; box-shadow:0 0 3px #0e78c9; }
    +.ui_buttons input:hover{ color:#000; border-color:#666; box-shadow:none; }
    +.ui_buttons input:active{ border-color:#666;
    +background:linear-gradient(top, #FAFAFA, #E4E4E4);
    +background:-moz-linear-gradient(top, #FAFAFA, #E4E4E4);
    +background:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#FAFAFA), to(#E4E4E4));
    +background:-o-linear-gradient(top, #FAFAFA, #E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E4E4E4'); }
    +.ui_buttons input[disabled]{ cursor:default; color:#666; background:#DDD; border:solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +
    +input.ui_state_highlight{ color:#FFF; border:solid 1px #1c6a9e; text-shadow: 0 -1px 1px #1c6a9e; background:#2288cc;
    +background:linear-gradient(top, #33bbee, #2288cc);
    +background:-moz-linear-gradient(top, #33bbee, #2288cc);
    +background:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc));
    +background:-o-linear-gradient(top, #33bbee, #2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); }
    +input.ui_state_highlight:hover{ color:#FFF; border-color:#555; }
    +input.ui_state_highlight:active{ border-color:#1c6a9e;
    +background:linear-gradient(top, #33bbee, #2288cc);
    +background:-moz-linear-gradient(top, #33bbee, #2288cc);
    +background:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc));
    +background:-o-linear-gradient(top, #33bbee, #2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); }
    +
    +/*Tips 閮ㄥ垎寮濮*/
    +.ui_state_tips .ui_content{ text-align:center;font-weight:bold;color:#323232; }
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog/idialog_s.png b/src/main/webapp/plug-in/lhgDialog/skins/idialog/idialog_s.png
    new file mode 100644
    index 00000000..d86d0544
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/idialog/idialog_s.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog/idialog_s2.png b/src/main/webapp/plug-in/lhgDialog/skins/idialog/idialog_s2.png
    new file mode 100644
    index 00000000..7be06ad2
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/idialog/idialog_s2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_b.png b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_b.png
    new file mode 100644
    index 00000000..62746ee4
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_b.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_close.hover.png b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_close.hover.png
    new file mode 100644
    index 00000000..dd00dde3
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_close.hover.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_close.png b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_close.png
    new file mode 100644
    index 00000000..04ed8bea
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_close.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_l.png b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_l.png
    new file mode 100644
    index 00000000..c4df489d
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_l.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_lb.png b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_lb.png
    new file mode 100644
    index 00000000..478f609f
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_lb.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_lt.png b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_lt.png
    new file mode 100644
    index 00000000..dea0b9a5
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_lt.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_r.png b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_r.png
    new file mode 100644
    index 00000000..b96ff2f3
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_r.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_rb.png b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_rb.png
    new file mode 100644
    index 00000000..32247e84
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_rb.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_rt.png b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_rt.png
    new file mode 100644
    index 00000000..36449443
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_rt.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_t.png b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_t.png
    new file mode 100644
    index 00000000..34871bee
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/idialog/ie6/ui_t.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/igreen.css b/src/main/webapp/plug-in/lhgDialog/skins/igreen.css
    new file mode 100644
    index 00000000..a8cce48a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lhgDialog/skins/igreen.css
    @@ -0,0 +1,120 @@
    +锘緻charset utf-8;
    +/*
    + * lhgdialog igreen鐨偆
    + * (C) 2009-2011銆愪竴涓濆啺鍑夈, http://t.qq.com/yisibl, QQ:50167214
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +/*==================鍒朵綔鏂扮毊鑲や粠杩欓噷寮濮嬪鍒==================*/
    +/*鍩烘湰閲嶇疆*/
    +body{ _margin:0; }/*IE6 BUG*/
    +.ui_lock_scroll{ *overflow:hidden; }
    +.ui_lock_scroll body{ overflow:hidden; }
    +
    +/*缁撴瀯灞*/
    +.ui_content,.ui_title,.ui_buttons input{ font:12px/1.333 tahoma,arial,\5b8b\4f53,sans-serif; }
    +table.ui_border,table.ui_dialog{ width:auto;border-spacing:0;*border-collapse:collapse; }
    +.ui_border td,.ui_dialog td{ padding:0; }
    +.ui_dialog{ background:#FFF; }
    +
    +/*鏍囬閮ㄥ垎寮濮*/
    +.ui_title{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;cursor:move;background:#DDD;-moz-user-select:none;-webkit-user-select:none;padding:0 100px 0 0; }
    +.ui_title_buttons{ position:absolute;cursor:pointer;font-size:0;letter-spacing:-.5em; }
    +
    +/*瀵归綈鑷傚簲*/
    +.ui_main{ min-width:6em;min-width:0\9;text-align:center; }
    +.ui_content{ display:inline-block;*display:inline;zoom:1;text-align:left; }
    +.ui_content.ui_state_full{ display:block;width:100%;height:100%;margin:0;padding:0!important; }
    +.ui_content.ui_state_full iframe{ border-radius:0 0 5px 5px; }
    +.ui_loading{ width:96px;height:32px;text-align:left;text-indent:-9999em;overflow:hidden;background:url(icons/loading.gif) no-repeat center center; }
    +.ui_icon_bg{ margin:20px 0 20px 15px; }
    +
    +/*鏍囬绾疌SS鎸夐挳寮濮 min 鏈灏忓寲锛宮ax鏈澶у寲锛宺es杩樺師锛宺ese鎭㈠锛宑lose鍏抽棴*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ position:relative;text-decoration:none;letter-spacing:normal;text-align:center;display:inline-block;*display:inline;zoom:1;vertical-align:top;font-family:tahoma,arial,\5b8b\4f53,sans-serif; }
    +.ui_min b,.ui_max b,.ui_res_t,.ui_res_b{ display:block;position:absolute;overflow:hidden;cursor:pointer; }
    +.ui_close{ font-weight:500;text-decoration:none;outline:0 none; }
    +.ui_close:hover{ text-decoration:none; }
    +
    +/*Tips閮ㄥ垎*/
    +.ui_state_tips .ui_main{ min-width:3em; }
    +.ui_state_tips .ui_content{ margin-top:-2px;padding:8px 10px!important; }
    +.ui_state_tips .ui_icon_bg{ margin:5px 0 6px 9px; }
    +.ui_state_tips .ui_title,.ui_state_tips .ui_title_buttons,.ui_res{ display:none; } /* 杩樺師鎸夐挳涔熷湪杩欓噷闅愯棌锛岃繖鏍峰彲鑺傜渷浠g爜锛屾敞闂磋繖娈典竴瀹氳鍐欏湪涓婇潰閭f浠g爜鐨勪笅闈*/
    +
    +#ldg_lockmask{ background:#DCE2F1;filter:alpha(opacity=60);opacity:.6; }
    +/*==================鍒朵綔鏂扮毊鑲ゅ埌杩欓噷缁撴潫澶嶅埗==================*/
    +
    +/*鏍峰紡灞傚紑濮*/
    +.ui_inner{ background:#FFF; }
    +.ui_title_bar{ width:100%;height:0;position:relative;bottom:27px;_bottom:0;_margin-top:-27px; }
    +.ui_title{ display:block;font-weight:bold;height:22px;line-height:22px;line-height:24px\9;color:#FFF;background:none;font-size:14px;padding-left:7px; }
    +
    +
    +.ui_lt,.ui_rt,.ui_lb,.ui_rb,.ui_t,.ui_b{ background-image:url(igreen/igreen_s.png);background-repeat:no-repeat; }
    +.ui_lt{ width:13px;height:36px;background-position:0 0;_png:igreen/ie6/ui_lt.png; }
    +.ui_rt{ width:13px;height:36px;background-position:-13px 0;_png:igreen/ie6/ui_rt.png; }
    +.ui_lb{ width:13px;height:16px;background-position:0 -36px;_png:igreen/ie6/ui_lb.png; }
    +.ui_rb{ width:13px;height:16px;background-position:-13px -36px;_png:igreen/ie6/ui_rb.png; }
    +
    +.ui_t,.ui_b{ background-repeat:repeat-x; }
    +.ui_t{ background-position: 0 -52px;_png:igreen/ie6/ui_t.png; }
    +.ui_b{ background-position: 0 -88px;_png:igreen/ie6/ui_b.png; }
    +.ui_l,.ui_r{ background-image:url(igreen/igreen_s2.png);background-repeat:repeat-y; }
    +.ui_l{ background-position:0 0;_png:igreen/ie6/ui_l.png; }
    +.ui_r{ background-position:-13px 0;_png:igreen/ie6/ui_r.png; }
    +
    +/*鏍囬绾疌SS鎸夐挳瀹氫綅閮ㄥ垎*/
    +.ui_title_buttons{ top:2px;right:5px; }
    +.ui_min,.ui_max,.ui_close,.ui_res{ color:#FFF;font-size:22px;width:22px;height:22px;line-height:18px; }
    +.ui_min_b{ top:10px;left:5px;width:12px;height:2px;border-bottom:2px solid #FFF; }
    +.ui_max_b{ top:5px;left:5px;width:10px;height:7px; }
    +.ui_res_t,.ui_res_b{ top:8px;left:3px;width:10px;height:5px; }
    +.ui_res_b{ top:4px;left:6px; }
    +.ui_res_t,.ui_res_b,.ui_max_b{ border:1px solid #FFF;border-top-width:3px; }
    +.ui_res_t{ background:#3d8cce; }
    +.ui_min:hover b,.ui_max:hover b,.ui_res:hover b{ border-color:#555; }
    +.ui_close{ vertical-align:baseline;_line-height:22px; }
    +.ui_close:hover,.ui_close:focus{ color:#c93333; }
    +
    +/*搴曢儴鎸夐挳鏍峰紡*/
    +.ui_buttons{ white-space:nowrap;padding:4px 8px;text-align:right;background-color:#FFF; }
    +.ui_buttons input::-moz-focus-inner{ border:0;padding:0;margin:0; }
    +
    +.ui_buttons input{ padding:3px 10px 3px 12px;padding:5px 10px 2px 12px\0;*padding:4px 10px 2px 10px;margin-left:6px;cursor:pointer;display:inline-block; 
    +text-align:center;line-height:1;height:23px;letter-spacing:3px;overflow:visible;color:#333;border:solid 1px #999;border-radius:3px;border-radius:0\9;background:#DDD;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4');
    +text-shadow:0 1px 1px rgba(255,255,255,1);box-shadow:0 1px 0 rgba(255,255,255,.7),0 -1px 0 rgba(0,0,0,.09);
    +-moz-transition:-moz-box-shadow linear .2s;-webkit-transition:-webkit-box-shadow linear .2s;transition:box-shadow linear .2s; }
    +.ui_buttons input:focus{ outline:0 none;box-shadow:0 0 3px #0e78c9; }
    +.ui_buttons input:hover{ color:#000;border-color:#666;box-shadow:none; }
    +.ui_buttons input:active{ border-color:#666;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4'); }
    +.ui_buttons input[disabled]{ cursor:default;color:#666;background:#DDD;border:solid 1px #999;filter:alpha(opacity=50);opacity:.5;box-shadow:none; }
    +
    +input.ui_state_highlight{ color:#FFF;border:solid 1px #1c6a9e;text-shadow:0 -1px 1px #1c6a9e;background:#2288cc;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +input.ui_state_highlight:hover{ color:#FFF;border-color:#555; }
    +input.ui_state_highlight:active{ border-color:#1c6a9e;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +
    +/*Tips 閮ㄥ垎寮濮(鍙垹闄)*/
    +.ui_state_tips .ui_lt,.ui_state_tips .ui_rt{ height:16px;background-repeat:no-repeat;background-position:0 0; }
    +.ui_state_tips .ui_lt{ background-image:url(igreen/ie6/ui_lt2.png);_png:igreen/ie6/ui_lt2.png; }
    +.ui_state_tips .ui_rt{ background-image:url(igreen/ie6/ui_rt2.png);_png:igreen/ie6/ui_rt2.png; }
    +.ui_state_tips .ui_t{ background-image:url(igreen/ie6/ui_t2.png);background-repeat:repeat-x;background-position:0 0;_png:igreen/ie6/ui_t2.png; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_b.png b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_b.png
    new file mode 100644
    index 00000000..6e8f0cb2
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_b.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_l.png b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_l.png
    new file mode 100644
    index 00000000..b740b954
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_l.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_lb.png b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_lb.png
    new file mode 100644
    index 00000000..df574437
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_lb.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_lt.png b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_lt.png
    new file mode 100644
    index 00000000..6cd123fc
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_lt.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_r.png b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_r.png
    new file mode 100644
    index 00000000..85161bff
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_r.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_rb.png b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_rb.png
    new file mode 100644
    index 00000000..20050cb4
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_rb.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_rt.png b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_rt.png
    new file mode 100644
    index 00000000..d9c256b8
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_rt.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_t.png b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_t.png
    new file mode 100644
    index 00000000..9a87d73f
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/igreen/ie6/ui_t.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/igreen/igreen_s.png b/src/main/webapp/plug-in/lhgDialog/skins/igreen/igreen_s.png
    new file mode 100644
    index 00000000..bc6d6b2d
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/igreen/igreen_s.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/igreen/igreen_s2.png b/src/main/webapp/plug-in/lhgDialog/skins/igreen/igreen_s2.png
    new file mode 100644
    index 00000000..c4992243
    Binary files /dev/null and b/src/main/webapp/plug-in/lhgDialog/skins/igreen/igreen_s2.png differ
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/jtop.css b/src/main/webapp/plug-in/lhgDialog/skins/jtop.css
    new file mode 100644
    index 00000000..69e17e70
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lhgDialog/skins/jtop.css
    @@ -0,0 +1,129 @@
    +@charset "utf-8";
    +/*
    + * lhgdialog JTop鐨偆
    + * (C) 2009-2011 銆愪竴涓濆啺鍑夈, http://t.qq.com/yisibl, QQ:50167214
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +/*==================鍒朵綔鏂扮毊鑲や粠杩欓噷寮濮嬪鍒==================*/
    +/*鍩烘湰閲嶇疆*/
    +body{ _margin:0; }/*IE6 BUG*/
    +.ui_lock_scroll{ *overflow:hidden; }
    +.ui_lock_scroll body{ overflow:hidden; }
    +
    +/*缁撴瀯灞*/
    +.ui_content,.ui_title,.ui_buttons input{ font:12px/1.333 tahoma,arial,\5b8b\4f53,sans-serif; }
    +table.ui_border,table.ui_dialog{ width:auto;border-spacing:0;*border-collapse:collapse; }
    +.ui_border td,.ui_dialog td{ padding:0; }
    +.ui_dialog{ background:#FFF; }
    +
    +/*鏍囬閮ㄥ垎寮濮*/
    +.ui_title{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;cursor:move;background:#DDD;-moz-user-select:none;-webkit-user-select:none;padding:0 100px 0 0; }
    +.ui_title_buttons{ position:absolute;cursor:pointer;font-size:0;letter-spacing:-.5em; }
    +
    +/*瀵归綈鑷傚簲*/
    +.ui_main{ min-width:6em;min-width:0\9;text-align:center; }
    +.ui_content{ display:inline-block;*display:inline;zoom:1;text-align:left; }
    +.ui_content.ui_state_full{ display:block;width:100%;height:100%;margin:0;padding:0!important; }
    +.ui_content.ui_state_full iframe{ border-radius:0 0 5px 5px; }
    +.ui_loading{ width:96px;height:32px;text-align:left;text-indent:-9999em;overflow:hidden;background:url(icons/loading.gif) no-repeat center center; }
    +.ui_icon_bg{ margin:20px 0 20px 15px; }
    +
    +/*鏍囬绾疌SS鎸夐挳寮濮 min 鏈灏忓寲锛宮ax鏈澶у寲锛宺es杩樺師锛宺ese鎭㈠锛宑lose鍏抽棴*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ position:relative;text-decoration:none;letter-spacing:normal;text-align:center;display:inline-block;*display:inline;zoom:1;vertical-align:top;font-family:tahoma,arial,\5b8b\4f53,sans-serif; }
    +.ui_min b,.ui_max b,.ui_res_t,.ui_res_b{ display:block;position:absolute;overflow:hidden;cursor:pointer; }
    +.ui_close{ font-weight:500;text-decoration:none;outline:0 none; }
    +.ui_close:hover{ text-decoration:none; }
    +
    +/*Tips閮ㄥ垎*/
    +.ui_state_tips .ui_main{ min-width:3em; }
    +.ui_state_tips .ui_content{ margin-top:-2px;padding:8px 10px!important; }
    +.ui_state_tips .ui_icon_bg{ margin:5px 0 6px 9px; }
    +.ui_state_tips .ui_title,.ui_state_tips .ui_title_buttons,.ui_res{ display:none; } /* 杩樺師鎸夐挳涔熷湪杩欓噷闅愯棌锛岃繖鏍峰彲鑺傜渷浠g爜锛屾敞闂磋繖娈典竴瀹氳鍐欏湪涓婇潰閭f浠g爜鐨勪笅闈*/
    +
    +#ldg_lockmask{ background:#DCE2F1;filter:alpha(opacity=60);opacity:.6; }
    +/*==================鍒朵綔鏂扮毊鑲ゅ埌杩欓噷缁撴潫澶嶅埗==================*/
    +
    +/*鏍峰紡灞傚紑濮*/
    +.ui_dialog{ border:1px solid #0097BD;border-radius:5px;box-shadow:0 1px 6px rgba(0,0,0,.5);
    +-moz-transition:-moz-box-shadow linear .2s;
    +-webkit-transition: -webkit-box-shadow linear .2s;
    +transition: -webkit-box-shadow linear .2s; }
    +.ui_state_lock .ui_dialog{ box-shadow:0 3px 10px rgba(0,0,0,.5); }/*閿佸睆鏃堕伄缃*/
    +.ui_state_drag .ui_dialog,.ui_state_lock.ui_state_drag .ui_dialog{ box-shadow:none; }/*鎷栧姩鏃堕殣钘忛槾褰憋紝閫氳繃css3瀹炵幇娓愬彉鍔ㄧ敾*/
    +
    +.ui_lt,.ui_rt,.ui_lb,.ui_rb{ width:0;height:0;*width:1px;*height:1px; }/*杈规瀹藉害*/
    +.ui_rb{ display:block;width:12px;height:12px;position:absolute;bottom:0;right:0;background:none; } /*閲嶆柊鏄剧ず鍙充笅瑙掓嫋鍔紝璁句负璐熷间細閫犳垚娴忚鍣ㄦ樉绀烘粴鍔ㄦ潯*/
    +
    +/*鏍囬鏍忔牱寮*/
    +.ui_title_bar{ position:relative;height:100%;border-bottom:1px solid #0096be; }/*澶栫嚎*/
    +.ui_title{ height:26px;line-height:26px;font-size:14px;font-weight:bold;color:#DDD;border-radius:4px 4px 0 0;padding-left:5px;border-bottom:1px solid #3fc7f5;
    +background:linear-gradient(top,#00c8ef,#00a6c8);
    +background:-webkit-gradient(linear,0% 0%, 0% 100%,from(#00c8ef),to(#00a6c8)); 
    +background:-moz-linear-gradient(top,#00c8ef,#00a6c8); 
    +background:-o-linear-gradient(top,#00c8ef,#00a6c8);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00c8ef',endColorstr='#00a6c8');*background:#DDD;/*IE haslayout 鍕垮垹闄*/ }
    + 
    +.ui_state_focus .ui_title{ color:#FFF; }
    +.ui_state_drag .ui_title{ border-bottom:1px solid #82d8f5;
    +background:linear-gradient(top,#00a6c8,#00caed); 
    +background:-webkit-gradient(linear,0% 0%, 0% 100%,from(#00a6c8),to(#00caed));
    +background:-moz-linear-gradient(top,#00a6cf,#00caed); 
    +background:-o-linear-gradient(top,#00c8ef,#00a6c8);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00a6c8',endColorstr='#00caed'); }
    +
    +/*鏍囬绾疌SS鎸夐挳瀹氫綅閮ㄥ垎*/
    +.ui_title_buttons{ top:3px;right:5px; }
    +.ui_min,.ui_max,.ui_close,.ui_res{ color:#FFF;font-size:18px;width:22px;height:22px;line-height:18px; }
    +.ui_min_b{ top:10px;left:6px;width:10px;height:2px;border-bottom:2px solid #FFF; }
    +.ui_max_b{ top:6px;left:6px;width:9px;height:6px; }
    +.ui_res_t,.ui_res_b{ top:9px;left:5px;width:9px;height:4px; }
    +.ui_res_b{ top:5px;left:7px; }
    +.ui_res_t,.ui_res_b,.ui_max_b { border:1px solid #FFF;border-top-width:3px; }
    +.ui_res_t{ background:#00b7dd; }
    +.ui_min:hover b,.ui_max:hover b,.ui_res:hover b{ border-color:#555; }
    +.ui_close{ vertical-align:baseline;_line-height:21px; }
    +.ui_close:hover,.ui_close:focus { color:#bf160b; }
    +
    +/*搴曢儴鎸夐挳鏍峰紡*/
    +.ui_buttons{ white-space:nowrap;padding:4px 8px;text-align:right;background-color:#F6F6F6;border-top:solid 1px #DADEE5; }
    +.ui_buttons input::-moz-focus-inner{ border:0;padding:0;margin:0; }
    +
    +.ui_buttons input{ padding:3px 10px 3px 12px;padding:5px 10px 2px 12px\0;*padding:4px 10px 2px 10px;margin-left:6px;cursor:pointer;display:inline-block; 
    +text-align:center;line-height:1;height:23px;letter-spacing:3px;overflow:visible;color:#333;border:solid 1px #999;border-radius:3px;border-radius:0\9;background:#DDD;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4');
    +text-shadow:0 1px 1px rgba(255,255,255,1);box-shadow:0 1px 0 rgba(255,255,255,.7),0 -1px 0 rgba(0,0,0,.09);
    +-moz-transition:-moz-box-shadow linear .2s;-webkit-transition:-webkit-box-shadow linear .2s;transition:box-shadow linear .2s; }
    +.ui_buttons input:focus{ outline:0 none;box-shadow:0 0 3px #0e78c9; }
    +.ui_buttons input:hover{ color:#000;border-color:#666;box-shadow:none; }
    +.ui_buttons input:active{ border-color:#666;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4'); }
    +.ui_buttons input[disabled]{ cursor:default;color:#666;background:#DDD;border:solid 1px #999;filter:alpha(opacity=50);opacity:.5;box-shadow:none; }
    +
    +input.ui_state_highlight{ color:#FFF;border:solid 1px #1c6a9e;text-shadow:0 -1px 1px #1c6a9e;background:#2288cc;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +input.ui_state_highlight:hover{ color:#FFF;border-color:#555; }
    +input.ui_state_highlight:active{ border-color:#1c6a9e;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +
    +/*Tips 閮ㄥ垎寮濮*/
    +.ui_state_tips .ui_title_bar{ border:0 none; }
    +.ui_state_tips .ui_dialog{ border-color:#40B3FF;background-color:#E5F5FF;box-shadow:2px 2px 3px rgba(0,0,0,.2); }
    +.green .ui_state_tips .ui_dialog{ border-color:#4DBF00;background-color:#F0FFE5;box-shadow:2px 2px 3px rgba(0,0,0,.2); }
    +.red .ui_state_tips .ui_dialog{ border-color:#FF8080;background-color:#FFF2F2;box-shadow:2px 2px 3px rgba(0,0,0,.2); }
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/mac.css b/src/main/webapp/plug-in/lhgDialog/skins/mac.css
    new file mode 100644
    index 00000000..7aacd06d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lhgDialog/skins/mac.css
    @@ -0,0 +1,133 @@
    +锘緻charset "utf-8";
    +/*
    + * lhgdialog mac鐨偆
    + * (C) 2009-2011 銆愪竴涓濆啺鍑夈, http://t.qq.com/yisibl, QQ:50167214
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +/*==================鍒朵綔鏂扮毊鑲や粠杩欓噷寮濮嬪鍒==================*/
    +/*鍩烘湰閲嶇疆*/
    +body{ _margin:0; }/*IE6 BUG*/
    +.ui_lock_scroll{ *overflow:hidden; }
    +.ui_lock_scroll body{ overflow:hidden; }
    +
    +/*缁撴瀯灞*/
    +.ui_content,.ui_title,.ui_buttons input{ font:12px/1.333 tahoma,arial,\5b8b\4f53,sans-serif; }
    +table.ui_border,table.ui_dialog{ width:auto;border-spacing:0;*border-collapse:collapse; }
    +.ui_border td,.ui_dialog td{ padding:0; }
    +.ui_dialog{ background:#FFF; }
    +
    +/*鏍囬閮ㄥ垎寮濮*/
    +.ui_title{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;cursor:move;background:#DDD;-moz-user-select:none;-webkit-user-select:none;padding:0 100px 0 0; }
    +.ui_title_buttons{ position:absolute;cursor:pointer;font-size:0;letter-spacing:-.5em; }
    +
    +/*瀵归綈鑷傚簲*/
    +.ui_main{ min-width:6em;min-width:0\9;text-align:center; }
    +.ui_content{ display:inline-block;*display:inline;zoom:1;text-align:left; }
    +.ui_content.ui_state_full{ display:block;width:100%;height:100%;margin:0;padding:0!important; }
    +.ui_content.ui_state_full iframe{ border-radius:0 0 5px 5px; }
    +.ui_loading{ width:96px;height:32px;text-align:left;text-indent:-9999em;overflow:hidden;background:url(icons/loading.gif) no-repeat center center; }
    +.ui_icon_bg{ margin:20px 0 20px 15px; }
    +
    +/*鏍囬绾疌SS鎸夐挳寮濮 min 鏈灏忓寲锛宮ax鏈澶у寲锛宺es杩樺師锛宺ese鎭㈠锛宑lose鍏抽棴*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ position:relative;text-decoration:none;letter-spacing:normal;text-align:center;display:inline-block;*display:inline;zoom:1;vertical-align:top;font-family:tahoma,arial,\5b8b\4f53,sans-serif; }
    +.ui_min b,.ui_max b,.ui_res_t,.ui_res_b{ display:block;position:absolute;overflow:hidden;cursor:pointer; }
    +.ui_close{ font-weight:500;text-decoration:none;outline:0 none; }
    +.ui_close:hover{ text-decoration:none; }
    +
    +/*Tips閮ㄥ垎*/
    +.ui_state_tips .ui_main{ min-width:3em; }
    +.ui_state_tips .ui_content{ margin-top:-2px;padding:8px 10px!important; }
    +.ui_state_tips .ui_icon_bg{ margin:5px 0 6px 9px; }
    +.ui_state_tips .ui_title,.ui_state_tips .ui_title_buttons,.ui_res{ display:none; } /* 杩樺師鎸夐挳涔熷湪杩欓噷闅愯棌锛岃繖鏍峰彲鑺傜渷浠g爜锛屾敞闂磋繖娈典竴瀹氳鍐欏湪涓婇潰閭f浠g爜鐨勪笅闈*/
    +
    +#ldg_lockmask{ background:#DCE2F1;filter:alpha(opacity=60);opacity:.6; }
    +/*==================鍒朵綔鏂扮毊鑲ゅ埌杩欓噷缁撴潫澶嶅埗==================*/
    +
    +/*鏍峰紡灞傚紑濮*/
    +.ui_dialog{ border:1px solid #888;border-radius:5px;box-shadow:0 1px 6px rgba(0,0,0,.6);-moz-transition:-moz-box-shadow linear .2s;-webkit-transition:-webkit-box-shadow linear .2s;transition:-webkit-box-shadow linear .2s; }
    +.ui_state_lock .ui_dialog{ box-shadow:0 3px 18px rgba(0,0,0,.5); }/*閿佸睆鏃堕伄缃*/
    +.ui_state_drag .ui_dialog,.ui_state_lock.ui_state_drag .ui_dialog { box-shadow:none; }/*鎷栧姩鏃堕殣钘忛槾褰憋紝閫氳繃css3瀹炵幇娓愬彉鍔ㄧ敾*/
    +.ui_state_focus .ui_title{ color:#505050; }
    +
    +.ui_lb,.ui_rb,.ui_lt,.ui_rt{ width:0;height:0;*width:1px;*height:1px; }/*闅愯棌杈规*/
    +.ui_rb{ display:block;width:12px;height:12px;position:absolute;bottom:0;right:0;background:none; }/*閲嶆柊鏄剧ず鍙充笅瑙掓嫋鍔紝璁句负璐熷间細閫犳垚娴忚鍣ㄦ樉绀烘粴鍔ㄦ潯*/
    +
    +/*鏍囬鏍忔牱寮*/
    +.ui_title_bar{ position:relative;height:100%;border-bottom:1px solid #aaa; }
    +.ui_title{ font-size:14px;font-weight:bold;height:28px;line-height:28px;border-radius:4px 4px 0 0;color:#838383;
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#ebebeb),to(#c3c3c3));
    +background:-moz-linear-gradient(top,#ebebeb,#c3c3c3 ); 
    +background:-o-linear-gradient(top,#ebebeb,#c3c3c3); 
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#c3c3c3');*background:#DDD;
    +border:1px solid f5f5f5;border-bottom:1px solid #e6e6e6;border-radius:4px 4px 0 0;text-shadow: 0 1px 0 #EEE;padding-left:5px; }
    +.ui_state_drag .ui_title { text-shadow:0 -1px 0 #EEE;
    +background:#ebebeb;
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#c3c3c3),to(#ebebeb));
    +background:-moz-linear-gradient(top,#c3c3c3,#ebebeb);background:-o-linear-gradient(top,#c3c3c3,#ebebeb);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#c3c3c3',endColorstr='#ebebeb'); }
    +
    +/*鏍囬绾疌SS鎸夐挳瀹氫綅閮ㄥ垎*/
    +.ui_title_buttons{ top:4px;right:5px; }
    +.ui_min,.ui_max,.ui_close,.ui_res{ color:#636363;font-size:22px;width:22px;height:22px;line-height:18px; }
    +.ui_min_b{ top:10px;left:5px;width:12px;height:2px;border-bottom:2px solid #636363; }
    +.ui_max_b{ top:5px;left:5px;width:10px;height:7px; }
    +.ui_res_t,.ui_res_b{ top:8px;left:3px;width:10px;height:5px; }
    +.ui_res_b{ top:4px;left:6px; }
    +.ui_res_t,.ui_res_b,.ui_max_b{ border:1px solid #636363;border-top-width:3px; }
    +.ui_res_t{ background:#DDD; }/*杩樺師鎸夐挳搴曢儴妗嗚儗鏅笌鏍囬鑳屾櫙铻嶅悎*/
    +.ui_close{ vertical-align:baseline;_line-height:22px; }/*IE6鍏抽棴鎸夐挳鍨傜洿灞呬腑*/
    +.ui_close:hover,.ui_close:focus{ color:#bf160b; }
    +.ui_min:hover b,.ui_max:hover b,.ui_res:hover b{ border-color:#2492FF; }
    +
    +/*鎸夐挳缁撴瀯閮ㄥ垎*/
    +.ui_buttons{ padding:4px 8px;text-align:right;white-space:nowrap;border-radius:0 0 4px 4px;
    +border-top:1px solid #bebebe;border-bottom:1px solid #DDD;border-radius:0 0 4px 4px;
    +background:#f5f5f5;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f5f5f5),to(#d7d7d7)); 
    +background:-moz-linear-gradient(top,rgb(245,245,245),rgb(215,215,215));
    +background:-o-linear-gradient(top,#f5f5f5,#d7d7d7);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#d7d7d7'); }
    +.ui_buttons input::-moz-focus-inner{ border:0;padding:0;margin:0; }
    +
    +.ui_buttons input{ padding:3px 10px 3px 12px;padding:5px 10px 2px 12px\0;*padding:4px 10px 2px 10px;margin-left:6px;cursor:pointer;display:inline-block; 
    +text-align:center;line-height:1;height:23px;letter-spacing:3px;overflow:visible;color:#333;border:solid 1px #999;border-radius:3px;border-radius:0\9;background:#DDD;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4');
    +text-shadow:0 1px 1px rgba(255,255,255,1);box-shadow:0 1px 0 rgba(255,255,255,.7),0 -1px 0 rgba(0,0,0,.09);
    +-moz-transition:-moz-box-shadow linear .2s;-webkit-transition:-webkit-box-shadow linear .2s;transition:box-shadow linear .2s; }
    +.ui_buttons input:focus{ outline:0 none;box-shadow:0 0 3px #0e78c9; }
    +.ui_buttons input:hover{ color:#000;border-color:#666;box-shadow:none; }
    +.ui_buttons input:active{ border-color:#666;
    +background:linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-moz-linear-gradient(top,#FAFAFA,#E4E4E4);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#FAFAFA),to(#E4E4E4));
    +background:-o-linear-gradient(top,#FAFAFA,#E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA',endColorstr='#E4E4E4'); }
    +.ui_buttons input[disabled]{ cursor:default;color:#666;background:#DDD;border:solid 1px #999;filter:alpha(opacity=50);opacity:.5;box-shadow:none; }
    +
    +input.ui_state_highlight{ color:#FFF;border:solid 1px #1c6a9e;text-shadow:0 -1px 1px #1c6a9e;background:#2288cc;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +input.ui_state_highlight:hover{ color:#FFF;border-color:#555; }
    +input.ui_state_highlight:active{ border-color:#1c6a9e;
    +background:linear-gradient(top,#33bbee,#2288cc);
    +background:-moz-linear-gradient(top,#33bbee,#2288cc);
    +background:-webkit-gradient(linear,0% 0%,0% 100%,from(#33bbee),to(#2288cc));
    +background:-o-linear-gradient(top,#33bbee,#2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee',endColorstr='#2288cc'); }
    +
    +/*Tips 閮ㄥ垎寮濮*/
    +/*鍩烘湰閲嶇疆*/
    +.ui_state_tips ,.ui_state_tips .ui_inner,.ui_state_tips .ui_dialog,.ui_state_tips .ui_title_bar{ border:0 none;background:none;box-shadow:none;border-radius:0;filter:none; }
    +.ui_state_tips .ui_content{ font-weight:bold;font-size:14px;color:#323232;text-align:center; }
    +/*Tips(鍥剧墖鑳屾櫙锛孖E6涔熸敮鎸佸渾瑙) End*/
    +.ui_state_tips .ui_dialog,.ui_state_tips .ui_l,.ui_state_tips .ui_r{ background-image:url(icons/gb_tip_layer.png);_background-image:url(icons/gb_tip_layer_ie6.png);background-repeat:no-repeat; }/*鍏辩敤鑳屾櫙鍥剧墖*/
    +.ui_state_tips .ui_l{ background-position:-6px 0;width:5px; }/*宸︿晶鑳屾櫙渚ф牱寮*/
    +.ui_state_tips .ui_r{ background-position:0 0;width:5px; }/*鍙充晶鑳屾櫙鏍峰紡*/
    +.ui_state_tips .ui_dialog{ background-position: 0 -54px;background-repeat:repeat-x;height:54px;overflow:hidden; }/*涓讳綋鍐呭鑳屾櫙*/
    diff --git a/src/main/webapp/plug-in/lhgDialog/skins/metro.css b/src/main/webapp/plug-in/lhgDialog/skins/metro.css
    new file mode 100644
    index 00000000..d090664b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lhgDialog/skins/metro.css
    @@ -0,0 +1,137 @@
    +锘緻charset "utf-8";
    +/*
    + * lhgdialog idialog鐨偆
    + * (C) 2009-2011 銆愪竴涓濆啺鍑夈, http://t.qq.com/yisibl, QQ:50167214
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +/*==================鍒朵綔鏂扮毊鑲や粠杩欓噷寮濮嬪鍒==================*/
    +/*鍩烘湰閲嶇疆*/
    +body{ _margin:0; }/*IE6 BUG*/
    +.ui_lock_scroll{ *overflow:hidden; }
    +.ui_lock_scroll body{ overflow:hidden; }
    +
    +/*缁撴瀯灞*/
    +.ui_content,.ui_title,.ui_buttons input{ font:12px/1.333 tahoma,arial,\5b8b\4f53,sans-serif; }
    +table.ui_border,table.ui_dialog{ width:auto;border-spacing:0;*border-collapse:collapse; }
    +.ui_border td,.ui_dialog td{ padding:0; }
    +.ui_dialog{ background:#FFF; }
    +
    +/*鏍囬閮ㄥ垎寮濮*/
    +.ui_title{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;cursor:move;background:#DDD;-moz-user-select:none;-webkit-user-select:none;padding:0 100px 0 0; }
    +.ui_title_buttons{ position:absolute;cursor:pointer;font-size:0;letter-spacing:-.5em; }
    +
    +/*瀵归綈鑷傚簲*/
    +.ui_main{ min-width:6em;min-width:0\9;text-align:center; }
    +.ui_content{ display:inline-block;*display:inline;zoom:1;text-align:left; }
    +.ui_content.ui_state_full{ display:block;width:100%;height:100%;margin:0;padding:0!important; }
    +.ui_content.ui_state_full iframe{ border-radius:0 0 5px 5px; }
    +.ui_loading{ width:96px;height:32px;text-align:left;text-indent:-9999em;overflow:hidden;background:url(icons/loading.gif) no-repeat center center; }
    +.ui_icon_bg{ margin:20px 0 20px 15px; }
    +
    +/*鏍囬绾疌SS鎸夐挳寮濮 min 鏈灏忓寲锛宮ax鏈澶у寲锛宺es杩樺師锛宺ese鎭㈠锛宑lose鍏抽棴*/
    +.ui_min,.ui_max,.ui_close,.ui_res{ position:relative;text-decoration:none;letter-spacing:normal;text-align:center;display:inline-block;*display:inline;zoom:1;vertical-align:top;font-family:tahoma,arial,\5b8b\4f53,sans-serif; }
    +.ui_min b,.ui_max b,.ui_res_t,.ui_res_b{ display:block;position:absolute;overflow:hidden;cursor:pointer; }
    +.ui_close{ font-weight:500;text-decoration:none;outline:0 none; }
    +.ui_close:hover{ text-decoration:none; }
    +
    +/*Tips閮ㄥ垎*/
    +.ui_state_tips .ui_main{ min-width:3em; }
    +.ui_state_tips .ui_content{ margin-top:-2px;padding:8px 10px!important; }
    +.ui_state_tips .ui_icon_bg{ margin:5px 0 6px 9px; }
    +.ui_state_tips .ui_title,.ui_state_tips .ui_title_buttons,.ui_res{ display:none; } /* 杩樺師鎸夐挳涔熷湪杩欓噷闅愯棌锛岃繖鏍峰彲鑺傜渷浠g爜锛屾敞闂磋繖娈典竴瀹氳鍐欏湪涓婇潰閭f浠g爜鐨勪笅闈*/
    +
    +#ldg_lockmask{ background:#DCE2F1;filter:alpha(opacity=60);opacity:.6; }
    +/*==================鍒朵綔鏂扮毊鑲ゅ埌杩欓噷缁撴潫澶嶅埗==================*/
    +
    +/*鏍峰紡灞傚紑濮*/
    +.ui_inner{ background:#FFF; }
    +.ui_title_bar{ width:100%;position:relative; }
    +.ui_title{ display:block;height:26px;line-height:26px;border-bottom:1px solid #DDD\9;font-size:14px;font-weight:bold;color:#888;background:#FFF;background:none;padding-left:3px; }
    +.ui_state_focus .ui_title{ color:#505050; }
    +.ui_lt,.ui_rt,.ui_lb,.ui_rb,.ui_t,.ui_b,.ui_close { background-image:url(idialog/idialog_s.png);background-repeat:no-repeat; }
    +.ui_lt{ width:15px;height:15px;background-position:0 0;_png:idialog/ie6/ui_lt.png; }
    +.ui_rt{ width:15px;height:15px;background-position:-15px 0;_png:idialog/ie6/ui_rt.png; }
    +.ui_lb{ width:15px;height:15px;background-position:0 -15px; _png:idialog/ie6/ui_lb.png; }
    +.ui_rb{ width:15px;height:15px;background-position:-15px -15px;_png:idialog/ie6/ui_rb.png; }
    +.ui_t,.ui_b{ background-repeat:repeat-x; }
    +.ui_t{ background-position:0 -30px;_png:idialog/ie6/ui_t.png; }
    +.ui_b{ background-position:0 -45px;_png:idialog/ie6/ui_b.png; }
    +.ui_l,.ui_r{ background-image:url(idialog/idialog_s2.png);background-repeat:repeat-y; }
    +.ui_l{ background-position:left top;_png:idialog/ie6/ui_l.png; }
    +.ui_r{ background-position:right bottom;_png:idialog/ie6/ui_r.png; }
    +
    +/*鏍囬绾疌SS鎸夐挳瀹氫綅閮ㄥ垎*/
    +.ui_title_buttons{ top:0;right:5px; }
    +.ui_max,.ui_res{ margin-right:10px; }
    +.ui_min,.ui_max,.ui_close,.ui_res{ margin-left:3px;color:#888;font-size:20px;width:22px;height:22px;line-height:18px; }
    +.ui_min{ margin-left:0;}
    +.ui_min_b{ top:10px;left:5px;width:12px;height:2px;border-bottom:2px solid #888; }
    +.ui_max_b{ top:5px;left:5px;width:10px;height:7px; }
    +.ui_res_t,.ui_res_b{ top:8px;left:3px;width:10px;height:5px; }
    +.ui_res_b{ top:4px;left:6px; }
    +.ui_res_t,.ui_res_b,.ui_max_b{ border:1px solid #888;border-top-width:3px; }
    +.ui_res_t{ background:#FFF; }/*杩樺師鎸夐挳搴曢儴妗嗚儗鏅笌鏍囬鑳屾櫙铻嶅悎*/
    +.ui_min:hover b,.ui_max:hover b,.ui_res:hover b,.ui_rese:hover b{ border-color:#2492FF; }
    +.ui_close { position:absolute;right:-26px;top:-21px;_z-index:1;width:34px;height:34px;font-size:0;line-height:0;overflow:hidden;background-position:0 -60px;_png:idialog/ie6/ui_close.png; }
    +.ui_close:hover,.ui_close:focus{ background-position:0 -94px;_png:idialog/ie6/ui_close.hover.png;cursor:pointer; }
    +/*鏍囬鎸夐挳缁撴潫*/
    +
    +@media screen and (min-width:0){/* css3 */
    +	.ui_lt, .ui_rt, .ui_lb, .ui_rb{ width:5px; height:5px; }
    +	.ui_lt, .ui_t, .ui_rt, .ui_l, .ui_r, .ui_lb, .ui_b, .ui_rb { background:none;}
    +	.ui_lb, .ui_b, .ui_rb { background:url(idialog/idialog_s.png) repeat-x 0 -45px; }
    +	.ui_lb { border-radius:0 0 0 5px; }
    +	.ui_rb { border-radius:0 0 5px 0; }
    +	.ui_border {border-radius:5px; background:#FFF;  border:1px solid #929292; border-radius:5px; box-shadow:0 1px 6px rgba(0, 0, 0, .3); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +	.ui_state_drag .ui_border,.ui_state_drag.ui_state_lock .ui_border  { box-shadow:none; }
    +	.ui_state_lock .ui_border { box-shadow:0 3px 18px rgba(0, 0, 0, .6); }
    +	.ui_state_tips:active {border-radius:5px;  box-shadow:0 1px 8px rgba(0, 0, 0, .5)}
    +.ui_title:after{ content:"";display:block;height:8px;width:100%;position:absolute;top:26px;left:0;
    +background:-moz-radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%); /* FF3.6+ */
    +background:-webkit-radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%); /* Chrome10+,Safari5.1+ */
    +background:-o-radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%); /* Opera 12+ */
    +background:-ms-radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%); /* IE10+ */
    +background:radial-gradient(center,ellipse cover,#c8c8c8 10%,#FFFFFF 75%);/* W3C */display:none\9; }
    +.ui_title:before{ content:"";display:block;height:5px;width:100%;position:absolute;top:26px;left:0;background:#FFF;z-index:1;display:none\9; }
    +}
    +
    +/*搴曢儴鎸夐挳鏍峰紡*/
    +.ui_buttons{ white-space:nowrap; padding:4px 8px; text-align:right; }
    +.ui_buttons input::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +
    +.ui_buttons input{ padding:2px 10px 2px 12px; padding:4px 10px 1px 12px\0; *padding:3px 10px 1px 10px; margin-left:6px; cursor:pointer; display:inline-block; 
    +text-align:center; line-height:1; height:23px; letter-spacing:3px; overflow:visible; color:#333; border:solid 1px #999; border-radius:3px; border-radius:0\9; background:#DDD;
    +background:linear-gradient(top, #FAFAFA, #E4E4E4);
    +background:-moz-linear-gradient(top, #FAFAFA, #E4E4E4);
    +background:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#FAFAFA), to(#E4E4E4));
    +background:-o-linear-gradient(top, #FAFAFA, #E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E4E4E4');
    +text-shadow:0 1px 1px rgba(255, 255, 255, 1); box-shadow:0 1px 0 rgba(255, 255, 255, .7), 0 -1px 0 rgba(0, 0, 0, .09);
    +-moz-transition:-moz-box-shadow linear .2s; -webkit-transition:-webkit-box-shadow linear .2s; transition:box-shadow linear .2s; }
    +.ui_buttons input:focus{ outline:0 none; box-shadow:0 0 3px #0e78c9; }
    +.ui_buttons input:hover{ color:#000; border-color:#666; box-shadow:none; }
    +.ui_buttons input:active{ border-color:#666;
    +background:linear-gradient(top, #FAFAFA, #E4E4E4);
    +background:-moz-linear-gradient(top, #FAFAFA, #E4E4E4);
    +background:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#FAFAFA), to(#E4E4E4));
    +background:-o-linear-gradient(top, #FAFAFA, #E4E4E4);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E4E4E4'); }
    +.ui_buttons input[disabled]{ cursor:default; color:#666; background:#DDD; border:solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +
    +input.ui_state_highlight{ color:#FFF; border:solid 1px #1c6a9e; text-shadow: 0 -1px 1px #1c6a9e; background:#2288cc;
    +background:linear-gradient(top, #33bbee, #2288cc);
    +background:-moz-linear-gradient(top, #33bbee, #2288cc);
    +background:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc));
    +background:-o-linear-gradient(top, #33bbee, #2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); }
    +input.ui_state_highlight:hover{ color:#FFF; border-color:#555; }
    +input.ui_state_highlight:active{ border-color:#1c6a9e;
    +background:linear-gradient(top, #33bbee, #2288cc);
    +background:-moz-linear-gradient(top, #33bbee, #2288cc);
    +background:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc));
    +background:-o-linear-gradient(top, #33bbee, #2288cc);
    +filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); }
    +
    +/*Tips 閮ㄥ垎寮濮*/
    +.ui_state_tips .ui_content{ text-align:center;font-weight:bold;color:#323232; }
    diff --git a/src/main/webapp/plug-in/lodop/LodopFuncs.js b/src/main/webapp/plug-in/lodop/LodopFuncs.js
    new file mode 100644
    index 00000000..a83b3b9e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/lodop/LodopFuncs.js
    @@ -0,0 +1,48 @@
    +锘縡unction getLodop(oOBJECT,oEMBED){
    +/**************************
    +  鏈嚱鏁版牴鎹祻瑙堝櫒绫诲瀷鍐冲畾閲囩敤鍝釜瀵硅薄浣滀负鎺т欢瀹炰緥锛
    +  IE绯诲垪銆両E鍐呮牳绯诲垪鐨勬祻瑙堝櫒閲囩敤oOBJECT锛
    +  鍏跺畠娴忚鍣(Firefox绯诲垪銆丆hrome绯诲垪銆丱pera绯诲垪銆丼afari绯诲垪绛)閲囩敤oEMBED,
    +  瀵逛簬64浣嶆祻瑙堝櫒鎸囧悜64浣嶇殑瀹夎绋嬪簭install_lodop64.exe銆
    +**************************/
    +        var strHtmInstall="<br><font color='#FF00FF'>鎵撳嵃鎺т欢鏈畨瑁!鐐瑰嚮杩欓噷<a href='plug-in/lodop/install_lodop32.exe'>鎵ц瀹夎</a>,瀹夎鍚庤鍒锋柊椤甸潰鎴栭噸鏂拌繘鍏ャ</font>";
    +        var strHtmUpdate="<br><font color='#FF00FF'>鎵撳嵃鎺т欢闇瑕佸崌绾!鐐瑰嚮杩欓噷<a href='plug-in/lodop/install_lodop32.exe'>鎵ц鍗囩骇</a>,鍗囩骇鍚庤閲嶆柊杩涘叆銆</font>";
    +        var strHtm64_Install="<br><font color='#FF00FF'>鎵撳嵃鎺т欢鏈畨瑁!鐐瑰嚮杩欓噷<a href='plug-in/lodop/install_lodop64.exe'>鎵ц瀹夎</a>,瀹夎鍚庤鍒锋柊椤甸潰鎴栭噸鏂拌繘鍏ャ</font>";
    +        var strHtm64_Update="<br><font color='#FF00FF'>鎵撳嵃鎺т欢闇瑕佸崌绾!鐐瑰嚮杩欓噷<a href='plug-in/lodop/install_lodop64.exe'>鎵ц鍗囩骇</a>,鍗囩骇鍚庤閲嶆柊杩涘叆銆</font>";
    +        var strHtmFireFox="<br><br><font color='#FF00FF'>娉ㄦ剰锛<br>1锛氬鏇惧畨瑁呰繃Lodop鏃х増闄勪欢npActiveXPLugin,璇峰湪銆愬伐鍏枫->銆愰檮鍔犵粍浠躲->銆愭墿灞曘戜腑鍏堝嵏瀹冦";
    +        var LODOP=oEMBED;		
    +	try{		     
    +	     if (navigator.appVersion.indexOf("MSIE")>=0) LODOP=oOBJECT;
    +	     if ((LODOP==null)||(typeof(LODOP.VERSION)=="undefined")) {
    +		 if (navigator.userAgent.indexOf('Firefox')>=0)
    +  	         document.documentElement.innerHTML=strHtmFireFox+document.documentElement.innerHTML;
    +		 if (navigator.userAgent.indexOf('Win64')>=0){
    +		 	if (navigator.appVersion.indexOf("MSIE")>=0) document.write(strHtm64_Install); else
    +		 	document.documentElement.innerHTML=strHtm64_Install+document.documentElement.innerHTML;		 
    +		 } else {
    +		 	if (navigator.appVersion.indexOf("MSIE")>=0) document.write(strHtmInstall); else
    +		 	document.documentElement.innerHTML=strHtmInstall+document.documentElement.innerHTML;
    +		 }
    +		 return LODOP; 
    +	     } else if (LODOP.VERSION<"6.1.1.5") {
    +		if (navigator.userAgent.indexOf('Win64')>=0){
    +	            if (navigator.appVersion.indexOf("MSIE")>=0) document.write(strHtm64_Update); else
    +		    document.documentElement.innerHTML=strHtm64_Update+document.documentElement.innerHTML; 
    +		} else {
    +	            if (navigator.appVersion.indexOf("MSIE")>=0) document.write(strHtmUpdate); else
    +		    document.documentElement.innerHTML=strHtmUpdate+document.documentElement.innerHTML; 
    +		}
    +		 return LODOP;
    +	     }
    +	     //*****濡備笅绌虹櫧浣嶇疆閫傚悎璋冪敤缁熶竴鍔熻兘:*********	     
    +
    +
    +	     //*******************************************
    +	     return LODOP; 
    +	}catch(err){
    +		if (navigator.userAgent.indexOf('Win64')>=0)	
    +		document.documentElement.innerHTML="Error:"+strHtm64_Install+document.documentElement.innerHTML;else
    +		document.documentElement.innerHTML="Error:"+strHtmInstall+document.documentElement.innerHTML;
    +	     return LODOP; 
    +	}
    +}
    diff --git a/src/main/webapp/plug-in/lodop/install_lodop32.exe b/src/main/webapp/plug-in/lodop/install_lodop32.exe
    new file mode 100644
    index 00000000..f4b1467b
    Binary files /dev/null and b/src/main/webapp/plug-in/lodop/install_lodop32.exe differ
    diff --git a/src/main/webapp/plug-in/lodop/install_lodop64.exe b/src/main/webapp/plug-in/lodop/install_lodop64.exe
    new file mode 100644
    index 00000000..587d0ea5
    Binary files /dev/null and b/src/main/webapp/plug-in/lodop/install_lodop64.exe differ
    diff --git a/src/main/webapp/plug-in/login/css/buttons.css b/src/main/webapp/plug-in/login/css/buttons.css
    new file mode 100644
    index 00000000..8d87c211
    --- /dev/null
    +++ b/src/main/webapp/plug-in/login/css/buttons.css
    @@ -0,0 +1,250 @@
    +/* BUTTON */
    +
    +.uibutton {
    +	position: relative;
    +	z-index: 1;
    +	overflow: visible;
    +	display: inline-block;
    +	padding: 5px 12px 6px 12px;
    +	margin: 10px 3px 10px 0; 
    +	text-decoration: none;
    +	text-align: center;
    +	cursor: hand;
    +	outline: none;
    +	border: 1px solid #69a44d;
    +	text-shadow:0 1px 0 #000000;
    +	color: #ffffff;
    +	background-position:0 -1px;
    +	background-color:#9bc652;
    +	-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
    +	-moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
    +	box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
    +	-webkit-transition: all .2s ease-out;
    +	-moz-transition:all.2s ease-out;
    +	-o-transition: all .2s ease-out;
    +	transition: all.2s ease-out;
    +	font-weight: bold;
    +	font-size: 11px;
    +	text-transform: capitalize;
    +	margin-top: -1px;
    +}
    +.uibutton:hover, .uibutton:focus, .uibutton:active {
    +	background-image: url(../images/ui-lgreen.jpg);
    +	background-position:0 59px;
    +	color: #ffffff;
    +	text-shadow:0 1px 0 #000000;
    +	-webkit-box-shadow: rgba(0, 0, 0, 0.35) 1px 1px 1px;
    +}
    +.uibutton:active {
    +/*	border-color: #5b7217;
    +	background: #b4cf1f;*/
    +	color: #ffffff;
    +	filter: none;
    +	-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 1px 1px 5px #9cb611;
    +	-webkit-box-shadow: rgba(0, 0, 0, 0.35) 1px 1px 1px;
    +	-moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 1px 1px 5px #9cb611;
    +	box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 1px 1px 5px #9cb611;
    +	cursor:pointer;
    +}
    +
    +/* overrides extra padding on button elements in Firefox */
    +.uibutton::-moz-focus-inner {
    + padding: 0;
    + border: 0;
    +}
    +/*Icons */
    +
    +.uibutton.icon:before {
    +	content: "";
    +	position: relative;
    +	top: 2px;
    +	float:left;
    +	width: 14px;
    +	height: 12px;
    +	margin: 0 5px 0 0;
    +	background: url(../images/fb-icons.png) 99px 99px no-repeat;
    +}
    +.uibutton.edit:before {
    +	background-position: 0 -1px;
    +}
    +.uibutton.normal {
    +	color: #333;
    +	background-color: #f4f4f4;
    +	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f4f4f4), to(#f4f4f4));
    +	background-image: -moz-linear-gradient(#f4f4f4, #f4f4f4);
    +	background-image: -o-linear-gradient(#f4f4f4, #f4f4f4);
    + 	-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 0 1px 0 #f2f2f2;
    +	-moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 0 1px 0 #f2f2f2;
    +	box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 0 1px 0 #f2f2f2;
    +	text-shadow:none;
    +	border: 1px solid #aaaaaa;
    +	border-bottom-color: #aaaaaa;
    +	filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#00CC00', EndColorStr='#00CC00'); /* for IE 6 - 9 */
    +}
    +.uibutton.normal:hover {
    +	color: #666;
    +	background-color: #999;
    +	-webkit-box-shadow: 0 0px 0 rgba(0, 0, 0, 0.1), inset 0 1px 0 #eeeeee;
    +	-moz-box-shadow: 0 0px 0 rgba(0, 0, 0, 0.1), inset 0 1px 0 #eeeeee;
    +	box-shadow: 0 0px 0 rgba(0, 0, 0, 0.1), inset 0 1px 0 #eeeeee;
    +	text-shadow:none;
    +}
    +.uibutton.normal:active {
    +	-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 1px 1px 8px #cccccc;
    +	-moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 1px 1px 8px #cccccc;
    +	box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 1px 1px 8px #cccccc;
    +}
    +.uibutton.add:before {
    +	background-position: -14px -1px;
    +}
    +.uibutton.secure:before {
    +	background-position: -28px 0px;
    +	top: 0px;
    +}
    +.uibutton.prev:before {
    +	background-position: -38px -1px;
    +}
    +.uibutton.next:before {
    +	float:right;
    +	margin: -1px -0.25em 0 0.5em;
    +	background-position: -50px 0;
    +}
    +.uibutton.forward:before {
    +	background-position: -61px 0;
    +	margin-top: -1px;
    +}
    +.uibutton.answer:before {
    +	background-position: -78px 0;
    +	margin-top: -2px;
    +}
    +/* BUTTON EXTENSIONS */
    +
    +/* Large */
    +
    +.uibutton.large {
    +	font-size: 13px;
    +	text-transform: uppercase;
    +	padding-left:25px;
    +	padding-right:25px;
    +}
    +/* Submit, etc */
    +
    +.uibutton.confirm {
    +	border-color: #73b4ce ;	
    +	background-color: #c2e3f0;
    +	text-shadow:0 1px 0 #ffffff;
    +	color: #666666;
    +
    +	background-image:none;
    +	-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
    +	-moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
    +	box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
    +
    +}
    +.uibutton.confirm:hover ,.uibutton.confirm:focus, .uibutton.confirm:active{
    +	border-color: #73b4ce;
    +	color: #333333;
    +	-webkit-box-shadow: rgba(0, 0, 0, 0.35) 1px 1px 1px;
    +	background-color: #a9daed;
    +
    +}
    +.uibutton.confirm:active {
    +	border-color: #73b4ce;
    +	color: #666666;
    +	background-color: #a9daed;
    +	-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 1px 1px 8px #84c5de;
    +	-moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 1px 1px 8px #84c5de;
    +	box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 1px 1px 8px #84c5de;
    +}
    +
    +/*  Special */
    +
    +.uibutton.special {
    +	border-color: #a93a25;
    +	text-shadow:0 1px 0 #000000;
    +	color: #fff;
    +	background-color:#d74543;
    +}
    +.uibutton.special:hover, .uibutton.special:active {
    +	background-image: url(../images/ui-red.jpg);
    +	background-position:0 59px;
    +	color: #fff;
    +	-webkit-box-shadow: rgba(0, 0, 0, 0.35) 1px 1px 1px;
    +}
    +.uibutton.special:active {
    +	background-image: url(../images/ui-red.jpg);
    +	background-position:0 59px;
    +	filter: none;
    +	color:#efefef;
    +	-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 1px 1px 8px #aa3a35;
    +	-moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 1px 1px 8px #aa3a35;
    +	box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), inset 1px 1px 8px #aa3a35;
    +}
    +/*Disable */
    +
    +.uibutton.disable {
    +	z-index: 0;
    +	border-color: #c8c8c8;
    +	color: #b8b8b8;
    +	background: #f2f2f2;
    +	cursor: default;
    +	-webkit-box-shadow: none;
    +	-moz-box-shadow: none;
    +	box-shadow: none;
    +	text-shadow:none;
    +}
    +.uibutton.disable:hover {
    +	border-color: #c8c8c8;
    +	background:none;
    +	-webkit-box-shadow: none;
    +	-moz-box-shadow: none;
    +	box-shadow: none;
    +	text-shadow:none;
    +	color:#b8b8b8;
    +}
    +.uibutton.disable.icon:before, .uibutton.disable.icon:after {
    +	opacity: 0.5;
    +}
    +/* BUTTON GROUPS */
    +
    +.uibutton-group {
    +	display: inline-block;
    +	list-style: none;
    +	padding: 0;
    +	margin: 0;
    +	/* IE hacks */
    +    zoom: 1;
    + *display: inline;
    +}
    +.uibutton + .uibutton, .uibutton + .uibutton-group, .uibutton-group + .uibutton, .uibutton-group + .uibutton-group {
    +/*	margin-left: 3px;*/
    +}
    +.uibutton-group li {
    +	float: left;
    +	padding: 0;
    +	margin: 0;
    +}
    +.uibutton-group li.end {
    +	margin-left:0px;
    +}
    +.uibutton-group .uibutton {
    +	float: left;
    +	margin-left: -4px;
    +}
    +.uibutton-group .uibutton:hover, .uibutton-group .uibutton:focus, .uibutton-group .uibutton:active {
    +	/*z-index:2;*/
    +}
    +.uibutton-group > .uibutton:first-child, .uibutton-group li:first-child .uibutton {
    +	margin-left: 0;
    +}
    +/*  BUTTON CONTAINER */
    +/* For mixing buttons and button groups, e.g., in a navigation bar */
    +
    +.uibutton-toolbar {
    +	padding: 6px;
    +	border-top: 1px solid #ccc;
    +	background: #f2f2f2;
    +}
    +.uibutton-toolbar .uibutton, .uibutton-toolbar .uibutton-group {
    +	vertical-align: bottom;
    +}
    diff --git a/src/main/webapp/plug-in/login/css/icon.css b/src/main/webapp/plug-in/login/css/icon.css
    new file mode 100644
    index 00000000..c2bd5222
    --- /dev/null
    +++ b/src/main/webapp/plug-in/login/css/icon.css
    @@ -0,0 +1,446 @@
    +span.ico {
    +	width:18px;
    +	height:18px;
    +	background-repeat:no-repeat;
    +	background-position:center center;
    +	display: inline-block;
    +	margin-bottom:-3px;
    +	margin-right:5px;
    +}
    +span span.ico {
    +	width:18px;
    +	height:18px;
    +	background-repeat:no-repeat;
    +	background-position:center center;
    +	display: inline-block;
    +	margin-top:-7px;
    +	margin-left:-7px;
    +	margin-right:0px;
    +	margin-bottom:0px
    +}
    +a span.ico {
    +	width:18px;
    +	height:18px;
    +	background-repeat:no-repeat;
    +	background-position:center center;
    +	display: inline-block;
    +	margin-bottom:-3px;
    +	margin-right:12px
    +}
    +/*  icon  gray 18*18  class by IMG name*/
    +.ico.gray.abacus{ background-image:url(../images/icon/gray_18/abacus.png); }
    +.ico.gray.access_point{ background-image:url(../images/icon/gray_18/access_point.png); }
    +.ico.gray.add{ background-image:url(../images/icon/gray_18/add.png); }
    +.ico.gray.administrator{ background-image:url(../images/icon/gray_18/administrator.png); }
    +.ico.gray.alarm{ background-image:url(../images/icon/gray_18/alarm.png); }
    +.ico.gray.arrow_bidirectional{ background-image:url(../images/icon/gray_18/arrow_bidirectional.png); }
    +.ico.gray.arrow_down2{ background-image:url(../images/icon/gray_18/arrow_down2.png); }
    +.ico.gray.arrow_left2{ background-image:url(../images/icon/gray_18/arrow_left2.png); }
    +.ico.gray.arrow_right2{ background-image:url(../images/icon/gray_18/arrow_right2.png); }
    +.ico.gray.arrow_up2{ background-image:url(../images/icon/gray_18/arrow_up2.png); }
    +.ico.gray.attachment{ background-image:url(../images/icon/gray_18/attachment.png); }
    +.ico.gray.audio_knob{ background-image:url(../images/icon/gray_18/audio_knob.png); }
    +.ico.gray.barcode{ background-image:url(../images/icon/gray_18/barcode.png); }
    +.ico.gray.battery_empty{ background-image:url(../images/icon/gray_18/battery_empty.png); }
    +.ico.gray.battery_full{ background-image:url(../images/icon/gray_18/battery_full.png); }
    +.ico.gray.battery_half{ background-image:url(../images/icon/gray_18/battery_half.png); }
    +.ico.gray.bell{ background-image:url(../images/icon/gray_18/bell.png); }
    +.ico.gray.bill{ background-image:url(../images/icon/gray_18/bill.png); }
    +.ico.gray.binoculars{ background-image:url(../images/icon/gray_18/binoculars.png); }
    +.ico.gray.bold{ background-image:url(../images/icon/gray_18/bold.png); }
    +.ico.gray.book{ background-image:url(../images/icon/gray_18/book.png); }
    +.ico.gray.bookmark{ background-image:url(../images/icon/gray_18/bookmark.png); }
    +.ico.gray.briefcase{ background-image:url(../images/icon/gray_18/briefcase.png); }
    +.ico.gray.brightness{ background-image:url(../images/icon/gray_18/brightness.png); }
    +.ico.gray.broken_link{ background-image:url(../images/icon/gray_18/broken_link.png); }
    +.ico.gray.brush{ background-image:url(../images/icon/gray_18/brush.png); }
    +.ico.gray.burn_blu-ray{ background-image:url(../images/icon/gray_18/burn_blu-ray.png); }
    +.ico.gray.burn_blu-ray2{ background-image:url(../images/icon/gray_18/burn_blu-ray2.png); }
    +.ico.gray.burn_dvd{ background-image:url(../images/icon/gray_18/burn_dvd.png); }
    +.ico.gray.burn_dvd2{ background-image:url(../images/icon/gray_18/burn_dvd2.png); }
    +.ico.gray.cabinet{ background-image:url(../images/icon/gray_18/cabinet.png); }
    +.ico.gray.calculator{ background-image:url(../images/icon/gray_18/calculator.png); }
    +.ico.gray.calendar{ background-image:url(../images/icon/gray_18/calendar.png); }
    +.ico.gray.camera{ background-image:url(../images/icon/gray_18/camera.png); }
    +.ico.gray.cancel{ background-image:url(../images/icon/gray_18/cancel.png); }
    +.ico.gray.card_clubs{ background-image:url(../images/icon/gray_18/card_clubs.png); }
    +.ico.gray.card_diamonds{ background-image:url(../images/icon/gray_18/card_diamonds.png); }
    +.ico.gray.card_hearts{ background-image:url(../images/icon/gray_18/card_hearts.png); }
    +.ico.gray.card_spades{ background-image:url(../images/icon/gray_18/card_spades.png); }
    +.ico.gray.certificate-(2){ background-image:url(../images/icon/gray_18/certificate-(2).png); }
    +.ico.gray.certificate{ background-image:url(../images/icon/gray_18/certificate.png); }
    +.ico.gray.chat-exclamation{ background-image:url(../images/icon/gray_18/chat-exclamation.png); }
    +.ico.gray.checkmark{ background-image:url(../images/icon/gray_18/checkmark.png); }
    +.ico.gray.checkmark2{ background-image:url(../images/icon/gray_18/checkmark2.png); }
    +.ico.gray.clip{ background-image:url(../images/icon/gray_18/clip.png); }
    +.ico.gray.clipboard{ background-image:url(../images/icon/gray_18/clipboard.png); }
    +.ico.gray.clock{ background-image:url(../images/icon/gray_18/clock.png); }
    +.ico.gray.close{ background-image:url(../images/icon/gray_18/close.png); }
    +.ico.gray.cloud{ background-image:url(../images/icon/gray_18/cloud.png); }
    +.ico.gray.cloud2{ background-image:url(../images/icon/gray_18/cloud2.png); }
    +.ico.gray.coin{ background-image:url(../images/icon/gray_18/coin.png); }
    +.ico.gray.compress{ background-image:url(../images/icon/gray_18/compress.png); }
    +.ico.gray.connect{ background-image:url(../images/icon/gray_18/connect.png); }
    +.ico.gray.contrast{ background-image:url(../images/icon/gray_18/contrast.png); }
    +.ico.gray.copy{ background-image:url(../images/icon/gray_18/copy.png); }
    +.ico.gray.cross{ background-image:url(../images/icon/gray_18/cross.png); }
    +.ico.gray.cutter{ background-image:url(../images/icon/gray_18/cutter.png); }
    +.ico.gray.delete{ background-image:url(../images/icon/gray_18/delete.png); }
    +.ico.gray.dial{ background-image:url(../images/icon/gray_18/dial.png); }
    +.ico.gray.diary{ background-image:url(../images/icon/gray_18/diary.png); }
    +.ico.gray.dimensions{ background-image:url(../images/icon/gray_18/dimensions.png); }
    +.ico.gray.directional_down{ background-image:url(../images/icon/gray_18/directional_down.png); }
    +.ico.gray.directional_left{ background-image:url(../images/icon/gray_18/directional_left.png); }
    +.ico.gray.directional_right{ background-image:url(../images/icon/gray_18/directional_right.png); }
    +.ico.gray.directional_up{ background-image:url(../images/icon/gray_18/directional_up.png); }
    +.ico.gray.disconnect{ background-image:url(../images/icon/gray_18/disconnect.png); }
    +.ico.gray.diskette{ background-image:url(../images/icon/gray_18/diskette.png); }
    +.ico.gray.document{ background-image:url(../images/icon/gray_18/document.png); }
    +.ico.gray.door{ background-image:url(../images/icon/gray_18/door.png); }
    +.ico.gray.download2{ background-image:url(../images/icon/gray_18/download2.png); }
    +.ico.gray.dropper{ background-image:url(../images/icon/gray_18/dropper.png); }
    +.ico.gray.earphones{ background-image:url(../images/icon/gray_18/earphones.png); }
    +.ico.gray.effects{ background-image:url(../images/icon/gray_18/effects.png); }
    +.ico.gray.eject{ background-image:url(../images/icon/gray_18/eject.png); }
    +.ico.gray.emoticon_angry{ background-image:url(../images/icon/gray_18/emoticon_angry.png); }
    +.ico.gray.emoticon_confused{ background-image:url(../images/icon/gray_18/emoticon_confused.png); }
    +.ico.gray.emoticon_grin{ background-image:url(../images/icon/gray_18/emoticon_grin.png); }
    +.ico.gray.emoticon_in_love{ background-image:url(../images/icon/gray_18/emoticon_in_love.png); }
    +.ico.gray.emoticon_sad{ background-image:url(../images/icon/gray_18/emoticon_sad.png); }
    +.ico.gray.emoticon_sleeping{ background-image:url(../images/icon/gray_18/emoticon_sleeping.png); }
    +.ico.gray.emoticon_smile{ background-image:url(../images/icon/gray_18/emoticon_smile.png); }
    +.ico.gray.encrypt{ background-image:url(../images/icon/gray_18/encrypt.png); }
    +.ico.gray.eraser{ background-image:url(../images/icon/gray_18/eraser.png); }
    +.ico.gray.eye{ background-image:url(../images/icon/gray_18/eye.png); }
    +.ico.gray.eye_closed{ background-image:url(../images/icon/gray_18/eye_closed.png); }
    +.ico.gray.fast_forward{ background-image:url(../images/icon/gray_18/fast_forward.png); }
    +.ico.gray.file{ background-image:url(../images/icon/gray_18/file.png); }
    +.ico.gray.fill{ background-image:url(../images/icon/gray_18/fill.png); }
    +.ico.gray.fingerprint{ background-image:url(../images/icon/gray_18/fingerprint.png); }
    +.ico.gray.firewall{ background-image:url(../images/icon/gray_18/firewall.png); }
    +.ico.gray.first{ background-image:url(../images/icon/gray_18/first.png); }
    +.ico.gray.folder{ background-image:url(../images/icon/gray_18/folder.png); }
    +.ico.gray.font{ background-image:url(../images/icon/gray_18/font.png); }
    +.ico.gray.font_size{ background-image:url(../images/icon/gray_18/font_size.png); }
    +.ico.gray.game_control{ background-image:url(../images/icon/gray_18/game_control.png); }
    +.ico.gray.gear{ background-image:url(../images/icon/gray_18/gear.png); }
    +.ico.gray.group{ background-image:url(../images/icon/gray_18/group.png); }
    +.ico.gray.hammer{ background-image:url(../images/icon/gray_18/hammer.png); }
    +.ico.gray.hand_point{ background-image:url(../images/icon/gray_18/hand_point.png); }
    +.ico.gray.hand_thumbsdown{ background-image:url(../images/icon/gray_18/hand_thumbsdown.png); }
    +.ico.gray.hand_thumbsup{ background-image:url(../images/icon/gray_18/hand_thumbsup.png); }
    +.ico.gray.hard_disk{ background-image:url(../images/icon/gray_18/hard_disk.png); }
    +.ico.gray.headset{ background-image:url(../images/icon/gray_18/headset.png); }
    +.ico.gray.heart{ background-image:url(../images/icon/gray_18/heart.png); }
    +.ico.gray.help{ background-image:url(../images/icon/gray_18/help.png); }
    +.ico.gray.help2{ background-image:url(../images/icon/gray_18/help2.png); }
    +.ico.gray.history{ background-image:url(../images/icon/gray_18/history.png); }
    +.ico.gray.home{ background-image:url(../images/icon/gray_18/home.png); }
    +.ico.gray.hourglass{ background-image:url(../images/icon/gray_18/hourglass.png); }
    +.ico.gray.hourglass2{ background-image:url(../images/icon/gray_18/hourglass2.png); }
    +.ico.gray.id{ background-image:url(../images/icon/gray_18/id.png); }
    +.ico.gray.info{ background-image:url(../images/icon/gray_18/info.png); }
    +.ico.gray.info2{ background-image:url(../images/icon/gray_18/info2.png); }
    +.ico.gray.italic{ background-image:url(../images/icon/gray_18/italic.png); }
    +.ico.gray.item{ background-image:url(../images/icon/gray_18/item.png); }
    +.ico.gray.key{ background-image:url(../images/icon/gray_18/key.png); }
    +.ico.gray.last{ background-image:url(../images/icon/gray_18/last.png); }
    +.ico.gray.lightbulb{ background-image:url(../images/icon/gray_18/lightbulb.png); }
    +.ico.gray.link{ background-image:url(../images/icon/gray_18/link.png); }
    +.ico.gray.list{ background-image:url(../images/icon/gray_18/list.png); }
    +.ico.gray.location{ background-image:url(../images/icon/gray_18/location.png); }
    +.ico.gray.lock{ background-image:url(../images/icon/gray_18/lock.png); }
    +.ico.gray.lock_open{ background-image:url(../images/icon/gray_18/lock_open.png); }
    +.ico.gray.login{ background-image:url(../images/icon/gray_18/login.png); }
    +.ico.gray.mail{ background-image:url(../images/icon/gray_18/mail.png); }
    +.ico.gray.mail_open{ background-image:url(../images/icon/gray_18/mail_open.png); }
    +.ico.gray.messenger{ background-image:url(../images/icon/gray_18/messenger.png); }
    +.ico.gray.microhpone{ background-image:url(../images/icon/gray_18/microhpone.png); }
    +.ico.gray.microphone{ background-image:url(../images/icon/gray_18/microphone.png); }
    +.ico.gray.money_bag{ background-image:url(../images/icon/gray_18/money_bag.png); }
    +.ico.gray.monitor{ background-image:url(../images/icon/gray_18/monitor.png); }
    +.ico.gray.moon{ background-image:url(../images/icon/gray_18/moon.png); }
    +.ico.gray.music{ background-image:url(../images/icon/gray_18/music.png); }
    +.ico.gray.music_folder{ background-image:url(../images/icon/gray_18/music_folder.png); }
    +.ico.gray.music_library{ background-image:url(../images/icon/gray_18/music_library.png); }
    +.ico.gray.next{ background-image:url(../images/icon/gray_18/next.png); }
    +.ico.gray.notepad{ background-image:url(../images/icon/gray_18/notepad.png); }
    +.ico.gray.paragraph_align_left{ background-image:url(../images/icon/gray_18/paragraph_align_left.png); }
    +.ico.gray.paragraph_align_right{ background-image:url(../images/icon/gray_18/paragraph_align_right.png); }
    +.ico.gray.paragraph_justify{ background-image:url(../images/icon/gray_18/paragraph_justify.png); }
    +.ico.gray.password{ background-image:url(../images/icon/gray_18/password.png); }
    +.ico.gray.paste{ background-image:url(../images/icon/gray_18/paste.png); }
    +.ico.gray.pause{ background-image:url(../images/icon/gray_18/pause.png); }
    +.ico.gray.pen{ background-image:url(../images/icon/gray_18/pen.png); }
    +.ico.gray.pencil{ background-image:url(../images/icon/gray_18/pencil.png); }
    +.ico.gray.phone{ background-image:url(../images/icon/gray_18/phone.png); }
    +.ico.gray.photo_album{ background-image:url(../images/icon/gray_18/photo_album.png); }
    +.ico.gray.pictures_folder{ background-image:url(../images/icon/gray_18/pictures_folder.png); }
    +.ico.gray.play{ background-image:url(../images/icon/gray_18/play.png); }
    +.ico.gray.point{ background-image:url(../images/icon/gray_18/point.png); }
    +.ico.gray.power{ background-image:url(../images/icon/gray_18/power.png); }
    +.ico.gray.previous{ background-image:url(../images/icon/gray_18/previous.png); }
    +.ico.gray.print{ background-image:url(../images/icon/gray_18/print.png); }
    +.ico.gray.pyramid{ background-image:url(../images/icon/gray_18/pyramid.png); }
    +.ico.gray.random{ background-image:url(../images/icon/gray_18/random.png); }
    +.ico.gray.record{ background-image:url(../images/icon/gray_18/record.png); }
    +.ico.gray.redo{ background-image:url(../images/icon/gray_18/redo.png); }
    +.ico.gray.reload{ background-image:url(../images/icon/gray_18/reload.png); }
    +.ico.gray.repeat{ background-image:url(../images/icon/gray_18/repeat.png); }
    +.ico.gray.resize2{ background-image:url(../images/icon/gray_18/resize2.png); }
    +.ico.gray.rewind{ background-image:url(../images/icon/gray_18/rewind.png); }
    +.ico.gray.rotate{ background-image:url(../images/icon/gray_18/rotate.png); }
    +.ico.gray.round{ background-image:url(../images/icon/gray_18/round.png); }
    +.ico.gray.ruler_square{ background-image:url(../images/icon/gray_18/ruler_square.png); }
    +.ico.gray.satellite{ background-image:url(../images/icon/gray_18/satellite.png); }
    +.ico.gray.scissors{ background-image:url(../images/icon/gray_18/scissors.png); }
    +.ico.gray.screwdriver{ background-image:url(../images/icon/gray_18/screwdriver.png); }
    +.ico.gray.security{ background-image:url(../images/icon/gray_18/security.png); }
    +.ico.gray.shopping_basket{ background-image:url(../images/icon/gray_18/shopping_basket.png); }
    +.ico.gray.software24{ background-image:url(../images/icon/gray_18/software24.png); }
    +.ico.gray.spam{ background-image:url(../images/icon/gray_18/spam.png); }
    +.ico.gray.speaker{ background-image:url(../images/icon/gray_18/speaker.png); }
    +.ico.gray.speaker2{ background-image:url(../images/icon/gray_18/speaker2.png); }
    +.ico.gray.sphere{ background-image:url(../images/icon/gray_18/sphere.png); }
    +.ico.gray.spreadsheet{ background-image:url(../images/icon/gray_18/spreadsheet.png); }
    +.ico.gray.square{ background-image:url(../images/icon/gray_18/square.png); }
    +.ico.gray.star{ background-image:url(../images/icon/gray_18/star.png); }
    +.ico.gray.stats_bars{ background-image:url(../images/icon/gray_18/stats_bars.png); }
    +.ico.gray.stats_lines{ background-image:url(../images/icon/gray_18/stats_lines.png); }
    +.ico.gray.stats_pie{ background-image:url(../images/icon/gray_18/stats_pie.png); }
    +.ico.gray.stop{ background-image:url(../images/icon/gray_18/stop.png); }
    +.ico.gray.strike_through{ background-image:url(../images/icon/gray_18/strike_through.png); }
    +.ico.gray.sun{ background-image:url(../images/icon/gray_18/sun.png); }
    +.ico.gray.target{ background-image:url(../images/icon/gray_18/target.png); }
    +.ico.gray.thunder{ background-image:url(../images/icon/gray_18/thunder.png); }
    +.ico.gray.trash_can{ background-image:url(../images/icon/gray_18/trash_can.png); }
    +.ico.gray.underlined{ background-image:url(../images/icon/gray_18/underlined.png); }
    +.ico.gray.undo{ background-image:url(../images/icon/gray_18/undo.png); }
    +.ico.gray.upload2{ background-image:url(../images/icon/gray_18/upload2.png); }
    +.ico.gray.usb{ background-image:url(../images/icon/gray_18/usb.png); }
    +.ico.gray.user{ background-image:url(../images/icon/gray_18/user.png); }
    +.ico.gray.user_woman{ background-image:url(../images/icon/gray_18/user_woman.png); }
    +.ico.gray.volume_control{ background-image:url(../images/icon/gray_18/volume_control.png); }
    +.ico.gray.webcam{ background-image:url(../images/icon/gray_18/webcam.png); }
    +.ico.gray.window{ background-image:url(../images/icon/gray_18/window.png); }
    +.ico.gray.wizard{ background-image:url(../images/icon/gray_18/wizard.png); }
    +.ico.gray.world{ background-image:url(../images/icon/gray_18/world.png); }
    +.ico.gray.zoom{ background-image:url(../images/icon/gray_18/zoom.png); }
    +.ico.gray.zoom_in{ background-image:url(../images/icon/gray_18/zoom_in.png); }
    +.ico.gray.zoom_out{ background-image:url(../images/icon/gray_18/zoom_out.png); }
    +
    +/*  icon  color 18*18  class by IMG name*/
    +.ico.color.abacus{ background-image:url(../images/icon/color_18/abacus.png); }
    +.ico.color.access_point{ background-image:url(../images/icon/color_18/access_point.png); }
    +.ico.color.add{ background-image:url(../images/icon/color_18/add.png); }
    +.ico.color.administrator{ background-image:url(../images/icon/color_18/administrator.png); }
    +.ico.color.alarm{ background-image:url(../images/icon/color_18/alarm.png); }
    +.ico.color.arrow_bidirectional{ background-image:url(../images/icon/color_18/arrow_bidirectional.png); }
    +.ico.color.arrow_down2{ background-image:url(../images/icon/color_18/arrow_down2.png); }
    +.ico.color.arrow_left2{ background-image:url(../images/icon/color_18/arrow_left2.png); }
    +.ico.color.arrow_right2{ background-image:url(../images/icon/color_18/arrow_right2.png); }
    +.ico.color.arrow_up2{ background-image:url(../images/icon/color_18/arrow_up2.png); }
    +.ico.color.attachment{ background-image:url(../images/icon/color_18/attachment.png); }
    +.ico.color.audio_knob{ background-image:url(../images/icon/color_18/audio_knob.png); }
    +.ico.color.barcode{ background-image:url(../images/icon/color_18/barcode.png); }
    +.ico.color.battery_empty{ background-image:url(../images/icon/color_18/battery_empty.png); }
    +.ico.color.battery_full{ background-image:url(../images/icon/color_18/battery_full.png); }
    +.ico.color.battery_half{ background-image:url(../images/icon/color_18/battery_half.png); }
    +.ico.color.bell{ background-image:url(../images/icon/color_18/bell.png); }
    +.ico.color.bill{ background-image:url(../images/icon/color_18/bill.png); }
    +.ico.color.binoculars{ background-image:url(../images/icon/color_18/binoculars.png); }
    +.ico.color.bold{ background-image:url(../images/icon/color_18/bold.png); }
    +.ico.color.book{ background-image:url(../images/icon/color_18/book.png); }
    +.ico.color.bookmark{ background-image:url(../images/icon/color_18/bookmark.png); }
    +.ico.color.briefcase{ background-image:url(../images/icon/color_18/briefcase.png); }
    +.ico.color.brightness{ background-image:url(../images/icon/color_18/brightness.png); }
    +.ico.color.broken_link{ background-image:url(../images/icon/color_18/broken_link.png); }
    +.ico.color.brush{ background-image:url(../images/icon/color_18/brush.png); }
    +.ico.color.burn_blu-ray{ background-image:url(../images/icon/color_18/burn_blu-ray.png); }
    +.ico.color.burn_blu-ray2{ background-image:url(../images/icon/color_18/burn_blu-ray2.png); }
    +.ico.color.burn_dvd{ background-image:url(../images/icon/color_18/burn_dvd.png); }
    +.ico.color.burn_dvd2{ background-image:url(../images/icon/color_18/burn_dvd2.png); }
    +.ico.color.cabinet{ background-image:url(../images/icon/color_18/cabinet.png); }
    +.ico.color.calculator{ background-image:url(../images/icon/color_18/calculator.png); }
    +.ico.color.calendar{ background-image:url(../images/icon/color_18/calendar.png); }
    +.ico.color.camera{ background-image:url(../images/icon/color_18/camera.png); }
    +.ico.color.cancel{ background-image:url(../images/icon/color_18/cancel.png); }
    +.ico.color.card_clubs{ background-image:url(../images/icon/color_18/card_clubs.png); }
    +.ico.color.card_diamonds{ background-image:url(../images/icon/color_18/card_diamonds.png); }
    +.ico.color.card_hearts{ background-image:url(../images/icon/color_18/card_hearts.png); }
    +.ico.color.card_spades{ background-image:url(../images/icon/color_18/card_spades.png); }
    +.ico.color.certificate-(2){ background-image:url(../images/icon/color_18/certificate-(2).png); }
    +.ico.color.certificate{ background-image:url(../images/icon/color_18/certificate.png); }
    +.ico.color.chat-exclamation{ background-image:url(../images/icon/color_18/chat-exclamation.png); }
    +.ico.color.checkmark{ background-image:url(../images/icon/color_18/checkmark.png); }
    +.ico.color.checkmark2{ background-image:url(../images/icon/color_18/checkmark2.png); }
    +.ico.color.clip{ background-image:url(../images/icon/color_18/clip.png); }
    +.ico.color.clipboard{ background-image:url(../images/icon/color_18/clipboard.png); }
    +.ico.color.clock{ background-image:url(../images/icon/color_18/clock.png); }
    +.ico.color.close{ background-image:url(../images/icon/color_18/close.png); }
    +.ico.color.cloud{ background-image:url(../images/icon/color_18/cloud.png); }
    +.ico.color.cloud2{ background-image:url(../images/icon/color_18/cloud2.png); }
    +.ico.color.coin{ background-image:url(../images/icon/color_18/coin.png); }
    +.ico.color.compress{ background-image:url(../images/icon/color_18/compress.png); }
    +.ico.color.connect{ background-image:url(../images/icon/color_18/connect.png); }
    +.ico.color.contrast{ background-image:url(../images/icon/color_18/contrast.png); }
    +.ico.color.copy{ background-image:url(../images/icon/color_18/copy.png); }
    +.ico.color.cross{ background-image:url(../images/icon/color_18/cross.png); }
    +.ico.color.cutter{ background-image:url(../images/icon/color_18/cutter.png); }
    +.ico.color.delete{ background-image:url(../images/icon/color_18/delete.png); }
    +.ico.color.dial{ background-image:url(../images/icon/color_18/dial.png); }
    +.ico.color.diary{ background-image:url(../images/icon/color_18/diary.png); }
    +.ico.color.dimensions{ background-image:url(../images/icon/color_18/dimensions.png); }
    +.ico.color.directional_down{ background-image:url(../images/icon/color_18/directional_down.png); }
    +.ico.color.directional_left{ background-image:url(../images/icon/color_18/directional_left.png); }
    +.ico.color.directional_right{ background-image:url(../images/icon/color_18/directional_right.png); }
    +.ico.color.directional_up{ background-image:url(../images/icon/color_18/directional_up.png); }
    +.ico.color.disconnect{ background-image:url(../images/icon/color_18/disconnect.png); }
    +.ico.color.diskette{ background-image:url(../images/icon/color_18/diskette.png); }
    +.ico.color.document{ background-image:url(../images/icon/color_18/document.png); }
    +.ico.color.door{ background-image:url(../images/icon/color_18/door.png); }
    +.ico.color.download2{ background-image:url(../images/icon/color_18/download2.png); }
    +.ico.color.dropper{ background-image:url(../images/icon/color_18/dropper.png); }
    +.ico.color.earphones{ background-image:url(../images/icon/color_18/earphones.png); }
    +.ico.color.effects{ background-image:url(../images/icon/color_18/effects.png); }
    +.ico.color.eject{ background-image:url(../images/icon/color_18/eject.png); }
    +.ico.color.emoticon_angry{ background-image:url(../images/icon/color_18/emoticon_angry.png); }
    +.ico.color.emoticon_confused{ background-image:url(../images/icon/color_18/emoticon_confused.png); }
    +.ico.color.emoticon_grin{ background-image:url(../images/icon/color_18/emoticon_grin.png); }
    +.ico.color.emoticon_in_love{ background-image:url(../images/icon/color_18/emoticon_in_love.png); }
    +.ico.color.emoticon_sad{ background-image:url(../images/icon/color_18/emoticon_sad.png); }
    +.ico.color.emoticon_sleeping{ background-image:url(../images/icon/color_18/emoticon_sleeping.png); }
    +.ico.color.emoticon_smile{ background-image:url(../images/icon/color_18/emoticon_smile.png); }
    +.ico.color.encrypt{ background-image:url(../images/icon/color_18/encrypt.png); }
    +.ico.color.eraser{ background-image:url(../images/icon/color_18/eraser.png); }
    +.ico.color.eye{ background-image:url(../images/icon/color_18/eye.png); }
    +.ico.color.eye_closed{ background-image:url(../images/icon/color_18/eye_closed.png); }
    +.ico.color.fast_forward{ background-image:url(../images/icon/color_18/fast_forward.png); }
    +.ico.color.file{ background-image:url(../images/icon/color_18/file.png); }
    +.ico.color.fill{ background-image:url(../images/icon/color_18/fill.png); }
    +.ico.color.fingerprint{ background-image:url(../images/icon/color_18/fingerprint.png); }
    +.ico.color.firewall{ background-image:url(../images/icon/color_18/firewall.png); }
    +.ico.color.first{ background-image:url(../images/icon/color_18/first.png); }
    +.ico.color.folder{ background-image:url(../images/icon/color_18/folder.png); }
    +.ico.color.font{ background-image:url(../images/icon/color_18/font.png); }
    +.ico.color.font_size{ background-image:url(../images/icon/color_18/font_size.png); }
    +.ico.color.game_control{ background-image:url(../images/icon/color_18/game_control.png); }
    +.ico.color.gear{ background-image:url(../images/icon/color_18/gear.png); }
    +.ico.color.group{ background-image:url(../images/icon/color_18/group.png); }
    +.ico.color.hammer{ background-image:url(../images/icon/color_18/hammer.png); }
    +.ico.color.hand_point{ background-image:url(../images/icon/color_18/hand_point.png); }
    +.ico.color.hand_thumbsdown{ background-image:url(../images/icon/color_18/hand_thumbsdown.png); }
    +.ico.color.hand_thumbsup{ background-image:url(../images/icon/color_18/hand_thumbsup.png); }
    +.ico.color.hard_disk{ background-image:url(../images/icon/color_18/hard_disk.png); }
    +.ico.color.headset{ background-image:url(../images/icon/color_18/headset.png); }
    +.ico.color.heart{ background-image:url(../images/icon/color_18/heart.png); }
    +.ico.color.help{ background-image:url(../images/icon/color_18/help.png); }
    +.ico.color.help2{ background-image:url(../images/icon/color_18/help2.png); }
    +.ico.color.history{ background-image:url(../images/icon/color_18/history.png); }
    +.ico.color.home{ background-image:url(../images/icon/color_18/home.png); }
    +.ico.color.hourglass{ background-image:url(../images/icon/color_18/hourglass.png); }
    +.ico.color.hourglass2{ background-image:url(../images/icon/color_18/hourglass2.png); }
    +.ico.color.id{ background-image:url(../images/icon/color_18/id.png); }
    +.ico.color.info{ background-image:url(../images/icon/color_18/info.png); }
    +.ico.color.info2{ background-image:url(../images/icon/color_18/info2.png); }
    +.ico.color.italic{ background-image:url(../images/icon/color_18/italic.png); }
    +.ico.color.item{ background-image:url(../images/icon/color_18/item.png); }
    +.ico.color.key{ background-image:url(../images/icon/color_18/key.png); }
    +.ico.color.last{ background-image:url(../images/icon/color_18/last.png); }
    +.ico.color.lightbulb{ background-image:url(../images/icon/color_18/lightbulb.png); }
    +.ico.color.link{ background-image:url(../images/icon/color_18/link.png); }
    +.ico.color.list{ background-image:url(../images/icon/color_18/list.png); }
    +.ico.color.location{ background-image:url(../images/icon/color_18/location.png); }
    +.ico.color.lock{ background-image:url(../images/icon/color_18/lock.png); }
    +.ico.color.lock_open{ background-image:url(../images/icon/color_18/lock_open.png); }
    +.ico.color.login{ background-image:url(../images/icon/color_18/login.png); }
    +.ico.color.mail{ background-image:url(../images/icon/color_18/mail.png); }
    +.ico.color.mail_open{ background-image:url(../images/icon/color_18/mail_open.png); }
    +.ico.color.messenger{ background-image:url(../images/icon/color_18/messenger.png); }
    +.ico.color.microhpone{ background-image:url(../images/icon/color_18/microhpone.png); }
    +.ico.color.microphone{ background-image:url(../images/icon/color_18/microphone.png); }
    +.ico.color.money_bag{ background-image:url(../images/icon/color_18/money_bag.png); }
    +.ico.color.monitor{ background-image:url(../images/icon/color_18/monitor.png); }
    +.ico.color.moon{ background-image:url(../images/icon/color_18/moon.png); }
    +.ico.color.music{ background-image:url(../images/icon/color_18/music.png); }
    +.ico.color.music_folder{ background-image:url(../images/icon/color_18/music_folder.png); }
    +.ico.color.music_library{ background-image:url(../images/icon/color_18/music_library.png); }
    +.ico.color.next{ background-image:url(../images/icon/color_18/next.png); }
    +.ico.color.notepad{ background-image:url(../images/icon/color_18/notepad.png); }
    +.ico.color.paragraph_align_left{ background-image:url(../images/icon/color_18/paragraph_align_left.png); }
    +.ico.color.paragraph_align_right{ background-image:url(../images/icon/color_18/paragraph_align_right.png); }
    +.ico.color.paragraph_justify{ background-image:url(../images/icon/color_18/paragraph_justify.png); }
    +.ico.color.password{ background-image:url(../images/icon/color_18/password.png); }
    +.ico.color.paste{ background-image:url(../images/icon/color_18/paste.png); }
    +.ico.color.pause{ background-image:url(../images/icon/color_18/pause.png); }
    +.ico.color.pen{ background-image:url(../images/icon/color_18/pen.png); }
    +.ico.color.pencil{ background-image:url(../images/icon/color_18/pencil.png); }
    +.ico.color.phone{ background-image:url(../images/icon/color_18/phone.png); }
    +.ico.color.photo_album{ background-image:url(../images/icon/color_18/photo_album.png); }
    +.ico.color.pictures_folder{ background-image:url(../images/icon/color_18/pictures_folder.png); }
    +.ico.color.play{ background-image:url(../images/icon/color_18/play.png); }
    +.ico.color.point{ background-image:url(../images/icon/color_18/point.png); }
    +.ico.color.power{ background-image:url(../images/icon/color_18/power.png); }
    +.ico.color.previous{ background-image:url(../images/icon/color_18/previous.png); }
    +.ico.color.print{ background-image:url(../images/icon/color_18/print.png); }
    +.ico.color.pyramid{ background-image:url(../images/icon/color_18/pyramid.png); }
    +.ico.color.random{ background-image:url(../images/icon/color_18/random.png); }
    +.ico.color.record{ background-image:url(../images/icon/color_18/record.png); }
    +.ico.color.redo{ background-image:url(../images/icon/color_18/redo.png); }
    +.ico.color.reload{ background-image:url(../images/icon/color_18/reload.png); }
    +.ico.color.repeat{ background-image:url(../images/icon/color_18/repeat.png); }
    +.ico.color.resize2{ background-image:url(../images/icon/color_18/resize2.png); }
    +.ico.color.rewind{ background-image:url(../images/icon/color_18/rewind.png); }
    +.ico.color.rotate{ background-image:url(../images/icon/color_18/rotate.png); }
    +.ico.color.round{ background-image:url(../images/icon/color_18/round.png); }
    +.ico.color.ruler_square{ background-image:url(../images/icon/color_18/ruler_square.png); }
    +.ico.color.satellite{ background-image:url(../images/icon/color_18/satellite.png); }
    +.ico.color.scissors{ background-image:url(../images/icon/color_18/scissors.png); }
    +.ico.color.screwdriver{ background-image:url(../images/icon/color_18/screwdriver.png); }
    +.ico.color.security{ background-image:url(../images/icon/color_18/security.png); }
    +.ico.color.shopping_basket{ background-image:url(../images/icon/color_18/shopping_basket.png); }
    +.ico.color.software24{ background-image:url(../images/icon/color_18/software24.png); }
    +.ico.color.spam{ background-image:url(../images/icon/color_18/spam.png); }
    +.ico.color.speaker{ background-image:url(../images/icon/color_18/speaker.png); }
    +.ico.color.speaker2{ background-image:url(../images/icon/color_18/speaker2.png); }
    +.ico.color.sphere{ background-image:url(../images/icon/color_18/sphere.png); }
    +.ico.color.spreadsheet{ background-image:url(../images/icon/color_18/spreadsheet.png); }
    +.ico.color.square{ background-image:url(../images/icon/color_18/square.png); }
    +.ico.color.star{ background-image:url(../images/icon/color_18/star.png); }
    +.ico.color.stats_bars{ background-image:url(../images/icon/color_18/stats_bars.png); }
    +.ico.color.stats_lines{ background-image:url(../images/icon/color_18/stats_lines.png); }
    +.ico.color.stats_pie{ background-image:url(../images/icon/color_18/stats_pie.png); }
    +.ico.color.stop{ background-image:url(../images/icon/color_18/stop.png); }
    +.ico.color.strike_through{ background-image:url(../images/icon/color_18/strike_through.png); }
    +.ico.color.sun{ background-image:url(../images/icon/color_18/sun.png); }
    +.ico.color.target{ background-image:url(../images/icon/color_18/target.png); }
    +.ico.color.thunder{ background-image:url(../images/icon/color_18/thunder.png); }
    +.ico.color.trash_can{ background-image:url(../images/icon/color_18/trash_can.png); }
    +.ico.color.underlined{ background-image:url(../images/icon/color_18/underlined.png); }
    +.ico.color.undo{ background-image:url(../images/icon/color_18/undo.png); }
    +.ico.color.upload2{ background-image:url(../images/icon/color_18/upload2.png); }
    +.ico.color.usb{ background-image:url(../images/icon/color_18/usb.png); }
    +.ico.color.user{ background-image:url(../images/icon/color_18/user.png); }
    +.ico.color.user_woman{ background-image:url(../images/icon/color_18/user_woman.png); }
    +.ico.color.volume_control{ background-image:url(../images/icon/color_18/volume_control.png); }
    +.ico.color.webcam{ background-image:url(../images/icon/color_18/webcam.png); }
    +.ico.color.window{ background-image:url(../images/icon/color_18/window.png); }
    +.ico.color.wizard{ background-image:url(../images/icon/color_18/wizard.png); }
    +.ico.color.world{ background-image:url(../images/icon/color_18/world.png); }
    +.ico.color.zoom{ background-image:url(../images/icon/color_18/zoom.png); }
    +.ico.color.zoom_in{ background-image:url(../images/icon/color_18/zoom_in.png); }
    +.ico.color.zoom_out{ background-image:url(../images/icon/color_18/zoom_out.png); }
    +
    +
    +.ico.gray.shadow.abacus{ background-image:url(../images/icon/gray_shadow18/abacus.png); }
    +.ico.gray.shadow.calendar{ background-image:url(../images/icon/gray_shadow18/calendar.png); }
    +.ico.gray.shadow.file{ background-image:url(../images/icon/gray_shadow18/file.png); }
    +.ico.gray.shadow.firewall{ background-image:url(../images/icon/gray_shadow18/firewall.png); }
    +.ico.gray.shadow.home{ background-image:url(../images/icon/gray_shadow18/home.png); }
    +.ico.gray.shadow.location{ background-image:url(../images/icon/gray_shadow18/location.png); }
    +.ico.gray.shadow.paragraph_align_left{ background-image:url(../images/icon/gray_shadow18/paragraph_align_left.png); }
    +.ico.gray.shadow.pictures_folder{ background-image:url(../images/icon/gray_shadow18/pictures_folder.png); }
    +.ico.gray.shadow.satellite{ background-image:url(../images/icon/gray_shadow18/satellite.png); }
    +.ico.gray.shadow.spreadsheet{ background-image:url(../images/icon/gray_shadow18/spreadsheet.png); }
    +.ico.gray.shadow.stats_lines{ background-image:url(../images/icon/gray_shadow18/stats_lines.png); }
    +.ico.gray.shadow.window{ background-image:url(../images/icon/gray_shadow18/window.png); }
    diff --git a/src/main/webapp/plug-in/login/css/tipsy.css b/src/main/webapp/plug-in/login/css/tipsy.css
    new file mode 100644
    index 00000000..990481f6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/login/css/tipsy.css
    @@ -0,0 +1,114 @@
    +.tipsy {
    +	font-size: 10px;
    +	position: absolute;
    +	padding: 5px;
    +	z-index: 100008;
    +	text-shadow:none;
    +	font-weight:500;
    +	text-transform:uppercase;
    +	font-family:"Lucida Sans Unicode", "Lucida Grande", sans-serif
    +}
    +.tipsy-inner {
    +	background-color: #000;
    +	color: #FFF;
    +	max-width: 200px;
    +	padding: 5px 8px 6px 8px;
    +	text-align: center;
    +}
    +/* Rounded corners */
    +  .tipsy-inner {
    +/*	border-radius: 2px;
    +	-moz-border-radius: 2px;
    +	-webkit-border-radius: 2px;*/
    +}
    +/* Uncomment for shadow */
    +  /*.tipsy-inner { box-shadow: 0 0 5px #000000; -webkit-box-shadow: 0 0 5px #000000; -moz-box-shadow: 0 0 5px #000000; }*/
    +  
    +  .tipsy-arrow {
    +	position: absolute;
    +	width: 0;
    +	height: 0;
    +	line-height: 0;
    +	border: 5px dashed #000;
    +}
    +/* Rules to colour arrows */
    +  .tipsy-arrow-n {
    +	border-bottom-color: #000;
    +}
    +.tipsy-arrow-s {
    +	border-top-color: #000;
    +}
    +.tipsy-arrow-e {
    +	border-left-color: #000;
    +}
    +.tipsy-arrow-w {
    +	border-right-color: #000;
    +}
    +.tipsy-n .tipsy-arrow {
    +	top: 0px;
    +	left: 50%;
    +	margin-left: -5px;
    +	border-bottom-style: solid;
    +	border-top: none;
    +	border-left-color: transparent;
    +	border-right-color: transparent;
    +}
    +.tipsy-nw .tipsy-arrow {
    +	top: 0;
    +	left: 10px;
    +	border-bottom-style: solid;
    +	border-top: none;
    +	border-left-color: transparent;
    +	border-right-color: transparent;
    +}
    +.tipsy-ne .tipsy-arrow {
    +	top: 0;
    +	right: 10px;
    +	border-bottom-style: solid;
    +	border-top: none;
    +	border-left-color: transparent;
    +	border-right-color: transparent;
    +}
    +.tipsy-s .tipsy-arrow {
    +	bottom: 0;
    +	left: 50%;
    +	margin-left: -5px;
    +	border-top-style: solid;
    +	border-bottom: none;
    +	border-left-color: transparent;
    +	border-right-color: transparent;
    +}
    +.tipsy-sw .tipsy-arrow {
    +	bottom: 0;
    +	left: 10px;
    +	border-top-style: solid;
    +	border-bottom: none;
    +	border-left-color: transparent;
    +	border-right-color: transparent;
    +}
    +.tipsy-se .tipsy-arrow {
    +	bottom: 0;
    +	right: 10px;
    +	border-top-style: solid;
    +	border-bottom: none;
    +	border-left-color: transparent;
    +	border-right-color: transparent;
    +}
    +.tipsy-e .tipsy-arrow {
    +	right: 0;
    +	top: 50%;
    +	margin-top: -5px;
    +	border-left-style: solid;
    +	border-right: none;
    +	border-top-color: transparent;
    +	border-bottom-color: transparent;
    +}
    +.tipsy-w .tipsy-arrow {
    +	left: 0;
    +	top: 50%;
    +	margin-top: -5px;
    +	border-right-style: solid;
    +	border-left: none;
    +	border-top-color: transparent;
    +	border-bottom-color: transparent;
    +}
    diff --git a/src/main/webapp/plug-in/login/css/zice.style.css b/src/main/webapp/plug-in/login/css/zice.style.css
    new file mode 100644
    index 00000000..3f278a7b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/login/css/zice.style.css
    @@ -0,0 +1,800 @@
    +html {
    +	margin:0;
    +	padding:0;
    +}
    +body {
    +	margin: 0;
    +	padding: 0;
    +	font-family: Arial;
    +	font-size: 12px;
    +	color: #363636;
    +	background-repeat: repeat-x;
    +	background-image: url(../images/pick_bg.jpg);
    +
    +}
    +body.error {
    +	background-image: url(../images/pick_bg.error.jpg);
    +}
    +body.dashborad {
    +	background-image: url(../images/menu_bg.jpg);
    +	background-repeat: repeat-y;
    +}
    +body.nobg {
    +	background-image: none;
    +	background-repeat: repeat-y;
    +}
    +:focus {
    +	outline:0px;
    +}
    +ul {
    +	padding: 0;
    +	margin: 0px;
    +}
    +li {
    +	list-style: none;
    +}
    +h1, h2, h3, h4, h5, h6 {
    +	margin: 0;
    +	padding: 0;
    +	font-weight: bold;
    +	color:#666;
    +	font-family:"Myriad Pro", Arial, Helvetica, sans-serif;
    +	text-transform:uppercase;
    +	border-bottom: 1px #eeeeee solid;
    +	margin-bottom: 13px;
    +	line-height: 35px;
    +}
    +h1 {
    +	font-size: 24px;
    +}
    +h2 {
    +	font-size: 20px;
    +}
    +h3 {
    +	font-size: 16px;
    +}
    +
    +h4 {
    +	font-size: 14px;
    +}
    +h5 {
    +	font-size: 13px;
    +}
    +h6 {
    +	font-size: 11px;
    +
    +}
    +h1.unline, h2.unline, h3.unline,h4.unline, h5.unline, h6.unline {
    +	border-bottom: none!important;
    +	margin-bottom: 14px;
    +	}
    +b {
    +	font-weight: bold;
    +}
    +p {
    +	line-height: 23px;
    +	padding-left: 0px;
    +	padding-top:0px;
    +	margin-top:0px;
    +}
    +pre {
    +	padding:0px;
    +	margin:0px;
    +}
    +img {
    +	border: 0;
    +}
    +img.mid_align {
    +	vertical-align: middle;
    +	margin-right: 4px;
    +	border: 0;
    +}
    +blockquote {
    +	margin:0px 0 20px 0px;
    +	padding:0px 10px 0px 50px;
    +	background-image:url(../images/quote.png);
    +	background-repeat:no-repeat;
    +	background-position:0px 0px;
    +	clear:both;
    +	font-size:16px;
    +	line-height:25px;
    +	font-family:Georgia, "Times New Roman", Times, serif;
    +	font-style:italic
    +}
    +
    +blockquote.left, blockquote.right {
    +	float:right;
    +	letter-spacing:0px;
    +	margin-bottom:20px;
    +	margin-left:20px;
    +	margin-top:0px;
    +	padding:0px 20px 10px 60px;
    +	width:43%;
    +	background-position:0px 0px;
    +}
    +
    +blockquote.left {
    +	float:left;
    +	margin-left:0px;
    +	margin-right:20px;
    +}
    +
    +blockquote p {
    +	margin-bottom:0px;
    +	font-size:16px;
    +	line-height:20px
    +}
    +.showme {
    +	display: inline;
    +}
    +.hideme {
    +	display: none;
    +}
    +label {
    +	font-weight: bold;
    +	text-transform: capitalize;
    +}
    +label.disabled {
    +	color: #aaa;
    +}
    +.labelname {
    +	border: solid 1px #C9C9C9;
    +	outline: 0;
    +	line-height: 28px;
    +	height: 28px;
    +	padding: 6px 20px 8px 20px;
    +	margin-left: 2px;
    +}
    +.clear {
    +	clear: both;
    +	height: 0px;
    +	margin: 0;
    +	padding: 0;
    +}
    +.f_help {
    +	display:block;
    +	font-size:10px;
    +	padding:4px 0;
    +	color:#a3a3a3
    +}
    +.f_help span {
    +	color:#F00
    +}
    +.f_label {
    +	position:absolute;
    +	margin-top:-18px;
    +	padding-top: 10px;
    +	padding-bottom: 10px;
    +}
    +.preloader {
    +	display:inline-block;
    +	background-color: #ffffff;
    +	background-image: url(loader1.gif);
    +	background-repeat: no-repeat;
    +	background-position: center center;
    +}
    +/*
    +	loading layout
    +*/
    +#overlay {
    +	width:100%;
    +	height:100%;
    +	position:fixed;
    +	top:0;
    +	left:0;
    +	background-color:#111;
    +	/*	opacity:0.1;
    +	filter:alpha(opacity=10);*/
    +	z-index:1000;
    +	display: none;
    +}
    +#preloader {
    +	background: #000000 url(../images/preloader.gif) no-repeat 12px 10px;
    +	font-size: 11px;
    +	height: 20px;
    +	left: 50%;
    +	line-height: 20px;
    +	margin: -20px 0 0 -45px;
    +	padding: 10px;
    +	position: fixed;
    +	text-align: left;
    +	text-indent: 36px;
    +	top: 50%;
    +	width: 90px;
    +	z-index: 1209;
    +	opacity:0.8;
    +	filter:alpha(opacity=80);
    +	-moz-border-radius: 8px;
    +	-webkit-border-radius: 8px;
    +	border-radius: 8px;
    +	color: #FFF;
    +	text-shadow:none;
    +	display: none;
    +}
    +#pageload {
    +	background: #000000;
    +	font-size: 11px;
    +	height: 20px;
    +	left: 50%;
    +	line-height: 20px;
    +	margin: -20px 0 0 -55px;
    +	padding: 10px;
    +	position: fixed;
    +	text-align: center;
    +	top: 50%;
    +	width: 120px;
    +	z-index: 1006;
    +	opacity:0.8;
    +	filter:alpha(opacity=80);
    +	-moz-border-radius: 12px;
    +	-webkit-border-radius: 12px;
    +	border-radius: 12px;
    +	color: #FFF;
    +	text-shadow:none;
    +	display: none;
    +}
    +
    +
    +a {
    +	color: #1F92FF;
    +	text-decoration: none;
    +	text-shadow: 0px 0px 0px transparent;
    +	cursor: pointer;
    +}
    +a:active {
    +	color: #000000;
    +	text-decoration: none;
    +	text-shadow: 0px 0px 0px transparent;
    +}
    +a:hover {
    +	color: #06F;
    +	text-decoration: none;
    +	text-shadow: none;
    +}
    +a.red {
    +	color: #F30;
    +	text-decoration: none;
    +	text-shadow: 0px 0px 0px transparent;
    +	cursor: pointer;
    +}
    +a.red:hover {
    +	color: #F00;
    +}
    +span img {
    +	margin-bottom: -3px;
    +}
    +.inner h3 {
    +	color:#666;
    +	font-family:"Myriad Pro", Arial, Helvetica, sans-serif;
    +	font-size:18px;
    +	text-transform:uppercase;
    +	border-bottom: 1px #eeeeee solid;
    +	margin-bottom: 13px;
    +	line-height: 35px;
    +}
    +.show_add, .load_page, .show_edit {
    +	position: relative;
    +}
    +
    +
    +/*
    +		------------------------------------------------------------
    +		 input Type 
    +		------------------------------------------------------------
    +		*/
    +		textarea {
    +	background-position: 5px 5px;
    +	border: solid 1px #dddddd;
    +	outline: 0;
    +	padding: 7px 7px;
    +	min-height: 73px;
    +	overflow: auto;
    +	font-family: Arial, Helvetica, sans-serif;
    +}
    +input[type=text], input[type=password], .fileupload {
    +	background-position: 5px 5px;
    +	border: solid 1px #dddddd;
    +	outline: 0;
    +	line-height: 28px;
    +	height: 28px;
    +	padding: 0px 7px 0px 7px;
    +	-moz-box-shadow:1px 1px 2px #f5f5f5;
    +	-webkit-box-shadow:1px 1px 2px #f5f5f5;
    +	box-shadow:1px 1px 2px #f5f5f5;
    +	-webkit-transition: all 0.4s ease 0s;
    +	-moz-transition: all 0.4s ease 0s;
    +	-o-transition: all 0.4s ease 0s;
    +	transition: all 0.4s ease 0s;
    +}
    +input[type=text]:focus, input[type=password]:focus, textarea:focus, .fileupload:focus {
    +	border-color: #C9C9C9;
    +	-moz-box-shadow:0px 0px 8px #dddddd;
    +	-webkit-box-shadow:0px 0px 8px #dddddd;
    +	box-shadow:0px 0px 8px #dddddd;
    +}
    +input[type=text]:disabled, input[type=password]:disabled {
    +	background: -webkit-gradient(linear, left top, left 25, from(#EEEEEE), color-stop(4%, #EEEEEE), to(#EEEEEE));
    +	background: -moz-linear-gradient(top, #EEEEEE, #EEEEEE 1px, #EEEEEE 25px);
    +	color: #666;
    +}
    +input[type=text].error, input[type=password].error {
    +	height: 30px;
    +	border: 1px #F00 solid;
    +	background-position: 5px 5px;
    +	padding-left: 5px;
    +}
    +
    +
    +/*
    +		------------------------------------------------------------
    +		Form input
    +		------------------------------------------------------------
    +		*/
    +form input.xxsmall {
    +	width: 5%;
    +	text-align: center;
    +}
    +form input.xsmall {
    +	width: 10%;
    +	text-align: center;
    +}
    +form input.small {
    +	width: 20%;
    +}
    +form input.medium, form textarea.medium {
    +	width: 40%;
    +	max-width:40%
    +}
    +form input.large, form textarea.large {
    +	width: 69%;
    +	max-width:69%
    +}
    +form textarea.largeXL {
    +	width: 89%;
    +	max-width:89%;
    +	height:350px;
    +}
    +form input.full, form textarea.full {
    +	width: 95%;
    +	max-width:95%
    +}
    +form .limitchars{
    +	font-size:14px;
    +	color:#aaaaaa;
    +	text-align:right;
    +	}
    +form div.section {
    +	border-bottom: 1px solid #efefef;
    +	border-top: none;
    +	padding: 0px 0 13px 0;
    +}
    +form div.section:first-child, .modal_dialog form div.section:first-child {
    +	border-top: none
    +}
    +form div.section.last, .modal_dialog form div.section.last {
    +	border-bottom: none
    +}
    +form div.section > div {
    +	color: #404040;
    +	font-size: 11px;
    +	margin-left: 35%;
    +	position: relative;
    +	padding: 13px 0 0px 0;
    +}
    +form div.section > div >p{
    +	font-size: 12px;
    +	}
    +form div.section > div > label {
    +	font-size: 11px;
    +	font-weight: bold;
    +	text-transform: uppercase;
    +	margin-left: 5px;
    +}
    +form div.section > div > .select_box {
    +	margin-left: -1px;
    +	position:absolute;
    +	display:inline-block;
    +}
    +form div.section > label {
    +	color: #404040;
    +	float: left;
    +	margin-right: 5%;
    +	margin-top: 2px;
    +	width: 30%;
    +	padding: 11px 0 0px 0;
    +	font-size: 11px;
    +	font-weight: bold;
    +	text-transform: uppercase;
    +}
    +form div.section > div >label.red {
    +	color:#F00;
    +	text-transform: uppercase;
    +}
    +form div.section label small {
    +	color: #999;
    +	display: block;
    +	font-size: 11px;
    +	font-weight: normal;
    +	line-height: 13px;
    +	margin-top: 3px;
    +	text-transform: none;
    +}
    +ul.rowData li {
    +	float: left;
    +	margin-right: 2px;
    +}
    +ul.rowData li.sep {
    +	line-height:30px;
    +}
    +ul.rowData li > input {
    +	text-align: center;
    +}
    +/*alertMessage*/
    +
    +.alertMessage,#alertMessage
    +{
    +	-webkit-background-size: 40px 40px;
    +	-moz-background-size: 40px 40px;
    +	background-size: 40px 40px;
    +	background-image: -webkit-gradient(linear, left top, right bottom,
    +								color-stop(.25, rgba(255, 255, 255, .05)), color-stop(.25, transparent),
    +								color-stop(.5, transparent), color-stop(.5, rgba(255, 255, 255, .05)),
    +								color-stop(.75, rgba(255, 255, 255, .05)), color-stop(.75, transparent),
    +								to(transparent));
    +	background-image: -webkit-linear-gradient(135deg, rgba(255, 255, 255, .05) 25%, transparent 25%,
    +							transparent 50%, rgba(255, 255, 255, .05) 50%, rgba(255, 255, 255, .05) 75%,
    +							transparent 75%, transparent);
    +	background-image: -moz-linear-gradient(135deg, rgba(255, 255, 255, .05) 25%, transparent 25%,
    +							transparent 50%, rgba(255, 255, 255, .05) 50%, rgba(255, 255, 255, .05) 75%,
    +							transparent 75%, transparent);
    +	background-image: -ms-linear-gradient(135deg, rgba(255, 255, 255, .05) 25%, transparent 25%,
    +							transparent 50%, rgba(255, 255, 255, .05) 50%, rgba(255, 255, 255, .05) 75%,
    +							transparent 75%, transparent);
    +	background-image: -o-linear-gradient(135deg, rgba(255, 255, 255, .05) 25%, transparent 25%,
    +							transparent 50%, rgba(255, 255, 255, .05) 50%, rgba(255, 255, 255, .05) 75%,
    +							transparent 75%, transparent);
    +	background-image: linear-gradient(135deg, rgba(255, 255, 255, .05) 25%, transparent 25%,
    +							transparent 50%, rgba(255, 255, 255, .05) 50%, rgba(255, 255, 255, .05) 75%,
    +							transparent 75%, transparent);
    +	-moz-box-shadow: inset 0 -1px 0 rgba(255,255,255,.4);
    +	-webkit-box-shadow: inset 0 -1px 0 rgba(255,255,255,.4);
    +	box-shadow: inset 0 -1px 0 rgba(255,255,255,.4);
    +	font-size:13px;
    +	text-transform:capitalize;
    +/*	font-weight:bold;*/
    +	border: 1px solid!important;
    +	color: #fff;
    +	padding: 15px;
    +	text-shadow: 0 1px 0 rgba(0,0,0,.5);
    +	-webkit-animation: animate-bg 5s linear infinite;
    +	-moz-animation: animate-bg 5s linear infinite;
    +	margin-bottom: 10px;
    +}
    +#alertMessage{
    +	position:fixed;
    +	/*	display:none;
    +	position: absolute;
    +	opacity:0;
    +	filter:alpha(opacity=0);*/
    +	right: -90px;
    +	text-transform: uppercase;
    +	bottom: 35px;
    +	z-index:100001;
    +	cursor:pointer;
    +	border: 1px solid;
    +	display: none;
    +	}
    +
    +.alertMessage.info ,#alertMessage.info 
    +{
    +		 border-color: #3b8eb5!important;
    +	background-color:#C2E3F0;
    +	color:#34667A!important;
    +	text-shadow:1px 1px 1px #C8EBFB;
    +}
    +
    +.alertMessage.error ,#alertMessage.error
    +{
    +	border-color: #c43d3d!important;
    +	background-color:#fc4a48;
    +	color:#5A0000 !important;
    +	text-shadow:1px 1px 1px #E64040;
    +}
    +.alertMessage.warning ,#alertMessage.warning 		 
    +{
    +		 border-color: #d99a36 !important;
    +	background-color:#fcdb72;
    +	color:#987402 !important;
    +	text-shadow:1px 1px 1px #e7b104;
    +}
    +.alertMessage.success ,#alertMessage.success 
    +{
    +		 background-color: #61b832;
    +		 border-color: #55a12c !important;
    +/*	color:#324e03 !important;*/
    +	text-shadow:1px 1px 1px #5c9201;
    +}
    +
    +.alertMessage h3
    +{
    +		 margin: 0  !important;
    +		 border:none;
    +		line-height: 25px !important;
    +		color:#FFF;
    +}
    +
    +.message p
    +{
    +		 margin: 0;													 
    +}
    +
    +@-webkit-keyframes animate-bg
    +{
    +    from {
    +        background-position: 0 0;
    +    }
    +    to {
    +       background-position: -80px 0;
    +    }
    +}
    +
    +
    +@-moz-keyframes animate-bg 
    +{
    +    from {
    +        background-position: 0 0;
    +    }
    +    to {
    +       background-position: -80px 0;
    +    }
    +}
    +/* styled checkboxes */
    +.iPhoneCheckContainer {
    +	position:relative;
    +	height:27px;
    +	cursor:pointer;
    +	overflow:hidden;
    +	border: 2px #f1f1f1 solid;
    +}
    +.iPhoneCheckContainer:hover {
    +	border: 0px #ffffff solid;
    +	margin:2px;
    +	-moz-box-shadow: rgba(0, 0, 0, 0.25) 0px 0px 12px;
    +	-webkit-box-shadow: rgba(0, 0, 0, 0.25) 0px 0px 12px;
    +	box-shadow: rgba(0, 0, 0, 0.25) 0px 0px 12px;
    +}
    +.iPhoneCheckContainer input {
    +	position:absolute;
    +	top:5px;
    +	left:30px;
    +filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    +	opacity:0
    +}
    +.iPhoneCheckContainer label {
    +	white-space:nowrap;
    +	font-size:10px;
    +	font-weight: bold;
    +	line-height:16px;
    +	text-transform:uppercase;
    +	cursor:pointer;
    +	display:block;
    +	height:22px;
    +	position:absolute;
    +	width:auto;
    +	top:0;
    +	padding-top:5px;
    +	overflow:hidden
    +}
    +.iPhoneCheckContainer, .iPhoneCheckContainer label {
    +	user-select:none;
    +	-moz-user-select:none;
    +	-khtml-user-select:none
    +}
    +.iPhoneCheckDisabled {
    +filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
    +	opacity:0.5
    +}
    +label.iPhoneCheckLabelOn {
    +	color:#FFF;
    +	background:url(../images/on.png) no-repeat left top;
    +	text-shadow:0 1px 2px rgba(0, 0, 0, 0.6);
    +	left:0;
    +	padding-top:5px
    +}
    +label.iPhoneCheckLabelOn span {
    +	padding-left:13px
    +}
    +label.iPhoneCheckLabelOff {
    +	color:#FFF;
    +	background:url(../images/off.png) no-repeat right 0;
    +	text-shadow:0 1px 2px rgba(0, 0, 0, 0.6);
    +	text-align:right;
    +	right:0
    +}
    +label.iPhoneCheckLabelOff span {
    +	padding-right:11px
    +}
    +.iPhoneCheckHandle {
    +	display:block;
    +	height:27px;
    +	cursor:pointer;
    +	position:absolute;
    +	top:0;
    +	left:0;
    +	background:url(../images/slider_left.png) no-repeat;
    +	padding-left:3px
    +}
    +.iPhoneCheckHandleRight {
    +	height:100%;
    +	width:100%;
    +	padding-right:3px;
    +	background:url(../images/slider_right.png) no-repeat right 0
    +}
    +.iPhoneCheckHandleCenter {
    +	height:100%;
    +	width:100%;
    +	background:url(../images/slider_center.png)
    +}
    +.responMsg {
    +	width: 40%;
    +	padding: 40px 0 0px 0;
    +	margin: auto;
    +	display:none;
    +}
    +.responMsg > div {
    +	text-align: center;
    +	padding: 50px 0;
    +	border: 1px #eeeeee dashed;
    +}
    +.responMsg h2 {
    +	display: block;
    +}
    +.responMsg a {
    +}
    +#versionBar {
    +	height: 50px;
    +	background-color: #000;
    +	background-image: url(../images/top_bgrepeat.jpg);
    +	text-shadow:none;
    +	color:#FFF;
    +	text-align: right;
    +	font-size:10px;
    +	line-height: 50px;
    +	padding: 0 0px;
    +}
    +#login {
    +	width:600px;
    +    /*update-begin--Author:zhangguoming  Date:20140226 for锛氭坊鍔犻獙璇佺爜*/
    +	/*height:284px;*/
    +	height:353px;
    +    /*update-end--Author:zhangguoming  Date:20140226 for锛氭坊鍔犻獙璇佺爜*/
    +	margin:20px auto;
    +	
    +	position:absolute;
    +    /*update-begin--Author:zhangguoming  Date:20140226 for锛氭坊鍔犻獙璇佺爜*/
    +	/*top:50%;*/
    +	top:40%;
    +    /*update-begin--Author:zhangguoming  Date:20140226 for锛氭坊鍔犻獙璇佺爜*/
    +	left:43%;
    +	margin-left:-200px;
    +	margin-top:-148px;
    +	opacity:0;
    +	filter:alpha(opacity=0);
    +	
    +	border: 5px #f4f4f4 solid;
    +	min-width:200px;
    +	border-radius: 15px;
    +	-webkit-border-radius: 15px;
    +}
    +#login .ribbon {
    +	position: absolute;
    +	width: 111px;
    +	height: 110px;
    +	z-index: 12;
    +	margin-top: -8px;
    +	margin-left: -9px;
    +
    +}
    +#login .shadow {
    +	position: absolute;
    +	width: 444px;
    +	z-index: -1;
    +	margin-top: 5px;
    +	background-image: url(../images/shadowForm.png);
    +	height: 33px;
    +	margin-left: 70px;
    +}
    +#login .inner {
    +	background-color:#FFF;
    +	border: 1px #cccccc solid;
    +    /*update-begin--Author:zhangguoming  Date:20140226 for锛氭坊鍔犻獙璇佺爜*/
    +	/*min-height: 230px;*/
    +	min-height: 350px;
    +    /*update-end--Author:zhangguoming  Date:20140226 for锛氭坊鍔犻獙璇佺爜*/
    +	overflow: hidden;
    +	border-radius: 10px;
    +	-webkit-border-radius: 10px;
    +}
    +
    +#login .logo {
    +	width:191px;
    +	height:41px;
    +	margin:20px auto;
    +	text-align:center;
    +	position: absolute;
    +	opacity:0;
    +	top: 5%;
    +	left: 25%;
    +	margin-left: -95px;
    +	z-index: 11;
    +	background-color: #FFF;
    +}
    +#login .formLogin {
    +	width:100%;
    +	text-align:center;
    +	margin:auto;
    +	position: relative;
    +	left: -700px;
    +	opacity:0;
    +	filter:alpha(opacity=0);
    +	height: 175px;
    +	padding: 90px 0px 20px 0px;
    +	border-radius: 15px;
    +	-webkit-border-radius: 15px;
    +
    +}
    +
    +#login input{
    +	font-size: 25px;
    +	background-repeat:no-repeat;
    +/*	padding-left: 35px;*/
    +text-align:center;
    +	margin:auto;	
    +	height: 35px;
    +	background-position: 2px 3px;
    +/*	background-position:right center; */
    +	line-height: 35px;
    +	color: #999;
    +	/*update-begin--Author:tanghong  Date:20130419 for锟斤拷锟斤拷锟角否】帮拷钮锟斤拷位*/
    +	/* width: 80%;*/
    +	/*update-end--Author:tanghong  Date:20130419 for锟斤拷锟斤拷锟角否】帮拷钮锟斤拷位*/
    +	margin-bottom: 10px;
    +	font-family:"Myriad Pro", Arial, Helvetica, sans-serif;
    +}
    +#login input:focus{
    +	color:#000;
    +}
    +#login .userName {
    +	background-image: url(../images/user_.png);
    +}
    +#login .password {
    +	background-image: url(../images/pass_.png);
    +}
    +#login .loginButton{
    +	width:80%;
    +	padding:0px 5px;
    +	margin: 5px auto 20px auto;
    +}
    +.text_success {
    +	font-size:14px;
    +	text-align:center;
    +	margin:0px 0 35px 0;
    +	line-height:25px;
    +	position: absolute;
    +	left: 50%;
    +	width: 200px;
    +	top: 50%;
    +	z-index: 50;
    +	margin-left: -100px;
    +	text-transform: uppercase;
    +	padding: 20px 0px;
    +	margin-top: -100px;
    +	display: none;
    +}
    +.text_success img {
    +}
    +.text_success span {
    +	display: block;
    +	padding: 10px;
    +	color: #CCC;
    +}
    diff --git a/src/main/webapp/plug-in/login/images/Thumbs.db b/src/main/webapp/plug-in/login/images/Thumbs.db
    new file mode 100644
    index 00000000..ab06d0ea
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/Thumbs.db differ
    diff --git a/src/main/webapp/plug-in/login/images/cysl.png b/src/main/webapp/plug-in/login/images/cysl.png
    new file mode 100644
    index 00000000..3c3b7112
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/cysl.png differ
    diff --git a/src/main/webapp/plug-in/login/images/cysl_up.png b/src/main/webapp/plug-in/login/images/cysl_up.png
    new file mode 100644
    index 00000000..4a4a4d99
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/cysl_up.png differ
    diff --git a/src/main/webapp/plug-in/login/images/default.png b/src/main/webapp/plug-in/login/images/default.png
    new file mode 100644
    index 00000000..5516482b
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/default.png differ
    diff --git a/src/main/webapp/plug-in/login/images/default_up.png b/src/main/webapp/plug-in/login/images/default_up.png
    new file mode 100644
    index 00000000..032ccb89
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/default_up.png differ
    diff --git a/src/main/webapp/plug-in/login/images/exit.png b/src/main/webapp/plug-in/login/images/exit.png
    new file mode 100644
    index 00000000..b442b31b
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/exit.png differ
    diff --git a/src/main/webapp/plug-in/login/images/fb-icons.png b/src/main/webapp/plug-in/login/images/fb-icons.png
    new file mode 100644
    index 00000000..dd35e00d
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/fb-icons.png differ
    diff --git a/src/main/webapp/plug-in/login/images/foot.png b/src/main/webapp/plug-in/login/images/foot.png
    new file mode 100644
    index 00000000..c7f880c4
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/foot.png differ
    diff --git a/src/main/webapp/plug-in/login/images/guanli.png b/src/main/webapp/plug-in/login/images/guanli.png
    new file mode 100644
    index 00000000..3a4f53ca
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/guanli.png differ
    diff --git a/src/main/webapp/plug-in/login/images/guanli_up.png b/src/main/webapp/plug-in/login/images/guanli_up.png
    new file mode 100644
    index 00000000..d0d5f2e3
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/guanli_up.png differ
    diff --git a/src/main/webapp/plug-in/login/images/head.png b/src/main/webapp/plug-in/login/images/head.png
    new file mode 100644
    index 00000000..9e203d1a
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/head.png differ
    diff --git a/src/main/webapp/plug-in/login/images/jeecg.png b/src/main/webapp/plug-in/login/images/jeecg.png
    new file mode 100644
    index 00000000..ebe4163d
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/jeecg.png differ
    diff --git a/src/main/webapp/plug-in/login/images/jeecg_tag.png b/src/main/webapp/plug-in/login/images/jeecg_tag.png
    new file mode 100644
    index 00000000..8a023749
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/jeecg_tag.png differ
    diff --git a/src/main/webapp/plug-in/login/images/loader_green.gif b/src/main/webapp/plug-in/login/images/loader_green.gif
    new file mode 100644
    index 00000000..d1980850
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/loader_green.gif differ
    diff --git a/src/main/webapp/plug-in/login/images/logo.jpg b/src/main/webapp/plug-in/login/images/logo.jpg
    new file mode 100644
    index 00000000..edc502e0
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/logo.jpg differ
    diff --git a/src/main/webapp/plug-in/login/images/msg.png b/src/main/webapp/plug-in/login/images/msg.png
    new file mode 100644
    index 00000000..7688db95
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/msg.png differ
    diff --git a/src/main/webapp/plug-in/login/images/msg_up.png b/src/main/webapp/plug-in/login/images/msg_up.png
    new file mode 100644
    index 00000000..b3fc71f4
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/msg_up.png differ
    diff --git a/src/main/webapp/plug-in/login/images/off.png b/src/main/webapp/plug-in/login/images/off.png
    new file mode 100644
    index 00000000..08dff11c
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/off.png differ
    diff --git a/src/main/webapp/plug-in/login/images/on.png b/src/main/webapp/plug-in/login/images/on.png
    new file mode 100644
    index 00000000..9cb28f04
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/on.png differ
    diff --git a/src/main/webapp/plug-in/login/images/online.png b/src/main/webapp/plug-in/login/images/online.png
    new file mode 100644
    index 00000000..5d52de89
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/online.png differ
    diff --git a/src/main/webapp/plug-in/login/images/online_up.png b/src/main/webapp/plug-in/login/images/online_up.png
    new file mode 100644
    index 00000000..f4684a38
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/online_up.png differ
    diff --git a/src/main/webapp/plug-in/login/images/pass_.png b/src/main/webapp/plug-in/login/images/pass_.png
    new file mode 100644
    index 00000000..a6658b10
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/pass_.png differ
    diff --git a/src/main/webapp/plug-in/login/images/pick_bg.error.jpg b/src/main/webapp/plug-in/login/images/pick_bg.error.jpg
    new file mode 100644
    index 00000000..10d021f1
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/pick_bg.error.jpg differ
    diff --git a/src/main/webapp/plug-in/login/images/pick_bg.jpg b/src/main/webapp/plug-in/login/images/pick_bg.jpg
    new file mode 100644
    index 00000000..a65eb90b
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/pick_bg.jpg differ
    diff --git a/src/main/webapp/plug-in/login/images/preloader.gif b/src/main/webapp/plug-in/login/images/preloader.gif
    new file mode 100644
    index 00000000..b7e24792
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/preloader.gif differ
    diff --git a/src/main/webapp/plug-in/login/images/quote.png b/src/main/webapp/plug-in/login/images/quote.png
    new file mode 100644
    index 00000000..23ec97a7
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/quote.png differ
    diff --git a/src/main/webapp/plug-in/login/images/shadowForm.png b/src/main/webapp/plug-in/login/images/shadowForm.png
    new file mode 100644
    index 00000000..ac323961
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/shadowForm.png differ
    diff --git a/src/main/webapp/plug-in/login/images/slider_center.png b/src/main/webapp/plug-in/login/images/slider_center.png
    new file mode 100644
    index 00000000..310fc8cc
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/slider_center.png differ
    diff --git a/src/main/webapp/plug-in/login/images/slider_left.png b/src/main/webapp/plug-in/login/images/slider_left.png
    new file mode 100644
    index 00000000..bec9fa04
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/slider_left.png differ
    diff --git a/src/main/webapp/plug-in/login/images/slider_right.png b/src/main/webapp/plug-in/login/images/slider_right.png
    new file mode 100644
    index 00000000..c3565bbd
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/slider_right.png differ
    diff --git a/src/main/webapp/plug-in/login/images/tb-active.png b/src/main/webapp/plug-in/login/images/tb-active.png
    new file mode 100644
    index 00000000..e38af4d0
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/tb-active.png differ
    diff --git a/src/main/webapp/plug-in/login/images/top_bg.jpg b/src/main/webapp/plug-in/login/images/top_bg.jpg
    new file mode 100644
    index 00000000..e4d3101b
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/top_bg.jpg differ
    diff --git a/src/main/webapp/plug-in/login/images/top_bgrepeat.jpg b/src/main/webapp/plug-in/login/images/top_bgrepeat.jpg
    new file mode 100644
    index 00000000..ae8b3c4e
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/top_bgrepeat.jpg differ
    diff --git a/src/main/webapp/plug-in/login/images/toplogo-jeecg.png b/src/main/webapp/plug-in/login/images/toplogo-jeecg.png
    new file mode 100644
    index 00000000..56a553d1
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/toplogo-jeecg.png differ
    diff --git a/src/main/webapp/plug-in/login/images/toplogo-main.png b/src/main/webapp/plug-in/login/images/toplogo-main.png
    new file mode 100644
    index 00000000..672a0675
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/toplogo-main.png differ
    diff --git a/src/main/webapp/plug-in/login/images/toplogo.png b/src/main/webapp/plug-in/login/images/toplogo.png
    new file mode 100644
    index 00000000..83b2462b
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/toplogo.png differ
    diff --git a/src/main/webapp/plug-in/login/images/typelogin.png b/src/main/webapp/plug-in/login/images/typelogin.png
    new file mode 100644
    index 00000000..feeeb97c
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/typelogin.png differ
    diff --git a/src/main/webapp/plug-in/login/images/ui-lgreen.jpg b/src/main/webapp/plug-in/login/images/ui-lgreen.jpg
    new file mode 100644
    index 00000000..958e67bf
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/ui-lgreen.jpg differ
    diff --git a/src/main/webapp/plug-in/login/images/ui-red.jpg b/src/main/webapp/plug-in/login/images/ui-red.jpg
    new file mode 100644
    index 00000000..08bfecd5
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/ui-red.jpg differ
    diff --git a/src/main/webapp/plug-in/login/images/user_.png b/src/main/webapp/plug-in/login/images/user_.png
    new file mode 100644
    index 00000000..0b860adf
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/user_.png differ
    diff --git a/src/main/webapp/plug-in/login/images/xtgl.png b/src/main/webapp/plug-in/login/images/xtgl.png
    new file mode 100644
    index 00000000..147f6ef5
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/xtgl.png differ
    diff --git a/src/main/webapp/plug-in/login/images/xtgl_up.png b/src/main/webapp/plug-in/login/images/xtgl_up.png
    new file mode 100644
    index 00000000..80c48a39
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/xtgl_up.png differ
    diff --git a/src/main/webapp/plug-in/login/images/xtjk.png b/src/main/webapp/plug-in/login/images/xtjk.png
    new file mode 100644
    index 00000000..167483c4
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/xtjk.png differ
    diff --git a/src/main/webapp/plug-in/login/images/xtjk_up.png b/src/main/webapp/plug-in/login/images/xtjk_up.png
    new file mode 100644
    index 00000000..1cb8d36f
    Binary files /dev/null and b/src/main/webapp/plug-in/login/images/xtjk_up.png differ
    diff --git a/src/main/webapp/plug-in/login/js/html5.js b/src/main/webapp/plug-in/login/js/html5.js
    new file mode 100644
    index 00000000..560aa942
    --- /dev/null
    +++ b/src/main/webapp/plug-in/login/js/html5.js
    @@ -0,0 +1,3 @@
    +/*! HTML5 Shiv vpre3.6 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
    +  Uncompressed source: https://github.com/aFarkas/html5shiv  */
    +(function(a,b){function h(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function i(){var a=l.elements;return typeof a=="string"?a.split(" "):a}function j(a){var b={},c=a.createElement,f=a.createDocumentFragment,g=f();a.createElement=function(a){if(!l.shivMethods)return c(a);var f;return b[a]?f=b[a].cloneNode():e.test(a)?f=(b[a]=c(a)).cloneNode():f=c(a),f.canHaveChildren&&!d.test(a)?g.appendChild(f):f},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+i().join().replace(/\w+/g,function(a){return c(a),g.createElement(a),'c("'+a+'")'})+");return n}")(l,g)}function k(a){var b;return a.documentShived?a:(l.shivCSS&&!f&&(b=!!h(a,"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}")),g||(b=!j(a)),b&&(a.documentShived=b),a)}var c=a.html5||{},d=/^<|^(?:button|form|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i,f,g;(function(){var c=b.createElement("a");c.innerHTML="<xyz></xyz>",f="hidden"in c,f&&typeof injectElementWithStyles=="function"&&injectElementWithStyles("#modernizr{}",function(b){b.hidden=!0,f=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle).display=="none"}),g=c.childNodes.length==1||function(){try{b.createElement("a")}catch(a){return!0}var c=b.createDocumentFragment();return typeof c.cloneNode=="undefined"||typeof c.createDocumentFragment=="undefined"||typeof c.createElement=="undefined"}()})();var l={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:k};a.html5=l,k(b)})(this,document)
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/login/js/iepng.js b/src/main/webapp/plug-in/login/js/iepng.js
    new file mode 100644
    index 00000000..00906b14
    --- /dev/null
    +++ b/src/main/webapp/plug-in/login/js/iepng.js
    @@ -0,0 +1,370 @@
    +var EvPNG = {
    +    ns: 'EvPNG',
    +    imgSize: {},
    +    createVmlNameSpace: function() {
    +        if (document.namespaces && !document.namespaces[this.ns]) {
    +            document.namespaces.add(this.ns, 'urn:schemas-microsoft-com:vml')
    +
    +        }
    +        if (window.attachEvent) {
    +            window.attachEvent('onbeforeunload', 
    +            function() {
    +                EvPNG = null
    +
    +            })
    +
    +        }
    +
    +    },
    +    createVmlStyleSheet: function() {
    +        var a = document.createElement('style');
    +        document.documentElement.firstChild.insertBefore(a, document.documentElement.firstChild.firstChild);
    +        var b = a.styleSheet;
    +        b.addRule(this.ns + '\\:*', '{behavior:url(#default#VML)}');
    +        b.addRule(this.ns + '\\:shape', 'position:absolute;');
    +        b.addRule('img.' + this.ns + '_sizeFinder', 'behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;');
    +        this.styleSheet = b
    +
    +    },
    +    readPropertyChange: function() {
    +        var a = event.srcElement;
    +        if (event.propertyName.search('background') != -1 || event.propertyName.search('border') != -1) {
    +            EvPNG.applyVML(a)
    +
    +        }
    +        if (event.propertyName == 'style.display') {
    +            var b = (a.currentStyle.display == 'none') ? 'none': 'block';
    +            for (var v in a.vml) {
    +                a.vml[v].shape.style.display = b
    +
    +            }
    +
    +        }
    +        if (event.propertyName.search('filter') != -1) {
    +            EvPNG.vmlOpacity(a)
    +
    +        }
    +
    +    },
    +    vmlOpacity: function(a) {
    +        if (a.currentStyle.filter.search('lpha') != -1) {
    +            var b = a.currentStyle.filter;
    +            b = parseInt(b.substring(b.lastIndexOf('=') + 1, b.lastIndexOf(')')), 10) / 100;
    +            a.vml.color.shape.style.filter = a.currentStyle.filter;
    +            a.vml.image.fill.opacity = b
    +
    +        }
    +
    +    },
    +    handlePseudoHover: function(a) {
    +        setTimeout(function() {
    +            EvPNG.applyVML(a)
    +
    +        },
    +        1)
    +
    +    },
    +    fix: function(a) {
    +        var b = a.split(',');
    +        for (var i = 0; i < b.length; i++) {
    +            this.styleSheet.addRule(b[i], 'behavior:expression(EvPNG.fixPng(this))')
    +
    +        }
    +
    +    },
    +    applyVML: function(a) {
    +        a.runtimeStyle.cssText = '';
    +        this.vmlFill(a);
    +        this.vmlOffsets(a);
    +        this.vmlOpacity(a);
    +        if (a.isImg) {
    +            this.copyImageBorders(a)
    +
    +        }
    +
    +    },
    +    attachHandlers: function(b) {
    +        var c = this;
    +        var d = {
    +            resize: 'vmlOffsets',
    +            move: 'vmlOffsets'
    +
    +        };
    +        if (b.nodeName == 'A') {
    +            var e = {
    +                mouseleave: 'handlePseudoHover',
    +                mouseenter: 'handlePseudoHover',
    +                focus: 'handlePseudoHover',
    +                blur: 'handlePseudoHover'
    +
    +            };
    +            for (var a in e) {
    +                d[a] = e[a]
    +
    +            }
    +
    +        }
    +        for (var h in d) {
    +            b.attachEvent('on' + h, 
    +            function() {
    +                c[d[h]](b)
    +
    +            })
    +
    +        }
    +        b.attachEvent('onpropertychange', this.readPropertyChange)
    +
    +    },
    +    giveLayout: function(a) {
    +        a.style.zoom = 1;
    +        if (a.currentStyle.position == 'static') {
    +            a.style.position = 'relative'
    +
    +        }
    +
    +    },
    +    copyImageBorders: function(a) {
    +        var b = {
    +            'borderStyle': true,
    +            'borderWidth': true,
    +            'borderColor': true
    +
    +        };
    +        for (var s in b) {
    +            a.vml.color.shape.style[s] = a.currentStyle[s]
    +
    +        }
    +
    +    },
    +    vmlFill: function(a) {
    +        if (!a.currentStyle) {
    +            return
    +
    +        } else {
    +            var b = a.currentStyle
    +
    +        }
    +        for (var v in a.vml) {
    +            a.vml[v].shape.style.zIndex = b.zIndex
    +
    +        }
    +        a.runtimeStyle.backgroundColor = '';
    +        a.runtimeStyle.backgroundImage = '';
    +        var c = (b.backgroundColor == 'transparent');
    +        var d = true;
    +        if (b.backgroundImage != 'none' || a.isImg) {
    +            if (!a.isImg) {
    +                a.vmlBg = b.backgroundImage;
    +                a.vmlBg = a.vmlBg.substr(5, a.vmlBg.lastIndexOf('")') - 5)
    +
    +            } else {
    +                a.vmlBg = a.src
    +
    +            }
    +            var e = this;
    +            if (!e.imgSize[a.vmlBg]) {
    +                var f = document.createElement('img');
    +                e.imgSize[a.vmlBg] = f;
    +                f.className = e.ns + '_sizeFinder';
    +                f.runtimeStyle.cssText = 'behavior:none; position:absolute; left:-10000px; top:-10000px; border:none;';
    +                f.attachEvent('onload', 
    +                function() {
    +                    this.width = this.offsetWidth;
    +                    this.height = this.offsetHeight;
    +                    e.vmlOffsets(a)
    +
    +                });
    +                f.src = a.vmlBg;
    +                f.removeAttribute('width');
    +                f.removeAttribute('height');
    +                document.body.insertBefore(f, document.body.firstChild)
    +
    +            }
    +            a.vml.image.fill.src = a.vmlBg;
    +            d = false
    +
    +        }
    +        a.vml.image.fill.on = !d;
    +        a.vml.image.fill.color = 'none';
    +        a.vml.color.shape.style.backgroundColor = b.backgroundColor;
    +        a.runtimeStyle.backgroundImage = 'none';
    +        a.runtimeStyle.backgroundColor = 'transparent'
    +
    +    },
    +    vmlOffsets: function(e) {
    +        var f = e.currentStyle;
    +        var g = {
    +            'W': e.clientWidth + 1,
    +            'H': e.clientHeight + 1,
    +            'w': this.imgSize[e.vmlBg].width,
    +            'h': this.imgSize[e.vmlBg].height,
    +            'L': e.offsetLeft,
    +            'T': e.offsetTop,
    +            'bLW': e.clientLeft,
    +            'bTW': e.clientTop
    +
    +        };
    +        var i = (g.L + g.bLW == 1) ? 1: 0;
    +        var j = function(a, l, t, w, h, o) {
    +            a.coordsize = w + ',' + h;
    +            a.coordorigin = o + ',' + o;
    +            a.path = 'm0,0l' + w + ',0l' + w + ',' + h + 'l0,' + h + ' xe';
    +            a.style.width = w + 'px';
    +            a.style.height = h + 'px';
    +            a.style.left = l + 'px';
    +            a.style.top = t + 'px'
    +
    +        };
    +        j(e.vml.color.shape, (g.L + (e.isImg ? 0: g.bLW)), (g.T + (e.isImg ? 0: g.bTW)), (g.W - 1), (g.H - 1), 0);
    +        j(e.vml.image.shape, (g.L + g.bLW), (g.T + g.bTW), (g.W), (g.H), 1);
    +        var k = {
    +            'X': 0,
    +            'Y': 0
    +
    +        };
    +        var m = function(a, b) {
    +            var c = true;
    +            switch (b) {
    +                case 'left':
    +            case 'top':
    +                k[a] = 0;
    +                break;
    +                case 'center':
    +                k[a] = .5;
    +                break;
    +                case 'right':
    +            case 'bottom':
    +                k[a] = 1;
    +                break;
    +                default:
    +                if (b.search('%') != -1) {
    +                    k[a] = parseInt(b) * .01
    +
    +                } else {
    +                    c = false
    +
    +                }
    +
    +            }
    +            var d = (a == 'X');
    +            k[a] = Math.ceil(c ? ((g[d ? 'W': 'H'] * k[a]) - (g[d ? 'w': 'h'] * k[a])) : parseInt(b));
    +            if (k[a] == 0) {
    +                k[a]++
    +
    +            }
    +
    +        };
    +        for (var b in k) {
    +            m(b, f['backgroundPosition' + b])
    +
    +        }
    +        e.vml.image.fill.position = (k.X / g.W) + ',' + (k.Y / g.H);
    +        var n = f.backgroundRepeat;
    +        var p = {
    +            'T': 1,
    +            'R': g.W + i,
    +            'B': g.H,
    +            'L': 1 + i
    +
    +        };
    +        var q = {
    +            'X': {
    +                'b1': 'L',
    +                'b2': 'R',
    +                'd': 'W'
    +
    +            },
    +            'Y': {
    +                'b1': 'T',
    +                'b2': 'B',
    +                'd': 'H'
    +
    +            }
    +
    +        };
    +        if (n != 'repeat') {
    +            var c = {
    +                'T': (k.Y),
    +                'R': (k.X + g.w),
    +                'B': (k.Y + g.h),
    +                'L': (k.X)
    +
    +            };
    +            if (n.search('repeat-') != -1) {
    +                var v = n.split('repeat-')[1].toUpperCase();
    +                c[q[v].b1] = 1;
    +                c[q[v].b2] = g[q[v].d]
    +
    +            }
    +            if (c.B > g.H) {
    +                c.B = g.H
    +
    +            }
    +            e.vml.image.shape.style.clip = 'rect(' + c.T + 'px ' + (c.R + i) + 'px ' + c.B + 'px ' + (c.L + i) + 'px)'
    +
    +        } else {
    +            e.vml.image.shape.style.clip = 'rect(' + p.T + 'px ' + p.R + 'px ' + p.B + 'px ' + p.L + 'px)'
    +
    +        }
    +
    +    },
    +    fixPng: function(a) {
    +        a.style.behavior = 'none';
    +        if (a.nodeName == 'BODY' || a.nodeName == 'TD' || a.nodeName == 'TR') {
    +            return
    +
    +        }
    +        a.isImg = false;
    +        if (a.nodeName == 'IMG') {
    +            if (a.src.toLowerCase().search(/\.png$/) != -1) {
    +                a.isImg = true;
    +                a.style.visibility = 'hidden'
    +
    +            } else {
    +                return
    +
    +            }
    +
    +        } else if (a.currentStyle.backgroundImage.toLowerCase().search('.png') == -1) {
    +            return
    +
    +        }
    +        var b = EvPNG;
    +        a.vml = {
    +            color: {},
    +            image: {}
    +
    +        };
    +        var c = {
    +            shape: {},
    +            fill: {}
    +
    +        };
    +        for (var r in a.vml) {
    +            for (var e in c) {
    +                var d = b.ns + ':' + e;
    +                a.vml[r][e] = document.createElement(d)
    +
    +            }
    +            a.vml[r].shape.stroked = false;
    +            a.vml[r].shape.appendChild(a.vml[r].fill);
    +            a.parentNode.insertBefore(a.vml[r].shape, a)
    +
    +        }
    +        a.vml.image.shape.fillcolor = 'none';
    +        a.vml.image.fill.type = 'tile';
    +        a.vml.color.fill.on = false;
    +        b.attachHandlers(a);
    +        b.giveLayout(a);
    +        b.giveLayout(a.offsetParent);
    +        b.applyVML(a)
    +
    +    }
    +
    +};
    +try {
    +    document.execCommand("BackgroundImageCache", false, true)
    +
    +} catch(r) {}
    +EvPNG.createVmlNameSpace();
    +EvPNG.createVmlStyleSheet();
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/login/js/iphone.check.js b/src/main/webapp/plug-in/login/js/iphone.check.js
    new file mode 100644
    index 00000000..03e646d7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/login/js/iphone.check.js
    @@ -0,0 +1,290 @@
    +(function() {
    +	var iOSCheckbox;
    +	var __slice = Array.prototype.slice;
    +	iOSCheckbox = (function() {
    +		function iOSCheckbox(elem, options) {
    +			var key, opts, value;
    +			this.elem = $(elem);
    +			opts = $.extend({}, iOSCheckbox.defaults, options);
    +			for (key in opts) {
    +				value = opts[key];
    +				this[key] = value;
    +			}
    +			this.elem.data(this.dataName, this);
    +			this.wrapCheckboxWithDivs();
    +			this.attachEvents();
    +			this.disableTextSelection();
    +			if (this.resizeHandle) {
    +				this.optionallyResize('handle');
    +			}
    +			if (this.resizeContainer) {
    +				this.optionallyResize('container');
    +			}
    +			this.initialPosition();
    +		}
    +		iOSCheckbox.prototype.isDisabled = function() {
    +			return this.elem.is(':disabled');
    +		};
    +		iOSCheckbox.prototype.wrapCheckboxWithDivs = function() {
    +			this.elem.wrap("<div class='" + this.containerClass + "' />");
    +			this.container = this.elem.parent();
    +			this.offLabel = $("<label class='" + this.labelOffClass + "' style='width:" + this.labelWidth + "'>\n  <span>" + this.uncheckedLabel + "</span>\n</label>").appendTo(this.container);
    +			this.offSpan = this.offLabel.children('span');
    +			this.onLabel = $("<label class='" + this.labelOnClass + "'  style='width:" + this.labelWidth + "'>\n  <span>" + this.checkedLabel + "</span>\n</label>").appendTo(this.container);
    +			this.onSpan = this.onLabel.children('span');
    +			return this.handle = $("<div class='" + this.handleClass + "'>\n  <div class='" + this.handleRightClass + "'>\n    <div class='" + this.handleCenterClass + "' />\n  </div>\n</div>").appendTo(this.container);
    +		};
    +		iOSCheckbox.prototype.disableTextSelection = function() {
    +			if ($.browser.msie) {
    +				return $([ this.handle, this.offLabel, this.onLabel, this.container
    +				]).attr("unselectable", "on");
    +			}
    +		};
    +		iOSCheckbox.prototype._getDimension = function(elem, dimension) {
    +			if ($.fn.actual != null) {
    +				return elem.actual(dimension);
    +			} else {
    +				return elem[dimension]();
    +			}
    +		};
    +		iOSCheckbox.prototype.optionallyResize = function(mode) {
    +			var newWidth, offLabelWidth, onLabelWidth;
    +			onLabelWidth = this._getDimension(this.onLabel, "width");
    +			offLabelWidth = this._getDimension(this.offLabel, "width");
    +			if (mode === "container") {
    +				newWidth = onLabelWidth > offLabelWidth ? onLabelWidth : offLabelWidth;
    +				newWidth += this._getDimension(this.handle, "width") + this.handleMargin;
    +				return this.container.css({
    +					width : newWidth
    +				});
    +			} else {
    +				newWidth = onLabelWidth > offLabelWidth ? onLabelWidth : offLabelWidth;
    +				return this.handle.css({
    +					width : newWidth
    +				});
    +			}
    +		};
    +		iOSCheckbox.prototype.onMouseDown = function(event) {
    +			var x;
    +			event.preventDefault();
    +			if (this.isDisabled()) {
    +				return;
    +			}
    +			x = event.pageX || event.originalEvent.changedTouches[0].pageX;
    +			iOSCheckbox.currentlyClicking = this.handle;
    +			iOSCheckbox.dragStartPosition = x;
    +			return iOSCheckbox.handleLeftOffset = parseInt(this.handle.css('left'), 10) || 0;
    +		};
    +		iOSCheckbox.prototype.onDragMove = function(event, x) {
    +			var newWidth, p;
    +			if (iOSCheckbox.currentlyClicking !== this.handle) {
    +				return;
    +			}
    +			p = (x + iOSCheckbox.handleLeftOffset - iOSCheckbox.dragStartPosition) / this.rightSide;
    +			if (p < 0) {
    +				p = 0;
    +			}
    +			if (p > 1) {
    +				p = 1;
    +			}
    +			newWidth = p * this.rightSide;
    +			this.handle.css({
    +				left : newWidth
    +			});
    +			this.onLabel.css({
    +				width : newWidth + this.handleRadius
    +			});
    +			this.offSpan.css({
    +				marginRight : -newWidth
    +			});
    +			return this.onSpan.css({
    +				marginLeft : -(1 - p) * this.rightSide
    +			});
    +		};
    +		iOSCheckbox.prototype.onDragEnd = function(event, x) {
    +			var p;
    +			if (iOSCheckbox.currentlyClicking !== this.handle) {
    +				return;
    +			}
    +			if (this.isDisabled()) {
    +				return;
    +			}
    +			if (iOSCheckbox.dragging) {
    +				p = (x - iOSCheckbox.dragStartPosition) / this.rightSide;
    +				this.elem.prop('checked', p >= 0.5);
    +			} else {
    +				this.elem.prop('checked', !this.elem.prop('checked'));
    +			}
    +			iOSCheckbox.currentlyClicking = null;
    +			iOSCheckbox.dragging = null;
    +			return this.didChange();
    +		};
    +		iOSCheckbox.prototype.refresh = function() {
    +			return this.didChange();
    +		};
    +		iOSCheckbox.prototype.didChange = function() {
    +			var new_left;
    +			if (typeof this.onChange === "function") {
    +				this.onChange(this.elem, this.elem.prop('checked'));
    +			}
    +			if (this.isDisabled()) {
    +				this.container.addClass(this.disabledClass);
    +				return false;
    +			} else {
    +				this.container.removeClass(this.disabledClass);
    +			}
    +			new_left = this.elem.prop('checked') ? this.rightSide : 0;
    +			this.handle.animate({
    +				left : new_left
    +			}, this.duration);
    +			this.onLabel.animate({
    +				width : new_left + this.handleRadius
    +			}, this.duration);
    +			this.offSpan.animate({
    +				marginRight : -new_left
    +			}, this.duration);
    +			return this.onSpan.animate({
    +				marginLeft : new_left - this.rightSide
    +			}, this.duration);
    +		};
    +		iOSCheckbox.prototype.attachEvents = function() {
    +			var localMouseMove, localMouseUp, self;
    +			self = this;
    +			localMouseMove = function(event) {
    +				return self.onGlobalMove.apply(self, arguments);
    +			};
    +			localMouseUp = function(event) {
    +				self.onGlobalUp.apply(self, arguments);
    +				$(document).unbind('mousemove touchmove', localMouseMove);
    +				return $(document).unbind('mouseup touchend', localMouseUp);
    +			};
    +			return this.container.bind('mousedown touchstart', function(event) {
    +				self.onMouseDown.apply(self, arguments);
    +				$(document).bind('mousemove touchmove', localMouseMove);
    +				return $(document).bind('mouseup touchend', localMouseUp);
    +			});
    +		};
    +		iOSCheckbox.prototype.initialPosition = function() {
    +			var containerWidth, offset;
    +			containerWidth = this._getDimension(this.container, "width");
    +			this.offLabel.css({
    +				width : containerWidth - this.containerRadius
    +			});
    +			offset = this.containerRadius + 1;
    +			if ($.browser.msie && $.browser.version < 7) {
    +				offset -= 3;
    +			}
    +			this.rightSide = containerWidth - this._getDimension(this.handle, "width") - offset;
    +			if (this.elem.is(':checked')) {
    +				this.handle.css({
    +					left : this.rightSide
    +				});
    +				this.onLabel.css({
    +					width : this.rightSide + this.handleRadius
    +				});
    +				this.offSpan.css({
    +					marginRight : -this.rightSide
    +				});
    +			} else {
    +				this.onLabel.css({
    +					width : 0
    +				});
    +				this.onSpan.css({
    +					marginLeft : -this.rightSide
    +				});
    +			}
    +			if (this.isDisabled()) {
    +				return this.container.addClass(this.disabledClass);
    +			}
    +		};
    +		iOSCheckbox.prototype.onGlobalMove = function(event) {
    +			var x;
    +			if (!(!this.isDisabled() && iOSCheckbox.currentlyClicking)) {
    +				return;
    +			}
    +			event.preventDefault();
    +			x = event.pageX || event.originalEvent.changedTouches[0].pageX;
    +			if (!iOSCheckbox.dragging && (Math.abs(iOSCheckbox.dragStartPosition - x) > this.dragThreshold)) {
    +				iOSCheckbox.dragging = true;
    +			}
    +			return this.onDragMove(event, x);
    +		};
    +		iOSCheckbox.prototype.onGlobalUp = function(event) {
    +			var x;
    +			if (!iOSCheckbox.currentlyClicking) {
    +				return;
    +			}
    +			event.preventDefault();
    +			x = event.pageX || event.originalEvent.changedTouches[0].pageX;
    +			this.onDragEnd(event, x);
    +			return false;
    +		};
    +		iOSCheckbox.defaults = {
    +		 duration : 150,
    +		 checkedLabel : yes,
    +		 uncheckedLabel : no,
    +		 resizeHandle : true,
    +		 resizeContainer : true,
    +		 disabledClass : 'iPhoneCheckDisabled',
    +		 containerClass : 'iPhoneCheckContainer',
    +		 labelOnClass : 'iPhoneCheckLabelOn',
    +		 labelOffClass : 'iPhoneCheckLabelOff',
    +		 handleClass : 'iPhoneCheckHandle',
    +		 handleCenterClass : 'iPhoneCheckHandleCenter',
    +		 handleRightClass : 'iPhoneCheckHandleRight',
    +		 dragThreshold : 5,
    +		 handleMargin : 15,
    +		 handleRadius : 4,
    +		 containerRadius : 5,
    +		 dataName : "iphoneStyle",
    +		 labelWidth : '30px',
    +		 onChange : function() {
    +			 if (this.elem.is(':checked')) {
    +				 $('#on_off').val("1");
    +			 }else{
    +				 $('#on_off').val("0");
    +			 }
    +		 }
    +		
    +		};
    +		return iOSCheckbox;
    +	})();
    +	$.iphoneStyle = this.iOSCheckbox = iOSCheckbox;
    +	$.fn.iphoneStyle = function() {
    +		var args, checkbox, dataName, existingControl, method, params, _i, _len, _ref, _ref2, _ref3, _ref4;
    +		args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
    +		dataName = (_ref = (_ref2 = args[0]) != null ? _ref2.dataName : void 0) != null ? _ref : iOSCheckbox.defaults.dataName;
    +		_ref3 = this.filter(':checkbox');
    +		for (_i = 0, _len = _ref3.length; _i < _len; _i++) {
    +			checkbox = _ref3[_i];
    +			existingControl = $(checkbox).data(dataName);
    +			if (existingControl != null) {
    +				method = args[0], params = 2 <= args.length ? __slice.call(args, 1) : [];
    +				if ((_ref4 = existingControl[method]) != null) {
    +					_ref4.apply(existingControl, params);
    +				}
    +			} else {
    +				new iOSCheckbox(checkbox, args[0]);
    +			}
    +		}
    +		return this;
    +	};
    +	$.fn.iOSCheckbox = function(options) {
    +		var opts;
    +		if (options == null) {
    +			options = {};
    +		}
    +		opts = $.extend({}, options, {
    +		 resizeHandle : false,
    +		 disabledClass : 'iOSCheckDisabled',
    +		 containerClass : 'iOSCheckContainer',
    +		 labelOnClass : 'iOSCheckLabelOn',
    +		 labelOffClass : 'iOSCheckLabelOff',
    +		 handleClass : 'iOSCheckHandle',
    +		 handleCenterClass : 'iOSCheckHandleCenter',
    +		 handleRightClass : 'iOSCheckHandleRight',
    +		 dataName : 'iOSCheckbox'
    +		});
    +		return this.iphoneStyle(opts);
    +	};
    +}).call(this);
    diff --git a/src/main/webapp/plug-in/login/js/jquery-jrumble.js b/src/main/webapp/plug-in/login/js/jquery-jrumble.js
    new file mode 100644
    index 00000000..71de6ffb
    --- /dev/null
    +++ b/src/main/webapp/plug-in/login/js/jquery-jrumble.js
    @@ -0,0 +1,2 @@
    +/* jRumble v1.3 - http://jackrugile.com/jrumble - MIT License */
    +(function(f){f.fn.jrumble=function(g){var a=f.extend({x:2,y:2,rotation:1,speed:15,opacity:false,opacityMin:0.5},g);return this.each(function(){var b=f(this),h=a.x*2,i=a.y*2,k=a.rotation*2,g=a.speed===0?1:a.speed,m=a.opacity,n=a.opacityMin,l,j,o=function(){var e=Math.floor(Math.random()*(h+1))-h/2,a=Math.floor(Math.random()*(i+1))-i/2,c=Math.floor(Math.random()*(k+1))-k/2,d=m?Math.random()+n:1,e=e===0&&h!==0?Math.random()<0.5?1:-1:e,a=a===0&&i!==0?Math.random()<0.5?1:-1:a;b.css("display")==="inline"&&(l=true,b.css("display","inline-block"));b.css({position:"relative",left:e+"px",top:a+"px","-ms-filter":"progid:DXImageTransform.Microsoft.Alpha(Opacity="+d*100+")",filter:"alpha(opacity="+d*100+")","-moz-opacity":d,"-khtml-opacity":d,opacity:d,"-webkit-transform":"rotate("+c+"deg)","-moz-transform":"rotate("+c+"deg)","-ms-transform":"rotate("+c+"deg)","-o-transform":"rotate("+c+"deg)",transform:"rotate("+c+"deg)"})},p={left:0,top:0,"-ms-filter":"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)",filter:"alpha(opacity=100)","-moz-opacity":1,"-khtml-opacity":1,opacity:1,"-webkit-transform":"rotate(0deg)","-moz-transform":"rotate(0deg)","-ms-transform":"rotate(0deg)","-o-transform":"rotate(0deg)",transform:"rotate(0deg)"};b.bind({startRumble:function(a){a.stopPropagation();clearInterval(j);j=setInterval(o,g)},stopRumble:function(a){a.stopPropagation();clearInterval(j);l&&b.css("display","inline");b.css(p)}})})}})(jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/login/js/jquery.tipsy.js b/src/main/webapp/plug-in/login/js/jquery.tipsy.js
    new file mode 100644
    index 00000000..92e10cae
    --- /dev/null
    +++ b/src/main/webapp/plug-in/login/js/jquery.tipsy.js
    @@ -0,0 +1,246 @@
    +// tipsy, facebook style tooltips for jquery
    +// version 1.0.0a
    +// (c) 2008-2010 jason frame [jason@onehackoranother.com]
    +// released under the MIT license
    +
    +(function($) {
    +    
    +    function maybeCall(thing, ctx) {
    +        return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
    +    };
    +    
    +    function Tipsy(element, options) {
    +        this.$element = $(element);
    +        this.options = options;
    +        this.enabled = true;
    +        this.fixTitle();
    +    };
    +    
    +    Tipsy.prototype = {
    +        show: function() {
    +            var title = this.getTitle();
    +            if (title && this.enabled) {
    +                var $tip = this.tip();
    +                
    +                $tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);
    +                $tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity
    +                $tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).prependTo(document.body);
    +                
    +                var pos = $.extend({}, this.$element.offset(), {
    +                    width: this.$element[0].offsetWidth,
    +                    height: this.$element[0].offsetHeight
    +                });
    +                
    +                var actualWidth = $tip[0].offsetWidth,
    +                    actualHeight = $tip[0].offsetHeight,
    +                    gravity = maybeCall(this.options.gravity, this.$element[0]);
    +                
    +                var tp;
    +                switch (gravity.charAt(0)) {
    +                    case 'n':
    +                        tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
    +                        break;
    +                    case 's':
    +                        tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
    +                        break;
    +                    case 'e':
    +                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
    +                        break;
    +                    case 'w':
    +                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
    +                        break;
    +                }
    +                
    +                if (gravity.length == 2) {
    +                    if (gravity.charAt(1) == 'w') {
    +                        tp.left = pos.left + pos.width / 2 - 15;
    +                    } else {
    +                        tp.left = pos.left + pos.width / 2 - actualWidth + 15;
    +                    }
    +                }
    +                
    +                $tip.css(tp).addClass('tipsy-' + gravity);
    +                $tip.find('.tipsy-arrow')[0].className = 'tipsy-arrow tipsy-arrow-' + gravity.charAt(0);
    +                if (this.options.className) {
    +                    $tip.addClass(maybeCall(this.options.className, this.$element[0]));
    +                }
    +                
    +                if (this.options.fade) {
    +                    $tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity});
    +                } else {
    +                    $tip.css({visibility: 'visible', opacity: this.options.opacity});
    +                }
    +            }
    +        },
    +        
    +        hide: function() {
    +            if (this.options.fade) {
    +                this.tip().stop().fadeOut(function() { $(this).remove(); });
    +            } else {
    +                this.tip().remove();
    +            }
    +        },
    +        
    +        fixTitle: function() {
    +            var $e = this.$element;
    +            if ($e.attr('title') || typeof($e.attr('original-title')) != 'string') {
    +                $e.attr('original-title', $e.attr('title') || '').removeAttr('title');
    +            }
    +        },
    +        
    +        getTitle: function() {
    +            var title, $e = this.$element, o = this.options;
    +            this.fixTitle();
    +            var title, o = this.options;
    +            if (typeof o.title == 'string') {
    +                title = $e.attr(o.title == 'title' ? 'original-title' : o.title);
    +            } else if (typeof o.title == 'function') {
    +                title = o.title.call($e[0]);
    +            }
    +            title = ('' + title).replace(/(^\s*|\s*$)/, "");
    +            return title || o.fallback;
    +        },
    +        
    +        tip: function() {
    +            if (!this.$tip) {
    +                this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>');
    +            }
    +            return this.$tip;
    +        },
    +        
    +        validate: function() {
    +            if (!this.$element[0].parentNode) {
    +                this.hide();
    +                this.$element = null;
    +                this.options = null;
    +            }
    +        },
    +        
    +        enable: function() { this.enabled = true; },
    +        disable: function() { this.enabled = false; },
    +        toggleEnabled: function() { this.enabled = !this.enabled; }
    +    };
    +    
    +    $.fn.tipsy = function(options) {
    +        
    +        if (options === true) {
    +            return this.data('tipsy');
    +        } else if (typeof options == 'string') {
    +            var tipsy = this.data('tipsy');
    +            if (tipsy) tipsy[options]();
    +            return this;
    +        }
    +        
    +        options = $.extend({}, $.fn.tipsy.defaults, options);
    +        
    +        function get(ele) {
    +            var tipsy = $.data(ele, 'tipsy');
    +            if (!tipsy) {
    +                tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
    +                $.data(ele, 'tipsy', tipsy);
    +            }
    +            return tipsy;
    +        }
    +        
    +        function enter() {
    +            var tipsy = get(this);
    +            tipsy.hoverState = 'in';
    +            if (options.delayIn == 0) {
    +                tipsy.show();
    +            } else {
    +                tipsy.fixTitle();
    +                setTimeout(function() { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);
    +            }
    +        };
    +        
    +        function leave() {
    +            var tipsy = get(this);
    +            tipsy.hoverState = 'out';
    +            if (options.delayOut == 0) {
    +                tipsy.hide();
    +            } else {
    +                setTimeout(function() { if (tipsy.hoverState == 'out') tipsy.hide(); }, options.delayOut);
    +            }
    +        };
    +        
    +        if (!options.live) this.each(function() { get(this); });
    +        
    +        if (options.trigger != 'manual') {
    +            var binder   = options.live ? 'live' : 'bind',
    +                eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus',
    +                eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';
    +            this[binder](eventIn, enter)[binder](eventOut, leave);
    +        }
    +        
    +        return this;
    +        
    +    };
    +    
    +    $.fn.tipsy.defaults = {
    +        className: null,
    +        delayIn: 0,
    +        delayOut: 0,
    +        fade: false,
    +        fallback: '',
    +        gravity: 'n',
    +        html: false,
    +        live: false,
    +        offset: 0,
    +        opacity: 1,
    +        title: 'title',
    +        trigger: 'hover'
    +    };
    +    
    +    // Overwrite this method to provide options on a per-element basis.
    +    // For example, you could store the gravity in a 'tipsy-gravity' attribute:
    +    // return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });
    +    // (remember - do not modify 'options' in place!)
    +    $.fn.tipsy.elementOptions = function(ele, options) {
    +        return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
    +    };
    +    
    +    $.fn.tipsy.autoNS = function() {
    +        return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
    +    };
    +    
    +    $.fn.tipsy.autoWE = function() {
    +        return $(this).offset().left > ($(document).scrollLeft() + $(window).width()/ 2 ) ? 'e' : 'w';
    +    };
    +    
    +    /**
    +     * yields a closure of the supplied parameters, producing a function that takes
    +     * no arguments and is suitable for use as an autogravity function like so:
    +     *
    +     * @param margin (int) - distance from the viewable region edge that an
    +     *        element should be before setting its tooltip's gravity to be away
    +     *        from that edge.
    +     * @param prefer (string, e.g. 'n', 'sw', 'w') - the direction to prefer
    +     *        if there are no viewable region edges effecting the tooltip's
    +     *        gravity. It will try to vary from this minimally, for example,
    +     *        if 'sw' is preferred and an element is near the right viewable 
    +     *        region edge, but not the top edge, it will set the gravity for
    +     *        that element's tooltip to be 'se', preserving the southern
    +     *        component.
    +     */
    +     $.fn.tipsy.autoBounds = function(margin, prefer) {
    +		return function() {
    +			var dir = {ns: prefer[0], ew: (prefer.length > 1 ? prefer[1] : false)},
    +			    boundTop = $(document).scrollTop() + margin,
    +			    boundLeft = $(document).scrollLeft() + margin,
    +			    $this = $(this);
    +
    +			if ($this.offset().top < boundTop) dir.ns = 'n';
    +			if ($this.offset().left < boundLeft) dir.ew = 'w';
    +			if ($(window).width() + $(document).scrollLeft() - $this.offset().left < margin) dir.ew = 'e';
    +			if ($(window).height() + $(document).scrollTop() - $this.offset().top < margin) dir.ns = 's';
    +
    +			return dir.ns + (dir.ew ? dir.ew : '');
    +		}
    +	};
    +	
    +     $.fn.tipsy.autoHide = function() {
    +        return $(this).tip().stop().fadeOut(function() { $(this).remove(); });
    +    };
    +
    +    
    +})(jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/login/js/login.js b/src/main/webapp/plug-in/login/js/login.js
    new file mode 100644
    index 00000000..044bbcba
    --- /dev/null
    +++ b/src/main/webapp/plug-in/login/js/login.js
    @@ -0,0 +1,305 @@
    +$(document).ready(function() {
    +	
    +	$("#userName").attr("nullmsg",pleaseinutusername);
    +	$("#userName").attr("title",username);
    +	
    +	$("#password").attr("nullmsg",pleaseinutpassword);
    +	$("#password").attr("title",password);
    +	
    +	$("#randCode").attr("nullmsg",pleaseinputvalidatecode);
    +	$("#randCode").attr("title",validatecode);
    +	
    +	getCookie();
    +	onfocus();
    +	
    +	$(".on_off_checkbox").iphoneStyle();
    +	$('.tip a ').tipsy({
    +		gravity : 'sw'
    +	});
    +	$('#login').show().animate({
    +		opacity : 1
    +	}, 2000);
    +	$('.logo').show().animate({
    +		opacity : 1,
    +		top : '32%'
    +	}, 800, function() {
    +		$('.logo').show().delay(1200).animate({
    +			opacity : 1,
    +			top : '1%'
    +		}, 300, function() {
    +			$('.formLogin').animate({
    +				opacity : 1,
    +				left : '0'
    +			}, 300);
    +			$('.userbox').animate({
    +				opacity : 0
    +			}, 200).hide();
    +		});
    +	});
    +});
    +$('.userload').click(function(e) {
    +	$('.formLogin').animate({
    +		opacity : 1,
    +		left : '0'
    +	}, 300);
    +	$('.userbox').animate({
    +		opacity : 0
    +	}, 200, function() {
    +		$('.userbox').hide();
    +	});
    +});
    +$('#randCodeImage').click(function(){
    +    reloadRandCodeImage();
    +});
    +/**
    + * 鍒锋柊楠岃瘉鐮
    + */
    +function reloadRandCodeImage() {
    +    var date = new Date();
    +    var img = document.getElementById("randCodeImage");
    +    img.src='randCodeImage?a=' + date.getTime();
    +}
    +// 閲嶇疆
    +$('#forgetpass').click(function(e) {
    +	$(":input").each(function() {
    +	$('#'+this.name).val("");
    +	});
    +});
    +// 鐐瑰嚮鐧诲綍
    +$('#but_login').click(function(e) {
    +	submit();
    +});
    +//鍥炶溅鐧诲綍
    +$(document).keydown(function(e){
    +	if(e.keyCode == 13) {
    +		submit();
    +	}
    +});
    +//琛ㄥ崟鎻愪氦
    +function submit()
    +{
    +	var submit = true;
    +	$("input[nullmsg]").each(function() {
    +		if ($("#" + this.name).val() == "") {
    +			showError($("#" + this.name).attr("nullmsg"), 500);
    +			jrumble();
    +			setTimeout('hideTop()', 1000);
    +			submit = false;
    +			return false;
    +		}
    +	});
    +	if (submit) {
    +		hideTop();
    +		loading(checking, 1);
    +		setTimeout("unloading()", 1000);
    +		setTimeout("Login()", 1000);
    +	}
    +
    +}
    +function zhanggm(orgId) {
    +
    +    alert("zhanggm test in login.js: orgId= " +orgId);
    +}
    +//鐧诲綍澶勭悊鍑芥暟
    +function Login(orgId) {
    +	setCookie();
    +	var actionurl=$('form').attr('action');//鎻愪氦璺緞
    +	var checkurl=$('form').attr('check');//楠岃瘉璺緞
    +	 var formData = new Object();
    +	var data=$(":input").each(function() {
    +		 formData[this.name] =$("#"+this.name ).val();
    +	});
    +    formData['orgId'] = orgId ? orgId : "";
    +	formData['langCode']=$("#langCode").val();
    +	formData['langCode'] = $("#langCode option:selected").val();
    +	$.ajax({
    +		async : false,
    +		cache : false,
    +		type : 'POST',
    +		url : checkurl,// 璇锋眰鐨刟ction璺緞
    +		data : formData,
    +		error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +		},
    +		success : function(data) {
    +			var d = $.parseJSON(data);
    +			if (d.success) {
    +				loginsuccess();
    +                // todo zhanggm 娌℃湁澶勭悊澶氳瑷锛屾殏鏃惰繖鏍峰垽鏂笅鍚
    +                var title, okButton;
    +                if($("#langCode").val() == 'en') {
    +                    title = "Please select Org";
    +                    okButton = "Ok";
    +                } else {
    +                    title = "璇烽夋嫨缁勭粐鏈烘瀯";
    +                    okButton = "纭畾";
    +                }
    +                if (d.attributes.orgNum > 1) {
    +                    $.dialog({
    +                        id: 'LHG1976D',
    +                        title: title,
    +                        max: false,
    +                        min: false,
    +                        drag: false,
    +                        resize: false,
    +                        content: 'url:userController.do?userOrgSelect&userId=' + d.attributes.user.id,
    +                        lock:true,
    +                        button : [ {
    +                            name : okButton,
    +                            focus : true,
    +                            callback : function() {
    +                                iframe = this.iframe.contentWindow;
    +                                var orgId = $('#orgId', iframe.document).val();
    +                                Login(orgId);
    +                                this.close();
    +                                return false;
    +                            }
    +                        }],
    +                        close: function(){
    +                            window.location.href = actionurl;
    +                        }
    +                    });
    +                } else {
    +                    setTimeout("window.location.href='"+actionurl+"'", 1000);
    +                }
    +			} else {
    +				if(d.msg == "a"){
    +					$.dialog.confirm("鏁版嵁搴撴棤鏁版嵁,鏄惁鍒濆鍖栨暟鎹?", function(){
    +						window.location = "init.jsp";
    +					}, function(){
    +						//
    +					});
    +				} else
    +					showError(d.msg);
    +			}
    +		}
    +	});
    +}
    +//璁剧疆cookie
    +function setCookie()
    +{
    +	if ($('#on_off').val() == '1') {
    +		$("input[iscookie='true']").each(function() {
    +			$.cookie(this.name, $("#"+this.name).val(), "/",24);
    +			$.cookie("COOKIE_NAME","true", "/",24);
    +		});
    +	} else {
    +		$("input[iscookie='true']").each(function() {
    +			$.cookie(this.name,null);
    +			$.cookie("COOKIE_NAME",null);
    +		});
    +	}
    +}
    +//璇诲彇cookie
    +function getCookie()
    +{
    +	var COOKIE_NAME=$.cookie("COOKIE_NAME");
    +	if (COOKIE_NAME !=null) {
    +		$("input[iscookie='true']").each(function() {
    +			$($("#"+this.name).val( $.cookie(this.name)));
    +            if("admin" == $.cookie(this.name)) {
    +                $("#randCode").focus();
    +            } else {
    +                $("#password").val("");
    +                $("#password").focus();
    +            }
    +        });
    +		$("#on_off").attr("checked", true);
    +		$("#on_off").val("1");
    +	} 
    +	else
    +	{
    +		$("#on_off").attr("checked", false);
    +		$("#on_off").val("0");
    +        $("#randCode").focus();
    +	}
    +}
    +//鐐瑰嚮娑堟伅鍏抽棴鎻愮ず
    +$('#alertMessage').click(function() {
    +	hideTop();
    +});
    +//鏄剧ず閿欒鎻愮ず
    +function showError(str) {
    +	$('#alertMessage').addClass('error').html(str).stop(true, true).show().animate({
    +		opacity : 1,
    +		right : '0'
    +	}, 500);
    +
    +}
    +//楠岃瘉閫氳繃鍔犺浇鍔ㄧ敾
    +function loginsuccess()
    +{
    +	$("#login").animate({
    +		opacity : 1,
    +		top : '49%'
    +	}, 200, function() {
    +		$('.userbox').show().animate({
    +			opacity : 1
    +		}, 500);
    +		$("#login").animate({
    +			opacity : 0,
    +			top : '60%'
    +		}, 500, function() {
    +			$(this).fadeOut(200, function() {
    +				$(".text_success").slideDown();
    +				$("#successLogin").animate({
    +					opacity : 1,
    +					height : "200px"
    +				}, 1000);
    +			});
    +		});
    +	});
    +}
    +function showSuccess(str) {
    +	$('#alertMessage').removeClass('error').html(str).stop(true, true).show().animate({
    +		opacity : 1,
    +		right : '0'
    +	}, 500);
    +}
    +
    +function onfocus() {
    +	if ($(window).width() > 480) {
    +		$('.tip input').tipsy({
    +			trigger : 'focus',
    +			gravity : 'w',
    +			live : true
    +		});
    +	} else {
    +		$('.tip input').tipsy("hide");
    +	}
    +}
    +
    +function hideTop() {
    +	$('#alertMessage').animate({
    +		opacity : 0,
    +		right : '-20'
    +	}, 500, function() {
    +		$(this).hide();
    +	});
    +}
    +//鍔犺浇淇℃伅
    +function loading(name, overlay) {
    +	$('body').append('<div id="overlay"></div><div id="preloader">' + name + '..</div>');
    +	if (overlay == 1) {
    +		$('#overlay').css('opacity', 0.1).fadeIn(function() {
    +			$('#preloader').fadeIn();
    +		});
    +		return false;
    +	}
    +	$('#preloader').fadeIn();
    +}
    +
    +function unloading() {
    +	$('#preloader').fadeOut('fast', function() {
    +		$('#overlay').fadeOut();
    +	});
    +}
    +// 琛ㄥ崟鏅冨姩
    +function jrumble() {
    +	$('.inner').jrumble({
    +		x : 4,
    +		y : 0,
    +		rotation : 0
    +	});
    +	$('.inner').trigger('startRumble');
    +	setTimeout('$(".inner").trigger("stopRumble")', 500);
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/mutiLang/en.js b/src/main/webapp/plug-in/mutiLang/en.js
    new file mode 100644
    index 00000000..71ee8715
    --- /dev/null
    +++ b/src/main/webapp/plug-in/mutiLang/en.js
    @@ -0,0 +1,75 @@
    +var loading = "Page Loading...";
    +var load = "load...";
    +var checking = "checking...";
    +var pleaseinutusername = "Please input user name!";
    +var pleaseinutpassword = "Please input password!";
    +var yes = "Yes";
    +var no = "No";
    +var selectedlanguage = "Please select a language";
    +var username = "User Name";
    +var password = "Password";
    +var foot = "(Recommend IE+, Google browser) Support: Bob 13912756186";	
    +var confirmdeletethis = "Do you want to delete this ?";
    +var confirmdelete = "Confirm";
    +var confirmdeletema = "Do you want to delete?";	
    +var confirmmsg = "Confirm Information";
    +var closemsg = "Close";
    +var pleaseselecteditrow = "Please select edit line";
    +var pleaaseselectonerowtoedit = "Please select one record to edit";	
    +var pleaaseselectonerowtoview = "Please select one record to view";
    +var pleaseselectviewrow = "Please select view line";
    +var doyouconfirmdeletedataforever	= "Do you want to delete this line?";	
    +var pleasesleectdeletedata = "Please select want to delete data.";
    +var beginupload = "Begin Upload";
    +var cancelupload = "Cancel Upload";	
    +var query = "Query";
    +var cancel = "Cancel";
    +var operatecuccess = "Operate Success";
    +var select = "Select";
    +var pleaseselect = "Please Select";
    +var pleaseinputvalidatecode = "Please intput verification code!";
    +var validatecode = "Verfication Code";
    +var isinitializedata = "Is initialize data";	
    +var recommendbrowser = "(Recommended ie8+, Google chrome can get faster, more secure page response speed ) Technical Support";	
    +var platform = "JEECG Platform";
    +var fieldname = "Field Name";
    +var fieldremark = "Field Remark";
    +var fieldhref = "Field Href";
    +var	validaterule = "Validate Rule";
    +var	dicttable = "Dict Table";
    +var dictcode = "Dict Code";
    +var dicttext = "Dict Text";	
    +
    +var sequence = "S";
    +var operation = "O";
    +var fieldlength = "Field Length";
    +var decimal = "Decimal";
    +var defaultvalue = "Default Value";
    +var fieldtype = "Field Type";
    +var pk = "PK";
    +var allowempty = "Allow Empty";
    +
    +
    +var mastertablename = "Master Table Name";
    +var mastertablefield = "Master Table Field";
    +
    +var formdisplay = "Form Display";
    +var griddisplay = "Grid Display";
    +var controltype = "Control Type";
    +var controllength = "Control Length";
    +var isquery = "Is Query";
    +var querytype = "Query Type";
    +
    +var pleaseinputfilename = "Please enter field name!";
    +var filenamecannotuppercase = "Field name between 1 to 30 bit and can't be upppercase.";
    +var pleaseinputfilecomment = "Please input filed comments!";
    +var fieldcommentfromtwotofourteen = "Field comments should be 2 to 14 bit";
    +var pleaseinputfilelength = "Please input filed length!";
    +var fieldlengthfromonetofour = "Field length shoud be 1 to 4 bit";
    +var pleaseinputdicemallength = "Please enter the length of the decimal point!";
    +var dicemallengthfromonetotwo = "Decimal is 1 to 2 bits in length";
    +var defaultvaluelessthantwenty = "The default value of up to 20!";
    +var pleaseinputfieldsquence = "Please enter a field order";
    +var fieldsquencefromonetotwo = "Field order of 1 to 2 bit";
    +
    +var sqlParse = "SQLParse";
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/mutiLang/zh-cn.js b/src/main/webapp/plug-in/mutiLang/zh-cn.js
    new file mode 100644
    index 00000000..e3a6186e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/mutiLang/zh-cn.js
    @@ -0,0 +1,74 @@
    +var loading = "椤甸潰鍔犺浇涓......";
    +var load = "鍔犺浇涓...";
    +var checking = "鏍稿疄涓..";
    +var pleaseinutusername = "璇疯緭鍏ョ敤鎴峰悕!";
    +var pleaseinutpassword = "璇疯緭鍏ュ瘑鐮!";
    +var yes = "鏄";
    +var no = "鍚";
    +var selectedlanguage = "璇烽夋嫨璇█";
    +var username = "鐢ㄦ埛鍚";
    +var password = "瀵嗙爜";
    +var foot = "(鎺ㄨ崘浣跨敤IE8+,璋锋瓕娴忚鍣ㄥ彲浠ヨ幏寰楁洿蹇,鏇村畨鍏ㄧ殑椤甸潰鍝嶅簲閫熷害) 鎶鏈敮鎸侊細瀛欐尝 13912756186";
    +var confirmdeletethis = "纭畾鍒犻櫎璇ヨ褰曞悧 ?";
    +var confirmdelete = "鍒犻櫎纭";
    +var confirmdeletema = "纭畾鍒犻櫎鍚";	
    +var confirmmsg = "鎻愮ず淇℃伅";
    +var closemsg = "鍏抽棴";
    +var pleaseselecteditrow = "璇烽夋嫨缂栬緫椤圭洰";
    +var pleaaseselectonerowtoedit = "璇烽夋嫨涓鏉¤褰曞啀缂栬緫";
    +var pleaaseselectonerowtoview = "璇烽夋嫨涓鏉¤褰曞啀鏌ョ湅";
    +var pleaseselectviewrow = "璇烽夋嫨鏌ョ湅椤圭洰";
    +var doyouconfirmdeletedataforever	= "浣犵‘瀹氭案涔呭垹闄よ鏁版嵁鍚?";	
    +var pleasesleectdeletedata = "璇烽夋嫨闇瑕佸垹闄ょ殑鏁版嵁";
    +var beginupload = "寮濮嬩笂浼"	;
    +var cancelupload = "鍙栨秷涓婁紶";	
    +var query = "鏌ヨ";
    +var cancel = "鍙栨秷";	
    +var operatecuccess = "鎿嶄綔鎴愬姛";	
    +var select = "閫夋嫨";
    +var pleaseselect = "璇烽夋嫨";
    +var pleaseinputvalidatecode = "璇疯緭鍏ラ獙璇佺爜!";
    +var validatecode = "楠岃瘉鐮";
    +var recommendbrowser = "(鎺ㄨ崘浣跨敤IE8+,璋锋瓕娴忚鍣ㄥ彲浠ヨ幏寰楁洿蹇,鏇村畨鍏ㄧ殑椤甸潰鍝嶅簲閫熷害)鎶鏈敮鎸";	
    +var platform = "JEECG 寰簯蹇熷紑鍙戝钩鍙";
    +var fieldname = "瀛楁鍚嶇О";
    +var fieldremark = "瀛楁澶囨敞";
    +var fieldhref = "瀛楁Href";
    +var	validaterule = "楠岃瘉瑙勫垯";
    +var	dicttable = "瀛楀吀Table";
    +var dictcode = "瀛楀吀Code";
    +var dicttext = "瀛楀吀Text";
    +
    +
    +var sequence = "搴忓彿";
    +var operation = "鎿嶄綔";
    +var fieldlength = "瀛楁闀垮害";
    +var decimal = "灏忔暟鐐";
    +var defaultvalue = "榛樿鍊";
    +var fieldtype = "瀛楁绫诲瀷";
    +var pk = "涓婚敭";
    +var allowempty = "鍏佽绌哄";
    +
    +var pleaseinputfilename = "璇疯緭鍏ュ瓧娈靛悕绉帮紒";
    +var filenamecannotuppercase = "瀛楁鍚嶇О涓1鍒30浣嶄笖涓嶈兘鏈夊ぇ鍐欏瓧姣";
    +var pleaseinputfilecomment = "璇疯緭鍏ュ瓧娈垫敞閲婏紒";
    +var fieldcommentfromtwotofourteen = "瀛楁娉ㄩ噴涓2鍒14浣";
    +var pleaseinputfilelength = "璇疯緭鍏ュ瓧娈甸暱搴︼紒";
    +var fieldlengthfromonetofour = "瀛楁闀垮害涓1鍒4浣";
    +var pleaseinputdicemallength = "璇疯緭鍏ュ皬鏁扮偣闀垮害锛";
    +var dicemallengthfromonetotwo = "灏忔暟鐐归暱搴︿负1鍒2浣";
    +var defaultvaluelessthantwenty = "榛樿鍊兼渶闀夸负20锛";
    +var pleaseinputfieldsquence = "璇疯緭鍏ュ瓧娈甸『搴忥紒";
    +var fieldsquencefromonetotwo = "瀛楁椤哄簭涓1鍒2浣";
    +
    +var mastertablename = "涓昏〃鍚";
    +var mastertablefield = "涓昏〃瀛楁";
    +
    +var formdisplay = "琛ㄥ崟鏄剧ず";
    +var griddisplay = "鍒楄〃鏄剧ず";
    +var controltype = "鎺т欢绫诲瀷";
    +var controllength = "鎺т欢闀垮害";
    +var isquery = "鏄惁鏌ヨ";
    +var querytype = "鏌ヨ绫诲瀷";
    +
    +var sqlParse = "SQL瑙f瀽";
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/css/img/L01.png b/src/main/webapp/plug-in/sliding/css/img/L01.png
    new file mode 100644
    index 00000000..f89d22f4
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/L01.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/L02.png b/src/main/webapp/plug-in/sliding/css/img/L02.png
    new file mode 100644
    index 00000000..f7fce8e2
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/L02.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/L03.png b/src/main/webapp/plug-in/sliding/css/img/L03.png
    new file mode 100644
    index 00000000..0d4b69a7
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/L03.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/L04.png b/src/main/webapp/plug-in/sliding/css/img/L04.png
    new file mode 100644
    index 00000000..81291640
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/L04.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/appbutton_mouseover_bg.png b/src/main/webapp/plug-in/sliding/css/img/appbutton_mouseover_bg.png
    new file mode 100644
    index 00000000..6947f8e5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/appbutton_mouseover_bg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/appbutton_mouseover_bg2.png b/src/main/webapp/plug-in/sliding/css/img/appbutton_mouseover_bg2.png
    new file mode 100644
    index 00000000..54117323
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/appbutton_mouseover_bg2.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/avatar.png b/src/main/webapp/plug-in/sliding/css/img/avatar.png
    new file mode 100644
    index 00000000..8d110370
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/avatar.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/dock_bottom_left.png b/src/main/webapp/plug-in/sliding/css/img/dock_bottom_left.png
    new file mode 100644
    index 00000000..07af1880
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/dock_bottom_left.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/dock_bottom_right.png b/src/main/webapp/plug-in/sliding/css/img/dock_bottom_right.png
    new file mode 100644
    index 00000000..7adce96e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/dock_bottom_right.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/dock_left.png b/src/main/webapp/plug-in/sliding/css/img/dock_left.png
    new file mode 100644
    index 00000000..5037277f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/dock_left.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/dock_middle_left.png b/src/main/webapp/plug-in/sliding/css/img/dock_middle_left.png
    new file mode 100644
    index 00000000..60cbe379
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/dock_middle_left.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/dock_middle_right.png b/src/main/webapp/plug-in/sliding/css/img/dock_middle_right.png
    new file mode 100644
    index 00000000..d04e2b48
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/dock_middle_right.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/dock_right.png b/src/main/webapp/plug-in/sliding/css/img/dock_right.png
    new file mode 100644
    index 00000000..550d7db2
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/dock_right.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/dock_top_left.png b/src/main/webapp/plug-in/sliding/css/img/dock_top_left.png
    new file mode 100644
    index 00000000..75c79af8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/dock_top_left.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/dock_top_right.png b/src/main/webapp/plug-in/sliding/css/img/dock_top_right.png
    new file mode 100644
    index 00000000..6c3806cd
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/dock_top_right.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/dock_vertical.png b/src/main/webapp/plug-in/sliding/css/img/dock_vertical.png
    new file mode 100644
    index 00000000..c29a5d6b
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/dock_vertical.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/icon_t1.png b/src/main/webapp/plug-in/sliding/css/img/icon_t1.png
    new file mode 100644
    index 00000000..8390ab69
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/icon_t1.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/icon_t4.png b/src/main/webapp/plug-in/sliding/css/img/icon_t4.png
    new file mode 100644
    index 00000000..164904bf
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/icon_t4.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/portal_all_png.png b/src/main/webapp/plug-in/sliding/css/img/portal_all_png.png
    new file mode 100644
    index 00000000..0cca4d87
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/portal_all_png.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/sprite_main_png.png b/src/main/webapp/plug-in/sliding/css/img/sprite_main_png.png
    new file mode 100644
    index 00000000..527aa989
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/sprite_main_png.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/stat.gif b/src/main/webapp/plug-in/sliding/css/img/stat.gif
    new file mode 100644
    index 00000000..35d42e80
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/stat.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/stat_002.gif b/src/main/webapp/plug-in/sliding/css/img/stat_002.gif
    new file mode 100644
    index 00000000..35d42e80
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/stat_002.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/toolbar_bg.png b/src/main/webapp/plug-in/sliding/css/img/toolbar_bg.png
    new file mode 100644
    index 00000000..62858eee
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/toolbar_bg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/img/wood1.jpg b/src/main/webapp/plug-in/sliding/css/img/wood1.jpg
    new file mode 100644
    index 00000000..9a411b56
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/img/wood1.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/css/main.css b/src/main/webapp/plug-in/sliding/css/main.css
    new file mode 100644
    index 00000000..1a1166ac
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/main.css
    @@ -0,0 +1,3515 @@
    +html {
    +	overflow:hidden;
    +}
    +	
    +body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td {
    +    margin: 0;
    +    padding: 0;
    +}
    +body {
    +	font: 12px/1.5 tahoma,helvetica,clean,sans-serif;
    +    background: none repeat scroll 0 0 white;
    +    height: 100%;
    +    width: 100%;
    +	line-height: 1.5;
    +}
    +.ie7_0 body {
    +    left: 0;
    +    overflow: hidden;
    +    position: absolute;
    +    top: 0;
    +}
    +a {
    +    color: #45649E;
    +    font: 12px/1.5 tahoma,helvetica,clean,sans-serif;
    +}
    +:link, *:visited {
    +    text-decoration: none;
    +}
    +a:hover {
    +    text-decoration: none;
    +}
    +a:focus {
    +    outline-style: none;
    +}
    +a#startingChangeEvn {
    +    display: none;
    +}
    +.hiddenCFProxy {
    +    height: 0;
    +    left: 0;
    +    position: absolute;
    +    top: 0;
    +    visibility: hidden;
    +    width: 0;
    +}
    +.hiddenIframe {
    +    height: 1px;
    +    left: -9999px;
    +    overflow: hidden;
    +    position: absolute;
    +    top: -9999px;
    +    width: 1px;
    +}
    +.radius3 {
    +    border-radius: 3px 3px 3px 3px;
    +}
    +.radius5 {
    +    border-radius: 5px 5px 5px 5px;
    +}
    +.clearfix:after {
    +    clear: both;
    +    content: ".";
    +    display: block;
    +    height: 0;
    +    line-height: 0;
    +    visibility: hidden;
    +}
    +.clearfix {
    +}
    +#startingCover {
    +    background: none repeat scroll 0 0 #B4D9F1;
    +    height: 100%;
    +    left: 0;
    +    overflow: hidden;
    +    position: absolute;
    +    top: 0;
    +    width: 100%;
    +    z-index: 1000000;
    +}
    +#startingLogo {
    +    background: url("../images/starting_logo.gif") repeat scroll 0 0 transparent;
    +    height: 100px;
    +    left: 50%;
    +    margin: -50px 0 0 -50px;
    +    position: absolute;
    +    top: 50%;
    +    width: 100px;
    +}
    +#startingText {
    +    color: white;
    +    cursor: default;
    +    font-family: Arial,Tahoma,微锟斤拷锟脚猴拷;
    +    font-size: 20px;
    +    height: 50px;
    +    left: 50%;
    +    margin: 80px 0 0 -80px;
    +    position: absolute;
    +    text-align: center;
    +    text-shadow: 0 0 3px #666666;
    +    top: 50%;
    +    width: 160px;
    +}
    +#startingBarContainer {
    +    background: none repeat scroll 0 0 #666666;
    +    border: 1px solid #999999;
    +    font-size: 0;
    +    height: 2px;
    +    left: 50%;
    +    margin: 120px 0 0 -51px;
    +    overflow: hidden;
    +    position: absolute;
    +    top: 50%;
    +    width: 100px;
    +}
    +#startingBar {
    +    background: url("../images/starting_bar.gif") repeat scroll 0 0 #FE780A;
    +    font-size: 0;
    +    height: 2px;
    +    overflow: hidden;
    +    width: 0;
    +}
    +#progress {
    +    bottom: 30px;
    +    display: none;
    +    height: 450px;
    +    overflow: auto;
    +    position: absolute;
    +    right: 20px;
    +    width: 250px;
    +    z-index: 1000001;
    +}
    +#startingTips {
    +    color: #666666;
    +    font-family: tahoma;
    +    font-size: 12px;
    +    height: 20px;
    +    left: 50%;
    +    margin: 112px 0 0 60px;
    +    overflow: hidden;
    +    position: absolute;
    +    top: 50%;
    +    width: 40px;
    +}
    +.loading {
    +    background: url("../images/loading.gif") no-repeat scroll 1px 2px transparent;
    +    color: #999999;
    +    cursor: default;
    +    height: 16px;
    +    line-height: 16px;
    +    margin: 30px auto;
    +    overflow: hidden;
    +    padding: 2px 0 2px 20px;
    +    width: 56px;
    +}
    +.loading2 {
    +    color: #999999;
    +    cursor: default;
    +    height: 16px;
    +    line-height: 16px;
    +    margin: 30px auto;
    +    overflow: hidden;
    +    padding: 2px 0 2px 2px;
    +    text-align: center;
    +    width: 56px;
    +}
    +.valignWrap {
    +    display: table;
    +    height: 100%;
    +    overflow: hidden;
    +    vertical-align: middle;
    +    width: 100%;
    +}
    +.valignSubWrap {
    +    display: table-cell;
    +    vertical-align: middle;
    +}
    +.valignContent {
    +}
    +#qqweb_focus_input {
    +    left: -500px;
    +    position: absolute;
    +    top: -200px;
    +}
    +.copyrightBar {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -80px -230px transparent;
    +    bottom: 6px;
    +    height: 14px;
    +    left: 50%;
    +    margin: 0 0 0 -160px;
    +    overflow: hidden;
    +    position: absolute;
    +    width: 320px;
    +    z-index: -1;
    +}
    +.qqBar {
    +    display: none;
    +    float: right;
    +    height: 48px;
    +    margin: 6px 0 0;
    +    overflow: hidden;
    +    position: relative;
    +    width: 200px;
    +}
    +#statusBar {
    +    float: left;
    +    height: 30px;
    +    position: relative;
    +    z-index: 10;
    +}
    +.alloy_start_button_container {
    +    float: left;
    +    height: 100%;
    +    position: relative;
    +    width: 50px;
    +}
    +.alloy_start_button {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -440px -320px transparent;
    +    cursor: pointer;
    +    float: left;
    +    height: 40px;
    +    left: 5px;
    +    position: absolute;
    +    top: -15px;
    +    width: 40px;
    +    z-index: 10;
    +}
    +.alloy_start_button:hover {
    +    background-position: -480px -320px;
    +}
    +.ie6_0 .alloy_start_button, .ie7_0 .alloy_start_button {
    +    background-image: url("../images/portal_all_gif.gif");
    +}
    +.statusBarButton {
    +    background: url("../images/portal_all_png.png") no-repeat scroll 0 0 transparent;
    +    cursor: pointer;
    +    display: inline;
    +    float: left;
    +    height: 22px;
    +    margin: 5px 10px 0;
    +    overflow: hidden;
    +    width: 18px;
    +}
    +.statusBarButton:hover {
    +    height: 26px;
    +    margin: 1px 1px 0;
    +    width: 36px;
    +}
    +.ie6_0 .statusBarButton, .ie7_0 .statusBarButton {
    +    background-image: url("../images/portal_all_gif.gif");
    +}
    +.statusBar_login_level_1 .login_level_1, .statusBar_login_level_2 .login_level_2, .statusBar_login_level_2 .login_level_1, .statusBar_login_level_3 .statusBarButton {
    +    display: inline-block;
    +}
    +.statusBar_login_level_1 .login_level_2, .statusBar_login_level_1 .login_level_3, .statusBar_login_level_2 .login_level_3 {
    +    display: none;
    +}
    +.quickPanel {
    +    float: right;
    +    height: 29px;
    +    margin: 1px 0 0;
    +    position: relative;
    +    z-index: 10;
    +}
    +.showDesktopButton {
    +    background-position: -120px -20px;
    +}
    +.showDesktopButton:hover {
    +    background-position: -240px -320px;
    +}
    +.quickPanel_qqWebImeButton {
    +    background-position: 0 -20px;
    +}
    +.quickPanel_qqWebImeButton:hover {
    +    background-position: 0 -320px;
    +}
    +.quickPanel_qqWebDictButton {
    +    background-position: -180px -20px;
    +}
    +.quickPanel_qqWebDictButton:hover {
    +    background-position: -360px -320px;
    +}
    +.quickPanel_adsorbModelButton {
    +    background-position: -80px -20px;
    +    display: none;
    +}
    +.quickPanel_adsorbModelButton:hover {
    +    background-position: -160px -320px;
    +}
    +.quickPanel_freeModelButton {
    +    background-position: -140px -20px;
    +    display: none;
    +}
    +.quickPanel_freeModelButton:hover {
    +    background-position: -280px -320px;
    +}
    +.systemClock {
    +    display: block;
    +    float: left;
    +    margin-top: 5px;
    +    text-align: center;
    +    width: 85px;
    +}
    +.documentMode_7 .systemClock, .documentMode_8 .systemClock, .documentMode_9 .systemClock {
    +    margin-top: 6px;
    +}
    +.documentMode_6 .systemClock {
    +    display: inline-block;
    +    float: none;
    +}
    +.appIframeAlter {
    +    background: url("../images/alter_image.png") no-repeat scroll center top transparent;
    +    height: 75px;
    +    margin: 0 auto;
    +    width: 90px;
    +}
    +.appComingSoon {
    +    background: url("../images/coming_soon.png") no-repeat scroll center top transparent;
    +    height: 28px;
    +    margin-left: 10px;
    +    margin-top: 45px;
    +}
    +.appWarning {
    +    background: url("../images/warn_image.png") no-repeat scroll center top transparent;
    +    height: 52px;
    +}
    +.appIframeAlterTxt {
    +    font-family: 微锟斤拷锟脚猴拷;
    +    font-size: 14px;
    +    margin-top: 30px;
    +}
    +.appWarningTxt {
    +    color: #FFFFFF;
    +    margin-top: 50px;
    +}
    +a.plain_text {
    +    color: #FFFFFF;
    +    font-size: 14px;
    +    line-height: 40px;
    +    text-decoration: underline;
    +}
    +.appWarningTxt .strong_text {
    +    display: block;
    +    font-family: 微锟斤拷锟脚猴拷;
    +    font-size: 14px;
    +    font-weight: bold;
    +}
    +.appWarningTxt .plain_text {
    +    line-height: 40px;
    +}
    +.ie6_0 .appIframeAlter, .ie7_0 .appIframeAlter {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.layout_start {
    +    background-position: -440px -320px;
    +    color: #000000;
    +    height: 40px;
    +    line-height: 16px;
    +    margin: -12px 10px 0 0;
    +    position: relative;
    +    width: 40px;
    +}
    +.layout_start:hover {
    +    background-position: -480px -320px;
    +    height: 40px;
    +    margin: -12px 10px 0 0;
    +    width: 40px;
    +}
    +.layoutSaveButton {
    +    background-position: -100px -20px;
    +}
    +.layoutSaveButton:hover {
    +    background-position: -200px -320px;
    +}
    +.themeSettingButton {
    +    background-position: -20px -20px;
    +}
    +.themeSettingButton:hover {
    +    background-position: -40px -320px;
    +}
    +.statusBar_help {
    +    background-position: -40px -20px;
    +}
    +.statusBar_help:hover {
    +    background-position: -80px -320px;
    +}
    +.statusBar_sound {
    +    color: #395267;
    +    display: inline;
    +    float: right;
    +    height: 35px;
    +    overflow: hidden;
    +    width: 38px;
    +}
    +.statusBar_sound_open {
    +    background-position: -60px -20px;
    +}
    +.statusBar_sound_open:hover {
    +    background-position: -120px -320px;
    +}
    +.statusBar_sound_mute {
    +    background-position: -160px -20px;
    +}
    +.statusBar_sound_mute:hover {
    +    background-position: -320px -320px;
    +}
    +.statusBar_lock {
    +    color: #395267;
    +    display: none;
    +    float: right;
    +    height: 20px;
    +    margin: 6px 2px 5px;
    +    overflow: hidden;
    +    width: 20px;
    +}
    +.statusBar_lock_icon {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -120px -20px transparent;
    +    cursor: pointer;
    +    display: none;
    +    float: left;
    +    height: 20px;
    +    overflow: hidden;
    +    width: 20px;
    +}
    +.ie6_0 .statusBar_lock_icon, .ie7_0 .statusBar_lock_icon {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -120px -20px transparent;
    +}
    +#dangerTip {
    +    background: none repeat scroll 0 0 #FFFFFF;
    +    font-family: 微锟斤拷锟脚猴拷;
    +    height: 100%;
    +    padding-left: 40px;
    +    padding-top: 30px;
    +}
    +#dangerTip p {
    +    font-size: 18px;
    +    font-weight: bold;
    +    line-height: 32px;
    +}
    +#dangerTip .tip {
    +    color: red;
    +}
    +.loginArea {
    +    bottom: 0;
    +    left: 0;
    +    overflow-x: hidden;
    +    overflow-y: auto;
    +    position: absolute;
    +    right: 0;
    +    top: 0;
    +}
    +.loginArea_Logining {
    +    bottom: 0;
    +    left: 0;
    +    overflow-x: hidden;
    +    overflow-y: auto;
    +    position: absolute;
    +    right: 0;
    +    top: 0;
    +}
    +.ie6_0 loginArea_Logining {
    +    height: 100%;
    +    width: 100%;
    +}
    +#EQQlogin_Logining {
    +    background: url("../images/loading.gif") no-repeat scroll 1px 2px transparent;
    +    color: #AAAAAA;
    +    cursor: default;
    +    height: 16px;
    +    left: 50%;
    +    line-height: 16px;
    +    margin: -10px 0 0 -40px;
    +    overflow: hidden;
    +    padding: 2px 0 2px 20px;
    +    position: absolute;
    +    top: 50%;
    +    width: 60px;
    +}
    +.accountAvatar {
    +    background: url("../images/portal_all_png.png") no-repeat scroll 0 -159px transparent;
    +    display: block;
    +    height: 40px;
    +    margin: 50px auto 5px;
    +    padding: 8px 7px;
    +    width: 40px;
    +}
    +.accountNick {
    +    font-weight: bold;
    +    margin: 25px auto 5px;
    +    overflow: hidden;
    +    text-align: center;
    +    width: 120px;
    +}
    +.loginAccount {
    +    font-weight: bold;
    +    margin: 5px auto;
    +    text-align: center;
    +}
    +.loginTip {
    +    background: url("../images/login_area_tip.png ") no-repeat scroll 0 0 transparent;
    +    height: 63px;
    +    margin: 40px auto 0;
    +    width: 130px;
    +}
    +.ie6_0 .loginTip {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.loginTip2 {
    +    background: url("../images/login_area_tip2.png ") no-repeat scroll 0 0 transparent;
    +    height: 63px;
    +    margin: 40px auto 0;
    +    width: 130px;
    +}
    +.ie6_0 .loginTip2 {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.loginIcon {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -110px -125px transparent;
    +    cursor: pointer;
    +    height: 32px;
    +    margin: 60px auto 10px;
    +    width: 107px;
    +}
    +.ie6_0 .loginIcon, .ie7_0 .loginIcon {
    +    background: url("../images/portal_all_gif.gif") no-repeat scroll -110px -125px transparent;
    +}
    +.loginIconClicked {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -330px -125px transparent;
    +    cursor: default;
    +    height: 32px;
    +    margin: 60px auto 10px;
    +    width: 107px;
    +}
    +.ie6_0 .loginIconClicked, .ie7_0 .loginIconClicked {
    +    background: url("../images/portal_all_gif.gif") no-repeat scroll -330px -125px transparent;
    +}
    +.loginIcon_go {
    +    background: url("../images/portal_all_png.png") no-repeat scroll 0 -125px transparent;
    +    cursor: pointer;
    +    height: 32px;
    +    margin: 10px auto;
    +    width: 107px;
    +}
    +.ie6_0 .loginIcon_go, .ie7_0 .loginIcon_go {
    +    background: url("../images/portal_all_gif.gif") no-repeat scroll 0 -125px transparent;
    +}
    +.loginIcon_goClicked {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -220px -125px transparent;
    +    cursor: default;
    +    height: 32px;
    +    margin: 10px auto;
    +    width: 107px;
    +}
    +.ie6_0 .loginIcon_goClicked, .ie7_0 .loginIcon_goClicked {
    +    background: url("../images/portal_all_gif.gif") no-repeat scroll -220px -125px transparent;
    +}
    +.loginControl {
    +    height: 24px;
    +    margin: 15px auto 0;
    +    width: 100px;
    +}
    +.ie6_0 .loginControl, .ie7_0 .loginControl {
    +    width: 110px;
    +}
    +.loginCheckBox_text {
    +    float: left;
    +}
    +.ie6_0 .loginCheckBox_text, .ie7_0 .loginCheckBox_text {
    +    margin-top: 4px;
    +}
    +.loginCheckBox_input {
    +    float: left;
    +    margin-right: 10px;
    +    margin-top: 3px;
    +}
    +.ipadTips {
    +    color: #999999;
    +    display: none;
    +    margin: 20px auto auto;
    +    width: 120px;
    +}
    +#loginState {
    +    display: block;
    +    float: right;
    +    margin: 8px 5px 0 0;
    +}
    +.loginStateText {
    +    color: #636264;
    +    float: left;
    +}
    +.loginControl .EQQ_myState {
    +    margin: 2px 0 0 10px;
    +}
    +#loginStatePanel {
    +    height: 133px;
    +}
    +.loginButton {
    +    color: #333333;
    +    cursor: pointer;
    +    font-weight: bold;
    +    margin: 10px auto;
    +    overflow: hidden;
    +    padding: 5px 0;
    +    text-align: center;
    +    width: 100px;
    +}
    +.offlineTips {
    +    color: #AAAAAA;
    +    display: none;
    +    text-align: center;
    +}
    +.login_logo_qq, .login_logo_webqq {
    +    background: url("../images/login_window_logo.png") no-repeat scroll 0 0 transparent;
    +    cursor: move;
    +    height: 44px;
    +    margin-left: 90px;
    +    width: 200px;
    +}
    +.ie6_0 .login_logo_qq, .ie6_0 .login_logo_webqq {
    +    margin-top: 10px;
    +}
    +.login_logo_qq {
    +    background-position: -200px 0;
    +}
    +.login_logo_webqq {
    +    background-position: 0 0;
    +}
    +.qqLevel_queen {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -2px -82px transparent;
    +}
    +.ie6_0 .qqLevel_queen, .ie7_0 .qqLevel_queen {
    +    background: url("../images/portal_all_gif.gif") no-repeat scroll -2px -82px transparent;
    +}
    +.qqLevel_sun {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -22px -82px transparent;
    +}
    +.ie6_0 .qqLevel_sun, .ie7_0 .qqLevel_sun {
    +    background: url("../images/portal_all_gif.gif") no-repeat scroll -22px -82px transparent;
    +}
    +.qqLevel_moon {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -42px -82px transparent;
    +}
    +.ie6_0 .qqLevel_moon, .ie7_0 .qqLevel_moon {
    +    background: url("../images/portal_all_gif.gif") no-repeat scroll -42px -82px transparent;
    +}
    +.qqLevel_star {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -62px -82px transparent;
    +}
    +.ie6_0 .qqLevel_star, .ie7_0 .qqLevel_star {
    +    background: url("../images/portal_all_gif.gif") no-repeat scroll -62px -82px transparent;
    +}
    +.widget_toolBar {
    +    display: block;
    +    float: right;
    +    position: absolute;
    +    right: 6px;
    +    top: 3px;
    +}
    +.widget {
    +    background: url("../images/transparent.gif") repeat scroll 0 0 transparent;
    +    display: block;
    +    position: absolute;
    +}
    +.content_area {
    +    background-color: transparent;
    +    bottom: 0;
    +    left: 0;
    +    overflow: hidden;
    +    position: absolute;
    +    right: 0;
    +    top: 0;
    +    z-index: 0;
    +}
    +.window_content .content_area {
    +    background-color: white;
    +}
    +.iframeApp {
    +    background-color: transparent;
    +    height: 100%;
    +    left: -9999px;
    +    overflow: auto;
    +    position: absolute;
    +    top: 0;
    +    width: 100%;
    +}
    +.ie6_0 .content_area {
    +    position: relative;
    +}
    +.login_content_area {
    +    background: none repeat scroll 0 0 #F6F6F6;
    +    bottom: 10px;
    +    left: 10px;
    +    overflow: hidden;
    +    position: absolute;
    +    right: 10px;
    +    top: 10px;
    +    z-index: 0;
    +}
    +.ie6_0 .login_content_area {
    +    bottom: 0;
    +    left: 0;
    +    right: 0;
    +    top: 0;
    +}
    +.iframeDragResizeMask {
    +    background: none repeat scroll 0 0 #FFFFFF;
    +    cursor: default;
    +    display: none;
    +    height: 100%;
    +    left: 0;
    +    opacity: 0;
    +    position: absolute;
    +    top: 0;
    +    width: 100%;
    +}
    +.flash_alt {
    +    background: url("../images/alter_bg.png") repeat-x scroll 0 0 #FFFFFF;
    +    display: none;
    +    height: 100%;
    +    padding-top: 60px;
    +    text-align: center;
    +    width: 100%;
    +}
    +.no_available_alt {
    +    padding-top: 70px;
    +    text-align: center;
    +}
    +.mask_iframe {
    +    height: 100%;
    +    left: 0;
    +    opacity: 0;
    +    position: absolute;
    +    top: 0;
    +    visibility: hidden;
    +    width: 100%;
    +    z-index: -1;
    +}
    +.flash_mask_iframe {
    +    height: 100%;
    +    left: 0;
    +    opacity: 0;
    +    position: absolute;
    +    top: 0;
    +    width: 100%;
    +    z-index: -1;
    +}
    +.quickPanelRunningApp {
    +    display: block;
    +    float: left;
    +    height: 16px;
    +    margin: 3px 3px 0;
    +    overflow: hidden;
    +    padding: 3px;
    +    position: relative;
    +    width: 16px;
    +}
    +.quickPanelRunningApp:hover {
    +    background: none repeat scroll 0 0 #BEECFC;
    +}
    +#quickPanelPopupArrow {
    +    background: url("../images/btn_more.png") no-repeat scroll center center transparent;
    +    cursor: pointer;
    +    display: none;
    +    float: left;
    +    height: 30px;
    +    width: 20px;
    +}
    +.quickPanelPopupContainer {
    +    background: none repeat scroll 0 0 #FFFFFF;
    +    border-color: #CCCCCC #6A6A6A #666666 #CDCDCD;
    +    border-style: solid;
    +    border-width: 1px;
    +    bottom: 30px;
    +    display: none;
    +    overflow: hidden;
    +    padding: 0;
    +    position: absolute;
    +    width: 150px;
    +}
    +.quickPanelPopupContainer .quickPanelRunningApp {
    +    background: none repeat scroll 0 0 #FFFFFF;
    +    border: 0 none;
    +    color: #000000;
    +    display: block;
    +    float: none;
    +    height: 20px;
    +    margin: 0;
    +    padding: 2px 0 2px 10px;
    +    width: 100%;
    +}
    +.quickPanelPopupContainer .quickPanelRunningApp:hover {
    +    background: none repeat scroll 0 0 #BEECFC;
    +}
    +.quickPanelPopupContainer .quickPanelRunningAppText {
    +    color: #000000;
    +    display: block;
    +    width: 1000px;
    +}
    +.quickPanelPopupContainer .quickPanelRunningAppTextWrap {
    +    color: #000000;
    +    display: block;
    +    float: left;
    +    overflow: hidden;
    +    padding: 0 0 0 3px;
    +    width: 110px;
    +}
    +.quickPanelRunningApp img {
    +    float: left;
    +    height: 16px;
    +    padding: 2px 0 0;
    +    width: 16px;
    +}
    +.quickPanelRunningAppText {
    +    display: none;
    +}
    +.quickPanelRunningAppState {
    +    background: none repeat scroll 0 50% transparent;
    +    bottom: 3px;
    +    display: none;
    +    height: 10px;
    +    overflow: hidden;
    +    position: absolute;
    +    right: 3px;
    +    width: 10px;
    +}
    +.statusBar_sub {
    +    display: inline;
    +    float: left;
    +}
    +#mainPanel {
    +    position: absolute;
    +    top: 65px;
    +    width: 100%;
    +}
    +.divSelect_arr {
    +    background: url("../images/bg_sel_arr.gif") no-repeat scroll 0 0 transparent;
    +}
    +.animate_proxy {
    +    background: none repeat scroll 0 0 transparent;
    +    border: 2px solid #33AA99;
    +    display: none;
    +    height: 440px;
    +    left: 100px;
    +    position: absolute;
    +    top: 200px;
    +    width: 54px;
    +    z-index: 99999;
    +}
    +.hidden_div {
    +    left: -9999px;
    +    position: absolute;
    +    top: -9999px;
    +}
    +.login_window_wrap {
    +    background: none repeat scroll 0 0 #FFFFFF;
    +    height: 320px;
    +    text-align: center;
    +    width: 100%;
    +}
    +.login_window_wrap iframe {
    +    background: none repeat scroll 0 0 #FFFFFF;
    +    height: 100%;
    +    overflow: hidden;
    +    position: relative;
    +    width: 100%;
    +}
    +.login_window_info {
    +    color: red;
    +    margin: 3px 0 0 57px;
    +}
    +.login_window_info2 {
    +    position: absolute;
    +    top: 45px;
    +    z-index: 1;
    +}
    +.ie6_0 .login_window_info2 {
    +    margin-left: 67px;
    +    top: 54px;
    +}
    +#desktop {
    +    border: 0 solid red;
    +    color: #333333;
    +    cursor: default;
    +    font: 12px/1.5 tahoma,helvetica,clean,sans-serif;
    +    height: 100%;
    +   /* overflow: hidden;*/
    +    width: 100%;
    +}
    +#topBar {
    +    height: 0;
    +    left: 0;
    +    position: absolute;
    +    top: 0;
    +    width: 100%;
    +}
    +.sideBarReplacement {
    +    float: right;
    +    height: 100%;
    +    padding: 0 5px 0 0;
    +    width: 195px;
    +}
    +#sideBar {
    +    bottom: 65px;
    +    padding: 0 5px 0 0;
    +    position: absolute;
    +    right: 0;
    +    top: 60px;
    +    width: 195px;
    +}
    +.maskLayer {
    +    display: none;
    +}
    +.maskBackground {
    +    background: none repeat scroll 0 0 black;
    +    height: 100%;
    +    opacity: 0.5;
    +    position: absolute;
    +    width: 100%;
    +}
    +#leftBar {
    +    height: 100%;
    +    left: 0;
    +    position: absolute;
    +    top: 0;
    +    width: 0;
    +}
    +#rightBar {
    +    height: 100%;
    +    position: absolute;
    +    right: 0;
    +    top: 0;
    +    width: 0;
    +}
    +#topBar, #leftBar, #rightBar {
    +    z-index: 10;
    +}
    +#bottomBar {
    +    z-index: 12;
    +}
    +#desktopWrapper {
    +    z-index: 9;
    +}
    +#navbar {
    +    z-index: 11;
    +}
    +.dock_container {
    +    height: 576px;
    +    left: 0;
    +    margin: -290px 0 0;
    +    position: absolute;
    +    top: 50%;
    +    width: 73px;
    +}
    +.dock_drap_effect {
    +    border: 3px solid #3C9DFF;
    +    display: none;
    +    z-index: 4000000;
    +}
    +.dock_drap_effect :hover{
    +     border-color: #E1F0FD;
    +}
    +
    +
    +.dock_drap_effect_left {
    +    height: 568px;
    +    left: -3px;
    +    margin: -288px 0 0;
    +    position: absolute;
    +    top: 50%;
    +    width: 65px;
    +}
    +.dock_drap_effect_top {
    +    height: 65px;
    +    left: 50%;
    +    margin: 0 0 0 -288px;
    +    position: absolute;
    +    top: -3px;
    +    width: 568px;
    +}
    +.dock_drap_effect_right {
    +    height: 568px;
    +    margin: -288px 0 0;
    +    position: absolute;
    +    right: -3px;
    +    top: 50%;
    +    width: 65px;
    +}
    +.dock_drap_effect_left:hover {
    +    border-color: #E1F0FD;
    +}
    +.dock_drap_effect_right:hover {
    +    border-color: #E1F0FD;
    +}
    +.dock_drap_effect_top:hover {
    +    border-color: #E1F0FD;
    +}
    +.dock_drap_proxy {
    +    background: none repeat scroll 0 0 transparent;
    +    display: none;
    +    height: 1px;
    +    position: absolute;
    +    width: 1px;
    +}
    +.dock_drap_mask {
    +    display: none;
    +    height: 100%;
    +    left: 0;
    +    position: absolute;
    +    top: 0;
    +    width: 100%;
    +    z-index: 300000;
    +}
    +.dock_drop_region_top {
    +    border-bottom: 1px dashed #333333;
    +    height: 20%;
    +    left: 0;
    +    position: absolute;
    +    top: 0;
    +    width: 100%;
    +}
    +.dock_drop_region_left {
    +    border-right: 1px dashed #333333;
    +    bottom: 0;
    +    height: 80%;
    +    left: 0;
    +    position: absolute;
    +    width: 50%;
    +}
    +.dock_drop_region_right {
    +    bottom: 0;
    +    height: 80%;
    +    position: absolute;
    +    right: 0;
    +    width: 50%;
    +}
    +.dock_item_list {
    +    float: left;
    +    height: 380px;
    +    width: 65px;
    +}
    +.dock_tool_list {
    +    bottom: 5px;
    +    height: 115px;
    +    position: absolute;
    +    width: 65px;
    +}
    +.dock_tool_item {
    +    height: 31px;
    +    margin: 0 auto;
    +    width: 50px;
    +}
    +.dock_tool_item2 {
    +    height: 50px;
    +    margin: 0 auto;
    +}
    +.dock_tool_icon {
    +    background: url("../images/portal_all_png.png") no-repeat scroll 0 0 transparent;
    +    cursor: pointer;
    +    display: block;
    +    float: left;
    +    height: 20px;
    +    margin: 5px 0;
    +    position: relative;
    +    width: 20px;
    +}
    +.dock_tool_pinyin {
    +    background-position: -80px 0;
    +}
    +.dock_tool_pinyin:hover {
    +    background-position: -80px -20px;
    +}
    +.dock_tool_sound {
    +    background-position: 0 0;
    +    margin-left: 10px;
    +}
    +.dock_tool_sound:hover {
    +    background-position: 0 -20px;
    +}
    +.dock_tool_sound_mute {
    +    background-position: -20px 0;
    +}
    +.dock_tool_sound_mute:hover {
    +    background-position: -20px -20px;
    +}
    +.dock_tool_setting {
    +    background-position: -60px 0;
    +}
    +.dock_tool_setting:hover {
    +    background-position: -60px -20px;
    +}
    +.dock_tool_theme {
    +    background-position: -40px 0;
    +    margin-left: 10px;
    +}
    +.dock_tool_theme:hover {
    +    background-position: -40px -20px;
    +}
    +.dock_tool_start {
    +    background-position: -100px 0;
    +    float: none;
    +    height: 40px;
    +    margin: 5px auto 0;
    +    width: 40px;
    +}
    +.dock_tool_start:hover {
    +    background-position: -140px 0;
    +}
    +.dock_menu_select_left .dock_menu_item_left, .dock_menu_select_top .dock_menu_item_top, .dock_menu_select_right .dock_menu_item_right {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -100px -460px transparent;
    +}
    +.ie6_0 .dock_menu_select_left .dock_menu_item_left, .ie6_0 .dock_menu_select_top .dock_menu_item_top, .ie6_0 .dock_menu_select_right .dock_menu_item_right {
    +    background: url("../images/portal_all_gif.gif") no-repeat scroll -100px -460px transparent;
    +}
    +.dock_top {
    +    height: 10px;
    +}
    +.dock_middle {
    +    height: 566px;
    +    padding-top: 10px;
    +}
    +.dock_bottom {
    +    height: 10px;
    +}
    +.dock_pos_left .dock_middle {
    +    background: url("../images/dock_l.png ") no-repeat scroll 0 0 transparent;
    +}
    +.dock_pos_left .dock_tool_list {
    +    left: 0;
    +}
    +.dock_pos_right .dock_middle {
    +    background: url("../images/dock_r.png ") no-repeat scroll 0 0 transparent;
    +    overflow: hidden;
    +    padding-left: 5px;
    +}
    +.ie6_0 .dock_pos_right .dock_middle {
    +    padding-left: 3px;
    +}
    +.dock_pos_right .dock_tool_list {
    +    left: 7px;
    +}
    +.dock_pos_right .appButton {
    +    margin-left: 6px !important;
    +}
    +.dock_pos_top {
    +    height: 79px;
    +    left: 50%;
    +    margin: 0 0 0 -290px;
    +    top: 0;
    +    width: 576px;
    +}
    +.dock_pos_top .dock_top, .dock_pos_top .dock_bottom {
    +    height: 100%;
    +    position: absolute;
    +    top: 0;
    +    width: 15px;
    +}
    +.dock_pos_top .dock_top {
    +    left: 0;
    +    width: 10px;
    +}
    +.dock_pos_top .dock_middle {
    +    background: url("../images/dock_up.png ") no-repeat scroll 0 0 transparent;
    +    height: 69px;
    +    padding-left: 10px;
    +    padding-top: 0;
    +    width: 566px;
    +}
    +.dock_pos_top .dock_bottom {
    +    right: 0;
    +    width: 0;
    +}
    +.dock_pos_top .dock_item_list {
    +    height: 60px;
    +    width: 385px;
    +}
    +.dock_pos_top .dock_tool_list {
    +    height: 60px;
    +    position: absolute;
    +    right: 4px;
    +    top: 3px;
    +    width: 115px;
    +}
    +.ie6_0 .dock_pos_top .dock_tool_list {
    +    width: 119px;
    +}
    +.dock_pos_top .dock_tool_item {
    +    float: left;
    +    height: 60px;
    +    margin: 0 5px;
    +    width: 22px;
    +}
    +.dock_pos_top .dock_tool_sound, .dock_pos_top .dock_tool_theme {
    +    margin-left: 0;
    +}
    +.dock_pos_top .dock_tool_item2 {
    +    float: left;
    +    height: 60px;
    +    width: 50px;
    +}
    +.dock_pos_top .dock_tool_start {
    +    margin-top: 10px;
    +}
    +.dock_pos_top .appButton {
    +    margin: 4px 2px !important;
    +}
    +.appMarket {
    +    float: left;
    +}
    +.ie6_0 .dock_pos_left .dock_middle {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.ie6_0 .dock_pos_right .dock_middle {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.ie6_0 .dock_pos_top .dock_middle {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.fullscreen_bg_iframe {
    +    border-style: none;
    +    left: 0;
    +    opacity: 0;
    +    position: absolute;
    +    top: 0;
    +    z-index: -1;
    +}
    +.portal_container {
    +    background: none repeat scroll 0 0 #FFFFFF;
    +    height: 100%;
    +    padding-top: 10px;
    +    width: 100%;
    +}
    +.portal_alert {
    +    font-size: 14px;
    +    line-height: 50px;
    +    margin: auto;
    +    text-align: center;
    +}
    +.portal_run_container {
    +    color: #3976A2;
    +    margin: auto;
    +    width: 120px;
    +}
    +.portal_run_container a:hover {
    +    text-decoration: underline;
    +}
    +.portal_runappmarket {
    +    margin-left: 10px;
    +}
    +#touchpad {
    +    border: 0 none;
    +    display: none;
    +    height: 100%;
    +    left: 0;
    +    position: absolute;
    +    top: 0;
    +    width: 100%;
    +}
    +.helpPopupContainer {
    +    background: none repeat scroll 0 0 #FFFFFF;
    +    border-color: #CCCCCC #6A6A6A #666666 #CDCDCD;
    +    border-style: solid;
    +    border-width: 1px;
    +    bottom: 30px;
    +    display: none;
    +    height: 73px;
    +    padding: 5px;
    +    position: absolute;
    +    width: 60px;
    +}
    +.helpPopupContainer a {
    +    color: #000000;
    +}
    +#EQQ_Logining_feedback {
    +    color: #AAAAAA;
    +    cursor: default;
    +    height: 16px;
    +    left: 50%;
    +    line-height: 16px;
    +    margin: 20px 0 0 -66px;
    +    overflow: hidden;
    +    padding: 2px 0 2px 20px;
    +    position: absolute;
    +    top: 50%;
    +    width: 90px;
    +}
    +.helpMenuImg {
    +    background-image: url("../images/helpmenu.png ");
    +    display: block;
    +}
    +.ie6_0 .helpMenuImg, .ie7_0 .helpMenuImg {
    +    background-image: url("../images/helpmenu.gif ");
    +    display: block;
    +}
    +.taskbar_help_menu_container {
    +    background-position: -48px -70px;
    +    bottom: 12px;
    +    display: none;
    +    height: 200px;
    +    left: 50%;
    +    margin-left: -165px;
    +    margin-top: -100px;
    +    position: absolute;
    +    top: 50%;
    +    width: 325px;
    +}
    +.ie6_0 .taskbar_help_menu_container {
    +    width: 320px;
    +}
    +.taskbar_help_menu_bottom_text {
    +    float: left;
    +    line-height: 24px;
    +}
    +.taskbar_help_menu_weibo {
    +    background-position: -396px -140px;
    +    float: left;
    +    height: 24px;
    +    margin: 0 5px;
    +    width: 20px;
    +}
    +.taskbar_help_menu_weibo:hover {
    +    background-position: -396px -193px;
    +}
    +.taskbar_help_menu_blog {
    +    background-position: -422px -140px;
    +    float: left;
    +    height: 24px;
    +    margin: 0 5px;
    +    width: 20px;
    +}
    +.taskbar_help_menu_blog:hover {
    +    background-position: -422px -193px;
    +}
    +.taskbar_help_menu_question {
    +    background-position: -450px -140px;
    +    float: left;
    +    height: 24px;
    +    margin: 0 5px;
    +    width: 20px;
    +}
    +.taskbar_help_menu_question:hover {
    +    background-position: -450px -193px;
    +}
    +.taskbar_help_menu {
    +    font-family: Tahoma,Geneva,sans-serif;
    +    font-size: 12px;
    +    margin: 0;
    +    padding: 0;
    +}
    +.taskbar_help_menu li {
    +    cursor: pointer;
    +    height: 22px;
    +    list-style: none outside none;
    +    padding: 3px 5px 0 10px;
    +}
    +.taskbar_help_menu li:hover, .taskbar_help_menu_hover {
    +    background: none repeat scroll 0 0 #348CCC;
    +    color: #FFFFFF;
    +}
    +.taskbar_help_menu li:hover a, .taskbar_help_menu_hover a {
    +    color: #FFFFFF !important;
    +}
    +.taskbar_help_menu li a {
    +    color: #000000;
    +    text-decoration: none;
    +}
    +.taskbar_help_menu_head {
    +    font-size: 0;
    +    height: 55px;
    +    line-height: 0;
    +    width: 119px;
    +}
    +.taskbar_help_menu_body {
    +    height: 80px;
    +    min-height: 70px;
    +    padding: 10px 20px;
    +}
    +.taskbar_help_menu_text {
    +    color: #FFFFFF;
    +    line-height: 24px;
    +    margin-top: 10px;
    +}
    +.taskbar_help_menu_link {
    +    color: #CCD1D6;
    +    display: block;
    +    line-height: 24px;
    +}
    +.taskbar_help_menu_link:hover {
    +    color: #4CE4FF;
    +    text-decoration: underline;
    +}
    +.taskbar_help_menu_bottom {
    +    color: #FFFFFF;
    +    float: right;
    +    height: 24px;
    +    padding: 10px;
    +    width: 130px;
    +}
    +.taskbar_help_menu_button {
    +    background: url("images/portal_all_png.png ") no-repeat scroll 0 0 transparent;
    +    float: left;
    +    height: 18px;
    +    margin: 2px 6px 0 0;
    +    width: 18px;
    +}
    +.ie6_0 .taskbar_help_menu_button, .ie7_0 .taskbar_help_menu_button {
    +    background-image: url("images/portal_all_gif.gif ");
    +}
    +.taskbar_start_menu_container {
    +    bottom: 4px;
    +    color: #FFFFFF;
    +    display: none;
    +    height: 240px;
    +    left: 4px;
    +    position: absolute;
    +}
    +.taskbar_start_menu_head {
    +    background: url("images/portal_all_png.png ") no-repeat scroll 0 -380px transparent;
    +    font-size: 0;
    +    height: 6px;
    +    line-height: 0;
    +    width: 171px;
    +}
    +.startMenuImg {
    +    background-image: url("../images/startmenu.png ");
    +}
    +.ie7_0 .startMenuImg, .ie6_0 .startMenuImg {
    +    background-image: url("../images/startmenu.gif ");
    +}
    +.taskbar_start_menu_body {
    +    background-position: -33px -69px;
    +    min-height: 70px;
    +    overflow: hidden;
    +    padding: 0 0 7px;
    +    width: 182px;
    +}
    +.taskbar_start_menu_selfinfo {
    +    height: 30px;
    +    padding: 5px 0 4px 5px;
    +}
    +.taskbar_start_menu_avator {
    +    background: none repeat scroll 0 0 white;
    +    border: 1px solid #999999;
    +    cursor: pointer;
    +    float: left;
    +    height: 40px;
    +    overflow: hidden;
    +    padding: 1px;
    +    position: relative;
    +    width: 40px;
    +}
    +.taskbar_start_menu_nick {
    +    color: #4CE4FF;
    +    cursor: pointer;
    +    display: inline;
    +    float: left;
    +    font-size: 14px;
    +    height: 18px;
    +    margin: 5px 0 0 10px;
    +    overflow: hidden;
    +    width: 95px;
    +}
    +.taskbar_start_menu_nick a {
    +    color: #4CE4FF;
    +    font-size: 14px;
    +}
    +.taskbar_start_menu_help_arrow {
    +    background: url("images/portal_all_png.png ") no-repeat scroll -65px -460px transparent;
    +    display: block;
    +    float: right;
    +    height: 12px;
    +    margin: 6px 6px 0 0;
    +    width: 12px;
    +}
    +.ie6_0 .taskbar_start_menu_help_arrow, .ie7_0 .taskbar_start_menu_help_arrow {
    +    background-image: url("images/portal_all_gif.gif ");
    +}
    +.taskbar_start_menu_button {
    +    background: url("images/portal_all_png.png ") no-repeat scroll 0 0 transparent;
    +    display: block;
    +    float: left;
    +    height: 25px;
    +    margin-right: 10px;
    +    width: 25px;
    +}
    +.ie6_0 .taskbar_start_menu_button, .ie7_0 .taskbar_start_menu_button {
    +    background-image: url("images/portal_all_gif.gif ");
    +}
    +.taskbar_start_menu_home {
    +    background-position: 0 -500px;
    +}
    +.taskbar_start_menu_favorite {
    +    background-position: -40px -500px;
    +}
    +.taskbar_start_menu_savetodeskptop {
    +    background-position: -80px -500px;
    +}
    +.taskbar_start_menu_subscribe {
    +    background-position: -120px -500px;
    +}
    +.taskbar_start_menu_modify {
    +    background-position: -280px -500px;
    +}
    +.taskbar_start_menu_lock {
    +    background-position: -160px -500px;
    +}
    +.taskbar_start_menu_setting {
    +    background-position: -200px -500px;
    +}
    +.taskbar_start_menu_help {
    +    background-position: -320px -500px;
    +}
    +.taskbar_start_menu_logout {
    +    background-position: -240px -530px;
    +}
    +.taskbar_start_menu_exit {
    +    background-position: -240px -500px;
    +}
    +.taskbar_start_menu_download {
    +    background-position: -280px -530px;
    +}
    +.taskbar_start_menu {
    +    font-family: Tahoma,Geneva,sans-serif;
    +    font-size: 12px;
    +    margin: 2px 0 0;
    +    padding: 0;
    +}
    +.taskbar_start_menu li {
    +    cursor: pointer;
    +    line-height: 22px;
    +    list-style: none outside none;
    +    padding: 4px 10px 6px 15px;
    +}
    +.taskbar_start_menu li:hover, .taskbar_start_menu_hover {
    +    background: url("../images/startmenu.png ") repeat scroll -264px -153px transparent;
    +}
    +.taskbar_start_menu li a {
    +    color: #FFFFFF;
    +    text-decoration: none;
    +}
    +.taskbar_start_separate_line {
    +    border-top: 1px solid #C5C5C5;
    +    font-size: 0;
    +    height: 1px;
    +    line-height: 0;
    +    width: 166px;
    +}
    +.startMenuTopControl_support {
    +    background-position: -165px -355px;
    +    display: block;
    +    float: left;
    +    height: 24px;
    +    margin-left: 10px;
    +    width: 24px;
    +}
    +.startMenuTopControl_support:hover {
    +    background-position: -216px -355px;
    +}
    +.startMenuTopControl_lock {
    +    background-position: -190px -355px;
    +    display: block;
    +    float: left;
    +    height: 24px;
    +    margin-left: 5px;
    +    width: 24px;
    +}
    +.startMenuTopControl_lock:hover {
    +    background-position: -241px -355px;
    +}
    +.taskbar_start_menu_body .logout_botton {
    +    background-position: -60px -355px;
    +    display: block;
    +    height: 35px;
    +    margin: auto;
    +    width: 35px;
    +}
    +.taskbar_start_menu_body .logout_botton:hover {
    +    background-position: -23px -355px;
    +}
    +.taskbar_start_button {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -480px -320px transparent;
    +    cursor: pointer;
    +    display: inline;
    +    float: left;
    +    height: 40px;
    +    margin: -20px 0 0 1px;
    +    position: relative;
    +    width: 40px;
    +}
    +.api_sharefreind {
    +    left: 0;
    +    position: absolute;
    +    top: 0;
    +    z-index: 100;
    +}
    +.appButton {
    +    color: white;
    +    cursor: pointer;
    +    display: inline;
    +    float: left;
    +    font-size: 12px;
    +    height: 88px;
    +    position: relative;
    +    width: 88px;
    +}
    +
    +.desktopSmallIcon .appListContainer .appButton {
    +    height: 60px;
    +    width: 60px;
    +}
    +.desktopSmallIcon .appListContainer .appButton_appIcon {
    +    height: 32px;
    +    margin: 3px auto 0;
    +    width: 32px;
    +}
    +.desktopSmallIcon .appListContainer .appButton_appName {
    +    margin: 3px 0 0;
    +}
    +.desktopSmallIcon .appListContainer .appButton_appName_inner {
    +    max-width: 50px;
    +}
    +.desktopSmallIcon .appListContainer .modify_name {
    +    padding-left: 5px;
    +    width: 45px;
    +}
    +.desktopSmallIcon .appButton:hover, .appButtonEditState .desktopSmallIcon .appButton, .appButtonEditState .desktopSmallIcon .addQuickLinkButton:hover {
    +    background: url("./images/appbutton_mouseover_bg6.png?t=20111011001") no-repeat scroll 0 0 transparent;
    +}
    +.desktopSmallIcon .addQuickLinkButtonInner {
    +    background-position: -280px -500px;
    +    height: 32px;
    +    margin: 3px auto 0;
    +    width: 32px;
    +}
    +.desktopSmallIcon .addQuickLinkButton .appButton_appName {
    +    margin-top: 3px;
    +}
    +.appButtonEditState .desktopSmallIcon .addQuickLinkButtonInner {
    +    background-position: -320px -500px;
    +}
    +.desktopSmallIcon .appListContainer .appButton_notify {
    +    right: 5px;
    +    top: -5px;
    +}
    +.desktopSmallIcon .appListContainer .appButton_appIcon_warp {
    +    background-image: url("./images/iconbg_3.png");
    +}
    +.desktopSmallIcon .appListContainer .appButton_smallIcon {
    +    margin: 8px;
    +}
    +.appListContainer {
    +}
    +.appListContainer .appButton {
    +    position: absolute;
    +}
    +.appListContainer .appButton_appIcon {
    +    margin-top: 6px;
    +}
    +.appListContainer .appButton_appName {
    +    overflow: visible;
    +}
    +.appButton_appName_inner_right {
    +    display: none;
    +}
    +.appListContainer .appButton_appName_inner {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -80px -560px transparent;
    +    display: inline-block;
    +    height: 20px;
    +    line-height: 18px;
    +    /*: 0 -4px 0 0;*/
    +    max-width: 78px;
    +    overflow: hidden;
    +    padding: 0;
    +    position: relative;
    +    text-indent: 10px;
    +    vertical-align: middle;
    +    width: auto;
    +}
    +.appListContainer .appButton_appName_inner_right {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -166px -560px transparent;
    +    display: inline-block;
    +    height: 20px;
    +    margin: 0;
    +    padding: 0;
    +    vertical-align: middle;
    +    width: 10px;
    +}
    +.ie .appListContainer .appButton_appName_inner {
    +    line-height: 20px;
    +}
    +.ie7_0 .appListContainer .appButton_appName_inner {
    +    float: left;
    +    margin-left: 5px;
    +    width: 68px;
    +}
    +.ie7_0 .appListContainer .appButton_appName_inner_right {
    +    float: left;
    +}
    +.ie6_0 .appListContainer .appButton_appName_inner {
    +    display: block;
    +    margin: 0 5px;
    +    text-indent: 0;
    +}
    +.ie6_0 .appListContainer .appButton_appName_inner_right {
    +    display: none;
    +}
    +.appListContainer .modify_name {
    +    padding-left: 10px;
    +    text-indent: 0;
    +    width: 68px;
    +}
    +.ie7_0 .appListContainer .modify_name {
    +    margin-left: 0;
    +    width: 68px;
    +}
    +.ie6_0 .appListContainer .modify_name {
    +    padding-left: 0;
    +    width: auto;
    +}
    +.appListContainer .scrollBar {
    +    background: none repeat scroll 0 0 #CCCCCC;
    +    border-radius: 5px 5px 5px 5px;
    +    height: 20px;
    +    position: absolute;
    +    right: 3px;
    +    top: 0;
    +    width: 10px;
    +}
    +.appListContainer .scrollBar_bg {
    +    border: 0 none;
    +    display: block;
    +    margin: 0;
    +    padding: 0;
    +    position: absolute;
    +}
    +.appListContainer .scrollBar_bg_t {
    +    background: url("../images/scrollbar_bg.gif") no-repeat scroll 0 0 transparent;
    +    height: 5px;
    +    overflow: hidden;
    +    top: -5px;
    +    width: 10px;
    +}
    +.appListContainer .scrollBar_bg_b {
    +    background: url("../images/scrollbar_bg.gif") no-repeat scroll 0 -5px transparent;
    +    bottom: -5px;
    +    height: 5px;
    +    overflow: hidden;
    +    width: 10px;
    +}
    +.documentMode_9 .scrollBar_bg, .documentMode_9 .scrollBar_bg_t, .documentMode_9 .scrollBar_bg_b {
    +    display: none;
    +}
    +.appButton_appIcon {
    +    background-position: center center;
    +    background-repeat: no-repeat;
    +    cursor: pointer;
    +    height: 48px;
    +    margin: 0 auto;
    +    overflow: hidden;
    +    position: relative;
    +    width: 48px;
    +}
    +.appButton_appIcon_warp {
    +    background-image: url("../images/iconbg_4.png");
    +}
    +.ie6_0 .appButton_appIcon_warp {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.appButton_appIconImg {
    +    background-position: center center;
    +    background-repeat: no-repeat;
    +    height: 100%;
    +    overflow: hidden;
    +    position: relative;
    +    width: 100%;
    +}
    +.appButtonIpadincompatible {
    +    opacity: 0.3;
    +}
    +.appButton_smallIcon {
    +    height: 16px;
    +    margin: 16px;
    +    width: 16px;
    +}
    +.appButton_stateIcon {
    +    bottom: -6px;
    +    height: 16px;
    +    overflow: hidden;
    +    position: absolute;
    +    right: -2px;
    +    width: 12px;
    +}
    +.appButton_contactIcon, .appButton_contactIcon .appButton_appIconImg {
    +    border-radius: 5px 5px 5px 5px;
    +}
    +.appButton_loadingIcon {
    +    background: url("../images/ico_loading2.gif ") no-repeat scroll 0 0 transparent;
    +    height: 16px;
    +    left: 50%;
    +    margin-left: -8px;
    +    margin-top: -8px;
    +    overflow: hidden;
    +    position: absolute;
    +    top: 50px;
    +    width: 16px;
    +}
    +.appButton_appName {
    +    color: white;
    +    cursor: pointer;
    +    height: 20px;
    +    margin: 8px 0 0;
    +    overflow: hidden;
    +    text-align: center;
    +}
    +.ie .appButton_appName {
    +    line-height: 20px;
    +    margin-top: 7px;
    +}
    +.appButton_appName_inner {
    +    margin: auto;
    +    overflow: hidden;
    +    width: 50px;
    +}
    +.appButton_appName_longfix {
    +    display: block;
    +    text-align: left;
    +    width: 1000px;
    +}
    +.appButton_delete {
    +    background: url("../images/portal_all_png.png") no-repeat scroll 0 -560px transparent;
    +    cursor: pointer;
    +    display: none;
    +    font-size: 0;
    +    height: 20px;
    +    line-height: 1;
    +    overflow: hidden;
    +    position: absolute;
    +    right: -6px;
    +    top: -6px;
    +    width: 20px;
    +    z-index: 10;
    +}
    +.ie6_0 .appButton_delete {
    +    background-image: url("../images/portal_all_gif.gif");
    +}
    +.appListContainer .appButton_delete, .dock_container .appButton_delete {
    +    background-position: -30px -560px;
    +    height: 24px;
    +    right: -10px;
    +    top: -10px;
    +    width: 24px;
    +}
    +.appButton_notify {
    +    background: url("../images/portal_all_png.png") no-repeat scroll 10000px 0 transparent;
    +    cursor: pointer;
    +    display: none;
    +    font-size: 11px;
    +    height: 12px;
    +    line-height: 12px;
    +    overflow: hidden;
    +    position: absolute;
    +    right: -5px;
    +    text-align: center;
    +    top: -5px;
    +}
    +.ie6_0 .appButton_notify {
    +    background-image: url("../images/portal_all_gif.gif");
    +}
    +.appButton_notify_1 {
    +    background-position: -60px -290px;
    +    width: 16px;
    +}
    +.appButton_notify_2 {
    +    background-position: -90px -290px;
    +    width: 20px;
    +}
    +.appButton_notify_3 {
    +    background-position: -120px -290px;
    +    width: 24px;
    +}
    +.appListContainer .appButton_notify, .dock_container .appButton_notify {
    +    right: 15px;
    +    top: 2px;
    +}
    +.dock_container .appButton_notify {
    +    right: 0;
    +}
    +.appListContainer .appButton_notify .appButton_notify_inner, .dock_container .appButton_notify .appButton_notify_inner {
    +    display: block;
    +}
    +.appButton:hover, .appButtonEditState .appButton, .appButtonEditState .addQuickLinkButton:hover {
    +    background: url("../images/appbutton_mouseover_bg3.png") no-repeat scroll 1px 0 transparent;
    +}
    +.dock_container .appButton:hover, .dock_container .appButtonEditState .appButton, .aMg_dock_container .appButton:hover {
    +    background: url("../images/appbutton_mouseover_bg4.png") no-repeat scroll center center transparent;
    +}
    +.dock_container .appButton {
    +    height: 58px;
    +    margin: 2px 3px 2px 4px;
    +    padding: 0;
    +    width: 58px;
    +}
    +.dock_container .appButton_appName {
    +    display: none;
    +}
    +.dock_container .appButton_appIcon, .aMg_dock_container .appButton_appIcon {
    +    margin: 5px auto 0;
    +}
    +.appButtonEditState .not_deleteable {
    +    background: none repeat scroll 0 0 transparent !important;
    +}
    +.appButtonEditState .not_deleteable:hover {
    +    background: none repeat scroll 0 0 transparent !important;
    +}
    +.ie6_0 .appButtonEditState .appButton {
    +    background: none repeat scroll 0 0 #BABABA;
    +}
    +.appButtonEditState .appButton_delete {
    +    display: block;
    +}
    +.appButtonEditState .not_deleteable .appButton_delete {
    +    display: none;
    +}
    +.appButtonEditState .appButton_notify {
    +    display: none !important;
    +}
    +.appButtonHover {
    +    background: none repeat scroll 0 0 #BABABA;
    +}
    +#desktopWrapper {
    +    position: relative;
    +    top: 0;
    +}
    +#navbar {
    +    position: relative;
    +    text-align: center;
    +    top: 10px;
    +    width: 400px;
    +}
    +.navbarSetTopIcon {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -100px -459px transparent;
    +}
    +.indicator_wrapper {
    +    height: 100%;
    +    left: 0;
    +    position: absolute;
    +    top: 25px;
    +}
    +.indicator_container {
    +    height: 100%;
    +}
    +.pagelet_search_bar{
    +	top:40px;
    +	left:50%;
    +	margin-left: -112px;
    +}
    +.indicator {
    +    background-position: 10000px 10000px;
    +    color: #FFFFFF;
    +    cursor: pointer;
    +    display: inline-block;
    +    float: left;
    +    font-family: 锟斤拷锟斤拷;
    +    font-size: 18px;
    +    font-weight: bold;
    +    height: 20px;
    +    line-height: 1.5;
    +    margin: 1px 2px 0;
    +    outline: 0 none;
    +    position: relative;
    +   /* text-indent: -999em;*/
    +    width: 20px;
    +}
    +.indicator_icon {
    +    float: left;
    +    height: 100%;
    +    overflow: hidden;
    +    position: relative;
    +    width: 100%;
    +    z-index: 1;
    +}
    +.indicatorhover{
    +height: 26px;
    +left: -6px;
    +position: absolute;
    +top: -1px;
    +width: 26px;
    +z-index: 12;
    +}
    +.indicator_header {
    +    background-position: -418px -158px;
    +    display: inline;
    +    height: 32px;
    +    margin: -10px 0 0 6px;
    +    position: relative;
    +    width: 32px;
    +}
    +.indicator_header_img {
    +    display: inline;
    +    float: left;
    +    height: 24px;
    +    margin: 4px 0 0 4px;
    +    width: 24px;
    +}
    +.indicator_manage, .indicator_search {
    +    /*float: right;*/
    +    height: 24px;
    +    width: 24px;
    +}
    +.indicator_manage {
    +    background-position: -132px -157px;
    +    margin: 2px 5px;
    +}
    +.indicator_manage:hover {
    +    background-position: -207px -157px;
    +}
    +.indicator_search {
    +    background-position: -240px -157px;
    +    margin: 2px 8px 2px 0;
    +}
    +.indicator_search:hover {
    +    background-position: -320px -157px;
    +}
    +#navbar .left_nav, #navbar .right_nav {
    +    margin: 2px 0;
    +    overflow: hidden;
    +    text-indent: -2000px;
    +    width: 20px;
    +}
    +#navbar .leftbg {
    +    left: 0;
    +}
    +#navbar .rightbg {
    +    right: 0;
    +}
    +#navbar .system_button {
    +    height: 27px;
    +    margin: 0 3px;
    +    width: 27px;
    +}
    +#navbar .system_button:hover {
    +    background-position: -156px -98px;
    +}
    +.mac #navbar .system_button {
    +    background-position: -186px -98px;
    +}
    +.mac #navbar .system_button:hover {
    +    background-position: -216px -98px;
    +}
    +.linux #navbar .system_button {
    +    background-position: -246px -98px;
    +}
    +.linux #navbar .system_button:hover {
    +    background-position: -276px -98px;
    +}
    +.indicator_bg_corner {
    +    height: 26px;
    +    position: absolute;
    +    width: 11px;
    +}
    +.indicator_icon_1 {
    +    background-position: -336px -132px;
    +}
    +.indicator_icon_2 {
    +    background-position: -366px -132px;
    +}
    +.indicator_icon_3 {
    +    background-position: -396px -132px;
    +}
    +.indicator_icon_4 {
    +    background-position: -426px -132px;
    +}
    +.indicator_icon_5 {
    +    background-position: -456px -132px;
    +}
    +.indicator_icon_1:hover {
    +    background-position: -140px -132px;
    +}
    +.indicator_icon_2:hover {
    +    background-position: -180px -132px;
    +}
    +.indicator_icon_3:hover {
    +    background-position: -220px -132px;
    +}
    +.indicator_icon_4:hover {
    +    background-position: -260px -132px;
    +}
    +.indicator_icon_5:hover {
    +    background-position: -300px -132px;
    +}
    +#navbar .nav_current_1 .indicator_icon_1 {
    +    background-position: -140px -132px;
    +}
    +#navbar .nav_current_2 .indicator_icon_2 {
    +    background-position: -180px -132px;
    +}
    +#navbar .nav_current_3 .indicator_icon_3 {
    +    background-position: -220px -132px;
    +}
    +#navbar .nav_current_4 .indicator_icon_4 {
    +    background-position: -260px -132px;
    +}
    +#navbar .nav_current_5 .indicator_icon_5 {
    +    background-position: -300px -132px;
    +}
    +.indicator_icon_bg {
    +    display: none;
    +    height: 26px;
    +    left: -8px;
    +    position: absolute;
    +    top: -6px;
    +    width: 26px;
    +    z-index: 1;
    +}
    +#navbar .nav_current_1 .indicator_1 .indicator_icon_bg, #navbar .nav_current_2 .indicator_2 .indicator_icon_bg, #navbar .nav_current_3 .indicator_3 .indicator_icon_bg, #navbar .nav_current_4 .indicator_4 .indicator_icon_bg, #navbar .nav_current_5 .indicator_5 .indicator_icon_bg 
    +,#navbar .nav_current_6 .indicator_6 .indicator_icon_bg
    +,#navbar .nav_current_7 .indicator_7 .indicator_icon_bg
    +,#navbar .nav_current_8 .indicator_8 .indicator_icon_bg
    +,#navbar .nav_current_9 .indicator_9 .indicator_icon_bg
    +,#navbar .nav_current_10 .indicator_10 .indicator_icon_bg
    +,#navbar .nav_current_11 .indicator_11 .indicator_icon_bg
    +,#navbar .nav_current_12 .indicator_12 .indicator_icon_bg
    +,#navbar .nav_current_13 .indicator_13 .indicator_icon_bg
    +,#navbar .nav_current_14 .indicator_14 .indicator_icon_bg
    +,#navbar .nav_current_15 .indicator_15 .indicator_icon_bg
    +,#navbar .nav_current_16 .indicator_16 .indicator_icon_bg
    +,#navbar .nav_current_17 .indicator_17 .indicator_icon_bg
    +,#navbar .nav_current_18 .indicator_18 .indicator_icon_bg
    +,#navbar .nav_current_19 .indicator_19 .indicator_icon_bg
    +,#navbar .nav_current_20 .indicator_20 .indicator_icon_bg
    +,#navbar .nav_current_21 .indicator_21 .indicator_icon_bg
    +,#navbar .nav_current_22 .indicator_22 .indicator_icon_bg
    +,#navbar .nav_current_23 .indicator_23 .indicator_icon_bg
    +,#navbar .nav_current_24 .indicator_24 .indicator_icon_bg
    +,#navbar .nav_current_25 .indicator_25 .indicator_icon_bg
    +{
    +    background-position: -354px -154px;
    +    display: block;
    +}
    +.indicator:hover{
    +	color:#000000;
    +}
    +.ie6_0 #navbar .indicator_icon_bg {
    +    display: none !important;
    +}
    +.ie6_0 #navbar .nav_current_1 .indicator_1, .ie6_0 #navbar .nav_current_2 .indicator_2, .ie6_0 #navbar .nav_current_3 .indicator_3, .ie6_0 #navbar .nav_current_4 .indicator_4, .ie6_0 #navbar .nav_current_5 .indicator_5 {
    +    background-position: -360px -160px;
    +}
    +#desktopsContainer {
    +    left: 0;
    +    position: absolute;
    +    top: 0;
    +}
    +.desktopsContainer .desktopContainer {
    +    left: 2000px;
    +    overflow: visible;
    +    position: absolute;
    +}
    +.desktopsContainer .desktop_current {
    +    display: block;
    +    left: 0;
    +}
    +.webkit #desktopsContainer {
    +}
    +.webTop #desktopsContainer {
    +}
    +.webkit .desktopsContainer .desktopContainer {
    +    display: none;
    +}
    +.webkit .desktopsContainer .desktop_current {
    +    display: block;
    +    opacity: 1;
    +}
    +.webkit .desktopsContainer .desktop_current_noanimation {
    +    left: 0 !important;
    +}
    +.webkit .desktopsContainer .desktop_disappear_prepare1 {
    +    display: block;
    +    left: 0 !important;
    +    opacity: 1;
    +}
    +.webkit .desktopsContainer .desktop_disappear_animation1 {
    +    opacity: 0;
    +}
    +.webkit .desktopsContainer .desktop_show_prepare1 {
    +    opacity: 0;
    +}
    +.webkit .desktopsContainer .desktop_show_animation1 {
    +    left: 0 !important;
    +    opacity: 1;
    +}
    +.webkit .desktopsContainer .desktop_disappear_prepare2 {
    +    display: block;
    +    opacity: 1;
    +}
    +.webkit .desktopsContainer .desktop_disappear_animation2 {
    +    opacity: 0;
    +}
    +.webkit .desktopsContainer .desktop_show_prepare2 {
    +    left: 0 !important;
    +    opacity: 0;
    +}
    +.webkit .desktopsContainer .desktop_show_animation2 {
    +    opacity: 1;
    +}
    +.firefox .desktopsContainer .desktop_disappear_prepare1 {
    +    left: 0;
    +    opacity: 1;
    +}
    +.firefox .desktopsContainer .desktop_disappear_animation1 {
    +    -moz-transition: left 0.5s linear 0s, opacity 0.2s linear 0s;
    +    left: -2000px;
    +    opacity: 0;
    +}
    +.firefox .desktopsContainer .desktop_show_prepare1 {
    +    left: 2000px;
    +    opacity: 0;
    +}
    +.firefox .desktopsContainer .desktop_show_animation1 {
    +    -moz-transition: left 0.5s linear 0s, opacity 0.2s linear 0.25s;
    +    left: 0;
    +    opacity: 1;
    +}
    +.firefox .desktopsContainer .desktop_disappear_prepare2 {
    +    left: 0;
    +    opacity: 1;
    +}
    +.firefox .desktopsContainer .desktop_disappear_animation2 {
    +    -moz-transition: left 0.5s linear 0s, opacity 0.2s linear 0s;
    +    left: 2000px;
    +    opacity: 0;
    +}
    +.firefox .desktopsContainer .desktop_show_prepare2 {
    +    left: -2000px;
    +    opacity: 0;
    +}
    +.firefox .desktopsContainer .desktop_show_animation2 {
    +    -moz-transition: left 0.5s linear 0s, opacity 0.2s linear 0.25s;
    +    left: 0;
    +    opacity: 1;
    +}
    +#desktopWrapper .actions {
    +    height: 25px;
    +    margin: 7px 0 8px;
    +}
    +#desktopWrapper .actions .actionButton {
    +    display: inline-block;
    +    float: left;
    +    height: 25px;
    +    position: relative;
    +}
    +.appListContainer, .windowContainer {
    +    left: 0;
    +    min-height: 100px;
    +    min-width: 100px;
    +    overflow-y: auto;
    +    top: 0;
    +    width: 100%;
    +}
    +.appListContainer {
    +    overflow-y: hidden;
    +    position: relative;
    +}
    +.appListContainerInner {
    +    position: absolute;
    +}
    +.windowContainer {
    +    overflow: visible;
    +    position: absolute;
    +    top: 0;
    +}
    +.addQuickLinkButton {
    +    height: 88px;
    +    position: absolute;
    +    width: 88px;
    +}
    +.appButtonEditState .addQuickLinkButton {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.addQuickLinkButton .appButton_appName {
    +    margin-top: 8px;
    +}
    +.addQuickLinkButtonInner {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -380px -500px transparent;
    +    cursor: pointer;
    +    height: 50px;
    +    margin: 5px auto;
    +    width: 50px;
    +}
    +.ie6_0 .addQuickLinkButtonInner {
    +    background-image: url("../images/portal_all_gif.gif");
    +}
    +.appButtonEditState .addQuickLinkButtonInner {
    +    background-position: -460px -500px;
    +}
    +.pagelet_search_bar {
    +    background: none no-repeat scroll -140px -200px transparent;
    +    height: 33px;
    +    position: absolute;
    +    width: 212px;
    +    z-index: 20;
    +}
    +.pagelet_search_bar_top {
    +    background-position: -360px -200px;
    +}
    +.pagelet_search_input {
    +    background: none repeat scroll 0 0 transparent;
    +    border: 0 none;
    +    color: #FFFFFF;
    +    float: left;
    +    height: 20px;
    +    line-height: 20px;
    +    margin: 6px 0 0 7px;
    +    padding: 0;
    +    width: 170px !important;
    +}
    +.pagelet_search_button {
    +    background: none repeat scroll -238px -157px transparent;
    +    border: 0 none;
    +    cursor: pointer;
    +    float: right;
    +    height: 23px;
    +    margin: 5px 5px 0 0;
    +    padding: 0;
    +    width: 27px !important;
    +}
    +.pagelet_search_button:hover {
    +    background-position: -318px -157px;
    +}
    +.pagelet_search_pointer {
    +    background-position: -260px -200px;
    +    height: 9px;
    +    left: 155px;
    +    position: absolute;
    +    top: -9px;
    +    width: 15px;
    +}
    +.pagelet_search_delete {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -20px -560px transparent;
    +    cursor: pointer;
    +    height: 20px;
    +    position: absolute;
    +    right: 32px;
    +    top: 3px;
    +    width: 20px;
    +}
    +.sb_bgIfm {
    +    border: 0 none;
    +    display: none;
    +    height: 0;
    +    margin: 0;
    +    padding: 0;
    +    position: absolute;
    +    width: 214px;
    +    z-index: 9999;
    +}
    +.pagelet_search_suggest {
    +    background: none repeat scroll 0 50% transparent;
    +    display: none;
    +    position: absolute;
    +    width: 212px;
    +    z-index: 10000;
    +}
    +.pagelet_search_suggest a {
    +    color: #FFFFFF;
    +    display: block;
    +    height: 28px;
    +    margin-left: 1px;
    +    outline: 0 none;
    +    width: 210px;
    +}
    +.pagelet_search_suggest a:hover, .pagelet_search_suggest .rsSeledBg {
    +    background-position: -141px -240px;
    +}
    +.pagelet_search_suggest .sb_page, .pagelet_search_suggest .sb_app {
    +    width: 212px;
    +}
    +.pagelet_search_suggest .sb_page {
    +    background-position: -140px -330px;
    +    height: 34px;
    +}
    +.pagelet_search_suggest .sb_app {
    +    background-position: -140px -300px;
    +    height: 28px;
    +    padding-top: 5px;
    +}
    +.pagelet_search_suggest_top .sb_page {
    +    background-position: -360px -330px;
    +    position: absolute;
    +    top: -33px;
    +}
    +.pagelet_search_suggest_top .sb_app {
    +    background-position: -360px -300px;
    +    position: absolute;
    +    top: -66px;
    +}
    +.pagelet_search_suggest .sb_pageIcon, .pagelet_search_suggest .sb_appIcon {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -423px -558px transparent;
    +    cursor: pointer;
    +    float: left;
    +    height: 25px;
    +    width: 30px;
    +}
    +.pagelet_search_suggest .sb_page .sb_pageTxt, .pagelet_search_suggest .sb_app .sb_appTxt {
    +    cursor: pointer;
    +    display: block;
    +    height: 28px;
    +    line-height: 28px;
    +    padding-left: 12px;
    +    vertical-align: middle;
    +}
    +.pagelet_search_suggest .sb_appIcon {
    +    background: url("../images/portal_all_png.png") no-repeat scroll -377px -558px transparent;
    +}
    +.ie6_0 .pagelet_search_suggest .sb_pageIcon {
    +    background: url("../images/portal_all_gif.gif") no-repeat scroll -423px -558px transparent;
    +}
    +.ie6_0 .pagelet_search_suggest .sb_appIcon {
    +    background: url("../images/portal_all_gif.gif") no-repeat scroll -377px -558px transparent;
    +}
    +.pagelet_search_suggest ul {
    +    color: #FFFFFF;
    +    line-height: 0;
    +    list-style: none outside none;
    +    margin: 0;
    +    padding: 0;
    +}
    +.pagelet_search_suggest li {
    +    list-style: none outside none;
    +    overflow: hidden;
    +    vertical-align: middle;
    +}
    +.pagelet_search_suggest li a {
    +    display: block;
    +}
    +.pagelet_search_suggest li a .listInner {
    +    cursor: pointer;
    +    height: 28px;
    +    line-height: 28px;
    +    overflow: hidden;
    +    padding-left: 12px;
    +    text-overflow: ellipsis;
    +    vertical-align: middle;
    +    white-space: nowrap;
    +    width: 190px;
    +}
    +.ie6_0 .pagelet_search_suggest li a .listInner {
    +    background: url("../images/portal_all_gif.gif") no-repeat scroll -490px -558px transparent;
    +}
    +.flashContent {
    +    height: 1px;
    +    left: -9999px;
    +    position: absolute;
    +    top: -9999px;
    +    width: 1px;
    +    z-index: 1000000;
    +}
    +.airInstallPopup {
    +    color: #000000;
    +    font-family: serif;
    +    height: 300px;
    +    text-align: left;
    +    width: 400px;
    +}
    +.airInstallPopupContent {
    +    left: 0;
    +    position: absolute;
    +    top: 0;
    +}
    +.airInstallPopup .mylinks {
    +    font-size: 12px;
    +    left: 40px;
    +    margin: 0;
    +    position: absolute;
    +    top: 214px;
    +}
    +.airInstallPopup .mylinks a {
    +    color: #1B86E1;
    +    text-decoration: none;
    +}
    +.airInstallPopup .mylinks a:hover {
    +    text-decoration: underline;
    +}
    +.airInstallPopup .mylinks span {
    +    color: #A0A0A0;
    +    width: 200px;
    +}
    +.airInstallPopup .mytip {
    +    font-size: 12px;
    +    left: 0;
    +    position: absolute;
    +    top: 172px;
    +}
    +.airInstallPopup .mytip2 {
    +    background: url("../images/air_install_point.png") no-repeat scroll 0 0 transparent;
    +    font-size: 12px;
    +    left: 2px;
    +    padding-left: 18px;
    +    position: absolute;
    +    top: 192px;
    +}
    +.airInstallPopup .link2 {
    +    margin-top: 5px;
    +}
    +.webtop_down_link_win, .webtop_down_link_mac, .webtop_down_link_linux {
    +    display: none;
    +}
    +.win .webtop_down_link_win, .mac .webtop_down_link_mac, .linux .webtop_down_link_linux {
    +    display: inline;
    +}
    +#airCloseTip {
    +    display: none;
    +    font-size: 14px;
    +    left: 2px;
    +    position: absolute;
    +    top: 180px;
    +}
    +.airInstallPopup .myBtn {
    +    background: url("../images/air_install_btn.png") no-repeat scroll 0 0 transparent;
    +    color: #000000;
    +    display: block;
    +    height: 23px;
    +    line-height: 23px;
    +    margin: 15px auto 0;
    +    text-align: center;
    +    text-decoration: none;
    +    width: 66px;
    +}
    +.airInstallPopup .myBtn:hover {
    +    background-position: -76px 0;
    +    text-decoration: none;
    +}
    +.airInstallPopup .closeText {
    +    background: url("../images/air_install_point.png") no-repeat scroll 0 0 transparent;
    +    padding-left: 20px;
    +}
    +#airWebTopDownload {
    +    position: absolute;
    +}
    +#airWebTopDownloadIcon {
    +    background: url("../images/air_download_icon.png") no-repeat scroll 0 0 transparent;
    +    cursor: pointer;
    +    height: 16px;
    +    position: absolute;
    +    right: -16px;
    +    top: 1px;
    +    width: 16px;
    +}
    +.ie6_0 #airWebTopDownloadIcon {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.air_tip_bubble .bubble_tip_content {
    +    padding-right: 0;
    +}
    +.webtop-sysbtn-thumb {
    +    background: none no-repeat scroll 0 0 transparent;
    +    height: 109px;
    +    margin: 0 auto;
    +    width: 171px;
    +}
    +.win .webtop-sysbtn-thumb {
    +    background-image: url("../images/webtop_win_thumb.jpg");
    +}
    +.linux .webtop-sysbtn-thumb {
    +    background-image: url("../images/webtop_linux_thumb.jpg");
    +}
    +.mac .webtop-sysbtn-thumb {
    +    background-image: url("../images/webtop_mac_thumb.jpg");
    +}
    +.appbar_container {
    +    background: none repeat scroll 0 0 #FFFFFF;
    +    height: 50px;
    +    width: 100%;
    +}
    +.appbar_alert {
    +    font-size: 12px;
    +    line-height: 50px;
    +    margin: auto;
    +    text-align: center;
    +}
    +.ui_messageBox {
    +    background: none repeat scroll 0 0 #FFFFFF;
    +}
    +.bottomBarBg {
    +    background: url("../images/bg_task_main.png") repeat-x scroll 0 0 transparent;
    +    bottom: 0;
    +    height: 130px;
    +    position: absolute;
    +    width: 100%;
    +}
    +.ie6_0 .bottomBarBg {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.bottomBarBgTask {
    +    background: url("../images/bg_task_b.png") repeat-x scroll 0 41px transparent;
    +    bottom: 0;
    +    height: 64px;
    +    position: absolute;
    +    width: 100%;
    +}
    +.ie6_0 .bottomBarBgTask {
    +    background-color: #000000;
    +    height: 23px;
    +    opacity: 20;
    +}
    +.bottomBar {
    +    bottom: 0;
    +    height: 64px;
    +    position: absolute;
    +    right: 0;
    +}
    +.taskMenuMask {
    +    bottom: 47px;
    +    left: 0;
    +    opacity: 1;
    +    position: absolute;
    +    width: 114px;
    +    z-index: 99;
    +}
    +.taskMenuBox {
    +    bottom: 47px;
    +    left: 0;
    +    position: absolute;
    +    width: 114px;
    +    z-index: 100;
    +}
    +.taskContainer {
    +    float: right;
    +    height: 64px;
    +    overflow: hidden;
    +    width: 200px;
    +}
    +.ie6_0 .taskContainer {
    +    position: relative;
    +}
    +.ie7_0 .taskContainer {
    +    position: relative;
    +}
    +.taskContainerInner {
    +    -moz-transition: margin-right 0.5s ease 0s;
    +    float: right;
    +    height: 100%;
    +}
    +.ie6_0 .taskContainerInner {
    +    position: absolute;
    +    right: 0;
    +}
    +.ie7_0 .taskContainerInner {
    +    position: absolute;
    +    right: 0;
    +}
    +.bottomBar .taskGroup {
    +    -moz-transition: width 0.5s ease 0s;
    +    float: right;
    +    height: 100%;
    +    overflow: hidden;
    +    width: 0;
    +}
    +.bottomBar .taskGroupAnaWidth {
    +    width: 114px;
    +}
    +.bottomBar .taskGroupAnaOpacity {
    +    -moz-transform-origin: left center;
    +    -moz-transition: -moz-transform 0.2s ease 0s;
    +    opacity: 100;
    +}
    +.bottomBar .taskGroupAnaScale {
    +    -moz-transform: scale(1, 1);
    +}
    +.taskItem {
    +    background: url("../images/bg_task_nor.png") no-repeat scroll 0 0 transparent;
    +    display: block;
    +    float: left;
    +    height: 100%;
    +    margin: 0 1px;
    +    vertical-align: middle;
    +    width: 112px;
    +}
    +.ie6_0 .taskItem {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.bottomBar .taskGroup .taskItem:hover {
    +    background: url("../images/bg_task_over.png") no-repeat scroll 0 0 transparent;
    +}
    +.ie6_0 .bottomBar .taskGroup .taskItem:hover {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.bottomBar .taskCurrent .taskItem {
    +    background: url("../images/bg_task_cur.png") no-repeat scroll 0 0 transparent;
    +}
    +.ie6_0 .bottomBar .taskCurrent .taskItem {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.bottomBar .taskJumpUp .taskItem {
    +    background: url("../images/bg_task_msg.png") no-repeat scroll 0 0 transparent;
    +}
    +.ie6_0 .bottomBar .taskJumpUp .taskItem {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.taskItem div {
    +    cursor: pointer;
    +}
    +.taskItemIcon {
    +    background-position: center center;
    +    background-repeat: no-repeat;
    +    cursor: pointer;
    +    float: left;
    +    height: 32px;
    +    margin: 22px 5px;
    +    width: 32px;
    +}
    +.ie6_0 .taskItemIcon {
    +    margin: 22px 3px;
    +}
    +.taskItemIcon img {
    +    cursor: pointer;
    +    float: left;
    +    height: 32px;
    +    width: 32px;
    +}
    +.taskItem_offline .taskItemIcon img {
    +    opacity: 0.5;
    +}
    +.taskItemTxt {
    +    color: #FFFFFF;
    +    cursor: pointer;
    +    float: left;
    +    height: 36px;
    +    line-height: 36px;
    +    margin-top: 27px;
    +    overflow: hidden;
    +    width: 70px;
    +}
    +.taskMenuBox .taskItem {
    +    background: url("../images/bg_task_group_m.png") no-repeat scroll 0 0 transparent;
    +    height: 40px;
    +}
    +.ie6_0 .taskMenuBox .taskItem {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.taskMenuBox .taskItem:hover {
    +    background: url("../images/bg_task_group_m_over.png") no-repeat scroll 0 0 transparent;
    +}
    +.ie6_0 .taskMenuBox .taskItem:hover {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.taskMenuBox .taskItem .taskItemIcon {
    +    margin: 4px 5px;
    +}
    +.ie6_0 .taskMenuBox .taskItem .taskItemIcon {
    +    margin: 4px 3px;
    +}
    +.taskMenuBox .taskItem .taskItemTxt {
    +    line-height: 40px;
    +    margin-top: 0;
    +}
    +.taskMenuBox .fistTaskItem {
    +    background: url("../images/bg_task_group_t.png") no-repeat scroll 0 0 transparent;
    +}
    +.ie6_0 .taskMenuBox .fistTaskItem {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.taskMenuBox .fistTaskItem:hover {
    +    background: url("../images/bg_task_group_t_over.png") no-repeat scroll 0 0 transparent;
    +}
    +.ie6_0 .taskMenuBox .fistTaskItem:hover {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.taskMenuBox .taskItemHight {
    +    background: url("../images/bg_task_group_m_msg.png") no-repeat scroll 0 0 transparent;
    +}
    +.taskMenuBox .firstTaskItemHight {
    +    background: url("../images/bg_task_group_t_msg.png") no-repeat scroll 0 0 transparent;
    +}
    +.ie6_0 .taskMenuBox .taskItemHight {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.ie6_0 .taskMenuBox .firstTaskItemHight {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.taskMenuContentBox {
    +    height: 100%;
    +    margin-top: 0;
    +    overflow: hidden;
    +    width: 100%;
    +}
    +.taskMenuContentInner {
    +    float: left;
    +    height: auto;
    +    width: 100%;
    +}
    +.taskMenuContentInnerAnm {
    +    -moz-transition: margin-top 0.5s ease 0s;
    +}
    +.taskMenuUp, .taskMenuDown {
    +    background-color: #006600;
    +    display: block;
    +    float: left;
    +    height: 20px;
    +    margin: 0 1px;
    +    outline: 0 none;
    +    width: 100%;
    +}
    +.taskMenuUp {
    +    background: url("../images/taskmenu_up.png") no-repeat scroll 0 0 transparent;
    +}
    +.taskMenuDown {
    +    background: url("../images/taskmenu_down.png") no-repeat scroll 0 0 transparent;
    +}
    +.ie6_0 .taskMenuUp {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.ie6_0 .taskMenuDown {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.taskMenuUp:hover {
    +    background: url("../images/taskmenu_up_over.png") no-repeat scroll 0 0 transparent;
    +}
    +.taskMenuDown:hover {
    +    background: url("../images/taskmenu_down_over.png") no-repeat scroll 0 0 transparent;
    +}
    +.ie6_0 .taskMenuUp:hover {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.ie6_0 .taskMenuDown:hover {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.taskMenuUpDisable, .taskMenuUpDisable:hover {
    +    background: url("../images/taskmenu_up_disable.png") no-repeat scroll 0 0 transparent;
    +}
    +.taskMenuDownDisable, .taskMenuDownDisable:hover {
    +    background: url("../images/taskmenu_down_disable.png") no-repeat scroll 0 0 transparent;
    +}
    +.ie6_0 .taskMenuUpDisable, .ie6_0 .taskMenuUpDisable:hover {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.ie6_0 .taskMenuDownDisable, .ie6_0 .taskMenuDownDisable:hover {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.taskMenuUpDisable, .taskMenuDownDisable {
    +    cursor: default;
    +}
    +.taskDockMargin {
    +    float: right;
    +    height: 100%;
    +}
    +.taskNextBox {
    +    background: url("../images/bg_task_page_r.png") no-repeat scroll 0 0 transparent;
    +    display: none;
    +    float: right;
    +    height: 100%;
    +    margin-left: 2px;
    +    overflow: hidden;
    +    width: 54px;
    +}
    +.taskPreBox {
    +    background: url("../images/bg_task_page_l.png") no-repeat scroll 0 0 transparent;
    +    display: none;
    +    float: right;
    +    height: 100%;
    +    margin-right: 2px;
    +    overflow: hidden;
    +    width: 54px;
    +}
    +.ie6_0 .taskNextBox {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.ie6_0 .taskPreBox {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.taskPre {
    +    background: url("../images/bg_task_page.png") no-repeat scroll -15px -50px transparent;
    +    display: block;
    +    height: 35px;
    +    margin-left: 17px;
    +    margin-top: 20px;
    +    width: 20px;
    +}
    +.ie6_0 .taskPre {
    +    background: url("../images/bg_task_page.gif") no-repeat scroll -15px -50px transparent;
    +    position: relative;
    +}
    +.taskPre:hover {
    +    background-position: -15px -2px;
    +}
    +.taskPreDisable, .taskPreDisable:hover, .ie6_0 .taskPreDisable, .ie6_0 .taskPreDisable:hover {
    +    background-position: -15px -97px;
    +    cursor: default;
    +}
    +.taskNext {
    +    background: url("../images/bg_task_page.png") no-repeat scroll -65px -50px transparent;
    +    display: block;
    +    height: 35px;
    +    margin-left: 15px;
    +    margin-top: 20px;
    +    width: 45px;
    +}
    +.ie6_0 .taskNext {
    +    background: url("../images/bg_task_page.gif") no-repeat scroll -65px -50px transparent;
    +    position: relative;
    +}
    +.taskNext:hover {
    +    background-position: -65px -2px;
    +}
    +.taskNextDisable, .taskNextDisable:hover, .ie6_0 .taskNextDisable, .ie6_0 .taskNextDisable:hover {
    +    background-position: -66px -97px;
    +    cursor: default;
    +}
    +.taskGroupItem .taskItemCount {
    +    color: #990033;
    +    display: none;
    +    float: left;
    +    height: 36px;
    +    line-height: 36px;
    +    margin-top: 28px;
    +    overflow: hidden;
    +    text-align: center;
    +}
    +.taskGroupItem .taskItemGroupIcon {
    +    background: url("../images/bg_task_group_icon.png") no-repeat scroll 0 0 transparent;
    +    float: left;
    +    height: 10px;
    +    margin: 42px -10px;
    +    width: 5px;
    +}
    +.ie6_0 .taskGroupItem .taskItemGroupIcon {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.taskGroupItemOpen {
    +    background: url("../images/bg_task_group_b.png") no-repeat scroll 0 0 transparent;
    +    height: 47px;
    +    margin-top: 17px;
    +}
    +.bottomBar .taskGroup .taskGroupItemOpen:hover {
    +    background: url("../images/bg_task_group_b_over.png") no-repeat scroll 0 0 transparent;
    +    height: 47px;
    +    margin-top: 17px;
    +}
    +.bottomBar .taskCurrent .taskGroupItemOpen {
    +    background: url("../images/bg_task_group_b_cur.png") no-repeat scroll 0 0 transparent;
    +}
    +.taskGroupItemOpen .taskItemIcon {
    +    margin: 5px 5px 0;
    +}
    +.ie6_0 .taskGroupItemOpen .taskItemIcon {
    +    margin: 5px 3px 0;
    +}
    +.taskGroupItemOpen .taskItemCount {
    +    margin-top: 11px;
    +}
    +.taskGroupItemOpen .taskItemTxt {
    +    margin-top: 10px;
    +}
    +.taskGroupItemOpen .taskItemGroupIcon {
    +    margin-top: 25px;
    +}
    +.bottomBar .taskJumpUp .taskGroupItemOpen {
    +    background: url("../images/bg_task_group_b_msg.png") no-repeat scroll 0 0 transparent;
    +}
    +.ie6_0 .taskGroupItemOpen {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.ie6_0 .bottomBar .taskJumpUp .taskGroupItemOpen {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.taskItemIconState {
    +    background: url("../images/bg_task_eqq.gif") no-repeat scroll 0 0 transparent;
    +    display: none;
    +    float: left;
    +    height: 15px;
    +    margin: 20px 0 0 -15px;
    +    overflow: hidden;
    +   text-indent: -999em;
    +    width: 15px;
    +}
    +.ie6_0 .taskItemIconState {
    +    background: url("../images/bg_task_eqq.gif") no-repeat scroll 0 0 transparent;
    +}
    +.taskItem_callme .taskItemIconState {
    +    background-position: -67px 3px;
    +    display: inline;
    +}
    +.taskItem_online .taskItemIconState {
    +    background-position: 1px 3px;
    +}
    +.taskItem_away .taskItemIconState {
    +    background-position: -13px 3px;
    +    display: inline;
    +}
    +.taskItem_busy .taskItemIconState {
    +    background-position: -31px 3px;
    +    display: inline;
    +}
    +.taskItem_silent .taskItemIconState {
    +    background-position: -103px 3px;
    +    display: inline;
    +}
    +.taskItem_hidden .taskItemIconState {
    +    background-position: -49px 3px;
    +    display: inline;
    +}
    +.taskItem_offline .taskItemIconState {
    +    background-position: -86px 3px;
    +}
    +.appManagerPanel {
    +    display: none;
    +    height: 100%;
    +    left: 0;
    +    overflow: hidden;
    +    position: absolute;
    +    top: 0;
    +    width: 100%;
    +    z-index: 1000000;
    +}
    +.appManagerPanel .scrollBar {
    +    right: 1px;
    +}
    +.aMg_dock_container {
    +    background: url("../images/amg_top.png") repeat-x scroll 0 0 transparent;
    +    height: 60px;
    +    overflow: hidden;
    +    padding: 10px;
    +}
    +.ie7_0 .aMg_dock_container, .ie6_0 .aMg_dock_container {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.aMg_line_x {
    +    background: none repeat scroll 0 0 transparent;
    +    border-bottom: 1px solid #666666;
    +    font-size: 0;
    +    height: 0;
    +    width: 100%;
    +}
    +.aMg_line_y {
    +    background: url("../images/line_y.png") repeat-y scroll 0 0 transparent;
    +    height: 100%;
    +    left: -1px;
    +    position: absolute;
    +    top: 0;
    +    width: 3px;
    +}
    +.ie7_0 .aMg_line_y, .ie6_0 .aMg_line_y {
    +    background: none repeat scroll 0 0 #666666;
    +    width: 2px;
    +}
    +.aMg_folder_container {
    +    background: url("../images/amg_body.png") repeat scroll 0 0 transparent;
    +    overflow: hidden;
    +}
    +.ie7_0 .aMg_folder_container, .ie6_0 .aMg_folder_container {
    +    background: none repeat scroll 0 50% transparent;
    +}
    +.folderItem {
    +	width: 20%;
    +	height: 100%;
    +	overflow: hidden;
    +	float: left;
    +	border: 1px soild #666;
    +	position: relative;
    +	-webkit-transform: rotateY(70deg);
    +	-moz-transform: rotateY(70deg);
    +	-o-transform: rotateY(70deg);
    +	transform: rotateY(70deg);
    +	-webkit-transform-origin: center center;
    +	-moz-transform-origin: center center;
    +	-o-transform-origin: center center;
    +	transform-origin: center center;
    +	-webkit-transition: -webkit-transform .8s linear;
    +	-moz-transition: all .8s linear;
    +	-o-transition: all .8s linear;
    +	-transition: all.8s linear;
    +	-webkit-transform-origin-x: 50%;
    +	-webkit-transform-origin-y: 50%;
    +	-moz-transition-duration: 0.5s;
    +    -moz-transition-property: -moz-transform;
    +}
    +.folderItem_turn {
    +	-webkit-transform: rotateY(0deg);
    +	-moz-transform: rotateY(0deg);  	
    +}
    +.folder_bg {
    +    height: 100px;
    +    position: absolute;
    +    right: 0;
    +    top: 0;
    +    width: 70px;
    +}
    +.folder_bg1 {
    +    background: url("../images/amg_1.png ") no-repeat scroll right top transparent;
    +}
    +.folder_bg2 {
    +    background: url("../images/amg_2.png ") no-repeat scroll right top transparent;
    +}
    +.folder_bg3 {
    +    background: url("../images/amg_3.png ") no-repeat scroll right top transparent;
    +}
    +.folder_bg4 {
    +    background: url("../images/amg_4.png ") no-repeat scroll right top transparent;
    +}
    +.folder_bg5 {
    +    background: url("../images/amg_5.png ") no-repeat scroll right top transparent;
    +}
    +.folderOuter {
    +    height: 100%;
    +    overflow: hidden;
    +    position: relative;
    +}
    +.folderInner {
    +    margin: 10px 0;
    +    min-width: 180px;
    +    position: relative;
    +    z-index: 1;
    +    overflow: auto !important;
    +    /*update-end--Author:zhangguoming  Date:20140604 for锛氫簯妗岄潰鍏ㄥ眬瑙嗗浘锛屾坊鍔犵旱鍚戞粴鍔ㄦ潯*/
    +}
    +.amg_folder_appbutton {
    +    display: block;
    +    float: none;
    +    height: 30px;
    +    margin-bottom: 5px;
    +    width: auto;
    +}
    +.aMg_folder_container .appButton:hover, .aMg_folder_container .appButtonEditState .appButton {
    +    background: url("../images/appbutton_mouseover_bg5.png ") repeat-x scroll 0 0 transparent;
    +}
    +.amg_folder_appbutton .appButton_appIcon {
    +    background: none repeat scroll 0 0 transparent !important;
    +    display: inline;
    +    float: left;
    +    height: 26px;
    +    margin: 2px 0 0 20px;
    +    width: 26px;
    +}
    +.amg_folder_appbutton .appButton_appIconImg {
    +    height: 26px;
    +    margin: 0;
    +    width: 26px;
    +}
    +.amg_folder_appbutton .appButton_appName_inner {
    +    float: left;
    +    padding-left: 5px;
    +    text-align: left;
    +    width: 80px;
    +}
    +.amg_folder_appbutton .appButton_appName {
    +    float: left;
    +    margin-left: 10px;
    +    margin-top: 6px;
    +    text-align: left;
    +}
    +.aMg_dock_container .appButton {
    +    height: 60px;
    +    width: 70px;
    +}
    +.aMg_dock_container .appButton_appName {
    +    display: none;
    +}
    +.aMg_close {
    +    background: url("../images/back_normal.png ") repeat scroll 0 0 transparent;
    +    cursor: pointer;
    +    height: 37px;
    +    position: absolute;
    +    right: 10px;
    +    top: 25px;
    +    width: 90px;
    +}
    +.aMg_close:hover {
    +    background: url("../images/back_hover.png ") repeat scroll 0 0 transparent;
    +}
    +.aMg_close:active {
    +    background: url("../images/back_click.png ") repeat scroll 0 0 transparent;
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +.text, a.text {
    +	color: #666666;
    +}
    +.window_current .text, .window_current a.text {
    +	color: #333333;
    +}
    +.titleText, a.titleText {
    +	color: #6D6D6D;
    +	font-weight: bold;
    +}
    +.window_current .titleText, .window_current a.titleText {
    +	color: #393836;
    +}
    +.appText a {
    +	color: white;
    +}
    +.toolBar_bg {
    +	background: url("../images/toolbar_bg.png") repeat-x scroll left top transparent;
    +}
    +.ie6_0 .toolBar_bg, .ie7_0 .toolBar_bg {
    +}
    +.window {
    +	/*background: url("../images/transparent.gif") repeat scroll 0 0 transparent;*/
    +}
    +/*update-end--Author:zhangguoming  Date:20140617 for锛氫簯妗岄潰锛屼慨鏀归椤甸鏍兼椂鐨勬彁绀烘鏍峰紡*/
    +.window_title {
    +	height: 25px;
    +	text-align: center;
    +}
    +.window_titleBar {
    +	background: url("../images/titlebar_bg.png") repeat scroll 0 -1px transparent;
    +	height: 25px;
    +}
    +.window_current .window_titleBar {
    +	background: url("../images/titlebar_bg_cur.png") repeat scroll 0 -1px transparent;
    +}
    +.window_titleButtonBar {
    +	overflow: hidden;
    +	position: absolute;
    +	right: 5px;
    +	top: 4px;
    +}
    +.window_toolButtonBar {
    +	left: 0;
    +	overflow: hidden;
    +	position: absolute;
    +	top: 2px;
    +	z-index: 10;
    +}
    +.window_bodyArea {
    +	top: 0;
    +}
    +.window_controlArea {
    +	background: url("../images/controlbar_bg.png") repeat scroll 0 0 transparent;
    +}
    +.window_current .window_controlArea {
    +	background: url("../images/controlbar_bg_cur.png") repeat scroll 0 0 transparent;
    +}
    +.window_bodyOuter {
    +	background: none repeat scroll 0 0 #E9E9E9;
    +}
    +a.window_action_button {
    +	background: url("../images/sprite_main_png.png") no-repeat scroll -122px -22px transparent;
    +	height: 19px;
    +	width: 21px;
    +}
    +.ie6_0 a.window_action_button, .ie7_0 a.window_action_button {
    +	background-image: url("../images/sprite_main_gif.gif");
    +}
    +a.window_close {
    +	background-position: -64px -59px;
    +}
    +a.window_close:hover {
    +	background-position: -64px -30px;
    +}
    +a.window_max {
    +	background-position: -34px -59px;
    +}
    +a.window_max:hover {
    +	background-position: -34px -30px;
    +}
    +a.window_fullscreen {
    +	background-position: -34px -24px;
    +}
    +a.window_fullscreen:hover {
    +	background-position: -34px -53px;
    +}
    +a.window_restore_full {
    +	background-position: -152px -24px;
    +}
    +a.window_restore_full:hover {
    +	background-position: -152px -53px;
    +}
    +a.window_restore {
    +	background-position: -94px -59px;
    +}
    +a.window_restore:hover {
    +	background-position: -94px -30px;
    +}
    +a.window_min {
    +	background-position: -5px -58px;
    +}
    +a.window_min:hover {
    +	background-position: -5px -30px;
    +}
    +a.window_refresh {
    +	background-position: -5px -24px;
    +}
    +a.window_refresh:hover {
    +	background-position: -5px -53px;
    +}
    +a.window_pinUp {
    +	background-position: -182px -24px;
    +}
    +a.window_pinUp:hover {
    +	background-position: -182px -53px;
    +}
    +a.window_pinDown {
    +	background-position: -152px -24px;
    +}
    +a.window_pinDown:hover {
    +	background-position: -152px -53px;
    +}
    +a.window_button {
    +	background: url("../images/sprite_main_png.png") no-repeat scroll 0 -80px transparent;
    +}
    +a.window_button:hover {
    +	background-position: 0 -86px;
    +}
    +a.window_ok {
    +	background-position: 0 -86px;
    +	margin-right: 5px;
    +}
    +a.window_ok:hover {
    +	background-position: 0 -86px;
    +}
    +a.window_cancel {
    +	background-position: 0 -86px;
    +	margin-right: 5px;
    +}
    +a.window_cancel:hover {
    +	background-position: 0 -86px;
    +}
    +a.window_previous {
    +	background-position: 0 -86px;
    +}
    +a.window_previous:hover {
    +	background-position: 0 -86px;
    +}
    +a.window_next {
    +	background-position: 0 -86px;
    +}
    +a.window_next:hover {
    +	background-position: 0 -86px;
    +}
    +.window_bg_container_ipad {
    +	background-color: rgba(232, 232, 232, 0.8);
    +}
    +.window_current .window_bg_container_ipad {
    +	background-color: #E8E8E8;
    +}
    +.window_center {
    +	background: url("../images/window.png") repeat scroll left top transparent;
    +}
    +.ie6_0 .window_center, .ie7_0 .window_center {
    +	background: none repeat scroll 0 0 #C4C4C4;
    +}
    +.window_current .window_center {
    +	background: url("../images/window_cur.png") repeat scroll left top transparent;
    +}
    +.ie6_0 .window_current .window_center, .ie7_0 .window_current .window_center {
    +	background: none repeat scroll 0 0 #E8E8E8;
    +}
    +.window_t {
    +	background: url("../images/sprite_repeat_x_png.png") repeat-x scroll 0 -80px transparent;
    +}
    +.ie6_0 .window_t, .ie7_0 .window_t {
    +	background-image: url("../images/sprite_repeat_x_gif.gif");
    +}
    +.window_current .window_t {
    +	background-position: 0 -100px;
    +}
    +.window_rt {
    +	background: url("../images/sprite_main_png.png") no-repeat scroll -10px 0 transparent;
    +}
    +.ie6_0 .window_rt, .ie7_0 .window_rt {
    +	background-image: url("../images/sprite_main_gif.gif");
    +}
    +.window_current .window_rt {
    +	background-position: -30px 0;
    +}
    +.window_r {
    +	background: url("../images/sprite_repeat_y_png.png") repeat-y scroll -10px 0 transparent;
    +}
    +.ie6_0 .window_r, .ie7_0 .window_r {
    +	background-image: url("../images/sprite_repeat_y_gif.gif ");
    +}
    +.window_current .window_r {
    +	background-position: -30px 0;
    +}
    +.window_rb {
    +	background: url("../images/sprite_main_png.png") no-repeat scroll -10px -10px transparent;
    +}
    +.ie6_0 .window_rb, .ie7_0 .window_rb {
    +	background-image: url("../images/sprite_main_gif.gif");
    +}
    +.window_current .window_rb {
    +	background-position: -30px -10px;
    +}
    +.window_b {
    +	background: url("../images/sprite_repeat_x_png.png") repeat-x scroll 0 -90px transparent;
    +}
    +.ie6_0 .window_b, .ie7_0 .window_b {
    +	background-image: url("../images/sprite_repeat_x_gif.gif");
    +}
    +.window_current .window_b {
    +	background-position: 0 -110px;
    +}
    +.window_lb {
    +	background: url("../images/sprite_main_png.png") no-repeat scroll 0 -10px transparent;
    +}
    +.ie6_0 .window_lb, .ie7_0 .window_lb {
    +	background-image: url("../images/sprite_main_gif.gif");
    +}
    +.window_current .window_lb {
    +	background-position: -20px -10px;
    +}
    +.window_l {
    +	background: url("../images/sprite_repeat_y_png.png") repeat-y scroll 0 0 transparent;
    +}
    +.ie6_0 .window_l, .ie7_0 .window_l {
    +	background-image: url("../images/sprite_repeat_y_gif.gif");
    +}
    +.window_current .window_l {
    +	background-position: -20px 0;
    +}
    +.window_lt {
    +	background: url("../images/sprite_main_png.png") no-repeat scroll 0 0 transparent;
    +}
    +.ie6_0 .window_lt, .ie7_0 .window_lt {
    +	background-image: url("../images/sprite_main_gif.gif");
    +}
    +.window_current .window_lt {
    +	background-position: -20px 0;
    +}
    +.ie6_0 .statusBar_line, .ie7_0 .statusBar_line {
    +	background-image: url("../images/sprite_main_gif.gif");
    +}
    +.panel_1_center {
    +	background: url("../images/panel_1_c.png") repeat scroll left top transparent;
    +}
    +.ie6_0 .panel_1_center, .ie7_0 .panel_1_center {
    +	background: none repeat scroll 0 0 #FFFFFF;
    +}
    +.panel_1_t {
    +	background: url("../images/sprite_repeat_x_png.png") repeat-x scroll 0 -125px transparent;
    +}
    +.ie6_0 .panel_1_t, .ie7_0 .panel_1_t {
    +	background-image: url("../images/sprite_repeat_x_gif.gif");
    +}
    +.panel_1_rt {
    +	background: url("../images/sprite_main_png.png") no-repeat scroll -50px -5px transparent;
    +}
    +.ie6_0 .panel_1_rt, .ie7_0 .panel_1_rt {
    +	background-image: url("../images/sprite_main_gif.gif");
    +}
    +.panel_1_r {
    +	background: url("../images/sprite_repeat_y_png.png") repeat-y scroll -50px 0 transparent;
    +}
    +.ie6_0 .panel_1_r, .ie7_0 .panel_1_r {
    +	background-image: url("../images/sprite_repeat_y_gif.gif");
    +}
    +.panel_1_rb {
    +	background: url("../images/sprite_main_png.png") no-repeat scroll -50px -10px transparent;
    +}
    +.ie6_0 .panel_1_rb, .ie7_0 .panel_1_rb {
    +	background-image: url("../images/sprite_main_gif.gif");
    +}
    +.panel_1_b {
    +	background: url("../images/sprite_repeat_x_png.png ") repeat-x scroll 0 -130px transparent;
    +}
    +.ie6_0 .panel_1_b, .ie7_0 .panel_1_b {
    +	background-image: url("../images/sprite_repeat_x_gif.gif ");
    +}
    +.panel_1_lb {
    +	background: url("../images/sprite_main_png.png") no-repeat scroll -45px -10px transparent;
    +}
    +.ie6_0 .panel_1_lb, .ie7_0 .panel_1_lb {
    +	background-image: url("images/sprite_main_gif.gif");
    +}
    +.panel_1_l {
    +	background: url("../images/sprite_repeat_y_png.png") repeat-y scroll -45px 0 transparent;
    +}
    +.ie6_0 .panel_1_l, .ie7_0 .panel_1_l {
    +	background-image: url("../images/sprite_repeat_y_gif.gif");
    +}
    +.panel_1_lt {
    +	background: url("../images/sprite_main_png.png") no-repeat scroll -45px -5px transparent;
    +}
    +.ie6_0 .panel_1_lt, .ie7_0 .panel_1_lt {
    +	background-image: url("../images/sprite_main_gif.gif ");
    +}
    +#navbar {
    +	height: 40px;
    +	cursor: pointer;
    +}
    +.indicator_wrapper {
    +	/*background: url("../images/sprite_main_png.png") no-repeat scroll -140px -5px transparent;*/
    +	position: static;
    +	top: 0;
    +	
    +}
    +.indicator, .indicator_icon_bg, .indicator_icon {
    +	background-image: url("../images/sprite_main_png.png");
    +}
    +.no_sysbtn .indicator_wrapper {
    +	background-position: -140px -45px;
    +}
    +.no_sysbtn .indicator_header {
    +	margin-right: 6px;
    +}
    +#navbar .system_button {
    +	background: url("../images/sprite_main_png.png") no-repeat scroll 134px -98px transparent;
    +}
    +.pagelet_search_bar, .pagelet_search_button, #pagelet_search_suggest .sb_page, #pagelet_search_suggest .sb_app, #pagelet_search_suggest a:hover, #pagelet_search_suggest .rsSeledBg, .pagelet_search_pointer {
    +	background-image: url("../images/sprite_main_png.png");
    +}
    +#pagelet_search_suggest #sb_resultBox {
    +	background: url("../images/suggess_list_bg.png") repeat-y scroll 0 0 transparent;
    +}
    +.mobileSafari #navbar {
    +	width: 222px;
    +}
    +.mobileSafari #navbar .system_button {
    +	display: none;
    +	visibility: visible;
    +}
    diff --git a/src/main/webapp/plug-in/sliding/css/powerFloat.css b/src/main/webapp/plug-in/sliding/css/powerFloat.css
    new file mode 100644
    index 00000000..2c45a685
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/powerFloat.css
    @@ -0,0 +1,261 @@
    +@charset "utf-8";
    +
    +/* powerFloat */
    +.float_ajax_box {
    +	border: 1px solid #ccc;
    +	background-color: #fff;
    +}
    +
    +.float_loading {
    +	width: 100px;
    +	height: 100px;
    +	background: url(../image/loading.gif) no-repeat center;
    +}
    +
    +.float_ajax_image {
    +	padding: 5px;
    +}
    +
    +.float_ajax_error {
    +	width: 200px;
    +	padding: 40px 0;
    +	text-align: center;
    +}
    +
    +.float_list_ul {
    +	margin: 0;
    +	padding: 1px;
    +	border: 1px solid #beceeb;
    +	background-color: #fff;
    +	font-size: 12px;
    +	list-style-type: none;
    +}
    +
    +.float_list_a {
    +	display: block;
    +	text-decoration: none;
    +}
    +
    +.float_list_a:hover {
    +	background-color: #f0f3f9;
    +	color: #333;
    +	text-decoration: none;
    +}
    +
    +.float_list_ul li {
    +	line-height: 20px;
    +	border-top: 1px solid #f0f3f9;
    +	text-indent: 5px;
    +}
    +
    +.float_list_ul li:first-child {
    +	border-top: 0;
    +}
    +
    +.float_list_null {
    +	padding: 40px 20px;
    +	text-align: center;
    +}
    +
    +.float_remind_box {
    +	border: 1px solid #F7CE39;
    +	background: #ffffe0;
    +	padding: 5px 10px;
    +}
    +
    +.float_tip_box {
    +	line-height: 18px;
    +	padding: 0 3px;
    +	background-color: #ffffe0;
    +	-moz-box-shadow: 1px 1px 2px rgba(0, 0, 0, .4);
    +	-webkit-box-shadow: 1px 1px 2px rgba(0, 0, 0, .4);
    +	box-shadow: 1px 1px 2px rgba(0, 0, 0, .4);
    +	border: 1px solid #333;
    +	position: absolute;
    +}
    +
    +.float_doing_box {
    +	border: 1px solid #F7CE39;
    +	background: #ffffe0 url(../image/loading.gif) no-repeat 5px center;
    +	padding: 5px 10px 5px 25px;
    +	font-size: 12px;
    +	position: absolute;
    +}
    +
    +.float_corner {
    +	font-size: 18px;
    +	font-family: '瀹嬩綋';
    +	position: absolute;
    +	left: -6000px;
    +	overflow: hidden;
    +}
    +
    +.float_corner .corner {
    +	position: absolute;
    +}
    +
    +.float_corner .corner_1 { /*鍙幓闄*/
    +	color: #ccc;
    +}
    +
    +.float_corner .corner_2 { /*鍙幓闄*/
    +	color: #fff;
    +}
    +
    +.float_corner_top,.float_corner_bottom {
    +	width: 16px;
    +	height: 8px;
    +}
    +
    +.float_corner_top {
    +	line-height: 14px;
    +}
    +
    +.float_corner_bottom {
    +	line-height: 17px;
    +}
    +
    +.float_corner_left,.float_corner_right {
    +	width: 8px;
    +	height: 16px;
    +}
    +
    +.float_corner_top .corner,.float_corner_bottom .corner {
    +	left: 0;
    +}
    +
    +.float_corner_right .corner,.float_corner_left .corner {
    +	top: -2px;
    +}
    +
    +.float_corner_bottom .corner_1 {
    +	
    +}
    +
    +.float_corner_bottom .corner_2 {
    +	top: 1px;
    +}
    +
    +.float_corner_left .corner_1 {
    +	right: 0;
    +}
    +
    +.float_corner_left .corner_2 {
    +	right: 1px;
    +}
    +
    +.float_corner_top .corner_1 {
    +	bottom: 0;
    +}
    +
    +.float_corner_top .corner_2 {
    +	bottom: 1px;
    +}
    +
    +.float_corner_right .corner_2 {
    +	left: 1px;
    +}
    +
    +.owl_shadow {
    +	background: none repeat scroll 0 0 #000000;
    +	border-radius: 3px 3px 3px 3px;
    +	box-shadow: 0 2px 7px rgba(0, 0, 0, 0.35);
    +}
    +
    +.menu_base {
    +	background: none repeat scroll 0 0 #DADADA;
    +	padding: 0;
    +}
    +
    +.menu_base_if {
    +	background: none repeat scroll 0 0 transparent;
    +	position: absolute;
    +	z-index: 1000;
    +}
    +
    +.menu_bd {
    +	background: none repeat scroll 0 0 #F3F3F3;
    +	border-radius: 5px 5px 5px 5px;
    +	padding: 4px 0;
    +}
    +
    +.menu_item,.menu_item_high,.menu_item_nofun {
    +	cursor: pointer;
    +	padding: 0 5px 0 5px;
    +	text-overflow: ellipsis;
    +	white-space: nowrap;
    +}
    +
    +.menu_item_nofun {
    +	color: #7B7B7B;
    +	cursor: default;
    +	margin: 2px;
    +}
    +
    +.menu_item_high {
    +	background: none repeat scroll 0 0 #3470CC;
    +	color: #FFFFFF;
    +}
    +
    +/**Ext 涓嬫媺妗嗘牱寮 */
    +.menu_box {
    +	margin: 0pt;
    +	width: 120px;
    +	height: 28px;
    +	left: 0px;
    +	top: 0px;
    +}
    +
    +.menu_item_sort_asc .menu_item_icon {
    +	background-image: url("../images/hmenu-asc.gif");
    +}
    +
    +.menu_item_sort_desc .menu_item_icon {
    +	background-image: url("../images/hmenu-desc.gif");
    +}
    +
    +.menu_item_unchecked .menu_item_icon {
    +	background-image: url("../images/unchecked.gif");
    +}
    +
    +.menu_item_checked .menu_item_icon {
    +	background-image: url("../images/checked.gif");
    +}
    +
    +.menu_item_link {
    +	cursor: pointer;	
    +	display: block;
    +	line-height: 16px;
    +	margin: 0px;
    +	padding:  5px 2px 3px 35px;
    +	text-decoration: none !important;
    +}
    +
    +.menu_item_link:hover {
    +	background-color: #D9E8FB;
    +	background-image: -moz-linear-gradient(center top, #E7F0FC, #C7DDF9);
    +	border: 1px solid #A9CBF5;
    +	border-radius: 3px 3px 3px 3px;
    +	
    +}
    +
    +.menu_item_icon {
    +	background: none no-repeat scroll center center transparent;
    +	height: 16px;
    +	left: 20px;
    +	position: absolute;
    +	width: 16px;
    +}
    +
    +.menu_item_inputcheck {
    +	background: none no-repeat scroll center center transparent;
    +	height: 16px;
    +	left: 16px;
    +	margin: 0 5px 2px 3px;
    +	position: absolute;
    +	width: 16px;
    +}
    +
    +.menu_item_text {
    +	color: #222222;
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/css/scrollStyle.css b/src/main/webapp/plug-in/sliding/css/scrollStyle.css
    new file mode 100644
    index 00000000..2803e802
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/scrollStyle.css
    @@ -0,0 +1,25 @@
    +/**
    + * 浜戞闈㈠叏灞瑙嗗浘鐨勬粴鍔ㄦ潯鏍峰紡
    + */
    +
    +/* 璁剧疆婊氬姩鏉$殑鏍峰紡 */
    +::-webkit-scrollbar {
    +    width: 3px;
    +    margin-right: 10px;
    +}
    +
    +/* 婊氬姩妲 */
    +::-webkit-scrollbar-track {
    +    box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
    +    border-radius: 10px;
    +}
    +
    +/* 婊氬姩鏉℃粦鍧 */
    +::-webkit-scrollbar-thumb {
    +    border-radius: 10px;
    +    background: rgba(0,0,0,0.1);
    +    -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
    +}
    +::-webkit-scrollbar-thumb:window-inactive {
    +    background: rgba(255,0,0,0.4);
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero.css b/src/main/webapp/plug-in/sliding/css/skins/aero.css
    new file mode 100644
    index 00000000..3b11a2ac
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/skins/aero.css
    @@ -0,0 +1,61 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#FFF; }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:30px; _bottom:0; _margin-top:-30px; }
    +.aui_title { height:29px; line-height:29px; padding:0 16px 0 0; _padding:0; color:#FFF; font-weight:700; text-shadow:1px 1px 0 rgba(0, 0, 0, .9); }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(aero/aero_s.png); background-repeat:no-repeat; }
    +.aui_nw { width:14px; height:34px; background-position: 0 0; _png:aero/ie6/aui_nw.png; }
    +.aui_ne { width:14px; height:34px; background-position: -14px 0; _png:aero/ie6/aui_ne.png; }
    +.aui_sw { width:14px; height:14px; background-position: 0 -34px; _png:aero/ie6/aui_sw.png; }
    +.aui_se { width:14px; height:14px; background-position: -14px -34px; _png:aero/ie6/aui_se.png; }
    +.aui_close { top:7px; right:0; _z-index:1; width:13px; height:13px; _font-size:0; _line-height:0; text-indent:-9999em; background-position:left -96px; _background:url(aero/ie6/aui_close.png); }
    +.aui_close:hover { background-position:right -96px; _background:url(aero/ie6/aui_close.hover.png); }
    +.aui_n, .aui_s { background-repeat:repeat-x; }
    +.aui_n { background-position: 0 -48px; _png:aero/ie6/aui_n.png; }
    +.aui_s { background-position: 0 -82px; _png:aero/ie6/aui_s.png; }
    +.aui_w, .aui_e { background-image:url(aero/aero_s2.png); background-repeat:repeat-y; }
    +.aui_w { background-position:left top; _png:aero/ie6/aui_w.png; }
    +.aui_e { background-position: right bottom; _png:aero/ie6/aui_e.png; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/aero_s.png b/src/main/webapp/plug-in/sliding/css/skins/aero/aero_s.png
    new file mode 100644
    index 00000000..ff3a379c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/aero_s.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/aero_s2.png b/src/main/webapp/plug-in/sliding/css/skins/aero/aero_s2.png
    new file mode 100644
    index 00000000..6fda697d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/aero_s2.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_close.hover.png b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_close.hover.png
    new file mode 100644
    index 00000000..d4248387
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_close.hover.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_close.png b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_close.png
    new file mode 100644
    index 00000000..6aef1a80
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_close.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_e.png b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_e.png
    new file mode 100644
    index 00000000..413cd232
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_e.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_n.png b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_n.png
    new file mode 100644
    index 00000000..5b0b0cd7
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_n.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_ne.png b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_ne.png
    new file mode 100644
    index 00000000..23e82f60
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_ne.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_nw.png b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_nw.png
    new file mode 100644
    index 00000000..8212d5a9
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_nw.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_s.png b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_s.png
    new file mode 100644
    index 00000000..4e24a737
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_s.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_se.png b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_se.png
    new file mode 100644
    index 00000000..668bd831
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_se.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_sw.png b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_sw.png
    new file mode 100644
    index 00000000..539584ee
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_sw.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_title_icon.png b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_title_icon.png
    new file mode 100644
    index 00000000..149aba4c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_title_icon.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_w.png b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_w.png
    new file mode 100644
    index 00000000..a00691ba
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/aero/ie6/aui_w.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black.css b/src/main/webapp/plug-in/sliding/css/skins/black.css
    new file mode 100644
    index 00000000..67a8e446
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/skins/black.css
    @@ -0,0 +1,523 @@
    +@charset "utf-8";
    +
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +/* common start */
    +
    +
    +.aui_outer {
    +	text-align: left;
    +}
    +
    +table.aui_border,table.aui_dialog {
    +	border: 0;
    +	margin: 0;
    +	border-collapse: collapse;
    +	width: auto;
    +}
    +
    +.aui_nw,.aui_n,.aui_ne,.aui_w,.aui_c,.aui_e,.aui_sw,.aui_s,.aui_se,.aui_header,.aui_tdIcon,.aui_main,.aui_footer
    +	{
    +	padding: 0;
    +}
    +
    +.aui_header,.aui_buttons button {
    +	font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti;
    +	_font-family: Tahoma, Arial, Helvetica, STHeiti;
    +	-o-font-family: Tahoma, Arial;
    +}
    +
    +.aui_title {
    +	overflow: hidden;
    +	text-overflow: ellipsis;
    +}
    +
    +.aui_state_noTitle .aui_title {
    +	display: none;
    +}
    +
    +.aui_close {
    +	display: block;
    +	position: absolute;
    +	text-decoration: none;
    +	outline: none;
    +	_cursor: pointer;
    +}
    +.aui_max{
    +	display: block;
    +	position: absolute;
    +	text-decoration: none;
    +	outline: none;
    +	_cursor: pointer;
    +}
    +.aui_max:hover{
    +	text-decoration: none;
    +}
    +.aui_min{
    +	display: block;
    +	position: absolute;
    +	text-decoration: none;
    +	outline: none;
    +	_cursor: pointer;
    +}
    +.aui_min:hover{
    +	text-decoration: none;
    +}
    +
    +.aui_rb{
    +	display: block;
    +	position: absolute;
    +	text-decoration: none;
    +	outline: none;
    +	_cursor: pointer;
    +}
    +.aui_rb:hover{
    +	text-decoration: none;
    +}
    +
    +.aui_close:hover {
    +	text-decoration: none;
    +}
    +
    +.aui_main {
    +	text-align: center;
    +	min-width: 9em;
    +	min-width: 0 \9 /*IE8 BUG*/;
    +	font-size: 15px;
    +}
    +
    +.aui_content {
    +	display: inline-block;
    +	*zoom: 1;
    +	*display: inline;
    +	text-align: left;
    +	border: none 0;
    +}
    +
    +.aui_content.aui_state_full {
    +	display: block;
    +	width: 100%;
    +	margin: 0;
    +	padding: 0 !important;
    +	height: 100%;
    +}
    +
    +.aui_loading {
    +	width: 320px;
    +	height: 102px;
    +	text-align: left;
    +	text-indent: -999em;
    +	overflow: hidden;
    +	background: url(icons/loading.gif) no-repeat center center;
    +}
    +
    +.aui_icon {
    +	vertical-align: middle;
    +}
    +
    +.aui_icon div {
    +	width: 48px;
    +	height: 48px;
    +	margin: 10px 0 10px 10px;
    +	background-position: center center;
    +	background-repeat: no-repeat;
    +}
    +
    +.aui_buttons {
    +	padding: 8px;
    +	text-align: right;
    +	white-space: nowrap;
    +}
    +
    +.aui_buttons button {
    +	margin-left: 15px;
    +	padding: 6px 8px;
    +	cursor: pointer;
    +	display: inline-block;
    +	text-align: center;
    +	line-height: 1;
    +	*padding: 4px 10px;
    +	*height: 2em;
    +	letter-spacing: 2px;
    +	font-family: Tahoma, Arial/ 9 !important;
    +	width: auto;
    +	overflow: visible;
    +	*width: 1;
    +	color: #333;
    +	border: solid 1px #999;
    +	border-radius: 5px;
    +	background: #DDD;
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#FFFFFF', endColorstr = '#DDDDDD' );
    +	background: linear-gradient(top, #FFF, #DDD);
    +	background: -moz-linear-gradient(top, #FFF, #DDD);
    +	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF),
    +		to(#DDD) );
    +	text-shadow: 0px 1px 1px rgba(255, 255, 255, 1);
    +	box-shadow: 0 1px 0 rgba(255, 255, 255, .7), 0 -1px 0 rgba(0, 0, 0, .09);
    +	-moz-transition: -moz-box-shadow linear .2s;
    +	-webkit-transition: -webkit-box-shadow linear .2s;
    +	transition: box-shadow linear .2s;
    +}
    +
    +.aui_buttons button::-moz-focus-inner {
    +	border: 0;
    +	padding: 0;
    +	margin: 0;
    +}
    +
    +.aui_buttons button:focus {
    +	outline: none 0;
    +	border-color: #426DC9;
    +	box-shadow: 0 0 8px rgba(66, 109, 201, .9);
    +}
    +
    +.aui_buttons button:hover {
    +	color: #000;
    +	border-color: #666;
    +}
    +
    +.aui_buttons button:active {
    +	border-color: #666;
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#DDDDDD', endColorstr = '#FFFFFF' );
    +	background: linear-gradient(top, #DDD, #FFF);
    +	background: -moz-linear-gradient(top, #DDD, #FFF);
    +	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD),
    +		to(#FFF) );
    +	box-shadow: inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em
    +		rgba(0, 0, 0, .3);
    +}
    +
    +.aui_buttons button[disabled] {
    +	cursor: default;
    +	color: #666;
    +	background: #DDD;
    +	border: solid 1px #999;
    +	filter: alpha(opacity = 50);
    +	opacity: .5;
    +	box-shadow: none;
    +}
    +
    +button.aui_state_highlight {
    +	color: #FFF;
    +	border: solid 1px #3399dd;
    +	background: #2288cc;
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#33bbee', endColorstr = '#2288cc' );
    +	background: linear-gradient(top, #33bbee, #2288cc);
    +	background: -moz-linear-gradient(top, #33bbee, #2288cc);
    +	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee),
    +		to(#2288cc) );
    +	text-shadow: -1px -1px 1px #1c6a9e;
    +}
    +
    +button.aui_state_highlight:hover {
    +	color: #FFF;
    +	border-color: #1c6a9e;
    +}
    +
    +button.aui_state_highlight:active {
    +	border-color: #1c6a9e;
    +	filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr =
    +		'#33bbee', endColorstr = '#2288cc' );
    +	background: linear-gradient(top, #33bbee, #2288cc);
    +	background: -moz-linear-gradient(top, #33bbee, #2288cc);
    +	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee),
    +		to(#2288cc) );
    +}
    +
    +/* common end */
    +.aui_inner {
    +	background: #f7f7f7;
    +}
    +
    +.aui_titleBar {
    +	width: 100%;
    +	height: 0;
    +	position: relative;
    +	bottom: 30px;
    +	_bottom: 0;
    +	_margin-top: -30px;
    +}
    +
    +.aui_title {
    +	height: 29px;
    +	line-height: 29px;
    +	padding: 0 25px 0 0;
    +	_padding: 0;
    +	text-indent: 5px;
    +	color: #FFF;
    +	font-weight: 700;
    +	text-shadow: -1px -1px 0 rgba(0, 0, 0, .7);
    +}
    +
    +.aui_nw,.aui_ne,.aui_sw,.aui_se,.aui_n,.aui_s,.aui_max,.aui_min.aui_close .aui_rb {
    +	background-image: url(black/bg.png);
    +	background-repeat: no-repeat;
    +}
    +
    +.aui_nw {
    +	width: 15px;
    +	height: 38px;
    +	background-position: 0 0;
    +	_png: black/ie6/nw.png;
    +}
    +
    +.aui_ne {
    +	width: 15px;
    +	height: 38px;
    +	background-position: -15px 0;
    +	_png: black/ie6/ne.png;
    +}
    +
    +.aui_sw {
    +	width: 15px;
    +	height: 18px;
    +	background-position: 0 -38px;
    +	_png: black/ie6/sw.png;
    +}
    +
    +.aui_se {
    +	width: 15px;
    +	height: 18px;
    +	background-position: -15px -38px;
    +	_png: black/ie6/se.png;
    +}
    +
    +.aui_close {
    +	top: 4px;
    +	right: 4px;
    +	_z-index: 1;
    +	width: 20px;
    +	height: 20px;
    +	_font-size: 0;
    +	_line-height: 0;
    +	text-indent: -9999em;
    +	background-position: 0 -112px;
    +	_png: black/ie6/close.png;
    +}
    +
    +.aui_close:hover {
    +	background-position: 0 -132px;
    +}
    +
    +.aui_max {
    +	top: 4px;
    +	right: 28px;
    +	_z-index: 1;
    +	width: 20px;
    +	height: 20px;
    +	_font-size: 0;
    +	_line-height: 0;
    +	text-indent: -9999em;
    +	background-position: 0 -152px;
    +	_png: black/ie6/close.png;
    +}
    +
    +.aui_max:hover {
    +	background-position: 0 -172px;
    +}
    +
    +.aui_min {
    +	top: 4px;
    +	right: 50px;
    +	_z-index: 1;
    +	width: 20px;
    +	height: 20px;
    +	_font-size: 0;
    +	_line-height: 0;
    +	text-indent: -9999em;
    +	background-position: 0 -182px;
    +	_png: black/ie6/close.png;
    +}
    +
    +.aui_min:hover {
    +	background-position: 0 -202px;
    +}
    +
    +.aui_rb {
    +	top: 4px;
    +	right: 28px;
    +	_z-index: 1;
    +	width: 20px;
    +	height: 20px;
    +	_font-size: 0;
    +	_line-height: 0;
    +	text-indent: -9999em;
    +	background-position: 0 -182px;
    +	_png: black/ie6/close.png;
    +}
    +
    +.aui_rb:hover {
    +	background-position: 0 -202px;
    +}
    +	
    +	
    +.aui_n,.aui_s {
    +	background-repeat: repeat-x;
    +}
    +
    +.aui_n {
    +	background-position: 0 -56px;
    +	_png: black/ie6/n.png;
    +}
    +
    +.aui_s {
    +	background-position: 0 -94px;
    +	_png: black/ie6/s.png;
    +}
    +
    +.aui_w,.aui_e {
    +	background-image: url(black/bg2.png);
    +	background-repeat: repeat-y;
    +}
    +
    +.aui_w {
    +	background-position: left top;
    +	_png: black/ie6/w.png;
    +}
    +
    +.aui_e {
    +	background-position: right bottom;
    +	_png: black/ie6/e.png;
    +}
    +
    +aui_icon,.aui_main {
    +	padding-top: 3px;
    +}
    +
    +@media screen and (min-width:0) {
    +	.aui_outer {
    +		border-radius: 8px;
    +		box-shadow: 0 5px 15px rgba(0, 0, 0, .4);
    +		-moz-transition: -moz-box-shadow linear .2s;
    +		-webkit-transition: -webkit-box-shadow linear .2s;
    +		transition: -webkit-box-shadow linear .2s;
    +	}
    +	.aui_state_drag .aui_outer {
    +		box-shadow: none;
    +	}
    +	.aui_state_lock .aui_outer {
    +		box-shadow: 0 3px 26px rgba(0, 0, 0, .9);
    +	}
    +	.aui_outer:active {
    +		box-shadow: 0 0 5px rgba(0, 0, 0, .1) !important;
    +	}
    +	.aui_state_drag .aui_outer {
    +		box-shadow: none !important;
    +	}
    +	.aui_nw,.aui_ne,.aui_sw,.aui_se,.aui_n,.aui_s,.aui_close,.aui_max ,.aui_min ,.aui_rb {
    +		background-image: url(black/bg_css3.png);
    +	}
    +	.aui_nw {
    +		width: 5px;
    +		height: 31px;
    +	}
    +	.aui_ne {
    +		width: 5px;
    +		height: 31px;
    +		background-position: -5px 0;
    +		_png: black/ie6/ne.png;
    +	}
    +	.aui_sw {
    +		width: 5px;
    +		height: 5px;
    +		background-position: 0 -31px;
    +	}
    +	.aui_se {
    +		width: 5px;
    +		height: 5px;
    +		background-position: -5px -31px;
    +	}
    +	.aui_close {
    +		background-position: 0 -72px;
    +	}
    +	.aui_close:hover {
    +		background-position: 0 -92px;
    +	}
    +	.aui_max {
    +		background-position: 0 -152px;
    +	}
    +	.aui_max:hover {
    +		background-position: 0 -172px;
    +	}
    +	.aui_rb{
    +		background-position: 0 -112px;
    +	}
    +	.aui_rb:hover {
    +		background-position: 0 -132px;
    +	}
    +	.aui_min {
    +		background-position: 0 -192px;
    +	}
    +	.aui_min:hover {
    +		background-position: 0 -212px;
    +	}
    +	.aui_n {
    +		background-position: 0 -36px;
    +	}
    +	.aui_s {
    +		background-position: 0 -67px;
    +	}
    +	.aui_w,.aui_e {
    +		background-image: url(black/bg_css3_2.png);
    +	}
    +}
    +
    +.aui_state_noTitle .aui_nw,.aui_state_noTitle .aui_ne,.aui_state_noTitle .aui_sw,.aui_state_noTitle .aui_se
    +	{
    +	width: 3px;
    +	height: 3px;
    +}
    +
    +.aui_state_noTitle .aui_inner {
    +	border: 1px solid #666;
    +	background: #FFF;
    +}
    +
    +.aui_state_noTitle .aui_outer {
    +	box-shadow: none;
    +}
    +
    +.aui_state_noTitle .aui_nw,.aui_state_noTitle .aui_n,.aui_state_noTitle .aui_ne,.aui_state_noTitle .aui_w,.aui_state_noTitle .aui_e,.aui_state_noTitle .aui_sw,.aui_state_noTitle .aui_s,.aui_state_noTitle .aui_se
    +	{
    +	background: rgba(0, 0, 0, .05);
    +	background: #000\9 !important;
    +	filter: alpha(opacity = 5) !important;
    +}
    +
    +.aui_state_noTitle .aui_titleBar {
    +	bottom: 0;
    +	_bottom: 0;
    +	_margin-top: 0;
    +}
    +
    +.aui_state_noTitle .aui_close .aui_max .aui_min .aui_rb{
    +	top: 0;
    +	right: 0;
    +	width: 18px;
    +	height: 18px;
    +	line-height: 18px;
    +	text-align: center;
    +	text-indent: 0;
    +	font-family: Helvetica, STHeiti;
    +	_font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino;
    +	font-size: 18px;
    +	text-decoration: none;
    +	color: #214FA3;
    +	background: none;
    +	filter:  !important;
    +}
    +
    +.aui_state_noTitle .aui_close:hover,.aui_state_noTitle .aui_close:active  .aui_max :active .aui_min :active .aui_rb:active
    +	{
    +	text-decoration: none;
    +	color: #900;
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/bg.png b/src/main/webapp/plug-in/sliding/css/skins/black/bg.png
    new file mode 100644
    index 00000000..6d42b890
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/bg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/bg2.png b/src/main/webapp/plug-in/sliding/css/skins/black/bg2.png
    new file mode 100644
    index 00000000..8f5568df
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/bg2.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/bg_css3.png b/src/main/webapp/plug-in/sliding/css/skins/black/bg_css3.png
    new file mode 100644
    index 00000000..d65053a1
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/bg_css3.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/bg_css3_2.png b/src/main/webapp/plug-in/sliding/css/skins/black/bg_css3_2.png
    new file mode 100644
    index 00000000..4e5801b7
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/bg_css3_2.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/ie6/close.hover.png b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/close.hover.png
    new file mode 100644
    index 00000000..73b02c43
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/close.hover.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/ie6/close.png b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/close.png
    new file mode 100644
    index 00000000..d18600b0
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/close.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/ie6/e.png b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/e.png
    new file mode 100644
    index 00000000..0dbe7694
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/e.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/ie6/n.png b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/n.png
    new file mode 100644
    index 00000000..67ba731a
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/n.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/ie6/ne.png b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/ne.png
    new file mode 100644
    index 00000000..7f34d69d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/ne.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/ie6/nw.png b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/nw.png
    new file mode 100644
    index 00000000..74b52859
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/nw.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/ie6/s.png b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/s.png
    new file mode 100644
    index 00000000..aadc5bc5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/s.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/ie6/se.png b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/se.png
    new file mode 100644
    index 00000000..6a4ac965
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/se.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/ie6/sw.png b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/sw.png
    new file mode 100644
    index 00000000..5637896f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/sw.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/black/ie6/w.png b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/w.png
    new file mode 100644
    index 00000000..910b3a16
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/black/ie6/w.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue.css b/src/main/webapp/plug-in/sliding/css/skins/blue.css
    new file mode 100644
    index 00000000..35f8042c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/skins/blue.css
    @@ -0,0 +1,79 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0 \9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #3399dd; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#1c6a9e; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#f7f7f7; }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:30px; _bottom:0; _margin-top:-30px; }
    +.aui_title { height:29px; line-height:29px; padding:0 25px 0 0; _padding:0; text-indent:5px; color:#FFF; font-weight:700; text-shadow:-1px -1px 0 rgba(33, 79, 183, .7); }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(blue/bg.png); background-repeat:no-repeat; }
    +.aui_nw { width:15px; height:38px; background-position: 0 0; _png:blue/ie6/nw.png; }
    +.aui_ne { width:15px; height:38px; background-position: -15px 0; _png:blue/ie6/ne.png; }
    +.aui_sw { width:15px; height:18px; background-position: 0 -38px; _png:blue/ie6/sw.png; }
    +.aui_se { width:15px; height:18px; background-position: -15px -38px; _png:blue/ie6/se.png; }
    +.aui_close { top:4px; right:4px; _z-index:1; width:20px; height:20px; _font-size:0; _line-height:0; text-indent:-9999em; background-position:0 -112px; _png:blue/ie6/close.png; }
    +.aui_close:hover { background-position:0 -132px; }
    +.aui_n, .aui_s { background-repeat:repeat-x; }
    +.aui_n { background-position: 0 -56px; _png:blue/ie6/n.png; }
    +.aui_s { background-position: 0 -94px; _png:blue/ie6/s.png; }
    +.aui_w, .aui_e { background-image:url(blue/bg2.png); background-repeat:repeat-y; }
    +.aui_w { background-position:left top; _png:blue/ie6/w.png; }
    +.aui_e { background-position: right bottom; _png:blue/ie6/e.png; }
    +aui_icon, .aui_main { padding-top:3px; }
    +@media screen and (min-width:0) {
    +	.aui_outer { border-radius:8px; box-shadow:0 5px 15px rgba(2, 37, 69, .4); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +	.aui_state_drag .aui_outer { box-shadow:none; }
    +	.aui_state_lock .aui_outer { box-shadow:0 3px 26px rgba(0, 0, 0, .9); }
    +	.aui_outer:active { box-shadow:0 0 5px rgba(2, 37, 69, .1)!important; }
    +	.aui_state_drag .aui_outer { box-shadow:none!important; }
    +	.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(blue/bg_css3.png); }
    +	.aui_nw { width:5px; height:31px; }
    +	.aui_ne { width:5px; height:31px; background-position: -5px 0; _png:blue/ie6/ne.png; }
    +	.aui_sw { width:5px; height:5px;background-position: 0 -31px; }
    +	.aui_se { width:5px; height:5px; background-position: -5px -31px; }
    +	.aui_close { background-position:0 -72px; }
    +	.aui_close:hover { background-position:0 -92px; }
    +	.aui_n { background-position: 0 -36px; }
    +	.aui_s { background-position: 0 -67px; }
    +	.aui_w, .aui_e { background-image:url(blue/bg_css3_2.png); }
    +}
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/bg.png b/src/main/webapp/plug-in/sliding/css/skins/blue/bg.png
    new file mode 100644
    index 00000000..52c1c019
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/bg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/bg2.png b/src/main/webapp/plug-in/sliding/css/skins/blue/bg2.png
    new file mode 100644
    index 00000000..834c17a8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/bg2.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/bg_css3.png b/src/main/webapp/plug-in/sliding/css/skins/blue/bg_css3.png
    new file mode 100644
    index 00000000..8f55b85b
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/bg_css3.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/bg_css3_2.png b/src/main/webapp/plug-in/sliding/css/skins/blue/bg_css3_2.png
    new file mode 100644
    index 00000000..b8f66eb8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/bg_css3_2.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/close.hover.png b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/close.hover.png
    new file mode 100644
    index 00000000..40de7076
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/close.hover.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/close.png b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/close.png
    new file mode 100644
    index 00000000..72c7157e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/close.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/e.png b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/e.png
    new file mode 100644
    index 00000000..d892f027
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/e.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/n.png b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/n.png
    new file mode 100644
    index 00000000..28c2ff53
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/n.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/ne.png b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/ne.png
    new file mode 100644
    index 00000000..eaa3cb4f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/ne.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/nw.png b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/nw.png
    new file mode 100644
    index 00000000..45bb0379
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/nw.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/s.png b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/s.png
    new file mode 100644
    index 00000000..ee9ab028
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/s.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/se.png b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/se.png
    new file mode 100644
    index 00000000..1e181ab4
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/se.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/sw.png b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/sw.png
    new file mode 100644
    index 00000000..b2193e3f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/sw.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/w.png b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/w.png
    new file mode 100644
    index 00000000..6c4472db
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/blue/ie6/w.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/chrome.css b/src/main/webapp/plug-in/sliding/css/skins/chrome.css
    new file mode 100644
    index 00000000..78e4c34f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/skins/chrome.css
    @@ -0,0 +1,61 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#FFF; }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:26px; _bottom:0; _margin-top:-26px;}
    +.aui_title { height:26px; line-height:23px; padding:0 60px 0 5px; color:#FFF; font-weight:700; text-shadow:0 1px 0 #000; }
    +.aui_nw, .aui_ne, .aui_w, .aui_e, .aui_sw, .aui_se, .aui_close { background-image:url(chrome/chrome_s.png); background-repeat:no-repeat; }
    +.aui_nw { width:5px; height:26px; background-position: -46px -8px; }
    +.aui_ne { width:5px; height:26px; background-position: -53px -8px; }
    +.aui_w { background-position:-60px 0; background-repeat:repeat-y; }
    +.aui_e { background-position:-65px 0; background-repeat:repeat-y; }
    +.aui_sw { width:5px; height:5px; background-position: -46px -2px;}
    +.aui_se { width:5px; height:5px; background-position: -53px -2px;}
    +.aui_close { top:1px; right:0; width:44px; height:17px; background-position:0 0; _font-size:0; _line-height:0; text-indent:-9999em; }
    +.aui_close:hover { background-position:0 -18px; }
    +.aui_n, .aui_s { background-image:url(chrome/border.png); background-repeat:repeat-x; }
    +.aui_n { background-position:0 top; }
    +.aui_s { background-position: 0 bottom; }
    +.aui_buttons { background-color:#F6F6F6; border-top:solid 1px #DADEE5; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/chrome/border.png b/src/main/webapp/plug-in/sliding/css/skins/chrome/border.png
    new file mode 100644
    index 00000000..db3bdcd9
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/chrome/border.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/chrome/chrome_s.png b/src/main/webapp/plug-in/sliding/css/skins/chrome/chrome_s.png
    new file mode 100644
    index 00000000..3f62b86f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/chrome/chrome_s.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/default.css b/src/main/webapp/plug-in/sliding/css/skins/default.css
    new file mode 100644
    index 00000000..f1fe2deb
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/skins/default.css
    @@ -0,0 +1,67 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#FFF; }
    +.aui_outer, .aui_inner { border:1px solid rgba(0, 0, 0, .7); border:1px solid #333\9; }
    +.aui_border { box-shadow: inset 0 0 1px rgba(255, 255, 255, .9); }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se { width:8px; height:8px; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_e, .aui_sw, .aui_s, .aui_se { background:rgba(0, 0, 0, .4); background:#000\9!important; filter:alpha(opacity=40); }
    +.aui_state_lock .aui_nw, .aui_state_lock .aui_n, .aui_state_lock .aui_ne, .aui_state_lock .aui_w, .aui_state_lock .aui_e, .aui_state_lock .aui_sw, .aui_state_lock .aui_s, .aui_state_lock .aui_se { background:rgba(0, 0, 0, .5); background:#000\9!important; filter:alpha(opacity=50); }
    +.aui_state_focus .aui_dialog { box-shadow: 0 0 3px rgba(0, 0, 0, 0.4); }
    +.aui_state_focus .aui_outer { box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1); }
    +.aui_state_lock .aui_border { box-shadow:0 3px 26px rgba(0, 0, 0, .9); }
    +.aui_state_drag .aui_outer, .aui_outer:active { box-shadow:none; }
    +.aui_titleBar { position:relative; height:100%; }
    +.aui_title { height:28px; line-height:27px; padding:0 28px 0 10px; text-shadow:0 1px 0 rgba(255, 255, 255, .7); background-color:#edf5f8; font-weight:bold; color:#95a7ae; font-family: Tahoma, Arial/9!important; background-color:#bdc6cd; background: linear-gradient(top, #edf5f8, #bdc6cd); background: -moz-linear-gradient(top, #edf5f8, #bdc6cd); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#edf5f8), to(#bdc6cd)); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#edf5f8', endColorstr='#bdc6cd'); border-top:1px solid #edf5f8; border-bottom:1px solid #b6bec5; }
    +.aui_state_focus .aui_title { color:#4c5a5f; }
    +.aui_state_drag .aui_title { background: linear-gradient(top, #bdc6cd, #edf5f8); background: -moz-linear-gradient(top, #bdc6cd, #edf5f8); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bdc6cd), to(#edf5f8)); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdc6cd', endColorstr='#edf5f8'); box-shadow:none; }
    +.aui_state_drag .aui_titleBar { box-shadow:none; }
    +.aui_close { padding:0; top:4px; right:4px; width:21px; height:21px; line-height:21px; font-size:18px; color:#68767b; text-align:center; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; text-shadow:0 1px 0 rgba(255, 255, 255, .9); }
    +.aui_close:hover { color:#C72015; }
    +.aui_close:active { box-shadow: none; }
    +.aui_content { color:#666; }
    +.aui_state_focus .aui_content { color:#000; }
    +.aui_buttons { background-color:#F6F6F6; border-top:solid 1px #DADEE5; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { border:none 0; box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    +.aui_state_noTitle .aui_dialog { box-shadow: none; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green.css b/src/main/webapp/plug-in/sliding/css/skins/green.css
    new file mode 100644
    index 00000000..48ea4917
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/skins/green.css
    @@ -0,0 +1,79 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0 \9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(0, 50, 0, .7); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(0, 50, 0, .7), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #679a10; background: #7cb61b; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#98d237', endColorstr='#7cb61b'); background: linear-gradient(top, #98d237, #7cb61b); background: -moz-linear-gradient(top, #98d237, #7cb61b); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#98d237), to(#7cb61b)); text-shadow: -1px -1px 1px #679a10; }
    +button.aui_state_highlight:focus { border-color:#679a10; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#3c5412; }
    +button.aui_state_highlight:active { border-color:#3c5412; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#98d237', endColorstr='#7cb61b'); background: linear-gradient(top, #98d237, #7cb61b); background: -moz-linear-gradient(top, #98d237, #7cb61b); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#98d237), to(#7cb61b)); }
    +/* common end */
    +
    +.aui_inner { background:#f7f7f7; }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:30px; _bottom:0; _margin-top:-30px; }
    +.aui_title { height:29px; line-height:29px; padding:0 25px 0 0; _padding:0; text-indent:5px; color:#FFF; font-weight:700; text-shadow:-1px -1px 0 rgba(0, 50, 0, .7); }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(green/bg.png); background-repeat:no-repeat; }
    +.aui_nw { width:15px; height:38px; background-position: 0 0; _png:green/ie6/nw.png; }
    +.aui_ne { width:15px; height:38px; background-position: -15px 0; _png:green/ie6/ne.png; }
    +.aui_sw { width:15px; height:18px; background-position: 0 -38px; _png:green/ie6/sw.png; }
    +.aui_se { width:15px; height:18px; background-position: -15px -38px; _png:green/ie6/se.png; }
    +.aui_close { top:4px; right:4px; _z-index:1; width:20px; height:20px; _font-size:0; _line-height:0; text-indent:-9999em; background-position:0 -112px; _png:green/ie6/close.png; }
    +.aui_close:hover { background-position:0 -132px; }
    +.aui_n, .aui_s { background-repeat:repeat-x; }
    +.aui_n { background-position: 0 -56px; _png:green/ie6/n.png; }
    +.aui_s { background-position: 0 -94px; _png:green/ie6/s.png; }
    +.aui_w, .aui_e { background-image:url(green/bg2.png); background-repeat:repeat-y; }
    +.aui_w { background-position:left top; _png:green/ie6/w.png; }
    +.aui_e { background-position: right bottom; _png:green/ie6/e.png; }
    +aui_icon, .aui_main { padding-top:3px; }
    +@media screen and (min-width:0) {
    +	.aui_outer { border-radius:8px; box-shadow:0 5px 15px rgba(0, 50, 0, .4); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +	.aui_state_lock .aui_outer { box-shadow:0 3px 26px rgba(0, 0, 0, .9); }
    +	.aui_outer:active { box-shadow:0 0 5px rgba(0, 50, 0, .1)!important; }
    +	.aui_state_drag .aui_outer { box-shadow:none!important; }
    +	.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(green/bg_css3.png); }
    +	.aui_nw { width:5px; height:31px; }
    +	.aui_ne { width:5px; height:31px; background-position: -5px 0; _png:green/ie6/ne.png; }
    +	.aui_sw { width:5px; height:5px;background-position: 0 -31px; }
    +	.aui_se { width:5px; height:5px; background-position: -5px -31px; }
    +	.aui_close { background-position:0 -72px; }
    +	.aui_close:hover { background-position:0 -92px; }
    +	.aui_n { background-position: 0 -36px; }
    +	.aui_s { background-position: 0 -67px; }
    +	.aui_w, .aui_e { background-image:url(green/bg_css3_2.png); }
    +}
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/bg.png b/src/main/webapp/plug-in/sliding/css/skins/green/bg.png
    new file mode 100644
    index 00000000..7919c88e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/bg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/bg2.png b/src/main/webapp/plug-in/sliding/css/skins/green/bg2.png
    new file mode 100644
    index 00000000..3faa0c8a
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/bg2.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/bg_css3.png b/src/main/webapp/plug-in/sliding/css/skins/green/bg_css3.png
    new file mode 100644
    index 00000000..aa255e43
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/bg_css3.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/bg_css3_2.png b/src/main/webapp/plug-in/sliding/css/skins/green/bg_css3_2.png
    new file mode 100644
    index 00000000..4e5801b7
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/bg_css3_2.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/color_bg.png b/src/main/webapp/plug-in/sliding/css/skins/green/color_bg.png
    new file mode 100644
    index 00000000..7919c88e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/color_bg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/ie6/close.hover.png b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/close.hover.png
    new file mode 100644
    index 00000000..46fc9d72
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/close.hover.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/ie6/close.png b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/close.png
    new file mode 100644
    index 00000000..932e5970
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/close.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/ie6/e.png b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/e.png
    new file mode 100644
    index 00000000..c3fc738e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/e.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/ie6/n.png b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/n.png
    new file mode 100644
    index 00000000..8742f202
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/n.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/ie6/ne.png b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/ne.png
    new file mode 100644
    index 00000000..57e8e620
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/ne.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/ie6/nw.png b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/nw.png
    new file mode 100644
    index 00000000..a210191c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/nw.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/ie6/s.png b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/s.png
    new file mode 100644
    index 00000000..67fcd94e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/s.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/ie6/se.png b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/se.png
    new file mode 100644
    index 00000000..c6d97441
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/se.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/ie6/sw.png b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/sw.png
    new file mode 100644
    index 00000000..d135dcd1
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/sw.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/green/ie6/w.png b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/w.png
    new file mode 100644
    index 00000000..43378267
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/green/ie6/w.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/icons/error.png b/src/main/webapp/plug-in/sliding/css/skins/icons/error.png
    new file mode 100644
    index 00000000..4929a2e2
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/icons/error.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/icons/face-sad.png b/src/main/webapp/plug-in/sliding/css/skins/icons/face-sad.png
    new file mode 100644
    index 00000000..5d819d81
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/icons/face-sad.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/icons/face-smile.png b/src/main/webapp/plug-in/sliding/css/skins/icons/face-smile.png
    new file mode 100644
    index 00000000..f952c13c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/icons/face-smile.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/icons/loading.gif b/src/main/webapp/plug-in/sliding/css/skins/icons/loading.gif
    new file mode 100644
    index 00000000..e8c28929
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/icons/loading.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/icons/question.png b/src/main/webapp/plug-in/sliding/css/skins/icons/question.png
    new file mode 100644
    index 00000000..941a4c98
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/icons/question.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/icons/succeed.png b/src/main/webapp/plug-in/sliding/css/skins/icons/succeed.png
    new file mode 100644
    index 00000000..c78d40bf
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/icons/succeed.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/icons/warning.png b/src/main/webapp/plug-in/sliding/css/skins/icons/warning.png
    new file mode 100644
    index 00000000..bcaab1e5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/icons/warning.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog.css b/src/main/webapp/plug-in/sliding/css/skins/idialog.css
    new file mode 100644
    index 00000000..a2166396
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/skins/idialog.css
    @@ -0,0 +1,71 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#FFF; }
    +.aui_titleBar { width:100%; }
    +.aui_title { position:absolute; left:0; top:0; width:100%; height:22px; text-align:left; text-indent:-999em; }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(idialog/idialog_s.png); background-repeat:no-repeat; }
    +.aui_nw { width:15px; height:15px; background-position: 0 0; _png:idialog/ie6/aui_nw.png; }
    +.aui_ne { width:15px; height:15px; background-position: -15px 0; _png:idialog/ie6/aui_ne.png; }
    +.aui_sw { width:15px; height:15px; background-position: 0 -15px; _png:idialog/ie6/aui_sw.png; }
    +.aui_se { width:15px; height:15px; background-position: -15px -15px; _png:idialog/ie6/aui_se.png; }
    +.aui_close { position:absolute; right:-8px; top:-8px; _z-index:1; width:34px; height:34px; _font-size:0; _line-height:0; text-indent:-9999em; background-position:0 -60px; _png:idialog/ie6/aui_close.png; }
    +.aui_close:hover { background-position:0 -94px; _png:idialog/ie6/aui_close.hover.png; }
    +.aui_n, .aui_s { background-repeat:repeat-x; }
    +.aui_n { background-position: 0 -30px; _png:idialog/ie6/aui_n.png; }
    +.aui_s { background-position: 0 -45px; _png:idialog/ie6/aui_s.png; }
    +.aui_w, .aui_e { background-image:url(idialog/idialog_s2.png); background-repeat:repeat-y; }
    +.aui_w { background-position:left top; _png:idialog/ie6/aui_w.png; }
    +.aui_e { background-position: right bottom; _png:idialog/ie6/aui_e.png; }
    +@media screen and (min-width:0) {/* css3 */
    +	.aui_nw, .aui_ne, .aui_sw, .aui_se{ width:5px; height:5px; }
    +	.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_e, .aui_sw, .aui_s, .aui_se { background:none; }
    +	.aui_sw, .aui_s, .aui_se { background:url(idialog/idialog_s.png) repeat-x 0 -45px; }
    +	.aui_sw { border-radius:0 0 0 5px; }
    +	.aui_se { border-radius:0 0 5px 0; }
    +	.aui_outer { border:1px solid #929292; border-radius:5px; box-shadow:0 3px 8px rgba(0, 0, 0, .2); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +	.aui_border { border-radius:5px; background:#FFF; }
    +	.aui_state_drag .aui_outer { box-shadow:none; }
    +	.aui_state_lock .aui_outer { box-shadow:0 3px 26px rgba(0, 0, 0, .9); }
    +	.aui_outer:active { box-shadow:0 0 5px rgba(0, 0, 0, .1)!important; }
    +	.aui_state_drag .aui_outer { box-shadow:none!important; }
    +	.aui_close { right:-16px; top:-16px; }
    +}
    +@media screen and (-webkit-min-device-pixel-ratio:0) {/* apple | webkit */
    +	.aui_close { right:auto; left:-16px; top:-16px; }
    +}
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog/idialog_s.png b/src/main/webapp/plug-in/sliding/css/skins/idialog/idialog_s.png
    new file mode 100644
    index 00000000..d86d0544
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/idialog/idialog_s.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog/idialog_s2.png b/src/main/webapp/plug-in/sliding/css/skins/idialog/idialog_s2.png
    new file mode 100644
    index 00000000..7be06ad2
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/idialog/idialog_s2.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_close.hover.png b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_close.hover.png
    new file mode 100644
    index 00000000..dd00dde3
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_close.hover.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_close.png b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_close.png
    new file mode 100644
    index 00000000..04ed8bea
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_close.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_e.png b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_e.png
    new file mode 100644
    index 00000000..b96ff2f3
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_e.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_n.png b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_n.png
    new file mode 100644
    index 00000000..34871bee
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_n.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_ne.png b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_ne.png
    new file mode 100644
    index 00000000..36449443
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_ne.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_nw.png b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_nw.png
    new file mode 100644
    index 00000000..dea0b9a5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_nw.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_s.png b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_s.png
    new file mode 100644
    index 00000000..62746ee4
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_s.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_se.png b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_se.png
    new file mode 100644
    index 00000000..32247e84
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_se.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_sw.png b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_sw.png
    new file mode 100644
    index 00000000..478f609f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_sw.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_w.png b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_w.png
    new file mode 100644
    index 00000000..c4df489d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/idialog/ie6/aui_w.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera.css b/src/main/webapp/plug-in/sliding/css/skins/opera.css
    new file mode 100644
    index 00000000..06b6c8f7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/skins/opera.css
    @@ -0,0 +1,62 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#f0f1f9; }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:27px; _bottom:0; _margin-top:-27px; }
    +.aui_title { height:27px; line-height:27px; padding:0 37px 0 0; _padding:0; color:#333; text-shadow:1px 1px 0 rgba(255, 255, 255, .7); }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se, .aui_n, .aui_s, .aui_close { background-image:url(opera/s1.png); background-repeat:no-repeat; }
    +.aui_nw { width:15px; height:32px; background-position: 0 0; _png:opera/ie6/aui_nw.png; }
    +.aui_ne { width:15px; height:32px; background-position: -15px 0; _png:opera/ie6/aui_ne.png; }
    +.aui_sw { width:15px; height:15px; background-position: 0 -33px; _png:opera/ie6/aui_sw.png; }
    +.aui_se { width:15px; height:15px; background-position: -15px -33px; _png:opera/ie6/aui_se.png; }
    +.aui_close { top:0; right:0; _z-index:1; width:27px; height:27px; _font-size:0; _line-height:0; *zoom:1; text-indent:-9999em; background-position:0 -96px; _png:opera/ie6/aui_close.png; }
    +.aui_close:hover { background-position:0 -123px; _png:opera/ie6/aui_close.hover.png; }
    +.aui_n, .aui_s { background-repeat:repeat-x; }
    +.aui_n { background-position: 0 -48px; _png:opera/ie6/aui_n.png; }
    +.aui_s { background-position: 0 -81px; _png:opera/ie6/aui_s.png; }
    +.aui_w, .aui_e { background-image:url(opera/s2.png); background-repeat:repeat-y; }
    +.aui_w { background-position:left top; _png:opera/ie6/aui_w.png; }
    +.aui_e { background-position: right bottom; _png:opera/ie6/aui_e.png; }
    +.aui_icon, .aui_main { padding-top:10px; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_se { width:3px; height:3px; }
    +.aui_state_noTitle .aui_inner { border:1px solid #666; background:#FFF; }
    +.aui_state_noTitle .aui_outer { box-shadow:none; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_n, .aui_state_noTitle .aui_ne, .aui_state_noTitle .aui_w, .aui_state_noTitle .aui_e, .aui_state_noTitle .aui_sw, .aui_state_noTitle .aui_s, .aui_state_noTitle .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5)!important; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; text-indent:0; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; background:none; filter:!important; }
    +.aui_state_noTitle .aui_close:hover, .aui_state_noTitle .aui_close:active { text-decoration:none; color:#900; }
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_close.hover.png b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_close.hover.png
    new file mode 100644
    index 00000000..8e942f07
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_close.hover.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_close.png b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_close.png
    new file mode 100644
    index 00000000..9442e413
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_close.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_e.png b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_e.png
    new file mode 100644
    index 00000000..de6faba4
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_e.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_n.png b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_n.png
    new file mode 100644
    index 00000000..840358d9
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_n.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_ne.png b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_ne.png
    new file mode 100644
    index 00000000..fa30a505
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_ne.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_nw.png b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_nw.png
    new file mode 100644
    index 00000000..6d09929e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_nw.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_s.png b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_s.png
    new file mode 100644
    index 00000000..c0318414
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_s.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_se.png b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_se.png
    new file mode 100644
    index 00000000..8679228f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_se.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_sw.png b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_sw.png
    new file mode 100644
    index 00000000..9866db35
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_sw.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_w.png b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_w.png
    new file mode 100644
    index 00000000..519cf11e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/opera/ie6/aui_w.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera/s1.png b/src/main/webapp/plug-in/sliding/css/skins/opera/s1.png
    new file mode 100644
    index 00000000..e6941c1f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/opera/s1.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/opera/s2.png b/src/main/webapp/plug-in/sliding/css/skins/opera/s2.png
    new file mode 100644
    index 00000000..0debda05
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/css/skins/opera/s2.png differ
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/simple.css b/src/main/webapp/plug-in/sliding/css/skins/simple.css
    new file mode 100644
    index 00000000..540bd5c0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/skins/simple.css
    @@ -0,0 +1,55 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:#FFF; border:1px solid #666; }
    +.aui_nw, .aui_ne, .aui_sw, .aui_se { width:3px; height:3px; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_e, .aui_sw, .aui_s, .aui_se { background:rgba(0, 0, 0, .05); background:#000\9!important; filter:alpha(opacity=5); }
    +.aui_titleBar { position:relative; height:100%;  }
    +.aui_title { position:absolute; top:0; left:0; width:100%; height:24px; text-indent:-9999em; overflow:hidden; }
    +.aui_state_drag .aui_title { color:#666; }
    +.aui_close { padding:0; top:0; right:0; width:18px; height:18px; line-height:18px; text-align:center; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; font-size:18px; text-decoration:none; color:#214FA3; }
    +.aui_close:hover, .aui_close:active { text-decoration:none; color:#900; }
    +.aui_content { color:#666; }
    +.aui_state_focus .aui_content { color:#000; }
    +@media screen and (min-width:0) {
    +	.aui_close { width:20px; height:20px; line-height:20px; right:-10px; top:-10px; border-radius:20px; background:#999; color:#FFF; box-shadow:0 1px 3px rgba(0, 0, 0, .3); -moz-transition: linear .06s; -webkit-transition: linear .06s; transition: linear .06s; }
    +	.aui_close:hover { width:24px; height:24px; line-height:24px; right:-12px; top:-12px; color:#FFF; box-shadow:0 1px 3px rgba(209, 40, 42, .5); background:#d1282a; border-radius:24px; }
    +	.aui_state_lock .aui_dialog { box-shadow:0 3px 26px rgba(0, 0, 0, .9); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +	.aui_dialog:active { box-shadow:0 0 5px rgba(0, 0, 0, .1)!important; }
    +	.aui_state_drag .aui_outer { box-shadow:none!important; }
    +}
    diff --git a/src/main/webapp/plug-in/sliding/css/skins/twitter.css b/src/main/webapp/plug-in/sliding/css/skins/twitter.css
    new file mode 100644
    index 00000000..d847f9a5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/skins/twitter.css
    @@ -0,0 +1,59 @@
    +@charset "utf-8";
    +/*
    + * artDialog skin
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    + 
    +/* common start */
    +body { _margin:0; _height:100%; /*IE6 BUG*/ }
    +.aui_outer { text-align:left; }
    +table.aui_border, table.aui_dialog { border:0; margin:0; border-collapse:collapse; width:auto; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_c, .aui_e, .aui_sw, .aui_s, .aui_se, .aui_header, .aui_tdIcon, .aui_main, .aui_footer { padding:0; }
    +.aui_header, .aui_buttons button { font: 12px/1.11 'Microsoft Yahei', Tahoma, Arial, Helvetica, STHeiti; _font-family:Tahoma,Arial,Helvetica,STHeiti; -o-font-family: Tahoma, Arial; }
    +.aui_title { overflow:hidden; text-overflow: ellipsis; }
    +.aui_state_noTitle .aui_title { display:none; }
    +.aui_close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }
    +.aui_close:hover { text-decoration:none; }
    +.aui_main { text-align:center; min-width:9em; min-width:0\9/*IE8 BUG*/; }
    +.aui_content { display:inline-block; *zoom:1; *display:inline; text-align:left; border:none 0; }
    +.aui_content.aui_state_full { display:block; width:100%; margin:0; padding:0!important; height:100%; }
    +.aui_loading { width:96px; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(icons/loading.gif) no-repeat center center; }
    +.aui_icon { vertical-align: middle; }
    +.aui_icon div { width:48px; height:48px; margin:10px 0 10px 10px; background-position: center center; background-repeat:no-repeat; }
    +.aui_buttons { padding:8px; text-align:right; white-space:nowrap; }
    +.aui_buttons button { margin-left:15px; padding: 6px 8px; cursor: pointer; display: inline-block; text-align: center; line-height: 1; *padding:4px 10px; *height:2em; letter-spacing:2px; font-family: Tahoma, Arial/9!important; width:auto; overflow:visible; *width:1; color: #333; border: solid 1px #999; border-radius: 5px; background: #DDD; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#DDDDDD'); background: linear-gradient(top, #FFF, #DDD); background: -moz-linear-gradient(top, #FFF, #DDD); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF), to(#DDD)); text-shadow: 0px 1px 1px rgba(255, 255, 255, 1); box-shadow: 0 1px 0 rgba(255, 255, 255, .7),  0 -1px 0 rgba(0, 0, 0, .09); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: box-shadow linear .2s; }
    +.aui_buttons button::-moz-focus-inner{ border:0; padding:0; margin:0; }
    +.aui_buttons button:focus { outline:none 0; border-color:#426DC9; box-shadow:0 0 8px rgba(66, 109, 201, .9); }
    +.aui_buttons button:hover { color:#000; border-color:#666; }
    +.aui_buttons button:active { border-color:#666; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#DDDDDD', endColorstr='#FFFFFF'); background: linear-gradient(top, #DDD, #FFF); background: -moz-linear-gradient(top, #DDD, #FFF); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(#FFF)); box-shadow:inset 0 1px 5px rgba(66, 109, 201, .9), inset 0 1px 1em rgba(0, 0, 0, .3); }
    +.aui_buttons button[disabled] { cursor:default; color:#666; background:#DDD; border: solid 1px #999; filter:alpha(opacity=50); opacity:.5; box-shadow:none; }
    +button.aui_state_highlight { color: #FFF; border: solid 1px #1c6a9e; background: #2288cc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); text-shadow: -1px -1px 1px #1c6a9e; }
    +button.aui_state_highlight:hover { color:#FFF; border-color:#0F3A56; }
    +button.aui_state_highlight:active { border-color:#1c6a9e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33bbee', endColorstr='#2288cc'); background: linear-gradient(top, #33bbee, #2288cc); background: -moz-linear-gradient(top, #33bbee, #2288cc); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#33bbee), to(#2288cc)); }
    +/* common end */
    +
    +.aui_inner { background:rgba(0, 0, 0, .7); }
    +.aui_dialog { background:#FFF; border-radius:3px; }
    +.aui_outer { border:1px solid #000; border-radius:5px; box-shadow: 0 3px 0 rgba(0,0,0,0.1); -moz-transition:-moz-box-shadow linear .2s; -webkit-transition: -webkit-box-shadow linear .2s; transition: -webkit-box-shadow linear .2s; }
    +.aui_state_lock .aui_outer { box-shadow:0 3px 26px rgba(0, 0, 0, .9); }
    +.aui_outer:active { box-shadow:none!important; }
    +.aui_state_drag .aui_outer { box-shadow:none!important; }
    +.aui_border { border-radius:3px; }
    +.aui_nw, .aui_ne { width:5px; height:37px; }
    +.aui_sw, .aui_se { width:5px; height:5px; }
    +.aui_nw, .aui_n, .aui_ne, .aui_w, .aui_e, .aui_sw, .aui_s, .aui_se { background:rgba(0, 0, 0, .7); background:#000\9!important; filter:alpha(opacity=70); }
    +.aui_titleBar { width:100%; height:0; position:relative; bottom:33px; _bottom:0; _margin-top:-33px; }
    +.aui_title { height:27px; line-height:27px; padding:0 16px 0 5px; color:#FFF; font-weight:700; text-shadow:0 1px 0 #000; }
    +.aui_close { padding:0; top:2px; right:5px; width:21px; height:21px; line-height:21px; font-size:18px; text-align:center; color:#EBEBEB; font-family: Helvetica, STHeiti; _font-family: '\u9ed1\u4f53', 'Book Antiqua', Palatino; border:1px solid transparent; _border:0 none; background:#000; border-radius:15px;  }
    +.aui_state_drag .aui_close { color:#FFF; }
    +.aui_close:hover { background:#C72015; border:1px solid #000; _border:0 none; box-shadow: 0 1px 0 rgba(255, 255, 255, .3), inset 0 1px 0 rgba(255, 255, 255, .3); }
    +.aui_close:active { box-shadow: none; }
    +.aui_state_noTitle { }
    +.aui_content { color:#666; }
    +.aui_state_noTitle .aui_nw, .aui_state_noTitle .aui_ne { height:5px; }
    +.aui_state_noTitle .aui_titleBar { bottom:0; _bottom:0; _margin-top:0; }
    +.aui_state_noTitle .aui_close { top:5px; }
    diff --git a/src/main/webapp/plug-in/sliding/css/smartMenu.css b/src/main/webapp/plug-in/sliding/css/smartMenu.css
    new file mode 100644
    index 00000000..6c9293e4
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/smartMenu.css
    @@ -0,0 +1,14 @@
    +@charset "utf-8";
    +/* smartMenu.css	by zhangxinxu */
    +.smart_menu_box{display:none; width:140px; position:absolute; z-index:201105;}
    +.smart_menu_body{padding:1px; border:1px solid #B8CBCB; background-color:#fff; -moz-box-shadow:2px 2px 5px #666; -webkit-box-shadow:2px 2px 5px #666; box-shadow:2px 2px 5px #666;}
    +.smart_menu_ul{margin:0; padding:0; list-style-type:none;}
    +.smart_menu_li{position:relative;}
    +.smart_menu_a{display:block; height:25px; line-height:24px; padding:0 5px 0 25px; color:#000; font-size:12px; text-decoration:none; overflow:hidden;}
    +.smart_menu_a:hover, .smart_menu_a_hover{background-color:#348CCC; color:#fff; text-decoration:none;}
    +.smart_menu_li_separate{line-height:0; margin:3px; border-bottom:1px solid #B8CBCB; font-size:0;}
    +.smart_menu_triangle{width:0; height:0; border:5px dashed transparent; border-left:5px solid #666; overflow:hidden; position:absolute; top:7px; right:5px;}
    +.smart_menu_a:hover .smart_menu_triangle, .smart_menu_a_hover .smart_menu_triangle{border-left-color:#fff;}
    +.smart_menu_li_hover .smart_menu_box{top:-1px; left:130px;}
    +
    +
    diff --git a/src/main/webapp/plug-in/sliding/css/themesetting.css b/src/main/webapp/plug-in/sliding/css/themesetting.css
    new file mode 100644
    index 00000000..790ab90c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/css/themesetting.css
    @@ -0,0 +1,413 @@
    +@CHARSET "UTF-8";
    +
    +.themeSetting_container {
    +	position: absolute;
    +	left: 0;
    +	top: 0;
    +	z-index: 0;
    +	right: 0;
    +	bottom: 0;
    +	background: white
    +}
    +
    +.themeSetting_head {
    +	height: 22px;
    +	line-height: 22px;
    +	padding: 5px 0 0;
    +	width: 100%;
    +	font-size:12px;
    +	border: solid #a1b4b0;
    +	border-width: 0 0 1px
    +}
    +
    +.themeSetting_tab {
    +	cursor: pointer;
    +	display: inline;
    +	float: left;
    +	height: 22px;
    +	line-height: 22px;
    +	margin: 1px 1px 0 6px;
    +	text-align: center;
    +	width: 80px;
    +	position: relative
    +}
    +
    +.themeSetting_head .current {
    +	background: url("../images/tab_background.gif") repeat-x scroll left top	white;
    +	border-color: #a1b4b0;
    +	border-style: solid;
    +	border-width: 1px 1px 0;
    +	margin: 0 0 0 5px
    +	
    +}
    +
    +.themeSetting_body {
    +	height: 422px;
    +	overflow-y: auto;
    +	overflow-x: hidden
    +}
    +
    +html.ie6_0 .themeSetting_body,html.ie7_0 .themeSetting_body {
    +	position: relative
    +}
    +
    +.themeSetting_footer {
    +	height: 35px; background; # f0f0ef;
    +	border: 1px solid #ebebea;
    +	border-width: 1px 0 0;
    +	padding: 4px 5px 0
    +}
    +
    +.themeSetting_area {
    +	height: 100%;
    +	overflow-x: hidden;
    +	overflow-y: auto;
    +	width: 100%
    +}
    +
    +.dynamicThemeSetting {
    +	margin: 6px 40px 0 0;
    +	text-align: right
    +}
    +
    +.mobileSafari .dynamicThemeSetting {
    +	display: none
    +}
    +
    +.dynamicThemeSetting_inner {
    +	display: block;
    +	cursor: pointer;
    +	text-decoration: underline
    +}
    +
    +.themeSetting_wallpaper_body {
    +	height: 290px;
    +	margin: 8px 10px;
    +	border: 1px solid #d6dad9
    +}
    +
    +.themeSetting_wallpaper_body2 {
    +	height: 34px;
    +	margin: 8px 10px;
    +	border: 1px solid #d6dad9
    +}
    +
    +.themeSetting_wallpaper_body2 .body2_input {
    +	border: 1px solid #d6dad9;
    +	width: 380px;
    +	font-size: 12px;
    +	vertical-align: middle
    +}
    +
    +.themeSetting_selected2 .body2_label,.themeSetting_selected2 .body2_input
    +	{
    +	font-weight: bold
    +}
    +
    +.themeSetting_wallpaper_body2 .gray {
    +	color: #999
    +}
    +
    +.themeSetting_wallpaper_body2 .body2_button {
    +	border: 1px solid #aad8fc;
    +	vertical-align: middle;
    +	margin: 0 0 0 10px;
    +	height: 24px;
    +	background: #8bb7db;
    +	width: 65px;
    +	-webkit-border-radius: 3px;
    +	-khtml-border-radius: 3px;
    +	-moz-border-radius: 3px;
    +	border-radius: 3px
    +}
    +
    +.ie6_0 .body2_button {
    +	height: 20px
    +}
    +
    +.themeSetting_wallpaper_body2 .body_wrapper {
    +	float: left;
    +	margin: 5px 0 0 14px
    +}
    +
    +.ie6_0 .body_wrapper {
    +	margin-left: 8px
    +}
    +
    +.themeSetting_wallpaper_container {
    +	clear: both;
    +	zoom: 1
    +}
    +
    +.themeSetting_wallpaper_tips {
    +	display: block;
    +	float: left;
    +	line-height: 20px;
    +	margin: 6px 0 5px 14px
    +}
    +
    +html.ie6_0 .themeSetting_wallpaper_tips {
    +	margin-left: 8px
    +}
    +
    +.themeSetting_displayMode {
    +	display: block;
    +	float: right;
    +	margin: 6px 10px 0 0
    +}
    +
    +html.ie6_0 #wallpaperDisplayMode,html.ie7_0 #wallpaperDisplayMode {
    +	vertical-align: middle
    +}
    +
    +div.wallpaper_settingButton,a.themeSetting_settingButton {
    +	display: inline;
    +	float: left;
    +	margin: 5px 10px 0;
    +	width: 160px;
    +	height: 140px;
    +	cursor: pointer;
    +	-moz-border-radius: 5px;
    +	-khtml-border-radius: 5px;
    +	-webkit-border-radius: 5px;
    +	border-radius: 5px
    +}
    +
    +a.themeSetting_settingButton:hover {
    +	background: #cbe7fc
    +}
    +
    +div.themeSetting_hover {
    +	background: #cbe7fc
    +}
    +
    +div.themeSetting_selected,a.themeSetting_selected {
    +	background: #aad8fc
    +}
    +
    +.themeSetting_selected2 {
    +	background: #aad8fc
    +}
    +
    +div.wallpaper_settingButton {
    +	height: 120px
    +}
    +
    +.themeSetting_wallpaper_del {
    +	display: none;
    +	width: 22px;
    +	height: 23px;
    +	right: -10px;
    +	position: absolute;
    +	top: -10px;
    +	background: transparent url(images/del.png) no-repeat scroll 0 0
    +}
    +
    +html.ie6_0 .themeSetting_wallpaper_del {
    +	background: 0;
    +	filter: progid : DXImageTransform.Microsoft.AlphaImageLoader ( src =
    +		'http://0.web.qstatic.com/webqqpic/module/themesetting/images/del.png',
    +		sizingMethod = 'scale' )
    +}
    +
    +.wallpaper_loading {
    +	background: url("../images/loading.gif") no-repeat scroll 1px 2px
    +		transparent;
    +	color: #ccc;
    +	cursor: default;
    +	height: 16px;
    +	line-height: 16px;
    +	margin: auto;
    +	overflow: hidden;
    +	padding: 2px 0 2px 20px;
    +	width: 1px;
    +	margin-top: 35px
    +}
    +
    +.themeSetting_settingButton_icon {
    +	margin: 5px auto;
    +	width: 150px;
    +	height: 110px;
    +	-moz-border-radius: 5px;
    +	-khtml-border-radius: 5px;
    +	-webkit-border-radius: 5px;
    +	border-radius: 5px
    +}
    +
    +.themeSetting_settingButton_text {
    +	margin: 5px 0 0 0;
    +	text-align: center
    +}
    +
    +.sendWallpaperForm {
    +	display: inline;
    +	float: left;
    +	height: 110px;
    +	margin: 5px 10px 0;
    +	width: 160px
    +}
    +
    +.uploadWallpaperButton {
    +	height: 110px;
    +	width: 150px;
    +	cursor: pointer;
    +	margin: 5px auto;
    +	-moz-border-radius: 5px;
    +	-khtml-border-radius: 5px;
    +	-webkit-border-radius: 5px;
    +	border-radius: 5px;
    +	position: relative
    +}
    +
    +.themeSetting_wallpaper .upload,.themeSetting_wallpaper .upload_hover,.themeSetting_wallpaper .unable
    +	{
    +	background: url('../images/wallpaper_upload.gif') no-repeat
    +}
    +
    +.themeSetting_wallpaper .upload {
    +	overflow: hidden;
    +	border: 1px solid #c1bfbf;
    +	background-position: 0 0
    +}
    +
    +.themeSetting_wallpaper .upload_hover {
    +	overflow: hidden;
    +	background-position: 0 -110px
    +}
    +
    +.themeSetting_wallpaper .unable {
    +	overflow: hidden;
    +	background-position: 0 -220px;
    +	cursor: default
    +}
    +
    +.themeSetting_wallpaper .uploading {
    +	text-align: center;
    +	color: #827f7f;
    +	border: 1px solid #c1bfbf;
    +	overflow: hidden;
    +	cursor: default
    +}
    +
    +.uploadWallpaperButton .tips {
    +	margin-top: 5px;
    +	padding: 2px 0
    +}
    +
    +.sendWallpaperForm .f {
    +	cursor: pointer;
    +	margin: -2px 0 0 -1110px;
    +	opacity: 0;
    +	filter: alpha(opacity = 0);
    +	overflow: hidden;
    +	font-size: 90px
    +}
    +
    +.themeSetting_wallpaper_footer {
    +	height: 60px;
    +	margin: 8px 10px;
    +	border: 1px solid #d6dad9;
    +	background: #fcfdfe
    +}
    +
    +.ie6_0 .themeSetting_wallpaper_footer {
    +	margin-bottom: 0
    +}
    +
    +.themeSetting_custom_tip {
    +	display: none;
    +	position: absolute;
    +	width: 26px;
    +	height: 10px;
    +	top: 0;
    +	right: -4px;
    +	background: url('../images/feature_new.gif') no-repeat
    +}
    +
    +.themeSetting_apr_tips {
    +	display: block;
    +	margin: 6px 0 5px 14px
    +}
    +
    +.themeSetting_appearance {
    +	margin: 0 10px
    +}
    +
    +.themeSetting_apr_item {
    +	cursor: pointer;
    +	float: left;
    +	display: block;
    +	height: 25px;
    +	padding: 2px 0 0 5px;
    +	width: 60px
    +}
    +
    +.themeSetting_apr_txt {
    +	float: left;
    +	padding: 0 0 0 20px;
    +	width: 1px;
    +	height: 20px;
    +	text-indent: -999em;
    +	display: block
    +}
    +
    +.themeSetting_appearance .apr_selected .themeSetting_apr_txt {
    +	background: url('../images/appearance_selected.gif') no-repeat 6px 4px
    +}
    +
    +.themeSetting_apr_icon {
    +	display: block;
    +	height: 20px;
    +	width: 35px;
    +	float: left;
    +	background: url('../images/appearance.png') no-repeat;
    +	border: 1px solid #888
    +}
    +
    +.themeSetting_apr_black {
    +	background-position: 0 0
    +}
    +
    +.themeSetting_apr_cyan {
    +	background-position: 0 0
    +}
    +
    +.themeSetting_apr_light_green {
    +	background-position: 0 -20px
    +}
    +
    +.themeSetting_apr_pink {
    +	background-position: 0 -60px
    +}
    +
    +.themeSetting_apr_light_violet {
    +	background-position: 0 -40px
    +}
    +
    +.themeSetting_apr_red {
    +	background-position: 0 -40px
    +}
    +
    +.themeSetting_apr_grey {
    +	background-position: 0 -80px
    +}
    +
    +.themeSetting_apr_dark_brown {
    +	background-position: 0 -100px
    +}
    +
    +.themeSetting_apr_dark_voilet {
    +	background-position: 0 -120px
    +}
    +
    +.themeSetting_apr_purple {
    +	background-position: 0 -120px
    +}
    +
    +.themeSetting_apr_dark_blue {
    +	background-position: 0 -140px
    +}
    +
    +.themeSetting_apr_blue {
    +	background-position: 0 -140px
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/icon/1.png b/src/main/webapp/plug-in/sliding/icon/1.png
    new file mode 100644
    index 00000000..4b2cf077
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/1.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/2.png b/src/main/webapp/plug-in/sliding/icon/2.png
    new file mode 100644
    index 00000000..1441b964
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/2.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/3.png b/src/main/webapp/plug-in/sliding/icon/3.png
    new file mode 100644
    index 00000000..f03b903c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/3.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/3366.png b/src/main/webapp/plug-in/sliding/icon/3366.png
    new file mode 100644
    index 00000000..8d52a238
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/3366.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/5.png b/src/main/webapp/plug-in/sliding/icon/5.png
    new file mode 100644
    index 00000000..91dbc098
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/5.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/6.png b/src/main/webapp/plug-in/sliding/icon/6.png
    new file mode 100644
    index 00000000..453f9694
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/6.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/8.png b/src/main/webapp/plug-in/sliding/icon/8.png
    new file mode 100644
    index 00000000..40e9f76f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/8.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Agenda.png b/src/main/webapp/plug-in/sliding/icon/Agenda.png
    new file mode 100644
    index 00000000..74df2dc5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Agenda.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Applications Folder.png b/src/main/webapp/plug-in/sliding/icon/Applications Folder.png
    new file mode 100644
    index 00000000..ae04d7ba
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Applications Folder.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Applications Folder.png.png b/src/main/webapp/plug-in/sliding/icon/Applications Folder.png.png
    new file mode 100644
    index 00000000..9012186f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Applications Folder.png.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Ball.png b/src/main/webapp/plug-in/sliding/icon/Ball.png
    new file mode 100644
    index 00000000..ceb731fe
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Ball.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Burn.png b/src/main/webapp/plug-in/sliding/icon/Burn.png
    new file mode 100644
    index 00000000..c0876f05
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Burn.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Customize.png b/src/main/webapp/plug-in/sliding/icon/Customize.png
    new file mode 100644
    index 00000000..48951a5b
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Customize.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Documents Folder.png b/src/main/webapp/plug-in/sliding/icon/Documents Folder.png
    new file mode 100644
    index 00000000..4cfa1ec8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Documents Folder.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Documents Folder.png.png b/src/main/webapp/plug-in/sliding/icon/Documents Folder.png.png
    new file mode 100644
    index 00000000..731cbb06
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Documents Folder.png.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Eye.png b/src/main/webapp/plug-in/sliding/icon/Eye.png
    new file mode 100644
    index 00000000..e26484d8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Eye.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Finder.png b/src/main/webapp/plug-in/sliding/icon/Finder.png
    new file mode 100644
    index 00000000..09dfb92c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Finder.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/MacGimp.png b/src/main/webapp/plug-in/sliding/icon/MacGimp.png
    new file mode 100644
    index 00000000..4103da01
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/MacGimp.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Mensagens.png b/src/main/webapp/plug-in/sliding/icon/Mensagens.png
    new file mode 100644
    index 00000000..2ebd4dc8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Mensagens.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Nuvem.png b/src/main/webapp/plug-in/sliding/icon/Nuvem.png
    new file mode 100644
    index 00000000..29033a1a
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Nuvem.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Pixlr.png b/src/main/webapp/plug-in/sliding/icon/Pixlr.png
    new file mode 100644
    index 00000000..6fb6a666
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Pixlr.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Relogio.png b/src/main/webapp/plug-in/sliding/icon/Relogio.png
    new file mode 100644
    index 00000000..0cba3f30
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Relogio.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Super Disk.png b/src/main/webapp/plug-in/sliding/icon/Super Disk.png
    new file mode 100644
    index 00000000..12973f8d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Super Disk.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/System Folder.png b/src/main/webapp/plug-in/sliding/icon/System Folder.png
    new file mode 100644
    index 00000000..11ab8a0f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/System Folder.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/User.png b/src/main/webapp/plug-in/sliding/icon/User.png
    new file mode 100644
    index 00000000..5e608200
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/User.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Utilities Folder.png b/src/main/webapp/plug-in/sliding/icon/Utilities Folder.png
    new file mode 100644
    index 00000000..fc8a9e4c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Utilities Folder.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/Utilities.png b/src/main/webapp/plug-in/sliding/icon/Utilities.png
    new file mode 100644
    index 00000000..1b5654fb
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/Utilities.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/appmarket.png b/src/main/webapp/plug-in/sliding/icon/appmarket.png
    new file mode 100644
    index 00000000..21fc855b
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/appmarket.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/bianqian.png b/src/main/webapp/plug-in/sliding/icon/bianqian.png
    new file mode 100644
    index 00000000..b4f61937
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/bianqian.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/big.png b/src/main/webapp/plug-in/sliding/icon/big.png
    new file mode 100644
    index 00000000..092f5017
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/big.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/default.png b/src/main/webapp/plug-in/sliding/icon/default.png
    new file mode 100644
    index 00000000..fc8a9e4c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/default.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/douban.png b/src/main/webapp/plug-in/sliding/icon/douban.png
    new file mode 100644
    index 00000000..909d37a8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/douban.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/doudizhu.png b/src/main/webapp/plug-in/sliding/icon/doudizhu.png
    new file mode 100644
    index 00000000..b04b3fd8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/doudizhu.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/fastsearch.png b/src/main/webapp/plug-in/sliding/icon/fastsearch.png
    new file mode 100644
    index 00000000..eff5c36d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/fastsearch.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/firendpp.png b/src/main/webapp/plug-in/sliding/icon/firendpp.png
    new file mode 100644
    index 00000000..c2db5db0
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/firendpp.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/folder_o.png b/src/main/webapp/plug-in/sliding/icon/folder_o.png
    new file mode 100644
    index 00000000..fc8a9e4c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/folder_o.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/friend.png b/src/main/webapp/plug-in/sliding/icon/friend.png
    new file mode 100644
    index 00000000..c2db5db0
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/friend.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/friendgroup.png b/src/main/webapp/plug-in/sliding/icon/friendgroup.png
    new file mode 100644
    index 00000000..a7957b95
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/friendgroup.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/friendnear.png b/src/main/webapp/plug-in/sliding/icon/friendnear.png
    new file mode 100644
    index 00000000..0783be2c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/friendnear.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/game.png b/src/main/webapp/plug-in/sliding/icon/game.png
    new file mode 100644
    index 00000000..53b0ca60
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/game.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/internet.png b/src/main/webapp/plug-in/sliding/icon/internet.png
    new file mode 100644
    index 00000000..a7957b95
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/internet.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/jinshan.png b/src/main/webapp/plug-in/sliding/icon/jinshan.png
    new file mode 100644
    index 00000000..d7eb8cc7
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/jinshan.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/kaikai.png b/src/main/webapp/plug-in/sliding/icon/kaikai.png
    new file mode 100644
    index 00000000..c225b931
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/kaikai.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/kxjy.png b/src/main/webapp/plug-in/sliding/icon/kxjy.png
    new file mode 100644
    index 00000000..c225b931
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/kxjy.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/leshi.png b/src/main/webapp/plug-in/sliding/icon/leshi.png
    new file mode 100644
    index 00000000..da436cc5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/leshi.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/logo.png b/src/main/webapp/plug-in/sliding/icon/logo.png
    new file mode 100644
    index 00000000..06dc89d8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/logo.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/mail.png b/src/main/webapp/plug-in/sliding/icon/mail.png
    new file mode 100644
    index 00000000..2ebd4dc8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/mail.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/mangguo.png b/src/main/webapp/plug-in/sliding/icon/mangguo.png
    new file mode 100644
    index 00000000..41cf0847
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/mangguo.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/3366.png b/src/main/webapp/plug-in/sliding/icon/min/3366.png
    new file mode 100644
    index 00000000..940f24d4
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/3366.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/douban.png b/src/main/webapp/plug-in/sliding/icon/min/douban.png
    new file mode 100644
    index 00000000..67a1171a
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/douban.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/doudizhu.png b/src/main/webapp/plug-in/sliding/icon/min/doudizhu.png
    new file mode 100644
    index 00000000..f41a21e0
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/doudizhu.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/fastsearch.png b/src/main/webapp/plug-in/sliding/icon/min/fastsearch.png
    new file mode 100644
    index 00000000..d52d0322
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/fastsearch.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/friend.png b/src/main/webapp/plug-in/sliding/icon/min/friend.png
    new file mode 100644
    index 00000000..e85cb3ca
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/friend.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/friendgroup.png b/src/main/webapp/plug-in/sliding/icon/min/friendgroup.png
    new file mode 100644
    index 00000000..944b519f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/friendgroup.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/friendnear.png b/src/main/webapp/plug-in/sliding/icon/min/friendnear.png
    new file mode 100644
    index 00000000..56db4d8e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/friendnear.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/jinshan.png b/src/main/webapp/plug-in/sliding/icon/min/jinshan.png
    new file mode 100644
    index 00000000..747a0639
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/jinshan.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/kaikai.png b/src/main/webapp/plug-in/sliding/icon/min/kaikai.png
    new file mode 100644
    index 00000000..56335d16
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/kaikai.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/leshi.png b/src/main/webapp/plug-in/sliding/icon/min/leshi.png
    new file mode 100644
    index 00000000..6cfcb6f0
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/leshi.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/mangguo.png b/src/main/webapp/plug-in/sliding/icon/min/mangguo.png
    new file mode 100644
    index 00000000..3f0fbfba
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/mangguo.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/pixlr.png b/src/main/webapp/plug-in/sliding/icon/min/pixlr.png
    new file mode 100644
    index 00000000..aed32cad
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/pixlr.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/qidianzhongwen.png b/src/main/webapp/plug-in/sliding/icon/min/qidianzhongwen.png
    new file mode 100644
    index 00000000..e25260f5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/qidianzhongwen.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/qq.png b/src/main/webapp/plug-in/sliding/icon/min/qq.png
    new file mode 100644
    index 00000000..f89d22f4
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/qq.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/qqbaby.png b/src/main/webapp/plug-in/sliding/icon/min/qqbaby.png
    new file mode 100644
    index 00000000..ee7f4b9c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/qqbaby.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/qqread.png b/src/main/webapp/plug-in/sliding/icon/min/qqread.png
    new file mode 100644
    index 00000000..20380678
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/qqread.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/readGod.png b/src/main/webapp/plug-in/sliding/icon/min/readGod.png
    new file mode 100644
    index 00000000..081ae5be
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/readGod.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/sosomap.png b/src/main/webapp/plug-in/sliding/icon/min/sosomap.png
    new file mode 100644
    index 00000000..eef50f98
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/sosomap.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/tuanmap.png b/src/main/webapp/plug-in/sliding/icon/min/tuanmap.png
    new file mode 100644
    index 00000000..45e02ff5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/tuanmap.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/min/vadio.png b/src/main/webapp/plug-in/sliding/icon/min/vadio.png
    new file mode 100644
    index 00000000..f351163b
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/min/vadio.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/musicbox.png b/src/main/webapp/plug-in/sliding/icon/musicbox.png
    new file mode 100644
    index 00000000..5217d5c2
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/musicbox.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/qidian.png b/src/main/webapp/plug-in/sliding/icon/qidian.png
    new file mode 100644
    index 00000000..c5848bd8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/qidian.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/qidianzhongwen.png b/src/main/webapp/plug-in/sliding/icon/qidianzhongwen.png
    new file mode 100644
    index 00000000..12973f8d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/qidianzhongwen.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/qqbaby.png b/src/main/webapp/plug-in/sliding/icon/qqbaby.png
    new file mode 100644
    index 00000000..d87c215f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/qqbaby.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/qqread.png b/src/main/webapp/plug-in/sliding/icon/qqread.png
    new file mode 100644
    index 00000000..fc8a9e4c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/qqread.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/qqvedio.png b/src/main/webapp/plug-in/sliding/icon/qqvedio.png
    new file mode 100644
    index 00000000..f466a978
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/qqvedio.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/readGod.png b/src/main/webapp/plug-in/sliding/icon/readGod.png
    new file mode 100644
    index 00000000..397e2130
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/readGod.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/sosomap.png b/src/main/webapp/plug-in/sliding/icon/sosomap.png
    new file mode 100644
    index 00000000..1441b964
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/sosomap.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/tuanmap.png b/src/main/webapp/plug-in/sliding/icon/tuanmap.png
    new file mode 100644
    index 00000000..482e7ec8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/tuanmap.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/vadio.png b/src/main/webapp/plug-in/sliding/icon/vadio.png
    new file mode 100644
    index 00000000..7400a0cd
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/vadio.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/wangdesk.png b/src/main/webapp/plug-in/sliding/icon/wangdesk.png
    new file mode 100644
    index 00000000..cce8ab5c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/wangdesk.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/weibo.png b/src/main/webapp/plug-in/sliding/icon/weibo.png
    new file mode 100644
    index 00000000..fc8a9e4c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/weibo.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/xiami.png b/src/main/webapp/plug-in/sliding/icon/xiami.png
    new file mode 100644
    index 00000000..1c7e189f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/xiami.png differ
    diff --git a/src/main/webapp/plug-in/sliding/icon/zone.png b/src/main/webapp/plug-in/sliding/icon/zone.png
    new file mode 100644
    index 00000000..0638e1a5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/icon/zone.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/air_download_icon.png b/src/main/webapp/plug-in/sliding/images/air_download_icon.png
    new file mode 100644
    index 00000000..cf9dd91f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/air_download_icon.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/air_install_btn.png b/src/main/webapp/plug-in/sliding/images/air_install_btn.png
    new file mode 100644
    index 00000000..5c7096fb
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/air_install_btn.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/air_install_point.png b/src/main/webapp/plug-in/sliding/images/air_install_point.png
    new file mode 100644
    index 00000000..1f943991
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/air_install_point.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/alter_bg.png b/src/main/webapp/plug-in/sliding/images/alter_bg.png
    new file mode 100644
    index 00000000..3f2d6fa8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/alter_bg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/alter_image.png b/src/main/webapp/plug-in/sliding/images/alter_image.png
    new file mode 100644
    index 00000000..df702f3d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/alter_image.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/amg_1.png b/src/main/webapp/plug-in/sliding/images/amg_1.png
    new file mode 100644
    index 00000000..8f567d15
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/amg_1.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/amg_2.png b/src/main/webapp/plug-in/sliding/images/amg_2.png
    new file mode 100644
    index 00000000..ed7688c8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/amg_2.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/amg_3.png b/src/main/webapp/plug-in/sliding/images/amg_3.png
    new file mode 100644
    index 00000000..cd93eca2
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/amg_3.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/amg_4.png b/src/main/webapp/plug-in/sliding/images/amg_4.png
    new file mode 100644
    index 00000000..ca86cbd9
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/amg_4.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/amg_5.png b/src/main/webapp/plug-in/sliding/images/amg_5.png
    new file mode 100644
    index 00000000..9df1c123
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/amg_5.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/amg_body.png b/src/main/webapp/plug-in/sliding/images/amg_body.png
    new file mode 100644
    index 00000000..4c8f073a
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/amg_body.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/amg_top.png b/src/main/webapp/plug-in/sliding/images/amg_top.png
    new file mode 100644
    index 00000000..659db576
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/amg_top.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/app_starting (1).gif b/src/main/webapp/plug-in/sliding/images/app_starting (1).gif
    new file mode 100644
    index 00000000..df4569ba
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/app_starting (1).gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/app_starting.gif b/src/main/webapp/plug-in/sliding/images/app_starting.gif
    new file mode 100644
    index 00000000..df4569ba
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/app_starting.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/appbutton_mouseover_bg3.png b/src/main/webapp/plug-in/sliding/images/appbutton_mouseover_bg3.png
    new file mode 100644
    index 00000000..05335811
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/appbutton_mouseover_bg3.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/appbutton_mouseover_bg4.png b/src/main/webapp/plug-in/sliding/images/appbutton_mouseover_bg4.png
    new file mode 100644
    index 00000000..20cc29e1
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/appbutton_mouseover_bg4.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/appbutton_mouseover_bg5.png b/src/main/webapp/plug-in/sliding/images/appbutton_mouseover_bg5.png
    new file mode 100644
    index 00000000..249ef719
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/appbutton_mouseover_bg5.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/avatar.png b/src/main/webapp/plug-in/sliding/images/avatar.png
    new file mode 100644
    index 00000000..8d110370
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/avatar.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/back_click.png b/src/main/webapp/plug-in/sliding/images/back_click.png
    new file mode 100644
    index 00000000..260483ca
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/back_click.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/back_hover.png b/src/main/webapp/plug-in/sliding/images/back_hover.png
    new file mode 100644
    index 00000000..4ffac515
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/back_hover.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/back_normal.png b/src/main/webapp/plug-in/sliding/images/back_normal.png
    new file mode 100644
    index 00000000..ecd6fced
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/back_normal.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/2011.jpg b/src/main/webapp/plug-in/sliding/images/bg/2011.jpg
    new file mode 100644
    index 00000000..6a2b34f4
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/2011.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/7_7.jpg b/src/main/webapp/plug-in/sliding/images/bg/7_7.jpg
    new file mode 100644
    index 00000000..2125db72
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/7_7.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/blue.jpg b/src/main/webapp/plug-in/sliding/images/bg/blue.jpg
    new file mode 100644
    index 00000000..a44e65de
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/blue.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/blue1.jpg b/src/main/webapp/plug-in/sliding/images/bg/blue1.jpg
    new file mode 100644
    index 00000000..1c5dbb2a
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/blue1.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/blue_glow.jpg b/src/main/webapp/plug-in/sliding/images/bg/blue_glow.jpg
    new file mode 100644
    index 00000000..0bbeeffd
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/blue_glow.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/childhood.jpg b/src/main/webapp/plug-in/sliding/images/bg/childhood.jpg
    new file mode 100644
    index 00000000..9e73b59d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/childhood.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/christmas.jpg b/src/main/webapp/plug-in/sliding/images/bg/christmas.jpg
    new file mode 100644
    index 00000000..c5fb7fd6
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/christmas.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/cloud.jpg b/src/main/webapp/plug-in/sliding/images/bg/cloud.jpg
    new file mode 100644
    index 00000000..e325a96d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/cloud.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/dandelionDream.jpg b/src/main/webapp/plug-in/sliding/images/bg/dandelionDream.jpg
    new file mode 100644
    index 00000000..94c2e592
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/dandelionDream.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/dreamSky.jpg b/src/main/webapp/plug-in/sliding/images/bg/dreamSky.jpg
    new file mode 100644
    index 00000000..7dae54c6
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/dreamSky.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/grass.jpg b/src/main/webapp/plug-in/sliding/images/bg/grass.jpg
    new file mode 100644
    index 00000000..817607a6
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/grass.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/gravity.jpg b/src/main/webapp/plug-in/sliding/images/bg/gravity.jpg
    new file mode 100644
    index 00000000..e325a96d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/gravity.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/green.jpg b/src/main/webapp/plug-in/sliding/images/bg/green.jpg
    new file mode 100644
    index 00000000..1dc257a1
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/green.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/green_glow.jpg b/src/main/webapp/plug-in/sliding/images/bg/green_glow.jpg
    new file mode 100644
    index 00000000..d2ca419e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/green_glow.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_2011.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_2011.jpg
    new file mode 100644
    index 00000000..d9618742
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_2011.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_7_7.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_7_7.jpg
    new file mode 100644
    index 00000000..ae64a384
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_7_7.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_blue.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_blue.jpg
    new file mode 100644
    index 00000000..de6c8648
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_blue.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_blue1.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_blue1.jpg
    new file mode 100644
    index 00000000..123d7451
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_blue1.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_blue_glow.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_blue_glow.jpg
    new file mode 100644
    index 00000000..67802abd
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_blue_glow.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_childhood.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_childhood.jpg
    new file mode 100644
    index 00000000..5a37e38b
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_childhood.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_christmas.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_christmas.jpg
    new file mode 100644
    index 00000000..9cf8f6f0
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_christmas.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_cloud.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_cloud.jpg
    new file mode 100644
    index 00000000..d032c2e1
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_cloud.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_dandelionDream.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_dandelionDream.jpg
    new file mode 100644
    index 00000000..27abff5a
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_dandelionDream.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_dreamSky.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_dreamSky.jpg
    new file mode 100644
    index 00000000..25fcd709
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_dreamSky.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_grass.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_grass.jpg
    new file mode 100644
    index 00000000..f6fc9d8f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_grass.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_gravity.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_gravity.jpg
    new file mode 100644
    index 00000000..28283be2
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_gravity.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_green.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_green.jpg
    new file mode 100644
    index 00000000..4cdf7b2f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_green.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_green_glow.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_green_glow.jpg
    new file mode 100644
    index 00000000..20e4934b
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_green_glow.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_lookUpSky.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_lookUpSky.jpg
    new file mode 100644
    index 00000000..514bbd08
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_lookUpSky.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_metal.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_metal.jpg
    new file mode 100644
    index 00000000..41779a01
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_metal.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_midAutumn.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_midAutumn.jpg
    new file mode 100644
    index 00000000..14f2fc58
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_midAutumn.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_orange_glow.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_orange_glow.jpg
    new file mode 100644
    index 00000000..7a4e5237
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_orange_glow.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_paintingTime.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_paintingTime.jpg
    new file mode 100644
    index 00000000..45f599b6
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_paintingTime.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_pinky_flower.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_pinky_flower.jpg
    new file mode 100644
    index 00000000..416ee627
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_pinky_flower.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_pinky_light.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_pinky_light.jpg
    new file mode 100644
    index 00000000..85b19202
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_pinky_light.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_pinky_night.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_pinky_night.jpg
    new file mode 100644
    index 00000000..3621ba6e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_pinky_night.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_skyBlue.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_skyBlue.jpg
    new file mode 100644
    index 00000000..24918916
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_skyBlue.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_spring_festival.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_spring_festival.jpg
    new file mode 100644
    index 00000000..440a4e29
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_spring_festival.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_teachersDay.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_teachersDay.jpg
    new file mode 100644
    index 00000000..9e759748
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_teachersDay.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_universe.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_universe.jpg
    new file mode 100644
    index 00000000..536640e7
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_universe.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_valentinesDay.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_valentinesDay.jpg
    new file mode 100644
    index 00000000..a477c983
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_valentinesDay.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_wood1.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_wood1.jpg
    new file mode 100644
    index 00000000..6a60b754
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_wood1.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/theme_wood2.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_wood2.jpg
    new file mode 100644
    index 00000000..7a602ede
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/theme_wood2.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/universe.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/universe.jpg
    new file mode 100644
    index 00000000..b00639c5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/universe.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/icon/wood2.jpg b/src/main/webapp/plug-in/sliding/images/bg/icon/wood2.jpg
    new file mode 100644
    index 00000000..dd8e3c24
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/icon/wood2.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/lookUpSky.jpg b/src/main/webapp/plug-in/sliding/images/bg/lookUpSky.jpg
    new file mode 100644
    index 00000000..065cc83d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/lookUpSky.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/metal.jpg b/src/main/webapp/plug-in/sliding/images/bg/metal.jpg
    new file mode 100644
    index 00000000..2ea877b4
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/metal.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/midAutumn.jpg b/src/main/webapp/plug-in/sliding/images/bg/midAutumn.jpg
    new file mode 100644
    index 00000000..acb03a19
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/midAutumn.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/orange_glow.jpg b/src/main/webapp/plug-in/sliding/images/bg/orange_glow.jpg
    new file mode 100644
    index 00000000..545ea5d0
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/orange_glow.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/paintingTime.jpg b/src/main/webapp/plug-in/sliding/images/bg/paintingTime.jpg
    new file mode 100644
    index 00000000..5038398e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/paintingTime.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/pinky_flower.jpg b/src/main/webapp/plug-in/sliding/images/bg/pinky_flower.jpg
    new file mode 100644
    index 00000000..73a0934f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/pinky_flower.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/pinky_light.jpg b/src/main/webapp/plug-in/sliding/images/bg/pinky_light.jpg
    new file mode 100644
    index 00000000..bbeda1b5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/pinky_light.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/pinky_night.jpg b/src/main/webapp/plug-in/sliding/images/bg/pinky_night.jpg
    new file mode 100644
    index 00000000..078d6677
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/pinky_night.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/skyBlue.jpg b/src/main/webapp/plug-in/sliding/images/bg/skyBlue.jpg
    new file mode 100644
    index 00000000..70993348
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/skyBlue.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/spring_festival.jpg b/src/main/webapp/plug-in/sliding/images/bg/spring_festival.jpg
    new file mode 100644
    index 00000000..65936377
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/spring_festival.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/teachersDay.jpg b/src/main/webapp/plug-in/sliding/images/bg/teachersDay.jpg
    new file mode 100644
    index 00000000..7577869d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/teachersDay.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/universe.jpg b/src/main/webapp/plug-in/sliding/images/bg/universe.jpg
    new file mode 100644
    index 00000000..b00639c5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/universe.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/valentinesDay.jpg b/src/main/webapp/plug-in/sliding/images/bg/valentinesDay.jpg
    new file mode 100644
    index 00000000..9fa36a8f
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/valentinesDay.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/wood1.jpg b/src/main/webapp/plug-in/sliding/images/bg/wood1.jpg
    new file mode 100644
    index 00000000..c5cc5fe4
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/wood1.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg/wood2.jpg b/src/main/webapp/plug-in/sliding/images/bg/wood2.jpg
    new file mode 100644
    index 00000000..dd8e3c24
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg/wood2.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_sel_arr.gif b/src/main/webapp/plug-in/sliding/images/bg_sel_arr.gif
    new file mode 100644
    index 00000000..b4d93568
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_sel_arr.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_b.png b/src/main/webapp/plug-in/sliding/images/bg_task_b.png
    new file mode 100644
    index 00000000..40547803
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_b.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_cur.png b/src/main/webapp/plug-in/sliding/images/bg_task_cur.png
    new file mode 100644
    index 00000000..7950b3cb
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_cur.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_eqq.gif b/src/main/webapp/plug-in/sliding/images/bg_task_eqq.gif
    new file mode 100644
    index 00000000..4e30ae4c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_eqq.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_group_b.png b/src/main/webapp/plug-in/sliding/images/bg_task_group_b.png
    new file mode 100644
    index 00000000..d15e908d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_group_b.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_group_b_cur.png b/src/main/webapp/plug-in/sliding/images/bg_task_group_b_cur.png
    new file mode 100644
    index 00000000..9fd81de6
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_group_b_cur.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_group_b_msg.png b/src/main/webapp/plug-in/sliding/images/bg_task_group_b_msg.png
    new file mode 100644
    index 00000000..280a7772
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_group_b_msg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_group_b_over.png b/src/main/webapp/plug-in/sliding/images/bg_task_group_b_over.png
    new file mode 100644
    index 00000000..916e0096
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_group_b_over.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_group_m.png b/src/main/webapp/plug-in/sliding/images/bg_task_group_m.png
    new file mode 100644
    index 00000000..658bf12d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_group_m.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_group_m_msg.png b/src/main/webapp/plug-in/sliding/images/bg_task_group_m_msg.png
    new file mode 100644
    index 00000000..0ef729fd
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_group_m_msg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_group_m_over.png b/src/main/webapp/plug-in/sliding/images/bg_task_group_m_over.png
    new file mode 100644
    index 00000000..e3ff4f45
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_group_m_over.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_group_t.png b/src/main/webapp/plug-in/sliding/images/bg_task_group_t.png
    new file mode 100644
    index 00000000..658bf12d
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_group_t.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_group_t_msg.png b/src/main/webapp/plug-in/sliding/images/bg_task_group_t_msg.png
    new file mode 100644
    index 00000000..b340a297
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_group_t_msg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_group_t_over.png b/src/main/webapp/plug-in/sliding/images/bg_task_group_t_over.png
    new file mode 100644
    index 00000000..8305f706
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_group_t_over.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_main.png b/src/main/webapp/plug-in/sliding/images/bg_task_main.png
    new file mode 100644
    index 00000000..e665d267
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_main.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_msg.png b/src/main/webapp/plug-in/sliding/images/bg_task_msg.png
    new file mode 100644
    index 00000000..20c9ece5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_msg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_nor.png b/src/main/webapp/plug-in/sliding/images/bg_task_nor.png
    new file mode 100644
    index 00000000..6bb63e1b
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_nor.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_over.png b/src/main/webapp/plug-in/sliding/images/bg_task_over.png
    new file mode 100644
    index 00000000..d9b16681
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_over.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_page.gif b/src/main/webapp/plug-in/sliding/images/bg_task_page.gif
    new file mode 100644
    index 00000000..ac2a5501
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_page.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_page.png b/src/main/webapp/plug-in/sliding/images/bg_task_page.png
    new file mode 100644
    index 00000000..76cb13b8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_page.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_page_l.png b/src/main/webapp/plug-in/sliding/images/bg_task_page_l.png
    new file mode 100644
    index 00000000..f22c0c02
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_page_l.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/bg_task_page_r.png b/src/main/webapp/plug-in/sliding/images/bg_task_page_r.png
    new file mode 100644
    index 00000000..34620533
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/bg_task_page_r.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/btn_more.png b/src/main/webapp/plug-in/sliding/images/btn_more.png
    new file mode 100644
    index 00000000..14dda9c5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/btn_more.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/coming_soon.png b/src/main/webapp/plug-in/sliding/images/coming_soon.png
    new file mode 100644
    index 00000000..bfd3d297
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/coming_soon.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/dock_l.png b/src/main/webapp/plug-in/sliding/images/dock_l.png
    new file mode 100644
    index 00000000..e3490d0a
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/dock_l.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/dock_r.png b/src/main/webapp/plug-in/sliding/images/dock_r.png
    new file mode 100644
    index 00000000..9129c744
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/dock_r.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/dock_up.png b/src/main/webapp/plug-in/sliding/images/dock_up.png
    new file mode 100644
    index 00000000..b7a825a9
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/dock_up.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/helpmenu.png b/src/main/webapp/plug-in/sliding/images/helpmenu.png
    new file mode 100644
    index 00000000..7daa5c07
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/helpmenu.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/ico_loading2.gif b/src/main/webapp/plug-in/sliding/images/ico_loading2.gif
    new file mode 100644
    index 00000000..1f5d236e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/ico_loading2.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/iconbg_4.png b/src/main/webapp/plug-in/sliding/images/iconbg_4.png
    new file mode 100644
    index 00000000..d1416567
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/iconbg_4.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/jeecg.png b/src/main/webapp/plug-in/sliding/images/jeecg.png
    new file mode 100644
    index 00000000..b8853e93
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/jeecg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/line_y.png b/src/main/webapp/plug-in/sliding/images/line_y.png
    new file mode 100644
    index 00000000..20a3c14c
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/line_y.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/loading.gif b/src/main/webapp/plug-in/sliding/images/loading.gif
    new file mode 100644
    index 00000000..f343792e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/loading.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/portal_all_gif.gif b/src/main/webapp/plug-in/sliding/images/portal_all_gif.gif
    new file mode 100644
    index 00000000..7e76d1b8
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/portal_all_gif.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/portal_all_png.png b/src/main/webapp/plug-in/sliding/images/portal_all_png.png
    new file mode 100644
    index 00000000..a867f20b
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/portal_all_png.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/scrollbar_bg.gif b/src/main/webapp/plug-in/sliding/images/scrollbar_bg.gif
    new file mode 100644
    index 00000000..5df3faa3
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/scrollbar_bg.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/sprite_main_png.png b/src/main/webapp/plug-in/sliding/images/sprite_main_png.png
    new file mode 100644
    index 00000000..bf50d2fc
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/sprite_main_png.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/starting_bar.gif b/src/main/webapp/plug-in/sliding/images/starting_bar.gif
    new file mode 100644
    index 00000000..63656cd6
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/starting_bar.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/starting_logo.gif b/src/main/webapp/plug-in/sliding/images/starting_logo.gif
    new file mode 100644
    index 00000000..e97f4374
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/starting_logo.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/startmenu.gif b/src/main/webapp/plug-in/sliding/images/startmenu.gif
    new file mode 100644
    index 00000000..5bfc74dd
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/startmenu.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/startmenu.png b/src/main/webapp/plug-in/sliding/images/startmenu.png
    new file mode 100644
    index 00000000..18f8d26a
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/startmenu.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/suggess_list_bg.png b/src/main/webapp/plug-in/sliding/images/suggess_list_bg.png
    new file mode 100644
    index 00000000..f5dc2bd3
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/suggess_list_bg.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/tab_background.gif b/src/main/webapp/plug-in/sliding/images/tab_background.gif
    new file mode 100644
    index 00000000..8b7af057
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/tab_background.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/taskmenu_down.png b/src/main/webapp/plug-in/sliding/images/taskmenu_down.png
    new file mode 100644
    index 00000000..2e72de0e
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/taskmenu_down.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/taskmenu_down_disable.png b/src/main/webapp/plug-in/sliding/images/taskmenu_down_disable.png
    new file mode 100644
    index 00000000..60f5eb6b
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/taskmenu_down_disable.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/taskmenu_down_over.png b/src/main/webapp/plug-in/sliding/images/taskmenu_down_over.png
    new file mode 100644
    index 00000000..53c5b6cf
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/taskmenu_down_over.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/taskmenu_up.png b/src/main/webapp/plug-in/sliding/images/taskmenu_up.png
    new file mode 100644
    index 00000000..d8830506
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/taskmenu_up.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/taskmenu_up_disable.png b/src/main/webapp/plug-in/sliding/images/taskmenu_up_disable.png
    new file mode 100644
    index 00000000..9c178293
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/taskmenu_up_disable.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/taskmenu_up_over.png b/src/main/webapp/plug-in/sliding/images/taskmenu_up_over.png
    new file mode 100644
    index 00000000..31aae2c6
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/taskmenu_up_over.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/transparent.gif b/src/main/webapp/plug-in/sliding/images/transparent.gif
    new file mode 100644
    index 00000000..35d42e80
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/transparent.gif differ
    diff --git a/src/main/webapp/plug-in/sliding/images/warn_image.png b/src/main/webapp/plug-in/sliding/images/warn_image.png
    new file mode 100644
    index 00000000..4171dc50
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/warn_image.png differ
    diff --git a/src/main/webapp/plug-in/sliding/images/xiaofan.png b/src/main/webapp/plug-in/sliding/images/xiaofan.png
    new file mode 100644
    index 00000000..fed4f599
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/images/xiaofan.png differ
    diff --git a/src/main/webapp/plug-in/sliding/js/artDialog.js b/src/main/webapp/plug-in/sliding/js/artDialog.js
    new file mode 100644
    index 00000000..0da39bd2
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/artDialog.js
    @@ -0,0 +1,10 @@
    +/*
    + * artDialog 4.1.2
    + * Date: 2011-09-04 30:36
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +(function(l,g){if(l.jQuery){return jQuery}var k=l.art=function(r,s){return new k.fn.init(r,s)},m=false,p=[],n,i,c="opacity" in document.documentElement.style,b=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,f=/[\n\t]/g,h=/alpha\([^)]*\)/i,q=/opacity=([^)]*)/,e=/^([+-]=)?([\d+-.]+)(.*)$/;if(l.$===g){l.$=k}k.fn=k.prototype={constructor:k,ready:function(r){k.bindReady();if(k.isReady){r.call(document,k)}else{if(p){p.push(r)}}return this},hasClass:function(r){var s=" "+r+" ";if((" "+this[0].className+" ").replace(f," ").indexOf(s)>-1){return true}return false},addClass:function(r){if(!this.hasClass(r)){this[0].className+=" "+r}return this},removeClass:function(r){var s=this[0];if(!r){s.className=""}else{if(this.hasClass(r)){s.className=s.className.replace(r," ")}}return this},css:function(r,u){var s,t=this[0],v=arguments[0];if(typeof r==="string"){if(u===g){return k.css(t,r)}else{r==="opacity"?k.opacity.set(t,u):t.style[r]=u}}else{for(s in v){s==="opacity"?k.opacity.set(t,v[s]):t.style[s]=v[s]}}return this},show:function(){return this.css("display","block")},hide:function(){return this.css("display","none")},offset:function(){var t=this[0],v=t.getBoundingClientRect(),z=t.ownerDocument,w=z.body,r=z.documentElement,u=r.clientTop||w.clientTop||0,x=r.clientLeft||w.clientLeft||0,y=v.top+(self.pageYOffset||r.scrollTop)-u,s=v.left+(self.pageXOffset||r.scrollLeft)-x;return{left:s,top:y}},html:function(s){var r=this[0];if(s===g){return r.innerHTML}k.cleanData(r.getElementsByTagName("*"));r.innerHTML=s;return this},remove:function(){var r=this[0];k.cleanData(r.getElementsByTagName("*"));k.cleanData([r]);r.parentNode.removeChild(r);return this},bind:function(r,s){k.event.add(this[0],r,s);return this},unbind:function(r,s){k.event.remove(this[0],r,s);return this}};k.fn.init=function(r,t){var s,u;t=t||document;if(!r){return this}if(r.nodeType){this[0]=r;return this}if(r==="body"&&t.body){this[0]=t.body;return this}if(r==="head"||r==="html"){this[0]=t.getElementsByTagName(r)[0];return this}if(typeof r==="string"){s=b.exec(r);if(s&&s[2]){u=t.getElementById(s[2]);if(u&&u.parentNode){this[0]=u}return this}}if(typeof r==="function"){return k(document).ready(r)}this[0]=r;return this};k.fn.init.prototype=k.fn;k.noop=function(){};k.isWindow=function(r){return r&&typeof r==="object"&&"setInterval" in r};k.isArray=function(r){return Object.prototype.toString.call(r)==="[object Array]"};k.fn.find=function(u){var t,s=this[0],r=u.split(".")[1];if(r){if(document.getElementsByClassName){t=s.getElementsByClassName(r)}else{t=o(r,s)}}else{t=s.getElementsByTagName(u)}return k(t[0])};function o(x,s,z){s=s||document;z=z||"*";var v=0,u=0,y=[],t=s.getElementsByTagName(z),r=t.length,w=new RegExp("(^|\\s)"+x+"(\\s|$)");for(;v<r;v++){if(w.test(t[v].className)){y[u]=t[v];u++}}return y}k.each=function(w,x){var s,t=0,u=w.length,r=u===g;if(r){for(s in w){if(x.call(w[s],s,w[s])===false){break}}}else{for(var v=w[0];t<u&&x.call(v,t,v)!==false;v=w[++t]){}}return w};k.data=function(t,s,u){var r=k.cache,v=a(t);if(s===g){return r[v]}if(!r[v]){r[v]={}}if(u!==g){r[v][s]=u}return r[v][s]};k.removeData=function(t,s){var v=true,y=k.expando,r=k.cache,x=a(t),u=x&&r[x];if(!u){return}if(s){delete u[s];for(var w in u){v=false}if(v){delete k.cache[x]}}else{delete r[x];if(t.removeAttribute){t.removeAttribute(y)}else{t[y]=null}}};k.uuid=0;k.cache={};k.expando="@cache"+(new Date).getTime();function a(r){var t=k.expando,s=r===l?0:r[t];if(s===g){r[t]=s=++k.uuid}return s}k.event={add:function(v,t,x){var r,s,u=k.event,w=k.data(v,"@events")||k.data(v,"@events",{});r=w[t]=w[t]||{};s=r.listeners=r.listeners||[];s.push(x);if(!r.handler){r.elem=v;r.handler=u.handler(r);document.addEventListener?v.addEventListener(t,r.handler,false):v.attachEvent("on"+t,r.handler)}},remove:function(t,y,A){var v,r,z,x=k.event,w=true,u=k.data(t,"@events");if(!u){return}if(!y){for(v in u){x.remove(t,v)}return}r=u[y];if(!r){return}z=r.listeners;if(A){for(v=0;v<z.length;v++){z[v]===A&&z.splice(v--,1)}}else{r.listeners=[]}if(r.listeners.length===0){document.removeEventListener?t.removeEventListener(y,r.handler,false):t.detachEvent("on"+y,r.handler);delete u[y];r=k.data(t,"@events");for(var s in r){w=false}if(w){k.removeData(t,"@events")}}},handler:function(r){return function(u){u=k.event.fix(u||l.event);for(var s=0,v=r.listeners,t;t=v[s++];){if(t.call(r.elem,u)===false){u.preventDefault();u.stopPropagation()}}}},fix:function(t){if(t.target){return t}var r={target:t.srcElement||document,preventDefault:function(){t.returnValue=false},stopPropagation:function(){t.cancelBubble=true}};for(var s in t){r[s]=t[s]}return r}};k.cleanData=function(s){var t=0,u,r=s.length,v=k.event.remove,w=k.removeData;for(;t<r;t++){u=s[t];v(u);w(u)}};k.isReady=false;k.ready=function(){if(!k.isReady){if(!document.body){return setTimeout(k.ready,13)}k.isReady=true;if(p){var s,r=0;while((s=p[r++])){s.call(document,k)}p=null}}};k.bindReady=function(){if(m){return}m=true;if(document.readyState==="complete"){return k.ready()}if(document.addEventListener){document.addEventListener("DOMContentLoaded",n,false);l.addEventListener("load",k.ready,false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",n);l.attachEvent("onload",k.ready);var r=false;try{r=l.frameElement==null}catch(s){}if(document.documentElement.doScroll&&r){j()}}}};if(document.addEventListener){n=function(){document.removeEventListener("DOMContentLoaded",n,false);k.ready()}}else{if(document.attachEvent){n=function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",n);k.ready()}}}}function j(){if(k.isReady){return}try{document.documentElement.doScroll("left")}catch(r){setTimeout(j,1);return}k.ready()}k.css="defaultView" in document&&"getComputedStyle" in document.defaultView?function(s,r){return document.defaultView.getComputedStyle(s,false)[r]}:function(t,s){var r=s==="opacity"?k.opacity.get(t):t.currentStyle[s];return r||""};k.opacity={get:function(r){return c?document.defaultView.getComputedStyle(r,false).opacity:q.test((r.currentStyle?r.currentStyle.filter:r.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":1},set:function(u,v){if(c){return u.style.opacity=v}var t=u.style;t.zoom=1;var r="alpha(opacity="+v*100+")",s=t.filter||"";t.filter=h.test(s)?s.replace(h,r):t.filter+" "+r}};k.each(["Left","Top"],function(s,r){var t="scroll"+r;k.fn[t]=function(w){var u=this[0],v;v=d(u);return v?("pageXOffset" in v)?v[s?"pageYOffset":"pageXOffset"]:v.document.documentElement[t]||v.document.body[t]:u[t]}});function d(r){return k.isWindow(r)?r:r.nodeType===9?r.defaultView||r.parentWindow:false}k.each(["Height","Width"],function(s,r){var t=r.toLowerCase();k.fn[t]=function(u){var v=this[0];if(!v){return u==null?null:this}return k.isWindow(v)?v.document.documentElement["client"+r]||v.document.body["client"+r]:(v.nodeType===9)?Math.max(v.documentElement["client"+r],v.body["scroll"+r],v.documentElement["scroll"+r],v.body["offset"+r],v.documentElement["offset"+r]):null}});k.ajax=function(t){var v=l.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP"),s=t.url;if(t.cache===false){var u=(new Date()).getTime(),r=s.replace(/([?&])_=[^&]*/,"$1_="+u);s=r+((r===s)?(/\?/.test(s)?"&":"?")+"_="+u:"")}v.onreadystatechange=function(){if(v.readyState===4&&v.status===200){t.success&&t.success(v.responseText);v.onreadystatechange=k.noop}};v.open("GET",s,1);v.send(null)};k.fn.animate=function(r,u,z,C){u=u||400;if(typeof z==="function"){C=z}z=z&&k.easing[z]?z:"swing";var A=this,v,w,y,t,x,B,s={speed:u,easing:z,callback:function(){if(v!=null){A[0].style.overflow=""}C&&C()}};s.curAnim={};k.each(r,function(D,E){s.curAnim[D]=E});k.each(r,function(D,E){w=new k.fx(A[0],s,D);y=e.exec(E);t=parseFloat(D==="opacity"||(A[0].style&&A[0].style[D]!=null)?k.css(A[0],D):A[0][D]);x=parseFloat(y[2]);B=y[3];if(D==="height"||D==="width"){x=Math.max(0,x);v=[A[0].style.overflow,A[0].style.overflowX,A[0].style.overflowY]}w.custom(t,x,B)});if(v!=null){A[0].style.overflow="hidden"}return this};k.timers=[];k.fx=function(s,r,t){this.elem=s;this.options=r;this.prop=t};k.fx.prototype={custom:function(w,v,u){var s=this;s.startTime=k.fx.now();s.start=w;s.end=v;s.unit=u;s.now=s.start;s.state=s.pos=0;function r(){return s.step()}r.elem=s.elem;r();k.timers.push(r);if(!i){i=setInterval(k.fx.tick,13)}},step:function(){var v=this,u=k.fx.now(),r=true;if(u>=v.options.speed+v.startTime){v.now=v.end;v.state=v.pos=1;v.update();v.options.curAnim[v.prop]=true;for(var s in v.options.curAnim){if(v.options.curAnim[s]!==true){r=false}}if(r){v.options.callback.call(v.elem)}return false}else{var w=u-v.startTime;v.state=w/v.options.speed;v.pos=k.easing[v.options.easing](v.state,w,0,1,v.options.speed);v.now=v.start+((v.end-v.start)*v.pos);v.update();return true}},update:function(){var r=this;if(r.prop==="opacity"){k.opacity.set(r.elem,r.now)}else{if(r.elem.style&&r.elem.style[r.prop]!=null){r.elem.style[r.prop]=r.now+r.unit}else{r.elem[r.prop]=r.now}}}};k.fx.now=function(){return new Date().getTime()};k.easing={linear:function(t,u,r,s){return r+s*t},swing:function(t,u,r,s){return((-Math.cos(t*Math.PI)/2)+0.5)*s+r}};k.fx.tick=function(){var s=k.timers;for(var r=0;r<s.length;r++){!s[r]()&&s.splice(r--,1)}!s.length&&k.fx.stop()};k.fx.stop=function(){clearInterval(i);i=null};k.fn.stop=function(){var s=k.timers;for(var r=s.length-1;r>=0;r--){if(s[r].elem===this[0]){s.splice(r,1)}}return this};return k}(window));(function(d,m,h){d.noop=d.noop||function(){};var o,b,k,c,s=0,t=d(m),i=d(document),g=d("html"),f=d(function(){f=d("body")}),n=document.documentElement,a=m.VBArray&&!m.XMLHttpRequest,q="createTouch" in document&&!("onmousemove" in n)||/(iPhone|iPad|iPod)/i.test(navigator.userAgent),p="artDialog"+(new Date).getTime();var l=function(e,v,z){e=e||{};if(typeof e==="string"||e.nodeType===1){e={content:e,fixed:!q}}var w,y=[],A=l.defaults,x=e.follow=this.nodeType===1&&this||e.follow;for(var u in A){if(e[u]===h){e[u]=A[u]}}d.each({ok:"yesFn",cancel:"noFn",close:"closeFn",init:"initFn",okVal:"yesText",cancelVal:"noText"},function(B,C){e[B]=e[B]!==h?e[B]:e[C]});if(typeof x==="string"){x=d(x)[0]}e.id=x&&x[p+"follow"]||e.id||p+s;w=l.list[e.id];if(x&&w){return w.follow(x).focus()}if(w){return w.focus()}if(q){e.fixed=false}if(!d.isArray(e.button)){e.button=e.button?[e.button]:[]}if(v!==h){e.ok=v}if(z!==h){e.cancel=z}e.ok&&e.button.push({name:e.okVal,callback:e.ok,focus:true});e.cancel&&e.button.push({name:e.cancelVal,callback:e.cancel});l.defaults.zIndex=e.zIndex;s++;return l.list[e.id]=o?o._init(e):new l.fn._init(e)};l.fn=l.prototype={version:"4.1.2",_init:function(e){var w=this,v,u=e.icon,x=u&&(a?{png:"icons/"+u+".png"}:{backgroundImage:"url('"+e.path+"/skins/icons/"+u+".png')"});w._isRun=true;w.config=e;w.DOM=v=w.DOM||w._getDOM();v.wrap.addClass(e.skin);v.close[e.cancel===false?"hide":"show"]();v.max[e.max===false?"hide":"show"]();v.min[e.min===false?"hide":"show"]();v.rb.hide();v.icon[0].style.display=u?"":"none";v.iconBg.css(x||{background:"none"});v.se.css("cursor",e.resize?"se-resize":"auto");v.title.css("cursor",e.drag?"move":"auto");v.content.css("padding",e.padding);w[e.show?"show":"hide"](true);w.button(e.button).title(e.title).content(e.content,true).size(e.width,e.height).time(e.time);e.follow?w.follow(e.follow):w.position(e.left,e.top);w.focus(e.focus);e.lock&&w.lock();w._addEvent();w._ie6PngFix();o=null;e.init&&e.init.call(w,m);return w},content:function(w){var y,z,F,C,A=this,H=A.DOM,v=H.wrap[0],u=v.offsetWidth,G=v.offsetHeight,x=parseInt(v.style.left),D=parseInt(v.style.top),E=v.style.width,e=H.content,B=e[0];A._elemBack&&A._elemBack();v.style.width="auto";if(w===h){return B}if(typeof w==="string"){e.html(w)}else{if(w&&w.nodeType===1){C=w.style.display;y=w.previousSibling;z=w.nextSibling;F=w.parentNode;A._elemBack=function(){if(y&&y.parentNode){y.parentNode.insertBefore(w,y.nextSibling)}else{if(z&&z.parentNode){z.parentNode.insertBefore(w,z)}else{if(F){F.appendChild(w)}}}w.style.display=C;A._elemBack=null};e.html("");B.appendChild(w);w.style.display="block"}}if(!arguments[1]){if(A.config.follow){A.follow(A.config.follow)}else{u=v.offsetWidth-u;G=v.offsetHeight-G;x=x-u/2;D=D-G/2;v.style.left=Math.max(x,0)+"px";v.style.top=Math.max(D,0)+"px"}if(E&&E!=="auto"){v.style.width=v.offsetWidth+"px"}A._autoPositionType()}A._ie6SelectFix();A._runScript(B);return A},title:function(x){var v=this.DOM,u=v.wrap,w=v.title,e="aui_state_noTitle";if(x===h){return w[0]}if(x===false){w.hide().html("");u.addClass(e)}else{w.show().html(x||"");u.removeClass(e)}return this},position:function(A,G){var F=this,y=F.config,v=F.DOM.wrap[0],B=a?false:y.fixed,E=a&&F.config.fixed,z=i.scrollLeft(),I=i.scrollTop(),D=B?0:z,w=B?0:I,C=t.width(),u=t.height(),x=v.offsetWidth,H=v.offsetHeight,e=v.style;if(A||A===0){F._left=A.toString().indexOf("%")!==-1?A:null;A=F._toNumber(A,C-x);if(typeof A==="number"){A=E?(A+=z):A+D;e.left=Math.max(A,D)+"px"}else{if(typeof A==="string"){e.left=A}}}if(G||G===0){F._top=G.toString().indexOf("%")!==-1?G:null;G=F._toNumber(G,u-H);if(typeof G==="number"){G=E?(G+=I):G+w;e.top=Math.max(G,w)+"px"}else{if(typeof G==="string"){e.top=G}}}if(A!==h&&G!==h){F._follow=null;F._autoPositionType()}return F},size:function(w,D){var B,C,e,F,z=this,x=z.config,E=z.DOM,v=E.wrap,y=E.main,A=v[0].style,u=y[0].style;if(w){z._width=w.toString().indexOf("%")!==-1?w:null;B=t.width()-v[0].offsetWidth+y[0].offsetWidth;e=z._toNumber(w,B);w=e;if(typeof w==="number"){A.width="auto";u.width=Math.max(z.config.minWidth,w)+"px";A.width=v[0].offsetWidth+"px"}else{if(typeof w==="string"){u.width=w;w==="auto"&&v.css("width","auto")}}}if(D){z._height=D.toString().indexOf("%")!==-1?D:null;C=t.height()-v[0].offsetHeight+y[0].offsetHeight;F=z._toNumber(D,C);D=F;if(typeof D==="number"){u.height=Math.max(z.config.minHeight,D)+"px"}else{if(typeof D==="string"){u.height=D}}}z._ie6SelectFix();return z},follow:function(O){var e,C=this,P=C.config;if(typeof O==="string"||O&&O.nodeType===1){e=d(O);O=e[0]}if(!O||!O.offsetWidth&&!O.offsetHeight){return C.position(C._left,C._top)}var A=p+"follow",F=t.width(),v=t.height(),x=i.scrollLeft(),z=i.scrollTop(),y=e.offset(),K=O.offsetWidth,J=O.offsetHeight,B=a?false:P.fixed,w=B?y.left-x:y.left,H=B?y.top-z:y.top,D=C.DOM.wrap[0],N=D.style,u=D.offsetWidth,M=D.offsetHeight,E=w-(u-K)/2,I=H+J,L=B?0:x,G=B?0:z;E=E<L?w:(E+u>F)&&(w-u>L)?w-u+K:E;I=(I+M>v+G)&&(H-M>G)?H-M:I;N.left=E+"px";N.top=I+"px";C._follow&&C._follow.removeAttribute(A);C._follow=O;O[A]=P.id;C._autoPositionType();return C},button:function(){var w=this,u=arguments,A=w.DOM,e=A.wrap,y=A.buttons,v=y[0],B="aui_state_highlight",z=w._listeners=w._listeners||{},x=d.isArray(u[0])?u[0]:[].slice.call(u);if(u[0]===h){return v}d.each(x,function(E,G){var C=G.name,F=!z[C],D=!F?z[C].elem:document.createElement("button");if(!z[C]){z[C]={}}if(G.callback){z[C].callback=G.callback}if(G.className){D.className=G.className}if(G.focus){w._focus&&w._focus.removeClass(B);w._focus=d(D).addClass(B);w.focus()}D[p+"callback"]=C;D.disabled=!!G.disabled;if(F){D.innerHTML=C;z[C].elem=D;v.appendChild(D)}});y[0].style.display=x.length?"":"none";w._ie6SelectFix();return w},show:function(){this.DOM.wrap.show();!arguments[0]&&this._lockMaskWrap&&this._lockMaskWrap.show();return this},hide:function(){this.DOM.wrap.hide();!arguments[0]&&this._lockMaskWrap&&this._lockMaskWrap.hide();return this},close:function(){if(!this._isRun){return this}var y=this,x=y.DOM,w=x.wrap,z=l.list,v=y.config.close,e=y.config.follow;y.time();if(typeof v==="function"&&v.call(y,m)===false){return y}y.unlock();y._elemBack&&y._elemBack();w[0].className=w[0].style.cssText="";x.title.html("");x.content.html("");x.buttons.html("");if(l.focus===y){l.focus=null}if(e){e.removeAttribute(p+"follow")}delete z[y.config.id];y._removeEvent();y.hide(true)._setAbsolute();for(var u in y){if(y.hasOwnProperty(u)&&u!=="DOM"){delete y[u]}}o?w.remove():o=y;return y},time:function(e){var v=this,u=v.config.cancelVal,w=v._timer;w&&clearTimeout(w);if(e){v._timer=setTimeout(function(){v._click(u)},1000*e)}return v},focus:function(){var A,x=this,w=x.DOM,v=w.wrap,z=l.focus,u=l.defaults.zIndex++;v.css("zIndex",u);x._lockMask&&x._lockMask.css("zIndex",u-1);z&&z.DOM.wrap.removeClass("aui_state_focus");l.focus=x;v.addClass("aui_state_focus");if(!arguments[0]){try{A=x._focus&&x._focus[0]||w.close[0];A&&A.focus()}catch(y){}}return x},lock:function(){if(this._lock){return this}var y=this,z=l.defaults.zIndex-1,v=y.DOM.wrap,x=y.config,A=i.width(),D=i.height(),B=y._lockMaskWrap||d(f[0].appendChild(document.createElement("div"))),w=y._lockMask||d(B[0].appendChild(document.createElement("div"))),u="(document).documentElement",e=q?"width:"+A+"px;height:"+D+"px":"width:100%;height:100%",C=a?"position:absolute;left:expression("+u+".scrollLeft);top:expression("+u+".scrollTop);width:expression("+u+".clientWidth);height:expression("+u+".clientHeight)":"";y.focus(true);v.addClass("aui_state_lock");B[0].style.cssText=e+";position:fixed;z-index:"+z+";top:0;left:0;overflow:hidden;"+C;w[0].style.cssText="height:100%;background:"+x.background+";filter:alpha(opacity=0);opacity:0";if(a){w.html('<iframe src="about:blank" style="width:100%;height:100%;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0)"></iframe>')}w.stop();w.bind("click",function(){y._reset()});if(x.duration===0){w.css({opacity:x.opacity})}else{w.animate({opacity:x.opacity},x.duration)}y._lockMaskWrap=B;y._lockMask=w;y._lock=true;return y},unlock:function(){var x=this,v=x._lockMaskWrap,e=x._lockMask;if(!x._lock){return x}var w=v[0].style;var u=function(){if(a){w.removeExpression("width");w.removeExpression("height");w.removeExpression("left");w.removeExpression("top")}w.cssText="display:none";o&&v.remove()};e.stop().unbind();x.DOM.wrap.removeClass("aui_state_lock");if(!x.config.duration){u()}else{e.animate({opacity:0},x.config.duration,u)}x._lock=false;return x},_getDOM:function(){var x=document.createElement("div");x.style.cssText="position:absolute;left:0;top:0";x.innerHTML=l.templates;document.body.appendChild(x);var u,w=0,y={wrap:d(x)},v=x.getElementsByTagName("*"),e=v.length;for(;w<e;w++){u=v[w].className.split("aui_")[1];if(u){y[u]=d(v[w])}}return y},_toNumber:function(e,v){if(!e&&e!==0||typeof e==="number"){return e}var u=e.length-1;if(e.lastIndexOf("px")===u){e=parseInt(e)}else{if(e.lastIndexOf("%")===u){e=parseInt(v*e.split("%")[0]/100)}}return e},_ie6PngFix:a?function(){var u=0,w,z,v,e,y=l.defaults.path+"/skins/",x=this.DOM.wrap[0].getElementsByTagName("*");for(;u<x.length;u++){w=x[u];z=w.currentStyle.png;if(z){v=y+z;e=w.runtimeStyle;e.backgroundImage="none";e.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+v+"',sizingMethod='crop')"}}}:d.noop,_ie6SelectFix:a?function(){var u=this.DOM.wrap,x=u[0],y=p+"iframeMask",w=u[y],v=x.offsetWidth,e=x.offsetHeight;v=v+"px";e=e+"px";if(w){w.style.width=v;w.style.height=e}else{w=x.appendChild(document.createElement("iframe"));u[y]=w;w.src="about:blank";w.style.cssText="position:absolute;z-index:-1;left:0;top:0;filter:alpha(opacity=0);width:"+v+";height:"+e}}:d.noop,_runScript:function(y){var e,w=0,z=0,v=y.getElementsByTagName("script"),x=v.length,u=[];for(;w<x;w++){if(v[w].type==="text/dialog"){u[z]=v[w].innerHTML;z++}}if(u.length){u=u.join("");e=new Function(u);e.call(this)}},_autoPositionType:function(){this[this.config.fixed?"_setFixed":"_setAbsolute"]()},_setFixed:(function(){a&&d(function(){var e="backgroundAttachment";if(g.css(e)!=="fixed"&&f.css(e)!=="fixed"){g.css({backgroundImage:"url(about:blank)",backgroundAttachment:"fixed"})}});return function(){var w=this.DOM.wrap,x=w[0].style;if(a){var z=parseInt(w.css("left")),y=parseInt(w.css("top")),v=i.scrollLeft(),u=i.scrollTop(),e="(document.documentElement)";this._setAbsolute();x.setExpression("left","eval("+e+".scrollLeft + "+(z-v)+') + "px"');x.setExpression("top","eval("+e+".scrollTop + "+(y-u)+') + "px"')}else{x.position="fixed"}}}()),_setAbsolute:function(){var e=this.DOM.wrap[0].style;if(a){e.removeExpression("left");e.removeExpression("top")}e.position="absolute"},_click:function(e){var v=this,u=v._listeners[e]&&v._listeners[e].callback;if(e=="max"){v._maxWin();return false}if(e=="min"){v._minWin();return false}if(e=="rb"){v._rbWin();return false}return typeof u!=="function"||u.call(v,m)!==false?v.close():v},_reset:function(z){var y,x=this,e=x._winSize||t.width()*t.height(),w=x._follow,u=x._width,B=x._height,v=x._left,A=x._top;if(z){y=x._winSize=t.width()*t.height();if(e===y){return}}if(u||B){x.size(u,B)}if(w){x.follow(w)}else{if(v||A){x.position(v,A)}}},_maxWin:function(){var u=this,e=u.DOM;u.position(0,0);u.size("100%","92%");e.max[0].style.display="none";e.rb[0].style.display="block";u._setFixed();u._setAbsolute()},_rbWin:function(){var x=this,w=x.DOM,v=x.follow,u=x.config.width,e=x.config.height,z=x.config.left,y=x.config.top;if(u||e){x.size(u,e)}if(z||y){x.position(z,y)}w.max[0].style.display="block";w.rb[0].style.display="none"},_minWin:function(){var e=this;e.hide()},_addEvent:function(){var e,x=this,u=x.config,v="CollectGarbage" in m,w=x.DOM;x._winResize=function(){e&&clearTimeout(e);e=setTimeout(function(){x._reset(v)},40)};t.bind("resize",x._winResize);w.wrap.bind("click",function(z){var A=z.target,y;if(A.disabled){return false}if(A===w.max[0]){x._click("max");return false}else{if(A===w.rb[0]){x._click("rb");return false}else{if(A===w.min[0]){x._click("min");return false}else{if(A===w.close[0]){x._click(u.cancelVal);return false}else{y=A[p+"callback"];y&&x._click(y)}}}}x._ie6SelectFix()}).bind("mousedown",function(){x.focus(true)})},_removeEvent:function(){var u=this,e=u.DOM;e.wrap.unbind();t.unbind("resize",u._winResize)}};l.fn._init.prototype=l.fn;d.fn.dialog=d.fn.artDialog=function(){var e=arguments;this[this.live?"live":"bind"]("click",function(){l.apply(this,e);return false});return this};l.focus=null;l.list={};l.notice=function(C){var v=C||{},A,e,z,u,B,x=800;var w={id:"Notice",left:"100%",top:"100%",fixed:true,drag:false,resize:false,follow:null,lock:false,init:function(D){A=this;e=A.config;u=A.DOM.wrap;B=parseInt(u[0].style.top);z=B+u[0].offsetHeight;u.css("top",z+"px").animate({top:B+"px"},x,function(){v.init&&v.init.call(A,D)})},close:function(D){u.animate({top:z+"px"},x,function(){v.close&&v.close.call(this,D);e.close=d.noop;A.close()});return false}};for(var y in v){if(w[y]===h){w[y]=v[y]}}return l(w)};i.bind("keydown",function(v){var x=v.target,y=x.nodeName,e=/^INPUT|TEXTAREA$/,u=l.focus,w=v.keyCode;if(!u||!u.config.esc||e.test(y)){return}w===27&&u._click(u.config.cancelVal)});c=m._artDialog_path||(function(e,u,v){for(u in e){if(e[u].src&&e[u].src.indexOf("artDialog")!==-1){v=e[u]}}b=v||e[e.length-1];v=b.src.replace(/\\/g,"/");return v.lastIndexOf("/")<0?".":v.substring(0,v.lastIndexOf("/"))}(document.getElementsByTagName("script")));k=b.src.split("skin=")[1];if(k){var j=document.createElement("link");j.rel="stylesheet";j.href=c+"/skins/"+k+".css?"+l.fn.version;b.parentNode.insertBefore(j,b)}t.bind("load",function(){setTimeout(function(){if(s){return}l({left:"-9999em",time:9,fixed:false,lock:false,focus:false})},150)});try{document.execCommand("BackgroundImageCache",false,true)}catch(r){}l.templates='<div class="aui_outer"><table class="aui_border"><tbody><tr><td class="aui_nw"></td><td class="aui_n"></td><td class="aui_ne"></td></tr><tr><td class="aui_w"></td><td class="aui_c"><div class="aui_inner"><table class="aui_dialog"><tbody><tr><td colspan="2" class="aui_header"><div class="aui_titleBar"><div class="aui_title"></div><a class="aui_min" href="javascript:/*artDialog*/;"></a><a class="aui_max" href="javascript:/*artDialog*/;"></a><a class="aui_rb" href="javascript:/*artDialog*/;"></a><a class="aui_close" href="javascript:/*artDialog*/;">\xd7</a></div></td></tr><tr><td class="aui_icon"><div class="aui_iconBg"></div></td><td class="aui_main"><div class="aui_content"></div></td></tr><tr><td colspan="2" class="aui_footer"><div class="aui_buttons"></div></td></tr></tbody></table></div></td><td class="aui_e"></td></tr><tr><td class="aui_sw"></td><td class="aui_s"></td><td class="aui_se"></td></tr></tbody></table></div>';l.defaults={content:'<div class="aui_loading"><span>loading..</span></div>',title:"\u6d88\u606f",button:null,ok:null,cancel:null,init:null,close:null,okVal:"\u786E\u5B9A",cancelVal:"\u53D6\u6D88",width:"auto",height:"auto",minWidth:96,minHeight:32,padding:"20px 25px",skin:"",icon:null,time:null,esc:true,focus:true,show:true,follow:null,path:c,lock:false,background:"#000",opacity:0.7,duration:300,fixed:false,left:"50%",top:"38.2%",zIndex:1987,resize:true,drag:true,max:true,min:true};m.artDialog=d.dialog=d.artDialog=l}((window.jQuery&&(window.art=jQuery))||window.art,this));(function(e){var h,b,a=e(window),d=e(document),i=document.documentElement,f=!-[1,]&&!("minWidth" in i.style),g="onlosecapture" in i,c="setCapture" in i;artDialog.dragEvent=function(){var k=this,j=function(l){var m=k[l];k[l]=function(){return m.apply(k,arguments)}};j("start");j("move");j("end")};artDialog.dragEvent.prototype={onstart:e.noop,start:function(j){d.bind("mousemove",this.move).bind("mouseup",this.end);this._sClientX=j.clientX;this._sClientY=j.clientY;this.onstart(j.clientX,j.clientY);return false},onmove:e.noop,move:function(j){this._mClientX=j.clientX;this._mClientY=j.clientY;this.onmove(j.clientX-this._sClientX,j.clientY-this._sClientY);return false},onend:e.noop,end:function(j){d.unbind("mousemove",this.move).unbind("mouseup",this.end);this.onend(j.clientX,j.clientY);return false}};b=function(j){var o,p,w,l,s,u,r=artDialog.focus,m=r.config,x=r.DOM,k=x.wrap,t=x.title,n=x.main,q=m.width;relheight=m.height;var v="getSelection" in window?function(){window.getSelection().removeAllRanges()}:function(){try{document.selection.empty()}catch(y){}};h.onstart=function(z,A){if(u){p=n[0].offsetWidth;w=n[0].offsetHeight}else{l=k[0].offsetLeft;s=k[0].offsetTop}d.bind("dblclick",h.end);!f&&g?t.bind("losecapture",h.end):a.bind("blur",h.end);c&&t[0].setCapture();k.addClass("aui_state_drag");r.focus()};h.onmove=function(A,G){if(u){var D=k[0].style,C=n[0].style,B=A+p,z=G+w;D.width="auto";C.width=B+"px";D.width=k[0].offsetWidth+"px";C.height=Math.max(0,z)+"px"}else{var C=k[0].style,F=A+l,E=G+s;m.left=Math.max(o.minX,Math.min(o.maxX,F));m.top=Math.max(o.minY,Math.min(o.maxY,E));C.left=m.left+"px";C.top=m.top+"px"}v();r._ie6SelectFix()};h.onend=function(z,A){d.unbind("dblclick",h.end);!f&&g?t.unbind("losecapture",h.end):a.unbind("blur",h.end);c&&t[0].releaseCapture();f&&r._autoPositionType();k.removeClass("aui_state_drag")};u=j.target===x.se[0]?true:false;o=(function(){var z,y,B=r.DOM.wrap[0],E=B.style.position==="fixed",D=B.offsetWidth,H=B.offsetHeight,F=a.width(),A=a.height(),G=E?0:d.scrollLeft(),C=E?0:d.scrollTop(),z=F-D+G;y=A-H+C;return{minX:G,minY:C,maxX:z,maxY:y}})();h.start(j)};d.bind("mousedown",function(m){var k=artDialog.focus;if(!k){return}var n=m.target,j=k.config,l=k.DOM;if(j.drag!==false&&n===l.title[0]||j.resize!==false&&n===l.se[0]){h=h||new artDialog.dragEvent();b(m);return false}})})(window.jQuery||window.art);
    diff --git a/src/main/webapp/plug-in/sliding/js/data.js b/src/main/webapp/plug-in/sliding/js/data.js
    new file mode 100644
    index 00000000..4703b2d7
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/data.js
    @@ -0,0 +1,233 @@
    +锘緿ATA={
    +	app:{//妗岄潰1
    +		'dtbd':{
    +			appid:'2534',
    +			icon:'Customize.png',
    +			name:'online寮鍙',
    +			asc :1
    +		},
    +		'sosomap':{
    +			appid:'42',
    +			icon:'Applications Folder.png',
    +			name:'琛ㄥ崟閰嶇疆',
    +			asc :2
    +		},
    +		'jinshan':{
    +			appid:'8992',
    +			icon:'Documents Folder.png',
    +			name:'鍔ㄦ佽〃鍗曢厤缃',
    +			asc :3
    +		},
    +		'douban':{
    +			appid:'3402',
    +			icon:'douban.png',
    +			name:'璞嗙摚鐢靛彴',
    +			asc :4
    +		},
    +		'Pixlr':{
    +			appid:'64',
    +			icon:'pixlr.png',
    +			name:'Pixlr',
    +			asc:5
    +		},
    +		'weather':{
    +			appid:'18',
    +			icon:'5.png',
    +			name:'澶╂皵',
    +			asc:6
    +		},
    +		'Clock':{
    +			appid:'20',
    +			icon:'8.png',
    +			name:'鏃堕挓',
    +			asc:7,
    +		},
    +		
    +		'mangguo':{
    +			appid:'3401',
    +			icon:'User.png',
    +			name:'鐢ㄦ埛鍒嗘瀽',
    +			asc :1
    +		},
    +		'tuanmap':{
    +			appid:'2527',
    +			icon:'Burn.png',
    +			name:'鎶ヨ〃鍒嗘瀽',
    +			asc :2
    +		},
    +		'fastsearch':{
    +			appid:'3693',
    +			icon:'fastsearch.png',
    +			name:'蹇掓煡璇',
    +			asc :3
    +		},
    +		'bianqian':{
    +			appid:'10',
    +			icon:'bianqian.png',
    +			name:'渚跨',
    +			asc :4
    +		},
    +		'wangdesk':{
    +			appid:'13',
    +			icon:'wangdesk.png',
    +			name:'缃戠粶纭洏',
    +			asc :5
    +		},
    +		'friend':{
    +			appid:'21',
    +			icon:'Finder.png',
    +			name:'鐢ㄦ埛绠$悊',
    +			asc :1
    +		},
    +		'friendnear':{
    +			appid:'31',
    +			icon:'friendnear.png',
    +			name:'鏁版嵁瀛楀吀',
    +			asc :2
    +		},
    +		'friendgroup':{
    +			appid:'32',
    +			icon:'friendgroup.png',
    +			name:'瑙掕壊绠$悊',
    +			asc :3
    +		},
    +		'kaikai':{
    +			appid:'2250',
    +			icon:'kaikai.png',
    +			name:'鑿滃崟绠$悊',
    +			asc :4
    +		},
    +		'kxjy':{
    +			appid:'2535',
    +			icon:'kxjy.png',
    +			name:'鍥炬爣绠$悊',
    +			asc :5
    +		},
    +		
    +		'dygl':{
    +			appid:'2535',
    +			icon:'kxjy.png',
    +			name:'鍥炬爣绠$悊',
    +			asc :5
    +		},
    +		'qidianzhongwen':{
    +			appid:'2528',
    +			icon:'qidianzhongwen.png',
    +			name:'琛ㄥ崟楠岃瘉',
    +			asc :1
    +		},
    +		'qqread':{
    +			appid:'45',
    +			icon:'qqread.png',
    +			name:'涓瀵瑰妯″瀷',
    +			asc :2
    +		},
    +		'xiami':{
    +			appid:'2526',
    +			icon:'xiami.png',
    +			name:'鐗规畩甯冨眬',
    +			asc :3
    +		},
    +		'musicbox':{
    +			appid:'56',
    +			icon:'musicbox.png',
    +			name:'鍦ㄧ嚎word',
    +			asc :4
    +		},
    +		'vadio':{
    +			appid:'15',
    +			icon:'vadio.png',
    +			name:'澶氶檮浠剁鐞',
    +			asc :5
    +		},
    +		'leshi':{
    +			appid:'3148',
    +			icon:'leshi.png',
    +			name:'涔愯缃',
    +			asc :6
    +		},
    +		'doudizhi':{
    +			appid:'48',
    +			icon:'Super Disk.png',
    +			name:'鏁版嵁鐩戞帶',
    +			asc :1
    +		},
    +		'3366':{
    +			appid:'49',
    +			icon:'Utilities.png',
    +			name:'瀹氭椂浠诲姟',
    +			asc :2
    +		},
    +		'qqbaby':{
    +			appid:'26',
    +			icon:'fastsearch.png',
    +			name:'绯荤粺鏃ュ織',
    +			asc :3
    +		},
    +		'game':{
    +			appid:'1000',
    +			icon:'Utilities Folder.png',
    +			name:'鍦ㄧ嚎缁存姢',
    +			asc :4
    +		}
    +	},
    +	sApp:{//渚ц竟鏍忓簲鐢
    +        /*'297e20104620167201462016b5fe001f':{
    +            appid:'297e20104620167201462016b5fe001f',
    +            icon:'plug-in/accordion/images/desk/user.png',
    +            name:'鐢ㄦ埛绠$悊',
    +            asc :1,
    +            url: 'userController.do?user'
    +        },
    +        '297e20104620167201462016b6020021':{
    +            appid:'297e20104620167201462016b6020021',
    +            icon:'plug-in/accordion/images/desk/role.png',
    +            name:'瑙掕壊绠$悊',
    +            asc :2,
    +            url: 'roleController.do?role'
    +        }*/
    +		/*'appmarket':{
    +			appid:'1',
    +			icon:'appmarket.png',
    +			url:'http://www.jeecg.org/',
    +			name:'JEECG璁哄潧',//搴旂敤甯傚満
    +			asc :1
    +		},
    +		'qq':{
    +			appid:'2',
    +			icon:'big.png',
    +			url:'http://w.qq.com/',
    +			name:'WebQQ',
    +			asc :2
    +		},
    +		'weibo':{
    +			appid:'3',
    +			icon:'weibo.png',
    +			url:'http://1.t.qq.com/',//http://t.qq.com/
    +			name:'鑵捐寰崥',
    +			asc :3
    +		},
    +		'mail':{
    +			appid:'4',
    +			icon:'mail.png',
    +			url:'https://w.mail.qq.com/',
    +			name:'鑵捐閭',
    +			asc :4
    +		},
    +		'zone':{
    +			appid:'5',
    +			icon:'zone.png',
    +			//http://qzone.qq.com/绌洪棿鏈夐棶棰橈紝鍓嶄竴涓棤娉曚繚鎸乻ession锛屽悗涓涓洿鎺ュ脊鍒版婚〉闈
    +			url:'http://z.qq.com/',
    +			name:'QQ绌洪棿',
    +			asc :5
    +		},
    +		'internet':{
    +			appid:'6',
    +			icon:'internet.png',
    +			url:'http://www.baidu.com/',
    +			name:'浜掕仈缃戞悳绱',
    +			asc :6
    +		}*/
    +	}
    +};
    diff --git a/src/main/webapp/plug-in/sliding/js/iframeTools.js b/src/main/webapp/plug-in/sliding/js/iframeTools.js
    new file mode 100644
    index 00000000..ae4d64e2
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/iframeTools.js
    @@ -0,0 +1,10 @@
    +/*
    + * artDialog iframeTools
    + * Date: 2011-08-29 17:25
    + * http://code.google.com/p/artdialog/
    + * (c) 2009-2011 TangBin, http://www.planeArt.cn
    + *
    + * This is licensed under the GNU LGPL, version 2.1 or later.
    + * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
    + */
    +(function(g,k,a,f){var l,i,d,b="@ARTDIALOG.DATA",c="@ARTDIALOG.OPEN",e="@ARTDIALOG.OPENER",h=k.name=k.name||"@ARTDIALOG.WINNAME"+(new Date).getTime(),j=k.VBArray&&!k.XMLHttpRequest;g(function(){!k.jQuery&&document.compatMode==="BackCompat"&&alert('artDialog Error: document.compatMode === "BackCompat"')});var m=a.top=function(){var n=k,o=function(p){try{var r=k[p].document;r.getElementsByTagName}catch(q){return false}return k[p].artDialog&&r.getElementsByTagName("frameset").length===0};if(o("top")){n=k.top}else{if(o("parent")){n=k.parent}}return n}();a.parent=m;l=m.artDialog;d=function(){return l.defaults.zIndex};a.data=function(o,p){var q=a.top,n=q[b]||{};q[b]=n;if(p){n[o]=p}else{return n[o]}return n};a.removeData=function(o){var n=a.top[b];if(n&&n[o]){delete n[o]}};a.through=i=function(){var n=l.apply(this,arguments);if(m!==k){a.list[n.config.id]=n}return n};m!==k&&g(k).bind("unload",function(){var p=a.list,n;for(var o in p){if(p[o]){n=p[o].config;if(n){n.duration=0}p[o].close();delete p[o]}}});a.open=function(r,p,y){p=p||{};var x,D,q,v,u,w,C,E,s,z=a.top,o="position:absolute;left:-9999em;top:-9999em;border:none 0;background:transparent",A="width:100%;height:100%;border:none 0";if(y===false){var n=(new Date()).getTime(),G=r.replace(/([?&])_=[^&]*/,"$1_="+n);r=G+((G===r)?(/\?/.test(r)?"&":"?")+"_="+n:"")}var t=function(){var I,K,L=D.content.find(".aui_loading"),H=x.config;q.addClass("aui_state_full");L&&L.hide();try{E=u.contentWindow;C=g(E.document);s=E.document.body}catch(J){u.style.cssText=A;H.follow?x.follow(H.follow):x.position(H.left,H.top);p.init&&p.init.call(x,E,z);p.init=null;return}I=H.width==="auto"?C.width()+(j?0:parseInt(g(s).css("marginLeft"))):H.width;K=H.height==="auto"?C.height():H.height;setTimeout(function(){u.style.cssText=A},0);x.size(I,K);H.follow?x.follow(H.follow):x.position(H.left,H.top);p.init&&p.init.call(x,E,z);p.init=null};var F={zIndex:d(),init:function(){x=this;D=x.DOM;v=D.main;q=D.content;u=x.iframe=z.document.createElement("iframe");u.src=r;u.name="Open"+x.config.id;u.style.cssText=o;u.setAttribute("frameborder",0,0);u.setAttribute("allowTransparency",true);w=g(u);x.content().appendChild(u);E=u.contentWindow;try{E.name=u.name;a.data(u.name+c,x);a.data(u.name+e,k)}catch(H){}w.bind("load",t)},close:function(){w.css("display","none").unbind("load",t);if(p.close&&p.close.call(this,u.contentWindow,z)===false){return false}q.removeClass("aui_state_full");w[0].src="about:blank";w.remove();try{a.removeData(u.name+c);a.removeData(u.name+e)}catch(H){}}};if(typeof p.ok==="function"){F.ok=function(){return p.ok.call(x,u.contentWindow,z)}}if(typeof p.cancel==="function"){F.cancel=function(){return p.cancel.call(x,u.contentWindow,z)}}delete p.content;for(var B in p){if(F[B]===f){F[B]=p[B]}}return i(F)};a.open.api=a.data(h+c);a.opener=a.data(h+e)||k;a.open.origin=a.opener;a.close=function(){var n=a.data(h+c);n&&n.close();return false};a.max=function(){var n=a.data(h+c);n&&n._maxWin();return false};a.min=function(){var n=a.data(h+c);n&&n._minWin();return false};m!=k&&g(document).bind("mousedown",function(){var n=a.open.api;n&&n.focus(true)});a.load=function(q,p,n){n=n||false;var s=p||{};var o={zIndex:d(),init:function(u){var v=this,t=v.config;g.ajax({url:q,success:function(w){v.content(w);s.init&&s.init.call(v,u)},cache:n})}};delete p.content;for(var r in s){if(o[r]===f){o[r]=s[r]}}return i(o)};a.alert=function(n){return i({id:"Alert",zIndex:d(),icon:"warning",fixed:true,lock:true,max:false,min:false,content:n,ok:true})};a.success=function(n){return i({id:"success",zIndex:d(),icon:"succeed",fixed:true,lock:true,max:false,min:false,content:n,ok:true,init:function(){var q=this,o=3;var p=function(){q.title(o+"\u7ec9\u6391\u6097\u934f\u62bd\u68f4");!o&&q.close();o--};timer=setInterval(p,1000);p()},close:function(){clearInterval(timer)}})};a.error=function(n){return i({id:"error",zIndex:d(),icon:"error",fixed:true,lock:true,max:false,min:false,content:n,ok:true,init:function(){var q=this,o=3;var p=function(){q.title(o+"\u7ec9\u6391\u6097\u934f\u62bd\u68f4");!o&&q.close();o--};timer=setInterval(p,1000);p()},close:function(){clearInterval(timer)}})};a.confirm=function(n,p,o){return i({id:"Confirm",zIndex:d(),icon:"question",fixed:true,lock:true,max:false,min:false,opacity:0.1,content:n,ok:function(q){return p.call(this,q)},cancel:function(q){return o&&o.call(this,q)}})};a.confirmSuccess=function(n,p,o){return i({id:"ConfirmSuccess",zIndex:d(),icon:"warning",fixed:false,lock:false,max:false,min:false,opacity:0.1,content:n,ok:function(q){return p.call(this,q)}})};a.prompt=function(o,q,p){p=p||"";var n;return i({id:"Prompt",zIndex:d(),icon:"question",fixed:true,lock:true,max:false,min:false,opacity:0.1,content:['<div style="margin-bottom:5px;font-size:12px">',o,"</div>","<div>",'<input value="',p,'" style="width:18em;padding:6px 4px" />',"</div>"].join(""),init:function(){n=this.DOM.content.find("input")[0];n.select();n.focus()},ok:function(r){return q&&q.call(this,n.value,r)},cancel:true})};a.tips=function(n,o){return i({id:"Tips",zIndex:d(),title:false,cancel:false,fixed:true,lock:false}).content('<div style="padding: 0 1em;">'+n+"</div>").time(o||1.5)};g(function(){var p=a.dragEvent;if(!p){return}var s=g(k),r=g(document),t=j?"absolute":"fixed",q=p.prototype,n=document.createElement("div"),o=n.style;o.cssText="display:none;position:"+t+";left:0;top:0;width:100%;height:100%;cursor:move;filter:alpha(opacity=0);opacity:0;background:#FFF";document.body.appendChild(n);q._start=q.start;q._end=q.end;q.start=function(){var w=a.focus.DOM,u=w.main[0],v=w.content[0].getElementsByTagName("iframe")[0];q._start.apply(this,arguments);o.display="block";o.zIndex=a.defaults.zIndex+3;if(t==="absolute"){o.width=s.width()+"px";o.height=s.height()+"px";o.left=r.scrollLeft()+"px";o.top=r.scrollTop()+"px"}};q.end=function(){var u=a.focus;q._end.apply(this,arguments);o.display="none";if(u){u.DOM.main[0].style.visibility="visible"}}})})(window.jQuery||window.art,this,this.artDialog);
    diff --git a/src/main/webapp/plug-in/sliding/js/jquery-1.7.1.min.js b/src/main/webapp/plug-in/sliding/js/jquery-1.7.1.min.js
    new file mode 100644
    index 00000000..198b3ff0
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/jquery-1.7.1.min.js
    @@ -0,0 +1,4 @@
    +/*! jQuery v1.7.1 jquery.com | jquery.org/license */
    +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("聽")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
    +f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
    +{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/js/jquery-class.js b/src/main/webapp/plug-in/sliding/js/jquery-class.js
    new file mode 100644
    index 00000000..c849ef1e
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/jquery-class.js
    @@ -0,0 +1,61 @@
    +(function ($){
    +
    + _Class=function(){
    +	var initializing=0,fnTest=/\b_super\b/,
    +		Class=function(){};
    +	Class.prototype={
    +		ops:function(o1,o2){
    +			o2=o2||{};
    +			for(var key in o1){
    +				this['_'+key]=key in o2?o2[key]:o1[key];
    +			}
    +		}
    +	};
    +	Class.extend=function(prop){
    +		var _super = this.prototype;
    +		initializing=1;//锁定初始化,阻止超类执行初始化
    +		var _prototype=new this();//只是通过此来继承,而非创建类
    +		initializing=0;//解锁初始化
    +		function fn(name, fn) {
    +			return function() {
    +				this._super = _super[name];//保存超类方法,此this后面通过apply改变成本体类引用
    +				var ret = fn.apply(this, arguments);//创建方法,并且改变this指向
    +				return ret;//返回刚才创建的方法
    +			};
    +		}
    +		var _mtd;//临时变量,存方法
    +		for (var name in prop){//遍历传进来的所有方法
    +			_mtd=prop[name];
    +			_prototype[name] =(typeof _mtd=='function'&&
    +			typeof _super[name]=='function'&&
    +			fnTest.test(_mtd))?fn(name,_mtd):_mtd;//假如传进来的是函数,进行是否调用超类的检测来决定是否保存超类
    +		}
    +		function F(arg1) {//构造函数,假如没有被初始化,并且有初始化函数,执行初始化
    +			if(this.constructor!=Object){
    +				return new F({
    +					FID:'JClassArguments',
    +					val:arguments
    +				});
    +			}
    +			if (!initializing&&this.init){
    +				if(arg1&&arg1.FID&&arg1.FID=='JClassArguments'){
    +					this.init.apply(this, arg1.val);
    +				}else{
    +					this.init.apply(this, arguments);
    +				}
    +				this.init=null;
    +			
    +			};
    +		}
    +		F.prototype=_prototype;//创建。。。
    +		F.constructor=F;//修正用
    +		F.extend=arguments.callee;
    +		return F;
    +	};
    +	return Class;
    + }();
    +	$.Class=function(ops){
    +		return _Class.extend(typeof ops=='function'?ops():ops);
    +	};
    +
    +})(jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/js/jquery-powerFloat-min.js b/src/main/webapp/plug-in/sliding/js/jquery-powerFloat-min.js
    new file mode 100644
    index 00000000..e9aae7d4
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/jquery-powerFloat-min.js
    @@ -0,0 +1 @@
    +eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('(M(a){a.3m.1O=M(d){P a(9).1w(M(){N e=a.2L({},c,d||{});N f=M(g,h){J(b.K&&b.K.17("1e")!=="1V"){b.1G()};b.s=g;b.U=h},1q;1z(e.1U){Q"1E":a(9).1E(M(){J(b.1k){b.1c=V};N g=1j(e.2q,10);f(e,a(9));J(g){J(1q){1A(1q)};1q=1B(M(){b.1g.1b(b)},g)}L{b.1g()}},M(){J(1q){1A(1q)};J(b.1k){1A(b.1k)};b.1c=O;b.1M()});J(e.16){a(9).30(M(g){b.1f.T=g.31;b.1f.S=g.2C;b.1g.1b(b);P O})};X;Q"1J":a(9).1J(M(g){J(b.1e&&b.U&&g.K===b.U.21(0)){b.1c=O;b.1m()}L{f(e,a(9));b.1g();J(!a(1s).19("1K")){a(1s).2D("2t",M(h){N i=O;J(b.U){N j=b.K.1C("1v");J(!j){j="2J"+2N.2M();b.K.1C("1v",j)};a(h.K).2F().1w(M(){J(a(9).1C("1v")===j){i=V}});J(e.1U==="1J"&&b.1e&&h.K!=b.U.21(0)&&!i){b.1c=O;b.1m()}};P O}).19("1K",V)}}});X;Q"2k":a(9).2k(M(){N g=a(9);1B(M(){f(e,g);b.1g()},2o)}).2H(M(){b.1c=O;1B(M(){b.1m()},2E)});X;2h:f(e,a(9));b.1g();a(1s).2u("2t").19("1K",O)}})};N b={1g:M(){J(!9.U){P 9};N d=9.U.1C(9.s.2y),e=1d 9.s.K=="M"?9.s.K.1b(9.U):9.s.K;1z(9.s.1Q){Q"1R":J(e){N m=1d(e);J(m==="1Z"){J(e.18()){b.K=e.1u(0)}}L{J(m==="1n"){J(a(e).18()){b.K=a(e).1u(0)}}}}L{J(d&&a("#"+d).18()){b.K=a("#"+d)}};J(b.K){b.15()}L{P 9};X;Q"1X":N f=e||d;9.13=O;J(!f){P};J(!b.1f[f]){b.2s()};N g=2A 37();g.33=M(){N m=g.R,n=g.11;N o=a(1i).R(),p=a(1i).11();N q=m/n,r=o/p;J(q>r){J(m>o/2){m=o/2;n=m/q}}L{J(n>p/2){n=p/2;m=n*q}};N t=\'<35 Z="3f" 25="\'+f+\'" R="\'+m+\'" 11 = "\'+n+\'" />\';b.1f[f]=V;b.K=a(t);b.15()};g.32=M(){J(/(\\.2T|\\.2Z|\\.2W|\\.2Y|\\.2X)$/i.2d(f)){b.K=a(\'<W Z="26">2V銆</W>\');b.15()}L{a.1X({2R:f,2Q:M(m){J(1d(m)==="1n"){b.1f[f]=V;b.K=a(\'<W Z="2P">\'+m+"</W>");b.15()}},2U:M(){b.K=a(\'<W Z="26">2S銆</W>\');b.15()}})}};g.25=f;X;Q"3c":N h=\'<2i Z="3b">\',i;J(a.29(e)&&(i=e.3a)){a.1w(e,M(m,n){N o="",p="",q,r;J(m===0){p=\' Z="3e"\'};J(m===i-1){p=\' Z="3d"\'};J(1d(n)==="1Z"&&(q=n.39.34())){J(r=(n.2g||"38:")){o=\'<a 2g="\'+r+\'" Z="36">\'+q+"</a>"}L{o=q}}L{J(1d(n)==="1n"&&n){o=n}};J(o){h+="<1D"+p+">"+o+"</1D>"}})}L{h+=\'<1D Z="2O">2B銆</1D>\'};h+="</2i>";b.K=a(h);9.13=O;b.15();X;Q"28":N j=e||d;9.13=O;J(1d(j)==="1n"){b.K=a("<1o>"+j+"</1o>");b.15()};X;2h:N k=e||d,l=1d(k);J(k){J(l==="1n"){J(/^.[^:#\\[\\.,]*$/.2d(k)){J(a(k).18()){b.K=a(k).1u(0);9.13=V}L{J(a("#"+k).18()){b.K=a("#"+k).1u(0);9.13=V}L{b.K=a("<W>"+k+"</W>");9.13=O}}}L{b.K=a("<W>"+k+"</W>");9.13=O};b.15()}L{J(l==="1Z"){J(!a.29(k)&&k.18()){b.K=k.1u(0);9.13=V;b.15()}}}}};P 9},1I:M(){N d=9.s.1I,e=9.s.1Q||"2K";J(e==="1X"||e==="28"){9.s.1h=V}L{9.s.1h=O};J(9.s.24){9.s.1h=!9.s.1h};J(e!=="1R"){J(d===1a){d="2b"};J(d==="2b"){J(!a("#20"+e).18()){a(\'<W 1v="20\'+e+\'" Z="2G\'+e+\'2I"></W>\').2v(a("22")).1F()};d=a("#20"+e)};J(d&&1d(d)!=="1n"&&d.18()){J(9.13){b.K.2p().17("1p","3z")};b.K=d.3x().2z(b.K)}};P 9},2w:M(){N d=9.s.R;J(d==="1W"){J(9.K.21(0).1r.R){9.K.17("R","1W")}}L{J(d==="3y"){9.K.R(9.U.R())}L{9.K.17("R",d)}};P 9},1p:M(){J(!9.U||!9.K){P 9};N d,e=0,f=0,g=0,h=0,i,j,k,l,m,n,o=9.K.19("11"),p=9.K.19("R"),q=a(1i).3t(),r=0,t=0,u=9.1f;J(a.1x(9.s.1l.x)){r=1j(9.s.1l.x.1b(),10)||0}L{r=1j(9.s.1l.x,10)||0};J(a.1x(9.s.1l.y)){t=1j(9.s.1l.y.1b(),10)||0}L{t=1j(9.s.1l.y,10)||0};J(!o){o=9.K.2c();J(9.s.16){9.K.19("11",o)}};J(!p){p=9.K.27();J(9.s.16){9.K.19("R",p)}};d=9.U.3w();e=9.U.2c();f=9.U.27();i=d.T;j=d.S;N v=M(){J(i<0){i=0}L{J(i+e>a(1i).R()){i=a(1i).R()-f}}},1S=M(){J(j<0){j=0}L{J(j+e>a(1s).11()){j=a(1s).11()-e}}};J(9.s.16&&u.T&&u.S){J(9.s.16==="x"){i=u.T;v()}L{J(9.s.16==="y"){j=u.S;1S()}L{i=u.T;j=u.S;v();1S()}}};N w=["4-1","1-4","5-7","2-3","2-1","6-8","3-4","4-3","8-6","1-2","7-5","3-2"],x=9.s.1p,y=O,z;a.1w(w,M(F,G){J(G===x){y=V;P}});J(!y){x="4-1"};N A=M(F){N G="12";1z(F){Q"1-4":Q"5-7":Q"2-3":G="S";X;Q"2-1":Q"6-8":Q"3-4":G="14";X;Q"1-2":Q"8-6":Q"4-3":G="T";X;Q"4-1":Q"7-5":Q"3-2":G="12";X};P G};N B=M(F){J(F==="5-7"||F==="6-8"||F==="8-6"||F==="7-5"){P V};P O};N C=M(F){N G=0,H=0,I=(b.s.1h&&b.Y)?V:O;J(F==="14"){H=i+f+p+r;J(I){H+=b.Y.R()};J(H>a(1i).R()){P O}}L{J(F==="12"){G=j+e+o+t;J(I){G+=b.Y.11()};J(G>q+a(1i).11()){P O}}L{J(F==="S"){G=o+t;J(I){G+=b.Y.11()};J(G>j-q){P O}}L{J(F==="T"){H=p+r;J(I){H+=b.Y.R()};J(H>i){P O}}}}};P V};z=A(x);J(9.s.1h){9.1T(z)};J(9.s.23){J(C(z)){(M(){J(B(x)){P};N F={S:{14:"2-3",T:"1-4"},14:{S:"2-1",12:"3-4"},12:{14:"3-2",T:"4-1"},T:{S:"1-2",12:"4-3"}};N G=F[z],H;J(G){2j(H 2e G){J(!C(H)){x=G[H]}}}})()}L{(M(){J(B(x)){N F={"5-7":"7-5","7-5":"5-7","6-8":"8-6","8-6":"6-8"};x=F[x]}L{N F={S:{T:"3-2",14:"4-1"},14:{12:"1-2",S:"4-3"},12:{T:"2-3",14:"1-4"},T:{12:"2-1",S:"3-4"}};N G=F[z],H=[];2j(2f 2e G){H.3j(2f)};J(C(H[0])||!C(H[1])){x=G[H[0]]}L{x=G[H[1]]}}})()}};N D=A(x),E=x.3l("-")[0];J(9.s.1h){9.1T(D);g=9.Y.R(),h=9.Y.11()};J(9.s.16){J(9.s.16==="x"){k=i+r;J(E==="1"||E==="8"||E==="4"){k=i-(p-f)/2+r}L{k=i-(p-f)+r};J(E==="1"||E==="5"||E==="2"){l=j-t-o-h;n=j-h-t-1}L{l=j+e+t+h;n=j+e+t+1};m=d.T-(g-f)/2}L{J(9.s.16==="y"){J(E==="1"||E==="5"||E==="2"){l=j-(o-e)/2+t}L{l=j-(o-e)+t};J(E==="1"||E==="8"||E==="4"){k=i-p-r-g;m=i-g-r-1}L{k=i+f-r+g;m=i+f+r+1};n=d.S-(h-e)/2}L{k=i+r;l=j+t}}}L{1z(D){Q"S":l=j-t-o-h;J(E=="1"){k=i-r}L{J(E==="5"){k=i-(p-f)/2-r}L{k=i-(p-f)-r}};n=j-h-t-1;m=i-(g-f)/2;X;Q"14":k=i+f+r+g;J(E=="2"){l=j+t}L{J(E==="6"){l=j-(o-e)/2+t}L{l=j-(o-e)+t}};m=i+f+r+1;n=j-(h-e)/2;X;Q"12":l=j+e+t+h;J(E=="4"){k=i+r}L{J(E==="7"){k=i-(p-f)/2+r}L{k=i-(p-f)+r}};n=j+e+t+1;m=i-(g-f)/2;X;Q"T":k=i-p-r-g;J(E=="2"){l=j-t}L{J(E==="6"){l=j-(p-f)/2-t}L{l=j-(o-e)-t}};m=k+g;n=j-(p-g)/2;X}};J(h&&g&&9.Y){9.Y.17({T:m,S:n,1t:9.s.1t+1})};9.K.17({1p:"3o",T:k,S:l,1t:9.s.1t});P 9},1T:M(d){N e,f,g="",h="";N i={T:"14",14:"T",12:"S",S:"12"},j=i[d]||"S";J(9.K){e=9.K.17("3k-1y");J(1j(9.K.17("2x-"+j+"-R"))>0){f=9.K.17("2x-"+j+"-1y")};J(f&&f!=="2l"){g=\'1r="1y:\'+f+\';"\'}L{g=\'1r="1e:1V;"\'};J(e&&e!=="2l"){h=\'1r="1y:\'+e+\';"\'}L{h=\'1r="1e:1V;"\'}};N k=\'<W 1v="1P\'+d+\'" Z="3n 3r\'+d+\'">\'+\'<1o Z="Y 3q" \'+g+">鈼</1o>"+\'<1o Z="Y 3p" \'+h+">鈼</1o>"+"</W>";J(!a("#1P"+d).18()){a("22").2z(a(k))};9.Y=a("#1P"+d);P 9},1M:M(){J(9.s.2m){N d=1j(9.s.2r,10)||2o;J(9.K){9.K.1E(M(){b.1c=V},M(){J(b.1k){1A(b.1k)};b.1c=O;b.1M()})};b.1k=1B(M(){b.1m.1b(b)},d)}L{9.1m()};P 9},2s:M(){9.K=a(\'<W Z="3i"></W>\');9.15();9.K.1H("R").1H("11");P 9},1m:M(){J(!9.1c&&9.1e){9.1G();9.1k=1a};P 9},15:M(){b.1Y();9.1e=V;9.1I().2w().1p();9.K.2p();J(a.1x(9.s.1N)){9.s.1N.1b(9.U,9.K)};P 9},1G:M(){9.1e=O;9.2n();9.1Y();J(a.1x(9.s.1L)){9.s.1L.1b(9.U)};9.K=1a;9.U=1a;9.s={};9.13=O;P 9},2n:M(){J(9.K){J(9.K.19("R")){9.K.1H("R").1H("11")};J(9.13){9.K.3h().1F().2v(a("22"))};9.K.2u().1F()}},1Y:M(){J(9.Y){9.Y.3g()}},K:1a,U:1a,s:{},1f:{},13:O};a.1O={};a.1O.1F=M(){b.1G()};N c={R:"1W",1l:{x:0,y:0},1t:3s,1U:"1E",2q:0,2r:0,2m:V,16:O,1Q:"1R",K:1a,2y:"3u",1I:1a,24:O,1p:"4-1",23:V,1N:a.2a,1L:a.2a}})(3v);',62,222,'|||||||||this||||||||||||||||||||||||||||||||||||if|target|else|function|var|false|return|case|width|top|left|trigger|true|div|break|corner|class||height|bottom|targetProtect|right|targetShow|hoverFollow|css|size|data|null|call|flagDisplay|typeof|display|cacheData|targetGet|sharpAngle|window|parseInt|timerHold|offsets|displayDetect|string|span|position|hoverTimer|style|document|zIndex|eq|id|each|isFunction|color|switch|clearTimeout|setTimeout|attr|li|hover|hide|targetHide|removeData|container|click|mouseupBind|hideCall|targetHold|showCall|powerFloat|floatCorner_|targetMode|common|funMouseT|createSharp|eventType|none|auto|ajax|cornerClear|object|floatBox_|get|body|edgeAdjust|reverseSharp|src|float_ajax_error|outerWidth|remind|isArray|noop|plugin|outerHeight|test|in|name|href|default|ul|for|focus|transparent|hoverHold|targetClear|200|show|showDelay|hideDelay|loading|mouseup|unbind|appendTo|setWidth|border|targetAttr|append|new|鍒楄〃鏃犳暟鎹畖pageY|bind|190|parents|float_|blur|_box|R_|mode|extend|random|Math|float_list_null|float_ajax_data|success|url|鏁版嵁娌℃湁鍔犺浇鎴愬姛|jpg|error|鍥剧墖鍔犺浇澶辫触|gif|jpeg|bmp|png|mousemove|pageX|onerror|onload|toString|img|float_list_a|Image|javascript|text|length|float_list_ul|list|float_list_li_last|float_list_li_first|float_ajax_image|remove|children|float_loading|push|background|split|fn|float_corner|absolute|corner_2|corner_1|float_corner_|999|scrollTop|rel|jQuery|offset|empty|inherit|static'.split('|'),0,{}))
    diff --git a/src/main/webapp/plug-in/sliding/js/jquery-smartMenu-min.js b/src/main/webapp/plug-in/sliding/js/jquery-smartMenu-min.js
    new file mode 100644
    index 00000000..7eb843e6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/jquery-smartMenu-min.js
    @@ -0,0 +1 @@
    +(function(a){var b=a(document).data("func",{});a.smartMenu=a.noop;a.fn.smartMenu=function(f,c){var i=a("body"),g={name:"",offsetX:2,offsetY:2,textLimit:6,beforeShow:a.noop,afterShow:a.noop};var h=a.extend(g,c||{});var e=function(k){var m=k||f,j=k?Math.random().toString():h.name,o="",n="",l="smart_menu_";if(a.isArray(m)&&m.length){o='<div id="smartMenu_'+j+'" class="'+l+'box"><div class="'+l+'body"><ul class="'+l+'ul">';a.each(m,function(q,p){if(q){o=o+'<li class="'+l+'li_separate">&nbsp;</li>'}if(a.isArray(p)){a.each(p,function(s,v){var w=v.text,u="",r="",t=Math.random().toString().replace(".","");if(w){if(w.length>h.textLimit){w=w.slice(0,h.textLimit)+"鈥";r=' title="'+v.text+'"'}if(a.isArray(v.data)&&v.data.length){u='<li class="'+l+'li" data-hover="true">'+e(v.data)+'<a href="javascript:" class="'+l+'a"'+r+' data-key="'+t+'"><i class="'+l+'triangle"></i>'+w+"</a></li>"}else{u='<li class="'+l+'li"><a href="javascript:" class="'+l+'a"'+r+' data-key="'+t+'">'+w+"</a></li>"}o+=u;var x=b.data("func");x[t]=v.func;b.data("func",x)}})}});o=o+"</ul></div></div>"}return o},d=function(){var j="#smartMenu_",l="smart_menu_",k=a(j+h.name);if(!k.size()){a("body").append(e());a(j+h.name+" a").bind("click",function(){var m=a(this).attr("data-key"),n=b.data("func")[m];if(a.isFunction(n)){n.call(b.data("trigger"))}a.smartMenu.hide();return false});a(j+h.name+" li").each(function(){var m=a(this).attr("data-hover"),n=l+"li_hover";a(this).hover(function(){var o=a(this).siblings("."+n);o.removeClass(n).children("."+l+"box").hide();o.children("."+l+"a").removeClass(l+"a_hover");if(m){a(this).addClass(n).children("."+l+"box").show();a(this).children("."+l+"a").addClass(l+"a_hover")}})});return a(j+h.name)}return k};a(this).each(function(){this.oncontextmenu=function(l){if(a.isFunction(h.beforeShow)){h.beforeShow.call(this)}l=l||window.event;l.cancelBubble=true;if(l.stopPropagation){l.stopPropagation()}a.smartMenu.hide();var k=b.scrollTop();var j=d();if(j){j.css({display:"block",left:l.clientX+h.offsetX,top:l.clientY+k+h.offsetY});b.data("target",j);b.data("trigger",this);if(a.isFunction(h.afterShow)){h.afterShow.call(this)}return false}}});if(!i.data("bind")){i.bind("click",a.smartMenu.hide).data("bind",true)}};a.extend(a.smartMenu,{hide:function(){var c=b.data("target");if(c&&c.css("display")==="block"){c.hide()}},remove:function(){var c=b.data("target");if(c){c.remove()}}})})(jQuery);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/js/jquery.cookie.js b/src/main/webapp/plug-in/sliding/js/jquery.cookie.js
    new file mode 100644
    index 00000000..6df1faca
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/jquery.cookie.js
    @@ -0,0 +1,96 @@
    +/**
    + * Cookie plugin
    + *
    + * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
    + * Dual licensed under the MIT and GPL licenses:
    + * http://www.opensource.org/licenses/mit-license.php
    + * http://www.gnu.org/licenses/gpl.html
    + *
    + */
    +
    +/**
    + * Create a cookie with the given name and value and other optional parameters.
    + *
    + * @example $.cookie('the_cookie', 'the_value');
    + * @desc Set the value of a cookie.
    + * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
    + * @desc Create a cookie with all available options.
    + * @example $.cookie('the_cookie', 'the_value');
    + * @desc Create a session cookie.
    + * @example $.cookie('the_cookie', null);
    + * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
    + *       used when the cookie was set.
    + *
    + * @param String name The name of the cookie.
    + * @param String value The value of the cookie.
    + * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
    + * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
    + *                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
    + *                             If set to null or omitted, the cookie will be a session cookie and will not be retained
    + *                             when the the browser exits.
    + * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
    + * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
    + * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
    + *                        require a secure protocol (like HTTPS).
    + * @type undefined
    + *
    + * @name $.cookie
    + * @cat Plugins/Cookie
    + * @author Klaus Hartl/klaus.hartl@stilbuero.de
    + */
    +
    +/**
    + * Get the value of a cookie with the given name.
    + *
    + * @example $.cookie('the_cookie');
    + * @desc Get the value of a cookie.
    + *
    + * @param String name The name of the cookie.
    + * @return The value of the cookie.
    + * @type String
    + *
    + * @name $.cookie
    + * @cat Plugins/Cookie
    + * @author Klaus Hartl/klaus.hartl@stilbuero.de
    + */
    +jQuery.cookie = function(name, value, options) {
    +    if (typeof value != 'undefined') { // name and value given, set cookie
    +        options = options || {};
    +        if (value === null) {
    +            value = '';
    +            options.expires = -1;
    +        }
    +        var expires = '';
    +        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
    +            var date;
    +            if (typeof options.expires == 'number') {
    +                date = new Date();
    +                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
    +            } else {
    +                date = options.expires;
    +            }
    +            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
    +        }
    +        // CAUTION: Needed to parenthesize options.path and options.domain
    +        // in the following expressions, otherwise they evaluate to undefined
    +        // in the packed version for some reason...
    +        var path = options.path ? '; path=' + (options.path) : '';
    +        var domain = options.domain ? '; domain=' + (options.domain) : '';
    +        var secure = options.secure ? '; secure' : '';
    +        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    +    } else { // only name given, get cookie
    +        var cookieValue = null;
    +        if (document.cookie && document.cookie != '') {
    +            var cookies = document.cookie.split(';');
    +            for (var i = 0; i < cookies.length; i++) {
    +                var cookie = jQuery.trim(cookies[i]);
    +                // Does this cookie string begin with the name we want?
    +                if (cookie.substring(0, name.length + 1) == (name + '=')) {
    +                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
    +                    break;
    +                }
    +            }
    +        }
    +        return cookieValue;
    +    }
    +};
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/sliding/js/jquery.ui.core-min.js b/src/main/webapp/plug-in/sliding/js/jquery.ui.core-min.js
    new file mode 100644
    index 00000000..b65f3540
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/jquery.ui.core-min.js
    @@ -0,0 +1,10 @@
    +/*
    + * jQuery UI 1.8.16
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI
    + */
    +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.16",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css("overflow")==="hidden"){return false}var e=(f&&f==="left")?"scrollLeft":"scrollTop",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);
    diff --git a/src/main/webapp/plug-in/sliding/js/jquery.ui.draggable-min.js b/src/main/webapp/plug-in/sliding/js/jquery.ui.draggable-min.js
    new file mode 100644
    index 00000000..195a2956
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/jquery.ui.draggable-min.js
    @@ -0,0 +1 @@
    +(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.addClasses&&this.element.addClass("ui-draggable"));(this.options.disabled&&this.element.addClass("ui-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return}this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this},_mouseCapture:function(c){var d=this.options;if(this.helper||d.disabled||a(c.target).is(".ui-resizable-handle")){return false}this.handle=this._getHandle(c);if(!this.handle){return false}if(d.iframeFix){a(d.iframeFix===true?"iframe":d.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(a(this).offset()).appendTo("body")})}return true},_mouseStart:function(c){var d=this.options;this.helper=this._createHelper(c);this._cacheHelperProportions();if(a.ui.ddmanager){a.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:c.pageX-this.offset.left,top:c.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(c);this.originalPageX=c.pageX;this.originalPageY=c.pageY;(d.cursorAt&&this._adjustOffsetFromHelper(d.cursorAt));if(d.containment){this._setContainment()}if(this._trigger("start",c)===false){this._clear();return false}this._cacheHelperProportions();if(a.ui.ddmanager&&!d.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,c)}this.helper.addClass("ui-draggable-dragging");this._mouseDrag(c,true);if(a.ui.ddmanager){a.ui.ddmanager.dragStart(this,c)}return true},_mouseDrag:function(c,e){this.position=this._generatePosition(c);this.positionAbs=this._convertPositionTo("absolute");if(!e){var d=this._uiHash();if(this._trigger("drag",c,d)===false){this._mouseUp({});return false}this.position=d.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(a.ui.ddmanager){a.ui.ddmanager.drag(this,c)}return false},_mouseStop:function(d){var e=false;if(a.ui.ddmanager&&!this.options.dropBehaviour){e=a.ui.ddmanager.drop(this,d)}if(this.dropped){e=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original"){return false}if((this.options.revert=="invalid"&&!e)||(this.options.revert=="valid"&&e)||this.options.revert===true||(a.isFunction(this.options.revert)&&this.options.revert.call(this.element,e))){var c=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){if(c._trigger("stop",d)!==false){c._clear()}})}else{if(this._trigger("stop",d)!==false){this._clear()}}return false},_mouseUp:function(c){if(this.options.iframeFix===true){a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}if(a.ui.ddmanager){a.ui.ddmanager.dragStop(this,c)}return a.ui.mouse.prototype._mouseUp.call(this,c)},cancel:function(){if(this.helper.is(".ui-draggable-dragging")){this._mouseUp({})}else{this._clear()}return this},_getHandle:function(c){var d=!this.options.handle||!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==c.target){d=true}});return d},_createHelper:function(d){var e=this.options;var c=a.isFunction(e.helper)?a(e.helper.apply(this.element[0],[d])):(e.helper=="clone"?this.element.clone().removeAttr("id"):this.element);if(!c.parents("body").length){c.appendTo((e.appendTo=="parent"?this.element[0].parentNode:e.appendTo))}if(c[0]!=this.element[0]&&!(/(fixed|absolute)/).test(c.css("position"))){c.css("position","absolute")}return c},_adjustOffsetFromHelper:function(c){if(typeof c=="string"){c=c.split(" ")}if(a.isArray(c)){c={left:+c[0],top:+c[1]||0}}if("left" in c){this.offset.click.left=c.left+this.margins.left}if("right" in c){this.offset.click.left=this.helperProportions.width-c.right+this.margins.left}if("top" in c){this.offset.click.top=c.top+this.margins.top}if("bottom" in c){this.offset.click.top=this.helperProportions.height-c.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var c=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){c.left+=this.scrollParent.scrollLeft();c.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){c={top:0,left:0}}return{top:c.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:c.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var c=this.element.position();return{top:c.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:c.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0),right:(parseInt(this.element.css("marginRight"),10)||0),bottom:(parseInt(this.element.css("marginBottom"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var g=this.options;if(g.containment=="parent"){g.containment=this.helper[0].parentNode}if(g.containment=="document"||g.containment=="window"){this.containment=[g.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,g.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(g.containment=="document"?0:a(window).scrollLeft())+a(g.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(g.containment=="document"?0:a(window).scrollTop())+(a(g.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(g.containment)&&g.containment.constructor!=Array){var h=a(g.containment);var e=h[0];if(!e){return}var f=h.offset();var d=(a(e).css("overflow")!="hidden");this.containment=[(parseInt(a(e).css("borderLeftWidth"),10)||0)+(parseInt(a(e).css("paddingLeft"),10)||0),(parseInt(a(e).css("borderTopWidth"),10)||0)+(parseInt(a(e).css("paddingTop"),10)||0),(d?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(a(e).css("borderLeftWidth"),10)||0)-(parseInt(a(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(d?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(a(e).css("borderTopWidth"),10)||0)-(parseInt(a(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=h}else{if(g.containment.constructor==Array){this.containment=g.containment}}},_convertPositionTo:function(g,i){if(!i){i=this.position}var e=g=="absolute"?1:-1;var f=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,h=(/(html|body)/i).test(c[0].tagName);return{top:(i.top+this.offset.relative.top*e+this.offset.parent.top*e-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(h?0:c.scrollTop()))*e)),left:(i.left+this.offset.relative.left*e+this.offset.parent.left*e-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():h?0:c.scrollLeft())*e))}},_generatePosition:function(d){var e=this.options,l=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(l[0].tagName);var h=d.pageX;var g=d.pageY;if(this.originalPosition){var c;if(this.containment){if(this.relative_container){var k=this.relative_container.offset();c=[this.containment[0]+k.left,this.containment[1]+k.top,this.containment[2]+k.left,this.containment[3]+k.top]}else{c=this.containment}if(d.pageX-this.offset.click.left<c[0]){h=c[0]+this.offset.click.left}if(d.pageY-this.offset.click.top<c[1]){g=c[1]+this.offset.click.top}if(d.pageX-this.offset.click.left>c[2]){h=c[2]+this.offset.click.left}if(d.pageY-this.offset.click.top>c[3]){g=c[3]+this.offset.click.top}}if(e.grid){var j=e.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/e.grid[1])*e.grid[1]:this.originalPageY;g=c?(!(j-this.offset.click.top<c[1]||j-this.offset.click.top>c[3])?j:(!(j-this.offset.click.top<c[1])?j-e.grid[1]:j+e.grid[1])):j;var f=e.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/e.grid[0])*e.grid[0]:this.originalPageX;h=c?(!(f-this.offset.click.left<c[0]||f-this.offset.click.left>c[2])?f:(!(f-this.offset.click.left<c[0])?f-e.grid[0]:f+e.grid[0])):f}}return{top:(g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:l.scrollTop())))),left:(h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:l.scrollLeft())))}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");if(this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval){this.helper.remove()}this.helper=null;this.cancelHelperRemoval=false},_trigger:function(c,d,e){e=e||this._uiHash();a.ui.plugin.call(this,c,[d,e]);if(c=="drag"){this.positionAbs=this._convertPositionTo("absolute")}return a.Widget.prototype._trigger.call(this,c,d,e)},plugins:{},_uiHash:function(c){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});a.extend(a.ui.draggable,{version:"1.8.16"});a.ui.plugin.add("draggable","connectToSortable",{start:function(d,f){var e=a(this).data("draggable"),g=e.options,c=a.extend({},f,{item:e.element});e.sortables=[];a(g.connectToSortable).each(function(){var h=a.data(this,"sortable");if(h&&!h.options.disabled){e.sortables.push({instance:h,shouldRevert:h.options.revert});h.refreshPositions();h._trigger("activate",d,c)}})},stop:function(d,f){var e=a(this).data("draggable"),c=a.extend({},f,{item:e.element});a.each(e.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;e.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert){this.instance.options.revert=true}this.instance._mouseStop(d);this.instance.options.helper=this.instance.options._helper;if(e.options.helper=="original"){this.instance.currentItem.css({top:"auto",left:"auto"})}}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",d,c)}})},drag:function(d,g){var f=a(this).data("draggable"),c=this;var e=function(j){var p=this.offset.click.top,n=this.offset.click.left;var h=this.positionAbs.top,l=this.positionAbs.left;var k=j.height,m=j.width;var q=j.top,i=j.left;return a.ui.isOver(h+p,l+n,q,i,k,m)};a.each(f.sortables,function(h){this.instance.positionAbs=f.positionAbs;this.instance.helperProportions=f.helperProportions;this.instance.offset.click=f.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=a(c).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return g.helper[0]};d.target=this.instance.currentItem[0];this.instance._mouseCapture(d,true);this.instance._mouseStart(d,true,true);this.instance.offset.click.top=f.offset.click.top;this.instance.offset.click.left=f.offset.click.left;this.instance.offset.parent.left-=f.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=f.offset.parent.top-this.instance.offset.parent.top;f._trigger("toSortable",d);f.dropped=this.instance.element;f.currentItem=f.element;this.instance.fromOutside=f}if(this.instance.currentItem){this.instance._mouseDrag(d)}}else{if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",d,this.instance._uiHash(this.instance));this.instance._mouseStop(d,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();if(this.instance.placeholder){this.instance.placeholder.remove()}f._trigger("fromSortable",d);f.dropped=false}}})}});a.ui.plugin.add("draggable","cursor",{start:function(d,e){var c=a("body"),f=a(this).data("draggable").options;if(c.css("cursor")){f._cursor=c.css("cursor")}c.css("cursor",f.cursor)},stop:function(c,d){var e=a(this).data("draggable").options;if(e._cursor){a("body").css("cursor",e._cursor)}}});a.ui.plugin.add("draggable","opacity",{start:function(d,e){var c=a(e.helper),f=a(this).data("draggable").options;if(c.css("opacity")){f._opacity=c.css("opacity")}c.css("opacity",f.opacity)},stop:function(c,d){var e=a(this).data("draggable").options;if(e._opacity){a(d.helper).css("opacity",e._opacity)}}});a.ui.plugin.add("draggable","scroll",{start:function(d,e){var c=a(this).data("draggable");if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){c.overflowOffset=c.scrollParent.offset()}},drag:function(e,f){var d=a(this).data("draggable"),g=d.options,c=false;if(d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"){if(!g.axis||g.axis!="x"){if((d.overflowOffset.top+d.scrollParent[0].offsetHeight)-e.pageY<g.scrollSensitivity){d.scrollParent[0].scrollTop=c=d.scrollParent[0].scrollTop+g.scrollSpeed}else{if(e.pageY-d.overflowOffset.top<g.scrollSensitivity){d.scrollParent[0].scrollTop=c=d.scrollParent[0].scrollTop-g.scrollSpeed}}}if(!g.axis||g.axis!="y"){if((d.overflowOffset.left+d.scrollParent[0].offsetWidth)-e.pageX<g.scrollSensitivity){d.scrollParent[0].scrollLeft=c=d.scrollParent[0].scrollLeft+g.scrollSpeed}else{if(e.pageX-d.overflowOffset.left<g.scrollSensitivity){d.scrollParent[0].scrollLeft=c=d.scrollParent[0].scrollLeft-g.scrollSpeed}}}}else{if(!g.axis||g.axis!="x"){if(e.pageY-a(document).scrollTop()<g.scrollSensitivity){c=a(document).scrollTop(a(document).scrollTop()-g.scrollSpeed)}else{if(a(window).height()-(e.pageY-a(document).scrollTop())<g.scrollSensitivity){c=a(document).scrollTop(a(document).scrollTop()+g.scrollSpeed)}}}if(!g.axis||g.axis!="y"){if(e.pageX-a(document).scrollLeft()<g.scrollSensitivity){c=a(document).scrollLeft(a(document).scrollLeft()-g.scrollSpeed)}else{if(a(window).width()-(e.pageX-a(document).scrollLeft())<g.scrollSensitivity){c=a(document).scrollLeft(a(document).scrollLeft()+g.scrollSpeed)}}}}if(c!==false&&a.ui.ddmanager&&!g.dropBehaviour){a.ui.ddmanager.prepareOffsets(d,e)}}});a.ui.plugin.add("draggable","snap",{start:function(d,e){var c=a(this).data("draggable"),f=c.options;c.snapElements=[];a(f.snap.constructor!=String?(f.snap.items||":data(draggable)"):f.snap).each(function(){var h=a(this);var g=h.offset();if(this!=c.element[0]){c.snapElements.push({item:this,width:h.outerWidth(),height:h.outerHeight(),top:g.top,left:g.left})}})},drag:function(u,p){var g=a(this).data("draggable"),q=g.options;var y=q.snapTolerance;var x=p.offset.left,w=x+g.helperProportions.width,f=p.offset.top,e=f+g.helperProportions.height;for(var v=g.snapElements.length-1;v>=0;v--){var s=g.snapElements[v].left,n=s+g.snapElements[v].width,m=g.snapElements[v].top,A=m+g.snapElements[v].height;if(!((s-y<x&&x<n+y&&m-y<f&&f<A+y)||(s-y<x&&x<n+y&&m-y<e&&e<A+y)||(s-y<w&&w<n+y&&m-y<f&&f<A+y)||(s-y<w&&w<n+y&&m-y<e&&e<A+y))){if(g.snapElements[v].snapping){(g.options.snap.release&&g.options.snap.release.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=false;continue}if(q.snapMode!="inner"){var c=Math.abs(m-e)<=y;var z=Math.abs(A-f)<=y;var j=Math.abs(s-w)<=y;var k=Math.abs(n-x)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m-g.helperProportions.height,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s-g.helperProportions.width}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n}).left-g.margins.left}}var h=(c||z||j||k);if(q.snapMode!="outer"){var c=Math.abs(m-f)<=y;var z=Math.abs(A-e)<=y;var j=Math.abs(s-x)<=y;var k=Math.abs(n-w)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A-g.helperProportions.height,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n-g.helperProportions.width}).left-g.margins.left}}if(!g.snapElements[v].snapping&&(c||z||j||k||h)){(g.options.snap.snap&&g.options.snap.snap.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=(c||z||j||k||h)}}});a.ui.plugin.add("draggable","stack",{start:function(d,e){var g=a(this).data("draggable").options;var f=a.makeArray(a(g.stack)).sort(function(i,h){return(parseInt(a(i).css("zIndex"),10)||0)-(parseInt(a(h).css("zIndex"),10)||0)});if(!f.length){return}var c=parseInt(f[0].style.zIndex)||0;a(f).each(function(h){this.style.zIndex=c+h});this[0].style.zIndex=c+f.length}});a.ui.plugin.add("draggable","zIndex",{start:function(d,e){var c=a(e.helper),f=a(this).data("draggable").options;if(c.css("zIndex")){f._zIndex=c.css("zIndex")}c.css("zIndex",f.zIndex)},stop:function(c,d){var e=a(this).data("draggable").options;if(e._zIndex){a(d.helper).css("zIndex",e._zIndex)}}})})(jQuery);
    diff --git a/src/main/webapp/plug-in/sliding/js/jquery.ui.droppable-min.js b/src/main/webapp/plug-in/sliding/js/jquery.ui.droppable-min.js
    new file mode 100644
    index 00000000..d4384ac2
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/jquery.ui.droppable-min.js
    @@ -0,0 +1 @@
    +(function(a,b){a.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var d=this.options,c=d.accept;this.isover=0;this.isout=1;this.accept=a.isFunction(c)?c:function(e){return e.is(c)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};a.ui.ddmanager.droppables[d.scope]=a.ui.ddmanager.droppables[d.scope]||[];a.ui.ddmanager.droppables[d.scope].push(this);(d.addClasses&&this.element.addClass("ui-droppable"))},destroy:function(){var c=a.ui.ddmanager.droppables[this.options.scope];for(var d=0;d<c.length;d++){if(c[d]==this){c.splice(d,1)}}this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(c,d){if(c=="accept"){this.accept=a.isFunction(d)?d:function(e){return e.is(d)}}a.Widget.prototype._setOption.apply(this,arguments)},_activate:function(d){var c=a.ui.ddmanager.current;if(this.options.activeClass){this.element.addClass(this.options.activeClass)}(c&&this._trigger("activate",d,this.ui(c)))},_deactivate:function(d){var c=a.ui.ddmanager.current;if(this.options.activeClass){this.element.removeClass(this.options.activeClass)}(c&&this._trigger("deactivate",d,this.ui(c)))},_over:function(d){var c=a.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0]){return}if(this.accept.call(this.element[0],(c.currentItem||c.element))){if(this.options.hoverClass){this.element.addClass(this.options.hoverClass)}this._trigger("over",d,this.ui(c))}},_out:function(d){var c=a.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0]){return}if(this.accept.call(this.element[0],(c.currentItem||c.element))){if(this.options.hoverClass){this.element.removeClass(this.options.hoverClass)}this._trigger("out",d,this.ui(c))}},_drop:function(d,e){var c=e||a.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0]){return false}var f=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=a.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],(c.currentItem||c.element))&&a.ui.intersect(c,a.extend(g,{offset:g.element.offset()}),g.options.tolerance)){f=true;return false}});if(f){return false}if(this.accept.call(this.element[0],(c.currentItem||c.element))){if(this.options.activeClass){this.element.removeClass(this.options.activeClass)}if(this.options.hoverClass){this.element.removeClass(this.options.hoverClass)}this._trigger("drop",d,this.ui(c));return this.element}return false},ui:function(d){return{draggable:(d.currentItem||d.element),helper:d.helper,position:d.position,offset:d.positionAbs}}});a.extend(a.ui.droppable,{version:"1.8.16"});a.ui.intersect=function(q,j,o){if(!j.offset){return false}var e=(q.positionAbs||q.position.absolute).left,d=e+q.helperProportions.width,n=(q.positionAbs||q.position.absolute).top,m=n+q.helperProportions.height;var g=j.offset.left,c=g+j.proportions.width,p=j.offset.top,k=p+j.proportions.height;switch(o){case"fit":return(g<=e&&d<=c&&p<=n&&m<=k);break;case"intersect":return(g<e+(q.helperProportions.width/2)&&d-(q.helperProportions.width/2)<c&&p<n+(q.helperProportions.height/2)&&m-(q.helperProportions.height/2)<k);break;case"pointer":var h=((q.positionAbs||q.position.absolute).left+(q.clickOffset||q.offset.click).left),i=((q.positionAbs||q.position.absolute).top+(q.clickOffset||q.offset.click).top),f=a.ui.isOver(i,h,p,g,j.proportions.height,j.proportions.width);return f;break;case"touch":return((n>=p&&n<=k)||(m>=p&&m<=k)||(n<p&&m>k))&&((e>=g&&e<=c)||(d>=g&&d<=c)||(e<g&&d>c));break;default:return false;break}};a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(f,h){var c=a.ui.ddmanager.droppables[f.options.scope]||[];var g=h?h.type:null;var k=(f.currentItem||f.element).find(":data(droppable)").andSelf();droppablesLoop:for(var e=0;e<c.length;e++){if(c[e].options.disabled||(f&&!c[e].accept.call(c[e].element[0],(f.currentItem||f.element)))){continue}for(var d=0;d<k.length;d++){if(k[d]==c[e].element[0]){c[e].proportions.height=0;continue droppablesLoop}}c[e].visible=c[e].element.css("display")!="none";if(!c[e].visible){continue}if(g=="mousedown"){c[e]._activate.call(c[e],h)}c[e].offset=c[e].element.offset();c[e].proportions={width:c[e].element[0].offsetWidth,height:c[e].element[0].offsetHeight}}},drop:function(c,d){var e=false;a.each(a.ui.ddmanager.droppables[c.options.scope]||[],function(){if(!this.options){return}if(!this.options.disabled&&this.visible&&a.ui.intersect(c,this,this.options.tolerance)){e=e||this._drop.call(this,d)}if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],(c.currentItem||c.element))){this.isout=1;this.isover=0;this._deactivate.call(this,d)}});return e},dragStart:function(c,d){c.element.parents(":not(body,html)").bind("scroll.droppable",function(){if(!c.options.refreshPositions){a.ui.ddmanager.prepareOffsets(c,d)}})},drag:function(c,d){if(c.options.refreshPositions){a.ui.ddmanager.prepareOffsets(c,d)}a.each(a.ui.ddmanager.droppables[c.options.scope]||[],function(){if(this.options.disabled||this.greedyChild||!this.visible){return}var f=a.ui.intersect(c,this,this.options.tolerance);var h=!f&&this.isover==1?"isout":(f&&this.isover==0?"isover":null);if(!h){return}var g;if(this.options.greedy){var e=this.element.parents(":data(droppable):eq(0)");if(e.length){g=a.data(e[0],"droppable");g.greedyChild=(h=="isover"?1:0)}}if(g&&h=="isover"){g.isover=0;g.isout=1;g._out.call(g,d)}this[h]=1;this[h=="isout"?"isover":"isout"]=0;this[h=="isover"?"_over":"_out"].call(this,d);if(g&&h=="isout"){g.isout=0;g.isover=1;g._over.call(g,d)}})},dragStop:function(c,d){c.element.parents(":not(body,html)").unbind("scroll.droppable");if(!c.options.refreshPositions){a.ui.ddmanager.prepareOffsets(c,d)}}}})(jQuery);
    diff --git a/src/main/webapp/plug-in/sliding/js/jquery.ui.mouse-min.js b/src/main/webapp/plug-in/sliding/js/jquery.ui.mouse-min.js
    new file mode 100644
    index 00000000..a0cab236
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/jquery.ui.mouse-min.js
    @@ -0,0 +1,13 @@
    +/*
    + * jQuery UI Mouse 1.8.16
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Mouse
    + *
    + * Depends:
    + *	jquery.ui.widget.js
    + */
    +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);
    diff --git a/src/main/webapp/plug-in/sliding/js/jquery.ui.sortable-min.js b/src/main/webapp/plug-in/sliding/js/jquery.ui.sortable-min.js
    new file mode 100644
    index 00000000..856f6de1
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/jquery.ui.sortable-min.js
    @@ -0,0 +1 @@
    +(function(a,b){a.widget("ui.sortable",a.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1000},_create:function(){var c=this.options;this.containerCache={};this.element.addClass("ui-sortable");this.refresh();this.floating=this.items.length?c.axis==="x"||(/left|right/).test(this.items[0].item.css("float"))||(/inline|table-cell/).test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var c=this.items.length-1;c>=0;c--){this.items[c].item.removeData("sortable-item")}return this},_setOption:function(c,d){if(c==="disabled"){this.options[c]=d;this.widget()[d?"addClass":"removeClass"]("ui-sortable-disabled")}else{a.Widget.prototype._setOption.apply(this,arguments)}},_mouseCapture:function(f,g){if(this.reverting){return false}if(this.options.disabled||this.options.type=="static"){return false}this._refreshItems(f);var e=null,d=this,c=a(f.target).parents().each(function(){if(a.data(this,"sortable-item")==d){e=a(this);return false}});if(a.data(f.target,"sortable-item")==d){e=a(f.target)}if(!e){return false}if(this.options.handle&&!g){var h=false;a(this.options.handle,e).find("*").andSelf().each(function(){if(this==f.target){h=true}});if(!h){return false}}this.currentItem=e;this._removeCurrentsFromItems();return true},_mouseStart:function(f,g,c){var h=this.options,d=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(f);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");a.extend(this.offset,{click:{left:f.pageX-this.offset.left,top:f.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(f);this.originalPageX=f.pageX;this.originalPageY=f.pageY;(h.cursorAt&&this._adjustOffsetFromHelper(h.cursorAt));this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};if(this.helper[0]!=this.currentItem[0]){this.currentItem.hide()}this._createPlaceholder();if(h.containment){this._setContainment()}if(h.cursor){if(a("body").css("cursor")){this._storedCursor=a("body").css("cursor")}a("body").css("cursor",h.cursor)}if(h.opacity){if(this.helper.css("opacity")){this._storedOpacity=this.helper.css("opacity")}this.helper.css("opacity",h.opacity)}if(h.zIndex){if(this.helper.css("zIndex")){this._storedZIndex=this.helper.css("zIndex")}this.helper.css("zIndex",h.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){this.overflowOffset=this.scrollParent.offset()}this._trigger("start",f,this._uiHash());if(!this._preserveHelperProportions){this._cacheHelperProportions()}if(!c){for(var e=this.containers.length-1;e>=0;e--){this.containers[e]._trigger("activate",f,d._uiHash(this))}}if(a.ui.ddmanager){a.ui.ddmanager.current=this}if(a.ui.ddmanager&&!h.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,f)}this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(f);return true},_mouseDrag:function(g){this.position=this._generatePosition(g);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs){this.lastPositionAbs=this.positionAbs}if(this.options.scroll){var h=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if((this.overflowOffset.top+this.scrollParent[0].offsetHeight)-g.pageY<h.scrollSensitivity){this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+h.scrollSpeed}else{if(g.pageY-this.overflowOffset.top<h.scrollSensitivity){this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-h.scrollSpeed}}if((this.overflowOffset.left+this.scrollParent[0].offsetWidth)-g.pageX<h.scrollSensitivity){this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+h.scrollSpeed}else{if(g.pageX-this.overflowOffset.left<h.scrollSensitivity){this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-h.scrollSpeed}}}else{if(g.pageY-a(document).scrollTop()<h.scrollSensitivity){c=a(document).scrollTop(a(document).scrollTop()-h.scrollSpeed)}else{if(a(window).height()-(g.pageY-a(document).scrollTop())<h.scrollSensitivity){c=a(document).scrollTop(a(document).scrollTop()+h.scrollSpeed)}}if(g.pageX-a(document).scrollLeft()<h.scrollSensitivity){c=a(document).scrollLeft(a(document).scrollLeft()-h.scrollSpeed)}else{if(a(window).width()-(g.pageX-a(document).scrollLeft())<h.scrollSensitivity){c=a(document).scrollLeft(a(document).scrollLeft()+h.scrollSpeed)}}}if(c!==false&&a.ui.ddmanager&&!h.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,g)}}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}for(var e=this.items.length-1;e>=0;e--){var f=this.items[e],d=f.item[0],j=this._intersectsWithPointer(f);if(!j){continue}if(d!=this.currentItem[0]&&this.placeholder[j==1?"next":"prev"]()[0]!=d&&!a.ui.contains(this.placeholder[0],d)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],d):true)){this.direction=j==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f)){this._rearrange(g,f)}else{break}this._trigger("change",g,this._uiHash());break}}this._contactContainers(g);if(a.ui.ddmanager){a.ui.ddmanager.drag(this,g)}this._trigger("sort",g,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(d,e){if(!d){return}if(a.ui.ddmanager&&!this.options.dropBehaviour){a.ui.ddmanager.drop(this,d)}if(this.options.revert){var c=this;var f=c.placeholder.offset();c.reverting=true;a(this.helper).animate({left:f.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:f.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(d)})}else{this._clear(d,e)}return false},cancel:function(){var c=this;if(this.dragging){this._mouseUp({target:null});if(this.options.helper=="original"){this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}for(var d=this.containers.length-1;d>=0;d--){this.containers[d]._trigger("deactivate",null,c._uiHash(this));if(this.containers[d].containerCache.over){this.containers[d]._trigger("out",null,c._uiHash(this));this.containers[d].containerCache.over=0}}}if(this.placeholder){if(this.placeholder[0].parentNode){this.placeholder[0].parentNode.removeChild(this.placeholder[0])}if(this.options.helper!="original"&&this.helper&&this.helper[0].parentNode){this.helper.remove()}a.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});if(this.domPosition.prev){a(this.domPosition.prev).after(this.currentItem)}else{a(this.domPosition.parent).prepend(this.currentItem)}}return this},serialize:function(e){var c=this._getItemsAsjQuery(e&&e.connected);var d=[];e=e||{};a(c).each(function(){var f=(a(e.item||this).attr(e.attribute||"id")||"").match(e.expression||(/(.+)[-=_](.+)/));if(f){d.push((e.key||f[1]+"[]")+"="+(e.key&&e.expression?f[1]:f[2]))}});if(!d.length&&e.key){d.push(e.key+"=")}return d.join("&")},toArray:function(e){var c=this._getItemsAsjQuery(e&&e.connected);var d=[];e=e||{};c.each(function(){d.push(a(e.item||this).attr(e.attribute||"id")||"")});return d},_intersectsWith:function(m){var e=this.positionAbs.left,d=e+this.helperProportions.width,k=this.positionAbs.top,j=k+this.helperProportions.height;var f=m.left,c=f+m.width,n=m.top,i=n+m.height;var o=this.offset.click.top,h=this.offset.click.left;var g=(k+o)>n&&(k+o)<i&&(e+h)>f&&(e+h)<c;if(this.options.tolerance=="pointer"||this.options.forcePointerForContainers||(this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>m[this.floating?"width":"height"])){return g}else{return(f<e+(this.helperProportions.width/2)&&d-(this.helperProportions.width/2)<c&&n<k+(this.helperProportions.height/2)&&j-(this.helperProportions.height/2)<i)}},_intersectsWithPointer:function(e){var f=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),h=f&&d,c=this._getDragVerticalDirection(),g=this._getDragHorizontalDirection();if(!h){return false}return this.floating?(((g&&g=="right")||c=="down")?2:1):(c&&(c=="down"?2:1))},_intersectsWithSides:function(f){var d=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,f.top+(f.height/2),f.height),e=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,f.left+(f.width/2),f.width),c=this._getDragVerticalDirection(),g=this._getDragHorizontalDirection();if(this.floating&&g){return((g=="right"&&e)||(g=="left"&&!e))}else{return c&&((c=="down"&&d)||(c=="up"&&!d))}},_getDragVerticalDirection:function(){var c=this.positionAbs.top-this.lastPositionAbs.top;return c!=0&&(c>0?"down":"up")},_getDragHorizontalDirection:function(){var c=this.positionAbs.left-this.lastPositionAbs.left;return c!=0&&(c>0?"right":"left")},refresh:function(c){this._refreshItems(c);this.refreshPositions();return this},_connectWith:function(){var c=this.options;return c.connectWith.constructor==String?[c.connectWith]:c.connectWith},_getItemsAsjQuery:function(c){var m=this;var h=[];var f=[];var k=this._connectWith();if(k&&c){for(var e=k.length-1;e>=0;e--){var l=a(k[e]);for(var d=l.length-1;d>=0;d--){var g=a.data(l[d],"sortable");if(g&&g!=this&&!g.options.disabled){f.push([a.isFunction(g.options.items)?g.options.items.call(g.element):a(g.options.items,g.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),g])}}}}f.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var e=f.length-1;e>=0;e--){f[e][0].each(function(){h.push(this)})}return a(h)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data(sortable-item)");for(var d=0;d<this.items.length;d++){for(var c=0;c<e.length;c++){if(e[c]==this.items[d].item[0]){this.items.splice(d,1)}}}},_refreshItems:function(c){this.items=[];this.containers=[this];var k=this.items;var q=this;var g=[[a.isFunction(this.options.items)?this.options.items.call(this.element[0],c,{item:this.currentItem}):a(this.options.items,this.element),this]];var m=this._connectWith();if(m){for(var f=m.length-1;f>=0;f--){var n=a(m[f]);for(var e=n.length-1;e>=0;e--){var h=a.data(n[e],"sortable");if(h&&h!=this&&!h.options.disabled){g.push([a.isFunction(h.options.items)?h.options.items.call(h.element[0],c,{item:this.currentItem}):a(h.options.items,h.element),h]);this.containers.push(h)}}}}for(var f=g.length-1;f>=0;f--){var l=g[f][1];var d=g[f][0];for(var e=0,o=d.length;e<o;e++){var p=a(d[e]);p.data("sortable-item",l);k.push({item:p,instance:l,width:0,height:0,left:0,top:0})}}},refreshPositions:function(c){if(this.offsetParent&&this.helper){this.offset.parent=this._getParentOffset()}for(var e=this.items.length-1;e>=0;e--){var f=this.items[e];if(f.instance!=this.currentContainer&&this.currentContainer&&f.item[0]!=this.currentItem[0]){continue}var d=this.options.toleranceElement?a(this.options.toleranceElement,f.item):f.item;if(!c){f.width=d.outerWidth();f.height=d.outerHeight()}var g=d.offset();f.left=g.left;f.top=g.top}if(this.options.custom&&this.options.custom.refreshContainers){this.options.custom.refreshContainers.call(this)}else{for(var e=this.containers.length-1;e>=0;e--){var g=this.containers[e].element.offset();this.containers[e].containerCache.left=g.left;this.containers[e].containerCache.top=g.top;this.containers[e].containerCache.width=this.containers[e].element.outerWidth();this.containers[e].containerCache.height=this.containers[e].element.outerHeight()}}return this},_createPlaceholder:function(e){var c=e||this,f=c.options;if(!f.placeholder||f.placeholder.constructor==String){var d=f.placeholder;f.placeholder={element:function(){var g=a(document.createElement(c.currentItem[0].nodeName)).addClass(d||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!d){g.style.visibility="hidden"}return g},update:function(g,h){if(d&&!f.forcePlaceholderSize){return}if(!h.height()){h.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10))}if(!h.width()){h.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}}c.placeholder=a(f.placeholder.element.call(c.element,c.currentItem));c.currentItem.after(c.placeholder);f.placeholder.update(c,c.placeholder)},_contactContainers:function(c){var e=null,l=null;for(var g=this.containers.length-1;g>=0;g--){if(a.ui.contains(this.currentItem[0],this.containers[g].element[0])){continue}if(this._intersectsWith(this.containers[g].containerCache)){if(e&&a.ui.contains(this.containers[g].element[0],e.element[0])){continue}e=this.containers[g];l=g}else{if(this.containers[g].containerCache.over){this.containers[g]._trigger("out",c,this._uiHash(this));this.containers[g].containerCache.over=0}}}if(!e){return}if(this.containers.length===1){this.containers[l]._trigger("over",c,this._uiHash(this));this.containers[l].containerCache.over=1}else{if(this.currentContainer!=this.containers[l]){var k=10000;var h=null;var d=this.positionAbs[this.containers[l].floating?"left":"top"];for(var f=this.items.length-1;f>=0;f--){if(!a.ui.contains(this.containers[l].element[0],this.items[f].item[0])){continue}var m=this.items[f][this.containers[l].floating?"left":"top"];if(Math.abs(m-d)<k){k=Math.abs(m-d);h=this.items[f]}}if(!h&&!this.options.dropOnEmpty){return}this.currentContainer=this.containers[l];h?this._rearrange(c,h,null,true):this._rearrange(c,null,this.containers[l].element,true);this._trigger("change",c,this._uiHash());this.containers[l]._trigger("change",c,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[l]._trigger("over",c,this._uiHash(this));this.containers[l].containerCache.over=1}}},_createHelper:function(d){var e=this.options;var c=a.isFunction(e.helper)?a(e.helper.apply(this.element[0],[d,this.currentItem])):(e.helper=="clone"?this.currentItem.clone():this.currentItem);if(!c.parents("body").length){a(e.appendTo!="parent"?e.appendTo:this.currentItem[0].parentNode)[0].appendChild(c[0])}if(c[0]==this.currentItem[0]){this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}}if(c[0].style.width==""||e.forceHelperSize){c.width(this.currentItem.width())}if(c[0].style.height==""||e.forceHelperSize){c.height(this.currentItem.height())}return c},_adjustOffsetFromHelper:function(c){if(typeof c=="string"){c=c.split(" ")}if(a.isArray(c)){c={left:+c[0],top:+c[1]||0}}if("left" in c){this.offset.click.left=c.left+this.margins.left}if("right" in c){this.offset.click.left=this.helperProportions.width-c.right+this.margins.left}if("top" in c){this.offset.click.top=c.top+this.margins.top}if("bottom" in c){this.offset.click.top=this.helperProportions.height-c.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var c=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){c.left+=this.scrollParent.scrollLeft();c.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){c={top:0,left:0}}return{top:c.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:c.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var c=this.currentItem.position();return{top:c.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:c.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.currentItem.css("marginLeft"),10)||0),top:(parseInt(this.currentItem.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var f=this.options;if(f.containment=="parent"){f.containment=this.helper[0].parentNode}if(f.containment=="document"||f.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(f.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(f.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(f.containment)){var d=a(f.containment)[0];var e=a(f.containment).offset();var c=(a(d).css("overflow")!="hidden");this.containment=[e.left+(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0)-this.margins.left,e.top+(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0)-this.margins.top,e.left+(c?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,e.top+(c?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(g,i){if(!i){i=this.position}var e=g=="absolute"?1:-1;var f=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,h=(/(html|body)/i).test(c[0].tagName);return{top:(i.top+this.offset.relative.top*e+this.offset.parent.top*e-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(h?0:c.scrollTop()))*e)),left:(i.left+this.offset.relative.left*e+this.offset.parent.left*e-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():h?0:c.scrollLeft())*e))}},_generatePosition:function(f){var i=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,j=(/(html|body)/i).test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var e=f.pageX;var d=f.pageY;if(this.originalPosition){if(this.containment){if(f.pageX-this.offset.click.left<this.containment[0]){e=this.containment[0]+this.offset.click.left}if(f.pageY-this.offset.click.top<this.containment[1]){d=this.containment[1]+this.offset.click.top}if(f.pageX-this.offset.click.left>this.containment[2]){e=this.containment[2]+this.offset.click.left}if(f.pageY-this.offset.click.top>this.containment[3]){d=this.containment[3]+this.offset.click.top}}if(i.grid){var h=this.originalPageY+Math.round((d-this.originalPageY)/i.grid[1])*i.grid[1];d=this.containment?(!(h-this.offset.click.top<this.containment[1]||h-this.offset.click.top>this.containment[3])?h:(!(h-this.offset.click.top<this.containment[1])?h-i.grid[1]:h+i.grid[1])):h;var g=this.originalPageX+Math.round((e-this.originalPageX)/i.grid[0])*i.grid[0];e=this.containment?(!(g-this.offset.click.left<this.containment[0]||g-this.offset.click.left>this.containment[2])?g:(!(g-this.offset.click.left<this.containment[0])?g-i.grid[0]:g+i.grid[0])):g}}return{top:(d-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(j?0:c.scrollTop())))),left:(e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():j?0:c.scrollLeft())))}},_rearrange:function(h,g,d,f){d?d[0].appendChild(this.placeholder[0]):g.item[0].parentNode.insertBefore(this.placeholder[0],(this.direction=="down"?g.item[0]:g.item[0].nextSibling));this.counter=this.counter?++this.counter:1;var e=this,c=this.counter;window.setTimeout(function(){if(c==e.counter){e.refreshPositions(!f)}},0)},_clear:function(e,f){this.reverting=false;var g=[],c=this;if(!this._noFinalSort&&this.currentItem.parent().length){this.placeholder.before(this.currentItem)}this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var d in this._storedCSS){if(this._storedCSS[d]=="auto"||this._storedCSS[d]=="static"){this._storedCSS[d]=""}}this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}if(this.fromOutside&&!f){g.push(function(h){this._trigger("receive",h,this._uiHash(this.fromOutside))})}if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!f){g.push(function(h){this._trigger("update",h,this._uiHash())})}if(!a.ui.contains(this.element[0],this.currentItem[0])){if(!f){g.push(function(h){this._trigger("remove",h,this._uiHash())})}for(var d=this.containers.length-1;d>=0;d--){if(a.ui.contains(this.containers[d].element[0],this.currentItem[0])&&!f){g.push((function(h){return function(i){h._trigger("receive",i,this._uiHash(this))}}).call(this,this.containers[d]));g.push((function(h){return function(i){h._trigger("update",i,this._uiHash(this))}}).call(this,this.containers[d]))}}}for(var d=this.containers.length-1;d>=0;d--){if(!f){g.push((function(h){return function(i){h._trigger("deactivate",i,this._uiHash(this))}}).call(this,this.containers[d]))}if(this.containers[d].containerCache.over){g.push((function(h){return function(i){h._trigger("out",i,this._uiHash(this))}}).call(this,this.containers[d]));this.containers[d].containerCache.over=0}}if(this._storedCursor){a("body").css("cursor",this._storedCursor)}if(this._storedOpacity){this.helper.css("opacity",this._storedOpacity)}if(this._storedZIndex){this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex)}this.dragging=false;if(this.cancelHelperRemoval){if(!f){this._trigger("beforeStop",e,this._uiHash());for(var d=0;d<g.length;d++){g[d].call(this,e)}this._trigger("stop",e,this._uiHash())}return false}if(!f){this._trigger("beforeStop",e,this._uiHash())}this.placeholder[0].parentNode.removeChild(this.placeholder[0]);if(this.helper[0]!=this.currentItem[0]){this.helper.remove()}this.helper=null;if(!f){for(var d=0;d<g.length;d++){g[d].call(this,e)}this._trigger("stop",e,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){if(a.Widget.prototype._trigger.apply(this,arguments)===false){this.cancel()}},_uiHash:function(d){var c=d||this;return{helper:c.helper,placeholder:c.placeholder||a([]),position:c.position,originalPosition:c.originalPosition,offset:c.positionAbs,item:c.currentItem,sender:d?d.element:null}}});a.extend(a.ui.sortable,{version:"1.8.16"})})(jQuery);
    diff --git a/src/main/webapp/plug-in/sliding/js/jquery.ui.sortable.js b/src/main/webapp/plug-in/sliding/js/jquery.ui.sortable.js
    new file mode 100644
    index 00000000..45fbb1ce
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/jquery.ui.sortable.js
    @@ -0,0 +1,1082 @@
    +/*!
    + * jQuery UI Sortable 1.8.21
    + *
    + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Sortables
    + *
    + * Depends:
    + *	jquery.ui.core.js
    + *	jquery.ui.mouse.js
    + *	jquery.ui.widget.js
    + */
    +(function( $, undefined ) {
    +
    +$.widget("ui.sortable", $.ui.mouse, {
    +	widgetEventPrefix: "sort",
    +	ready: false,
    +	options: {
    +		appendTo: "parent",
    +		axis: false,
    +		connectWith: false,
    +		containment: false,
    +		cursor: 'auto',
    +		cursorAt: false,
    +		dropOnEmpty: true,
    +		forcePlaceholderSize: false,
    +		forceHelperSize: false,
    +		grid: false,
    +		handle: false,
    +		helper: "original",
    +		items: '> *',
    +		opacity: false,
    +		placeholder: false,
    +		revert: false,
    +		scroll: true,
    +		scrollSensitivity: 20,
    +		scrollSpeed: 20,
    +		scope: "default",
    +		tolerance: "intersect",
    +		zIndex: 1000
    +	},
    +	_create: function() {
    +
    +		var o = this.options;
    +		this.containerCache = {};
    +		this.element.addClass("ui-sortable");
    +
    +		//Get the items
    +		this.refresh();
    +
    +		//Let's determine if the items are being displayed horizontally
    +		this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
    +
    +		//Let's determine the parent's offset
    +		this.offset = this.element.offset();
    +
    +		//Initialize mouse events for interaction
    +		this._mouseInit();
    +		
    +		//We're ready to go
    +		this.ready = true
    +
    +	},
    +
    +	destroy: function() {
    +		$.Widget.prototype.destroy.call( this );
    +		this.element
    +			.removeClass("ui-sortable ui-sortable-disabled");
    +		this._mouseDestroy();
    +
    +		for ( var i = this.items.length - 1; i >= 0; i-- )
    +			this.items[i].item.removeData(this.widgetName + "-item");
    +
    +		return this;
    +	},
    +
    +	_setOption: function(key, value){
    +		if ( key === "disabled" ) {
    +			this.options[ key ] = value;
    +	
    +			this.widget()
    +				[ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
    +		} else {
    +			// Don't call widget base _setOption for disable as it adds ui-state-disabled class
    +			$.Widget.prototype._setOption.apply(this, arguments);
    +		}
    +	},
    +
    +	_mouseCapture: function(event, overrideHandle) {
    +		var that = this;
    +
    +		if (this.reverting) {
    +			return false;
    +		}
    +
    +		if(this.options.disabled || this.options.type == 'static') return false;
    +
    +		//We have to refresh the items data once first
    +		this._refreshItems(event);
    +
    +		//Find out if the clicked node (or one of its parents) is a actual item in this.items
    +		var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
    +			if($.data(this, that.widgetName + '-item') == self) {
    +				currentItem = $(this);
    +				return false;
    +			}
    +		});
    +		if($.data(event.target, that.widgetName + '-item') == self) currentItem = $(event.target);
    +
    +		if(!currentItem) return false;
    +		if(this.options.handle && !overrideHandle) {
    +			var validHandle = false;
    +
    +			$(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
    +			if(!validHandle) return false;
    +		}
    +
    +		this.currentItem = currentItem;
    +		this._removeCurrentsFromItems();
    +		return true;
    +
    +	},
    +
    +	_mouseStart: function(event, overrideHandle, noActivation) {
    +
    +		var o = this.options, self = this;
    +		this.currentContainer = this;
    +
    +		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
    +		this.refreshPositions();
    +
    +		//Create and append the visible helper
    +		this.helper = this._createHelper(event);
    +
    +		//Cache the helper size
    +		this._cacheHelperProportions();
    +
    +		/*
    +		 * - Position generation -
    +		 * This block generates everything position related - it's the core of draggables.
    +		 */
    +
    +		//Cache the margins of the original element
    +		this._cacheMargins();
    +
    +		//Get the next scrolling parent
    +		this.scrollParent = this.helper.scrollParent();
    +
    +		//The element's absolute position on the page minus margins
    +		this.offset = this.currentItem.offset();
    +		this.offset = {
    +			top: this.offset.top - this.margins.top,
    +			left: this.offset.left - this.margins.left
    +		};
    +
    +		$.extend(this.offset, {
    +			click: { //Where the click happened, relative to the element
    +				left: event.pageX - this.offset.left,
    +				top: event.pageY - this.offset.top
    +			},
    +			parent: this._getParentOffset(),
    +			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
    +		});
    +
    +		// Only after we got the offset, we can change the helper's position to absolute
    +		// TODO: Still need to figure out a way to make relative sorting possible
    +		this.helper.css("position", "absolute");
    +		this.cssPosition = this.helper.css("position");
    +		
    +		//Generate the original position
    +		this.originalPosition = this._generatePosition(event);
    +		this.originalPageX = event.pageX;
    +		this.originalPageY = event.pageY;
    +
    +		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
    +		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
    +
    +		//Cache the former DOM position
    +		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
    +
    +		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
    +		if(this.helper[0] != this.currentItem[0]) {
    +			this.currentItem.hide();
    +		}
    +
    +		//Create the placeholder
    +		this._createPlaceholder();
    +
    +		//Set a containment if given in the options
    +		if(o.containment)
    +			this._setContainment();
    +
    +		if(o.cursor) { // cursor option
    +			if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
    +			$('body').css("cursor", o.cursor);
    +		}
    +
    +		if(o.opacity) { // opacity option
    +			if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
    +			this.helper.css("opacity", o.opacity);
    +		}
    +
    +		if(o.zIndex) { // zIndex option
    +			if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
    +			this.helper.css("zIndex", o.zIndex);
    +		}
    +
    +		//Prepare scrolling
    +		if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
    +			this.overflowOffset = this.scrollParent.offset();
    +
    +		//Call callbacks
    +		this._trigger("start", event, this._uiHash());
    +
    +		//Recache the helper size
    +		if(!this._preserveHelperProportions)
    +			this._cacheHelperProportions();
    +
    +
    +		//Post 'activate' events to possible containers
    +		if(!noActivation) {
    +			 for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
    +		}
    +
    +		//Prepare possible droppables
    +		if($.ui.ddmanager)
    +			$.ui.ddmanager.current = this;
    +
    +		if ($.ui.ddmanager && !o.dropBehaviour)
    +			$.ui.ddmanager.prepareOffsets(this, event);
    +
    +		this.dragging = true;
    +
    +		this.helper.addClass("ui-sortable-helper");
    +		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
    +		return true;
    +
    +	},
    +
    +	_mouseDrag: function(event) {
    +
    +		//Compute the helpers position
    +		this.position = this._generatePosition(event);
    +		this.positionAbs = this._convertPositionTo("absolute");
    +
    +		if (!this.lastPositionAbs) {
    +			this.lastPositionAbs = this.positionAbs;
    +		}
    +
    +		//Do scrolling
    +		if(this.options.scroll) {
    +			var o = this.options, scrolled = false;
    +			if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
    +
    +				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
    +					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
    +				else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
    +					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
    +
    +				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
    +					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
    +				else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
    +					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
    +
    +			} else {
    +
    +				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
    +					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
    +				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
    +					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
    +
    +				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
    +					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
    +				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
    +					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
    +
    +			}
    +
    +			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
    +				$.ui.ddmanager.prepareOffsets(this, event);
    +		}
    +
    +		//Regenerate the absolute position used for position checks
    +		this.positionAbs = this._convertPositionTo("absolute");
    +
    +		//Set the helper position
    +		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
    +		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
    +
    +		//Rearrange
    +		for (var i = this.items.length - 1; i >= 0; i--) {
    +
    +			//Cache variables and intersection, continue if no intersection
    +			var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
    +			if (!intersection) continue;
    +
    +			if(itemElement != this.currentItem[0] //cannot intersect with itself
    +				&&	this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
    +				&&	!$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
    +				&& (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
    +				//&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
    +			) {
    +
    +				this.direction = intersection == 1 ? "down" : "up";
    +
    +				if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
    +					this._rearrange(event, item);
    +				} else {
    +					break;
    +				}
    +
    +				this._trigger("change", event, this._uiHash());
    +				break;
    +			}
    +		}
    +
    +		//Post events to containers
    +		this._contactContainers(event);
    +
    +		//Interconnect with droppables
    +		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
    +
    +		//Call callbacks
    +		this._trigger('sort', event, this._uiHash());
    +
    +		this.lastPositionAbs = this.positionAbs;
    +		return false;
    +
    +	},
    +
    +	_mouseStop: function(event, noPropagation) {
    +
    +		if(!event) return;
    +
    +		//If we are using droppables, inform the manager about the drop
    +		if ($.ui.ddmanager && !this.options.dropBehaviour)
    +			$.ui.ddmanager.drop(this, event);
    +
    +		if(this.options.revert) {
    +			var self = this;
    +			var cur = self.placeholder.offset();
    +
    +			self.reverting = true;
    +
    +			$(this.helper).animate({
    +				left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
    +				top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
    +			}, parseInt(this.options.revert, 10) || 500, function() {
    +				self._clear(event);
    +			});
    +		} else {
    +			this._clear(event, noPropagation);
    +		}
    +
    +		return false;
    +
    +	},
    +
    +	cancel: function() {
    +
    +		var self = this;
    +
    +		if(this.dragging) {
    +
    +			this._mouseUp({ target: null });
    +
    +			if(this.options.helper == "original")
    +				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
    +			else
    +				this.currentItem.show();
    +
    +			//Post deactivating events to containers
    +			for (var i = this.containers.length - 1; i >= 0; i--){
    +				this.containers[i]._trigger("deactivate", null, self._uiHash(this));
    +				if(this.containers[i].containerCache.over) {
    +					this.containers[i]._trigger("out", null, self._uiHash(this));
    +					this.containers[i].containerCache.over = 0;
    +				}
    +			}
    +
    +		}
    +
    +		if (this.placeholder) {
    +			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
    +			if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
    +			if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
    +
    +			$.extend(this, {
    +				helper: null,
    +				dragging: false,
    +				reverting: false,
    +				_noFinalSort: null
    +			});
    +
    +			if(this.domPosition.prev) {
    +				$(this.domPosition.prev).after(this.currentItem);
    +			} else {
    +				$(this.domPosition.parent).prepend(this.currentItem);
    +			}
    +		}
    +
    +		return this;
    +
    +	},
    +
    +	serialize: function(o) {
    +
    +		var items = this._getItemsAsjQuery(o && o.connected);
    +		var str = []; o = o || {};
    +
    +		$(items).each(function() {
    +			var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
    +			if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
    +		});
    +
    +		if(!str.length && o.key) {
    +			str.push(o.key + '=');
    +		}
    +
    +		return str.join('&');
    +
    +	},
    +
    +	toArray: function(o) {
    +
    +		var items = this._getItemsAsjQuery(o && o.connected);
    +		var ret = []; o = o || {};
    +
    +		items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
    +		return ret;
    +
    +	},
    +
    +	/* Be careful with the following core functions */
    +	_intersectsWith: function(item) {
    +
    +		var x1 = this.positionAbs.left,
    +			x2 = x1 + this.helperProportions.width,
    +			y1 = this.positionAbs.top,
    +			y2 = y1 + this.helperProportions.height;
    +
    +		var l = item.left,
    +			r = l + item.width,
    +			t = item.top,
    +			b = t + item.height;
    +
    +		var dyClick = this.offset.click.top,
    +			dxClick = this.offset.click.left;
    +
    +		var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
    +
    +		if(	   this.options.tolerance == "pointer"
    +			|| this.options.forcePointerForContainers
    +			|| (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
    +		) {
    +			return isOverElement;
    +		} else {
    +
    +			return (l < x1 + (this.helperProportions.width / 2) // Right Half
    +				&& x2 - (this.helperProportions.width / 2) < r // Left Half
    +				&& t < y1 + (this.helperProportions.height / 2) // Bottom Half
    +				&& y2 - (this.helperProportions.height / 2) < b ); // Top Half
    +
    +		}
    +	},
    +
    +	_intersectsWithPointer: function(item) {
    +
    +		var isOverElementHeight = (this.options.axis === 'x') || $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
    +			isOverElementWidth = (this.options.axis === 'y') || $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
    +			isOverElement = isOverElementHeight && isOverElementWidth,
    +			verticalDirection = this._getDragVerticalDirection(),
    +			horizontalDirection = this._getDragHorizontalDirection();
    +
    +		if (!isOverElement)
    +			return false;
    +
    +		return this.floating ?
    +			( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
    +			: ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
    +
    +	},
    +
    +	_intersectsWithSides: function(item) {
    +
    +		var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
    +			isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
    +			verticalDirection = this._getDragVerticalDirection(),
    +			horizontalDirection = this._getDragHorizontalDirection();
    +
    +		if (this.floating && horizontalDirection) {
    +			return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
    +		} else {
    +			return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
    +		}
    +
    +	},
    +
    +	_getDragVerticalDirection: function() {
    +		var delta = this.positionAbs.top - this.lastPositionAbs.top;
    +		return delta != 0 && (delta > 0 ? "down" : "up");
    +	},
    +
    +	_getDragHorizontalDirection: function() {
    +		var delta = this.positionAbs.left - this.lastPositionAbs.left;
    +		return delta != 0 && (delta > 0 ? "right" : "left");
    +	},
    +
    +	refresh: function(event) {
    +		this._refreshItems(event);
    +		this.refreshPositions();
    +		return this;
    +	},
    +
    +	_connectWith: function() {
    +		var options = this.options;
    +		return options.connectWith.constructor == String
    +			? [options.connectWith]
    +			: options.connectWith;
    +	},
    +	
    +	_getItemsAsjQuery: function(connected) {
    +
    +		var self = this;
    +		var items = [];
    +		var queries = [];
    +		var connectWith = this._connectWith();
    +
    +		if(connectWith && connected) {
    +			for (var i = connectWith.length - 1; i >= 0; i--){
    +				var cur = $(connectWith[i]);
    +				for (var j = cur.length - 1; j >= 0; j--){
    +					var inst = $.data(cur[j], this.widgetName);
    +					if(inst && inst != this && !inst.options.disabled) {
    +						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
    +					}
    +				};
    +			};
    +		}
    +
    +		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
    +
    +		for (var i = queries.length - 1; i >= 0; i--){
    +			queries[i][0].each(function() {
    +				items.push(this);
    +			});
    +		};
    +
    +		return $(items);
    +
    +	},
    +
    +	_removeCurrentsFromItems: function() {
    +
    +		var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
    +
    +		for (var i=0; i < this.items.length; i++) {
    +
    +			for (var j=0; j < list.length; j++) {
    +				if(list[j] == this.items[i].item[0])
    +					this.items.splice(i,1);
    +			};
    +
    +		};
    +
    +	},
    +
    +	_refreshItems: function(event) {
    +
    +		this.items = [];
    +		this.containers = [this];
    +		var items = this.items;
    +		var self = this;
    +		var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
    +		var connectWith = this._connectWith();
    +
    +		if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
    +			for (var i = connectWith.length - 1; i >= 0; i--){
    +				var cur = $(connectWith[i]);
    +				for (var j = cur.length - 1; j >= 0; j--){
    +					var inst = $.data(cur[j], this.widgetName);
    +					if(inst && inst != this && !inst.options.disabled) {
    +						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
    +						this.containers.push(inst);
    +					}
    +				};
    +			};
    +		}
    +
    +		for (var i = queries.length - 1; i >= 0; i--) {
    +			var targetData = queries[i][1];
    +			var _queries = queries[i][0];
    +
    +			for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
    +				var item = $(_queries[j]);
    +
    +				item.data(this.widgetName + '-item', targetData); // Data for target checking (mouse manager)
    +
    +				items.push({
    +					item: item,
    +					instance: targetData,
    +					width: 0, height: 0,
    +					left: 0, top: 0
    +				});
    +			};
    +		};
    +
    +	},
    +
    +	refreshPositions: function(fast) {
    +
    +		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
    +		if(this.offsetParent && this.helper) {
    +			this.offset.parent = this._getParentOffset();
    +		}
    +
    +		for (var i = this.items.length - 1; i >= 0; i--){
    +			var item = this.items[i];
    +
    +			//We ignore calculating positions of all connected containers when we're not over them
    +			if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
    +				continue;
    +
    +			var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
    +
    +			if (!fast) {
    +				item.width = t.outerWidth();
    +				item.height = t.outerHeight();
    +			}
    +
    +			var p = t.offset();
    +			item.left = p.left;
    +			item.top = p.top;
    +		};
    +
    +		if(this.options.custom && this.options.custom.refreshContainers) {
    +			this.options.custom.refreshContainers.call(this);
    +		} else {
    +			for (var i = this.containers.length - 1; i >= 0; i--){
    +				var p = this.containers[i].element.offset();
    +				this.containers[i].containerCache.left = p.left;
    +				this.containers[i].containerCache.top = p.top;
    +				this.containers[i].containerCache.width	= this.containers[i].element.outerWidth();
    +				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
    +			};
    +		}
    +
    +		return this;
    +	},
    +
    +	_createPlaceholder: function(that) {
    +
    +		var self = that || this, o = self.options;
    +
    +		if(!o.placeholder || o.placeholder.constructor == String) {
    +			var className = o.placeholder;
    +			o.placeholder = {
    +				element: function() {
    +
    +					var el = $(document.createElement(self.currentItem[0].nodeName))
    +						.addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
    +						.removeClass("ui-sortable-helper")[0];
    +
    +					if(!className)
    +						el.style.visibility = "hidden";
    +
    +					return el;
    +				},
    +				update: function(container, p) {
    +
    +					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
    +					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
    +					if(className && !o.forcePlaceholderSize) return;
    +
    +					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
    +					if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
    +					if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
    +				}
    +			};
    +		}
    +
    +		//Create the placeholder
    +		self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
    +
    +		//Append it after the actual current item
    +		self.currentItem.after(self.placeholder);
    +
    +		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
    +		o.placeholder.update(self, self.placeholder);
    +
    +	},
    +
    +	_contactContainers: function(event) {
    +		
    +		// get innermost container that intersects with item 
    +		var innermostContainer = null, innermostIndex = null;		
    +		
    +		
    +		for (var i = this.containers.length - 1; i >= 0; i--){
    +
    +			// never consider a container that's located within the item itself 
    +			if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
    +				continue;
    +
    +			if(this._intersectsWith(this.containers[i].containerCache)) {
    +
    +				// if we've already found a container and it's more "inner" than this, then continue 
    +				if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
    +					continue;
    +
    +				innermostContainer = this.containers[i]; 
    +				innermostIndex = i;
    +					
    +			} else {
    +				// container doesn't intersect. trigger "out" event if necessary 
    +				if(this.containers[i].containerCache.over) {
    +					this.containers[i]._trigger("out", event, this._uiHash(this));
    +					this.containers[i].containerCache.over = 0;
    +				}
    +			}
    +
    +		}
    +		
    +		// if no intersecting containers found, return 
    +		if(!innermostContainer) return; 
    +
    +		// move the item into the container if it's not there already
    +		if(this.containers.length === 1) {
    +			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
    +			this.containers[innermostIndex].containerCache.over = 1;
    +		} else if(this.currentContainer != this.containers[innermostIndex]) {
    +
    +			//When entering a new container, we will find the item with the least distance and append our item near it
    +			var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
    +			for (var j = this.items.length - 1; j >= 0; j--) {
    +				if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
    +				var cur = this.containers[innermostIndex].floating ? this.items[j].item.offset().left : this.items[j].item.offset().top;
    +				if(Math.abs(cur - base) < dist) {
    +					dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
    +					this.direction = (cur - base > 0) ? 'down' : 'up';
    +				}
    +			}
    +
    +			if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
    +				return;
    +
    +			this.currentContainer = this.containers[innermostIndex];
    +			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
    +			this._trigger("change", event, this._uiHash());
    +			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
    +
    +			//Update the placeholder
    +			this.options.placeholder.update(this.currentContainer, this.placeholder);
    +
    +			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
    +			this.containers[innermostIndex].containerCache.over = 1;
    +		} 
    +	
    +		
    +	},
    +
    +	_createHelper: function(event) {
    +
    +		var o = this.options;
    +		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
    +
    +		if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
    +			$(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
    +
    +		if(helper[0] == this.currentItem[0])
    +			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
    +
    +		if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
    +		if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
    +
    +		return helper;
    +
    +	},
    +
    +	_adjustOffsetFromHelper: function(obj) {
    +		if (typeof obj == 'string') {
    +			obj = obj.split(' ');
    +		}
    +		if ($.isArray(obj)) {
    +			obj = {left: +obj[0], top: +obj[1] || 0};
    +		}
    +		if ('left' in obj) {
    +			this.offset.click.left = obj.left + this.margins.left;
    +		}
    +		if ('right' in obj) {
    +			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
    +		}
    +		if ('top' in obj) {
    +			this.offset.click.top = obj.top + this.margins.top;
    +		}
    +		if ('bottom' in obj) {
    +			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
    +		}
    +	},
    +
    +	_getParentOffset: function() {
    +
    +
    +		//Get the offsetParent and cache its position
    +		this.offsetParent = this.helper.offsetParent();
    +		var po = this.offsetParent.offset();
    +
    +		// This is a special case where we need to modify a offset calculated on start, since the following happened:
    +		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
    +		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
    +		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
    +		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
    +			po.left += this.scrollParent.scrollLeft();
    +			po.top += this.scrollParent.scrollTop();
    +		}
    +
    +		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
    +		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
    +			po = { top: 0, left: 0 };
    +
    +		return {
    +			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
    +			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
    +		};
    +
    +	},
    +
    +	_getRelativeOffset: function() {
    +
    +		if(this.cssPosition == "relative") {
    +			var p = this.currentItem.position();
    +			return {
    +				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
    +				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
    +			};
    +		} else {
    +			return { top: 0, left: 0 };
    +		}
    +
    +	},
    +
    +	_cacheMargins: function() {
    +		this.margins = {
    +			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
    +			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
    +		};
    +	},
    +
    +	_cacheHelperProportions: function() {
    +		this.helperProportions = {
    +			width: this.helper.outerWidth(),
    +			height: this.helper.outerHeight()
    +		};
    +	},
    +
    +	_setContainment: function() {
    +
    +		var o = this.options;
    +		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
    +		if(o.containment == 'document' || o.containment == 'window') this.containment = [
    +			0 - this.offset.relative.left - this.offset.parent.left,
    +			0 - this.offset.relative.top - this.offset.parent.top,
    +			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
    +			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
    +		];
    +
    +		if(!(/^(document|window|parent)$/).test(o.containment)) {
    +			var ce = $(o.containment)[0];
    +			var co = $(o.containment).offset();
    +			var over = ($(ce).css("overflow") != 'hidden');
    +
    +			this.containment = [
    +				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
    +				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
    +				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
    +				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
    +			];
    +		}
    +
    +	},
    +
    +	_convertPositionTo: function(d, pos) {
    +
    +		if(!pos) pos = this.position;
    +		var mod = d == "absolute" ? 1 : -1;
    +		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
    +
    +		return {
    +			top: (
    +				pos.top																	// The absolute mouse position
    +				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
    +				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
    +				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
    +			),
    +			left: (
    +				pos.left																// The absolute mouse position
    +				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
    +				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
    +				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
    +			)
    +		};
    +
    +	},
    +
    +	_generatePosition: function(event) {
    +
    +		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
    +
    +		// This is another very weird special case that only happens for relative elements:
    +		// 1. If the css position is relative
    +		// 2. and the scroll parent is the document or similar to the offset parent
    +		// we have to refresh the relative offset during the scroll so there are no jumps
    +		if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
    +			this.offset.relative = this._getRelativeOffset();
    +		}
    +
    +		var pageX = event.pageX;
    +		var pageY = event.pageY;
    +
    +		/*
    +		 * - Position constraining -
    +		 * Constrain the position to a mix of grid, containment.
    +		 */
    +
    +		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
    +
    +			if(this.containment) {
    +				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
    +				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
    +				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
    +				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
    +			}
    +
    +			if(o.grid) {
    +				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
    +				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
    +
    +				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
    +				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
    +			}
    +
    +		}
    +
    +		return {
    +			top: (
    +				pageY																// The absolute mouse position
    +				- this.offset.click.top													// Click offset (relative to the element)
    +				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
    +				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
    +				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
    +			),
    +			left: (
    +				pageX																// The absolute mouse position
    +				- this.offset.click.left												// Click offset (relative to the element)
    +				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
    +				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
    +				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
    +			)
    +		};
    +
    +	},
    +
    +	_rearrange: function(event, i, a, hardRefresh) {
    +
    +		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
    +
    +		//Various things done here to improve the performance:
    +		// 1. we create a setTimeout, that calls refreshPositions
    +		// 2. on the instance, we have a counter variable, that get's higher after every append
    +		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
    +		// 4. this lets only the last addition to the timeout stack through
    +		this.counter = this.counter ? ++this.counter : 1;
    +		var self = this, counter = this.counter;
    +
    +		window.setTimeout(function() {
    +			if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
    +		},0);
    +
    +	},
    +
    +	_clear: function(event, noPropagation) {
    +
    +		this.reverting = false;
    +		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
    +		// everything else normalized again
    +		var delayedTriggers = [], self = this;
    +
    +		// We first have to update the dom position of the actual currentItem
    +		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
    +		if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
    +		this._noFinalSort = null;
    +
    +		if(this.helper[0] == this.currentItem[0]) {
    +			for(var i in this._storedCSS) {
    +				if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
    +			}
    +			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
    +		} else {
    +			this.currentItem.show();
    +		}
    +
    +		if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
    +		if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
    +		if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
    +			if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
    +			for (var i = this.containers.length - 1; i >= 0; i--){
    +				if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
    +					delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
    +					delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.containers[i]));
    +				}
    +			};
    +		};
    +
    +		//Post events to containers
    +		for (var i = this.containers.length - 1; i >= 0; i--){
    +			if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
    +			if(this.containers[i].containerCache.over) {
    +				delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
    +				this.containers[i].containerCache.over = 0;
    +			}
    +		}
    +
    +		//Do what was originally in plugins
    +		if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
    +		if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
    +		if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
    +
    +		this.dragging = false;
    +		if(this.cancelHelperRemoval) {
    +			if(!noPropagation) {
    +				this._trigger("beforeStop", event, this._uiHash());
    +				for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
    +				this._trigger("stop", event, this._uiHash());
    +			}
    +			return false;
    +		}
    +
    +		if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
    +
    +		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
    +		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
    +
    +		if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
    +
    +		if(!noPropagation) {
    +			for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
    +			this._trigger("stop", event, this._uiHash());
    +		}
    +
    +		this.fromOutside = false;
    +		return true;
    +
    +	},
    +
    +	_trigger: function() {
    +		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
    +			this.cancel();
    +		}
    +	},
    +
    +	_uiHash: function(inst) {
    +		var self = inst || this;
    +		return {
    +			helper: self.helper,
    +			placeholder: self.placeholder || $([]),
    +			position: self.position,
    +			originalPosition: self.originalPosition,
    +			offset: self.positionAbs,
    +			item: self.currentItem,
    +			sender: inst ? inst.element : null
    +		};
    +	}
    +
    +});
    +
    +$.extend($.ui.sortable, {
    +	version: "1.8.21"
    +});
    +
    +})(jQuery);
    diff --git a/src/main/webapp/plug-in/sliding/js/jquery.ui.widget-min.js b/src/main/webapp/plug-in/sliding/js/jquery.ui.widget-min.js
    new file mode 100644
    index 00000000..806ce8f5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/jquery.ui.widget-min.js
    @@ -0,0 +1,10 @@
    +/*
    + * jQuery UI Widget 1.8.16
    + *
    + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
    + * Dual licensed under the MIT or GPL Version 2 licenses.
    + * http://jquery.org/license
    + *
    + * http://docs.jquery.com/UI/Widget
    + */
    +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(f,g,h){var k=this.options[f];g=b.Event(g);g.type=(f===this.widgetEventPrefix?f:this.widgetEventPrefix+f).toLowerCase();h=h||{};if(g.originalEvent){for(var e=b.event.props.length,j;e;){j=b.event.props[--e];g[j]=g.originalEvent[j]}}this.element.trigger(g,h);return !(b.isFunction(k)&&k.call(this.element[0],g,h)===false||g.isDefaultPrevented())}}})(jQuery);
    diff --git a/src/main/webapp/plug-in/sliding/js/webos-core.js b/src/main/webapp/plug-in/sliding/js/webos-core.js
    new file mode 100644
    index 00000000..07c89af9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/sliding/js/webos-core.js
    @@ -0,0 +1,1744 @@
    +锘/**
    +* webos 1.2 
    +* JS閲囩敤闈㈠悜瀵硅薄缂栧啓
    +* 浠縲ebQQ鍩烘湰鍔熻兘
    +* 1.1 鏂板姞鎷栨嫿 妗岄潰鍒囨崲 鍙抽敭 1绾ф爮甯冨眬鍒囨崲 搴旂敤鑷傚簲甯冨眬 
    +* 1.2 鏂板姞鍏ㄥ眬妗岄潰  浠g爜鍊熼壌1kb.js
    +* @xiaofan
    +* @2012.3.9 
    +*/
    +var menujson=null;
    +var datajson=null;
    +var iconjson=null;
    +var totalnum =null;
    +var DATA=new Object();
    +var iconCookieKey = "iconCookieKey";
    +var iconCookieKeyForSlider = "iconCookieKeyForSlider";
    +var cookieParam = {expires: 30};
    +/*榛樿宸︿晶鑿滃崟*/
    +var defaultIconForSlider = [
    +//    '297e20104620167201462016b5fe001f',/*鐢ㄦ埛绠$悊*/
    +//    '297e20104620167201462016b6020021' /*瑙掕壊绠$悊*/
    +];
    +	//澧炲姞鏁版嵁鍔ㄦ佸鐞嗙殑杩囩▼
    +	////杩欓噷浣跨敤menuString鏉ユ浛鎹㈡帀姣忎釜涓绾т簩绾ц彍鍗曠殑鏁版嵁
    +
    +function dataFlush(){
    +	$.ajax({
    +        url: "loginController.do?getPrimaryMenuForWebos",
    +        datatype: "json",
    +        async:false,
    +        type: "post",
    +  	  	success: function (data) {
    +            //淇敼webOS鐣岄潰鑿滃崟涓嶅嚭鐜扮殑闂
    +            var menu;
    +            menu = eval("(" +data+")");
    +            var array = menu.msg.split("$$");
    +            menujson=array[0];
    +            menujson = eval("("+menujson+")");
    +            iconjson=array[1];
    +            iconjson = eval("("+iconjson+")");
    +            datajson=array[2];
    +            datajson = eval("("+datajson+")");
    +            var totalnum1=array[3];
    +            totalnum = totalnum1 - 1;
    +
    +            calcuIconJson();
    +		}
    +    });
    +}
    +
    +/**
    + * 杞崲鐢ㄦ埛鐨勬闈
    + */
    +function calcuIconJson() {
    +    var iconCookieData = $.cookie(iconCookieKey);
    +    var iconCookieDataForSlider = $.cookie(iconCookieKeyForSlider);
    +    if (iconCookieData) {
    +        var allIconIdArrOfCookie = new Array(); // cookie涓墍鏈夌殑鑿滃崟鍥炬爣Id
    +        var tempIconJson = {}; // 涓存椂鐨勫浘鏍囧璞
    +        for (var attr in iconjson) {
    +            tempIconJson[attr] = new Array();
    +        }
    +        // 澶勭悊妗岄潰鑿滃崟
    +        var arrColumn = iconCookieData.split('|');
    +        $.each(arrColumn, function (index, content) {
    +            var iconName = content.split(':')[0]; //iconName
    +            var arrIconId = content.split(':')[1] ? content.split(':')[1].split('@') : ""; //鍗曚釜搴忓垪ID
    +            $.each(arrIconId, function (index, content) {
    +                if (content) {//鎺掗櫎绌哄
    +                    tempIconJson[iconName].push(content);
    +                    allIconIdArrOfCookie.push(content);
    +                }
    +            });
    +        });
    +        // 澶勭悊宸︿晶鑿滃崟
    +        if(iconCookieDataForSlider) {
    +            DATA.sApp = {};
    +            defaultIconForSlider = new Array();
    +            var arrIconId = iconCookieDataForSlider.split('@'); //鍗曚釜搴忓垪ID
    +            $.each(arrIconId, function (index, content) {
    +                if (content) {//鎺掗櫎绌哄
    +                    for (var attrName in datajson.app) {
    +                        if(content == attrName) {
    +                            DATA.sApp[attrName] = datajson.app[attrName];
    +                            break;
    +                        }
    +                    }
    +
    +                    defaultIconForSlider.push(content);
    +
    +                    allIconIdArrOfCookie.push(content);
    +                }
    +            });
    +        }
    +
    +        // 澶勭悊鏂板鐨勮彍鍗曞浘鏍噄d
    +        for (var attrName in iconjson) {
    +            for(var iconIndex in iconjson[attrName]) {
    +                var iconId = iconjson[attrName][iconIndex];
    +                if(allIconIdArrOfCookie.indexOf(iconId) == -1) {
    +                    tempIconJson[attrName].push(iconId);
    +                }
    +            }
    +        }
    +        iconjson = tempIconJson;
    +    }
    +}
    +
    +
    +//宸ュ叿绫
    +Util = {
    +	formatmodel : function (str, model) {
    +		for (var k in model) {
    +			var re = new RegExp("{" + k + "}", "g");
    +			str = str.replace(re, model[k])
    +		}
    +		return str
    +	}
    +}
    +
    +//闈㈡澘绫
    +Panel=function(){
    +	return me={
    +		hitTest:function(panel,x,y){//纰版挒妫娴嬶紝妫娴嬪潗鏍嘯x,y]鏄惁钀藉湪panel閲岄潰
    +			var pl,pt;
    +			return !(
    +				  x<(pl=panel.offset().left)
    +				||y<(pt=panel.offset().top)
    +				||x>pl+panel.width()
    +				||y>pt+panel.height()
    +			);
    +		},
    +		getIdx:function(panel){//鑾峰彇鑺傜偣鍦╬anel鏄鍑犱釜鍎垮瓙鑺傜偣
    +			var ci=0;
    +			while(panel=panel.prev()){
    +				ci++;
    +			}
    +			return ci;
    +		},
    +		unSelecte:function(){//娓呴櫎閫変腑
    +			return window.getSelection?function(){window.getSelection().removeAllRanges();}:function(){document.selection.empty();};
    +		}()
    +	};
    +}();
    +
    +//BODY
    +Body=function(me){
    +	//浼樺厛鍒锋柊鍑哄悗鍙扮殑鏁版嵁浠ヤ究鍏朵粬鏂规硶涓娇鐢ㄦ浛鎹
    +	dataFlush();
    +	return me={
    +		init:function(){
    +			me.create();
    +			me.bindEvent();
    +		},
    +		create:function(){
    +			me.box=$('body');
    +			me.setStyle();
    +		},
    +		bindEvent:function(){//娓呴櫎閫変腑
    +			function move(evt){
    +				window.getSelection?window.getSelection().removeAllRanges():document.selection.empty();
    +			}
    +			function up(evt){
    +				$(document).unbind('mousemove',move).unbind('mouseup',up);
    +			}
    +			$(document).bind('mousedown',function(){
    +				$(document).bind('mousemove',move).bind('mouseup',up);
    +			});
    +		},
    +		addPanel:function(panel){
    +			me.box.append(panel);
    +		},
    +		setStyle:function(){
    +			me.box.css({
    +					backgroud:"none repeat scroll 0 0 transparent",					
    +					display: "block",
    +					height:"500px"
    +			});
    +			
    +		}
    +		
    +	};
    +}();
    +
    +//鍒涘缓妗岄潰鏈澶栧眰绫
    +Desktop=function(me){
    +	return me={
    +		init:function(){
    +			me.create();
    +			//me.setMenu();//缁戝畾鍙抽敭
    +			return me;
    +		}, 
    +		create:function(){		
    +			me.box=$("<div id='desktop'  style='position: static;'></div>");
    +			Body.addPanel(me.box);
    +		},
    +		addPanel:function(panel){
    +			me.box.append(panel);
    +		},
    +		show:function(){
    +			me.box.show();
    +		},
    +		hide:function(){
    +			me.box.hide();
    +		},
    +		setMenu:function(){
    +			var MenuData = [
    +						[{
    +							text: "鏄剧ず妗岄潰",
    +							func: function() {
    +								
    +							}
    +						},{
    +							text: "鍏抽棴鎵鏈",
    +							func: function() {
    +								Windows.closeAllWindow();
    +							}
    +						}, {
    +							text: "閿佸睆",
    +							func: function() {
    +								
    +							}
    +						}],
    +						[{
    +							text: "绯荤粺璁剧疆",
    +							func: function() {
    +								 
    +							}
    +						},{
    +							text: "涓婚璁剧疆",
    +							func: function() {								
    +							  Windows.openSys({
    +								id :'themSetting',
    +								title :'璁剧疆涓婚',
    +								width :650,
    +								height:500,
    +							 	content :document.getElementById("themeSetting_wrap")
    +							 });
    +							}
    +						},
    +						{
    +							text: "鍥炬爣璁剧疆",
    +							data: [[{
    +								text: "澶у浘鏍",
    +								func: function() {
    +									Deskpanel.desktopsContainer.removeClass("desktopSmallIcon");
    +								}
    +							}, {
    +								text: "灏忓浘鏍",
    +								func: function() {
    +									Deskpanel.desktopsContainer.addClass("desktopSmallIcon");
    +								}
    +							}]]
    +						}],
    +						[{
    +							text:"娉ㄩ攢",
    +							func:function(){
    +							
    +							}
    +						}]
    +					];
    +					
    +			me.box.smartMenu(MenuData, {
    +				name: "image"    
    +			});
    +		}
    +	};
    +}();
    +
    +//妗岄潰鍐呴儴闈㈡澘
    +Deskpanel = function(me){
    +	
    +	var desktopWrapper = "<div id='desktopWrapper'></div>";//鏈澶栧眰瀹瑰櫒
    +	var desktopsContainer = "<div id='desktopsContainer' class='desktopsContainer'	>";
    +	var desktopContainer = "<div class='desktopContainer' index='{index}' >";
    +	var desktopAppListener = "<div class='appListContainer' customacceptdrop='{index}' index='{index}' _olddisplay='block' >";//鍐呴儴鐩戝惉瀹瑰櫒
    +	var defaultIndex = 0,
    +		////鏇挎崲鎺夊叿浣撶殑涓绾ц彍鍗曟暟閲
    +		defaultNum = 15,
    +		defautlSpace ={//榛樿灏哄
    +			left:0,
    +			top:0,
    +			right:0,
    +			bottom:120
    +		}
    +		
    +	
    +	
    +	return me ={
    +		init:function(ops, firstLoad){
    +			me.create();
    +			me.addIcons(ops);
    +			me.space(defautlSpace);
    +			me.refresh(firstLoad);
    +			me.bindEvent();
    +			me.addCurrnet(defaultIndex);
    +			return me;
    +		},		
    +		create:function(){
    +			me.box=$(desktopWrapper);//妗岄潰澶栧眰闈㈡澘			
    +			me.desktopsContainer = $(desktopsContainer);
    +			me.createDesktopsContainer(defaultNum);	//鍒涘缓妗岄潰澶栧眰瀹瑰櫒
    +			me.box.append(me.desktopsContainer);
    +			me.box.css({"left": "73px","right": "0px"});
    +			me.desktopsContainer.css("left",73);
    +			Desktop.addPanel(me.box);
    +			me.Icon=[];
    +		},
    +		bindEvent:function(){
    +			//妗岄潰鍥炬爣鎷栨嫿
    +			me.desktopsContainer.find(".appListContainer").each(function(){
    +				var desk = $(this);
    +				var index = desk.attr("index");
    +				desk.sortable({
    +					items:".appButton",
    +					connectWith :".dock_middle",					
    +					opacity :"0.6",
    +					start:function(event,ui){
    +									
    +					},
    +					stop: function(event, ui) {							
    +						var p = ui.item.parent();	
    +						if(p.hasClass("dock_middle"))ui.item.removeAttr("style");//钀藉湪渚ц竟鏍																		
    +						Deskpanel.switchCurrent(index);
    +						Deskpanel.refreshIcon();	
    +					}
    +				}).disableSelection();		
    +			});
    +			//娴忚鍣ㄦ敼鍙樺埛鏂
    +			$(window).resize(me.refresh);
    +	
    +		},			
    +		createDesktopsContainer:function(n){//妗岄潰澶栧眰瀹瑰櫒 n鍒涘缓鍑犲眰妗岄潰					
    +			if(n&&n!=0){
    +				for(var i =1;i<=n;i++){					
    +					me.desktopsContainer.append(me.addContainer(i))//濉厖瀹瑰櫒
    +				}
    +			}
    +		},
    +		addContainer:function(i){		//娣诲姞瀹瑰櫒
    +			var c = me.createDesktopContainer(i);	
    +			var a = me.createDesktopAppListener(i);
    +			c.append(a);	
    +			return c ;
    +		},	
    +		createDesktopContainer:function(n){		//瀹瑰櫒椤
    +		    return  $(Util.formatmodel(desktopContainer,{"index":n-1}));			
    +		},
    +		createDesktopAppListener:function(n){//瀹瑰櫒鐩戝惉椤
    +			return  $(Util.formatmodel(desktopAppListener,{"index":n-1}));
    +		},		
    +		addIcons:function(ops){//娣诲姞搴旂敤			
    +			for(var i in ops){
    +				var key = i.substring(i.length-1,i.length);				
    +				me.addIcon(ops[i],key);
    +			}		
    +		},	
    +		addIcon:function(icon,idx){//娣诲姞搴旂敤 idx 绗嚑妗岄潰
    +			if(icon){
    +				if($.isArray(icon)){//浼犲叆鏄暟缁
    +					$.each(icon,function(){						
    +						me.addIcon(this.valueOf(),idx);//娣诲姞搴旂敤绋嬪簭
    +					});
    +					return me ;
    +				}
    +				var Icon = typeof icon=='string'?appIcon_t1(icon):icon;//浼犲叆鐨勬槸ID杩樻槸鍥炬爣瀵硅薄
    +				me.Icon.push(Icon);
    +				me.box.find("div[customacceptdrop='"+parseInt(idx-1)+"']").append(Icon.box);
    +			}		
    +		},
    +		addCurrnet:function(n){//鏍规嵁index璁剧疆褰撳墠妗岄潰鏍峰紡
    +			me.desktopsContainer.find(".desktopContainer[index='"+n+"']").addClass("desktop_current");		
    +		},
    +		removeCurrent:function(n){//鏍规嵁index绉婚櫎褰撳墠妗岄潰鏍峰紡
    +			me.desktopsContainer.find(".desktopContainer[index='"+n+"']").removeClass("desktop_current");	
    +		},	
    +		switchCurrent:function(n){//鍒囨崲index妗岄潰鏍峰紡
    +			var dc = me.desktopsContainer;
    +			dc.find(".desktopContainer[index='"+n+"']")
    +			  .addClass("desktop_current")
    +			  .siblings().removeClass("desktop_current");
    +		},
    +		space:function(ops){//璁剧疆妗岄潰鍚勯潰鏉垮昂瀵镐綅缃			
    +			('top' in ops)&&(typeof ops.top=='string'?me.spaceTop+=ops.top:me.spaceTop=+ops.top||0);
    +			('left' in ops)&&(typeof ops.left=='string'?me.spaceLeft+=ops.top:me.spaceLeft=+ops.left||0);
    +			('right' in ops)&&(typeof ops.right=='string'?me.spaceRight+=ops.top:me.spaceRight=+ops.right||0);
    +			('bottom' in ops)&&(typeof ops.bottom=='string'?me.spaceBottom+=ops.top:me.spaceBottom=+ops.bottom||0);
    +			return me;			
    +		},
    +		refresh:function(firstLoad){//鍒锋柊妗岄潰
    +			var ww = $(window).width(),//娴忚鍣ㄥ
    +				wh = $(window).height();//娴忚鍣ㄩ珮				
    +			me.width = ww-me.spaceRight -me.spaceLeft;//瀹瑰櫒瀹
    +			me.height =wh-me.spaceTop - me.spaceBottom;//瀹瑰櫒楂 
    +			var desktopContainer = me.desktopsContainer.find(".desktopContainer");
    +			var appContainer = desktopContainer.find(".appListContainer");
    +			
    +			$(desktopContainer).each(function(i){//瀹瑰櫒瀹介珮
    +				$(this).css({
    +					left:me.width*i,
    +					height:me.height-me.spaceBottom
    +				});
    +			})
    +			
    +			$("#zoomWallpaperGrid,#zoomWallpaper").width(ww).height(wh);//鑳屾櫙鍥剧墖div
    +			
    +			var r = me.row = ~~(me.height/112);//琛屾暟
    +			
    +			me.desktopsContainer.css({//璁剧疆搴旂敤瀹瑰櫒鏍峰紡鍜屼綅缃
    +				left:me.spaceLeft,
    +				top:me.spaceTop,
    +				width:me.width,
    +				height:me.height		
    +			});
    +			
    +			appContainer.each(function(){
    +				$(this).css({
    +					width:me.width,
    +					height:me.height,
    +					"margin-left": 28,
    +					"margin-top": 46,
    +					display: "block"
    +				});	
    +			});
    +			
    +			me.refreshIcon(firstLoad);
    +			
    +		},
    +		refreshIcon:function(firstLoad){//鍒锋柊搴旂敤
    +			var r = ~~(me.height/112);
    +            var curIndex = 1;
    +            var iconCookieData = "";
    +            me.desktopsContainer.find(".appListContainer").each(function(){
    +                iconCookieData += "Icon" + curIndex + ":";
    +				var icon = $(this).children();
    +				for(var j= 0 ;j<icon.length;j++){
    +					var leftI=~~(j/r),
    +						topI=j%r;
    +					$(icon[j]).css({
    +						left:leftI*142,
    +						top:topI*112
    +					});
    +
    +                    var iconId = $(icon[j]).attr("id").replace("icon_app_", "");
    +                    iconId = iconId.substring(0, iconId.indexOf("_"));
    +                    iconCookieData += iconId + "@";
    +                }
    +                iconCookieData += "|";
    +                curIndex++;
    +			});
    +            if (!firstLoad) {
    +                $.cookie(iconCookieKey, iconCookieData, cookieParam);
    +                var iconCookieDataForSlider = "";
    +                $("#dockContainer").find(".dock_middle").each(function () {
    +                    var icon = $(this).children();
    +                    for (var j = 0; j < icon.length; j++) {
    +                        var iconId = $(icon[j]).attr("id").replace("icon_app_", "");
    +                        iconId = iconId.substring(0, iconId.indexOf("_"));
    +                        iconCookieDataForSlider += iconId + "@";
    +                    }
    +                });
    +                $.cookie(iconCookieKeyForSlider, iconCookieDataForSlider, cookieParam);
    +            }
    +		},
    +		moveIconTo:function(icon,idx2){//鐩爣浣嶇疆
    +			var ids=(Panel.getIdx(icon.box));
    +			if(idx>idx2){//寰鍓嶇Щ
    +				me.box.children(".appListContainer[index='1']").append(icon.box,idx2);
    +			}else if(idx<idx2){//寰鍚庣Щ
    +				me.box.children(".appListContainer[index='1']").append(icon.box,idx2+1);
    +			}
    +			me.Icon.splice(idx,1);
    +			me.Icon.splice(idx2,0,icon);
    +			me.refresh();
    +		
    +		},
    +		removeIcon:function(icon){
    +			var idx = (Panel.getIdx(icon.box));
    +			me.Icon.splice(idx,1);
    +			icon.box.remove();
    +			me.refresh();
    +		},
    +		getIdx:function(ex,ey){
    +			ex-=me.spaceLeft+me.spaceRight;
    +			ey-=me.spaceTop+me.spaceBottom;
    +			return (~~(ex/142))*me.row+(~~(ey/112));
    +		}
    +	};
    +	
    +	
    +}();
    +
    +//渚ц竟鏍
    +Sidebar=function(me){
    +	
    +	var tool_list = "<div class='dock_tool_list' id='dockToolList' >";
    +	var tool_item = "<div class='dock_tool_item'></div>";
    +	var tool_a ="<a title='{title}' cmd='{cmd}'	class='dock_tool_icon dock_tool_{key}' href='###'></a>";
    +	
    +	//瑁呰浇瀹瑰櫒绫
    +	var SideBox = $.Class({
    +		init :function(ops){
    +			this.create(ops.location);
    +		},
    +		create:function(location){
    +			this.box =$("<div id='"+location+"Bar'></div>");	
    +			Desktop.addPanel(this.box);	
    +		},
    +		addPanel:function(sidebar){			
    +			this.box.append(sidebar.pbox);
    +		}
    +	});
    +	return me ={
    +		 init : function(ops){
    +			
    +			
    +			me.create(ops.location);
    +			me.movePanel();
    +			me.addIcon(ops.Icon);
    +			me.addToolList();
    +			me.initDrag();
    +
    +		 },
    +		 create:function(location){//鍒涘缓
    +			//鍒涘缓涓婂乏鍙 渚ц竟鏍忓鍣
    +			me.leftPanel = SideBox({location:'left'});
    +			me.rightPanel = SideBox({location:'right'});
    +			me.topPanel = SideBox({location:'top'});
    +			
    +			me.box  = $('<div class="dock_middle"></div>');
    +			me.pbox = $('<div id="dockContainer" class="dock_container " style="z-index: 10;"> </div>');			
    +			//鍒涘缓鐖惰竟鏍忓鍣
    +			me[location+'Panel'].addPanel(me.pbox);
    +			me.location = location;
    +			me.Icon = [];		
    +			me.pbox.addClass("dock_pos_"+location);
    +			me.pbox.append(me.box);
    +			me.leftPanel.box.append(me.pbox);			
    +			Desktop.addPanel(me.leftPanel.box);
    +			Desktop.addPanel(me.rightPanel.box);
    +			Desktop.addPanel(me.topPanel.box);
    +			me.createStartTool();
    +			me.createPinyinTool();
    +			me.createSoundTool();
    +			me.createSettingTool();
    +			me.createThemeTool();
    +		 },
    +		 movePanel:function(){ //绉诲姩panel
    +			//鍒濆鍖栨嫋鎷芥晥鏋渂ox
    +			dockEffectBox.init();
    +			//缁戝畾榧犳爣鎸変笅浜嬩欢			
    +			me.pbox.bind("mousedown",function(e){
    +				if($(e.target).css("cursor")=='pointer')return 				
    +				$(document).bind({
    +					'mousemove':drag,
    +					'mouseup':drop
    +				});
    +				e.preventDefault();	
    +			    e.stopPropagation();
    +			});
    +			//鍒ゆ柇鏄惁鍦ㄦ嫋鍔
    +			var flag = 0,deskWidth,deskHeight,location;
    +			function drag(e){
    +				Panel.unSelecte();
    +				if(!flag){
    +					flag=1;
    +					deskWidth=Desktop.box.outerWidth();
    +					deskHeight=Desktop.box.outerHeight();
    +					dockEffectBox.show();
    +				}
    +				var ex = e.pageX;
    +				var ey = e.pageY;
    +				if(ey<deskHeight*.2){//涓				
    +					location='top';		
    +						
    +				}else if(ex<deskWidth*.5){//宸﹁竟				
    +					location='left';
    +				}else{				
    +					location='right';
    +				}
    +				
    +			}
    +			function drop(){
    +				$(document).unbind('mousemove',drag).unbind('mouseup',drop);
    +				flag=0;
    +				dockEffectBox.hide();
    +				me[location+'Panel'].addPanel(me);			
    +				me.location=location;					
    +				me.addStyle();				
    +				Deskpanel.refreshIcon();//閲嶆柊鎺掑竷妗岄潰鍥炬爣
    +			} 
    +			  
    +		 },
    +		 addToolList:function(){//娣诲姞宸ュ叿鏍
    +			  var docklist = $(tool_list);
    +			  var dockItem = $(tool_item);
    +			  var dockItem2 = $(tool_item);
    +			  var dockItem3 = $(tool_item);
    +			  dockItem.append(me.pinyin).append(me.sound);
    +			  dockItem2.append(me.settingtool).append(me.theme);
    +			  dockItem3.append(me.start);
    +			  docklist.append(dockItem).append(dockItem2).append(dockItem3);
    +			  me.box.append(docklist);		
    +		 },		 
    +		 createStartTool:function(){//寮濮嬭缃
    +			me.start = $("<a title='鐐瑰嚮杩欓噷寮濮' class='dock_tool_icon dock_tool_start'	href='javascript:void(0);'></a>");
    +            me.start.powerFloat({
    +                 eventType: "click",
    +                 offsets:{x:getX,y:-100},
    +                 target: $("#startMenuContainer")
    +            });
    +
    +             function getX(){
    +                 var p =me.pbox.parent();
    +                 var pid = p.attr("id");
    +                 var key = pid.substring(0,pid.length-3);
    +                 if(key=="left"){
    +                     return -60;
    +                 }else if(key=="top"){
    +                     return 0;
    +                 }else{
    +                    return 60;
    +                 }
    +             }
    +		 },
    +		 createPinyinTool :function(){//杈撳叆娉
    +			me.pinyin =$(Util.formatmodel(tool_a,{
    +				"cmd":"Pinyin",
    +				"title":"杈撳叆娉",
    +				"key":"pinyin"
    +			}));
    +		 }, 
    +		 createSoundTool:function(){//澹伴煶璁剧疆
    +			var sound = me.sound= $(Util.formatmodel(tool_a,{
    +				"cmd":"Sound",
    +				"title":"闈欓煶",
    +				"key":"sound"
    +			}));
    +			sound.toggle(function(){
    +				$(this).addClass("dock_tool_sound_mute").attr("title","鍙栨秷闈欓煶");	
    +			
    +			},function(){
    +				$(this).removeClass("dock_tool_sound_mute").attr("titile","闈欓煶");
    +			});
    +		 },
    +		 createSettingTool:function(){//绯荤粺璁剧疆
    +			me.settingtool = $(Util.formatmodel(tool_a,{
    +				"cmd":"Setting",
    +				"title":"绯荤粺璁剧疆",
    +				"key":"setting"
    +			}));
    +		 },
    +		 createThemeTool:function(){//涓婚璁剧疆				
    +			 var theme = me.theme= $(Util.formatmodel(tool_a,{
    +				"cmd":"Theme",
    +				"title":"涓婚璁剧疆",
    +				"key":"theme"
    +			  }));
    +			  me.bindTheme();
    +		 },	 
    +		 bindTheme:function(){
    +			 var themsSetting = $("#themeSetting_wrap");			 
    +			 me.theme.click(function(){
    +					Windows.openSys({
    +						id :'themSetting',
    +						title :'璁剧疆涓婚',
    +						width :650,
    +						height:500,
    +						content :document.getElementById("themeSetting_wrap")
    +					});
    +			 });
    +			 $("a",themsSetting).live("click",function(){
    +					var a  = $(this);
    +					var themeid = a.attr("themeid");
    +					var src = themeid.substring(themeid.indexOf("_")+1,themeid.length);
    +					var h = $(window).height();
    +					var w = $(window).width();
    +					$("#zoomWallpaper").attr("src","plug-in/sliding/images/bg/"+src+".jpg").width(w).height(h);
    +					$.cookie("myskin","plug-in/sliding/images/bg/"+src+".jpg",cookieParam);
    +					$("#zoomWallpaperGrid").width(w).height(h);
    +					$("a",themsSetting).removeClass("themeSetting_selected");
    +					a.addClass("themeSetting_selected");
    +			 });
    +		 
    +		 }, 
    +		 addIcon:function(icon,idx){
    +			if(icon){
    +				if($.isArray(icon)){//浼犲叆鐨勬槸鏁扮粍
    +					$.each(icon,function(){
    +						me.addIcon(this.valueOf());
    +					});
    +					return me;
    +				}
    +				if(me.Icon.length==6){
    +					var last=me.Icon[5];////鏇挎崲鎺夊叿浣撶殑涓绾ц彍鍗曟暟閲
    +					me.Icon.length=6;
    +					$(last.box).remove();
    +					return;
    +				}
    +				
    +				var Icon=typeof icon=='string'?appIcon_t2(icon):icon;//浼犲叆鐨勬槸绋嬪簭鐨刦id杩樻槸Icon瀵硅薄
    +				if(idx!=undefined){
    +					me.Icon.splice(idx,0,Icon);
    +					me.box.append(Icon.box,idx);				
    +				}else{
    +					me.Icon.push(Icon);
    +					me.box.append(Icon.box);
    +				}
    +			
    +			
    +			}
    +		 },
    +		 removeIcon:function(icon){
    +			var idx = (Panel.getIdx(icon.box));
    +			me.Icon.splice(idx,1);
    +			$(icon.box).remove();		 
    +		 },
    +		 getIdx:function(ex,ey){//鑾峰緱浣嶇疆		
    +			var off =me.pbox.offset();
    +			switch(me.location){
    +				case 'top':
    +					return~~((ex-off.left)/142);
    +				case 'left':
    +				case 'right':
    +					return~~((ey-off.top)/112);
    +			}
    +		 },
    +		 addStyle:function(){//娣诲姞鎷栨嫿鍚庣殑鏍峰紡
    +			me.pbox.removeClass().addClass("dock_container dock_pos_"+me.location);
    +			switch(me.location){
    +				case "top":					
    +					me.topPanel.box.css({"width":"100%","height":"73px"}).show();
    +					me.leftPanel.box.css({"width":"0","height":"0"}).hide();
    +					me.rightPanel.box.css({"width":"0%","height":"0"}).hide();
    +					Deskpanel.box.css({"left":0,"right": 0});
    +					Deskpanel.desktopsContainer.css("top",73);
    +					break;
    +				case "left":
    +					me.leftPanel.box.css({"width": "73px","height":"100%"}).show();
    +					me.topPanel.box.css({"width":"0","height":"0"}).hide();					
    +					me.rightPanel.box.css({"width":"0%","height":"0"}).hide();
    +					Deskpanel.box.css({"left": "73px","right": "0px"});
    +					Deskpanel.desktopsContainer.css("left",73);
    +					break;					
    +				case "right":
    +					me.rightPanel.box.css({"width": "73px","height":"100%"}).show();	
    +					me.leftPanel.box.css({"width": "0","height":"0"}).hide();
    +					me.topPanel.box.css({"width":"0","height":"0"}).hide();	
    +					Deskpanel.box.css({"left":0,"right":73});
    +					Deskpanel.desktopsContainer.css("top",0);
    +				break;
    +			}
    +		 
    +		 },
    +		 initDrag:function(){//缁戝畾鍏冪礌鎷栨嫿
    +			var  desk =Deskpanel.desktopsContainer.find(".appListContainer");
    +			
    +			me.box.sortable({
    +				connectWith: desk,
    +				items:".appButton",
    +				opacity :"0.6",	
    +				scroll :true,
    +				start:function(event,ui){
    +					
    +				},
    +				stop:function(event,ui){
    +					
    +					var item = ui.item;
    +					var p = item.parent();
    +					if(p.hasClass("appListContainer")){
    +						item.css("position","absolute");
    +					}
    +					Deskpanel.refreshIcon();
    +					
    +				}
    +				
    +			}).disableSelection();
    +		 }
    +		 	
    +	}
    +
    +}();
    +
    +
    +//瀵艰埅鏍
    +Navbar =function(me){
    +	//浼樺厛鍒锋柊鍑哄悗鍙扮殑鏁版嵁浠ヤ究鍏朵粬鏂规硶涓娇鐢ㄦ浛鎹
    +//	dataFlush();
    +	var _box = "<div  id='navbar' class='no_sysbtn' ></div>";
    +	var _innerBox = "<div class='indicator_container nav_current_{index}'	id='indicatorContainer'></div>";
    +	var _userbox = "<div class='indicator indicator_header' id='navbarHeaderImg' cmd='user' title='{title}'><img src='{url}' alt='{title}' class='indicator_header_img' ></div>";
    +	var _abox  = "<a class='indicator indicator_{num}' href='###' cmd='switch' index='{index}'	title='{name}'><span class='indicator_icon_bg'></span><span class='indicatorhover indicator_icon_{num}'>{num}</span></a>";
    +	var _abox2 = "<a class='indicator indicator_{key}' href='###' cmd='{key}' title='{title}'></a>";
    +	var num =totalnum+1 ,////鏇挎崲鎺変竴绾ц彍鍗曠殑鎬绘暟閲
    +		defaultnum=1,
    +		title = "璇风櫥褰",
    +		usericon = "plug-in/sliding/images/jeecg.png";
    +	
    +	return me = {
    +		init :function(){
    +			me.create();			
    +			me.bindEvent();//缁戝畾瀵艰埅鎸夐挳鍗曞嚮浜嬩欢  
    +			me.setPosition();
    +		},
    +		bindEvent:function(){
    +		   me.innerbox.find("a[cmd='switch']").click(function(){
    +				var _this = $(this);
    +				var cmd = _this.attr("cmd[switch]");
    +				var classname = $.trim(me.innerbox.attr("class"));
    +				var currentindex = parseInt(classname.substring(classname.length-1));	
    +				var index = parseInt(_this.attr("index"));
    +				me.bindSwitchDesktopAnimate(index,currentindex);
    +				me.innerbox.removeClass().addClass("indicator_container nav_current_"+parseInt(index+1));
    +		   });
    +		   me.box.draggable();
    +		},
    +		bindSwitchDesktopAnimate:function(t,c){//鍒囨崲鍔ㄧ敾浜嬩欢 t 鐩爣妗岄潰  c褰撳墠妗岄潰
    +			var left = 0;
    +			var c = parseInt(c-1);			
    +			if(t<c){//寰宸︾Щ鍔
    +				left = -2000;
    +			}else{//寰鍙崇Щ鍔
    +				left = 2000;
    +			}			
    +			var cdesk=Deskpanel.desktopsContainer.find(".desktopContainer[index="+c+"]");
    +				cdesk.removeClass("desktop_current");
    +				cdesk.stop().animate({
    +					left: left
    +				}, 'normal', function(){
    +							
    +				});	
    +			var idesk =Deskpanel.desktopsContainer.find(".desktopContainer[index="+t+"]");
    +			idesk.removeClass("desktop_current").addClass("desktop_current");
    +			idesk.stop().animate({
    +					left:0
    +				 }, 'normal', function(){
    +					
    +			});
    +		},
    +		create:function(){//鍒涘缓瀵艰埅
    +			me.box = $(_box);
    +			me.box.append("<div class='indicator_wrapper'></div>");
    +			me.box.find(".indicator_wrapper").append(me.createInnerbox());
    +			Desktop.addPanel(me.box);			
    +		},
    +		createInnerbox:function(){//鍒涘缓鍐呴儴瀹瑰櫒
    +			var con = me.innerbox =   $(Util.formatmodel(_innerBox,{
    +				"index":defaultnum
    +			}));
    +			con.append(me.createUser());
    +			me.createIndicator();
    +			con.append(me.createSearch());
    +			con.append(me.createManage());
    +			return con;
    +		},
    +		createUser:function(){//鍒涘缓鐢ㄦ埛澶村儚
    +			var user = me.userbox =  $(Util.formatmodel(_userbox,{
    +				"url":usericon,
    +				"title":title	
    +			}));
    +			user.click(function(){
    +				alert("It's  xiaofan ");			
    +			});
    +			
    +			return user
    +		},
    +		createIndicator:function(){//鍒涘缓瀵艰埅椤
    +			//澧炲姞鏁版嵁鍔ㄦ佸鐞嗙殑杩囩▼
    +			////杩欓噷浣跨敤menuString鏉ユ浛鎹㈡帀姣忎釜涓绾т簩绾ц彍鍗曠殑鏁版嵁
    +			
    +//			dataFlush();
    +			var i = 0;
    +			$.each(menujson,function(n,value){
    +				var obj = Util.formatmodel(_abox,{
    +					"num":i+1,
    +					"id":value.id,
    +					"index":i,
    +					"name":value.name
    +				});
    +				i++;
    +			    me.innerbox.append(obj);
    +			})
    +//			for(var i =0;i<5;i++){
    +////				alert(ss[i].id);
    +//				var obj = Util.formatmodel(_abox,{
    +//					"num":i+1,
    +//					"index":i
    +//				});
    +//			    me.innerbox.append(obj);
    +//			}
    +		},
    +		createSearch : function(){//鎼滅储		
    +			var search = me.search  = $(Util.formatmodel(_abox2,{
    +					"key":"search",
    +					"title":"鎼滅储"
    +			}));
    +			//鍒涘缓鎼滅储鏍
    +			var pagelet_search_bar = $("<div class='pagelet_search_bar' style='display: none; '></div>");
    +			var pageletSearchInput = $("<input>",{
    +				"class" : "pagelet_search_input",
    +				value  : "鎼滅储鍔熻兘妯″潡鍜屽簲鐢..."
    +			});
    +			var pageletSearchButton = $("<input>",{
    +				id : "pageletSearchButton",
    +				"class" : "pagelet_search_button",
    +				title :"鎼滅储..."
    +			});			
    +			var pagelet_search_suggest =$("<div class='pagelet_search_suggest' id='pagelet_search_suggest'style='display: none;' ></div>");
    +			var sb_resultbox = $("<ul id='sb_resultBox'  style='display: block;'></ul>");
    +			var sb_app_item_1 =$("<div idx='-1' class='sb_resultList fsb_resultList sb_page'><a href='#'><span class='sb_pageTxt'><span id='sb_resultBox_key' class='sb_resultBox_key'>s</span>-鍦ㄢ滅櫨搴︹濇悳绱...</span></a>  </div>");		
    +			var sb_app_item_2 = $("<div idx='-2' class='sb_resultList fsb_resultList sb_app'><a href='#'><span class='sb_appTxt'><span id='sb_resultBox_key'  class='sb_resultBox_key'>s</span>-鍘荤郴缁熷簲鐢ㄦ悳鎼...</span></a></div>");
    +			pagelet_search_suggest.append(sb_resultbox).append(sb_app_item_1).append(sb_app_item_2);			
    +			pagelet_search_bar.append(pageletSearchInput).append(pageletSearchButton);	
    +			
    +			Body.addPanel(pagelet_search_bar);
    +			Body.addPanel(pagelet_search_suggest);
    +			
    +			search.powerFloat({
    +				width: pagelet_search_bar.width(),
    +				eventType:"click",
    +				offsets: {
    +					x: 5,
    +					y: 20
    +				},
    +				position:"3-1",
    +				target: pagelet_search_bar, 	 		
    +				showCall: function(){
    +					//璁剧疆suggest缁撴灉妗嗕綅缃
    +					var _offset = pagelet_search_bar.offset();
    +					pagelet_search_suggest.offset({top:_offset.top+32,left:_offset.left});
    +				
    +				}
    +			});
    +			
    +			pageletSearchInput.focus(function(){
    +				$(this).val("");				
    +			}).blur(function(){
    +				toggleSearchSuggest();	
    +				var searchhtnl=$(this).val();
    +				$(this).val("鎼滅储鍔熻兘妯″潡鍜屽簲鐢...");
    +				
    +				$(".fsb_resultList").show();
    +			}).keyup(function(){
    +				var _this = $(this);
    +				var _val = _this.val();
    +				$(".sb_resultBox_key").html(_val);
    +				if(_val=="o"){		
    +					$("#sb_resultBox").append("<li class='sb_resultList' idx='2232'><a href='#' title='owlhr'><div class='listInner'>鏂板ゥ灏</div></a></li>")
    +					 .show();
    +					 pagelet_search_suggest.show();		
    +				}
    +				
    +				if(_val==""){
    +					pagelet_search_suggest.hide();	
    +				}
    +				
    +			});
    +			var toggleSearchSuggest =function(){
    +				var _val = pageletSearchInput.val();				
    +				if(_val==""){
    +					pagelet_search_suggest.hide();			
    +				}else{
    +					pagelet_search_suggest.show()
    +				}	
    +			}
    +			
    +			
    +			return search ;
    +		},
    +		createManage :function(){//鍏ㄥ眬瑙嗗浘
    +			var manage = me.manage = $(Util.formatmodel(_abox2,{
    +					"key":"manage",
    +					"title":"鍏ㄥ眬瑙嗗浘"
    +			}));			
    +			manage.click(function(){
    +				//鏄剧ず鍏ㄥ眬妗岄潰 鍏抽棴姝e父妗岄潰
    +				if(appManagerPanel){
    +					appManagerPanel.show();				
    +					appManagerPanel.showItemsTurn();
    +					appManagerPanel.resize();
    +					Desktop.hide();				
    +					//璁剧疆鍒楄〃鍖虹殑楂樺害 
    +					
    +				}
    +			});
    +			
    +			
    +			
    +			return manage;
    +		},
    +		setPosition :function(){//璁剧疆浣嶇疆
    +			var ww = $(window).width();
    +			var mw = me.box.width();
    +			me.box.css("left",parseInt(ww/2)-parseInt(mw/2));
    +		}
    +		
    +		
    +		
    +	}
    +	
    +
    +}();
    +//鍏ㄥ眬搴旂敤绠$悊
    +appManagerPanel = function(me){
    +	
    +	var appManagerPanel ="<div id='appManagerPanel' class='appManagerPanel' style='display: none; '></div>";//鍒涘缓鍏ㄥ眬妗岄潰瀹瑰櫒
    +	var aMg_Close="<a class='aMg_close' href='###'></a>";//鍏抽棴鎸夐挳			
    +	var aMg_dock_container ="<div class='aMg_dock_container' index='{totalnum}' customacceptdrop='1'></div>";	
    +	var aMg_line_x = "<div class='aMg_line_x'></div>";//x杞寸嚎
    +	var aMg_line_y = "<div class='aMg_line_y'></div>";//y杞寸嚎
    +	var aMg_App_container = "<div class='aMg_folder_container'></div>";//搴旂敤瀹瑰櫒
    +	var folderitem ="<div class='folderItem'><div class='folder_bg folder_bg{key}'></div><div class='folderOuter' index='{index}' customacceptdrop='{key}'></div></div>";
    +//	var folderinner ="<div class='folderInner' style='height: 100%; overflow-x: hidden; overflow-y: hidden; ' index='{index}' customacceptdrop='{key}'></div>";
    +	var folderinner ="<div class='folderInner' style='height: 90%; overflow-x: hidden; overflow-y: hidden; ' index='{index}' customacceptdrop='{key}'></div>";
    +	var scrollBar ="<div class='scrollBar' style='margin-top: 0px; height: 0px; display: none;' _olddisplay='block'></div>";
    +
    +	return me = {
    +		init : function(){
    +			me.create();			
    +			me.bindEvent();
    +			me.resize();
    +		},
    +		create:function(){
    +			me.box = $(appManagerPanel);
    +			me.aMg_close = $(aMg_Close);
    +			me.box.append(me.aMg_close)
    +				.append(me.cSidebarApp())
    +				.append(aMg_line_x)
    +				.append(me.cDeskApp());
    +			Body.addPanel(me.box);
    +		},		
    +		cSidebarApp:function(){//鍒涘缓渚ц竟鏍忕晫闈
    +			me.aMg_dock_container = $(aMg_dock_container);
    +			me.loadSidebarData();
    +			return me.aMg_dock_container;
    +		},	
    +		loadSidebarData:function(){//渚ц竟鏍忓簲鐢ㄥ厠闅嗗埌椤堕儴
    +			var sItems = Sidebar.box.find(".appButton").clone().appendTo(me.aMg_dock_container);
    +		},
    +		cDeskApp:function(){//鍒涘缓鍏ㄥ眬鐣岄潰
    +			me.aMg_App_container = $(aMg_App_container);
    +			me.loadDeskData();
    +			return me.aMg_App_container;
    +		},
    +		loadDeskData:function(){//鍔犺浇褰撳墠妗岄潰搴旂敤鏁版嵁 鍒板叏灞鐣岄潰		
    +			Deskpanel.desktopsContainer.find(".appListContainer").each(function(){
    +				 var _this = $(this);
    +				 var _index = parseInt(_this.attr("index"));
    +				 var item = $(Util.formatmodel(folderitem,{
    +						"index":_index,
    +						"key":_index+1
    +				 }));
    +				 var inner  = $(Util.formatmodel(folderinner,{
    +						"index":_index,
    +						"key":_index+1
    +				 }))
    +				 var outer =item.find(".folderOuter");
    +				 _this.children().each(function(){								
    +					inner.append(appIcon_amg1($(this).attr("fid")).box);
    +				 });
    +				 outer.append(inner);
    +                 outer.append(scrollBar);
    +				 if(_index!=0){
    +					outer.after(aMg_line_y);//绾佃酱绾
    +				 }
    +
    +				 me.aMg_App_container.append(item);
    +			});
    +		},
    +		bindEvent:function(){
    +			var  folderitems =$(".folderItem",me.box);
    +			me.aMg_close.click(function(){//缁戝畾鍏抽棴
    +				me.hide();
    +				folderitems.removeClass("folderItem_turn");
    +				Desktop.show();
    +			});			
    +			
    +			var item = folderitems.find(".folderInner");//缁戝畾鎷栨嫿
    +			item.sortable({
    +					items:".appButton",
    +					connectWith :[item,me.aMg_dock_container],					
    +					opacity :"0.6",
    +					stop: function(event, ui) {
    +						var item = ui.item;
    +						var p = item.parent();
    +						if(item.parent().hasClass("aMg_dock_container")){
    +							item.removeClass("amg_folder_appbutton");
    +						}
    +					}
    +			}).disableSelection();		
    +			
    +			
    +			me.aMg_dock_container.sortable({
    +					items:".appButton",
    +					connectWith :".folderInner",					
    +					opacity :"0.6",
    +					stop: function(event, ui) {
    +						item = ui.item;
    +						var p = item.parent();
    +						if(p.hasClass("folderInner")){							
    +							item.addClass("amg_folder_appbutton");
    +						}
    +					}
    +			}).disableSelection();		
    +			
    +		},
    +		showItemsTurn:function(){			
    +			$(".folderItem",me.box).show().addClass("folderItem_turn");
    +		},
    +		show:function(){
    +			me.box.show();
    +		},
    +		hide:function(){
    +			me.box.hide();
    +		},
    +		resize:function(){
    +			var h = $(window).height() -60	;		
    +			me.aMg_App_container.height(h);
    +		}
    +	
    +	};
    +
    +}();
    +
    +
    +
    +//鎷栨嫿鏁堟灉瀹瑰櫒
    +dockEffectBox = function(me){
    +	
    +	var _tbox ="<div id='docktop' class='dock_drap_effect dock_drap_effect_top ' style='display: none;' _olddisplay='block'></div>";
    +	var _lbox ="<div id='dockleft' class='dock_drap_effect dock_drap_effect_left' style='display: none;'></div>";
    +	var _rbox ="<div id='dockright' class='dock_drap_effect dock_drap_effect_right' style='display: none;'></div>";
    +	var	_proxybox ="<div class='dock_drap_proxy' style='display: none; left: -79px; top: -260px;'></div>";
    +	var	_maskbox="<div id='dockmask' class='dock_drap_mask' style='display: none;'>"+
    +					"<div class='dock_drop_region_top' cmd='region'name='top'></div>"+
    +					"<div class='dock_drop_region_left' cmd='region' name='left'></div>"+
    +					"<div class='dock_drop_region_right' cmd='region' name='right'></div>"+
    +				"</div>";
    +	return me = {		 
    +		 init : function(){
    +			me.create();
    +		 },
    +		 create :function(){		
    +		 	me.tbox = $(_tbox);
    +			me.lbox = $(_lbox);
    +			me.rbox = $(_rbox);
    +			me.proxybox = $(_proxybox);
    +			me.maskbox = $(_maskbox);
    +			me.addDesktop();
    +		 },
    +		 addDesktop :function(){
    +			Desktop.addPanel(me.tbox);
    +			Desktop.addPanel(me.lbox);
    +			Desktop.addPanel(me.rbox);
    +			Desktop.addPanel(me.proxybox);
    +			Desktop.addPanel(me.maskbox);
    +		 },
    +		 show:function(){
    +			me.tbox.show();
    +			me.lbox.show();
    +			me.rbox.show();
    +			me.maskbox.show();
    +		 },
    +		 hide:function(){
    +			me.tbox.hide();
    +			me.lbox.hide();
    +			me.rbox.hide();
    +			me.maskbox.hide();
    +		 }
    +	
    +	};
    +}();
    +
    +//搴曢儴鏍忓鍣ㄧ被
    +BottomBar = function(me){
    +	
    +	var _box = "<div id='bottomBar' class='bottomBar' style='z-index: 12;'></div>";	
    +	var _NextBox = "<div id='taskNextBox' class='taskNextBox' _olddisplay='' style='display: none;'><a id='taskNext' class='taskNext' hidefocus='true' href='#'></a></div>";
    +	var _PreBox = "<div id='taskPreBox' class='taskPreBox' _olddisplay='' style='display: none;'><a id='taskPre' class='taskPre' hidefocus='true' href='#'></a></div>";
    +	var _taskContainner = "<div id='taskContainer' class='taskContainer' style=''></div>";
    +	var bottonbarbg = "<div class='bottomBarBg'></div>";
    +	var bottomBarBgTask = "<div class='bottomBarBgTask'></div>";
    +	
    +	return me  = {
    +		init:function(){
    +			me.create();
    +			Desktop.addPanel(me.box);
    +			Desktop.addPanel(bottonbarbg);
    +			Desktop.addPanel(bottomBarBgTask);			
    +		},
    +		create:function(){
    +			var box =me.box = $(_box);
    +			me.innerbox = $("<div id='taskContainerInner' class='taskContainerInner' style=''></div>");
    +			me.taskContainner = $(_taskContainner);
    +			me.taskContainner.append(me.innerbox);
    +			box.append(_NextBox);
    +			box.append(me.taskContainner);
    +			box.append(_PreBox);			
    +		},
    +		addItem:function(item){//鍍忓簳閮ㄤ换鍔℃爮娣诲姞浠诲姟椤
    +			me.innerbox.append(item);
    +			var len = me.innerbox.children().length;
    +			var id = item.attr("id");
    +			var w = item.width()*len+20;
    +			me.taskContainner.width(w);
    +			me.innerbox.css({"margin-right": 0,"width":(w)});	
    +			me.setCurrent(id);
    +		},
    +		getItem:function(id){//鏍规嵁ID鏌ヨ搴曢儴浠诲姟鏍
    +			return me.innerbox.find("a[tid='"+id+"']");
    +		},
    +		getItemNum:function(){//寰楀埌褰撳墠浠诲姟鏁
    +			return me.innerbox.children().size();
    +		},
    +		setCurrent:function(id){			
    +			me.addCurrent(id);
    +			me.removeItemSibling(id);		
    +		},		
    +		addCurrent:function(id){//璁剧疆褰撳墠浠诲姟鏍忔牱寮			
    +			me.innerbox
    +			.find("#"+id)
    +			.addClass("taskCurrent");				
    +		},
    +		removeItemSibling:function(id){//绉婚櫎褰撳墠浠诲姟鍚岀被鏍峰紡
    +			me.innerbox
    +			.find("#"+id)
    +			.siblings()
    +			.removeClass("taskCurrent");		
    +		},
    +		getALLItemID :function(){//寰楀埌褰撳墠浠诲姟鏍忔墍鏈変换鍔D
    +			var items = me.innerbox.children();
    +			var idArray =[];
    +			items.each(function(){
    +				var id =$(this).attr("id");
    +				id  =id.substring(id.lastIndexOf("_")+1,id.length);			
    +				idArray.push(id);
    +			})
    +			return idArray ; 
    +		}
    +		
    +	}
    +
    +}();
    +
    +//浠诲姟绫
    +Task = $.Class({
    +	init :function(op){
    +		this.create(op);
    +		this.rightMenu();
    +	},
    +	create:function(op)	{
    +		var task =$("<div>", {
    +		  "class": "taskGroup taskGroupAnaWidth",
    +		  id: "taskGroup_"+op.id+"_"+op.id
    +		});
    +		var taskItemIcon = $("<div>",{
    +			"class":"taskItemIcon"
    +		});
    +		$("<img src='plug-in/sliding/icon/"+op.icon+"'/><div class='taskItemIconState'></div>").appendTo(taskItemIcon);
    +	
    +		var taskItemTxt  = $("<div>",{
    +			"class":"taskItemTxt",
    +			text : op.title
    +		});
    +		var taskItemBox  = $("<div>",{
    +			"class":"taskItemBox",
    +		});			
    +		var taskA =$("<a>",{
    +			"class":"taskItem fistTaskItem",
    +			"href" :"#",
    +			id  : "taskItem_"+op.id,
    +			"title" :op.title,
    +			"tid" :op.id,
    +			"appid":op.id+"_"+op.id
    +		});
    +		taskA.append(taskItemIcon).append(taskItemTxt);
    +		taskItemBox.append(taskA);
    +		task.append(taskItemBox);
    +		this.box = task ;
    +	},
    +	rightMenu:function(){
    +		var taskmenu = [
    +			[{
    +				text:"鏈澶у寲",
    +				func:function(){
    +                    var id = $(this).attr("id");
    +                    wid  =id.substring(id.lastIndexOf("_")+1,id.length);
    +                    $.dialog.list[wid].show().max();
    +				}
    +			},
    +			 {
    +				text:"鏈灏忓寲",
    +				func:function(){
    +				
    +				}
    +			 }	
    +			],
    +			[{
    +				text:"鍏抽棴",
    +				func:function(){
    +					var id = $(this).attr("id");
    +					wid  =id.substring(id.lastIndexOf("_")+1,id.length);
    +					$.dialog.list[wid].close();
    +					$("#"+id).remove();
    +				}
    +			}]
    +		
    +		]
    +		this.box.smartMenu(taskmenu, {
    +			name: "taskmenu"  ,
    +			offsetX :-100,
    +			offsetY :-100
    +		});
    +	}
    +});
    +
    +//绐椾綋绫 闆嗘垚artDialog
    +Windows = function(me){	
    +
    +	return me = {
    +		
    +		showWindow : function(id){//art寮瑰嚭 
    +			
    +			var array= $.dialog.list;
    +			var taskIds = BottomBar.getALLItemID();
    +			var taskLen = taskIds.length;
    +			var api=array[id];
    +            function changeLhgDialogFocus() {
    +                var foucsApi = null;
    +                for(var obj in $.dialog.list){
    +                    obj = $.dialog.list[obj];
    +                    var wrap = obj.DOM.wrap;
    +                    var $wrap = $(wrap);
    +                    if($wrap.css("visibility") == 'visible'){
    +                        if(foucsApi == null){
    +                            foucsApi = obj
    +                        }else{
    +                            foucsApi = $wrap[0].style.zIndex > foucsApi.DOM.wrap[0].style.zIndex
    +                                ?obj:foucsApi;
    +                        }
    +
    +                    }
    +                }
    +                if(foucsApi){
    +                    $.dialog.focus.DOM.border.removeClass('ui_state_focus');
    +                    $.dialog.focus = foucsApi;
    +                    foucsApi.DOM.border.addClass('ui_state_focus');
    +                }
    +
    +            }
    +
    +			var wrap = api.DOM.wrap;
    +			var $wrap = $(wrap);
    +
    +            if(taskLen >1){//鍒ゆ柇浠诲姟涓暟 鏄剧ず鍒囨崲鍜岀劍鐐瑰垏鎹
    +				if($wrap.css("visibility") == 'hidden'){
    +					 api.show().zindex();
    +				}else{
    +					if(!api.DOM.border.hasClass('ui_state_focus')){
    +						api.zindex();
    +					}else{
    +						api.hide();
    +                        changeLhgDialogFocus();
    +					} 
    +				}
    +				
    +			}else{
    +				if($wrap.css("visibility") == 'visible'){
    +					api.hide();
    +				}else{
    +					api.show();
    +				}
    +				
    +			}
    +		},
    +		hideWindow :function(id){//闅愯棌
    +            $.dialog.list[id].hide();
    +		},
    +		closeMinTask:function(id){//鍏抽棴浠诲姟
    +			$("#taskGroup_"+id+"_"+id).remove();
    +		},
    +		closeAllWindow:function(){//鍏抽棴鎵鏈夌獥浣
    +			var list = $.dialog.list;
    +			for (var i in list) {
    +				list[i].close();
    +			};
    +		},	
    +		openSys :function(op){//鎵撳紑绯荤粺绐椾綋
    +            $.dialog({
    +				id :op.id,
    +				title :op.title,
    +				width :op.width,
    +				height:op.height,
    +				max:false,
    +				min:false,
    +				content :op.content
    +			});
    +			
    +		},
    +		openApp:function(id,title,url,icon,width,height){//鎵撳紑搴旂敤绐椾綋
    +			var taskInner =BottomBar.innerbox;
    +			var taskItem = BottomBar.getItem(id);
    +			if(taskItem.length==1){
    +				return ;
    +			}else{
    +				var len = BottomBar.getItemNum();// 浠诲姟鍥炬爣闆嗗悎 澶т簬7 涓嶈娣诲姞
    +				if(len>7&&len!=0){	   
    +					return false;
    +				}	
    +				var task = Task({//鍒涘缓鏈灏忓寲浠诲姟鍥炬爣
    +					"id":id,
    +					"title":title,
    +					"icon":icon						
    +				});
    +				BottomBar.addItem(task.box);	
    +				task.box.click(function(){	   				
    +					me.showWindow(id);	  
    +					BottomBar.setCurrent(task.box.attr("id"));
    +				});
    +                $.dialog({
    +                    id:id,
    +                    lock : false,
    +                    zIndex:1000+getDialogLength(),
    +                    width:width,
    +                    height:height,
    +                    title:title,
    +                    opacity : 0.3,
    +                    min:false,
    +                    content:'url:'+url,
    +                    close:function(){
    +                        me.closeMinTask(id);
    +                    }
    +                }).zindex();
    +
    +				/*art.dialog.open(url,*//** 寮瑰嚭ART绐椾綋*//*
    +					{
    +						"id" :id,
    +						title: title,
    +						width:width,
    +						height:height,
    +						close:function(){
    +							me.closeMinTask(id);
    +						}
    +					}
    +                );*/
    +			}
    +		
    +		}
    +	
    +	
    +	}
    +
    +}();
    +
    +
    +function getDialogLength(){
    +    var length = 0;
    +    for( var i in $.dialog.list ){
    +        length++;
    +    }
    +    return length;
    +}
    +
    +//鍥炬爣鍩虹被 
    +appIcon_amg= $.Class({		
    +	create:function(t)	{
    +		this.box = $("<div  type='"+t+"'  class='appButton amg_folder_appbutton' ></div>");
    +	}
    +});
    +
    +//鍥炬爣绫籺0
    +appIcon_t0 = $.Class({
    +	create :function(t){
    +		this.box =  $("<div type='"+t+"'  class='appButton'></div>");
    +		this.setRightMenu();
    +	},	
    +	setRightMenu:function(){	
    +	}
    +});
    +
    +//鍏ㄥ眬搴旂敤鍥炬爣
    +appIcon_amg1 = appIcon_amg.extend({
    +	init : function(fid){	
    +		this.fid = fid;
    +		//鏇挎崲data.js鏁版嵁鈥斺旇繖閲岀殑鏂规硶璨屼技娌℃湁鐢ㄥ埌
    +		this.app = datajson.app[fid];
    +//		this.app = DATA.app[fid];
    +		this.tx ="app";	
    +		this.create();
    +		this.bindEvent();
    +	},		
    +	create:function(){	
    +		this._super(1);			
    +		this.box.attr({
    +			id:"icon_app_"+this.app.appid+"_"+this.app.asc,
    +			appid:this.app.appid,
    +			fileid : this.app.appid,
    +			title:this.app.name,
    +            url: this.app.url,
    +			uid :"app_"+this.app.appid
    +		});
    +		
    +		var appIcon =$("<div>",{
    +			  id : "icon_app_"+this.app.appid+"_"+this.app.asc+"_icon_div",
    +			  "class" : "appButton_appIcon"
    +		});
    +		appIcon.append($("<img>",{
    +			alt:this.app.name ,
    +//			src:'plug-in/sliding/icon/'+this.app.icon,
    +			src:this.app.icon,
    +            /*update-end--Author:zhangguoming  Date:20140509 for锛氫簯妗岄潰鍥炬爣绠$悊*/
    +			"class":"appButton_appIconImg",
    +			id:'icon_app_'+this.app.appid+'_'+this.app.asc+'_img'
    +		
    +		}));			
    +		var nameDiv = $("<div class='appButton_appName'></div>");
    +		var name_inner = $("<div>",{
    +			"class":'appButton_appName_inner',
    +			id:'icon_app_'+this.app.appid+'_'+this.app.asc+'_name',
    +			text:this.app.name		
    +		});
    +		var name_right =$("<div class='appButton_appName_inner_right'></div>");
    +		nameDiv.append(name_inner).append(name_right);
    +		
    +		var notify = $("<div>",{
    +			"class": 'appButton_notify',
    +			id :'icon_app_'+this.app.appid+'_'+this.app.asc+'_notify',
    +		});
    +		$("<span class='appButton_notify_inner'></span>").appendTo(notify);
    +		
    +		var deleteDiv = $("<div>",{
    +			title:'鍗歌浇搴旂敤' ,
    +			id :'icon_app_'+this.app.appid+'_'+this.app.asc+'_delete',
    +			"class":'appButton_delete'		
    +		}); 
    +		
    +		this.box.append(appIcon).append(nameDiv).append(notify).append(deleteDiv);
    +	},
    +	bindEvent:function(){
    +        this.box.click(function(e){
    +            e.preventDefault();
    +            e.stopPropagation();
    +            var _this = $(this);
    +            var id = _this.attr("appid");
    +            var title = $.trim(_this.text());
    +            var url =_this.attr("url");
    +            var icon =_this.find("img").attr("src").split("/")[3];
    +            Windows.openApp(id,title,url,icon,1000,500);
    +
    +            appManagerPanel.hide();
    +            Desktop.show();
    +        });
    +	}	
    +		
    +});
    +
    +
    +//鏉ヨ嚦妗岄潰鐨勫浘鏍
    +appIcon_t1 = appIcon_t0.extend({		
    +	init : function(fid){	
    +		this.fid = fid;
    +//		//鏇挎崲data.js鏁版嵁
    +		this.app = datajson.app[fid];
    +//		this.app = DATA.app[fid];
    +		this.tx =1;	
    +		this.create(fid);
    +		this.bindEvent();
    +	},		
    +	create:function(fid){	
    +		this._super(1);			
    +		this.box.attr({
    +			id:"icon_app_"+this.app.appid+"_"+this.app.asc,
    +			appid:this.app.appid,
    +			fileid : this.app.appid,
    +			title:this.app.name,
    +			uid :"app_"+this.app.appid	,
    +			fid: fid,
    +			//TODO:鍔犺浇url鍦板潃
    +			url:this.app.url
    +//			url:"userController.do?user"
    +		});
    +		
    +		var appIcon =$("<div>",{
    +			  id : "icon_app_"+this.app.appid+"_"+this.app.asc+"_icon_div",
    +			  "class" : "appButton_appIcon"
    +		});
    +		appIcon.append($("<img>",{
    +			alt:this.app.name ,
    +//			src:'plug-in/sliding/icon/'+this.app.icon,
    +			src:this.app.icon,
    +            /*update-end--Author:zhangguoming  Date:20140509 for锛氫簯妗岄潰鍥炬爣绠$悊*/
    +			"class":"appButton_appIconImg",
    +			id:'icon_app_'+this.app.appid+'_'+this.app.asc+'_img'
    +		
    +		}));			
    +		var nameDiv = $("<div class='appButton_appName'></div>");
    +		var name_inner = $("<div>",{
    +			"class":'appButton_appName_inner',
    +			id:'icon_app_'+this.app.appid+'_'+this.app.asc+'_name',
    +			text:this.app.name		
    +		});
    +		var name_right =$("<div class='appButton_appName_inner_right'></div>");
    +		nameDiv.append(name_inner).append(name_right);
    +		
    +		var notify = $("<div>",{
    +			"class": 'appButton_notify',
    +			id :'icon_app_'+this.app.appid+'_'+this.app.asc+'_notify'
    +		});
    +		$("<span class='appButton_notify_inner'></span>").appendTo(notify);
    +		
    +		var deleteDiv = $("<div>",{
    +			title:'鍗歌浇搴旂敤' ,
    +			id :'icon_app_'+this.app.appid+'_'+this.app.asc+'_delete',
    +			"class":'appButton_delete'		
    +		}); 
    +		
    +		this.box.append(appIcon).append(nameDiv).append(notify).append(deleteDiv);
    +	},
    +	bindEvent:function(){//缁戝畾浜嬩欢
    +		this.box.click(function(e){
    +			 e.preventDefault();
    +			 e.stopPropagation();
    +			 var _this = $(this);
    +			 var id = _this.attr("appid");
    +			 var title = $.trim(_this.text());
    +//			 var url ="http://www.jeecg.org";
    +			 var url =_this.attr("url");
    +			 var icon =_this.find("img").attr("src").split("/")[3];			
    +			 Windows.openApp(id,title,url,icon,1400,600);
    +		});
    +	}
    +});
    +
    +//鏉ヨ嚦渚ц竟妗嗙殑鍥炬爣
    +appIcon_t2 = appIcon_t0.extend({
    +	init:function(fid){
    +		this.fid = fid;
    +		this.sApp = DATA.sApp[fid];
    +		this.tx = 2;
    +		this.create();	
    +		this.bindEvent();		
    +	},
    +	create : function(){
    +		this._super(2);
    +		this.box.attr({
    +			id:"icon_app_"+this.sApp.appid+"_"+this.sApp.asc,
    +			appid:this.sApp.appid,
    +			fileid : this.sApp.appid,
    +			title:this.sApp.name,
    +			uid :"app_"+this.sApp.appid,
    +            url:this.sApp.url
    +		});
    +		
    +		var appIcon =$("<div>",{
    +			  id : "icon_app_"+this.sApp.appid+"_"+this.sApp.asc+"_icon_div",
    +			  "class" : "appButton_appIcon"
    +		});
    +		appIcon.append($("<img>",{
    +			alt:this.sApp.name ,
    +//			src:'plug-in/sliding/icon/'+this.sApp.icon,
    +			src:this.sApp.icon,
    +			"class":"appButton_appIconImg",
    +			id:'icon_app_'+this.sApp.appid+'_'+this.sApp.asc+'_img'
    +		
    +		}));			
    +		var nameDiv = $("<div class='appButton_appName'></div>");
    +		var name_inner = $("<div>",{
    +			"class":'appButton_appName_inner',
    +			id:'icon_app_'+this.sApp.appid+'_'+this.sApp.asc+'_name',
    +			text:this.sApp.name		
    +		});
    +		var name_right =$("<div class='appButton_appName_inner_right'></div>");
    +		nameDiv.append(name_inner).append(name_right);
    +		var deleteDiv = $("<div",{
    +			title:'鍗歌浇搴旂敤' ,
    +			id :'icon_app_'+this.sApp.appid+'_'+this.sApp.asc+'_delete',
    +			"class":'appButton_delete'		
    +		}); 
    +		
    +		this.box.append(appIcon).append(nameDiv).append(deleteDiv);
    +	},
    +	bindEvent:function(){//缁戝畾浜嬩欢
    +		this.box.click(function(e){
    +			 e.preventDefault();
    +			 e.stopPropagation();
    +			 var _this = $(this);
    +			 var id = _this.attr("appid");
    +			 var title = $.trim(_this.text());
    +			 var url =_this.attr("url");
    +//			 var url ="logController.do?log";
    +			 var icon =_this.find("img").attr("src").split("/")[3];			
    +                 Windows.openApp(id,title,url,icon,1000,500);
    +		});
    +	}
    +});
    +
    +$(function() {
    +
    +	Body.init();
    +//	dataFlush();
    +	Desktop.init();
    +	//鏇挎崲icon鐨勬暟缁勫唴瀹
    +//	Deskpanel.init(iconjson).refresh();
    +	Deskpanel.init(iconjson, true);
    +	Sidebar.init({
    +		location:'left',//鍒濆鍖杝idebar鐨勪綅缃负宸︿晶
    +        Icon:defaultIconForSlider
    +		/*Icon:[
    +			'appmarket',
    +			'zone',
    +			'weibo',
    +			'mail',
    +			'internet',
    +			'qq'
    +		]*/
    +	});
    +	Navbar.init();//鍒濆鍖栧鑸潯	
    +	BottomBar.init();//鍒濆鍖栦笅閮ㄦ爮
    +	appManagerPanel.init();//鍒濆鍖栧叏灞妗岄潰
    +	
    +});
    +$(function(){
    +	$(".fsb_resultList").live("click",function(){
    +		
    +		var idx=$(this).attr("idx");
    +		var sb_resultBox_key=$(this).find(".sb_resultBox_key").html();
    +		if(idx=="-1"){
    +			Windows.openApp("","鐧惧害鎼滅储","http://www.baidu.com/s?tn=13081079_1_pg&ie=utf-8&bs=fda&f=8&rsv_bp=1&rsv_spt=1&wd="+sb_resultBox_key,"default.png",1000,500);
    +		}else if(idx=="-2"){
    +			
    +			Windows.openApp("","搴旂敤鎼滅储","functionController.do?searchApp&name="+sb_resultBox_key,"default.png",800,400);
    +		}
    +		$(".fsb_resultList").hide();
    +	})
    +	  var mychangeskin=$.cookie("myskin");
    +	
    +	  if(mychangeskin)
    +		 {
    +			 $("#zoomWallpaper").attr("src",mychangeskin);
    +			 $.cookie("myskin",mychangeskin,cookieParam);//1涓哄叧鎺夋祻瑙堝櫒涓嶆秷澶辨晥鏋滐紝0涓烘秷澶
    +		 }
    +	
    +});
    +
    diff --git a/src/main/webapp/plug-in/sliding/theme/blue.jpg b/src/main/webapp/plug-in/sliding/theme/blue.jpg
    new file mode 100644
    index 00000000..a44e65de
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/blue.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/theme/green.jpg b/src/main/webapp/plug-in/sliding/theme/green.jpg
    new file mode 100644
    index 00000000..1dc257a1
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/green.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/theme/pinky_night.jpg b/src/main/webapp/plug-in/sliding/theme/pinky_night.jpg
    new file mode 100644
    index 00000000..078d6677
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/pinky_night.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/theme/style.css b/src/main/webapp/plug-in/sliding/theme/style.css
    new file mode 100644
    index 00000000..e69de29b
    diff --git a/src/main/webapp/plug-in/sliding/theme/theme_2011.jpg b/src/main/webapp/plug-in/sliding/theme/theme_2011.jpg
    new file mode 100644
    index 00000000..d9618742
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/theme_2011.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/theme/theme_7_7.jpg b/src/main/webapp/plug-in/sliding/theme/theme_7_7.jpg
    new file mode 100644
    index 00000000..ae64a384
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/theme_7_7.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/theme/theme_blue.jpg b/src/main/webapp/plug-in/sliding/theme/theme_blue.jpg
    new file mode 100644
    index 00000000..de6c8648
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/theme_blue.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/theme/theme_blue1.jpg b/src/main/webapp/plug-in/sliding/theme/theme_blue1.jpg
    new file mode 100644
    index 00000000..123d7451
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/theme_blue1.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/theme/theme_blue_glow.jpg b/src/main/webapp/plug-in/sliding/theme/theme_blue_glow.jpg
    new file mode 100644
    index 00000000..67802abd
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/theme_blue_glow.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/theme/theme_christmas.jpg b/src/main/webapp/plug-in/sliding/theme/theme_christmas.jpg
    new file mode 100644
    index 00000000..9cf8f6f0
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/theme_christmas.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/theme/theme_cloud.jpg b/src/main/webapp/plug-in/sliding/theme/theme_cloud.jpg
    new file mode 100644
    index 00000000..d032c2e1
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/theme_cloud.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/theme/universe.jpg b/src/main/webapp/plug-in/sliding/theme/universe.jpg
    new file mode 100644
    index 00000000..b00639c5
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/universe.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/theme/wood1.jpg b/src/main/webapp/plug-in/sliding/theme/wood1.jpg
    new file mode 100644
    index 00000000..9a411b56
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/wood1.jpg differ
    diff --git a/src/main/webapp/plug-in/sliding/theme/wood2.jpg b/src/main/webapp/plug-in/sliding/theme/wood2.jpg
    new file mode 100644
    index 00000000..dd8e3c24
    Binary files /dev/null and b/src/main/webapp/plug-in/sliding/theme/wood2.jpg differ
    diff --git a/src/main/webapp/plug-in/smallslider/css/common.css b/src/main/webapp/plug-in/smallslider/css/common.css
    new file mode 100644
    index 00000000..8a53b7cf
    --- /dev/null
    +++ b/src/main/webapp/plug-in/smallslider/css/common.css
    @@ -0,0 +1,25 @@
    +@charset "UTF-8"; 
    +
    +/**
    + * Sinrow's Common CSS 
    + * http://lab.cnscene.com
    + */
    +
    +html, body, div, span, applet, object, iframe,
    +h1, h2, h3, h4, h5, h6, p, blockquote, pre,
    +a, abbr, acronym, address, big, cite, code,
    +del, dfn, em, font, img, ins, kbd, q, s, samp,
    +small, strike, strong, sub, sup, tt, var,
    +b, u, i, center,dl, dt, dd, ol, ul, li,fieldset, form, label, legend,caption{  margin: 0; padding: 0; border: 0;}
    +
    +ul {list-style-type: none;}
    +blockquote, q {	quotes: none;}
    +input[type=radio], input[type=checkbock] { cursor: pointer; }
    +
    +
    +.clearit { clear:both; font-size:0; height:0; overflow:hidden; }
    +
    +
    +
    +
    +
    diff --git a/src/main/webapp/plug-in/smallslider/css/lab.css b/src/main/webapp/plug-in/smallslider/css/lab.css
    new file mode 100644
    index 00000000..da39a8d5
    --- /dev/null
    +++ b/src/main/webapp/plug-in/smallslider/css/lab.css
    @@ -0,0 +1,58 @@
    +body{font-size:12px;}
    +a{color: #0089FE; text-decoration: none;}
    +a:hover{color:#E8A02C; text-decoration: underline;}
    +p{ line-height:1.8em; text-indent: 2em; }
    +#main{width:950px; margin: 0 auto; border:0px solid #CEEBA2; background:#FFF;}
    +#header{padding:20px;}
    +#header h1{font-size:22px; text-align:left;color:#0061CA;padding-left:100px;line-height:2.4em;height:70px;background:url(../images/banner_bg.jpg) no-repeat left top;}
    +#header h1 span{float:right; font-size:14px; color:#FFCC00;}
    +#header h1 span a{color:#FFCC00;text-decoration:underline;}
    +#header h1 span a:hover{text-decoration:none;}
    +#header p {line-height:2em; margin-bottom:10px ; text-align:center; padding-left:10em;}
    +#nav{height:30px; margin:0;background:url(../images/header_bg.png) repeat-x 0 0;}
    +#nav ul{float:right;width:356px;}
    +#nav ul li{float:left; margin-right:20px;padding:0 4px;}
    +#nav ul li.first{margin:0;}
    +#nav ul li a{display:block; height:30px; line-height:30px;font-size:14px; color:#FFF;text-decoration:none; width: 60px; text-align: center;}
    +#nav ul li a:hover{color:#FFCC00;}
    +
    +
    +#contain{padding:20px;}
    +#contain h2{font-size:14px; line-height:2em; margin-top:10px;border-bottom: 0px solid #0094D6; color:#FF5A00;}
    +
    +#flashbox{width:320px; height:200px;border:none;}
    +#footer{text-align:center;background:url(../images/inner-bg2.gif) repeat 0 0}
    +.section{margin-bottom: 10px;}
    +.update{margin-bottom: 10px;}
    +.update p{margin-top:10px;}
    +.update p span{float:right;padding-left: 2em;}
    +.expoes{background-color:#EEEEFF; border:1px solid #D9D9FF; padding: 15px;}
    +.expo{ padding:20px; border-bottom: 1px solid #EEE;}
    +.para{margin-bottom:20px;}
    +.box{padding:10px 30px;background:#FFFDE5;border:1px solid #F6F3D3;color:#993300;margin-bottom:20px;}
    +.list{padding:0 30px;}
    +.list li{line-height:2em;}
    +.source{margin:10px auto; padding:10px 20px; border: 1px dashed #FF3333; background:#F9F9F9;}
    +.code{margin-bottom: 20px;}
    +.codetit{background: #F7F6F1;border:1px solid #E9E8E3; border-bottom: none; line-height: 24px; height: 24px;padding-left: 10px;}
    +.insertcode ol {background: #F7F6F1;border:1px solid #E9E8E3; list-style-position:outside; padding-left: 36px;}
    +.insertcode ol li {background:#FFFFFF;border-left:3px solid #FF9933;color:#654322;padding-left:6px; line-height: 20px;}
    +.insertcode ol li div{line-height: 20px;}
    +.tblist{background:#FFEEFF;border-collapse:collapse;}
    +.tblist th, .tblist td{border:1px solid #B4C4FF; text-align:left; padding:5px 20px;}
    +.tblist th{color:#3366CC;}
    +.tblist td{}
    +
    +.exmp{width:320px; height:200px; float:left;}
    +.exmp-txt{width:440px; height:180px; float:right; border-left:2px solid orange;padding:10px 20px;}
    +.compatible{margin: 0px auto; text-align: right;}
    +.compatible span{display: inline-block;margin-left: 10px; width: 80px; text-align: center;}
    +.compatible span img{}
    +.compatible span em{display:block; font-style: normal;}
    +#expo1,#expo2{border-bottom:1px solid #D9D9FF; }
    +#down{margin: 20px 0; padding: 6px;}
    +#down p{text-indent: 0px;}
    +#down a{display:block;background: url(../images/Down.png) no-repeat 10px 10px; height:58px ; width:150px;
    +  padding: 5px 0 5px 60px; line-height:52px;  border:1px solid #EEE;  color: #0089FE;  text-decoration: none;
    +}
    +#down a:hover{color:#E8A02C;}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/smallslider/css/smallslider.css b/src/main/webapp/plug-in/smallslider/css/smallslider.css
    new file mode 100644
    index 00000000..8eff8b35
    --- /dev/null
    +++ b/src/main/webapp/plug-in/smallslider/css/smallslider.css
    @@ -0,0 +1,24 @@
    +@charset "UTF-8"; 
    +/* 
    +    $Document : smallslider$
    +    $Created on : 2009-7-3, 11:56:24$
    +    $Last Update : 2010-3-15, 11:20:22$
    +    $Author: ghp $
    +    $E-Mail : sinrow@yeah.net$
    +    $Description : Stylesheet for smallslider, UTF-8 encoding $
    +*/
    +.smallslider{position:relative;padding:0;margin:0;overflow:hidden;}
    +.smallslider ul{list-style-type:none;padding:0;margin:0;position: absolute;width:auto;height:auto;}
    +.smallslider li{margin:0;padding:0;}
    +.smallslider li a{margin:0;padding:0;}
    +.smallslider li a img{border:0;padding:0;margin:0;vertical-align:top;}
    +.smallslider  h3{position:absolute;font-weight:bold;font-size:12px;margin:0;padding:0;text-indent:2%;line-height:26px;z-index:102; width:98%;color:#CCC;}
    +.smallslider  h3 a{padding:0;margin:0;text-indent:0; }
    +.smallslider  h3 a:link,.smallslider  h3 a:visited{text-decoration:none;color:#FFFFFF;}
    +.smallslider  h3 a:hover{text-decoration:underline;color:#FF6600;}
    +.smallslider li.current-li{}
    +.smallslider-btns{position:absolute;z-index:103;}
    +.smallslider-btns span{background-color:#FFFFFF;border:1px solid #DCDCDC;color:#9F9F9F;cursor:pointer;float:left;font-size:12px;height:16px;line-height:16px;text-align:center; width:16px;}
    +.smallslider-btns span.current-btn{ background-color:#C00100; border:1px solid #A00100; color:white; font-size:13px;font-weight:bold;}
    +.smallslider-lay{position:absolute;background:black;height:26px;width:100%; z-index:101;}
    +#debug{width:200px;height:200px;border:1px solid;background:#CCC;position:fixed;left:10px;bottom:20px; }
    diff --git a/src/main/webapp/plug-in/smallslider/images/001.jpg b/src/main/webapp/plug-in/smallslider/images/001.jpg
    new file mode 100644
    index 00000000..e2608e16
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/001.jpg differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/002.jpg b/src/main/webapp/plug-in/smallslider/images/002.jpg
    new file mode 100644
    index 00000000..389af003
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/002.jpg differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/003.jpg b/src/main/webapp/plug-in/smallslider/images/003.jpg
    new file mode 100644
    index 00000000..e4669aab
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/003.jpg differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/004.jpg b/src/main/webapp/plug-in/smallslider/images/004.jpg
    new file mode 100644
    index 00000000..59f9aa53
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/004.jpg differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/005.jpg b/src/main/webapp/plug-in/smallslider/images/005.jpg
    new file mode 100644
    index 00000000..623f15d4
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/005.jpg differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/Chrome.png b/src/main/webapp/plug-in/smallslider/images/Chrome.png
    new file mode 100644
    index 00000000..6a3ac0bd
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/Chrome.png differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/Down.png b/src/main/webapp/plug-in/smallslider/images/Down.png
    new file mode 100644
    index 00000000..43e52202
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/Down.png differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/Firefox.png b/src/main/webapp/plug-in/smallslider/images/Firefox.png
    new file mode 100644
    index 00000000..2edaff4f
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/Firefox.png differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/IE.png b/src/main/webapp/plug-in/smallslider/images/IE.png
    new file mode 100644
    index 00000000..d5d41398
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/IE.png differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/Opera.png b/src/main/webapp/plug-in/smallslider/images/Opera.png
    new file mode 100644
    index 00000000..89795dda
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/Opera.png differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/Safari.png b/src/main/webapp/plug-in/smallslider/images/Safari.png
    new file mode 100644
    index 00000000..35c78024
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/Safari.png differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/banner_bg.jpg b/src/main/webapp/plug-in/smallslider/images/banner_bg.jpg
    new file mode 100644
    index 00000000..daca4954
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/banner_bg.jpg differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/bar-bg.gif b/src/main/webapp/plug-in/smallslider/images/bar-bg.gif
    new file mode 100644
    index 00000000..5e4f058d
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/bar-bg.gif differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/bg.gif b/src/main/webapp/plug-in/smallslider/images/bg.gif
    new file mode 100644
    index 00000000..c4837f8d
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/bg.gif differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/bgtab.gif b/src/main/webapp/plug-in/smallslider/images/bgtab.gif
    new file mode 100644
    index 00000000..98505a95
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/bgtab.gif differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/header_bg.png b/src/main/webapp/plug-in/smallslider/images/header_bg.png
    new file mode 100644
    index 00000000..7d989e43
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/header_bg.png differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/icon_blue.gif b/src/main/webapp/plug-in/smallslider/images/icon_blue.gif
    new file mode 100644
    index 00000000..c4f9f609
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/icon_blue.gif differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/icon_green.gif b/src/main/webapp/plug-in/smallslider/images/icon_green.gif
    new file mode 100644
    index 00000000..c02c600a
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/icon_green.gif differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/icon_moab.gif b/src/main/webapp/plug-in/smallslider/images/icon_moab.gif
    new file mode 100644
    index 00000000..604f1cf4
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/icon_moab.gif differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/icon_msg.gif b/src/main/webapp/plug-in/smallslider/images/icon_msg.gif
    new file mode 100644
    index 00000000..848a579c
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/icon_msg.gif differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/inner-bg.gif b/src/main/webapp/plug-in/smallslider/images/inner-bg.gif
    new file mode 100644
    index 00000000..e090d9ed
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/inner-bg.gif differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/inner-bg2.gif b/src/main/webapp/plug-in/smallslider/images/inner-bg2.gif
    new file mode 100644
    index 00000000..69f96ecc
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/inner-bg2.gif differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/valid-css-blue.gif b/src/main/webapp/plug-in/smallslider/images/valid-css-blue.gif
    new file mode 100644
    index 00000000..c373b2a7
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/valid-css-blue.gif differ
    diff --git a/src/main/webapp/plug-in/smallslider/images/valid-xhtml-blue.png b/src/main/webapp/plug-in/smallslider/images/valid-xhtml-blue.png
    new file mode 100644
    index 00000000..e971248a
    Binary files /dev/null and b/src/main/webapp/plug-in/smallslider/images/valid-xhtml-blue.png differ
    diff --git a/src/main/webapp/plug-in/smallslider/js/jquery.smallslider.js b/src/main/webapp/plug-in/smallslider/js/jquery.smallslider.js
    new file mode 100644
    index 00000000..b98fcc1d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/smallslider/js/jquery.smallslider.js
    @@ -0,0 +1,532 @@
    +/**
    + * SmallSilder JQuery plugin
    + * http://lib.kindcent.com/smallslider
    + * JQuery plugin for switch images, Please Open me with UTF-8 encoding
    + * Created under Ubuntu 9.10 OS , if you open it with notepad.exe , some black squares will appear !
    + * 杩欐槸涓涓簮鐮佸紑鏀剧▼搴忥紝鏈汉鐗规剰鍔犱笂娉ㄩ噴浠ユ柟渚垮ぇ瀹朵慨鏀癸紝浣犲彲浠ヨ嚜琛屼慨鏀癸紝鍐嶅彂甯冿紝娆㈣繋鍜屾垜浜ゆ祦銆
    + * 0.5鐗堟湰鏂板鍔燼ctionGap寤舵椂閫夐」锛岄儴鍒嗚В鍐冲揩閫熸粦鍔ㄦ椂鐨勯棯鐑侀棶棰樸
    + * 鍗抽紶鏍囨斁涓婇潰鍚庯紝闇瑕佺瓑寰呬竴娈垫椂闂存墠寮濮嬪垏鎹紝榛樿涓200姣銆
    + * 涓嶇煡浣曞勾浣曟湀鎵嶈兘绠1.0鐗堝憿锛熷洜涓烘垜涓鐩磋寰楀垏鎹㈢殑杩囨浮鏁堟灉杩樻病鏈夊畬鍏ㄨ揪鍒版垜鐨勬剰蹇楋紒
    + *
    + * Licensed under The MIT License
    + *
    + * @version    0.5
    + * @since        2009-7-3, 11:56:24
    + * @last           2010-12-6, 01:25:56
    + * @author     Jesse <microji@163.com>
    + */
    +
    +/**
    + * Usage:  $('#slider').smallslider({ onImageStop:true, switchEase: 'easeOutSine',switchPath: 'left'});
    + *
    + * @param elm 浣犳兂瑕佷娇鐢ㄧ殑鏈澶栧眰
    + * @param options 涓浜涢檮鍔犲弬鏁
    + *
    + * Valid options:
    + * ---------------------------------------
    + *  time:3000,                                  // 鍒囨崲鏃堕棿闂撮殧锛屽崟浣嶆绉掞紝1绉=1000姣
    + *  autoStart:true,                         // 鏄惁鑷姩寮濮嬫挱鏀
    + *  onImageStop : false ,             // 榧犳爣鏀惧湪鍥剧墖涓婃椂锛屾槸鍚﹀仠姝㈡挱鏀
    + *  switchMode:'hover',             // 鍥剧墖鍒囨崲鐨勬柟寮忥紝click涓哄崟鍑诲垏鎹紝hover涓洪紶鏍囩Щ鍔ㄥ埌鎸夐挳涓婃椂鍒囨崲
    + *  switchEffect:'fadeOut',         // 鍒囨崲鐗规晥,fadeOut, ease, none,
    + *  switchPath: 'left' ,                 // 鍒囨崲鐨勬柟鍚戯紝鍙夊间负锛歶p 锛 left 锛屽嵆鍚戜笂锛屽悜宸
    + *  switchEase : 'easeOutQuart' , // 鍙夊煎垪琛ㄥ涓
    + *  switchTime: 600,                    // 鍒囨崲鏃堕棿锛屽崟浣嶆绉掞紝1绉=1000姣
    + *  actionGap: 200,                     //[0.5鐗堟湰鏂板]榧犳爣鍗曞嚮鎴栫Щ鍔ㄨЕ鍙戝垏鎹紝鍒囨崲鍝嶅簲鐨勬椂闂撮棿闅旓紝0涓虹珛鍗冲搷搴旓紝鏃堕棿瓒婂ぇ锛屽搷搴旇秺鎱
    + *  buttonPosition: 'rightBottom', // 鎸夐挳浣嶇疆琛ㄧず锛屽叡鏈夊洓涓硷細leftTop锛宭eftBottom, rightTop, rightBottom
    + *  buttonOffsetX:10,               // 姘村钩鏂瑰悜涓婄殑鎸夐挳鍋忕Щ浣嶇疆锛屾寚鍚戜腑蹇冮儴绉诲姩澶氬皯锛岃繖閲屾槸鏁板硷紝涓嶅姞px
    + *  buttonOffsetY:4,                // 绔栫洿鏂瑰悜涓婄殑鎸夐挳鍋忕Щ浣嶇疆锛屾寚鍚戜腑蹇冮儴绉诲姩澶氬皯锛岃繖閲屾槸鏁板硷紝涓嶅姞px
    + *  buttonSpace:4,                  // 鎸夐挳涔嬮棿鐨勯棿闅 鍗曚綅涓哄儚绱狅紝浣嗕笉瑕佸姞px
    + *  showText: true,                 // 鏄惁鏄剧ず鏍囬锛屽鏋滀笉鏄剧ず锛屽垯鍙樉绀烘寜閽
    + *  showButtons : true,         // 鏄惁鏄剧ず鎸夐挳锛岄粯璁ゆ樉绀
    + *  textLink : true,                // 鏄惁缁欐樉绀虹殑鏍囬鍔犱笂閾炬帴锛屽鏋滀负false锛屽垯锛屽彧鏄剧ず鏍囬锛屾爣棰樹笉鍙崟鍑伙紝閾炬帴鐨勫湴鍧鑷姩鍜屽綋鍓嶆挱鏀惧埌鐨勫浘鐗囧湴鍧涓鑷
    + *  textSwitch : 0 ,            // 鏍囬鏄惁杩愬姩鏄剧ず锛屽鏋滀负0鍒欎笉鍔紝1 鏍囬鍔紝2 鏍囬鍜岃儗鏅竴璧峰姩銆
    + *  textPosition: '',		// 鏍囬鏍忕殑浣嶇疆锛岄粯璁や负绌猴紝鍗冲拰鎸夐挳鐨勪綅缃竴鑷达紝鍙栧 top ,  bottom
    + *  textAlign: ''		// 濡傛灉鐣欑┖锛屽垯浼氶粯璁ゅ拰鎸夐挳浣嶇疆鐨勭浉鍙嶆柟鍚戞帓鍒楋紝鍙栧硷細left, center, right
    + */
    +(function($) {
    +	
    +	$.smallslider=function(elm, options){
    +
    +	// this 涓哄綋鍓嶇殑smallslider瀵硅薄锛屼负浜嗗尯鍒紝浣跨敤 _this 鏇挎崲
    +	var _this = this;
    +	      _this.elm = elm ;	    // elm 涓哄綋鍓嶇殑 DOM瀵硅薄 锛屽嵆浣跨敤class="smallslider" 鐨勯偅涓猟iv瀵硅薄銆
    +	      _this.$elm = $(elm);  // $elm 涓篹lm瀵硅薄鐨刯query褰㈠紡 
    +	      _this.opts=$.extend({},$.smallslider.defaults, options);	      
    +              _this.sliderTimer= null ;
    +              _this.actionGapTimer = null;
    +              _this.slideProcessing = false;
    +	    // 鍒濆鍖栧璞
    +	    _this.init = function()
    +	    {   
    +		    _this.$ul = _this.$elm.find('>ul') ;  // 涓哄瓙鍏冪礌ul
    +		    _this.$lis = _this.$elm.find('li') ;  // 涓烘墍鏈塽l涓嬪瓙鍏冪礌li 鏁扮粍
    +		    _this.$ims = _this.$elm.find('img') ;  // 涓烘墍鏈塴i涓嬪瓙鍏冪礌img 鏁扮粍
    +		    _this.itemNums = _this.$lis.length ;
    +		    _this.width = _this.$elm.width();
    +		    _this.height = _this.$elm.height();
    +		    _this.current = 0 ;			// 褰撳墠鐨刬ndex绱㈠紩
    +		    
    +		    if(_this.itemNums > 1)
    +		    {
    +			if(_this.opts.switchEffect=='ease')
    +			{
    +			    _this.$ul.css({
    +				position:'absolute',
    +				left:0,
    +				top: 0
    +			    });
    +			    if(_this.opts.switchPath=='left')
    +			    {
    +				var width = _this.itemNums *  _this.width;
    +				_this.$lis.css({
    +				    'float' : 'left'
    +				});
    +				_this.$ul.css({
    +				    'width' : width
    +				});
    +			    }
    +			    else if(_this.opts.switchPath=='up')
    +			    {
    +				var height = _this.itemNums *  _this.height;
    +				_this.$ul.css({
    +				    'height' : height
    +				});
    +			    }
    +			}
    +			else if(_this.opts.switchEffect=='fadeOut')
    +			{
    +			    _this.$ul.css({
    +			    	position:'relative', width:'100%', height:'100%'
    +			    });
    +			    _this.$lis.css({
    +				position:'absolute',
    +				zIndex:1
    +			    }).eq(0).css({
    +				zIndex:2
    +			    });
    +			}
    +			if(_this.opts.showButtons)
    +			{
    +			    _this.createButtons();	// 鍒涘缓鎸夐挳銆
    +			}
    +			if(_this.opts.showText)
    +			{
    +			    _this.createText();	// 鍒涘缓鏂囧瓧鏄剧ず銆
    +			}
    +			if(_this.opts.autoStart)
    +			{
    +			    _this.startSlider(1);
    +			}
    +			if(_this.opts.onImageStop)
    +			{
    +			    _this.onImage();
    +			}
    +		    }
    +	    };
    +	    _this.createButtons = function()
    +	    {
    +		    var buttons='';
    +		    for(var i=1; i <= _this.itemNums ; i++ ){
    +			buttons += '<span>'+i+'</span>';
    +		    }
    +		    buttons ='<div class="smallslider-btns">' + buttons + '</div>';
    +		    var left=0,right=0,top =0,bottom=0;
    +		    var style_btns={};
    +		    switch(_this.opts.buttonPosition){
    +			case 'leftTop':
    +			    left = _this.opts.buttonOffsetX;
    +			    top  = _this.opts.buttonOffsetY;
    +			    style_btns={left: left + 'px' , top: top+'px'};
    +			    break;
    +			case 'rightTop':
    +			    right = _this.opts.buttonOffsetX;
    +			    top  = _this.opts.buttonOffsetY;
    +			    style_btns={right: right + 'px' , top: top+'px'};
    +			    break;
    +			case 'rightBottom':
    +			    right = _this.opts.buttonOffsetX;
    +			    bottom = _this.opts.buttonOffsetY;
    +			    style_btns={right: right + 'px' ,bottom: bottom+'px'};
    +			    break;
    +			case 'leftBottom':
    +			    left = _this.opts.buttonOffsetX;
    +			    bottom = _this.opts.buttonOffsetY;
    +			    style_btns={left: left + 'px' ,bottom: bottom+'px'};
    +			    break;
    +		    }
    +		    $(buttons).css(style_btns).appendTo(_this.$elm);
    +		    _this.$btns = _this.$elm.find('span');
    +		    _this.$elm.find('span:not(:first)').css({marginLeft: _this.opts.buttonSpace+'px'});
    +		    _this.$btns.removeClass('current-btn');
    +		    _this.$btns.eq(0).addClass('current-btn');
    +		    if(_this.opts.switchMode=='click'){
    +			_this.$btns.click(function(){
    +			    var ix = _this.$btns.index($(this));
    +			    //_this.slideTo(ix); // 琛ㄧず闇瑕佸垏鎹㈠埌鍝竴寮
    +                             _this.actionSlide(ix);
    +			});
    +		    }else if(_this.opts.switchMode=='hover'){
    +			 _this.$btns.hover(function(){
    +			    var ix = _this.$btns.index($(this));
    +			    //_this.slideTo(ix);
    +                             _this.actionSlide(ix);
    +			});
    +		    }
    +	    };
    +
    +        _this.actionSlide = function(ix){
    +           // console.log(_this.actionGapTimer);
    +            if(_this.actionGapTimer){
    +                clearTimeout(_this.actionGapTimer);
    +                _this.actionGapTimer = null ;
    +            }
    +            _this.actionGapTimer = setTimeout(function(){_this.slideTo(ix) ;}, _this.opts.actionGap);
    +            
    +        };
    +	    // 鍒涘缓鏍囬鏍囩
    +	_this.createText = function(){
    +	    var style_tex={}; 
    +	    switch(_this.opts.buttonPosition){
    +		case 'leftTop':
    +		    style_tex={left:0,	top:0,textAlign:'right'};
    +		    _this.textPosition = 'top';
    +		    break;
    +		case 'rightTop':
    +		    style_tex={left:0,	top:0,textAlign:'left'};
    +		    _this.textPosition = 'top';
    +		    break;
    +		case 'rightBottom':
    +		    style_tex={left:0,bottom:0,textAlign:'left'};
    +		    _this.textPosition = 'bottom';
    +		    break;
    +		case 'leftBottom':
    +		    style_tex={left:0,bottom:0,textAlign:'right'};
    +		    _this.textPosition = 'bottom';
    +		    break;
    +	    }
    +	    if(_this.opts.textPosition){
    +		switch(_this.opts.textPosition)
    +		{
    +			case 'top':
    +			    style_tex.left = 0 ;style_tex.top = 0;
    +			    break;
    +			case 'bottom':
    +			    style_tex.left = 0 ;style_tex.bottom=0 ;
    +			    break;
    +		}
    +		_this.textPosition = _this.opts.textPosition ;
    +	    }
    +	    if(_this.opts.textAlign)
    +	    {
    +		    style_tex.textAlign =_this.opts.textAlign;
    +	    }
    +	    $('<div class="smallslider-tex smallslider-lay"></div>').css(style_tex).css({
    +		opacity:0.39
    +	    }).appendTo(_this.$elm);
    +
    +	    var tex0= _this.$ims.eq(0).attr('alt');
    +	    if(_this.opts.textLink){
    +		tex0 = '<a href="'+_this.$ims.eq(0).parent('a').attr('href')+'">'+ tex0+'</a>';
    +	    }
    +	    $('<h3 class="smallslider-tex"></h3>').css(style_tex).html(tex0).appendTo(_this.$elm);
    +	    _this.$h3 = _this.$elm.find('h3');
    +	    _this.$lay = _this.$elm.find('div.smallslider-lay');
    +	    _this.$tex = _this.$elm.find('.smallslider-tex');
    +	};
    +        _this.onImage =function(){
    +            _this.$ims.hover(function(){
    +                _this.stopSlider();
    +            }, function(){
    +                _this.slideTo(_this.current+1);
    +            });
    +        };
    +
    +        _this.slideTo = function (index){
    +            _this.stopSlider(); // 鍏堟竻鎺変互鍓嶇殑setTimeout;
    +            if(index > _this.itemNums -1) index = 0;
    +	    if(index < 0 ) index = _this.itemNums -1 ;
    +	    // 鍒囨崲琛ㄧず褰撳墠鍏冪礌
    +            _this.$lis.removeClass('current-li').eq(index).addClass('current-li');
    +	    if(_this.opts.showButtons)
    +	    {
    +		_this.$btns.removeClass('current-btn');
    +		_this.$btns.eq(index).addClass('current-btn');
    +	    }
    +	    _this.slideText(index);
    +	    var chAttr = '';
    +	    var iC = 0;
    +	    switch(_this.opts.switchPath)
    +	    {	
    +		case 'left':
    +		    chAttr = 'left';
    +		    iC =_this.width ;
    +		    break;
    +		case 'up':
    +		 default :
    +		    chAttr = 'top';
    +		    iC = _this.height ;
    +		    break;
    +	    }
    +	    var iCx = -1 * index * iC; // Top鎴朙eft 鍙樺寲閲
    +	    var switchEase = _this.opts.switchEase  ;
    +            switch( _this.opts.switchEffect){
    +                case 'fadeOut':
    +                    if(_this.current != index)
    +                    {
    +                        _this.slideProcessing = true ;
    +                        _this.$lis.stop(true,false);
    +                        _this.$lis.css({zIndex:1,opacity:1}).hide();
    +                        _this.$lis.eq(_this.current).css({zIndex:3}).show();
    +                        _this.$lis.eq(index).css({zIndex:2}).show();
    +                    	_this.$lis.eq(_this.current).fadeOut(_this.opts.switchTime,function(){
    +				_this.$lis.css({zIndex:1});
    +				_this.$lis.eq(index).css({zIndex:3,opacity:1}).show();
    +                                _this.slideProcessing = false;
    +                   	});
    +                    }
    +                    break;
    +		case 'ease':
    +		    _this.$ul.stop(true,false);
    +		    if(chAttr=='top')
    +			_this.$ul.animate({top : iCx}, {duration: _this.opts.switchTime, easing: switchEase, complete: function(){
    +			    }
    +			});
    +		    else if(chAttr=='left')
    +			_this.$ul.animate({left : iCx}, {duration: _this.opts.switchTime, easing: switchEase ,complete:function(){
    +			}});
    +		    break;
    +                case 'none':
    +                default :
    +                    _this.$lis.eq(_this.current).hide();
    +                    _this.$lis.eq(index).show();
    +                    break;
    +            }
    +	    _this.current = index ;
    +            _this.startSlider(index+1);
    +        };
    +
    +	// 鍒囨崲鏂囧瓧
    +	_this.slideText = function(index)
    +	{
    +	    if(_this.opts.showText)
    +	    {
    +		    var tex = _this.$ims.eq(index).attr('alt');
    +		    if(_this.opts.textLink){
    +			tex = '<a href="'+_this.$ims.eq(index).parent('a').attr('href')+'">'+ tex+'</a>';
    +		    }
    +		    _this.$h3.html(tex);
    +		    if(_this.opts.textSwitch>0){
    +			var t_path = _this.$h3.height();
    +			var t_ani1 ={}, t_ani2 ={};
    +			if(_this.textPosition=='top'){
    +				t_ani1 = {top : -1*t_path};
    +				t_ani2 = {top : 0}; 
    +			 }
    +			else if(_this.textPosition=='bottom'){
    +				t_ani1 = {bottom : -1*t_path};
    +				t_ani2 = {bottom : 0};
    +			 }
    +			 if(_this.opts.textSwitch==1) {
    +				 _this.$h3.stop(true, false).animate(t_ani1, {duration: 200, easing: 'easeOutQuad'}).animate(t_ani2, {duration: 200, easing: 'easeOutQuad'});
    +			 }else if(_this.opts.textSwitch==2){
    +				 _this.$tex.stop(true, false).animate(t_ani1, {duration: 200, easing: 'easeOutQuad'}).animate(t_ani2, {duration: 200, easing: 'easeOutQuad'});
    +				//_this.$lay.animate(t_ani1, {duration: 200, easing: 'easeOutQuad'}).animate(t_ani2, {duration: 200, easing: 'easeOutQuad'});
    +			 }
    +		    }
    +	    }
    +	};
    +        
    +	// 寮濮嬪垏鎹
    +        _this.startSlider = function(index){
    +            // 鐢辩鍑犱釜搴忓彿寮濮 鍒濆涓1
    +            var st =setTimeout(function(){
    +                _this.slideTo(index);
    +            },_this.opts.time);
    +	    _this.sliderTimer = st ;
    +        };
    +	// 鍋滄鍒囨崲
    +        _this.stopSlider = function(){
    +	    //if(_this.opts.switchEffect=='fadeOut') _this.$lis.stop();
    +	  //  else if(_this.opts.switchEffect=='ease') _this.$ul.stop();
    +            if(_this.sliderTimer) {
    +		clearTimeout(_this.sliderTimer);
    +	    }		
    +            _this.sliderTimer = null;
    +        };
    +
    +	_this.init();
    +    };
    +
    +    $.smallslider.defaults={
    +            time:3000,    
    +            autoStart:true,  
    +	    onImageStop : false ,
    +            switchMode:'hover',   
    +            switchEffect:'fadeOut',
    +	    switchPath: 'left' , 
    +	    switchEase : 'easeOutQuart' , 
    +            switchTime: 600,    
    +            actionGap: 200,
    +            buttonPosition: 'rightBottom',
    +            buttonOffsetX:10, 
    +            buttonOffsetY:4,  
    +            buttonSpace:4, 
    +	    showText: true,  
    +	    showButtons : true,	
    +	    textLink : true,   
    +	    textSwitch : 0 ,
    +	    textPosition: '',	
    +	    textAlign: ''
    +    };
    +
    +    $.fn.smallslider = function(options){
    +	    // 閬嶅巻鐢$.smallslider绫诲垱寤虹敓鎴愮殑smallslider瀵硅薄銆
    +	    return this.each(function(i){
    +				(new $.smallslider(this, options));
    +	   });
    +    };
    +    
    +})(jQuery);
    +
    +$.smallslider.switchEases = ["easeInQuad", "easeOutQuad", "easeInOutQuad", "easeInCubic", "easeOutCubic",
    + "easeInOutCubic", "easeInQuart", "easeOutQuart", "easeInOutQuart", "easeInQuint", "easeOutQuint", "easeInOutQuint",
    + "easeInSine", "easeOutSine", "easeInOutSine", "easeInExpo", "easeOutExpo", "easeInOutExpo", "easeInCirc", "easeOutCirc", "easeInOutCirc", "easeInElastic",
    + "easeOutElastic", "easeInOutElastic", "easeInBack", "easeOutBack", "easeInOutBack",
    + "easeInBounce", "easeOutBounce", "easeInOutBounce"];
    +
    +// t: current time, b: begInnIng value, c: change In value, d: duration
    +jQuery.easing['jswing'] = jQuery.easing['swing'];
    +
    +jQuery.extend( jQuery.easing,
    +{
    +	def: 'easeOutQuad',
    +	swing: function (x, t, b, c, d) {
    +		//alert(jQuery.easing.default);
    +		return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
    +	},
    +	easeInQuad: function (x, t, b, c, d) {
    +		return c*(t/=d)*t + b;
    +	},
    +	easeOutQuad: function (x, t, b, c, d) {
    +		return -c *(t/=d)*(t-2) + b;
    +	},
    +	easeInOutQuad: function (x, t, b, c, d) {
    +		if ((t/=d/2) < 1) return c/2*t*t + b;
    +		return -c/2 * ((--t)*(t-2) - 1) + b;
    +	},
    +	easeInCubic: function (x, t, b, c, d) {
    +		return c*(t/=d)*t*t + b;
    +	},
    +	easeOutCubic: function (x, t, b, c, d) {
    +		return c*((t=t/d-1)*t*t + 1) + b;
    +	},
    +	easeInOutCubic: function (x, t, b, c, d) {
    +		if ((t/=d/2) < 1) return c/2*t*t*t + b;
    +		return c/2*((t-=2)*t*t + 2) + b;
    +	},
    +	easeInQuart: function (x, t, b, c, d) {
    +		return c*(t/=d)*t*t*t + b;
    +	},
    +	easeOutQuart: function (x, t, b, c, d) {
    +		return -c * ((t=t/d-1)*t*t*t - 1) + b;
    +	},
    +	easeInOutQuart: function (x, t, b, c, d) {
    +		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
    +		return -c/2 * ((t-=2)*t*t*t - 2) + b;
    +	},
    +	easeInQuint: function (x, t, b, c, d) {
    +		return c*(t/=d)*t*t*t*t + b;
    +	},
    +	easeOutQuint: function (x, t, b, c, d) {
    +		return c*((t=t/d-1)*t*t*t*t + 1) + b;
    +	},
    +	easeInOutQuint: function (x, t, b, c, d) {
    +		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
    +		return c/2*((t-=2)*t*t*t*t + 2) + b;
    +	},
    +	easeInSine: function (x, t, b, c, d) {
    +		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
    +	},
    +	easeOutSine: function (x, t, b, c, d) {
    +		return c * Math.sin(t/d * (Math.PI/2)) + b;
    +	},
    +	easeInOutSine: function (x, t, b, c, d) {
    +		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
    +	},
    +	easeInExpo: function (x, t, b, c, d) {
    +		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
    +	},
    +	easeOutExpo: function (x, t, b, c, d) {
    +		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
    +	},
    +	easeInOutExpo: function (x, t, b, c, d) {
    +		if (t==0) return b;
    +		if (t==d) return b+c;
    +		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
    +		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
    +	},
    +	easeInCirc: function (x, t, b, c, d) {
    +		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
    +	},
    +	easeOutCirc: function (x, t, b, c, d) {
    +		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
    +	},
    +	easeInOutCirc: function (x, t, b, c, d) {
    +		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
    +		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
    +	},
    +	easeInElastic: function (x, t, b, c, d) {
    +		var s=1.70158;var p=0;var a=c;
    +		if (t==0) return b;if ((t/=d)==1) return b+c;if (!p) p=d*.3;
    +		if (a < Math.abs(c)) {a=c;s=p/4;}
    +		else s = p/(2*Math.PI) * Math.asin (c/a);
    +		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
    +	},
    +	easeOutElastic: function (x, t, b, c, d) {
    +		var s=1.70158;var p=0;var a=c;
    +		if (t==0) return b;if ((t/=d)==1) return b+c;if (!p) p=d*.3;
    +		if (a < Math.abs(c)) {a=c;s=p/4;}
    +		else s = p/(2*Math.PI) * Math.asin (c/a);
    +		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
    +	},
    +	easeInOutElastic: function (x, t, b, c, d) {
    +		var s=1.70158;var p=0;var a=c;
    +		if (t==0) return b;if ((t/=d/2)==2) return b+c;if (!p) p=d*(.3*1.5);
    +		if (a < Math.abs(c)) {a=c;s=p/4;}
    +		else s = p/(2*Math.PI) * Math.asin (c/a);
    +		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
    +		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
    +	},
    +	easeInBack: function (x, t, b, c, d, s) {
    +		if (s == undefined) s = 1.70158;
    +		return c*(t/=d)*t*((s+1)*t - s) + b;
    +	},
    +	easeOutBack: function (x, t, b, c, d, s) {
    +		if (s == undefined) s = 1.70158;
    +		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
    +	},
    +	easeInOutBack: function (x, t, b, c, d, s) {
    +		if (s == undefined) s = 1.70158;
    +		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
    +		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
    +	},
    +	easeInBounce: function (x, t, b, c, d) {
    +		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
    +	},
    +	easeOutBounce: function (x, t, b, c, d) {
    +		if ((t/=d) < (1/2.75)) {
    +			return c*(7.5625*t*t) + b;
    +		} else if (t < (2/2.75)) {
    +			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
    +		} else if (t < (2.5/2.75)) {
    +			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
    +		} else {
    +			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
    +		}
    +	},
    +	easeInOutBounce: function (x, t, b, c, d) {
    +		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
    +		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
    +	}
    +});
    diff --git a/src/main/webapp/plug-in/tools/Map.js b/src/main/webapp/plug-in/tools/Map.js
    new file mode 100644
    index 00000000..7fa39f57
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/Map.js
    @@ -0,0 +1,153 @@
    +/**
    + * Map瀵硅薄锛屽疄鐜癕ap鍔熻兘
    + * 
    + * 
    + * size() 鑾峰彇Map鍏冪礌涓暟 
    + * isEmpty() 鍒ゆ柇Map鏄惁涓虹┖ 
    + * clear() 鍒犻櫎Map鎵鏈夊厓绱 
    + * put(key, value) 鍚慚ap涓鍔犲厓绱狅紙key, value) 
    + * remove(key) 鍒犻櫎鎸囧畾key鐨勫厓绱狅紝鎴愬姛杩斿洖true锛屽け璐ヨ繑鍥瀎alse 
    + * get(key) 鑾峰彇鎸囧畾key鐨勫厓绱犲紇alue锛屽け璐ヨ繑鍥瀗ull 
    + * element(index) 鑾峰彇鎸囧畾绱㈠紩鐨勫厓绱狅紙浣跨敤element.key锛宔lement.value鑾峰彇key鍜寁alue锛夛紝澶辫触杩斿洖null 
    + * containsKey(key) 鍒ゆ柇Map涓槸鍚﹀惈鏈夋寚瀹歬ey鐨勫厓绱 
    + * containsValue(value) 鍒ゆ柇Map涓槸鍚﹀惈鏈夋寚瀹歷alue鐨勫厓绱 
    + * keys() 鑾峰彇Map涓墍鏈塳ey鐨勬暟缁勶紙array锛 
    + * values() 鑾峰彇Map涓墍鏈塿alue鐨勬暟缁勶紙array锛
    + */
    +function Map() {
    +	this.elements = new Array();
    +
    +	// 鑾峰彇Map鍏冪礌涓暟
    +	this.size = function() {
    +		return this.elements.length;
    +	},
    +
    +	// 鍒ゆ柇Map鏄惁涓虹┖
    +	this.isEmpty = function() {
    +		return (this.elements.length < 1);
    +	},
    +
    +	// 鍒犻櫎Map鎵鏈夊厓绱
    +	this.clear = function() {
    +		this.elements = new Array();
    +	},
    +
    +	// 鍚慚ap涓鍔犲厓绱狅紙key, value)
    +	this.put = function(_key, _value) {
    +		if (this.containsKey(_key) == true) {
    +			if (this.containsValue(_value)) {
    +				if (this.remove(_key) == true) {
    +					this.elements.push( {
    +						key : _key,
    +						value : _value
    +					});
    +				}
    +			} else {
    +				this.elements.push( {
    +					key : _key,
    +					value : _value
    +				});
    +			}
    +		} else {
    +			this.elements.push( {
    +				key : _key,
    +				value : _value
    +			});
    +		}
    +	},
    +
    +	// 鍒犻櫎鎸囧畾key鐨勫厓绱狅紝鎴愬姛杩斿洖true锛屽け璐ヨ繑鍥瀎alse
    +	this.remove = function(_key) {
    +		var bln = false;
    +		try {
    +			for (i = 0; i < this.elements.length; i++) {
    +				if (this.elements[i].key == _key) {
    +					this.elements.splice(i, 1);
    +					return true;
    +				}
    +			}
    +		} catch (e) {
    +			bln = false;
    +		}
    +		return bln;
    +	},
    +
    +	// 鑾峰彇鎸囧畾key鐨勫厓绱犲紇alue锛屽け璐ヨ繑鍥瀗ull
    +	this.get = function(_key) {
    +		try {
    +			for (i = 0; i < this.elements.length; i++) {
    +				if (this.elements[i].key == _key) {
    +					return this.elements[i].value;
    +				}
    +			}
    +		} catch (e) {
    +			return null;
    +		}
    +	},
    +
    +	// 鑾峰彇鎸囧畾绱㈠紩鐨勫厓绱狅紙浣跨敤element.key锛宔lement.value鑾峰彇key鍜寁alue锛夛紝澶辫触杩斿洖null
    +	this.element = function(_index) {
    +		if (_index < 0 || _index >= this.elements.length) {
    +			return null;
    +		}
    +		return this.elements[_index];
    +	},
    +
    +	// 鍒ゆ柇Map涓槸鍚﹀惈鏈夋寚瀹歬ey鐨勫厓绱
    +	this.containsKey = function(_key) {
    +		var bln = false;
    +		try {
    +			for (i = 0; i < this.elements.length; i++) {
    +				if (this.elements[i].key == _key) {
    +					bln = true;
    +				}
    +			}
    +		} catch (e) {
    +			bln = false;
    +		}
    +		return bln;
    +	},
    +
    +	// 鍒ゆ柇Map涓槸鍚﹀惈鏈夋寚瀹歷alue鐨勫厓绱
    +	this.containsValue = function(_value) {
    +		var bln = false;
    +		try {
    +			for (i = 0; i < this.elements.length; i++) {
    +				if (this.elements[i].value == _value) {
    +					bln = true;
    +				}
    +			}
    +		} catch (e) {
    +			bln = false;
    +		}
    +		return bln;
    +	},
    +
    +	// 鑾峰彇Map涓墍鏈塳ey鐨勬暟缁勶紙array锛
    +	this.keys = function() {
    +		var arr = new Array();
    +		for (i = 0; i < this.elements.length; i++) {
    +			arr.push(this.elements[i].key);
    +		}
    +		return arr;
    +	},
    +
    +	// 鑾峰彇Map涓墍鏈塿alue鐨勬暟缁勶紙array锛
    +	this.values = function() {
    +		var arr = new Array();
    +		for (i = 0; i < this.elements.length; i++) {
    +			arr.push(this.elements[i].value);
    +		}
    +		return arr;
    +	};
    +	/**
    +	 * 閲嶅啓toString 
    +	 */
    +	this.toString = function(){
    +		var s = "";
    +		for (i = 0; i < this.elements.length; i++) {
    +			s += this.elements[i].value+"&nbsp;&nbsp;";
    +		}
    +		return s;
    +	};
    +}
    diff --git a/src/main/webapp/plug-in/tools/changeEasyuiTheme.js b/src/main/webapp/plug-in/tools/changeEasyuiTheme.js
    new file mode 100644
    index 00000000..8d94d1b6
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/changeEasyuiTheme.js
    @@ -0,0 +1,22 @@
    +锘//<a href="#" onclick="changeThemeFun('default')">榛樿|</a><a href="#" onclick="changeThemeFun('green')">缁縷</a><a href="#" onclick="changeThemeFun('gray')">鐏皘</a><a href="#" onclick="changeThemeFun('pink')">绾</a><a href="#" onclick="changeThemeFun('orange')">姗橀粍|</a>
    +function changeThemeFun(themeName) {/* 鏇存崲涓婚 */
    +	var $easyuiTheme = $('#easyuiTheme');
    +	var url = $easyuiTheme.attr('href');
    +	var href = url.substring(0, url.indexOf('themes')) + 'themes/' + themeName + '/easyui.css';
    +	$easyuiTheme.attr('href', href);
    +
    +	var $iframe = $('iframe');
    +	if ($iframe.length > 0) {
    +		for ( var i = 0; i < $iframe.length; i++) {
    +			var ifr = $iframe[i];
    +			$(ifr).contents().find('#easyuiTheme').attr('href', href);
    +		}
    +	}
    +
    +	$.cookie('easyuiThemeName', themeName, {
    +		expires : 7
    +	});
    +};
    +if ($.cookie('easyuiThemeName')) {
    +	changeThemeFun($.cookie('easyuiThemeName'));
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/tools/ckeditorTool.js b/src/main/webapp/plug-in/tools/ckeditorTool.js
    new file mode 100644
    index 00000000..528863f9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/ckeditorTool.js
    @@ -0,0 +1,12 @@
    +$(function() {
    +	$("#btn_sub").click(function() {
    +		CKupdate();
    +	});
    +});
    +function CKupdate() {
    +	for (instance in CKEDITOR.instances) {
    +		var ins = CKEDITOR.instances[instance];
    +		ins.setData(ins.getData().replace(new RegExp("\r\n", "g"), ""));
    +		ins.updateElement();
    +	}
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/tools/ckfinderTool.js b/src/main/webapp/plug-in/tools/ckfinderTool.js
    new file mode 100644
    index 00000000..d9a9787d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/ckfinderTool.js
    @@ -0,0 +1,23 @@
    +function decode(value, id) {// value浼犲叆鍊,id鎺ュ彈鍊
    +	var last = value.lastIndexOf("/");
    +	var filename = value.substring(last + 1, value.length);
    +	$("#" + id).text(decodeURIComponent(filename));
    +}
    +function browse(inputId, file, type) {// 鏂囦欢绠$悊鍣紝鍙涓笂浼犲叡鐢
    +	var finder = new CKFinder();
    +	finder.selectActionFunction = function(fileUrl, data) {// 璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟
    +		$("#" + inputId).attr("value", fileUrl);
    +		if ("Images" != type) { // equals鍑芥暟鏃犳晥? 鏀逛负绗﹀彿鍒ゆ柇 --- Alexander
    +			$("#" + file).attr("href", fileUrl);
    +			decode(fileUrl, file);
    +		} else {
    +			$("#" + file).attr("src", fileUrl);
    +			$("#" + file).attr("hidden", false);
    +		}
    +	};
    +	finder.resourceType = type;// 鎸囧畾ckfinder鍙负type杩涜绠$悊
    +	finder.selectActionData = inputId; // 鎺ユ敹鍦板潃鐨刬nput ID
    +	finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +	finder.defaultLanguage = 'zh-cn';
    +	finder.popup();
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/tools/css/common.css b/src/main/webapp/plug-in/tools/css/common.css
    new file mode 100644
    index 00000000..f171dd08
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/css/common.css
    @@ -0,0 +1,36 @@
    +@charset "utf-8";
    +
    +/*********鎸夐挳鍖哄煙***************/
    +.button-row { width : 100%; padding : 0; margin : 0; white-space : nowrap; text-align : right; }
    +
    +/*********褰曞叆鍖哄煙***************/
    +div.formDetails label input { border : 1px solid #54A5D5; padding:2px; }
    +
    +div.formDetails label textarea,
    +select { border : 1px solid #54A5D5; padding:2px; width:157px; }
    +
    +div.formDetails { background-color: #f2f7fe; border: solid 1px #5BB5FD; padding:5px; line-height:20px; visibility:visible; overflow:hidden; }
    +
    +div.formDetails label {text-align: right; width:300px; display: inline-block; visibility:visible; padding:0; margin-right:10px; margin-top:5px; }
    +
    +div.formDetails label span.righttext{text-align: left; width:300px; display: inline-block; visibility:visible; padding:0; margin-left:10px; margin-top:5px; }
    +
    +div.formDetails label span.Validform_label{text-align: right; width:100px; display: inline-block; visibility:visible; padding:0; margin-left:10px; margin-top:5px; }
    +
    +div.formDetails label.row { text-align: left; width:616px; *width:610px;
    +display: block; overflow:hidden; padding:0;  margin-left:15px;}
    +
    +div.formDetails label.row textarea { width:442px; *width:436px;
    +_width:440px; overflow:auto; height:auto; }
    +
    +div.formDetails label.row input { width:442px; *width:436px;
    +_width:440px; _height:20px; }
    +
    +div.formDetails input[type="button"],
    +input[type="submit"],
    +input[type="reset"] { background-color:#39F; background-image:url(../images/tab_14.gif); color:#333 !important; font-family:"寰蒋闆呴粦"; font-size:12px; padding:2px 6px !important; *padding:0 2px !important;
    +cursor:pointer !important; border:1px solid #D7EAFF !important; margin-right:4px !important; width:auto !important; }
    +
    +input[type="file"] { background-color: #D7EAFF; border : 1px solid #54A5D5; width:auto !important; padding:2px; }
    +
    +input[type="text"] { background-color: #fff; border : 1px solid #54A5D5; padding:2px; }
    diff --git a/src/main/webapp/plug-in/tools/css/metro/common.css b/src/main/webapp/plug-in/tools/css/metro/common.css
    new file mode 100644
    index 00000000..79932d76
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/css/metro/common.css
    @@ -0,0 +1,48 @@
    +@charset "utf-8";
    +
    +/*********鎸夐挳鍖哄煙***************/
    +.button-row { width : 100%; padding : 0; margin : 0; white-space : nowrap; text-align : right; }
    +
    +/*********褰曞叆鍖哄煙***************/
    +div.formDetails label input { border : 1px solid #54A5D5; padding:2px; }
    +
    +div.formDetails label textarea,
    +select { border : 1px solid #D7D7D7; padding:6px; width:157px; border-radius: 3px;}
    +
    +div.formDetails { background-color: #f2f7fe; border: solid 1px #5BB5FD; padding:5px; line-height:20px; visibility:visible; overflow:hidden; }
    +
    +div.formDetails label {text-align: right; width:300px; display: inline-block; visibility:visible; padding:0; margin-right:10px; margin-top:5px; }
    +
    +div.formDetails label span.righttext{text-align: left; width:300px; display: inline-block; visibility:visible; padding:0; margin-left:10px; margin-top:5px; }
    +
    +div.formDetails label span.Validform_label{text-align: right; width:100px; display: inline-block; visibility:visible; padding:0; margin-left:10px; margin-top:5px; }
    +
    +div.formDetails label.row { text-align: left; width:616px; *width:610px;
    +display: block; overflow:hidden; padding:0;  margin-left:15px;}
    +
    +div.formDetails label.row textarea { width:442px; *width:436px;
    +_width:440px; overflow:auto; height:auto; }
    +
    +div.formDetails label.row input { width:442px; *width:436px;
    +_width:440px; _height:20px; }
    +
    +div.formDetails input[type="button"],
    +input[type="submit"],
    +input[type="reset"] { background-color:#39F; background-image:url(../images/tab_14.gif); color:#333 !important; font-family:"寰蒋闆呴粦"; font-size:12px; padding:2px 6px !important; *padding:0 2px !important;
    +cursor:pointer !important; border:1px solid #D7EAFF !important; margin-right:4px !important; width:auto !important; }
    +
    +input[type="file"] { background-color: #D7EAFF; border : 1px solid #54A5D5; width:auto !important; padding:2px; }
    +
    +input[type="text"] { 
    +	background-color: #fff; 
    +	/*border : 1px solid #54A5D5;
    +	padding:2px;  */
    +	
    +	border: 1px solid #D7D7D7;
    +	border-radius: 3PX;
    +	/*height: 14PX;*/
    +	padding: 7px 0 7px 5px;
    +	line-height: 14PX;
    +	font-size: 12px;
    +	display: inline-block;
    +}
    diff --git a/src/main/webapp/plug-in/tools/curdtools_en.js b/src/main/webapp/plug-in/tools/curdtools_en.js
    new file mode 100644
    index 00000000..9d25ab18
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/curdtools_en.js
    @@ -0,0 +1,991 @@
    +锘//锘縱ar jq = jQuery.noConflict();
    +/**
    + * 澧炲垹鏀瑰伐鍏锋爮
    + */
    +/*window.onerror = function() {
    +	return true;
    +};*/
    +var iframe;// iframe鎿嶄綔瀵硅薄
    +var win;//绐楀彛瀵硅薄
    +var gridname="";//鎿嶄綔datagrid瀵硅薄鍚嶇О
    +var windowapi = frameElement.api, W = windowapi.opener;//鍐呭椤典腑璋冪敤绐楀彛瀹炰緥瀵硅薄鎺ュ彛
    +function upload(curform) {
    +	upload();
    +}
    +/**
    + *  Add event open window
    + * @param title
    + * @param addurl
    + */
    +function add(title,addurl,gname,width,height) {
    +	gridname=gname;
    +	createwindow(title, addurl,width,height);
    +}
    +/**
    + * 鏍戝垪琛ㄦ坊鍔犱簨浠舵墦寮绐楀彛
    + * @param title 缂栬緫妗嗘爣棰
    + * @param addurl//鐩爣椤甸潰鍦板潃
    + */
    +function addTreeNode(title,addurl,gname) {
    +	if (rowid != '') {
    +		addurl += '&id='+rowid;
    +	}
    +	gridname=gname;
    +	createwindow(title, addurl);
    +}
    +/**
    + * 鏇存柊浜嬩欢鎵撳紑绐楀彛
    + * @param title 缂栬緫妗嗘爣棰
    + * @param addurl//鐩爣椤甸潰鍦板潃
    + * @param id//涓婚敭瀛楁
    + */
    +function update(title,url, id,width,height) {
    +	gridname=id;
    +	var rowsData = $('#'+id).datagrid('getSelections');
    +	if (!rowsData || rowsData.length==0) {
    +		tip('Please select edit item');
    +		return;
    +	}
    +	if (rowsData.length>1) {
    +		tip('Please one item to edit');
    +		return;
    +	}
    +	
    +	url += '&id='+rowsData[0].id;
    +	createwindow(title,url,width,height);
    +}
    +
    +/**
    + * 濡傛灉椤甸潰鏄缁嗘煡鐪嬮〉闈紝鏃犳晥鍖栨墍鏈夎〃鍗曞厓绱狅紝鍙兘杩涜鏌ョ湅
    + */
    +$(function(){
    +	if(location.href.indexOf("load=detail")!=-1){
    +		$(":input").attr("disabled","true");
    +	}
    +});
    +
    +/**
    + * 鏌ョ湅璇︾粏浜嬩欢鎵撳紑绐楀彛
    + * @param title 鏌ョ湅妗嗘爣棰
    + * @param addurl//鐩爣椤甸潰鍦板潃
    + * @param id//涓婚敭瀛楁
    + */
    +function detail(title,url, id,width,height) {
    +	var rowsData = $('#'+id).datagrid('getSelections');
    +	
    +	if (!rowsData || rowsData.length == 0) {
    +		tip('Please select view item');
    +		return;
    +	}
    +	if (rowsData.length > 1) {
    +		tip('Please select an item to view');
    +		return;
    +	}
    +    url += '&load=detail&id='+rowsData[0].id;
    +	createdetailwindow(title,url,width,height);
    +}
    +
    +/**
    + * 澶氳褰曞埅闄よ珛姹
    + * @param title
    + * @param url
    + * @param gname
    + * @return
    + */
    +function deleteALLSelect(title,url,gname) {
    +	gridname=gname;
    +    var ids = [];
    +    var rows = $("#"+gname).datagrid('getSelections');
    +    if (rows.length > 0) {
    +    	$.dialog.confirm('Do you want to delete this data for ever?', function(r) {
    +		   if (r) {
    +				for ( var i = 0; i < rows.length; i++) {
    +					ids.push(rows[i].id);
    +				}
    +				$.ajax({
    +					url : url,
    +					type : 'post',
    +					data : {
    +						ids : ids.join(',')
    +					},
    +					cache : false,
    +					success : function(data) {
    +						var d = $.parseJSON(data);
    +						if (d.success) {
    +							var msg = d.msg;
    +							tip(msg);
    +							reloadTable();
    +							$("#"+gname).datagrid('unselectAll');
    +							ids='';
    +						}
    +					}
    +				});
    +			}
    +		});
    +	} else {
    +		tip("Please select delete data");
    +	}
    +}
    +
    +/**
    + * 鏌ョ湅鏃剁殑寮瑰嚭绐楀彛
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + */
    +function createdetailwindow(title, addurl,width,height) {
    +	width = width?width:700;
    +	height = height?height:400;
    +	if(width=="100%" || height=="100%"){
    +		width = window.top.document.body.offsetWidth;
    +		height =window.top.document.body.offsetHeight-100;
    +	}
    +	if(typeof(windowapi) == 'undefined'){
    +		$.dialog({
    +			content: 'url:'+addurl,
    +			lock : true,
    +			width:width,
    +			height: height,
    +			title:title,
    +			opacity : 0.3,
    +			cache:false, 
    +		    cancelVal: 'Close',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		}).zindex();
    +	}else{
    +		W.$.dialog({
    +			content: 'url:'+addurl,
    +			lock : true,
    +			width:width,
    +			height: height,
    +			parent:windowapi,
    +			title:title,
    +			opacity : 0.3,
    +			cache:false, 
    +		    cancelVal: 'Close',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		}).zindex();
    +	}
    +	
    +}
    +/**
    + * 鍏ㄥ睆缂栬緫
    + * @param title 缂栬緫妗嗘爣棰
    + * @param addurl//鐩爣椤甸潰鍦板潃
    + * @param id//涓婚敭瀛楁
    + */
    +function editfs(title,url) {
    +	var name=gridname;
    +	 if (rowid == '') {
    +		tip('Please select edit item');
    +		return;
    +	}
    +	url += '&id='+rowid;
    +	openwindow(title,url,name,800,500);
    +}
    +// 鍒犻櫎璋冪敤鍑芥暟
    +function delObj(url,name) {
    +	gridname=name;
    +	createdialog('Delete Confirm ', 'Delete this record, Confirm ?', url,name);
    +}
    +// 鍒犻櫎璋冪敤鍑芥暟
    +function confuploadify(url, id) {
    +	$.dialog.confirm('Delete confirm', function(){
    +		deluploadify(url, id);
    +	}, function(){
    +	}).zindex();
    +}
    +/**
    + * 鎵ц鍒犻櫎闄勪欢
    + * 
    + * @param url
    + * @param index
    + */
    +function deluploadify(url, id) {
    +	$.ajax({
    +		async : false,
    +		cache : false,
    +		type : 'POST',
    +		url : url,// 璇锋眰鐨刟ction璺緞
    +		error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +		},
    +		success : function(data) {
    +			var d = $.parseJSON(data);
    +			if (d.success) {
    +				$("#" + id).remove();// 绉婚櫎SPAN
    +				m.remove(id);// 绉婚櫎MAP瀵硅薄鍐呭瓧绗︿覆
    +			}
    +
    +		}
    +	});
    +}
    +// 鏅氳闂搷浣滆皟鐢ㄥ嚱鏁
    +function confirm(url, content,name) {
    +	createdialog('Tip Message ', content, url,name);
    +}
    +/**
    + * Tip Message
    + */
    +function tip_old(msg) {
    +	$.dialog.setting.zIndex = 1980;
    +	$.dialog.tips(msg, 1);
    +}
    +/**
    + * Tip Message
    + */
    +function tip(msg) {
    +	try{
    +		$.dialog.setting.zIndex = 1980;
    +		$.messager.show({
    +			title : 'Tip Message',
    +			msg : msg,
    +			timeout : 1000 * 6
    +		});
    +	}catch(e){
    +		alertTipTop(msg,'10%');
    +	}
    +}
    +/**
    + * Tip Message鍍廰lert涓鏍 瀹氫綅椤堕儴鐨勪綅缃
    + */
    +function alertTipTop(msg,top,title) {
    +	$.dialog.setting.zIndex = 1980;
    +	title = title?title:"Tip Message";
    +	$.dialog({
    +			title:title,
    +			icon:'tips.gif',
    +			top:top,
    +			content: msg
    +		}).zindex();
    +}
    +
    +/**
    + * Tip Message鍍廰lert涓鏍
    + */
    +function alertTip(msg,title) {
    +	$.dialog.setting.zIndex = 1980;
    +	title = title?title:"Tip Message";
    +	$.dialog({
    +			title:title,
    +			icon:'tips.gif',
    +			content: msg
    +		}).zindex();
    +}
    +/**
    + * 鍒涘缓娣诲姞鎴栫紪杈戠獥鍙
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + */
    +function createwindow(title, addurl,width,height) {
    +	width = width?width:700;
    +	height = height?height:400;
    +	if(width=="100%" || height=="100%"){
    +		width = window.top.document.body.offsetWidth;
    +		height =window.top.document.body.offsetHeight-100;
    +	}
    +    //--author锛欽ueYue---------date锛20140427---------for锛氬脊鍑篵ug淇敼,璁剧疆浜唞index()鍑芥暟
    +	if(typeof(windowapi) == 'undefined'){
    +		$.dialog({
    +			content: 'url:'+addurl,
    +			lock : true,
    +			//zIndex:1990,
    +			width:width,
    +			height:height,
    +			title:title,
    +			opacity : 0.3,
    +			cache:false,
    +			okVal: 'Submit',
    +		    ok: function(){
    +		    	iframe = this.iframe.contentWindow;
    +				saveObj();
    +				return false;
    +		    },
    +		    cancelVal: 'Close',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		}).zindex();
    +	}else{
    +		W.$.dialog({
    +			content: 'url:'+addurl,
    +			lock : true,
    +			width:width,
    +			//zIndex:1990,
    +			height:height,
    +			parent:windowapi,
    +			title:title,
    +			opacity : 0.3,
    +			cache:false,
    +		    ok: function(){
    +		    	iframe = this.iframe.contentWindow;
    +				saveObj();
    +				return false;
    +		    },
    +		    cancelVal: 'Close',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		}).zindex();
    +	}
    +    //--author锛欽ueYue---------date锛20140427---------for锛氬脊鍑篵ug淇敼,璁剧疆浜唞index()鍑芥暟
    +	
    +}
    +/**
    + * 鍒涘缓涓婁紶椤甸潰绐楀彛
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + */
    +function openuploadwin(title, url,name,width, height) {
    +	gridname=name;
    +	$.dialog({
    +	    content: 'url:'+url,
    +	    cache:false,
    +	    button: [
    +	        {
    +	            name: "Begin Upload",
    +	            callback: function(){
    +	            	iframe = this.iframe.contentWindow;
    +					iframe.upload();
    +					return false;
    +	            },
    +	            focus: true
    +	        },
    +	        {
    +	            name: "Cancel Upload",
    +	            callback: function(){
    +	            	iframe = this.iframe.contentWindow;
    +					iframe.cancel();
    +	            }
    +	        }
    +	    ]
    +	}).zindex();
    +}
    +/**
    + * 鍒涘缓鏌ヨ椤甸潰绐楀彛
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + */
    +function opensearchdwin(title, url, width, height) {
    +	$.dialog({
    +		content: 'url:'+url,
    +		title : title,
    +		lock : true,
    +		height : height,
    +		cache:false,
    +		width : width,
    +		opacity : 0.3,
    +		button : [ {
    +			name :'Query',
    +			callback : function() {
    +				iframe = this.iframe.contentWindow;
    +				iframe.searchs();
    +			},
    +			focus : true
    +		}, {
    +			name : 'Cancel',
    +			callback : function() {
    +
    +			}
    +		} ]
    +	}).zindex();
    +}
    +/**
    + * 鍒涘缓涓嶅甫鎸夐挳鐨勭獥鍙
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + */
    +function openwindow(title, url,name, width, height) {
    +	gridname=name;
    +	if (typeof (width) == 'undefined'&&typeof (height) != 'undefined')
    +	{
    +		if(typeof(windowapi) == 'undefined'){
    +			$.dialog({
    +				content: 'url:'+url,
    +				title : title,
    +				cache:false,
    +				lock : true,
    +				width: 'auto',
    +			    height: height
    +			}).zindex();
    +		}else{
    +			$.dialog({
    +				content: 'url:'+url,
    +				title : title,
    +				cache:false,
    +				parent:windowapi,
    +				lock : true,
    +				width: 'auto',
    +			    height: height
    +			}).zindex();
    +		}
    +	}
    +	if (typeof (height) == 'undefined'&&typeof (width) != 'undefined')
    +	{
    +		if(typeof(windowapi) == 'undefined'){
    +			$.dialog({
    +				content: 'url:'+url,
    +				title : title,
    +				lock : true,
    +				width: width,
    +				cache:false,
    +			    height: 'auto'
    +			}).zindex();
    +		}else{
    +			$.dialog({
    +				content: 'url:'+url,
    +				title : title,
    +				lock : true,
    +				parent:windowapi,
    +				width: width,
    +				cache:false,
    +			    height: 'auto'
    +			}).zindex();
    +		}
    +	}
    +	if (typeof (width) == 'undefined'&&typeof (height) == 'undefined')
    +	{
    +		if(typeof(windowapi) == 'undefined'){
    +			$.dialog({
    +				content: 'url:'+url,
    +				title : title,
    +				lock : true,
    +				width: 'auto',
    +				cache:false,
    +			    height: 'auto'
    +			}).zindex();
    +		}else{
    +			$.dialog({
    +				content: 'url:'+url,
    +				title : title,
    +				lock : true,
    +				parent:windowapi,
    +				width: 'auto',
    +				cache:false,
    +			    height: 'auto'
    +			}).zindex();
    +		}
    +	}
    +	
    +	if (typeof (width) != 'undefined'&&typeof (height) != 'undefined')
    +	{
    +		if(typeof(windowapi) == 'undefined'){
    +			$.dialog({
    +				width: width,
    +			    height:height,
    +				content: 'url:'+url,
    +				title : title,
    +				cache:false,
    +				lock : true
    +			}).zindex();
    +		}else{
    +			$.dialog({
    +				width: width,
    +			    height:height,
    +				content: 'url:'+url,
    +				parent:windowapi,
    +				title : title,
    +				cache:false,
    +				lock : true
    +			}).zindex();
    +		}
    +	}
    +}
    +
    +/**
    + * 鍒涘缓璇㈤棶绐楀彛
    + * 
    + * @param title
    + * @param content
    + * @param url
    + */
    +function createdialog(title, content, url,name) {
    +	$.dialog.confirm(content, function(){
    +		doSubmit(url,name);
    +		rowid = '';
    +	}, function(){
    +	}).zindex();
    +}
    +/**
    + * 鎵ц淇濆瓨
    + * 
    + * @param url
    + * @param gridname
    + */
    +function saveObj() {
    +	$('#btn_sub', iframe.document).click();
    +}
    +
    +/**
    + * 鎵цAJAX鎻愪氦FORM
    + * 
    + * @param url
    + * @param gridname
    + */
    +function ajaxSubForm(url) {
    +	$('#myform', iframe.document).form('submit', {
    +		url : url,
    +		onSubmit : function() {
    +			iframe.editor.sync();
    +		},
    +		success : function(r) {
    +			tip('Cancel');
    +			reloadTable();
    +		}
    +	});
    +}
    +/**
    + * 鎵ц鏌ヨ
    + * 
    + * @param url
    + * @param gridname
    + */
    +function search() {
    +
    +	$('#btn_sub', iframe.document).click();
    +	iframe.search();
    +}
    +
    +/**
    + * 鎵ц鎿嶄綔
    + * 
    + * @param url
    + * @param index
    + */
    +function doSubmit(url,name,data) {
    +	gridname=name;
    +	//--author锛欽ueYue ---------date锛20140227---------for锛氭妸URL杞崲鎴怭OST鍙傛暟闃叉URL鍙傛暟瓒呭嚭鑼冨洿鐨勯棶棰
    +	var paramsData = data;
    +	if(!paramsData){
    +		paramsData = new Object();
    +		if (url.indexOf("&") != -1) {
    +			var str = url.substr(url.indexOf("&")+1);
    +			url = url.substr(0,url.indexOf("&"));
    +			var strs = str.split("&");
    +			for(var i = 0; i < strs.length; i ++) {
    +				paramsData[strs[i].split("=")[0]]=(strs[i].split("=")[1]);
    +			}
    +		}      
    +	}
    +	//--author锛欽ueYue ---------date锛20140227---------for锛氭妸URL杞崲鎴怭OST鍙傛暟闃叉URL鍙傛暟瓒呭嚭鑼冨洿鐨勯棶棰
    +	$.ajax({
    +		async : false,
    +		cache : false,
    +		type : 'POST',
    +		data : paramsData,
    +		url : url,// 璇锋眰鐨刟ction璺緞
    +		error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +		},
    +		success : function(data) {
    +			var d = $.parseJSON(data);
    +			if (d.success) {
    +				var msg = d.msg;
    +				tip(msg);
    +				reloadTable();
    +			}
    +		}
    +	});
    +	
    +	
    +}
    +/**
    + * 閫鍑虹‘璁ゆ
    + * 
    + * @param url
    + * @param content
    + * @param index
    + */
    +function exit(url, content) {
    +	$.dialog.confirm(content, function(){
    +		window.location = url;
    +	}, function(){
    +	}).zindex();
    +}
    +/**
    + * 妯℃澘椤甸潰ajax鎻愪氦
    + * 
    + * @param url
    + * @param gridname
    + */
    +function ajaxdoSub(url, formname) {
    +	$('#' + formname).form('submit', {
    +		url : url,
    +		onSubmit : function() {
    +			editor.sync();
    +		},
    +		success : function(r) {
    +			tip('Cancel');
    +		}
    +	});
    +}
    +/**
    + * ajax鎻愪氦FORM
    + * 
    + * @param url
    + * @param gridname
    + */
    +function ajaxdoForm(url, formname) {
    +	$('#' + formname).form('submit', {
    +		url : url,
    +		onSubmit : function() {
    +		},
    +		success : function(r) {
    +			tip('Cancel');
    +		}
    +	});
    +}
    +
    +function opensubwin(title, url, saveurl, okbutton, closebutton) {
    +	$.dialog({
    +		content: 'url:'+url,
    +		title : title,
    +		lock : true,
    +		opacity : 0.3,
    +		button : [ {
    +			name : okbutton,
    +			callback : function() {
    +				iframe = this.iframe.contentWindow;
    +				win = frameElement.api.opener;// 鏉ユ簮椤甸潰
    +				$('#btn_sub', iframe.document).click();
    +				return false;
    +			}
    +		}, {
    +			name : closebutton,
    +			callback : function() {
    +			}
    +		} ]
    +
    +	}).zindex();
    +}
    +
    +function openauditwin(title, url, saveurl, okbutton, backbutton, closebutton) {
    +	$.dialog({
    +		content: 'url:'+url,
    +		title : title,
    +		lock : true,
    +		opacity : 0.3,
    +		button : [ {
    +			name : okbutton,
    +			callback : function() {
    +				iframe = this.iframe.contentWindow;
    +				win = $.dialog.open.origin;// 鏉ユ簮椤甸潰
    +				$('#btn_sub', iframe.document).click();
    +				return false;
    +			}
    +		}, {
    +			name : backbutton,
    +			callback : function() {
    +				iframe = this.iframe.contentWindow;
    +				win = frameElement.api.opener;// 鏉ユ簮椤甸潰
    +				$('#formobj', iframe.document).form('submit', {
    +					url : saveurl + "&code=exit",
    +					onSubmit : function() {
    +						$('#code').val('exit');
    +					},
    +					success : function(r) {
    +						$.dialog.tips('Cancel', 2);
    +						win.location.reload();
    +					}
    +				});
    +
    +			}
    +		}, {
    +			name : closebutton,
    +			callback : function() {
    +			}
    +		} ]
    +
    +	}).zindex();
    +}
    +/*鑾峰彇Cookie鍊*/
    +function getCookie(c_name)
    +{
    +	if (document.cookie.length > 0) {
    +		c_start = document.cookie.indexOf(c_name + "=")
    +		if (c_start != -1) {
    +			c_start = c_start + c_name.length + 1
    +			c_end = document.cookie.indexOf(";", c_start)
    +			if (c_end == -1)
    +				c_end = document.cookie.length
    +			return unescape(document.cookie.substring(c_start, c_end))
    +		}
    +	}
    +	return ""
    +}
    +// 娣诲姞鏍囩
    +function addOneTab(subtitle, url, icon) {
    +	var indexStyle = getCookie("JEECGINDEXSTYLE");
    +	if(indexStyle=='sliding'||indexStyle=='bootstrap'||indexStyle=='ace'){
    +		//shortcut鍜宐ootstrap椋庢牸鐨則ab璺宠浆鏀逛负鐩存帴璺宠浆
    +		window.location.href=url;
    +	}else{
    +		if (icon == '') {
    +			icon = 'icon folder';
    +		}
    +		window.top.$.messager.progress({
    +			text : 'Page loading...',
    +			interval : 300
    +		});
    +		window.top.$('#maintabs').tabs({
    +			onClose : function(subtitle, index) {
    +				window.top.$.messager.progress('close');
    +			}
    +		});
    +		if (window.top.$('#maintabs').tabs('exists', subtitle)) {
    +			window.top.$('#maintabs').tabs('select', subtitle);
    +			if (url.indexOf('isHref') != -1) {
    +				window.top.$('#maintabs').tabs('update', {
    +					tab : window.top.$('#maintabs').tabs('getSelected'),
    +					options : {
    +						title : subtitle,
    +						href:url,
    +						//content : '<iframe src="' + url + '" frameborder="0" style="border:0;width:100%;height:99.4%;"></iframe>',
    +						closable : true,
    +						icon : icon
    +					}
    +				});
    +			}else {
    +				window.top.$('#maintabs').tabs('update', {
    +					tab : window.top.$('#maintabs').tabs('getSelected'),
    +					options : {
    +						title : subtitle,
    +						content : '<iframe src="' + url + '" frameborder="0" style="border:0;width:100%;height:99.4%;"></iframe>',
    +						//content : '<iframe src="' + url + '" frameborder="0" style="border:0;width:100%;height:99.4%;"></iframe>',
    +						closable : true,
    +						icon : icon
    +					}
    +				});
    +			}
    +		} else {
    +			if (url.indexOf('isHref') != -1) {
    +				window.top.$('#maintabs').tabs('add', {
    +					title : subtitle,
    +					href:url,
    +					closable : true,
    +					icon : icon
    +				});
    +			}else {
    +				window.top.$('#maintabs').tabs('add', {
    +					title : subtitle,
    +					content : '<iframe src="' + url + '" frameborder="0" style="border:0;width:100%;height:99.4%;"></iframe>',
    +					closable : true,
    +					icon : icon
    +				});
    +			}
    +		}
    +	}
    +}
    +// 鍏抽棴鑷韩TAB鍒锋柊鐖禩ABgrid
    +function closetab(title) {
    +	//鏆傛椂鍏堜笉鍒锋柊
    +	//window.top.document.getElementById('tabiframe').contentWindow.reloadTable();
    +	//window.top.document.getElementById('maintabs').contentWindow.reloadTable();
    +	window.top.$('#maintabs').tabs('close', title);
    +	//tip("娣诲姞鎴愬姛");
    +}
    +
    +//popup  
    +//object: this  name:闇瑕侀夋嫨鐨勫垪琛ㄧ殑瀛楁  code:鍔ㄦ佹姤琛ㄧ殑code
    +function inputClick(obj,name,code) {
    +	 $.dialog.setting.zIndex = 2000;
    +	 if(name==""||code==""){
    +		 alert("Popup parameter not prepare");
    +		 return;
    +	 }
    +	 if(typeof(windowapi) == 'undefined'){
    +		 $.dialog({
    +				content: "url:cgReportController.do?popup&id="+code,
    +				lock : true,
    +				title:"Select",
    +				width:800,
    +				height: 400,
    +				cache:false,
    +			    ok: function(){
    +			    	iframe = this.iframe.contentWindow;
    +			    	var selected = iframe.getSelectRows();
    +			    	if (selected == '' || selected == null ){
    +				    	alert("Please select");
    +			    		return false;
    +				    }else {
    +					    var str = "";
    +				    	$.each( selected, function(i, n){
    +					    	if (i==0)
    +					    	str+= n[name];
    +					    	else
    +				    		str+= ","+n[name];
    +				    	});
    +				    	$(obj).val("");
    +				    	//$('#myText').searchbox('setValue', str);
    +					    $(obj).val(str);
    +				    	return true;
    +				    }
    +					
    +			    },
    +			    cancelVal: 'Close',
    +			    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +			}).zindex();
    +		}else{
    +			$.dialog({
    +				content: "url:cgReportController.do?popup&id="+code,
    +				lock : true,
    +				title:"Select",
    +				width:800,
    +				height: 400,
    +				parent:windowapi,
    +				cache:false,
    +			    ok: function(){
    +			    	iframe = this.iframe.contentWindow;
    +			    	var selected = iframe.getSelectRows();
    +			    	if (selected == '' || selected == null ){
    +				    	alert("Please select");
    +			    		return false;
    +				    }else {
    +					    var str = "";
    +				    	$.each( selected, function(i, n){
    +					    	if (i==0)
    +					    	str+= n[name];
    +					    	else
    +				    		str+= ","+n[name];
    +				    	});
    +				    	$(obj).val("");
    +				    	//$('#myText').searchbox('setValue', str);
    +					    $(obj).val(str);
    +				    	return true;
    +				    }
    +					
    +			    },
    +			    cancelVal: 'Close',
    +			    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +			}).zindex();
    +		}
    +}
    +/*
    +	鑷畾涔塽rl鐨勫脊鍑
    +	obj:瑕佸~鍏呯殑鎺т欢,鍙互涓哄涓紝浠ラ楀彿鍒嗛殧
    +	name:鍒楄〃涓搴旂殑瀛楁,鍙互涓哄涓紝浠ラ楀彿鍒嗛殧锛堜笌obj瑕佸搴旓級
    +	url锛氬脊鍑洪〉闈㈢殑Url
    +*/
    +function popClick(obj,name,url) {
    +	 $.dialog.setting.zIndex = 2001;
    +	var names = name.split(",");
    +	var objs = obj.split(",");
    +	 if(typeof(windowapi) == 'undefined'){
    +		 $.dialog({
    +				content: "url:"+url,
    +				lock : true,
    +				title:"Select",
    +				width:700,
    +				height: 400,
    +				cache:false,
    +			    ok: function(){
    +			    	iframe = this.iframe.contentWindow;
    +			    	var selected = iframe.getSelectRows();
    +			    	if (selected == '' || selected == null ){
    +				    	alert("Please select");
    +			    		return false;
    +				    }else {
    +				    	for(var i1=0;i1<names.length;i1++){
    +						    var str = "";
    +					    	$.each( selected, function(i, n){
    +						    	if (i==0)
    +						    	str+= n[names[i1]];
    +						    	else{
    +									str+= ",";
    +									str+=n[names[i1]];
    +								}
    +					    	});
    +							if($("#"+objs[i1]).length>=1){
    +								$("#"+objs[i1]).val("");
    +								$("#"+objs[i1]).val(str);
    +							}else{
    +								$("input[name='"+objs[i1]+"']").val("");
    +								$("input[name='"+objs[i1]+"']").val(str);
    +							}
    +						 }
    +				    	return true;
    +				    }
    +					 
    +			    },
    +			    cancelVal: 'Close',
    +			    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +			}).zindex();
    +		}else{
    +			$.dialog({
    +				content: "url:"+url,
    +				lock : true,
    +				title:"Select",
    +				width:700,
    +				height: 400,
    +				parent:windowapi,
    +				cache:false,
    +			     ok: function(){
    +			    	iframe = this.iframe.contentWindow;
    +			    	var selected = iframe.getSelectRows();
    +			    	if (selected == '' || selected == null ){
    +				    	alert("Please select");
    +			    		return false;
    +				    }else {
    +				    	for(var i1=0;i1<names.length;i1++){
    +						    var str = "";
    +					    	$.each( selected, function(i, n){
    +						    	if (i==0)
    +						    	str+= n[names[i1]];
    +						    	else{
    +									str+= ",";
    +									str+=n[names[i1]];
    +								}
    +					    	});
    +					    	if($("#"+objs[i1]).length>=1){
    +								$("#"+objs[i1]).val("");
    +								$("#"+objs[i1]).val(str);
    +							}else{
    +								$("[name='"+objs[i1]+"']").val("");
    +								$("[name='"+objs[i1]+"']").val(str);
    +							}
    +						 }
    +				    	return true;
    +				    }
    +					
    +			    },
    +			    cancelVal: 'Close',
    +			    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +			}).zindex();
    +		}
    +}
    +/**
    + * Jeecg Excel 瀵煎嚭
    + * 浠e叆鏌ヨ鏉′欢
    + */
    +function JeecgExcelExport(url,datagridId){
    +	var queryParams = $('#'+datagridId).datagrid('options').queryParams;
    +	$('#'+datagridId+'tb').find('*').each(function() {
    +	    queryParams[$(this).attr('name')] = $(this).val();
    +	});
    +	var params = '&';
    +	$.each(queryParams, function(key, val){
    +		params+='&'+key+'='+val;
    +	}); 
    +	var fields = '&field=';
    +	$.each($('#'+ datagridId).datagrid('options').columns[0], function(i, val){
    +		if(val.field != 'opt'){
    +			fields+=val.field+',';
    +		}
    +	}); 
    +	window.location.href = url+ encodeURI(fields+params);
    +}
    +/**
    + * 鑷姩瀹屾垚鐨勮В鏋愬嚱鏁
    + * @param data
    + * @returns {Array}
    + */
    +function jeecgAutoParse(data){
    +	var parsed = [];
    +    	$.each(data.rows,function(index,row){
    +    		parsed.push({data:row,result:row,value:row.id});
    +    	});
    +			return parsed;
    +}
    diff --git a/src/main/webapp/plug-in/tools/curdtools_zh-cn.js b/src/main/webapp/plug-in/tools/curdtools_zh-cn.js
    new file mode 100644
    index 00000000..cd395a0a
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/curdtools_zh-cn.js
    @@ -0,0 +1,993 @@
    +锘//锘縱ar jq = jQuery.noConflict();
    +/**
    + * 澧炲垹鏀瑰伐鍏锋爮
    + */
    +/*window.onerror = function() {
    +	return true;
    +};*/
    +var iframe;// iframe鎿嶄綔瀵硅薄
    +var win;//绐楀彛瀵硅薄
    +var gridname="";//鎿嶄綔datagrid瀵硅薄鍚嶇О
    +var windowapi = frameElement.api, W = windowapi.opener;//鍐呭椤典腑璋冪敤绐楀彛瀹炰緥瀵硅薄鎺ュ彛
    +function upload(curform) {
    +	upload();
    +}
    +/**
    + * 娣诲姞浜嬩欢鎵撳紑绐楀彛
    + * @param title 缂栬緫妗嗘爣棰
    + * @param addurl//鐩爣椤甸潰鍦板潃
    + */
    +function add(title,addurl,gname,width,height) {
    +	gridname=gname;
    +	createwindow(title, addurl,width,height);
    +}
    +/**
    + * 鏍戝垪琛ㄦ坊鍔犱簨浠舵墦寮绐楀彛
    + * @param title 缂栬緫妗嗘爣棰
    + * @param addurl//鐩爣椤甸潰鍦板潃
    + */
    +function addTreeNode(title,addurl,gname) {
    +	if (rowid != '') {
    +		addurl += '&id='+rowid;
    +	}
    +	gridname=gname;
    +	createwindow(title, addurl);
    +}
    +/**
    + * 鏇存柊浜嬩欢鎵撳紑绐楀彛
    + * @param title 缂栬緫妗嗘爣棰
    + * @param addurl//鐩爣椤甸潰鍦板潃
    + * @param id//涓婚敭瀛楁
    + */
    +function update(title,url, id,width,height) {
    +	gridname=id;
    +	var rowsData = $('#'+id).datagrid('getSelections');
    +	if (!rowsData || rowsData.length==0) {
    +		tip('璇烽夋嫨缂栬緫椤圭洰');
    +		return;
    +	}
    +	if (rowsData.length>1) {
    +		tip('璇烽夋嫨涓鏉¤褰曞啀缂栬緫');
    +		return;
    +	}
    +	
    +	url += '&id='+rowsData[0].id;
    +	createwindow(title,url,width,height);
    +}
    +
    +/**
    + * 濡傛灉椤甸潰鏄缁嗘煡鐪嬮〉闈紝鏃犳晥鍖栨墍鏈夎〃鍗曞厓绱狅紝鍙兘杩涜鏌ョ湅
    + */
    +$(function(){
    +	if(location.href.indexOf("load=detail")!=-1){
    +		$(":input").attr("disabled","true");
    +		//$(":input").attr("style","border:0;border-bottom:1 solid black;background:white;");
    +	}
    +});
    +
    +/**
    + * 鏌ョ湅璇︾粏浜嬩欢鎵撳紑绐楀彛
    + * @param title 鏌ョ湅妗嗘爣棰
    + * @param addurl//鐩爣椤甸潰鍦板潃
    + * @param id//涓婚敭瀛楁
    + */
    +function detail(title,url, id,width,height) {
    +	var rowsData = $('#'+id).datagrid('getSelections');
    +//	if (rowData.id == '') {
    +//		tip('璇烽夋嫨鏌ョ湅椤圭洰');
    +//		return;
    +//	}
    +	
    +	if (!rowsData || rowsData.length == 0) {
    +		tip('璇烽夋嫨鏌ョ湅椤圭洰');
    +		return;
    +	}
    +	if (rowsData.length > 1) {
    +		tip('璇烽夋嫨涓鏉¤褰曞啀鏌ョ湅');
    +		return;
    +	}
    +    url += '&load=detail&id='+rowsData[0].id;
    +	createdetailwindow(title,url,width,height);
    +}
    +
    +/**
    + * 澶氳褰曞埅闄よ珛姹
    + * @param title
    + * @param url
    + * @param gname
    + * @return
    + */
    +function deleteALLSelect(title,url,gname) {
    +	gridname=gname;
    +    var ids = [];
    +    var rows = $("#"+gname).datagrid('getSelections');
    +    if (rows.length > 0) {
    +    	$.dialog.confirm('浣犵‘瀹氭案涔呭垹闄よ鏁版嵁鍚?', function(r) {
    +		   if (r) {
    +				for ( var i = 0; i < rows.length; i++) {
    +					ids.push(rows[i].id);
    +				}
    +				$.ajax({
    +					url : url,
    +					type : 'post',
    +					data : {
    +						ids : ids.join(',')
    +					},
    +					cache : false,
    +					success : function(data) {
    +						var d = $.parseJSON(data);
    +						if (d.success) {
    +							var msg = d.msg;
    +							tip(msg);
    +							reloadTable();
    +							$("#"+gname).datagrid('unselectAll');
    +							ids='';
    +						}
    +					}
    +				});
    +			}
    +		});
    +	} else {
    +		tip("璇烽夋嫨闇瑕佸垹闄ょ殑鏁版嵁");
    +	}
    +}
    +
    +/**
    + * 鏌ョ湅鏃剁殑寮瑰嚭绐楀彛
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + */
    +function createdetailwindow(title, addurl,width,height) {
    +	width = width?width:700;
    +	height = height?height:400;
    +	if(width=="100%" || height=="100%"){
    +		width = window.top.document.body.offsetWidth;
    +		height =window.top.document.body.offsetHeight-100;
    +	}
    +	if(typeof(windowapi) == 'undefined'){
    +		$.dialog({
    +			content: 'url:'+addurl,
    +			lock : true,
    +			width:width,
    +			height: height,
    +			title:title,
    +			opacity : 0.3,
    +			cache:false, 
    +		    cancelVal: '鍏抽棴',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		}).zindex();
    +	}else{
    +		W.$.dialog({
    +			content: 'url:'+addurl,
    +			lock : true,
    +			width:width,
    +			height: height,
    +			parent:windowapi,
    +			title:title,
    +			opacity : 0.3,
    +			cache:false, 
    +		    cancelVal: '鍏抽棴',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		}).zindex();
    +	}
    +	
    +}
    +/**
    + * 鍏ㄥ睆缂栬緫
    + * @param title 缂栬緫妗嗘爣棰
    + * @param addurl//鐩爣椤甸潰鍦板潃
    + * @param id//涓婚敭瀛楁
    + */
    +function editfs(title,url) {
    +	var name=gridname;
    +	 if (rowid == '') {
    +		tip('璇烽夋嫨缂栬緫椤圭洰');
    +		return;
    +	}
    +	url += '&id='+rowid;
    +	openwindow(title,url,name,800,500);
    +}
    +// 鍒犻櫎璋冪敤鍑芥暟
    +function delObj(url,name) {
    +	gridname=name;
    +	createdialog('鍒犻櫎纭 ', '纭畾鍒犻櫎璇ヨ褰曞悧 ?', url,name);
    +}
    +// 鍒犻櫎璋冪敤鍑芥暟
    +function confuploadify(url, id) {
    +	$.dialog.confirm('纭畾鍒犻櫎鍚', function(){
    +		deluploadify(url, id);
    +	}, function(){
    +	}).zindex();
    +}
    +/**
    + * 鎵ц鍒犻櫎闄勪欢
    + * 
    + * @param url
    + * @param index
    + */
    +function deluploadify(url, id) {
    +	$.ajax({
    +		async : false,
    +		cache : false,
    +		type : 'POST',
    +		url : url,// 璇锋眰鐨刟ction璺緞
    +		error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +		},
    +		success : function(data) {
    +			var d = $.parseJSON(data);
    +			if (d.success) {
    +				$("#" + id).remove();// 绉婚櫎SPAN
    +				m.remove(id);// 绉婚櫎MAP瀵硅薄鍐呭瓧绗︿覆
    +			}
    +
    +		}
    +	});
    +}
    +// 鏅氳闂搷浣滆皟鐢ㄥ嚱鏁
    +function confirm(url, content,name) {
    +	createdialog('鎻愮ず淇℃伅 ', content, url,name);
    +}
    +/**
    + * 鎻愮ず淇℃伅
    + */
    +function tip_old(msg) {
    +	$.dialog.setting.zIndex = 1980;
    +	$.dialog.tips(msg, 1);
    +}
    +/**
    + * 鎻愮ず淇℃伅
    + */
    +function tip(msg) {
    +	try{
    +		$.dialog.setting.zIndex = 1980;
    +		$.messager.show({
    +			title : '鎻愮ず淇℃伅',
    +			msg : msg,
    +			timeout : 1000 * 6
    +		});
    +	}catch(e){
    +		alertTipTop(msg,'10%');
    +	}
    +}
    +
    +function alertTipTop(msg,top,title) {
    +	$.dialog.setting.zIndex = 1980;
    +	title = title?title:"鎻愮ず淇℃伅";
    +	$.dialog({
    +			title:title,
    +			icon:'tips.gif',
    +			top:top,
    +			content: msg
    +		}).zindex();
    +}
    +
    +/**
    + * 鎻愮ず淇℃伅鍍廰lert涓鏍
    + */
    +function alertTip(msg,title) {
    +	$.dialog.setting.zIndex = 1980;
    +	title = title?title:"鎻愮ず淇℃伅";
    +	$.dialog({
    +			title:title,
    +			icon:'tips.gif',
    +			content: msg
    +		}).zindex();
    +}
    +/**
    + * 鍒涘缓娣诲姞鎴栫紪杈戠獥鍙
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + */
    +function createwindow(title, addurl,width,height) {
    +	width = width?width:700;
    +	height = height?height:400;
    +	if(width=="100%" || height=="100%"){
    +		width = window.top.document.body.offsetWidth;
    +		height =window.top.document.body.offsetHeight-100;
    +	}
    +    //--author锛欽ueYue---------date锛20140427---------for锛氬脊鍑篵ug淇敼,璁剧疆浜唞index()鍑芥暟
    +	if(typeof(windowapi) == 'undefined'){
    +		$.dialog({
    +			content: 'url:'+addurl,
    +			lock : true,
    +			//zIndex:1990,
    +			width:width,
    +			height:height,
    +			title:title,
    +			opacity : 0.3,
    +			cache:false,
    +		    ok: function(){
    +		    	iframe = this.iframe.contentWindow;
    +				saveObj();
    +				return false;
    +		    },
    +		    cancelVal: '鍏抽棴',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		}).zindex();
    +	}else{
    +		W.$.dialog({
    +			content: 'url:'+addurl,
    +			lock : true,
    +			width:width,
    +			//zIndex:1990,
    +			height:height,
    +			parent:windowapi,
    +			title:title,
    +			opacity : 0.3,
    +			cache:false,
    +		    ok: function(){
    +		    	iframe = this.iframe.contentWindow;
    +				saveObj();
    +				return false;
    +		    },
    +		    cancelVal: '鍏抽棴',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		}).zindex();
    +	}
    +    //--author锛欽ueYue---------date锛20140427---------for锛氬脊鍑篵ug淇敼,璁剧疆浜唞index()鍑芥暟
    +	
    +}
    +/**
    + * 鍒涘缓涓婁紶椤甸潰绐楀彛
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + */
    +function openuploadwin(title, url,name,width, height) {
    +	gridname=name;
    +	$.dialog({
    +	    content: 'url:'+url,
    +	    cache:false,
    +	    button: [
    +	        {
    +	            name: "寮濮嬩笂浼",
    +	            callback: function(){
    +	            	iframe = this.iframe.contentWindow;
    +					iframe.upload();
    +					return false;
    +	            },
    +	            focus: true
    +	        },
    +	        {
    +	            name: "鍙栨秷涓婁紶",
    +	            callback: function(){
    +	            	iframe = this.iframe.contentWindow;
    +					iframe.cancel();
    +	            }
    +	        }
    +	    ]
    +	}).zindex();
    +}
    +/**
    + * 鍒涘缓鏌ヨ椤甸潰绐楀彛
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + */
    +function opensearchdwin(title, url, width, height) {
    +	$.dialog({
    +		content: 'url:'+url,
    +		title : title,
    +		lock : true,
    +		height : height,
    +		cache:false,
    +		width : width,
    +		opacity : 0.3,
    +		button : [ {
    +			name : '鏌ヨ',
    +			callback : function() {
    +				iframe = this.iframe.contentWindow;
    +				iframe.searchs();
    +			},
    +			focus : true
    +		}, {
    +			name : '鍙栨秷',
    +			callback : function() {
    +
    +			}
    +		} ]
    +	}).zindex();
    +}
    +/**
    + * 鍒涘缓涓嶅甫鎸夐挳鐨勭獥鍙
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + */
    +function openwindow(title, url,name, width, height) {
    +	gridname=name;
    +	if (typeof (width) == 'undefined'&&typeof (height) != 'undefined')
    +	{
    +		if(typeof(windowapi) == 'undefined'){
    +			$.dialog({
    +				content: 'url:'+url,
    +				title : title,
    +				cache:false,
    +				lock : true,
    +				width: 'auto',
    +			    height: height
    +			}).zindex();
    +		}else{
    +			$.dialog({
    +				content: 'url:'+url,
    +				title : title,
    +				cache:false,
    +				parent:windowapi,
    +				lock : true,
    +				width: 'auto',
    +			    height: height
    +			}).zindex();
    +		}
    +	}
    +	if (typeof (height) == 'undefined'&&typeof (width) != 'undefined')
    +	{
    +		if(typeof(windowapi) == 'undefined'){
    +			$.dialog({
    +				content: 'url:'+url,
    +				title : title,
    +				lock : true,
    +				width: width,
    +				cache:false,
    +			    height: 'auto'
    +			}).zindex();
    +		}else{
    +			$.dialog({
    +				content: 'url:'+url,
    +				title : title,
    +				lock : true,
    +				parent:windowapi,
    +				width: width,
    +				cache:false,
    +			    height: 'auto'
    +			}).zindex();
    +		}
    +	}
    +	if (typeof (width) == 'undefined'&&typeof (height) == 'undefined')
    +	{
    +		if(typeof(windowapi) == 'undefined'){
    +			$.dialog({
    +				content: 'url:'+url,
    +				title : title,
    +				lock : true,
    +				width: 'auto',
    +				cache:false,
    +			    height: 'auto'
    +			}).zindex();
    +		}else{
    +			$.dialog({
    +				content: 'url:'+url,
    +				title : title,
    +				lock : true,
    +				parent:windowapi,
    +				width: 'auto',
    +				cache:false,
    +			    height: 'auto'
    +			}).zindex();
    +		}
    +	}
    +	
    +	if (typeof (width) != 'undefined'&&typeof (height) != 'undefined')
    +	{
    +		if(typeof(windowapi) == 'undefined'){
    +			$.dialog({
    +				width: width,
    +			    height:height,
    +				content: 'url:'+url,
    +				title : title,
    +				cache:false,
    +				lock : true
    +			}).zindex();
    +		}else{
    +			$.dialog({
    +				width: width,
    +			    height:height,
    +				content: 'url:'+url,
    +				parent:windowapi,
    +				title : title,
    +				cache:false,
    +				lock : true
    +			}).zindex();
    +		}
    +	}
    +}
    +
    +/**
    + * 鍒涘缓璇㈤棶绐楀彛
    + * 
    + * @param title
    + * @param content
    + * @param url
    + */
    +function createdialog(title, content, url,name) {
    +	$.dialog.confirm(content, function(){
    +		doSubmit(url,name);
    +		rowid = '';
    +	}, function(){
    +	}).zindex();
    +}
    +/**
    + * 鎵ц淇濆瓨
    + * 
    + * @param url
    + * @param gridname
    + */
    +function saveObj() {
    +	$('#btn_sub', iframe.document).click();
    +}
    +
    +/**
    + * 鎵цAJAX鎻愪氦FORM
    + * 
    + * @param url
    + * @param gridname
    + */
    +function ajaxSubForm(url) {
    +	$('#myform', iframe.document).form('submit', {
    +		url : url,
    +		onSubmit : function() {
    +			iframe.editor.sync();
    +		},
    +		success : function(r) {
    +			tip('鎿嶄綔鎴愬姛');
    +			reloadTable();
    +		}
    +	});
    +}
    +/**
    + * 鎵ц鏌ヨ
    + * 
    + * @param url
    + * @param gridname
    + */
    +function search() {
    +
    +	$('#btn_sub', iframe.document).click();
    +	iframe.search();
    +}
    +
    +/**
    + * 鎵ц鎿嶄綔
    + * 
    + * @param url
    + * @param index
    + */
    +function doSubmit(url,name,data) {
    +	gridname=name;
    +	//--author锛欽ueYue ---------date锛20140227---------for锛氭妸URL杞崲鎴怭OST鍙傛暟闃叉URL鍙傛暟瓒呭嚭鑼冨洿鐨勯棶棰
    +	var paramsData = data;
    +	if(!paramsData){
    +		paramsData = new Object();
    +		if (url.indexOf("&") != -1) {
    +			var str = url.substr(url.indexOf("&")+1);
    +			url = url.substr(0,url.indexOf("&"));
    +			var strs = str.split("&");
    +			for(var i = 0; i < strs.length; i ++) {
    +				paramsData[strs[i].split("=")[0]]=(strs[i].split("=")[1]);
    +			}
    +		}      
    +	}
    +	//--author锛欽ueYue ---------date锛20140227---------for锛氭妸URL杞崲鎴怭OST鍙傛暟闃叉URL鍙傛暟瓒呭嚭鑼冨洿鐨勯棶棰
    +	$.ajax({
    +		async : false,
    +		cache : false,
    +		type : 'POST',
    +		data : paramsData,
    +		url : url,// 璇锋眰鐨刟ction璺緞
    +		error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +		},
    +		success : function(data) {
    +			var d = $.parseJSON(data);
    +			if (d.success) {
    +				var msg = d.msg;
    +				tip(msg);
    +				reloadTable();
    +			}
    +		}
    +	});
    +	
    +	
    +}
    +/**
    + * 閫鍑虹‘璁ゆ
    + * 
    + * @param url
    + * @param content
    + * @param index
    + */
    +function exit(url, content) {
    +	$.dialog.confirm(content, function(){
    +		window.location = url;
    +	}, function(){
    +	}).zindex();
    +}
    +/**
    + * 妯℃澘椤甸潰ajax鎻愪氦
    + * 
    + * @param url
    + * @param gridname
    + */
    +function ajaxdoSub(url, formname) {
    +	$('#' + formname).form('submit', {
    +		url : url,
    +		onSubmit : function() {
    +			editor.sync();
    +		},
    +		success : function(r) {
    +			tip('鎿嶄綔鎴愬姛');
    +		}
    +	});
    +}
    +/**
    + * ajax鎻愪氦FORM
    + * 
    + * @param url
    + * @param gridname
    + */
    +function ajaxdoForm(url, formname) {
    +	$('#' + formname).form('submit', {
    +		url : url,
    +		onSubmit : function() {
    +		},
    +		success : function(r) {
    +			tip('鎿嶄綔鎴愬姛');
    +		}
    +	});
    +}
    +
    +function opensubwin(title, url, saveurl, okbutton, closebutton) {
    +	$.dialog({
    +		content: 'url:'+url,
    +		title : title,
    +		lock : true,
    +		opacity : 0.3,
    +		button : [ {
    +			name : okbutton,
    +			callback : function() {
    +				iframe = this.iframe.contentWindow;
    +				win = frameElement.api.opener;// 鏉ユ簮椤甸潰
    +				$('#btn_sub', iframe.document).click();
    +				return false;
    +			}
    +		}, {
    +			name : closebutton,
    +			callback : function() {
    +			}
    +		} ]
    +
    +	}).zindex();
    +}
    +
    +function openauditwin(title, url, saveurl, okbutton, backbutton, closebutton) {
    +	$.dialog({
    +		content: 'url:'+url,
    +		title : title,
    +		lock : true,
    +		opacity : 0.3,
    +		button : [ {
    +			name : okbutton,
    +			callback : function() {
    +				iframe = this.iframe.contentWindow;
    +				win = $.dialog.open.origin;// 鏉ユ簮椤甸潰
    +				$('#btn_sub', iframe.document).click();
    +				return false;
    +			}
    +		}, {
    +			name : backbutton,
    +			callback : function() {
    +				iframe = this.iframe.contentWindow;
    +				win = frameElement.api.opener;// 鏉ユ簮椤甸潰
    +				$('#formobj', iframe.document).form('submit', {
    +					url : saveurl + "&code=exit",
    +					onSubmit : function() {
    +						$('#code').val('exit');
    +					},
    +					success : function(r) {
    +						$.dialog.tips('鎿嶄綔鎴愬姛', 2);
    +						win.location.reload();
    +					}
    +				});
    +
    +			}
    +		}, {
    +			name : closebutton,
    +			callback : function() {
    +			}
    +		} ]
    +
    +	}).zindex();
    +}
    +/*鑾峰彇Cookie鍊*/
    +function getCookie(c_name)
    +{
    +	if (document.cookie.length > 0) {
    +		c_start = document.cookie.indexOf(c_name + "=")
    +		if (c_start != -1) {
    +			c_start = c_start + c_name.length + 1
    +			c_end = document.cookie.indexOf(";", c_start)
    +			if (c_end == -1)
    +				c_end = document.cookie.length
    +			return unescape(document.cookie.substring(c_start, c_end))
    +		}
    +	}
    +	return ""
    +}
    +// 娣诲姞鏍囩
    +function addOneTab(subtitle, url, icon) {
    +	var indexStyle = getCookie("JEECGINDEXSTYLE");
    +	if(indexStyle=='sliding'||indexStyle=='bootstrap'||indexStyle=='ace'){
    +		//shortcut鍜宐ootstrap椋庢牸鐨則ab璺宠浆鏀逛负鐩存帴璺宠浆
    +		window.location.href=url;
    +	}else{
    +		if (icon == '') {
    +			icon = 'icon folder';
    +		}
    +		window.top.$.messager.progress({
    +			text : '椤甸潰鍔犺浇涓....',
    +			interval : 300
    +		});
    +		window.top.$('#maintabs').tabs({
    +			onClose : function(subtitle, index) {
    +				window.top.$.messager.progress('close');
    +			}
    +		});
    +		if (window.top.$('#maintabs').tabs('exists', subtitle)) {
    +			window.top.$('#maintabs').tabs('select', subtitle);
    +			if (url.indexOf('isHref') != -1) {
    +				window.top.$('#maintabs').tabs('update', {
    +					tab : window.top.$('#maintabs').tabs('getSelected'),
    +					options : {
    +						title : subtitle,
    +						href:url,
    +						//content : '<iframe src="' + url + '" frameborder="0" style="border:0;width:100%;height:99.4%;"></iframe>',
    +						closable : true,
    +						icon : icon
    +					}
    +				});
    +			}else {
    +				window.top.$('#maintabs').tabs('update', {
    +					tab : window.top.$('#maintabs').tabs('getSelected'),
    +					options : {
    +						title : subtitle,
    +						content : '<iframe src="' + url + '" frameborder="0" style="border:0;width:100%;height:99.4%;"></iframe>',
    +						//content : '<iframe src="' + url + '" frameborder="0" style="border:0;width:100%;height:99.4%;"></iframe>',
    +						closable : true,
    +						icon : icon
    +					}
    +				});
    +			}
    +		} else {
    +			if (url.indexOf('isHref') != -1) {
    +				window.top.$('#maintabs').tabs('add', {
    +					title : subtitle,
    +					href:url,
    +					closable : true,
    +					icon : icon
    +				});
    +			}else {
    +				window.top.$('#maintabs').tabs('add', {
    +					title : subtitle,
    +					content : '<iframe src="' + url + '" frameborder="0" style="border:0;width:100%;height:99.4%;"></iframe>',
    +					closable : true,
    +					icon : icon
    +				});
    +			}
    +		}
    +	}
    +}
    +// 鍏抽棴鑷韩TAB鍒锋柊鐖禩ABgrid
    +function closetab(title) {
    +	//鏆傛椂鍏堜笉鍒锋柊
    +	//window.top.document.getElementById('tabiframe').contentWindow.reloadTable();
    +	//window.top.document.getElementById('maintabs').contentWindow.reloadTable();
    +	window.top.$('#maintabs').tabs('close', title);
    +	//tip("娣诲姞鎴愬姛");
    +}
    +
    +//popup  
    +//object: this  name:闇瑕侀夋嫨鐨勫垪琛ㄧ殑瀛楁  code:鍔ㄦ佹姤琛ㄧ殑code
    +function inputClick(obj,name,code) {
    +	 $.dialog.setting.zIndex = 2002;
    +	 if(name==""||code==""){
    +		 alert("popup鍙傛暟閰嶇疆涓嶅叏");
    +		 return;
    +	 }
    +	 if(typeof(windowapi) == 'undefined'){
    +		 $.dialog({
    +				content: "url:cgReportController.do?popup&id="+code,
    +				lock : true,
    +				title:"閫夋嫨",
    +				width:800,
    +				height: 400,
    +				cache:false,
    +			    ok: function(){
    +			    	iframe = this.iframe.contentWindow;
    +			    	var selected = iframe.getSelectRows();
    +			    	if (selected == '' || selected == null ){
    +				    	alert("璇烽夋嫨");
    +			    		return false;
    +				    }else {
    +					    var str = "";
    +				    	$.each( selected, function(i, n){
    +					    	if (i==0)
    +					    	str+= n[name];
    +					    	else
    +				    		str+= ","+n[name];
    +				    	});
    +				    	$(obj).val("");
    +				    	//$('#myText').searchbox('setValue', str);
    +					    $(obj).val(str);
    +				    	return true;
    +				    }
    +					
    +			    },
    +			    cancelVal: '鍏抽棴',
    +			    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +			}).zindex();
    +		}else{
    +			$.dialog({
    +				content: "url:cgReportController.do?popup&id="+code,
    +				lock : true,
    +				title:"閫夋嫨",
    +				width:800,
    +				height: 400,
    +				parent:windowapi,
    +				cache:false,
    +			    ok: function(){
    +			    	iframe = this.iframe.contentWindow;
    +			    	var selected = iframe.getSelectRows();
    +			    	if (selected == '' || selected == null ){
    +				    	alert("璇烽夋嫨");
    +			    		return false;
    +				    }else {
    +					    var str = "";
    +				    	$.each( selected, function(i, n){
    +					    	if (i==0)
    +					    	str+= n[name];
    +					    	else
    +				    		str+= ","+n[name];
    +				    	});
    +				    	$(obj).val("");
    +				    	//$('#myText').searchbox('setValue', str);
    +					    $(obj).val(str);
    +				    	return true;
    +				    }
    +					
    +			    },
    +			    cancelVal: '鍏抽棴',
    +			    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +			}).zindex();
    +		}
    +}
    +/*
    +	鑷畾涔塽rl鐨勫脊鍑
    +	obj:瑕佸~鍏呯殑鎺т欢,鍙互涓哄涓紝浠ラ楀彿鍒嗛殧
    +	name:鍒楄〃涓搴旂殑瀛楁,鍙互涓哄涓紝浠ラ楀彿鍒嗛殧锛堜笌obj瑕佸搴旓級
    +	url锛氬脊鍑洪〉闈㈢殑Url
    +*/
    +function popClick(obj,name,url) {
    +	 $.dialog.setting.zIndex = 2001;
    +	var names = name.split(",");
    +	var objs = obj.split(",");
    +	 if(typeof(windowapi) == 'undefined'){
    +		 $.dialog({
    +				content: "url:"+url,
    +				lock : true,
    +				title:"閫夋嫨",
    +				width:700,
    +				height: 400,
    +				cache:false,
    +			    ok: function(){
    +			    	iframe = this.iframe.contentWindow;
    +			    	var selected = iframe.getSelectRows();
    +			    	if (selected == '' || selected == null ){
    +				    	alert("璇烽夋嫨");
    +			    		return false;
    +				    }else {
    +				    	for(var i1=0;i1<names.length;i1++){
    +						    var str = "";
    +					    	$.each( selected, function(i, n){
    +						    	if (i==0)
    +						    	str+= n[names[i1]];
    +						    	else{
    +									str+= ",";
    +									str+=n[names[i1]];
    +								}
    +					    	});
    +							if($("#"+objs[i1]).length>=1){
    +								$("#"+objs[i1]).val("");
    +								$("#"+objs[i1]).val(str);
    +							}else{
    +								$("input[name='"+objs[i1]+"']").val("");
    +								$("input[name='"+objs[i1]+"']").val(str);
    +							}
    +						 }
    +				    	return true;
    +				    }
    +					 
    +			    },
    +			    cancelVal: '鍏抽棴',
    +			    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +			}).zindex();
    +		}else{
    +			$.dialog({
    +				content: "url:"+url,
    +				lock : true,
    +				title:"閫夋嫨",
    +				width:700,
    +				height: 400,
    +				parent:windowapi,
    +				cache:false,
    +			     ok: function(){
    +			    	iframe = this.iframe.contentWindow;
    +			    	var selected = iframe.getSelectRows();
    +			    	if (selected == '' || selected == null ){
    +				    	alert("璇烽夋嫨");
    +			    		return false;
    +				    }else {
    +				    	for(var i1=0;i1<names.length;i1++){
    +						    var str = "";
    +					    	$.each( selected, function(i, n){
    +						    	if (i==0)
    +						    	str+= n[names[i1]];
    +						    	else{
    +									str+= ",";
    +									str+=n[names[i1]];
    +								}
    +					    	});
    +					    	if($("#"+objs[i1]).length>=1){
    +								$("#"+objs[i1]).val("");
    +								$("#"+objs[i1]).val(str);
    +							}else{
    +								$("[name='"+objs[i1]+"']").val("");
    +								$("[name='"+objs[i1]+"']").val(str);
    +							}
    +						 }
    +				    	return true;
    +				    }
    +					
    +			    },
    +			    cancelVal: '鍏抽棴',
    +			    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +			}).zindex();
    +		}
    +}
    +/**
    + * Jeecg Excel 瀵煎嚭
    + * 浠e叆鏌ヨ鏉′欢
    + */
    +function JeecgExcelExport(url,datagridId){
    +	var queryParams = $('#'+datagridId).datagrid('options').queryParams;
    +	$('#'+datagridId+'tb').find('*').each(function() {
    +	    queryParams[$(this).attr('name')] = $(this).val();
    +	});
    +	var params = '&';
    +	$.each(queryParams, function(key, val){
    +		params+='&'+key+'='+val;
    +	}); 
    +	var fields = '&field=';
    +	$.each($('#'+ datagridId).datagrid('options').columns[0], function(i, val){
    +		if(val.field != 'opt'){
    +			fields+=val.field+',';
    +		}
    +	}); 
    +	window.location.href = url+ encodeURI(fields+params);
    +}
    +/**
    + * 鑷姩瀹屾垚鐨勮В鏋愬嚱鏁
    + * @param data
    + * @returns {Array}
    + */
    +function jeecgAutoParse(data){
    +	var parsed = [];
    +    	$.each(data.rows,function(index,row){
    +    		parsed.push({data:row,result:row,value:row.id});
    +    	});
    +			return parsed;
    +}
    diff --git a/src/main/webapp/plug-in/tools/dataformat.js b/src/main/webapp/plug-in/tools/dataformat.js
    new file mode 100644
    index 00000000..5105b995
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/dataformat.js
    @@ -0,0 +1,40 @@
    +锘//鏃堕棿鏍煎紡鍖
    +Date.prototype.format = function (format,value) {
    +	/*
    +	 * eg:format="yyyy-MM-dd hh:mm:ss";
    +	 */
    +	if (!format) {
    +		format = "yyyy-MM-dd hh:mm:ss";
    +	}
    +	if(value==''||value==null){
    +		return '';
    +	}
    +	var strdata=value.replace(/-/g,"/");
    +	var index=strdata.indexOf(".");
    +	if(index>0)
    +	{
    +		strdata=strdata.substr(0,index);
    +	}
    +	var date= new Date(Date.parse(strdata));
    +	var o = {
    +		"M+" : date.getMonth() + 1, // month
    +		"d+" : date.getDate(), // day
    +		"h+" : date.getHours(), // hour
    +		"m+" : date.getMinutes(), // minute
    +		"s+" : date.getSeconds(), // second
    +		"q+" : Math.floor((date.getMonth() + 3) / 3), // quarter
    +		"S" : date.getMilliseconds()
    +		// millisecond
    +	};
    +	
    +	if (/(y+)/.test(format)) {
    +		format = format.replace(RegExp.$1, strdata.substr(4-RegExp.$1.length,RegExp.$1.length));
    +	}
    +	
    +	for (var k in o) {
    +		if (new RegExp("(" + k + ")").test(format)) {
    +			format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
    +		}
    +	}
    +	return format;
    +};
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/tools/easycurd.js b/src/main/webapp/plug-in/tools/easycurd.js
    new file mode 100644
    index 00000000..89a03226
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/easycurd.js
    @@ -0,0 +1,290 @@
    +锘/**
    + * 鍒櫎璜嬫眰
    + * 
    + * @param url
    + * @param index
    + */
    +function Del(url, index) {
    +	$.messager.confirm('鍒犻櫎鎻愮ず', '浣犵‘瀹氭案涔呭垹闄よ鏁版嵁鍚?', function(r) {
    +		if (r) {
    +			delSubmit(url, index);
    +		}
    +	});
    +}
    +$(function() {
    +	$.messager.defaults = {
    +		ok : "纭畾",
    +		cancel : "鍙栨秷"
    +	};
    +});
    +/**
    + * 鎵ц鏂规硶鍓嶈闂
    + * 
    + * @param url
    + * @param index
    + */
    +function confirm(url, message, index) {
    +	$.messager.confirm('鎻愮ず淇℃伅', message, function(r) {
    +		if (r) {
    +			changeStatus(url, index);
    +		}
    +
    +	});
    +}
    +/**
    + * 鍩疯淇濆瓨
    + * 
    + * @param url
    + * @param gridname
    + */
    +function saveDeclare(url) {
    +	$('#fm').form('submit', {
    +		url : url,
    +		onSubmit : function() {
    +			return $(this).form('validate');
    +		},
    +		success : function(r) {
    +			$("#test").dialog("close");
    +			reloadTable();
    +
    +		}
    +	});
    +}
    +
    +/**
    + * 娣诲姞
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + * @param id
    + * @param gridname
    + */
    +function add(title, addurl, saveurl) {
    +	openaddorupwin(title, addurl, saveurl);
    +}
    +/**
    + * 鏇存柊
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + * @param id
    + * @param gridname
    + */
    +function update(title, addurl, saveurl, id) {
    +	var val = getSelected(id);
    +	if (val == '') {
    +		$.messager.show({
    +			title : title,
    +			msg : '璇烽夋嫨缂栬緫椤圭洰',
    +			timeout : 2000,
    +			showType : 'slide'
    +		});
    +		return;
    +	}
    +	addurl += '&' + id + '=' + val;
    +	openaddorupwin(title, addurl, saveurl);
    +}
    +/**
    + * 娣诲姞鏇存柊鎵撻枊绐楀彛
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + * @param id
    + * @param gridname
    + */
    +function openaddorupwin(title, addurl, saveurl) {
    +	$.createWin({
    +		title : title,
    +		winId : 'test',
    +		url : addurl,
    +		height : 420,
    +		target : 'body',
    +		width : 650,
    +		iconCls : 'icon-save',
    +		modal : false,
    +		buttons : [ {
    +			text : '纭畾',
    +			iconCls : 'icon-ok',
    +			handler : function() {
    +				saveDeclare(saveurl);
    +			}
    +		}, {
    +			text : '閲嶇疆',
    +			iconCls : 'icon-cancel',
    +			handler : function() {
    +				$("#test").dialog("close");
    +
    +			}
    +		} ],
    +		onComplete : function() {
    +		}
    +	// tools:[{iconCls:"icon-add"}],
    +	// toolbar:[{text:'鎸夐挳',iconCls:"icon-add"}]
    +	});
    +}
    +
    +/**
    + * 娣诲姞娲绘洿鏂版墦闁嬬獥鍙
    + * 
    + * @param title
    + * @param addurl
    + * @param saveurl
    + * @param id
    + * @param gridname
    + */
    +function openwin(title, addurl, width, height) {
    +	$.createWin({
    +		title : title,
    +		winId : 'test',
    +		url : addurl,
    +		width : width === undefined ? 500 : width,
    +		height : height === undefined ? 300 : height,
    +		target : 'body',
    +		iconCls : 'icon-save',
    +		modal : true,
    +		onComplete : function() {
    +		}
    +	});
    +}
    +/**
    + * 鎵ц璇㈤棶鏂规硶
    + * 
    + * @param url
    + * @param index
    + */
    +function changeStatus(url, index) {
    +	$.ajax({
    +		async : false,
    +		cache : false,
    +		type : 'POST',
    +		url : url,// 璇锋眰鐨刟ction璺緞
    +		error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +		},
    +		success : function(data) {
    +			var d = $.parseJSON(data);
    +			if (d.success) {
    +				$.messager.show({
    +					title : '鎻愮ず娑堟伅',
    +					msg : '鎻愪氦鎴愬姛',
    +					timeout : 2000,
    +					showType : 'slide'
    +				});
    +				reloadTable();
    +			}
    +		}
    +	});
    +}
    +/**
    + * 鍒犻櫎鎵ц
    + * 
    + * @param url
    + * @param index
    + */
    +function delSubmit(url, index) {
    +	$.ajax({
    +		async : false,
    +		cache : false,
    +		type : 'POST',
    +		url : url,// 璇锋眰鐨刟ction璺緞
    +		error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +		},
    +		success : function(data) {
    +			var d = $.parseJSON(data);
    +			if (d.success) {
    +				$.messager.show({
    +					title : '鎻愮ず娑堟伅',
    +					msg : '鍒犻櫎鎴愬姛',
    +					timeout : 2000,
    +					showType : 'slide'
    +				});
    +				reloadTable();
    +			}
    +		}
    +	});
    +}
    +/**
    + * 绐楀彛鎵撳紑
    + */
    +$(function() {
    +	$('body').append(
    +			'<div id="myWindow" class="easyui-dialog" closed="true"></div>');
    +});
    +function openwindow(title, href, width, height, modal, minimizable, maximizable) {
    +
    +	var $win;
    +	$win = $('#myWindow').dialog(
    +			{
    +				title : title,
    +				width : width === undefined ? 600 : width,
    +				height : height === undefined ? 400 : height,
    +				top : ($(window).height() - 420) * 0.5,
    +				left : ($(window).width() - 350) * 0.5,
    +
    +				content : '<iframe scrolling="no" frameborder="0" src="' + href
    +						+ '" style="width:100%;height:100%;"></iframe>',
    +				// href : href === undefined ? null : href,
    +				modal : modal === undefined ? true : modal,
    +				minimizable : minimizable === undefined ? false : minimizable,
    +				maximizable : maximizable === undefined ? false : maximizable,
    +				shadow : true,
    +				cache : false,
    +				closed : false,
    +				collapsible : false,
    +				draggable : true,
    +				resizable : true,
    +				loadingMessage : '姝e湪鍔犺浇鏁版嵁锛岃绋嶇瓑鐗囧埢......',
    +				buttons : [ {
    +					text : '鍏抽棴',
    +					iconCls : "icon-add",
    +					handler : function() {
    +						$("#myWindow").dialog("close");
    +					}
    +				} ]
    +			});
    +}
    +/**
    + * 妯℃澘椤甸潰ajax鎻愪氦
    + * 
    + * @param url
    + * @param gridname
    + */
    +function ajaxdoSub(url, formname) {
    +	$('#' + formname).form('submit', {
    +		url : url,
    +		onSubmit : function() {
    +			$("#infocontent").val($('#content').html());
    +		},
    +		success : function(r) {
    +			$.messager.show({
    +				title : '鎻愮ず娑堟伅',
    +				msg : '淇濆瓨鎴愬姛',
    +				timeout : 2000,
    +				showType : 'slide'
    +			});
    +		}
    +	});
    +}
    +/**
    + * ajax鎻愪氦FORM
    + * 
    + * @param url
    + * @param gridname
    + */
    +function ajaxdoForm(url, formname) {
    +	$('#' + formname).form('submit', {
    +		url : url,
    +		onSubmit : function() {
    +		},
    +		success : function(r) {
    +			$.messager.show({
    +				title : '鎻愮ず娑堟伅',
    +				msg : '淇濆瓨鎴愬姛',
    +				timeout : 2000,
    +				showType : 'slide'
    +			});
    +		}
    +	});
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/tools/easyuiextend.js b/src/main/webapp/plug-in/tools/easyuiextend.js
    new file mode 100644
    index 00000000..2f9bb496
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/easyuiextend.js
    @@ -0,0 +1,136 @@
    +$.fn.panel.defaults.onBeforeDestroy = function() {/* tab鍏抽棴鏃跺洖鏀跺唴瀛 */
    +	var frame = $('iframe', this);
    +	try {
    +		if (frame.length > 0) {
    +			frame[0].contentWindow.document.write('');
    +			frame[0].contentWindow.close();
    +			frame.remove();
    +			if ($.browser.msie) {
    +				CollectGarbage();
    +			}
    +		} else {
    +			$(this).find('.combo-f').each(function() {
    +				var panel = $(this).data().combo.panel;
    +				panel.panel('destroy');
    +			});
    +		}
    +	} catch (e) {
    +	}
    +};
    +$.parser.onComplete = function() {/* 椤甸潰鎵鏈塭asyui缁勪欢娓叉煋鎴愬姛鍚庯紝闅愯棌绛夊緟淇℃伅 */
    +	if ($.browser.msie && $.browser.version < 7) {/* 瑙e喅IE6鐨凱NG鑳屾櫙涓嶉忔槑BUG */
    +	}
    +	window.setTimeout(function() {
    +		window.top.$.messager.progress('close');
    +	}, 200);
    +};
    +/**
    + * 閮ㄧ讲娴佺▼鍥
    + * 
    + * @param deploymentId
    + * @param resourceName
    + */
    +function deploymentimg(deploymentId, resourceName,title) {
    +	if (typeof (title) == 'undefined') {
    +		title = "";
    +	}
    +	openwindow('娴佺▼閮ㄧ讲璇︾粏鍥--'+title, 'activitiController.do?openProcessPic&tag=deployment&deploymentId=' + deploymentId + '&resourceName=' + resourceName);
    +}
    +/**
    + * 鍔炵悊杩囩▼娴佺▼鍥
    + * 
    + * @param taskId
    + */
    +function processimg(taskId, title) {
    +	if (typeof (title) == 'undefined') {
    +		title = "";
    +	}
    +	openwindow('娴佺▼杩涘害--褰撳墠鑺傜偣:' + title, 'activitiController.do?openProcessPic&tag=task&taskId=' + taskId);
    +}
    +/**
    + * 椤圭洰鍒楄〃娴佺▼鍥炬煡鐪
    + * @param taskId
    + * @param title
    + * @param width
    + * @param height
    + */
    +function progress(busKey, title) {
    +	if (typeof (title) == 'undefined') {
    +		title = "";
    +	}
    +	openwindow('娴佺▼杩涘害--褰撳墠鑺傜偣:' + title, 'activitiController.do?openProcessPic&tag=project&businessKey='+ busKey);
    +}
    +/**
    + * 鎵撳紑娴佺▼鍔炵悊椤甸潰
    + */
    +function openhandle(taskId, title, width, height) {
    +	if (typeof (width) == 'undefined') {
    +		width = "auto";
    +	}
    +	if (typeof (height) == 'undefined') {
    +		height = "auto";
    +	}
    +	if (typeof (title) == 'undefined') {
    +		title = "";
    +	}
    +	var url = 'activitiController.do?openProcessHandle&taskId=' + taskId;
    +	$.dialog({
    +		content: 'url:'+url,
    +		title : '娴佺▼鍔炵悊--褰撳墠鐜妭:' + title,
    +		lock : true,
    +		opacity : 0.3,
    +		button : [ {
    +			name : '鍚屾剰',
    +			callback : function() {
    +				iframe = this.iframe.contentWindow;
    +				var inputvar = $("[vartype]", iframe.document);
    +				setvar(true, inputvar, iframe);
    +				saveObj();
    +				return false;
    +
    +			},
    +			focus : true
    +		}, {
    +			name : '椹冲洖',
    +			callback : function() {
    +				iframe = this.iframe.contentWindow;
    +				var inputvar = $("[vartype]", iframe.document);
    +				setvar(false, inputvar, iframe);
    +				saveObj();
    +				return false;
    +			}
    +		} ]
    +	});
    +}
    +/**
    + * 璁剧疆娴佺▼鍙橀噺
    + * 
    + * @param flag
    + *          鎿嶄綔鏍囩ず
    + * @param varobj//浣滀负娴佺▼鍙橀噺鐨勫璞¢泦鍚
    + * @param iframe//椤甸潰瀵硅薄
    + */
    +function setvar(flag, varobj, iframe) {
    +	var keys = "opt,", values = flag + ",", types = "B,", tag = "";
    +	if (!flag) {
    +		// tag="Back";//椹冲洖鎿嶄綔鏃跺彉閲忔坊鍔犲悗缂
    +	}
    +	varobj.each(function() {
    +		var value = this.value;
    +		if (value == "") {
    +			if (flag) {
    +				value = "鍚屾剰";
    +			} else {
    +				value = "涓嶅悓鎰";
    +			}
    +		}
    +		keys += this.id + tag + ",";
    +		values += value + ",";
    +		types += $("#" + this.id, iframe.document).attr("vartype") + ",";
    +	});
    +	$("#keys", iframe.document).val(keys);
    +	$("#values", iframe.document).val(values);
    +	$("#types", iframe.document).val(types);
    +}
    +
    +
    diff --git a/src/main/webapp/plug-in/tools/jquery.cookie.js b/src/main/webapp/plug-in/tools/jquery.cookie.js
    new file mode 100644
    index 00000000..fcacce9f
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/jquery.cookie.js
    @@ -0,0 +1,30 @@
    +锘縥Query.cookie = function (key, value, options) {
    +
    +    // key and value given, set cookie...
    +    if (arguments.length > 1 && (value === null || typeof value !== "object")) {
    +        options = jQuery.extend({}, options);
    +
    +        if (value === null) {
    +            options.expires = -1;
    +        }
    +
    +        if (typeof options.expires === 'number') {
    +            var days = options.expires, t = options.expires = new Date();
    +            t.setDate(t.getDate() + days);
    +        }
    +
    +        return (document.cookie = [
    +            encodeURIComponent(key), '=',
    +            options.raw ? String(value) : encodeURIComponent(String(value)),
    +            options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
    +            options.path ? '; path=' + options.path : '',
    +            options.domain ? '; domain=' + options.domain : '',
    +            options.secure ? '; secure' : ''
    +        ].join(''));
    +    }
    +
    +    // key and possibly options given, get cookie...
    +    options = value || {};
    +    var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
    +    return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
    +};
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/tools/json.js b/src/main/webapp/plug-in/tools/json.js
    new file mode 100644
    index 00000000..1c2b2538
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/json.js
    @@ -0,0 +1,530 @@
    +/*
    +    json.js
    +    2011-08-30
    +
    +    Public Domain
    +
    +    No warranty expressed or implied. Use at your own risk.
    +
    +    This file has been superceded by http://www.JSON.org/json2.js
    +
    +    See http://www.JSON.org/js.html
    +
    +    This code should be minified before deployment.
    +    See http://javascript.crockford.com/jsmin.html
    +
    +    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
    +    NOT CONTROL.
    +
    +    This file adds these methods to JavaScript:
    +
    +        object.toJSONString(whitelist)
    +            This method produce a JSON text from a JavaScript value.
    +            It must not contain any cyclical references. Illegal values
    +            will be excluded.
    +
    +            The default conversion for dates is to an ISO string. You can
    +            add a toJSONString method to any date object to get a different
    +            representation.
    +
    +            The object and array methods can take an optional whitelist
    +            argument. A whitelist is an array of strings. If it is provided,
    +            keys in objects not found in the whitelist are excluded.
    +
    +        string.parseJSON(filter)
    +            This method parses a JSON text to produce an object or
    +            array. It can throw a SyntaxError exception.
    +
    +            The optional filter parameter is a function which can filter and
    +            transform the results. It receives each of the keys and values, and
    +            its return value is used instead of the original value. If it
    +            returns what it received, then structure is not modified. If it
    +            returns undefined then the member is deleted.
    +
    +            Example:
    +
    +            // Parse the text. If a key contains the string 'date' then
    +            // convert the value to a date.
    +
    +            myData = text.parseJSON(function (key, value) {
    +                return key.indexOf('date') >= 0 ? new Date(value) : value;
    +            });
    +
    +    This file will break programs with improper for..in loops. See
    +    http://yuiblog.com/blog/2006/09/26/for-in-intrigue/
    +
    +    This file creates a global JSON object containing two methods: stringify
    +    and parse.
    +
    +        JSON.stringify(value, replacer, space)
    +            value       any JavaScript value, usually an object or array.
    +
    +            replacer    an optional parameter that determines how object
    +                        values are stringified for objects. It can be a
    +                        function or an array of strings.
    +
    +            space       an optional parameter that specifies the indentation
    +                        of nested structures. If it is omitted, the text will
    +                        be packed without extra whitespace. If it is a number,
    +                        it will specify the number of spaces to indent at each
    +                        level. If it is a string (such as '\t' or '&nbsp;'),
    +                        it contains the characters used to indent at each level.
    +
    +            This method produces a JSON text from a JavaScript value.
    +
    +            When an object value is found, if the object contains a toJSON
    +            method, its toJSON method will be called and the result will be
    +            stringified. A toJSON method does not serialize: it returns the
    +            value represented by the name/value pair that should be serialized,
    +            or undefined if nothing should be serialized. The toJSON method
    +            will be passed the key associated with the value, and this will be
    +            bound to the object holding the key.
    +
    +            For example, this would serialize Dates as ISO strings.
    +
    +                Date.prototype.toJSON = function (key) {
    +                    function f(n) {
    +                        // Format integers to have at least two digits.
    +                        return n < 10 ? '0' + n : n;
    +                    }
    +
    +                    return this.getUTCFullYear()   + '-' +
    +                         f(this.getUTCMonth() + 1) + '-' +
    +                         f(this.getUTCDate())      + 'T' +
    +                         f(this.getUTCHours())     + ':' +
    +                         f(this.getUTCMinutes())   + ':' +
    +                         f(this.getUTCSeconds())   + 'Z';
    +                };
    +
    +            You can provide an optional replacer method. It will be passed the
    +            key and value of each member, with this bound to the containing
    +            object. The value that is returned from your method will be
    +            serialized. If your method returns undefined, then the member will
    +            be excluded from the serialization.
    +
    +            If the replacer parameter is an array of strings, then it will be
    +            used to select the members to be serialized. It filters the results
    +            such that only members with keys listed in the replacer array are
    +            stringified.
    +
    +            Values that do not have JSON representations, such as undefined or
    +            functions, will not be serialized. Such values in objects will be
    +            dropped; in arrays they will be replaced with null. You can use
    +            a replacer function to replace those with JSON values.
    +            JSON.stringify(undefined) returns undefined.
    +
    +            The optional space parameter produces a stringification of the
    +            value that is filled with line breaks and indentation to make it
    +            easier to read.
    +
    +            If the space parameter is a non-empty string, then that string will
    +            be used for indentation. If the space parameter is a number, then
    +            the indentation will be that many spaces.
    +
    +            Example:
    +
    +            text = JSON.stringify(['e', {pluribus: 'unum'}]);
    +            // text is '["e",{"pluribus":"unum"}]'
    +
    +
    +            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
    +            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
    +
    +            text = JSON.stringify([new Date()], function (key, value) {
    +                return this[key] instanceof Date ?
    +                    'Date(' + this[key] + ')' : value;
    +            });
    +            // text is '["Date(---current time---)"]'
    +
    +
    +        JSON.parse(text, reviver)
    +            This method parses a JSON text to produce an object or array.
    +            It can throw a SyntaxError exception.
    +
    +            The optional reviver parameter is a function that can filter and
    +            transform the results. It receives each of the keys and values,
    +            and its return value is used instead of the original value.
    +            If it returns what it received, then the structure is not modified.
    +            If it returns undefined then the member is deleted.
    +
    +            Example:
    +
    +            // Parse the text. Values that look like ISO date strings will
    +            // be converted to Date objects.
    +
    +            myData = JSON.parse(text, function (key, value) {
    +                var a;
    +                if (typeof value === 'string') {
    +                    a =
    +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
    +                    if (a) {
    +                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
    +                            +a[5], +a[6]));
    +                    }
    +                }
    +                return value;
    +            });
    +
    +            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
    +                var d;
    +                if (typeof value === 'string' &&
    +                        value.slice(0, 5) === 'Date(' &&
    +                        value.slice(-1) === ')') {
    +                    d = new Date(value.slice(5, -1));
    +                    if (d) {
    +                        return d;
    +                    }
    +                }
    +                return value;
    +            });
    +
    +
    +    This is a reference implementation. You are free to copy, modify, or
    +    redistribute.
    +*/
    +
    +/*jslint evil: true, regexp: true, unparam: true */
    +
    +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
    +    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
    +    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
    +    lastIndex, length, parse, parseJSON, prototype, push, replace, slice,
    +    stringify, test, toJSON, toJSONString, toString, valueOf
    +*/
    +
    +
    +// Create a JSON object only if one does not already exist. We create the
    +// methods in a closure to avoid creating global variables.
    +
    +var JSON;
    +if (!JSON) {
    +    JSON = {};
    +}
    +
    +(function () {
    +    'use strict';
    +
    +    function f(n) {
    +        // Format integers to have at least two digits.
    +        return n < 10 ? '0' + n : n;
    +    }
    +
    +    if (typeof Date.prototype.toJSON !== 'function') {
    +
    +        Date.prototype.toJSON = function (key) {
    +
    +            return isFinite(this.valueOf()) ?
    +                this.getUTCFullYear()     + '-' +
    +                f(this.getUTCMonth() + 1) + '-' +
    +                f(this.getUTCDate())      + 'T' +
    +                f(this.getUTCHours())     + ':' +
    +                f(this.getUTCMinutes())   + ':' +
    +                f(this.getUTCSeconds())   + 'Z' : null;
    +        };
    +
    +        String.prototype.toJSON      =
    +            Number.prototype.toJSON  =
    +            Boolean.prototype.toJSON = function (key) {
    +                return this.valueOf();
    +            };
    +    }
    +
    +    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
    +        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
    +        gap,
    +        indent,
    +        meta = {    // table of character substitutions
    +            '\b': '\\b',
    +            '\t': '\\t',
    +            '\n': '\\n',
    +            '\f': '\\f',
    +            '\r': '\\r',
    +            '"' : '\\"',
    +            '\\': '\\\\'
    +        },
    +        rep;
    +
    +
    +    function quote(string) {
    +
    +// If the string contains no control characters, no quote characters, and no
    +// backslash characters, then we can safely slap some quotes around it.
    +// Otherwise we must also replace the offending characters with safe escape
    +// sequences.
    +
    +        escapable.lastIndex = 0;
    +        return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
    +            var c = meta[a];
    +            return typeof c === 'string' ? c :
    +                '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
    +        }) + '"' : '"' + string + '"';
    +    }
    +
    +
    +    function str(key, holder) {
    +
    +// Produce a string from holder[key].
    +
    +        var i,          // The loop counter.
    +            k,          // The member key.
    +            v,          // The member value.
    +            length,
    +            mind = gap,
    +            partial,
    +            value = holder[key];
    +
    +// If the value has a toJSON method, call it to obtain a replacement value.
    +
    +        if (value && typeof value === 'object' &&
    +                typeof value.toJSON === 'function') {
    +            value = value.toJSON(key);
    +        }
    +
    +// If we were called with a replacer function, then call the replacer to
    +// obtain a replacement value.
    +
    +        if (typeof rep === 'function') {
    +            value = rep.call(holder, key, value);
    +        }
    +
    +// What happens next depends on the value's type.
    +
    +        switch (typeof value) {
    +        case 'string':
    +            return quote(value);
    +
    +        case 'number':
    +
    +// JSON numbers must be finite. Encode non-finite numbers as null.
    +
    +            return isFinite(value) ? String(value) : 'null';
    +
    +        case 'boolean':
    +        case 'null':
    +
    +// If the value is a boolean or null, convert it to a string. Note:
    +// typeof null does not produce 'null'. The case is included here in
    +// the remote chance that this gets fixed someday.
    +
    +            return String(value);
    +
    +// If the type is 'object', we might be dealing with an object or an array or
    +// null.
    +
    +        case 'object':
    +
    +// Due to a specification blunder in ECMAScript, typeof null is 'object',
    +// so watch out for that case.
    +
    +            if (!value) {
    +                return 'null';
    +            }
    +
    +// Make an array to hold the partial results of stringifying this object value.
    +
    +            gap += indent;
    +            partial = [];
    +
    +// Is the value an array?
    +
    +            if (Object.prototype.toString.apply(value) === '[object Array]') {
    +
    +// The value is an array. Stringify every element. Use null as a placeholder
    +// for non-JSON values.
    +
    +                length = value.length;
    +                for (i = 0; i < length; i += 1) {
    +                    partial[i] = str(i, value) || 'null';
    +                }
    +
    +// Join all of the elements together, separated with commas, and wrap them in
    +// brackets.
    +
    +                v = partial.length === 0 ? '[]' : gap ?
    +                    '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
    +                    '[' + partial.join(',') + ']';
    +                gap = mind;
    +                return v;
    +            }
    +
    +// If the replacer is an array, use it to select the members to be stringified.
    +
    +            if (rep && typeof rep === 'object') {
    +                length = rep.length;
    +                for (i = 0; i < length; i += 1) {
    +                    k = rep[i];
    +                    if (typeof k === 'string') {
    +                        v = str(k, value);
    +                        if (v) {
    +                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
    +                        }
    +                    }
    +                }
    +            } else {
    +
    +// Otherwise, iterate through all of the keys in the object.
    +
    +                for (k in value) {
    +                    if (Object.prototype.hasOwnProperty.call(value, k)) {
    +                        v = str(k, value);
    +                        if (v) {
    +                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
    +                        }
    +                    }
    +                }
    +            }
    +
    +// Join all of the member texts together, separated with commas,
    +// and wrap them in braces.
    +
    +            v = partial.length === 0 ? '{}' : gap ?
    +                '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
    +                '{' + partial.join(',') + '}';
    +            gap = mind;
    +            return v;
    +        }
    +    }
    +
    +// If the JSON object does not yet have a stringify method, give it one.
    +
    +    if (typeof JSON.stringify !== 'function') {
    +        JSON.stringify = function (value, replacer, space) {
    +
    +// The stringify method takes a value and an optional replacer, and an optional
    +// space parameter, and returns a JSON text. The replacer can be a function
    +// that can replace values, or an array of strings that will select the keys.
    +// A default replacer method can be provided. Use of the space parameter can
    +// produce text that is more easily readable.
    +
    +            var i;
    +            gap = '';
    +            indent = '';
    +
    +// If the space parameter is a number, make an indent string containing that
    +// many spaces.
    +
    +            if (typeof space === 'number') {
    +                for (i = 0; i < space; i += 1) {
    +                    indent += ' ';
    +                }
    +
    +// If the space parameter is a string, it will be used as the indent string.
    +
    +            } else if (typeof space === 'string') {
    +                indent = space;
    +            }
    +
    +// If there is a replacer, it must be a function or an array.
    +// Otherwise, throw an error.
    +
    +            rep = replacer;
    +            if (replacer && typeof replacer !== 'function' &&
    +                    (typeof replacer !== 'object' ||
    +                    typeof replacer.length !== 'number')) {
    +                throw new Error('JSON.stringify');
    +            }
    +
    +// Make a fake root object containing our value under the key of ''.
    +// Return the result of stringifying the value.
    +
    +            return str('', {'': value});
    +        };
    +    }
    +
    +
    +// If the JSON object does not yet have a parse method, give it one.
    +
    +    if (typeof JSON.parse !== 'function') {
    +        JSON.parse = function (text, reviver) {
    +
    +// The parse method takes a text and an optional reviver function, and returns
    +// a JavaScript value if the text is a valid JSON text.
    +
    +            var j;
    +
    +            function walk(holder, key) {
    +
    +// The walk method is used to recursively walk the resulting structure so
    +// that modifications can be made.
    +
    +                var k, v, value = holder[key];
    +                if (value && typeof value === 'object') {
    +                    for (k in value) {
    +                        if (Object.prototype.hasOwnProperty.call(value, k)) {
    +                            v = walk(value, k);
    +                            if (v !== undefined) {
    +                                value[k] = v;
    +                            } else {
    +                                delete value[k];
    +                            }
    +                        }
    +                    }
    +                }
    +                return reviver.call(holder, key, value);
    +            }
    +
    +
    +// Parsing happens in four stages. In the first stage, we replace certain
    +// Unicode characters with escape sequences. JavaScript handles many characters
    +// incorrectly, either silently deleting them, or treating them as line endings.
    +
    +            text = String(text);
    +            cx.lastIndex = 0;
    +            if (cx.test(text)) {
    +                text = text.replace(cx, function (a) {
    +                    return '\\u' +
    +                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
    +                });
    +            }
    +
    +// In the second stage, we run the text against regular expressions that look
    +// for non-JSON patterns. We are especially concerned with '()' and 'new'
    +// because they can cause invocation, and '=' because it can cause mutation.
    +// But just to be safe, we want to reject all unexpected forms.
    +
    +// We split the second stage into 4 regexp operations in order to work around
    +// crippling inefficiencies in IE's and Safari's regexp engines. First we
    +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
    +// replace all simple value tokens with ']' characters. Third, we delete all
    +// open brackets that follow a colon or comma or that begin the text. Finally,
    +// we look to see that the remaining characters are only whitespace or ']' or
    +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
    +
    +            if (/^[\],:{}\s]*$/
    +                    .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
    +                        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
    +                        .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
    +
    +// In the third stage we use the eval function to compile the text into a
    +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
    +// in JavaScript: it can begin a block or an object literal. We wrap the text
    +// in parens to eliminate the ambiguity.
    +
    +                j = eval('(' + text + ')');
    +
    +// In the optional fourth stage, we recursively walk the new structure, passing
    +// each name/value pair to a reviver function for possible transformation.
    +
    +                return typeof reviver === 'function' ?
    +                    walk({'': j}, '') : j;
    +            }
    +
    +// If the text is not JSON parseable, then a SyntaxError is thrown.
    +
    +            throw new SyntaxError('JSON.parse');
    +        };
    +    }
    +
    +// Augment the basic prototypes if they have not already been augmented.
    +// These forms are obsolete. It is recommended that JSON.stringify and
    +// JSON.parse be used instead.
    +
    +    if (!Object.prototype.toJSONString) {
    +        Object.prototype.toJSONString = function (filter) {
    +            return JSON.stringify(this, filter);
    +        };
    +        Object.prototype.parseJSON = function (filter) {
    +            return JSON.parse(this, filter);
    +        };
    +    }
    +}());
    diff --git a/src/main/webapp/plug-in/tools/json2.js b/src/main/webapp/plug-in/tools/json2.js
    new file mode 100644
    index 00000000..3b0c872d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/json2.js
    @@ -0,0 +1,487 @@
    +/*
    +    json2.js
    +    2011-10-19
    +
    +    Public Domain.
    +
    +    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
    +
    +    See http://www.JSON.org/js.html
    +
    +
    +    This code should be minified before deployment.
    +    See http://javascript.crockford.com/jsmin.html
    +
    +    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
    +    NOT CONTROL.
    +
    +
    +    This file creates a global JSON object containing two methods: stringify
    +    and parse.
    +
    +        JSON.stringify(value, replacer, space)
    +            value       any JavaScript value, usually an object or array.
    +
    +            replacer    an optional parameter that determines how object
    +                        values are stringified for objects. It can be a
    +                        function or an array of strings.
    +
    +            space       an optional parameter that specifies the indentation
    +                        of nested structures. If it is omitted, the text will
    +                        be packed without extra whitespace. If it is a number,
    +                        it will specify the number of spaces to indent at each
    +                        level. If it is a string (such as '\t' or '&nbsp;'),
    +                        it contains the characters used to indent at each level.
    +
    +            This method produces a JSON text from a JavaScript value.
    +
    +            When an object value is found, if the object contains a toJSON
    +            method, its toJSON method will be called and the result will be
    +            stringified. A toJSON method does not serialize: it returns the
    +            value represented by the name/value pair that should be serialized,
    +            or undefined if nothing should be serialized. The toJSON method
    +            will be passed the key associated with the value, and this will be
    +            bound to the value
    +
    +            For example, this would serialize Dates as ISO strings.
    +
    +                Date.prototype.toJSON = function (key) {
    +                    function f(n) {
    +                        // Format integers to have at least two digits.
    +                        return n < 10 ? '0' + n : n;
    +                    }
    +
    +                    return this.getUTCFullYear()   + '-' +
    +                         f(this.getUTCMonth() + 1) + '-' +
    +                         f(this.getUTCDate())      + 'T' +
    +                         f(this.getUTCHours())     + ':' +
    +                         f(this.getUTCMinutes())   + ':' +
    +                         f(this.getUTCSeconds())   + 'Z';
    +                };
    +
    +            You can provide an optional replacer method. It will be passed the
    +            key and value of each member, with this bound to the containing
    +            object. The value that is returned from your method will be
    +            serialized. If your method returns undefined, then the member will
    +            be excluded from the serialization.
    +
    +            If the replacer parameter is an array of strings, then it will be
    +            used to select the members to be serialized. It filters the results
    +            such that only members with keys listed in the replacer array are
    +            stringified.
    +
    +            Values that do not have JSON representations, such as undefined or
    +            functions, will not be serialized. Such values in objects will be
    +            dropped; in arrays they will be replaced with null. You can use
    +            a replacer function to replace those with JSON values.
    +            JSON.stringify(undefined) returns undefined.
    +
    +            The optional space parameter produces a stringification of the
    +            value that is filled with line breaks and indentation to make it
    +            easier to read.
    +
    +            If the space parameter is a non-empty string, then that string will
    +            be used for indentation. If the space parameter is a number, then
    +            the indentation will be that many spaces.
    +
    +            Example:
    +
    +            text = JSON.stringify(['e', {pluribus: 'unum'}]);
    +            // text is '["e",{"pluribus":"unum"}]'
    +
    +
    +            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
    +            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
    +
    +            text = JSON.stringify([new Date()], function (key, value) {
    +                return this[key] instanceof Date ?
    +                    'Date(' + this[key] + ')' : value;
    +            });
    +            // text is '["Date(---current time---)"]'
    +
    +
    +        JSON.parse(text, reviver)
    +            This method parses a JSON text to produce an object or array.
    +            It can throw a SyntaxError exception.
    +
    +            The optional reviver parameter is a function that can filter and
    +            transform the results. It receives each of the keys and values,
    +            and its return value is used instead of the original value.
    +            If it returns what it received, then the structure is not modified.
    +            If it returns undefined then the member is deleted.
    +
    +            Example:
    +
    +            // Parse the text. Values that look like ISO date strings will
    +            // be converted to Date objects.
    +
    +            myData = JSON.parse(text, function (key, value) {
    +                var a;
    +                if (typeof value === 'string') {
    +                    a =
    +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
    +                    if (a) {
    +                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
    +                            +a[5], +a[6]));
    +                    }
    +                }
    +                return value;
    +            });
    +
    +            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
    +                var d;
    +                if (typeof value === 'string' &&
    +                        value.slice(0, 5) === 'Date(' &&
    +                        value.slice(-1) === ')') {
    +                    d = new Date(value.slice(5, -1));
    +                    if (d) {
    +                        return d;
    +                    }
    +                }
    +                return value;
    +            });
    +
    +
    +    This is a reference implementation. You are free to copy, modify, or
    +    redistribute.
    +*/
    +
    +/*jslint evil: true, regexp: true */
    +
    +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
    +    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
    +    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
    +    lastIndex, length, parse, prototype, push, replace, slice, stringify,
    +    test, toJSON, toString, valueOf
    +*/
    +
    +
    +// Create a JSON object only if one does not already exist. We create the
    +// methods in a closure to avoid creating global variables.
    +
    +var JSON;
    +if (!JSON) {
    +    JSON = {};
    +}
    +
    +(function () {
    +    'use strict';
    +
    +    function f(n) {
    +        // Format integers to have at least two digits.
    +        return n < 10 ? '0' + n : n;
    +    }
    +
    +    if (typeof Date.prototype.toJSON !== 'function') {
    +
    +        Date.prototype.toJSON = function (key) {
    +
    +            return isFinite(this.valueOf())
    +                ? this.getUTCFullYear()     + '-' +
    +                    f(this.getUTCMonth() + 1) + '-' +
    +                    f(this.getUTCDate())      + 'T' +
    +                    f(this.getUTCHours())     + ':' +
    +                    f(this.getUTCMinutes())   + ':' +
    +                    f(this.getUTCSeconds())   + 'Z'
    +                : null;
    +        };
    +
    +        String.prototype.toJSON      =
    +            Number.prototype.toJSON  =
    +            Boolean.prototype.toJSON = function (key) {
    +                return this.valueOf();
    +            };
    +    }
    +
    +    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
    +        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
    +        gap,
    +        indent,
    +        meta = {    // table of character substitutions
    +            '\b': '\\b',
    +            '\t': '\\t',
    +            '\n': '\\n',
    +            '\f': '\\f',
    +            '\r': '\\r',
    +            '"' : '\\"',
    +            '\\': '\\\\'
    +        },
    +        rep;
    +
    +
    +    function quote(string) {
    +
    +// If the string contains no control characters, no quote characters, and no
    +// backslash characters, then we can safely slap some quotes around it.
    +// Otherwise we must also replace the offending characters with safe escape
    +// sequences.
    +
    +        escapable.lastIndex = 0;
    +        return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
    +            var c = meta[a];
    +            return typeof c === 'string'
    +                ? c
    +                : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
    +        }) + '"' : '"' + string + '"';
    +    }
    +
    +
    +    function str(key, holder) {
    +
    +// Produce a string from holder[key].
    +
    +        var i,          // The loop counter.
    +            k,          // The member key.
    +            v,          // The member value.
    +            length,
    +            mind = gap,
    +            partial,
    +            value = holder[key];
    +
    +// If the value has a toJSON method, call it to obtain a replacement value.
    +
    +        if (value && typeof value === 'object' &&
    +                typeof value.toJSON === 'function') {
    +            value = value.toJSON(key);
    +        }
    +
    +// If we were called with a replacer function, then call the replacer to
    +// obtain a replacement value.
    +
    +        if (typeof rep === 'function') {
    +            value = rep.call(holder, key, value);
    +        }
    +
    +// What happens next depends on the value's type.
    +
    +        switch (typeof value) {
    +        case 'string':
    +            return quote(value);
    +
    +        case 'number':
    +
    +// JSON numbers must be finite. Encode non-finite numbers as null.
    +
    +            return isFinite(value) ? String(value) : 'null';
    +
    +        case 'boolean':
    +        case 'null':
    +
    +// If the value is a boolean or null, convert it to a string. Note:
    +// typeof null does not produce 'null'. The case is included here in
    +// the remote chance that this gets fixed someday.
    +
    +            return String(value);
    +
    +// If the type is 'object', we might be dealing with an object or an array or
    +// null.
    +
    +        case 'object':
    +
    +// Due to a specification blunder in ECMAScript, typeof null is 'object',
    +// so watch out for that case.
    +
    +            if (!value) {
    +                return 'null';
    +            }
    +
    +// Make an array to hold the partial results of stringifying this object value.
    +
    +            gap += indent;
    +            partial = [];
    +
    +// Is the value an array?
    +
    +            if (Object.prototype.toString.apply(value) === '[object Array]') {
    +
    +// The value is an array. Stringify every element. Use null as a placeholder
    +// for non-JSON values.
    +
    +                length = value.length;
    +                for (i = 0; i < length; i += 1) {
    +                    partial[i] = str(i, value) || 'null';
    +                }
    +
    +// Join all of the elements together, separated with commas, and wrap them in
    +// brackets.
    +
    +                v = partial.length === 0
    +                    ? '[]'
    +                    : gap
    +                    ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
    +                    : '[' + partial.join(',') + ']';
    +                gap = mind;
    +                return v;
    +            }
    +
    +// If the replacer is an array, use it to select the members to be stringified.
    +
    +            if (rep && typeof rep === 'object') {
    +                length = rep.length;
    +                for (i = 0; i < length; i += 1) {
    +                    if (typeof rep[i] === 'string') {
    +                        k = rep[i];
    +                        v = str(k, value);
    +                        if (v) {
    +                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
    +                        }
    +                    }
    +                }
    +            } else {
    +
    +// Otherwise, iterate through all of the keys in the object.
    +
    +                for (k in value) {
    +                    if (Object.prototype.hasOwnProperty.call(value, k)) {
    +                        v = str(k, value);
    +                        if (v) {
    +                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
    +                        }
    +                    }
    +                }
    +            }
    +
    +// Join all of the member texts together, separated with commas,
    +// and wrap them in braces.
    +
    +            v = partial.length === 0
    +                ? '{}'
    +                : gap
    +                ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
    +                : '{' + partial.join(',') + '}';
    +            gap = mind;
    +            return v;
    +        }
    +    }
    +
    +// If the JSON object does not yet have a stringify method, give it one.
    +
    +    if (typeof JSON.stringify !== 'function') {
    +        JSON.stringify = function (value, replacer, space) {
    +
    +// The stringify method takes a value and an optional replacer, and an optional
    +// space parameter, and returns a JSON text. The replacer can be a function
    +// that can replace values, or an array of strings that will select the keys.
    +// A default replacer method can be provided. Use of the space parameter can
    +// produce text that is more easily readable.
    +
    +            var i;
    +            gap = '';
    +            indent = '';
    +
    +// If the space parameter is a number, make an indent string containing that
    +// many spaces.
    +
    +            if (typeof space === 'number') {
    +                for (i = 0; i < space; i += 1) {
    +                    indent += ' ';
    +                }
    +
    +// If the space parameter is a string, it will be used as the indent string.
    +
    +            } else if (typeof space === 'string') {
    +                indent = space;
    +            }
    +
    +// If there is a replacer, it must be a function or an array.
    +// Otherwise, throw an error.
    +
    +            rep = replacer;
    +            if (replacer && typeof replacer !== 'function' &&
    +                    (typeof replacer !== 'object' ||
    +                    typeof replacer.length !== 'number')) {
    +                throw new Error('JSON.stringify');
    +            }
    +
    +// Make a fake root object containing our value under the key of ''.
    +// Return the result of stringifying the value.
    +
    +            return str('', {'': value});
    +        };
    +    }
    +
    +
    +// If the JSON object does not yet have a parse method, give it one.
    +
    +    if (typeof JSON.parse !== 'function') {
    +        JSON.parse = function (text, reviver) {
    +
    +// The parse method takes a text and an optional reviver function, and returns
    +// a JavaScript value if the text is a valid JSON text.
    +
    +            var j;
    +
    +            function walk(holder, key) {
    +
    +// The walk method is used to recursively walk the resulting structure so
    +// that modifications can be made.
    +
    +                var k, v, value = holder[key];
    +                if (value && typeof value === 'object') {
    +                    for (k in value) {
    +                        if (Object.prototype.hasOwnProperty.call(value, k)) {
    +                            v = walk(value, k);
    +                            if (v !== undefined) {
    +                                value[k] = v;
    +                            } else {
    +                                delete value[k];
    +                            }
    +                        }
    +                    }
    +                }
    +                return reviver.call(holder, key, value);
    +            }
    +
    +
    +// Parsing happens in four stages. In the first stage, we replace certain
    +// Unicode characters with escape sequences. JavaScript handles many characters
    +// incorrectly, either silently deleting them, or treating them as line endings.
    +
    +            text = String(text);
    +            cx.lastIndex = 0;
    +            if (cx.test(text)) {
    +                text = text.replace(cx, function (a) {
    +                    return '\\u' +
    +                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
    +                });
    +            }
    +
    +// In the second stage, we run the text against regular expressions that look
    +// for non-JSON patterns. We are especially concerned with '()' and 'new'
    +// because they can cause invocation, and '=' because it can cause mutation.
    +// But just to be safe, we want to reject all unexpected forms.
    +
    +// We split the second stage into 4 regexp operations in order to work around
    +// crippling inefficiencies in IE's and Safari's regexp engines. First we
    +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
    +// replace all simple value tokens with ']' characters. Third, we delete all
    +// open brackets that follow a colon or comma or that begin the text. Finally,
    +// we look to see that the remaining characters are only whitespace or ']' or
    +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
    +
    +            if (/^[\],:{}\s]*$/
    +                    .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
    +                        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
    +                        .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
    +
    +// In the third stage we use the eval function to compile the text into a
    +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
    +// in JavaScript: it can begin a block or an object literal. We wrap the text
    +// in parens to eliminate the ambiguity.
    +
    +                j = eval('(' + text + ')');
    +
    +// In the optional fourth stage, we recursively walk the new structure, passing
    +// each name/value pair to a reviver function for possible transformation.
    +
    +                return typeof reviver === 'function'
    +                    ? walk({'': j}, '')
    +                    : j;
    +            }
    +
    +// If the text is not JSON parseable, then a SyntaxError is thrown.
    +
    +            throw new SyntaxError('JSON.parse');
    +        };
    +    }
    +}());
    diff --git a/src/main/webapp/plug-in/tools/leftmenu2.js b/src/main/webapp/plug-in/tools/leftmenu2.js
    new file mode 100644
    index 00000000..90e3d01d
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/leftmenu2.js
    @@ -0,0 +1,236 @@
    +锘$(function() {
    +	InitLeftMenu();
    +	tabClose();
    +	tabCloseEven();
    +	// 閲婃斁鍐呭瓨
    +	$.fn.panel.defaults = $.extend({}, $.fn.panel.defaults, {
    +		onBeforeDestroy : function() {
    +			var frame = $('iframe', this);
    +			if (frame.length > 0) {
    +				frame[0].contentWindow.document.write('');
    +				frame[0].contentWindow.close();
    +				frame.remove();
    +			}
    +			if ($.browser.msie) {
    +				CollectGarbage();
    +			}
    +		}
    +	});
    +	$('#maintabs').tabs({
    +		onSelect : function(title) {
    +			var currTab = $('#maintabs').tabs('getTab', title);
    +			var iframe = $(currTab.panel('options').content);
    +			var src = $("." + title).attr("href");
    +			currTab.find('iframe').attr('src', src);
    +		}
    +	});
    +});
    +// 鍒濆鍖栧乏渚
    +function InitLeftMenu() {
    +	$("#nav").accordion({
    +		animate : false
    +	});
    +	$.each(_menus.menus, function(i, n) {
    +		var menulist = '';
    +		menulist += '<ul>';
    +		$.each(n.menus, function(j, o) {
    +			menulist += '<li><div><a class="' + o.menuname
    +					+ '" target="tabiframe" ref="' + o.menuid + '" href="'
    +					+ o.url + '" ><span class="icon ' + o.icon
    +					+ '" >&nbsp;</span><span class="nav">' + o.menuname
    +					+ '</span></a></div></li> ';
    +		})
    +		menulist += '</ul>';
    +
    +		$('#nav').accordion('add', {
    +			title : n.menuname,
    +			content : menulist,
    +			iconCls : 'icon ' + n.icon
    +		});
    +
    +	});
    +
    +	$('.easyui-accordion li a').click(function() {
    +		var tabTitle = $(this).children('.nav').text();
    +
    +		var url = $(this).attr("href");
    +		var menuid = $(this).attr("ref");
    +		var icon = getIcon(menuid, icon);
    +		addOneTab(tabTitle, url, icon);
    +		$('.easyui-accordion li div').removeClass("selected");
    +		$(this).parent().addClass("selected");
    +	}).hover(function() {
    +		$(this).parent().addClass("hover");
    +	}, function() {
    +		$(this).parent().removeClass("hover");
    +	});
    +
    +	// 閫変腑绗竴涓
    +	var panels = $('#nav').accordion('panels');
    +	var t = panels[0].panel('options').title;
    +	$('#nav').accordion('select', t);
    +}
    +// 鑾峰彇宸︿晶瀵艰埅鐨勫浘鏍
    +function getIcon(menuid) {
    +	var icon = 'icon ';
    +	$.each(_menus.menus, function(i, n) {
    +		$.each(n.menus, function(j, o) {
    +			if (o.menuid == menuid) {
    +				icon += o.icon;
    +			}
    +		});
    +	});
    +
    +	return icon;
    +}
    +
    +function addTab(subtitle, url, icon) {
    +	$.messager.progress({
    +		text : loading,
    +		interval : 1000
    +	});
    +	if (!$('#maintabs').tabs('exists', subtitle)) {
    +		$('#maintabs').tabs('add', {
    +			title : subtitle,
    +			content : createFrame(),
    +			closable : true,
    +			icon : icon
    +		});
    +	} else {
    +		$('#maintabs').tabs('select', subtitle);
    +		$.messager.progress('close');
    +	}
    +
    +	// $('#maintabs').tabs('select',subtitle);
    +	tabClose();
    +
    +}
    +var title_now;
    +function addOneTab(subtitle, url, icon) {
    +	$.messager.progress({
    +		text : loading,
    +		interval : 1000
    +	});
    +	if ($('#maintabs').tabs('exists', title_now)) {
    +		$('#maintabs').tabs('select', title_now);
    +		$('#maintabs').tabs('update', {
    +			tab : $('#maintabs').tabs('getSelected'),
    +			options : {
    +				title : subtitle,
    +				content : createFrame(),
    +				closable : false,
    +				icon : icon
    +			}
    +		});
    +	} else {
    +		$('#maintabs').tabs('add', {
    +			title : subtitle,
    +			content : createFrame(),
    +			closable : false,
    +			icon : icon
    +		});
    +	}
    +	title_now = subtitle;
    +	// $('#maintabs').tabs('select',subtitle);
    +	tabClose();
    +
    +}
    +
    +function createFrame() {
    +	var s = '<iframe name="tabiframe"  scrolling="no" frameborder="0"  src="about:blank" style="width:100%;height:99%;"></iframe>';
    +	return s;
    +}
    +
    +function tabClose() {
    +	/* 鍙屽嚮鍏抽棴TAB閫夐」鍗 */
    +	$(".tabs-inner").dblclick(function() {
    +		var subtitle = $(this).children(".tabs-closable").text();
    +		$('#tabs').tabs('close', subtitle);
    +	})
    +	/* 涓洪夐」鍗$粦瀹氬彸閿 */
    +	$(".tabs-inner").bind('contextmenu', function(e) {
    +		$('#mm').menu('show', {
    +			left : e.pageX,
    +			top : e.pageY
    +		});
    +
    +		var subtitle = $(this).children(".tabs-closable").text();
    +
    +		$('#mm').data("currtab", subtitle);
    +		// $('#maintabs').tabs('select',subtitle);
    +		return false;
    +	});
    +}
    +// 缁戝畾鍙抽敭鑿滃崟浜嬩欢
    +function tabCloseEven() {
    +	// 鍒锋柊
    +	$('#mm-tabupdate').click(function() {
    +		var currTab = $('#maintabs').tabs('getSelected');
    +		var url = $(currTab.panel('options').content).attr('src');
    +		$('#maintabs').tabs('update', {
    +			tab : currTab,
    +			options : {
    +				content : createFrame(url)
    +			}
    +		})
    +	})
    +	// 鍏抽棴褰撳墠
    +	$('#mm-tabclose').click(function() {
    +		var currtab_title = $('#mm').data("currtab");
    +		$('#maintabs').tabs('close', currtab_title);
    +	})
    +	// 鍏ㄩ儴鍏抽棴
    +	$('#mm-tabcloseall').click(function() {
    +		$('.tabs-inner span').each(function(i, n) {
    +			var t = $(n).text();
    +			$('#maintabs').tabs('close', t);
    +		});
    +	});
    +	// 鍏抽棴闄ゅ綋鍓嶄箣澶栫殑TAB
    +	$('#mm-tabcloseother').click(function() {
    +		$('#mm-tabcloseright').click();
    +		$('#mm-tabcloseleft').click();
    +	});
    +	// 鍏抽棴褰撳墠鍙充晶鐨凾AB
    +	$('#mm-tabcloseright').click(function() {
    +		var nextall = $('.tabs-selected').nextAll();
    +		if (nextall.length == 0) {
    +			// msgShow('绯荤粺鎻愮ず','鍚庤竟娌℃湁鍟~','error');
    +			alert('鍚庤竟娌℃湁鍟~');
    +			return false;
    +		}
    +		nextall.each(function(i, n) {
    +			var t = $('a:eq(0) span', $(n)).text();
    +			$('#maintabs').tabs('close', t);
    +		});
    +		return false;
    +	});
    +	// 鍏抽棴褰撳墠宸︿晶鐨凾AB
    +	$('#mm-tabcloseleft').click(function() {
    +		var prevall = $('.tabs-selected').prevAll();
    +		if (prevall.length == 0) {
    +			alert('鍒板ご浜嗭紝鍓嶈竟娌℃湁鍟~');
    +			return false;
    +		}
    +		prevall.each(function(i, n) {
    +			var t = $('a:eq(0) span', $(n)).text();
    +			$('#maintabs').tabs('close', t);
    +		});
    +		return false;
    +	});
    +
    +	// 閫鍑
    +	$("#mm-exit").click(function() {
    +		$('#mm').menu('hide');
    +	});
    +}
    +
    +$.parser.onComplete = function() {/* 椤甸潰鎵鏈塭asyui缁勪欢娓叉煋鎴愬姛鍚庯紝闅愯棌绛夊緟淇℃伅 */
    +	if ($.browser.msie && $.browser.version < 7) {/* 瑙e喅IE6鐨凱NG鑳屾櫙涓嶉忔槑BUG */
    +		sy.pngFun();
    +		sy.bgPngFun($('span'));
    +	}
    +	window.setTimeout(function() {
    +		$.messager.progress('close');
    +	}, 1000);
    +};
    diff --git a/src/main/webapp/plug-in/tools/prohibitutil.js b/src/main/webapp/plug-in/tools/prohibitutil.js
    new file mode 100644
    index 00000000..a23ce557
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/prohibitutil.js
    @@ -0,0 +1,33 @@
    +$(document).ready(function() {
    +	// 绂佹鍙抽敭
    +	$(document).bind("contextmenu", function() {
    +		return false;
    +	});
    +	// 绂佹閫夋嫨
    +	$(document).bind("selectstart", function() {
    +		return false;
    +	});
    +	// 绂佹Ctrl+C 鍜孋trl+A
    +	$(document).keydown(function(event) {
    +
    +		if ((event.ctrlKey && event.which == 67) || (event.ctrlKey && event.which == 86)) {
    +			return false;
    +		}
    +		if ((event.ctrlKey) && (event.keyCode == 82)) {
    +			return false;
    +		}
    +		if (event.keyCode == 116) {
    +			return false; // 灞忚斀F5鍒锋柊閿
    +		}
    +		if (event.keyCode == 8) {
    +			return false; // 灞忚斀閫鏍煎垹闄ら敭
    +		}
    +		if ((event.altKey) && ((event.keyCode == 37) || // 灞忚斀 Alt+ 鏂瑰悜閿 鈫
    +		(event.keyCode == 39))) // 灞忚斀 Alt+ 鏂瑰悜閿 鈫
    +		{
    +			event.returnValue = false;
    +			return false;
    +		}
    +
    +	});
    +});
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/tools/syUtil.js b/src/main/webapp/plug-in/tools/syUtil.js
    new file mode 100644
    index 00000000..2966af23
    --- /dev/null
    +++ b/src/main/webapp/plug-in/tools/syUtil.js
    @@ -0,0 +1,368 @@
    +/**
    + * @author 瀛欏畤
    + * 
    + * @requires jQuery,EasyUI
    + * 
    + * panel鍏抽棴鏃跺洖鏀跺唴瀛橈紝涓昏鐢ㄤ簬layout浣跨敤iframe宓屽叆缃戦〉鏃剁殑鍐呭瓨娉勬紡闂
    + */
    +$.fn.panel.defaults.onBeforeDestroy = function() {
    +	var frame = $('iframe', this);
    +	try {
    +		if (frame.length > 0) {
    +			for ( var i = 0; i < frame.length; i++) {
    +				frame[i].contentWindow.document.write('');
    +				frame[i].contentWindow.close();
    +			}
    +			frame.remove();
    +			if ($.browser.msie) {
    +				CollectGarbage();
    +			}
    +		}
    +	} catch (e) {
    +	}
    +};
    +
    +/**
    + * 浣縫anel鍜宒atagrid鍦ㄥ姞杞芥椂鎻愮ず
    + * 
    + * @author 瀛欏畤
    + * 
    + * @requires jQuery,EasyUI
    + * 
    + */
    +$.fn.panel.defaults.loadingMessage = '鍔犺浇涓....';
    +$.fn.datagrid.defaults.loadMsg = '鍔犺浇涓....';
    +
    +/**
    + * @author 瀛欏畤
    + * 
    + * @requires jQuery,EasyUI
    + * 
    + * 閫氱敤閿欒鎻愮ず
    + * 
    + * 鐢ㄤ簬datagrid/treegrid/tree/combogrid/combobox/form鍔犺浇鏁版嵁鍑洪敊鏃剁殑鎿嶄綔
    + */
    +var easyuiErrorFunction = function(XMLHttpRequest) {
    +	$.messager.progress('close');
    +	try{
    +		var emsg = XMLHttpRequest.responseText.substring(XMLHttpRequest.responseText.indexOf('閿欒鎻忚堪'),XMLHttpRequest.responseText.indexOf('閿欒淇℃伅'));
    +		 $.messager.alert('閿欒',emsg);
    +	}catch(ex){
    +		 $.messager.alert('閿欒',XMLHttpRequest.responseText+'');
    +	}
    +};
    +$.fn.datagrid.defaults.onLoadError = easyuiErrorFunction;
    +$.fn.treegrid.defaults.onLoadError = easyuiErrorFunction;
    +$.fn.tree.defaults.onLoadError = easyuiErrorFunction;
    +$.fn.combogrid.defaults.onLoadError = easyuiErrorFunction;
    +$.fn.combobox.defaults.onLoadError = easyuiErrorFunction;
    +$.fn.form.defaults.onLoadError = easyuiErrorFunction;
    +
    +/**
    + * @author 瀛欏畤
    + * 
    + * @requires jQuery,EasyUI
    + * 
    + * 涓篸atagrid銆乼reegrid澧炲姞琛ㄥご鑿滃崟锛岀敤浜庢樉绀烘垨闅愯棌鍒楋紝娉ㄦ剰锛氬喕缁撳垪涓嶅湪姝よ彍鍗曚腑
    + */
    +var createGridHeaderContextMenu = function(e, field) {
    +	e.preventDefault();
    +	var grid = $(this);/* grid鏈韩 */
    +	var headerContextMenu = this.headerContextMenu;/* grid涓婄殑鍒楀ご鑿滃崟瀵硅薄 */
    +	if (!headerContextMenu) {
    +		var tmenu = $('<div style="width:100px;"></div>').appendTo('body');
    +		var fields = grid.datagrid('getColumnFields');
    +		console.log('id='+grid.attr('id'));
    +		 storage=$.localStorage;if(!storage)storage=$.cookieStorage;
    +		var cols = storage.get(grid.attr('id')+'hiddenColumns');
    +		var init=true;
    +		if(cols){
    +			init=false;
    +		}
    +		for ( var i = 0; i < fields.length; i++) {
    +			var fildOption = grid.datagrid('getColumnOption', fields[i]);
    +			console.log(fields[i]+'='+fildOption.hidden);
    +			if (!fildOption.hidden||fildOption.hidden==false) {
    +				$('<div iconCls="icon-ok" field="' + fields[i] + '"/>').html(fildOption.title).appendTo(tmenu);
    +			} else {
    +				if(init==false){
    +					for(var j=0;j<cols.length;j++){
    +						if(cols[j].field==fields[i]&&cols[j].visible!=false){
    +							//console.log(cols[j].field+'=='+cols[j].visible);
    +							$('<div iconCls="icon-empty" field="' + fields[i] + '"/>').html(fildOption.title).appendTo(tmenu);
    +						}
    +					}
    +				}
    +			}
    +		}
    +		headerContextMenu = this.headerContextMenu = tmenu.menu({
    +			onClick : function(item) {
    +				var field = $(item.target).attr('field');
    +				if (item.iconCls == 'icon-ok') {
    +					grid.datagrid('hideColumn', field);
    +					$(this).menu('setIcon', {
    +						target : item.target,
    +						iconCls : 'icon-empty'
    +					});saveHeader(field,true);//榫欓噾娉㈡坊鍔犱繚瀛樿〃澶
    +				} else if (item.iconCls == 'icon-empty') {
    +					grid.datagrid('showColumn', field);
    +					$(this).menu('setIcon', {
    +						target : item.target,
    +						iconCls : 'icon-ok'
    +					});saveHeader(field,false);//榫欓噾娉㈡坊鍔犱繚瀛樿〃澶
    +				}else{
    +					//鎭㈠琛ㄥご
    +					
    +				}
    +			}
    +		});
    +	}
    +	headerContextMenu.menu('show', {
    +		left : e.pageX,
    +		top : e.pageY
    +	});
    +};
    +
    +$.fn.datagrid.defaults.onHeaderContextMenu = createGridHeaderContextMenu;
    +$.fn.treegrid.defaults.onHeaderContextMenu = createGridHeaderContextMenu;
    +
    +/**
    + * @author 瀛欏畤
    + * 
    + * @requires jQuery,EasyUI
    + * 
    + * 鎵╁睍validatebox锛屾坊鍔犻獙璇佷袱娆″瘑鐮佸姛鑳
    + */
    +$.extend($.fn.validatebox.defaults.rules, {
    +	eqPwd : {
    +		validator : function(value, param) {
    +			return value == $(param[0]).val();
    +		},
    +		message : '瀵嗙爜涓嶄竴鑷达紒'
    +	}
    +});
    +
    +/**
    + * @author 澶忔偢
    + * 
    + * @requires jQuery,EasyUI
    + * 
    + * 鎵╁睍tree锛屼娇鍏舵敮鎸佸钩婊戞暟鎹牸寮
    + */
    +$.fn.tree.defaults.loadFilter = function(data, parent) {
    +	var opt = $(this).data().tree.options;
    +	var idFiled, textFiled, parentField;
    +	if (opt.parentField) {
    +		idFiled = opt.idFiled || 'id';
    +		textFiled = opt.textFiled || 'text';
    +		parentField = opt.parentField;
    +		var i, l, treeData = [], tmpMap = [];
    +		for (i = 0, l = data.length; i < l; i++) {
    +			tmpMap[data[i][idFiled]] = data[i];
    +		}
    +		for (i = 0, l = data.length; i < l; i++) {
    +			if (tmpMap[data[i][parentField]] && data[i][idFiled] != data[i][parentField]) {
    +				if (!tmpMap[data[i][parentField]]['children'])
    +					tmpMap[data[i][parentField]]['children'] = [];
    +				data[i]['text'] = data[i][textFiled];
    +				tmpMap[data[i][parentField]]['children'].push(data[i]);
    +			} else {
    +				data[i]['text'] = data[i][textFiled];
    +				treeData.push(data[i]);
    +			}
    +		}
    +		return treeData;
    +	}
    +	return data;
    +};
    +
    +/**
    + * @author 瀛欏畤
    + * 
    + * @requires jQuery,EasyUI
    + * 
    + * 鎵╁睍treegrid锛屼娇鍏舵敮鎸佸钩婊戞暟鎹牸寮
    + */
    +$.fn.treegrid.defaults.loadFilter = function(data, parentId) {
    +	var opt = $(this).data().treegrid.options;
    +	var idFiled, textFiled, parentField;
    +	if (opt.parentField) {
    +		idFiled = opt.idFiled || 'id';
    +		textFiled = opt.textFiled || 'text';
    +		parentField = opt.parentField;
    +		var i, l, treeData = [], tmpMap = [];
    +		for (i = 0, l = data.length; i < l; i++) {
    +			tmpMap[data[i][idFiled]] = data[i];
    +		}
    +		for (i = 0, l = data.length; i < l; i++) {
    +			if (tmpMap[data[i][parentField]] && data[i][idFiled] != data[i][parentField]) {
    +				if (!tmpMap[data[i][parentField]]['children'])
    +					tmpMap[data[i][parentField]]['children'] = [];
    +				data[i]['text'] = data[i][textFiled];
    +				tmpMap[data[i][parentField]]['children'].push(data[i]);
    +			} else {
    +				data[i]['text'] = data[i][textFiled];
    +				treeData.push(data[i]);
    +			}
    +		}
    +		return treeData;
    +	}
    +	return data;
    +};
    +
    +/**
    + * @author 瀛欏畤
    + * 
    + * @requires jQuery,EasyUI
    + * 
    + * 鎵╁睍combotree锛屼娇鍏舵敮鎸佸钩婊戞暟鎹牸寮
    + */
    +$.fn.combotree.defaults.loadFilter = $.fn.tree.defaults.loadFilter;
    +
    +/**
    + * @author 瀛欏畤
    + * 
    + * @requires jQuery,EasyUI
    + * 
    + * 闃叉panel/window/dialog缁勪欢瓒呭嚭娴忚鍣ㄨ竟鐣
    + * @param left
    + * @param top
    + */
    +var easyuiPanelOnMove = function(left, top) {
    +	var l = left;
    +	var t = top;
    +	if (l < 1) {
    +		l = 1;
    +	}
    +	if (t < 1) {
    +		t = 1;
    +	}
    +	var width = parseInt($(this).parent().css('width')) + 14;
    +	var height = parseInt($(this).parent().css('height')) + 14;
    +	var right = l + width;
    +	var buttom = t + height;
    +	var browserWidth = $(window).width();
    +	var browserHeight = $(window).height();
    +	if (right > browserWidth) {
    +		l = browserWidth - width;
    +	}
    +	if (buttom > browserHeight) {
    +		t = browserHeight - height;
    +	}
    +	$(this).parent().css({/* 淇闈㈡澘浣嶇疆 */
    +		left : l,
    +		top : t
    +	});
    +};
    +$.fn.dialog.defaults.onMove = easyuiPanelOnMove;
    +$.fn.window.defaults.onMove = easyuiPanelOnMove;
    +$.fn.panel.defaults.onMove = easyuiPanelOnMove;
    +
    +/**
    + * @author 瀛欏畤
    + * 
    + * @requires jQuery,EasyUI,jQuery cookie plugin
    + * 
    + * 鏇存崲EasyUI涓婚鐨勬柟娉
    + * 
    + * @param themeName
    + *            涓婚鍚嶇О
    + */
    +changeTheme = function(themeName) {
    +	var $easyuiTheme = $('#easyuiTheme');
    +	var url = $easyuiTheme.attr('href');
    +	var href = url.substring(0, url.indexOf('themes')) + 'themes/' + themeName + '/easyui.css';
    +	$easyuiTheme.attr('href', href);
    +
    +	var $iframe = $('iframe');
    +	if ($iframe.length > 0) {
    +		for ( var i = 0; i < $iframe.length; i++) {
    +			var ifr = $iframe[i];
    +			$(ifr).contents().find('#easyuiTheme').attr('href', href);
    +		}
    +	}
    +
    +	$.cookie('easyuiThemeName', themeName, {
    +		expires : 7
    +	});
    +};
    +
    +/**
    + * @author 瀛欏畤
    + * 
    + * @requires jQuery
    + * 
    + * 灏唂orm琛ㄥ崟鍏冪礌鐨勫煎簭鍒楀寲鎴愬璞
    + * 
    + * @returns object
    + */
    +serializeObject = function(form) {
    +	var o = {};
    +	$.each(form.serializeArray(), function(index) {
    +		if (o[this['name']]) {
    +			o[this['name']] = o[this['name']] + "," + this['value'];
    +		} else {
    +			o[this['name']] = this['value'];
    +		}
    +	});
    +	return o;
    +};
    +
    +/**
    + * @author 瀛欏畤
    + * 
    + * 澧炲姞formatString鍔熻兘
    + * 
    + * 浣跨敤鏂规硶锛歠ormatString('瀛楃涓瞷0}瀛楃涓瞷1}瀛楃涓','绗竴涓彉閲','绗簩涓彉閲');
    + * 
    + * @returns 鏍煎紡鍖栧悗鐨勫瓧绗︿覆
    + */
    +formatString = function(str) {
    +	for ( var i = 0; i < arguments.length - 1; i++) {
    +		str = str.replace("{" + i + "}", arguments[i + 1]);
    +	}
    +	return str;
    +};
    +
    +/**
    + * @author 瀛欏畤
    + * 
    + * 鎺ユ敹涓涓互閫楀彿鍒嗗壊鐨勫瓧绗︿覆锛岃繑鍥濴ist锛宭ist閲屾瘡涓椤归兘鏄竴涓瓧绗︿覆
    + * 
    + * @returns list
    + */
    +stringToList = function(value) {
    +	if (value != undefined && value != '') {
    +		var values = [];
    +		var t = value.split(',');
    +		for ( var i = 0; i < t.length; i++) {
    +			values.push('' + t[i]);/* 閬垮厤浠栧皢ID褰撴垚鏁板瓧 */
    +		}
    +		return values;
    +	} else {
    +		return [];
    +	}
    +};
    +
    +/**
    + * @author 瀛欏畤
    + * 
    + * @requires jQuery
    + * 
    + * 鏀瑰彉jQuery鐨凙JAX榛樿灞炴у拰鏂规硶
    + */
    +$.ajaxSetup({
    +	type : 'POST',
    +	error : function(XMLHttpRequest, textStatus, errorThrown) {
    +		$.messager.progress('close');
    +		$.messager.alert('閿欒', XMLHttpRequest.responseText);
    +	}
    +});
    +
    +function clearLocalstorage(){
    +	storage=$.localStorage; 
    +	if(!storage)
    +		storage=$.cookieStorage;
    +	storage.removeAll();
    +	$.messager.alert('淇℃伅', "娴忚鍣ㄧ紦瀛樻竻闄ゆ垚鍔!");
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/uploadify/css/img/bullet_arrow_up.png b/src/main/webapp/plug-in/uploadify/css/img/bullet_arrow_up.png
    new file mode 100644
    index 00000000..c2dba07e
    Binary files /dev/null and b/src/main/webapp/plug-in/uploadify/css/img/bullet_arrow_up.png differ
    diff --git a/src/main/webapp/plug-in/uploadify/css/img/uploadify-cancel.png b/src/main/webapp/plug-in/uploadify/css/img/uploadify-cancel.png
    new file mode 100644
    index 00000000..35682b01
    Binary files /dev/null and b/src/main/webapp/plug-in/uploadify/css/img/uploadify-cancel.png differ
    diff --git a/src/main/webapp/plug-in/uploadify/css/uploadify.css b/src/main/webapp/plug-in/uploadify/css/uploadify.css
    new file mode 100644
    index 00000000..89e19326
    --- /dev/null
    +++ b/src/main/webapp/plug-in/uploadify/css/uploadify.css
    @@ -0,0 +1,92 @@
    +/*
    +Uploadify
    +Copyright (c) 2012 Reactive Apps, Ronnie Garcia
    +Released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
    +*/
    +
    +.uploadify {
    +	position: relative;
    +	margin-bottom: 1em;
    +}
    +.uploadify-button {
    +	background-color: #505050;
    +	background-image: linear-gradient(bottom, #505050 0%, #707070 100%);
    +	background-image: -o-linear-gradient(bottom, #505050 0%, #707070 100%);
    +	background-image: -moz-linear-gradient(bottom, #505050 0%, #707070 100%);
    +	background-image: -webkit-linear-gradient(bottom, #505050 0%, #707070 100%);
    +	background-image: -ms-linear-gradient(bottom, #505050 0%, #707070 100%);
    +	background-image: -webkit-gradient(
    +		linear,
    +		left bottom,
    +		left top,
    +		color-stop(0, #505050),
    +		color-stop(1, #707070)
    +	);
    +	background-position: center top;
    +	background-repeat: no-repeat;
    +	-webkit-border-radius: 30px;
    +	-moz-border-radius: 30px;
    +	border-radius: 30px;
    +	border: 2px solid #808080;
    +	color: #FFF;
    +	font: bold 12px Arial, Helvetica, sans-serif;
    +	text-align: center;
    +	text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
    +	width: 100%;
    +}
    +.uploadify:hover .uploadify-button {
    +	background-color: #606060;
    +	background-image: linear-gradient(top, #606060 0%, #808080 100%);
    +	background-image: -o-linear-gradient(top, #606060 0%, #808080 100%);
    +	background-image: -moz-linear-gradient(top, #606060 0%, #808080 100%);
    +	background-image: -webkit-linear-gradient(top, #606060 0%, #808080 100%);
    +	background-image: -ms-linear-gradient(top, #606060 0%, #808080 100%);
    +	background-image: -webkit-gradient(
    +		linear,
    +		left bottom,
    +		left top,
    +		color-stop(0, #606060),
    +		color-stop(1, #808080)
    +	);
    +	background-position: center bottom;
    +}
    +.uploadify-button.disabled {
    +	background-color: #D0D0D0;
    +	color: #808080;
    +}
    +.uploadify-queue {
    +	margin-bottom: 1em;
    +}
    +.uploadify-queue-item {
    +	background-color: #F5F5F5;
    +	-webkit-border-radius: 3px;
    +	-moz-border-radius: 3px;
    +	border-radius: 3px;
    +	font: 11px Verdana, Geneva, sans-serif;
    +	margin-top: 5px;
    +	max-width: 350px;
    +	padding: 10px;
    +}
    +.uploadify-error {
    +	background-color: #FDE5DD !important;
    +}
    +.uploadify-queue-item .cancel a {
    +	background: url('../img/uploadify-cancel.png') 0 0 no-repeat;
    +	float: right;
    +	height:	16px;
    +	text-indent: -9999px;
    +	width: 16px;
    +}
    +.uploadify-queue-item.completed {
    +	background-color: #E5E5E5;
    +}
    +.uploadify-progress {
    +	background-color: #E5E5E5;
    +	margin-top: 10px;
    +	width: 100%;
    +}
    +.uploadify-progress-bar {
    +	background-color: #0099FF;
    +	height: 3px;
    +	width: 1px;
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/uploadify/img/bullet_arrow_up.png b/src/main/webapp/plug-in/uploadify/img/bullet_arrow_up.png
    new file mode 100644
    index 00000000..c2dba07e
    Binary files /dev/null and b/src/main/webapp/plug-in/uploadify/img/bullet_arrow_up.png differ
    diff --git a/src/main/webapp/plug-in/uploadify/img/uploadify-cancel.png b/src/main/webapp/plug-in/uploadify/img/uploadify-cancel.png
    new file mode 100644
    index 00000000..35682b01
    Binary files /dev/null and b/src/main/webapp/plug-in/uploadify/img/uploadify-cancel.png differ
    diff --git a/src/main/webapp/plug-in/uploadify/jquery.uploadify-3.1.js b/src/main/webapp/plug-in/uploadify/jquery.uploadify-3.1.js
    new file mode 100644
    index 00000000..44bff442
    --- /dev/null
    +++ b/src/main/webapp/plug-in/uploadify/jquery.uploadify-3.1.js
    @@ -0,0 +1,2596 @@
    +/*
    +SWFObject v2.2 <http://code.google.com/p/swfobject/> 
    +is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
    + */
    +var swfobject = function() {
    +	var D = "undefined", r = "object", S = "Shockwave Flash", W = "ShockwaveFlash.ShockwaveFlash", q = "application/x-shockwave-flash", R = "SWFObjectExprInst", x = "onreadystatechange", O = window, j = document, t = navigator, T = false, U = [ h ], o = [], N = [], I = [], l, Q, E, B, J = false, a = false, n, G, m = true, M = function() {
    +		var aa = typeof j.getElementById != D
    +				&& typeof j.getElementsByTagName != D
    +				&& typeof j.createElement != D, ah = t.userAgent.toLowerCase(), Y = t.platform
    +				.toLowerCase(), ae = Y ? /win/.test(Y) : /win/.test(ah), ac = Y ? /mac/
    +				.test(Y)
    +				: /mac/.test(ah), af = /webkit/.test(ah) ? parseFloat(ah
    +				.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, X = !+"\v1", ag = [
    +				0, 0, 0 ], ab = null;
    +		if (typeof t.plugins != D && typeof t.plugins[S] == r) {
    +			ab = t.plugins[S].description;
    +			if (ab
    +					&& !(typeof t.mimeTypes != D && t.mimeTypes[q] && !t.mimeTypes[q].enabledPlugin)) {
    +				T = true;
    +				X = false;
    +				ab = ab.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
    +				ag[0] = parseInt(ab.replace(/^(.*)\..*$/, "$1"), 10);
    +				ag[1] = parseInt(ab.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
    +				ag[2] = /[a-zA-Z]/.test(ab) ? parseInt(ab.replace(
    +						/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
    +			}
    +		} else {
    +			if (typeof O.ActiveXObject != D) {
    +				try {
    +					var ad = new ActiveXObject(W);
    +					if (ad) {
    +						ab = ad.GetVariable("$version");
    +						if (ab) {
    +							X = true;
    +							ab = ab.split(" ")[1].split(",");
    +							ag = [ parseInt(ab[0], 10), parseInt(ab[1], 10),
    +									parseInt(ab[2], 10) ];
    +						}
    +					}
    +				} catch (Z) {
    +				}
    +			}
    +		}
    +		return {
    +			w3 : aa,
    +			pv : ag,
    +			wk : af,
    +			ie : X,
    +			win : ae,
    +			mac : ac
    +		};
    +	}(), k = function() {
    +		if (!M.w3) {
    +			return;
    +		}
    +		if ((typeof j.readyState != D && j.readyState == "complete")
    +				|| (typeof j.readyState == D && (j.getElementsByTagName("body")[0] || j.body))) {
    +			f();
    +		}
    +		if (!J) {
    +			if (typeof j.addEventListener != D) {
    +				j.addEventListener("DOMContentLoaded", f, false);
    +			}
    +			if (M.ie && M.win) {
    +				j.attachEvent(x, function() {
    +					if (j.readyState == "complete") {
    +						j.detachEvent(x, arguments.callee);
    +						f();
    +					}
    +				});
    +				if (O == top) {
    +					(function() {
    +						if (J) {
    +							return;
    +						}
    +						try {
    +							j.documentElement.doScroll("left");
    +						} catch (X) {
    +							setTimeout(arguments.callee, 0);
    +							return;
    +						}
    +						f();
    +					})();
    +				}
    +			}
    +			if (M.wk) {
    +				(function() {
    +					if (J) {
    +						return;
    +					}
    +					if (!/loaded|complete/.test(j.readyState)) {
    +						setTimeout(arguments.callee, 0);
    +						return;
    +					}
    +					f();
    +				})();
    +			}
    +			s(f);
    +		}
    +	}();
    +	function f() {
    +		if (J) {
    +			return;
    +		}
    +		try {
    +			var Z = j.getElementsByTagName("body")[0].appendChild(C("span"));
    +			Z.parentNode.removeChild(Z);
    +		} catch (aa) {
    +			return;
    +		}
    +		J = true;
    +		var X = U.length;
    +		for ( var Y = 0; Y < X; Y++) {
    +			U[Y]();
    +		}
    +	}
    +	function K(X) {
    +		if (J) {
    +			X();
    +		} else {
    +			U[U.length] = X;
    +		}
    +	}
    +	function s(Y) {
    +		if (typeof O.addEventListener != D) {
    +			O.addEventListener("load", Y, false);
    +		} else {
    +			if (typeof j.addEventListener != D) {
    +				j.addEventListener("load", Y, false);
    +			} else {
    +				if (typeof O.attachEvent != D) {
    +					i(O, "onload", Y);
    +				} else {
    +					if (typeof O.onload == "function") {
    +						var X = O.onload;
    +						O.onload = function() {
    +							X();
    +							Y();
    +						};
    +					} else {
    +						O.onload = Y;
    +					}
    +				}
    +			}
    +		}
    +	}
    +	function h() {
    +		if (T) {
    +			V();
    +		} else {
    +			H();
    +		}
    +	}
    +	function V() {
    +		var X = j.getElementsByTagName("body")[0];
    +		var aa = C(r);
    +		aa.setAttribute("type", q);
    +		var Z = X.appendChild(aa);
    +		if (Z) {
    +			var Y = 0;
    +			(function() {
    +				if (typeof Z.GetVariable != D) {
    +					var ab = Z.GetVariable("$version");
    +					if (ab) {
    +						ab = ab.split(" ")[1].split(",");
    +						M.pv = [ parseInt(ab[0], 10), parseInt(ab[1], 10),
    +								parseInt(ab[2], 10) ];
    +					}
    +				} else {
    +					if (Y < 10) {
    +						Y++;
    +						setTimeout(arguments.callee, 10);
    +						return;
    +					}
    +				}
    +				X.removeChild(aa);
    +				Z = null;
    +				H();
    +			})();
    +		} else {
    +			H();
    +		}
    +	}
    +	function H() {
    +		var ag = o.length;
    +		if (ag > 0) {
    +			for ( var af = 0; af < ag; af++) {
    +				var Y = o[af].id;
    +				var ab = o[af].callbackFn;
    +				var aa = {
    +					success : false,
    +					id : Y
    +				};
    +				if (M.pv[0] > 0) {
    +					var ae = c(Y);
    +					if (ae) {
    +						if (F(o[af].swfVersion) && !(M.wk && M.wk < 312)) {
    +							w(Y, true);
    +							if (ab) {
    +								aa.success = true;
    +								aa.ref = z(Y);
    +								ab(aa);
    +							}
    +						} else {
    +							if (o[af].expressInstall && A()) {
    +								var ai = {};
    +								ai.data = o[af].expressInstall;
    +								ai.width = ae.getAttribute("width") || "0";
    +								ai.height = ae.getAttribute("height") || "0";
    +								if (ae.getAttribute("class")) {
    +									ai.styleclass = ae.getAttribute("class");
    +								}
    +								if (ae.getAttribute("align")) {
    +									ai.align = ae.getAttribute("align");
    +								}
    +								var ah = {};
    +								var X = ae.getElementsByTagName("param");
    +								var ac = X.length;
    +								for ( var ad = 0; ad < ac; ad++) {
    +									if (X[ad].getAttribute("name")
    +											.toLowerCase() != "movie") {
    +										ah[X[ad].getAttribute("name")] = X[ad]
    +												.getAttribute("value");
    +									}
    +								}
    +								P(ai, ah, Y, ab);
    +							} else {
    +								p(ae);
    +								if (ab) {
    +									ab(aa);
    +								}
    +							}
    +						}
    +					}
    +				} else {
    +					w(Y, true);
    +					if (ab) {
    +						var Z = z(Y);
    +						if (Z && typeof Z.SetVariable != D) {
    +							aa.success = true;
    +							aa.ref = Z;
    +						}
    +						ab(aa);
    +					}
    +				}
    +			}
    +		}
    +	}
    +	function z(aa) {
    +		var X = null;
    +		var Y = c(aa);
    +		if (Y && Y.nodeName == "OBJECT") {
    +			if (typeof Y.SetVariable != D) {
    +				X = Y;
    +			} else {
    +				var Z = Y.getElementsByTagName(r)[0];
    +				if (Z) {
    +					X = Z;
    +				}
    +			}
    +		}
    +		return X;
    +	}
    +	function A() {
    +		return !a && F("6.0.65") && (M.win || M.mac) && !(M.wk && M.wk < 312);
    +	}
    +	function P(aa, ab, X, Z) {
    +		a = true;
    +		E = Z || null;
    +		B = {
    +			success : false,
    +			id : X
    +		};
    +		var ae = c(X);
    +		if (ae) {
    +			if (ae.nodeName == "OBJECT") {
    +				l = g(ae);
    +				Q = null;
    +			} else {
    +				l = ae;
    +				Q = X;
    +			}
    +			aa.id = R;
    +			if (typeof aa.width == D
    +					|| (!/%$/.test(aa.width) && parseInt(aa.width, 10) < 310)) {
    +				aa.width = "310";
    +			}
    +			if (typeof aa.height == D
    +					|| (!/%$/.test(aa.height) && parseInt(aa.height, 10) < 137)) {
    +				aa.height = "137";
    +			}
    +			j.title = j.title.slice(0, 47) + " - Flash Player Installation";
    +			var ad = M.ie && M.win ? "ActiveX" : "PlugIn", ac = "MMredirectURL="
    +					+ O.location.toString().replace(/&/g, "%26")
    +					+ "&MMplayerType=" + ad + "&MMdoctitle=" + j.title;
    +			if (typeof ab.flashvars != D) {
    +				ab.flashvars += "&" + ac;
    +			} else {
    +				ab.flashvars = ac;
    +			}
    +			if (M.ie && M.win && ae.readyState != 4) {
    +				var Y = C("div");
    +				X += "SWFObjectNew";
    +				Y.setAttribute("id", X);
    +				ae.parentNode.insertBefore(Y, ae);
    +				ae.style.display = "none";
    +				(function() {
    +					if (ae.readyState == 4) {
    +						ae.parentNode.removeChild(ae);
    +					} else {
    +						setTimeout(arguments.callee, 10);
    +					}
    +				})();
    +			}
    +			u(aa, ab, X);
    +		}
    +	}
    +	function p(Y) {
    +		if (M.ie && M.win && Y.readyState != 4) {
    +			var X = C("div");
    +			Y.parentNode.insertBefore(X, Y);
    +			X.parentNode.replaceChild(g(Y), X);
    +			Y.style.display = "none";
    +			(function() {
    +				if (Y.readyState == 4) {
    +					Y.parentNode.removeChild(Y);
    +				} else {
    +					setTimeout(arguments.callee, 10);
    +				}
    +			})();
    +		} else {
    +			Y.parentNode.replaceChild(g(Y), Y);
    +		}
    +	}
    +	function g(ab) {
    +		var aa = C("div");
    +		if (M.win && M.ie) {
    +			aa.innerHTML = ab.innerHTML;
    +		} else {
    +			var Y = ab.getElementsByTagName(r)[0];
    +			if (Y) {
    +				var ad = Y.childNodes;
    +				if (ad) {
    +					var X = ad.length;
    +					for ( var Z = 0; Z < X; Z++) {
    +						if (!(ad[Z].nodeType == 1 && ad[Z].nodeName == "PARAM")
    +								&& !(ad[Z].nodeType == 8)) {
    +							aa.appendChild(ad[Z].cloneNode(true));
    +						}
    +					}
    +				}
    +			}
    +		}
    +		return aa;
    +	}
    +	function u(ai, ag, Y) {
    +		var X, aa = c(Y);
    +		if (M.wk && M.wk < 312) {
    +			return X;
    +		}
    +		if (aa) {
    +			if (typeof ai.id == D) {
    +				ai.id = Y;
    +			}
    +			if (M.ie && M.win) {
    +				var ah = "";
    +				for ( var ae in ai) {
    +					if (ai[ae] != Object.prototype[ae]) {
    +						if (ae.toLowerCase() == "data") {
    +							ag.movie = ai[ae];
    +						} else {
    +							if (ae.toLowerCase() == "styleclass") {
    +								ah += ' class="' + ai[ae] + '"';
    +							} else {
    +								if (ae.toLowerCase() != "classid") {
    +									ah += " " + ae + '="' + ai[ae] + '"';
    +								}
    +							}
    +						}
    +					}
    +				}
    +				var af = "";
    +				for ( var ad in ag) {
    +					if (ag[ad] != Object.prototype[ad]) {
    +						af += '<param name="' + ad + '" value="' + ag[ad]
    +								+ '" />';
    +					}
    +				}
    +				aa.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'
    +						+ ah + ">" + af + "</object>";
    +				N[N.length] = ai.id;
    +				X = c(ai.id);
    +			} else {
    +				var Z = C(r);
    +				Z.setAttribute("type", q);
    +				for ( var ac in ai) {
    +					if (ai[ac] != Object.prototype[ac]) {
    +						if (ac.toLowerCase() == "styleclass") {
    +							Z.setAttribute("class", ai[ac]);
    +						} else {
    +							if (ac.toLowerCase() != "classid") {
    +								Z.setAttribute(ac, ai[ac]);
    +							}
    +						}
    +					}
    +				}
    +				for ( var ab in ag) {
    +					if (ag[ab] != Object.prototype[ab]
    +							&& ab.toLowerCase() != "movie") {
    +						e(Z, ab, ag[ab]);
    +					}
    +				}
    +				aa.parentNode.replaceChild(Z, aa);
    +				X = Z;
    +			}
    +		}
    +		return X;
    +	}
    +	function e(Z, X, Y) {
    +		var aa = C("param");
    +		aa.setAttribute("name", X);
    +		aa.setAttribute("value", Y);
    +		Z.appendChild(aa);
    +	}
    +	function y(Y) {
    +		var X = c(Y);
    +		if (X && X.nodeName == "OBJECT") {
    +			if (M.ie && M.win) {
    +				X.style.display = "none";
    +				(function() {
    +					if (X.readyState == 4) {
    +						b(Y);
    +					} else {
    +						setTimeout(arguments.callee, 10);
    +					}
    +				})();
    +			} else {
    +				X.parentNode.removeChild(X);
    +			}
    +		}
    +	}
    +	function b(Z) {
    +		var Y = c(Z);
    +		if (Y) {
    +			for ( var X in Y) {
    +				if (typeof Y[X] == "function") {
    +					Y[X] = null;
    +				}
    +			}
    +			Y.parentNode.removeChild(Y);
    +		}
    +	}
    +	function c(Z) {
    +		var X = null;
    +		try {
    +			X = j.getElementById(Z);
    +		} catch (Y) {
    +		}
    +		return X;
    +	}
    +	function C(X) {
    +		return j.createElement(X);
    +	}
    +	function i(Z, X, Y) {
    +		Z.attachEvent(X, Y);
    +		I[I.length] = [ Z, X, Y ];
    +	}
    +	function F(Z) {
    +		var Y = M.pv, X = Z.split(".");
    +		X[0] = parseInt(X[0], 10);
    +		X[1] = parseInt(X[1], 10) || 0;
    +		X[2] = parseInt(X[2], 10) || 0;
    +		return (Y[0] > X[0] || (Y[0] == X[0] && Y[1] > X[1]) || (Y[0] == X[0]
    +				&& Y[1] == X[1] && Y[2] >= X[2])) ? true : false;
    +	}
    +	function v(ac, Y, ad, ab) {
    +		if (M.ie && M.mac) {
    +			return;
    +		}
    +		var aa = j.getElementsByTagName("head")[0];
    +		if (!aa) {
    +			return;
    +		}
    +		var X = (ad && typeof ad == "string") ? ad : "screen";
    +		if (ab) {
    +			n = null;
    +			G = null;
    +		}
    +		if (!n || G != X) {
    +			var Z = C("style");
    +			Z.setAttribute("type", "text/css");
    +			Z.setAttribute("media", X);
    +			n = aa.appendChild(Z);
    +			if (M.ie && M.win && typeof j.styleSheets != D
    +					&& j.styleSheets.length > 0) {
    +				n = j.styleSheets[j.styleSheets.length - 1];
    +			}
    +			G = X;
    +		}
    +		if (M.ie && M.win) {
    +			if (n && typeof n.addRule == r) {
    +				n.addRule(ac, Y);
    +			}
    +		} else {
    +			if (n && typeof j.createTextNode != D) {
    +				n.appendChild(j.createTextNode(ac + " {" + Y + "}"));
    +			}
    +		}
    +	}
    +	function w(Z, X) {
    +		if (!m) {
    +			return;
    +		}
    +		var Y = X ? "visible" : "hidden";
    +		if (J && c(Z)) {
    +			c(Z).style.visibility = Y;
    +		} else {
    +			v("#" + Z, "visibility:" + Y);
    +		}
    +	}
    +	function L(Y) {
    +		var Z = /[\\\"<>\.;]/;
    +		var X = Z.exec(Y) != null;
    +		return X && typeof encodeURIComponent != D ? encodeURIComponent(Y) : Y;
    +	}
    +	var d = function() {
    +		if (M.ie && M.win) {
    +			window.attachEvent("onunload", function() {
    +				var ac = I.length;
    +				for ( var ab = 0; ab < ac; ab++) {
    +					I[ab][0].detachEvent(I[ab][1], I[ab][2]);
    +				}
    +				var Z = N.length;
    +				for ( var aa = 0; aa < Z; aa++) {
    +					y(N[aa]);
    +				}
    +				for ( var Y in M) {
    +					M[Y] = null;
    +				}
    +				M = null;
    +				for ( var X in swfobject) {
    +					swfobject[X] = null;
    +				}
    +				swfobject = null;
    +			});
    +		}
    +	}();
    +	return {
    +		registerObject : function(ab, X, aa, Z) {
    +			if (M.w3 && ab && X) {
    +				var Y = {};
    +				Y.id = ab;
    +				Y.swfVersion = X;
    +				Y.expressInstall = aa;
    +				Y.callbackFn = Z;
    +				o[o.length] = Y;
    +				w(ab, false);
    +			} else {
    +				if (Z) {
    +					Z({
    +						success : false,
    +						id : ab
    +					});
    +				}
    +			}
    +		},
    +		getObjectById : function(X) {
    +			if (M.w3) {
    +				return z(X);
    +			}
    +		},
    +		embedSWF : function(ab, ah, ae, ag, Y, aa, Z, ad, af, ac) {
    +			var X = {
    +				success : false,
    +				id : ah
    +			};
    +			if (M.w3 && !(M.wk && M.wk < 312) && ab && ah && ae && ag && Y) {
    +				w(ah, false);
    +				K(function() {
    +					ae += "";
    +					ag += "";
    +					var aj = {};
    +					if (af && typeof af === r) {
    +						for ( var al in af) {
    +							aj[al] = af[al];
    +						}
    +					}
    +					aj.data = ab;
    +					aj.width = ae;
    +					aj.height = ag;
    +					var am = {};
    +					if (ad && typeof ad === r) {
    +						for ( var ak in ad) {
    +							am[ak] = ad[ak];
    +						}
    +					}
    +					if (Z && typeof Z === r) {
    +						for ( var ai in Z) {
    +							if (typeof am.flashvars != D) {
    +								am.flashvars += "&" + ai + "=" + Z[ai];
    +							} else {
    +								am.flashvars = ai + "=" + Z[ai];
    +							}
    +						}
    +					}
    +					if (F(Y)) {
    +						var an = u(aj, am, ah);
    +						if (aj.id == ah) {
    +							w(ah, true);
    +						}
    +						X.success = true;
    +						X.ref = an;
    +					} else {
    +						if (aa && A()) {
    +							aj.data = aa;
    +							P(aj, am, ah, ac);
    +							return;
    +						} else {
    +							w(ah, true);
    +						}
    +					}
    +					if (ac) {
    +						ac(X);
    +					}
    +				});
    +			} else {
    +				if (ac) {
    +					ac(X);
    +				}
    +			}
    +		},
    +		switchOffAutoHideShow : function() {
    +			m = false;
    +		},
    +		ua : M,
    +		getFlashPlayerVersion : function() {
    +			return {
    +				major : M.pv[0],
    +				minor : M.pv[1],
    +				release : M.pv[2]
    +			};
    +		},
    +		hasFlashPlayerVersion : F,
    +		createSWF : function(Z, Y, X) {
    +			if (M.w3) {
    +				return u(Z, Y, X);
    +			} else {
    +				return undefined;
    +			}
    +		},
    +		showExpressInstall : function(Z, aa, X, Y) {
    +			if (M.w3 && A()) {
    +				P(Z, aa, X, Y);
    +			}
    +		},
    +		removeSWF : function(X) {
    +			if (M.w3) {
    +				y(X);
    +			}
    +		},
    +		createCSS : function(aa, Z, Y, X) {
    +			if (M.w3) {
    +				v(aa, Z, Y, X);
    +			}
    +		},
    +		addDomLoadEvent : K,
    +		addLoadEvent : s,
    +		getQueryParamValue : function(aa) {
    +			var Z = j.location.search || j.location.hash;
    +			if (Z) {
    +				if (/\?/.test(Z)) {
    +					Z = Z.split("?")[1];
    +				}
    +				if (aa == null) {
    +					return L(Z);
    +				}
    +				var Y = Z.split("&");
    +				for ( var X = 0; X < Y.length; X++) {
    +					if (Y[X].substring(0, Y[X].indexOf("=")) == aa) {
    +						return L(Y[X].substring((Y[X].indexOf("=") + 1)));
    +					}
    +				}
    +			}
    +			return "";
    +		},
    +		expressInstallCallback : function() {
    +			if (a) {
    +				var X = c(R);
    +				if (X && l) {
    +					X.parentNode.replaceChild(l, X);
    +					if (Q) {
    +						w(Q, true);
    +						if (M.ie && M.win) {
    +							l.style.display = "block";
    +						}
    +					}
    +					if (E) {
    +						E(B);
    +					}
    +				}
    +				a = false;
    +			}
    +		}
    +	};
    +}();
    +
    +/*
    + * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
    + * 
    + * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,
    + * http://www.vinterwebb.se/
    + * 
    + * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilz茅n and Mammon Media and is
    + * released under the MIT License:
    + * http://www.opensource.org/licenses/mit-license.php
    + * 
    + * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT
    + * License: http://www.opensource.org/licenses/mit-license.php
    + */
    +
    +var SWFUpload;
    +if (SWFUpload == undefined) {
    +	SWFUpload = function(a) {
    +		this.initSWFUpload(a)
    +	}
    +}
    +SWFUpload.prototype.initSWFUpload = function(b) {
    +	try {
    +		this.customSettings = {};
    +		this.settings = b;
    +		this.eventQueue = [];
    +		this.movieName = "SWFUpload_" + SWFUpload.movieCount++;
    +		this.movieElement = null;
    +		SWFUpload.instances[this.movieName] = this;
    +		this.initSettings();
    +		this.loadFlash();
    +		this.displayDebugInfo()
    +	} catch (a) {
    +		delete SWFUpload.instances[this.movieName];
    +		throw a
    +	}
    +};
    +SWFUpload.instances = {};
    +SWFUpload.movieCount = 0;
    +SWFUpload.version = "2.2.0 2009-03-25";
    +SWFUpload.QUEUE_ERROR = {
    +	QUEUE_LIMIT_EXCEEDED : -100,
    +	FILE_EXCEEDS_SIZE_LIMIT : -110,
    +	ZERO_BYTE_FILE : -120,
    +	INVALID_FILETYPE : -130
    +};
    +SWFUpload.UPLOAD_ERROR = {
    +	HTTP_ERROR : -200,
    +	MISSING_UPLOAD_URL : -210,
    +	IO_ERROR : -220,
    +	SECURITY_ERROR : -230,
    +	UPLOAD_LIMIT_EXCEEDED : -240,
    +	UPLOAD_FAILED : -250,
    +	SPECIFIED_FILE_ID_NOT_FOUND : -260,
    +	FILE_VALIDATION_FAILED : -270,
    +	FILE_CANCELLED : -280,
    +	UPLOAD_STOPPED : -290
    +};
    +SWFUpload.FILE_STATUS = {
    +	QUEUED : -1,
    +	IN_PROGRESS : -2,
    +	ERROR : -3,
    +	COMPLETE : -4,
    +	CANCELLED : -5
    +};
    +SWFUpload.BUTTON_ACTION = {
    +	SELECT_FILE : -100,
    +	SELECT_FILES : -110,
    +	START_UPLOAD : -120
    +};
    +SWFUpload.CURSOR = {
    +	ARROW : -1,
    +	HAND : -2
    +};
    +SWFUpload.WINDOW_MODE = {
    +	WINDOW : "window",
    +	TRANSPARENT : "transparent",
    +	OPAQUE : "opaque"
    +};
    +SWFUpload.completeURL = function(a) {
    +	if (typeof (a) !== "string" || a.match(/^https?:\/\//i) || a.match(/^\//)) {
    +		return a
    +	}
    +	var c = window.location.protocol + "//" + window.location.hostname
    +			+ (window.location.port ? ":" + window.location.port : "");
    +	var b = window.location.pathname.lastIndexOf("/");
    +	if (b <= 0) {
    +		path = "/"
    +	} else {
    +		path = window.location.pathname.substr(0, b) + "/"
    +	}
    +	return path + a
    +};
    +SWFUpload.prototype.initSettings = function() {
    +	this.ensureDefault = function(b, a) {
    +		this.settings[b] = (this.settings[b] == undefined) ? a
    +				: this.settings[b]
    +	};
    +	this.ensureDefault("upload_url", "");
    +	this.ensureDefault("preserve_relative_urls", false);
    +	this.ensureDefault("file_post_name", "Filedata");
    +	this.ensureDefault("post_params", {});
    +	this.ensureDefault("use_query_string", false);
    +	this.ensureDefault("requeue_on_error", false);
    +	this.ensureDefault("http_success", []);
    +	this.ensureDefault("assume_success_timeout", 0);
    +	this.ensureDefault("file_types", "*.*");
    +	this.ensureDefault("file_types_description", "All Files");
    +	this.ensureDefault("file_size_limit", 0);
    +	this.ensureDefault("file_upload_limit", 0);
    +	this.ensureDefault("file_queue_limit", 0);
    +	this.ensureDefault("flash_url", "swfupload.swf");
    +	this.ensureDefault("prevent_swf_caching", true);
    +	this.ensureDefault("button_image_url", "");
    +	this.ensureDefault("button_width", 1);
    +	this.ensureDefault("button_height", 1);
    +	this.ensureDefault("button_text", "");
    +	this.ensureDefault("button_text_style", "color: #000000; font-size: 16pt;");
    +	this.ensureDefault("button_text_top_padding", 0);
    +	this.ensureDefault("button_text_left_padding", 0);
    +	this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES);
    +	this.ensureDefault("button_disabled", false);
    +	this.ensureDefault("button_placeholder_id", "");
    +	this.ensureDefault("button_placeholder", null);
    +	this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW);
    +	this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW);
    +	this.ensureDefault("debug", false);
    +	this.settings.debug_enabled = this.settings.debug;
    +	this.settings.return_upload_start_handler = this.returnUploadStart;
    +	this.ensureDefault("swfupload_loaded_handler", null);
    +	this.ensureDefault("file_dialog_start_handler", null);
    +	this.ensureDefault("file_queued_handler", null);
    +	this.ensureDefault("file_queue_error_handler", null);
    +	this.ensureDefault("file_dialog_complete_handler", null);
    +	this.ensureDefault("upload_start_handler", null);
    +	this.ensureDefault("upload_progress_handler", null);
    +	this.ensureDefault("upload_error_handler", null);
    +	this.ensureDefault("upload_success_handler", null);
    +	this.ensureDefault("upload_complete_handler", null);
    +	this.ensureDefault("debug_handler", this.debugMessage);
    +	this.ensureDefault("custom_settings", {});
    +	this.customSettings = this.settings.custom_settings;
    +	if (!!this.settings.prevent_swf_caching) {
    +		this.settings.flash_url = this.settings.flash_url
    +				+ (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&")
    +				+ "preventswfcaching=" + new Date().getTime()
    +	}
    +	if (!this.settings.preserve_relative_urls) {
    +		this.settings.upload_url = SWFUpload
    +				.completeURL(this.settings.upload_url);
    +		this.settings.button_image_url = SWFUpload
    +				.completeURL(this.settings.button_image_url)
    +	}
    +	delete this.ensureDefault
    +};
    +SWFUpload.prototype.loadFlash = function() {
    +	var a, b;
    +	if (document.getElementById(this.movieName) !== null) {
    +		throw "ID " + this.movieName
    +				+ " is already in use. The Flash Object could not be added"
    +	}
    +	a = document.getElementById(this.settings.button_placeholder_id)
    +			|| this.settings.button_placeholder;
    +	if (a == undefined) {
    +		throw "Could not find the placeholder element: "
    +				+ this.settings.button_placeholder_id
    +	}
    +	b = document.createElement("div");
    +	b.innerHTML = this.getFlashHTML();
    +	a.parentNode.replaceChild(b.firstChild, a);
    +	if (window[this.movieName] == undefined) {
    +		window[this.movieName] = this.getMovieElement()
    +	}
    +};
    +SWFUpload.prototype.getFlashHTML = function() {
    +	return [ '<object id="', this.movieName,
    +			'" type="application/x-shockwave-flash" data="',
    +			this.settings.flash_url, '" width="', this.settings.button_width,
    +			'" height="', this.settings.button_height, '" class="swfupload">',
    +			'<param name="wmode" value="', this.settings.button_window_mode,
    +			'" />', '<param name="movie" value="', this.settings.flash_url,
    +			'" />', '<param name="quality" value="high" />',
    +			'<param name="menu" value="false" />',
    +			'<param name="allowScriptAccess" value="always" />',
    +			'<param name="flashvars" value="' + this.getFlashVars() + '" />',
    +			"</object>" ].join("")
    +};
    +SWFUpload.prototype.getFlashVars = function() {
    +	var b = this.buildParamString();
    +	var a = this.settings.http_success.join(",");
    +	return [ "movieName=", encodeURIComponent(this.movieName),
    +			"&amp;uploadURL=", encodeURIComponent(this.settings.upload_url),
    +			"&amp;useQueryString=",
    +			encodeURIComponent(this.settings.use_query_string),
    +			"&amp;requeueOnError=",
    +			encodeURIComponent(this.settings.requeue_on_error),
    +			"&amp;httpSuccess=", encodeURIComponent(a),
    +			"&amp;assumeSuccessTimeout=",
    +			encodeURIComponent(this.settings.assume_success_timeout),
    +			"&amp;params=", encodeURIComponent(b), "&amp;filePostName=",
    +			encodeURIComponent(this.settings.file_post_name),
    +			"&amp;fileTypes=", encodeURIComponent(this.settings.file_types),
    +			"&amp;fileTypesDescription=",
    +			encodeURIComponent(this.settings.file_types_description),
    +			"&amp;fileSizeLimit=",
    +			encodeURIComponent(this.settings.file_size_limit),
    +			"&amp;fileUploadLimit=",
    +			encodeURIComponent(this.settings.file_upload_limit),
    +			"&amp;fileQueueLimit=",
    +			encodeURIComponent(this.settings.file_queue_limit),
    +			"&amp;debugEnabled=",
    +			encodeURIComponent(this.settings.debug_enabled),
    +			"&amp;buttonImageURL=",
    +			encodeURIComponent(this.settings.button_image_url),
    +			"&amp;buttonWidth=",
    +			encodeURIComponent(this.settings.button_width),
    +			"&amp;buttonHeight=",
    +			encodeURIComponent(this.settings.button_height),
    +			"&amp;buttonText=", encodeURIComponent(this.settings.button_text),
    +			"&amp;buttonTextTopPadding=",
    +			encodeURIComponent(this.settings.button_text_top_padding),
    +			"&amp;buttonTextLeftPadding=",
    +			encodeURIComponent(this.settings.button_text_left_padding),
    +			"&amp;buttonTextStyle=",
    +			encodeURIComponent(this.settings.button_text_style),
    +			"&amp;buttonAction=",
    +			encodeURIComponent(this.settings.button_action),
    +			"&amp;buttonDisabled=",
    +			encodeURIComponent(this.settings.button_disabled),
    +			"&amp;buttonCursor=",
    +			encodeURIComponent(this.settings.button_cursor) ].join("")
    +};
    +SWFUpload.prototype.getMovieElement = function() {
    +	if (this.movieElement == undefined) {
    +		this.movieElement = document.getElementById(this.movieName)
    +	}
    +	if (this.movieElement === null) {
    +		throw "Could not find Flash element"
    +	}
    +	return this.movieElement
    +};
    +SWFUpload.prototype.buildParamString = function() {
    +	var c = this.settings.post_params;
    +	var b = [];
    +	if (typeof (c) === "object") {
    +		for ( var a in c) {
    +			if (c.hasOwnProperty(a)) {
    +				b.push(encodeURIComponent(a.toString()) + "="
    +						+ encodeURIComponent(c[a].toString()))
    +			}
    +		}
    +	}
    +	return b.join("&amp;")
    +};
    +SWFUpload.prototype.destroy = function() {
    +	try {
    +		this.cancelUpload(null, false);
    +		var a = null;
    +		a = this.getMovieElement();
    +		if (a && typeof (a.CallFunction) === "unknown") {
    +			for ( var c in a) {
    +				try {
    +					if (typeof (a[c]) === "function") {
    +						a[c] = null
    +					}
    +				} catch (e) {
    +				}
    +			}
    +			try {
    +				a.parentNode.removeChild(a)
    +			} catch (b) {
    +			}
    +		}
    +		window[this.movieName] = null;
    +		SWFUpload.instances[this.movieName] = null;
    +		delete SWFUpload.instances[this.movieName];
    +		this.movieElement = null;
    +		this.settings = null;
    +		this.customSettings = null;
    +		this.eventQueue = null;
    +		this.movieName = null;
    +		return true
    +	} catch (d) {
    +		return false
    +	}
    +};
    +SWFUpload.prototype.displayDebugInfo = function() {
    +	this.debug([
    +			"---SWFUpload Instance Info---\n",
    +			"Version: ",
    +			SWFUpload.version,
    +			"\n",
    +			"Movie Name: ",
    +			this.movieName,
    +			"\n",
    +			"Settings:\n",
    +			"\t",
    +			"upload_url:               ",
    +			this.settings.upload_url,
    +			"\n",
    +			"\t",
    +			"flash_url:                ",
    +			this.settings.flash_url,
    +			"\n",
    +			"\t",
    +			"use_query_string:         ",
    +			this.settings.use_query_string.toString(),
    +			"\n",
    +			"\t",
    +			"requeue_on_error:         ",
    +			this.settings.requeue_on_error.toString(),
    +			"\n",
    +			"\t",
    +			"http_success:             ",
    +			this.settings.http_success.join(", "),
    +			"\n",
    +			"\t",
    +			"assume_success_timeout:   ",
    +			this.settings.assume_success_timeout,
    +			"\n",
    +			"\t",
    +			"file_post_name:           ",
    +			this.settings.file_post_name,
    +			"\n",
    +			"\t",
    +			"post_params:              ",
    +			this.settings.post_params.toString(),
    +			"\n",
    +			"\t",
    +			"file_types:               ",
    +			this.settings.file_types,
    +			"\n",
    +			"\t",
    +			"file_types_description:   ",
    +			this.settings.file_types_description,
    +			"\n",
    +			"\t",
    +			"file_size_limit:          ",
    +			this.settings.file_size_limit,
    +			"\n",
    +			"\t",
    +			"file_upload_limit:        ",
    +			this.settings.file_upload_limit,
    +			"\n",
    +			"\t",
    +			"file_queue_limit:         ",
    +			this.settings.file_queue_limit,
    +			"\n",
    +			"\t",
    +			"debug:                    ",
    +			this.settings.debug.toString(),
    +			"\n",
    +			"\t",
    +			"prevent_swf_caching:      ",
    +			this.settings.prevent_swf_caching.toString(),
    +			"\n",
    +			"\t",
    +			"button_placeholder_id:    ",
    +			this.settings.button_placeholder_id.toString(),
    +			"\n",
    +			"\t",
    +			"button_placeholder:       ",
    +			(this.settings.button_placeholder ? "Set" : "Not Set"),
    +			"\n",
    +			"\t",
    +			"button_image_url:         ",
    +			this.settings.button_image_url.toString(),
    +			"\n",
    +			"\t",
    +			"button_width:             ",
    +			this.settings.button_width.toString(),
    +			"\n",
    +			"\t",
    +			"button_height:            ",
    +			this.settings.button_height.toString(),
    +			"\n",
    +			"\t",
    +			"button_text:              ",
    +			this.settings.button_text.toString(),
    +			"\n",
    +			"\t",
    +			"button_text_style:        ",
    +			this.settings.button_text_style.toString(),
    +			"\n",
    +			"\t",
    +			"button_text_top_padding:  ",
    +			this.settings.button_text_top_padding.toString(),
    +			"\n",
    +			"\t",
    +			"button_text_left_padding: ",
    +			this.settings.button_text_left_padding.toString(),
    +			"\n",
    +			"\t",
    +			"button_action:            ",
    +			this.settings.button_action.toString(),
    +			"\n",
    +			"\t",
    +			"button_disabled:          ",
    +			this.settings.button_disabled.toString(),
    +			"\n",
    +			"\t",
    +			"custom_settings:          ",
    +			this.settings.custom_settings.toString(),
    +			"\n",
    +			"Event Handlers:\n",
    +			"\t",
    +			"swfupload_loaded_handler assigned:  ",
    +			(typeof this.settings.swfupload_loaded_handler === "function")
    +					.toString(),
    +			"\n",
    +			"\t",
    +			"file_dialog_start_handler assigned: ",
    +			(typeof this.settings.file_dialog_start_handler === "function")
    +					.toString(),
    +			"\n",
    +			"\t",
    +			"file_queued_handler assigned:       ",
    +			(typeof this.settings.file_queued_handler === "function")
    +					.toString(),
    +			"\n",
    +			"\t",
    +			"file_queue_error_handler assigned:  ",
    +			(typeof this.settings.file_queue_error_handler === "function")
    +					.toString(),
    +			"\n",
    +			"\t",
    +			"upload_start_handler assigned:      ",
    +			(typeof this.settings.upload_start_handler === "function")
    +					.toString(),
    +			"\n",
    +			"\t",
    +			"upload_progress_handler assigned:   ",
    +			(typeof this.settings.upload_progress_handler === "function")
    +					.toString(),
    +			"\n",
    +			"\t",
    +			"upload_error_handler assigned:      ",
    +			(typeof this.settings.upload_error_handler === "function")
    +					.toString(),
    +			"\n",
    +			"\t",
    +			"upload_success_handler assigned:    ",
    +			(typeof this.settings.upload_success_handler === "function")
    +					.toString(),
    +			"\n",
    +			"\t",
    +			"upload_complete_handler assigned:   ",
    +			(typeof this.settings.upload_complete_handler === "function")
    +					.toString(), "\n", "\t",
    +			"debug_handler assigned:             ",
    +			(typeof this.settings.debug_handler === "function").toString(),
    +			"\n" ].join(""))
    +};
    +SWFUpload.prototype.addSetting = function(b, c, a) {
    +	if (c == undefined) {
    +		return (this.settings[b] = a)
    +	} else {
    +		return (this.settings[b] = c)
    +	}
    +};
    +SWFUpload.prototype.getSetting = function(a) {
    +	if (this.settings[a] != undefined) {
    +		return this.settings[a]
    +	}
    +	return ""
    +};
    +SWFUpload.prototype.callFlash = function(functionName, argumentArray) {
    +	argumentArray = argumentArray || [];
    +	var movieElement = this.getMovieElement();
    +	var returnValue, returnString;
    +	try {
    +		returnString = movieElement.CallFunction('<invoke name="'
    +				+ functionName + '" returntype="javascript">'
    +				+ __flash__argumentsToXML(argumentArray, 0) + "</invoke>");
    +		returnValue = eval(returnString)
    +	} catch (ex) {
    +		throw "Call to " + functionName + " failed"
    +	}
    +	if (returnValue != undefined && typeof returnValue.post === "object") {
    +		returnValue = this.unescapeFilePostParams(returnValue)
    +	}
    +	return returnValue
    +};
    +SWFUpload.prototype.selectFile = function() {
    +	this.callFlash("SelectFile")
    +};
    +SWFUpload.prototype.selectFiles = function() {
    +	this.callFlash("SelectFiles")
    +};
    +SWFUpload.prototype.startUpload = function(a) {
    +	this.callFlash("StartUpload", [ a ])
    +};
    +SWFUpload.prototype.cancelUpload = function(a, b) {
    +	if (b !== false) {
    +		b = true
    +	}
    +	this.callFlash("CancelUpload", [ a, b ])
    +};
    +SWFUpload.prototype.stopUpload = function() {
    +	this.callFlash("StopUpload")
    +};
    +SWFUpload.prototype.getStats = function() {
    +	return this.callFlash("GetStats")
    +};
    +SWFUpload.prototype.setStats = function(a) {
    +	this.callFlash("SetStats", [ a ])
    +};
    +SWFUpload.prototype.getFile = function(a) {
    +	if (typeof (a) === "number") {
    +		return this.callFlash("GetFileByIndex", [ a ])
    +	} else {
    +		return this.callFlash("GetFile", [ a ])
    +	}
    +};
    +SWFUpload.prototype.addFileParam = function(a, b, c) {
    +	return this.callFlash("AddFileParam", [ a, b, c ])
    +};
    +SWFUpload.prototype.removeFileParam = function(a, b) {
    +	this.callFlash("RemoveFileParam", [ a, b ])
    +};
    +SWFUpload.prototype.setUploadURL = function(a) {
    +	this.settings.upload_url = a.toString();
    +	this.callFlash("SetUploadURL", [ a ])
    +};
    +SWFUpload.prototype.setPostParams = function(a) {
    +	this.settings.post_params = a;
    +	this.callFlash("SetPostParams", [ a ])
    +};
    +SWFUpload.prototype.addPostParam = function(a, b) {
    +	this.settings.post_params[a] = b;
    +	this.callFlash("SetPostParams", [ this.settings.post_params ])
    +};
    +SWFUpload.prototype.removePostParam = function(a) {
    +	delete this.settings.post_params[a];
    +	this.callFlash("SetPostParams", [ this.settings.post_params ])
    +};
    +SWFUpload.prototype.setFileTypes = function(a, b) {
    +	this.settings.file_types = a;
    +	this.settings.file_types_description = b;
    +	this.callFlash("SetFileTypes", [ a, b ])
    +};
    +SWFUpload.prototype.setFileSizeLimit = function(a) {
    +	this.settings.file_size_limit = a;
    +	this.callFlash("SetFileSizeLimit", [ a ])
    +};
    +SWFUpload.prototype.setFileUploadLimit = function(a) {
    +	this.settings.file_upload_limit = a;
    +	this.callFlash("SetFileUploadLimit", [ a ])
    +};
    +SWFUpload.prototype.setFileQueueLimit = function(a) {
    +	this.settings.file_queue_limit = a;
    +	this.callFlash("SetFileQueueLimit", [ a ])
    +};
    +SWFUpload.prototype.setFilePostName = function(a) {
    +	this.settings.file_post_name = a;
    +	this.callFlash("SetFilePostName", [ a ])
    +};
    +SWFUpload.prototype.setUseQueryString = function(a) {
    +	this.settings.use_query_string = a;
    +	this.callFlash("SetUseQueryString", [ a ])
    +};
    +SWFUpload.prototype.setRequeueOnError = function(a) {
    +	this.settings.requeue_on_error = a;
    +	this.callFlash("SetRequeueOnError", [ a ])
    +};
    +SWFUpload.prototype.setHTTPSuccess = function(a) {
    +	if (typeof a === "string") {
    +		a = a.replace(" ", "").split(",")
    +	}
    +	this.settings.http_success = a;
    +	this.callFlash("SetHTTPSuccess", [ a ])
    +};
    +SWFUpload.prototype.setAssumeSuccessTimeout = function(a) {
    +	this.settings.assume_success_timeout = a;
    +	this.callFlash("SetAssumeSuccessTimeout", [ a ])
    +};
    +SWFUpload.prototype.setDebugEnabled = function(a) {
    +	this.settings.debug_enabled = a;
    +	this.callFlash("SetDebugEnabled", [ a ])
    +};
    +SWFUpload.prototype.setButtonImageURL = function(a) {
    +	if (a == undefined) {
    +		a = ""
    +	}
    +	this.settings.button_image_url = a;
    +	this.callFlash("SetButtonImageURL", [ a ])
    +};
    +SWFUpload.prototype.setButtonDimensions = function(c, a) {
    +	this.settings.button_width = c;
    +	this.settings.button_height = a;
    +	var b = this.getMovieElement();
    +	if (b != undefined) {
    +		b.style.width = c + "px";
    +		b.style.height = a + "px"
    +	}
    +	this.callFlash("SetButtonDimensions", [ c, a ])
    +};
    +SWFUpload.prototype.setButtonText = function(a) {
    +	this.settings.button_text = a;
    +	this.callFlash("SetButtonText", [ a ])
    +};
    +SWFUpload.prototype.setButtonTextPadding = function(b, a) {
    +	this.settings.button_text_top_padding = a;
    +	this.settings.button_text_left_padding = b;
    +	this.callFlash("SetButtonTextPadding", [ b, a ])
    +};
    +SWFUpload.prototype.setButtonTextStyle = function(a) {
    +	this.settings.button_text_style = a;
    +	this.callFlash("SetButtonTextStyle", [ a ])
    +};
    +SWFUpload.prototype.setButtonDisabled = function(a) {
    +	this.settings.button_disabled = a;
    +	this.callFlash("SetButtonDisabled", [ a ])
    +};
    +SWFUpload.prototype.setButtonAction = function(a) {
    +	this.settings.button_action = a;
    +	this.callFlash("SetButtonAction", [ a ])
    +};
    +SWFUpload.prototype.setButtonCursor = function(a) {
    +	this.settings.button_cursor = a;
    +	this.callFlash("SetButtonCursor", [ a ])
    +};
    +SWFUpload.prototype.queueEvent = function(b, c) {
    +	if (c == undefined) {
    +		c = []
    +	} else {
    +		if (!(c instanceof Array)) {
    +			c = [ c ]
    +		}
    +	}
    +	var a = this;
    +	if (typeof this.settings[b] === "function") {
    +		this.eventQueue.push(function() {
    +			this.settings[b].apply(this, c)
    +		});
    +		setTimeout(function() {
    +			a.executeNextEvent()
    +		}, 0)
    +	} else {
    +		if (this.settings[b] !== null) {
    +			throw "Event handler " + b + " is unknown or is not a function"
    +		}
    +	}
    +};
    +SWFUpload.prototype.executeNextEvent = function() {
    +	var a = this.eventQueue ? this.eventQueue.shift() : null;
    +	if (typeof (a) === "function") {
    +		a.apply(this)
    +	}
    +};
    +SWFUpload.prototype.unescapeFilePostParams = function(c) {
    +	var e = /[$]([0-9a-f]{4})/i;
    +	var f = {};
    +	var d;
    +	if (c != undefined) {
    +		for ( var a in c.post) {
    +			if (c.post.hasOwnProperty(a)) {
    +				d = a;
    +				var b;
    +				while ((b = e.exec(d)) !== null) {
    +					d = d.replace(b[0], String.fromCharCode(parseInt("0x"
    +							+ b[1], 16)))
    +				}
    +				f[d] = c.post[a]
    +			}
    +		}
    +		c.post = f
    +	}
    +	return c
    +};
    +SWFUpload.prototype.testExternalInterface = function() {
    +	try {
    +		return this.callFlash("TestExternalInterface")
    +	} catch (a) {
    +		return false
    +	}
    +};
    +SWFUpload.prototype.flashReady = function() {
    +	var a = this.getMovieElement();
    +	if (!a) {
    +		this
    +				.debug("Flash called back ready but the flash movie can't be found.");
    +		return
    +	}
    +	this.cleanUp(a);
    +	this.queueEvent("swfupload_loaded_handler")
    +};
    +SWFUpload.prototype.cleanUp = function(a) {
    +	try {
    +		if (this.movieElement && typeof (a.CallFunction) === "unknown") {
    +			this
    +					.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");
    +			for ( var c in a) {
    +				try {
    +					if (typeof (a[c]) === "function") {
    +						a[c] = null
    +					}
    +				} catch (b) {
    +				}
    +			}
    +		}
    +	} catch (d) {
    +	}
    +	window.__flash__removeCallback = function(e, f) {
    +		try {
    +			if (e) {
    +				e[f] = null
    +			}
    +		} catch (g) {
    +		}
    +	}
    +};
    +SWFUpload.prototype.fileDialogStart = function() {
    +	this.queueEvent("file_dialog_start_handler")
    +};
    +SWFUpload.prototype.fileQueued = function(a) {
    +	a = this.unescapeFilePostParams(a);
    +	this.queueEvent("file_queued_handler", a)
    +};
    +SWFUpload.prototype.fileQueueError = function(a, c, b) {
    +	a = this.unescapeFilePostParams(a);
    +	this.queueEvent("file_queue_error_handler", [ a, c, b ])
    +};
    +SWFUpload.prototype.fileDialogComplete = function(b, c, a) {
    +	this.queueEvent("file_dialog_complete_handler", [ b, c, a ])
    +};
    +SWFUpload.prototype.uploadStart = function(a) {
    +	a = this.unescapeFilePostParams(a);
    +	this.queueEvent("return_upload_start_handler", a)
    +};
    +SWFUpload.prototype.returnUploadStart = function(a) {
    +	var b;
    +	if (typeof this.settings.upload_start_handler === "function") {
    +		a = this.unescapeFilePostParams(a);
    +		b = this.settings.upload_start_handler.call(this, a)
    +	} else {
    +		if (this.settings.upload_start_handler != undefined) {
    +			throw "upload_start_handler must be a function"
    +		}
    +	}
    +	if (b === undefined) {
    +		b = true
    +	}
    +	b = !!b;
    +	this.callFlash("ReturnUploadStart", [ b ])
    +};
    +SWFUpload.prototype.uploadProgress = function(a, c, b) {
    +	a = this.unescapeFilePostParams(a);
    +	this.queueEvent("upload_progress_handler", [ a, c, b ])
    +};
    +SWFUpload.prototype.uploadError = function(a, c, b) {
    +	a = this.unescapeFilePostParams(a);
    +	this.queueEvent("upload_error_handler", [ a, c, b ])
    +};
    +SWFUpload.prototype.uploadSuccess = function(b, a, c) {
    +	b = this.unescapeFilePostParams(b);
    +	this.queueEvent("upload_success_handler", [ b, a, c ])
    +};
    +SWFUpload.prototype.uploadComplete = function(a) {
    +	a = this.unescapeFilePostParams(a);
    +	this.queueEvent("upload_complete_handler", a)
    +};
    +SWFUpload.prototype.debug = function(a) {
    +	this.queueEvent("debug_handler", a)
    +};
    +SWFUpload.prototype.debugMessage = function(c) {
    +	if (this.settings.debug) {
    +		var a, d = [];
    +		if (typeof c === "object" && typeof c.name === "string"
    +				&& typeof c.message === "string") {
    +			for ( var b in c) {
    +				if (c.hasOwnProperty(b)) {
    +					d.push(b + ": " + c[b])
    +				}
    +			}
    +			a = d.join("\n") || "";
    +			d = a.split("\n");
    +			a = "EXCEPTION: " + d.join("\nEXCEPTION: ");
    +			SWFUpload.Console.writeLine(a)
    +		} else {
    +			SWFUpload.Console.writeLine(c)
    +		}
    +	}
    +};
    +SWFUpload.Console = {};
    +SWFUpload.Console.writeLine = function(d) {
    +	var b, a;
    +	try {
    +		b = document.getElementById("SWFUpload_Console");
    +		if (!b) {
    +			a = document.createElement("form");
    +			document.getElementsByTagName("body")[0].appendChild(a);
    +			b = document.createElement("textarea");
    +			b.id = "SWFUpload_Console";
    +			b.style.fontFamily = "monospace";
    +			b.setAttribute("wrap", "off");
    +			b.wrap = "off";
    +			b.style.overflow = "auto";
    +			b.style.width = "700px";
    +			b.style.height = "350px";
    +			b.style.margin = "5px";
    +			a.appendChild(b)
    +		}
    +		b.value += d + "\n";
    +		b.scrollTop = b.scrollHeight - b.clientHeight
    +	} catch (c) {
    +		alert("Exception: " + c.name + " Message: " + c.message)
    +	}
    +};
    +
    +/*
    + * Uploadify v3.1.1 Copyright (c) 2012 Reactive Apps, Ronnie Garcia Released
    + * under the MIT License <http://www.opensource.org/licenses/mit-license.php>
    + */
    +
    +(function($) {
    +
    +	// These methods can be called by adding them as the first argument in the
    +	// uploadify plugin call
    +	var methods = {
    +
    +		init : function(options, swfUploadOptions) {
    +
    +			return this
    +					.each(function() {
    +
    +						// Create a reference to the jQuery DOM object
    +						var $this = $(this);
    +
    +						// Clone the original DOM object
    +						var $clone = $this.clone();
    +
    +						// Setup the default options
    +						var settings = $.extend({
    +							// Required Settings
    +							id : $this.attr('id'), // The ID of the DOM object
    +							swf : 'uploadify.swf', // The path to the uploadify
    +													// SWF file
    +							uploader : 'uploadify.php', // The path to the
    +														// server-side upload
    +														// script
    +
    +							// Options
    +							auto : true, // Automatically upload files when
    +											// added to the queue
    +							buttonClass : '', // A class name to add to the
    +												// browse button DOM object
    +							buttonCursor : 'hand', // The cursor to use with
    +													// the browse button
    +							buttonImage : null, // (String or null) The path to
    +												// an image to use for the Flash
    +												// browse button if not using
    +												// CSS to style the button
    +							buttonText : 'SELECT FILES', // The text to use
    +															// for the browse
    +															// button
    +							checkExisting : false, // The path to a server-side
    +													// script that checks for
    +													// existing files on the
    +													// server
    +							debug : false, // Turn on swfUpload debugging mode
    +							fileObjName : 'Filedata', // The name of the file
    +														// object to use in your
    +														// server-side script
    +							fileSizeLimit : 0, // The maximum size of an
    +												// uploadable file in KB
    +												// (Accepts units B KB MB GB if
    +												// string, 0 for no limit)
    +							fileTypeDesc : 'All Files', // The description for
    +														// file types in the
    +														// browse dialog
    +							fileTypeExts : '*.*', // Allowed extensions in the
    +													// browse dialog
    +													// (server-side validation
    +													// should also be used)
    +							height : 30, // The height of the browse button
    +							method : 'post', // The method to use when
    +												// sending files to the
    +												// server-side upload script
    +							multi : true, // Allow multiple file selection in
    +											// the browse dialog
    +							formData : {}, // An object with additional data to
    +											// send to the server-side upload
    +											// script with every file upload
    +							preventCaching : true, // Adds a random value to
    +													// the Flash URL to prevent
    +													// caching of it (conflicts
    +													// with existing parameters)
    +							progressData : 'percentage', // ('percentage' or
    +															// 'speed') Data to
    +															// show in the queue
    +															// item during a
    +															// file upload
    +							queueID : false, // The ID of the DOM object to
    +												// use as a file queue (without
    +												// the #)
    +							queueSizeLimit : 999, // The maximum number of
    +													// files that can be in the
    +													// queue at one time
    +							removeCompleted : true, // Remove queue items from
    +													// the queue when they are
    +													// done uploading
    +							removeTimeout : 3, // The delay in seconds before
    +												// removing a queue item if
    +												// removeCompleted is set to
    +												// true
    +							requeueErrors : false, // Keep errored files in the
    +													// queue and keep trying to
    +													// upload them
    +							successTimeout : 30, // The number of seconds to
    +													// wait for Flash to detect
    +													// the server's response
    +													// after the file has
    +													// finished uploading
    +							uploadLimit : 0, // The maximum number of files
    +												// you can upload
    +							width : 120, // The width of the browse button
    +
    +							// Events
    +							overrideEvents : []
    +						// (Array) A list of default event handlers to skip
    +						/*
    +						 * onCancel // Triggered when a file is cancelled from
    +						 * the queue onClearQueue // Triggered during the 'clear
    +						 * queue' method onDestroy // Triggered when the
    +						 * uploadify object is destroyed onDialogClose //
    +						 * Triggered when the browse dialog is closed
    +						 * onDialogOpen // Triggered when the browse dialog is
    +						 * opened onDisable // Triggered when the browse button
    +						 * gets disabled onEnable // Triggered when the browse
    +						 * button gets enabled onFallback // Triggered is Flash
    +						 * is not detected onInit // Triggered when Uploadify is
    +						 * initialized onQueueComplete // Triggered when all
    +						 * files in the queue have been uploaded onSelectError //
    +						 * Triggered when an error occurs while selecting a file
    +						 * (file size, queue size limit, etc.) onSelect //
    +						 * Triggered for each file that is selected onSWFReady //
    +						 * Triggered when the SWF button is loaded
    +						 * onUploadComplete // Triggered when a file upload
    +						 * completes (success or error) onUploadError //
    +						 * Triggered when a file upload returns an error
    +						 * onUploadSuccess // Triggered when a file is uploaded
    +						 * successfully onUploadProgress // Triggered every time
    +						 * a file progress is updated onUploadStart // Triggered
    +						 * immediately before a file upload starts
    +						 */
    +						}, options);
    +
    +						// Prepare settings for SWFUpload
    +						var swfUploadSettings = {
    +							assume_success_timeout : settings.successTimeout,
    +							button_placeholder_id : settings.id,
    +							button_width : settings.width,
    +							button_height : settings.height,
    +							button_text : null,
    +							button_text_style : null,
    +							button_text_top_padding : 0,
    +							button_text_left_padding : 0,
    +							button_action : (settings.multi ? SWFUpload.BUTTON_ACTION.SELECT_FILES
    +									: SWFUpload.BUTTON_ACTION.SELECT_FILE),
    +							button_disabled : false,
    +							button_cursor : (settings.buttonCursor == 'arrow' ? SWFUpload.CURSOR.ARROW
    +									: SWFUpload.CURSOR.HAND),
    +							button_window_mode : SWFUpload.WINDOW_MODE.TRANSPARENT,
    +							debug : settings.debug,
    +							requeue_on_error : settings.requeueErrors,
    +							file_post_name : settings.fileObjName,
    +							file_size_limit : settings.fileSizeLimit,
    +							file_types : settings.fileTypeExts,
    +							file_types_description : settings.fileTypeDesc,
    +							file_queue_limit : settings.queueSizeLimit,
    +							file_upload_limit : settings.uploadLimit,
    +							flash_url : settings.swf,
    +							prevent_swf_caching : settings.preventCaching,
    +							post_params : settings.formData,
    +							upload_url : settings.uploader,
    +							use_query_string : (settings.method == 'get'),
    +
    +							// Event Handlers
    +							file_dialog_complete_handler : handlers.onDialogClose,
    +							file_dialog_start_handler : handlers.onDialogOpen,
    +							file_queued_handler : handlers.onSelect,
    +							file_queue_error_handler : handlers.onSelectError,
    +							swfupload_loaded_handler : settings.onSWFReady,
    +							upload_complete_handler : handlers.onUploadComplete,
    +							upload_error_handler : handlers.onUploadError,
    +							upload_progress_handler : handlers.onUploadProgress,
    +							upload_start_handler : handlers.onUploadStart,
    +							upload_success_handler : handlers.onUploadSuccess
    +						}
    +
    +						// Merge the user-defined options with the defaults
    +						if (swfUploadOptions) {
    +							swfUploadSettings = $.extend(swfUploadSettings,
    +									swfUploadOptions);
    +						}
    +						// Add the user-defined settings to the swfupload object
    +						swfUploadSettings = $.extend(swfUploadSettings,
    +								settings);
    +
    +						// Detect if Flash is available
    +						var playerVersion = swfobject.getFlashPlayerVersion();
    +						var flashInstalled = (playerVersion.major >= 9);
    +
    +						if (flashInstalled) {
    +							// Create the swfUpload instance
    +							window['uploadify_' + settings.id] = new SWFUpload(
    +									swfUploadSettings);
    +							var swfuploadify = window['uploadify_'
    +									+ settings.id];
    +
    +							// Add the SWFUpload object to the elements data
    +							// object
    +							$this.data('uploadify', swfuploadify);
    +
    +							// Wrap the instance
    +							var $wrapper = $('<div />', {
    +								'id' : settings.id,
    +								'class' : 'uploadify',
    +								'css' : {
    +									'height' : settings.height + 'px',
    +									'width' : settings.width + 'px'
    +								}
    +							});
    +							$('#' + swfuploadify.movieName).wrap($wrapper);
    +							// Recreate the reference to wrapper
    +							$wrapper = $('#' + settings.id);
    +							// Add the data object to the wrapper
    +							$wrapper.data('uploadify', swfuploadify);
    +
    +							// Create the button
    +							var $button = $('<div />', {
    +								'id' : settings.id + '-button',
    +								'class' : 'uploadify-button '
    +										+ settings.buttonClass
    +							});
    +							if (settings.buttonImage) {
    +								$button.css({
    +									'background-image' : "url('"
    +											+ settings.buttonImage + "')",
    +									'text-indent' : '-9999px'
    +								});
    +							}
    +							$button.html(
    +									'<span class="uploadify-button-text">'
    +											+ settings.buttonText + '</span>')
    +									.css({
    +										'height' : settings.height + 'px',
    +										'line-height' : settings.height + 'px',
    +										'width' : settings.width + 'px'
    +									});
    +							// Append the button to the wrapper
    +							$wrapper.append($button);
    +
    +							// Adjust the styles of the movie
    +							$('#' + swfuploadify.movieName).css({
    +								'position' : 'absolute',
    +								'z-index' : 1
    +							});
    +
    +							// Create the file queue
    +							if (!settings.queueID) {
    +								var $queue = $('<div />', {
    +									'id' : settings.id + '-queue',
    +									'class' : 'uploadify-queue'
    +								});
    +								$wrapper.after($queue);
    +								swfuploadify.settings.queueID = settings.id
    +										+ '-queue';
    +								swfuploadify.settings.defaultQueue = true;
    +							}
    +
    +							// Create some queue related objects and variables
    +							swfuploadify.queueData = {
    +								files : {}, // The files in the queue
    +								filesSelected : 0, // The number of files
    +													// selected in the last
    +													// select operation
    +								filesQueued : 0, // The number of files added
    +													// to the queue in the last
    +													// select operation
    +								filesReplaced : 0, // The number of files
    +													// replaced in the last
    +													// select operation
    +								filesCancelled : 0, // The number of files that
    +													// were cancelled instead of
    +													// replaced
    +								filesErrored : 0, // The number of files that
    +													// caused error in the last
    +													// select operation
    +								uploadsSuccessful : 0, // The number of files
    +														// that were
    +														// successfully uploaded
    +								uploadsErrored : 0, // The number of files that
    +													// returned errors during
    +													// upload
    +								averageSpeed : 0, // The average speed of the
    +													// uploads in KB
    +								queueLength : 0, // The number of files in
    +													// the queue
    +								queueSize : 0, // The size in bytes of the
    +												// entire queue
    +								uploadSize : 0, // The size in bytes of the
    +												// upload queue
    +								queueBytesUploaded : 0, // The size in bytes
    +														// that have been
    +														// uploaded for the
    +														// current upload queue
    +								uploadQueue : [], // The files currently to be
    +													// uploaded
    +								errorMsg : 'Some files were not added to the queue:'
    +							};
    +
    +							// Save references to all the objects
    +							swfuploadify.original = $clone;
    +							swfuploadify.wrapper = $wrapper;
    +							swfuploadify.button = $button;
    +							swfuploadify.queue = $queue;
    +
    +							// Call the user-defined init event handler
    +							if (settings.onInit)
    +								settings.onInit.call($this, swfuploadify);
    +
    +						} else {
    +
    +							// Call the fallback function
    +							if (settings.onFallback)
    +								settings.onFallback.call($this);
    +
    +						}
    +					});
    +
    +		},
    +
    +		// Stop a file upload and remove it from the queue
    +		cancel : function(fileID, supressEvent) {
    +
    +			var args = arguments;
    +
    +			this
    +					.each(function() {
    +						// Create a reference to the jQuery DOM object
    +						var $this = $(this), swfuploadify = $this
    +								.data('uploadify'), settings = swfuploadify.settings, delay = -1;
    +
    +						if (args[0]) {
    +							// Clear the queue
    +							if (args[0] == '*') {
    +								var queueItemCount = swfuploadify.queueData.queueLength;
    +								$('#' + settings.queueID).find(
    +										'.uploadify-queue-item').each(
    +										function() {
    +											delay++;
    +											if (args[1] === true) {
    +												swfuploadify
    +														.cancelUpload($(this)
    +																.attr('id'),
    +																false);
    +											} else {
    +												swfuploadify.cancelUpload($(
    +														this).attr('id'));
    +											}
    +											$(this).find('.data').removeClass(
    +													'data')
    +													.html(' - 宸插彇娑');
    +											$(this).find(
    +													'.uploadify-progress-bar')
    +													.remove();
    +											$(this).delay(1000 + 100 * delay)
    +													.fadeOut(500, function() {
    +														$(this).remove();
    +													});
    +										});
    +								swfuploadify.queueData.queueSize = 0;
    +								swfuploadify.queueData.queueLength = 0;
    +								// Trigger the onClearQueue event
    +								if (settings.onClearQueue)
    +									settings.onClearQueue.call($this,
    +											queueItemCount);
    +							} else {
    +								for ( var n = 0; n < args.length; n++) {
    +									swfuploadify.cancelUpload(args[n]);
    +									$('#' + args[n]).find('.data').removeClass(
    +											'data').html(' - 宸插彇娑');
    +									$('#' + args[n]).find(
    +											'.uploadify-progress-bar').remove();
    +									$('#' + args[n]).delay(1000 + 100 * n)
    +											.fadeOut(500, function() {
    +												$(this).remove();
    +											});
    +								}
    +							}
    +						} else {
    +							var item = $('#' + settings.queueID).find(
    +									'.uploadify-queue-item').get(0);
    +							$item = $(item);
    +							swfuploadify.cancelUpload($item.attr('id'));
    +							$item.find('.data').removeClass('data').html(
    +									' - Cancelled');
    +							$item.find('.uploadify-progress-bar').remove();
    +							$item.delay(1000).fadeOut(500, function() {
    +								$(this).remove();
    +							});
    +						}
    +					});
    +
    +		},
    +
    +		// Revert the DOM object back to its original state
    +		destroy : function() {
    +
    +			this
    +					.each(function() {
    +						// Create a reference to the jQuery DOM object
    +						var $this = $(this), swfuploadify = $this
    +								.data('uploadify'), settings = swfuploadify.settings;
    +
    +						// Destroy the SWF object and
    +						swfuploadify.destroy();
    +
    +						// Destroy the queue
    +						if (settings.defaultQueue) {
    +							$('#' + settings.queueID).remove();
    +						}
    +
    +						// Reload the original DOM element
    +						$('#' + settings.id).replaceWith(swfuploadify.original);
    +
    +						// Call the user-defined event handler
    +						if (settings.onDestroy)
    +							settings.onDestroy.call(this);
    +
    +						delete swfuploadify;
    +					});
    +
    +		},
    +
    +		// Disable the select button
    +		disable : function(isDisabled) {
    +
    +			this
    +					.each(function() {
    +						// Create a reference to the $uery DOM object
    +						var $this = $(this), swfuploadify = $this
    +								.data('uploadify'), settings = swfuploadify.settings;
    +
    +						// Call the user-defined event handlers
    +						if (isDisabled) {
    +							swfuploadify.button.addClass('disabled');
    +							if (settings.onDisable)
    +								settings.onDisable.call(this);
    +						} else {
    +							swfuploadify.button.removeClass('disabled');
    +							if (settings.onEnable)
    +								settings.onEnable.call(this);
    +						}
    +
    +						// Enable/disable the browse button
    +						swfuploadify.setButtonDisabled(isDisabled);
    +					});
    +
    +		},
    +
    +		// Get or set the settings data
    +		settings : function(name, value, resetObjects) {
    +
    +			var args = arguments;
    +			var returnValue = value;
    +
    +			this
    +					.each(function() {
    +						// Create a reference to the jQuery DOM object
    +						var $this = $(this), swfuploadify = $this
    +								.data('uploadify'), settings = swfuploadify.settings;
    +
    +						if (typeof (args[0]) == 'object') {
    +							for ( var n in value) {
    +								setData(n, value[n]);
    +							}
    +						}
    +						if (args.length === 1) {
    +							returnValue = settings[name];
    +						} else {
    +							switch (name) {
    +							case 'uploader':
    +								swfuploadify.setUploadURL(value);
    +								break;
    +							case 'formData':
    +								if (!resetObjects) {
    +									value = $.extend(settings.formData, value);
    +								}
    +								swfuploadify.setPostParams(settings.formData);
    +								break;
    +							case 'method':
    +								if (value == 'get') {
    +									swfuploadify.setUseQueryString(true);
    +								} else {
    +									swfuploadify.setUseQueryString(false);
    +								}
    +								break;
    +							case 'fileObjName':
    +								swfuploadify.setFilePostName(value);
    +								break;
    +							case 'fileTypeExts':
    +								swfuploadify.setFileTypes(value,
    +										settings.fileTypeDesc);
    +								break;
    +							case 'fileTypeDesc':
    +								swfuploadify.setFileTypes(
    +										settings.fileTypeExts, value);
    +								break;
    +							case 'fileSizeLimit':
    +								swfuploadify.setFileSizeLimit(value);
    +								break;
    +							case 'uploadLimit':
    +								swfuploadify.setFileUploadLimit(value);
    +								break;
    +							case 'queueSizeLimit':
    +								swfuploadify.setFileQueueLimit(value);
    +								break;
    +							case 'buttonImage':
    +								swfuploadify.button.css('background-image',
    +										settingValue);
    +								break;
    +							case 'buttonCursor':
    +								if (value == 'arrow') {
    +									swfuploadify
    +											.setButtonCursor(SWFUpload.CURSOR.ARROW);
    +								} else {
    +									swfuploadify
    +											.setButtonCursor(SWFUpload.CURSOR.HAND);
    +								}
    +								break;
    +							case 'buttonText':
    +								$('#' + settings.id + '-button').find(
    +										'.uploadify-button-text').html(value);
    +								break;
    +							case 'width':
    +								swfuploadify.setButtonDimensions(value,
    +										settings.height);
    +								break;
    +							case 'height':
    +								swfuploadify.setButtonDimensions(
    +										settings.width, value);
    +								break;
    +							case 'multi':
    +								if (value) {
    +									swfuploadify
    +											.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILES);
    +								} else {
    +									swfuploadify
    +											.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILE);
    +								}
    +								break;
    +							}
    +							settings[name] = value;
    +						}
    +					});
    +
    +			if (args.length === 1) {
    +				return returnValue;
    +			}
    +
    +		},
    +
    +		// Stop the current uploads and requeue what is in progress
    +		stop : function() {
    +
    +			this.each(function() {
    +				// Create a reference to the jQuery DOM object
    +				var $this = $(this), swfuploadify = $this.data('uploadify');
    +
    +				// Reset the queue information
    +				swfuploadify.queueData.averageSpeed = 0;
    +				swfuploadify.queueData.uploadSize = 0;
    +				swfuploadify.queueData.bytesUploaded = 0;
    +				swfuploadify.queueData.uploadQueue = [];
    +
    +				swfuploadify.stopUpload();
    +			});
    +
    +		},
    +
    +		// Start uploading files in the queue
    +		upload : function() {
    +
    +			var args = arguments;
    +
    +			this
    +					.each(function() {
    +						// Create a reference to the jQuery DOM object
    +						var $this = $(this), swfuploadify = $this
    +								.data('uploadify');
    +
    +						// Reset the queue information
    +						swfuploadify.queueData.averageSpeed = 0;
    +						swfuploadify.queueData.uploadSize = 0;
    +						swfuploadify.queueData.bytesUploaded = 0;
    +						swfuploadify.queueData.uploadQueue = [];
    +
    +						// Upload the files
    +						if (args[0]) {
    +							if (args[0] == '*') {
    +								swfuploadify.queueData.uploadSize = swfuploadify.queueData.queueSize;
    +								swfuploadify.queueData.uploadQueue.push('*');
    +								swfuploadify.startUpload();
    +							} else {
    +								for ( var n = 0; n < args.length; n++) {
    +									swfuploadify.queueData.uploadSize += swfuploadify.queueData.files[args[n]].size;
    +									swfuploadify.queueData.uploadQueue
    +											.push(args[n]);
    +								}
    +								swfuploadify
    +										.startUpload(swfuploadify.queueData.uploadQueue
    +												.shift());
    +							}
    +						} else {
    +							swfuploadify.startUpload();
    +						}
    +
    +					});
    +
    +		}
    +
    +	}
    +
    +	// These functions handle all the events that occur with the file uploader
    +	var handlers = {
    +
    +		// Triggered when the file dialog is opened
    +		onDialogOpen : function() {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			// Reset some queue info
    +			this.queueData.errorMsg = 'Some files were not added to the queue:';
    +			this.queueData.filesReplaced = 0;
    +			this.queueData.filesCancelled = 0;
    +
    +			// Call the user-defined event handler
    +			if (settings.onDialogOpen)
    +				settings.onDialogOpen.call(this);
    +		},
    +
    +		// Triggered when the browse dialog is closed
    +		onDialogClose : function(filesSelected, filesQueued, queueLength) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			// Update the queue information
    +			this.queueData.filesErrored = filesSelected - filesQueued;
    +			this.queueData.filesSelected = filesSelected;
    +			this.queueData.filesQueued = filesQueued
    +					- this.queueData.filesCancelled;
    +			this.queueData.queueLength = queueLength;
    +
    +			// Run the default event handler
    +			if ($.inArray('onDialogClose', settings.overrideEvents) < 0) {
    +				if (this.queueData.filesErrored > 0) {
    +					alert(this.queueData.errorMsg);
    +				}
    +			}
    +
    +			// Call the user-defined event handler
    +			if (settings.onDialogClose)
    +				settings.onDialogClose.call(this, this.queueData);
    +
    +			// Upload the files if auto is true
    +			if (settings.auto)
    +				$('#' + settings.id).uploadify('upload', '*');
    +		},
    +
    +		// Triggered once for each file added to the queue
    +		onSelect : function(file) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			// Check if a file with the same name exists in the queue
    +			var queuedFile = {};
    +			for ( var n in this.queueData.files) {
    +				queuedFile = this.queueData.files[n];
    +				if (queuedFile.uploaded != true && queuedFile.name == file.name) {
    +					var replaceQueueItem = confirm('The file named "'
    +							+ file.name
    +							+ '" is already in the queue.\nDo you want to replace the existing item in the queue?');
    +					if (!replaceQueueItem) {
    +						this.cancelUpload(file.id);
    +						this.queueData.filesCancelled++;
    +						return false;
    +					} else {
    +						$('#' + queuedFile.id).remove();
    +						this.cancelUpload(queuedFile.id);
    +						this.queueData.filesReplaced++;
    +					}
    +				}
    +			}
    +
    +			// Get the size of the file
    +			var fileSize = Math.round(file.size / 1024);
    +			var suffix = 'KB';
    +			if (fileSize > 1000) {
    +				fileSize = Math.round(fileSize / 1000);
    +				suffix = 'MB';
    +			}
    +			var fileSizeParts = fileSize.toString().split('.');
    +			fileSize = fileSizeParts[0];
    +			if (fileSizeParts.length > 1) {
    +				fileSize += '.' + fileSizeParts[1].substr(0, 2);
    +			}
    +			fileSize += suffix;
    +
    +			// Truncate the filename if it's too long
    +			var fileName = file.name;
    +			if (fileName.length > 25) {
    +				fileName = fileName.substr(0, 25) + '...';
    +			}
    +
    +			// Run the default event handler
    +			if ($.inArray('onSelect', settings.overrideEvents) < 0) {
    +
    +				// Add the file item to the queue
    +				$('#' + settings.queueID)
    +						.append(
    +								'<div id="'
    +										+ file.id
    +										+ '" class="uploadify-queue-item">\
    +					<div class="cancel">\
    +						<a href="javascript:$(\'#'
    +										+ settings.id
    +										+ '\').uploadify(\'cancel\', \''
    +										+ file.id
    +										+ '\')">X</a>\
    +					</div>\
    +					<span class="fileName">'
    +										+ fileName
    +										+ ' ('
    +										+ fileSize
    +										+ ')</span><span class="data"></span>\
    +					<div class="uploadify-progress">\
    +						<div class="uploadify-progress-bar"><!--Progress Bar--></div>\
    +					</div>\
    +				</div>');
    +
    +			}
    +
    +			this.queueData.queueSize += file.size;
    +			this.queueData.files[file.id] = file;
    +
    +			// Call the user-defined event handler
    +			if (settings.onSelect)
    +				settings.onSelect.apply(this, arguments);
    +		},
    +
    +		// Triggered when a file is not added to the queue
    +		onSelectError : function(file, errorCode, errorMsg) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			// Run the default event handler
    +			if ($.inArray('onSelectError', settings.overrideEvents) < 0) {
    +				switch (errorCode) {
    +				case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:
    +					if (settings.queueSizeLimit > errorMsg) {
    +						this.queueData.errorMsg += '\nThe number of files selected exceeds the remaining upload limit ('
    +								+ errorMsg + ').';
    +					} else {
    +						this.queueData.errorMsg += '\nThe number of files selected exceeds the queue size limit ('
    +								+ settings.queueSizeLimit + ').';
    +					}
    +					break;
    +				case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
    +					this.queueData.errorMsg += '\nThe file "' + file.name
    +							+ '" exceeds the size limit ('
    +							+ settings.fileSizeLimit + ').';
    +					break;
    +				case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
    +					this.queueData.errorMsg += '\nThe file "' + file.name
    +							+ '" is empty.';
    +					break;
    +				case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
    +					this.queueData.errorMsg += '\nThe file "' + file.name
    +							+ '" is not an accepted file type ('
    +							+ settings.fileTypeDesc + ').';
    +					break;
    +				}
    +			}
    +			if (errorCode != SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED) {
    +				delete this.queueData.files[file.id];
    +			}
    +
    +			// Call the user-defined event handler
    +			if (settings.onSelectError)
    +				settings.onSelectError.apply(this, arguments);
    +		},
    +
    +		// Triggered when all the files in the queue have been processed
    +		onQueueComplete : function() {
    +			if (this.settings.onQueueComplete)
    +				this.settings.onQueueComplete.call(this,
    +						this.settings.queueData);
    +		},
    +
    +		// Triggered when a file upload successfully completes
    +		onUploadComplete : function(file) {
    +			// Load the swfupload settings
    +			var settings = this.settings, swfuploadify = this;
    +
    +			// Check if all the files have completed uploading
    +			var stats = this.getStats();
    +			this.queueData.queueLength = stats.files_queued;
    +			if (this.queueData.uploadQueue[0] == '*') {
    +				if (this.queueData.queueLength > 0) {
    +					this.startUpload();
    +				} else {
    +					this.queueData.uploadQueue = [];
    +
    +					// Call the user-defined event handler for queue complete
    +					if (settings.onQueueComplete)
    +						settings.onQueueComplete.call(this, this.queueData);
    +				}
    +			} else {
    +				if (this.queueData.uploadQueue.length > 0) {
    +					this.startUpload(this.queueData.uploadQueue.shift());
    +				} else {
    +					this.queueData.uploadQueue = [];
    +
    +					// Call the user-defined event handler for queue complete
    +					if (settings.onQueueComplete)
    +						settings.onQueueComplete.call(this, this.queueData);
    +				}
    +			}
    +
    +			// Call the default event handler
    +			if ($.inArray('onUploadComplete', settings.overrideEvents) < 0) {
    +				if (settings.removeCompleted) {
    +					switch (file.filestatus) {
    +					case SWFUpload.FILE_STATUS.COMPLETE:
    +						setTimeout(function() {
    +							if ($('#' + file.id)) {
    +								swfuploadify.queueData.queueSize -= file.size;
    +								swfuploadify.queueData.queueLength -= 1;
    +								delete swfuploadify.queueData.files[file.id]
    +								$('#' + file.id).fadeOut(500, function() {
    +									$(this).remove();
    +								});
    +							}
    +						}, settings.removeTimeout * 1000);
    +						break;
    +					case SWFUpload.FILE_STATUS.ERROR:
    +						if (!settings.requeueErrors) {
    +							setTimeout(
    +									function() {
    +										if ($('#' + file.id)) {
    +											swfuploadify.queueData.queueSize -= file.size;
    +											swfuploadify.queueData.queueLength -= 1;
    +											delete swfuploadify.queueData.files[file.id];
    +											$('#' + file.id).fadeOut(500,
    +													function() {
    +														$(this).remove();
    +													});
    +										}
    +									}, settings.removeTimeout * 1000);
    +						}
    +						break;
    +					}
    +				} else {
    +					file.uploaded = true;
    +				}
    +			}
    +
    +			// Call the user-defined event handler
    +			if (settings.onUploadComplete)
    +				settings.onUploadComplete.call(this, file);
    +		},
    +
    +		// Triggered when a file upload returns an error
    +		onUploadError : function(file, errorCode, errorMsg) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			// Set the error string
    +			var errorString = 'Error';
    +			switch (errorCode) {
    +			case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:
    +				errorString = 'HTTP Error (' + errorMsg + ')';
    +				break;
    +			case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:
    +				errorString = 'Missing Upload URL';
    +				break;
    +			case SWFUpload.UPLOAD_ERROR.IO_ERROR:
    +				errorString = 'IO Error';
    +				break;
    +			case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:
    +				errorString = 'Security Error';
    +				break;
    +			case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
    +				alert('The upload limit has been reached (' + errorMsg + ').');
    +				errorString = 'Exceeds Upload Limit';
    +				break;
    +			case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:
    +				errorString = 'Failed';
    +				break;
    +			case SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND:
    +				break;
    +			case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:
    +				errorString = 'Validation Error';
    +				break;
    +			case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
    +				errorString = 'Cancelled';
    +				this.queueData.queueSize -= file.size;
    +				this.queueData.queueLength -= 1;
    +				if (file.status == SWFUpload.FILE_STATUS.IN_PROGRESS
    +						|| $.inArray(file.id, this.queueData.uploadQueue) >= 0) {
    +					this.queueData.uploadSize -= file.size;
    +				}
    +				// Trigger the onCancel event
    +				if (settings.onCancel)
    +					settings.onCancel.call(this, file);
    +				delete this.queueData.files[file.id];
    +				break;
    +			case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
    +				errorString = 'Stopped';
    +				break;
    +			}
    +
    +			// Call the default event handler
    +			if ($.inArray('onUploadError', settings.overrideEvents) < 0) {
    +
    +				if (errorCode != SWFUpload.UPLOAD_ERROR.FILE_CANCELLED
    +						&& errorCode != SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED) {
    +					$('#' + file.id).addClass('uploadify-error');
    +				}
    +
    +				// Reset the progress bar
    +				$('#' + file.id).find('.uploadify-progress-bar').css('width',
    +						'1px');
    +
    +				// Add the error message to the queue item
    +				if (errorCode != SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND
    +						&& file.status != SWFUpload.FILE_STATUS.COMPLETE) {
    +					$('#' + file.id).find('.data').html(' - ' + errorString);
    +				}
    +			}
    +
    +			var stats = this.getStats();
    +			this.queueData.uploadsErrored = stats.upload_errors;
    +
    +			// Call the user-defined event handler
    +			if (settings.onUploadError)
    +				settings.onUploadError.call(this, file, errorCode, errorMsg,
    +						errorString);
    +		},
    +
    +		// Triggered periodically during a file upload
    +		onUploadProgress : function(file, fileBytesLoaded, fileTotalBytes) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			// Setup all the variables
    +			var timer = new Date();
    +			var newTime = timer.getTime();
    +			var lapsedTime = newTime - this.timer;
    +			if (lapsedTime > 500) {
    +				this.timer = newTime;
    +			}
    +			var lapsedBytes = fileBytesLoaded - this.bytesLoaded;
    +			this.bytesLoaded = fileBytesLoaded;
    +			var queueBytesLoaded = this.queueData.queueBytesUploaded
    +					+ fileBytesLoaded;
    +			var percentage = Math.round(fileBytesLoaded / fileTotalBytes * 100);
    +
    +			// Calculate the average speed
    +			var suffix = 'KB/s';
    +			var mbs = 0;
    +			var kbs = (lapsedBytes / 1024) / (lapsedTime / 1000);
    +			kbs = Math.floor(kbs * 10) / 10;
    +			if (this.queueData.averageSpeed > 0) {
    +				this.queueData.averageSpeed = Math
    +						.floor((this.queueData.averageSpeed + kbs) / 2);
    +			} else {
    +				this.queueData.averageSpeed = Math.floor(kbs);
    +			}
    +			if (kbs > 1000) {
    +				mbs = (kbs * .001);
    +				this.queueData.averageSpeed = Math.floor(mbs);
    +				suffix = 'MB/s';
    +			}
    +
    +			// Call the default event handler
    +			if ($.inArray('onUploadProgress', settings.overrideEvents) < 0) {
    +				if (settings.progressData == 'percentage') {
    +					$('#' + file.id).find('.data').html(
    +							' - ' + percentage + '%');
    +				} else if (settings.progressData == 'speed' && lapsedTime > 500) {
    +					$('#' + file.id).find('.data').html(
    +							' - ' + this.queueData.averageSpeed + suffix);
    +				}
    +				$('#' + file.id).find('.uploadify-progress-bar').css('width',
    +						percentage + '%');
    +			}
    +
    +			// Call the user-defined event handler
    +			if (settings.onUploadProgress)
    +				settings.onUploadProgress.call(this, file, fileBytesLoaded,
    +						fileTotalBytes, queueBytesLoaded,
    +						this.queueData.uploadSize);
    +		},
    +
    +		// Triggered right before a file is uploaded
    +		onUploadStart : function(file) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			var timer = new Date();
    +			this.timer = timer.getTime();
    +			this.bytesLoaded = 0;
    +			if (this.queueData.uploadQueue.length == 0) {
    +				this.queueData.uploadSize = file.size;
    +			}
    +			if (settings.checkExisting) {
    +				$
    +						.ajax({
    +							type : 'POST',
    +							async : false,
    +							url : settings.checkExisting,
    +							data : {
    +								filename : file.name
    +							},
    +							success : function(data) {
    +								if (data == 1) {
    +									var overwrite = confirm('A file with the name "'
    +											+ file.name
    +											+ '" already exists on the server.\nWould you like to replace the existing file?');
    +									if (!overwrite) {
    +										this.cancelUpload(file.id);
    +										$('#' + file.id).remove();
    +										if (this.queueData.uploadQueue.length > 0
    +												&& this.queueData.queueLength > 0) {
    +											if (this.queueData.uploadQueue[0] == '*') {
    +												this.startUpload();
    +											} else {
    +												this
    +														.startUpload(this.queueData.uploadQueue
    +																.shift());
    +											}
    +										}
    +									}
    +								}
    +							}
    +						});
    +			}
    +
    +			// Call the user-defined event handler
    +			if (settings.onUploadStart)
    +				settings.onUploadStart.call(this, file);
    +		},
    +
    +		// Triggered when a file upload returns a successful code
    +		onUploadSuccess : function(file, data, response) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +			var stats = this.getStats();
    +			this.queueData.uploadsSuccessful = stats.successful_uploads;
    +			this.queueData.queueBytesUploaded += file.size;
    +
    +			// Call the default event handler
    +			if ($.inArray('onUploadSuccess', settings.overrideEvents) < 0) {
    +				$('#' + file.id).find('.data').html(' - Complete');
    +			}
    +
    +			// Call the user-defined event handler
    +			if (settings.onUploadSuccess)
    +				settings.onUploadSuccess.call(this, file, data, response);
    +		}
    +
    +	}
    +
    +	$.fn.uploadify = function(method) {
    +
    +		if (methods[method]) {
    +			return methods[method].apply(this, Array.prototype.slice.call(
    +					arguments, 1));
    +		} else if (typeof method === 'object' || !method) {
    +			return methods.init.apply(this, arguments);
    +		} else {
    +			$.error('The method ' + method + ' does not exist in $.uploadify');
    +		}
    +
    +	}
    +
    +})($);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/uploadify/jquery.uploadify-3.1.min.js b/src/main/webapp/plug-in/uploadify/jquery.uploadify-3.1.min.js
    new file mode 100644
    index 00000000..8ef8a244
    --- /dev/null
    +++ b/src/main/webapp/plug-in/uploadify/jquery.uploadify-3.1.min.js
    @@ -0,0 +1,16 @@
    +/*
    +Uploadify v3.1.1
    +Copyright (c) 2012 Reactive Apps, Ronnie Garcia
    +Released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
    +
    +SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
    +mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,  http://www.vinterwebb.se/
    +SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilz茅n and Mammon Media and is released under the MIT License:
    +http://www.opensource.org/licenses/mit-license.php
    +SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
    +http://www.opensource.org/licenses/mit-license.php
    +
    +SWFObject v2.2 <http://code.google.com/p/swfobject/> 
    +is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
    +*/
    +;var swfobject=function(){var aq="undefined",aD="object",ab="Shockwave Flash",X="ShockwaveFlash.ShockwaveFlash",aE="application/x-shockwave-flash",ac="SWFObjectExprInst",ax="onreadystatechange",af=window,aL=document,aB=navigator,aa=false,Z=[aN],aG=[],ag=[],al=[],aJ,ad,ap,at,ak=false,aU=false,aH,an,aI=true,ah=function(){var a=typeof aL.getElementById!=aq&&typeof aL.getElementsByTagName!=aq&&typeof aL.createElement!=aq,e=aB.userAgent.toLowerCase(),c=aB.platform.toLowerCase(),h=c?/win/.test(c):/win/.test(e),j=c?/mac/.test(c):/mac/.test(e),g=/webkit/.test(e)?parseFloat(e.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,d=!+"\v1",f=[0,0,0],k=null;if(typeof aB.plugins!=aq&&typeof aB.plugins[ab]==aD){k=aB.plugins[ab].description;if(k&&!(typeof aB.mimeTypes!=aq&&aB.mimeTypes[aE]&&!aB.mimeTypes[aE].enabledPlugin)){aa=true;d=false;k=k.replace(/^.*\s+(\S+\s+\S+$)/,"$1");f[0]=parseInt(k.replace(/^(.*)\..*$/,"$1"),10);f[1]=parseInt(k.replace(/^.*\.(.*)\s.*$/,"$1"),10);f[2]=/[a-zA-Z]/.test(k)?parseInt(k.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0;}}else{if(typeof af.ActiveXObject!=aq){try{var i=new ActiveXObject(X);if(i){k=i.GetVariable("$version");if(k){d=true;k=k.split(" ")[1].split(",");f=[parseInt(k[0],10),parseInt(k[1],10),parseInt(k[2],10)];}}}catch(b){}}}return{w3:a,pv:f,wk:g,ie:d,win:h,mac:j};}(),aK=function(){if(!ah.w3){return;}if((typeof aL.readyState!=aq&&aL.readyState=="complete")||(typeof aL.readyState==aq&&(aL.getElementsByTagName("body")[0]||aL.body))){aP();}if(!ak){if(typeof aL.addEventListener!=aq){aL.addEventListener("DOMContentLoaded",aP,false);}if(ah.ie&&ah.win){aL.attachEvent(ax,function(){if(aL.readyState=="complete"){aL.detachEvent(ax,arguments.callee);aP();}});if(af==top){(function(){if(ak){return;}try{aL.documentElement.doScroll("left");}catch(a){setTimeout(arguments.callee,0);return;}aP();})();}}if(ah.wk){(function(){if(ak){return;}if(!/loaded|complete/.test(aL.readyState)){setTimeout(arguments.callee,0);return;}aP();})();}aC(aP);}}();function aP(){if(ak){return;}try{var b=aL.getElementsByTagName("body")[0].appendChild(ar("span"));b.parentNode.removeChild(b);}catch(a){return;}ak=true;var d=Z.length;for(var c=0;c<d;c++){Z[c]();}}function aj(a){if(ak){a();}else{Z[Z.length]=a;}}function aC(a){if(typeof af.addEventListener!=aq){af.addEventListener("load",a,false);}else{if(typeof aL.addEventListener!=aq){aL.addEventListener("load",a,false);}else{if(typeof af.attachEvent!=aq){aM(af,"onload",a);}else{if(typeof af.onload=="function"){var b=af.onload;af.onload=function(){b();a();};}else{af.onload=a;}}}}}function aN(){if(aa){Y();}else{am();}}function Y(){var d=aL.getElementsByTagName("body")[0];var b=ar(aD);b.setAttribute("type",aE);var a=d.appendChild(b);if(a){var c=0;(function(){if(typeof a.GetVariable!=aq){var e=a.GetVariable("$version");if(e){e=e.split(" ")[1].split(",");ah.pv=[parseInt(e[0],10),parseInt(e[1],10),parseInt(e[2],10)];}}else{if(c<10){c++;setTimeout(arguments.callee,10);return;}}d.removeChild(b);a=null;am();})();}else{am();}}function am(){var g=aG.length;if(g>0){for(var h=0;h<g;h++){var c=aG[h].id;var l=aG[h].callbackFn;var a={success:false,id:c};if(ah.pv[0]>0){var i=aS(c);if(i){if(ao(aG[h].swfVersion)&&!(ah.wk&&ah.wk<312)){ay(c,true);if(l){a.success=true;a.ref=av(c);l(a);}}else{if(aG[h].expressInstall&&au()){var e={};e.data=aG[h].expressInstall;e.width=i.getAttribute("width")||"0";e.height=i.getAttribute("height")||"0";if(i.getAttribute("class")){e.styleclass=i.getAttribute("class");}if(i.getAttribute("align")){e.align=i.getAttribute("align");}var f={};var d=i.getElementsByTagName("param");var k=d.length;for(var j=0;j<k;j++){if(d[j].getAttribute("name").toLowerCase()!="movie"){f[d[j].getAttribute("name")]=d[j].getAttribute("value");}}ae(e,f,c,l);}else{aF(i);if(l){l(a);}}}}}else{ay(c,true);if(l){var b=av(c);if(b&&typeof b.SetVariable!=aq){a.success=true;a.ref=b;}l(a);}}}}}function av(b){var d=null;var c=aS(b);if(c&&c.nodeName=="OBJECT"){if(typeof c.SetVariable!=aq){d=c;}else{var a=c.getElementsByTagName(aD)[0];if(a){d=a;}}}return d;}function au(){return !aU&&ao("6.0.65")&&(ah.win||ah.mac)&&!(ah.wk&&ah.wk<312);}function ae(f,d,h,e){aU=true;ap=e||null;at={success:false,id:h};var a=aS(h);if(a){if(a.nodeName=="OBJECT"){aJ=aO(a);ad=null;}else{aJ=a;ad=h;}f.id=ac;if(typeof f.width==aq||(!/%$/.test(f.width)&&parseInt(f.width,10)<310)){f.width="310";}if(typeof f.height==aq||(!/%$/.test(f.height)&&parseInt(f.height,10)<137)){f.height="137";}aL.title=aL.title.slice(0,47)+" - Flash Player Installation";var b=ah.ie&&ah.win?"ActiveX":"PlugIn",c="MMredirectURL="+af.location.toString().replace(/&/g,"%26")+"&MMplayerType="+b+"&MMdoctitle="+aL.title;if(typeof d.flashvars!=aq){d.flashvars+="&"+c;}else{d.flashvars=c;}if(ah.ie&&ah.win&&a.readyState!=4){var g=ar("div");h+="SWFObjectNew";g.setAttribute("id",h);a.parentNode.insertBefore(g,a);a.style.display="none";(function(){if(a.readyState==4){a.parentNode.removeChild(a);}else{setTimeout(arguments.callee,10);}})();}aA(f,d,h);}}function aF(a){if(ah.ie&&ah.win&&a.readyState!=4){var b=ar("div");a.parentNode.insertBefore(b,a);b.parentNode.replaceChild(aO(a),b);a.style.display="none";(function(){if(a.readyState==4){a.parentNode.removeChild(a);}else{setTimeout(arguments.callee,10);}})();}else{a.parentNode.replaceChild(aO(a),a);}}function aO(b){var d=ar("div");if(ah.win&&ah.ie){d.innerHTML=b.innerHTML;}else{var e=b.getElementsByTagName(aD)[0];if(e){var a=e.childNodes;if(a){var f=a.length;for(var c=0;c<f;c++){if(!(a[c].nodeType==1&&a[c].nodeName=="PARAM")&&!(a[c].nodeType==8)){d.appendChild(a[c].cloneNode(true));}}}}}return d;}function aA(e,g,c){var d,a=aS(c);if(ah.wk&&ah.wk<312){return d;}if(a){if(typeof e.id==aq){e.id=c;}if(ah.ie&&ah.win){var f="";for(var i in e){if(e[i]!=Object.prototype[i]){if(i.toLowerCase()=="data"){g.movie=e[i];}else{if(i.toLowerCase()=="styleclass"){f+=' class="'+e[i]+'"';}else{if(i.toLowerCase()!="classid"){f+=" "+i+'="'+e[i]+'"';}}}}}var h="";for(var j in g){if(g[j]!=Object.prototype[j]){h+='<param name="'+j+'" value="'+g[j]+'" />';}}a.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+f+">"+h+"</object>";ag[ag.length]=e.id;d=aS(e.id);}else{var b=ar(aD);b.setAttribute("type",aE);for(var k in e){if(e[k]!=Object.prototype[k]){if(k.toLowerCase()=="styleclass"){b.setAttribute("class",e[k]);}else{if(k.toLowerCase()!="classid"){b.setAttribute(k,e[k]);}}}}for(var l in g){if(g[l]!=Object.prototype[l]&&l.toLowerCase()!="movie"){aQ(b,l,g[l]);}}a.parentNode.replaceChild(b,a);d=b;}}return d;}function aQ(b,d,c){var a=ar("param");a.setAttribute("name",d);a.setAttribute("value",c);b.appendChild(a);}function aw(a){var b=aS(a);if(b&&b.nodeName=="OBJECT"){if(ah.ie&&ah.win){b.style.display="none";(function(){if(b.readyState==4){aT(a);}else{setTimeout(arguments.callee,10);}})();}else{b.parentNode.removeChild(b);}}}function aT(a){var b=aS(a);if(b){for(var c in b){if(typeof b[c]=="function"){b[c]=null;}}b.parentNode.removeChild(b);}}function aS(a){var c=null;try{c=aL.getElementById(a);}catch(b){}return c;}function ar(a){return aL.createElement(a);}function aM(a,c,b){a.attachEvent(c,b);al[al.length]=[a,c,b];}function ao(a){var b=ah.pv,c=a.split(".");c[0]=parseInt(c[0],10);c[1]=parseInt(c[1],10)||0;c[2]=parseInt(c[2],10)||0;return(b[0]>c[0]||(b[0]==c[0]&&b[1]>c[1])||(b[0]==c[0]&&b[1]==c[1]&&b[2]>=c[2]))?true:false;}function az(b,f,a,c){if(ah.ie&&ah.mac){return;}var e=aL.getElementsByTagName("head")[0];if(!e){return;}var g=(a&&typeof a=="string")?a:"screen";if(c){aH=null;an=null;}if(!aH||an!=g){var d=ar("style");d.setAttribute("type","text/css");d.setAttribute("media",g);aH=e.appendChild(d);if(ah.ie&&ah.win&&typeof aL.styleSheets!=aq&&aL.styleSheets.length>0){aH=aL.styleSheets[aL.styleSheets.length-1];}an=g;}if(ah.ie&&ah.win){if(aH&&typeof aH.addRule==aD){aH.addRule(b,f);}}else{if(aH&&typeof aL.createTextNode!=aq){aH.appendChild(aL.createTextNode(b+" {"+f+"}"));}}}function ay(a,c){if(!aI){return;}var b=c?"visible":"hidden";if(ak&&aS(a)){aS(a).style.visibility=b;}else{az("#"+a,"visibility:"+b);}}function ai(b){var a=/[\\\"<>\.;]/;var c=a.exec(b)!=null;return c&&typeof encodeURIComponent!=aq?encodeURIComponent(b):b;}var aR=function(){if(ah.ie&&ah.win){window.attachEvent("onunload",function(){var a=al.length;for(var b=0;b<a;b++){al[b][0].detachEvent(al[b][1],al[b][2]);}var d=ag.length;for(var c=0;c<d;c++){aw(ag[c]);}for(var e in ah){ah[e]=null;}ah=null;for(var f in swfobject){swfobject[f]=null;}swfobject=null;});}}();return{registerObject:function(a,e,c,b){if(ah.w3&&a&&e){var d={};d.id=a;d.swfVersion=e;d.expressInstall=c;d.callbackFn=b;aG[aG.length]=d;ay(a,false);}else{if(b){b({success:false,id:a});}}},getObjectById:function(a){if(ah.w3){return av(a);}},embedSWF:function(k,e,h,f,c,a,b,i,g,j){var d={success:false,id:e};if(ah.w3&&!(ah.wk&&ah.wk<312)&&k&&e&&h&&f&&c){ay(e,false);aj(function(){h+="";f+="";var q={};if(g&&typeof g===aD){for(var o in g){q[o]=g[o];}}q.data=k;q.width=h;q.height=f;var n={};if(i&&typeof i===aD){for(var p in i){n[p]=i[p];}}if(b&&typeof b===aD){for(var l in b){if(typeof n.flashvars!=aq){n.flashvars+="&"+l+"="+b[l];}else{n.flashvars=l+"="+b[l];}}}if(ao(c)){var m=aA(q,n,e);if(q.id==e){ay(e,true);}d.success=true;d.ref=m;}else{if(a&&au()){q.data=a;ae(q,n,e,j);return;}else{ay(e,true);}}if(j){j(d);}});}else{if(j){j(d);}}},switchOffAutoHideShow:function(){aI=false;},ua:ah,getFlashPlayerVersion:function(){return{major:ah.pv[0],minor:ah.pv[1],release:ah.pv[2]};},hasFlashPlayerVersion:ao,createSWF:function(a,b,c){if(ah.w3){return aA(a,b,c);}else{return undefined;}},showExpressInstall:function(b,a,d,c){if(ah.w3&&au()){ae(b,a,d,c);}},removeSWF:function(a){if(ah.w3){aw(a);}},createCSS:function(b,a,c,d){if(ah.w3){az(b,a,c,d);}},addDomLoadEvent:aj,addLoadEvent:aC,getQueryParamValue:function(b){var a=aL.location.search||aL.location.hash;if(a){if(/\?/.test(a)){a=a.split("?")[1];}if(b==null){return ai(a);}var c=a.split("&");for(var d=0;d<c.length;d++){if(c[d].substring(0,c[d].indexOf("="))==b){return ai(c[d].substring((c[d].indexOf("=")+1)));}}}return"";},expressInstallCallback:function(){if(aU){var a=aS(ac);if(a&&aJ){a.parentNode.replaceChild(aJ,a);if(ad){ay(ad,true);if(ah.ie&&ah.win){aJ.style.display="block";}}if(ap){ap(at);}}aU=false;}}};}();var SWFUpload;if(SWFUpload==undefined){SWFUpload=function(b){this.initSWFUpload(b);};}SWFUpload.prototype.initSWFUpload=function(c){try{this.customSettings={};this.settings=c;this.eventQueue=[];this.movieName="SWFUpload_"+SWFUpload.movieCount++;this.movieElement=null;SWFUpload.instances[this.movieName]=this;this.initSettings();this.loadFlash();this.displayDebugInfo();}catch(d){delete SWFUpload.instances[this.movieName];throw d;}};SWFUpload.instances={};SWFUpload.movieCount=0;SWFUpload.version="2.2.0 2009-03-25";SWFUpload.QUEUE_ERROR={QUEUE_LIMIT_EXCEEDED:-100,FILE_EXCEEDS_SIZE_LIMIT:-110,ZERO_BYTE_FILE:-120,INVALID_FILETYPE:-130};SWFUpload.UPLOAD_ERROR={HTTP_ERROR:-200,MISSING_UPLOAD_URL:-210,IO_ERROR:-220,SECURITY_ERROR:-230,UPLOAD_LIMIT_EXCEEDED:-240,UPLOAD_FAILED:-250,SPECIFIED_FILE_ID_NOT_FOUND:-260,FILE_VALIDATION_FAILED:-270,FILE_CANCELLED:-280,UPLOAD_STOPPED:-290};SWFUpload.FILE_STATUS={QUEUED:-1,IN_PROGRESS:-2,ERROR:-3,COMPLETE:-4,CANCELLED:-5};SWFUpload.BUTTON_ACTION={SELECT_FILE:-100,SELECT_FILES:-110,START_UPLOAD:-120};SWFUpload.CURSOR={ARROW:-1,HAND:-2};SWFUpload.WINDOW_MODE={WINDOW:"window",TRANSPARENT:"transparent",OPAQUE:"opaque"};SWFUpload.completeURL=function(e){if(typeof(e)!=="string"||e.match(/^https?:\/\//i)||e.match(/^\//)){return e;}var f=window.location.protocol+"//"+window.location.hostname+(window.location.port?":"+window.location.port:"");var d=window.location.pathname.lastIndexOf("/");if(d<=0){path="/";}else{path=window.location.pathname.substr(0,d)+"/";}return path+e;};SWFUpload.prototype.initSettings=function(){this.ensureDefault=function(c,d){this.settings[c]=(this.settings[c]==undefined)?d:this.settings[c];};this.ensureDefault("upload_url","");this.ensureDefault("preserve_relative_urls",false);this.ensureDefault("file_post_name","Filedata");this.ensureDefault("post_params",{});this.ensureDefault("use_query_string",false);this.ensureDefault("requeue_on_error",false);this.ensureDefault("http_success",[]);this.ensureDefault("assume_success_timeout",0);this.ensureDefault("file_types","*.*");this.ensureDefault("file_types_description","All Files");this.ensureDefault("file_size_limit",0);this.ensureDefault("file_upload_limit",0);this.ensureDefault("file_queue_limit",0);this.ensureDefault("flash_url","swfupload.swf");this.ensureDefault("prevent_swf_caching",true);this.ensureDefault("button_image_url","");this.ensureDefault("button_width",1);this.ensureDefault("button_height",1);this.ensureDefault("button_text","");this.ensureDefault("button_text_style","color: #000000; font-size: 16pt;");this.ensureDefault("button_text_top_padding",0);this.ensureDefault("button_text_left_padding",0);this.ensureDefault("button_action",SWFUpload.BUTTON_ACTION.SELECT_FILES);this.ensureDefault("button_disabled",false);this.ensureDefault("button_placeholder_id","");this.ensureDefault("button_placeholder",null);this.ensureDefault("button_cursor",SWFUpload.CURSOR.ARROW);this.ensureDefault("button_window_mode",SWFUpload.WINDOW_MODE.WINDOW);this.ensureDefault("debug",false);this.settings.debug_enabled=this.settings.debug;this.settings.return_upload_start_handler=this.returnUploadStart;this.ensureDefault("swfupload_loaded_handler",null);this.ensureDefault("file_dialog_start_handler",null);this.ensureDefault("file_queued_handler",null);this.ensureDefault("file_queue_error_handler",null);this.ensureDefault("file_dialog_complete_handler",null);this.ensureDefault("upload_start_handler",null);this.ensureDefault("upload_progress_handler",null);this.ensureDefault("upload_error_handler",null);this.ensureDefault("upload_success_handler",null);this.ensureDefault("upload_complete_handler",null);this.ensureDefault("debug_handler",this.debugMessage);this.ensureDefault("custom_settings",{});this.customSettings=this.settings.custom_settings;if(!!this.settings.prevent_swf_caching){this.settings.flash_url=this.settings.flash_url+(this.settings.flash_url.indexOf("?")<0?"?":"&")+"preventswfcaching="+new Date().getTime();}if(!this.settings.preserve_relative_urls){this.settings.upload_url=SWFUpload.completeURL(this.settings.upload_url);this.settings.button_image_url=SWFUpload.completeURL(this.settings.button_image_url);}delete this.ensureDefault;};SWFUpload.prototype.loadFlash=function(){var d,c;if(document.getElementById(this.movieName)!==null){throw"ID "+this.movieName+" is already in use. The Flash Object could not be added";}d=document.getElementById(this.settings.button_placeholder_id)||this.settings.button_placeholder;if(d==undefined){throw"Could not find the placeholder element: "+this.settings.button_placeholder_id;}c=document.createElement("div");c.innerHTML=this.getFlashHTML();d.parentNode.replaceChild(c.firstChild,d);if(window[this.movieName]==undefined){window[this.movieName]=this.getMovieElement();}};SWFUpload.prototype.getFlashHTML=function(){return['<object id="',this.movieName,'" type="application/x-shockwave-flash" data="',this.settings.flash_url,'" width="',this.settings.button_width,'" height="',this.settings.button_height,'" class="swfupload">','<param name="wmode" value="',this.settings.button_window_mode,'" />','<param name="movie" value="',this.settings.flash_url,'" />','<param name="quality" value="high" />','<param name="menu" value="false" />','<param name="allowScriptAccess" value="always" />','<param name="flashvars" value="'+this.getFlashVars()+'" />',"</object>"].join("");};SWFUpload.prototype.getFlashVars=function(){var c=this.buildParamString();var d=this.settings.http_success.join(",");return["movieName=",encodeURIComponent(this.movieName),"&amp;uploadURL=",encodeURIComponent(this.settings.upload_url),"&amp;useQueryString=",encodeURIComponent(this.settings.use_query_string),"&amp;requeueOnError=",encodeURIComponent(this.settings.requeue_on_error),"&amp;httpSuccess=",encodeURIComponent(d),"&amp;assumeSuccessTimeout=",encodeURIComponent(this.settings.assume_success_timeout),"&amp;params=",encodeURIComponent(c),"&amp;filePostName=",encodeURIComponent(this.settings.file_post_name),"&amp;fileTypes=",encodeURIComponent(this.settings.file_types),"&amp;fileTypesDescription=",encodeURIComponent(this.settings.file_types_description),"&amp;fileSizeLimit=",encodeURIComponent(this.settings.file_size_limit),"&amp;fileUploadLimit=",encodeURIComponent(this.settings.file_upload_limit),"&amp;fileQueueLimit=",encodeURIComponent(this.settings.file_queue_limit),"&amp;debugEnabled=",encodeURIComponent(this.settings.debug_enabled),"&amp;buttonImageURL=",encodeURIComponent(this.settings.button_image_url),"&amp;buttonWidth=",encodeURIComponent(this.settings.button_width),"&amp;buttonHeight=",encodeURIComponent(this.settings.button_height),"&amp;buttonText=",encodeURIComponent(this.settings.button_text),"&amp;buttonTextTopPadding=",encodeURIComponent(this.settings.button_text_top_padding),"&amp;buttonTextLeftPadding=",encodeURIComponent(this.settings.button_text_left_padding),"&amp;buttonTextStyle=",encodeURIComponent(this.settings.button_text_style),"&amp;buttonAction=",encodeURIComponent(this.settings.button_action),"&amp;buttonDisabled=",encodeURIComponent(this.settings.button_disabled),"&amp;buttonCursor=",encodeURIComponent(this.settings.button_cursor)].join("");};SWFUpload.prototype.getMovieElement=function(){if(this.movieElement==undefined){this.movieElement=document.getElementById(this.movieName);}if(this.movieElement===null){throw"Could not find Flash element";}return this.movieElement;};SWFUpload.prototype.buildParamString=function(){var f=this.settings.post_params;var d=[];if(typeof(f)==="object"){for(var e in f){if(f.hasOwnProperty(e)){d.push(encodeURIComponent(e.toString())+"="+encodeURIComponent(f[e].toString()));}}}return d.join("&amp;");};SWFUpload.prototype.destroy=function(){try{this.cancelUpload(null,false);var g=null;g=this.getMovieElement();if(g&&typeof(g.CallFunction)==="unknown"){for(var j in g){try{if(typeof(g[j])==="function"){g[j]=null;}}catch(h){}}try{g.parentNode.removeChild(g);}catch(f){}}window[this.movieName]=null;SWFUpload.instances[this.movieName]=null;delete SWFUpload.instances[this.movieName];this.movieElement=null;this.settings=null;this.customSettings=null;this.eventQueue=null;this.movieName=null;return true;}catch(i){return false;}};SWFUpload.prototype.displayDebugInfo=function(){this.debug(["---SWFUpload Instance Info---\n","Version: ",SWFUpload.version,"\n","Movie Name: ",this.movieName,"\n","Settings:\n","\t","upload_url:               ",this.settings.upload_url,"\n","\t","flash_url:                ",this.settings.flash_url,"\n","\t","use_query_string:         ",this.settings.use_query_string.toString(),"\n","\t","requeue_on_error:         ",this.settings.requeue_on_error.toString(),"\n","\t","http_success:             ",this.settings.http_success.join(", "),"\n","\t","assume_success_timeout:   ",this.settings.assume_success_timeout,"\n","\t","file_post_name:           ",this.settings.file_post_name,"\n","\t","post_params:              ",this.settings.post_params.toString(),"\n","\t","file_types:               ",this.settings.file_types,"\n","\t","file_types_description:   ",this.settings.file_types_description,"\n","\t","file_size_limit:          ",this.settings.file_size_limit,"\n","\t","file_upload_limit:        ",this.settings.file_upload_limit,"\n","\t","file_queue_limit:         ",this.settings.file_queue_limit,"\n","\t","debug:                    ",this.settings.debug.toString(),"\n","\t","prevent_swf_caching:      ",this.settings.prevent_swf_caching.toString(),"\n","\t","button_placeholder_id:    ",this.settings.button_placeholder_id.toString(),"\n","\t","button_placeholder:       ",(this.settings.button_placeholder?"Set":"Not Set"),"\n","\t","button_image_url:         ",this.settings.button_image_url.toString(),"\n","\t","button_width:             ",this.settings.button_width.toString(),"\n","\t","button_height:            ",this.settings.button_height.toString(),"\n","\t","button_text:              ",this.settings.button_text.toString(),"\n","\t","button_text_style:        ",this.settings.button_text_style.toString(),"\n","\t","button_text_top_padding:  ",this.settings.button_text_top_padding.toString(),"\n","\t","button_text_left_padding: ",this.settings.button_text_left_padding.toString(),"\n","\t","button_action:            ",this.settings.button_action.toString(),"\n","\t","button_disabled:          ",this.settings.button_disabled.toString(),"\n","\t","custom_settings:          ",this.settings.custom_settings.toString(),"\n","Event Handlers:\n","\t","swfupload_loaded_handler assigned:  ",(typeof this.settings.swfupload_loaded_handler==="function").toString(),"\n","\t","file_dialog_start_handler assigned: ",(typeof this.settings.file_dialog_start_handler==="function").toString(),"\n","\t","file_queued_handler assigned:       ",(typeof this.settings.file_queued_handler==="function").toString(),"\n","\t","file_queue_error_handler assigned:  ",(typeof this.settings.file_queue_error_handler==="function").toString(),"\n","\t","upload_start_handler assigned:      ",(typeof this.settings.upload_start_handler==="function").toString(),"\n","\t","upload_progress_handler assigned:   ",(typeof this.settings.upload_progress_handler==="function").toString(),"\n","\t","upload_error_handler assigned:      ",(typeof this.settings.upload_error_handler==="function").toString(),"\n","\t","upload_success_handler assigned:    ",(typeof this.settings.upload_success_handler==="function").toString(),"\n","\t","upload_complete_handler assigned:   ",(typeof this.settings.upload_complete_handler==="function").toString(),"\n","\t","debug_handler assigned:             ",(typeof this.settings.debug_handler==="function").toString(),"\n"].join(""));};SWFUpload.prototype.addSetting=function(d,f,e){if(f==undefined){return(this.settings[d]=e);}else{return(this.settings[d]=f);}};SWFUpload.prototype.getSetting=function(b){if(this.settings[b]!=undefined){return this.settings[b];}return"";};SWFUpload.prototype.callFlash=function(functionName,argumentArray){argumentArray=argumentArray||[];var movieElement=this.getMovieElement();var returnValue,returnString;try{returnString=movieElement.CallFunction('<invoke name="'+functionName+'" returntype="javascript">'+__flash__argumentsToXML(argumentArray,0)+"</invoke>");returnValue=eval(returnString);}catch(ex){throw"Call to "+functionName+" failed";}if(returnValue!=undefined&&typeof returnValue.post==="object"){returnValue=this.unescapeFilePostParams(returnValue);}return returnValue;};SWFUpload.prototype.selectFile=function(){this.callFlash("SelectFile");};SWFUpload.prototype.selectFiles=function(){this.callFlash("SelectFiles");};SWFUpload.prototype.startUpload=function(b){this.callFlash("StartUpload",[b]);};SWFUpload.prototype.cancelUpload=function(d,c){if(c!==false){c=true;}this.callFlash("CancelUpload",[d,c]);};SWFUpload.prototype.stopUpload=function(){this.callFlash("StopUpload");};SWFUpload.prototype.getStats=function(){return this.callFlash("GetStats");};SWFUpload.prototype.setStats=function(b){this.callFlash("SetStats",[b]);};SWFUpload.prototype.getFile=function(b){if(typeof(b)==="number"){return this.callFlash("GetFileByIndex",[b]);}else{return this.callFlash("GetFile",[b]);}};SWFUpload.prototype.addFileParam=function(e,d,f){return this.callFlash("AddFileParam",[e,d,f]);};SWFUpload.prototype.removeFileParam=function(d,c){this.callFlash("RemoveFileParam",[d,c]);};SWFUpload.prototype.setUploadURL=function(b){this.settings.upload_url=b.toString();this.callFlash("SetUploadURL",[b]);};SWFUpload.prototype.setPostParams=function(b){this.settings.post_params=b;this.callFlash("SetPostParams",[b]);};SWFUpload.prototype.addPostParam=function(d,c){this.settings.post_params[d]=c;this.callFlash("SetPostParams",[this.settings.post_params]);};SWFUpload.prototype.removePostParam=function(b){delete this.settings.post_params[b];this.callFlash("SetPostParams",[this.settings.post_params]);};SWFUpload.prototype.setFileTypes=function(d,c){this.settings.file_types=d;this.settings.file_types_description=c;this.callFlash("SetFileTypes",[d,c]);};SWFUpload.prototype.setFileSizeLimit=function(b){this.settings.file_size_limit=b;this.callFlash("SetFileSizeLimit",[b]);};SWFUpload.prototype.setFileUploadLimit=function(b){this.settings.file_upload_limit=b;this.callFlash("SetFileUploadLimit",[b]);};SWFUpload.prototype.setFileQueueLimit=function(b){this.settings.file_queue_limit=b;this.callFlash("SetFileQueueLimit",[b]);};SWFUpload.prototype.setFilePostName=function(b){this.settings.file_post_name=b;this.callFlash("SetFilePostName",[b]);};SWFUpload.prototype.setUseQueryString=function(b){this.settings.use_query_string=b;this.callFlash("SetUseQueryString",[b]);};SWFUpload.prototype.setRequeueOnError=function(b){this.settings.requeue_on_error=b;this.callFlash("SetRequeueOnError",[b]);};SWFUpload.prototype.setHTTPSuccess=function(b){if(typeof b==="string"){b=b.replace(" ","").split(",");}this.settings.http_success=b;this.callFlash("SetHTTPSuccess",[b]);};SWFUpload.prototype.setAssumeSuccessTimeout=function(b){this.settings.assume_success_timeout=b;this.callFlash("SetAssumeSuccessTimeout",[b]);};SWFUpload.prototype.setDebugEnabled=function(b){this.settings.debug_enabled=b;this.callFlash("SetDebugEnabled",[b]);};SWFUpload.prototype.setButtonImageURL=function(b){if(b==undefined){b="";}this.settings.button_image_url=b;this.callFlash("SetButtonImageURL",[b]);};SWFUpload.prototype.setButtonDimensions=function(f,e){this.settings.button_width=f;this.settings.button_height=e;var d=this.getMovieElement();if(d!=undefined){d.style.width=f+"px";d.style.height=e+"px";}this.callFlash("SetButtonDimensions",[f,e]);};SWFUpload.prototype.setButtonText=function(b){this.settings.button_text=b;this.callFlash("SetButtonText",[b]);};SWFUpload.prototype.setButtonTextPadding=function(c,d){this.settings.button_text_top_padding=d;this.settings.button_text_left_padding=c;this.callFlash("SetButtonTextPadding",[c,d]);};SWFUpload.prototype.setButtonTextStyle=function(b){this.settings.button_text_style=b;this.callFlash("SetButtonTextStyle",[b]);};SWFUpload.prototype.setButtonDisabled=function(b){this.settings.button_disabled=b;this.callFlash("SetButtonDisabled",[b]);};SWFUpload.prototype.setButtonAction=function(b){this.settings.button_action=b;this.callFlash("SetButtonAction",[b]);};SWFUpload.prototype.setButtonCursor=function(b){this.settings.button_cursor=b;this.callFlash("SetButtonCursor",[b]);};SWFUpload.prototype.queueEvent=function(d,f){if(f==undefined){f=[];}else{if(!(f instanceof Array)){f=[f];}}var e=this;if(typeof this.settings[d]==="function"){this.eventQueue.push(function(){this.settings[d].apply(this,f);});setTimeout(function(){e.executeNextEvent();},0);}else{if(this.settings[d]!==null){throw"Event handler "+d+" is unknown or is not a function";}}};SWFUpload.prototype.executeNextEvent=function(){var b=this.eventQueue?this.eventQueue.shift():null;if(typeof(b)==="function"){b.apply(this);}};SWFUpload.prototype.unescapeFilePostParams=function(l){var j=/[$]([0-9a-f]{4})/i;var i={};var k;if(l!=undefined){for(var h in l.post){if(l.post.hasOwnProperty(h)){k=h;var g;while((g=j.exec(k))!==null){k=k.replace(g[0],String.fromCharCode(parseInt("0x"+g[1],16)));}i[k]=l.post[h];}}l.post=i;}return l;};SWFUpload.prototype.testExternalInterface=function(){try{return this.callFlash("TestExternalInterface");}catch(b){return false;}};SWFUpload.prototype.flashReady=function(){var b=this.getMovieElement();if(!b){this.debug("Flash called back ready but the flash movie can't be found.");return;}this.cleanUp(b);this.queueEvent("swfupload_loaded_handler");};SWFUpload.prototype.cleanUp=function(f){try{if(this.movieElement&&typeof(f.CallFunction)==="unknown"){this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");for(var h in f){try{if(typeof(f[h])==="function"){f[h]=null;}}catch(e){}}}}catch(g){}window.__flash__removeCallback=function(c,b){try{if(c){c[b]=null;}}catch(a){}};};SWFUpload.prototype.fileDialogStart=function(){this.queueEvent("file_dialog_start_handler");};SWFUpload.prototype.fileQueued=function(b){b=this.unescapeFilePostParams(b);this.queueEvent("file_queued_handler",b);};SWFUpload.prototype.fileQueueError=function(e,f,d){e=this.unescapeFilePostParams(e);this.queueEvent("file_queue_error_handler",[e,f,d]);};SWFUpload.prototype.fileDialogComplete=function(d,f,e){this.queueEvent("file_dialog_complete_handler",[d,f,e]);};SWFUpload.prototype.uploadStart=function(b){b=this.unescapeFilePostParams(b);this.queueEvent("return_upload_start_handler",b);};SWFUpload.prototype.returnUploadStart=function(d){var c;if(typeof this.settings.upload_start_handler==="function"){d=this.unescapeFilePostParams(d);c=this.settings.upload_start_handler.call(this,d);}else{if(this.settings.upload_start_handler!=undefined){throw"upload_start_handler must be a function";}}if(c===undefined){c=true;}c=!!c;this.callFlash("ReturnUploadStart",[c]);};SWFUpload.prototype.uploadProgress=function(e,f,d){e=this.unescapeFilePostParams(e);this.queueEvent("upload_progress_handler",[e,f,d]);};SWFUpload.prototype.uploadError=function(e,f,d){e=this.unescapeFilePostParams(e);this.queueEvent("upload_error_handler",[e,f,d]);};SWFUpload.prototype.uploadSuccess=function(d,e,f){d=this.unescapeFilePostParams(d);this.queueEvent("upload_success_handler",[d,e,f]);};SWFUpload.prototype.uploadComplete=function(b){b=this.unescapeFilePostParams(b);this.queueEvent("upload_complete_handler",b);};SWFUpload.prototype.debug=function(b){this.queueEvent("debug_handler",b);};SWFUpload.prototype.debugMessage=function(h){if(this.settings.debug){var f,g=[];if(typeof h==="object"&&typeof h.name==="string"&&typeof h.message==="string"){for(var e in h){if(h.hasOwnProperty(e)){g.push(e+": "+h[e]);}}f=g.join("\n")||"";g=f.split("\n");f="EXCEPTION: "+g.join("\nEXCEPTION: ");SWFUpload.Console.writeLine(f);}else{SWFUpload.Console.writeLine(h);}}};SWFUpload.Console={};SWFUpload.Console.writeLine=function(g){var e,f;try{e=document.getElementById("SWFUpload_Console");if(!e){f=document.createElement("form");document.getElementsByTagName("body")[0].appendChild(f);e=document.createElement("textarea");e.id="SWFUpload_Console";e.style.fontFamily="monospace";e.setAttribute("wrap","off");e.wrap="off";e.style.overflow="auto";e.style.width="700px";e.style.height="350px";e.style.margin="5px";f.appendChild(e);}e.value+=g+"\n";e.scrollTop=e.scrollHeight-e.clientHeight;}catch(h){alert("Exception: "+h.name+" Message: "+h.message);}};(function(c){var b={init:function(d,e){return this.each(function(){var n=c(this);var m=n.clone();var j=c.extend({id:n.attr("id"),swf:"uploadify.swf",uploader:"uploadify.php",auto:true,buttonClass:"",buttonCursor:"hand",buttonImage:null,buttonText:"SELECT FILES",checkExisting:false,debug:false,fileObjName:"Filedata",fileSizeLimit:0,fileTypeDesc:"All Files",fileTypeExts:"*.*",height:30,method:"post",multi:true,formData:{},preventCaching:true,progressData:"percentage",queueID:false,queueSizeLimit:999,removeCompleted:true,removeTimeout:3,requeueErrors:false,successTimeout:30,uploadLimit:0,width:120,overrideEvents:[]},d);var g={assume_success_timeout:j.successTimeout,button_placeholder_id:j.id,button_width:j.width,button_height:j.height,button_text:null,button_text_style:null,button_text_top_padding:0,button_text_left_padding:0,button_action:(j.multi?SWFUpload.BUTTON_ACTION.SELECT_FILES:SWFUpload.BUTTON_ACTION.SELECT_FILE),button_disabled:false,button_cursor:(j.buttonCursor=="arrow"?SWFUpload.CURSOR.ARROW:SWFUpload.CURSOR.HAND),button_window_mode:SWFUpload.WINDOW_MODE.TRANSPARENT,debug:j.debug,requeue_on_error:j.requeueErrors,file_post_name:j.fileObjName,file_size_limit:j.fileSizeLimit,file_types:j.fileTypeExts,file_types_description:j.fileTypeDesc,file_queue_limit:j.queueSizeLimit,file_upload_limit:j.uploadLimit,flash_url:j.swf,prevent_swf_caching:j.preventCaching,post_params:j.formData,upload_url:j.uploader,use_query_string:(j.method=="get"),file_dialog_complete_handler:a.onDialogClose,file_dialog_start_handler:a.onDialogOpen,file_queued_handler:a.onSelect,file_queue_error_handler:a.onSelectError,swfupload_loaded_handler:j.onSWFReady,upload_complete_handler:a.onUploadComplete,upload_error_handler:a.onUploadError,upload_progress_handler:a.onUploadProgress,upload_start_handler:a.onUploadStart,upload_success_handler:a.onUploadSuccess};if(e){g=c.extend(g,e);}g=c.extend(g,j);var o=swfobject.getFlashPlayerVersion();var h=(o.major>=9);if(h){window["uploadify_"+j.id]=new SWFUpload(g);var i=window["uploadify_"+j.id];n.data("uploadify",i);var l=c("<div />",{id:j.id,"class":"uploadify",css:{height:j.height+"px",width:j.width+"px"}});c("#"+i.movieName).wrap(l);l=c("#"+j.id);l.data("uploadify",i);var f=c("<div />",{id:j.id+"-button","class":"uploadify-button "+j.buttonClass});if(j.buttonImage){f.css({"background-image":"url('"+j.buttonImage+"')","text-indent":"-9999px"});}f.html('<span class="uploadify-button-text">'+j.buttonText+"</span>").css({height:j.height+"px","line-height":j.height+"px",width:j.width+"px"});l.append(f);c("#"+i.movieName).css({position:"absolute","z-index":1});if(!j.queueID){var k=c("<div />",{id:j.id+"-queue","class":"uploadify-queue"});l.after(k);i.settings.queueID=j.id+"-queue";i.settings.defaultQueue=true;}i.queueData={files:{},filesSelected:0,filesQueued:0,filesReplaced:0,filesCancelled:0,filesErrored:0,uploadsSuccessful:0,uploadsErrored:0,averageSpeed:0,queueLength:0,queueSize:0,uploadSize:0,queueBytesUploaded:0,uploadQueue:[],errorMsg:"Some files were not added to the queue:"};i.original=m;i.wrapper=l;i.button=f;i.queue=k;if(j.onInit){j.onInit.call(n,i);}}else{if(j.onFallback){j.onFallback.call(n);}}});},cancel:function(d,f){var e=arguments;this.each(function(){var l=c(this),i=l.data("uploadify"),j=i.settings,h=-1;if(e[0]){if(e[0]=="*"){var g=i.queueData.queueLength;c("#"+j.queueID).find(".uploadify-queue-item").each(function(){h++;if(e[1]===true){i.cancelUpload(c(this).attr("id"),false);}else{i.cancelUpload(c(this).attr("id"));}c(this).find(".data").removeClass("data").html(" - 宸插彇娑");c(this).find(".uploadify-progress-bar").remove();c(this).delay(1000+100*h).fadeOut(500,function(){c(this).remove();});});i.queueData.queueSize=0;i.queueData.queueLength=0;if(j.onClearQueue){j.onClearQueue.call(l,g);}}else{for(var m=0;m<e.length;m++){i.cancelUpload(e[m]);c("#"+e[m]).find(".data").removeClass("data").html(" - 宸插彇娑");c("#"+e[m]).find(".uploadify-progress-bar").remove();c("#"+e[m]).delay(1000+100*m).fadeOut(500,function(){c(this).remove();});}}}else{var k=c("#"+j.queueID).find(".uploadify-queue-item").get(0);$item=c(k);i.cancelUpload($item.attr("id"));$item.find(".data").removeClass("data").html(" - 宸插彇娑");$item.find(".uploadify-progress-bar").remove();$item.delay(1000).fadeOut(500,function(){c(this).remove();});}});},destroy:function(){this.each(function(){var f=c(this),d=f.data("uploadify"),e=d.settings;d.destroy();if(e.defaultQueue){c("#"+e.queueID).remove();}c("#"+e.id).replaceWith(d.original);if(e.onDestroy){e.onDestroy.call(this);}delete d;});},disable:function(d){this.each(function(){var g=c(this),e=g.data("uploadify"),f=e.settings;if(d){e.button.addClass("disabled");if(f.onDisable){f.onDisable.call(this);}}else{e.button.removeClass("disabled");if(f.onEnable){f.onEnable.call(this);}}e.setButtonDisabled(d);});},settings:function(e,g,h){var d=arguments;var f=g;this.each(function(){var k=c(this),i=k.data("uploadify"),j=i.settings;if(typeof(d[0])=="object"){for(var l in g){setData(l,g[l]);}}if(d.length===1){f=j[e];}else{switch(e){case"uploader":i.setUploadURL(g);break;case"formData":if(!h){g=c.extend(j.formData,g);}i.setPostParams(j.formData);break;case"method":if(g=="get"){i.setUseQueryString(true);}else{i.setUseQueryString(false);}break;case"fileObjName":i.setFilePostName(g);break;case"fileTypeExts":i.setFileTypes(g,j.fileTypeDesc);break;case"fileTypeDesc":i.setFileTypes(j.fileTypeExts,g);break;case"fileSizeLimit":i.setFileSizeLimit(g);break;case"uploadLimit":i.setFileUploadLimit(g);break;case"queueSizeLimit":i.setFileQueueLimit(g);break;case"buttonImage":i.button.css("background-image",settingValue);break;case"buttonCursor":if(g=="arrow"){i.setButtonCursor(SWFUpload.CURSOR.ARROW);}else{i.setButtonCursor(SWFUpload.CURSOR.HAND);}break;case"buttonText":c("#"+j.id+"-button").find(".uploadify-button-text").html(g);break;case"width":i.setButtonDimensions(g,j.height);break;case"height":i.setButtonDimensions(j.width,g);break;case"multi":if(g){i.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILES);}else{i.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILE);}break;}j[e]=g;}});if(d.length===1){return f;}},stop:function(){this.each(function(){var e=c(this),d=e.data("uploadify");d.queueData.averageSpeed=0;d.queueData.uploadSize=0;d.queueData.bytesUploaded=0;d.queueData.uploadQueue=[];d.stopUpload();});},upload:function(){var d=arguments;this.each(function(){var f=c(this),e=f.data("uploadify");e.queueData.averageSpeed=0;e.queueData.uploadSize=0;e.queueData.bytesUploaded=0;e.queueData.uploadQueue=[];if(d[0]){if(d[0]=="*"){e.queueData.uploadSize=e.queueData.queueSize;e.queueData.uploadQueue.push("*");e.startUpload();}else{for(var g=0;g<d.length;g++){e.queueData.uploadSize+=e.queueData.files[d[g]].size;e.queueData.uploadQueue.push(d[g]);}e.startUpload(e.queueData.uploadQueue.shift());}}else{e.startUpload();}});}};var a={onDialogOpen:function(){var d=this.settings;this.queueData.errorMsg="Some files were not added to the queue:";this.queueData.filesReplaced=0;this.queueData.filesCancelled=0;if(d.onDialogOpen){d.onDialogOpen.call(this);}},onDialogClose:function(d,f,g){var e=this.settings;this.queueData.filesErrored=d-f;this.queueData.filesSelected=d;this.queueData.filesQueued=f-this.queueData.filesCancelled;this.queueData.queueLength=g;if(c.inArray("onDialogClose",e.overrideEvents)<0){if(this.queueData.filesErrored>0){alert(this.queueData.errorMsg);}}if(e.onDialogClose){e.onDialogClose.call(this,this.queueData);}if(e.auto){c("#"+e.id).uploadify("upload","*");}},onSelect:function(g){var h=this.settings;var e={};for(var f in this.queueData.files){e=this.queueData.files[f];if(e.uploaded!=true&&e.name==g.name){var d=confirm('The file named "'+g.name+'" is already in the queue.\nDo you want to replace the existing item in the queue?');if(!d){this.cancelUpload(g.id);this.queueData.filesCancelled++;return false;}else{c("#"+e.id).remove();this.cancelUpload(e.id);this.queueData.filesReplaced++;}}}var i=Math.round(g.size/1024);var l="KB";if(i>1000){i=Math.round(i/1000);l="MB";}var k=i.toString().split(".");i=k[0];if(k.length>1){i+="."+k[1].substr(0,2);}i+=l;var j=g.name;if(j.length>25){j=j.substr(0,25)+"...";}if(c.inArray("onSelect",h.overrideEvents)<0){c("#"+h.queueID).append('<div id="'+g.id+'" class="uploadify-queue-item">					<div class="cancel">						<a href="javascript:$(\'#'+h.id+"').uploadify('cancel', '"+g.id+'\')">X</a>					</div>					<span class="fileName">'+j+" ("+i+')</span><span class="data"></span>					<div class="uploadify-progress">						<div class="uploadify-progress-bar"><!--Progress Bar--></div>					</div>				</div>');}this.queueData.queueSize+=g.size;this.queueData.files[g.id]=g;if(h.onSelect){h.onSelect.apply(this,arguments);}},onSelectError:function(d,g,f){var e=this.settings;if(c.inArray("onSelectError",e.overrideEvents)<0){switch(g){case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:if(e.queueSizeLimit>f){this.queueData.errorMsg+="\nThe number of files selected exceeds the remaining upload limit ("+f+").";}else{this.queueData.errorMsg+="\nThe number of files selected exceeds the queue size limit ("+e.queueSizeLimit+").";}break;case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:this.queueData.errorMsg+='\nThe file "'+d.name+'" exceeds the size limit ('+e.fileSizeLimit+").";break;case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:this.queueData.errorMsg+='\nThe file "'+d.name+'" is empty.';break;case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:this.queueData.errorMsg+='\nThe file "'+d.name+'" is not an accepted file type ('+e.fileTypeDesc+").";break;}}if(g!=SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED){delete this.queueData.files[d.id];}if(e.onSelectError){e.onSelectError.apply(this,arguments);}},onQueueComplete:function(){if(this.settings.onQueueComplete){this.settings.onQueueComplete.call(this,this.settings.queueData);}},onUploadComplete:function(f){var g=this.settings,d=this;var e=this.getStats();this.queueData.queueLength=e.files_queued;if(this.queueData.uploadQueue[0]=="*"){if(this.queueData.queueLength>0){this.startUpload();}else{this.queueData.uploadQueue=[];if(g.onQueueComplete){g.onQueueComplete.call(this,this.queueData);}}}else{if(this.queueData.uploadQueue.length>0){this.startUpload(this.queueData.uploadQueue.shift());}else{this.queueData.uploadQueue=[];if(g.onQueueComplete){g.onQueueComplete.call(this,this.queueData);}}}if(c.inArray("onUploadComplete",g.overrideEvents)<0){if(g.removeCompleted){switch(f.filestatus){case SWFUpload.FILE_STATUS.COMPLETE:setTimeout(function(){if(c("#"+f.id)){d.queueData.queueSize-=f.size;d.queueData.queueLength-=1;delete d.queueData.files[f.id];c("#"+f.id).fadeOut(500,function(){c(this).remove();});}},g.removeTimeout*1000);break;case SWFUpload.FILE_STATUS.ERROR:if(!g.requeueErrors){setTimeout(function(){if(c("#"+f.id)){d.queueData.queueSize-=f.size;d.queueData.queueLength-=1;delete d.queueData.files[f.id];c("#"+f.id).fadeOut(500,function(){c(this).remove();});}},g.removeTimeout*1000);}break;}}else{f.uploaded=true;}}if(g.onUploadComplete){g.onUploadComplete.call(this,f);}},onUploadError:function(e,i,h){var f=this.settings;var g="Error";switch(i){case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:g="HTTP Error ("+h+")";break;case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:g="Missing Upload URL";break;case SWFUpload.UPLOAD_ERROR.IO_ERROR:g="IO Error";break;case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:g="Security Error";break;case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:alert("The upload limit has been reached ("+h+").");g="Exceeds Upload Limit";break;case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:g="Failed";break;case SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND:break;case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:g="Validation Error";break;case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:g="宸插彇娑";this.queueData.queueSize-=e.size;this.queueData.queueLength-=1;if(e.status==SWFUpload.FILE_STATUS.IN_PROGRESS||c.inArray(e.id,this.queueData.uploadQueue)>=0){this.queueData.uploadSize-=e.size;}if(f.onCancel){f.onCancel.call(this,e);}delete this.queueData.files[e.id];break;case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:g="Stopped";break;}if(c.inArray("onUploadError",f.overrideEvents)<0){if(i!=SWFUpload.UPLOAD_ERROR.FILE_CANCELLED&&i!=SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED){c("#"+e.id).addClass("uploadify-error");}c("#"+e.id).find(".uploadify-progress-bar").css("width","1px");if(i!=SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND&&e.status!=SWFUpload.FILE_STATUS.COMPLETE){c("#"+e.id).find(".data").html(" - "+g);}}var d=this.getStats();this.queueData.uploadsErrored=d.upload_errors;if(f.onUploadError){f.onUploadError.call(this,e,i,h,g);}},onUploadProgress:function(g,m,j){var h=this.settings;var e=new Date();var n=e.getTime();var k=n-this.timer;if(k>500){this.timer=n;}var i=m-this.bytesLoaded;this.bytesLoaded=m;var d=this.queueData.queueBytesUploaded+m;var p=Math.round(m/j*100);var o="KB/s";var l=0;var f=(i/1024)/(k/1000);f=Math.floor(f*10)/10;if(this.queueData.averageSpeed>0){this.queueData.averageSpeed=Math.floor((this.queueData.averageSpeed+f)/2);}else{this.queueData.averageSpeed=Math.floor(f);}if(f>1000){l=(f*0.001);this.queueData.averageSpeed=Math.floor(l);o="MB/s";}if(c.inArray("onUploadProgress",h.overrideEvents)<0){if(h.progressData=="percentage"){c("#"+g.id).find(".data").html(" - "+p+"%");}else{if(h.progressData=="speed"&&k>500){c("#"+g.id).find(".data").html(" - "+this.queueData.averageSpeed+o);}}c("#"+g.id).find(".uploadify-progress-bar").css("width",p+"%");}if(h.onUploadProgress){h.onUploadProgress.call(this,g,m,j,d,this.queueData.uploadSize);}},onUploadStart:function(d){var e=this.settings;var f=new Date();this.timer=f.getTime();this.bytesLoaded=0;if(this.queueData.uploadQueue.length==0){this.queueData.uploadSize=d.size;}if(e.checkExisting){c.ajax({type:"POST",async:false,url:e.checkExisting,data:{filename:d.name},success:function(h){if(h==1){var g=confirm('A file with the name "'+d.name+'" already exists on the server.\nWould you like to replace the existing file?');if(!g){this.cancelUpload(d.id);c("#"+d.id).remove();if(this.queueData.uploadQueue.length>0&&this.queueData.queueLength>0){if(this.queueData.uploadQueue[0]=="*"){this.startUpload();}else{this.startUpload(this.queueData.uploadQueue.shift());}}}}}});}if(e.onUploadStart){e.onUploadStart.call(this,d);}},onUploadSuccess:function(f,h,d){var g=this.settings;var e=this.getStats();this.queueData.uploadsSuccessful=e.successful_uploads;this.queueData.queueBytesUploaded+=f.size;if(c.inArray("onUploadSuccess",g.overrideEvents)<0){c("#"+f.id).find(".data").html(" - Complete");}if(g.onUploadSuccess){g.onUploadSuccess.call(this,f,h,d);}}};c.fn.uploadify=function(d){if(b[d]){return b[d].apply(this,Array.prototype.slice.call(arguments,1));}else{if(typeof d==="object"||!d){return b.init.apply(this,arguments);}else{c.error("The method "+d+" does not exist in $.uploadify");}}};})($);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/uploadify/jquery.uploadify.js b/src/main/webapp/plug-in/uploadify/jquery.uploadify.js
    new file mode 100644
    index 00000000..320a7303
    --- /dev/null
    +++ b/src/main/webapp/plug-in/uploadify/jquery.uploadify.js
    @@ -0,0 +1,986 @@
    +/*
    +SWFObject v2.2 <http://code.google.com/p/swfobject/> 
    +is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
    +*/
    +;var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;
    +if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;
    +X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);
    +ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0;}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");
    +if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)];}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac};
    +}(),k=function(){if(!M.w3){return;}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f();
    +}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false);}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);
    +f();}});if(O==top){(function(){if(J){return;}try{j.documentElement.doScroll("left");}catch(X){setTimeout(arguments.callee,0);return;}f();})();}}if(M.wk){(function(){if(J){return;
    +}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return;}f();})();}s(f);}}();function f(){if(J){return;}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));
    +Z.parentNode.removeChild(Z);}catch(aa){return;}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]();}}function K(X){if(J){X();}else{U[U.length]=X;}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false);
    +}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false);}else{if(typeof O.attachEvent!=D){i(O,"onload",Y);}else{if(typeof O.onload=="function"){var X=O.onload;
    +O.onload=function(){X();Y();};}else{O.onload=Y;}}}}}function h(){if(T){V();}else{H();}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);
    +aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");
    +M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)];}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return;}}X.removeChild(aa);Z=null;H();
    +})();}else{H();}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);
    +if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa);}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;
    +ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class");}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align");
    +}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value");
    +}}P(ai,ah,Y,ab);}else{p(ae);if(ab){ab(aa);}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z;}ab(aa);}}}}}function z(aa){var X=null;
    +var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y;}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z;}}}return X;}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312);
    +}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null;}else{l=ae;Q=X;}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310";
    +}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137";}j.title=j.title.slice(0,47)+" - Flash Player Installation";
    +var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac;
    +}else{ab.flashvars=ac;}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";
    +(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae);}else{setTimeout(arguments.callee,10);}})();}u(aa,ab,X);}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");
    +Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y);}else{setTimeout(arguments.callee,10);
    +}})();}else{Y.parentNode.replaceChild(g(Y),Y);}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML;}else{var Y=ab.getElementsByTagName(r)[0];
    +if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true));
    +}}}}}return aa;}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X;}if(aa){if(typeof ai.id==D){ai.id=Y;}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae];
    +}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"';}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"';}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />';
    +}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id);}else{var Z=C(r);Z.setAttribute("type",q);
    +for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac]);}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac]);
    +}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab]);}}aa.parentNode.replaceChild(Z,aa);X=Z;}}return X;}function e(Z,X,Y){var aa=C("param");
    +aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa);}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";
    +(function(){if(X.readyState==4){b(Y);}else{setTimeout(arguments.callee,10);}})();}else{X.parentNode.removeChild(X);}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null;
    +}}Y.parentNode.removeChild(Y);}}function c(Z){var X=null;try{X=j.getElementById(Z);}catch(Y){}return X;}function C(X){return j.createElement(X);}function i(Z,X,Y){Z.attachEvent(X,Y);
    +I[I.length]=[Z,X,Y];}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false;
    +}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return;}var aa=j.getElementsByTagName("head")[0];if(!aa){return;}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;
    +G=null;}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1];
    +}G=X;}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y);}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"));
    +}}}function w(Z,X){if(!m){return;}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y;}else{v("#"+Z,"visibility:"+Y);}}function L(Y){var Z=/[\\\"<>\.;]/;
    +var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y;}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;
    +for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2]);}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa]);}for(var Y in M){M[Y]=null;}M=null;for(var X in swfobject){swfobject[X]=null;
    +}swfobject=null;});}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;
    +w(ab,false);}else{if(Z){Z({success:false,id:ab});}}},getObjectById:function(X){if(M.w3){return z(X);}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};
    +if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al];}}aj.data=ab;
    +aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak];}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai];
    +}else{am.flashvars=ai+"="+Z[ai];}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true);}X.success=true;X.ref=an;}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);
    +return;}else{w(ah,true);}}if(ac){ac(X);}});}else{if(ac){ac(X);}}},switchOffAutoHideShow:function(){m=false;},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]};
    +},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X);}else{return undefined;}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y);
    +}},removeSWF:function(X){if(M.w3){y(X);}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X);}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;
    +if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1];}if(aa==null){return L(Z);}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)));
    +}}}return"";},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block";
    +}}if(E){E(B);}}a=false;}}};}();
    +
    +/*
    +SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
    +
    +mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,  http://www.vinterwebb.se/
    +
    +SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilz茅n and Mammon Media and is released under the MIT License:
    +http://www.opensource.org/licenses/mit-license.php
    + 
    +SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
    +http://www.opensource.org/licenses/mit-license.php
    +*/
    +
    +var SWFUpload;if(SWFUpload==undefined){SWFUpload=function(a){this.initSWFUpload(a)}}SWFUpload.prototype.initSWFUpload=function(b){try{this.customSettings={};this.settings=b;this.eventQueue=[];this.movieName="SWFUpload_"+SWFUpload.movieCount++;this.movieElement=null;SWFUpload.instances[this.movieName]=this;this.initSettings();this.loadFlash();this.displayDebugInfo()}catch(a){delete SWFUpload.instances[this.movieName];throw a}};SWFUpload.instances={};SWFUpload.movieCount=0;SWFUpload.version="2.2.0 2009-03-25";SWFUpload.QUEUE_ERROR={QUEUE_LIMIT_EXCEEDED:-100,FILE_EXCEEDS_SIZE_LIMIT:-110,ZERO_BYTE_FILE:-120,INVALID_FILETYPE:-130};SWFUpload.UPLOAD_ERROR={HTTP_ERROR:-200,MISSING_UPLOAD_URL:-210,IO_ERROR:-220,SECURITY_ERROR:-230,UPLOAD_LIMIT_EXCEEDED:-240,UPLOAD_FAILED:-250,SPECIFIED_FILE_ID_NOT_FOUND:-260,FILE_VALIDATION_FAILED:-270,FILE_CANCELLED:-280,UPLOAD_STOPPED:-290};SWFUpload.FILE_STATUS={QUEUED:-1,IN_PROGRESS:-2,ERROR:-3,COMPLETE:-4,CANCELLED:-5};SWFUpload.BUTTON_ACTION={SELECT_FILE:-100,SELECT_FILES:-110,START_UPLOAD:-120};SWFUpload.CURSOR={ARROW:-1,HAND:-2};SWFUpload.WINDOW_MODE={WINDOW:"window",TRANSPARENT:"transparent",OPAQUE:"opaque"};SWFUpload.completeURL=function(a){if(typeof(a)!=="string"||a.match(/^https?:\/\//i)||a.match(/^\//)){return a}var c=window.location.protocol+"//"+window.location.hostname+(window.location.port?":"+window.location.port:"");var b=window.location.pathname.lastIndexOf("/");if(b<=0){path="/"}else{path=window.location.pathname.substr(0,b)+"/"}return path+a};SWFUpload.prototype.initSettings=function(){this.ensureDefault=function(b,a){this.settings[b]=(this.settings[b]==undefined)?a:this.settings[b]};this.ensureDefault("upload_url","");this.ensureDefault("preserve_relative_urls",false);this.ensureDefault("file_post_name","Filedata");this.ensureDefault("post_params",{});this.ensureDefault("use_query_string",false);this.ensureDefault("requeue_on_error",false);this.ensureDefault("http_success",[]);this.ensureDefault("assume_success_timeout",0);this.ensureDefault("file_types","*.*");this.ensureDefault("file_types_description","All Files");this.ensureDefault("file_size_limit",0);this.ensureDefault("file_upload_limit",0);this.ensureDefault("file_queue_limit",0);this.ensureDefault("flash_url","swfupload.swf");this.ensureDefault("prevent_swf_caching",true);this.ensureDefault("button_image_url","");this.ensureDefault("button_width",1);this.ensureDefault("button_height",1);this.ensureDefault("button_text","");this.ensureDefault("button_text_style","color: #000000; font-size: 16pt;");this.ensureDefault("button_text_top_padding",0);this.ensureDefault("button_text_left_padding",0);this.ensureDefault("button_action",SWFUpload.BUTTON_ACTION.SELECT_FILES);this.ensureDefault("button_disabled",false);this.ensureDefault("button_placeholder_id","");this.ensureDefault("button_placeholder",null);this.ensureDefault("button_cursor",SWFUpload.CURSOR.ARROW);this.ensureDefault("button_window_mode",SWFUpload.WINDOW_MODE.WINDOW);this.ensureDefault("debug",false);this.settings.debug_enabled=this.settings.debug;this.settings.return_upload_start_handler=this.returnUploadStart;this.ensureDefault("swfupload_loaded_handler",null);this.ensureDefault("file_dialog_start_handler",null);this.ensureDefault("file_queued_handler",null);this.ensureDefault("file_queue_error_handler",null);this.ensureDefault("file_dialog_complete_handler",null);this.ensureDefault("upload_start_handler",null);this.ensureDefault("upload_progress_handler",null);this.ensureDefault("upload_error_handler",null);this.ensureDefault("upload_success_handler",null);this.ensureDefault("upload_complete_handler",null);this.ensureDefault("debug_handler",this.debugMessage);this.ensureDefault("custom_settings",{});this.customSettings=this.settings.custom_settings;if(!!this.settings.prevent_swf_caching){this.settings.flash_url=this.settings.flash_url+(this.settings.flash_url.indexOf("?")<0?"?":"&")+"preventswfcaching="+new Date().getTime()}if(!this.settings.preserve_relative_urls){this.settings.upload_url=SWFUpload.completeURL(this.settings.upload_url);this.settings.button_image_url=SWFUpload.completeURL(this.settings.button_image_url)}delete this.ensureDefault};SWFUpload.prototype.loadFlash=function(){var a,b;if(document.getElementById(this.movieName)!==null){throw"ID "+this.movieName+" is already in use. The Flash Object could not be added"}a=document.getElementById(this.settings.button_placeholder_id)||this.settings.button_placeholder;if(a==undefined){throw"Could not find the placeholder element: "+this.settings.button_placeholder_id}b=document.createElement("div");b.innerHTML=this.getFlashHTML();a.parentNode.replaceChild(b.firstChild,a);if(window[this.movieName]==undefined){window[this.movieName]=this.getMovieElement()}};SWFUpload.prototype.getFlashHTML=function(){return['<object id="',this.movieName,'" type="application/x-shockwave-flash" data="',this.settings.flash_url,'" width="',this.settings.button_width,'" height="',this.settings.button_height,'" class="swfupload">','<param name="wmode" value="',this.settings.button_window_mode,'" />','<param name="movie" value="',this.settings.flash_url,'" />','<param name="quality" value="high" />','<param name="menu" value="false" />','<param name="allowScriptAccess" value="always" />','<param name="flashvars" value="'+this.getFlashVars()+'" />',"</object>"].join("")};SWFUpload.prototype.getFlashVars=function(){var b=this.buildParamString();var a=this.settings.http_success.join(",");return["movieName=",encodeURIComponent(this.movieName),"&amp;uploadURL=",encodeURIComponent(this.settings.upload_url),"&amp;useQueryString=",encodeURIComponent(this.settings.use_query_string),"&amp;requeueOnError=",encodeURIComponent(this.settings.requeue_on_error),"&amp;httpSuccess=",encodeURIComponent(a),"&amp;assumeSuccessTimeout=",encodeURIComponent(this.settings.assume_success_timeout),"&amp;params=",encodeURIComponent(b),"&amp;filePostName=",encodeURIComponent(this.settings.file_post_name),"&amp;fileTypes=",encodeURIComponent(this.settings.file_types),"&amp;fileTypesDescription=",encodeURIComponent(this.settings.file_types_description),"&amp;fileSizeLimit=",encodeURIComponent(this.settings.file_size_limit),"&amp;fileUploadLimit=",encodeURIComponent(this.settings.file_upload_limit),"&amp;fileQueueLimit=",encodeURIComponent(this.settings.file_queue_limit),"&amp;debugEnabled=",encodeURIComponent(this.settings.debug_enabled),"&amp;buttonImageURL=",encodeURIComponent(this.settings.button_image_url),"&amp;buttonWidth=",encodeURIComponent(this.settings.button_width),"&amp;buttonHeight=",encodeURIComponent(this.settings.button_height),"&amp;buttonText=",encodeURIComponent(this.settings.button_text),"&amp;buttonTextTopPadding=",encodeURIComponent(this.settings.button_text_top_padding),"&amp;buttonTextLeftPadding=",encodeURIComponent(this.settings.button_text_left_padding),"&amp;buttonTextStyle=",encodeURIComponent(this.settings.button_text_style),"&amp;buttonAction=",encodeURIComponent(this.settings.button_action),"&amp;buttonDisabled=",encodeURIComponent(this.settings.button_disabled),"&amp;buttonCursor=",encodeURIComponent(this.settings.button_cursor)].join("")};SWFUpload.prototype.getMovieElement=function(){if(this.movieElement==undefined){this.movieElement=document.getElementById(this.movieName)}if(this.movieElement===null){throw"Could not find Flash element"}return this.movieElement};SWFUpload.prototype.buildParamString=function(){var c=this.settings.post_params;var b=[];if(typeof(c)==="object"){for(var a in c){if(c.hasOwnProperty(a)){b.push(encodeURIComponent(a.toString())+"="+encodeURIComponent(c[a].toString()))}}}return b.join("&amp;")};SWFUpload.prototype.destroy=function(){try{this.cancelUpload(null,false);var a=null;a=this.getMovieElement();if(a&&typeof(a.CallFunction)==="unknown"){for(var c in a){try{if(typeof(a[c])==="function"){a[c]=null}}catch(e){}}try{a.parentNode.removeChild(a)}catch(b){}}window[this.movieName]=null;SWFUpload.instances[this.movieName]=null;delete SWFUpload.instances[this.movieName];this.movieElement=null;this.settings=null;this.customSettings=null;this.eventQueue=null;this.movieName=null;return true}catch(d){return false}};SWFUpload.prototype.displayDebugInfo=function(){this.debug(["---SWFUpload Instance Info---\n","Version: ",SWFUpload.version,"\n","Movie Name: ",this.movieName,"\n","Settings:\n","\t","upload_url:               ",this.settings.upload_url,"\n","\t","flash_url:                ",this.settings.flash_url,"\n","\t","use_query_string:         ",this.settings.use_query_string.toString(),"\n","\t","requeue_on_error:         ",this.settings.requeue_on_error.toString(),"\n","\t","http_success:             ",this.settings.http_success.join(", "),"\n","\t","assume_success_timeout:   ",this.settings.assume_success_timeout,"\n","\t","file_post_name:           ",this.settings.file_post_name,"\n","\t","post_params:              ",this.settings.post_params.toString(),"\n","\t","file_types:               ",this.settings.file_types,"\n","\t","file_types_description:   ",this.settings.file_types_description,"\n","\t","file_size_limit:          ",this.settings.file_size_limit,"\n","\t","file_upload_limit:        ",this.settings.file_upload_limit,"\n","\t","file_queue_limit:         ",this.settings.file_queue_limit,"\n","\t","debug:                    ",this.settings.debug.toString(),"\n","\t","prevent_swf_caching:      ",this.settings.prevent_swf_caching.toString(),"\n","\t","button_placeholder_id:    ",this.settings.button_placeholder_id.toString(),"\n","\t","button_placeholder:       ",(this.settings.button_placeholder?"Set":"Not Set"),"\n","\t","button_image_url:         ",this.settings.button_image_url.toString(),"\n","\t","button_width:             ",this.settings.button_width.toString(),"\n","\t","button_height:            ",this.settings.button_height.toString(),"\n","\t","button_text:              ",this.settings.button_text.toString(),"\n","\t","button_text_style:        ",this.settings.button_text_style.toString(),"\n","\t","button_text_top_padding:  ",this.settings.button_text_top_padding.toString(),"\n","\t","button_text_left_padding: ",this.settings.button_text_left_padding.toString(),"\n","\t","button_action:            ",this.settings.button_action.toString(),"\n","\t","button_disabled:          ",this.settings.button_disabled.toString(),"\n","\t","custom_settings:          ",this.settings.custom_settings.toString(),"\n","Event Handlers:\n","\t","swfupload_loaded_handler assigned:  ",(typeof this.settings.swfupload_loaded_handler==="function").toString(),"\n","\t","file_dialog_start_handler assigned: ",(typeof this.settings.file_dialog_start_handler==="function").toString(),"\n","\t","file_queued_handler assigned:       ",(typeof this.settings.file_queued_handler==="function").toString(),"\n","\t","file_queue_error_handler assigned:  ",(typeof this.settings.file_queue_error_handler==="function").toString(),"\n","\t","upload_start_handler assigned:      ",(typeof this.settings.upload_start_handler==="function").toString(),"\n","\t","upload_progress_handler assigned:   ",(typeof this.settings.upload_progress_handler==="function").toString(),"\n","\t","upload_error_handler assigned:      ",(typeof this.settings.upload_error_handler==="function").toString(),"\n","\t","upload_success_handler assigned:    ",(typeof this.settings.upload_success_handler==="function").toString(),"\n","\t","upload_complete_handler assigned:   ",(typeof this.settings.upload_complete_handler==="function").toString(),"\n","\t","debug_handler assigned:             ",(typeof this.settings.debug_handler==="function").toString(),"\n"].join(""))};SWFUpload.prototype.addSetting=function(b,c,a){if(c==undefined){return(this.settings[b]=a)}else{return(this.settings[b]=c)}};SWFUpload.prototype.getSetting=function(a){if(this.settings[a]!=undefined){return this.settings[a]}return""};SWFUpload.prototype.callFlash=function(functionName,argumentArray){argumentArray=argumentArray||[];var movieElement=this.getMovieElement();var returnValue,returnString;try{returnString=movieElement.CallFunction('<invoke name="'+functionName+'" returntype="javascript">'+__flash__argumentsToXML(argumentArray,0)+"</invoke>");returnValue=eval(returnString)}catch(ex){throw"Call to "+functionName+" failed"}if(returnValue!=undefined&&typeof returnValue.post==="object"){returnValue=this.unescapeFilePostParams(returnValue)}return returnValue};SWFUpload.prototype.selectFile=function(){this.callFlash("SelectFile")};SWFUpload.prototype.selectFiles=function(){this.callFlash("SelectFiles")};SWFUpload.prototype.startUpload=function(a){this.callFlash("StartUpload",[a])};SWFUpload.prototype.cancelUpload=function(a,b){if(b!==false){b=true}this.callFlash("CancelUpload",[a,b])};SWFUpload.prototype.stopUpload=function(){this.callFlash("StopUpload")};SWFUpload.prototype.getStats=function(){return this.callFlash("GetStats")};SWFUpload.prototype.setStats=function(a){this.callFlash("SetStats",[a])};SWFUpload.prototype.getFile=function(a){if(typeof(a)==="number"){return this.callFlash("GetFileByIndex",[a])}else{return this.callFlash("GetFile",[a])}};SWFUpload.prototype.addFileParam=function(a,b,c){return this.callFlash("AddFileParam",[a,b,c])};SWFUpload.prototype.removeFileParam=function(a,b){this.callFlash("RemoveFileParam",[a,b])};SWFUpload.prototype.setUploadURL=function(a){this.settings.upload_url=a.toString();this.callFlash("SetUploadURL",[a])};SWFUpload.prototype.setPostParams=function(a){this.settings.post_params=a;this.callFlash("SetPostParams",[a])};SWFUpload.prototype.addPostParam=function(a,b){this.settings.post_params[a]=b;this.callFlash("SetPostParams",[this.settings.post_params])};SWFUpload.prototype.removePostParam=function(a){delete this.settings.post_params[a];this.callFlash("SetPostParams",[this.settings.post_params])};SWFUpload.prototype.setFileTypes=function(a,b){this.settings.file_types=a;this.settings.file_types_description=b;this.callFlash("SetFileTypes",[a,b])};SWFUpload.prototype.setFileSizeLimit=function(a){this.settings.file_size_limit=a;this.callFlash("SetFileSizeLimit",[a])};SWFUpload.prototype.setFileUploadLimit=function(a){this.settings.file_upload_limit=a;this.callFlash("SetFileUploadLimit",[a])};SWFUpload.prototype.setFileQueueLimit=function(a){this.settings.file_queue_limit=a;this.callFlash("SetFileQueueLimit",[a])};SWFUpload.prototype.setFilePostName=function(a){this.settings.file_post_name=a;this.callFlash("SetFilePostName",[a])};SWFUpload.prototype.setUseQueryString=function(a){this.settings.use_query_string=a;this.callFlash("SetUseQueryString",[a])};SWFUpload.prototype.setRequeueOnError=function(a){this.settings.requeue_on_error=a;this.callFlash("SetRequeueOnError",[a])};SWFUpload.prototype.setHTTPSuccess=function(a){if(typeof a==="string"){a=a.replace(" ","").split(",")}this.settings.http_success=a;this.callFlash("SetHTTPSuccess",[a])};SWFUpload.prototype.setAssumeSuccessTimeout=function(a){this.settings.assume_success_timeout=a;this.callFlash("SetAssumeSuccessTimeout",[a])};SWFUpload.prototype.setDebugEnabled=function(a){this.settings.debug_enabled=a;this.callFlash("SetDebugEnabled",[a])};SWFUpload.prototype.setButtonImageURL=function(a){if(a==undefined){a=""}this.settings.button_image_url=a;this.callFlash("SetButtonImageURL",[a])};SWFUpload.prototype.setButtonDimensions=function(c,a){this.settings.button_width=c;this.settings.button_height=a;var b=this.getMovieElement();if(b!=undefined){b.style.width=c+"px";b.style.height=a+"px"}this.callFlash("SetButtonDimensions",[c,a])};SWFUpload.prototype.setButtonText=function(a){this.settings.button_text=a;this.callFlash("SetButtonText",[a])};SWFUpload.prototype.setButtonTextPadding=function(b,a){this.settings.button_text_top_padding=a;this.settings.button_text_left_padding=b;this.callFlash("SetButtonTextPadding",[b,a])};SWFUpload.prototype.setButtonTextStyle=function(a){this.settings.button_text_style=a;this.callFlash("SetButtonTextStyle",[a])};SWFUpload.prototype.setButtonDisabled=function(a){this.settings.button_disabled=a;this.callFlash("SetButtonDisabled",[a])};SWFUpload.prototype.setButtonAction=function(a){this.settings.button_action=a;this.callFlash("SetButtonAction",[a])};SWFUpload.prototype.setButtonCursor=function(a){this.settings.button_cursor=a;this.callFlash("SetButtonCursor",[a])};SWFUpload.prototype.queueEvent=function(b,c){if(c==undefined){c=[]}else{if(!(c instanceof Array)){c=[c]}}var a=this;if(typeof this.settings[b]==="function"){this.eventQueue.push(function(){this.settings[b].apply(this,c)});setTimeout(function(){a.executeNextEvent()},0)}else{if(this.settings[b]!==null){throw"Event handler "+b+" is unknown or is not a function"}}};SWFUpload.prototype.executeNextEvent=function(){var a=this.eventQueue?this.eventQueue.shift():null;if(typeof(a)==="function"){a.apply(this)}};SWFUpload.prototype.unescapeFilePostParams=function(c){var e=/[$]([0-9a-f]{4})/i;var f={};var d;if(c!=undefined){for(var a in c.post){if(c.post.hasOwnProperty(a)){d=a;var b;while((b=e.exec(d))!==null){d=d.replace(b[0],String.fromCharCode(parseInt("0x"+b[1],16)))}f[d]=c.post[a]}}c.post=f}return c};SWFUpload.prototype.testExternalInterface=function(){try{return this.callFlash("TestExternalInterface")}catch(a){return false}};SWFUpload.prototype.flashReady=function(){var a=this.getMovieElement();if(!a){this.debug("Flash called back ready but the flash movie can't be found.");return}this.cleanUp(a);this.queueEvent("swfupload_loaded_handler")};SWFUpload.prototype.cleanUp=function(a){try{if(this.movieElement&&typeof(a.CallFunction)==="unknown"){this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");for(var c in a){try{if(typeof(a[c])==="function"){a[c]=null}}catch(b){}}}}catch(d){}window.__flash__removeCallback=function(e,f){try{if(e){e[f]=null}}catch(g){}}};SWFUpload.prototype.fileDialogStart=function(){this.queueEvent("file_dialog_start_handler")};SWFUpload.prototype.fileQueued=function(a){a=this.unescapeFilePostParams(a);this.queueEvent("file_queued_handler",a)};SWFUpload.prototype.fileQueueError=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent("file_queue_error_handler",[a,c,b])};SWFUpload.prototype.fileDialogComplete=function(b,c,a){this.queueEvent("file_dialog_complete_handler",[b,c,a])};SWFUpload.prototype.uploadStart=function(a){a=this.unescapeFilePostParams(a);this.queueEvent("return_upload_start_handler",a)};SWFUpload.prototype.returnUploadStart=function(a){var b;if(typeof this.settings.upload_start_handler==="function"){a=this.unescapeFilePostParams(a);b=this.settings.upload_start_handler.call(this,a)}else{if(this.settings.upload_start_handler!=undefined){throw"upload_start_handler must be a function"}}if(b===undefined){b=true}b=!!b;this.callFlash("ReturnUploadStart",[b])};SWFUpload.prototype.uploadProgress=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent("upload_progress_handler",[a,c,b])};SWFUpload.prototype.uploadError=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent("upload_error_handler",[a,c,b])};SWFUpload.prototype.uploadSuccess=function(b,a,c){b=this.unescapeFilePostParams(b);this.queueEvent("upload_success_handler",[b,a,c])};SWFUpload.prototype.uploadComplete=function(a){a=this.unescapeFilePostParams(a);this.queueEvent("upload_complete_handler",a)};SWFUpload.prototype.debug=function(a){this.queueEvent("debug_handler",a)};SWFUpload.prototype.debugMessage=function(c){if(this.settings.debug){var a,d=[];if(typeof c==="object"&&typeof c.name==="string"&&typeof c.message==="string"){for(var b in c){if(c.hasOwnProperty(b)){d.push(b+": "+c[b])}}a=d.join("\n")||"";d=a.split("\n");a="EXCEPTION: "+d.join("\nEXCEPTION: ");SWFUpload.Console.writeLine(a)}else{SWFUpload.Console.writeLine(c)}}};SWFUpload.Console={};SWFUpload.Console.writeLine=function(d){var b,a;try{b=document.getElementById("SWFUpload_Console");if(!b){a=document.createElement("form");document.getElementsByTagName("body")[0].appendChild(a);b=document.createElement("textarea");b.id="SWFUpload_Console";b.style.fontFamily="monospace";b.setAttribute("wrap","off");b.wrap="off";b.style.overflow="auto";b.style.width="700px";b.style.height="350px";b.style.margin="5px";a.appendChild(b)}b.value+=d+"\n";b.scrollTop=b.scrollHeight-b.clientHeight}catch(c){alert("Exception: "+c.name+" Message: "+c.message)}};
    +
    +/*
    +Uploadify v3.2
    +Copyright (c) 2012 Reactive Apps, Ronnie Garcia
    +Released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
    +*/
    +
    +(function($) {
    +
    +	// These methods can be called by adding them as the first argument in the uploadify plugin call
    +	var methods = {
    +
    +		init : function(options, swfUploadOptions) {
    +			
    +			return this.each(function() {
    +
    +				// Create a reference to the jQuery DOM object
    +				var $this = $(this);
    +
    +				// Clone the original DOM object
    +				var $clone = $this.clone();
    +
    +				// Setup the default options
    +				var settings = $.extend({
    +					// Required Settings
    +					id       : $this.attr('id'), // The ID of the DOM object
    +					swf      : 'uploadify.swf',  // The path to the uploadify SWF file
    +					uploader : 'uploadify.php',  // The path to the server-side upload script
    +					
    +					// Options
    +					auto            : true,               // Automatically upload files when added to the queue
    +					buttonClass     : '',                 // A class name to add to the browse button DOM object
    +					buttonCursor    : 'hand',             // The cursor to use with the browse button
    +					buttonImage     : null,               // (String or null) The path to an image to use for the Flash browse button if not using CSS to style the button
    +					buttonText      : 'SELECT FILES',     // The text to use for the browse button
    +					checkExisting   : false,              // The path to a server-side script that checks for existing files on the server
    +					debug           : false,              // Turn on swfUpload debugging mode
    +					fileObjName     : 'Filedata',         // The name of the file object to use in your server-side script
    +					fileSizeLimit   : 0,                  // The maximum size of an uploadable file in KB (Accepts units B KB MB GB if string, 0 for no limit)
    +					fileTypeDesc    : 'All Files',        // The description for file types in the browse dialog
    +					fileTypeExts    : '*.*',              // Allowed extensions in the browse dialog (server-side validation should also be used)
    +					height          : 30,                 // The height of the browse button
    +					itemTemplate    : false,              // The template for the file item in the queue
    +					method          : 'post',             // The method to use when sending files to the server-side upload script
    +					multi           : true,               // Allow multiple file selection in the browse dialog
    +					formData        : {},                 // An object with additional data to send to the server-side upload script with every file upload
    +					preventCaching  : true,               // Adds a random value to the Flash URL to prevent caching of it (conflicts with existing parameters)
    +					progressData    : 'percentage',       // ('percentage' or 'speed') Data to show in the queue item during a file upload
    +					queueID         : false,              // The ID of the DOM object to use as a file queue (without the #)
    +					queueSizeLimit  : 999,                // The maximum number of files that can be in the queue at one time
    +					removeCompleted : true,               // Remove queue items from the queue when they are done uploading
    +					removeTimeout   : 3,                  // The delay in seconds before removing a queue item if removeCompleted is set to true
    +					requeueErrors   : false,              // Keep errored files in the queue and keep trying to upload them
    +					successTimeout  : 30,                 // The number of seconds to wait for Flash to detect the server's response after the file has finished uploading
    +					uploadLimit     : 0,                  // The maximum number of files you can upload
    +					width           : 120,                // The width of the browse button
    +					
    +					// Events
    +					overrideEvents  : []             // (Array) A list of default event handlers to skip
    +					/*
    +					onCancel         // Triggered when a file is cancelled from the queue
    +					onClearQueue     // Triggered during the 'clear queue' method
    +					onDestroy        // Triggered when the uploadify object is destroyed
    +					onDialogClose    // Triggered when the browse dialog is closed
    +					onDialogOpen     // Triggered when the browse dialog is opened
    +					onDisable        // Triggered when the browse button gets disabled
    +					onEnable         // Triggered when the browse button gets enabled
    +					onFallback       // Triggered is Flash is not detected    
    +					onInit           // Triggered when Uploadify is initialized
    +					onQueueComplete  // Triggered when all files in the queue have been uploaded
    +					onSelectError    // Triggered when an error occurs while selecting a file (file size, queue size limit, etc.)
    +					onSelect         // Triggered for each file that is selected
    +					onSWFReady       // Triggered when the SWF button is loaded
    +					onUploadComplete // Triggered when a file upload completes (success or error)
    +					onUploadError    // Triggered when a file upload returns an error
    +					onUploadSuccess  // Triggered when a file is uploaded successfully
    +					onUploadProgress // Triggered every time a file progress is updated
    +					onUploadStart    // Triggered immediately before a file upload starts
    +					*/
    +				}, options);
    +
    +				// Prepare settings for SWFUpload
    +				var swfUploadSettings = {
    +					assume_success_timeout   : settings.successTimeout,
    +					button_placeholder_id    : settings.id,
    +					button_width             : settings.width,
    +					button_height            : settings.height,
    +					button_text              : null,
    +					button_text_style        : null,
    +					button_text_top_padding  : 0,
    +					button_text_left_padding : 0,
    +					button_action            : (settings.multi ? SWFUpload.BUTTON_ACTION.SELECT_FILES : SWFUpload.BUTTON_ACTION.SELECT_FILE),
    +					button_disabled          : false,
    +					button_cursor            : (settings.buttonCursor == 'arrow' ? SWFUpload.CURSOR.ARROW : SWFUpload.CURSOR.HAND),
    +					button_window_mode       : SWFUpload.WINDOW_MODE.TRANSPARENT,
    +					debug                    : settings.debug,						
    +					requeue_on_error         : settings.requeueErrors,
    +					file_post_name           : settings.fileObjName,
    +					file_size_limit          : settings.fileSizeLimit,
    +					file_types               : settings.fileTypeExts,
    +					file_types_description   : settings.fileTypeDesc,
    +					file_queue_limit         : settings.queueSizeLimit,
    +					file_upload_limit        : settings.uploadLimit,
    +					flash_url                : settings.swf,					
    +					prevent_swf_caching      : settings.preventCaching,
    +					post_params              : settings.formData,
    +					upload_url               : settings.uploader,
    +					use_query_string         : (settings.method == 'get'),
    +					
    +					// Event Handlers 
    +					file_dialog_complete_handler : handlers.onDialogClose,
    +					file_dialog_start_handler    : handlers.onDialogOpen,
    +					file_queued_handler          : handlers.onSelect,
    +					file_queue_error_handler     : handlers.onSelectError,
    +					swfupload_loaded_handler     : settings.onSWFReady,
    +					upload_complete_handler      : handlers.onUploadComplete,
    +					upload_error_handler         : handlers.onUploadError,
    +					upload_progress_handler      : handlers.onUploadProgress,
    +					upload_start_handler         : handlers.onUploadStart,
    +					upload_success_handler       : handlers.onUploadSuccess
    +				}
    +
    +				// Merge the user-defined options with the defaults
    +				if (swfUploadOptions) {
    +					swfUploadSettings = $.extend(swfUploadSettings, swfUploadOptions);
    +				}
    +				// Add the user-defined settings to the swfupload object
    +				swfUploadSettings = $.extend(swfUploadSettings, settings);
    +				
    +				// Detect if Flash is available
    +				var playerVersion  = swfobject.getFlashPlayerVersion();
    +				var flashInstalled = (playerVersion.major >= 9);
    +
    +				if (flashInstalled) {
    +					// Create the swfUpload instance
    +					window['uploadify_' + settings.id] = new SWFUpload(swfUploadSettings);
    +					var swfuploadify = window['uploadify_' + settings.id];
    +
    +					// Add the SWFUpload object to the elements data object
    +					$this.data('uploadify', swfuploadify);
    +					
    +					// Wrap the instance
    +					var $wrapper = $('<div />', {
    +						'id'    : settings.id,
    +						'class' : 'uploadify',
    +						'css'   : {
    +									'height'   : settings.height + 'px',
    +									'width'    : settings.width + 'px'
    +								  }
    +					});
    +					$('#' + swfuploadify.movieName).wrap($wrapper);
    +					// Recreate the reference to wrapper
    +					$wrapper = $('#' + settings.id);
    +					// Add the data object to the wrapper 
    +					$wrapper.data('uploadify', swfuploadify);
    +
    +					// Create the button
    +					var $button = $('<div />', {
    +						'id'    : settings.id + '-button',
    +						'class' : 'uploadify-button ' + settings.buttonClass
    +					});
    +					if (settings.buttonImage) {
    +						$button.css({
    +							'background-image' : "url('" + settings.buttonImage + "')",
    +							'text-indent'      : '-9999px'
    +						});
    +					}
    +					$button.html('<span class="uploadify-button-text">' + settings.buttonText + '</span>')
    +					.css({
    +						'height'      : settings.height + 'px',
    +						'line-height' : settings.height + 'px',
    +						'width'       : settings.width + 'px'
    +					});
    +					// Append the button to the wrapper
    +					$wrapper.append($button);
    +
    +					// Adjust the styles of the movie
    +					$('#' + swfuploadify.movieName).css({
    +						'position' : 'absolute',
    +						'z-index'  : 1
    +					});
    +					
    +					// Create the file queue
    +					if (!settings.queueID) {
    +						var $queue = $('<div />', {
    +							'id'    : settings.id + '-queue',
    +							'class' : 'uploadify-queue'
    +						});
    +						$wrapper.after($queue);
    +						swfuploadify.settings.queueID      = settings.id + '-queue';
    +						swfuploadify.settings.defaultQueue = true;
    +					}
    +					
    +					// Create some queue related objects and variables
    +					swfuploadify.queueData = {
    +						files              : {}, // The files in the queue
    +						filesSelected      : 0, // The number of files selected in the last select operation
    +						filesQueued        : 0, // The number of files added to the queue in the last select operation
    +						filesReplaced      : 0, // The number of files replaced in the last select operation
    +						filesCancelled     : 0, // The number of files that were cancelled instead of replaced
    +						filesErrored       : 0, // The number of files that caused error in the last select operation
    +						uploadsSuccessful  : 0, // The number of files that were successfully uploaded
    +						uploadsErrored     : 0, // The number of files that returned errors during upload
    +						averageSpeed       : 0, // The average speed of the uploads in KB
    +						queueLength        : 0, // The number of files in the queue
    +						queueSize          : 0, // The size in bytes of the entire queue
    +						uploadSize         : 0, // The size in bytes of the upload queue
    +						queueBytesUploaded : 0, // The size in bytes that have been uploaded for the current upload queue
    +						uploadQueue        : [], // The files currently to be uploaded
    +						errorMsg           : 'Some files were not added to the queue:'
    +					};
    +
    +					// Save references to all the objects
    +					swfuploadify.original = $clone;
    +					swfuploadify.wrapper  = $wrapper;
    +					swfuploadify.button   = $button;
    +					swfuploadify.queue    = $queue;
    +
    +					// Call the user-defined init event handler
    +					if (settings.onInit) settings.onInit.call($this, swfuploadify);
    +
    +				} else {
    +
    +					// Call the fallback function
    +					if (settings.onFallback) settings.onFallback.call($this);
    +
    +				}
    +			});
    +
    +		},
    +
    +		// Stop a file upload and remove it from the queue 
    +		cancel : function(fileID, supressEvent) {
    +
    +			var args = arguments;
    +
    +			this.each(function() {
    +				// Create a reference to the jQuery DOM object
    +				var $this        = $(this),
    +					swfuploadify = $this.data('uploadify'),
    +					settings     = swfuploadify.settings,
    +					delay        = -1;
    +
    +				if (args[0]) {
    +					// Clear the queue
    +					if (args[0] == '*') {
    +						var queueItemCount = swfuploadify.queueData.queueLength;
    +						$('#' + settings.queueID).find('.uploadify-queue-item').each(function() {
    +							delay++;
    +							if (args[1] === true) {
    +								swfuploadify.cancelUpload($(this).attr('id'), false);
    +							} else {
    +								swfuploadify.cancelUpload($(this).attr('id'));
    +							}
    +							$(this).find('.data').removeClass('data').html(' - Cancelled');
    +							$(this).find('.uploadify-progress-bar').remove();
    +							$(this).delay(1000 + 100 * delay).fadeOut(500, function() {
    +								$(this).remove();
    +							});
    +						});
    +						swfuploadify.queueData.queueSize   = 0;
    +						swfuploadify.queueData.queueLength = 0;
    +						// Trigger the onClearQueue event
    +						if (settings.onClearQueue) settings.onClearQueue.call($this, queueItemCount);
    +					} else {
    +						for (var n = 0; n < args.length; n++) {
    +							swfuploadify.cancelUpload(args[n]);
    +							$('#' + args[n]).find('.data').removeClass('data').html(' - Cancelled');
    +							$('#' + args[n]).find('.uploadify-progress-bar').remove();
    +							$('#' + args[n]).delay(1000 + 100 * n).fadeOut(500, function() {
    +								$(this).remove();
    +							});
    +						}
    +					}
    +				} else {
    +					var item = $('#' + settings.queueID).find('.uploadify-queue-item').get(0);
    +					$item = $(item);
    +					swfuploadify.cancelUpload($item.attr('id'));
    +					$item.find('.data').removeClass('data').html(' - Cancelled');
    +					$item.find('.uploadify-progress-bar').remove();
    +					$item.delay(1000).fadeOut(500, function() {
    +						$(this).remove();
    +					});
    +				}
    +			});
    +
    +		},
    +
    +		// Revert the DOM object back to its original state
    +		destroy : function() {
    +
    +			this.each(function() {
    +				// Create a reference to the jQuery DOM object
    +				var $this        = $(this),
    +					swfuploadify = $this.data('uploadify'),
    +					settings     = swfuploadify.settings;
    +
    +				// Destroy the SWF object and 
    +				swfuploadify.destroy();
    +				
    +				// Destroy the queue
    +				if (settings.defaultQueue) {
    +					$('#' + settings.queueID).remove();
    +				}
    +				
    +				// Reload the original DOM element
    +				$('#' + settings.id).replaceWith(swfuploadify.original);
    +
    +				// Call the user-defined event handler
    +				if (settings.onDestroy) settings.onDestroy.call(this);
    +
    +				delete swfuploadify;
    +			});
    +
    +		},
    +
    +		// Disable the select button
    +		disable : function(isDisabled) {
    +			
    +			this.each(function() {
    +				// Create a reference to the jQuery DOM object
    +				var $this        = $(this),
    +					swfuploadify = $this.data('uploadify'),
    +					settings     = swfuploadify.settings;
    +
    +				// Call the user-defined event handlers
    +				if (isDisabled) {
    +					swfuploadify.button.addClass('disabled');
    +					if (settings.onDisable) settings.onDisable.call(this);
    +				} else {
    +					swfuploadify.button.removeClass('disabled');
    +					if (settings.onEnable) settings.onEnable.call(this);
    +				}
    +
    +				// Enable/disable the browse button
    +				swfuploadify.setButtonDisabled(isDisabled);
    +			});
    +
    +		},
    +
    +		// Get or set the settings data
    +		settings : function(name, value, resetObjects) {
    +
    +			var args        = arguments;
    +			var returnValue = value;
    +
    +			this.each(function() {
    +				// Create a reference to the jQuery DOM object
    +				var $this        = $(this),
    +					swfuploadify = $this.data('uploadify'),
    +					settings     = swfuploadify.settings;
    +
    +				if (typeof(args[0]) == 'object') {
    +					for (var n in value) {
    +						setData(n,value[n]);
    +					}
    +				}
    +				if (args.length === 1) {
    +					returnValue =  settings[name];
    +				} else {
    +					switch (name) {
    +						case 'uploader':
    +							swfuploadify.setUploadURL(value);
    +							break;
    +						case 'formData':
    +							if (!resetObjects) {
    +								value = $.extend(settings.formData, value);
    +							}
    +							swfuploadify.setPostParams(settings.formData);
    +							break;
    +						case 'method':
    +							if (value == 'get') {
    +								swfuploadify.setUseQueryString(true);
    +							} else {
    +								swfuploadify.setUseQueryString(false);
    +							}
    +							break;
    +						case 'fileObjName':
    +							swfuploadify.setFilePostName(value);
    +							break;
    +						case 'fileTypeExts':
    +							swfuploadify.setFileTypes(value, settings.fileTypeDesc);
    +							break;
    +						case 'fileTypeDesc':
    +							swfuploadify.setFileTypes(settings.fileTypeExts, value);
    +							break;
    +						case 'fileSizeLimit':
    +							swfuploadify.setFileSizeLimit(value);
    +							break;
    +						case 'uploadLimit':
    +							swfuploadify.setFileUploadLimit(value);
    +							break;
    +						case 'queueSizeLimit':
    +							swfuploadify.setFileQueueLimit(value);
    +							break;
    +						case 'buttonImage':
    +							swfuploadify.button.css('background-image', settingValue);
    +							break;
    +						case 'buttonCursor':
    +							if (value == 'arrow') {
    +								swfuploadify.setButtonCursor(SWFUpload.CURSOR.ARROW);
    +							} else {
    +								swfuploadify.setButtonCursor(SWFUpload.CURSOR.HAND);
    +							}
    +							break;
    +						case 'buttonText':
    +							$('#' + settings.id + '-button').find('.uploadify-button-text').html(value);
    +							break;
    +						case 'width':
    +							swfuploadify.setButtonDimensions(value, settings.height);
    +							break;
    +						case 'height':
    +							swfuploadify.setButtonDimensions(settings.width, value);
    +							break;
    +						case 'multi':
    +							if (value) {
    +								swfuploadify.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILES);
    +							} else {
    +								swfuploadify.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILE);
    +							}
    +							break;
    +					}
    +					settings[name] = value;
    +				}
    +			});
    +			
    +			if (args.length === 1) {
    +				return returnValue;
    +			}
    +
    +		},
    +
    +		// Stop the current uploads and requeue what is in progress
    +		stop : function() {
    +
    +			this.each(function() {
    +				// Create a reference to the jQuery DOM object
    +				var $this        = $(this),
    +					swfuploadify = $this.data('uploadify');
    +
    +				// Reset the queue information
    +				swfuploadify.queueData.averageSpeed  = 0;
    +				swfuploadify.queueData.uploadSize    = 0;
    +				swfuploadify.queueData.bytesUploaded = 0;
    +				swfuploadify.queueData.uploadQueue   = [];
    +
    +				swfuploadify.stopUpload();
    +			});
    +
    +		},
    +
    +		// Start uploading files in the queue
    +		upload : function() {
    +
    +			var args = arguments;
    +
    +			this.each(function() {
    +				// Create a reference to the jQuery DOM object
    +				var $this        = $(this),
    +					swfuploadify = $this.data('uploadify');
    +
    +				// Reset the queue information
    +				swfuploadify.queueData.averageSpeed  = 0;
    +				swfuploadify.queueData.uploadSize    = 0;
    +				swfuploadify.queueData.bytesUploaded = 0;
    +				swfuploadify.queueData.uploadQueue   = [];
    +				
    +				// Upload the files
    +				if (args[0]) {
    +					if (args[0] == '*') {
    +						swfuploadify.queueData.uploadSize = swfuploadify.queueData.queueSize;
    +						swfuploadify.queueData.uploadQueue.push('*');
    +						swfuploadify.startUpload();
    +					} else {
    +						for (var n = 0; n < args.length; n++) {
    +							swfuploadify.queueData.uploadSize += swfuploadify.queueData.files[args[n]].size;
    +							swfuploadify.queueData.uploadQueue.push(args[n]);
    +						}
    +						swfuploadify.startUpload(swfuploadify.queueData.uploadQueue.shift());
    +					}
    +				} else {
    +					swfuploadify.startUpload();
    +				}
    +
    +			});
    +
    +		}
    +
    +	}
    +
    +	// These functions handle all the events that occur with the file uploader
    +	var handlers = {
    +
    +		// Triggered when the file dialog is opened
    +		onDialogOpen : function() {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			// Reset some queue info
    +			this.queueData.errorMsg       = 'Some files were not added to the queue:';
    +			this.queueData.filesReplaced  = 0;
    +			this.queueData.filesCancelled = 0;
    +
    +			// Call the user-defined event handler
    +			if (settings.onDialogOpen) settings.onDialogOpen.call(this);
    +		},
    +
    +		// Triggered when the browse dialog is closed
    +		onDialogClose :  function(filesSelected, filesQueued, queueLength) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			// Update the queue information
    +			this.queueData.filesErrored  = filesSelected - filesQueued;
    +			this.queueData.filesSelected = filesSelected;
    +			this.queueData.filesQueued   = filesQueued - this.queueData.filesCancelled;
    +			this.queueData.queueLength   = queueLength;
    +
    +			// Run the default event handler
    +			if ($.inArray('onDialogClose', settings.overrideEvents) < 0) {
    +				if (this.queueData.filesErrored > 0) {
    +					alert(this.queueData.errorMsg);
    +				}
    +			}
    +
    +			// Call the user-defined event handler
    +			if (settings.onDialogClose) settings.onDialogClose.call(this, this.queueData);
    +
    +			// Upload the files if auto is true
    +			if (settings.auto) $('#' + settings.id).uploadify('upload', '*');
    +		},
    +
    +		// Triggered once for each file added to the queue
    +		onSelect : function(file) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			// Check if a file with the same name exists in the queue
    +			var queuedFile = {};
    +			for (var n in this.queueData.files) {
    +				queuedFile = this.queueData.files[n];
    +				if (queuedFile.uploaded != true && queuedFile.name == file.name) {
    +					var replaceQueueItem = confirm('The file named "' + file.name + '" is already in the queue.\nDo you want to replace the existing item in the queue?');
    +					if (!replaceQueueItem) {
    +						this.cancelUpload(file.id);
    +						this.queueData.filesCancelled++;
    +						return false;
    +					} else {
    +						$('#' + queuedFile.id).remove();
    +						this.cancelUpload(queuedFile.id);
    +						this.queueData.filesReplaced++;
    +					}
    +				}
    +			}
    +
    +			// Get the size of the file
    +			var fileSize = Math.round(file.size / 1024);
    +			var suffix   = 'KB';
    +			if (fileSize > 1000) {
    +				fileSize = Math.round(fileSize / 1000);
    +				suffix   = 'MB';
    +			}
    +			var fileSizeParts = fileSize.toString().split('.');
    +			fileSize = fileSizeParts[0];
    +			if (fileSizeParts.length > 1) {
    +				fileSize += '.' + fileSizeParts[1].substr(0,2);
    +			}
    +			fileSize += suffix;
    +			
    +			// Truncate the filename if it's too long
    +			var fileName = file.name;
    +			if (fileName.length > 25) {
    +				fileName = fileName.substr(0,25) + '...';
    +			}
    +
    +			// Create the file data object
    +			itemData = {
    +				'fileID'     : file.id,
    +				'instanceID' : settings.id,
    +				'fileName'   : fileName,
    +				'fileSize'   : fileSize
    +			}
    +
    +			// Create the file item template
    +			if (settings.itemTemplate == false) {
    +				settings.itemTemplate = '<div id="${fileID}" class="uploadify-queue-item">\
    +					<div class="cancel">\
    +						<a href="javascript:$(\'#${instanceID}\').uploadify(\'cancel\', \'${fileID}\')">X</a>\
    +					</div>\
    +					<span class="fileName">${fileName} (${fileSize})</span><span class="data"></span>\
    +					<div class="uploadify-progress">\
    +						<div class="uploadify-progress-bar"><!--Progress Bar--></div>\
    +					</div>\
    +				</div>';
    +			}
    +
    +			// Run the default event handler
    +			if ($.inArray('onSelect', settings.overrideEvents) < 0) {
    +				
    +				// Replace the item data in the template
    +				itemHTML = settings.itemTemplate;
    +				for (var d in itemData) {
    +					itemHTML = itemHTML.replace(new RegExp('\\$\\{' + d + '\\}', 'g'), itemData[d]);
    +				}
    +
    +				// Add the file item to the queue
    +				$('#' + settings.queueID).append(itemHTML);
    +			}
    +
    +			this.queueData.queueSize += file.size;
    +			this.queueData.files[file.id] = file;
    +
    +			// Call the user-defined event handler
    +			if (settings.onSelect) settings.onSelect.apply(this, arguments);
    +		},
    +
    +		// Triggered when a file is not added to the queue
    +		onSelectError : function(file, errorCode, errorMsg) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			// Run the default event handler
    +			if ($.inArray('onSelectError', settings.overrideEvents) < 0) {
    +				switch(errorCode) {
    +					case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:
    +						if (settings.queueSizeLimit > errorMsg) {
    +							this.queueData.errorMsg += '\nThe number of files selected exceeds the remaining upload limit (' + errorMsg + ').';
    +						} else {
    +							this.queueData.errorMsg += '\nThe number of files selected exceeds the queue size limit (' + settings.queueSizeLimit + ').';
    +						}
    +						break;
    +					case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
    +						this.queueData.errorMsg += '\nThe file "' + file.name + '" exceeds the size limit (' + settings.fileSizeLimit + ').';
    +						break;
    +					case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
    +						this.queueData.errorMsg += '\nThe file "' + file.name + '" is empty.';
    +						break;
    +					case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
    +						this.queueData.errorMsg += '\nThe file "' + file.name + '" is not an accepted file type (' + settings.fileTypeDesc + ').';
    +						break;
    +				}
    +			}
    +			if (errorCode != SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED) {
    +				delete this.queueData.files[file.id];
    +			}
    +
    +			// Call the user-defined event handler
    +			if (settings.onSelectError) settings.onSelectError.apply(this, arguments);
    +		},
    +
    +		// Triggered when all the files in the queue have been processed
    +		onQueueComplete : function() {
    +			if (this.settings.onQueueComplete) this.settings.onQueueComplete.call(this, this.settings.queueData);
    +		},
    +
    +		// Triggered when a file upload successfully completes
    +		onUploadComplete : function(file) {
    +			// Load the swfupload settings
    +			var settings     = this.settings,
    +				swfuploadify = this;
    +
    +			// Check if all the files have completed uploading
    +			var stats = this.getStats();
    +			this.queueData.queueLength = stats.files_queued;
    +			if (this.queueData.uploadQueue[0] == '*') {
    +				if (this.queueData.queueLength > 0) {
    +					this.startUpload();
    +				} else {
    +					this.queueData.uploadQueue = [];
    +
    +					// Call the user-defined event handler for queue complete
    +					if (settings.onQueueComplete) settings.onQueueComplete.call(this, this.queueData);
    +				}
    +			} else {
    +				if (this.queueData.uploadQueue.length > 0) {
    +					this.startUpload(this.queueData.uploadQueue.shift());
    +				} else {
    +					this.queueData.uploadQueue = [];
    +
    +					// Call the user-defined event handler for queue complete
    +					if (settings.onQueueComplete) settings.onQueueComplete.call(this, this.queueData);
    +				}
    +			}
    +
    +			// Call the default event handler
    +			if ($.inArray('onUploadComplete', settings.overrideEvents) < 0) {
    +				if (settings.removeCompleted) {
    +					switch (file.filestatus) {
    +						case SWFUpload.FILE_STATUS.COMPLETE:
    +							setTimeout(function() { 
    +								if ($('#' + file.id)) {
    +									swfuploadify.queueData.queueSize   -= file.size;
    +									swfuploadify.queueData.queueLength -= 1;
    +									delete swfuploadify.queueData.files[file.id]
    +									$('#' + file.id).fadeOut(500, function() {
    +										$(this).remove();
    +									});
    +								}
    +							}, settings.removeTimeout * 1000);
    +							break;
    +						case SWFUpload.FILE_STATUS.ERROR:
    +							if (!settings.requeueErrors) {
    +								setTimeout(function() {
    +									if ($('#' + file.id)) {
    +										swfuploadify.queueData.queueSize   -= file.size;
    +										swfuploadify.queueData.queueLength -= 1;
    +										delete swfuploadify.queueData.files[file.id];
    +										$('#' + file.id).fadeOut(500, function() {
    +											$(this).remove();
    +										});
    +									}
    +								}, settings.removeTimeout * 1000);
    +							}
    +							break;
    +					}
    +				} else {
    +					file.uploaded = true;
    +				}
    +			}
    +
    +			// Call the user-defined event handler
    +			if (settings.onUploadComplete) settings.onUploadComplete.call(this, file);
    +		},
    +
    +		// Triggered when a file upload returns an error
    +		onUploadError : function(file, errorCode, errorMsg) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			// Set the error string
    +			var errorString = 'Error';
    +			switch(errorCode) {
    +				case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:
    +					errorString = 'HTTP Error (' + errorMsg + ')';
    +					break;
    +				case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:
    +					errorString = 'Missing Upload URL';
    +					break;
    +				case SWFUpload.UPLOAD_ERROR.IO_ERROR:
    +					errorString = 'IO Error';
    +					break;
    +				case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:
    +					errorString = 'Security Error';
    +					break;
    +				case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
    +					alert('The upload limit has been reached (' + errorMsg + ').');
    +					errorString = 'Exceeds Upload Limit';
    +					break;
    +				case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:
    +					errorString = 'Failed';
    +					break;
    +				case SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND:
    +					break;
    +				case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:
    +					errorString = 'Validation Error';
    +					break;
    +				case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
    +					errorString = 'Cancelled';
    +					this.queueData.queueSize   -= file.size;
    +					this.queueData.queueLength -= 1;
    +					if (file.status == SWFUpload.FILE_STATUS.IN_PROGRESS || $.inArray(file.id, this.queueData.uploadQueue) >= 0) {
    +						this.queueData.uploadSize -= file.size;
    +					}
    +					// Trigger the onCancel event
    +					if (settings.onCancel) settings.onCancel.call(this, file);
    +					delete this.queueData.files[file.id];
    +					break;
    +				case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
    +					errorString = 'Stopped';
    +					break;
    +			}
    +
    +			// Call the default event handler
    +			if ($.inArray('onUploadError', settings.overrideEvents) < 0) {
    +
    +				if (errorCode != SWFUpload.UPLOAD_ERROR.FILE_CANCELLED && errorCode != SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED) {
    +					$('#' + file.id).addClass('uploadify-error');
    +				}
    +
    +				// Reset the progress bar
    +				$('#' + file.id).find('.uploadify-progress-bar').css('width','1px');
    +
    +				// Add the error message to the queue item
    +				if (errorCode != SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND && file.status != SWFUpload.FILE_STATUS.COMPLETE) {
    +					$('#' + file.id).find('.data').html(' - ' + errorString);
    +				}
    +			}
    +
    +			var stats = this.getStats();
    +			this.queueData.uploadsErrored = stats.upload_errors;
    +
    +			// Call the user-defined event handler
    +			if (settings.onUploadError) settings.onUploadError.call(this, file, errorCode, errorMsg, errorString);
    +		},
    +
    +		// Triggered periodically during a file upload
    +		onUploadProgress : function(file, fileBytesLoaded, fileTotalBytes) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			// Setup all the variables
    +			var timer            = new Date();
    +			var newTime          = timer.getTime();
    +			var lapsedTime       = newTime - this.timer;
    +			if (lapsedTime > 500) {
    +				this.timer = newTime;
    +			}
    +			var lapsedBytes      = fileBytesLoaded - this.bytesLoaded;
    +			this.bytesLoaded     = fileBytesLoaded;
    +			var queueBytesLoaded = this.queueData.queueBytesUploaded + fileBytesLoaded;
    +			var percentage       = Math.round(fileBytesLoaded / fileTotalBytes * 100);
    +			
    +			// Calculate the average speed
    +			var suffix = 'KB/s';
    +			var mbs = 0;
    +			var kbs = (lapsedBytes / 1024) / (lapsedTime / 1000);
    +			    kbs = Math.floor(kbs * 10) / 10;
    +			if (this.queueData.averageSpeed > 0) {
    +				this.queueData.averageSpeed = Math.floor((this.queueData.averageSpeed + kbs) / 2);
    +			} else {
    +				this.queueData.averageSpeed = Math.floor(kbs);
    +			}
    +			if (kbs > 1000) {
    +				mbs = (kbs * .001);
    +				this.queueData.averageSpeed = Math.floor(mbs);
    +				suffix = 'MB/s';
    +			}
    +			
    +			// Call the default event handler
    +			if ($.inArray('onUploadProgress', settings.overrideEvents) < 0) {
    +				if (settings.progressData == 'percentage') {
    +					$('#' + file.id).find('.data').html(' - ' + percentage + '%');
    +				} else if (settings.progressData == 'speed' && lapsedTime > 500) {
    +					$('#' + file.id).find('.data').html(' - ' + this.queueData.averageSpeed + suffix);
    +				}
    +				$('#' + file.id).find('.uploadify-progress-bar').css('width', percentage + '%');
    +			}
    +
    +			// Call the user-defined event handler
    +			if (settings.onUploadProgress) settings.onUploadProgress.call(this, file, fileBytesLoaded, fileTotalBytes, queueBytesLoaded, this.queueData.uploadSize);
    +		},
    +
    +		// Triggered right before a file is uploaded
    +		onUploadStart : function(file) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +
    +			var timer        = new Date();
    +			this.timer       = timer.getTime();
    +			this.bytesLoaded = 0;
    +			if (this.queueData.uploadQueue.length == 0) {
    +				this.queueData.uploadSize = file.size;
    +			}
    +			if (settings.checkExisting) {
    +				$.ajax({
    +					type    : 'POST',
    +					async   : false,
    +					url     : settings.checkExisting,
    +					data    : {filename: file.name},
    +					success : function(data) {
    +						if (data == 1) {
    +							var overwrite = confirm('A file with the name "' + file.name + '" already exists on the server.\nWould you like to replace the existing file?');
    +							if (!overwrite) {
    +								this.cancelUpload(file.id);
    +								$('#' + file.id).remove();
    +								if (this.queueData.uploadQueue.length > 0 && this.queueData.queueLength > 0) {
    +									if (this.queueData.uploadQueue[0] == '*') {
    +										this.startUpload();
    +									} else {
    +										this.startUpload(this.queueData.uploadQueue.shift());
    +									}
    +								}
    +							}
    +						}
    +					}
    +				});
    +			}
    +
    +			// Call the user-defined event handler
    +			if (settings.onUploadStart) settings.onUploadStart.call(this, file); 
    +		},
    +
    +		// Triggered when a file upload returns a successful code
    +		onUploadSuccess : function(file, data, response) {
    +			// Load the swfupload settings
    +			var settings = this.settings;
    +			var stats    = this.getStats();
    +			this.queueData.uploadsSuccessful = stats.successful_uploads;
    +			this.queueData.queueBytesUploaded += file.size;
    +
    +			// Call the default event handler
    +			if ($.inArray('onUploadSuccess', settings.overrideEvents) < 0) {
    +				$('#' + file.id).find('.data').html(' - Complete');
    +			}
    +
    +			// Call the user-defined event handler
    +			if (settings.onUploadSuccess) settings.onUploadSuccess.call(this, file, data, response); 
    +		}
    +
    +	}
    +
    +	$.fn.uploadify = function(method) {
    +
    +		if (methods[method]) {
    +			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    +		} else if (typeof method === 'object' || !method) {
    +			return methods.init.apply(this, arguments);
    +		} else {
    +			$.error('The method ' + method + ' does not exist in $.uploadify');
    +		}
    +
    +	}
    +
    +})($);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/uploadify/jquery.uploadify.min.js b/src/main/webapp/plug-in/uploadify/jquery.uploadify.min.js
    new file mode 100644
    index 00000000..cfc0c069
    --- /dev/null
    +++ b/src/main/webapp/plug-in/uploadify/jquery.uploadify.min.js
    @@ -0,0 +1,16 @@
    +/*
    +Uploadify v3.2
    +Copyright (c) 2012 Reactive Apps, Ronnie Garcia
    +Released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
    +
    +SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
    +mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,  http://www.vinterwebb.se/
    +SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilz茅n and Mammon Media and is released under the MIT License:
    +http://www.opensource.org/licenses/mit-license.php
    +SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
    +http://www.opensource.org/licenses/mit-license.php
    +
    +SWFObject v2.2 <http://code.google.com/p/swfobject/> 
    +is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
    +*/
    +;var swfobject=function(){var aq="undefined",aD="object",ab="Shockwave Flash",X="ShockwaveFlash.ShockwaveFlash",aE="application/x-shockwave-flash",ac="SWFObjectExprInst",ax="onreadystatechange",af=window,aL=document,aB=navigator,aa=false,Z=[aN],aG=[],ag=[],al=[],aJ,ad,ap,at,ak=false,aU=false,aH,an,aI=true,ah=function(){var a=typeof aL.getElementById!=aq&&typeof aL.getElementsByTagName!=aq&&typeof aL.createElement!=aq,e=aB.userAgent.toLowerCase(),c=aB.platform.toLowerCase(),h=c?/win/.test(c):/win/.test(e),j=c?/mac/.test(c):/mac/.test(e),g=/webkit/.test(e)?parseFloat(e.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,d=!+"\v1",f=[0,0,0],k=null;if(typeof aB.plugins!=aq&&typeof aB.plugins[ab]==aD){k=aB.plugins[ab].description;if(k&&!(typeof aB.mimeTypes!=aq&&aB.mimeTypes[aE]&&!aB.mimeTypes[aE].enabledPlugin)){aa=true;d=false;k=k.replace(/^.*\s+(\S+\s+\S+$)/,"$1");f[0]=parseInt(k.replace(/^(.*)\..*$/,"$1"),10);f[1]=parseInt(k.replace(/^.*\.(.*)\s.*$/,"$1"),10);f[2]=/[a-zA-Z]/.test(k)?parseInt(k.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0;}}else{if(typeof af.ActiveXObject!=aq){try{var i=new ActiveXObject(X);if(i){k=i.GetVariable("$version");if(k){d=true;k=k.split(" ")[1].split(",");f=[parseInt(k[0],10),parseInt(k[1],10),parseInt(k[2],10)];}}}catch(b){}}}return{w3:a,pv:f,wk:g,ie:d,win:h,mac:j};}(),aK=function(){if(!ah.w3){return;}if((typeof aL.readyState!=aq&&aL.readyState=="complete")||(typeof aL.readyState==aq&&(aL.getElementsByTagName("body")[0]||aL.body))){aP();}if(!ak){if(typeof aL.addEventListener!=aq){aL.addEventListener("DOMContentLoaded",aP,false);}if(ah.ie&&ah.win){aL.attachEvent(ax,function(){if(aL.readyState=="complete"){aL.detachEvent(ax,arguments.callee);aP();}});if(af==top){(function(){if(ak){return;}try{aL.documentElement.doScroll("left");}catch(a){setTimeout(arguments.callee,0);return;}aP();})();}}if(ah.wk){(function(){if(ak){return;}if(!/loaded|complete/.test(aL.readyState)){setTimeout(arguments.callee,0);return;}aP();})();}aC(aP);}}();function aP(){if(ak){return;}try{var b=aL.getElementsByTagName("body")[0].appendChild(ar("span"));b.parentNode.removeChild(b);}catch(a){return;}ak=true;var d=Z.length;for(var c=0;c<d;c++){Z[c]();}}function aj(a){if(ak){a();}else{Z[Z.length]=a;}}function aC(a){if(typeof af.addEventListener!=aq){af.addEventListener("load",a,false);}else{if(typeof aL.addEventListener!=aq){aL.addEventListener("load",a,false);}else{if(typeof af.attachEvent!=aq){aM(af,"onload",a);}else{if(typeof af.onload=="function"){var b=af.onload;af.onload=function(){b();a();};}else{af.onload=a;}}}}}function aN(){if(aa){Y();}else{am();}}function Y(){var d=aL.getElementsByTagName("body")[0];var b=ar(aD);b.setAttribute("type",aE);var a=d.appendChild(b);if(a){var c=0;(function(){if(typeof a.GetVariable!=aq){var e=a.GetVariable("$version");if(e){e=e.split(" ")[1].split(",");ah.pv=[parseInt(e[0],10),parseInt(e[1],10),parseInt(e[2],10)];}}else{if(c<10){c++;setTimeout(arguments.callee,10);return;}}d.removeChild(b);a=null;am();})();}else{am();}}function am(){var g=aG.length;if(g>0){for(var h=0;h<g;h++){var c=aG[h].id;var l=aG[h].callbackFn;var a={success:false,id:c};if(ah.pv[0]>0){var i=aS(c);if(i){if(ao(aG[h].swfVersion)&&!(ah.wk&&ah.wk<312)){ay(c,true);if(l){a.success=true;a.ref=av(c);l(a);}}else{if(aG[h].expressInstall&&au()){var e={};e.data=aG[h].expressInstall;e.width=i.getAttribute("width")||"0";e.height=i.getAttribute("height")||"0";if(i.getAttribute("class")){e.styleclass=i.getAttribute("class");}if(i.getAttribute("align")){e.align=i.getAttribute("align");}var f={};var d=i.getElementsByTagName("param");var k=d.length;for(var j=0;j<k;j++){if(d[j].getAttribute("name").toLowerCase()!="movie"){f[d[j].getAttribute("name")]=d[j].getAttribute("value");}}ae(e,f,c,l);}else{aF(i);if(l){l(a);}}}}}else{ay(c,true);if(l){var b=av(c);if(b&&typeof b.SetVariable!=aq){a.success=true;a.ref=b;}l(a);}}}}}function av(b){var d=null;var c=aS(b);if(c&&c.nodeName=="OBJECT"){if(typeof c.SetVariable!=aq){d=c;}else{var a=c.getElementsByTagName(aD)[0];if(a){d=a;}}}return d;}function au(){return !aU&&ao("6.0.65")&&(ah.win||ah.mac)&&!(ah.wk&&ah.wk<312);}function ae(f,d,h,e){aU=true;ap=e||null;at={success:false,id:h};var a=aS(h);if(a){if(a.nodeName=="OBJECT"){aJ=aO(a);ad=null;}else{aJ=a;ad=h;}f.id=ac;if(typeof f.width==aq||(!/%$/.test(f.width)&&parseInt(f.width,10)<310)){f.width="310";}if(typeof f.height==aq||(!/%$/.test(f.height)&&parseInt(f.height,10)<137)){f.height="137";}aL.title=aL.title.slice(0,47)+" - Flash Player Installation";var b=ah.ie&&ah.win?"ActiveX":"PlugIn",c="MMredirectURL="+af.location.toString().replace(/&/g,"%26")+"&MMplayerType="+b+"&MMdoctitle="+aL.title;if(typeof d.flashvars!=aq){d.flashvars+="&"+c;}else{d.flashvars=c;}if(ah.ie&&ah.win&&a.readyState!=4){var g=ar("div");h+="SWFObjectNew";g.setAttribute("id",h);a.parentNode.insertBefore(g,a);a.style.display="none";(function(){if(a.readyState==4){a.parentNode.removeChild(a);}else{setTimeout(arguments.callee,10);}})();}aA(f,d,h);}}function aF(a){if(ah.ie&&ah.win&&a.readyState!=4){var b=ar("div");a.parentNode.insertBefore(b,a);b.parentNode.replaceChild(aO(a),b);a.style.display="none";(function(){if(a.readyState==4){a.parentNode.removeChild(a);}else{setTimeout(arguments.callee,10);}})();}else{a.parentNode.replaceChild(aO(a),a);}}function aO(b){var d=ar("div");if(ah.win&&ah.ie){d.innerHTML=b.innerHTML;}else{var e=b.getElementsByTagName(aD)[0];if(e){var a=e.childNodes;if(a){var f=a.length;for(var c=0;c<f;c++){if(!(a[c].nodeType==1&&a[c].nodeName=="PARAM")&&!(a[c].nodeType==8)){d.appendChild(a[c].cloneNode(true));}}}}}return d;}function aA(e,g,c){var d,a=aS(c);if(ah.wk&&ah.wk<312){return d;}if(a){if(typeof e.id==aq){e.id=c;}if(ah.ie&&ah.win){var f="";for(var i in e){if(e[i]!=Object.prototype[i]){if(i.toLowerCase()=="data"){g.movie=e[i];}else{if(i.toLowerCase()=="styleclass"){f+=' class="'+e[i]+'"';}else{if(i.toLowerCase()!="classid"){f+=" "+i+'="'+e[i]+'"';}}}}}var h="";for(var j in g){if(g[j]!=Object.prototype[j]){h+='<param name="'+j+'" value="'+g[j]+'" />';}}a.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+f+">"+h+"</object>";ag[ag.length]=e.id;d=aS(e.id);}else{var b=ar(aD);b.setAttribute("type",aE);for(var k in e){if(e[k]!=Object.prototype[k]){if(k.toLowerCase()=="styleclass"){b.setAttribute("class",e[k]);}else{if(k.toLowerCase()!="classid"){b.setAttribute(k,e[k]);}}}}for(var l in g){if(g[l]!=Object.prototype[l]&&l.toLowerCase()!="movie"){aQ(b,l,g[l]);}}a.parentNode.replaceChild(b,a);d=b;}}return d;}function aQ(b,d,c){var a=ar("param");a.setAttribute("name",d);a.setAttribute("value",c);b.appendChild(a);}function aw(a){var b=aS(a);if(b&&b.nodeName=="OBJECT"){if(ah.ie&&ah.win){b.style.display="none";(function(){if(b.readyState==4){aT(a);}else{setTimeout(arguments.callee,10);}})();}else{b.parentNode.removeChild(b);}}}function aT(a){var b=aS(a);if(b){for(var c in b){if(typeof b[c]=="function"){b[c]=null;}}b.parentNode.removeChild(b);}}function aS(a){var c=null;try{c=aL.getElementById(a);}catch(b){}return c;}function ar(a){return aL.createElement(a);}function aM(a,c,b){a.attachEvent(c,b);al[al.length]=[a,c,b];}function ao(a){var b=ah.pv,c=a.split(".");c[0]=parseInt(c[0],10);c[1]=parseInt(c[1],10)||0;c[2]=parseInt(c[2],10)||0;return(b[0]>c[0]||(b[0]==c[0]&&b[1]>c[1])||(b[0]==c[0]&&b[1]==c[1]&&b[2]>=c[2]))?true:false;}function az(b,f,a,c){if(ah.ie&&ah.mac){return;}var e=aL.getElementsByTagName("head")[0];if(!e){return;}var g=(a&&typeof a=="string")?a:"screen";if(c){aH=null;an=null;}if(!aH||an!=g){var d=ar("style");d.setAttribute("type","text/css");d.setAttribute("media",g);aH=e.appendChild(d);if(ah.ie&&ah.win&&typeof aL.styleSheets!=aq&&aL.styleSheets.length>0){aH=aL.styleSheets[aL.styleSheets.length-1];}an=g;}if(ah.ie&&ah.win){if(aH&&typeof aH.addRule==aD){aH.addRule(b,f);}}else{if(aH&&typeof aL.createTextNode!=aq){aH.appendChild(aL.createTextNode(b+" {"+f+"}"));}}}function ay(a,c){if(!aI){return;}var b=c?"visible":"hidden";if(ak&&aS(a)){aS(a).style.visibility=b;}else{az("#"+a,"visibility:"+b);}}function ai(b){var a=/[\\\"<>\.;]/;var c=a.exec(b)!=null;return c&&typeof encodeURIComponent!=aq?encodeURIComponent(b):b;}var aR=function(){if(ah.ie&&ah.win){window.attachEvent("onunload",function(){var a=al.length;for(var b=0;b<a;b++){al[b][0].detachEvent(al[b][1],al[b][2]);}var d=ag.length;for(var c=0;c<d;c++){aw(ag[c]);}for(var e in ah){ah[e]=null;}ah=null;for(var f in swfobject){swfobject[f]=null;}swfobject=null;});}}();return{registerObject:function(a,e,c,b){if(ah.w3&&a&&e){var d={};d.id=a;d.swfVersion=e;d.expressInstall=c;d.callbackFn=b;aG[aG.length]=d;ay(a,false);}else{if(b){b({success:false,id:a});}}},getObjectById:function(a){if(ah.w3){return av(a);}},embedSWF:function(k,e,h,f,c,a,b,i,g,j){var d={success:false,id:e};if(ah.w3&&!(ah.wk&&ah.wk<312)&&k&&e&&h&&f&&c){ay(e,false);aj(function(){h+="";f+="";var q={};if(g&&typeof g===aD){for(var o in g){q[o]=g[o];}}q.data=k;q.width=h;q.height=f;var n={};if(i&&typeof i===aD){for(var p in i){n[p]=i[p];}}if(b&&typeof b===aD){for(var l in b){if(typeof n.flashvars!=aq){n.flashvars+="&"+l+"="+b[l];}else{n.flashvars=l+"="+b[l];}}}if(ao(c)){var m=aA(q,n,e);if(q.id==e){ay(e,true);}d.success=true;d.ref=m;}else{if(a&&au()){q.data=a;ae(q,n,e,j);return;}else{ay(e,true);}}if(j){j(d);}});}else{if(j){j(d);}}},switchOffAutoHideShow:function(){aI=false;},ua:ah,getFlashPlayerVersion:function(){return{major:ah.pv[0],minor:ah.pv[1],release:ah.pv[2]};},hasFlashPlayerVersion:ao,createSWF:function(a,b,c){if(ah.w3){return aA(a,b,c);}else{return undefined;}},showExpressInstall:function(b,a,d,c){if(ah.w3&&au()){ae(b,a,d,c);}},removeSWF:function(a){if(ah.w3){aw(a);}},createCSS:function(b,a,c,d){if(ah.w3){az(b,a,c,d);}},addDomLoadEvent:aj,addLoadEvent:aC,getQueryParamValue:function(b){var a=aL.location.search||aL.location.hash;if(a){if(/\?/.test(a)){a=a.split("?")[1];}if(b==null){return ai(a);}var c=a.split("&");for(var d=0;d<c.length;d++){if(c[d].substring(0,c[d].indexOf("="))==b){return ai(c[d].substring((c[d].indexOf("=")+1)));}}}return"";},expressInstallCallback:function(){if(aU){var a=aS(ac);if(a&&aJ){a.parentNode.replaceChild(aJ,a);if(ad){ay(ad,true);if(ah.ie&&ah.win){aJ.style.display="block";}}if(ap){ap(at);}}aU=false;}}};}();var SWFUpload;if(SWFUpload==undefined){SWFUpload=function(b){this.initSWFUpload(b);};}SWFUpload.prototype.initSWFUpload=function(c){try{this.customSettings={};this.settings=c;this.eventQueue=[];this.movieName="SWFUpload_"+SWFUpload.movieCount++;this.movieElement=null;SWFUpload.instances[this.movieName]=this;this.initSettings();this.loadFlash();this.displayDebugInfo();}catch(d){delete SWFUpload.instances[this.movieName];throw d;}};SWFUpload.instances={};SWFUpload.movieCount=0;SWFUpload.version="2.2.0 2009-03-25";SWFUpload.QUEUE_ERROR={QUEUE_LIMIT_EXCEEDED:-100,FILE_EXCEEDS_SIZE_LIMIT:-110,ZERO_BYTE_FILE:-120,INVALID_FILETYPE:-130};SWFUpload.UPLOAD_ERROR={HTTP_ERROR:-200,MISSING_UPLOAD_URL:-210,IO_ERROR:-220,SECURITY_ERROR:-230,UPLOAD_LIMIT_EXCEEDED:-240,UPLOAD_FAILED:-250,SPECIFIED_FILE_ID_NOT_FOUND:-260,FILE_VALIDATION_FAILED:-270,FILE_CANCELLED:-280,UPLOAD_STOPPED:-290};SWFUpload.FILE_STATUS={QUEUED:-1,IN_PROGRESS:-2,ERROR:-3,COMPLETE:-4,CANCELLED:-5};SWFUpload.BUTTON_ACTION={SELECT_FILE:-100,SELECT_FILES:-110,START_UPLOAD:-120};SWFUpload.CURSOR={ARROW:-1,HAND:-2};SWFUpload.WINDOW_MODE={WINDOW:"window",TRANSPARENT:"transparent",OPAQUE:"opaque"};SWFUpload.completeURL=function(e){if(typeof(e)!=="string"||e.match(/^https?:\/\//i)||e.match(/^\//)){return e;}var f=window.location.protocol+"//"+window.location.hostname+(window.location.port?":"+window.location.port:"");var d=window.location.pathname.lastIndexOf("/");if(d<=0){path="/";}else{path=window.location.pathname.substr(0,d)+"/";}return path+e;};SWFUpload.prototype.initSettings=function(){this.ensureDefault=function(c,d){this.settings[c]=(this.settings[c]==undefined)?d:this.settings[c];};this.ensureDefault("upload_url","");this.ensureDefault("preserve_relative_urls",false);this.ensureDefault("file_post_name","Filedata");this.ensureDefault("post_params",{});this.ensureDefault("use_query_string",false);this.ensureDefault("requeue_on_error",false);this.ensureDefault("http_success",[]);this.ensureDefault("assume_success_timeout",0);this.ensureDefault("file_types","*.*");this.ensureDefault("file_types_description","All Files");this.ensureDefault("file_size_limit",0);this.ensureDefault("file_upload_limit",0);this.ensureDefault("file_queue_limit",0);this.ensureDefault("flash_url","swfupload.swf");this.ensureDefault("prevent_swf_caching",true);this.ensureDefault("button_image_url","");this.ensureDefault("button_width",1);this.ensureDefault("button_height",1);this.ensureDefault("button_text","");this.ensureDefault("button_text_style","color: #000000; font-size: 16pt;");this.ensureDefault("button_text_top_padding",0);this.ensureDefault("button_text_left_padding",0);this.ensureDefault("button_action",SWFUpload.BUTTON_ACTION.SELECT_FILES);this.ensureDefault("button_disabled",false);this.ensureDefault("button_placeholder_id","");this.ensureDefault("button_placeholder",null);this.ensureDefault("button_cursor",SWFUpload.CURSOR.ARROW);this.ensureDefault("button_window_mode",SWFUpload.WINDOW_MODE.WINDOW);this.ensureDefault("debug",false);this.settings.debug_enabled=this.settings.debug;this.settings.return_upload_start_handler=this.returnUploadStart;this.ensureDefault("swfupload_loaded_handler",null);this.ensureDefault("file_dialog_start_handler",null);this.ensureDefault("file_queued_handler",null);this.ensureDefault("file_queue_error_handler",null);this.ensureDefault("file_dialog_complete_handler",null);this.ensureDefault("upload_start_handler",null);this.ensureDefault("upload_progress_handler",null);this.ensureDefault("upload_error_handler",null);this.ensureDefault("upload_success_handler",null);this.ensureDefault("upload_complete_handler",null);this.ensureDefault("debug_handler",this.debugMessage);this.ensureDefault("custom_settings",{});this.customSettings=this.settings.custom_settings;if(!!this.settings.prevent_swf_caching){this.settings.flash_url=this.settings.flash_url+(this.settings.flash_url.indexOf("?")<0?"?":"&")+"preventswfcaching="+new Date().getTime();}if(!this.settings.preserve_relative_urls){this.settings.upload_url=SWFUpload.completeURL(this.settings.upload_url);this.settings.button_image_url=SWFUpload.completeURL(this.settings.button_image_url);}delete this.ensureDefault;};SWFUpload.prototype.loadFlash=function(){var d,c;if(document.getElementById(this.movieName)!==null){throw"ID "+this.movieName+" is already in use. The Flash Object could not be added";}d=document.getElementById(this.settings.button_placeholder_id)||this.settings.button_placeholder;if(d==undefined){throw"Could not find the placeholder element: "+this.settings.button_placeholder_id;}c=document.createElement("div");c.innerHTML=this.getFlashHTML();d.parentNode.replaceChild(c.firstChild,d);if(window[this.movieName]==undefined){window[this.movieName]=this.getMovieElement();}};SWFUpload.prototype.getFlashHTML=function(){return['<object id="',this.movieName,'" type="application/x-shockwave-flash" data="',this.settings.flash_url,'" width="',this.settings.button_width,'" height="',this.settings.button_height,'" class="swfupload">','<param name="wmode" value="',this.settings.button_window_mode,'" />','<param name="movie" value="',this.settings.flash_url,'" />','<param name="quality" value="high" />','<param name="menu" value="false" />','<param name="allowScriptAccess" value="always" />','<param name="flashvars" value="'+this.getFlashVars()+'" />',"</object>"].join("");};SWFUpload.prototype.getFlashVars=function(){var c=this.buildParamString();var d=this.settings.http_success.join(",");return["movieName=",encodeURIComponent(this.movieName),"&amp;uploadURL=",encodeURIComponent(this.settings.upload_url),"&amp;useQueryString=",encodeURIComponent(this.settings.use_query_string),"&amp;requeueOnError=",encodeURIComponent(this.settings.requeue_on_error),"&amp;httpSuccess=",encodeURIComponent(d),"&amp;assumeSuccessTimeout=",encodeURIComponent(this.settings.assume_success_timeout),"&amp;params=",encodeURIComponent(c),"&amp;filePostName=",encodeURIComponent(this.settings.file_post_name),"&amp;fileTypes=",encodeURIComponent(this.settings.file_types),"&amp;fileTypesDescription=",encodeURIComponent(this.settings.file_types_description),"&amp;fileSizeLimit=",encodeURIComponent(this.settings.file_size_limit),"&amp;fileUploadLimit=",encodeURIComponent(this.settings.file_upload_limit),"&amp;fileQueueLimit=",encodeURIComponent(this.settings.file_queue_limit),"&amp;debugEnabled=",encodeURIComponent(this.settings.debug_enabled),"&amp;buttonImageURL=",encodeURIComponent(this.settings.button_image_url),"&amp;buttonWidth=",encodeURIComponent(this.settings.button_width),"&amp;buttonHeight=",encodeURIComponent(this.settings.button_height),"&amp;buttonText=",encodeURIComponent(this.settings.button_text),"&amp;buttonTextTopPadding=",encodeURIComponent(this.settings.button_text_top_padding),"&amp;buttonTextLeftPadding=",encodeURIComponent(this.settings.button_text_left_padding),"&amp;buttonTextStyle=",encodeURIComponent(this.settings.button_text_style),"&amp;buttonAction=",encodeURIComponent(this.settings.button_action),"&amp;buttonDisabled=",encodeURIComponent(this.settings.button_disabled),"&amp;buttonCursor=",encodeURIComponent(this.settings.button_cursor)].join("");};SWFUpload.prototype.getMovieElement=function(){if(this.movieElement==undefined){this.movieElement=document.getElementById(this.movieName);}if(this.movieElement===null){throw"Could not find Flash element";}return this.movieElement;};SWFUpload.prototype.buildParamString=function(){var f=this.settings.post_params;var d=[];if(typeof(f)==="object"){for(var e in f){if(f.hasOwnProperty(e)){d.push(encodeURIComponent(e.toString())+"="+encodeURIComponent(f[e].toString()));}}}return d.join("&amp;");};SWFUpload.prototype.destroy=function(){try{this.cancelUpload(null,false);var g=null;g=this.getMovieElement();if(g&&typeof(g.CallFunction)==="unknown"){for(var j in g){try{if(typeof(g[j])==="function"){g[j]=null;}}catch(h){}}try{g.parentNode.removeChild(g);}catch(f){}}window[this.movieName]=null;SWFUpload.instances[this.movieName]=null;delete SWFUpload.instances[this.movieName];this.movieElement=null;this.settings=null;this.customSettings=null;this.eventQueue=null;this.movieName=null;return true;}catch(i){return false;}};SWFUpload.prototype.displayDebugInfo=function(){this.debug(["---SWFUpload Instance Info---\n","Version: ",SWFUpload.version,"\n","Movie Name: ",this.movieName,"\n","Settings:\n","\t","upload_url:               ",this.settings.upload_url,"\n","\t","flash_url:                ",this.settings.flash_url,"\n","\t","use_query_string:         ",this.settings.use_query_string.toString(),"\n","\t","requeue_on_error:         ",this.settings.requeue_on_error.toString(),"\n","\t","http_success:             ",this.settings.http_success.join(", "),"\n","\t","assume_success_timeout:   ",this.settings.assume_success_timeout,"\n","\t","file_post_name:           ",this.settings.file_post_name,"\n","\t","post_params:              ",this.settings.post_params.toString(),"\n","\t","file_types:               ",this.settings.file_types,"\n","\t","file_types_description:   ",this.settings.file_types_description,"\n","\t","file_size_limit:          ",this.settings.file_size_limit,"\n","\t","file_upload_limit:        ",this.settings.file_upload_limit,"\n","\t","file_queue_limit:         ",this.settings.file_queue_limit,"\n","\t","debug:                    ",this.settings.debug.toString(),"\n","\t","prevent_swf_caching:      ",this.settings.prevent_swf_caching.toString(),"\n","\t","button_placeholder_id:    ",this.settings.button_placeholder_id.toString(),"\n","\t","button_placeholder:       ",(this.settings.button_placeholder?"Set":"Not Set"),"\n","\t","button_image_url:         ",this.settings.button_image_url.toString(),"\n","\t","button_width:             ",this.settings.button_width.toString(),"\n","\t","button_height:            ",this.settings.button_height.toString(),"\n","\t","button_text:              ",this.settings.button_text.toString(),"\n","\t","button_text_style:        ",this.settings.button_text_style.toString(),"\n","\t","button_text_top_padding:  ",this.settings.button_text_top_padding.toString(),"\n","\t","button_text_left_padding: ",this.settings.button_text_left_padding.toString(),"\n","\t","button_action:            ",this.settings.button_action.toString(),"\n","\t","button_disabled:          ",this.settings.button_disabled.toString(),"\n","\t","custom_settings:          ",this.settings.custom_settings.toString(),"\n","Event Handlers:\n","\t","swfupload_loaded_handler assigned:  ",(typeof this.settings.swfupload_loaded_handler==="function").toString(),"\n","\t","file_dialog_start_handler assigned: ",(typeof this.settings.file_dialog_start_handler==="function").toString(),"\n","\t","file_queued_handler assigned:       ",(typeof this.settings.file_queued_handler==="function").toString(),"\n","\t","file_queue_error_handler assigned:  ",(typeof this.settings.file_queue_error_handler==="function").toString(),"\n","\t","upload_start_handler assigned:      ",(typeof this.settings.upload_start_handler==="function").toString(),"\n","\t","upload_progress_handler assigned:   ",(typeof this.settings.upload_progress_handler==="function").toString(),"\n","\t","upload_error_handler assigned:      ",(typeof this.settings.upload_error_handler==="function").toString(),"\n","\t","upload_success_handler assigned:    ",(typeof this.settings.upload_success_handler==="function").toString(),"\n","\t","upload_complete_handler assigned:   ",(typeof this.settings.upload_complete_handler==="function").toString(),"\n","\t","debug_handler assigned:             ",(typeof this.settings.debug_handler==="function").toString(),"\n"].join(""));};SWFUpload.prototype.addSetting=function(d,f,e){if(f==undefined){return(this.settings[d]=e);}else{return(this.settings[d]=f);}};SWFUpload.prototype.getSetting=function(b){if(this.settings[b]!=undefined){return this.settings[b];}return"";};SWFUpload.prototype.callFlash=function(functionName,argumentArray){argumentArray=argumentArray||[];var movieElement=this.getMovieElement();var returnValue,returnString;try{returnString=movieElement.CallFunction('<invoke name="'+functionName+'" returntype="javascript">'+__flash__argumentsToXML(argumentArray,0)+"</invoke>");returnValue=eval(returnString);}catch(ex){throw"Call to "+functionName+" failed";}if(returnValue!=undefined&&typeof returnValue.post==="object"){returnValue=this.unescapeFilePostParams(returnValue);}return returnValue;};SWFUpload.prototype.selectFile=function(){this.callFlash("SelectFile");};SWFUpload.prototype.selectFiles=function(){this.callFlash("SelectFiles");};SWFUpload.prototype.startUpload=function(b){this.callFlash("StartUpload",[b]);};SWFUpload.prototype.cancelUpload=function(d,c){if(c!==false){c=true;}this.callFlash("CancelUpload",[d,c]);};SWFUpload.prototype.stopUpload=function(){this.callFlash("StopUpload");};SWFUpload.prototype.getStats=function(){return this.callFlash("GetStats");};SWFUpload.prototype.setStats=function(b){this.callFlash("SetStats",[b]);};SWFUpload.prototype.getFile=function(b){if(typeof(b)==="number"){return this.callFlash("GetFileByIndex",[b]);}else{return this.callFlash("GetFile",[b]);}};SWFUpload.prototype.addFileParam=function(e,d,f){return this.callFlash("AddFileParam",[e,d,f]);};SWFUpload.prototype.removeFileParam=function(d,c){this.callFlash("RemoveFileParam",[d,c]);};SWFUpload.prototype.setUploadURL=function(b){this.settings.upload_url=b.toString();this.callFlash("SetUploadURL",[b]);};SWFUpload.prototype.setPostParams=function(b){this.settings.post_params=b;this.callFlash("SetPostParams",[b]);};SWFUpload.prototype.addPostParam=function(d,c){this.settings.post_params[d]=c;this.callFlash("SetPostParams",[this.settings.post_params]);};SWFUpload.prototype.removePostParam=function(b){delete this.settings.post_params[b];this.callFlash("SetPostParams",[this.settings.post_params]);};SWFUpload.prototype.setFileTypes=function(d,c){this.settings.file_types=d;this.settings.file_types_description=c;this.callFlash("SetFileTypes",[d,c]);};SWFUpload.prototype.setFileSizeLimit=function(b){this.settings.file_size_limit=b;this.callFlash("SetFileSizeLimit",[b]);};SWFUpload.prototype.setFileUploadLimit=function(b){this.settings.file_upload_limit=b;this.callFlash("SetFileUploadLimit",[b]);};SWFUpload.prototype.setFileQueueLimit=function(b){this.settings.file_queue_limit=b;this.callFlash("SetFileQueueLimit",[b]);};SWFUpload.prototype.setFilePostName=function(b){this.settings.file_post_name=b;this.callFlash("SetFilePostName",[b]);};SWFUpload.prototype.setUseQueryString=function(b){this.settings.use_query_string=b;this.callFlash("SetUseQueryString",[b]);};SWFUpload.prototype.setRequeueOnError=function(b){this.settings.requeue_on_error=b;this.callFlash("SetRequeueOnError",[b]);};SWFUpload.prototype.setHTTPSuccess=function(b){if(typeof b==="string"){b=b.replace(" ","").split(",");}this.settings.http_success=b;this.callFlash("SetHTTPSuccess",[b]);};SWFUpload.prototype.setAssumeSuccessTimeout=function(b){this.settings.assume_success_timeout=b;this.callFlash("SetAssumeSuccessTimeout",[b]);};SWFUpload.prototype.setDebugEnabled=function(b){this.settings.debug_enabled=b;this.callFlash("SetDebugEnabled",[b]);};SWFUpload.prototype.setButtonImageURL=function(b){if(b==undefined){b="";}this.settings.button_image_url=b;this.callFlash("SetButtonImageURL",[b]);};SWFUpload.prototype.setButtonDimensions=function(f,e){this.settings.button_width=f;this.settings.button_height=e;var d=this.getMovieElement();if(d!=undefined){d.style.width=f+"px";d.style.height=e+"px";}this.callFlash("SetButtonDimensions",[f,e]);};SWFUpload.prototype.setButtonText=function(b){this.settings.button_text=b;this.callFlash("SetButtonText",[b]);};SWFUpload.prototype.setButtonTextPadding=function(c,d){this.settings.button_text_top_padding=d;this.settings.button_text_left_padding=c;this.callFlash("SetButtonTextPadding",[c,d]);};SWFUpload.prototype.setButtonTextStyle=function(b){this.settings.button_text_style=b;this.callFlash("SetButtonTextStyle",[b]);};SWFUpload.prototype.setButtonDisabled=function(b){this.settings.button_disabled=b;this.callFlash("SetButtonDisabled",[b]);};SWFUpload.prototype.setButtonAction=function(b){this.settings.button_action=b;this.callFlash("SetButtonAction",[b]);};SWFUpload.prototype.setButtonCursor=function(b){this.settings.button_cursor=b;this.callFlash("SetButtonCursor",[b]);};SWFUpload.prototype.queueEvent=function(d,f){if(f==undefined){f=[];}else{if(!(f instanceof Array)){f=[f];}}var e=this;if(typeof this.settings[d]==="function"){this.eventQueue.push(function(){this.settings[d].apply(this,f);});setTimeout(function(){e.executeNextEvent();},0);}else{if(this.settings[d]!==null){throw"Event handler "+d+" is unknown or is not a function";}}};SWFUpload.prototype.executeNextEvent=function(){var b=this.eventQueue?this.eventQueue.shift():null;if(typeof(b)==="function"){b.apply(this);}};SWFUpload.prototype.unescapeFilePostParams=function(l){var j=/[$]([0-9a-f]{4})/i;var i={};var k;if(l!=undefined){for(var h in l.post){if(l.post.hasOwnProperty(h)){k=h;var g;while((g=j.exec(k))!==null){k=k.replace(g[0],String.fromCharCode(parseInt("0x"+g[1],16)));}i[k]=l.post[h];}}l.post=i;}return l;};SWFUpload.prototype.testExternalInterface=function(){try{return this.callFlash("TestExternalInterface");}catch(b){return false;}};SWFUpload.prototype.flashReady=function(){var b=this.getMovieElement();if(!b){this.debug("Flash called back ready but the flash movie can't be found.");return;}this.cleanUp(b);this.queueEvent("swfupload_loaded_handler");};SWFUpload.prototype.cleanUp=function(f){try{if(this.movieElement&&typeof(f.CallFunction)==="unknown"){this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");for(var h in f){try{if(typeof(f[h])==="function"){f[h]=null;}}catch(e){}}}}catch(g){}window.__flash__removeCallback=function(c,b){try{if(c){c[b]=null;}}catch(a){}};};SWFUpload.prototype.fileDialogStart=function(){this.queueEvent("file_dialog_start_handler");};SWFUpload.prototype.fileQueued=function(b){b=this.unescapeFilePostParams(b);this.queueEvent("file_queued_handler",b);};SWFUpload.prototype.fileQueueError=function(e,f,d){e=this.unescapeFilePostParams(e);this.queueEvent("file_queue_error_handler",[e,f,d]);};SWFUpload.prototype.fileDialogComplete=function(d,f,e){this.queueEvent("file_dialog_complete_handler",[d,f,e]);};SWFUpload.prototype.uploadStart=function(b){b=this.unescapeFilePostParams(b);this.queueEvent("return_upload_start_handler",b);};SWFUpload.prototype.returnUploadStart=function(d){var c;if(typeof this.settings.upload_start_handler==="function"){d=this.unescapeFilePostParams(d);c=this.settings.upload_start_handler.call(this,d);}else{if(this.settings.upload_start_handler!=undefined){throw"upload_start_handler must be a function";}}if(c===undefined){c=true;}c=!!c;this.callFlash("ReturnUploadStart",[c]);};SWFUpload.prototype.uploadProgress=function(e,f,d){e=this.unescapeFilePostParams(e);this.queueEvent("upload_progress_handler",[e,f,d]);};SWFUpload.prototype.uploadError=function(e,f,d){e=this.unescapeFilePostParams(e);this.queueEvent("upload_error_handler",[e,f,d]);};SWFUpload.prototype.uploadSuccess=function(d,e,f){d=this.unescapeFilePostParams(d);this.queueEvent("upload_success_handler",[d,e,f]);};SWFUpload.prototype.uploadComplete=function(b){b=this.unescapeFilePostParams(b);this.queueEvent("upload_complete_handler",b);};SWFUpload.prototype.debug=function(b){this.queueEvent("debug_handler",b);};SWFUpload.prototype.debugMessage=function(h){if(this.settings.debug){var f,g=[];if(typeof h==="object"&&typeof h.name==="string"&&typeof h.message==="string"){for(var e in h){if(h.hasOwnProperty(e)){g.push(e+": "+h[e]);}}f=g.join("\n")||"";g=f.split("\n");f="EXCEPTION: "+g.join("\nEXCEPTION: ");SWFUpload.Console.writeLine(f);}else{SWFUpload.Console.writeLine(h);}}};SWFUpload.Console={};SWFUpload.Console.writeLine=function(g){var e,f;try{e=document.getElementById("SWFUpload_Console");if(!e){f=document.createElement("form");document.getElementsByTagName("body")[0].appendChild(f);e=document.createElement("textarea");e.id="SWFUpload_Console";e.style.fontFamily="monospace";e.setAttribute("wrap","off");e.wrap="off";e.style.overflow="auto";e.style.width="700px";e.style.height="350px";e.style.margin="5px";f.appendChild(e);}e.value+=g+"\n";e.scrollTop=e.scrollHeight-e.clientHeight;}catch(h){alert("Exception: "+h.name+" Message: "+h.message);}};(function(c){var b={init:function(d,e){return this.each(function(){var n=c(this);var m=n.clone();var j=c.extend({id:n.attr("id"),swf:"uploadify.swf",uploader:"uploadify.php",auto:true,buttonClass:"",buttonCursor:"hand",buttonImage:null,buttonText:"SELECT FILES",checkExisting:false,debug:false,fileObjName:"Filedata",fileSizeLimit:0,fileTypeDesc:"All Files",fileTypeExts:"*.*",height:30,itemTemplate:false,method:"post",multi:true,formData:{},preventCaching:true,progressData:"percentage",queueID:false,queueSizeLimit:999,removeCompleted:true,removeTimeout:3,requeueErrors:false,successTimeout:30,uploadLimit:0,width:120,overrideEvents:[]},d);var g={assume_success_timeout:j.successTimeout,button_placeholder_id:j.id,button_width:j.width,button_height:j.height,button_text:null,button_text_style:null,button_text_top_padding:0,button_text_left_padding:0,button_action:(j.multi?SWFUpload.BUTTON_ACTION.SELECT_FILES:SWFUpload.BUTTON_ACTION.SELECT_FILE),button_disabled:false,button_cursor:(j.buttonCursor=="arrow"?SWFUpload.CURSOR.ARROW:SWFUpload.CURSOR.HAND),button_window_mode:SWFUpload.WINDOW_MODE.TRANSPARENT,debug:j.debug,requeue_on_error:j.requeueErrors,file_post_name:j.fileObjName,file_size_limit:j.fileSizeLimit,file_types:j.fileTypeExts,file_types_description:j.fileTypeDesc,file_queue_limit:j.queueSizeLimit,file_upload_limit:j.uploadLimit,flash_url:j.swf,prevent_swf_caching:j.preventCaching,post_params:j.formData,upload_url:j.uploader,use_query_string:(j.method=="get"),file_dialog_complete_handler:a.onDialogClose,file_dialog_start_handler:a.onDialogOpen,file_queued_handler:a.onSelect,file_queue_error_handler:a.onSelectError,swfupload_loaded_handler:j.onSWFReady,upload_complete_handler:a.onUploadComplete,upload_error_handler:a.onUploadError,upload_progress_handler:a.onUploadProgress,upload_start_handler:a.onUploadStart,upload_success_handler:a.onUploadSuccess};if(e){g=c.extend(g,e);}g=c.extend(g,j);var o=swfobject.getFlashPlayerVersion();var h=(o.major>=9);if(h){window["uploadify_"+j.id]=new SWFUpload(g);var i=window["uploadify_"+j.id];n.data("uploadify",i);var l=c("<div />",{id:j.id,"class":"uploadify",css:{height:j.height+"px",width:j.width+"px"}});c("#"+i.movieName).wrap(l);l=c("#"+j.id);l.data("uploadify",i);var f=c("<div />",{id:j.id+"-button","class":"uploadify-button "+j.buttonClass});if(j.buttonImage){f.css({"background-image":"url('"+j.buttonImage+"')","text-indent":"-9999px"});}f.html('<span class="uploadify-button-text">'+j.buttonText+"</span>").css({height:j.height+"px","line-height":j.height+"px",width:j.width+"px"});l.append(f);c("#"+i.movieName).css({position:"absolute","z-index":1});if(!j.queueID){var k=c("<div />",{id:j.id+"-queue","class":"uploadify-queue"});l.after(k);i.settings.queueID=j.id+"-queue";i.settings.defaultQueue=true;}i.queueData={files:{},filesSelected:0,filesQueued:0,filesReplaced:0,filesCancelled:0,filesErrored:0,uploadsSuccessful:0,uploadsErrored:0,averageSpeed:0,queueLength:0,queueSize:0,uploadSize:0,queueBytesUploaded:0,uploadQueue:[],errorMsg:"Some files were not added to the queue:"};i.original=m;i.wrapper=l;i.button=f;i.queue=k;if(j.onInit){j.onInit.call(n,i);}}else{if(j.onFallback){j.onFallback.call(n);}}});},cancel:function(d,f){var e=arguments;this.each(function(){var l=c(this),i=l.data("uploadify"),j=i.settings,h=-1;if(e[0]){if(e[0]=="*"){var g=i.queueData.queueLength;c("#"+j.queueID).find(".uploadify-queue-item").each(function(){h++;if(e[1]===true){i.cancelUpload(c(this).attr("id"),false);}else{i.cancelUpload(c(this).attr("id"));}c(this).find(".data").removeClass("data").html(" - Cancelled");c(this).find(".uploadify-progress-bar").remove();c(this).delay(1000+100*h).fadeOut(500,function(){c(this).remove();});});i.queueData.queueSize=0;i.queueData.queueLength=0;if(j.onClearQueue){j.onClearQueue.call(l,g);}}else{for(var m=0;m<e.length;m++){i.cancelUpload(e[m]);c("#"+e[m]).find(".data").removeClass("data").html(" - Cancelled");c("#"+e[m]).find(".uploadify-progress-bar").remove();c("#"+e[m]).delay(1000+100*m).fadeOut(500,function(){c(this).remove();});}}}else{var k=c("#"+j.queueID).find(".uploadify-queue-item").get(0);$item=c(k);i.cancelUpload($item.attr("id"));$item.find(".data").removeClass("data").html(" - Cancelled");$item.find(".uploadify-progress-bar").remove();$item.delay(1000).fadeOut(500,function(){c(this).remove();});}});},destroy:function(){this.each(function(){var f=c(this),d=f.data("uploadify"),e=d.settings;d.destroy();if(e.defaultQueue){c("#"+e.queueID).remove();}c("#"+e.id).replaceWith(d.original);if(e.onDestroy){e.onDestroy.call(this);}delete d;});},disable:function(d){this.each(function(){var g=c(this),e=g.data("uploadify"),f=e.settings;if(d){e.button.addClass("disabled");if(f.onDisable){f.onDisable.call(this);}}else{e.button.removeClass("disabled");if(f.onEnable){f.onEnable.call(this);}}e.setButtonDisabled(d);});},settings:function(e,g,h){var d=arguments;var f=g;this.each(function(){var k=c(this),i=k.data("uploadify"),j=i.settings;if(typeof(d[0])=="object"){for(var l in g){setData(l,g[l]);}}if(d.length===1){f=j[e];}else{switch(e){case"uploader":i.setUploadURL(g);break;case"formData":if(!h){g=c.extend(j.formData,g);}i.setPostParams(j.formData);break;case"method":if(g=="get"){i.setUseQueryString(true);}else{i.setUseQueryString(false);}break;case"fileObjName":i.setFilePostName(g);break;case"fileTypeExts":i.setFileTypes(g,j.fileTypeDesc);break;case"fileTypeDesc":i.setFileTypes(j.fileTypeExts,g);break;case"fileSizeLimit":i.setFileSizeLimit(g);break;case"uploadLimit":i.setFileUploadLimit(g);break;case"queueSizeLimit":i.setFileQueueLimit(g);break;case"buttonImage":i.button.css("background-image",settingValue);break;case"buttonCursor":if(g=="arrow"){i.setButtonCursor(SWFUpload.CURSOR.ARROW);}else{i.setButtonCursor(SWFUpload.CURSOR.HAND);}break;case"buttonText":c("#"+j.id+"-button").find(".uploadify-button-text").html(g);break;case"width":i.setButtonDimensions(g,j.height);break;case"height":i.setButtonDimensions(j.width,g);break;case"multi":if(g){i.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILES);}else{i.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILE);}break;}j[e]=g;}});if(d.length===1){return f;}},stop:function(){this.each(function(){var e=c(this),d=e.data("uploadify");d.queueData.averageSpeed=0;d.queueData.uploadSize=0;d.queueData.bytesUploaded=0;d.queueData.uploadQueue=[];d.stopUpload();});},upload:function(){var d=arguments;this.each(function(){var f=c(this),e=f.data("uploadify");e.queueData.averageSpeed=0;e.queueData.uploadSize=0;e.queueData.bytesUploaded=0;e.queueData.uploadQueue=[];if(d[0]){if(d[0]=="*"){e.queueData.uploadSize=e.queueData.queueSize;e.queueData.uploadQueue.push("*");e.startUpload();}else{for(var g=0;g<d.length;g++){e.queueData.uploadSize+=e.queueData.files[d[g]].size;e.queueData.uploadQueue.push(d[g]);}e.startUpload(e.queueData.uploadQueue.shift());}}else{e.startUpload();}});}};var a={onDialogOpen:function(){var d=this.settings;this.queueData.errorMsg="Some files were not added to the queue:";this.queueData.filesReplaced=0;this.queueData.filesCancelled=0;if(d.onDialogOpen){d.onDialogOpen.call(this);}},onDialogClose:function(d,f,g){var e=this.settings;this.queueData.filesErrored=d-f;this.queueData.filesSelected=d;this.queueData.filesQueued=f-this.queueData.filesCancelled;this.queueData.queueLength=g;if(c.inArray("onDialogClose",e.overrideEvents)<0){if(this.queueData.filesErrored>0){alert(this.queueData.errorMsg);}}if(e.onDialogClose){e.onDialogClose.call(this,this.queueData);}if(e.auto){c("#"+e.id).uploadify("upload","*");}},onSelect:function(h){var i=this.settings;var f={};for(var g in this.queueData.files){f=this.queueData.files[g];if(f.uploaded!=true&&f.name==h.name){var e=confirm('The file named "'+h.name+'" is already in the queue.\nDo you want to replace the existing item in the queue?');if(!e){this.cancelUpload(h.id);this.queueData.filesCancelled++;return false;}else{c("#"+f.id).remove();this.cancelUpload(f.id);this.queueData.filesReplaced++;}}}var j=Math.round(h.size/1024);var o="KB";if(j>1000){j=Math.round(j/1000);o="MB";}var l=j.toString().split(".");j=l[0];if(l.length>1){j+="."+l[1].substr(0,2);}j+=o;var k=h.name;if(k.length>25){k=k.substr(0,25)+"...";}itemData={fileID:h.id,instanceID:i.id,fileName:k,fileSize:j};if(i.itemTemplate==false){i.itemTemplate='<div id="${fileID}" class="uploadify-queue-item">					<div class="cancel">						<a href="javascript:$(\'#${instanceID}\').uploadify(\'cancel\', \'${fileID}\')">X</a>					</div>					<span class="fileName">${fileName} (${fileSize})</span><span class="data"></span>					<div class="uploadify-progress">						<div class="uploadify-progress-bar"><!--Progress Bar--></div>					</div>				</div>';}if(c.inArray("onSelect",i.overrideEvents)<0){itemHTML=i.itemTemplate;for(var m in itemData){itemHTML=itemHTML.replace(new RegExp("\\$\\{"+m+"\\}","g"),itemData[m]);}c("#"+i.queueID).append(itemHTML);}this.queueData.queueSize+=h.size;this.queueData.files[h.id]=h;if(i.onSelect){i.onSelect.apply(this,arguments);}},onSelectError:function(d,g,f){var e=this.settings;if(c.inArray("onSelectError",e.overrideEvents)<0){switch(g){case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:if(e.queueSizeLimit>f){this.queueData.errorMsg+="\nThe number of files selected exceeds the remaining upload limit ("+f+").";}else{this.queueData.errorMsg+="\nThe number of files selected exceeds the queue size limit ("+e.queueSizeLimit+").";}break;case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:this.queueData.errorMsg+='\nThe file "'+d.name+'" exceeds the size limit ('+e.fileSizeLimit+").";break;case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:this.queueData.errorMsg+='\nThe file "'+d.name+'" is empty.';break;case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:this.queueData.errorMsg+='\nThe file "'+d.name+'" is not an accepted file type ('+e.fileTypeDesc+").";break;}}if(g!=SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED){delete this.queueData.files[d.id];}if(e.onSelectError){e.onSelectError.apply(this,arguments);}},onQueueComplete:function(){if(this.settings.onQueueComplete){this.settings.onQueueComplete.call(this,this.settings.queueData);}},onUploadComplete:function(f){var g=this.settings,d=this;var e=this.getStats();this.queueData.queueLength=e.files_queued;if(this.queueData.uploadQueue[0]=="*"){if(this.queueData.queueLength>0){this.startUpload();}else{this.queueData.uploadQueue=[];if(g.onQueueComplete){g.onQueueComplete.call(this,this.queueData);}}}else{if(this.queueData.uploadQueue.length>0){this.startUpload(this.queueData.uploadQueue.shift());}else{this.queueData.uploadQueue=[];if(g.onQueueComplete){g.onQueueComplete.call(this,this.queueData);}}}if(c.inArray("onUploadComplete",g.overrideEvents)<0){if(g.removeCompleted){switch(f.filestatus){case SWFUpload.FILE_STATUS.COMPLETE:setTimeout(function(){if(c("#"+f.id)){d.queueData.queueSize-=f.size;d.queueData.queueLength-=1;delete d.queueData.files[f.id];c("#"+f.id).fadeOut(500,function(){c(this).remove();});}},g.removeTimeout*1000);break;case SWFUpload.FILE_STATUS.ERROR:if(!g.requeueErrors){setTimeout(function(){if(c("#"+f.id)){d.queueData.queueSize-=f.size;d.queueData.queueLength-=1;delete d.queueData.files[f.id];c("#"+f.id).fadeOut(500,function(){c(this).remove();});}},g.removeTimeout*1000);}break;}}else{f.uploaded=true;}}if(g.onUploadComplete){g.onUploadComplete.call(this,f);}},onUploadError:function(e,i,h){var f=this.settings;var g="Error";switch(i){case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:g="HTTP Error ("+h+")";break;case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:g="Missing Upload URL";break;case SWFUpload.UPLOAD_ERROR.IO_ERROR:g="IO Error";break;case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:g="Security Error";break;case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:alert("The upload limit has been reached ("+h+").");g="Exceeds Upload Limit";break;case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:g="Failed";break;case SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND:break;case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:g="Validation Error";break;case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:g="Cancelled";this.queueData.queueSize-=e.size;this.queueData.queueLength-=1;if(e.status==SWFUpload.FILE_STATUS.IN_PROGRESS||c.inArray(e.id,this.queueData.uploadQueue)>=0){this.queueData.uploadSize-=e.size;}if(f.onCancel){f.onCancel.call(this,e);}delete this.queueData.files[e.id];break;case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:g="Stopped";break;}if(c.inArray("onUploadError",f.overrideEvents)<0){if(i!=SWFUpload.UPLOAD_ERROR.FILE_CANCELLED&&i!=SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED){c("#"+e.id).addClass("uploadify-error");}c("#"+e.id).find(".uploadify-progress-bar").css("width","1px");if(i!=SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND&&e.status!=SWFUpload.FILE_STATUS.COMPLETE){c("#"+e.id).find(".data").html(" - "+g);}}var d=this.getStats();this.queueData.uploadsErrored=d.upload_errors;if(f.onUploadError){f.onUploadError.call(this,e,i,h,g);}},onUploadProgress:function(g,m,j){var h=this.settings;var e=new Date();var n=e.getTime();var k=n-this.timer;if(k>500){this.timer=n;}var i=m-this.bytesLoaded;this.bytesLoaded=m;var d=this.queueData.queueBytesUploaded+m;var p=Math.round(m/j*100);var o="KB/s";var l=0;var f=(i/1024)/(k/1000);f=Math.floor(f*10)/10;if(this.queueData.averageSpeed>0){this.queueData.averageSpeed=Math.floor((this.queueData.averageSpeed+f)/2);}else{this.queueData.averageSpeed=Math.floor(f);}if(f>1000){l=(f*0.001);this.queueData.averageSpeed=Math.floor(l);o="MB/s";}if(c.inArray("onUploadProgress",h.overrideEvents)<0){if(h.progressData=="percentage"){c("#"+g.id).find(".data").html(" - "+p+"%");}else{if(h.progressData=="speed"&&k>500){c("#"+g.id).find(".data").html(" - "+this.queueData.averageSpeed+o);}}c("#"+g.id).find(".uploadify-progress-bar").css("width",p+"%");}if(h.onUploadProgress){h.onUploadProgress.call(this,g,m,j,d,this.queueData.uploadSize);}},onUploadStart:function(d){var e=this.settings;var f=new Date();this.timer=f.getTime();this.bytesLoaded=0;if(this.queueData.uploadQueue.length==0){this.queueData.uploadSize=d.size;}if(e.checkExisting){c.ajax({type:"POST",async:false,url:e.checkExisting,data:{filename:d.name},success:function(h){if(h==1){var g=confirm('A file with the name "'+d.name+'" already exists on the server.\nWould you like to replace the existing file?');if(!g){this.cancelUpload(d.id);c("#"+d.id).remove();if(this.queueData.uploadQueue.length>0&&this.queueData.queueLength>0){if(this.queueData.uploadQueue[0]=="*"){this.startUpload();}else{this.startUpload(this.queueData.uploadQueue.shift());}}}}}});}if(e.onUploadStart){e.onUploadStart.call(this,d);}},onUploadSuccess:function(f,h,d){var g=this.settings;var e=this.getStats();this.queueData.uploadsSuccessful=e.successful_uploads;this.queueData.queueBytesUploaded+=f.size;if(c.inArray("onUploadSuccess",g.overrideEvents)<0){c("#"+f.id).find(".data").html(" - Complete");}if(g.onUploadSuccess){g.onUploadSuccess.call(this,f,h,d);}}};c.fn.uploadify=function(d){if(b[d]){return b[d].apply(this,Array.prototype.slice.call(arguments,1));}else{if(typeof d==="object"||!d){return b.init.apply(this,arguments);}else{c.error("The method "+d+" does not exist in $.uploadify");}}};})($);
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/uploadify/uploadify.swf b/src/main/webapp/plug-in/uploadify/uploadify.swf
    new file mode 100644
    index 00000000..9223fd90
    Binary files /dev/null and b/src/main/webapp/plug-in/uploadify/uploadify.swf differ
    diff --git a/src/main/webapp/plug-in/webOffice/LoadWebOffice.js b/src/main/webapp/plug-in/webOffice/LoadWebOffice.js
    new file mode 100644
    index 00000000..42a76cf9
    --- /dev/null
    +++ b/src/main/webapp/plug-in/webOffice/LoadWebOffice.js
    @@ -0,0 +1,5 @@
    +var s = ""
    +s += "<object id=WebOffice1 height=500 width='100%' style='LEFT: 0px; TOP: 0px' classid='clsid:E77E049B-23FC-4DB8-B756-60529A35FAD5' codebase='plug-in/webOffice/weboffice_v6.0.5.0.cab#Version=6,0,5,0'>"
    +s +="<param name='_ExtentX' value='6350'><param name='_ExtentY' value='6350'>"
    +s +="</OBJECT>"
    +document.write(s)
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/webOffice/main.js b/src/main/webapp/plug-in/webOffice/main.js
    new file mode 100644
    index 00000000..b8b34c7b
    --- /dev/null
    +++ b/src/main/webapp/plug-in/webOffice/main.js
    @@ -0,0 +1,1234 @@
    +
    +
    +/****************************************************
    +*
    +*		鍏抽棴椤甸潰鏃惰皟鐢ㄦ鍑芥暟锛屽叧闂枃浠 
    +*
    +****************************************************/
    +function window_onunload() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.Close();
    +	}catch(e){
    +	//	alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鏂板缓鏂囨。
    +*
    +****************************************************/
    +function newDoc() {
    +//	alert("newDoc");
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		var doctype=document.getElementById("doctype").value;
    +		webObj.LoadOriginalFile("", doctype);
    +	}catch(e){
    +		alert("newDoc寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +
    +/****************************************************
    +*
    +*				鏄剧ず鎵撳嵃瀵硅瘽妗
    +*
    +/***************************************************/
    +function showPrintDialog(){
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.PrintDoc(1);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鐩存帴鎵撳嵃
    +*
    +****************************************************/
    +function zhiPrint(){
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.PrintDoc(0);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*			鍏抽棴椤甸潰鏃惰皟鐢ㄦ鍑芥暟锛屽叧闂枃浠 
    +*
    +****************************************************/
    +function window_onunload() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.Close();
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*				 瑙i櫎鏂囨。淇濇姢 
    +*
    +****************************************************/
    +function UnProtect() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.ProtectDoc(0,1, document.all.docPwd.value);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			
    +*				璁剧疆鏂囨。淇濇姢 
    +*
    +****************************************************/
    +function ProtectFull() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.ProtectDoc(1,1, document.all.docPwd.value);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					绂佹鎵撳嵃
    +*
    +****************************************************/
    +function notPrint() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetSecurity(0x01); 
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鎭㈠鍏佽鎵撳嵃
    +*
    +/****************************************************/
    +function okPrint() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetSecurity(0x01 + 0x8000);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +
    +}
    +/****************************************************
    +*
    +*					绂佹淇濆瓨
    +*
    +****************************************************/
    +function notSave() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetSecurity(0x02); 
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +
    +}
    +/****************************************************
    +*
    +*					鎭㈠鍏佽淇濆瓨
    +*
    +/****************************************************/
    +function okSave() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetSecurity(0x02 + 0x8000);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +
    +}
    +/****************************************************
    +*
    +*					绂佹澶嶅埗
    +*
    +/****************************************************/
    +function notCopy() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetSecurity(0x04); 
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鎭㈠鍏佽澶嶅埗
    +*
    +/****************************************************/
    +function okCopy() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetSecurity(0x04 + 0x8000); 
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					绂佹鎷栧姩
    +*
    +/****************************************************/
    +function notDrag() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetSecurity(0x08); 
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鎭㈠鎷栧姩
    +*
    +/****************************************************/
    +function okDrag() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetSecurity(0x08 + 0x8000); 
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +
    +}
    +/****************************************************
    +*
    +*					淇鏂囨。
    +*
    +/****************************************************/
    +function ProtectRevision() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetTrackRevisions(1) 
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					闅愯棌淇
    +*
    +/****************************************************/
    +function UnShowRevisions() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.ShowRevisions(0);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鏄剧ず褰撳墠淇
    +*
    +/****************************************************/
    +function ShowRevisions() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.ShowRevisions(1);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					閫鍑轰慨璁㈢姸鎬
    +*
    +/****************************************************/
    +function ExitRevisions() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetTrackRevisions(0);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鎺ュ彈褰撳墠鎵鏈変慨璁
    +*
    +/****************************************************/
    +function AcceptAllRevisions() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    + 		document.all.WebOffice1.SetTrackRevisions(4);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鎷掔粷褰撳墠鎵鏈変慨璁
    +*
    +/****************************************************/
    +function unAcceptAllRevisions() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		var vCount = webObj.GetRevCount();
    +		var strUserName;
    +		for(var i=1;i<=vCount;i++){
    +			strUserName=webObj.GetRevInfo(i,0);
    +			document.all.WebOffice1.AcceptRevision(strUserName ,1)	
    +		}
    +		}catch(e){
    +			alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +		}
    +}
    +/****************************************************
    +*
    +*					鑾峰彇淇鐩稿叧淇℃伅
    +*
    +/****************************************************/
    +function GetRevAllInfo() {
    +var vCount;
    +vCount = document.all.WebOffice1.GetRevCount(); 
    +var vOpt = 0;
    +var vDate;
    +for(var i=1; i<= vCount; i++){
    +	vOpt = document.all.WebOffice1.GetRevInfo(i,2);
    +	if("1" == vOpt){
    +		vOpt = "鎻掑叆";
    +	}else if("2" == vOpt){
    +		vOpt = "鍒犻櫎";
    +	}else{
    +		vOpt = "鏈煡鎿嶄綔";
    +	}
    +	vDate = new String(document.all.WebOffice1.GetRevInfo(i,1));
    +	vDate = parseFloat(vDate); 
    +	dateObj = new Date(vDate);
    +  alert(dateObj.getYear()   + "骞" + dateObj.getMonth() + 1 + "鏈" + dateObj.getDate() +"鏃" +  dateObj.getHours() +"鏃" +  dateObj.getMinutes() +"鍒" +  dateObj.getSeconds() +"绉" );
    +	alert("鐢ㄦ埛:"+document.all.WebOffice1.GetRevInfo(i,0) + "\r\n鎿嶄綔:" + vOpt + "\r\n鍐呭:" + document.all.WebOffice1.GetRevInfo(i,3));
    +}
    +}
    +/****************************************************
    +*
    +*					璁剧疆褰撳墠鎿嶄綔鐢ㄦ埛
    +*
    +/****************************************************/
    +function SetUserName() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		if(document.all.UserName.value ==""){
    +			alert("鐢ㄦ埛鍚嶄笉鍙负绌")
    +			document.all.UserName.focus();
    +			return false;
    +		}
    + 		webObj.SetCurrUserName(document.all.UserName.value);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					璁剧疆涔︾
    +*
    +/****************************************************/
    +function addBookmark() {
    +		alert("鍚戝厜鏍囧鍔犲叆鍚嶇О涓簍est鐨勪功绛");
    +		document.all.WebOffice1.SetFieldValue("test", "鍔犲叆涔︾test", "::ADDMARK::");	
    +		
    +
    +}
    +function taohong(){
    +	alert("缁欏悕涓簍est鐨勪功绛炬坊鍔犲绾俊鎭細鍖椾含鐐硅仛淇℃伅鎶鏈湁闄愬叕鍙");
    +	document.all.WebOffice1.SetFieldValue("test", "http://127.0.0.1:83/test.doc", "::FILE::");	
    +}
    +/****************************************************
    +*
    +*					濉厖妯℃澘
    +*
    +/****************************************************/
    +function FillBookMarks(){
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.BookMarkOpt("/template/FillBookMarks.jsp",2);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					闅愯棌office2003鏂囦欢鑿滃崟
    +*
    +/****************************************************/
    +function hideFileMenu() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Menu Bar",1,0);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鏄剧ずoffice2003鏂囦欢鑿滃崟
    +*
    +/****************************************************/
    +function showFileMenu() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Menu Bar",1,4);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					闅愯棌office2003缂栬緫鑿滃崟
    +*
    +/****************************************************/
    +function hideEditMenu() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Menu Bar",2,0);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鏄剧ずoffice2003缂栬緫鑿滃崟
    +*
    +/****************************************************/
    +function showEditMenu() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Menu Bar",2,4);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					闅愯棌office2003鏂板缓鎸夐挳
    +*
    +/****************************************************/
    +function hideNewItem() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Standard",1,0);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鏄剧ずoffice2003鏂板缓鎸夐挳
    +*
    +/****************************************************/
    +function showNewItem() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Standard",1,4);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					闅愯棌office2003鎵撳紑鎸夐挳
    +*
    +/****************************************************/
    +function hideOpenItem() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Standard",2,0);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鏄剧ずoffice2003鎵撳紑鎸夐挳
    +*
    +/****************************************************/
    +function showOpenItem() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Standard",2,4);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					闅愯棌office2003淇濆瓨鎸夐挳
    +*
    +/****************************************************/
    +function hideSaveItem() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Standard",1,0);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鏄剧ずoffice2003淇濆瓨鎸夐挳
    +*
    +/****************************************************/
    +function showSaveItem() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Standard",1,4);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					杩斿洖棣栭〉
    +*
    +/****************************************************/
    +function return_onclick() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.Close();
    +		window.location.href  = "index.jsp"
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鎵撳紑鏈湴鏂囦欢
    +*
    +/****************************************************/
    +function docOpen() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.LoadOriginalFile("open", "doc");
    +	}catch(e){
    +		alert("docOpen寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					淇濆瓨鏂囨。
    +*
    +/****************************************************/
    +function newSave() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.Save();
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鍙﹀瓨涓烘枃妗
    +*
    +/****************************************************/
    +function SaveAsTo() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.ShowDialog(84);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					闅愯棌鑿滃崟
    +*
    +/****************************************************/
    +function notMenu() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Menu Bar",1,8);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鏄剧ず鑿滃崟
    +*
    +/****************************************************/
    +function okMenu() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Menu Bar",1,11);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					闅愯棌甯哥敤宸ュ叿鏍
    +*
    +/****************************************************/
    +function notOfter() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Standard",1,8);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鏄剧ず甯哥敤宸ュ叿鏍
    +*
    +/****************************************************/
    +function okOfter() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Standard",1,11);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					闅愯棌鏍煎紡宸ュ叿鏍
    +*
    +/****************************************************/
    +function notFormat() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Formatting",1,8);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鏄剧ず鏍煎紡宸ュ叿鏍
    +*
    +/****************************************************/
    +function okFormat() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.SetToolBarButton2("Formatting",1,11);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}    
    +/****************************************************
    +*
    +*					濂楃孩鍙婃暟鎹氦浜
    +*
    +/****************************************************/
    +function linkRed() {
    +		window.open("mark.html","newwindow",'height=768, width=1024, top=0, left=0, toolbar=yes,resizable=yes, menubar=yes,location=yes, status=yes');
    +} 
    +/****************************************************
    +*
    +*					涓婁紶鏂囨。
    +*
    +/****************************************************/
    +function SaveDoc(id,docType) {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		var returnValue;
    +		 if(myform.DocTitle.value ==""){
    +			alert("鏍囬涓嶅彲涓虹┖")
    +			myform.DocTitle.focus();
    +			return false;
    +		}
    +		if(myform.DocID.value ==""){
    +			alert("鏂囧彿涓嶅彲涓虹┖")
    +			myform.DocID.focus();
    +			return false;
    +		}
    +		
    +		webObj.HttpInit();			//鍒濆鍖朒ttp寮曟搸
    +		// 娣诲姞鐩稿簲鐨凱ost鍏冪礌 
    +		webObj.HttpAddPostString("id", id);
    +		webObj.HttpAddPostString("DocTitle", myform.DocTitle.value);
    +		webObj.HttpAddPostString("DocID", myform.DocID.value);
    +		webObj.HttpAddPostString("DocType",docType);
    +		webObj.HttpAddPostCurrFile("DocContent","");		// 涓婁紶鏂囦欢
    +		returnValue = webObj.HttpPost("/savedoc.jsp");	// 鍒ゆ柇涓婁紶鏄惁鎴愬姛
    +		if("succeed" == returnValue){
    +			alert("鏂囦欢涓婁紶鎴愬姛");	
    +		}else if("failed" == returnValue)
    +			alert("鏂囦欢涓婁紶澶辫触");
    +		return_onclick(); 
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鍏ㄥ睆
    +*
    +/****************************************************/
    +function bToolBar_FullScreen_onclick() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.FullScreen = true;
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*	璁剧疆weboffice鑷甫宸ュ叿鏍忊滄柊寤烘枃妗b濇樉绀烘垨闅愯棌
    +*
    +/****************************************************/
    +function bToolBar_New_onclick() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		var vCurItem = document.all.WebOffice1.HideMenuItem(0);
    +		//鏍规嵁vCurItem鍒ゆ柇褰撳墠鎸夐挳鏄惁鏄剧ず
    +		if(vCurItem & 0x01){
    +			webObj.HideMenuItem(0x01); //Show it
    +		}else{
    +			webObj.HideMenuItem(0x01 + 0x8000); //Hide it
    +		}
    +		
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*	璁剧疆weboffice鑷甫宸ュ叿鏍忊滄墦寮鏂囨。鈥濇樉绀烘垨闅愯棌
    +*
    +/****************************************************/
    +function bToolBar_Open_onclick() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		var vCurItem = webObj.HideMenuItem(0);
    +		//鏍规嵁vCurItem鍒ゆ柇褰撳墠鎸夐挳鏄惁鏄剧ず
    +		if(vCurItem & 0x02){
    +			webObj.HideMenuItem(0x02); //Show it
    +		}else{
    +			webObj.HideMenuItem(0x02 + 0x8000); //Hide it
    +		}
    +		
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*	璁剧疆weboffice鑷甫宸ュ叿鏍忊滀繚瀛樻枃妗b濇樉绀烘垨闅愯棌
    +*
    +/****************************************************/
    +function bToolBar_Save_onclick() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		var vCurItem = webObj.HideMenuItem(0);
    +		//鏍规嵁vCurItem鍒ゆ柇褰撳墠鎸夐挳鏄惁鏄剧ず
    +		if(vCurItem & 0x04){
    +			webObj.HideMenuItem(0x04); //Show it
    +		}else{
    +			webObj.HideMenuItem(0x04 + 0x8000); //Hide it
    +		}
    +		
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*		璁剧疆weboffice鑷甫宸ュ叿鏍忔樉绀烘垨闅愯棌
    +*
    +/****************************************************/
    +function bToolBar_onclick() {
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.ShowToolBar =  !webObj.ShowToolBar;
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +function showWebOfficeToolbar(bShow) {
    +//	alert("showWebOfficeToolbar");
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.ShowToolBar = bShow;
    +	}catch(e){
    +		alert("showWebOfficeToolbar寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*			寰楀埌褰撳墠鏂囨。鐢ㄦ埛鍒楄〃
    +*
    +/****************************************************/
    +function ReUserList_onclick()
    +{
    +	var webObj=document.getElementById("WebOffice1");
    +	var vCount = webObj.GetRevCount();
    +//1.Remove All
    + 	var selLen= document.all.UserList.length;
    +	for (i=0;i<selLen;i++){
    +		document.all.UserList.remove(0);
    +	}
    +//2.ReLoad All	 
    +	var vCount;
    +	vCount = webObj.GetRevCount();
    +		var  el1   =   document.createElement("OPTION");   
    +		el1.text  ="--璇烽夋嫨鐢ㄦ埛--";   
    +		document.all.UserList.options.add(el1);	 
    +	
    +	for(var i=1;i<=vCount;i++){
    +		var strUserName=webObj.GetRevInfo(i,0);
    +		var  el   =   document.createElement("OPTION");   
    +		el.text   =   strUserName;   
    +		el.value   =   strUserName;   
    +		document.all.UserList.options.add(el);	   
    +	}
    +}
    +
    +/*************************************************
    +鍔熻兘锛氬湪婕旂ず濡備綍璋冪敤VBA鎺ュ彛
    +      WebOffice鎻愪緵GetDocumentObject()鐨勬帴鍙e鍑哄璞
    +      Word 瀵煎嚭鐨勬槸锛歁SWord::_Document
    +      Excel瀵煎嚭鐨勬槸: MSExcel::_Workbook
    +      WPS  瀵煎嚭鐨勬槸: WPS::_Document
    +鍒楀瓙锛
    +1.閫氳繃VBA鑾峰彇褰撳墠鐢ㄦ埛鐨勭敤鎴峰悕
    +  document.all.WebOffice1.GetDocumentObject().Application.UserName;
    +2.鑾峰彇鏂囨。鐨勬爣棰
    +	document.all.WebOffice1.GetDocumentObject().FullName;
    +**************************************************/
    +
    +function TestVBA(){
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		var vObj = webObj.GetDocumentObject();
    +		if(!vObj){
    +			alert("鑾峰彇瀵硅薄澶辫触锛岃鏍稿疄鎮ㄥ凡缁忔墦寮鏂囨。");
    +			return false;
    +		}
    +		var vUserName;
    +		var vFullName;
    +		var vDocType = webObj.DocType;
    +		if(11==vDocType){ //瀵逛簬WOrd鏂囦欢
    +				vUserName = vObj.Application.UserName;
    +				vFullName = vObj.Name;
    +		}else if(12==vDocType){  //瀵逛簬Excel鏂囦欢
    +				vUserName = vObj.Application.UserName;
    +				vFullName = vObj.Name;
    +		}else{
    +			alert("涓嶆敮鎸佺殑鏂囦欢鏍煎紡");
    +			return false;
    +		}
    +		alert("VBA娴嬭瘯缁撴灉\r\n鐢ㄦ埛鍚:"+vUserName+"\r\n鏂囨。鍚:"+vFullName+"\r\n鍙互鍙傜収浠g爜璋冪敤浠绘剰鐨刅BA鍔熻兘");
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鎺ュ彈淇
    +*
    +/****************************************************/
    +function AcceptRevision_onclick() {
    +	try{	
    +	var webObj=document.getElementById("WebOffice1");
    +		var strUserName=document.all.UserList.value;
    +		document.all.WebOffice1.AcceptRevision(strUserName ,0)	
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鎷掔粷淇
    +*
    +/****************************************************/
    +function unAcceptRevision_onclick() {
    +	try{	
    +		var webObj=document.getElementById("WebOffice1");
    +		var strUserName=document.all.UserList.value;
    +		webObj.AcceptRevision(strUserName ,1)	
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +
    +}
    +/****************************************************
    +*
    +*		鏄剧ず鎴栭殣钘忓嵃绔犲伐鍏锋爮
    +*	 閫氳繃褰曞埗VBA鏌ョ湅宸ュ叿鏍忕殑鍚嶇О銆
    +*	鐒跺悗鍙互閲囩敤涓嬮潰鏂瑰紡鏉ユ樉绀烘垨闅愯棌
    +*
    +/****************************************************/
    +function ShowToolBar_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		//閫氳繃Document->application->CommandBars 鑾峰彇鍒拌彍鍗曞璞
    +		var vObj = webObj.GetDocumentObject().Application.CommandBars("鐢靛瓙鍗扮珷");
    +		vObj.Visible = !vObj.Visible
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*					鐩栫珷
    +*
    +/****************************************************/
    +function AddSeal_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +   		 //閫氳繃Document->application->CommandBars 鑾峰彇鍒拌彍鍗曞璞
    +  		var vObj = webObj.GetDocumentObject().Application.CommandBars("鐢靛瓙鍗扮珷");
    +		if(vObj) vObj.Controls("鐩栫珷").Execute();
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*			----寮濮嬭彍鍗曢殣钘
    +*
    +/****************************************************/
    +function beginMenu_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.HideMenuAction(1,0x100000);
    +		webObj. HideMenuAction(5,0);//婵娲昏缃
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*			---鎻掑叆鑿滃崟闅愯棌
    +*
    +/****************************************************/
    +function insertMenu_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.HideMenuAction(1,0x200000);
    +		webObj. HideMenuAction(5,0);//婵娲昏缃
    +
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*			---椤甸潰鑿滃崟闅愯棌
    +*
    +/****************************************************/
    +function pageMenu_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.HideMenuAction(1,0x400000);
    +		webObj. HideMenuAction(5,0);//婵娲昏缃
    +	
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*			--寮曠敤鑿滃崟闅愯棌
    +*
    +/****************************************************/
    +function adducMenu_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.HideMenuAction(1,0x800000);
    +		webObj. HideMenuAction(5,0);//婵娲昏缃
    +
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*			---閭欢鑿滃崟闅愯棌
    +*
    +/****************************************************/
    +function	emailMenu_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.HideMenuAction(1,0x1000000);
    +		webObj. HideMenuAction(5,0);//婵娲昏缃
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*			---瀹¢槄鑿滃崟闅愯棌
    +*
    +/****************************************************/
    +function	checkMenu_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.HideMenuAction(1,0x2000000);
    +		webObj. HideMenuAction(5,0);//婵娲昏缃
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*			---瑙嗗浘鑿滃崟闅愯棌
    +*
    +/****************************************************/
    +function	viewMenu_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.HideMenuAction(1,0x4000000);
    +		webObj. HideMenuAction(5,0);//婵娲昏缃
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*			---寮鍙戝伐鍏疯彍鍗曢殣钘
    +*
    +/****************************************************/
    +function	empolderMenu_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.HideMenuAction(1,0x8000000);
    +		webObj. HideMenuAction(5,0);//婵娲昏缃
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*			---鍔犺浇椤硅彍鍗曢殣钘
    +*
    +/****************************************************/
    +function	loadMenu_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.HideMenuAction(1,0x10000000);
    +		webObj. HideMenuAction(5,0);//婵娲昏缃
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*			---鍏ㄩ儴鑿滃崟闅愯棌
    +*
    +/****************************************************/
    +function	allHideMenu_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj.HideMenuAction(1,0x100000+0x200000+0x400000+0x800000+0x1000000+0x2000000+0x4000000+0x8000000+0x10000000);
    +		webObj. HideMenuAction(5,0);//婵娲昏缃
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*			---澶嶅埗鏃犳晥
    +*
    +/****************************************************/
    +function nullityCopy_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj. HideMenuAction(1,0x2000);
    +		webObj. HideMenuAction(5,0);//婵娲昏缃
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*			---绮樿创鏃犳晥
    +*
    +/****************************************************/
    +function nullityAffix_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj. HideMenuAction(1,0x1000);
    +		webObj. HideMenuAction(5,0);//婵娲昏缃
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			Office2007鑿滃崟闅愯棌鍜屾仮澶
    +*	---鎭㈠鑷宠缃箣鍓嶇姸鎬侊紙鑿滃崟鏄剧ず锛屽鍒讹紝绮樿创鍙敤锛
    +*
    +/****************************************************/
    +function affixCopy_onclick()
    +{
    +	try{
    +		var webObj=document.getElementById("WebOffice1");
    +		webObj. HideMenuAction(6,0);
    +	}catch(e){
    +		alert("寮傚父\r\nError:"+e+"\r\nError Code:"+e.number+"\r\nError Des:"+e.description);
    +	}
    +}
    +/****************************************************
    +*			
    +*	---鐢靛瓙鍗扮珷
    +*
    +/****************************************************/
    +
    +
    +function hideSeal(){
    +	var obj;
    +	try{
    +        obj = new Object(document.all.WebOffice1.GetDocumentObject());
    +         if(obj !=null){
    +         obj.Application.CommandBars("鐢靛瓙鍗扮珷").Visible = !obj.CommandBars("鐢靛瓙鍗扮珷").Visible;
    +        
    +					}
    +	
    +	
    +	    delete obj;
    +    }catch(e){
    +    	alert("闅愯棌鏄剧ず鍗扮珷宸ュ叿鏍忓嚭閿");
    +    	}
    +}
    +
    +function write2(){
    +	var obj1;
    +	try{
    +        obj1 = new Object(document.all.WebOffice1.GetDocumentObject());
    +         if(obj1 !=null){
    +         obj1.Application.CommandBars("鐢靛瓙鍗扮珷").Controls("鐩栫珷").Execute();
    +        
    +					}
    +	
    +	
    +	delete obj1;
    +	}catch(e){
    +    	alert("鐩栫珷鍑洪敊");
    +    	}
    +}
    +/****************************************************
    +*			
    +*	---鎹㈣偆
    +*
    +/**/
    +function ChangeFace(kind){
    +	if(kind==1){
    +		
    +		
    +		document.all.WebOffice1.SetCustomColour(2,250*256*256+244*256+243);
    +		document.all.WebOffice1.SetCustomColour(1,236*256*256+226*256+225);
    +		document.all.WebOffice1.SetCustomColour(3,181*256*256+151*256+153);
    +		document.all.WebOffice1.SetCustomColour(0,247*256*256+243*256+243);
    +	}
    +	if(kind==2){
    +		document.all.WebOffice1.SetCustomColour(2,59*256*256+97*256+131);
    +		document.all.WebOffice1.SetCustomColour(1,138*256*256+216*256+239);
    +		document.all.WebOffice1.SetCustomColour(3,53*256*256+94*256+133);
    +		document.all.WebOffice1.SetCustomColour(0,52*256*256+92*256+130);
    +	}
    +	if(kind==3){
    +		document.all.WebOffice1.SetCustomColour(2,254*256*256+235*256+220);
    +		document.all.WebOffice1.SetCustomColour(1,249*256*256+219*256+196);
    +		document.all.WebOffice1.SetCustomColour(3,228*256*256+174*256+136);
    +		document.all.WebOffice1.SetCustomColour(0,249*256*256+214*256+191);
    +		
    +	}
    +	
    +}
    +
    +/****************************************************
    +*			
    +*	---鑷畾涔夊伐鍏锋爮娣诲姞鎸夐挳
    +*
    +/*****************************************************/
    +function SetCustomToolBtn(index,name){
    +	
    +	document.all.WebOffice1.SetCustomToolBtn(index,name);
    +	
    +}
    +/****************************************************
    +*			
    +*	---WebOffice宸ュ叿鏍忎簨浠跺鐞嗗嚱鏁
    +*
    +/*****************************************************/
    +function WebOffice1_NotifyToolBarClick(iIndex){
    +	if(iIndex>=32776){
    +			alert(iIndex+"鏂板姞鎸夐挳瑙﹀彂鐨勪簨浠跺彲鍦ㄨ繖閲屽啓鑷繁鐨勫姛鑳");
    +	}
    +
    +}
    +/****************************************************
    +*			
    +*	---闅愯棌office鑿滃崟鎴栧姛鑳藉尯
    +*
    +/*****************************************************/
    +
    +function hideAll(pcExcludeBar1,pcExcludeBar2,pcExcludeBar3,pcExcludeBar4){
    +	document.all.WebOffice1.HideMenuArea(pcExcludeBar1,pcExcludeBar2,pcExcludeBar3,pcExcludeBar4);
    +}
    +
    +function UnActiveExcel(){
    +	document.all.WebOffice1.UnActiveExcel();
    +}
    +
    +function GetFileBase64(){
    +	var v=document.all.WebOffice1.GetFileBase64("",0);
    +	document.all.FileBase64.value=v;
    +	document.all.CreateFile5.style.display="block";
    +	document.all.FileBase64.style.display="block";
    +	
    +	
    +}
    +function SaveBinaryFileFromBase64(){	
    +	var tempPath=document.all.WebOffice1.GetTempFilePath();//鑾峰彇涓存椂鏂囦欢璺緞
    +	var v=document.all.FileBase64.value;
    +	alert("鏂囨。瀛樺埌鏈湴涓存椂璺緞锛"+tempPath);
    +	document.all.WebOffice1.SaveBinaryFileFromBase64(tempPath,v);
    +	
    +} 
    +
    +function GetNowDateTime()
    + {
    +    var nowTime = new Date();
    +    var NowDateTime = nowTime.getFullYear() + "骞" + 
    +                        (nowTime.getMonth() + 1 )+ "鏈" + 
    +                        nowTime.getDate() + "鏃"  + 
    +                        " " +
    +                        nowTime.getHours() + ":" +
    +                        nowTime.getMinutes() + ":" +
    +                        nowTime.getSeconds() + "." +
    +                        nowTime.getMilliseconds();
    +   var NowDateTime = nowTime.toLocaleString();
    +   return NowDateTime;
    + }
    +//鏈鍚庝竴鏉′簨浠惰褰
    +
    +//璐熻矗鏇存柊鏄剧ず浜嬩欢
    +function WebOffice_Event_Flash(EventName)
    +{
    +//	alert(EventName);
    +	var vValue = "浜嬩欢:"+EventName+"\t\t瑙﹀彂浜:" +GetNowDateTime() + "\r\n"+document.all.commandtext.value;
    +	document.all.commandtext.value = vValue;
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/plug-in/webOffice/style.css b/src/main/webapp/plug-in/webOffice/style.css
    new file mode 100644
    index 00000000..ca86b0b2
    --- /dev/null
    +++ b/src/main/webapp/plug-in/webOffice/style.css
    @@ -0,0 +1,114 @@
    +.maintitle {
    +	FONT-SIZE: 13px; COLOR: #000000
    +}
    +.maintxt {
    +	FONT-SIZE: 12px
    +}
    +.maintxt A:visited {
    +	FONT-SIZE: 12px; COLOR: #000000; TEXT-DECORATION: none
    +}
    +.maintxt A:hover {
    +	FONT-SIZE: 12px; COLOR: #ff0000; TEXT-DECORATION: none
    +}
    +.maintxt A:link {
    +	COLOR: #000000; TEXT-DECORATION: none
    +}
    +.maintxt A:active {
    +	COLOR: #000000; TEXT-DECORATION: none
    +}
    +A:link {
    +	TEXT-DECORATION: none
    +}
    +A:visited {
    +	TEXT-DECORATION: none
    +}
    +A:hover {
    +	TEXT-DECORATION: none
    +}
    +A:active {
    +	TEXT-DECORATION: none
    +}
    +.btn {
    +	BORDER-RIGHT: #0066cc 1px solid; BORDER-TOP: #3366ff 1px solid; FONT-SIZE: 12px; PADDING-BOTTOM: 3px; MARGIN: 1px 0px 2px 3px; BORDER-LEFT: #0066cc 1px solid; WIDTH: 128px; COLOR: #ffffff; PADDING-TOP: 3px; BORDER-BOTTOM: #3366ff 1px solid; FONT-STYLE: normal; HEIGHT: 24px; BACKGROUND-COLOR: #638eef
    +}
    +.style2 {
    +	FONT-SIZE: 12px; COLOR: #ff0000; FONT-FAMILY: "瀹嬩綋", Arial, sans-serif
    +}
    +.style3 {
    +	FONT-SIZE: 12px; FONT-FAMILY: "瀹嬩綋", Arial, sans-serif
    +}
    +.redLink {
    +	COLOR: #ff0000
    +}
    +.topSide {
    +	BORDER-TOP: #3366cc 1px solid; BORDER-LEFT-WIDTH: 1px; BORDER-LEFT-COLOR: #3366cc; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: #3366cc; BORDER-RIGHT-WIDTH: 1px; BORDER-RIGHT-COLOR: #3366cc
    +}
    +.leftBorder {
    +	BORDER-TOP-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-LEFT: #0066ff 1px dashed; BORDER-RIGHT-WIDTH: 1px
    +}
    +.downSide {
    +	BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM: #0066ff 1px dashed; BORDER-RIGHT-WIDTH: 1px
    +}
    +.menuItem {
    +	BORDER-TOP-WIDTH: 1px; PADDING-RIGHT: 0px; PADDING-LEFT: 12px; BORDER-LEFT-WIDTH: 1px; BORDER-LEFT-COLOR: #0000cc; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: #0000cc; PADDING-BOTTOM: 0px; MARGIN: 1px 0px 0px; CURSOR: pointer; COLOR: #000066; BORDER-TOP-COLOR: #0000cc; PADDING-TOP: 1px; HEIGHT: 18px; BACKGROUND-COLOR: #e5ecf9; BORDER-RIGHT-WIDTH: 1px; BORDER-RIGHT-COLOR: #0000cc
    +}
    +.TableBlock {
    +	BORDER-RIGHT: #a55257 1px solid; BORDER-TOP: #a55257 1px solid; FONT-SIZE: 9pt; BORDER-LEFT: #a55257 1px solid; LINE-HEIGHT: 20px; BORDER-BOTTOM: #a55257 1px solid; BORDER-COLLAPSE: collapse
    +}
    +.TableBlock TD {
    +	PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; COLOR: #000000; PADDING-TOP: 3px
    +}
    +.TableBlock .TableHeader TD {
    +	BORDER-RIGHT: #a55257 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #a55257 1px solid; PADDING-LEFT: 0px; FONT-WEIGHT: bold; BACKGROUND: #e5ecf9; PADDING-BOTTOM: 0px; BORDER-LEFT: #a55257 1px solid; COLOR: #000; LINE-HEIGHT: 23px; PADDING-TOP: 0px; BORDER-BOTTOM: #a55257 1px solid
    +}
    +.TableBlock TD.TableHeader {
    +	BORDER-RIGHT: #a55257 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #a55257 1px solid; PADDING-LEFT: 0px; FONT-WEIGHT: bold; BACKGROUND: #e5ecf9; PADDING-BOTTOM: 0px; BORDER-LEFT: #a55257 1px solid; COLOR: #000; LINE-HEIGHT: 23px; PADDING-TOP: 0px; BORDER-BOTTOM: #a55257 1px solid
    +}
    +.TableBlock .TableLine1 TD {
    +	BORDER-RIGHT: #a55257 1px solid; BORDER-TOP: #a55257 1px solid; BACKGROUND: #f8f8f8
    +}
    +.TableBlock TD.TableLine1 {
    +	BORDER-RIGHT: #a55257 1px solid; BORDER-TOP: #a55257 1px solid; BACKGROUND: #f8f8f8
    +}
    +.TableBlock .TableLine2 TD {
    +	BORDER-RIGHT: #a55257 1px solid; BORDER-TOP: #a55257 1px solid; BACKGROUND: #ffffff
    +}
    +.TableBlock TD.TableLine2 {
    +	BORDER-RIGHT: #a55257 1px solid; BORDER-TOP: #a55257 1px solid; BACKGROUND: #ffffff
    +}
    +.TableBlock .TableData TD {
    +	BORDER-RIGHT: #a55257 1px solid; BORDER-TOP: #a55257 1px solid; BACKGROUND: #ffffff
    +}
    +.TableBlock TD.TableData {
    +	BORDER-RIGHT: #a55257 1px solid; BORDER-TOP: #a55257 1px solid; BACKGROUND: #ffffff
    +}
    +.TableBlock TD.leftTableData {
    +	BORDER-RIGHT: #a55257 1px solid; BORDER-TOP: #a55257 1px solid; BACKGROUND: #6699ff
    +}
    +.TableBlock .TableContent TD {
    +	BORDER-RIGHT: #a55257 1px solid; BORDER-TOP: #a55257 1px solid; BACKGROUND: #f0f0f0
    +}
    +.TableBlock TD.TableContent {
    +	BORDER-RIGHT: #a55257 1px solid; BORDER-TOP: #a55257 1px solid; BACKGROUND: #f0f0f0
    +}
    +.TableBlock .TableFooter TD {
    +	BORDER-RIGHT: #cfddea 1px solid; BORDER-TOP: #cfddea 1px solid; BACKGROUND: #fff; BORDER-LEFT: #cfddea 1px solid; BORDER-BOTTOM: #cfddea 1px solid
    +}
    +.TableBlock .TableControl TD {
    +	BORDER-RIGHT: #cfddea 1px solid; BORDER-TOP: #cfddea 1px solid; BACKGROUND: #fff; BORDER-LEFT: #cfddea 1px solid; BORDER-BOTTOM: #cfddea 1px solid
    +}
    +.TableBlock TD.TableFooter {
    +	BORDER-RIGHT: #cfddea 1px solid; BORDER-TOP: #cfddea 1px solid; BACKGROUND: #fff; BORDER-LEFT: #cfddea 1px solid; BORDER-BOTTOM: #cfddea 1px solid
    +}
    +.TableBlock TD.TableControl {
    +	BORDER-RIGHT: #cfddea 1px solid; BORDER-TOP: #cfddea 1px solid; BACKGROUND: #fff; BORDER-LEFT: #cfddea 1px solid; BORDER-BOTTOM: #cfddea 1px solid
    +}
    +.TableBlock .TableRed TD {
    +	BACKGROUND: #ffebeb
    +}
    +.TableBlock TD.TableRed {
    +	BACKGROUND: #ffebeb
    +}
    +BODY {
    +	FONT-SIZE: 12px; FONT-FAMILY: arial, 瀹嬩綋, serif
    +}
    diff --git a/src/main/webapp/plug-in/webOffice/webOffice-sample.html b/src/main/webapp/plug-in/webOffice/webOffice-sample.html
    new file mode 100644
    index 00000000..d39a549c
    --- /dev/null
    +++ b/src/main/webapp/plug-in/webOffice/webOffice-sample.html
    @@ -0,0 +1,262 @@
    +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    +
    +<HTML>
    +<HEAD>
    +<TITLE>weboffice婕旂ず椤甸潰</TITLE>
    +<META http-equiv=Content-Type content="text/html; charset=utf-8">
    +<LINK href="style.css" type=text/css rel=stylesheet>
    +<SCRIPT src="./main.js" type=text/javascript></SCRIPT>
    +<!-- --------------------=== 璋冪敤Weboffice鍒濆鍖栨柟娉 ===--------------------- -->
    +<SCRIPT language=javascript event=NotifyCtrlReady for=WebOffice1>
    +/****************************************************
    +*
    +*	鍦ㄨ杞藉畬Weboffice(鎵ц<object>...</object>)
    +*	鎺т欢鍚庢墽琛 "WebOffice1_NotifyCtrlReady"鏂规硶
    +*
    +****************************************************/
    +    WebOffice_Event_Flash("NotifyCtrlReady");
    +	WebOffice1_NotifyCtrlReady()
    +</SCRIPT>
    +
    +<SCRIPT language=javascript event=NotifyWordEvent(eventname) for=WebOffice1>WebOffice_Event_Flash("NotifyWordEvent");
    + WebOffice1_NotifyWordEvent(eventname);
    + 
    +</SCRIPT>
    +
    +<SCRIPT language=javascript event=NotifyToolBarClick(iIndex) for=WebOffice1>  WebOffice_Event_Flash("NotifyToolBarClick");
    + WebOffice1_NotifyToolBarClick(iIndex);
    +</SCRIPT>
    +
    +<SCRIPT language=javascript>
    +/****************************************************
    +*
    +*		鎺т欢鍒濆鍖朩ebOffice鏂规硶
    +*
    +****************************************************/
    +function WebOffice1_NotifyCtrlReady() {
    +	document.all.WebOffice1.SetWindowText("鎺堟潈XX(鍙氳繃鎺ュ彛鑷畾涔)", 0);
    +	document.all.WebOffice1.OptionFlag |= 128;
    +	// 鏂板缓鏂囨。
    +	//document.all.WebOffice1.LoadOriginalFile("", "doc");
    +	spnWebOfficeInfo.innerText="----   鎮ㄧ數鑴戜笂瀹夎鐨刉ebOffice鐗堟湰涓:V" + document.all.WebOffice1.GetOcxVersion() +"\t\t\t鏈疄渚嬫槸鏍规嵁鐗堟湰V6044缂栧啓";
    +}
    +var flag=false;
    +function menuOnClick(id){
    +	var id=document.getElementById(id);
    +	var dis=id.style.display;
    +	if(dis!="none"){
    +		id.style.display="none";
    +		
    +	}else{
    +		id.style.display="block";
    +	}
    +}
    +/****************************************************
    +*
    +*		鎺ユ敹office浜嬩欢澶勭悊鏂规硶
    +*
    +****************************************************/
    +var vNoCopy = 0;
    +var vNoPrint = 0;
    +var vNoSave = 0;
    +var vClose=0;
    +function no_copy(){
    +	vNoCopy = 1;
    +}
    +function yes_copy(){
    +	vNoCopy = 0;
    +}
    +
    +
    +function no_print(){
    +	vNoPrint = 1;
    +}
    +function yes_print(){
    +	vNoPrint = 0;
    +}
    +
    +
    +function no_save(){
    +	vNoSave = 1;
    +}
    +function yes_save(){
    +	vNoSave = 0;
    +}
    +function EnableClose(flag){
    + vClose=flag;
    +}
    +function CloseWord(){
    +	
    +  document.all.WebOffice1.CloseDoc(0); 
    +}
    +
    +function WebOffice1_NotifyWordEvent(eventname) {
    +	if(eventname=="DocumentBeforeSave"){
    +		if(vNoSave){
    +			document.all.WebOffice1.lContinue = 0;
    +			alert("姝ゆ枃妗e凡缁忕姝繚瀛");
    +		}else{
    +			document.all.WebOffice1.lContinue = 1;
    +		}
    +	}else if(eventname=="DocumentBeforePrint"){
    +		if(vNoPrint){
    +			document.all.WebOffice1.lContinue = 0;
    +			alert("姝ゆ枃妗e凡缁忕姝㈡墦鍗");
    +		}else{
    +			document.all.WebOffice1.lContinue = 1;
    +		}
    +	}else if(eventname=="WindowSelectionChange"){
    +		if(vNoCopy){
    +			document.all.WebOffice1.lContinue = 0;
    +			//alert("姝ゆ枃妗e凡缁忕姝㈠鍒");
    +		}else{
    +			document.all.WebOffice1.lContinue = 1;
    +		}
    +	}else   if(eventname =="DocumentBeforeClose"){
    +	    if(vClose==0){
    +	    	document.all.WebOffice1.lContinue=0;
    +	    } else{
    +	    	//alert("word");
    +		    document.all.WebOffice1.lContinue = 1;
    +		  }
    + }
    +	//alert(eventname); 
    +}
    +</SCRIPT>
    +<META content="MSHTML 6.00.2900.5921" name=GENERATOR>
    +</HEAD>
    +<BODY style="BACKGROUND: #ccc" onunload="return window_onunload()">
    +	<CENTER>
    +		<DIV style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #fff; PADDING-BOTTOM: 0px; MARGIN: -10px 0px 0px; WIDTH: 1024px; PADDING-TOP: 10px; HEIGHT: 750px" align=center>
    +			<FORM name=myform>
    +				<TABLE class=TableBlock width="90%">
    +					<TBODY>
    +						<TR class=TableHeader>
    +							<TD colSpan=2 valign=middle><font size=3> WebOffice婕旂ず椤甸潰(HTML)</font> <font color="#ff0000" size=-1><Span ID=spnWebOfficeInfo align="right"></Span>
    +							</font>
    +							</TD>
    +						</TR>
    +						<tr>
    +							<td width="100">浜嬩欢鍒楄〃锛</td>
    +							<td><textarea name="commandtext" cols=100 rows=3></textarea><br></td>
    +						</tr>
    +					</TBODY>
    +				</TABLE>
    +				<BR>
    +				<TABLE class=TableBlock width="90%">
    +					<TBODY>
    +						<TR>
    +							<TD class=leftTableData vAlign=top width="15%">
    +								<DIV class=menuItem onclick="menuOnClick('chc')">甯哥敤鎺ュ彛璋冪敤</DIV>
    +								<DIV id=chc style="DISPLAY: none">
    +									<!-- ---------------=== 璇ュ鏂囦欢鏍煎紡鐨剉alue涓嶅彲浠ヨ嚜瀹氫箟 ===------------------------- -->
    +									<SELECT id=doctype size=1 name=doctype>
    +										<OPTION value=doc selected>Word</OPTION>
    +										<OPTION value=xls>Excel</OPTION>
    +										<OPTION value=wps>wps</OPTION>
    +									</SELECT> <INPUT class=btn id=CreateFile onclick=newDoc() type=button value=鏂板缓鏂囨。 name=CreateFile> <INPUT class=btn onclick="return docOpen()" type=button value=鎵撳紑鏈湴鏂囦欢 name=button> <INPUT class=btn id=showPrint
    +										onclick=showPrintDialog() type=button value=鏄剧ず瀵硅瘽妗 name=CreateFile4> <INPUT class=btn id=zhiPrints onclick=zhiPrint() type=button value=鐩存帴鎵撳嵃 name=zhiPrints> <INPUT class=btn id=CreateFile2 onclick=newSave()
    +										type=button value=淇濆瓨 name=CreateFile2> <INPUT class=btn id=CreateFile3 onclick=SaveAsTo() type=button value=鍙﹀瓨涓 name=CreateFile3>
    +
    +								</DIV>
    +								<DIV class=menuItem onclick="menuOnClick('docSafe')">鏂囨。瀹夊叏璁剧疆</DIV>
    +								<DIV id=docSafe style="DISPLAY: none">
    +									淇濇姢瀵嗙爜锛 <INPUT style="WIDTH: 74px" maxLength=10 value=Password name=docPwd> <INPUT class=btn onclick="return ProtectFull()" type=button value=淇濇姢鏂囨。> <INPUT class=btn onclick="return UnProtect()" type=button value=瑙i櫎淇濇姢
    +										name=button3> <INPUT class=btn onclick="return notPrint()" type=button value=绂佺敤鎵撳嵃> <INPUT class=btn onclick="return okPrint()" type=button value=鍚敤鎵撳嵃 name=button3> <INPUT class=btn
    +										onclick="return notSave()" type=button value=绂佹淇濆瓨 name=button10> <INPUT class=btn onclick="return okSave()" type=button value=鍏佽淇濆瓨 name=button32> <INPUT class=btn onclick="return notCopy()" type=button value=绂佹澶嶅埗
    +										name=button11> <INPUT class=btn onclick="return okCopy()" type=button value=鍏佽澶嶅埗 name=button33> <INPUT class=btn onclick="return notDrag()" type=button value=绂佹鎷栧姩 name=but11> <INPUT class=btn
    +										onclick="return okDrag()" type=button value=鍏佽鎷栧姩 name=but33> 浜嬩欢鎺у埗鏂瑰紡锛 <INPUT class=btn onclick="return no_print()" type=button value=绂佺敤鎵撳嵃> <INPUT class=btn onclick="return yes_print()" type=button value=鍚敤鎵撳嵃
    +										name=button3> <INPUT class=btn onclick="return no_save()" type=button value=绂佹淇濆瓨 name=button10> <INPUT class=btn onclick="return yes_save()" type=button value=鍏佽淇濆瓨 name=button32> <INPUT class=btn
    +										onclick="return no_copy()" type=button value=绂佹澶嶅埗 name=button11> <INPUT class=btn onclick="return yes_copy()" type=button value=鍏佽澶嶅埗 name=button33>
    +								</DIV>
    +								<DIV class=menuItem onclick="menuOnClick('recension')">淇鎿嶄綔</DIV>
    +								<DIV id=recension style="DISPLAY: none">
    +									<INPUT style="WIDTH: 74px" maxLength=10 value=Test name=UserName> <INPUT class=btn onclick="return SetUserName()" type=button value=璁剧疆鐢ㄦ埛 name=button2> <INPUT class=btn onclick="return ProtectRevision()" type=button
    +										value=淇鏂囨。 name=button4> <INPUT class=btn onclick="return ExitRevisions()" type=button value=閫鍑轰慨璁 name=button42> <INPUT class=btn onclick="return ShowRevisions()" type=button value=鏄剧ず淇 name=button5> <INPUT
    +										class=btn onclick="return UnShowRevisions()" type=button value=闅愯棌淇 name=button6> <INPUT class=btn onclick="return AcceptAllRevisions()" type=button value=鎺ュ彈鎵鏈変慨璁 name=button7> <INPUT class=btn
    +										onclick="return unAcceptAllRevisions()" type=button value=鎷掔粷鎵鏈変慨璁 name=button72> <INPUT class=btn onclick="return GetRevAllInfo()" type=button value=鑾峰彇淇淇℃伅 name=button922>
    +								</DIV>
    +								<DIV class=menuItem onclick="menuOnClick('markset')">涔︾鎿嶄綔</DIV>
    +								<DIV id=markset style="DISPLAY: none">
    +									<INPUT class=btn onclick="return addBookmark()" type=button value=璁剧疆涔︾ name=button8> <INPUT class=btn onclick="return taohong()" type=button value=濂楃孩 name=button8>
    +								</DIV>
    +								<DIV class=menuItem onclick="menuOnClick('off03menu')">Office03鑿滃崟璁剧疆</DIV>
    +								<DIV id=off03menu style="DISPLAY: none">
    +									<INPUT class=btn onclick="return hideAll('','','','')" type=button value=闅愯棌鎵鏈 name=button12> <INPUT class=btn onclick="return notMenu()" type=button value=闅愯棌鑿滃崟 name=button12> <INPUT class=btn
    +										onclick="return okMenu()" type=button value=鏄剧ず鑿滃崟 name=button12> <INPUT class=btn onclick="return notOfter()" type=button value=闅愯棌甯哥敤 name=button12> <INPUT class=btn onclick="return okOfter()" type=button value=鏄剧ず甯哥敤
    +										name=button12> <INPUT class=btn onclick="return notFormat()" type=button value=闅愯棌鏍煎紡 name=button12> <INPUT class=btn onclick="return okFormat()" type=button value=鏄剧ず鏍煎紡 name=button12>
    +
    +								</DIV>
    +								<DIV class=menuItem onclick="menuOnClick('off03menuItem')">Office03鑿滃崟椤</DIV>
    +								<DIV id=off03menuItem style="DISPLAY: none">
    +									<INPUT class=btn onclick="return hideFileMenu()" type=button value=闅愯棌鏂囦欢 name=button122> <INPUT class=btn onclick="return showFileMenu()" type=button value=鏄剧ず鏂囦欢 name=button123> <INPUT class=btn
    +										onclick="return hideEditMenu()" type=button value=闅愯棌缂栬緫 name=button124> <INPUT class=btn onclick="return showEditMenu()" type=button value=鏄剧ず缂栬緫 name=button125>
    +								</DIV>
    +								<DIV class=menuItem onclick="menuOnClick('off03tool')">Office03宸ュ叿鏍忛」</DIV>
    +								<DIV id=off03tool style="DISPLAY: none">
    +									<INPUT class=btn onclick="return hideNewItem()" type=button value=闅愯棌鏂板缓 name=button1222> <INPUT class=btn onclick="return showNewItem()" type=button value=鏄剧ず鏂板缓 name=button1232> <INPUT class=btn
    +										onclick="return hideOpenItem()" type=button value=闅愯棌鎵撳紑 name=button1242> <INPUT class=btn onclick="return showOpenItem()" type=button value=鏄剧ず鎵撳紑 name=button1252> <INPUT class=btn onclick="return hideSaveItem()"
    +										type=button value=闅愯棌淇濆瓨 name=button1242> <INPUT class=btn onclick="return showSaveItem()" type=button value=鏄剧ず淇濆瓨 name=button1252>
    +								</DIV>
    +								<DIV class=menuItem onclick="menuOnClick('off07menu')">Office07鑿滃崟璁剧疆</DIV>
    +								<DIV id=off07menu style="DISPLAY: none">
    +									<INPUT class=btn onclick="return hideAll('hideall','','','')" type=button value=闅愯棌鍏ㄩ儴 name=button12222> <INPUT class=btn onclick="return hideAll('showmenu','','','')" type=button value=鏄剧ず鍏ㄩ儴 name=button12222> <INPUT
    +										class=btn onclick="return hideAll('','','','')" type=button value=闅愯棌鍔熻兘鍖 name=button12222> <INPUT class=btn onclick="return hideAll('show','','','')" type=button value=鏄剧ず鍔熻兘鍖 name=button12222> <INPUT class=btn
    +										onclick="return beginMenu_onclick()" type=button value=闅愯棌寮濮 name=button12222> <INPUT class=btn onclick="return insertMenu_onclick()" type=button value=闅愯棌鎻掑叆 name=button12322> <INPUT class=btn
    +										onclick="return pageMenu_onclick()" type=button value=闅愯棌椤甸潰甯冨眬 name=button12422> <INPUT class=btn onclick="return adducMenu_onclick()" type=button value=闅愯棌寮曠敤 name=button12522> <INPUT class=btn
    +										onclick="return emailMenu_onclick()" type=button value=闅愯棌閭欢 name=button12422> <INPUT class=btn onclick="return checkMenu_onclick()" type=button value=闅愯棌瀹¢槄 name=button12522> <INPUT class=btn
    +										onclick="return viewMenu_onclick()" type=button value=闅愯棌瑙嗗浘 name=button125222> <INPUT class=btn onclick="return empolderMenu_onclick()" type=button value=闅愯棌寮鍙戝伐鍏 name=button124222> <INPUT class=btn
    +										onclick="return loadMenu_onclick()" type=button value=闅愯棌鍔犺浇椤 name=button125222> <INPUT class=btn onclick="return allHideMenu_onclick()" type=button value=闅愯棌鍏ㄩ儴 name=button1242222> <INPUT class=btn
    +										onclick="return nullityCopy_onclick()" type=button value=澶嶅埗鏃犳晥 name=button12422222> <INPUT class=btn onclick="return nullityAffix_onclick()" type=button value=绮樿创鏃犳晥 name=button12422223> <INPUT class=btn
    +										onclick="return affixCopy_onclick()" type=button value=鎭㈠ name=button1252222>
    +								</DIV>
    +								<DIV class=menuItem onclick="menuOnClick('webofficeTool')">weboffice宸ュ叿鏍</DIV>
    +								<DIV id=webofficeTool style="DISPLAY: none">
    +									<INPUT language=javascript class=btn onclick="return bToolBar_onclick()" type=button value=宸ュ叿鏍(闅/鏄) name=bToolBar> <INPUT language=javascript class=btn onclick="return bToolBar_New_onclick()" type=button value=鏂板缓鏂囨。(闅/鏄)
    +										name=bToolBar_New> <INPUT language=javascript class=btn onclick="return bToolBar_Open_onclick()" type=button value=鎵撳紑鏂囨。(闅/鏄) name=bToolBar_Open> <INPUT language=javascript class=btn
    +										onclick="return bToolBar_Save_onclick()" type=button value=淇濆瓨鏂囨。(闅/鏄) name=bToolBar_Save>
    +								</DIV>
    +								<DIV class=menuItem onclick="menuOnClick('tools')">鑷畾涔夊伐鍏锋爮</DIV>
    +								<DIV id=tools style="DISPLAY: none">
    +									<INPUT class=btn onclick="return SetCustomToolBtn(0,'鎵╁睍閽竴')" type=button value=娣诲姞鎵╁睍閽竴 name=EnableClose1> <INPUT class=btn onclick="return SetCustomToolBtn(1,'鎵╁睍閽簩')" type=button value=娣诲姞鎵╁睍閽簩 name=EnableClose1> <INPUT
    +										class=btn onclick="return SetCustomToolBtn(2,'鎵╁睍閽笁')" type=button value=娣诲姞鎵╁睍閽笁 name=EnableClose1> <INPUT class=btn onclick="return SetCustomToolBtn(3,'鎵╁睍閽洓')" type=button value=娣诲姞鎵╁睍閽洓 name=EnableClose1> <INPUT
    +										class=btn onclick="return SetCustomToolBtn(4,'鎵╁睍閽簲')" type=button value=娣诲姞鎵╁睍閽簲 name=EnableClose1>
    +
    +								</DIV>
    +
    +								<DIV class=menuItem onclick="menuOnClick('word')">灞忚斀word鍏抽棴鎸夐挳</DIV>
    +								<DIV id=word style="DISPLAY: none">
    +									<INPUT class=btn onclick="return EnableClose(0)" type=button value=绂佺敤Word鍏抽棴 name=EnableClose1> <INPUT class=btn onclick="return EnableClose(1)" type=button value=鍚敤Word鍏抽棴 name=EnableClose2> <INPUT class=btn
    +										onclick="return CloseWord()" type=button value=鍏抽棴Word name=closeWord>
    +								</DIV>
    +								<DIV class=menuItem onclick="menuOnClick('face')">鎹㈣偆</DIV>
    +								<DIV id=face style="DISPLAY: none">
    +									<INPUT class=btn onclick="return ChangeFace(1)" type=button value=娓╅Θ娴极 name=EnableClose1> <INPUT class=btn onclick="return ChangeFace(2)" type=button value=娣辨矇鍎掗泤 name=EnableClose1> <INPUT class=btn
    +										onclick="return ChangeFace(3)" type=button value=office椋庢牸 name=EnableClose1>
    +								</DIV>
    +
    +								<DIV class=menuItem onclick="menuOnClick('base64')">base64</DIV>
    +								<DIV id=base64 style="DISPLAY: none">
    +									<INPUT class=btn id=CreateFile4 onclick=GetFileBase64() type=button value=鑾峰彇鏂囨。鐨刡ase64鍊 name=CreateFile4> <INPUT class=btn id=CreateFile5 onclick=SaveBinaryFileFromBase64() type=button value=灏哹ase64鍊煎瓨鍥炴枃浠 name=CreateFile5>
    +									<textarea name="FileBase64" rows="10" cols="16"></textarea>
    +								</DIV>
    +
    +								<DIV class=menuItem onclick="menuOnClick('other')">鍏跺畠</DIV>
    +								<DIV id=other style="DISPLAY: none">
    +									<INPUT language=javascript class=btn onclick="return bToolBar_FullScreen_onclick()" type=button value="鍏  灞" name=bToolBar_FullScreen> <INPUT class=btn id=CreateFile32 onclick=TestVBA() type=button value=VBA璋冪敤
    +										name=CreateFile32> <INPUT class=btn onclick="return UnActiveExcel()" type=button value=閫鍑篍xcel缂栬緫鐘舵 name=EnableClose1>
    +								</DIV>
    +							</TD>
    +							<TD class=TableData vAlign=top width="85%">
    +								<!-- -----------------------------== 瑁呰浇weboffice鎺т欢 ==--------------------------------- -->
    +								<SCRIPT src="LoadWebOffice.js"></SCRIPT>
    +								<!-- --------------------------------== 缁撴潫瑁呰浇鎺т欢 ==----------------------------------- -->
    +							</TD>
    +						</TR>
    +					</TBODY>
    +				</TABLE>
    +			</FORM>
    +		</DIV>
    +	</CENTER>
    +</BODY>
    +</HTML>
    diff --git a/src/main/webapp/plug-in/webOffice/weboffice_v6.0.5.0.cab b/src/main/webapp/plug-in/webOffice/weboffice_v6.0.5.0.cab
    new file mode 100644
    index 00000000..ad66e111
    Binary files /dev/null and b/src/main/webapp/plug-in/webOffice/weboffice_v6.0.5.0.cab differ
    diff --git a/src/main/webapp/swftools/pdf2swf.exe b/src/main/webapp/swftools/pdf2swf.exe
    new file mode 100644
    index 00000000..b6a093e2
    Binary files /dev/null and b/src/main/webapp/swftools/pdf2swf.exe differ
    diff --git a/src/main/webapp/upload/Customize.png b/src/main/webapp/upload/Customize.png
    new file mode 100644
    index 00000000..c17fe55a
    Binary files /dev/null and b/src/main/webapp/upload/Customize.png differ
    diff --git a/src/main/webapp/upload/MacGimp.png b/src/main/webapp/upload/MacGimp.png
    new file mode 100644
    index 00000000..4103da01
    Binary files /dev/null and b/src/main/webapp/upload/MacGimp.png differ
    diff --git a/src/main/webapp/upload/Teacher/pic3345280233.PNG b/src/main/webapp/upload/Teacher/pic3345280233.PNG
    new file mode 100644
    index 00000000..c14310db
    Binary files /dev/null and b/src/main/webapp/upload/Teacher/pic3345280233.PNG differ
    diff --git a/src/main/webapp/upload/files/20140125183956JZyya9tU.odt b/src/main/webapp/upload/files/20140125183956JZyya9tU.odt
    new file mode 100644
    index 00000000..75c8cbd8
    --- /dev/null
    +++ b/src/main/webapp/upload/files/20140125183956JZyya9tU.odt
    @@ -0,0 +1,24 @@
    +1.mvc框架编写
    +2.jsp-servlet原理
    +链接: http://pan.baidu.com/s/1i3wVYBz 密码: l5ej
    +3.annocation
    +4.反射和动态代理
    +链接: http://pan.baidu.com/s/1sjB8LUt 密码: iuhx
    +4.模板语言使用
    +5.linux学习
    +6.jquery视频
    +链接: http://pan.baidu.com/s/1o6DGN1o 密码: thcm
    +7.maven学习
    +链接: http://pan.baidu.com/s/1hq7hyPA 密码: 9rxc
    +8.设计模式
    +链接: http://pan.baidu.com/s/1qWGu7EG 密码: e3hi
    +9.原型设计axuce
    +链接: http://pan.baidu.com/s/1hqHWNje 密码: mv4d
    +10.mogodb学习
    +链接: http://pan.baidu.com/s/1ntAvayP 密码: cx9i
    +11.oracle
    +http://yun.baidu.com/share/link?shareid=4269886277&uk=2668473880
    +12.linux实战
    +http://yun.baidu.com/share/link?shareid=909807252&uk=2668473880
    +13.工作流入门
    +http://yun.baidu.com/share/link?shareid=518512274&uk=2668473880
    \ No newline at end of file
    diff --git a/src/main/webapp/upload/files/20140125183956JZyya9tU.txt b/src/main/webapp/upload/files/20140125183956JZyya9tU.txt
    new file mode 100644
    index 00000000..75c8cbd8
    --- /dev/null
    +++ b/src/main/webapp/upload/files/20140125183956JZyya9tU.txt
    @@ -0,0 +1,24 @@
    +1.mvc框架编写
    +2.jsp-servlet原理
    +链接: http://pan.baidu.com/s/1i3wVYBz 密码: l5ej
    +3.annocation
    +4.反射和动态代理
    +链接: http://pan.baidu.com/s/1sjB8LUt 密码: iuhx
    +4.模板语言使用
    +5.linux学习
    +6.jquery视频
    +链接: http://pan.baidu.com/s/1o6DGN1o 密码: thcm
    +7.maven学习
    +链接: http://pan.baidu.com/s/1hq7hyPA 密码: 9rxc
    +8.设计模式
    +链接: http://pan.baidu.com/s/1qWGu7EG 密码: e3hi
    +9.原型设计axuce
    +链接: http://pan.baidu.com/s/1hqHWNje 密码: mv4d
    +10.mogodb学习
    +链接: http://pan.baidu.com/s/1ntAvayP 密码: cx9i
    +11.oracle
    +http://yun.baidu.com/share/link?shareid=4269886277&uk=2668473880
    +12.linux实战
    +http://yun.baidu.com/share/link?shareid=909807252&uk=2668473880
    +13.工作流入门
    +http://yun.baidu.com/share/link?shareid=518512274&uk=2668473880
    \ No newline at end of file
    diff --git a/src/main/webapp/upload/forms/20150522233106dmSB58vX.doc b/src/main/webapp/upload/forms/20150522233106dmSB58vX.doc
    new file mode 100644
    index 00000000..9a1f0b21
    Binary files /dev/null and b/src/main/webapp/upload/forms/20150522233106dmSB58vX.doc differ
    diff --git a/src/main/webapp/upload/forms/20150522233106dmSB58vX.ftl b/src/main/webapp/upload/forms/20150522233106dmSB58vX.ftl
    new file mode 100644
    index 00000000..5ec53c00
    --- /dev/null
    +++ b/src/main/webapp/upload/forms/20150522233106dmSB58vX.ftl
    @@ -0,0 +1,96 @@
    +<html
    
    
    +xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
    >
    +
    +
    +
    +
    +
    +<script type="text/javascript" src="plug-in/jquery/jquery-1.8.3.js"></script><script type="text/javascript" src="plug-in/tools/dataformat.js"></script><link id="easyuiTheme" rel="stylesheet" href="plug-in/easyui/themes/default/easyui.css" type="text/css"></link><link rel="stylesheet" href="plug-in/easyui/themes/icon.css" type="text/css"></link><link rel="stylesheet" type="text/css" href="plug-in/accordion/css/accordion.css"></link><script type="text/javascript" src="plug-in/easyui/jquery.easyui.min.1.3.2.js"></script><script type="text/javascript" src="plug-in/easyui/locale/zh-cn.js"></script><script type="text/javascript" src="plug-in/tools/syUtil.js"></script><script type="text/javascript" src="plug-in/My97DatePicker/WdatePicker.js"></script><script type="text/javascript" src="plug-in/lhgDialog/lhgdialog.min.js"></script><script type="text/javascript">$(function(){$("#formobj").Validform({tiptype:4,btnSubmit:"#btn_sub",btnReset:"#btn_reset",ajaxPost:true,usePlugin:{passwordstrength:{minLen:6,maxLen:18,trigger:function(obj,error){if(error){obj.parent().next().find(".Validform_checktip").show();obj.find(".passwordStrength").hide();}else{$(".passwordStrength").show();obj.parent().next().find(".Validform_checktip").hide();}}}},callback:function(data){if(data.success==true){if(!neibuClickFlag){var win = frameElement.api.opener;frameElement.api.close();win.tip(data.msg);win.reloadTable();}else {alert(data.msg)}}else{if(data.responseText==''||data.responseText==undefined)$("#formobj").html(data.msg);else $("#formobj").html(data.responseText); return false;}if(!neibuClickFlag){var win = frameElement.api.opener;win.reloadTable();}}});});</script><script type="text/javascript" src="plug-in/tools/curdtools_zh-cn.js"></script><script type="text/javascript" src="plug-in/tools/easyuiextend.js"></script><link rel="stylesheet" href="plug-in/Validform/css/style.css" type="text/css"/><link rel="stylesheet" href="plug-in/Validform/css/tablefrom.css" type="text/css"/><script type="text/javascript" src="plug-in/Validform/js/Validform_v5.3.1_min_zh-cn.js"></script><script type="text/javascript" src="plug-in/Validform/js/Validform_Datatype_zh-cn.js"></script><script type="text/javascript" src="plug-in/Validform/js/datatype_zh-cn.js"></script><script type="text/javascript" src="plug-in/Validform/plugin/passwordStrength/passwordStrength-min.js"></script><style>body{font-size:12px;}table{border: 1px solid #000000;padding:0; margin:0 auto;border-collapse: collapse;width:100%;align:right;}td {border: 1px solid #000000;background: #fff;font-size:12px;padding: 3px 3px 3px 8px;color: #000000;word-break: keep-all;}</style>
    +<body  >
    +
    +<div  >
    +
    +<p  align=center >请假单</p>
    +
    +<form action="cgFormBuildController.do?saveOrUpdate" id="formobj" name="formobj" method="post">
    +<input type="hidden" name="tableName" value="${tableName?if_exists?html}"/>
    +<input type="hidden" name="id" value="${id?if_exists?html}"/>
    +<input type="hidden" id="btn_sub" class="btn_sub"/>
    +#{jform_hidden_field}<table  border=1 cellspacing=0 cellpadding=0
    + >
    + <tr >
    +  <td width=142  >
    +  <p  >请假标题</p>
    +  </td>
    +  <td width=142  >
    +  <p  >#{title}</p>
    +  </td>
    +  <td width=142  >
    +  <p  >请假开始时间</p>
    +  </td>
    +  <td width=142  >
    +  <p  >#{begindate}</p>
    +  </td>
    + </tr>
    + <tr >
    +  <td width=142  >
    +  <p  >请假人</p>
    +  </td>
    +  <td width=142  >
    +  <p  >#{people}</p>
    +  </td>
    +  <td width=142  >
    +  <p  >请假结束时间</p>
    +  </td>
    +  <td width=142  >
    +  <p  >#{enddate}</p>
    +  </td>
    + </tr>
    + <tr >
    +  <td width=142  >
    +  <p  >性别</p>
    +  </td>
    +  <td width=142  >
    +  <p  >#{sex}</p>
    +  </td>
    +  <td width=142  >
    +  <p  >所属部门</p>
    +  </td>
    +  <td width=142  >
    +  <p  >#{hol_dept}</p>
    +  </td>
    + </tr>
    + <tr >
    +  <td width=142  >
    +  <p  >请假原因</p>
    +  </td>
    +  <td width=426 colspan=3  >
    +  <p  >#{hol_reson}</p>
    +  </td>
    + </tr>
    + <tr >
    +  <td width=142  >
    +  <p  >部门审批人</p>
    +  </td>
    +  <td width=426 colspan=3  >
    +  <p  >#{dep_leader}</p>
    +  </td>
    + </tr>
    + <tr >
    +  <td width=142  >
    +  <p  >部门审批意见</p>
    +  </td>
    +  <td width=426 colspan=3  >
    +  <p  >#{content}</p>
    +  </td>
    + </tr>
    +</table>
    +</form>
    +
    +<p ></p>
    +
    +</div>
    +
    +</body>
    +
    +</html>
    diff --git a/src/main/webapp/upload/forms/20150522233106dmSB58vX.html b/src/main/webapp/upload/forms/20150522233106dmSB58vX.html
    new file mode 100644
    index 00000000..732ad9dc
    --- /dev/null
    +++ b/src/main/webapp/upload/forms/20150522233106dmSB58vX.html
    @@ -0,0 +1,631 @@
    +<html xmlns:v="urn:schemas-microsoft-com:vml"
    +xmlns:o="urn:schemas-microsoft-com:office:office"
    +xmlns:w="urn:schemas-microsoft-com:office:word"
    +xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
    +xmlns="http://www.w3.org/TR/REC-html40">
    +
    +<head>
    +<meta http-equiv=Content-Type content="text/html; charset=gb2312">
    +<meta name=ProgId content=Word.Document>
    +<meta name=Generator content="Microsoft Word 12">
    +<meta name=Originator content="Microsoft Word 12">
    +<link rel=File-List href="20150522233106dmSB58vX.files/filelist.xml">
    +<!--[if gte mso 9]><xml>
    + <o:DocumentProperties>
    +  <o:Author>00704873</o:Author>
    +  <o:LastAuthor>zhoujf</o:LastAuthor>
    +  <o:Revision>2</o:Revision>
    +  <o:TotalTime>2</o:TotalTime>
    +  <o:Created>2015-05-22T15:31:00Z</o:Created>
    +  <o:LastSaved>2015-05-22T15:31:00Z</o:LastSaved>
    +  <o:Pages>1</o:Pages>
    +  <o:Words>23</o:Words>
    +  <o:Characters>137</o:Characters>
    +  <o:Company>Lenovo (Beijing) Limited</o:Company>
    +  <o:Lines>1</o:Lines>
    +  <o:Paragraphs>1</o:Paragraphs>
    +  <o:CharactersWithSpaces>159</o:CharactersWithSpaces>
    +  <o:Version>12.00</o:Version>
    + </o:DocumentProperties>
    +</xml><![endif]-->
    +<link rel=themeData href="20150522233106dmSB58vX.files/themedata.thmx">
    +<link rel=colorSchemeMapping
    +href="20150522233106dmSB58vX.files/colorschememapping.xml">
    +<!--[if gte mso 9]><xml>
    + <w:WordDocument>
    +  <w:TrackMoves>false</w:TrackMoves>
    +  <w:TrackFormatting/>
    +  <w:PunctuationKerning/>
    +  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
    +  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
    +  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
    +  <w:ValidateAgainstSchemas/>
    +  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
    +  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
    +  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
    +  <w:DoNotPromoteQF/>
    +  <w:LidThemeOther>EN-US</w:LidThemeOther>
    +  <w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
    +  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
    +  <w:Compatibility>
    +   <w:SpaceForUL/>
    +   <w:BalanceSingleByteDoubleByteWidth/>
    +   <w:DoNotLeaveBackslashAlone/>
    +   <w:ULTrailSpace/>
    +   <w:DoNotExpandShiftReturn/>
    +   <w:AdjustLineHeightInTable/>
    +   <w:BreakWrappedTables/>
    +   <w:SnapToGridInCell/>
    +   <w:WrapTextWithPunct/>
    +   <w:UseAsianBreakRules/>
    +   <w:DontGrowAutofit/>
    +   <w:DontUseIndentAsNumberingTabStop/>
    +   <w:FELineBreak11/>
    +   <w:WW11IndentRules/>
    +   <w:DontAutofitConstrainedTables/>
    +   <w:AutofitLikeWW11/>
    +   <w:HangulWidthLikeWW11/>
    +   <w:UseNormalStyleForList/>
    +   <w:UseFELayout/>
    +  </w:Compatibility>
    +  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
    +  <m:mathPr>
    +   <m:mathFont m:val="Cambria Math"/>
    +   <m:brkBin m:val="before"/>
    +   <m:brkBinSub m:val="--"/>
    +   <m:smallFrac m:val="off"/>
    +   <m:dispDef/>
    +   <m:lMargin m:val="0"/>
    +   <m:rMargin m:val="0"/>
    +   <m:defJc m:val="centerGroup"/>
    +   <m:wrapIndent m:val="1440"/>
    +   <m:intLim m:val="subSup"/>
    +   <m:naryLim m:val="undOvr"/>
    +  </m:mathPr></w:WordDocument>
    +</xml><![endif]--><!--[if gte mso 9]><xml>
    + <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
    +  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
    +  LatentStyleCount="267">
    +  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
    +  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
    +  <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
    +  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
    +  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
    +  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
    +  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
    +  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
    +  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Table Grid"/>
    +  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
    +  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List Accent 1"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
    +  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
    +  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
    +  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
    +  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List Accent 2"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List Accent 3"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List Accent 4"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List Accent 5"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List Accent 6"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
    +  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
    +  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
    +  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
    +  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
    +  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
    +  <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
    +  <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
    + </w:LatentStyles>
    +</xml><![endif]-->
    +<style>
    +<!--
    + /* Font Definitions */
    + @font-face
    +	{font-family:宋体;
    +	panose-1:2 1 6 0 3 1 1 1 1 1;
    +	mso-font-alt:SimSun;
    +	mso-font-charset:134;
    +	mso-generic-font-family:auto;
    +	mso-font-pitch:variable;
    +	mso-font-signature:3 680460288 22 0 262145 0;}
    +@font-face
    +	{font-family:"Cambria Math";
    +	panose-1:2 4 5 3 5 4 6 3 2 4;
    +	mso-font-charset:0;
    +	mso-generic-font-family:roman;
    +	mso-font-pitch:variable;
    +	mso-font-signature:-1610611985 1107304683 0 0 415 0;}
    +@font-face
    +	{font-family:Calibri;
    +	panose-1:2 15 5 2 2 2 4 3 2 4;
    +	mso-font-charset:0;
    +	mso-generic-font-family:swiss;
    +	mso-font-pitch:variable;
    +	mso-font-signature:-520092929 1073786111 9 0 415 0;}
    +@font-face
    +	{font-family:"\@宋体";
    +	panose-1:2 1 6 0 3 1 1 1 1 1;
    +	mso-font-charset:134;
    +	mso-generic-font-family:auto;
    +	mso-font-pitch:variable;
    +	mso-font-signature:3 680460288 22 0 262145 0;}
    + /* Style Definitions */
    + p.MsoNormal, li.MsoNormal, div.MsoNormal
    +	{mso-style-unhide:no;
    +	mso-style-qformat:yes;
    +	mso-style-parent:"";
    +	margin:0cm;
    +	margin-bottom:.0001pt;
    +	text-align:justify;
    +	text-justify:inter-ideograph;
    +	mso-pagination:none;
    +	font-size:10.5pt;
    +	font-family:"Calibri","sans-serif";
    +	mso-fareast-font-family:宋体;
    +	mso-bidi-font-family:"Times New Roman";
    +	mso-font-kerning:1.0pt;}
    +p.MsoHeader, li.MsoHeader, div.MsoHeader
    +	{mso-style-noshow:yes;
    +	mso-style-priority:99;
    +	mso-style-link:"页眉 Char";
    +	margin:0cm;
    +	margin-bottom:.0001pt;
    +	text-align:center;
    +	mso-pagination:none;
    +	tab-stops:center 207.65pt right 415.3pt;
    +	layout-grid-mode:char;
    +	border:none;
    +	mso-border-bottom-alt:solid windowtext .75pt;
    +	padding:0cm;
    +	mso-padding-alt:0cm 0cm 1.0pt 0cm;
    +	font-size:9.0pt;
    +	font-family:"Calibri","sans-serif";
    +	mso-fareast-font-family:宋体;
    +	mso-bidi-font-family:"Times New Roman";
    +	mso-font-kerning:1.0pt;}
    +p.MsoFooter, li.MsoFooter, div.MsoFooter
    +	{mso-style-noshow:yes;
    +	mso-style-priority:99;
    +	mso-style-link:"页脚 Char";
    +	margin:0cm;
    +	margin-bottom:.0001pt;
    +	mso-pagination:none;
    +	tab-stops:center 207.65pt right 415.3pt;
    +	layout-grid-mode:char;
    +	font-size:9.0pt;
    +	font-family:"Calibri","sans-serif";
    +	mso-fareast-font-family:宋体;
    +	mso-bidi-font-family:"Times New Roman";
    +	mso-font-kerning:1.0pt;}
    +span.Char
    +	{mso-style-name:"页眉 Char";
    +	mso-style-noshow:yes;
    +	mso-style-priority:99;
    +	mso-style-unhide:no;
    +	mso-style-locked:yes;
    +	mso-style-link:页眉;
    +	mso-ansi-font-size:9.0pt;
    +	mso-bidi-font-size:9.0pt;}
    +span.Char0
    +	{mso-style-name:"页脚 Char";
    +	mso-style-noshow:yes;
    +	mso-style-priority:99;
    +	mso-style-unhide:no;
    +	mso-style-locked:yes;
    +	mso-style-link:页脚;
    +	mso-ansi-font-size:9.0pt;
    +	mso-bidi-font-size:9.0pt;}
    +.MsoChpDefault
    +	{mso-style-type:export-only;
    +	mso-default-props:yes;
    +	mso-ascii-font-family:Calibri;
    +	mso-fareast-font-family:宋体;
    +	mso-hansi-font-family:Calibri;}
    + /* Page Definitions */
    + @page
    +	{mso-page-border-surround-header:no;
    +	mso-page-border-surround-footer:no;
    +	mso-footnote-separator:url("20150522233106dmSB58vX.files/header.html") fs;
    +	mso-footnote-continuation-separator:url("20150522233106dmSB58vX.files/header.html") fcs;
    +	mso-endnote-separator:url("20150522233106dmSB58vX.files/header.html") es;
    +	mso-endnote-continuation-separator:url("20150522233106dmSB58vX.files/header.html") ecs;}
    +@page Section1
    +	{size:595.3pt 841.9pt;
    +	margin:72.0pt 90.0pt 72.0pt 90.0pt;
    +	mso-header-margin:42.55pt;
    +	mso-footer-margin:49.6pt;
    +	mso-paper-source:0;
    +	layout-grid:15.6pt;}
    +div.Section1
    +	{page:Section1;}
    +-->
    +</style>
    +<!--[if gte mso 10]>
    +<style>
    + /* Style Definitions */
    + table.MsoNormalTable
    +	{mso-style-name:普通表格;
    +	mso-tstyle-rowband-size:0;
    +	mso-tstyle-colband-size:0;
    +	mso-style-noshow:yes;
    +	mso-style-priority:99;
    +	mso-style-qformat:yes;
    +	mso-style-parent:"";
    +	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
    +	mso-para-margin:0cm;
    +	mso-para-margin-bottom:.0001pt;
    +	mso-pagination:widow-orphan;
    +	font-size:10.0pt;
    +	font-family:"Calibri","sans-serif";
    +	mso-bidi-font-family:"Times New Roman";}
    +</style>
    +<![endif]--><!--[if gte mso 9]><xml>
    + <o:shapedefaults v:ext="edit" spidmax="3074"/>
    +</xml><![endif]--><!--[if gte mso 9]><xml>
    + <o:shapelayout v:ext="edit">
    +  <o:idmap v:ext="edit" data="2"/>
    + </o:shapelayout></xml><![endif]-->
    +</head>
    +
    +<body lang=ZH-CN style='tab-interval:21.0pt;text-justify-trim:punctuation'>
    +
    +<div class=Section1 style='layout-grid:15.6pt'>
    +
    +<p class=MsoNormal align=center style='text-align:center;line-height:200%'><span
    +style='font-size:22.0pt;line-height:200%;font-family:宋体;mso-ascii-font-family:
    +Calibri;mso-hansi-font-family:Calibri'>请假单</span></p>
    +
    +<table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0
    + style='border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;
    + mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:
    + .5pt solid black;mso-border-insidev:.5pt solid black'>
    + <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>请假标题</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  border-left:none;mso-border-left-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{title}</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.55pt;border:solid black 1.0pt;
    +  border-left:none;mso-border-left-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>请假开始时间</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.55pt;border:solid black 1.0pt;
    +  border-left:none;mso-border-left-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{begindate}</span></p>
    +  </td>
    + </tr>
    + <tr style='mso-yfti-irow:1'>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  border-top:none;mso-border-top-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>请假人</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.5pt;border-top:none;border-left:
    +  none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{people}</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.55pt;border-top:none;border-left:
    +  none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>请假结束时间</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.55pt;border-top:none;border-left:
    +  none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{enddate}</span></p>
    +  </td>
    + </tr>
    + <tr style='mso-yfti-irow:2'>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  border-top:none;mso-border-top-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>性别</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.5pt;border-top:none;border-left:
    +  none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{sex}</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.55pt;border-top:none;border-left:
    +  none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>所属部门</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.55pt;border-top:none;border-left:
    +  none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{hol_dept}</span></p>
    +  </td>
    + </tr>
    + <tr style='mso-yfti-irow:3'>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  border-top:none;mso-border-top-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>请假原因</span></p>
    +  </td>
    +  <td width=426 colspan=3 valign=top style='width:319.6pt;border-top:none;
    +  border-left:none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{hol_reson}</span></p>
    +  </td>
    + </tr>
    + <tr style='mso-yfti-irow:4'>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  border-top:none;mso-border-top-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>部门审批人</span></p>
    +  </td>
    +  <td width=426 colspan=3 valign=top style='width:319.6pt;border-top:none;
    +  border-left:none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{dep_leader}</span></p>
    +  </td>
    + </tr>
    + <tr style='mso-yfti-irow:5;mso-yfti-lastrow:yes'>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  border-top:none;mso-border-top-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>部门审批意见</span></p>
    +  </td>
    +  <td width=426 colspan=3 valign=top style='width:319.6pt;border-top:none;
    +  border-left:none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{content}</span></p>
    +  </td>
    + </tr>
    +</table>
    +
    +<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
    +
    +</div>
    +
    +</body>
    +
    +</html>
    diff --git a/src/main/webapp/upload/forms/20150522233516AEg6hnQV.doc b/src/main/webapp/upload/forms/20150522233516AEg6hnQV.doc
    new file mode 100644
    index 00000000..9a1f0b21
    Binary files /dev/null and b/src/main/webapp/upload/forms/20150522233516AEg6hnQV.doc differ
    diff --git a/src/main/webapp/upload/forms/20150522233516AEg6hnQV.ftl b/src/main/webapp/upload/forms/20150522233516AEg6hnQV.ftl
    new file mode 100644
    index 00000000..5ec53c00
    --- /dev/null
    +++ b/src/main/webapp/upload/forms/20150522233516AEg6hnQV.ftl
    @@ -0,0 +1,96 @@
    +<html
    
    
    +xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
    >
    +
    +
    +
    +
    +
    +<script type="text/javascript" src="plug-in/jquery/jquery-1.8.3.js"></script><script type="text/javascript" src="plug-in/tools/dataformat.js"></script><link id="easyuiTheme" rel="stylesheet" href="plug-in/easyui/themes/default/easyui.css" type="text/css"></link><link rel="stylesheet" href="plug-in/easyui/themes/icon.css" type="text/css"></link><link rel="stylesheet" type="text/css" href="plug-in/accordion/css/accordion.css"></link><script type="text/javascript" src="plug-in/easyui/jquery.easyui.min.1.3.2.js"></script><script type="text/javascript" src="plug-in/easyui/locale/zh-cn.js"></script><script type="text/javascript" src="plug-in/tools/syUtil.js"></script><script type="text/javascript" src="plug-in/My97DatePicker/WdatePicker.js"></script><script type="text/javascript" src="plug-in/lhgDialog/lhgdialog.min.js"></script><script type="text/javascript">$(function(){$("#formobj").Validform({tiptype:4,btnSubmit:"#btn_sub",btnReset:"#btn_reset",ajaxPost:true,usePlugin:{passwordstrength:{minLen:6,maxLen:18,trigger:function(obj,error){if(error){obj.parent().next().find(".Validform_checktip").show();obj.find(".passwordStrength").hide();}else{$(".passwordStrength").show();obj.parent().next().find(".Validform_checktip").hide();}}}},callback:function(data){if(data.success==true){if(!neibuClickFlag){var win = frameElement.api.opener;frameElement.api.close();win.tip(data.msg);win.reloadTable();}else {alert(data.msg)}}else{if(data.responseText==''||data.responseText==undefined)$("#formobj").html(data.msg);else $("#formobj").html(data.responseText); return false;}if(!neibuClickFlag){var win = frameElement.api.opener;win.reloadTable();}}});});</script><script type="text/javascript" src="plug-in/tools/curdtools_zh-cn.js"></script><script type="text/javascript" src="plug-in/tools/easyuiextend.js"></script><link rel="stylesheet" href="plug-in/Validform/css/style.css" type="text/css"/><link rel="stylesheet" href="plug-in/Validform/css/tablefrom.css" type="text/css"/><script type="text/javascript" src="plug-in/Validform/js/Validform_v5.3.1_min_zh-cn.js"></script><script type="text/javascript" src="plug-in/Validform/js/Validform_Datatype_zh-cn.js"></script><script type="text/javascript" src="plug-in/Validform/js/datatype_zh-cn.js"></script><script type="text/javascript" src="plug-in/Validform/plugin/passwordStrength/passwordStrength-min.js"></script><style>body{font-size:12px;}table{border: 1px solid #000000;padding:0; margin:0 auto;border-collapse: collapse;width:100%;align:right;}td {border: 1px solid #000000;background: #fff;font-size:12px;padding: 3px 3px 3px 8px;color: #000000;word-break: keep-all;}</style>
    +<body  >
    +
    +<div  >
    +
    +<p  align=center >请假单</p>
    +
    +<form action="cgFormBuildController.do?saveOrUpdate" id="formobj" name="formobj" method="post">
    +<input type="hidden" name="tableName" value="${tableName?if_exists?html}"/>
    +<input type="hidden" name="id" value="${id?if_exists?html}"/>
    +<input type="hidden" id="btn_sub" class="btn_sub"/>
    +#{jform_hidden_field}<table  border=1 cellspacing=0 cellpadding=0
    + >
    + <tr >
    +  <td width=142  >
    +  <p  >请假标题</p>
    +  </td>
    +  <td width=142  >
    +  <p  >#{title}</p>
    +  </td>
    +  <td width=142  >
    +  <p  >请假开始时间</p>
    +  </td>
    +  <td width=142  >
    +  <p  >#{begindate}</p>
    +  </td>
    + </tr>
    + <tr >
    +  <td width=142  >
    +  <p  >请假人</p>
    +  </td>
    +  <td width=142  >
    +  <p  >#{people}</p>
    +  </td>
    +  <td width=142  >
    +  <p  >请假结束时间</p>
    +  </td>
    +  <td width=142  >
    +  <p  >#{enddate}</p>
    +  </td>
    + </tr>
    + <tr >
    +  <td width=142  >
    +  <p  >性别</p>
    +  </td>
    +  <td width=142  >
    +  <p  >#{sex}</p>
    +  </td>
    +  <td width=142  >
    +  <p  >所属部门</p>
    +  </td>
    +  <td width=142  >
    +  <p  >#{hol_dept}</p>
    +  </td>
    + </tr>
    + <tr >
    +  <td width=142  >
    +  <p  >请假原因</p>
    +  </td>
    +  <td width=426 colspan=3  >
    +  <p  >#{hol_reson}</p>
    +  </td>
    + </tr>
    + <tr >
    +  <td width=142  >
    +  <p  >部门审批人</p>
    +  </td>
    +  <td width=426 colspan=3  >
    +  <p  >#{dep_leader}</p>
    +  </td>
    + </tr>
    + <tr >
    +  <td width=142  >
    +  <p  >部门审批意见</p>
    +  </td>
    +  <td width=426 colspan=3  >
    +  <p  >#{content}</p>
    +  </td>
    + </tr>
    +</table>
    +</form>
    +
    +<p ></p>
    +
    +</div>
    +
    +</body>
    +
    +</html>
    diff --git a/src/main/webapp/upload/forms/20150522233516AEg6hnQV.html b/src/main/webapp/upload/forms/20150522233516AEg6hnQV.html
    new file mode 100644
    index 00000000..be689ddb
    --- /dev/null
    +++ b/src/main/webapp/upload/forms/20150522233516AEg6hnQV.html
    @@ -0,0 +1,631 @@
    +<html xmlns:v="urn:schemas-microsoft-com:vml"
    +xmlns:o="urn:schemas-microsoft-com:office:office"
    +xmlns:w="urn:schemas-microsoft-com:office:word"
    +xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
    +xmlns="http://www.w3.org/TR/REC-html40">
    +
    +<head>
    +<meta http-equiv=Content-Type content="text/html; charset=gb2312">
    +<meta name=ProgId content=Word.Document>
    +<meta name=Generator content="Microsoft Word 12">
    +<meta name=Originator content="Microsoft Word 12">
    +<link rel=File-List href="20150522233516AEg6hnQV.files/filelist.xml">
    +<!--[if gte mso 9]><xml>
    + <o:DocumentProperties>
    +  <o:Author>00704873</o:Author>
    +  <o:LastAuthor>zhoujf</o:LastAuthor>
    +  <o:Revision>2</o:Revision>
    +  <o:TotalTime>2</o:TotalTime>
    +  <o:Created>2015-05-22T15:35:00Z</o:Created>
    +  <o:LastSaved>2015-05-22T15:35:00Z</o:LastSaved>
    +  <o:Pages>1</o:Pages>
    +  <o:Words>23</o:Words>
    +  <o:Characters>137</o:Characters>
    +  <o:Company>Lenovo (Beijing) Limited</o:Company>
    +  <o:Lines>1</o:Lines>
    +  <o:Paragraphs>1</o:Paragraphs>
    +  <o:CharactersWithSpaces>159</o:CharactersWithSpaces>
    +  <o:Version>12.00</o:Version>
    + </o:DocumentProperties>
    +</xml><![endif]-->
    +<link rel=themeData href="20150522233516AEg6hnQV.files/themedata.thmx">
    +<link rel=colorSchemeMapping
    +href="20150522233516AEg6hnQV.files/colorschememapping.xml">
    +<!--[if gte mso 9]><xml>
    + <w:WordDocument>
    +  <w:TrackMoves>false</w:TrackMoves>
    +  <w:TrackFormatting/>
    +  <w:PunctuationKerning/>
    +  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
    +  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
    +  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
    +  <w:ValidateAgainstSchemas/>
    +  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
    +  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
    +  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
    +  <w:DoNotPromoteQF/>
    +  <w:LidThemeOther>EN-US</w:LidThemeOther>
    +  <w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
    +  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
    +  <w:Compatibility>
    +   <w:SpaceForUL/>
    +   <w:BalanceSingleByteDoubleByteWidth/>
    +   <w:DoNotLeaveBackslashAlone/>
    +   <w:ULTrailSpace/>
    +   <w:DoNotExpandShiftReturn/>
    +   <w:AdjustLineHeightInTable/>
    +   <w:BreakWrappedTables/>
    +   <w:SnapToGridInCell/>
    +   <w:WrapTextWithPunct/>
    +   <w:UseAsianBreakRules/>
    +   <w:DontGrowAutofit/>
    +   <w:DontUseIndentAsNumberingTabStop/>
    +   <w:FELineBreak11/>
    +   <w:WW11IndentRules/>
    +   <w:DontAutofitConstrainedTables/>
    +   <w:AutofitLikeWW11/>
    +   <w:HangulWidthLikeWW11/>
    +   <w:UseNormalStyleForList/>
    +   <w:UseFELayout/>
    +  </w:Compatibility>
    +  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
    +  <m:mathPr>
    +   <m:mathFont m:val="Cambria Math"/>
    +   <m:brkBin m:val="before"/>
    +   <m:brkBinSub m:val="--"/>
    +   <m:smallFrac m:val="off"/>
    +   <m:dispDef/>
    +   <m:lMargin m:val="0"/>
    +   <m:rMargin m:val="0"/>
    +   <m:defJc m:val="centerGroup"/>
    +   <m:wrapIndent m:val="1440"/>
    +   <m:intLim m:val="subSup"/>
    +   <m:naryLim m:val="undOvr"/>
    +  </m:mathPr></w:WordDocument>
    +</xml><![endif]--><!--[if gte mso 9]><xml>
    + <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
    +  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
    +  LatentStyleCount="267">
    +  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
    +  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
    +  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
    +  <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
    +  <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
    +  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
    +  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
    +  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
    +  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
    +  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
    +  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Table Grid"/>
    +  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
    +  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List Accent 1"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
    +  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
    +  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
    +  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
    +  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List Accent 2"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List Accent 3"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List Accent 4"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List Accent 5"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
    +  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
    +  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light List Accent 6"/>
    +  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
    +  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
    +  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
    +  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
    +  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
    +  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
    +   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
    +  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
    +  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
    +  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
    +  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
    +  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
    +   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
    +  <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
    +  <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
    + </w:LatentStyles>
    +</xml><![endif]-->
    +<style>
    +<!--
    + /* Font Definitions */
    + @font-face
    +	{font-family:宋体;
    +	panose-1:2 1 6 0 3 1 1 1 1 1;
    +	mso-font-alt:SimSun;
    +	mso-font-charset:134;
    +	mso-generic-font-family:auto;
    +	mso-font-pitch:variable;
    +	mso-font-signature:3 680460288 22 0 262145 0;}
    +@font-face
    +	{font-family:"Cambria Math";
    +	panose-1:2 4 5 3 5 4 6 3 2 4;
    +	mso-font-charset:0;
    +	mso-generic-font-family:roman;
    +	mso-font-pitch:variable;
    +	mso-font-signature:-1610611985 1107304683 0 0 415 0;}
    +@font-face
    +	{font-family:Calibri;
    +	panose-1:2 15 5 2 2 2 4 3 2 4;
    +	mso-font-charset:0;
    +	mso-generic-font-family:swiss;
    +	mso-font-pitch:variable;
    +	mso-font-signature:-520092929 1073786111 9 0 415 0;}
    +@font-face
    +	{font-family:"\@宋体";
    +	panose-1:2 1 6 0 3 1 1 1 1 1;
    +	mso-font-charset:134;
    +	mso-generic-font-family:auto;
    +	mso-font-pitch:variable;
    +	mso-font-signature:3 680460288 22 0 262145 0;}
    + /* Style Definitions */
    + p.MsoNormal, li.MsoNormal, div.MsoNormal
    +	{mso-style-unhide:no;
    +	mso-style-qformat:yes;
    +	mso-style-parent:"";
    +	margin:0cm;
    +	margin-bottom:.0001pt;
    +	text-align:justify;
    +	text-justify:inter-ideograph;
    +	mso-pagination:none;
    +	font-size:10.5pt;
    +	font-family:"Calibri","sans-serif";
    +	mso-fareast-font-family:宋体;
    +	mso-bidi-font-family:"Times New Roman";
    +	mso-font-kerning:1.0pt;}
    +p.MsoHeader, li.MsoHeader, div.MsoHeader
    +	{mso-style-noshow:yes;
    +	mso-style-priority:99;
    +	mso-style-link:"页眉 Char";
    +	margin:0cm;
    +	margin-bottom:.0001pt;
    +	text-align:center;
    +	mso-pagination:none;
    +	tab-stops:center 207.65pt right 415.3pt;
    +	layout-grid-mode:char;
    +	border:none;
    +	mso-border-bottom-alt:solid windowtext .75pt;
    +	padding:0cm;
    +	mso-padding-alt:0cm 0cm 1.0pt 0cm;
    +	font-size:9.0pt;
    +	font-family:"Calibri","sans-serif";
    +	mso-fareast-font-family:宋体;
    +	mso-bidi-font-family:"Times New Roman";
    +	mso-font-kerning:1.0pt;}
    +p.MsoFooter, li.MsoFooter, div.MsoFooter
    +	{mso-style-noshow:yes;
    +	mso-style-priority:99;
    +	mso-style-link:"页脚 Char";
    +	margin:0cm;
    +	margin-bottom:.0001pt;
    +	mso-pagination:none;
    +	tab-stops:center 207.65pt right 415.3pt;
    +	layout-grid-mode:char;
    +	font-size:9.0pt;
    +	font-family:"Calibri","sans-serif";
    +	mso-fareast-font-family:宋体;
    +	mso-bidi-font-family:"Times New Roman";
    +	mso-font-kerning:1.0pt;}
    +span.Char
    +	{mso-style-name:"页眉 Char";
    +	mso-style-noshow:yes;
    +	mso-style-priority:99;
    +	mso-style-unhide:no;
    +	mso-style-locked:yes;
    +	mso-style-link:页眉;
    +	mso-ansi-font-size:9.0pt;
    +	mso-bidi-font-size:9.0pt;}
    +span.Char0
    +	{mso-style-name:"页脚 Char";
    +	mso-style-noshow:yes;
    +	mso-style-priority:99;
    +	mso-style-unhide:no;
    +	mso-style-locked:yes;
    +	mso-style-link:页脚;
    +	mso-ansi-font-size:9.0pt;
    +	mso-bidi-font-size:9.0pt;}
    +.MsoChpDefault
    +	{mso-style-type:export-only;
    +	mso-default-props:yes;
    +	mso-ascii-font-family:Calibri;
    +	mso-fareast-font-family:宋体;
    +	mso-hansi-font-family:Calibri;}
    + /* Page Definitions */
    + @page
    +	{mso-page-border-surround-header:no;
    +	mso-page-border-surround-footer:no;
    +	mso-footnote-separator:url("20150522233516AEg6hnQV.files/header.html") fs;
    +	mso-footnote-continuation-separator:url("20150522233516AEg6hnQV.files/header.html") fcs;
    +	mso-endnote-separator:url("20150522233516AEg6hnQV.files/header.html") es;
    +	mso-endnote-continuation-separator:url("20150522233516AEg6hnQV.files/header.html") ecs;}
    +@page Section1
    +	{size:595.3pt 841.9pt;
    +	margin:72.0pt 90.0pt 72.0pt 90.0pt;
    +	mso-header-margin:42.55pt;
    +	mso-footer-margin:49.6pt;
    +	mso-paper-source:0;
    +	layout-grid:15.6pt;}
    +div.Section1
    +	{page:Section1;}
    +-->
    +</style>
    +<!--[if gte mso 10]>
    +<style>
    + /* Style Definitions */
    + table.MsoNormalTable
    +	{mso-style-name:普通表格;
    +	mso-tstyle-rowband-size:0;
    +	mso-tstyle-colband-size:0;
    +	mso-style-noshow:yes;
    +	mso-style-priority:99;
    +	mso-style-qformat:yes;
    +	mso-style-parent:"";
    +	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
    +	mso-para-margin:0cm;
    +	mso-para-margin-bottom:.0001pt;
    +	mso-pagination:widow-orphan;
    +	font-size:10.0pt;
    +	font-family:"Calibri","sans-serif";
    +	mso-bidi-font-family:"Times New Roman";}
    +</style>
    +<![endif]--><!--[if gte mso 9]><xml>
    + <o:shapedefaults v:ext="edit" spidmax="3074"/>
    +</xml><![endif]--><!--[if gte mso 9]><xml>
    + <o:shapelayout v:ext="edit">
    +  <o:idmap v:ext="edit" data="2"/>
    + </o:shapelayout></xml><![endif]-->
    +</head>
    +
    +<body lang=ZH-CN style='tab-interval:21.0pt;text-justify-trim:punctuation'>
    +
    +<div class=Section1 style='layout-grid:15.6pt'>
    +
    +<p class=MsoNormal align=center style='text-align:center;line-height:200%'><span
    +style='font-size:22.0pt;line-height:200%;font-family:宋体;mso-ascii-font-family:
    +Calibri;mso-hansi-font-family:Calibri'>请假单</span></p>
    +
    +<table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0
    + style='border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;
    + mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:
    + .5pt solid black;mso-border-insidev:.5pt solid black'>
    + <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>请假标题</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  border-left:none;mso-border-left-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{title}</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.55pt;border:solid black 1.0pt;
    +  border-left:none;mso-border-left-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>请假开始时间</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.55pt;border:solid black 1.0pt;
    +  border-left:none;mso-border-left-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{begindate}</span></p>
    +  </td>
    + </tr>
    + <tr style='mso-yfti-irow:1'>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  border-top:none;mso-border-top-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>请假人</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.5pt;border-top:none;border-left:
    +  none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{people}</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.55pt;border-top:none;border-left:
    +  none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>请假结束时间</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.55pt;border-top:none;border-left:
    +  none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{enddate}</span></p>
    +  </td>
    + </tr>
    + <tr style='mso-yfti-irow:2'>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  border-top:none;mso-border-top-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>性别</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.5pt;border-top:none;border-left:
    +  none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{sex}</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.55pt;border-top:none;border-left:
    +  none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>所属部门</span></p>
    +  </td>
    +  <td width=142 valign=top style='width:106.55pt;border-top:none;border-left:
    +  none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{hol_dept}</span></p>
    +  </td>
    + </tr>
    + <tr style='mso-yfti-irow:3'>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  border-top:none;mso-border-top-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>请假原因</span></p>
    +  </td>
    +  <td width=426 colspan=3 valign=top style='width:319.6pt;border-top:none;
    +  border-left:none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{hol_reson}</span></p>
    +  </td>
    + </tr>
    + <tr style='mso-yfti-irow:4'>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  border-top:none;mso-border-top-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>部门审批人</span></p>
    +  </td>
    +  <td width=426 colspan=3 valign=top style='width:319.6pt;border-top:none;
    +  border-left:none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{dep_leader}</span></p>
    +  </td>
    + </tr>
    + <tr style='mso-yfti-irow:5;mso-yfti-lastrow:yes'>
    +  <td width=142 valign=top style='width:106.5pt;border:solid black 1.0pt;
    +  border-top:none;mso-border-top-alt:solid black .5pt;mso-border-alt:solid black .5pt;
    +  padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span style='font-family:宋体;
    +  mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri'>部门审批意见</span></p>
    +  </td>
    +  <td width=426 colspan=3 valign=top style='width:319.6pt;border-top:none;
    +  border-left:none;border-bottom:solid black 1.0pt;border-right:solid black 1.0pt;
    +  mso-border-top-alt:solid black .5pt;mso-border-left-alt:solid black .5pt;
    +  mso-border-alt:solid black .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
    +  <p class=MsoNormal style='line-height:200%'><span lang=EN-US>#{content}</span></p>
    +  </td>
    + </tr>
    +</table>
    +
    +<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
    +
    +</div>
    +
    +</body>
    +
    +</html>
    diff --git a/src/main/webapp/upload/logo.png b/src/main/webapp/upload/logo.png
    new file mode 100644
    index 00000000..06dc89d8
    Binary files /dev/null and b/src/main/webapp/upload/logo.png differ
    diff --git a/src/main/webapp/upload/mail.png b/src/main/webapp/upload/mail.png
    new file mode 100644
    index 00000000..fc8a9e4c
    Binary files /dev/null and b/src/main/webapp/upload/mail.png differ
    diff --git a/src/main/webapp/userfiles/files/JEECG UI鏍囩搴撳府鍔╂枃妗3_2.pdf b/src/main/webapp/userfiles/files/JEECG UI鏍囩搴撳府鍔╂枃妗3_2.pdf
    new file mode 100644
    index 00000000..7d22c4e9
    Binary files /dev/null and b/src/main/webapp/userfiles/files/JEECG UI鏍囩搴撳府鍔╂枃妗3_2.pdf differ
    diff --git a/src/main/webapp/userfiles/images/鏈懡鍚.jpg b/src/main/webapp/userfiles/images/鏈懡鍚.jpg
    new file mode 100644
    index 00000000..5e633a5c
    Binary files /dev/null and b/src/main/webapp/userfiles/images/鏈懡鍚.jpg differ
    diff --git a/src/main/webapp/userfiles/閲岄潰鏂囦欢鏄緥瀛 b/src/main/webapp/userfiles/閲岄潰鏂囦欢鏄緥瀛
    new file mode 100644
    index 00000000..e69de29b
    diff --git a/src/main/webapp/webpage/common/404.jsp b/src/main/webapp/webpage/common/404.jsp
    new file mode 100644
    index 00000000..c83726de
    --- /dev/null
    +++ b/src/main/webapp/webpage/common/404.jsp
    @@ -0,0 +1,92 @@
    +<%@ page contentType="text/html; charset=UTF-8"%>
    +<style>
    +    .code {
    +        border: 1px solid #ccc;
    +        background: #efefef;
    +        font-size: 16px;
    +    }
    +    .propNS {
    +        color: #660E7A
    +    }
    +    .propTag {
    +        color: #000080
    +    }
    +    .propName {
    +        color: #0000ff;
    +    }
    +    .propValue{
    +        color: #008000
    +    }
    +</style>
    +<div style="height: 100%; margin: 14px 20px 0 20px; overflow-y: auto">
    +    <div style="background: pink; margin-right: 50px; padding: 10px; text-align: center;">
    +        <div>404 error!璇锋眰鍦板潃鏈夎锛 </div>
    +        <div>璇峰弬鐓т笅闈㈢殑姝ラ妫鏌ヤ綘鐨勯」鐩</div>
    +    </div>
    +
    +    <div><h5>浠g爜鐢熸垚鍓嶏紝閰嶇疆鐩稿叧鏂囦欢</h5></div>
    +    <div style="margin-right: 50px;">
    +        <ul>
    +            <li>鐢熸垚浠g爜鍖呯殑璺緞(jeecg_config.properties)锛
    +                <pre class="code">
    +
    +  <span class="propTag">bussi_package</span>=<span class="propValue">com.buss</span> // 鐢熸垚浠g爜鐨勫寘鍓嶇紑
    +                </pre>
    +            </li>
    +            <li>浠g爜鐢熸垚鐣岄潰鐨勯厤缃細
    +                <ol>
    +                    <li>琛ㄥ悕锛<span class="propValue">guoming_test</span>锛</li>
    +                    <li>鍖呭悕锛<span class="propValue">guoming</span>锛</li>
    +                    <li>浠g爜鍒嗗眰椋庢牸锛<span class="propValue">浠g爜鍒嗗眰</span>锛</li>
    +                </ol>
    +            </li>
    +        </ul>
    +    </div>
    +
    +    <div><h5>浠g爜鐢熸垚鍚庯紝缂栬緫閰嶇疆鏂囦欢</h5></div>
    +    <div style="margin-right: 50px;">
    +        <ul>
    +            <li>
    +                鍔犺浇Controller(spring-mvc.xml)
    +                <pre class="code">
    +
    +  &lt;<span class="propNS">context</span><span class="propTag">:component-scan</span> <span class="propName">base-package=</span><span class="propValue">"com.buss.*"</span>&gt;
    +      &lt;<span class="propNS">context</span><span class="propTag">:exclude-filter</span> <span class="propName">type=</span><span class="propValue">"annotation" expression="org.springframework.stereotype.Service"</span> /&gt;
    +  &lt;/<span class="propNS">context</span><span class="propTag">:component-scan</span>&gt;
    +                </pre>
    +            </li>
    +            <li>
    +                鍔犺浇service(spring-mvc-hibernate.xml)
    +                        <pre class="code">
    +
    +  &lt;<span class="propNS">context</span><span class="propTag">:component-scan</span> <span class="propName">base-package=</span><span class="propValue">"com.buss.*"</span>&gt;
    +      &lt;<span class="propNS">context</span><span class="propTag">:exclude-filter</span> <span class="propName">type=</span><span class="propValue">"annotation" expression="org.springframework.stereotype.Controller"</span> /&gt;
    +  &lt;/<span class="propNS">context</span><span class="propTag">:component-scan</span>&gt;
    +                        </pre>
    +            </li>
    +            <li>
    +                鎵弿hibernate瀹炰綋(spring-mvc-hibernate.xml)
    +                <pre class="code">
    +
    +  濡傛灉鐢熸垚浠g爜鏃讹紝浠g爜鍒嗗眰椋庢牸閫夋嫨浜嗏滀唬鐮佸垎灞傗濓紝鍒欓厤缃枃浠跺涓嬶細
    +  &lt;<span class="propTag">property</span> <span class="propName">name=</span><span class="propValue">"packagesToScan"</span>&gt;
    +      &lt;<span class="propTag">list</span>&gt;
    +          ....
    +          &lt;!-- 鎵弿 浠g爜鍒嗗眰 瀹炰綋 --&gt;
    +          &lt;<span class="propTag">value</span>&gt;com.buss.entity.*&lt;/<span class="propTag">value</span>&gt;
    +          &lt;!-- 鎵弿 涓氬姟鍒嗗眰 瀹炰綋 --&gt;
    +          &lt;<span class="propTag">value</span>&gt;com.buss.*.entity&lt;/<span class="propTag">value</span>&gt;
    +      &lt;/<span class="propTag">list</span>&gt;
    +  &lt;/<span class="propTag">property</span>>
    +                </pre>
    +            </li>
    +        </ul>
    +    </div>
    +
    +    <h5>浠g爜鐢熸垚鍚庯紝缂栬緫鑿滃崟鍦板潃</h5>
    +    <ol>
    +        <li>绯荤粺绠$悊-->鑿滃崟绠$悊-->褰曞叆鑿滃崟</li>
    +        <li>濉啓鍦板潃锛<span class="propValue">guomingTestController.do?guomingTest</span></li>
    +    </ol>
    +
    +</div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/common/error.jsp b/src/main/webapp/webpage/common/error.jsp
    new file mode 100644
    index 00000000..edd6ea8c
    --- /dev/null
    +++ b/src/main/webapp/webpage/common/error.jsp
    @@ -0,0 +1,15 @@
    +<%@ page contentType="text/html; charset=UTF-8"%>
    +<html>
    +<head>
    +<title>Exception!</title>
    +</head>
    +<body>
    +<% Exception e = (Exception)request.getAttribute("ex"); %>
    +<H2>閿欒寮傚父: <%= e.getClass().getSimpleName()%></H2>
    +<hr />
    +<P>閿欒鎻忚堪锛</P>
    +<%= e.getMessage()%>
    +<P>閿欒淇℃伅锛</P>
    +<% e.printStackTrace(new java.io.PrintWriter(out)); %>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/common/noAuth.jsp b/src/main/webapp/webpage/common/noAuth.jsp
    new file mode 100644
    index 00000000..f092ce1c
    --- /dev/null
    +++ b/src/main/webapp/webpage/common/noAuth.jsp
    @@ -0,0 +1,19 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +
    +<html>
    +<head>
    +<t:base type="jquery,tools"></t:base>
    +
    +</head>
    +<body>
    +<SCRIPT type="text/javascript">
    +   var _sun_selectedTab=  $('#maintabs').tabs('getSelected') ; 
    +   var _sun_selectedTab_title=_sun_selectedTab.panel('options').title;
    +   $.dialog.alert("鎻愰啋锛氱敤鎴锋潈闄愪笉瓒筹紝璇疯仈绯荤鐞嗗憳!");
    +   $('#maintabs').tabs('close', _sun_selectedTab_title); 
    + </SCRIPT>
    + 鐢ㄦ埛鏉冮檺涓嶈冻锛岃鑱旂郴绠$悊鍛
    +</body>
    +</html>
    +
    diff --git a/src/main/webapp/webpage/common/upload/imageView.jsp b/src/main/webapp/webpage/common/upload/imageView.jsp
    new file mode 100644
    index 00000000..7737e75d
    --- /dev/null
    +++ b/src/main/webapp/webpage/common/upload/imageView.jsp
    @@ -0,0 +1,31 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<title>闄勪欢鏌ョ湅</title>
    +<script type="text/javascript" src="plug-in/Flexpaper/flexpaper_flash.js"></script>
    +</head>
    +<body>
    +<div style="position: absolute; left: 5px; top: 5px;"><img src="${realpath }" /></div>
    +</body>
    +</html>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/src/main/webapp/webpage/common/upload/pub_excel_upload.jsp b/src/main/webapp/webpage/common/upload/pub_excel_upload.jsp
    new file mode 100644
    index 00000000..51f8f55d
    --- /dev/null
    +++ b/src/main/webapp/webpage/common/upload/pub_excel_upload.jsp
    @@ -0,0 +1,17 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>閫氱敤Excel瀵煎叆${controller_name}</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" beforeSubmit="upload">
    +	<fieldset class="step">
    +	<div class="form"><t:upload name="fiels" buttonText="閫夋嫨瑕佸鍏ョ殑鏂囦欢" uploader="${controller_name}.do?importExcel" extend="*.xls;*.xlsx" id="file_upload" formData="documentTitle"></t:upload></div>
    +	<div class="form" id="filediv" style="height: 50px"></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/common/upload/swfView.jsp b/src/main/webapp/webpage/common/upload/swfView.jsp
    new file mode 100644
    index 00000000..62bb8027
    --- /dev/null
    +++ b/src/main/webapp/webpage/common/upload/swfView.jsp
    @@ -0,0 +1,57 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<title>闄勪欢鏌ョ湅</title>
    +<script type="text/javascript" src="plug-in/Flexpaper/flexpaper_flash.js"></script>
    +</head>
    +<body>
    +<div style="position: absolute; left: 5px; top: 5px;"><a id="viewerPlaceHolder" style="width: 1080px; height: 700px; display: block"></a> <script type="text/javascript">
    +			var fp = new FlexPaperViewer('plug-in/Flexpaper/FlexPaperViewer',
    +			'viewerPlaceHolder', {
    +				config : {
    +					SwfFile : '${swfpath}',
    +					EncodeURI:true,
    +					Scale : 0.6,
    +					ZoomTransition : 'easeOut',
    +					ZoomTime : 0.5,
    +					ZoomInterval : 0.2,
    +					FitPageOnLoad : true,
    +					FitWidthOnLoad : true,
    +					FullScreenAsMaxWindow : false,
    +					ProgressiveLoading : true,
    +					MinZoomSize : 0.2,
    +					MaxZoomSize : 5,
    +					SearchMatchAll : false,
    +					InitViewMode : 'SinglePage',
    +					ViewModeToolsVisible : true,
    +					ZoomToolsVisible : true,
    +					NavToolsVisible : true,
    +					CursorToolsVisible : true,
    +					SearchToolsVisible : true,
    +					localeChain : 'zh_CN'
    +				}
    +			});
    +</script></div>
    +</body>
    +</html>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/src/main/webapp/webpage/common/upload/uploadView.jsp b/src/main/webapp/webpage/common/upload/uploadView.jsp
    new file mode 100644
    index 00000000..eb1b8f48
    --- /dev/null
    +++ b/src/main/webapp/webpage/common/upload/uploadView.jsp
    @@ -0,0 +1,55 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    + <head>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript">
    +
    +        function uploadSuccess(d,file,response){
    +                $("#fileUrl").val(d.attributes.url);
    +                $("#fileName").val(d.attributes.name);
    +                var url = $("#fileUrl").val();
    +                var html="";
    +                if(url.indexOf(".gif")!=-1 || 
    +                                url.indexOf(".jpg")!=-1        ||
    +                                url.indexOf(".png")!=-1 ||
    +                                url.indexOf(".bmp")!=-1){
    +                        html += "<img src='"+url+"' width =400 height=300 />";
    +                }else{
    +                        html += "<a href='"+url+"' target=_blank >涓嬭浇:"+d.attributes.name+"</a>";
    +                }
    +                $("#fileShow").html(html);
    +        }
    +        function uploadCallback(callback,inputId){
    +                var url = $("#fileUrl").val();
    +                var name= $("#fileName").val();
    +                callback(url,name,inputId);
    +                
    +        }
    +</script>
    +</head>
    + <body style="overflow-y: hidden" scroll="no">
    +  <table cellpadding="0" cellspacing="1" class="formtable">
    +  <input id="documentTitle" type="hidden" name="documentTitle" value="blank"/>
    +  <input id="fileUrl" type="hidden"/>
    +  <input id="fileName" type="hidden"/>
    +   <tbody>
    +    <tr>
    +     <td align="right">
    +       <label class="Validform_label"></label>
    +     </td>
    +     <td class="value">
    +      <t:upload name="instruction" dialog="false" multi="false" extend=".jpg;*,jpeg;*.png;*.gif;*.bmp;*.ico;*.tif;*.xls;*.doc;*.rar;*.txt;*.zip" queueID="instructionfile" view="false" auto="true" uploader="systemController.do?saveFiles" onUploadSuccess="uploadSuccess"  id="instruction" formData="documentTitle"></t:upload>
    +     </td>
    +    </tr>
    +    <tr>
    +     <td colspan="2" id="instructionfile" class="value">
    +     </td>
    +    </tr>
    +   </tbody>
    +  </table>
    +   <div id="fileShow" >
    +  </div>
    + </body>
    + </html>
    diff --git a/src/main/webapp/webpage/jeecg/cgform/button/cgformButton.jsp b/src/main/webapp/webpage/jeecg/cgform/button/cgformButton.jsp
    new file mode 100644
    index 00000000..67a086bf
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/button/cgformButton.jsp
    @@ -0,0 +1,60 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>琛ㄥ崟鑷畾涔夋寜閽</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="cgformButtonController.do?save">
    +	<input id="id" name="id" type="hidden" value="${cgformButtonPage.id }">
    +	<input id="formId" name="formId" type="hidden" value="${cgformButtonPage.formId }">
    +	<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.button.code"/> : </label></td>
    +			<td class="value"><input class="inputxt" id="buttonCode" name="buttonCode" ignore="ignore" value="${cgformButtonPage.buttonCode}"> <span class="Validform_checktip"><t:mutiLang langKey="lang.code.cannot.add.update.delete"/></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.button.name"/>: </label></td>
    +			<td class="value"><input class="inputxt" id="buttonName" name="buttonName" ignore="ignore" value="${cgformButtonPage.buttonName}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.button.style"/> </label></td>
    +			<td class="value"><select name="buttonStyle" id="buttonStyle">
    +				<option value="link" <c:if test="${cgformButtonPage.buttonStyle=='link'}">selected="selected"</c:if>>link</option>
    +				<option value="button" <c:if test="${cgformButtonPage.buttonStyle=='button'}">selected="selected"</c:if>>button</option>
    +			</select> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.action.type"/>: </label></td>
    +			<td class="value"><select name="optType" id="optType">
    +				<option value="js" <c:if test="${cgformButtonPage.optType=='js'}">selected="selected"</c:if>>js</option>
    +				<option value="action" <c:if test="${cgformButtonPage.optType=='action'}">selected="selected"</c:if>>action</option>
    +			</select> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.show.sequence"/>: </label></td>
    +			<td class="value"><input class="inputxt" id="orderNum" name="orderNum" datatype="n" value="${cgformButtonPage.orderNum}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.show.icon.style"/>: </label></td>
    +			<td class="value"><input class="inputxt" id="buttonIcon" name="buttonIcon" datatype="*"
    +				value="<c:if test="${cgformButtonPage.buttonIcon!=null&&cgformButtonPage.buttonIcon!=''}">${cgformButtonPage.buttonIcon}</c:if><c:if test="${cgformButtonPage.buttonIcon==null||cgformButtonPage.buttonIcon==''}">pictures</c:if>">
    +			<span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.show.expression"/>: </label></td>
    +			<td class="value"><input class="inputxt" id="exp" name="exp" ignore="ignore" value="${cgformButtonPage.exp}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.status"/>:  </label></td>
    +			<td class="value"><select name="buttonStatus" id="buttonStatus">
    +				<option value="0" <c:if test="${cgformButtonPage.buttonStatus=='0'}">selected="selected"</c:if>><t:mutiLang langKey="common.inactive"/></option>
    +				<option value="1" <c:if test="${cgformButtonPage.buttonStatus=='1'}">selected="selected"</c:if>><t:mutiLang langKey="common.active"/></option>
    +			</select> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/button/cgformButtonList.jsp b/src/main/webapp/webpage/jeecg/cgform/button/cgformButtonList.jsp
    new file mode 100644
    index 00000000..05f02827
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/button/cgformButtonList.jsp
    @@ -0,0 +1,23 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +<t:datagrid name="cgformButtonList" title="custom.button" actionUrl="cgformButtonController.do?datagrid&formId=${formId}" idField="id" fit="true">
    +	<t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="button.code" field="buttonCode"></t:dgCol>
    +	<t:dgCol title="button.name" field="buttonName"></t:dgCol>
    +	<t:dgCol title="button.style" field="buttonStyle"></t:dgCol>
    +	<t:dgCol title="action.type" field="optType"></t:dgCol>
    +	<t:dgCol title="common.show.sequence" field="orderNum"></t:dgCol>
    +	<t:dgCol title="common.show.icon.style" field="buttonIcon"></t:dgCol>
    +	<t:dgCol title="common.show.expression" field="exp"></t:dgCol>
    +	<t:dgCol title="common.status" field="buttonStatus" replace="common.active_1,common.inactive_0"></t:dgCol>
    +	<t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="common.delete" url="cgformButtonController.do?del&id={id}&formId=${formId}" />
    +	<t:dgToolBar title="common.add" icon="icon-add" url="cgformButtonController.do?addorupdate&formId=${formId}" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="common.edit" icon="icon-edit" url="cgformButtonController.do?addorupdate" funname="update"></t:dgToolBar>
    +	<t:dgToolBar title="common.view" icon="icon-search" url="cgformButtonController.do?addorupdate" funname="detail"></t:dgToolBar>
    +</t:datagrid>
    +</div>
    +</div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/button/cgformButtonSql.jsp b/src/main/webapp/webpage/jeecg/cgform/button/cgformButtonSql.jsp
    new file mode 100644
    index 00000000..c2de1905
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/button/cgformButtonSql.jsp
    @@ -0,0 +1,68 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鎸夐挳sql澧炲己</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="cgformButtonSqlController.do?save">
    +	<input id="id" name="id" type="hidden" value="${cgformButtonSqlPage.id }">
    +	<input id="formId" name="formId" type="hidden" value="${cgformButtonSqlPage.formId }">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="operate.code"/>: </label></td>
    +			<td class="value"><select id="buttonCode" name="buttonCode" datatype="*">
    +				<option value="add" <c:if test="${cgformButtonSqlPage.buttonCode=='add'}">selected="selected"</c:if>>add</option>
    +				<option value="update" <c:if test="${cgformButtonSqlPage.buttonCode=='update'}">selected="selected"</c:if>>update</option>
    +				<option value="delete" <c:if test="${cgformButtonSqlPage.buttonCode=='delete'}">selected="selected"</c:if>>delete</option>
    +				<c:forEach items="${buttonList}" var="button">
    +					<option value="${button.buttonCode }" <c:if test="${button.buttonCode==cgformButtonSqlPage.buttonCode}">selected="selected"</c:if>>${button.buttonCode}</option>
    +				</c:forEach>
    +			</select> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.description"/>: </label></td>
    +			<td class="value"><textarea id="content" name="content" cols="100" rows="3">${cgformButtonSqlPage.content}</textarea> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="enhance.sql"/>: </label></td>
    +			<td class="value"><textarea id="cgbSqlStr" name="cgbSqlStr" rows="25" cols="150">${cgformButtonSqlPage.cgbSqlStr }</textarea> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    +<script type="text/javascript">
    + $('#buttonCode').change(function() {
    +	 var buttonCode =$('#buttonCode').val();
    +	 var formId =$('#formId').val();
    +	 $.ajax({
    +			async : false,
    +			cache : false,
    +			type : 'POST',
    +			contentType : 'application/json', 
    +			dataType:"json",
    +			url : "cgformButtonSqlController.do?doCgformButtonSql&buttonCode="+buttonCode+"&formId="+formId,// 璇锋眰鐨刟ction璺緞
    +			error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +				alert('<t:mutiLang langKey="get.error"/>');
    +				frameElement.api.close();
    +			},
    +			success : function(data) {
    +				var d = data;
    +				if (d.success) {
    +					var cgformButtonSqlPage = d.obj;
    +					$('#id').val(cgformButtonSqlPage.id);
    +					$('#content').val(cgformButtonSqlPage.content);
    +					$('#cgbSqlStr').val(cgformButtonSqlPage.cgbSqlStr);
    +				}else{
    +					$('#id').val("");
    +					$('#content').val("");
    +					$('#cgbSqlStr').val("");
    +				}
    +			}
    +		});
    +	 
    + });
    +</script>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/button/cgformButtonSqlOut.jsp b/src/main/webapp/webpage/jeecg/cgform/button/cgformButtonSqlOut.jsp
    new file mode 100644
    index 00000000..7399457f
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/button/cgformButtonSqlOut.jsp
    @@ -0,0 +1,49 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>SQL瀵煎嚭</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table">
    +	<input id="formId" name="formId" type="hidden" value="${formId}">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 琛ㄥ悕: </label></td>
    +			<td class="value"><input class="inputxt" id="tableName" name="tableName" value="${tableName}" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +<div id="tableList" style="height: 400px;"></div>
    +</body>
    +<script type="text/javascript">
    + function getTableList() {
    +	 var tableName =$('#tableName').val();
    +	 $.ajax({
    +			async : false,
    +			cache : false,
    +			type : 'POST',
    +			contentType : 'application/json', 
    +			dataType:"json",
    +			url : "cgformButtonSqlOutInController.do?list&tableName="+tableName,// 璇锋眰鐨刟ction璺緞
    +			error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +				alert("鍑洪敊浜");
    +				frameElement.api.close();
    +			},
    +			success : function(data) {
    +				var d = data;
    +				if (d.success) {
    +					//document.getElementById("tableList").innerHTML.val(d.obj);
    +					$('#tableList').html(d.obj);
    +				}else{
    +					document.getElementById("tableList").innerHTML.val("");
    +				}
    +			}
    +		});
    +	 
    + };
    + 
    +</script>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/cgformcategory/cgformCategory.jsp b/src/main/webapp/webpage/jeecg/cgform/cgformcategory/cgformCategory.jsp
    new file mode 100644
    index 00000000..8183b0f1
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/cgformcategory/cgformCategory.jsp
    @@ -0,0 +1,52 @@
    +<%@ page language="java" import="java.util.*"
    +	contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>琛ㄥ崟鍒嗙</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript">
    +	$(function() {
    +		$('#categoryTree').combotree({
    +			url : 'categoryController.do?combotree&selfCode=02',
    +			panelHeight : 200,
    +			width : 157,
    +			onClick : function(node) {
    +				$("#categoryId").val(node.id);
    +			}
    +		});
    +	});
    +</script>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +	<t:formvalid formid="formobj" dialog="true" usePlugin="password"
    +		layout="table" action="cgformCategoryController.do?save">
    +		<input id="id" name="id" type="hidden"
    +			value="${cgformCategoryPage.id }">
    +		<table style="width: 600px;" cellpadding="0" cellspacing="1"
    +			class="formtable">
    +			<tr>
    +				<td align="right"><label class="Validform_label"> 琛ㄥ崟: </label></td>
    +				<td class="value"><input id="formId" name="form.id"
    +					value="${cgformCategoryPage.form.id}" type="hidden" >
    +					<input name="form.content" class="inputxt"
    +					value="${cgformCategoryPage.form.content }" id="content"
    +					readonly="readonly" datatype="*" /> <t:choose
    +						hiddenName="formId" hiddenid="id"
    +						url="cgFormHeadController.do?cgForms"
    +						name="tableSelectPropertyList" icon="icon-search"
    +						title="smart.form.config" textname="content" isclear="true"></t:choose></td>
    +			</tr>
    +			<tr>
    +				<td align="right"><label class="Validform_label"> 鎵灞炲垎绫:
    +				</label></td>
    +				<td class="value"><input id="categoryTree"
    +					value="${cgformCategoryPage.category.name}"> <input
    +					id="categoryId" name="category.code"
    +					style="display: none;" value="${cgformCategoryPage.category.code}">
    +					<span class="Validform_checktip"></span></td>
    +			</tr>
    +		</table>
    +	</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/cgformcategory/cgformCategoryList.jsp b/src/main/webapp/webpage/jeecg/cgform/cgformcategory/cgformCategoryList.jsp
    new file mode 100644
    index 00000000..7919d4ca
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/cgformcategory/cgformCategoryList.jsp
    @@ -0,0 +1,60 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8"
    +	pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<div class="easyui-layout" fit="true">
    +	<div region="west" style="width: 220px;" split="true">
    +		<div class="easyui-panel" title='Online鍒嗙被鑿滃崟' style="padding: 10px;"
    +			fit="true" border="false" id="function-panel">
    +			<ul id="onlineCategoryTree"></ul>
    +		</div>
    +	</div>
    +	<div id="tt"></div>
    +	<div region="center" style="padding: 1px;">
    +		<t:datagrid name="cgformCategoryList" title="Online Table 鍒嗙被"
    +			actionUrl="cgformCategoryController.do?datagrid&category.code=cgformCategoryController"
    +			idField="id" fit="true">
    +			<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +			<t:dgCol title="琛ㄥ崟鍚嶇О" field="form_isDbSynch" hidden="true"></t:dgCol>
    +			<t:dgCol title="琛ㄥ崟ID" field="form_id" hidden="true"></t:dgCol>
    +			<t:dgCol title="琛ㄥ崟鍚嶇О" field="form_content" width="100" query="true"></t:dgCol>
    +			<t:dgCol title="鍒嗙被" field="category_name" width="100"></t:dgCol>
    +			<t:dgCol title="琛ㄥ崟鍦板潃" field="form_tableName"
    +				extendParams="formatter:formNameFormatter;" width="200"></t:dgCol>
    +			<t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +			<t:dgDelOpt title="common.delete"
    +				url="cgformCategoryController.do?del&id={id}" />
    +			<t:dgFunOpt exp="form_isDbSynch#eq#Y&&jformType#ne#3"
    +				funname="addbytab(form_id,form_content)" title="form.template"></t:dgFunOpt>
    +			<t:dgToolBar title="褰曞叆" icon="icon-add" width="600" height="300"
    +				url="cgformCategoryController.do?addorupdate" funname="add"></t:dgToolBar>
    +			<t:dgToolBar title="缂栬緫" icon="icon-edit" width="600" height="300"
    +				url="cgformCategoryController.do?addorupdate" funname="update"></t:dgToolBar>
    +		</t:datagrid>
    +	</div>
    +</div>
    +<
    +<script type="text/javascript">
    +	function addbytab(id, content) {
    +		addOneTab('<t:mutiLang langKey="form.template"/>',
    +				"cgformFtlController.do?cgformFtl2&formid=" + id);
    +	}
    +
    +	function formNameFormatter(value, row, index) {
    +		return "cgAutoListController.do?list&id" + value;
    +	}
    +	
    +	var _finalUrl = "cgformCategoryController.do?datagrid&category.code=";
    +
    +	$('#onlineCategoryTree').tree({
    +		url : "categoryController.do?tree&selfCode=02",
    +		onClick : function(node) {
    +			var loadUrl = $("#cgformCategoryList").datagrid('options').url;
    +			loadUrl = loadUrl.replace(_finalUrl,'');
    +			loadUrl = loadUrl.substr(loadUrl.indexOf("&"));
    +			loadUrl = _finalUrl + node.id + loadUrl;
    +			$("#cgformCategoryList").datagrid('options').url = loadUrl;
    +			$("#cgformCategoryList").datagrid('load');
    +		}
    +	});
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtl.jsp b/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtl.jsp
    new file mode 100644
    index 00000000..a431b821
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtl.jsp
    @@ -0,0 +1,26 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>涓婁紶Word甯冨眬妯℃澘</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="div" beforeSubmit="upload">
    +	<input id="id" name="id" type="hidden" value="${cgformFtlPage.id }">
    +	<input id="cgformId" name="cgformId" type="hidden" value="${cgformFtlPage.cgformId }">
    +		<input id="editorType" name="editorType" type="hidden" value="01">
    +	<fieldset class="step">
    +	<div class="form">
    +	     <label class="Validform_label">琛ㄥ崟妯℃澘鍚嶇О:</label> 
    +	     <input class="inputxt" id="cgformName" name="cgformName" value="${cgformFtlPage.cgformName}" datatype="*"> 
    +	     <span class="Validform_checktip"></span></div>
    +	<div class="form">
    +	     <t:upload name="fiels" buttonText="閫夋嫨Word妯℃澘鏂囦欢" uploader="cgformFtlController.do?saveWordFiles" extend="*.doc" id="file_upload" formData="id,cgformId,cgformName,ftlVersion,ftlStatus"></t:upload>
    +	</div>
    +	<div class="form" id="filediv" style="height: 50px"></div>
    +
    +	</fieldset>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtlEditor.jsp b/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtlEditor.jsp
    new file mode 100644
    index 00000000..f1004f2a
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtlEditor.jsp
    @@ -0,0 +1,36 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>FCK妯℃澘</title>
    +<t:base type="jquery,easyui,tools,ckeditor"></t:base>
    +<SCRIPT type="text/javascript">
    +  function test(data) {
    +	  $.messager.alert('鎻愮ず淇℃伅', data.msg);
    +		//closetab('TAB鏂瑰紡娣诲姞');
    +	}
    +  </SCRIPT>
    +</head>
    +<body>
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="cgformFtlController.do?saveEditor" >
    +	<input id="id" name="id" type="hidden" value="${cgformFtlPage.id}">
    +	<input id="cgformId" name="cgformId" type="hidden" value="${cgformFtlPage.cgformId}">
    +	<input id="ftlVersion" name="ftlVersion" type="hidden" value="${cgformFtlPage.ftlVersion}">
    +	<input id="ftlWordUrl" name="ftlWordUrl" type="hidden" value="${cgformFtlPage.ftlWordUrl}">
    +	<input id="createBy" name="createBy" type="hidden" value="${cgformFtlPage.createBy}">
    +	<input id="createName" name="createName" type="hidden" value="${cgformFtlPage.createName}">
    +	<input id="createDate" name="createDate" type="hidden" value="${cgformFtlPage.createDate}">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label">妯℃澘鍚嶇О:</label></td>
    +			<td class="value"><input class="inputxt" id="cgformName" name="cgformName" value="${cgformFtlPage.cgformName}" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label">妯℃澘:</label></td>
    +			<td class="value"><t:ckeditor name="ftlContent" isfinder="false" type="height:400,width:750"
    +				value="${cgformFtlPage.ftlContent == NULL || cgformFtlPage.ftlContent == '' ? cgformStr : cgformFtlPage.ftlContent}"></t:ckeditor></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtlList.jsp b/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtlList.jsp
    new file mode 100644
    index 00000000..5ed296d8
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtlList.jsp
    @@ -0,0 +1,41 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="cgformFtlList" title="琛ㄥ崟妯℃澘鍒楄〃" actionUrl="cgformFtlController.do?datagrid&cgformId=${formid}" idField="id" fit="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="琛ㄥ崟ID" field="cgformId" hidden="true"></t:dgCol>
    +	<t:dgCol title="妯℃澘鍚嶇О" field="cgformName"></t:dgCol>
    +	<t:dgCol title="鐗堟湰鍙" field="ftlVersion"></t:dgCol>
    +	<t:dgCol title="婵娲荤姸鎬" field="ftlStatus" replace="鏈縺娲籣0,宸叉縺娲籣1"></t:dgCol>
    +	<t:dgCol title="word璺緞" field="ftlWordUrl"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="鍒犻櫎" url="cgformFtlController.do?del&id={id}&formId=${formid}" exp="ftlStatus#eq#0" />
    +	<t:dgConfOpt title="婵娲" url="cgformFtlController.do?active&id={id}&formId=${formid}" exp="ftlStatus#eq#0" message="纭婵娲绘ā鏉"/>
    +	<t:dgConfOpt title="鍙栨秷婵娲" url="cgformFtlController.do?cancleActive&id={id}&formId=${formid}" exp="ftlStatus#eq#1" message="纭鍙栨秷婵娲"/>
    +	<t:dgFunOpt funname="ftleditor(id,cgformName)" title="妯℃澘缂栬緫"></t:dgFunOpt>
    +	<t:dgToolBar title="Word妯℃澘涓婁紶" icon="icon-add" url="cgformFtlController.do?addorupdate&cgformId=${formid}" funname="add"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +
    +<script type="text/javascript">
    +  	function ftleditor(id,cgformName){
    +  		$.dialog({
    +			content: "url:cgformFtlController.do?formEkeditor&id="+id,
    +			lock : true,
    +			title:"妯℃澘缂栬緫 ["+cgformName+"]",
    +			opacity : 0.3,
    +			width:900,
    +			height:500,
    +			cache:false,
    +		    ok: function(){
    +		    	iframe = this.iframe.contentWindow;
    +		    	iframe.goForm();
    +				return false;
    +		    },
    +		    cancelVal: '鍏抽棴',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		});
    +	}
    +
    +</script>
    diff --git a/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtlList2.jsp b/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtlList2.jsp
    new file mode 100644
    index 00000000..3ce2274e
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtlList2.jsp
    @@ -0,0 +1,57 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="cgformFtlList" title="琛ㄥ崟妯℃澘鍒楄〃" actionUrl="cgformFtlController.do?datagrid&cgformId=${formid}" idField="id" fit="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="琛ㄥ崟ID" field="cgformId" hidden="true"></t:dgCol>
    +	<t:dgCol title="妯℃澘鍚嶇О" field="cgformName"></t:dgCol>
    +	<t:dgCol title="鐗堟湰鍙" field="ftlVersion"></t:dgCol>
    +	<t:dgCol title="婵娲荤姸鎬" field="ftlStatus" replace="鏈縺娲籣0,宸叉縺娲籣1"></t:dgCol>
    +	<t:dgCol title="word璺緞" field="ftlWordUrl"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="鍒犻櫎" exp="ftlStatus#eq#0" url="cgformFtlController.do?del&id={id}&formId=${formid}" />
    +	<t:dgConfOpt title="婵娲" url="cgformFtlController.do?active&id={id}&formId=${formid}" message="纭婵娲绘ā鏉" exp="ftlStatus#eq#0"/>
    +	<t:dgConfOpt title="鍙栨秷婵娲" url="cgformFtlController.do?cancleActive&id={id}&formId=${formid}" message="纭鍙栨秷婵娲" exp="ftlStatus#eq#1"/>
    +	<t:dgFunOpt funname="preview(id,cgformName)" title="妯℃澘棰勮"></t:dgFunOpt>
    +	<t:dgToolBar title="Word妯℃澘涓婁紶" icon="icon-add" funname="add" url="cgformFtlController.do?addorupdate&editorType=03&cgformId=${formid}"></t:dgToolBar>
    +	<t:dgToolBar title="鑷畾涔塅CK妯℃澘" icon="icon-add" funname="add" width="100%" url="cgformFtlController.do?addorupdate&cgformId=${formid}" height="100%"></t:dgToolBar>
    +	<t:dgToolBar title="鑷畾涔夊竷灞妯℃澘" icon="icon-add" funname="add" url="cgformFtlController.do?addorupdate&editorType=02&cgformId=${formid}" width="100%" height="100%"></t:dgToolBar>
    +	<t:dgToolBar title="妯℃澘缂栬緫" icon="icon-edit" funname="update" url="cgformFtlController.do?addorupdate&cgformId=${formid}" width="100%" height="100%"></t:dgToolBar>
    +</t:datagrid></div>
    +</div><script type="text/javascript">
    +  	function preview(id,cgformName){
    +  		$.dialog({
    +			content: "url:cgformFtlController.do?formEkeditor&editorType=preview&id="+id,
    +			lock : true,
    +			title:"妯℃澘棰勮 ["+cgformName+"]",
    +			opacity : 0.3,
    +			width:900,
    +			height:500,
    +			cache:false,
    +		    ok: function(){
    +		    	iframe = this.iframe.contentWindow;
    +		    	iframe.goForm();
    +				return false;
    +		    },
    +		    cancelVal: '鍏抽棴',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		});
    +	}
    +function updateOneTab(title,url, id,width,height) {
    +		gridname=id;
    +	var rowsData = $('#'+id).datagrid('getSelections');
    +	if (!rowsData || rowsData.length==0) {
    +		tip('Please select edit item');
    +		return;
    +	}
    +	if (rowsData.length>1) {
    +		tip('Please one item to edit');
    +		return;
    +	}
    +	
    +	url += '&id='+rowsData[0].id;
    +	addOneTab(title, url);
    +}
    +
    +</script>
    diff --git a/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtlUEditor.jsp b/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtlUEditor.jsp
    new file mode 100644
    index 00000000..5740e413
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/cgformftl/cgformFtlUEditor.jsp
    @@ -0,0 +1,380 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鑷畾涔夊竷灞妯℃澘</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<SCRIPT type="text/javascript">
    +  function test(data) {
    +	  $.messager.alert('鎻愮ず淇℃伅', data.msg);
    +	}
    +  </SCRIPT>
    +</head>
    +<body>
    +<t:formvalid formid="formobj" beforeSubmit="setFtlContent()"  dialog="true" usePlugin="password" layout="table" action="cgformFtlController.do?saveEditor" >
    +	<input id="id" name="id" type="hidden" value="${cgformFtlPage.id}">
    +	<input id="cgformId" name="cgformId" type="hidden" value="${cgformFtlPage.cgformId}">
    +	<input id="ftlVersion" name="ftlVersion" type="hidden" value="${cgformFtlPage.ftlVersion}">
    +	<input id="ftlWordUrl" name="ftlWordUrl" type="hidden" value="${cgformFtlPage.ftlWordUrl}">
    +	<input id="createBy" name="createBy" type="hidden" value="${cgformFtlPage.createBy}">
    +	<input id="createName" name="createName" type="hidden" value="${cgformFtlPage.createName}">
    +	<input id="createDate" name="createDate" type="hidden" value="${cgformFtlPage.createDate}">
    +	<input id="editorType" name="editorType" type="hidden" value="02">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label">妯℃澘鍚嶇О:</label></td>
    +			<td class="value"><input class="inputxt" id="cgformName" name="cgformName" value="${cgformFtlPage.cgformName}" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			
    +			<td class="value" colspan=2><input type="hidden" id="ftl" name="ftlContent" >
    +			<script id="ftlContent" type="text/plain" style="width:100%;">${cgformFtlPage.ftlContent == NULL || cgformFtlPage.ftlContent == '' ? '' : cgformFtlPage.ftlContent}
    +</script></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +<script>UEDITOR_HOME_URL='<%=path%>/plug-in/Formdesign/js/ueditor/';</script>
    +<script type="text/javascript" charset="utf-8" src="plug-in/Formdesign/js/ueditor/ueditor.config.js?2023"></script>
    +<script type="text/javascript" charset="utf-8" src="plug-in/Formdesign/js/ueditor/ueditor.all.js?2023"> </script>
    +<script type="text/javascript" charset="utf-8" src="plug-in/Formdesign/js/ueditor/lang/zh-cn/zh-cn.js?2023"></script>
    +<script type="text/javascript" charset="utf-8" src="plug-in/Formdesign/js/ueditor/formdesign/leipi.formdesign.v4.js?2023"></script>
    +
    +<script type="text/javascript" charset="utf-8" src="plug-in/Formdesign/js/ueditor/formdesign/weixinplugs.js"></script>
    +<script type="text/javascript">
    +
    +var leipiEditor = UE.getEditor('ftlContent',{
    +            //allowDivTransToP: false,//闃绘杞崲div 涓簆
    +            toolleipi:true,//鏄惁鏄剧ず锛岃璁″櫒鐨 toolbars
    +            textarea: 'design_content',   
    +            //杩欓噷鍙互閫夋嫨鑷繁闇瑕佺殑宸ュ叿鎸夐挳鍚嶇О,姝ゅ浠呴夋嫨濡備笅浜斾釜            /*
    +            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',  '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', 'help', 'drafts'
    +        ]],/*
    +           toolbars:[[
    +            'fullscreen', 'source', '|', 'undo', 'redo', '|','bold', 'italic', 'underline', 'fontborder', 'strikethrough',  'removeformat',
    +             '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist','|', 'fontfamily', 'fontsize',
    +              '|', 'indent', '|', 'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 
    +               'link', 'unlink',  '|',  'horizontal',  'spechars',  'wordimage', '|', 'inserttable',
    +                'deletetable',  'mergecells',  'splittocells']],
    +            //focus鏃惰嚜鍔ㄦ竻绌哄垵濮嬪寲鏃剁殑鍐呭            */
    +            //autoClearinitialContent:true,
    +            //鍏抽棴瀛楁暟缁熻
    +            wordCount:false,
    +            //鍏抽棴elementPath
    +            elementPathEnabled:false,
    +            //榛樿鐨勭紪杈戝尯鍩熼珮搴
    +            initialFrameHeight:400
    +            ///,iframeCssUrl:"css/bootstrap/css/bootstrap.css" //寮曞叆鑷韩 css浣跨紪杈戝櫒鍏煎浣犵綉绔檆ss
    +            //鏇村鍏朵粬鍙傛暟锛岃鍙傝僽editor.config.js涓殑閰嶇疆椤
    +        });
    +
    + var leipiFormDesign = {
    +    /*鎵ц鎺т欢*/
    +    exec : function (method) {
    +        leipiEditor.execCommand(method);
    +    },
    +    /*
    +        Javascript 瑙f瀽琛ㄥ崟
    +        template 琛ㄥ崟璁捐鍣ㄩ噷鐨凥tml鍐呭
    +        fields 瀛楁鎬绘暟
    +    */
    +   parse_form:function(template,fields)
    +    {
    +        //姝e垯  radios|checkboxs|select 鍖归厤鐨勮竟鐣 |--|  鍥犱负褰撲娇鐢 {} 鏃秊s鎶ラ敊
    +        var preg =  /(\|-<span(((?!<span).)*leipiplugins=\"(radios|checkboxs|select)\".*?)>(.*?)<\/span>-\||<(img|input|textarea|select).*?(<\/select>|<\/textarea>|\/>))/gi,
    +        preg_attr =/(\w+)=\"(.?|.+?)\"/gi,
    +        preg_group =/<input.*?\/>/gi;
    +        if(!fields) fields = 0;
    +
    +        var template_parse = template,template_data = new Array(),add_fields=new Object(),checkboxs=0;
    +
    +        var pno = 0;
    +        template.replace(preg, function(plugin,p1,p2,p3,p4,p5,p6){
    +            var parse_attr = new Array(),attr_arr_all = new Object(),name = '', select_dot = '' , is_new=false;
    +            var p0 = plugin;
    +            var tag = p6 ? p6 : p4;
    +            //alert(tag + " \n- t1 - "+p1 +" \n-2- " +p2+" \n-3- " +p3+" \n-4- " +p4+" \n-5- " +p5+" \n-6- " +p6);
    +
    +            if(tag == 'radios' || tag == 'checkboxs')
    +            {
    +                plugin = p2;
    +            }else if(tag == 'select')
    +            {
    +                plugin = plugin.replace('|-','');
    +                plugin = plugin.replace('-|','');
    +            }
    +            plugin.replace(preg_attr, function(str0,attr,val) {
    +                    if(attr=='name')
    +                    {
    +                        if(val=='leipiNewField')
    +                        {
    +                            is_new=true;
    +                            fields++;
    +                            val = 'data_'+fields;
    +                        }
    +                        name = val;
    +                    }
    +                    
    +                    if(tag=='select' && attr=='value')
    +                    {
    +                        if(!attr_arr_all[attr]) attr_arr_all[attr] = '';
    +                        attr_arr_all[attr] += select_dot + val;
    +                        select_dot = ',';
    +                    }else
    +                    {
    +                        attr_arr_all[attr] = val;
    +                    }
    +                    var oField = new Object();
    +                    oField[attr] = val;
    +                    parse_attr.push(oField);
    +            }) 
    +            /*alert(JSON.stringify(parse_attr));return;*/
    +             if(tag =='checkboxs') /*澶嶉夌粍  澶氫釜瀛楁 */
    +             {
    +                plugin = p0;
    +                plugin = plugin.replace('|-','');
    +                plugin = plugin.replace('-|','');
    +                var name = 'checkboxs_'+checkboxs;
    +                attr_arr_all['parse_name'] = name;
    +                attr_arr_all['name'] = '';
    +                attr_arr_all['value'] = '';
    +                
    +                attr_arr_all['content'] = '<span leipiplugins="checkboxs"  title="'+attr_arr_all['title']+'">';
    +                var dot_name ='', dot_value = '';
    +                p5.replace(preg_group, function(parse_group) {
    +                    var is_new=false,option = new Object();
    +                    parse_group.replace(preg_attr, function(str0,k,val) {
    +                        if(k=='name')
    +                        {
    +                            if(val=='leipiNewField')
    +                            {
    +                                is_new=true;
    +                                fields++;
    +                                val = 'data_'+fields;
    +                            }
    +
    +                            attr_arr_all['name'] += dot_name + val;
    +                            dot_name = ',';
    +
    +                        }
    +                        else if(k=='value')
    +                        {
    +                            attr_arr_all['value'] += dot_value + val;
    +                            dot_value = ',';
    +
    +                        }
    +                        option[k] = val;    
    +                    });
    +                    
    +                    if(!attr_arr_all['options']) attr_arr_all['options'] = new Array();
    +                    attr_arr_all['options'].push(option);
    +                    //if(!option['checked']) option['checked'] = '';
    +                    var checked = option['checked'] !=undefined ? 'checked="checked"' : '';
    +                    attr_arr_all['content'] +='<input type="checkbox" name="'+option['name']+'" value="'+option['value']+'"  '+checked+'/>'+option['value']+'&nbsp;';
    +
    +                    if(is_new)
    +                    {
    +                        var arr = new Object();
    +                        arr['name'] = option['name'];
    +                        arr['leipiplugins'] = attr_arr_all['leipiplugins'];
    +                        add_fields[option['name']] = arr;
    +
    +                    }
    +
    +                });
    +                attr_arr_all['content'] += '</span>';
    +
    +                //parse
    +                template = template.replace(plugin,attr_arr_all['content']);
    +                template_parse = template_parse.replace(plugin,'{'+name+'}');
    +                template_parse = template_parse.replace('{|-','');
    +                template_parse = template_parse.replace('-|}','');
    +                template_data[pno] = attr_arr_all;
    +                checkboxs++;
    +
    +             }else if(name)
    +            {
    +                if(tag =='radios') /*鍗曢夌粍  涓涓瓧娈*/
    +                {
    +                    plugin = p0;
    +                    plugin = plugin.replace('|-','');
    +                    plugin = plugin.replace('-|','');
    +                    attr_arr_all['value'] = '';
    +                    attr_arr_all['content'] = '<span leipiplugins="radios" name="'+attr_arr_all['name']+'" title="'+attr_arr_all['title']+'">';
    +                    var dot='';
    +                    p5.replace(preg_group, function(parse_group) {
    +                        var option = new Object();
    +                        parse_group.replace(preg_attr, function(str0,k,val) {
    +                            if(k=='value')
    +                            {
    +                                attr_arr_all['value'] += dot + val;
    +                                dot = ',';
    +                            }
    +                            option[k] = val;    
    +                        });
    +                        option['name'] = attr_arr_all['name'];
    +                        if(!attr_arr_all['options']) attr_arr_all['options'] = new Array();
    +                        attr_arr_all['options'].push(option);
    +                        //if(!option['checked']) option['checked'] = '';
    +                        var checked = option['checked'] !=undefined ? 'checked="checked"' : '';
    +                        attr_arr_all['content'] +='<input type="radio" name="'+attr_arr_all['name']+'" value="'+option['value']+'"  '+checked+'/>'+option['value']+'&nbsp;';
    +
    +                    });
    +                    attr_arr_all['content'] += '</span>';
    +
    +                }else
    +                {
    +                    attr_arr_all['content'] = is_new ? plugin.replace(/leipiNewField/,name) : plugin;
    +                }
    +                //attr_arr_all['itemid'] = fields;
    +                //attr_arr_all['tag'] = tag;
    +                template = template.replace(plugin,attr_arr_all['content']);
    +                template_parse = template_parse.replace(plugin,'{'+name+'}');
    +                template_parse = template_parse.replace('{|-','');
    +                template_parse = template_parse.replace('-|}','');
    +                if(is_new)
    +                {
    +                    var arr = new Object();
    +                    arr['name'] = name;
    +                    arr['leipiplugins'] = attr_arr_all['leipiplugins'];
    +                    add_fields[arr['name']] = arr;
    +                }
    +                template_data[pno] = attr_arr_all;
    +
    +               
    +            }
    +            pno++;
    +        })
    +        var parse_form = new Object({
    +            'fields':fields,//鎬诲瓧娈垫暟
    +            'template':template,//瀹屾暣html
    +            'parse':template_parse,//鎺т欢鏇挎崲涓簕data_1}鐨刪tml
    +            'data':template_data,//鎺т欢灞炴
    +            'add_fields':add_fields//鏂板鎺т欢
    +        });
    +        return JSON.stringify(parse_form);
    +    },
    +    /*type  =  save 淇濆瓨璁捐 versions 淇濆瓨鐗堟湰  close鍏抽棴 */
    +    fnCheckForm : function ( type ) {
    +        if(leipiEditor.queryCommandState( 'source' ))
    +            leipiEditor.execCommand('source');//鍒囨崲鍒扮紪杈戞ā寮忔墠鎻愪氦锛屽惁鍒欐湁bug
    +            
    +        if(leipiEditor.hasContents()){
    +            leipiEditor.sync();/*鍚屾鍐呭*/
    +            
    +            alert("浣犵偣鍑讳簡淇濆瓨,杩欓噷鍙互寮傛鎻愪氦锛岃鑷澶勭悊....");
    +			$("#ftl").val(leipiEditor.getContent());
    +            return false;
    +            var type_value='',formid=0,fields=$("#fields").val(),formeditor='';
    +
    +            if( typeof type!=='undefined' ){
    +                type_value = type;
    +            }
    +            //鑾峰彇琛ㄥ崟璁捐鍣ㄩ噷鐨勫唴瀹
    +            formeditor=leipiEditor.getContent();
    +            //瑙f瀽琛ㄥ崟璁捐鍣ㄦ帶浠
    +            var parse_form = this.parse_form(formeditor,fields);
    +            //alert(parse_form);
    +            
    +             //寮傛鎻愪氦鏁版嵁
    +             $.ajax({
    +                type: 'POST',
    +                url : 'cgformFtlController.do?saveEditor',
    +                //dataType : 'json',
    +                data : {'type' : type_value,'formid':formid,'parse_form':parse_form},
    +                success : function(data){
    +                    if(confirm('鏌ョ湅js瑙f瀽鍚庯紝鎻愪氦鍒版湇鍔″櫒鐨勬暟鎹紝璇蜂复鏃跺厑璁稿脊绐'))
    +                    {
    +                        win_parse=window.open('','','width=800,height=600');
    +                        //杩欓噷涓存椂鏌ョ湅锛屾墍浠ユ浛鎹竴涓嬶紝瀹為檯鎯呭喌涓嬩笉闇瑕佹浛鎹  
    +                        data  = data.replace(/<\/+textarea/,'&lt;textarea');
    +                        win_parse.document.write('<textarea style="width:100%;height:100%">'+data+'</textarea>');
    +                        win_parse.focus();
    +                    }
    +                    
    +                    /*
    +                  if(data.success==1){
    +                      alert('淇濆瓨鎴愬姛');
    +                      $('#submitbtn').button('reset');
    +                  }else{
    +                      alert('淇濆瓨澶辫触锛');
    +                  }*/
    +                }
    +            });
    +            
    +        } else {
    +            alert('琛ㄥ崟鍐呭涓嶈兘涓虹┖锛')
    +            $('#submitbtn').button('reset');
    +            return false;
    +        }
    +    } ,
    +   // 棰勮琛ㄥ崟
    +    fnReview : function (){
    +        if(leipiEditor.queryCommandState( 'source' ))
    +            leipiEditor.execCommand('source');
    +            
    +        if(leipiEditor.hasContents()){
    +            leipiEditor.sync();       
    +            
    +            var type_value='',formid=0,fields=$("#fields").val(),formeditor='';
    +            formeditor=leipiEditor.getContent();
    +            //瑙f瀽琛ㄥ崟璁捐鍣ㄦ帶浠
    +            var parse_form = this.parse_form(formeditor,fields);    
    +           var style= '<link rel="stylesheet" href="plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap.css">'+
    +           ' <link rel="stylesheet" href="plug-in/Formdesign/js/ueditor/formdesign/leipi.style.css">';
    +           $.ajax({
    +                type: 'POST',
    +                url : 'cgformFtlController.do?parseUeditor',
    +                dataType : 'json',
    +                data : {'action' :'view1','parseForm':parse_form},
    +                success : function(msg){
    +						//alert(msg);
    +                    	 W.$.dialog({
    +                 			content:style+msg.msg,// "url:cgformFtlController.do?formEkeditor&editorType=preview&id=${cgformFtlPage.id}",
    +                 			lock : true,
    +                 			title:"妯℃澘棰勮 [${cgformFtlPage.cgformName}]",
    +                 			opacity : 0.5,
    +                 			width:500,
    +                 			height:400,
    +                 			cache:false,
    +                 			modal:false,
    +                 		    ok: function(){
    +                 		    	iframe = this.iframe.contentWindow;
    +                 		    	iframe.goForm();
    +                 				return false;
    +                 		    },
    +                 		    cancelVal: '鍏抽棴',
    +                 		    cancel: true 
    +                 		});
    +          
    +                }
    +            });
    +           
    +        } else {
    +            alert('琛ㄥ崟鍐呭涓嶈兘涓虹┖锛');
    +            return false;
    +        }
    +    }
    +};
    +function setFtlContent(){
    +    if(leipiEditor.queryCommandState( 'source' ))
    +            leipiEditor.execCommand('source');//鍒囨崲鍒扮紪杈戞ā寮忔墠鎻愪氦锛屽惁鍒欐湁bug
    +            
    +    if(leipiEditor.hasContents()){
    +        leipiEditor.sync();
    +	    $("#ftl").val(leipiEditor.getContent());
    +	}
    +}
    +</script>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/cgformftl/ckeditor.jsp b/src/main/webapp/webpage/jeecg/cgform/cgformftl/ckeditor.jsp
    new file mode 100644
    index 00000000..d8d2af2c
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/cgformftl/ckeditor.jsp
    @@ -0,0 +1,31 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript" src="plug-in/ckeditor/ckeditor.js"></script>
    +<script type="text/javascript">
    +	 function goForm() {
    +		 $('#myCkeditorForm').form('submit', {
    +				url : "cgformFtlController.do?saveFormEkeditor",
    +				dataType:"json",
    +				success : function(data) {
    +					var mydata = eval("("+data+")");
    +					//鍏抽棴绐楀彛
    +					frameElement.api.close();
    +				}
    +		});
    +     }
    +	</script>
    +</head>
    +<form action="cgformFtlControllerr.do?saveCkeditor" method="post" id="myCkeditorForm"><input type="hidden" value="${cgformFtlEntity.id}" name="id" /> <textarea cols="80" id="editor1"
    +	name="contents" rows="100">
    +			${contents}
    +		</textarea> <script>
    +		CKEDITOR.replace('editor1',{
    +			height:350,
    +			customConfig:'${pageContext.request.contextPath}/plug-in/ckeditor/ftlConfig.js'
    +		});
    +		</script></form>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/cgformftl/preview.jsp b/src/main/webapp/webpage/jeecg/cgform/cgformftl/preview.jsp
    new file mode 100644
    index 00000000..d2875250
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/cgformftl/preview.jsp
    @@ -0,0 +1,215 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<link rel="stylesheet" href="plug-in/Validform/css/style.css" type="text/css"/>
    +<link rel="stylesheet" href="plug-in/Validform/css/tablefrom.css" type="text/css"/>
    +    <link rel="stylesheet" href="plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap.css">
    +    <!--[if lte IE 6]>
    +    <link rel="stylesheet" type="text/css" href="plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/bootstrap-ie6.css">
    +    <![endif]-->
    +    <!--[if lte IE 7]>
    +    <link rel="stylesheet" type="text/css" href="plug-in/Formdesign/js/ueditor/formdesign/bootstrap/css/ie.css">
    +    <![endif]-->
    +    <link rel="stylesheet" href="plug-in/Formdesign/js/ueditor/formdesign/leipi.style.css">
    +</head>
    +<body>
    +<textarea id="original" style="display:none">${contents}</textarea>
    +<div id='preview'/>
    +<script>
    +$(function(){
    +	var html = parse_form($('#original').val());
    +	 $.ajax({
    +         type: 'POST',
    +         url : 'cgformFtlController.do?parseUeditor',
    +         dataType : 'json',
    +         data : {'action' :'edit','parseForm':html},
    +         success : function(msg){
    +             if(msg.success){
    +				$('#preview').html(msg.msg);
    +			}else{
    +				tip(msg.msg);
    +			}
    +         }
    +     });
    +});
    +function parse_form(template,fields)
    +    {
    +        //姝e垯  radios|checkboxs|select 鍖归厤鐨勮竟鐣 |--|  鍥犱负褰撲娇鐢 {} 鏃秊s鎶ラ敊
    +        var preg =  /(\|-<span(((?!<span).)*leipiplugins=\"(radios|checkboxs|select)\".*?)>(.*?)<\/span>-\||<(img|input|textarea|select).*?(<\/select>|<\/textarea>|\/>))/gi,
    +        preg_attr =/(\w+)=\"(.?|.+?)\"/gi,
    +        preg_group =/<input.*?\/>/gi;
    +        if(!fields) fields = 0;
    +
    +        var template_parse = template,template_data = new Array(),add_fields=new Object(),checkboxs=0;
    +
    +        var pno = 0;
    +        template.replace(preg, function(plugin,p1,p2,p3,p4,p5,p6){
    +            var parse_attr = new Array(),attr_arr_all = new Object(),name = '', select_dot = '' , is_new=false;
    +            var p0 = plugin;
    +            var tag = p6 ? p6 : p4;
    +            //alert(tag + " \n- t1 - "+p1 +" \n-2- " +p2+" \n-3- " +p3+" \n-4- " +p4+" \n-5- " +p5+" \n-6- " +p6);
    +
    +            if(tag == 'radios' || tag == 'checkboxs')
    +            {
    +                plugin = p2;
    +            }else if(tag == 'select')
    +            {
    +                plugin = plugin.replace('|-','');
    +                plugin = plugin.replace('-|','');
    +            }
    +            plugin.replace(preg_attr, function(str0,attr,val) {
    +                    if(attr=='name')
    +                    {
    +                        if(val=='leipiNewField')
    +                        {
    +                            is_new=true;
    +                            fields++;
    +                            val = 'data_'+fields;
    +                        }
    +                        name = val;
    +                    }
    +                    
    +                    if(tag=='select' && attr=='value')
    +                    {
    +                        if(!attr_arr_all[attr]) attr_arr_all[attr] = '';
    +                        attr_arr_all[attr] += select_dot + val;
    +                        select_dot = ',';
    +                    }else
    +                    {
    +                        attr_arr_all[attr] = val;
    +                    }
    +                    var oField = new Object();
    +                    oField[attr] = val;
    +                    parse_attr.push(oField);
    +            }) 
    +            /*alert(JSON.stringify(parse_attr));return;*/
    +             if(tag =='checkboxs') /*澶嶉夌粍  澶氫釜瀛楁 */
    +             {
    +                plugin = p0;
    +                plugin = plugin.replace('|-','');
    +                plugin = plugin.replace('-|','');
    +                var name = 'checkboxs_'+checkboxs;
    +                attr_arr_all['parse_name'] = name;
    +                attr_arr_all['name'] = '';
    +                attr_arr_all['value'] = '';
    +                
    +                attr_arr_all['content'] = '<span leipiplugins="checkboxs"  title="'+attr_arr_all['title']+'">';
    +                var dot_name ='', dot_value = '';
    +                p5.replace(preg_group, function(parse_group) {
    +                    var is_new=false,option = new Object();
    +                    parse_group.replace(preg_attr, function(str0,k,val) {
    +                        if(k=='name')
    +                        {
    +                            if(val=='leipiNewField')
    +                            {
    +                                is_new=true;
    +                                fields++;
    +                                val = 'data_'+fields;
    +                            }
    +
    +                            attr_arr_all['name'] += dot_name + val;
    +                            dot_name = ',';
    +
    +                        }
    +                        else if(k=='value')
    +                        {
    +                            attr_arr_all['value'] += dot_value + val;
    +                            dot_value = ',';
    +
    +                        }
    +                        option[k] = val;    
    +                    });
    +                    
    +                    if(!attr_arr_all['options']) attr_arr_all['options'] = new Array();
    +                    attr_arr_all['options'].push(option);
    +                    //if(!option['checked']) option['checked'] = '';
    +                    var checked = option['checked'] !=undefined ? 'checked="checked"' : '';
    +                    attr_arr_all['content'] +='<input type="checkbox" name="'+option['name']+'" value="'+option['value']+'"  '+checked+'/>'+option['value']+'&nbsp;';
    +
    +                    if(is_new)
    +                    {
    +                        var arr = new Object();
    +                        arr['name'] = option['name'];
    +                        arr['leipiplugins'] = attr_arr_all['leipiplugins'];
    +                        add_fields[option['name']] = arr;
    +
    +                    }
    +
    +                });
    +                attr_arr_all['content'] += '</span>';
    +
    +                //parse
    +                template = template.replace(plugin,attr_arr_all['content']);
    +                template_parse = template_parse.replace(plugin,'{'+name+'}');
    +                template_parse = template_parse.replace('{|-','');
    +                template_parse = template_parse.replace('-|}','');
    +                template_data[pno] = attr_arr_all;
    +                checkboxs++;
    +
    +             }else if(name)
    +            {
    +                if(tag =='radios') /*鍗曢夌粍  涓涓瓧娈*/
    +                {
    +                    plugin = p0;
    +                    plugin = plugin.replace('|-','');
    +                    plugin = plugin.replace('-|','');
    +                    attr_arr_all['value'] = '';
    +                    attr_arr_all['content'] = '<span leipiplugins="radios" name="'+attr_arr_all['name']+'" title="'+attr_arr_all['title']+'">';
    +                    var dot='';
    +                    p5.replace(preg_group, function(parse_group) {
    +                        var option = new Object();
    +                        parse_group.replace(preg_attr, function(str0,k,val) {
    +                            if(k=='value')
    +                            {
    +                                attr_arr_all['value'] += dot + val;
    +                                dot = ',';
    +                            }
    +                            option[k] = val;    
    +                        });
    +                        option['name'] = attr_arr_all['name'];
    +                        if(!attr_arr_all['options']) attr_arr_all['options'] = new Array();
    +                        attr_arr_all['options'].push(option);
    +                        //if(!option['checked']) option['checked'] = '';
    +                        var checked = option['checked'] !=undefined ? 'checked="checked"' : '';
    +                        attr_arr_all['content'] +='<input type="radio" name="'+attr_arr_all['name']+'" value="'+option['value']+'"  '+checked+'/>'+option['value']+'&nbsp;';
    +
    +                    });
    +                    attr_arr_all['content'] += '</span>';
    +
    +                }else
    +                {
    +                    attr_arr_all['content'] = is_new ? plugin.replace(/leipiNewField/,name) : plugin;
    +                }
    +                //attr_arr_all['itemid'] = fields;
    +                //attr_arr_all['tag'] = tag;
    +                template = template.replace(plugin,attr_arr_all['content']);
    +                template_parse = template_parse.replace(plugin,'{'+name+'}');
    +                template_parse = template_parse.replace('{|-','');
    +                template_parse = template_parse.replace('-|}','');
    +                if(is_new)
    +                {
    +                    var arr = new Object();
    +                    arr['name'] = name;
    +                    arr['leipiplugins'] = attr_arr_all['leipiplugins'];
    +                    add_fields[arr['name']] = arr;
    +                }
    +                template_data[pno] = attr_arr_all;
    +
    +               
    +            }
    +            pno++;
    +        })
    +        var parse_form = new Object({
    +            'fields':fields,//鎬诲瓧娈垫暟
    +            'template':template,//瀹屾暣html
    +            'parse':template_parse,//鎺т欢鏇挎崲涓簕data_1}鐨刪tml
    +            'data':template_data,//鎺т欢灞炴
    +            'add_fields':add_fields//鏂板鎺т欢
    +        });
    +        return JSON.stringify(parse_form);
    +    }</script></body>
    +		
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/config/cgFormHead.jsp b/src/main/webapp/webpage/jeecg/cgform/config/cgFormHead.jsp
    new file mode 100644
    index 00000000..cb17866a
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/config/cgFormHead.jsp
    @@ -0,0 +1,194 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@page import="org.jeecgframework.web.cgform.common.CgAutoListConstant"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<%
    +String lang = (String)request.getSession().getAttribute("lang");
    +String langurl = basePath + "/plug-in/mutiLang/" + lang +".js";
    +%>
    +<html>
    +<head>
    +<title><t:mutiLang langKey="smark.form.form.maintain"/></title>
    +<script src=<%=langurl%> type="text/javascript"></script>
    +<t:base type="jquery,easyui,jqueryui-sortable,tools"></t:base>
    +<script type="text/javascript" src="plug-in/cgform/js/cgformField.js"></script>
    +
    +
    +<style type="text/css">
    +.table-list {
    +	margin: 0;
    +	width: auto;
    +	margin-left: 0px;
    +	margin-right: 0px;
    +	overflow: hidden;
    +}
    +
    +.table-list td,.table-list th {
    +	text-align: center;
    +}
    +
    +.t_table {
    +	overflow: auto; /*璁╁唴瀹硅〃鏍煎闈㈢殑div鑷姩鏈夋粴鍔ㄦ潯*/
    +	margin-left: 0px;
    +	margin-right: 0px;
    +	width: auto;
    +}
    +
    +#tab_div_database tr {
    +	border-bottom: 1px solid #e6e6e6;
    +	cursor: n-resize;
    +}
    +/*update-end--Author:liuht  Date:20131207 for[333]锛歄L妯″潡锛屽鍔犱竴涓壒鏁 璋冩暣瀛楁椤哄簭锛堜笂涓嬫尓鍔級*/
    +</style>
    +</head>
    +<body style="overflow-y: hidden; overflow-x: hidden;" scroll="no">
    +<!-- 澧炲姞beforeSubmit椤甸潰閫昏緫鍒犻櫎-->
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" beforeSubmit="deleteUnUsedFiled();" layout="table" tiptype="1" action="cgFormHeadController.do?save">
    +	<!-- tiptype="1" -->
    +	<input id="id" name="id" type="hidden" value="${cgFormHeadPage.id}">
    +	<input id="langurl" name="langurl" type="hidden" value="<%=langurl%>">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="table.name"/>: </label></td>
    +			<td class="value" colspan="3">
    +			  <input class="inputxt" id="tableName" name="tableName" value="${cgFormHeadPage.tableName}"
    +				prefixName="" <c:if test="${not empty cgFormHeadPage.tableName}">readonly="readonly"</c:if> datatype="*" validType="cgform_head,table_Name,id" nullmsg=<t:mutiLang langKey="please.input.table.name"/>> 
    +				<span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="pk.strategies"/>:</label></td>
    +			<td class="value" id="jformPkTypeTd" <c:if test="${cgFormHeadPage.jformPkType ne 'SEQUENCE'}">colspan="3"</c:if>>
    +				<select id="jformPkType" name="jformPkType" onchange="jformPkTypeChange();">
    +					<option value="UUID" <c:if test="${cgFormHeadPage.jformPkType eq 'UUID'}"> selected='selected'</c:if>><t:mutiLang langKey="common.uuid36bit"/></option>
    +					<option value="NATIVE" <c:if test="${cgFormHeadPage.jformPkType eq 'NATIVE'}"> selected='selected'</c:if>><t:mutiLang langKey="common.native.auto.increment"/></option>
    +					<option value="SEQUENCE" <c:if test="${cgFormHeadPage.jformPkType eq 'SEQUENCE'}"> selected='selected'</c:if>><t:mutiLang langKey="common.sequence"/></option>
    +				</select>
    +			</td>
    +			<td align="right" id="jformPkSequenceN" <c:if test="${cgFormHeadPage.jformPkType ne 'SEQUENCE'}">style="display: none;"</c:if>><label class="Validform_label"> <t:mutiLang langKey="sequence.name"/>:</label></td>
    +			<td class="value" id="jformPkSequenceV" <c:if test="${cgFormHeadPage.jformPkType ne 'SEQUENCE'}">style="display: none;"</c:if>><input id="jformPkSequence" name="jformPkSequence" type="text"
    +				class="inputxt" value="${cgFormHeadPage.jformPkSequence}" /> <span class="Validform_checktip"></span> <label class="Validform_label" style="display: none;"> <t:mutiLang langKey="sequence.name"/>:</label></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="table.description"/>: </label></td>
    +			<td class="value"><input class="inputxt" id="content" name="content" value="${cgFormHeadPage.content}" datatype="s2-100"> <span class="Validform_checktip"></span></td>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="table.type"/>: </label></td>
    +			<td class="value"><select id="jformType" name="jformType" onchange="jformTypeChange();">
    +				<option value="1" <c:if test="${cgFormHeadPage.jformType eq '1'}"> selected='selected'</c:if>><t:mutiLang langKey="single.table"/></option>
    +				<option value="2" <c:if test="${cgFormHeadPage.jformType eq '2'}"> selected="selected"</c:if>><t:mutiLang langKey="master.table"/></option>
    +				<option value="3" <c:if test="${cgFormHeadPage.jformType eq '3'}"> selected="selected"</c:if>><t:mutiLang langKey="slave.table"/></option>
    +			</select>
    +			<div id="relation_type_div" style="display: none;"><input type="radio" name="relationType"
    +				<c:if test="${cgFormHeadPage.relationType eq '0' || cgFormHeadPage.relationType ==null }">checked="checked"</c:if> value="0"><t:mutiLang langKey="common.one.to.many"/></input> <input type="radio" name="relationType"
    +				<c:if test="${cgFormHeadPage.relationType eq '1' }">checked="checked"</c:if> value="1"><t:mutiLang langKey="comon.one.to.one"/></input> &nbsp;<t:mutiLang langKey="sequence.name"/>:<input class="inputxt" style="width: 30px" id="tabOrder" name="tabOrder"
    +				value="${cgFormHeadPage.tabOrder}" datatype="n" ignore="ignore"></div>
    +			</td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="show.checkbox"/>: </label></td>
    +			<td class="value"><select id="isCheckbox" name="isCheckbox">
    +				<option value="N" <c:if test="${cgFormHeadPage.isCheckbox eq 'N'}"> selected="selected"</c:if>><t:mutiLang langKey="common.no"/></option>
    +				<option value="Y" <c:if test="${cgFormHeadPage.isCheckbox eq 'Y'}"> selected="selected"</c:if>><t:mutiLang langKey="common.yes"/></option>
    +			</select></td>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="is.page"/>:</label></td>
    +			<td class="value"><select id="isPagination" name="isPagination">
    +				<option value="Y" <c:if test="${cgFormHeadPage.isPagination eq 'Y'}"> selected='selected'</c:if>><t:mutiLang langKey="common.yes"/></option>
    +				<option value="N" <c:if test="${cgFormHeadPage.isPagination eq 'N'}"> selected="selected"</c:if>><t:mutiLang langKey="common.no"/></option>
    +			</select></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="is.tree"/>: </label></td>
    +			<td class="value"><select id="isTree" name="isTree">
    +				<option value="N" <c:if test="${cgFormHeadPage.isTree eq 'N'}"> selected='selected'</c:if>><t:mutiLang langKey="common.no"/></option>
    +				<option value="Y" <c:if test="${cgFormHeadPage.isTree eq 'Y'}"> selected='selected'</c:if>><t:mutiLang langKey="common.yes"/></option>
    +			</select></td>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.query.module"/>: </label></td>
    +			<td class="value"><select id="querymode" name="querymode">
    +				<option value="single" <c:if test="${cgFormHeadPage.querymode eq 'single'}"> selected="selected"</c:if>><t:mutiLang langKey="single.query"/></option>
    +				<option value="group" <c:if test="${cgFormHeadPage.querymode eq 'group'}"> selected="selected"</c:if>><t:mutiLang langKey="combine.query"/></option>
    +			</select></td>
    +		</tr>
    +		<c:if test="${cgFormHeadPage.jformType eq '2'}">
    +			<tr id="fb_tb">
    +				<td align="right"><label class="Validform_label"><t:mutiLang langKey="slave.table"/></label></td>
    +				<td class="value" colspan="3"><input class="inputxt" style="width: 440px" disabled="disabled" value="${cgFormHeadPage.subTableStr}"></td>
    +			</tr>
    +		</c:if>
    +		<tr class="tree">
    +			<td align="right"><label class="Validform_label"> 鏍戝舰琛ㄥ崟鐖秈d: </label></td>
    +			<td class="value"><input class="inputxt" id="treeParentIdFieldName" name="treeParentIdFieldName" value="${cgFormHeadPage.treeParentIdFieldName}" datatype="s2-100"> <span class="Validform_checktip"></span></td>
    +			<td align="right"><label class="Validform_label"> 鏍戝紑琛ㄥ崟鍒: </label></td>
    +			<td class="value"><input class="inputxt" id="treeFieldname" name="treeFieldname" value="${cgFormHeadPage.treeFieldname}" datatype="s2-100"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr style="display:none;">
    +			<td align="right"><label class="Validform_label"> idField: </label></td>
    +			<td class="value"><input class="inputxt" id="treeIdFieldname" name="treeIdFieldname" value="id" datatype="s2-100"> <span class="Validform_checktip"></span></td>
    +		
    +		</tr>
    +	</table>
    +  <div id="tabs" class="easyui-tabs" tabPosition="top" fit="false" style="margin: 0px; padding: 0px; overflow: hidden; width: auto;">
    +    <div title= '<t:mutiLang langKey="database.property"/>' width="auto" style="width: auto; margin: 0px; padding: 0px; overflow: hidden;">
    +      <div style="height: 25px;" class="datagrid-toolbar"><a id="addColumnBtn" class="easyui-linkbutton" data-options="iconCls:'icon-add'" onclick="addColumnBtnClick();" href="#"><t:mutiLang langKey="common.add.to"/></a> <a
    +		id="delColumnBtn" class="easyui-linkbutton" data-options="iconCls:'icon-remove'" onclick="delColumnBtnClick();" href="#"><t:mutiLang langKey="common.delete"/></a></div>
    +      <table id="tab_div_database_title" class="table-list" style="height: 25px;">
    +      </table>
    +      <div class="t_table" id="t_table_database">
    +        <table id="tab_div_database" class="table-list">
    +        </table>
    +        <br><br><br>
    +      </div>
    +    </div>
    +    <div title='<t:mutiLang langKey="page.property"/>' style="overflow: hidden;">
    +      <table id="tab_div_page_title" class="table-list" style="height: 25px;">
    +      </table>
    +      <div class="t_table" id="t_table_page">
    +        <table id="tab_div_page" class="table-list">
    +        </table>
    +        <br><br><br>
    +      </div>
    +    </div>
    +    <div title='<t:mutiLang langKey="validate.dict"/>' style="overflow: hidden;">
    +      <table id="tab_div_check_title" class="table-list" style="height: 25px;">
    +      </table>
    +      <div class="t_table" id="t_table_check">
    +        <table id="tab_div_check" class="table-list">
    +        </table>
    +        <br><br><br>
    +      </div>
    +    </div>
    +    <div title='<t:mutiLang langKey="common.fk"/>' style="overflow: hidden;">
    +      <table id="tab_div_key_title" class="table-list" style="height: 25px;">
    +      </table>
    +      <div class="t_table" id="t_table_key">
    +        <table id="tab_div_key" class="table-list">
    +        </table>
    +        <br><br><br>
    +      </div>
    +    </div>
    +  </div>
    +</t:formvalid>
    +<script type="text/javascript">
    +$(function() {
    +	//鏄剧ず/闅愯棌鏍戝舰琛ㄥ崟杈撳叆椤
    +	isTreeHandle();
    +	$("#isTree").change(function() {
    +		isTreeHandle();
    +	});
    +}); 
    +//鏍规嵁鏄惁涓烘爲褰㈣彍鍗曢殣钘忔垨鏄剧ずtree杈撳叆妗
    +function isTreeHandle() {
    +	if($("#isTree").val() == "Y") {
    +		//鏍戝舰琛ㄥ崟璁剧疆榛樿鍊
    +		if(!$("#treeFieldname").val()) {
    +			$("#treeFieldname").val($(":text[name='columns[1].fieldName']").val());
    +		}
    +		$("tr.tree").find(":input").attr("disabled", false).attr("datatype", "s2-100").end().show();
    +	}else {
    +		$("tr.tree").find(":input").attr("disabled", true).removeAttr("datatype").end().hide();
    +	}
    +}
    +</script>
    +<iframe id="iframe_check" name="iframe_check" src="plug-in/cgform/fields/cgformOfCheck.html" style="display: none"></iframe>
    +<iframe id="iframe_database" src="plug-in/cgform/fields/cgformOfDatabase.html" style="display: none"></iframe>
    +<iframe id="iframe_key" src="plug-in/cgform/fields/cgformOfForeignKey.html" style="display: none"></iframe>
    +<iframe id="iframe_page" src="plug-in/cgform/fields/cgformOfPage.html" style="display: none"></iframe>
    +</body>
    diff --git a/src/main/webapp/webpage/jeecg/cgform/config/cgFormHeadList.jsp b/src/main/webapp/webpage/jeecg/cgform/config/cgFormHeadList.jsp
    new file mode 100644
    index 00000000..e2d5199f
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/config/cgFormHeadList.jsp
    @@ -0,0 +1,350 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,autocomplete"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +<t:datagrid sortName="createDate" sortOrder="desc" name="tablePropertyList" title="smart.form.config" 
    +            fitColumns="false" actionUrl="cgFormHeadController.do?datagrid" idField="id" fit="true" 
    +            queryMode="group" checkbox="true" >
    +	<t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="table.type" field="jformType" replace="single.table_1,master.table_2,slave.table_3" query="true"></t:dgCol>
    +	<t:dgCol title="table.name" field="tableName" query="true" autocomplete="true" />
    +	<t:dgCol title="table.description" field="content"></t:dgCol>
    +	<t:dgCol title="common.version" field="jformVersion"></t:dgCol>
    +	<t:dgCol title="is.tree" field="isTree" replace="common.yes_Y,common.no_N"></t:dgCol>
    +	<t:dgCol title="is.page" field="isPagination" replace="common.yes_Y,common.no_N"></t:dgCol>
    +	<t:dgCol title="sync.db" field="isDbSynch" replace="has.sync_Y,have.nosync_N" style="background:red;_N" query="true"></t:dgCol>
    +	<t:dgCol title="show.checkbox" field="isCheckbox" replace="common.yes_Y,common.no_N"></t:dgCol>
    +	<t:dgCol title="common.query.module" field="querymode"></t:dgCol>
    +	<t:dgCol title="common.createby" field="createBy" hidden="false"></t:dgCol>
    +	<t:dgCol title="common.createtime" field="createDate" formatter="yyyy/MM/dd" hidden="false"></t:dgCol>
    +	<t:dgCol title="common.updateby" field="updateBy" hidden="false"></t:dgCol>
    +	<t:dgCol title="common.updatetime" field="updateDate" formatter="yyyy/MM/dd" hidden="false"></t:dgCol>
    +	<t:dgCol title="common.operation" field="opt"></t:dgCol>
    +	<t:dgFunOpt funname="delCgForm(id,tableName)" title="common.delete"></t:dgFunOpt>
    +	<t:dgFunOpt funname="remCgForm(id)" title="common.remove"></t:dgFunOpt>
    +	<t:dgFunOpt exp="isDbSynch#eq#N" title="sync.db" funname="doDbsynch(id,content)" />
    +	<t:dgFunOpt exp="isDbSynch#eq#Y&&jformType#ne#3" funname="addbytab(id,content)" title="form.template"></t:dgFunOpt>
    +	<t:dgFunOpt exp="isDbSynch#eq#Y&&jformType#ne#3" funname="addlisttab(tableName,content)" title="function.test"></t:dgFunOpt>
    +	<t:dgFunOpt exp="isDbSynch#eq#Y&&jformType#ne#3" funname="popMenuLink(tableName,content)" title="config.place"></t:dgFunOpt>
    +	<t:dgToolBar title="create.form" icon="icon-add" width="900" height="600" url="cgFormHeadController.do?addorupdate" funname="addForm"></t:dgToolBar>
    +	<t:dgToolBar title="edit.form" icon="icon-edit" width="900" height="600" url="cgFormHeadController.do?addorupdate" funname="updateForm"></t:dgToolBar>
    +	<t:dgToolBar title="custom.button" icon="icon-edit" url="cgformButtonController.do?cgformButton" funname="cgFormButton"></t:dgToolBar>
    +	<t:dgToolBar title="js.enhance" icon="icon-edit" url="cgformEnhanceJsController.do?addorupdate" funname="enhanceJs"></t:dgToolBar>
    +	<t:dgToolBar title="sql.enhance" icon="icon-edit" url="cgformButtonSqlController.do?addorupdate" funname="cgFormButtonSql"></t:dgToolBar>
    +	<t:dgToolBar title="form.export" icon="icon-putout" url="cgformSqlController.do?doMigrateOut" funname="doMigrateOut"></t:dgToolBar>
    +	<t:dgToolBar title="form.import" icon="icon-put" url="cgformSqlController.do?inSqlFile" funname="toCgformMigrate"></t:dgToolBar>
    +	<t:dgToolBar title="code.generate" icon="icon-add" url="generateController.do?gogenerate" funname="generate"></t:dgToolBar>
    +	<t:dgToolBar title="form.generate" icon="icon-add" url="cgformTransController.do?trans" funname="addToData"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +
    +<script type="text/javascript">
    +	function addbytab(id,content) {
    +		addOneTab('<t:mutiLang langKey="form.template"/>' , "cgformFtlController.do?cgformFtl2&formid="+id);
    +	}
    +
    +	//鏁版嵁搴撹〃鐢熸垚琛ㄥ崟
    +	function addToData(title,url,id,a,b){
    +  		$.dialog({
    +			content: "url:"+url,
    +			lock : true,
    +			title: title,
    +			opacity : 0.3,
    +			width:400,
    +			height:500,
    +			cache:false,
    +		    cancelVal: '<t:mutiLang langKey="common.close"/>',
    +		    cancel: true,
    +            drag:false,max:false,min:false
    +		});
    +	}
    +	function delCgForm(id,name){
    +		$.dialog.confirm('<t:mutiLang langKey="confirm.delete.record"/>', function(){
    +			checkIsExit(id,name);
    +		}, function(){
    +		}).zindex();
    +	}
    +	//妫鏌ヨ繖涓〃鏄惁宸茬粡瀛樺湪浜
    +	function checkIsExit(id,name){
    +		$.post("cgFormHeadController.do?checkIsExit&&name="+name,function(data){
    +			var d = $.parseJSON(data);
    +			if (d.success) {
    +				$.dialog.confirm('<t:mutiLang langKey="table.exit.in.db.confirm"/>', function(){
    +					delThis(id);
    +				}, function(){
    +				}).zindex();
    +			}else{
    +				delThis(id);
    +			}
    +		});
    +	}
    +	//鍒犻櫎杩欎釜閰嶇疆
    +	function delThis(id){
    +		doSubmit("cgFormHeadController.do?del&id="+id,"tablePropertyList");
    +	}
    +
    +	function remCgForm(id){
    +		$.dialog.confirm('<t:mutiLang langKey="confirm.delete.record"/>', function(){
    +			removeThis(id);
    +		}, function(){
    +		}).zindex();
    +	}
    +	
    +	function removeThis(id){
    +		doSubmit("cgFormHeadController.do?rem&id="+id,"tablePropertyList");
    +	}
    +
    +	function addlisttab(tableName,content){
    +		addOneTab( '<t:mutiLang langKey="form.datalist"/>' + "["+content+"]", "cgAutoListController.do?list&id="+tableName);
    +	}
    +	
    +	function addForm(title,url,id){
    +		gridname=id;
    +		createwindow(title,url,900,520);
    +	}
    +	function updateForm(title,url,id){
    +		gridname=id;
    +		var rowsData = $('#'+id).datagrid('getSelections');
    +		if (!rowsData || rowsData.length==0) {
    +			tip('<t:mutiLang langKey="common.please.select.edit.item"/>');
    +			return;
    +		}
    +		if (rowsData.length>1) {
    +			tip('<t:mutiLang langKey="common.please.select.one.record.to.edit"/>');
    +			return;
    +		}
    +		createwindow(title,url + '&id='+rowsData[0].id,900,520);
    +
    +	}
    +	function jsPlugin(title,url,id){
    +		var rowsData = $('#'+id).datagrid('getSelections');
    +		if (!rowsData || rowsData.length==0) {
    +			tip('<t:mutiLang langKey="common.please.select.edit.item"/>');
    +			return;
    +		}
    +		if (rowsData.length>1) {
    +			tip('<t:mutiLang langKey="common.please.select.one.record.to.edit"/>');
    +			return;
    +		}
    +		url += '&id='+rowsData[0].id;
    +  		$.dialog({
    +			content: "url:"+url,
    +			lock : true,
    +			title:'<t:mutiLang langKey="js.enhance"/>' + "["+rowData.content+"]",
    +			opacity : 0.3,
    +			width:900,
    +			height:500,
    +			cache:false,
    +		    ok: function(){
    +		    	iframe = this.iframe.contentWindow;
    +		    	iframe.goForm();
    +				return false;
    +		    },
    +		    cancelVal: '<t:mutiLang langKey="common.close"/>',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		});
    +	}
    +	
    +	/**
    +	*	寮瑰嚭鑿滃崟閾炬帴
    +	*/
    +	function popMenuLink(tableName,content){
    +        $.dialog({
    +			content: "url:cgFormHeadController.do?popmenulink&url=cgAutoListController.do?list&title="+tableName,
    +			drag :false,
    +			lock : true,
    +			title:'<t:mutiLang langKey="common.menu.link"/>' + '['+content+']',
    +			opacity : 0.3,
    +			width:400,
    +			height:80,drag:false,min:false,max:false
    +		}).zindex();
    +	}
    +
    +	//鑷畾涔夋寜閽
    +	function cgFormButton(title,url,id){
    +		var rowsData = $('#'+id).datagrid('getSelections');
    +		if (!rowsData || rowsData.length==0) {
    +			tip('<t:mutiLang langKey="common.please.select.edit.item"/>');
    +			return;
    +		}
    +		if (rowsData.length>1) {
    +			tip('<t:mutiLang langKey="common.please.select.one.record.to.edit"/>');
    +			return;
    +		}
    +		url += '&formId='+rowsData[0].id+"&tableName="+rowsData[0].tableName;
    +		addOneTab('<t:mutiLang langKey="custom.button"/>', url);
    +	}
    +
    +	//sql澧炲己
    +	function cgFormButtonSql(title,url,id){
    +		var rowsData = $('#'+id).datagrid('getSelections');
    +		if (!rowsData || rowsData.length==0) {
    +			tip('<t:mutiLang langKey="common.please.select.edit.item"/>');
    +			return;
    +		}
    +		if (rowsData.length>1) {
    +			tip('<t:mutiLang langKey="common.please.select.one.record.to.edit"/>');
    +			return;
    +		}
    +		url += '&formId='+rowsData[0].id+"&tableName="+rowsData[0].tableName;
    +		//addOneTab("鎸夐挳sql澧炲己", url);
    +		$.dialog({
    +			content: "url:"+url,
    +			lock : true,
    +			title: '<t:mutiLang langKey="sql.enhance"/>' + "["+rowsData[0].content+"]",
    +			opacity : 0.3,
    +			width:900,
    +			height:500,
    +			cache:false,
    +		    ok: function(){
    +				iframe = this.iframe.contentWindow;
    +				saveObj();
    +				return false;
    +		    },
    +		    cancelVal: '<t:mutiLang langKey="common.close"/>',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		});
    +	}
    +
    +	
    +	//js澧炲己
    +	function enhanceJs(title,url,id){
    +		var rowsData = $('#'+id).datagrid('getSelections');
    +		if (!rowsData || rowsData.length==0) {
    +			tip('<t:mutiLang langKey="common.please.select.edit.item"/>');
    +			return;
    +		}
    +		if (rowsData.length>1) {
    +			tip('<t:mutiLang langKey="common.please.select.one.record.to.edit"/>');
    +			return;
    +		}
    +		url += '&formId='+rowsData[0].id+"&tableName="+rowsData[0].tableName;
    +		$.dialog({
    +			content: "url:"+url,
    +			lock : true,
    +			title: '<t:mutiLang langKey="js.enhance"/>' + "["+rowsData[0].content+"]",
    +			opacity : 0.3,
    +			width:900,
    +			height:500,
    +			cache:false,
    +		    ok: function(){
    +				iframe = this.iframe.contentWindow;
    +				saveObj();
    +				return false;
    +		    },
    +		    cancelVal: '<t:mutiLang langKey="common.close"/>',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		});
    +	}
    +
    +	//琛ㄥ崟 sql瀵煎嚭
    +	function doMigrateOut(title,url,id){
    +		var rowData = $('#'+id).datagrid('getSelected');
    +		if (!rowData) {
    +			tip('<t:mutiLang langKey="common.please.select.edit.item"/>');
    +			return;
    +		}
    +		url += '&ids='+ getListSelections();
    +		window.location.href= url;
    +	}
    +
    +	//琛ㄥ崟  sql瀵煎叆
    +	function toCgformMigrate(){
    +		openuploadwin('<t:mutiLang langKey="form.sqlimport"/>', 'cgformSqlController.do?toCgformMigrate', "tablePropertyList");
    +	}
    +    <%--   update-end--Author:duanqilu  Date:20130910 for#211 鍗囩骇SQL瀵煎叆瀵煎嚭--%>	
    +	//浠g爜鐢熸垚
    +	function generate(title,url,id){
    +		var rowsData = $('#'+id).datagrid('getSelections');
    +		if (!rowsData || rowsData.length==0) {
    +			tip('<t:mutiLang langKey="common.please.select.edit.item"/>');
    +			return;
    +		}
    +		if (rowsData.length>1) {
    +			tip('<t:mutiLang langKey="common.please.select.one.record.to.edit"/>');
    +			return;
    +		}
    +		//闄勮〃涓嶈兘鐢熸垚浠g爜
    +		if("3" == rowsData[0].jformType){
    +			tip('<t:mutiLang langKey="slave.table.can.not.generate.code"/>');
    +			return;
    +		}
    +
    +		//鏈縺娲荤殑琛紝涓嶅厑璁哥敓鎴愪唬鐮
    +		if("N" == rowsData[0].isDbSynch){
    +			tip('<t:mutiLang langKey="please.syncdb"/>');
    +			return;
    +		}
    +				
    +		
    +		url += '&id='+rowsData[0].id;
    +		$.dialog({
    +			content: "url:"+url,
    +			lock : true,
    +			title: '<t:mutiLang langKey="code.generate"/>' + " ["+rowsData[0].content+"]",
    +			opacity : 0.3,
    +			width:1100,
    +			height:500,
    +			cache:false,
    +		    ok: function(){
    +				iframe = this.iframe.contentWindow;
    +				saveObj();
    +				return false;
    +		    },
    +		    cancelVal: '<t:mutiLang langKey="common.close"/>',
    +		    cancel: true /*涓簍rue绛変环浜巉unction(){}*/
    +		});
    +	}
    +
    +	/**
    +	 * 鑾峰彇鍒楄〃涓変腑琛岀殑鏁版嵁锛堝琛岋級
    +	 * @param field 鏁版嵁涓瓧娈靛悕-涓嶄紶姝ゅ弬鏁板垯鑾峰彇鍏ㄩ儴鏁版嵁
    +	 * @return 閫変腑琛岀殑缁欏畾瀛楁鍊硷紝浠ラ楀彿鍒嗛殧
    +	 */
    +	function getListSelections(){
    +		var ids = '';
    +		var rows = $("#tablePropertyList").datagrid("getSelections");
    +		for(var i=0;i<rows.length;i++){
    +			ids+=rows[i].id;
    +			ids+=',';
    +		}
    +		ids = ids.substring(0,ids.length-1);
    +		return ids;
    +	}	
    +	
    +	/**
    +	 * 浠ュ绉嶆柟寮忓悓姝ユ暟鎹簱
    +	 * @param id 琛ㄥ崟id
    +	 */
    +	function doDbsynch(id,content){
    +		var url = "url:cgFormHeadController.do?goCgFormSynChoice";
    +		$.dialog({
    +			content: url,
    +			drag :false,
    +			lock : true,
    +			title: '<t:mutiLang langKey="sync.db"/>' + '['+content+']',
    +			opacity : 0.3,
    +			width:400,
    +			height:100,
    +			cache:false,
    +		    cancelVal: '<t:mutiLang langKey="common.close"/>',
    +		    cancel: function(){},
    +		    button : [{
    +		    	id : "okBtn",
    +		    	name : '<t:mutiLang langKey="common.confirm"/>',
    +		    	callback : function () {
    +		    		iframe = this.iframe.contentWindow;
    +		    		var synchoice = iframe.getSynChoice();
    +		    		if(synchoice){
    +						var submitUrl = 'cgFormHeadController.do?doDbSynch&id='+id+'&synMethod='+synchoice;
    +						doSubmit(submitUrl,'tablePropertyList');
    +				    }else{
    +						alert('<t:mutiLang langKey="please.select.sync.method"/>');
    +						return false;
    +					}
    +		    	}
    +		    }]
    +		}).zindex();
    +	}
    +</script>
    diff --git a/src/main/webapp/webpage/jeecg/cgform/config/cgForms.jsp b/src/main/webapp/webpage/jeecg/cgform/config/cgForms.jsp
    new file mode 100644
    index 00000000..3ca274b7
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/config/cgForms.jsp
    @@ -0,0 +1,20 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8"
    +	pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,autocomplete"></t:base>
    +<div class="easyui-layout" fit="true">
    +	<div region="center" style="padding: 1px;">
    +		<t:datagrid sortName="createDate" sortOrder="desc"
    +			name="tableSelectPropertyList" title="smart.form.config"
    +			fitColumns="false" actionUrl="cgFormHeadController.do?datagrid"
    +			idField="id" fit="true">
    +			<t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +			<t:dgCol title="table.type" field="jformType"
    +				replace="single.table_1,master.table_2,slave.table_3" query="true"></t:dgCol>
    +			<t:dgCol title="table.name" field="tableName" query="true"
    +				autocomplete="true" />
    +			<t:dgCol title="table.description" field="content"></t:dgCol>
    +		</t:datagrid>
    +	</div>
    +</div>
    +
    diff --git a/src/main/webapp/webpage/jeecg/cgform/config/cgformMigrateSqlInclude.jsp b/src/main/webapp/webpage/jeecg/cgform/config/cgformMigrateSqlInclude.jsp
    new file mode 100644
    index 00000000..49224f91
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/config/cgformMigrateSqlInclude.jsp
    @@ -0,0 +1,17 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>SQL瀵煎叆</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" beforeSubmit="upload">
    +	<fieldset class="step">
    +	<div class="form"><t:upload name="fiels" buttonText="閫夋嫨瑕佸鍏ョ殑鏂囦欢" uploader="cgformSqlController.do?doMigrateIn" extend="*.zip" id="file_upload" formData="documentTitle"></t:upload></div>
    +	<div class="form" id="filediv" style="height: 50px"></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/cgform/config/cgformSynChoice.jsp b/src/main/webapp/webpage/jeecg/cgform/config/cgformSynChoice.jsp
    new file mode 100644
    index 00000000..3b5c84e4
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/config/cgformSynChoice.jsp
    @@ -0,0 +1,19 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<SCRIPT type=text/javascript src="plug-in/clipboard/ZeroClipboard.js"></SCRIPT>
    +<t:base type="jquery,easyui,jqueryui-sortable,tools"></t:base>
    +<div>
    +<div><input type='radio' name='synMethod' value='normal' checked><t:mutiLang langKey="normal.sync"/></div>
    +<div><input type='radio' name='synMethod' value='force'><t:mutiLang langKey="force.sync"/></div>
    +</div>
    +<SCRIPT type="text/javascript">
    + function getSynChoice(){
    +	var synchoice;
    +	$("[name='synMethod']").each(function(){
    +		if($(this).attr("checked")){
    +			synchoice = $(this).val();
    +		}
    +	});
    +	return synchoice;
    + }
    + </SCRIPT>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/config/popmenulink.jsp b/src/main/webapp/webpage/jeecg/cgform/config/popmenulink.jsp
    new file mode 100644
    index 00000000..b9d9c14a
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/config/popmenulink.jsp
    @@ -0,0 +1,37 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +    <link rel="stylesheet" type="text/css" href="plug-in/lhgDialog/skins/default.css">
    +    <script type="text/javascript" src="plug-in/jquery/jquery-1.8.3.js"></script>
    +    <script type=text/javascript src="plug-in/clipboard/ZeroClipboard.js"></script>
    +    <script type="text/javascript" src="plug-in/lhgDialog/lhgdialog.min.js"></script>
    +    <script>
    +        $(function(){
    +            var clip = new ZeroClipboard.Client();
    +            clip.setHandCursor( true );
    +            clip.addEventListener('complete', function(client, text){
    +                alert("澶嶅埗鎴愬姛");
    +                frameElement.api.close();
    +            });
    +            var url = "${url}&id=${title}";
    +            clip.setText(url);
    +            $("#menuLink").val(url);
    +            clip.glue('copyBtn');
    +            $("#closeBtn").click(function(){
    +                frameElement.api.close();
    +            });
    +        });
    +    </script>
    +</head>
    +<body>
    +    <div>
    +        <input id='menuLink'  type='text' style="width:380px;" disabled="disabled"/>
    +    </div>
    +    <div class="ui_buttons" style="padding-left: 240px;">
    +        <input type="button" id="copyBtn" value="澶嶅埗" class="ui_state_highlight">
    +        <input type="button" id="closeBtn" value="鍏抽棴" onclick='close();'>
    +    </div>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/enhance/cgformenhanceJs.jsp b/src/main/webapp/webpage/jeecg/cgform/enhance/cgformenhanceJs.jsp
    new file mode 100644
    index 00000000..bfda0cba
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/enhance/cgformenhanceJs.jsp
    @@ -0,0 +1,58 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title><t:mutiLang langKey="enhance.js"/></title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="cgformEnhanceJsController.do?save">
    +	<input id="id" name="id" type="hidden" value="${cgformenhanceJsPage.id }">
    +	<input id="formId" name="formId" type="hidden" value="${cgformenhanceJsPage.formId }">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="enhance.type"/>: </label></td>
    +			<td class="value"><select name="cgJsType" id="cgJsType">
    +				<option value="form" <c:if test="${cgformenhanceJsPage.cgJsType=='form'}">selected="selected"</c:if>>form</option>
    +				<option value="list" <c:if test="${cgformenhanceJsPage.cgJsType=='list'}">selected="selected"</c:if>>list</option>
    +			</select> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="enhance.js"/>: </label></td>
    +			<td class="value"><textarea id="cgJsStr" name="cgJsStr" cols="150" rows="30">${cgformenhanceJsPage.cgJsStr}</textarea> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    +<script type="text/javascript">
    + $('#cgJsType').change(function() {
    +	 var cgJsType =$('#cgJsType').val();
    +	 var formId =$('#formId').val();
    +	 $.ajax({
    +			async : false,
    +			cache : false,
    +			type : 'POST',
    +			contentType : 'application/json', 
    +			dataType:"json",
    +			url : "cgformEnhanceJsController.do?doCgformEnhanceJs&cgJsType="+cgJsType+"&formId="+formId,// 璇锋眰鐨刟ction璺緞
    +			error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +				alert('<t:mutiLang langKey="get.error"/>');
    +				frameElement.api.close();
    +			},
    +			success : function(data) {
    +				var d = data;
    +				if (d.success) {
    +					var cgformenhanceJsPage = d.obj;
    +					$('#id').val(cgformenhanceJsPage.id);
    +					$('#cgJsStr').val(cgformenhanceJsPage.cgJsStr);
    +				}else{
    +					$('#id').val("");
    +					$('#cgJsStr').val("");
    +				}
    +			}
    +		});
    +	 
    + });
    +</script>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/excel/upload.jsp b/src/main/webapp/webpage/jeecg/cgform/excel/upload.jsp
    new file mode 100644
    index 00000000..f034bf2c
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/excel/upload.jsp
    @@ -0,0 +1,17 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>瀵煎叆鏁版嵁</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" beforeSubmit="upload">
    +	<fieldset class="step">
    +	<div class="form"><t:upload name="fiels" buttonText="閫夋嫨瑕佸鍏ョ殑鏂囦欢" uploader="excelTempletController.do?importExcel&tableName=${tableName}" extend="*.xls" id="file_upload" formData="documentTitle"></t:upload></div>
    +	<div class="form" id="filediv" style="height: 50px"></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/cgform/generate/fileTree.jsp b/src/main/webapp/webpage/jeecg/cgform/generate/fileTree.jsp
    new file mode 100644
    index 00000000..7a72596b
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/generate/fileTree.jsp
    @@ -0,0 +1,36 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@page import="org.jeecgframework.web.cgform.common.CgAutoListConstant"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鏂囦欢鐩綍鏍</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript" src="plug-in/cgform/js/cgformField.js"></script>
    +<script type="text/javascript">
    +var selectedDir = '';
    +$(function(){
    +     $('#fileTree').tree({   
    +         checkbox: false,   
    +         url: 'generateController.do?doExpandFileTree',   
    +        onBeforeExpand:function(node,param){
    +        	var newurl = "generateController.do?doExpandFileTree&parentNode=" + node.id;
    +        	newurl =  encodeURI(newurl);
    +        	 $('#fileTree').tree('options').url = newurl;
    +         },               
    +        onClick:function(node){   
    +             selectedDir = node.id;     
    +        }   
    +     });   
    + }); 
    +function fillPath(id){
    +	W.selectCallback(id,selectedDir);
    +}
    +</script>
    +<style type="text/css">
    +</style>
    +</head>
    +<div id="fileTreeDiv">
    +<ul id="fileTree">
    +</ul>
    +</div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/generate/one2many.jsp b/src/main/webapp/webpage/jeecg/cgform/generate/one2many.jsp
    new file mode 100644
    index 00000000..35d48514
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/generate/one2many.jsp
    @@ -0,0 +1,126 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@page import="org.jeecgframework.web.cgform.common.CgAutoListConstant"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鏅鸿兘琛ㄥ崟-浠g爜鐢熸垚</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript" src="plug-in/cgform/js/cgformField.js"></script>
    +<script type="text/javascript" src="plug-in/cgform/js/fileTree.js"></script>
    +<script type="text/javascript">
    +function browseFolder(path) {
    +    try {
    +        var Message = "\u8bf7\u9009\u62e9\u6587\u4ef6\u5939"; //閫夋嫨妗嗘彁绀轰俊鎭
    +        var Shell = new ActiveXObject("Shell.Application");
    +        var Folder = Shell.BrowseForFolder(0, Message, 64, 17); //璧峰鐩綍涓猴細鎴戠殑鐢佃剳
    +        if (Folder != null) {
    +            Folder = Folder.items(); // 杩斿洖 FolderItems 瀵硅薄
    +            Folder = Folder.item(); // 杩斿洖 Folderitem 瀵硅薄
    +            Folder = Folder.Path; // 杩斿洖璺緞
    +            if (Folder.charAt(Folder.length - 1) != "\\") {
    +                Folder = Folder + "\\";
    +            }
    +            document.getElementById(path).value = Folder;
    +            return Folder;
    +        }
    +    }
    +    catch (e) {
    +        alert(e.message);
    +    }
    +   }
    +</script>
    +<style type="text/css">
    +.table-list {
    +	margin: 0;
    +	width: auto;
    +	margin-left: 0px;
    +	margin-right: 0px;
    +	overflow: hidden;
    +}
    +
    +.table-list td,.table-list th {
    +	text-align: center;
    +}
    +
    +.t_table {
    +	overflow: auto; /*璁╁唴瀹硅〃鏍煎闈㈢殑div鑷姩鏈夋粴鍔ㄦ潯*/
    +	margin-left: 0px;
    +	margin-right: 0px;
    +	width: auto;
    +	max-height: 240px;
    +}
    +</style>
    +</head>
    +<body>
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" tiptype="1" action="generateController.do?dogenerateOne2Many">
    +	<input id="id" name="id" type="hidden" value="${cgFormHeadPage.id}">
    +	<input id="tableName" name="tableName" type="hidden" value="${cgFormHeadPage.tableName}">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label">浠g爜鐢熸垚鐩綍: </label></td>
    +			<td class="value"><input type="text" class="inputxt" name="projectPath" value="${projectPath }" id="projectPath" datatype="*" /> <a href="#" id="openFoldSelect" class="easyui-linkbutton"
    +				icon="icon-search" onclick="openFolder('projectPath')">娴忚</a></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label">浠g爜鍒嗗眰鏍峰紡: </label></td>
    +			<td class="value"><select name="packageStyle">
    +				<option value="service">涓氬姟鍒嗗眰</option>
    +				<option value="project">浠g爜鍒嗗眰</option>
    +			</select></td>
    +		</tr>
    +		<tr>
    +			<td align="right" width="20%"><label class="Validform_label">鏁版嵁妯″瀷: </label></td>
    +			<td class="value"><select id="jformType" disabled="disabled" name="jformType">
    +				<option value="1" <c:if test="${cgFormHeadPage.jformType eq '1' || cgFormHeadPage.jformType eq '3'}"> selected='selected'</c:if>>鍗曡〃</option>
    +				<option value="2" <c:if test="${cgFormHeadPage.jformType eq '2'}"> selected="selected"</c:if>>涓瀵瑰/涓瀵逛竴</option>
    +			</select></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 涓昏〃鍚: </label></td>
    +			<td class="value" colspan="3"><input disabled="disabled" class="inputxt" id="tableName_tmp" name="tableName_tmp" value="${cgFormHeadPage.tableName}" datatype="*"> <span
    +				class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 涓昏〃瀹炰綋鍚(棣栧瓧姣嶅ぇ鍐): </label></td>
    +			<td class="value"><input class="inputxt" id="entityName" name="entityName" datatype="*" value="${entityNames[cgFormHeadPage.tableName]}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鍔熻兘璇存槑: </label></td>
    +			<td class="value" colspan="3"><input class="inputxt" id="ftlDescription" name="ftlDescription" value="${cgFormHeadPage.content}" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label">涓诲寘鍚(灏忓啓): </label></td>
    +			<td class="value"><input class="inputxt" id="entityPackage" name="entityPackage" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +	<table>
    +		<tr>
    +			<td><label class="Validform_label">瀛愯〃淇℃伅</label></td>
    +		</tr>
    +	</table>
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<c:forEach items="${subTableList}" var="column" varStatus="columIndex">
    +			<tr>
    +				<td align="right">瀛愯〃鍚:</td>
    +				<td class="value" colspan="3"><input readonly="readonly" class="inputxt" id="subTabParamIn[${columIndex.index}].tableName" name="subTabParamIn[${columIndex.index}].tableName"
    +					value="${column.tableName}" datatype="*"> <span class="Validform_checktip"></span></td>
    +
    +				<td align="right">瀛愯〃瀹炰綋(棣栧瓧姣嶅ぇ鍐):</td>
    +				<td class="value" colspan="3"><input class="inputxt" id="subTabParamIn[${columIndex.index}].entityName" name="subTabParamIn[${columIndex.index}].entityName"
    +					value="${entityNames[column.tableName]}" datatype="*"> <span class="Validform_checktip"></span></td>
    +
    +				<td align="right">鍔熻兘璇存槑:</td>
    +				<td class="value" colspan="3"><input class="inputxt" id="subTabParamIn[${columIndex.index}].ftlDescription" name="subTabParamIn[${columIndex.index}].ftlDescription" datatype="*"> <span
    +					class="Validform_checktip"></span></td>
    +
    +				<td align="right">瀛愬寘鍚((灏忓啓)):</td>
    +				<td class="value" colspan="3"><input class="inputxt" id="subTabParamIn[${columIndex.index}].entityPackage" name="subTabParamIn[${columIndex.index}].entityPackage" datatype="*"> <span
    +					class="Validform_checktip"></span></td>
    +
    +			</tr>
    +		</c:forEach>
    +	</table>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/generate/single.jsp b/src/main/webapp/webpage/jeecg/cgform/generate/single.jsp
    new file mode 100644
    index 00000000..67ff415b
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/generate/single.jsp
    @@ -0,0 +1,116 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@page import="org.jeecgframework.web.cgform.common.CgAutoListConstant"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鏅鸿兘琛ㄥ崟-浠g爜鐢熸垚</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript" src="plug-in/cgform/js/cgformField.js"></script>
    +<script type="text/javascript" src="plug-in/cgform/js/fileTree.js"></script>
    +<script type="text/javascript">
    +function browseFolder(path) {
    +    try {
    +        var Message = "\u8bf7\u9009\u62e9\u6587\u4ef6\u5939"; //閫夋嫨妗嗘彁绀轰俊鎭
    +        var Shell = new ActiveXObject("Shell.Application");
    +        var Folder = Shell.BrowseForFolder(0, Message, 64, 17); //璧峰鐩綍涓猴細鎴戠殑鐢佃剳
    +        if (Folder != null) {
    +            Folder = Folder.items(); // 杩斿洖 FolderItems 瀵硅薄
    +            Folder = Folder.item(); // 杩斿洖 Folderitem 瀵硅薄
    +            Folder = Folder.Path; // 杩斿洖璺緞
    +            if (Folder.charAt(Folder.length - 1) != "\\") {
    +                Folder = Folder + "\\";
    +            }
    +            document.getElementById(path).value = Folder;
    +            return Folder;
    +        }
    +    }
    +    catch (e) {
    +        alert(e.message);
    +    }
    +   }
    +   
    +</script>
    +<style type="text/css">
    +.table-list {
    +	margin: 0;
    +	width: auto;
    +	margin-left: 0px;
    +	margin-right: 0px;
    +	overflow: hidden;
    +}
    +
    +.table-list td,.table-list th {
    +	text-align: center;
    +}
    +
    +.t_table {
    +	overflow: auto; /*璁╁唴瀹硅〃鏍煎闈㈢殑div鑷姩鏈夋粴鍔ㄦ潯*/
    +	margin-left: 0px;
    +	margin-right: 0px;
    +	width: auto;
    +	max-height: 240px;
    +}
    +</style>
    +</head>
    +<body style="overflow-y: hidden; overflow-x: hidden;" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" tiptype="1" action="generateController.do?dogenerate">
    +	<input id="id" name="id" type="hidden" value="${cgFormHeadPage.id}">
    +	<input id="tableName" name="tableName" type="hidden" value="${cgFormHeadPage.tableName}">
    +	<input type="hidden" id="fieldRowNum" name="fieldRowNum" value="1">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label">浠g爜鐢熸垚鐩綍: </label></td>
    +			<td class="value"><input type="text" class="inputxt" value="${projectPath }" name="projectPath" id="projectPath" datatype="*" /> <a href="#" id="openFoldSelect" class="easyui-linkbutton"
    +				icon="icon-search" onclick="openFolder('projectPath')">娴忚</a></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label">浠g爜鍒嗗眰椋庢牸: </label></td>
    +			<td class="value"><select name="packageStyle">
    +				<option value="service">涓氬姟鍒嗗眰</option>
    +				<option value="project">浠g爜鍒嗗眰</option>
    +			</select>
    +			</td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鏁版嵁妯″瀷: </label></td>
    +			<td class="value"><select id="jformType" disabled="disabled" name="jformType">
    +				<option value="1" <c:if test="${cgFormHeadPage.jformType eq '1' || cgFormHeadPage.jformType eq '3'}"> selected='selected'</c:if>>鍗曡〃</option>
    +				<option value="2" <c:if test="${cgFormHeadPage.jformType eq '2'}"> selected="selected"</c:if>>涓瀵瑰</option>
    +			</select></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 琛ㄥ悕: </label></td>
    +			<td class="value" colspan="3"><input disabled="disabled" class="inputxt" id="tableName_tmp" name="tableName_tmp" value="${cgFormHeadPage.tableName}" datatype="*"> <span
    +				class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鍔熻兘璇存槑: </label></td>
    +			<td class="value" colspan="3"><input class="inputxt" id="ftlDescription" name="ftlDescription" value="${cgFormHeadPage.content}" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鍖呭悕(灏忓啓): </label></td>
    +			<td class="value" colspan="3"><input class="inputxt" id="entityPackage" name="entityPackage" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 瀹炰綋绫诲悕(棣栧瓧姣嶅ぇ鍐): </label></td>
    +			<td class="value" colspan="3"><input class="inputxt" id="entityName" name="entityName" value="${entityNames[cgFormHeadPage.tableName]}" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 闇瑕佺敓鎴愮殑浠g爜: </label></td>
    +			<td class="value" colspan="3"><input type="checkbox" value="1" name="actionFlag" id="actionFlag" checked="checked">Action</input> <input type="checkbox" value="1" name="jspFlag" id="jspFlag"
    +				checked="checked">Jsp</input> <input type="checkbox" value="1" name="serviceIFlag" id="serviceIFlag" checked="checked">ServiceI</input> <input type="checkbox" value="1" name="serviceImplFlag"
    +				id="serviceImplFlag" checked="checked">ServiceImpl</input> <input type="checkbox" value="1" name="pageFlag" id="pageFlag" checked="checked">Page</input> <input type="checkbox" value="1"
    +				name="entityFlag" id="entityFlag" checked="checked">Entity</input> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 椤甸潰椋庢牸: </label></td>
    +			<td class="value" colspan="3"><select id="jspMode" name="jspMode">
    +				<option value="01" selected="selected">Table椋庢牸(form)</option>
    +				<option value="02">Div椋庢牸(form)</option>
    +				<option value="04">鑷畾涔墂ord(form)</option>
    +			</select> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgform/trans/transList.jsp b/src/main/webapp/webpage/jeecg/cgform/trans/transList.jsp
    new file mode 100644
    index 00000000..4d5ea9e5
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgform/trans/transList.jsp
    @@ -0,0 +1,41 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="transList" title="smart.form.setting" fitColumns="false" pagination="false" checkbox="true" fit="true" queryMode="group"
    +	actionUrl="cgformTransController.do?datagrid" idField="id" sortName="id">
    +	<t:dgCol title="table.name" field="id" query="true" width="300"></t:dgCol>
    +	<t:dgToolBar title="generate.form" icon="icon-edit" url="cgformTransController.do?transEditor" funname="dataEditor"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +<script type="text/javascript">
    +	function dataEditor(title, url, id, a, b) {
    +		var ids = [];
    +		var rows = $("#" + id).datagrid('getSelections');
    +		if (rows.length > 0) {
    +			for ( var i = 0; i < rows.length; i++)
    +				ids.push(rows[i].id);
    +			$
    +					.ajax({
    +						url : url + "&id=" + ids,
    +						type : 'post',
    +						cache : false,
    +						success : function(data) {
    +							var c = $.parseJSON(data);
    +							var d = "";
    +							var e = "";
    +							$.each(c.obj, function(key, value) {
    +								if (key == "no")
    +									d = value;
    +								else
    +									e = value;
    +							});
    +							W.tip('<t:mutiLang langKey="generate.success"/>' + ":" + e);
    +							W.reloadtablePropertyList();
    +							windowapi.close();
    +						}
    +					});
    +		} else
    +			tip('<t:mutiLang langKey="please.select.generate.item"/>');
    +	}
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHead-add.jsp b/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHead-add.jsp
    new file mode 100644
    index 00000000..37cda1a9
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHead-add.jsp
    @@ -0,0 +1,132 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鍔ㄦ佹姤琛ㄩ厤缃姮澶</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<script type="text/javascript" src="plug-in/ckeditor_new/ckeditor.js"></script>
    +<script type="text/javascript" src="plug-in/ckfinder/ckfinder.js"></script>
    +<script type="text/javascript">
    +  $(document).ready(function(){
    +	$('#tt').tabs({
    +	   onSelect:function(title){
    +	       $('#tt .panel-body').css('width','auto');
    +		}
    +	});
    +  });
    + //鍒濆鍖栦笅鏍
    +	function resetTrNum(tableId) {
    +		$tbody = $("#"+tableId+"");
    +		$tbody.find('>tr').each(function(i){
    +			$(':input, select,button,a', this).each(function(){
    +				var $this = $(this), name = $this.attr('name'),id=$this.attr('id'),onclick_str=$this.attr('onclick'), val = $this.val();
    +				if(name!=null){
    +					if (name.indexOf("#index#") >= 0){
    +						$this.attr("name",name.replace('#index#',i));
    +					}else{
    +						var s = name.indexOf("[");
    +						var e = name.indexOf("]");
    +						var new_name = name.substring(s+1,e);
    +						$this.attr("name",name.replace(new_name,i));
    +					}
    +				}
    +				if(id!=null){
    +					if (id.indexOf("#index#") >= 0){
    +						$this.attr("id",id.replace('#index#',i));
    +					}else{
    +						var s = id.indexOf("[");
    +						var e = id.indexOf("]");
    +						var new_id = id.substring(s+1,e);
    +						$this.attr("id",id.replace(new_id,i));
    +					}
    +				}
    +				if(onclick_str!=null){
    +					if (onclick_str.indexOf("#index#") >= 0){
    +						$this.attr("onclick",onclick_str.replace(/#index#/g,i));
    +					}else{
    +					}
    +				}
    +			});
    +		});
    +	}
    +	function browseImages(inputId, Img) {// 鍥剧墖绠$悊鍣紝鍙涓笂浼犲叡鐢
    +		var finder = new CKFinder();
    +		finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 
    +			$("#" + Img).attr("src", fileUrl);
    +			$("#" + inputId).attr("value", fileUrl);
    +		};
    +		finder.resourceType = 'Images';// 鎸囧畾ckfinder鍙负鍥剧墖杩涜绠$悊
    +		finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID
    +		finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +		finder.defaultLanguage = 'zh-cn';
    +		finder.popup();
    +	}
    +	function browseFiles(inputId, file) {// 鏂囦欢绠$悊鍣紝鍙涓笂浼犲叡鐢
    +		var finder = new CKFinder();
    +		finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 
    +			$("#" + file).attr("href", fileUrl);
    +			$("#" + inputId).attr("value", fileUrl);
    +			decode(fileUrl, file);
    +		};
    +		finder.resourceType = 'Files';// 鎸囧畾ckfinder鍙负鏂囦欢杩涜绠$悊
    +		finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID
    +		finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +		finder.defaultLanguage = 'zh-cn';
    +		finder.popup();
    +	}
    +	function decode(value, id) {//value浼犲叆鍊,id鎺ュ彈鍊
    +		var last = value.lastIndexOf("/");
    +		var filename = value.substring(last + 1, value.length);
    +		$("#" + id).text(decodeURIComponent(filename));
    +	}
    + </script>
    +</head>
    +<body style="overflow-x: hidden;">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" tiptype="1" action="cgreportConfigHeadController.do?doAdd">
    +	<input id="id" name="id" type="hidden" value="${cgreportConfigHeadPage.id }">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"><t:mutiLang langKey="common.code"/>:</label></td>
    +			<td class="value"><input id="code" name="code" type="text" style="width: 150px" class="inputxt" datatype="w1"> <span class="Validform_checktip"></span></td>
    +			<td align="right"><label class="Validform_label"><t:mutiLang langKey="common.name"/> :</label></td>
    +			<td class="value"><input id="name" name="name" type="text" style="width: 150px" class="inputxt" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"><t:mutiLang langKey="query.sql"/>:</label></td>
    +			<td class="value" colspan="3"><textarea rows="5" cols="90" id="cgrSql" name="cgrSql" datatype="*"></textarea> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"><t:mutiLang langKey="common.description"/>:</label></td>
    +			<td class="value" colspan="3"><textarea rows="3" cols="90" id="content" name="content" datatype="*"></textarea> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +	<div style="width: auto; height: 200px;"><%-- 澧炲姞涓涓猟iv锛岀敤浜庤皟鑺傞〉闈㈠ぇ灏忥紝鍚﹀垯榛樿澶皬 --%>
    +	<div style="width: 800px; height: 1px;"></div>
    +	<t:tabs id="tt" iframe="false" tabPosition="top" fit="false">
    +		<t:tab href="cgreportConfigHeadController.do?cgreportConfigItemList&id=${cgreportConfigHeadPage.id}" icon="icon-search" title="dynamic.report.config.detail" id="cgreportConfigItem"></t:tab>
    +	</t:tabs></div>
    +</t:formvalid>
    +<!-- 娣诲姞 闄勮〃鏄庣粏 妯$増 -->
    +<table style="display: none">
    +	<tbody id="add_cgreportConfigItem_table_template">
    +		<tr>
    +			<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +			<td align="left"><input name="cgreportConfigItemList[#index#].fieldName" maxlength="36" type="text" class="inputxt" style="width: 120px;"></td>
    +			<td align="left"><input name="cgreportConfigItemList[#index#].orderNum" maxlength="10" type="text" class="inputxt" style="width: 30px;"></td>
    +			<td align="left"><input name="cgreportConfigItemList[#index#].fieldTxt" maxlength="1000" type="text" class="inputxt" style="width: 120px;"></td>
    +			<td align="left"><t:dictSelect field="cgreportConfigItemList[#index#].fieldType" extendJson="{style:'width:80px'}" type="list" typeGroupCode="fieldtype" defaultVal="String" hasLabel="false" title="common.text.type"></t:dictSelect></td>
    +			<td align="left"><select id="isShow" name="cgreportConfigItemList[#index#].isShow"  style="width: 60px;">
    +				<option value="Y"><t:mutiLang langKey="common.show"/></option>
    +				<option value="N"><t:mutiLang langKey="common.hide"/></option>
    +			</select></td>
    +			<td align="left"><input name="cgreportConfigItemList[#index#].fieldHref" maxlength="1000" type="text" class="inputxt" style="width: 120px;">
    +			<td align="left"><t:dictSelect field="cgreportConfigItemList[#index#].SMode"  extendJson="{style:'width:90px'}" type="list" typeGroupCode="searchmode" defaultVal="" hasLabel="false" title="common.query.module"></t:dictSelect></td>
    +			<td align="left"><input name="cgreportConfigItemList[#index#].replaceVa" maxlength="36" type="text" class="inputxt" style="width: 120px;"></td>
    +			<td align="left"><input name="cgreportConfigItemList[#index#].dictCode" maxlength="36" type="text" class="inputxt" style="width: 120px;"></td>
    +			<td align="left"><t:dictSelect field="cgreportConfigItemList[#index#].SFlag"  extendJson="{style:'width:60px'}" type="list" typeGroupCode="yesorno" defaultVal="" hasLabel="false" title="common.isquery"></t:dictSelect></td>
    +		</tr>
    +	</tbody>
    +</table>
    +</body>
    +<script src="webpage/jeecg/cgreport/core/cgreportConfigHead.js"></script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHead-update.jsp b/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHead-update.jsp
    new file mode 100644
    index 00000000..7b654877
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHead-update.jsp
    @@ -0,0 +1,133 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鍔ㄦ佹姤琛ㄩ厤缃姮澶</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<script type="text/javascript" src="plug-in/ckeditor_new/ckeditor.js"></script>
    +<script type="text/javascript" src="plug-in/ckfinder/ckfinder.js"></script>
    +<script type="text/javascript">
    +  $(document).ready(function(){
    +	$('#tt').tabs({
    +	   onSelect:function(title){
    +	       $('#tt .panel-body').css('width','auto');
    +		}
    +	});
    +  });
    + //鍒濆鍖栦笅鏍
    +	function resetTrNum(tableId) {
    +		$tbody = $("#"+tableId+"");
    +		$tbody.find('>tr').each(function(i){
    +			$(':input, select,button,a', this).each(function(){
    +				var $this = $(this), name = $this.attr('name'),id=$this.attr('id'),onclick_str=$this.attr('onclick'), val = $this.val();
    +				if(name!=null){
    +					if (name.indexOf("#index#") >= 0){
    +						$this.attr("name",name.replace('#index#',i));
    +					}else{
    +						var s = name.indexOf("[");
    +						var e = name.indexOf("]");
    +						var new_name = name.substring(s+1,e);
    +						$this.attr("name",name.replace(new_name,i));
    +					}
    +				}
    +				if(id!=null){
    +					if (id.indexOf("#index#") >= 0){
    +						$this.attr("id",id.replace('#index#',i));
    +					}else{
    +						var s = id.indexOf("[");
    +						var e = id.indexOf("]");
    +						var new_id = id.substring(s+1,e);
    +						$this.attr("id",id.replace(new_id,i));
    +					}
    +				}
    +				if(onclick_str!=null){
    +					if (onclick_str.indexOf("#index#") >= 0){
    +						$this.attr("onclick",onclick_str.replace(/#index#/g,i));
    +					}else{
    +					}
    +				}
    +			});
    +		});
    +	}
    +	function browseImages(inputId, Img) {// 鍥剧墖绠$悊鍣紝鍙涓笂浼犲叡鐢
    +		var finder = new CKFinder();
    +		finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 
    +			$("#" + Img).attr("src", fileUrl);
    +			$("#" + inputId).attr("value", fileUrl);
    +		};
    +		finder.resourceType = 'Images';// 鎸囧畾ckfinder鍙负鍥剧墖杩涜绠$悊
    +		finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID
    +		finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +		finder.defaultLanguage = 'zh-cn';
    +		finder.popup();
    +	}
    +	function browseFiles(inputId, file) {// 鏂囦欢绠$悊鍣紝鍙涓笂浼犲叡鐢
    +		var finder = new CKFinder();
    +		finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 
    +			$("#" + file).attr("href", fileUrl);
    +			$("#" + inputId).attr("value", fileUrl);
    +			decode(fileUrl, file);
    +		};
    +		finder.resourceType = 'Files';// 鎸囧畾ckfinder鍙负鏂囦欢杩涜绠$悊
    +		finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID
    +		finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +		finder.defaultLanguage = 'zh-cn';
    +		finder.popup();
    +	}
    +	function decode(value, id) {//value浼犲叆鍊,id鎺ュ彈鍊
    +		var last = value.lastIndexOf("/");
    +		var filename = value.substring(last + 1, value.length);
    +		$("#" + id).text(decodeURIComponent(filename));
    +	}
    + </script>
    +</head>
    +<body style="overflow-x: hidden;">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" tiptype="1" action="cgreportConfigHeadController.do?doUpdate">
    +	<input id="id" name="id" type="hidden" value="${cgreportConfigHeadPage.id }">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"><t:mutiLang langKey="common.code"/>
    +			:</label></td>
    +			<td class="value"><input id="code" name="code" type="text" style="width: 150px" class="inputxt" datatype="*" value='${cgreportConfigHeadPage.code}'> <span class="Validform_checktip"></span></td>
    +			<td align="right"><label class="Validform_label"><t:mutiLang langKey="common.name"/> :</label></td>
    +			<td class="value"><input id="name" name="name" type="text" style="width: 150px" class="inputxt" datatype="*" value='${cgreportConfigHeadPage.name}'> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"><t:mutiLang langKey="query.sql"/>:</label></td>
    +			<td class="value" colspan="3"><textarea rows="5" cols="90" id="cgrSql" name="cgrSql" datatype="*">${cgreportConfigHeadPage.cgrSql}</textarea> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"><t:mutiLang langKey="common.description"/>:</label></td>
    +			<td class="value" colspan="3"><textarea rows="3" cols="90" id="content" name="content" datatype="*">${cgreportConfigHeadPage.content}</textarea> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +	<div style="width: auto; height: 200px;"><%-- 澧炲姞涓涓猟iv锛岀敤浜庤皟鑺傞〉闈㈠ぇ灏忥紝鍚﹀垯榛樿澶皬 --%>
    +	<div style="width: 800px; height: 1px;"></div>
    +	<t:tabs id="tt" iframe="false" tabPosition="top" fit="false">
    +		<t:tab href="cgreportConfigHeadController.do?cgreportConfigItemList&id=${cgreportConfigHeadPage.id}" icon="icon-search" title="dynamic.report.config.detail" id="cgreportConfigItem"></t:tab>
    +	</t:tabs></div>
    +</t:formvalid>
    +<!-- 娣诲姞 闄勮〃鏄庣粏 妯$増 -->
    +<table style="display: none">
    +	<tbody id="add_cgreportConfigItem_table_template">
    +		<tr>
    +			<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +			<td align="left"><input name="cgreportConfigItemList[#index#].fieldName" maxlength="36" type="text" class="inputxt" style="width: 120px;"></td>
    +			<td align="left"><input name="cgreportConfigItemList[#index#].orderNum" maxlength="10" type="text" class="inputxt" style="width: 30px;"></td>
    +			<td align="left"><input name="cgreportConfigItemList[#index#].fieldTxt" maxlength="1000" type="text" class="inputxt" style="width: 120px;"></td>
    +			<td align="left"><t:dictSelect field="cgreportConfigItemList[#index#].fieldType" type="list" typeGroupCode="fieldtype" defaultVal="String" hasLabel="false" title="common.text.type"></t:dictSelect></td>
    +			<td align="left"><select id="isShow" name="cgreportConfigItemList[#index#].isShow"  style="width: 60px;">
    +				<option value="Y"><t:mutiLang langKey="common.show"/></option>
    +				<option value="N"><t:mutiLang langKey="common.hide"/></option>
    +			</select></td>
    +			<td align="left"><input name="cgreportConfigItemList[#index#].fieldHref" maxlength="1000" type="text" class="inputxt" style="width: 120px;">
    +			<td align="left"><t:dictSelect field="cgreportConfigItemList[#index#].SMode" type="list" typeGroupCode="searchmode" defaultVal="" hasLabel="false" title="common.query.module"></t:dictSelect></td>
    +			<td align="left"><input name="cgreportConfigItemList[#index#].replaceVa" maxlength="36" type="text" class="inputxt" style="width: 120px;"></td>
    +			<td align="left"><input name="cgreportConfigItemList[#index#].dictCode" maxlength="36" type="text" class="inputxt" style="width: 120px;"></td>
    +			<td align="left"><t:dictSelect field="cgreportConfigItemList[#index#].SFlag" type="list" typeGroupCode="yesorno" defaultVal="" hasLabel="false" title="common.isquery"></t:dictSelect></td>
    +		</tr>
    +	</tbody>
    +</table>
    +</body>
    +<script src="webpage/jeecg/cgreport/core/cgreportConfigHead.js"></script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHead.js b/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHead.js
    new file mode 100644
    index 00000000..408d715c
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHead.js
    @@ -0,0 +1,28 @@
    +$(function(){
    +$("body").append("<link href=\"plug-in/lhgDialog/skins/default.css\" rel=\"stylesheet\" id=\"lhgdialoglink\">");
    +var $btn = $("<div class=\"ui_buttons\"  style=\"display:inline-block;\"><input style=\"position: relative;top: -8px;\" class=\"ui_state_highlight\" type=\"button\" value=" + sqlParse + "  id=\"sqlAnalyze\" /></div>");
    +$("#cgrSql").after($btn);
    +$btn.click(function(){
    + $.ajax({
    +    url:"cgReportController.do?getFields",
    +    data:{sql:$("#cgrSql").val()},
    +	type:"Post",
    +    dataType:"json",
    +    success:function(data){
    +    if(data.status=="success"){
    +	      $("#add_cgreportConfigItem_table").empty();
    +	      $.each(data.datas,function(index,e){
    +	        var $tr = $("#add_cgreportConfigItem_table_template tr").clone();
    +		    $tr.find("td:eq(1) :text").val(e);
    +		    $tr.find("td:eq(2) :text").val(index);
    +		    $tr.find("td:eq(3) :text").val(e);
    +		    $("#add_cgreportConfigItem_table").append($tr);
    +	      }); 
    +	      resetTrNum("add_cgreportConfigItem_table");
    +    }else{
    +		$.messager.alert('閿欒',data.datas);
    +	}
    +  }
    +  });
    + });
    +});
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHeadList.js b/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHeadList.js
    new file mode 100644
    index 00000000..e69de29b
    diff --git a/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHeadList.jsp b/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHeadList.jsp
    new file mode 100644
    index 00000000..b1dcb8d6
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigHeadList.jsp
    @@ -0,0 +1,48 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +<t:datagrid fitColumns="false" checkbox="true" name="cgreportConfigHeadList" title="dynamic.table.head" 
    +            actionUrl="cgreportConfigHeadController.do?datagrid" idField="id" fit="true" queryMode="group"
    +            sortName="createDate" sortOrder="desc">
    +	<t:dgCol title="" field="id" hidden="true" queryMode="single" width="120" ></t:dgCol>
    +	<t:dgCol title="common.code" field="code" query="true" queryMode="single" width="120"></t:dgCol>
    +	<t:dgCol title="common.name" field="name" query="true" queryMode="single" width="120"></t:dgCol>
    +	<t:dgCol title="query.sql" field="cgrSql" query="true" queryMode="single" width="120"></t:dgCol>
    +	<t:dgCol title="common.createby" field="createBy" hidden="false"></t:dgCol>
    +	<t:dgCol title="common.createtime" field="createDate" formatter="yyyy-MM-dd" hidden="false"></t:dgCol>
    +	<t:dgCol title="common.updateby" field="updateBy" hidden="false"></t:dgCol>
    +	<t:dgCol title="common.updatetime" field="updateDate" formatter="yyyy-MM-dd" hidden="false"></t:dgCol>
    +	<t:dgCol title="common.description" field="content" query="true" queryMode="single" width="120"></t:dgCol>
    +	<t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="common.delete" url="cgreportConfigHeadController.do?doDel&id={id}" />
    +	<t:dgFunOpt funname="popMenuLink(code,name)" title="閰嶇疆鍦板潃"></t:dgFunOpt>
    +	<t:dgToolBar title="common.add" icon="icon-add" url="cgreportConfigHeadController.do?goAdd" funname="add" height="450" width="1200"></t:dgToolBar>
    +	<t:dgToolBar title="common.edit" icon="icon-edit" url="cgreportConfigHeadController.do?goUpdate" funname="update" height="450" width="1200"></t:dgToolBar>
    +	<t:dgToolBar title="common.batch.delete" icon="icon-remove" url="cgreportConfigHeadController.do?doBatchDel" funname="deleteALLSelect"></t:dgToolBar>
    +	<t:dgToolBar title="common.query" icon="icon-search" url="cgreportConfigHeadController.do?goUpdate" funname="detail" height="450" width="1200"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +<script src="webpage/jeecg/cgreport/core/cgreportConfigHeadList.js"></script>
    +<script src="plug-in/clipboard/ZeroClipboard.js"></script>
    +<script type="text/javascript">
    +  $(document).ready(function(){
    + 		//缁欐椂闂存帶浠跺姞涓婃牱寮
    + });
    +  
    +  /**
    +	*	寮瑰嚭鑿滃崟閾炬帴
    +	*/
    +	function popMenuLink(tableName,content){
    +		$.dialog({
    +			content: "url:cgFormHeadController.do?popmenulink&url=cgReportController.do?list&title="+tableName,
    +            drag :false,
    +            lock : true,
    +            title:'鑿滃崟閾炬帴['+content+']',
    +            opacity : 0.3,
    +            width:400,
    +            height:80,drag:false,min:false,max:false
    +		}).zindex();
    +	}
    + </script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigItemList.jsp b/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigItemList.jsp
    new file mode 100644
    index 00000000..8bb10379
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/cgreport/core/cgreportConfigItemList.jsp
    @@ -0,0 +1,89 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<script type="text/javascript">
    +	$('#addCgreportConfigItemBtn').linkbutton({   
    +	    iconCls: 'icon-add'  
    +	});  
    +	$('#delCgreportConfigItemBtn').linkbutton({   
    +	    iconCls: 'icon-remove'  
    +	}); 
    +	$('#addCgreportConfigItemBtn').bind('click', function(){   
    + 		 var tr =  $("#add_cgreportConfigItem_table_template tr").clone();
    +	 	 $("#add_cgreportConfigItem_table").append(tr);
    +	 	 resetTrNum('add_cgreportConfigItem_table');
    +    });  
    +	$('#delCgreportConfigItemBtn').bind('click', function(){   
    +      	$("#add_cgreportConfigItem_table").find("input:checked").parent().parent().remove();   
    +        resetTrNum('add_cgreportConfigItem_table'); 
    +    }); 
    +    $(document).ready(function(){
    +    	$(".datagrid-toolbar").parent().css("width","auto");
    +    	if(location.href.indexOf("load=detail")!=-1){
    +			$(":input").attr("disabled","true");
    +			$(".datagrid-toolbar").hide();
    +		}
    +    });
    +</script>
    +<div style="padding: 3px; height: 25px; width: auto;" class="datagrid-toolbar"><a id="addCgreportConfigItemBtn" href="#">娣诲姞</a> <a id="delCgreportConfigItemBtn" href="#">鍒犻櫎</a></div>
    +<div style="width: auto; height: 300px; overflow-y: auto; overflow-x: scroll;">
    +<table border="0" cellpadding="2" cellspacing="0" id="cgreportConfigItem_table">
    +	<tr bgcolor="#E6E6E6">
    +		<td align="center" bgcolor="#EEEEEE"><label class="Validform_label"><t:mutiLang langKey="common.code"/></label></td>
    +		<td align="left" bgcolor="#EEEEEE"><label class="Validform_label"> <t:mutiLang langKey="common.name"/> </label></td>
    +		<td align="left" bgcolor="#EEEEEE"><label class="Validform_label"> <t:mutiLang langKey="common.order"/> </label></td>
    +		<td align="left" bgcolor="#EEEEEE"><label class="Validform_label"> <t:mutiLang langKey="common.text"/> </label></td>
    +		<td align="left" bgcolor="#EEEEEE"><label class="Validform_label"> <t:mutiLang langKey="common.type"/> </label></td>
    +		<td align="left" bgcolor="#EEEEEE"><label class="Validform_label"> <t:mutiLang langKey="common.isshow"/>  </label></td>
    +		<td align="left" bgcolor="#EEEEEE"><label class="Validform_label">  <t:mutiLang langKey="common.href"/>  </label></td>
    +		<td align="left" bgcolor="#EEEEEE"><label class="Validform_label">  <t:mutiLang langKey="common.query.module"/>  </label></td>
    +		<td align="left" bgcolor="#EEEEEE"><label class="Validform_label">  <t:mutiLang langKey="common.type"/> </label></td>
    +		<td align="left" bgcolor="#EEEEEE"><label class="Validform_label">  <t:mutiLang langKey="dict.code"/>  </label></td>
    +		<td align="left" bgcolor="#EEEEEE"><label class="Validform_label">  <t:mutiLang langKey="common.isquery"/>  </label></td>
    +	</tr>
    +	<tbody id="add_cgreportConfigItem_table">
    +		<c:if test="${fn:length(cgreportConfigItemList)  <= 0 }">
    +			<tr>
    +				<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +				<input name="cgreportConfigItemList[0].id" type="hidden" />
    +				<input name="cgreportConfigItemList[0].cgrheadId" type="hidden" />
    +				<td align="left"><input name="cgreportConfigItemList[0].fieldName" maxlength="36" type="text" class="inputxt" style="width: 120px;"></td>
    +				<td align="left"><input name="cgreportConfigItemList[0].orderNum" maxlength="3" type="text" class="inputxt" style="width: 30px;"></td>
    +				<td align="left"><input name="cgreportConfigItemList[0].fieldTxt" maxlength="1000" type="text" class="inputxt" style="width: 120px;"></td>
    +				<td align="left"><t:dictSelect field="cgreportConfigItemList[0].fieldType"  extendJson="{style:'width:80px'}" type="list" typeGroupCode="fieldtype" defaultVal="${cgreportConfigItemPage.fieldType}" hasLabel="false" title="common.text.type"></t:dictSelect></td>
    +				<td align="left"><select name="cgreportConfigItemList[0].isShow" style="width: 60px;">
    +					<option value="Y"> <t:mutiLang langKey="common.show"/></option>
    +					<option value="N"> <t:mutiLang langKey="common.hide"/></option>
    +				</select></td>
    +				<td align="left"><input name="cgreportConfigItemList[0].fieldHref" maxlength="100" type="text" class="inputxt" style="width: 120px;"></td>
    +				<td align="left"><t:dictSelect field="cgreportConfigItemList[0].SMode" type="list"  extendJson="{style:'width:90px'}" typeGroupCode="searchmode" defaultVal="${cgreportConfigItemPage.sMode}" hasLabel="false" title="common.query.module"></t:dictSelect></td>
    +				<td align="left"><input name="cgreportConfigItemList[0].replaceVa" maxlength="36" type="text" class="inputxt" style="width: 120px;"></td>
    +				<td align="left"><input name="cgreportConfigItemList[0].dictCode" maxlength="36" type="text" class="inputxt" style="width: 120px;"></td>
    +				<td align="left"><t:dictSelect field="cgreportConfigItemList[0].SFlag"  extendJson="{style:'width:60px'}" divClass="STYLE_LEG" type="list" typeGroupCode="yesorno" defaultVal="${cgreportConfigItemPage.sFlag}" hasLabel="false" title="common.isquery"></t:dictSelect></td>
    +			</tr>
    +		</c:if>
    +		<c:if test="${fn:length(cgreportConfigItemList)  > 0 }">
    +			<c:forEach items="${cgreportConfigItemList}" var="poVal" varStatus="stuts">
    +				<tr>
    +					<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +					<input name="cgreportConfigItemList[${stuts.index }].id" type="hidden" value="${poVal.id }" />
    +					<input name="cgreportConfigItemList[${stuts.index }].cgrheadId" type="hidden" value="${poVal.cgrheadId }" />
    +					<td align="left"><input name="cgreportConfigItemList[${stuts.index }].fieldName" maxlength="36" type="text" class="inputxt" style="width: 120px;" value="${poVal.fieldName }"></td>
    +					<td align="left"><input name="cgreportConfigItemList[${stuts.index }].orderNum" maxlength="10" type="text" class="inputxt" style="width: 30px;" value="${poVal.orderNum }"></td>
    +					<td align="left"><input name="cgreportConfigItemList[${stuts.index }].fieldTxt" maxlength="1000" type="text" class="inputxt" style="width: 120px;" value="${poVal.fieldTxt }"></td>
    +					<td align="left"><t:dictSelect field="cgreportConfigItemList[${stuts.index }].fieldType" type="list" extendJson="{style:'width:80px'}" typeGroupCode="fieldtype" defaultVal="${poVal.fieldType}" hasLabel="false" title="common.text.type"></t:dictSelect>
    +					</td>
    +					<td align="left"><select id="isShow" name="cgreportConfigItemList[${stuts.index}].isShow"  style="width: 60px;">
    +						<option value="N" <c:if test="${poVal.isShow eq 'N'}"> selected="selected"</c:if>><t:mutiLang langKey="common.hide"/></option>
    +						<option value="Y" <c:if test="${poVal.isShow eq 'Y'}"> selected="selected"</c:if>><t:mutiLang langKey="common.show"/></option>
    +					</select></td>
    +					<td align="left"><input name="cgreportConfigItemList[${stuts.index }].fieldHref" maxlength="120" type="text" class="inputxt" style="width: 120px;" value="${poVal.fieldHref}"></td>
    +					<td align="left"><t:dictSelect field="cgreportConfigItemList[${stuts.index }].SMode"  extendJson="{style:'width:90px'}" type="list" typeGroupCode="searchmode" defaultVal="${poVal.SMode}" hasLabel="false" title="common.query.module"></t:dictSelect></td>
    +					<td align="left"><input name="cgreportConfigItemList[${stuts.index }].replaceVa" maxlength="36" type="text" class="inputxt" style="width: 120px;" value="${poVal.replaceVa }"></td>
    +					<td align="left"><input name="cgreportConfigItemList[${stuts.index }].dictCode" maxlength="36" type="text" class="inputxt" style="width: 120px;" value="${poVal.dictCode }"></td>
    +					<td align="left"><t:dictSelect field="cgreportConfigItemList[${stuts.index }].SFlag" extendJson="{style:'width:60px'}" type="list" typeGroupCode="yesorno" defaultVal="${poVal.SFlag}" hasLabel="false" title="common.isquery"></t:dictSelect></td>
    +				</tr>
    +			</c:forEach>
    +		</c:if>
    +	</tbody>
    +</table>
    +</div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/AJAX/select.jsp b/src/main/webapp/webpage/jeecg/demo/base/AJAX/select.jsp
    new file mode 100644
    index 00000000..964715ee
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/AJAX/select.jsp
    @@ -0,0 +1,45 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<script type="text/javascript">
    +	function getdemo(id) {
    +		if(id==''){
    +			$('#demo').html("");
    +			return;
    +		}
    +
    +		window.top.$.messager.progress({
    +			text : '姝e湪鍔犺浇鏁版嵁....',
    +			interval : 300
    +		});
    +		var url = "demoController.do?getDemo&id=" + encodeURIComponent(encodeURIComponent(id));
    +		$.ajax({
    +			type : 'POST',
    +			url : url,
    +			success : function(data) {
    +				var d = $.parseJSON(data);
    +				if (d.success) {
    +					window.top.$.messager.progress('close');
    +					$('#demo').html(d.msg);
    +
    +				}
    +			}
    +		});
    +	}
    +</script>
    +<t:formvalid layout="table" dialog="false" formid="formobj">
    +	<table class="formtable" cellpadding="0" cellspacing="1">
    +		<tr>
    +			<td width="10%" height="50" align="right"><span class="filedzt">涓嬫媺妗咥JAX鑱斿姩锛</span></td>
    +			<td width="90%" class="value" colspan="3"><select style="width: 150px" name="proname" id="proname" onchange="getdemo(this.value);">
    +				<option value="">--- 璇烽夋嫨鑿滃崟 ---</option>
    +				<c:forEach var="fun" items="${funList}" varStatus="status">
    +					<option value="${fun.id }">${fun.functionName}</option>
    +				</c:forEach>
    +			</select></td>
    +		</tr>
    +		<tr>
    +			<td height="50" align="right"><span class="filedzt">鑿滃崟椤圭洰锛</span></td>
    +			<td class="value" colspan="3" nowrap><SPAN id="demo"></SPAN></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/autocomplete/basic.jsp b/src/main/webapp/webpage/jeecg/demo/base/autocomplete/basic.jsp
    new file mode 100644
    index 00000000..bd65b759
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/autocomplete/basic.jsp
    @@ -0,0 +1,50 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<script src="plug-in/jquery/jquery-autocomplete/jquery.autocomplete.js" type="text/javascript"></script>
    +<link href="plug-in/jquery/jquery-autocomplete/jquery.autocomplete.css" rel="stylesheet" type="text/css" />
    +<style>
    +<!--
    +.ac_over {
    +	background: #E0ECFF;
    +	cursor: pointer;
    +	color: #416AA3;
    +}
    +
    +.ac_results {
    +	border: 1px solid rgb(172, 216, 236);
    +}
    +-->
    +</style>
    +<SCRIPT type="text/javascript">
    +        function parse(data){
    +            	var parsed = [];
    +		        	$.each(data.rows,function(index,row){
    +		        		parsed.push({data:row,result:row,value:row.id});
    +		        	});
    +        				return parsed;
    +        }
    +        /**
    +         * 閫夋嫨鍚庡洖璋 
    +         * 
    +         * @param {Object} data
    +         */
    +        function callBack(data) {
    +        	$("#user").val(data.userName);
    +        }
    +        
    +         /**
    +          * 姣忎竴涓夋嫨椤规樉绀虹殑淇℃伅
    +          * 
    +          * @param {Object} data
    +          */
    +        function formatItem(data) {
    +        	return data.userName + "-->" + " " + data.realName;
    +        }
    +
    +  </SCRIPT>
    +<t:formvalid formid="formobj" dialog="false" layout="div" action="demoController.do?saveDemo">
    +	<fieldset class="step">
    +	<div class="form"><label class="form"> 鑷姩琛ュ叏锛 </label> <t:autocomplete minLength="1" dataSource="commonController.do?getAutoList" closefun="close" valueField="id" searchField="userName,realName"
    +		labelField="userName,realName" parse="parse" formatItem="formatItem" result="callBack" name="user" entityName="TSUser" datatype="*" maxRows="10" nullmsg="璇疯緭鍏ュ叧閿瓧" errormsg="鏁版嵁涓嶅瓨鍦,璇烽噸鏂拌緭鍏"></t:autocomplete>
    +	</fieldset>
    +</t:formvalid>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/demo.jsp b/src/main/webapp/webpage/jeecg/demo/base/demo.jsp
    new file mode 100644
    index 00000000..eb4a3c3a
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/demo.jsp
    @@ -0,0 +1,21 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>DEMO缂栬緫</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" action="demoController.do?saveDemo">
    +	<input type="hidden" name="id" id="id" value="${demo.id}">
    +	<fieldset class="step">
    +	<div class="form"><label class="Validform_label"> DEMO鍚嶇О锛 </label> <input name="demotitle" class="inputxt" value="${demo.demotitle}" datatype="s2-50"> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"> DEMO鍦板潃锛 </label> <input name="demourl" class="inputxt" value="${demo.demourl}"> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"> 涓婄骇DEMO锛 </label> <t:comboTree url="demoController.do?pDemoList" name="TSDemo.id" id="pdemo" value="${demo.TSDemo.id }"></t:comboTree></div>
    +	<div class="form"><label class="Validform_label"> html浠g爜锛 </label> <textarea cols="80" name="democode" rows="10" datatype="*">${demo.democode}</textarea></div>
    +	<div class="form"><label class="Validform_label"> 鎺掑簭锛 </label> <input name="demoorder" class="inputxt" value="${demo.demoorder }" datatype="n"> <span class="Validform_checktip"></span></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/demoIframe.jsp b/src/main/webapp/webpage/jeecg/demo/base/demoIframe.jsp
    new file mode 100644
    index 00000000..21fea111
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/demoIframe.jsp
    @@ -0,0 +1,41 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<script type="text/javascript">
    +	$(function() {
    +		$('#demotree').tree({
    +			animate : true,
    +			url : 'demoController.do?pDemoList',
    +			onClick : function(node) {
    +				if ($('#demotree').tree('isLeaf', node.target)) {
    +					$.ajax({
    +						url:"demoController.do?demoTurn&id=" + node.id,
    +						dataType:'json',
    +						success:function(html){
    +							$("#demopanle").html(html+'<script type="text/javascript">$(function(){$("#demopanle").Validform({tiptype:4,btnSubmit:"#btn_sub",btnReset:"#btn_reset",ajaxPost:true,callback:function(data){var win = frameElement.api.opener;if(data.success==true){frameElement.api.close();win.tip(data.msg);}else{'+
    +									'if(data.responseText==""||data.responseText==undefined)$("#demopanle").html(data.msg);'+
    +									'else $("#demopanle").html(data.responseText); return false;}win.reloadTable();}});});<\/script>');
    +						}
    +					});
    +				} else {
    +					$('#demotree').tree('expand', node.target);
    +				}
    +			}
    +		});
    +		
    +	});
    +</script>
    +<div class="easyui-layout" fit="true">
    +<link rel="stylesheet" href="plug-in/Validform/css/divfrom.css" type="text/css">
    +<link rel="stylesheet" href="plug-in/Validform/css/style.css" type="text/css">
    +<link rel="stylesheet" href="plug-in/Validform/css/tablefrom.css" type="text/css">
    +<script type="text/javascript" src="plug-in/Validform/js/Validform_v5.3.1_min_zh-cn.js"></script> <script type="text/javascript" src="plug-in/Validform/js/Validform_Datatype_zh-cn.js"></script> <script
    +	type="text/javascript" src="plug-in/Validform/js/datatype_zh-cn.js"></script>
    +<div region="center" style="padding: 3px;" class="easyui-panel" id="demopanle"></div>
    +<div region="west" style="width: 150px;" title="DEMO鍒嗙被" split="true">
    +<div class="easyui-panel" style="padding: 1px;" fit="true" border="false">
    +<ul id="demotree">
    +</ul>
    +</div>
    +</div>
    +</div>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/demoList.jsp b/src/main/webapp/webpage/jeecg/demo/base/demoList.jsp
    new file mode 100644
    index 00000000..bce4cc12
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/demoList.jsp
    @@ -0,0 +1,49 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<t:datagrid name="addDemoList" title="DEMO缁存姢" actionUrl="demoController.do?demoGrid" idField="id" treegrid="true" pagination="false">
    +	<t:dgCol title="缂栧彿" field="id" treefield="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="DEMO鍚嶇О" field="functionName" width="100" treefield="text"></t:dgCol>
    +	<t:dgCol title="DEMO鍦板潃" field="functionUrl" treefield="src"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt url="demoController.do?delDemo&id={id}" title="鍒犻櫎"></t:dgDelOpt>
    +</t:datagrid>
    +<div id="addDemoListtb" style="padding: 5px; height: 25px">
    +<div style="float: left;">
    +	<a href="#" class="easyui-linkbutton" plain="true" icon="icon-add" onclick="add('DEMO褰曞叆','demoController.do?aorudemo','addDemoList')">寮瑰嚭鏂瑰紡娣诲姞</a>
    +	<a href="#" class="easyui-linkbutton" plain="true" icon="icon-add" onclick="addbytab()">TAB鏂瑰紡娣诲姞</a>
    +	<a href="#" class="easyui-linkbutton" plain="true" icon="icon-edit" onclick="update('DEMO缂栬緫','demoController.do?aorudemo','addDemoList')">寮瑰嚭鏂瑰紡缂栬緫</a>
    +	<a href="#" class="easyui-linkbutton" plain="true" icon="icon-edit" onclick="updatebytab()">TAB鏂瑰紡缂栬緫</a>
    +	</div>
    +</div>
    +<script type="text/javascript">
    +function addbytab() {
    +	//var title =findThisTitle();
    +	document.location="demoController.do?aorudemo&type=table";
    +	//addOneTab("TAB鏂瑰紡娣诲姞", "demoController.do?aorudemo&type=table&isIframe");
    +	//closeThisTab(title);
    +}
    +function updatebytab(){
    +var rows = $("#addDemoList").datagrid("getSelections");
    +	if(rows==''){
    +		alert('璇烽夋嫨涓琛岃褰');
    +		return;
    +	}
    +	var id=rows[0].id;
    +	
    +	//var title =findThisTitle();
    +	document.location="demoController.do?aorudemo&type=tableupdate&id="+id;
    +	//addOneTab("TAB鏂瑰紡缂栬緫", "demoController.do?aorudemo&id="+id);
    +	//closeThisTab(title);
    +}
    +function closeThisTab(title){
    +    window.top.$('#maintabs').tabs('close',title); 
    +}
    +function findThisTitle(){
    +	var currTab =  window.top.$('#maintabs').tabs('getSelected'); 
    +	var tab = currTab.panel('options').tab;
    +    var title=tab.text();
    +    return title;
    +}
    +</script>
    +
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/demoTab.jsp b/src/main/webapp/webpage/jeecg/demo/base/demoTab.jsp
    new file mode 100644
    index 00000000..8e747b2e
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/demoTab.jsp
    @@ -0,0 +1,33 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>DEMO缂栬緫</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<SCRIPT type="text/javascript">
    +  function test(data) {
    +	  $.messager.confirm('鎻愮ず淇℃伅', data.msg, function(r){
    +			document.location="demoController.do?demoList";
    +		});
    +		//closetab('TAB鏂瑰紡娣诲姞');
    +	}
    +  </SCRIPT>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="false" action="demoController.do?saveDemo" btnsub="btn" callback="test">
    +	<input type="hidden" name="id" id="id" value="${demo.id}">
    +	<fieldset class="step">
    +	<div class="form"><label class="Validform_label"> DEMO鍚嶇О锛 </label> <input name="demotitle" class="inputxt" value="${demo.demotitle}" datatype="s2-50"> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"> DEMO鍦板潃锛 </label> <input name="demourl" class="inputxt" value="${demo.demourl}"> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"> 涓婄骇DEMO锛 </label> <t:comboTree url="demoController.do?pDemoList" name="TSDemo.id" id="pdemo" value="${demo.TSDemo.id }"></t:comboTree></div>
    +	<div class="form"><label class="Validform_label"> html浠g爜锛 </label> <textarea cols="80" name="democode" rows="10" datatype="*">${demo.democode}</textarea></div>
    +	<div class="form"><label class="Validform_label"> 鎺掑簭锛 </label> <input name="demoorder" class="inputxt" value="${demo.demoorder }" datatype="n"> <span class="Validform_checktip"></span></div>
    +	
    +	<a href="#" class="easyui-linkbutton" id="btn" iconCls="icon-ok">鎻愪氦</a> 
    +	<a href="#" class="easyui-linkbutton" id="btn_reset" iconCls="icon-back">閲嶇疆</a>
    +	<a href="javascript:history.go(-1)" class="easyui-linkbutton" id="btn_reset" iconCls="icon-back">杩斿洖</a>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/democode.jsp b/src/main/webapp/webpage/jeecg/demo/base/democode.jsp
    new file mode 100644
    index 00000000..8dba311c
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/democode.jsp
    @@ -0,0 +1,21 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>DEMO娣诲姞</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript" src="plug-in/SyntaxHighlighter/scripts/shCore.js"></script>
    +<script type="text/javascript" src="plug-in/SyntaxHighlighter/scripts/shBrushJScript.js"></script>
    +<link type="text/css" rel="stylesheet" href="plug-in/SyntaxHighlighter/styles/shCoreDefault.css" />
    +<script type="text/javascript">
    +	SyntaxHighlighter.config.bloggerMode = true;
    +	SyntaxHighlighter.all();
    +</script>
    +</head>
    +<body style="overflow: auto">
    +<pre class="brush:js">
    +   ${demo.democode}
    +   </pre>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/dict/dictSelect.jsp b/src/main/webapp/webpage/jeecg/demo/base/dict/dictSelect.jsp
    new file mode 100644
    index 00000000..ab11c066
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/dict/dictSelect.jsp
    @@ -0,0 +1,15 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<title>鏁版嵁瀛楀吀婕旂ず</title>
    +</head>
    +<body style="overflow-y: hidden" scroll="no" onload="chageValue1();">
    +<t:formvalid formid="formobj" layout="div" dialog="true" action="##">
    +	<fieldset class="step"><t:dictSelect field="sex" typeGroupCode="sex" defaultVal="default" title="鎬у埆 Label"></t:dictSelect> <t:dictSelect field="sex" typeGroupCode="sex"
    +		defaultVal="default" hasLabel="false" title="鎬у埆(娌℃湁label)"></t:dictSelect></fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/formvalid/basic.jsp b/src/main/webapp/webpage/jeecg/demo/base/formvalid/basic.jsp
    new file mode 100644
    index 00000000..f1f73d80
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/formvalid/basic.jsp
    @@ -0,0 +1,20 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:formvalid formid="formobj" dialog="false" layout="div" action="demoController.do?saveDemo">
    +	<input type="hidden" id="id" />
    +	<fieldset class="step">
    +	<div class="form"><label class="Validform_label"> 闈炵┖楠岃瘉锛 </label> <input name="demotitle" id="demotitle" datatype="*" errormsg="璇ュ瓧娈典笉涓虹┖"> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"> URL楠岃瘉锛 </label> <input name="demourl" id="demourl" datatype="url" errormsg="蹇呴』鏄疷RL"> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"> 鑷冲皯閫夋嫨2椤癸細 </label> 
    +	<input name="shoppingsite1" class="rt2" id="shoppingsite21" type="checkbox" value="1" datatype="need2" nullmsg="璇烽夋嫨鎮ㄧ殑鐖卞ソ锛" />
    +	闃呰 <input name="shoppingsite1" class="rt2" id="shoppingsite22" type="checkbox" value="2" /> 
    +	闊充箰 <input name="shoppingsite1" class="rt2" id="shoppingsite23" type="checkbox" value="3" /> 
    +	杩愬姩 <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"> 閭锛 </label> <input name="demoorder" id="demoorder" datatype="e" errormsg="閭闈炴硶"> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"> 鎵嬫満鍙凤細 </label> <input name="phone" id="phone" datatype="m" errormsg="鎵嬫満鍙烽潪娉"> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"> 閲戦锛 </label> <input name="money" id="money" datatype="d" errormsg="閲戦闈炴硶"> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"> 鏃ユ湡锛 </label> <input name="date" id="date" class="easyui-datebox"> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"> 鏃堕棿锛 </label> <input name="time" id="time" class="easyui-datetimebox"> <span class="Validform_checktip"></span></div>
    +	</fieldset>
    +	<a href="#" class="easyui-linkbutton" onclick="openwindow('琛ㄥ崟楠岃瘉婧愮爜','demoController.do?demoCode&id=1','琛ㄥ崟楠岃瘉婧愮爜',1000,600)">鏌ョ湅婧愮爜</a>
    +</t:formvalid>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/formvalid/formTabs.jsp b/src/main/webapp/webpage/jeecg/demo/base/formvalid/formTabs.jsp
    new file mode 100644
    index 00000000..adb03274
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/formvalid/formTabs.jsp
    @@ -0,0 +1,9 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<t:tabs id="tt" iframe="false" tabPosition="bottom">
    +	<t:tab href="demoController.do?autoupload&turn=formvalid/basic" icon="icon-search" title="琛ㄥ崟楠岃瘉" id="default"></t:tab>
    +	<t:tab href="demoController.do?autoupload&turn=autocomplete/basic" icon="icon-search" title="鑷姩瀹屾垚" id="autocom"></t:tab>
    +	<t:tab href="demoController.do?select" icon="icon-search" title="涓嬫媺鑱斿姩" id="autoSelect"></t:tab>
    +</t:tabs>
    +
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/jdbc/jdbc-list.jsp b/src/main/webapp/webpage/jeecg/demo/base/jdbc/jdbc-list.jsp
    new file mode 100644
    index 00000000..3c6f9855
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/jdbc/jdbc-list.jsp
    @@ -0,0 +1,9 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<t:datagrid name="dictParameterList" title="SQL鍒嗙浠g爜鍐欐硶" actionUrl="jeecgJdbcController.do?listAllDictParaByJdbc" idField="id" fit="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="鐪熷疄鍚嶅瓧" field="realname"></t:dgCol>
    +	<t:dgCol title="璐﹀彿" field="username"></t:dgCol>
    +	<t:dgCol title="鐘舵" field="status"></t:dgCol>
    +</t:datagrid>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/nopage/userList.jsp b/src/main/webapp/webpage/jeecg/demo/base/nopage/userList.jsp
    new file mode 100644
    index 00000000..c7c81ee0
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/nopage/userList.jsp
    @@ -0,0 +1,14 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<t:datagrid name="userListNoPage" title="鐢ㄦ埛绠$悊" actionUrl="userController.do?datagrid" fit="true" fitColumns="true" idField="id" queryMode="group" pagination="false">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="鐢ㄦ埛鍚" sortable="false" field="userName" query="true"></t:dgCol>
    +	<t:dgCol title="閮ㄩ棬" field="TSDepart_departname" query="true" queryMode="single" replace="${departsReplace}"></t:dgCol>
    +	<t:dgCol title="鐪熷疄濮撳悕" field="realName" query="true"></t:dgCol>
    +	<t:dgCol title="鐘舵" sortable="true" field="status" replace="姝e父_1,绂佺敤_0,瓒呯骇绠$悊鍛榑-1"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="鍒犻櫎" url="userController.do?del&id={id}&userName={userName}" />
    +	<t:dgToolBar title="鐢ㄦ埛褰曞叆" icon="icon-add" url="userController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="鐢ㄦ埛缂栬緫" icon="icon-edit" url="userController.do?addorupdate" funname="update"></t:dgToolBar>
    +</t:datagrid>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/report/reportDemo.jsp b/src/main/webapp/webpage/jeecg/demo/base/report/reportDemo.jsp
    new file mode 100644
    index 00000000..192cf080
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/report/reportDemo.jsp
    @@ -0,0 +1,191 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!-- context path -->
    +<t:base type="jquery,easyui"></t:base>
    +<script type="text/javascript" src="plug-in/Highcharts-2.2.5/js/highcharts.src.js"></script>
    +<script type="text/javascript" src="plug-in/Highcharts-2.2.5/js/modules/exporting.src.js"></script>
    +
    +<c:set var="ctxPath" value="${pageContext.request.contextPath}" />
    +<script type="text/javascript">
    +	$(function() {
    +		$(document).ready(function() {
    +			var chart;
    +			$.ajax({
    +				type : "POST",
    +				url : "reportDemoController.do?studentCount&reportType=line",
    +				success : function(jsondata) {
    +					data = eval(jsondata);
    +					chart = new Highcharts.Chart({
    +						chart : {
    +							renderTo : 'containerline',
    +							plotBackgroundColor : null,
    +							plotBorderWidth : null,
    +							plotShadow : false
    +						},
    +						title : {
    +							text : '<t:mutiLang langKey="class.student.count.analysis"/>-<b><t:mutiLang langKey="common.line.chart"/></b>'
    +						},
    +						xAxis : {
    +							categories : [ '1鐝', '2鐝', '3鐝', '4鐝', '5鐝']
    +						},
    +						tooltip : {
    +							shadow: false,
    +							percentageDecimals : 1,
    +							formatter: function() {
    +            					return  '<b>'+this.point.name + '</b>:' +  Highcharts.numberFormat(this.percentage, 1) +'%';
    +         					}
    +
    +						},
    +						exporting:{  
    +			                filename:'pie',  
    +			                 url:'${ctxPath}/reportDemoController.do?export'  
    +			            },  
    +						plotOptions : {
    +							pie : {
    +								allowPointSelect : true,
    +								cursor : 'pointer',
    +								showInLegend : true,
    +								dataLabels : {
    +									enabled : true,
    +									color : '#000000',
    +									connectorColor : '#000000',
    +									formatter : function() {
    +										return '<b>' + this.point.name + '</b>: ' + Highcharts.numberFormat(this.percentage, 1)+"%";
    +									}
    +								}
    +							}
    +						},
    +						series : data
    +					});
    +				}
    +			});
    +		});
    +	});
    +</script>
    +
    +
    +<script type="text/javascript">
    +	$(function() {
    +		$(document).ready(function() {
    +			var chart;
    +			$.ajax({
    +				type : "POST",
    +				url : "reportDemoController.do?studentCount&reportType=column",
    +				success : function(jsondata) {
    +					
    +					data = eval(jsondata);
    +					console.log(data);
    +					chart = new Highcharts.Chart({
    +						chart : {
    +							renderTo : 'containerCol',
    +							plotBackgroundColor : null,
    +							plotBorderWidth : null,
    +							plotShadow : false
    +						},
    +						title : {
    +							text : '<t:mutiLang langKey="class.student.count.analysis"/>-<b><t:mutiLang langKey="common.histogram"/></b>'
    +						},
    +						xAxis : {
    +							categories : [ '1鐝', '2鐝', '3鐝', '4鐝', '5鐝']
    +						},
    +						tooltip : {
    +							 percentageDecimals : 1,
    +							 formatter: function() {
    +            					return  '<b>'+this.point.name + '</b>:' +  Highcharts.numberFormat(this.percentage, 1) +'%';
    +         					}
    +
    +						},
    +						exporting:{ 
    +			                filename:'column',  
    +			                url:'${ctxPath}/reportDemoController.do?export'//
    +			            },
    +						plotOptions : {
    +							column : {
    +								allowPointSelect : true,
    +								cursor : 'pointer',
    +								showInLegend : true,
    +								dataLabels : {
    +									enabled : true,
    +									color : '#000000',
    +									connectorColor : '#000000',
    +									formatter : function() {
    +										return '<b>' + this.point.name + '</b>: ' +Highcharts.numberFormat(this.percentage, 1)+"%";
    +									}
    +								}
    +							}
    +						},
    +						series : data
    +					});
    +				}
    +			});
    +		});
    +	});
    +</script>
    +
    +
    +<script type="text/javascript">
    +	$(function() {
    +		$(document).ready(function() {
    +			var chart;
    +			$.ajax({
    +				type : "POST",
    +				url : "reportDemoController.do?studentCount&reportType=pie",
    +				success : function(jsondata) {
    +					data = eval(jsondata);
    +					chart = new Highcharts.Chart({
    +						chart : {
    +							renderTo : 'containerPie',
    +							plotBackgroundColor : null,
    +							plotBorderWidth : null,
    +							plotShadow : false
    +						},
    +						title : {
    +							text : '<t:mutiLang langKey="class.student.count.analysis"/>-<b><t:mutiLang langKey="common.pie.chart"/></b>'
    +						},
    +						xAxis : {
    +							categories : [ '1鐝', '2鐝', '3鐝', '4鐝', '5鐝']
    +						},
    +						tooltip : {
    +							shadow: false,
    +							percentageDecimals : 1,
    +							formatter: function() {
    +            					return  '<b>'+this.point.name + '</b>:' +  Highcharts.numberFormat(this.percentage, 1) +'%';
    +         					}
    +
    +						},
    +						exporting:{  
    +			                filename:'pie',  
    +			                 url:'${ctxPath}/reportDemoController.do?export'  
    +			            },  
    +						plotOptions : {
    +							pie : {
    +								allowPointSelect : true,
    +								cursor : 'pointer',
    +								showInLegend : true,
    +								dataLabels : {
    +									enabled : true,
    +									color : '#000000',
    +									connectorColor : '#000000',
    +									formatter : function() {
    +										return '<b>' + this.point.name + '</b>: ' + Highcharts.numberFormat(this.percentage, 1)+"%";
    +									}
    +								}
    +							}
    +						},
    +						series : data
    +					});
    +				}
    +			});
    +		});
    +	});
    +</script>
    +<span id="containerline" style="float: left; width: 30%; height: 60%"></span>
    +<span id="containerCol" style="float: left; width: 38%; height: 60%"></span>
    +<span id="containerPie" style="width: 30%; height: 60%"></span>
    +
    +<div style="width: 98%; height: 280px"><t:datagrid name="studentStatisticList" title="class.count.statistics" actionUrl="reportDemoController.do?listAllStatisticByJdbc" idField="id" fit="true">
    +	<t:dgCol title="common.code" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="lang.class" field="classname" width="130"></t:dgCol>
    +	<t:dgCol title="number.ofpeople" field="personcount" width="130"></t:dgCol>
    +	<t:dgCol title="common.proportion" field="rate" width="130"></t:dgCol>
    +</t:datagrid></div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/tabledemo.jsp b/src/main/webapp/webpage/jeecg/demo/base/tabledemo.jsp
    new file mode 100644
    index 00000000..67cd7ccf
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/tabledemo.jsp
    @@ -0,0 +1,48 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>DEMO娣诲姞</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<SCRIPT type="text/javascript">
    +  function test(data) {
    +	//alert(data.msg);
    +	$.messager.confirm('鎻愮ず淇℃伅', data.msg, function(r){
    +	document.location="demoController.do?demoList";
    +			});
    +		//closetab('TAB鏂瑰紡娣诲姞');
    +	}
    +  </SCRIPT>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="table" dialog="false" action="demoController.do?saveDemo" btnsub="btn" callback="test">
    +	<input type="hidden" name="id" id="id" value="${demo.id}">
    +	<table cellpadding="0" width="100%" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right" height="40" width="10%"><span class="filedzt">DEMO鍚嶇О锛</span></td>
    +			<td class="value" width="90%"><input name="demotitle" id="demotitle" value="${demo.demotitle}" datatype="s4-10" errormsg="4~10浣嶅瓧绗︿箣闂 !" checktip="4~10浣嶅瓧绗,涓斾笉涓虹┖"> <span
    +				class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right" height="40"><span class="filedzt"> DEMO鍦板潃锛</span></td>
    +			<td class="value"><input name="demourl" id="demourl" value="${demo.demourl}"></td>
    +		</tr>
    +		<tr>
    +			<td align="right" height="40"><span class="filedzt"> 涓婄骇DEMO锛</span></td>
    +			<td class="value"><t:comboTree url="demoController.do?pDemoList" name="TSDemo.id" id="pdemo" value="${demo.TSDemo.id }"></t:comboTree></td>
    +		</tr>
    +		<tr>
    +			<td align="right" height="40"><span class="filedzt"> 鎺掑簭锛</span></td>
    +			<td class="value"><input name="demoorder" id="demoorder" value="${demo.demoorder }" datatype="n" errormsg="蹇呴』鏁板瓧" checktip="搴忓垪鍙峰繀椤讳负鏁板瓧"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr height="40">
    +			<td class="upload" colspan="6"><a href="#" class="easyui-linkbutton" id="btn" iconCls="icon-ok">鎻愪氦</a> 
    +			<a href="#" class="easyui-linkbutton" id="btn_reset" iconCls="icon-back">閲嶇疆</a>
    +			<a href="javascript:history.go(-1)" class="easyui-linkbutton" id="btn_reset" iconCls="icon-back">杩斿洖</a>
    +			</td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/tabs/addbyTab.jsp b/src/main/webapp/webpage/jeecg/demo/base/tabs/addbyTab.jsp
    new file mode 100644
    index 00000000..e6a97be4
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/tabs/addbyTab.jsp
    @@ -0,0 +1,27 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<title>TABS</title>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:datagrid name="documentList" title="浠AB鏂瑰紡鎵撳紑娣诲姞椤甸潰" actionUrl="systemController.do?documentList&typecode=news" idField="id" fit="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="鏍囬" field="documentTitle" width="20"></t:dgCol>
    +	<t:dgCol title="鍒涘缓鏃堕棿" field="createdate"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +</t:datagrid>
    +<div id="documentListtb" style="padding: 5px; height: 25px">
    +<div style="float: left;"><a href="#" class="easyui-linkbutton" plain="true" icon="icon-add" onclick="add('寮瑰嚭妗嗘坊鍔','systemController.do?addNews')">寮瑰嚭妗嗘墦寮娣诲姞椤甸潰</a> <a href="#"
    +	class="easyui-linkbutton" plain="true" icon="icon-edit" onclick="addbytab()">TAB鏂瑰紡鎵撳紑娣诲姞椤甸潰</a></div>
    +</div>
    +</body>
    +<script type="text/javascript">
    + function addbytab(){
    +	addOneTab("娣诲姞鏂伴椈", "systemController.do?addNews");
    + }
    + 
    + </script>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/template/templateiframe.jsp b/src/main/webapp/webpage/jeecg/demo/base/template/templateiframe.jsp
    new file mode 100644
    index 00000000..35f6699e
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/template/templateiframe.jsp
    @@ -0,0 +1,4 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +
    +<iframe name="myMap" id="myMap" scrolling="no" frameborder="0" src="demoController.do?templateview&tempcode=user" style="width: 100%; height: 60%;"></iframe>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/template/templateview.jsp b/src/main/webapp/webpage/jeecg/demo/base/template/templateview.jsp
    new file mode 100644
    index 00000000..8786d426
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/template/templateview.jsp
    @@ -0,0 +1,99 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<style type="text/css">
    +.ke-icon-example1 {
    +	background-image: url(../themes/default/print.png);
    +	background-position: 0px -33px;
    +	width: 16px;
    +	height: 16px;
    +}
    +</style>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript" src="plug-in/kindeditor/kindeditor.js"></script>
    +<script type="text/javascript" src="plug-in/kindeditor/lang/zh_CN.js"></script>
    +<script type="text/javascript">
    +	var editor;
    +	KindEditor.ready(function(K) {
    +		editor = K.create('textarea[name="attachmentcontent"]', {
    +			filterMode : false,
    +			readonlyMode : true,
    +			toolbarLineHeight : 0,
    +			items : [],
    +			afterCreate : function() {
    +				var version = $.browser.version;
    +				if ($.browser.msie) {
    +					if (version == '9.0') {
    +						
    +						this.edit.setHeight((window.screen.height-400)); //璁剧疆楂樺害
    +
    +					}
    +					if (version == '6.0') {
    +						
    +						this.edit.setHeight((window.screen.height-500)); //璁剧疆楂樺害
    +					}
    +					if (version == '7.0') {
    +						this.edit.setHeight((window.screen.height-330)); //璁剧疆楂樺害
    +					} else {
    +						this.edit.setHeight((window.screen.height) * 67 / 100); //璁剧疆楂樺害
    +					}
    +
    +				}
    +				if ($.browser.webkit) {
    +					this.edit.setHeight((window.screen.height-220)); //璁剧疆楂樺害
    +				}
    +				if ($.browser.mozilla) {
    +					this.edit.setHeight((window.screen.height-280)); //璁剧疆楂樺害
    +				}
    +			}
    +		});
    +	});
    +<%--// 鑷畾涔夋彃浠 #1
    +	KindEditor.lang({
    +		example1 : '鎵撳嵃'
    +	});
    +	KindEditor.plugin('example1', function(K) {
    +		var self = this, name = 'example1';
    +		self.clickToolbar(name, function() {
    +			prn1_preview(self.html());
    +			if ('${attachmenttitle}' == '澶囨鐢宠琛') {
    +				var state = ${state};
    +				var printflag = ${printflag};
    +				if (printflag == 1 && state == 1) {
    +					document.location.href = "projectFilingController.do?appSucces";
    +				}
    +
    +			}
    +		});
    +	});--%>
    +	function print() {
    +		prn1_preview($('#attachmentcontent').val());
    +	}
    +</script>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<div class="datagrid-toolbar"><a href="#" class="easyui-linkbutton" plain="true" iconCls="icon-print" onclick="print();">鎵撳嵃</a></div>
    +<input type="hidden" name="id" value="${id}">
    +<input type="hidden" id="attachmenttitle" name="attachmenttitle" value="${attachmenttitle}">
    +<input type="hidden" id="infocode" name="infocode" value="${code}">
    +<textarea id="attachmentcontent" name="attachmentcontent" style="visibility: hidden; width: 100%; height: 100% px">
    +	    ${attachmentcontent}
    +	</textarea>
    +</body>
    +<script language="javascript" src="plug-in/lodop/LodopFuncs.js"></script>
    +<object id="LODOP_OB" classid="clsid:2105C259-1E0C-4534-8141-A753534CB4CA" width=0 height=0> <embed id="LODOP_EM" type="application/x-print-lodop" width=0 height=0
    +		pluginspage="plug-in/lodop/install_lodop32.exe"></embed> </object>
    +<script type="text/javascript">
    +	var LODOP; //澹版槑涓哄叏灞鍙橀噺 
    +	function prn1_preview(content) {
    +		CreateOneFormPage(content);
    +		LODOP.PREVIEW();
    +	};
    +	function CreateOneFormPage(content) {
    +		LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'));
    +		LODOP.ADD_PRINT_HTM("10mm", 34, "RightMargin:0.9cm", "BottomMargin:10mm", content);
    +	};
    +</script>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/upload/autoupload.jsp b/src/main/webapp/webpage/jeecg/demo/base/upload/autoupload.jsp
    new file mode 100644
    index 00000000..3ff32af4
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/upload/autoupload.jsp
    @@ -0,0 +1,43 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript">
    +
    +	function submitproject(r) {
    +		if (r.success) {
    +			window.top.$.messager.progress('close');
    +		}
    +	}
    +
    +	function showzj(type, no) {
    +		openwindow('鏌ョ湅', 'attachmentController.do?archivedocList&id=${tbCorpArchive.id}&type=' + type);
    +	}
    +</script>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid layout="table" dialog="false" formid="formobj" beforeSubmit="show" callback="submitproject" action="systemController.do?saveFiles">
    +	<input type="hidden" name="id" value="${demo.id }">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tbody>
    +			<tr>
    +				<td align="right" height="40" width="10%"><label class="Validform_label">鏂囦欢鏍囬锛</label></td>
    +				<td class="value" width="30%" colspan="2"><input name="documentTitle" id="documentTitle" datatype="s3-50" errormsg="鑼冨洿鍦3~50浣嶅瓧绗!"> <span class="Validform_checktip">鏍囬鍚嶇О鍦3~50浣嶅瓧绗,涓斾笉涓虹┖</span>
    +				</td>
    +			</tr>
    +			<tr>
    +				<td align="right"><label class="Validform_label">涓婁紶鏂囦欢:</label></td>
    +				<td class="value"><t:upload name="instruction" dialog="false" queueID="instructionfile" view="true" auto="true" uploader="systemController.do?saveFiles" extend="pic" id="instruction"
    +					formData="documentTitle"></t:upload></td>
    +			</tr>
    +			<tr>
    +				<td colspan="2" id="instructionfile" class="value"></td>
    +			</tr>
    +		</tbody>
    +	</table>
    +</t:formvalid>
    +</body>
    +</html>
    +
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/upload/defaultupload.jsp b/src/main/webapp/webpage/jeecg/demo/base/upload/defaultupload.jsp
    new file mode 100644
    index 00000000..f2996117
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/upload/defaultupload.jsp
    @@ -0,0 +1,37 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<SCRIPT type="text/javascript">
    + function openrcon() {
    +  tip('涓婁紶瀹屾瘯,鎴戞槸鍥炶皟鍑芥暟');
    + }
    +</SCRIPT>
    +</head>
    +<body>
    +
    +<t:formvalid formid="formobj" dialog="false" layout="table" beforeSubmit="upload">
    +	<table cellpadding="0" width="100%" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right" height="40" width="10%"><label class="Validform_label">鏂囦欢鏍囬锛</label></td>
    +			<td class="value" width="30%" colspan="2"><input name="documentTitle" id="documentTitle" datatype="s3-50" errormsg="鑼冨洿鍦3~50浣嶅瓧绗!"> <span class="Validform_checktip">鏍囬鍚嶇О鍦3~50浣嶅瓧绗,涓斾笉涓虹┖</span>
    +			</td>
    +		</tr>
    +		<tr>
    +			<td align="right" height="40"><label class="Validform_label">閫夋嫨鏂囦欢锛</label></td>
    +			<td class="value" width="30%"><t:upload name="fiels" buttonText="涓婁紶鏂囦欢" dialog="false" callback="openrcon" uploader="systemController.do?saveFiles" extend="office" id="default"
    +				formData="documentTitle"></t:upload></td>
    +			<td class="value" id="test"></td>
    +		</tr>
    +		<tr height="40">
    +			<td class="upload" colspan="6"><a href="#" class="easyui-linkbutton" id="btn_sub" iconCls="icon-ok">涓婁紶</a> <a href="#" class="easyui-linkbutton" id="btn_reset" iconCls="icon-back">閲嶇疆</a> <a
    +				href="systemController.do?downloadFiles&path=plug-in/login/images/toplogo-main.png" class="easyui-linkbutton" id="btn_sub" iconCls="icon-ok" callback="openrcon">涓嬭浇</a></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +
    +</body>
    +</html>
    +
    diff --git a/src/main/webapp/webpage/jeecg/demo/base/upload/uploadTabs.jsp b/src/main/webapp/webpage/jeecg/demo/base/upload/uploadTabs.jsp
    new file mode 100644
    index 00000000..aabdba02
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/base/upload/uploadTabs.jsp
    @@ -0,0 +1,7 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:tabs id="tt" iframe="false" tabPosition="bottom">
    +	<t:tab iframe="demoController.do?autoupload&turn=upload/autoupload" icon="icon-search" title="鑷姩涓婁紶" id="auto"></t:tab>
    +	<t:tab iframe="demoController.do?autoupload&turn=upload/defaultupload" icon="icon-search" title="鏅氫笂浼犱笅杞" id="default"></t:tab>
    +</t:tabs>
    +
    diff --git a/src/main/webapp/webpage/jeecg/demo/jeecgDemo/cgformMigrateInclude.jsp b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/cgformMigrateInclude.jsp
    new file mode 100644
    index 00000000..9747c055
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/cgformMigrateInclude.jsp
    @@ -0,0 +1,17 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>SQL瀵煎叆</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" beforeSubmit="upload">
    +	<fieldset class="step">
    +	<div class="form"><t:upload name="fiels" buttonText="閫夋嫨瑕佸鍏ョ殑鏂囦欢" uploader="transdata.do?doMigrateIn" extend="*.zip" id="file_upload" formData="documentTitle"></t:upload></div>
    +	<div class="form" id="filediv" style="height: 50px"></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/demo/jeecgDemo/ckeditor.jsp b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/ckeditor.jsp
    new file mode 100644
    index 00000000..80a69914
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/ckeditor.jsp
    @@ -0,0 +1,25 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<t:base type="ckeditor,jquery,easyui,tools"></t:base>
    +<script type="text/javascript">
    +	 function goForm() {
    +		 $('#myCkeditorForm').form('submit', {
    +				url : "jeecgDemoController.do?saveCkeditor",
    +				dataType:"json",
    +				success : function(data) {
    +					var mydata = eval("("+data+")");
    +					alert(mydata.msg);
    +				}
    +		});
    +     }
    +	</script>
    +</head>
    +
    +<form action="jeecgDemoController.do?saveCkeditor" method="post" id="myCkeditorForm"><input type="hidden" value="${cKEditorEntity.id}" name="id" /> <t:ckeditor name="contents" isfinder="false"
    +	type="width:1100,height:570" value="${contents}"></t:ckeditor>
    +<p><input type="button" value="鏇存柊" onclick="goForm();"></p>
    +</form>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemo-check.jsp b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemo-check.jsp
    new file mode 100644
    index 00000000..343d1f9f
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemo-check.jsp
    @@ -0,0 +1,19 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>瀹℃牳鎿嶄綔</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="jeecgDemoController.do?saveAuthor">
    +	<input id="id" name="id" type="hidden" value="${jeecgDemo.id }">
    +	<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right" width="15%" nowrap><label class="Validform_label"> 澶囨敞: </label></td>
    +			<td class="value" width="85%"><input id="content" class="inputxt" name="content" value="${jgDemo.content }" datatype="s2-10"> <span class="Validform_checktip">澶囨敞鑼冨洿鍦2~10浣嶅瓧绗</span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemo.jsp b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemo.jsp
    new file mode 100644
    index 00000000..80279378
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemo.jsp
    @@ -0,0 +1,67 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>DEMO绀轰緥</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="jeecgDemoController.do?save">
    +	<input id="id" name="id" type="hidden" value="${jgDemo.id }">
    +	<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable" id = "formtableId">
    +		<tr>
    +			<td align="right" width="15%" nowrap><label class="Validform_label"> 鐢ㄦ埛鍚: </label></td>
    +			<td class="value" width="85%"><c:if test="${jgDemo.id!=null }">
    +					     ${jgDemo.userName }
    +					     </c:if> <c:if test="${jgDemo.id==null }">
    +				<input id="userName" class="inputxt" name="userName" value="${jgDemo.userName }" datatype="*">
    +				<span class="Validform_checktip">鐢ㄦ埛鍚嶈寖鍥村湪2~10浣嶅瓧绗</span>
    +			</c:if></td>
    +		</tr>
    +		<tr id= "add_phnoe">
    +			<td align="right" nowrap><label class="Validform_label"> 鎵嬫満鍙风爜: </label></td>
    +			<td class="value"><input  class="inputxt" name="mobilePhone" value="${jgDemo.mobilePhone}" datatype="m" errormsg="鎵嬫満鍙风爜涓嶆纭!" ignore="ignore"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鍔炲叕鐢佃瘽: </label></td>
    +			<td class="value"><input class="inputxt" name="officePhone" value="${jgDemo.officePhone}" datatype="n" errormsg="鍔炲叕瀹ょ數璇濅笉姝g‘!" ignore="ignore"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 甯哥敤閭: </label></td>
    +			<td class="value"><input class="inputxt" name="email" value="${jgDemo.email}" datatype="e" errormsg="閭鏍煎紡涓嶆纭!" ignore="ignore"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 骞撮緞: </label></td>
    +			<td class="value"><input class="inputxt" name="age" value="${jgDemo.age}" datatype="n" errormsg="骞撮緞鏍煎紡涓嶆纭!" ignore="ignore"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 宸ヨ祫: </label></td>
    +			<td class="value"><input class="inputxt" name="salary" value="${jgDemo.salary}" datatype="d" errormsg="宸ヨ祫鏍煎紡涓嶆纭!" ignore="ignore"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鐢熸棩: </label></td>
    +			<td class="value"><input name="birthday" class="Wdate" onClick="WdatePicker()" style="width: 150px" value="<fmt:formatDate value='${jgDemo.birthday }' type="date" pattern="yyyy-MM-dd"/>"
    +				errormsg="鐢熸棩鏍煎紡涓嶆纭!" ignore="ignore"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鍒涘缓鏃ユ湡: </label></td>
    +			<td class="value"><input name="createDate" class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px"
    +				value="<fmt:formatDate value='${jgDemo.createDate }' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>" errormsg="鏃ユ湡鏍煎紡涓嶆纭!" ignore="ignore"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鎬у埆: </label></td>
    +			<td class="value"><t:dictSelect field="sex" typeGroupCode="sex" hasLabel="false" defaultVal="${jgDemo.sex}"></t:dictSelect> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 閮ㄩ棬: </label></td>
    +			<td class="value"><select id="depId" name="depId" datatype="*">
    +				<c:forEach items="${departList}" var="depart">
    +					<option value="${depart.id }" <c:if test="${depart.id==jgDemo.depId}">selected="selected"</c:if>>${depart.departname}</option>
    +				</c:forEach>
    +			</select> <span class="Validform_checktip">璇烽夋嫨閮ㄩ棬</span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +<t:authFilter name="formtableId"></t:authFilter>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemoList.jsp b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemoList.jsp
    new file mode 100644
    index 00000000..6d5dfee8
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemoList.jsp
    @@ -0,0 +1,86 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +<t:datagrid name="jeecgDemoList" title="DEMO绀轰緥鍒楄〃" autoLoadData="true" actionUrl="jeecgDemoController.do?datagrid" sortName="userName" fitColumns="true"
    +	idField="id" fit="true" queryMode="group" checkbox="true" queryBuilder="true">
    +	<%--   update-end--Author:tanghan  Date:20130713 for娣诲姞checkbox--%>
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="鐢ㄦ埛鍚" field="userName" query="true" frozenColumn="true"  width="120"></t:dgCol>
    +	<t:dgCol title="鐢佃瘽鍙风爜" sortable="false" field="mobilePhone" query="true"  width="120"></t:dgCol>
    +	<t:dgCol title="鍔炲叕鐢佃瘽" field="officePhone" width="120"></t:dgCol>
    +	<t:dgCol title="鍒涘缓鏃ユ湡" field="createDate" formatter="yyyy-MM-dd hh:mm:ss" query="true" queryMode="group" width="200"></t:dgCol>
    +	<t:dgCol title="閭" field="email" width="200"></t:dgCol>
    +	<t:dgCol title="骞撮緞" sortable="true" field="age" width="80"></t:dgCol>
    +	<t:dgCol title="宸ヨ祫" field="salary" width="120"></t:dgCol>
    +	<t:dgCol title="鐢熸棩" field="birthday" formatter="yyyy/MM/dd" hidden="true" width="120"></t:dgCol>
    +	<t:dgCol title="鎬у埆" sortable="true" field="sex" dictionary="sex" query="true" width="60"></t:dgCol>
    +	<t:dgCol title="鐘舵" field="status" replace="鏈鐞哶0,宸插鐞哶1" width="60" query="true"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="150"></t:dgCol>
    +	<%--update-end--Author:fangwenrong  Date:20150510 for锛氭坊鍔犲悇椤规樉绀洪暱搴︼紝瑙e喅鏄剧ず鎺掔増闂--%>
    +<!--	<t:dgFunOpt exp="status#eq#0" operationCode="szqm" funname="szqm(id)" title="瀹℃牳" />-->
    +	<t:dgDelOpt operationCode="del" title="鍒犻櫎" url="jeecgDemoController.do?del&id={id}" />
    +	<t:dgToolBar operationCode="add" title="褰曞叆" icon="icon-add" url="jeecgDemoController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar operationCode="mobileAdd" title="mobile褰曞叆" icon="icon-add" url="jeecgDemoController.do?addorupdatemobile" funname="addMobile"></t:dgToolBar>
    +	<t:dgToolBar operationCode="edit" title="缂栬緫" icon="icon-edit" url="jeecgDemoController.do?addorupdate" funname="update"></t:dgToolBar>
    +	<t:dgToolBar operationCode="edit" title="mobile缂栬緫" icon="icon-edit" url="jeecgDemoController.do?addorupdatemobile" funname="updateMobile"></t:dgToolBar>
    +	<t:dgToolBar operationCode="detail" title="鏌ョ湅" icon="icon-search" url="jeecgDemoController.do?addorupdate" funname="detail"></t:dgToolBar>
    +	<t:dgToolBar operationCode="print" title="鎵撳嵃" icon="icon-print" url="jeecgDemoController.do?print" funname="detail"></t:dgToolBar>
    +	<t:dgToolBar title="鎵归噺鍒犻櫎" icon="icon-remove" url="jeecgDemoController.do?doDeleteALLSelect" funname="deleteALLSelect"></t:dgToolBar>
    +	<t:dgToolBar title="Xml瀵煎叆娴嬭瘯" icon="icon-put" url="transdata.do?doMigrateIn" funname="doMigrateIn"></t:dgToolBar>
    +	<t:dgToolBar title="xml瀵煎嚭娴嬭瘯" icon="icon-putout" url="transdata.do?doMigrateOut" funname="doMigrateOut"></t:dgToolBar>
    +	<t:dgToolBar  title="閲嶆柊鍔犺浇椤甸潰" icon="icon-print" url="#" funname="testReloadPage"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +<script type="text/javascript">
    +	function testReloadPage(){
    +		document.location = "http://www.baidu.com"; 
    +	}
    +	function szqm(id) {
    +		createwindow('瀹℃牳', 'jeecgDemoController.do?doCheck&id=' + id);
    +	}
    +	function getListSelections(){
    +		var ids = '';
    +		var rows = $("#jeecgDemoList").datagrid("getSelections");
    +		for(var i=0;i<rows.length;i++){
    +			ids+=rows[i].id;
    +			ids+=',';
    +		}
    +		ids = ids.substring(0,ids.length-1);
    +		return ids;
    +	}	
    +	//琛ㄥ崟 sql瀵煎嚭
    +	function doMigrateOut(title,url,id){
    +		url += '&ids='+ getListSelections();
    +		window.location.href= url;
    +	}
    +	function doMigrateIn(){
    +		openuploadwin('Xml瀵煎叆', 'transdata.do?toMigrate', "jeecgDemoList");
    +	}
    +	$(document).ready(function(){
    +		$("input[name='createDate_begin']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    +		$("input[name='createDate_end']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    +		$("input[name='birthday']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    +	});
    +
    +	function addMobile(title,addurl,gname,width,height){
    +		window.open(addurl);
    +	}
    +	
    +	function updateMobile(title,url, id,width,height){
    +		gridname=id;
    +		var rowsData = $('#'+id).datagrid('getSelections');
    +		if (!rowsData || rowsData.length==0) {
    +			tip('璇烽夋嫨缂栬緫椤圭洰');
    +			return;
    +		}
    +		if (rowsData.length>1) {
    +			tip('璇烽夋嫨涓鏉¤褰曞啀缂栬緫');
    +			return;
    +		}
    +		
    +		url += '&id='+rowsData[0].id;
    +		window.open(url);
    +	}
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemoList2.jsp b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemoList2.jsp
    new file mode 100644
    index 00000000..29411067
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemoList2.jsp
    @@ -0,0 +1,80 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +<t:datagrid name="jeecgDemoList2" title="DEMO鏌ヨ榛樿鍊" autoLoadData="true" actionUrl="jeecgDemoController.do?datagrid2&status=${status}" sortName="userName"
    +	idField="id" fit="true" queryMode="group" checkbox="true">
    +	<%--   update-end--Author:tanghan  Date:20130713 for娣诲姞checkbox--%>
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="鐢ㄦ埛鍚" field="userName" query="true" frozenColumn="true"  width="120"></t:dgCol>
    +	<t:dgCol title="鐢佃瘽鍙风爜" sortable="false" field="mobilePhone" query="true"  width="120"></t:dgCol>
    +	<t:dgCol title="鍔炲叕鐢佃瘽" field="officePhone" width="120"></t:dgCol>
    +	<t:dgCol title="鍒涘缓鏃ユ湡" field="createDate" formatter="yyyy-MM-dd hh:mm:ss" query="true" queryMode="group" width="200"></t:dgCol>
    +	<t:dgCol title="閭" field="email" width="200"></t:dgCol>
    +	<t:dgCol title="骞撮緞" sortable="true" field="age" width="80"></t:dgCol>
    +	<t:dgCol title="宸ヨ祫" field="salary" width="120"></t:dgCol>
    +	<t:dgCol title="鐢熸棩" field="birthday" formatter="yyyy/MM/dd" hidden="true" width="120"></t:dgCol>
    +	<t:dgCol title="鎬у埆" sortable="true" field="sex" dictionary="sex" query="true" width="60"></t:dgCol>
    +	<t:dgCol title="鐘舵" field="status" replace="鏈鐞哶0,宸插鐞哶1" width="60" query="true"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="150"></t:dgCol>
    +	<%--update-end--Author:fangwenrong  Date:20150510 for锛氭坊鍔犲悇椤规樉绀洪暱搴︼紝瑙e喅鏄剧ず鎺掔増闂--%>
    +<!--	<t:dgFunOpt exp="status#eq#0" operationCode="szqm" funname="szqm(id)" title="瀹℃牳" />-->
    +	<t:dgDelOpt operationCode="del" title="鍒犻櫎" url="jeecgDemoController.do?del&id={id}" />
    +	<t:dgToolBar operationCode="add" title="褰曞叆" icon="icon-add" url="jeecgDemoController.do?addorupdate" funname="add"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +<script type="text/javascript">
    +	function testReloadPage(){
    +		document.location = "http://www.baidu.com"; 
    +	}
    +	function szqm(id) {
    +		createwindow('瀹℃牳', 'jeecgDemoController.do?doCheck&id=' + id);
    +	}
    +	function getListSelections(){
    +		var ids = '';
    +		var rows = $("#jeecgDemoList").datagrid("getSelections");
    +		for(var i=0;i<rows.length;i++){
    +			ids+=rows[i].id;
    +			ids+=',';
    +		}
    +		ids = ids.substring(0,ids.length-1);
    +		return ids;
    +	}	
    +	//琛ㄥ崟 sql瀵煎嚭
    +	function doMigrateOut(title,url,id){
    +		url += '&ids='+ getListSelections();
    +		window.location.href= url;
    +	}
    +	function doMigrateIn(){
    +		openuploadwin('Xml瀵煎叆', 'transdata.do?toMigrate', "jeecgDemoList");
    +	}
    +	$(document).ready(function(){
    +		$("input[name='createDate_begin']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    +		$("input[name='createDate_end']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    +		$("input[name='birthday']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    +		//姝ゅ鐨勯粯璁ゅ煎彲浠ラ氳繃Controller涓紶杩囨潵,鍙互鍋氫竴涓猰ap,杩囨潵寰幆杩涜榛樿鍊艰瀹
    +		//$("*[name='createDate_begin']").val("2015-12-12");
    +		//$("*[name='sex']").val("${sex}");
    +		$("*[name='status']").val("${status}");
    +	});
    +	function addMobile(title,addurl,gname,width,height){
    +		window.open(addurl);
    +	}
    +	
    +	function updateMobile(title,url, id,width,height){
    +		gridname=id;
    +		var rowsData = $('#'+id).datagrid('getSelections');
    +		if (!rowsData || rowsData.length==0) {
    +			tip('璇烽夋嫨缂栬緫椤圭洰');
    +			return;
    +		}
    +		if (rowsData.length>1) {
    +			tip('璇烽夋嫨涓鏉¤褰曞啀缂栬緫');
    +			return;
    +		}
    +		
    +		url += '&id='+rowsData[0].id;
    +		window.open(url);
    +	}
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemoPrint.jsp b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemoPrint.jsp
    new file mode 100644
    index 00000000..606c69af
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemoPrint.jsp
    @@ -0,0 +1,73 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>DEMO绀轰緥</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<script type="text/javascript" src="<%=basePath%>/plug-in/jquery/jquery.jqprint.js"></script>
    +<script language="javascript">
    +function printall(){
    +	$(".printdiv").jqprint(); 
    +}
    +function printview(){
    +	document.all.WebBrowser1.ExecWB(7,1);
    +}
    +</script>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<div class="printdiv"><t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="jeecgDemoController.do?save">
    +	<input id="id" name="id" type="hidden" value="${jgDemo.id }">
    +	<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right" width="15%" nowrap><label class="Validform_label"> 鐢ㄦ埛鍚: </label></td>
    +			<td class="value" width="85%"><c:if test="${jgDemo.id!=null }">
    +					     ${jgDemo.userName }
    +					     </c:if> <c:if test="${jgDemo.id==null }">
    +				<input id="userName" class="inputxt" name="userName" value="${jgDemo.userName }" datatype="*">
    +				<span class="Validform_checktip">鐢ㄦ埛鍚嶈寖鍥村湪2~10浣嶅瓧绗</span>
    +			</c:if></td>
    +		</tr>
    +		<tr>
    +			<td align="right" nowrap><label class="Validform_label"> 鎵嬫満鍙风爜: </label></td>
    +			<td class="value">${jgDemo.mobilePhone}</td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鍔炲叕鐢佃瘽: </label></td>
    +			<td class="value">${jgDemo.officePhone}</td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 甯哥敤閭: </label></td>
    +			<td class="value">${jgDemo.email}</td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 骞撮緞: </label></td>
    +			<td class="value">${jgDemo.age}</td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 宸ヨ祫: </label></td>
    +			<td class="value">${jgDemo.salary}</td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鐢熸棩: </label></td>
    +			<td class="value">${jgDemo.birthday }</td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鍒涘缓鏃ユ湡: </label></td>
    +			<td class="value">${jgDemo.createDate }</td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鎬у埆: </label></td>
    +			<td class="value">${sex}</td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 閮ㄩ棬: </label></td>
    +			<td class="value"><c:forEach items="${departList}" var="depart">
    +				<c:if test="${depart.id==jgDemo.depId}">
    +			         ${depart.departname}</c:if>
    +			</c:forEach></td>
    +		</tr>
    +	</table>
    +</t:formvalid></div>
    +<a class="easyui-linkbutton" href="javascript:printall()">鎵撳嵃</a>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemomobile.jsp b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemomobile.jsp
    new file mode 100644
    index 00000000..7b0982f6
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/jeecgDemomobile.jsp
    @@ -0,0 +1,152 @@
    +<%@ page language="java" import="java.util.*"
    +	contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>DEMO绀轰緥</title>
    +<META name=viewport content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
    +<META name=apple-mobile-web-app-capable content=yes>
    +<META name=apple-mobile-web-app-status-bar-style content=white>
    +
    +<t:base type="jquery,tools,toptip"></t:base>
    +<link rel="stylesheet" href="plug-in/Validform/css/style.css" type="text/css"/>
    +<link rel="stylesheet" href="plug-in/Validform/css/tablefrom.css" type="text/css"/>
    +<script type="text/javascript" src="plug-in/Validform/js/Validform_v5.3.1_min_zh-cn.js"></script>
    +<script type="text/javascript" src="plug-in/Validform/js/Validform_Datatype_zh-cn.js"></script>
    +<script type="text/javascript" src="plug-in/Validform/js/datatype_zh-cn.js"></script>
    +<SCRIPT type="text/javascript" src="plug-in/Validform/plugin/passwordStrength/passwordStrength-min.js"></SCRIPT>
    +
    +<link rel="stylesheet" href="plug-in/jmobile/css/style.css">
    +<link rel="stylesheet" href="plug-in/jmobile/css/jquery-ui.css">
    +<script type="text/javascript" src="plug-in/jmobile/js/jquery-ui.js"></SCRIPT>
    +<STYLE type=text/css>
    +	.btn_wrap BUTTON {
    +		WIDTH: 30%
    +	}
    +</STYLE>
    +
    +</head>
    +<body style="overflow-y: auto" scroll="auto">
    +	<form id="formobj" action="jeecgDemoController.do?save" name="formobj" method="post">
    +		<input type="hidden" id="btn_sub" class="btn_sub">
    +		<input id="id" name="id" type="hidden" value="${jgDemo.id }">
    +		<div id=container class=wrapper>
    +			<div class=box>
    +				<h3>
    +					DEMO绀轰緥
    +				</h3>
    +				<div class="box_map order_wrap">
    +					<label for="userName">
    +						鐢ㄦ埛鍚
    +					</label>
    +					<input id="userName" class="form-control" type="text" name="userName" datatype="*" value="${jgDemo.userName }">
    +				</div>
    +				<div class="box_map order_wrap">
    +					<label for=name>
    +						鎵嬫満鍙风爜
    +					</label>
    +					<input id="mobilePhone" class="form-control" type="text" name="mobilePhone" datatype="m" errormsg="鎵嬫満鍙风爜涓嶆纭!" value="${jgDemo.mobilePhone}">
    +				</div>
    +				<div class="box_map order_wrap">
    +					<label for=name>
    +						鍔炲叕鐢佃瘽
    +					</label>
    +					<input id="officePhone" class="form-control" type="text" name="officePhone" value="${jgDemo.officePhone}">
    +				</div>
    +				<div class="box_map order_wrap">
    +					<label for=name>
    +						甯哥敤閭
    +					</label>
    +					<input id="email" class="form-control" type="text" name="email" datatype="e" errormsg="閭鏍煎紡涓嶆纭!" value="${jgDemo.email}">
    +				</div>
    +				<div class="box_map order_wrap">
    +					<label for=name>
    +						骞撮緞
    +					</label>
    +					<input id="age" class="form-control" type="text" name="age" datatype="n" errormsg="骞撮緞鏍煎紡涓嶆纭!" value="${jgDemo.age}">
    +				</div>
    +				<div class="box_map order_wrap">
    +					<label for=name>
    +						宸ヨ祫
    +					</label>
    +					<input id="salary" class="form-control" type="text" name="salary" datatype="d" errormsg="宸ヨ祫鏍煎紡涓嶆纭!" value="${jgDemo.salary}">
    +				</div>
    +				<div class="box_map order_wrap">
    +					<label for=name>
    +						鐢熸棩
    +					</label>
    +					<input id="birthday" class="form-control" readonly type="text" name="birthday" value="<fmt:formatDate value='${jgDemo.birthday }' type="date" pattern="yyyy-MM-dd"/>">
    +				</div>
    +				<div class="box_map order_wrap">
    +					<label for=name>
    +						鍒涘缓鏃ユ湡
    +					</label>
    +					<input id="createDate" readonly class="form-control" type="text" name="createDate"value="<fmt:formatDate value='${jgDemo.createDate }' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>" errormsg="鏃ユ湡鏍煎紡涓嶆纭!" >
    +				</div>
    +				<div class="box_map order_wrap">
    +					<label for=name>
    +						鎬у埆
    +					</label>
    +					<t:dictSelect field="sex" typeGroupCode="sex" hasLabel="false" defaultVal="${jgDemo.sex}"></t:dictSelect>
    +				</div>
    +				<div class="box_map order_wrap">
    +					<label for=name>
    +						閮ㄩ棬
    +					</label>
    +					<select id="depId" name="depId" datatype="*">
    +						<c:forEach items="${departList}" var="depart">
    +							<option value="${depart.id }" <c:if test="${depart.id==jgDemo.depId}">selected="selected"</c:if>>${depart.departname}</option>
    +						</c:forEach>
    +					</select>
    +				</div>
    +				<div style="text-align: center;padding-bottom: 1px;" class="btn_wrap">
    +					<div  class="btn_wrap">
    +						<BUTTON class=btn_normal onclick="$('#btn_sub').click();" type=button>
    +							鎻愪氦
    +						</BUTTON>
    +						<BUTTON class=btn_normal type=reset>
    +							閲嶇疆
    +						</BUTTON>
    +					
    +					</div>
    +				</div>
    +		
    +			</div>
    +		</div>
    +		<script type="text/javascript">
    +			$(function() {
    +				$("#birthday").datepicker();
    +				$("#formobj")
    +						.Validform(
    +								{
    +									tiptype : 1,
    +									btnSubmit : "#btn_sub",
    +									btnReset : "#btn_reset",
    +									ajaxPost : true,
    +									callback : function(data) {
    +										
    +										if (data.success == true) {
    +											alert(data.msg);
    +										} else {
    +											if (data.responseText == '' || data.responseText == undefined) {
    +												alert(data.msg);
    +											} else {
    +												try {
    +													var emsg = data.responseText.substring(data.responseText.indexOf('閿欒鎻忚堪'),data.responseText.indexOf('閿欒淇℃伅'));
    +													alert(emsg);
    +												} catch (ex) {
    +													alert(data.responseText);
    +												}
    +											}
    +											return false;
    +										}
    +										window.open('', '_self');
    +										window.close();
    +									}
    +								});
    +			});
    +		</script>
    +	</form>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/jeecgDemo/popup.jsp b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/popup.jsp
    new file mode 100644
    index 00000000..74174c17
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/popup.jsp
    @@ -0,0 +1,29 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<html>
    +<head>
    +<title>Popup绀轰緥</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<div class="formDetails"><label>鐢ㄦ埛閫夋嫨锛 <input id="myText" readonly="readonly" type="text" class="searchbox-inputtext15" onclick="inputClick(this,'mobilephone','test');"> </label> <label>娓呯畻鏈
    +<input type="text" readonly="readonly" name="period" value="" id="add_period" maxlength="8" /> </label> <label>寮璐︿汉 <input type="text" readonly="readonly" name="billingInfo.billedCompany" value=""
    +	id="add_billedCompany" maxlength="8" /> </label> <label>琚紑璐︿汉 <input type="text" name="billingInfo.reverseBilledCompany" value="" id="add_reverseBilledCompany" maxlength="8"
    +	style="text-transform: uppercase;" onfocus="tips('add_reverseBilledCompany','琚紑璐﹀叕鍙告竻绠椾唬鐮,涓嶅彲涓虹┖')" onblur="outtips();numCodeExit(this)" /> </label> <label>璐﹀崟鍙 <input type="text"
    +	name="billingInfo.number" value="" maxlength="33" id="add_number" onfocus="tips('add_number','璐﹀崟鍙蜂笉鑳藉惈鏈夆-鈥濆瓧绗,涓嶅彲涓虹┖')" onblur="outtips();" /> </label> <label>璐﹀崟閲戦 <input type="text"
    +	name="billingInfo.amount" value="" maxlength="15" id="add_amount" onfocus="tips('add_amount','鏈澶氬綍鍏11浣嶆暣鏁帮紝2浣嶅皬鏁帮紝璐熸暟鐢ㄢ-鈥濊〃绀猴紝涓嶅彲涓虹┖')" onblur="outtips()" /> </label> <label>绫诲瀷 <select id="jformType"
    +	name="jformType" onchange="jformTypeChange();">
    +	<option value="1">鍗曡〃</option>
    +	<option value="2" selected="selected">涓昏〃</option>
    +	<option value="3">闄勮〃</option>
    +</select> </label> <label class="row">澶囨敞(涓嶅彲瓒呰繃150瀛) <textarea type="text" style="width: 90%;" rows="4" name="billingInfo.remark" value="" id="add_remark"></textarea> </label>
    +<div class="button-row">
    +<button name="button" onclick="addAdjustBill()" type="button">纭 瀹</button>
    +<button name="button" type="reset">娓 绌</button>
    +<button name="button" onclick="cancelAll()" type="button">鍏 闂</button>
    +</div>
    +
    +</div>
    +
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/jeecgDemo/queryBuilderDemo.jsp b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/queryBuilderDemo.jsp
    new file mode 100644
    index 00000000..ca961b13
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/queryBuilderDemo.jsp
    @@ -0,0 +1,379 @@
    +锘<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<script>
    +//鍘绘帀sysUtil.js涓畾涔夌殑鍘熼粯璁ゅ彸閿彍鍗
    +//$.fn.datagrid.defaults.onHeaderContextMenu =null;
    +//$.fn.treegrid.defaults.onHeaderContextMenu =null;
    +</script>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +<t:datagrid name="jeecgDemoList2" title="楂樼骇鏌ヨ绀轰緥"  actionUrl="jeecgDemoController.do?datagrid"
    +	idField="id" queryMode="group" checkbox="true" extendParams="headerContextMenu: [
    +                { text: '淇濆瓨鍒楀畾涔', iconCls: 'icon-save', disabled: false, handler: function () { saveHeader(); } },
    +                { text: '鑷畾涔夎彍鍗', iconCls: 'icon-reload', disabled: false, handler: function (e, field) { alert($.string.format('鎮ㄧ偣鍑讳簡{0}', field)); } }
    +            ],">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="鐢ㄦ埛鍚" field="userName" query="true" ></t:dgCol>
    +	<t:dgCol title="鐢佃瘽鍙风爜"  field="mobilePhone" query="true"></t:dgCol>
    +	<t:dgCol title="鍔炲叕鐢佃瘽" field="officePhone" query="true"></t:dgCol>
    +	<t:dgCol title="鍒涘缓鏃ユ湡" field="createDate" formatter="yyyy-MM-dd" query="true" queryMode="group"></t:dgCol>
    +	<t:dgCol title="閭" field="email" query="true"></t:dgCol>
    +	<t:dgCol title="骞撮緞" sortable="true" field="age" query="true"></t:dgCol>
    +	<t:dgCol title="宸ヨ祫" field="salary" query="true"></t:dgCol>
    +
    +	<t:dgCol title="鐢熸棩" field="birthday" formatter="yyyy/MM/dd" query="true"></t:dgCol>
    +	<t:dgToolBar operationCode="edit" title="褰曞叆" icon="icon-edit" url="jeecgDemoController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar operationCode="edit" title="缂栬緫" icon="icon-edit" url="jeecgDemoController.do?addorupdate" funname="update"></t:dgToolBar>
    +	<t:dgToolBar operationCode="add" title="楂樼骇鏌ヨ" icon="icon-search" funname="queryBuilder" ></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +<div style="position:relative;overflow:auto;">
    +	<div id="w" class="easyui-window" data-options="closed:true,title:'楂樼骇鏌ヨ鏋勯犲櫒'" style="width:600px;height:370px;padding:0px">
    +		<div class="easyui-layout" data-options="fit:true">
    +			<div data-options="region:'east',split:true" style="width:130px">
    +<div class="easyui-accordion" style="width:120px;height:300px;">
    +		<div title="鏌ヨ鍘嗗彶" data-options="iconCls:'icon-search'" style="padding:0px;">
    +			<ul id="tt" class="easyui-tree" data-options="onClick:function(node){//鍗曞嚮浜嬩欢  
    +       historyQuery( node.id);  
    +    },ondbClick: function(node){alert('s');
    +				$(this).tree('beginEdit',node.target);
    +			},onContextMenu: function(e,node){
    +				e.preventDefault();
    +				$(this).tree('select',node.target);
    +				$('#mmTree').menu('show',{
    +					left: e.pageX,
    +					top: e.pageY
    +				});
    +			},  
    +         onAfterEdit:function(node){  
    +            if(node.text!=''){ his[node.id].name=node.text; saveHistory();}
    +	}">
    +			</ul>
    +		</div>
    +</div></div>
    +			<div data-options="region:'center'" style="padding:0px;">
    +				<table id="tg" class="easyui-treegrid" title="鏌ヨ鏉′欢缂栬緫" style="width:450px;height:300px;"
    +			data-options="
    +				iconCls: 'icon-ok',
    +				rownumbers: true,
    +				animate: true,
    +				fitColumns: true,
    +				//url: 'sqlbuilder.json',//鍙互棰勫姞杞芥潯浠
    +				method: 'get',
    +				idField: 'id', autoEditing: true,          //璇ュ睘鎬у惎鐢ㄥ弻鍑昏鏃惰嚜瀹氬紑鍚琛岀殑缂栬緫鐘舵
    +                extEditing: false,           //璇ュ睘鎬у惎鐢ㄨ缂栬緫鐘舵佺殑 ExtEditing 椋庢牸鏁堟灉锛岃灞炴ч粯璁や负 true銆
    +                singleEditing: false ,
    +				treeField: 'field',toolbar:toolbar,onClickRow: function (e) {
    +                   $('#tg').treegrid('beginEdit',e);//'beginEdit鈥樻柟娉曞繀椤绘湁涓涓弬鏁
    +                }
    +			">
    +		<thead>
    +			<tr>
    +				<th data-options="field:'relation',width:19,formatter:function(value,row){
    +							return value=='and'?'骞朵笖':'鎴栬';
    +						},editor:{
    +							type:'combobox',
    +							options:{
    +								valueField:'relationId',
    +								textField:'relationName',
    +								data:  
    +								[  
    +								{'relationId':'and','relationName':'骞朵笖'},  
    +								{'relationId':'or','relationName':'鎴栬'}  
    +								],  
    +								required:true
    +							}}">鍏崇郴</th>
    +				<th data-options="field:'field',width:30,formatter:function(value,row){
    +								var data=  
    +								[  
    +								{'fieldId':'office_Phone','fieldName':'鍔炲叕鐢佃瘽'},
    +								{'fieldId':'user_name','fieldName':'鐢ㄦ埛鍚'},
    +								{'fieldId':'age','fieldName':'骞撮緞'},
    +								{'fieldId':'email','fieldName':'閭'},
    +								{'fieldId':'mobile_Phone','fieldName':'鎵嬫満鍙'}
    +								];
    +							for(var i=0;i<data.length;i++){
    +								if(value == data[i]['fieldId']){
    +									return data[i]['fieldName'];
    +								}
    +							}
    +							return value;
    +						},editor:{
    +							type:'combobox',
    +							options:{
    +								valueField:'fieldId',
    +								textField:'fieldName',
    +								data:  
    +								[  
    +								{'fieldId':'office_Phone','fieldName':'鍔炲叕鐢佃瘽'},
    +								{'fieldId':'user_name','fieldName':'鐢ㄦ埛鍚'},
    +								{'fieldId':'age','fieldName':'骞撮緞'},
    +								{'fieldId':'email','fieldName':'閭'},
    +								{'fieldId':'mobile_Phone','fieldName':'鎵嬫満鍙'}
    +								],  
    +								required:true
    +							}}">瀛楁</th>
    +				<th data-options="field:'condition',width:20,align:'right',formatter:function(value,row){
    +								var data=  
    +								[  
    +								{'conditionId':'=','conditionName':'绛変簬'},
    +								{'conditionId':'>','conditionName':'澶т簬'},
    +								{'conditionId':'<','conditionName':'灏忎簬'},
    +								{'conditionId':'like','conditionName':'鍖呭惈'},
    +								{'conditionId':'in','conditionName':'鍦ㄥ叾涓'}
    +								];
    +							for(var i=0;i<data.length;i++){
    +								if(value == data[i]['conditionId']){
    +									return data[i]['conditionName'];
    +								}
    +							}
    +							return value;
    +						},editor:{
    +							type:'combobox',
    +							options:{
    +								valueField:'conditionId',
    +								textField:'conditionName',	
    +							data:  
    +								[  
    +								{'conditionId':'=','conditionName':'绛変簬'},
    +								{'conditionId':'>','conditionName':'澶т簬'},
    +								{'conditionId':'<','conditionName':'灏忎簬'},
    +								{'conditionId':'like','conditionName':'鍖呭惈'},
    +								{'conditionId':'in','conditionName':'鍦ㄥ叾涓'}
    +								],  
    +								required:true
    +							}}">鏉′欢</th>
    +				<th data-options="field:'value',width:30,editor:'text'">鍊</th>
    +					<th data-options="field:'opt',width:30,formatter:function(value,row){
    +							return '<a  onclick=\'removeIt('+row.id+')\' >鍒犻櫎</a>';
    +						}">鎿嶄綔</th>
    +			</tr>
    +		</thead>
    +	</table>
    +	
    +			</div>
    +			<div data-options="region:'south',border:false" style="text-align:right;padding:5px 0 0;">
    +				<a class="easyui-linkbutton" data-options="iconCls:'icon-ok'" href="javascript:void(0)" onclick="javascript:queryBuilderSearch()">OK</a>
    +				<a class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" href="javascript:void(0)" onclick="javascript:$('#w').window('close')">Cancel</a>
    +			</div>
    +		</div>	
    +	</div>		
    +</div>
    +<div id="mm" class="easyui-menu" style="width:120px;">
    +		<div onclick="append()" data-options="iconCls:'icon-add'">娣诲姞</div>
    +		<div onclick="edit()" data-options="iconCls:'icon-edit'">缂栬緫</div>
    +		<div onclick="save()" data-options="iconCls:'icon-save'">淇濆瓨</div>
    +		<div onclick="removeIt()" data-options="iconCls:'icon-remove'">鍒犻櫎</div>
    +		<div class="menu-sep"></div>
    +		<div onclick="cancel()">鍙栨秷缂栬緫</div>
    +	</div>
    +<div id="mmTree" class="easyui-menu" style="width:100px;">
    +		<div onclick="editTree()" data-options="iconCls:'icon-edit'">缂栬緫</div>
    +		<div onclick="deleteTree()" data-options="iconCls:'icon-remove'">鍒犻櫎</div>
    +	</div>
    +	<script type="text/javascript">
    +		var toolbar = [{
    +			text:'',
    +			iconCls:'icon-add',
    +			handler:function(){append();}
    +		},{
    +			text:'',
    +			iconCls:'icon-edit',
    +			handler:function(){edit();}
    +		},{
    +			text:'',
    +			iconCls:'icon-remove',
    +			handler:function(){removeIt();}
    +		},'-',{
    +			text:'',
    +			iconCls:'icon-save',
    +			handler:function(){save();}
    +		}];
    +		function onContextMenu(e,row){
    +			e.preventDefault();
    +			$(this).treegrid('select', row.id);
    +			$('#mm').menu('show',{
    +				left: e.pageX,
    +				top: e.pageY
    +			});
    +		}
    +		var idIndex = 100;
    +		function append(){
    +			idIndex++;
    +			var node = $('#tg').treegrid('getSelected');
    +			$('#tg').treegrid('append',{
    +				data: [{
    +					id: idIndex,
    +					field: 'user_name',
    +					condition:'like',
    +					value: '%鐜%',
    +					relation: 'and'
    +				}]
    +			});
    +			$('#tg').treegrid('beginEdit',idIndex);
    +		}
    +		function removeIt( id){
    +var node = $('#tg').treegrid('getSelected');
    +if(id){
    +$('#tg').treegrid('remove', id);
    +}else if (node){
    +				$('#tg').treegrid('remove', node.id);
    +			}
    +			
    +			
    +		}
    +		function collapse(){
    +			var node = $('#tg').treegrid('getSelected');
    +			if (node){
    +				$('#tg').treegrid('collapse', node.id);
    +			}
    +		}
    +		function expand(){
    +			var node = $('#tg').treegrid('getSelected');
    +			if (node){
    +				$('#tg').treegrid('expand', node.id);
    +			}
    +		}
    +		var editingId;
    +		function edit(){
    +			var row = $('#tg').treegrid('getSelected');
    +			if (row){
    +				editingId = row.id
    +				$('#tg').treegrid('beginEdit', editingId);
    +			}
    +		}
    +		function save(){
    +				var t = $('#tg');
    +				var nodes = t.treegrid('getRoots');
    +				for (var i = 0; i < nodes.length; i++) {
    +					t.treegrid('endEdit',nodes[i].id);
    +					}
    +
    +		}
    +		function cancel(){
    +			var nodes = t.treegrid('getRoots');
    +				for (var i = 0; i < nodes.length; i++) {
    +					t.treegrid('cancelEdit',nodes[i].id);
    +			}
    +		}
    +		var his=new Array();
    +	
    +
    +		function view(){
    +			save();
    +			var t = $('#tg');
    +			var data = t.treegrid('getData');
    +			return   JSON.stringify(data) ;
    +		}
    +	</script><script type="text/javascript" src="plug-in/jquery/jquery.cookie.js" ></script>
    +		<script type="text/javascript" src="plug-in/jquery-plugs/storage/jquery.storageapi.min.js" ></script>
    +
    +	<script type="text/javascript">
    +
    +	$(document).ready(function(){append();
    +		$("input[name='createDate_begin']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    +		$("input[name='createDate_end']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    +		$("input[name='birthday']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    +		storage=$.localStorage; 
    +		if(!storage)
    +			storage=$.cookieStorage;
    +		var h = storage.get('his');
    +		if(h){his=h;
    +			for(var i=0;i<his.length;i++){
    +				if(his[i])appendTree(i,his[i].name);
    +			}
    +  	 	}//restoreheader();
    +	});
    +
    +
    +function queryBuilder() {
    +	$('#w').window('open');
    +}
    +  function historyQuery(index) {
    +    	var data  = { rows:JSON.parse(his[index].json)};
    +   	 var t = $('#tg');
    +	var data = t.treegrid('loadData',data);
    +	$('#_sqlbuilder').val(his[index].json);   
    +	jeecgDemoList2search();
    +}
    + function queryBuilderSearch() {
    +         var json =  view();var t = $('#tg');
    +	$('#_sqlbuilder').val(json);   
    +	var isnew=true;
    +	for(var i=0;i<his.length;i++){
    +		if(his[i]&&his[i].json==json){
    +			isnew=false;
    +		}
    +	}
    +	if(isnew){
    +		his.push({name:'Query'+his.length,json:json});
    +		saveHistory();
    +		var name= 'Query'+(his.length-1);
    +		appendTree(his.length-1,name);
    +	}
    +
    +	jeecgDemoList2search();
    + }
    +//鏌ヨ鍘嗗彶鎿嶄綔
    +function saveHistory(){
    +	var history=new Array();
    +	for(var i=0;i<his.length;i++){
    +		if(his[i]){
    +			history.push(his[i]);
    +		}
    +	}
    +	storage.set( 'his',JSON.stringify(history));
    +}
    +function deleteTree(){
    +	var node = $('#tt').tree('getSelected');
    +	his[node.id]=null;saveHistory();
    +	$('#tt').tree('remove', node.target);
    +}
    +function editTree(){
    +	var node = $('#tt').tree('getSelected');
    +	$('#tt').tree('beginEdit',node.target);
    +		his[node.id].name=null;saveHistory();
    +}
    +function appendTree(id,name){
    +	$('#tt').tree('append',{
    +		data:[{
    +			id : id,
    +			text :name
    +		}]
    +         });
    +}
    +function saveHeader1(){
    +	var cols = storage.get( 'DemohiddenColumns');//alert(cols.length+cols);
    +	var init=true;
    +	if(cols){
    +		init =false;
    +	}
    + //var columnsFields =$('#jeecgDemoList2').datagrid('getColumnFields');
    + var columnsFields =$('#jeecgDemoList2').datagrid('getColumns');
    + var hiddencolumns = [],  columsDetail;
    +
    +   for (var i=0;i< columnsFields.length;i++) {i.hidable=true;
    +                      //  columsDetail = $('#jeecgDemoList2').datagrid("getColumnOption", columnsFields[i]);
    +			if(init&&columnsFields[i].hidden){
    +				hiddencolumns.push({field:columnsFields[i].field,hidden:columnsFields[i].hidden,visible:false});
    +			}else{hiddencolumns.push({field:columnsFields[i].field,hidden:columnsFields[i].hidden});
    +			}
    +   }//alert(JSON.stringify(hiddencolumns));
    +	storage.set( 'DemohiddenColumns',JSON.stringify(hiddencolumns));
    +}
    +function restoreheader1(){
    +	
    +	var cols = storage.get( 'DemohiddenColumns');//alert(cols.length+cols);
    +	if(!cols){
    +		return;
    +	}
    +	for(var i=0;i<cols.length;i++){
    +		try{
    +		if(cols.visible)$('#jeecgDemoList2').datagrid((cols[i].hidden==true?'hideColumn':'showColumn'),cols[i].field);
    +}catch(e){//alert(e+"-"+cols[i].field)
    +}
    +
    +	}
    +}
    +</script>
    diff --git a/src/main/webapp/webpage/jeecg/demo/jeecgDemo/selectUserList.jsp b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/selectUserList.jsp
    new file mode 100644
    index 00000000..2c3791c5
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/selectUserList.jsp
    @@ -0,0 +1,41 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<html>
    +<head>
    +<title>Popup绀轰緥</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<div class="easyui-layout" fit="true">
    +<div region="north" style="padding: 1px; height: 30px;"><span style="display: -moz-inline-box; display: inline-block;"> <span
    +	style="display: -moz-inline-box; display: inline-block; width: 80px; text-align: right;">鐢ㄦ埛鍚嶏細</span> <input type="text" style="width: 100px" id="userName"> </span> <span
    +	style="display: -moz-inline-box; display: inline-block;"> <span style="display: -moz-inline-box; display: inline-block; width: 80px; text-align: right;">閮ㄩ棬锛</span> <select style="width: 104px"
    +	width="100" id="TSDepart_departname">
    +	<option value="">---璇烽夋嫨---</option>
    +	<option value="150">淇℃伅閮</option>
    +	<option value="152">璁捐閮</option>
    +	<option value="297e5a493d9f2cbc013d9f4450530001">鐮斿彂瀹</option>
    +</select> </span> <span style="display: -moz-inline-box; display: inline-block;"> <span style="display: -moz-inline-box; display: inline-block; width: 80px; text-align: right;">鐪熷疄濮撳悕锛</span> <input type="text"
    +	style="width: 100px" id="realName"> </span> <span style="display: -moz-inline-box; display: inline-block;"> <input type="button" value="鏌ヨ" onclick="searchUserList();"> </span></div>
    +<div region="center" style="padding: 1px;"><t:datagrid name="userList" title="鐢ㄦ埛绠$悊" actionUrl="userController.do?datagrid" checkbox="true" fit="true" fitColumns="true" idField="id">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="鐢ㄦ埛鍚" sortable="false" field="userName" query="true"></t:dgCol>
    +	<t:dgCol title="閮ㄩ棬" field="TSDepart_departname" query="true" queryMode="single" replace="${departsReplace}"></t:dgCol>
    +	<t:dgCol title="鐪熷疄濮撳悕" field="realName" query="true"></t:dgCol>
    +	<t:dgCol title="鐘舵" sortable="true" field="status" replace="姝e父_1,绂佺敤_0,瓒呯骇绠$悊鍛榑-1"></t:dgCol>
    +</t:datagrid></div>
    +</div>
    +</body>
    +</html>
    +<script type="text/javascript">
    +	function searchUserList(){
    +		$('#userList').datagrid('reload',{
    +			userName: $("#userName").val(),
    +			TSDepart_departname: $("#TSDepart_departname").val(),
    +			realName:  $("#realName").val()
    +		});
    +	}
    +	function getSelectRows(){
    +		return $('#userList').datagrid('getChecked');
    +	}
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/jeecgDemo/styleList.jsp b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/styleList.jsp
    new file mode 100644
    index 00000000..24d4cccc
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/jeecgDemo/styleList.jsp
    @@ -0,0 +1,344 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
    +   "http://www.w3.org/TR/html4/strict.dtd">
    +
    +<html lang="en">
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    +<meta http-equiv="X-UA-Compatible" content="IE=9" > </meta>
    +<title>鑷畾涔夎〃鍗曟牱寮忕ず渚</title>
    +<style type="text/css">
    +body{
    +	margin:0px;
    +	font-family:Arial,"瀹嬩綋",Verdana,sans-serif;
    +	font-size:12px;
    +}
    +html,body {padding: 0;margin: 0; overflow-x:hidden; overflow-y:auto;}
    +dl,dd{margin:0px}
    +ul{
    +	list-style-type:none;
    +	margin:0px;
    +	padding:0px;
    +}
    +</style>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<link rel="stylesheet" href="plug-in/easyui/themes/main.css" />
    +
    +</head>
    +<body>
    + 
    +<script language="javascript"> 
    +$.fn.dialog.defaults.top=100;
    +//$.fn.combo.defaults.height=308;
    +/* $.fn.combo.defaults=$.extend({},$.fn.combo.defaults,{heihgt:28} } */
    +
    +
    +//鏃堕棿鍏叡getFormatDateByLong(value, "yyyy-MM-dd")
    +    Date.prototype.format = function (format) {  
    +        var o = {  
    +            "M+": this.getMonth() + 1,  
    +            "d+": this.getDate(),  
    +            "h+": this.getHours(),  
    +            "m+": this.getMinutes(),  
    +            "s+": this.getSeconds(),  
    +            "q+": Math.floor((this.getMonth() + 3) / 3),  
    +            "S": this.getMilliseconds()  
    +        };  
    +        if (/(y+)/.test(format)) {  
    +            format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));  
    +        }  
    +        for (var k in o) {  
    +            if (new RegExp("(" + k + ")").test(format)) {  
    +                format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));  
    +            }  
    +        }  
    +        return format;  
    +    };  
    +    function getFormatDateByLong(l, pattern) {  
    +        return getFormatDate(new Date(l*1000), pattern);  
    +    }     
    +    
    +    function getFormatDate(date, pattern) {  
    +        if (date == undefined) {  
    +            date = new Date();  
    +        }  
    +        if (pattern == undefined) {  
    +            pattern = "yyyy-MM-dd hh:mm:ss";  
    +        }  
    +        return date.format(pattern);  
    +    }
    +    
    +    function newTab(title,url){
    +    	parent.addTab1(title,url);
    +    }
    +    
    +    $.extend($.fn.validatebox.defaults.rules, {
    +        mobile: {
    +            validator: function (value, param) {
    +            	if(value==""){
    +            		return false;
    +            	}
    +                return /^0?(13[0-9]|15[012356789]|18[0236789]|14[57]|170)[0-9]{8}$/.test(value);
    +            },
    +            message: '鎵嬫満鍙风爜涓嶆纭'
    +        },
    +        tel: {
    +            validator: function (value, param) {
    +                return /^((\+86)?|\(\+86\)|\+86\s)0?([1-9]\d-?\d{6,8}|[3-9][13579]\d-?\d{6,7}|[3-9][24680]\d{2}-?\d{6})(-\d{3})?$/.test(value);
    +            },
    +            message: '鍥哄畾鐢佃瘽鍙风爜涓嶆纭'
    +        },
    +        money:{
    +        	validator: function (value, param) {
    +                return /^(([1-9]\d*)|\d)(\.\d{1,2})?$/.test(value);
    +            },
    +            message: '鍙兘涓烘诞鐐规暟骞朵笖涓嶈兘涓虹┖'
    +        }
    +    });
    +    
    +    
    +	var isScroll = function (el) {  
    +	    // test targets  
    +	    var elems = el ? [el] : [document.documentElement, document.body];  
    +	    var scrollX = false, scrollY = false;  
    +	    for (var i = 0; i < elems.length; i++) {  
    +	        var o = elems[i];  
    +	        // test horizontal  
    +	        var sl = o.scrollLeft;  
    +	        o.scrollLeft += (sl > 0) ? -1 : 1;  
    +	        o.scrollLeft !== sl && (scrollX = scrollX || true);  
    +	        o.scrollLeft = sl;  
    +	        // test vertical  
    +	        var st = o.scrollTop;  
    +	        o.scrollTop += (st > 0) ? -1 : 1;  
    +	        o.scrollTop !== st && (scrollY = scrollY || true);  
    +	        o.scrollTop = st;  
    +	    }  
    +	    // ret  
    +	    return {  
    +	        scrollX: scrollX,   
    +	        scrollY: scrollY  
    +	    };  
    +	};  
    +	$(function(){
    +		resetBtn();
    +	}); 
    +	
    +	$(window).resize(function() {
    +		resetBtn();
    +	})
    +	
    +	function resetBtn(){
    +		 if(isScroll().scrollY){
    +		    	$(".buttonWrap").addClass("fixed");
    +		    }else{
    +		    	$(".buttonWrap").removeClass("fixed");
    +		    }
    +	}
    +
    +</script> 
    +
    +<div id="goodsSelectDiv"></div>
    +<div id="photoDiv"></div><style>
    +.input_text{
    +	width: 150px;
    +}
    +</style>
    +<div id="loading"></div>
    +<div class="main">
    +	<form id="mutiLangListtb">
    +		<div class='buttonArea'>
    +			<div style="float:left;">
    +			<!-- <a href="javascript:void(0)" class="easyui-linkbutton"
    +				data-options="plain:true" onclick="append()">娣诲姞</a> -->
    +			<a href="javascript:void(0)" class="button " data-options="plain:true" onclick="doSubmit('mutiLangController.do?refreshCach','mutiLangList',null,null)" >鍒锋柊</a>
    +			</div>
    +			 <span style="float: right;height:28px;"> 
    +			 	<a href="javascript:void(0)" class="button b_fr" data-options="plain:true" id="aAdvanced" >楂樼骇鎼滅储</a>
    +			 	<a href="javascript:void(0)" class="button b_fr" id="search" data-options="plain:true" onclick="mutiLangListsearch()">鎼滅储</a>
    +				<input id="langContext" name="langContext" class="input_text b_fr mr5" type="text" value="" size="30" placeholder="璇疯緭鍏ユ悳绱㈠唴瀹"  />
    +			</span>
    +		</div>
    +
    +		<div  style="display: block;" class="searchAdvanced">
    +			<input id="Advanced" name="Advanced" type="hidden" value="0" />
    +			<table width="98%" border="0" cellspacing="0" cellpadding="8">
    +				<tr>
    +					<td width="70" align="right">璇█Key</td>
    +					<td><input type="text" value="" id="langKey" name="langKey" class="input_text">
    +					</td>
    +
    +					<td width="70" align="right"></td>
    +					<td>  </td>
    +
    +					<td width="70" align="right">璇█</td>
    +					<td><select name="langCode" id="langCode" class="inputSelect valid">
    +							<option value="">---鎵鏈---</option> 
    +								<option value="zh-cn">涓枃</option>
    +								<option value="en">鑻辨枃</option>
    +					</select></td>
    +
    +					<td width="70" align="right"></td>
    +					<td></td>
    +				</tr>
    +				<tr>
    +					<td width="70" align="right"></td>
    +					<td colspan="7" align="center"><a id="searchAdvance"
    +						class="button blueButton" onclick="mutiLangListsearch()"
    +						href="javascript:;">寮濮嬫悳绱</a></td>
    +				</tr>
    +			</table>
    +		</div>
    +
    +		<div class="clear height10"></div>
    +		<!-- 
    +		<div class="shadowBoxWhite tableDiv">
    +			<table class="easyui-datagrid"
    +				data-options="url:'json.json',pageList: [5,10,15,20],pageSize:10,fitColumns:'true',queryParams:{'complete':''}"
    +				pagination="true" width="width" id="orderdata" sortName="order_id" sortOrder="desc">
    +				<thead>
    +					<tr>
    +						<th data-options="field:'order_id',checkbox:true,width:100"></th>
    +						<th data-options="field:'sn',width:150" formatter="forsn">璁㈠崟鍙</th>
    +						<th data-options="field:'create_time',width:100,sortable:'true'" formatter="formatDate" >涓嬪崟鏃ユ湡</th>
    +						<th data-options="field:'sale_cmpl_time',width:100,sortable:'true'" formatter="formatDate">鍙戣揣鏃ユ湡</th>		
    +						<th data-options="field:'need_pay_money',width:100,sortable:'true'" formatter="forMoney">璁㈠崟鎬婚</th>
    +						<th data-options="field:'paymoney',width:100,sortable:'true'" formatter="forMoney">瀹炰粯閲戦</th>
    +						<th data-options="field:'ship_name',width:100">鏀惰揣浜</th>
    +						<th data-options="field:'status',width:100,sortable:'true'" formatter="forStruts">璁㈠崟鐘舵</th>
    +						<th data-options="field:'pay_status',width:100,sortable:'true'" formatter="forpay" >浠樻鐘舵</th>
    +						<th data-options="field:'ship_status',width:100,sortable:'true'" formatter="forship">鍙戣揣鐘舵</th>
    +						<th data-options="field:'shipping_type',width:100,sortable:'true'">閰嶉佹柟寮</th>
    +						<th data-options="field:'payment_name',width:100,sortable:'true'">鏀粯鏂瑰紡</th>
    +						<th data-options="field:'action',width:100" formatter="formatAction">鎿嶄綔</th>
    +					</tr>
    +				</thead>
    +			</table>
    +		</div> -->
    +		<div class="shadowBoxWhite tableDiv">
    +			<table class="easyui-datagrid"
    +				data-options="striped:true,url:'mutiLangController.do?datagrid&field=id,langKey,langContext,langCode',pageList: [5,10,15,20],pageSize:10,fitColumns:'true',queryParams:{'complete':''}"
    +				pagination="true" width="width" id="mutiLangList" sortName="id" sortOrder="desc">
    +				<thead>
    +					<tr>
    +						<th data-options="field:'id',checkbox:true,width:100"></th>
    +						<th data-options="field:'langKey',width:150" formatter="forsn" >璇█Key</th>
    +						<th data-options="field:'langContext',width:100,sortable:'true'"   >鍐呭</th>
    +						<th data-options="field:'langCode',width:100,sortable:'true'" formatter="forlang" >璇█</th>		
    +						<th data-options="field:'opt',width:100" formatter="formatAction" >鎿嶄綔</th>
    +					</tr>
    +				</thead>
    +			</table>
    +		</div>
    +	</form>
    +</div>
    +<script type="text/javascript">
    +	function forsn(value,row,index){
    +		var val="<a href='#' onclick=\"add('璇█缂栬緫','mutiLangController.do?addorupdate&load=detail&id="+row.id+"','mutiLangList',null,null)\">"+row.langKey+"</a>"
    +		return val;
    +	}
    +	function forMoney(value, row, index) {
    +		var val = "锟" + value;
    +		return val;
    +	}
    +	function formatDate(value,row,index){
    +		if(value==null||value==0){
    +			return "";
    +		}
    +		else{
    +			return getFormatDateByLong(value, "yyyy-MM-dd");
    +		}
    +		
    +	}
    +	
    +	
    +	//璇█缈昏瘧
    +	function forlang(value,row,index){
    +		var val;
    +		val = getType({"zh-cn":"涓枃","en":"鑻辨枃","jp":"鏃ユ枃"},value);
    +		return val;
    +	}
    +	
    +	
    +	
    +	function getType(exMap,value){
    +		var val;
    +		$.each(exMap,function(key,values){ 
    +		    if(value==key){
    +		    	val=values;
    +		    }
    +		});
    +		return val;
    +	}
    +	
    +	
    +	
    +	var buttons = $.extend([], $.fn.datebox.defaults.buttons);
    +	buttons.splice(1, 0, {
    +	text: '娓呯┖',
    +	handler: function(target){
    +		 $('#start_time').datebox('setValue',"");
    +	}
    +	});
    +	
    +	var e_buttons = $.extend([], $.fn.datebox.defaults.buttons);
    +	e_buttons.splice(1, 0, {
    +	text: '娓呯┖',
    +	handler: function(target){
    +		 $('#end_time').datebox('setValue',"");
    +	}
    +	});
    +    
    +    
    +function formatAction(value,row,index){
    +	var val="<a class='edit' title='鏌ョ湅' href='#' onclick=\"add('鏌ョ湅','mutiLangController.do?addorupdate&id="+row.id+"','mutiLangList',null,null)\" ></a>";
    +	return val;
    +		
    +	}
    +	
    +	$(function(){
    +		$(".searchAdvanced").hide();
    +		//楂樼骇鏌ヨ鎸夐挳
    +	    $("#aAdvanced").click(function () {
    +	        if ($("#Advanced").val() == "0") {
    +	            $("#Advanced").val(1);
    +	            $("#simpleSearch").hide();
    +	            //$("#aAdvanced").text("绠鍗曟悳绱")
    +	            $("#aAdvanced").addClass("searchAdvancedS");
    +	        } else {
    +	            $("#Advanced").val(0);
    +	            $("#simpleSearch").show();
    +	            //$("#aAdvanced").text("楂樼骇鎼滅储");
    +	            $("#aAdvanced").removeClass("searchAdvancedS");
    +	        }
    +	        $(".searchAdvanced").slideToggle("slow");
    +	    });
    +	})
    +	function mutiLangListsearch(){
    +		//var queryParams=$('#mutiLangList').datagrid('options').queryParams;
    +		$('#mutiLangListtb').find('*').each(function(){
    +			//queryParams[$(this).attr('name')]=$(this).val();
    +			});
    +		var langCode = $("#langCode").val();
    +		var langContext = $("#langContext").val();
    +		
    +		var langKey = $('#langKey').val();
    +		//$('#mutiLangList').datagrid({url:'mutiLangController.do?datagrid&field=id,langKey,langContext,langCode,',pageNumber:1});
    +		$("#mutiLangList").datagrid('load', {
    +			langKey:langKey,
    +			langContext:langContext,
    +			langCode:langCode,
    +			 page:1
    +	    });
    +	}
    +	
    +
    +	function formatTime(value,row,index){
    +		var val = getFormatDateByLong(value, "yyyy-MM-dd");
    +		return val;
    +	}
    +</script>
    +
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/notag/jeecgEasyUI.jsp b/src/main/webapp/webpage/jeecg/demo/notag/jeecgEasyUI.jsp
    new file mode 100644
    index 00000000..72c3a1cc
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/notag/jeecgEasyUI.jsp
    @@ -0,0 +1,111 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>椤甸潰涓嶇敤鑷畾涔夋爣绛惧疄鐜</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<form id="formobj" action="jeecgEasyUIController.do?save" name="formobj" method="post"><input type="hidden" id="btn_sub" class="btn_sub" /> <input id="id" name="id" type="hidden"
    +	value="${jeecgJdbcPage.id }">
    +<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +	<tr>
    +		<td align="right"><label class="Validform_label"> 骞撮緞: </label></td>
    +		<td class="value"><input class="inputxt" id="age" name="age" ignore="ignore" value="${jeecgJdbcPage.age}" datatype="n"> <span class="Validform_checktip"></span></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label"> 鐢熸棩: </label></td>
    +		<td class="value"><input class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px" id="birthday" name="birthday" ignore="ignore"
    +			value="<fmt:formatDate value='${jeecgJdbcPage.birthday}' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>"> <span class="Validform_checktip"></span></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label"> 鍒涘缓鏃堕棿: </label></td>
    +		<td class="value"><input class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px" id="createTime" name="createTime" ignore="ignore"
    +			value="<fmt:formatDate value='${jeecgJdbcPage.createTime}' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>"> <span class="Validform_checktip"></span></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label"> 閮ㄩ棬: </label></td>
    +		<td class="value"><select id="depId" name="depId" datatype="*">
    +			<c:forEach items="${departList}" var="depart">
    +				<option value="${depart.id }" ${depart.id==jeecgJdbcPage.depId?'selected':''}>${depart.departname}</option>
    +			</c:forEach>
    +		</select> <span class="Validform_checktip">璇烽夋嫨閮ㄩ棬</span></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label"> 閭: </label></td>
    +		<td class="value"><input class="inputxt" id="email" name="email" ignore="ignore" value="${jeecgJdbcPage.email}"> <span class="Validform_checktip"></span></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label"> 鎵嬫満: </label></td>
    +		<td class="value"><input class="inputxt" id="mobilePhone" name="mobilePhone" ignore="ignore" value="${jeecgJdbcPage.mobilePhone}"> <span class="Validform_checktip"></span></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label"> 鐢佃瘽: </label></td>
    +		<td class="value"><input class="inputxt" id="officePhone" name="officePhone" ignore="ignore" value="${jeecgJdbcPage.officePhone}"> <span class="Validform_checktip"></span></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label"> 宸ヨ祫: </label></td>
    +		<td class="value"><input class="inputxt" id="salary" name="salary" ignore="ignore" value="${jeecgJdbcPage.salary}" datatype="d"> <span class="Validform_checktip"></span></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label"> 鎬у埆: </label></td>
    +		<td class="value"><t:dictSelect field="sex" typeGroupCode="sex" hasLabel="false" defaultVal="${jeecgJdbcPage.sex}" type="radio"></t:dictSelect> <span class="Validform_checktip"></span></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label"> 鐢ㄦ埛鍚: </label></td>
    +		<td class="value"><input class="inputxt" id="userName" name="userName" value="${jeecgJdbcPage.userName}" datatype="*"> <span class="Validform_checktip"></span></td>
    +	</tr>
    +</table>
    +
    +<link rel="stylesheet" href="plug-in/Validform/css/style.css" type="text/css" />
    +<link rel="stylesheet" href="plug-in/Validform/css/tablefrom.css" type="text/css" />
    +<script type="text/javascript" src="plug-in/Validform/js/Validform_v5.3.1_min_zh-cn.js"></script> <script type="text/javascript" src="plug-in/Validform/js/Validform_Datatype_zh-cn.js"></script> <script
    +	type="text/javascript" src="plug-in/Validform/js/datatype_zh-cn.js"></script> <SCRIPT type="text/javascript" src="plug-in/Validform/plugin/passwordStrength/passwordStrength-min.js"></SCRIPT> <script
    +	type="text/javascript">
    +			$(function() {
    +				$("#formobj").Validform(
    +						{
    +							tiptype : 4,
    +							btnSubmit : "#btn_sub",
    +							btnReset : "#btn_reset",
    +							ajaxPost : true,
    +							usePlugin : {
    +								passwordstrength : {
    +									minLen : 6,
    +									maxLen : 18,
    +									trigger : function(obj, error) {
    +										if (error) {
    +											obj.parent().next().find(
    +													".Validform_checktip")
    +													.show();
    +											obj.find(".passwordStrength")
    +													.hide();
    +										} else {
    +											$(".passwordStrength").show();
    +											obj.parent().next().find(
    +													".Validform_checktip")
    +													.hide();
    +										}
    +									}
    +								}
    +							},
    +							callback : function(data) {
    +								var win = frameElement.api.opener;
    +								if (data.success == true) {
    +									frameElement.api.close();
    +									win.tip(data.msg);
    +								} else {
    +									if (data.responseText == ''
    +											|| data.responseText == undefined)
    +										$("#formobj").html(data.msg);
    +									else
    +										$("#formobj").html(data.responseText);
    +									return false;
    +								}
    +								win.reloadTable();
    +							}
    +						});
    +			});
    +		</script></form>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/notag/jeecgEasyUIList.jsp b/src/main/webapp/webpage/jeecg/demo/notag/jeecgEasyUIList.jsp
    new file mode 100644
    index 00000000..c7fc1b5e
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/notag/jeecgEasyUIList.jsp
    @@ -0,0 +1,111 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +<table id="jeecgEasyUIList" style="width: 700px; height: 300px">
    +	<thead>
    +		<tr>
    +			<th field="id" hidden="hidden">缂栧彿</th>
    +			<th field="userName" width="50">濮撳悕</th>
    +			<th field="depId" width="50" replace="${departsReplace}">閮ㄩ棬</th>
    +			<th field="sex" width="50">鎬у埆</th>
    +			<th field="age" width="50">骞撮緞</th>
    +			<th field="birthday" width="50">鐢熸棩</th>
    +			<th field="email" width="50">E-Mail</th>
    +			<th field="mobilePhone" width="50">鎵嬫満</th>
    +			<th field="opt" width="100">鎿嶄綔</th>
    +		</tr>
    +	</thead>
    +</table>
    +<div id="tb2" style="height: 30px;" class="datagrid-toolbar"><span style="float: left;"> 
    +<a href="#" id='add' class="easyui-linkbutton" plain="true" icon="icon-add"
    +	onclick="add('褰曞叆','jeecgEasyUIController.do?addorupdate','jeecgEasyUIList')" id="">褰曞叆</a> 
    +	<a href="#" class="easyui-linkbutton" plain="true" icon="icon-edit"
    +	onclick="update('缂栬緫','jeecgEasyUIController.do?addorupdate','jeecgEasyUIList')" id="">缂栬緫</a> 
    +	<a href="#" class="easyui-linkbutton" plain="true" icon="icon-search"
    +	onclick="detail('鏌ョ湅','jeecgEasyUIController.do?addorupdate','jeecgEasyUIList')" id="">鏌ョ湅</a> </span> 
    +	<span style="float: right"> <input id="jeecgEasyUIListsearchbox" class="easyui-searchbox"
    +	data-options="searcher:jeecgEasyUIListsearchbox,prompt:'璇疯緭鍏ュ叧閿瓧',menu:'#jeecgEasyUIListmm'"></input>
    +<div id="jeecgEasyUIListmm" style="width: 120px">
    +<div data-options="name:'userName',iconCls:'icon-ok'">濮撳悕</div>
    +<div data-options="name:'mobilePhone',iconCls:'icon-ok'">鎵嬫満</div>
    +</div>
    +</span></div>
    +<script type="text/javascript">
    +	    // 缂栬緫鍒濆鍖栨暟鎹
    +		function getData(data){
    +			var rows = [];			
    +			var total = data.total;
    +			for(var i=0; i<data.rows.length; i++){
    +				rows.push({
    +					id: data.rows[i].id,
    +					userName: data.rows[i].userName,
    +					depId: data.rows[i].depId,
    +					sex: data.rows[i].sex,
    +					age: data.rows[i].age,
    +					birthday: data.rows[i].birthday,
    +					email: data.rows[i].email,
    +					mobilePhone: data.rows[i].mobilePhone,
    +					opt: "[<a href=\"#\" onclick=\"delObj('jeecgEasyUIController.do?del&id="+data.rows[i].id+"','jeecgEasyUIList')\">鍒犻櫎</a>]"
    +				});
    +			}
    +			var newData={"total":total,"rows":rows};
    +			return newData;
    +		}
    +	    // 绛涢
    +		function jeecgEasyUIListsearchbox(value,name){
    +    		var queryParams=$('#jeecgEasyUIList').datagrid('options').queryParams;
    +    		queryParams[name]=value;
    +    		queryParams.searchfield=name;
    +    		$('#jeecgEasyUIList').datagrid('load');
    +    	}
    +	    // 鍒锋柊
    +	    function reloadTable(){
    +	    	$('#jeecgEasyUIList').datagrid('reload');
    +	    }
    +	    
    +		// 璁剧疆datagrid灞炴
    +		$('#jeecgEasyUIList').datagrid({
    +			title: '椤甸潰涓嶇敤鑷畾涔夋爣绛',
    +	        idField: 'id',
    +	        fit:true,
    +	        loadMsg: '鏁版嵁鍔犺浇涓...',
    +	        pageSize: 10,
    +	        pagination:true,
    +	        sortOrder:'asc',
    +	        rownumbers:true,
    +	        singleSelect:true,
    +	        fitColumns:true,
    +	        showFooter:true,
    +	        url:'jeecgEasyUIController.do?datagrid',  
    +	        toolbar: '#tb2',
    +	        loadFilter: function(data){
    +	        	return getData(data);
    +	    	}
    +	        
    +	    }); 
    +	    //璁剧疆鍒嗛〉鎺т欢  
    +	    $('#jeecgEasyUIList').datagrid('getPager').pagination({  
    +	        pageSize: 10,  
    +	        pageList: [10,20,30],  
    +	        beforePageText: '',  
    +	        afterPageText: '/{pages}',
    +	        displayMsg: '{from}-{to}鍏眥total}鏉',
    +	        showPageList:true,
    +	        showRefresh:true,
    +	        onBeforeRefresh:function(pageNumber, pageSize){
    +	            $(this).pagination('loading');
    +	            $(this).pagination('loaded');
    +	        }
    +	    });
    +	    // 璁剧疆绛涢
    +    	$('#jeecgEasyUIListsearchbox').searchbox({
    +    		searcher:function(value,name){
    +    			jeecgEasyUIListsearchbox(value,name);
    +    		},
    +    		menu:'#jeecgEasyUIListmm',
    +    		prompt:'璇疯緭鍏ユ煡璇㈠叧閿瓧'
    +    	});
    +	</script></div>
    +</div>
    diff --git a/src/main/webapp/webpage/jeecg/demo/notag/jeecgOrderMainListNoTag.jsp b/src/main/webapp/webpage/jeecg/demo/notag/jeecgOrderMainListNoTag.jsp
    new file mode 100644
    index 00000000..74df2040
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/notag/jeecgOrderMainListNoTag.jsp
    @@ -0,0 +1,197 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<script type="text/javascript">
    +	$(function() {
    +		$('#jeecgOrderMainListNoTag').datagrid({
    +			idField : 'id',
    +			title : '璁㈠崟淇℃伅(椤甸潰鏈敤鑷畾涔夋爣绛)',
    +			url : 'jeecgOrderMainNoTagController.do?datagrid&field=id,goOrderCode,goderType,usertype,goContactName,goTelphone,goOrderCount,goAllPrice,goReturnPrice,goContent,',
    +			fit : true,
    +			loadMsg : '鏁版嵁鍔犺浇涓...',
    +			pageSize : 10,
    +			pagination : true,
    +			sortOrder : 'asc',
    +			rownumbers : true,
    +			singleSelect : true,
    +			fitColumns : true,
    +			showFooter : true,
    +			frozenColumns : [[{
    +				field : 'goOrderCode',
    +				title : '璁㈠崟鍙',
    +				sortable : true
    +			}]],
    +			columns : [[
    +				{
    +					field : 'id',
    +					title : '缂栧彿',
    +					hidden : true,
    +					sortable : true
    +				},
    +				{
    +					field : 'goderType',
    +					title : '璁㈠崟绫诲瀷',
    +					sortable : true,
    +					formatter : function(value, rec, index) {
    +						if (value == '1') {
    +							return '浼樿川璁㈠崟';
    +						}
    +						if (value == '2') {
    +							return '鏅氳鍗';
    +						} else {
    +							return value;
    +						}
    +					}
    +				},
    +				{
    +					field : 'usertype',
    +					title : '椤惧绫诲瀷 ',
    +					sortable : true,
    +					formatter : function(value, rec, index) {
    +						if (value == '1') {
    +							return '绛剧害瀹㈡埛';
    +						}
    +						if (value == '2') {
    +							return '鏅氬鎴';
    +						} else {
    +							return value;
    +						}
    +					}
    +				},
    +				{
    +					field : 'goContactName',
    +					title : '鑱旂郴浜',
    +					sortable : true
    +				},
    +				{
    +					field : 'goTelphone',
    +					title : '鎵嬫満',
    +					sortable : true
    +				},
    +				{
    +					field : 'goOrderCount',
    +					title : '璁㈠崟浜烘暟',
    +					sortable : true
    +				},
    +				{
    +					field : 'goAllPrice',
    +					title : '鎬讳环(涓嶅惈杩旀)',
    +					sortable : true
    +				},
    +				{
    +					field : 'goReturnPrice',
    +					title : '杩旀',
    +					sortable : true
    +				},
    +				{
    +					field : 'goContent',
    +					title : '澶囨敞',
    +					sortable : true
    +				},
    +				{
    +					field : 'opt',
    +					title : '鎿嶄綔',
    +					width : 100,
    +					formatter : function(value, rec, index) {
    +						if (!rec.id) {
    +							return '';
    +						}
    +						var href = '';
    +						href += "[<a href='#' onclick=delObj('jeecgOrderMainNoTagController.do?del&id="
    +								+ rec.id
    +								+ "','jeecgOrderMainListNoTag')>";
    +						href += "鍒犻櫎</a>]";
    +						return href;
    +					}
    +				}]],
    +			onLoadSuccess : function(data) {
    +				$("#jeecgOrderMainListNoTag").datagrid("clearSelections");
    +			},
    +			onClickRow : function(rowIndex, rowData) {
    +				rowid = rowData.id;
    +				gridname = 'jeecgOrderMainList';
    +			}
    +		});
    +		
    +		$('#jeecgOrderMainListNoTag').datagrid('getPager').pagination({
    +			beforePageText : '',
    +			afterPageText : '/{pages}',
    +			displayMsg : '{from}-{to}鍏眥total}鏉',
    +			showPageList : true,
    +			pageList : [ 10, 20, 30 ],
    +			showRefresh : true
    +		});
    +		
    +		$('#jeecgOrderMainListNoTag').datagrid('getPager').pagination({
    +			onBeforeRefresh : function(pageNumber, pageSize) {
    +				$(this).pagination('loading');
    +				$(this).pagination('loaded');
    +			}
    +		});
    +	});
    +	
    +	function reloadTable() {
    +		$('#' + gridname).datagrid('reload');
    +	}
    +	function reloadjeecgOrderMainList() {
    +		$('#jeecgOrderMainListNoTag').datagrid('reload');
    +	}
    +	function getjeecgOrderMainListSelected(field) {
    +		return getSelected(field);
    +	}
    +	function getSelected(field) {
    +		var row = $('#' + gridname).datagrid('getSelected');
    +		if (row != null) {
    +			value = row[field];
    +		} else {
    +			value = '';
    +		}
    +		return value;
    +	}
    +	function getjeecgOrderMainListSelections(field) {
    +		var ids = [];
    +		var rows = $('#jeecgOrderMainListNoTag').datagrid('getSelections');
    +		for ( var i = 0; i < rows.length; i++) {
    +			ids.push(rows[i][field]);
    +		}
    +		ids.join(',');
    +		return ids;
    +	};
    +	function jeecgOrderMainListsearch() {
    +		var queryParams = $('#jeecgOrderMainListNoTag').datagrid('options').queryParams;
    +		$('#jeecgOrderMainListNoTagtb').find('*').each(function() {
    +			queryParams[$(this).attr('name')] = $(this).val();
    +		});
    +		$('#jeecgOrderMainListNoTag').datagrid({
    +			url : 'jeecgOrderMainNoTagController.do?datagrid&field=id,goOrderCode,goderType,usertype,goContactName,goTelphone,goOrderCount,goAllPrice,goReturnPrice,goContent,'
    +		});
    +	}
    +	function dosearch(params) {
    +		var jsonparams = $.parseJSON(params);
    +		$('#jeecgOrderMainListNoTag').datagrid({
    +			url : 'jeecgOrderMainNoTagController.do?datagrid&field=id,goOrderCode,goderType,usertype,goContactName,goTelphone,goOrderCount,goAllPrice,goReturnPrice,goContent,',
    +			queryParams : jsonparams
    +		});
    +	}
    +	function jeecgOrderMainListsearchbox(value, name) {
    +		var queryParams = $('#jeecgOrderMainListNoTag').datagrid('options').queryParams;
    +		queryParams[name] = value;
    +		queryParams.searchfield = name;
    +		$('#jeecgOrderMainList').datagrid('reload');
    +	}
    +	$('#jeecgOrderMainListsearchbox').searchbox({
    +		searcher : function(value, name) {jeecgOrderMainListsearchbox(value, name);},
    +		menu : '#jeecgOrderMainListmm',
    +		prompt : '璇疯緭鍏ユ煡璇㈠叧閿瓧'
    +	});
    +	function searchReset(name) {
    +		$("#" + name + "tb").find(":input").val("");
    +		jeecgOrderMainListsearch();
    +	}
    +</script>
    +<table width="100%" id="jeecgOrderMainListNoTag" toolbar="#jeecgOrderMainListNoTagtb"></table>
    +<div id="jeecgOrderMainListNoTagtb" style="padding: 3px; height: auto">
    +<div style="height: 30px;" class="datagrid-toolbar"><span style="float: left;"> <a href="#" class="easyui-linkbutton" plain="true" icon="icon-add"
    +	onclick="add('褰曞叆(鏃犳爣绛)','jeecgOrderMainNoTagController.do?addorupdateNoTag','jeecgOrderMainListNoTag',1000,400)">褰曞叆</a> <a href="#" class="easyui-linkbutton" plain="true" icon="icon-edit"
    +	onclick="update('缂栬緫(鏃犳爣绛)','jeecgOrderMainNoTagController.do?addorupdateNoTag','jeecgOrderMainListNoTag',1000,400)">缂栬緫</a> </span></div>
    +</div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/notag/jeecgOrderMainNoTag.jsp b/src/main/webapp/webpage/jeecg/demo/notag/jeecgOrderMainNoTag.jsp
    new file mode 100644
    index 00000000..9172ffc8
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/notag/jeecgOrderMainNoTag.jsp
    @@ -0,0 +1,279 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<%
    +String lang = (String)request.getSession().getAttribute("lang");
    +%>
    +
    +<html>
    +<head>
    +<title>璁㈠崟淇℃伅(鏃犳爣绛)</title>
    +<link id="easyuiTheme" rel="stylesheet" href="plug-in/easyui/themes/default/easyui.css" type="text/css" />
    +<link rel="stylesheet" href="plug-in/easyui/themes/icon.css" type="text/css" />
    +<link rel="stylesheet" type="text/css" href="plug-in/accordion/css/accordion.css">
    +<link rel="stylesheet" href="plug-in/Validform/css/style.css" type="text/css" />
    +<link rel="stylesheet" href="plug-in/Validform/css/tablefrom.css" type="text/css" />
    +<script type="text/javascript" src="plug-in/jquery/jquery-1.8.3.js"></script>
    +<script type="text/javascript" src="plug-in/tools/dataformat.js"></script>
    +<script type="text/javascript" src="plug-in/easyui/jquery.easyui.min.1.3.2.js"></script>
    +<script type="text/javascript" src="plug-in/easyui/locale/zh-cn.js"></script>
    +<script type="text/javascript" src="plug-in/tools/syUtil.js"></script>
    +<script type="text/javascript" src="plug-in/My97DatePicker/WdatePicker.js"></script>
    +<script type="text/javascript" src="plug-in/lhgDialog/lhgdialog.min.js"></script>
    +
    +<script type="text/javascript" src="plug-in/tools/curdtools_<%=lang%>.js"></script>
    +
    +<script type="text/javascript" src="plug-in/tools/easyuiextend.js"></script>
    +<script type="text/javascript" src="plug-in/Validform/js/Validform_v5.3.1_min_zh-cn.js"></script>
    +<script type="text/javascript" src="plug-in/Validform/js/Validform_Datatype_zh-cn.js"></script>
    +<script type="text/javascript" src="plug-in/Validform/js/datatype_zh-cn.js"></script>
    +<script type="text/javascript" src="plug-in/Validform/plugin/passwordStrength/passwordStrength-min.js"></script>
    +</head>
    +<script type="text/javascript">
    +	function resetTrNum(tableId) {
    +		$tbody = $("#" + tableId + "");
    +		$tbody.find('>tr').each(function(i){
    +			$(':input, select', this).each(function() {
    +				var $this = $(this), name = $this.attr('name'), val = $this.val();
    +				if (name != null) {
    +					if (name.indexOf("#index#") >= 0) {
    +						$this.attr("name",name.replace('#index#',i));
    +					} else {
    +						var s = name.indexOf("[");
    +						var e = name.indexOf("]");
    +						var new_name = name.substring(s + 1,e);
    +						$this.attr("name",name.replace(new_name,i));
    +					}
    +				}
    +			});
    +		});
    +	}
    +	
    +	$(function() {
    +		$("#formobj").Validform({
    +			tiptype : 1,
    +			btnSubmit : "#btn_sub",
    +			btnReset : "#btn_reset",
    +			ajaxPost : true,
    +			usePlugin : {
    +				passwordstrength : {
    +					minLen : 6,
    +					maxLen : 18,
    +					trigger : function(obj, error) {
    +						if (error) {
    +							obj.parent().next().find(".Validform_checktip").show();
    +							obj.find(".passwordStrength").hide();
    +						} else {
    +							$(".passwordStrength").show();
    +							obj.parent().next().find(".Validform_checktip").hide();
    +						}
    +					}
    +				}
    +			},
    +			callback : function(data) {
    +				var win = frameElement.api.opener;
    +				if (data.success == true) {
    +					frameElement.api.close();
    +					win.tip(data.msg);
    +					
    +				} else {
    +					if (data.responseText == ''|| data.responseText == undefined){
    +						$("#formobj").html(data.msg);
    +					}else{
    +						$("#formobj").html(data.responseText);
    +					}
    +					return false;
    +				}
    +				win.reloadTable();
    +			}
    +		});
    +		
    +		$('#addBtn').linkbutton({   
    +		    iconCls: 'icon-add'  
    +		});  
    +		$('#delBtn').linkbutton({   
    +		    iconCls: 'icon-remove'  
    +		}); 
    +		$('#addBtn').bind('click', function(){   
    +	 		 var tr =  $("#add_jeecgOrderProduct_table_template tr").clone();
    +		 	 $("#add_jeecgOrderProduct_table").append(tr);
    +		 	 resetTrNum('add_jeecgOrderProduct_table');
    +	    });  
    +		$('#delBtn').bind('click', function(){   
    +	       $("#add_jeecgOrderProduct_table").find("input:checked").parent().parent().remove();   
    +	        resetTrNum('add_jeecgOrderProduct_table');
    +	    });
    +		
    +		$('#addCustomBtn').linkbutton({   
    +		    iconCls: 'icon-add'  
    +		});  
    +		$('#delCustomBtn').linkbutton({   
    +		    iconCls: 'icon-remove'  
    +		}); 
    +		$('#addCustomBtn').bind('click', function(){   
    +	 		 var tr =  $("#add_jeecgOrderCustom_table_template tr").clone();
    +		 	 $("#add_jeecgOrderCustom_table").append(tr);
    +		 	 resetTrNum('add_jeecgOrderCustom_table');
    +	    });  
    +		$('#delCustomBtn').bind('click', function(){   
    +	      	$("#add_jeecgOrderCustom_table").find("input:checked").parent().parent().remove();   
    +	        resetTrNum('add_jeecgOrderCustom_table'); 
    +	    }); 
    +	});
    +</script>
    +<body>
    +<form id="formobj" action="jeecgOrderMainNoTagController.do?save" name="formobj" method="post"><input type="hidden" id="btn_sub" class="btn_sub" /> <input id="id" name="id" type="hidden"
    +	value="${jeecgOrderMainPage.id }">
    +<table cellpadding="0" cellspacing="1" class="formtable">
    +	<tr>
    +		<td align="right"><label class="Validform_label"> 璁㈠崟鍙:</label></td>
    +		<td class="value"><input class="inputxt" id="goOrderCode" name="goOrderCode" datatype="*" value="${jeecgOrderMainPage.goOrderCode}" /></td>
    +		<td align="right"><label class="Validform_label"> 璁㈠崟绫诲瀷:</label></td>
    +		<td class="value"><t:dictSelect field="goderType" typeGroupCode="order" hasLabel="false" defaultVal="${jeecgOrderMainPage.goderType}"></t:dictSelect></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label">椤惧绫诲瀷 :</label></td>
    +		<td class="value"><t:dictSelect field="usertype" typeGroupCode="custom" hasLabel="false" defaultVal="${jeecgOrderMainPage.usertype}"></t:dictSelect></td>
    +		<td align="right"><label class="Validform_label">鑱旂郴浜:</label></td>
    +		<td class="value"><input nullmsg="鑱旂郴浜轰笉鑳戒负绌" errormsg="鑱旂郴浜烘牸寮忎笉瀵" class="inputxt" id="goContactName" name="goContactName" value="${jeecgOrderMainPage.goContactName}" datatype="*"></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label">鎵嬫満:</label></td>
    +		<td class="value"><input class="inputxt" id="goTelphone" name="goTelphone" value="${jeecgOrderMainPage.goTelphone}" datatype="m" errormsg="鎵嬫満鍙风爜涓嶆纭!" ignore="ignore"></td>
    +		<td align="right"><label class="Validform_label">璁㈠崟浜烘暟:</label></td>
    +		<td class="value"><input nullmsg="璁㈠崟浜烘暟涓嶈兘涓虹┖" errormsg="璁㈠崟浜烘暟蹇呴』涓烘暟瀛" class="inputxt" id="goOrderCount" name="goOrderCount" value="${jeecgOrderMainPage.goOrderCount}" datatype="n"></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label">鎬讳环(涓嶅惈杩旀):</label></td>
    +		<td class="value"><input class="inputxt" id="goAllPrice" name="goAllPrice" value="${jeecgOrderMainPage.goAllPrice}" datatype="d"></td>
    +		<td align="right"><label class="Validform_label">杩旀:</label></td>
    +		<td class="value"><input nullmsg="杩旀涓嶈兘涓虹┖" errormsg="杩旀鏍煎紡涓嶅" class="inputxt" id="goReturnPrice" name="goReturnPrice" value="${jeecgOrderMainPage.goReturnPrice}" datatype="d"></td>
    +	</tr>
    +	<tr>
    +		<td align="right"><label class="Validform_label">澶囨敞:</label></td>
    +		<td class="value" colspan="3"><input class="inputxt" id="goContent" name="goContent" value="${jeecgOrderMainPage.goContent}"></td>
    +	</tr>
    +</table>
    +<div style="width: auto; height: 200px;">
    +<div style="width: 690px; height: 1px;"></div>
    +<div id="tt" class="easyui-tabs" data-options="onSelect:function(t){$('#tt .panel-body').css('width','auto');}">
    +<div title="浜у搧鏄庣粏">
    +<div style="padding: 3px; height: 25px; width: auto;" class="datagrid-toolbar"><a id="addBtn" href="#">娣诲姞</a> <a id="delBtn" href="#">鍒犻櫎</a></div>
    +<table border="0" cellpadding="2" cellspacing="0" id="jeecgOrderCustom_table">
    +	<tr bgcolor="#E6E6E6">
    +		<td align="center" bgcolor="#EEEEEE">搴忓彿</td>
    +		<td align="left" bgcolor="#EEEEEE">浜у搧鍚嶇О</td>
    +		<td align="left" bgcolor="#EEEEEE">涓暟</td>
    +		<td align="left" bgcolor="#EEEEEE">鏈嶅姟椤圭洰绫诲瀷</td>
    +		<td align="left" bgcolor="#EEEEEE">鍗曚环</td>
    +		<td align="left" bgcolor="#EEEEEE">灏忚</td>
    +		<td align="left" bgcolor="#EEEEEE">澶囨敞</td>
    +	</tr>
    +	<tbody id="add_jeecgOrderProduct_table">
    +		<c:if test="${fn:length(jeecgOrderProductList)  <= 0 }">
    +			<tr>
    +				<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +				<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧鍚嶇О锛" datatype="s6-10" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸悕绉板簲璇ヤ负6鍒10浣" name="jeecgOrderProductList[0].gopProductName" maxlength="100" type="text" value=""></td>
    +				<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧涓暟锛" datatype="n" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佷釜鏁板繀椤讳负鏁板瓧" name="jeecgOrderProductList[0].gopCount" maxlength="10" type="text" value=""></td>
    +				<td align="left"><t:dictSelect field="jeecgOrderProductList[0].gopProductType" typeGroupCode="service" hasLabel="false" defaultVal="${poVal.gocSex}"></t:dictSelect></td>
    +				<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧鍗曚环锛" datatype="d" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸崟浠峰~鍐欎笉姝g‘" name="jeecgOrderProductList[0].gopOnePrice" maxlength="10" type="text" value=""></td>
    +				<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧灏忚锛" datatype="d" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸皬璁″~鍐欎笉姝g‘" name="jeecgOrderProductList[0].gopSumPrice" maxlength="10" type="text" value=""></td>
    +				<td align="left"><input name="jeecgOrderProductList[0].gopContent" maxlength="200" type="text" value=""></td>
    +			</tr>
    +		</c:if>
    +		<c:if test="${fn:length(jeecgOrderProductList)  > 0 }">
    +			<c:forEach items="${jeecgOrderProductList}" var="poVal" varStatus="stuts">
    +				<tr>
    +					<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +					<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧鍚嶇О锛" datatype="s6-10" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸悕绉板簲璇ヤ负6鍒10浣" name="jeecgOrderProductList[${stuts.index }].gopProductName" maxlength="100" type="text"
    +						value="${poVal.gopProductName}"></td>
    +					<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧涓暟锛" datatype="n" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佷釜鏁板繀椤讳负鏁板瓧" name="jeecgOrderProductList[${stuts.index }].gopCount" maxlength="10" type="text"
    +						value="${poVal.gopCount }"></td>
    +					<td align="left"><t:dictSelect field="jeecgOrderProductList[${stuts.index }].gopProductType" typeGroupCode="service" hasLabel="false" defaultVal="${poVal.gopProductType}"></t:dictSelect></td>
    +					<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧鍗曚环锛" datatype="d" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸崟浠峰~鍐欎笉姝g‘" name="jeecgOrderProductList[${stuts.index }].gopOnePrice" maxlength="10" type="text"
    +						value="${poVal.gopOnePrice }"></td>
    +					<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧灏忚锛" datatype="d" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸皬璁″~鍐欎笉姝g‘" name="jeecgOrderProductList[${stuts.index }].gopSumPrice" maxlength="10" type="text"
    +						value="${poVal.gopSumPrice }"></td>
    +					<td align="left"><input name="jeecgOrderProductList[${stuts.index }].gopContent" maxlength="200" type="text" value="${poVal.gopContent }"></td>
    +				</tr>
    +			</c:forEach>
    +		</c:if>
    +	</tbody>
    +</table>
    +</div>
    +<div title="瀹㈡埛鏄庣粏 ">
    +<div style="padding: 3px; height: 25px; width: auto;" class="datagrid-toolbar"><a id="addCustomBtn" href="#">娣诲姞</a> <a id="delCustomBtn" href="#">鍒犻櫎</a></div>
    +<table border="0" cellpadding="2" cellspacing="0" id="jeecgOrderCustom_table">
    +	<tr bgcolor="#E6E6E6">
    +		<td align="center" bgcolor="#EEEEEE">搴忓彿</td>
    +		<td align="left" bgcolor="#EEEEEE">濮撳悕</td>
    +		<td align="left" bgcolor="#EEEEEE">鎬у埆</td>
    +		<td align="left" bgcolor="#EEEEEE">韬唤璇佸彿</td>
    +		<td align="left" bgcolor="#EEEEEE">鎶ょ収鍙</td>
    +		<td align="left" bgcolor="#EEEEEE">涓氬姟</td>
    +		<td align="left" bgcolor="#EEEEEE">澶囨敞</td>
    +	</tr>
    +	<tbody id="add_jeecgOrderCustom_table">
    +		<c:if test="${fn:length(jeecgOrderCustomList)  <= 0 }">
    +			<tr>
    +				<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +				<td align="left"><input name="jeecgOrderCustomList[0].gocCusName" maxlength="50" type="text"></td>
    +				<td align="left"><t:dictSelect field="jeecgOrderCustomList[0].gocSex" typeGroupCode="sex" hasLabel="false" defaultVal="${jgDemo.sex}"></t:dictSelect></td>
    +				<td align="left"><input name="jeecgOrderCustomList[0].gocIdcard" maxlength="32" type="text"></td>
    +				<td align="left"><input name="jeecgOrderCustomList[0].gocPassportCode" maxlength="32" type="text"></td>
    +				<td align="left"><input name="jeecgOrderCustomList[0].gocBussContent" maxlength="100" type="text"></td>
    +				<td align="left"><input name="jeecgOrderCustomList[0].gocContent" maxlength="200" type="text"></td>
    +			</tr>
    +		</c:if>
    +		<c:if test="${fn:length(jeecgOrderCustomList)  > 0 }">
    +			<c:forEach items="${jeecgOrderCustomList}" var="poVal" varStatus="stuts">
    +				<tr>
    +					<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +					<td align="left"><input name="jeecgOrderCustomList[${stuts.index }].gocCusName" maxlength="50" type="text" value="${poVal.gocCusName }"></td>
    +					<td align="left"><t:dictSelect field="jeecgOrderCustomList[${stuts.index }].gocSex" typeGroupCode="sex" hasLabel="false" defaultVal="${poVal.gocSex}"></t:dictSelect></td>
    +					<td align="left"><input name="jeecgOrderCustomList[${stuts.index }].gocIdcard" maxlength="32" type="text" value="${poVal.gocIdcard }"></td>
    +					<td align="left"><input name="jeecgOrderCustomList[${stuts.index }].gocPassportCode" maxlength="32" type="text" value="${poVal.gocPassportCode }"></td>
    +					<td align="left"><input name="jeecgOrderCustomList[${stuts.index }].gocBussContent" maxlength="100" type="text" value="${poVal.gocBussContent }"></td>
    +					<td align="left"><input name="jeecgOrderCustomList[${stuts.index }].gocContent" maxlength="200" type="text" value="${poVal.gocContent }"></td>
    +				</tr>
    +			</c:forEach>
    +		</c:if>
    +	</tbody>
    +</table>
    +<input type="hidden" name="jeecgOrderCustomShow" value="true" /></div>
    +</div>
    +</div>
    +</form>
    +
    +<table style="display: none">
    +	<tbody id="add_jeecgOrderProduct_table_template">
    +		<tr>
    +			<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +			<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧鍚嶇О锛" datatype="s6-10" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸悕绉板簲璇ヤ负6鍒10浣" name="jeecgOrderProductList[#index#].gopProductName" maxlength="100" type="text"></td>
    +			<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧涓暟锛" datatype="n" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佷釜鏁板繀椤讳负鏁板瓧" name="jeecgOrderProductList[#index#].gopCount" maxlength="10" type="text"></td>
    +			<td align="left"><select name="jeecgOrderProductList[#index#].gopProductType">
    +				<option value="1">鐗规畩鏈嶅姟</option>
    +				<option value="2">鏅氭湇鍔</option>
    +			</select></td>
    +			<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧鍗曚环锛" datatype="d" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸崟浠峰~鍐欎笉姝g‘" name="jeecgOrderProductList[#index#].gopOnePrice" maxlength="10" type="text"></td>
    +			<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧灏忚锛" datatype="d" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸皬璁″~鍐欎笉姝g‘" name="jeecgOrderProductList[#index#].gopSumPrice" maxlength="10" type="text"></td>
    +			<td align="left"><input name="jeecgOrderProductList[#index#].gopContent" maxlength="200" type="text"></td>
    +		</tr>
    +	</tbody>
    +	<tbody id="add_jeecgOrderCustom_table_template">
    +		<tr>
    +			<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +			<td align="left"><input name="jeecgOrderCustomList[#index#].gocCusName" maxlength="50" type="text"></td>
    +			<td align="left"><select name="jeecgOrderCustomList[#index#].gocSex">
    +				<option value="0">鐢锋</option>
    +				<option value="1">濂虫</option>
    +			</select></td>
    +			<td align="left"><input name="jeecgOrderCustomList[#index#].gocIdcard" maxlength="32" type="text"></td>
    +			<td align="left"><input name="jeecgOrderCustomList[#index#].gocPassportCode" maxlength="32" type="text"></td>
    +			<td align="left"><input name="jeecgOrderCustomList[#index#].gocBussContent" maxlength="100" type="text"></td>
    +			<td align="left"><input name="jeecgOrderCustomList[#index#].gocContent" maxlength="200" type="text"></td>
    +		</tr>
    +	</tbody>
    +</table>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/CourseStudentList.jsp b/src/main/webapp/webpage/jeecg/demo/test/CourseStudentList.jsp
    new file mode 100644
    index 00000000..c9221572
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/CourseStudentList.jsp
    @@ -0,0 +1,70 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<script type="text/javascript">
    +	$('#addCustomBtn').linkbutton({   
    +	    iconCls: 'icon-add'  
    +	});  
    +	$('#delCustomBtn').linkbutton({   
    +	    iconCls: 'icon-remove'  
    +	}); 
    +	$('#addCustomBtn').bind('click', function(){   
    + 		 var tr =  $("#add_jeecgStudent_table_template tr").clone();
    +	 	 $("#add_jeecgStudent_table").append(tr);
    +	 	 resetTrNum('add_jeecgStudent_table');
    +    });  
    +	$('#delCustomBtn').bind('click', function(){   
    +      	$("#add_jeecgStudent_table").find("input:checked").parent().parent().remove();   
    +        resetTrNum('add_jeecgStudent_table'); 
    +    }); 
    +    $(document).ready(function(){
    +    	$(".datagrid-toolbar").parent().css("width","auto");
    +    });
    +    function resetTrNum(tableId) {
    +		$tbody = $("#"+tableId+"");
    +		$tbody.find('>tr').each(function(i){
    +			$(':input, select', this).each(function(){
    +				var $this = $(this), name = $this.attr('name'), val = $this.val();
    +				if(name!=null){
    +					if (name.indexOf("#index#") >= 0){
    +						$this.attr("name",name.replace('#index#',i));
    +					}else{
    +						var s = name.indexOf("[");
    +						var e = name.indexOf("]");
    +						var new_name = name.substring(s+1,e);
    +						$this.attr("name",name.replace(new_name,i));
    +					}
    +				}
    +			});
    +		});
    +	}
    +</script>
    +<div style="padding: 3px; height: 25px; width: auto;" class="datagrid-toolbar"><a id="addCustomBtn" href="#">娣诲姞</a> <a id="delCustomBtn" href="#">鍒犻櫎</a></div>
    +<div style="width: auto; height: 300px; overflow-y: auto; overflow-x: scroll;">
    +<table border="0" cellpadding="2" cellspacing="0" id="jeecgOrderCustom_table">
    +	<tr bgcolor="#E6E6E6">
    +		<td align="center" bgcolor="#EEEEEE">搴忓彿</td>
    +		<td align="left" bgcolor="#EEEEEE">濮撳悕</td>
    +		<td align="left" bgcolor="#EEEEEE">鎬у埆</td>
    +		<td  style="display: none;"></td>
    +	</tr>
    +	<tbody id="add_jeecgStudent_table">
    +		<c:if test="${fn:length(studentsList)  <= 0 }">
    +			<tr>
    +				<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +				<td align="left"><input name="students[0].name" maxlength="50" type="text" style="width: 220px;"></td>
    +				<td align="left"><t:dictSelect field="students[0].sex" typeGroupCode="sex" hasLabel="false" defaultVal="${jgDemo.sex}"></t:dictSelect></td>
    +            </tr>
    +		</c:if>
    +		<c:if test="${fn:length(studentsList)  > 0 }">
    +			<c:forEach items="${studentsList}" var="poVal" varStatus="stuts">
    +				<tr>
    +					<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +					<td align="left"><input name="students[${stuts.index }].name" maxlength="50" type="text" value="${poVal.name }" style="width: 220px;"></td>
    +					<td align="left"><t:dictSelect field="students[${stuts.index }].sex" typeGroupCode="sex" hasLabel="false" defaultVal="${poVal.sex}"></t:dictSelect></td>
    +                    <td align="left" style="display: none;"><input name="students[${stuts.index }].id" type="text" value="${poVal.id }" style="width: 0px;"></td>
    +                </tr>
    +			</c:forEach>
    +		</c:if>
    +	</tbody>
    +</table>
    +</div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/course.jsp b/src/main/webapp/webpage/jeecg/demo/test/course.jsp
    new file mode 100644
    index 00000000..5aa3a560
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/course.jsp
    @@ -0,0 +1,41 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>璇剧▼</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="courseController.do?save">
    +	<input id="id" name="id" type="hidden" value="${coursePage.id }">
    +	<table style="width: 660px;" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 璇剧▼鍚嶇О: </label></td>
    +			<td class="value"><input class="inputxt" id="name" name="name" ignore="ignore" value="${coursePage.name}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鑰佸笀濮撳悕: </label></td>
    +			<td class="value"><input class="inputxt" id="teacher" name="teacher.name" ignore="ignore" value="${coursePage.teacher.name}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr style="display: none">
    +			<td align="right"><label class="Validform_label"> 鑰佸笀Id: </label></td>
    +			<td class="value"><input class="inputxt" id="teacher" name="teacher.id" ignore="ignore" value="${coursePage.teacher.id}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +	<div style="width: auto; height: 200px;"><%-- 澧炲姞涓涓猟iv锛岀敤浜庤皟鑺傞〉闈㈠ぇ灏忥紝鍚﹀垯榛樿澶皬 --%>
    +	<div style="width: 690px; height: 1px;"></div>
    +	<t:tabs id="tt" iframe="false" tabPosition="top" fit="false">
    +		<t:tab href="courseController.do?studentsList&id=${coursePage.id}" icon="icon-search" title="浜у搧鏄庣粏" id="Product"></t:tab>
    +	</t:tabs></div>
    +</t:formvalid>
    +<table style="display: none">
    +	<tbody id="add_jeecgStudent_table_template">
    +		<tr>
    +			<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +			<td align="left"><input name="students[#index#].name" maxlength="50" type="text" style="width:220px;"></td>
    +			<td align="left"><t:dictSelect field="students[#index#].sex" typeGroupCode="sex" hasLabel="false"></t:dictSelect></td>
    +        </tr>
    +	</tbody>
    +</table>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/courseList.jsp b/src/main/webapp/webpage/jeecg/demo/test/courseList.jsp
    new file mode 100644
    index 00000000..0a5c4116
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/courseList.jsp
    @@ -0,0 +1,42 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<script type="text/javascript" charset="utf-8">
    +	/*
    +	 *	excel瀵煎嚭
    +	 */
    +	function courseListExportXls() {
    +		JeecgExcelExport("courseController.do?exportXls","courseList");
    +	}
    +	function courseListExportXlsByT() {
    +		JeecgExcelExport("courseController.do?exportXlsByT","courseList");
    +	}
    +	function courseListWordXlsByT() {
    +		JeecgExcelExport("courseController.do?exportDocByT","courseList");
    +	}
    +	function courseListExportXlsByTe() {
    +		JeecgExcelExport("courseController.do?exportXlsByTest","courseList");
    +	}
    +	function courseListImportXls() {
    +		openuploadwin('Excel瀵煎叆', 'courseController.do?upload', "courseList");
    +	}
    +	
    +</script>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="courseList" title="璇剧▼" actionUrl="courseController.do?datagrid" idField="id" fit="true" queryMode="group">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="璇剧▼鍚嶇О" field="name" query="true" autocomplete="true"></t:dgCol>
    +	<t:dgCol title="鑰佸笀濮撳悕" field="teacher_name" query="true" autocomplete="true"></t:dgCol>
    +	<t:dgCol title="鑰佸笀鐓х墖" image="true" imageSize="400,200" field="teacher_pic"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="鍒犻櫎" url="courseController.do?del&id={id}" />
    +	<t:dgToolBar title="褰曞叆" icon="icon-add" url="courseController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="缂栬緫" icon="icon-edit" url="courseController.do?addorupdate" funname="update"></t:dgToolBar>
    +	<t:dgToolBar title="鏌ョ湅" icon="icon-search" url="courseController.do?addorupdate" funname="detail"></t:dgToolBar>
    +	<t:dgToolBar title="瀵煎嚭Excel" icon="icon-search" onclick="courseListExportXls();"></t:dgToolBar>
    +	<t:dgToolBar title="瀵煎叆Excel" icon="icon-search" onclick="courseListImportXls()"></t:dgToolBar>
    +	<t:dgToolBar title="Excel妯℃澘瀵煎嚭" icon="icon-search" onclick="courseListExportXlsByT()"></t:dgToolBar>
    +	<t:dgToolBar title="Excel妯℃澘瀵煎嚭缁熻" icon="icon-search" onclick="courseListExportXlsByTe()"></t:dgToolBar>
    +	<t:dgToolBar title="Word妯℃澘瀵煎嚭" icon="icon-search" onclick="courseListWordXlsByT()"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/courseUpload.jsp b/src/main/webapp/webpage/jeecg/demo/test/courseUpload.jsp
    new file mode 100644
    index 00000000..fc0516d9
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/courseUpload.jsp
    @@ -0,0 +1,17 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>Excel瀵煎叆</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" beforeSubmit="upload">
    +	<fieldset class="step">
    +	<div class="form"><t:upload name="fiels" buttonText="閫夋嫨瑕佸鍏ョ殑鏂囦欢" uploader="courseController.do?importExcel" extend="*.xls;*.xlsx" id="file_upload" formData="formobj"></t:upload></div>
    +	<div class="form" id="filediv" style="height: 50px"></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/fileUploadSample.jsp b/src/main/webapp/webpage/jeecg/demo/test/fileUploadSample.jsp
    new file mode 100644
    index 00000000..f9fa686f
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/fileUploadSample.jsp
    @@ -0,0 +1,43 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE HTML>
    +<html>
    +<head>
    +<meta charset="utf-8">
    +<title>jQuery File Upload Example</title>
    +<script src="plug-in/jquery-plugs/fileupload/js/jquery.1.9.1.min.js"></script>
    +
    +<script src="plug-in/jquery-plugs/fileupload/js/vendor/jquery.ui.widget.js"></script>
    +<script src="plug-in/jquery-plugs/fileupload/js/jquery.iframe-transport.js"></script>
    +<script src="plug-in/jquery-plugs/fileupload/js/jquery.fileupload.js"></script>
    +
    +<!-- bootstrap just to have good looking page -->
    +<script src="plug-in/jquery-plugs/fileupload/bootstrap/js/bootstrap.min.js"></script>
    +<link href="plug-in/jquery-plugs/fileupload/bootstrap/css/bootstrap.css" type="text/css" rel="stylesheet" />
    +
    +<!-- we code these -->
    +<link href="plug-in/jquery-plugs/fileupload/css/dropzone.css" type="text/css" rel="stylesheet" />
    +<script src="plug-in/jquery-plugs/fileupload/js/myuploadfunction.js"></script>
    +</head>
    +
    +<body>
    +<div class="datagrid-toolbar" style="width:700px;padding:20px">
    +
    +	<input id="fileupload" type="file" name="files[]" data-url="fileUploadController.do?upload" multiple>
    +	
    +	<div id="progress" class="progress">
    +    	<div class="bar" style="width: 0%;"></div>
    +	</div>
    +
    +	<table id="uploaded-files" class="table">
    +		<tr  bgcolor="#EEEEEE">
    +			<th align="center" bgcolor="#EEEEEE">鏂囦欢鍚</th>
    +			<th align="center" bgcolor="#EEEEEE">鏂囦欢澶у皬</th>
    +			<th align="center" bgcolor="#EEEEEE">鏂囦欢绫诲瀷</th>
    +			<th align="center" bgcolor="#EEEEEE">閾炬帴</th>
    +		</tr>
    +	</table>
    +	
    +</div>
    +</body> 
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgBlobData.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgBlobData.jsp
    new file mode 100644
    index 00000000..56553bb1
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgBlobData.jsp
    @@ -0,0 +1,18 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鏂囦欢涓婁紶</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" beforeSubmit="upload">
    +	<fieldset class="step">
    +	<div class="form"><label class="Validform_label"> 鏂囦欢鏍囬: </label> <input name="documentTitle" id="documentTitle" datatype="s3-50"> <span class="Validform_checktip">鏍囬鍚嶇О鍦3~50浣嶅瓧绗,涓斾笉涓虹┖</span></div>
    +	<div class="form"><t:upload name="fiels" buttonText="涓婁紶鏂囦欢" uploader="jeecgBlobDataController.do?upload" extend="office" id="file_upload" formData="documentTitle"></t:upload></div>
    +	<div class="form" id="filediv" style="height: 50px"></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgBlobDataList.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgBlobDataList.jsp
    new file mode 100644
    index 00000000..48d109d9
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgBlobDataList.jsp
    @@ -0,0 +1,18 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="jeecgBlobDataList" title="Blob鍨嬫暟鎹搷浣滀緥瀛" actionUrl="jeecgBlobDataController.do?datagrid" idField="id" fit="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="鏍囬" field="attachmenttitle"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgFunOpt title="涓嬭浇" funname="jeecgBlobData_funcDownloadFile(id)" />
    +	<t:dgDelOpt title="鍒犻櫎" url="jeecgBlobDataController.do?del&id={id}" />
    +	<t:dgToolBar title="涓婁紶" icon="icon-add" url="jeecgBlobDataController.do?addorupdate" funname="add"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +<script type="text/javascript">
    +function jeecgBlobData_funcDownloadFile(id) {
    +	window.location.href = "jeecgBlobDataController.do?download&fileId="+id; 
    +}
    + </script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgDemoCkfinder.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgDemoCkfinder.jsp
    new file mode 100644
    index 00000000..0c21a747
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgDemoCkfinder.jsp
    @@ -0,0 +1,29 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@ page trimDirectiveWhitespaces="true"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>ckeditor+ckfinder渚嬪瓙</title>
    +<t:base type="ckfinder,ckeditor,jquery,easyui,tools,DatePicker"></t:base>
    +<link rel="stylesheet" type="text/css" href="plug-in/jquery-ui/css/ui-lightness/jquery-ui-1.9.2.custom.min.css">
    +</head>
    +<body>
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="jeecgDemoCkfinderController.do?save">
    +	<input id="id" name="id" type="hidden" value="${jeecgDemoCkfinderPage.id}">
    +	<table style="width: 870px; height: 500px;" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鍥剧墖: </label></td>
    +			<td class="value"><t:ckfinder name="image" uploadType="Images" value="${jeecgDemoCkfinderPage.image}" width="100" height="60" buttonClass="ui-button" buttonValue="涓婁紶鍥剧墖"></t:ckfinder></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 闄勪欢: </label></td>
    +			<td class="value"><t:ckfinder name="attachment" uploadType="Files" value="${jeecgDemoCkfinderPage.attachment}" buttonClass="ui-button" buttonValue="涓婁紶闄勪欢"></t:ckfinder></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 澶囨敞: </label></td>
    +			<td class="value"><t:ckeditor name="remark" isfinder="true" value="${jeecgDemoCkfinderPage.remark}" type="width:750"></t:ckeditor></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgDemoCkfinderList.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgDemoCkfinderList.jsp
    new file mode 100644
    index 00000000..1d9f9ec1
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgDemoCkfinderList.jsp
    @@ -0,0 +1,23 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="jeecgDemoCkfinderList" title="ckeditor+ckfinder渚嬪瓙" actionUrl="jeecgDemoCkfinderController.do?datagrid" idField="id" fit="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="鍥剧墖" field="image" imageSize="90,50"></t:dgCol>
    +	<t:dgCol title="闄勪欢" field="attachment" downloadName="鐐瑰嚮涓嬭浇"></t:dgCol>
    +	<!-- 澶囨敞鏈濂介殣钘忥紝涓嶇劧浣犺瘯璇曪紵 -->
    +	<t:dgCol title="澶囨敞" field="remark" hidden="true"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="鍒犻櫎" url="jeecgDemoCkfinderController.do?del&id={id}" />
    +	<t:dgToolBar title="褰曞叆" icon="icon-add" url="jeecgDemoCkfinderController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="缂栬緫" icon="icon-edit" url="jeecgDemoCkfinderController.do?addorupdate" funname="update"></t:dgToolBar>
    +	<t:dgToolBar title="鏌ョ湅" icon="icon-search" url="jeecgDemoCkfinderController.do?addorupdate" funname="detail"></t:dgToolBar>
    +	<t:dgFunOpt funname="preview(id)" title="棰勮"></t:dgFunOpt>
    +</t:datagrid> <script type="text/javascript">
    +			function preview(id) {
    +				var url = 'jeecgDemoCkfinderController.do?preview&id=' + id;
    +				createwindow('棰勮', url, 830, 400);
    +			}
    +		</script></div>
    +</div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgDemoCkfinderPreview.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgDemoCkfinderPreview.jsp
    new file mode 100644
    index 00000000..2ae672ac
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgDemoCkfinderPreview.jsp
    @@ -0,0 +1,27 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@ page trimDirectiveWhitespaces="true"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>ckeditor+ckfinder渚嬪瓙棰勮</title>
    +<style type="text/css">
    +a {
    +	color: Black;
    +	text-decoration: none;
    +}
    +
    +a:hover {
    +	color: black;
    +	text-decoration: none;
    +}
    +</style>
    +</head>
    +<body>
    +<div style="width: 750px; margin-left: auto; margin-right: auto;">${ckfinderPreview.remark}</div>
    +<!-- 搴曢儴 -->
    +<div region="south" border="false" style="height: 25px; overflow: hidden;">
    +<div align="center" style="color: #CC99FF; padding-top: 2px">&copy; 鐗堟潈鎵鏈 <span class="tip"><a href="http://www.jeecg.org" title="JEECG_v3.1 Simple鐗堟湰">JEECG_v3.1</a> (鎺ㄨ崘璋锋瓕娴忚鍣紝鑾峰緱鏇村揩鍝嶅簲閫熷害)
    +鎶鏈敮鎸:<a href="#" title="JEECG_v3.1 Simple鐗堟湰">JEECG_v3.1</a> </span></div>
    +</div>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgJdbc.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgJdbc.jsp
    new file mode 100644
    index 00000000..386a380e
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgJdbc.jsp
    @@ -0,0 +1,57 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>閫氳繃JDBC璁块棶鏁版嵁搴</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="jeecgJdbcController.do?save">
    +	<input id="id" name="id" type="hidden" value="${jeecgJdbcPage.id }">
    +	<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> age: </label></td>
    +			<td class="value"><input class="inputxt" id="age" name="age" ignore="ignore" value="${jeecgJdbcPage.age}" datatype="n"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> birthday: </label></td>
    +			<td class="value"><input class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px" id="birthday" name="birthday" ignore="ignore"
    +				value="<fmt:formatDate value='${jeecgJdbcPage.birthday}' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> createTime: </label></td>
    +			<td class="value"><input class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px" id="createTime" name="createTime" ignore="ignore"
    +				value="<fmt:formatDate value='${jeecgJdbcPage.createTime}' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> depId: </label></td>
    +			<td class="value"><input class="inputxt" id="depId" name="depId" ignore="ignore" value="${jeecgJdbcPage.depId}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> email: </label></td>
    +			<td class="value"><input class="inputxt" id="email" name="email" ignore="ignore" value="${jeecgJdbcPage.email}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> mobilePhone: </label></td>
    +			<td class="value"><input class="inputxt" id="mobilePhone" name="mobilePhone" ignore="ignore" value="${jeecgJdbcPage.mobilePhone}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> officePhone: </label></td>
    +			<td class="value"><input class="inputxt" id="officePhone" name="officePhone" ignore="ignore" value="${jeecgJdbcPage.officePhone}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> salary: </label></td>
    +			<td class="value"><input class="inputxt" id="salary" name="salary" ignore="ignore" value="${jeecgJdbcPage.salary}" datatype="d"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> sex: </label></td>
    +			<td class="value"><input class="inputxt" id="sex" name="sex" ignore="ignore" value="${jeecgJdbcPage.sex}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> userName: </label></td>
    +			<td class="value"><input class="inputxt" id="userName" name="userName" value="${jeecgJdbcPage.userName}" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgJdbcList.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgJdbcList.jsp
    new file mode 100644
    index 00000000..2364e472
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgJdbcList.jsp
    @@ -0,0 +1,27 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="jeecgJdbcList" title="閫氳繃JDBC璁块棶鏁版嵁搴" actionUrl="jeecgJdbcController.do?datagrid" idField="id" fit="true"
    +	onDblClick="jeecgJdbcList_edit">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="濮撳悕" field="userName" query="true"></t:dgCol>
    +	<t:dgCol title="閮ㄩ棬" field="depId"></t:dgCol>
    +	<t:dgCol title="鎬у埆" field="sex"></t:dgCol>
    +	<t:dgCol title="骞撮緞" field="age"></t:dgCol>
    +	<t:dgCol title="鐢熸棩" field="birthday" formatter="yyyy-MM-dd hh:mm:ss"></t:dgCol>
    +	<t:dgCol title="E-Mail" field="email"></t:dgCol>
    +	<t:dgCol title="鎵嬫満" field="mobilePhone" query="true"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="鍒犻櫎" url="jeecgJdbcController.do?del&id={id}" />
    +	<t:dgToolBar title="褰曞叆" icon="icon-add" url="jeecgJdbcController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="缂栬緫" icon="icon-edit" url="jeecgJdbcController.do?addorupdate" funname="update"></t:dgToolBar>
    +	<t:dgToolBar title="鏌ョ湅" icon="icon-search" url="jeecgJdbcController.do?addorupdate" funname="detail"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +
    +<script type="text/javascript">
    +	function jeecgJdbcList_edit(rowIndex,rowData) {
    +		createwindow("XXX缂栬緫",'jeecgJdbcController.do?addorupdate&id='+rowData.id);
    +	}
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgMatterBom.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgMatterBom.jsp
    new file mode 100644
    index 00000000..eaac7440
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgMatterBom.jsp
    @@ -0,0 +1,35 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鐗╂枡Bom</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<script type="text/javascript">
    +		$(function() {
    +			$('#parent').combotree({
    +				url : 'jeecgMatterBomController.do?getChildren'
    +			});
    +		});
    +		</script>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" action="jeecgMatterBomController.do?doSave">
    +	<input name="id" type="hidden" value="${entity.id}" />
    +	<fieldset class="step">
    +	<div class="form"><label class="Validform_label">缂栫爜:</label> <input name="code" class="inputxt" value="${entity.code}" datatype="s3-10" maxlength="50" /> <span class="Validform_checktip">缂栫爜鍦3~10浣嶅瓧绗</span>
    +	</div>
    +	<div class="form"><label class="Validform_label">鍚嶇О:</label> <input name="name" class="inputxt" value="${entity.name}" datatype="*" maxlength="50" /> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label">涓婄骇鐗╂枡Bom:</label> <input id="parent" name="parent.id" value="${entity.parent.id}" /></div>
    +	<div class="form"><label class="Validform_label">鍗曚綅:</label> <input name="unit" value="${entity.unit}" /></div>
    +	<div class="form"><label class="Validform_label">澶у皬:</label> <input name="weight" value="${entity.weight}" /></div>
    +	<div class="form"><label class="Validform_label">浠锋牸:</label> <input name="price" value="${entity.price}" datatype="d" /></div>
    +	<div class="form"><label class="Validform_label">搴撳瓨:</label> <input name="stock" value="${entity.stock}" datatype="n" /></div>
    +	<div class="form"><label class="Validform_label">浜у湴:</label> <input name="address" value="${entity.address}" /></div>
    +	<div class="form"><label class="Validform_label">鐢熶骇鏃ユ湡:</label> <input class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px" name="productionDate"
    +		ignore="ignore" value="<fmt:formatDate value='${entity.productionDate}' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>" /></div>
    +	<div class="form"><label class="Validform_label">鏁伴噺:</label> <input name="quantity" value="${entity.quantity}" datatype="n" /></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgMatterBomList.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgMatterBomList.jsp
    new file mode 100644
    index 00000000..1a5ffe30
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgMatterBomList.jsp
    @@ -0,0 +1,15 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="jeecgMatterBomList" title="鐗╂枡Bom鍒楄〃" actionUrl="jeecgMatterBomController.do?doTreeGrid" treegrid="true" idField="id"
    +	pagination="false">
    +	<t:dgCol title="缂栧彿" field="id" treefield="id" hidden="true" />
    +	<t:dgCol title="鍚嶇О" field="name" treefield="text" />
    +	<t:dgCol title="缂栫爜" field="code" treefield="src" />
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100" />
    +	<t:dgDelOpt title="鍒犻櫎" url="jeecgMatterBomController.do?doDelete&id={id}" />
    +	<t:dgToolBar title="褰曞叆" icon="icon-add" url="jeecgMatterBomController.do?goEdit" funname="add" operationCode="add" />
    +	<t:dgToolBar title="缂栬緫" icon="icon-edit" url="jeecgMatterBomController.do?goEdit" funname="update" operationCode="update" />
    +</t:datagrid></div>
    +</div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgMinidao.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgMinidao.jsp
    new file mode 100644
    index 00000000..a9684f9a
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgMinidao.jsp
    @@ -0,0 +1,40 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>Minidao渚嬪瓙</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: auto" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="div" action="jeecgMinidaoController.do?save">
    +	<input id="id" name="id" type="hidden" value="${jeecgMinidaoPage.id }">
    +	<fieldset class="step">
    +	<div class="form"><label class="Validform_label">鐢ㄦ埛鍚:</label> <input class="inputxt" id="userName" name="userName" value="${jeecgMinidaoPage.userName}" datatype="*"> <span
    +		class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label">鎵嬫満:</label> <input class="inputxt" id="mobilePhone" name="mobilePhone" ignore="ignore" value="${jeecgMinidaoPage.mobilePhone}"> <span
    +		class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label">鍔炲叕鐢佃瘽:</label> <input class="inputxt" id="officePhone" name="officePhone" ignore="ignore" value="${jeecgMinidaoPage.officePhone}"> <span
    +		class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label">鐢靛瓙閭:</label> <input class="inputxt" id="email" name="email" ignore="ignore" value="${jeecgMinidaoPage.email}"> <span
    +		class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label">骞撮緞:</label> <input class="inputxt" id="age" name="age" ignore="ignore" value="${jeecgMinidaoPage.age}" datatype="n"> <span
    +		class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label">宸ヨ祫:</label> <input class="inputxt" id="salary" name="salary" ignore="ignore" value="${jeecgMinidaoPage.salary}" datatype="d"> <span
    +		class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label">鐢熸棩:</label> <input class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px" id="birthday" name="birthday"
    +		ignore="ignore" value="<fmt:formatDate value='${jeecgMinidaoPage.birthday}' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>"> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label">鍒涘缓鏃堕棿:</label> <input class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px" id="createTime" name="createTime"
    +		ignore="ignore" value="<fmt:formatDate value='${jeecgMinidaoPage.createTime}' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>"> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label">閮ㄩ棬:</label> <select id="depId" name="depId" datatype="*">
    +		<c:forEach items="${departList}" var="depart">
    +			<option value="${depart.id }" <c:if test="${depart.id==jgDemo.depId}">selected="selected"</c:if>>${depart.departname}</option>
    +		</c:forEach>
    +	</select> <span class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label">鎬у埆:</label> <t:dictSelect field="sex" typeGroupCode="sex" hasLabel="false" defaultVal="${jgDemo.sex}"></t:dictSelect> <span
    +		class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label">鐘舵:</label> <input class="inputxt" id="status" name="status" ignore="ignore" value="${jeecgMinidaoPage.status}"> <span
    +		class="Validform_checktip"></span></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgMinidaoList.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgMinidaoList.jsp
    new file mode 100644
    index 00000000..0fa7d5fc
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgMinidaoList.jsp
    @@ -0,0 +1,25 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +<t:datagrid name="jeecgMinidaoList" title="menu.minidao.example" actionUrl="jeecgMinidaoController.do?datagrid" idField="id" fit="true" queryMode="group">
    +	<t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.username" field="userName" query="true" width="120"></t:dgCol>
    +	<t:dgCol title="common.moblePhone" field="mobilePhone" query="true" width="120"></t:dgCol>
    +	<t:dgCol title="common.tel" field="officePhone" query="true" width="120"></t:dgCol>
    +	<t:dgCol title="common.age" field="age" width="120"></t:dgCol>
    +	<t:dgCol title="common.email" field="email" width="120"></t:dgCol>
    +	<t:dgCol title="common.wage" field="salary" width="120"></t:dgCol>
    +	<t:dgCol title="common.sex" field="sex" dictionary="sex" query="true" width="120"></t:dgCol>
    +	<t:dgCol title="common.status" field="status" replace="鏈鐞哶0,宸插鐞哶1" width="120"></t:dgCol>
    +	<t:dgCol title="common.birthday" field="birthday" formatter="yyyy-MM-dd hh:mm:ss" width="120"></t:dgCol>
    +	<t:dgCol title="common.createtime" field="createTime" formatter="yyyy-MM-dd hh:mm:ss" width="120"></t:dgCol>
    +	<t:dgCol title="common.opt" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="common.delete" url="jeecgMinidaoController.do?del&id={id}" />
    +	<t:dgToolBar title="common.add" icon="icon-add" url="jeecgMinidaoController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="common.edit" icon="icon-edit" url="jeecgMinidaoController.do?addorupdate" funname="update"></t:dgToolBar>
    +	<t:dgToolBar title="common.search" icon="icon-search" url="jeecgMinidaoController.do?addorupdate" funname="detail"></t:dgToolBar>
    +</t:datagrid>
    +</div>
    +</div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgNote.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgNote.jsp
    new file mode 100644
    index 00000000..1945a1ba
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgNote.jsp
    @@ -0,0 +1,37 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鍗曡〃妯″瀷</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="jeecgNoteController.do?save">
    +	<input id="id" name="id" type="hidden" value="${jeecgNotePage.id }">
    +	<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 骞撮緞: </label></td>
    +			<td class="value"><input class="inputxt" id="age" name="age" value="${jeecgNotePage.age}" datatype="n"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鐢熸棩: </label></td>
    +			<td class="value"><input class="Wdate" onClick="WdatePicker()" style="width: 150px" id="birthday" name="birthday" ignore="ignore"
    +				value="<fmt:formatDate value='${jeecgNotePage.birthday}' type="date" pattern="yyyy-MM-dd"/>"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鍑虹敓鏃ユ湡: </label></td>
    +			<td class="value"><input class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px" id="createdt" name="createdt"
    +				value="<fmt:formatDate value='${jeecgNotePage.createdt}' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鐢ㄦ埛鍚: </label></td>
    +			<td class="value"><input class="inputxt" id="name" name="name" value="${jeecgNotePage.name}" datatype="*6-16"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 宸ヨ祫: </label></td>
    +			<td class="value"><input class="inputxt" id="salary" name="salary" value="${jeecgNotePage.salary}" datatype="d"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgNoteList.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgNoteList.jsp
    new file mode 100644
    index 00000000..7094b106
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgNoteList.jsp
    @@ -0,0 +1,26 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="jeecgNoteList" title="鍗曡〃妯″瀷" actionUrl="jeecgNoteController.do?datagrid" idField="id" fit="true" queryMode="group" queryBuilder="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="骞撮緞" field="age" query="true" extend="{data-options:{required:false,groupSeparator:\"','\"},class:{value:'easyui-numberbox'}}"></t:dgCol>
    +	<t:dgCol title="鐢熸棩" field="birthday" formatter="yyyy-MM-dd"></t:dgCol>
    +	<t:dgCol title="鍑虹敓鏃ユ湡" field="createdt" formatter="yyyy-MM-dd hh:mm:ss" query="true" queryMode="group" extend="{class:{value:'easyui-datebox'}}"></t:dgCol>
    +	<t:dgCol title="鐢ㄦ埛鍚" field="name" query="true" extend="{style:{width:'300px'}}"></t:dgCol>
    +	<t:dgCol title="宸ヨ祫" field="salary"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="鍒犻櫎" url="jeecgNoteController.do?del&id={id}" />
    +	<t:dgToolBar title="褰曞叆" icon="icon-add" url="jeecgNoteController.do?addorupdate" funname="add" operationCode="add"></t:dgToolBar>
    +	<t:dgToolBar title="褰曞叆鏃犻粯璁ゆ寜閽" icon="icon-add" url="jeecgNoteController.do?addorupdate" funname="noteAdd" operationCode="add"></t:dgToolBar>
    +	<t:dgToolBar title="缂栬緫" icon="icon-edit" url="jeecgNoteController.do?addorupdate" funname="update"></t:dgToolBar>
    +</t:datagrid>
    +
    +</div>
    +</div>
    +<script type="text/javascript">
    +
    +    function noteAdd(){
    +        openwindow("鑷畾涔夋寜閽","jeecgNoteController.do?addorupdateNoBtn","jeecgNoteList",600,400);
    +    }
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgNoteNoBtn.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgNoteNoBtn.jsp
    new file mode 100644
    index 00000000..4ecfceae
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgNoteNoBtn.jsp
    @@ -0,0 +1,78 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    +<%@include file="/context/mytags.jsp" %>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +    <title>鍗曡〃妯″瀷</title>
    +    <t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +    <link rel="stylesheet" type="text/css" href="plug-in/lhgDialog/skins/default.css">
    +    <script type="text/javascript">
    +        function saveNoteInfo() {
    +            //type1 鑷畾涔夋寜閽彁浜
    +            //iframe = frameElement.contentWindow;
    +            //saveObj();
    +
    +            //type2 鐩存帴鎻愪氦
    +            //$('#btn_sub').click();
    +
    +            //type3閲嶅啓 callback鍑芥暟闃叉鍏抽棴
    +            $('#btn_sub').click();
    +        }
    +        //閲嶅啓浜嗗洖璋,鐒跺悗鑷繁鎺у埗鍏抽棴浠ュ強鍒锋柊
    +        function noteSubmitCallback(data) {
    +            var win = frameElement.api.opener;
    +            if (data.success == true) {
    +                $.dialog.confirm(data.msg+',鏄惁鍏抽棴鐣岄潰', function(){
    +                    frameElement.api.close();
    +                    win.reloadTable();
    +                });
    +            } else {
    +                $.dialog.tip(data.msg);
    +            }
    +        }
    +
    +    </script>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table"
    +             action="jeecgNoteController.do?save" callback="@Override noteSubmitCallback">
    +    <input id="id" name="id" type="hidden" value="${jeecgNotePage.id }">
    +    <table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +        <tr>
    +            <td align="right"><label class="Validform_label"> 骞撮緞: </label></td>
    +            <td class="value"><input class="inputxt" id="age" name="age" value="${jeecgNotePage.age}" datatype="n">
    +                <span class="Validform_checktip"></span></td>
    +        </tr>
    +        <tr>
    +            <td align="right"><label class="Validform_label"> 鐢熸棩: </label></td>
    +            <td class="value"><input class="Wdate" onClick="WdatePicker()" style="width: 150px" id="birthday"
    +                                     name="birthday" ignore="ignore"
    +                                     value="<fmt:formatDate value='${jeecgNotePage.birthday}' type="date" pattern="yyyy-MM-dd"/>">
    +                <span class="Validform_checktip"></span></td>
    +        </tr>
    +        <tr>
    +            <td align="right"><label class="Validform_label"> 鍑虹敓鏃ユ湡: </label></td>
    +            <td class="value"><input class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})"
    +                                     style="width: 150px" id="createdt" name="createdt"
    +                                     value="<fmt:formatDate value='${jeecgNotePage.createdt}' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>"
    +                                     datatype="*"> <span class="Validform_checktip"></span></td>
    +        </tr>
    +        <tr>
    +            <td align="right"><label class="Validform_label"> 鐢ㄦ埛鍚: </label></td>
    +            <td class="value"><input class="inputxt" id="name" name="name" value="${jeecgNotePage.name}"
    +                                     datatype="*6-16"> <span class="Validform_checktip"></span></td>
    +        </tr>
    +        <tr>
    +            <td align="right"><label class="Validform_label"> 宸ヨ祫: </label></td>
    +            <td class="value"><input class="inputxt" id="salary" name="salary" value="${jeecgNotePage.salary}"
    +                                     datatype="d"> <span class="Validform_checktip"></span></td>
    +        </tr>
    +    </table>
    +    <div class="ui_main">
    +        <div class="ui_buttons">
    +            <input type="button" value="纭畾" onclick="saveNoteInfo();" class="ui_state_highlight">
    +            <input type="button" value="鍏抽棴" onclick="frameElement.api.close();">
    +        </div>
    +    </div>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgOrderCustomList.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgOrderCustomList.jsp
    new file mode 100644
    index 00000000..7ec8c237
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgOrderCustomList.jsp
    @@ -0,0 +1,67 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<script type="text/javascript">
    +	$('#addCustomBtn').linkbutton({   
    +	    iconCls: 'icon-add'  
    +	});  
    +	$('#delCustomBtn').linkbutton({   
    +	    iconCls: 'icon-remove'  
    +	}); 
    +	$('#addCustomBtn').bind('click', function(){   
    + 		 var tr =  $("#add_jeecgOrderCustom_table_template tr").clone();
    +	 	 $("#add_jeecgOrderCustom_table").append(tr);
    +	 	 resetTrNum('add_jeecgOrderCustom_table');
    +    });  
    +	$('#delCustomBtn').bind('click', function(){   
    +      	$("#add_jeecgOrderCustom_table").find("input:checked").parent().parent().remove();   
    +        resetTrNum('add_jeecgOrderCustom_table'); 
    +    }); 
    +    $(document).ready(function(){
    +    	$(".datagrid-toolbar").parent().css("width","auto");
    +    	//灏嗚〃鏍肩殑琛ㄥご鍥哄畾
    +    	$("#jeecgOrderCustom_table").createhftable({
    +	    	height:'200px',
    +			width:'auto',
    +			fixFooter:false
    +			});
    +    });
    +</script>
    +<div style="padding: 3px; height: 25px; width: auto;" class="datagrid-toolbar"><a id="addCustomBtn" href="#">娣诲姞</a> <a id="delCustomBtn" href="#">鍒犻櫎</a></div>
    +<table border="0" cellpadding="2" cellspacing="0" id="jeecgOrderCustom_table">
    +	<tr bgcolor="#E6E6E6">
    +		<td align="center" bgcolor="#EEEEEE">搴忓彿</td>
    +		<td align="left" bgcolor="#EEEEEE">濮撳悕</td>
    +		<td align="left" bgcolor="#EEEEEE">鎬у埆</td>
    +		<td align="left" bgcolor="#EEEEEE">韬唤璇佸彿</td>
    +		<td align="left" bgcolor="#EEEEEE">鎶ょ収鍙</td>
    +		<td align="left" bgcolor="#EEEEEE">涓氬姟</td>
    +		<td align="left" bgcolor="#EEEEEE">澶囨敞</td>
    +	</tr>
    +	<tbody id="add_jeecgOrderCustom_table">
    +		<c:if test="${fn:length(jeecgOrderCustomList)  <= 0 }">
    +			<tr>
    +				<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +				<td align="left"><input name="jeecgOrderCustomList[0].gocCusName" maxlength="50" type="text" style="width: 220px;"></td>
    +				<td align="left"><t:dictSelect field="jeecgOrderCustomList[0].gocSex" typeGroupCode="sex" hasLabel="false" defaultVal="${jgDemo.sex}"></t:dictSelect></td>
    +				<td align="left"><input name="jeecgOrderCustomList[0].gocIdcard" maxlength="32" type="text" style="width: 120px;"></td>
    +				<td align="left"><input name="jeecgOrderCustomList[0].gocPassportCode" maxlength="32" type="text" style="width: 120px;"></td>
    +				<td align="left"><input name="jeecgOrderCustomList[0].gocBussContent" maxlength="100" type="text" style="width: 120px;"></td>
    +				<td align="left"><input name="jeecgOrderCustomList[0].gocContent" maxlength="200" type="text" style="width: 120px;"></td>
    +			</tr>
    +		</c:if>
    +		<c:if test="${fn:length(jeecgOrderCustomList)  > 0 }">
    +			<c:forEach items="${jeecgOrderCustomList}" var="poVal" varStatus="stuts">
    +				<tr>
    +					<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +					<td align="left"><input name="jeecgOrderCustomList[${stuts.index }].gocCusName" maxlength="50" type="text" value="${poVal.gocCusName }" style="width: 220px;"></td>
    +					<td align="left"><t:dictSelect field="jeecgOrderCustomList[${stuts.index }].gocSex" typeGroupCode="sex" hasLabel="false" defaultVal="${poVal.gocSex}"></t:dictSelect></td>
    +					<td align="left"><input name="jeecgOrderCustomList[${stuts.index }].gocIdcard" maxlength="32" type="text" value="${poVal.gocIdcard }" style="width: 120px;"></td>
    +					<td align="left"><input name="jeecgOrderCustomList[${stuts.index }].gocPassportCode" maxlength="32" type="text" value="${poVal.gocPassportCode }" style="width: 120px;"></td>
    +					<td align="left"><input name="jeecgOrderCustomList[${stuts.index }].gocBussContent" maxlength="100" type="text" value="${poVal.gocBussContent }" style="width: 120px;"></td>
    +					<td align="left"><input name="jeecgOrderCustomList[${stuts.index }].gocContent" maxlength="200" type="text" value="${poVal.gocContent }" style="width: 120px;"></td>
    +				</tr>
    +			</c:forEach>
    +		</c:if>
    +	</tbody>
    +</table>
    +<input type="hidden" name="jeecgOrderCustomShow" value="true" />
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgOrderMain.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgOrderMain.jsp
    new file mode 100644
    index 00000000..2f79619f
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgOrderMain.jsp
    @@ -0,0 +1,101 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>璁㈠崟淇℃伅</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<script type="text/javascript">
    +  //鍒濆鍖栦笅鏍
    +	function resetTrNum(tableId) {
    +		$tbody = $("#"+tableId+"");
    +		$tbody.find('>tr').each(function(i){
    +			$(':input, select', this).each(function(){
    +				var $this = $(this), name = $this.attr('name'), val = $this.val();
    +				if(name!=null){
    +					if (name.indexOf("#index#") >= 0){
    +						$this.attr("name",name.replace('#index#',i));
    +					}else{
    +						var s = name.indexOf("[");
    +						var e = name.indexOf("]");
    +						var new_name = name.substring(s+1,e);
    +						$this.attr("name",name.replace(new_name,i));
    +					}
    +				}
    +			});
    +		});
    +	}
    + </script>
    +<body>
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" tiptype="1" action="jeecgOrderMainController.do?save">
    +	<input id="id" name="id" type="hidden" value="${jeecgOrderMainPage.id }">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 璁㈠崟鍙: </label></td>
    +			<td class="value"><input class="inputxt" id="goOrderCode" name="goOrderCode" datatype="*" value="${jeecgOrderMainPage.goOrderCode}"></td>
    +			<td align="right"><label class="Validform_label"> 璁㈠崟绫诲瀷: </label></td>
    +			<td class="value"><%--						<input class="inputxt" id="goderType" name="goderType" --%> <%--							   value="${jeecgOrderMainPage.goderType}">--%> <t:dictSelect field="goderType"
    +				typeGroupCode="order" hasLabel="false" defaultVal="${jeecgOrderMainPage.goderType}"></t:dictSelect></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 椤惧绫诲瀷 </label></td>
    +			<td class="value"><%--						<input class="inputxt" id="usertype" name="usertype" --%> <%--							   value="${jeecgOrderMainPage.usertype}">--%> <t:dictSelect field="usertype"
    +				typeGroupCode="custom" hasLabel="false" defaultVal="${jeecgOrderMainPage.usertype}"></t:dictSelect></td>
    +			<td align="right"><label class="Validform_label"> 鑱旂郴浜: </label></td>
    +			<td class="value"><input nullmsg="鑱旂郴浜轰笉鑳戒负绌" errormsg="鑱旂郴浜烘牸寮忎笉瀵" class="inputxt" id="goContactName" name="goContactName" value="${jeecgOrderMainPage.goContactName}" datatype="*"></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鎵嬫満: </label></td>
    +			<td class="value"><input class="inputxt" id="goTelphone" name="goTelphone" value="${jeecgOrderMainPage.goTelphone}" datatype="m" errormsg="鎵嬫満鍙风爜涓嶆纭!" ignore="ignore"></td>
    +			<td align="right"><label class="Validform_label"> 璁㈠崟浜烘暟: </label></td>
    +			<td class="value"><input nullmsg="璁㈠崟浜烘暟涓嶈兘涓虹┖" errormsg="璁㈠崟浜烘暟蹇呴』涓烘暟瀛" class="inputxt" id="goOrderCount" name="goOrderCount" value="${jeecgOrderMainPage.goOrderCount}" datatype="n"></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鎬讳环(涓嶅惈杩旀): </label></td>
    +			<td class="value"><input class="inputxt" id="goAllPrice" name="goAllPrice" value="${jeecgOrderMainPage.goAllPrice}" datatype="d"></td>
    +			<td align="right"><label class="Validform_label"> 杩旀: </label></td>
    +			<td class="value"><input nullmsg="杩旀涓嶈兘涓虹┖" errormsg="杩旀鏍煎紡涓嶅" class="inputxt" id="goReturnPrice" name="goReturnPrice" value="${jeecgOrderMainPage.goReturnPrice}" datatype="d"></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 澶囨敞: </label></td>
    +			<td class="value" colspan="3"><input class="inputxt" id="goContent" name="goContent" value="${jeecgOrderMainPage.goContent}"></td>
    +		</tr>
    +	</table>
    +	<div style="width: auto; height: 200px;"><%-- 澧炲姞涓涓猟iv锛岀敤浜庤皟鑺傞〉闈㈠ぇ灏忥紝鍚﹀垯榛樿澶皬 --%>
    +	<div style="width: 690px; height: 1px;"></div>
    +	<t:tabs id="tt" iframe="false" tabPosition="top" fit="false">
    +		<t:tab href="jeecgOrderMainController.do?jeecgOrderProductList&goOrderCode=${jeecgOrderMainPage.goOrderCode}" icon="icon-search" title="浜у搧鏄庣粏" id="Product"></t:tab>
    +		<t:tab href="jeecgOrderMainController.do?jeecgOrderCustomList&goOrderCode=${jeecgOrderMainPage.goOrderCode}" icon="icon-search" title="瀹㈡埛鏄庣粏" id="Custom"></t:tab>
    +	</t:tabs></div>
    +</t:formvalid>
    +<!-- 娣诲姞 浜у搧鏄庣粏 妯$増 -->
    +<table style="display: none">
    +	<tbody id="add_jeecgOrderProduct_table_template">
    +		<tr>
    +			<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +			<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧鍚嶇О锛" datatype="s6-10" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸悕绉板簲璇ヤ负6鍒10浣" name="jeecgOrderProductList[#index#].gopProductName" maxlength="100" type="text"
    +				style="width: 220px;"></td>
    +			<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧涓暟锛" datatype="n" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佷釜鏁板繀椤讳负鏁板瓧" name="jeecgOrderProductList[#index#].gopCount" maxlength="10" type="text" style="width: 120px;"></td>
    +			<td align="left"><%--			 <input name="jeecgOrderProductList[#index#].gopProductType" maxlength="3" type="text" style="width:120px;">--%> <t:dictSelect
    +				field="jeecgOrderProductList[#index#].gopProductType" typeGroupCode="service" hasLabel="false"></t:dictSelect></td>
    +			<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧鍗曚环锛" datatype="d" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸崟浠峰~鍐欎笉姝g‘" name="jeecgOrderProductList[#index#].gopOnePrice" maxlength="10" type="text" style="width: 120px;"></td>
    +			<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧灏忚锛" datatype="d" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸皬璁″~鍐欎笉姝g‘" name="jeecgOrderProductList[#index#].gopSumPrice" maxlength="10" type="text" style="width: 120px;"></td>
    +			<td align="left"><input name="jeecgOrderProductList[#index#].gopContent" maxlength="200" type="text" style="width: 120px;"></td>
    +		</tr>
    +	</tbody>
    +	<tbody id="add_jeecgOrderCustom_table_template">
    +		<tr>
    +			<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +			<td align="left"><input name="jeecgOrderCustomList[#index#].gocCusName" maxlength="50" type="text" style="width: 220px;"></td>
    +			<td align="left"><%--				<input name="jeecgOrderCustomList[#index#].gocSex" maxlength="2" type="text"  style="width:120px;"/>--%> <t:dictSelect field="jeecgOrderCustomList[#index#].gocSex"
    +				typeGroupCode="sex" hasLabel="false"></t:dictSelect></td>
    +			<td align="left"><input name="jeecgOrderCustomList[#index#].gocIdcard" maxlength="32" type="text" style="width: 120px;"></td>
    +			<td align="left"><input name="jeecgOrderCustomList[#index#].gocPassportCode" maxlength="32" type="text" style="width: 120px;"></td>
    +			<td align="left"><input name="jeecgOrderCustomList[#index#].gocBussContent" maxlength="100" type="text" style="width: 120px;"></td>
    +			<td align="left"><input name="jeecgOrderCustomList[#index#].gocContent" maxlength="200" type="text" style="width: 120px;"></td>
    +		</tr>
    +	</tbody>
    +</table>
    +
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgOrderMainList.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgOrderMainList.jsp
    new file mode 100644
    index 00000000..395865ed
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgOrderMainList.jsp
    @@ -0,0 +1,22 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="jeecgOrderMainList" title="璁㈠崟淇℃伅" actionUrl="jeecgOrderMainController.do?datagrid" idField="id" fit="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="璁㈠崟鍙" frozenColumn="true" field="goOrderCode"></t:dgCol>
    +	<t:dgCol title="璁㈠崟绫诲瀷" field="goderType" replace="浼樿川璁㈠崟_1,鏅氳鍗昣2"></t:dgCol>
    +	<t:dgCol title="椤惧绫诲瀷 " field="usertype" replace="绛剧害瀹㈡埛_1,鏅氬鎴穇2"></t:dgCol>
    +	<t:dgCol title="鑱旂郴浜" field="goContactName"></t:dgCol>
    +	<t:dgCol title="鎵嬫満" field="goTelphone"></t:dgCol>
    +	<t:dgCol title="璁㈠崟浜烘暟" field="goOrderCount"></t:dgCol>
    +	<t:dgCol title="鎬讳环(涓嶅惈杩旀)" field="goAllPrice"></t:dgCol>
    +	<t:dgCol title="杩旀" field="goReturnPrice"></t:dgCol>
    +	<t:dgCol title="澶囨敞" field="goContent"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="鍒犻櫎" url="jeecgOrderMainController.do?del&id={id}" />
    +	<t:dgToolBar title="褰曞叆" icon="icon-add" url="jeecgOrderMainController.do?addorupdate" funname="add" width="1000" height="400"></t:dgToolBar>
    +	<t:dgToolBar title="缂栬緫" icon="icon-edit" url="jeecgOrderMainController.do?addorupdate" funname="update" width="1000" height="400"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jeecgOrderProductList.jsp b/src/main/webapp/webpage/jeecg/demo/test/jeecgOrderProductList.jsp
    new file mode 100644
    index 00000000..c65f2272
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jeecgOrderProductList.jsp
    @@ -0,0 +1,76 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<script type="text/javascript">
    +	$('#addBtn').linkbutton({   
    +	    iconCls: 'icon-add'  
    +	});  
    +	$('#delBtn').linkbutton({   
    +	    iconCls: 'icon-remove'  
    +	}); 
    +	$('#addBtn').bind('click', function(){   
    + 		 var tr =  $("#add_jeecgOrderProduct_table_template tr").clone();
    +	 	 $("#add_jeecgOrderProduct_table").append(tr);
    +	 	 resetTrNum('add_jeecgOrderProduct_table');
    +    });  
    +	$('#delBtn').bind('click', function(){   
    +       $("#add_jeecgOrderProduct_table").find("input:checked").parent().parent().remove();   
    +        resetTrNum('add_jeecgOrderProduct_table');
    +    });
    +	$(document).ready(function(){
    +		$(".datagrid-toolbar").parent().css("width","auto");
    +		//灏嗚〃鏍肩殑琛ㄥご鍥哄畾
    +	    $("#jeecgOrderProduct_table").createhftable({
    +	    	height:'200px',
    +			width:'auto',
    +			fixFooter:false
    +			});
    +});
    +</script>
    +
    +<div style="padding: 3px; height: 25px; width: width: 900px;" class="datagrid-toolbar"><a id="addBtn" href="#">娣诲姞</a> <a id="delBtn" href="#">鍒犻櫎</a></div>
    +<table border="0" cellpadding="2" cellspacing="0" id="jeecgOrderProduct_table">
    +	<tr bgcolor="#E6E6E6">
    +		<td align="center" bgcolor="#EEEEEE">搴忓彿</td>
    +		<td align="left" bgcolor="#EEEEEE">浜у搧鍚嶇О</td>
    +		<td align="left" bgcolor="#EEEEEE">涓暟</td>
    +		<td align="left" bgcolor="#EEEEEE">鏈嶅姟椤圭洰绫诲瀷</td>
    +		<td align="left" bgcolor="#EEEEEE">鍗曚环</td>
    +		<td align="left" bgcolor="#EEEEEE">灏忚</td>
    +		<td align="left" bgcolor="#EEEEEE">澶囨敞</td>
    +	</tr>
    +	<tbody id="add_jeecgOrderProduct_table">
    +		<c:if test="${fn:length(jeecgOrderProductList)  <= 0 }">
    +			<tr>
    +				<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +				<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧鍚嶇О锛" datatype="s6-10" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸悕绉板簲璇ヤ负6鍒10浣" name="jeecgOrderProductList[0].gopProductName" maxlength="100" type="text" value=""
    +					style="width: 220px;"></td>
    +				<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧涓暟锛" datatype="n" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佷釜鏁板繀椤讳负鏁板瓧" name="jeecgOrderProductList[0].gopCount" maxlength="10" type="text" value="" style="width: 120px;"></td>
    +				<td align="left"><%--			<input name="jeecgOrderProductList[0].gopProductType" maxlength="3" type="text" value=""  style="width:120px;" >--%> <t:dictSelect
    +					field="jeecgOrderProductList[0].gopProductType" typeGroupCode="service" hasLabel="false" defaultVal="${poVal.gocSex}"></t:dictSelect></td>
    +				<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧鍗曚环锛" datatype="d" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸崟浠峰~鍐欎笉姝g‘" name="jeecgOrderProductList[0].gopOnePrice" maxlength="10" type="text" value=""
    +					style="width: 120px;"></td>
    +				<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧灏忚锛" datatype="d" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸皬璁″~鍐欎笉姝g‘" name="jeecgOrderProductList[0].gopSumPrice" maxlength="10" type="text" value=""
    +					style="width: 120px;"></td>
    +				<td align="left"><input name="jeecgOrderProductList[0].gopContent" maxlength="200" type="text" value="" style="width: 120px;"></td>
    +			</tr>
    +		</c:if>
    +		<c:if test="${fn:length(jeecgOrderProductList)  > 0 }">
    +			<c:forEach items="${jeecgOrderProductList}" var="poVal" varStatus="stuts">
    +				<tr>
    +					<td align="center"><input style="width: 20px;" type="checkbox" name="ck" /></td>
    +					<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧鍚嶇О锛" datatype="s6-10" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸悕绉板簲璇ヤ负6鍒10浣" name="jeecgOrderProductList[${stuts.index }].gopProductName" maxlength="100" type="text"
    +						value="${poVal.gopProductName}" style="width: 220px;"></td>
    +					<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧涓暟锛" datatype="n" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佷釜鏁板繀椤讳负鏁板瓧" name="jeecgOrderProductList[${stuts.index }].gopCount" maxlength="10" type="text"
    +						value="${poVal.gopCount }" style="width: 120px;"></td>
    +					<td align="left"><%--			<input name="jeecgOrderProductList[${stuts.index }].gopProductType" maxlength="3" type="text" value="${poVal.gopProductType }"  style="width:120px;" >--%> <t:dictSelect
    +						field="jeecgOrderProductList[${stuts.index }].gopProductType" typeGroupCode="service" hasLabel="false" defaultVal="${poVal.gopProductType}"></t:dictSelect></td>
    +					<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧鍗曚环锛" datatype="d" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸崟浠峰~鍐欎笉姝g‘" name="jeecgOrderProductList[${stuts.index }].gopOnePrice" maxlength="10" type="text"
    +						value="${poVal.gopOnePrice }" style="width: 120px;"></td>
    +					<td align="left"><input nullmsg="璇疯緭鍏ヨ鍗曚骇鍝佹槑缁嗙殑浜у搧灏忚锛" datatype="d" errormsg="璁㈠崟浜у搧鏄庣粏鐨勪骇鍝佸皬璁″~鍐欎笉姝g‘" name="jeecgOrderProductList[${stuts.index }].gopSumPrice" maxlength="10" type="text"
    +						value="${poVal.gopSumPrice }" style="width: 120px;"></td>
    +					<td align="left"><input name="jeecgOrderProductList[${stuts.index }].gopContent" maxlength="200" type="text" value="${poVal.gopContent }" style="width: 120px;"></td>
    +				</tr>
    +			</c:forEach>
    +		</c:if>
    +	</tbody>
    +</table>
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jpPerson.jsp b/src/main/webapp/webpage/jeecg/demo/test/jpPerson.jsp
    new file mode 100644
    index 00000000..899e6766
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jpPerson.jsp
    @@ -0,0 +1,37 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>Excel瀵煎嚭</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="jpPersonController.do?save">
    +	<input id="id" name="id" type="hidden" value="${jpPersonPage.id }">
    +	<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 骞撮緞: </label></td>
    +			<td class="value"><input class="inputxt" id="age" name="age" ignore="ignore" value="${jpPersonPage.age}" datatype="n"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鐢熸棩: </label></td>
    +			<td class="value"><input class="Wdate" onClick="WdatePicker()" style="width: 150px" id="birthday" name="birthday"
    +				value="<fmt:formatDate value='${jpPersonPage.birthday}' type="date" pattern="yyyy-MM-dd"/>" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鍑虹敓鏃ユ湡: </label></td>
    +			<td class="value"><input class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px" id="createdt" name="createdt" ignore="ignore"
    +				value="<fmt:formatDate value='${jpPersonPage.createdt}' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鐢ㄦ埛鍚: </label></td>
    +			<td class="value"><input class="inputxt" id="name" name="name" value="${jpPersonPage.name}" datatype="*"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 宸ヨ祫: </label></td>
    +			<td class="value"><input class="inputxt" id="salary" name="salary" ignore="ignore" value="${jpPersonPage.salary}" datatype="d"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/jpPersonList.jsp b/src/main/webapp/webpage/jeecg/demo/test/jpPersonList.jsp
    new file mode 100644
    index 00000000..b002d64f
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/jpPersonList.jsp
    @@ -0,0 +1,31 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<script type="text/javascript" charset="utf-8">
    +	/*
    +	 *	excel瀵煎嚭
    +	 */
    +	function jpPersonListExportXls() {
    +		 window.location.href="jpPersonController.do?exportXls";
    +	}
    +	
    +	function jpPersonListImportXls() {
    +		add('Excel瀵煎叆', 'jpPersonController.do?goImplXls', "jpPersonList");
    +	}
    +</script>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="jpPersonList" title="Excel瀵煎嚭" actionUrl="jpPersonController.do?datagrid" idField="id" fit="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="骞撮緞" field="age"></t:dgCol>
    +	<t:dgCol title="鐢熸棩" field="birthday" formatter="yyyy-MM-dd"></t:dgCol>
    +	<t:dgCol title="鍑虹敓鏃ユ湡" field="createdt" formatter="yyyy-MM-dd hh:mm:ss"></t:dgCol>
    +	<t:dgCol title="鐢ㄦ埛鍚" field="name"></t:dgCol>
    +	<t:dgCol title="宸ヨ祫" field="salary"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="鍒犻櫎" url="jpPersonController.do?del&id={id}" />
    +	<t:dgToolBar title="褰曞叆" icon="icon-add" url="jpPersonController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="缂栬緫" icon="icon-edit" url="jpPersonController.do?addorupdate" funname="update"></t:dgToolBar>
    +	<t:dgToolBar title="瀵煎嚭excel" onclick="jpPersonListExportXls();"></t:dgToolBar>
    +	<t:dgToolBar title="瀵煎叆excel" onclick="jpPersonListImportXls()"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/optimisticLocking.jsp b/src/main/webapp/webpage/jeecg/demo/test/optimisticLocking.jsp
    new file mode 100644
    index 00000000..3f739dd7
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/optimisticLocking.jsp
    @@ -0,0 +1,28 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>涔愯閿佹祴璇</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="optimisticLockingController.do?save">
    +	<input id="id" name="id" type="hidden" value="${optimisticLockingPage.id }">
    +	<input id="ver" name="ver" type="hidden" value="${optimisticLockingPage.ver}">
    +	<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> name: </label></td>
    +			<td class="value"><input class="inputxt" id="name" name="name" ignore="ignore" value="${optimisticLockingPage.name}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> age: </label></td>
    +			<td class="value"><input class="inputxt" id="age" name="age" ignore="ignore" value="${optimisticLockingPage.age}" datatype="n"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> account: </label></td>
    +			<td class="value"><input class="inputxt" id="account" name="account" ignore="ignore" value="${optimisticLockingPage.account}" datatype="n"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/optimisticLockingList.jsp b/src/main/webapp/webpage/jeecg/demo/test/optimisticLockingList.jsp
    new file mode 100644
    index 00000000..2822cb1e
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/optimisticLockingList.jsp
    @@ -0,0 +1,17 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="optimisticLockingList" title="涔愯閿佹祴璇" actionUrl="optimisticLockingController.do?datagrid" idField="id" fit="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="name" field="name"></t:dgCol>
    +	<t:dgCol title="age" field="age"></t:dgCol>
    +	<t:dgCol title="account" field="account"></t:dgCol>
    +	<t:dgCol title="ver" field="ver"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="鍒犻櫎" url="optimisticLockingController.do?del&id={id}" />
    +	<t:dgToolBar title="褰曞叆" icon="icon-add" url="optimisticLockingController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="缂栬緫" icon="icon-edit" url="optimisticLockingController.do?addorupdate" funname="update"></t:dgToolBar>
    +	<t:dgToolBar title="鏌ョ湅" icon="icon-search" url="optimisticLockingController.do?addorupdate" funname="detail"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/tFinance.jsp b/src/main/webapp/webpage/jeecg/demo/test/tFinance.jsp
    new file mode 100644
    index 00000000..ffbebdc5
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/tFinance.jsp
    @@ -0,0 +1,121 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html style="overflow-x: hidden;">
    +<head>
    +<title>澶氶檮浠剁鐞</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<script type="text/javascript">
    +  $(function(){
    +    //鏌ョ湅妯″紡鎯呭喌涓,鍒犻櫎鍜屼笂浼犻檮浠跺姛鑳界姝娇鐢
    +	if(location.href.indexOf("load=detail")!=-1){
    +		$(".jeecgDetail").hide();
    +	}
    +   });
    +
    +  	function uploadFile(data){
    +  		$("#financeId").val(data.obj.id);
    +  		if($(".uploadify-queue-item").length>0){
    +  			upload();
    +  		}else{
    +  			frameElement.api.opener.reloadTable();
    +  			frameElement.api.close();
    +  		}
    +  	}
    +  	
    +  	function close(){
    +  		frameElement.api.close();
    +  	}
    +  </script>
    +<!-- 寮瑰嚭椤甸潰绐楀彛澶у皬鎺у埗 -->
    +<style type="text/css">
    +#formobj {
    +	height: 65%;
    +	min-height: 300px;
    +	overflow-y: auto;
    +	overflow-x: auto;
    +	min-width: 600px;
    +}
    +</style>
    +</head>
    +<body>
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" callback="@Override uploadFile" action="tFinanceController.do?save">
    +	<input id="id" name="id" type="hidden" value="${tFinancePage.id }">
    +	<table cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 绫诲埆: </label></td>
    +			<td class="value"><input class="inputxt" id="category" name="category" ignore="ignore" value="${tFinancePage.category}"> <span class="Validform_checktip"></span></td>
    +			<td align="right"><label class="Validform_label"> 骞翠唤: </label></td>
    +			<td class="value"><input class="inputxt" id="happenyear" name="happenyear" ignore="ignore" value="${tFinancePage.happenyear}" datatype="n"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鎷ㄦ鏃堕棿: </label></td>
    +			<td class="value"><input class="Wdate" onClick="WdatePicker()" style="width: 150px" id="paytime" name="paytime" ignore="ignore"
    +				value="<fmt:formatDate value='${tFinancePage.paytime}' type="date" pattern="yyyy-MM-dd"/>"> <span class="Validform_checktip"></span></td>
    +			<td align="right"><label class="Validform_label"> 鏀舵鍗曚綅: </label></td>
    +			<td class="value"><input class="inputxt" id="collectorg" name="collectorg" ignore="ignore" value="${tFinancePage.collectorg}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 鎷ㄦ鏂囦欢绫诲埆: </label></td>
    +			<td class="value"><input class="inputxt" id="approfiletype" name="approfiletype" ignore="ignore" value="${tFinancePage.approfiletype}"> <span class="Validform_checktip"></span></td>
    +			<td align="right"><label class="Validform_label"> 鎸囨爣鏂囧彿: </label></td>
    +			<td class="value"><input class="inputxt" id="zbwno" name="zbwno" ignore="ignore" value="${tFinancePage.zbwno}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> 閲戦鍚堣: </label></td>
    +			<td class="value"><input class="inputxt" id="moneytotal" name="moneytotal" ignore="ignore" value="${tFinancePage.moneytotal}" datatype="d"> <span class="Validform_checktip"></span></td>
    +			<td align="right"><label class="Validform_label"> 鏀嚭绉戠洰: </label></td>
    +			<td class="value"><input class="inputxt" id="expenseaccount" name="expenseaccount" ignore="ignore" value="${tFinancePage.expenseaccount}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label">闄勪欢:</label></td>
    +			<td colspan="3" class="value"><input type="hidden" value="${tFinancePage.id}" id="financeId" name="financeId" />
    +			<table>
    +				<c:forEach items="${tFinancePage.financeFiles}" var="financeFile">
    +					<tr style="height: 34px;">
    +						<td>${financeFile.attachmenttitle}</td>
    +						<td><a href="commonController.do?viewFile&fileid=${financeFile.id}&subclassname=org.jeecgframework.web.demo.entity.test.TFinanceFilesEntity" title="涓嬭浇">涓嬭浇</a></td>
    +						<td><a href="javascript:void(0);"
    +							onclick="openwindow('棰勮','commonController.do?openViewFile&fileid=${financeFile.id}&subclassname=org.jeecgframework.web.demo.entity.test.TFinanceFilesEntity','fList','800','700')">棰勮</a></td>
    +						<td><a href="javascript:void(0)" class="jeecgDetail" onclick="del('tFinanceController.do?delFile&id=${financeFile.id}',this)">鍒犻櫎</a></td>
    +					</tr>
    +				</c:forEach>
    +			</table>
    +			</td>
    +		</tr>
    +		<tr>
    +			<td></td>
    +			<td colspan="3" class="value"><script type="text/javascript">
    +					$.dialog.setting.zIndex =1990;
    +					function del(url,obj){
    +						$.dialog.confirm("纭鍒犻櫎璇ユ潯璁板綍?", function(){
    +						  	$.ajax({
    +								async : false,
    +								cache : false,
    +								type : 'POST',
    +								url : url,// 璇锋眰鐨刟ction璺緞
    +								error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +								},
    +								success : function(data) {
    +									var d = $.parseJSON(data);
    +									if (d.success) {
    +										var msg = d.msg;
    +										tip(msg);
    +										$(obj).closest("tr").hide("slow");
    +									}
    +								}
    +							});  
    +						}, function(){
    +						});
    +					}
    +					</script>
    +			<div class="form" id="filediv"></div>
    +			<div class="form jeecgDetail">
    +			<t:upload name="fiels" id="file_upload" extend="*.doc;*.docx;*.txt;*.ppt;*.xls;*.xlsx;*.html;*.htm;*.pdf;" buttonText="娣诲姞鏂囦欢" formId="formobj" uploader="tFinanceController.do?saveFiles">
    +			</t:upload>
    +				</div>
    +			</td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/tFinanceList.jsp b/src/main/webapp/webpage/jeecg/demo/test/tFinanceList.jsp
    new file mode 100644
    index 00000000..f67daf55
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/tFinanceList.jsp
    @@ -0,0 +1,30 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +<t:datagrid name="tFinanceList" title="澶氶檮浠剁鐞" actionUrl="tFinanceController.do?datagrid" fitColumns="true" idField="id" fit="true" queryMode="group">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="绫诲埆" field="category" query="true"></t:dgCol>
    +	<t:dgCol title="骞翠唤" field="happenyear"></t:dgCol>
    +	<t:dgCol title="鎷ㄦ鏃堕棿" field="paytime" formatter="yyyy-MM-dd hh:mm:ss" query="true" queryMode="group"></t:dgCol>
    +	<t:dgCol title="鏀舵鍗曚綅" field="collectorg"></t:dgCol>
    +	<t:dgCol title="鎷ㄦ鏂囦欢绫诲埆" field="approfiletype"></t:dgCol>
    +	<t:dgCol title="鎸囨爣鏂囧彿" field="zbwno"></t:dgCol>
    +	<t:dgCol title="閲戦鍚堣" field="moneytotal" query="true"></t:dgCol>
    +	<t:dgCol title="鏀嚭绉戠洰" field="expenseaccount"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt"></t:dgCol>
    +	<t:dgDelOpt title="鍒犻櫎" url="tFinanceController.do?del&id={id}" />
    +	<t:dgToolBar title="褰曞叆" icon="icon-add" url="tFinanceController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="缂栬緫" icon="icon-edit" url="tFinanceController.do?addorupdate" funname="update"></t:dgToolBar>
    +	<t:dgToolBar title="鏌ョ湅" icon="icon-search" url="tFinanceController.do?addorupdate" funname="detail"></t:dgToolBar>
    +</t:datagrid>
    +</div>
    +</div>
    +<script type="text/javascript">
    +	$(document).ready(function(){
    +		$("input[name='paytime_begin']").attr("class","easyui-datebox");
    +		$("input[name='paytime_end']").attr("class","easyui-datebox");
    +		$("input[name='buyprojectorg']").prev().css("width","105px");
    +	});
    + </script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/upload.jsp b/src/main/webapp/webpage/jeecg/demo/test/upload.jsp
    new file mode 100644
    index 00000000..2bb52e4f
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/upload.jsp
    @@ -0,0 +1,17 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>Excel瀵煎叆</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" beforeSubmit="upload">
    +	<fieldset class="step">
    +	<div class="form"><t:upload name="fiels" buttonText="閫夋嫨瑕佸鍏ョ殑鏂囦欢" uploader="jpPersonController.do?importExcel" extend="*.xls;*.xlsx" id="file_upload" formData="documentTitle"></t:upload></div>
    +	<div class="form" id="filediv" style="height: 50px"></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/webOffice.jsp b/src/main/webapp/webpage/jeecg/demo/test/webOffice.jsp
    new file mode 100644
    index 00000000..da8c996a
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/webOffice.jsp
    @@ -0,0 +1,36 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>WebOffice渚嬪瓙</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="webOfficeController.do?save">
    +	<input id="id" name="id" type="hidden" value="${webOfficePage.id }">
    +	<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right"><label class="Validform_label"> docid: </label></td>
    +			<td class="value"><input class="inputxt" id="docid" name="docid" ignore="ignore" value="${webOfficePage.docid}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> doctitle: </label></td>
    +			<td class="value"><input class="inputxt" id="doctitle" name="doctitle" ignore="ignore" value="${webOfficePage.doctitle}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> doctype: </label></td>
    +			<td class="value"><input class="inputxt" id="doctype" name="doctype" ignore="ignore" value="${webOfficePage.doctype}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> docdate: </label></td>
    +			<td class="value"><input class="Wdate" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" style="width: 150px" id="docdate" name="docdate" ignore="ignore"
    +				value="<fmt:formatDate value='${webOfficePage.docdate}' type="date" pattern="yyyy-MM-dd hh:mm:ss"/>"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> doccontent: </label></td>
    +			<td class="value"><input class="inputxt" id="doccontent" name="doccontent" ignore="ignore" value="${webOfficePage.doccontent}"> <span class="Validform_checktip"></span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/webOfficeEdit.jsp b/src/main/webapp/webpage/jeecg/demo/test/webOfficeEdit.jsp
    new file mode 100644
    index 00000000..ca85805c
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/webOfficeEdit.jsp
    @@ -0,0 +1,114 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    +
    +<HTML>
    +<HEAD>
    +<TITLE>weboffice婕旂ず椤甸潰</TITLE>
    +<!-- --------------------=== 璋冪敤Weboffice鍒濆鍖栨柟娉 ===--------------------- -->
    +<SCRIPT language=javascript event=NotifyCtrlReady for=WebOffice1>
    +/****************************************************
    +*
    +*	鍦ㄨ杞藉畬Weboffice(鎵ц<object>...</object>)
    +*	鎺т欢鍚庢墽琛 "WebOffice1_NotifyCtrlReady"鏂规硶
    +*
    +****************************************************/
    +	WebOffice1_NotifyCtrlReady();
    +</SCRIPT>
    +
    +
    +<SCRIPT language=javascript>
    +/****************************************************
    +*
    +*		鎺т欢鍒濆鍖朩ebOffice鏂规硶
    +*
    +****************************************************/
    +function WebOffice1_NotifyCtrlReady() {
    +	document.all.WebOffice1.ShowToolBar(0);
    +	//document.all.WebOffice1.SetWindowText("WebOffice", 0);
    +	document.all.WebOffice1.OptionFlag |= 128;
    +	var sFileType = "${fileType}";//doc,xls,ppt,wps
    +	if ("${docId}" != "") {
    +		document.all.WebOffice1.LoadOriginalFile("./webOfficeController.do?getDoc&fileId=${docId}", sFileType);
    +	} else {
    +		// 鏂板缓鏂囨。
    +		document.all.WebOffice1.LoadOriginalFile("", sFileType);
    +	}
    +}
    +function window_onunload() {
    +	document.all.WebOffice1.Close();
    +}
    +function newDoc() {
    +	document.all.WebOffice1.ShowToolBar(0);
    +	var doctype=document.all.doctype.value;
    +	document.all.WebOffice1.LoadOriginalFile("", doctype);
    +}
    +
    +// 鎵撳紑鏈湴鏂囦欢
    +function docOpen() {
    +	document.all.WebOffice1.LoadOriginalFile("open", "doc");
    +}
    +function newSave() {
    +	document.all.WebOffice1.Save();
    +}
    +function SaveAsTo() {
    +	document.all.WebOffice1.ShowDialog(84);
    +}
    +function SaveDoc() {
    +	var returnValue;
    +	 if(myform.DocTitle.value ==""){
    +		alert("鏍囬涓嶅彲涓虹┖")
    +		myform.DocTitle.focus();
    +		return false;
    +	}
    +	if(myform.DocID.value ==""){
    +		alert("鏂囧彿涓嶅彲涓虹┖")
    +		myform.DocID.focus();
    +		return false;
    +	}
    +	
    +	document.all.WebOffice1.HttpInit();			//鍒濆鍖朒ttp寮曟搸
    +	// 娣诲姞鐩稿簲鐨凱ost鍏冪礌 
    +	document.all.WebOffice1.HttpAddPostString("id", "${docId}");
    +	document.all.WebOffice1.HttpAddPostString("doctitle", myform.DocTitle.value);
    +	document.all.WebOffice1.HttpAddPostString("docid", myform.DocID.value);
    +	document.all.WebOffice1.HttpAddPostString("doctype",myform.doctype.value);
    +	document.all.WebOffice1.HttpAddPostCurrFile("DocContent","");		// 涓婁紶鏂囦欢
    +
    +	returnValue = document.all.WebOffice1.HttpPost("./webOfficeController.do?saveDoc&fileId=${docId}");	// 鍒ゆ柇涓婁紶鏄惁鎴愬姛
    +	if("succeed" == returnValue){
    +		alert("鏂囦欢涓婁紶鎴愬姛");	
    +	}else if("failed" == returnValue)
    +		alert("鏂囦欢涓婁紶澶辫触")
    +	return_onclick(); 
    +}
    +</SCRIPT>
    +</HEAD>
    +<BODY style="BACKGROUND: #ccc" onunload="return window_onunload()">
    +<form name="myform">
    +<table width="1123" border="0" cellpadding="1" cellspacing="3">
    +	<tr bgcolor="#8CBFE9">
    +		<td height="15" valign="top" class="downSide"><font size="-1">&nbsp;&nbsp; 鏂囨。缂栧彿:</font> <input name="DocID" value="${docData.docid}" size="14"> <span class="STYLE1"> | </span> <font
    +			size="-1">&nbsp;&nbsp; 鏍 棰:</font> <input name="DocTitle" value="${docData.doctitle}" size="14"> <span class="STYLE1"> | </span> <font size="-1">&nbsp;&nbsp;&nbsp;鏂囦欢鏍煎紡: </font> <select
    +			name="doctype" size="1" id="doctype" ${docId!='' ?"disabled='true' ":""} onchange="newDoc()">
    +			<option value="doc" ${docData.doctype== 'doc'?"selected='selected'":""}>Word</option>
    +			<option value="xls" ${docData.doctype== 'xls'?"selected='selected'":""}>Excel</option>
    +			<option value="ppt" ${docData.doctype== 'ppt'?"selected='selected'":""}>Powerpoint</option>
    +			<option value="wps" ${docData.doctype== 'wps'?"selected='selected'":""}>wps</option>
    +		</select> <span class="STYLE1">|</span> <input name="button9" type="button" onClick="return SaveDoc()" value="涓婁紶鍒版湇鍔″櫒" classs="rollout"> <span class="STYLE1">|</span> <input name="button"
    +			type="button" onClick="return docOpen()" value="鎵撳紑鏈湴鏂囦欢" /></td>
    +		<td></td>
    +	</tr>
    +	<tr>
    +		<td colspan="2" rowspan="12" valign="top"><!-- -----------------------------== 瑁呰浇weboffice鎺т欢 ==--------------------------------- --> <SCRIPT>
    +					var s = ""
    +						s += "<object id=WebOffice1 height=500 width='100%' style='LEFT: 0px; TOP: 0px' classid='clsid:E77E049B-23FC-4DB8-B756-60529A35FAD5' codebase='${webRoot}/plug-in/webOffice/weboffice_v6.0.5.0.cab#Version=6,0,5,0'>"
    +						s +="<param name='_ExtentX' value='6350'><param name='_ExtentY' value='6350'>"
    +						s +="</OBJECT>"			
    +						document.write(s)
    +				</SCRIPT> <!-- --------------------------------== 缁撴潫瑁呰浇鎺т欢 ==----------------------------------- --></td>
    +	</tr>
    +</table>
    +</form>
    +</BODY>
    +</HTML>
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/webOfficeList.jsp b/src/main/webapp/webpage/jeecg/demo/test/webOfficeList.jsp
    new file mode 100644
    index 00000000..72e44742
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/webOfficeList.jsp
    @@ -0,0 +1,22 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="webOfficeList" title="WebOffice渚嬪瓙" actionUrl="webOfficeController.do?datagrid" idField="id" fit="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="鏂囨。缂栧彿" field="docid"></t:dgCol>
    +	<t:dgCol title="鏂囨。鏍囬" field="doctitle"></t:dgCol>
    +	<t:dgCol title="鏂囨。绉嶇被" field="doctype"></t:dgCol>
    +	<t:dgCol title="鍒涘缓鏃堕棿" field="docdate" formatter="yyyy-MM-dd hh:mm:ss"></t:dgCol>
    +	<t:dgCol title="鏂囨。鍐呭" field="doccontent" hidden="true"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgFunOpt funname="editOfficeDocument(id)" title="鏂囨。缂栬緫" />
    +	<t:dgDelOpt title="鍒犻櫎" url="webOfficeController.do?del&id={id}" />
    +	<t:dgToolBar title="鏂板缓鏂囨。" icon="icon-add" url="webOfficeController.do?newDocument&fileType=doc" funname="add"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +<script type="text/javascript">
    +function editOfficeDocument(docid) {
    +	createwindow("鏂囨。缂栬緫",'webOfficeController.do?newDocument&id='+docid);
    +}
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/jeecg/demo/test/webOfficeSample.jsp b/src/main/webapp/webpage/jeecg/demo/test/webOfficeSample.jsp
    new file mode 100644
    index 00000000..bbc3cee5
    --- /dev/null
    +++ b/src/main/webapp/webpage/jeecg/demo/test/webOfficeSample.jsp
    @@ -0,0 +1,242 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    +<html>
    +<head>
    +<TITLE>weboffice婕旂ず椤甸潰${webRoot}</TITLE>
    +<LINK href="${webRoot}/plug-in/webOffice/style.css" type=text/css rel=stylesheet>
    +<SCRIPT src="${webRoot}/plug-in/webOffice/main.js" type=text/javascript></SCRIPT>
    +<!-- --------------------=== 璋冪敤Weboffice鍒濆鍖栨柟娉 ===--------------------- -->
    +<SCRIPT language=javascript event=NotifyCtrlReady for=WebOffice1>
    +/****************************************************
    +*
    +*	鍦ㄨ杞藉畬Weboffice(鎵ц<object>...</object>)
    +*	鎺т欢鍚庢墽琛 "WebOffice1_NotifyCtrlReady"鏂规硶
    +*
    +****************************************************/
    +    WebOffice_Event_Flash("NotifyCtrlReady");
    +	WebOffice1_NotifyCtrlReady()
    +</SCRIPT>
    +
    +<SCRIPT language=javascript event=NotifyWordEvent(eventname) for=WebOffice1>WebOffice_Event_Flash("NotifyWordEvent");
    + WebOffice1_NotifyWordEvent(eventname);
    + 
    +</SCRIPT>
    +
    +<SCRIPT language=javascript event=NotifyToolBarClick(iIndex) for=WebOffice1>  WebOffice_Event_Flash("NotifyToolBarClick");
    + WebOffice1_NotifyToolBarClick(iIndex);
    +</SCRIPT>
    +
    +<SCRIPT language=javascript>
    +/****************************************************
    +*
    +*		鎺т欢鍒濆鍖朩ebOffice鏂规硶
    +*
    +****************************************************/
    +function WebOffice1_NotifyCtrlReady() {
    +	document.all.WebOffice1.SetWindowText("鎺堟潈XX(鍙氳繃鎺ュ彛鑷畾涔)", 0);
    +	document.all.WebOffice1.OptionFlag |= 128;
    +	// 鏂板缓鏂囨。
    +	//document.all.WebOffice1.LoadOriginalFile("", "doc");
    +	spnWebOfficeInfo.innerText="----   鎮ㄧ數鑴戜笂瀹夎鐨刉ebOffice鐗堟湰涓:V" + document.all.WebOffice1.GetOcxVersion() +"\t\t\t鏈疄渚嬫槸鏍规嵁鐗堟湰V6044缂栧啓";
    +}
    +var flag=false;
    +function menuOnClick(id){
    +	var id=document.getElementById(id);
    +	var dis=id.style.display;
    +	if(dis!="none"){
    +		id.style.display="none";
    +		
    +	}else{
    +		id.style.display="block";
    +	}
    +}
    +/****************************************************
    +*
    +*		鎺ユ敹office浜嬩欢澶勭悊鏂规硶
    +*
    +****************************************************/
    +var vNoCopy = 0;
    +var vNoPrint = 0;
    +var vNoSave = 0;
    +var vClose=0;
    +function no_copy(){
    +	vNoCopy = 1;
    +}
    +function yes_copy(){
    +	vNoCopy = 0;
    +}
    +
    +
    +function no_print(){
    +	vNoPrint = 1;
    +}
    +function yes_print(){
    +	vNoPrint = 0;
    +}
    +
    +
    +function no_save(){
    +	vNoSave = 1;
    +}
    +function yes_save(){
    +	vNoSave = 0;
    +}
    +function EnableClose(flag){
    + vClose=flag;
    +}
    +function CloseWord(){
    +	
    +  document.all.WebOffice1.CloseDoc(0); 
    +}
    +
    +function WebOffice1_NotifyWordEvent(eventname) {
    +	if(eventname=="DocumentBeforeSave"){
    +		if(vNoSave){
    +			document.all.WebOffice1.lContinue = 0;
    +			alert("姝ゆ枃妗e凡缁忕姝繚瀛");
    +		}else{
    +			document.all.WebOffice1.lContinue = 1;
    +		}
    +	}else if(eventname=="DocumentBeforePrint"){
    +		if(vNoPrint){
    +			document.all.WebOffice1.lContinue = 0;
    +			alert("姝ゆ枃妗e凡缁忕姝㈡墦鍗");
    +		}else{
    +			document.all.WebOffice1.lContinue = 1;
    +		}
    +	}else if(eventname=="WindowSelectionChange"){
    +		if(vNoCopy){
    +			document.all.WebOffice1.lContinue = 0;
    +			//alert("姝ゆ枃妗e凡缁忕姝㈠鍒");
    +		}else{
    +			document.all.WebOffice1.lContinue = 1;
    +		}
    +	}else   if(eventname =="DocumentBeforeClose"){
    +	    if(vClose==0){
    +	    	document.all.WebOffice1.lContinue=0;
    +	    } else{
    +	    	//alert("word");
    +		    document.all.WebOffice1.lContinue = 1;
    +		  }
    + }
    +	//alert(eventname); 
    +}
    +</SCRIPT>
    +<META content="MSHTML 6.00.2900.5921" name=GENERATOR>
    +</HEAD>
    +<BODY style="BACKGROUND: #ccc" onunload="return window_onunload()">
    +<CENTER>
    +<DIV style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #fff; PADDING-BOTTOM: 0px; MARGIN: -10px 0px 0px; WIDTH: 1024px; PADDING-TOP: 10px; HEIGHT: 750px" align=center>
    +<FORM name=myform>
    +<TABLE class=TableBlock width="90%">
    +	<TBODY>
    +		<TR class=TableHeader>
    +			<TD colSpan=2 valign=middle><font size=3> WebOffice婕旂ず椤甸潰(HTML)</font> <font color="#ff0000" size=-1><Span ID=spnWebOfficeInfo align="right"></Span> </font></TD>
    +		</TR>
    +		<tr>
    +			<td width="100">浜嬩欢鍒楄〃锛</td>
    +			<td><textarea name="commandtext" cols=100 rows=3></textarea><br>
    +			</td>
    +		</tr>
    +	</TBODY>
    +</TABLE>
    +<BR>
    +<TABLE class=TableBlock width="90%">
    +	<TBODY>
    +		<TR>
    +			<TD class=leftTableData vAlign=top width="15%">
    +			<DIV class=menuItem onclick="menuOnClick('chc')">甯哥敤鎺ュ彛璋冪敤</DIV>
    +			<DIV id=chc style="DISPLAY: none"><!-- ---------------=== 璇ュ鏂囦欢鏍煎紡鐨剉alue涓嶅彲浠ヨ嚜瀹氫箟 ===------------------------- --> <SELECT id=doctype size=1 name=doctype>
    +				<OPTION value=doc selected>Word</OPTION>
    +				<OPTION value=xls>Excel</OPTION>
    +				<OPTION value=wps>wps</OPTION>
    +			</SELECT> <INPUT class=btn id=CreateFile onclick=newDoc() type=button value=鏂板缓鏂囨。 name=CreateFile> <INPUT class=btn onclick="return docOpen()" type=button value=鎵撳紑鏈湴鏂囦欢 name=button> <INPUT
    +				class=btn id=showPrint onclick=showPrintDialog() type=button value=鏄剧ず瀵硅瘽妗 name=CreateFile4> <INPUT class=btn id=zhiPrints onclick=zhiPrint() type=button value=鐩存帴鎵撳嵃 name=zhiPrints> <INPUT
    +				class=btn id=CreateFile2 onclick=newSave() type=button value=淇濆瓨 name=CreateFile2> <INPUT class=btn id=CreateFile3 onclick=SaveAsTo() type=button value=鍙﹀瓨涓 name=CreateFile3></DIV>
    +			<DIV class=menuItem onclick="menuOnClick('docSafe')">鏂囨。瀹夊叏璁剧疆</DIV>
    +			<DIV id=docSafe style="DISPLAY: none">淇濇姢瀵嗙爜锛 <INPUT style="WIDTH: 74px" maxLength=10 value=Password name=docPwd> <INPUT class=btn onclick="return ProtectFull()" type=button value=淇濇姢鏂囨。>
    +			<INPUT class=btn onclick="return UnProtect()" type=button value=瑙i櫎淇濇姢 name=button3> <INPUT class=btn onclick="return notPrint()" type=button value=绂佺敤鎵撳嵃> <INPUT class=btn
    +				onclick="return okPrint()" type=button value=鍚敤鎵撳嵃 name=button3> <INPUT class=btn onclick="return notSave()" type=button value=绂佹淇濆瓨 name=button10> <INPUT class=btn
    +				onclick="return okSave()" type=button value=鍏佽淇濆瓨 name=button32> <INPUT class=btn onclick="return notCopy()" type=button value=绂佹澶嶅埗 name=button11> <INPUT class=btn
    +				onclick="return okCopy()" type=button value=鍏佽澶嶅埗 name=button33> <INPUT class=btn onclick="return notDrag()" type=button value=绂佹鎷栧姩 name=but11> <INPUT class=btn
    +				onclick="return okDrag()" type=button value=鍏佽鎷栧姩 name=but33> 浜嬩欢鎺у埗鏂瑰紡锛 <INPUT class=btn onclick="return no_print()" type=button value=绂佺敤鎵撳嵃> <INPUT class=btn
    +				onclick="return yes_print()" type=button value=鍚敤鎵撳嵃 name=button3> <INPUT class=btn onclick="return no_save()" type=button value=绂佹淇濆瓨 name=button10> <INPUT class=btn
    +				onclick="return yes_save()" type=button value=鍏佽淇濆瓨 name=button32> <INPUT class=btn onclick="return no_copy()" type=button value=绂佹澶嶅埗 name=button11> <INPUT class=btn
    +				onclick="return yes_copy()" type=button value=鍏佽澶嶅埗 name=button33></DIV>
    +			<DIV class=menuItem onclick="menuOnClick('recension')">淇鎿嶄綔</DIV>
    +			<DIV id=recension style="DISPLAY: none"><INPUT style="WIDTH: 74px" maxLength=10 value=Test name=UserName> <INPUT class=btn onclick="return SetUserName()" type=button value=璁剧疆鐢ㄦ埛
    +				name=button2> <INPUT class=btn onclick="return ProtectRevision()" type=button value=淇鏂囨。 name=button4> <INPUT class=btn onclick="return ExitRevisions()" type=button value=閫鍑轰慨璁
    +				name=button42> <INPUT class=btn onclick="return ShowRevisions()" type=button value=鏄剧ず淇 name=button5> <INPUT class=btn onclick="return UnShowRevisions()" type=button value=闅愯棌淇
    +				name=button6> <INPUT class=btn onclick="return AcceptAllRevisions()" type=button value=鎺ュ彈鎵鏈変慨璁 name=button7> <INPUT class=btn onclick="return unAcceptAllRevisions()" type=button
    +				value=鎷掔粷鎵鏈変慨璁 name=button72> <INPUT class=btn onclick="return GetRevAllInfo()" type=button value=鑾峰彇淇淇℃伅 name=button922></DIV>
    +			<DIV class=menuItem onclick="menuOnClick('markset')">涔︾鎿嶄綔</DIV>
    +			<DIV id=markset style="DISPLAY: none"><INPUT class=btn onclick="return addBookmark()" type=button value=璁剧疆涔︾ name=button8> <INPUT class=btn onclick="return taohong()" type=button
    +				value=濂楃孩 name=button8></DIV>
    +			<DIV class=menuItem onclick="menuOnClick('off03menu')">Office03鑿滃崟璁剧疆</DIV>
    +			<DIV id=off03menu style="DISPLAY: none"><INPUT class=btn onclick="return hideAll('','','','')" type=button value=闅愯棌鎵鏈 name=button12> <INPUT class=btn onclick="return notMenu()"
    +				type=button value=闅愯棌鑿滃崟 name=button12> <INPUT class=btn onclick="return okMenu()" type=button value=鏄剧ず鑿滃崟 name=button12> <INPUT class=btn onclick="return notOfter()" type=button
    +				value=闅愯棌甯哥敤 name=button12> <INPUT class=btn onclick="return okOfter()" type=button value=鏄剧ず甯哥敤 name=button12> <INPUT class=btn onclick="return notFormat()" type=button value=闅愯棌鏍煎紡
    +				name=button12> <INPUT class=btn onclick="return okFormat()" type=button value=鏄剧ず鏍煎紡 name=button12></DIV>
    +			<DIV class=menuItem onclick="menuOnClick('off03menuItem')">Office03鑿滃崟椤</DIV>
    +			<DIV id=off03menuItem style="DISPLAY: none"><INPUT class=btn onclick="return hideFileMenu()" type=button value=闅愯棌鏂囦欢 name=button122> <INPUT class=btn onclick="return showFileMenu()"
    +				type=button value=鏄剧ず鏂囦欢 name=button123> <INPUT class=btn onclick="return hideEditMenu()" type=button value=闅愯棌缂栬緫 name=button124> <INPUT class=btn onclick="return showEditMenu()"
    +				type=button value=鏄剧ず缂栬緫 name=button125></DIV>
    +			<DIV class=menuItem onclick="menuOnClick('off03tool')">Office03宸ュ叿鏍忛」</DIV>
    +			<DIV id=off03tool style="DISPLAY: none"><INPUT class=btn onclick="return hideNewItem()" type=button value=闅愯棌鏂板缓 name=button1222> <INPUT class=btn onclick="return showNewItem()"
    +				type=button value=鏄剧ず鏂板缓 name=button1232> <INPUT class=btn onclick="return hideOpenItem()" type=button value=闅愯棌鎵撳紑 name=button1242> <INPUT class=btn onclick="return showOpenItem()"
    +				type=button value=鏄剧ず鎵撳紑 name=button1252> <INPUT class=btn onclick="return hideSaveItem()" type=button value=闅愯棌淇濆瓨 name=button1242> <INPUT class=btn onclick="return showSaveItem()"
    +				type=button value=鏄剧ず淇濆瓨 name=button1252></DIV>
    +			<DIV class=menuItem onclick="menuOnClick('off07menu')">Office07鑿滃崟璁剧疆</DIV>
    +			<DIV id=off07menu style="DISPLAY: none"><INPUT class=btn onclick="return hideAll('hideall','','','')" type=button value=闅愯棌鍏ㄩ儴 name=button12222> <INPUT class=btn
    +				onclick="return hideAll('showmenu','','','')" type=button value=鏄剧ず鍏ㄩ儴 name=button12222> <INPUT class=btn onclick="return hideAll('','','','')" type=button value=闅愯棌鍔熻兘鍖 name=button12222>
    +			<INPUT class=btn onclick="return hideAll('show','','','')" type=button value=鏄剧ず鍔熻兘鍖 name=button12222> <INPUT class=btn onclick="return beginMenu_onclick()" type=button value=闅愯棌寮濮
    +				name=button12222> <INPUT class=btn onclick="return insertMenu_onclick()" type=button value=闅愯棌鎻掑叆 name=button12322> <INPUT class=btn onclick="return pageMenu_onclick()" type=button
    +				value=闅愯棌椤甸潰甯冨眬 name=button12422> <INPUT class=btn onclick="return adducMenu_onclick()" type=button value=闅愯棌寮曠敤 name=button12522> <INPUT class=btn onclick="return emailMenu_onclick()"
    +				type=button value=闅愯棌閭欢 name=button12422> <INPUT class=btn onclick="return checkMenu_onclick()" type=button value=闅愯棌瀹¢槄 name=button12522> <INPUT class=btn
    +				onclick="return viewMenu_onclick()" type=button value=闅愯棌瑙嗗浘 name=button125222> <INPUT class=btn onclick="return empolderMenu_onclick()" type=button value=闅愯棌寮鍙戝伐鍏 name=button124222> <INPUT
    +				class=btn onclick="return loadMenu_onclick()" type=button value=闅愯棌鍔犺浇椤 name=button125222> <INPUT class=btn onclick="return allHideMenu_onclick()" type=button value=闅愯棌鍏ㄩ儴 name=button1242222>
    +			<INPUT class=btn onclick="return nullityCopy_onclick()" type=button value=澶嶅埗鏃犳晥 name=button12422222> <INPUT class=btn onclick="return nullityAffix_onclick()" type=button value=绮樿创鏃犳晥
    +				name=button12422223> <INPUT class=btn onclick="return affixCopy_onclick()" type=button value=鎭㈠ name=button1252222></DIV>
    +			<DIV class=menuItem onclick="menuOnClick('webofficeTool')">weboffice宸ュ叿鏍</DIV>
    +			<DIV id=webofficeTool style="DISPLAY: none"><INPUT language=javascript class=btn onclick="return bToolBar_onclick()" type=button value=宸ュ叿鏍(闅/鏄) name=bToolBar> <INPUT
    +				language=javascript class=btn onclick="return bToolBar_New_onclick()" type=button value=鏂板缓鏂囨。(闅/鏄) name=bToolBar_New> <INPUT language=javascript class=btn
    +				onclick="return bToolBar_Open_onclick()" type=button value=鎵撳紑鏂囨。(闅/鏄) name=bToolBar_Open> <INPUT language=javascript class=btn onclick="return bToolBar_Save_onclick()" type=button
    +				value=淇濆瓨鏂囨。(闅/鏄) name=bToolBar_Save></DIV>
    +			<DIV class=menuItem onclick="menuOnClick('tools')">鑷畾涔夊伐鍏锋爮</DIV>
    +			<DIV id=tools style="DISPLAY: none"><INPUT class=btn onclick="return SetCustomToolBtn(0,'鎵╁睍閽竴')" type=button value=娣诲姞鎵╁睍閽竴 name=EnableClose1> <INPUT class=btn
    +				onclick="return SetCustomToolBtn(1,'鎵╁睍閽簩')" type=button value=娣诲姞鎵╁睍閽簩 name=EnableClose1> <INPUT class=btn onclick="return SetCustomToolBtn(2,'鎵╁睍閽笁')" type=button value=娣诲姞鎵╁睍閽笁
    +				name=EnableClose1> <INPUT class=btn onclick="return SetCustomToolBtn(3,'鎵╁睍閽洓')" type=button value=娣诲姞鎵╁睍閽洓 name=EnableClose1> <INPUT class=btn
    +				onclick="return SetCustomToolBtn(4,'鎵╁睍閽簲')" type=button value=娣诲姞鎵╁睍閽簲 name=EnableClose1></DIV>
    +
    +			<DIV class=menuItem onclick="menuOnClick('word')">灞忚斀word鍏抽棴鎸夐挳</DIV>
    +			<DIV id=word style="DISPLAY: none"><INPUT class=btn onclick="return EnableClose(0)" type=button value=绂佺敤Word鍏抽棴 name=EnableClose1> <INPUT class=btn onclick="return EnableClose(1)"
    +				type=button value=鍚敤Word鍏抽棴 name=EnableClose2> <INPUT class=btn onclick="return CloseWord()" type=button value=鍏抽棴Word name=closeWord></DIV>
    +			<DIV class=menuItem onclick="menuOnClick('face')">鎹㈣偆</DIV>
    +			<DIV id=face style="DISPLAY: none"><INPUT class=btn onclick="return ChangeFace(1)" type=button value=娓╅Θ娴极 name=EnableClose1> <INPUT class=btn onclick="return ChangeFace(2)"
    +				type=button value=娣辨矇鍎掗泤 name=EnableClose1> <INPUT class=btn onclick="return ChangeFace(3)" type=button value=office椋庢牸 name=EnableClose1></DIV>
    +
    +			<DIV class=menuItem onclick="menuOnClick('base64')">base64</DIV>
    +			<DIV id=base64 style="DISPLAY: none"><INPUT class=btn id=CreateFile4 onclick=GetFileBase64() type=button value=鑾峰彇鏂囨。鐨刡ase64鍊 name=CreateFile4> <INPUT class=btn id=CreateFile5
    +				onclick=SaveBinaryFileFromBase64() type=button value=灏哹ase64鍊煎瓨鍥炴枃浠 name=CreateFile5> <textarea name="FileBase64" rows="10" cols="16"></textarea></DIV>
    +
    +			<DIV class=menuItem onclick="menuOnClick('other')">鍏跺畠</DIV>
    +			<DIV id=other style="DISPLAY: none"><INPUT language=javascript class=btn onclick="return bToolBar_FullScreen_onclick()" type=button value="鍏  灞" name=bToolBar_FullScreen> <INPUT
    +				class=btn id=CreateFile32 onclick=TestVBA() type=button value=VBA璋冪敤 name=CreateFile32> <INPUT class=btn onclick="return UnActiveExcel()" type=button value=閫鍑篍xcel缂栬緫鐘舵 name=EnableClose1></DIV>
    +			</TD>
    +			<TD class=TableData vAlign=top width="85%"><!-- -----------------------------== 瑁呰浇weboffice鎺т欢 ==--------------------------------- --> <SCRIPT>
    +									var s = ""
    +										s += "<object id=WebOffice1 height=500 width='100%' style='LEFT: 0px; TOP: 0px' classid='clsid:E77E049B-23FC-4DB8-B756-60529A35FAD5' codebase='${webRoot}/plug-in/webOffice/weboffice_v6.0.5.0.cab#Version=6,0,5,0'>"
    +										s +="<param name='_ExtentX' value='6350'><param name='_ExtentY' value='6350'>"
    +										s +="</OBJECT>"			
    +										document.write(s)
    +								</SCRIPT> <!-- --------------------------------== 缁撴潫瑁呰浇鎺т欢 ==----------------------------------- --></TD>
    +		</TR>
    +	</TBODY>
    +</TABLE>
    +</FORM>
    +</DIV>
    +</CENTER>
    +</BODY>
    +
    +</html>
    diff --git a/src/main/webapp/webpage/login/init.jsp b/src/main/webapp/webpage/login/init.jsp
    new file mode 100644
    index 00000000..10b814f8
    --- /dev/null
    +++ b/src/main/webapp/webpage/login/init.jsp
    @@ -0,0 +1,32 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<html>
    +<head>
    +<script type="text/javascript" src="plug-in/jquery/jquery-1.8.3.min.js"></script>
    +<script type="text/javascript">
    +	$(document).ready(function() {
    +	 var browserversion = "";
    +	 //IE8+娴忚鍣
    +	 if ($.browser.msie) {
    +		 browserversion = "IE" + $.browser.version;
    +	 }
    +	 //璋锋瓕娴忚鍣
    +	 if ($.browser.webkit) {
    +		 browserversion = "Chrome" + $.browser.version; 
    +	 }
    +	 //鐏嫄娴忚鍣
    +	 if ($.browser.mozilla) {
    +		 browserversion = "Mozilla Firefox" + $.browser.version;
    +	 }
    +	 //娆ф湅娴忚鍣
    +	 if ($.browser.opera) {
    +		 browserversion = "Opera" + $.browser.version;
    +	 }
    +	 
    +	 window.location.href = "loginController.do?login";
    +	 
    + });
    +</script>
    +</head>
    +<body>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/login/login.jsp b/src/main/webapp/webpage/login/login.jsp
    new file mode 100644
    index 00000000..feb1c63f
    --- /dev/null
    +++ b/src/main/webapp/webpage/login/login.jsp
    @@ -0,0 +1,140 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@page import="org.jeecgframework.core.util.SysThemesUtil,org.jeecgframework.core.enums.SysThemesEnum"%> 
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<%
    +String lang = org.jeecgframework.core.util.BrowserUtils.getBrowserLanguage(request);
    +String langurl = "plug-in/mutiLang/" + lang +".js";
    +SysThemesEnum sysTheme = SysThemesUtil.getSysTheme(request);
    +String lhgdialogTheme = SysThemesUtil.getLhgdialogTheme(sysTheme);
    +%>
    +
    +<html>
    +<head>
    +<title></title>
    +<link rel="shortcut icon" href="resources/fc/images/icon/favicon.ico">
    +<script src=<%=langurl%> type="text/javascript"></script>
    +<!--[if lt IE 9]>
    +   <script src="plug-in/login/js/html5.js"></script>
    +  <![endif]-->
    +<!--[if lt IE 7]>
    +  <script src="plug-in/login/js/iepng.js" type="text/javascript"></script>
    +  <script type="text/javascript">
    +	EvPNG.fix('div, ul, img, li, input'); //EvPNG.fix('鍖呭惈閫忔槑PNG鍥剧墖鐨勬爣绛'); 澶氫釜鏍囩涔嬮棿鐢ㄨ嫳鏂囬楀彿闅斿紑銆
    +</script>
    +  <![endif]-->
    +<link href="plug-in/login/css/zice.style.css" rel="stylesheet" type="text/css" />
    +<link href="plug-in/login/css/buttons.css" rel="stylesheet" type="text/css" />
    +<link href="plug-in/login/css/icon.css" rel="stylesheet" type="text/css" />
    +<link rel="stylesheet" type="text/css" href="plug-in/login/css/tipsy.css" media="all" />
    +<style type="text/css">
    +html {
    +	background-image: none;
    +}
    +
    +label.iPhoneCheckLabelOn span {
    +	padding-left: 0px
    +}
    +
    +#versionBar {
    +	background-color: #212121;
    +	position: fixed;
    +	width: 100%;
    +	height: 35px;
    +	bottom: 0;
    +	left: 0;
    +	text-align: center;
    +	line-height: 35px;
    +	z-index: 11;
    +	-webkit-box-shadow: black 0px 10px 10px -10px inset;
    +	-moz-box-shadow: black 0px 10px 10px -10px inset;
    +	box-shadow: black 0px 10px 10px -10px inset;
    +}
    +
    +.copyright {
    +	text-align: center;
    +	font-size: 10px;
    +	color: #CCC;
    +}
    +
    +.copyright a {
    +	color: #A31F1A;
    +	text-decoration: none
    +}
    +
    +.on_off_checkbox {
    +	width: 0px;
    +}
    +
    +#login .logo {
    +	width: 500px;
    +	height: 51px;
    +}
    +</style>
    +</head>
    +<body>
    +    <div id="alertMessage"></div>
    +    <div id="successLogin"></div>
    +    <div class="text_success"><img src="plug-in/login/images/loader_green.gif" alt="Please wait" /> <span><t:mutiLang langKey="common.login.success.wait"/></span></div>
    +    <div id="login">
    +        <div class="ribbon" style="background-image: url(plug-in/login/images/typelogin.png);"></div>
    +        <div class="inner">
    +            <div class="logo"><img src="plug-in/login/images/head.png" /><img src="plug-in/login/images/foot.png" /></div>
    +            <div class="formLogin">
    +                <form name="formLogin" id="formLogin" action="loginController.do?login" check="loginController.do?checkuser" method="post">
    +                    <input name="userKey" type="hidden" id="userKey" value="D1B5CC2FE46C4CC983C073BCA897935608D926CD32992B5900" />
    +                    <div class="tip">
    +                        <input class="userName" name="userName" type="text" id="userName" title="" iscookie="true" value="admin" nullmsg="" />
    +                    </div>
    +                    <div class="tip">
    +                        <input class="password" name="password" type="password" id="password" title="" value="123456" nullmsg="" />
    +                    </div>
    +                    <div>
    +                        <div style="float: right; margin-left:-150px; margin-right: 20px;">
    +                            <img id="randCodeImage" src="randCodeImage" />
    +                        </div>
    +                        <input class="randCode" name="randCode" type="text" id="randCode" title="" value="" nullmsg="" />
    +                    </div>
    +                    <%--update-end--Author:zhangguoming  Date:20140226 for锛氭坊鍔犻獙璇佺爜--%>
    +                   
    +                    <div class="loginButton">
    +                        <div style="float: left; margin-left: -9px;">
    +                            <input type="checkbox" id="on_off" name="remember" checked="ture" class="on_off_checkbox" value="0" />
    +                            <span class="f_help"><t:mutiLang langKey="common.remember.user"/></span>
    +                        </div>                        
    +                        <div style="float: right; padding: 3px 0; margin-right: -12px;">
    +                            <div>
    +                                <ul class="uibutton-group">
    +                                    <li><a class="uibutton normal" href="#" id="but_login"><t:mutiLang langKey="common.login"/></a></li>
    +                                    <li><a class="uibutton normal" href="#" id="forgetpass"><t:mutiLang langKey="common.reset"/></a></li>
    +                                </ul>
    +                            </div>
    +                            <%-- 
    +                            <div style="float: left; margin-left: 30px;"><a href="init.jsp"><span class="f_help"><t:mutiLang langKey="common.init.data"/></span></a></div>
    +                            --%>
    +                            <br>                            
    +                            <t:dictSelect id="langCode" field="langCode" typeGroupCode="lang" hasLabel="false" defaultVal="zh-cn"></t:dictSelect>
    +                        </div>
    +                        <div class="clear"></div>
    +                    </div>
    +                </form>
    +            </div>
    +        </div>
    +        <div class="shadow"></div>
    +    </div>
    +    <!--Login div-->
    +    <div class="clear"></div>
    +    <div id="versionBar">
    +        <div class="copyright">&copy; <t:mutiLang langKey="common.copyright"/> <span class="tip"><a href="#" title=<t:mutiLang langKey="common.platform"/>>jeecg</a> <t:mutiLang langKey="common.browser.recommend"/>:<a href="#" title=<t:mutiLang langKey="common.platform"/>>jeecg</a></span></div>
    +    </div>
    +    <!-- Link JScript-->
    +    <script type="text/javascript" src="plug-in/jquery/jquery-1.8.3.min.js"></script>
    +    <script type="text/javascript" src="plug-in/jquery/jquery.cookie.js"></script>
    +    <script type="text/javascript" src="plug-in/login/js/jquery-jrumble.js"></script>
    +    <script type="text/javascript" src="plug-in/login/js/jquery.tipsy.js"></script>
    +    <script type="text/javascript" src="plug-in/login/js/iphone.check.js"></script>
    +    <script type="text/javascript" src="plug-in/login/js/login.js"></script>
    + <!--    <script type="text/javascript" src="plug-in/lhgDialog/lhgdialog.min.js"></script> -->
    +    <%=lhgdialogTheme %>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/login/pwd_init.jsp b/src/main/webapp/webpage/login/pwd_init.jsp
    new file mode 100644
    index 00000000..c08fc89e
    --- /dev/null
    +++ b/src/main/webapp/webpage/login/pwd_init.jsp
    @@ -0,0 +1,15 @@
    +<%@ page language="java" pageEncoding="UTF-8"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>admin瀵嗙爜鍒濆鍖</title>
    +</head>
    +<body>
    +init pwd....
    +<script type="text/javascript">
    +		window.setTimeout(function() {
    +			window.location.replace('loginController.do?pwdInit');
    +		}, 1000);
    +	</script>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/login/timeout.jsp b/src/main/webapp/webpage/login/timeout.jsp
    new file mode 100644
    index 00000000..d410247c
    --- /dev/null
    +++ b/src/main/webapp/webpage/login/timeout.jsp
    @@ -0,0 +1,22 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +
    +<!-- Link JScript-->
    +<script type="text/javascript" src="plug-in/jquery/jquery-1.8.3.min.js"></script>
    +<script type="text/javascript" src="plug-in/jquery/jquery.cookie.js"></script>
    +<script type="text/javascript" src="plug-in/login/js/jquery-jrumble.js"></script>
    +<script type="text/javascript" src="plug-in/login/js/jquery.tipsy.js"></script>
    +<script type="text/javascript" src="plug-in/login/js/iphone.check.js"></script>
    +<script type="text/javascript" src="plug-in/login/js/login.js"></script>
    +<script type="text/javascript">
    +	    //鍒ゆ柇濡傛灉褰撳墠椤甸潰涓嶄负涓绘鏋讹紝鍒欏皢涓绘鏋惰繘琛岃烦杞
    +	  	var tagert_URL = "<%=request.getContextPath()%>/loginController.do?login";
    +	    if(self==top){
    +	    	window.location.href = tagert_URL;
    +	    }else{
    +	    	top.location.href = tagert_URL;
    +	    }
    +	  </script>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/main/ace_main.jsp b/src/main/webapp/webpage/main/ace_main.jsp
    new file mode 100644
    index 00000000..667b699c
    --- /dev/null
    +++ b/src/main/webapp/webpage/main/ace_main.jsp
    @@ -0,0 +1,840 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html lang="en">
    +	<head>
    +		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    +		<meta charset="utf-8" />
    +		<title><t:mutiLang langKey="jeect.platform"/></title>
    +		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
    +		<!-- bootstrap & fontawesome -->
    +		<link rel="stylesheet" href="plug-in/ace/css/bootstrap.css" />
    +		<link rel="stylesheet" href="plug-in/ace/css/font-awesome.css" />
    +		<link rel="stylesheet" type="text/css" href="plug-in/accordion/css/accordion.css">
    +		<!-- text fonts -->
    +		<link rel="stylesheet" href="plug-in/ace/css/ace-fonts.css" />
    +
    +		<link rel="stylesheet" href="plug-in/ace/css/jquery-ui.css" />
    +		<!-- ace styles -->
    +		<link rel="stylesheet" href="plug-in/ace/css/ace.css" class="ace-main-stylesheet" id="main-ace-style" />
    +	
    +		<!--[if lte IE 9]>
    +			<link rel="stylesheet" href="plug-in/ace/css/ace-part2.css" class="ace-main-stylesheet" />
    +		<![endif]-->
    +
    +		<!--[if lte IE 9]>
    +		  <link rel="stylesheet" href="plug-in/ace/css/ace-ie.css" />
    +		<![endif]-->
    +		<!-- ace settings handler -->
    +		<script src="plug-in/ace/js/ace-extra.js"></script>
    +
    +		<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
    +
    +		<!--[if lte IE 8]>
    +		<script src="plug-in/ace/js/html5shiv.js"></script>
    +		<script src="plug-in/ace/js/respond.js"></script>
    +		<![endif]-->
    +
    +	</head>
    +
    +	<body class="no-skin">
    +		<!-- #section:basics/navbar.layout -->
    +		<div id="navbar" class="navbar navbar-default">
    +			<script type="text/javascript">
    +				try{ace.settings.check('navbar' , 'fixed')}catch(e){}
    +			</script>
    +
    +			<div class="navbar-container" id="navbar-container">
    +				<!-- #section:basics/sidebar.mobile.toggle -->
    +				<button type="button" class="navbar-toggle menu-toggler pull-left" id="menu-toggler" data-target="#sidebar">
    +					<span class="sr-only">Toggle sidebar</span>
    +
    +					<span class="icon-bar"></span>
    +
    +					<span class="icon-bar"></span>
    +
    +					<span class="icon-bar"></span>
    +				</button>
    +
    +				<!-- /section:basics/sidebar.mobile.toggle -->
    +				<div class="navbar-header pull-left">
    +					<!-- #section:basics/navbar.layout.brand -->
    +					<a href="#" class="navbar-brand">
    +						<small>
    +							<!-- <i class="fa fa-leaf"></i> -->
    +							JEECG 婕旂ず绯荤粺
    +						</small>
    +					</a>
    +					<!-- /section:basics/navbar.layout.brand -->
    +
    +					<!-- #section:basics/navbar.toggle -->
    +
    +					<!-- /section:basics/navbar.toggle -->
    +				</div>
    +
    +				<!-- #section:basics/navbar.dropdown -->
    +				<div class="navbar-buttons navbar-header pull-right" role="navigation">
    +					<ul class="nav ace-nav">
    +						<li class="grey">
    +							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
    +								<i class="ace-icon fa fa-tasks"></i>
    +								<span class="badge badge-grey">4</span>
    +							</a>
    +
    +							<ul class="dropdown-menu-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
    +								<li class="dropdown-header">
    +									<i class="ace-icon fa fa-check"></i>
    +									4 Tasks to complete
    +								</li>
    +
    +								<li class="dropdown-content">
    +									<ul class="dropdown-menu dropdown-navbar">
    +										<li>
    +											<a href="#">
    +												<div class="clearfix">
    +													<span class="pull-left">Software Update</span>
    +													<span class="pull-right">65%</span>
    +												</div>
    +
    +												<div class="progress progress-mini">
    +													<div style="width:65%" class="progress-bar"></div>
    +												</div>
    +											</a>
    +										</li>
    +
    +										<li>
    +											<a href="#">
    +												<div class="clearfix">
    +													<span class="pull-left">Hardware Upgrade</span>
    +													<span class="pull-right">35%</span>
    +												</div>
    +
    +												<div class="progress progress-mini">
    +													<div style="width:35%" class="progress-bar progress-bar-danger"></div>
    +												</div>
    +											</a>
    +										</li>
    +
    +										<li>
    +											<a href="#">
    +												<div class="clearfix">
    +													<span class="pull-left">Unit Testing</span>
    +													<span class="pull-right">15%</span>
    +												</div>
    +
    +												<div class="progress progress-mini">
    +													<div style="width:15%" class="progress-bar progress-bar-warning"></div>
    +												</div>
    +											</a>
    +										</li>
    +
    +										<li>
    +											<a href="#">
    +												<div class="clearfix">
    +													<span class="pull-left">Bug Fixes</span>
    +													<span class="pull-right">90%</span>
    +												</div>
    +
    +												<div class="progress progress-mini progress-striped active">
    +													<div style="width:90%" class="progress-bar progress-bar-success"></div>
    +												</div>
    +											</a>
    +										</li>
    +									</ul>
    +								</li>
    +
    +								<li class="dropdown-footer">
    +									<a href="#">
    +										See tasks with details
    +										<i class="ace-icon fa fa-arrow-right"></i>
    +									</a>
    +								</li>
    +							</ul>
    +						</li>
    +
    +						<li class="purple">
    +							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
    +								<i class="ace-icon fa fa-bell icon-animated-bell"></i>
    +								<span class="badge badge-important">8</span>
    +							</a>
    +
    +							<ul class="dropdown-menu-right dropdown-navbar navbar-pink dropdown-menu dropdown-caret dropdown-close">
    +								<li class="dropdown-header">
    +									<i class="ace-icon fa fa-exclamation-triangle"></i>
    +									8 Notifications
    +								</li>
    +
    +								<li class="dropdown-content">
    +									<ul class="dropdown-menu dropdown-navbar navbar-pink">
    +										<li>
    +											<a href="#">
    +												<div class="clearfix">
    +													<span class="pull-left">
    +														<i class="btn btn-xs no-hover btn-pink fa fa-comment"></i>
    +														New Comments
    +													</span>
    +													<span class="pull-right badge badge-info">+12</span>
    +												</div>
    +											</a>
    +										</li>
    +
    +										<li>
    +											<a href="#">
    +												<i class="btn btn-xs btn-primary fa fa-user"></i>
    +												Bob just signed up as an editor ...
    +											</a>
    +										</li>
    +
    +										<li>
    +											<a href="#">
    +												<div class="clearfix">
    +													<span class="pull-left">
    +														<i class="btn btn-xs no-hover btn-success fa fa-shopping-cart"></i>
    +														New Orders
    +													</span>
    +													<span class="pull-right badge badge-success">+8</span>
    +												</div>
    +											</a>
    +										</li>
    +
    +										<li>
    +											<a href="#">
    +												<div class="clearfix">
    +													<span class="pull-left">
    +														<i class="btn btn-xs no-hover btn-info fa fa-twitter"></i>
    +														Followers
    +													</span>
    +													<span class="pull-right badge badge-info">+11</span>
    +												</div>
    +											</a>
    +										</li>
    +									</ul>
    +								</li>
    +
    +								<li class="dropdown-footer">
    +									<a href="#">
    +										See all notifications
    +										<i class="ace-icon fa fa-arrow-right"></i>
    +									</a>
    +								</li>
    +							</ul>
    +						</li>
    +
    +						<li class="green">
    +							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
    +								<i class="ace-icon fa fa-envelope icon-animated-vertical"></i>
    +								<span class="badge badge-success">5</span>
    +							</a>
    +
    +							<ul class="dropdown-menu-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
    +								<li class="dropdown-header">
    +									<i class="ace-icon fa fa-envelope-o"></i>
    +									5 Messages
    +								</li>
    +
    +								<li class="dropdown-content">
    +									<ul class="dropdown-menu dropdown-navbar">
    +										<li>
    +											<a href="#" class="clearfix">
    +												<img src="plug-in/ace/avatars/avatar.png" class="msg-photo" alt="Alex's Avatar" />
    +												<span class="msg-body">
    +													<span class="msg-title">
    +														<span class="blue">Alex:</span>
    +														Ciao sociis natoque penatibus et auctor ...
    +													</span>
    +
    +													<span class="msg-time">
    +														<i class="ace-icon fa fa-clock-o"></i>
    +														<span>a moment ago</span>
    +													</span>
    +												</span>
    +											</a>
    +										</li>
    +
    +										<li>
    +											<a href="#" class="clearfix">
    +												<img src="plug-in/ace/avatars/avatar3.png" class="msg-photo" alt="Susan's Avatar" />
    +												<span class="msg-body">
    +													<span class="msg-title">
    +														<span class="blue">Susan:</span>
    +														Vestibulum id ligula porta felis euismod ...
    +													</span>
    +
    +													<span class="msg-time">
    +														<i class="ace-icon fa fa-clock-o"></i>
    +														<span>20 minutes ago</span>
    +													</span>
    +												</span>
    +											</a>
    +										</li>
    +
    +										<li>
    +											<a href="#" class="clearfix">
    +												<img src="plug-in/ace/avatars/avatar4.png" class="msg-photo" alt="Bob's Avatar" />
    +												<span class="msg-body">
    +													<span class="msg-title">
    +														<span class="blue">Bob:</span>
    +														Nullam quis risus eget urna mollis ornare ...
    +													</span>
    +
    +													<span class="msg-time">
    +														<i class="ace-icon fa fa-clock-o"></i>
    +														<span>3:15 pm</span>
    +													</span>
    +												</span>
    +											</a>
    +										</li>
    +
    +										<li>
    +											<a href="#" class="clearfix">
    +												<img src="plug-in/ace/avatars/avatar2.png" class="msg-photo" alt="Kate's Avatar" />
    +												<span class="msg-body">
    +													<span class="msg-title">
    +														<span class="blue">Kate:</span>
    +														Ciao sociis natoque eget urna mollis ornare ...
    +													</span>
    +
    +													<span class="msg-time">
    +														<i class="ace-icon fa fa-clock-o"></i>
    +														<span>1:33 pm</span>
    +													</span>
    +												</span>
    +											</a>
    +										</li>
    +
    +										<li>
    +											<a href="#" class="clearfix">
    +												<img src="plug-in/ace/avatars/avatar5.png" class="msg-photo" alt="Fred's Avatar" />
    +												<span class="msg-body">
    +													<span class="msg-title">
    +														<span class="blue">Fred:</span>
    +														Vestibulum id penatibus et auctor  ...
    +													</span>
    +
    +													<span class="msg-time">
    +														<i class="ace-icon fa fa-clock-o"></i>
    +														<span>10:09 am</span>
    +													</span>
    +												</span>
    +											</a>
    +										</li>
    +									</ul>
    +								</li>
    +
    +								<li class="dropdown-footer">
    +									<a href="ajax.html#page/inbox">
    +										See all messages
    +										<i class="ace-icon fa fa-arrow-right"></i>
    +									</a>
    +								</li>
    +							</ul>
    +						</li>
    +
    +						<!-- #section:basics/navbar.user_menu -->
    +						<li class="light-blue">
    +							<a data-toggle="dropdown" href="#" class="dropdown-toggle">
    +								<img class="nav-user-photo" src="plug-in/ace/avatars/user.jpg" alt="Jason's Photo" />
    +								<span class="user-info">
    +									<small>Welcome,${userName }</small>
    +									<span style="color: #CC33FF">
    +                    <span style="color: #CC33FF"><t:mutiLang langKey="common.role"/>:</span>
    +                    <span style="color: #666633">${roleName }</span>
    +								</span>
    +
    +								<i class="ace-icon fa fa-caret-down"></i>
    +							</a>
    +
    +							<ul class="user-menu dropdown-menu-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close">
    +								<li>
    +									<a href="javascript:add('<t:mutiLang langKey="common.change.password"/>','userController.do?changepassword','',550,200)">
    +										<i class="ace-icon fa fa-cog"></i>
    +										 <t:mutiLang langKey="common.change.password"/>
    +									</a>
    +								</li>
    +
    +								<li>
    +									<a href="javascript:openwindow('<t:mutiLang langKey="common.profile"/>','userController.do?userinfo')">
    +										<i class="ace-icon fa fa-user"></i>
    +										 <t:mutiLang langKey="common.profile"/>
    +									</a>
    +								</li>
    +								<li>
    +									<a href="javascript:add('<t:mutiLang langKey="common.change.style"/>','userController.do?changestyle','',550,200)">
    +										<i class="ace-icon fa fa-user"></i>
    +										 <t:mutiLang langKey="common.my.style"/>
    +									</a>
    +								</li>
    +
    +								<li>
    +									<a href="javascript:clearLocalstorage()">
    +										<i class="ace-icon fa fa-warning"></i>
    +										<t:mutiLang langKey="common.clear.localstorage"/>
    +									</a>
    +								</li>
    +
    +								<li class="divider"></li>
    +
    +								<li>
    +									<a href="javascript:logout()">
    +										<i class="ace-icon fa fa-power-off"></i>
    +										 <t:mutiLang langKey="common.logout"/>
    +									</a>
    +								</li>
    +							</ul>
    +						</li>
    +
    +						<!-- /section:basics/navbar.user_menu -->
    +					</ul>
    +				</div>
    +
    +				<!-- /section:basics/navbar.dropdown -->
    +			</div><!-- /.navbar-container -->
    +		</div>
    +
    +		<!-- /section:basics/navbar.layout -->
    +		<div class="main-container" id="main-container">
    +			<script type="text/javascript">
    +				try{ace.settings.check('main-container' , 'fixed')}catch(e){}
    +			</script>
    +
    +			<!-- #section:basics/sidebar -->
    +			<div id="sidebar" class="sidebar                  responsive">
    +				<script type="text/javascript">
    +					try{ace.settings.check('sidebar' , 'fixed')}catch(e){}
    +				</script>
    +
    +				<div class="sidebar-shortcuts" id="sidebar-shortcuts">
    +					<div class="sidebar-shortcuts-large" id="sidebar-shortcuts-large">
    +						<button class="btn btn-success">
    +							<i class="ace-icon fa fa-signal"></i>
    +						</button>
    +
    +						<button class="btn btn-info">
    +							<i class="ace-icon fa fa-pencil"></i>
    +						</button>
    +
    +						<!-- #section:basics/sidebar.layout.shortcuts -->
    +						<button class="btn btn-warning">
    +							<i class="ace-icon fa fa-users"></i>
    +						</button>
    +
    +						<button class="btn btn-danger">
    +							<i class="ace-icon fa fa-cogs"></i>
    +						</button>
    +
    +						<!-- /section:basics/sidebar.layout.shortcuts -->
    +					</div>
    +
    +					<div class="sidebar-shortcuts-mini" id="sidebar-shortcuts-mini">
    +						<span class="btn btn-success"></span>
    +
    +						<span class="btn btn-info"></span>
    +
    +						<span class="btn btn-warning"></span>
    +
    +						<span class="btn btn-danger"></span>
    +					</div>
    +				</div><!-- /.sidebar-shortcuts -->
    +
    +				<ul class="nav nav-list">
    +					<li class="">
    +						<a  href="javascript:loadModule('棣栭〉','loginController.do?home')">
    +							<i class="menu-icon fa fa-tachometer"></i>
    +							<span class="menu-text"> 棣栭〉 </span>
    +						</a>
    +
    +						<b class="arrow"></b>
    +					</li>
    +				<t:menu style="ace" menuFun="${menuMap}"></t:menu>
    +				</ul><!-- /.nav-list -->
    +
    +				<!-- #section:basics/sidebar.layout.minimize -->
    +				<div class="sidebar-toggle sidebar-collapse" id="sidebar-collapse">
    +					<i class="ace-icon fa fa-angle-double-left" data-icon1="ace-icon fa fa-angle-double-left" data-icon2="ace-icon fa fa-angle-double-right"></i>
    +				</div>
    +
    +				<!-- /section:basics/sidebar.layout.minimize -->
    +				<script type="text/javascript">
    +					try{ace.settings.check('sidebar' , 'collapsed')}catch(e){}
    +				</script>
    +			</div>
    +			<div class="main-content" >
    +			    <!-- /section:basics/sidebar -->
    +				<!-- #section:basics/content.breadcrumbs -->
    +				<div class="breadcrumbs" id="breadcrumbs" style="display:none">
    +					<script type="text/javascript">
    +						try{ace.settings.check('breadcrumbs' , 'fixed')}catch(e){}
    +					</script>
    +
    +					<ul class="breadcrumb">
    +						<li>
    +							<i class="ace-icon fa fa-home home-icon"></i>
    +							<a href="#">Home</a>
    +						</li>
    +					</ul><!-- /.breadcrumb -->
    +
    +					<!-- #section:basics/content.searchbox -->
    +					<div class="nav-search" id="nav-search">
    +						<form class="form-search">
    +							<span class="input-icon">
    +								<input type="text" placeholder="Search ..." class="nav-search-input" id="nav-search-input" autocomplete="off" />
    +								<i class="ace-icon fa fa-search nav-search-icon"></i>
    +							</span>
    +						</form>
    +					</div><!-- /.nav-search -->
    +
    +					<!-- /section:basics/content.searchbox -->
    +				</div>
    +
    +				<!-- /section:basics/content.breadcrumbs -->
    +				<div class="page-content" style="padding:0px" >
    +					<!-- #section:settings.box -->
    +					<div class="ace-settings-container" id="ace-settings-container">
    +						<div class="btn btn-app btn-xs btn-warning ace-settings-btn" id="ace-settings-btn">
    +							<i class="ace-icon fa fa-cog bigger-130"></i>
    +						</div>
    +
    +						<div class="ace-settings-box clearfix" id="ace-settings-box">
    +							<div class="pull-left width-50">
    +								<!-- #section:settings.skins -->
    +								<div class="ace-settings-item">
    +									<div class="pull-left">
    +										<select id="skin-colorpicker" class="hide">
    +											<option data-skin="no-skin" value="#438EB9">#438EB9</option>
    +											<option data-skin="skin-1" value="#222A2D">#222A2D</option>
    +											<option data-skin="skin-2" value="#C6487E">#C6487E</option>
    +											<option data-skin="skin-3" value="#D0D0D0">#D0D0D0</option>
    +										</select>
    +									</div>
    +									<span>&nbsp; Choose Skin</span>
    +								</div>
    +
    +								<!-- /section:settings.skins -->
    +
    +								<!-- #section:settings.navbar -->
    +								<div class="ace-settings-item">
    +									<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-navbar" />
    +									<label class="lbl" for="ace-settings-navbar"> Fixed Navbar</label>
    +								</div>
    +
    +								<!-- /section:settings.navbar -->
    +
    +								<!-- #section:settings.sidebar -->
    +								<div class="ace-settings-item">
    +									<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-sidebar" />
    +									<label class="lbl" for="ace-settings-sidebar"> Fixed Sidebar</label>
    +								</div>
    +
    +								<!-- /section:settings.sidebar -->
    +
    +								<!-- #section:settings.breadcrumbs -->
    +								<div class="ace-settings-item">
    +									<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-breadcrumbs" />
    +									<label class="lbl" for="ace-settings-breadcrumbs"> Fixed Breadcrumbs</label>
    +								</div>
    +
    +								<!-- /section:settings.breadcrumbs -->
    +
    +								<!-- #section:settings.rtl -->
    +								<div class="ace-settings-item">
    +									<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-rtl" />
    +									<label class="lbl" for="ace-settings-rtl"> Right To Left (rtl)</label>
    +								</div>
    +
    +								<!-- /section:settings.rtl -->
    +
    +								<!-- #section:settings.container -->
    +								<div class="ace-settings-item">
    +									<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-add-container" />
    +									<label class="lbl" for="ace-settings-add-container">
    +										Inside
    +										<b>.container</b>
    +									</label>
    +								</div>
    +
    +								<!-- /section:settings.container -->
    +							</div><!-- /.pull-left -->
    +
    +							<div class="pull-left width-50">
    +								<!-- #section:basics/sidebar.options -->
    +								<div class="ace-settings-item">
    +									<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-hover" />
    +									<label class="lbl" for="ace-settings-hover"> Submenu on Hover</label>
    +								</div>
    +
    +								<div class="ace-settings-item">
    +									<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-compact" />
    +									<label class="lbl" for="ace-settings-compact"> Compact Sidebar</label>
    +								</div>
    +
    +								<div class="ace-settings-item">
    +									<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-highlight" />
    +									<label class="lbl" for="ace-settings-highlight"> Alt. Active Item</label>
    +								</div>
    +
    +								<!-- /section:basics/sidebar.options -->
    +							</div><!-- /.pull-left -->
    +						</div><!-- /.ace-settings-box -->
    +					</div><!-- /.ace-settings-container -->
    +
    +					<!-- /section:settings.box -->
    +					<div class="page-content-area" data-ajax-content="false"  >
    +					<div  id="tabs" >
    +											<ul style="height:0px">
    +												<li>
    +													<a href="#tabs-1" id="mainTitle">棣栭〉</a>
    +												</li>
    +											</ul>
    +							<div id="tabs-1" style="padding:0px">
    +						 		<iframe style="width:100%;height:700px;margin:0px;padding:0px" scrolling="auto" frameborder="0" id="center"  src="loginController.do?home" ></iframe>
    +							</div>
    +					</div>
    +					</div><!-- /.page-content-area -->
    +				</div><!-- /.page-content -->
    +			</div><!-- /.main-content -->
    +
    +
    +			<div class="footer">
    +				<div class="footer-inner">
    +					<!-- #section:basics/footer -->
    +					<div class="footer-content">
    +						<span class="bigger-120">
    +							<span class="blue bolder">JEECG</span>
    +							Application &copy; 2013-2014
    +						</span>
    +
    +						&nbsp; &nbsp;
    +						<span class="action-buttons">
    +							<a href="#">
    +								<i class="ace-icon fa fa-twitter-square light-blue bigger-150"></i>
    +							</a>
    +
    +							<a href="#">
    +								<i class="ace-icon fa fa-facebook-square text-primary bigger-150"></i>
    +							</a>
    +
    +							<a href="#">
    +								<i class="ace-icon fa fa-rss-square orange bigger-150"></i>
    +							</a>
    +						</span>
    +					</div>
    +
    +					<!-- /section:basics/footer -->
    +				</div>
    +			</div>
    +
    +			<a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
    +				<i class="ace-icon fa fa-angle-double-up icon-only bigger-110"></i>
    +			</a>
    +		</div><!-- /.main-container -->
    +		<!-- basic scripts -->
    +
    +		<!--[if !IE]> -->
    +		<script type="text/javascript">
    +			window.jQuery || document.write("<script src='plug-in/ace/js/jquery.js'>"+"<"+"/script>");
    +		</script>
    +
    +		<!-- <![endif]-->
    +<div id="changestylePanel" style="display:none" ><form id="formobj"  action="userController.do?savestyle" name="formobj" method="post">
    +	<table style="width: 550px" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr><td >椋庢牸</td></tr>
    +			<tr>
    +				<td class="value"><input type="radio" value="default" name="indexStyle" /> <span>缁忓吀椋庢牸</span></td>
    +			</tr>
    +			<!--
    +			<tr>
    +				<td class="value"><input type="radio" value="bootstrap" name="indexStyle" /> <span>BootStrap椋庢牸</span></td>
    +			</tr>
    +			-->
    +			<!-- update-start--Author:gaofeng  Date:2014-01-10 for:鏂板棣栭〉椋庢牸  -->
    +			<tr>
    +				<td class="value"><input type="radio" value="shortcut" name="indexStyle" /> <span>ShortCut椋庢牸</span></td>
    +			</tr>
    +			<!-- update-start--Author:gaofeng  Date:2014-01-24 for:鏂板棣栭〉椋庢牸  -->
    +			<tr>
    +				<td class="value"><input type="radio" value="sliding" name="indexStyle"  /><span>Sliding浜戞闈</span></td>
    +			</tr>
    +			<!-- update-end--Author:longjb  Date:2013-03-15 for:鏂板棣栭〉椋庢牸  -->	
    +			<tr>
    +				<td class="value"><input type="radio" value="ace" name="indexStyle"  /><span>ACE骞抽潰椋庢牸</span></td>
    +			</tr>
    +	</table></form>
    +</div>
    +<div id="changepassword" style="display:none">
    +
    +<input id="id" type="hidden" value="${user.id }">
    +	<table style="width: 550px" cellpadding="0" cellspacing="1" class="formtable">
    +		<tbody>
    +			<tr>
    +				<td align="right" width="20%"><span class="filedzt">鍘熷瘑鐮:</span></td>
    +				<td class="value"><input id="password" type="password" value="" name="password" class="inputxt" datatype="*" errormsg="璇疯緭鍏ュ師瀵嗙爜" /> <span class="Validform_checktip"> 璇疯緭鍏ュ師瀵嗙爜 </span></td>
    +			</tr>
    +			<tr>
    +				<td align="right"><span class="filedzt">鏂板瘑鐮:</span></td>
    +				<td class="value"><input  type="password" value="" name="newpassword" class="inputxt" plugin="passwordStrength" datatype="*6-18" errormsg="瀵嗙爜鑷冲皯6涓瓧绗,鏈澶18涓瓧绗︼紒" /> <span
    +					class="Validform_checktip"> 瀵嗙爜鑷冲皯6涓瓧绗,鏈澶18涓瓧绗︼紒 </span> <span class="passwordStrength" style="display: none;"> <b>瀵嗙爜寮哄害锛</b> <span>寮</span><span>涓</span><span class="last">寮</span> </span></td>
    +			</tr>
    +			<tr>
    +				<td align="right"><span class="filedzt">閲嶅瀵嗙爜:</span></td>
    +				<td class="value"><input id="newpassword" type="password" recheck="newpassword" datatype="*6-18" errormsg="涓ゆ杈撳叆鐨勫瘑鐮佷笉涓鑷达紒"> <span class="Validform_checktip"></span></td>
    +			</tr>
    +		</tbody>
    +	</table>
    +	</div>
    +		<!--[if IE]>
    +<script type="text/javascript">
    + window.jQuery || document.write("<script src='plug-in/ace/js/jquery1x.js'>"+"<"+"/script>");
    +</script>
    +<![endif]-->
    +		<script type="text/javascript">
    +			if('ontouchstart' in document.documentElement) document.write("<script src='plug-in/ace/js/jquery.mobile.custom.js'>"+"<"+"/script>");
    +
    +		function loadModule(title,url,target){
    +			//TODO addTab(title,url);
    +			    $("#mainTitle").text(title);
    +      			$("#center").attr("src",url);
    +      	}
    +		
    +
    +	  	function logout(){
    +	  		bootbox.confirm("Are you sure to logout?", function(result) {
    +	  			if(result)
    +		  			location.href="loginController.do?logout";
    +	  		});
    +  		}
    +		function opendialog(title,url,target){
    +			//$("#dialog").attr("src",url);
    +			bootbox.dialog({
    +				message:$("#changestylePanel").html(),
    +				title:title,
    +				buttons:{
    +				OK:{
    +				label: "OK", 
    +				callback:function(){
    +					    var indexStyle = $('input[name="indexStyle"]:checked').val();
    +					    if(indexStyle==undefined||indexStyle==""){
    +					    	indexStyle = "ace";
    +					    }
    +					    var cssTheme = $('input[name="cssTheme"]:checked').val();
    +					    if(cssTheme==undefined){
    +					    	cssTheme = "";
    +					    }
    +						var form = $("#formobj");//鍙杋frame閲岀殑form
    +						$.ajax({
    +		        			url:form.attr('action'),
    +		        			type:form.attr('method'),
    +		        			data:"indexStyle="+indexStyle,//+"&cssTheme="+cssTheme,
    +		        			success:function(data){
    +								var d = $.parseJSON(data);
    +								if (d.success) {
    +									var msg = d.msg;
    +									bootbox.alert(msg);
    +								}else{
    +									bootbox.alert(d.msg);
    +								}
    +		        			},
    +		        			error:function(e){
    +		        				bootbox.alert("鍑洪敊浜嗗摝");
    +		        			}
    +						});
    +					}
    +			},Cancel: {label: "CLOSE", 
    +				callback:function() {
    +						//alert('close');//$("#dialog").dialog("close");
    +					}
    +				}
    +			}});
    +  			
    +  	}
    +		function changepass(title,url,target){
    +			//$("#dialog").attr("src",url);
    +			bootbox.dialog({
    +				message:'<form id="formobj2"  action="userController.do?savenewpwd" name="formobj2" method="post">'
    +					+$("#changepassword").html()+'</form>',
    +				title:title,
    +				buttons:{
    +				OK:{
    +				label: "OK", 
    +				callback:function(){
    +					//alert('not implement');
    +						$.ajax({
    +		        			url:"userController.do?savenewpwd",
    +		        			type:"post",
    +		        			data:$('#formobj2').serialize(),// 瑕佹彁浜ょ殑琛ㄥ崟 ,
    +		        			success:function(data){
    +								var d = $.parseJSON(data);
    +								if (d.success) {
    +									var msg = d.msg;
    +									bootbox.alert(msg);
    +								}else{
    +									bootbox.alert(d.msg);
    +									}
    +		        			},
    +		        			error:function(e){
    +		        				bootbox.alert("鍑洪敊浜嗗摝");
    +		        			}
    +						});
    +					}
    +			},Cancel: {label: "CLOSE", 
    +				callback:function() {
    +						alert('close');//$("#dialog").dialog("close");
    +					}
    +				}
    +			}});
    +  			
    +  	}
    +		function profile(title,url,target){
    +			//$("#dialog").attr("src",url);
    +			bootbox.dialog({
    +				message:'<iframe width="100%" height="300px" src="'+url+'" style="border:1px #fff solid; background:#CCC;"></iframe>',
    +				title:title,
    +				buttons:{
    +				OK:{
    +				label: "OK"},Cancel: {label: "CLOSE"
    +				}
    +			}});
    +  			
    +  	}
    +			function clearLocalstorage(){
    +				var storage=$.localStorage;
    +				if(!storage)
    +					storage=$.cookieStorage;
    +				storage.removeAll();
    +				//bootbox.alert( "娴忚鍣ㄧ紦瀛樻竻闄ゆ垚鍔!");
    +				alertTipTop("娴忚鍣ㄧ紦瀛樻竻闄ゆ垚鍔!","10%");
    +			}
    +		</script>
    +		<script src="plug-in/ace/js/bootstrap.js"></script>
    +<script src="plug-in/ace/js/bootbox.js"></script>
    +
    +		<script src="plug-in/ace/js/jquery-ui.js"></script>
    +		<script src="plug-in/ace/js/jquery.ui.touch-punch.js"></script>
    +		<!-- ace scripts -->
    +		<script src="plug-in/ace/js/ace/elements.scroller.js"></script>
    +		<script src="plug-in/ace/js/ace/elements.colorpicker.js"></script>
    +		<script src="plug-in/ace/js/ace/elements.fileinput.js"></script>
    +		<script src="plug-in/ace/js/ace/elements.typeahead.js"></script>
    +		<script src="plug-in/ace/js/ace/elements.wysiwyg.js"></script>
    +		<script src="plug-in/ace/js/ace/elements.spinner.js"></script>
    +		<script src="plug-in/ace/js/ace/elements.treeview.js"></script>
    +		<script src="plug-in/ace/js/ace/elements.wizard.js"></script>
    +		<script src="plug-in/ace/js/ace/elements.aside.js"></script>
    +		<script src="plug-in/ace/js/ace/ace.js"></script>
    +		<script src="plug-in/ace/js/ace/ace.ajax-content.js"></script>
    +		<script src="plug-in/ace/js/ace/ace.touch-drag.js"></script>
    +		<script src="plug-in/ace/js/ace/ace.sidebar.js"></script>
    +		<script src="plug-in/ace/js/ace/ace.sidebar-scroll-1.js"></script>
    +		<script src="plug-in/ace/js/ace/ace.submenu-hover.js"></script>
    +		<script src="plug-in/ace/js/ace/ace.widget-box.js"></script>
    +		<script src="plug-in/ace/js/ace/ace.settings.js"></script>
    +		<script src="plug-in/ace/js/ace/ace.settings-rtl.js"></script>
    +		<script src="plug-in/ace/js/ace/ace.settings-skin.js"></script>
    +		<script src="plug-in/ace/js/ace/ace.widget-on-reload.js"></script>
    +		<script src="plug-in/ace/js/ace/ace.searchbox-autocomplete.js"></script>
    +		<t:base type="tools"></t:base>
    +		<script src="plug-in/jquery-plugs/storage/jquery.storageapi.min.js"></script>
    +		<script>jQuery(function($) {
    +			$( "#tabs" ).tabs();
    +			});</script>
    +	</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/main/bootstrap_main.jsp b/src/main/webapp/webpage/main/bootstrap_main.jsp
    new file mode 100644
    index 00000000..71882e47
    --- /dev/null
    +++ b/src/main/webapp/webpage/main/bootstrap_main.jsp
    @@ -0,0 +1,91 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<title><t:mutiLang langKey="jeect.platform"/></title>
    +<t:base type="jquery,easyui,tools,DatePicker,autocomplete"></t:base>
    +<link rel="stylesheet" href="plug-in/bootstrap/css/bootstrap.css" type="text/css"></link>
    +<style type="text/css">
    +.bootstrap-menu i {
    +	display: inline-block;
    +	width: 14px;
    +	height: 14px;
    +	margin-top: 1px;
    +	*margin-right: .3em;
    +	line-height: 14px;
    +	vertical-align: text-top;
    +	background-image: url("plug-in/bootstrap/img/glyphicons-halflings.png");
    +	background-repeat: no-repeat;
    +}
    +
    +.bootstrap-center {
    +	height: 530px;
    +	overflow-y: auto;
    +	margin-top: -20px;
    +	margin-left: 2px;
    +	margin-right: 2px;
    +}
    +
    +.bootstrap-icon {
    +	display: inline-block;
    +	width: 16px;
    +	height: 16px;
    +	line-height: 16px;
    +	vertical-align: text-top;
    +	background-repeat: no-repeat;
    +	background-image: url("plug-in/accordion/images/pictures.png");
    +}
    +
    +.footer {
    +	margin-top: 10px;
    +}
    +</style>
    +</head>
    +<body>
    +<!-- 澶撮儴鑿滃崟瀵艰埅-->
    +<div id="header">
    +<div class="navbar">
    +<div class="navbar-inner">
    +<div class="container-fluid"><a class="brand" href="http://www.jeecg.org" target="_blank"><t:mutiLang langKey="common.platform"/> &nbsp;&nbsp;<span class="slogan"></span></a>
    +<div class="nav-no-collapse bootstrap-menu">
    +
    +<ul class="nav pull-right usernav">
    +	<li style="line-height: 43px;"><span style="color: #CC33FF"><t:mutiLang langKey="common.user"/>:</span><span style="color: #666633">(${userName })</span> <span style="color: #CC33FF"><t:mutiLang langKey="common.role"/></span>:<span style="color: #666633">${roleName
    +	}</span></li>
    +	<li class="dropdown"><a href="#" class="dropdown-toggle avatar" data-toggle="dropdown"> <i class="icon-wrench"></i> <span class="txt"><t:mutiLang langKey="common.control.panel"/></span> <b class="caret"></b> </a>
    +	<ul class="dropdown-menu">
    +		<li onclick="openwindow('<t:mutiLang langKey="common.profile"/>','userController.do?userinfo')"><a href="javascript:;"><i class="icon-user"></i> <t:mutiLang langKey="common.profile"/></a></li>
    +		<li onclick="add('<t:mutiLang langKey="common.change.password"/>','userController.do?changepassword')"><a href="javascript:;"><i class="icon-pencil"></i> <t:mutiLang langKey="common.change.password"/></a></li>
    +		<li onclick="add('<t:mutiLang langKey="common.change.style"/>','userController.do?changestyle')"><a href="javascript:;"><i class="icon-retweet"></i> <t:mutiLang langKey="common.change.style"/></a></li>
    +	</ul>
    +	</li>
    +	<li class="dropdown"><a href="#" class="dropdown-toggle avatar" data-toggle="dropdown"> <i class="icon-arrow-left"></i> <span class="txt"><t:mutiLang langKey="common.logout"/></span> <b class="caret"></b> </a>
    +	<ul class="dropdown-menu">
    +		<li onclick="exit('loginController.do?logout','<t:mutiLang langKey="common.exit.confirm"/>',1);"><a href="javascript:;"><i class="icon-off"></i><t:mutiLang langKey="common.exit"/></a></li>
    +	</ul>
    +	</li>
    +</ul>
    +</div>
    +<!-- /.nav-collapse --></div>
    +</div>
    +<!-- /navbar-inner --></div>
    +<!-- /navbar --></div>
    +<!-- End #header -->
    +
    +<!-- 涓棿 -->
    +<div id="wrapper" class="bootstrap-center"></div>
    +
    +<!-- 搴曢儴 -->
    +<footer class="footer">
    +<div class="container">
    +<ul class="footer-links">
    +	<li style="display: inline;">&copy; <t:mutiLang langKey="common.copyright"/><a href="http://www.jeecg.org" title="JEECG Framework -3.5.2">JEECG Framework -3.5.2</a></li>
    +	<li style="display: inline;">&nbsp;<t:mutiLang langKey="common.copyright"/><t:mutiLang langKey="common.browser"/>:<a title="JEECG Framework -3.5.2" href="http://www.jeecg.org">JEECG Framework -3.5.2</a></li>
    +</ul>
    +</div>
    +</footer>
    +<script type="text/javascript" src="plug-in/bootstrap/js/bootstrap.min.js"></script>
    +<script type="text/javascript" src="plug-in/accordion/js/bootstrap_main.js"></script>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/main/bootstrap_top.jsp b/src/main/webapp/webpage/main/bootstrap_top.jsp
    new file mode 100644
    index 00000000..e9f46902
    --- /dev/null
    +++ b/src/main/webapp/webpage/main/bootstrap_top.jsp
    @@ -0,0 +1,4 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:menu style="june_bootstrap" menuFun="${menuMap}"></t:menu>
    +
    diff --git a/src/main/webapp/webpage/main/home.jsp b/src/main/webapp/webpage/main/home.jsp
    new file mode 100644
    index 00000000..256e59c9
    --- /dev/null
    +++ b/src/main/webapp/webpage/main/home.jsp
    @@ -0,0 +1,39 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<style>
    +*{font-size:12px; font-family:Tahoma,Verdana,鏂板畫浣搣
    +</style>
    +<div style="margin-top: 14px;">
    +<h3>绠浠</h3>
    +<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JEECG锛圝2EE Code Generation锛夋槸涓娆惧熀浜庝唬鐮佺敓鎴愬櫒鐨勫井浜戝揩閫熷紑鍙戝钩鍙帮紝寮曢鏂板紑鍙戞ā寮(鏅鸿兘寮鍙慭鍦ㄧ嚎寮鍙慭鎻掍欢寮鍙)锛 鍙互甯姪瑙e喅Java椤圭洰60%鐨勯噸澶嶅伐浣滐紝璁╁紑鍙戞洿澶氬叧娉ㄤ笟鍔¢昏緫銆傛棦鑳藉揩閫熸彁楂樺紑鍙戞晥鐜囷紝甯姪鍏徃鑺傜渷浜哄姏鎴愭湰锛屽悓鏃跺張涓嶅け鐏垫椿鎬с <br>
    +&nbsp;&nbsp;&nbsp;&nbsp;JEECG蹇熷紑鍙戝畻鏃ㄦ槸锛氱畝鍗曞姛鑳界敱浠g爜鐢熸垚鍣ㄧ敓鎴愪娇鐢; 澶嶆潅涓氬姟閲囩敤琛ㄥ崟鑷畾涔夛紝涓氬姟娴佺▼浣跨敤宸ヤ綔娴佹潵瀹炵幇銆佹墿灞曞嚭浠诲姟鎺ュ彛锛屼緵寮鍙戠紪鍐欎笟鍔¢昏緫銆 瀹炵幇浜嗘祦绋嬩换鍔¤妭鐐瑰拰浠诲姟鎺ュ彛鐨勭伒娲婚厤缃紝鏃繚璇佷簡鍏徃娴佺▼鐨勪繚瀵嗘э紝鍙堝噺灏戜簡寮鍙戜汉鍛樼殑宸ヤ綔閲</p>
    +<h3>鏋舵瀯璇存槑</h3>
    +<ul>
    +	<li>JEECG 寮鍙戝钩鍙伴噰鐢⊿pringMVC+MiniDao+UI蹇熷紑鍙戝簱+ OnlineCoding寮鍙戠粍浠 鐨勫熀纭鏋舵瀯,閲囩敤闈㈠悜澹版槑鐨勫紑鍙戞ā寮忥紝 鍩轰簬娉涘瀷缂栧啓鏋佸皯浠g爜鍗冲彲瀹炵幇澶嶆潅鐨勬暟鎹睍绀恒佹暟鎹紪杈戙<br>
    +	琛ㄥ崟澶勭悊绛夊姛鑳斤紝鍐嶉厤鍚堜唬鐮佺敓鎴愬櫒鐨勪娇鐢,灏咼2EE鐨勫紑鍙戞晥鐜囨彁楂6鍊嶄互涓婏紝鍙互灏嗕唬鐮佸噺灏60%浠ヤ笂銆</li>
    +	<li>JEECG 鏈鏂扮増鏈叚澶ф妧鏈偣: <b>1.浠g爜鐢熸垚鍣</b> <b>2.寰俊绉诲姩瑙e喅鏂规</b> <b>3.OnlineCoding鍦ㄧ嚎寮鍙</b> <b>4.鍦ㄧ嚎娴佺▼璁捐</b> <b>5.Web GIS鏀寔</b> <b>6.UI蹇熷紑鍙戝簱</b></li>
    +	<li>鎶鏈偣涓锛氫唬鐮佺敓鎴愬櫒锛屾敮鎸佸绉嶆暟鎹ā鍨,鏍规嵁琛ㄧ敓鎴愬搴旂殑Entity,Service,Dao,Action,JSP绛,澧炲垹鏀规煡鍔熻兘鐢熸垚鐩存帴浣跨敤</li>
    +	<li>鎶鏈偣浜岋細寰俊绉诲姩瑙e喅鏂规锛岄噰鐢ㄥ井淇″钩鍙板府鍔╀紒涓氬疄鐜扮Щ鍔ㄨВ鍐虫柟妗埪</li>
    +	<li>鎶鏈偣涓夛細鍦ㄧ嚎娴佺▼瀹氫箟锛岄噰鐢ㄥ紑婧 Activiti娴佺▼寮曟搸锛屽疄鐜板湪绾跨敾娴佺▼,鑷畾涔夎〃鍗,琛ㄥ崟鎸傛帴,涓氬姟娴佽浆锛屾祦绋嬬洃鎺э紝娴佺▼璺熻釜锛屾祦绋嬪鎵樼瓑</li>
    +	<li>鎶鏈偣鍥涳細Web GIS鏀寔锛岄噰鐢ㄩ噰鐢∣penLayers鎶鏈</li>
    +	<li>鎶鏈偣浜旓細UI蹇熷紑鍙戝簱锛岄拡瀵筗EB UI杩涜鏍囧噯灏佽锛岄〉闈㈢粺涓閲囩敤UI鏍囩瀹炵幇鍔熻兘锛氭暟鎹甦atagrid,琛ㄥ崟鏍¢獙,Popup,Tab绛夛紝瀹炵幇JSP椤甸潰闆禞S锛屽紑鍙戠淮鎶ら潪甯搁珮鏁</li>
    +	<li>JEECG 寮鍙戝钩鍙,缁忚繃浜嗕笓涓氬帇鍔涙祴璇,鎬ц兘娴嬭瘯锛屼繚璇佸悗鍙版暟鎹殑鍑嗙‘鎬у拰椤甸潰璁块棶閫熷害</li>
    +	<li>鏀寔澶氱娴忚鍣: IE, 鐏嫄, Google 绛夋祻瑙堝櫒璁块棶閫熷害閮藉緢蹇</li>
    +	<li>鏀寔鏁版嵁搴: Mysql,Oracle10g绛</li>
    +	<li>鍩虹鏉冮檺: 鐢ㄦ埛锛岃鑹诧紝鑿滃崟鏉冮檺锛屾寜閽潈闄愶紝鏁版嵁鏉冮檺</li>
    +	<li>鏅鸿兘鎶ヨ〃闆嗘垚: 绠鏄撶殑鍥惧儚鎶ヨ〃宸ュ叿鍜孍xcel瀵煎叆瀵煎嚭</li>
    +	<li>Web瀹瑰櫒娴嬭瘯閫氳繃鐨勬湁Jetty鍜孴omcat6</li>
    +	<li>寰呮帹鍑哄姛鑳斤細鍒嗗竷寮忚绠楋紝浜戣绠楋紝寰俊绠″寮婧愰」鐩紝瑙勫垯寮曟搸</li>
    +	<li>瑕佹眰JDK1.6+</li>
    +</ul>
    +</div>
    +<div style="margin-top: 20px;">
    +<h3>鎶鏈氦娴</h3>
    +<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鏈郴缁熺敱JEECG寮婧愮ぞ鍖烘彁渚涳紝JEECG寰簯蹇熷紑鍙戝钩鍙帮紝姘镐箙寮婧愬厤璐癸紝涓哄ぇ瀹舵彁渚涙渶濂界殑<b>浼佷笟浜屾寮鍙戝钩鍙</b></p>
    +<ul>
    +	<li>浜ゆ祦缇:106259349, 106838471, 289782002</li>
    +	<li>鍒涘浜猴細寮犱唬娴</li>
    +	<li>閭 锛歫eecg@sina.com</li>
    +	<li>璁哄潧 锛<a href="http://www.jeecg.org">www.jeecg.org</a></li>
    +	<li>鍚堜綔 锛氬紑婧愯祫鍔 | 鎶鏈敮鎸亅 椤圭洰鍚堜綔</li>
    +</ul>
    +</div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/main/left.jsp b/src/main/webapp/webpage/main/left.jsp
    new file mode 100644
    index 00000000..cdeb33cd
    --- /dev/null
    +++ b/src/main/webapp/webpage/main/left.jsp
    @@ -0,0 +1,9 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<link rel="stylesheet" href="plug-in/accordion/css/icons.css" type="text/css"></link>
    +<link rel="stylesheet" href="plug-in/accordion/css/accordion.css" type="text/css"></link>
    +
    +<script type="text/javascript" src="plug-in/accordion/js/leftmenu.js"></script>
    +
    +<t:menu menuFun="${menuMap}"></t:menu>
    +
    diff --git a/src/main/webapp/webpage/main/main.jsp b/src/main/webapp/webpage/main/main.jsp
    new file mode 100644
    index 00000000..93ccdd45
    --- /dev/null
    +++ b/src/main/webapp/webpage/main/main.jsp
    @@ -0,0 +1,245 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<title><t:mutiLang langKey="jeect.platform"/></title>
    +<t:base type="jquery,easyui,tools,DatePicker,autocomplete"></t:base>
    +<link rel="shortcut icon" href="images/favicon.ico">
    +<style type="text/css">
    +a {
    +	color: Black;
    +	text-decoration: none;
    +}
    +
    +a:hover {
    +	color: black;
    +	text-decoration: none;
    +}
    +/*update-start--Author:zhangguoming  Date:20140622 for锛氬乏渚ф爲璋冩暣锛氬姞澶у搴︺佹洿鎹㈣妭鐐瑰浘鏍囥佷慨鏀归変腑棰滆壊*/
    +.tree-node-selected{
    +    background: #eaf2ff;
    +}
    +/*update-end--Author:zhangguoming  Date:20140622 for锛氬乏渚ф爲璋冩暣锛氬姞澶у搴︺佹洿鎹㈣妭鐐瑰浘鏍囥佷慨鏀归変腑棰滆壊*/
    +</style>
    +<SCRIPT type="text/javascript">
    +
    +	$(function() {
    +		$('#layout_jeecg_onlineDatagrid').datagrid({
    +			url : 'systemController.do?datagridOnline&field=ip,logindatetime,user.userName,',
    +			title : '',
    +			iconCls : '',
    +			fit : true,
    +			fitColumns : true,
    +			pagination : true,
    +			pageSize : 10,
    +			pageList : [ 10 ],
    +			nowarp : false,
    +			border : false,
    +			idField : 'id',
    +			sortName : 'logindatetime',
    +			sortOrder : 'desc',
    +			frozenColumns : [ [ {
    +				title : '<t:mutiLang langKey="common.code"/>',
    +				field : 'id',
    +				width : 150,
    +				hidden : true
    +			} ] ],
    +			columns : [ [ {
    +				title : '<t:mutiLang langKey="common.login.name"/>',
    +				field : 'user.userName',
    +				width : 100,
    +				align : 'center',
    +				sortable : true,
    +				formatter : function(value, rowData, rowIndex) {
    +					return formatString('<span title="{0}">{1}</span>', value, value);
    +				}
    +			}, {
    +				title : 'IP',
    +				field : 'ip',
    +				width : 150,
    +				align : 'center',
    +				sortable : true,
    +				formatter : function(value, rowData, rowIndex) {
    +					return formatString('<span title="{0}">{1}</span>', value, value);
    +				}
    +			}, {
    +				title : '<t:mutiLang langKey="common.login.time"/>',
    +				field : 'logindatetime',
    +				width : 150,
    +				sortable : true,
    +				formatter : function(value, rowData, rowIndex) {
    +					return formatString('<span title="{0}">{1}</span>', value, value);
    +				},
    +				hidden : true
    +			} ] ],
    +			onClickRow : function(rowIndex, rowData) {
    +			},
    +			onLoadSuccess : function(data) {
    +				$('#layout_jeecg_onlinePanel').panel('setTitle', '( ' + data.total + ' )' + ' <t:mutiLang langKey="lang.user.online"/>');
    +			},
    +			onLoadError : function(data) {
    +			}
    +		}).datagrid('getPager').pagination({
    +			showPageList : false,
    +			showRefresh : false,
    +			beforePageText : '',
    +			afterPageText : '/{pages}',
    +			displayMsg : ''
    +		});		
    +		
    +		$('#layout_jeecg_onlinePanel').panel({
    +			tools : [ {
    +				iconCls : 'icon-reload',
    +				handler : function() {
    +					$('#layout_jeecg_onlineDatagrid').datagrid('load', {});
    +				}
    +			} ]
    +		});
    +		
    +		$('#layout_east_calendar').calendar({
    +			fit : true,
    +			current : new Date(),
    +			border : false,
    +			onSelect : function(date) {
    +				$(this).calendar('moveTo', new Date());
    +			}
    +		});
    +		$(".layout-expand").click(function(){
    +			$('#layout_east_calendar').css("width","auto");
    +			$('#layout_east_calendar').parent().css("width","auto");
    +			$("#layout_jeecg_onlinePanel").find(".datagrid-view").css("max-height","200px");
    +			$("#layout_jeecg_onlinePanel .datagrid-view .datagrid-view2 .datagrid-body").css("max-height","180px").css("overflow-y","auto");
    +		});
    +	});
    +	var onlineInterval;
    +	
    +	function easyPanelCollapase(){
    +		window.clearTimeout(onlineInterval);
    +	}
    +	function easyPanelExpand(){
    +		onlineInterval = window.setInterval(function() {
    +			$('#layout_jeecg_onlineDatagrid').datagrid('load', {});
    +		}, 1000 * 20);
    +	}
    +</SCRIPT>
    +</head>
    +<body class="easyui-layout" style="overflow-y: hidden" scroll="no">
    +<!-- 椤堕儴-->
    +<div region="north" border="false" title=" JEECG Framework -3.5.2" style="BACKGROUND: #E6E6FA; height: 85px; padding: 1px; overflow: hidden;">
    +<table width="100%" border="0" cellpadding="0" cellspacing="0">
    +<tr>
    +    <td align="left" style="vertical-align: text-bottom;"><img src="plug-in/login/images/head.png;"> <img src="plug-in/login/images/foot.png"></td>
    +    <td align="right" nowrap>
    +        <table>
    +            <tr>
    +                <td valign="top" height="50">
    +                    <span style="color: #CC33FF"><t:mutiLang langKey="common.user"/>:</span>
    +                    <span style="color: #666633">${userName }</span>
    +                    <span style="color: #CC33FF"><t:mutiLang langKey="current.org"/>:</span>
    +                    <span style="color: #666633">${currentOrgName }</span>
    +                    <span style="color: #CC33FF"><t:mutiLang langKey="common.role"/>:</span>
    +                    <span style="color: #666633">${roleName }</span>
    +                </td>
    +            </tr>
    +            <tr>
    +                <div style="position: absolute; right: 0px; bottom: 0px;">
    +                    <a href="javascript:void(0);" class="easyui-menubutton" menu="#layout_north_kzmbMenu" iconCls="icon-help">
    +                        <t:mutiLang langKey="common.control.panel"/>
    +                    </a>
    +                    <a href="javascript:void(0);" class="easyui-menubutton" menu="#layout_north_zxMenu" iconCls="icon-back">
    +                        <t:mutiLang langKey="common.logout"/>
    +                    </a>
    +                </div>
    +                <div id="layout_north_kzmbMenu" style="width: 100px; display: none;">
    +                    <div onclick="openwindow('<t:mutiLang langKey="common.profile"/>','userController.do?userinfo')">
    +                        <t:mutiLang langKey="common.profile"/>
    +                    </div>
    +                    <div class="menu-sep"></div>
    +                    <div onclick="add('<t:mutiLang langKey="common.change.password"/>','userController.do?changepassword','', 550, 200)">
    +                        <t:mutiLang langKey="common.change.password"/>
    +                    </div>
    +
    +                    <div class="menu-sep"></div>
    +                    <div onclick="add('<t:mutiLang langKey="common.change.style"/>','userController.do?changestyle','',550,200)">
    +                        <t:mutiLang langKey="common.my.style"/>
    +                    </div>
    +                    <div onclick="clearLocalstorage()">
    +                        <t:mutiLang langKey="common.clear.localstorage"/>
    +                    </div>
    +                </div>
    +                <div id="layout_north_zxMenu" style="width: 100px; display: none;">
    +                    <div class="menu-sep"></div>
    +                    <div onclick="exit('loginController.do?logout','<t:mutiLang langKey="common.exit.confirm"/>',1);"><t:mutiLang langKey="common.exit"/></div>
    +                </div>
    +            </tr>
    +        </table>
    +    </td>
    +    <td align="right">&nbsp;&nbsp;&nbsp;</td>
    +</tr>
    +</table>
    +</div>
    +<!-- 宸︿晶-->
    +<div region="west" split="true" href="loginController.do?left" title="<t:mutiLang langKey="common.navegation"/>" style="width: 200px; padding: 1px;"></div>
    +<!-- 涓棿-->
    +<div id="mainPanle" region="center" style="overflow: hidden;">
    +    <div id="maintabs" class="easyui-tabs" fit="true" border="false">
    +    <div class="easyui-tab" title="<t:mutiLang langKey="common.dash_board"/>" href="loginController.do?home" style="padding: 2px; overflow: hidden;"></div>
    +        <c:if test="${map=='1'}">
    +            <div class="easyui-tab" title="<t:mutiLang langKey="common.map"/>" style="padding: 1px; overflow: hidden;">
    +                <iframe name="myMap" id="myMap" scrolling="no" frameborder="0" src="mapController.do?map" style="width: 100%; height: 99.5%;"></iframe>
    +            </div>
    +        </c:if>
    +    </div>
    +</div>
    +<!-- 鍙充晶 -->
    +<div collapsed="true" region="east" iconCls="icon-reload" title="<t:mutiLang langKey="common.assist.tools"/>" split="true" style="width: 190px;"
    +	data-options="onCollapse:function(){easyPanelCollapase()},onExpand:function(){easyPanelExpand()}">
    +    <!--<div id="tabs" class="easyui-tabs" border="false" style="height: 240px">
    +        <div title="<t:mutiLang langKey="common.calendar"/>" style="padding: 0px; overflow: hidden; color: red;">
    +            <div id="layout_east_calendar"></div>
    +        </div>
    +    </div>
    +    <div id="layout_jeecg_onlinePanel" data-options="fit:true,border:false" title=<t:mutiLang langKey="common.online.user"/>>
    +        <table id="layout_jeecg_onlineDatagrid"></table>
    +    </div>
    +    -->
    +    
    +    <div class="easyui-layout" fit="true" border="false">
    +		<div region="north" border="false" style="height:180px;overflow: hidden;">
    +			<div id="tabs" class="easyui-tabs" border="false" style="height: 240px">
    +				<div title='<t:mutiLang langKey="common.calendar"/>' style="padding: 0px; overflow: hidden; color: red;">
    +					<div id="layout_east_calendar"></div>
    +				</div>
    +			</div>
    +		</div>
    +		<div region="center" border="false" style="overflow: hidden;">
    +			<div id="layout_jeecg_onlinePanel" fit="true" border="false" title='<t:mutiLang langKey="common.online.user"/>'>
    +				<table id="layout_jeecg_onlineDatagrid"></table>
    +			</div>
    +		</div>
    +	</div>
    +</div>
    +<!-- 搴曢儴 -->
    +<div region="south" border="false" style="height: 25px; overflow: hidden;">
    +    <div align="center" style="color: #CC99FF; padding-top: 2px">&copy;
    +        <t:mutiLang langKey="common.copyright"/>
    +        <span class="tip">
    +            <a href="http://www.jeecg.org" title=" JEECG Framework -3.5.2"> JEECG Framework -3.5.2</a>
    +            <t:mutiLang langKey="common.copyright"/>:
    +            <a href="#" title=" JEECG Framework -3.5.2">JEECG Framework -3.5.2</a>
    +        </span>
    +    </div>
    +</div>
    +<div id="mm" class="easyui-menu" style="width: 150px;">
    +    <div id="mm-tabupdate"><t:mutiLang langKey="common.refresh"/></div>
    +    <div id="mm-tabclose"><t:mutiLang langKey="common.close"/></div>
    +    <div id="mm-tabcloseall"><t:mutiLang langKey="common.close.all"/></div>
    +    <div id="mm-tabcloseother"><t:mutiLang langKey="common.close.all.but.this"/></div>
    +    <div class="menu-sep"></div>
    +    <div id="mm-tabcloseright"><t:mutiLang langKey="common.close.all.right"/></div>
    +    <div id="mm-tabcloseleft"><t:mutiLang langKey="common.close.all.left"/></div>
    +</div>
    +
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/main/shortcut_main.jsp b/src/main/webapp/webpage/main/shortcut_main.jsp
    new file mode 100644
    index 00000000..9b613d6b
    --- /dev/null
    +++ b/src/main/webapp/webpage/main/shortcut_main.jsp
    @@ -0,0 +1,271 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<title><t:mutiLang langKey="jeect.platform"/></title>
    +<t:base type="jquery,easyui,tools,DatePicker,autocomplete"></t:base>
    +<link rel="shortcut icon" href="images/favicon.ico">
    +<style type="text/css">
    +a {
    +	color: Black;
    +	text-decoration: none;
    +}
    +
    +a:hover {
    +	color: black;
    +	text-decoration: none;
    +}
    +/*update-start--Author:zhangguoming  Date:20140622 for锛氬乏渚ф爲璋冩暣锛氬姞澶у搴︺佹洿鎹㈣妭鐐瑰浘鏍囥佷慨鏀归変腑棰滆壊*/
    +.tree-node-selected{
    +    background: #eaf2ff;
    +}
    +/*update-end--Author:zhangguoming  Date:20140622 for锛氬乏渚ф爲璋冩暣锛氬姞澶у搴︺佹洿鎹㈣妭鐐瑰浘鏍囥佷慨鏀归変腑棰滆壊*/
    +</style>
    +<SCRIPT type="text/javascript">
    +
    +	$(function() {
    +		$('#layout_jeecg_onlineDatagrid').datagrid({
    +			url : 'systemController.do?datagridOnline&field=ip,logindatetime,user.userName,',
    +			title : '',
    +			iconCls : '',
    +			fit : true,
    +			fitColumns : true,
    +			pagination : true,
    +			pageSize : 10,
    +			pageList : [ 10 ],
    +			nowarp : false,
    +			border : false,
    +			idField : 'id',
    +			sortName : 'logindatetime',
    +			sortOrder : 'desc',
    +			frozenColumns : [ [ {
    +				title : '<t:mutiLang langKey="common.code"/>',
    +				field : 'id',
    +				width : 150,
    +				hidden : true
    +			} ] ],
    +			columns : [ [ {
    +				title : '<t:mutiLang langKey="common.login.name"/>',
    +				field : 'user.userName',
    +				width : 130,
    +				align : 'center',
    +				sortable : true,
    +				formatter : function(value, rowData, rowIndex) {
    +					return formatString('<span title="{0}">{1}</span>', value, value);
    +				}
    +			}, {
    +				title : 'IP',
    +				field : 'ip',
    +				width : 150,
    +				align : 'center',
    +				sortable : true,
    +				formatter : function(value, rowData, rowIndex) {
    +					return formatString('<span title="{0}">{1}</span>', value, value);
    +				}
    +			}, {
    +				title : '<t:mutiLang langKey="common.login.time"/>',
    +				field : 'logindatetime',
    +				width : 150,
    +				sortable : true,
    +				formatter : function(value, rowData, rowIndex) {
    +					return formatString('<span title="{0}">{1}</span>', value, value);
    +				},
    +				hidden : true
    +			} ] ],
    +			onClickRow : function(rowIndex, rowData) {
    +			},
    +			onLoadSuccess : function(data) {
    +				$('#layout_jeecg_onlinePanel').panel('setTitle', '( ' + data.total + ' )' + ' <t:mutiLang langKey="lang.user.online"/>');
    +			}
    +		}).datagrid('getPager').pagination({
    +			showPageList : false,
    +			showRefresh : false,
    +			beforePageText : '',
    +			afterPageText : '/{pages}',
    +			displayMsg : ''
    +		});		
    +		
    +		$('#layout_jeecg_onlinePanel').panel({
    +			tools : [ {
    +				iconCls : 'icon-reload',
    +				handler : function() {
    +					$('#layout_jeecg_onlineDatagrid').datagrid('load', {});
    +				}
    +			} ]
    +		});
    +		
    +		$('#layout_east_calendar').calendar({
    +			fit : true,
    +			current : new Date(),
    +			border : false,
    +			onSelect : function(date) {
    +				$(this).calendar('moveTo', new Date());
    +			}
    +		});
    +		$(".layout-expand").click(function(){
    +			$('#layout_east_calendar').css("width","auto");
    +			$('#layout_east_calendar').parent().css("width","auto");
    +			$("#layout_jeecg_onlinePanel").find(".datagrid-view").css("max-height","200px");
    +			$("#layout_jeecg_onlinePanel .datagrid-view .datagrid-view2 .datagrid-body").css("max-height","180px").css("overflow-y","auto");
    +		});
    +	});
    +	var onlineInterval;
    +	
    +	function easyPanelCollapase(){
    +		window.clearTimeout(onlineInterval);
    +	}
    +	function easyPanelExpand(){
    +		onlineInterval = window.setInterval(function() {
    +			$('#layout_jeecg_onlineDatagrid').datagrid('load', {});
    +		}, 1000 * 20);
    +	}
    +
    +    function panelCollapase(){
    +        $(".easyui-layout").layout('collapse','north');
    +    }
    +	
    +</SCRIPT>
    +</head>
    +<body class="easyui-layout" style="overflow-y: hidden" scroll="no">
    +<!-- 椤堕儴-->
    +<div region="north" border="false" title="" style="BACKGROUND: #A8D7E9; height: 100px; padding: 1px; overflow: hidden;">
    +<table width="100%" border="0" cellpadding="0" cellspacing="0">
    +<tr>
    +    <td align="left" style="vertical-align: text-bottom">
    +    <img src="plug-in/login/images/logo.jpg"> 
    +    <!--
    +        <img src="plug-in/login/images/toplogo.png" width="550" height="52" alt="">-->
    +        <div style="position: absolute; top: 75px; left: 33px;">JEECG Framework <span style="letter-spacing: -1px;">-3.5.2</span></div>
    +    </td>
    +    <td align="right" nowrap>
    +        <table border="0" cellpadding="0" cellspacing="0">
    +            <tr style="height: 25px;" align="right">
    +                <td style="" colspan="2">
    +                    <div style="background: url(plug-in/login/images/top_bg.jpg) no-repeat right center; float: right;">
    +                    <div style="float: left; line-height: 25px; margin-left: 70px;">
    +                        <span style="color: #386780"><t:mutiLang langKey="common.user"/>:</span>
    +                        <span style="color: #FFFFFF">${userName }</span>&nbsp;&nbsp;&nbsp;&nbsp;
    +                        <span style="color: #386780"><t:mutiLang langKey="current.org"/>:</span>
    +                        <span style="color: #FFFFFF">${currentOrgName }</span>&nbsp;&nbsp;&nbsp;&nbsp;
    +                        <span style="color: #386780"><t:mutiLang langKey="common.role"/>:</span>
    +                        <span style="color: #FFFFFF">${roleName }</span>
    +                    </div>
    +                    <div style="float: left; margin-left: 18px;">
    +                        <div style="right: 0px; bottom: 0px;">
    +                            <a href="javascript:void(0);" class="easyui-menubutton" menu="#layout_north_kzmbMenu" iconCls="icon-comturn" style="color: #FFFFFF">
    +                                <t:mutiLang langKey="common.control.panel"/>
    +                            </a>&nbsp;&nbsp;
    +                            <a href="javascript:void(0);" class="easyui-menubutton" menu="#layout_north_zxMenu" iconCls="icon-exit" style="color: #FFFFFF">
    +                                <t:mutiLang langKey="common.logout"/>
    +                            </a>
    +                        </div>
    +                        <div id="layout_north_kzmbMenu" style="width: 100px; display: none;">
    +                            <div onclick="openwindow('<t:mutiLang langKey="common.profile"/>','userController.do?userinfo')">
    +                                <t:mutiLang langKey="common.profile"/>
    +                            </div>
    +                            <div class="menu-sep"></div>
    +                            <div onclick="add('<t:mutiLang langKey="common.change.password"/>','userController.do?changepassword','',550,200)">
    +                                <t:mutiLang langKey="common.change.password"/>
    +                            </div>
    +                            <div class="menu-sep"></div>
    +                            <div onclick="add('<t:mutiLang langKey="common.change.style"/>','userController.do?changestyle','',550,200)">
    +                                <t:mutiLang langKey="common.change.style"/>
    +                            </div>
    +                             <div onclick="clearLocalstorage()">
    +                       		 	<t:mutiLang langKey="common.clear.localstorage"/>
    +                   			 </div>
    +                        </div>
    +                        <div id="layout_north_zxMenu" style="width: 100px; display: none;">
    +                            <div onclick="exit('loginController.do?logout','<t:mutiLang langKey="common.exit.confirm"/>',1);">
    +                                <t:mutiLang langKey="common.exit"/>
    +                            </div>
    +                        </div>
    +                    </div>
    +                    <div style="float: left; margin-left: 8px;margin-right: 5px; margin-top: 5px;">
    +                        <img src="plug-in/easyui/themes/default/images/layout_button_up.gif"
    +                             style="cursor:pointer" onclick="panelCollapase()" />
    +                    </div>
    +                    <%--update-end--Author:JueYue  Date:20140616 for锛氶椤典笂鏂瑰彲浠ユ姌鍙--%>
    +                    </div>
    +                </td>
    +            </tr>
    +            <tr style="height: 80px;">
    +                <td colspan="2">
    +                    <ul class="shortcut">
    +                        <!-- 鍔ㄦ佺敓鎴愬苟璧嬪艰繃鏉 -->
    +                    </ul>
    +                </td>
    +            </tr>
    +        </table>
    +    </td>
    +</tr>
    +</table>
    +</div>
    +<!-- 宸︿晶-->
    +<div region="west" split="true" href="loginController.do?shortcut_top" title="<t:mutiLang langKey="common.navegation"/>" style="width: 200px; padding: 1px;"></div>
    +<!-- 涓棿-->
    +<div id="mainPanle" region="center" style="overflow: hidden;">
    +    <div id="maintabs" class="easyui-tabs" fit="true" border="false">
    +        <div class="easyui-tab" title="<t:mutiLang langKey="common.dash_board"/>" href="loginController.do?home" style="padding: 2px; overflow: hidden;"></div>
    +        <c:if test="${map=='1'}">
    +            <div class="easyui-tab" title="<t:mutiLang langKey="common.map"/>" style="padding: 1px; overflow: hidden;">
    +                <iframe name="myMap" id="myMap" scrolling="no" frameborder="0" src="mapController.do?map" style="width: 100%; height: 99.5%;"></iframe>
    +            </div>
    +        </c:if>
    +    </div>
    +</div>
    +<!-- 鍙充晶 -->
    +<div collapsed="true" region="east" iconCls="icon-reload" title="<t:mutiLang langKey="common.assist.tools"/>" split="true" style="width: 190px;"
    +	data-options="onCollapse:function(){easyPanelCollapase()},onExpand:function(){easyPanelExpand()}">
    +	<!--
    +    <div id="tabs" class="easyui-tabs" border="false" style="height: 240px">
    +        <div title='<t:mutiLang langKey="common.calendar"/>' style="padding: 0px; overflow: hidden; color: red;">
    +            <div id="layout_east_calendar"></div>
    +        </div>
    +    </div>
    +    <div id="layout_jeecg_onlinePanel" data-options="fit:true,border:false" title=<t:mutiLang langKey="common.online.user"/>>
    +        <table id="layout_jeecg_onlineDatagrid"></table>
    +    </div>
    +    -->
    +    <div class="easyui-layout" fit="true" border="false">
    +		<div region="north" border="false" style="height:180px;overflow: hidden;">
    +			<div id="tabs" class="easyui-tabs" border="false" style="height: 240px">
    +				<div title='<t:mutiLang langKey="common.calendar"/>' style="padding: 0px; overflow: hidden; color: red;">
    +					<div id="layout_east_calendar"></div>
    +				</div>
    +			</div>
    +		</div>
    +		<div region="center" border="false" style="overflow: hidden;">
    +			<div id="layout_jeecg_onlinePanel" fit="true" border="false" title='<t:mutiLang langKey="common.online.user"/>'>
    +				<table id="layout_jeecg_onlineDatagrid"></table>
    +			</div>
    +		</div>
    +	</div>
    +</div>
    +<!-- 搴曢儴 -->
    +<div region="south" border="false" style="height: 25px; overflow: hidden;">
    +    <div align="center" style="color: #1fa3e5; padding-top: 2px">&copy;
    +        <t:mutiLang langKey="common.copyright"/>
    +        <span class="tip">
    +            <a href="http://www.jeecg.org" title="JEECG Framework -3.5.2">JEECG Framework -3.5.2</a>
    +            <t:mutiLang langKey="common.browser"/>:
    +            <a href="#" title="JEECG Framework -3.5.2">JEECG Framework -3.5.2</a>
    +        </span>
    +    </div>
    +</div>
    +
    +<div id="mm" class="easyui-menu" style="width: 150px;">
    +    <div id="mm-tabupdate"><t:mutiLang langKey="common.refresh"/></div>
    +    <div id="mm-tabclose"><t:mutiLang langKey="common.close"/></div>
    +    <div id="mm-tabcloseall"><t:mutiLang langKey="common.close.all"/></div>
    +    <div id="mm-tabcloseother"><t:mutiLang langKey="common.close.all.but.this"/></div>
    +    <div class="menu-sep"></div>
    +    <div id="mm-tabcloseright"><t:mutiLang langKey="common.close.all.right"/></div>
    +    <div id="mm-tabcloseleft"><t:mutiLang langKey="common.close.all.left"/></div>
    +</div>
    +<script type="text/javascript">
    +
    +</script>
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/main/shortcut_top.jsp b/src/main/webapp/webpage/main/shortcut_top.jsp
    new file mode 100644
    index 00000000..b7e8d8ff
    --- /dev/null
    +++ b/src/main/webapp/webpage/main/shortcut_top.jsp
    @@ -0,0 +1,8 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<link rel="stylesheet" href="plug-in/accordion/css/icons.css" type="text/css"></link>
    +<link rel="stylesheet" href="plug-in/accordion/css/accordion.css" type="text/css"></link>
    +<script type="text/javascript" src="plug-in/accordion/js/left_shortcut_menu.js"></script>
    +<t:menu style="shortcut" menuFun="${menuMap}"></t:menu>
    +
    +
    diff --git a/src/main/webapp/webpage/main/sliding_main.jsp b/src/main/webapp/webpage/main/sliding_main.jsp
    new file mode 100644
    index 00000000..7fce8bd0
    --- /dev/null
    +++ b/src/main/webapp/webpage/main/sliding_main.jsp
    @@ -0,0 +1,216 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +	<head>
    +		<title>JEECG 寰簯蹇熷紑鍙戝钩鍙</title>
    +<t:base type="jquery-webos,easyui,tools,DatePicker,autocomplete"></t:base>
    +<%--update-end--Author:zhangguoming  Date:20140521 for锛氫簯妗岄潰鍥炬爣鎷栨嫿銆佺敤鎴疯嚜瀹氫箟妗岄潰--%>
    +<link rel="shortcut icon" href="images/favicon.ico">
    +		<link href="plug-in/sliding/css/main.css" rel="stylesheet" type="text/css" />
    +		<link href="plug-in/sliding/css/themesetting.css" rel="stylesheet"  type="text/css" >
    +		<link href="plug-in/sliding/css/skins/black.css" rel="stylesheet" />
    +		<link href="plug-in/sliding/css/powerFloat.css" rel="stylesheet" type="text/css"/>	
    +		<link href="plug-in/sliding/css/smartMenu.css" rel="stylesheet"  type="text/css" />
    +		<link href="plug-in/sliding/css/skins/opera.css" rel="stylesheet"  type="text/css" />
    +        <link href="plug-in/sliding/css/scrollStyle.css" rel="stylesheet"  type="text/css" />
    +        <%--update-end--Author:zhangguoming  Date:20140604 for锛氫簯妗岄潰鍏ㄥ眬瑙嗗浘锛屾坊鍔犵旱鍚戞粴鍔ㄦ潯--%>
    +		<%--<script  type="text/javascript" src="plug-in/webos1.2/js/jquery-1.7.1.min.js"></script>--%>
    +        <%--update-end--Author:zhangguoming  Date:20140521 for锛氫簯妗岄潰鍥炬爣鎷栨嫿銆佺敤鎴疯嚜瀹氫箟妗岄潰--%>
    +		<script  type="text/javascript" src="plug-in/sliding/js/jquery-powerFloat-min.js"></script>
    +		<script  type="text/javascript" src="plug-in/sliding/js/jquery-smartMenu-min.js"></script>
    +		<script  type="text/javascript" src="plug-in/sliding/js/jquery-class.js"></script>
    +		<%--<script  type="text/javascript" src="plug-in/sliding/js/artDialog.js"></script>--%>
    +		<%--<script  type="text/javascript" src="plug-in/sliding/js/iframeTools.js"></script>--%>
    +		<script  type="text/javascript" src="plug-in/sliding/js/jquery.ui.core-min.js"></script>
    +		<script  type="text/javascript" src="plug-in/sliding/js/jquery.ui.widget-min.js"></script>
    +		<script  type="text/javascript" src="plug-in/sliding/js/jquery.ui.mouse-min.js"></script>
    +		<script  type="text/javascript" src="plug-in/sliding/js/jquery.ui.draggable-min.js"></script>
    +		<script  type="text/javascript" src="plug-in/sliding/js/jquery.ui.droppable-min.js"></script>
    +		<script  type="text/javascript" src="plug-in/sliding/js/jquery.ui.sortable.js"></script>
    +		<script  type="text/javascript" src="plug-in/sliding/js/jquery.cookie.js"></script>
    +		<script  type="text/javascript" src="plug-in/sliding/js/webos-core.js"></script>
    +        <script>
    +
    +            $(function(){
    +//                var $script = $("script[src='plug-in/jquery/jquery-1.8.3.js']");
    +//                $($script).remove();
    +//                alert($script.attr("src"));
    +			  $(".dock_tool_theme").live("click",function(){
    +				  $("#themeSetting_wrap2").append("<div id='themeSetting_wrap' style='display:none;'></div>");
    +				  $("#themeSetting_wrap").html($("#themeSetting_wrap1").html());
    +				  $("#themeSetting_wrap").show();
    +			  })
    +            });
    +        </script>
    +	</head>
    +	<body>
    +	 <div id='themeSetting_wrap2'>
    +	 <div id='themeSetting_wrap' style='display:none;'></div>
    +	 </div>
    +		<div  id="themeSetting_wrap1" style="display:none;">			
    +				<div id="themeSetting_head" class="themeSetting_head">		
    +					<div id="themeSetting_tabTheme" class="themeSetting_tab current" style="display: block;">绯荤粺涓婚</div>		
    +				</div>					
    +				<div id="themeSetting_body" class="themeSetting_body">	
    +					<div id="themeSetting_area"  class="themeSetting_area" style="display: block;">						 
    +					<a href="###" themeid="theme_blue" class="themeSetting_settingButton" id="themeSetting_theme_blue">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_blue.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">姊﹀够鍏夊奖</div>
    +					</a>   
    +					<a href="###" themeid="theme_pinky_night" class="themeSetting_settingButton" id="themeSetting_theme_pinky_night">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_pinky_night.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">绮夌孩涔嬪</div>
    +					</a>      
    +					<a href="###" themeid="theme_green" class="themeSetting_settingButton" id="themeSetting_theme_green">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_green.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">闈掗潚涓栫晫</div>
    +					</a>  
    +					<a href="###" themeid="theme_wood1" class="themeSetting_settingButton" id="themeSetting_theme_wood1">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_wood1.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">娓╅Θ鏈ㄧ汗</div>
    +					</a>         
    +					<a href="###" themeid="theme_wood2" class="themeSetting_settingButton" id="themeSetting_theme_wood2">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_wood2.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">榛戣壊鏈ㄧ汗</div>
    +					</a>        
    +					<a href="###" themeid="theme_universe" class="themeSetting_settingButton" id="themeSetting_theme_universe">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_universe.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">绁炵鏄熼檯</div>
    +					</a>       
    +					<a href="###" themeid="theme_metal" class="themeSetting_settingButton" id="themeSetting_theme_metal">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_metal.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">閰风偒閲戝睘</div>
    +					</a>       
    +					<a href="###" themeid="theme_pinky_light" class="themeSetting_settingButton" id="themeSetting_theme_pinky_light">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_pinky_light.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">骞诲僵鑽у厜</div>
    +					</a>   
    +					<a href="###" themeid="theme_pinky_flower" class="themeSetting_settingButton" id="themeSetting_theme_pinky_flower">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_pinky_flower.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">缁氱儌绻佽姳</div>
    +					</a>      
    +					<a href="###" themeid="theme_christmas" class="themeSetting_settingButton" id="themeSetting_theme_christmas">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_christmas.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">鍦h癁蹇箰</div>
    +					</a>      
    +					<a href="###" themeid="theme_2011" class="themeSetting_settingButton" id="themeSetting_theme_2011">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_2011.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">娆㈠簡鍏冩棪</div>
    +					</a> 
    +					<a href="###" themeid="theme_blue1" class="themeSetting_settingButton" id="themeSetting_theme_blue1">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_blue1.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">骞诲僵钃濆ぉ</div>
    +					</a>         
    +					<a href="###" themeid="theme_spring_festival" class="themeSetting_settingButton" id="themeSetting_theme_spring_festival">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_spring_festival.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">鍠滆繋鏂版槬</div>
    +					</a>         
    +					<a href="###" themeid="theme_blue_glow" class="themeSetting_settingButton themeSetting_selected" id="themeSetting_theme_blue_glow">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_blue_glow.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">娣辨捣浠版湜</div>
    +					</a>
    +					<a href="###" themeid="theme_green_glow" class="themeSetting_settingButton" id="themeSetting_theme_green_glow">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_green_glow.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">鏅ㄥ厜寰洣</div>
    +					</a>        
    +					<a href="###" themeid="theme_orange_glow" class="themeSetting_settingButton" id="themeSetting_theme_orange_glow">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_orange_glow.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">姊﹂啋鏃跺垎</div>
    +					</a>         
    +					<a href="###" themeid="theme_valentinesDay" class="themeSetting_settingButton" id="themeSetting_theme_valentinesDay">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_valentinesDay.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">鐢滆湝鎯呬汉鑺</div>
    +					</a>         
    +					<a href="###" themeid="theme_cloud" class="themeSetting_settingButton" id="themeSetting_theme_cloud">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_cloud.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">鏅寸┖琛屼簯</div>
    +					</a>
    +					<a href="###" themeid="theme_gravity" class="themeSetting_settingButton" id="themeSetting_theme_gravity">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_gravity.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">钂插叕鑻</div>
    +					</a>         
    +					<a href="###" themeid="theme_7_7" class="themeSetting_settingButton" id="themeSetting_theme_7_7">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_7_7.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">涓冨</div>
    +					</a>
    +					<a href="###" themeid="theme_teachersDay" class="themeSetting_settingButton" id="themeSetting_theme_teachersDay">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_teachersDay.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">鏁欏笀鑺</div>
    +					</a>
    +					<a href="###" themeid="theme_midAutumn" class="themeSetting_settingButton" id="themeSetting_theme_midAutumn">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_midAutumn.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">涓鑺</div>
    +					</a>  
    +					<a href="###" themeid="theme_lookUpSky" class="themeSetting_settingButton" id="themeSetting_theme_lookUpSky">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_lookUpSky.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">浠版湜鑻嶇┕</div>
    +					</a>        
    +					<a href="###" themeid="theme_grass" class="themeSetting_settingButton" id="themeSetting_theme_grass">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_grass.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">鑼尗閲庤崏</div>
    +					</a>    
    +					<a href="###" themeid="theme_childhood" class="themeSetting_settingButton" id="themeSetting_theme_childhood">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_childhood.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">绔ュ勾璁板繂</div>
    +					</a>         
    +					<a href="###" themeid="theme_skyBlue" class="themeSetting_settingButton" id="themeSetting_theme_skyBlue">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_skyBlue.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">绌虹伒钃濊皟</div>
    +					</a>      
    +					<a href="###" themeid="theme_dandelionDream" class="themeSetting_settingButton" id="themeSetting_theme_dandelionDream">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_dandelionDream.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">钂茶嫳涔嬫ⅵ</div>
    +					</a>          
    +					<a href="###" themeid="theme_paintingTime" class="themeSetting_settingButton" id="themeSetting_theme_paintingTime">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_paintingTime.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">姘村ⅷ骞村崕</div>
    +					</a>  
    +					<a href="###" themeid="theme_dreamSky" class="themeSetting_settingButton" id="themeSetting_theme_dreamSky">
    +						<div style="background: url(plug-in/sliding/images/bg/icon/theme_dreamSky.jpg) no-repeat;" class="themeSetting_settingButton_icon"></div>
    +						<div class="themeSetting_settingButton_text">姊︾繑澶╅檯</div>
    +					</a>              
    +					</div>						
    +					<div id="themeSetting_wallpaper" class="themeSetting_wallpaper" style="display: none;"></div>			
    +				</div>
    +		</div>
    +		<div id="zoomWallpaperGrid" class="zoomWallpaperGrid" style="position: absolute; z-index: -10; left: 0pt; top: 0pt; overflow: hidden; height: 381px; width: 1440px;">
    +			<img id="zoomWallpaper" class="zoomWallpaper" style="position: absolute; top: 0pt; left: 0pt; height: 381px; width: 1440px;" src="plug-in/sliding/images/bg/cloud.jpg">
    +		</div>
    +		<div class="taskbar_start_menu_container" id="startMenuContainer" _olddisplay="block" style="display: none;">  
    +			<div class="startMenuImg taskbar_start_menu_body" id="taskbar_start_menu_body">          
    +			<div uin="0" class="taskbar_start_menu_selfinfo" id="startMenuSelfInfo">       
    +				<div style="float: left; line-height: 15px;">
    +                     <span style="color: #6DB6D9">褰撳墠鐢ㄦ埛: </span>
    +                     <span style="color: #FFFFFF">${userName }</span><br>
    +                     <span style="color: #6DB6D9">褰撳墠宀椾綅: </span>
    +                     <span style="color: #FFFFFF">${currentOrgName }</span><br>
    +                     <span style="color: #6DB6D9">鑱屽姟: </span>
    +                     <span style="color: #FFFFFF">${roleName }</span>
    +				</div>
    +				<a title="鍙嶉" href="###" class="startMenuImg startMenuTopControl_support" cmd="support">&nbsp;</a>    
    +				<a title="閿佸畾" href="###" class="startMenuImg startMenuTopControl_lock" cmd="lock">&nbsp;</a>     
    +			</div>       
    +			<ul class="taskbar_start_menu">
    +				<li cmd="favorite">
    +					<div style="background: url(plug-in/login/images/exit.png) no-repeat left center;padding-left:30px;"
    +                         onclick="openwindow('鐢ㄦ埛淇℃伅','userController.do?userinfo')">涓汉淇℃伅</div>
    +				</li>
    +				<li cmd="favorite">
    +					<div style="background: url(plug-in/login/images/exit.png) no-repeat left center;padding-left:30px;"
    +                         onclick="add('淇敼瀵嗙爜','userController.do?changepassword',null,560,120)">淇敼瀵嗙爜</div>
    +				</li>
    +				<li cmd="favorite">
    +					<div style="background: url(plug-in/login/images/exit.png) no-repeat left center;padding-left:30px;"
    +                         onclick="add('淇敼棣栭〉椋庢牸','userController.do?changestyle',null,560,200)">棣栭〉椋庢牸 </div>
    +				</li>
    +				<li cmd="logout">
    +					<div class="startMenuImg logout_botton" title="娉ㄩ攢褰撳墠鐢ㄦ埛"
    +                         onclick="exit('loginController.do?logout','纭畾閫鍑鸿绯荤粺鍚 ?',1);"></div>
    +				</li>
    +			</ul>  
    +			<!--  <a class="startMenuImg logout_botton" title="娉ㄩ攢褰撳墠鐢ㄦ埛" onclick="exit('loginController.do?logout','纭畾閫鍑鸿绯荤粺鍚 ?',1);" cmd="logout"></a> -->	 
    +				</div>
    +		</div>
    +	</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/main/sliding_top.jsp b/src/main/webapp/webpage/main/sliding_top.jsp
    new file mode 100644
    index 00000000..889611b7
    --- /dev/null
    +++ b/src/main/webapp/webpage/main/sliding_top.jsp
    @@ -0,0 +1,8 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<link rel="stylesheet" href="plug-in/accordion/css/icons.css" type="text/css"></link>
    +<link rel="stylesheet" href="plug-in/accordion/css/accordion.css" type="text/css"></link>
    +<!-- update-start--Author:gaofeng  Date:2014-01-10 for:鏂板棣栭〉椋庢牸  -->
    +<script type="text/javascript" src="plug-in/accordion/js/left_shortcut_menu.js"></script>
    +<!-- update-end--Author:gaofeng  Date:2014-01-10 for:鏂板棣栭〉椋庢牸  -->
    + <t:menu  menuFun="${menuMap}"></t:menu>
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSms-add.jsp b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSms-add.jsp
    new file mode 100644
    index 00000000..39ef52a2
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSms-add.jsp
    @@ -0,0 +1,128 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    + <head>
    +  <title>娑堟伅鍙戦佽褰曡〃</title>
    +  <t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +  <script type="text/javascript" src="plug-in/ckeditor_new/ckeditor.js"></script>
    +  <script type="text/javascript" src="plug-in/ckfinder/ckfinder.js"></script>
    +  <script type="text/javascript">
    +  //缂栧啓鑷畾涔塉S浠g爜
    +  </script>
    + </head>
    + <body>
    +  <t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="tSSmsController.do?doAdd" tiptype="1">
    +					<input id="id" name="id" type="hidden" value="${tSSmsPage.id }">
    +					<input id="createName" name="createName" type="hidden" value="${tSSmsPage.createName }">
    +					<input id="createBy" name="createBy" type="hidden" value="${tSSmsPage.createBy }">
    +					<input id="createDate" name="createDate" type="hidden" value="${tSSmsPage.createDate }">
    +					<input id="updateName" name="updateName" type="hidden" value="${tSSmsPage.updateName }">
    +					<input id="updateBy" name="updateBy" type="hidden" value="${tSSmsPage.updateBy }">
    +					<input id="updateDate" name="updateDate" type="hidden" value="${tSSmsPage.updateDate }">
    +		<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							娑堟伅鏍囬:
    +						</label>
    +					</td>
    +					<td class="value">
    +					     	 <input id="esTitle" name="esTitle" type="text" style="width: 150px" class="inputxt"  
    +								               
    +								               >
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">娑堟伅鏍囬</label>
    +						</td>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							娑堟伅绫诲瀷:
    +						</label>
    +					</td>
    +					<td class="value">
    +					     	 <input id="esType" name="esType" type="text" style="width: 150px" class="inputxt"  
    +								               
    +								               >
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">娑堟伅绫诲瀷</label>
    +						</td>
    +					</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							鍙戦佷汉:
    +						</label>
    +					</td>
    +					<td class="value">
    +					     	 <input id="esSender" name="esSender" type="text" style="width: 150px" class="inputxt"  
    +								               
    +								               >
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">鍙戦佷汉</label>
    +						</td>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							鎺ユ敹浜:
    +						</label>
    +					</td>
    +					<td class="value">
    +					     	 <input id="esReceiver" name="esReceiver" type="text" style="width: 150px" class="inputxt"  
    +								               
    +								               >
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">鎺ユ敹浜</label>
    +						</td>
    +					</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							鍐呭:
    +						</label>
    +					</td>
    +					<td class="value">
    +					     	 <input id="esContent" name="esContent" type="text" style="width: 150px" class="inputxt"  
    +								               
    +								               >
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">鍐呭</label>
    +						</td>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							鍙戦佹椂闂:
    +						</label>
    +					</td>
    +					<td class="value">
    +					     	 <input id="esSendtime" name="esSendtime" type="text" style="width: 150px" class="inputxt"  
    +								               
    +								               >
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">鍙戦佹椂闂</label>
    +						</td>
    +					</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							鍙戦佺姸鎬:
    +						</label>
    +					</td>
    +					<td class="value">
    +					     	 <input id="esStatus" name="esStatus" type="text" style="width: 150px" class="inputxt"  
    +								               
    +								               >
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">鍙戦佺姸鎬</label>
    +						</td>
    +				<td align="right">
    +					<label class="Validform_label">
    +					</label>
    +				</td>
    +				<td class="value">
    +				</td>
    +					</tr>
    +			</table>
    +		</t:formvalid>
    + </body>
    +  <script src = "webpage/org/jeecgframework/web/sms/tSSms.js"></script>		
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSms-update.jsp b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSms-update.jsp
    new file mode 100644
    index 00000000..e3c4cdb7
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSms-update.jsp
    @@ -0,0 +1,89 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    + <head>
    +  <title>娑堟伅鍙戦佽褰曡〃</title>
    +  <t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +  <script type="text/javascript" src="plug-in/ckeditor_new/ckeditor.js"></script>
    +  <script type="text/javascript" src="plug-in/ckfinder/ckfinder.js"></script>
    +  <script type="text/javascript">
    +  //缂栧啓鑷畾涔塉S浠g爜
    +  </script>
    + </head>
    + <body>
    +  <t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="tSSmsController.do?doUpdate" tiptype="1">
    +					<input id="id" name="id" type="hidden" value="${tSSmsPage.id }">
    +					<input id="createName" name="createName" type="hidden" value="${tSSmsPage.createName }">
    +					<input id="createBy" name="createBy" type="hidden" value="${tSSmsPage.createBy }">
    +					<input id="createDate" name="createDate" type="hidden" value="${tSSmsPage.createDate }">
    +					<input id="updateName" name="updateName" type="hidden" value="${tSSmsPage.updateName }">
    +					<input id="updateBy" name="updateBy" type="hidden" value="${tSSmsPage.updateBy }">
    +					<input id="updateDate" name="updateDate" type="hidden" value="${tSSmsPage.updateDate }">
    +		<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								娑堟伅鏍囬:
    +							</label>
    +						</td>
    +						<td class="value">
    +						     	 <input id="esTitle" name="esTitle" type="text" style="width: 150px" class="inputxt"  
    +									               
    +									                 value='${tSSmsPage.esTitle}'>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">娑堟伅鏍囬</label>
    +						</td>
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								娑堟伅绫诲瀷:
    +							</label>
    +						</td>
    +						<td class="value">
    +						        <t:dictSelect field="esType" typeGroupCode="msgType" hasLabel="false" defaultVal="${tSSmsPage.esType}"></t:dictSelect>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">娑堟伅绫诲瀷</label>
    +						</td>
    +					</tr>
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								鎺ユ敹浜:
    +							</label>
    +						</td>
    +						<td class="value">
    +						     	 <input id="esReceiver" name="esReceiver" type="text" style="width: 150px" class="inputxt"  
    +									               
    +									                 value='${tSSmsPage.esReceiver}'>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">鎺ユ敹浜</label>
    +						</td>
    +					</tr>
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								鍐呭:
    +							</label>
    +						</td>
    +						<td class="value">
    +							<textarea rows="10" cols="100" id="esContent" name="esContent">${tSSmsPage.esContent}</textarea>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">鍐呭</label>
    +						</td>
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								鍙戦佺姸鎬:
    +							</label>
    +						</td>
    +						<td class="value">
    +						     <t:dictSelect field="esStatus" typeGroupCode="msgStatus" hasLabel="false" defaultVal="${tSSmsPage.esStatus}"></t:dictSelect>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">鍙戦佺姸鎬</label>
    +						</td>
    +					</tr>
    +			</table>
    +		</t:formvalid>
    + </body>
    +  <script src = "webpage/org/jeecgframework/web/sms/tSSms.js"></script>		
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSms.js b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSms.js
    new file mode 100644
    index 00000000..d3370d0d
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSms.js
    @@ -0,0 +1,53 @@
    +
    +
    +//閫氱敤寮瑰嚭寮忔枃浠朵笂浼
    +function commonUpload(callback){
    +    $.dialog({
    +           content: "url:systemController.do?commonUpload",
    +           lock : true,
    +           title:"鏂囦欢涓婁紶",
    +           zIndex:2100,
    +           width:700,
    +           height: 200,
    +           parent:windowapi,
    +           cache:false,
    +       ok: function(){
    +               var iframe = this.iframe.contentWindow;
    +               iframe.uploadCallback(callback);
    +                   return true;
    +       },
    +       cancelVal: '鍏抽棴',
    +       cancel: function(){
    +       } 
    +   });
    +}
    +function browseImages(inputId, Img) {// 鍥剧墖绠$悊鍣紝鍙涓笂浼犲叡鐢
    +		var finder = new CKFinder();
    +		finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 
    +			$("#" + Img).attr("src", fileUrl);
    +			$("#" + inputId).attr("value", fileUrl);
    +		};
    +		finder.resourceType = 'Images';// 鎸囧畾ckfinder鍙负鍥剧墖杩涜绠$悊
    +		finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID
    +		finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +		finder.defaultLanguage = 'zh-cn';
    +		finder.popup();
    +	}
    +function browseFiles(inputId, file) {// 鏂囦欢绠$悊鍣紝鍙涓笂浼犲叡鐢
    +	var finder = new CKFinder();
    +	finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 
    +		$("#" + file).attr("href", fileUrl);
    +		$("#" + inputId).attr("value", fileUrl);
    +		decode(fileUrl, file);
    +	};
    +	finder.resourceType = 'Files';// 鎸囧畾ckfinder鍙负鏂囦欢杩涜绠$悊
    +	finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID
    +	finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +	finder.defaultLanguage = 'zh-cn';
    +	finder.popup();
    +}
    +function decode(value, id) {//value浼犲叆鍊,id鎺ュ彈鍊
    +	var last = value.lastIndexOf("/");
    +	var filename = value.substring(last + 1, value.length);
    +	$("#" + id).text(decodeURIComponent(filename));
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsList.js b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsList.js
    new file mode 100644
    index 00000000..e69de29b
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsList.jsp b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsList.jsp
    new file mode 100644
    index 00000000..3206cb35
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsList.jsp
    @@ -0,0 +1,60 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +  <div region="center" style="padding:1px;">
    +  <t:datagrid name="tSSmsList" checkbox="true" fitColumns="false" title="common.messageSend.record" actionUrl="tSSmsController.do?datagrid" idField="id" fit="true" queryMode="group" sortName="createDate" sortOrder="desc">
    +   <t:dgCol title="common.esId"  field="id"  hidden="true"  queryMode="single" ></t:dgCol>
    +<%--   <t:dgCol title="鍒涘缓浜哄悕绉"  field="createName"  hidden="true"  queryMode="single" ></t:dgCol>--%>
    +<%--   <t:dgCol title="鍒涘缓浜虹櫥褰曞悕绉"  field="createBy"  hidden="true"  queryMode="single" ></t:dgCol>--%>
    +   
    +<%--   <t:dgCol title="鏇存柊浜哄悕绉"  field="updateName"  hidden="true"  queryMode="single" ></t:dgCol>--%>
    +<%--   <t:dgCol title="鏇存柊浜虹櫥褰曞悕绉"  field="updateBy"  hidden="true"  queryMode="single" ></t:dgCol>--%>
    +<%--   <t:dgCol title="鏇存柊鏃ユ湡"  field="updateDate" formatter="yyyy-MM-dd" hidden="true"  queryMode="single" ></t:dgCol>--%>
    +   <t:dgCol title="common.messageHeader"  field="esTitle" query="true" queryMode="single" ></t:dgCol>
    +   <t:dgCol title="common.messageType"  field="esType"  query="true" queryMode="single" dictionary="msgType"></t:dgCol>
    +   <t:dgCol title="common.sender"  field="esSender"  queryMode="single" query="true"></t:dgCol>
    +   <t:dgCol title="common.receiver"  field="esReceiver"  queryMode="single"></t:dgCol>
    +   <t:dgCol title="common.content_2"  field="esContent"  queryMode="single" ></t:dgCol>
    +   <t:dgCol title="common.dateCreated"  field="createDate" formatter="yyyy-MM-dd hh:mm:ss" query="true" queryMode="group" ></t:dgCol>
    +   <t:dgCol title="common.sendtime"  field="esSendtime"  formatter="yyyy-MM-dd hh:mm:ss" queryMode="single" ></t:dgCol>
    +   <t:dgCol title="common.sendState"  field="esStatus" query="true"  queryMode="single" dictionary="msgStatus"  ></t:dgCol>
    +   <t:dgCol title="common.remark"  field="remark"  queryMode="single" ></t:dgCol>
    +<%--   <t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>--%>
    +<%--   <t:dgDelOpt title="鍒犻櫎" url="tSSmsController.do?doDel&id={id}" />--%>
    +<%--   <t:dgToolBar title="褰曞叆" icon="icon-add" url="tSSmsController.do?goAdd" funname="add"></t:dgToolBar>--%>
    +   <t:dgToolBar title="common.iconEdit" icon="icon-edit" url="tSSmsController.do?goUpdate" funname="update"></t:dgToolBar>
    +<%--   <t:dgToolBar title="鎵归噺鍒犻櫎"  icon="icon-remove" url="tSSmsController.do?doBatchDel" funname="deleteALLSelect"></t:dgToolBar>--%>
    +<%--   <t:dgToolBar title="鏌ョ湅" icon="icon-search" url="tSSmsController.do?goUpdate" funname="detail"></t:dgToolBar>--%>
    +<%--   <t:dgToolBar title="瀵煎叆" icon="icon-put" funname="ImportXls"></t:dgToolBar>--%>
    +<%--   <t:dgToolBar title="瀵煎嚭" icon="icon-putout" funname="ExportXls"></t:dgToolBar>--%>
    +<%--   <t:dgToolBar title="妯℃澘涓嬭浇" icon="icon-putout" funname="ExportXlsByT"></t:dgToolBar>--%>
    +  </t:datagrid>
    +  </div>
    + </div>
    + <script src = "webpage/org/jeecgframework/web/sms/tSSmsList.js"></script>		
    + <script type="text/javascript">
    + $(document).ready(function(){
    + 		//缁欐椂闂存帶浠跺姞涓婃牱寮
    + 			$("#tSSmsListtb").find("input[name='createDate']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    + 			$("#tSSmsListtb").find("input[name='updateDate']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    + 			
    + 			$("#tSSmsList").find("input[name='createDate_begin']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    + 			$("#tSSmsList").find("input[name='updateDate_end']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    + });
    + 
    +//瀵煎叆
    +function ImportXls() {
    +	openuploadwin('Excel瀵煎叆', 'tSSmsController.do?upload', "tSSmsList");
    +}
    +
    +//瀵煎嚭
    +function ExportXls() {
    +	JeecgExcelExport("tSSmsController.do?exportXls","tSSmsList");
    +}
    +
    +//妯℃澘涓嬭浇
    +function ExportXlsByT() {
    +	JeecgExcelExport("tSSmsController.do?exportXlsByT","tSSmsList");
    +}
    + </script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSql-add.jsp b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSql-add.jsp
    new file mode 100644
    index 00000000..5606ad7c
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSql-add.jsp
    @@ -0,0 +1,53 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    + <head>
    +  <title>涓氬姟SQL琛</title>
    +  <t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +  <script type="text/javascript" src="plug-in/ckeditor_new/ckeditor.js"></script>
    +  <script type="text/javascript" src="plug-in/ckfinder/ckfinder.js"></script>
    +  <script type="text/javascript">
    +  //缂栧啓鑷畾涔塉S浠g爜
    +  </script>
    + </head>
    + <body>
    +  <t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="tSSmsSqlController.do?doAdd" tiptype="1">
    +					<input id="id" name="id" type="hidden" value="${tSSmsSqlPage.id }">
    +					<input id="createName" name="createName" type="hidden" value="${tSSmsSqlPage.createName }">
    +					<input id="createBy" name="createBy" type="hidden" value="${tSSmsSqlPage.createBy }">
    +					<input id="createDate" name="createDate" type="hidden" value="${tSSmsSqlPage.createDate }">
    +					<input id="updateName" name="updateName" type="hidden" value="${tSSmsSqlPage.updateName }">
    +					<input id="updateBy" name="updateBy" type="hidden" value="${tSSmsSqlPage.updateBy }">
    +					<input id="updateDate" name="updateDate" type="hidden" value="${tSSmsSqlPage.updateDate }">
    +		<table style="width: 100%" cellpadding="0" cellspacing="1" class="formtable">
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							SQL鍚嶇О:
    +						</label>
    +					</td>
    +					<td class="value">
    +					     	 <input id="sqlName" name="sqlName" type="text" style="width: 150px" class="inputxt"  
    +								               datatype="*"
    +>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">SQL鍚嶇О</label>
    +						</td>
    +				</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							SQL鍐呭:
    +						</label>
    +					</td>
    +					<td class="value">
    +						  	 <textarea style="width:600px;" class="inputxt" rows="6" id="sqlContent" name="sqlContent"></textarea>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">SQL鍐呭</label>
    +						</td>
    +				</tr>
    +			</table>
    +		</t:formvalid>
    + </body>
    +  <script src = "webpage/org/jeecgframework/web/sms/tSSmsSql.js"></script>		
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSql-update.jsp b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSql-update.jsp
    new file mode 100644
    index 00000000..67d50a7c
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSql-update.jsp
    @@ -0,0 +1,53 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    + <head>
    +  <title>涓氬姟SQL琛</title>
    +  <t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +  <script type="text/javascript" src="plug-in/ckeditor_new/ckeditor.js"></script>
    +  <script type="text/javascript" src="plug-in/ckfinder/ckfinder.js"></script>
    +  <script type="text/javascript">
    +  //缂栧啓鑷畾涔塉S浠g爜
    +  </script>
    + </head>
    + <body>
    +  <t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="tSSmsSqlController.do?doUpdate" tiptype="1">
    +					<input id="id" name="id" type="hidden" value="${tSSmsSqlPage.id }">
    +					<input id="createName" name="createName" type="hidden" value="${tSSmsSqlPage.createName }">
    +					<input id="createBy" name="createBy" type="hidden" value="${tSSmsSqlPage.createBy }">
    +					<input id="createDate" name="createDate" type="hidden" value="${tSSmsSqlPage.createDate }">
    +					<input id="updateName" name="updateName" type="hidden" value="${tSSmsSqlPage.updateName }">
    +					<input id="updateBy" name="updateBy" type="hidden" value="${tSSmsSqlPage.updateBy }">
    +					<input id="updateDate" name="updateDate" type="hidden" value="${tSSmsSqlPage.updateDate }">
    +		<table style="width:100%" cellpadding="0" cellspacing="1" class="formtable">
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								SQL鍚嶇О:
    +							</label>
    +						</td>
    +						<td class="value">
    +						     	 <input id="sqlName" name="sqlName" type="text" style="width: 150px" class="inputxt"  
    +									               datatype="*"
    +  value='${tSSmsSqlPage.sqlName}'>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">SQL鍚嶇О</label>
    +						</td>
    +					</tr>
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								SQL鍐呭:
    +							</label>
    +						</td>
    +						<td class="value">
    +						  	 	<textarea id="sqlContent" style="width:600px;" class="inputxt" rows="6" name="sqlContent">${tSSmsSqlPage.sqlContent}</textarea>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">SQL鍐呭</label>
    +						</td>
    +					</tr>
    +			</table>
    +		</t:formvalid>
    + </body>
    +  <script src = "webpage/org/jeecgframework/web/sms/tSSmsSql.js"></script>		
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSql.js b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSql.js
    new file mode 100644
    index 00000000..d3370d0d
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSql.js
    @@ -0,0 +1,53 @@
    +
    +
    +//閫氱敤寮瑰嚭寮忔枃浠朵笂浼
    +function commonUpload(callback){
    +    $.dialog({
    +           content: "url:systemController.do?commonUpload",
    +           lock : true,
    +           title:"鏂囦欢涓婁紶",
    +           zIndex:2100,
    +           width:700,
    +           height: 200,
    +           parent:windowapi,
    +           cache:false,
    +       ok: function(){
    +               var iframe = this.iframe.contentWindow;
    +               iframe.uploadCallback(callback);
    +                   return true;
    +       },
    +       cancelVal: '鍏抽棴',
    +       cancel: function(){
    +       } 
    +   });
    +}
    +function browseImages(inputId, Img) {// 鍥剧墖绠$悊鍣紝鍙涓笂浼犲叡鐢
    +		var finder = new CKFinder();
    +		finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 
    +			$("#" + Img).attr("src", fileUrl);
    +			$("#" + inputId).attr("value", fileUrl);
    +		};
    +		finder.resourceType = 'Images';// 鎸囧畾ckfinder鍙负鍥剧墖杩涜绠$悊
    +		finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID
    +		finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +		finder.defaultLanguage = 'zh-cn';
    +		finder.popup();
    +	}
    +function browseFiles(inputId, file) {// 鏂囦欢绠$悊鍣紝鍙涓笂浼犲叡鐢
    +	var finder = new CKFinder();
    +	finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 
    +		$("#" + file).attr("href", fileUrl);
    +		$("#" + inputId).attr("value", fileUrl);
    +		decode(fileUrl, file);
    +	};
    +	finder.resourceType = 'Files';// 鎸囧畾ckfinder鍙负鏂囦欢杩涜绠$悊
    +	finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID
    +	finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +	finder.defaultLanguage = 'zh-cn';
    +	finder.popup();
    +}
    +function decode(value, id) {//value浼犲叆鍊,id鎺ュ彈鍊
    +	var last = value.lastIndexOf("/");
    +	var filename = value.substring(last + 1, value.length);
    +	$("#" + id).text(decodeURIComponent(filename));
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSqlList.js b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSqlList.js
    new file mode 100644
    index 00000000..e69de29b
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSqlList.jsp b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSqlList.jsp
    new file mode 100644
    index 00000000..20c51a9c
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsSqlList.jsp
    @@ -0,0 +1,50 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +  <div region="center" style="padding:1px;">
    +  <t:datagrid name="tSSmsSqlList" checkbox="true" fitColumns="false" title="common.businessSqlTable" actionUrl="tSSmsSqlController.do?datagrid" idField="id" fit="true" queryMode="group">
    +   <t:dgCol title="common.esId"  field="id"  hidden="true"  queryMode="single"  ></t:dgCol>
    +<%--   <t:dgCol title="鍒涘缓浜哄悕绉"  field="createName"  hidden="true"  queryMode="single"  ></t:dgCol>--%>
    +<%--   <t:dgCol title="鍒涘缓浜虹櫥褰曞悕绉"  field="createBy"  hidden="true"  queryMode="single"  ></t:dgCol>--%>
    +<%--   <t:dgCol title="鍒涘缓鏃ユ湡"  field="createDate" formatter="yyyy-MM-dd" hidden="true"  queryMode="single"  ></t:dgCol>--%>
    +<%--   <t:dgCol title="鏇存柊浜哄悕绉"  field="updateName"  hidden="true"  queryMode="single"  ></t:dgCol>--%>
    +<%--   <t:dgCol title="鏇存柊浜虹櫥褰曞悕绉"  field="updateBy"  hidden="true"  queryMode="single"  ></t:dgCol>--%>
    +<%--   <t:dgCol title="鏇存柊鏃ユ湡"  field="updateDate" formatter="yyyy-MM-dd" hidden="true"  queryMode="single"  ></t:dgCol>--%>
    +   <t:dgCol title="common.sqlName"  query="true" field="sqlName"  queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.sqlContent"  query="true" field="sqlContent"  queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.operate" field="opt"></t:dgCol>
    +   <t:dgDelOpt title="common.delete_2" url="tSSmsSqlController.do?doDel&id={id}" />
    +   <t:dgToolBar title="common.add_2" icon="icon-add" url="tSSmsSqlController.do?goAdd" funname="add"></t:dgToolBar>
    +   <t:dgToolBar title="common.edit_2" icon="icon-edit" url="tSSmsSqlController.do?goUpdate" funname="update"></t:dgToolBar>
    +   <t:dgToolBar title="common.batchDelete"  icon="icon-remove" url="tSSmsSqlController.do?doBatchDel" funname="deleteALLSelect"></t:dgToolBar>
    +   <t:dgToolBar title="common.search" icon="icon-search" url="tSSmsSqlController.do?goUpdate" funname="detail"></t:dgToolBar>
    +<%--   <t:dgToolBar title="瀵煎叆" icon="icon-put" funname="ImportXls"></t:dgToolBar>--%>
    +<%--   <t:dgToolBar title="瀵煎嚭" icon="icon-putout" funname="ExportXls"></t:dgToolBar>--%>
    +<%--   <t:dgToolBar title="妯℃澘涓嬭浇" icon="icon-putout" funname="ExportXlsByT"></t:dgToolBar>--%>
    +  </t:datagrid>
    +  </div>
    + </div>
    + <script src = "webpage/org/jeecgframework/web/sms/tSSmsSqlList.js"></script>		
    + <script type="text/javascript">
    + $(document).ready(function(){
    + 		//缁欐椂闂存帶浠跺姞涓婃牱寮
    + 			$("#tSSmsSqlListtb").find("input[name='createDate']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    + 			$("#tSSmsSqlListtb").find("input[name='updateDate']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    + });
    + 
    +//瀵煎叆
    +function ImportXls() {
    +	openuploadwin('Excel瀵煎叆', 'tSSmsSqlController.do?upload', "tSSmsSqlList");
    +}
    +
    +//瀵煎嚭
    +function ExportXls() {
    +	JeecgExcelExport("tSSmsSqlController.do?exportXls","tSSmsSqlList");
    +}
    +
    +//妯℃澘涓嬭浇
    +function ExportXlsByT() {
    +	JeecgExcelExport("tSSmsSqlController.do?exportXlsByT","tSSmsSqlList");
    +}
    + </script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplate-add.jsp b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplate-add.jsp
    new file mode 100644
    index 00000000..22a0edf5
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplate-add.jsp
    @@ -0,0 +1,70 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    + <head>
    +  <title>娑堟伅妯℃湰琛</title>
    +  <t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +  <script type="text/javascript" src="plug-in/ckeditor_new/ckeditor.js"></script>
    +  <script type="text/javascript" src="plug-in/ckfinder/ckfinder.js"></script>
    +  <script type="text/javascript">
    +  //缂栧啓鑷畾涔塉S浠g爜
    +  </script>
    + </head>
    + <body>
    +  <t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="tSSmsTemplateController.do?doAdd" tiptype="1">
    +					<input id="id" name="id" type="hidden" value="${tSSmsTemplatePage.id }">
    +					<input id="createName" name="createName" type="hidden" value="${tSSmsTemplatePage.createName }">
    +					<input id="createBy" name="createBy" type="hidden" value="${tSSmsTemplatePage.createBy }">
    +					<input id="createDate" name="createDate" type="hidden" value="${tSSmsTemplatePage.createDate }">
    +					<input id="updateName" name="updateName" type="hidden" value="${tSSmsTemplatePage.updateName }">
    +					<input id="updateBy" name="updateBy" type="hidden" value="${tSSmsTemplatePage.updateBy }">
    +					<input id="updateDate" name="updateDate" type="hidden" value="${tSSmsTemplatePage.updateDate }">
    +		<table style="width: 100%;" cellpadding="0" cellspacing="1" class="formtable">
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							妯℃澘绫诲瀷:
    +						</label>
    +					</td>
    +					<td class="value">
    +							<t:dictSelect field="templateType" type="list"
    +									typeGroupCode="msgTplType" 
    +									defaultVal="${tSSmsTemplatePage.templateType}" 
    +									hasLabel="false"  title="妯℃澘绫诲瀷"
    +									extendJson="{\"datatype\":\"*\"}"
    +									></t:dictSelect>     
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">妯℃澘绫诲瀷</label>
    +						</td>
    +				</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							妯℃澘鍚嶇О:
    +						</label>
    +					</td>
    +					<td class="value">
    +					     	 <input id="templateName" name="templateName" type="text" style="width: 150px" class="inputxt"  
    +								               datatype="*"
    +>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">妯℃澘鍚嶇О</label>
    +						</td>
    +				</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							妯℃澘鍐呭:
    +						</label>
    +					</td>
    +					<td class="value">
    +						  	 <textarea style="width:600px;" class="inputxt" rows="6" id="templateContent" name="templateContent"></textarea>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">妯℃澘鍐呭</label>
    +						</td>
    +				</tr>
    +			</table>
    +		</t:formvalid>
    + </body>
    +  <script src = "webpage/org/jeecgframework/web/sms/tSSmsTemplate.js"></script>		
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplate-update.jsp b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplate-update.jsp
    new file mode 100644
    index 00000000..0bb9060f
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplate-update.jsp
    @@ -0,0 +1,69 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    + <head>
    +  <title>娑堟伅妯℃湰琛</title>
    +  <t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +  <script type="text/javascript" src="plug-in/ckeditor_new/ckeditor.js"></script>
    +  <script type="text/javascript" src="plug-in/ckfinder/ckfinder.js"></script>
    +  <script type="text/javascript">
    +  //缂栧啓鑷畾涔塉S浠g爜
    +  </script>
    + </head>
    + <body>
    +  <t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="tSSmsTemplateController.do?doUpdate" tiptype="1">
    +					<input id="id" name="id" type="hidden" value="${tSSmsTemplatePage.id }">
    +					<input id="createName" name="createName" type="hidden" value="${tSSmsTemplatePage.createName }">
    +					<input id="createBy" name="createBy" type="hidden" value="${tSSmsTemplatePage.createBy }">
    +					<input id="createDate" name="createDate" type="hidden" value="${tSSmsTemplatePage.createDate }">
    +					<input id="updateName" name="updateName" type="hidden" value="${tSSmsTemplatePage.updateName }">
    +					<input id="updateBy" name="updateBy" type="hidden" value="${tSSmsTemplatePage.updateBy }">
    +					<input id="updateDate" name="updateDate" type="hidden" value="${tSSmsTemplatePage.updateDate }">
    +		<table style="width: 100%;" cellpadding="0" cellspacing="1" class="formtable">
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								妯℃澘绫诲瀷:
    +							</label>
    +						</td>
    +						<td class="value">
    +									<t:dictSelect field="templateType" type="list"
    +										typeGroupCode="msgTplType" 
    +										defaultVal="${tSSmsTemplatePage.templateType}" 
    +										hasLabel="false"  title="妯℃澘绫诲瀷"
    +										extendJson="{\"datatype\":\"*\"}" ></t:dictSelect>     
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">妯℃澘绫诲瀷</label>
    +						</td>
    +					</tr>
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								妯℃澘鍚嶇О:
    +							</label>
    +						</td>
    +						<td class="value">
    +						     	 <input id="templateName" name="templateName" type="text" style="width: 150px" class="inputxt"  
    +									               datatype="*"
    +  value='${tSSmsTemplatePage.templateName}'>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">妯℃澘鍚嶇О</label>
    +						</td>
    +					</tr>
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								妯℃澘鍐呭:
    +							</label>
    +						</td>
    +						<td class="value">
    +						  	 	<textarea id="templateContent" style="width:600px;" class="inputxt" rows="6" name="templateContent">${tSSmsTemplatePage.templateContent}</textarea>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">妯℃澘鍐呭</label>
    +						</td>
    +					</tr>
    +			</table>
    +		</t:formvalid>
    + </body>
    +  <script src = "webpage/org/jeecgframework/web/sms/tSSmsTemplate.js"></script>		
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplate.js b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplate.js
    new file mode 100644
    index 00000000..d3370d0d
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplate.js
    @@ -0,0 +1,53 @@
    +
    +
    +//閫氱敤寮瑰嚭寮忔枃浠朵笂浼
    +function commonUpload(callback){
    +    $.dialog({
    +           content: "url:systemController.do?commonUpload",
    +           lock : true,
    +           title:"鏂囦欢涓婁紶",
    +           zIndex:2100,
    +           width:700,
    +           height: 200,
    +           parent:windowapi,
    +           cache:false,
    +       ok: function(){
    +               var iframe = this.iframe.contentWindow;
    +               iframe.uploadCallback(callback);
    +                   return true;
    +       },
    +       cancelVal: '鍏抽棴',
    +       cancel: function(){
    +       } 
    +   });
    +}
    +function browseImages(inputId, Img) {// 鍥剧墖绠$悊鍣紝鍙涓笂浼犲叡鐢
    +		var finder = new CKFinder();
    +		finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 
    +			$("#" + Img).attr("src", fileUrl);
    +			$("#" + inputId).attr("value", fileUrl);
    +		};
    +		finder.resourceType = 'Images';// 鎸囧畾ckfinder鍙负鍥剧墖杩涜绠$悊
    +		finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID
    +		finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +		finder.defaultLanguage = 'zh-cn';
    +		finder.popup();
    +	}
    +function browseFiles(inputId, file) {// 鏂囦欢绠$悊鍣紝鍙涓笂浼犲叡鐢
    +	var finder = new CKFinder();
    +	finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 
    +		$("#" + file).attr("href", fileUrl);
    +		$("#" + inputId).attr("value", fileUrl);
    +		decode(fileUrl, file);
    +	};
    +	finder.resourceType = 'Files';// 鎸囧畾ckfinder鍙负鏂囦欢杩涜绠$悊
    +	finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID
    +	finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +	finder.defaultLanguage = 'zh-cn';
    +	finder.popup();
    +}
    +function decode(value, id) {//value浼犲叆鍊,id鎺ュ彈鍊
    +	var last = value.lastIndexOf("/");
    +	var filename = value.substring(last + 1, value.length);
    +	$("#" + id).text(decodeURIComponent(filename));
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateList.js b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateList.js
    new file mode 100644
    index 00000000..e69de29b
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateList.jsp b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateList.jsp
    new file mode 100644
    index 00000000..f6e7e1db
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateList.jsp
    @@ -0,0 +1,51 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +  <div region="center" style="padding:1px;">
    +  <t:datagrid name="tSSmsTemplateList" checkbox="true" fitColumns="false" title="common.msgTemplateTable" actionUrl="tSSmsTemplateController.do?datagrid" idField="id" fit="true" queryMode="group">
    +   <t:dgCol title="common.isId"  field="id"  hidden="true"  queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.createName"  field="createName"  hidden="true"  queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.create.By"  field="createBy"  hidden="true"  queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.createDate"  field="createDate" formatter="yyyy-MM-dd" hidden="false"  queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.updateName"  field="updateName"  hidden="true"  queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.updateByName"  field="updateBy"  hidden="true"  queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.updateDate"  field="updateDate" formatter="yyyy-MM-dd" hidden="true"  queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.templateName"  field="templateName"  query="true" queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.templateType"  field="templateType" query="true" queryMode="single" dictionary="msgTplType" ></t:dgCol>
    +   <t:dgCol title="common.templateContent"  field="templateContent"  queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.opt" field="opt" width="100"></t:dgCol>
    +   <t:dgDelOpt title="common.deleteTo" url="tSSmsTemplateController.do?doDel&id={id}" />
    +   <t:dgToolBar title="common.icon.add" icon="icon-add" url="tSSmsTemplateController.do?goAdd" funname="add"></t:dgToolBar>
    +   <t:dgToolBar title="common.icon.edit" icon="icon-edit" url="tSSmsTemplateController.do?goUpdate" funname="update"></t:dgToolBar>
    +   <t:dgToolBar title="common.icon.remove"  icon="icon-remove" url="tSSmsTemplateController.do?doBatchDel" funname="deleteALLSelect"></t:dgToolBar>
    +   <t:dgToolBar title="common.icon.search" icon="icon-search" url="tSSmsTemplateController.do?goUpdate" funname="detail"></t:dgToolBar>
    +<%--   <t:dgToolBar title="瀵煎叆" icon="icon-put" funname="ImportXls"></t:dgToolBar>--%>
    +<%--   <t:dgToolBar title="瀵煎嚭" icon="icon-putout" funname="ExportXls"></t:dgToolBar>--%>
    +<%--   <t:dgToolBar title="妯℃澘涓嬭浇" icon="icon-putout" funname="ExportXlsByT"></t:dgToolBar>--%>
    +  </t:datagrid>
    +  </div>
    + </div>
    + <script src = "webpage/org/jeecgframework/web/sms/tSSmsTemplateList.js"></script>		
    + <script type="text/javascript">
    + $(document).ready(function(){
    + 		//缁欐椂闂存帶浠跺姞涓婃牱寮
    + 			$("#tSSmsTemplateListtb").find("input[name='createDate']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    + 			$("#tSSmsTemplateListtb").find("input[name='updateDate']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    + });
    + 
    +//瀵煎叆
    +function ImportXls() {
    +	openuploadwin('Excel瀵煎叆', 'tSSmsTemplateController.do?upload', "tSSmsTemplateList");
    +}
    +
    +//瀵煎嚭
    +function ExportXls() {
    +	JeecgExcelExport("tSSmsTemplateController.do?exportXls","tSSmsTemplateList");
    +}
    +
    +//妯℃澘涓嬭浇
    +function ExportXlsByT() {
    +	JeecgExcelExport("tSSmsTemplateController.do?exportXlsByT","tSSmsTemplateList");
    +}
    + </script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSql-add.jsp b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSql-add.jsp
    new file mode 100644
    index 00000000..51588cb4
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSql-add.jsp
    @@ -0,0 +1,85 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    + <head>
    +  <title>娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛</title>
    +  <t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +  <script type="text/javascript" src="plug-in/ckeditor_new/ckeditor.js"></script>
    +  <script type="text/javascript" src="plug-in/ckfinder/ckfinder.js"></script>
    +  <script type="text/javascript">
    +  //缂栧啓鑷畾涔塉S浠g爜
    +  </script>
    + </head>
    + <body>
    +  <t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="tSSmsTemplateSqlController.do?doAdd" tiptype="1">
    +					<input id="id" name="id" type="hidden" value="${tSSmsTemplateSqlPage.id }">
    +					<input id="createName" name="createName" type="hidden" value="${tSSmsTemplateSqlPage.createName }">
    +					<input id="createBy" name="createBy" type="hidden" value="${tSSmsTemplateSqlPage.createBy }">
    +					<input id="createDate" name="createDate" type="hidden" value="${tSSmsTemplateSqlPage.createDate }">
    +					<input id="updateName" name="updateName" type="hidden" value="${tSSmsTemplateSqlPage.updateName }">
    +					<input id="updateBy" name="updateBy" type="hidden" value="${tSSmsTemplateSqlPage.updateBy }">
    +					<input id="updateDate" name="updateDate" type="hidden" value="${tSSmsTemplateSqlPage.updateDate }">
    +		<table style="width: 100%" cellpadding="0" cellspacing="1" class="formtable">
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							閰嶇疆CODE:
    +						</label>
    +					</td>
    +					<td class="value">
    +					     	 <input id="code" name="code" type="text" style="width: 150px" class="inputxt"  
    +								               datatype="*"
    +>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">閰嶇疆CODE</label>
    +						</td>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							閰嶇疆鍚嶇О:
    +						</label>
    +					</td>
    +					<td class="value">
    +					     	 <input id="name" name="name" type="text" style="width: 150px" class="inputxt"  
    +								               datatype="*"
    +>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">閰嶇疆鍚嶇О</label>
    +						</td>
    +					</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							涓氬姟SQLID:
    +						</label>
    +					</td>
    +					<td class="value">
    +							  <t:dictSelect field="sqlId" type="list"
    +									dictTable="t_s_sms_sql" dictField="id" dictText="sql_name" 
    +									defaultVal="${tSSmsTemplateSqlPage.sqlId}" 
    +									hasLabel="false"  title="涓氬姟SQLID"
    +									extendJson="{\"datatype\":\"*\"}"></t:dictSelect>     
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">涓氬姟SQLID</label>
    +						</td>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							娑堟伅妯℃湰ID:
    +						</label>
    +					</td>
    +					<td class="value">
    +							  <t:dictSelect field="templateId" type="list"
    +									dictTable="t_s_sms_template" dictField="id" dictText="template_name" 
    +									defaultVal="${tSSmsTemplateSqlPage.templateId}" 
    +									hasLabel="false"  title="娑堟伅妯℃湰ID"
    +									extendJson="{\"datatype\":\"*\"}"></t:dictSelect>     
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">娑堟伅妯℃湰ID</label>
    +						</td>
    +					</tr>
    +			</table>
    +		</t:formvalid>
    + </body>
    +  <script src = "webpage/org/jeecgframework/web/sms/tSSmsTemplateSql.js"></script>		
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSql-update.jsp b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSql-update.jsp
    new file mode 100644
    index 00000000..8de6e21e
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSql-update.jsp
    @@ -0,0 +1,84 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    + <head>
    +  <title>娑堟伅妯℃澘_涓氬姟SQL閰嶇疆琛</title>
    +  <t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +  <script type="text/javascript" src="plug-in/ckeditor_new/ckeditor.js"></script>
    +  <script type="text/javascript" src="plug-in/ckfinder/ckfinder.js"></script>
    +  <script type="text/javascript">
    +  //缂栧啓鑷畾涔塉S浠g爜
    +  </script>
    + </head>
    + <body>
    +  <t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="tSSmsTemplateSqlController.do?doUpdate" tiptype="1">
    +					<input id="id" name="id" type="hidden" value="${tSSmsTemplateSqlPage.id }">
    +					<input id="createName" name="createName" type="hidden" value="${tSSmsTemplateSqlPage.createName }">
    +					<input id="createBy" name="createBy" type="hidden" value="${tSSmsTemplateSqlPage.createBy }">
    +					<input id="createDate" name="createDate" type="hidden" value="${tSSmsTemplateSqlPage.createDate }">
    +					<input id="updateName" name="updateName" type="hidden" value="${tSSmsTemplateSqlPage.updateName }">
    +					<input id="updateBy" name="updateBy" type="hidden" value="${tSSmsTemplateSqlPage.updateBy }">
    +					<input id="updateDate" name="updateDate" type="hidden" value="${tSSmsTemplateSqlPage.updateDate }">
    +		<table style="width: 100%;" cellpadding="0" cellspacing="1" class="formtable">
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								閰嶇疆CODE:
    +							</label>
    +						</td>
    +						<td class="value">
    +						     	 <input id="code" name="code" type="text" style="width: 150px" class="inputxt"  
    +									               datatype="*"
    +  value='${tSSmsTemplateSqlPage.code}'>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">閰嶇疆CODE</label>
    +						</td>
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								閰嶇疆鍚嶇О:
    +							</label>
    +						</td>
    +						<td class="value">
    +						     	 <input id="name" name="name" type="text" style="width: 150px" class="inputxt"  
    +									               datatype="*"
    +  value='${tSSmsTemplateSqlPage.name}'>
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">閰嶇疆鍚嶇О</label>
    +						</td>
    +					</tr>
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								涓氬姟SQLID:
    +							</label>
    +						</td>
    +						<td class="value">
    +									<t:dictSelect field="sqlId" type="list"
    +										dictTable="t_s_sms_sql" dictField="id" dictText="sql_name" 
    +										defaultVal="${tSSmsTemplateSqlPage.sqlId}" hasLabel="false"  title="涓氬姟SQLID"
    +										extendJson="{\"datatype\":\"*\"}"></t:dictSelect>     
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">涓氬姟SQLID</label>
    +						</td>
    +					<tr>
    +						<td align="right">
    +							<label class="Validform_label">
    +								娑堟伅妯℃湰ID:
    +							</label>
    +						</td>
    +						<td class="value">
    +									<t:dictSelect field="templateId" type="list"
    +										dictTable="t_s_sms_template" dictField="id" dictText="template_name" 
    +										defaultVal="${tSSmsTemplateSqlPage.templateId}" 
    +										hasLabel="false"  title="娑堟伅妯℃湰ID"
    +										extendJson="{\"datatype\":\"*\"}"></t:dictSelect>     
    +							<span class="Validform_checktip"></span>
    +							<label class="Validform_label" style="display: none;">娑堟伅妯℃湰ID</label>
    +						</td>
    +					</tr>
    +			</table>
    +		</t:formvalid>
    + </body>
    +  <script src = "webpage/org/jeecgframework/web/sms/tSSmsTemplateSql.js"></script>		
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSql.js b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSql.js
    new file mode 100644
    index 00000000..d3370d0d
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSql.js
    @@ -0,0 +1,53 @@
    +
    +
    +//閫氱敤寮瑰嚭寮忔枃浠朵笂浼
    +function commonUpload(callback){
    +    $.dialog({
    +           content: "url:systemController.do?commonUpload",
    +           lock : true,
    +           title:"鏂囦欢涓婁紶",
    +           zIndex:2100,
    +           width:700,
    +           height: 200,
    +           parent:windowapi,
    +           cache:false,
    +       ok: function(){
    +               var iframe = this.iframe.contentWindow;
    +               iframe.uploadCallback(callback);
    +                   return true;
    +       },
    +       cancelVal: '鍏抽棴',
    +       cancel: function(){
    +       } 
    +   });
    +}
    +function browseImages(inputId, Img) {// 鍥剧墖绠$悊鍣紝鍙涓笂浼犲叡鐢
    +		var finder = new CKFinder();
    +		finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 
    +			$("#" + Img).attr("src", fileUrl);
    +			$("#" + inputId).attr("value", fileUrl);
    +		};
    +		finder.resourceType = 'Images';// 鎸囧畾ckfinder鍙负鍥剧墖杩涜绠$悊
    +		finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID
    +		finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +		finder.defaultLanguage = 'zh-cn';
    +		finder.popup();
    +	}
    +function browseFiles(inputId, file) {// 鏂囦欢绠$悊鍣紝鍙涓笂浼犲叡鐢
    +	var finder = new CKFinder();
    +	finder.selectActionFunction = function(fileUrl, data) {//璁剧疆鏂囦欢琚変腑鏃剁殑鍑芥暟 
    +		$("#" + file).attr("href", fileUrl);
    +		$("#" + inputId).attr("value", fileUrl);
    +		decode(fileUrl, file);
    +	};
    +	finder.resourceType = 'Files';// 鎸囧畾ckfinder鍙负鏂囦欢杩涜绠$悊
    +	finder.selectActionData = inputId; //鎺ユ敹鍦板潃鐨刬nput ID
    +	finder.removePlugins = 'help';// 绉婚櫎甯姪(鍙湁鑻辨枃)
    +	finder.defaultLanguage = 'zh-cn';
    +	finder.popup();
    +}
    +function decode(value, id) {//value浼犲叆鍊,id鎺ュ彈鍊
    +	var last = value.lastIndexOf("/");
    +	var filename = value.substring(last + 1, value.length);
    +	$("#" + id).text(decodeURIComponent(filename));
    +}
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSqlList.js b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSqlList.js
    new file mode 100644
    index 00000000..e69de29b
    diff --git a/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSqlList.jsp b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSqlList.jsp
    new file mode 100644
    index 00000000..90f9ef05
    --- /dev/null
    +++ b/src/main/webapp/webpage/org/jeecgframework/web/sms/tSSmsTemplateSqlList.jsp
    @@ -0,0 +1,62 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +  <div region="center" style="padding:1px;">
    +  <t:datagrid name="tSSmsTemplateSqlList" checkbox="true" fitColumns="false" title="common.sqlDataTable" actionUrl="tSSmsTemplateSqlController.do?datagrid" idField="id" fit="true" queryMode="group">
    +   <t:dgCol title="common.esId"  field="id"  hidden="true"   queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.createName"  field="createName"  hidden="true"   queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.createLoginName"  field="createBy"  hidden="true"   queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.createDate"  field="createDate" formatter="yyyy-MM-dd" hidden="false"   queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.updateName"  field="updateName"  hidden="true"   queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.updateByName"  field="updateBy"  hidden="true"   queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.updateDate"  field="updateDate" formatter="yyyy-MM-dd" hidden="true"   queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.configurationCODE"  field="code" query="true" queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.configurationName"  field="name"  query="true" queryMode="single"  ></t:dgCol>
    +   <t:dgCol title="common.sqlBusinessId"  field="sqlId"  queryMode="single" dictionary="t_s_sms_sql,id,sql_name" ></t:dgCol>
    +   <t:dgCol title="common.msgModeliD"  field="templateId"  queryMode="single" dictionary="t_s_sms_template,id,template_name" ></t:dgCol>
    +   <t:dgCol title="common.opt" field="opt" width="100"></t:dgCol>
    +   <t:dgDelOpt title="common.delete" url="tSSmsTemplateSqlController.do?doDel&id={id}" />
    +   <t:dgFunOpt funname="pushTest(id,code)" title="common.pushTest"></t:dgFunOpt>
    +   <t:dgToolBar title="common.add" icon="icon-add" url="tSSmsTemplateSqlController.do?goAdd" funname="add"></t:dgToolBar>
    +   <t:dgToolBar title="common.edit" icon="icon-edit" url="tSSmsTemplateSqlController.do?goUpdate" funname="update"></t:dgToolBar>
    +   <t:dgToolBar title="common.batch.delete"  icon="icon-remove" url="tSSmsTemplateSqlController.do?doBatchDel" funname="deleteALLSelect"></t:dgToolBar>
    +   <t:dgToolBar title="common.search" icon="icon-search" url="tSSmsTemplateSqlController.do?goUpdate" funname="detail"></t:dgToolBar>
    +<%--   <t:dgToolBar title="瀵煎叆" icon="icon-put" funname="ImportXls"></t:dgToolBar>--%>
    +<%--   <t:dgToolBar title="瀵煎嚭" icon="icon-putout" funname="ExportXls"></t:dgToolBar>--%>
    +<%--   <t:dgToolBar title="妯℃澘涓嬭浇" icon="icon-putout" funname="ExportXlsByT"></t:dgToolBar>--%>
    +  </t:datagrid>
    +  </div>
    + </div>
    + <script src = "webpage/org/jeecgframework/web/sms/tSSmsTemplateSqlList.js"></script>		
    + <script type="text/javascript">
    + $(document).ready(function(){
    + 		//缁欐椂闂存帶浠跺姞涓婃牱寮
    + 			$("#tSSmsTemplateSqlListtb").find("input[name='createDate']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    + 			$("#tSSmsTemplateSqlListtb").find("input[name='updateDate']").attr("class","Wdate").attr("style","height:20px;width:90px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd'});});
    + });
    + function pushTest(id,code){
    +	 $.getJSON("tSSmsTemplateSqlController.do?pushMsg&code="+code,
    +		function(result){
    +		 if (result.success){
    +			 alert("鎺ㄩ佹垚鍔");
    +		 }else {
    +			 alert("鎺ㄩ佸け璐:"+result.msg);
    +	     }
    +	  });
    + }
    +//瀵煎叆
    +function ImportXls() {
    +	openuploadwin('Excel瀵煎叆', 'tSSmsTemplateSqlController.do?upload', "tSSmsTemplateSqlList");
    +}
    +
    +//瀵煎嚭
    +function ExportXls() {
    +	JeecgExcelExport("tSSmsTemplateSqlController.do?exportXls","tSSmsTemplateSqlList");
    +}
    +
    +//妯℃澘涓嬭浇
    +function ExportXlsByT() {
    +	JeecgExcelExport("tSSmsTemplateSqlController.do?exportXlsByT","tSSmsTemplateSqlList");
    +}
    + </script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/category/category.jsp b/src/main/webapp/webpage/system/category/category.jsp
    new file mode 100644
    index 00000000..9d351226
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/category/category.jsp
    @@ -0,0 +1,60 @@
    +<%@ page language="java" import="java.util.*"
    +	contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鍒嗙被绠$悊</title>
    +<t:base type="jquery,easyui"></t:base>
    +<script type="text/javascript">
    +	$(function() {
    +		$('#categoryTree').combotree({
    +			url : 'categoryController.do?combotree',
    +			panelHeight : 200,
    +			width : 157,
    +			onClick : function(node) {
    +				$("#parentId").val(node.id);
    +			}
    +		});
    +	});
    +	
    +</script>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +	<t:formvalid formid="formobj" dialog="true" usePlugin="password"
    +		layout="table" action="categoryController.do?save">
    +		<input id="id" name="id" type="hidden" value="${categoryPage.id }">
    +		<table style="width: 280px;" cellpadding="0" cellspacing="1"
    +			class="formtable">
    +			<tr>
    +				<td align="right"><label class="Validform_label"> 绫诲瀷鍚嶇О:
    +				</label></td>
    +				<td class="value"><input class="inputxt" id="name" name="name"
    +					ignore="ignore" value="${categoryPage.name}"> <span
    +					class="Validform_checktip"></span></td>
    +			</tr>
    +			<tr>
    +				<td align="right"><label class="Validform_label"> <t:mutiLang
    +							langKey="common.icon" />:
    +				</label></td>
    +				<td class="value"><select name="icon.id">
    +						<c:forEach items="${iconlist}" var="icon">
    +							<option value="${icon.id}"
    +								<c:if test="${icon.id==categoryPage.icon.id}">selected="selected"</c:if>>
    +								<t:mutiLang langKey="${icon.iconName}" />
    +							</option>
    +						</c:forEach>
    +				</select></td>
    +			</tr>
    +			<tr>
    +				<td align="right"><label class="Validform_label"> 鎵灞炰笂绾:
    +				</label></td>
    +				<td class="value"><input id="categoryTree"
    +					value="${categoryPage.parent.name}"> <input id="parentId"
    +					name="parent.code" style="display: none;"
    +					value="${categoryPage.parent.code}"> <span
    +					class="Validform_checktip"></span></td>
    +			</tr>
    +		</table>
    +	</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/category/categoryList.jsp b/src/main/webapp/webpage/system/category/categoryList.jsp
    new file mode 100644
    index 00000000..0d6b235b
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/category/categoryList.jsp
    @@ -0,0 +1,40 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8"
    +	pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +	<div region="center" style="padding: 1px;">
    +		<t:datagrid name="categoryList" title="menu.sort.management"
    +			actionUrl="categoryController.do?datagrid" idField="id"
    +			treegrid="true" pagination="false">
    +			<t:dgCol title="common.type.name" field="name" treefield="text" width="300"></t:dgCol>
    +			<t:dgCol title="common.icon" field="TSIcon_iconPath" treefield="code"
    +				image="true"></t:dgCol>
    +			<t:dgCol title="common.type.code" field="code" treefield="id"></t:dgCol>
    +			<t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +			<t:dgDelOpt title="common.delete"
    +				url="categoryController.do?del&id={src}" />
    +			<t:dgToolBar icon="icon-add" title="common.add"
    +				url="categoryController.do?addorupdate" funname="addCategory"></t:dgToolBar>
    +			<t:dgToolBar icon="icon-edit" title="common.edit"
    +				url="categoryController.do?addorupdate" funname="updateCategory"></t:dgToolBar>
    +		</t:datagrid>
    +	</div>
    +</div>
    +<script type="text/javascript">
    +	function addCategory(title, url, id) {
    +		var rowData = $('#' + id).datagrid('getSelected');
    +		if (rowData) {
    +			url += '&parent.code=' + rowData.id;
    +		}
    +		add(title, url, 'categoryList', 300, 340);
    +	}
    +	
    +	function updateCategory(title, url, id) {
    +		var rowData = $('#' + id).datagrid('getSelected');
    +		if (rowData) {
    +			url += '&code=' + rowData.id;
    +		}
    +		update(title, url, 'categoryList', 300, 340);
    +	}
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/dataRule/ruleData.jsp b/src/main/webapp/webpage/system/dataRule/ruleData.jsp
    new file mode 100644
    index 00000000..136b0934
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/dataRule/ruleData.jsp
    @@ -0,0 +1,40 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鎿嶄綔淇℃伅</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    + <script type="text/javascript">
    +</script>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" action="functionController.do?saverule">
    +	<input name="id" type="hidden" value="${operation.id}">
    +	<fieldset class="step">
    +        <div class="form">
    +            <label class="Validform_label"> 瑙勫垯鍚嶇О: </label>
    +            <input name="ruleName" class="inputxt" value="${operation.ruleName}" datatype="s2-20">
    +            <span class="Validform_checktip"> <t:mutiLang langKey="operatename.rang2to20"/></span>
    +        </div>
    +      <div class="form">
    +            <label class="Validform_label"> 瑙勫垯瀛楁: </label>
    +            <input name="ruleColumn" class="inputxt" value="${operation.ruleColumn}">
    +        </div>
    +        <div class="form">
    +            <label class="Validform_label"> 鏉′欢瑙勫垯: </label>
    +            
    +            
    +            	<t:dictSelect field="ruleConditions" typeGroupCode="rulecon" hasLabel="false" defaultVal="${operation.ruleConditions}"></t:dictSelect>
    +					
    +    
    +        </div>
    +           <input name="TSFunction.id" value="${functionId}" type="hidden">
    +         <div class="form">
    +            <label class="Validform_label"> 瑙勫垯鍊: </label>
    +            <input name="ruleValue" class="inputxt" value="${operation.ruleValue}">
    +        </div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/dataRule/ruleDataList.jsp b/src/main/webapp/webpage/system/dataRule/ruleDataList.jsp
    new file mode 100644
    index 00000000..c207f1bf
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/dataRule/ruleDataList.jsp
    @@ -0,0 +1,19 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:datagrid name="operationList" title="operate.manage.data" actionUrl="functionController.do?ruledategrid&functionId=${functionId}" idField="id">
    +	<t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="瑙勫垯鍚嶇О" field="ruleName" width="50"></t:dgCol>
    +    <t:dgCol title="瑙勫垯瀛楁" field="ruleColumn" width="50"></t:dgCol>
    +    <t:dgCol title="瑙勫垯鏉′欢" field="ruleConditions" width="50"></t:dgCol>
    +    <t:dgCol title="瑙勫垯鍊" field="ruleValue" width="50"></t:dgCol>
    +    <t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt url="functionController.do?delrule&id={id}" title="common.delete"></t:dgDelOpt>
    +	<t:dgFunOpt funname="editoperation(id,operationname)" title="common.edit"></t:dgFunOpt>
    +	<t:dgToolBar title="common.add.param" langArg="common.operation" icon="icon-add" url="functionController.do?addorupdaterule&functionId=${functionId}" funname="add"></t:dgToolBar>
    +	</t:datagrid>
    +<script type="text/javascript">
    +function editoperation(operationId,operationname)
    +{
    +	createwindow("<t:mutiLang langKey="common.edit.param" langArg="common.operation"/>","functionController.do?addorupdaterule&functionId=${functionId}&id="+operationId);
    +}
    +</script>
    diff --git a/src/main/webapp/webpage/system/dbsource/dbSource.jsp b/src/main/webapp/webpage/system/dbsource/dbSource.jsp
    new file mode 100644
    index 00000000..0c881a64
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/dbsource/dbSource.jsp
    @@ -0,0 +1,99 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<!DOCTYPE html>
    +<html>
    + <head>
    +  <title><t:mutiLang langKey="common.datasource.manage"/></title>
    +  <t:base type="jquery,easyui,tools,DatePicker"></t:base>
    + </head>
    + <body style="overflow-y: hidden" scroll="no">
    +  <t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="dynamicDataSourceController.do?save">
    +			<input id="id" name="id" type="hidden" value="${dbSourcePage.id }">
    +			<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							<t:mutiLang langKey="common.dbtype"/>:
    +						</label>
    +					</td>
    +					<td class="value">
    +						<input class="inputxt" id="dbKey" name="dbKey" 
    +							   value="${dbSourcePage.dbKey}" datatype="*">
    +						<span class="Validform_checktip"></span>
    +					</td>
    +				</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							<t:mutiLang langKey="common.description"/>:
    +						</label>
    +					</td>
    +					<td class="value">
    +						<input class="inputxt" id="description" name="description" 
    +							   value="${dbSourcePage.description}" datatype="*">
    +						<span class="Validform_checktip"></span>
    +					</td>
    +				</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							<t:mutiLang langKey="common.driverclass"/>:
    +						</label>
    +					</td>
    +					<td class="value">
    +						<input class="inputxt" id="driverClass" name="driverClass" 
    +							   value="${dbSourcePage.driverClass}" datatype="*">
    +						<span class="Validform_checktip"></span>
    +					</td>
    +				</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							<t:mutiLang langKey="common.datasrouce.url"/>:
    +						</label>
    +					</td>
    +					<td class="value">
    +						<input class="inputxt" id="url" name="url" 
    +							   value="${dbSourcePage.url}" datatype="*">
    +						<span class="Validform_checktip"></span>
    +					</td>
    +				</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							<t:mutiLang langKey="common.dbuser"/>:
    +						</label>
    +					</td>
    +					<td class="value">
    +						<input class="inputxt" id="dbUser" name="dbUser" 
    +							   value="${dbSourcePage.dbUser}" datatype="*">
    +						<span class="Validform_checktip"></span>
    +					</td>
    +				</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							<t:mutiLang langKey="common.dbpassword"/>:
    +						</label>
    +					</td>
    +					<td class="value">
    +						<input class="inputxt" id="dbPassword" name="dbPassword" ignore="ignore"
    +							   value="${dbSourcePage.dbPassword}">
    +						<span class="Validform_checktip"></span>
    +					</td>
    +				</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							<t:mutiLang langKey="common.dbtype"/>:
    +						</label>
    +					</td>
    +					<td class="value">
    +						<t:dictSelect field="dbType" typeGroupCode="dbtype" hasLabel="false" defaultVal="${dbSourcePage.dbType}"></t:dictSelect>
    +						<span class="Validform_checktip"></span>
    +					</td>
    +				</tr>
    +			</table>
    +		</t:formvalid>
    + </body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/dbsource/dbSourceList.jsp b/src/main/webapp/webpage/system/dbsource/dbSourceList.jsp
    new file mode 100644
    index 00000000..9a9af954
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/dbsource/dbSourceList.jsp
    @@ -0,0 +1,22 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +  <div region="center" style="padding:1px;">
    +  <t:datagrid name="dbSourceList" title="common.datasource.manage" actionUrl="dynamicDataSourceController.do?datagrid" idField="id" fit="true">
    +   <t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +   <t:dgCol title="common.datasrouce.key" field="dbKey" ></t:dgCol>
    +   <t:dgCol title="common.description" field="description" ></t:dgCol>
    +   <t:dgCol title="common.driverclass" field="driverClass" ></t:dgCol>
    +   <t:dgCol title="common.datasrouce.url" field="url" ></t:dgCol>
    +   <t:dgCol title="common.dbuser" field="dbUser" ></t:dgCol>
    +   <t:dgCol title="common.dbpassword" field="dbPassword" ></t:dgCol>
    +   <t:dgCol title="common.dbtype" field="dbType" ></t:dgCol>
    +   <t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +   <t:dgDelOpt title="common.delete" url="dynamicDataSourceController.do?del&id={id}" />
    +   <t:dgToolBar title="common.add" icon="icon-add" url="dynamicDataSourceController.do?addorupdate" funname="add"></t:dgToolBar>
    +   <t:dgToolBar title="common.edit" icon="icon-edit" url="dynamicDataSourceController.do?addorupdate" funname="update"></t:dgToolBar>
    +   <t:dgToolBar title="common.view" icon="icon-search" url="dynamicDataSourceController.do?addorupdate" funname="detail"></t:dgToolBar>
    +  </t:datagrid>
    +  </div>
    + </div>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/depart/depart.jsp b/src/main/webapp/webpage/system/depart/depart.jsp
    new file mode 100644
    index 00000000..ab81d24b
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/depart/depart.jsp
    @@ -0,0 +1,74 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>閮ㄩ棬淇℃伅</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript">
    +	$(function() {
    +		$('#cc').combotree({
    +			url : 'departController.do?setPFunction&selfId=${depart.id}',
    +            width: 155,
    +            onSelect : function(node) {
    +//                alert(node.text);
    +                changeOrgType();
    +            }
    +        });
    +        if(!$('#cc').val()) { // 绗竴绾э紝鍙樉绀哄叕鍙搁夋嫨椤
    +            var orgTypeSelect = $("#orgType");
    +            var companyOrgType = '<option value="1" <c:if test="${orgType=='1'}">selected="selected"</c:if>><t:mutiLang langKey="common.company"/></option>';
    +            orgTypeSelect.empty();
    +            orgTypeSelect.append(companyOrgType);
    +        } else { // 闈炵涓绾э紝涓嶆樉绀哄叕鍙搁夋嫨椤
    +            $("#orgType option:first").remove();
    +        }
    +        if($("#id").val()) {
    +            $('#cc').combotree('disable');
    +        }
    +        if('${empty pid}' == 'false') { // 璁剧疆鏂板椤甸潰鏃剁殑鐖剁骇
    +            $('#cc').combotree('setValue', '${pid}');
    +        }
    +	});
    +    function changeOrgType() { // 澶勭悊缁勭粐绫诲瀷锛屼笉鏄剧ず鍏徃閫夋嫨椤
    +        var orgTypeSelect = $("#orgType");
    +        var optionNum = orgTypeSelect.get(0).options.length;
    +        if(optionNum == 1) {
    +            $("#orgType option:first").remove();
    +            var bumen = '<option value="2" <c:if test="${orgType=='2'}">selected="selected"</c:if>><t:mutiLang langKey="common.department"/></option>';
    +            var gangwei = '<option value="3" <c:if test="${orgType=='3'}">selected="selected"</c:if>><t:mutiLang langKey="common.position"/></option>';
    +            orgTypeSelect.append(bumen).append(gangwei);
    +        }
    +    }
    +</script>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" action="systemController.do?saveDepart">
    +	<input id="id" name="id" type="hidden" value="${depart.id }">
    +	<fieldset class="step">
    +        <div class="form">
    +            <label class="Validform_label"> <t:mutiLang langKey="common.department.name"/>: </label>
    +            <input name="departname" class="inputxt" value="${depart.departname }"  datatype="s1-20">
    +            <span class="Validform_checktip"><t:mutiLang langKey="departmentname.rang1to20"/></span>
    +        </div>
    +        <div class="form">
    +            <label class="Validform_label"> <t:mutiLang langKey="position.desc"/>: </label>
    +            <input name="description" class="inputxt" value="${depart.description }">
    +        </div>
    +        <div class="form">
    +            <label class="Validform_label"> <t:mutiLang langKey="parent.depart"/>: </label>
    +            <input id="cc" name="TSPDepart.id" value="${depart.TSPDepart.id}">
    +        </div>
    +        <div class="form">
    +            <input type="hidden" name="orgCode" value="${depart.orgCode }">
    +            <label class="Validform_label"> <t:mutiLang langKey="common.org.type"/>: </label>
    +            <select name="orgType" id="orgType">
    +                <option value="1" <c:if test="${orgType=='1'}">selected="selected"</c:if>><t:mutiLang langKey="common.company"/></option>
    +                <option value="2" <c:if test="${orgType=='2'}">selected="selected"</c:if>><t:mutiLang langKey="common.department"/></option>
    +                <option value="3" <c:if test="${orgType=='3'}">selected="selected"</c:if>><t:mutiLang langKey="common.position"/></option>
    +            </select>
    +        </div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/depart/departList.jsp b/src/main/webapp/webpage/system/depart/departList.jsp
    new file mode 100644
    index 00000000..4c3a9de8
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/depart/departList.jsp
    @@ -0,0 +1,88 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div id="main_depart_list" class="easyui-layout" fit="true">
    +    <div region="center" style="padding: 1px;">
    +        <t:datagrid name="departList" title="common.department.list"
    +                    actionUrl="departController.do?departgrid"
    +                    treegrid="true" idField="departid" pagination="false">
    +            <t:dgCol title="common.id" field="id" treefield="id" hidden="true"></t:dgCol>
    +            <t:dgCol title="common.department.name" field="departname" treefield="text"></t:dgCol>
    +            <t:dgCol title="position.desc" field="description" treefield="src"></t:dgCol>
    +            <t:dgCol title="common.org.code" field="orgCode" treefield="fieldMap.orgCode"></t:dgCol>
    +            <t:dgCol title="common.org.type" field="orgType" dictionary="orgtype" treefield="fieldMap.orgType"></t:dgCol>
    +            <t:dgCol title="common.operation" field="opt"></t:dgCol>
    +            <t:dgDelOpt url="departController.do?del&id={id}" title="common.delete"></t:dgDelOpt>
    +            <t:dgFunOpt funname="queryUsersByDepart(id)" title="view.member"></t:dgFunOpt>
    +            <t:dgFunOpt funname="setRoleByDepart(id,text)" title="role.set"></t:dgFunOpt>
    +        </t:datagrid>
    +        <div id="departListtb" style="padding: 3px; height: 25px">
    +            <div style="float: left;">
    +                <a href="#" class="easyui-linkbutton" plain="true" icon="icon-add" onclick="addOrg()"><t:mutiLang langKey="common.add.param" langArg="common.department"/></a>
    +                <a href="#" class="easyui-linkbutton" plain="true" icon="icon-edit" onclick="update('<t:mutiLang langKey="common.edit.param" langArg="common.department"/>','departController.do?update','departList')"><t:mutiLang langKey="common.edit.param" langArg="common.department"/></a>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<div data-options="region:'east',
    +	title:'<t:mutiLang langKey="member.list"/>',
    +	collapsed:true,
    +	split:true,
    +	border:false,
    +	onExpand : function(){
    +		li_east = 1;
    +	},
    +	onCollapse : function() {
    +	    li_east = 0;
    +	}"
    +	style="width: 400px; overflow: hidden;" id="eastPanel">
    +    <div class="easyui-panel" style="padding: 1px;" fit="true" border="false" id="userListpanel"></div>
    +</div>
    +
    +<script type="text/javascript">
    +<!--
    +    $(function() {
    +        var li_east = 0;
    +    });
    +    function addOrg() {
    +        var id = "";
    +        var rowsData = $('#departList').datagrid('getSelections');
    +        if (rowsData.length == 1) {
    +            id = rowsData[0].id;
    +        }
    +        var url = "departController.do?add&id=" + id;
    +        add('<t:mutiLang langKey="common.add.param" langArg="common.department"/>', url, "departList");
    +    }
    +
    +    function queryUsersByDepart(departid){
    +        var title = '<t:mutiLang langKey="member.list"/>';
    +        if(li_east == 0 || $('#main_depart_list').layout('panel','east').panel('options').title != title){
    +            $('#main_depart_list').layout('expand','east');
    +        }
    +        <%--$('#eastPanel').panel('setTitle','<t:mutiLang langKey="member.list"/>');--%>
    +        $('#main_depart_list').layout('panel','east').panel('setTitle', title);
    +        $('#main_depart_list').layout('panel','east').panel('resize', {width: 500});
    +        $('#userListpanel').panel("refresh", "departController.do?userList&departid=" + departid);
    +    }
    +    /**
    +     * 涓 缁勭粐鏈烘瀯 璁剧疆 瑙掕壊
    +     * @param departid 缁勭粐鏈烘瀯涓婚敭
    +     * @param departname 缁勭粐鏈烘瀯鍚嶇О
    +     */
    +    function setRoleByDepart(departid, departname){
    +        var currentTitle = $('#main_depart_list').layout('panel', 'east').panel('options').title;
    +        if(li_east == 0 || currentTitle.indexOf("<t:mutiLang langKey="current.org"/>") < 0){
    +            $('#main_depart_list').layout('expand','east');
    +        }
    +        var title = departname + ':<t:mutiLang langKey="current.org"/>';
    +        $('#main_depart_list').layout('panel','east').panel('setTitle', title);
    +        $('#main_depart_list').layout('panel','east').panel('resize', {width: 200});
    +        var url = {
    +            <%--title :"test",--%>
    +            href:"roleController.do?roleTree&orgId=" + departid
    +        }
    +        $('#userListpanel').panel(url);
    +        $('#userListpanel').panel("refresh");
    +    }
    +//-->
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/depart/departSelect.jsp b/src/main/webapp/webpage/system/depart/departSelect.jsp
    new file mode 100644
    index 00000000..611089e0
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/depart/departSelect.jsp
    @@ -0,0 +1,15 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<title>缁勭粐鏈烘瀯闆嗗悎</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:datagrid name="departList" title="common.department.list" actionUrl="departController.do?departSelectDataGrid" idField="id" checkbox="true" showRefresh="false">
    +	<t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.department.name" field="departname" width="50"></t:dgCol>
    +</t:datagrid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/depart/departUserList.jsp b/src/main/webapp/webpage/system/depart/departUserList.jsp
    new file mode 100644
    index 00000000..4519bcff
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/depart/departUserList.jsp
    @@ -0,0 +1,16 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:datagrid name="departUserList" title="common.operation"
    +            actionUrl="departController.do?userDatagrid&departid=${departid}" fit="true" fitColumns="true" idField="id" queryMode="group">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.username" sortable="false" field="userName" query="true"></t:dgCol>
    +	<t:dgCol title="common.real.name" field="realName" query="true"></t:dgCol>
    +	<t:dgCol title="common.status" sortable="true" field="status" replace="common.active_1,common.inactive_0,super.admin_-1"></t:dgCol>
    +	<t:dgCol title="common.operation" field="opt"></t:dgCol>
    +	<t:dgDelOpt title="common.delete" url="userController.do?del&id={id}&userName={userName}" />
    +	<t:dgToolBar title="common.add.param" langArg="common.user" icon="icon-add" url="userController.do?addorupdate&departid=${departid}" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="common.edit.param" langArg="common.user" icon="icon-edit" url="userController.do?addorupdate&departid=${departid}" funname="update"></t:dgToolBar>
    +    <%--update-start--Author:zhangguoming  Date:20140826 for锛氭坊鍔犳湁瀹㈡埛--%>
    +	<t:dgToolBar title="common.add.exist.user" icon="icon-add" url="departController.do?goAddUserToOrg&orgId=${departid}" funname="add" width="500"></t:dgToolBar>
    +    <%--update-end--Author:zhangguoming  Date:20140826 for锛氭坊鍔犳湁瀹㈡埛--%>
    +</t:datagrid>
    diff --git a/src/main/webapp/webpage/system/depart/noCurDepartUserList.jsp b/src/main/webapp/webpage/system/depart/noCurDepartUserList.jsp
    new file mode 100644
    index 00000000..2351ee70
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/depart/noCurDepartUserList.jsp
    @@ -0,0 +1,38 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    +<%@include file="/context/mytags.jsp" %>
    +<%--闈炲綋鍓嶇粍缁囨満鏋勭殑鐢ㄦ埛鍒楄〃--%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div id="main_depart_list" class="easyui-layout" fit="true">
    +    <div region="center" style="padding: 1px;">
    +        <t:datagrid name="noCurDepartUserList" title="common.operation"
    +                    actionUrl="departController.do?addUserToOrgList&orgId=${orgId}" fit="true" fitColumns="true"
    +                    idField="id" checkbox="true" queryMode="group">
    +            <t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +            <t:dgCol title="common.username" sortable="false" field="userName" query="true"></t:dgCol>
    +            <t:dgCol title="common.real.name" field="realName" query="true"></t:dgCol>
    +            <t:dgCol title="common.status" sortable="true" field="status" replace="common.active_1,common.inactive_0,super.admin_-1"></t:dgCol>
    +        </t:datagrid>
    +    </div>
    +</div>
    +
    +<div style="display: none">
    +    <t:formvalid formid="formobj" layout="div" dialog="true" action="departController.do?doAddUserToOrg&orgId=${orgId}" beforeSubmit="setUserIds">
    +        <input id="userIds" name="userIds">
    +    </t:formvalid>
    +</div>
    +<script>
    +    function setUserIds() {
    +        $("#userIds").val(getUserListSelections('id'));
    +        return true;
    +    }
    +
    +    function getUserListSelections(field) {
    +        var ids = [];
    +        var rows = $('#noCurDepartUserList').datagrid('getSelections');
    +        for (var i = 0; i < rows.length; i++) {
    +            ids.push(rows[i][field]);
    +        }
    +        ids.join(',');
    +        return ids
    +    }
    +</script>
    diff --git a/src/main/webapp/webpage/system/document/files.jsp b/src/main/webapp/webpage/system/document/files.jsp
    new file mode 100644
    index 00000000..70589888
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/document/files.jsp
    @@ -0,0 +1,24 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鏂囦欢鍒楄〃</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" beforeSubmit="upload">
    +	<fieldset class="step">
    +	<div class="form">
    +		<label class="Validform_label"> 鏂囦欢鏍囬: </label> 
    +		<input name="documentTitle" id="documentTitle" datatype="s3-50"> 
    +		<span class="Validform_checktip">鏍囬鍚嶇О鍦3~50浣嶅瓧绗,涓斾笉涓虹┖</span>
    +	</div>
    +	<div class="form">
    +		<t:upload name="fiels" buttonText="涓婁紶鏂囦欢" uploader="systemController.do?saveFiles" extend="office" id="file_upload" formData="documentTitle"></t:upload>
    +	</div>
    +	<div class="form" id="filediv" style="height: 50px"></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/document/filesList.jsp b/src/main/webapp/webpage/system/document/filesList.jsp
    new file mode 100644
    index 00000000..33b29e48
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/document/filesList.jsp
    @@ -0,0 +1,16 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="fList" title="鏂囦欢涓嬭浇" actionUrl="systemController.do?documentList&typecode=files" idField="id" fit="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="鏍囬" field="documentTitle" width="20" query="true"></t:dgCol>
    +	<t:dgCol title="鍒涘缓鏃堕棿" field="createdate"></t:dgCol>
    +	<t:dgCol title="绫诲悕" field="subclassname" hidden="true"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt"></t:dgCol>
    +	<t:dgDefOpt url="commonController.do?viewFile&fileid={id}&subclassname={subclassname}" title="涓嬭浇"></t:dgDefOpt>
    +	<t:dgOpenOpt width="800" height="700" url="commonController.do?openViewFile&fileid={id}&subclassname={subclassname}" title="棰勮"></t:dgOpenOpt>
    +	<t:dgDelOpt url="systemController.do?delDocument&id={id}" title="鍒犻櫎"></t:dgDelOpt>
    +	<t:dgToolBar title="鏂囦欢褰曞叆" icon="icon-add" funname="add" url="systemController.do?addFiles"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    diff --git a/src/main/webapp/webpage/system/druid/index.jsp b/src/main/webapp/webpage/system/druid/index.jsp
    new file mode 100644
    index 00000000..e69de29b
    diff --git a/src/main/webapp/webpage/system/function/depart.jsp b/src/main/webapp/webpage/system/function/depart.jsp
    new file mode 100644
    index 00000000..f633ac13
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/function/depart.jsp
    @@ -0,0 +1,78 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<title>鑿滃崟闆嗗悎</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript" charset="UTF-8">
    +	 var editRow;
    +	 var treegrid;
    +	$(function() {
    +		treegrid=$('#treegrid').treegrid({
    +			url : 'functionController.do?setFunction',				
    +			title : '',			 
    +			fit : true,
    +			fitColumns : true,
    +			nowrap : true,
    +			animate : false,
    +			border : true,
    +			idField : 'id',
    +			treeField : 'text',
    +			frozenColumns : [ [ {
    +				title : 'id',
    +				field : 'id',
    +				width : 50,
    +				hidden : true
    +			}, {
    +				field : 'text',
    +				title : '鑿滃崟鍚嶇О',
    +				width : 200	 
    +			} ] ],
    +			columns : [ [{
    +				field : 'src',
    +				title : '鑿滃崟鍦板潃',
    +				width : 200
    +				 
    +			}, {
    +				field : 'code',
    +				title : '鑿滃崟缂栫爜',
    +				width : 50				 
    +			}, {
    +				field : 'parentId',
    +				title : '涓婄骇鑿滃崟',
    +				width : 200,
    +				formatter : function(value, rowData, rowIndex) {
    +					return rowData.parentText;
    +				}},
    +                   {
    +				field : 'parentText',
    +				title : '涓婄骇鑿滃崟',
    +				width : 80,
    +				hidden : true
    +			} ] ],		
    +			onLoadSuccess : function(row, data) {
    +				var t = $(this);
    +				if (data) {
    +					$(data).each(function(index, d) {
    +						if (this.state == 'closed') {
    +							//t.treegrid('expandAll');
    +						}
    +					});
    +				}
    +			}
    +			
    +  });
    +
    +	 	});
    +
    + 
    + 
    +</script>
    +</head>
    +<body>
    +<table id="treegrid"></table>
    +
    +
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/function/function.jsp b/src/main/webapp/webpage/system/function/function.jsp
    new file mode 100644
    index 00000000..d1936dad
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/function/function.jsp
    @@ -0,0 +1,119 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鑿滃崟淇℃伅</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript">
    +		
    +	$(function() {
    +		$('#cc').combotree({
    +			url : 'functionController.do?setPFunction&selfId=${function.id}',
    +			panelHeight: 200,
    +			width: 157,
    +			onClick: function(node){
    +				$("#functionId").val(node.id);
    +			}
    +		});
    +		
    +		if($('#functionLevel').val()=='1'){
    +			$('#pfun').show();
    +		}else{
    +			$('#pfun').hide();
    +		}
    +		
    +		
    +		$('#functionLevel').change(function(){
    +			if($(this).val()=='1'){
    +				$('#pfun').show();
    +				var t = $('#cc').combotree('tree');
    +				var nodes = t.tree('getRoots');
    +				if(nodes.length>0){
    +					$('#cc').combotree('setValue', nodes[0].id);
    +					$("#functionId").val(nodes[0].id);
    +				}
    +			}else{
    +				var t = $('#cc').combotree('tree');
    +				var node = t.tree('getSelected');
    +				if(node){
    +					$('#cc').combotree('setValue', null);
    +				}
    +                $("#functionId").val(null);
    +				$('#pfun').hide();
    +			}
    +		});
    +	});
    +</script>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" refresh="true" action="functionController.do?saveFunction">
    +	<input name="id" type="hidden" value="${function.id}">
    +	<fieldset class="step">
    +	<div class="form">
    +        <label class="Validform_label"> <t:mutiLang langKey="menu.name"/>: </label>
    +        <input name="functionName" class="inputxt" value="${function.functionName}" datatype="s4-20">
    +        <span class="Validform_checktip"> <t:mutiLang langKey="menuname.rang4to15"/> </span>
    +    </div>
    +    <div class="form">
    +        <label class="Validform_label"> <t:mutiLang langKey="funcType"/>: </label>
    +        <select name="functionType" id="functionType" datatype="*">
    +            <option value="0" <c:if test="${function.functionType eq 0}">selected="selected"</c:if>>
    +                <t:mutiLang langKey="funcType.page"/>
    +            </option>
    +            <option value="1" <c:if test="${function.functionType>0}"> selected="selected"</c:if>>
    +                <t:mutiLang langKey="funcType.from"/>
    +            </option>
    +        </select>
    +        <span class="Validform_checktip"></span>
    +    </div>
    +	<div class="form">
    +        <label class="Validform_label"> <t:mutiLang langKey="menu.level"/>: </label>
    +        <select name="functionLevel" id="functionLevel" datatype="*">
    +            <option value="0" <c:if test="${function.functionLevel eq 0}">selected="selected"</c:if>>
    +                <t:mutiLang langKey="main.function"/>
    +            </option>
    +            <option value="1" <c:if test="${function.functionLevel>0}"> selected="selected"</c:if>>
    +                <t:mutiLang langKey="sub.function"/>
    +            </option>
    +        </select>
    +        <span class="Validform_checktip"></span>
    +    </div>
    +	<div class="form" id="pfun">
    +        <label class="Validform_label"> <t:mutiLang langKey="parent.function"/>: </label>
    +        <input id="cc" <c:if test="${function.TSFunction.functionLevel eq 0}"> value="${function.TSFunction.id}"</c:if>
    +		<c:if test="${function.TSFunction.functionLevel > 0}"> value="${function.TSFunction.functionName}"</c:if>>
    +        <input id="functionId" name="TSFunction.id" style="display: none;" value="${function.TSFunction.id}">
    +    </div>
    +	<div class="form" id="funurl">
    +        <label class="Validform_label">
    +            <t:mutiLang langKey="menu.url"/>:
    +        </label>
    +        <input name="functionUrl" class="inputxt" value="${function.functionUrl}">
    +    </div>
    +    <div class="form">
    +        <label class="Validform_label"> <t:mutiLang langKey="common.icon"/>: </label>
    +        <select name="TSIcon.id">
    +            <c:forEach items="${iconlist}" var="icon">
    +                <option value="${icon.id}" <c:if test="${icon.id==function.TSIcon.id || (function.id eq null && icon.iconClas eq 'default') }">selected="selected"</c:if>>
    +                    <t:mutiLang langKey="${icon.iconName}"/>
    +                </option>
    +            </c:forEach>
    +        </select>
    +    </div>
    +    <div class="form">
    +        <label class="Validform_label"> <t:mutiLang langKey="desktop.icon"/>: </label>
    +        <select name="TSIconDesk.id">
    +            <c:forEach items="${iconDeskList}" var="icon">
    +                <option value="${icon.id}" <c:if test="${icon.id==function.TSIconDesk.id || (function.id eq null && icon.iconClas eq 'System Folder') }">selected="selected"</c:if>>
    +                    <t:mutiLang langKey="${icon.iconName}"/>
    +                </option>
    +            </c:forEach>
    +        </select>
    +    </div>
    +    <%--update-end--Author:zhangguoming  Date:20140509 for锛氫簯妗岄潰鍥炬爣绠$悊--%>
    +	<div class="form" id="funorder"><label class="Validform_label"> <t:mutiLang langKey="menu.order"/>: </label> <input name="functionOrder" class="inputxt" value="${function.functionOrder}" datatype="n1-3"></div>
    +	</fieldset>
    +</t:formvalid> 
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/function/functionList.jsp b/src/main/webapp/webpage/system/function/functionList.jsp
    new file mode 100644
    index 00000000..e309b423
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/function/functionList.jsp
    @@ -0,0 +1,73 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<%--   update-start--Author:duanql  Date:20130619 for锛氭搷浣滄寜閽獥鍙f樉绀烘帶鍒--%>
    +<div id="system_function_functionList" class="easyui-layout" fit="true"><%--   update-end--Author:duanql  Date:20130619 for锛氭搷浣滄寜閽獥鍙f樉绀烘帶鍒--%>
    +<div region="center" style="padding: 1px;">
    +    <t:datagrid name="functionList" title="menu.manage"
    +                actionUrl="functionController.do?functionGrid" idField="id" treegrid="true" pagination="false">
    +        <t:dgCol title="common.id" field="id" treefield="id" hidden="true"></t:dgCol>
    +        <t:dgCol title="menu.name" field="functionName" treefield="text"></t:dgCol>
    +        <t:dgCol title="common.icon" field="TSIcon_iconPath" treefield="code" image="true"></t:dgCol>
    +        <t:dgCol title="funcType" field="functionType" treefield="functionType" replace="funcType.page_0,funcType.from_1"></t:dgCol>
    +        <t:dgCol title="menu.url" field="functionUrl" treefield="src"></t:dgCol>
    +        <t:dgCol title="menu.order" field="functionOrder" treefield="order"></t:dgCol>
    +        <t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +        <t:dgDelOpt url="functionController.do?del&id={id}" title="common.delete"></t:dgDelOpt>
    +        <%--   update-start--Author:anchao  Date:20130415 for锛氭寜閽潈闄愭帶鍒--%>
    +        <t:dgFunOpt funname="operationDetail(id)" title="button.setting"></t:dgFunOpt>
    +        <t:dgFunOpt funname="operationData(id)" title="鏁版嵁瑙勫垯"></t:dgFunOpt>
    +        <%--   update-end--Author:anchao  Date:20130415 for锛氭寜閽潈闄愭帶鍒--%>
    +        <t:dgToolBar title="common.add.param" langArg="common.menu" icon="icon-add" url="functionController.do?addorupdate" funname="addFun"></t:dgToolBar>
    +        <t:dgToolBar title="common.edit.param" langArg="common.menu" icon="icon-edit" url="functionController.do?addorupdate" funname="update"></t:dgToolBar>
    +    </t:datagrid>
    +</div>
    +</div>
    +<%--   update-start--Author:duanql  Date:20130619 for锛氭搷浣滄寜閽獥鍙f樉绀烘帶鍒--%>
    +<div data-options="region:'east',
    +	title:'<t:mutiLang langKey="operate.button.list"/>',
    +	collapsed:true,
    +	split:true,
    +	border:false,
    +	onExpand : function(){
    +		li_east = 1;
    +	},
    +	onCollapse : function() {
    +	    li_east = 0;
    +	}"
    +	style="width: 400px; overflow: hidden;">
    +<div class="easyui-panel" style="padding: 1px;" fit="true" border="false" id="operationDetailpanel"></div>
    +</div>
    +</div>
    +
    +<script type="text/javascript">
    +<%--   update-start--Author:anchao  Date:20130415 for锛氭寜閽潈闄愭帶鍒--%>
    +$(function() {
    +	var li_east = 0;
    +});
    +//鏁版嵁瑙勫垯鏉冩暟
    +function  operationData(fucntionId){
    +	if(li_east == 0){
    +	   $('#system_function_functionList').layout('expand','east'); 
    +	}
    +	$('#operationDetailpanel').panel("refresh", "functionController.do?dataRule&functionId=" +fucntionId);
    +}
    +function operationDetail(functionId)
    +{
    +	if(li_east == 0){
    +	   $('#system_function_functionList').layout('expand','east'); 
    +	}
    +	$('#operationDetailpanel').panel("refresh", "functionController.do?operation&functionId=" +functionId);
    +}
    +<%--   update-end--Author:anchao  Date:20130415 for锛氭寜閽潈闄愭帶鍒--%>
    +<%--   update-start--Author:jueyue  Date:20130622 for锛氳彍鍗曞綍鍏ヤ唬鍏ョ埗鑿滃崟--%>
    +function addFun(title,url, id) {
    +	var rowData = $('#'+id).datagrid('getSelected');
    +	if (rowData) {
    +		url += '&TSFunction.id='+rowData.id;
    +	}
    +	add(title,url,'functionList');
    +}
    +<%--   update-end--Author:jueyue  Date:20130622 for锛氳彍鍗曞綍鍏ヤ唬鍏ョ埗鑿滃崟--%>
    +</script>
    +
    diff --git a/src/main/webapp/webpage/system/function/menuAppList.jsp b/src/main/webapp/webpage/system/function/menuAppList.jsp
    new file mode 100644
    index 00000000..aa8c5185
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/function/menuAppList.jsp
    @@ -0,0 +1,26 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +	<head>
    +<t:base type="jquery-webos,easyui,tools,DatePicker,autocomplete"></t:base>
    +		<link href="plug-in/sliding/css/main.css" rel="stylesheet" type="text/css" />
    +
    +        <script>
    +            $(function(){
    +            	$(".menuSearch_Info").live("click",function(){
    +            		//$(this).blur();
    +            			var url=$(this).attr("url");
    +            			var icon=$(this).attr("icon");
    +            			var id=$(this).attr("id");
    +            			var title=$(this).attr("title");
    +            			//window.parent.close();
    +            			createwindow(title,url,1000,500);
    +            		})
    +            });
    +        </script>
    +	</head>
    +	<body>
    +	${menuListMap }
    +	</body>
    +</html>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/icon/iconList.jsp b/src/main/webapp/webpage/system/icon/iconList.jsp
    new file mode 100644
    index 00000000..e6e8e7b1
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/icon/iconList.jsp
    @@ -0,0 +1,20 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +    <t:datagrid name="iconList" title="icon.list" actionUrl="iconController.do?datagrid" idField="id">
    +        <t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +        <t:dgCol title="common.icon.name" query="true" field="iconName"></t:dgCol>
    +        <t:dgCol title="common.icon.style" field="iconClas"></t:dgCol>
    +        <t:dgCol title="common.icon.type" field="iconType" replace="system.icon_1,menu.icon_2,desktop.icon_3"></t:dgCol>
    +        <t:dgCol title="common.icon" field="iconPath" image="true" style="width:20px; height:20px;"></t:dgCol>
    +        <t:dgCol title="common.icon.type" field="extend"></t:dgCol>
    +        <t:dgCol title="common.operation" field="opt"></t:dgCol>
    +        <t:dgDelOpt url="iconController.do?del&id={id}" title="common.delete"></t:dgDelOpt>
    +        <t:dgToolBar title="common.add.param" langArg="common.icon" icon="icon-add" url="iconController.do?addorupdate" funname="add"></t:dgToolBar>
    +        <t:dgToolBar title="common.edit.param" langArg="common.icon" icon="icon-edit" url="iconController.do?addorupdate" funname="update"></t:dgToolBar>
    +        <t:dgToolBar title="batch.generate.style" icon="icon-edit" url="iconController.do?repair" funname="doSubmit"></t:dgToolBar>
    +    </t:datagrid>
    +</div>
    +</div>
    diff --git a/src/main/webapp/webpage/system/icon/icons.jsp b/src/main/webapp/webpage/system/icon/icons.jsp
    new file mode 100644
    index 00000000..a64409f5
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/icon/icons.jsp
    @@ -0,0 +1,31 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鍥炬爣淇℃伅</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" beforeSubmit="upload">
    +	<input name="id" id="id" type="hidden" value="${icon.id}">
    +	<fieldset class="step">
    +	<div class="form">
    +        <label class="Validform_label"> <t:mutiLang langKey="common.icon.name"/>: </label>
    +        <input name="iconName" datatype="s2-10" id="iconName" value="${icon.iconName}" class="inputxt">
    +        <span class="Validform_checktip"><t:mutiLang langKey="iconname.rang2to10"/></span>
    +    </div>
    +	<div class="form">
    +        <label class="Validform_label"> <t:mutiLang langKey="common.icon.type"/>: </label>
    +        <select name="iconType" id="iconType">
    +            <option value="1" <c:if test="${icon.iconType=='1'}">selected="selected"</c:if>><t:mutiLang langKey="system.icon"/></option>
    +            <option value="2" <c:if test="${icon.iconType=='2'}">selected="selected"</c:if>><t:mutiLang langKey="menu.icon"/></option>
    +            <option value="3" <c:if test="${icon.iconType=='3'}">selected="selected"</c:if>><t:mutiLang langKey="desktop.icon"/></option>
    +        </select>
    +    </div>
    +	<div class="form" id="filediv"></div>
    +	<div class="form"><t:upload name="file_upload" uploader="iconController.do?saveOrUpdateIcon" extend="*.png;" id="file_upload" formId="formobj"></t:upload></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/log/logDetail.jsp b/src/main/webapp/webpage/system/log/logDetail.jsp
    new file mode 100644
    index 00000000..27bc7e51
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/log/logDetail.jsp
    @@ -0,0 +1,46 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鏃ュ織璇︽儏</title>
    +<t:base type="jquery,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true">
    +	<fieldset class="step"><legend> <%-- <t:mutiLang langKey="common.loginfo"/> --%> 鏃ュ織璇︽儏</legend>
    +	
    +	<div class="form"><label class="form"> <%-- <t:mutiLang langKey="common.username"/> --%>鎿嶄綔浜:${tsLog.TSUser.userName } </label>
    +	 </div>
    +	<div class="form"><label class="form"> <%-- <t:mutiLang langKey="common.logtype"/> --%>鏃ュ織绫诲瀷: </label>
    +	   <!-- 浠ュ悗鍐嶇粺涓鐢辨暟鎹瓧鍏哥淮鎶  fangwenrong-->
    +	   <c:if test="${tsLog.operatetype==1}"><t:mutiLang langKey="common.login"/></c:if>
    +	   <c:if test="${tsLog.operatetype==2}"><t:mutiLang langKey="common.logout"/></c:if>
    +	   <c:if test="${tsLog.operatetype==3}"><t:mutiLang langKey="common.insert"/></c:if>
    +	   <c:if test="${tsLog.operatetype==4}"><t:mutiLang langKey="common.delete"/></c:if>
    +	   <c:if test="${tsLog.operatetype==5}"><t:mutiLang langKey="common.update"/></c:if>
    +	   <c:if test="${tsLog.operatetype==6}"><t:mutiLang langKey="common.upload"/></c:if>
    +	   <c:if test="${tsLog.operatetype==7}"><t:mutiLang langKey="common.other"/></c:if>
    +	</div>
    +	<div class="form"><label class="form"> <t:mutiLang langKey="log.content"/>: </label> ${tsLog.logcontent }</div>
    +	<div class="form"><label class="form"> <%-- <t:mutiLang langKey="common.loglevel"/> --%>鏃ュ織绛夌骇: </label>
    +	   <!-- 浠ュ悗鍐嶇粺涓鐢辨暟鎹瓧鍏哥淮鎶  fangwenrong-->
    +	   <c:if test="${tsLog.loglevel==1}">INFO</c:if>
    +	   <c:if test="${tsLog.loglevel==2}">WARRING</c:if>
    +	   <c:if test="${tsLog.loglevel==3}">ERROR</c:if>
    +	</div>
    +
    +	<div class="form"><label class="form"> <t:mutiLang langKey="operate.ip"/>: </label> ${tsLog.note}</div>
    +	<div class="form"><label class="form"> <t:mutiLang langKey="operate.time"/>: </label>
    +	  <fmt:formatDate value="${tsLog.operatetime}" pattern="yyyy-MM-dd HH:mm:ss"/> 
    +	 </div>
    +	<div class="form"><label class="form"> <t:mutiLang langKey="common.browser"/>: </label> ${tsLog.broswer}</div>
    +	
    +
    +	</fieldset>
    +	</form>
    +</t:formvalid>
    +</body>
    +</html>
    +
    +
    diff --git a/src/main/webapp/webpage/system/log/logList.jsp b/src/main/webapp/webpage/system/log/logList.jsp
    new file mode 100644
    index 00000000..ffd64a03
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/log/logList.jsp
    @@ -0,0 +1,55 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<t:datagrid title="log.manage" name="logList" actionUrl="logController.do?datagrid" idField="id" sortName="operatetime" sortOrder="desc" pageSize="1000" extendParams="view:scrollview,">
    +	<t:dgCol title="log.level" field="loglevel" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="log.content" field="logcontent" width="200"></t:dgCol>
    +	<t:dgCol title="operate.ip" field="note" width="200"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔浜篒D" field="TSUser.userName" width="200"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔浜哄悕" field="TSUser.realName" width="200"></t:dgCol>
    +	<t:dgCol title="common.browser.recommend" field="broswer" width="100"></t:dgCol>
    +	<t:dgCol title="operate.time" field="operatetime" formatter="yyyy-MM-dd hh:mm:ss" width="100"></t:dgCol>
    +</t:datagrid>
    +<div id="logListtb" style="padding: 3px; height: 25px">
    +	<%--add-begin--Author:zhoujf  Date:20150531 for锛氭棩蹇楄鎯呮寜閽綅缃縼绉 --%>
    +	<span style="float:left;">
    +		<a href="#" class="easyui-linkbutton l-btn l-btn-plain" plain="true" icon="icon-search" onclick="detail('<t:mutiLang langKey="common.view"/>','logController.do?logDetail','logList',null,null)" id="">
    +		<t:mutiLang langKey="common.view"/>
    +		</a>
    +	</span>
    +	<%--add-end--Author:zhoujf  Date:20150531 for锛氭棩蹇楄鎯呮寜閽綅缃縼绉--%>
    +	
    +    <!-- update---Author:璧典繆澶  Date:20130507 for锛氶渶瑕佸姞name=searchColums灞炴 -->
    +    <div name="searchColums" style="float: right; padding-right: 15px;">
    +        <t:mutiLang langKey="log.level"/>: <!-- update---Author:瀹嬪弻鏃  Date:20130414 for锛氭敼鍙樺艰繘琛屾煡璇 -->
    +        <select name="loglevel" id="loglevel" onchange="logListsearch();">
    +            <option value="0"><t:mutiLang langKey="select.loglevel"/></option>
    +            <option value="1"><t:mutiLang langKey="common.login"/></option>
    +            <option value="2"><t:mutiLang langKey="common.logout"/></option>
    +            <option value="3"><t:mutiLang langKey="common.insert"/></option>
    +            <option value="4"><t:mutiLang langKey="common.delete"/></option>
    +            <option value="5"><t:mutiLang langKey="common.update"/></option>
    +            <option value="6"><t:mutiLang langKey="common.upload"/></option>
    +            <option value="7"><t:mutiLang langKey="common.other"/></option>
    +        </select>
    +       <%--add-begin--Author:zhangguoming  Date:20140427 for锛氭坊鍔犳煡璇㈡潯浠  鎿嶄綔鏃堕棿--%>
    +        <span>
    +            <span style="vertical-align:middle;display:-moz-inline-box;display:inline-block;width: 80px;text-align:right;" title="鎿嶄綔鏃堕棿 "><t:mutiLang langKey="operate.time"/>: </span>
    +            <input type="text" name="operatetime_begin" style="width: 100px; height: 24px;">~
    +            <input type="text" name="operatetime_end" style="width: 100px; height: 24px; margin-right: 20px;">
    +        </span>
    +        <%--add-end--Author:zhangguoming  Date:20140427 for锛氭坊鍔犳煡璇㈡潯浠  鎿嶄綔鏃堕棿--%>
    +        <a href="#" class="easyui-linkbutton" iconCls="icon-search" onclick="logListsearch();"><t:mutiLang langKey="common.query"/></a>
    +    </div>
    +</div>
    +<%--add-begin--Author:zhangguoming  Date:20140427 for锛氭坊鍔犳煡璇㈡潯浠  鎿嶄綔鏃堕棿--%>
    +<script type="text/javascript">
    +    $(document).ready(function(){
    +        $("input[name='operatetime_begin']").attr("class","Wdate").attr("style","height:20px;width:140px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss '});});
    +        $("input[name='operatetime_end']").attr("class","Wdate").attr("style","height:20px;width:140px;").click(function(){WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'});});
    +
    +        $("input").css("height", "24px");
    +    });
    +</script>
    +<%--add-end--Author:zhangguoming  Date:20140427 for锛氭坊鍔犳煡璇㈡潯浠  鎿嶄綔鏃堕棿--%>
    diff --git a/src/main/webapp/webpage/system/log/statisticTabs.jsp b/src/main/webapp/webpage/system/log/statisticTabs.jsp
    new file mode 100644
    index 00000000..76073085
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/log/statisticTabs.jsp
    @@ -0,0 +1,11 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!-- context path -->
    +<t:base type="jquery,easyui"></t:base>
    +<script type="text/javascript" src="plug-in/Highcharts-2.2.5/js/highcharts.src.js"></script>
    +<script type="text/javascript" src="plug-in/Highcharts-2.2.5/js/modules/exporting.src.js"></script>
    +<t:tabs id="tt" iframe="false">
    +	<t:tab href="logController.do?userBroswer&reportType=line" icon="icon-search" title="user.analysis.line" id="pnode"></t:tab>
    +	<t:tab href="logController.do?userBroswer&reportType=pie" icon="icon-search" title="user.analysis.pie" id="pnode"></t:tab>
    +	<t:tab href="logController.do?userBroswer&reportType=column" icon="icon-search" title="user.analysis.histogram" id="pnode"></t:tab>
    +</t:tabs>
    diff --git a/src/main/webapp/webpage/system/log/userBroswer.jsp b/src/main/webapp/webpage/system/log/userBroswer.jsp
    new file mode 100644
    index 00000000..5a488f68
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/log/userBroswer.jsp
    @@ -0,0 +1,62 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<c:set var="ctxPath" value="${pageContext.request.contextPath}" />
    +<!DOCTYPE html >
    +<script type="text/javascript">
    +	$(function() {
    +		$(document).ready(function() {
    +			var chart;
    +			$.ajax({
    +				type : "POST",
    +				url : "logController.do?getBroswerBar&reportType=${reportType}",
    +				success : function(jsondata) {
    +					data = eval(jsondata);
    +					chart = new Highcharts.Chart({
    +						chart : {
    +							renderTo : 'containerCol',
    +							plotBackgroundColor : null,
    +							plotBorderWidth : null,
    +							plotShadow : false
    +						},
    +						title : {
    +							text : "<t:mutiLang langKey="user.browser.analysis"/>"
    +						},
    +						xAxis : {
    +							categories : [ 'IE9', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 7.0', 'Firefox', 'Chrome' ]
    +						},
    +						tooltip : {
    +							 percentageDecimals : 1,
    +							 formatter: function() {
    +            					return  '<b>'+this.point.name + '</b>:' +  Highcharts.numberFormat(this.percentage, 1) +'%';
    +         					}
    +
    +						},
    +						exporting:{  
    +			                filename:'column',  
    +			                url:'${ctxPath}/logController.do?export'//
    +			            },
    +						plotOptions : {
    +							column : {
    +								allowPointSelect : true,
    +								cursor : 'pointer',
    +								showInLegend : true,
    +								dataLabels : {
    +									enabled : true,
    +									color : '#000000',
    +									connectorColor : '#000000',
    +									formatter : function() {
    +										return '<b>' + this.point.name + '</b>: ' +Highcharts.numberFormat(this.percentage, 1)+"%";
    +									}
    +								}
    +							}
    +						},
    +						series : data
    +					});
    +				}
    +			});
    +		});
    +	});
    +</script>
    +<div id="containerCol" style="width: 80%; height: 80%"></div>
    +
    +
    diff --git a/src/main/webapp/webpage/system/log/userBroswerLine.jsp b/src/main/webapp/webpage/system/log/userBroswerLine.jsp
    new file mode 100644
    index 00000000..78cf335a
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/log/userBroswerLine.jsp
    @@ -0,0 +1,59 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<c:set var="ctxPath" value="${pageContext.request.contextPath}" />
    +<script type="text/javascript">
    +	$(function() {
    +		$(document).ready(function() {
    +			var chart;
    +			$.ajax({
    +				type : "POST",
    +				url : "logController.do?getBroswerBar&reportType=${reportType}",
    +				success : function(jsondata) {
    +					data = eval(jsondata);
    +					chart = new Highcharts.Chart({
    +						chart : {
    +							renderTo : 'containerline',
    +							plotBackgroundColor : null,
    +							plotBorderWidth : null,
    +							plotShadow : false
    +						},
    +						title : {
    +							text : "<t:mutiLang langKey="user.browser.analysis"/>"
    +						},
    +						xAxis : {
    +							categories : [ 'IE9', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 7.0', 'Firefox', 'Chrome' ]
    +						},
    +						tooltip : {
    +							pointFormat : '{series.name}: <b>{point.percentage}%</b>',
    +							percentageDecimals : 1
    +
    +						},
    +						exporting:{  
    +			                filename:'鎶樼嚎鍥',  
    +			                 url:'${ctxPath}/logController.do?export'  
    +			            }, 
    +						plotOptions : {
    +							pie : {
    +								allowPointSelect : true,
    +								cursor : 'pointer',
    +								showInLegend : true,
    +								dataLabels : {
    +									enabled : true,
    +									color : '#000000',
    +									connectorColor : '#000000',
    +									formatter : function() {
    +										return '<b>' + this.point.name + '</b>: ' + this.percentage + ' %';
    +									}
    +								}
    +							}
    +						},
    +						series : data
    +					});
    +				}
    +			});
    +		});
    +	});
    +</script>
    +<div id="containerline" style="width: 80%; height: 80%"></div>
    +
    +
    diff --git a/src/main/webapp/webpage/system/log/userBroswerPie.jsp b/src/main/webapp/webpage/system/log/userBroswerPie.jsp
    new file mode 100644
    index 00000000..98df3b64
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/log/userBroswerPie.jsp
    @@ -0,0 +1,62 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<c:set var="ctxPath" value="${pageContext.request.contextPath}" />
    +<script type="text/javascript">
    +	$(function() {
    +		$(document).ready(function() {
    +			var chart;
    +			$.ajax({
    +				type : "POST",
    +				url : "logController.do?getBroswerBar&reportType=${reportType}",
    +				success : function(jsondata) {
    +					data = eval(jsondata);
    +					chart = new Highcharts.Chart({
    +						chart : {
    +							renderTo : 'containerPie',
    +							plotBackgroundColor : null,
    +							plotBorderWidth : null,
    +							plotShadow : false
    +						},
    +						title : {
    +							text : "<t:mutiLang langKey="user.browser.analysis"/>"
    +						},
    +						xAxis : {
    +							categories : [ 'IE9', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 7.0', 'Firefox', 'Chrome' ]
    +						},
    +						tooltip : {
    +							shadow: false,
    +							percentageDecimals : 1,
    +							formatter: function() {
    +            					return  '<b>'+this.point.name + '</b>:' +  Highcharts.numberFormat(this.percentage, 1) +'%';
    +         					}
    +
    +						},
    +						exporting:{  
    +			                filename:'pie',  
    +			                 url:'${ctxPath}/logController.do?export'  
    +			            },  
    +						plotOptions : {
    +							pie : {
    +								allowPointSelect : true,
    +								cursor : 'pointer',
    +								showInLegend : true,
    +								dataLabels : {
    +									enabled : true,
    +									color : '#000000',
    +									connectorColor : '#000000',
    +									formatter : function() {
    +										return '<b>' + this.point.name + '</b>: ' + Highcharts.numberFormat(this.percentage, 1)+"%";
    +									}
    +								}
    +							}
    +						},
    +						series : data
    +					});
    +				}
    +			});
    +		});
    +	});
    +</script>
    +<div id="containerPie" style="width: 80%; height: 80%"></div>
    +
    +
    diff --git a/src/main/webapp/webpage/system/mutilang/mutiLang.jsp b/src/main/webapp/webpage/system/mutilang/mutiLang.jsp
    new file mode 100644
    index 00000000..50de9e0c
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/mutilang/mutiLang.jsp
    @@ -0,0 +1,50 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    + <head>
    +  <title><t:mutiLang langKey="lang.maintain"/></title>
    +  <t:base type="jquery,easyui,tools,DatePicker"></t:base>
    + </head>
    + <body style="overflow-y: hidden" scroll="no">
    +  <t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="mutiLangController.do?save">
    +			<input id="id" name="id" type="hidden" value="${mutiLangPage.id }">
    +			<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							<t:mutiLang langKey="common.languagekey"/>:
    +						</label>
    +					</td>
    +					<td class="value">
    +						<input class="inputxt" id="langKey" name="langKey" 
    +							   value="${mutiLangPage.langKey}" datatype="*">
    +						<span class="Validform_checktip"></span>
    +					</td>
    +				</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							<t:mutiLang langKey="common.content"/>:
    +						</label>
    +					</td>
    +					<td class="value">
    +						<input class="inputxt" id="langContext" name="langContext" 
    +							   value="${mutiLangPage.langContext}" datatype="*">
    +						<span class="Validform_checktip"></span>
    +					</td>
    +				</tr>
    +				<tr>
    +					<td align="right">
    +						<label class="Validform_label">
    +							<t:mutiLang langKey="common.language"/>:
    +						</label>
    +					</td>
    +					<td class="value">
    +						<t:dictSelect field="langCode" typeGroupCode="lang" hasLabel="false" defaultVal="${mutiLangPage.langCode}"></t:dictSelect>
    +						<span class="Validform_checktip"></span>
    +					</td>
    +				</tr>
    +			</table>
    +		</t:formvalid>
    + </body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/mutilang/mutiLangList.jsp b/src/main/webapp/webpage/system/mutilang/mutiLangList.jsp
    new file mode 100644
    index 00000000..fbc0780f
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/mutilang/mutiLangList.jsp
    @@ -0,0 +1,24 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools"/>
    +<div class="easyui-layout" fit="true">
    +  <div region="center" style="padding:1px;">
    +  <t:datagrid name="mutiLangList" title="lang.maintain" actionUrl="mutiLangController.do?datagrid" 
    +      idField="id" fit="true" queryMode="group" sortName="createDate" sortOrder="desc">
    +   <t:dgCol title="common.code" field="id" hidden="true"></t:dgCol>
    +   <t:dgCol title="common.languagekey" field="langKey" query="true" extend="{style:'width:200px'}"></t:dgCol>
    +   <t:dgCol title="common.content" field="langContext" query="true" extend="{style:'width:200px'}"></t:dgCol>
    +   <t:dgCol title="common.language" field="langCode" ></t:dgCol>
    +   <t:dgCol title="common.createby" field="createBy" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.createtime" field="createDate" formatter="yyyy-MM-dd" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.updateby" field="updateBy" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.updatetime" field="updateDate" formatter="yyyy-MM-dd" hidden="true"></t:dgCol>
    +   <t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +   <t:dgDelOpt title="common.delete" url="mutiLangController.do?del&id={id}" />
    +   <t:dgToolBar title="common.add.param" langArg="common.language" icon="icon-add" url="mutiLangController.do?addorupdate" funname="add"></t:dgToolBar>
    +   <t:dgToolBar title="common.edit.param" langArg="common.language" icon="icon-edit" url="mutiLangController.do?addorupdate" funname="update"></t:dgToolBar>
    +   <t:dgToolBar title="common.view" icon="icon-search" url="mutiLangController.do?addorupdate" funname="detail"></t:dgToolBar>
    +   <t:dgToolBar title="common.refresh" icon="icon-search" url="mutiLangController.do?refreshCach" funname="doSubmit"></t:dgToolBar>
    +  </t:datagrid>
    + </div>
    +</div> 
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/operation/operation.jsp b/src/main/webapp/webpage/system/operation/operation.jsp
    new file mode 100644
    index 00000000..ce39ef58
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/operation/operation.jsp
    @@ -0,0 +1,60 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鎿嶄綔淇℃伅</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript">
    +  </script>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" action="functionController.do?saveop">
    +	<input name="id" type="hidden" value="${operation.id}">
    +	<fieldset class="step">
    +        <div class="form">
    +            <label class="Validform_label"> <t:mutiLang langKey="operate.name"/>: </label>
    +            <input name="operationname" class="inputxt" value="${operation.operationname}" datatype="s2-20">
    +            <span class="Validform_checktip"> <t:mutiLang langKey="operatename.rang2to20"/></span>
    +        </div>
    +        <div class="form">
    +            <label class="Validform_label"> <t:mutiLang langKey="operate.code"/>: </label>
    +            <input name="operationcode" class="inputxt" value="${operation.operationcode}">
    +        </div>
    +        <!-- 鍥炬爣瀛楁鐜板湪涓嶇敤鏆傛椂闅愯棌-->
    +        <div class="form" style="display: none;">
    +            <label class="Validform_label"> <t:mutiLang langKey="common.icon.name"/>: </label>
    +            <select name="TSIcon.id">
    +                <c:forEach items="${iconlist}" var="icon">
    +                    <option value="${icon.id}" <c:if test="${icon.id==function.TSIcon.id }">selected="selected"</c:if>>${icon.iconName}</option>
    +                </c:forEach>
    +            </select>
    +        </div>
    +        <div class="form">
    +            <label class="Validform_label"> <t:mutiLang langKey="operation.type"/>: </label>
    +            <select name="operationType">
    +                <option value="0" <c:if test="${operation.operationType eq 0}">selected="selected"</c:if>>
    +                <t:mutiLang langKey="common.hide"/>
    +	            </option>
    +	            <option value="1" <c:if test="${operation.operationType>0}"> selected="selected"</c:if>>
    +	                <t:mutiLang langKey="operationType.disabled"/>
    +	            </option>
    +            </select>
    +        </div>
    +        <input name="TSFunction.id" value="${functionId}" type="hidden">
    +        <div class="form">
    +            <label class="Validform_label"> <t:mutiLang langKey="common.status"/> </label>
    +        <select name="status">
    +                <option value="0" <c:if test="${operation.status eq 0}">selected="selected"</c:if>>
    +                	<t:mutiLang langKey="common.enable"/>
    +	            </option>
    +	            <option value="1" <c:if test="${operation.status>0}"> selected="selected"</c:if>>
    +	                <t:mutiLang langKey="common.disable"/>
    +	            </option>
    +            </select>
    +            <span class="Validform_checktip"><t:mutiLang langKey="operatestatus.number"/></span>
    +        </div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/operation/operationList.jsp b/src/main/webapp/webpage/system/operation/operationList.jsp
    new file mode 100644
    index 00000000..f05db9d6
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/operation/operationList.jsp
    @@ -0,0 +1,21 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:datagrid name="operationList" title="operate.manage" actionUrl="functionController.do?opdategrid&functionId=${functionId}" idField="id">
    +	<t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="operate.name" field="operationname" width="100"></t:dgCol>
    +	<t:dgCol title="operate.code" field="operationcode"></t:dgCol>
    +	<t:dgCol title="common.type" field="operationType" replace="common.hide_0,operationType.disabled_1"></t:dgCol>
    +	<t:dgCol title="common.status" field="status" replace="common.enable_0,common.disable_1"></t:dgCol>
    +<!--	<t:dgCol title="permission.name" field="TSFunction_functionName"></t:dgCol>-->
    +	<t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt url="functionController.do?delop&id={id}" title="common.delete"></t:dgDelOpt>
    +	<t:dgFunOpt funname="editoperation(id,operationname)" title="common.edit"></t:dgFunOpt>
    +	<t:dgToolBar title="common.add.param" langArg="common.operation" icon="icon-add" url="functionController.do?addorupdateop&functionId=${functionId}" funname="add"></t:dgToolBar>
    +	<%-- <t:dgToolBar title="鎿嶄綔缂栬緫" icon="icon-edit" url="functionController.do?addorupdateop&functionId=${functionId}" funname="update"></t:dgToolBar>--%>
    +</t:datagrid>
    +<script type="text/javascript">
    +function editoperation(operationId,operationname)
    +{
    +	createwindow("<t:mutiLang langKey="common.edit.param" langArg="common.operation"/>","functionController.do?addorupdateop&functionId=${functionId}&id="+operationId);
    +}
    +</script>
    diff --git a/src/main/webapp/webpage/system/role/dataRuleListForFunction.jsp b/src/main/webapp/webpage/system/role/dataRuleListForFunction.jsp
    new file mode 100644
    index 00000000..f6dc970f
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/role/dataRuleListForFunction.jsp
    @@ -0,0 +1,26 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<c:forEach items="${dataRuleList}" var="dataRule">
    +<span class="icon group_add">&nbsp;</span>
    +	<c:if test="${fn:contains(dataRulecodes, dataRule.id)}">
    +		<input style="width: 20px;" type="checkbox" name="operationCheckbox1" value="${dataRule.id}" checked="checked" />${dataRule.ruleName}
    +	 </c:if>
    +	<c:if test="${!fn:contains(dataRulecodes, dataRule.id)}">
    +		<input style="width: 20px;" type="checkbox" name="operationCheckbox1" value="${dataRule.id}" />${dataRule.ruleName}
    +	 </c:if>
    +	<br>
    +</c:forEach>
    +<script type="text/javascript">
    +function submitDataRule() {
    +	var functionId = "${functionId}";
    +	var roleId = $("#rid").val();
    +	var dataRulecodes = "";
    +	$("input[name='operationCheckbox1']").each(function(i){
    +		   if(this.checked){
    +			   dataRulecodes+=this.value+",";
    +		   }
    +	 });
    +	dataRulecodes=escape(dataRulecodes); 
    +	doSubmit("roleController.do?updateDataRule&functionId=" + functionId + "&roleId=" + roleId+"&dataRulecodes="+dataRulecodes);
    +}
    +</script>
    diff --git a/src/main/webapp/webpage/system/role/functionList.jsp b/src/main/webapp/webpage/system/role/functionList.jsp
    new file mode 100644
    index 00000000..b246188a
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/role/functionList.jsp
    @@ -0,0 +1,48 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<title><t:mutiLang langKey="permission.collection"/></title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript">
    +	function op() {
    +		var a = "";
    +		jq('input[type="checkbox"][name="operatons"]:checked').each(function() {
    +			a = a + jq(this).val() + ",";
    +		});
    +		var obj = new Object();
    +		obj.fq =a;
    +		obj.roleId = jq("#roleId").val();
    +		//淇濆瓨
    +		jq.ajax({
    +			async : false,
    +			cache : false,
    +			type : 'POST',
    +			data:obj,
    +			url : 'roleController.do?saveOperate', // 璇锋眰鐨刟ction璺緞
    +			error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +			},
    +			success : function(data) {
    +				var d = jq.parseJSON(data);
    +				if (d.success) {
    +					jq.dialog.tips('鎿嶄綔鎴愬姛', 2);
    +				}
    +
    +			}
    +		});
    +	}
    +</script>
    +</head>
    +<body>
    +<t:datagrid name="functionList" title="permission.manage" actionUrl="roleController.do?setOperate&roleId=${roleId}" idField="functionid" treegrid="true" pagination="false">
    +	<t:dgCol title="common.id" field="id" treefield="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="permission.name" field="functionName" width="100" treefield="text"></t:dgCol>
    +	<t:dgCol title="common.operation" field="TOperations" width="300" treefield="operations"></t:dgCol>
    +</t:datagrid>
    +<div id="functionListtb" style="padding: 5px; height: 30px">
    +<div style="float: left;"><input type="hidden" name="roleId" id="roleId" value="${roleId }"> <a href="#" class="easyui-linkbutton" plain="true" icon="icon-add" onclick="op();">淇濆瓨</a> <a
    +	href="#" class="easyui-linkbutton" plain="true" icon="icon-back" onClick="history.go(-1)">杩斿洖</a></div>
    +</div>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/role/noCurRoleUserList.jsp b/src/main/webapp/webpage/system/role/noCurRoleUserList.jsp
    new file mode 100644
    index 00000000..af1c96ec
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/role/noCurRoleUserList.jsp
    @@ -0,0 +1,38 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    +<%@include file="/context/mytags.jsp" %>
    +<%--闈炲綋鍓嶈鑹茬殑鐢ㄦ埛鍒楄〃--%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div id="main_role_list" class="easyui-layout" fit="true">
    +    <div region="center" style="padding: 1px;">
    +        <t:datagrid name="noCurRoleUserList" title="common.operation"
    +                    actionUrl="roleController.do?addUserToRoleList&roleId=${param.roleId}" fit="true" fitColumns="true"
    +                    idField="id" checkbox="true" queryMode="group">
    +            <t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +            <t:dgCol title="common.username" sortable="false" field="userName" query="true"></t:dgCol>
    +            <t:dgCol title="common.real.name" field="realName" query="true"></t:dgCol>
    +            <t:dgCol title="common.status" sortable="true" field="status" replace="common.active_1,common.inactive_0,super.admin_-1"></t:dgCol>
    +        </t:datagrid>
    +    </div>
    +</div>
    +
    +<div style="display: none">
    +    <t:formvalid formid="formobj" layout="div" dialog="true" action="roleController.do?doAddUserToRole&roleId=${param.roleId}" beforeSubmit="setUserIds">
    +        <input id="userIds" name="userIds">
    +    </t:formvalid>
    +</div>
    +<script>
    +    function setUserIds() {
    +        $("#userIds").val(getUserListSelections('id'));
    +        return true;
    +    }
    +
    +    function getUserListSelections(field) {
    +        var ids = [];
    +        var rows = $('#noCurRoleUserList').datagrid('getSelections');
    +        for (var i = 0; i < rows.length; i++) {
    +            ids.push(rows[i][field]);
    +        }
    +        ids.join(',');
    +        return ids
    +    }
    +</script>
    diff --git a/src/main/webapp/webpage/system/role/operationListForFunction.jsp b/src/main/webapp/webpage/system/role/operationListForFunction.jsp
    new file mode 100644
    index 00000000..08a94427
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/role/operationListForFunction.jsp
    @@ -0,0 +1,27 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<c:forEach items="${operationList}" var="operation">
    +	<c:if test="${fn:contains(operationcodes, operation.id)}">
    +		<span class="icon ${operation.TSIcon.iconClas}">&nbsp;</span>
    +		<input style="width: 20px;" type="checkbox" name="operationCheckbox" value="${operation.id}" checked="checked" />${operation.operationname}
    +	 </c:if>
    +	<c:if test="${!fn:contains(operationcodes, operation.id)}">
    +		<span class="icon group_add">&nbsp;</span>
    +		<input style="width: 20px;" type="checkbox" name="operationCheckbox" value="${operation.id}" />${operation.operationname}
    +	 </c:if>
    +	<br>
    +</c:forEach>
    +<script type="text/javascript">
    +function submitOperation() {
    +	var functionId = "${functionId}";
    +	var roleId = $("#rid").val();
    +	var operationcodes = "";
    +	$("input[name='operationCheckbox']").each(function(i){
    +		   if(this.checked){
    +			   operationcodes+=this.value+",";
    +		   }
    +	 });
    +	operationcodes=escape(operationcodes); 
    +	doSubmit("roleController.do?updateOperation&functionId=" + functionId + "&roleId=" + roleId+"&operationcodes="+operationcodes);
    +}
    +</script>
    diff --git a/src/main/webapp/webpage/system/role/role.jsp b/src/main/webapp/webpage/system/role/role.jsp
    new file mode 100644
    index 00000000..39c430c4
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/role/role.jsp
    @@ -0,0 +1,20 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title><t:mutiLang langKey="common.role.info"/></title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" action="roleController.do?saveRole">
    +	<input name="id" type="hidden" value="${role.id}">
    +	<fieldset class="step">
    +	<div class="form"><label class="Validform_label"><t:mutiLang langKey="common.role.name"/>:</label> <input name="roleName" class="inputxt" value="${role.roleName }" datatype="s2-8"> <span class="Validform_checktip"><t:mutiLang langKey="rolescope.rang2to8.notnull"/></span>
    +	</div>
    +	<div class="form"><label class="Validform_label"> <t:mutiLang langKey="common.role.code"/>: </label> <input name="roleCode" id="roleCode" ajaxurl="roleController.do?checkRole&code=${role.roleCode }" class="inputxt"
    +		value="${role.roleCode }" datatype="s2-15"> <span class="Validform_checktip"><t:mutiLang langKey="rolecode.rang2to15.notnull"/></span></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/role/roleList.jsp b/src/main/webapp/webpage/system/role/roleList.jsp
    new file mode 100644
    index 00000000..7faaf496
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/role/roleList.jsp
    @@ -0,0 +1,60 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +<t:datagrid name="roleList" title="common.role.list" actionUrl="roleController.do?roleGrid" 
    +    idField="id" sortName="createDate" sortOrder="desc">
    +	<t:dgCol title="common.code" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.role.code" field="roleCode"></t:dgCol>
    +	<t:dgCol title="common.role.name" field="roleName" query="true"></t:dgCol>
    +	<t:dgCol title="common.createby" field="createBy" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.createtime" field="createDate" formatter="yyyy-MM-dd" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.updateby" field="updateBy" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.updatetime" field="updateDate" formatter="yyyy-MM-dd" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.operation" field="opt"></t:dgCol>
    +	<t:dgFunOpt funname="delRole(id)" title="common.delete"></t:dgFunOpt>
    +	<t:dgFunOpt funname="userListbyrole(id,roleName)" title="common.user"></t:dgFunOpt>
    +	<t:dgFunOpt funname="setfunbyrole(id,roleName)" title="permission.set"></t:dgFunOpt>
    +	<t:dgToolBar title="common.add.param" langArg="common.role" icon="icon-add" url="roleController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="common.edit.param" langArg="common.role" icon="icon-edit" url="roleController.do?addorupdate" funname="update"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +<div region="east" style="width: 600px;" split="true">
    +<div tools="#tt" class="easyui-panel" title='<t:mutiLang langKey="permission.set"/>' style="padding: 10px;" fit="true" border="false" id="function-panel"></div>
    +</div>
    +<div id="tt"></div>
    +</div>
    +<script type="text/javascript">
    +function setfunbyrole(id,roleName) {
    +	$("#function-panel").panel(
    +		{
    +			title :roleName+ ':' + '<t:mutiLang langKey="current.permission"/>',
    +			href:"roleController.do?fun&roleId=" + id
    +		}
    +	);
    +	$('#function-panel').panel("refresh" );
    +	
    +}
    +function userListbyrole(id,roleName) {
    +	$("#function-panel").panel(
    +		{
    +			title :roleName+ ':' + '<t:mutiLang langKey="common.user"/>',
    +			href:"roleController.do?userList&roleId=" + id
    +		}
    +	);
    +	$('#function-panel').panel("refresh" );
    +	
    +}
    +//鍒犻櫎瑙掕壊
    +function delRole(id){
    +	var tabName= 'roleList';
    +	var url= 'roleController.do?delRole&id='+id;
    +	$.dialog.confirm('<t:mutiLang langKey="confirm.delete.this.record"/>', function(){
    +		doSubmit(url,tabName);
    +		rowid = '';
    +		$("#function-panel").html("");//鍒犻櫎瑙掕壊鍚庯紝娓呯┖瀵瑰簲鐨勬潈闄
    +	}, function(){
    +	});
    +}
    +</script>
    diff --git a/src/main/webapp/webpage/system/role/roleSet.jsp b/src/main/webapp/webpage/system/role/roleSet.jsp
    new file mode 100644
    index 00000000..9de8750e
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/role/roleSet.jsp
    @@ -0,0 +1,109 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<script type="text/javascript">
    +	$(function() {
    +		$('#functionid').tree({
    +			checkbox : true,
    +			url : 'roleController.do?setAuthority&roleId=${roleId}',
    +			onLoadSuccess : function(node) {
    +				expandAll();
    +			},
    +			onClick: function(node){
    +				var isRoot =  $('#functionid').tree('getChildren', node.target);
    +				if(isRoot==''){
    +					var roleId = $("#rid").val();
    +					$('#operationListpanel').panel("refresh", "roleController.do?operationListForFunction&functionId="+node.id+"&roleId="+roleId);
    +						$('#dataRuleListpanel').panel("refresh", "roleController.do?dataRuleListForFunction&functionId="+node.id+"&roleId="+roleId);
    +				}else {
    +				}
    +			}
    +		});
    +		$("#functionListPanel").panel(
    +				{
    +					title :'<t:mutiLang langKey="menu.list"/>',
    +					tools:[{iconCls:'icon-save',handler:function(){mysubmit();}}]
    +				}
    +		);
    +		$("#operationListpanel").panel(
    +				{
    +					title :'<t:mutiLang langKey="operate.manage"/>',
    +					tools:[{iconCls:'icon-save',handler:function(){submitOperation();}}]
    +				}
    +		);
    +		
    +			$("#dataRuleListpanel").panel(
    +				{
    +					title :'鏁版嵁瑙勫垯鏉冮檺',
    +					tools:[{iconCls:'icon-save',handler:function(){submitDataRule();}}]
    +				}
    +		);
    +	});
    +	function mysubmit() {
    +		var roleId = $("#rid").val();
    +		var s = GetNode();
    +		doSubmit("roleController.do?updateAuthority&rolefunctions=" + s + "&roleId=" + roleId);
    +	}
    +	function GetNode() {
    +		var node = $('#functionid').tree('getChecked');
    +		var cnodes = '';
    +		var pnodes = '';
    +		var pnode = null; //淇濆瓨涓婁竴姝ユ墍閫夌埗鑺傜偣
    +		for ( var i = 0; i < node.length; i++) {
    +			if ($('#functionid').tree('isLeaf', node[i].target)) {
    +				cnodes += node[i].id + ',';
    +				pnode = $('#functionid').tree('getParent', node[i].target); //鑾峰彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
    +				while (pnode!=null) {//娣诲姞鍏ㄩ儴鐖惰妭鐐
    +					pnodes += pnode.id + ',';
    +					pnode = $('#functionid').tree('getParent', pnode.target); 
    +				}
    +			}
    +		}
    +		cnodes = cnodes.substring(0, cnodes.length - 1);
    +		pnodes = pnodes.substring(0, pnodes.length - 1);
    +		return cnodes + "," + pnodes;
    +	};
    +	
    +	function expandAll() {
    +		var node = $('#functionid').tree('getSelected');
    +		if (node) {
    +			$('#functionid').tree('expandAll', node.target);
    +		} else {
    +			$('#functionid').tree('expandAll');
    +		}
    +	}
    +	function selecrAll() {
    +		var node = $('#functionid').tree('getRoots');
    +		for ( var i = 0; i < node.length; i++) {
    +			var childrenNode =  $('#functionid').tree('getChildren',node[i].target);
    +			for ( var j = 0; j < childrenNode.length; j++) {
    +				$('#functionid').tree("check",childrenNode[j].target);
    +			}
    +	    }
    +	}
    +	function reset() {
    +		$('#functionid').tree('reload');
    +	}
    +
    +	$('#selecrAllBtn').linkbutton({   
    +	}); 
    +	$('#resetBtn').linkbutton({   
    +	});   
    +</script>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +<div class="easyui-panel" style="padding: 1px;" fit="true" border="false" id="functionListPanel"><input type="hidden" name="roleId" value="${roleId}" id="rid"> <a id="selecrAllBtn"
    +	onclick="selecrAll();"><t:mutiLang langKey="select.all"/></a> <a id="resetBtn" onclick="reset();"><t:mutiLang langKey="common.reset"/></a>
    +<ul id="functionid"></ul>
    +</div>
    +</div>
    +<div region="east" style="width: 300px; overflow: hidden;" split="true">
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;" >
    +<div class="easyui-panel" style="padding: 1px;" fit="true" border="false" id="operationListpanel"></div>
    +</div>
    +<div region="east" style="width: 150px; overflow: hidden;" split="true"><div class="easyui-panel" style="padding: 1px;" fit="true" border="false" id="dataRuleListpanel"></div></div>
    +</div>
    +
    +
    +</div>
    +</div>
    diff --git a/src/main/webapp/webpage/system/role/roleTree.jsp b/src/main/webapp/webpage/system/role/roleTree.jsp
    new file mode 100644
    index 00000000..358df758
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/role/roleTree.jsp
    @@ -0,0 +1,90 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<script type="text/javascript">
    +	$(function() {
    +        // 鑾峰彇骞舵瀯寤鸿鑹睺ree锛氬睍绀鸿鑹叉爲骞堕変腑褰撳墠缁勭粐鏈烘瀯鎵鎷ユ湁鐨勮鑹诧紱
    +		$('#orgRoleTree').tree({
    +			checkbox : true,
    +			url : 'roleController.do?getRoleTree&orgId=${orgId}',
    +			onLoadSuccess : function(node) {
    +				expandAll();
    +			}
    +		});
    +		$("#functionListPanel").panel(
    +				{
    +					title :'<t:mutiLang langKey="common.role.list"/>',
    +					tools:[{iconCls:'icon-save',handler:function(){mysubmit();}}]
    +				}
    +		);
    +	});
    +	function mysubmit() { // 鎻愪氦
    +		var orgId = $("#orgId").val();
    +		var ids = GetNode();
    +		doSubmit("roleController.do?updateOrgRole&roleIds=" + ids + "&orgId=" + orgId);
    +	}
    +    /**
    +     * 鑾峰彇 閫変腑鐨勮妭鐐 骞惰繑鍥
    +     * @returns {string} 鑺傜偣id锛屽涓猧d宸查楀彿鍒嗗壊
    +     * @constructor
    +     */
    +    function GetNode() {
    +		var node = $('#orgRoleTree').tree('getChecked');
    +		var cnodes = '';
    +		var pnodes = '';
    +		var pnode = null; //淇濆瓨涓婁竴姝ユ墍閫夌埗鑺傜偣
    +		for ( var i = 0; i < node.length; i++) {
    +			if ($('#orgRoleTree').tree('isLeaf', node[i].target)) {
    +				cnodes += node[i].id + ',';
    +				pnode = $('#orgRoleTree').tree('getParent', node[i].target); //鑾峰彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
    +				while (pnode!=null) {//娣诲姞鍏ㄩ儴鐖惰妭鐐
    +					pnodes += pnode.id + ',';
    +					pnode = $('#orgRoleTree').tree('getParent', pnode.target); 
    +				}
    +			}
    +		}
    +		cnodes = cnodes.substring(0, cnodes.length - 1);
    +		pnodes = pnodes.substring(0, pnodes.length - 1);
    +		return cnodes + "," + pnodes;
    +	}
    +	/**
    +	 * 灞曞紑鎵鏈夎妭鐐
    +     */
    +	function expandAll() {
    +		var node = $('#orgRoleTree').tree('getSelected');
    +		if (node) {
    +			$('#orgRoleTree').tree('expandAll', node.target);
    +		} else {
    +			$('#orgRoleTree').tree('expandAll');
    +		}
    +	}
    +    /**
    +     * 閫夋嫨鎵鏈夎妭鐐
    +     */
    +	function selecrAll() {
    +		var node = $('#orgRoleTree').tree('getRoots');
    +		for ( var i = 0; i < node.length; i++) {
    +            $('#orgRoleTree').tree("check",node[i].target);
    +	    }
    +	}
    +    /**
    +     * 閲嶇疆鏍
    +     */
    +	function reset() {
    +		$('#orgRoleTree').tree('reload');
    +	}
    +
    +	$('#selecrAllBtn').linkbutton({
    +	});
    +	$('#resetBtn').linkbutton({   
    +	});   
    +</script>
    +<div class="easyui-layout" fit="true">
    +    <div region="center" style="padding: 1px;">
    +        <div class="easyui-panel" style="padding: 1px;" fit="true" border="false" id="functionListPanel">
    +            <input type="hidden" name="orgId" value="${orgId}" id="orgId">
    +            <a id="selecrAllBtn" onclick="selecrAll();"><t:mutiLang langKey="select.all"/></a>
    +            <a id="resetBtn" onclick="reset();"><t:mutiLang langKey="common.reset"/></a>
    +            <ul id="orgRoleTree"></ul>
    +        </div>
    +    </div>
    +</div>
    diff --git a/src/main/webapp/webpage/system/role/roleUserList.jsp b/src/main/webapp/webpage/system/role/roleUserList.jsp
    new file mode 100644
    index 00000000..9de8a2e3
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/role/roleUserList.jsp
    @@ -0,0 +1,21 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<%--<t:datagrid name="userList" title="user.manage" actionUrl="roleController.do?roleUserDatagrid&roleId=${roleId}" fit="true" fitColumns="true" idField="id">--%>
    +<%--	<t:dgCol title="common.id" field="id" hidden="true" ></t:dgCol>--%>
    +<%--	<t:dgCol title="common.username" sortable="false" field="userName" width="5"></t:dgCol>--%>
    +<%--	<t:dgCol title="common.real.name" field="realName" width="5"></t:dgCol>--%>
    +<%--</t:datagrid>--%>
    +
    +<t:datagrid name="roleUserList" title="common.operation"
    +            actionUrl="roleController.do?roleUserDatagrid&roleId=${roleId}" fit="true" fitColumns="true" idField="id" queryMode="group">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.username" sortable="false" field="userName" query="true"></t:dgCol>
    +	<t:dgCol title="common.real.name" field="realName" query="true"></t:dgCol>
    +	<t:dgCol title="common.status" sortable="true" field="status" replace="common.active_1,common.inactive_0,super.admin_-1"></t:dgCol>
    +	<t:dgCol title="common.operation" field="opt"></t:dgCol>
    +	<t:dgDelOpt title="common.delete" url="userController.do?del&id={id}&userName={userName}" />
    +	<t:dgToolBar title="common.add.param" langArg="common.user" icon="icon-add" url="userController.do?addorupdate&roleId=${roleId}" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="common.edit.param" langArg="common.user" icon="icon-edit" url="userController.do?addorupdate&roleId=${roleId}" funname="update"></t:dgToolBar>
    +	<t:dgToolBar title="common.add.exist.user" icon="icon-add" url="roleController.do?goAddUserToRole&roleId=${roleId}" funname="add" width="500"></t:dgToolBar>
    +</t:datagrid>
    +
    diff --git a/src/main/webapp/webpage/system/territory/territory.jsp b/src/main/webapp/webpage/system/territory/territory.jsp
    new file mode 100644
    index 00000000..ebdae61b
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/territory/territory.jsp
    @@ -0,0 +1,82 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鍦板煙淇℃伅</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<script type="text/javascript">
    +		
    +	$(function() {
    +		$('#cc').combotree({
    +			url : 'territoryController.do?setPTerritory',
    +			panelHeight:'auto',
    +			onClick: function(node){
    +				$("#territoryId").val(node.id);
    +			}
    +		});
    +		
    +		if($('#territoryLevel').val()=='1'){
    +			$('#pfun').show();
    +		}else{
    +			$('#pfun').hide();
    +		}
    +		
    +		
    +		$('#territoryLevel').change(function(){
    +			if($(this).val()=='1'){
    +				$('#pfun').show();
    +				var t = $('#cc').combotree('tree');
    +				var nodes = t.tree('getRoots');
    +				if(nodes.length>0){
    +					$('#cc').combotree('setValue', nodes[0].id);
    +					$("#territoryId").val(nodes[0].id);
    +				}
    +			}else{
    +				var t = $('#cc').combotree('tree');
    +				var node = t.tree('getSelected');
    +				if(node){
    +					$('#cc').combotree('setValue', null);
    +				}
    +				$('#pfun').hide();
    +			}
    +		});
    +	});
    +</script>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" refresh="true" action="territoryController.do?saveTerritory">
    +	<input name="id" type="hidden" value="${territory.id}">
    +	<fieldset class="step">
    +        <div class="form">
    +            <label class="Validform_label"> <t:mutiLang langKey="area.name"/>: </label>
    +            <input name="territoryName" class="inputxt" value="${territory.territoryName}" datatype="s2-15">
    +            <span class="Validform_checktip"><t:mutiLang langKey="areaname.rang2to15"/></span>
    +        </div>
    +        <div class="form">
    +            <label class="Validform_label"> <t:mutiLang langKey="area.level"/>: </label>
    +            <select name="territoryLevel" id="territoryLevel" datatype="*">
    +                <option value="0" <c:if test="${territory.territoryLevel eq 0}">selected="selected"</c:if>><t:mutiLang langKey="main.area"/></option>
    +                <option value="1" <c:if test="${territory.territoryLevel>0}"> selected="selected"</c:if>><t:mutiLang langKey="sub.area"/></option>
    +            </select>
    +            <span class="Validform_checktip"></span>
    +        </div>
    +        <div class="form" id="pfun">
    +            <label class="Validform_label"> <t:mutiLang langKey="parent.area"/>: </label>
    +            <input id="cc"
    +                <c:if test="${territory.TSTerritory.territoryLevel eq 0}"> value="${territory.TSTerritory.id}"</c:if>
    +                <c:if test="${territory.TSTerritory.territoryLevel > 0}"> value="${territory.TSTerritory.territoryName}"</c:if>>
    +            <input id="territoryId" name="TSTerritory.id" style="display: none;" value="${territory.TSTerritory.id}">
    +        </div>
    +        <div class="form" id="funorder">
    +            <label class="Validform_label"> <t:mutiLang langKey="area.code"/>: </label>
    +            <input name="territoryCode" class="inputxt" value="${territory.territoryCode}" datatype="*6-16">
    +        </div>
    +        <div class="form" id="funorder">
    +            <label class="Validform_label"> <t:mutiLang langKey="display.order"/>: </label>
    +            <input name="territorySort" class="inputxt" value="${territory.territorySort}" datatype="n1-3">
    +        </div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/territory/territoryList.jsp b/src/main/webapp/webpage/system/territory/territoryList.jsp
    new file mode 100644
    index 00000000..479fcb0e
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/territory/territoryList.jsp
    @@ -0,0 +1,29 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div id="system_territory_territoryList" class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="territoryList" title="area.manage" actionUrl="territoryController.do?territoryGrid" idField="id" treegrid="true" pagination="false">
    +	<t:dgCol title="common.id" field="id" treefield="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="area.name" field="territoryName" treefield="text"></t:dgCol>
    +	<t:dgCol title="area.code" field="territorySrc" treefield="src"></t:dgCol>
    +	<t:dgCol title="display.order" field="territorySort" treefield="order"></t:dgCol>
    +	<t:dgCol title="common.operation" field="opt"></t:dgCol>
    +	<t:dgDelOpt url="territoryController.do?del&id={id}" title="common.delete"></t:dgDelOpt>
    +	<t:dgToolBar title="common.add.param" langArg="common.area" icon="icon-add" url="territoryController.do?addorupdate" funname="addFun"></t:dgToolBar>
    +	<t:dgToolBar title="common.edit.param" langArg="common.area" icon="icon-edit" url="territoryController.do?addorupdate" funname="update"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +
    +<script type="text/javascript">
    +$(function() {
    +	var li_east = 0;
    +});
    +function addFun(title,url, id) {
    +	var rowData = $('#'+id).datagrid('getSelected');
    +	if (rowData) {
    +		url += '&TSTerritory.id='+rowData.id;
    +	}
    +	add(title,url,'territoryList');
    +}
    +</script>
    +
    diff --git a/src/main/webapp/webpage/system/timetask/timeTask.jsp b/src/main/webapp/webpage/system/timetask/timeTask.jsp
    new file mode 100644
    index 00000000..c37b28a8
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/timetask/timeTask.jsp
    @@ -0,0 +1,23 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>瀹氭椂浠诲姟绠$悊</title>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="div" action="timeTaskController.do?save">
    +	<input id="id" name="id" type="hidden" value="${timeTaskPage.id }">
    +	<input id="isEffect" name="isEffect" type="hidden" value="${(empty timeTaskPage.isEffect)?0:timeTaskPage.isEffect}">
    +	<input id="isStart" name="isStart" type="hidden" value="${(empty timeTaskPage.isStart)?1:timeTaskPage.isStart }">
    +	<fieldset class="step">
    +	<div class="form"><label class="Validform_label"><t:mutiLang langKey="common.taskid"/>:</label> <input class="inputxt" id="taskId" name="taskId" value="${timeTaskPage.taskId}" datatype="*"> <span
    +		class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"><t:mutiLang langKey="common.task.desc"/>:</label> <input class="inputxt" id="taskDescribe" name="taskDescribe" value="${timeTaskPage.taskDescribe}" datatype="*"> <span
    +		class="Validform_checktip"></span></div>
    +	<div class="form"><label class="Validform_label"><t:mutiLang langKey="cron.expression"/>:</label> <input class="inputxt" id="cronExpression" name="cronExpression" value="${timeTaskPage.cronExpression}" datatype="*"> <span
    +		class="Validform_checktip"></span></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/timetask/timeTaskList.jsp b/src/main/webapp/webpage/system/timetask/timeTaskList.jsp
    new file mode 100644
    index 00000000..6ff5a158
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/timetask/timeTaskList.jsp
    @@ -0,0 +1,27 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +	<t:datagrid name="timeTaskList" title="schedule.task.manage" actionUrl="timeTaskController.do?datagrid" 
    +	    idField="id" fit="true" sortName="createDate" sortOrder="desc">
    +	<t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.taskid" field="taskId"></t:dgCol>
    +	<t:dgCol title="common.task.desc" field="taskDescribe"></t:dgCol>
    +	<t:dgCol title="cron.expression" field="cronExpression"></t:dgCol>
    +	<t:dgCol title="common.iseffect" field="isEffect" replace="鏈敓鏁坃0,宸茬敓鏁坃1"></t:dgCol>
    +	<t:dgCol title="running.state" field="isStart" replace="鍋滄_0,杩愯_1"></t:dgCol>
    +	<t:dgCol title="common.createby" field="createBy" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.createtime" field="createDate" formatter="yyyy-MM-dd" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.updateby" field="updateBy" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.updatetime" field="updateDate" formatter="yyyy-MM-dd" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +	<t:dgConfOpt title="common.start" url="timeTaskController.do?startOrStopTask&id={id}&isStart=1" message="纭杩愯浠诲姟" exp="isStart#eq#0"/>
    +	<t:dgConfOpt title="common.stop" url="timeTaskController.do?startOrStopTask&id={id}&isStart=0" message="纭鍋滄" exp="isStart#eq#1"/>
    +	<t:dgConfOpt title="effective.immediately" url="timeTaskController.do?updateTime&id={id}" message="纭鏇存柊浠诲姟鏃堕棿" exp="isEffect#eq#0"/>
    +	<t:dgDelOpt title="common.delete" url="timeTaskController.do?del&id={id}" />
    +	<t:dgToolBar title="common.add" icon="icon-add" url="timeTaskController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="common.edit" icon="icon-edit" url="timeTaskController.do?addorupdate" funname="update"></t:dgToolBar>
    +	<t:dgToolBar title="common.view" icon="icon-search" url="timeTaskController.do?addorupdate" funname="detail"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    diff --git a/src/main/webapp/webpage/system/type/type.jsp b/src/main/webapp/webpage/system/type/type.jsp
    new file mode 100644
    index 00000000..295e6a57
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/type/type.jsp
    @@ -0,0 +1,33 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    +<%@include file="/context/mytags.jsp" %>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +    <t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" action="systemController.do?saveType">
    +    <input name="id" type="hidden" value="${type.id }">
    +    <input name="TSTypegroup.id" type="hidden" value="${typegroupid}">
    +    <fieldset class="step">
    +        <%--// add-start--Author:zhangguoming  Date:20140928 for锛氭坊鍔犳樉绀哄瓧娈--%>
    +        <div class="form">
    +            <label class="Validform_label"> <t:mutiLang langKey="lang.dictionary.type"/>: </label>
    +            <input readonly="true" class="inputxt" value="${typegroupname }">
    +        </div>
    +        <%--// add-end--Author:zhangguoming  Date:20140928 for锛氭坊鍔犳樉绀哄瓧娈--%>
    +        <div class="form">
    +            <label class="Validform_label"> <t:mutiLang langKey="dict.name"/>: </label>
    +            <input name="typename" class="inputxt" value="${type.typename }" datatype="s1-10">
    +            <span class="Validform_checktip">绫诲瀷鑼冨洿鍦1~10浣嶅瓧绗</span>
    +        </div>
    +        <div class="form">
    +            <label class="Validform_label"> <t:mutiLang langKey="dict.code"/>: </label>
    +            <input name="typecode" class="inputxt" value="${type.typecode }" datatype="*"
    +                   ajaxurl="systemController.do?checkType&code=${type.typecode }&typeGroupCode=${type.TSTypegroup.typegroupcode}">
    +            <span class="Validform_checktip">绫诲瀷缂栫爜鍦1~10浣嶅瓧绗</span>
    +        </div>
    +    </fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/type/typeGroupList.jsp b/src/main/webapp/webpage/system/type/typeGroupList.jsp
    new file mode 100644
    index 00000000..c7402738
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/type/typeGroupList.jsp
    @@ -0,0 +1,152 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<%--
    +<script type="text/javascript">
    +function typeGridTree_AddType() {
    +	var treeCtrlId = "typeGridTree";
    +	var node = $("#"+treeCtrlId).treegrid('getSelected');
    +	if (node == null) {
    +		tip("璇烽夋嫨涓涓瓧鍏哥粍");
    +		return;
    +	}
    +	if (node.state == "closed" || node.children) {
    +	} else {//鍙剁粨鐐
    +		node = $("#"+treeCtrlId).treegrid('getParent', node.id); //鑾峰彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
    +	}
    +	var groupid = node.id.substring(1);
    +	add("鍙傛暟鍊煎綍鍏("+node.text+")", "systemController.do?addorupdateType&typegroupid="+groupid, treeCtrlId);
    +}
    +function typeGridTree_UpdateType() {
    +	var treeCtrlId = "typeGridTree";
    +	var node = $("#"+treeCtrlId).treegrid('getSelected');
    +	if (node == null) {
    +		tip("璇烽夋嫨涓涓紪杈戝璞°");
    +		return;
    +	}
    +	var nodeid = node.id.substring(1);
    +	if (node.state == "closed" || node.children) {
    +		createwindow("瀛楀吀缂栬緫", "systemController.do?aouTypeGroup&id="+nodeid);
    +	} else {//鍙剁粨鐐
    +		var pnode = $("#"+treeCtrlId).treegrid('getParent', node.id); //鑾峰彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
    +		var groupid = pnode.id.substring(1);
    +		createwindow("鍙傛暟鍊肩紪杈", "systemController.do?addorupdateType&typegroupid="+groupid+"&id="+nodeid);
    +	}
    +}
    +</script>
    +
    +&lt;%&ndash; add-start--Author:zhangguoming  Date:20140807 for锛氭坊鍔犲瓧鍏告煡璇㈡潯浠 &ndash;%&gt;
    +<script>
    +    $(function() {
    +        var datagrid = $("#typeGridTreetb");
    +        datagrid.prepend($("#tempSearchColums").html());
    +
    +        var toolbarDiv = $("#typeGridTreetb div.datagrid-toolbar");
    +        toolbarDiv.append($("#tempToolbar").html());
    +    });
    +    function processExpandTree() {
    +    }
    +    function typeGridTreesearch2() {
    +        processExpandTree();
    +        typeGridTreesearch();
    +    }
    +    function EnterPress2(e) {
    +        var e = e || window.event;
    +        if (e.keyCode == 13) {
    +            processExpandTree();
    +            typeGridTreesearch();
    +        }
    +    }
    +    function searchReset2(name) {
    +        $("#" + name + "tb").find(":input").val("");
    +        processExpandTree();
    +        typeGridTreesearch();
    +    }
    +</script>
    +<div id="tempSearchColums" style="display: none">
    +    <div name="searchColums">
    +        <span style="display:-moz-inline-box;display:inline-block;">
    +            <span style="vertical-align:middle;display:-moz-inline-box;display:inline-block;width: 80px;text-align:right;" title="<t:mutiLang langKey="dict.name"/>"><t:mutiLang langKey="dict.name"/>锛</span>
    +            <input onkeypress="EnterPress2(event)" onkeydown="EnterPress2()" type="text" name="typegroupname" style="width: 100px">
    +        </span>
    +        <span style="display:-moz-inline-box;display:inline-block;">
    +            <span style="vertical-align:middle;display:-moz-inline-box;display:inline-block;width: 80px;text-align:right;" title="<t:mutiLang langKey="dict.code"/>"><t:mutiLang langKey="dict.code"/>锛</span>
    +            <input onkeypress="EnterPress2(event)" onkeydown="EnterPress2()" type="text" name="typegroupcode" style="width: 100px">
    +        </span>
    +    </div>
    +</div>
    +<div id="tempToolbar" style="display: none">
    +    <span style="float:right">
    +        <a href="#" class="easyui-linkbutton l-btn" iconcls="icon-search" onclick="typeGridTreesearch2()"><t:mutiLang langKey="common.query"/></a>
    +        <a href="#" class="easyui-linkbutton l-btn" iconcls="icon-reload" onclick="searchReset2('typeGridTree')"><t:mutiLang langKey="common.reset"/></a>
    +    </span>
    +</div>
    +&lt;%&ndash; add-end--Author:zhangguoming  Date:20140807 for锛氭坊鍔犲瓧鍏告煡璇㈡潯浠 &ndash;%&gt;
    +
    +<t:datagrid name="typeGridTree" title="common.data.dictionary" actionUrl="systemController.do?typeGridTree"
    +            idField="id" treegrid="true" pagination="false">
    +	<t:dgCol title="common.code" field="id" treefield="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="dict.name" field="typename" width="100" treefield="text"></t:dgCol>
    +	<t:dgCol title="dict.code" field="code" width="100" treefield="code"></t:dgCol>
    +	<t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt url="systemController.do?delTypeGridTree&id={id}" title="common.delete"></t:dgDelOpt>
    +	<t:dgToolBar title="common.add.param" langArg="lang.dictionary.type" icon="icon-add" url="systemController.do?aouTypeGroup" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="common.add.param" langArg="lang.dictionary.value" icon="icon-add" funname="typeGridTree_AddType"></t:dgToolBar>
    +	<t:dgToolBar title="common.edit" icon="icon-edit" funname="typeGridTree_UpdateType"></t:dgToolBar>
    +</t:datagrid>
    +<input type="hidden" id="typeGroupId" name="typeGroupId" value="">
    +--%>
    +
    +<%--// add-start--Author:zhangguoming  Date:20140928 for锛氭暟鎹瓧鍏镐慨鏀--%>
    +<div id="main_typegroup_list" class="easyui-layout" fit="true">
    +    <div region="center" style="padding: 1px;">
    +        <t:datagrid name="typeGridTree" title="common.data.dictionary" actionUrl="systemController.do?typeGroupGrid"
    +                    idField="id" treegrid="false" pagination="false" onLoadSuccess="loadSuccess">
    +            <t:dgCol title="common.code" field="id" hidden="true"></t:dgCol>
    +            <t:dgCol title="dict.name" field="typegroupname" width="100" query="true"></t:dgCol>
    +            <t:dgCol title="dict.code" field="typegroupcode" width="100" treefield="code"></t:dgCol>
    +            <t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +            <t:dgDelOpt url="systemController.do?delTypeGroup&id={id}" title="common.delete"></t:dgDelOpt>
    +            <t:dgFunOpt funname="queryTypeValue(id,typegroupname)" title="common.type.view"></t:dgFunOpt>
    +            <t:dgToolBar title="common.add.param" langArg="lang.dictionary.type" icon="icon-add" url="systemController.do?aouTypeGroup" funname="add"></t:dgToolBar>
    +            <%--<t:dgToolBar title="common.add.param" langArg="lang.dictionary.value" icon="icon-add" funname="typeGridTree_AddType"></t:dgToolBar>--%>
    +            <t:dgToolBar title="common.edit" icon="icon-edit" url="systemController.do?aouTypeGroup" funname="update"></t:dgToolBar>
    +        </t:datagrid>
    +    </div>
    +</div>
    +
    +<div data-options="region:'east',
    +	title:'mytitle',
    +	collapsed:true,
    +	split:true,
    +	border:false,
    +	onExpand : function(){
    +		li_east = 1;
    +	},
    +	onCollapse : function() {
    +	    li_east = 0;
    +	}"
    +     style="width: 400px; overflow: hidden;" id="eastPanel">
    +    <div class="easyui-panel" style="padding: 1px;" fit="true" border="false" id="userListpanel"></div>
    +</div>
    +
    +<script type="text/javascript">
    +    $(function() {
    +        var li_east = 0;
    +    });
    +
    +    function queryTypeValue(typegroupid, typegroupname){
    +        var title = '<t:mutiLang langKey="lang.dictionary.type"/>: ' + typegroupname;
    +        if(li_east == 0){
    +            $('#main_typegroup_list').layout('expand','east');
    +        }
    +        $('#main_typegroup_list').layout('panel','east').panel('setTitle', title);
    +        $('#userListpanel').panel("refresh", "systemController.do?goTypeGrid&typegroupid=" + typegroupid);
    +    }
    +    function loadSuccess() {
    +        $('#main_typegroup_list').layout('panel','east').panel('setTitle', "");
    +        $('#main_typegroup_list').layout('collapse','east');
    +        $('#userListpanel').empty();
    +    }
    +</script>
    +<%--// add-end--Author:zhangguoming  Date:20140928 for锛氭暟鎹瓧鍏镐慨鏀--%>
    diff --git a/src/main/webapp/webpage/system/type/typeGroupTabs.jsp b/src/main/webapp/webpage/system/type/typeGroupTabs.jsp
    new file mode 100644
    index 00000000..873a00b9
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/type/typeGroupTabs.jsp
    @@ -0,0 +1,7 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:tabs id="typeGroupTabs" iframe="false" tabPosition="bottom">
    +	<c:forEach items="${typegroupList}" var="typegroup">
    +		<t:tab iframe="systemController.do?typeList&typegroupid=${typegroup.id}" icon="icon-add" title="${typegroup.typegroupname}" id="${typegroup.typegroupcode}"></t:tab>
    +	</c:forEach>
    +</t:tabs>
    diff --git a/src/main/webapp/webpage/system/type/typeList.jsp b/src/main/webapp/webpage/system/type/typeList.jsp
    new file mode 100644
    index 00000000..0c73bd1f
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/type/typeList.jsp
    @@ -0,0 +1,16 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;"><t:datagrid name="${typegroup.typegroupcode}List" title="绫诲瀷鍒楄〃" actionUrl="systemController.do?typeGrid&typegroupid=${typegroup.id}" idField="id"
    +	queryMode="group">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="绫诲瀷鍚嶇О" field="typename"></t:dgCol>
    +	<t:dgCol title="绫诲瀷缂栫爜" field="typecode"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt"></t:dgCol>
    +	<t:dgDelOpt url="systemController.do?delType&id={id}" title="鍒犻櫎"></t:dgDelOpt>
    +	<t:dgToolBar title="${typegroup.typegroupname}褰曞叆" icon="icon-add" url="systemController.do?addorupdateType&typegroupid=${typegroup.id}" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="绫诲埆缂栬緫" icon="icon-edit" url="systemController.do?addorupdateType&typegroupid=${typegroup.id}" funname="update"></t:dgToolBar>
    +</t:datagrid></div>
    +</div>
    +
    diff --git a/src/main/webapp/webpage/system/type/typeListForTypegroup.jsp b/src/main/webapp/webpage/system/type/typeListForTypegroup.jsp
    new file mode 100644
    index 00000000..8527b35e
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/type/typeListForTypegroup.jsp
    @@ -0,0 +1,25 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    +<%@include file="/context/mytags.jsp" %>
    +
    +<div class="easyui-layout" fit="true">
    +    <div region="center" style="padding: 1px;">
    +        <t:datagrid name="typeValueList" title="common.type.list"
    +                    actionUrl="systemController.do?typeGrid&typegroupid=${typegroupid}" idField="id"
    +                    queryMode="group">
    +            <t:dgCol title="common.code" field="id" hidden="true"></t:dgCol>
    +            <t:dgCol title="common.type.name" field="typename"></t:dgCol>
    +            <t:dgCol title="common.type.code" field="typecode"></t:dgCol>
    +            <t:dgCol title="common.operation" field="opt"></t:dgCol>
    +            <t:dgDelOpt url="systemController.do?delType&id={id}" title="common.delete"></t:dgDelOpt>
    +            <t:dgToolBar title="common.add.param" langArg="common.type" icon="icon-add" url="systemController.do?addorupdateType&typegroupid=${typegroupid}" funname="add"></t:dgToolBar>
    +            <t:dgToolBar title="common.edit.param" langArg="common.type" icon="icon-edit" url="systemController.do?addorupdateType&typegroupid=${typegroupid}" funname="update"></t:dgToolBar>
    +        </t:datagrid>
    +    </div>
    +</div>
    +<script>
    +    function addType(title,addurl,gname,width,height) {
    +        alert($("#id").val());
    +        add(title,addurl,gname,width,height);
    +    }
    +</script>
    +
    diff --git a/src/main/webapp/webpage/system/type/typegroup.jsp b/src/main/webapp/webpage/system/type/typegroup.jsp
    new file mode 100644
    index 00000000..6552a219
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/type/typegroup.jsp
    @@ -0,0 +1,22 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title><t:mutiLang langKey="common.add.param"/></title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true" action="systemController.do?saveTypeGroup">
    +	<input name="id" type="hidden" value="${typegroup.id }">
    +	<fieldset class="step">
    +	<div class="form">
    +	<label class="Validform_label"> <t:mutiLang langKey="common.code"/>: </label> 
    +	<input name="typegroupcode" class="inputxt" validType="t_s_typegroup,typegroupcode,id" value="${typegroup.typegroupcode }" datatype="s2-10"> <span class="Validform_checktip"><t:mutiLang langKey="common.code.range" langArg="common.code,common.range2to8"/></span></div>
    +	<div class="form">
    +	<label class="Validform_label"> <t:mutiLang langKey="common.name"/>: </label> 
    +	<input name="typegroupname" class="inputxt" value="${typegroup.typegroupname }" datatype="s2-10"> <span class="Validform_checktip"><t:mutiLang langKey="common.name.range" langArg="common.name,common.range2to10"/></span></div>
    +	</fieldset>
    +</t:formvalid>
    +</body>
    +</html>
    diff --git a/src/main/webapp/webpage/system/user/adminchangepwd.jsp b/src/main/webapp/webpage/system/user/adminchangepwd.jsp
    new file mode 100644
    index 00000000..dc2742e5
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/user/adminchangepwd.jsp
    @@ -0,0 +1,29 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鐢ㄦ埛淇℃伅</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" refresh="false" dialog="true" action="userController.do?savenewpwdforuser" usePlugin="password" layout="table">
    +	<input id="id" type="hidden" name="id" value="${user.id }">
    +	<table style="width: 550px" cellpadding="0" cellspacing="1" class="formtable">
    +		<tbody>
    +			
    +			<tr>
    +				<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.password"/>: </label></td>
    +				<td class="value"><input type="password" class="inputxt" value="" name="password" plugin="passwordStrength" datatype="*6-18" errormsg="" /> <span class="passwordStrength"
    +					style="display: none;"><span><t:mutiLang langKey="common.weak"/></span><span><t:mutiLang langKey="common.middle"/></span><span class="last"><t:mutiLang langKey="common.strong"/></span> </span> <span class="Validform_checktip"><t:mutiLang langKey="password.rang6to18"/></span></td>
    +			</tr>
    +			<tr>
    +				<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.repeat.password"/>: </label></td>
    +				<td class="value"><input id="repassword" class="inputxt" type="password"  recheck="password" datatype="*6-18" errormsg="涓ゆ杈撳叆鐨勫瘑鐮佷笉涓鑷达紒"> <span
    +					class="Validform_checktip"><t:mutiLang langKey="common.repeat.password"/></span></td>
    +			</tr>
    +	
    +		</tbody>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/user/changepassword.jsp b/src/main/webapp/webpage/system/user/changepassword.jsp
    new file mode 100644
    index 00000000..b1bc7a29
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/user/changepassword.jsp
    @@ -0,0 +1,30 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鐢ㄦ埛淇℃伅</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" refresh="false" dialog="true" action="userController.do?savenewpwd" usePlugin="password" layout="table">
    +	<input id="id" type="hidden" value="${user.id }">
    +	<table style="width: 550px" cellpadding="0" cellspacing="1" class="formtable">
    +		<tbody>
    +			<tr>
    +				<td align="right" width="10%"><span class="filedzt">鍘熷瘑鐮:</span></td>
    +				<td class="value"><input type="password" value="" name="password" class="inputxt" datatype="*" errormsg="璇疯緭鍏ュ師瀵嗙爜" /> <span class="Validform_checktip"> 璇疯緭鍏ュ師瀵嗙爜 </span></td>
    +			</tr>
    +			<tr>
    +				<td align="right"><span class="filedzt">鏂板瘑鐮:</span></td>
    +				<td class="value"><input type="password" value="" name="newpassword" class="inputxt" plugin="passwordStrength" datatype="*6-18" errormsg="瀵嗙爜鑷冲皯6涓瓧绗,鏈澶18涓瓧绗︼紒" /> <span
    +					class="Validform_checktip"> 瀵嗙爜鑷冲皯6涓瓧绗,鏈澶18涓瓧绗︼紒 </span> <span class="passwordStrength" style="display: none;"> <b>瀵嗙爜寮哄害锛</b> <span>寮</span><span>涓</span><span class="last">寮</span> </span></td>
    +			</tr>
    +			<tr>
    +				<td align="right"><span class="filedzt">閲嶅瀵嗙爜:</span></td>
    +				<td class="value"><input id="newpassword" type="password" recheck="newpassword" class="inputxt" datatype="*6-18" errormsg="涓ゆ杈撳叆鐨勫瘑鐮佷笉涓鑷达紒"> <span class="Validform_checktip"></span></td>
    +			</tr>
    +		</tbody>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/user/changestyle.jsp b/src/main/webapp/webpage/system/user/changestyle.jsp
    new file mode 100644
    index 00000000..492562e3
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/user/changestyle.jsp
    @@ -0,0 +1,55 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>淇敼棣栭〉鏍峰紡</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" refresh="false" dialog="true" action="userController.do?savestyle" layout="table">
    +	<table style="width: 550px" cellpadding="0" cellspacing="1" class="formtable">
    +		<tbody><th>棣栭〉椋庢牸</th>
    +			<tr>
    +				<td class="value"><input type="radio" value="default" name="indexStyle" /> <span>缁忓吀椋庢牸</span></td>
    +			</tr>
    +			<!--
    +			<tr>
    +				<td class="value"><input type="radio" value="bootstrap" name="indexStyle" /> <span>BootStrap椋庢牸</span></td>
    +			</tr>
    +			-->
    +			<!-- update-start--Author:gaofeng  Date:2014-01-10 for:鏂板棣栭〉椋庢牸  -->
    +			<tr>
    +				<td class="value"><input type="radio" value="shortcut" name="indexStyle" /> <span>ShortCut椋庢牸</span></td>
    +			</tr>
    +			<!-- update-start--Author:gaofeng  Date:2014-01-24 for:鏂板棣栭〉椋庢牸  -->
    +			<tr>
    +				<td class="value"><input type="radio" value="sliding" name="indexStyle"  /><span>Sliding浜戞闈</span></td>
    +			</tr>
    +			<tr>
    +				<td class="value"><input type="radio" value="ace" name="indexStyle"  /><span>ACE骞抽潰椋庢牸</span></td>
    +			</tr>
    +			<!-- update-end--Author:gaofeng  Date:2014-01-24 for:鏂板棣栭〉椋庢牸  -->	
    +		</tbody>
    +	</table>
    +</t:formvalid>
    +</body>
    +<script type="text/javascript">
    +		$(function(){
    +			var val = "${indexStyle}";
    +			$("input[name='indexStyle']").each(function(){
    +				if($(this).val()==val){
    +					$(this).attr("checked",true);
    +					return false;
    +				}
    +			});
    +		/* 	var val2 = "${cssTheme}";
    +			$("input[name='cssTheme']").each(function(){
    +				if($(this).val()==val2){
    +					$(this).attr("checked",true);
    +					return false;
    +				}
    +			}); */
    +		});
    +	</script>
    +</html>
    diff --git a/src/main/webapp/webpage/system/user/user.jsp b/src/main/webapp/webpage/system/user/user.jsp
    new file mode 100644
    index 00000000..ac61a284
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/user/user.jsp
    @@ -0,0 +1,126 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鐢ㄦ埛淇℃伅</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +    <%--update-start--Author:zhangguoming  Date:20140825 for锛氭坊鍔犵粍缁囨満鏋刢ombobox澶氶夌殑澶勭悊鏂规硶--%>
    +    <script>
    +        function setOrgIds() {
    +//            var orgIds = $("#orgSelect").combobox("getValues");
    +            var orgIds = $("#orgSelect").combotree("getValues");
    +            $("#orgIds").val(orgIds);
    +        }
    +        $(function() {
    +            $("#orgSelect").combotree({
    +                onChange: function(n, o) {
    +                    if($("#orgSelect").combotree("getValues") != "") {
    +                        $("#orgSelect option").eq(1).attr("selected", true);
    +                    } else {
    +                        $("#orgSelect option").eq(1).attr("selected", false);
    +                    }
    +                }
    +            });
    +            <%--$("#orgSelect").combobox("setValues", ${orgIdList});--%>
    +            $("#orgSelect").combotree("setValues", ${orgIdList});
    +        });
    +    </script>
    +    <%--update-end--Author:zhangguoming  Date:20140825 for锛氭坊鍔犵粍缁囨満鏋刢ombobox澶氶夌殑澶勭悊鏂规硶--%>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<%--update-start--Author:zhangguoming  Date:20140825 for锛氭牸寮忓寲椤甸潰浠g爜 骞 娣诲姞缁勭粐鏈烘瀯combobox澶氶夋--%>
    +<t:formvalid formid="formobj" dialog="true" usePlugin="password" layout="table" action="userController.do?saveUser" beforeSubmit="setOrgIds">
    +	<input id="id" name="id" type="hidden" value="${user.id }">
    +	<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right" width="15%" nowrap>
    +                <label class="Validform_label">  <t:mutiLang langKey="common.username"/>: </label>
    +            </td>
    +			<td class="value" width="85%">
    +                <c:if test="${user.id!=null }"> ${user.userName } </c:if>
    +                <c:if test="${user.id==null }">
    +                    <input id="userName" class="inputxt" name="userName" validType="t_s_base_user,userName,id" value="${user.userName }" datatype="s2-10" />
    +                    <span class="Validform_checktip"> <t:mutiLang langKey="username.rang2to10"/></span>
    +                </c:if>
    +            </td>
    +		</tr>
    +		<tr>
    +			<td align="right" width="10%" nowrap><label class="Validform_label"> <t:mutiLang langKey="common.real.name"/>: </label></td>
    +			<td class="value" width="10%">
    +                <input id="realName" class="inputxt" name="realName" value="${user.realName }" datatype="s2-10">
    +                <span class="Validform_checktip"><t:mutiLang langKey="fill.realname"/></span>
    +            </td>
    +		</tr>
    +		<c:if test="${user.id==null }">
    +			<tr>
    +				<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.password"/>: </label></td>
    +				<td class="value">
    +                    <input type="password" class="inputxt" value="" name="password" plugin="passwordStrength" datatype="*6-18" errormsg="" />
    +                    <span class="passwordStrength" style="display: none;">
    +                        <span><t:mutiLang langKey="common.weak"/></span>
    +                        <span><t:mutiLang langKey="common.middle"/></span>
    +                        <span class="last"><t:mutiLang langKey="common.strong"/></span>
    +                    </span>
    +                    <span class="Validform_checktip"> <t:mutiLang langKey="password.rang6to18"/></span>
    +                </td>
    +			</tr>
    +			<tr>
    +				<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.repeat.password"/>: </label></td>
    +				<td class="value">
    +                    <input id="repassword" class="inputxt" type="password" value="${user.password}" recheck="password" datatype="*6-18" errormsg="涓ゆ杈撳叆鐨勫瘑鐮佷笉涓鑷达紒">
    +                    <span class="Validform_checktip"><t:mutiLang langKey="common.repeat.password"/></span>
    +                </td>
    +			</tr>
    +		</c:if>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.department"/>: </label></td>
    +			<td class="value">
    +                <%--update-start--Author:zhangguoming  Date:20140826 for锛氬皢combobox淇敼涓篶ombotree--%>
    +                <%--<select class="easyui-combobox" data-options="multiple:true, editable: false" id="orgSelect" datatype="*">--%>
    +                <select class="easyui-combotree" data-options="url:'departController.do?getOrgTree', multiple:true, cascadeCheck:false"
    +                        id="orgSelect" name="orgSelect" datatype="select1">
    +                <%--update-end--Author:zhangguoming  Date:20140826 for锛氬皢combobox淇敼涓篶ombotree--%>
    +                    <c:forEach items="${departList}" var="depart">
    +                        <option value="${depart.id }">${depart.departname}</option>
    +                    </c:forEach>
    +                </select>
    +                <input id="orgIds" name="orgIds" type="hidden">
    +                <span class="Validform_checktip"><t:mutiLang langKey="please.select.department"/></span>
    +            </td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.role"/>: </label></td>
    +			<td class="value" nowrap>
    +                <input name="roleid" name="roleid" type="hidden" value="${id}" id="roleid">
    +                <input name="roleName" class="inputxt" value="${roleName }" id="roleName" readonly="readonly" datatype="*" />
    +                <t:choose hiddenName="roleid" hiddenid="id" url="userController.do?roles" name="roleList"
    +                          icon="icon-search" title="common.role.list" textname="roleName" isclear="true" isInit="true"></t:choose>
    +                <span class="Validform_checktip"><t:mutiLang langKey="role.muti.select"/></span>
    +            </td>
    +		</tr>
    +		<tr>
    +			<td align="right" nowrap><label class="Validform_label">  <t:mutiLang langKey="common.phone"/>: </label></td>
    +			<td class="value">
    +                <input class="inputxt" name="mobilePhone" value="${user.mobilePhone}" datatype="m" errormsg="鎵嬫満鍙风爜涓嶆纭" ignore="ignore">
    +                <span class="Validform_checktip"></span>
    +            </td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.tel"/>: </label></td>
    +			<td class="value">
    +                <input class="inputxt" name="officePhone" value="${user.officePhone}" datatype="n" errormsg="鍔炲叕瀹ょ數璇濅笉姝g‘" ignore="ignore">
    +                <span class="Validform_checktip"></span>
    +            </td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.common.mail"/>: </label></td>
    +			<td class="value">
    +                <input class="inputxt" name="email" value="${user.email}" datatype="e" errormsg="閭鏍煎紡涓嶆纭!" ignore="ignore">
    +                <span class="Validform_checktip"></span>
    +            </td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +<%--update-end--Author:zhangguoming  Date:20140825 for锛氭牸寮忓寲椤甸潰浠g爜 骞 娣诲姞缁勭粐鏈烘瀯combobox澶氶夋--%>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/user/userList.jsp b/src/main/webapp/webpage/system/user/userList.jsp
    new file mode 100644
    index 00000000..1e34c40a
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/user/userList.jsp
    @@ -0,0 +1,159 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +
    +<%--update-start--Author:zhangguoming  Date:20140827 for锛氭坊鍔 缁勭粐鏈烘瀯鏌ヨ鏉′欢--%>
    +<script>
    +    $(function() {
    +        var datagrid = $("#userListtb");
    +        datagrid.find("div[name='searchColums']").append($("#tempSearchColums div[name='searchColums']").html());
    +    });
    +</script>
    +<div id="tempSearchColums" style="display: none">
    +    <div name="searchColums">
    +        <span style="display:-moz-inline-box;display:inline-block;">
    +            <span style="vertical-align:middle;display:-moz-inline-box;display:inline-block;width: 80px;text-align:right;" title="<t:mutiLang langKey="common.department"/>">
    +                <t:mutiLang langKey="common.department"/>锛
    +            </span>
    +            <input id="orgIds" name="orgIds" type="hidden">
    +            <input readonly="true" type="text" name="departname" style="width: 100px" onclick="choose_297e201048183a730148183ad85c0001()"/>
    +            <%--<t:choose hiddenName="orgIds" hiddenid="id"--%>
    +                      <%--url="departController.do?departSelect" name="departList"--%>
    +                      <%--icon="icon-search" title="common.department.list"--%>
    +                      <%--textname="departname" isclear="true"></t:choose>--%>
    +        </span>
    +    </div>
    +</div>
    +<%--update-end--Author:zhangguoming  Date:20140827 for锛氭坊鍔 缁勭粐鏈烘瀯鏌ヨ鏉′欢--%>
    +
    +<t:datagrid name="userList" title="common.operation" actionUrl="userController.do?datagrid" 
    +    fit="true" fitColumns="true" idField="id" queryMode="group" sortName="createDate" sortOrder="desc">
    +	<t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.username" sortable="false" field="userName" query="true"></t:dgCol>
    +    <%--update-start--Author:zhangguoming  Date:20140827 for锛氶氳繃鐢ㄦ埛瀵硅薄鐨勫叧鑱斿睘鎬у艰幏鍙栫粍缁囨満鏋勫悕绉帮紙澶氬澶氬叧鑱旓級--%>
    +	<%--<t:dgCol title="common.department" field="TSDepart_id" query="true" replace="${departsReplace}"></t:dgCol>--%>
    +	<t:dgCol title="common.department" sortable="false" field="userOrgList.tsDepart.departname" query="false"></t:dgCol>
    +    <%--update-end--Author:zhangguoming  Date:20140827 for锛氶氳繃鐢ㄦ埛瀵硅薄鐨勫叧鑱斿睘鎬у艰幏鍙栫粍缁囨満鏋勫悕绉帮紙澶氬澶氬叧鑱旓級--%>
    +	<t:dgCol title="common.real.name" field="realName" query="true"></t:dgCol>
    +	<t:dgCol title="common.role" field="userKey" ></t:dgCol>
    +	<t:dgCol title="common.createby" field="createBy" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.createtime" field="createDate" formatter="yyyy-MM-dd" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.updateby" field="updateBy" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.updatetime" field="updateDate" formatter="yyyy-MM-dd" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.status" sortable="true" field="status" replace="common.active_1,common.inactive_0,super.admin_-1" ></t:dgCol>
    +	<t:dgCol title="common.operation" field="opt" width="100"></t:dgCol>
    +	<t:dgDelOpt title="common.delete" url="userController.do?del&id={id}&userName={userName}" />
    +	<t:dgToolBar title="common.add.param" langArg="common.user" icon="icon-add" url="userController.do?addorupdate" funname="add"></t:dgToolBar>
    +	<t:dgToolBar title="common.edit.param" langArg="common.user" icon="icon-edit" url="userController.do?addorupdate" funname="update"></t:dgToolBar>
    +	<t:dgToolBar title="common.password.reset" icon="icon-edit" url="userController.do?changepasswordforuser" funname="update"></t:dgToolBar>
    +	<t:dgToolBar title="common.lock.user" icon="icon-edit" url="userController.do?lock&lockvalue=0" funname="lockObj"></t:dgToolBar>
    +	<t:dgToolBar title="common.unlock.user" icon="icon-edit" url="userController.do?lock&lockvalue=1" funname="unlockObj"></t:dgToolBar>
    +	
    +</t:datagrid>
    +<script type="text/javascript">
    +
    +function lockObj(title,url, id) {
    +
    +	gridname=id;
    +	var rowsData = $('#'+id).datagrid('getSelections');
    +	if (!rowsData || rowsData.length==0) {
    +		tip('<t:mutiLang langKey="common.please.select.edit.item"/>');
    +		return;
    +	}
    +		url += '&id='+rowsData[0].id;
    +
    +	$.dialog.confirm('<t:mutiLang langKey="common.lock.user.tips"/>', function(){
    +		lockuploadify(url, '&id');
    +	}, function(){
    +	});
    +}
    +function unlockObj(title,url, id) {
    +
    +	gridname=id;
    +	var rowsData = $('#'+id).datagrid('getSelections');
    +	if (!rowsData || rowsData.length==0) {
    +		tip('<t:mutiLang langKey="common.please.select.edit.item"/>');
    +		return;
    +	}
    +		url += '&id='+rowsData[0].id;
    +
    +	$.dialog.confirm('<t:mutiLang langKey="common.unlock.user.tips"/>', function(){
    +		lockuploadify(url, '&id');
    +	}, function(){
    +	});
    +}
    +
    +
    +function lockuploadify(url, id) {
    +	$.ajax({
    +		async : false,
    +		cache : false,
    +		type : 'POST',
    +		url : url,// 璇锋眰鐨刟ction璺緞
    +		error : function() {// 璇锋眰澶辫触澶勭悊鍑芥暟
    +		
    +		
    +		},
    +		success : function(data) {
    +			var d = $.parseJSON(data);
    +			if (d.success) {
    +			var msg = d.msg;
    +				tip(msg);
    +				reloadTable();
    +			}
    +			
    +		}
    +	});
    +}
    +</script>
    +
    +<%--update-start--Author:zhangguoming  Date:20140827 for锛氭坊鍔 缁勭粐鏈烘瀯鏌ヨ鏉′欢锛氬脊鍑 閫夋嫨缁勭粐鏈烘瀯鍒楄〃 鐩稿叧鎿嶄綔--%>
    +<%--<a href="#" class="easyui-linkbutton" plain="true" icon="icon-search" onClick="choose_297e201048183a730148183ad85c0001()">閫夋嫨</a>--%>
    +<%--<a href="#" class="easyui-linkbutton" plain="true" icon="icon-redo" onClick="clearAll_297e201048183a730148183ad85c0001();">娓呯┖</a>--%>
    +<script type="text/javascript">
    +//    var windowapi = frameElement.api, W = windowapi.opener;
    +    function choose_297e201048183a730148183ad85c0001() {
    +        if (typeof(windowapi) == 'undefined') {
    +            $.dialog({content: 'url:departController.do?departSelect', zIndex: 2100, title: '<t:mutiLang langKey="common.department.list"/>', lock: true, width: 400, height: 350, left: '85%', top: '65%', opacity: 0.4, button: [
    +                {name: '<t:mutiLang langKey="common.confirm"/>', callback: clickcallback_297e201048183a730148183ad85c0001, focus: true},
    +                {name: '<t:mutiLang langKey="common.cancel"/>', callback: function () {
    +                }}
    +            ]});
    +        } else {
    +            $.dialog({content: 'url:departController.do?departSelect', zIndex: 2100, title: '<t:mutiLang langKey="common.department.list"/>', lock: true, parent: windowapi, width: 400, height: 350, left: '85%', top: '65%', opacity: 0.4, button: [
    +                {name: '<t:mutiLang langKey="common.confirm"/>', callback: clickcallback_297e201048183a730148183ad85c0001, focus: true},
    +                {name: '<t:mutiLang langKey="common.cancel"/>', callback: function () {
    +                }}
    +            ]});
    +        }
    +    }
    +    function clearAll_297e201048183a730148183ad85c0001() {
    +        if ($('#departname').length >= 1) {
    +            $('#departname').val('');
    +            $('#departname').blur();
    +        }
    +        if ($("input[name='departname']").length >= 1) {
    +            $("input[name='departname']").val('');
    +            $("input[name='departname']").blur();
    +        }
    +        $('#orgIds').val("");
    +    }
    +    function clickcallback_297e201048183a730148183ad85c0001() {
    +        iframe = this.iframe.contentWindow;
    +        var departname = iframe.getdepartListSelections('departname');
    +        if ($('#departname').length >= 1) {
    +            $('#departname').val(departname);
    +            $('#departname').blur();
    +        }
    +        if ($("input[name='departname']").length >= 1) {
    +            $("input[name='departname']").val(departname);
    +            $("input[name='departname']").blur();
    +        }
    +        var id = iframe.getdepartListSelections('id');
    +        if (id !== undefined && id != "") {
    +            $('#orgIds').val(id);
    +            $("input[name='orgIds']").val(id);
    +        }
    +    }
    +</script>
    +<%--update-end--Author:zhangguoming  Date:20140827 for锛氭坊鍔 缁勭粐鏈烘瀯鏌ヨ鏉′欢锛氬脊鍑 閫夋嫨缁勭粐鏈烘瀯鍒楄〃 鐩稿叧鎿嶄綔--%>
    diff --git a/src/main/webapp/webpage/system/user/userList2.jsp b/src/main/webapp/webpage/system/user/userList2.jsp
    new file mode 100644
    index 00000000..b66612e7
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/user/userList2.jsp
    @@ -0,0 +1,36 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<t:base type="jquery,easyui,tools,DatePicker"></t:base>
    +<div class="easyui-layout" fit="true">
    +<div region="center" style="padding: 1px;">
    +<t:datagrid name="userList2" title="鐢ㄦ埛绠$悊" actionUrl="userController.do?datagrid" idField="id" fit="true">
    +	<t:dgCol title="缂栧彿" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="鐢ㄦ埛鍚" sortable="false" field="userName" width="20"></t:dgCol>
    +	<t:dgCol title="閮ㄩ棬" field="TSDepart_departname"></t:dgCol>
    +	<t:dgCol title="鐪熷疄濮撳悕" field="realName" sortable="false"></t:dgCol>
    +	<t:dgCol title="鐘舵" sortable="true" field="status" replace="姝e父_1,绂佺敤_0,瓒呯骇绠$悊鍛榑-1"></t:dgCol>
    +	<t:dgCol title="鎿嶄綔" field="opt" width="100"></t:dgCol>
    +	<t:dgFunOpt funname="szqm(id)" title="璁剧疆绛惧悕" />
    +	<t:dgDelOpt title="鍒犻櫎" url="userController.do?del&id={id}&userName={userName}" />
    +</t:datagrid>
    +
    +<div id="userListtb" style="padding: 3px; height: 25px">
    +	<div style="float: left;">
    +	   <a href="#" id="add" class="easyui-linkbutton" plain="true" icon="icon-add" onclick="add('鐢ㄦ埛褰曞叆','userController.do?addorupdate','userList2')">鐢ㄦ埛褰曞叆</a> 
    +	   <a href="#" class="update" plain="true" icon="icon-edit" onclick="update('鐢ㄦ埛缂栬緫','userController.do?addorupdate','userList2')">鐢ㄦ埛缂栬緫</a>
    +	</div>
    +	<div align="right">
    +		鐢ㄦ埛鍚: <input class="easyui-validatebox" name="userName" style="width: 80px"> 
    +		鐪熷疄濮撳悕: <input class="easyui-validatebox" name="realName" style="width: 80px"> 
    +		<a href="#" class="easyui-linkbutton" iconCls="icon-search" onclick="userListsearch();">鏌ヨ</a>
    +	</div>
    +</div>
    +
    +</div>
    +</div>
    +
    +<script type="text/javascript">
    +	function szqm(id) {
    +		createwindow('璁剧疆绛惧悕', 'userController.do?addsign&id=' + id);
    +	}
    +</script>
    diff --git a/src/main/webapp/webpage/system/user/userOrgSelect.jsp b/src/main/webapp/webpage/system/user/userOrgSelect.jsp
    new file mode 100644
    index 00000000..8ac6601b
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/user/userOrgSelect.jsp
    @@ -0,0 +1,35 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鐢ㄦ埛鐨勮鑹查夋嫨椤甸潰</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" layout="table" action="loginController.do?login">
    +	<input id="id" name="id" type="hidden" value="${user.id }">
    +	<table style="width: 600px;" cellpadding="0" cellspacing="1" class="formtable">
    +		<tr>
    +			<td align="right" width="15%" nowrap><label class="Validform_label">  <t:mutiLang langKey="common.username"/>: </label></td>
    +			<td class="value" width="85%">
    +                <c:if test="${user.id!=null }"> ${user.userName } </c:if>
    +                <c:if test="${user.id==null }">
    +                    <input id="userName" class="inputxt" name="userName" validType="t_s_base_user,userName,id" value="${user.userName }" datatype="s2-10" />
    +                    <span class="Validform_checktip"> <t:mutiLang langKey="username.rang2to10"/></span>
    +                </c:if>
    +            </td>
    +		</tr>
    +		<tr>
    +			<td align="right"><label class="Validform_label"> <t:mutiLang langKey="common.department"/>: </label></td>
    +			<td class="value">
    +                <select id="orgId" name="orgId" datatype="*">
    +                    <c:forEach items="${orgList}" var="org">
    +                        <option value="${org.id }">${org.departname}</option>
    +                    </c:forEach>
    +                </select>
    +            <span class="Validform_checktip"><t:mutiLang langKey="please.select.department"/></span></td>
    +		</tr>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/user/userinfo.jsp b/src/main/webapp/webpage/system/user/userinfo.jsp
    new file mode 100644
    index 00000000..f3a3a9fd
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/user/userinfo.jsp
    @@ -0,0 +1,23 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<t:base type="jquery,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" layout="div" dialog="true">
    +	<fieldset class="step"><legend> <t:mutiLang langKey="common.userinfo"/> </legend>
    +	
    +	<div class="form"><label class="form"> <t:mutiLang langKey="common.username"/>: </label> ${user.userName }</div>
    +	<div class="form"><label class="form"> <t:mutiLang langKey="common.surname"/>: </label> ${user.realName}</div>
    +	
    +	<div class="form"><label class="form"> <t:mutiLang langKey="common.phone"/>: </label> ${user.mobilePhone}</div>
    +	<div class="form"><label class="form"> <t:mutiLang langKey="common.office.tel"/>: </label> ${user.officePhone}</div>
    +	<div class="form"><label class="form"> <t:mutiLang langKey="common.mail"/>: </label> ${user.email}</div>
    +	</fieldset>
    +	</form>
    +</t:formvalid>
    +</body>
    +</html>
    +
    diff --git a/src/main/webapp/webpage/system/user/users.jsp b/src/main/webapp/webpage/system/user/users.jsp
    new file mode 100644
    index 00000000..f083a0bb
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/user/users.jsp
    @@ -0,0 +1,26 @@
    +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html >
    +<html>
    +<head>
    +<title>瑙掕壊闆嗗悎</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:datagrid  pagination="false"  name="roleList" title="common.role.select"  actionUrl="userController.do?datagridRole" idField="id" checkbox="true" showRefresh="false"  fit="true"  queryMode="group" onLoadSuccess="initCheck">
    +	<t:dgCol title="common.id" field="id" hidden="true"></t:dgCol>
    +	<t:dgCol title="common.role.name" field="roleName" width="50" query="true" ></t:dgCol>
    +</t:datagrid>
    +</body>
    +</html>
    +<script type="text/javascript">
    +function initCheck(data){
    +	var ids = "${ids}";
    +	var idArr = ids.split(",");
    +	for(var i=0;i<idArr.length;i++){
    +		if(idArr[i]!=""){
    +			$("#roleList").datagrid("selectRecord",idArr[i]);
    +		}
    +	}
    +}
    +</script>
    \ No newline at end of file
    diff --git a/src/main/webapp/webpage/system/user/usersign.jsp b/src/main/webapp/webpage/system/user/usersign.jsp
    new file mode 100644
    index 00000000..968b4046
    --- /dev/null
    +++ b/src/main/webapp/webpage/system/user/usersign.jsp
    @@ -0,0 +1,24 @@
    +<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    +<%@include file="/context/mytags.jsp"%>
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<title>鐢ㄦ埛淇℃伅</title>
    +<t:base type="jquery,easyui,tools"></t:base>
    +</head>
    +<body style="overflow-y: hidden" scroll="no">
    +<t:formvalid formid="formobj" dialog="true" layout="table" beforeSubmit="upload">
    +	<input id="id" type="hidden" value="${id }">
    +	<table style="width: 500px" cellpadding="0" cellspacing="1" class="formtable">
    +		<tbody>
    +			<tr>
    +				<td class="value" id="test" colspan="2"></td>
    +			</tr>
    +			<tr>
    +				<td align="right"><span class="filedzt">绛惧悕鏂囦欢:</span></td>
    +				<td class="value"><t:upload name="jfcl" buttonText="閫夋嫨绛惧悕" queueID="test" multi="false" uploader="userController.do?savesign" extend="pic" id="file_upload" formData="formobj"></t:upload></td>
    +			</tr>
    +		</tbody>
    +	</table>
    +</t:formvalid>
    +</body>
    \ No newline at end of file